From cbd4f13bf8c54cce78995f75637f3d93523dd26c Mon Sep 17 00:00:00 2001 From: Jan Weigmann Date: Mon, 21 Oct 2024 09:50:46 +0200 Subject: [PATCH] 6.1.4 --- README.md | 3 ++- bundle/modules/dsa5.js | 26 +++++++++++++------------- modules/actor/actor-dsa5.js | 33 ++++++++++++++++++++++----------- modules/system/opposed-dsa5.js | 8 ++++++-- system.json | 4 ++-- 5 files changed, 45 insertions(+), 29 deletions(-) diff --git a/README.md b/README.md index 3ef82505..35eaa0d7 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,9 @@ +![Version](https://img.shields.io/github/v/tag/Plushtoast/dsa5-foundryVTT?label=Version&style=flat-square&color=2577a1) ![Foundry Core Compatible Version](https://img.shields.io/badge/dynamic/json.svg?url=https%3A%2F%2Fraw.githubusercontent.com%2FPlushtoast%2Fdsa5-foundryVTT%2Ffoundry12%2Fsystem.json&label=Foundry%20Core%20Compatible%20Version&query=$.compatibility.verified&style=flat-square&color=ff6400) + # Official Das Schwarze Auge/The Dark Eye system for Foundry ![](https://repository-images.githubusercontent.com/311655339/4d523800-55a9-11eb-9e2e-6bbc2b71d8a4) ## Current Version and Compatibility: -6.0.x - FoundryVTT 12.+ This system is intended for usage with [Foundry Virtual Tabletop](https://foundryvtt.com/) to play "Das Schwarze Auge" 5th edition. If you want to learn more checkout the [German](https://ulisses-spiele.de/virtual-tabletop-dsa-vtt/) or [English](https://ulisses-us.com/ulisses-virtual-tabletops/virtual-tabletop-dsa-vtt/) VTT Page by Ulisses Spiele. diff --git a/bundle/modules/dsa5.js b/bundle/modules/dsa5.js index fc6ef19d..98848b6c 100644 --- a/bundle/modules/dsa5.js +++ b/bundle/modules/dsa5.js @@ -24,13 +24,13 @@ var tr=Object.defineProperty;var u=(o,e)=>tr(o,"name",{value:e,configurable:!0}) - `;e.find(".dpsSelector").remove(),e.find('.tab[data-tab="grid"]').append(s)});var{mergeObject:tc}=foundry.utils,ia=class o extends Dialog{static{u(this,"AddTargetDialog")}static async getDialog(e){let t=Array.from(game.user.targets).map(i=>i.id),a=[],s=canvas.scene?canvas.scene.tokens.get(e.token)?.object:void 0;return game.combat&&game.combat.combatants.forEach(i=>{if(i.visible){if(i.isSelected=t.includes(i.token.id),s&&i.token){let n=canvas.scene.tokens.get(i.token.id).object;i.distance=ne.rangeFinder(s,n),i.distance.distanceSum=Number(i.distance.distanceSum.toFixed(1))}a.push(i)}}),new o({title:game.i18n.localize("DIALOG.addTarget"),content:await renderTemplate("systems/dsa5/templates/dialog/addTarget-dialog.html",{selectables:a}),buttons:{}})}activateListeners(e){super.activateListeners(e);let t=e.find(".combatant");t.dblclick(a=>this.setTargets(a,!0)),t.click(a=>this.setTargets(a)),t.hover(this._onCombatantHoverIn.bind(this),this._onCombatantHoverOut.bind(this)),t.mousedown(a=>this._onRightClick(a))}_onCombatantHoverOut(e){this._getCombatApp()._onCombatantHoverOut(e)}_onCombatantHoverIn(e){this._getCombatApp()._onCombatantHoverIn(e)}_onRightClick(e){if(e.button==2){let t=game.combat.combatants.get(e.currentTarget.dataset.combatantId);if(t.token)return canvas.animatePan({x:t.token.x,y:t.token.y})}}_getCombatApp(){return game.combats.apps[0]}async setTargets(e,t=!1){let a=e.originalEvent.shiftKey;a||$(e.currentTarget).closest(".directory").find(".combatant").removeClass("selectedTarget"),$(e.currentTarget).addClass("selectedTarget");let s=e.currentTarget.dataset.combatantId;game.combat.combatants.get(s).token.object.setTarget(!0,{user:game.user,releaseOthers:!a,groupSelection:!0}),t&&this.close()}},pt=class o extends foundry.applications.api.HandlebarsApplicationMixin(foundry.applications.api.ApplicationV2){static{u(this,"SelectUserDialog")}static DEFAULT_OPTIONS={window:{title:"DIALOG.setTargetToUser"}};static PARTS={main:{template:"systems/dsa5/templates/dialog/selectForUserDialog.html"}};static async getDialog(){return new o}async _prepareContext(e){let t=await super._prepareContext(e);return t.users=game.users.filter(a=>a.active&&!a.isGM),t}static registerButtons(){Hooks.on("getSceneControlButtons",e=>{if(!game.user.isGM)return;let t={name:"targetUser",title:"CONTROLS.targetForUser",icon:"fa fa-bullseye",button:!0,onClick:u(async()=>{(await o.getDialog()).render(!0)},"onClick")};e[0].tools.splice(2,0,t)})}_onRender(e,t){super._onRender(t),$(this.element).find(".combatant").on("click",s=>this.setTargetToUser(s))}setTargetToUser(e){let t=Array.from(game.user.targets).map(i=>i.id),a=e.currentTarget.dataset.userId;game.users.get(a).updateTokenTargets(t),game.socket.emit("userActivity",a,{targets:t}),this.close()}},ft=class o extends foundry.applications.api.DialogV2{static{u(this,"UserMultipickDialog")}static async getDialog(e){let t=game.users.filter(a=>a.active&&!a.isGM);new o({window:{title:"SHEET.PostItem"},content:await renderTemplate("systems/dsa5/templates/dialog/usermultipickdialog.html",{users:t}),buttons:[{action:"done",icon:"fa fa-check",label:"yes",default:!0,callback:u((a,s,i)=>{this.postContent(s.form.elements,e)},"callback")},{action:"cancel",icon:"fas fa-times",label:"cancel"}]}).render(!0)}static async postContent(e,t){let a=g.chatDataSetup(t);if(!e.sel_all.checked){let s=[];for(let i of Object.keys(e))e[i].checked&&i!="sel_all"&&s.push(e[i].value);a.whisper=s}ChatMessage.create(a)}_onRender(e,t){super._onRender(t);let a=$(this.element);a.find('[name="sel_all"]').on("change",s=>{a.find(".usersel").prop("disabled",s.currentTarget.checked).prop("checked",s.currentTarget.checked)})}};var de=class o extends Dialog{static{u(this,"DialogShared")}static roman=[""," I"," II"," III"," IV"," V"," VI"," VII"," VIII"," IX"," X"];recallSettings(e,t,a,s){return this.recallData=game.dsa5.memory.recall(e,t,a),this.dialogData={mode:a,speaker:e,source:t,renderData:s},this}async _render(e,t){await super._render(e,t),await this.prepareFormRecall($(this._element))}setRollButtonWarning(){return this.dialogData.mode=="attack"?` ${game.i18n.localize("DIALOG.noTarget")}`:""}setMultipleTargetsWarning(){return this.dialogData.mode=="attack"?` ${game.i18n.localize("DIALOG.multipleTarget")}`:""}renderRollValueDie(e=1){if(this.dialogData.rollValue&&this.dialogData.mode!="damage"){let t=this.dialogData.mode=="attack"||this.dialogData.counterAttack?"die-mu":"die-in",a=this.dialogData.modifier||0;return`${Math.clamp(Math.round((this.dialogData.rollValue+a)*e),1,20)}`}else return""}async updateRollButton(e,t=1){let a=this.renderRollValueDie(t)+game.i18n.localize("Roll");e.length>0?e.length>1&&(a+=this.setMultipleTargetsWarning()):a+=this.setRollButtonWarning(),$(this._element).find(".dialog-buttons .rollButton").html(a)}async updateTargets(e,t){let a=await renderTemplate("systems/dsa5/templates/dialog/parts/targets.html",{targets:t});e.find(".targets").html(a),this.updateRollButton(t)}removeTarget(e){let t=e.currentTarget.dataset.id;$(e.currentTarget).remove();let a=[];game.user.targets.forEach(s=>{t!=s.id&&a.push(s.id)}),game.user.updateTokenTargets(a)}calculateProbability(e,t,a,s){if(g.moduleEnabled("dsa5-core")){let i=game.settings.get("dsa5-core","showProbability");if(i==1||i==2&&game.user.isGM){let n=[];for(let r=0;r<6;r++){let l=1+r,c=game.dsa5.apps.DSACharacterCalculator.rollSuccessCalculation(e,t,a,l,s);if(c>1)c=`${c}`.padStart(2,"0"),n.push(`${game.i18n.localize("CHARAbbrev.QS")} ${l}: ${c}%`);else break}$(this.element).find(".nonOpposedButton,.rollButton").attr("data-tooltip",n.join("
"))}}}readTargets(){let e=[];return game.user.targets.forEach(t=>{t.actor&&e.push({name:t.actor.name,img:t.actor.img,id:t.id})}),e}compareTargets(e,t){let a=this.readTargets();return JSON.stringify(t)!=JSON.stringify(a)&&(t=a,this.updateTargets(e,t)),t}activateListeners(e){super.activateListeners(e),e.find(".quantity-click").mousedown(t=>N.quantityClick(t)),e.find(".modifiers option").mousedown(t=>(t.preventDefault(),$(t.currentTarget).prop("selected",!$(t.currentTarget).prop("selected")),!1)),e.on("click",".rollTarget",t=>this.removeTarget(t)),e.on("click",".addTarget",t=>this.addTarget(t))}async addTarget(e){(await ia.getDialog(this.dialogData.speaker)).render(!0)}async prepareFormRecall(e){if(this.recallData)for(let t in this.recallData)if(t=="specAbs")for(let a of this.recallData[t]){let s=e.find(`.specAbs[data-id="${a.id}"]`);s.addClass("active").attr("data-step",a.step),s.find(".step").text(o.roman[a.step])}else{let a=e.find(`[name="${t}"]`);if(Array.isArray(this.recallData[t])){let s=a.find("option");for(let i of s){let n=this.recallData[t].find(r=>r.name==$(i).text().trim());n&&(i.selected=n.selected)}}else a.attr("type")=="checkbox"?a[0].checked=this.recallData[t]:a.val(this.recallData[t])}}};var{mergeObject:kn,duplicate:ps}=foundry.utils,Se=class o extends de{static{u(this,"DSA5SpellDialog")}static rollChanges=["defenseMalus"];static rollModifiers={forceSpell:{mod:1},reduceCostSpell:{mod:-1},increaseRangeSpell:{mod:-1},increaseCastingTime:{mod:1},decreaseCastingTime:{mod:-1},removeGesture:{mod:-2},removeFormula:{mod:-2},extensionModifier:{mod:0}};static get defaultOptions(){let e=super.defaultOptions;return kn(e,{width:700,resizable:!0}),e}static bigTimes=[5,30,120,480,960,1920];async prepareFormRecall(e){await super.prepareFormRecall(e),e.find(".spellModifier").trigger("change")}static getRollButtons(e,t,a,s){let i=ae.getRollButtons(e,t,a,s);if(["spell","liturgy"].includes(e.source.type)){let n=Number(e.source.system.castingTime.value),r=e.source.system.castingTime.progress,l=e.source.system.castingTime.modified;if(n&&e.extra.speaker.token!="emptyActor"){let c=l>0?` (${r}/${l})`:"";kn(i,{reloadButton:{label:`${game.i18n.localize("SPELL.reload")}${c}`,callback:u(async m=>{let d=await g.getSpeaker(e.extra.speaker),p={_id:e.source._id,"system.castingTime.progress":r+1};l==0&&(l=Number(m.find(".castingTime").text())-1,p["system.castingTime.modified"]=l),await d.updateEmbeddedDocuments("Item",[p]);let f=game.i18n.format("SPELL.isReloading",{actor:d.token?.name||d.prototypeToken.name,item:e.source.name,status:`${r+1}/${l}`});await ChatMessage.create(g.chatDataSetup(f))},"callback")}})}}return i}async applyTransformations(e,t){let a=t.find('[name="situationalModifiers"]');a.find('option[data-extension="1"]').remove();let s=[],i=Object.keys(o.rollModifiers).map(r=>`${r}.mod`);this.dialogData.renderData.rollModifiersPrepared=ps(this.dialogData.renderData.rollModifiers);for(let r of t.find(".specAbs.active")){let l=await fromUuid(r.dataset.uuid);if(l)for(let c of l.effects)for(let m of c.changes)if(o.rollChanges.includes(m.key)){let d=l.name.split(" - "),p=game.i18n.localize(`MODS.${m.key}`);d=`${d[1]||d[0]}`;let f=`${p}: ${m.value}
${game.i18n.localize("spellextension")}: ${d}`;s.push(``)}else m.key=="macro.transform"?await g.callItemTransformationMacro(m.value,e,c):i.includes(m.key)?c.apply(this.dialogData.renderData.rollModifiersPrepared,m):c.apply(e,m)}let n=this.dialogData.renderData.rollModifiersPrepared.extensionModifier.mod;if(n){let r=game.i18n.localize("ABBR.modifiers"),l=game.i18n.localize("spellextension"),c=`${r}: ${n}
${l}`;s.push(``)}a.append(s.join(""))}static setData(e,t,a){let s=ps(o.rollModifiers),i=`${t}RollModifiers`;if(e.system[i])for(let n of Object.keys(e.system[i]))s[n].mod+=Number(e.system[i][n]?.mod??0);return s}async recalcSpellModifiers(e,t){let a=e,s=ps(this.dialogData.source);N.ensureNumber(s);let i=a.find(".castingTime"),n=a.find(".aspcost"),r=a.find(".reach"),l=a.find(".maintainCost"),c=a.find(".ritual").length>0;await this.applyTransformations(s,a);let m=a.find(".maxMods");if(a.find(".spellModifier:checked").length>Number(m.text())){t&&(t.currentTarget.checked=!1),m.addClass("emphasize"),setTimeout(function(){m.removeClass("emphasize")},600);return}for(let I of Object.keys(this.dialogData.renderData.rollModifiersPrepared)){let A=this.dialogData.renderData.rollModifiersPrepared[I].mod;e.find(`.${I}Label`).text(`(${A})`),e.find(`#${I}`).val(A)}let d=e.find(".canChangeCastingTime");s.system.canChangeCastingTime.value=="true"?d.is(":empty")&&(d.html(await renderTemplate("systems/dsa5/templates/dialog/parts/canChangeCastingTime.html",{rollModifiers:this.dialogData.renderData.rollModifiers})),this.setPosition({height:"auto"})):d.is(":empty")||(d.html(""),this.setPosition({height:"auto"}));let p=s.system.AsPCost.value,f=s.system.range.value,h=s.system.castingTime.value,y=p,k=s.system.maintainCost.value;a.find(".variableBaseCost")[s.system.variableBaseCost=="true"?"show":"hide"]();let D=0;a.find(".spellModifier[data-cost]:checked").each(function(I,A){if(y=y*(A.value<0?.5:2),k!=""&&k!=null){let j=String(k).split(" ");j[0]=Math.max(Number(j[0])*(A.value<0?.5:2)),k=j.join(" ")}D+=Number(A.value)}),y<1?t&&(t.currentTarget.checked=!1):(n.text(y),l.text(k),n.attr("data-mod",D)),D=0,y=h,a.find(".spellModifier[data-castingTime]:checked").each(function(I,A){if(c){let j=o.bigTimes.indexOf(Number(y));if(j!=null){let S=j+(A.value>0?1:-1);S=0?y=o.bigTimes[S]:ui.notifications.error("DSAError.CastingTimeLimit",{localize:!0})}else ui.notifications.error("DSAError.TimeCannotBeParsed",{localize:!0})}else y=y*(A.value>0?2:.5);D+=Number(A.value)}),y<1?t&&(t.currentTarget.checked=!1):(i.text(y),i.attr("data-mod",D)),D=0;let v=game.i18n.localize("ReverseSpellRanges."+f);r.text(f),a.find(".spellModifier[data-reach]:checked").each(function(I,A){if(v=="self")A.checked=!1;else if(v=="touch")r.text("4 "+game.i18n.localize("step")),D+=Number(A.value);else{let j=f.split(" ");v=Number(j[0]),isNaN(v)?(t&&(t.currentTarget.checked=!1),ui.notifications.error("DSAError.RangeCannotBeParsed",{localize:!0})):(r.text(v*2+" "+game.i18n.localize("step")),D+=Number(A.value))}}),r.attr("data-mod",D),e.find(".reloadButton").prop("disabled",Number(e.find(".castingTime").text())<2),this.calculateProbability()}async calculateProbability(){let e=g.getSpeaker(this.dialogData.speaker),t=new FormDataExtended(this.element.find("form")[0]).object;t.situationalModifiers=O._parseModifiers(this._element);let a=this.dialogData.source.system.talentValue.value+t.fw+await R._situationalModifiers(t,"FW"),s=await R._situationalModifiers(t)+$(this.element).find("input.spellModifier:checked").map((i,n)=>Number(n.value)).get().reduce((i,n)=>i+n,0)+$(this.element).find("[name=maintainedSpells]")[0].value*-1;super.calculateProbability(e,this.dialogData.source,s,a)}activateListeners(e){super.activateListeners(e),e.find(".reloadButton").prop("disabled",Number(e.find(".castingTime").text())<2),e.find(".specAbs").mousedown(s=>{$(s.currentTarget).toggleClass("active"),this.recalcSpellModifiers(e)}),e.find(".variableBaseCost").change(s=>{let i=$(s.currentTarget).parents(".skill-test"),n=i.find(".aspcost").attr("data-base"),r=$(s.currentTarget).val();i.find(".aspcost").attr("data-base",r),i.find(".aspcost").text(Number(i.find(".aspcost").text())*r/n)}),e.on("change",".spellModifier",s=>this.recalcSpellModifiers(e,s)),e.on("change","input,select",()=>this.calculateProbability()),e.on("mousedown",".quantity-click",()=>this.calculateProbability());let t=this.readTargets();t.length==0&&this.setRollButtonWarning();let a=this;this.checkTargets=setInterval(function(){t=a.compareTargets(e,t)},500)}};var{getProperty:yr,hasProperty:br}=foundry.utils,K=class o{static{u(this,"DSA5SoundEffect")}static sounds;static triedInit=!1;static prepareSoundEffects(){o.soundPaths={money:[],armor:[],meleeweapon:[],rangeweapon:[],default:[]},game.modules.get("gAudioBundle-3")&&(o.soundPaths.money.push("modules/gAudioBundle-3/src/Mint Coins And Money/Coin_Slide_Carpet.ogg","modules/gAudioBundle-3/src/Mint Coins And Money/Coins_Drop_Carpet_06.ogg","modules/gAudioBundle-3/src/Mint Coins And Money/Coins_Bottlecaps_Drop.ogg","modules/gAudioBundle-3/src/Mint Coins And Money/Coins_In_Sack_Held_By_Drawstring_06.ogg","modules/gAudioBundle-3/src/Money/Money_Coins_Handle.ogg"),o.soundPaths.meleeweapon.push("modules/gAudioBundle-3/src/Medieval Armor And Impacts/Weapon_Impact_Parry_01.ogg")),game.modules.get("gAudioBundle-2")&&(o.soundPaths.meleeweapon.push("modules/gAudioBundle-2/src/Gore/Melee_Sword_Attack_04.ogg"),o.soundPaths.armor.push("modules/gAudioBundle-2/src/Footsteps/Footstep And Foley Sounds/Foley_Soldier_Gear_Equipment_Metal_Cloth_Heavy_Movement_Light_08.ogg"),o.soundPaths.default.push("modules/gAudioBundle-2/src/Footsteps/Footstep And Foley Sounds/Foley_Sports_Bag_Grab_Pickup_Catch_04.ogg","modules/gAudioBundle-2/src/Footsteps/Footstep And Foley Sounds/Footstep_Ice_Crunchy_Run_01.ogg","modules/gAudioBundle-2/src/Footsteps/Footstep And Foley Sounds/Footstep_Ice_Crunchy_Run_02.ogg")),game.modules.get("gAudioBundle-4")&&o.soundPaths.rangeweapon.push("modules/gAudioBundle-4/src/Super Heroes Sound Design/Hawk's_Arrow_Flies_Bow_And_Arrow_Shoot_2.ogg"),Hooks.call("setDefaultDSASounds",o.soundPaths)}static async playEffect(e,t,a,s=void 0,i=!1){let n=await this.getSound(e,t,a);if(n)try{s?(game.socket.emit("system.dsa5",{type:"playWhisperSound",payload:{whisper:s,soundPath:n}}),i||foundry.audio.AudioHelper.play({src:n,volume:.8,loop:!1},!1)):foundry.audio.AudioHelper.play({src:n,volume:.8,loop:!1},!0)}catch{console.warn(`Could not play item sound effect ${n}`)}}static async loadSoundConfig(){let e=game.settings.get("dsa5","soundConfig");if(e)try{let a=await(await fetch(e)).json();this.sounds=a,console.log("DSA5 | Sound Config Loaded")}catch(t){console.warn(t)}}static successLevelToString(e){switch(e){case-1:return["fail"];case-2:return["botch","fail"];case 1:return["success"];case 2:return["crit","success"];default:return[]}}static async getSound(e,t,a){if(!this.sounds&&!this.triedInit&&(await this.loadSoundConfig(),this.triedInit=!0),!this.sounds)return;let s=this.successLevelToString(a),i=[],n;switch(t.type){case"meleeweapon":case"rangeweapon":i=[...s.map(r=>`${t.type}.manual.${t.name}.${e}_${r}`),`${t.type}.manual.${t.name}.${e}`,`${t.type}.manual.${t.name}.default.${e}`,`${t.type}.manual.${t.name}.default`,...s.map(r=>`${t.type}.${t.system.combatskill.value}.${e}_${r}`),`${t.type}.${t.system.combatskill.value}.${e}`,...s.map(r=>`${t.type}.${t.system.combatskill.value}.default_${r}`),`${t.type}.${t.system.combatskill.value}.default`];break;case"skill":i=[...s.map(r=>`${t.type}.${t.name}.${e}_${r}`),`${t.type}.${t.name}.${e}`,...s.map(r=>`${t.type}.${t.name}.default_${r}`),`${t.type}.${t.name}.default`];break;case"liturgy":case"spell":case"ceremony":case"ritual":i=[...s.map(r=>`${t.type}.${t.name}.${e}_${r}`),`${t.type}.${t.name}.${e}`,...s.map(r=>`${t.type}.${t.name}.default_${r}`),`${t.type}.${t.name}.default`];break}i.push(...s.map(r=>`${t.type}.default_${r}`),`${t.type}.default`);for(let r of i)if(br(this.sounds,r)&&(n=yr(this.sounds,r),n&&(typeof n=="string"||n instanceof String)))break;return n}static async playMoneySound(e=!1){let t=o.soundPaths.money,a=t[Math.floor(Math.random()*t.length)];await this.playSoundPath(a,e)}static async playEquipmentWearStatusChange(e,t=!1){let a=o.soundPaths[e.type]||o.soundPaths.default;if(a.length>0){let s=a[Math.floor(Math.random()*a.length)];await this.playSoundPath(s,t,.5)}}static async playSoundPath(e,t=!1,a=.8){if(game.settings.get("dsa5","inventorySound"))try{foundry.audio.AudioHelper.play({src:e,volume:a,loop:!1},t)}catch{console.warn(`Could not play item sound effect ${e}`)}}};var{duplicate:wn}=foundry.utils,J=class o{static{u(this,"OnUseEffect")}constructor(e){this.item=e}async callMacro(e,t,a={}){let i=await game.packs.get(e)?.getDocuments({name:t});if(!i||!i.length){for(let r of game.packs.filter(l=>l.documentName=="Macro"&&/\(internal\)/.test(l.metadata.label)))if(i=await r.getDocuments({name:t}),i.length)break}let n={};if(i.length){let r=Object.getPrototypeOf(async function(){}).constructor;try{a.result=n;let l=new r("args","actor","item",i[0].command);n.ret=await l.call(this,a,this.item.actor,this.item)}catch{try{let c=new r("args","actor","item",` + `;e.find(".dpsSelector").remove(),e.find('.tab[data-tab="grid"]').append(s)});var{mergeObject:tc}=foundry.utils,ia=class o extends Dialog{static{u(this,"AddTargetDialog")}static async getDialog(e){let t=Array.from(game.user.targets).map(i=>i.id),a=[],s=canvas.scene?canvas.scene.tokens.get(e.token)?.object:void 0;return game.combat&&game.combat.combatants.forEach(i=>{if(i.visible){if(i.isSelected=t.includes(i.token.id),s&&i.token){let n=canvas.scene.tokens.get(i.token.id).object;i.distance=ne.rangeFinder(s,n),i.distance.distanceSum=Number(i.distance.distanceSum.toFixed(1))}a.push(i)}}),new o({title:game.i18n.localize("DIALOG.addTarget"),content:await renderTemplate("systems/dsa5/templates/dialog/addTarget-dialog.html",{selectables:a}),buttons:{}})}activateListeners(e){super.activateListeners(e);let t=e.find(".combatant");t.dblclick(a=>this.setTargets(a,!0)),t.click(a=>this.setTargets(a)),t.hover(this._onCombatantHoverIn.bind(this),this._onCombatantHoverOut.bind(this)),t.mousedown(a=>this._onRightClick(a))}_onCombatantHoverOut(e){this._getCombatApp()._onCombatantHoverOut(e)}_onCombatantHoverIn(e){this._getCombatApp()._onCombatantHoverIn(e)}_onRightClick(e){if(e.button==2){let t=game.combat.combatants.get(e.currentTarget.dataset.combatantId);if(t.token)return canvas.animatePan({x:t.token.x,y:t.token.y})}}_getCombatApp(){return game.combats.apps[0]}async setTargets(e,t=!1){let a=e.originalEvent.shiftKey;a||$(e.currentTarget).closest(".directory").find(".combatant").removeClass("selectedTarget"),$(e.currentTarget).addClass("selectedTarget");let s=e.currentTarget.dataset.combatantId;game.combat.combatants.get(s).token.object.setTarget(!0,{user:game.user,releaseOthers:!a,groupSelection:!0}),t&&this.close()}},pt=class o extends foundry.applications.api.HandlebarsApplicationMixin(foundry.applications.api.ApplicationV2){static{u(this,"SelectUserDialog")}static DEFAULT_OPTIONS={window:{title:"DIALOG.setTargetToUser"}};static PARTS={main:{template:"systems/dsa5/templates/dialog/selectForUserDialog.html"}};static async getDialog(){return new o}async _prepareContext(e){let t=await super._prepareContext(e);return t.users=game.users.filter(a=>a.active&&!a.isGM),t}static registerButtons(){Hooks.on("getSceneControlButtons",e=>{if(!game.user.isGM)return;let t={name:"targetUser",title:"CONTROLS.targetForUser",icon:"fa fa-bullseye",button:!0,onClick:u(async()=>{(await o.getDialog()).render(!0)},"onClick")};e[0].tools.splice(2,0,t)})}_onRender(e,t){super._onRender(t),$(this.element).find(".combatant").on("click",s=>this.setTargetToUser(s))}setTargetToUser(e){let t=Array.from(game.user.targets).map(i=>i.id),a=e.currentTarget.dataset.userId;game.users.get(a).updateTokenTargets(t),game.socket.emit("userActivity",a,{targets:t}),this.close()}},ft=class o extends foundry.applications.api.DialogV2{static{u(this,"UserMultipickDialog")}static async getDialog(e){let t=game.users.filter(a=>a.active&&!a.isGM);new o({window:{title:"SHEET.PostItem"},content:await renderTemplate("systems/dsa5/templates/dialog/usermultipickdialog.html",{users:t}),buttons:[{action:"done",icon:"fa fa-check",label:"yes",default:!0,callback:u((a,s,i)=>{this.postContent(s.form.elements,e)},"callback")},{action:"cancel",icon:"fas fa-times",label:"cancel"}]}).render(!0)}static async postContent(e,t){let a=g.chatDataSetup(t);if(!e.sel_all.checked){let s=[];for(let i of Object.keys(e))e[i].checked&&i!="sel_all"&&s.push(e[i].value);a.whisper=s}ChatMessage.create(a)}_onRender(e,t){super._onRender(t);let a=$(this.element);a.find('[name="sel_all"]').on("change",s=>{a.find(".usersel").prop("disabled",s.currentTarget.checked).prop("checked",s.currentTarget.checked)})}};var de=class o extends Dialog{static{u(this,"DialogShared")}static roman=[""," I"," II"," III"," IV"," V"," VI"," VII"," VIII"," IX"," X"];recallSettings(e,t,a,s){return this.recallData=game.dsa5.memory.recall(e,t,a),this.dialogData={mode:a,speaker:e,source:t,renderData:s},this}async _render(e,t){await super._render(e,t),await this.prepareFormRecall($(this._element))}setRollButtonWarning(){return this.dialogData.mode=="attack"?` ${game.i18n.localize("DIALOG.noTarget")}`:""}setMultipleTargetsWarning(){return this.dialogData.mode=="attack"?` ${game.i18n.localize("DIALOG.multipleTarget")}`:""}renderRollValueDie(e=1){if(this.dialogData.rollValue&&this.dialogData.mode!="damage"){let t=this.dialogData.mode=="attack"||this.dialogData.counterAttack?"die-mu":"die-in",a=this.dialogData.modifier||0;return`${Math.clamp(Math.round((this.dialogData.rollValue+a)*e),1,20)}`}else return""}async updateRollButton(e,t=1){let a=this.renderRollValueDie(t)+game.i18n.localize("Roll");e.length>0?e.length>1&&(a+=this.setMultipleTargetsWarning()):a+=this.setRollButtonWarning(),$(this._element).find(".dialog-buttons .rollButton").html(a)}async updateTargets(e,t){let a=await renderTemplate("systems/dsa5/templates/dialog/parts/targets.html",{targets:t});e.find(".targets").html(a),this.updateRollButton(t)}removeTarget(e){let t=e.currentTarget.dataset.id;$(e.currentTarget).remove();let a=[];game.user.targets.forEach(s=>{t!=s.id&&a.push(s.id)}),game.user.updateTokenTargets(a)}calculateProbability(e,t,a,s){if(g.moduleEnabled("dsa5-core")){let i=game.settings.get("dsa5-core","showProbability");if(i==1||i==2&&game.user.isGM){let n=[];for(let r=0;r<6;r++){let l=1+r,c=game.dsa5.apps.DSACharacterCalculator.rollSuccessCalculation(e,t,a,l,s);if(c>1)c=`${c}`.padStart(2,"0"),n.push(`${game.i18n.localize("CHARAbbrev.QS")} ${l}: ${c}%`);else break}$(this.element).find(".nonOpposedButton,.rollButton").attr("data-tooltip",n.join("
"))}}}readTargets(){let e=[];return game.user.targets.forEach(t=>{t.actor&&e.push({name:t.actor.name,img:t.actor.img,id:t.id})}),e}compareTargets(e,t){let a=this.readTargets();return JSON.stringify(t)!=JSON.stringify(a)&&(t=a,this.updateTargets(e,t)),t}activateListeners(e){super.activateListeners(e),e.find(".quantity-click").mousedown(t=>N.quantityClick(t)),e.find(".modifiers option").mousedown(t=>(t.preventDefault(),$(t.currentTarget).prop("selected",!$(t.currentTarget).prop("selected")),!1)),e.on("click",".rollTarget",t=>this.removeTarget(t)),e.on("click",".addTarget",t=>this.addTarget(t))}async addTarget(e){(await ia.getDialog(this.dialogData.speaker)).render(!0)}async prepareFormRecall(e){if(this.recallData)for(let t in this.recallData)if(t=="specAbs")for(let a of this.recallData[t]){let s=e.find(`.specAbs[data-id="${a.id}"]`);s.addClass("active").attr("data-step",a.step),s.find(".step").text(o.roman[a.step])}else{let a=e.find(`[name="${t}"]`);if(Array.isArray(this.recallData[t])){let s=a.find("option");for(let i of s){let n=this.recallData[t].find(r=>r.name==$(i).text().trim());n&&(i.selected=n.selected)}}else a.attr("type")=="checkbox"?a[0].checked=this.recallData[t]:a.val(this.recallData[t])}}};var{mergeObject:kn,duplicate:ps}=foundry.utils,Se=class o extends de{static{u(this,"DSA5SpellDialog")}static rollChanges=["defenseMalus"];static rollModifiers={forceSpell:{mod:1},reduceCostSpell:{mod:-1},increaseRangeSpell:{mod:-1},increaseCastingTime:{mod:1},decreaseCastingTime:{mod:-1},removeGesture:{mod:-2},removeFormula:{mod:-2},extensionModifier:{mod:0}};static get defaultOptions(){let e=super.defaultOptions;return kn(e,{width:700,resizable:!0}),e}static bigTimes=[5,30,120,480,960,1920];async prepareFormRecall(e){await super.prepareFormRecall(e),e.find(".spellModifier").trigger("change")}static getRollButtons(e,t,a,s){let i=ae.getRollButtons(e,t,a,s);if(["spell","liturgy"].includes(e.source.type)){let n=Number(e.source.system.castingTime.value),r=e.source.system.castingTime.progress,l=e.source.system.castingTime.modified;if(n&&e.extra.speaker.token!="emptyActor"){let c=l>0?` (${r}/${l})`:"";kn(i,{reloadButton:{label:`${game.i18n.localize("SPELL.reload")}${c}`,callback:u(async m=>{let d=await g.getSpeaker(e.extra.speaker),p={_id:e.source._id,"system.castingTime.progress":r+1};l==0&&(l=Number(m.find(".castingTime").text())-1,p["system.castingTime.modified"]=l),await d.updateEmbeddedDocuments("Item",[p]);let f=game.i18n.format("SPELL.isReloading",{actor:d.token?.name||d.prototypeToken.name,item:e.source.name,status:`${r+1}/${l}`});await ChatMessage.create(g.chatDataSetup(f))},"callback")}})}}return i}async applyTransformations(e,t){let a=t.find('[name="situationalModifiers"]');a.find('option[data-extension="1"]').remove();let s=[],i=Object.keys(o.rollModifiers).map(r=>`${r}.mod`);this.dialogData.renderData.rollModifiersPrepared=ps(this.dialogData.renderData.rollModifiers);for(let r of t.find(".specAbs.active")){let l=await fromUuid(r.dataset.uuid);if(l)for(let c of l.effects)for(let m of c.changes)if(o.rollChanges.includes(m.key)){let d=l.name.split(" - "),p=game.i18n.localize(`MODS.${m.key}`);d=`${d[1]||d[0]}`;let f=`${p}: ${m.value}
${game.i18n.localize("spellextension")}: ${d}`;s.push(``)}else m.key=="macro.transform"?await g.callItemTransformationMacro(m.value,e,c):i.includes(m.key)?c.apply(this.dialogData.renderData.rollModifiersPrepared,m):c.apply(e,m)}let n=this.dialogData.renderData.rollModifiersPrepared.extensionModifier.mod;if(n){let r=game.i18n.localize("ABBR.modifiers"),l=game.i18n.localize("spellextension"),c=`${r}: ${n}
${l}`;s.push(``)}a.append(s.join(""))}static setData(e,t,a){let s=ps(o.rollModifiers),i=`${t}RollModifiers`;if(e.system[i])for(let n of Object.keys(e.system[i]))s[n].mod+=Number(e.system[i][n]?.mod??0);return s}async recalcSpellModifiers(e,t){let a=e,s=ps(this.dialogData.source);N.ensureNumber(s);let i=a.find(".castingTime"),n=a.find(".aspcost"),r=a.find(".reach"),l=a.find(".maintainCost"),c=a.find(".ritual").length>0;await this.applyTransformations(s,a);let m=a.find(".maxMods");if(a.find(".spellModifier:checked").length>Number(m.text())){t&&(t.currentTarget.checked=!1),m.addClass("emphasize"),setTimeout(function(){m.removeClass("emphasize")},600);return}for(let I of Object.keys(this.dialogData.renderData.rollModifiersPrepared)){let S=this.dialogData.renderData.rollModifiersPrepared[I].mod;e.find(`.${I}Label`).text(`(${S})`),e.find(`#${I}`).val(S)}let d=e.find(".canChangeCastingTime");s.system.canChangeCastingTime.value=="true"?d.is(":empty")&&(d.html(await renderTemplate("systems/dsa5/templates/dialog/parts/canChangeCastingTime.html",{rollModifiers:this.dialogData.renderData.rollModifiers})),this.setPosition({height:"auto"})):d.is(":empty")||(d.html(""),this.setPosition({height:"auto"}));let p=s.system.AsPCost.value,f=s.system.range.value,h=s.system.castingTime.value,y=p,k=s.system.maintainCost.value;a.find(".variableBaseCost")[s.system.variableBaseCost=="true"?"show":"hide"]();let C=0;a.find(".spellModifier[data-cost]:checked").each(function(I,S){if(y=y*(S.value<0?.5:2),k!=""&&k!=null){let j=String(k).split(" ");j[0]=Math.max(Number(j[0])*(S.value<0?.5:2)),k=j.join(" ")}C+=Number(S.value)}),y<1?t&&(t.currentTarget.checked=!1):(n.text(y),l.text(k),n.attr("data-mod",C)),C=0,y=h,a.find(".spellModifier[data-castingTime]:checked").each(function(I,S){if(c){let j=o.bigTimes.indexOf(Number(y));if(j!=null){let A=j+(S.value>0?1:-1);A=0?y=o.bigTimes[A]:ui.notifications.error("DSAError.CastingTimeLimit",{localize:!0})}else ui.notifications.error("DSAError.TimeCannotBeParsed",{localize:!0})}else y=y*(S.value>0?2:.5);C+=Number(S.value)}),y<1?t&&(t.currentTarget.checked=!1):(i.text(y),i.attr("data-mod",C)),C=0;let v=game.i18n.localize("ReverseSpellRanges."+f);r.text(f),a.find(".spellModifier[data-reach]:checked").each(function(I,S){if(v=="self")S.checked=!1;else if(v=="touch")r.text("4 "+game.i18n.localize("step")),C+=Number(S.value);else{let j=f.split(" ");v=Number(j[0]),isNaN(v)?(t&&(t.currentTarget.checked=!1),ui.notifications.error("DSAError.RangeCannotBeParsed",{localize:!0})):(r.text(v*2+" "+game.i18n.localize("step")),C+=Number(S.value))}}),r.attr("data-mod",C),e.find(".reloadButton").prop("disabled",Number(e.find(".castingTime").text())<2),this.calculateProbability()}async calculateProbability(){let e=g.getSpeaker(this.dialogData.speaker),t=new FormDataExtended(this.element.find("form")[0]).object;t.situationalModifiers=O._parseModifiers(this._element);let a=this.dialogData.source.system.talentValue.value+t.fw+await R._situationalModifiers(t,"FW"),s=await R._situationalModifiers(t)+$(this.element).find("input.spellModifier:checked").map((i,n)=>Number(n.value)).get().reduce((i,n)=>i+n,0)+$(this.element).find("[name=maintainedSpells]")[0].value*-1;super.calculateProbability(e,this.dialogData.source,s,a)}activateListeners(e){super.activateListeners(e),e.find(".reloadButton").prop("disabled",Number(e.find(".castingTime").text())<2),e.find(".specAbs").mousedown(s=>{$(s.currentTarget).toggleClass("active"),this.recalcSpellModifiers(e)}),e.find(".variableBaseCost").change(s=>{let i=$(s.currentTarget).parents(".skill-test"),n=i.find(".aspcost").attr("data-base"),r=$(s.currentTarget).val();i.find(".aspcost").attr("data-base",r),i.find(".aspcost").text(Number(i.find(".aspcost").text())*r/n)}),e.on("change",".spellModifier",s=>this.recalcSpellModifiers(e,s)),e.on("change","input,select",()=>this.calculateProbability()),e.on("mousedown",".quantity-click",()=>this.calculateProbability());let t=this.readTargets();t.length==0&&this.setRollButtonWarning();let a=this;this.checkTargets=setInterval(function(){t=a.compareTargets(e,t)},500)}};var{getProperty:yr,hasProperty:br}=foundry.utils,K=class o{static{u(this,"DSA5SoundEffect")}static sounds;static triedInit=!1;static prepareSoundEffects(){o.soundPaths={money:[],armor:[],meleeweapon:[],rangeweapon:[],default:[]},game.modules.get("gAudioBundle-3")&&(o.soundPaths.money.push("modules/gAudioBundle-3/src/Mint Coins And Money/Coin_Slide_Carpet.ogg","modules/gAudioBundle-3/src/Mint Coins And Money/Coins_Drop_Carpet_06.ogg","modules/gAudioBundle-3/src/Mint Coins And Money/Coins_Bottlecaps_Drop.ogg","modules/gAudioBundle-3/src/Mint Coins And Money/Coins_In_Sack_Held_By_Drawstring_06.ogg","modules/gAudioBundle-3/src/Money/Money_Coins_Handle.ogg"),o.soundPaths.meleeweapon.push("modules/gAudioBundle-3/src/Medieval Armor And Impacts/Weapon_Impact_Parry_01.ogg")),game.modules.get("gAudioBundle-2")&&(o.soundPaths.meleeweapon.push("modules/gAudioBundle-2/src/Gore/Melee_Sword_Attack_04.ogg"),o.soundPaths.armor.push("modules/gAudioBundle-2/src/Footsteps/Footstep And Foley Sounds/Foley_Soldier_Gear_Equipment_Metal_Cloth_Heavy_Movement_Light_08.ogg"),o.soundPaths.default.push("modules/gAudioBundle-2/src/Footsteps/Footstep And Foley Sounds/Foley_Sports_Bag_Grab_Pickup_Catch_04.ogg","modules/gAudioBundle-2/src/Footsteps/Footstep And Foley Sounds/Footstep_Ice_Crunchy_Run_01.ogg","modules/gAudioBundle-2/src/Footsteps/Footstep And Foley Sounds/Footstep_Ice_Crunchy_Run_02.ogg")),game.modules.get("gAudioBundle-4")&&o.soundPaths.rangeweapon.push("modules/gAudioBundle-4/src/Super Heroes Sound Design/Hawk's_Arrow_Flies_Bow_And_Arrow_Shoot_2.ogg"),Hooks.call("setDefaultDSASounds",o.soundPaths)}static async playEffect(e,t,a,s=void 0,i=!1){let n=await this.getSound(e,t,a);if(n)try{s?(game.socket.emit("system.dsa5",{type:"playWhisperSound",payload:{whisper:s,soundPath:n}}),i||foundry.audio.AudioHelper.play({src:n,volume:.8,loop:!1},!1)):foundry.audio.AudioHelper.play({src:n,volume:.8,loop:!1},!0)}catch{console.warn(`Could not play item sound effect ${n}`)}}static async loadSoundConfig(){let e=game.settings.get("dsa5","soundConfig");if(e)try{let a=await(await fetch(e)).json();this.sounds=a,console.log("DSA5 | Sound Config Loaded")}catch(t){console.warn(t)}}static successLevelToString(e){switch(e){case-1:return["fail"];case-2:return["botch","fail"];case 1:return["success"];case 2:return["crit","success"];default:return[]}}static async getSound(e,t,a){if(!this.sounds&&!this.triedInit&&(await this.loadSoundConfig(),this.triedInit=!0),!this.sounds)return;let s=this.successLevelToString(a),i=[],n;switch(t.type){case"meleeweapon":case"rangeweapon":i=[...s.map(r=>`${t.type}.manual.${t.name}.${e}_${r}`),`${t.type}.manual.${t.name}.${e}`,`${t.type}.manual.${t.name}.default.${e}`,`${t.type}.manual.${t.name}.default`,...s.map(r=>`${t.type}.${t.system.combatskill.value}.${e}_${r}`),`${t.type}.${t.system.combatskill.value}.${e}`,...s.map(r=>`${t.type}.${t.system.combatskill.value}.default_${r}`),`${t.type}.${t.system.combatskill.value}.default`];break;case"skill":i=[...s.map(r=>`${t.type}.${t.name}.${e}_${r}`),`${t.type}.${t.name}.${e}`,...s.map(r=>`${t.type}.${t.name}.default_${r}`),`${t.type}.${t.name}.default`];break;case"liturgy":case"spell":case"ceremony":case"ritual":i=[...s.map(r=>`${t.type}.${t.name}.${e}_${r}`),`${t.type}.${t.name}.${e}`,...s.map(r=>`${t.type}.${t.name}.default_${r}`),`${t.type}.${t.name}.default`];break}i.push(...s.map(r=>`${t.type}.default_${r}`),`${t.type}.default`);for(let r of i)if(br(this.sounds,r)&&(n=yr(this.sounds,r),n&&(typeof n=="string"||n instanceof String)))break;return n}static async playMoneySound(e=!1){let t=o.soundPaths.money,a=t[Math.floor(Math.random()*t.length)];await this.playSoundPath(a,e)}static async playEquipmentWearStatusChange(e,t=!1){let a=o.soundPaths[e.type]||o.soundPaths.default;if(a.length>0){let s=a[Math.floor(Math.random()*a.length)];await this.playSoundPath(s,t,.5)}}static async playSoundPath(e,t=!1,a=.8){if(game.settings.get("dsa5","inventorySound"))try{foundry.audio.AudioHelper.play({src:e,volume:a,loop:!1},t)}catch{console.warn(`Could not play item sound effect ${e}`)}}};var{duplicate:wn}=foundry.utils,J=class o{static{u(this,"OnUseEffect")}constructor(e){this.item=e}async callMacro(e,t,a={}){let i=await game.packs.get(e)?.getDocuments({name:t});if(!i||!i.length){for(let r of game.packs.filter(l=>l.documentName=="Macro"&&/\(internal\)/.test(l.metadata.label)))if(i=await r.getDocuments({name:t}),i.length)break}let n={};if(i.length){let r=Object.getPrototypeOf(async function(){}).constructor;try{a.result=n;let l=new r("args","actor","item",i[0].command);n.ret=await l.call(this,a,this.item.actor,this.item)}catch{try{let c=new r("args","actor","item",` const that = this; ${i[0].command.replace(/(?=[ |(|{]+)?this\./g,"that.")} - `);n.ret=await c.call(this,a,this.item.actor)}catch(c){ui.notifications.error("There was an error in your macro syntax. See the console (F12) for details"),console.error(c),n.error=!0}}}else ui.notifications.error(game.i18n.format("DSAError.macroNotFound",{name:t}));return n}async executeOnUseEffect(){if(!this.item.actor)return;if(!game.user.can("MACRO_SCRIPT"))return ui.notifications.warn("You are not allowed to use JavaScript macros.");let e=o.getOnUseEffect(this.item);try{let t=Object.getPrototypeOf(async function(){}).constructor;await new t("item","actor",e).call(this,this.item,this.item.actor)}catch(t){ui.notifications.error("There was an error in your macro syntax. See the console (F12) for details"),console.error(t),console.warn(t.stack)}}static getOnUseEffect(e){return e.getFlag("dsa5","onUseEffect")}async automatedAnimation(e,t={}){g.moduleEnabled("autoanimations")&&console.warn("Animations for on use effects not enabled yet")}static effectBaseDummy(e,t,a){return{name:e,icon:"icons/svg/aura.svg",changes:t,duration:a,flags:{dsa5:{value:null,description:e}}}}effectDummy(e,t,a){return o.effectBaseDummy(e,t,a)}async socketedConditionAddActor(e,t){if(game.user.isGM){let a=typeof t=="string";a&&(t=wn(CONFIG.statusEffects.find(i=>i.id==t)),t.name=game.i18n.localize(t.name));let s=[];for(let i of e)a?await i.addCondition(t,1,!1,!1):await i.addCondition(t),s.push(i.name);await this.createInfoMessage(t,s)}else{let a={id:this.item.uuid,data:t,actors:e.map(s=>s.id)};game.socket.emit("system.dsa5",{type:"socketedConditionAddActor",payload:a})}}async createInfoMessage(e,t,a=!0){if(t.length){let s=a?"ActiveEffects.appliedEffect":"ActiveEffects.removedEffect",i=game.i18n.format(s,{source:e.name,target:t.join(", ")});await ChatMessage.create(g.chatDataSetup(i))}}async socketedRemoveCondition(e,t,a=1){if(game.user.isGM){let s=[];for(let n of e){let r=canvas.tokens.get(n);r.actor&&(await r.actor.removeCondition(t,a,!1),s.push(r.name))}let i=CONFIG.statusEffects.find(n=>n.id==t);i.name=game.i18n.localize(i.name),await this.createInfoMessage(i,s,!1)}else{let s={id:this.item.uuid,coreId:t,targets:e};game.socket.emit("system.dsa5",{type:"socketedRemoveCondition",payload:s})}}async socketedActorTransformation(e,t){if(game.user.isGM)for(let a of e){let s=canvas.tokens.get(a);s.actor&&await s.actor.update(t)}else{let a={id:this.item.uuid,targets:e,update:t};game.socket.emit("system.dsa5",{type:"socketedActorTransformation",payload:a})}}async socketedConditionAdd(e,t){if(game.user.isGM){let a=typeof t=="string";a&&(t=wn(CONFIG.statusEffects.find(i=>i.id==t)),t.name=game.i18n.localize(t.name));let s=[];for(let i of e){let n=canvas.tokens.get(i);n.actor&&(a?await n.actor.addCondition(t,1,!1,!1):await n.actor.addCondition(t),s.push(n.name))}await this.createInfoMessage(t,s)}else{let a={id:this.item.uuid,data:t,targets:e};game.socket.emit("system.dsa5",{type:"socketedConditionAdd",payload:a})}}};var pe=class o{static{u(this,"DSATriggers")}static EVENTS={ARMOR_TRANSFORMATION:4,DAMAGE_TRANSFORMATION:5,POST_ROLL:6,POST_OPPOSED:7};static async postOpposed(e){let t=g.getSpeaker(e.attacker.speaker);t&&await this.runMacro(t,e.attacker.testResult,o.EVENTS.POST_OPPOSED,e)}static async postRoll(e){let t=g.getSpeaker(e.testData.speaker);t&&await this.runMacro(t,e.testData,o.EVENTS.POST_ROLL,e)}static async callMacro(e,t,a,s={}){return await new J(e).callMacro(t,a,s)}static async runMacro(e,t,a,s){if(!game.user.can("MACRO_SCRIPT"))ui.notifications.warn("You are not allowed to use JavaScript macros.");else for(let[i,n]of Object.entries(e.dsatriggers[a])){let r=e.items.get(i),l=r.effects.get(n),c=l.getFlag("dsa5","args3");try{let m=Object.getPrototypeOf(async function(){}).constructor;return await new m("actor","testData","type","data","source","ef",c).call(this,e,t,a,s,r,l)}catch(m){ui.notifications.error("There was an error in your macro syntax. See the console (F12) for details"),console.error(m)}}}};var{mergeObject:gt,getProperty:X,duplicate:na,setProperty:vn}=foundry.utils;function Tn(o,e={}){g.moduleEnabled("autoanimations")&&console.warn("Animations for on use effects not enabled yet")}u(Tn,"automatedAnimation");function kr(o,e,t){return J.effectBaseDummy(o,e,t)}u(kr,"effectDummy");async function fs(o,e,t,a,s,i={}){let n={};if(!game.user.can("MACRO_SCRIPT"))ui.notifications.warn("You are not allowed to use JavaScript macros.");else{let l=await game.packs.get(o)?.getDocuments({name:e});if(!l||!l.length){for(let c of game.packs.filter(m=>m.documentName=="Macro"&&/\(internal\)/.test(m.metadata.label)))if(l=await c.getDocuments({name:e}),l.length)break}if(l.length){let c=Object.getPrototypeOf(async function(){}).constructor,m=new c("actor","item","qs","automatedAnimation","args",l[0].command);try{i.result=n;let d=gt({automatedAnimation:Tn,effectDummy:kr},this);await m.call(d,t,a,s,Tn,i)}catch(d){ui.notifications.error("There was an error in your macro syntax. See the console (F12) for details"),console.error(d),n.error=!0}}else ui.notifications.error(game.i18n.format("DSAError.macroNotFound",{name:e}))}return n}u(fs,"callMacro");Hooks.once("i18nInit",()=>{Z.effectDurationRegexes=[{regEx:new RegExp(game.i18n.localize("DSAREGEX.combatRounds"),"i"),seconds:5},{regEx:new RegExp(game.i18n.localize("DSAREGEX.minutes"),"i"),seconds:60},{regEx:new RegExp(game.i18n.localize("DSAREGEX.hours"),"i"),seconds:3600},{regEx:new RegExp(game.i18n.localize("DSAREGEX.days"),"i"),seconds:3600*24},{regEx:new RegExp(game.i18n.localize("DSAREGEX.weeks"),"i"),seconds:3600*24*7},{regEx:new RegExp(game.i18n.localize("DSAREGEX.months"),"i"),seconds:3600*24*30},{regEx:new RegExp(game.i18n.localize("DSAREGEX.years"),"i"),seconds:3600*24*350}]});var Z=class o extends ActiveEffectConfig{static{u(this,"DSAActiveEffectConfig")}static AdvantageRuleItems=new Set(["armor","meleeweapon","rangeweapon"]);static get defaultOptions(){return gt(super.defaultOptions,{resizable:!0})}static async callMacro(e,t,a,s,i,n={}){return await fs(e,t,a,s,i,n)}static async startDelayedEffect(e,t){t.update({"system.delayed":!1,duration:e,"flags.dsa5.-=onDelayed":null})}static onDelayedEffect(e,t){let a=!0;if(t.system.delayed){let s=t.system?.originalDuration||{seconds:"",rounds:""};if(gt(s,{startRound:game.combat?.round,startTurn:game.combat?.turn,startTime:game.time.worldTime}),!s.rounds&&s.seconds&&(s.rounds=Number(s.seconds)/5),(t.changes.length||t.statuses.size)&&(this.startDelayedEffect(s,t),a=!1),t.system.macroEffect){let i=t.system.initialTestData,n=game.actors.get(t.system.sourceActor),r=t.system.source,l=na(t.system.macroEffect);delete l.flags.dsa5?.onDelayed,l.system.delayed=!1,l.duration=s,this.applyAdvancedFunction(e,[l],r,i,n)}}return a}static async onEffectRemove(e,t){let a=X(t,"flags.dsa5.onRemove");if(a)if(!game.user.can("MACRO_SCRIPT"))ui.notifications.warn("You are not allowed to use JavaScript macros.");else try{let s=Object.getPrototypeOf(async function(){}).constructor;await new s("effect","actor",a).call(this,t,e)}catch(s){ui.notifications.error("There was an error in your macro syntax. See the console (F12) for details"),console.error(s),console.warn(s.stack)}}async checkTimesUpInstalled(){let e=g.moduleEnabled("times-up");return!e&&game.user.isGM&&ui.notifications.warn("DSAError.shouldTimesUp",{localize:!0}),e}async _render(e=!1,t={}){await super._render(e,t);let a=0,s=X(this.object,"parent.type"),i=["meleeweapon","rangeweapon"].includes(s)||s=="trait"&&["meleeAttack","rangeAttack"].includes(X(this.object,"parent.system.traitType.value")),n={hasSpellEffects:i||["spell","liturgy","ritual","skill","ceremony","consumable","poison","disease","ammunition"].includes(s)||["specialability"].includes(s)&&X(this.object,"parent.system.category.value")=="Combat",hasDamageTransformation:["ammunition","meleeweapon","rangeweapon"].includes(s),hasTriggerEffects:["specialability"].includes(s),hasSuccessEffects:["poison","disease"].includes(s)},r=[];if((n.hasSpellEffects||n.hasDamageTransformation||n.hasTriggerEffects)&&r.push({name:"ActiveEffects.advancedFunctions.none",index:0}),n.hasSpellEffects)for(let y of["systemEffect","macro","creature"])r.push({name:`ActiveEffects.advancedFunctions.${y}`,index:a+=1});n.hasDamageTransformation&&r.push({name:"ActiveEffects.advancedFunctions.armorPostprocess",index:pe.EVENTS.ARMOR_TRANSFORMATION},{name:"ActiveEffects.advancedFunctions.damagePostprocess",index:pe.EVENTS.DAMAGE_TRANSFORMATION}),n.hasTriggerEffects&&r.push({name:"ActiveEffects.advancedFunctions.postRoll",index:pe.EVENTS.POST_ROLL},{name:"ActiveEffects.advancedFunctions.postOpposed",index:pe.EVENTS.POST_OPPOSED});let l={systemEffects:this.getStatusEffects(),canEditMacros:game.user.isGM||game.settings.get("dsa5","playerCanEditSpellMacro")},c=["players","player","playergm","gm"].reduce((y,k)=>(y[k]=game.i18n.localize(`ActiveEffects.messageReceivers.${k}`),y),{}),m={1:"ActiveEffects.onSuccess",2:"ActiveEffects.onFailure"},d=o.AdvantageRuleItems.has(s),p=[2,6,7],f=$(this._element);f.find(".tabs").append(`${game.i18n.localize("advanced")}`);let h=await renderTemplate("systems/dsa5/templates/status/advanced_effect.html",{effect:this.object,advancedFunctions:r,effectConfigs:n,macroIndexes:p,messageReceivers:c,canWeaponAdvantages:d,equipmentAdvantageOptions:{1:game.i18n.localize(`AdvantageRuleItems.${s}.1`),2:game.i18n.localize(`AdvantageRuleItems.${s}.2`)},applySuccessConditions:m,config:l,isWeapon:i,dispositions:Object.entries(CONST.TOKEN_DISPOSITIONS).reduce((y,k)=>(y[k[1]]=`TOKEN.DISPOSITION.${k[0]}`,y),{2:game.i18n.localize("all")})});f.find('.tab[data-tab="effects"]').after($(h)),f.find(".advancedSelector").on("change",y=>{let k=this.object;k.flags.dsa5.advancedFunction=$(y.currentTarget).val(),renderTemplate("systems/dsa5/templates/status/advanced_functions.html",{effect:k,config:l,macroIndexes:p}).then(D=>{f.find(".advancedFunctions").html(D)})}),f.find(".auraSelector").on("change",y=>{f.find(".auraDetails").toggleClass("dsahidden",!y.currentTarget.checked),f.find(".auraBox").toggleClass("groupbox",y.currentTarget.checked)}),this.object.statuses.size&&game.i18n.has(this.object.description)&&f.find('[data-tab="details"] .editor').replaceWith(`

${game.i18n.localize(this.object.description)}

`),this.checkTimesUpInstalled()}getStatusEffects(){return CONFIG.statusEffects.map(e=>({id:e.id,name:game.i18n.localize(e.name)})).sort((e,t)=>e.name.localeCompare(t.name))}static applyRollTransformation(e,t,a){let s="",i=t.origin;for(let n of i.effects)try{if(Number(X(n,"flags.dsa5.advancedFunction"))==a)if(!game.user.can("MACRO_SCRIPT"))ui.notifications.warn("You are not allowed to use JavaScript macros.");else try{let r=Object.getPrototypeOf(function(){}).constructor;new r("ef","callMacro","actor","msg","source","options",X(n,"flags.dsa5.args3")).call(this,n,fs,e,s,i,t)}catch(r){ui.notifications.error("There was an error in your macro syntax. See the console (F12) for details"),console.error(r),console.warn(r.stack)}}catch(r){console.warn("Unable to apply advanced effect",r,n)}return t.origin=i,{msg:s,options:t}}static async applyAdvancedFunction(e,t,a,s,i,n=!0){let r="",l=[],c=!1,m=[],d=new Set;for(let p of t){p.origin&&delete p.origin;let f=Number(X(p,"flags.dsa5.specStep"))||0;try{let h=Number(X(p,"flags.dsa5.advancedFunction")),y=Math.min(s.qualityStep||0,6),k=X(p,"flags.dsa5.resistRoll"),D=X(p,"flags.dsa5.isAura");if(D){let v=`${X(p,"flags.dsa5.auraRadius")||1}`.replace(/q(l|s)/i,y),I=(await new Roll(v).evaluate()).total;vn(p,"flags.dsa5.auraRadius",I)}if(k&&!n){let v=k.split(" "),I=`${v.pop()}`;l.push({skill:v.join(" "),mod:Math.round(Roll.safeEval(`${I}`.replace(/q(l|s)/i,y).replaceAll("step",f)))||0,effect:p,target:e,token:e.token?.id})}else{c=!0,d.has(p.name)||d.add(p.name);let v=X(p,"flags.dsa5.onDelayed"),I={duration:{seconds:v},system:{delayed:!0,originalDuration:p.duration}},A=p.changes&&p.changes.length>0||D&&!h;if(h)switch(h){case 1:{let S=`${X(p,"flags.dsa5.args1")}`||"1";/,/.test(S)?S=Number(S.split(",")[y-1]):S=Number(S.replace(game.i18n.localize("CHARAbbrev.QS"),y));let M=X(p,"flags.dsa5.args0"),T=game.i18n.localize(`CONDITION.${M}`),L={name:`${a.name} (${T})`,duration:p.duration};v&>(L,I),await e.addTimedCondition(M,S,!1,!1,L)}break;case 2:if(!game.user.can("MACRO_SCRIPT"))ui.notifications.warn("You are not allowed to use JavaScript macros.");else if(v){let S=na(p);S.changes=[],A=!0,gt(p,{system:{macroEffect:S,sourceActor:i?.id,source:a,initialTestData:{qualityStep:s.qualityStep}}})}else try{let S=Object.getPrototypeOf(async function(){}).constructor;await new S("effect","actor","callMacro","msg","source","actor","sourceActor","testData","qs",X(p,"flags.dsa5.args3")).call(this,p,e,fs,r,a,e,i,s,y)}catch(S){ui.notifications.error("There was an error in your macro syntax. See the console (F12) for details"),console.error(S),console.warn(S.stack)}break;case 3:let j=(X(p,"flags.dsa5.args4")||"").split(",").map(S=>`@Compendium[${S.trim().replace(/(@Compendium\[|\])/)}]`).join(" ");r+=`

${game.i18n.localize("ActiveEffects.advancedFunctions.creature")}:

${j}

`;break}A&&(v&&(delete p.flags.dsa5.onDelayed,gt(p,I)),m.push(p))}}catch(h){console.warn("Unable to apply advanced effect"),console.warn(h),console.warn(p)}}return await e.createEmbeddedDocuments("ActiveEffect",m),{msg:r,resistRolls:l,effectApplied:c,effectNames:Array.from(d)}}static async resistEffect(e){let t=e.currentTarget.dataset,a={token:t.token,actor:t.actor,scene:canvas.id},s=g.getSpeaker(a);if(s){let i=s.items.find(n=>n.type=="skill"&&n.name==t.skill);s.setupSkill(i,{modifier:t.mod},t.token).then(async n=>{n.testData.opposable=!1,((await s.basicTest(n)).result.qualityStep||0)<1&&await this.applyEffect(t.message,t.mode,[a],{effectIds:[t.effect],skipResistRolls:!0})})}else console.warn("Actor not found for resist roll.")}static async applyEffect(e,t,a,s={}){let i=game.messages.get(e),n=i.flags.data.preData.source,r=i.flags.data.postData,l=i.speaker,c=["poison","disease"].includes(n.type);c&&(r.qualityStep=r.successLevel>0?1:2);let m=g.getSpeaker(l)||g.getSpeaker(X(i.flags,"data.preData.extra.speaker"))||game.actors.get(X(i.flags,"data.preData.extra.actor.id")),d=m,p=(await this._parseEffectDuration(n,r,i.flags.data.preData,m)).filter(h=>!X(h,"flags.dsa5.applyToOwner"));c&&(p=p.filter(h=>X(h,"flags.dsa5.successEffect")==r.qualityStep||!X(h,"flags.dsa5.successEffect"))),s.effectIds&&(p=p.filter(h=>s.effectIds.includes(h._id)));let f=[];if(t=="self"?m&&f.push(m):a?f=a.map(h=>g.getSpeaker(h)):game.user.targets.size&&game.user.targets.forEach(h=>{h.actor&&f.push(h.actor)}),game.user.isGM)for(let h of f){let{msg:y,resistRolls:k,effectApplied:D,effectNames:v}=await o.applyAdvancedFunction(h,p,n,r,d,s.skipResistRolls||!1);if(D){let A=`${game.i18n.format("ActiveEffects.appliedEffect",{target:h.token?.name||h.name,source:v.join(", ")})}${y||""}`;await ChatMessage.create(g.chatDataSetup(A))}k.length&&await this.createResistRollMessage(k,e,t)}else game.socket.emit("system.dsa5",{type:"addEffect",payload:{mode:t,id:e,actors:f.map(h=>({token:h.token?h.token.id:void 0,actor:h.id,scene:canvas.scene.id}))}})}static async createResistRollMessage(e,t,a){for(let s of e){let i=await renderTemplate("systems/dsa5/templates/chat/roll/resist-roll.html",{resist:s,id:t,mode:a});await ChatMessage.create(g.chatDataSetup(i))}}static async _parseEffectDuration(e,t,a,s){let i={};for(let m of a.situationalModifiers.filter(d=>d.specAbId))i[m.specAbId]=m.step;let n=Object.keys(i),r=s?s.items.filter(m=>n.includes(m.id)):[],l=e.effects?na(e.effects):[];for(let m of r){let d=na(m).effects;for(let p of d)vn(p,"flags.dsa5.specStep",i[m.id]);l.push(...d)}let c=X(e,"system.duration.value")||"";c=c.replace(/ x /g," * ").replace(game.i18n.localize("CHARAbbrev.QS"),t.qualityStep);try{for(let m of o.effectDurationRegexes)if(m.regEx.test(c)){let d=c.replace(m.regEx,"").trim(),p=await R._stringToRoll(d);if(!isNaN(p))for(let f of l){let h=p*m.seconds,y=X(f,"flags.dsa5.customDuration");if(y){let k=y.split(",")[t.qualityStep-1];k&&k!="-"&&(h=Number(k))}f.duration.seconds=h,f.duration.rounds=f.duration.seconds/5}break}}catch{console.error(`Could not parse duration '${c}' of '${e.name}'`)}return l}dropDownMenu(){let e=game.i18n.localize("MODS.FW"),t=game.i18n.localize("skill"),a=game.i18n.localize("regenerate"),s=game.i18n.localize("MODS.FP"),i=game.i18n.localize("stepValue"),n=game.i18n.localize("MODS.QS"),r=game.i18n.localize("MODS.partChecks"),l=`${game.i18n.localize("LocalizedIDs.perception")} 1`,c=`${game.i18n.localize("LocalizedIDs.wrestle")} 1`,m=`${game.i18n.localize("LocalizedIDs.wrestle")} 1`,d=game.i18n.localize("closeCombatAttacks"),p=game.i18n.localize("rangeCombatAttacks"),f=`${a} (${game.i18n.localize("CHARAbbrev.CR")})`,h=game.i18n.localize("AsPCost"),y=game.i18n.localize("KaPCost"),k=game.i18n.localize("permanentCost"),D=`${game.i18n.localize("Healing")} 1`,v=`${game.i18n.localize("Description")} 1`,I=`${game.i18n.localize("LocalizedIDs.miracle")}`,A=[{name:game.i18n.localize("protection"),val:"system.totalArmor",mode:2,ph:"1"},{name:game.i18n.localize("liturgyArmor"),val:"system.liturgyArmor",mode:2,ph:"1"},{name:`${game.i18n.localize("resistanceModifier")} (${game.i18n.localize("condition")})`,val:"system.resistances.effects",mode:0,ph:"inpain 1"},{name:`${game.i18n.localize("threshold")} (${game.i18n.localize("condition")})`,val:"system.thresholds.effects",mode:0,ph:"inpain 1"},{name:game.i18n.localize("spellArmor"),val:"system.spellArmor",mode:2,ph:"1"},{name:game.i18n.localize("carrycapacity"),val:"system.carryModifier",mode:2,ph:"1"},{name:`${d} - ${game.i18n.localize("CHARAbbrev.AT")}`,val:"system.meleeStats.attack",mode:2,ph:"1"},{name:`${d} - ${game.i18n.localize("CHARAbbrev.PA")}`,val:"system.meleeStats.parry",mode:2,ph:"1"},{name:`${I} - ${game.i18n.localize("CHARAbbrev.AT")}`,val:"system.miracle.attack",mode:2,ph:"1"},{name:`${I} - ${game.i18n.localize("CHARAbbrev.PA")}`,val:"system.miracle.parry",mode:2,ph:"1"},{name:`${d} - ${game.i18n.localize("CHARAbbrev.damage")}`,val:"system.meleeStats.damage",mode:2,ph:"+1d6"},{name:`${d} - ${game.i18n.localize("MODS.defenseMalus")}`,val:"system.meleeStats.defenseMalus",mode:2,ph:"1"},{name:game.i18n.localize("MODS.creatureBonus"),val:"system.creatureBonus",mode:0,ph:`${game.i18n.localize("CONJURATION.elemental")} 1`},{name:`${p} - ${game.i18n.localize("CHARAbbrev.AT")}`,val:"system.rangeStats.attack",mode:2,ph:"1"},{name:`${p} - ${game.i18n.localize("CHARAbbrev.damage")}`,val:"system.rangeStats.damage",mode:2,ph:"+1d6"},{name:`${p} - ${game.i18n.localize("MODS.defenseMalus")}`,val:"system.rangeStats.defenseMalus",mode:2,ph:"1"},{name:`${game.i18n.localize("spell")} - ${game.i18n.localize("CHARAbbrev.damage")}`,val:"system.spellStats.damage",mode:2,ph:"1"},{name:`${game.i18n.localize("liturgy")} - ${game.i18n.localize("CHARAbbrev.damage")}`,val:"system.liturgyStats.damage",mode:2,ph:"1"},{name:y,val:"system.kapModifier",mode:2,ph:"1"},{name:h,val:"system.aspModifier",mode:2,ph:"1"},{name:`${k} ${game.i18n.localize("CHARAbbrev.AsP")}`,val:"system.status.astralenergy.permanentGear",mode:2,ph:"1"},{name:`${k} ${game.i18n.localize("CHARAbbrev.KaP")}`,val:"system.status.astralenergy.permanentGear",mode:2,ph:"1"},{name:`${t} - ${e}`,val:"system.skillModifiers.FW",mode:0,ph:l},{name:`${t} - ${s}`,val:"system.skillModifiers.FP",mode:0,ph:l},{name:`${t} - ${i}`,val:"system.skillModifiers.step",mode:0,ph:l},{name:`${t} - ${n}`,val:"system.skillModifiers.QL",mode:0,ph:l},{name:`${t} - ${r}`,val:"system.skillModifiers.TPM",mode:0,ph:l},{name:`${game.i18n.localize("vulnerability")} - ${game.i18n.localize("combatskill")}`,val:"system.vulnerabilities.combatskill",mode:0,ph:m},{name:`${t} - ${game.i18n.localize("MODS.global")}`,val:"system.skillModifiers.global",mode:0,ph:"1"},{name:`${f} - ${game.i18n.localize("wounds")}`,val:"system.repeatingEffects.startOfRound.wounds",mode:0,ph:"1d6"},{name:`${f} - ${game.i18n.localize("astralenergy")}`,val:"system.repeatingEffects.startOfRound.astralenergy",mode:0,ph:"1d6"},{name:`${f} - ${game.i18n.localize("karmaenergy")}`,val:"system.repeatingEffects.startOfRound.karmaenergy",mode:0,ph:"1d6"},{name:`${a} - ${game.i18n.localize("wounds")}`,val:"system.status.regeneration.LePgearmodifier",mode:2,ph:"1"},{name:`${a} - ${game.i18n.localize("astralenergy")}`,val:"system.status.regeneration.AsPgearmodifier",mode:2,ph:"1"},{name:`${a} - ${game.i18n.localize("karmaenergy")}`,val:"system.status.regeneration.KaPgearmodifier",mode:2,ph:"1"},{name:`${game.i18n.localize("feature")} - ${h}`,val:"system.skillModifiers.feature.AsPCost",mode:0,ph:D},{name:`${game.i18n.localize("advanced")} - ${h}`,val:"system.skillModifiers.conditional.AsPCost",mode:0,ph:v},{name:`${game.i18n.localize("feature")} - ${y}`,val:"system.skillModifiers.feature.KaPCost",mode:0,ph:D},{name:`${game.i18n.localize("advanced")} - ${y}`,val:"system.skillModifiers.conditional.KaPCost",mode:0,ph:v},{name:`${game.i18n.localize("MODS.sight")}`,val:"system.sightModifier.value",mode:2,ph:"-1"},{name:`${game.i18n.localize("MODS.sightMax")}`,val:"system.sightModifier.maxLevel",mode:5,ph:"4"},{name:`${game.i18n.localize("LocalizedIDs.immuneTo")} ${game.i18n.localize("condition")}`,val:"system.immunities",mode:2,ph:"feared"},{name:game.i18n.localize("temperature.heatProtection"),val:"system.temperature.heatProtection",mode:2,ph:"1"},{name:game.i18n.localize("temperature.coldProtection"),val:"system.temperature.coldProtection",mode:2,ph:"1"},{name:`${game.i18n.localize("TYPES.Item.combatskill")} - ${game.i18n.localize("CHAR.ATTACK")}`,val:"system.skillModifiers.combat.attack",mode:0,ph:c},{name:`${game.i18n.localize("TYPES.Item.combatskill")} - ${game.i18n.localize("CHAR.PARRY")}`,val:"system.skillModifiers.combat.parry",mode:0,ph:c},{name:`${game.i18n.localize("TYPES.Item.combatskill")} - ${game.i18n.localize("KTW")}`,val:"system.skillModifiers.combat.step",mode:0,ph:c},{name:`${game.i18n.localize("TYPES.Item.combatskill")} - ${game.i18n.localize("damage")}`,val:"system.skillModifiers.combat.damage",mode:0,ph:c}],j=["liturgy","ceremony","spell","ritual","skill","feature"];for(let S of j){let M=S=="skill"?"skillglobal":S,T=game.i18n.localize(M);A.push({name:`${T} - ${e}`,val:`system.skillModifiers.${S}.FW`,mode:0,ph:l},{name:`${T} - ${s}`,val:`system.skillModifiers.${S}.FP`,mode:0,ph:l},{name:`${T} - ${i}`,val:`system.skillModifiers.${S}.step`,mode:0,ph:l},{name:`${T} - ${n}`,val:`system.skillModifiers.${S}.QL`,mode:0,ph:l},{name:`${T} - ${r}`,val:`system.skillModifiers.${S}.TPM`,mode:0,ph:l})}for(let S of CONFIG.statusEffects)X(S,"flags.dsa5.max")&&A.push({name:game.i18n.localize(S.name),val:`system.condition.${S.id}`,mode:2,ph:1});this.object.parent?.type=="armor"&&A.push({name:game.i18n.localize("CustomActiveEffects.armor.vulnerability"),val:"self.armorVulnerability",mode:0,ph:"Swords 5"});for(let S of Object.keys(b.characteristics))A.push({name:game.i18n.localize(`CHAR.${S.toUpperCase()}`),val:`system.characteristics.${S}.gearmodifier`,mode:2,ph:"1"});for(let S of b.gearModifyableCalculatedAttributes)A.push({name:game.i18n.localize(S),val:`system.status.${S}.gearmodifier`,mode:2,ph:"1"});for(let S of["spell","liturgy","ceremony","ritual"]){let M=g.categoryLocalization(S);for(let T of["soulpower","toughness"])A.push({name:`${game.i18n.localize(T)} (${M})`,val:`system.status.${T}.${S}resist`,mode:2,ph:"1"});for(let T of Object.keys(Se.rollModifiers))A.push({name:`${M} - ${game.i18n.localize(T.replace("Spell",""))}`,val:`system.${S}RollModifiers.${T}.mod`,mode:2,ph:"1"},{name:`${M} - ${game.i18n.localize(T.replace("Spell",""))} - ${game.i18n.localize("advanced")}`,val:`system.${S}RollModifiers.${T}.custom`,mode:0,ph:v})}for(let S of["meleeweapon","rangeweapon"]){let M=g.categoryLocalization(S);for(let T of Object.keys(foundry.utils.flattenObject(fe[`${S}RollModifiers`])))A.push({name:`${M} - ${game.i18n.localize(`MODS.${T.replace(/\.[a-z]+$/,"")}`)}`,val:`system.${S}RollModifiers.${T}`,mode:2,ph:"1"})}if(["meleeweapon","rangeweapon"].includes(this.object.parent?.type)){let S=g.categoryLocalization(this.object.parent.type),M=game.i18n.localize("combatmaneuver"),T=game.i18n.localize("LocalizedIDs.weaponThrow");for(let L of["attack","parry","damage"]){if(L=="parry"&&this.object.parent.type=="rangeweapon")continue;let q=game.i18n.localize(`CHAR.${L.toUpperCase()}`);A.push({name:`${S} - ${q}`,val:`self.situational.${L}`,mode:0,ph:"1"})}A.push({name:`${M} - ${game.i18n.localize("CHAR.attack")}`,val:"self.maneuver.atbonus",mode:0,ph:`${T} 1`},{name:`${M} - ${game.i18n.localize("CHAR.parry")}`,val:"self.maneuver.pabonus",mode:0,ph:`${T} 1`},{name:`${M} - ${game.i18n.localize("CHAR.damage")}`,val:"self.maneuver.tpbonus",mode:0,ph:`${T} 1`})}A=A.sort((S,M)=>S.name.localeCompare(M.name));for(let S of A)(!S.ph||S.mode==null)&&console.warn(S);return A=A.map(S=>``).join(` -`),``}activateListeners(e){super.activateListeners(e);let t=this.dropDownMenu();e.find(".changes-list .effect-change .key").append(t),e.find(".selMenu").select2({width:"element"}).change(a=>{let s=$(a.currentTarget);s.siblings("input").val(s.val());let i=s.closest(".effect-change"),n=s.find("option:selected");i.find(".mode select").val(n.attr("data-mode")),i.find(".value input").attr("placeholder",n.attr("data-ph")),s.trigger("blur")}),e.find(".select2").each((a,s)=>{$(s)[0].style.removeProperty("width")})}};var Le=class extends MeasuredTemplate{static{u(this,"MeasuredTemplateDSA")}#t;#a=0;#e;static async placeTemplateFromChat(e){let t=$(e.currentTarget).parents(".message").attr("data-message-id"),a=game.messages.get(t),s=a.flags.data.preData,i=a.flags.data.postData,r=g.getSpeaker(s.extra.speaker).items.get(s.source._id),l=this.fromItem(r,i.qualityStep,t);l&&l.drawPreview()}static fromItem(e,t,a){let s=e.system.target||{},i=game.dsa5.config.areaTargetTypes[s.type];if(!i||!s.value)return null;let n=Number(Roll.safeEval(`${s.value}`.replace(/(qs|ql)/gi,t)))||1,r={t:i,user:game.user.id,distance:n,direction:0,x:0,y:0,fillColor:game.user.color,flags:{dsa5:{origin:e.uuid,messageId:a}}};switch(i){case"cone":r.angle=Number(s.angle)||CONFIG.MeasuredTemplate.defaults.angle;break;case"rect":r.distance=Math.hypot(n,n),r.width=n,r.direction=45;break;case"ray":r.width=s.width&&Number(Roll.safeEval(`${s.width}`.replace(/(qs|ql)/gi,t)))||canvas.dimensions.distance;break}let l=CONFIG.MeasuredTemplate.documentClass,c=new l(r,{parent:canvas.scene}),m=new this(c);return m.item=e,m}drawPreview(){let e=canvas.activeLayer;return this.draw(),this.layer.activate(),this.layer.preview.addChild(this),this.activatePreviewListeners(e)}activatePreviewListeners(e){return new Promise((t,a)=>{this.#t=e,this.#e={cancel:this._onCancelPlacement.bind(this),confirm:this._onConfirmPlacement.bind(this),move:this._onMovePlacement.bind(this),resolve:t,reject:a,rotate:this._onRotatePlacement.bind(this)},canvas.stage.on("mousemove",this.#e.move),canvas.stage.on("mousedown",this.#e.confirm),canvas.app.view.oncontextmenu=this.#e.cancel,canvas.app.view.onwheel=this.#e.rotate})}async _finishPlacement(e){this.layer._onDragLeftCancel(e),canvas.stage.off("mousemove",this.#e.move),canvas.stage.off("mousedown",this.#e.confirm),canvas.app.view.oncontextmenu=null,canvas.app.view.onwheel=null,this.#t.activate(),await this.actorSheet?.maximize()}_onMovePlacement(e){e.stopPropagation();let t=Date.now();if(t-this.#a<=20)return;let a=e.data.getLocalPosition(this.layer),s=canvas.grid.getSnappedPoint({x:a.x,y:a.y},2);this.document.updateSource({x:s.x,y:s.y}),this.refresh(),this.#a=t}_onRotatePlacement(e){e.ctrlKey&&e.preventDefault(),e.stopPropagation();let t=canvas.grid.type>CONST.GRID_TYPES.SQUARE?30:15,a=e.shiftKey?t:5,s={direction:this.document.direction+a*Math.sign(e.deltaY)};this.document.updateSource(s),this.refresh()}async _onConfirmPlacement(e){await this._finishPlacement(e);let t=canvas.grid.getSnappedPoint({x:this.document.x,y:this.document.y},2);this.document.updateSource(t),this.#e.resolve(canvas.scene.createEmbeddedDocuments("MeasuredTemplate",[this.document.toObject()]))}async _onCancelPlacement(e){await this._finishPlacement(e),this.#e.reject()}};var{getProperty:Ue,duplicate:Sn,mergeObject:An}=foundry.utils,_e=class o{static{u(this,"DSAAura")}static bindAuraHooks(){Hooks.on("DSAauraRefresh",(e,t)=>{g.isActiveGM()&&o.updateTokenAura(e,t)}),g.moduleEnabled("autoanimations")&&Hooks.on("createMeasuredTemplate",async(e,t,a)=>{if(!g.isActiveGM())return;let s=Ue(e,"flags.dsa5.origin");if(!s)return;let i=await fromUuid(s);i&&o.applyTemplateToTargets(e,i)})}static async applyTemplateToTargets(e,t){let a=0;for(;a<1e4&&!e.object?.shape;)await new Promise(s=>setTimeout(s,100)),a+=100;for(let s of canvas.scene.tokens)e.object.shape.contains(s.object.center.x-e.x,s.object.center.y-e.y)&&console.log("Token in template",s.name);if(g.moduleEnabled("autoanimations"))for(let s of t.parent.getActiveTokens())AutomatedAnimations.playAnimation(s,t,{targets:[],workflow:e,isTemplate:!0,templateData:e})}static async onDeleteToken(e){if(g.isActiveGM())for(let t in e.object.auras)await this.removeAura(t)}static async removeAura(e,t){for(let a of canvas.scene.tokens){let s=a.actor.effects.find(i=>Ue(i,"flags.dsa5.templateSource")==e);s&&await a.actor.deleteEmbeddedDocuments("ActiveEffect",[s.id])}}static async refreshAnimations(e){if(game.ready&&g.moduleEnabled("autoanimations")){Sequencer.EffectManager.endEffects({name:"spot*",object:e});for(let t in e.auras){let a=e.auras[t].template,s=a.document.flags.dsa5.effect;AutomatedAnimations.playAnimation(e,s,{targets:[],workflow:a,isTemplate:!0,templateData:a})}e.requiresAnimationRefresh=!1}else game.ready&&(e.requiresAnimationRefresh=!1)}static removeAuras(e,t){for(let a in e.auras)if(!t.includes(a)){if(!e.auras[a])continue;e.auras[a].child.destroy(),delete e.auras[a],g.isActiveGM()&&o.removeAura(a,this),e.requiresAnimationRefresh=!0}}static async drawAuras(e,t=!1){if(!e.actor)return;e.auras||={};let a=[];t&&o.removeAuras(e,a);for(let s of e.actor.auras){let i=await fromUuid(s);if(e.auras[s])a.push(s),Hooks.call("DSAauraRefresh",e.auras[s],e);else{let n=gs.fromItem(i,e,s);if(!n)continue;let r=e.addChild(n);r.draw().then(l=>{l.template.x-=e.document.x,l.template.y-=e.document.y}),e.auras[s]={child:r,template:n},a.push(s),Hooks.call("DSAauraRefresh",e.auras[s],e),e.requiresAnimationRefresh=!0}}o.removeAuras(e,a),e.requiresAnimationRefresh&&o.refreshAnimations(e),o.checkAuraEntered(e.document)}static validAuraTarget(e,t){return t==2||t==e.disposition}static async inAura(e,t,a){for(let s of e.actor.getActiveTokens())for(let i of t.actor.getActiveTokens())if(ne.rangeFinder(s,i).distance<=a.distance)return!0;return!1}static async checkAuraEntered(e){if(!(!g.isActiveGM(!0)||!game.canvas)){for(let t of canvas.scene.tokens)if(!(!t.actor||t.id==e.id)&&Ue(t.actor,"system.merchant.merchantType")!="loot")for(let[a,s]of Object.entries(t.object?.auras||{})){let{auraSource:i,effect:n,isAura:r}=Ue(s.template.document,"flags.dsa5"),l=n.flags?.dsa5?.disposition??2;r&&await o.updateAura(t,e,s.template.document,l,i,n)}}}static async updateTokenAura(e,t){let{child:a,template:s}=e,i=s.document,{auraSource:n,effect:r,isAura:l}=Ue(i,"flags.dsa5"),c=r.flags?.dsa5?.disposition??2;if(!(!l||!game.canvas)){if(!n){await s.delete();return}for(let m of canvas.scene.tokens)!t.isToken&&t.actor?.id==m.actor?.id||await o.updateAura(t,m,i,c,n,r)}}static async updateAura(e,t,a,s,i,n){if(!t.actor)return;let r=await o.inAura(e,t,a),l=t.actor.effects.find(c=>Ue(c,"flags.dsa5.templateSource")==i);if(r&&o.validAuraTarget(t,s)&&!l){let c=Sn(n);An(c,{name:`${n.name} (Aura)`,flags:{dsa5:{templateSource:i}}}),await t.actor.addCondition(c)}else!r&&l&&await t.actor.deleteEmbeddedDocuments("ActiveEffect",[l.id])}},gs=class extends Le{static{u(this,"AuraTemplate")}static fromItem(e,t,a){let s=Number(Ue(e,"flags.dsa5.auraRadius"));if(!s)return;let i=Sn(e);delete i.flags.dsa5.isAura,An(i,{flags:{dsa5:{isAuraEffect:!0}}});let n={t:"circle",_id:e.id,user:game.user.id,distance:s,direction:0,x:t.center.x,y:t.center.y,borderColor:e.flags.dsa5.borderColor,flags:{dsa5:{effect:i,auraSource:a,isAura:!0,borderThickness:e.flags.dsa5.borderThickness||3}}},r=CONFIG.MeasuredTemplate.documentClass,l=new r(n,{parent:canvas.scene});return new this(l)}async _draw(){await super._draw(),this.controlIcon.alpha=0}highlightGrid(){super.highlightGrid(),canvas.interface.grid.getHighlightLayer(this.highlightId).alpha=0}_applyRenderFlags(e){super._applyRenderFlags(e),e.refreshState&&(canvas.interface.grid.getHighlightLayer(this.highlightId).alpha=0)}_refreshTemplate(){let e=this.template.clear();this.document.borderColor!=null&&e.lineStyle(this.document.flags.dsa5.borderThickness,this.document.borderColor,.75).beginFill(0,0),e.drawShape(this.shape)}};var{getProperty:Fe,hasProperty:wr,mergeObject:It}=foundry.utils;function ys(){Hooks.on("preDeleteActiveEffect",(r,l,c)=>{if(l.noHook)return;let m=r.parent;if(m&&m.documentName=="Actor"&&Fe(r,"flags.dsa5.maintain")){let d=[r._id],p=r.name.replace("("+game.i18n.localize("maintainCost")+")","").trim(),f=m.effects.filter(y=>y.name.startsWith(p)&&!y.origin&&y.id!=r._id),h=`

${game.i18n.format("DIALOG.updateMaintainSpell",{actor:m.name})}

`;return f&&(h+=`

${game.i18n.localize("DIALOG.dependentMaintainEffects")}

`,h+=f.map(y=>`
`).join("")),new foundry.applications.api.DialogV2({window:{title:r.name},content:h,buttons:[{action:"yes",icon:"fa fa-check",label:"HELP.pay",default:!0,callback:u(async()=>{if(await m.applyMana(Number(Fe(r,"flags.dsa5.maintain")),Fe(r,"flags.dsa5.payType"))){let k={startTime:game.time.worldTime};game.combat&&(k.startRound=game.combat.round,k.startTurn=game.combat.turn),m.updateEmbeddedDocuments("ActiveEffect",[{_id:r._id,duration:k}])}},"callback")},{action:"delete",icon:"fas fa-trash",label:"delete",callback:u((y,k,D)=>{for(let v of k.form.elements)v.classList.contains("effectRemoveSelector")&&d.push(v.value);m.deleteEmbeddedDocuments("ActiveEffect",d,{noHook:!0})},"callback")}]}).render(!0),!1}}),Hooks.on("updateActor",(r,l)=>{!game.user.isGM&&r.limited&&wr(l,"system.merchant.hidePlayer")&&ui.sidebar.render(!0)}),Hooks.on("deleteActiveEffect",(r,l)=>{if(!g.isActiveGM()||l.noHook)return;let c=r.parent;e(r,l),c&&c.documentName=="Actor"&&(r.statuses.has("bloodrush")?c.addCondition("stunned",2,!1,!1):(r.statuses.has("dead")||r.statuses.has("defeated"))&&game.combat&&c.markDead(!1),Z.onEffectRemove(c,r))}),Hooks.on("preDeleteActiveEffect",(r,l,c)=>{if(!g.isActiveGM()||l.noHook)return;let m=r.parent;if(m&&m.documentName=="Actor"&&(Z.onDelayedEffect(m,r)===!1||Hooks.call("deleteActorActiveEffect",m,r)===!1))return!1}),Hooks.on("dropActorSheetData",(r,l,c)=>{switch(c.data?.type){case"condition":return r.addCondition(c.data.payload.id,1,!1,!1),!1;case"lookup":return l._handleLookup(c.data),!1;case"fullpack":return l._addFullPack(c.data),!1}}),Hooks.on("createActiveEffect",(r,l,c)=>{g.isActiveGM()&&(o(r),t(r))}),Hooks.on("deleteActiveEffect",(r,l,c)=>{g.isActiveGM()&&o(r)}),Hooks.on("updateActiveEffect",(r,l,c)=>{g.isActiveGM()&&(o(r),a(r))});function o(r){if(game.combat&&r.changes.some(l=>/(system\.status\.initiative|system\.characteristics.mu|system\.characteristics\.ge)/.test(l.key))){let l=r.parent.id,c=game.combat.combatants.find(m=>m.actor.id==l);c&&c.recalcInitiative()}}u(o,"checkIniChange");let e=u(async(r,l)=>{if(!r.parent)return;let c=Fe(r,"flags.dsa5.removeMessage");if(!(game.settings.get("dsa5","notifyOnFadingEffects")&&r.parent.documentName=="Actor"||c))return;let m=[];switch(c){case"player":m=game.users.filter(d=>!d.isGM&&r.parent.testUserPermission(d,"OWNER"));break;case"playergm":m=game.users.filter(d=>r.parent.testUserPermission(d,"OWNER"));break;case"players":m=void 0;break;default:m=game.users.filter(d=>d.isGM)}m=m?.map(d=>d.id),ChatMessage.create(g.chatDataSetup(game.i18n.format("CHATNOTIFICATION.fadingEffect",{effect:r.name,actor:r.parent.link}),void 0,void 0,m))},"notifyFadingEffect"),t=u(async r=>{let l=r.parent;l&&(await a(r,{},l),(r.statuses.has("dead")||r.statuses.has("defeated"))&&game.combat&&await l.markDead(!0),r.statuses.has("unconscious")&&await l.addCondition("prone"))},"createEffects"),a=u(async(r,l={},c)=>{if(c||(c=r.parent),!c||c.documentName!="Actor")return;let m=/^system\.condition\./;for(let d of r.changes||[])m.test(d.key)&&d.mode==2&&(l[d.key.split(".")[2]]=Number(d.value));for(let d of Object.keys(l))if(c.system.condition[d]>=4&&(d=="inpain"?await c.initResistPainRoll(r):["encumbered","stunned","feared","confused","trance"].includes(d)?await c.addCondition("incapacitated"):d=="paralysed"?await c.addCondition("rooted"):["drunken","exhaustion"].includes(d)&&(await c.addCondition("stunned"),await c.removeCondition(d))),(Number(l.inpain)||0)>0&&!c.hasCondition("bloodrush")&&c.system.condition.inpain>0&&P.hasVantage(c,game.i18n.localize("LocalizedIDs.frenzy"))){await c.addCondition("bloodrush");let p=g.replaceConditions(`${game.i18n.format("CHATNOTIFICATION.gainsBloodrush",{character:""+c.name+""})}`);ChatMessage.create(g.chatDataSetup(p))}},"countableDependentEffects"),s=u(async(r,l)=>{(game.dsa5.apps.AskForNameDialog||hs).getDialog(r,l)},"askForName"),i=u(async r=>{if(g.isActiveGM()&&game.settings.get("dsa5","randomWeaponSelection")&&r.actor.type!="character"){let l=[],c=[],m=[];for(let p of r.actor.items)p.type=="meleeweapon"&&p.system.worn.value?N.isShield(p)?c.push(p):l.push(p):p.type=="rangeweapon"&&p.system.worn.value&&m.push(p);let d=[];if(l.length){let p=l[Math.floor(Math.random()*l.length)],f=p._id,h;!N.regex2h.test(p.name)&&c.length&&(h=c[Math.floor(Math.random()*c.length)]._id);for(let y of l)y._id!=f&&d.push({_id:y._id,system:{worn:{value:!1}}});for(let y of c)y._id!=h&&d.push({_id:y._id,system:{worn:{value:!1}}})}if(m.length){let p=m[Math.floor(Math.random()*m.length)]._id;for(let f of m)f._id!=p&&d.push({_id:f._id,system:{worn:{value:!1}}})}d.length&&r.actor.updateEmbeddedDocuments("Item",d)}},"randomWeaponSelection"),n=u(async(r,l)=>{if(!g.isActiveGM())return;let c=r.actor;if(c.hasPlayerOwner)return;let m=Number(game.settings.get("dsa5","obfuscateTokenNames"));if(m==0||Fe(c,"merchant.merchantType")=="loot")return;let d=canvas.scene.tokens.filter(f=>f.actor&&f.actor.id===c.id),p=game.i18n.localize("unknown");if([2,4].includes(m)){if(!(r.id||r._id))return;s(r,m);return}if(d.length>0&&m<3){let f=d.length;for(let h of d){let y=h.name.match(/\d+$/);y&&Number(y[0])>f&&(f=Number(y[0]))}p=`${d[0].name.replace(/ \d{1,}$/,"")} ${f+1}`}l.name=p},"obfuscateName");Hooks.on("updateToken",(r,l,c)=>{if(!r.rendered)return;let m={center:r.object.center,elevation:r.elevation};H.updateTokenHook(r,l,c);let d=c.animation?.name||r.object?.animationName;(r.object?.animationContexts.get(d)?.promise||Promise.resolve()).then(()=>{r.object?.drawAuras(),game.dsa5.apps.LightDialog&&game.dsa5.apps.LightDialog.onTokenMove(r,l,c,m)})}),Hooks.on("preDeleteToken",r=>{_e.onDeleteToken(r)}),Hooks.on("deleteToken",r=>{H.deleteTokenHook(r),Ve.hide(r)}),Hooks.on("canvasReady",r=>{for(let l of r.scene.tokens)l.object?.drawAuras()}),Hooks.on("preCreateToken",(r,l,c,m)=>{let d=r.actor;if(!d)return;let p={};Fe(d,"system.merchant.merchantType")=="loot"?It(p,{displayBars:0}):Fe(d,"system.config.autoBar")&&(It(p,{bar1:{attribute:"status.wounds"}}),d.system.isMage?It(p,{bar2:{attribute:"status.astralenergy"}}):d.system.isPriest?It(p,{bar2:{attribute:"status.karmaenergy"}}):It(p,{bar2:{attribute:"tbd"}})),Fe(d,"system.config.autoSize")&&g.calcTokenSize(d,p),n(r,p),r.updateSource(p)}),Hooks.on("createToken",(r,l,c)=>{l.noHook||(n(r,{}),i(r),H.createTokenHook(r,l,c),r.object?.drawAuras())}),Hooks.on("hoverToken",(r,l)=>{game.settings.get("dsa5","showWeaponsOnHover")&&(l?Ve.show(r):Ve.hide(r))})}u(ys,"default");var Ve=class{static{u(this,"TokenHoverHud")}static show(e){if(!game.combat||canvas.hud?.token?.rendered)return;let t=e.actor.items.filter(a=>a.type=="meleeweapon"||a.type=="rangeweapon"?a.system.worn.value:!1);if(t.length){let a=t.map(i=>``).join(" "),s=$(`
${a}
`);$("#hud").append(s),this.position(s,e,t.length)}}static position(e,t,a){let s=t.document,i=canvas.dimensions.size/100,n=a*43,r={width:n,height:42,left:t.center.x-n/2*i,top:t.y+s.height*canvas.dimensions.size+32};i!==1&&(r.transform=`scale(${i})`),e.css(r)}static hide(e){$(`#hoverhud_${e.id}`).remove()}},hs=class o extends foundry.applications.api.DialogV2{static{u(this,"AskForNameDialog")}static DEFAULT_OPTIONS={window:{title:"DSASETTINGS.obfuscateTokenNames"}};static async getDialog(e,t){new o({content:`
`,buttons:[{action:"yes",icon:"fa fa-check",label:"yes",default:!0,callback:u(async(a,s,i)=>{let n=e.id||e._id,r=s.form.elements.name.value;if(t==2){let c=canvas.scene.tokens.filter(m=>m.name===r);if(c.length>0){let m=c.length;for(let d of c){let p=d.name.match(/\d+$/);p&&Number(p[0])>m&&(m=Number(p[0]))}r=`${c[0].name.replace(/ \d{1,}$/,"")} ${m+1}`}}await canvas.scene.tokens.get(n).update({name:r})},"callback")},{action:"unknown",icon:"fa fa-question",label:"unknown",callback:u(async()=>{let a=e.id||e._id;await canvas.scene.tokens.get(a).update({name:game.i18n.localize("unknown")})},"callback")},{action:"cancel",icon:"fas fa-times",label:"cancel"}]}).render(!0)}};var{mergeObject:ht,getProperty:bs,hasProperty:Tr}=foundry.utils,H=class o{static{u(this,"Riding")}static preRenderedUnmountHud='
';static preRenderedMountHud='
';static preRenderedSpeedHud='
';static async createTokenHook(e,t,a){if(!g.isActiveGM())return;let s=e.parent;if(this.isRiding(e.actor)&&s.active){let i=this.getHorse(e.actor);if(!i)return;let n=await i.getTokenDocument({x:e.x,y:e.y,hidden:e.hidden}),r=(await s.createEmbeddedDocuments("Token",[n]))[0],l={"flags.dsa5.horseTokenId":r.id,elevation:(r.elevation??0)+1};ht(l,this.adaptTokenSize(e,r)),await e.update(l),r.actorLink||await e.actor.update({"system.horse.actorLink":!1,"system.horse.token":{scene:s.id,token:r.id}})}}static isRiding(e){return bs(e,"system.horse.isRiding")}static updateTokenHook(e,t,a){if(!g.isActiveGM())return;let s=bs(e,"flags.dsa5.horseTokenId"),i=e.parent;s&&i.active&&(t.x||t.y)&&this.isRiding(e.actor)&&i.updateEmbeddedDocuments("Token",[{_id:s,x:t.x??e.x,y:t.y??e.y}])}static rollLoyalty(e,t={}){let a=this.getHorse(e);if(!a)return;let s=this.getLoyaltyFromHorse(a);if(!s)return ui.notifications.warn(game.i18n.format("DSAError.notFound",{category:g.categoryLocalization("skill"),name:game.i18n.localize("LocalizedIDs.loyalty")}));a.setupSkill(s,t,a.token?.id).then(i=>{a.basicTest(i)})}static async updateRiderSpeed(e,t){if(!canvas?.tokens?.documentCollection)return;let a=e.getActiveTokens().map(s=>s.id);for(let s of Array.from(canvas.tokens.documentCollection))a.includes(s.getFlag("dsa5","horseTokenId"))&&t!=s.actor.system.status.speed.max&&(s.actor.prepareData(),s.actor.sheet.render())}static getLoyaltyFromHorse(e){return e.items.find(t=>t.type=="skill"&&t.name.startsWith(game.i18n.localize("LocalizedIDs.loyalty")))}static activateListeners(e,t){e.find(".riding-toggle").click(()=>this.toggleIsRiding(t)),e.find(".showHorse").click(()=>this.getHorse(t).sheet.render(!0)),e.find(".horse-delete").click(()=>this.clearMount(t)),e.find(".horse-loyalty").click(()=>this.rollLoyalty(t)),e.find('[name="horseSpeedSelector"]').change(async a=>{a.preventDefault();let s=o.getHorse(t);o.setSpeed(s,a.currentTarget.value)})}static async toggleIsRiding(e){await e.update({"system.horse.isRiding":!e.system.horse?.isRiding});let t=[];if(e.system.horse.isRiding){let a=this.getHorse(e),s;for(let i of a.getActiveTokens())t.push({_id:i.document.id,"flags.dsa5.-=horseTokenId":null}),s=i.document.id;for(let i of e.getActiveTokens())t.push({_id:i.document.id,elevation:Math.max(0,(i.document.elevation??0)+1),"flags.dsa5.horseTokenId":s});await this.addRidingCondition(e)}else{for(let a of e.getActiveTokens())t.push({_id:a.document.id,"flags.dsa5.-=horseTokenId":null,elevation:Math.max(0,(a.document.elevation??0)-1)});await this.removeRidingCondition(e)}await canvas.scene.updateEmbeddedDocuments("Token",t,{noHooks:!0})}static getRidingCondition(e){let t=game.i18n.localize("RIDING.riding");return e.effects.find(a=>a.name==t)}static async addRidingCondition(e){this.getRidingCondition(e)||await e.addCondition(this.ridingCondition())}static async removeRidingCondition(e){let t=this.getRidingCondition(e);t&&await e.deleteEmbeddedDocuments("ActiveEffect",[t.id])}static deleteTokenHook(){console.warn("delete riding token hook not implemented")}static getHorse(e,t=!1){let a;return e.system.horse&&(e.system.horse.token&&!e.system.horse.actorLink?a=g.getSpeaker(e.system.horse.token):a=game.actors.get(e.system.horse.actorId),!a&&t&&e.system.horse.isRiding&&(a={name:game.i18n.localize("unknown")})),a}static async unmountHorse(e,t){let a={"flags.dsa5.-=horseTokenId":null,elevation:Math.max(0,(t.elevation??0)-1)},s=t.getFlag("dsa5","horseResized");s&&ht(a,{"flags.dsa5.-=horseResized":null,width:s.width,height:s.height}),await this.clearMount(e),await t.update(a)}static async clearMount(e){await e.update({system:{horse:{isRiding:!1,actorLink:!1,actorId:"","-=token":null}}}),await this.removeRidingCondition(e)}static ridingCondition(){return{name:game.i18n.localize("RIDING.riding"),img:"systems/dsa5/icons/thirdparty/horse-head.svg",changes:[{key:"system.status.dodge.gearmodifier",mode:2,value:-2}],flags:{dsa5:{description:game.i18n.localize("RIDING.ridingDescription")}}}}static async setHorse(e,t,a){if(t.compendium){if(!await foundry.applications.api.DialogV2.confirm({window:{title:"DSAError.horseMustBeImported"},content:`

${game.i18n.localize("DSAError.horseMustBeImportedText")}

`,rejectClose:!1}))return;let n=await g.getFolderForType("Actor",null,game.i18n.localize("RIDING.horse")),r=t.toObject();r.folder=n.id,t=await Actor.implementation.create(r)}a&&!t.token&&(t=(await canvas.scene.createEmbeddedDocuments("Token",[await t.getTokenDocument({x:a.x,y:a.y})]))[0].actor);let s={system:{horse:{isRiding:!0,actorLink:t.prototypeToken.actorLink,actorId:t.id}}};if(!t.prototypeToken.actorLink&&t.token&&ht(s,{system:{horse:{token:{scene:canvas.scene.id,token:t.token.id}}}}),await e.update(s),t.isToken){let i=this.adaptTokenSize(a,t.token),n=e.getActiveTokens().map(r=>ht({_id:r.id,"flags.dsa5.horseTokenId":t.token.id,x:t.token.x,y:t.token.y},i)).concat({_id:t.token.id,"flags.dsa5.-=horseTokenId":null});await canvas.scene.updateEmbeddedDocuments("Token",n,{noHooks:!0})}await this.addRidingCondition(e)}static adaptTokenSize(e,t){return e.width>=t.width?{width:.7*t.width,height:.7*t.height,"flags.dsa5.horseResized":{width:e.width,height:e.height}}:{}}static async mountHorse(e){let t=canvas.tokens.controlled.find(n=>n.document.id!=e.id),a=e.parent,s={system:{horse:{isRiding:!0,actorLink:t.actorLink,actorId:t.actor.id}}};t.actorLink||ht(s,{system:{horse:{token:{scene:a.id,token:t.id}}}});let i={_id:e.id,"flags.dsa5.horseTokenId":t.id,x:t.x,y:t.y,elevation:(t.document.elevation??0)+1};ht(i,this.adaptTokenSize(e.document,t.document)),await e.actor.update(s),await canvas.scene.updateEmbeddedDocuments("Token",[i,{_id:t.id,"flags.dsa5.-=horseTokenId":null}],{noHooks:!0}),await this.addRidingCondition(e.actor)}static speedKeys={0:{key:"system.status.speed.multiplier",mode:5,value:0},"-4":{key:"system.status.speed.initial",mode:5,value:4},"-5000":{key:"system.status.speed.multiplier",mode:5,value:.66},"-8":{key:"system.status.speed.multiplier",mode:5,value:1}};static getHorseSpeed(e){return e.effects.find(t=>bs(t,"flags.dsa5.horseSpeed"))?.flags.dsa5.horseSpeed||0}static horseSpeedModifier(e){let t=this.getHorseSpeed(e);return Object.keys(this.speedKeys).map(a=>Number(a)).indexOf(Number(t))}static increaseSpeed(e){let t=this.getHorseSpeed(e),a=Math.min(3,Object.keys(this.speedKeys).map(s=>Number(s)).indexOf(t)+1);this.setSpeed(e,Object.keys(this.speedKeys).map(s=>Number(s))[a])}static decreaseSpeed(e){let t=this.getHorseSpeed(e),a=Math.max(0,Object.keys(this.speedKeys).map(s=>Number(s)).indexOf(t)-1);this.setSpeed(e,Object.keys(this.speedKeys).map(s=>Number(s))[a])}static async setSpeed(e,t){await e.deleteEmbeddedDocuments("ActiveEffect",e.effects.filter(a=>Tr(a,"flags.dsa5.horseSpeed")).map(a=>a.id)),await e.addCondition({name:game.i18n.localize("speed")+": "+game.i18n.localize(`RIDING.speeds.${t}`),icon:"systems/dsa5/icons/thirdparty/horse-head.svg",changes:[this.speedKeys[t]],flags:{dsa5:{description:game.i18n.localize(`RIDING.speed.${t}`),horseSpeed:t}}})}static renderTokenHUD(e,t,a){let s=e.object.actor;if(canvas.tokens.controlled.length==2)t.find(".col.left").prepend(this.preRenderedMountHud),t.find('.control-icon[data-action="ride"]').click(()=>this.mountHorse(e.object));else if(this.isRiding(s)){t.find(".col.left").prepend(this.preRenderedUnmountHud);let i=t.find('.control-icon[data-action="ride"]');i.click(()=>{this.unmountHorse(s,e.object.document),i.remove()});let n=this.getHorse(s);t.find(".col.right").prepend(this.preRenderedSpeedHud),t.find('.control-icon[data-action="rideIncrease"]').click(()=>this.increaseSpeed(n)),t.find('.control-icon[data-action="rideDecrease"]').click(()=>this.decreaseSpeed(n))}}};var Q=class o{static{u(this,"DSA5Payment")}static async payMoney(e,t,a=!1,s=!0){let i=await o.canPay(e,t,a);return i.success&&await o._updateMoney(e,i.actorsMoney.money,i.actorsMoney.sum-i.money,s),!a&&i.msg!=""&&ChatMessage.create(g.chatDataSetup(`

${i.msg}

`,"roll")),i.success}static async canPay(e,t,a){let s=this._getPaymoney(t),i={success:!1,msg:"",money:s};return s&&(i.actorsMoney=this._actorsMoney(e),i.actorsMoney.sum>=s?(i.msg=game.i18n.format("PAYMENT.pay",{actor:e.name,amount:await o._moneyToString(s)}),i.success=!0):(i.msg=game.i18n.format("PAYMENT.cannotpay",{actor:e.name,amount:await o._moneyToString(s)}),a&&ui.notifications.info(i.msg))),i}static async getMoney(e,t,a=!1,s=!0){let i=this._getPaidmoney(t);if(i){let n=this._actorsMoney(e);await o._updateMoney(e,n.money,n.sum+i,s);let r=`

${game.i18n.format("PAYMENT.getPaid",{actor:e.name,amount:await o._moneyToString(i)})}

`;return a||ChatMessage.create(g.chatDataSetup(r,"roll")),!0}}static async createGetPaidChatMessage(e,t=void 0){let a=this._getPaidmoney(e);if(a){let s=t?` (${t})`:"",i=`

${game.i18n.localize("PAYMENT.wage")}

${game.i18n.format("PAYMENT.getPaidSum",{amount:await o._moneyToString(a)})}${s}

`;ChatMessage.create(g.chatDataSetup(i,"roll"))}}static async createPayChatMessage(e,t=void 0){let a=this._getPaymoney(e);if(a){let s=t?` (${t})`:"",i=`

${game.i18n.localize("PAYMENT.bill")}

${game.i18n.format("PAYMENT.paySum",{amount:await o._moneyToString(a)})}${s}

`;ChatMessage.create(g.chatDataSetup(i,"roll"))}}static _getPaidmoney(e){let t=this._parseMoneyString(e);if(!t){let a=`

${game.i18n.localize("PAYMENT.error")}

${game.i18n.localize("PAYMENT.getPaidexample")}

`;return ChatMessage.create(g.chatDataSetup(a,"roll")),!1}return t}static _getPaymoney(e){let t=this._parseMoneyString(e);if(!t){let a=`

${game.i18n.localize("PAYMENT.error")}

${game.i18n.localize("PAYMENT.payexample")}

`;return ChatMessage.create(g.chatDataSetup(a,"roll")),!1}return t}static async handlePayAction(e,t,a,s=void 0){if(game.user.isGM&&!s){ui.notifications.info("PAYMENT.onlyActors",{localize:!0});return}s?K.playMoneySound(!0):s=game.user.character;let i=!1;s&&t?i=await o.payMoney(s,a):s&&!t?i=await o.getMoney(s,a):ui.notifications.info("PAYMENT.onlyActors",{localize:!0}),i&&e&&(e.fadeOut(),game.socket.emit("system.dsa5",{type:"updateMsg",payload:{id:e.closest(".message").attr("data-message-id"),updateData:{[`flags.dsa5.userHidden.${game.user.id}`]:!0}}}))}static async _moneyToCoins(e,t=void 0){let a=(t||(await g.allMoneyItems()).filter(n=>n.system.subcategory!=1)).sort((n,r)=>r.system.price.value-n.system.price.value),s=[],i=e;for(let n of a){let r=Math.floor(i/n.system.price.value);s.push({name:n.name,amount:r,img:n.img}),i-=r*n.system.price.value}return i>.001&&(s[s.length-1].amount+=1),s}static _parseMoneyString(e){let t=e.replace(",",".").match(/\d{1,}(\.\d{1,3}|,\d{1,3})?/);return t?Number(t[0]):!1}static _actorsMoney(e){let t=e.items.filter(a=>a.type=="money"&&a.system.subcategory!=1);return{money:t,sum:t.reduce((a,s)=>a+Number(s.system.quantity.value)*Number(s.system.price.value),0)}}static async _replaceMoney(e){let t=o._actorsMoney(e),a=await g.allMoneyItems();await e.deleteEmbeddedDocuments("Item",t.money.map(s=>s.id),{render:!1}),await e.createEmbeddedDocuments("Item",a,{render:!1}),await o._updateMoney(e,o._actorsMoney(e).money,t.sum)}static async _updateMoney(e,t,a,s=!0){let i=await o._moneyToCoins(a,t),n=[];for(let r of t){let l=i.find(c=>c.name==r.name);l!=null&&n.push({_id:r.id,"system.quantity.value":l.amount})}await e.updateEmbeddedDocuments("Item",n,{render:s})}static async _moneyToString(e){let t=await o._moneyToCoins(e),a=[];for(let s of t)s.amount>0&&a.push(`${s.amount} `);return a.join(", ")}static async chatListeners(e){e.on("click",".payButton",t=>{let a=$(t.currentTarget);o.handlePayAction(a,Number(a.attr("data-pay"))!=1,a.attr("data-amount")),K.playMoneySound()})}};var{getProperty:Cn,setProperty:ks,getType:Sr}=foundry.utils,Me=class o extends ActiveEffect{static{u(this,"DSAActiveEffect")}static itemChangeRegex=/^@/;static deprecatedDataRegex=/^data\./;apply(e,t){if(o.itemChangeRegex.test(t.key)){let a=this._getModifiedItems(e,t);for(let s of a.items){let i=foundry.utils.flattenObject(s.overrides||{});i[a.key]=Number.isNumeric(s.value)?Number(a.value):a.value;let n={...t,key:a.key,value:a.value};super.apply(s,n),s.overrides=foundry.utils.expandObject(i)}}else{if(t.key.startsWith("data.")){let a=game.i18n.format("DSAError.ActiveEffectDataChange",{name:e.name});console.error(a),t.key=t.key.replace(o.deprecatedDataRegex,"system.")}return super.apply(e,t)}}static realyRealyEnabled(e){return!(e.disabled||!e.transfer||e.system.delayed||!game.settings.get("dsa5","enableWeaponAdvantages")&&e.system.equipmentAdvantage)}static async _onCreateOperation(e,t,a){for(let s of e)s.parent.documentName=="Actor"&&await O.postUpdateConditions(s.parent);return super._onCreateOperation(e,t,a)}static async _onUpdateOperation(e,t,a){for(let s of e)s.parent.documentName=="Actor"&&await O.postUpdateConditions(s.parent);return super._onUpdateOperation(e,t,a)}static async _onDeleteOperation(e,t,a){for(let s of e)s.parent.documentName=="Actor"&&await O.postUpdateConditions(s.parent);return super._onDeleteOperation(e,t,a)}isVisibleEffect(){return!this.disabled&&!this.notApplicable&&(game.user.isGM||!this.getFlag("dsa5","hidePlayers"))&&!this.getFlag("dsa5","hideOnToken")}_displayScrollingStatus(e){let t=["dead"];(game.user.isGM||this.target?.testUserPermission(game.user,"OBSERVER")||!game.settings.get("dsa5","hideEffects")?this.isVisibleEffect():t.some(i=>this.statuses.has(i)))&&super._displayScrollingStatus(e)}_getModifiedItems(e,t){let a=t.key.split("."),s=a.shift();s=s.replace("@","").toLowerCase();let i=a.shift(),n=a.join("."),r=t.value;return{items:i=="self"?[this.parent]:e?.items?.filter(c=>c.type==s&&(c.name==i||c.id==i))||[],key:n,value:r}}async _preUpdate(e,t,a){await super._preUpdate(e,t,a),this._clearModifiedItems()}_clearModifiedItems(){if(this.parent instanceof CONFIG.Actor.documentClass){for(let e of this.changes)if(o.itemChangeRegex.test(e.key)){let t=this._getModifiedItems(this.parent,e);for(let a of t.items){let s=foundry.utils.flattenObject(a.overrides||{}),i=t.key;delete s[i];let n=Cn(a._source,i);ks(a,i,n),a.overrides=foundry.utils.expandObject(s),a.sheet?.rendered&&a.sheet.render(!0)}}}}async _preDelete(e,t){super._preDelete(e,t),this._clearModifiedItems()}},Ar=u((o,e)=>{let t=Cn(o,e.key)||null;t==null&&/^system\.(vulnerabilities|resistances)/.test(e.key)&&(t=[],ks(o,e.key,t));let a=Sr(t),s=null;switch(a){case"Array":let i=[],n=e.effect.name;for(let r of`${e.value}`.split(/[;,]+/)){let l=r.split(" "),c=l.pop(),m=l.join(" ");i.push({source:n,value:c,target:m,item:e.effect.parent?.name})}s=t.concat(i)}return s!==null&&ks(o,e.key,s),s},"applyCustomEffect");Hooks.on("applyActiveEffect",(o,e)=>Ar(o,e));var{getProperty:se,mergeObject:ue,duplicate:He}=foundry.utils,C=class o extends Item{static{u(this,"Itemdsa5")}static DEFAULT_ICON="systems/dsa5/icons/blank.webp";static defaultImages={advantage:"systems/dsa5/icons/categories/Vorteil.webp",disadvantage:"systems/dsa5/icons/categories/Nachteil.webp",armor:"systems/dsa5/icons/categories/Armor.webp",meleeweapon:"systems/dsa5/icons/categories/Meleeweapon.webp",rangeweapon:"systems/dsa5/icons/categories/Rangeweapon.webp",equipment:"systems/dsa5/icons/categories/Equipment.webp",consumable:"systems/dsa5/icons/categories/consumable.webp",liturgy:"systems/dsa5/icons/categories/Liturgy.webp",spell:"systems/dsa5/icons/categories/Spell.webp",ammunition:"systems/dsa5/icons/categories/Munition.webp",career:"systems/dsa5/icons/categories/Career.webp",magictrick:"systems/dsa5/icons/categories/Spelltrick.webp",blessing:"systems/dsa5/icons/categories/Blessing.webp",combatskill:"systems/dsa5/icons/categories/Combat_Skill.webp",skill:"systems/dsa5/icons/categories/Skill.webp",Geweihte:"systems/dsa5/icons/categories/Geweihte.webp",Weltliche:"systems/dsa5/icons/categories/Weltliche.webp",Zauberer:"systems/dsa5/icons/categories/Zauberer.webp",ritual:"systems/dsa5/icons/categories/ritual.webp",ceremony:"systems/dsa5/icons/categories/ceremony.webp",abilityclerical:"systems/dsa5/icons/categories/ability_clerical.webp",abilityCombat:"systems/dsa5/icons/categories/ability_combat.webp",abilityfatePoints:"systems/dsa5/icons/categories/ability_fate_points.webp",abilitygeneral:"systems/dsa5/icons/categories/ability_general.webp",specialability:"systems/dsa5/icons/categories/ability_general.webp",abilitymagical:"systems/dsa5/icons/categories/ability_magical.webp",abilitylanguage:"systems/dsa5/icons/categories/Ability_Language.webp",abilitystaff:"systems/dsa5/icons/categories/ability_staff.webp",abilityceremonial:"systems/dsa5/icons/categories/ability_ceremonial.webp",abilityanimal:"systems/dsa5/icons/categories/ability_animal.webp",trait:"systems/dsa5/icons/categories/trait.webp",Tiere:"systems/dsa5/icons/categories/Tiere.webp",aggregatedTest:"systems/dsa5/icons/categories/aggregated_test.webp",poison:"systems/dsa5/icons/categories/poison.webp",disease:"systems/dsa5/icons/categories/disease.webp",spellextension:"systems/dsa5/icons/categories/Spellextension.webp",species:"icons/environment/people/group.webp",application:"systems/dsa5/icons/categories/Skill.webp",trick:"systems/dsa5/icons/categories/Tiere.webp",disadvantageanimal:"systems/dsa5/icons/categories/NachteilAnimal.webp",advantageanimal:"systems/dsa5/icons/categories/VorteilAnimal.webp",diseaseanimal:"systems/dsa5/icons/categories/diseaseAnimal.webp",effectwrapper:"icons/svg/aura.svg",liturgyTalisman:"systems/dsa5/icons/categories/LiturgieTalisman.webp",plant:"systems/dsa5/icons/categories/plant.webp",magicalsign:"systems/dsa5/icons/categories/magicalsign.webp",abilitypact:"systems/dsa5/icons/categories/ability_pact.webp",demonmark:"systems/dsa5/icons/categories/ability_pact.webp",patron:"systems/dsa5/icons/categories/ability_pact.webp",information:"systems/dsa5/icons/categories/DSA-Auge.webp",essence:"systems/dsa5/icons/categories/wesenszug.webp",imprint:"systems/dsa5/icons/categories/praegung.webp",book:"systems/dsa5/icons/backgrounds/library.webp",trap:"systems/dsa5/icons/categories/trap.webp"};static defaultIcon(e){(!e.img||e.img=="")&&(e.type in this.defaultImages?e.img=this.defaultImages[e.type]:e.type.startsWith("ability")?e.img=this.defaultImages.specialability:e.img=o.DEFAULT_ICON)}static async create(e,t){if(Array.isArray(e))for(let a of e)this.defaultIcon(a);else this.defaultIcon(e);return await super.create(e,t)}static getSpecAbModifiers(e,t){let a=[];for(let s of e.find(".specAbs")){let i=Number($(s).attr("data-step"));if(i>0){let n=t=="attack"?$(s).attr("data-atbonus"):$(s).attr("data-pabonus"),r=n.split(",").reduce((l,c)=>l+Number(c),0);a.push({name:$(s).find("a").text(),value:isNaN(r)?Number(n.replace("*","")):Number(r)*i,damageBonus:$(s).attr("data-tpbonus"),dmmalus:$(s).attr("data-dmmalus")*i,step:i,specAbId:$(s).attr("data-id"),type:/^\*/.test(n)?"*":void 0})}}return a}async _buildEmbedHTML(e,t={}){let a=`systems/dsa5/templates/items/browse/${this.type}.html`,s=await renderTemplate(a,{document:this,isGM:game.user.isGM,...await this.sheet.getData(),...t});return $(s)[0]}static setupSubClasses(){game.dsa5.config.ItemSubclasses={ritual:Hs,spell:Et,liturgy:oa,ceremony:Os,advantage:la,disadvantage:la,aggregatedTest:Ds,trait:Vs,blessing:$s,magictrick:ra,specialability:Bs,disease:Rs,poison:_s,armor:Es,money:Cs,rangeweapon:Fs,meleeweapon:Ls,ammunition:Ms,equipment:Ps,combatskill:xs,skill:Gs,application:js,consumable:zs,spellextension:Ws,species:qs,effectwrapper:Is,plant:ws,magicalsign:vs,patron:As,demonmark:Ts,information:Ns,book:Us,trap:Ss}}static buildSpeaker(e,t){return{token:t,actor:e?.id,scene:canvas.scene?.id}}static parseValueType(e,t){let a="";return/^\*/.test(t)&&(a="*",t=t.substring(1).replace(",",".")),{name:e,value:Number(t),type:a}}async addCondition(e,t=1,a=!1,s=!0){return await z.addCondition(this,e,t,a,s)}async removeCondition(e,t=1,a=!0,s=!1){return z.removeCondition(this,e,t,a,s)}hasCondition(e){return z.hasCondition(this,e)}static getMiracleModifiers(e,t,a,s){let i=new RegExp(`${game.i18n.localize("combatskill")} `,"gi"),n=(se(e,"system.happyTalents.value")||"").split(/;|,/).map(l=>l.replace(i,"").trim()),r=[];if(n.includes(t.name)){let l=e.system.status.karmaenergy.value,c=se(e,`system.miracle.${s}`)||0;if(l<4)return[];r.push({name:game.i18n.localize("LocalizedIDs.miracle"),value:2+c,type:a,selected:!1});let m=game.i18n.localize("LocalizedIDs.miracleMight");l>=6&&F.hasAbility(e,m)&&r.push({name:m,value:3+c,type:a,selected:!1})}return r}static getSkZkModifier(e,t){let a=[],s=[],i=["spell","liturgy","ceremony","ritual"].includes(t.type)&&t.system.effectFormula.value.trim()=="";game.user.targets.size&&game.user.targets.forEach(n=>{if(n.actor){let r=0;i&&(r=x.detectCreatureType(n.actor).reduce((d,p)=>d+p.spellResistanceModifier(n.actor),0));let l=se(n.actor,`system.status.soulpower.${t.type}resist`)||0,c=se(n.actor,`system.status.toughness.${t.type}resist`)||0;a.push((n.actor.system.status.soulpower.max+l)*-1-r),s.push((n.actor.system.status.toughness.max+c)*-1-r)}}),ue(e,{SKModifier:a.length>0?Math.min(...a):0,ZKModifier:s.length>0?Math.min(...s):0})}static async _onCreateOperation(e,t,a){for(let s of e)s.actor&&await O.postUpdateConditions(s.actor);return super._onCreateOperation(e,t,a)}static async _onUpdateOperation(e,t,a){for(let s of e)s.actor&&await O.postUpdateConditions(s.actor);return super._onUpdateOperation(e,t,a)}static async _onDeleteOperation(e,t,a){for(let s of e)s.actor&&await O.postUpdateConditions(s.actor);return super._onDeleteOperation(e,t,a)}static parseEffect(e,t){let a={},s=new RegExp(game.i18n.localize("CHARAbbrev.GS"),"gi");for(let i of e.split(/,|;/).map(n=>n.trim())){let n=i.replace(/(\s+)/g," ").trim().split(" ");if(n[0]=n[0].replace(s,t.system.status.speed.max),n.length==2&&(!isNaN(n[0])||/(=)?[+-]\d([+-]\d)?/.test(n[0])||/(=)?\d[dDwW]\d/.test(n[0])||/=\d+/.test(n[0])||/\*\d(\.\d)*/.test(n[0]))){let r=n[1].toLowerCase();a[r]==null&&(a[r]=[]),a[r].push(n[0])}}return a}static getDefenseMalus(e,t){let a=!1;if(t.flags.oppose){let s=game.messages.get(t.flags.oppose.messageId),i=s.flags.data.preData;a=!(se(i,"source.type")=="meleeweapon"||se(i,"source.system.traitType.value")=="meleeAttack");let n=/ \[(-)?\d{1,}\]/;for(let r of i.situationalModifiers)r.dmmalus!=null&&r.dmmalus!=0?e.push({name:`${game.i18n.localize("MODS.defenseMalus")} - ${r.name.replace(n,"")}`,value:r.dmmalus,selected:!0}):r.type=="defenseMalus"&&r.value!=0&&e.push({name:r.name.replace(n,""),value:r.value,selected:!0});s.flags.data.postData.halfDefense&&e.push({name:`${game.i18n.localize("MODS.defenseMalus")} - ${game.i18n.localize("halfDefenseShort")}`,value:.5,type:"*",selected:!0})}return a}static changeChars(e,t,a,s){e.system.characteristic1.value=t,e.system.characteristic2.value=a,e.system.characteristic3.value=s}static specAbsDataset(e,t,a,s="effect.value"){let i=a=="parry",n=i?["pa"]:["at","tp","dm"],r=n.reduce((m,d)=>(m[d]=game.i18n.localize(`LocalizedAbilityModifiers.${d}`),m),{}),l=[],c=i?(m,d)=>m.pa!=0:(m,d)=>m.at!=0||m.tp!=0||m.dm!=0||d.effects.size>0;for(let m of e){let d=o.parseEffect(se(m.system,s),t),p=["","2","3"].filter(h=>se(m,`system.effect.value${h}`)).length,f=n.reduce((h,y)=>(h[y]=d[r[y]]||[0],h),{});if(c(f,m)){let h=game.i18n.localize(b.combatSkillSubCategories[m.system.category.sub]);l.push({name:m.name,atbonus:f.at||[0],pabonus:f.pa||[0],tpbonus:f.tp||[0],dmmalus:f.dm||[0],steps:m.system.step.value,category:{id:m.system.category.sub,css:`ab_${m.system.category.sub}`,name:h},id:m.id,actor:t.id,variantCount:p})}}return l}static buildCombatSpecAbs(e,t,a,s,i){let n=u(()=>!0,"searchFilter");a&&(a.push(game.i18n.localize("LocalizedIDs.all")),a=a.map(f=>f.toLowerCase()),n=u((f,h)=>f.system.list.value.split(/;|,/).map(y=>y.trim().toLowerCase()).some(y=>h.includes(y.replace(/ \([a-zA-Z äüöÄÖÜ]*\)/,""))),"searchFilter"));let r=game.combat?.isBrawling?()=>!0:f=>Number(f.system.category.sub)!=5,l=new Set([]),c=new Set([]),m={};for(let f of i.effects||[])if(Me.realyRealyEnabled(f)){for(let h of f.changes)if(h.key.startsWith("self.maneuver.")){let y=g.parseAbilityString(h.value);if(/-$/.test(y.name))c.add(y.name.replace(/-$/,"").trim());else if(/\+$/.test(y.name))l.add(y.name.replace(/\+$/,"").trim());else{let k=h.key.split(".")[2];m[y.name]||(m[y.name]={}),m[y.name][k]||(m[y.name][k]=0),m[y.name][k]+=y.step}}}let d=e.items.filter(f=>f.type=="specialability"&&t.includes(f.system.category.value)&&f.system.effect.value!=""&&(n(f,a)||l.has(f.name))&&r(f)&&!c.has(f.name)),p=this.specAbsDataset(d,e,s);for(let f of p)if(m[f.name])for(let h of Object.keys(m[f.name]))f[h].push(m[f.name][h]);return p}static getCombatSkillModifier(e,t,a){if(t.type=="trait")return;let s=e.items.find(i=>i.type=="combatskill"&&i.name==t.system.combatskill.value);for(let i of s.effects)for(let n of i.changes)switch(n.key){case"system.rangeStats.defenseMalus":case"system.meleeStats.defenseMalus":a.push({name:`${s.name} - ${game.i18n.localize("MODS.defenseMalus")}`,value:n.value*-1,type:"defenseMalus",selected:!0});break}}static attackStatEffect(e,t){t!=0&&(t=isNaN(t)?t:Number(t),e.push({name:game.i18n.localize("statuseffects"),value:t,selected:!0}))}static getTargetSizeAndModifier(e,t,a){let s="average";return game.user.targets.forEach(i=>{if(i.actor){let n=se(i.actor,"system.status.size.value");n&&(s=n),x.addCreatureTypeModifiers(i.actor,t,a,e),this.checkDuplicatus(e,i.actor,a)}}),s}static checkDuplicatus(e,t,a){let s=se(t,"system.extra.duplicatus"),i=x.detectCreatureType(e).some(n=>n.spellImmunities.includes("Illusion"));s&&a.push({name:`Duplicatus - ${game.i18n.localize("doppelganger")}`,value:s,selected:!i,type:"effect",source:"Duplicatus"})}static prepareRangeAttack(e,t,a,s,i,n,r=void 0){e.push(...P.getVantageAsModifier(t,game.i18n.localize("LocalizedIDs.restrictedSenseSight"),-2)),this.getCombatSkillModifier(t,s,e);let l=this.getTargetSizeAndModifier(t,s,e),c=Number(t.system.rangeStats.defenseMalus)*-1;c!=0&&e.push({name:`${game.i18n.localize("statuseffects")} - ${game.i18n.localize("MODS.defenseMalus")}`,value:c,type:"defenseMalus",selected:!0});let m=new Set(["short","medium","long","rangesense","extreme"]);m.delete(P.hasVantage(t,game.i18n.localize("LocalizedIDs.senseOfRange"))?"long":"rangesense"),F.hasAbility(t,game.i18n.localize("LocalizedIDs.extremeShot"))||m.delete("extreme");let d=F.hasAbility(t,game.i18n.localize("LocalizedIDs.drivingArcher")),p=F.hasAbility(t,game.i18n.localize("LocalizedIDs.mountedArcher")),f;p&&H.isRiding(t)?f=He(b.mountedRangeOptionsSpecAb):d?f=He(b.drivingArcherOptions):f=He(b.mountedRangeOptions);let h={};for(let y of Object.keys(f))h[`${game.i18n.localize("mountedRangeOptions."+y)} (${f[y]})`]=f[y];this.swarmModifiers(t,"attack",e),ue(a,{rangeOptions:m,rangeDistance:Array.from(m)[ne.distanceModifier(game.canvas.tokens.get(i),s,r)],visionOptions:b.rangeVision,mountedOptions:h,shooterMovementOptions:b.shooterMovementOptions,targetMovementOptions:b.targetMomevementOptions,targetSize:l,combatSpecAbs:n})}static swarmModifiers(e,t,a){e.system.swarm?.count>1&&(t=="attack"?a.push({name:`${game.i18n.localize("swarm.name")} - ${game.i18n.localize("MODS.defenseMalus")}`,value:e.system.swarm.parry,type:"defenseMalus",selected:!0},{name:`${game.i18n.localize("swarm.name")} - ${game.i18n.localize("CHARAbbrev.AT")}`,value:e.system.swarm.attack,selected:!0},{name:`${game.i18n.localize("swarm.name")} - ${game.i18n.localize("CHARAbbrev.damage")}`,value:e.system.swarm.damage,type:"dmg",selected:!0}):a.push({name:`${game.i18n.localize("swarm.name")} - ${game.i18n.localize("CHARAbbrev.PA")}`,value:e.system.swarm.parry,selected:!0}))}static prepareMeleeAttack(e,t,a,s,i,n){let r="short";game.user.targets.forEach(m=>{if(m.actor){for(let d of m.actor.items)if((d.type=="meleeweapon"&&d.system.worn.value||d.type=="trait"&&d.system.traitType.value=="meleeAttack"&&d.system.pa)&&(b.meleeRangesArray.indexOf(d.system.reach.value)>b.meleeRangesArray.indexOf(r)&&(r=d.system.reach.value),r=="long"))break}});let l=this.getTargetSizeAndModifier(t,s,e);this.getCombatSkillModifier(t,s,e);let c=Number(t.system.meleeStats.defenseMalus)*-1;c!=0&&e.push({name:`${game.i18n.localize("statuseffects")} - ${game.i18n.localize("MODS.defenseMalus")}`,value:c,type:"defenseMalus",selected:!0}),this.swarmModifiers(t,"attack",e),ue(a,{visionOptions:b.meleeRangeVision(a.mode),weaponSizes:b.meleeRanges,melee:!0,showAttack:!0,targetWeaponSize:r,combatSpecAbs:i,meleeSizeOptions:b.meleeSizeCategories,targetSize:l,constricted:t.hasCondition("constricted"),wrongHandDisabled:n,offHand:!n&&se(s,"system.worn.offHand")})}static prepareMeleeParry(e,t,a,s,i,n){let r=o.getDefenseMalus(e,t);this.swarmModifiers(t,"parry",e),ue(a,{visionOptions:b.meleeRangeVision(a.mode),showDefense:!0,isRangeDefense:r,wrongHandDisabled:n&&se(s,"system.worn.offHand"),offHand:!n&&se(s,"system.worn.offHand")&&!N.isShield(s),melee:!0,combatSpecAbs:i,constricted:t.hasCondition("constricted")})}static _chatLineHelper(e,t){return`${game.i18n.localize(e)}: ${t||"-"}`}static setupDialog(e,t,a,s,i){return null}setupEffect(e,t={},a){return o.getSubClass(this.type).setupDialog(e,t,this,this.parent,a)}static checkEquality(e,t){return t.type==e.type&&e.name==t.name&&e.system.description?.value==t.system.description?.value}static async combineItem(e,t,a,s=!0){return e=He(e),e.system.quantity.value+=t.system.quantity.value,await a.updateEmbeddedDocuments("Item",[e],{render:s})}static areEquals(e,t){return e.type!=t.type||e.id==t.id?!1:o.getSubClass(e.type).checkEquality(e,t)}static async stackItems(e,t,a,s=!0){return await o.getSubClass(e.type).combineItem(e,t,a,s)}_setupCardOptions(e,t,a){let s=ChatMessage.getSpeaker();return{speaker:{alias:s.alias,scene:s.scene},flags:{img:s.token?canvas.tokens.get(s.token).document.img:this.img},title:t,template:e}}async itemTest({testData:e,cardOptions:t},a={}){e=await R.rollDices(e,t);let s=await R.rollTest(e);if(s.postFunction="itemTest",game.user.targets.size){t.isOpposedTest=e.opposable;let i=` - ${game.i18n.localize("Opposed")}`;t.isOpposedTest&&t.title.match(i+"$")!=i&&(t.title+=i)}return a.suppressMessage||R.renderRollCard(t,s,a.rerenderMessage),{result:s,cardOptions:t}}static chatData(e,t){return[]}static getSubClass(e){return game.dsa5.config.ItemSubclasses[e]||o}async postItem(){o.getSubClass(this.type)._postItem(this)}static async _postItem(e){let t=He(e),a=se(t,"system.obfuscation.details"),s=se(t,"system.obfuscation.description");if(ue(t,{properties:a?[]:o.getSubClass(e.type).chatData(He(t.system),e.name),descriptionObfuscated:s}),t.hasPrice="price"in t.system&&!a,t.hasPrice){let r=t.system.price.value;t.system.QL&&(r=o.getSubClass(t.type).consumablePrice(t));let l=await Q._moneyToString(r);t.properties.push(`${game.i18n.localize("price")}: ${l}`)}e.pack&&(t.itemLink=e.link),t.img.includes("/blank.webp")&&(t.img=null);let i=await renderTemplate("systems/dsa5/templates/chat/post-item.html",t),n=g.chatDataSetup(i);ChatMessage.create(n)}},ws=class extends C{static{u(this,"PlantItemDSA5")}static chatData(e,t){return[this._chatLineHelper("effect",e.effect),this._chatLineHelper("PLANT.recipes",e.recipes),this._chatLineHelper("PLANT.usages",e.usages)]}},vs=class extends C{static{u(this,"MagicalSignItemDSA5")}static chatData(e,t){let a=[this._chatLineHelper("AsPCost",e.asp)];return e.category==2&&a.push(this._chatLineHelper("feature",e.feature)),a}},Ts=class extends C{static{u(this,"DemonmarkItemDSA5")}static chatData(e,t){return[this._chatLineHelper("attributes",e.attribute),this._chatLineHelper("skills",e.skills),this._chatLineHelper("domains",e.domain)]}},Ss=class extends C{static{u(this,"TrapItemDSA5")}static chatData(e,t){return[]}},As=class extends C{static{u(this,"PatronItemDSA5")}static chatData(e,t){return[this._chatLineHelper("skills",e.talents),this._chatLineHelper("culture",e.culture),this._chatLineHelper("Category",game.i18n.localize(`PATRON.${e.category}`))]}},Cs=class extends C{static{u(this,"MoneyItemDSA5")}static checkEquality(e,t){return t.type==e.type&&game.i18n.localize(e.name)==game.i18n.localize(t.name)&&e.system.description?.value==t.system.description?.value}},Ds=class extends C{static{u(this,"AggregatedTestItemDSA5")}static async _postItem(e){let t="",a=game.i18n.localize("Ongoing");e.system.cummulatedQS.value>=10?(a=game.i18n.localize("Success"),t=`${await TextEditor.enrichHTML(e.system.partsuccess,{secrets:this.isOwner,async:!0})}${await TextEditor.enrichHTML(e.system.success,{secrets:this.isOwner,async:!0})}`):e.system.cummulatedQS.value>=6?(a=game.i18n.localize("PartSuccess"),t=`${await TextEditor.enrichHTML(e.system.partsuccess,{secrets:this.isOwner,async:!0})}`):e.system.allowedTestCount.value-e.system.usedTestCount.value<=0&&(a=game.i18n.localize("Failure"));let s=[this._chatLineHelper("cummulatedQS",`${e.system.cummulatedQS.value} / 10`),this._chatLineHelper("interval",e.system.interval.value),this._chatLineHelper("probes",`${e.system.usedTestCount.value} / ${e.system.allowedTestCount.value}`),this._chatLineHelper("result",a),t],i=se(e,"system.obfuscation.description"),n=await renderTemplate("systems/dsa5/templates/chat/aggregatedTestResult.html",{descriptionObfuscated:i,item:e,properties:s}),r=g.chatDataSetup(n);ChatMessage.create(r)}},Ms=class extends C{static{u(this,"AmmunitionItemDSA5")}static chatData(e,t){return[this._chatLineHelper("ammunitiongroup",game.i18n.localize(e.ammunitiongroup.value))]}},Is=class extends C{static{u(this,"EffectWrapperItemDSA5")}},Es=class extends C{static{u(this,"ArmorItemDSA5")}static chatData(e,t){let a=[this._chatLineHelper("protection",e.protection.value),this._chatLineHelper("encumbrance",e.encumbrance.value)];return e.effect.value!=""&&a.push(this._chatLineHelper("effect",e.effect.value)),a}},ra=class extends C{static{u(this,"CantripItemDSA5")}static chatData(e,t){return[this._chatLineHelper("duration",e.duration.value),this._chatLineHelper("targetCategory",e.targetCategory.value),this._chatLineHelper("feature",e.feature.value)]}},$s=class extends ra{static{u(this,"BlessingItemDSA5")}},Et=class o extends C{static{u(this,"SpellItemDSA5")}static chatData(e,t){return[this._chatLineHelper("castingTime",e.castingTime.value),this._chatLineHelper("AsPCost",e.AsPCost.value),this._chatLineHelper("distribution",e.distribution.value),this._chatLineHelper("duration",e.duration.value),this._chatLineHelper("reach",e.range.value),this._chatLineHelper("targetCategory",e.targetCategory.value),this._chatLineHelper("effect",g.replaceConditions(g.replaceDies(e.effect.value)))]}static async getCallbackData(e,t,a){e.testDifficulty=0,e.situationalModifiers=O._parseModifiers(t);let s=new FormDataExtended(t.find("form")[0]).object;e.calculatedSpellModifiers={castingTime:t.find(".castingTime").text(),cost:t.find(".aspcost").text(),reach:t.find(".reach").text(),maintainCost:t.find(".maintainCost").text()},e.situationalModifiers.push({name:game.i18n.localize("removeGesture"),value:Number(s.removeGesture)||0},{name:game.i18n.localize("removeFormula"),value:Number(s.removeFormula)||0},{name:game.i18n.localize("castingTime"),value:t.find(".castingTime").data("mod")},{name:game.i18n.localize("cost"),value:t.find(".aspcost").data("mod")},{name:game.i18n.localize("reach"),value:t.find(".reach").data("mod")},{name:game.i18n.localize("zkModifier"),value:s.zkModifier||0},{name:game.i18n.localize("skModifier"),value:s.skModifier||0},{name:game.i18n.localize("maintainedSpells"),value:s.maintainedSpells*-1}),e.extensions=o.getSpecAbModifiers(t),e.advancedModifiers={chars:[0,1,2].map(i=>s[`ch${i}`]),fws:s.fw,qls:s.qs},C.changeChars(e.source,...[0,1,2].map(i=>s[`characteristics${i}`])),await this.applyExtensions(e.source,e.extensions,a)}static async applyExtensions(e,t,a){N.ensureNumber(e);let s=Object.keys(Se.rollModifiers).map(i=>`${i}.mod`);for(let i of t){let n=fromUuidSync(i.uuid);if(n)for(let r of n.effects)for(let l of r.changes)Se.rollChanges.includes(l.key)||s.includes(l.key)||(l.key=="macro.transform"?await g.callItemTransformationMacro(l.value,e,r):r.apply(e,l))}}static getSpecAbModifiers(e){let t=[];for(let a of e.find(".specAbs.active"))t.push({name:a.dataset.name,title:a.dataset.tooltip,uuid:a.dataset.uuid});return t}static attackSpellMalus(e){let t=[];return e.system.effectFormula.value&&t.push({name:game.i18n.localize("MODS.defenseMalus"),value:-4,type:"defenseMalus",selected:!0,source:e.name}),t}static getPropertyModifiers(e,t){let a=["ceremony","liturgy"].includes(t.type),s=(se(t,"system.feature")||"").replace(/\(a-z äöü-\)/gi,"").split(",").map(c=>c.trim()),i=[],n=a?"KaPCost":"AsPCost",r=["FP","step","QL","TPM","FW",n];for(let c of r){let m=c=="step"?"":c,d=se(e.system.skillModifiers,`feature.${c}`);i.push(...d.filter(p=>s.includes(p.target)).map(p=>({name:p.source,value:p.value,type:m,source:p.source})))}let l=se(e.system.skillModifiers,`conditional.${n}`);return i.push(...l.map(c=>({name:c.target,value:c.value,source:c.source,type:n}))),i}static foreignSpellModifier(e,t,a,s){if(game.settings.get("dsa5","enableForeignSpellModifer")&&["npc","character"].includes(e.type)&&["spell","ritual"].includes(t.type)){let i=t.system.distribution.value.split(",").map(l=>l.trim().toLowerCase()),n=new RegExp(`(${game.i18n.localize("tradition")}|\\)|\\()`,"g"),r=e.system.tradition.magical.replace(n,"").split(",").map(l=>l.trim().toLowerCase());r.push(game.i18n.localize("general").toLowerCase()),s.isForeign=!i.some(l=>r.includes(l)),s.isForeign&&a.push({name:game.i18n.localize("DSASETTINGS.enableForeignSpellModifer"),value:-2,selected:!0})}}static getSituationalModifiers(e,t,a,s){e.push(...te.getTalentBonus(t,s.name,["advantage","disadvantage","specialability","equipment"]),...P.getVantageAsModifier(t,game.i18n.localize("LocalizedIDs.magicalAttunement"),1,!0),...P.getVantageAsModifier(t,game.i18n.localize("LocalizedIDs.magicalRestriction"),-1,!0),...P.getVantageAsModifier(t,game.i18n.localize("LocalizedIDs.boundToArtifact"),-1,!0),...this.getPropertyModifiers(t,s),...this.attackSpellMalus(s)),this.foreignSpellModifier(t,s,e,a),game.user.targets.size&&game.user.targets.forEach(i=>{i.actor&&(x.addCreatureTypeModifiers(i.actor,s,e,t),this.checkDuplicatus(t,i.actor,e))}),e.push(...t.getSkillModifier(s.name,s.type));for(let i of t.system.skillModifiers.global)e.push({name:i.source,value:i.value});this.getSkZkModifier(a,s)}static setupDialog(e,t,a,s,i){let n="spell";["ceremony","liturgy"].includes(a.type)&&(n="liturgy");let r=`${a.name} ${game.i18n.localize(`${a.type}Test`)}${t.subtitle||""}`,l={opposable:a.system.effectFormula.value.length>0,source:a,extra:{actor:s.toObject(!1),options:t,speaker:C.buildSpeaker(s,i)},advancedModifiers:{chars:[0,0,0],fws:0,qls:0},calculatedSpellModifiers:{castingTime:0,cost:0,reach:0,maintainCost:0}},c={rollMode:t.rollMode,spellCost:a.system.AsPCost.value,maintainCost:a.system.maintainCost.value,spellCastingTime:a.system.castingTime.value,spellReach:a.system.range.value,canChangeCost:a.system.canChangeCost.value=="true",canChangeRange:a.system.canChangeRange.value=="true",canChangeCastingTime:a.system.canChangeCastingTime.value=="true",hasSKModifier:a.system.resistanceModifier.value=="SK",hasZKModifier:a.system.resistanceModifier.value=="ZK",maxMods:Math.floor(Number(a.system.talentValue.value)/4),extensions:this.prepareExtensions(s,a),variableBaseCost:a.system.variableBaseCost=="true",characteristics:[1,2,3].map(f=>a.system[`characteristic${f}`].value)},m=s?z.getRollModifiers(s,a):[];this.getSituationalModifiers(m,s,c,a),c.situationalModifiers=m;let d={title:r,template:`systems/dsa5/templates/dialog/${n}-enhanced-dialog.html`,data:c,callback:u(async(f,h={})=>(p.rollMode=f.find('[name="rollMode"]:checked').val(),await this.getCallbackData(l,f,s),ue(l.extra.options,h),{testData:l,cardOptions:p}),"callback")},p=s._setupCardOptions("systems/dsa5/templates/chat/roll/spell-card.html",r,i);return R.setupDialog({dialogOptions:d,testData:l,cardOptions:p})}static prepareExtensions(e,t){return e.items.filter(a=>a.type=="spellextension"&&a.system.source==t.name&&a.system.category==t.type).map(a=>(a.shortName=a.name.split(" - ").length>1?a.name.split(" - ")[1]:a.name,a.descr=$(a.system.description.value).text()||"",a))}},oa=class extends Et{static{u(this,"LiturgyItemDSA5")}static chatData(e,t){return[this._chatLineHelper("castingTime",e.castingTime.value),this._chatLineHelper("KaPCost",e.AsPCost.value),this._chatLineHelper("distribution",e.distribution.value),this._chatLineHelper("duration",e.duration.value),this._chatLineHelper("reach",e.range.value),this._chatLineHelper("targetCategory",e.targetCategory.value),this._chatLineHelper("effect",g.replaceConditions(g.replaceDies(e.effect.value)))]}},Os=class extends oa{static{u(this,"CeremonyItemDSA5")}static getCallbackData(e,t,a){super.getCallbackData(e,t,a),e.situationalModifiers.push({name:game.i18n.localize("CEREMONYMODIFIER.artefact"),value:t.find('[name="artefactUsage"]').is(":checked")?1:0},{name:game.i18n.localize("place"),value:t.find('[name="placeModifier"]').val()},{name:game.i18n.localize("time"),value:t.find('[name="timeModifier"]').val()})}static getSituationalModifiers(e,t,a,s){super.getSituationalModifiers(e,t,a,s),ue(a,{isCeremony:!0,locationModifiers:b.ceremonyLocationModifiers,timeModifiers:b.ceremonyTimeModifiers})}},xs=class extends C{static{u(this,"CombatskillDSA5")}static chatData(e,t){return[this._chatLineHelper("Description",game.i18n.localize(`Combatskilldescr.${t}`))]}static setupDialog(e,t,a,s,i){let n=t.mode,r=a.name+" "+game.i18n.localize(n+"test"),l={opposable:!0,source:a,mode:n,extra:{actor:s.toObject(!1),options:t,speaker:C.buildSpeaker(s,i)}},c={title:r,template:"systems/dsa5/templates/dialog/combatskill-dialog.html",data:{rollMode:t.rollMode},callback:u((d,p={})=>(m.rollMode=d.find('[name="rollMode"]:checked').val(),l.situationalModifiers=O._parseModifiers(d),ue(l.extra.options,p),{testData:l,cardOptions:m}),"callback")},m=s._setupCardOptions("systems/dsa5/templates/chat/roll/combatskill-card.html",r,i);return R.setupDialog({dialogOptions:c,testData:l,cardOptions:m})}},zs=class extends C{static{u(this,"ConsumableItemDSA")}static chatData(e,t){return[this._chatLineHelper("qualityStep",e.QL),this._chatLineHelper("effect",g.replaceDies(e.QLList.split(` + `);n.ret=await c.call(this,a,this.item.actor)}catch(c){ui.notifications.error("There was an error in your macro syntax. See the console (F12) for details"),console.error(c),n.error=!0}}}else ui.notifications.error(game.i18n.format("DSAError.macroNotFound",{name:t}));return n}async executeOnUseEffect(){if(!this.item.actor)return;if(!game.user.can("MACRO_SCRIPT"))return ui.notifications.warn("You are not allowed to use JavaScript macros.");let e=o.getOnUseEffect(this.item);try{let t=Object.getPrototypeOf(async function(){}).constructor;await new t("item","actor",e).call(this,this.item,this.item.actor)}catch(t){ui.notifications.error("There was an error in your macro syntax. See the console (F12) for details"),console.error(t),console.warn(t.stack)}}static getOnUseEffect(e){return e.getFlag("dsa5","onUseEffect")}async automatedAnimation(e,t={}){g.moduleEnabled("autoanimations")&&console.warn("Animations for on use effects not enabled yet")}static effectBaseDummy(e,t,a){return{name:e,icon:"icons/svg/aura.svg",changes:t,duration:a,flags:{dsa5:{value:null,description:e}}}}effectDummy(e,t,a){return o.effectBaseDummy(e,t,a)}async socketedConditionAddActor(e,t){if(game.user.isGM){let a=typeof t=="string";a&&(t=wn(CONFIG.statusEffects.find(i=>i.id==t)),t.name=game.i18n.localize(t.name));let s=[];for(let i of e)a?await i.addCondition(t,1,!1,!1):await i.addCondition(t),s.push(i.name);await this.createInfoMessage(t,s)}else{let a={id:this.item.uuid,data:t,actors:e.map(s=>s.id)};game.socket.emit("system.dsa5",{type:"socketedConditionAddActor",payload:a})}}async createInfoMessage(e,t,a=!0){if(t.length){let s=a?"ActiveEffects.appliedEffect":"ActiveEffects.removedEffect",i=game.i18n.format(s,{source:e.name,target:t.join(", ")});await ChatMessage.create(g.chatDataSetup(i))}}async socketedRemoveCondition(e,t,a=1){if(game.user.isGM){let s=[];for(let n of e){let r=canvas.tokens.get(n);r.actor&&(await r.actor.removeCondition(t,a,!1),s.push(r.name))}let i=CONFIG.statusEffects.find(n=>n.id==t);i.name=game.i18n.localize(i.name),await this.createInfoMessage(i,s,!1)}else{let s={id:this.item.uuid,coreId:t,targets:e};game.socket.emit("system.dsa5",{type:"socketedRemoveCondition",payload:s})}}async socketedActorTransformation(e,t){if(game.user.isGM)for(let a of e){let s=canvas.tokens.get(a);s.actor&&await s.actor.update(t)}else{let a={id:this.item.uuid,targets:e,update:t};game.socket.emit("system.dsa5",{type:"socketedActorTransformation",payload:a})}}async socketedConditionAdd(e,t){if(game.user.isGM){let a=typeof t=="string";a&&(t=wn(CONFIG.statusEffects.find(i=>i.id==t)),t.name=game.i18n.localize(t.name));let s=[];for(let i of e){let n=canvas.tokens.get(i);n.actor&&(a?await n.actor.addCondition(t,1,!1,!1):await n.actor.addCondition(t),s.push(n.name))}await this.createInfoMessage(t,s)}else{let a={id:this.item.uuid,data:t,targets:e};game.socket.emit("system.dsa5",{type:"socketedConditionAdd",payload:a})}}};var pe=class o{static{u(this,"DSATriggers")}static EVENTS={ARMOR_TRANSFORMATION:4,DAMAGE_TRANSFORMATION:5,POST_ROLL:6,POST_OPPOSED:7};static async postOpposed(e){let t=g.getSpeaker(e.attacker.speaker);t&&await this.runMacro(t,e.attacker.testResult,o.EVENTS.POST_OPPOSED,e)}static async postRoll(e){let t=g.getSpeaker(e.testData.speaker);t&&await this.runMacro(t,e.testData,o.EVENTS.POST_ROLL,e)}static async callMacro(e,t,a,s={}){return await new J(e).callMacro(t,a,s)}static async runMacro(e,t,a,s){if(!game.user.can("MACRO_SCRIPT"))ui.notifications.warn("You are not allowed to use JavaScript macros.");else for(let[i,n]of Object.entries(e.dsatriggers[a])){let r=e.items.get(i),l=r.effects.get(n),c=l.getFlag("dsa5","args3");try{let m=Object.getPrototypeOf(async function(){}).constructor;return await new m("actor","testData","type","data","source","ef",c).call(this,e,t,a,s,r,l)}catch(m){ui.notifications.error("There was an error in your macro syntax. See the console (F12) for details"),console.error(m)}}}};var{mergeObject:gt,getProperty:X,duplicate:na,setProperty:vn}=foundry.utils;function Tn(o,e={}){g.moduleEnabled("autoanimations")&&console.warn("Animations for on use effects not enabled yet")}u(Tn,"automatedAnimation");function kr(o,e,t){return J.effectBaseDummy(o,e,t)}u(kr,"effectDummy");async function fs(o,e,t,a,s,i={}){let n={};if(!game.user.can("MACRO_SCRIPT"))ui.notifications.warn("You are not allowed to use JavaScript macros.");else{let l=await game.packs.get(o)?.getDocuments({name:e});if(!l||!l.length){for(let c of game.packs.filter(m=>m.documentName=="Macro"&&/\(internal\)/.test(m.metadata.label)))if(l=await c.getDocuments({name:e}),l.length)break}if(l.length){let c=Object.getPrototypeOf(async function(){}).constructor,m=new c("actor","item","qs","automatedAnimation","args",l[0].command);try{i.result=n;let d=gt({automatedAnimation:Tn,effectDummy:kr},this);await m.call(d,t,a,s,Tn,i)}catch(d){ui.notifications.error("There was an error in your macro syntax. See the console (F12) for details"),console.error(d),n.error=!0}}else ui.notifications.error(game.i18n.format("DSAError.macroNotFound",{name:e}))}return n}u(fs,"callMacro");Hooks.once("i18nInit",()=>{Z.effectDurationRegexes=[{regEx:new RegExp(game.i18n.localize("DSAREGEX.combatRounds"),"i"),seconds:5},{regEx:new RegExp(game.i18n.localize("DSAREGEX.minutes"),"i"),seconds:60},{regEx:new RegExp(game.i18n.localize("DSAREGEX.hours"),"i"),seconds:3600},{regEx:new RegExp(game.i18n.localize("DSAREGEX.days"),"i"),seconds:3600*24},{regEx:new RegExp(game.i18n.localize("DSAREGEX.weeks"),"i"),seconds:3600*24*7},{regEx:new RegExp(game.i18n.localize("DSAREGEX.months"),"i"),seconds:3600*24*30},{regEx:new RegExp(game.i18n.localize("DSAREGEX.years"),"i"),seconds:3600*24*350}]});var Z=class o extends ActiveEffectConfig{static{u(this,"DSAActiveEffectConfig")}static AdvantageRuleItems=new Set(["armor","meleeweapon","rangeweapon"]);static get defaultOptions(){return gt(super.defaultOptions,{resizable:!0})}static async callMacro(e,t,a,s,i,n={}){return await fs(e,t,a,s,i,n)}static async startDelayedEffect(e,t){t.update({"system.delayed":!1,duration:e,"flags.dsa5.-=onDelayed":null})}static onDelayedEffect(e,t){let a=!0;if(t.system.delayed){let s=t.system?.originalDuration||{seconds:"",rounds:""};if(gt(s,{startRound:game.combat?.round,startTurn:game.combat?.turn,startTime:game.time.worldTime}),!s.rounds&&s.seconds&&(s.rounds=Number(s.seconds)/5),(t.changes.length||t.statuses.size)&&(this.startDelayedEffect(s,t),a=!1),t.system.macroEffect){let i=t.system.initialTestData,n=game.actors.get(t.system.sourceActor),r=t.system.source,l=na(t.system.macroEffect);delete l.flags.dsa5?.onDelayed,l.system.delayed=!1,l.duration=s,this.applyAdvancedFunction(e,[l],r,i,n)}}return a}static async onEffectRemove(e,t){let a=X(t,"flags.dsa5.onRemove");if(a)if(!game.user.can("MACRO_SCRIPT"))ui.notifications.warn("You are not allowed to use JavaScript macros.");else try{let s=Object.getPrototypeOf(async function(){}).constructor;await new s("effect","actor",a).call(this,t,e)}catch(s){ui.notifications.error("There was an error in your macro syntax. See the console (F12) for details"),console.error(s),console.warn(s.stack)}}async checkTimesUpInstalled(){let e=g.moduleEnabled("times-up");return!e&&game.user.isGM&&ui.notifications.warn("DSAError.shouldTimesUp",{localize:!0}),e}async _render(e=!1,t={}){await super._render(e,t);let a=0,s=X(this.object,"parent.type"),i=["meleeweapon","rangeweapon"].includes(s)||s=="trait"&&["meleeAttack","rangeAttack"].includes(X(this.object,"parent.system.traitType.value")),n={hasSpellEffects:i||["spell","liturgy","ritual","skill","ceremony","consumable","poison","disease","ammunition"].includes(s)||["specialability"].includes(s)&&X(this.object,"parent.system.category.value")=="Combat",hasDamageTransformation:["ammunition","meleeweapon","rangeweapon"].includes(s),hasTriggerEffects:["specialability"].includes(s),hasSuccessEffects:["poison","disease"].includes(s)},r=[];if((n.hasSpellEffects||n.hasDamageTransformation||n.hasTriggerEffects)&&r.push({name:"ActiveEffects.advancedFunctions.none",index:0}),n.hasSpellEffects)for(let y of["systemEffect","macro","creature"])r.push({name:`ActiveEffects.advancedFunctions.${y}`,index:a+=1});n.hasDamageTransformation&&r.push({name:"ActiveEffects.advancedFunctions.armorPostprocess",index:pe.EVENTS.ARMOR_TRANSFORMATION},{name:"ActiveEffects.advancedFunctions.damagePostprocess",index:pe.EVENTS.DAMAGE_TRANSFORMATION}),n.hasTriggerEffects&&r.push({name:"ActiveEffects.advancedFunctions.postRoll",index:pe.EVENTS.POST_ROLL},{name:"ActiveEffects.advancedFunctions.postOpposed",index:pe.EVENTS.POST_OPPOSED});let l={systemEffects:this.getStatusEffects(),canEditMacros:game.user.isGM||game.settings.get("dsa5","playerCanEditSpellMacro")},c=["players","player","playergm","gm"].reduce((y,k)=>(y[k]=game.i18n.localize(`ActiveEffects.messageReceivers.${k}`),y),{}),m={1:"ActiveEffects.onSuccess",2:"ActiveEffects.onFailure"},d=o.AdvantageRuleItems.has(s),p=[2,6,7],f=$(this._element);f.find(".tabs").append(`${game.i18n.localize("advanced")}`);let h=await renderTemplate("systems/dsa5/templates/status/advanced_effect.html",{effect:this.object,advancedFunctions:r,effectConfigs:n,macroIndexes:p,messageReceivers:c,canWeaponAdvantages:d,equipmentAdvantageOptions:{1:game.i18n.localize(`AdvantageRuleItems.${s}.1`),2:game.i18n.localize(`AdvantageRuleItems.${s}.2`)},applySuccessConditions:m,config:l,isWeapon:i,dispositions:Object.entries(CONST.TOKEN_DISPOSITIONS).reduce((y,k)=>(y[k[1]]=`TOKEN.DISPOSITION.${k[0]}`,y),{2:game.i18n.localize("all")})});f.find('.tab[data-tab="effects"]').after($(h)),f.find(".advancedSelector").on("change",y=>{let k=this.object;k.flags.dsa5.advancedFunction=$(y.currentTarget).val(),renderTemplate("systems/dsa5/templates/status/advanced_functions.html",{effect:k,config:l,macroIndexes:p}).then(C=>{f.find(".advancedFunctions").html(C)})}),f.find(".auraSelector").on("change",y=>{f.find(".auraDetails").toggleClass("dsahidden",!y.currentTarget.checked),f.find(".auraBox").toggleClass("groupbox",y.currentTarget.checked)}),this.object.statuses.size&&game.i18n.has(this.object.description)&&f.find('[data-tab="details"] .editor').replaceWith(`

${game.i18n.localize(this.object.description)}

`),this.checkTimesUpInstalled()}getStatusEffects(){return CONFIG.statusEffects.map(e=>({id:e.id,name:game.i18n.localize(e.name)})).sort((e,t)=>e.name.localeCompare(t.name))}static applyRollTransformation(e,t,a){let s="",i=t.origin;for(let n of i.effects)try{if(Number(X(n,"flags.dsa5.advancedFunction"))==a)if(!game.user.can("MACRO_SCRIPT"))ui.notifications.warn("You are not allowed to use JavaScript macros.");else try{let r=Object.getPrototypeOf(function(){}).constructor;new r("ef","callMacro","actor","msg","source","options",X(n,"flags.dsa5.args3")).call(this,n,fs,e,s,i,t)}catch(r){ui.notifications.error("There was an error in your macro syntax. See the console (F12) for details"),console.error(r),console.warn(r.stack)}}catch(r){console.warn("Unable to apply advanced effect",r,n)}return t.origin=i,{msg:s,options:t}}static async applyAdvancedFunction(e,t,a,s,i,n=!0){let r="",l=[],c=!1,m=[],d=new Set;for(let p of t){p.origin&&delete p.origin;let f=Number(X(p,"flags.dsa5.specStep"))||0;try{let h=Number(X(p,"flags.dsa5.advancedFunction")),y=Math.min(s.qualityStep||0,6),k=X(p,"flags.dsa5.resistRoll"),C=X(p,"flags.dsa5.isAura");if(C){let v=`${X(p,"flags.dsa5.auraRadius")||1}`.replace(/q(l|s)/i,y),I=(await new Roll(v).evaluate()).total;vn(p,"flags.dsa5.auraRadius",I)}if(k&&!n){let v=k.split(" "),I=`${v.pop()}`;l.push({skill:v.join(" "),mod:Math.round(Roll.safeEval(`${I}`.replace(/q(l|s)/i,y).replaceAll("step",f)))||0,effect:p,target:e,token:e.token?.id})}else{c=!0,d.has(p.name)||d.add(p.name);let v=X(p,"flags.dsa5.onDelayed"),I={duration:{seconds:v},system:{delayed:!0,originalDuration:p.duration}},S=p.changes&&p.changes.length>0||C&&!h;if(h)switch(h){case 1:{let A=`${X(p,"flags.dsa5.args1")}`||"1";/,/.test(A)?A=Number(A.split(",")[y-1]):A=Number(A.replace(game.i18n.localize("CHARAbbrev.QS"),y));let M=X(p,"flags.dsa5.args0"),T=game.i18n.localize(`CONDITION.${M}`),L={name:`${a.name} (${T})`,duration:p.duration};v&>(L,I),await e.addTimedCondition(M,A,!1,!1,L)}break;case 2:if(!game.user.can("MACRO_SCRIPT"))ui.notifications.warn("You are not allowed to use JavaScript macros.");else if(v){let A=na(p);A.changes=[],S=!0,gt(p,{system:{macroEffect:A,sourceActor:i?.id,source:a,initialTestData:{qualityStep:s.qualityStep}}})}else try{let A=Object.getPrototypeOf(async function(){}).constructor;await new A("effect","actor","callMacro","msg","source","actor","sourceActor","testData","qs",X(p,"flags.dsa5.args3")).call(this,p,e,fs,r,a,e,i,s,y)}catch(A){ui.notifications.error("There was an error in your macro syntax. See the console (F12) for details"),console.error(A),console.warn(A.stack)}break;case 3:let j=(X(p,"flags.dsa5.args4")||"").split(",").map(A=>`@Compendium[${A.trim().replace(/(@Compendium\[|\])/)}]`).join(" ");r+=`

${game.i18n.localize("ActiveEffects.advancedFunctions.creature")}:

${j}

`;break}S&&(v&&(delete p.flags.dsa5.onDelayed,gt(p,I)),m.push(p))}}catch(h){console.warn("Unable to apply advanced effect"),console.warn(h),console.warn(p)}}return await e.createEmbeddedDocuments("ActiveEffect",m),{msg:r,resistRolls:l,effectApplied:c,effectNames:Array.from(d)}}static async resistEffect(e){let t=e.currentTarget.dataset,a={token:t.token,actor:t.actor,scene:canvas.id},s=g.getSpeaker(a);if(s){let i=s.items.find(n=>n.type=="skill"&&n.name==t.skill);s.setupSkill(i,{modifier:t.mod},t.token).then(async n=>{n.testData.opposable=!1,((await s.basicTest(n)).result.qualityStep||0)<1&&await this.applyEffect(t.message,t.mode,[a],{effectIds:[t.effect],skipResistRolls:!0})})}else console.warn("Actor not found for resist roll.")}static async applyEffect(e,t,a,s={}){let i=game.messages.get(e),n=i.flags.data.preData.source,r=i.flags.data.postData,l=i.speaker,c=["poison","disease"].includes(n.type);c&&(r.qualityStep=r.successLevel>0?1:2);let m=g.getSpeaker(l)||g.getSpeaker(X(i.flags,"data.preData.extra.speaker"))||game.actors.get(X(i.flags,"data.preData.extra.actor.id")),d=m,p=(await this._parseEffectDuration(n,r,i.flags.data.preData,m)).filter(h=>!X(h,"flags.dsa5.applyToOwner"));c&&(p=p.filter(h=>X(h,"flags.dsa5.successEffect")==r.qualityStep||!X(h,"flags.dsa5.successEffect"))),s.effectIds&&(p=p.filter(h=>s.effectIds.includes(h._id)));let f=[];if(t=="self"?m&&f.push(m):a?f=a.map(h=>g.getSpeaker(h)):game.user.targets.size&&game.user.targets.forEach(h=>{h.actor&&f.push(h.actor)}),game.user.isGM)for(let h of f){let{msg:y,resistRolls:k,effectApplied:C,effectNames:v}=await o.applyAdvancedFunction(h,p,n,r,d,s.skipResistRolls||!1);if(C){let S=`${game.i18n.format("ActiveEffects.appliedEffect",{target:h.token?.name||h.name,source:v.join(", ")})}${y||""}`;await ChatMessage.create(g.chatDataSetup(S))}k.length&&await this.createResistRollMessage(k,e,t)}else game.socket.emit("system.dsa5",{type:"addEffect",payload:{mode:t,id:e,actors:f.map(h=>({token:h.token?h.token.id:void 0,actor:h.id,scene:canvas.scene.id}))}})}static async createResistRollMessage(e,t,a){for(let s of e){let i=await renderTemplate("systems/dsa5/templates/chat/roll/resist-roll.html",{resist:s,id:t,mode:a});await ChatMessage.create(g.chatDataSetup(i))}}static async _parseEffectDuration(e,t,a,s){let i={};for(let m of a.situationalModifiers.filter(d=>d.specAbId))i[m.specAbId]=m.step;let n=Object.keys(i),r=s?s.items.filter(m=>n.includes(m.id)):[],l=e.effects?na(e.effects):[];for(let m of r){let d=na(m).effects;for(let p of d)vn(p,"flags.dsa5.specStep",i[m.id]);l.push(...d)}let c=X(e,"system.duration.value")||"";c=c.replace(/ x /g," * ").replace(game.i18n.localize("CHARAbbrev.QS"),t.qualityStep);try{for(let m of o.effectDurationRegexes)if(m.regEx.test(c)){let d=c.replace(m.regEx,"").trim(),p=await R._stringToRoll(d);if(!isNaN(p))for(let f of l){let h=p*m.seconds,y=X(f,"flags.dsa5.customDuration");if(y){let k=y.split(",")[t.qualityStep-1];k&&k!="-"&&(h=Number(k))}f.duration.seconds=h,f.duration.rounds=f.duration.seconds/5}break}}catch{console.error(`Could not parse duration '${c}' of '${e.name}'`)}return l}dropDownMenu(){let e=game.i18n.localize("MODS.FW"),t=game.i18n.localize("skill"),a=game.i18n.localize("regenerate"),s=game.i18n.localize("MODS.FP"),i=game.i18n.localize("stepValue"),n=game.i18n.localize("MODS.QS"),r=game.i18n.localize("MODS.partChecks"),l=`${game.i18n.localize("LocalizedIDs.perception")} 1`,c=`${game.i18n.localize("LocalizedIDs.wrestle")} 1`,m=`${game.i18n.localize("LocalizedIDs.wrestle")} 1`,d=game.i18n.localize("closeCombatAttacks"),p=game.i18n.localize("rangeCombatAttacks"),f=`${a} (${game.i18n.localize("CHARAbbrev.CR")})`,h=game.i18n.localize("AsPCost"),y=game.i18n.localize("KaPCost"),k=game.i18n.localize("permanentCost"),C=`${game.i18n.localize("Healing")} 1`,v=`${game.i18n.localize("Description")} 1`,I=`${game.i18n.localize("LocalizedIDs.miracle")}`,S=[{name:game.i18n.localize("protection"),val:"system.totalArmor",mode:2,ph:"1"},{name:game.i18n.localize("liturgyArmor"),val:"system.liturgyArmor",mode:2,ph:"1"},{name:`${game.i18n.localize("resistanceModifier")} (${game.i18n.localize("condition")})`,val:"system.resistances.effects",mode:0,ph:"inpain 1"},{name:`${game.i18n.localize("threshold")} (${game.i18n.localize("condition")})`,val:"system.thresholds.effects",mode:0,ph:"inpain 1"},{name:game.i18n.localize("spellArmor"),val:"system.spellArmor",mode:2,ph:"1"},{name:game.i18n.localize("carrycapacity"),val:"system.carryModifier",mode:2,ph:"1"},{name:`${d} - ${game.i18n.localize("CHARAbbrev.AT")}`,val:"system.meleeStats.attack",mode:2,ph:"1"},{name:`${d} - ${game.i18n.localize("CHARAbbrev.PA")}`,val:"system.meleeStats.parry",mode:2,ph:"1"},{name:`${I} - ${game.i18n.localize("CHARAbbrev.AT")}`,val:"system.miracle.attack",mode:2,ph:"1"},{name:`${I} - ${game.i18n.localize("CHARAbbrev.PA")}`,val:"system.miracle.parry",mode:2,ph:"1"},{name:`${d} - ${game.i18n.localize("CHARAbbrev.damage")}`,val:"system.meleeStats.damage",mode:2,ph:"+1d6"},{name:`${d} - ${game.i18n.localize("MODS.defenseMalus")}`,val:"system.meleeStats.defenseMalus",mode:2,ph:"1"},{name:game.i18n.localize("MODS.creatureBonus"),val:"system.creatureBonus",mode:0,ph:`${game.i18n.localize("CONJURATION.elemental")} 1`},{name:`${p} - ${game.i18n.localize("CHARAbbrev.AT")}`,val:"system.rangeStats.attack",mode:2,ph:"1"},{name:`${p} - ${game.i18n.localize("CHARAbbrev.damage")}`,val:"system.rangeStats.damage",mode:2,ph:"+1d6"},{name:`${p} - ${game.i18n.localize("MODS.defenseMalus")}`,val:"system.rangeStats.defenseMalus",mode:2,ph:"1"},{name:`${game.i18n.localize("spell")} - ${game.i18n.localize("CHARAbbrev.damage")}`,val:"system.spellStats.damage",mode:2,ph:"1"},{name:`${game.i18n.localize("liturgy")} - ${game.i18n.localize("CHARAbbrev.damage")}`,val:"system.liturgyStats.damage",mode:2,ph:"1"},{name:y,val:"system.kapModifier",mode:2,ph:"1"},{name:h,val:"system.aspModifier",mode:2,ph:"1"},{name:`${k} ${game.i18n.localize("CHARAbbrev.AsP")}`,val:"system.status.astralenergy.permanentGear",mode:2,ph:"1"},{name:`${k} ${game.i18n.localize("CHARAbbrev.KaP")}`,val:"system.status.astralenergy.permanentGear",mode:2,ph:"1"},{name:`${t} - ${e}`,val:"system.skillModifiers.FW",mode:0,ph:l},{name:`${t} - ${s}`,val:"system.skillModifiers.FP",mode:0,ph:l},{name:`${t} - ${i}`,val:"system.skillModifiers.step",mode:0,ph:l},{name:`${t} - ${n}`,val:"system.skillModifiers.QL",mode:0,ph:l},{name:`${t} - ${r}`,val:"system.skillModifiers.TPM",mode:0,ph:l},{name:`${game.i18n.localize("vulnerability")} - ${game.i18n.localize("combatskill")}`,val:"system.vulnerabilities.combatskill",mode:0,ph:m},{name:`${t} - ${game.i18n.localize("MODS.global")}`,val:"system.skillModifiers.global",mode:0,ph:"1"},{name:`${f} - ${game.i18n.localize("wounds")}`,val:"system.repeatingEffects.startOfRound.wounds",mode:0,ph:"1d6"},{name:`${f} - ${game.i18n.localize("astralenergy")}`,val:"system.repeatingEffects.startOfRound.astralenergy",mode:0,ph:"1d6"},{name:`${f} - ${game.i18n.localize("karmaenergy")}`,val:"system.repeatingEffects.startOfRound.karmaenergy",mode:0,ph:"1d6"},{name:`${a} - ${game.i18n.localize("wounds")}`,val:"system.status.regeneration.LePgearmodifier",mode:2,ph:"1"},{name:`${a} - ${game.i18n.localize("astralenergy")}`,val:"system.status.regeneration.AsPgearmodifier",mode:2,ph:"1"},{name:`${a} - ${game.i18n.localize("karmaenergy")}`,val:"system.status.regeneration.KaPgearmodifier",mode:2,ph:"1"},{name:`${game.i18n.localize("feature")} - ${h}`,val:"system.skillModifiers.feature.AsPCost",mode:0,ph:C},{name:`${game.i18n.localize("advanced")} - ${h}`,val:"system.skillModifiers.conditional.AsPCost",mode:0,ph:v},{name:`${game.i18n.localize("feature")} - ${y}`,val:"system.skillModifiers.feature.KaPCost",mode:0,ph:C},{name:`${game.i18n.localize("advanced")} - ${y}`,val:"system.skillModifiers.conditional.KaPCost",mode:0,ph:v},{name:`${game.i18n.localize("MODS.sight")}`,val:"system.sightModifier.value",mode:2,ph:"-1"},{name:`${game.i18n.localize("MODS.sightMax")}`,val:"system.sightModifier.maxLevel",mode:5,ph:"4"},{name:`${game.i18n.localize("LocalizedIDs.immuneTo")} ${game.i18n.localize("condition")}`,val:"system.immunities",mode:2,ph:"feared"},{name:game.i18n.localize("temperature.heatProtection"),val:"system.temperature.heatProtection",mode:2,ph:"1"},{name:game.i18n.localize("temperature.coldProtection"),val:"system.temperature.coldProtection",mode:2,ph:"1"},{name:`${game.i18n.localize("TYPES.Item.combatskill")} - ${game.i18n.localize("CHAR.ATTACK")}`,val:"system.skillModifiers.combat.attack",mode:0,ph:c},{name:`${game.i18n.localize("TYPES.Item.combatskill")} - ${game.i18n.localize("CHAR.PARRY")}`,val:"system.skillModifiers.combat.parry",mode:0,ph:c},{name:`${game.i18n.localize("TYPES.Item.combatskill")} - ${game.i18n.localize("KTW")}`,val:"system.skillModifiers.combat.step",mode:0,ph:c},{name:`${game.i18n.localize("TYPES.Item.combatskill")} - ${game.i18n.localize("damage")}`,val:"system.skillModifiers.combat.damage",mode:0,ph:c}],j=["liturgy","ceremony","spell","ritual","skill","feature"];for(let A of j){let M=A=="skill"?"skillglobal":A,T=game.i18n.localize(M);S.push({name:`${T} - ${e}`,val:`system.skillModifiers.${A}.FW`,mode:0,ph:l},{name:`${T} - ${s}`,val:`system.skillModifiers.${A}.FP`,mode:0,ph:l},{name:`${T} - ${i}`,val:`system.skillModifiers.${A}.step`,mode:0,ph:l},{name:`${T} - ${n}`,val:`system.skillModifiers.${A}.QL`,mode:0,ph:l},{name:`${T} - ${r}`,val:`system.skillModifiers.${A}.TPM`,mode:0,ph:l})}for(let A of CONFIG.statusEffects)X(A,"flags.dsa5.max")&&S.push({name:game.i18n.localize(A.name),val:`system.condition.${A.id}`,mode:2,ph:1});this.object.parent?.type=="armor"&&S.push({name:game.i18n.localize("CustomActiveEffects.armor.vulnerability"),val:"self.armorVulnerability",mode:0,ph:"Swords 5"});for(let A of Object.keys(b.characteristics))S.push({name:game.i18n.localize(`CHAR.${A.toUpperCase()}`),val:`system.characteristics.${A}.gearmodifier`,mode:2,ph:"1"});for(let A of b.gearModifyableCalculatedAttributes)S.push({name:game.i18n.localize(A),val:`system.status.${A}.gearmodifier`,mode:2,ph:"1"});for(let A of["spell","liturgy","ceremony","ritual"]){let M=g.categoryLocalization(A);for(let T of["soulpower","toughness"])S.push({name:`${game.i18n.localize(T)} (${M})`,val:`system.status.${T}.${A}resist`,mode:2,ph:"1"});for(let T of Object.keys(Se.rollModifiers))S.push({name:`${M} - ${game.i18n.localize(T.replace("Spell",""))}`,val:`system.${A}RollModifiers.${T}.mod`,mode:2,ph:"1"},{name:`${M} - ${game.i18n.localize(T.replace("Spell",""))} - ${game.i18n.localize("advanced")}`,val:`system.${A}RollModifiers.${T}.custom`,mode:0,ph:v})}for(let A of["meleeweapon","rangeweapon"]){let M=g.categoryLocalization(A);for(let T of Object.keys(foundry.utils.flattenObject(fe[`${A}RollModifiers`])))S.push({name:`${M} - ${game.i18n.localize(`MODS.${T.replace(/\.[a-z]+$/,"")}`)}`,val:`system.${A}RollModifiers.${T}`,mode:2,ph:"1"})}if(["meleeweapon","rangeweapon"].includes(this.object.parent?.type)){let A=g.categoryLocalization(this.object.parent.type),M=game.i18n.localize("combatmaneuver"),T=game.i18n.localize("LocalizedIDs.weaponThrow");for(let L of["attack","parry","damage"]){if(L=="parry"&&this.object.parent.type=="rangeweapon")continue;let q=game.i18n.localize(`CHAR.${L.toUpperCase()}`);S.push({name:`${A} - ${q}`,val:`self.situational.${L}`,mode:0,ph:"1"})}S.push({name:`${M} - ${game.i18n.localize("CHAR.attack")}`,val:"self.maneuver.atbonus",mode:0,ph:`${T} 1`},{name:`${M} - ${game.i18n.localize("CHAR.parry")}`,val:"self.maneuver.pabonus",mode:0,ph:`${T} 1`},{name:`${M} - ${game.i18n.localize("CHAR.damage")}`,val:"self.maneuver.tpbonus",mode:0,ph:`${T} 1`})}S=S.sort((A,M)=>A.name.localeCompare(M.name));for(let A of S)(!A.ph||A.mode==null)&&console.warn(A);return S=S.map(A=>``).join(` +`),``}activateListeners(e){super.activateListeners(e);let t=this.dropDownMenu();e.find(".changes-list .effect-change .key").append(t),e.find(".selMenu").select2({width:"element"}).change(a=>{let s=$(a.currentTarget);s.siblings("input").val(s.val());let i=s.closest(".effect-change"),n=s.find("option:selected");i.find(".mode select").val(n.attr("data-mode")),i.find(".value input").attr("placeholder",n.attr("data-ph")),s.trigger("blur")}),e.find(".select2").each((a,s)=>{$(s)[0].style.removeProperty("width")})}};var Le=class extends MeasuredTemplate{static{u(this,"MeasuredTemplateDSA")}#t;#a=0;#e;static async placeTemplateFromChat(e){let t=$(e.currentTarget).parents(".message").attr("data-message-id"),a=game.messages.get(t),s=a.flags.data.preData,i=a.flags.data.postData,r=g.getSpeaker(s.extra.speaker).items.get(s.source._id),l=this.fromItem(r,i.qualityStep,t);l&&l.drawPreview()}static fromItem(e,t,a){let s=e.system.target||{},i=game.dsa5.config.areaTargetTypes[s.type];if(!i||!s.value)return null;let n=Number(Roll.safeEval(`${s.value}`.replace(/(qs|ql)/gi,t)))||1,r={t:i,user:game.user.id,distance:n,direction:0,x:0,y:0,fillColor:game.user.color,flags:{dsa5:{origin:e.uuid,messageId:a}}};switch(i){case"cone":r.angle=Number(s.angle)||CONFIG.MeasuredTemplate.defaults.angle;break;case"rect":r.distance=Math.hypot(n,n),r.width=n,r.direction=45;break;case"ray":r.width=s.width&&Number(Roll.safeEval(`${s.width}`.replace(/(qs|ql)/gi,t)))||canvas.dimensions.distance;break}let l=CONFIG.MeasuredTemplate.documentClass,c=new l(r,{parent:canvas.scene}),m=new this(c);return m.item=e,m}drawPreview(){let e=canvas.activeLayer;return this.draw(),this.layer.activate(),this.layer.preview.addChild(this),this.activatePreviewListeners(e)}activatePreviewListeners(e){return new Promise((t,a)=>{this.#t=e,this.#e={cancel:this._onCancelPlacement.bind(this),confirm:this._onConfirmPlacement.bind(this),move:this._onMovePlacement.bind(this),resolve:t,reject:a,rotate:this._onRotatePlacement.bind(this)},canvas.stage.on("mousemove",this.#e.move),canvas.stage.on("mousedown",this.#e.confirm),canvas.app.view.oncontextmenu=this.#e.cancel,canvas.app.view.onwheel=this.#e.rotate})}async _finishPlacement(e){this.layer._onDragLeftCancel(e),canvas.stage.off("mousemove",this.#e.move),canvas.stage.off("mousedown",this.#e.confirm),canvas.app.view.oncontextmenu=null,canvas.app.view.onwheel=null,this.#t.activate(),await this.actorSheet?.maximize()}_onMovePlacement(e){e.stopPropagation();let t=Date.now();if(t-this.#a<=20)return;let a=e.data.getLocalPosition(this.layer),s=canvas.grid.getSnappedPoint({x:a.x,y:a.y},2);this.document.updateSource({x:s.x,y:s.y}),this.refresh(),this.#a=t}_onRotatePlacement(e){e.ctrlKey&&e.preventDefault(),e.stopPropagation();let t=canvas.grid.type>CONST.GRID_TYPES.SQUARE?30:15,a=e.shiftKey?t:5,s={direction:this.document.direction+a*Math.sign(e.deltaY)};this.document.updateSource(s),this.refresh()}async _onConfirmPlacement(e){await this._finishPlacement(e);let t=canvas.grid.getSnappedPoint({x:this.document.x,y:this.document.y},2);this.document.updateSource(t),this.#e.resolve(canvas.scene.createEmbeddedDocuments("MeasuredTemplate",[this.document.toObject()]))}async _onCancelPlacement(e){await this._finishPlacement(e),this.#e.reject()}};var{getProperty:Ue,duplicate:Sn,mergeObject:An}=foundry.utils,_e=class o{static{u(this,"DSAAura")}static bindAuraHooks(){Hooks.on("DSAauraRefresh",(e,t)=>{g.isActiveGM()&&o.updateTokenAura(e,t)}),g.moduleEnabled("autoanimations")&&Hooks.on("createMeasuredTemplate",async(e,t,a)=>{if(!g.isActiveGM())return;let s=Ue(e,"flags.dsa5.origin");if(!s)return;let i=await fromUuid(s);i&&o.applyTemplateToTargets(e,i)})}static async applyTemplateToTargets(e,t){let a=0;for(;a<1e4&&!e.object?.shape;)await new Promise(s=>setTimeout(s,100)),a+=100;for(let s of canvas.scene.tokens)e.object.shape.contains(s.object.center.x-e.x,s.object.center.y-e.y)&&console.log("Token in template",s.name);if(g.moduleEnabled("autoanimations"))for(let s of t.parent.getActiveTokens())AutomatedAnimations.playAnimation(s,t,{targets:[],workflow:e,isTemplate:!0,templateData:e})}static async onDeleteToken(e){if(g.isActiveGM())for(let t in e.object.auras)await this.removeAura(t)}static async removeAura(e,t){for(let a of canvas.scene.tokens){let s=a.actor.effects.find(i=>Ue(i,"flags.dsa5.templateSource")==e);s&&await a.actor.deleteEmbeddedDocuments("ActiveEffect",[s.id])}}static async refreshAnimations(e){if(game.ready&&g.moduleEnabled("autoanimations")){Sequencer.EffectManager.endEffects({name:"spot*",object:e});for(let t in e.auras){let a=e.auras[t].template,s=a.document.flags.dsa5.effect;AutomatedAnimations.playAnimation(e,s,{targets:[],workflow:a,isTemplate:!0,templateData:a})}e.requiresAnimationRefresh=!1}else game.ready&&(e.requiresAnimationRefresh=!1)}static removeAuras(e,t){for(let a in e.auras)if(!t.includes(a)){if(!e.auras[a])continue;e.auras[a].child.destroy(),delete e.auras[a],g.isActiveGM()&&o.removeAura(a,this),e.requiresAnimationRefresh=!0}}static async drawAuras(e,t=!1){if(!e.actor)return;e.auras||={};let a=[];t&&o.removeAuras(e,a);for(let s of e.actor.auras){let i=await fromUuid(s);if(e.auras[s])a.push(s),Hooks.call("DSAauraRefresh",e.auras[s],e);else{let n=gs.fromItem(i,e,s);if(!n)continue;let r=e.addChild(n);r.draw().then(l=>{l.template.x-=e.document.x,l.template.y-=e.document.y}),e.auras[s]={child:r,template:n},a.push(s),Hooks.call("DSAauraRefresh",e.auras[s],e),e.requiresAnimationRefresh=!0}}o.removeAuras(e,a),e.requiresAnimationRefresh&&o.refreshAnimations(e),o.checkAuraEntered(e.document)}static validAuraTarget(e,t){return t==2||t==e.disposition}static async inAura(e,t,a){for(let s of e.actor.getActiveTokens())for(let i of t.actor.getActiveTokens())if(ne.rangeFinder(s,i).distance<=a.distance)return!0;return!1}static async checkAuraEntered(e){if(!(!g.isActiveGM(!0)||!game.canvas)){for(let t of canvas.scene.tokens)if(!(!t.actor||t.id==e.id)&&Ue(t.actor,"system.merchant.merchantType")!="loot")for(let[a,s]of Object.entries(t.object?.auras||{})){let{auraSource:i,effect:n,isAura:r}=Ue(s.template.document,"flags.dsa5"),l=n.flags?.dsa5?.disposition??2;r&&await o.updateAura(t,e,s.template.document,l,i,n)}}}static async updateTokenAura(e,t){let{child:a,template:s}=e,i=s.document,{auraSource:n,effect:r,isAura:l}=Ue(i,"flags.dsa5"),c=r.flags?.dsa5?.disposition??2;if(!(!l||!game.canvas)){if(!n){await s.delete();return}for(let m of canvas.scene.tokens)!t.isToken&&t.actor?.id==m.actor?.id||await o.updateAura(t,m,i,c,n,r)}}static async updateAura(e,t,a,s,i,n){if(!t.actor)return;let r=await o.inAura(e,t,a),l=t.actor.effects.find(c=>Ue(c,"flags.dsa5.templateSource")==i);if(r&&o.validAuraTarget(t,s)&&!l){let c=Sn(n);An(c,{name:`${n.name} (Aura)`,flags:{dsa5:{templateSource:i}}}),await t.actor.addCondition(c)}else!r&&l&&await t.actor.deleteEmbeddedDocuments("ActiveEffect",[l.id])}},gs=class extends Le{static{u(this,"AuraTemplate")}static fromItem(e,t,a){let s=Number(Ue(e,"flags.dsa5.auraRadius"));if(!s)return;let i=Sn(e);delete i.flags.dsa5.isAura,An(i,{flags:{dsa5:{isAuraEffect:!0}}});let n={t:"circle",_id:e.id,user:game.user.id,distance:s,direction:0,x:t.center.x,y:t.center.y,borderColor:e.flags.dsa5.borderColor,flags:{dsa5:{effect:i,auraSource:a,isAura:!0,borderThickness:e.flags.dsa5.borderThickness||3}}},r=CONFIG.MeasuredTemplate.documentClass,l=new r(n,{parent:canvas.scene});return new this(l)}async _draw(){await super._draw(),this.controlIcon.alpha=0}highlightGrid(){super.highlightGrid(),canvas.interface.grid.getHighlightLayer(this.highlightId).alpha=0}_applyRenderFlags(e){super._applyRenderFlags(e),e.refreshState&&(canvas.interface.grid.getHighlightLayer(this.highlightId).alpha=0)}_refreshTemplate(){let e=this.template.clear();this.document.borderColor!=null&&e.lineStyle(this.document.flags.dsa5.borderThickness,this.document.borderColor,.75).beginFill(0,0),e.drawShape(this.shape)}};var{getProperty:Fe,hasProperty:wr,mergeObject:It}=foundry.utils;function ys(){Hooks.on("preDeleteActiveEffect",(r,l,c)=>{if(l.noHook)return;let m=r.parent;if(m&&m.documentName=="Actor"&&Fe(r,"flags.dsa5.maintain")){let d=[r._id],p=r.name.replace("("+game.i18n.localize("maintainCost")+")","").trim(),f=m.effects.filter(y=>y.name.startsWith(p)&&!y.origin&&y.id!=r._id),h=`

${game.i18n.format("DIALOG.updateMaintainSpell",{actor:m.name})}

`;return f&&(h+=`

${game.i18n.localize("DIALOG.dependentMaintainEffects")}

`,h+=f.map(y=>`
`).join("")),new foundry.applications.api.DialogV2({window:{title:r.name},content:h,buttons:[{action:"yes",icon:"fa fa-check",label:"HELP.pay",default:!0,callback:u(async()=>{if(await m.applyMana(Number(Fe(r,"flags.dsa5.maintain")),Fe(r,"flags.dsa5.payType"))){let k={startTime:game.time.worldTime};game.combat&&(k.startRound=game.combat.round,k.startTurn=game.combat.turn),m.updateEmbeddedDocuments("ActiveEffect",[{_id:r._id,duration:k}])}},"callback")},{action:"delete",icon:"fas fa-trash",label:"delete",callback:u((y,k,C)=>{for(let v of k.form.elements)v.classList.contains("effectRemoveSelector")&&d.push(v.value);m.deleteEmbeddedDocuments("ActiveEffect",d,{noHook:!0})},"callback")}]}).render(!0),!1}}),Hooks.on("updateActor",(r,l)=>{!game.user.isGM&&r.limited&&wr(l,"system.merchant.hidePlayer")&&ui.sidebar.render(!0)}),Hooks.on("deleteActiveEffect",(r,l)=>{if(!g.isActiveGM()||l.noHook)return;let c=r.parent;e(r,l),c&&c.documentName=="Actor"&&(r.statuses.has("bloodrush")?c.addCondition("stunned",2,!1,!1):(r.statuses.has("dead")||r.statuses.has("defeated"))&&game.combat&&c.markDead(!1),Z.onEffectRemove(c,r))}),Hooks.on("preDeleteActiveEffect",(r,l,c)=>{if(!g.isActiveGM()||l.noHook)return;let m=r.parent;if(m&&m.documentName=="Actor"&&(Z.onDelayedEffect(m,r)===!1||Hooks.call("deleteActorActiveEffect",m,r)===!1))return!1}),Hooks.on("dropActorSheetData",(r,l,c)=>{switch(c.data?.type){case"condition":return r.addCondition(c.data.payload.id,1,!1,!1),!1;case"lookup":return l._handleLookup(c.data),!1;case"fullpack":return l._addFullPack(c.data),!1}}),Hooks.on("createActiveEffect",(r,l,c)=>{g.isActiveGM()&&(o(r),t(r))}),Hooks.on("deleteActiveEffect",(r,l,c)=>{g.isActiveGM()&&o(r)}),Hooks.on("updateActiveEffect",(r,l,c)=>{g.isActiveGM()&&(o(r),a(r))});function o(r){if(game.combat&&r.changes.some(l=>/(system\.status\.initiative|system\.characteristics.mu|system\.characteristics\.ge)/.test(l.key))){let l=r.parent.id,c=game.combat.combatants.find(m=>m.actor.id==l);c&&c.recalcInitiative()}}u(o,"checkIniChange");let e=u(async(r,l)=>{if(!r.parent)return;let c=Fe(r,"flags.dsa5.removeMessage");if(!(game.settings.get("dsa5","notifyOnFadingEffects")&&r.parent.documentName=="Actor"||c))return;let m=[];switch(c){case"player":m=game.users.filter(d=>!d.isGM&&r.parent.testUserPermission(d,"OWNER"));break;case"playergm":m=game.users.filter(d=>r.parent.testUserPermission(d,"OWNER"));break;case"players":m=void 0;break;default:m=game.users.filter(d=>d.isGM)}m=m?.map(d=>d.id),ChatMessage.create(g.chatDataSetup(game.i18n.format("CHATNOTIFICATION.fadingEffect",{effect:r.name,actor:r.parent.link}),void 0,void 0,m))},"notifyFadingEffect"),t=u(async r=>{let l=r.parent;l&&(await a(r,{},l),(r.statuses.has("dead")||r.statuses.has("defeated"))&&game.combat&&await l.markDead(!0),r.statuses.has("unconscious")&&await l.addCondition("prone"))},"createEffects"),a=u(async(r,l={},c)=>{if(c||(c=r.parent),!c||c.documentName!="Actor")return;let m=/^system\.condition\./;for(let d of r.changes||[])m.test(d.key)&&d.mode==2&&(l[d.key.split(".")[2]]=Number(d.value));for(let d of Object.keys(l))if(c.system.condition[d]>=4&&(d=="inpain"?await c.initResistPainRoll(r):["encumbered","stunned","feared","confused","trance"].includes(d)?await c.addCondition("incapacitated"):d=="paralysed"?await c.addCondition("rooted"):["drunken","exhaustion"].includes(d)&&(await c.addCondition("stunned"),await c.removeCondition(d))),(Number(l.inpain)||0)>0&&!c.hasCondition("bloodrush")&&c.system.condition.inpain>0&&P.hasVantage(c,game.i18n.localize("LocalizedIDs.frenzy"))){await c.addCondition("bloodrush");let p=g.replaceConditions(`${game.i18n.format("CHATNOTIFICATION.gainsBloodrush",{character:""+c.name+""})}`);ChatMessage.create(g.chatDataSetup(p))}},"countableDependentEffects"),s=u(async(r,l)=>{(game.dsa5.apps.AskForNameDialog||hs).getDialog(r,l)},"askForName"),i=u(async r=>{if(g.isActiveGM()&&game.settings.get("dsa5","randomWeaponSelection")&&r.actor.type!="character"){let l=[],c=[],m=[];for(let p of r.actor.items)p.type=="meleeweapon"&&p.system.worn.value?N.isShield(p)?c.push(p):l.push(p):p.type=="rangeweapon"&&p.system.worn.value&&m.push(p);let d=[];if(l.length){let p=l[Math.floor(Math.random()*l.length)],f=p._id,h;!N.regex2h.test(p.name)&&c.length&&(h=c[Math.floor(Math.random()*c.length)]._id);for(let y of l)y._id!=f&&d.push({_id:y._id,system:{worn:{value:!1}}});for(let y of c)y._id!=h&&d.push({_id:y._id,system:{worn:{value:!1}}})}if(m.length){let p=m[Math.floor(Math.random()*m.length)]._id;for(let f of m)f._id!=p&&d.push({_id:f._id,system:{worn:{value:!1}}})}d.length&&r.actor.updateEmbeddedDocuments("Item",d)}},"randomWeaponSelection"),n=u(async(r,l)=>{if(!g.isActiveGM())return;let c=r.actor;if(c.hasPlayerOwner)return;let m=Number(game.settings.get("dsa5","obfuscateTokenNames"));if(m==0||Fe(c,"merchant.merchantType")=="loot")return;let d=canvas.scene.tokens.filter(f=>f.actor&&f.actor.id===c.id),p=game.i18n.localize("unknown");if([2,4].includes(m)){if(!(r.id||r._id))return;s(r,m);return}if(d.length>0&&m<3){let f=d.length;for(let h of d){let y=h.name.match(/\d+$/);y&&Number(y[0])>f&&(f=Number(y[0]))}p=`${d[0].name.replace(/ \d{1,}$/,"")} ${f+1}`}l.name=p},"obfuscateName");Hooks.on("updateToken",(r,l,c)=>{if(!r.rendered)return;let m={center:r.object.center,elevation:r.elevation};H.updateTokenHook(r,l,c);let d=c.animation?.name||r.object?.animationName;(r.object?.animationContexts.get(d)?.promise||Promise.resolve()).then(()=>{r.object?.drawAuras(),game.dsa5.apps.LightDialog&&game.dsa5.apps.LightDialog.onTokenMove(r,l,c,m)})}),Hooks.on("preDeleteToken",r=>{_e.onDeleteToken(r)}),Hooks.on("deleteToken",r=>{H.deleteTokenHook(r),Ve.hide(r)}),Hooks.on("canvasReady",r=>{for(let l of r.scene.tokens)l.object?.drawAuras()}),Hooks.on("preCreateToken",(r,l,c,m)=>{let d=r.actor;if(!d)return;let p={};Fe(d,"system.merchant.merchantType")=="loot"?It(p,{displayBars:0}):Fe(d,"system.config.autoBar")&&(It(p,{bar1:{attribute:"status.wounds"}}),d.system.isMage?It(p,{bar2:{attribute:"status.astralenergy"}}):d.system.isPriest?It(p,{bar2:{attribute:"status.karmaenergy"}}):It(p,{bar2:{attribute:"tbd"}})),Fe(d,"system.config.autoSize")&&g.calcTokenSize(d,p),n(r,p),r.updateSource(p)}),Hooks.on("createToken",(r,l,c)=>{l.noHook||(n(r,{}),i(r),H.createTokenHook(r,l,c),r.object?.drawAuras())}),Hooks.on("hoverToken",(r,l)=>{game.settings.get("dsa5","showWeaponsOnHover")&&(l?Ve.show(r):Ve.hide(r))})}u(ys,"default");var Ve=class{static{u(this,"TokenHoverHud")}static show(e){if(!game.combat||canvas.hud?.token?.rendered)return;let t=e.actor.items.filter(a=>a.type=="meleeweapon"||a.type=="rangeweapon"?a.system.worn.value:!1);if(t.length){let a=t.map(i=>``).join(" "),s=$(`
${a}
`);$("#hud").append(s),this.position(s,e,t.length)}}static position(e,t,a){let s=t.document,i=canvas.dimensions.size/100,n=a*43,r={width:n,height:42,left:t.center.x-n/2*i,top:t.y+s.height*canvas.dimensions.size+32};i!==1&&(r.transform=`scale(${i})`),e.css(r)}static hide(e){$(`#hoverhud_${e.id}`).remove()}},hs=class o extends foundry.applications.api.DialogV2{static{u(this,"AskForNameDialog")}static DEFAULT_OPTIONS={window:{title:"DSASETTINGS.obfuscateTokenNames"}};static async getDialog(e,t){new o({content:`
`,buttons:[{action:"yes",icon:"fa fa-check",label:"yes",default:!0,callback:u(async(a,s,i)=>{let n=e.id||e._id,r=s.form.elements.name.value;if(t==2){let c=canvas.scene.tokens.filter(m=>m.name===r);if(c.length>0){let m=c.length;for(let d of c){let p=d.name.match(/\d+$/);p&&Number(p[0])>m&&(m=Number(p[0]))}r=`${c[0].name.replace(/ \d{1,}$/,"")} ${m+1}`}}await canvas.scene.tokens.get(n).update({name:r})},"callback")},{action:"unknown",icon:"fa fa-question",label:"unknown",callback:u(async()=>{let a=e.id||e._id;await canvas.scene.tokens.get(a).update({name:game.i18n.localize("unknown")})},"callback")},{action:"cancel",icon:"fas fa-times",label:"cancel"}]}).render(!0)}};var{mergeObject:ht,getProperty:bs,hasProperty:Tr}=foundry.utils,H=class o{static{u(this,"Riding")}static preRenderedUnmountHud='
';static preRenderedMountHud='
';static preRenderedSpeedHud='
';static async createTokenHook(e,t,a){if(!g.isActiveGM())return;let s=e.parent;if(this.isRiding(e.actor)&&s.active){let i=this.getHorse(e.actor);if(!i)return;let n=await i.getTokenDocument({x:e.x,y:e.y,hidden:e.hidden}),r=(await s.createEmbeddedDocuments("Token",[n]))[0],l={"flags.dsa5.horseTokenId":r.id,elevation:(r.elevation??0)+1};ht(l,this.adaptTokenSize(e,r)),await e.update(l),r.actorLink||await e.actor.update({"system.horse.actorLink":!1,"system.horse.token":{scene:s.id,token:r.id}})}}static isRiding(e){return bs(e,"system.horse.isRiding")}static updateTokenHook(e,t,a){if(!g.isActiveGM())return;let s=bs(e,"flags.dsa5.horseTokenId"),i=e.parent;s&&i.active&&(t.x||t.y)&&this.isRiding(e.actor)&&i.updateEmbeddedDocuments("Token",[{_id:s,x:t.x??e.x,y:t.y??e.y}])}static rollLoyalty(e,t={}){let a=this.getHorse(e);if(!a)return;let s=this.getLoyaltyFromHorse(a);if(!s)return ui.notifications.warn(game.i18n.format("DSAError.notFound",{category:g.categoryLocalization("skill"),name:game.i18n.localize("LocalizedIDs.loyalty")}));a.setupSkill(s,t,a.token?.id).then(i=>{a.basicTest(i)})}static async updateRiderSpeed(e,t){if(!canvas?.tokens?.documentCollection)return;let a=e.getActiveTokens().map(s=>s.id);for(let s of Array.from(canvas.tokens.documentCollection))a.includes(s.getFlag("dsa5","horseTokenId"))&&t!=s.actor.system.status.speed.max&&(s.actor.prepareData(),s.actor.sheet.render())}static getLoyaltyFromHorse(e){return e.items.find(t=>t.type=="skill"&&t.name.startsWith(game.i18n.localize("LocalizedIDs.loyalty")))}static activateListeners(e,t){e.find(".riding-toggle").click(()=>this.toggleIsRiding(t)),e.find(".showHorse").click(()=>this.getHorse(t).sheet.render(!0)),e.find(".horse-delete").click(()=>this.clearMount(t)),e.find(".horse-loyalty").click(()=>this.rollLoyalty(t)),e.find('[name="horseSpeedSelector"]').change(async a=>{a.preventDefault();let s=o.getHorse(t);o.setSpeed(s,a.currentTarget.value)})}static async toggleIsRiding(e){await e.update({"system.horse.isRiding":!e.system.horse?.isRiding});let t=[];if(e.system.horse.isRiding){let a=this.getHorse(e),s;for(let i of a.getActiveTokens())t.push({_id:i.document.id,"flags.dsa5.-=horseTokenId":null}),s=i.document.id;for(let i of e.getActiveTokens())t.push({_id:i.document.id,elevation:Math.max(0,(i.document.elevation??0)+1),"flags.dsa5.horseTokenId":s});await this.addRidingCondition(e)}else{for(let a of e.getActiveTokens())t.push({_id:a.document.id,"flags.dsa5.-=horseTokenId":null,elevation:Math.max(0,(a.document.elevation??0)-1)});await this.removeRidingCondition(e)}await canvas.scene.updateEmbeddedDocuments("Token",t,{noHooks:!0})}static getRidingCondition(e){let t=game.i18n.localize("RIDING.riding");return e.effects.find(a=>a.name==t)}static async addRidingCondition(e){this.getRidingCondition(e)||await e.addCondition(this.ridingCondition())}static async removeRidingCondition(e){let t=this.getRidingCondition(e);t&&await e.deleteEmbeddedDocuments("ActiveEffect",[t.id])}static deleteTokenHook(){console.warn("delete riding token hook not implemented")}static getHorse(e,t=!1){let a;return e.system.horse&&(e.system.horse.token&&!e.system.horse.actorLink?a=g.getSpeaker(e.system.horse.token):a=game.actors.get(e.system.horse.actorId),!a&&t&&e.system.horse.isRiding&&(a={name:game.i18n.localize("unknown")})),a}static async unmountHorse(e,t){let a={"flags.dsa5.-=horseTokenId":null,elevation:Math.max(0,(t.elevation??0)-1)},s=t.getFlag("dsa5","horseResized");s&&ht(a,{"flags.dsa5.-=horseResized":null,width:s.width,height:s.height}),await this.clearMount(e),await t.update(a)}static async clearMount(e){await e.update({system:{horse:{isRiding:!1,actorLink:!1,actorId:"","-=token":null}}}),await this.removeRidingCondition(e)}static ridingCondition(){return{name:game.i18n.localize("RIDING.riding"),img:"systems/dsa5/icons/thirdparty/horse-head.svg",changes:[{key:"system.status.dodge.gearmodifier",mode:2,value:-2}],flags:{dsa5:{description:game.i18n.localize("RIDING.ridingDescription")}}}}static async setHorse(e,t,a){if(t.compendium){if(!await foundry.applications.api.DialogV2.confirm({window:{title:"DSAError.horseMustBeImported"},content:`

${game.i18n.localize("DSAError.horseMustBeImportedText")}

`,rejectClose:!1}))return;let n=await g.getFolderForType("Actor",null,game.i18n.localize("RIDING.horse")),r=t.toObject();r.folder=n.id,t=await Actor.implementation.create(r)}a&&!t.token&&(t=(await canvas.scene.createEmbeddedDocuments("Token",[await t.getTokenDocument({x:a.x,y:a.y})]))[0].actor);let s={system:{horse:{isRiding:!0,actorLink:t.prototypeToken.actorLink,actorId:t.id}}};if(!t.prototypeToken.actorLink&&t.token&&ht(s,{system:{horse:{token:{scene:canvas.scene.id,token:t.token.id}}}}),await e.update(s),t.isToken){let i=this.adaptTokenSize(a,t.token),n=e.getActiveTokens().map(r=>ht({_id:r.id,"flags.dsa5.horseTokenId":t.token.id,x:t.token.x,y:t.token.y},i)).concat({_id:t.token.id,"flags.dsa5.-=horseTokenId":null});await canvas.scene.updateEmbeddedDocuments("Token",n,{noHooks:!0})}await this.addRidingCondition(e)}static adaptTokenSize(e,t){return e.width>=t.width?{width:.7*t.width,height:.7*t.height,"flags.dsa5.horseResized":{width:e.width,height:e.height}}:{}}static async mountHorse(e){let t=canvas.tokens.controlled.find(n=>n.document.id!=e.id),a=e.parent,s={system:{horse:{isRiding:!0,actorLink:t.actorLink,actorId:t.actor.id}}};t.actorLink||ht(s,{system:{horse:{token:{scene:a.id,token:t.id}}}});let i={_id:e.id,"flags.dsa5.horseTokenId":t.id,x:t.x,y:t.y,elevation:(t.document.elevation??0)+1};ht(i,this.adaptTokenSize(e.document,t.document)),await e.actor.update(s),await canvas.scene.updateEmbeddedDocuments("Token",[i,{_id:t.id,"flags.dsa5.-=horseTokenId":null}],{noHooks:!0}),await this.addRidingCondition(e.actor)}static speedKeys={0:{key:"system.status.speed.multiplier",mode:5,value:0},"-4":{key:"system.status.speed.initial",mode:5,value:4},"-5000":{key:"system.status.speed.multiplier",mode:5,value:.66},"-8":{key:"system.status.speed.multiplier",mode:5,value:1}};static getHorseSpeed(e){return e.effects.find(t=>bs(t,"flags.dsa5.horseSpeed"))?.flags.dsa5.horseSpeed||0}static horseSpeedModifier(e){let t=this.getHorseSpeed(e);return Object.keys(this.speedKeys).map(a=>Number(a)).indexOf(Number(t))}static increaseSpeed(e){let t=this.getHorseSpeed(e),a=Math.min(3,Object.keys(this.speedKeys).map(s=>Number(s)).indexOf(t)+1);this.setSpeed(e,Object.keys(this.speedKeys).map(s=>Number(s))[a])}static decreaseSpeed(e){let t=this.getHorseSpeed(e),a=Math.max(0,Object.keys(this.speedKeys).map(s=>Number(s)).indexOf(t)-1);this.setSpeed(e,Object.keys(this.speedKeys).map(s=>Number(s))[a])}static async setSpeed(e,t){await e.deleteEmbeddedDocuments("ActiveEffect",e.effects.filter(a=>Tr(a,"flags.dsa5.horseSpeed")).map(a=>a.id)),await e.addCondition({name:game.i18n.localize("speed")+": "+game.i18n.localize(`RIDING.speeds.${t}`),icon:"systems/dsa5/icons/thirdparty/horse-head.svg",changes:[this.speedKeys[t]],flags:{dsa5:{description:game.i18n.localize(`RIDING.speed.${t}`),horseSpeed:t}}})}static renderTokenHUD(e,t,a){let s=e.object.actor;if(canvas.tokens.controlled.length==2)t.find(".col.left").prepend(this.preRenderedMountHud),t.find('.control-icon[data-action="ride"]').click(()=>this.mountHorse(e.object));else if(this.isRiding(s)){t.find(".col.left").prepend(this.preRenderedUnmountHud);let i=t.find('.control-icon[data-action="ride"]');i.click(()=>{this.unmountHorse(s,e.object.document),i.remove()});let n=this.getHorse(s);t.find(".col.right").prepend(this.preRenderedSpeedHud),t.find('.control-icon[data-action="rideIncrease"]').click(()=>this.increaseSpeed(n)),t.find('.control-icon[data-action="rideDecrease"]').click(()=>this.decreaseSpeed(n))}}};var Q=class o{static{u(this,"DSA5Payment")}static async payMoney(e,t,a=!1,s=!0){let i=await o.canPay(e,t,a);return i.success&&await o._updateMoney(e,i.actorsMoney.money,i.actorsMoney.sum-i.money,s),!a&&i.msg!=""&&ChatMessage.create(g.chatDataSetup(`

${i.msg}

`,"roll")),i.success}static async canPay(e,t,a){let s=this._getPaymoney(t),i={success:!1,msg:"",money:s};return s&&(i.actorsMoney=this._actorsMoney(e),i.actorsMoney.sum>=s?(i.msg=game.i18n.format("PAYMENT.pay",{actor:e.name,amount:await o._moneyToString(s)}),i.success=!0):(i.msg=game.i18n.format("PAYMENT.cannotpay",{actor:e.name,amount:await o._moneyToString(s)}),a&&ui.notifications.info(i.msg))),i}static async getMoney(e,t,a=!1,s=!0){let i=this._getPaidmoney(t);if(i){let n=this._actorsMoney(e);await o._updateMoney(e,n.money,n.sum+i,s);let r=`

${game.i18n.format("PAYMENT.getPaid",{actor:e.name,amount:await o._moneyToString(i)})}

`;return a||ChatMessage.create(g.chatDataSetup(r,"roll")),!0}}static async createGetPaidChatMessage(e,t=void 0){let a=this._getPaidmoney(e);if(a){let s=t?` (${t})`:"",i=`

${game.i18n.localize("PAYMENT.wage")}

${game.i18n.format("PAYMENT.getPaidSum",{amount:await o._moneyToString(a)})}${s}

`;ChatMessage.create(g.chatDataSetup(i,"roll"))}}static async createPayChatMessage(e,t=void 0){let a=this._getPaymoney(e);if(a){let s=t?` (${t})`:"",i=`

${game.i18n.localize("PAYMENT.bill")}

${game.i18n.format("PAYMENT.paySum",{amount:await o._moneyToString(a)})}${s}

`;ChatMessage.create(g.chatDataSetup(i,"roll"))}}static _getPaidmoney(e){let t=this._parseMoneyString(e);if(!t){let a=`

${game.i18n.localize("PAYMENT.error")}

${game.i18n.localize("PAYMENT.getPaidexample")}

`;return ChatMessage.create(g.chatDataSetup(a,"roll")),!1}return t}static _getPaymoney(e){let t=this._parseMoneyString(e);if(!t){let a=`

${game.i18n.localize("PAYMENT.error")}

${game.i18n.localize("PAYMENT.payexample")}

`;return ChatMessage.create(g.chatDataSetup(a,"roll")),!1}return t}static async handlePayAction(e,t,a,s=void 0){if(game.user.isGM&&!s){ui.notifications.info("PAYMENT.onlyActors",{localize:!0});return}s?K.playMoneySound(!0):s=game.user.character;let i=!1;s&&t?i=await o.payMoney(s,a):s&&!t?i=await o.getMoney(s,a):ui.notifications.info("PAYMENT.onlyActors",{localize:!0}),i&&e&&(e.fadeOut(),game.socket.emit("system.dsa5",{type:"updateMsg",payload:{id:e.closest(".message").attr("data-message-id"),updateData:{[`flags.dsa5.userHidden.${game.user.id}`]:!0}}}))}static async _moneyToCoins(e,t=void 0){let a=(t||(await g.allMoneyItems()).filter(n=>n.system.subcategory!=1)).sort((n,r)=>r.system.price.value-n.system.price.value),s=[],i=e;for(let n of a){let r=Math.floor(i/n.system.price.value);s.push({name:n.name,amount:r,img:n.img}),i-=r*n.system.price.value}return i>.001&&(s[s.length-1].amount+=1),s}static _parseMoneyString(e){let t=e.replace(",",".").match(/\d{1,}(\.\d{1,3}|,\d{1,3})?/);return t?Number(t[0]):!1}static _actorsMoney(e){let t=e.items.filter(a=>a.type=="money"&&a.system.subcategory!=1);return{money:t,sum:t.reduce((a,s)=>a+Number(s.system.quantity.value)*Number(s.system.price.value),0)}}static async _replaceMoney(e){let t=o._actorsMoney(e),a=await g.allMoneyItems();await e.deleteEmbeddedDocuments("Item",t.money.map(s=>s.id),{render:!1}),await e.createEmbeddedDocuments("Item",a,{render:!1}),await o._updateMoney(e,o._actorsMoney(e).money,t.sum)}static async _updateMoney(e,t,a,s=!0){let i=await o._moneyToCoins(a,t),n=[];for(let r of t){let l=i.find(c=>c.name==r.name);l!=null&&n.push({_id:r.id,"system.quantity.value":l.amount})}await e.updateEmbeddedDocuments("Item",n,{render:s})}static async _moneyToString(e){let t=await o._moneyToCoins(e),a=[];for(let s of t)s.amount>0&&a.push(`${s.amount} `);return a.join(", ")}static async chatListeners(e){e.on("click",".payButton",t=>{let a=$(t.currentTarget);o.handlePayAction(a,Number(a.attr("data-pay"))!=1,a.attr("data-amount")),K.playMoneySound()})}};var{getProperty:Cn,setProperty:ks,getType:Sr}=foundry.utils,Me=class o extends ActiveEffect{static{u(this,"DSAActiveEffect")}static itemChangeRegex=/^@/;static deprecatedDataRegex=/^data\./;apply(e,t){if(o.itemChangeRegex.test(t.key)){let a=this._getModifiedItems(e,t);for(let s of a.items){let i=foundry.utils.flattenObject(s.overrides||{});i[a.key]=Number.isNumeric(s.value)?Number(a.value):a.value;let n={...t,key:a.key,value:a.value};super.apply(s,n),s.overrides=foundry.utils.expandObject(i)}}else{if(t.key.startsWith("data.")){let a=game.i18n.format("DSAError.ActiveEffectDataChange",{name:e.name});console.error(a),t.key=t.key.replace(o.deprecatedDataRegex,"system.")}return super.apply(e,t)}}static realyRealyEnabled(e){return!(e.disabled||!e.transfer||e.system.delayed||!game.settings.get("dsa5","enableWeaponAdvantages")&&e.system.equipmentAdvantage)}static async _onCreateOperation(e,t,a){for(let s of e)s.parent.documentName=="Actor"&&await O.postUpdateConditions(s.parent);return super._onCreateOperation(e,t,a)}static async _onUpdateOperation(e,t,a){for(let s of e)s.parent.documentName=="Actor"&&await O.postUpdateConditions(s.parent);return super._onUpdateOperation(e,t,a)}static async _onDeleteOperation(e,t,a){for(let s of e)s.parent.documentName=="Actor"&&await O.postUpdateConditions(s.parent);return super._onDeleteOperation(e,t,a)}isVisibleEffect(){return!this.disabled&&!this.notApplicable&&(game.user.isGM||!this.getFlag("dsa5","hidePlayers"))&&!this.getFlag("dsa5","hideOnToken")}_displayScrollingStatus(e){let t=["dead"];(game.user.isGM||this.target?.testUserPermission(game.user,"OBSERVER")||!game.settings.get("dsa5","hideEffects")?this.isVisibleEffect():t.some(i=>this.statuses.has(i)))&&super._displayScrollingStatus(e)}_getModifiedItems(e,t){let a=t.key.split("."),s=a.shift();s=s.replace("@","").toLowerCase();let i=a.shift(),n=a.join("."),r=t.value;return{items:i=="self"?[this.parent]:e?.items?.filter(c=>c.type==s&&(c.name==i||c.id==i))||[],key:n,value:r}}async _preUpdate(e,t,a){await super._preUpdate(e,t,a),this._clearModifiedItems()}_clearModifiedItems(){if(this.parent instanceof CONFIG.Actor.documentClass){for(let e of this.changes)if(o.itemChangeRegex.test(e.key)){let t=this._getModifiedItems(this.parent,e);for(let a of t.items){let s=foundry.utils.flattenObject(a.overrides||{}),i=t.key;delete s[i];let n=Cn(a._source,i);ks(a,i,n),a.overrides=foundry.utils.expandObject(s),a.sheet?.rendered&&a.sheet.render(!0)}}}}async _preDelete(e,t){super._preDelete(e,t),this._clearModifiedItems()}},Ar=u((o,e)=>{let t=Cn(o,e.key)||null;t==null&&/^system\.(vulnerabilities|resistances)/.test(e.key)&&(t=[],ks(o,e.key,t));let a=Sr(t),s=null;switch(a){case"Array":let i=[],n=e.effect.name;for(let r of`${e.value}`.split(/[;,]+/)){let l=r.split(" "),c=l.pop(),m=l.join(" ");i.push({source:n,value:c,target:m,item:e.effect.parent?.name})}s=t.concat(i)}return s!==null&&ks(o,e.key,s),s},"applyCustomEffect");Hooks.on("applyActiveEffect",(o,e)=>Ar(o,e));var{getProperty:se,mergeObject:ue,duplicate:He}=foundry.utils,D=class o extends Item{static{u(this,"Itemdsa5")}static DEFAULT_ICON="systems/dsa5/icons/blank.webp";static defaultImages={advantage:"systems/dsa5/icons/categories/Vorteil.webp",disadvantage:"systems/dsa5/icons/categories/Nachteil.webp",armor:"systems/dsa5/icons/categories/Armor.webp",meleeweapon:"systems/dsa5/icons/categories/Meleeweapon.webp",rangeweapon:"systems/dsa5/icons/categories/Rangeweapon.webp",equipment:"systems/dsa5/icons/categories/Equipment.webp",consumable:"systems/dsa5/icons/categories/consumable.webp",liturgy:"systems/dsa5/icons/categories/Liturgy.webp",spell:"systems/dsa5/icons/categories/Spell.webp",ammunition:"systems/dsa5/icons/categories/Munition.webp",career:"systems/dsa5/icons/categories/Career.webp",magictrick:"systems/dsa5/icons/categories/Spelltrick.webp",blessing:"systems/dsa5/icons/categories/Blessing.webp",combatskill:"systems/dsa5/icons/categories/Combat_Skill.webp",skill:"systems/dsa5/icons/categories/Skill.webp",Geweihte:"systems/dsa5/icons/categories/Geweihte.webp",Weltliche:"systems/dsa5/icons/categories/Weltliche.webp",Zauberer:"systems/dsa5/icons/categories/Zauberer.webp",ritual:"systems/dsa5/icons/categories/ritual.webp",ceremony:"systems/dsa5/icons/categories/ceremony.webp",abilityclerical:"systems/dsa5/icons/categories/ability_clerical.webp",abilityCombat:"systems/dsa5/icons/categories/ability_combat.webp",abilityfatePoints:"systems/dsa5/icons/categories/ability_fate_points.webp",abilitygeneral:"systems/dsa5/icons/categories/ability_general.webp",specialability:"systems/dsa5/icons/categories/ability_general.webp",abilitymagical:"systems/dsa5/icons/categories/ability_magical.webp",abilitylanguage:"systems/dsa5/icons/categories/Ability_Language.webp",abilitystaff:"systems/dsa5/icons/categories/ability_staff.webp",abilityceremonial:"systems/dsa5/icons/categories/ability_ceremonial.webp",abilityanimal:"systems/dsa5/icons/categories/ability_animal.webp",trait:"systems/dsa5/icons/categories/trait.webp",Tiere:"systems/dsa5/icons/categories/Tiere.webp",aggregatedTest:"systems/dsa5/icons/categories/aggregated_test.webp",poison:"systems/dsa5/icons/categories/poison.webp",disease:"systems/dsa5/icons/categories/disease.webp",spellextension:"systems/dsa5/icons/categories/Spellextension.webp",species:"icons/environment/people/group.webp",application:"systems/dsa5/icons/categories/Skill.webp",trick:"systems/dsa5/icons/categories/Tiere.webp",disadvantageanimal:"systems/dsa5/icons/categories/NachteilAnimal.webp",advantageanimal:"systems/dsa5/icons/categories/VorteilAnimal.webp",diseaseanimal:"systems/dsa5/icons/categories/diseaseAnimal.webp",effectwrapper:"icons/svg/aura.svg",liturgyTalisman:"systems/dsa5/icons/categories/LiturgieTalisman.webp",plant:"systems/dsa5/icons/categories/plant.webp",magicalsign:"systems/dsa5/icons/categories/magicalsign.webp",abilitypact:"systems/dsa5/icons/categories/ability_pact.webp",demonmark:"systems/dsa5/icons/categories/ability_pact.webp",patron:"systems/dsa5/icons/categories/ability_pact.webp",information:"systems/dsa5/icons/categories/DSA-Auge.webp",essence:"systems/dsa5/icons/categories/wesenszug.webp",imprint:"systems/dsa5/icons/categories/praegung.webp",book:"systems/dsa5/icons/backgrounds/library.webp",trap:"systems/dsa5/icons/categories/trap.webp"};static defaultIcon(e){(!e.img||e.img=="")&&(e.type in this.defaultImages?e.img=this.defaultImages[e.type]:e.type.startsWith("ability")?e.img=this.defaultImages.specialability:e.img=o.DEFAULT_ICON)}static async create(e,t){if(Array.isArray(e))for(let a of e)this.defaultIcon(a);else this.defaultIcon(e);return await super.create(e,t)}static getSpecAbModifiers(e,t){let a=[];for(let s of e.find(".specAbs")){let i=Number($(s).attr("data-step"));if(i>0){let n=t=="attack"?$(s).attr("data-atbonus"):$(s).attr("data-pabonus"),r=n.split(",").reduce((l,c)=>l+Number(c),0);a.push({name:$(s).find("a").text(),value:isNaN(r)?Number(n.replace("*","")):Number(r)*i,damageBonus:$(s).attr("data-tpbonus"),dmmalus:$(s).attr("data-dmmalus")*i,step:i,specAbId:$(s).attr("data-id"),type:/^\*/.test(n)?"*":void 0})}}return a}async _buildEmbedHTML(e,t={}){let a=`systems/dsa5/templates/items/browse/${this.type}.html`,s=await renderTemplate(a,{document:this,isGM:game.user.isGM,...await this.sheet.getData(),...t});return $(s)[0]}static setupSubClasses(){game.dsa5.config.ItemSubclasses={ritual:Hs,spell:Et,liturgy:oa,ceremony:Os,advantage:la,disadvantage:la,aggregatedTest:Ds,trait:Vs,blessing:$s,magictrick:ra,specialability:Bs,disease:Rs,poison:_s,armor:Es,money:Cs,rangeweapon:Fs,meleeweapon:Ls,ammunition:Ms,equipment:Ps,combatskill:xs,skill:Gs,application:js,consumable:zs,spellextension:Ws,species:qs,effectwrapper:Is,plant:ws,magicalsign:vs,patron:As,demonmark:Ts,information:Ns,book:Us,trap:Ss}}static buildSpeaker(e,t){return{token:t,actor:e?.id,scene:canvas.scene?.id}}static parseValueType(e,t){let a="";return/^\*/.test(t)&&(a="*",t=t.substring(1).replace(",",".")),{name:e,value:Number(t),type:a}}async addCondition(e,t=1,a=!1,s=!0){return await z.addCondition(this,e,t,a,s)}async removeCondition(e,t=1,a=!0,s=!1){return z.removeCondition(this,e,t,a,s)}hasCondition(e){return z.hasCondition(this,e)}static getMiracleModifiers(e,t,a,s){let i=new RegExp(`${game.i18n.localize("combatskill")} `,"gi"),n=(se(e,"system.happyTalents.value")||"").split(/;|,/).map(l=>l.replace(i,"").trim()),r=[];if(n.includes(t.name)){let l=e.system.status.karmaenergy.value,c=se(e,`system.miracle.${s}`)||0;if(l<4)return[];r.push({name:game.i18n.localize("LocalizedIDs.miracle"),value:2+c,type:a,selected:!1});let m=game.i18n.localize("LocalizedIDs.miracleMight");l>=6&&F.hasAbility(e,m)&&r.push({name:m,value:3+c,type:a,selected:!1})}return r}static getSkZkModifier(e,t){let a=[],s=[],i=["spell","liturgy","ceremony","ritual"].includes(t.type)&&t.system.effectFormula.value.trim()=="";game.user.targets.size&&game.user.targets.forEach(n=>{if(n.actor){let r=0;i&&(r=x.detectCreatureType(n.actor).reduce((d,p)=>d+p.spellResistanceModifier(n.actor),0));let l=se(n.actor,`system.status.soulpower.${t.type}resist`)||0,c=se(n.actor,`system.status.toughness.${t.type}resist`)||0;a.push((n.actor.system.status.soulpower.max+l)*-1-r),s.push((n.actor.system.status.toughness.max+c)*-1-r)}}),ue(e,{SKModifier:a.length>0?Math.min(...a):0,ZKModifier:s.length>0?Math.min(...s):0})}static async _onCreateOperation(e,t,a){for(let s of e)s.actor&&await O.postUpdateConditions(s.actor);return super._onCreateOperation(e,t,a)}static async _onUpdateOperation(e,t,a){for(let s of e)s.actor&&await O.postUpdateConditions(s.actor);return super._onUpdateOperation(e,t,a)}static async _onDeleteOperation(e,t,a){for(let s of e)s.actor&&await O.postUpdateConditions(s.actor);return super._onDeleteOperation(e,t,a)}static parseEffect(e,t){let a={},s=new RegExp(game.i18n.localize("CHARAbbrev.GS"),"gi");for(let i of e.split(/,|;/).map(n=>n.trim())){let n=i.replace(/(\s+)/g," ").trim().split(" ");if(n[0]=n[0].replace(s,t.system.status.speed.max),n.length==2&&(!isNaN(n[0])||/(=)?[+-]\d([+-]\d)?/.test(n[0])||/(=)?\d[dDwW]\d/.test(n[0])||/=\d+/.test(n[0])||/\*\d(\.\d)*/.test(n[0]))){let r=n[1].toLowerCase();a[r]==null&&(a[r]=[]),a[r].push(n[0])}}return a}static getDefenseMalus(e,t){let a=!1;if(t.flags.oppose){let s=game.messages.get(t.flags.oppose.messageId),i=s.flags.data.preData;a=!(se(i,"source.type")=="meleeweapon"||se(i,"source.system.traitType.value")=="meleeAttack");let n=/ \[(-)?\d{1,}\]/;for(let r of i.situationalModifiers)r.dmmalus!=null&&r.dmmalus!=0?e.push({name:`${game.i18n.localize("MODS.defenseMalus")} - ${r.name.replace(n,"")}`,value:r.dmmalus,selected:!0}):r.type=="defenseMalus"&&r.value!=0&&e.push({name:r.name.replace(n,""),value:r.value,selected:!0});s.flags.data.postData.halfDefense&&e.push({name:`${game.i18n.localize("MODS.defenseMalus")} - ${game.i18n.localize("halfDefenseShort")}`,value:.5,type:"*",selected:!0})}return a}static changeChars(e,t,a,s){e.system.characteristic1.value=t,e.system.characteristic2.value=a,e.system.characteristic3.value=s}static specAbsDataset(e,t,a,s="effect.value"){let i=a=="parry",n=i?["pa"]:["at","tp","dm"],r=n.reduce((m,d)=>(m[d]=game.i18n.localize(`LocalizedAbilityModifiers.${d}`),m),{}),l=[],c=i?(m,d)=>m.pa!=0:(m,d)=>m.at!=0||m.tp!=0||m.dm!=0||d.effects.size>0;for(let m of e){let d=o.parseEffect(se(m.system,s),t),p=["","2","3"].filter(h=>se(m,`system.effect.value${h}`)).length,f=n.reduce((h,y)=>(h[y]=d[r[y]]||[0],h),{});if(c(f,m)){let h=game.i18n.localize(b.combatSkillSubCategories[m.system.category.sub]);l.push({name:m.name,atbonus:f.at||[0],pabonus:f.pa||[0],tpbonus:f.tp||[0],dmmalus:f.dm||[0],steps:m.system.step.value,category:{id:m.system.category.sub,css:`ab_${m.system.category.sub}`,name:h},id:m.id,actor:t.id,variantCount:p})}}return l}static buildCombatSpecAbs(e,t,a,s,i){let n=u(()=>!0,"searchFilter");a&&(a.push(game.i18n.localize("LocalizedIDs.all")),a=a.map(f=>f.toLowerCase()),n=u((f,h)=>f.system.list.value.split(/;|,/).map(y=>y.trim().toLowerCase()).some(y=>h.includes(y.replace(/ \([a-zA-Z äüöÄÖÜ]*\)/,""))),"searchFilter"));let r=game.combat?.isBrawling?()=>!0:f=>Number(f.system.category.sub)!=5,l=new Set([]),c=new Set([]),m={};for(let f of i.effects||[])if(Me.realyRealyEnabled(f)){for(let h of f.changes)if(h.key.startsWith("self.maneuver.")){let y=g.parseAbilityString(h.value);if(/-$/.test(y.name))c.add(y.name.replace(/-$/,"").trim());else if(/\+$/.test(y.name))l.add(y.name.replace(/\+$/,"").trim());else{let k=h.key.split(".")[2];m[y.name]||(m[y.name]={}),m[y.name][k]||(m[y.name][k]=0),m[y.name][k]+=y.step}}}let d=e.items.filter(f=>f.type=="specialability"&&t.includes(f.system.category.value)&&f.system.effect.value!=""&&(n(f,a)||l.has(f.name))&&r(f)&&!c.has(f.name)),p=this.specAbsDataset(d,e,s);for(let f of p)if(m[f.name])for(let h of Object.keys(m[f.name]))f[h].push(m[f.name][h]);return p}static getCombatSkillModifier(e,t,a){if(t.type=="trait")return;let s=e.items.find(i=>i.type=="combatskill"&&i.name==t.system.combatskill.value);for(let i of s.effects)for(let n of i.changes)switch(n.key){case"system.rangeStats.defenseMalus":case"system.meleeStats.defenseMalus":a.push({name:`${s.name} - ${game.i18n.localize("MODS.defenseMalus")}`,value:n.value*-1,type:"defenseMalus",selected:!0});break}}static attackStatEffect(e,t){t!=0&&(t=isNaN(t)?t:Number(t),e.push({name:game.i18n.localize("statuseffects"),value:t,selected:!0}))}static getTargetSizeAndModifier(e,t,a){let s="average";return game.user.targets.forEach(i=>{if(i.actor){let n=se(i.actor,"system.status.size.value");n&&(s=n),x.addCreatureTypeModifiers(i.actor,t,a,e),this.checkDuplicatus(e,i.actor,a)}}),s}static checkDuplicatus(e,t,a){let s=se(t,"system.extra.duplicatus"),i=x.detectCreatureType(e).some(n=>n.spellImmunities.includes("Illusion"));s&&a.push({name:`Duplicatus - ${game.i18n.localize("doppelganger")}`,value:s,selected:!i,type:"effect",source:"Duplicatus"})}static prepareRangeAttack(e,t,a,s,i,n,r=void 0){e.push(...P.getVantageAsModifier(t,game.i18n.localize("LocalizedIDs.restrictedSenseSight"),-2)),this.getCombatSkillModifier(t,s,e);let l=this.getTargetSizeAndModifier(t,s,e),c=Number(t.system.rangeStats.defenseMalus)*-1;c!=0&&e.push({name:`${game.i18n.localize("statuseffects")} - ${game.i18n.localize("MODS.defenseMalus")}`,value:c,type:"defenseMalus",selected:!0});let m=new Set(["short","medium","long","rangesense","extreme"]);m.delete(P.hasVantage(t,game.i18n.localize("LocalizedIDs.senseOfRange"))?"long":"rangesense"),F.hasAbility(t,game.i18n.localize("LocalizedIDs.extremeShot"))||m.delete("extreme");let d=F.hasAbility(t,game.i18n.localize("LocalizedIDs.drivingArcher")),p=F.hasAbility(t,game.i18n.localize("LocalizedIDs.mountedArcher")),f;p&&H.isRiding(t)?f=He(b.mountedRangeOptionsSpecAb):d?f=He(b.drivingArcherOptions):f=He(b.mountedRangeOptions);let h={};for(let y of Object.keys(f))h[`${game.i18n.localize("mountedRangeOptions."+y)} (${f[y]})`]=f[y];this.swarmModifiers(t,"attack",e),ue(a,{rangeOptions:m,rangeDistance:Array.from(m)[ne.distanceModifier(game.canvas.tokens.get(i),s,r)],visionOptions:b.rangeVision,mountedOptions:h,shooterMovementOptions:b.shooterMovementOptions,targetMovementOptions:b.targetMomevementOptions,targetSize:l,combatSpecAbs:n})}static swarmModifiers(e,t,a){e.system.swarm?.count>1&&(t=="attack"?a.push({name:`${game.i18n.localize("swarm.name")} - ${game.i18n.localize("MODS.defenseMalus")}`,value:e.system.swarm.parry,type:"defenseMalus",selected:!0},{name:`${game.i18n.localize("swarm.name")} - ${game.i18n.localize("CHARAbbrev.AT")}`,value:e.system.swarm.attack,selected:!0},{name:`${game.i18n.localize("swarm.name")} - ${game.i18n.localize("CHARAbbrev.damage")}`,value:e.system.swarm.damage,type:"dmg",selected:!0}):a.push({name:`${game.i18n.localize("swarm.name")} - ${game.i18n.localize("CHARAbbrev.PA")}`,value:e.system.swarm.parry,selected:!0}))}static prepareMeleeAttack(e,t,a,s,i,n){let r="short";game.user.targets.forEach(m=>{if(m.actor){for(let d of m.actor.items)if((d.type=="meleeweapon"&&d.system.worn.value||d.type=="trait"&&d.system.traitType.value=="meleeAttack"&&d.system.pa)&&(b.meleeRangesArray.indexOf(d.system.reach.value)>b.meleeRangesArray.indexOf(r)&&(r=d.system.reach.value),r=="long"))break}});let l=this.getTargetSizeAndModifier(t,s,e);this.getCombatSkillModifier(t,s,e);let c=Number(t.system.meleeStats.defenseMalus)*-1;c!=0&&e.push({name:`${game.i18n.localize("statuseffects")} - ${game.i18n.localize("MODS.defenseMalus")}`,value:c,type:"defenseMalus",selected:!0}),this.swarmModifiers(t,"attack",e),ue(a,{visionOptions:b.meleeRangeVision(a.mode),weaponSizes:b.meleeRanges,melee:!0,showAttack:!0,targetWeaponSize:r,combatSpecAbs:i,meleeSizeOptions:b.meleeSizeCategories,targetSize:l,constricted:t.hasCondition("constricted"),wrongHandDisabled:n,offHand:!n&&se(s,"system.worn.offHand")})}static prepareMeleeParry(e,t,a,s,i,n){let r=o.getDefenseMalus(e,t);this.swarmModifiers(t,"parry",e),ue(a,{visionOptions:b.meleeRangeVision(a.mode),showDefense:!0,isRangeDefense:r,wrongHandDisabled:n&&se(s,"system.worn.offHand"),offHand:!n&&se(s,"system.worn.offHand")&&!N.isShield(s),melee:!0,combatSpecAbs:i,constricted:t.hasCondition("constricted")})}static _chatLineHelper(e,t){return`${game.i18n.localize(e)}: ${t||"-"}`}static setupDialog(e,t,a,s,i){return null}setupEffect(e,t={},a){return o.getSubClass(this.type).setupDialog(e,t,this,this.parent,a)}static checkEquality(e,t){return t.type==e.type&&e.name==t.name&&e.system.description?.value==t.system.description?.value}static async combineItem(e,t,a,s=!0){return e=He(e),e.system.quantity.value+=t.system.quantity.value,await a.updateEmbeddedDocuments("Item",[e],{render:s})}static areEquals(e,t){return e.type!=t.type||e.id==t.id?!1:o.getSubClass(e.type).checkEquality(e,t)}static async stackItems(e,t,a,s=!0){return await o.getSubClass(e.type).combineItem(e,t,a,s)}_setupCardOptions(e,t,a){let s=ChatMessage.getSpeaker();return{speaker:{alias:s.alias,scene:s.scene},flags:{img:s.token?canvas.tokens.get(s.token).document.img:this.img},title:t,template:e}}async itemTest({testData:e,cardOptions:t},a={}){e=await R.rollDices(e,t);let s=await R.rollTest(e);if(s.postFunction="itemTest",game.user.targets.size){t.isOpposedTest=e.opposable;let i=` - ${game.i18n.localize("Opposed")}`;t.isOpposedTest&&t.title.match(i+"$")!=i&&(t.title+=i)}return a.suppressMessage||R.renderRollCard(t,s,a.rerenderMessage),{result:s,cardOptions:t}}static chatData(e,t){return[]}static getSubClass(e){return game.dsa5.config.ItemSubclasses[e]||o}async postItem(){o.getSubClass(this.type)._postItem(this)}static async _postItem(e){let t=He(e),a=se(t,"system.obfuscation.details"),s=se(t,"system.obfuscation.description");if(ue(t,{properties:a?[]:o.getSubClass(e.type).chatData(He(t.system),e.name),descriptionObfuscated:s}),t.hasPrice="price"in t.system&&!a,t.hasPrice){let r=t.system.price.value;t.system.QL&&(r=o.getSubClass(t.type).consumablePrice(t));let l=await Q._moneyToString(r);t.properties.push(`${game.i18n.localize("price")}: ${l}`)}e.pack&&(t.itemLink=e.link),t.img.includes("/blank.webp")&&(t.img=null);let i=await renderTemplate("systems/dsa5/templates/chat/post-item.html",t),n=g.chatDataSetup(i);ChatMessage.create(n)}},ws=class extends D{static{u(this,"PlantItemDSA5")}static chatData(e,t){return[this._chatLineHelper("effect",e.effect),this._chatLineHelper("PLANT.recipes",e.recipes),this._chatLineHelper("PLANT.usages",e.usages)]}},vs=class extends D{static{u(this,"MagicalSignItemDSA5")}static chatData(e,t){let a=[this._chatLineHelper("AsPCost",e.asp)];return e.category==2&&a.push(this._chatLineHelper("feature",e.feature)),a}},Ts=class extends D{static{u(this,"DemonmarkItemDSA5")}static chatData(e,t){return[this._chatLineHelper("attributes",e.attribute),this._chatLineHelper("skills",e.skills),this._chatLineHelper("domains",e.domain)]}},Ss=class extends D{static{u(this,"TrapItemDSA5")}static chatData(e,t){return[]}},As=class extends D{static{u(this,"PatronItemDSA5")}static chatData(e,t){return[this._chatLineHelper("skills",e.talents),this._chatLineHelper("culture",e.culture),this._chatLineHelper("Category",game.i18n.localize(`PATRON.${e.category}`))]}},Cs=class extends D{static{u(this,"MoneyItemDSA5")}static checkEquality(e,t){return t.type==e.type&&game.i18n.localize(e.name)==game.i18n.localize(t.name)&&e.system.description?.value==t.system.description?.value}},Ds=class extends D{static{u(this,"AggregatedTestItemDSA5")}static async _postItem(e){let t="",a=game.i18n.localize("Ongoing");e.system.cummulatedQS.value>=10?(a=game.i18n.localize("Success"),t=`${await TextEditor.enrichHTML(e.system.partsuccess,{secrets:this.isOwner,async:!0})}${await TextEditor.enrichHTML(e.system.success,{secrets:this.isOwner,async:!0})}`):e.system.cummulatedQS.value>=6?(a=game.i18n.localize("PartSuccess"),t=`${await TextEditor.enrichHTML(e.system.partsuccess,{secrets:this.isOwner,async:!0})}`):e.system.allowedTestCount.value-e.system.usedTestCount.value<=0&&(a=game.i18n.localize("Failure"));let s=[this._chatLineHelper("cummulatedQS",`${e.system.cummulatedQS.value} / 10`),this._chatLineHelper("interval",e.system.interval.value),this._chatLineHelper("probes",`${e.system.usedTestCount.value} / ${e.system.allowedTestCount.value}`),this._chatLineHelper("result",a),t],i=se(e,"system.obfuscation.description"),n=await renderTemplate("systems/dsa5/templates/chat/aggregatedTestResult.html",{descriptionObfuscated:i,item:e,properties:s}),r=g.chatDataSetup(n);ChatMessage.create(r)}},Ms=class extends D{static{u(this,"AmmunitionItemDSA5")}static chatData(e,t){return[this._chatLineHelper("ammunitiongroup",game.i18n.localize(e.ammunitiongroup.value))]}},Is=class extends D{static{u(this,"EffectWrapperItemDSA5")}},Es=class extends D{static{u(this,"ArmorItemDSA5")}static chatData(e,t){let a=[this._chatLineHelper("protection",e.protection.value),this._chatLineHelper("encumbrance",e.encumbrance.value)];return e.effect.value!=""&&a.push(this._chatLineHelper("effect",e.effect.value)),a}},ra=class extends D{static{u(this,"CantripItemDSA5")}static chatData(e,t){return[this._chatLineHelper("duration",e.duration.value),this._chatLineHelper("targetCategory",e.targetCategory.value),this._chatLineHelper("feature",e.feature.value)]}},$s=class extends ra{static{u(this,"BlessingItemDSA5")}},Et=class o extends D{static{u(this,"SpellItemDSA5")}static chatData(e,t){return[this._chatLineHelper("castingTime",e.castingTime.value),this._chatLineHelper("AsPCost",e.AsPCost.value),this._chatLineHelper("distribution",e.distribution.value),this._chatLineHelper("duration",e.duration.value),this._chatLineHelper("reach",e.range.value),this._chatLineHelper("targetCategory",e.targetCategory.value),this._chatLineHelper("effect",g.replaceConditions(g.replaceDies(e.effect.value)))]}static async getCallbackData(e,t,a){e.testDifficulty=0,e.situationalModifiers=O._parseModifiers(t);let s=new FormDataExtended(t.find("form")[0]).object;e.calculatedSpellModifiers={castingTime:t.find(".castingTime").text(),cost:t.find(".aspcost").text(),reach:t.find(".reach").text(),maintainCost:t.find(".maintainCost").text()},e.situationalModifiers.push({name:game.i18n.localize("removeGesture"),value:Number(s.removeGesture)||0},{name:game.i18n.localize("removeFormula"),value:Number(s.removeFormula)||0},{name:game.i18n.localize("castingTime"),value:t.find(".castingTime").data("mod")},{name:game.i18n.localize("cost"),value:t.find(".aspcost").data("mod")},{name:game.i18n.localize("reach"),value:t.find(".reach").data("mod")},{name:game.i18n.localize("zkModifier"),value:s.zkModifier||0},{name:game.i18n.localize("skModifier"),value:s.skModifier||0},{name:game.i18n.localize("maintainedSpells"),value:s.maintainedSpells*-1}),e.extensions=o.getSpecAbModifiers(t),e.advancedModifiers={chars:[0,1,2].map(i=>s[`ch${i}`]),fws:s.fw,qls:s.qs},D.changeChars(e.source,...[0,1,2].map(i=>s[`characteristics${i}`])),await this.applyExtensions(e.source,e.extensions,a)}static async applyExtensions(e,t,a){N.ensureNumber(e);let s=Object.keys(Se.rollModifiers).map(i=>`${i}.mod`);for(let i of t){let n=fromUuidSync(i.uuid);if(n)for(let r of n.effects)for(let l of r.changes)Se.rollChanges.includes(l.key)||s.includes(l.key)||(l.key=="macro.transform"?await g.callItemTransformationMacro(l.value,e,r):r.apply(e,l))}}static getSpecAbModifiers(e){let t=[];for(let a of e.find(".specAbs.active"))t.push({name:a.dataset.name,title:a.dataset.tooltip,uuid:a.dataset.uuid});return t}static attackSpellMalus(e){let t=[];return e.system.effectFormula.value&&t.push({name:game.i18n.localize("MODS.defenseMalus"),value:-4,type:"defenseMalus",selected:!0,source:e.name}),t}static getPropertyModifiers(e,t){let a=["ceremony","liturgy"].includes(t.type),s=(se(t,"system.feature")||"").replace(/\(a-z äöü-\)/gi,"").split(",").map(c=>c.trim()),i=[],n=a?"KaPCost":"AsPCost",r=["FP","step","QL","TPM","FW",n];for(let c of r){let m=c=="step"?"":c,d=se(e.system.skillModifiers,`feature.${c}`);i.push(...d.filter(p=>s.includes(p.target)).map(p=>({name:p.source,value:p.value,type:m,source:p.source})))}let l=se(e.system.skillModifiers,`conditional.${n}`);return i.push(...l.map(c=>({name:c.target,value:c.value,source:c.source,type:n}))),i}static foreignSpellModifier(e,t,a,s){if(game.settings.get("dsa5","enableForeignSpellModifer")&&["npc","character"].includes(e.type)&&["spell","ritual"].includes(t.type)){let i=t.system.distribution.value.split(",").map(l=>l.trim().toLowerCase()),n=new RegExp(`(${game.i18n.localize("tradition")}|\\)|\\()`,"g"),r=e.system.tradition.magical.replace(n,"").split(",").map(l=>l.trim().toLowerCase());r.push(game.i18n.localize("general").toLowerCase()),s.isForeign=!i.some(l=>r.includes(l)),s.isForeign&&a.push({name:game.i18n.localize("DSASETTINGS.enableForeignSpellModifer"),value:-2,selected:!0})}}static getSituationalModifiers(e,t,a,s){e.push(...te.getTalentBonus(t,s.name,["advantage","disadvantage","specialability","equipment"]),...P.getVantageAsModifier(t,game.i18n.localize("LocalizedIDs.magicalAttunement"),1,!0),...P.getVantageAsModifier(t,game.i18n.localize("LocalizedIDs.magicalRestriction"),-1,!0),...P.getVantageAsModifier(t,game.i18n.localize("LocalizedIDs.boundToArtifact"),-1,!0),...this.getPropertyModifiers(t,s),...this.attackSpellMalus(s)),this.foreignSpellModifier(t,s,e,a),game.user.targets.size&&game.user.targets.forEach(i=>{i.actor&&(x.addCreatureTypeModifiers(i.actor,s,e,t),this.checkDuplicatus(t,i.actor,e))}),e.push(...t.getSkillModifier(s.name,s.type));for(let i of t.system.skillModifiers.global)e.push({name:i.source,value:i.value});this.getSkZkModifier(a,s)}static setupDialog(e,t,a,s,i){let n="spell";["ceremony","liturgy"].includes(a.type)&&(n="liturgy");let r=`${a.name} ${game.i18n.localize(`${a.type}Test`)}${t.subtitle||""}`,l={opposable:a.system.effectFormula.value.length>0,source:a,extra:{actor:s.toObject(!1),options:t,speaker:D.buildSpeaker(s,i)},advancedModifiers:{chars:[0,0,0],fws:0,qls:0},calculatedSpellModifiers:{castingTime:0,cost:0,reach:0,maintainCost:0}},c={rollMode:t.rollMode,spellCost:a.system.AsPCost.value,maintainCost:a.system.maintainCost.value,spellCastingTime:a.system.castingTime.value,spellReach:a.system.range.value,canChangeCost:a.system.canChangeCost.value=="true",canChangeRange:a.system.canChangeRange.value=="true",canChangeCastingTime:a.system.canChangeCastingTime.value=="true",hasSKModifier:a.system.resistanceModifier.value=="SK",hasZKModifier:a.system.resistanceModifier.value=="ZK",maxMods:Math.floor(Number(a.system.talentValue.value)/4),extensions:this.prepareExtensions(s,a),variableBaseCost:a.system.variableBaseCost=="true",characteristics:[1,2,3].map(f=>a.system[`characteristic${f}`].value)},m=s?z.getRollModifiers(s,a):[];this.getSituationalModifiers(m,s,c,a),c.situationalModifiers=m;let d={title:r,template:`systems/dsa5/templates/dialog/${n}-enhanced-dialog.html`,data:c,callback:u(async(f,h={})=>(p.rollMode=f.find('[name="rollMode"]:checked').val(),await this.getCallbackData(l,f,s),ue(l.extra.options,h),{testData:l,cardOptions:p}),"callback")},p=s._setupCardOptions("systems/dsa5/templates/chat/roll/spell-card.html",r,i);return R.setupDialog({dialogOptions:d,testData:l,cardOptions:p})}static prepareExtensions(e,t){return e.items.filter(a=>a.type=="spellextension"&&a.system.source==t.name&&a.system.category==t.type).map(a=>(a.shortName=a.name.split(" - ").length>1?a.name.split(" - ")[1]:a.name,a.descr=$(a.system.description.value).text()||"",a))}},oa=class extends Et{static{u(this,"LiturgyItemDSA5")}static chatData(e,t){return[this._chatLineHelper("castingTime",e.castingTime.value),this._chatLineHelper("KaPCost",e.AsPCost.value),this._chatLineHelper("distribution",e.distribution.value),this._chatLineHelper("duration",e.duration.value),this._chatLineHelper("reach",e.range.value),this._chatLineHelper("targetCategory",e.targetCategory.value),this._chatLineHelper("effect",g.replaceConditions(g.replaceDies(e.effect.value)))]}},Os=class extends oa{static{u(this,"CeremonyItemDSA5")}static getCallbackData(e,t,a){super.getCallbackData(e,t,a),e.situationalModifiers.push({name:game.i18n.localize("CEREMONYMODIFIER.artefact"),value:t.find('[name="artefactUsage"]').is(":checked")?1:0},{name:game.i18n.localize("place"),value:t.find('[name="placeModifier"]').val()},{name:game.i18n.localize("time"),value:t.find('[name="timeModifier"]').val()})}static getSituationalModifiers(e,t,a,s){super.getSituationalModifiers(e,t,a,s),ue(a,{isCeremony:!0,locationModifiers:b.ceremonyLocationModifiers,timeModifiers:b.ceremonyTimeModifiers})}},xs=class extends D{static{u(this,"CombatskillDSA5")}static chatData(e,t){return[this._chatLineHelper("Description",game.i18n.localize(`Combatskilldescr.${t}`))]}static setupDialog(e,t,a,s,i){let n=t.mode,r=a.name+" "+game.i18n.localize(n+"test"),l={opposable:!0,source:a,mode:n,extra:{actor:s.toObject(!1),options:t,speaker:D.buildSpeaker(s,i)}},c={title:r,template:"systems/dsa5/templates/dialog/combatskill-dialog.html",data:{rollMode:t.rollMode},callback:u((d,p={})=>(m.rollMode=d.find('[name="rollMode"]:checked').val(),l.situationalModifiers=O._parseModifiers(d),ue(l.extra.options,p),{testData:l,cardOptions:m}),"callback")},m=s._setupCardOptions("systems/dsa5/templates/chat/roll/combatskill-card.html",r,i);return R.setupDialog({dialogOptions:c,testData:l,cardOptions:m})}},zs=class extends D{static{u(this,"ConsumableItemDSA")}static chatData(e,t){return[this._chatLineHelper("qualityStep",e.QL),this._chatLineHelper("effect",g.replaceDies(e.QLList.split(` `)[e.QL-1])),this._chatLineHelper("charges",e.charges)]}static consumablePrice(e){let t=e.system.price.value;if(isNaN(t)){let a=t.split(";");return t=Number(a[e.system.QL-1]),isNaN(t)&&(t=Number(a.pop())||0),t}else return Number(t)*e.system.QL||0}static checkEquality(e,t){return e.type==t.type&&e.name==t.name&&e.system.description.value==t.system.description.value&&e.system.QL==t.system.QL}static async setupDialog(e,t,a,s,i){if(!a.isOwned)return;if((a.system.quantity.value-1)*a.system.maxCharges+a.system.charges<=0){ui.notifications.error("DSAError.NotEnoughCharges",{localize:!0});return}let r=a.system.charges<=1?a.system.maxCharges:a.system.charges-1,l=a.system.charges<=1?a.system.quantity.value-1:a.system.quantity.value,c=g.replaceDies(a.system.QLList.split(` -`)[a.system.QL-1],!1),m=await renderTemplate("systems/dsa5/templates/chat/consumable-used.html",{item:a,effect:c,hasAreaTemplate:a.system.target&&a.system.target.type in b.areaTargetTypes});l==0?await a.actor.deleteEmbeddedDocuments("Item",[a.id]):await a.update({"system.quantity.value":l,"system.charges":r});let d=g.chatDataSetup(m);d["flags.data"]={preData:{source:a.toObject(),extra:{speaker:C.buildSpeaker(s,i)}},postData:{qualityStep:a.system.QL}},await ChatMessage.create(d),await this._applyActiveEffect(a)}static async _applyActiveEffect(e){let t=e.effects.toObject();if(t.length>0){let{msg:a,resistRolls:s,effectNames:i}=await Z.applyAdvancedFunction(e.actor,t,e,{qualityStep:e.system.QL},e.actor),n=`${game.i18n.format("ActiveEffects.appliedEffect",{target:e.actor.token?.name||e.actor.name,source:i.join(", ")})} ${a||""}`;ChatMessage.create(g.chatDataSetup(n))}}static async combineItem(e,t,a,s=!0){e=He(e);let i=(e.system.quantity.value-1)*e.system.maxCharges+e.system.charges,n=(t.system.quantity.value-1)*t.system.maxCharges+t.system.charges,r=Math.floor((i+n)/e.system.maxCharges)+1,l=(i+n)%e.system.maxCharges;return l==0&&(r-=1,l=e.system.maxCharges),e.system.quantity.value=r,e.system.charges=l,await a.updateEmbeddedDocuments("Item",[e],{render:s})}},Ns=class extends C{static{u(this,"InformationItemDSA5")}static async _postItem(e){let t=await renderTemplate("systems/dsa5/templates/chat/informationRequestRoll.html",{item:e});ft.getDialog(t)}},Rs=class extends C{static{u(this,"DiseaseItemDSA5")}static chatData(e,t){return[this._chatLineHelper("stepValue",e.step.value),this._chatLineHelper("incubation",e.incubation.value),this._chatLineHelper("damage",g.replaceConditions(g.replaceDies(e.damage.value))),this._chatLineHelper("duration",e.duration.value),this._chatLineHelper("source",g.replaceDies(e.source.value)),this._chatLineHelper("treatment",e.treatment.value),this._chatLineHelper("antidot",e.antidot.value),this._chatLineHelper("resistanceModifier",e.resistance.value)]}static getSituationalModifiers(e,t,a,s){s=g.toObjectIfPossible(s),game.user.targets.size&&game.user.targets.forEach(i=>{i.actor&&e.push(...P.getVantageAsModifier(i.actor,game.i18n.localize("LocalizedIDs.ResistanttoDisease"),-1,!1,!0))}),this.getSkZkModifier(a,s),ue(a,{hasSKModifier:s.system.resistance.value=="SK",hasZKModifier:s.system.resistance.value=="ZK"})}static setupDialog(e,t,a,s,i){let n=a.name+" "+g.categoryLocalization(a.type)+" "+game.i18n.localize("Test"),r={opposable:!1,source:a,extra:{options:t,speaker:C.buildSpeaker(s,i)}},l={rollMode:t.rollMode},c=[];this.getSituationalModifiers(c,s,l,a),l.situationalModifiers=c,t.manualResistance&&ue(l,t.manualResistance);let m={title:n,template:"systems/dsa5/templates/dialog/poison-dialog.html",data:l,callback:u((p,f={})=>(d.rollMode=p.find('[name="rollMode"]:checked').val(),r.situationalModifiers=O._parseModifiers(p),r.situationalModifiers.push({name:game.i18n.localize("zkModifier"),value:p.find('[name="zkModifier"]').val()||0},{name:game.i18n.localize("skModifier"),value:p.find('[name="skModifier"]').val()||0}),ue(r.extra.options,f),{testData:r,cardOptions:d}),"callback")},d=a._setupCardOptions(`systems/dsa5/templates/chat/roll/${a.type}-card.html`,n,i);return R.setupDialog({dialogOptions:m,testData:r,cardOptions:d})}},Ps=class extends C{static{u(this,"EquipmentItemDSA5")}static chatData(e,t){return[this._chatLineHelper("equipmentType",game.i18n.localize(`Equipment.${e.equipmentType.value}`))]}},$t=class extends C{static{u(this,"WeaponItemDSA5")}static speciesModifier(e,t,a,s){let i=t.type=="creature"?t.system.creatureClass.value:t.system.details.species.value,n=game.i18n.localize(`LocalizedSpecies.${i}`),r=b.speciesCombatModifiers[n];if(r){let l=["attack","parry"].includes(a.mode),m=(se(s,"system.effect.attributes")||"").split(",").map(d=>game.i18n.localize(`LocalizedSpecies.${d.trim()}`)).some(d=>r.opposingDomains.has(d))?1:0;r.combatskills.has(game.i18n.localize(`LocalizedCTs.${s.system.combatskill.value}`))&&(l&&e.push({name:game.i18n.format("speciesModifier",{species:i}),value:-2-m,selected:!0,source:`${game.i18n.localize("TYPES.Item.species")} (${i})`}),e.push({name:`${game.i18n.format("speciesModifier",{species:i})} ${game.i18n.localize("CHARAbbrev.damage")}`,value:-2-m,type:"dmg",selected:!0,source:`${game.i18n.localize("TYPES.Item.species")} (${i})`}))}}static weaponModifiers(e,t,a){for(let s of t.effects||[])if(Me.realyRealyEnabled(s)){for(let i of s.changes)if(i.key==`self.situational.${a}`){let n={damage:"dmg"}[a]||"",r=`${i.value}`.split(" "),l,c=[s.name];r.length>1?(l=Number(r.pop()),c.push(r.join(" "))):l=Number(r[0]),e.push({name:c.join(" - "),value:l,source:t.name,type:n})}}}},Ls=class o extends $t{static{u(this,"MeleeweaponDSA5")}static chatData(e,t){let a=[this._chatLineHelper("damage",e.damage.value),this._chatLineHelper("atmod",e.atmod.value),this._chatLineHelper("pamod",e.pamod.value),this._chatLineHelper("reach",game.i18n.localize(`Range-${e.reach.value}`)),this._chatLineHelper("TYPES.Item.combatskill",e.combatskill.value)];return e.effect.value!=""&&a.push(this._chatLineHelper(g.replaceConditions("effect",e.effect.value))),a}static getSituationalModifiers(e,t,a,s){let i=P.hasVantage(t,game.i18n.localize("LocalizedIDs.ambidextrous"));s=g.toObjectIfPossible(s);let n=[s.system.combatskill.value],r=C.buildCombatSpecAbs(t,["Combat"],n,a.mode,s);a.mode=="attack"?(this.prepareMeleeAttack(e,t,a,s,r,i),this.weaponModifiers(e,s,"damage")):a.mode=="parry"&&this.prepareMeleeParry(e,t,a,s,r,i),this.weaponModifiers(e,s,a.mode),this.attackStatEffect(e,t.system.meleeStats[a.mode]),this.speciesModifier(e,t,a,s),["attack","parry"].includes(a.mode)&&e.push(...o.getMiracleModifiers(t,{name:s.system.combatskill.value},"",a.mode),...t.getCombatEffectSkillModifier(s.system.combatskill.value,a.mode))}static setupDialog(e,t,a,s,i){let n=t.mode,r=`${a.name} ${game.i18n.localize(n+"test")}`,l={opposable:t.mode!="parry",source:a,mode:n,extra:{actor:s.toObject(!1),options:t,speaker:C.buildSpeaker(s,i)}},c=N.multipleDefenseValue(s,g.toObjectIfPossible(a)),m={rollMode:t.rollMode,mode:n,defenseCountString:game.i18n.format("defenseCount",{malus:c}),multipleDefenseValue:c},d=s?z.getRollModifiers(s,a,{mode:n}):[];this.getSituationalModifiers(d,s,m,a),m.situationalModifiers=d,t.situationalModifiers&&m.situationalModifiers.push(...t.situationalModifiers);let p={title:r,template:"systems/dsa5/templates/dialog/combatskill-enhanced-dialog.html",data:m,callback:u((h,y={})=>(fe.resolveMeleeDialog(l,f,h,s,y,c,n),Hooks.call("callbackDialogCombatDSA5",l,s,h,a,i),l.isRangeDefense=m.isRangeDefense,{testData:l,cardOptions:f}),"callback")},f=s._setupCardOptions("systems/dsa5/templates/chat/roll/combatskill-card.html",r,i);return R.setupDialog({dialogOptions:p,testData:l,cardOptions:f})}},_s=class extends C{static{u(this,"PoisonItemDSA5")}static chatData(e,t){return[this._chatLineHelper("stepValue",e.step.value),this._chatLineHelper("poisonType",e.poisonType.value),this._chatLineHelper("start",e.start.value),this._chatLineHelper("duration",e.duration.value),this._chatLineHelper("resistanceModifier",e.resistance.value),this._chatLineHelper("effect",g.replaceConditions(g.replaceDies(e.effect.value)))]}static getSituationalModifiers(e,t,a,s){s=g.toObjectIfPossible(s),game.user.targets.size&&game.user.targets.forEach(i=>{i.actor&&e.push(...P.getVantageAsModifier(i.actor,game.i18n.localize("LocalizedIDs.poisonResistance"),-1,!1,!0))}),this.getSkZkModifier(a,s),ue(a,{hasSKModifier:s.system.resistance.value=="SK",hasZKModifier:s.system.resistance.value=="ZK"})}static setupDialog(e,t,a,s,i){let n=a.name+" "+g.categoryLocalization(a.type)+" "+game.i18n.localize("Test"),r={opposable:!1,source:a,extra:{options:t,speaker:C.buildSpeaker(s,i)}},l={rollMode:t.rollMode},c=[];this.getSituationalModifiers(c,s,l,a),l.situationalModifiers=c;let m={title:n,template:"systems/dsa5/templates/dialog/poison-dialog.html",data:l,callback:u((p,f={})=>(d.rollMode=p.find('[name="rollMode"]:checked').val(),r.situationalModifiers=O._parseModifiers(p),r.situationalModifiers.push({name:game.i18n.localize("zkModifier"),value:p.find('[name="zkModifier"]').val()||0},{name:game.i18n.localize("skModifier"),value:p.find('[name="skModifier"]').val()||0}),ue(r.extra.options,f),{testData:r,cardOptions:d}),"callback")},d=a._setupCardOptions(`systems/dsa5/templates/chat/roll/${a.type}-card.html`,n,i);return R.setupDialog({dialogOptions:m,testData:r,cardOptions:d})}},Fs=class o extends $t{static{u(this,"RangeweaponItemDSA5")}static chatData(e,t){let a=[this._chatLineHelper("damage",e.damage.value),this._chatLineHelper("TYPES.Item.combatskill",e.combatskill.value),this._chatLineHelper("reach",e.reach.value)];return e.effect.value!=""&&a.push(this._chatLineHelper(g.replaceConditions("effect",e.effect.value))),a}static getSituationalModifiers(e,t,a,s,i){if(a.mode=="attack"){let n=g.toObjectIfPossible(s),r=[n.system.combatskill.value],l=C.buildCombatSpecAbs(t,["Combat"],r,a.mode,n),c=t.items.get(n.system.currentAmmo.value);if(c){c=c.toObject(!1),n.system.effect.attributes=(n.system.effect.attributes||"").split(",").concat((c.system.effect.attributes||"").split(",")).filter(d=>d!="").join(",");let m=se(c.flags,"dsa5.poison");m&&ue(s.flags,{dsa5:{poison:m}})}if(this.prepareRangeAttack(e,t,a,n,i,l,c),c){if(c.system.atmod&&e.push({name:`${c.name} - ${game.i18n.localize("atmod")}`,value:c.system.atmod,selected:!0,specAbId:n.system.currentAmmo.value}),c.system.damageMod||c.system.armorMod){let m={name:`${c.name} - ${game.i18n.localize("MODS.damage")}`,value:c.system.damageMod.replace(/wWD/g,"d")||0,type:"dmg",selected:!0,specAbId:n.system.currentAmmo.value};c.system.armorMod&&(m.armorPen=c.system.armorMod),e.push(m)}c.effects.length&&e.push({name:`${c.name} - ${game.i18n.localize("TYPES.Item.ammunition")}`,value:1,type:"effect",selected:!0,specAbId:n.system.currentAmmo.value})}this.weaponModifiers(e,n,"attack"),this.weaponModifiers(e,n,"damage"),e.push(...o.getMiracleModifiers(t,{name:n.system.combatskill.value},"",a.mode),...t.getCombatEffectSkillModifier(n.system.combatskill.value,a.mode))}this.attackStatEffect(e,t.system.rangeStats[a.mode]),this.speciesModifier(e,t,a,s)}static async checkAmmunitionState(e,t,a,s){let i=!0;if(s!="damage"){let n=e.system;if(n.ammunitiongroup.value!="infinite")if(n.ammunitiongroup.value=="-")t.extra.ammo=He(e),i=t.extra.ammo.system.quantity.value>0;else{let r=a.items.get(n.currentAmmo.value);r?(t.extra.ammo=r.toObject(),n.ammunitiongroup.value=="mag"?i=t.extra.ammo.system.quantity.value>1||t.extra.ammo.system.mag.value>0&&t.extra.ammo.system.quantity.value>0:i=t.extra.ammo.system.quantity.value>0):i=!1}!i&&a.type=="creature"&&(i=!0)}return i||ui.notifications.error("DSAError.NoAmmo",{localize:!0}),i}static async setupDialog(e,t,a,s,i){let n=t.mode,r=a.name+" "+game.i18n.localize(n+"test"),l={opposable:t.mode!="parry",source:a,mode:n,extra:{actor:s.toObject(!1),options:t,speaker:C.buildSpeaker(s,i)}};if(!await this.checkAmmunitionState(a,l,s,n))return;let c={rollMode:t.rollMode,mode:n},m=s?z.getRollModifiers(s,a,{mode:n}):[];this.getSituationalModifiers(m,s,c,a,i),c.situationalModifiers=m,t.situationalModifiers&&c.situationalModifiers.push(...t.situationalModifiers);let d={title:r,template:"systems/dsa5/templates/dialog/combatskill-enhanced-dialog.html",data:c,callback:u((f,h={})=>(fe.resolveRangeDialog(l,p,f,s,h),Hooks.call("callbackDialogCombatDSA5",l,s,f,a,i),{testData:l,cardOptions:p}),"callback")},p=s._setupCardOptions("systems/dsa5/templates/chat/roll/combatskill-card.html",r,i);return R.setupDialog({dialogOptions:d,testData:l,cardOptions:p})}},Hs=class extends Et{static{u(this,"RitualItemDSA5")}static getCallbackData(e,t,a){super.getCallbackData(e,t,a),e.situationalModifiers.push({name:game.i18n.localize("RITUALMODIFIER.rightClothes"),value:t.find('[name="rightClothes"]').is(":checked")?1:0},{name:game.i18n.localize("RITUALMODIFIER.rightEquipment"),value:t.find('[name="rightEquipment"]').is(":checked")?1:0},{name:game.i18n.localize("place"),value:t.find('[name="placeModifier"]').val()},{name:game.i18n.localize("time"),value:t.find('[name="timeModifier"]').val()})}static getSituationalModifiers(e,t,a,s){super.getSituationalModifiers(e,t,a,s),ue(a,{isRitual:!0,locationModifiers:b.ritualLocationModifiers,timeModifiers:b.ritualTimeModifiers})}},js=class extends C{static{u(this,"ApplicationItemDSA5")}static chatData(e,t){let s=game.i18n.has(`APPLICATION.${e.skill} - ${t}`)?game.i18n.localize(`APPLICATION.${e.skill} - ${t}`):e.description.value;return[this._chatLineHelper("Description",s)]}},Gs=class o extends C{static{u(this,"SkillItemDSA5")}static chatData(e,t){let s=game.i18n.has(`SKILLdescr.${t}`)?game.i18n.localize(`SKILLdescr.${t}`):e.description.value;return[this._chatLineHelper("Description",s)]}static getSituationalModifiers(e,t,a,s){e.push(...te.getTalentBonus(t,s.name,["advantage","disadvantage","specialability","equipment"]),...t.getSkillModifier(s.name,s.type),...o.getMiracleModifiers(t,s,"FW","skill"));for(let i of t.system.skillModifiers.global)e.push({name:i.source,value:i.value})}static setupDialog(e,t,a,s,i){let n=a.name+" "+game.i18n.localize("Test")+(t.subtitle||""),r={opposable:!0,source:a,extra:{actor:s.toObject(!1),options:t,speaker:C.buildSpeaker(s,i)}},l={rollMode:t.rollMode,difficultyLabels:b.skillDifficultyLabels,modifier:t.modifier||0,characteristics:[1,2,3].map(d=>a.system[`characteristic${d}`].value),situationalModifiers:s?z.getRollModifiers(s,a):[]};t.situationalModifiers&&l.situationalModifiers.push(...t.situationalModifiers),this.getSituationalModifiers(l.situationalModifiers,s,l,a);let c={title:n,template:"systems/dsa5/templates/dialog/skill-dialog.html",data:l,callback:u((d,p={})=>(m.rollMode=d.find('[name="rollMode"]:checked').val(),r.testDifficulty=b.skillDifficultyModifiers[d.find('[name="testDifficulty"]').val()],r.situationalModifiers=O._parseModifiers(d),r.advancedModifiers={chars:[0,1,2].map(f=>Number(d.find(`[name="ch${f}"]`).val())),fws:Number(d.find('[name="fw"]').val()),qls:Number(d.find('[name="qs"]').val())},C.changeChars(r.source,...[0,1,2].map(f=>d.find(`[name="characteristics${f}"]`).val())),ue(r.extra.options,p),{testData:r,cardOptions:m}),"callback")},m=s._setupCardOptions("systems/dsa5/templates/chat/roll/skill-card.html",n,i);return R.setupDialog({dialogOptions:c,testData:r,cardOptions:m})}},Bs=class extends C{static{u(this,"SpecialAbilityItemDSA5")}static chatData(e,t){return[this._chatLineHelper("rule",e.rule.value)]}},qs=class extends C{static{u(this,"SpeciesItemDSA5")}},Ws=class extends C{static{u(this,"SpellextensionItemDSA5")}static chatData(e,t){return[this._chatLineHelper("source",e.source),this._chatLineHelper("Category",game.i18n.localize(e.category))]}},Us=class extends C{static{u(this,"BookItemDSA5")}static chatData(e,t){return super.chatData(e,t)}},Vs=class extends $t{static{u(this,"TraitItemDSA5")}static chatData(e,t){let a=[];switch(e.traitType.value){case"meleeAttack":a=[this._chatLineHelper("attack",e.at.value),this._chatLineHelper("damage",e.damage.value),this._chatLineHelper("reach",e.reach.value)];break;case"rangeAttack":a=[this._chatLineHelper("attack",e.at.value),this._chatLineHelper("damage",e.damage.value),this._chatLineHelper("reach",e.reach.value),this._chatLineHelper("reloadTime",e.reloadTime.value)];break;case"armor":a=[this._chatLineHelper("protection",e.damage.value)];break;case"general":a=[];break;case"familiar":a=[this._chatLineHelper("APValue",e.APValue.value),this._chatLineHelper("AsPCost",e.AsPCost.value),this._chatLineHelper("duration",e.duration.value),this._chatLineHelper("aspect",e.aspect.value)];break;case"trick":a=[this._chatLineHelper("APValue",e.APValue.value)];break;case"entity":a=[this._chatLineHelper("distribution",e.distribution),this._chatLineHelper("CHARAbbrev.QL",e.AsPCost.value)];break;case"summoning":a=[this._chatLineHelper("distribution",e.distribution),this._chatLineHelper("conjuringDifficulty",e.at.value)];break}return e.effect.value!=""&&a.push(this._chatLineHelper("effect",e.effect.value)),a}static getSituationalModifiers(e,t,a,s,i){s=g.toObjectIfPossible(s);let n=s.system.traitType.value,r=C.buildCombatSpecAbs(t,["Combat","animal"],void 0,a.mode,s);a.mode=="attack"&&n=="meleeAttack"?(this.prepareMeleeAttack(e,t,a,s,r,!1),this.weaponModifiers(e,s,"damage")):a.mode=="attack"&&n=="rangeAttack"?(this.prepareRangeAttack(e,t,a,s,i,r),this.weaponModifiers(e,s,"damage")):a.mode=="parry"&&this.prepareMeleeParry(e,t,a,s,r,!1),this.weaponModifiers(e,s,a.mode),this.attackStatEffect(e,t.system[n=="meleeAttack"?"meleeStats":"rangeStats"][a.mode])}static setupDialog(e,t,a,s,i){let n=t.mode,r=a.name+" "+game.i18n.localize(n+"test"),l={opposable:t.mode!="parry",source:a,mode:n,extra:{actor:s.toObject(!1),options:t,speaker:C.buildSpeaker(s,i)}},c=N.multipleDefenseValue(s,a.toObject()),m={rollMode:t.rollMode,mode:n,defenseCountString:game.i18n.format("defenseCount",{malus:c}),multipleDefenseValue:c},d=se(a,"system.traitType.value"),p=s?z.getRollModifiers(s,a,{mode:n}):[];this.getSituationalModifiers(p,s,m,a,i),m.situationalModifiers=p;let f={title:r,template:"systems/dsa5/templates/dialog/combatskill-enhanced-dialog.html",data:m,callback:u((y,k={})=>(d=="meleeAttack"?fe.resolveMeleeDialog(l,h,y,s,k,c,n):fe.resolveRangeDialog(l,h,y,s,k),l.isRangeDefense=m.isRangeDefense,Hooks.call("callbackDialogCombatDSA5",l,s,y,a,i),{testData:l,cardOptions:h}),"callback")},h=s._setupCardOptions("systems/dsa5/templates/chat/roll/combatskill-card.html",r,i);return R.setupDialog({dialogOptions:f,testData:l,cardOptions:h})}},la=class extends C{static{u(this,"VantageItemDSA5")}static chatData(e,t){return[this._chatLineHelper("effect",e.effect.value)]}};var{mergeObject:Ks,duplicate:Cr,getProperty:ca}=foundry.utils,fe=class o extends de{static{u(this,"DSA5CombatDialog")}static meleeweaponRollModifiers={wrongHand:{mod:-4},advantageousPosition:{mod:2},attackFromBehind:{mod:-4},opportunityAttack:{mod:-4},doubleAttack:{mod:-2},narrowSpace:{mod:0}};static rangeweaponRollModifiers={combatTurmoil:{mod:-2},quickChange:{mod:-4},narrowSpace:{mod:0},targetMovement:{mod:0},RangeMod:{short:{damage:1,attack:2},medium:{damage:0,attack:0},long:{damage:-1,attack:-2},rangesense:{damage:-1,attack:-1},extreme:{damage:-2,attack:-4}},RangeSize:{tiny:{mod:-8},small:{mod:-4},average:{mod:0},big:{mod:4},giant:{mod:8}},aimOptions:{0:{mod:0},1:{mod:2},2:{mod:4}}};static get defaultOptions(){let e=super.defaultOptions;return Ks(e,{width:700,resizable:!0}),e}static setData(e,t,a,s){let i=Cr(o.isMelee(a.source)?o.meleeweaponRollModifiers:o.rangeweaponRollModifiers);if(i.narrowSpace.mod=this.getNarrowSpaceModifier(a,a.mode),s.rangeOptions)for(let l of Object.keys(i.RangeMod))s.rangeOptions.has(l)||delete i.RangeMod[l];let n=foundry.utils.flattenObject(i),r=`${t}RollModifiers`;if(e.system[r]){let l=foundry.utils.flattenObject(foundry.utils.duplicate(e.system[r]));for(let c of Object.keys(n))n[c]+=Number(l[c])||0}for(let l of a.source.effects||[])if(!l.disabled){for(let c of l.changes)if(c.key.startsWith("self."))for(let m of Object.keys(n))c.key==`self.${m}`&&(n[m]+=Number(c.value)||0)}return foundry.utils.expandObject(n)}setCombatSpecTooltip(e){let t=e.dataset,a={pa:t.pabonus,at:t.atbonus,tp:t.tpbonus,dm:t.dmmalus},s=[];t.step>1&&s.push(`${t.step} x `);for(let n of Object.keys(a))a[n]!=0&&s.push(`${game.i18n.localize(`LocalizedAbilityModifiers.${n}`).toUpperCase()}: ${a[n]}`);let i=s.join(" ");$("#tooltip").html(i),e.dataset.tooltip=i}activateListeners(e){super.activateListeners(e);let t=e.find(".specAbs");t.mouseenter(i=>{let n=i.currentTarget;if(this.setCombatSpecTooltip(n),n.getElementsByClassName("hovermenu").length==0){let r=document.createElement("div");r.classList.add("hovermenu");let l=document.createElement("i");l.classList.add("fas","fa-comment"),l.dataset.tooltip="SHEET.PostItem",l.addEventListener("mousedown",this._postItem,!1),r.appendChild(l),n.appendChild(r)}}),t.mouseleave(i=>{let n=i.toElement||i.relatedTarget;n.parentNode==this||n==this||i.currentTarget.querySelectorAll(".hovermenu").forEach(r=>r.remove())}),e.find(".variantChange").mousedown(i=>this.changeSpecAbVariant(i)),e.on("mousedown",".specAbs",i=>{if(e.find(".opportunityAttack").is(":checked")){ui.notifications.error("DSAError.opposedAttackNoSpecAbs",{localize:!0});return}let n=$(i.currentTarget),r=i.currentTarget.dataset,l=Number(r.step),c=Number(r.maxstep),m=Number(r.category);if(i.button==0){if(l=Math.min(c,l+1),[0,1].includes(m)&&game.settings.get("dsa5","limitCombatSpecAbs")){let d=n.siblings(`[data-category="${m}"]`);d.removeClass("active").attr("data-step",0),d.find(".step").text(de.roman[0])}}else i.button==2&&(l=Math.clamp(c,0,l-1));r.step=l,n.toggleClass("active",l>0),n.find(".step").text(de.roman[l]),this.checkCounterAttack(i),this.calculateModifier(),this.setCombatSpecTooltip(i.currentTarget)}),e.find(".opportunityAttack").change(i=>{if($(i.currentTarget).is(":checked"))for(let n of e.find(".specAbs"))$(n).removeClass("active").attr("data-step",0).find(".step").text("")}),e.on("change","input,select",i=>this.calculateModifier(i)),e.find(".modifiers option").mousedown(i=>this.calculateModifier(i)),e.find(".quantity-click").mousedown(i=>this.calculateModifier(i));let a=this.readTargets(),s=this;this.checkTargets=setInterval(function(){a=s.compareTargets(e,a)},500)}checkCounterAttack(e){if(!this.dialogData.mode=="parry")return;let t=g.getSpeaker(this.dialogData.speaker);if(t&&t.items.get(e.currentTarget.dataset.id).name==game.i18n.localize("LocalizedIDs.counterAttack")){this.dialogData.counterAttack=e.button==0,this.prepareWeapon();let s=e.button==0?"attack":"parry",i=t.items.get(this.dialogData.source._id),n=z.getRollModifiers(t,i,{mode:s});if(C.getSubClass(i.type).getSituationalModifiers(n,t,{mode:s},i),s=="attack"){n=n.filter(p=>p.type!="defenseMalus");let l=n.findIndex(p=>p.name==game.i18n.localize("statuseffects")),c;l>=0&&(c=n.splice(l,1).pop());let m=[];C.getSubClass(i.type).getSituationalModifiers(m,t,{mode:"parry"},i),l=m.findIndex(p=>p.name==game.i18n.localize("statuseffects"));let d;l>=0&&(d=m.splice(l,1).pop()),n.unshift(...m),c?(d&&(c.value+=d.value),n.push(c)):d&&n.push(d)}let r=$(this._element).find("[name=situationalModifiers]");if(n.length>0){if(r.length==0){let c=`
+`)[a.system.QL-1],!1),m=await renderTemplate("systems/dsa5/templates/chat/consumable-used.html",{item:a,effect:c,hasAreaTemplate:a.system.target&&a.system.target.type in b.areaTargetTypes});l==0?await a.actor.deleteEmbeddedDocuments("Item",[a.id]):await a.update({"system.quantity.value":l,"system.charges":r});let d=g.chatDataSetup(m);d["flags.data"]={preData:{source:a.toObject(),extra:{speaker:D.buildSpeaker(s,i)}},postData:{qualityStep:a.system.QL}},await ChatMessage.create(d),await this._applyActiveEffect(a)}static async _applyActiveEffect(e){let t=e.effects.toObject();if(t.length>0){let{msg:a,resistRolls:s,effectNames:i}=await Z.applyAdvancedFunction(e.actor,t,e,{qualityStep:e.system.QL},e.actor),n=`${game.i18n.format("ActiveEffects.appliedEffect",{target:e.actor.token?.name||e.actor.name,source:i.join(", ")})} ${a||""}`;ChatMessage.create(g.chatDataSetup(n))}}static async combineItem(e,t,a,s=!0){e=He(e);let i=(e.system.quantity.value-1)*e.system.maxCharges+e.system.charges,n=(t.system.quantity.value-1)*t.system.maxCharges+t.system.charges,r=Math.floor((i+n)/e.system.maxCharges)+1,l=(i+n)%e.system.maxCharges;return l==0&&(r-=1,l=e.system.maxCharges),e.system.quantity.value=r,e.system.charges=l,await a.updateEmbeddedDocuments("Item",[e],{render:s})}},Ns=class extends D{static{u(this,"InformationItemDSA5")}static async _postItem(e){let t=await renderTemplate("systems/dsa5/templates/chat/informationRequestRoll.html",{item:e});ft.getDialog(t)}},Rs=class extends D{static{u(this,"DiseaseItemDSA5")}static chatData(e,t){return[this._chatLineHelper("stepValue",e.step.value),this._chatLineHelper("incubation",e.incubation.value),this._chatLineHelper("damage",g.replaceConditions(g.replaceDies(e.damage.value))),this._chatLineHelper("duration",e.duration.value),this._chatLineHelper("source",g.replaceDies(e.source.value)),this._chatLineHelper("treatment",e.treatment.value),this._chatLineHelper("antidot",e.antidot.value),this._chatLineHelper("resistanceModifier",e.resistance.value)]}static getSituationalModifiers(e,t,a,s){s=g.toObjectIfPossible(s),game.user.targets.size&&game.user.targets.forEach(i=>{i.actor&&e.push(...P.getVantageAsModifier(i.actor,game.i18n.localize("LocalizedIDs.ResistanttoDisease"),-1,!1,!0))}),this.getSkZkModifier(a,s),ue(a,{hasSKModifier:s.system.resistance.value=="SK",hasZKModifier:s.system.resistance.value=="ZK"})}static setupDialog(e,t,a,s,i){let n=a.name+" "+g.categoryLocalization(a.type)+" "+game.i18n.localize("Test"),r={opposable:!1,source:a,extra:{options:t,speaker:D.buildSpeaker(s,i)}},l={rollMode:t.rollMode},c=[];this.getSituationalModifiers(c,s,l,a),l.situationalModifiers=c,t.manualResistance&&ue(l,t.manualResistance);let m={title:n,template:"systems/dsa5/templates/dialog/poison-dialog.html",data:l,callback:u((p,f={})=>(d.rollMode=p.find('[name="rollMode"]:checked').val(),r.situationalModifiers=O._parseModifiers(p),r.situationalModifiers.push({name:game.i18n.localize("zkModifier"),value:p.find('[name="zkModifier"]').val()||0},{name:game.i18n.localize("skModifier"),value:p.find('[name="skModifier"]').val()||0}),ue(r.extra.options,f),{testData:r,cardOptions:d}),"callback")},d=a._setupCardOptions(`systems/dsa5/templates/chat/roll/${a.type}-card.html`,n,i);return R.setupDialog({dialogOptions:m,testData:r,cardOptions:d})}},Ps=class extends D{static{u(this,"EquipmentItemDSA5")}static chatData(e,t){return[this._chatLineHelper("equipmentType",game.i18n.localize(`Equipment.${e.equipmentType.value}`))]}},$t=class extends D{static{u(this,"WeaponItemDSA5")}static speciesModifier(e,t,a,s){let i=t.type=="creature"?t.system.creatureClass.value:t.system.details.species.value,n=game.i18n.localize(`LocalizedSpecies.${i}`),r=b.speciesCombatModifiers[n];if(r){let l=["attack","parry"].includes(a.mode),m=(se(s,"system.effect.attributes")||"").split(",").map(d=>game.i18n.localize(`LocalizedSpecies.${d.trim()}`)).some(d=>r.opposingDomains.has(d))?1:0;r.combatskills.has(game.i18n.localize(`LocalizedCTs.${s.system.combatskill.value}`))&&(l&&e.push({name:game.i18n.format("speciesModifier",{species:i}),value:-2-m,selected:!0,source:`${game.i18n.localize("TYPES.Item.species")} (${i})`}),e.push({name:`${game.i18n.format("speciesModifier",{species:i})} ${game.i18n.localize("CHARAbbrev.damage")}`,value:-2-m,type:"dmg",selected:!0,source:`${game.i18n.localize("TYPES.Item.species")} (${i})`}))}}static weaponModifiers(e,t,a){for(let s of t.effects||[])if(Me.realyRealyEnabled(s)){for(let i of s.changes)if(i.key==`self.situational.${a}`){let n={damage:"dmg"}[a]||"",r=`${i.value}`.split(" "),l,c=[s.name];r.length>1?(l=Number(r.pop()),c.push(r.join(" "))):l=Number(r[0]),e.push({name:c.join(" - "),value:l,source:t.name,type:n})}}}},Ls=class o extends $t{static{u(this,"MeleeweaponDSA5")}static chatData(e,t){let a=[this._chatLineHelper("damage",e.damage.value),this._chatLineHelper("atmod",e.atmod.value),this._chatLineHelper("pamod",e.pamod.value),this._chatLineHelper("reach",game.i18n.localize(`Range-${e.reach.value}`)),this._chatLineHelper("TYPES.Item.combatskill",e.combatskill.value)];return e.effect.value!=""&&a.push(this._chatLineHelper(g.replaceConditions("effect",e.effect.value))),a}static getSituationalModifiers(e,t,a,s){let i=P.hasVantage(t,game.i18n.localize("LocalizedIDs.ambidextrous"));s=g.toObjectIfPossible(s);let n=[s.system.combatskill.value],r=D.buildCombatSpecAbs(t,["Combat"],n,a.mode,s);a.mode=="attack"?(this.prepareMeleeAttack(e,t,a,s,r,i),this.weaponModifiers(e,s,"damage")):a.mode=="parry"&&this.prepareMeleeParry(e,t,a,s,r,i),this.weaponModifiers(e,s,a.mode),this.attackStatEffect(e,t.system.meleeStats[a.mode]),this.speciesModifier(e,t,a,s),["attack","parry"].includes(a.mode)&&e.push(...o.getMiracleModifiers(t,{name:s.system.combatskill.value},"",a.mode),...t.getCombatEffectSkillModifier(s.system.combatskill.value,a.mode))}static setupDialog(e,t,a,s,i){let n=t.mode,r=`${a.name} ${game.i18n.localize(n+"test")}`,l={opposable:t.mode!="parry",source:a,mode:n,extra:{actor:s.toObject(!1),options:t,speaker:D.buildSpeaker(s,i)}},c=N.multipleDefenseValue(s,g.toObjectIfPossible(a)),m={rollMode:t.rollMode,mode:n,defenseCountString:game.i18n.format("defenseCount",{malus:c}),multipleDefenseValue:c},d=s?z.getRollModifiers(s,a,{mode:n}):[];this.getSituationalModifiers(d,s,m,a),m.situationalModifiers=d,t.situationalModifiers&&m.situationalModifiers.push(...t.situationalModifiers);let p={title:r,template:"systems/dsa5/templates/dialog/combatskill-enhanced-dialog.html",data:m,callback:u((h,y={})=>(fe.resolveMeleeDialog(l,f,h,s,y,c,n),Hooks.call("callbackDialogCombatDSA5",l,s,h,a,i),l.isRangeDefense=m.isRangeDefense,{testData:l,cardOptions:f}),"callback")},f=s._setupCardOptions("systems/dsa5/templates/chat/roll/combatskill-card.html",r,i);return R.setupDialog({dialogOptions:p,testData:l,cardOptions:f})}},_s=class extends D{static{u(this,"PoisonItemDSA5")}static chatData(e,t){return[this._chatLineHelper("stepValue",e.step.value),this._chatLineHelper("poisonType",e.poisonType.value),this._chatLineHelper("start",e.start.value),this._chatLineHelper("duration",e.duration.value),this._chatLineHelper("resistanceModifier",e.resistance.value),this._chatLineHelper("effect",g.replaceConditions(g.replaceDies(e.effect.value)))]}static getSituationalModifiers(e,t,a,s){s=g.toObjectIfPossible(s),game.user.targets.size&&game.user.targets.forEach(i=>{i.actor&&e.push(...P.getVantageAsModifier(i.actor,game.i18n.localize("LocalizedIDs.poisonResistance"),-1,!1,!0))}),this.getSkZkModifier(a,s),ue(a,{hasSKModifier:s.system.resistance.value=="SK",hasZKModifier:s.system.resistance.value=="ZK"})}static setupDialog(e,t,a,s,i){let n=a.name+" "+g.categoryLocalization(a.type)+" "+game.i18n.localize("Test"),r={opposable:!1,source:a,extra:{options:t,speaker:D.buildSpeaker(s,i)}},l={rollMode:t.rollMode},c=[];this.getSituationalModifiers(c,s,l,a),l.situationalModifiers=c;let m={title:n,template:"systems/dsa5/templates/dialog/poison-dialog.html",data:l,callback:u((p,f={})=>(d.rollMode=p.find('[name="rollMode"]:checked').val(),r.situationalModifiers=O._parseModifiers(p),r.situationalModifiers.push({name:game.i18n.localize("zkModifier"),value:p.find('[name="zkModifier"]').val()||0},{name:game.i18n.localize("skModifier"),value:p.find('[name="skModifier"]').val()||0}),ue(r.extra.options,f),{testData:r,cardOptions:d}),"callback")},d=a._setupCardOptions(`systems/dsa5/templates/chat/roll/${a.type}-card.html`,n,i);return R.setupDialog({dialogOptions:m,testData:r,cardOptions:d})}},Fs=class o extends $t{static{u(this,"RangeweaponItemDSA5")}static chatData(e,t){let a=[this._chatLineHelper("damage",e.damage.value),this._chatLineHelper("TYPES.Item.combatskill",e.combatskill.value),this._chatLineHelper("reach",e.reach.value)];return e.effect.value!=""&&a.push(this._chatLineHelper(g.replaceConditions("effect",e.effect.value))),a}static getSituationalModifiers(e,t,a,s,i){if(a.mode=="attack"){let n=g.toObjectIfPossible(s),r=[n.system.combatskill.value],l=D.buildCombatSpecAbs(t,["Combat"],r,a.mode,n),c=t.items.get(n.system.currentAmmo.value);if(c){c=c.toObject(!1),n.system.effect.attributes=(n.system.effect.attributes||"").split(",").concat((c.system.effect.attributes||"").split(",")).filter(d=>d!="").join(",");let m=se(c.flags,"dsa5.poison");m&&ue(s.flags,{dsa5:{poison:m}})}if(this.prepareRangeAttack(e,t,a,n,i,l,c),c){if(c.system.atmod&&e.push({name:`${c.name} - ${game.i18n.localize("atmod")}`,value:c.system.atmod,selected:!0,specAbId:n.system.currentAmmo.value}),c.system.damageMod||c.system.armorMod){let m={name:`${c.name} - ${game.i18n.localize("MODS.damage")}`,value:c.system.damageMod.replace(/wWD/g,"d")||0,type:"dmg",selected:!0,specAbId:n.system.currentAmmo.value};c.system.armorMod&&(m.armorPen=c.system.armorMod),e.push(m)}c.effects.length&&e.push({name:`${c.name} - ${game.i18n.localize("TYPES.Item.ammunition")}`,value:1,type:"effect",selected:!0,specAbId:n.system.currentAmmo.value})}this.weaponModifiers(e,n,"attack"),this.weaponModifiers(e,n,"damage"),e.push(...o.getMiracleModifiers(t,{name:n.system.combatskill.value},"",a.mode),...t.getCombatEffectSkillModifier(n.system.combatskill.value,a.mode))}this.attackStatEffect(e,t.system.rangeStats[a.mode]),this.speciesModifier(e,t,a,s)}static async checkAmmunitionState(e,t,a,s){let i=!0;if(s!="damage"){let n=e.system;if(n.ammunitiongroup.value!="infinite")if(n.ammunitiongroup.value=="-")t.extra.ammo=He(e),i=t.extra.ammo.system.quantity.value>0;else{let r=a.items.get(n.currentAmmo.value);r?(t.extra.ammo=r.toObject(),n.ammunitiongroup.value=="mag"?i=t.extra.ammo.system.quantity.value>1||t.extra.ammo.system.mag.value>0&&t.extra.ammo.system.quantity.value>0:i=t.extra.ammo.system.quantity.value>0):i=!1}!i&&a.type=="creature"&&(i=!0)}return i||ui.notifications.error("DSAError.NoAmmo",{localize:!0}),i}static async setupDialog(e,t,a,s,i){let n=t.mode,r=a.name+" "+game.i18n.localize(n+"test"),l={opposable:t.mode!="parry",source:a,mode:n,extra:{actor:s.toObject(!1),options:t,speaker:D.buildSpeaker(s,i)}};if(!await this.checkAmmunitionState(a,l,s,n))return;let c={rollMode:t.rollMode,mode:n},m=s?z.getRollModifiers(s,a,{mode:n}):[];this.getSituationalModifiers(m,s,c,a,i),c.situationalModifiers=m,t.situationalModifiers&&c.situationalModifiers.push(...t.situationalModifiers);let d={title:r,template:"systems/dsa5/templates/dialog/combatskill-enhanced-dialog.html",data:c,callback:u((f,h={})=>(fe.resolveRangeDialog(l,p,f,s,h),Hooks.call("callbackDialogCombatDSA5",l,s,f,a,i),{testData:l,cardOptions:p}),"callback")},p=s._setupCardOptions("systems/dsa5/templates/chat/roll/combatskill-card.html",r,i);return R.setupDialog({dialogOptions:d,testData:l,cardOptions:p})}},Hs=class extends Et{static{u(this,"RitualItemDSA5")}static getCallbackData(e,t,a){super.getCallbackData(e,t,a),e.situationalModifiers.push({name:game.i18n.localize("RITUALMODIFIER.rightClothes"),value:t.find('[name="rightClothes"]').is(":checked")?1:0},{name:game.i18n.localize("RITUALMODIFIER.rightEquipment"),value:t.find('[name="rightEquipment"]').is(":checked")?1:0},{name:game.i18n.localize("place"),value:t.find('[name="placeModifier"]').val()},{name:game.i18n.localize("time"),value:t.find('[name="timeModifier"]').val()})}static getSituationalModifiers(e,t,a,s){super.getSituationalModifiers(e,t,a,s),ue(a,{isRitual:!0,locationModifiers:b.ritualLocationModifiers,timeModifiers:b.ritualTimeModifiers})}},js=class extends D{static{u(this,"ApplicationItemDSA5")}static chatData(e,t){let s=game.i18n.has(`APPLICATION.${e.skill} - ${t}`)?game.i18n.localize(`APPLICATION.${e.skill} - ${t}`):e.description.value;return[this._chatLineHelper("Description",s)]}},Gs=class o extends D{static{u(this,"SkillItemDSA5")}static chatData(e,t){let s=game.i18n.has(`SKILLdescr.${t}`)?game.i18n.localize(`SKILLdescr.${t}`):e.description.value;return[this._chatLineHelper("Description",s)]}static getSituationalModifiers(e,t,a,s){e.push(...te.getTalentBonus(t,s.name,["advantage","disadvantage","specialability","equipment"]),...t.getSkillModifier(s.name,s.type),...o.getMiracleModifiers(t,s,"FW","skill"));for(let i of t.system.skillModifiers.global)e.push({name:i.source,value:i.value})}static setupDialog(e,t,a,s,i){let n=a.name+" "+game.i18n.localize("Test")+(t.subtitle||""),r={opposable:!0,source:a,extra:{actor:s.toObject(!1),options:t,speaker:D.buildSpeaker(s,i)}},l={rollMode:t.rollMode,difficultyLabels:b.skillDifficultyLabels,modifier:t.modifier||0,characteristics:[1,2,3].map(d=>a.system[`characteristic${d}`].value),situationalModifiers:s?z.getRollModifiers(s,a):[]};t.situationalModifiers&&l.situationalModifiers.push(...t.situationalModifiers),this.getSituationalModifiers(l.situationalModifiers,s,l,a);let c={title:n,template:"systems/dsa5/templates/dialog/skill-dialog.html",data:l,callback:u((d,p={})=>(m.rollMode=d.find('[name="rollMode"]:checked').val(),r.testDifficulty=b.skillDifficultyModifiers[d.find('[name="testDifficulty"]').val()],r.situationalModifiers=O._parseModifiers(d),r.advancedModifiers={chars:[0,1,2].map(f=>Number(d.find(`[name="ch${f}"]`).val())),fws:Number(d.find('[name="fw"]').val()),qls:Number(d.find('[name="qs"]').val())},D.changeChars(r.source,...[0,1,2].map(f=>d.find(`[name="characteristics${f}"]`).val())),ue(r.extra.options,p),{testData:r,cardOptions:m}),"callback")},m=s._setupCardOptions("systems/dsa5/templates/chat/roll/skill-card.html",n,i);return R.setupDialog({dialogOptions:c,testData:r,cardOptions:m})}},Bs=class extends D{static{u(this,"SpecialAbilityItemDSA5")}static chatData(e,t){return[this._chatLineHelper("rule",e.rule.value)]}},qs=class extends D{static{u(this,"SpeciesItemDSA5")}},Ws=class extends D{static{u(this,"SpellextensionItemDSA5")}static chatData(e,t){return[this._chatLineHelper("source",e.source),this._chatLineHelper("Category",game.i18n.localize(e.category))]}},Us=class extends D{static{u(this,"BookItemDSA5")}static chatData(e,t){return super.chatData(e,t)}},Vs=class extends $t{static{u(this,"TraitItemDSA5")}static chatData(e,t){let a=[];switch(e.traitType.value){case"meleeAttack":a=[this._chatLineHelper("attack",e.at.value),this._chatLineHelper("damage",e.damage.value),this._chatLineHelper("reach",e.reach.value)];break;case"rangeAttack":a=[this._chatLineHelper("attack",e.at.value),this._chatLineHelper("damage",e.damage.value),this._chatLineHelper("reach",e.reach.value),this._chatLineHelper("reloadTime",e.reloadTime.value)];break;case"armor":a=[this._chatLineHelper("protection",e.damage.value)];break;case"general":a=[];break;case"familiar":a=[this._chatLineHelper("APValue",e.APValue.value),this._chatLineHelper("AsPCost",e.AsPCost.value),this._chatLineHelper("duration",e.duration.value),this._chatLineHelper("aspect",e.aspect.value)];break;case"trick":a=[this._chatLineHelper("APValue",e.APValue.value)];break;case"entity":a=[this._chatLineHelper("distribution",e.distribution),this._chatLineHelper("CHARAbbrev.QL",e.AsPCost.value)];break;case"summoning":a=[this._chatLineHelper("distribution",e.distribution),this._chatLineHelper("conjuringDifficulty",e.at.value)];break}return e.effect.value!=""&&a.push(this._chatLineHelper("effect",e.effect.value)),a}static getSituationalModifiers(e,t,a,s,i){s=g.toObjectIfPossible(s);let n=s.system.traitType.value,r=D.buildCombatSpecAbs(t,["Combat","animal"],void 0,a.mode,s);a.mode=="attack"&&n=="meleeAttack"?(this.prepareMeleeAttack(e,t,a,s,r,!1),this.weaponModifiers(e,s,"damage")):a.mode=="attack"&&n=="rangeAttack"?(this.prepareRangeAttack(e,t,a,s,i,r),this.weaponModifiers(e,s,"damage")):a.mode=="parry"&&this.prepareMeleeParry(e,t,a,s,r,!1),this.weaponModifiers(e,s,a.mode),this.attackStatEffect(e,t.system[n=="meleeAttack"?"meleeStats":"rangeStats"][a.mode])}static setupDialog(e,t,a,s,i){let n=t.mode,r=a.name+" "+game.i18n.localize(n+"test"),l={opposable:t.mode!="parry",source:a,mode:n,extra:{actor:s.toObject(!1),options:t,speaker:D.buildSpeaker(s,i)}},c=N.multipleDefenseValue(s,a.toObject()),m={rollMode:t.rollMode,mode:n,defenseCountString:game.i18n.format("defenseCount",{malus:c}),multipleDefenseValue:c},d=se(a,"system.traitType.value"),p=s?z.getRollModifiers(s,a,{mode:n}):[];this.getSituationalModifiers(p,s,m,a,i),m.situationalModifiers=p;let f={title:r,template:"systems/dsa5/templates/dialog/combatskill-enhanced-dialog.html",data:m,callback:u((y,k={})=>(d=="meleeAttack"?fe.resolveMeleeDialog(l,h,y,s,k,c,n):fe.resolveRangeDialog(l,h,y,s,k),l.isRangeDefense=m.isRangeDefense,Hooks.call("callbackDialogCombatDSA5",l,s,y,a,i),{testData:l,cardOptions:h}),"callback")},h=s._setupCardOptions("systems/dsa5/templates/chat/roll/combatskill-card.html",r,i);return R.setupDialog({dialogOptions:f,testData:l,cardOptions:h})}},la=class extends D{static{u(this,"VantageItemDSA5")}static chatData(e,t){return[this._chatLineHelper("effect",e.effect.value)]}};var{mergeObject:Ks,duplicate:Cr,getProperty:ca}=foundry.utils,fe=class o extends de{static{u(this,"DSA5CombatDialog")}static meleeweaponRollModifiers={wrongHand:{mod:-4},advantageousPosition:{mod:2},attackFromBehind:{mod:-4},opportunityAttack:{mod:-4},doubleAttack:{mod:-2},narrowSpace:{mod:0}};static rangeweaponRollModifiers={combatTurmoil:{mod:-2},quickChange:{mod:-4},narrowSpace:{mod:0},targetMovement:{mod:0},RangeMod:{short:{damage:1,attack:2},medium:{damage:0,attack:0},long:{damage:-1,attack:-2},rangesense:{damage:-1,attack:-1},extreme:{damage:-2,attack:-4}},RangeSize:{tiny:{mod:-8},small:{mod:-4},average:{mod:0},big:{mod:4},giant:{mod:8}},aimOptions:{0:{mod:0},1:{mod:2},2:{mod:4}}};static get defaultOptions(){let e=super.defaultOptions;return Ks(e,{width:700,resizable:!0}),e}static setData(e,t,a,s){let i=Cr(o.isMelee(a.source)?o.meleeweaponRollModifiers:o.rangeweaponRollModifiers);if(i.narrowSpace.mod=this.getNarrowSpaceModifier(a,a.mode),s.rangeOptions)for(let l of Object.keys(i.RangeMod))s.rangeOptions.has(l)||delete i.RangeMod[l];let n=foundry.utils.flattenObject(i),r=`${t}RollModifiers`;if(e.system[r]){let l=foundry.utils.flattenObject(foundry.utils.duplicate(e.system[r]));for(let c of Object.keys(n))n[c]+=Number(l[c])||0}for(let l of a.source.effects||[])if(!l.disabled){for(let c of l.changes)if(c.key.startsWith("self."))for(let m of Object.keys(n))c.key==`self.${m}`&&(n[m]+=Number(c.value)||0)}return foundry.utils.expandObject(n)}setCombatSpecTooltip(e){let t=e.dataset,a={pa:t.pabonus,at:t.atbonus,tp:t.tpbonus,dm:t.dmmalus},s=[];t.step>1&&s.push(`${t.step} x `);for(let n of Object.keys(a))a[n]!=0&&s.push(`${game.i18n.localize(`LocalizedAbilityModifiers.${n}`).toUpperCase()}: ${a[n]}`);let i=s.join(" ");$("#tooltip").html(i),e.dataset.tooltip=i}activateListeners(e){super.activateListeners(e);let t=e.find(".specAbs");t.mouseenter(i=>{let n=i.currentTarget;if(this.setCombatSpecTooltip(n),n.getElementsByClassName("hovermenu").length==0){let r=document.createElement("div");r.classList.add("hovermenu");let l=document.createElement("i");l.classList.add("fas","fa-comment"),l.dataset.tooltip="SHEET.PostItem",l.addEventListener("mousedown",this._postItem,!1),r.appendChild(l),n.appendChild(r)}}),t.mouseleave(i=>{let n=i.toElement||i.relatedTarget;n.parentNode==this||n==this||i.currentTarget.querySelectorAll(".hovermenu").forEach(r=>r.remove())}),e.find(".variantChange").mousedown(i=>this.changeSpecAbVariant(i)),e.on("mousedown",".specAbs",i=>{if(e.find(".opportunityAttack").is(":checked")){ui.notifications.error("DSAError.opposedAttackNoSpecAbs",{localize:!0});return}let n=$(i.currentTarget),r=i.currentTarget.dataset,l=Number(r.step),c=Number(r.maxstep),m=Number(r.category);if(i.button==0){if(l=Math.min(c,l+1),[0,1].includes(m)&&game.settings.get("dsa5","limitCombatSpecAbs")){let d=n.siblings(`[data-category="${m}"]`);d.removeClass("active").attr("data-step",0),d.find(".step").text(de.roman[0])}}else i.button==2&&(l=Math.clamp(c,0,l-1));r.step=l,n.toggleClass("active",l>0),n.find(".step").text(de.roman[l]),this.checkCounterAttack(i),this.calculateModifier(),this.setCombatSpecTooltip(i.currentTarget)}),e.find(".opportunityAttack").change(i=>{if($(i.currentTarget).is(":checked"))for(let n of e.find(".specAbs"))$(n).removeClass("active").attr("data-step",0).find(".step").text("")}),e.on("change","input,select",i=>this.calculateModifier(i)),e.find(".modifiers option").mousedown(i=>this.calculateModifier(i)),e.find(".quantity-click").mousedown(i=>this.calculateModifier(i));let a=this.readTargets(),s=this;this.checkTargets=setInterval(function(){a=s.compareTargets(e,a)},500)}checkCounterAttack(e){if(!this.dialogData.mode=="parry")return;let t=g.getSpeaker(this.dialogData.speaker);if(t&&t.items.get(e.currentTarget.dataset.id).name==game.i18n.localize("LocalizedIDs.counterAttack")){this.dialogData.counterAttack=e.button==0,this.prepareWeapon();let s=e.button==0?"attack":"parry",i=t.items.get(this.dialogData.source._id),n=z.getRollModifiers(t,i,{mode:s});if(D.getSubClass(i.type).getSituationalModifiers(n,t,{mode:s},i),s=="attack"){n=n.filter(p=>p.type!="defenseMalus");let l=n.findIndex(p=>p.name==game.i18n.localize("statuseffects")),c;l>=0&&(c=n.splice(l,1).pop());let m=[];D.getSubClass(i.type).getSituationalModifiers(m,t,{mode:"parry"},i),l=m.findIndex(p=>p.name==game.i18n.localize("statuseffects"));let d;l>=0&&(d=m.splice(l,1).pop()),n.unshift(...m),c?(d&&(c.value+=d.value),n.push(c)):d&&n.push(d)}let r=$(this._element).find("[name=situationalModifiers]");if(n.length>0){if(r.length==0){let c=`
`,buttons:{Yes:{icon:'',label:game.i18n.localize("Roll"),callback:u(n=>{o.resolveBreakingTest(e,Number(n.find('[name="threshold"]').val()),a)},"callback")},cancel:{icon:'',label:game.i18n.localize("cancel")}},default:"Yes"}).render(!0)}static async applyDamageLevelToItem(e,t){let a=Math.ceil(e.system.structure.max*.25)*t;await e.update({"system.structure.value":Math.max(0,e.system.structure.value-a)})}static async absoluteDamageLevelToItem(e,t){let a=Math.ceil(e.system.structure.max*.25)*t;await e.update({"system.structure.value":Math.min(e.system.structure.value,Math.max(0,e.system.structure.max-a))})}static async resolveBreakingTest(e,t,a){let s=await R.manualRolls(await new Roll("1d20").evaluate(),game.i18n.format("WEAR.check",{category:a}));await R.showDiceSoNice(s,game.settings.get("core","rollMode"));let i=s.total>t?1:0;await this.applyDamageLevelToItem(e,i);let n=o.calculateWear(e),r=await renderTemplate("systems/dsa5/templates/system/breakingtest.html",{wear:n,item:e,threshold:t,category:a,roll:s,result:game.i18n.localize(`WEAR.${e.type}.${n}`)});ChatMessage.create(g.chatDataSetup(r))}static damageTooltip(e){if(game.settings.get("dsa5","armorAndWeaponDamage")){let t=this.calculateWear(e);return{msg:game.i18n.localize(`WEAR.${e.type}.${t}`),css:`gearD damaged${t}`}}return{msg:"",css:""}}static weaponWearModifier(e){if(game.settings.get("dsa5","armorAndWeaponDamage"))switch(o.calculateWear(e)){case 1:e.attack-=1,e.parry&&(e.parry-=1);break;case 2:e.attack-=2,e.parry&&(e.parry-=2);break;case 3:case 4:e.attack=0,e.parry&&(e.parry=0)}}static calculateWear(e){return!e.system.structure||Number(e.system.structure.max)<=0?0:Math.floor((1-e.system.structure.value/e.system.structure.max)*4)}};var{mergeObject:Mr,getProperty:In}=foundry.utils,ee=class o{static{u(this,"OpposedDsa5")}static async handleOpposedTarget(e){if(!e)return;let t=g.getSpeaker(e.speaker);if(!t)return;let a=e.flags.data.postData,s=e.flags.data.preData;t.flags.oppose?o.answerOpposedTest(t,e,a,s):game.user.targets.size&&e.flags.data.isOpposedTest&&!e.flags.data.defenderMessage&&!e.flags.data.attackerMessage?o.createOpposedTest(t,e,a,s):e.flags.data.defenderMessage||e.flags.data.attackerMessage?o.resolveFinalMessage(e):e.flags.data.unopposedStartMessage?o.redoUndefended(e):e.flags.data.startMessagesList?o.changeStartMessage(e):(await this.showDamage(e),await this.showSpellWithoutTarget(e))}static async redoUndefended(e){let t=game.messages.get(e.flags.data.unopposedStartMessage);startmessage.flags.unopposeData.attackMessageId=e.id,this.resolveUndefended(t)}static async answerOpposedTest(e,t,a,s){let i=game.messages.get(e.flags.oppose.messageId);if(!i)return ui.notifications.error("DSAError.staleData",{localize:!0}),await o.clearOpposed(e),o.createOpposedTest(e,t,a,s);let n={speaker:e.flags.oppose.speaker,testResult:i.flags.data.postData,messageId:i.id,img:g.getSpeaker(e.flags.oppose.speaker)?.img};n.testResult.source=i.flags.data.preData.source,n.testResult.ammo&&n.testResult.source.effects.push(...n.testResult.ammo.effects);let r={speaker:t.speaker,testResult:a,messageId:t.id,img:e.msg},l=i.flags.data.defenderMessage?Array.from(i.flags.data.defenderMessage):[];l.push(t.id),game.user.isGM&&await i.update({"flags.data.defenderMessage":l}),await t.update({"flags.data.attackerMessage":i.id}),await this.completeOpposedProcess(n,r,{target:!0,startMessageId:e.flags.oppose.startMessageId,whisper:t.whisper,blind:t.blind}),await o.clearOpposed(e)}static videoOrImgTag(e){return/\.webm$/.test(e)?``:``}static async createOpposedTest(e,t,a,s){let i;t.speaker.token?i=canvas.tokens.get(t.speaker.token).document:i=e.prototypeToken;let n=a.options?.mode=="damage";if(a.successLevel>0||n){let r=t.flags.data.preData.attackOfOpportunity,l=r?"":`
`,c=[];game.user.targets.forEach(async m=>{if(m.actor){let d=`${o.opposeMessage(i,m,!1)} ${l}`,p=await ChatMessage.create({user:game.user.id,content:d,speaker:t.speaker,"flags.unopposeData":{attackMessageId:t.id,targetSpeaker:{scene:m.scene.id,token:m.id,alias:m.document.name}}}),f={speaker:t.speaker,messageId:t.id,startMessageId:p.id};game.user.isGM?await m.actor.update({"flags.oppose":f}):game.socket.emit("system.dsa5",{type:"target",payload:{target:m.id,scene:m.scene?.id||canvas.scene?.id,opposeFlag:f}}),c.push(p.id),r?await o.resolveUndefended(p,game.i18n.localize("OPPOSED.attackOfOpportunity")):n&&await o.resolveUndefended(p),Hooks.call("DSAOpposedRollStart",m)}}),t.flags.data.startMessagesList=c}else game.user.targets.forEach(async r=>{r.actor&&await ChatMessage.create({user:game.user.id,content:o.opposeMessage(i,r,!0),speaker:t.speaker})})}static opposeMessage(e,t,a){return`
+ `;$(this._element).find(".modifiers select").html(l)}else r.length>0&&(r.parent().remove(),this.position.height-=86,this.setPosition(this.position))}}changeSpecAbVariant(e){e.stopPropagation(),e.preventDefault();let t=g.getSpeaker(this.dialogData.speaker);if(t){let s=Number(e.currentTarget.dataset.current)+1;s>=Number(e.currentTarget.dataset.variantcount)&&(s=0),e.currentTarget.dataset.current=s,$(e.currentTarget).text(["A","B","C"][s]);let i=$(e.currentTarget).closest(".specAbs")[0],n=t.items.get(i.dataset.id),r=`effect.value${["","2","3"][s]}`,l=D.specAbsDataset([n],t,this.dialogData.mode,r)[0];i.dataset.dmmalus=l.dmmalus||0,i.dataset.atbonus=l.atbonus||0,i.dataset.tpbonus=l.tpbonus||0,i.dataset.pabonus=l.pabonus||0,this.setCombatSpecTooltip(i),this.calculateModifier()}}async close(e={}){return clearInterval(this.checkTargets),await super.close(e)}_postItem(e){e.stopPropagation();let t=$(e.currentTarget).closest(".specAbs"),a=t.attr("data-actor"),s=t.attr("data-id");return game.actors.get(a).items.get(s).postItem(),!1}recallSettings(e,t,a,s){return super.recallSettings(e,t,a,s),this.prepareWeapon(),this}syncSituationalModifiers(e,t=""){let a=0;for(let s of e.situationalModifiers)s.value!=null&&(a+=s.type==t||t==""&&s.type==null?Number(s.value):0);return a}prepareWeapon(e=void 0){e=e||this.dialogData.renderData;let t=this.dialogData.source;if(["meleeweapon","rangeweapon"].includes(t.type)){let a=g.getSpeaker(this.dialogData.speaker);if(a){let s=t.system.combatskill.value,i,n=O._calculateCombatSkillValues(a.items.find(r=>r.type=="combatskill"&&r.name==s).toObject(),a.system,{step:this.syncSituationalModifiers(e,"step"),[this.dialogData.mode]:this.syncSituationalModifiers(e,this.dialogData.mode)});switch(t.type){case"meleeweapon":i=O._prepareMeleeWeapon(t,[n],a);break;case"rangeweapon":i=O._prepareRangeWeapon(t,[],[n],a);break}this.dialogData.mode=="attack"||this.dialogData.counterAttack?this.dialogData.rollValue=i.attack:this.dialogData.mode=="parry"&&(this.dialogData.rollValue=i.parry)}else t.type=="dodge"?this.dialogData.rollValue=t.system.value:this.dialogData.mode=="attack"||this.dialogData.counterAttack?this.dialogData.rollValue=Number(t.system.at.value):this.dialogData.mode=="parry"&&(this.dialogData.rollValue=Number(t.system.pa))}}async prepareFormRecall(e){await super.prepareFormRecall(e);let t=g.getSpeaker(this.dialogData.speaker);ne.lightLevel(t,e);let a=H.isRiding(t),s=e.find('[name="advantageousPosition"]')[0];if(this.dialogData.mode=="attack"){let i=Array.from(game.user.targets).some(r=>H.isRiding(r.actor));s&&(i||a)&&(s.checked=a&&!i);let n=e.find('[name="mountedOptions"]')[0];if(a&&n){let r=H.getHorse(t);r&&(n.selectedIndex=H.horseSpeedModifier(r))}}else if(this.dialogData.mode=="parry"&&t.flags.oppose){let i=g.getSpeaker(t.flags.oppose.speaker),n=H.isRiding(i);s&&(n||a)&&(s.checked=a&&!n)}await this.calculateModifier()}static assassinationModifiers(e,t){let a=t.assassinate;if(!a||a=="-")return[];e.opposingWeaponSize=0;let s=t.advantageousPosition?2:0,i=b.meleeRangesArray.indexOf(t.weaponsize),n=game.i18n.localize(`DIALOG.${a}`),r=[{name:n,value:10-s-i}];if(a=="assassinate"){let l=b.meleeRangesArray.indexOf(e.source.system.reach.value);!N.isYieldedTwohanded(e.source)&&e.source.system.worn?.wrongGrip&&(l=Math.min(l,1));let c=Math.max(1,new Roll(e.source.system.damage.value.replace(/[DWw]/g,"d")).terms.reduce((p,f)=>p+(f.faces?f.number:0),0))-1,m=[2,0,-2,-4][l]-c*2,d=Math.max(1,5-l-c);r.push({name:n+" ("+game.i18n.localize("CHARAbbrev.damage")+")",damageBonus:m,value:0,step:1},{name:n+" (*)",damageBonus:`*${d}`,value:0,step:1})}else e.source.effects||(e.source.effects=[]),e.source.effects.find(l=>l._id==n)||e.source.effects.push({_id:n,changes:[],disabled:!1,duration:{},icon:"icons/svg/aura.svg",name:n,transfer:!0,flags:{dsa5:{description:n,resistRoll:`${game.i18n.localize("LocalizedIDs.selfControl")} -3`,hideOnToken:!1,hidePlayers:!1,customDuration:"",advancedFunction:"1",args0:"unconscious",args1:""}}});return r}static isMelee(e){return e.type=="meleeweapon"||e.type=="dodge"||e.type=="trait"&&ca(e,"system.traitType.value")=="meleeAttack"}async calculateModifier(){if(this.dialogData.mode=="damage")return;let e=this.dialogData.source,t={source:this.dialogData.source,extra:{options:{}}},a=g.getSpeaker(this.dialogData.speaker);o.isMelee(e)?o.resolveMeleeDialog(t,{},this.element,a,{},this.dialogData.renderData.multipleDefenseValue??-3,this.dialogData.mode):o.resolveRangeDialog(t,{},this.element,a,{},this.dialogData.mode),this.prepareWeapon(t),this.dialogData.modifier=await R._situationalModifiers(t);let s=R._situationalMultipliers(t);this.updateRollButton(this.readTargets(),s)}static getNarrowSpaceModifier(e,t){return t?N.isShield(e.source)?ca(b.narrowSpaceModifiers,`shield${e.source.system.reach.shieldSize}.${t}`)||0:ca(b.narrowSpaceModifiers,`weapon${e.source.system.reach.value}.${t}`)||0:0}static resolveMeleeDialog(e,t,a,s,i,n,r){this._resolveDefault(e,t,a,i);let l=new FormDataExtended(a.find("form")[0]).object,c=o.targetIsSwarm(e),m=s.isSwarm();e.opposingWeaponSize=m?0:l.weaponsize,e.attackOfOpportunity=this.attackOfOpportunity(e.situationalModifiers,l),e.extra.attackFromBehind=Number(l.attackFromBehind)||0,e.situationalModifiers.push(D.parseValueType(game.i18n.localize("sight"),l.vision||0),{name:game.i18n.localize("MODS.attackFromBehind"),value:e.extra.attackFromBehind},{name:game.i18n.localize("MODS.damage"),damageBonus:l.damageModifier,value:0,step:1},{name:game.i18n.format("defenseCount",{malus:n}),value:(Number(l.defenseCount)||0)*n},{name:game.i18n.localize("MODS.wrongHand"),value:Number(l.wrongHand)||0},{name:game.i18n.localize("MODS.advantageousPosition"),value:Number(l.advantageousPosition)||0},{name:game.i18n.localize("sizeCategory"),value:c?0:b.meleeSizeModifier[l.size]||0},...D.getSpecAbModifiers(a,r),...this.assassinationModifiers(e,l),{name:game.i18n.localize("MODS.narrowSpace"),value:Number(l.narrowSpace)||0},{name:game.i18n.localize("MODS.doubleAttack"),value:Number(l.doubleAttack)||0}),e.situationalModifiers.some(d=>d.name==game.i18n.localize("LocalizedIDs.counterAttack"))&&(e.mode="attack",e.extra.counterAttack=!0)}static resolveRangeDialog(e,t,a,s,i){this._resolveDefault(e,t,a,i);let n=new FormDataExtended(a.find("form")[0]).object,r=Number(n.quickChange)||0,l=Number(n.size)||0,c=a.find('[name="distance"] option:selected')[0].dataset;e.situationalModifiers.push({name:game.i18n.localize("MODS.targetMovement")+" "+a.find('[name="targetMovement"] option:selected').text(),value:Number(n.targetMovement)||0},{name:game.i18n.localize("shooter")+" "+a.find('[name="shooterMovement"] option:selected').text(),value:Number(n.shooterMovement)||0},{name:game.i18n.localize("mount")+" "+a.find('[name="mountedOptions"] option:selected').text(),value:Number(n.mountedOptions)||0},{name:game.i18n.localize("MODS.quickChange"),value:r},{name:game.i18n.localize("MODS.combatTurmoil"),value:Number(n.combatTurmoil)||0},{name:game.i18n.localize("MODS.aim"),value:Math.min(Number(n.aim)||0,4)},{name:game.i18n.localize("MODS.damage"),damageBonus:n.damageModifier,value:0,step:1},{name:game.i18n.localize("sight"),value:Number(n.vision)||0},{name:game.i18n.localize("sizeCategory"),value:l},{name:game.i18n.localize("distance"),value:c.attack,damageBonus:c.damage},...D.getSpecAbModifiers(a,"attack"));let m=s.items.find(d=>d.type=="specialability"&&d.name==game.i18n.localize("LocalizedIDs.sharpshooter"));if(m){let d=ca(e.source,"system.combatskill.value")?.toLowerCase();if(d&&m.system.list.value.split(/;|,/).map(p=>p.trim().toLowerCase()).includes(d)){let p=[n.targetMovement,n.shooterMovement,n.mountedOptions,r,l,c],f=Math.abs(p.reduce((y,k)=>(Number(k)<0&&(y+=Number(k)),y),0)),h=Math.min(Number(m.system.step.value)*2,f);h&&e.situationalModifiers.push({name:game.i18n.localize("LocalizedIDs.sharpshooter"),value:h})}}}static _resolveDefault(e,t,a,s){t.rollMode=a.find('[name="rollMode"]:checked').val(),e.situationalModifiers=O._parseModifiers(a),Ks(e.extra.options,s)}static targetIsSwarm(){let e=!1;return game.user.targets.forEach(t=>{if(t.actor?.isSwarm()){e=!0;return}}),e}static attackOfOpportunity(e,t){let a=Number(t.opportunityAttack)||0;if(a){e.push({name:game.i18n.localize("MODS.opportunityAttack"),value:a});let s=game.i18n.localize("LocalizedIDs.enemySense"),i=game.i18n.localize("LocalizedIDs.winhallStyle");game.user.targets.forEach(n=>{for(let r of n.actor?.items||[])r.type=="specialability"&&(r.name==s?e.push({name:s,value:-4}):r.name==i&&e.push({name:i,value:-2}))})}return a!=0}static getRollButtons(e,t,a,s){let i=ae.getRollButtons(e,t,a,s);if(e.source.type=="rangeweapon"||e.source.type=="trait"&&e.source.system.traitType.value=="rangeAttack"){let n=e.source.type=="trait"?Number(e.source.system.reloadTime.value):O.calcLZ(e.source,e.extra.actor),r=e.source.system.reloadTime.progress;r{let l=await g.getSpeaker(e.extra.speaker);await l.updateEmbeddedDocuments("Item",[{_id:e.source._id,"system.reloadTime.progress":r+1}]);let c=game.i18n.format("WEAPON.isReloading",{actor:l.token?.name||l.prototypeToken.name,item:e.source.name,status:`${r+1}/${n}`});await ChatMessage.create(g.chatDataSetup(c))},"callback")}})}return i}};var{mergeObject:Ys}=foundry.utils,Ot=class extends de{static{u(this,"DSA5SkillDialog")}static getRollButtons(e,t,a,s){let i=ae.getRollButtons(e,t,a,s);i.rollButton.label=game.i18n.localize("Opposed");let n={nonOpposedButton:{label:game.i18n.localize("Roll"),callback:u(r=>{game.dsa5.memory.remember(e.extra.speaker,e.source,e.mode,r),e.opposable=!1,a(t.callback(r))},"callback")},routineRoll:{label:game.i18n.localize("ROLL.routine"),callback:u(r=>{game.dsa5.memory.remember(e.extra.speaker,e.source,e.mode,r),e.routine=!0,Ys(e.extra.options,{cheat:!0,predefinedResult:[{val:2,index:0},{val:2,index:1},{val:2,index:2}]}),a(t.callback(r))},"callback")}};return Ys(n,i),n}activateListeners(e){super.activateListeners(e),e.on("change","input,select",s=>this.rememberFormData(s));let t=this.readTargets(),a=this;this.checkTargets=setInterval(function(){t=a.compareTargets(e,t)},500),this.rememberFormData(),e.on("mousedown",".quantity-click",s=>this.rememberFormData(s)),e.find(".modifiers option").mousedown(s=>{this.rememberFormData(s)})}rememberFormData(e){let t=new FormDataExtended(this.element.find("form")[0]).object;t.situationalModifiers=O._parseModifiers(this._element),this.calculateRoutine(t)}async calculateRoutine(e){let t=g.getSpeaker(this.dialogData.speaker),a=this.element.find(".routineRoll");if(!t)return a.prop("disabled",!0);let s=!0;for(let d=0;d<3;d++)if(t.system.characteristics[e[`characteristics${d}`]].max*e[`ch${d}`].max<13){s=!1;break}let i=Number(this.dialogData.source.system.talentValue.value)+e.fw+await R._situationalModifiers(e,"FW"),n=b.skillDifficultyModifiers[e.testDifficulty]+await R._situationalModifiers(e),r=Math.clamp(10-n*3,1,19),l=i>=r,c=s&&l,m=game.i18n.localize("ROLL.routine");a.prop("disabled",!c),a.html(c?`${m} (${game.i18n.localize("CHARAbbrev.FW")} ${Math.round(i/2)})`:m),this.calculateProbability(t,this.dialogData.source,n,i)}static get defaultOptions(){let e=super.defaultOptions;return Ys(e,{width:700,resizable:!0}),e}};var{mergeObject:Dn}=foundry.utils,ae=class o extends de{static{u(this,"DSA5Dialog")}static getDialogForItem(e,t){let a=e.extra.actor,s=e.source.type;switch(s){case"rangeweapon":case"meleeweapon":case"dodge":case"trait":return t.rollModifiers=fe.setData(a,s,e,t),fe;case"spell":case"ritual":case"liturgy":case"ceremony":return t.rollModifiers=Se.setData(a,s,t),Se;case"skill":return Ot}return o}static getRollButtons(e,t,a,s){let i={rollButton:{label:game.i18n.localize("Roll"),callback:u(n=>{game.dsa5.memory.remember(e.extra.speaker,e.source,e.mode,n),a(t.callback(n))},"callback")}};return game.user.isGM&&Dn(i,{cheat:{label:game.i18n.localize("DIALOG.cheat"),callback:u(n=>{game.dsa5.memory.remember(e.extra.speaker,e.source,e.mode,n),a(t.callback(n,{cheat:!0}))},"callback")}}),i}activateListeners(e){super.activateListeners(e),e.find(".dieButton").click(t=>{let a=$(t.currentTarget);a.attr("data-single")=="true"&&a.closest(".dialog-content").find(".dieButton").removeClass("dieSelected"),a.toggleClass("dieSelected")})}static get defaultOptions(){let e=super.defaultOptions;return Dn(e,{resizable:!0}),e}};var he=class extends te{static{u(this,"TraitRulesDSA5")}static async traitAdded(e,t){b.addTraitRules[t.name]&&await b.addTraitRules[t.name](e,t)}static hasTrait(e,t){return super.hasItem(e,t,["trait"])}};Hooks.on("setup",()=>{let o=game.i18n.localize("LocalizedIDs.familiar");b.addTraitRules[o]=async(e,t)=>{t.effects.length==0&&(t.effects=[{changes:[{key:"system.status.wounds.gearmodifier",mode:2,value:10},{key:"system.status.soulpower.gearmodifier",mode:2,value:1},{key:"system.status.toughness.gearmodifier",mode:2,value:1},{key:"system.status.astralenergy.gearmodifier",mode:2,value:15},{key:"system.characteristics.mu.gearmodifier",mode:2,value:1},{key:"system.characteristics.kl.gearmodifier",mode:2,value:1},{key:"system.characteristics.in.gearmodifier",mode:2,value:1},{key:"system.characteristics.ch.gearmodifier",mode:2,value:1},{key:"system.characteristics.ff.gearmodifier",mode:2,value:1},{key:"system.characteristics.ge.gearmodifier",mode:2,value:1},{key:"system.characteristics.ko.gearmodifier",mode:2,value:1},{key:"system.characteristics.kk.gearmodifier",mode:2,value:1},{key:"system.totalArmor",mode:2,value:1}],duration:{},icon:"icons/svg/aura.svg",name:o,transfer:!0,flags:{dsa5:{description:o,hideOnToken:!0,hidePlayers:!1}}}]);let a=game.i18n.localize("LocalizedIDs.witchSense");if(!te.hasItem(e,a,["trait"])){let s=await g.findAnyItem([{name:a,type:"trait"}]);await e.createEmbeddedDocuments("Item",s)}}});var{mergeObject:Mn,getProperty:Dr}=foundry.utils,ke=class o extends Dialog{static{u(this,"DialogReactDSA5")}static async showDialog(e){let t=this.callbackResult;new o({title:game.i18n.localize("Unopposed"),content:await this.getTemplate(e),default:"ok",buttons:{ok:{icon:'',label:game.i18n.localize("ok"),callback:u(a=>{t(a.find('[name="entryselection"]').val(),e)},"callback")},cancel:{icon:'',label:game.i18n.localize("cancel")}}}).render(!0)}activateListeners(e){super.activateListeners(e),e.find(".select2").select2()}static getTargetActor(e){if(!canvas.tokens)return{};let t=e.flags.unopposeData.targetSpeaker,a=g.getSpeaker(t);return a?{actor:a,tokenId:t.token}:(ui.notifications.error("DSAError.noProperActor",{localize:!0}),{})}static async getTemplate(e){return""}static callbackResult(e,t,a){}static get defaultOptions(){let e=super.defaultOptions;return Mn(e,{resizable:!0}),e}},yt=class extends ke{static{u(this,"ReactToSkillDialog")}static async getTemplate(e){let s=game.messages.get(e.flags.unopposeData.attackMessageId).flags.data.preData.source.name,i=(await g.allSkillsList()).map(n=>({name:n,id:n}));return i.unshift({name:game.i18n.localize("doNothing"),id:"doNothing"}),renderTemplate("systems/dsa5/templates/dialog/dialog-act.html",{items:i,original:s,title:"DIALOG.selectReaction"})}static callbackResult(e,t){let{actor:a,tokenId:s}=ke.getTargetActor(t);if(e=="doNothing")ee.resolveUndefended(t);else{let i=a.items.find(n=>n.name==e&&n.type=="skill");i&&a.setupSkill(i,{},s).then(n=>{a.basicTest(n)})}}},bt=class o extends Dialog{static{u(this,"ActAttackDialog")}static async showDialog(e,t){let a=new o({title:game.i18n.localize("attacktest"),content:await this.getTemplate(e),buttons:{}});a.actor=e,a.tokenId=t,a.render(!0)}activateListeners(e){super.activateListeners(e),e.find(".reactClick").click(t=>{this.callbackResult(t.currentTarget.dataset,this.actor,this.tokenId),this.close()})}static async getTemplate(e){let t=e.items.filter(r=>r.type=="combatskill").map(r=>O._calculateCombatSkillValues(r.toObject(),e.system)),a=t.find(r=>r.name==game.i18n.localize("LocalizedIDs.wrestle")),s=[{name:game.i18n.localize("attackWeaponless"),id:"attackWeaponless",img:"systems/dsa5/icons/categories/attack_weaponless.webp",value:a.system.attack.value}],i=["meleeweapon","rangeweapon"],n=["meleeAttack","rangeAttack"];for(let r of e.items)if(i.includes(r.type)&&r.system.worn.value==!0){let l=r.type=="meleeweapon"?O._prepareMeleeWeapon(r.toObject(),t,e):O._prepareRangeWeapon(r.toObject(),[],t,e);s.push({name:r.name,id:r.name,img:r.img,value:l.attack,item:l});for(let[c,m]of Object.entries(l.subweapons||{}))s.push({name:m.name,id:r.name,subweapon:c,img:r.img,value:m.attack,item:m})}else r.type=="trait"&&n.includes(r.system.traitType.value)&&s.push({name:r.name,id:r.name,img:r.img,value:r.system.at.value});return await renderTemplate("systems/dsa5/templates/dialog/dialog-reaction-attack.html",{dieClass:"die-mu",items:s,title:"DIALOG.selectAction"})}callbackResult(e,t,a){if(e.value=="attackWeaponless")t.setupWeaponless("attack",{},a).then(s=>{t.basicTest(s)});else{let s=["meleeweapon","trait","rangeweapon"],i=t.items.find(n=>s.includes(n.type)&&n.name==e.value);e.subweapon&&(i=O.buildSubweapon(i,e.subweapon)),i&&t.setupWeapon(i,"attack",{},a).then(n=>{t.basicTest(n)})}}static get defaultOptions(){let e=super.defaultOptions;return e.width=550,e}},kt=class o extends ke{static{u(this,"ReactToAttackDialog")}static async showDialog(e){let t=new o({title:game.i18n.localize("Unopposed"),content:await this.getTemplate(e),buttons:{}});t.startMessage=e,t.render(!0)}static getAttackActor(e){if(!canvas.tokens)return{};let t=e.flags.unopposeData.attackMessageId,s=game.messages.get(t).flags.data.preData.extra.speaker,i=g.getSpeaker(s);return i?{actor:i,tokenId:s.token}:(ui.notifications.error("DSAError.noProperActor",{localize:!0}),{})}activateListeners(e){super.activateListeners(e),e.find(".reactClick").click(t=>{this.callbackResult(t.currentTarget.dataset.value,this.startMessage),this.close()})}static get defaultOptions(){let e=super.defaultOptions;return Mn(e,{width:550}),e}static async getTemplate(e){let{actor:t,tokenId:a}=ke.getTargetActor(e),s=o.getAttackActor(e),i=t.items.filter(m=>m.type=="combatskill").map(m=>O._calculateCombatSkillValues(m.toObject(),t.system)),n=i.find(m=>m.name==game.i18n.localize("LocalizedIDs.wrestle")),r=[{name:game.i18n.localize("doNothing"),id:"doNothing",img:"systems/dsa5/icons/categories/disease.webp"},{name:game.i18n.localize("dodge"),id:"dodge",img:"systems/dsa5/icons/categories/Dodge.webp",value:t.system.status.dodge.max},{name:game.i18n.localize("parryWeaponless"),id:"parryWeaponless",img:"systems/dsa5/icons/categories/attack_weaponless.webp",value:n.system.parry.value}],l=0,c="";if(t){let m=["meleeweapon"];for(let d of t.items)if(m.includes(d.type)&&d.system.worn.value==!0){let p=O._prepareMeleeWeapon(d.toObject(),i,t);r.push({name:d.name,id:d.name,img:d.img,value:p.parry})}else d.type=="trait"&&Number(d.system.pa)>0&&r.push({name:d.name,id:d.name,img:d.img,value:d.system.pa});if(s){let d=Dr(s.actor.system,"status.size.value");d=="big"?c="DIALOGDESCRIPTION.bigEnemy":d=="giant"&&(c="DIALOGDESCRIPTION.giantEnemy")}game.combat&&(l=await game.combat.getDefenseCount({actor:t.id,token:a,scene:canvas.scene?canvas.scene.id:null}))}return await renderTemplate("systems/dsa5/templates/dialog/dialog-reaction-attack.html",{dieClass:"die-in",items:r,defenses:l,title:"DIALOG.selectReaction",sizeNotification:c})}callbackResult(e,t){let{actor:a,tokenId:s}=ke.getTargetActor(t);if(e=="doNothing")ee.resolveUndefended(t);else if(e=="dodge")a.setupDodge({},s).then(i=>{a.basicTest(i)});else if(e=="parryWeaponless")a.setupWeaponless("parry",{},s).then(i=>{a.basicTest(i)});else{let i=["meleeweapon","trait"],n=a.items.find(r=>i.includes(r.type)&&r.name==e);n&&a.setupWeapon(n,"parry",{},s).then(r=>{a.basicTest(r)})}}};var{getProperty:xt}=foundry.utils,W=class o{static{u(this,"EquipmentDamage")}static armorWearModifier(e,t){if(game.settings.get("dsa5","armorAndWeaponDamage"))switch(o.calculateWear(e)){case 1:case 2:t-=1;break;case 3:case 4:t=0}return Math.max(0,Number(t))}static armorGetsDamage(e,t){return(e>14||t.successLevel>2)&&game.settings.get("dsa5","armorAndWeaponDamage")}static armorEncumbranceModifier(e){return game.settings.get("dsa5","armorAndWeaponDamage")&&o.calculateWear(e)>1?1:0}static async showDamageToGear(e,t){if(game.settings.get("dsa5","armorAndWeaponDamage")){let a=g.getSpeaker(e.extra.speaker),s=0,i=xt(a,"flags.oppose.messageId");if(i){let r=game.messages.get(i);r&&(s=xt(r,"flags.data.postData.successLevel")||0)}let n=e.source;if(n._id&&n.system.structure&&(t.successLevel<-2||s>2)&&["meleeweapon","rangeweapon","armor"].includes(n.type))return a=await g.getSpeaker(t.speaker),a.items.get(n._id).uuid}}static breakingTest(e){if(!e)return ui.notifications.warn(game.i18n.format("DSAError.notfound",{category:"",name:game.i18n.localize("equipment")}));if(e.system.structure.max<=0)return ui.notifications.warn(game.i18n.format("DSAError.noBreakingStructure",{name:e.name}));let t=0,a;if(e.type=="armor"?(a=game.i18n.localize(`ARMORSUBCATEGORIES.${e.system.subcategory}`),t=xt(e,"system.structure.breakPointRating")||b.armorSubcategories[e.system.subcategory]):(a=e.system.combatskill.value,t=xt(e,"system.structure.breakPointRating")||b.weaponStabilities[game.i18n.localize(`LocalizedCTs.${a}`)]),!t){ui.notifications.error(game.i18n.format("DSAError.noBreakingResistance",{item:e.name}));return}let s="",i=xt(e,"effect.attributes")||"";new RegExp(`${x.magical}`,"i").test(i)?s=`${game.i18n.format("WEAPON.attributeWarning",{domain:x.clerical})}
`:new RegExp(`${x.clerical}`,"i").test(i)&&(s=`${game.i18n.format("WEAPON.attributeWarning",{domain:x.magical})}
`),new de({title:game.i18n.localize("DSASETTINGS.armorAndWeaponDamage"),content:`${s}: `,buttons:{Yes:{icon:'',label:game.i18n.localize("Roll"),callback:u(n=>{o.resolveBreakingTest(e,Number(n.find('[name="threshold"]').val()),a)},"callback")},cancel:{icon:'',label:game.i18n.localize("cancel")}},default:"Yes"}).render(!0)}static async applyDamageLevelToItem(e,t){let a=Math.ceil(e.system.structure.max*.25)*t;await e.update({"system.structure.value":Math.max(0,e.system.structure.value-a)})}static async absoluteDamageLevelToItem(e,t){let a=Math.ceil(e.system.structure.max*.25)*t;await e.update({"system.structure.value":Math.min(e.system.structure.value,Math.max(0,e.system.structure.max-a))})}static async resolveBreakingTest(e,t,a){let s=await R.manualRolls(await new Roll("1d20").evaluate(),game.i18n.format("WEAR.check",{category:a}));await R.showDiceSoNice(s,game.settings.get("core","rollMode"));let i=s.total>t?1:0;await this.applyDamageLevelToItem(e,i);let n=o.calculateWear(e),r=await renderTemplate("systems/dsa5/templates/system/breakingtest.html",{wear:n,item:e,threshold:t,category:a,roll:s,result:game.i18n.localize(`WEAR.${e.type}.${n}`)});ChatMessage.create(g.chatDataSetup(r))}static damageTooltip(e){if(game.settings.get("dsa5","armorAndWeaponDamage")){let t=this.calculateWear(e);return{msg:game.i18n.localize(`WEAR.${e.type}.${t}`),css:`gearD damaged${t}`}}return{msg:"",css:""}}static weaponWearModifier(e){if(game.settings.get("dsa5","armorAndWeaponDamage"))switch(o.calculateWear(e)){case 1:e.attack-=1,e.parry&&(e.parry-=1);break;case 2:e.attack-=2,e.parry&&(e.parry-=2);break;case 3:case 4:e.attack=0,e.parry&&(e.parry=0)}}static calculateWear(e){return!e.system.structure||Number(e.system.structure.max)<=0?0:Math.floor((1-e.system.structure.value/e.system.structure.max)*4)}};var{mergeObject:Mr,getProperty:In}=foundry.utils,ee=class o{static{u(this,"OpposedDsa5")}static async handleOpposedTarget(e){if(!e)return;let t=g.getSpeaker(e.speaker);if(!t)return;let a=e.flags.data.postData,s=e.flags.data.preData;t.flags.oppose?o.answerOpposedTest(t,e,a,s):game.user.targets.size&&e.flags.data.isOpposedTest&&!e.flags.data.defenderMessage&&!e.flags.data.attackerMessage?o.createOpposedTest(t,e,a,s):e.flags.data.defenderMessage||e.flags.data.attackerMessage?o.resolveFinalMessage(e):e.flags.data.unopposedStartMessage?o.redoUndefended(e):e.flags.data.startMessagesList?o.changeStartMessage(e):(await this.showDamage(e),await this.showSpellWithoutTarget(e))}static async redoUndefended(e){let t=game.messages.get(e.flags.data.unopposedStartMessage);startmessage.flags.unopposeData.attackMessageId=e.id,this.resolveUndefended(t)}static async answerOpposedTest(e,t,a,s){let i=game.messages.get(e.flags.oppose.messageId);if(!i)return ui.notifications.error("DSAError.staleData",{localize:!0}),await o.clearOpposed(e),o.createOpposedTest(e,t,a,s);let n={speaker:e.flags.oppose.speaker,testResult:i.flags.data.postData,messageId:i.id,img:g.getSpeaker(e.flags.oppose.speaker)?.img};n.testResult.source=i.flags.data.preData.source,n.testResult.ammo&&n.testResult.source.effects.push(...n.testResult.ammo.effects);let r={speaker:t.speaker,testResult:a,messageId:t.id,img:e.msg},l=i.flags.data.defenderMessage?Array.from(i.flags.data.defenderMessage):[];l.push(t.id),game.user.isGM&&await i.update({"flags.data.defenderMessage":l}),await t.update({"flags.data.attackerMessage":i.id}),await this.completeOpposedProcess(n,r,{target:!0,startMessageId:e.flags.oppose.startMessageId,whisper:t.whisper,blind:t.blind}),await o.clearOpposed(e)}static videoOrImgTag(e){return/\.webm$/.test(e)?``:``}static async createOpposedTest(e,t,a,s){let i;t.speaker.token?i=canvas.tokens.get(t.speaker.token).document:i=e.prototypeToken;let n=a.options?.mode=="damage";if(a.successLevel>0||n){let r=t.flags.data.preData.attackOfOpportunity,l=r?"":`
`,c=[];game.user.targets.forEach(async m=>{if(m.actor){let d=`${o.opposeMessage(i,m,!1)} ${l}`,p=await ChatMessage.create({user:game.user.id,content:d,speaker:t.speaker,"flags.unopposeData":{attackMessageId:t.id,targetSpeaker:{scene:m.scene.id,token:m.id,alias:m.document.name}}}),f={speaker:t.speaker,messageId:t.id,startMessageId:p.id};game.user.isGM?await m.actor.update({"flags.oppose":f}):game.socket.emit("system.dsa5",{type:"target",payload:{target:m.id,scene:m.scene?.id||canvas.scene?.id,opposeFlag:f}}),c.push(p.id),r?await o.resolveUndefended(p,game.i18n.localize("OPPOSED.attackOfOpportunity")):n&&await o.resolveUndefended(p),Hooks.call("DSAOpposedRollStart",m)}}),t.flags.data.startMessagesList=c}else game.user.targets.forEach(async r=>{r.actor&&await ChatMessage.create({user:game.user.id,content:o.opposeMessage(i,r,!0),speaker:t.speaker})})}static opposeMessage(e,t,a){return`
${e.name} ${game.i18n.localize("ROLL.Targeting")} ${t.document.name} ${a?game.i18n.localize("ROLL.failed"):""}
${o.videoOrImgTag(e.texture.src)}
${o.videoOrImgTag(t.document.texture.src)}
- `}static async changeStartMessage(e){for(let t of e.flags.data.startMessagesList){let a=game.messages.get(t),s=a.flags.unopposeData;game.socket.emit("system.dsa5",{type:"target",payload:{target:s.targetSpeaker.token,scene:canvas.scene.id,opposeFlag:{speaker:e.speaker,messageId:e.id,startMessageId:a.id}}}),await a.update({"flags.unopposeData.attackMessageId":e.id})}}static resolveFinalMessage(e){let t,a;if(e.flags.data.defenderMessage)for(let s of e.flags.data.defenderMessage){t=o.getMessageDude(e);let i=game.messages.get(s);a=o.getMessageDude(i),this.completeOpposedProcess(t,a,{blind:e.blind,whisper:e.whisper})}else{a=o.getMessageDude(e);let s=game.messages.get(e.flags.data.attackerMessage);t=o.getMessageDude(s),this.completeOpposedProcess(t,a,{blind:e.blind,whisper:e.whisper})}}static getMessageDude(e){let t={speaker:e.speaker,testResult:Mr(e.flags.data.postData,{source:e.flags.data.preData.source}),img:g.getSpeaker(e.speaker).img,messageId:e.id};return t.testResult.ammo&&t.testResult.source.effects.push(...t.testResult.ammo.effects),t}static async showDamage(e,t=!1){game.user.isGM?(!t||!e.flags.data.hideDamage)&&e.flags.data.postData.damageRoll&&(await e.update({content:e.content.replace(`data-hide-damage="${!t}"`,`data-hide-damage="${t}"`),"flags.data.hideDamage":t}),t||R._addRollDiceSoNice(e.flags.data.preData,Roll.fromData(e.flags.data.postData.damageRoll),game.dsa5.apps.DiceSoNiceCustomization.getAttributeConfiguration("damage"))):game.socket.emit("system.dsa5",{type:"showDamage",payload:{id:e.id,hide:t}})}static async playAutomatedJBA2(e,t,a){if(g.moduleEnabled("autoanimations")){let s=g.getSpeaker(e.speaker).getActiveTokens()[0],i=g.getSpeaker(t.speaker).getActiveTokens()[0];if(!s||!s.actor||!i||!i.actor)return;let n=s.actor.items.get(e.testResult.source._id);if(n||(n=new C(e.testResult.source)),!n)return;n=n.toObject();let r=[i],l=a.winner=="attacker",c=l?r:[],m=e.testResult.successLevel>1&&l,d=e.testResult.successLevel<1&&!l,p=t.testResult.successLevel>1&&!l,f=t.testResult.successLevel<1&&l,h=[],y=[];m?y.push(game.i18n.localize("CriticalSuccess")):d?y.push(game.i18n.localize("CriticalFailure")):p?y.push(`${game.i18n.localize("CHAR.PARRY")} ${game.i18n.localize("CriticalSuccess")}`):f&&y.push(`${game.i18n.localize("CHAR.PARRY")} ${game.i18n.localize("CriticalFailure")}`),l||y.push(game.i18n.localize("CHAR.PARRY"));for(let k of y)h.push({name:`${n.name} (${k})`},{name:k});h.push(n);for(let k of h)if(await AutomatedAnimations.playAnimation(s,k,{targets:r,hitTargets:c,playOnMiss:!0}))break}}static async showSpellWithoutTarget(e){if(g.moduleEnabled("autoanimations")){let t=In(e,"flags.data");if(!t||t.isOpposedTest)return;if((In(t,"postData.result")||-1)>0){let s=g.getSpeaker(t.postData.speaker).getActiveTokens()[0];if(!s||!s.actor)return;let i=Array.from(game.user.targets),n=s.actor.items.get(t.preData.source._id);i.length||(i=[s]),AutomatedAnimations.playAnimation(s,n,{targets:i})}}}static async clearOpposed(e){game.user.isGM?await e.update({"flags.-=oppose":null}):game.socket.emit("system.dsa5",{type:"clearOpposed",payload:{actorId:e.id}})}static async _handleReaction(e){let t=$(e.currentTarget).parents(".message").attr("data-message-id"),a=game.messages.get(t);switch(game.messages.get(a.flags.unopposeData.attackMessageId).flags.data.preData.source.type){case"skill":yt.showDialog(a);break;default:kt.showDialog(a)}}static async chatListeners(e){e.on("click",".unopposed-button",t=>{t.preventDefault(),this._handleReaction(t)})}static async hideReactionButton(e){if(e)if(game.user.isGM){let t=game.messages.get(e),a=$(t.content);a.find("button.unopposed-button").remove(),a=$("
").append(a),await t.update({content:a.html()})}else game.socket.emit("system.dsa5",{type:"hideQueryButton",payload:{id:e}})}static async completeOpposedProcess(e,t,a){await pe.postOpposed({attacker:e,defender:t,options:a});let s=await this.evaluateOpposedTest(e.testResult,t.testResult,a);return this.formatOpposedResult(s,e.speaker,t.speaker),this.rerenderMessagesWithModifiers(s,e,t),Hooks.call("finishOpposedTest",e,t,s,a),await this.finishOpposedTestHookAsync(e,t,s,a),this.playAutomatedJBA2(e,t,s),await this.renderOpposedResult(s,a),await this.hideReactionButton(a.startMessageId),s}static async finishOpposedTestHookAsync(e,t,a,s){}static async evaluateOpposedTest(e,t,a={}){let s={};if(s.other=[],a.additionalInfo&&s.other.push(a.additionalInfo),s.winner="attacker",["weapon","spell","liturgy","ceremony","ritual","combatskill"].includes(e.rollType)&&t.successLevel==null&&(t.successLevel=-5),e.rollType=="damage"&&(t.successLevel=-5,e.successLevel=1),t.successLevel!=null)switch(e.rollType){case"combatskill":case"talent":this._evaluateTalentOpposedRoll(e,t,s,a);break;case"ceremony":case"ritual":case"spell":case"liturgy":case"weapon":case"damage":this._evaluateWeaponOpposedRoll(e,t,s,a);break;default:ui.notifications.error("Can not oppose "+e.rollType),console.warn("Can not oppose "+e.rollType)}return s}static _evaluateWeaponOpposedRoll(e,t,a,s={}){if(e.successLevel>0&&t.successLevel<0){let i=this._calculateOpposedDamage(e,t,s);if(i.armorDamaged.damaged&&i.armorDamaged.ids.length){let c=i.armorDamaged.ids.join(";");a.other.push(`
`)}t.counterAttack&&(i.damage+=2,i.sum=i.damage-i.armor,i.tooltip=game.i18n.localize("LocalizedIDs.counterAttack")+" 2"),i.messages.length&&(i.tooltip||(i.tooltip=""),i.tooltip+=` ${i.messages.join("
")}`),a.winner="attacker";let n=[i.armorMod!=0?`${i.armorMod+" "+game.i18n.localize("Modifier")}`:"",i.armorMultiplier!=1?"*"+i.armorMultiplier+" "+game.i18n.localize("Modifier"):"",i.spellArmor!=0?`${i.spellArmor} ${game.i18n.localize("spellArmor")}`:"",i.liturgyArmor!=0?`${i.liturgyArmor} ${game.i18n.localize("liturgyArmor")}`:""].join(""),l=`${game.combat?.isBrawling?game.i18n.localize("BRAWLING.temporary"):game.i18n.localize("damage")}: ${i.damage} - ${i.armor} = ${i.sum}`;a.damage={description:l,value:i.sum,sp:i.damage}}else a.winner="defender"}static _calculateOpposedDamage(e,t,a={}){let s=g.getSpeaker(t.speaker),i=[],n=e.damage,r=game.i18n.localize("LocalizedIDs.immuneToCrit");e.doubleDamage&&s.items.find(A=>A.name==r&&A.type=="trait")&&(n=Math.floor(n/e.doubleDamage),i.push(r)),a.origin=e.source,a.defender=s,a.damage=n,a.defenderTest=t,a.attackerTest=e;let{wornArmor:l,armor:c}=O.armorValue(s,a);a.armor=c;let m=Z.applyRollTransformation(s,a,pe.EVENTS.DAMAGE_TRANSFORMATION).options;c=m.armor;let d=m.damage,p=[],f=0,h=e.armorPen||[];for(let A of h)/^\*/.test(A)?p.push(Number(A.replace("*",""))):f+=Number(A);let y=0,k=0;["spell","ritual"].includes(e.source.type)?y+=s.system.spellArmor||0:["liturgy","ceremony"].includes(e.source.type)&&(y+=s.system.liturgyArmor||0),c+=f;let D=p.reduce((A,j)=>A*j,1);c=Math.max(Math.round(c*D),0),c+=y+k;let v=W.armorGetsDamage(d,e),I=l.map(A=>A.uuid);return{damage:d,armor:c,armorDamaged:{damaged:v,ids:I},armorMod:f,spellArmor:y,liturgyArmor:k,armorMultiplier:D,messages:i,sum:d-c}}static _evaluateTalentOpposedRoll(e,t,a,s={}){e.successLevel>0&&e.successLevel>t.successLevel?a.winner="attacker":e.qualityStep>t.qualityStep||e.result>=0&&t.result<0?(a.winner="attacker",a.differenceSL=e.qualityStep-t.qualityStep):(a.winner="defender",a.differenceSL=t.qualityStep-e.qualityStep)}static formatOpposedResult(e,t,a){let s=e.differenceSL?"winsFP":"wins";return e.winner=="attacker"?(e.result=game.i18n.format("OPPOSED."+s,{winner:t.alias,loser:a.alias,SL:e.differenceSL}),e.img=t.img):e.winner=="defender"&&(e.result=game.i18n.format("OPPOSED."+s,{winner:a.alias,loser:t.alias,SL:e.differenceSL}),e.img=a.img),e.speakerAttack=t,e.speakerDefend=a,e}static rerenderMessagesWithModifiers(e,t,a){let s=game.messages.get(t.messageId);this.showDamage(s,e.winner!="attacker")}static async renderOpposedResult(e,t={}){let a=game.settings.get("dsa5","hideOpposedDamageSelect");e.hideData=[1,2].includes(a),e.applyDamageInChat=game.settings.get("dsa5","applyDamageInChat"),e.isBrawling=game.combat?.isBrawling;let s=await renderTemplate("systems/dsa5/templates/chat/roll/opposed-result.html",e),i={user:game.user.id,content:s,flags:{opposeData:e,hideData:e.hideData},whisper:a>1?[]:t.whisper,blind:t.blind};t.target&&(i["flags.startMessageId"]=t.startMessageId),await ChatMessage.create(i)}static async resolveUndefended(e,t=""){let a=e.flags.unopposeData,s=game.messages.get(a.attackMessageId),i={speaker:s.speaker,testResult:s.flags.data.postData,messageId:a.attackMessageId};i.testResult.source=s.flags.data.preData.source,i.testResult.ammo&&i.testResult.source.effects.push(...i.testResult.ammo.effects);let n=canvas.tokens.get(a.targetSpeaker.token),r={speaker:a.targetSpeaker,testResult:{actor:n.actor,speaker:{token:a.targetSpeaker.token}}};await this.clearOpposed(n.actor),await this.completeOpposedProcess(i,r,{target:!0,startMessageId:e.id,additionalInfo:t}),game.user.isGM?await s.update({"flags.data.unopposedStartMessage":e.id}):await game.socket.emit("system.dsa5",{type:"updateAttackMessage",payload:{messageId:s.id,startMessageId:e.id}})}};var zt=class o extends foundry.applications.api.HandlebarsApplicationMixin(foundry.applications.api.ApplicationV2){static{u(this,"EquipmentDamageDialog")}static DEFAULT_OPTIONS={window:{title:"WEAR.checkShort"}};static PARTS={main:{template:"systems/dsa5/templates/dialog/dialog-reaction-attack.html"}};constructor(e){super(),this.items=e}async _prepareContext(e){let t=await super._prepareContext(e);return t.items=this.items.map(a=>({name:a.name,id:a.id,img:a.img})),t.title="WEAR.checkShort",t}_onRender(e,t){super._onRender(t),$(this.element).find(".reactClick").on("click",s=>{this.callbackResult(s),this.close()})}static async showDialog(e){new o(e).render(!0)}callbackResult(e){W.breakingTest(this.items.find(t=>t.id==e.currentTarget.dataset.value))}};var{getProperty:Ir,mergeObject:En}=foundry.utils,B=class o{static{u(this,"DSATables")}static async showBotchCard(e,t={}){t.speaker={token:e.token,actor:e.actor,scene:e.scene},t.source=e.source;let a=b.systemTables.find(i=>i.name==e.table),s=await o.getRollTable(a.pack[game.i18n.lang],game.i18n.localize(`TABLENAMES.${e.table}`),e);for(let i of s){let n=t.speaker?await o.hasEffect(i):!1,r=g.replaceDies(g.replaceConditions(i.results[0].text)),l=`${game.i18n.localize("TABLENAMES."+e.table)}`,c=await renderTemplate("systems/dsa5/templates/tables/tableCard.html",{result:r,title:l,hasEffect:n}),m=await this.buildEffects(i,n);ChatMessage.create({user:game.user.id,content:c,whisper:t.whisper,blind:t.blind,flags:{data:{preData:{source:{effects:m},extra:{actor:{id:t.speaker.actor},speaker:t.speaker},situationalModifiers:[]},postData:{}},dsa5:{hasEffect:n,options:t}}})}}static async hasEffect(e){return Ir(e.results[0],"flags.dsa5")||!1}static async buildEffects(e,t){let a=[];if(t&&t.resistEffect){let s=Array.isArray(t.resistEffect.fail)?t.resistEffect.fail:[t.resistEffect.fail];for(let i of s){let n=J.effectBaseDummy(i.description,t.resistEffect.changes||[],t.resistEffect.duration||{});i.systemEffect?En(n,{_id:"botchEffect",flags:{dsa5:{hideOnToken:!1,hidePlayers:!1,advancedFunction:2,args3:`await actor.addCondition("${i.systemEffect}", ${i.level||1});`}}}):i.command&&En(n,{_id:"botchEffect",flags:{dsa5:{hideOnToken:!1,hidePlayers:!1,advancedFunction:2,args3:i.command}}}),a.push(n)}}return a}static async getRollTable(e,t,a={}){let i=(await game.packs.get(e).getDocuments({name__in:[t]}))[0],n=await i.draw({displayChat:!1});return a.weaponless=="true"&&n.roll.total<7&&(n.roll.editRollAtIndex([{index:0,val:n.roll.total+5}]),n=await i.draw({displayChat:!1,roll:n.roll})),[n]}static async tableEnabledFor(e){let t=b.systemTables.find(a=>a.name==e);return t?game.settings.get(t.setting.module,t.setting.key):!1}static rollCritBotchButton(e,t,a){let s=game.i18n.localize(`TABLENAMES.${e}`),i=a.extra.speaker,n=a.source._id;return`, ${s}`}static async defaultBotch(){return", "+game.i18n.localize("selfDamage")+(await new Roll("1d6+2").evaluate()).total}static defaultAttackCrit(e){let t=", "+game.i18n.localize("halfDefense");return e&&(t+=", "+game.i18n.format("doubleDamage",{x:2})),t}static defaultParryCrit(){return", "+game.i18n.localize("attackOfOpportunity")}};var re=class o{static{u(this,"DSA5ChatAutoCompletion")}static skills=[];static cmds=["sk","at","pa","sp","li","rq","gc","w","ch"];constructor(){o.skills.length==0&&g.allSkills().then(e=>{o.skills=e.map(t=>({name:t.name,type:"skill"})).concat(Object.values(game.dsa5.config.characteristics).map(t=>({name:game.i18n.localize(t),type:"attribute"})).concat([{name:game.i18n.localize("regenerate"),type:"regeneration"},{name:game.i18n.localize("fallingDamage"),type:"fallingDamage"}]))}),this.filtering=!1,this.combatConstants={dodge:game.i18n.localize("dodge"),parryWeaponless:game.i18n.localize("parryWeaponless"),attackWeaponless:game.i18n.localize("attackWeaponless")}}get regex(){return new RegExp(`^/(${o.cmds.join(" |")})`)}async chatListeners(e){let t=this,a=e.find("#chat-message");e.on("keyup","#chat-message",async function(i){t._parseInput(i)}),e.on("click",".quick-item",async function(i){t._quickSelect($(i.currentTarget))}),a.on("keydown",function(i){t._navigateQuickFind(i)});let s=jQuery._data(a[0]).events.keydown;s.unshift(s.pop())}_parseInput(e){let t=e.target.value;if(this.regex.test(t)){if([38,40,13,9].includes(e.which))return!1;if(e.which==27)return this._closeQuickfind(e),!1;let a=this._getCmd(t),s=t.substring(1+a.length).toLowerCase().trim();this[`_filter${a}`](s,e),this.filtering=!0}else this._closeQuickfind(e)}_getCmd(e){return e.substring(1,3).toUpperCase().trim()}_completeCurrentEntry(e){$("#chat-message").val($("#chat-message").val().split(" ")[0]+" "+e.text())+""}_closeQuickfind(e){this.filtering=!1,$(e.currentTarget).closest("#chat-form").find(".quickfind").remove()}_filterW(e,t){let a=game.users.contents.filter(s=>s.active&&s.name.toLowerCase().trim().indexOf(e)!=-1).map(s=>({name:s.name,type:"user"}));this._checkEmpty(a),this._setList(a,"W",t)}_filterAT(e,t){let{actor:a,tokenId:s}=o._getActor();if(a){let i=["meleeweapon","rangeweapon"],n=["meleeAttack","rangeAttack"],r=a.items.filter(l=>(i.includes(l.type)&&l.system.worn.value==!0||l.type=="trait"&&n.includes(l.system.traitType.value))&&l.name.toLowerCase().trim().indexOf(e)!=-1).slice(0,5).map(l=>({name:l.name,type:"item"})).concat([{name:this.combatConstants.attackWeaponless,type:"item"}].filter(l=>l.name.toLowerCase().trim().indexOf(e)!=-1));this._checkEmpty(r),this._setList(r,"AT",t)}}_filterPA(e,t){let{actor:a,tokenId:s}=o._getActor();if(a){let i=["meleeweapon"],n=a.items.filter(r=>i.includes(r.type)&&r.name.toLowerCase().trim().indexOf(e)!=-1&&r.system.worn.value==!0).slice(0,5).map(r=>({name:r.name,type:"item"})).concat([{name:this.combatConstants.dodge,type:"item"},{name:this.combatConstants.parryWeaponless,type:"item"}].filter(r=>r.name.toLowerCase().trim().indexOf(e)!=-1));this._checkEmpty(n),this._setList(n,"PA",t)}}_filterSP(e,t){let{actor:a,tokenId:s}=o._getActor();if(a){let i=["spell","ritual"],n=a.items.filter(r=>i.includes(r.type)&&r.name.toLowerCase().trim().indexOf(e)!=-1).slice(0,5).map(r=>({name:r.name,type:"item"}));this._checkEmpty(n),this._setList(n,"SP",t)}}_checkEmpty(e){e.length||e.push({name:game.i18n.localize("DSAError.noMatch"),type:"none"})}_filterLI(e,t){let{actor:a,tokenId:s}=o._getActor();if(a){let i=["liturgy","ceremony"],n=a.items.filter(r=>i.includes(r.type)&&r.name.toLowerCase().trim().indexOf(e)!=-1).slice(0,5).map(r=>({name:r.name,type:"item"}));this._checkEmpty(n),this._setList(n,"LI",t)}}_getSkills(e,t=void 0){e=e.replace(/(-|\+)?\d+/g,"").trim();let a=o.skills.filter(s=>s.name.toLowerCase().trim().indexOf(e)!=-1&&(t==null||t==s.type)).slice(0,5);return this._checkEmpty(a),a}_filterCH(e,t){this._setList(this._getSkills(e),"CH",t)}_filterSK(e,t){this._setList(this._getSkills(e),"SK",t)}_filterRQ(e,t){this._setList(this._getSkills(e),"RQ",t)}_filterGC(e,t){this._setList(this._getSkills(e,"skill"),"GC",t)}_setList(e,t,a){let s=$(`
    ${e.map(r=>`
  • ${r.name}
  • `).join("")}
`);s.find(".quick-item:first").addClass("focus");let i=$(a.currentTarget).closest("#chat-form"),n=i.find(".quickfind");n.length?n.replaceWith(s):i.append(s)}_navigateQuickFind(e){if(this.filtering){let t=$(e.currentTarget).closest("#chat-form").find(".focus");switch(e.which){case 38:return t.prev(".quick-item").length&&t.removeClass("focus").prev(".quick-item").addClass("focus"),!1;case 40:return t.next(".quick-item").length&&t.removeClass("focus").next(".quick-item").addClass("focus"),!1;case 13:if(t.attr("data-category")=="W")break;return e.stopPropagation(),e.preventDefault(),this._quickSelect(t),!1;case 9:return e.stopPropagation(),e.preventDefault(),this._completeCurrentEntry(t),!1}}return!0}static _getActor(){let e=ChatMessage.getSpeaker(),t;return e.token&&(t=game.actors.tokens[e.token]),t||(t=game.actors.get(e.actor)),t?{actor:t,tokenId:e.token}:(ui.notifications.error("DSAError.noProperActor",{localize:!0}),{})}_quickSelect(e){let t=e.attr("data-category");switch(t){case"NM":case"GC":case"RQ":case"CH":this[`_quick${t}`](e);break;case"W":this._completeCurrentEntry(e);break;default:let{actor:a,tokenId:s}=o._getActor();a&&(this._resetChatAutoCompletion(e),this[`_quick${t}`](e,a,s))}}_quickW(e,t,a){}_quickCH(e){le.check3D20(e),this._resetChatAutoCompletion(e)}_quickSK(e,t,a){switch(e.attr("data-type")){case"skill":let s=t.items.find(n=>n.name==e.text()&&n.type=="skill");s&&t.setupSkill(s,{},a).then(n=>{t.basicTest(n)});break;case"attribute":let i=Object.keys(game.dsa5.config.characteristics).find(n=>game.i18n.localize(game.dsa5.config.characteristics[n])==e.text());t.setupCharacteristic(i,{},a).then(n=>{t.basicTest(n)});break;case"regeneration":t.setupRegeneration("regenerate",{},a).then(n=>{t.basicTest(n)});break}}_resetChatAutoCompletion(e){let t=e.closest("#chat-form");t.find("#chat-message").val(""),t.find(".quickfind").remove()}_quickGC(e){let t=Number($("#chat-message").val().match(/(-|\+)?\d+/g))||0;this._resetChatAutoCompletion(e),ie.showGCMessage(e.text(),t)}_quickRQ(e){let t=Number($("#chat-message").val().match(/(-|\+)?\d+/g))||0;this._resetChatAutoCompletion(e),ie.showRQMessage(e.text(),t)}_quickPA(e,t,a){let s=e.text();if(this.combatConstants.dodge==s)t.setupDodge({},a).then(i=>{t.basicTest(i)});else if(this.combatConstants.parryWeaponless==s)t.setupWeaponless("parry",{},a).then(i=>{t.basicTest(i)});else{let i=["meleeweapon"],n=t.items.find(r=>i.includes(r.type)&&r.name==e.text());n&&t.setupWeapon(n,"parry",{},a).then(r=>{t.basicTest(r)})}}_quickAT(e,t,a){let s=e.text();if(this.combatConstants.attackWeaponless==s)t.setupWeaponless("attack",{},a).then(i=>{t.basicTest(i)});else{let i=["meleeweapon","rangeweapon"],n=["meleeAttack","rangeAttack"],r=t.items.find(l=>i.includes(l.type)&&l.name==e.text());r||(r=t.items.find(l=>l.type=="trait"&&l.name==e.text()&&n.includes(l.system.traitType.value))),r&&t.setupWeapon(r,"attack",{},a).then(l=>{t.basicTest(l)})}}_quickSP(e,t,a){let s=["ritual","spell"],i=t.items.find(n=>s.includes(n.type)&&n.name==e.text());i&&t.setupSpell(i,{},a).then(n=>{t.basicTest(n)})}_quickLI(e,t,a){let s=["liturgy","ceremony"],i=t.items.find(n=>s.includes(n.type)&&n.name==e.text());i&&t.setupSpell(i,{},a).then(n=>{t.basicTest(n)})}static async infoItemAsync(e){(await fromUuid(e)).postItem()}static bindRollCommands(e){e.on("click",".request-roll",s=>{let i=s.currentTarget.dataset;return ie.showRQMessage(i.name,Number(i.modifier)||0,i.label),s.stopPropagation(),!1}),e.on("click",".postInfo",s=>{let i=fromUuidSync(s.currentTarget.dataset.uuid);return i&&(typeof i.postItem=="function"?i.postItem():this.infoItemAsync(s.currentTarget.dataset.uuid)),s.stopPropagation(),!1}),e.on("click",".postContentChat",async s=>{let i=$(s.currentTarget).closest(".postChatSection").find(".postChatContent").html();ft.getDialog(i)}),e.on("click",".request-GC",s=>(ie.showGCMessage(s.currentTarget.dataset.name,Number(s.currentTarget.dataset.modifier)||0),s.stopPropagation(),!1)),e.on("click",".request-CH",s=>(le.check3D20($(s.currentTarget),s.currentTarget.dataset.name,{modifier:Number(s.currentTarget.dataset.modifier)||0}),s.stopPropagation(),!1)),e.on("click",".request-Pay",s=>{if(!game.user.isGM)return;let i=game.dsa5.apps.gameMasterMenu;i.doPayment(i.selectedIDs(),!0,s.currentTarget.dataset.modifier)}),e.on("click",".request-GetPaid",s=>{if(!game.user.isGM)return;let i=game.dsa5.apps.gameMasterMenu;i.doPayment(i.selectedIDs(),!1,s.currentTarget.dataset.modifier)}),e.on("click",".request-AP",s=>{if(!game.user.isGM)return;let i=game.dsa5.apps.gameMasterMenu;i.getExp(i.selectedIDs(),s.currentTarget.dataset.modifier)});let t=u(s=>{s.stopPropagation();let i=s.currentTarget.dataset.type,n=s.currentTarget.dataset.uuid;!n||!i||s.originalEvent.dataTransfer.setData("text/plain",JSON.stringify({type:i,uuid:n}))},"itemDragStart"),a=e.find(".show-item");a.click(async s=>{let i=s.currentTarget.dataset.uuid;(await fromUuid(i)).sheet.render(!0)}),a.attr("draggable",!0).on("dragstart",s=>t(s)),e.on("click",".actorEmbeddedAbility",async s=>{let n=(await fromUuid(s.currentTarget.dataset.actor)).items.get(s.currentTarget.dataset.id);n&&n.sheet.render(!0)})}};var{mergeObject:Er}=foundry.utils,ie=class o{static{u(this,"RequestRoll")}static async requestGC(e,t,a,s=0){let{actor:i,tokenId:n}=re._getActor();if(!i)return;game.user.updateTokenTargets([]);let r={modifier:s,postFunction:{cummulative:a,functionName:"game.dsa5.apps.RequestRoll.autoEditGroupCheckRoll"}};switch(e){case"attribute":break;default:let l=i.items.find(c=>c.name==t&&c.type==e);i.setupSkill(l,r,n).then(async c=>{let m=await i.basicTest(c);await o.editGroupCheckRoll(a,m,t,e)})}}static async autoEditGroupCheckRoll(e,t,a){await o.editGroupCheckRoll(e.cummulative,t,a.name,a.type)}static async editGroupCheckRoll(e,t,a,s){let i=await game.messages.get(e),n=i.flags,l=t.result.successLevel>1?2:1;n.botched=n.botched||t.result.successLevel<-1;let c=g.getSpeaker(t.result.speaker),m={messageId:t.result.messageId,actor:c.name,qs:(t.result.qualityStep||0)*l,success:t.result.successLevel,target:a,type:s},d=n.results.findIndex(p=>p.messageId==m.messageId);d>=0?n.results[d]=m:n.results.push(m),o.rerenderGC(i,n)}static async requestRoll(e,t,a=0,s={}){let{actor:i,tokenId:n}=re._getActor();if(i)switch(game.user.updateTokenTargets([]),s.modifier=a,e){case"attribute":let r=Object.keys(game.dsa5.config.characteristics).find(c=>game.i18n.localize(game.dsa5.config.characteristics[c])==t);i.setupCharacteristic(r,s,n).then(c=>{i.basicTest(c)});break;case"regeneration":i.setupRegeneration("regenerate",s,n).then(c=>{i.basicTest(c)});break;case"fallingDamage":i.setupFallingDamage(s,n);break;default:let l=i.items.find(c=>c.name==t&&c.type==e);i.setupSkill(l,s,n).then(c=>{i.basicTest(c)})}}static async rerenderGC(e,t){if(game.user.isGM){let a=0;t.qs=t.results.reduce((i,n)=>(a+=n.success<0?1:0,n.success>1&&(a=0),i+n.qs),0),t.failed=a;for(let i of t.rollOptions)i.calculatedModifier=i.modifier-a;t.openRolls=t.maxRolls-t.results.length,t.doneRolls=t.results.length;let s=await renderTemplate("systems/dsa5/templates/chat/roll/groupcheck.html",t);e.update({content:s,flags:t})}else game.socket.emit("system.dsa5",{type:"updateGroupCheck",payload:{messageId:e.id,data:t}});$("#chat-log").find(`[data-message-id="${e.id}"`).appendTo("#chat-log")}static showRQMessage(e,t=0,a=void 0){let s=t<0?` ${t}`:t>0?` +${t}`:"",i=re.skills.find(r=>r.name==e).type,n=game.i18n.format("CHATNOTIFICATION.requestRoll",{user:game.user.name,item:` ${a||e}${s}`});ChatMessage.create(g.chatDataSetup(n))}static async showGCMessage(e,t=0,a={}){let s=re.skills.find(l=>l.name==e).type,i={results:[],qs:0,failed:0,modifier:t,name:game.user.name,maxRolls:7,openRolls:7,doneRolls:0,targetQs:10,rollOptions:[{type:s,modifier:t,calculatedModifier:t,target:e}]};Er(i,a);let n=await renderTemplate("systems/dsa5/templates/chat/roll/groupcheck.html",i),r=g.chatDataSetup(n);r.flags=i,ChatMessage.create(r)}static async addSkillToGC(e){let t=$(e.currentTarget).parents(".message").attr("data-message-id"),a=await renderTemplate("systems/dsa5/templates/dialog/addgroupcheckskill.html",{skills:re.skills.filter(i=>i.type=="skill").sort((i,n)=>i.name.localeCompare(n.name))}),s={title:game.i18n.localize("HELP.groupcheck"),content:a,buttons:{ok:{icon:'',label:game.i18n.localize("ok"),callback:u(async i=>{let n=game.messages.get(t),r=n.flags;r.rollOptions.push({type:"skill",modifier:i.find('[name="modifier"]').val(),target:i.find('[name="skill"]').val()}),o.rerenderGC(n,r)},"callback")},cancel:{icon:'',label:game.i18n.localize("cancel")}}};new ae(s).render(!0)}static async removeGCEntry(e){let t=$(e.currentTarget),a=Number(e.currentTarget.dataset.index),s=game.messages.get(t.parents(".message").attr("data-message-id")),i=s.flags;i.results.splice(a,1),o.rerenderGC(s,i)}static removeSkillFromGC(e){let t=$(e.currentTarget),a=game.messages.get(t.parents(".message").attr("data-message-id")),s=a.flags;s.rollOptions=s.rollOptions.filter(i=>!(i.type==e.currentTarget.dataset.type&&i.target==e.currentTarget.dataset.name)),s.results=s.results.filter(i=>!(i.type==e.currentTarget.dataset.type&&i.target==e.currentTarget.dataset.name)),o.rerenderGC(a,s)}static async editGC(e){let t=$(e.currentTarget),a=Number(e.currentTarget.dataset.index),s=game.messages.get(t.parents(".message").attr("data-message-id")),i=s.flags;if(a)i.results[a].qs=Number(t.val());else if(e.currentTarget.dataset.name){let n=i.rollOptions.find(r=>r.target==e.currentTarget.dataset.name&&e.currentTarget.dataset.type==r.type);n[e.currentTarget.dataset.field]=Number(t.val())}else i[e.currentTarget.dataset.field]=Number(t.val());o.rerenderGC(s,i)}static async updateInformationRoll(e,t,a){let s=[],i=await fromUuid(e.uuid),n=t.result.qualityStep||0;for(let r=1;r<=n;r++){let l=`qs${r}`;i.system[l]&&s.push(i.system[l])}if(t.result.successLevel>1&&i.system.crit?s.push(i.system.crit):t.result.successLevel<-1&&i.system.botch?s.push(i.system.botch):i.system.fail&&!n&&s.push(i.system.fail),s.length>0){await Promise.all(s.map(async l=>await TextEditor.enrichHTML(l,{async:!0}))),s.unshift(`

${i.name}

`);let r=g.chatDataSetup(s.join(""));e.recipients.length&&(r.whisper=e.recipients),ChatMessage.create(r)}}static async informationRequestRoll(e){let t=e.currentTarget.dataset.mod,a=e.currentTarget.dataset.uuid,{actor:s,tokenId:i}=re._getActor();if(!s)return;let n=game.settings.get("dsa5","informationDistribution"),r=[];n==1?(r=game.users.filter(m=>m.isGM).map(m=>m.id),r.push(game.user.id)):n==2&&(r=game.users.filter(m=>m.isGM).map(m=>m.id));let l={modifier:t,postFunction:{functionName:"game.dsa5.apps.RequestRoll.updateInformationRoll",uuid:a,recipients:r}},c=s.items.find(m=>m.name==e.currentTarget.dataset.skill&&m.type=="skill");s.setupSkill(c,l,i).then(async m=>{m.testData.opposable=!1;let d=await s.basicTest(m);this.updateInformationRoll(l.postFunction,d)})}static chatListeners(e){e.on("change",".editGC",t=>o.editGC(t)),e.on("mousedown",".request-roll",t=>{let a=t.currentTarget.dataset,s={};if(t.button==2){let i=0,n=$(t.currentTarget).closest(".chat-message"),r=setInterval(function(){i++;let l=n.find("nav");l.length>0&&(l.remove(),clearInterval(r)),i>=20&&clearInterval(r)},10);s.rollMode="blindroll"}o.requestRoll(a.type,a.name,Number(a.modifier)||0,s)}),e.on("click",".request-gc",t=>{let a=t.currentTarget.dataset;o.requestGC(a.type,a.name,$(t.currentTarget).parents(".message").attr("data-message-id"),Number(a.modifier)||0)}),e.on("click",".removeGC",t=>o.removeGCEntry(t)),e.on("click",".removeSkillFromGC",t=>o.removeSkillFromGC(t)),e.on("click",".addSkillToGC",t=>o.addSkillToGC(t)),e.on("click",".informationRequestRoll",t=>o.informationRequestRoll(t))}};var{getProperty:da,duplicate:$r,mergeObject:Or}=foundry.utils,Nt=class o{static{u(this,"TableEffects")}static async applyEffect(e,t){let a=game.messages.get(e),s=da(a,"flags.dsa5.hasEffect"),i=da(a,"flags.dsa5.options")||{};if(s){let n=["damageModifier","gearDamaged","gearLost","resistEffect","malus","selfDamage","nextAction"],r=[],l;if(t=="self"){let m=g.getSpeaker(i.speaker);r.push(m),l=i.source?m.items.get(i.source):void 0}else r=Array.from(game.user.targets).map(m=>m.actor);for(let m of n){let d=da(s,m);d&&(await o[m](d,t,r,l,e,a)||console.warn(`Table effect for <${m} not working yet`,d,t,r,l))}let c=game.i18n.format("ActiveEffects.appliedEffect",{source:game.i18n.localize("table"),target:r.map(m=>m.name).join(", ")});await a.update({content:a.content.replace(/hideAnchor">/,`hideAnchor">`)})}}static async damageModifier(e,t,a,s){}static async nextAction(e,t,a,s){}static async opportunityAttack(e,t,a,s){}static async gearDamaged(e,t,a,s){if(s&&["meleeweapon","rangeweapon"].includes(s.type)){let i=da(s,"system.effect.attributes")||"";return new RegExp(`(${x.magical}|${x.clerical})`,"i").test(i)?await s.update({"system.worn.value":!1}):await W.absoluteDamageLevelToItem(s,e),!0}}static async gearLost(e,t,a,s){if(s&&["meleeweapon","rangeweapon"].includes(s.type)){if(await s.update({"system.worn.value":!1}),e.distance){let i=await new Roll(e.distance).evaluate(),n=await i.render(),r=game.i18n.format("WEAPON.dropped",{distance:i.total});ChatMessage.create(g.chatDataSetup(`

${r}

${n}`))}return!0}}static async resistEffect(e,t,a,s,i){for(let n of a){let r=[{skill:e.roll,mod:e.modifier||0,effect:{_id:"botchEffect",name:e.fail.description},target:n,token:n.token?n.token.id:void 0}];Z.createResistRollMessage(r,i,t)}return!0}static evaluateTargetArg(e,t){let a=t,s=!0;if(e.target=="victim"){let i=Array.from(game.user.targets).map(n=>n.actor);i.length?a=i:(s=!1,ui.notifications.warn("DSAError.noVictim",{localize:!0}))}return{hasTargets:s,finalTargets:a}}static async malus(e,t,a,s){for(let i of e){let{hasTargets:n,finalTargets:r}=this.evaluateTargetArg(i,a),l=!n&&i.noTarget,c=l?i.noTarget.systemEffect:i.systemEffect,m=l?i.noTarget.level:i.level||1,d=l?i.noTarget.changes:i.changes,p=l?i.noTarget.duration:i.duration;if(c){let f=CONFIG.statusEffects.find(y=>y.id==c);if(!d){d=$r(f.changes||[]);let y=d.find(k=>k.key==`system.condition.${c}`);y&&(y.value=m)}let h;if(d){let y=game.i18n.localize(`CONDITION.${c}`)+" - "+game.i18n.localize("botchCritEffect");h=J.effectBaseDummy(y,d,p||{}),h.icon=f.icon}else h=c;for(let y of r)await y.addCondition(h);return!0}else if(d){let f=J.effectBaseDummy(game.i18n.localize("botchCritEffect"),d||[],p||{});Or(f,{flags:{dsa5:{hideOnToken:!1,hidePlayers:!1}}});for(let h of r)await h.addCondition(f);return!0}}}static async selfAttack(e,t,a,s){let{hasTargets:i,finalTargets:n}=this.evaluateTargetArg(e,a)}static async selfDamage(e,t,a,s){let{hasTargets:i,finalTargets:n}=this.evaluateTargetArg(e,a);if(s){let r=g.toObjectIfPossible(s);for(let l of n){let c=l.items.filter(f=>f.type=="combatskill").map(f=>O._calculateCombatSkillValues(f.toObject(),l.system)),m;e.damage?m={damagedie:e.damage,damageAdd:""}:s.type=="rangeweapon"?m=O._prepareRangeWeapon(r,[],c,l):s.type=="meleeweapon"?m=O._prepareMeleeWeapon(r,c,l):m=s.system.traitType.value=="meleeAttack"?O._prepareRangeTrait(r,l.system):O._prepareMeleetrait(r,l.system);let d=(m.damagedie+m.damageAdd).replace(/wWD/g,"d"),p=await new Roll(`(${d})*${e.multiplier||1}${e.modifier||""}`).evaluate();await l.applyDamage(Math.round(p.total)),ChatMessage.create(g.chatDataSetup(await p.render()))}return!0}else{for(let r of n){let l=await new Roll("1d6").evaluate();await r.applyDamage(Math.round(l.total)),ChatMessage.create(g.chatDataSetup(await l.render()))}return!0}}};var{getProperty:ma}=foundry.utils,wt=u(async(o,e,t=1)=>{let a=game.messages.get(o[0].dataset.messageId),s=a.flags.opposeData,i=s?.speakerDefend,n=g.getSpeaker(i);if(!n.isOwner)return ui.notifications.error("DSAError.DamagePermission",{localize:!0});await n.applyDamage(s.damage[e]*t);let r={"flags.data.damageApplied":!0,content:a.content.replace(/hideAnchor">/,`hideAnchor">`)};game.user.isGM?await a.update(r):game.socket.emit("system.dsa5",{type:"updateMsg",payload:{id:o[0].dataset.messageId,updateData:r}})},"applyDamage");function $n(){let o=u((S,M)=>g.fateAvailable(S,M),"fateAvailable"),e=u(function(S,M="damage.value"){let T=game.messages.get(S[0].dataset.messageId).flags.opposeData,L=T?g.getSpeaker(T.speakerDefend)?.isOwner:!1;return((game.user.isGM||L)&&S.find(".opposed-card").length||S.find(".dice-roll").length)&&(ma(T,M)||0)>0},"canHurt"),t=u(function(S){return e(S,"damage.sp")},"canHurtSP"),a=u(function(S){let M=game.messages.get(S[0].dataset.messageId);return M.speaker.actor&&M.flags.data&&(game.actors.get(M.speaker.actor).isOwner||game.user.isGM)?["liturgy","ceremony","spell","ritual","magicalsign"].includes(M.flags.data.preData.source.type)||ma(M.flags.data.preData,"calculatedSpellModifiers.costsMana"):!1},"canCostMana"),s=u(function(S){if(!(game.user.isGM&&game.settings.get("dsa5","hideOpposedDamageSelect")))return!1;let M=game.messages.get(S[0].dataset.messageId);return"hideData"in M.flags&&M.flags.hideData},"canUnhideData"),i=u(function(S){if(!(game.user.isGM&&game.settings.get("dsa5","hideOpposedDamageSelect")))return!1;let M=game.messages.get(S[0].dataset.messageId);return"hideData"in M.flags&&!M.flags.hideData},"canHideData"),n=u(function(S,M=!1){let T=game.messages.get(S[0].dataset.messageId);if(T.speaker.actor&&T.flags.data&&T.flags.data.postData.successLevel>-2){let L=game.actors.get(T.speaker.actor);if(L.isOwner&&o(L,M)){let q=T.flags.data.preData.source.type,ve=T.flags.data.preData.mode||"";["skill","spell","liturgy","ritual","ceremony"].includes(q)&&(q="char");let Te=game.i18n.localize(`SCHIPSKILLS.${q}${ve}`);return!T.flags.data.fateImproved&&L.items.getName(Te)}}return!1},"canImproveRoll"),r=u(function(S){return n(S,!0)},"canImproveRollGroup"),l=u(function(S,M=!1){let T=game.messages.get(S[0].dataset.messageId);if(T.speaker.actor&&T.flags.data){let L=game.actors.get(T.speaker.actor);if(L.isOwner&&o(L,M)&&!T.flags.data.fatePointAddQSUsed)return T.flags.data.postData.successLevel>0&&T.flags.data.postData.qualityStep!=null}return!1},"canIncreaseQS"),c=u(function(S){return l(S,!0)},"canIncreaseQSGroup"),m=u(function(S){let M=game.messages.get(S[0].dataset.messageId);if(M.speaker.actor&&M.flags.data){let T=game.actors.get(M.speaker.actor);if(T.isOwner)return T.items.find(L=>L.name==`${game.i18n.localize("LocalizedIDs.aptitude")} (${M.flags.data.preData.source.name})`)!=null&&!M.flags.data.talentedRerollUsed}return!1},"isTalented"),d=u(function(S,M=!1){let T=game.messages.get(S[0].dataset.messageId);if(T.speaker.actor&&T.flags.data){let L=game.actors.get(T.speaker.actor);if(L.isOwner&&o(L,M))return T.flags.data.postData.damageRoll!=null&&!T.flags.data.fatePointDamageRerollUsed}return!1},"canRerollDamage"),p=u(function(S){return d(S,!0)},"canRerollDamageGroup"),f=u(function(S,M=!1){let T=game.messages.get(S[0].dataset.messageId);if(T.speaker.actor&&T.flags.data){let L=game.actors.get(T.speaker.actor);if(L.isOwner&&o(L,M))return!T.flags.data.fatePointRerollUsed&&T.flags.data.postData.rollType!="regenerate"}return!1},"canReroll"),h=u(function(S){return f(S,!0)},"canRerollGroup"),y=u(function(S){let M=game.messages.get(S[0].dataset.messageId);return M.speaker.actor&&M.flags.data&&game.actors.get(M.speaker.actor).isOwner&&["LeP","KaP","AsP"].some(L=>ma(M.flags,`data.postData.${L}`)!=null)?!M.flags.data.healApplied:!1},"canHeal"),k=u(function(S){if(game.user.isGM){let M=game.messages.get(S[0].dataset.messageId);if("hideData"in M.flags){let T=!M.flags.hideData,L=$(M.content);L.find(".hideAnchor")[T?"addClass":"removeClass"]("hideData"),L=$("
").append(L),M.update({content:L.html(),"flags.hideData":T})}}},"showHideData"),D=u(S=>{let M=game.messages.get(S.data("messageId"));return!M||!canvas.tokens?!1:M.isRoll&&M.isContentVisible&&canvas.tokens.controlled.length&&S.find(".dice-roll").length},"canApplyDefaultRolls"),v=u((S,M,T=0)=>{let L=game.messages.get(S[0].dataset.messageId);game.actors.get(L.speaker.actor).useFateOnRoll(L,M,T)},"useFate"),I=u((S,M,T=1)=>{let q=game.messages.get(S.data("messageId")).rolls[0];return Promise.all(canvas.tokens.controlled.map(ve=>{let Te=ve.actor,qe=Math.round((M!="sp"?q.total-O.armorValue(Te).armor:q.total)*T);return Te.applyDamage(Math.max(0,qe))}))},"applyChatCardDamage"),A=u(async S=>{let M=game.messages.get(S[0].dataset.messageId),T=M.flags.data,L=g.getSpeaker(M.speaker);if(!L.isOwner)return ui.notifications.error("DSAError.DamagePermission",{localize:!0});let q=T.preData.calculatedSpellModifiers.maintainCost.trim(),ve=["ritual","spell"].includes(T.preData.source.type)||ma(T.preData.calculatedSpellModifiers,"costsMana")?"AsP":"KaP",Te=await L.applyMana(T.preData.calculatedSpellModifiers.finalcost,ve);if(q&&q!=0&&Te&&T.postData.successLevel>0){let qe=T.preData.source.name;try{let St=q.match(/^\d{1,3}/)[0],lt=q.replace(/^\d{1,3}/,"").match(/\d{1,3}/);lt=lt&&Number(lt[0])||1;let ct={name:`${qe} (${game.i18n.localize("maintainCost")})`,img:"icons/svg/daze.svg",flags:{dsa5:{description:q,maintain:St,payType:ve}},changes:[],duration:{}},Zt=[{regEx:new RegExp(game.i18n.localize("DSAREGEXmaintain.combatRounds"),"gi"),seconds:5},{regEx:new RegExp(game.i18n.localize("DSAREGEXmaintain.minutes"),"gi"),seconds:60},{regEx:new RegExp(game.i18n.localize("DSAREGEXmaintain.hours"),"gi"),seconds:3600},{regEx:new RegExp(game.i18n.localize("DSAREGEXmaintain.days"),"gi"),seconds:3600*24},{regEx:new RegExp(game.i18n.localize("DSAREGEXmaintain.seconds"),"gi"),seconds:1},{regEx:new RegExp(game.i18n.localize("DSAREGEXmaintain.weeks"),"gi"),seconds:3600*24*7},{regEx:new RegExp(game.i18n.localize("DSAREGEXmaintain.months"),"gi"),seconds:3600*24*30},{regEx:new RegExp(game.i18n.localize("DSAREGEXmaintain.years"),"gi"),seconds:3600*24*350}];for(let At of Zt)if(At.regEx.test(q)){let w=Number(lt)*At.seconds;ct.duration.seconds=w,ct.duration.rounds=ct.duration.seconds/5;break}await L.addCondition(ct)}catch{console.error(`Could not parse duration '${q}' of '${qe}'`)}}await M.update({"flags.data.manaApplied":!0,content:M.content.replace(//,'')})},"payMana"),j=u(()=>game.i18n.localize(game.combat?.isBrawling?"CHATCONTEXT.ApplyDamagePP":"CHATCONTEXT.ApplyDamage"),"applyDamageLabel");Hooks.on("getChatLogEntryContext",(S,M)=>{M.push({name:"CHATCONTEXT.hideData",icon:'',condition:i,callback:u(T=>{k(T)},"callback")},{name:"CHATCONTEXT.showData",icon:'',condition:s,callback:u(T=>{k(T)},"callback")},{name:"regenerate",icon:'',condition:y,callback:u(async T=>{let L=await game.messages.get(T[0].dataset.messageId),q=g.getSpeaker(L.speaker);if(!q.isOwner)return ui.notifications.error("DSAError.DamagePermission",{localize:!0});await L.update({"flags.data.healApplied":!0,content:L.content.replace(/<\/div>$/,'
')}),await q.applyRegeneration(L.flags.data.postData.LeP,L.flags.data.postData.AsP,L.flags.data.postData.KaP)},"callback")},{name:"CHATCONTEXT.ApplyMana",icon:'',condition:a,callback:u(async T=>{A(T)},"callback")},{name:j(),icon:'',condition:e,callback:u(T=>{wt(T,"value")},"callback")},{name:"CHATCONTEXT.ApplyDamageSP",icon:'',condition:t,callback:u(T=>{wt(T,"sp")},"callback")},{name:j(),icon:'',condition:D,callback:u(T=>{I(T,"value")},"callback")},{name:"CHATCONTEXT.ApplyDamageSP",icon:'',condition:D,callback:u(T=>{I(T,"sp")},"callback")},{name:"CHATCONTEXT.Reroll",icon:'',condition:f,callback:u(T=>{v(T,"reroll")},"callback")},{name:"CHATCONTEXT.RerollGroup",icon:'',condition:h,callback:u(T=>{v(T,"reroll",1)},"callback")},{name:"CHATCONTEXT.talentedReroll",icon:'',condition:m,callback:u(T=>{v(T,"isTalented")},"callback")},{name:"CHATCONTEXT.AddQS",icon:'',condition:l,callback:u(T=>{v(T,"addQS")},"callback")},{name:"CHATCONTEXT.AddQSGroup",icon:'',condition:c,callback:u(T=>{v(T,"addQS",1)},"callback")},{name:"CHATCONTEXT.rerollDamage",icon:'',condition:d,callback:u(T=>{v(T,"rerollDamage")},"callback")},{name:"CHATCONTEXT.rerollDamageGroup",icon:'',condition:p,callback:u(T=>{v(T,"rerollDamage",1)},"callback")},{name:"CHATCONTEXT.improveFate",icon:'',condition:n,callback:u(T=>{v(T,"Improve")},"callback")},{name:"CHATCONTEXT.improveFateGroup",icon:'',condition:r,callback:u(T=>{v(T,"Improve",1)},"callback")}),game.settings.get("dsa5","doubleDamageOptions")&&M.push({name:j()+" x2",icon:'',condition:e,callback:u(T=>{wt(T,"value",2)},"callback")},{name:game.i18n.localize("CHATCONTEXT.ApplyDamageSP")+" x2",icon:'',condition:t,callback:u(T=>{wt(T,"sp",2)},"callback")},{name:j()+" x2",icon:'',condition:D,callback:u(T=>{I(T,"value",2)},"callback")},{name:game.i18n.localize("CHATCONTEXT.ApplyDamageSP")+" x2",icon:'',condition:D,callback:u(T=>{I(T,"sp",2)},"callback")})})}u($n,"chatContext");var{mergeObject:oe,deepClone:On,duplicate:xr,getProperty:$e}=foundry.utils,R=class _DiceDSA5{static{u(this,"DiceDSA5")}static async rollTest(o){let e;switch(o.source.type){case"ceremony":case"ritual":case"liturgy":case"spell":e=await this.rollSpell(o);break;case"skill":e=await this.rollTalent(o);break;case"combatskill":e=await this.rollCombatskill(o);break;case"trait":o.mode=="parry"&&await this.updateDefenseCount(o),e=o.mode=="damage"?await this.rollDamage(o):await this.rollCombatTrait(o);break;case"regenerate":e=await this.rollRegeneration(o);break;case"meleeweapon":case"rangeweapon":o.mode=="parry"&&await this.updateDefenseCount(o),e=o.mode=="damage"?await this.rollDamage(o):await this.rollWeapon(o);break;case"dodge":await this.updateDefenseCount(o),e=await this.rollStatus(o);break;case"poison":case"disease":e=await this.rollItem(o);break;case"fallingDamage":e=await this.rollFallingDamage(o);break;default:e=await this.rollAttribute(o)}return oe(e,On(o.extra)),e}static async rollDices(o,e){if(!o.roll){let t=game.dsa5.apps.DiceSoNiceCustomization.getAttributeConfiguration,a;switch(o.source.type){case"liturgy":case"spell":case"ceremony":case"ritual":case"skill":a=await new Roll("1d20+1d20+1d20").evaluate(),oe(a.dice[0].options,t(o.source.system.characteristic1.value)),oe(a.dice[1].options,t(o.source.system.characteristic2.value)),oe(a.dice[2].options,t(o.source.system.characteristic3.value));break;case"regenerate":let s=[];o.regenerateLeP&&s.push([game.settings.get("dsa5","lessRegeneration")?"1d3":"1d6"]),o.extra.actor.isMage&&o.regenerateAsP&&s.push("1d6"),o.extra.actor.isPriest&&o.regenerateKaP&&s.push("1d6"),a=await new Roll(s.join("+")).evaluate(),o.regenerateLeP&&oe(a.dice[0].options,t("mu")),o.extra.actor.isMage&&o.regenerateAsP&&oe(a.dice[s.length-1].options,t("ge")),o.extra.actor.isPriest&&o.regenerateKaP&&oe(a.dice[s.length-1].options,t("in")),o.extra.actor.isMage&&o.regenerateAsP&&o.extra.actor.isPriest&&o.regenerateKaP&&oe(a.dice[s.length-2].options,t("ge"));break;case"meleeweapon":case"rangeweapon":case"weaponless":case"combatskill":case"trait":if(o.mode=="damage"){let l=await this.damageFormula(o);a=await new Roll(l,o.extra.actor.system).evaluate();for(let c=0;c{r.actor&&n.push({name:r.actor.name,id:r.id,img:r.actor.img})}),oe(o.data,{hasSituationalModifiers:i.length>0,situationalModifiers:i,attributesList:["mu","kl","in","ch","ff","ge","ko","kk"].reduce((r,l)=>(r[l]=game.i18n.localize(`CHARAbbrev.${l.toUpperCase()}`),r),{}),rollMode:o.data.rollMode||a,defenseCount:await this.getDefenseCount(e),targets:n}),t.user=game.user.id,e.extra.options.bypass)return t.rollMode=e.extra.options.rollMode||a,e.situationalModifiers||(e.situationalModifiers=[]),{testData:e,cardOptions:t,dialogOptions:o};{let r=ae.getDialogForItem(e,o.data),l=await renderTemplate(o.template,o.data);return new Promise((c,m)=>{new r({title:o.title,content:l,buttons:r.getRollButtons(e,o,c,m),default:"rollButton"}).recallSettings(e.extra.speaker,e.source,e.mode,o.data).render(!0)})}}static async getDefenseCount(o){return game.combat?await game.combat.getDefenseCount(o.extra.speaker):0}static async getDuplicatusRoll(o,e){let t=e.situationalModifiers.find(a=>a.name.includes("Duplicatus")&&a.value>0&&a.value<5);if(t){let a=Math.round(1/(t.value+1)*20),s=await _DiceDSA5.manualRolls(await new Roll("1d20").evaluate());this._addRollDiceSoNice(e,s,game.dsa5.apps.DiceSoNiceCustomization.getAttributeConfiguration("ch"));let i=a>=s._total,n=`
Duplicatus-${game.i18n.localize("Roll")}: ${s._total}0&&(o.description=`${game.i18n.localize("Failure")}, ${game.i18n.localize("CHATNOTIFICATION.duplicatus")}`,o.successLevel=0)}}static async _rollConfirm(){return await new Roll("1d20").evaluate()}static async _rollSingleD20(o,e,t,a,s,i="",n=1){let r="";e=Math.round((e+a)*n);let l=o.total??o._total,c=game.dsa5.apps.DiceSoNiceCustomization.getAttributeConfiguration(t),m=e-l>=0,d=[{char:t,res:l,suc:m,tar:e}],p=m?1:-1,f=20,h=1,y={meleeweapon:"meleeStats",rangeweapon:"rangeStats"}[s.source.type];y&&(f=Math.min(s.extra.actor.system[y].botch,s.source.system.botch),h=Math.max(s.extra.actor.system[y].crit,s.source.system.crit)),N.improvisedWeapon.test(s.source.name)&&(F.hasAbility(s.extra.actor,game.i18n.localize("LocalizedIDs.improvisedWeaponMaster"))||(f=Math.min(19,f)),this._appendSituationalModifiers(s,`${game.i18n.localize("CHAR.ATTACK")} - ${game.i18n.localize("WEAPON.improvised")}`,2,"defenseMalus")),s.situationalModifiers.find(v=>v.name==game.i18n.localize("MODS.opportunityAttack")&&v.value!=0)&&(f=50,h=-50);let k=l<=h,D=l>=f;if(k||D){if(r=game.i18n.localize(k?"CriticalSuccess":"CriticalFailure"),p=k?3:-3,!game.settings.get("dsa5","noConfirmationRoll")){let v=await _DiceDSA5.manualRolls(await _DiceDSA5._rollConfirm(),"confirmationRoll",s.extra.options),I=$e(s.source,`system.${k?"critConfirm":"botchConfirm"}`)||0,A=e-Math.clamp(v.total+I,1,20);if(P.hasVantage(s.extra.actor,`${game.i18n.localize("LocalizedIDs.weaponAptitude")} (${i})`)&&!(A>=0)){let S=v.total;v=await _DiceDSA5.manualRolls(await _DiceDSA5._rollConfirm(),"LocalizedIDs.weaponAptitude",s.extra.options),A=e-Math.clamp(v.total+I,1,20),r+=`, ${game.i18n.format("usedWeaponExpertise",{a:S,b:v.total})}`}this._addRollDiceSoNice(s,v,c);let j=A>=0;D&&(j=!j),d.push({char:t,res:Math.clamp(v.total+I,1,20),suc:j,tar:e}),r=`${game.i18n.localize(j?"confirmed":"unconfirmed")} ${r}`,j?p=k?3:-3:p=k?2:-2}}else r=game.i18n.localize(m?"Success":"Failure");return{successLevel:p,characteristics:d,description:r,preData:s,modifiers:a,extra:{attackFromBehind:s.extra.attackFromBehind}}}static async rollFallingDamage(o){let e=o.roll,t=[];for(let s of e.terms[0].results)t.push({char:"damage",res:s.result,suc:!1});return{rollType:"fallingDamage",preData:o,modifiers:await this._situationalModifiers(o),extra:{},damage:Math.max(0,e.total),formula:e.formula,characteristics:t}}static async rollRegeneration(o){let e=await this._situationalModifiers(o),t=o.roll,a=[],s={rollType:"regenerate",preData:o,modifiers:e,extra:{}},i=[];o.regenerateLeP&&i.push("LeP"),o.extra.actor.system.isMage&&o.regenerateAsP&&i.push("AsP"),o.extra.actor.system.isPriest&&o.regenerateKaP&&i.push("KaP");let n=0;if(o.extra.actor.effects.some(l=>l.statuses.includes("sick"))){this._appendSituationalModifiers(o,game.i18n.localize("CONDITION.sick"),"*0");for(let l of i)a.push({char:l,res:0,die:"d6"}),s[l]=0,n+=2}else for(let l of i)this._appendSituationalModifiers(o,game.i18n.localize(`LocalizedIDs.regeneration${l}`),P.vantageStep(o.extra.actor,game.i18n.localize(`LocalizedIDs.regeneration${l}`)),l),this._appendSituationalModifiers(o,game.i18n.localize(`LocalizedIDs.weakRegeneration${l}`),P.vantageStep(o.extra.actor,game.i18n.localize(`LocalizedIDs.weakRegeneration${l}`))*-1,l),this._appendSituationalModifiers(o,game.i18n.localize(`LocalizedIDs.advancedRegeneration${l}`),F.abilityStep(o.extra.actor,game.i18n.localize(`LocalizedIDs.advancedRegeneration${l}`)),l),this._appendSituationalModifiers(o,`${game.i18n.localize(`CHARAbbrev.${l}`)} ${game.i18n.localize("Modifier")}`,o[`${l}Modifier`],l),this._appendSituationalModifiers(o,`${game.i18n.localize(`CHARAbbrev.${l}`)} ${game.i18n.localize("regenerate")}`,o[`regeneration${l}`],l),a.push({char:l,res:t.terms[n].results[0].result,die:"d6"}),s[l]=Math.round(Math.max(0,Number(t.terms[n].results[0].result)+Number(e)+await this._situationalModifiers(o,l))*Number(o.regenerationFactor)),n+=2;return s.characteristics=a,s}static async rollStatus(o){let e=o.roll||await new Roll("1d20").evaluate(),t=await this._rollSingleD20(e,o.source.system.max,o.extra.statusId,await this._situationalModifiers(o),o,"",this._situationalMultipliers(o));t.rollType="dodge";let a=o.extra.statusId=="dodge";return a&&t.successLevel==3?await B.tableEnabledFor("criticalMeleeDefense")?t.description+=B.rollCritBotchButton("criticalMeleeDefense",!1,o,o):t.description+=B.defaultParryCrit():a&&t.successLevel==-3&&(await B.tableEnabledFor("Defense")?t.description+=B.rollCritBotchButton("Defense",!0,o,o):t.description+=await B.defaultBotch()),t}static async rollAttribute(o){let e=o.roll?o.roll:await new Roll("1d20").evaluate();this._appendSituationalModifiers(o,game.i18n.localize("Difficulty"),o.testDifficulty);let t=await this._rollSingleD20(e,o.source.system.value,o.extra.characteristicId,await this._situationalModifiers(o),o,"",this._situationalMultipliers(o));return t.rollType="attribute",t}static async damageFormula(o){let e;if(o.source.type=="meleeweapon"){let t=O._calculateCombatSkillValues(o.extra.actor.items.find(a=>a.type=="combatskill"&&a.name==o.source.system.combatskill.value),o.extra.actor.system);e=O._prepareMeleeWeapon(o.source,[t],o.extra.actor)}else if(o.source.type=="rangeweapon"){let t=O._calculateCombatSkillValues(o.extra.actor.items.find(a=>a.type=="combatskill"&&a.name==o.source.system.combatskill.value),o.extra.actor.system);e=O._prepareRangeWeapon(o.source,[],[t],o.extra.actor)}else e=o.source.system;return this.replaceDieLocalization(o.source.system.damage.value)+`+${e.extraDamage||0}`}static async rollDamage(o){let e=await this._situationalModifiers(o),t=[],a=o.roll,s=a.total+e;for(let i of a.terms)if(i instanceof foundry.dice.terms.Die||i.class=="Die")for(let n of i.results)t.push({char:o.mode,res:n.result,die:"d"+i.faces});return{rollType:"damage",damage:s,characteristics:t,preData:o,modifiers:e,extra:{}}}static async _situationalModifiers(o,e=""){let t=0;for(let a of o.situationalModifiers){if(a.value==null)continue;let s=Number(a.value)||await this._stringToRoll(a.value);t+=a.type==e||e==""&&a.type==null?s:0}return t}static _situationalPartCheckModifiers(o){return o.situationalModifiers.reduce(function(e,t){if(t.type=="TPM"){let a=t.value.split("|");return a.length!=3||(e[0]=e[0]+Number(a[0]),e[1]=e[1]+Number(a[1]),e[2]=e[2]+Number(a[2])),e}else return e},[0,0,0])}static _situationalMultipliers(o){return o.situationalModifiers.reduce(function(e,t){return e*(t.type=="*"&&Number(`${t.value}`.replace(/,/,"."))||1)},1)}static _appendSituationalModifiers(o,e,t,a=""){let s=o.situationalModifiers.find(i=>i.name==e);s?s.value=t:o.situationalModifiers.push({name:e,value:t,type:a})}static async rollCombatTrait(o){let e=o.roll||await new Roll("1d20").evaluate(),t=o.source,a=t.system.traitType.value=="meleeAttack",s=o.mode=="attack";if(a){let l={system:{combatskill:{value:"-"},reach:{value:t.system.reach.value}}};this._appendSituationalModifiers(o,game.i18n.localize("opposingWeaponSize"),this._compareWeaponReach(l,o))}let i=await this._rollSingleD20(e,Number(s?t.system.at.value:t.system.pa),o.mode,await this._situationalModifiers(o),o,"",this._situationalMultipliers(o));await this.getDuplicatusRoll(i,o);let n=i.successLevel>0;await this.detailedWeaponResult(i,o,t),s&&n&&await _DiceDSA5.evaluateDamage(o,i,t,!a,i.doubleDamage),i.rollType="weapon";let r=_DiceDSA5.parseEffect(t);return r&&(i.parsedEffect=r),i}static async _stringToRoll(o,e){let t=[],a=/\d{1}[dDwW]\d/g,s=`${o}`;s.replace(a,function(r){t.push(new Roll(_DiceDSA5.replaceDieLocalization(r),e.extra.actor.system).evaluate())});let i=await Promise.all(t),n=s.replace(a,()=>{let r=i.shift();return e&&_DiceDSA5._addRollDiceSoNice(e,r,game.dsa5.apps.DiceSoNiceCustomization.getAttributeConfiguration("ch")),r.total});return await Roll.safeEval(n)}static replaceDieLocalization(o){return o.replace(/[Ww](?=\d)/g,"d")}static async evaluateDamage(o,e,t,a,s){let i=this.replaceDieLocalization(t.system.damage.value),n=[],r=t.dmgMultipliers||[],l=r.map(y=>`${y.name} *${y.val}`),c=[],m=0;for(let y of o.situationalModifiers){let k=0;if(y.armorPen&&c.push(y.armorPen),y.damageBonus){if(/^\*/.test(y.damageBonus)){r.push({name:y.name,val:Number(y.damageBonus.replace("*",""))});continue}let D=/^=/.test(y.damageBonus),v=`${y.damageBonus}`.replace(/^=/,""),I=await _DiceDSA5._stringToRoll(v,o);if(k=I*(y.step||1),D){i=this.replaceDieLocalization(v),n.push({name:y.name,roll:I});continue}else y.damageBonus=I,m+=k}}let d=o.damageRoll||await _DiceDSA5.manualRolls(await new Roll(i,o.extra.actor.system).evaluate(),"CHAR.DAMAGE",o.extra.options),p=d.total,f=0;for(let y of d.terms)if(y instanceof foundry.dice.terms.Die||y.class=="Die")for(let k of y.results)f+=Number(k.result),e.characteristics.push({char:"damage",res:k.result,die:"d"+y.faces});let h=p-f;if(n.length>0)l.push(n[0].name+" "+p);else{p+=m,l.push(game.i18n.localize("Roll")+" "+f),h!=0&&l.push(game.i18n.localize("weaponModifier")+" "+h),o.situationalModifiers.reduce((I,A)=>{if(A.damageBonus){let j=/^\*/.test(A.damageBonus)?A.damageBonus:Number(A.damageBonus)*(A.step||1);l.push(`${A.name} ${j}`)}},l),o.situationalModifiers.find(I=>I.name.indexOf(game.i18n.localize("CONDITION.bloodrush"))>-1)&&(p+=2,l.push(game.i18n.localize("CONDITION.bloodrush")+" 2")),t.extraDamage&&(p=Number(t.extraDamage)+Number(p),l.push(game.i18n.localize("damageThreshold")+" "+t.extraDamage));let y=o.extra.actor.system[a?"rangeStats":"meleeStats"].damage,k=await _DiceDSA5._stringToRoll(y,o);k!=0&&(p+=k,l.push(game.i18n.localize("statuseffects")+" "+k));let D=$e(t,"system.combatskill.value"),v=o.extra.actor.system.skillModifiers.combat.damage.reduce((I,A)=>(A.target==D&&(I+=Number(A.value)),I),0);v&&(p=p+v,l.push(`${game.i18n.localize("TYPES.Item.combatskill")} (${game.i18n.localize("CHARAbbrev.damage")}) ${v}`))}s&&(p=p*s,l.push(game.i18n.format("doubleDamage",{x:s})));for(let y of r)p=p*y.val;e.armorPen=c,e.damagedescription=l.join(", "),e.damage=Math.round(p),e.damageRoll=xr(d)}static async rollWeapon(o){let e=o.roll||await new Roll("1d20").evaluate(),t,a=o.source,s=a.system.combatskill.value,i=O._calculateCombatSkillValues(o.extra.actor.items.find(c=>c.type=="combatskill"&&c.name==s),o.extra.actor.system,{step:await this._situationalModifiers(o,"step"),[o.mode]:await this._situationalModifiers(o,o.mode)}),n=a.type=="meleeweapon";n?(t=O._prepareMeleeWeapon(a,[i],o.extra.actor),o.mode=="attack"&&this._appendSituationalModifiers(o,game.i18n.localize("opposingWeaponSize"),this._compareWeaponReach(t,o))):t=O._prepareRangeWeapon(a,[],[i],o.extra.actor);let r=await this._rollSingleD20(e,t[o.mode],o.mode,await this._situationalModifiers(o),o,s,this._situationalMultipliers(o));await this.getDuplicatusRoll(r,o),await this.detailedWeaponResult(r,o,a),o.mode=="attack"&&r.successLevel>0&&!o.extra.counterAttack&&await _DiceDSA5.evaluateDamage(o,r,t,!n,r.doubleDamage),o.extra.counterAttack&&(g.getSpeaker(o.extra.speaker).addCondition("stunned"),r.description+=", "+g.replaceConditions(game.i18n.localize("stunnedByCounterAttack"))),r.rollType="weapon";let l=_DiceDSA5.parseEffect(t);return l&&(r.parsedEffect=l),r}static _weaponBotchCritEffect(o,e,t){let a=[];for(let s of o.effects)for(let i of s.changes)if(i.key==e){if(i.value=="description")a.push(s.description);else if(/^condition /.test(i.value)){let n=i.value.replace(/^condition /,"").split(" "),r=Number(n[1])||1,l=game.i18n.localize(`CONDITION.${n[0]}`),c=g.replaceConditions(game.i18n.format("CHATNOTIFICATION.suffersCondition",{actor:t.name,condition:l,count:r}));a.push(`

${c}

`)}}return a.join("
")}static async detailedWeaponResult(o,e,t){let a=e.mode=="attack"&&!e.extra.counterAttack,s=t.type=="meleeweapon"||$e(t,"system.traitType.value")=="meleeAttack";switch(o.successLevel){case 3:a?(await B.tableEnabledFor("criticalAttack")?o.description+=B.rollCritBotchButton("criticalAttack",!1,e):(o.description+=B.defaultAttackCrit(!0),o.doubleDamage=2),o.halfDefense=!0):e.isRangeDefense&&await B.tableEnabledFor("criticalRangeDefense")?o.description+=B.rollCritBotchButton("criticalRangeDefense",!1,e):await B.tableEnabledFor("criticalMeleeDefense")?o.description+=B.rollCritBotchButton("criticalMeleeDefense",!1,e):o.description+=B.defaultParryCrit(),o.description+=this._weaponBotchCritEffect(t,"self.criteffect",e.extra.actor);break;case-3:let i=$e(t,"system.combatskill.value")==game.i18n.localize("LocalizedIDs.wrestle")||t.type=="trait";a&&s&&await B.tableEnabledFor("Melee")?o.description+=B.rollCritBotchButton("Melee",i,e):a&&await B.tableEnabledFor("Range")?o.description+=B.rollCritBotchButton("Range",!1,e):!a&&await B.tableEnabledFor("Defense")?o.description+=B.rollCritBotchButton("Defense",i,e):o.description+=await B.defaultBotch(),o.description+=this._weaponBotchCritEffect(t,"self.botcheffect",e.extra.actor);break;case 2:a&&(o.description+=B.defaultAttackCrit(!1),o.halfDefense=!0);break;case-2:break}}static async _addRollDiceSoNice(o,e,t){if(o.rollMode){for(let a=0;a{new ae({title:game.i18n.localize(t.cheat?"DIALOG.cheat":"DSASETTINGS.allowPhysicalDice"),content:r,default:"ok",buttons:{ok:{icon:'',label:game.i18n.localize("yes"),callback:u(m=>l([!0,m]),"callback")},cancel:{icon:'',label:game.i18n.localize("cancel"),callback:u(()=>l([!1,0]),"callback")}}}).render(!0)}),s){let l=[];i.find(".dieInput").each(function(c){let m=Number($(this).val());m>0&&l.push({val:m,index:c}),c++}),o.editRollAtIndex(l)}}return o}static parseEffect(o){let e=o.system.effect?o.system.effect.value:void 0,t=[];if(e){let s=/^[a-z]+\|[öäüÖÄÜa-zA-z ]+$/;for(let i of e.split(";"))if(s.test(i.trim())){let n=i.split("|").map(r=>r.trim());if(n[0]=="condition"){let r=CONFIG.statusEffects.find(l=>l.id==n[1]);t.push(` + `}static async changeStartMessage(e){for(let t of e.flags.data.startMessagesList){let a=game.messages.get(t),s=a.flags.unopposeData;game.socket.emit("system.dsa5",{type:"target",payload:{target:s.targetSpeaker.token,scene:canvas.scene.id,opposeFlag:{speaker:e.speaker,messageId:e.id,startMessageId:a.id}}}),await a.update({"flags.unopposeData.attackMessageId":e.id})}}static resolveFinalMessage(e){let t,a;if(e.flags.data.defenderMessage)for(let s of e.flags.data.defenderMessage){t=o.getMessageDude(e);let i=game.messages.get(s);a=o.getMessageDude(i),this.completeOpposedProcess(t,a,{blind:e.blind,whisper:e.whisper})}else{a=o.getMessageDude(e);let s=game.messages.get(e.flags.data.attackerMessage);t=o.getMessageDude(s),this.completeOpposedProcess(t,a,{blind:e.blind,whisper:e.whisper})}}static getMessageDude(e){let t={speaker:e.speaker,testResult:Mr(e.flags.data.postData,{source:e.flags.data.preData.source}),img:g.getSpeaker(e.speaker).img,messageId:e.id};return t.testResult.ammo&&t.testResult.source.effects.push(...t.testResult.ammo.effects),t}static async showDamage(e,t=!1){game.user.isGM?(!t||!e.flags.data.hideDamage)&&e.flags.data.postData.damageRoll&&(await e.update({content:e.content.replace(`data-hide-damage="${!t}"`,`data-hide-damage="${t}"`),"flags.data.hideDamage":t}),t||R._addRollDiceSoNice(e.flags.data.preData,Roll.fromData(e.flags.data.postData.damageRoll),game.dsa5.apps.DiceSoNiceCustomization.getAttributeConfiguration("damage"))):game.socket.emit("system.dsa5",{type:"showDamage",payload:{id:e.id,hide:t}})}static async playAutomatedJBA2(e,t,a){if(g.moduleEnabled("autoanimations")){let s=g.getSpeaker(e.speaker).getActiveTokens()[0],i=g.getSpeaker(t.speaker).getActiveTokens()[0];if(!s||!s.actor||!i||!i.actor)return;let n=s.actor.items.get(e.testResult.source._id);if(n||(n=new D(e.testResult.source)),!n)return;n=n.toObject();let r=[i],l=a.winner=="attacker",c=l?r:[],m=e.testResult.successLevel>1&&l,d=e.testResult.successLevel<1&&!l,p=t.testResult.successLevel>1&&!l,f=t.testResult.successLevel<1&&l,h=[],y=[];m?y.push(game.i18n.localize("CriticalSuccess")):d?y.push(game.i18n.localize("CriticalFailure")):p?y.push(`${game.i18n.localize("CHAR.PARRY")} ${game.i18n.localize("CriticalSuccess")}`):f&&y.push(`${game.i18n.localize("CHAR.PARRY")} ${game.i18n.localize("CriticalFailure")}`),l||y.push(game.i18n.localize("CHAR.PARRY"));for(let k of y)h.push({name:`${n.name} (${k})`},{name:k});h.push(n);for(let k of h)if(await AutomatedAnimations.playAnimation(s,k,{targets:r,hitTargets:c,playOnMiss:!0}))break}}static async showSpellWithoutTarget(e){if(g.moduleEnabled("autoanimations")){let t=In(e,"flags.data");if(!t||t.isOpposedTest)return;if((In(t,"postData.result")||-1)>0){let s=g.getSpeaker(t.postData.speaker).getActiveTokens()[0];if(!s||!s.actor)return;let i=Array.from(game.user.targets),n=s.actor.items.get(t.preData.source._id);i.length||(i=[s]),AutomatedAnimations.playAnimation(s,n,{targets:i})}}}static async clearOpposed(e){game.user.isGM?await e.update({"flags.-=oppose":null}):game.socket.emit("system.dsa5",{type:"clearOpposed",payload:{actorId:e.id}})}static async _handleReaction(e){let t=$(e.currentTarget).parents(".message").attr("data-message-id"),a=game.messages.get(t);switch(game.messages.get(a.flags.unopposeData.attackMessageId).flags.data.preData.source.type){case"skill":yt.showDialog(a);break;default:kt.showDialog(a)}}static async chatListeners(e){e.on("click",".unopposed-button",t=>{t.preventDefault(),this._handleReaction(t)})}static async hideReactionButton(e){if(e)if(game.user.isGM){let t=game.messages.get(e),a=$(t.content);a.find("button.unopposed-button").remove(),a=$("
").append(a),await t.update({content:a.html()})}else game.socket.emit("system.dsa5",{type:"hideQueryButton",payload:{id:e}})}static async completeOpposedProcess(e,t,a){await pe.postOpposed({attacker:e,defender:t,options:a});let s=await this.evaluateOpposedTest(e.testResult,t.testResult,a);return this.formatOpposedResult(s,e.speaker,t.speaker),this.rerenderMessagesWithModifiers(s,e,t),Hooks.call("finishOpposedTest",e,t,s,a),await this.finishOpposedTestHookAsync(e,t,s,a),this.playAutomatedJBA2(e,t,s),await this.renderOpposedResult(s,a),await this.hideReactionButton(a.startMessageId),s}static async finishOpposedTestHookAsync(e,t,a,s){}static async evaluateOpposedTest(e,t,a={}){let s={};if(s.other=[],a.additionalInfo&&s.other.push(a.additionalInfo),s.winner="attacker",["weapon","spell","liturgy","ceremony","ritual","combatskill"].includes(e.rollType)&&t.successLevel==null&&(t.successLevel=-5),e.rollType=="damage"&&(t.successLevel=-5,e.successLevel=1),t.successLevel!=null)switch(e.rollType){case"combatskill":case"talent":this._evaluateTalentOpposedRoll(e,t,s,a);break;case"ceremony":case"ritual":case"spell":case"liturgy":case"weapon":case"damage":this._evaluateWeaponOpposedRoll(e,t,s,a);break;default:ui.notifications.error("Can not oppose "+e.rollType),console.warn("Can not oppose "+e.rollType)}return s}static _evaluateWeaponOpposedRoll(e,t,a,s={}){if(e.successLevel>0&&t.successLevel<0){let i=this._calculateOpposedDamage(e,t,s);if(i.armorDamaged.damaged&&i.armorDamaged.ids.length){let c=i.armorDamaged.ids.join(";");a.other.push(`
`)}t.counterAttack&&(i.damage+=2,i.sum=i.damage-i.armor,i.tooltip=game.i18n.localize("LocalizedIDs.counterAttack")+" 2"),i.messages.length&&(i.tooltip||(i.tooltip=""),i.tooltip+=` ${i.messages.join("
")}`),a.winner="attacker";let n=[i.armorMod!=0?`${i.armorMod} ${game.i18n.localize("Modifier")}`:"",i.armorMultiplier!=1?`*${i.armorMultiplier} ${game.i18n.localize("Modifier")}`:"",i.spellArmor!=0?`${i.spellArmor} ${game.i18n.localize("spellArmor")}`:"",i.liturgyArmor!=0?`${i.liturgyArmor} ${game.i18n.localize("liturgyArmor")}`:""].join(""),l=`${game.combat?.isBrawling?game.i18n.localize("BRAWLING.temporary"):game.i18n.localize("damage")}: ${i.damage} - ${i.armor} = ${i.sum}`;a.damage={description:l,value:i.sum,sp:i.damage,armorMod:i.armorMod,armorMultiplier:i.armorMultiplier,spellArmor:i.spellArmor,liturgyArmor:i.liturgyArmor}}else a.winner="defender"}static _calculateOpposedDamage(e,t,a={}){let s=g.getSpeaker(t.speaker),i=[],n=e.damage,r=game.i18n.localize("LocalizedIDs.immuneToCrit");e.doubleDamage&&s.items.find(S=>S.name==r&&S.type=="trait")&&(n=Math.floor(n/e.doubleDamage),i.push(r)),a.origin=e.source,a.defender=s,a.damage=n,a.defenderTest=t,a.attackerTest=e;let{wornArmor:l,armor:c}=O.armorValue(s,a);a.armor=c;let m=Z.applyRollTransformation(s,a,pe.EVENTS.DAMAGE_TRANSFORMATION).options;c=m.armor;let d=m.damage,p=[],f=0,h=e.armorPen||[];for(let S of h)/^\*/.test(S)?p.push(Number(S.replace("*",""))):f+=Number(S);let y=0,k=0;["spell","ritual"].includes(e.source.type)?y+=s.system.spellArmor||0:["liturgy","ceremony"].includes(e.source.type)&&(y+=s.system.liturgyArmor||0),c+=f;let C=p.reduce((S,j)=>S*j,1);c=Math.max(Math.round(c*C),0),c+=y+k;let v=W.armorGetsDamage(d,e),I=l.map(S=>S.uuid);return{damage:d,armor:c,armorDamaged:{damaged:v,ids:I},armorMod:f,spellArmor:y,liturgyArmor:k,armorMultiplier:C,messages:i,sum:d-c}}static _evaluateTalentOpposedRoll(e,t,a,s={}){e.successLevel>0&&e.successLevel>t.successLevel?a.winner="attacker":e.qualityStep>t.qualityStep||e.result>=0&&t.result<0?(a.winner="attacker",a.differenceSL=e.qualityStep-t.qualityStep):(a.winner="defender",a.differenceSL=t.qualityStep-e.qualityStep)}static formatOpposedResult(e,t,a){let s=e.differenceSL?"winsFP":"wins";return e.winner=="attacker"?(e.result=game.i18n.format("OPPOSED."+s,{winner:t.alias,loser:a.alias,SL:e.differenceSL}),e.img=t.img):e.winner=="defender"&&(e.result=game.i18n.format("OPPOSED."+s,{winner:a.alias,loser:t.alias,SL:e.differenceSL}),e.img=a.img),e.speakerAttack=t,e.speakerDefend=a,e}static rerenderMessagesWithModifiers(e,t,a){let s=game.messages.get(t.messageId);this.showDamage(s,e.winner!="attacker")}static async renderOpposedResult(e,t={}){let a=game.settings.get("dsa5","hideOpposedDamageSelect");e.hideData=[1,2].includes(a),e.applyDamageInChat=game.settings.get("dsa5","applyDamageInChat"),e.isBrawling=game.combat?.isBrawling;let s=await renderTemplate("systems/dsa5/templates/chat/roll/opposed-result.html",e),i={user:game.user.id,content:s,flags:{opposeData:e,hideData:e.hideData},whisper:a>1?[]:t.whisper,blind:t.blind};t.target&&(i["flags.startMessageId"]=t.startMessageId),await ChatMessage.create(i)}static async resolveUndefended(e,t=""){let a=e.flags.unopposeData,s=game.messages.get(a.attackMessageId),i={speaker:s.speaker,testResult:s.flags.data.postData,messageId:a.attackMessageId};i.testResult.source=s.flags.data.preData.source,i.testResult.ammo&&i.testResult.source.effects.push(...i.testResult.ammo.effects);let n=canvas.tokens.get(a.targetSpeaker.token),r={speaker:a.targetSpeaker,testResult:{actor:n.actor,speaker:{token:a.targetSpeaker.token}}};await this.clearOpposed(n.actor),await this.completeOpposedProcess(i,r,{target:!0,startMessageId:e.id,additionalInfo:t}),game.user.isGM?await s.update({"flags.data.unopposedStartMessage":e.id}):await game.socket.emit("system.dsa5",{type:"updateAttackMessage",payload:{messageId:s.id,startMessageId:e.id}})}};var zt=class o extends foundry.applications.api.HandlebarsApplicationMixin(foundry.applications.api.ApplicationV2){static{u(this,"EquipmentDamageDialog")}static DEFAULT_OPTIONS={window:{title:"WEAR.checkShort"}};static PARTS={main:{template:"systems/dsa5/templates/dialog/dialog-reaction-attack.html"}};constructor(e){super(),this.items=e}async _prepareContext(e){let t=await super._prepareContext(e);return t.items=this.items.map(a=>({name:a.name,id:a.id,img:a.img})),t.title="WEAR.checkShort",t}_onRender(e,t){super._onRender(t),$(this.element).find(".reactClick").on("click",s=>{this.callbackResult(s),this.close()})}static async showDialog(e){new o(e).render(!0)}callbackResult(e){W.breakingTest(this.items.find(t=>t.id==e.currentTarget.dataset.value))}};var{getProperty:Ir,mergeObject:En}=foundry.utils,B=class o{static{u(this,"DSATables")}static async showBotchCard(e,t={}){t.speaker={token:e.token,actor:e.actor,scene:e.scene},t.source=e.source;let a=b.systemTables.find(i=>i.name==e.table),s=await o.getRollTable(a.pack[game.i18n.lang],game.i18n.localize(`TABLENAMES.${e.table}`),e);for(let i of s){let n=t.speaker?await o.hasEffect(i):!1,r=g.replaceDies(g.replaceConditions(i.results[0].text)),l=`${game.i18n.localize("TABLENAMES."+e.table)}`,c=await renderTemplate("systems/dsa5/templates/tables/tableCard.html",{result:r,title:l,hasEffect:n}),m=await this.buildEffects(i,n);ChatMessage.create({user:game.user.id,content:c,whisper:t.whisper,blind:t.blind,flags:{data:{preData:{source:{effects:m},extra:{actor:{id:t.speaker.actor},speaker:t.speaker},situationalModifiers:[]},postData:{}},dsa5:{hasEffect:n,options:t}}})}}static async hasEffect(e){return Ir(e.results[0],"flags.dsa5")||!1}static async buildEffects(e,t){let a=[];if(t&&t.resistEffect){let s=Array.isArray(t.resistEffect.fail)?t.resistEffect.fail:[t.resistEffect.fail];for(let i of s){let n=J.effectBaseDummy(i.description,t.resistEffect.changes||[],t.resistEffect.duration||{});i.systemEffect?En(n,{_id:"botchEffect",flags:{dsa5:{hideOnToken:!1,hidePlayers:!1,advancedFunction:2,args3:`await actor.addCondition("${i.systemEffect}", ${i.level||1});`}}}):i.command&&En(n,{_id:"botchEffect",flags:{dsa5:{hideOnToken:!1,hidePlayers:!1,advancedFunction:2,args3:i.command}}}),a.push(n)}}return a}static async getRollTable(e,t,a={}){let i=(await game.packs.get(e).getDocuments({name__in:[t]}))[0],n=await i.draw({displayChat:!1});return a.weaponless=="true"&&n.roll.total<7&&(n.roll.editRollAtIndex([{index:0,val:n.roll.total+5}]),n=await i.draw({displayChat:!1,roll:n.roll})),[n]}static async tableEnabledFor(e){let t=b.systemTables.find(a=>a.name==e);return t?game.settings.get(t.setting.module,t.setting.key):!1}static rollCritBotchButton(e,t,a){let s=game.i18n.localize(`TABLENAMES.${e}`),i=a.extra.speaker,n=a.source._id;return`,
${s}`}static async defaultBotch(){return", "+game.i18n.localize("selfDamage")+(await new Roll("1d6+2").evaluate()).total}static defaultAttackCrit(e){let t=", "+game.i18n.localize("halfDefense");return e&&(t+=", "+game.i18n.format("doubleDamage",{x:2})),t}static defaultParryCrit(){return", "+game.i18n.localize("attackOfOpportunity")}};var re=class o{static{u(this,"DSA5ChatAutoCompletion")}static skills=[];static cmds=["sk","at","pa","sp","li","rq","gc","w","ch"];constructor(){o.skills.length==0&&g.allSkills().then(e=>{o.skills=e.map(t=>({name:t.name,type:"skill"})).concat(Object.values(game.dsa5.config.characteristics).map(t=>({name:game.i18n.localize(t),type:"attribute"})).concat([{name:game.i18n.localize("regenerate"),type:"regeneration"},{name:game.i18n.localize("fallingDamage"),type:"fallingDamage"}]))}),this.filtering=!1,this.combatConstants={dodge:game.i18n.localize("dodge"),parryWeaponless:game.i18n.localize("parryWeaponless"),attackWeaponless:game.i18n.localize("attackWeaponless")}}get regex(){return new RegExp(`^/(${o.cmds.join(" |")})`)}async chatListeners(e){let t=this,a=e.find("#chat-message");e.on("keyup","#chat-message",async function(i){t._parseInput(i)}),e.on("click",".quick-item",async function(i){t._quickSelect($(i.currentTarget))}),a.on("keydown",function(i){t._navigateQuickFind(i)});let s=jQuery._data(a[0]).events.keydown;s.unshift(s.pop())}_parseInput(e){let t=e.target.value;if(this.regex.test(t)){if([38,40,13,9].includes(e.which))return!1;if(e.which==27)return this._closeQuickfind(e),!1;let a=this._getCmd(t),s=t.substring(1+a.length).toLowerCase().trim();this[`_filter${a}`](s,e),this.filtering=!0}else this._closeQuickfind(e)}_getCmd(e){return e.substring(1,3).toUpperCase().trim()}_completeCurrentEntry(e){$("#chat-message").val($("#chat-message").val().split(" ")[0]+" "+e.text())+""}_closeQuickfind(e){this.filtering=!1,$(e.currentTarget).closest("#chat-form").find(".quickfind").remove()}_filterW(e,t){let a=game.users.contents.filter(s=>s.active&&s.name.toLowerCase().trim().indexOf(e)!=-1).map(s=>({name:s.name,type:"user"}));this._checkEmpty(a),this._setList(a,"W",t)}_filterAT(e,t){let{actor:a,tokenId:s}=o._getActor();if(a){let i=["meleeweapon","rangeweapon"],n=["meleeAttack","rangeAttack"],r=a.items.filter(l=>(i.includes(l.type)&&l.system.worn.value==!0||l.type=="trait"&&n.includes(l.system.traitType.value))&&l.name.toLowerCase().trim().indexOf(e)!=-1).slice(0,5).map(l=>({name:l.name,type:"item"})).concat([{name:this.combatConstants.attackWeaponless,type:"item"}].filter(l=>l.name.toLowerCase().trim().indexOf(e)!=-1));this._checkEmpty(r),this._setList(r,"AT",t)}}_filterPA(e,t){let{actor:a,tokenId:s}=o._getActor();if(a){let i=["meleeweapon"],n=a.items.filter(r=>i.includes(r.type)&&r.name.toLowerCase().trim().indexOf(e)!=-1&&r.system.worn.value==!0).slice(0,5).map(r=>({name:r.name,type:"item"})).concat([{name:this.combatConstants.dodge,type:"item"},{name:this.combatConstants.parryWeaponless,type:"item"}].filter(r=>r.name.toLowerCase().trim().indexOf(e)!=-1));this._checkEmpty(n),this._setList(n,"PA",t)}}_filterSP(e,t){let{actor:a,tokenId:s}=o._getActor();if(a){let i=["spell","ritual"],n=a.items.filter(r=>i.includes(r.type)&&r.name.toLowerCase().trim().indexOf(e)!=-1).slice(0,5).map(r=>({name:r.name,type:"item"}));this._checkEmpty(n),this._setList(n,"SP",t)}}_checkEmpty(e){e.length||e.push({name:game.i18n.localize("DSAError.noMatch"),type:"none"})}_filterLI(e,t){let{actor:a,tokenId:s}=o._getActor();if(a){let i=["liturgy","ceremony"],n=a.items.filter(r=>i.includes(r.type)&&r.name.toLowerCase().trim().indexOf(e)!=-1).slice(0,5).map(r=>({name:r.name,type:"item"}));this._checkEmpty(n),this._setList(n,"LI",t)}}_getSkills(e,t=void 0){e=e.replace(/(-|\+)?\d+/g,"").trim();let a=o.skills.filter(s=>s.name.toLowerCase().trim().indexOf(e)!=-1&&(t==null||t==s.type)).slice(0,5);return this._checkEmpty(a),a}_filterCH(e,t){this._setList(this._getSkills(e),"CH",t)}_filterSK(e,t){this._setList(this._getSkills(e),"SK",t)}_filterRQ(e,t){this._setList(this._getSkills(e),"RQ",t)}_filterGC(e,t){this._setList(this._getSkills(e,"skill"),"GC",t)}_setList(e,t,a){let s=$(`
    ${e.map(r=>`
  • ${r.name}
  • `).join("")}
`);s.find(".quick-item:first").addClass("focus");let i=$(a.currentTarget).closest("#chat-form"),n=i.find(".quickfind");n.length?n.replaceWith(s):i.append(s)}_navigateQuickFind(e){if(this.filtering){let t=$(e.currentTarget).closest("#chat-form").find(".focus");switch(e.which){case 38:return t.prev(".quick-item").length&&t.removeClass("focus").prev(".quick-item").addClass("focus"),!1;case 40:return t.next(".quick-item").length&&t.removeClass("focus").next(".quick-item").addClass("focus"),!1;case 13:if(t.attr("data-category")=="W")break;return e.stopPropagation(),e.preventDefault(),this._quickSelect(t),!1;case 9:return e.stopPropagation(),e.preventDefault(),this._completeCurrentEntry(t),!1}}return!0}static _getActor(){let e=ChatMessage.getSpeaker(),t;return e.token&&(t=game.actors.tokens[e.token]),t||(t=game.actors.get(e.actor)),t?{actor:t,tokenId:e.token}:(ui.notifications.error("DSAError.noProperActor",{localize:!0}),{})}_quickSelect(e){let t=e.attr("data-category");switch(t){case"NM":case"GC":case"RQ":case"CH":this[`_quick${t}`](e);break;case"W":this._completeCurrentEntry(e);break;default:let{actor:a,tokenId:s}=o._getActor();a&&(this._resetChatAutoCompletion(e),this[`_quick${t}`](e,a,s))}}_quickW(e,t,a){}_quickCH(e){le.check3D20(e),this._resetChatAutoCompletion(e)}_quickSK(e,t,a){switch(e.attr("data-type")){case"skill":let s=t.items.find(n=>n.name==e.text()&&n.type=="skill");s&&t.setupSkill(s,{},a).then(n=>{t.basicTest(n)});break;case"attribute":let i=Object.keys(game.dsa5.config.characteristics).find(n=>game.i18n.localize(game.dsa5.config.characteristics[n])==e.text());t.setupCharacteristic(i,{},a).then(n=>{t.basicTest(n)});break;case"regeneration":t.setupRegeneration("regenerate",{},a).then(n=>{t.basicTest(n)});break}}_resetChatAutoCompletion(e){let t=e.closest("#chat-form");t.find("#chat-message").val(""),t.find(".quickfind").remove()}_quickGC(e){let t=Number($("#chat-message").val().match(/(-|\+)?\d+/g))||0;this._resetChatAutoCompletion(e),ie.showGCMessage(e.text(),t)}_quickRQ(e){let t=Number($("#chat-message").val().match(/(-|\+)?\d+/g))||0;this._resetChatAutoCompletion(e),ie.showRQMessage(e.text(),t)}_quickPA(e,t,a){let s=e.text();if(this.combatConstants.dodge==s)t.setupDodge({},a).then(i=>{t.basicTest(i)});else if(this.combatConstants.parryWeaponless==s)t.setupWeaponless("parry",{},a).then(i=>{t.basicTest(i)});else{let i=["meleeweapon"],n=t.items.find(r=>i.includes(r.type)&&r.name==e.text());n&&t.setupWeapon(n,"parry",{},a).then(r=>{t.basicTest(r)})}}_quickAT(e,t,a){let s=e.text();if(this.combatConstants.attackWeaponless==s)t.setupWeaponless("attack",{},a).then(i=>{t.basicTest(i)});else{let i=["meleeweapon","rangeweapon"],n=["meleeAttack","rangeAttack"],r=t.items.find(l=>i.includes(l.type)&&l.name==e.text());r||(r=t.items.find(l=>l.type=="trait"&&l.name==e.text()&&n.includes(l.system.traitType.value))),r&&t.setupWeapon(r,"attack",{},a).then(l=>{t.basicTest(l)})}}_quickSP(e,t,a){let s=["ritual","spell"],i=t.items.find(n=>s.includes(n.type)&&n.name==e.text());i&&t.setupSpell(i,{},a).then(n=>{t.basicTest(n)})}_quickLI(e,t,a){let s=["liturgy","ceremony"],i=t.items.find(n=>s.includes(n.type)&&n.name==e.text());i&&t.setupSpell(i,{},a).then(n=>{t.basicTest(n)})}static async infoItemAsync(e){(await fromUuid(e)).postItem()}static bindRollCommands(e){e.on("click",".request-roll",s=>{let i=s.currentTarget.dataset;return ie.showRQMessage(i.name,Number(i.modifier)||0,i.label),s.stopPropagation(),!1}),e.on("click",".postInfo",s=>{let i=fromUuidSync(s.currentTarget.dataset.uuid);return i&&(typeof i.postItem=="function"?i.postItem():this.infoItemAsync(s.currentTarget.dataset.uuid)),s.stopPropagation(),!1}),e.on("click",".postContentChat",async s=>{let i=$(s.currentTarget).closest(".postChatSection").find(".postChatContent").html();ft.getDialog(i)}),e.on("click",".request-GC",s=>(ie.showGCMessage(s.currentTarget.dataset.name,Number(s.currentTarget.dataset.modifier)||0),s.stopPropagation(),!1)),e.on("click",".request-CH",s=>(le.check3D20($(s.currentTarget),s.currentTarget.dataset.name,{modifier:Number(s.currentTarget.dataset.modifier)||0}),s.stopPropagation(),!1)),e.on("click",".request-Pay",s=>{if(!game.user.isGM)return;let i=game.dsa5.apps.gameMasterMenu;i.doPayment(i.selectedIDs(),!0,s.currentTarget.dataset.modifier)}),e.on("click",".request-GetPaid",s=>{if(!game.user.isGM)return;let i=game.dsa5.apps.gameMasterMenu;i.doPayment(i.selectedIDs(),!1,s.currentTarget.dataset.modifier)}),e.on("click",".request-AP",s=>{if(!game.user.isGM)return;let i=game.dsa5.apps.gameMasterMenu;i.getExp(i.selectedIDs(),s.currentTarget.dataset.modifier)});let t=u(s=>{s.stopPropagation();let i=s.currentTarget.dataset.type,n=s.currentTarget.dataset.uuid;!n||!i||s.originalEvent.dataTransfer.setData("text/plain",JSON.stringify({type:i,uuid:n}))},"itemDragStart"),a=e.find(".show-item");a.click(async s=>{let i=s.currentTarget.dataset.uuid;(await fromUuid(i)).sheet.render(!0)}),a.attr("draggable",!0).on("dragstart",s=>t(s)),e.on("click",".actorEmbeddedAbility",async s=>{let n=(await fromUuid(s.currentTarget.dataset.actor)).items.get(s.currentTarget.dataset.id);n&&n.sheet.render(!0)})}};var{mergeObject:Er}=foundry.utils,ie=class o{static{u(this,"RequestRoll")}static async requestGC(e,t,a,s=0){let{actor:i,tokenId:n}=re._getActor();if(!i)return;game.user.updateTokenTargets([]);let r={modifier:s,postFunction:{cummulative:a,functionName:"game.dsa5.apps.RequestRoll.autoEditGroupCheckRoll"}};switch(e){case"attribute":break;default:let l=i.items.find(c=>c.name==t&&c.type==e);i.setupSkill(l,r,n).then(async c=>{let m=await i.basicTest(c);await o.editGroupCheckRoll(a,m,t,e)})}}static async autoEditGroupCheckRoll(e,t,a){await o.editGroupCheckRoll(e.cummulative,t,a.name,a.type)}static async editGroupCheckRoll(e,t,a,s){let i=await game.messages.get(e),n=i.flags,l=t.result.successLevel>1?2:1;n.botched=n.botched||t.result.successLevel<-1;let c=g.getSpeaker(t.result.speaker),m={messageId:t.result.messageId,actor:c.name,qs:(t.result.qualityStep||0)*l,success:t.result.successLevel,target:a,type:s},d=n.results.findIndex(p=>p.messageId==m.messageId);d>=0?n.results[d]=m:n.results.push(m),o.rerenderGC(i,n)}static async requestRoll(e,t,a=0,s={}){let{actor:i,tokenId:n}=re._getActor();if(i)switch(game.user.updateTokenTargets([]),s.modifier=a,e){case"attribute":let r=Object.keys(game.dsa5.config.characteristics).find(c=>game.i18n.localize(game.dsa5.config.characteristics[c])==t);i.setupCharacteristic(r,s,n).then(c=>{i.basicTest(c)});break;case"regeneration":i.setupRegeneration("regenerate",s,n).then(c=>{i.basicTest(c)});break;case"fallingDamage":i.setupFallingDamage(s,n);break;default:let l=i.items.find(c=>c.name==t&&c.type==e);i.setupSkill(l,s,n).then(c=>{i.basicTest(c)})}}static async rerenderGC(e,t){if(game.user.isGM){let a=0;t.qs=t.results.reduce((i,n)=>(a+=n.success<0?1:0,n.success>1&&(a=0),i+n.qs),0),t.failed=a;for(let i of t.rollOptions)i.calculatedModifier=i.modifier-a;t.openRolls=t.maxRolls-t.results.length,t.doneRolls=t.results.length;let s=await renderTemplate("systems/dsa5/templates/chat/roll/groupcheck.html",t);e.update({content:s,flags:t})}else game.socket.emit("system.dsa5",{type:"updateGroupCheck",payload:{messageId:e.id,data:t}});$("#chat-log").find(`[data-message-id="${e.id}"`).appendTo("#chat-log")}static showRQMessage(e,t=0,a=void 0){let s=t<0?` ${t}`:t>0?` +${t}`:"",i=re.skills.find(r=>r.name==e).type,n=game.i18n.format("CHATNOTIFICATION.requestRoll",{user:game.user.name,item:` ${a||e}${s}`});ChatMessage.create(g.chatDataSetup(n))}static async showGCMessage(e,t=0,a={}){let s=re.skills.find(l=>l.name==e).type,i={results:[],qs:0,failed:0,modifier:t,name:game.user.name,maxRolls:7,openRolls:7,doneRolls:0,targetQs:10,rollOptions:[{type:s,modifier:t,calculatedModifier:t,target:e}]};Er(i,a);let n=await renderTemplate("systems/dsa5/templates/chat/roll/groupcheck.html",i),r=g.chatDataSetup(n);r.flags=i,ChatMessage.create(r)}static async addSkillToGC(e){let t=$(e.currentTarget).parents(".message").attr("data-message-id"),a=await renderTemplate("systems/dsa5/templates/dialog/addgroupcheckskill.html",{skills:re.skills.filter(i=>i.type=="skill").sort((i,n)=>i.name.localeCompare(n.name))}),s={title:game.i18n.localize("HELP.groupcheck"),content:a,buttons:{ok:{icon:'',label:game.i18n.localize("ok"),callback:u(async i=>{let n=game.messages.get(t),r=n.flags;r.rollOptions.push({type:"skill",modifier:i.find('[name="modifier"]').val(),target:i.find('[name="skill"]').val()}),o.rerenderGC(n,r)},"callback")},cancel:{icon:'',label:game.i18n.localize("cancel")}}};new ae(s).render(!0)}static async removeGCEntry(e){let t=$(e.currentTarget),a=Number(e.currentTarget.dataset.index),s=game.messages.get(t.parents(".message").attr("data-message-id")),i=s.flags;i.results.splice(a,1),o.rerenderGC(s,i)}static removeSkillFromGC(e){let t=$(e.currentTarget),a=game.messages.get(t.parents(".message").attr("data-message-id")),s=a.flags;s.rollOptions=s.rollOptions.filter(i=>!(i.type==e.currentTarget.dataset.type&&i.target==e.currentTarget.dataset.name)),s.results=s.results.filter(i=>!(i.type==e.currentTarget.dataset.type&&i.target==e.currentTarget.dataset.name)),o.rerenderGC(a,s)}static async editGC(e){let t=$(e.currentTarget),a=Number(e.currentTarget.dataset.index),s=game.messages.get(t.parents(".message").attr("data-message-id")),i=s.flags;if(a)i.results[a].qs=Number(t.val());else if(e.currentTarget.dataset.name){let n=i.rollOptions.find(r=>r.target==e.currentTarget.dataset.name&&e.currentTarget.dataset.type==r.type);n[e.currentTarget.dataset.field]=Number(t.val())}else i[e.currentTarget.dataset.field]=Number(t.val());o.rerenderGC(s,i)}static async updateInformationRoll(e,t,a){let s=[],i=await fromUuid(e.uuid),n=t.result.qualityStep||0;for(let r=1;r<=n;r++){let l=`qs${r}`;i.system[l]&&s.push(i.system[l])}if(t.result.successLevel>1&&i.system.crit?s.push(i.system.crit):t.result.successLevel<-1&&i.system.botch?s.push(i.system.botch):i.system.fail&&!n&&s.push(i.system.fail),s.length>0){await Promise.all(s.map(async l=>await TextEditor.enrichHTML(l,{async:!0}))),s.unshift(`

${i.name}

`);let r=g.chatDataSetup(s.join(""));e.recipients.length&&(r.whisper=e.recipients),ChatMessage.create(r)}}static async informationRequestRoll(e){let t=e.currentTarget.dataset.mod,a=e.currentTarget.dataset.uuid,{actor:s,tokenId:i}=re._getActor();if(!s)return;let n=game.settings.get("dsa5","informationDistribution"),r=[];n==1?(r=game.users.filter(m=>m.isGM).map(m=>m.id),r.push(game.user.id)):n==2&&(r=game.users.filter(m=>m.isGM).map(m=>m.id));let l={modifier:t,postFunction:{functionName:"game.dsa5.apps.RequestRoll.updateInformationRoll",uuid:a,recipients:r}},c=s.items.find(m=>m.name==e.currentTarget.dataset.skill&&m.type=="skill");s.setupSkill(c,l,i).then(async m=>{m.testData.opposable=!1;let d=await s.basicTest(m);this.updateInformationRoll(l.postFunction,d)})}static chatListeners(e){e.on("change",".editGC",t=>o.editGC(t)),e.on("mousedown",".request-roll",t=>{let a=t.currentTarget.dataset,s={};if(t.button==2){let i=0,n=$(t.currentTarget).closest(".chat-message"),r=setInterval(function(){i++;let l=n.find("nav");l.length>0&&(l.remove(),clearInterval(r)),i>=20&&clearInterval(r)},10);s.rollMode="blindroll"}o.requestRoll(a.type,a.name,Number(a.modifier)||0,s)}),e.on("click",".request-gc",t=>{let a=t.currentTarget.dataset;o.requestGC(a.type,a.name,$(t.currentTarget).parents(".message").attr("data-message-id"),Number(a.modifier)||0)}),e.on("click",".removeGC",t=>o.removeGCEntry(t)),e.on("click",".removeSkillFromGC",t=>o.removeSkillFromGC(t)),e.on("click",".addSkillToGC",t=>o.addSkillToGC(t)),e.on("click",".informationRequestRoll",t=>o.informationRequestRoll(t))}};var{getProperty:da,duplicate:$r,mergeObject:Or}=foundry.utils,Nt=class o{static{u(this,"TableEffects")}static async applyEffect(e,t){let a=game.messages.get(e),s=da(a,"flags.dsa5.hasEffect"),i=da(a,"flags.dsa5.options")||{};if(s){let n=["damageModifier","gearDamaged","gearLost","resistEffect","malus","selfDamage","nextAction"],r=[],l;if(t=="self"){let m=g.getSpeaker(i.speaker);r.push(m),l=i.source?m.items.get(i.source):void 0}else r=Array.from(game.user.targets).map(m=>m.actor);for(let m of n){let d=da(s,m);d&&(await o[m](d,t,r,l,e,a)||console.warn(`Table effect for <${m} not working yet`,d,t,r,l))}let c=game.i18n.format("ActiveEffects.appliedEffect",{source:game.i18n.localize("table"),target:r.map(m=>m.name).join(", ")});await a.update({content:a.content.replace(/hideAnchor">/,`hideAnchor">`)})}}static async damageModifier(e,t,a,s){}static async nextAction(e,t,a,s){}static async opportunityAttack(e,t,a,s){}static async gearDamaged(e,t,a,s){if(s&&["meleeweapon","rangeweapon"].includes(s.type)){let i=da(s,"system.effect.attributes")||"";return new RegExp(`(${x.magical}|${x.clerical})`,"i").test(i)?await s.update({"system.worn.value":!1}):await W.absoluteDamageLevelToItem(s,e),!0}}static async gearLost(e,t,a,s){if(s&&["meleeweapon","rangeweapon"].includes(s.type)){if(await s.update({"system.worn.value":!1}),e.distance){let i=await new Roll(e.distance).evaluate(),n=await i.render(),r=game.i18n.format("WEAPON.dropped",{distance:i.total});ChatMessage.create(g.chatDataSetup(`

${r}

${n}`))}return!0}}static async resistEffect(e,t,a,s,i){for(let n of a){let r=[{skill:e.roll,mod:e.modifier||0,effect:{_id:"botchEffect",name:e.fail.description},target:n,token:n.token?n.token.id:void 0}];Z.createResistRollMessage(r,i,t)}return!0}static evaluateTargetArg(e,t){let a=t,s=!0;if(e.target=="victim"){let i=Array.from(game.user.targets).map(n=>n.actor);i.length?a=i:(s=!1,ui.notifications.warn("DSAError.noVictim",{localize:!0}))}return{hasTargets:s,finalTargets:a}}static async malus(e,t,a,s){for(let i of e){let{hasTargets:n,finalTargets:r}=this.evaluateTargetArg(i,a),l=!n&&i.noTarget,c=l?i.noTarget.systemEffect:i.systemEffect,m=l?i.noTarget.level:i.level||1,d=l?i.noTarget.changes:i.changes,p=l?i.noTarget.duration:i.duration;if(c){let f=CONFIG.statusEffects.find(y=>y.id==c);if(!d){d=$r(f.changes||[]);let y=d.find(k=>k.key==`system.condition.${c}`);y&&(y.value=m)}let h;if(d){let y=game.i18n.localize(`CONDITION.${c}`)+" - "+game.i18n.localize("botchCritEffect");h=J.effectBaseDummy(y,d,p||{}),h.icon=f.icon}else h=c;for(let y of r)await y.addCondition(h);return!0}else if(d){let f=J.effectBaseDummy(game.i18n.localize("botchCritEffect"),d||[],p||{});Or(f,{flags:{dsa5:{hideOnToken:!1,hidePlayers:!1}}});for(let h of r)await h.addCondition(f);return!0}}}static async selfAttack(e,t,a,s){let{hasTargets:i,finalTargets:n}=this.evaluateTargetArg(e,a)}static async selfDamage(e,t,a,s){let{hasTargets:i,finalTargets:n}=this.evaluateTargetArg(e,a);if(s){let r=g.toObjectIfPossible(s);for(let l of n){let c=l.items.filter(f=>f.type=="combatskill").map(f=>O._calculateCombatSkillValues(f.toObject(),l.system)),m;e.damage?m={damagedie:e.damage,damageAdd:""}:s.type=="rangeweapon"?m=O._prepareRangeWeapon(r,[],c,l):s.type=="meleeweapon"?m=O._prepareMeleeWeapon(r,c,l):m=s.system.traitType.value=="meleeAttack"?O._prepareRangeTrait(r,l.system):O._prepareMeleetrait(r,l.system);let d=(m.damagedie+m.damageAdd).replace(/wWD/g,"d"),p=await new Roll(`(${d})*${e.multiplier||1}${e.modifier||""}`).evaluate();await l.applyDamage(Math.round(p.total)),ChatMessage.create(g.chatDataSetup(await p.render()))}return!0}else{for(let r of n){let l=await new Roll("1d6").evaluate();await r.applyDamage(Math.round(l.total)),ChatMessage.create(g.chatDataSetup(await l.render()))}return!0}}};var{getProperty:ma}=foundry.utils,wt=u(async(o,e,t=1)=>{let a=game.messages.get(o[0].dataset.messageId),s=a.flags.opposeData,i=s?.speakerDefend,n=g.getSpeaker(i);if(!n.isOwner)return ui.notifications.error("DSAError.DamagePermission",{localize:!0});await n.applyDamage(s.damage[e]*t);let r={"flags.data.damageApplied":!0,content:a.content.replace(/hideAnchor">/,`hideAnchor">`)};game.user.isGM?await a.update(r):game.socket.emit("system.dsa5",{type:"updateMsg",payload:{id:o[0].dataset.messageId,updateData:r}})},"applyDamage");function $n(){let o=u((A,M)=>g.fateAvailable(A,M),"fateAvailable"),e=u(function(A,M="damage.value"){let T=game.messages.get(A[0].dataset.messageId).flags.opposeData,L=T?g.getSpeaker(T.speakerDefend)?.isOwner:!1;return((game.user.isGM||L)&&A.find(".opposed-card").length||A.find(".dice-roll").length)&&(ma(T,M)||0)>0},"canHurt"),t=u(function(A){return e(A,"damage.sp")},"canHurtSP"),a=u(function(A){let M=game.messages.get(A[0].dataset.messageId);return M.speaker.actor&&M.flags.data&&(game.actors.get(M.speaker.actor).isOwner||game.user.isGM)?["liturgy","ceremony","spell","ritual","magicalsign"].includes(M.flags.data.preData.source.type)||ma(M.flags.data.preData,"calculatedSpellModifiers.costsMana"):!1},"canCostMana"),s=u(function(A){if(!(game.user.isGM&&game.settings.get("dsa5","hideOpposedDamageSelect")))return!1;let M=game.messages.get(A[0].dataset.messageId);return"hideData"in M.flags&&M.flags.hideData},"canUnhideData"),i=u(function(A){if(!(game.user.isGM&&game.settings.get("dsa5","hideOpposedDamageSelect")))return!1;let M=game.messages.get(A[0].dataset.messageId);return"hideData"in M.flags&&!M.flags.hideData},"canHideData"),n=u(function(A,M=!1){let T=game.messages.get(A[0].dataset.messageId);if(T.speaker.actor&&T.flags.data&&T.flags.data.postData.successLevel>-2){let L=game.actors.get(T.speaker.actor);if(L.isOwner&&o(L,M)){let q=T.flags.data.preData.source.type,ve=T.flags.data.preData.mode||"";["skill","spell","liturgy","ritual","ceremony"].includes(q)&&(q="char");let Te=game.i18n.localize(`SCHIPSKILLS.${q}${ve}`);return!T.flags.data.fateImproved&&L.items.getName(Te)}}return!1},"canImproveRoll"),r=u(function(A){return n(A,!0)},"canImproveRollGroup"),l=u(function(A,M=!1){let T=game.messages.get(A[0].dataset.messageId);if(T.speaker.actor&&T.flags.data){let L=game.actors.get(T.speaker.actor);if(L.isOwner&&o(L,M)&&!T.flags.data.fatePointAddQSUsed)return T.flags.data.postData.successLevel>0&&T.flags.data.postData.qualityStep!=null}return!1},"canIncreaseQS"),c=u(function(A){return l(A,!0)},"canIncreaseQSGroup"),m=u(function(A){let M=game.messages.get(A[0].dataset.messageId);if(M.speaker.actor&&M.flags.data){let T=game.actors.get(M.speaker.actor);if(T.isOwner)return T.items.find(L=>L.name==`${game.i18n.localize("LocalizedIDs.aptitude")} (${M.flags.data.preData.source.name})`)!=null&&!M.flags.data.talentedRerollUsed}return!1},"isTalented"),d=u(function(A,M=!1){let T=game.messages.get(A[0].dataset.messageId);if(T.speaker.actor&&T.flags.data){let L=game.actors.get(T.speaker.actor);if(L.isOwner&&o(L,M))return T.flags.data.postData.damageRoll!=null&&!T.flags.data.fatePointDamageRerollUsed}return!1},"canRerollDamage"),p=u(function(A){return d(A,!0)},"canRerollDamageGroup"),f=u(function(A,M=!1){let T=game.messages.get(A[0].dataset.messageId);if(T.speaker.actor&&T.flags.data){let L=game.actors.get(T.speaker.actor);if(L.isOwner&&o(L,M))return!T.flags.data.fatePointRerollUsed&&T.flags.data.postData.rollType!="regenerate"}return!1},"canReroll"),h=u(function(A){return f(A,!0)},"canRerollGroup"),y=u(function(A){let M=game.messages.get(A[0].dataset.messageId);return M.speaker.actor&&M.flags.data&&game.actors.get(M.speaker.actor).isOwner&&["LeP","KaP","AsP"].some(L=>ma(M.flags,`data.postData.${L}`)!=null)?!M.flags.data.healApplied:!1},"canHeal"),k=u(function(A){if(game.user.isGM){let M=game.messages.get(A[0].dataset.messageId);if("hideData"in M.flags){let T=!M.flags.hideData,L=$(M.content);L.find(".hideAnchor")[T?"addClass":"removeClass"]("hideData"),L=$("
").append(L),M.update({content:L.html(),"flags.hideData":T})}}},"showHideData"),C=u(A=>{let M=game.messages.get(A.data("messageId"));return!M||!canvas.tokens?!1:M.isRoll&&M.isContentVisible&&canvas.tokens.controlled.length&&A.find(".dice-roll").length},"canApplyDefaultRolls"),v=u((A,M,T=0)=>{let L=game.messages.get(A[0].dataset.messageId);game.actors.get(L.speaker.actor).useFateOnRoll(L,M,T)},"useFate"),I=u((A,M,T=1)=>{let q=game.messages.get(A.data("messageId")).rolls[0];return Promise.all(canvas.tokens.controlled.map(ve=>{let Te=ve.actor,qe=Math.round((M!="sp"?q.total-O.armorValue(Te).armor:q.total)*T);return Te.applyDamage(Math.max(0,qe))}))},"applyChatCardDamage"),S=u(async A=>{let M=game.messages.get(A[0].dataset.messageId),T=M.flags.data,L=g.getSpeaker(M.speaker);if(!L.isOwner)return ui.notifications.error("DSAError.DamagePermission",{localize:!0});let q=T.preData.calculatedSpellModifiers.maintainCost.trim(),ve=["ritual","spell"].includes(T.preData.source.type)||ma(T.preData.calculatedSpellModifiers,"costsMana")?"AsP":"KaP",Te=await L.applyMana(T.preData.calculatedSpellModifiers.finalcost,ve);if(q&&q!=0&&Te&&T.postData.successLevel>0){let qe=T.preData.source.name;try{let St=q.match(/^\d{1,3}/)[0],lt=q.replace(/^\d{1,3}/,"").match(/\d{1,3}/);lt=lt&&Number(lt[0])||1;let ct={name:`${qe} (${game.i18n.localize("maintainCost")})`,img:"icons/svg/daze.svg",flags:{dsa5:{description:q,maintain:St,payType:ve}},changes:[],duration:{}},Zt=[{regEx:new RegExp(game.i18n.localize("DSAREGEXmaintain.combatRounds"),"gi"),seconds:5},{regEx:new RegExp(game.i18n.localize("DSAREGEXmaintain.minutes"),"gi"),seconds:60},{regEx:new RegExp(game.i18n.localize("DSAREGEXmaintain.hours"),"gi"),seconds:3600},{regEx:new RegExp(game.i18n.localize("DSAREGEXmaintain.days"),"gi"),seconds:3600*24},{regEx:new RegExp(game.i18n.localize("DSAREGEXmaintain.seconds"),"gi"),seconds:1},{regEx:new RegExp(game.i18n.localize("DSAREGEXmaintain.weeks"),"gi"),seconds:3600*24*7},{regEx:new RegExp(game.i18n.localize("DSAREGEXmaintain.months"),"gi"),seconds:3600*24*30},{regEx:new RegExp(game.i18n.localize("DSAREGEXmaintain.years"),"gi"),seconds:3600*24*350}];for(let At of Zt)if(At.regEx.test(q)){let w=Number(lt)*At.seconds;ct.duration.seconds=w,ct.duration.rounds=ct.duration.seconds/5;break}await L.addCondition(ct)}catch{console.error(`Could not parse duration '${q}' of '${qe}'`)}}await M.update({"flags.data.manaApplied":!0,content:M.content.replace(//,'')})},"payMana"),j=u(()=>game.i18n.localize(game.combat?.isBrawling?"CHATCONTEXT.ApplyDamagePP":"CHATCONTEXT.ApplyDamage"),"applyDamageLabel");Hooks.on("getChatLogEntryContext",(A,M)=>{M.push({name:"CHATCONTEXT.hideData",icon:'',condition:i,callback:u(T=>{k(T)},"callback")},{name:"CHATCONTEXT.showData",icon:'',condition:s,callback:u(T=>{k(T)},"callback")},{name:"regenerate",icon:'',condition:y,callback:u(async T=>{let L=await game.messages.get(T[0].dataset.messageId),q=g.getSpeaker(L.speaker);if(!q.isOwner)return ui.notifications.error("DSAError.DamagePermission",{localize:!0});await L.update({"flags.data.healApplied":!0,content:L.content.replace(/<\/div>$/,'
')}),await q.applyRegeneration(L.flags.data.postData.LeP,L.flags.data.postData.AsP,L.flags.data.postData.KaP)},"callback")},{name:"CHATCONTEXT.ApplyMana",icon:'',condition:a,callback:u(async T=>{S(T)},"callback")},{name:j(),icon:'',condition:e,callback:u(T=>{wt(T,"value")},"callback")},{name:"CHATCONTEXT.ApplyDamageSP",icon:'',condition:t,callback:u(T=>{wt(T,"sp")},"callback")},{name:j(),icon:'',condition:C,callback:u(T=>{I(T,"value")},"callback")},{name:"CHATCONTEXT.ApplyDamageSP",icon:'',condition:C,callback:u(T=>{I(T,"sp")},"callback")},{name:"CHATCONTEXT.Reroll",icon:'',condition:f,callback:u(T=>{v(T,"reroll")},"callback")},{name:"CHATCONTEXT.RerollGroup",icon:'',condition:h,callback:u(T=>{v(T,"reroll",1)},"callback")},{name:"CHATCONTEXT.talentedReroll",icon:'',condition:m,callback:u(T=>{v(T,"isTalented")},"callback")},{name:"CHATCONTEXT.AddQS",icon:'',condition:l,callback:u(T=>{v(T,"addQS")},"callback")},{name:"CHATCONTEXT.AddQSGroup",icon:'',condition:c,callback:u(T=>{v(T,"addQS",1)},"callback")},{name:"CHATCONTEXT.rerollDamage",icon:'',condition:d,callback:u(T=>{v(T,"rerollDamage")},"callback")},{name:"CHATCONTEXT.rerollDamageGroup",icon:'',condition:p,callback:u(T=>{v(T,"rerollDamage",1)},"callback")},{name:"CHATCONTEXT.improveFate",icon:'',condition:n,callback:u(T=>{v(T,"Improve")},"callback")},{name:"CHATCONTEXT.improveFateGroup",icon:'',condition:r,callback:u(T=>{v(T,"Improve",1)},"callback")}),game.settings.get("dsa5","doubleDamageOptions")&&M.push({name:j()+" x2",icon:'',condition:e,callback:u(T=>{wt(T,"value",2)},"callback")},{name:game.i18n.localize("CHATCONTEXT.ApplyDamageSP")+" x2",icon:'',condition:t,callback:u(T=>{wt(T,"sp",2)},"callback")},{name:j()+" x2",icon:'',condition:C,callback:u(T=>{I(T,"value",2)},"callback")},{name:game.i18n.localize("CHATCONTEXT.ApplyDamageSP")+" x2",icon:'',condition:C,callback:u(T=>{I(T,"sp",2)},"callback")})})}u($n,"chatContext");var{mergeObject:oe,deepClone:On,duplicate:xr,getProperty:$e}=foundry.utils,R=class _DiceDSA5{static{u(this,"DiceDSA5")}static async rollTest(o){let e;switch(o.source.type){case"ceremony":case"ritual":case"liturgy":case"spell":e=await this.rollSpell(o);break;case"skill":e=await this.rollTalent(o);break;case"combatskill":e=await this.rollCombatskill(o);break;case"trait":o.mode=="parry"&&await this.updateDefenseCount(o),e=o.mode=="damage"?await this.rollDamage(o):await this.rollCombatTrait(o);break;case"regenerate":e=await this.rollRegeneration(o);break;case"meleeweapon":case"rangeweapon":o.mode=="parry"&&await this.updateDefenseCount(o),e=o.mode=="damage"?await this.rollDamage(o):await this.rollWeapon(o);break;case"dodge":await this.updateDefenseCount(o),e=await this.rollStatus(o);break;case"poison":case"disease":e=await this.rollItem(o);break;case"fallingDamage":e=await this.rollFallingDamage(o);break;default:e=await this.rollAttribute(o)}return oe(e,On(o.extra)),e}static async rollDices(o,e){if(!o.roll){let t=game.dsa5.apps.DiceSoNiceCustomization.getAttributeConfiguration,a;switch(o.source.type){case"liturgy":case"spell":case"ceremony":case"ritual":case"skill":a=await new Roll("1d20+1d20+1d20").evaluate(),oe(a.dice[0].options,t(o.source.system.characteristic1.value)),oe(a.dice[1].options,t(o.source.system.characteristic2.value)),oe(a.dice[2].options,t(o.source.system.characteristic3.value));break;case"regenerate":let s=[];o.regenerateLeP&&s.push([game.settings.get("dsa5","lessRegeneration")?"1d3":"1d6"]),o.extra.actor.isMage&&o.regenerateAsP&&s.push("1d6"),o.extra.actor.isPriest&&o.regenerateKaP&&s.push("1d6"),a=await new Roll(s.join("+")).evaluate(),o.regenerateLeP&&oe(a.dice[0].options,t("mu")),o.extra.actor.isMage&&o.regenerateAsP&&oe(a.dice[s.length-1].options,t("ge")),o.extra.actor.isPriest&&o.regenerateKaP&&oe(a.dice[s.length-1].options,t("in")),o.extra.actor.isMage&&o.regenerateAsP&&o.extra.actor.isPriest&&o.regenerateKaP&&oe(a.dice[s.length-2].options,t("ge"));break;case"meleeweapon":case"rangeweapon":case"weaponless":case"combatskill":case"trait":if(o.mode=="damage"){let l=await this.damageFormula(o);a=await new Roll(l,o.extra.actor.system).evaluate();for(let c=0;c{r.actor&&n.push({name:r.actor.name,id:r.id,img:r.actor.img})}),oe(o.data,{hasSituationalModifiers:i.length>0,situationalModifiers:i,attributesList:["mu","kl","in","ch","ff","ge","ko","kk"].reduce((r,l)=>(r[l]=game.i18n.localize(`CHARAbbrev.${l.toUpperCase()}`),r),{}),rollMode:o.data.rollMode||a,defenseCount:await this.getDefenseCount(e),targets:n}),t.user=game.user.id,e.extra.options.bypass)return t.rollMode=e.extra.options.rollMode||a,e.situationalModifiers||(e.situationalModifiers=[]),{testData:e,cardOptions:t,dialogOptions:o};{let r=ae.getDialogForItem(e,o.data),l=await renderTemplate(o.template,o.data);return new Promise((c,m)=>{new r({title:o.title,content:l,buttons:r.getRollButtons(e,o,c,m),default:"rollButton"}).recallSettings(e.extra.speaker,e.source,e.mode,o.data).render(!0)})}}static async getDefenseCount(o){return game.combat?await game.combat.getDefenseCount(o.extra.speaker):0}static async getDuplicatusRoll(o,e){let t=e.situationalModifiers.find(a=>a.name.includes("Duplicatus")&&a.value>0&&a.value<5);if(t){let a=Math.round(1/(t.value+1)*20),s=await _DiceDSA5.manualRolls(await new Roll("1d20").evaluate());this._addRollDiceSoNice(e,s,game.dsa5.apps.DiceSoNiceCustomization.getAttributeConfiguration("ch"));let i=a>=s._total,n=`
Duplicatus-${game.i18n.localize("Roll")}: ${s._total}0&&(o.description=`${game.i18n.localize("Failure")}, ${game.i18n.localize("CHATNOTIFICATION.duplicatus")}`,o.successLevel=0)}}static async _rollConfirm(){return await new Roll("1d20").evaluate()}static async _rollSingleD20(o,e,t,a,s,i="",n=1){let r="";e=Math.round((e+a)*n);let l=o.total??o._total,c=game.dsa5.apps.DiceSoNiceCustomization.getAttributeConfiguration(t),m=e-l>=0,d=[{char:t,res:l,suc:m,tar:e}],p=m?1:-1,f=20,h=1,y={meleeweapon:"meleeStats",rangeweapon:"rangeStats"}[s.source.type];y&&(f=Math.min(s.extra.actor.system[y].botch,s.source.system.botch),h=Math.max(s.extra.actor.system[y].crit,s.source.system.crit)),N.improvisedWeapon.test(s.source.name)&&(F.hasAbility(s.extra.actor,game.i18n.localize("LocalizedIDs.improvisedWeaponMaster"))||(f=Math.min(19,f)),this._appendSituationalModifiers(s,`${game.i18n.localize("CHAR.ATTACK")} - ${game.i18n.localize("WEAPON.improvised")}`,2,"defenseMalus")),s.situationalModifiers.find(v=>v.name==game.i18n.localize("MODS.opportunityAttack")&&v.value!=0)&&(f=50,h=-50);let k=l<=h,C=l>=f;if(k||C){if(r=game.i18n.localize(k?"CriticalSuccess":"CriticalFailure"),p=k?3:-3,!game.settings.get("dsa5","noConfirmationRoll")){let v=await _DiceDSA5.manualRolls(await _DiceDSA5._rollConfirm(),"confirmationRoll",s.extra.options),I=$e(s.source,`system.${k?"critConfirm":"botchConfirm"}`)||0,S=e-Math.clamp(v.total+I,1,20);if(P.hasVantage(s.extra.actor,`${game.i18n.localize("LocalizedIDs.weaponAptitude")} (${i})`)&&!(S>=0)){let A=v.total;v=await _DiceDSA5.manualRolls(await _DiceDSA5._rollConfirm(),"LocalizedIDs.weaponAptitude",s.extra.options),S=e-Math.clamp(v.total+I,1,20),r+=`, ${game.i18n.format("usedWeaponExpertise",{a:A,b:v.total})}`}this._addRollDiceSoNice(s,v,c);let j=S>=0;C&&(j=!j),d.push({char:t,res:Math.clamp(v.total+I,1,20),suc:j,tar:e}),r=`${game.i18n.localize(j?"confirmed":"unconfirmed")} ${r}`,j?p=k?3:-3:p=k?2:-2}}else r=game.i18n.localize(m?"Success":"Failure");return{successLevel:p,characteristics:d,description:r,preData:s,modifiers:a,extra:{attackFromBehind:s.extra.attackFromBehind}}}static async rollFallingDamage(o){let e=o.roll,t=[];for(let s of e.terms[0].results)t.push({char:"damage",res:s.result,suc:!1});return{rollType:"fallingDamage",preData:o,modifiers:await this._situationalModifiers(o),extra:{},damage:Math.max(0,e.total),formula:e.formula,characteristics:t}}static async rollRegeneration(o){let e=await this._situationalModifiers(o),t=o.roll,a=[],s={rollType:"regenerate",preData:o,modifiers:e,extra:{}},i=[];o.regenerateLeP&&i.push("LeP"),o.extra.actor.system.isMage&&o.regenerateAsP&&i.push("AsP"),o.extra.actor.system.isPriest&&o.regenerateKaP&&i.push("KaP");let n=0;if(o.extra.actor.effects.some(l=>l.statuses.includes("sick"))){this._appendSituationalModifiers(o,game.i18n.localize("CONDITION.sick"),"*0");for(let l of i)a.push({char:l,res:0,die:"d6"}),s[l]=0,n+=2}else for(let l of i)this._appendSituationalModifiers(o,game.i18n.localize(`LocalizedIDs.regeneration${l}`),P.vantageStep(o.extra.actor,game.i18n.localize(`LocalizedIDs.regeneration${l}`)),l),this._appendSituationalModifiers(o,game.i18n.localize(`LocalizedIDs.weakRegeneration${l}`),P.vantageStep(o.extra.actor,game.i18n.localize(`LocalizedIDs.weakRegeneration${l}`))*-1,l),this._appendSituationalModifiers(o,game.i18n.localize(`LocalizedIDs.advancedRegeneration${l}`),F.abilityStep(o.extra.actor,game.i18n.localize(`LocalizedIDs.advancedRegeneration${l}`)),l),this._appendSituationalModifiers(o,`${game.i18n.localize(`CHARAbbrev.${l}`)} ${game.i18n.localize("Modifier")}`,o[`${l}Modifier`],l),this._appendSituationalModifiers(o,`${game.i18n.localize(`CHARAbbrev.${l}`)} ${game.i18n.localize("regenerate")}`,o[`regeneration${l}`],l),a.push({char:l,res:t.terms[n].results[0].result,die:"d6"}),s[l]=Math.round(Math.max(0,Number(t.terms[n].results[0].result)+Number(e)+await this._situationalModifiers(o,l))*Number(o.regenerationFactor)),n+=2;return s.characteristics=a,s}static async rollStatus(o){let e=o.roll||await new Roll("1d20").evaluate(),t=await this._rollSingleD20(e,o.source.system.max,o.extra.statusId,await this._situationalModifiers(o),o,"",this._situationalMultipliers(o));t.rollType="dodge";let a=o.extra.statusId=="dodge";return a&&t.successLevel==3?await B.tableEnabledFor("criticalMeleeDefense")?t.description+=B.rollCritBotchButton("criticalMeleeDefense",!1,o,o):t.description+=B.defaultParryCrit():a&&t.successLevel==-3&&(await B.tableEnabledFor("Defense")?t.description+=B.rollCritBotchButton("Defense",!0,o,o):t.description+=await B.defaultBotch()),t}static async rollAttribute(o){let e=o.roll?o.roll:await new Roll("1d20").evaluate();this._appendSituationalModifiers(o,game.i18n.localize("Difficulty"),o.testDifficulty);let t=await this._rollSingleD20(e,o.source.system.value,o.extra.characteristicId,await this._situationalModifiers(o),o,"",this._situationalMultipliers(o));return t.rollType="attribute",t}static async damageFormula(o){let e;if(o.source.type=="meleeweapon"){let t=O._calculateCombatSkillValues(o.extra.actor.items.find(a=>a.type=="combatskill"&&a.name==o.source.system.combatskill.value),o.extra.actor.system);e=O._prepareMeleeWeapon(o.source,[t],o.extra.actor)}else if(o.source.type=="rangeweapon"){let t=O._calculateCombatSkillValues(o.extra.actor.items.find(a=>a.type=="combatskill"&&a.name==o.source.system.combatskill.value),o.extra.actor.system);e=O._prepareRangeWeapon(o.source,[],[t],o.extra.actor)}else e=o.source.system;return this.replaceDieLocalization(o.source.system.damage.value)+`+${e.extraDamage||0}`}static async rollDamage(o){let e=await this._situationalModifiers(o),t=[],a=o.roll,s=a.total+e;for(let i of a.terms)if(i instanceof foundry.dice.terms.Die||i.class=="Die")for(let n of i.results)t.push({char:o.mode,res:n.result,die:"d"+i.faces});return{rollType:"damage",damage:s,characteristics:t,preData:o,modifiers:e,extra:{}}}static async _situationalModifiers(o,e=""){let t=0;for(let a of o.situationalModifiers){if(a.value==null)continue;let s=Number(a.value)||await this._stringToRoll(a.value);t+=a.type==e||e==""&&a.type==null?s:0}return t}static _situationalPartCheckModifiers(o){return o.situationalModifiers.reduce(function(e,t){if(t.type=="TPM"){let a=t.value.split("|");return a.length!=3||(e[0]=e[0]+Number(a[0]),e[1]=e[1]+Number(a[1]),e[2]=e[2]+Number(a[2])),e}else return e},[0,0,0])}static _situationalMultipliers(o){return o.situationalModifiers.reduce(function(e,t){return e*(t.type=="*"&&Number(`${t.value}`.replace(/,/,"."))||1)},1)}static _appendSituationalModifiers(o,e,t,a=""){let s=o.situationalModifiers.find(i=>i.name==e);s?s.value=t:o.situationalModifiers.push({name:e,value:t,type:a})}static async rollCombatTrait(o){let e=o.roll||await new Roll("1d20").evaluate(),t=o.source,a=t.system.traitType.value=="meleeAttack",s=o.mode=="attack";if(a){let l={system:{combatskill:{value:"-"},reach:{value:t.system.reach.value}}};this._appendSituationalModifiers(o,game.i18n.localize("opposingWeaponSize"),this._compareWeaponReach(l,o))}let i=await this._rollSingleD20(e,Number(s?t.system.at.value:t.system.pa),o.mode,await this._situationalModifiers(o),o,"",this._situationalMultipliers(o));await this.getDuplicatusRoll(i,o);let n=i.successLevel>0;await this.detailedWeaponResult(i,o,t),s&&n&&await _DiceDSA5.evaluateDamage(o,i,t,!a,i.doubleDamage),i.rollType="weapon";let r=_DiceDSA5.parseEffect(t);return r&&(i.parsedEffect=r),i}static async _stringToRoll(o,e){let t=[],a=/\d{1}[dDwW]\d/g,s=`${o}`;s.replace(a,function(r){t.push(new Roll(_DiceDSA5.replaceDieLocalization(r),e.extra.actor.system).evaluate())});let i=await Promise.all(t),n=s.replace(a,()=>{let r=i.shift();return e&&_DiceDSA5._addRollDiceSoNice(e,r,game.dsa5.apps.DiceSoNiceCustomization.getAttributeConfiguration("ch")),r.total});return await Roll.safeEval(n)}static replaceDieLocalization(o){return o.replace(/[Ww](?=\d)/g,"d")}static async evaluateDamage(o,e,t,a,s){let i=this.replaceDieLocalization(t.system.damage.value),n=[],r=t.dmgMultipliers||[],l=r.map(y=>`${y.name} *${y.val}`),c=[],m=0;for(let y of o.situationalModifiers){let k=0;if(y.armorPen&&c.push(y.armorPen),y.damageBonus){if(/^\*/.test(y.damageBonus)){r.push({name:y.name,val:Number(y.damageBonus.replace("*",""))});continue}let C=/^=/.test(y.damageBonus),v=`${y.damageBonus}`.replace(/^=/,""),I=await _DiceDSA5._stringToRoll(v,o);if(k=I*(y.step||1),C){i=this.replaceDieLocalization(v),n.push({name:y.name,roll:I});continue}else y.damageBonus=I,m+=k}}let d=o.damageRoll||await _DiceDSA5.manualRolls(await new Roll(i,o.extra.actor.system).evaluate(),"CHAR.DAMAGE",o.extra.options),p=d.total,f=0;for(let y of d.terms)if(y instanceof foundry.dice.terms.Die||y.class=="Die")for(let k of y.results)f+=Number(k.result),e.characteristics.push({char:"damage",res:k.result,die:"d"+y.faces});let h=p-f;if(n.length>0)l.push(n[0].name+" "+p);else{p+=m,l.push(game.i18n.localize("Roll")+" "+f),h!=0&&l.push(game.i18n.localize("weaponModifier")+" "+h),o.situationalModifiers.reduce((I,S)=>{if(S.damageBonus){let j=/^\*/.test(S.damageBonus)?S.damageBonus:Number(S.damageBonus)*(S.step||1);l.push(`${S.name} ${j}`)}},l),o.situationalModifiers.find(I=>I.name.indexOf(game.i18n.localize("CONDITION.bloodrush"))>-1)&&(p+=2,l.push(game.i18n.localize("CONDITION.bloodrush")+" 2")),t.extraDamage&&(p=Number(t.extraDamage)+Number(p),l.push(game.i18n.localize("damageThreshold")+" "+t.extraDamage));let y=o.extra.actor.system[a?"rangeStats":"meleeStats"].damage,k=await _DiceDSA5._stringToRoll(y,o);k!=0&&(p+=k,l.push(game.i18n.localize("statuseffects")+" "+k));let C=$e(t,"system.combatskill.value"),v=o.extra.actor.system.skillModifiers.combat.damage.reduce((I,S)=>(S.target==C&&(I+=Number(S.value)),I),0);v&&(p=p+v,l.push(`${game.i18n.localize("TYPES.Item.combatskill")} (${game.i18n.localize("CHARAbbrev.damage")}) ${v}`))}s&&(p=p*s,l.push(game.i18n.format("doubleDamage",{x:s})));for(let y of r)p=p*y.val;e.armorPen=c,e.damagedescription=l.join(", "),e.damage=Math.round(p),e.damageRoll=xr(d)}static async rollWeapon(o){let e=o.roll||await new Roll("1d20").evaluate(),t,a=o.source,s=a.system.combatskill.value,i=O._calculateCombatSkillValues(o.extra.actor.items.find(c=>c.type=="combatskill"&&c.name==s),o.extra.actor.system,{step:await this._situationalModifiers(o,"step"),[o.mode]:await this._situationalModifiers(o,o.mode)}),n=a.type=="meleeweapon";n?(t=O._prepareMeleeWeapon(a,[i],o.extra.actor),o.mode=="attack"&&this._appendSituationalModifiers(o,game.i18n.localize("opposingWeaponSize"),this._compareWeaponReach(t,o))):t=O._prepareRangeWeapon(a,[],[i],o.extra.actor);let r=await this._rollSingleD20(e,t[o.mode],o.mode,await this._situationalModifiers(o),o,s,this._situationalMultipliers(o));await this.getDuplicatusRoll(r,o),await this.detailedWeaponResult(r,o,a),o.mode=="attack"&&r.successLevel>0&&!o.extra.counterAttack&&await _DiceDSA5.evaluateDamage(o,r,t,!n,r.doubleDamage),o.extra.counterAttack&&(g.getSpeaker(o.extra.speaker).addCondition("stunned"),r.description+=", "+g.replaceConditions(game.i18n.localize("stunnedByCounterAttack"))),r.rollType="weapon";let l=_DiceDSA5.parseEffect(t);return l&&(r.parsedEffect=l),r}static _weaponBotchCritEffect(o,e,t){let a=[];for(let s of o.effects)for(let i of s.changes)if(i.key==e){if(i.value=="description")a.push(s.description);else if(/^condition /.test(i.value)){let n=i.value.replace(/^condition /,"").split(" "),r=Number(n[1])||1,l=game.i18n.localize(`CONDITION.${n[0]}`),c=g.replaceConditions(game.i18n.format("CHATNOTIFICATION.suffersCondition",{actor:t.name,condition:l,count:r}));a.push(`

${c}

`)}}return a.join("
")}static async detailedWeaponResult(o,e,t){let a=e.mode=="attack"&&!e.extra.counterAttack,s=t.type=="meleeweapon"||$e(t,"system.traitType.value")=="meleeAttack";switch(o.successLevel){case 3:a?(await B.tableEnabledFor("criticalAttack")?o.description+=B.rollCritBotchButton("criticalAttack",!1,e):(o.description+=B.defaultAttackCrit(!0),o.doubleDamage=2),o.halfDefense=!0):e.isRangeDefense&&await B.tableEnabledFor("criticalRangeDefense")?o.description+=B.rollCritBotchButton("criticalRangeDefense",!1,e):await B.tableEnabledFor("criticalMeleeDefense")?o.description+=B.rollCritBotchButton("criticalMeleeDefense",!1,e):o.description+=B.defaultParryCrit(),o.description+=this._weaponBotchCritEffect(t,"self.criteffect",e.extra.actor);break;case-3:let i=$e(t,"system.combatskill.value")==game.i18n.localize("LocalizedIDs.wrestle")||t.type=="trait";a&&s&&await B.tableEnabledFor("Melee")?o.description+=B.rollCritBotchButton("Melee",i,e):a&&await B.tableEnabledFor("Range")?o.description+=B.rollCritBotchButton("Range",!1,e):!a&&await B.tableEnabledFor("Defense")?o.description+=B.rollCritBotchButton("Defense",i,e):o.description+=await B.defaultBotch(),o.description+=this._weaponBotchCritEffect(t,"self.botcheffect",e.extra.actor);break;case 2:a&&(o.description+=B.defaultAttackCrit(!1),o.halfDefense=!0);break;case-2:break}}static async _addRollDiceSoNice(o,e,t){if(o.rollMode){for(let a=0;a{new ae({title:game.i18n.localize(t.cheat?"DIALOG.cheat":"DSASETTINGS.allowPhysicalDice"),content:r,default:"ok",buttons:{ok:{icon:'',label:game.i18n.localize("yes"),callback:u(m=>l([!0,m]),"callback")},cancel:{icon:'',label:game.i18n.localize("cancel"),callback:u(()=>l([!1,0]),"callback")}}}).render(!0)}),s){let l=[];i.find(".dieInput").each(function(c){let m=Number($(this).val());m>0&&l.push({val:m,index:c}),c++}),o.editRollAtIndex(l)}}return o}static parseEffect(o){let e=o.system.effect?o.system.effect.value:void 0,t=[];if(e){let s=/^[a-z]+\|[öäüÖÄÜa-zA-z ]+$/;for(let i of e.split(";"))if(s.test(i.trim())){let n=i.split("|").map(r=>r.trim());if(n[0]=="condition"){let r=CONFIG.statusEffects.find(l=>l.id==n[1]);t.push(` ${game.i18n.localize(r.name)} `)}else t.push(`${game.i18n.localize(n[0])}: ${n[1]}`)}}let a=$e(o,"flags.dsa5.poison");return a&&t.push(`${game.i18n.localize("TYPES.Item.poison")}: ${a.name}`),t.join(", ")}static async calculateEnergyCost(o,e,t){let a=[],s,i,n,r;if(e.successLevel<0){let l=["traditionWitch","traditionFjarning","braniborian"].map(m=>game.i18n.localize(`LocalizedIDs.${m}`)),c=t.extra.actor.items.some(m=>m.type=="specialability"&&l.includes(m.name))?3:2;e.preData.calculatedSpellModifiers.finalcost=Math.round(e.preData.calculatedSpellModifiers.finalcost/c)}if(o?(r="KaPCost",s=game.i18n.localize("LocalizedIDs.weakKarmicBody"),i=game.i18n.localize(`LocalizedIDs.${e.successLevel>0?"mightyKarmaControl":"karmaControl"}`),n={val:"kapModifier",name:"KaP"}):(r="AsPCost",s=game.i18n.localize("LocalizedIDs.weakAstralBody"),i=game.i18n.localize(`LocalizedIDs.${e.successLevel>0?"energyControl":"smallEnergyControl"}`),n={val:"aspModifier",name:"AsP"}),a.push({name:s,value:P.vantageStep(t.extra.actor,s)},{name:i,value:F.abilityStep(t.extra.actor,i)*-1},{name:`${game.i18n.localize("statuseffects")} (${game.i18n.localize("CHARAbbrev."+n.name)})`,value:t.extra.actor.system[n.val]+await this._situationalModifiers(t,r)}),a=a.filter(l=>l.value!=0),e.preData.calculatedSpellModifiers.description=a.map(l=>`${l.name} ${l.value}`).join(` `),e.preData.calculatedSpellModifiers.finalcost=Math.max(1,Number(e.preData.calculatedSpellModifiers.finalcost)+a.reduce((l,c)=>l+c.value,0)),e.successLevel>0&&e.preData.calculatedSpellModifiers.maintainCost!=0){let l=e.preData.calculatedSpellModifiers.maintainCost.split(" ");l[0]=Math.round(Number(l[0])),e.preData.calculatedSpellModifiers.finalcost+=l[0],e.preData.calculatedSpellModifiers.maintainCost=l.join(" ")}}static async rollSpell(o){let e=await this._rollThreeD20(o),t=["ceremony","liturgy"].includes(o.source.type);if(e.rollType=o.source.type,e.preData.calculatedSpellModifiers.finalcost=e.preData.calculatedSpellModifiers.cost,e.successLevel>=2){let a=(await new Roll("1d6").evaluate()).total;e.description=e.description+", "+game.i18n.localize("additionalFPs")+" "+a,e.result+=a,e.qualityStep=Math.min(game.settings.get("dsa5","capQSat"),Math.ceil(e.result/3)),e.preData.calculatedSpellModifiers.finalcost=Math.round(e.preData.calculatedSpellModifiers.cost/2)}else e.successLevel<=-2&&(e.description+=B.rollCritBotchButton(t?"Liturgy":"Spell",!1,o));if(e.successLevel>0&&o.source.system.effectFormula.value!=""){let a=_DiceDSA5.replaceDieLocalization(o.source.system.effectFormula.value.replaceAll(game.i18n.localize("CHARAbbrev.QS"),e.qualityStep)),s=[];for(let l of o.situationalModifiers)l.armorPen&&s.push(l.armorPen);/(,|;)/.test(a)&&(a=a.split(/[,;]/)[e.qualityStep-1]);let i=o.damageRoll?o.damageRoll:await _DiceDSA5.manualRolls(await new Roll(a,o.extra.actor.system).evaluate(),"CHAR.DAMAGE",o.extra.options);this._addRollDiceSoNice(o,i,game.dsa5.apps.DiceSoNiceCustomization.getAttributeConfiguration("damage")),e.calculatedEffectFormula=a;for(let l of i.terms)if(l instanceof foundry.dice.terms.Die||l.class=="Die")for(let c of l.results)e.characteristics.push({char:"effect",res:c.result,die:"d"+l.faces});let n=[],r=await _DiceDSA5._stringToRoll(o.extra.actor.system[t?"liturgyStats":"spellStats"].damage,o);r!=0&&n.push(game.i18n.localize("statuseffects")+" "+r),e.armorPen=s,e.damageRoll=i,e.damage=i.total+r,e.damagedescription=n.join(` -`)}await this.calculateEnergyCost(t,e,o),await this.getDuplicatusRoll(e,o);for(let a of["minorFairies","minorSpirits"]){let s=game.i18n.localize("CONDITION."+a);P.hasVantage(o.extra.actor,s)&&!o.extra.actor.effects.find(i=>i.name==s)&&(await new Roll("1d20").evaluate()).total<=e.preData.calculatedSpellModifiers.finalcost&&(e.description+=", "+game.i18n.format("minorghostsappear",{creature:s}),g.getSpeaker(o.extra.speaker).addCondition(a))}return e}static async _rollThreeD20(o){let e=o.roll?o.roll instanceof Roll?o.roll:Roll.fromData(o.roll):await new Roll("1d20+1d20+1d20").evaluate(),t=[],a=0;this._appendSituationalModifiers(o,game.i18n.localize("Difficulty"),o.testDifficulty);let s=await this._situationalModifiers(o),i=Number(o.source.system.talentValue.value)+o.advancedModifiers.fws+await this._situationalModifiers(o,"FW"),n=this._situationalPartCheckModifiers(o,"TPM"),r=[1,2,3].map(f=>o.extra.actor.system.characteristics[o.source.system[`characteristic${f}`].value].value+s+o.advancedModifiers.chars[f-1]+n[f-1]),l=[0,1,2].map(f=>e.terms[f*2].results[0].result-r[f]);if(o.routine)i=Math.round(i/2);else for(let f of l)f>0&&(i-=f);let c=o.extra.actor.system.skillModifiers.crit,m=o.extra.actor.system.skillModifiers.botch;if(["spell","ritual"].includes(o.source.type)&&P.hasVantage(o.extra.actor,game.i18n.localize("LocalizedIDs.wildMagic"))&&(m=19),o.source.type=="skill"&&P.hasVantage(o.extra.actor,`${game.i18n.localize("LocalizedIDs.incompetent")} (${o.source.name})`)){let f=await new Roll("1d20").evaluate(),h=l.reduce((k,D,v,I)=>D0&&(i+=await this._situationalModifiers(o,"FP"),p=Math.max(1,(i==0?1:i>0?Math.ceil(i/3):0)+(o.qualityStep!=null?Number(o.qualityStep):0))+(o.advancedModifiers.qls||0)+await this._situationalModifiers(o,"QL")),p=Math.min(game.settings.get("dsa5","capQSat"),p),p({char:o.source.system[`characteristic${f+1}`].value,res:e.terms[f*2].results[0].result,suc:l[f]<=0,tar:r[f]})),qualityStep:p,description:t,preData:o,successLevel:a,modifiers:s,extra:{}}}static async rollTalent(o){let e=await this._rollThreeD20(o);return e.rollType="talent",e}static get3D20SuccessLevel(o,e,t=20,a=1){let s=o.terms.filter(n=>n.results&&n.results[0].result<=a).length,i=o.terms.filter(n=>n.results&&n.results[0].result>=t).length;return s>=2?s:i>=2?i*-1:e>=0?1:-1}static getSuccessDescription(o){return game.i18n.localize(["AstoundingFailure","CriticalFailure","Failure","","Success","CriticalSuccess","AstoundingSuccess"][o+3])}static async rollItem(o){let e=o.roll||await new Roll("1d20+1d20+1d20").evaluate(),t=[],a=await this._situationalModifiers(o),s=Number(o.source.system.step.value),i=[1,2,3].map(m=>10+Number(o.source.system.step.value)+a),n=[0,1,2].map(m=>e.terms[m*2].results[0].result-i[m]);for(let m of n)m>0&&(s-=m);let l=_DiceDSA5.get3D20SuccessLevel(e,s,20);t.push(_DiceDSA5.getSuccessDescription(l)),t=t.join(", ");let c={result:s,characteristics:[0,1,2].map(m=>({char:o.source.type,res:e.terms[m*2].results[0].result,suc:n[m]<=0,tar:i[m]})),qualityStep:Math.min(game.settings.get("dsa5","capQSat"),(s==0?1:s>0?Math.ceil(s/3):0)+(o.qualityStep!=null?Number(o.qualityStep):0)),description:t,preData:o,successLevel:l,modifiers:a,extra:{}};switch(o.source.type){case"poison":let m=o.source.system.duration.value.split(" / ").map(h=>h.trim()),d=o.source.system.effect.value.split(" / ").map(h=>h.trim());c.duration=m.length>1?c.successLevel>0?m[0]:m[1]:m[0],c.effect=d.length>1?c.successLevel>0?d[0]:d[1]:d[0];break;case"disease":let p=o.source.system.damage.value.split(" / ").map(h=>h.trim()),f=o.source.system.duration.value.split(" / ").map(h=>h.trim());c.damageeffect=p.length>1?c.successLevel>0?p[0]:p[1]:p[0],c.duration=f.length>1?c.successLevel>0?f[0]:f[1]:f[0];break}return c}static async updateDefenseCount(o){game.combat&&!o.fateUsed&&await game.combat.updateDefenseCount(o.extra.speaker)}static _compareWeaponReach(o,e){let t=e.situationalModifiers.find(i=>i.name==game.i18n.localize("LocalizedIDs.circumvent")),a=b.meleeRangesArray.indexOf(o.system.reach.value),s=b.meleeRangesArray.indexOf(e.opposingWeaponSize);return t&&s>a&&(t.value=Math.min(t.step,s-a)*2),Math.min(0,a-s)*2}static async showDiceSoNice(o,e){if(g.moduleEnabled("dice-so-nice")&&game.dice3d){let t=null,a=!1;switch(e){case"blindroll":a=!0,t=game.users.filter(i=>i.isGM).map(i=>i.id);break;case"gmroll":t=game.users.filter(i=>i.isGM).map(i=>i.id);break;case"selfroll":t=[];break}let s=game.dice3d.showForRoll(o,game.user,!0,t,a);game.settings.get("dice-so-nice","immediatelyDisplayChatMessages")||await s}}static addApplyEffectData(o){let e=o.preData.source;if(o.successLevel>0){if(["meleeweapon","rangeweapon"].includes(e.type)||e.type=="trait"&&["rangeAttack","meleeAttack"].includes(e.system.traitType.value)){if(e.effects.some(a=>!$e(a,"flags.dsa5.applyToOwner")))return!0}else if(["spell","liturgy","ritual","ceremony","trait","skill"].includes(e.type)&&e.effects.length>0)return!0}if(["disease","poison"].includes(e.type)){let a=o.successLevel>0?1:2;return e.effects.filter(s=>$e(s,"flags.dsa5.successEffect")==a||!$e(s,"flags.dsa5.successEffect")).length>0}let t=o.preData.situationalModifiers.filter(a=>a.specAbId).map(a=>a.specAbId);if(t.length>0){let a=o.preData.extra.actor.items.filter(s=>t.includes(s._id));for(let s of a)if(s.effects.length>0)return!0}return!1}static async renderRollCard(chatOptions,testData,rerenderMessage){let applyEffect=this.addApplyEffectData(testData),immuneTo=x.checkImmunity(testData),preData=On(testData.preData),hideDamage=rerenderMessage?rerenderMessage.flags.data.hideDamage:preData.mode=="attack";await pe.postRoll({testData,preData}),Hooks.call("postProcessDSARoll",chatOptions,testData,rerenderMessage,hideDamage),await g.callAsyncHooks("postProcessDSARoll",[testData]),delete preData.extra.actor,delete testData.actor,delete testData.preData;let hasAreaTemplate=testData.successLevel>0&&preData.source.system.target&&preData.source.system.target.type in game.dsa5.config.areaTargetTypes,chatData={title:chatOptions.title,immuneTo,testData,hideData:game.user.isGM,preData,hideDamage,modifierList:preData.situationalModifiers.filter(o=>o.value!=0),applyEffect,hasAreaTemplate,showDamageToGear:await W.showDamageToGear(preData,testData)};if(preData.advancedModifiers&&(preData.advancedModifiers.chars.some(o=>o!=0)&&chatData.modifierList.push({name:game.i18n.localize("MODS.partChecks"),value:preData.advancedModifiers.chars}),preData.advancedModifiers.fws!=0&&chatData.modifierList.push({name:game.i18n.localize("MODS.FW"),value:preData.advancedModifiers.fws}),preData.advancedModifiers.qls!=0&&chatData.modifierList.push({name:game.i18n.localize("MODS.QS"),value:preData.advancedModifiers.qls})),["gmroll","blindroll"].includes(chatOptions.rollMode)&&(chatOptions.whisper=game.users.filter(o=>o.isGM).map(o=>o.id)),chatOptions.rollMode==="blindroll"?chatOptions.blind=!0:chatOptions.rollMode==="selfroll"&&(chatOptions.whisper=[game.user.id]),K.playEffect(preData.mode,preData.source,testData.successLevel,chatOptions.whisper,chatOptions.blind),oe(chatOptions,{flags:{data:{preData,postData:testData,template:chatOptions.template,rollMode:chatOptions.rollMode,isOpposedTest:chatOptions.isOpposedTest,title:chatOptions.title,hideData:chatData.hideData,hideDamage:chatData.hideDamage,isDSARoll:!0}}}),rerenderMessage){let postFunction=$e(rerenderMessage,"flags.data.preData.extra.options.postFunction");postFunction&&(testData.messageId=rerenderMessage.id,await eval(postFunction.functionName)(postFunction,{result:testData,chatData},preData.source));let html=await renderTemplate(chatOptions.template,chatData),actor=ChatMessage.getSpeakerActor(rerenderMessage.speaker)||game.users.get(rerenderMessage.author)?.character,rollData=actor?actor.getRollData():{},enriched=await TextEditor.enrichHTML(html,{rollData,async:!0});chatOptions.content=enriched;let newMsg=await rerenderMessage.update({content:chatOptions.content,flags:{data:chatOptions.flags.data}});return ui.chat.updateMessage(newMsg),newMsg}else return chatOptions.content=await renderTemplate(chatOptions.template,chatData),await ChatMessage.create(chatOptions)}static async _itemRoll(o){let e=$(o.currentTarget),t=e.parents(".message").attr("data-message-id"),a=game.messages.get(t),s=a.speaker,i=e.attr("data-type"),n=e.attr("data-name"),r=g.getSpeaker(s);if(r){let l=r.items.find(c=>c.name==n&&c.type==i);if(l){let c=new C(l.toObject()),m=e.attr("data-removecharge")?e.attr("data-removecharge")=="true":!1;if(m&&c.system.quantity.value<1){ui.notifications.error("DSAError.NotEnoughCharges",{localize:!0});return}c.setupEffect().then(async d=>{await c.itemTest(d),m&&await l.update({"system.quantity.value":l.system.quantity.value-1})})}else ui.notifications.error(game.i18n.format("DSAError.notFound",{category:i,name:n}))}}static async _rollEdit(o){let e=$(o.currentTarget),t=e.parents(".message").attr("data-message-id"),a=game.messages.get(t),s=a.flags.data,i=s.preData;i.extra.actor=g.getSpeaker(i.extra.speaker)?.toObject(!1),i.extra.options.cheat&&delete i.extra.options.cheat;let n;switch(e.attr("data-edit-type")){case"roll":n=e.attr("data-edit-id");let l=Number(e.val());if(i.roll.terms.length>n*2){let m=Roll.fromData(i.roll);m.editRollAtIndex([{index:n,val:l}]),i.roll=m}else{let m=Roll.fromData(s.postData.damageRoll);n=n-i.roll.terms.filter(d=>d.results).length,m.editRollAtIndex([{index:n,val:l}]),i.damageRoll=m}break;case"mod":n=i.situationalModifiers.findIndex(m=>m.name==game.i18n.localize("chatEdit")),n>0&&i.situationalModifiers.splice(n,1);let c={name:game.i18n.localize("chatEdit"),value:Number(e.val())-await this._situationalModifiers(i)};i.situationalModifiers.push(c);break}s.postData.damageRoll&&!i.damageRoll&&(i.damageRoll=s.postData.damageRoll);let r={template:s.template,rollMode:s.rollMode,title:s.title,speaker:a.speaker,user:a.author.id};["gmroll","blindroll"].includes(r.rollMode)&&(r.whisper=game.users.filter(l=>l.isGM).map(l=>l.id)),r.rollMode==="blindroll"&&(r.blind=!0),["poison","disease"].includes(i.source.type)?new C(i.source)[`${s.postData.postFunction}`]({testData:i,cardOptions:r},{rerenderMessage:a}):g.getSpeaker(a.speaker)[`${s.postData.postFunction}`]({testData:i,cardOptions:r},{rerenderMessage:a})}static async gearDamaged(o){let e=o.currentTarget.dataset.uuid.split(";");if(e.length>1){let t=await Promise.all(e.map(a=>fromUuid(a)));zt.showDialog(t)}else W.breakingTest(await fromUuid(e[0]))}static showCurrentTargets(o){let e=[],t;if(o.currentTarget.dataset.target=="target"){t="TT.applyEffectTargets";for(let s of game.user.targets)e.push(s.document.texture.src)}else{t="TT.applyEffectCaster";let s=game.messages.get($(o.currentTarget).parents(".message").attr("data-message-id")),i=g.getSpeaker(s.flags.data.preData.extra.speaker);i&&e.push(i.token?i.token.texture.src:i.prototypeToken.texture.src)}let a=e.length?e.map(s=>``).join(""):` ${game.i18n.localize("DIALOG.noTarget")}`;o.currentTarget.dataset.tooltip=`

${game.i18n.localize(t)}

${a}
`}static async rollResistPain(o){let e=o.currentTarget.dataset,t={token:e.token,actor:e.actor,scene:canvas.id},a=g.getSpeaker(t);a&&a.finishResistPainRoll()}static async wrapLock(o,e){let t=$(o.currentTarget);t.hasClass("locked")||(t.addClass("locked"),t.prepend(''),await e(o,t),setTimeout(()=>{t.removeClass("locked"),t.find("i").remove()},2e3))}static async chatListeners(o){o.on("click",".expand-mods",e=>{e.preventDefault();let t=$(e.currentTarget);t.find("i").toggleClass("fa-minus fa-plus"),t.siblings("ul,div").fadeToggle()}),o.on("click",".edit-toggle",e=>{e.preventDefault(),$(e.currentTarget).parents(".chat-card").find(".display-toggle").toggle()}),o.on("click",".botch-roll",e=>B.showBotchCard(e.currentTarget.dataset)),o.on("click",".roll-item",e=>_DiceDSA5._itemRoll(e)),o.on("click",".gearDamaged",async e=>_DiceDSA5.gearDamaged(e)),o.on("click",".applyDamage",async e=>wt($(e.currentTarget).closest(".message"),e.currentTarget.dataset.mode)),o.on("change",".roll-edit",e=>_DiceDSA5._rollEdit(e)),o.on("click",".applyEffect",async e=>{_DiceDSA5.wrapLock(e,async(t,a)=>{let s=a.parents(".message").attr("data-message-id"),i=t.currentTarget.dataset.target;await Z.applyEffect(s,i)})}),o.on("mouseenter",".applyEffect",e=>_DiceDSA5.showCurrentTargets(e)),o.on("click",".applyTableEffect",async e=>{_DiceDSA5.wrapLock(e,async(t,a)=>{let s=a.parents(".message").attr("data-message-id"),i=t.currentTarget.dataset.target;await Nt.applyEffect(s,i)})}),o.on("click",".placeTemplate",async e=>Le.placeTemplateFromChat(e)),o.on("click",".message-delete",e=>{let t=game.messages.get($(e.currentTarget).parents(".message").attr("data-message-id"));if(!t.flags.unopposeData)return;let s=canvas.tokens.get(t.flags.unopposeData.targetSpeaker.token);ee.clearOpposed(s.actor)}),o.on("click",".resistEffect",e=>Z.resistEffect(e)),o.on("click",".resistPain",e=>_DiceDSA5.rollResistPain(e)),ie.chatListeners(o)}};var{getProperty:U,mergeObject:we,duplicate:Ke,hasProperty:zr,setProperty:Nr,expandObject:Rr}=foundry.utils,O=class o extends Actor{static{u(this,"Actordsa5")}static DEFAULT_ICON="icons/svg/mystery-man-black.svg";static selfRegex=/^self\./;static skipAlternateWeaponKeys=new Set([["flags","system.description"]]);static async create(e,t){if(e instanceof Array||e.items)return await super.create(e,t);let a=await g.allSkills()||[],s=await g.allCombatSkills()||[],i=await g.allMoneyItems()||[];return e.items=[...a,...s,...i],e.type!="character"&&(e.system={status:{fatePoints:{current:0,value:0}}}),e.type!="creature"&&[void 0,0].includes(U(e,"system.status.wounds.value"))&&we(e,{system:{status:{wounds:{value:16}}}}),await super.create(e,t)}_getArmorCompensation(e,t,a){let s=F.abilityStep(e,game.i18n.localize("LocalizedIDs.inuredToEncumbrance")),i=t.reduce((n,r)=>n+=Number(r.system.encumbrance.value),0);if(s>i){let n=[game.i18n.localize("CHARAbbrev.GS"),game.i18n.localize("CHARAbbrev.INI")];for(let r of n)a[r]&&(a[r]=a[r].filter(l=>l.type!="armor"))}}_getItemModifiers(){let e=[],t={};for(let a of this.items.filter(s=>["meleeweapon","rangeweapon","armor","equipment"].includes(s.type)&&U(s,"system.worn.value")||["advantage","specialability","disadvantage"].includes(s.type)))this._buildGearAndAbilityModifiers(t,a),a.type=="armor"&&e.push(a);this._getArmorCompensation(this,e,t),this._applyModiferTransformations(t)}prepareDerivedData(){let e=this.system;try{this._getItemModifiers();for(let p of Object.values(e.characteristics))p.value=p.initial+p.advances+(p.modifier||0)+p.gearmodifier;e.totalWeight=0;let t=[],a=game.i18n.localize("LocalizedIDs.familiar"),s=game.i18n.localize("LocalizedIDs.companion"),i=game.settings.get("dsa5","moneyHasWeight"),n=new Map,r=this.items.filter(p=>p.type=="equipment"&&p.system.equipmentType.value=="bags");for(let p of r)n.set(p.id,[]);this.system.moneyWeight=0;for(let p of this.items)if(i&&p.type=="money")p.system.preparedWeight=parseFloat((p.system.weight.value*p.system.quantity.value).toFixed(3)),e.totalWeight+=Number(p.system.preparedWeight),this.system.moneyWeight+=Number(p.system.preparedWeight);else if(b.equipmentCategories.has(p.type)){let f=U(p,"system.parent_id");if(f&&f!=p._id&&n.has(f)){n.get(f).push(p);continue}p.type=="armor"?(p.system.preparedWeight=parseFloat((p.system.weight.value*p.system.quantity.value).toFixed(3)),e.totalWeight+=parseFloat((p.system.weight.value*(p.system.worn.value?Math.max(0,p.system.quantity.value-1):p.system.quantity.value)).toFixed(3)),p.system.worn.value&&t.push(p)):(p.system.preparedWeight=parseFloat((p.system.weight.value*p.system.quantity.value).toFixed(3)),e.totalWeight+=Number(p.system.preparedWeight))}else switch(p.type){case"trait":p.name==a?e.isFamiliar=!0:p.name==s&&(e.isPet=!0);break;case"spell":case"ritual":case"magictrick":e.isMage=!0;break;case"liturgy":case"ceremony":case"blessing":e.isPriest=!0;break;case"specialability":b.sortedSpecs.magical.has(p.system.category.value)?e.isMage=!0:b.sortedSpecs.clerical.has(p.system.category.value)&&(e.isPriest=!0);break}e.isMage||=e.isFamiliar;for(let p of r){let f=U(p,"system.parent_id");(!f||!n.has(f))&&(e.totalWeight+=this._calcBagweight(p,n,!0))}e.canAdvance=this.isOwner&&(this.type=="character"||e.isFamiliar||e.isPet),this.canAdvance=e.canAdvance,e.carrycapacity=e.characteristics.kk.value*2+e.carryModifier,e.canAdvance&&(e.details.experience.current=e.details.experience.total-e.details.experience.spent,e.details.experience.description=g.experienceDescription(e.details.experience.total)),(this.type=="character"||this.type=="npc")&&(e.status.wounds.current=e.status.wounds.initial+e.characteristics.ko.value*2,e.status.soulpower.value=(e.status.soulpower.initial||0)+Math.round((e.characteristics.mu.value+e.characteristics.kl.value+e.characteristics.in.value)/6),e.status.toughness.value=(e.status.toughness.initial||0)+Math.round((e.characteristics.ko.value+e.characteristics.ko.value+e.characteristics.kk.value)/6),e.status.wounds.min=-1*e.characteristics.ko.value),e.status.fatePoints.max=Number(e.status.fatePoints.current)+Number(e.status.fatePoints.modifier)+e.status.fatePoints.gearmodifier,this.type=="creature"&&(e.status.wounds.current=e.status.wounds.initial,e.status.astralenergy.current=e.status.astralenergy.initial,e.status.karmaenergy.current=e.status.karmaenergy.initial),e.status.wounds.max=Math.round((e.status.wounds.current+e.status.wounds.modifier+e.status.wounds.advances)*e.status.wounds.multiplier+e.status.wounds.gearmodifier),e.status.regeneration.LePmax=e.status.regeneration.LePTemp+e.status.regeneration.LePMod+e.status.regeneration.LePgearmodifier,e.status.regeneration.KaPmax=e.status.regeneration.KaPTemp+e.status.regeneration.KaPMod+e.status.regeneration.KaPgearmodifier,e.status.regeneration.AsPmax=e.status.regeneration.AsPTemp+e.status.regeneration.AsPMod+e.status.regeneration.AsPgearmodifier;let l=e.guidevalue;e.status.astralenergy.rebuy||=0,e.status.karmaenergy.rebuy||=0,e.status.astralenergy.permanentLoss||=0,e.status.karmaenergy.permanentLoss||=0,e.status.astralenergy.permanentLossSum=e.status.astralenergy.permanentLoss-e.status.astralenergy.rebuy+e.status.astralenergy.permanentGear,e.status.karmaenergy.permanentLossSum=e.status.karmaenergy.permanentLoss-e.status.karmaenergy.rebuy+e.status.karmaenergy.permanentGear,(e.isFamiliar||l&&this.type!="creature")&&(e.status.astralenergy.current=e.status.astralenergy.initial,e.status.karmaenergy.current=e.status.karmaenergy.initial,e.characteristics[l.magical]&&(e.status.astralenergy.current+=Math.round(e.characteristics[l.magical].value*e.energyfactor.magical)),e.characteristics[l.clerical]&&(e.status.karmaenergy.current+=Math.round(e.characteristics[l.clerical].value*e.energyfactor.clerical))),e.status.astralenergy.max=e.status.astralenergy.current+e.status.astralenergy.modifier+e.status.astralenergy.advances+e.status.astralenergy.gearmodifier-e.status.astralenergy.permanentLossSum,e.status.karmaenergy.max=e.status.karmaenergy.current+e.status.karmaenergy.modifier+e.status.karmaenergy.advances+e.status.karmaenergy.gearmodifier-e.status.karmaenergy.permanentLossSum,e.status.soulpower.max=e.status.soulpower.value+e.status.soulpower.modifier+e.status.soulpower.gearmodifier,e.status.toughness.max=e.status.toughness.value+e.status.toughness.modifier+e.status.toughness.gearmodifier,e.status.dodge.value=Math.round(e.characteristics.ge.value/2)+e.status.dodge.gearmodifier;let c=this.calcEncumbrance(e),m=H.isRiding(this)?H.getHorse(this):void 0;this.calcInitiative(e,c,m),e.status.dodge.max=Number(e.status.dodge.value)+Number(e.status.dodge.modifier)+Number(game.settings.get("dsa5","higherDefense"))/2,e.armorEncumbrance=this.getArmorEncumbrance(this,t),this.prepareSwarm(e),this.effectivePain(e);let d=this.statuses.has("fixated");this.calcSpeed(e,d,m),d&&(e.status.dodge.max=Math.max(0,e.status.dodge.max-4))}catch(t){console.error(`Something went wrong with preparing actor data ${this.name}: `+t+t.stack),ui.notifications.error(game.i18n.format("DSAError.PreparationError",{name:this.name})+t+t.stack)}}static async deferredEffectAddition(e,t,a){let i=(t.effects.find(r=>r.statuses.has(e))?.flags.dsa5.auto||0)!=a,n=`changing${e}`;t[n]=i,i&&await t.addCondition(e,a,!0,!0).then(()=>t[n]=void 0)}static async postUpdateConditions(e){if(!g.isActiveGM())return;let t=e.system,a=e.isMerchant();if(!he.hasTrait(e,game.i18n.localize("LocalizedIDs.painImmunity"))){let n=e.woundPain(t);await this.deferredEffectAddition("inpain",e,n)}let s=t.armorEncumbrance;(e.type!="creature"||e.canAdvance)&&!a&&(s+=Math.max(0,Math.ceil((t.totalWeight-t.carrycapacity-4)/4))),await this.deferredEffectAddition("encumbered",e,s);let i=e.woundPain(t,"temporaryLeP");await this.deferredEffectAddition("stunned",e,i),P.hasVantage(e,game.i18n.localize("LocalizedIDs.blind"))&&await e.addCondition("blind"),P.hasVantage(e,game.i18n.localize("LocalizedIDs.mute"))&&await e.addCondition("mute"),P.hasVantage(e,game.i18n.localize("LocalizedIDs.deaf"))&&await e.addCondition("deaf"),a&&await e.prepareMerchant()}static async _onCreateOperation(e,t,a){for(let s of e)await o.postUpdateConditions(s);return super._onCreateOperation(e,t,a)}static async _onUpdateOperation(e,t,a){for(let s of e)await o.postUpdateConditions(s);return super._onUpdateOperation(e,t,a)}prepareSwarm(e){let t=Number(e.swarm.count)||1;if(t<2)return;e.swarm.maxwounds=e.status.wounds.max,e.status.wounds.max*=t;let a=Math.min(Math.ceil(e.status.wounds.value/e.swarm.maxwounds),t),s=Number(e.swarm.gg)||1;e.swarm.attack+=Math.min(10,Math.floor(a/s)),e.swarm.parry+=-1,e.swarm.effectiveCount=a,e.swarm.damage=Math.min(5,Math.floor(a/s))}effectivePain(e){let t=e.condition.inpain||0;t<4&&(t-=P.vantageStep(this,game.i18n.localize("LocalizedIDs.ruggedFighter"))+P.vantageStep(this,game.i18n.localize("LocalizedIDs.ruggedAnimal"))+(F.hasAbility(this,game.i18n.localize("LocalizedIDs.traditionKor"))?1:0)),t>0&&(t+=P.vantageStep(this,game.i18n.localize("LocalizedIDs.sensitiveToPain"))+P.vantageStep(this,game.i18n.localize("LocalizedIDs.fragileAnimal"))),t=Math.clamp(t,0,4),e.condition.inpain=t}woundPain(e,t="wounds"){let a=0;return e.status[t].max>0&&(this.type!="creature"||e.status[t].max>=20?(a=Math.floor((1-e.status[t].value/e.status[t].max)*4),e.status[t].value<=5&&(a=4)):a=Math.floor(5-5*e.status[t].value/e.status[t].max)),Math.clamp(a,0,4)}calcSpeed(e,t,a){if(a){if(e.status.speed.max=a.system.status.speed.max,!e.status.speed.max){let s=a.system;a.calcSpeed(s,a.hasCondition("fixated"))}e.status.speed.max=a.system.status.speed.max}else{e.status.speed.max=e.status.speed.initial+(e.status.speed.modifier||0)+(e.status.speed.gearmodifier||0),e.status.speed.max=Math.round(Math.max(0,e.status.speed.max-Math.min(4,this.calcEncumbrance(e)))*e.status.speed.multiplier),this.hasCondition("bloodrush")||(e.status.speed.max=Math.max(0,e.status.speed.max-(e.condition?.inpain||0)));let s=this.hasCondition("paralysed");s&&(e.status.speed.max=Math.round(e.status.speed.max*(1-s.flags.dsa5.value*.25))),t||this.hasCondition("rooted")||this.hasCondition("incapacitated")?e.status.speed.max=0:this.hasCondition("prone")&&(e.status.speed.max=Math.min(1,e.status.speed.max)),H.updateRiderSpeed(this,e.status.speed.max)}}calcEncumbrance(e){return Math.clamp(e.condition?.encumbered||0,0,4)}calcInitiative(e,t,a){if(this.type=="character"||this.type=="npc"?e.status.initiative.value=Math.round((e.characteristics.mu.value+e.characteristics.ge.value)/2)+(e.status.initiative.modifier||0):e.status.initiative.value=e.status.initiative.current+(e.status.initiative.modifier||0),a){if(e.status.initiative.value=a.system.status.initiative.value,!e.status.initiative.value){let s=a.system;a.calcInitiative(s,a.calcEncumbrance(s)),e.status.initiative.value=s.status.initiative.value}}else{e.status.initiative.value+=(e.status.initiative.gearmodifier||0)-Math.min(4,t);let s=Number((.01*e.status.initiative.value).toFixed(2));e.status.initiative.value*=e.status.initiative.multiplier||1,e.status.initiative.value=Math.round(e.status.initiative.value)+s}}get creatureType(){return x.creatureTypeName(this)}async prepareMerchant(){if(U(this,"system.merchant.merchantType")=="loot"){if(U(this,"system.merchant.locked")&&!this.hasCondition("locked"))await this.addCondition(o.lockedCondition());else if(!U(this,"system.merchant.locked")){let e=this.effects.find(t=>t.statuses.has("locked"));e&&await this.deleteEmbeddedDocuments("ActiveEffect",[e.id])}}}static lockedCondition(){return{id:"locked",name:game.i18n.localize("MERCHANT.locked"),img:"icons/svg/padlock.svg",flags:{dsa5:{noEffect:!0,hidePlayers:!0,description:game.i18n.localize("MERCHANT.locked")}}}}applyActiveEffects(){let e={};this.statuses??=new Set;let t=new Map;for(let c of Object.values(CONFIG.specialStatusEffects))t.set(c,this.statuses.has(c));this.statuses.clear();let a=[],s=1;for(let c of this.effects){if(c.disabled||c.system.delayed)continue;if(U(c,"flags.dsa5.isAura")){this.auras.push(c.uuid);continue}s=1;let m=c.getFlag("dsa5","value");m&&(s=Number(m));for(let d=0;d(p=foundry.utils.duplicate(p),p.effect=c,p.priority=p.priority?p.priority:p.mode*10,p)));for(let d of c.statuses)this.statuses.add(d)}let i=!0,n=this.items.filter(c=>["rangeweapon","meleeweapon","equipment","armor"].includes(c.type)&&c.system.isArtifact&&(c.system.worn.value||c.type=="equipment"&&!c.system.worn.wearable)).map(c=>c.system.artifact),r=!game.settings.get("dsa5","enableWeaponAdvantages");this.dsatriggers={6:{},7:{}};for(let c of this.items)for(let m of c.effects){if(m.disabled||!m.transfer||m.system.delayed)continue;switch(i=!0,c.type){case"meleeweapon":case"rangeweapon":if(r&&m.system.equipmentAdvantage)continue;i=c.system.worn.value&&m.getFlag("dsa5","applyToOwner");break;case"armor":if(r&&m.system.equipmentAdvantage)continue;i=c.system.worn.value;break;case"equipment":i=!c.system.worn.wearable||c.system.worn.wearable&&c.system.worn.value;break;case"trait":i=!["meleeAttack","rangeAttack"].includes(c.system.traitType.value)||m.getFlag("dsa5","applyToOwner"),s=Number(U(c.system,"step.value"))||1;break;case"ammunition":case"plant":case"consumable":case"combatskill":case"magicsign":case"poison":case"spell":case"liturgy":case"ceremony":case"ritual":case"skill":case"spellextension":i=!1;break;case"specialability":switch(c.system.category.value){case"Combat":i=[2,3].includes(Number(c.system.category.sub));break;case"staff":i=c.system.permanentEffects||n.includes(c.system.artifact);break;default:i=!0}s=Number(c.system.step.value)||1;break;case"advantage":case"disadvantage":s=Number(c.system.step.value)||1;break}let d=U(m,"flags.dsa5.advancedFunction");if(Object.prototype.hasOwnProperty.call(this.dsatriggers,d)&&(this.dsatriggers[d][c.id]=m.id),m.notApplicable=!i,i&&U(m,"flags.dsa5.isAura")){this.auras.push(m.uuid);continue}if(i){for(let p=0;p(f=foundry.utils.duplicate(f),f.effect=m,f.priority=f.priority?f.priority:f.mode*10,f)));for(let p of m.statuses)this.statuses.add(p)}}a.sort((c,m)=>c.priority-m.priority);for(let c of a){if(!c.key||o.selfRegex.test(c.key))continue;let m=c.effect.apply(this,c);Object.assign(e,m)}this.overrides=Rr(e);let l;for(let[c,m]of t){let d=this.statuses.has(c);if(d!==m){l??=this.getActiveTokens();for(let p of l)p._onApplyStatusEffect(c,d)}}}_setOnUseEffect(e){U(e,"flags.dsa5.onUseEffect")&&(e.OnUseEffect=!0)}_setAEPayments(e){if(e.OnUseEffect)return;Number(U(e,"system.AsPCost"))&&(e.AEpayable=!0)}prepareBaseData(){let e=this.system;this.auras=[],we(e,{itemModifiers:{},condition:{},swarm:{attack:0,parry:0,damage:0},creatureType:this.creatureType,skillModifiers:{FP:[],step:[],QL:[],TPM:[],FW:[],botch:20,crit:1,global:[],conditional:{AsPCost:[],KaPCost:[]},combat:{step:[],parry:[],attack:[],damage:[]},feature:{FP:[],step:[],QL:[],TPM:[],FW:[],KaPCost:[],AsPCost:[]},...["liturgy","ceremony","ritual","spell","skill"].reduce((t,a)=>(t[a]={FP:[],step:[],QL:[],TPM:[],FW:[]},t),{})},status:{initiative:{multiplier:1},astralenergy:{permanentGear:0},karmaenergy:{permanentGear:0},wounds:{multiplier:1},speed:{multiplier:1},regeneration:{LePgearmodifier:0,KaPgearmodifier:0,AsPgearmodifier:0}},repeatingEffects:{startOfRound:{wounds:[],karmaenergy:[],astralenergy:[]}},temperature:{heatProtection:0,coldProtection:0},totalArmor:0,spellArmor:0,liturgyArmor:0,carryModifier:0,aspModifier:0,kapModifier:0,immunities:[],thresholds:{effects:[]},creatureBonus:[],miracle:{attack:0,parry:0},spellStats:{damage:"0"},liturgyStats:{damage:"0"},meleeStats:{parry:0,attack:0,damage:"0",defenseMalus:0,botch:20,crit:1},rangeStats:{attack:0,damage:"0",defenseMalus:0,botch:20,crit:1}});for(let t of b.gearModifyableCalculatedAttributes)e.status[t]&&(e.status[t].gearmodifier=0);for(let t of Object.values(e.characteristics))t.gearmodifier=0}getSkillModifier(e,t){let a=[],s=["FP","step","QL","TPM","FW"];for(let i of s){let n=i=="step"?"":i;a.push(...this.system.skillModifiers[i].filter(r=>r.target==e).map(r=>({name:r.source,value:r.value,source:r.item,type:n}))),this.system.skillModifiers[t]&&a.push(...this.system.skillModifiers[t][i].map(r=>({name:r.target||r.source,value:r.value,source:r.source,type:n})))}return a}getCombatEffectSkillModifier(e,t){let a=[],s=["step",t];for(let i of s)a.push(...this.system.skillModifiers.combat[i].filter(n=>n.target==e).map(n=>({name:`${n.target||n.source} - ${game.i18n.localize(`CHAR.${i.toUpperCase()}`)}`,value:n.value,source:n.source,type:i,selected:!0})));return a}prepareSheet(e){let t={system:{characteristics:{}}};if(we(t,this.prepareItems(e)),t.canAdvance){let a=["wounds","astralenergy","karmaenergy"],s=this.system.isFamiliar||this.system.isPet,i=s?"C":"D";for(let n of a)we(t.system,{status:{[n]:{cost:game.i18n.format("advancementCost",{cost:g._calculateAdvCost(this.system.status[n].advances,"D")}),refund:game.i18n.format("refundCost",{cost:g._calculateAdvCost(this.system.status[n].advances,"D",0)})}}});i=s?"C":"E";for(let[n,r]of Object.entries(this.system.characteristics))t.system.characteristics[n]={cost:game.i18n.format("advancementCost",{cost:g._calculateAdvCost(r.initial+r.advances,i)}),refund:game.i18n.format("refundCost",{cost:g._calculateAdvCost(r.initial+r.advances,i,0)})}}return t}static canAdvance(e){return e.canAdvance}static armorOpposedTransformation(e,t,a){if(a.origin){let s=U(a.origin,"system.combatskill.value");t=t.map(i=>{let n=we(Ke(a),{armor:Ke(i)});if(s){s+=" ";for(let r of n.armor.effects)if(Me.realyRealyEnabled(r)){for(let l of r.changes)if(l.key=="self.armorVulnerability"){let c=l.value.split(/[,;]/),m;if(a.defenderTest.attackFromBehind&&(m=c.find(d=>d.trim().startsWith("attackFromBehind "))),m||(m=c.find(d=>d.trim().startsWith(s))),m){let d=Number(m.match(/[-+]?\d+/)[0])||0;for(let p of["head","rightleg","leftleg","rightarm","leftarm","value"])n.armor.system.protection[p]&&(n.armor.system.protection[p]=Math.max(0,n.armor.system.protection[p]+d))}else if(m=c.find(d=>d.trim().startsWith("randomArmor ")),m){let d=m.split(" ")[1].split("|"),p=d[Math.floor(Math.random()*d.length)];for(let f of["head","rightleg","leftleg","rightarm","leftarm","value"])n.armor.system.protection[f]&&(n.armor.system.protection[f]=p)}}}}return Z.applyRollTransformation(e,n,pe.EVENTS.ARMOR_TRANSFORMATION).options.armor})}return t}static armorValue(e,t={}){let a=this.armorOpposedTransformation(e,e.items.filter(n=>n.type=="armor"&&n.system.worn.value==!0),t),s=a.reduce((n,r)=>n+W.armorWearModifier(r,r.system.protection.value),0),i=e.items.reduce((n,r)=>n+(r.type=="trait"&&r.system.traitType.value=="armor"?Number(r.system.at.value):0),0);return{wornArmor:a,armor:s+i+(e.system.totalArmor||0)}}static _calculateCombatSkillValues(e,t,{step:a,parry:s,attack:i}={step:0,parry:0,attack:0}){let n=e.system.talentValue.value+a;if(e.system.weapontype.value=="melee"){let r=e.system.guidevalue.value.split("/").map(m=>Number(t.characteristics[m].initial)+Number(t.characteristics[m].modifier)+Number(t.characteristics[m].advances)+Number(t.characteristics[m].gearmodifier)),l=Math.max(...r),c=t.characteristics.mu.initial+t.characteristics.mu.modifier+t.characteristics.mu.advances+t.characteristics.mu.gearmodifier;e.system.parry.value=Math.ceil(n/2)+Math.max(0,Math.floor((l-8)/3))+Number(game.settings.get("dsa5","higherDefense"))+s,e.system.attack.value=n+Math.max(0,Math.floor((c-8)/3))+i}else{let r=t.characteristics.ff.initial+t.characteristics.ff.modifier+t.characteristics.ff.advances+t.characteristics.ff.gearmodifier;e.system.parry.value=0,e.system.attack.value=n+Math.max(0,Math.floor((r-8)/3))+i}return e.cost=game.i18n.format("advancementCost",{cost:g._calculateAdvCost(e.system.talentValue.value,e.system.StF.value)}),e}drawAuras(e=!1){for(let t of this.getActiveTokens())t.drawAuras(e)}_onCreateDescendantDocuments(...e){super._onCreateDescendantDocuments(...e),this.drawAuras()}_onUpdateDescendantDocuments(...e){super._onUpdateDescendantDocuments(...e);let t=e[1]=="effects"&&e[3].some(a=>["flags.dsa5.auraRadius","flags.dsa5.borderColor","flags.dsa5.disposition","flags.dsa5.fillColor","flags.dsa5.borderThickness"].some(s=>zr(a,s)));this.drawAuras(t)}_onDeleteDescendantDocuments(...e){super._onCreateDescendantDocuments(...e),this.drawAuras()}_perpareItemAdvancementCost(e){let t=this.system.isPet||this.system.isFamiliar?"C":e.system.StF.value;return e.cost=game.i18n.format("advancementCost",{cost:g._calculateAdvCost(e.system.talentValue.value,t)}),e.refund=game.i18n.format("refundCost",{cost:g._calculateAdvCost(e.system.talentValue.value,t,0)}),e}async modifyTokenAttribute(e,t,a=!1,s=!0){let i=foundry.utils.getProperty(this.system,e),n;return s?(a&&(t=Math.clamp(i.min||0,Number(i.value)+t,i.max)),n={[`system.${e}.value`]:t}):(a&&(t=Number(i)+t),n={[`system.${e}`]:t}),Hooks.call("modifyTokenAttribute",{attribute:e,value:t,isDelta:a,isBar:s},n)!==!1?this.update(n):this}schipshtml(){let e=[];for(let t=1;t<=Number(this.system.status.fatePoints.max);t++)e.push({value:t,cssClass:t<=Number(this.system.status.fatePoints.value)?"fullSchip":"emptySchip"});return e}prepareItems(e){let t=this.toObject(!1),a=[],s=[],i=[],n=[],r=[],l=[],c=[],m=[],d=[],p=[],f=Object.fromEntries(Object.keys(b.specialAbilityCategories).map(w=>[w,[]])),h=Object.fromEntries(Object.keys(b.traitCategories).map(w=>[w,[]])),y=[],k=[],D=[],v=[],I={hasSpells:this.system.isMage,hasPrayers:this.system.isPriest,liturgy:[],spell:[],ritual:[],ceremony:[],blessing:[],magictrick:[],magicalsign:[]},A={spell:{},ritual:{},ceremony:{},liturgy:{}},j=this.hasPlayerOwner?N.getGroupSchips():[],S=this.schipshtml(),M={meleeweapons:{items:[],show:!1,dataType:"meleeweapon"},rangeweapons:{items:[],show:!1,dataType:"rangeweapon"},armor:{items:[],show:!1,dataType:"armor"},ammunition:{items:[],show:!1,dataType:"ammunition"},plant:{items:[],show:!1,dataType:"plant"},poison:{items:[],show:!1,dataType:"poison"},book:{items:[],show:!1,dataType:"book"}};for(let w in b.equipmentTypes)M[w]={items:[],show:!1,dataType:w};M.misc.show=!0;let T={coins:[],total:0,show:!0};t.items=t.items.sort((w,G)=>w.name.localeCompare(G.name));let L=t.system.totalArmor||0,q={body:[],social:[],knowledge:[],trade:[],nature:[]},ve=new Map;for(let w of t.items.filter(G=>G.type=="equipment"&&G.system.equipmentType.value=="bags"))ve.set(w._id,[]);let Te=new Map,qe=[],St=!1,lt=t.items.some(w=>!["skill","combatskill","money"].includes(w.type)),ct=H.getHorse(this,!0);for(let w of t.items)try{let G=U(w,"system.parent_id");if(w.type=="ammunition"&&qe.push(o._prepareitemStructure(w)),G&&G!=w._id&&ve.has(G)){ve.get(G).push(w);continue}switch(e.details&&e.details.includes(w._id)&&(w.detailed="shown"),w.system.isArtifact&&(w.volume=b.traditionArtifacts[w.system.artifact]||0,w.volumeFinal=0,v.push(w)),w.type){case"skill":q[w.system.group.value].push(this._perpareItemAdvancementCost(w));break;case"information":m.push(w);break;case"aggregatedTest":n.push(w);break;case"spellextension":A[w.system.category][w.system.source]?A[w.system.category][w.system.source].push(w.name):A[w.system.category][w.system.source]=[w.name];break;case"ritual":case"spell":case"liturgy":case"ceremony":I[w.type].push(o.buildSpellChargeProgress(this._perpareItemAdvancementCost(w)));break;case"magicalsign":case"magictrick":case"blessing":I[w.type].push(w);break;case"trait":switch(w.system.traitType.value){case"rangeAttack":w=o._prepareRangeTrait(w,this.system);break;case"meleeAttack":w=o._prepareMeleetrait(w,this.system);break;case"armor":L+=Number(w.system.at.value);break}h[w.system.traitType.value].push(w),St=!0;break;case"combatskill":a.push(o._calculateCombatSkillValues(w,this.system));break;case"ammunition":M.ammunition.items.push(o.prepareMag(w)),M.ammunition.show=!0;break;case"meleeweapon":w.toggleValue=w.system.worn.value||!1,w.toggle=!0,this._setOnUseEffect(w),M.meleeweapons.items.push(o._prepareitemStructure(w)),M.meleeweapons.show=!0,w.toggleValue&&c.push(w);break;case"rangeweapon":w.toggleValue=w.system.worn.value||!1,w.toggle=!0,this._setOnUseEffect(w),M.rangeweapons.items.push(o._prepareitemStructure(w)),M.rangeweapons.show=!0;break;case"armor":if(w.toggleValue=w.system.worn.value||!1,M.armor.items.push(o._prepareitemStructure(w)),M.armor.show=!0,w.toggle=!0,this._setOnUseEffect(w),w.system.worn.value){for(let De in w.system.protection){let dt=w.system.protection[De];w.system.protection[De]=W.armorWearModifier(w,dt)}L+=Number(w.system.protection.value),y.push(w)}break;case"book":case"poison":case"plant":M[w.type].items.push(w),M[w.type].show=!0;break;case"consumable":M[w.system.equipmentType.value].items.push(o._prepareConsumable(w)),M[w.system.equipmentType.value].show=!0;break;case"equipment":w.toggle=U(w,"system.worn.wearable")||!1,w.toggle&&(w.toggleValue=w.system.worn.value||!1),this._setOnUseEffect(w),M[w.system.equipmentType.value].items.push(o._prepareitemStructure(w)),M[w.system.equipmentType.value].show=!0;break;case"money":T.coins.push(w),T.total+=w.system.quantity.value*w.system.price.value;break;case"advantage":this._setOnUseEffect(w),s.push(w);break;case"disadvantage":this._setOnUseEffect(w),i.push(w);break;case"specialability":this._setOnUseEffect(w),this._setAEPayments(w),f[w.system.category.value].push(w);break;case"disease":r.push(w);break;case"patron":f.magical.push(w);break;case"demonmark":l.push(w);break;case"essence":d.push(w);break;case"imprint":p.push(w);break;case"application":Te.has(w.system.skill)?Te.get(w.system.skill).push(w):Te.set(w.system.skill,[w]);break}}catch(G){this._itemPreparationError(w,G)}for(let w of M.bags.items)this._setBagContent(w,ve);for(let[w,G]of Object.entries(A))for(let[De,dt]of Object.entries(G)){let mn=I[w].find(er=>er.name==De);mn?mn.extensions=dt.join(", "):ui.notifications.warn(game.i18n.format("DSAError.noSpellForExtension",{name:De,category:g.categoryLocalization(w),extension:dt.join(",")}))}for(let w of M.rangeweapons.items)try{w.system.worn.value&&k.push(o._prepareRangeWeapon(w,qe,a,this))}catch(G){this._itemPreparationError(w,G)}for(let w of c)try{D.push(o._prepareMeleeWeapon(w,a,t,c.filter(G=>G._id!=w._id&&!N.isYieldedTwohanded(G))))}catch(G){this._itemPreparationError(w,G)}for(let w of Object.values(q))for(let G of w)G.applications=Te.get(G.name)||[];T.coins=T.coins.sort((w,G)=>w.system.price.value>G.system.price.value?-1:1),f.magical.push(...f.pact),f.clerical.push(...f.ceremonial);for(let w of f.staff){let G=v.find(De=>De.system.artifact==w.system.artifact);if(G){G.abilities==null&&(G.abilities=[]),G.abilities.push(w);let De=Number(w.system.volume)||0,dt=De>0?"volumeFinal":"volume";G[dt]+=Math.abs(De)*Number(w.system.step.value)}else f.magical.push(w)}let Zt=Ke(b.characteristics);Zt["-"]="-";let At=a.find(w=>w.name==game.i18n.localize("LocalizedIDs.wrestle"));return{totalWeight:parseFloat(this.system.totalWeight?.toFixed(3)),traditionArtifacts:v,armorSum:L,sortedSpecs:b.sortedSpecs,spellArmor:t.system.spellArmor||0,liturgyArmor:t.system.liturgyArmor||0,money:T,brawling:{attack:At?.system.attack.value||0,parry:At?.system.parry.value||0},encumbrance:this.system.condition?.encumbered||0,carrycapacity:this.system.carrycapacity,isSwarm:this.isSwarm(),canSwarm:!this.prototypeToken.actorLink,wornRangedWeapons:k,wornMeleeWeapons:D,moneyWeight:this.system.moneyWeight,horseActor:ct,advantages:s,hasAnyItem:lt,disadvantages:i,specAbs:f,information:m,aggregatedtests:n,wornArmor:y,essence:d,imprint:p,inventory:M,hasTrait:St,demonmarks:l,diseases:r,canBuild:game.dsa5.sheets.DSACharBuilder&&!t.system.details.species?.value,itemModifiers:this.system.itemModifiers,languagePoints:t.system.freeLanguagePoints?.value?`(${t.system.freeLanguagePoints?.used}/${t.system.freeLanguagePoints?.value})`:"",schips:S,groupschips:j,guidevalues:Zt,magic:I,traits:h,combatskills:a,canAdvance:this.canAdvance,sheetLocked:t.system.sheetLocked.value,bodyAttrs:["ff","ge","ko","kk"],mentalAttrs:["mu","kl","in","ch"],allSkillsLeft:{body:q.body,social:q.social,nature:q.nature},allSkillsRight:{knowledge:q.knowledge,trade:q.trade}}}isSwarm(){return this.system.swarm.count>1&&!this.prototypeToken.actorLink}getArmorEncumbrance(e,t){let a=t.reduce((i,n)=>(n.system.calculatedEncumbrance=Number(n.system.encumbrance.value)+W.armorEncumbranceModifier(n),n.system.damageToolTip=W.damageTooltip(n),i+=n.system.calculatedEncumbrance),0),s=H.isRiding(this)?-1:0;return Math.max(0,a-F.abilityStep(e,game.i18n.localize("LocalizedIDs.inuredToEncumbrance"))+s)}_calcBagweight(e,t,a=!0){let s=0;if(t.has(e._id)){let i=0;!e.system.worn.value&&a&&(s-=e.system.preparedWeight);for(let n of t.get(e._id))n.system.preparedWeight=Number(parseFloat((n.system.weight.value*n.system.quantity.value).toFixed(3))),t.has(n._id)?i+=this._calcBagweight(n,t,!1):i+=n.system.preparedWeight;a?e.system.worn.value&&(s+=i):s+=i+e.system.preparedWeight,e.system.bagweight=`${i.toFixed(3)}/${e.system.capacity}`}return s}_setBagContent(e,t){if(t.has(e._id)){e.children=[];for(let a of t.get(e._id))e.children.push(o._prepareitemStructure(o._prepareConsumable(a))),t.has(a._id)&&this._setBagContent(a,t)}}isMerchant(){return["merchant","loot"].includes(U(this,"system.merchant.merchantType"))}_itemPreparationError(e,t){console.error("Something went wrong with preparing item "+e.name+": "+t),console.warn(t),console.warn(e),ui.notifications.error("Something went wrong with preparing item "+e.name+": "+t)}_applyModiferTransformations(e){this.system.itemModifiers={};for(let t of Object.keys(e)){let a=game.dsa5.config.knownShortcuts[t.toLowerCase()];if(a){let s=e[t].reduce((i,n)=>i=i+n.value,0);this.system[a[0]][a[1]][a[2]]+=s,this.system.itemModifiers[t]={value:s,sources:e[t].map(i=>i.source)}}}}_buildGearAndAbilityModifiers(e,t){let a=U(t,"system.effect.value");if(a)for(let s of`${a}`.split(/,|;/).map(i=>i.trim())){let i=s.replace(/(\s+)/g," ").trim().split(" ");if(i.length==2&&!isNaN(i[0])){let n={value:Number(i[0])*(t.system.step&&Number(t.system.step.value)||1),source:t.name,type:t.type};e[i[1]]==null?e[i[1]]=[n]:e[i[1]].push(n)}}}async _updateAPs(e,t={},a={}){if(o.canAdvance(this))if(!isNaN(e)&&e!=null){let s=Number(e);t["system.details.experience.spent"]=Number(this.system.details.experience.spent)+s,await this.update(t,a);let i=game.i18n.format(s>0?"advancementCost":"refundCost",{cost:Math.abs(s)});ge(i)}else ui.notifications.error("DSAError.APUpdateError",{localize:!0})}async checkEnoughXP(e){if(!o.canAdvance(this)||isNaN(e)||e==null||Number(this.system.details.experience.total)-Number(this.system.details.experience.spent)>=e)return!0;if(Number(this.system.details.experience.total)==0){let t=await renderTemplate("systems/dsa5/templates/dialog/parts/expChoices.html",{entries:b.startXP}),a=0,s=!1;try{[s,a]=await foundry.applications.api.DialogV2.wait({window:{title:"DSAError.NotEnoughXP"},content:t,buttons:[{action:"yes",icon:"fa fa-check",label:"yes",default:!0,callback:u((i,n,r)=>[!0,Number(n.form.elements.APsel.value)],"callback")},{action:"cancel",icon:"fas fa-times",label:"cancel",callback:u(()=>[!1,0],"callback")}]})}catch{}if(s)return await this.update({"system.details.experience.total":a}),!0}return ui.notifications.error("DSAError.NotEnoughXP",{localize:!0}),!1}setupWeapon(e,t,a,s){return a.mode=t,C.getSubClass(e.type).setupDialog(null,a,e,this,s)}throwMelee(e,t){let a=game.i18n.localize("LocalizedIDs.Throwing Weapons"),s=game.i18n.localize(`LocalizedCTs.${e.system.combatskill.value}`),i=["Daggers","Fencing Weapons","Impact Weapons","Swords","Polearms"].includes(s)&&F.hasAbility(this,game.i18n.localize("LocalizedIDs.weaponThrow")),n=e.name+" ("+a+")",r=new C({name:n,type:"rangeweapon",system:{combatskill:{value:a},reach:{value:b.meleeAsRangeReach[s]},effect:{attributes:e.system.effect.attributes},damage:{value:e.system.damage.value},quantity:{value:1}}}),l={situationalModifiers:[{name:n,value:i?-4:-8,selected:!0}]};this.setupWeapon(r,"attack",l,t).then(async c=>{i||(c.testData.source.dmgMultipliers||=[],c.testData.source.dmgMultipliers.push({name:"LocalizedIDs.Throwing Weapons",val:"0.5"})),await this.basicTest(c)})}setupWeaponless(e,t={},a){let s=[];F.hasAbility(this,game.i18n.localize("LocalizedIDs.mightyAstralBody"))&&s.push(game.i18n.localize("magical")),F.hasAbility(this,game.i18n.localize("LocalizedIDs.mightyKarmalBody"))&&s.push(game.i18n.localize("blessed"));let i=b.defaultWeapon({name:game.i18n.localize(`${e}Weaponless`),system:{combatskill:{value:game.i18n.localize("LocalizedIDs.wrestle")},effect:{attributes:s.join(", ")}}});return t.mode=e,C.getSubClass(i.type).setupDialog(null,t,i,this,a)}setupSpell(e,t={},a){return this.setupSkill(e,t,a)}setupSkill(e,t={},a){return C.getSubClass(e.type).setupDialog(null,t,e,this,a)}tokenScrollingText(e){let t=this.isToken?[this.token?.object]:this.getActiveTokens(!0);for(let a of t){if(!a)continue;let s=0;for(let i of e)canvas.interface.createScrollingText(a.center,i.value,{anchor:s,direction:i.value>0?2:1,fontSize:game.settings.get("dsa5","scrollingFontsize"),stroke:i.stroke,strokeThickness:1,jitter:.25,duration:1e3}),s+=1}}_containsChangedAttribute(e,t){let a=U(e,t);return[null,void 0].includes(a)||a===U(this,t)?!1:a}async _preUpdate(e,t,a){let s={wounds:9109504,astralenergy:723929,karmaenergy:303670};game.combat?.isBrawling&&(s.temporaryLeP=16525967);let i=[];for(let l of Object.keys(s)){let c=this._containsChangedAttribute(e,`system.status.${l}.value`);c!==!1&&i.push({value:c-this.system.status[l].value,stroke:s[l]})}i.length&&this.tokenScrollingText(i);let n=this._containsChangedAttribute(e,"system.swarm.count");if(n!==!1&&!t.skipSwarmUpdate){let l=U(e,"system.status.wounds.value")||this.system.status.wounds.value,c=n-(this.system.swarm.count||1),m=this.system.swarm.maxwounds||this.system.status.wounds.max;Nr(e,"system.status.wounds.value",Math.max(0,l+c*m))}let r=this._containsChangedAttribute(e,"system.details.experience.total");if(r!==!1){let l=this.system.details.experience.total;_.track(this,{type:"sum",previous:l,next:r},r-l)}return super._preUpdate(e,t,a)}async applyDamage(e,t={}){let a=await new Roll(`${e}`).evaluate(),s=a.total;if(game.combat?.isBrawling){let i=Math.min(this.system.status.temporaryLeP.max,this.system.status.temporaryLeP.value-s);await this.update({"system.status.temporaryLeP.value":i})}else{let i=Math.min(this.system.status.wounds.max,this.system.status.wounds.value-s);await this.update({"system.status.wounds.value":i})}if(t.msg){let i=await a.render();ChatMessage.create(g.chatDataSetup(`

${game.i18n.format(t.msg,{name:this.name})}

${i}`))}}async applyRegeneration(e,t,a){let s={"system.status.wounds.value":Math.min(this.system.status.wounds.max,this.system.status.wounds.value+(e||0)),"system.status.karmaenergy.value":Math.min(this.system.status.karmaenergy.max,this.system.status.karmaenergy.value+(a||0)),"system.status.astralenergy.value":Math.min(this.system.status.astralenergy.max,this.system.status.astralenergy.value+(t||0))};await this.update(s)}async applyMana(e,t){let a=t=="AsP"?"astralenergy":"karmaenergy",s=(await new Roll(`${e}`).evaluate()).total,i=Math.min(this.system.status[a].max,this.system.status[a].value-s);return i>=0?(await this.update({[`system.status.${a}.value`]:i}),!0):(ui.notifications.error(`DSAError.NotEnough${t}`,{localize:!0}),!1)}preparePostRollAction(e){let t=e.flags.data,a={flags:{img:e.flags.img},rollMode:t.rollMode,speaker:e.speaker,template:t.template,title:t.title,user:e.author};return t.attackerMessage&&(a.attackerMessage=t.attackerMessage),t.defenderMessage&&(a.defenderMessage=t.defenderMessage),t.unopposedStartMessage&&(a.unopposedStartMessage=t.unopposedStartMessage),a}resetTargetAndMessage(e,t){e.originalTargets?.size&&(game.user.targets=e.originalTargets,game.user.targets.user=game.user),!e.defenderMessage&&e.startMessagesList&&(t.startMessagesList=e.startMessagesList)}async fatererollDamage(e,t,a,s,i,n){t.fatePointDamageRerollUsed=!0,this.resetTargetAndMessage(i,t);let r=i.postData.damageRoll,l=await R.manualRolls(await new Roll(r.formula||r._formula).evaluate(),"CHATCONTEXT.rerollDamage");for(let c=0;c${game.i18n.localize("CHATFATE.fatepointUsed")} - ${game.i18n.format("CHATFATE.isTalented",{character:""+this.name+""})}
`;let n=await renderTemplate("systems/dsa5/templates/dialog/isTalentedReroll-dialog.html",{testData:a,postData:i.postData});new ae({title:game.i18n.localize("CHATFATE.selectDice"),content:n,buttons:{Yes:{icon:'',label:game.i18n.localize("Ok"),callback:u(async r=>{let l=r.find(".dieSelected").map(function(){return Number($(this).attr("data-index"))}).get();if(l.length>0){let c=[];for(let p of l){let f=a.roll.terms[p*2];c.push(f.number+"d"+f.faces+"["+f.options.colorset+"]")}c=await R.manualRolls(await new Roll(c.join("+")).evaluate(),"CHATCONTEXT.talentedReroll"),await R.showDiceSoNice(c,a.rollMode);let m=0,d=[];for(let p of l){let f=a.source.system[`characteristic${p+1}`],h=f?game.i18n.localize(`CHARAbbrev.${f.value.toUpperCase()}`)+" - ":"";d.push(`${h}${a.roll.terms[p*2].results[0].result}/${c.terms[m*2].results[0].result}`),a.roll.terms[p*2].results[0].result=Math.min(c.terms[m*2].results[0].result,a.roll.terms[p*2].results[0].result),m+=1}e+=`${game.i18n.localize("Roll")}: ${d.join(", ")}`,ChatMessage.create(g.chatDataSetup(e)),this[`${i.postData.postFunction}`]({testData:a,cardOptions:t},{rerenderMessage:s}),await s.update({"flags.data.talentedRerollUsed":!0})}},"callback")},cancel:{icon:'',label:game.i18n.localize("cancel")}},default:"Yes"}).render(!0)}async fatereroll(e,t,a,s,i,n){t.fatePointDamageRerollUsed=!0,this.resetTargetAndMessage(i,t);let r=await renderTemplate("systems/dsa5/templates/dialog/fateReroll-dialog.html",{testData:a,postData:i.postData,singleDie:i.postData.characteristics.length==1});new ae({title:game.i18n.localize("CHATFATE.selectDice"),content:r,buttons:{Yes:{icon:'',label:game.i18n.localize("Ok"),callback:u(async l=>{let c=l.find(".dieSelected").map(function(){return Number($(this).attr("data-index"))}).get();if(c.length>0){let m=[];for(let k of c){let D=a.roll.terms[k*2];m.push(D.number+"d"+D.faces+"["+D.options.colorset+"]")}m=await R.manualRolls(await new Roll(m.join("+")).evaluate(),"CHATCONTEXT.Reroll"),await R.showDiceSoNice(m,a.rollMode);let d=0,p=[],f=g.getSpeaker(a.extra.speaker),h=game.i18n.localize("LocalizedIDs.traditionPhex"),y=f.items.some(k=>k.type=="specialability"&&k.name==h);for(let k of c){let D=a.source.system[`characteristic${k+1}`],v=D?`${game.i18n.localize(`CHARAbbrev.${D.value.toUpperCase()}`)} - `:"";p.push(`${v}${a.roll.terms[k*2].results[0].result}/${m.terms[d*2].results[0].result}`),y?a.roll.terms[k*2].results[0].result=Math.min(m.terms[d*2].results[0].result,a.roll.terms[k*2].results[0].result):a.roll.terms[k*2].results[0].result=m.terms[d*2].results[0].result,d+=1}e+=`
${game.i18n.localize("Roll")}: ${p.join(", ")}`,ChatMessage.create(g.chatDataSetup(e)),a.fateUsed=!0,this[`${i.postData.postFunction}`]({testData:a,cardOptions:t},{rerenderMessage:s}),await s.update({"flags.data.fatePointRerollUsed":!0}),await this.reduceSchips(n)}},"callback")},cancel:{icon:'',label:game.i18n.localize("cancel")}},default:"Yes"}).render(!0)}async fateaddQS(e,t,a,s,i,n){ChatMessage.create(g.chatDataSetup(e)),game.user.targets.forEach(r=>r.setTarget(!1,{user:game.user,releaseOthers:!1,groupSelection:!0})),t.fatePointAddQSUsed=!0,a.qualityStep=1,this[`${i.postData.postFunction}`]({testData:a,cardOptions:t},{rerenderMessage:s}),await s.update({"flags.data.fatePointAddQSUsed":!0}),await this.reduceSchips(n)}async fateImprove(e,t,a,s,i,n){ChatMessage.create(g.chatDataSetup(e)),this.resetTargetAndMessage(i,t);let r=s.flags.data.preData.source.type;if(["spell","liturgy","ceremony","ritual","skill"].includes(r)){let l=await renderTemplate("systems/dsa5/templates/dialog/fateImprove-dialog.html",{testData:a,postData:i.postData});new ae({title:game.i18n.localize("CHATFATE.selectDice"),content:l,buttons:{Yes:{icon:'',label:game.i18n.localize("Ok"),callback:u(async c=>{let m=[0,0,0],d=c.find(".dieSelected").map(function(){return Number($(this).attr("data-index"))}).get();if(d.length==1){m[d]=2;let p={name:game.i18n.localize("CHATCONTEXT.improveFate"),value:m.join("|"),type:"roll"};a.roll.terms[d*2].results[0].result=Math.max(1,a.roll.terms[d*2].results[0].result-2),a.situationalModifiers.push(p),this[`${i.postData.postFunction}`]({testData:a,cardOptions:t},{rerenderMessage:s}),await s.update({"flags.data.fateImproved":!0}),await this.reduceSchips(n)}},"callback")},cancel:{icon:'',label:game.i18n.localize("cancel")}},default:"Yes"}).render(!0)}else{let l={name:game.i18n.localize("CHATCONTEXT.improveFate"),value:2,type:"roll"};a.situationalModifiers.push(l),a.roll.terms[0].results[0].result=Math.max(1,a.roll.terms[0].results[0].result-2),this[`${i.postData.postFunction}`]({testData:a,cardOptions:t},{rerenderMessage:s}),await s.update({"flags.data.fateImproved":!0}),await this.reduceSchips(n)}}async reduceSchips(e){e==0?await this.update({"system.status.fatePoints.value":this.system.status.fatePoints.value-1}):await o.reduceGroupSchip()}static async reduceGroupSchip(){if(game.user.isGM){let e=game.settings.get("dsa5","groupschips").split("/").map(t=>Number(t));e[0]=e[0]-1,await game.settings.set("dsa5","groupschips",e.join("/"))}else game.socket.emit("system.dsa5",{type:"reduceGroupSchip",payload:{}})}async useFateOnRoll(e,t,a){if(t=="isTalented"||g.fateAvailable(this,a==1)){let s=e.flags.data,i=this.preparePostRollAction(e),n,r;a==0?(n=this.system.status.fatePoints.value-1,r="PointsRemaining"):(n=game.settings.get("dsa5","groupschips").split("/")[0],r="GroupPointsRemaining");let l=`

${game.i18n.localize("CHATFATE.fatepointUsed")}

+`)}await this.calculateEnergyCost(t,e,o),await this.getDuplicatusRoll(e,o);for(let a of["minorFairies","minorSpirits"]){let s=game.i18n.localize("CONDITION."+a);P.hasVantage(o.extra.actor,s)&&!o.extra.actor.effects.find(i=>i.name==s)&&(await new Roll("1d20").evaluate()).total<=e.preData.calculatedSpellModifiers.finalcost&&(e.description+=", "+game.i18n.format("minorghostsappear",{creature:s}),g.getSpeaker(o.extra.speaker).addCondition(a))}return e}static async _rollThreeD20(o){let e=o.roll?o.roll instanceof Roll?o.roll:Roll.fromData(o.roll):await new Roll("1d20+1d20+1d20").evaluate(),t=[],a=0;this._appendSituationalModifiers(o,game.i18n.localize("Difficulty"),o.testDifficulty);let s=await this._situationalModifiers(o),i=Number(o.source.system.talentValue.value)+o.advancedModifiers.fws+await this._situationalModifiers(o,"FW"),n=this._situationalPartCheckModifiers(o,"TPM"),r=[1,2,3].map(f=>o.extra.actor.system.characteristics[o.source.system[`characteristic${f}`].value].value+s+o.advancedModifiers.chars[f-1]+n[f-1]),l=[0,1,2].map(f=>e.terms[f*2].results[0].result-r[f]);if(o.routine)i=Math.round(i/2);else for(let f of l)f>0&&(i-=f);let c=o.extra.actor.system.skillModifiers.crit,m=o.extra.actor.system.skillModifiers.botch;if(["spell","ritual"].includes(o.source.type)&&P.hasVantage(o.extra.actor,game.i18n.localize("LocalizedIDs.wildMagic"))&&(m=19),o.source.type=="skill"&&P.hasVantage(o.extra.actor,`${game.i18n.localize("LocalizedIDs.incompetent")} (${o.source.name})`)){let f=await new Roll("1d20").evaluate(),h=l.reduce((k,C,v,I)=>C0&&(i+=await this._situationalModifiers(o,"FP"),p=Math.max(1,(i==0?1:i>0?Math.ceil(i/3):0)+(o.qualityStep!=null?Number(o.qualityStep):0))+(o.advancedModifiers.qls||0)+await this._situationalModifiers(o,"QL")),p=Math.min(game.settings.get("dsa5","capQSat"),p),p({char:o.source.system[`characteristic${f+1}`].value,res:e.terms[f*2].results[0].result,suc:l[f]<=0,tar:r[f]})),qualityStep:p,description:t,preData:o,successLevel:a,modifiers:s,extra:{}}}static async rollTalent(o){let e=await this._rollThreeD20(o);return e.rollType="talent",e}static get3D20SuccessLevel(o,e,t=20,a=1){let s=o.terms.filter(n=>n.results&&n.results[0].result<=a).length,i=o.terms.filter(n=>n.results&&n.results[0].result>=t).length;return s>=2?s:i>=2?i*-1:e>=0?1:-1}static getSuccessDescription(o){return game.i18n.localize(["AstoundingFailure","CriticalFailure","Failure","","Success","CriticalSuccess","AstoundingSuccess"][o+3])}static async rollItem(o){let e=o.roll||await new Roll("1d20+1d20+1d20").evaluate(),t=[],a=await this._situationalModifiers(o),s=Number(o.source.system.step.value),i=[1,2,3].map(m=>10+Number(o.source.system.step.value)+a),n=[0,1,2].map(m=>e.terms[m*2].results[0].result-i[m]);for(let m of n)m>0&&(s-=m);let l=_DiceDSA5.get3D20SuccessLevel(e,s,20);t.push(_DiceDSA5.getSuccessDescription(l)),t=t.join(", ");let c={result:s,characteristics:[0,1,2].map(m=>({char:o.source.type,res:e.terms[m*2].results[0].result,suc:n[m]<=0,tar:i[m]})),qualityStep:Math.min(game.settings.get("dsa5","capQSat"),(s==0?1:s>0?Math.ceil(s/3):0)+(o.qualityStep!=null?Number(o.qualityStep):0)),description:t,preData:o,successLevel:l,modifiers:a,extra:{}};switch(o.source.type){case"poison":let m=o.source.system.duration.value.split(" / ").map(h=>h.trim()),d=o.source.system.effect.value.split(" / ").map(h=>h.trim());c.duration=m.length>1?c.successLevel>0?m[0]:m[1]:m[0],c.effect=d.length>1?c.successLevel>0?d[0]:d[1]:d[0];break;case"disease":let p=o.source.system.damage.value.split(" / ").map(h=>h.trim()),f=o.source.system.duration.value.split(" / ").map(h=>h.trim());c.damageeffect=p.length>1?c.successLevel>0?p[0]:p[1]:p[0],c.duration=f.length>1?c.successLevel>0?f[0]:f[1]:f[0];break}return c}static async updateDefenseCount(o){game.combat&&!o.fateUsed&&await game.combat.updateDefenseCount(o.extra.speaker)}static _compareWeaponReach(o,e){let t=e.situationalModifiers.find(i=>i.name==game.i18n.localize("LocalizedIDs.circumvent")),a=b.meleeRangesArray.indexOf(o.system.reach.value),s=b.meleeRangesArray.indexOf(e.opposingWeaponSize);return t&&s>a&&(t.value=Math.min(t.step,s-a)*2),Math.min(0,a-s)*2}static async showDiceSoNice(o,e){if(g.moduleEnabled("dice-so-nice")&&game.dice3d){let t=null,a=!1;switch(e){case"blindroll":a=!0,t=game.users.filter(i=>i.isGM).map(i=>i.id);break;case"gmroll":t=game.users.filter(i=>i.isGM).map(i=>i.id);break;case"selfroll":t=[];break}let s=game.dice3d.showForRoll(o,game.user,!0,t,a);game.settings.get("dice-so-nice","immediatelyDisplayChatMessages")||await s}}static addApplyEffectData(o){let e=o.preData.source;if(o.successLevel>0){if(["meleeweapon","rangeweapon"].includes(e.type)||e.type=="trait"&&["rangeAttack","meleeAttack"].includes(e.system.traitType.value)){if(e.effects.some(a=>!$e(a,"flags.dsa5.applyToOwner")))return!0}else if(["spell","liturgy","ritual","ceremony","trait","skill"].includes(e.type)&&e.effects.length>0)return!0}if(["disease","poison"].includes(e.type)){let a=o.successLevel>0?1:2;return e.effects.filter(s=>$e(s,"flags.dsa5.successEffect")==a||!$e(s,"flags.dsa5.successEffect")).length>0}let t=o.preData.situationalModifiers.filter(a=>a.specAbId).map(a=>a.specAbId);if(t.length>0){let a=o.preData.extra.actor.items.filter(s=>t.includes(s._id));for(let s of a)if(s.effects.length>0)return!0}return!1}static async renderRollCard(chatOptions,testData,rerenderMessage){let applyEffect=this.addApplyEffectData(testData),immuneTo=x.checkImmunity(testData),preData=On(testData.preData),hideDamage=rerenderMessage?rerenderMessage.flags.data.hideDamage:preData.mode=="attack";await pe.postRoll({testData,preData}),Hooks.call("postProcessDSARoll",chatOptions,testData,rerenderMessage,hideDamage),await g.callAsyncHooks("postProcessDSARoll",[testData]),delete preData.extra.actor,delete testData.actor,delete testData.preData;let hasAreaTemplate=testData.successLevel>0&&preData.source.system.target&&preData.source.system.target.type in game.dsa5.config.areaTargetTypes,chatData={title:chatOptions.title,immuneTo,testData,hideData:game.user.isGM,preData,hideDamage,modifierList:preData.situationalModifiers.filter(o=>o.value!=0),applyEffect,hasAreaTemplate,showDamageToGear:await W.showDamageToGear(preData,testData)};if(preData.advancedModifiers&&(preData.advancedModifiers.chars.some(o=>o!=0)&&chatData.modifierList.push({name:game.i18n.localize("MODS.partChecks"),value:preData.advancedModifiers.chars}),preData.advancedModifiers.fws!=0&&chatData.modifierList.push({name:game.i18n.localize("MODS.FW"),value:preData.advancedModifiers.fws}),preData.advancedModifiers.qls!=0&&chatData.modifierList.push({name:game.i18n.localize("MODS.QS"),value:preData.advancedModifiers.qls})),["gmroll","blindroll"].includes(chatOptions.rollMode)&&(chatOptions.whisper=game.users.filter(o=>o.isGM).map(o=>o.id)),chatOptions.rollMode==="blindroll"?chatOptions.blind=!0:chatOptions.rollMode==="selfroll"&&(chatOptions.whisper=[game.user.id]),K.playEffect(preData.mode,preData.source,testData.successLevel,chatOptions.whisper,chatOptions.blind),oe(chatOptions,{flags:{data:{preData,postData:testData,template:chatOptions.template,rollMode:chatOptions.rollMode,isOpposedTest:chatOptions.isOpposedTest,title:chatOptions.title,hideData:chatData.hideData,hideDamage:chatData.hideDamage,isDSARoll:!0}}}),rerenderMessage){let postFunction=$e(rerenderMessage,"flags.data.preData.extra.options.postFunction");postFunction&&(testData.messageId=rerenderMessage.id,await eval(postFunction.functionName)(postFunction,{result:testData,chatData},preData.source));let html=await renderTemplate(chatOptions.template,chatData),actor=ChatMessage.getSpeakerActor(rerenderMessage.speaker)||game.users.get(rerenderMessage.author)?.character,rollData=actor?actor.getRollData():{},enriched=await TextEditor.enrichHTML(html,{rollData,async:!0});chatOptions.content=enriched;let newMsg=await rerenderMessage.update({content:chatOptions.content,flags:{data:chatOptions.flags.data}});return ui.chat.updateMessage(newMsg),newMsg}else return chatOptions.content=await renderTemplate(chatOptions.template,chatData),await ChatMessage.create(chatOptions)}static async _itemRoll(o){let e=$(o.currentTarget),t=e.parents(".message").attr("data-message-id"),a=game.messages.get(t),s=a.speaker,i=e.attr("data-type"),n=e.attr("data-name"),r=g.getSpeaker(s);if(r){let l=r.items.find(c=>c.name==n&&c.type==i);if(l){let c=new D(l.toObject()),m=e.attr("data-removecharge")?e.attr("data-removecharge")=="true":!1;if(m&&c.system.quantity.value<1){ui.notifications.error("DSAError.NotEnoughCharges",{localize:!0});return}c.setupEffect().then(async d=>{await c.itemTest(d),m&&await l.update({"system.quantity.value":l.system.quantity.value-1})})}else ui.notifications.error(game.i18n.format("DSAError.notFound",{category:i,name:n}))}}static async _rollEdit(o){let e=$(o.currentTarget),t=e.parents(".message").attr("data-message-id"),a=game.messages.get(t),s=a.flags.data,i=s.preData;i.extra.actor=g.getSpeaker(i.extra.speaker)?.toObject(!1),i.extra.options.cheat&&delete i.extra.options.cheat;let n;switch(e.attr("data-edit-type")){case"roll":n=e.attr("data-edit-id");let l=Number(e.val());if(i.roll.terms.length>n*2){let m=Roll.fromData(i.roll);m.editRollAtIndex([{index:n,val:l}]),i.roll=m}else{let m=Roll.fromData(s.postData.damageRoll);n=n-i.roll.terms.filter(d=>d.results).length,m.editRollAtIndex([{index:n,val:l}]),i.damageRoll=m}break;case"mod":n=i.situationalModifiers.findIndex(m=>m.name==game.i18n.localize("chatEdit")),n>0&&i.situationalModifiers.splice(n,1);let c={name:game.i18n.localize("chatEdit"),value:Number(e.val())-await this._situationalModifiers(i)};i.situationalModifiers.push(c);break}s.postData.damageRoll&&!i.damageRoll&&(i.damageRoll=s.postData.damageRoll);let r={template:s.template,rollMode:s.rollMode,title:s.title,speaker:a.speaker,user:a.author.id};["gmroll","blindroll"].includes(r.rollMode)&&(r.whisper=game.users.filter(l=>l.isGM).map(l=>l.id)),r.rollMode==="blindroll"&&(r.blind=!0),["poison","disease"].includes(i.source.type)?new D(i.source)[`${s.postData.postFunction}`]({testData:i,cardOptions:r},{rerenderMessage:a}):g.getSpeaker(a.speaker)[`${s.postData.postFunction}`]({testData:i,cardOptions:r},{rerenderMessage:a})}static async gearDamaged(o){let e=o.currentTarget.dataset.uuid.split(";");if(e.length>1){let t=await Promise.all(e.map(a=>fromUuid(a)));zt.showDialog(t)}else W.breakingTest(await fromUuid(e[0]))}static showCurrentTargets(o){let e=[],t;if(o.currentTarget.dataset.target=="target"){t="TT.applyEffectTargets";for(let s of game.user.targets)e.push(s.document.texture.src)}else{t="TT.applyEffectCaster";let s=game.messages.get($(o.currentTarget).parents(".message").attr("data-message-id")),i=g.getSpeaker(s.flags.data.preData.extra.speaker);i&&e.push(i.token?i.token.texture.src:i.prototypeToken.texture.src)}let a=e.length?e.map(s=>``).join(""):` ${game.i18n.localize("DIALOG.noTarget")}`;o.currentTarget.dataset.tooltip=`

${game.i18n.localize(t)}

${a}
`}static async rollResistPain(o){let e=o.currentTarget.dataset,t={token:e.token,actor:e.actor,scene:canvas.id},a=g.getSpeaker(t);a&&a.finishResistPainRoll()}static async wrapLock(o,e){let t=$(o.currentTarget);t.hasClass("locked")||(t.addClass("locked"),t.prepend(''),await e(o,t),setTimeout(()=>{t.removeClass("locked"),t.find("i").remove()},2e3))}static async chatListeners(o){o.on("click",".expand-mods",e=>{e.preventDefault();let t=$(e.currentTarget);t.find("i").toggleClass("fa-minus fa-plus"),t.siblings("ul,div").fadeToggle()}),o.on("click",".edit-toggle",e=>{e.preventDefault(),$(e.currentTarget).parents(".chat-card").find(".display-toggle").toggle()}),o.on("click",".botch-roll",e=>B.showBotchCard(e.currentTarget.dataset)),o.on("click",".roll-item",e=>_DiceDSA5._itemRoll(e)),o.on("click",".gearDamaged",async e=>_DiceDSA5.gearDamaged(e)),o.on("click",".applyDamage",async e=>wt($(e.currentTarget).closest(".message"),e.currentTarget.dataset.mode)),o.on("change",".roll-edit",e=>_DiceDSA5._rollEdit(e)),o.on("click",".applyEffect",async e=>{_DiceDSA5.wrapLock(e,async(t,a)=>{let s=a.parents(".message").attr("data-message-id"),i=t.currentTarget.dataset.target;await Z.applyEffect(s,i)})}),o.on("mouseenter",".applyEffect",e=>_DiceDSA5.showCurrentTargets(e)),o.on("click",".applyTableEffect",async e=>{_DiceDSA5.wrapLock(e,async(t,a)=>{let s=a.parents(".message").attr("data-message-id"),i=t.currentTarget.dataset.target;await Nt.applyEffect(s,i)})}),o.on("click",".placeTemplate",async e=>Le.placeTemplateFromChat(e)),o.on("click",".message-delete",e=>{let t=game.messages.get($(e.currentTarget).parents(".message").attr("data-message-id"));if(!t.flags.unopposeData)return;let s=canvas.tokens.get(t.flags.unopposeData.targetSpeaker.token);ee.clearOpposed(s.actor)}),o.on("click",".resistEffect",e=>Z.resistEffect(e)),o.on("click",".resistPain",e=>_DiceDSA5.rollResistPain(e)),ie.chatListeners(o)}};var{getProperty:U,mergeObject:we,duplicate:Ke,hasProperty:zr,setProperty:Nr,expandObject:Rr}=foundry.utils,O=class o extends Actor{static{u(this,"Actordsa5")}static DEFAULT_ICON="icons/svg/mystery-man-black.svg";static selfRegex=/^self\./;static skipAlternateWeaponKeys=new Set([["flags","system.description"]]);static async create(e,t){if(e instanceof Array||e.items)return await super.create(e,t);let a=await g.allSkills()||[],s=await g.allCombatSkills()||[],i=await g.allMoneyItems()||[];return e.items=[...a,...s,...i],e.type!="character"&&(e.system={status:{fatePoints:{current:0,value:0}}}),e.type!="creature"&&[void 0,0].includes(U(e,"system.status.wounds.value"))&&we(e,{system:{status:{wounds:{value:16}}}}),await super.create(e,t)}_getArmorCompensation(e,t,a){let s=F.abilityStep(e,game.i18n.localize("LocalizedIDs.inuredToEncumbrance")),i=t.reduce((n,r)=>n+=Number(r.system.encumbrance.value),0);if(s>i){let n=[game.i18n.localize("CHARAbbrev.GS"),game.i18n.localize("CHARAbbrev.INI")];for(let r of n)a[r]&&(a[r]=a[r].filter(l=>l.type!="armor"))}}_getItemModifiers(){let e=[],t={};for(let a of this.items.filter(s=>["meleeweapon","rangeweapon","armor","equipment"].includes(s.type)&&U(s,"system.worn.value")||["advantage","specialability","disadvantage"].includes(s.type)))this._buildGearAndAbilityModifiers(t,a),a.type=="armor"&&e.push(a);this._getArmorCompensation(this,e,t),this._applyModiferTransformations(t)}prepareDerivedData(){let e=this.system;try{this._getItemModifiers();for(let p of Object.values(e.characteristics))p.value=p.initial+p.advances+(p.modifier||0)+p.gearmodifier;e.totalWeight=0;let t=[],a=game.i18n.localize("LocalizedIDs.familiar"),s=game.i18n.localize("LocalizedIDs.companion"),i=game.settings.get("dsa5","moneyHasWeight"),n=new Map,r=this.items.filter(p=>p.type=="equipment"&&p.system.equipmentType.value=="bags");for(let p of r)n.set(p.id,[]);this.system.moneyWeight=0;for(let p of this.items)if(i&&p.type=="money")p.system.preparedWeight=parseFloat((p.system.weight.value*p.system.quantity.value).toFixed(3)),e.totalWeight+=Number(p.system.preparedWeight),this.system.moneyWeight+=Number(p.system.preparedWeight);else if(b.equipmentCategories.has(p.type)){let f=U(p,"system.parent_id");if(f&&f!=p._id&&n.has(f)){n.get(f).push(p);continue}p.type=="armor"?(p.system.preparedWeight=parseFloat((p.system.weight.value*p.system.quantity.value).toFixed(3)),e.totalWeight+=parseFloat((p.system.weight.value*(p.system.worn.value?Math.max(0,p.system.quantity.value-1):p.system.quantity.value)).toFixed(3)),p.system.worn.value&&t.push(p)):(p.system.preparedWeight=parseFloat((p.system.weight.value*p.system.quantity.value).toFixed(3)),e.totalWeight+=Number(p.system.preparedWeight))}else switch(p.type){case"trait":p.name==a?e.isFamiliar=!0:p.name==s&&(e.isPet=!0);break;case"spell":case"ritual":case"magictrick":e.isMage=!0;break;case"liturgy":case"ceremony":case"blessing":e.isPriest=!0;break;case"specialability":b.sortedSpecs.magical.has(p.system.category.value)?e.isMage=!0:b.sortedSpecs.clerical.has(p.system.category.value)&&(e.isPriest=!0);break}e.isMage||=e.isFamiliar;for(let p of r){let f=U(p,"system.parent_id");(!f||!n.has(f))&&(e.totalWeight+=this._calcBagweight(p,n,!0))}e.canAdvance=this.isOwner&&(this.type=="character"||e.isFamiliar||e.isPet),this.canAdvance=e.canAdvance,e.carrycapacity=e.characteristics.kk.value*2+e.carryModifier,e.canAdvance&&(e.details.experience.current=e.details.experience.total-e.details.experience.spent,e.details.experience.description=g.experienceDescription(e.details.experience.total)),(this.type=="character"||this.type=="npc")&&(e.status.wounds.current=e.status.wounds.initial+e.characteristics.ko.value*2,e.status.soulpower.value=(e.status.soulpower.initial||0)+Math.round((e.characteristics.mu.value+e.characteristics.kl.value+e.characteristics.in.value)/6),e.status.toughness.value=(e.status.toughness.initial||0)+Math.round((e.characteristics.ko.value+e.characteristics.ko.value+e.characteristics.kk.value)/6),e.status.wounds.min=-1*e.characteristics.ko.value),e.status.fatePoints.max=Number(e.status.fatePoints.current)+Number(e.status.fatePoints.modifier)+e.status.fatePoints.gearmodifier,this.type=="creature"&&(e.status.wounds.current=e.status.wounds.initial,e.status.astralenergy.current=e.status.astralenergy.initial,e.status.karmaenergy.current=e.status.karmaenergy.initial),e.status.wounds.max=Math.round((e.status.wounds.current+e.status.wounds.modifier+e.status.wounds.advances)*e.status.wounds.multiplier+e.status.wounds.gearmodifier),e.status.regeneration.LePmax=e.status.regeneration.LePTemp+e.status.regeneration.LePMod+e.status.regeneration.LePgearmodifier,e.status.regeneration.KaPmax=e.status.regeneration.KaPTemp+e.status.regeneration.KaPMod+e.status.regeneration.KaPgearmodifier,e.status.regeneration.AsPmax=e.status.regeneration.AsPTemp+e.status.regeneration.AsPMod+e.status.regeneration.AsPgearmodifier;let l=e.guidevalue;e.status.astralenergy.rebuy||=0,e.status.karmaenergy.rebuy||=0,e.status.astralenergy.permanentLoss||=0,e.status.karmaenergy.permanentLoss||=0,e.status.astralenergy.permanentLossSum=e.status.astralenergy.permanentLoss-e.status.astralenergy.rebuy+e.status.astralenergy.permanentGear,e.status.karmaenergy.permanentLossSum=e.status.karmaenergy.permanentLoss-e.status.karmaenergy.rebuy+e.status.karmaenergy.permanentGear,(e.isFamiliar||l&&this.type!="creature")&&(e.status.astralenergy.current=e.status.astralenergy.initial,e.status.karmaenergy.current=e.status.karmaenergy.initial,e.characteristics[l.magical]&&(e.status.astralenergy.current+=Math.round(e.characteristics[l.magical].value*e.energyfactor.magical)),e.characteristics[l.clerical]&&(e.status.karmaenergy.current+=Math.round(e.characteristics[l.clerical].value*e.energyfactor.clerical))),e.status.astralenergy.max=e.status.astralenergy.current+e.status.astralenergy.modifier+e.status.astralenergy.advances+e.status.astralenergy.gearmodifier-e.status.astralenergy.permanentLossSum,e.status.karmaenergy.max=e.status.karmaenergy.current+e.status.karmaenergy.modifier+e.status.karmaenergy.advances+e.status.karmaenergy.gearmodifier-e.status.karmaenergy.permanentLossSum,e.status.soulpower.max=e.status.soulpower.value+e.status.soulpower.modifier+e.status.soulpower.gearmodifier,e.status.toughness.max=e.status.toughness.value+e.status.toughness.modifier+e.status.toughness.gearmodifier,e.status.dodge.value=Math.round(e.characteristics.ge.value/2)+e.status.dodge.gearmodifier;let c=this.calcEncumbrance(e),m=H.isRiding(this)?H.getHorse(this):void 0;this.calcInitiative(e,c,m),e.status.dodge.max=Number(e.status.dodge.value)+Number(e.status.dodge.modifier)+Number(game.settings.get("dsa5","higherDefense"))/2,e.armorEncumbrance=this.getArmorEncumbrance(this,t),this.prepareSwarm(e),this.effectivePain(e);let d=this.statuses.has("fixated");this.calcSpeed(e,d,m),d&&(e.status.dodge.max=Math.max(0,e.status.dodge.max-4))}catch(t){console.error(`Something went wrong with preparing actor data ${this.name}: `+t+t.stack),ui.notifications.error(game.i18n.format("DSAError.PreparationError",{name:this.name})+t+t.stack)}}static async deferredEffectAddition(e,t,a){let i=(t.effects.find(r=>r.statuses.has(e))?.flags.dsa5.auto||0)!=a,n=`changing${e}`;t[n]=i,i&&await t.addCondition(e,a,!0,!0).then(()=>t[n]=void 0)}static async postUpdateConditions(e){if(!g.isActiveGM())return;let t=e.system,a=e.isMerchant();if(!he.hasTrait(e,game.i18n.localize("LocalizedIDs.painImmunity"))){let n=e.woundPain(t);await this.deferredEffectAddition("inpain",e,n)}let s=t.armorEncumbrance;(e.type!="creature"||e.canAdvance)&&!a&&(s+=Math.max(0,Math.ceil((t.totalWeight-t.carrycapacity-4)/4))),await this.deferredEffectAddition("encumbered",e,s);let i=e.woundPain(t,"temporaryLeP");await this.deferredEffectAddition("stunned",e,i),P.hasVantage(e,game.i18n.localize("LocalizedIDs.blind"))&&await e.addCondition("blind"),P.hasVantage(e,game.i18n.localize("LocalizedIDs.mute"))&&await e.addCondition("mute"),P.hasVantage(e,game.i18n.localize("LocalizedIDs.deaf"))&&await e.addCondition("deaf"),a&&await e.prepareMerchant()}static async _onCreateOperation(e,t,a){for(let s of e)await o.postUpdateConditions(s);return super._onCreateOperation(e,t,a)}static async _onUpdateOperation(e,t,a){for(let s of e)await o.postUpdateConditions(s);return super._onUpdateOperation(e,t,a)}prepareSwarm(e){let t=Number(e.swarm.count)||1;if(t<2)return;e.swarm.maxwounds=e.status.wounds.max,e.status.wounds.max*=t;let a=Math.min(Math.ceil(e.status.wounds.value/e.swarm.maxwounds),t),s=Number(e.swarm.gg)||1;e.swarm.attack+=Math.min(10,Math.floor(a/s)),e.swarm.parry+=-1,e.swarm.effectiveCount=a,e.swarm.damage=Math.min(5,Math.floor(a/s))}effectivePain(e){let t=e.condition.inpain||0;t<4&&(t-=P.vantageStep(this,game.i18n.localize("LocalizedIDs.ruggedFighter"))+P.vantageStep(this,game.i18n.localize("LocalizedIDs.ruggedAnimal"))+(F.hasAbility(this,game.i18n.localize("LocalizedIDs.traditionKor"))?1:0)),t>0&&(t+=P.vantageStep(this,game.i18n.localize("LocalizedIDs.sensitiveToPain"))+P.vantageStep(this,game.i18n.localize("LocalizedIDs.fragileAnimal"))),t=Math.clamp(t,0,4),e.condition.inpain=t}woundPain(e,t="wounds"){let a=0;return e.status[t].max>0&&(this.type!="creature"||e.status[t].max>=20?(a=Math.floor((1-e.status[t].value/e.status[t].max)*4),e.status[t].value<=5&&(a=4)):a=Math.floor(5-5*e.status[t].value/e.status[t].max)),Math.clamp(a,0,4)}calcSpeed(e,t,a){if(a){if(e.status.speed.max=a.system.status.speed.max,!e.status.speed.max){let s=a.system;a.calcSpeed(s,a.hasCondition("fixated"))}e.status.speed.max=a.system.status.speed.max}else{e.status.speed.max=e.status.speed.initial+(e.status.speed.modifier||0)+(e.status.speed.gearmodifier||0),e.status.speed.max=Math.round(Math.max(0,e.status.speed.max-Math.min(4,this.calcEncumbrance(e)))*e.status.speed.multiplier),this.hasCondition("bloodrush")||(e.status.speed.max=Math.max(0,e.status.speed.max-(e.condition?.inpain||0)));let s=this.hasCondition("paralysed");s&&(e.status.speed.max=Math.round(e.status.speed.max*(1-s.flags.dsa5.value*.25))),t||this.hasCondition("rooted")||this.hasCondition("incapacitated")?e.status.speed.max=0:this.hasCondition("prone")&&(e.status.speed.max=Math.min(1,e.status.speed.max)),H.updateRiderSpeed(this,e.status.speed.max)}}calcEncumbrance(e){return Math.clamp(e.condition?.encumbered||0,0,4)}calcInitiative(e,t,a){if(this.type=="character"||this.type=="npc"?e.status.initiative.value=Math.round((e.characteristics.mu.value+e.characteristics.ge.value)/2)+(e.status.initiative.modifier||0):e.status.initiative.value=e.status.initiative.current+(e.status.initiative.modifier||0),a){if(e.status.initiative.value=a.system.status.initiative.value,!e.status.initiative.value){let s=a.system;a.calcInitiative(s,a.calcEncumbrance(s)),e.status.initiative.value=s.status.initiative.value}}else{e.status.initiative.value+=(e.status.initiative.gearmodifier||0)-Math.min(4,t);let s=Number((.01*e.status.initiative.value).toFixed(2));e.status.initiative.value*=e.status.initiative.multiplier||1,e.status.initiative.value=Math.round(e.status.initiative.value)+s}}get creatureType(){return x.creatureTypeName(this)}async prepareMerchant(){if(U(this,"system.merchant.merchantType")=="loot"){if(U(this,"system.merchant.locked")&&!this.hasCondition("locked"))await this.addCondition(o.lockedCondition());else if(!U(this,"system.merchant.locked")){let e=this.effects.find(t=>t.statuses.has("locked"));e&&await this.deleteEmbeddedDocuments("ActiveEffect",[e.id])}}}static lockedCondition(){return{id:"locked",name:game.i18n.localize("MERCHANT.locked"),img:"icons/svg/padlock.svg",flags:{dsa5:{noEffect:!0,hidePlayers:!0,description:game.i18n.localize("MERCHANT.locked")}}}}applyActiveEffects(){let e={};this.statuses??=new Set;let t=new Map;for(let c of Object.values(CONFIG.specialStatusEffects))t.set(c,this.statuses.has(c));this.statuses.clear();let a=[],s=1;for(let c of this.effects){if(c.disabled||c.system.delayed)continue;if(U(c,"flags.dsa5.isAura")){this.auras.push(c.uuid);continue}s=1;let m=c.getFlag("dsa5","value");m&&(s=Number(m));for(let d=0;d(p=foundry.utils.duplicate(p),p.effect=c,p.priority=p.priority?p.priority:p.mode*10,p)));for(let d of c.statuses)this.statuses.add(d)}let i=!0,n=this.items.filter(c=>["rangeweapon","meleeweapon","equipment","armor"].includes(c.type)&&c.system.isArtifact&&(c.system.worn.value||c.type=="equipment"&&!c.system.worn.wearable)).map(c=>c.system.artifact),r=!game.settings.get("dsa5","enableWeaponAdvantages");this.dsatriggers={6:{},7:{}};for(let c of this.items)for(let m of c.effects){if(m.disabled||!m.transfer||m.system.delayed)continue;switch(i=!0,c.type){case"meleeweapon":case"rangeweapon":if(r&&m.system.equipmentAdvantage)continue;i=c.system.worn.value&&m.getFlag("dsa5","applyToOwner");break;case"armor":if(r&&m.system.equipmentAdvantage)continue;i=c.system.worn.value;break;case"equipment":i=!c.system.worn.wearable||c.system.worn.wearable&&c.system.worn.value;break;case"trait":i=!["meleeAttack","rangeAttack"].includes(c.system.traitType.value)||m.getFlag("dsa5","applyToOwner"),s=Number(U(c.system,"step.value"))||1;break;case"ammunition":case"plant":case"consumable":case"combatskill":case"magicsign":case"poison":case"spell":case"liturgy":case"ceremony":case"ritual":case"skill":case"spellextension":i=!1;break;case"specialability":switch(c.system.category.value){case"Combat":i=[2,3].includes(Number(c.system.category.sub));break;case"staff":i=c.system.permanentEffects||n.includes(c.system.artifact);break;default:i=!0}s=Number(c.system.step.value)||1;break;case"advantage":case"disadvantage":s=Number(c.system.step.value)||1;break}let d=U(m,"flags.dsa5.advancedFunction");if(Object.prototype.hasOwnProperty.call(this.dsatriggers,d)&&(this.dsatriggers[d][c.id]=m.id),m.notApplicable=!i,i&&U(m,"flags.dsa5.isAura")){this.auras.push(m.uuid);continue}if(i){for(let p=0;p(f=foundry.utils.duplicate(f),f.effect=m,f.priority=f.priority?f.priority:f.mode*10,f)));for(let p of m.statuses)this.statuses.add(p)}}a.sort((c,m)=>c.priority-m.priority);for(let c of a){if(!c.key||o.selfRegex.test(c.key))continue;let m=c.effect.apply(this,c);Object.assign(e,m)}this.overrides=Rr(e);let l;for(let[c,m]of t){let d=this.statuses.has(c);if(d!==m){l??=this.getActiveTokens();for(let p of l)p._onApplyStatusEffect(c,d)}}}_setOnUseEffect(e){U(e,"flags.dsa5.onUseEffect")&&(e.OnUseEffect=!0)}_setAEPayments(e){if(e.OnUseEffect)return;Number(U(e,"system.AsPCost"))&&(e.AEpayable=!0)}prepareBaseData(){let e=this.system;this.auras=[],we(e,{itemModifiers:{},condition:{},swarm:{attack:0,parry:0,damage:0},creatureType:this.creatureType,skillModifiers:{FP:[],step:[],QL:[],TPM:[],FW:[],botch:20,crit:1,global:[],conditional:{AsPCost:[],KaPCost:[]},combat:{step:[],parry:[],attack:[],damage:[]},feature:{FP:[],step:[],QL:[],TPM:[],FW:[],KaPCost:[],AsPCost:[]},...["liturgy","ceremony","ritual","spell","skill"].reduce((t,a)=>(t[a]={FP:[],step:[],QL:[],TPM:[],FW:[]},t),{})},status:{initiative:{multiplier:1},astralenergy:{permanentGear:0},karmaenergy:{permanentGear:0},wounds:{multiplier:1},speed:{multiplier:1},regeneration:{LePgearmodifier:0,KaPgearmodifier:0,AsPgearmodifier:0}},repeatingEffects:{startOfRound:{wounds:[],karmaenergy:[],astralenergy:[]}},temperature:{heatProtection:0,coldProtection:0},totalArmor:0,spellArmor:0,liturgyArmor:0,carryModifier:0,aspModifier:0,kapModifier:0,immunities:[],thresholds:{effects:[]},creatureBonus:[],miracle:{attack:0,parry:0},spellStats:{damage:"0"},liturgyStats:{damage:"0"},meleeStats:{parry:0,attack:0,damage:"0",defenseMalus:0,botch:20,crit:1},rangeStats:{attack:0,damage:"0",defenseMalus:0,botch:20,crit:1}});for(let t of b.gearModifyableCalculatedAttributes)e.status[t]&&(e.status[t].gearmodifier=0);for(let t of Object.values(e.characteristics))t.gearmodifier=0}getSkillModifier(e,t){let a=[],s=["FP","step","QL","TPM","FW"];for(let i of s){let n=i=="step"?"":i;a.push(...this.system.skillModifiers[i].filter(r=>r.target==e).map(r=>({name:r.source,value:r.value,source:r.item,type:n}))),this.system.skillModifiers[t]&&a.push(...this.system.skillModifiers[t][i].map(r=>({name:r.target||r.source,value:r.value,source:r.source,type:n})))}return a}getCombatEffectSkillModifier(e,t){let a=[],s=["step",t];for(let i of s)a.push(...this.system.skillModifiers.combat[i].filter(n=>n.target==e).map(n=>({name:`${n.target||n.source} - ${game.i18n.localize(`CHAR.${i.toUpperCase()}`)}`,value:n.value,source:n.source,type:i,selected:!0})));return a}prepareSheet(e){let t={system:{characteristics:{}}};if(we(t,this.prepareItems(e)),t.canAdvance){let a=["wounds","astralenergy","karmaenergy"],s=this.system.isFamiliar||this.system.isPet,i=s?"C":"D";for(let n of a)we(t.system,{status:{[n]:{cost:game.i18n.format("advancementCost",{cost:g._calculateAdvCost(this.system.status[n].advances,"D")}),refund:game.i18n.format("refundCost",{cost:g._calculateAdvCost(this.system.status[n].advances,"D",0)})}}});i=s?"C":"E";for(let[n,r]of Object.entries(this.system.characteristics))t.system.characteristics[n]={cost:game.i18n.format("advancementCost",{cost:g._calculateAdvCost(r.initial+r.advances,i)}),refund:game.i18n.format("refundCost",{cost:g._calculateAdvCost(r.initial+r.advances,i,0)})}}return t}static canAdvance(e){return e.canAdvance}static armorOpposedTransformation(e,t,a){if(a.origin){let s=U(a.origin,"system.combatskill.value");t=t.map(i=>{let n=we(Ke(a),{armor:Ke(i)});if(s){s+=" ";for(let r of n.armor.effects)if(Me.realyRealyEnabled(r)){for(let l of r.changes)if(l.key=="self.armorVulnerability"){let c=l.value.split(/[,;]/),m;if(a.defenderTest.attackFromBehind&&(m=c.find(d=>d.trim().startsWith("attackFromBehind "))),m||(m=c.find(d=>d.trim().startsWith(s))),m){let d=Number(m.match(/[-+]?\d+/)[0])||0;for(let p of["head","rightleg","leftleg","rightarm","leftarm","value"])n.armor.system.protection[p]&&(n.armor.system.protection[p]=Math.max(0,n.armor.system.protection[p]+d))}else if(m=c.find(d=>d.trim().startsWith("randomArmor ")),m){let d=m.split(" ")[1].split("|"),p=d[Math.floor(Math.random()*d.length)];for(let f of["head","rightleg","leftleg","rightarm","leftarm","value"])n.armor.system.protection[f]&&(n.armor.system.protection[f]=p)}}}}return Z.applyRollTransformation(e,n,pe.EVENTS.ARMOR_TRANSFORMATION).options.armor})}return t}static armorValue(e,t={}){let a=this.armorOpposedTransformation(e,e.items.filter(n=>n.type=="armor"&&n.system.worn.value==!0),t),s=a.reduce((n,r)=>n+W.armorWearModifier(r,r.system.protection.value),0),i=e.items.reduce((n,r)=>n+(r.type=="trait"&&r.system.traitType.value=="armor"?Number(r.system.at.value):0),0);return{wornArmor:a,armor:s+i+(e.system.totalArmor||0)}}static _calculateCombatSkillValues(e,t,{step:a,parry:s,attack:i}={step:0,parry:0,attack:0}){let n=e.system.talentValue.value+a;if(e.system.weapontype.value=="melee"){let r=e.system.guidevalue.value.split("/").map(m=>Number(t.characteristics[m].initial)+Number(t.characteristics[m].modifier)+Number(t.characteristics[m].advances)+Number(t.characteristics[m].gearmodifier)),l=Math.max(...r),c=t.characteristics.mu.initial+t.characteristics.mu.modifier+t.characteristics.mu.advances+t.characteristics.mu.gearmodifier;e.system.parry.value=Math.ceil(n/2)+Math.max(0,Math.floor((l-8)/3))+Number(game.settings.get("dsa5","higherDefense"))+s,e.system.attack.value=n+Math.max(0,Math.floor((c-8)/3))+i}else{let r=t.characteristics.ff.initial+t.characteristics.ff.modifier+t.characteristics.ff.advances+t.characteristics.ff.gearmodifier;e.system.parry.value=0,e.system.attack.value=n+Math.max(0,Math.floor((r-8)/3))+i}return e.cost=game.i18n.format("advancementCost",{cost:g._calculateAdvCost(e.system.talentValue.value,e.system.StF.value)}),e}drawAuras(e=!1){for(let t of this.getActiveTokens())t.drawAuras(e)}_onCreateDescendantDocuments(...e){super._onCreateDescendantDocuments(...e),this.drawAuras()}_onUpdateDescendantDocuments(...e){super._onUpdateDescendantDocuments(...e);let t=e[1]=="effects"&&e[3].some(a=>["flags.dsa5.auraRadius","flags.dsa5.borderColor","flags.dsa5.disposition","flags.dsa5.fillColor","flags.dsa5.borderThickness"].some(s=>zr(a,s)));this.drawAuras(t)}_onDeleteDescendantDocuments(...e){super._onCreateDescendantDocuments(...e),this.drawAuras()}_perpareItemAdvancementCost(e){let t=this.system.isPet||this.system.isFamiliar?"C":e.system.StF.value;return e.cost=game.i18n.format("advancementCost",{cost:g._calculateAdvCost(e.system.talentValue.value,t)}),e.refund=game.i18n.format("refundCost",{cost:g._calculateAdvCost(e.system.talentValue.value,t,0)}),e}async modifyTokenAttribute(e,t,a=!1,s=!0){let i=foundry.utils.getProperty(this.system,e),n;return s?(a&&(t=Math.clamp(i.min||0,Number(i.value)+t,i.max)),n={[`system.${e}.value`]:t}):(a&&(t=Number(i)+t),n={[`system.${e}`]:t}),Hooks.call("modifyTokenAttribute",{attribute:e,value:t,isDelta:a,isBar:s},n)!==!1?this.update(n):this}schipshtml(){let e=[];for(let t=1;t<=Number(this.system.status.fatePoints.max);t++)e.push({value:t,cssClass:t<=Number(this.system.status.fatePoints.value)?"fullSchip":"emptySchip"});return e}prepareItems(e){let t=this.toObject(!1),a=[],s=[],i=[],n=[],r=[],l=[],c=[],m=[],d=[],p=[],f=Object.fromEntries(Object.keys(b.specialAbilityCategories).map(w=>[w,[]])),h=Object.fromEntries(Object.keys(b.traitCategories).map(w=>[w,[]])),y=[],k=[],C=[],v=[],I={hasSpells:this.system.isMage,hasPrayers:this.system.isPriest,liturgy:[],spell:[],ritual:[],ceremony:[],blessing:[],magictrick:[],magicalsign:[]},S={spell:{},ritual:{},ceremony:{},liturgy:{}},j=this.hasPlayerOwner?N.getGroupSchips():[],A=this.schipshtml(),M={meleeweapons:{items:[],show:!1,dataType:"meleeweapon"},rangeweapons:{items:[],show:!1,dataType:"rangeweapon"},armor:{items:[],show:!1,dataType:"armor"},ammunition:{items:[],show:!1,dataType:"ammunition"},plant:{items:[],show:!1,dataType:"plant"},poison:{items:[],show:!1,dataType:"poison"},book:{items:[],show:!1,dataType:"book"}};for(let w in b.equipmentTypes)M[w]={items:[],show:!1,dataType:w};M.misc.show=!0;let T={coins:[],total:0,show:!0};t.items=t.items.sort((w,G)=>w.name.localeCompare(G.name));let L=t.system.totalArmor||0,q={body:[],social:[],knowledge:[],trade:[],nature:[]},ve=new Map;for(let w of t.items.filter(G=>G.type=="equipment"&&G.system.equipmentType.value=="bags"))ve.set(w._id,[]);let Te=new Map,qe=[],St=!1,lt=t.items.some(w=>!["skill","combatskill","money"].includes(w.type)),ct=H.getHorse(this,!0);for(let w of t.items)try{let G=U(w,"system.parent_id");if(w.type=="ammunition"&&qe.push(o._prepareitemStructure(w)),G&&G!=w._id&&ve.has(G)){ve.get(G).push(w);continue}switch(e.details&&e.details.includes(w._id)&&(w.detailed="shown"),w.system.isArtifact&&(w.volume=b.traditionArtifacts[w.system.artifact]||0,w.volumeFinal=0,v.push(w)),w.type){case"skill":q[w.system.group.value].push(this._perpareItemAdvancementCost(w));break;case"information":m.push(w);break;case"aggregatedTest":n.push(w);break;case"spellextension":S[w.system.category][w.system.source]?S[w.system.category][w.system.source].push(w.name):S[w.system.category][w.system.source]=[w.name];break;case"ritual":case"spell":case"liturgy":case"ceremony":I[w.type].push(o.buildSpellChargeProgress(this._perpareItemAdvancementCost(w)));break;case"magicalsign":case"magictrick":case"blessing":I[w.type].push(w);break;case"trait":switch(w.system.traitType.value){case"rangeAttack":w=o._prepareRangeTrait(w,this.system);break;case"meleeAttack":w=o._prepareMeleetrait(w,this.system);break;case"armor":L+=Number(w.system.at.value);break}h[w.system.traitType.value].push(w),St=!0;break;case"combatskill":a.push(o._calculateCombatSkillValues(w,this.system));break;case"ammunition":M.ammunition.items.push(o.prepareMag(w)),M.ammunition.show=!0;break;case"meleeweapon":w.toggleValue=w.system.worn.value||!1,w.toggle=!0,this._setOnUseEffect(w),M.meleeweapons.items.push(o._prepareitemStructure(w)),M.meleeweapons.show=!0,w.toggleValue&&c.push(w);break;case"rangeweapon":w.toggleValue=w.system.worn.value||!1,w.toggle=!0,this._setOnUseEffect(w),M.rangeweapons.items.push(o._prepareitemStructure(w)),M.rangeweapons.show=!0;break;case"armor":if(w.toggleValue=w.system.worn.value||!1,M.armor.items.push(o._prepareitemStructure(w)),M.armor.show=!0,w.toggle=!0,this._setOnUseEffect(w),w.system.worn.value){for(let De in w.system.protection){let dt=w.system.protection[De];w.system.protection[De]=W.armorWearModifier(w,dt)}L+=Number(w.system.protection.value),y.push(w)}break;case"book":case"poison":case"plant":M[w.type].items.push(w),M[w.type].show=!0;break;case"consumable":M[w.system.equipmentType.value].items.push(o._prepareConsumable(w)),M[w.system.equipmentType.value].show=!0;break;case"equipment":w.toggle=U(w,"system.worn.wearable")||!1,w.toggle&&(w.toggleValue=w.system.worn.value||!1),this._setOnUseEffect(w),M[w.system.equipmentType.value].items.push(o._prepareitemStructure(w)),M[w.system.equipmentType.value].show=!0;break;case"money":T.coins.push(w),T.total+=w.system.quantity.value*w.system.price.value;break;case"advantage":this._setOnUseEffect(w),s.push(w);break;case"disadvantage":this._setOnUseEffect(w),i.push(w);break;case"specialability":this._setOnUseEffect(w),this._setAEPayments(w),f[w.system.category.value].push(w);break;case"disease":r.push(w);break;case"patron":f.magical.push(w);break;case"demonmark":l.push(w);break;case"essence":d.push(w);break;case"imprint":p.push(w);break;case"application":Te.has(w.system.skill)?Te.get(w.system.skill).push(w):Te.set(w.system.skill,[w]);break}}catch(G){this._itemPreparationError(w,G)}for(let w of M.bags.items)this._setBagContent(w,ve);for(let[w,G]of Object.entries(S))for(let[De,dt]of Object.entries(G)){let mn=I[w].find(er=>er.name==De);mn?mn.extensions=dt.join(", "):ui.notifications.warn(game.i18n.format("DSAError.noSpellForExtension",{name:De,category:g.categoryLocalization(w),extension:dt.join(",")}))}for(let w of M.rangeweapons.items)try{w.system.worn.value&&k.push(o._prepareRangeWeapon(w,qe,a,this))}catch(G){this._itemPreparationError(w,G)}for(let w of c)try{C.push(o._prepareMeleeWeapon(w,a,t,c.filter(G=>G._id!=w._id&&!N.isYieldedTwohanded(G))))}catch(G){this._itemPreparationError(w,G)}for(let w of Object.values(q))for(let G of w)G.applications=Te.get(G.name)||[];T.coins=T.coins.sort((w,G)=>w.system.price.value>G.system.price.value?-1:1),f.magical.push(...f.pact),f.clerical.push(...f.ceremonial);for(let w of f.staff){let G=v.find(De=>De.system.artifact==w.system.artifact);if(G){G.abilities==null&&(G.abilities=[]),G.abilities.push(w);let De=Number(w.system.volume)||0,dt=De>0?"volumeFinal":"volume";G[dt]+=Math.abs(De)*Number(w.system.step.value)}else f.magical.push(w)}let Zt=Ke(b.characteristics);Zt["-"]="-";let At=a.find(w=>w.name==game.i18n.localize("LocalizedIDs.wrestle"));return{totalWeight:parseFloat(this.system.totalWeight?.toFixed(3)),traditionArtifacts:v,armorSum:L,sortedSpecs:b.sortedSpecs,spellArmor:t.system.spellArmor||0,liturgyArmor:t.system.liturgyArmor||0,money:T,brawling:{attack:At?.system.attack.value||0,parry:At?.system.parry.value||0},encumbrance:this.system.condition?.encumbered||0,carrycapacity:this.system.carrycapacity,isSwarm:this.isSwarm(),canSwarm:!this.prototypeToken.actorLink,wornRangedWeapons:k,wornMeleeWeapons:C,moneyWeight:this.system.moneyWeight,horseActor:ct,advantages:s,hasAnyItem:lt,disadvantages:i,specAbs:f,information:m,aggregatedtests:n,wornArmor:y,essence:d,imprint:p,inventory:M,hasTrait:St,demonmarks:l,diseases:r,canBuild:game.dsa5.sheets.DSACharBuilder&&!t.system.details.species?.value,itemModifiers:this.system.itemModifiers,languagePoints:t.system.freeLanguagePoints?.value?`(${t.system.freeLanguagePoints?.used}/${t.system.freeLanguagePoints?.value})`:"",schips:A,groupschips:j,guidevalues:Zt,magic:I,traits:h,combatskills:a,canAdvance:this.canAdvance,sheetLocked:t.system.sheetLocked.value,bodyAttrs:["ff","ge","ko","kk"],mentalAttrs:["mu","kl","in","ch"],allSkillsLeft:{body:q.body,social:q.social,nature:q.nature},allSkillsRight:{knowledge:q.knowledge,trade:q.trade}}}isSwarm(){return this.system.swarm.count>1&&!this.prototypeToken.actorLink}getArmorEncumbrance(e,t){let a=t.reduce((i,n)=>(n.system.calculatedEncumbrance=Number(n.system.encumbrance.value)+W.armorEncumbranceModifier(n),n.system.damageToolTip=W.damageTooltip(n),i+=n.system.calculatedEncumbrance),0),s=H.isRiding(this)?-1:0;return Math.max(0,a-F.abilityStep(e,game.i18n.localize("LocalizedIDs.inuredToEncumbrance"))+s)}_calcBagweight(e,t,a=!0){let s=0;if(t.has(e._id)){let i=0;!e.system.worn.value&&a&&(s-=e.system.preparedWeight);for(let n of t.get(e._id))n.system.preparedWeight=Number(parseFloat((n.system.weight.value*n.system.quantity.value).toFixed(3))),t.has(n._id)?i+=this._calcBagweight(n,t,!1):i+=n.system.preparedWeight;a?e.system.worn.value&&(s+=i):s+=i+e.system.preparedWeight,e.system.bagweight=`${i.toFixed(3)}/${e.system.capacity}`}return s}_setBagContent(e,t){if(t.has(e._id)){e.children=[];for(let a of t.get(e._id))e.children.push(o._prepareitemStructure(o._prepareConsumable(a))),t.has(a._id)&&this._setBagContent(a,t)}}isMerchant(){return["merchant","loot"].includes(U(this,"system.merchant.merchantType"))}_itemPreparationError(e,t){console.error("Something went wrong with preparing item "+e.name+": "+t),console.warn(t),console.warn(e),ui.notifications.error("Something went wrong with preparing item "+e.name+": "+t)}_applyModiferTransformations(e){this.system.itemModifiers={};for(let t of Object.keys(e)){let a=game.dsa5.config.knownShortcuts[t.toLowerCase()];if(a){let s=e[t].reduce((i,n)=>i=i+n.value,0);this.system[a[0]][a[1]][a[2]]+=s,this.system.itemModifiers[t]={value:s,sources:e[t].map(i=>i.source)}}}}_buildGearAndAbilityModifiers(e,t){let a=U(t,"system.effect.value");if(a)for(let s of`${a}`.split(/,|;/).map(i=>i.trim())){let i=s.replace(/(\s+)/g," ").trim().split(" ");if(i.length==2&&!isNaN(i[0])){let n={value:Number(i[0])*(t.system.step&&Number(t.system.step.value)||1),source:t.name,type:t.type};e[i[1]]==null?e[i[1]]=[n]:e[i[1]].push(n)}}}async _updateAPs(e,t={},a={}){if(o.canAdvance(this))if(!isNaN(e)&&e!=null){let s=Number(e);t["system.details.experience.spent"]=Number(this.system.details.experience.spent)+s,await this.update(t,a);let i=game.i18n.format(s>0?"advancementCost":"refundCost",{cost:Math.abs(s)});ge(i)}else ui.notifications.error("DSAError.APUpdateError",{localize:!0})}async checkEnoughXP(e){if(!o.canAdvance(this)||isNaN(e)||e==null||Number(this.system.details.experience.total)-Number(this.system.details.experience.spent)>=e)return!0;if(Number(this.system.details.experience.total)==0){let t=await renderTemplate("systems/dsa5/templates/dialog/parts/expChoices.html",{entries:b.startXP}),a=0,s=!1;try{[s,a]=await foundry.applications.api.DialogV2.wait({window:{title:"DSAError.NotEnoughXP"},content:t,buttons:[{action:"yes",icon:"fa fa-check",label:"yes",default:!0,callback:u((i,n,r)=>[!0,Number(n.form.elements.APsel.value)],"callback")},{action:"cancel",icon:"fas fa-times",label:"cancel",callback:u(()=>[!1,0],"callback")}]})}catch{}if(s)return await this.update({"system.details.experience.total":a}),!0}return ui.notifications.error("DSAError.NotEnoughXP",{localize:!0}),!1}setupWeapon(e,t,a,s){return a.mode=t,D.getSubClass(e.type).setupDialog(null,a,e,this,s)}throwMelee(e,t){let a=game.i18n.localize("LocalizedIDs.Throwing Weapons"),s=game.i18n.localize(`LocalizedCTs.${e.system.combatskill.value}`),i=["Daggers","Fencing Weapons","Impact Weapons","Swords","Polearms"].includes(s)&&F.hasAbility(this,game.i18n.localize("LocalizedIDs.weaponThrow")),n=e.name+" ("+a+")",r=new D({name:n,type:"rangeweapon",system:{combatskill:{value:a},reach:{value:b.meleeAsRangeReach[s]},effect:{attributes:e.system.effect.attributes},damage:{value:e.system.damage.value},quantity:{value:1}}}),l={situationalModifiers:[{name:n,value:i?-4:-8,selected:!0}]};this.setupWeapon(r,"attack",l,t).then(async c=>{i||(c.testData.source.dmgMultipliers||=[],c.testData.source.dmgMultipliers.push({name:"LocalizedIDs.Throwing Weapons",val:"0.5"})),await this.basicTest(c)})}setupWeaponless(e,t={},a){let s=[];F.hasAbility(this,game.i18n.localize("LocalizedIDs.mightyAstralBody"))&&s.push(game.i18n.localize("magical")),F.hasAbility(this,game.i18n.localize("LocalizedIDs.mightyKarmalBody"))&&s.push(game.i18n.localize("blessed"));let i=b.defaultWeapon({name:game.i18n.localize(`${e}Weaponless`),system:{combatskill:{value:game.i18n.localize("LocalizedIDs.wrestle")},effect:{attributes:s.join(", ")}}});return t.mode=e,D.getSubClass(i.type).setupDialog(null,t,i,this,a)}setupSpell(e,t={},a){return this.setupSkill(e,t,a)}setupSkill(e,t={},a){return D.getSubClass(e.type).setupDialog(null,t,e,this,a)}tokenScrollingText(e){let t=this.isToken?[this.token?.object]:this.getActiveTokens(!0);for(let a of t){if(!a)continue;let s=0;for(let i of e)canvas.interface.createScrollingText(a.center,i.value,{anchor:s,direction:i.value>0?2:1,fontSize:game.settings.get("dsa5","scrollingFontsize"),stroke:i.stroke,strokeThickness:1,jitter:.25,duration:1e3}),s+=1}}_containsChangedAttribute(e,t){let a=U(e,t);return[null,void 0].includes(a)||a===U(this,t)?!1:a}async _preUpdate(e,t,a){let s={wounds:9109504,astralenergy:723929,karmaenergy:303670};game.combat?.isBrawling&&(s.temporaryLeP=16525967);let i=[];for(let l of Object.keys(s)){let c=this._containsChangedAttribute(e,`system.status.${l}.value`);c!==!1&&i.push({value:c-this.system.status[l].value,stroke:s[l]})}i.length&&this.tokenScrollingText(i);let n=this._containsChangedAttribute(e,"system.swarm.count");if(n!==!1&&!t.skipSwarmUpdate){let l=U(e,"system.status.wounds.value")||this.system.status.wounds.value,c=n-(this.system.swarm.count||1),m=this.system.swarm.maxwounds||this.system.status.wounds.max;Nr(e,"system.status.wounds.value",Math.max(0,l+c*m))}let r=this._containsChangedAttribute(e,"system.details.experience.total");if(r!==!1){let l=this.system.details.experience.total;_.track(this,{type:"sum",previous:l,next:r},r-l)}return super._preUpdate(e,t,a)}async applyDamage(e,t={}){let a=await new Roll(`${e}`).evaluate(),s=a.total;if(game.combat?.isBrawling){let i=Math.min(this.system.status.temporaryLeP.max,this.system.status.temporaryLeP.value-s);await this.update({"system.status.temporaryLeP.value":i})}else{let i=Math.min(this.system.status.wounds.max,this.system.status.wounds.value-s);await this.update({"system.status.wounds.value":i})}if(t.msg){let i=await a.render();ChatMessage.create(g.chatDataSetup(`

${game.i18n.format(t.msg,{name:this.name})}

${i}`))}}async applyRegeneration(e,t,a){let s={"system.status.wounds.value":Math.min(this.system.status.wounds.max,this.system.status.wounds.value+(e||0)),"system.status.karmaenergy.value":Math.min(this.system.status.karmaenergy.max,this.system.status.karmaenergy.value+(a||0)),"system.status.astralenergy.value":Math.min(this.system.status.astralenergy.max,this.system.status.astralenergy.value+(t||0))};await this.update(s)}async applyMana(e,t){let a=t=="AsP"?"astralenergy":"karmaenergy",s=(await new Roll(`${e}`).evaluate()).total,i=Math.min(this.system.status[a].max,this.system.status[a].value-s);return i>=0?(await this.update({[`system.status.${a}.value`]:i}),!0):(ui.notifications.error(`DSAError.NotEnough${t}`,{localize:!0}),!1)}preparePostRollAction(e){let t=e.flags.data,a={flags:{img:e.flags.img},rollMode:t.rollMode,speaker:e.speaker,template:t.template,title:t.title,user:e.author};return t.attackerMessage&&(a.attackerMessage=t.attackerMessage),t.defenderMessage&&(a.defenderMessage=t.defenderMessage),t.unopposedStartMessage&&(a.unopposedStartMessage=t.unopposedStartMessage),a}resetTargetAndMessage(e,t){e.originalTargets?.size&&(game.user.targets=e.originalTargets,game.user.targets.user=game.user),!e.defenderMessage&&e.startMessagesList&&(t.startMessagesList=e.startMessagesList)}async fatererollDamage(e,t,a,s,i,n){t.fatePointDamageRerollUsed=!0,this.resetTargetAndMessage(i,t);let r=i.postData.damageRoll,l=await R.manualRolls(await new Roll(r.formula||r._formula).evaluate(),"CHATCONTEXT.rerollDamage");for(let c=0;c${game.i18n.localize("CHATFATE.fatepointUsed")} + ${game.i18n.format("CHATFATE.isTalented",{character:""+this.name+""})}
`;let n=await renderTemplate("systems/dsa5/templates/dialog/isTalentedReroll-dialog.html",{testData:a,postData:i.postData});new ae({title:game.i18n.localize("CHATFATE.selectDice"),content:n,buttons:{Yes:{icon:'',label:game.i18n.localize("Ok"),callback:u(async r=>{let l=r.find(".dieSelected").map(function(){return Number($(this).attr("data-index"))}).get();if(l.length>0){let c=[];for(let f of l){let h=a.roll.terms[f*2];c.push(h.number+"d"+h.faces+"["+h.options.colorset+"]")}c=await R.manualRolls(await new Roll(c.join("+")).evaluate(),"CHATCONTEXT.talentedReroll"),await R.showDiceSoNice(c,a.rollMode);let m=0,d=[],p=[];a.roll=Roll.fromData(a.roll);for(let f of l){let h=a.source.system[`characteristic${f+1}`],y=h?game.i18n.localize(`CHARAbbrev.${h.value.toUpperCase()}`)+" - ":"",k=c.terms[m*2].results[0].result;d.push(`${y}${a.roll.terms[f*2].results[0].result}/${k}`),k=Math.min(k,a.roll.terms[f*2].results[0].result),p.push({index:f,val:k}),m+=1}a.roll.editRollAtIndex(p),e+=`${game.i18n.localize("Roll")}: ${d.join(", ")}`,ChatMessage.create(g.chatDataSetup(e)),this[`${i.postData.postFunction}`]({testData:a,cardOptions:t},{rerenderMessage:s}),await s.update({"flags.data.talentedRerollUsed":!0})}},"callback")},cancel:{icon:'',label:game.i18n.localize("cancel")}},default:"Yes"}).render(!0)}async fatereroll(e,t,a,s,i,n){t.fatePointDamageRerollUsed=!0,this.resetTargetAndMessage(i,t);let r=await renderTemplate("systems/dsa5/templates/dialog/fateReroll-dialog.html",{testData:a,postData:i.postData,singleDie:i.postData.characteristics.length==1});new ae({title:game.i18n.localize("CHATFATE.selectDice"),content:r,buttons:{Yes:{icon:'',label:game.i18n.localize("Ok"),callback:u(async l=>{let c=l.find(".dieSelected").map(function(){return Number($(this).attr("data-index"))}).get();if(c.length>0){let m=[];for(let C of c){let v=a.roll.terms[C*2];m.push(v.number+"d"+v.faces+"["+v.options.colorset+"]")}m=await R.manualRolls(await new Roll(m.join("+")).evaluate(),"CHATCONTEXT.Reroll"),await R.showDiceSoNice(m,a.rollMode);let d=0,p=[],f=g.getSpeaker(a.extra.speaker),h=game.i18n.localize("LocalizedIDs.traditionPhex"),y=f.items.some(C=>C.type=="specialability"&&C.name==h);a.roll=Roll.fromData(a.roll);let k=[];for(let C of c){let v=a.source.system[`characteristic${C+1}`],I=v?`${game.i18n.localize(`CHARAbbrev.${v.value.toUpperCase()}`)} - `:"",S=m.terms[d*2].results[0].result;p.push(`${I}${a.roll.terms[C*2].results[0].result}/${S}`),y&&(S=Math.min(S,a.roll.terms[C*2].results[0].result)),k.push({index:C,val:S}),d+=1}a.roll.editRollAtIndex(k),e+=`
${game.i18n.localize("Roll")}: ${p.join(", ")}`,ChatMessage.create(g.chatDataSetup(e)),a.fateUsed=!0,this[`${i.postData.postFunction}`]({testData:a,cardOptions:t},{rerenderMessage:s}),await s.update({"flags.data.fatePointRerollUsed":!0}),await this.reduceSchips(n)}},"callback")},cancel:{icon:'',label:game.i18n.localize("cancel")}},default:"Yes"}).render(!0)}async fateaddQS(e,t,a,s,i,n){ChatMessage.create(g.chatDataSetup(e)),game.user.targets.forEach(r=>r.setTarget(!1,{user:game.user,releaseOthers:!1,groupSelection:!0})),t.fatePointAddQSUsed=!0,a.qualityStep=1,this[`${i.postData.postFunction}`]({testData:a,cardOptions:t},{rerenderMessage:s}),await s.update({"flags.data.fatePointAddQSUsed":!0}),await this.reduceSchips(n)}async fateImprove(e,t,a,s,i,n){ChatMessage.create(g.chatDataSetup(e)),this.resetTargetAndMessage(i,t);let r=s.flags.data.preData.source.type;if(["spell","liturgy","ceremony","ritual","skill"].includes(r)){let l=await renderTemplate("systems/dsa5/templates/dialog/fateImprove-dialog.html",{testData:a,postData:i.postData});new ae({title:game.i18n.localize("CHATFATE.selectDice"),content:l,buttons:{Yes:{icon:'',label:game.i18n.localize("Ok"),callback:u(async c=>{let m=[0,0,0],d=c.find(".dieSelected").map(function(){return Number($(this).attr("data-index"))}).get();if(d.length==1){m[d]=2;let p={name:game.i18n.localize("CHATCONTEXT.improveFate"),value:m.join("|"),type:"roll"};a.roll=Roll.fromData(a.roll),a.roll.editRollAtIndex([{index:d,val:Math.max(1,a.roll.terms[d*2].results[0].result-2)}]),a.situationalModifiers.push(p),this[`${i.postData.postFunction}`]({testData:a,cardOptions:t},{rerenderMessage:s}),await s.update({"flags.data.fateImproved":!0}),await this.reduceSchips(n)}},"callback")},cancel:{icon:'',label:game.i18n.localize("cancel")}},default:"Yes"}).render(!0)}else{let l={name:game.i18n.localize("CHATCONTEXT.improveFate"),value:2,type:"roll"};a.situationalModifiers.push(l),a.roll=Roll.fromData(a.roll),a.roll.editRollAtIndex([{index:0,val:Math.max(1,a.roll.terms[0].results[0].result-2)}]),this[`${i.postData.postFunction}`]({testData:a,cardOptions:t},{rerenderMessage:s}),await s.update({"flags.data.fateImproved":!0}),await this.reduceSchips(n)}}async reduceSchips(e){e==0?await this.update({"system.status.fatePoints.value":this.system.status.fatePoints.value-1}):await o.reduceGroupSchip()}static async reduceGroupSchip(){if(game.user.isGM){let e=game.settings.get("dsa5","groupschips").split("/").map(t=>Number(t));e[0]=e[0]-1,await game.settings.set("dsa5","groupschips",e.join("/"))}else game.socket.emit("system.dsa5",{type:"reduceGroupSchip",payload:{}})}async useFateOnRoll(e,t,a){if(t=="isTalented"||g.fateAvailable(this,a==1)){let s=e.flags.data,i=this.preparePostRollAction(e),n,r;a==0?(n=this.system.status.fatePoints.value-1,r="PointsRemaining"):(n=game.settings.get("dsa5","groupschips").split("/")[0],r="GroupPointsRemaining");let l=`

${game.i18n.localize("CHATFATE.fatepointUsed")}

${game.i18n.format("CHATFATE."+t,{character:""+this.name+""})}
- ${game.i18n.localize(`CHATFATE.${r}`)}: ${n}`,c=s.preData;c.extra.actor=g.getSpeaker(c.extra.speaker).toObject(!1),this[`fate${t}`](l,i,c,e,s,a)}}get horseSpeed(){return H.getHorseSpeed(this)}async _buildEmbedHTML(e,t={}){let a=`systems/dsa5/templates/items/browse/${this.type}.html`,s=await renderTemplate(a,{document:this,isGM:game.user.isGM,...await this.sheet.getData(),...t});return $(s)[0]}setupFallingDamage(e,t){let a=game.i18n.localize("fallingDamage"),s=this.items.find(n=>n.type=="skill"&&n.name==game.i18n.localize("LocalizedIDs.bodyControl")).toObject(),i={subtitle:` (${a})`,postFunction:{functionName:"game.dsa5.entities.Actordsa5.updateFallingDamage",options:e,tokenId:t,speaker:C.buildSpeaker(this,t)}};this.setupSkill(s,i,t).then(async n=>{n.testData.opposable=!1;let r=await this.basicTest(n,{suppressMessage:!0});await o.updateFallingDamage(i.postFunction,r),await R.renderRollCard(r.cardOptions,r.result,r.options.rerenderMessage)})}static async updateFallingDamage(e,t,a){let s=(t.result.qualityStep||0)*2;we(e.options,{availableQs:s});let i=g.getSpeaker(e.speaker),n=await i._setupFallingHeight(e.options,e.tokenId),r=await i.basicTest(n,{suppressMessage:!0}),l=await renderTemplate("systems/dsa5/templates/chat/roll/fallingdamage-card.html",r);t.result.other||(t.result.other=[]),t.result.other.push(l),t.chatData&&(t.chatData.other=[l])}_setupFallingHeight(e,t){let a=game.i18n.localize("fallingDamage"),s={source:{type:"fallingDamage"},opposable:!1,extra:{actor:this.toObject(!1),options:e,speaker:C.buildSpeaker(this,t)}},i=[],n={title:a,template:"systems/dsa5/templates/dialog/fallingdamage-dialog.html",data:{rollMode:e.rollMode,situationalModifiers:i,fallingFloorOptions:b.fallingConditions,modifier:e.modifier||0},callback:u((l,c={})=>(s.situationalModifiers=[],s.situationalModifiers.push({name:game.i18n.localize("fallingFloor"),value:l.find('[name="fallingFloor"]').val()}),r.rollMode=l.find('[name="rollMode"]:checked').val(),s.fallingHeight=l.find('[name="testModifier"]').val(),we(s.extra.options,c),{testData:s,cardOptions:r}),"callback")},r=this._setupCardOptions("systems/dsa5/templates/chat/roll/fallingdamage-card.html",a,t);return R.setupDialog({dialogOptions:n,testData:s,cardOptions:r})}setupRegeneration(e,t={},a){let s=game.i18n.localize("regenerationTest"),i={source:{type:"regenerate",system:{}},opposable:!1,extra:{statusId:e,actor:this.toObject(!1),options:t,speaker:C.buildSpeaker(this,a)}};i.extra.actor.isMage=this.system.isMage,i.extra.actor.isPriest=this.system.isPriest;let n=z.getRollModifiers(i.extra.actor,i.source),r={title:s,template:"systems/dsa5/templates/dialog/regeneration-dialog.html",data:{rollMode:t.rollMode,regenerationInterruptOptions:b.regenerationInterruptOptions,regnerationCampLocations:b.regnerationCampLocations,showAspModifier:this.system.isMage,showKapModifier:this.system.isPriest,situationalModifiers:n,modifier:t.modifier||0},callback:u((c,m={})=>{i.situationalModifiers=o._parseModifiers(c),l.rollMode=c.find('[name="rollMode"]:checked').val(),i.situationalModifiers.push({name:game.i18n.localize("camplocation")+" - "+c.find('[name="regnerationCampLocations"] option:selected').text(),value:c.find('[name="regnerationCampLocations"]').val()},{name:game.i18n.localize("interruption")+" - "+c.find('[name="regenerationInterruptOptions"] option:selected').text(),value:c.find('[name="regenerationInterruptOptions"]').val()}),i.regenerationFactor=c.find('[name="badEnvironment"]').is(":checked")?.5:1;let d=["LeP","KaP","AsP"],p={};for(let f of d){i[`${f}Modifier`]=Number(c.find(`[name="${f}Modifier"]`).val()||0),i[`regeneration${f}`]=Number(this.system.status.regeneration[`${f}max`]);let h=c.find(`[name="regenerate${f}"]`).is(":checked")?1:0;i[`regenerate${f}`]=h,h&&(p[`system.status.regeneration.${f}Temp`]=0)}return we(i.extra.options,m),this.update(p),{testData:i,cardOptions:l}},"callback")},l=this._setupCardOptions("systems/dsa5/templates/chat/roll/regeneration-card.html",s,a);return R.setupDialog({dialogOptions:r,testData:i,cardOptions:l})}setupDodge(e={},t){let a="dodge",s={source:{system:this.system.status[a],type:a},opposable:!1,extra:{statusId:a,actor:this.toObject(!1),options:e,speaker:C.buildSpeaker(this,t)}},i=[game.i18n.localize(a),game.i18n.localize("LocalizedIDs.wrestle")],n=[...C.buildCombatSpecAbs(this,["Combat"],i,"parry",s.source),...C.buildCombatSpecAbs(this,["animal"],void 0,"parry",s.source)],r=z.getRollModifiers(s.extra.actor,s.source),l=C.getDefenseMalus(r,this),c=N.multipleDefenseValue(this,s.source),m={rollMode:e.rollMode,combatSpecAbs:n,showDefense:!0,situationalModifiers:r,isRangeAttack:l,defenseCountString:game.i18n.format("defenseCount",{malus:c}),multipleDefenseValue:c,isDodge:!0},d={title:`${game.i18n.localize(a)} ${game.i18n.localize("Test")}`,template:"systems/dsa5/templates/dialog/combatskill-enhanced-dialog.html",data:m,callback:u((f,h={})=>(fe.resolveMeleeDialog(s,p,f,this,h,c,"parry"),Hooks.call("callbackDialogCombatDSA5",s,this,f,s.source,t),s.isRangeDefense=m.isRangeDefense,{testData:s,cardOptions:p}),"callback")},p=this._setupCardOptions("systems/dsa5/templates/chat/roll/status-card.html",d.title,t);return R.setupDialog({dialogOptions:d,testData:s,cardOptions:p})}setupCharacteristic(e,t={},a){let s=Ke(this.system.characteristics[e]),i=g.attributeLocalization(e)+" "+game.i18n.localize("Test");s.attr=e;let n={opposable:!1,source:{type:"char",system:s},extra:{characteristicId:e,actor:this.toObject(!1),options:t,speaker:C.buildSpeaker(this,a)}},r={title:i,template:"systems/dsa5/templates/dialog/characteristic-dialog.html",data:{rollMode:t.rollMode,difficultyLabels:b.attributeDifficultyLabels,modifier:t.modifier||0},callback:u((c,m={})=>(l.rollMode=c.find('[name="rollMode"]:checked').val(),n.testDifficulty=b.attributeDifficultyModifiers[c.find('[name="testDifficulty"]').val()],n.situationalModifiers=o._parseModifiers(c),we(n.extra.options,m),{testData:n,cardOptions:l}),"callback")},l=this._setupCardOptions("systems/dsa5/templates/chat/roll/characteristic-card.html",i,a);return R.setupDialog({dialogOptions:r,testData:n,cardOptions:l})}static _parseModifiers(e){return[...e.find('[name="situationalModifiers"] option:selected').map(function(){let t=this.value,a={name:this.textContent.trim().split("[")[0],value:isNaN(t)?t:Number(t),type:this.dataset.type};return a.type=="dmg"&&(a.damageBonus=a.value,a.value=0),this.dataset.specAbId&&(a.specAbId=this.dataset.specAbId),this.dataset.armorPen&&(a.armorPen=this.dataset.armorPen),a}).get(),{name:game.i18n.localize("manual"),value:Number(e.find('[name="testModifier"]').val()),type:""}]}static _prepareConsumable(e){return e.system.maxCharges&&(e.consumable=!0,e.structureMax=e.system.maxCharges,e.structureCurrent=e.system.charges),e}static prepareMag(e){return e.system.ammunitiongroup.value=="mag"&&(e.structureMax=e.system.mag.max,e.structureCurrent=e.system.mag.value),e}static _prepareitemStructure(e){e.system.structure&&e.system.structure.max!=0&&(e.structureMax=e.system.structure.max,e.structureCurrent=e.system.structure.value);let t=U(e,"flags.dsa5.enchantments");if(t&&t.length>0)e.enchantClass="rar";else if(e.effects.length>0)e.enchantClass="common";else if(e.system.effect&&e.system.effect.value!="")if(e.type=="armor")for(let a of e.system.effect.value.split(/,|;/).map(s=>s.trim())){let s=a.replace(/(\s+)/g," ").trim().split(" ");if(!(s.length==2&&[game.i18n.localize("CHARAbbrev.INI").toLowerCase(),game.i18n.localize("CHARAbbrev.GS").toLowerCase()].includes(s[1].toLowerCase())&&!isNaN(s[0])&&s[0]==-1)){e.enchantClass="common";break}}else e.enchantClass="common";return e}static _prepareMeleetrait(e,t){return e.attack=Number(e.system.at.value),e.system.pa!=0&&(e.parry=e.system.pa),this._parseDmg(e,t)}static _prepareMeleeWeapon(e,t,a,s=null,i=!0){let n=t.find(r=>r.name==e.system.combatskill.value);if(n){e.attack=Number(n.system.attack.value)+Number(e.system.atmod.value);let r=e.system.guidevalue.value.split("/").map(m=>a.system.characteristics[m]?Number(a.system.characteristics[m].initial)+Number(a.system.characteristics[m].modifier)+Number(a.system.characteristics[m].advances)+Number(a.system.characteristics[m].gearmodifier):0),l=Math.ceil(n.system.talentValue.value/2)+Math.max(0,Math.floor((Math.max(...r)-8)/3))+Number(game.settings.get("dsa5","higherDefense"));e.parry=l+Number(e.system.pamod.value)+(N.isShield(e)?Number(e.system.pamod.value):0),e.yieldedTwoHand=N.isYieldedTwohanded(e),e.yieldedTwoHand||(s||(s=a.items.filter(m=>m.type=="meleeweapon"&&m.system.worn.value&&m._id!=e._id&&!N.isYieldedTwohanded(m))),s.length>0&&(e.parry+=Math.max(...s.map(m=>m.system.pamod.offhandMod)),e.attack+=Math.max(...s.map(m=>m.system.atmod.offhandMod))));let c=0;if(e.system.worn.wrongGrip)if(e.yieldedTwoHand)e.parry-=1,c=1;else switch(e.system.reach.value="medium",game.i18n.localize(`LocalizedCTs.${e.system.combatskill.value}`)){case"Two-Handed Impact Weapons":case"Two-Handed Swords":if(e.parry-=3,new RegExp(game.i18n.localize("wrongGrip.wrongGripBastardRegex")).test(e.name))c=-2;else{let p=game.i18n.localize("wrongGrip.oneHanded");e.gripDamageText=` (${p} * 0.5)`,e.dmgMultipliers||=[],e.dmgMultipliers.push({name:p,val:"0.5"})}break;default:e.parry-=1,c=-1}if(e=this._parseDmg(e,a.system),e.system.guidevalue.value!="-"){let m=Math.max(...e.system.guidevalue.value.split("/").map(p=>Number(a.system.characteristics[p].value))),d=Math.max(m-Number(e.system.damageThreshold.value),0)+c;d>0&&(e.extraDamage=d,e.damageAdd=Roll.safeEval(e.damageAdd+" + "+Number(d)),e.damageAdd=(e.damageAdd>0?"+":"")+e.damageAdd)}if(W.weaponWearModifier(e),i){e.subweapons={};for(let m of Object.keys(U(e,"flags.dsa5.alternateAttacks")||{})){let d=this.buildSubweapon(e,m),p=this._prepareMeleeWeapon(d,t,a,s,!1);e.subweapons[m]=p}e.system.damageToolTip=W.damageTooltip(e)}}else i&&ui.notifications.error(game.i18n.format("DSAError.unknownCombatSkill",{skill:e.system.combatskill.value,item:e.name}));return e}static buildSubweapon(e,t){if(!t)return e;let a=Ke(e),s=U(e,`flags.dsa5.alternateAttacks.${t}`),i=foundry.utils.flattenObject(s);for(let n of Object.keys(i))(this.skipAlternateWeaponKeys.has(i[n])||i[n]==null||i[n]==null)&&delete i[n];return we(a,i),a}async actorEffects(){let e=["dead"];return game.user.isGM||this.testUserPermission(game.user,"OBSERVER")||!game.settings.get("dsa5","hideEffects")?this.effects.filter(a=>a.isVisibleEffect()):this.effects.filter(a=>e.some(s=>a.statuses.has(s)))}async _preCreate(e,t,a){await super._preCreate(e,t,a);let s={};e.img||(s.img="icons/svg/mystery-man-black.svg"),e.type=="character"&&we(s,{prototypeToken:{sight:{enabled:!0},actorLink:!0}}),this.updateSource(s)}async exclusiveEquipWeapon(e,t=!1){let a=this.items.get(e);if(!a)return;let s=[];switch(a.type){case"armor":case"rangeweapon":s=this.items.filter(l=>l.type==a.type&&l.id!=e&&l.system.worn.value).map(l=>({_id:l.id,"system.worn.value":!1})),s.push({_id:e,"system.worn.value":!0});break;case"meleeweapon":let n=this.items.filter(l=>l.type==a.type&&l.id!=e&&l.system.worn.value),r={_id:e,"system.worn.value":!0};N.isYieldedTwohanded(a)||(n=n.filter(l=>N.isYieldedTwohanded(l)||l.system.worn.offHand==t),r["system.worn.offHand"]=t),s=n.map(l=>({_id:l.id,"system.worn.value":!1})),s.push(r);break}s&&await this.updateEmbeddedDocuments("Item",s)}static _prepareRangeTrait(e,t){return e.attack=Number(e.system.at.value),e.LZ=Number(e.system.reloadTime.value),e.LZ>0&&o.buildReloadProgress(e),this._parseDmg(e,t)}static calcLZ(e,t){let a=1,s=0;e.system.combatskill.value==game.i18n.localize("LocalizedIDs.Throwing Weapons")?s=F.abilityStep(t,game.i18n.localize("LocalizedIDs.quickdraw"))*-1:e.system.combatskill.value==game.i18n.localize("LocalizedIDs.Crossbows")&&F.hasAbility(t,`${game.i18n.localize("LocalizedIDs.quickload")} (${game.i18n.localize("LocalizedIDs.Crossbows")})`)?a=.5:s=F.abilityStep(t,`${game.i18n.localize("LocalizedIDs.quickload")} (${game.i18n.localize(e.system.combatskill.value)})`)*-1;let i=`${e.system.reloadTime.value}`.split("/");if(e.system.ammunitiongroup.value=="mag"){let n=t.items.find(l=>l.id==e.system.currentAmmo.value||l._id==e.system.currentAmmo.value),r=0;n&&(n=g.toObjectIfPossible(n),n.system.mag.value<=0&&(r=1)),i=i[r]||i[0]}else i=i[0];return Math.max(0,Math.round(Number(i)*a)+s)}static _parseDmg(e,t,a=void 0){let s=new Roll(R.replaceDieLocalization(e.system.damage.value),t||{}),i="",n="",r="+";for(let l of s.terms)l.faces?i=l.number+"d"+l.faces:l.operator?r=l.operator:l.number&&(n+=`${r}${l.number}`);if(a){let l=U(a,"system.damageMod");Number(l)?n+=`+${Number(l)}`:l&&(e.damageBonusDescription=`, ${l} ${game.i18n.localize("CHARAbbrev.damage")} ${a.name}`)}return n&&(n=Roll.safeEval(n)),e.damagedie=i||"0d6",e.damageAdd=n!=""?(Number(n)>=0?"+":"")+n:"",e}static buildReloadProgress(e){let t=e.system.reloadTime.progress/e.LZ;e.title=game.i18n.format("WEAPON.loading",{status:`${e.system.reloadTime.progress}/${e.LZ}`}),e.progress=`${e.system.reloadTime.progress}/${e.LZ}`,t>=1&&(e.title=game.i18n.localize("WEAPON.loaded")),this.progressTransformation(e,t)}static progressTransformation(e,t){t>=.5?(e.transformRight="181deg",e.transformLeft=`${Math.round(t*360-179)}deg`):(e.transformRight=`${Math.round(t*360+1)}deg`,e.transformLeft=0)}static buildSpellChargeProgress(e){if(e.LZ=Number(e.system.castingTime.modified)||0,e.LZ>1){let t=e.system.castingTime.progress/e.LZ;e.title=game.i18n.format("SPELL.loading",{status:`${e.system.castingTime.progress}/${e.LZ}`}),e.progress=`${e.system.castingTime.progress}/${e.LZ}`,this.progressTransformation(e,t)}return e}static _prepareRangeWeapon(e,t,a,s,i=!0){let n=a.find(l=>l.name==e.system.combatskill.value);e.calculatedRange=e.system.reach.value;let r;if(n){if(e.attack=Number(n.system.attack.value),e.system.ammunitiongroup.value!="-"){e.ammo=t.filter(l=>l.system.ammunitiongroup.value==e.system.ammunitiongroup.value);for(let l of e.ammo)l.label=`(${l.system.quantity.value}) ${l.name}`;if(r=e.ammo.find(l=>l._id==e.system.currentAmmo.value),r){let l=Number(r.system.rangeMultiplier)||1;e.calculatedRange=e.calculatedRange.split("/").map(c=>Math.round(Number(c)*l)).join("/"),e.attack+=Number(r.system.atmod)||0,r.system.ammunitiongroup.value=="mag"&&(e.ammoMax=r.system.mag.max,e.ammoCurrent=r.system.mag.value)}}if(e.LZ=o.calcLZ(e,s),e.LZ>0&&o.buildReloadProgress(e),W.weaponWearModifier(e),i){e.subweapons={};for(let l of Object.keys(U(e,"flags.dsa5.alternateAttacks")||{})){let c=this.buildSubweapon(e,l),m=this._prepareRangeWeapon(c,t,a,s,!1);e.subweapons[l]=m}e.system.damageToolTip=W.damageTooltip(e)}}else i&&ui.notifications.error(game.i18n.format("DSAError.unknownCombatSkill",{skill:e.system.combatskill.value,item:e.name}));return this._parseDmg(e,s.system,r)}_setupCardOptions(e,t,a){let s=game.canvas?.tokens?.get(a),i={speaker:{alias:s?s.name:this.prototypeToken.name,actor:this.id},title:t,template:e,flags:{img:this.prototypeToken.randomImg?this.img:this.prototypeToken.img}};if(this.token)i.speaker.alias=this.token.name,i.speaker.token=this.token.id,i.speaker.scene=canvas.scene.id,i.flags.img=this.token.img;else{let n=ChatMessage.getSpeaker();n.actor==this.id&&(i.speaker.alias=n.alias,i.speaker.token=n.token,i.speaker.scene=n.scene,i.flags.img=n.token?canvas.tokens.get(n.token).img:i.flags.img)}return i}async swapMag(e){let t=this.items.get(e),a=this.items.get(t.system.currentAmmo.value);if(a&&a.system.quantity.value>1)return await this.updateEmbeddedDocuments("Item",[{_id:a.id,"system.quantity.value":a.system.quantity.value-1,"system.mag.value":a.system.mag.max}]),K.playEquipmentWearStatusChange(a),a;ui.notifications.error("DSAError.NoAmmo",{localize:!0})}async toggleStatusEffect(e,{active:t,overlay:a=!1}={}){let s=this.effects.find(i=>i.statuses.has(e));if(a){if(t)return!1;this.removeCondition(e,1,!1)}else if(!s||Number.isNumeric(U(s,"flags.dsa5.value"))){if(!t&&t!=null)return!1;await this.addCondition(e,1,!1,!1)}else{if(t)return!1;await this.removeCondition(e,1,!1)}}async payMiracles(e){if(!e.extra.miraclePaid){e.extra.miraclePaid=!0;let t=game.i18n.localize("LocalizedIDs.miracleMight"),a=game.i18n.localize("LocalizedIDs.miracle"),s=e.situationalModifiers.some(r=>r.name.trim()==t),i=e.situationalModifiers.some(r=>r.name.trim()==a),n=s?6:i?4:0;n&&await this.update({"system.status.karmaenergy.value":this.system.status.karmaenergy.value-n})}}async consumeAmmunition(e){if(e.extra.ammo&&!e.extra.ammoDecreased){if(e.extra.ammoDecreased=!0,e.extra.ammo._id){let t={_id:e.extra.ammo._id};e.extra.ammo.system.ammunitiongroup.value=="mag"?e.extra.ammo.system.mag.value<=0?(e.extra.ammo.system.quantity.value--,t["system.quantity.value"]=e.extra.ammo.system.quantity.value,t["system.mag.value"]=e.extra.ammo.system.mag.max-1):t["system.mag.value"]=e.extra.ammo.system.mag.value-1:(e.extra.ammo.system.quantity.value--,t["system.quantity.value"]=e.extra.ammo.system.quantity.value),await this.updateEmbeddedDocuments("Item",[t,{_id:e.source._id,"system.reloadTime.progress":0}])}}else(e.source.type=="rangeweapon"||e.source.type=="trait"&&e.source.system.traitType.value=="rangeAttack")&&!e.extra.ammoDecreased?(e.extra.ammoDecreased=!0,await this.updateEmbeddedDocuments("Item",[{_id:e.source._id,"system.reloadTime.progress":0}])):["spell","liturgy"].includes(e.source.type)&&e.extra.speaker.token!="emptyActor"&&await this.updateEmbeddedDocuments("Item",[{_id:e.source._id,"system.castingTime.progress":0,"system.castingTime.modified":0}])}_checkMaximumItemAdvancement(e,t){let a=0,s=P.vantageStep(this,`${game.i18n.localize(`LocalizedIDs.${e.type=="combatskill"?"exceptionalCombatTechnique":"exceptionalSkill"}`)} (${e.name})`);switch(e.type){case"combatskill":a=Math.max(...e.system.guidevalue.value.split("/").map(c=>this.system.characteristics[c].value))+2+s;break;case"spell":case"ritual":let n=0;for(let c of e.system.feature.replace(/\(a-z äöü-\)/gi,"").split(",").map(m=>m.trim()))if(F.hasAbility(this,`${game.i18n.localize("LocalizedIDs.propertyKnowledge")} (${c})`)){n=this.maxByAttr(e,s);break}a=Math.max(14+s,n);break;case"liturgy":case"ceremony":let r=new RegExp(`^${game.i18n.localize("LocalizedIDs.aspectKnowledge")}`),l=0;this.items.filter(c=>c.type=="specialability"&&r.test(c.name)).some(c=>e.system.distribution.value.includes(c.name.split("(")[1].split(")")[0]))&&(l=this.maxByAttr(e,s)),a=Math.max(14+s,l);break;case"skill":a=this.maxByAttr(e,s);break}let i=t<=a;return i||ui.notifications.error("DSAError.AdvanceMaximumReached",{localize:!0}),{result:i,max:a,maxBonus:s}}maxByAttr(e,t){return Math.max(this.system.characteristics[e.system.characteristic1.value].value,this.system.characteristics[e.system.characteristic2.value].value,this.system.characteristics[e.system.characteristic3.value].value)+2+t}async basicTest({testData:e,cardOptions:t},a={}){e=await R.rollDices(e,t);let s=await R.rollTest(e);if(e.extra.options.other&&(s.other||(s.other=[]),s.other.push(...e.extra.options.other)),s.postFunction="basicTest",game.user.targets.size){t.isOpposedTest=e.opposable;let i=` - ${game.i18n.localize("Opposed")}`;t.isOpposedTest&&t.title.match(i+"$")!=i&&(t.title+=i)}if(await this.consumeAmmunition(e),await this.payMiracles(e),!a.suppressMessage){let i=await R.renderRollCard(t,s,a.rerenderMessage);await ee.handleOpposedTarget(i),s.messageId=i.id}return{result:s,cardOptions:t,options:a}}async addCondition(e,t=1,a=!1,s=!1){if(e=="bleeding"||e.id=="bleeding")return await N.bleedingMessage(this);if(this.isToken&&!this.token?.object){console.warn("Actor token object is null for",this.name);return}return await z.addCondition(this,e,t,a,s)}async addTimedCondition(e,t=1,a=!1,s=!0,i={}){return e=="bleeding"||e.id=="bleeding"?await N.bleedingMessage(this):(typeof e=="string"&&i.duration&&(e=Ke(CONFIG.statusEffects.find(n=>n.id==e)),e.flags.dsa5.description=game.i18n.localize(e.name),e.name=game.i18n.localize(e.name),e.changes&&(e.changes=e.changes.map(n=>(/^system\.condition\./.test(n.key)&&(n.value=t),n))),e.statuses=[e.id],delete e.description,delete e.flags.dsa5.value,delete e.flags.dsa5.max,delete e.id,we(e,i)),await z.addCondition(this,e,t,a,s))}async initResistPainRoll(e){let t=game.settings.get("dsa5","selfControlOnPain");if(this.hasCondition("incapacitated"))return;if(t==2||t==1&&!this.hasPlayerOwner){await this.addCondition("incapacitated");return}let a=await renderTemplate("systems/dsa5/templates/chat/roll/resist-pain.html",{actor:this});await ChatMessage.create(g.chatDataSetup(a))}async finishResistPainRoll(){let e=this.items.find(t=>t.name==game.i18n.localize("LocalizedIDs.selfControl")&&t.type=="skill");this.setupSkill(e,{subtitle:` (${game.i18n.localize("ActiveEffects.resistRoll")})`},this.token?.id).then(async t=>{((await this.basicTest(t)).result.successLevel||0)<1&&this.addCondition("incapacitated")})}async removeCondition(e,t=1,a=!0,s=!1){return await z.removeCondition(this,e,t,a,s)}hasCondition(e){return z.hasCondition(this,e)}async markDead(e){let t=this.getActiveTokens();for(let a of t)a.combatant&&await a.combatant.update({defeated:e})}};function xn(){let o={Rq:"roll",Gc:"GC",Ch:"CH"},e={Rq:"dice",Gc:"dice",Ch:"user-shield",AP:"trophy",Pay:"coins",GetPaid:"piggy-bank"},t={Rq:"",Gc:`${game.i18n.localize("HELP.groupcheck")} `,Ch:"",AP:"",Pay:"",GetPaid:""},a=/(-|\+)?\d+/,s=/(-|\+)?\d+(\.\d+)?/,i=/\[[a-zA-ZöüäÖÜÄ&; -]+/,n=/options={[0-9a-zA-Z: ",]+}/,r=/[\[\]]/g,l={Pay:game.i18n.localize("PAYMENT.payButton"),GetPaid:game.i18n.localize("PAYMENT.getPaidButton"),AP:game.i18n.localize("MASTER.awardXP")};if(!b.statusRegex){let c=b.statusEffects.map(d=>game.i18n.localize(d.name).toLowerCase()),m=["status","condition","level","levels"].map(d=>game.i18n.localize(d)).join("|");b.statusRegex={effects:c,regex:new RegExp(`(${m}) (${c.join("|")})`,"gi")}}CONFIG.TextEditor.enrichers.push({pattern:/@(Rq|Gc|Ch)\[[a-zA-ZöüäÖÜÄ&; -]+ (-|\+)?\d+( options={[0-9a-zA-Z: ",]+})?\]({[a-zA-ZöüäÖÜÄß\(\)&; -]+})?/g,enricher:u((c,m)=>{let d=c[0],p=c[1],f=Number(d.match(a)[0]),h=d.match(n)?JSON.parse(d.match(n)[0].replace(/options=/,"")):{},y=encodeURIComponent(JSON.stringify(h)),k=d.replace(f,"").replace(n,"").match(i)[0].replace(r,"").trim(),D=d.match(/\]\{.*\}/)?d.match(/\]\{.*\}/)[0].replace(/[\]\{\}]/g,""):k;return h.attrs&&(D+=` (${h.attrs.split(",").join("/")}, ${game.i18n.localize("CHARAbbrev.FW")} ${h.fw||0})`),$(`${t[p]}${D} ${f}`)[0]},"enricher")},{pattern:/@(Pay|GetPaid|AP)\[(-|\+)?\d+(\.\d+)?\]({[a-zA-ZöüäÖÜÄß\(\)&; -0-9]+})?/g,enricher:u((c,m)=>{let d=c[0],p=c[1],f=Number(d.match(s)[0]),h=d.match(/\{.*\}/)?d.match(/\{.*\}/)[0].replace(/[\{\}]/g,""):l[p];return $(`${t[p]}${h} (${f})`)[0]},"enricher")},{pattern:b.statusRegex.regex,enricher:u((c,m)=>$(Js(c))[0],"enricher")},{pattern:/@Info\[[a-zA-ZöüäÖÜÄ&; -\.0-9]+\]/g,enricher:u(async(c,m)=>{let d=c[0].match(/(?:\[)(.*?)(?=\])/)[0].slice(1),p=await fromUuid(d);if(!p||p.type!="information")return $('info')[0];if(!game.user.isGM)return $(`${game.i18n.localize("GM notes")}`)[0];let f={enrichedqs1:await TextEditor.enrichHTML(p.system.qs1,{async:!0}),enrichedqs2:await TextEditor.enrichHTML(p.system.qs2,{async:!0}),enrichedqs3:await TextEditor.enrichHTML(p.system.qs3,{async:!0}),enrichedqs4:await TextEditor.enrichHTML(p.system.qs4,{async:!0}),enrichedqs5:await TextEditor.enrichHTML(p.system.qs5,{async:!0}),enrichedqs6:await TextEditor.enrichHTML(p.system.qs6,{async:!0}),enrichedCrit:await TextEditor.enrichHTML(p.system.crit,{async:!0}),enrichedBotch:await TextEditor.enrichHTML(p.system.botch,{async:!0}),enrichedFail:await TextEditor.enrichHTML(p.system.fail,{async:!0})},h=await renderTemplate("systems/dsa5/templates/items/infopreview.html",{item:p,enriched:f});return $(h)[0]},"enricher")},{pattern:/@EmbedItem\[[a-zA-ZöüäÖÜÄ&ë;'\(\)„“:,’ -\.0-9›‹âïîëßôñûé\/]+\]({[a-zA-Z=]+})?/g,enricher:u(async(c,m)=>{let d=c[0].match(/(?:\[)(.*?)(?=\])/)[0].slice(1),p;try{p=await fromUuid(d)}catch{p=null}if(!p){let k=d.split("."),D=game.packs.get(k[0]+"."+k[1]);D&&(p=await D.getDocuments({name:k[2]}),p=p[0])}if(!p)return $('')[0];let f=c[0],h=f.match(/\{.*\}/)?f.match(/\{.*\}/)[0].replace(/[\{\}]/g,""):"",y={};if(h)for(let k of h.split(" ")){let D=k.split("=");D.length==2&&(y[D[0]]=D[1])}return await p._buildEmbedHTML({values:[]},y)},"enricher")},{pattern:/@PostChat\[(.*?)\]/g,enricher:u(async(c,m)=>{let d=c[1];return $(`
${d}
`)[0]},"enricher")})}u(xn,"setEnrichers");function Js(o){let t=o[0].split(" "),a=t.shift();t=t.join(" ");let s=b.statusEffects[b.statusRegex.effects.indexOf(t.toLowerCase())];return`${a} ${t}`}u(Js,"conditionsMatcher");var{mergeObject:zn,duplicate:Pr}=foundry.utils,g=class o{static{u(this,"DSA5_Utility")}static async skillByName(e){let t=game.packs.get(this.getLanguagePack());await t.getIndex();let a=t.index.find(s=>s.name===e);return await t.getDocument(a._id)}static async allSkills(){return await this.getCompendiumEntries(this.getLanguagePack(),"skill")}static moduleEnabled(e){return game.modules.get(e)&&game.modules.get(e).active}static async allCombatSkills(){return await this.getCompendiumEntries(this.getLanguagePack(),"combatskill")}static getLanguagePack(){return game.i18n.lang=="de"?"dsa5.skills":"dsa5.skillsen"}static async getCompendiumEntries(e,t){let a=await game.packs.get(e);if(!a)return ui.notifications.error("No content found");let s=Array.isArray(t)?t:[t];return(await a.getDocuments()).filter(n=>s.includes(n.type)).map(n=>n.toObject())}static renderToggle(e){e.rendered?e._minimized?e.maximize():e.close():e.render(!0)}static calcTokenSize(e,t){let a=game.dsa5.config.tokenSizeCategories[e.system.status.size.value];if(a)if(a<1)zn(t,{texture:{scaleX:a,scaleY:a},width:1,height:1});else{let s=Math.floor(a),i=Math.max(a/s,.25);zn(t,{width:s,height:s,texture:{scaleX:i,scaleY:i}})}}static registerMasterTokens(e){o.moduleEnabled("dsa5-mastersworkshop")&&b.masterTokens.push(e)}static async allMoneyItems(){let e=game.settings.get("dsa5","moneyKompendium"),t=game.packs.get(e)?e:this.getLanguagePack();return(await this.getCompendiumEntries(t,"money")).sort((a,s)=>a.system.price.value-s.system.price.value).map(a=>(a.system.quantity.value=0,a))}static async allSkillsList(){return(await this.allSkills()||[]).map(e=>e.name).sort((e,t)=>e.localeCompare(t))}static async allCombatSkillsList(e){return((await this.allCombatSkills()).filter(t=>t.system.weapontype.value==e)||[]).map(t=>t.name).sort((t,a)=>t.localeCompare(a))}static async callItemTransformationMacro(e,t,a,s={}){let i=e.split("."),n=game.packs.get(`${i[0]}.${i[1]}`);if(!n)return console.warn(`Pack ${n} not found`),{};let r=await n.getDocuments({name:i[2]}),l={};if(r.length){let c=Object.getPrototypeOf(async function(){}).constructor,m=new c("args","source","effect",r[0].command);try{s.result=l,await m.call(this,s,t,a)}catch(d){ui.notifications.error("There was an error in your macro syntax. See the console (F12) for details"),console.error(d),l.error=!0}}else ui.notifications.error(game.i18n.format("DSAError.macroNotFound",{name:e}));return l}static isActiveGM(e=!1){let t=game.users.activeGM;return!t&&!e&&ui.notifications.warn("DSAError.requiresGM",{localize:!0}),t?.isSelf}static parseAbilityString(e){return{original:e.replace(/ (FP|SR|FW|SP)?[+-]?\d{1,2}$/,"").trim(),name:e.replace(/\((.+?)\)/g,"()").replace(/ (FP|SR|FW|SP)?[+-]?\d{1,2}$/,"").trim(),step:Number((e.match(/[+-]?\d{1,2}$/)||[1])[0]),special:(e.match(/\(([^()]+)\)/)||["",""])[1],type:e.match(/ (FP|SP)[+-]?\d{1,2}/)?"FP":e.match(/ (FW|SR)[+-]?\d{1,2}/)?"FW":"",bonus:e.match(/[-+]\d{1,2}$/)!=null}}static categoryLocalization(e){return game.i18n.localize(`TYPES.Item.${e}`)}static attributeLocalization(e){return game.i18n.localize(`CHAR.${e.toUpperCase()}`)}static attributeAbbrLocalization(e){return game.i18n.localize(`CHARAbbrev.${e.toUpperCase()}`)}static async callAsyncHooks(e,t){for(let a of b.asyncHooks[e])await a(...t)}static chatDataSetup(e,t,a,s){let i={user:game.user.id,rollMode:t||game.settings.get("core","rollMode"),content:e};return["gmroll","blindroll"].includes(i.rollMode)&&(i.whisper=ChatMessage.getWhisperRecipients("GM").map(n=>n.id)),i.rollMode==="blindroll"?i.blind=!0:i.rollMode==="selfroll"&&(i.whisper=[game.user]),a&&(i.speaker=ChatMessage.getSpeaker(),i.whisper=ChatMessage.getWhisperRecipients(a)),s&&(i.speaker=ChatMessage.getSpeaker(),i.whisper=s),i}static getSpeaker(e){let t=ChatMessage.getSpeakerActor(e);if(!t&&canvas.tokens){let a=canvas.tokens.get(e.token);a&&(t=a.actor)}if(!t){let a=game.scenes.get(e.scene);try{a&&(t=new Token(a.getEmbeddedDocument("Token",e.token))?.actor)}catch{}}return t}static fateAvailable(e,t){return t?game.settings.get("dsa5","groupschips").split("/").map(a=>Number(a))[0]>0:e.system.status.fatePoints.value>0}static _calculateAdvCost(e,t,a=1){return b.advancementCosts[t][Number(e)+a]}static async getFolderForType(e,t=null,a=null,s=0,i="",n=void 0){let r=await game.folders.contents.find(l=>l.name==a&&l.type==e&&l.folder?.id==t);return r||(r=await Folder.create({name:a,type:e,sorting:n||(e=="JournalEntry"?"a":"m"),color:i,sort:s,folder:t})),r}static toObjectIfPossible(e){return typeof e.toObject=="function"?e.toObject(!1):Pr(e)}static async showArtwork({img:e,name:t,uuid:a,isOwner:s},i=!1){return new ImagePopout(e,{title:i?s?t:"-":t,shareable:!0,uuid:a}).render(!0)}static async findAnyItem(e){let t=[],a=e.map(i=>i.name),s=e.map(i=>i.type);for(let i of game.items.contents){let n=a.indexOf(i.name);if(n>=0&&s[n]==i.type&&(a.splice(n,1),s.splice(n,1),t.push(i.toObject())),a.length<=0)break}if(a.length>0){let i=/^dsa5-core/,n=Array.from(game.packs.keys()).sort((r,l)=>(i.test(r)&&i.test(l)&&r.localeCompare(l),i.test(l)?-1:i.test(r)?1:r.localeCompare(l)));for(let r of n){let l=game.packs.get(r);if(l.documentName=="Item"&&(game.user.isGM||l.visible)&&(await l.getDocuments({name__in:a,type__in:s}).then(c=>{for(let m of c){let d=a.indexOf(m.name);d>=0&&s[d]==m.type&&(a.splice(d,1),s.splice(d,1),t.push(m.toObject()))}}),a.length<=0))break}}return t}static replaceDies(e,t=!1){let a=/( |^)(\d{1,2})?[wWdD][0-9]+((\+|-)[0-9]+)?/g,s=t?"":"/r ";return e.replace(a,function(i){return` [[${s}${i.replace(/[DwW]/,"d")}]]`})}static escapeRegex(e){return(typeof e=="string"||e instanceof String?e:"").replace(/[-[/\]{}()*+?.,\\^$|#\s]/g,"\\$&")}static replaceConditions(e){return e&&e.replace(b.statusRegex.regex,t=>Js([t]))}static experienceDescription(e){let t=[2100,1700,1400,1200,1100,1e3],a=["EXP.legendary","EXP.brillant","EXP.masterful","EXP.competent","EXP.experienced","EXP.average"],s=0;for(let i of t){if(Number(e)>=Number(i))return a[s];s++}return"EXP.inexperienced"}static async emptyActor(e=12,t="Alrik"){Array.isArray(e)||(e=[e,e,e,e,e,e,e,e]);let a=new O({name:t,type:"npc",items:[],system:{status:{wounds:{value:50},fatePoints:{}},characteristics:{mu:{initial:e[0]},kl:{initial:e[1]},in:{initial:e[2]},ch:{initial:e[3]},ff:{initial:e[4]},ge:{initial:e[5]},ko:{initial:e[6]},kk:{initial:e[7]}}}},{noHook:!0});return a.prepareData(),a}};var{mergeObject:Oe,getProperty:Ye}=foundry.utils,Je=class o{static{u(this,"Migrakel")}static async showDialog(e,t=!1){let a=!1,s=[{action:"yes",icon:"fa fa-check",label:"update",default:!0,callback:u(()=>!0,"callback")},{action:"cancel",icon:"fas fa-times",label:"cancel",callback:u(()=>!1,"callback")}];t&&s.push({action:"migrateAll",icon:"fas fa-exclamation-triangle ",label:"replace",callback:u(()=>2,"callback")});try{a=await foundry.applications.api.DialogV2.wait({window:{title:"Migrakel.Migration"},content:`

${e}

`,buttons:s})}catch{}return a}static async refreshStatusEffects(e){let t=[];for(let a of e.effects)a.origin&&t.push(a.id);await e.deleteEmbeddedDocuments("ActiveEffect",t)}static async updateVals(e,t,a){let s=game.dsa5.itemLibrary,i=[],n=[],r=new Map;if(await this.refreshStatusEffects(e),t({type:"equipment"})){let l=[],c=[];for(let d of e.items.filter(p=>p.type=="equipment"&&p.system.equipmentType.value=="bags")){let p=await s.findCompendiumItem(d.name,d.type);if(p.length>0){if(p=p.find(h=>h.name==d.name&&h.type==d.type),!p)continue;console.log(`MIGRATION - Updated ${d.name}`);let f=Oe(d.toObject(),a(p));c.push(f),l.push(d.id)}}let m=await e.createEmbeddedDocuments("Item",c);for(let d=0;dt(c)&&!(c.type=="equipment"&&c.system.equipmentType.value=="bags"))){let c=await s.findCompendiumItem(l.name,l.type);if(c.length>0){if(c=c.find(d=>d.name==l.name&&d.type==l.type),!c)continue;console.log(`MIGRATION - Updated ${l.name}`);let m=Oe(l.toObject(),a(c));m.system.parent_id&&r.has(m.system.parent_id)&&(m.system.parent_id=r.get(m.system.parent_id)),n.push(m),i.push(l.id)}}await e.createEmbeddedDocuments("Item",n),await e.deleteEmbeddedDocuments("Item",i),o.silent||ui.notifications.info("Migrakel.migrationDone",{localize:!0})}static async updateSpellsAndLiturgies(e,t=void 0){let a=t??await this.showDialog(game.i18n.localize("Migrakel.spells"),!0),s=u(i=>["spell","liturgy","ritual","ceremony","spellextension"].includes(i.type),"condition");if(a==2){let i=u(n=>{let r=n.toObject();return delete r.system.talentValue,r},"updator");await this.updateVals(e,s,i)}else if(a){let i=u(n=>{let r={effects:n.effects.toObject()};return n.type!="spellextension"&&(r.system={effectFormula:{value:n.system.effectFormula.value}}),r},"updator");await this.updateVals(e,s,i)}return a}static async updateSpecialAbilities(e,t=void 0){let a=t??await this.showDialog(game.i18n.localize("Migrakel.abilities"));if(a){let s=u(n=>{let r={effects:n.effects.toObject()};return["specialability","advantage","disadvantage","trait"].includes(n.type)&&Oe(r,{system:{effect:{value:n.system.effect.value}}}),n.type=="specialability"&&(Oe(r,{system:{category:{sub:n.system.category.sub||0},list:{value:n.system.list.value},effect:{value2:Ye(n,"system.effect.value2")||"",value3:Ye(n,"system.effect.value3")||""}}}),n.system.category.value=="staff"&&Oe(r,{system:{feature:Ye(n,"system.feature")||"",AsPCost:Ye(n,"system.AsPCost")||"",volume:Number(Ye(n,"system.volume"))||0,artifact:Ye(n,"system.artifact")||"",permanentEffects:Ye(n,"system.permanentEffects")||!1}})),this.updateMacro(r,n),r},"updator"),i=u(n=>["specialability","advantage","disadvantage","trait","essence","imprint"].includes(n.type),"condition");await this.updateVals(e,i,s)}return a}static async updateCombatskills(e,t=void 0){let a=t??await this.showDialog(game.i18n.localize("Migrakel.cskills"));if(a){let s=u(n=>({effects:n.effects.toObject()}),"updator"),i=u(n=>["combatskill"].includes(n.type),"condition");await this.updateVals(e,i,s)}return a}static async updateSkills(e,t=void 0){let a=t??await this.showDialog(game.i18n.localize("Migrakel.skills"));if(a){let s=u(n=>["skill"].includes(n.type),"condition"),i=u(n=>({img:n.img,effects:n.effects.toObject()}),"updator");await this.updateVals(e,s,i)}return a}static updateMacro(e,t){let a=t.getFlag("dsa5","onUseEffect");a&&Oe(e,{flags:{dsa5:{onUseEffect:a}}})}static async updateGear(e,t=void 0){let a=t??await this.showDialog(game.i18n.localize("Migrakel.gear"));if(a){let s=u(n=>["meleeweapon","armor","rangeweapon","equipment","poison","disease","consumable","ammunition"].includes(n.type),"condition"),i=u(n=>{let r={img:n.img,effects:n.effects.toObject()};return["poison","consumable","disease"].includes(n.type)||Oe(r,{system:{effect:{value:n.system.effect.value}}}),["armor"].includes(n.type)&&Oe(r,{system:{subcategory:n.system.subcategory}}),["meleeweapon","rangeweapon","armor"].includes(n.type)&&Oe(r,{system:{structure:{max:n.system.structure.max,value:n.system.structure.value}}}),this.updateMacro(r,n),r},"updator");await this.updateVals(e,s,i),await e.updateEmbeddedDocuments("Item",e.items.filter(n=>n.type=="money").map(n=>({_id:n.id,name:game.i18n.localize(n.name)})))}return a}};var Rt=class extends foundry.applications.api.HandlebarsApplicationMixin(foundry.applications.api.ApplicationV2){static{u(this,"DialogActorConfig")}static DEFAULT_OPTIONS={window:{title:"SHEET.actorConfig"}};static PARTS={main:{template:"systems/dsa5/templates/actors/parts/actorConfig.html"}};constructor(e,t){super(t),this.actor=e,this.lock=!1}async _prepareContext(e){let t=await super._prepareContext(e);return t.actor=this.actor,t}_onRender(e,t){super._onRender(t);let a=$(this.element);a.find(".updateSpells").on("click",async s=>this.updateWrapper("updateSpellsAndLiturgies",s)),a.find(".updateAbilities").on("click",async s=>this.updateWrapper("updateSpecialAbilities",s)),a.find(".updatecSkills").on("click",async s=>this.updateWrapper("updateCombatskills",s)),a.find(".updateSkills").on("click",async s=>this.updateWrapper("updateSkills",s)),a.find(".updateGear").on("click",async s=>this.updateWrapper("updateGear",s))}async updateWrapper(e,t){this.lock||(this.lock=!0,$(t.currentTarget).prepend(''),await Je[e](this.actor),$(t.currentTarget).find("i").remove(),this.lock=!1)}};function Qe(o,e="img"){game.user.isGM&&o.find(e).each(function(t,a){a.setAttribute("draggable",!0),a.addEventListener("dragstart",s=>Lr(s))})}u(Qe,"bindImgToCanvasDragStart");var Lr=u(o=>{canvas.tiles.activate();let e=o.currentTarget.src,t=o.currentTarget,a=canvas.dimensions.sceneHeight/t.naturalHeight,s=canvas.dimensions.sceneWidth/t.naturalWidth,i=Math.min(1,s,a),n=Math.round(canvas.dimensions.size/i),r={type:"Tile",texture:{src:e},tileSize:n};o.dataTransfer.setData("text/plain",JSON.stringify(r));let l=t.naturalWidth*i*canvas.stage.scale.x,c=t.naturalHeight*i*canvas.stage.scale.y,m=DragDrop.createDragImage(t,l,c);o.dataTransfer.setDragImage(m,l/2,c/2)},"dragTileImg");var{getProperty:_r,mergeObject:Nn}=foundry.utils,Pt=class extends FormApplication{static{u(this,"ForeignFieldEditor")}constructor(e,t,a){super(),this.editfield=t,this.actorId=e,this.fieldname=a;let s=game.actors.get(this.actorId);this.object={fieldContent:_r(s,this.editfield)}}static get defaultOptions(){let e=super.defaultOptions;return Nn(e,{resizable:!0,width:600,height:600}),e}isEditable(){return!0}get title(){return`${game.actors.get(this.actorId).name} - ${game.i18n.localize(this.fieldname)}`}async _updateObject(e,t){game.socket.emit("system.dsa5",{type:"updateKeepField",payload:{actorId:this.actorId,field:this.editfield,updateData:t.fieldContent}})}async getData(e){let t=super.getData(e);return Nn(t,{fieldContent:this.object.fieldContent}),t}get template(){return"systems/dsa5/templates/dialog/foreignfieldeditor.html"}activateListeners(e){super.activateListeners(e)}};var{mergeObject:Fr,randomID:Hr}=foundry.utils,xe=class o extends Application{static{u(this,"Trade")}static get defaultOptions(){let e=super.defaultOptions;return e.template="systems/dsa5/templates/actors/merchant/merchant-trade.html",e.width=900,e.resizable=!0,e.tabs=[{navSelector:".tabs",contentSelector:".content",initial:"main"}],e.title=game.i18n.localize("MERCHANT.exchange"),e.classes.push("noscrollWizard"),e.scrollY=[".scrollable"],e}constructor(e,t,a={}){super(),this.tradeData={offered:{},offer:{},id:a.id||Hr(),sourceId:e,targetId:t,offerAccepted:!1,offeredAccepted:!1}}async startTrade(){game.socket.emit("system.dsa5",{type:"startTrade",payload:{sourceId:this.tradeData.sourceId,targetId:this.tradeData.targetId,id:this.tradeData.id}}),this.render(!0)}_filterGear(e){if(e.val()!=null){let t=e.val().toLowerCase().trim(),a=$(this.element).find(".inventory .item");a.removeClass("filterHide"),a.filter(function(){return $(this).find("a.item-edit").text().toLowerCase().trim().indexOf(t)==-1}).addClass("filterHide")}}async getData(){let e=await super.getData(),t=g.getSpeaker(this.tradeData.sourceId),a=t.prepareItems({details:[]});a.inventory.money={items:a.money.coins.map(s=>(s.name=game.i18n.localize(s.name),s)),show:!0,dataType:"money"};for(let s of Object.values(a.inventory))for(let i of s.items)this.tradeData.offer[i._id]&&(i.system.quantity.value-=this.tradeData.offer[i._id].system.quantity.value);return Fr(e,{tradeData:this.tradeData,actor:g.getSpeaker(this.tradeData.targetId),tradeFriend:t,inventory:a}),e}static findTradeApp(e){for(let t of Object.values(ui.windows))if(t instanceof this&&t?.tradeData?.id===e)return t;return!1}async close(e={}){return e.skipSocket||game.socket.emit("system.dsa5",{type:"tradeCanceled",payload:{id:this.tradeData.id}}),super.close(e)}activateListeners(e){super.activateListeners(e),e.find(".trade").click(s=>this._offerItem(s));let t=u(s=>this._filterGear($(s.currentTarget)),"filterGear");e.find(".item-edit").click(s=>this._editItem(s,this.tradeData.sourceId)),e.find(".item-external-edit").click(s=>this._editItem(s,this.tradeData.targetId)),e.find(".acceptTrade").click(s=>this.acceptTrade(s));let a=e.find(".gearSearch");a.keyup(s=>t(s)),a[0]&&a[0].addEventListener("search",t,!1)}_editItem(e,t){g.getSpeaker(t).items.get(e.currentTarget.dataset.itemId).sheet.render(!0)}_offerItem(e){if(this.tradeData.offerAccepted)return;let t=e.currentTarget.dataset.itemId,s=g.getSpeaker(this.tradeData.sourceId).items.get(t),i=e.ctrlKey?10:1,n=e.currentTarget.dataset.stopTrade,r=n?this.tradeData.offer[t].system.quantity.value:s.system.quantity.value;s&&(n?(this.tradeData.offer[t].system.quantity.value-=Math.min(i,r),this.tradeData.offer[t].system.quantity.value<=0&&delete this.tradeData.offer[t],this.offerChanged(),this.render()):(this.tradeData.offer[t]?r-=this.tradeData.offer[t].system.quantity.value:(this.tradeData.offer[t]=s.toObject(),this.tradeData.offer[t].system.quantity.value=0),r>0&&(this.tradeData.offer[t].system.quantity.value+=Math.min(i,r),this.offerChanged(),this.render())),K.playMoneySound())}async offerChanged(){game.socket.emit("system.dsa5",{type:"receiveOfferedItems",payload:{id:this.tradeData.id,trader:this.tradeData.sourceId,offered:this.tradeData.offer}})}static receiveOfferedItems(e){let t=this.findTradeApp(e.payload.id);t&&(e.payload.trader==t.tradeData.sourceId?(t.tradeData.offer=e.payload.offered,t.tradeData.offerAccepted=!1):(t.tradeData.offered=e.payload.offered,t.tradeData.offeredAccepted=!1),t.render())}static isGMTrade(e){return game.user.isGM&&!e.hasPlayerOwner}static isPlayerTrade(e){return!game.user.isGM&&e.isOwner}static socketStartTrade(e){let t=g.getSpeaker(e.payload.targetId);(this.isGMTrade(t)||this.isPlayerTrade(t))&&new o(e.payload.targetId,e.payload.sourceId,{id:e.payload.id}).render(!0)}acceptTrade(){this.tradeData.offerAccepted=!this.tradeData.offerAccepted,this.render(!0),game.socket.emit("system.dsa5",{type:"acceptTrade",payload:{id:this.tradeData.id,accepted:this.tradeData.offerAccepted}})}static tradeWasAccepted(e){let t=this.findTradeApp(e.payload.id);t&&(t.tradeData.offeredAccepted=e.payload.accepted,t.tradeData.offerAccepted&&t.tradeData.offeredAccepted?(t.finishTrade(),K.playMoneySound()):t.render())}async finishTrade(){g.isActiveGM()&&await o.updateData(this.tradeData),game.socket.emit("system.dsa5",{type:"tradeFinished",payload:{id:this.tradeData.id,tradeData:this.tradeData}}),this.close({skipSocket:!0}),K.playMoneySound()}static async updateData(e){let t=g.getSpeaker(e.sourceId),a=g.getSpeaker(e.targetId);await this.modifyActor(t,e.offer,e.offered),await this.modifyActor(a,e.offered,e.offer)}static async modifyActor(e,t,a){let s=[],i=[];for(let n of Object.keys(t)){let r=e.items.get(n);r&&(r.system.quantity.value<=t[n].system.quantity.value&&r.type!="money"?s.push(n):i.push({_id:n,"system.quantity.value":r.system.quantity.value-t[n].system.quantity.value}))}await e.deleteEmbeddedDocuments("Item",s,{render:!1}),await e.updateEmbeddedDocuments("Item",i,{render:!1});for(let n of Object.values(a))await e.sheet._manageDragItems(n,n.type)}static tradeWasFinished(e){let t=this.findTradeApp(e.payload.id);g.isActiveGM()&&o.updateData(e.payload.tradeData),t&&t.close({skipSocket:!0})}static tradeWasCanceled(e){let t=this.findTradeApp(e.payload.id);t&&t.close({skipSocket:!0})}static socketListeners(e){switch(e.type){case"receiveOfferedItems":return this.receiveOfferedItems(e),!0;case"startTrade":return this.socketStartTrade(e),!0;case"acceptTrade":return this.tradeWasAccepted(e),!0;case"tradeCanceled":return this.tradeWasCanceled(e),!0;case"tradeFinished":return this.tradeWasFinished(e),!0}}},ua=class extends Application{static{u(this,"TradeOptions")}constructor(e,t){super(t),this.actorId=C.buildSpeaker(e,e.token?.id)}async getData(e){let t=await super.getData(e);return t.actors=game.actors.filter(a=>a.hasPlayerOwner&&a.id!=this.actorId.actor),t}static get defaultOptions(){let e=super.defaultOptions;return e.template="systems/dsa5/templates/actors/merchant/merchant-tradeoptions.html",e.resizable=!0,e.title=game.i18n.localize("MERCHANT.exchange"),e}_startTrade(e){let t=game.actors.get(e.currentTarget.dataset.id);new xe(this.actorId,C.buildSpeaker(t,t.token?.id)).startTrade(),this.close()}activateListeners(e){super.activateListeners(e),e.find(".startTrade").on("dblclick",t=>this._startTrade(t))}};var{getProperty:jr,mergeObject:pa,duplicate:Gr}=foundry.utils,Xe=class o extends Application{static{u(this,"TokenHotbar2")}static attackTypes=new Set(["meleeweapon","rangeweapon"]);static traitTypes=new Set(["meleeAttack","rangeAttack"]);static spellTypes=new Set(["liturgy","spell"]);static registerTokenHotbar(){game.dsa5.apps.tokenHotbar||(game.dsa5.apps.tokenHotbar=new o,game.dsa5.apps.tokenHotbar.updateDSA5Hotbar(),game.settings.get("dsa5","disableTokenhotbar")||game.dsa5.apps.tokenHotbar.render(!0),Hooks.call("dsa5TokenHotbarReady",game.dsa5.apps.tokenHotbar))}constructor(e){if(super(e),this.searching="",o.combatSkills=["selfControl","featOfStrength","bodyControl","perception","loyalty"].map(a=>game.i18n.localize(`LocalizedIDs.${a}`)),o.defaultSkills=new Set([game.i18n.localize("LocalizedIDs.perception")]),game.user.isGM){this.callbackFunctions={};let a=game.settings.get("dsa5","enableMasterTokenFunctions");this.gmItems=[{name:"gmMenu",disabled:a.masterMenu,icon:"systems/dsa5/icons/categories/DSA-Auge.webp",id:"masterMenu",cssClass:"gm",abbrev:"",subfunction:"gm"},{name:"MASTER.randomPlayer",disabled:a.randomVictim,iconClass:"fa fa-dice-six",id:"randomVictim",cssClass:"gm",abbrev:"",subfunction:"gm"},{name:"TT.tokenhotbarMoney",disabled:a.payMoney,icon:"systems/dsa5/icons/money-D.webp",id:"payMoney",cssClass:"gm",abbrev:"",subfunction:"gm"}]}let t=u(a=>{let s=a.parent?a.parent.id:void 0;s&&o.hookUpdate(s)},"parentUpdate");Hooks.on("controlToken",(a,s)=>{game.dsa5.apps.tokenHotbar?.updateDSA5Hotbar()}),Hooks.on("updateActor",(a,s)=>{o.hookUpdate(a.id)}),Hooks.on("updateToken",(a,s,i)=>{game.dsa5.apps.tokenHotbar&&s._id==jr(game.dsa5.apps.tokenHotbar,"actor.prototypeToken.id")&&game.dsa5.apps.tokenHotbar.updateDSA5Hotbar()}),Hooks.on("updateOwnedItem",(a,s)=>{o.hookUpdate(a.data.id)}),Hooks.on("createOwnedItem",(a,s)=>{o.hookUpdate(a.data.id)}),Hooks.on("deleteOwnedItem",(a,s)=>{o.hookUpdate(a.data.id)}),Hooks.on("updateItem",(a,s)=>{t(a)}),Hooks.on("createItem",(a,s)=>{t(a)}),Hooks.on("deleteItem",(a,s)=>{t(a)}),Hooks.on("deleteActiveEffect",(a,s)=>{t(a)}),Hooks.on("updateActiveEffect",(a,s)=>{t(a)}),Hooks.on("createActiveEffect",(a,s)=>{t(a)}),Hooks.on("canvasInit",()=>{this.rendered&&this.render()})}registerMasterFunction(e,t){let a=game.settings.get("dsa5","enableMasterTokenFunctions");e.disabled=a[e.id],this.gmItems.push(e),this.callbackFunctions[e.id]=t}async prepareSkills(){let e=await g.allSkills();return this.skills=e.map(t=>({name:t.name,icon:t.img,id:t.name,cssClass:"skillgm",addClass:t.system.group.value,abbrev:t.name[0],subfunction:"skillgm"})),this.skills=this.skills.sort((t,a)=>t.addClass.localeCompare(a.addClass)||t.name.localeCompare(a.name)),this.skills}static hookUpdate(e){e==game.dsa5.apps.tokenHotbar?.actor?.id?game.dsa5.apps.tokenHotbar.updateDSA5Hotbar():ui.hotbar.token?.actor?.id==e&&ui.hotbar.updateDSA5Hotbar()}resetPosition(){let e=$("#hotbar").first().position(),t=game.settings.get("dsa5","tokenhotbarSize");this.position.left=e.left+8,this.position.top=e.top-t-25}static get defaultOptions(){let e=super.defaultOptions,t=$("#hotbar").first().position(),a=game.settings.get("dsa5","tokenhotbarSize"),s=game.settings.get("dsa5","tokenhotbarPosition");return pa(e,{classes:e.classes.concat(["dsa5","tokenQuickHot"]),itemWidth:a,resizable:!1,height:a+45,zIndex:61,left:t.left+8,top:t.top-a-25,template:"systems/dsa5/templates/status/tokenHotbar.html",title:"TokenHotbar"}),pa(e,s),e}async _onWheelResize(e){let t=game.settings.get("dsa5","tokenhotbarSize");e.originalEvent.deltaY>0?t=Math.min(100,t+5):t=Math.max(15,t-5),await game.settings.set("dsa5","tokenhotbarSize",t),await this.render(!0)}async _cycleLayout(e){if(e.button==2){let t=game.settings.get("dsa5","tokenhotbarLayout")+1;t==4&&(t=0),await game.settings.set("dsa5","tokenhotbarLayout",t),await this.render(!0)}}changeDarkness(e){let t=Number(e.currentTarget.value);canvas.scene&&canvas.scene.update({"environment.darknessLevel":t},{animateDarkness:3e3}),ge(`${game.i18n.localize("MASTER.darkness")} ${t}`)}activateListeners(e){super.activateListeners(e);let t=e.find(".dragHandler");t[0]&&new Draggable(this,e,t[0],this.options.resizable),t.on("wheel",async i=>(i.stopPropagation(),i.preventDefault(),await this._onWheelResize(i),!1)),e.find(".itdarkness input").change(i=>this.changeDarkness(i));let a=this,s=u(function(i){return a.filterButtons(i),!1},"fn");e.find(".filterable").hover(function(){$(document).on("keydown",s)},function(){$(document).off("keydown",s)}),e.find(".quantity-click").mousedown(i=>N.quantityClick(i)),e.on("mousedown","li",async i=>(i.stopPropagation(),await this.executeQuickButton(i),!1)),e.on("mouseenter","li.primary",i=>{let n=i.currentTarget.dataset.category;this.category=n,setTimeout(()=>{e.find(".secondary").removeClass("shown"),n==this.category&&e.find(`.secondary[data-category="${n}"]`).addClass("shown")},700)}),e.on("mouseleave","li.primary",i=>{let n=i.currentTarget.dataset.category;this.category=void 0,setTimeout(()=>{n!=this.category&&(a.searching="",$(i.currentTarget).find(".secondary").removeClass("dsahidden"),e.find(`.secondary[data-category="${n}"]`).removeClass("shown"))},50)})}async handleEffect(e,t,a,s){let i=t.effects.get(a),n=[...i.statuses][0];e.button==0?n?await t.addCondition(n,1,!1,!1):i.sheet.render(!0):e.button==2&&(n?await t.removeCondition(n,1,!1):await t.sheet._deleteActiveEffect(a))}async handleGMRoll(e){let t=e.currentTarget.dataset.id,a=Math.round($(e.currentTarget).closest(".tokenHotbarInner,#hotbar").find(".modifierVal").val());e.ctrlKey?game.dsa5.apps.DSA5ChatListeners.check3D20(void 0,t,{modifier:a}):e.button==2?game.dsa5.macro.requestGC(t,a,{maxRolls:7}):game.dsa5.macro.requestRoll(t,a)}async handleSkillRoll(e,t,a,s,i=void 0){let n={};if(e.button==2&&(n.rollMode="blindroll"),a=="rideLoyaltyID")H.rollLoyalty(t,n);else if(a=="attackWeaponless")t.setupWeaponless("attack",n,s).then(r=>{t.basicTest(r)});else{let r=t?.items.get(a);if(r){if(e.originalEvent.ctrlKey)return r.sheet.render(!0);switch(r.type){case"meleeweapon":case"rangeweapon":e.originalEvent.altKey?r.update({"system.worn.value":!1}):r.system.worn.value?(r=O.buildSubweapon(r,i),t.setupWeapon(r,"attack",n,s).then(c=>{t.basicTest(c)})):t.exclusiveEquipWeapon(r.id,e.button==2);break;case"trait":t.setupWeapon(r,"attack",n,s).then(c=>{t.basicTest(c)});break;case"liturgy":case"spell":t.setupSpell(r,n,s).then(c=>{t.basicTest(c)});break;case"skill":t.setupSkill(r,n,s).then(c=>{t.basicTest(c)});break;case"consumable":await foundry.applications.api.DialogV2.confirm({window:{title:game.i18n.localize("SHEET.ConsumeItem")+": "+r.name},content:game.i18n.localize("SHEET.ConsumeItem")+": "+r.name,rejectClose:!1,modal:!0})&&(await r.setupEffect(null,{},s),await this.updateDSA5Hotbar());break}}}}async handleTradeStart(e,t,a,s){if(!game.user.targets.size)return ui.notifications.error("DIALOG.noTarget",{localize:!0});for(let i of game.user.targets)i.actor&&new xe(C.buildSpeaker(t,s),C.buildSpeaker(i.actor,i.id)).startTrade()}async handleOnUse(e,t,a,s){let i=t.items.get(a);await new J(i).executeOnUseEffect()}async handleEnchantment(e,t,a,s){let i=a.split("_"),n=t.items.get(i[0]);if(e.button==2)n&&n.sheet.render(!0);else{let r=n.getFlag("dsa5","enchantments");n.sheet.rollEnchantment(i[1],r)}}async handleGM(e,t,a,s){switch(a){case"masterMenu":g.renderToggle(game.dsa5.apps.gameMasterMenu);break;case"payMoney":this.payMoney(e);break;case"randomVictim":this.handleGMRandomVictim(e);break;default:a in this.callbackFunctions&&this.callbackFunctions[a](e,t,a,s)}}payMoney(e){let t=`${$(e.currentTarget).closest(".tokenHotbarInner,#hotbar").find(".modifierVal").val()}`;e.button==2?Q.createGetPaidChatMessage(t):Q.createPayChatMessage(t)}async handleGMRandomVictim(e){let t=await game.dsa5.apps.gameMasterMenu.rollRandomPlayer(e.button==2),a=game.actors.get(t);if(a){let s=await g.showArtwork(a);e.originalEvent.ctrlKey||setTimeout(()=>{s.close()},2e3)}}async handleSharedEffect(e){for(let t of canvas.tokens.controlled){let a=t.actor,s=t.id,i=a.effects.find(n=>n.name==e.currentTarget.dataset.name)?.id;await this.handleEffect(e,a,i,s)}}async executeQuickButton(e){let t=canvas.tokens.controlled[0]?.actor,a=canvas.tokens.controlled[0]?.id,s=e.currentTarget.dataset.id,i=e.currentTarget.dataset.subfunction,n=e.currentTarget.dataset.subweapon;switch(i){case"trade":this.handleTradeStart(e,t,s,a);break;case"addEffect":Lt.showDialog();break;case"effect":this.handleEffect(e,t,s,a);break;case"sharedEffect":this.handleSharedEffect(e);break;case"onUse":this.handleOnUse(e,t,s,a);break;case"gm":this.handleGM(e,t,s,a);break;case"none":case"darkness":break;case"skillgm":this.handleGMRoll(e);break;case"enchantment":this.handleEnchantment(e,t,s,a);break;default:this.handleSkillRoll(e,t,s,a,n)}}subWidth(e,t,a=7){return`style="width:${Math.ceil(e.length/a)*200}px"`}async getData(){let e=await super.getData(),t=this.actor,a={attacks:[],spells:[],default:[],skills:[],functions:[],gm:[]},s,i,n=[],r=[],l=[],c=game.settings.get("dsa5","tokenhotbarLayout"),m=c%2,d=o.defaultOptions.itemWidth,p=!1;if(t){let h=[],y=[],k=H.isRiding(t),D=game.i18n.localize("LocalizedIDs.riding");if(l=await this._effectEntries(t),game.combat){let v=t.items.filter(A=>A.type=="combatskill").map(A=>O._calculateCombatSkillValues(A.toObject(),t.system)),I=this._brawlEntry(v);I&&a.attacks.push(I);for(let A of t.items)A.type=="skill"&&(o.combatSkills.some(j=>A.name.startsWith(j))||k&&D==A.name)&&a.default.push(this._skillEntry(A,"skill filterable")),A.type=="trait"&&o.traitTypes.has(A.system.traitType.value)?a.attacks.push(this._traitEntry(A,t.system)):o.attackTypes.has(A.type)&&A.system.worn.value==!0?a.attacks.push(...this._combatEntry(A,v,t)):o.spellTypes.has(A.type)?A.system.effectFormula.value?a.spells.push(this._skillEntry(A,"spell filterable")):y.push(this._skillEntry(A,"spell filterable")):A.type=="skill"?h.push(this._skillEntry(A,"skill filterable",{addClass:A.system.group.value})):A.type=="consumable"&&n.push(this._actionEntry(A,"consumable",{abbrev:A.system.quantity.value})),A.getFlag("dsa5","onUseEffect")&&r.push(this._actionEntry(A,"onUse",{subfunction:"onUse"}));if(s=n.pop(),k){let A=this._ridingEntry(t);A&&a.default.push(A)}}else{let v=[];for(let I of t.items){if(I.type=="skill"&&(o.defaultSkills.has(I.name)||k&&D==I.name)&&a.default.push(this._skillEntry(I,"skill filterable")),I.type=="skill"){let A=this._skillEntry(I,"skill filterable",{addClass:I.system.group.value});I.system.talentValue.value>0&&v.push(A),h.push(A)}else o.spellTypes.has(I.type)&&(I.system.effectFormula.value?a.spells.push(this._actionEntry(I,"spell filterable")):y.push(this._actionEntry(I,"spell filterable")));I.getFlag("dsa5","onUseEffect")&&r.push(this._actionEntry(I,"onUse",{subfunction:"onUse"}))}a.skills.push(...v.sort((I,A)=>A.tw-I.tw).slice(0,5))}i=r.pop(),a.functions=this._functionEntries(),a.spells.length==0&&y.length>0&&a.spells.push(y.pop()),a.spells.length>0&&y.length>0&&(a.spells[0].more=y.sort((v,I)=>v.name.localeCompare(I.name)),a.spells[0].subwidth=this.subWidth(y,d)),a.default.length>0&&h.length>0&&(a.default[0].more=h.sort((v,I)=>v.addClass.localeCompare(I.addClass)||v.name.localeCompare(I.name)),a.default[0].subwidth=this.subWidth(h,d,20)),s&&(n.length>0&&(s.more=n,s.subwidth=this.subWidth(n,d)),a.consumables=[s]),i&&(r.length>0&&(i.more=r,i.subwidth=this.subWidth(r,d)),a.onUsages=[i])}else if(game.user.isGM&&!game.settings.get("dsa5","disableTokenhotbarMaster")){p=!0;let h=this.skills||await this.prepareSkills();a.gm=this._gmEntries().concat([{name:"TT.tokenhotbarSkill",id:"skillgm",icon:"systems/dsa5/icons/categories/Skill.webp",cssClass:"skillgm filterable",abbrev:"",subfunction:"none",more:h,subwidth:this.subWidth(h,d,20)}])}if(this.showEffects){let y={name:"CONDITION.add",id:"",icon:"icons/svg/aura.svg",cssClass:"effect",abbrev:game.i18n.localize("CONDITION.add")[0],subfunction:"addEffect"};if(l.length>0)y.more=l,y.subwidth=this.subWidth(l,d);else if(canvas.tokens.controlled.length>1){let k=await this.tokenHotbar._effectEntries(canvas.tokens.controlled[0].actor,{subfunction:"sharedEffect"});for(let D of canvas.tokens.controlled){let v=(await D.actor.actorEffects()).map(I=>I.name);k=k.filter(I=>v.includes(I.name))}y.more=k,y.subwidth=this.subWidth(k,d)}a.effects=[y]}let f=Object.keys(a).reduce((h,y)=>h+a[y].length,0)+(p?3:0);return m?(this.position.width=d,this.position.height=d*f+14):(this.position.width=d*f+14,this.position.height=d),pa(e,{items:a,itemWidth:d,direction:c,count:f,gmMode:p,darkness:canvas?.scene?.environment.darknessLevel||0,opacity:game.settings.get("dsa5","tokenhotbaropacity")}),e}_functionEntries(){let e=game.i18n.localize("MERCHANT.exchangeWithTarget");return[{name:e,id:"trade",cssClass:"function",abbrev:e[0],iconClass:"coinIcon",subfunction:"trade"}]}_brawlEntry(e){let t=e.find(a=>a.name==game.i18n.localize("LocalizedIDs.wrestle"));if(t)return{name:game.i18n.localize("attackWeaponless"),id:"attackWeaponless",icon:"systems/dsa5/icons/categories/attack_weaponless.webp",attack:t.system.attack.value,damage:"1d6",cssClass:"zbrawl"}}_ridingEntry(e){let t=H.getHorse(e);if(t){let a=H.getLoyaltyFromHorse(t);if(a)return{name:`${a.name} (${a.system.talentValue.value})`,id:"rideLoyaltyID",icon:a.img,cssClass:"skill",abbrev:a.name[0]}}}_gmEntries(){return this.gmItems.filter(e=>!e.disabled)}_actionEntry(e,t,a={}){return{name:e.name,id:e.id,icon:e.img,cssClass:t,abbrev:e.name[0],...a}}_enchantmentEntry(e,t,a,s={}){return{name:`${a.name} - ${e.name}`,id:`${a.id}_${e.id}`,icon:C.defaultImages[e.talisman?"liturgy":"spell"],cssClass:t,abbrev:e.name[0],...s}}_skillEntry(e,t,a={}){let s=e.system?.talentValue.value;return{name:s?`${e.name} (${s})`:e.name,id:e.id,icon:e.img,cssClass:t,addClass:e.system?.group?.value,abbrev:e.name[0],tw:s,...a}}_traitEntry(e,t){let a=O._parseDmg(e.toObject(),t);return{name:e.name,id:e.id,icon:e.img,cssClass:`weapon i${e.id}`,abbrev:e.name[0],attack:e.system.at.value,damage:a.damagedie,dadd:a.damageAdd}}_combatEntry(e,t,a,s=[]){let i=e.type=="meleeweapon"?O._prepareMeleeWeapon(e.toObject(),t,a):O._prepareRangeWeapon(e.toObject(),[],t,a),n=[{name:e.name,id:e.id,icon:e.img,cssClass:`weapon i${e.id}`,abbrev:e.name[0],attack:i.attack,damage:i.damagedie,dadd:i.damageAdd,...s}];for(let[r,l]of Object.entries(i.subweapons||{}))n.push({name:l.name,id:e.id,subweapon:r,icon:e.img,cssClass:`weapon i${e.id}`,abbrev:l.name[0],attack:l.attack,damage:l.damagedie,dadd:l.damageAdd,...s});return n}async _effectEntries(e,t={}){return(await e.actorEffects()).map(a=>{let s=a.getFlag("dsa5","value")||"";return{name:s?`${a.name} (${s})`:a.name,id:a.id,icon:a.img,cssClass:"effect",abbrev:`${a.name[0]} ${s}`,subfunction:"effect",indicator:s,...t}})}filterButtons(e){switch(e.which){case 8:this.searching=this.searching.slice(0,-1);break;default:if(!e.key.match(/^[a-zA-Z0-9öäüÖÄÜ]$/))return;this.searching+=e.key}e.preventDefault(),e.stopPropagation();let t=this.searching.toLowerCase();ge(t);let a=$(e.currentTarget).find(".subbuttons li");a.find(".dsahidden").removeClass("dsahidden"),a.filter(function(){return $(this).find("label").text().toLowerCase().trim().indexOf(t)==-1}).addClass("dsahidden")}async render(e,t={}){let a=await super.render(e,t);return this._element&&this._element.css({zIndex:61}),a}setPosition({left:e,top:t,width:a,height:s,scale:i}={}){let n=super.setPosition({left:e,top:t,width:a,height:s,scale:i}),r=this.element[0];if(!r.style.width||a){let l=a||r.offsetWidth,c=r.style.maxWidth||window.innerWidth;n.width=a=Math.clamp(l,0,c),r.style.width=a+"px",a+n.left>window.innerWidth&&(e=n.left)}return game.settings.set("dsa5","tokenhotbarPosition",{left:n.left,top:n.top}),n}async updateDSA5Hotbar(){if(ui.hotbar.updateDSA5Hotbar(),game.settings.get("dsa5","disableTokenhotbar"))return;let e=canvas.tokens.controlled;if(this.actor=void 0,this.showEffects=!1,e.length===1){let t=e[0].actor;t&&t.isOwner&&(this.actor=t)}e.length>=1&&(this.showEffects=!0),await this.render(!0,{focus:!1})}},Lt=class o extends foundry.applications.api.HandlebarsApplicationMixin(foundry.applications.api.ApplicationV2){static{u(this,"AddEffectDialog")}static DEFAULT_OPTIONS={classes:["dsa5","tokenStatusEffects"],window:{title:"CONDITION.add",resizable:!0},position:{width:700,height:"auto"}};static PARTS={main:{template:"systems/dsa5/templates/dialog/addstatusdialog.html"}};async _prepareContext(e){let t=await super._prepareContext(e);return t.effects=Gr(CONFIG.statusEffects).map(a=>({name:game.i18n.localize(a.name),img:a.img,description:game.i18n.localize(a.description),id:a.id})).sort((a,s)=>a.name.localeCompare(s.name)),t}static async showDialog(){new o().render(!0)}_onRender(e,t){super._onRender(t);let a=$(this.element);a.find(".filterable .reactClick").on("mouseenter",r=>{if(r.currentTarget.getElementsByClassName("hovermenu").length==0){let l=document.createElement("div");l.classList.add("hovermenu"),l.style.cssText="font-size: var(--font-size-20);";let c=document.createElement("i");c.classList.add("fas","fa-cogs"),c.dataset.tooltip="ActiveEffects.custom",c.addEventListener("click",async m=>this.configureEffect(m),!1),l.appendChild(c),r.currentTarget.appendChild(l)}}),a.find(".filterable .reactClick").on("mouseleave",r=>{let l=r.relatedTarget;l.parentNode==this||l==this||r.currentTarget.querySelectorAll(".hovermenu").forEach(c=>c.remove())}),a.find(".quantity-click").on("mousedown",r=>N.quantityClick(r)),a.find(".reactClick").on("click",r=>this.addEffect(r.currentTarget.dataset.value));let s=u(r=>this._filterConditions($(r.currentTarget),a),"filterConditions"),i=a.find(".conditionSearch");i.on("keyup",r=>this._filterConditions($(r.currentTarget),a)),i[0]&&i[0].addEventListener("search",s,!1);let n={};this.options.position.width==="auto"&&(n.width="auto"),this.options.position.height==="auto"&&(n.height="auto"),foundry.utils.isEmpty(n)||this.setPosition(n)}_filterConditions(e,t){if(e.val()!=null){let a=e.val().toLowerCase().trim(),s=t.find(".filterable");t.find(".filterHide").removeClass("filterHide"),s.filter(function(){return $(this).find("span").text().toLowerCase().trim().indexOf(a)==-1}).addClass("filterHide")}}static async modifyEffectDialog(e,t){new foundry.applications.api.DialogV2({window:{title:game.i18n.localize("CONDITION."+e)},position:{width:400},content:await renderTemplate("systems/dsa5/templates/dialog/configurestatusdialog.html"),buttons:[{action:"add",icon:"fa fa-check",label:"CONDITION.add",callback:u(async(a,s,i)=>{let n=s.form.elements,r={},l=Number(n.duration.value)||0;n.unit.value=="seconds"&&(l=Math.round(l/5));let c=n.effectname.value;l>0&&pa(r,N._buildDuration(l)),c&&(r.name=c),await t(e,r)},"callback")}]}).render(!0)}async configureEffect(e){e.stopPropagation();let a=$(e.currentTarget).closest(".reactClick").attr("data-value");this.close(),o.modifyEffectDialog(a,async(s,i)=>this.addEffect(s,i))}async addEffect(e,t={}){let a=e=="custom";if(canvas.tokens.controlled.length==1&&a)z.createCustomEffect(canvas.tokens.controlled[0].actor);else if(a)ui.notifications.error("DSAError.customEffect",{localize:!0});else for(let s of canvas.tokens.controlled)await s.actor.addTimedCondition(e,1,!1,!1,t);this.close()}};var{getProperty:Br}=foundry.utils,Qs=u(async(o,e,t,a)=>{if(game.user.isGM){let s=await game.dsa5.apps.DSA5_Utility.allMoneyItems(),i=await g.getFolderForType("Actor",null,"Dropped Items"),r=game.users.filter(p=>!p.isGM).map(p=>p.id).reduce((p,f)=>(p[f]=1,p),{default:0}),l=e.toObject();l.system.quantity.value=a,N.obfuscateDropData(l,t.tabsinvisible),Br(l,"system.worn.value")&&(l.system.worn.value=!1);let c={type:"npc",name:e.name,img:e.img,prototypeToken:{texture:{scaleX:1,scaleY:1,src:e.img},width:.4,height:.4},ownership:r,items:[...s,l],flags:{core:{sheetClass:"dsa5.MerchantSheetDSA5"}},folder:i,system:{merchant:{merchantType:"loot",temporary:!0,hidePlayer:1},status:{wounds:{value:16}}}},d=await(await game.dsa5.entities.Actordsa5.create(c)).getTokenDocument({x:t.x,y:t.y,hidden:!1});if(!canvas.dimensions.rect.contains(d.x,d.y))return!1;if(o){await canvas.scene.createEmbeddedDocuments("Token",[d],{noHook:!0});let p=e.system.quantity.value-a;p<1?await o.deleteEmbeddedDocuments("Item",[e.id]):await o.updateEmbeddedDocuments("Item",[{_id:e.id,"system.quantity.value":p}])}else await canvas.scene.createEmbeddedDocuments("Token",[d])}else{let s={itemId:e.uuid,sourceActorId:o?.id,data:t,amount:a};game.socket.emit("system.dsa5",{type:"itemDrop",payload:s})}},"dropToGround"),qr=u(async(o,e)=>{let t=await Item.implementation.fromDropData(e),a=t.parent;if(!b.equipmentCategories.has(t.type))return;let s=u(async i=>{Qs(a,t,e,i)},"callback");_t.create("DSASETTINGS.enableItemDropToCanvas",game.i18n.format("MERCHANT.dropGround",{name:t.name}),t.system.quantity.value,s)},"handleItemDrop"),Wr=u(async(o,e)=>{let t=e.x,a=e.y,s=0,i=o.grid.size,n=Math.ceil(Math.sqrt(e.ids.length));for(let r of e.ids){let l=game.actors.get(r);if(!l)continue;let c=await l.getTokenDocument({x:t,y:a,hidden:!1});c.constructor.create(c,{parent:o.scene}),n%s==0&&s>0?(a+=i,t=e.x):t+=i,s++}},"handleGroupDrop"),Rn=u(()=>{Hooks.on("dropCanvasData",async(o,e)=>{if(game.settings.get("dsa5","enableItemDropToCanvas")||game.user.isGM||e.tokenId){if(e.type=="Item")return qr(o,e),!1;if(e.type=="GroupDrop")return Wr(o,e),!1}})},"connectHook"),_t=class o extends foundry.applications.api.DialogV2{static{u(this,"RangeSelectDialog")}static async create(e,t,a,s,i=1,n=void 0){n=n||a;let r=await renderTemplate("systems/dsa5/templates/dialog/dropToGround.html",{name:t,min:i,max:n,count:a});new o({window:{title:e},content:r,buttons:[{action:"yes",icon:"fa fa-check",label:"yes",default:!0,callback:u((l,c,m)=>{s(c.form.elements.count.valueAsNumber)},"callback")},{action:"no",icon:"fas fa-times",label:"cancel"}]}).render(!0)}_onRender(e,t){super._onRender(t),$(this.element).find('input[type="range"]').on("change",s=>{$(s.currentTarget).closest(".row-section").find(".range-value").html($(s.currentTarget).val())})}};var{mergeObject:fa,getProperty:Ae,duplicate:Ze,hasProperty:Xs}=foundry.utils,ze=class extends ActorSheet{static{u(this,"ActorSheetDsa5")}get actorType(){return this.actor.type}async _render(e=!1,t={}){this._saveSearchFields(),this._saveCollapsed(),await super._render(e,t),this._setCollapsed(),this._restoreSeachFields();let a=$(this._element),s={".close":"SHEET.Close",".configure-sheet":"SHEET.Configure",".configure-token":"SHEET.Token",".import":"SHEET.Import"};for(let i of Object.keys(s))a.find(i).attr("data-tooltip",s[i]);this.currentFocus&&(a.find('[data-item-id="'+this.currentFocus+'"] input').trigger("focus").trigger("select"),this.currentFocus=null)}static get defaultOptions(){let e=super.defaultOptions;return e.tabs=[{navSelector:".tabs",contentSelector:".content",initial:"skills"}],fa(e,{width:770,height:740,scrollY:[".save-scroll"],dragDrop:[{dragSelector:".content .item",dropSelector:null},{dragSelector:".mainEffects .statusEffect",dropSelector:null}]}),e}_saveSearchFields(){if(this.form===null)return;let e=$(this.form).parent();this.searchFields={talentFiltered:$(e.find(".filterTalents")).hasClass("filtered"),searchText:$(e.find(".talentSearch")).val(),gearSearch:$(e.find(".gearSearch")).val()}}_restoreSeachFields(){if(this.searchFields!=null){let e=$(this.form).parent();this.searchFields.talentFiltered&&($(e.find(".filterTalents")).addClass("filtered"),$(e.find(".allTalents")).removeClass("showAll"));let t=$(e.find(".talentSearch"));t.val(this.searchFields.searchText),this.searchFields.searchText!=""&&this._filterTalents(t);let a=$(e.find(".gearSearch"));a.val(this.searchFields.gearSearch),this.searchFields.searchText!=""&&this._filterGear(a)}}_saveCollapsed(){if(this.form===null)return;let e=$(this.form).parent();this.collapsedBoxes=[],this.openDetails=[];let t=e.find(".ch-collapse i");for(let a of t)this.collapsedBoxes.push($(a).attr("class"));for(let a of $(e.find(".expandDetails.shown")))this.openDetails.push($(a).closest(".item").attr("data-item-id"))}_setCollapsed(){let e=$(this.form).parent();if(this.collapsedBoxes){let t=e.find(".ch-collapse i");for(let a=0;a(s[i]=game.i18n.localize(`RIDING.speeds.${i}`),s),{}),z.prepareActiveEffects(this.actor,a),a.enrichedOwnerdescription=await TextEditor.enrichHTML(Ae(this.actor.system,"details.notes.ownerdescription"),{secrets:this.object.isOwner,async:!0}),a.enrichedGmdescription=await TextEditor.enrichHTML(Ae(this.actor.system,"details.notes.gmdescription"),{secrets:this.object.isOwner,async:!0}),a.enrichedNotes=await TextEditor.enrichHTML(Ae(this.actor.system,"details.notes.value"),{secrets:this.object.isOwner,async:!0}),a.enrichedBiography=await TextEditor.enrichHTML(Ae(this.actor.system,"details.biography.value"),{secrets:this.object.isOwner,async:!0}),a}_onItemCreate(e){e.preventDefault();let t=e.currentTarget,a=Ze(t.dataset);b.equipmentTypes[a.type]&&(a.type="equipment",a=fa(a,{"system.equipmentType.value":e.currentTarget.attributes["item-section"].value,"system.effect.value":""})),["aggregatedTest","spell","liturgy","ritual","ceremony"].includes(a.type)||(a["system.weight.value"]=0,a["system.quantity.value"]=0),C.defaultIcon(a),a.name=g.categoryLocalization(a.type),this.actor.createEmbeddedDocuments("Item",[a])}_handleAggregatedProbe(e){let t=this._getItemId(e),a=this.actor.items.get(t).toObject(),s=a.system.talent[`value${e.currentTarget.dataset.which}`],i=this.actor.items.find(r=>r.name==s&&r.type=="skill"),n=`

${game.i18n.localize("TYPES.Item.aggregatedTest")}

`;a.system.usedTestCount.value>=a.system.allowedTestCount.value?(n+=`${game.i18n.localize("Aggregated.noMoreAllowed")}`,ChatMessage.create(g.chatDataSetup(n))):this.actor.setupSkill(i,{moreModifiers:[{name:game.i18n.localize("failedTests"),value:-1*a.system.previousFailedTests.value,selected:!0},{name:game.i18n.localize("Modifier"),value:a.system.baseModifier,selected:!0}]},this.getTokenId()).then(r=>{this.actor.basicTest(r).then(l=>{l.result.successLevel>0?(a.system.cummulatedQS.value=l.result.qualityStep+a.system.cummulatedQS.value,a.system.cummulatedQS.value=Math.min(10,a.system.cummulatedQS.value)):a.system.previousFailedTests.value+=1,a.system.usedTestCount.value+=1,this.actor.updateEmbeddedDocuments("Item",[a]).then(()=>{let c=this.actor.items.get(t);c.postItem(),a.system.cummulatedQS.value>=10&&c.sheet.postFinishedItem()})})})}async consumeItem(e){await foundry.applications.api.DialogV2.confirm({window:{title:game.i18n.localize("SHEET.ConsumeItem")+": "+e.name},content:game.i18n.localize("SHEET.ConsumeItem")+": "+e.name,rejectClose:!1,modal:!0})&&e.setupEffect(null,{},this.getTokenId())}async _advanceAttribute(e){let t=Number(this.actor.system.characteristics[e].advances),a=t+Number(this.actor.system.characteristics[e].initial),s=this.actor.system.isPet||this.actor.system.isFamiliar?"C":"E",i=g._calculateAdvCost(a,s);if(await this._checkEnoughXP(i))return await this._updateAPs(i,{[`system.characteristics.${e}.advances`]:t+1}),await _.track(this.actor,{type:"attribute",attr:e,previous:a,next:a+1},i),!0}async _refundAttributeAdvance(e){let t=Number(this.actor.system.characteristics[e].advances),a=t+Number(this.actor.system.characteristics[e].initial);if(t>0){let s=this.actor.system.isPet||this.actor.system.isFamiliar?"C":"E",i=g._calculateAdvCost(a,s,0)*-1;return await this._updateAPs(i,{[`system.characteristics.${e}.advances`]:t-1}),await _.track(this.actor,{type:"attribute",attr:e,previous:a,next:a-1},i),!0}}async _rebuyPC(e){if(this.actor.system.status[e].permanentLossSum>0&&await this._checkEnoughXP(2)){let t=Number(this.actor.system.status[e].rebuy);return await this._updateAPs(2,{[`system.status.${e}.rebuy`]:t+1}),await _.track(this.actor,{type:"permanentLoss",attr:e,previous:t,next:t+1},2),!0}}async _refundPC(e){if(this.actor.system.status[e].rebuy>0){let t=Number(this.actor.system.status[e].rebuy);return await this._updateAPs(-2,{[`system.status.${e}.rebuy`]:t-1}),await _.track(this.actor,{type:"permanentLoss",attr:e,previous:t,next:t-1},-2),!0}}async _advancePoints(e){let t=Number(this.actor.system.status[e].advances),a=this.actor.system.isPet||this.actor.system.isFamiliar?"C":"D",s=g._calculateAdvCost(t,a);if(await this._checkEnoughXP(s)&&this._checkMaximumPointAdvancement(e,t+1))return await this._updateAPs(s,{[`system.status.${e}.advances`]:t+1}),await _.track(this.actor,{type:"point",attr:e,previous:t,next:t+1},s),!0}async _refundPointsAdvance(e){let t=Number(this.actor.system.status[e].advances);if(t>0){let a=this.actor.system.isPet||this.actor.system.isFamiliar?"C":"D",s=g._calculateAdvCost(t,a,0)*-1;return await this._updateAPs(s,{[`system.status.${e}.advances`]:t-1}),await _.track(this.actor,{type:"point",attr:e,previous:t,next:t-1},s),!0}}async _advanceItem(e){let t=this.actor.items.get(e),a=Number(t.system.talentValue.value),s=this.actor.system.isPet||this.actor.system.isFamiliar?"C":t.system.StF.value,i=g._calculateAdvCost(a,s);if(await this._checkEnoughXP(i)&&this.actor._checkMaximumItemAdvancement(t,a+1)?.result)return await this.actor.updateEmbeddedDocuments("Item",[{_id:e,"system.talentValue.value":a+1}]),await this._updateAPs(i),await _.track(this.actor,{type:"item",item:t,previous:a,next:a+1},i),!0}async _refundItemAdvance(e){let t=this.actor.items.get(e),a=t.type=="combatskill"?6:0,s=Number(t.system.talentValue.value);if(s>a){let i=this.actor.system.isPet||this.actor.system.isFamiliar?"C":t.system.StF.value,n=g._calculateAdvCost(s,i,0)*-1;return await this.actor.updateEmbeddedDocuments("Item",[{_id:e,"system.talentValue.value":s-1}]),await this._updateAPs(n),await _.track(this.actor,{type:"item",item:t,previous:s,next:s-1},n),!0}}_checkMaximumPointAdvancement(e,t){let a=!1;switch(e){case"wounds":a=t<=this.actor.system.characteristics.ko.value;break;case"astralenergy":a=t<=(this.actor.system.characteristics[this.actor.system.guidevalue.magical]==null?0:this.actor.system.characteristics[this.actor.system.guidevalue.magical].value*this.actor.system.energyfactor.magical);break;case"karmaenergy":a=t<=(this.actor.system.characteristics[this.actor.system.guidevalue.clerical]==null?0:this.actor.system.characteristics[this.actor.system.guidevalue.clerical].value*this.actor.system.energyfactor.clerical);break}return a||ui.notifications.error("DSAError.AdvanceMaximumReached",{localize:!0}),a}async _openLibrary(){game.dsa5.itemLibrary.render(!0)}async _configActor(){new Rt(this.actor,{}).render(!0)}_getHeaderButtons(){let e=super._getHeaderButtons();return e.unshift({class:"library",tooltip:"SHEET.Library",icon:"fas fa-university",onclick:u(async()=>this._openLibrary(),"onclick")}),this.actor.isOwner&&(e.unshift({class:"actorConfig",tooltip:"SHEET.actorConfig",icon:"fas fa-link",onclick:u(async()=>this._configActor(),"onclick")}),e.unshift({class:"playerview",icon:"fas fa-toggle-on",tooltip:"SHEET.switchLimited",onclick:u(async t=>this._togglePlayerview(t),"onclick")})),this.actor.system.canAdvance&&e.unshift({class:"locksheet",tooltip:"SHEET.Lock",icon:`fas fa-${this.actor.system.sheetLocked.value?"":"un"}lock`,onclick:u(async t=>this._changeAdvanceLock(t),"onclick")}),e}async _changeAdvanceLock(e){await this.actor.update({"system.sheetLocked.value":!this.actor.system.sheetLocked.value}),$(e.currentTarget).find("i").toggleClass("fa-unlock fa-lock")}async _checkEnoughXP(e){return await this.actor.checkEnoughXP(e)}async advanceWrapper(e,t,...a){this.wrapperLocked||(this.wrapperLocked=!0,$(e.currentTarget).find("i").addClass("fa-spin fa-spinner"),await this[t](...a))||(this.wrapperLocked=!1,$(e.currentTarget).find("i").removeClass("fa-spin fa-spinner"))}playerViewEnabled(){return Ae(this.actor.system,"playerView")}_togglePlayerview(e){this.actor.update({"system.playerView":!Ae(this.actor.system,"playerView")})}showLimited(){return!game.user.isGM&&this.actor.limited||this.playerViewEnabled()}getTokenId(){return this.token?.id}rollDisease(e){let t=this.actor.items.get(e),a=this.actor.system.status.soulpower.max*-1,s=this.actor.system.status.toughness.max*-1;t.setupEffect(void 0,{rollMode:"gmroll",manualResistance:{SKModifier:a,ZKModifier:s}}).then(async i=>{let n=await t.itemTest(i);await this.actor.updateEmbeddedDocuments("Item",[{_id:t.id,"system.duration.resolved":n.result.duration}])})}async swapWeaponHand(e,t=void 0){let a=t?.id||this._getItemId(e);t=t||this.actor.items.get(a),["Daggers","Fencing Weapons"].includes(game.i18n.localize(`LocalizedCTs.${t.system.combatskill.value}`))||await this.actor.updateEmbeddedDocuments("Item",[{_id:a,"system.worn.wrongGrip":!t.system.worn.wrongGrip}])}activateListeners(e){super.activateListeners(e);let t=u(d=>{this.actor.items.get(this._getItemId(d)).postItem()},"posthand");e.find(".roll-disease").click(d=>this.rollDisease(this._getItemId(d))),me(e),e.find(".condition-edit").click(async d=>{(d.currentTarget.dataset.uuid?await fromUuid(d.currentTarget.dataset.uuid):this.actor.effects.get(d.currentTarget.dataset.id)).sheet.render(!0)}),e.find(".ch-collapse").click(d=>{$(d.currentTarget).find("i").toggleClass("fa-angle-up fa-angle-down"),$(d.currentTarget).closest(".groupbox").find(".row-section:nth-child(2)").fadeToggle()}),e.find(".status-create").click(d=>{let p=$(d.currentTarget).closest(".statusEffectMenu").find("ul");p.fadeIn("fast",()=>{p.find("input").trigger("focus")})}),e.find(".statusEffectMenu ul").mouseleave(d=>$(d.currentTarget).fadeOut()),e.find(".roll-aggregated").mousedown(d=>this._handleAggregatedProbe(d)),e.find(".skill-select").mousedown(d=>{let p=this._getItemId(d),f=this.actor.items.get(p);d.button==0?this.actor.setupSkill(f,{},this.getTokenId()).then(h=>{this.actor.basicTest(h)}):d.button==2&&f.sheet.render(!0)}),e.find(".spell-select").mousedown(d=>{let p=this._getItemId(d),f=this.actor.items.get(p);d.button==0?this.actor.setupSpell(f,{},this.getTokenId()).then(h=>this.actor.basicTest(h)):d.button==2&&f.sheet.render(!0)}),e.find(".item-post").click(d=>t(d)),e.find(".item-dropdown").click(d=>{d.preventDefault(),$(d.currentTarget).closest(".item").find(".expandDetails:first").toggleClass("shown")}),e.find(".condition-show").mousedown(d=>{d.preventDefault();let p=d.currentTarget.dataset.id,f=$(d.currentTarget).parents(".statusEffect").attr("data-descriptor");if(d.button==0){let h=$(d.currentTarget).parents(".statusEffect").attr("data-origin");if(h)fromUuid(h).then(y=>y.sheet.render(!0));else{let y,k;f?(y=CONFIG.statusEffects.find(v=>v.id==f),k=$(`
${game.i18n.localize(y.name)}: ${game.i18n.localize(y.description)}
`)):(y=this.actor.effects.find(v=>v.id==p),y&&(k=$(`
${game.i18n.localize(y.name)}: ${game.i18n.localize(y.flags.dsa5.description)}
`)));let D=$(d.currentTarget).closest(".groupbox").find(".effectDescription");D.fadeOut("fast",function(){D.html(k).fadeIn("fast")})}}else d.button==2&&!d.currentTarget.dataset.locked&&this._deleteActiveEffect(p)}),e.on("click",".chat-condition",d=>le.postStatus(d.currentTarget.dataset.id)),e.find(".money-change, .skill-advances").focusin(d=>{this.currentFocus=$(d.currentTarget).closest("[data-item-id]").attr("data-item-id")}),e.find(".item-edit").click(d=>{d.preventDefault();let p=this._getItemId(d);this.actor.items.get(p).sheet.render(!0)}),e.find(".showApplication").mousedown(d=>{if(d.preventDefault(),d.button==2)this._deleteItem(d);else{let p=this._getItemId(d);this.actor.items.get(p).sheet.render(!0)}}),e.find(".ch-value").click(d=>{d.preventDefault();let p=d.currentTarget.attributes["data-char"].value;this.actor.setupCharacteristic(p,{},this.getTokenId()).then(f=>this.actor.basicTest(f))}),e.find(".ch-status").click(d=>{d.preventDefault(),this.actor.setupDodge({},this.getTokenId()).then(p=>{this.actor.basicTest(p)})}),e.find(".ch-regenerate").click(d=>{d.preventDefault(),this.actor.setupRegeneration("regenerate",{},this.getTokenId()).then(p=>this.actor.basicTest(p))}),e.find(".ch-weaponless").click(d=>{d.preventDefault();let p=d.currentTarget.attributes["data-char"].value;this.actor.setupWeaponless(p,{},this.getTokenId()).then(f=>this.actor.basicTest(f))}),e.find(".ch-fallingDamage").click(d=>{d.preventDefault(),this.actor.setupFallingDamage({},this.getTokenId())}),e.find(".ch-rollCombat").click(d=>{d.preventDefault();let p=this._getItemDataset(d),f=d.currentTarget.dataset.mode,h=O.buildSubweapon(this.actor.items.get(p.itemId),p.subweapon);this.actor.setupWeapon(h,f,{},this.getTokenId()).then(y=>this.actor.basicTest(y))});let a=u(d=>this._deleteItem(d),"deletehand");e.find(".cards .item").mouseenter(d=>{if(d.currentTarget.getElementsByClassName("hovermenu").length==0){let p=document.createElement("div");p.classList.add("hovermenu");let f=document.createElement("i");f.classList.add("fas","fa-times"),f.dataset.tooltip="SHEET.DeleteItem",f.addEventListener("click",a,!1);let h=document.createElement("i");h.classList.add("fas","fa-comment"),h.dataset.tooltip="SHEET.PostItem",h.addEventListener("click",t,!1),p.appendChild(h),p.appendChild(f),d.currentTarget.appendChild(p)}}),e.find(".cards .item").mouseleave(d=>{let p=d.toElement||d.relatedTarget;!p||p.parentNode==this||p==this||d.currentTarget.querySelectorAll(".hovermenu").forEach(f=>f.remove())});let s=this.actor.uuid;e.find(".actorDrag").each(function(d,p){p.setAttribute("draggable",!0),p.addEventListener("dragstart",f=>{let h={type:"Actor",uuid:s};f.dataTransfer.setData("text/plain",JSON.stringify(h))})}),e.find(".filterTalents").click(d=>{$(d.currentTarget).closest(".content").find(".allTalents").toggleClass("showAll"),$(d.currentTarget).toggleClass("filtered")}),e.find(".charimg").mousedown(d=>{d.button==2&&g.showArtwork(this.actor,!0)}),re.bindRollCommands(e);let i=u(d=>this._filterTalents($(d.currentTarget)),"filterTalents"),n=e.find(".talentSearch");n.keyup(d=>this._filterTalents($(d.currentTarget))),n[0]&&n[0].addEventListener("search",i,!1);let r=u(d=>this._filterConditions($(d.currentTarget)),"filterConditions"),l=e.find(".conditionSearch");l.keyup(d=>this._filterConditions($(d.currentTarget))),l[0]&&l[0].addEventListener("search",r,!1);let c=u(d=>this._filterGear($(d.currentTarget)),"filterGear"),m=e.find(".gearSearch");m.keyup(d=>this._filterGear($(d.currentTarget))),m[0]&&m[0].addEventListener("search",c,!1),Qe(e,"img.charimg"),H.activateListeners(e,this.actor),this._bindKeepFieldsEnabled(e),this.isEditable&&(new ContextMenu(e,".item .withContext",[],{onOpen:this._onItemContext.bind(this)}),new ContextMenu(e,".combat-weapon",[],{onOpen:this._onWeaponItemContext.bind(this)}),e.find(".startCharacterBuilder").click(()=>this.actor.setFlag("core","sheetClass","dsa5.DSACharBuilder")),e.find(".schipUpdate").click(d=>{d.preventDefault();let p=Number(d.currentTarget.getAttribute("data-val"));p==1&&$(this.form).find(".fullSchip").length==1&&(p=0),this.actor.update({"system.status.fatePoints.value":p})}),e.find(".swapWeaponHand").click(d=>this.swapWeaponHand(d)),e.find(".defenseToggle").click(()=>this.actor.update({"system.config.defense":!this.actor.system.config.defense})),e.find(".loadWeapon").mousedown(async d=>{let p=this._getItemId(d),f=this.actor.items.get(p).toObject();if(Ae(f,"system.currentAmmo.value")==="")return;let h={_id:p};if(d.button==0){let y=f.type=="trait"?f.system.reloadTime.value:O.calcLZ(f,this.actor);h["system.reloadTime.progress"]=Math.min(f.system.reloadTime.progress+1,y)}else d.button==2&&(h["system.reloadTime.progress"]=0);await this.actor.updateEmbeddedDocuments("Item",[h])}),e.find(".chargeSpell").mousedown(async d=>{let p=this._getItemId(d),f=this.actor.items.get(p).toObject(),h=Number(f.system.castingTime.modified);d.button==0?f.system.castingTime.progress=Math.min(f.system.castingTime.progress+1,h):d.button==2&&(f.system.castingTime.progress=0,f.system.castingTime.modified=0),await this.actor.updateEmbeddedDocuments("Item",[f])}),e.find(".item-swapMag").click(async d=>{await this.actor.swapMag(this._getItemId(d))}),e.find(".ammo-selector").change(async d=>{d.preventDefault();let p=this._getItemId(d);await this.actor.updateEmbeddedDocuments("Item",[{_id:p,"system.currentAmmo.value":$(d.currentTarget).val()}])}),e.find(".item-toggle").click(d=>{let p=this._getItemId(d),f=this.actor.items.get(p).toObject();switch(f.type){case"armor":case"rangeweapon":case"meleeweapon":case"equipment":this.actor.updateEmbeddedDocuments("Item",[{_id:p,"system.worn.value":!f.system.worn.value}]),K.playEquipmentWearStatusChange(f);break}}),e.find(".quantity-click").mousedown(d=>{let p=this._getItemId(d),f=this.actor.items.get(p).toObject();N.increment(d,f,"system.quantity.value",0),this.actor.updateEmbeddedDocuments("Item",[f])}),e.find(".status-add").mousedown(async d=>{let p=d.currentTarget.dataset.id;p=="custom"?z.createCustomEffect(this.actor):d.button==0?await this.actor.addCondition(p,1,!1,!1):d.button==2&&Lt.modifyEffectDialog(p,async(f,h)=>this.actor.addTimedCondition(f,1,!1,!1,h))}),e.find(".money-change").change(async d=>{let p=this._getItemId(d);await this.actor.updateEmbeddedDocuments("Item",[{_id:p,"system.quantity.value":Number(d.target.value)}])}),e.find(".skill-advances").change(async d=>{let p=this._getItemId(d);await this.actor.updateEmbeddedDocuments("Item",[{_id:p,"system.talentValue.value":Number(d.target.value)}])}),e.find(".advance-attribute").mousedown(d=>this.advanceWrapper(d,"_advanceAttribute",d.currentTarget.dataset.attr)),e.find(".refund-attribute").mousedown(d=>this.advanceWrapper(d,"_refundAttributeAdvance",d.currentTarget.dataset.attr)),e.find(".advance-item").mousedown(d=>this.advanceWrapper(d,"_advanceItem",this._getItemId(d))),e.find(".refund-item").mousedown(d=>this.advanceWrapper(d,"_refundItemAdvance",this._getItemId(d))),e.find(".advance-points").mousedown(d=>this.advanceWrapper(d,"_advancePoints",d.currentTarget.dataset.attr)),e.find(".refund-points").mousedown(d=>this.advanceWrapper(d,"_refundPointsAdvance",d.currentTarget.dataset.attr)),e.find(".rebuy-pc").mousedown(d=>this.advanceWrapper(d,"_rebuyPC",d.currentTarget.dataset.attr)),e.find(".refund-pc").mousedown(d=>this.advanceWrapper(d,"_refundPC",d.currentTarget.dataset.attr)),e.find(".onUseItem").mousedown(d=>this._onMacroUseItem(d)),e.find(".traditionPayCost").mousedown(d=>this._payAeSpecialAbilityCost(d)),e.find(".item-create").click(d=>this._onItemCreate(d)),e.find(".condition-toggle").mousedown(async d=>{let p=$(d.currentTarget).parents(".statusEffect").attr("data-id"),f=this.actor.effects.get(p);await f.update({disabled:!f.disabled})}),e.find(".condition-value").mousedown(async d=>{let p=$(d.currentTarget).parents(".statusEffect").attr("data-descriptor");d.button==0?await this.actor.addCondition(p,1,!1,!1):d.button==2&&await this.actor.removeCondition(p,1,!1)}),e.find(".item-delete").click(d=>this._deleteItem(d)),e.find(".tradition-delete").click(d=>this._deleteTraditionArtifact(d)),e.find(".selectTraditionartifact").click(()=>this.selectTraditionartifact()),e.find(".disableRegeneration").click(d=>{let f=`system.repeatingEffects.disabled.${d.currentTarget.dataset.type}`;this.actor.update({[f]:!Ae(this.actor,f)})}))}_onItemContext(e){let t=this.actor.items.get($(e).closest(".item").attr("data-item-id"));t&&(ui.context.menuItems=this._getItemContextOptions(t),Hooks.call("dsa5.getItemContextOptions",t,ui.context.menuItems))}_onWeaponItemContext(e){let t=this.actor.items.get(e.dataset.itemId);!t||t?.type!="meleeweapon"||(ui.context.menuItems=this._getWeaponItemContextOptions(t),Hooks.call("dsa5.getWeaponItemContextOptions",t,ui.context.menuItems))}_getWeaponItemContextOptions(e){let t=[];if(e.type=="meleeweapon"){let a=game.i18n.localize(`LocalizedCTs.${e.system.combatskill.value}`);if(!["Daggers","Fencing Weapons"].includes(a)){let n=e.sheet.getGripInfo(this.item).wrongGripLabel;t.push({name:n,icon:"",callback:u(r=>this.swapWeaponHand(r,e),"callback")})}let s=["Daggers","Fencing Weapons","Impact Weapons","Swords","Polearms"].includes(a)&&F.hasAbility(this.actor,game.i18n.localize("LocalizedIDs.weaponThrow")),i=`${game.i18n.localize("TYPES.Item.rangeweapon")} ${game.i18n.localize("CHARAbbrev.AT")} -${s?4:8} ${game.i18n.localize("CHARAbbrev.RW")} ${b.meleeAsRangeReach[a]}`;t.push({name:i,icon:"",callback:u(()=>this.actor.throwMelee(e,this.getTokenId()),"callback")},{name:"SHEET.EquipItem",icon:"",callback:u(()=>e.update({"system.worn.value":!e.system.worn.value}),"callback")})}else e.type=="rangeweapon"&&t.push({name:"SHEET.EquipItem",icon:"",callback:u(()=>e.update({"system.worn.value":!e.system.worn.value}),"callback")});return t.push({name:"SHEET.PostItem",icon:"",callback:u(()=>e.postItem(),"callback")}),t}_getItemContextOptions(e){let t=[{name:"SHEET.EditItem",icon:"",callback:u(()=>e.sheet.render(!0),"callback")},{name:"SHEET.PostItem",icon:"",callback:u(()=>e.postItem(),"callback")},{name:"SHEET.DuplicateItem",icon:"",callback:u(()=>this.handleItemCopy(e.toObject(),e.type),"callback")},{name:"SHEET.ConsumeItem",icon:"",condition:u(()=>e.type=="consumable","condition"),callback:u(()=>this.consumeItem(e),"callback")},{name:"SHEET.onUseEffect",icon:"",condition:u(()=>Ae(e,"flags.dsa5.onUseEffect"),"condition"),callback:u(()=>new J(e).executeOnUseEffect(),"callback")},{name:"SHEET.DeleteItem",icon:"",callback:u(()=>this._itemDeleteDialog(e),"callback")},{name:"MERCHANT.exchange",icon:"",condition:u(()=>b.equipmentCategories.has(e.type),"condition"),callback:u(()=>this._startTrade(e),"callback")},{name:"SHEET.changeMoney",icon:"",condition:u(()=>e.type=="money","condition"),callback:u(()=>Q._replaceMoney(this.actor),"callback")}];return(Xs(e,"system.worn.wearable")||["meleeweapon","rangeweapon","armor"].includes(e.type))&&t.push({name:"SHEET.EquipItem",icon:"",callback:u(()=>e.update({"system.worn.value":!e.system.worn.value}),"callback")}),Number(Ae(e,"system.quantity.value"))>1&&t.push({name:"SHEET.SplitItem",icon:"",callback:u(()=>this._splitItem(e),"callback")}),t}async _startTrade(e){new ua(this.actor).render(!0)}_splitItem(e){let t=u(async a=>{let s=e.toObject();s.system.quantity.value=a,await this.actor.createEmbeddedDocuments("Item",[s],{render:!1}),await this.actor.updateEmbeddedDocuments("Item",[{_id:e.id,"system.quantity.value":e.system.quantity.value-a}])},"callback");_t.create("SHEET.SplitItem",game.i18n.format("MERCHANT.splitItem",{name:e.name}),e.system.quantity.value-1,t,1,e.system.quantity.value-1)}_bindKeepFieldsEnabled(e){if(!this.isEditable){let t=e.find(".keepFieldsEnabled");for(let a of t){let s=a.dataset.attr,i=a.dataset.name;$(a).find(".editor").append(``),$(a).find(".editor-edit").click(n=>this._openKeepFieldEditpage(n))}}}_openKeepFieldEditpage(e){let t=e.currentTarget.dataset.attr,a=e.currentTarget.dataset.name;new Pt(this.actor.id,t,a).render(!0)}async _onMacroUseItem(e){let t=this.actor.items.get(this._getItemId(e));await new J(t).executeOnUseEffect()}async _payAeSpecialAbilityCost(e){let t=this.actor.items.get(this._getItemId(e)),a=Number(Ae(t,"system.AsPCost"));if(!this.actor.applyMana(a,"AsP"))return;let i=game.i18n.format("CHATNOTIFICATION.paysTraditionAbility",{name:this.actor.name,ability:t.name,cost:a});e.button==2?ChatMessage.create(g.chatDataSetup(i,"gmroll")):ChatMessage.create(g.chatDataSetup(i))}_filterGear(e){if(e.val()!=null){let t=e.val().toLowerCase().trim(),a=$(this.element).find(".inventory .item");a.removeClass("filterHide"),a.filter(function(){return $(this).find("a.item-edit").text().toLowerCase().trim().indexOf(t)==-1}).addClass("filterHide")}}async selectTraditionartifact(){this.isEditable&&new Zs(this.actor).render(!0)}_deleteTraditionArtifact(e){if(!this.isEditable)return;this.actor.items.get(this._getItemId(e)).update({"system.isArtifact":!1})}_filterTalents(e){if(e.val()!=null){let t=e.val().toLowerCase().trim(),a=$(this.form).parent().find(".allTalents");a.find(".item, .table-header, .table-title").removeClass("filterHide"),a.addClass("showAll").find(".item").filter(function(){return $(this).find(".talentName").text().toLowerCase().trim().indexOf(t)==-1}).addClass("filterHide"),t.length>0?(a.find(".table-header, .table-title:not(:eq(0))").addClass("filterHide"),a.addClass("filterfull")):a.removeClass("filterfull")}}_filterConditions(e){if(e.val()!=null){let t=e.val().toLowerCase().trim(),a=$(this.form).find(".statusEffectMenu li:not(.search)");a.removeClass("filterHide"),a.filter(function(){return game.i18n.localize($(this).find("a").attr("data-tooltip")).toLowerCase().trim().indexOf(t)==-1}).addClass("filterHide")}}async _deleteActiveEffect(e){if(!this.isEditable)return;let t=this.actor.effects.get(e);t&&this.actor.deleteEmbeddedDocuments("ActiveEffect",[t.id])}async _itemDeleteDialog(e){let t=game.i18n.format("DIALOG.DeleteItemDetail",{item:e.name}),a=await renderTemplate("systems/dsa5/templates/dialog/delete-item-dialog.html",{message:t});await foundry.applications.api.DialogV2.confirm({window:{title:"DIALOG.deleteConfirmation"},content:a,rejectClose:!1,modal:!0})&&await this._cleverDeleteItem(e.id)}async _deleteItem(e){if(!this.isEditable)return;let t=this._getItemId(e),a=this.actor.items.get(t);this._itemDeleteDialog(a)}async _cleverDeleteItem(e){let t=this.actor.items.get(e),a=[e];switch(t.type){case"advantage":case"disadvantage":await P.vantageRemoved(this.actor,t,!1);break;case"specialability":await F.abilityRemoved(this.actor,t,!1);break;case"blessing":case"magictrick":await this._updateAPs(-1,{},{render:!1}),await _.track(this.actor,{type:"item",item:t,state:-1},-1);break;case"ritual":case"ceremony":case"liturgy":case"spell":{let s=0;for(let n=0;n<=t.system.talentValue.value;n++)s+=g._calculateAdvCost(n,t.system.StF.value,0);let i=this.actor.items.filter(n=>n.type=="spellextension"&&t.type==n.system.category&&t.name==n.system.source);i&&(s+=i.reduce((n,r)=>n+(Number(r.system.APValue.value)||0),0),a.push(...i.map(n=>n.id))),await this._updateAPs(s*-1,{},{render:!1}),await _.track(this.actor,{type:"item",item:t,state:-1},s)}break}await this.actor.deleteEmbeddedDocuments("Item",a)}_getItemId(e){return $(e.currentTarget).closest(".item").attr("data-item-id")}_getItemDataset(e){return $(e.currentTarget).closest(".item")[0].dataset}async _addMoney(e){let a=Ze(this.actor.items.filter(s=>s.type=="money")).find(s=>s.name==e.name);a?(a.system.quantity.value+=e.system.quantity.value,await this.actor.updateEmbeddedDocuments("Item",[a])):await this.actor.createEmbeddedDocuments("Item",[e])}async _updateAPs(e,t={},a={}){await this.actor._updateAPs(e,t,a)}async _addVantage(e,t){P.needsAdoption(this.actor,e,t)}async _addSpecialAbility(e,t){F.needsAdoption(this.actor,e,t)}_onDragStart(e){let t=e.currentTarget;if(e.target.classList.contains("content-link"))return;let a;t.dataset.itemId&&(a=this.actor.items.get(t.dataset.itemId).toDragData(),t.dataset.mod&&(a.mod=t.dataset.mod)),t.dataset.id&&(a=this.actor.effects.get(t.dataset.id).toDragData()),a&&e.dataTransfer.setData("text/plain",JSON.stringify(a))}async _handleSpellExtension(e){if(!this.actor.items.find(a=>a.type==e.type&&a.name==e.name)){e=Ze(e);let a=this.actor.items.find(s=>s.type==e.system.category&&s.name==e.system.source);if(!a)ui.notifications.error(game.i18n.format("DSAError.noSpellForExtension",{name:e.system.source,category:g.categoryLocalization(e.system.category),extension:e.name}));else{if(a.system.talentValue.values.type==e.type&&s.name==e.name),a;if(e=Ze(e),!t){switch(e.type){case"spell":case"liturgy":case"ceremony":case"ritual":a=g._calculateAdvCost(0,e.system.StF.value,0);break;case"blessing":case"magictrick":a=1;break;case"magicalsign":a=e.system.APValue.value;break;default:return}if(await this.actor.checkEnoughXP(a)){await this._updateAPs(a,{},{render:!1});let s=(await this.actor.createEmbeddedDocuments("Item",[e]))[0];await _.track(this.actor,{type:"item",item:s,state:1},a)}}}async _addLoot(e){e=Ze(e);let t=this.actor.items.find(a=>C.areEquals(e,a));return t?(await C.stackItems(t,e,this.actor))[0]:(this._tabs[0].active=="combat"&&e.system.worn&&(e.system.worn.value=!0),(await this.actor.createEmbeddedDocuments("Item",[e]))[0])}async _addUniqueItem(e){if(e=Ze(e),!this.actor.items.some(t=>C.areEquals(e,t)))return(await this.actor.createEmbeddedDocuments("Item",[e]))[0]}async _addDemonMarkOrPatron(e){return await this._addUniqueItem(e)}async _addDisease(e){return e.system.duration.resolved="?",await this._addUniqueItem(e)}async handleItemCopy(e,t){e.name+=" (Copy)",this._manageDragItems(e,t)}async _addFullPack(e){let a=(await game.packs.get(e.name).getDocuments()).filter(s=>!this.actor.items.find(i=>i.type==s.type&&i.name==s.name));e.onlyType&&(a=a.filter(s=>s.type==e.onlyType)),await this.actor.createEmbeddedDocuments("Item",a.map(s=>s.toObject()))}async creatureDrop(e){game.dsa5.config.hooks.shapeshift?new foundry.applications.api.DialogV2({window:{title:game.i18n.localize("DIALOG.ItemRequiresAdoption")+": "+e.name},content:`

${game.i18n.localize("DIALOG.whichFunction")+": "+e.name}

`,buttons:[{action:"shapeshift",icon:"fas fa-paw",label:"CONDITION.shapeshift",callback:u(()=>{let t=game.dsa5.config.hooks.shapeshift;t.setShapeshift(this.actor,e),t.render(!0)},"callback")},{action:"horse",icon:"fas fa-horse",label:"RIDING.horse",default:!0,callback:u(()=>{H.setHorse(this.actor,e,this.token)},"callback")}]}).render(!0):H.setHorse(this.actor,e,this.token)}async _manageDragItems(e,t){switch(t){case"disease":await this._addDisease(e);break;case"meleeweapon":case"rangeweapon":case"equipment":case"ammunition":case"armor":case"poison":case"consumable":case"book":case"plant":return await this._addLoot(e);case"disadvantage":case"advantage":await this._addVantage(e,t);break;case"specialability":await this._addSpecialAbility(e,t);break;case"money":await this._addMoney(e);break;case"ritual":case"ceremony":case"blessing":case"magictrick":case"liturgy":case"spell":case"magicalsign":await this._addSpellOrLiturgy(e);break;case"effectwrapper":await this._handleEffectWrapper(e);break;case"application":await this._handleApplication(e);break;case"spellextension":await this._handleSpellExtension(e);break;case"creature":this.creatureDrop(e);break;case"skill":case"imprint":case"essence":case"information":await this._addUniqueItem(e);break;case"patron":case"demonmark":await this._addDemonMarkOrPatron(e);break;default:ui.notifications.error(game.i18n.format("DSAError.canNotBeAdded",{item:e.name,category:g.categoryLocalization(e.type)}))}}async _handleEffectWrapper(e){this.actor.createEmbeddedDocuments("ActiveEffect",e.effects.map(t=>(t.origin=null,t)))}async _handleLookup(e){let t=await g.findAnyItem(e.items);if(t){for(let a of e.items)if(a.count){let s=t.find(i=>i.name==a.name&&i.type==a.type);s?(s.system.quantity.value=a.count,a.qs&&a.type=="consumable"&&(s.system.QL=a.qs)):ui.notifications.warn(game.i18n.format("DSAError.notFound",{category:a.type,name:a.name}))}await this.actor.createEmbeddedDocuments("Item",t)}else ui.notifications.error(game.i18n.format("DSAError.notFound",{category:thing.type,name:thing.name}))}async _handleApplication(e){e=Ze(e),this.actor.items.find(a=>a.type==e.type&&a.name==e.name)||await this.actor.createEmbeddedDocuments("Item",[e])}async _handleRemoveSourceOnDrop(e){let t=e.parent;t&&t.isOwner&&await t.deleteEmbeddedDocuments("Item",[e._id])}async _onDropItemCreate(e){return e instanceof Array?this.actor.createEmbeddedDocuments("Item",e):await this._manageDragItems(e,e.type)}async _onDropActor(e,t){if(!this.actor.isOwner)return!1;let{item:a,typeClass:s,selfTarget:i}=await Ee(t,this.id,!1);if(!i)return await this._manageDragItems(a,s)}async _onDropActiveEffect(e,t){let a=await ActiveEffect.implementation.fromDropData(t);if(!this.actor.isOwner||!a||this.actor.uuid===a.parent?.uuid)return!1;let s=a.toObject();return s.origin=null,ActiveEffect.create(s,{parent:this.actor})}async _onDropItem(e,t){if(!this.actor.isOwner)return!1;let a=await Item.implementation.fromDropData(t),s=a.toObject();N.obfuscateDropData(s,t.tabsinvisible);let i,n=!1,r=$(e.target).parents(".item");if(r&&b.equipmentCategories.has(a.type)){let c=r.attr("data-item-id");c!=a.id&&(r.attr("data-category")=="bags"?i=c:(r=this.actor.items.get(c),n=r&&Xs(a,"system.quantity.value")&&Xs(r,"system.quantity.value")&&C.areEquals(a,r)))}let l=this.actor.uuid===a.parent?.uuid;if(l)if(e.ctrlKey)await this.handleItemCopy(s,a.type);else if(n)await r.update({"system.quantity.value":r.system.quantity.value+a.system.quantity.value},{render:!1}),await this.actor.deleteEmbeddedDocuments("Item",[a.id]);else if(i){let c={_id:a.id,"system.parent_id":i};a.system.worn&&a.system.worn.value&&(c["system.worn.value"]=!1),await this.actor.updateEmbeddedDocuments("Item",[c])}else b.equipmentCategories.has(a.type)&&await this.actor.updateEmbeddedDocuments("Item",[{_id:a.id,system:{parent_id:0}}]);else{if(this._itemHasPrice(t)){let m=`${a.type=="consumable"?C.getSubClass(s.type).consumablePrice(s):Number(s.system.price.value)}`;if(m&&!await Q.payMoney(this.actor,m,!0,!1))return;ge(game.i18n.format("PAYMENT.pay",{actor:this.actor.name,amount:m})),K.playMoneySound()}await this._onDropItemCreate(s)}e.altKey&&!l&&b.equipmentCategories.has(a.type)&&await this._handleRemoveSourceOnDrop(a)}_itemHasPrice(e){return e.pay}},Zs=class extends Application{static{u(this,"TraditionArtifactpicker")}constructor(e,t={}){super(t),this.actor=e}get template(){return"systems/dsa5/templates/actors/traditionPicker.html"}static get defaultOptions(){let e=super.defaultOptions;return fa(e,{width:440,resizable:!0}),e}async getData(e){let t=await super.getData(e),a=this.actor.items.filter(s=>["equipment","armor","rangeweapon","meleeweapon"].includes(s.type));return fa(t,{items:a}),t}activateListeners(e){super.activateListeners(e),e.find(".slot").click(async t=>{let a=this.actor.items.get(t.currentTarget.dataset.itemId);await a.update({"system.isArtifact":!a.system.isArtifact})})}};var{mergeObject:Ur,duplicate:Vr,getProperty:Kr}=foundry.utils,ye=class o extends Application{static{u(this,"WizardDSA5")}constructor(e){super(e),this.actor=null,this.errors=[],this.attributes=[],this.updating=!1}static get defaultOptions(){let e=super.defaultOptions;return e.tabs=[{navSelector:".tabs",contentSelector:".content",initial:"description"}],Ur(e,{classes:e.classes.concat(["dsa5","largeDialog","generationWizard"]),width:770,height:740}),e.resizable=!0,e}async findCompendiumItem(e,t){for(let a of t){let s=await game.dsa5.itemLibrary.findCompendiumItem(e,a);if(s=s.find(i=>i.name==e&&i.type==a&&i.system),s)return s}}_parseAttributes(e,t=","){let a=[],s=game.i18n.localize("combatskillcountdivider")+":";for(let i of e.split(t))if(i.includes(s)){let n=i.split(":");a.push({choices:n[1].split("/").map(r=>r.trim()),allowedCount:Number(n[0].match(/\d/g))})}return a}async parseToItem(e,t){return e.trim()==""?[]:await Promise.all(e.split(", ").map(async a=>{let s=g.parseAbilityString(a.trim()),i=await this.findCompendiumItem(s.original,t);if(i||(i=await this.findCompendiumItem(s.name,t)),i){let r=i.uuid;i=Vr(i),i.uuid=r,i.tooltip=game.i18n.localize("Details"),i=te.reverseAdoptionCalculation(this.actor,s,i),i.system.APValue&&(i.APunparseable=isNaN(i.system.APValue.value),i.apCost=i.APunparseable?i.system.APValue.value:s.step*Number(i.system.APValue.value))}else if(this.attributes.includes(s.name)){let r=0;for(let l=this.actor.system.characteristics[game.dsa5.config.knownShortcuts[s.name.toLowerCase()][1]].value+1;l`);let r=t.map(l=>g.categoryLocalization(l)).join("/");this.errors.push(`${r}: ${a}`),i={name:a.trim(),notFound:!0,tooltip:game.i18n.localize("DSAError.itemNotFound"),apCost:"?"}}i.replaceName=s.original,i.step=s.step;let n=this.actor.items.find(r=>t.includes(r.type)&&r.name==s.original)!=null;return i.disabled=n||i.notFound||i.APunparseable,n&&(i.tooltip=game.i18n.localize("YouAlreadyHaveit")),i}))}mergeLevels(e,t,a){let s=!1,i=e.find(n=>n.name==t.name&&n.type==t.type);if(i){s=!0;let n=Number(Kr(t,"system.step.value"));n&&(i.system.step.value=Math.min(i.system.step.value+=n,i.system[a].value))}else e.push(t);return s}async addSelections(e,t=!0){let a=[];for(let s of e){if($(s).val()=="")continue;let n=(await fromUuid($(s).val())).toObject(),r=g.parseAbilityString(n.name);switch(n.name=$(s).attr("name"),n.type){case"advantage":case"disadvantage":n.system.step.value=Number(s.dataset.step),n=te.reverseAdoptionCalculation(this.actor,r,n),this.mergeLevels(a,n,"max")||P.vantageAdded(this.actor,n);break;case"specialability":n.system.step.value=Number(s.dataset.step),s.dataset.free=="true"&&(n.system.APValue.value=0),n=te.reverseAdoptionCalculation(this.actor,r,n),this.mergeLevels(a,n,"maxRank")||F.abilityAdded(this.actor,n);break;case"magictrick":this.mergeLevels(a,n);break}}await this.actor.createEmbeddedDocuments("Item",a,{render:t})}async fixPreviousCosts(e,t){for(let a of t){let s=e.find(i=>i.type==a.type&&i.name==a.name);s&&(a.apCost-=s.apCost)}}async alreadyAdded(e,t){if(e=="")return!1;let a=!1;try{a=await foundry.applications.api.DialogV2.wait({window:{title:"DIALOG.warning"},content:`

${game.i18n.format("DIALOG.alreadyAddedCharacterpart",{category:g.categoryLocalization(t)})}

`,buttons:[{action:"ok",default:!0,icon:"fas fa-check",label:"Ok",callback:u(()=>!1,"callback")},{action:"cancel",icon:"fas fa-close",label:"Cancel",callback:u(()=>!0,"callback")}]})}catch{}return a}async updateSkill(e,t,a=1,s=!0){let i=[];for(let n of e){let r=g.parseAbilityString(n.trim()),l=this.actor.items.find(c=>c.type==t&&c.name==r.name);l?i.push({_id:l.id,"system.talentValue.value":Math.max(0,a*r.step+(s?Number(l.system.talentValue.value):0))}):(console.warn(`Could not find ${t} ${n}`),this.errors.push(`${g.categoryLocalization(t)}: ${n}`))}await this.actor.updateEmbeddedDocuments("Item",i,{render:!1})}async getData(e){let t=await super.getData(e);return await game.dsa5.itemLibrary.buildEquipmentIndex(),t}_validateInput(e,t=this){let a=/^exclusive_/;for(let s of e.find(".tab")){let i=$(s),n=new Set;for(let r of i.find(".exclusive"))n.add(r.className.split(/\s+/).filter(l=>a.test(l))[0]);for(let r of n){let l=i.find(".allowedCount_"+r.split("_")[1]),c=Number(l.attr("data-count"));if(i.find(`.${r}:checked`).length!=c)return this._showInputValidation(l,i,t),!1}}return!0}_showInputValidation(e,t,a){ui.notifications.error("DSAError.MissingChoices",{localize:!0});let s=e.closest(".tab").attr("data-tab");a.activateTab(s),o.flashElem(t.find(`.tabs a[data-tab='${s}']`)),o.flashElem(e.closest("div"))}activateListeners(e){super.activateListeners(e),me(e),e.find("button.ok").click(()=>{this.updating||(this.updating=!0,this.updateCharacter($(this._element)).then(()=>this.updating=!1))}),e.find("button.cancel").click(()=>{this.close()});let t=u(s=>{s.stopPropagation();let i=s.currentTarget.dataset.type,n=s.currentTarget.dataset.uuid;!n||!i||s.originalEvent.dataTransfer.setData("text/plain",JSON.stringify({type:i,uuid:n}))},"itemDragStart"),a=e.find(".show-item");a.click(async s=>{let i=s.currentTarget.dataset.uuid;(await fromUuid(i)).sheet.render(!0)}),a.attr("draggable",!0).on("dragstart",s=>t(s)),e.on("click",".searchableAbility a",s=>mt(s)),e.find(".exclusive").change(s=>{let i=$(s.currentTarget).closest(".tab"),n=$(s.currentTarget).attr("data-sel"),r=i.find(`.allowedCount_${n}`),l=Number(r.attr("data-count"));if(i.find(`.exclusive_${n}:checked`).length>l){s.currentTarget.checked=!1,o.flashElem(r);return}})}static flashElem(e,t="emphasize"){e.addClass(t),setTimeout(function(){e.removeClass(t)},600)}finalizeUpdate(){this.errors.length==0?this.close():$(this._element).find(".dialog-buttons").html(`

${game.i18n.localize("DSAError.notUnderstood")}

  • ${this.errors.join("
  • ")}
`)}};var{mergeObject:Yr,getProperty:Pn,duplicate:Jr}=foundry.utils,et=class extends ye{static{u(this,"CultureWizard")}static get defaultOptions(){let e=super.defaultOptions;return e.title=game.i18n.format("WIZARD.addItem",{item:`${game.i18n.localize("TYPES.Item.culture")}`}),e.template="systems/dsa5/templates/wizard/add-culture-wizard.html",e}activateListeners(e){super.activateListeners(e),e.find(".optional").change(t=>{let a=$(t.currentTarget).closest(".content"),s=Number(a.attr("data-cost"));a.find(".optional:checked").each(function(){s+=Number($(this).attr("data-cost"))});let i=a.find(".apCost");i.text(s),ye.flashElem(i,"emphasize2")})}async getData(e){let t=await super.getData(e),a=await this.parseToItem(this.culture.system.recommendedAdvantages.value,["advantage"]),s=await this.parseToItem(this.culture.system.recommendedDisadvantages.value,["disadvantage"]),i=this.culture.system.writing.value==""?[]:await this.parseToItem(this.culture.system.writing.value.split(",").map(l=>`${game.i18n.localize("LocalizedIDs.literacy")} (${l.trim()})`).join(", "),["specialability"]),n=this.culture.system.language.value==""?[]:await this.parseToItem(this.culture.system.language.value.split(",").map(l=>`${game.i18n.localize("LocalizedIDs.language")} (${l.trim()}) 3`).join(", "),["specialability"]),r=Number(this.culture.system.APValue.value);return Yr(t,{title:game.i18n.format("WIZARD.addItem",{item:`${game.i18n.localize("TYPES.Item.culture")} ${this.culture.name}`}),culture:this.culture,description:game.i18n.format("WIZARD.culturedescr",{culture:this.culture.name,cost:r}),advantages:a,disadvantages:s,writings:i,languages:n,advantagesToChose:a.length>0,disadvantagesToChose:s.length>0,writingsToChose:i.length>0,languagesToChose:n.length>0,languagesToSelect:n.length>1,vantagesToChose:a.length>0||s.length>0,generalToChose:i.length>0||n.length>0,enrichedClothing:await TextEditor.enrichHTML(Pn(this.culture.system,"clothing.value"),{secrets:!1,async:!0}),enrichedDescription:await TextEditor.enrichHTML(Pn(this.culture.system,"description.value"),{secrets:!1,async:!0})}),t}async addCulture(e,t){this.actor=e,this.culture=t}_validateInput(e,t=this){let a=e.find(".localKnowledge");if(a.val()=="")return this._showInputValidation(a,e,t),!1;let s=e.find(".selectOnlyOne");return s.length&&s.find(".optional:checked").length!=1?(this._showInputValidation(s,e,t),!1):super._validateInput(e,t)}async updateCharacter(e,t=this){e.find("button.ok i").toggleClass("fa-check fa-spinner fa-spin");let a=Number(e.find(".apCost").text());if(!this._validateInput(e,t)||!await this.actor.checkEnoughXP(a)||await this.alreadyAdded(this.actor.system.details.culture.value,"culture")){e.find("button.ok i").toggleClass("fa-check fa-spinner fa-spin");return}let s={"system.details.culture.value":this.culture.name},i=await this.findCompendiumItem(`${game.i18n.localize("LocalizedIDs.localKnowledge")} ()`,["specialability"]);i&&(i=Jr(i),i.name=`${game.i18n.localize("LocalizedIDs.localKnowledge")} (${e.find(".localKnowledge").val()})`,i.system.APValue.value=0,await this.actor.createEmbeddedDocuments("Item",[i],{render:!1})),await this.addSelections(e.find(".optional:checked"),!1),await this.actor._updateAPs(a,{},{render:!1}),await this.updateSkill(this.culture.system.skills.value.split(","),"skill"),await this.actor.update(s),await _.track(this.actor,{type:"item",item:this.culture,state:1},a),this.finalizeUpdate()}};var{mergeObject:Qr,getProperty:Ln,duplicate:ei}=foundry.utils,tt=class o extends ye{static{u(this,"CareerWizard")}constructor(e){super(e),this.attributes=Object.keys(b.characteristics).map(t=>game.i18n.localize(`CHARAbbrev.${t.toUpperCase()}`))}static get abilityExceptions(){return{principles:new RegExp(`^${game.i18n.localize("LocalizedIDs.principles")} \\(`),obligations:new RegExp(`^${game.i18n.localize("LocalizedIDs.obligations")} \\(`)}}static get defaultOptions(){let e=super.defaultOptions;return e.title=game.i18n.format("WIZARD.addItem",{item:`${game.i18n.localize("TYPES.Item.career")}`}),e.template="systems/dsa5/templates/wizard/add-career-wizard.html",e}activateListeners(e){super.activateListeners(e),e.find(".optional").change(t=>{let a=$(t.currentTarget).closest(".content");if($(t.currentTarget).hasClass("exclusiveTricks")){let r=Number(a.find(".maxTricks").attr("data-spelltricklimit"));if(a.find(".exclusiveTricks:checked").length>r){t.currentTarget.checked=!1,ye.flashElem(a.find(".maxTricks"));return}}let s=Number(a.attr("data-cost")),i={};a.find(".optional:checked").each(function(){let r=Number($(this).attr("data-cost")),l=$(this).attr("name"),c=!1;for(let[m,d]of Object.entries(o.abilityExceptions))if(d.test(l)){(!i[m]||re.type=="specialability"&&e.system.category.value=="language").reduce((e,t)=>e+Number(t.system.APValue.value)*(t.system.step.value||1),0)}async getData(e){let t=await super.getData(e),a=await this.parseToItem(this.career.system.requirements.value,["disadvantage","advantage","specialability"]),s=a.filter(D=>["advantage","disadvantage"].includes(D.type)&&!D.disabled),i=await this.parseToItem(this.career.system.recommendedAdvantages.value,["advantage"]);this.fixPreviousCosts(a,i);let n=await this.parseToItem(this.career.system.recommendedDisadvantages.value,["disadvantage"]);this.fixPreviousCosts(a,n);let r=a.filter(D=>D.attributeRequirement),l=this._parseAttributes(this.career.system.combatSkills.value,/,|;/),c=this._parseAttributes(this.career.system.specialAbilities.value),m=this._parseAttributes(this.career.system.spells.value),d=this._parseAttributes(this.career.system.liturgies.value),p=Math.min(this._spendLanguagePoints(),Number(this.career.system.languagePoints.value)),f=Number(this.career.system.APValue.value)-p,h={},y=0;for(let D of a){if(D.disabled)continue;let v=!1;for(let[I,A]of Object.entries(o.abilityExceptions))if(A.test(D.name)){(!h[I]||D.apCostD.type=="specialability"&&!D.disabled);return Qr(t,{title:game.i18n.format("WIZARD.addItem",{item:`${game.i18n.localize("career")} ${this.career.name}`}),career:this.career,description:game.i18n.format("WIZARD.careerdescr",{career:this.career.name,cost:f+y}),baseCost:f,advantages:i,disadvantages:n,missingVantages:s,specAbChoices:c,spellChoices:m,liturgyChoices:d,missingSpecialabilities:k,combatskillchoices:l,spelltricks:await this.parseToItem(this.career.system.spelltricks.value,["magictrick"]),attributeRequirements:r,advantagesToChose:i.length,disadvantagesToChose:n.length,vantagesToChose:i.length||n.length||s.length,missingVantagesToChose:s.length,missingSpecialabiltiesToChose:k.length,combatToChose:l.length,magicToChose:this.career.system.spelltrickCount.value||m.length,religionToChose:d.length,anyAttributeRequirements:r.length,generalToChose:k.length||r.length||c.length,enrichedClothing:await TextEditor.enrichHTML(Ln(this.career.system,"clothing.value"),{secrets:!1,async:!0}),enrichedDescription:await TextEditor.enrichHTML(Ln(this.career.system,"description.value"),{secrets:!1,async:!0})}),t}async addCareer(e,t){this.actor=e,this.career=t}async setAbility(e,t,a=[]){if(e.trim()=="")return;let s=[],i=[],n=game.i18n.localize("combatskillcountdivider")+":";for(let r of e.split(",").concat(a)){if(r.includes(n)||r=="")continue;let l=g.parseAbilityString(r.trim()),c=this.actor.items.find(m=>t.includes(m.type)&&m.name==l.original);if(c)c=ei(c),c.system.talentValue?c.system.talentValue.value=l.step:c.system.step&&(c.system.step.value=l.step),c=te.reverseAdoptionCalculation(this.actor,l,c),i.push(c);else if(c=await this.findCompendiumItem(l.original,t),c||(c=await this.findCompendiumItem(l.name,t)),c)c=ei(c),c.name=l.original,c.system.talentValue?c.system.talentValue.value=l.step:c.system.step&&(c.system.step.value=l.step),c=te.reverseAdoptionCalculation(this.actor,l,c),s.push(c);else{let m=t.map(d=>g.categoryLocalization(d)).join("/");this.errors.push(`${m}: ${r}`),ui.notifications.error(game.i18n.format("DSAError.notFound",{category:m,name:r}))}}await this.actor.updateEmbeddedDocuments("Item",i,{render:!1}),await this.actor.createEmbeddedDocuments("Item",s,{render:!1})}async addBlessing(e,t){let a=[];for(let s of e){let i=s.trim();if(i=="")continue;let n=this.actor.items.find(r=>t==r.type&&r.name==i);n||(n=await this.findCompendiumItem(i,[t]),n?(n=ei(n),a.push(n)):(this.errors.push(`${g.categoryLocalization(t)}: ${s}`),ui.notifications.error(game.i18n.format("DSAError.notFound",{category:game.i18n.localize(t),name:i}))))}await this.actor.createEmbeddedDocuments("Item",a,{render:!1})}getExclusiveChoices(e,t){let a=[];for(let s of e.find(`${t}.exclusive:checked`))a.push($(s).val());return a}async updateCharacter(e,t=this){e.find("button.ok i").toggleClass("fa-check fa-spinner fa-spin");let a=Number(e.find(".apCost").text());if(!this._validateInput(e,t)||!await this.actor.checkEnoughXP(a)||await this.alreadyAdded(this.actor.system.details.career.value,"career")){e.find("button.ok i").toggleClass("fa-check fa-spinner fa-spin");return}let s={"system.details.career.value":this.career.name,"system.freeLanguagePoints.value":this.career.system.languagePoints.value,"system.freeLanguagePoints.used":Math.min(this._spendLanguagePoints(),Number(this.career.system.languagePoints.value))};for(let n of e.find(".attributes")){let r=$(n).attr("data-attribute").toLowerCase();r=game.dsa5.config.knownShortcuts[r.toLowerCase()][1],Number(this.actor.system.characteristics[r].initial)+Number(this.actor.system.characteristics[r].advances)!(n.includes(game.i18n.localize("combatskillcountdivider")+":")||n==""));await this.updateSkill(i,"combatskill",1,!1),await this.actor.update(s),await _.track(this.actor,{type:"item",item:this.career,state:1},a),this.finalizeUpdate()}};var{mergeObject:Xr}=foundry.utils,at=class extends ye{static{u(this,"SpeciesWizard")}static get defaultOptions(){let e=super.defaultOptions;return e.title=game.i18n.format("WIZARD.addItem",{item:`${game.i18n.localize("TYPES.Item.species")}`}),e.template="systems/dsa5/templates/wizard/add-species-wizard.html",e}activateListeners(e){super.activateListeners(e),e.find(".optional").change(t=>{let a=$(t.currentTarget).closest(".content"),s=Number(a.attr("data-cost"));a.find(".optional:checked").each(function(){s+=Number($(this).attr("data-cost"))});let i=a.find(".apCost");i.text(s),ye.flashElem(i,"emphasize2")})}async _toGroups(e,t,a){return await Promise.all(e.split(` -`).map(async i=>{let n=i.split(":"),r;return n.length>1?r={name:n[0].trim(),res:await this.parseToItem(n[1].trim(),t)}:r={name:"",res:await this.parseToItem(i,t)},this.fixPreviousCosts(a,r.res),r}))}async getData(e){let t=await super.getData(e),a=await this.parseToItem(this.species.system.requirements.value,["disadvantage","advantage"]),s=a.filter(m=>["advantage","disadvantage"].includes(m.type)&&!m.disabled),i=await this._toGroups(this.species.system.recommendedAdvantages.value,["advantage"],a),n=await this._toGroups(this.species.system.recommendedDisadvantages.value,["disadvantage"],a),r=this._parseAttributes(this.species.system.attributeChange.value),l=Number(this.species.system.APValue.value),c=a.reduce(function(m,d){return m+(d.disabled?0:Number(d.system.APValue.value)||0)},0);return Xr(t,{title:game.i18n.format("WIZARD.addItem",{item:`${game.i18n.localize("TYPES.Item.species")} ${this.species.name}`}),species:this.species,description:game.i18n.format("WIZARD.speciesdescr",{species:this.species.name,cost:l+c}),advantagegroups:i,baseCost:l,disadvantagegroups:n,missingVantages:s,attributeRequirements:r,hasLocalization:game.i18n.has(`Racedescr.${this.species.name}`),anyAttributeRequirements:r.length>0,advantagesToChose:i.length>0,missingVantagesToChose:s.length>0,disadvantagesToChose:n.length>0,vantagesToChose:i.length>0||n.length>0||s.length>0,generalToChose:r.length>0}),t}async addSpecies(e,t){this.actor=e,this.species=t}async updateCharacter(e,t=this){e.find("button.ok i").toggleClass("fa-check fa-spinner fa-spin");let a=Number(e.find(".apCost").text());if(!this._validateInput(e,t)||!await this.actor.checkEnoughXP(a)||await this.alreadyAdded(this.actor.system.details.species.value,"species")){e.find("button.ok i").toggleClass("fa-check fa-spinner fa-spin");return}let s={"system.details.species.value":this.species.name,"system.status.speed.initial":this.species.system.baseValues.speed.value,"system.status.soulpower.initial":this.species.system.baseValues.soulpower.value,"system.status.toughness.initial":this.species.system.baseValues.toughness.value,"system.status.wounds.initial":this.species.system.baseValues.wounds.value,"system.status.wounds.value":this.species.system.baseValues.wounds.value+this.actor.system.characteristics.ko.value*2},i=[];for(let n of e.find(".exclusive:checked"))i.push($(n).val());Object.keys(b.characteristics).forEach(n=>{s[`system.characteristics.${n}.species`]=0});for(let n of this.species.system.attributeChange.value.split(",").concat(i)){if(n.includes(game.i18n.localize("combatskillcountdivider")+":")||n=="")continue;let r=n.trim().split(" "),l=game.dsa5.config.knownShortcuts[r[0].toLowerCase().trim()].slice(0);l[l.length-1]="species",s[`system.${l.join(".")}`]=Number(r[1])}await this.actor._updateAPs(a,{},{render:!1}),await this.addSelections(e.find(".optional:checked"),!1),await this.actor.update(s),await this.actor.removeCondition("incapacitated"),await _.track(this.actor,{type:"item",item:this.species,state:1},a),this.finalizeUpdate()}};var{mergeObject:Zr}=foundry.utils,Ce=class extends ze{static{u(this,"ActorSheetdsa5Character")}static get defaultOptions(){let e=super.defaultOptions;return Zr(e,{classes:e.classes.concat(["dsa5","actor","character-sheet"]),width:784}),e}get template(){return this.showLimited()?"systems/dsa5/templates/actors/npc-limited.html":"systems/dsa5/templates/actors/actor-sheet.html"}async _manageDragItems(e,t){switch(t){case"aggregatedTest":await this.actor.createEmbeddedDocuments("Item",[e]);break;case"species":let a=new at;await a.addSpecies(this.actor,e),a.render(!0);break;case"culture":let s=new et;await s.addCulture(this.actor,e),s.render(!0);break;case"career":let i=new tt;await i.addCareer(this.actor,e),i.render(!0);break;default:return super._manageDragItems(e,t)}}};var{mergeObject:eo,getProperty:ga}=foundry.utils,Ne=class extends ze{static{u(this,"ActorSheetdsa5Creature")}static get defaultOptions(){let e=super.defaultOptions;return eo(e,{classes:e.classes.concat(["dsa5","actor","creature-sheet"])}),e}get template(){return this.showLimited()?"systems/dsa5/templates/actors/creature-limited.html":"systems/dsa5/templates/actors/creature-sheet.html"}async getData(e){let t=await super.getData(e);return t.enrichedDescription=await TextEditor.enrichHTML(ga(this.actor.system,"description.value"),{secrets:this.object.isOwner,async:!0}),t.enrichedBehaviour=await TextEditor.enrichHTML(ga(this.actor.system,"behaviour.value"),{secrets:this.object.isOwner,async:!0}),t.enrichedFlight=await TextEditor.enrichHTML(ga(this.actor.system,"flight.value"),{secrets:this.object.isOwner,async:!0}),t.enrichedSpecialrules=await TextEditor.enrichHTML(ga(this.actor.system,"specialRules.value"),{secrets:this.object.isOwner,async:!0}),t}async _cleverDeleteItem(e){let t=this.actor.items.find(a=>a.id==e);switch(t.type){case"trait":let a=t.system.APValue.value*-1;await this._updateAPs(a,{},{render:!1}),await _.track(this.actor,{type:"item",item:t,state:-1},a);break}await super._cleverDeleteItem(e)}async _addTrait(e){if(!this.actor.items.find(a=>a.type=="trait"&&a.name==e.name)){await this._updateAPs(e.system.APValue.value,{},{render:!1}),await he.traitAdded(this.actor,e);let a=(await this.actor.createEmbeddedDocuments("Item",[e]))[0];await _.track(this.actor,{type:"item",item:a,state:1},e.system.APValue.value)}}async _onDropItemCreate(e){return e.type=="trait"?this._addTrait(e):super._onDropItemCreate(e)}};var{mergeObject:to}=foundry.utils,Re=class extends Ce{static{u(this,"ActorSheetdsa5NPC")}static get defaultOptions(){let e=super.defaultOptions;return to(e,{classes:e.classes.concat(["dsa5","actor","npc-sheet"])}),e}get template(){return this.showLimited()?"systems/dsa5/templates/actors/npc-limited.html":"systems/dsa5/templates/actors/npc-sheet.html"}};var{getProperty:ao}=foundry.utils,je=u(o=>class extends o{async obfuscateItem(e){e.stopPropagation(),e.preventDefault();let t=e.currentTarget.dataset.obfuscate;await this.item.update({[`system.obfuscation.${t}`]:!this.isObfuscated(t)})}isObfuscated(e){return ao(this.item,`system.obfuscation.${e}`)}activateListeners(e){super.activateListeners(e),e.on("click",".obfuscateSection",t=>this.obfuscateItem(t))}obfuscationCss(e){return this.isObfuscated(e)?"":" pale"}async _render(e=!1,t={}){await super._render(e,t);let a=["details","effects","description","enchantment"],s=!1;for(let i of a){let n=$(this._element).find(`nav [data-tab="${i}"]`);if(!n.length)continue;let r=t.tabsinvisible||this.isObfuscated(i),l=game.i18n.localize(`SHEET.${r?"deobfuscateItem":"obfuscateItem"}`);if(game.user.isGM){let c=`obfuscateSection${this.obfuscationCss(i)}`,m=n.find(`.${c}`),d=``;m.length?m.replaceWith(d):n.append(` ${d}`)}else r&&(n.hasClass("active")&&(s=!0),n.remove(),i=="details"&&$(this._element).find('[name="system.price.value"],[name="system.price.raw"]').replaceWith(""))}if(s){let i=$(this._element).find("nav .item:first-child");if(i.length)this.activateTab(i.attr("data-tab"));else{let n=await renderTemplate("systems/dsa5/templates/items/obfuscatedItem.html",{item:this.item});$(this._element).find(".content").html(n)}}}},"ItemSheetObfuscation");var{mergeObject:ce,getProperty:be,duplicate:Di}=foundry.utils,Y=class o extends ItemSheet{static{u(this,"ItemSheetdsa5")}_getSubmitData(e={}){let t=super._getSubmitData(e),a=foundry.utils.flattenObject(this.item.overrides||{});return Object.keys(a).forEach(s=>delete t[s]),t}static get defaultOptions(){let e=super.defaultOptions;return ce(e,{tabs:[{navSelector:".tabs",contentSelector:".content",group:"primary"},{group:"secondary",navSelector:".tabs2",contentSelector:".content2"}],classes:e.classes.concat(["dsa5","item"]),width:471,height:500}),e}static setupSheets(){Items.unregisterSheet("core",ItemSheet),Items.registerSheet("dsa5",o,{makeDefault:!0}),Items.registerSheet("dsa5",vi,{makeDefault:!0,types:["species"]}),Items.registerSheet("dsa5",ci,{makeDefault:!0,types:["book"]}),Items.registerSheet("dsa5",pi,{makeDefault:!0,types:["career"]}),Items.registerSheet("dsa5",gi,{makeDefault:!0,types:["culture"]}),Items.registerSheet("dsa5",Ci,{makeDefault:!0,types:["advantage","disadvantage"]}),Items.registerSheet("dsa5",Si,{makeDefault:!0,types:["ritual","ceremony","liturgy","spell"]}),Items.registerSheet("dsa5",wi,{makeDefault:!0,types:["specialability"]}),Items.registerSheet("dsa5",bi,{makeDefault:!0,types:["meleeweapon"]}),Items.registerSheet("dsa5",ki,{makeDefault:!0,types:["poison"]}),Items.registerSheet("dsa5",hi,{makeDefault:!0,types:["disease"]}),Items.registerSheet("dsa5",fi,{makeDefault:!0,types:["consumable"]}),Items.registerSheet("dsa5",Ai,{makeDefault:!0,types:["spellextension"]}),Items.registerSheet("dsa5",yi,{makeDefault:!0,types:["magictrick"]}),Items.registerSheet("dsa5",mi,{makeDefault:!0,types:["blessing"]}),Items.registerSheet("dsa5",di,{makeDefault:!0,types:["rangeweapon"]}),Items.registerSheet("dsa5",ii,{makeDefault:!0,types:["equipment"]}),Items.registerSheet("dsa5",ni,{makeDefault:!0,types:["armor"]}),Items.registerSheet("dsa5",si,{makeDefault:!0,types:["ammunition"]}),Items.registerSheet("dsa5",ri,{makeDefault:!0,types:["plant"]}),Items.registerSheet("dsa5",li,{makeDefault:!0,types:["magicalsign"]}),Items.registerSheet("dsa5",oi,{makeDefault:!0,types:["patron"]}),Items.registerSheet("dsa5",ai,{makeDefault:!0,types:["information"]}),Items.registerSheet("dsa5",ti,{makeDefault:!0,types:["aggregatedTest"]}),Items.registerSheet("dsa5",Ti,{makeDefault:!0,types:["trap"]}),Items.unregisterSheet("dsa5",o,{types:["armor","equipment","rangeweapon","blessing","magictrick","spellextension","consumable","aggregatedTest","species","career","culture","advantage","specialability","disadvantage","ritual","information","trap","ceremony","liturgy","spell","disease","poison","meleeweapon","ammunition","plant","magicalsign","patron"]})}async _render(e=!1,t={}){await super._render(e,t),$(this._element).find(".close").attr("data-tooltip","SHEET.Close"),$(this._element).find(".configure-sheet").attr("data-tooltip","SHEET.Configure"),$(this._element).find(".import").attr("data-tooltip","SHEET.Import")}_getHeaderButtons(){let e=super._getHeaderButtons();return e.unshift({class:"showItemHead",icon:"fas fa-comment",tooltip:"SHEET.PostItem",onclick:u(async()=>this.item.postItem(),"onclick")}),this.item.actor&&J.getOnUseEffect(this.item)&&e.unshift({class:"onUseEffect",tooltip:"SHEET.onUseEffect",icon:"fas fa-dice-six",onclick:u(async()=>{new J(this.item).executeOnUseEffect()},"onclick")}),e}setupEffect(e){this.item.setupEffect().then(t=>this.item.itemTest(t))}get template(){return`systems/dsa5/templates/items/item-${this.item.type}-sheet.html`}_getItemId(e){return $(e.currentTarget).parents(".item").attr("data-item-id")}_advanceStep(){}_refundStep(){}async advanceWrapper(e,t){this.wrapperLocked||(this.wrapperLocked=!0,$(e.currentTarget).find("i").addClass("fa-spin fa-spinner"),await this[t]())||(this.wrapperLocked=!1,$(e.currentTarget).find("i").removeClass("fa-spin fa-spinner"))}activateListeners(e){super.activateListeners(e),me(e),e.find(".advance-step").mousedown(a=>this.advanceWrapper(a,"_advanceStep")),e.find(".refund-step").mousedown(a=>this.advanceWrapper(a,"_refundStep")),e.find(".domainsPretty").click(a=>{$(a.currentTarget).hide(),$(a.currentTarget).next(".domainToggle").show()}),e.find('[data-edit="img"]').mousedown(a=>{a.button==2&&g.showArtwork(this.item)}),e.find(".status-add").click(async()=>{z.createCustomEffect(this.item,"",this.item.name)}),e.find(".condition-show").mousedown(a=>{a.preventDefault();let s=a.currentTarget.dataset.id;a.button==0?this.item.effects.get(s).sheet.render(!0):a.button==2&&this.item.deleteEmbeddedDocuments("ActiveEffect",[s])}),e.find(".select2").select2(),e.find(".condition-toggle").mousedown(a=>{let s=$(a.currentTarget).parents(".statusEffect").attr("data-id"),i=this.item.effects.get(s);i.update({disabled:!i.disabled})}),e.find(".condition-edit").click(a=>{this.item.effects.get(a.currentTarget.dataset.id).sheet.render(!0)}),re.bindRollCommands(e),z.bindButtons(e);let t=e.find("header.item-header");if(t.length){let a=t.find("svg");if(a){new ResizeObserver(function(n){un(a,n[0].contentRect.width)}).observe(t.get(0));let i=t.find("input");i.get(0).disabled||(a.click(()=>{a.hide(),i.show(),i.focus()}),i.blur(function(){a.show(),i.hide()}))}}}async getData(e){let t=super.getData(e).data;switch(this.wrapperLocked=!1,this.item.type){case"skill":t.characteristics=b.characteristics,t.skillGroups=b.skillGroups,t.skillBurdens=b.skillBurdens,t.hasLocalization=game.i18n.has(`SKILLdescr.${this.item.name}`),t.StFs=b.StFs;break;case"application":t.hasLocalization=game.i18n.has(`APPLICATION.${this.item.system.skill} - ${this.item.name}`),t.localization=game.i18n.localize(`APPLICATION.${this.item.system.skill} - ${this.item.name}`),t.allSkills=await g.allSkillsList();break;case"combatskill":t.weapontypes=b.weapontypes,t.guidevalues=b.combatskillsGuidevalues,t.hasLocalization=game.i18n.has(`Combatskilldescr.${this.item.name}`),t.StFs=b.StFs;break;case"money":t.moneyTypes=b.moneyTypes;break;case"trait":t.traitCategories=b.traitCategories,t.ranges=b.meleeRanges;break}if(t.isOwned=this.item.actor,t.editable=this.isEditable,t.isOwned){t.canAdvance=this.item.actor.canAdvance&&this._advancable();let a=be(this.item,"flags.dsa5.customPriceTag");!this.isEditable&&a&&(t.customPrice=a)}return t.conditions=this.item.effects,game.user.isGM||t.conditions.filter(a=>!a.getFlag("dsa5","hidePlayers")),t.item=this.item,t.enableWeaponAdvantages=game.settings.get("dsa5","enableWeaponAdvantages"),t.armorAndWeaponDamage=game.settings.get("dsa5","armorAndWeaponDamage"),t.isGM=game.user.isGM,t.yesNoGroup={true:game.i18n.localize("yes"),false:game.i18n.localize("no")},t.enrichedDescription=await TextEditor.enrichHTML(be(this.item.system,"description.value"),{secrets:this.object.isOwner,async:!0}),t.enrichedGmdescription=await TextEditor.enrichHTML(be(this.item.system,"gmdescription.value"),{secrets:this.object.isOwner,async:!0}),t}_advancable(){return!1}},ti=class extends Y{static{u(this,"AggregatedTestSheet")}async getData(e){let t=await super.getData(e),a=this.item.getFlag("dsa5","embeddedItem"),s;return a&&(s=await renderTemplate(`systems/dsa5/templates/items/browse/${a.type}.html`,{document:a})),ce(t,{allSkills:await g.allSkillsList(),embeddedItem:a,renderedItem:s,enrichedsuccess:await TextEditor.enrichHTML(this.item.system.success,{secrets:this.item.isOwner,async:!0}),enrichedpartsuccess:await TextEditor.enrichHTML(this.item.system.partsuccess,{secrets:this.item.isOwner,async:!0})}),t}static get defaultOptions(){let e=super.defaultOptions;return ce(e,{dragDrop:[{dragSelector:".item-list .item",dropSelector:".content"}]}),e}_getHeaderButtons(){let e=super._getHeaderButtons();return this.item.isOwned||e.unshift({class:"postAsGroupCheck",tooltip:"SHEET.postAsGroupCheck",icon:"fas fa-dice-d20",onclick:u(async()=>this.postAsGroupCheck(),"onclick")}),e}async postAsGroupCheck(){let e=["value","value2","value3"].filter(a=>this.item.system.talent[a]).map(a=>({type:"skill",modifier:this.item.system.baseModifier,calculatedModifier:this.item.system.baseModifier,target:this.item.system.talent[a]}));if(!e.length)return;let t={modifier:this.item.system.baseModifier,maxRolls:this.item.system.allowedTestCount.value,enrichedsuccess:await TextEditor.enrichHTML(this.item.system.success,{secrets:this.item.isOwner,async:!0}),enrichedpartsuccess:await TextEditor.enrichHTML(this.item.system.partsuccess,{secrets:this.item.isOwner,async:!0}),rollOptions:e};ie.showGCMessage(e[0].target,0,t)}activateListeners(e){super.activateListeners(e),e.find(".buildItem").click(async()=>this.postFinishedItem())}async postFinishedItem(){if(!this.item.actor)return;let e=this.item.getFlag("dsa5","embeddedItem");if(!e)return;let t=await renderTemplate("systems/dsa5/templates/chat/production-result.html",{actor:this.item.actor,item:e,actorImg:ee.videoOrImgTag(this.item.actor.img)}),a=g.chatDataSetup(t);a.flags={dsa5:{embeddedItem:e}},await ChatMessage.create(a)}_canDragDrop(e){return this.isEditable}async _onDrop(e){let t=JSON.parse(e.dataTransfer.getData("text/plain"));await this.dropCreation(t)}async dropCreation(e){let{item:t,typeClass:a,selfTarget:s}=await Ee(e,void 0,!1);b.equipmentCategories.has(a)&&this.item.setFlag("dsa5","embeddedItem",t.toObject())}},st=class extends Y{static{u(this,"Enchantable")}async _onDrop(e){await this.enchant(e),this.isPoisonable&&await this.poison(e)}async enchant(e){let t=JSON.parse(e.dataTransfer.getData("text/plain"));await this._enchant([t])}async _enchant(e){let t=this.item.getFlag("dsa5","enchantments")||[];if(t.length+e.length>7)return ui.notifications.error("DSAError.tooManyEnchants",{localize:!0});for(let a of e){let{item:s,typeClass:i,selfTarget:n}=await Ee(a,void 0,!1);if(["spell","liturgy","ceremony","ritual"].includes(i)){if(!s.pack)return ui.notifications.error("DSAError.onlyCompendiumSpells",{localize:!0});let r={name:s.name,pack:s.pack,id:t.length,itemId:s.id,permanent:["liturgy","ceremony"].includes(i)||a.permanent,actorId:a.actorId,charged:!0,talisman:["liturgy","ceremony"].includes(i),fw:["liturgy","ceremony"].includes(i)?18:a.fw||0};t.push(r)}}if(t.length){let a={flags:{dsa5:{enchantments:t}}};await this.item.update(a)}}async poison(e){let t=JSON.parse(e.dataTransfer.getData("text/plain")),{item:a,typeClass:s,selfTarget:i}=await Ee(t,void 0,!1);if(s=="poison"){let r={flags:{dsa5:{poison:{name:a.name,pack:a.pack,itemId:a._id,permanent:!1,actorId:t.actorId}}}};await this.item.update(r)}}toggleChargedState(e,t){for(let a of t)if(a.id==e){a.charged=a.talisman&&a.permanent?!0:!a.charged;break}this.item.update({flags:{dsa5:{enchantments:t}}})}async rollEnchantment(e,t){let a=t.find(i=>i.id==e);if(!a.charged)return ui.notifications.error("DSAError.NotEnoughCharges",{localize:!0});let s=await this.getSpell(a);if(s){s=s.toObject(),s.system.talentValue.value=a.fw;let i=await g.emptyActor(14,this.item.name);i.setupSpell(s,{},"emptyActor").then(async n=>{let r=game.i18n.format("CHATNOTIFICATION.enchantmentUsed",{item:this.item.name,spell:s.name});await ChatMessage.create(g.chatDataSetup(r)),await i.basicTest(n),a.permanent?this.toggleChargedState(e,t):this.deleteEnchantment(e,t)})}}activateListeners(e){super.activateListeners(e),e.find(".ench-toggle-permanent").click(t=>{let{id:a,enchantments:s}=this.enchantMentId(t);for(let i of s)if(i.id==a){i.permanent=!i.permanent;break}this.item.update({flags:{dsa5:{enchantments:s}}})}),e.find(".ench-toggle-charge").click(t=>{let{id:a,enchantments:s}=this.enchantMentId(t);this.toggleChargedState(a,s)}),e.find(".ench-roll").click(async t=>{let{id:a,enchantments:s}=this.enchantMentId(t);this.rollEnchantment(a,s)}),e.find(".ench-fw").change(t=>{let{id:a,enchantments:s}=this.enchantMentId(t),i=Number($(t.currentTarget).val());if(i){for(let n of s)if(n.id==a){n.fw=i;break}this.item.update({flags:{dsa5:{enchantments:s}}})}}),e.find(".ench-delete").click(t=>{let{id:a,enchantments:s}=this.enchantMentId(t);this.deleteEnchantment(a,s)}),e.find(".ench-show").click(async t=>{let{id:a,enchantments:s}=this.enchantMentId(t),i=s.find(r=>r.id==a),n=await this.getSpell(i);n&&n.sheet.render(!0)}),e.find(".poison-toggle-permanent").click(t=>{this.item.update({flags:{dsa5:{poison:{permanent:!this.item.flags.dsa5.poison.permanent}}}})}),e.find(".poison-delete").click(t=>{this.deletePoison()}),e.find(".poison-show").click(async()=>{let t;this.item.actor&&(t=this.item.actor.items.find(a=>a.type=="poison"&&a.name==this.item.flags.dsa5.poison.name)),t||(t=await this.getSpell(this.item.flags.dsa5.poison)),t&&t.sheet.render(!0)})}deletePoison(){this.item.update({"flags.dsa5.-=poison":null})}deleteEnchantment(e,t){let a=t.findIndex(s=>s.id==e);t.splice(a,1),this.item.update({flags:{dsa5:{enchantments:t}}})}async getSpell(e){let t=await game.packs.get(e.pack),a;if(t&&(a=await t.getDocument(e.itemId),!a)){let s=await t.index.getName(e.name);s&&(a=await t.getDocument(s._id))}if(!a){let s=game.dsa5.itemLibrary;s.equipmentBuild||await s.buildEquipmentIndex(),s.findCompendiumItem;let i=e.talisman?["liturgy","ceremony"]:["spell","ritual"];for(let n of i)if(a=await game.dsa5.itemLibrary.findCompendiumItem(e.name,n),a=a.find(r=>r.name==e.name&&r.type==n&&r.system),a)break}return a||ui.notifications.error("DSAError.enchantmentNotFound",{localize:!0}),a}enchantMentId(e){return{id:$(e.currentTarget).parents(".statusEffect").attr("data-id"),enchantments:this.item.getFlag("dsa5","enchantments")}}prepareDomains(){let e=be(this.item.system,"effect.attributes");if(e){let t=new RegExp(game.i18n.localize("WEAPON.magical"),"i"),a=new RegExp(game.i18n.localize("WEAPON.clerical"),"i");e=e.split(",").map(s=>{let i="";return t.test(s)?i="magical":a.test(s)&&(i="blessed"),`
  • ${s}
  • `}).join("")}return e}static get defaultOptions(){let e=super.defaultOptions;return ce(e,{dragDrop:[{dragSelector:".item-list .item",dropSelector:".content"}]}),e}_canDragDrop(e){return this.isEditable}async getData(e){let t=await super.getData(e);t.enchantments=this.item.getFlag("dsa5","enchantments");let a=[];t.poison=this.item.getFlag("dsa5","poison"),t.poison&&a.push("TYPES.Item.poison"),t.enchantments&&t.enchantments.some(i=>!i.talisman)&&a.push("enchantment"),t.enchantments&&t.enchantments.some(i=>i.talisman)&&a.push("talisman"),t.enchantmentLabel=a.map(i=>game.i18n.localize(i)).join("/");let s={};for(let i of Object.keys(b.traditionArtifacts))s[i]=game.i18n.localize(`traditionArtifacts.${i}`);return t.traditionArtifacts=s,t.hasEnchantments=t.poison||t.enchantments&&t.enchantments.length>0,t}},ai=class extends Y{static{u(this,"InformationSheet")}async getData(e){let t=await super.getData(e);return ce(t,{allSkills:await g.allSkillsList(),enrichedqs1:await TextEditor.enrichHTML(this.item.system.qs1,{async:!0}),enrichedqs2:await TextEditor.enrichHTML(this.item.system.qs2,{async:!0}),enrichedqs3:await TextEditor.enrichHTML(this.item.system.qs3,{async:!0}),enrichedqs4:await TextEditor.enrichHTML(this.item.system.qs4,{async:!0}),enrichedqs5:await TextEditor.enrichHTML(this.item.system.qs5,{async:!0}),enrichedqs6:await TextEditor.enrichHTML(this.item.system.qs6,{async:!0}),enrichedCrit:await TextEditor.enrichHTML(this.item.system.crit,{async:!0}),enrichedBotch:await TextEditor.enrichHTML(this.item.system.botch,{async:!0}),enrichedFail:await TextEditor.enrichHTML(this.item.system.fail,{async:!0})}),t}},si=class extends st{static{u(this,"AmmunitionSheet")}constructor(e,t){super(e,t),this.isPoisonable=!0}async getData(e){let t=await super.getData(e);return t.ammunitiongroups=b.ammunitiongroups,t.domains=this.prepareDomains(),t}},ii=class extends je(st){static{u(this,"EquipmentSheet")}async getData(e){let t=await super.getData(e);if(ce(t,{equipmentTypes:b.equipmentTypes,domains:this.prepareDomains(),canOnUseEffect:game.user.isGM||game.settings.get("dsa5","playerCanEditSpellMacro")}),this.isBagWithContents()){let a=0;ce(t,{containerContent:this.item.actor.items.filter(s=>b.equipmentCategories.has(s.type)&&s.system.parent_id==this.item.id).map(s=>{s.system.preparedWeight=parseFloat((s.system.weight.value*s.system.quantity.value).toFixed(3)),a+=Number(s.system.preparedWeight);let i=be(s,"flags.dsa5.enchantments");return i&&i.length>0?s.enchantClass="rar":(s.system.effect&&s.system.effect.value!=""||s.effects.length>0)&&(s.enchantClass="common"),s}),weightSum:parseFloat(a.toFixed(3)),weightWidth:`style="width: ${Math.min(this.item.system.capacity?a/this.item.system.capacity*100:0,100)}%"`,weightExceeded:a>Number(this.item.system.capacity)?"exceeded":""})}return t}async breakOverflow(e,t){let a=$(await renderTemplate("systems/dsa5/templates/items/baghover.html",e)),s=t.offset().top+52,i=t.offset().left-75;return a.appendTo($("body")),a.css({position:"absolute",left:i+"px",top:s+"px",bottom:"auto",right:"auto","z-index":1e4}),a}activateListeners(e){super.activateListeners(e);let t=e.find(".slot");t.mouseenter(async a=>{let s=$(a.currentTarget),i=await this.breakOverflow({name:s.attr("data-name"),weight:s.attr("data-weight"),quantity:s.attr("data-quantity")},s);i.fadeIn(),s.mouseleave(()=>{i.remove(),s.off("mouseleave")})}),t.mousedown(async a=>{let s=a.currentTarget.dataset.itemId,i=this.actor.items.get(s);a.button==0?i.sheet.render(!0):a.button==2&&($(".itemInfo").remove(),await i.update({"system.parent_id":0}),this.render(!0))})}isBagWithContents(){return this.item.actor&&be(this.item,"system.equipmentType.value")=="bags"}async _onDrop(e){if(this.isBagWithContents()){let t=JSON.parse(e.dataTransfer.getData("text/plain")),{item:a,typeClass:s,selfTarget:i}=await Ee(t,void 0),n=this.item.id==a.id,r=this.item.parent.id==t.actorId;if(b.equipmentCategories.has(s)&&!n){a.system.parent_id=this.item.id,a.system.worn&&a.system.worn.value&&(a.system.worn.value=!1),r?await this.item.actor.updateEmbeddedDocuments("Item",[a]):await this.item.actor.sheet._addLoot(a),this.render(!0);return}}await super._onDrop(e)}},ni=class extends je(st){static{u(this,"ArmorSheet")}async getData(e){let t=await super.getData(e);return ce(t,{domains:this.prepareDomains(),armorSubcategories:Object.keys(b.armorSubcategories).reduce((a,s)=>(a[s]=game.i18n.localize(`ARMORSUBCATEGORIES.${s}`),a),{}),breakPointRating:b.armorSubcategories[this.item.system.subcategory]}),t.canOnUseEffect=game.user.isGM||game.settings.get("dsa5","playerCanEditSpellMacro"),t}_getHeaderButtons(){let e=super._getHeaderButtons();return this.item.isOwned&&game.settings.get("dsa5","armorAndWeaponDamage")&&this.item.system.structure.max>0&&e.unshift({class:"rollDamaged",tooltip:"DSASETTINGS.armorAndWeaponDamage",icon:"fas fa-dice-d20",onclick:u(async()=>W.breakingTest(this.item),"onclick")}),e}},ri=class extends je(Y){static{u(this,"PlantSheet")}async getData(e){let t=await super.getData(e);return t.attributes=Object.keys(t.system.planttype).map(a=>({name:a,checked:t.system.planttype[a]})),t.enrichedEffect=await TextEditor.enrichHTML(be(this.item.system,"effect"),{secrets:this.object.isOwner,async:!0}),t.enrichedRecipes=await TextEditor.enrichHTML(be(this.item.system,"recipes"),{secrets:this.object.isOwner,async:!0}),t.enrichedInformation=await TextEditor.enrichHTML(be(this.item.system,"infos"),{secrets:this.object.isOwner,async:!0}),t}},oi=class extends Y{static{u(this,"PatronSheet")}async getData(e){let t=await super.getData(e);return t.patronCategories=[0,1,2,3].map(a=>({name:game.i18n.localize(`PATRON.${a}`),val:a})),t.priorities={0:game.i18n.localize("PATRON.primary"),1:game.i18n.localize("PATRON.secondary")},t}},li=class extends Y{static{u(this,"MagicalSignSheet")}async getData(e){let t=await super.getData(e);return t.categories={1:game.i18n.localize("TYPES.Item.magicalsign"),2:game.i18n.localize("additionalsign")},t.canOnUseEffect=game.user.isGM||game.settings.get("dsa5","playerCanEditSpellMacro"),t}_getHeaderButtons(){let e=super._getHeaderButtons();return this.item.isOwned&&e.unshift({class:"rolleffect",tooltip:"SHEET.RollEffect",icon:"fas fa-dice-d20",onclick:u(async t=>this.setupEffect(t),"onclick")}),e}async setupEffect(e){let t=Number(this.item.system.asp)||0;if(this.item.actor.system.status.astralenergy.valuer.type=="skill"&&r.name==game.i18n.localize("LocalizedIDs.artisticAbility")),n=`

    ${this.item.name}

    ${this.item.system.description.value}

    ${s.chatData(this.item.system,"").join("
    ")}

    `;a.setupSkill(i,{other:[n],subtitle:` (${game.i18n.localize("TYPES.Item.magicalsign")})`},void 0).then(async r=>{let l=await a.basicTest(r,{suppressMessage:!0});l.result.preData.calculatedSpellModifiers={finalcost:t,costsMana:!0},await R.renderRollCard(l.cardOptions,l.result,l.options.rerenderMessage)})}},ci=class extends je(st){static{u(this,"ItemBookDSA5")}async getData(e){let t=await super.getData(e);return ce(t,{formats:b.bookFormats,qualities:b.bookQualities,exemplarTypes:b.exemplarTypes,legalities:b.legalities}),t}},ha=class extends je(st){static{u(this,"WeaponSheetDSA5")}activateListeners(e){super.activateListeners(e),e.find(".attack-add").on("click",()=>this.addAttackSheet()),e.find(".attack-delete").on("click",t=>this.deleteAttack(t))}async getData(e){let t=await super.getData(e);return t.alternateAttacks=be(this.item,"flags.dsa5.alternateAttacks"),t.hasAlternateAttacks=t.alternateAttacks&&Object.keys(t.alternateAttacks).length>0,t}async deleteAttack(e){let t=e.currentTarget.dataset.key;await this.item.update({[`flags.dsa5.alternateAttacks.-=${t}`]:null})}_onChangeTab(e,t,a){super._onChangeTab(e,t,a),a=="details"&&$(this.element).find('[data-tab-container="secondary"]').length&&this.activateTab("baseAttack",{group:"secondary"})}async addAttackSheet(){let e=foundry.utils.randomID();await this.item.update({flags:{dsa5:{alternateAttacks:{[e]:{name:game.i18n.localize("CHAR.ATTACK")}}}}})}},di=class extends ha{static{u(this,"RangeweaponSheet")}get isPoisonable(){return game.i18n.localize(`LocalizedCTs.${this.item.system.combatskill.value}`)=="Throwing Weapons"}_getHeaderButtons(){let e=super._getHeaderButtons();return this.item.isOwned&&game.settings.get("dsa5","armorAndWeaponDamage")&&this.item.system.structure.max>0&&e.unshift({class:"rollDamaged",icon:"fas fa-dice-d20",onclick:u(async()=>W.breakingTest(this.item),"onclick")}),e}async getData(e){let t=await super.getData(e);return ce(t,{canOnUseEffect:game.user.isGM||game.settings.get("dsa5","playerCanEditSpellMacro"),ammunitiongroups:b.ammunitiongroups,combatskills:await g.allCombatSkillsList("range"),domains:this.prepareDomains(),breakPointRating:b.weaponStabilities[game.i18n.localize(`LocalizedCTs.${this.item.system.combatskill.value}`)]}),t}},mi=class extends Y{static{u(this,"BlessingSheetDSA5")}_getHeaderButtons(){let e=super._getHeaderButtons();return this.item.isOwned&&e.unshift({class:"rolleffect",icon:"fas fa-dice-d20",tooltip:"SHEET.RollEffect",onclick:u(async t=>this.setupEffect(t),"onclick")}),e}async getData(e){let t=await super.getData(e);return t.canOnUseEffect=game.user.isGM||game.settings.get("dsa5","playerCanEditSpellMacro"),t}async setupEffect(e){if(this.item.actor.system.status.karmaenergy.value<1)return ui.notifications.error("DSAError.NotEnoughKaP",{localize:!0});let t=game.dsa5.config.ItemSubclasses.magictrick;await this.item.actor.update({"system.status.karmaenergy.value":this.item.actor.system.status.karmaenergy.value-=1});let a=`

    ${this.item.name} - ${game.i18n.localize("blessing")} ${game.i18n.localize("probe")}

    ${this.item.system.description.value}

    ${t.chatData(this.item.system,"").join("
    ")}

    `;await ChatMessage.create(g.chatDataSetup(a))}},pi=class extends Y{static{u(this,"ItemCareerDSA5")}static get defaultOptions(){let e=super.defaultOptions;return ce(e,{width:700,height:700}),e}async getData(e){let t=await super.getData(e),a=Di(b.characteristics);return a["-"]="-",t.mageLevels=b.mageLevels,t.guidevalues=a,t.enrichedClothing=await TextEditor.enrichHTML(be(this.item.system,"clothing.value"),{secrets:this.object.isOwner,async:!0}),t}},fi=class extends je(Y){static{u(this,"ConsumableSheetDSA5")}static get defaultOptions(){let e=super.defaultOptions;return ce(e,{width:480}),e}_getHeaderButtons(){let e=super._getHeaderButtons();return this.item.isOwned&&e.unshift({class:"consumeItem",icon:"fas fa-dice-d20",tooltip:"SHEET.ConsumeItem",onclick:u(async t=>this.setupEffect(t),"onclick")}),e}async getData(e){let t=await super.getData(e);t.calculatedPrice=C.getSubClass(this.item.type).consumablePrice(this.item),t.availableSteps=t.system.QLList.split(` + ${game.i18n.localize(`CHATFATE.${r}`)}: ${n}`,c=s.preData;c.extra.actor=g.getSpeaker(c.extra.speaker).toObject(!1),this[`fate${t}`](l,i,c,e,s,a)}}get horseSpeed(){return H.getHorseSpeed(this)}async _buildEmbedHTML(e,t={}){let a=`systems/dsa5/templates/items/browse/${this.type}.html`,s=await renderTemplate(a,{document:this,isGM:game.user.isGM,...await this.sheet.getData(),...t});return $(s)[0]}setupFallingDamage(e,t){let a=game.i18n.localize("fallingDamage"),s=this.items.find(n=>n.type=="skill"&&n.name==game.i18n.localize("LocalizedIDs.bodyControl")).toObject(),i={subtitle:` (${a})`,postFunction:{functionName:"game.dsa5.entities.Actordsa5.updateFallingDamage",options:e,tokenId:t,speaker:D.buildSpeaker(this,t)}};this.setupSkill(s,i,t).then(async n=>{n.testData.opposable=!1;let r=await this.basicTest(n,{suppressMessage:!0});await o.updateFallingDamage(i.postFunction,r),await R.renderRollCard(r.cardOptions,r.result,r.options.rerenderMessage)})}static async updateFallingDamage(e,t,a){let s=(t.result.qualityStep||0)*2;we(e.options,{availableQs:s});let i=g.getSpeaker(e.speaker),n=await i._setupFallingHeight(e.options,e.tokenId),r=await i.basicTest(n,{suppressMessage:!0}),l=await renderTemplate("systems/dsa5/templates/chat/roll/fallingdamage-card.html",r);t.result.other||(t.result.other=[]),t.result.other.push(l),t.chatData&&(t.chatData.other=[l])}_setupFallingHeight(e,t){let a=game.i18n.localize("fallingDamage"),s={source:{type:"fallingDamage"},opposable:!1,extra:{actor:this.toObject(!1),options:e,speaker:D.buildSpeaker(this,t)}},i=[],n={title:a,template:"systems/dsa5/templates/dialog/fallingdamage-dialog.html",data:{rollMode:e.rollMode,situationalModifiers:i,fallingFloorOptions:b.fallingConditions,modifier:e.modifier||0},callback:u((l,c={})=>(s.situationalModifiers=[],s.situationalModifiers.push({name:game.i18n.localize("fallingFloor"),value:l.find('[name="fallingFloor"]').val()}),r.rollMode=l.find('[name="rollMode"]:checked').val(),s.fallingHeight=l.find('[name="testModifier"]').val(),we(s.extra.options,c),{testData:s,cardOptions:r}),"callback")},r=this._setupCardOptions("systems/dsa5/templates/chat/roll/fallingdamage-card.html",a,t);return R.setupDialog({dialogOptions:n,testData:s,cardOptions:r})}setupRegeneration(e,t={},a){let s=game.i18n.localize("regenerationTest"),i={source:{type:"regenerate",system:{}},opposable:!1,extra:{statusId:e,actor:this.toObject(!1),options:t,speaker:D.buildSpeaker(this,a)}};i.extra.actor.isMage=this.system.isMage,i.extra.actor.isPriest=this.system.isPriest;let n=z.getRollModifiers(i.extra.actor,i.source),r={title:s,template:"systems/dsa5/templates/dialog/regeneration-dialog.html",data:{rollMode:t.rollMode,regenerationInterruptOptions:b.regenerationInterruptOptions,regnerationCampLocations:b.regnerationCampLocations,showAspModifier:this.system.isMage,showKapModifier:this.system.isPriest,situationalModifiers:n,modifier:t.modifier||0},callback:u((c,m={})=>{i.situationalModifiers=o._parseModifiers(c),l.rollMode=c.find('[name="rollMode"]:checked').val(),i.situationalModifiers.push({name:game.i18n.localize("camplocation")+" - "+c.find('[name="regnerationCampLocations"] option:selected').text(),value:c.find('[name="regnerationCampLocations"]').val()},{name:game.i18n.localize("interruption")+" - "+c.find('[name="regenerationInterruptOptions"] option:selected').text(),value:c.find('[name="regenerationInterruptOptions"]').val()}),i.regenerationFactor=c.find('[name="badEnvironment"]').is(":checked")?.5:1;let d=["LeP","KaP","AsP"],p={};for(let f of d){i[`${f}Modifier`]=Number(c.find(`[name="${f}Modifier"]`).val()||0),i[`regeneration${f}`]=Number(this.system.status.regeneration[`${f}max`]);let h=c.find(`[name="regenerate${f}"]`).is(":checked")?1:0;i[`regenerate${f}`]=h,h&&(p[`system.status.regeneration.${f}Temp`]=0)}return we(i.extra.options,m),this.update(p),{testData:i,cardOptions:l}},"callback")},l=this._setupCardOptions("systems/dsa5/templates/chat/roll/regeneration-card.html",s,a);return R.setupDialog({dialogOptions:r,testData:i,cardOptions:l})}setupDodge(e={},t){let a="dodge",s={source:{system:this.system.status[a],type:a},opposable:!1,extra:{statusId:a,actor:this.toObject(!1),options:e,speaker:D.buildSpeaker(this,t)}},i=[game.i18n.localize(a),game.i18n.localize("LocalizedIDs.wrestle")],n=[...D.buildCombatSpecAbs(this,["Combat"],i,"parry",s.source),...D.buildCombatSpecAbs(this,["animal"],void 0,"parry",s.source)],r=z.getRollModifiers(s.extra.actor,s.source),l=D.getDefenseMalus(r,this),c=N.multipleDefenseValue(this,s.source),m={rollMode:e.rollMode,combatSpecAbs:n,showDefense:!0,situationalModifiers:r,isRangeAttack:l,defenseCountString:game.i18n.format("defenseCount",{malus:c}),multipleDefenseValue:c,isDodge:!0},d={title:`${game.i18n.localize(a)} ${game.i18n.localize("Test")}`,template:"systems/dsa5/templates/dialog/combatskill-enhanced-dialog.html",data:m,callback:u((f,h={})=>(fe.resolveMeleeDialog(s,p,f,this,h,c,"parry"),Hooks.call("callbackDialogCombatDSA5",s,this,f,s.source,t),s.isRangeDefense=m.isRangeDefense,{testData:s,cardOptions:p}),"callback")},p=this._setupCardOptions("systems/dsa5/templates/chat/roll/status-card.html",d.title,t);return R.setupDialog({dialogOptions:d,testData:s,cardOptions:p})}setupCharacteristic(e,t={},a){let s=Ke(this.system.characteristics[e]),i=g.attributeLocalization(e)+" "+game.i18n.localize("Test");s.attr=e;let n={opposable:!1,source:{type:"char",system:s},extra:{characteristicId:e,actor:this.toObject(!1),options:t,speaker:D.buildSpeaker(this,a)}},r={title:i,template:"systems/dsa5/templates/dialog/characteristic-dialog.html",data:{rollMode:t.rollMode,difficultyLabels:b.attributeDifficultyLabels,modifier:t.modifier||0},callback:u((c,m={})=>(l.rollMode=c.find('[name="rollMode"]:checked').val(),n.testDifficulty=b.attributeDifficultyModifiers[c.find('[name="testDifficulty"]').val()],n.situationalModifiers=o._parseModifiers(c),we(n.extra.options,m),{testData:n,cardOptions:l}),"callback")},l=this._setupCardOptions("systems/dsa5/templates/chat/roll/characteristic-card.html",i,a);return R.setupDialog({dialogOptions:r,testData:n,cardOptions:l})}static _parseModifiers(e){return[...e.find('[name="situationalModifiers"] option:selected').map(function(){let t=this.value,a={name:this.textContent.trim().split("[")[0],value:isNaN(t)?t:Number(t),type:this.dataset.type};return a.type=="dmg"&&(a.damageBonus=a.value,a.value=0),this.dataset.specAbId&&(a.specAbId=this.dataset.specAbId),this.dataset.armorPen&&(a.armorPen=this.dataset.armorPen),a}).get(),{name:game.i18n.localize("manual"),value:Number(e.find('[name="testModifier"]').val()),type:""}]}static _prepareConsumable(e){return e.system.maxCharges&&(e.consumable=!0,e.structureMax=e.system.maxCharges,e.structureCurrent=e.system.charges),e}static prepareMag(e){return e.system.ammunitiongroup.value=="mag"&&(e.structureMax=e.system.mag.max,e.structureCurrent=e.system.mag.value),e}static _prepareitemStructure(e){e.system.structure&&e.system.structure.max!=0&&(e.structureMax=e.system.structure.max,e.structureCurrent=e.system.structure.value);let t=U(e,"flags.dsa5.enchantments");if(t&&t.length>0)e.enchantClass="rar";else if(e.effects.length>0)e.enchantClass="common";else if(e.system.effect&&e.system.effect.value!="")if(e.type=="armor")for(let a of e.system.effect.value.split(/,|;/).map(s=>s.trim())){let s=a.replace(/(\s+)/g," ").trim().split(" ");if(!(s.length==2&&[game.i18n.localize("CHARAbbrev.INI").toLowerCase(),game.i18n.localize("CHARAbbrev.GS").toLowerCase()].includes(s[1].toLowerCase())&&!isNaN(s[0])&&s[0]==-1)){e.enchantClass="common";break}}else e.enchantClass="common";return e}static _prepareMeleetrait(e,t){return e.attack=Number(e.system.at.value),e.system.pa!=0&&(e.parry=e.system.pa),this._parseDmg(e,t)}static _prepareMeleeWeapon(e,t,a,s=null,i=!0){let n=t.find(r=>r.name==e.system.combatskill.value);if(n){e.attack=Number(n.system.attack.value)+Number(e.system.atmod.value);let r=e.system.guidevalue.value.split("/").map(m=>a.system.characteristics[m]?Number(a.system.characteristics[m].initial)+Number(a.system.characteristics[m].modifier)+Number(a.system.characteristics[m].advances)+Number(a.system.characteristics[m].gearmodifier):0),l=Math.ceil(n.system.talentValue.value/2)+Math.max(0,Math.floor((Math.max(...r)-8)/3))+Number(game.settings.get("dsa5","higherDefense"));e.parry=l+Number(e.system.pamod.value)+(N.isShield(e)?Number(e.system.pamod.value):0),e.yieldedTwoHand=N.isYieldedTwohanded(e),e.yieldedTwoHand||(s||(s=a.items.filter(m=>m.type=="meleeweapon"&&m.system.worn.value&&m._id!=e._id&&!N.isYieldedTwohanded(m))),s.length>0&&(e.parry+=Math.max(...s.map(m=>m.system.pamod.offhandMod)),e.attack+=Math.max(...s.map(m=>m.system.atmod.offhandMod))));let c=0;if(e.system.worn.wrongGrip)if(e.yieldedTwoHand)e.parry-=1,c=1;else switch(e.system.reach.value="medium",game.i18n.localize(`LocalizedCTs.${e.system.combatskill.value}`)){case"Two-Handed Impact Weapons":case"Two-Handed Swords":if(e.parry-=3,new RegExp(game.i18n.localize("wrongGrip.wrongGripBastardRegex")).test(e.name))c=-2;else{let p=game.i18n.localize("wrongGrip.oneHanded");e.gripDamageText=` (${p} * 0.5)`,e.dmgMultipliers||=[],e.dmgMultipliers.push({name:p,val:"0.5"})}break;default:e.parry-=1,c=-1}if(e=this._parseDmg(e,a.system),e.system.guidevalue.value!="-"){let m=Math.max(...e.system.guidevalue.value.split("/").map(p=>Number(a.system.characteristics[p].value))),d=Math.max(m-Number(e.system.damageThreshold.value),0)+c;d!=0&&(e.extraDamage=d,e.damageAdd=Roll.safeEval(e.damageAdd+" + "+Number(d)),e.damageAdd=(e.damageAdd>0?"+":"")+e.damageAdd)}if(W.weaponWearModifier(e),i){e.subweapons={};for(let m of Object.keys(U(e,"flags.dsa5.alternateAttacks")||{})){let d=this.buildSubweapon(e,m),p=this._prepareMeleeWeapon(d,t,a,s,!1);e.subweapons[m]=p}e.system.damageToolTip=W.damageTooltip(e)}}else i&&ui.notifications.error(game.i18n.format("DSAError.unknownCombatSkill",{skill:e.system.combatskill.value,item:e.name}));return e}static buildSubweapon(e,t){if(!t)return e;let a=Ke(e),s=U(e,`flags.dsa5.alternateAttacks.${t}`),i=foundry.utils.flattenObject(s);for(let n of Object.keys(i))(this.skipAlternateWeaponKeys.has(i[n])||i[n]==null||i[n]==null)&&delete i[n];return we(a,i),a}async actorEffects(){let e=["dead"];return game.user.isGM||this.testUserPermission(game.user,"OBSERVER")||!game.settings.get("dsa5","hideEffects")?this.effects.filter(a=>a.isVisibleEffect()):this.effects.filter(a=>e.some(s=>a.statuses.has(s)))}async _preCreate(e,t,a){await super._preCreate(e,t,a);let s={};e.img||(s.img="icons/svg/mystery-man-black.svg"),e.type=="character"&&we(s,{prototypeToken:{sight:{enabled:!0},actorLink:!0}}),this.updateSource(s)}async exclusiveEquipWeapon(e,t=!1){let a=this.items.get(e);if(!a)return;let s=[];switch(a.type){case"armor":case"rangeweapon":s=this.items.filter(l=>l.type==a.type&&l.id!=e&&l.system.worn.value).map(l=>({_id:l.id,"system.worn.value":!1})),s.push({_id:e,"system.worn.value":!0});break;case"meleeweapon":let n=this.items.filter(l=>l.type==a.type&&l.id!=e&&l.system.worn.value),r={_id:e,"system.worn.value":!0};N.isYieldedTwohanded(a)||(n=n.filter(l=>N.isYieldedTwohanded(l)||l.system.worn.offHand==t),r["system.worn.offHand"]=t),s=n.map(l=>({_id:l.id,"system.worn.value":!1})),s.push(r);break}s&&await this.updateEmbeddedDocuments("Item",s)}static _prepareRangeTrait(e,t){return e.attack=Number(e.system.at.value),e.LZ=Number(e.system.reloadTime.value),e.LZ>0&&o.buildReloadProgress(e),this._parseDmg(e,t)}static calcLZ(e,t){let a=1,s=0;e.system.combatskill.value==game.i18n.localize("LocalizedIDs.Throwing Weapons")?s=F.abilityStep(t,game.i18n.localize("LocalizedIDs.quickdraw"))*-1:e.system.combatskill.value==game.i18n.localize("LocalizedIDs.Crossbows")&&F.hasAbility(t,`${game.i18n.localize("LocalizedIDs.quickload")} (${game.i18n.localize("LocalizedIDs.Crossbows")})`)?a=.5:s=F.abilityStep(t,`${game.i18n.localize("LocalizedIDs.quickload")} (${game.i18n.localize(e.system.combatskill.value)})`)*-1;let i=`${e.system.reloadTime.value}`.split("/");if(e.system.ammunitiongroup.value=="mag"){let n=t.items.find(l=>l.id==e.system.currentAmmo.value||l._id==e.system.currentAmmo.value),r=0;n&&(n=g.toObjectIfPossible(n),n.system.mag.value<=0&&(r=1)),i=i[r]||i[0]}else i=i[0];return Math.max(0,Math.round(Number(i)*a)+s)}static _parseDmg(e,t,a=void 0){let s=new Roll(R.replaceDieLocalization(e.system.damage.value),t||{}),i="",n="",r="+";for(let l of s.terms)l.faces?i=l.number+"d"+l.faces:l.operator?r=l.operator:l.number&&(n+=`${r}${l.number}`);if(a){let l=U(a,"system.damageMod");Number(l)?n+=`+${Number(l)}`:l&&(e.damageBonusDescription=`, ${l} ${game.i18n.localize("CHARAbbrev.damage")} ${a.name}`)}return n&&(n=Roll.safeEval(n)),e.damagedie=i||"0d6",e.damageAdd=n!=""?(Number(n)>=0?"+":"")+n:"",e}static buildReloadProgress(e){let t=e.system.reloadTime.progress/e.LZ;e.title=game.i18n.format("WEAPON.loading",{status:`${e.system.reloadTime.progress}/${e.LZ}`}),e.progress=`${e.system.reloadTime.progress}/${e.LZ}`,t>=1&&(e.title=game.i18n.localize("WEAPON.loaded")),this.progressTransformation(e,t)}static progressTransformation(e,t){t>=.5?(e.transformRight="181deg",e.transformLeft=`${Math.round(t*360-179)}deg`):(e.transformRight=`${Math.round(t*360+1)}deg`,e.transformLeft=0)}static buildSpellChargeProgress(e){if(e.LZ=Number(e.system.castingTime.modified)||0,e.LZ>1){let t=e.system.castingTime.progress/e.LZ;e.title=game.i18n.format("SPELL.loading",{status:`${e.system.castingTime.progress}/${e.LZ}`}),e.progress=`${e.system.castingTime.progress}/${e.LZ}`,this.progressTransformation(e,t)}return e}static _prepareRangeWeapon(e,t,a,s,i=!0){let n=a.find(l=>l.name==e.system.combatskill.value);e.calculatedRange=e.system.reach.value;let r;if(n){if(e.attack=Number(n.system.attack.value),e.system.ammunitiongroup.value!="-"){e.ammo=t.filter(l=>l.system.ammunitiongroup.value==e.system.ammunitiongroup.value);for(let l of e.ammo)l.label=`(${l.system.quantity.value}) ${l.name}`;if(r=e.ammo.find(l=>l._id==e.system.currentAmmo.value),r){let l=Number(r.system.rangeMultiplier)||1;e.calculatedRange=e.calculatedRange.split("/").map(c=>Math.round(Number(c)*l)).join("/"),e.attack+=Number(r.system.atmod)||0,r.system.ammunitiongroup.value=="mag"&&(e.ammoMax=r.system.mag.max,e.ammoCurrent=r.system.mag.value)}}if(e.LZ=o.calcLZ(e,s),e.LZ>0&&o.buildReloadProgress(e),W.weaponWearModifier(e),i){e.subweapons={};for(let l of Object.keys(U(e,"flags.dsa5.alternateAttacks")||{})){let c=this.buildSubweapon(e,l),m=this._prepareRangeWeapon(c,t,a,s,!1);e.subweapons[l]=m}e.system.damageToolTip=W.damageTooltip(e)}}else i&&ui.notifications.error(game.i18n.format("DSAError.unknownCombatSkill",{skill:e.system.combatskill.value,item:e.name}));return this._parseDmg(e,s.system,r)}_setupCardOptions(e,t,a){let s=game.canvas?.tokens?.get(a),i={speaker:{alias:s?s.name:this.prototypeToken.name,actor:this.id},title:t,template:e,flags:{img:this.prototypeToken.randomImg?this.img:this.prototypeToken.img}};if(this.token)i.speaker.alias=this.token.name,i.speaker.token=this.token.id,i.speaker.scene=canvas.scene.id,i.flags.img=this.token.img;else{let n=ChatMessage.getSpeaker();n.actor==this.id&&(i.speaker.alias=n.alias,i.speaker.token=n.token,i.speaker.scene=n.scene,i.flags.img=n.token?canvas.tokens.get(n.token).img:i.flags.img)}return i}async swapMag(e){let t=this.items.get(e),a=this.items.get(t.system.currentAmmo.value);if(a&&a.system.quantity.value>1)return await this.updateEmbeddedDocuments("Item",[{_id:a.id,"system.quantity.value":a.system.quantity.value-1,"system.mag.value":a.system.mag.max}]),K.playEquipmentWearStatusChange(a),a;ui.notifications.error("DSAError.NoAmmo",{localize:!0})}async toggleStatusEffect(e,{active:t,overlay:a=!1}={}){let s=this.effects.find(i=>i.statuses.has(e));if(a){if(t)return!1;this.removeCondition(e,1,!1)}else if(!s||Number.isNumeric(U(s,"flags.dsa5.value"))){if(!t&&t!=null)return!1;await this.addCondition(e,1,!1,!1)}else{if(t)return!1;await this.removeCondition(e,1,!1)}}async payMiracles(e){if(!e.extra.miraclePaid){e.extra.miraclePaid=!0;let t=game.i18n.localize("LocalizedIDs.miracleMight"),a=game.i18n.localize("LocalizedIDs.miracle"),s=e.situationalModifiers.some(r=>r.name.trim()==t),i=e.situationalModifiers.some(r=>r.name.trim()==a),n=s?6:i?4:0;n&&await this.update({"system.status.karmaenergy.value":this.system.status.karmaenergy.value-n})}}async consumeAmmunition(e){if(e.extra.ammo&&!e.extra.ammoDecreased){if(e.extra.ammoDecreased=!0,e.extra.ammo._id){let t={_id:e.extra.ammo._id};e.extra.ammo.system.ammunitiongroup.value=="mag"?e.extra.ammo.system.mag.value<=0?(e.extra.ammo.system.quantity.value--,t["system.quantity.value"]=e.extra.ammo.system.quantity.value,t["system.mag.value"]=e.extra.ammo.system.mag.max-1):t["system.mag.value"]=e.extra.ammo.system.mag.value-1:(e.extra.ammo.system.quantity.value--,t["system.quantity.value"]=e.extra.ammo.system.quantity.value),await this.updateEmbeddedDocuments("Item",[t,{_id:e.source._id,"system.reloadTime.progress":0}])}}else(e.source.type=="rangeweapon"||e.source.type=="trait"&&e.source.system.traitType.value=="rangeAttack")&&!e.extra.ammoDecreased?(e.extra.ammoDecreased=!0,await this.updateEmbeddedDocuments("Item",[{_id:e.source._id,"system.reloadTime.progress":0}])):["spell","liturgy"].includes(e.source.type)&&e.extra.speaker.token!="emptyActor"&&await this.updateEmbeddedDocuments("Item",[{_id:e.source._id,"system.castingTime.progress":0,"system.castingTime.modified":0}])}_checkMaximumItemAdvancement(e,t){let a=0,s=P.vantageStep(this,`${game.i18n.localize(`LocalizedIDs.${e.type=="combatskill"?"exceptionalCombatTechnique":"exceptionalSkill"}`)} (${e.name})`);switch(e.type){case"combatskill":a=Math.max(...e.system.guidevalue.value.split("/").map(c=>this.system.characteristics[c].value))+2+s;break;case"spell":case"ritual":let n=0;for(let c of e.system.feature.replace(/\(a-z äöü-\)/gi,"").split(",").map(m=>m.trim()))if(F.hasAbility(this,`${game.i18n.localize("LocalizedIDs.propertyKnowledge")} (${c})`)){n=this.maxByAttr(e,s);break}a=Math.max(14+s,n);break;case"liturgy":case"ceremony":let r=new RegExp(`^${game.i18n.localize("LocalizedIDs.aspectKnowledge")}`),l=0;this.items.filter(c=>c.type=="specialability"&&r.test(c.name)).some(c=>e.system.distribution.value.includes(c.name.split("(")[1].split(")")[0]))&&(l=this.maxByAttr(e,s)),a=Math.max(14+s,l);break;case"skill":a=this.maxByAttr(e,s);break}let i=t<=a;return i||ui.notifications.error("DSAError.AdvanceMaximumReached",{localize:!0}),{result:i,max:a,maxBonus:s}}maxByAttr(e,t){return Math.max(this.system.characteristics[e.system.characteristic1.value].value,this.system.characteristics[e.system.characteristic2.value].value,this.system.characteristics[e.system.characteristic3.value].value)+2+t}async basicTest({testData:e,cardOptions:t},a={}){e=await R.rollDices(e,t);let s=await R.rollTest(e);if(e.extra.options.other&&(s.other||(s.other=[]),s.other.push(...e.extra.options.other)),s.postFunction="basicTest",game.user.targets.size){t.isOpposedTest=e.opposable;let i=` - ${game.i18n.localize("Opposed")}`;t.isOpposedTest&&t.title.match(i+"$")!=i&&(t.title+=i)}if(await this.consumeAmmunition(e),await this.payMiracles(e),!a.suppressMessage){let i=await R.renderRollCard(t,s,a.rerenderMessage);await ee.handleOpposedTarget(i),s.messageId=i.id}return{result:s,cardOptions:t,options:a}}async addCondition(e,t=1,a=!1,s=!1){if(e=="bleeding"||e.id=="bleeding")return await N.bleedingMessage(this);if(this.isToken&&!this.token?.object){console.warn("Actor token object is null for",this.name);return}return await z.addCondition(this,e,t,a,s)}async addTimedCondition(e,t=1,a=!1,s=!0,i={}){return e=="bleeding"||e.id=="bleeding"?await N.bleedingMessage(this):(typeof e=="string"&&i.duration&&(e=Ke(CONFIG.statusEffects.find(n=>n.id==e)),e.flags.dsa5.description=game.i18n.localize(e.name),e.name=game.i18n.localize(e.name),e.changes&&(e.changes=e.changes.map(n=>(/^system\.condition\./.test(n.key)&&(n.value=t),n))),e.statuses=[e.id],delete e.description,delete e.flags.dsa5.value,delete e.flags.dsa5.max,delete e.id,we(e,i)),await z.addCondition(this,e,t,a,s))}async initResistPainRoll(e){let t=game.settings.get("dsa5","selfControlOnPain");if(this.hasCondition("incapacitated"))return;if(t==2||t==1&&!this.hasPlayerOwner){await this.addCondition("incapacitated");return}let a=await renderTemplate("systems/dsa5/templates/chat/roll/resist-pain.html",{actor:this});await ChatMessage.create(g.chatDataSetup(a))}async finishResistPainRoll(){let e=this.items.find(t=>t.name==game.i18n.localize("LocalizedIDs.selfControl")&&t.type=="skill");this.setupSkill(e,{subtitle:` (${game.i18n.localize("ActiveEffects.resistRoll")})`},this.token?.id).then(async t=>{((await this.basicTest(t)).result.successLevel||0)<1&&this.addCondition("incapacitated")})}async removeCondition(e,t=1,a=!0,s=!1){return await z.removeCondition(this,e,t,a,s)}hasCondition(e){return z.hasCondition(this,e)}async markDead(e){let t=this.getActiveTokens();for(let a of t)a.combatant&&await a.combatant.update({defeated:e})}};function xn(){let o={Rq:"roll",Gc:"GC",Ch:"CH"},e={Rq:"dice",Gc:"dice",Ch:"user-shield",AP:"trophy",Pay:"coins",GetPaid:"piggy-bank"},t={Rq:"",Gc:`${game.i18n.localize("HELP.groupcheck")} `,Ch:"",AP:"",Pay:"",GetPaid:""},a=/(-|\+)?\d+/,s=/(-|\+)?\d+(\.\d+)?/,i=/\[[a-zA-ZöüäÖÜÄ&; -]+/,n=/options={[0-9a-zA-Z: ",]+}/,r=/[\[\]]/g,l={Pay:game.i18n.localize("PAYMENT.payButton"),GetPaid:game.i18n.localize("PAYMENT.getPaidButton"),AP:game.i18n.localize("MASTER.awardXP")};if(!b.statusRegex){let c=b.statusEffects.map(d=>game.i18n.localize(d.name).toLowerCase()),m=["status","condition","level","levels"].map(d=>game.i18n.localize(d)).join("|");b.statusRegex={effects:c,regex:new RegExp(`(${m}) (${c.join("|")})`,"gi")}}CONFIG.TextEditor.enrichers.push({pattern:/@(Rq|Gc|Ch)\[[a-zA-ZöüäÖÜÄ&; -]+ (-|\+)?\d+( options={[0-9a-zA-Z: ",]+})?\]({[a-zA-ZöüäÖÜÄß\(\)&; -]+})?/g,enricher:u((c,m)=>{let d=c[0],p=c[1],f=Number(d.match(a)[0]),h=d.match(n)?JSON.parse(d.match(n)[0].replace(/options=/,"")):{},y=encodeURIComponent(JSON.stringify(h)),k=d.replace(f,"").replace(n,"").match(i)[0].replace(r,"").trim(),C=d.match(/\]\{.*\}/)?d.match(/\]\{.*\}/)[0].replace(/[\]\{\}]/g,""):k;return h.attrs&&(C+=` (${h.attrs.split(",").join("/")}, ${game.i18n.localize("CHARAbbrev.FW")} ${h.fw||0})`),$(`${t[p]}${C} ${f}`)[0]},"enricher")},{pattern:/@(Pay|GetPaid|AP)\[(-|\+)?\d+(\.\d+)?\]({[a-zA-ZöüäÖÜÄß\(\)&; -0-9]+})?/g,enricher:u((c,m)=>{let d=c[0],p=c[1],f=Number(d.match(s)[0]),h=d.match(/\{.*\}/)?d.match(/\{.*\}/)[0].replace(/[\{\}]/g,""):l[p];return $(`${t[p]}${h} (${f})`)[0]},"enricher")},{pattern:b.statusRegex.regex,enricher:u((c,m)=>$(Js(c))[0],"enricher")},{pattern:/@Info\[[a-zA-ZöüäÖÜÄ&; -\.0-9]+\]/g,enricher:u(async(c,m)=>{let d=c[0].match(/(?:\[)(.*?)(?=\])/)[0].slice(1),p=await fromUuid(d);if(!p||p.type!="information")return $('info')[0];if(!game.user.isGM)return $(`${game.i18n.localize("GM notes")}`)[0];let f={enrichedqs1:await TextEditor.enrichHTML(p.system.qs1,{async:!0}),enrichedqs2:await TextEditor.enrichHTML(p.system.qs2,{async:!0}),enrichedqs3:await TextEditor.enrichHTML(p.system.qs3,{async:!0}),enrichedqs4:await TextEditor.enrichHTML(p.system.qs4,{async:!0}),enrichedqs5:await TextEditor.enrichHTML(p.system.qs5,{async:!0}),enrichedqs6:await TextEditor.enrichHTML(p.system.qs6,{async:!0}),enrichedCrit:await TextEditor.enrichHTML(p.system.crit,{async:!0}),enrichedBotch:await TextEditor.enrichHTML(p.system.botch,{async:!0}),enrichedFail:await TextEditor.enrichHTML(p.system.fail,{async:!0})},h=await renderTemplate("systems/dsa5/templates/items/infopreview.html",{item:p,enriched:f});return $(h)[0]},"enricher")},{pattern:/@EmbedItem\[[a-zA-ZöüäÖÜÄ&ë;'\(\)„“:,’ -\.0-9›‹âïîëßôñûé\/]+\]({[a-zA-Z=]+})?/g,enricher:u(async(c,m)=>{let d=c[0].match(/(?:\[)(.*?)(?=\])/)[0].slice(1),p;try{p=await fromUuid(d)}catch{p=null}if(!p){let k=d.split("."),C=game.packs.get(k[0]+"."+k[1]);C&&(p=await C.getDocuments({name:k[2]}),p=p[0])}if(!p)return $('')[0];let f=c[0],h=f.match(/\{.*\}/)?f.match(/\{.*\}/)[0].replace(/[\{\}]/g,""):"",y={};if(h)for(let k of h.split(" ")){let C=k.split("=");C.length==2&&(y[C[0]]=C[1])}return await p._buildEmbedHTML({values:[]},y)},"enricher")},{pattern:/@PostChat\[(.*?)\]/g,enricher:u(async(c,m)=>{let d=c[1];return $(`
    ${d}
    `)[0]},"enricher")})}u(xn,"setEnrichers");function Js(o){let t=o[0].split(" "),a=t.shift();t=t.join(" ");let s=b.statusEffects[b.statusRegex.effects.indexOf(t.toLowerCase())];return`${a} ${t}`}u(Js,"conditionsMatcher");var{mergeObject:zn,duplicate:Pr}=foundry.utils,g=class o{static{u(this,"DSA5_Utility")}static async skillByName(e){let t=game.packs.get(this.getLanguagePack());await t.getIndex();let a=t.index.find(s=>s.name===e);return await t.getDocument(a._id)}static async allSkills(){return await this.getCompendiumEntries(this.getLanguagePack(),"skill")}static moduleEnabled(e){return game.modules.get(e)&&game.modules.get(e).active}static async allCombatSkills(){return await this.getCompendiumEntries(this.getLanguagePack(),"combatskill")}static getLanguagePack(){return game.i18n.lang=="de"?"dsa5.skills":"dsa5.skillsen"}static async getCompendiumEntries(e,t){let a=await game.packs.get(e);if(!a)return ui.notifications.error("No content found");let s=Array.isArray(t)?t:[t];return(await a.getDocuments()).filter(n=>s.includes(n.type)).map(n=>n.toObject())}static renderToggle(e){e.rendered?e._minimized?e.maximize():e.close():e.render(!0)}static calcTokenSize(e,t){let a=game.dsa5.config.tokenSizeCategories[e.system.status.size.value];if(a)if(a<1)zn(t,{texture:{scaleX:a,scaleY:a},width:1,height:1});else{let s=Math.floor(a),i=Math.max(a/s,.25);zn(t,{width:s,height:s,texture:{scaleX:i,scaleY:i}})}}static registerMasterTokens(e){o.moduleEnabled("dsa5-mastersworkshop")&&b.masterTokens.push(e)}static async allMoneyItems(){let e=game.settings.get("dsa5","moneyKompendium"),t=game.packs.get(e)?e:this.getLanguagePack();return(await this.getCompendiumEntries(t,"money")).sort((a,s)=>a.system.price.value-s.system.price.value).map(a=>(a.system.quantity.value=0,a))}static async allSkillsList(){return(await this.allSkills()||[]).map(e=>e.name).sort((e,t)=>e.localeCompare(t))}static async allCombatSkillsList(e){return((await this.allCombatSkills()).filter(t=>t.system.weapontype.value==e)||[]).map(t=>t.name).sort((t,a)=>t.localeCompare(a))}static async callItemTransformationMacro(e,t,a,s={}){let i=e.split("."),n=game.packs.get(`${i[0]}.${i[1]}`);if(!n)return console.warn(`Pack ${n} not found`),{};let r=await n.getDocuments({name:i[2]}),l={};if(r.length){let c=Object.getPrototypeOf(async function(){}).constructor,m=new c("args","source","effect",r[0].command);try{s.result=l,await m.call(this,s,t,a)}catch(d){ui.notifications.error("There was an error in your macro syntax. See the console (F12) for details"),console.error(d),l.error=!0}}else ui.notifications.error(game.i18n.format("DSAError.macroNotFound",{name:e}));return l}static isActiveGM(e=!1){let t=game.users.activeGM;return!t&&!e&&ui.notifications.warn("DSAError.requiresGM",{localize:!0}),t?.isSelf}static parseAbilityString(e){return{original:e.replace(/ (FP|SR|FW|SP)?[+-]?\d{1,2}$/,"").trim(),name:e.replace(/\((.+?)\)/g,"()").replace(/ (FP|SR|FW|SP)?[+-]?\d{1,2}$/,"").trim(),step:Number((e.match(/[+-]?\d{1,2}$/)||[1])[0]),special:(e.match(/\(([^()]+)\)/)||["",""])[1],type:e.match(/ (FP|SP)[+-]?\d{1,2}/)?"FP":e.match(/ (FW|SR)[+-]?\d{1,2}/)?"FW":"",bonus:e.match(/[-+]\d{1,2}$/)!=null}}static categoryLocalization(e){return game.i18n.localize(`TYPES.Item.${e}`)}static attributeLocalization(e){return game.i18n.localize(`CHAR.${e.toUpperCase()}`)}static attributeAbbrLocalization(e){return game.i18n.localize(`CHARAbbrev.${e.toUpperCase()}`)}static async callAsyncHooks(e,t){for(let a of b.asyncHooks[e])await a(...t)}static chatDataSetup(e,t,a,s){let i={user:game.user.id,rollMode:t||game.settings.get("core","rollMode"),content:e};return["gmroll","blindroll"].includes(i.rollMode)&&(i.whisper=ChatMessage.getWhisperRecipients("GM").map(n=>n.id)),i.rollMode==="blindroll"?i.blind=!0:i.rollMode==="selfroll"&&(i.whisper=[game.user]),a&&(i.speaker=ChatMessage.getSpeaker(),i.whisper=ChatMessage.getWhisperRecipients(a)),s&&(i.speaker=ChatMessage.getSpeaker(),i.whisper=s),i}static getSpeaker(e){let t=ChatMessage.getSpeakerActor(e);if(!t&&canvas.tokens){let a=canvas.tokens.get(e.token);a&&(t=a.actor)}if(!t){let a=game.scenes.get(e.scene);try{a&&(t=new Token(a.getEmbeddedDocument("Token",e.token))?.actor)}catch{}}return t}static fateAvailable(e,t){return t?game.settings.get("dsa5","groupschips").split("/").map(a=>Number(a))[0]>0:e.system.status.fatePoints.value>0}static _calculateAdvCost(e,t,a=1){return b.advancementCosts[t][Number(e)+a]}static async getFolderForType(e,t=null,a=null,s=0,i="",n=void 0){let r=await game.folders.contents.find(l=>l.name==a&&l.type==e&&l.folder?.id==t);return r||(r=await Folder.create({name:a,type:e,sorting:n||(e=="JournalEntry"?"a":"m"),color:i,sort:s,folder:t})),r}static toObjectIfPossible(e){return typeof e.toObject=="function"?e.toObject(!1):Pr(e)}static async showArtwork({img:e,name:t,uuid:a,isOwner:s},i=!1){return new ImagePopout(e,{title:i?s?t:"-":t,shareable:!0,uuid:a}).render(!0)}static async findAnyItem(e){let t=[],a=e.map(i=>i.name),s=e.map(i=>i.type);for(let i of game.items.contents){let n=a.indexOf(i.name);if(n>=0&&s[n]==i.type&&(a.splice(n,1),s.splice(n,1),t.push(i.toObject())),a.length<=0)break}if(a.length>0){let i=/^dsa5-core/,n=Array.from(game.packs.keys()).sort((r,l)=>(i.test(r)&&i.test(l)&&r.localeCompare(l),i.test(l)?-1:i.test(r)?1:r.localeCompare(l)));for(let r of n){let l=game.packs.get(r);if(l.documentName=="Item"&&(game.user.isGM||l.visible)&&(await l.getDocuments({name__in:a,type__in:s}).then(c=>{for(let m of c){let d=a.indexOf(m.name);d>=0&&s[d]==m.type&&(a.splice(d,1),s.splice(d,1),t.push(m.toObject()))}}),a.length<=0))break}}return t}static replaceDies(e,t=!1){let a=/( |^)(\d{1,2})?[wWdD][0-9]+((\+|-)[0-9]+)?/g,s=t?"":"/r ";return e.replace(a,function(i){return` [[${s}${i.replace(/[DwW]/,"d")}]]`})}static escapeRegex(e){return(typeof e=="string"||e instanceof String?e:"").replace(/[-[/\]{}()*+?.,\\^$|#\s]/g,"\\$&")}static replaceConditions(e){return e&&e.replace(b.statusRegex.regex,t=>Js([t]))}static experienceDescription(e){let t=[2100,1700,1400,1200,1100,1e3],a=["EXP.legendary","EXP.brillant","EXP.masterful","EXP.competent","EXP.experienced","EXP.average"],s=0;for(let i of t){if(Number(e)>=Number(i))return a[s];s++}return"EXP.inexperienced"}static async emptyActor(e=12,t="Alrik"){Array.isArray(e)||(e=[e,e,e,e,e,e,e,e]);let a=new O({name:t,type:"npc",items:[],system:{status:{wounds:{value:50},fatePoints:{}},characteristics:{mu:{initial:e[0]},kl:{initial:e[1]},in:{initial:e[2]},ch:{initial:e[3]},ff:{initial:e[4]},ge:{initial:e[5]},ko:{initial:e[6]},kk:{initial:e[7]}}}},{noHook:!0});return a.prepareData(),a}};var{mergeObject:Oe,getProperty:Ye}=foundry.utils,Je=class o{static{u(this,"Migrakel")}static async showDialog(e,t=!1){let a=!1,s=[{action:"yes",icon:"fa fa-check",label:"update",default:!0,callback:u(()=>!0,"callback")},{action:"cancel",icon:"fas fa-times",label:"cancel",callback:u(()=>!1,"callback")}];t&&s.push({action:"migrateAll",icon:"fas fa-exclamation-triangle ",label:"replace",callback:u(()=>2,"callback")});try{a=await foundry.applications.api.DialogV2.wait({window:{title:"Migrakel.Migration"},content:`

    ${e}

    `,buttons:s})}catch{}return a}static async refreshStatusEffects(e){let t=[];for(let a of e.effects)a.origin&&t.push(a.id);await e.deleteEmbeddedDocuments("ActiveEffect",t)}static async updateVals(e,t,a){let s=game.dsa5.itemLibrary,i=[],n=[],r=new Map;if(await this.refreshStatusEffects(e),t({type:"equipment"})){let l=[],c=[];for(let d of e.items.filter(p=>p.type=="equipment"&&p.system.equipmentType.value=="bags")){let p=await s.findCompendiumItem(d.name,d.type);if(p.length>0){if(p=p.find(h=>h.name==d.name&&h.type==d.type),!p)continue;console.log(`MIGRATION - Updated ${d.name}`);let f=Oe(d.toObject(),a(p));c.push(f),l.push(d.id)}}let m=await e.createEmbeddedDocuments("Item",c);for(let d=0;dt(c)&&!(c.type=="equipment"&&c.system.equipmentType.value=="bags"))){let c=await s.findCompendiumItem(l.name,l.type);if(c.length>0){if(c=c.find(d=>d.name==l.name&&d.type==l.type),!c)continue;console.log(`MIGRATION - Updated ${l.name}`);let m=Oe(l.toObject(),a(c));m.system.parent_id&&r.has(m.system.parent_id)&&(m.system.parent_id=r.get(m.system.parent_id)),n.push(m),i.push(l.id)}}await e.createEmbeddedDocuments("Item",n),await e.deleteEmbeddedDocuments("Item",i),o.silent||ui.notifications.info("Migrakel.migrationDone",{localize:!0})}static async updateSpellsAndLiturgies(e,t=void 0){let a=t??await this.showDialog(game.i18n.localize("Migrakel.spells"),!0),s=u(i=>["spell","liturgy","ritual","ceremony","spellextension"].includes(i.type),"condition");if(a==2){let i=u(n=>{let r=n.toObject();return delete r.system.talentValue,r},"updator");await this.updateVals(e,s,i)}else if(a){let i=u(n=>{let r={effects:n.effects.toObject()};return n.type!="spellextension"&&(r.system={effectFormula:{value:n.system.effectFormula.value}}),r},"updator");await this.updateVals(e,s,i)}return a}static async updateSpecialAbilities(e,t=void 0){let a=t??await this.showDialog(game.i18n.localize("Migrakel.abilities"));if(a){let s=u(n=>{let r={effects:n.effects.toObject()};return["specialability","advantage","disadvantage","trait"].includes(n.type)&&Oe(r,{system:{effect:{value:n.system.effect.value}}}),n.type=="specialability"&&(Oe(r,{system:{category:{sub:n.system.category.sub||0},list:{value:n.system.list.value},effect:{value2:Ye(n,"system.effect.value2")||"",value3:Ye(n,"system.effect.value3")||""}}}),n.system.category.value=="staff"&&Oe(r,{system:{feature:Ye(n,"system.feature")||"",AsPCost:Ye(n,"system.AsPCost")||"",volume:Number(Ye(n,"system.volume"))||0,artifact:Ye(n,"system.artifact")||"",permanentEffects:Ye(n,"system.permanentEffects")||!1}})),this.updateMacro(r,n),r},"updator"),i=u(n=>["specialability","advantage","disadvantage","trait","essence","imprint"].includes(n.type),"condition");await this.updateVals(e,i,s)}return a}static async updateCombatskills(e,t=void 0){let a=t??await this.showDialog(game.i18n.localize("Migrakel.cskills"));if(a){let s=u(n=>({effects:n.effects.toObject()}),"updator"),i=u(n=>["combatskill"].includes(n.type),"condition");await this.updateVals(e,i,s)}return a}static async updateSkills(e,t=void 0){let a=t??await this.showDialog(game.i18n.localize("Migrakel.skills"));if(a){let s=u(n=>["skill"].includes(n.type),"condition"),i=u(n=>({img:n.img,effects:n.effects.toObject()}),"updator");await this.updateVals(e,s,i)}return a}static updateMacro(e,t){let a=t.getFlag("dsa5","onUseEffect");a&&Oe(e,{flags:{dsa5:{onUseEffect:a}}})}static async updateGear(e,t=void 0){let a=t??await this.showDialog(game.i18n.localize("Migrakel.gear"));if(a){let s=u(n=>["meleeweapon","armor","rangeweapon","equipment","poison","disease","consumable","ammunition"].includes(n.type),"condition"),i=u(n=>{let r={img:n.img,effects:n.effects.toObject()};return["poison","consumable","disease"].includes(n.type)||Oe(r,{system:{effect:{value:n.system.effect.value}}}),["armor"].includes(n.type)&&Oe(r,{system:{subcategory:n.system.subcategory}}),["meleeweapon","rangeweapon","armor"].includes(n.type)&&Oe(r,{system:{structure:{max:n.system.structure.max,value:n.system.structure.value}}}),this.updateMacro(r,n),r},"updator");await this.updateVals(e,s,i),await e.updateEmbeddedDocuments("Item",e.items.filter(n=>n.type=="money").map(n=>({_id:n.id,name:game.i18n.localize(n.name)})))}return a}};var Rt=class extends foundry.applications.api.HandlebarsApplicationMixin(foundry.applications.api.ApplicationV2){static{u(this,"DialogActorConfig")}static DEFAULT_OPTIONS={window:{title:"SHEET.actorConfig"}};static PARTS={main:{template:"systems/dsa5/templates/actors/parts/actorConfig.html"}};constructor(e,t){super(t),this.actor=e,this.lock=!1}async _prepareContext(e){let t=await super._prepareContext(e);return t.actor=this.actor,t}_onRender(e,t){super._onRender(t);let a=$(this.element);a.find(".updateSpells").on("click",async s=>this.updateWrapper("updateSpellsAndLiturgies",s)),a.find(".updateAbilities").on("click",async s=>this.updateWrapper("updateSpecialAbilities",s)),a.find(".updatecSkills").on("click",async s=>this.updateWrapper("updateCombatskills",s)),a.find(".updateSkills").on("click",async s=>this.updateWrapper("updateSkills",s)),a.find(".updateGear").on("click",async s=>this.updateWrapper("updateGear",s))}async updateWrapper(e,t){this.lock||(this.lock=!0,$(t.currentTarget).prepend(''),await Je[e](this.actor),$(t.currentTarget).find("i").remove(),this.lock=!1)}};function Qe(o,e="img"){game.user.isGM&&o.find(e).each(function(t,a){a.setAttribute("draggable",!0),a.addEventListener("dragstart",s=>Lr(s))})}u(Qe,"bindImgToCanvasDragStart");var Lr=u(o=>{canvas.tiles.activate();let e=o.currentTarget.src,t=o.currentTarget,a=canvas.dimensions.sceneHeight/t.naturalHeight,s=canvas.dimensions.sceneWidth/t.naturalWidth,i=Math.min(1,s,a),n=Math.round(canvas.dimensions.size/i),r={type:"Tile",texture:{src:e},tileSize:n};o.dataTransfer.setData("text/plain",JSON.stringify(r));let l=t.naturalWidth*i*canvas.stage.scale.x,c=t.naturalHeight*i*canvas.stage.scale.y,m=DragDrop.createDragImage(t,l,c);o.dataTransfer.setDragImage(m,l/2,c/2)},"dragTileImg");var{getProperty:_r,mergeObject:Nn}=foundry.utils,Pt=class extends FormApplication{static{u(this,"ForeignFieldEditor")}constructor(e,t,a){super(),this.editfield=t,this.actorId=e,this.fieldname=a;let s=game.actors.get(this.actorId);this.object={fieldContent:_r(s,this.editfield)}}static get defaultOptions(){let e=super.defaultOptions;return Nn(e,{resizable:!0,width:600,height:600}),e}isEditable(){return!0}get title(){return`${game.actors.get(this.actorId).name} - ${game.i18n.localize(this.fieldname)}`}async _updateObject(e,t){game.socket.emit("system.dsa5",{type:"updateKeepField",payload:{actorId:this.actorId,field:this.editfield,updateData:t.fieldContent}})}async getData(e){let t=super.getData(e);return Nn(t,{fieldContent:this.object.fieldContent}),t}get template(){return"systems/dsa5/templates/dialog/foreignfieldeditor.html"}activateListeners(e){super.activateListeners(e)}};var{mergeObject:Fr,randomID:Hr}=foundry.utils,xe=class o extends Application{static{u(this,"Trade")}static get defaultOptions(){let e=super.defaultOptions;return e.template="systems/dsa5/templates/actors/merchant/merchant-trade.html",e.width=900,e.resizable=!0,e.tabs=[{navSelector:".tabs",contentSelector:".content",initial:"main"}],e.title=game.i18n.localize("MERCHANT.exchange"),e.classes.push("noscrollWizard"),e.scrollY=[".scrollable"],e}constructor(e,t,a={}){super(),this.tradeData={offered:{},offer:{},id:a.id||Hr(),sourceId:e,targetId:t,offerAccepted:!1,offeredAccepted:!1}}async startTrade(){game.socket.emit("system.dsa5",{type:"startTrade",payload:{sourceId:this.tradeData.sourceId,targetId:this.tradeData.targetId,id:this.tradeData.id}}),this.render(!0)}_filterGear(e){if(e.val()!=null){let t=e.val().toLowerCase().trim(),a=$(this.element).find(".inventory .item");a.removeClass("filterHide"),a.filter(function(){return $(this).find("a.item-edit").text().toLowerCase().trim().indexOf(t)==-1}).addClass("filterHide")}}async getData(){let e=await super.getData(),t=g.getSpeaker(this.tradeData.sourceId),a=t.prepareItems({details:[]});a.inventory.money={items:a.money.coins.map(s=>(s.name=game.i18n.localize(s.name),s)),show:!0,dataType:"money"};for(let s of Object.values(a.inventory))for(let i of s.items)this.tradeData.offer[i._id]&&(i.system.quantity.value-=this.tradeData.offer[i._id].system.quantity.value);return Fr(e,{tradeData:this.tradeData,actor:g.getSpeaker(this.tradeData.targetId),tradeFriend:t,inventory:a}),e}static findTradeApp(e){for(let t of Object.values(ui.windows))if(t instanceof this&&t?.tradeData?.id===e)return t;return!1}async close(e={}){return e.skipSocket||game.socket.emit("system.dsa5",{type:"tradeCanceled",payload:{id:this.tradeData.id}}),super.close(e)}activateListeners(e){super.activateListeners(e),e.find(".trade").click(s=>this._offerItem(s));let t=u(s=>this._filterGear($(s.currentTarget)),"filterGear");e.find(".item-edit").click(s=>this._editItem(s,this.tradeData.sourceId)),e.find(".item-external-edit").click(s=>this._editItem(s,this.tradeData.targetId)),e.find(".acceptTrade").click(s=>this.acceptTrade(s));let a=e.find(".gearSearch");a.keyup(s=>t(s)),a[0]&&a[0].addEventListener("search",t,!1)}_editItem(e,t){g.getSpeaker(t).items.get(e.currentTarget.dataset.itemId).sheet.render(!0)}_offerItem(e){if(this.tradeData.offerAccepted)return;let t=e.currentTarget.dataset.itemId,s=g.getSpeaker(this.tradeData.sourceId).items.get(t),i=e.ctrlKey?10:1,n=e.currentTarget.dataset.stopTrade,r=n?this.tradeData.offer[t].system.quantity.value:s.system.quantity.value;s&&(n?(this.tradeData.offer[t].system.quantity.value-=Math.min(i,r),this.tradeData.offer[t].system.quantity.value<=0&&delete this.tradeData.offer[t],this.offerChanged(),this.render()):(this.tradeData.offer[t]?r-=this.tradeData.offer[t].system.quantity.value:(this.tradeData.offer[t]=s.toObject(),this.tradeData.offer[t].system.quantity.value=0),r>0&&(this.tradeData.offer[t].system.quantity.value+=Math.min(i,r),this.offerChanged(),this.render())),K.playMoneySound())}async offerChanged(){game.socket.emit("system.dsa5",{type:"receiveOfferedItems",payload:{id:this.tradeData.id,trader:this.tradeData.sourceId,offered:this.tradeData.offer}})}static receiveOfferedItems(e){let t=this.findTradeApp(e.payload.id);t&&(e.payload.trader==t.tradeData.sourceId?(t.tradeData.offer=e.payload.offered,t.tradeData.offerAccepted=!1):(t.tradeData.offered=e.payload.offered,t.tradeData.offeredAccepted=!1),t.render())}static isGMTrade(e){return game.user.isGM&&!e.hasPlayerOwner}static isPlayerTrade(e){return!game.user.isGM&&e.isOwner}static socketStartTrade(e){let t=g.getSpeaker(e.payload.targetId);(this.isGMTrade(t)||this.isPlayerTrade(t))&&new o(e.payload.targetId,e.payload.sourceId,{id:e.payload.id}).render(!0)}acceptTrade(){this.tradeData.offerAccepted=!this.tradeData.offerAccepted,this.render(!0),game.socket.emit("system.dsa5",{type:"acceptTrade",payload:{id:this.tradeData.id,accepted:this.tradeData.offerAccepted}})}static tradeWasAccepted(e){let t=this.findTradeApp(e.payload.id);t&&(t.tradeData.offeredAccepted=e.payload.accepted,t.tradeData.offerAccepted&&t.tradeData.offeredAccepted?(t.finishTrade(),K.playMoneySound()):t.render())}async finishTrade(){g.isActiveGM()&&await o.updateData(this.tradeData),game.socket.emit("system.dsa5",{type:"tradeFinished",payload:{id:this.tradeData.id,tradeData:this.tradeData}}),this.close({skipSocket:!0}),K.playMoneySound()}static async updateData(e){let t=g.getSpeaker(e.sourceId),a=g.getSpeaker(e.targetId);await this.modifyActor(t,e.offer,e.offered),await this.modifyActor(a,e.offered,e.offer)}static async modifyActor(e,t,a){let s=[],i=[];for(let n of Object.keys(t)){let r=e.items.get(n);r&&(r.system.quantity.value<=t[n].system.quantity.value&&r.type!="money"?s.push(n):i.push({_id:n,"system.quantity.value":r.system.quantity.value-t[n].system.quantity.value}))}await e.deleteEmbeddedDocuments("Item",s,{render:!1}),await e.updateEmbeddedDocuments("Item",i,{render:!1});for(let n of Object.values(a))await e.sheet._manageDragItems(n,n.type)}static tradeWasFinished(e){let t=this.findTradeApp(e.payload.id);g.isActiveGM()&&o.updateData(e.payload.tradeData),t&&t.close({skipSocket:!0})}static tradeWasCanceled(e){let t=this.findTradeApp(e.payload.id);t&&t.close({skipSocket:!0})}static socketListeners(e){switch(e.type){case"receiveOfferedItems":return this.receiveOfferedItems(e),!0;case"startTrade":return this.socketStartTrade(e),!0;case"acceptTrade":return this.tradeWasAccepted(e),!0;case"tradeCanceled":return this.tradeWasCanceled(e),!0;case"tradeFinished":return this.tradeWasFinished(e),!0}}},ua=class extends Application{static{u(this,"TradeOptions")}constructor(e,t){super(t),this.actorId=D.buildSpeaker(e,e.token?.id)}async getData(e){let t=await super.getData(e);return t.actors=game.actors.filter(a=>a.hasPlayerOwner&&a.id!=this.actorId.actor),t}static get defaultOptions(){let e=super.defaultOptions;return e.template="systems/dsa5/templates/actors/merchant/merchant-tradeoptions.html",e.resizable=!0,e.title=game.i18n.localize("MERCHANT.exchange"),e}_startTrade(e){let t=game.actors.get(e.currentTarget.dataset.id);new xe(this.actorId,D.buildSpeaker(t,t.token?.id)).startTrade(),this.close()}activateListeners(e){super.activateListeners(e),e.find(".startTrade").on("dblclick",t=>this._startTrade(t))}};var{getProperty:jr,mergeObject:pa,duplicate:Gr}=foundry.utils,Xe=class o extends Application{static{u(this,"TokenHotbar2")}static attackTypes=new Set(["meleeweapon","rangeweapon"]);static traitTypes=new Set(["meleeAttack","rangeAttack"]);static spellTypes=new Set(["liturgy","spell"]);static registerTokenHotbar(){game.dsa5.apps.tokenHotbar||(game.dsa5.apps.tokenHotbar=new o,game.dsa5.apps.tokenHotbar.updateDSA5Hotbar(),game.settings.get("dsa5","disableTokenhotbar")||game.dsa5.apps.tokenHotbar.render(!0),Hooks.call("dsa5TokenHotbarReady",game.dsa5.apps.tokenHotbar))}constructor(e){if(super(e),this.searching="",o.combatSkills=["selfControl","featOfStrength","bodyControl","perception","loyalty"].map(a=>game.i18n.localize(`LocalizedIDs.${a}`)),o.defaultSkills=new Set([game.i18n.localize("LocalizedIDs.perception")]),game.user.isGM){this.callbackFunctions={};let a=game.settings.get("dsa5","enableMasterTokenFunctions");this.gmItems=[{name:"gmMenu",disabled:a.masterMenu,icon:"systems/dsa5/icons/categories/DSA-Auge.webp",id:"masterMenu",cssClass:"gm",abbrev:"",subfunction:"gm"},{name:"MASTER.randomPlayer",disabled:a.randomVictim,iconClass:"fa fa-dice-six",id:"randomVictim",cssClass:"gm",abbrev:"",subfunction:"gm"},{name:"TT.tokenhotbarMoney",disabled:a.payMoney,icon:"systems/dsa5/icons/money-D.webp",id:"payMoney",cssClass:"gm",abbrev:"",subfunction:"gm"}]}let t=u(a=>{let s=a.parent?a.parent.id:void 0;s&&o.hookUpdate(s)},"parentUpdate");Hooks.on("controlToken",(a,s)=>{game.dsa5.apps.tokenHotbar?.updateDSA5Hotbar()}),Hooks.on("updateActor",(a,s)=>{o.hookUpdate(a.id)}),Hooks.on("updateToken",(a,s,i)=>{game.dsa5.apps.tokenHotbar&&s._id==jr(game.dsa5.apps.tokenHotbar,"actor.prototypeToken.id")&&game.dsa5.apps.tokenHotbar.updateDSA5Hotbar()}),Hooks.on("updateOwnedItem",(a,s)=>{o.hookUpdate(a.data.id)}),Hooks.on("createOwnedItem",(a,s)=>{o.hookUpdate(a.data.id)}),Hooks.on("deleteOwnedItem",(a,s)=>{o.hookUpdate(a.data.id)}),Hooks.on("updateItem",(a,s)=>{t(a)}),Hooks.on("createItem",(a,s)=>{t(a)}),Hooks.on("deleteItem",(a,s)=>{t(a)}),Hooks.on("deleteActiveEffect",(a,s)=>{t(a)}),Hooks.on("updateActiveEffect",(a,s)=>{t(a)}),Hooks.on("createActiveEffect",(a,s)=>{t(a)}),Hooks.on("canvasInit",()=>{this.rendered&&this.render()})}registerMasterFunction(e,t){let a=game.settings.get("dsa5","enableMasterTokenFunctions");e.disabled=a[e.id],this.gmItems.push(e),this.callbackFunctions[e.id]=t}async prepareSkills(){let e=await g.allSkills();return this.skills=e.map(t=>({name:t.name,icon:t.img,id:t.name,cssClass:"skillgm",addClass:t.system.group.value,abbrev:t.name[0],subfunction:"skillgm"})),this.skills=this.skills.sort((t,a)=>t.addClass.localeCompare(a.addClass)||t.name.localeCompare(a.name)),this.skills}static hookUpdate(e){e==game.dsa5.apps.tokenHotbar?.actor?.id?game.dsa5.apps.tokenHotbar.updateDSA5Hotbar():ui.hotbar.token?.actor?.id==e&&ui.hotbar.updateDSA5Hotbar()}resetPosition(){let e=$("#hotbar").first().position(),t=game.settings.get("dsa5","tokenhotbarSize");this.position.left=e.left+8,this.position.top=e.top-t-25}static get defaultOptions(){let e=super.defaultOptions,t=$("#hotbar").first().position(),a=game.settings.get("dsa5","tokenhotbarSize"),s=game.settings.get("dsa5","tokenhotbarPosition");return pa(e,{classes:e.classes.concat(["dsa5","tokenQuickHot"]),itemWidth:a,resizable:!1,height:a+45,zIndex:61,left:t.left+8,top:t.top-a-25,template:"systems/dsa5/templates/status/tokenHotbar.html",title:"TokenHotbar"}),pa(e,s),e}async _onWheelResize(e){let t=game.settings.get("dsa5","tokenhotbarSize");e.originalEvent.deltaY>0?t=Math.min(100,t+5):t=Math.max(15,t-5),await game.settings.set("dsa5","tokenhotbarSize",t),await this.render(!0)}async _cycleLayout(e){if(e.button==2){let t=game.settings.get("dsa5","tokenhotbarLayout")+1;t==4&&(t=0),await game.settings.set("dsa5","tokenhotbarLayout",t),await this.render(!0)}}changeDarkness(e){let t=Number(e.currentTarget.value);canvas.scene&&canvas.scene.update({"environment.darknessLevel":t},{animateDarkness:3e3}),ge(`${game.i18n.localize("MASTER.darkness")} ${t}`)}activateListeners(e){super.activateListeners(e);let t=e.find(".dragHandler");t[0]&&new Draggable(this,e,t[0],this.options.resizable),t.on("wheel",async i=>(i.stopPropagation(),i.preventDefault(),await this._onWheelResize(i),!1)),e.find(".itdarkness input").change(i=>this.changeDarkness(i));let a=this,s=u(function(i){return a.filterButtons(i),!1},"fn");e.find(".filterable").hover(function(){$(document).on("keydown",s)},function(){$(document).off("keydown",s)}),e.find(".quantity-click").mousedown(i=>N.quantityClick(i)),e.on("mousedown","li",async i=>(i.stopPropagation(),await this.executeQuickButton(i),!1)),e.on("mouseenter","li.primary",i=>{let n=i.currentTarget.dataset.category;this.category=n,setTimeout(()=>{e.find(".secondary").removeClass("shown"),n==this.category&&e.find(`.secondary[data-category="${n}"]`).addClass("shown")},700)}),e.on("mouseleave","li.primary",i=>{let n=i.currentTarget.dataset.category;this.category=void 0,setTimeout(()=>{n!=this.category&&(a.searching="",$(i.currentTarget).find(".secondary").removeClass("dsahidden"),e.find(`.secondary[data-category="${n}"]`).removeClass("shown"))},50)})}async handleEffect(e,t,a,s){let i=t.effects.get(a),n=[...i.statuses][0];e.button==0?n?await t.addCondition(n,1,!1,!1):i.sheet.render(!0):e.button==2&&(n?await t.removeCondition(n,1,!1):await t.sheet._deleteActiveEffect(a))}async handleGMRoll(e){let t=e.currentTarget.dataset.id,a=Math.round($(e.currentTarget).closest(".tokenHotbarInner,#hotbar").find(".modifierVal").val());e.ctrlKey?game.dsa5.apps.DSA5ChatListeners.check3D20(void 0,t,{modifier:a}):e.button==2?game.dsa5.macro.requestGC(t,a,{maxRolls:7}):game.dsa5.macro.requestRoll(t,a)}async handleSkillRoll(e,t,a,s,i=void 0){let n={};if(e.button==2&&(n.rollMode="blindroll"),a=="rideLoyaltyID")H.rollLoyalty(t,n);else if(a=="attackWeaponless")t.setupWeaponless("attack",n,s).then(r=>{t.basicTest(r)});else{let r=t?.items.get(a);if(r){if(e.originalEvent.ctrlKey)return r.sheet.render(!0);switch(r.type){case"meleeweapon":case"rangeweapon":e.originalEvent.altKey?r.update({"system.worn.value":!1}):r.system.worn.value?(r=O.buildSubweapon(r,i),t.setupWeapon(r,"attack",n,s).then(c=>{t.basicTest(c)})):t.exclusiveEquipWeapon(r.id,e.button==2);break;case"trait":t.setupWeapon(r,"attack",n,s).then(c=>{t.basicTest(c)});break;case"liturgy":case"spell":t.setupSpell(r,n,s).then(c=>{t.basicTest(c)});break;case"skill":t.setupSkill(r,n,s).then(c=>{t.basicTest(c)});break;case"consumable":await foundry.applications.api.DialogV2.confirm({window:{title:game.i18n.localize("SHEET.ConsumeItem")+": "+r.name},content:game.i18n.localize("SHEET.ConsumeItem")+": "+r.name,rejectClose:!1,modal:!0})&&(await r.setupEffect(null,{},s),await this.updateDSA5Hotbar());break}}}}async handleTradeStart(e,t,a,s){if(!game.user.targets.size)return ui.notifications.error("DIALOG.noTarget",{localize:!0});for(let i of game.user.targets)i.actor&&new xe(D.buildSpeaker(t,s),D.buildSpeaker(i.actor,i.id)).startTrade()}async handleOnUse(e,t,a,s){let i=t.items.get(a);await new J(i).executeOnUseEffect()}async handleEnchantment(e,t,a,s){let i=a.split("_"),n=t.items.get(i[0]);if(e.button==2)n&&n.sheet.render(!0);else{let r=n.getFlag("dsa5","enchantments");n.sheet.rollEnchantment(i[1],r)}}async handleGM(e,t,a,s){switch(a){case"masterMenu":g.renderToggle(game.dsa5.apps.gameMasterMenu);break;case"payMoney":this.payMoney(e);break;case"randomVictim":this.handleGMRandomVictim(e);break;default:a in this.callbackFunctions&&this.callbackFunctions[a](e,t,a,s)}}payMoney(e){let t=`${$(e.currentTarget).closest(".tokenHotbarInner,#hotbar").find(".modifierVal").val()}`;e.button==2?Q.createGetPaidChatMessage(t):Q.createPayChatMessage(t)}async handleGMRandomVictim(e){let t=await game.dsa5.apps.gameMasterMenu.rollRandomPlayer(e.button==2),a=game.actors.get(t);if(a){let s=await g.showArtwork(a);e.originalEvent.ctrlKey||setTimeout(()=>{s.close()},2e3)}}async handleSharedEffect(e){for(let t of canvas.tokens.controlled){let a=t.actor,s=t.id,i=a.effects.find(n=>n.name==e.currentTarget.dataset.name)?.id;await this.handleEffect(e,a,i,s)}}async executeQuickButton(e){let t=canvas.tokens.controlled[0]?.actor,a=canvas.tokens.controlled[0]?.id,s=e.currentTarget.dataset.id,i=e.currentTarget.dataset.subfunction,n=e.currentTarget.dataset.subweapon;switch(i){case"trade":this.handleTradeStart(e,t,s,a);break;case"addEffect":Lt.showDialog();break;case"effect":this.handleEffect(e,t,s,a);break;case"sharedEffect":this.handleSharedEffect(e);break;case"onUse":this.handleOnUse(e,t,s,a);break;case"gm":this.handleGM(e,t,s,a);break;case"none":case"darkness":break;case"skillgm":this.handleGMRoll(e);break;case"enchantment":this.handleEnchantment(e,t,s,a);break;default:this.handleSkillRoll(e,t,s,a,n)}}subWidth(e,t,a=7){return`style="width:${Math.ceil(e.length/a)*200}px"`}async getData(){let e=await super.getData(),t=this.actor,a={attacks:[],spells:[],default:[],skills:[],functions:[],gm:[]},s,i,n=[],r=[],l=[],c=game.settings.get("dsa5","tokenhotbarLayout"),m=c%2,d=o.defaultOptions.itemWidth,p=!1;if(t){let h=[],y=[],k=H.isRiding(t),C=game.i18n.localize("LocalizedIDs.riding");if(l=await this._effectEntries(t),game.combat){let v=t.items.filter(S=>S.type=="combatskill").map(S=>O._calculateCombatSkillValues(S.toObject(),t.system)),I=this._brawlEntry(v);I&&a.attacks.push(I);for(let S of t.items)S.type=="skill"&&(o.combatSkills.some(j=>S.name.startsWith(j))||k&&C==S.name)&&a.default.push(this._skillEntry(S,"skill filterable")),S.type=="trait"&&o.traitTypes.has(S.system.traitType.value)?a.attacks.push(this._traitEntry(S,t.system)):o.attackTypes.has(S.type)&&S.system.worn.value==!0?a.attacks.push(...this._combatEntry(S,v,t)):o.spellTypes.has(S.type)?S.system.effectFormula.value?a.spells.push(this._skillEntry(S,"spell filterable")):y.push(this._skillEntry(S,"spell filterable")):S.type=="skill"?h.push(this._skillEntry(S,"skill filterable",{addClass:S.system.group.value})):S.type=="consumable"&&n.push(this._actionEntry(S,"consumable",{abbrev:S.system.quantity.value})),S.getFlag("dsa5","onUseEffect")&&r.push(this._actionEntry(S,"onUse",{subfunction:"onUse"}));if(s=n.pop(),k){let S=this._ridingEntry(t);S&&a.default.push(S)}}else{let v=[];for(let I of t.items){if(I.type=="skill"&&(o.defaultSkills.has(I.name)||k&&C==I.name)&&a.default.push(this._skillEntry(I,"skill filterable")),I.type=="skill"){let S=this._skillEntry(I,"skill filterable",{addClass:I.system.group.value});I.system.talentValue.value>0&&v.push(S),h.push(S)}else o.spellTypes.has(I.type)&&(I.system.effectFormula.value?a.spells.push(this._actionEntry(I,"spell filterable")):y.push(this._actionEntry(I,"spell filterable")));I.getFlag("dsa5","onUseEffect")&&r.push(this._actionEntry(I,"onUse",{subfunction:"onUse"}))}a.skills.push(...v.sort((I,S)=>S.tw-I.tw).slice(0,5))}i=r.pop(),a.functions=this._functionEntries(),a.spells.length==0&&y.length>0&&a.spells.push(y.pop()),a.spells.length>0&&y.length>0&&(a.spells[0].more=y.sort((v,I)=>v.name.localeCompare(I.name)),a.spells[0].subwidth=this.subWidth(y,d)),a.default.length>0&&h.length>0&&(a.default[0].more=h.sort((v,I)=>v.addClass.localeCompare(I.addClass)||v.name.localeCompare(I.name)),a.default[0].subwidth=this.subWidth(h,d,20)),s&&(n.length>0&&(s.more=n,s.subwidth=this.subWidth(n,d)),a.consumables=[s]),i&&(r.length>0&&(i.more=r,i.subwidth=this.subWidth(r,d)),a.onUsages=[i])}else if(game.user.isGM&&!game.settings.get("dsa5","disableTokenhotbarMaster")){p=!0;let h=this.skills||await this.prepareSkills();a.gm=this._gmEntries().concat([{name:"TT.tokenhotbarSkill",id:"skillgm",icon:"systems/dsa5/icons/categories/Skill.webp",cssClass:"skillgm filterable",abbrev:"",subfunction:"none",more:h,subwidth:this.subWidth(h,d,20)}])}if(this.showEffects){let y={name:"CONDITION.add",id:"",icon:"icons/svg/aura.svg",cssClass:"effect",abbrev:game.i18n.localize("CONDITION.add")[0],subfunction:"addEffect"};if(l.length>0)y.more=l,y.subwidth=this.subWidth(l,d);else if(canvas.tokens.controlled.length>1){let k=await this.tokenHotbar._effectEntries(canvas.tokens.controlled[0].actor,{subfunction:"sharedEffect"});for(let C of canvas.tokens.controlled){let v=(await C.actor.actorEffects()).map(I=>I.name);k=k.filter(I=>v.includes(I.name))}y.more=k,y.subwidth=this.subWidth(k,d)}a.effects=[y]}let f=Object.keys(a).reduce((h,y)=>h+a[y].length,0)+(p?3:0);return m?(this.position.width=d,this.position.height=d*f+14):(this.position.width=d*f+14,this.position.height=d),pa(e,{items:a,itemWidth:d,direction:c,count:f,gmMode:p,darkness:canvas?.scene?.environment.darknessLevel||0,opacity:game.settings.get("dsa5","tokenhotbaropacity")}),e}_functionEntries(){let e=game.i18n.localize("MERCHANT.exchangeWithTarget");return[{name:e,id:"trade",cssClass:"function",abbrev:e[0],iconClass:"coinIcon",subfunction:"trade"}]}_brawlEntry(e){let t=e.find(a=>a.name==game.i18n.localize("LocalizedIDs.wrestle"));if(t)return{name:game.i18n.localize("attackWeaponless"),id:"attackWeaponless",icon:"systems/dsa5/icons/categories/attack_weaponless.webp",attack:t.system.attack.value,damage:"1d6",cssClass:"zbrawl"}}_ridingEntry(e){let t=H.getHorse(e);if(t){let a=H.getLoyaltyFromHorse(t);if(a)return{name:`${a.name} (${a.system.talentValue.value})`,id:"rideLoyaltyID",icon:a.img,cssClass:"skill",abbrev:a.name[0]}}}_gmEntries(){return this.gmItems.filter(e=>!e.disabled)}_actionEntry(e,t,a={}){return{name:e.name,id:e.id,icon:e.img,cssClass:t,abbrev:e.name[0],...a}}_enchantmentEntry(e,t,a,s={}){return{name:`${a.name} - ${e.name}`,id:`${a.id}_${e.id}`,icon:D.defaultImages[e.talisman?"liturgy":"spell"],cssClass:t,abbrev:e.name[0],...s}}_skillEntry(e,t,a={}){let s=e.system?.talentValue.value;return{name:s?`${e.name} (${s})`:e.name,id:e.id,icon:e.img,cssClass:t,addClass:e.system?.group?.value,abbrev:e.name[0],tw:s,...a}}_traitEntry(e,t){let a=O._parseDmg(e.toObject(),t);return{name:e.name,id:e.id,icon:e.img,cssClass:`weapon i${e.id}`,abbrev:e.name[0],attack:e.system.at.value,damage:a.damagedie,dadd:a.damageAdd}}_combatEntry(e,t,a,s=[]){let i=e.type=="meleeweapon"?O._prepareMeleeWeapon(e.toObject(),t,a):O._prepareRangeWeapon(e.toObject(),[],t,a),n=[{name:e.name,id:e.id,icon:e.img,cssClass:`weapon i${e.id}`,abbrev:e.name[0],attack:i.attack,damage:i.damagedie,dadd:i.damageAdd,...s}];for(let[r,l]of Object.entries(i.subweapons||{}))n.push({name:l.name,id:e.id,subweapon:r,icon:e.img,cssClass:`weapon i${e.id}`,abbrev:l.name[0],attack:l.attack,damage:l.damagedie,dadd:l.damageAdd,...s});return n}async _effectEntries(e,t={}){return(await e.actorEffects()).map(a=>{let s=a.getFlag("dsa5","value")||"";return{name:s?`${a.name} (${s})`:a.name,id:a.id,icon:a.img,cssClass:"effect",abbrev:`${a.name[0]} ${s}`,subfunction:"effect",indicator:s,...t}})}filterButtons(e){switch(e.which){case 8:this.searching=this.searching.slice(0,-1);break;default:if(!e.key.match(/^[a-zA-Z0-9öäüÖÄÜ]$/))return;this.searching+=e.key}e.preventDefault(),e.stopPropagation();let t=this.searching.toLowerCase();ge(t);let a=$(e.currentTarget).find(".subbuttons li");a.find(".dsahidden").removeClass("dsahidden"),a.filter(function(){return $(this).find("label").text().toLowerCase().trim().indexOf(t)==-1}).addClass("dsahidden")}async render(e,t={}){let a=await super.render(e,t);return this._element&&this._element.css({zIndex:61}),a}setPosition({left:e,top:t,width:a,height:s,scale:i}={}){let n=super.setPosition({left:e,top:t,width:a,height:s,scale:i}),r=this.element[0];if(!r.style.width||a){let l=a||r.offsetWidth,c=r.style.maxWidth||window.innerWidth;n.width=a=Math.clamp(l,0,c),r.style.width=a+"px",a+n.left>window.innerWidth&&(e=n.left)}return game.settings.set("dsa5","tokenhotbarPosition",{left:n.left,top:n.top}),n}async updateDSA5Hotbar(){if(ui.hotbar.updateDSA5Hotbar(),game.settings.get("dsa5","disableTokenhotbar"))return;let e=canvas.tokens.controlled;if(this.actor=void 0,this.showEffects=!1,e.length===1){let t=e[0].actor;t&&t.isOwner&&(this.actor=t)}e.length>=1&&(this.showEffects=!0),await this.render(!0,{focus:!1})}},Lt=class o extends foundry.applications.api.HandlebarsApplicationMixin(foundry.applications.api.ApplicationV2){static{u(this,"AddEffectDialog")}static DEFAULT_OPTIONS={classes:["dsa5","tokenStatusEffects"],window:{title:"CONDITION.add",resizable:!0},position:{width:700,height:"auto"}};static PARTS={main:{template:"systems/dsa5/templates/dialog/addstatusdialog.html"}};async _prepareContext(e){let t=await super._prepareContext(e);return t.effects=Gr(CONFIG.statusEffects).map(a=>({name:game.i18n.localize(a.name),img:a.img,description:game.i18n.localize(a.description),id:a.id})).sort((a,s)=>a.name.localeCompare(s.name)),t}static async showDialog(){new o().render(!0)}_onRender(e,t){super._onRender(t);let a=$(this.element);a.find(".filterable .reactClick").on("mouseenter",r=>{if(r.currentTarget.getElementsByClassName("hovermenu").length==0){let l=document.createElement("div");l.classList.add("hovermenu"),l.style.cssText="font-size: var(--font-size-20);";let c=document.createElement("i");c.classList.add("fas","fa-cogs"),c.dataset.tooltip="ActiveEffects.custom",c.addEventListener("click",async m=>this.configureEffect(m),!1),l.appendChild(c),r.currentTarget.appendChild(l)}}),a.find(".filterable .reactClick").on("mouseleave",r=>{let l=r.relatedTarget;l.parentNode==this||l==this||r.currentTarget.querySelectorAll(".hovermenu").forEach(c=>c.remove())}),a.find(".quantity-click").on("mousedown",r=>N.quantityClick(r)),a.find(".reactClick").on("click",r=>this.addEffect(r.currentTarget.dataset.value));let s=u(r=>this._filterConditions($(r.currentTarget),a),"filterConditions"),i=a.find(".conditionSearch");i.on("keyup",r=>this._filterConditions($(r.currentTarget),a)),i[0]&&i[0].addEventListener("search",s,!1);let n={};this.options.position.width==="auto"&&(n.width="auto"),this.options.position.height==="auto"&&(n.height="auto"),foundry.utils.isEmpty(n)||this.setPosition(n)}_filterConditions(e,t){if(e.val()!=null){let a=e.val().toLowerCase().trim(),s=t.find(".filterable");t.find(".filterHide").removeClass("filterHide"),s.filter(function(){return $(this).find("span").text().toLowerCase().trim().indexOf(a)==-1}).addClass("filterHide")}}static async modifyEffectDialog(e,t){new foundry.applications.api.DialogV2({window:{title:game.i18n.localize("CONDITION."+e)},position:{width:400},content:await renderTemplate("systems/dsa5/templates/dialog/configurestatusdialog.html"),buttons:[{action:"add",icon:"fa fa-check",label:"CONDITION.add",callback:u(async(a,s,i)=>{let n=s.form.elements,r={},l=Number(n.duration.value)||0;n.unit.value=="seconds"&&(l=Math.round(l/5));let c=n.effectname.value;l>0&&pa(r,N._buildDuration(l)),c&&(r.name=c),await t(e,r)},"callback")}]}).render(!0)}async configureEffect(e){e.stopPropagation();let a=$(e.currentTarget).closest(".reactClick").attr("data-value");this.close(),o.modifyEffectDialog(a,async(s,i)=>this.addEffect(s,i))}async addEffect(e,t={}){let a=e=="custom";if(canvas.tokens.controlled.length==1&&a)z.createCustomEffect(canvas.tokens.controlled[0].actor);else if(a)ui.notifications.error("DSAError.customEffect",{localize:!0});else for(let s of canvas.tokens.controlled)await s.actor.addTimedCondition(e,1,!1,!1,t);this.close()}};var{getProperty:Br}=foundry.utils,Qs=u(async(o,e,t,a)=>{if(game.user.isGM){let s=await game.dsa5.apps.DSA5_Utility.allMoneyItems(),i=await g.getFolderForType("Actor",null,"Dropped Items"),r=game.users.filter(p=>!p.isGM).map(p=>p.id).reduce((p,f)=>(p[f]=1,p),{default:0}),l=e.toObject();l.system.quantity.value=a,N.obfuscateDropData(l,t.tabsinvisible),Br(l,"system.worn.value")&&(l.system.worn.value=!1);let c={type:"npc",name:e.name,img:e.img,prototypeToken:{texture:{scaleX:1,scaleY:1,src:e.img},width:.4,height:.4},ownership:r,items:[...s,l],flags:{core:{sheetClass:"dsa5.MerchantSheetDSA5"}},folder:i,system:{merchant:{merchantType:"loot",temporary:!0,hidePlayer:1},status:{wounds:{value:16}}}},d=await(await game.dsa5.entities.Actordsa5.create(c)).getTokenDocument({x:t.x,y:t.y,hidden:!1});if(!canvas.dimensions.rect.contains(d.x,d.y))return!1;if(o){await canvas.scene.createEmbeddedDocuments("Token",[d],{noHook:!0});let p=e.system.quantity.value-a;p<1?await o.deleteEmbeddedDocuments("Item",[e.id]):await o.updateEmbeddedDocuments("Item",[{_id:e.id,"system.quantity.value":p}])}else await canvas.scene.createEmbeddedDocuments("Token",[d])}else{let s={itemId:e.uuid,sourceActorId:o?.id,data:t,amount:a};game.socket.emit("system.dsa5",{type:"itemDrop",payload:s})}},"dropToGround"),qr=u(async(o,e)=>{let t=await Item.implementation.fromDropData(e),a=t.parent;if(!b.equipmentCategories.has(t.type))return;let s=u(async i=>{Qs(a,t,e,i)},"callback");_t.create("DSASETTINGS.enableItemDropToCanvas",game.i18n.format("MERCHANT.dropGround",{name:t.name}),t.system.quantity.value,s)},"handleItemDrop"),Wr=u(async(o,e)=>{let t=e.x,a=e.y,s=0,i=o.grid.size,n=Math.ceil(Math.sqrt(e.ids.length));for(let r of e.ids){let l=game.actors.get(r);if(!l)continue;let c=await l.getTokenDocument({x:t,y:a,hidden:!1});c.constructor.create(c,{parent:o.scene}),n%s==0&&s>0?(a+=i,t=e.x):t+=i,s++}},"handleGroupDrop"),Rn=u(()=>{Hooks.on("dropCanvasData",async(o,e)=>{if(game.settings.get("dsa5","enableItemDropToCanvas")||game.user.isGM||e.tokenId){if(e.type=="Item")return qr(o,e),!1;if(e.type=="GroupDrop")return Wr(o,e),!1}})},"connectHook"),_t=class o extends foundry.applications.api.DialogV2{static{u(this,"RangeSelectDialog")}static async create(e,t,a,s,i=1,n=void 0){n=n||a;let r=await renderTemplate("systems/dsa5/templates/dialog/dropToGround.html",{name:t,min:i,max:n,count:a});new o({window:{title:e},content:r,buttons:[{action:"yes",icon:"fa fa-check",label:"yes",default:!0,callback:u((l,c,m)=>{s(c.form.elements.count.valueAsNumber)},"callback")},{action:"no",icon:"fas fa-times",label:"cancel"}]}).render(!0)}_onRender(e,t){super._onRender(t),$(this.element).find('input[type="range"]').on("change",s=>{$(s.currentTarget).closest(".row-section").find(".range-value").html($(s.currentTarget).val())})}};var{mergeObject:fa,getProperty:Ae,duplicate:Ze,hasProperty:Xs}=foundry.utils,ze=class extends ActorSheet{static{u(this,"ActorSheetDsa5")}get actorType(){return this.actor.type}async _render(e=!1,t={}){this._saveSearchFields(),this._saveCollapsed(),await super._render(e,t),this._setCollapsed(),this._restoreSeachFields();let a=$(this._element),s={".close":"SHEET.Close",".configure-sheet":"SHEET.Configure",".configure-token":"SHEET.Token",".import":"SHEET.Import"};for(let i of Object.keys(s))a.find(i).attr("data-tooltip",s[i]);this.currentFocus&&(a.find('[data-item-id="'+this.currentFocus+'"] input').trigger("focus").trigger("select"),this.currentFocus=null)}static get defaultOptions(){let e=super.defaultOptions;return e.tabs=[{navSelector:".tabs",contentSelector:".content",initial:"skills"}],fa(e,{width:770,height:740,scrollY:[".save-scroll"],dragDrop:[{dragSelector:".content .item",dropSelector:null},{dragSelector:".mainEffects .statusEffect",dropSelector:null}]}),e}_saveSearchFields(){if(this.form===null)return;let e=$(this.form).parent();this.searchFields={talentFiltered:$(e.find(".filterTalents")).hasClass("filtered"),searchText:$(e.find(".talentSearch")).val(),gearSearch:$(e.find(".gearSearch")).val()}}_restoreSeachFields(){if(this.searchFields!=null){let e=$(this.form).parent();this.searchFields.talentFiltered&&($(e.find(".filterTalents")).addClass("filtered"),$(e.find(".allTalents")).removeClass("showAll"));let t=$(e.find(".talentSearch"));t.val(this.searchFields.searchText),this.searchFields.searchText!=""&&this._filterTalents(t);let a=$(e.find(".gearSearch"));a.val(this.searchFields.gearSearch),this.searchFields.searchText!=""&&this._filterGear(a)}}_saveCollapsed(){if(this.form===null)return;let e=$(this.form).parent();this.collapsedBoxes=[],this.openDetails=[];let t=e.find(".ch-collapse i");for(let a of t)this.collapsedBoxes.push($(a).attr("class"));for(let a of $(e.find(".expandDetails.shown")))this.openDetails.push($(a).closest(".item").attr("data-item-id"))}_setCollapsed(){let e=$(this.form).parent();if(this.collapsedBoxes){let t=e.find(".ch-collapse i");for(let a=0;a(s[i]=game.i18n.localize(`RIDING.speeds.${i}`),s),{}),z.prepareActiveEffects(this.actor,a),a.enrichedOwnerdescription=await TextEditor.enrichHTML(Ae(this.actor.system,"details.notes.ownerdescription"),{secrets:this.object.isOwner,async:!0}),a.enrichedGmdescription=await TextEditor.enrichHTML(Ae(this.actor.system,"details.notes.gmdescription"),{secrets:this.object.isOwner,async:!0}),a.enrichedNotes=await TextEditor.enrichHTML(Ae(this.actor.system,"details.notes.value"),{secrets:this.object.isOwner,async:!0}),a.enrichedBiography=await TextEditor.enrichHTML(Ae(this.actor.system,"details.biography.value"),{secrets:this.object.isOwner,async:!0}),a}_onItemCreate(e){e.preventDefault();let t=e.currentTarget,a=Ze(t.dataset);b.equipmentTypes[a.type]&&(a.type="equipment",a=fa(a,{"system.equipmentType.value":e.currentTarget.attributes["item-section"].value,"system.effect.value":""})),["aggregatedTest","spell","liturgy","ritual","ceremony"].includes(a.type)||(a["system.weight.value"]=0,a["system.quantity.value"]=0),D.defaultIcon(a),a.name=g.categoryLocalization(a.type),this.actor.createEmbeddedDocuments("Item",[a])}_handleAggregatedProbe(e){let t=this._getItemId(e),a=this.actor.items.get(t).toObject(),s=a.system.talent[`value${e.currentTarget.dataset.which}`],i=this.actor.items.find(r=>r.name==s&&r.type=="skill"),n=`

    ${game.i18n.localize("TYPES.Item.aggregatedTest")}

    `;a.system.usedTestCount.value>=a.system.allowedTestCount.value?(n+=`${game.i18n.localize("Aggregated.noMoreAllowed")}`,ChatMessage.create(g.chatDataSetup(n))):this.actor.setupSkill(i,{moreModifiers:[{name:game.i18n.localize("failedTests"),value:-1*a.system.previousFailedTests.value,selected:!0},{name:game.i18n.localize("Modifier"),value:a.system.baseModifier,selected:!0}]},this.getTokenId()).then(r=>{this.actor.basicTest(r).then(l=>{l.result.successLevel>0?(a.system.cummulatedQS.value=l.result.qualityStep+a.system.cummulatedQS.value,a.system.cummulatedQS.value=Math.min(10,a.system.cummulatedQS.value)):a.system.previousFailedTests.value+=1,a.system.usedTestCount.value+=1,this.actor.updateEmbeddedDocuments("Item",[a]).then(()=>{let c=this.actor.items.get(t);c.postItem(),a.system.cummulatedQS.value>=10&&c.sheet.postFinishedItem()})})})}async consumeItem(e){await foundry.applications.api.DialogV2.confirm({window:{title:game.i18n.localize("SHEET.ConsumeItem")+": "+e.name},content:game.i18n.localize("SHEET.ConsumeItem")+": "+e.name,rejectClose:!1,modal:!0})&&e.setupEffect(null,{},this.getTokenId())}async _advanceAttribute(e){let t=Number(this.actor.system.characteristics[e].advances),a=t+Number(this.actor.system.characteristics[e].initial),s=this.actor.system.isPet||this.actor.system.isFamiliar?"C":"E",i=g._calculateAdvCost(a,s);if(await this._checkEnoughXP(i))return await this._updateAPs(i,{[`system.characteristics.${e}.advances`]:t+1}),await _.track(this.actor,{type:"attribute",attr:e,previous:a,next:a+1},i),!0}async _refundAttributeAdvance(e){let t=Number(this.actor.system.characteristics[e].advances),a=t+Number(this.actor.system.characteristics[e].initial);if(t>0){let s=this.actor.system.isPet||this.actor.system.isFamiliar?"C":"E",i=g._calculateAdvCost(a,s,0)*-1;return await this._updateAPs(i,{[`system.characteristics.${e}.advances`]:t-1}),await _.track(this.actor,{type:"attribute",attr:e,previous:a,next:a-1},i),!0}}async _rebuyPC(e){if(this.actor.system.status[e].permanentLossSum>0&&await this._checkEnoughXP(2)){let t=Number(this.actor.system.status[e].rebuy);return await this._updateAPs(2,{[`system.status.${e}.rebuy`]:t+1}),await _.track(this.actor,{type:"permanentLoss",attr:e,previous:t,next:t+1},2),!0}}async _refundPC(e){if(this.actor.system.status[e].rebuy>0){let t=Number(this.actor.system.status[e].rebuy);return await this._updateAPs(-2,{[`system.status.${e}.rebuy`]:t-1}),await _.track(this.actor,{type:"permanentLoss",attr:e,previous:t,next:t-1},-2),!0}}async _advancePoints(e){let t=Number(this.actor.system.status[e].advances),a=this.actor.system.isPet||this.actor.system.isFamiliar?"C":"D",s=g._calculateAdvCost(t,a);if(await this._checkEnoughXP(s)&&this._checkMaximumPointAdvancement(e,t+1))return await this._updateAPs(s,{[`system.status.${e}.advances`]:t+1}),await _.track(this.actor,{type:"point",attr:e,previous:t,next:t+1},s),!0}async _refundPointsAdvance(e){let t=Number(this.actor.system.status[e].advances);if(t>0){let a=this.actor.system.isPet||this.actor.system.isFamiliar?"C":"D",s=g._calculateAdvCost(t,a,0)*-1;return await this._updateAPs(s,{[`system.status.${e}.advances`]:t-1}),await _.track(this.actor,{type:"point",attr:e,previous:t,next:t-1},s),!0}}async _advanceItem(e){let t=this.actor.items.get(e),a=Number(t.system.talentValue.value),s=this.actor.system.isPet||this.actor.system.isFamiliar?"C":t.system.StF.value,i=g._calculateAdvCost(a,s);if(await this._checkEnoughXP(i)&&this.actor._checkMaximumItemAdvancement(t,a+1)?.result)return await this.actor.updateEmbeddedDocuments("Item",[{_id:e,"system.talentValue.value":a+1}]),await this._updateAPs(i),await _.track(this.actor,{type:"item",item:t,previous:a,next:a+1},i),!0}async _refundItemAdvance(e){let t=this.actor.items.get(e),a=t.type=="combatskill"?6:0,s=Number(t.system.talentValue.value);if(s>a){let i=this.actor.system.isPet||this.actor.system.isFamiliar?"C":t.system.StF.value,n=g._calculateAdvCost(s,i,0)*-1;return await this.actor.updateEmbeddedDocuments("Item",[{_id:e,"system.talentValue.value":s-1}]),await this._updateAPs(n),await _.track(this.actor,{type:"item",item:t,previous:s,next:s-1},n),!0}}_checkMaximumPointAdvancement(e,t){let a=!1;switch(e){case"wounds":a=t<=this.actor.system.characteristics.ko.value;break;case"astralenergy":a=t<=(this.actor.system.characteristics[this.actor.system.guidevalue.magical]==null?0:this.actor.system.characteristics[this.actor.system.guidevalue.magical].value*this.actor.system.energyfactor.magical);break;case"karmaenergy":a=t<=(this.actor.system.characteristics[this.actor.system.guidevalue.clerical]==null?0:this.actor.system.characteristics[this.actor.system.guidevalue.clerical].value*this.actor.system.energyfactor.clerical);break}return a||ui.notifications.error("DSAError.AdvanceMaximumReached",{localize:!0}),a}async _openLibrary(){game.dsa5.itemLibrary.render(!0)}async _configActor(){new Rt(this.actor,{}).render(!0)}_getHeaderButtons(){let e=super._getHeaderButtons();return e.unshift({class:"library",tooltip:"SHEET.Library",icon:"fas fa-university",onclick:u(async()=>this._openLibrary(),"onclick")}),this.actor.isOwner&&(e.unshift({class:"actorConfig",tooltip:"SHEET.actorConfig",icon:"fas fa-link",onclick:u(async()=>this._configActor(),"onclick")}),e.unshift({class:"playerview",icon:"fas fa-toggle-on",tooltip:"SHEET.switchLimited",onclick:u(async t=>this._togglePlayerview(t),"onclick")})),this.actor.system.canAdvance&&e.unshift({class:"locksheet",tooltip:"SHEET.Lock",icon:`fas fa-${this.actor.system.sheetLocked.value?"":"un"}lock`,onclick:u(async t=>this._changeAdvanceLock(t),"onclick")}),e}async _changeAdvanceLock(e){await this.actor.update({"system.sheetLocked.value":!this.actor.system.sheetLocked.value}),$(e.currentTarget).find("i").toggleClass("fa-unlock fa-lock")}async _checkEnoughXP(e){return await this.actor.checkEnoughXP(e)}async advanceWrapper(e,t,...a){this.wrapperLocked||(this.wrapperLocked=!0,$(e.currentTarget).find("i").addClass("fa-spin fa-spinner"),await this[t](...a))||(this.wrapperLocked=!1,$(e.currentTarget).find("i").removeClass("fa-spin fa-spinner"))}playerViewEnabled(){return Ae(this.actor.system,"playerView")}_togglePlayerview(e){this.actor.update({"system.playerView":!Ae(this.actor.system,"playerView")})}showLimited(){return!game.user.isGM&&this.actor.limited||this.playerViewEnabled()}getTokenId(){return this.token?.id}rollDisease(e){let t=this.actor.items.get(e),a=this.actor.system.status.soulpower.max*-1,s=this.actor.system.status.toughness.max*-1;t.setupEffect(void 0,{rollMode:"gmroll",manualResistance:{SKModifier:a,ZKModifier:s}}).then(async i=>{let n=await t.itemTest(i);await this.actor.updateEmbeddedDocuments("Item",[{_id:t.id,"system.duration.resolved":n.result.duration}])})}async swapWeaponHand(e,t=void 0){let a=t?.id||this._getItemId(e);t=t||this.actor.items.get(a),["Daggers","Fencing Weapons"].includes(game.i18n.localize(`LocalizedCTs.${t.system.combatskill.value}`))||await this.actor.updateEmbeddedDocuments("Item",[{_id:a,"system.worn.wrongGrip":!t.system.worn.wrongGrip}])}activateListeners(e){super.activateListeners(e);let t=u(d=>{this.actor.items.get(this._getItemId(d)).postItem()},"posthand");e.find(".roll-disease").click(d=>this.rollDisease(this._getItemId(d))),me(e),e.find(".condition-edit").click(async d=>{(d.currentTarget.dataset.uuid?await fromUuid(d.currentTarget.dataset.uuid):this.actor.effects.get(d.currentTarget.dataset.id)).sheet.render(!0)}),e.find(".ch-collapse").click(d=>{$(d.currentTarget).find("i").toggleClass("fa-angle-up fa-angle-down"),$(d.currentTarget).closest(".groupbox").find(".row-section:nth-child(2)").fadeToggle()}),e.find(".status-create").click(d=>{let p=$(d.currentTarget).closest(".statusEffectMenu").find("ul");p.fadeIn("fast",()=>{p.find("input").trigger("focus")})}),e.find(".statusEffectMenu ul").mouseleave(d=>$(d.currentTarget).fadeOut()),e.find(".roll-aggregated").mousedown(d=>this._handleAggregatedProbe(d)),e.find(".skill-select").mousedown(d=>{let p=this._getItemId(d),f=this.actor.items.get(p);d.button==0?this.actor.setupSkill(f,{},this.getTokenId()).then(h=>{this.actor.basicTest(h)}):d.button==2&&f.sheet.render(!0)}),e.find(".spell-select").mousedown(d=>{let p=this._getItemId(d),f=this.actor.items.get(p);d.button==0?this.actor.setupSpell(f,{},this.getTokenId()).then(h=>this.actor.basicTest(h)):d.button==2&&f.sheet.render(!0)}),e.find(".item-post").click(d=>t(d)),e.find(".item-dropdown").click(d=>{d.preventDefault(),$(d.currentTarget).closest(".item").find(".expandDetails:first").toggleClass("shown")}),e.find(".condition-show").mousedown(d=>{d.preventDefault();let p=d.currentTarget.dataset.id,f=$(d.currentTarget).parents(".statusEffect").attr("data-descriptor");if(d.button==0){let h=$(d.currentTarget).parents(".statusEffect").attr("data-origin");if(h)fromUuid(h).then(y=>y.sheet.render(!0));else{let y,k;f?(y=CONFIG.statusEffects.find(v=>v.id==f),k=$(`
    ${game.i18n.localize(y.name)}: ${game.i18n.localize(y.description)}
    `)):(y=this.actor.effects.find(v=>v.id==p),y&&(k=$(`
    ${game.i18n.localize(y.name)}: ${game.i18n.localize(y.flags.dsa5.description)}
    `)));let C=$(d.currentTarget).closest(".groupbox").find(".effectDescription");C.fadeOut("fast",function(){C.html(k).fadeIn("fast")})}}else d.button==2&&!d.currentTarget.dataset.locked&&this._deleteActiveEffect(p)}),e.on("click",".chat-condition",d=>le.postStatus(d.currentTarget.dataset.id)),e.find(".money-change, .skill-advances").focusin(d=>{this.currentFocus=$(d.currentTarget).closest("[data-item-id]").attr("data-item-id")}),e.find(".item-edit").click(d=>{d.preventDefault();let p=this._getItemId(d);this.actor.items.get(p).sheet.render(!0)}),e.find(".showApplication").mousedown(d=>{if(d.preventDefault(),d.button==2)this._deleteItem(d);else{let p=this._getItemId(d);this.actor.items.get(p).sheet.render(!0)}}),e.find(".ch-value").click(d=>{d.preventDefault();let p=d.currentTarget.attributes["data-char"].value;this.actor.setupCharacteristic(p,{},this.getTokenId()).then(f=>this.actor.basicTest(f))}),e.find(".ch-status").click(d=>{d.preventDefault(),this.actor.setupDodge({},this.getTokenId()).then(p=>{this.actor.basicTest(p)})}),e.find(".ch-regenerate").click(d=>{d.preventDefault(),this.actor.setupRegeneration("regenerate",{},this.getTokenId()).then(p=>this.actor.basicTest(p))}),e.find(".ch-weaponless").click(d=>{d.preventDefault();let p=d.currentTarget.attributes["data-char"].value;this.actor.setupWeaponless(p,{},this.getTokenId()).then(f=>this.actor.basicTest(f))}),e.find(".ch-fallingDamage").click(d=>{d.preventDefault(),this.actor.setupFallingDamage({},this.getTokenId())}),e.find(".ch-rollCombat").click(d=>{d.preventDefault();let p=this._getItemDataset(d),f=d.currentTarget.dataset.mode,h=O.buildSubweapon(this.actor.items.get(p.itemId),p.subweapon);this.actor.setupWeapon(h,f,{},this.getTokenId()).then(y=>this.actor.basicTest(y))});let a=u(d=>this._deleteItem(d),"deletehand");e.find(".cards .item").mouseenter(d=>{if(d.currentTarget.getElementsByClassName("hovermenu").length==0){let p=document.createElement("div");p.classList.add("hovermenu");let f=document.createElement("i");f.classList.add("fas","fa-times"),f.dataset.tooltip="SHEET.DeleteItem",f.addEventListener("click",a,!1);let h=document.createElement("i");h.classList.add("fas","fa-comment"),h.dataset.tooltip="SHEET.PostItem",h.addEventListener("click",t,!1),p.appendChild(h),p.appendChild(f),d.currentTarget.appendChild(p)}}),e.find(".cards .item").mouseleave(d=>{let p=d.toElement||d.relatedTarget;!p||p.parentNode==this||p==this||d.currentTarget.querySelectorAll(".hovermenu").forEach(f=>f.remove())});let s=this.actor.uuid;e.find(".actorDrag").each(function(d,p){p.setAttribute("draggable",!0),p.addEventListener("dragstart",f=>{let h={type:"Actor",uuid:s};f.dataTransfer.setData("text/plain",JSON.stringify(h))})}),e.find(".filterTalents").click(d=>{$(d.currentTarget).closest(".content").find(".allTalents").toggleClass("showAll"),$(d.currentTarget).toggleClass("filtered")}),e.find(".charimg").mousedown(d=>{d.button==2&&g.showArtwork(this.actor,!0)}),re.bindRollCommands(e);let i=u(d=>this._filterTalents($(d.currentTarget)),"filterTalents"),n=e.find(".talentSearch");n.keyup(d=>this._filterTalents($(d.currentTarget))),n[0]&&n[0].addEventListener("search",i,!1);let r=u(d=>this._filterConditions($(d.currentTarget)),"filterConditions"),l=e.find(".conditionSearch");l.keyup(d=>this._filterConditions($(d.currentTarget))),l[0]&&l[0].addEventListener("search",r,!1);let c=u(d=>this._filterGear($(d.currentTarget)),"filterGear"),m=e.find(".gearSearch");m.keyup(d=>this._filterGear($(d.currentTarget))),m[0]&&m[0].addEventListener("search",c,!1),Qe(e,"img.charimg"),H.activateListeners(e,this.actor),this._bindKeepFieldsEnabled(e),this.isEditable&&(new ContextMenu(e,".item .withContext",[],{onOpen:this._onItemContext.bind(this)}),new ContextMenu(e,".combat-weapon",[],{onOpen:this._onWeaponItemContext.bind(this)}),e.find(".startCharacterBuilder").click(()=>this.actor.setFlag("core","sheetClass","dsa5.DSACharBuilder")),e.find(".schipUpdate").click(d=>{d.preventDefault();let p=Number(d.currentTarget.getAttribute("data-val"));p==1&&$(this.form).find(".fullSchip").length==1&&(p=0),this.actor.update({"system.status.fatePoints.value":p})}),e.find(".swapWeaponHand").click(d=>this.swapWeaponHand(d)),e.find(".defenseToggle").click(()=>this.actor.update({"system.config.defense":!this.actor.system.config.defense})),e.find(".loadWeapon").mousedown(async d=>{let p=this._getItemId(d),f=this.actor.items.get(p).toObject();if(Ae(f,"system.currentAmmo.value")==="")return;let h={_id:p};if(d.button==0){let y=f.type=="trait"?f.system.reloadTime.value:O.calcLZ(f,this.actor);h["system.reloadTime.progress"]=Math.min(f.system.reloadTime.progress+1,y)}else d.button==2&&(h["system.reloadTime.progress"]=0);await this.actor.updateEmbeddedDocuments("Item",[h])}),e.find(".chargeSpell").mousedown(async d=>{let p=this._getItemId(d),f=this.actor.items.get(p).toObject(),h=Number(f.system.castingTime.modified);d.button==0?f.system.castingTime.progress=Math.min(f.system.castingTime.progress+1,h):d.button==2&&(f.system.castingTime.progress=0,f.system.castingTime.modified=0),await this.actor.updateEmbeddedDocuments("Item",[f])}),e.find(".item-swapMag").click(async d=>{await this.actor.swapMag(this._getItemId(d))}),e.find(".ammo-selector").change(async d=>{d.preventDefault();let p=this._getItemId(d);await this.actor.updateEmbeddedDocuments("Item",[{_id:p,"system.currentAmmo.value":$(d.currentTarget).val()}])}),e.find(".item-toggle").click(d=>{let p=this._getItemId(d),f=this.actor.items.get(p).toObject();switch(f.type){case"armor":case"rangeweapon":case"meleeweapon":case"equipment":this.actor.updateEmbeddedDocuments("Item",[{_id:p,"system.worn.value":!f.system.worn.value}]),K.playEquipmentWearStatusChange(f);break}}),e.find(".quantity-click").mousedown(d=>{let p=this._getItemId(d),f=this.actor.items.get(p).toObject();N.increment(d,f,"system.quantity.value",0),this.actor.updateEmbeddedDocuments("Item",[f])}),e.find(".status-add").mousedown(async d=>{let p=d.currentTarget.dataset.id;p=="custom"?z.createCustomEffect(this.actor):d.button==0?await this.actor.addCondition(p,1,!1,!1):d.button==2&&Lt.modifyEffectDialog(p,async(f,h)=>this.actor.addTimedCondition(f,1,!1,!1,h))}),e.find(".money-change").change(async d=>{let p=this._getItemId(d);await this.actor.updateEmbeddedDocuments("Item",[{_id:p,"system.quantity.value":Number(d.target.value)}])}),e.find(".skill-advances").change(async d=>{let p=this._getItemId(d);await this.actor.updateEmbeddedDocuments("Item",[{_id:p,"system.talentValue.value":Number(d.target.value)}])}),e.find(".advance-attribute").mousedown(d=>this.advanceWrapper(d,"_advanceAttribute",d.currentTarget.dataset.attr)),e.find(".refund-attribute").mousedown(d=>this.advanceWrapper(d,"_refundAttributeAdvance",d.currentTarget.dataset.attr)),e.find(".advance-item").mousedown(d=>this.advanceWrapper(d,"_advanceItem",this._getItemId(d))),e.find(".refund-item").mousedown(d=>this.advanceWrapper(d,"_refundItemAdvance",this._getItemId(d))),e.find(".advance-points").mousedown(d=>this.advanceWrapper(d,"_advancePoints",d.currentTarget.dataset.attr)),e.find(".refund-points").mousedown(d=>this.advanceWrapper(d,"_refundPointsAdvance",d.currentTarget.dataset.attr)),e.find(".rebuy-pc").mousedown(d=>this.advanceWrapper(d,"_rebuyPC",d.currentTarget.dataset.attr)),e.find(".refund-pc").mousedown(d=>this.advanceWrapper(d,"_refundPC",d.currentTarget.dataset.attr)),e.find(".onUseItem").mousedown(d=>this._onMacroUseItem(d)),e.find(".traditionPayCost").mousedown(d=>this._payAeSpecialAbilityCost(d)),e.find(".item-create").click(d=>this._onItemCreate(d)),e.find(".condition-toggle").mousedown(async d=>{let p=$(d.currentTarget).parents(".statusEffect").attr("data-id"),f=this.actor.effects.get(p);await f.update({disabled:!f.disabled})}),e.find(".condition-value").mousedown(async d=>{let p=$(d.currentTarget).parents(".statusEffect").attr("data-descriptor");d.button==0?await this.actor.addCondition(p,1,!1,!1):d.button==2&&await this.actor.removeCondition(p,1,!1)}),e.find(".item-delete").click(d=>this._deleteItem(d)),e.find(".tradition-delete").click(d=>this._deleteTraditionArtifact(d)),e.find(".selectTraditionartifact").click(()=>this.selectTraditionartifact()),e.find(".disableRegeneration").click(d=>{let f=`system.repeatingEffects.disabled.${d.currentTarget.dataset.type}`;this.actor.update({[f]:!Ae(this.actor,f)})}))}_onItemContext(e){let t=this.actor.items.get($(e).closest(".item").attr("data-item-id"));t&&(ui.context.menuItems=this._getItemContextOptions(t),Hooks.call("dsa5.getItemContextOptions",t,ui.context.menuItems))}_onWeaponItemContext(e){let t=this.actor.items.get(e.dataset.itemId);!t||t?.type!="meleeweapon"||(ui.context.menuItems=this._getWeaponItemContextOptions(t),Hooks.call("dsa5.getWeaponItemContextOptions",t,ui.context.menuItems))}_getWeaponItemContextOptions(e){let t=[];if(e.type=="meleeweapon"){let a=game.i18n.localize(`LocalizedCTs.${e.system.combatskill.value}`);if(!["Daggers","Fencing Weapons"].includes(a)){let n=e.sheet.getGripInfo(this.item).wrongGripLabel;t.push({name:n,icon:"",callback:u(r=>this.swapWeaponHand(r,e),"callback")})}let s=["Daggers","Fencing Weapons","Impact Weapons","Swords","Polearms"].includes(a)&&F.hasAbility(this.actor,game.i18n.localize("LocalizedIDs.weaponThrow")),i=`${game.i18n.localize("TYPES.Item.rangeweapon")} ${game.i18n.localize("CHARAbbrev.AT")} -${s?4:8} ${game.i18n.localize("CHARAbbrev.RW")} ${b.meleeAsRangeReach[a]}`;t.push({name:i,icon:"",callback:u(()=>this.actor.throwMelee(e,this.getTokenId()),"callback")},{name:"SHEET.EquipItem",icon:"",callback:u(()=>e.update({"system.worn.value":!e.system.worn.value}),"callback")})}else e.type=="rangeweapon"&&t.push({name:"SHEET.EquipItem",icon:"",callback:u(()=>e.update({"system.worn.value":!e.system.worn.value}),"callback")});return t.push({name:"SHEET.PostItem",icon:"",callback:u(()=>e.postItem(),"callback")}),t}_getItemContextOptions(e){let t=[{name:"SHEET.EditItem",icon:"",callback:u(()=>e.sheet.render(!0),"callback")},{name:"SHEET.PostItem",icon:"",callback:u(()=>e.postItem(),"callback")},{name:"SHEET.DuplicateItem",icon:"",callback:u(()=>this.handleItemCopy(e.toObject(),e.type),"callback")},{name:"SHEET.ConsumeItem",icon:"",condition:u(()=>e.type=="consumable","condition"),callback:u(()=>this.consumeItem(e),"callback")},{name:"SHEET.onUseEffect",icon:"",condition:u(()=>Ae(e,"flags.dsa5.onUseEffect"),"condition"),callback:u(()=>new J(e).executeOnUseEffect(),"callback")},{name:"SHEET.DeleteItem",icon:"",callback:u(()=>this._itemDeleteDialog(e),"callback")},{name:"MERCHANT.exchange",icon:"",condition:u(()=>b.equipmentCategories.has(e.type),"condition"),callback:u(()=>this._startTrade(e),"callback")},{name:"SHEET.changeMoney",icon:"",condition:u(()=>e.type=="money","condition"),callback:u(()=>Q._replaceMoney(this.actor),"callback")}];return(Xs(e,"system.worn.wearable")||["meleeweapon","rangeweapon","armor"].includes(e.type))&&t.push({name:"SHEET.EquipItem",icon:"",callback:u(()=>e.update({"system.worn.value":!e.system.worn.value}),"callback")}),Number(Ae(e,"system.quantity.value"))>1&&t.push({name:"SHEET.SplitItem",icon:"",callback:u(()=>this._splitItem(e),"callback")}),t}async _startTrade(e){new ua(this.actor).render(!0)}_splitItem(e){let t=u(async a=>{let s=e.toObject();s.system.quantity.value=a,await this.actor.createEmbeddedDocuments("Item",[s],{render:!1}),await this.actor.updateEmbeddedDocuments("Item",[{_id:e.id,"system.quantity.value":e.system.quantity.value-a}])},"callback");_t.create("SHEET.SplitItem",game.i18n.format("MERCHANT.splitItem",{name:e.name}),e.system.quantity.value-1,t,1,e.system.quantity.value-1)}_bindKeepFieldsEnabled(e){if(!this.isEditable){let t=e.find(".keepFieldsEnabled");for(let a of t){let s=a.dataset.attr,i=a.dataset.name;$(a).find(".editor").append(``),$(a).find(".editor-edit").click(n=>this._openKeepFieldEditpage(n))}}}_openKeepFieldEditpage(e){let t=e.currentTarget.dataset.attr,a=e.currentTarget.dataset.name;new Pt(this.actor.id,t,a).render(!0)}async _onMacroUseItem(e){let t=this.actor.items.get(this._getItemId(e));await new J(t).executeOnUseEffect()}async _payAeSpecialAbilityCost(e){let t=this.actor.items.get(this._getItemId(e)),a=Number(Ae(t,"system.AsPCost"));if(!this.actor.applyMana(a,"AsP"))return;let i=game.i18n.format("CHATNOTIFICATION.paysTraditionAbility",{name:this.actor.name,ability:t.name,cost:a});e.button==2?ChatMessage.create(g.chatDataSetup(i,"gmroll")):ChatMessage.create(g.chatDataSetup(i))}_filterGear(e){if(e.val()!=null){let t=e.val().toLowerCase().trim(),a=$(this.element).find(".inventory .item");a.removeClass("filterHide"),a.filter(function(){return $(this).find("a.item-edit").text().toLowerCase().trim().indexOf(t)==-1}).addClass("filterHide")}}async selectTraditionartifact(){this.isEditable&&new Zs(this.actor).render(!0)}_deleteTraditionArtifact(e){if(!this.isEditable)return;this.actor.items.get(this._getItemId(e)).update({"system.isArtifact":!1})}_filterTalents(e){if(e.val()!=null){let t=e.val().toLowerCase().trim(),a=$(this.form).parent().find(".allTalents");a.find(".item, .table-header, .table-title").removeClass("filterHide"),a.addClass("showAll").find(".item").filter(function(){return $(this).find(".talentName").text().toLowerCase().trim().indexOf(t)==-1}).addClass("filterHide"),t.length>0?(a.find(".table-header, .table-title:not(:eq(0))").addClass("filterHide"),a.addClass("filterfull")):a.removeClass("filterfull")}}_filterConditions(e){if(e.val()!=null){let t=e.val().toLowerCase().trim(),a=$(this.form).find(".statusEffectMenu li:not(.search)");a.removeClass("filterHide"),a.filter(function(){return game.i18n.localize($(this).find("a").attr("data-tooltip")).toLowerCase().trim().indexOf(t)==-1}).addClass("filterHide")}}async _deleteActiveEffect(e){if(!this.isEditable)return;let t=this.actor.effects.get(e);t&&this.actor.deleteEmbeddedDocuments("ActiveEffect",[t.id])}async _itemDeleteDialog(e){let t=game.i18n.format("DIALOG.DeleteItemDetail",{item:e.name}),a=await renderTemplate("systems/dsa5/templates/dialog/delete-item-dialog.html",{message:t});await foundry.applications.api.DialogV2.confirm({window:{title:"DIALOG.deleteConfirmation"},content:a,rejectClose:!1,modal:!0})&&await this._cleverDeleteItem(e.id)}async _deleteItem(e){if(!this.isEditable)return;let t=this._getItemId(e),a=this.actor.items.get(t);this._itemDeleteDialog(a)}async _cleverDeleteItem(e){let t=this.actor.items.get(e),a=[e];switch(t.type){case"advantage":case"disadvantage":await P.vantageRemoved(this.actor,t,!1);break;case"specialability":await F.abilityRemoved(this.actor,t,!1);break;case"blessing":case"magictrick":await this._updateAPs(-1,{},{render:!1}),await _.track(this.actor,{type:"item",item:t,state:-1},-1);break;case"ritual":case"ceremony":case"liturgy":case"spell":{let s=0;for(let n=0;n<=t.system.talentValue.value;n++)s+=g._calculateAdvCost(n,t.system.StF.value,0);let i=this.actor.items.filter(n=>n.type=="spellextension"&&t.type==n.system.category&&t.name==n.system.source);i&&(s+=i.reduce((n,r)=>n+(Number(r.system.APValue.value)||0),0),a.push(...i.map(n=>n.id))),await this._updateAPs(s*-1,{},{render:!1}),await _.track(this.actor,{type:"item",item:t,state:-1},s)}break}await this.actor.deleteEmbeddedDocuments("Item",a)}_getItemId(e){return $(e.currentTarget).closest(".item").attr("data-item-id")}_getItemDataset(e){return $(e.currentTarget).closest(".item")[0].dataset}async _addMoney(e){let a=Ze(this.actor.items.filter(s=>s.type=="money")).find(s=>s.name==e.name);a?(a.system.quantity.value+=e.system.quantity.value,await this.actor.updateEmbeddedDocuments("Item",[a])):await this.actor.createEmbeddedDocuments("Item",[e])}async _updateAPs(e,t={},a={}){await this.actor._updateAPs(e,t,a)}async _addVantage(e,t){P.needsAdoption(this.actor,e,t)}async _addSpecialAbility(e,t){F.needsAdoption(this.actor,e,t)}_onDragStart(e){let t=e.currentTarget;if(e.target.classList.contains("content-link"))return;let a;t.dataset.itemId&&(a=this.actor.items.get(t.dataset.itemId).toDragData(),t.dataset.mod&&(a.mod=t.dataset.mod)),t.dataset.id&&(a=this.actor.effects.get(t.dataset.id).toDragData()),a&&e.dataTransfer.setData("text/plain",JSON.stringify(a))}async _handleSpellExtension(e){if(!this.actor.items.find(a=>a.type==e.type&&a.name==e.name)){e=Ze(e);let a=this.actor.items.find(s=>s.type==e.system.category&&s.name==e.system.source);if(!a)ui.notifications.error(game.i18n.format("DSAError.noSpellForExtension",{name:e.system.source,category:g.categoryLocalization(e.system.category),extension:e.name}));else{if(a.system.talentValue.values.type==e.type&&s.name==e.name),a;if(e=Ze(e),!t){switch(e.type){case"spell":case"liturgy":case"ceremony":case"ritual":a=g._calculateAdvCost(0,e.system.StF.value,0);break;case"blessing":case"magictrick":a=1;break;case"magicalsign":a=e.system.APValue.value;break;default:return}if(await this.actor.checkEnoughXP(a)){await this._updateAPs(a,{},{render:!1});let s=(await this.actor.createEmbeddedDocuments("Item",[e]))[0];await _.track(this.actor,{type:"item",item:s,state:1},a)}}}async _addLoot(e){e=Ze(e);let t=this.actor.items.find(a=>D.areEquals(e,a));return t?(await D.stackItems(t,e,this.actor))[0]:(this._tabs[0].active=="combat"&&e.system.worn&&(e.system.worn.value=!0),(await this.actor.createEmbeddedDocuments("Item",[e]))[0])}async _addUniqueItem(e){if(e=Ze(e),!this.actor.items.some(t=>D.areEquals(e,t)))return(await this.actor.createEmbeddedDocuments("Item",[e]))[0]}async _addDemonMarkOrPatron(e){return await this._addUniqueItem(e)}async _addDisease(e){return e.system.duration.resolved="?",await this._addUniqueItem(e)}async handleItemCopy(e,t){e.name+=" (Copy)",this._manageDragItems(e,t)}async _addFullPack(e){let a=(await game.packs.get(e.name).getDocuments()).filter(s=>!this.actor.items.find(i=>i.type==s.type&&i.name==s.name));e.onlyType&&(a=a.filter(s=>s.type==e.onlyType)),await this.actor.createEmbeddedDocuments("Item",a.map(s=>s.toObject()))}async creatureDrop(e){game.dsa5.config.hooks.shapeshift?new foundry.applications.api.DialogV2({window:{title:game.i18n.localize("DIALOG.ItemRequiresAdoption")+": "+e.name},content:`

    ${game.i18n.localize("DIALOG.whichFunction")+": "+e.name}

    `,buttons:[{action:"shapeshift",icon:"fas fa-paw",label:"CONDITION.shapeshift",callback:u(()=>{let t=game.dsa5.config.hooks.shapeshift;t.setShapeshift(this.actor,e),t.render(!0)},"callback")},{action:"horse",icon:"fas fa-horse",label:"RIDING.horse",default:!0,callback:u(()=>{H.setHorse(this.actor,e,this.token)},"callback")}]}).render(!0):H.setHorse(this.actor,e,this.token)}async _manageDragItems(e,t){switch(t){case"disease":await this._addDisease(e);break;case"meleeweapon":case"rangeweapon":case"equipment":case"ammunition":case"armor":case"poison":case"consumable":case"book":case"plant":return await this._addLoot(e);case"disadvantage":case"advantage":await this._addVantage(e,t);break;case"specialability":await this._addSpecialAbility(e,t);break;case"money":await this._addMoney(e);break;case"ritual":case"ceremony":case"blessing":case"magictrick":case"liturgy":case"spell":case"magicalsign":await this._addSpellOrLiturgy(e);break;case"effectwrapper":await this._handleEffectWrapper(e);break;case"application":await this._handleApplication(e);break;case"spellextension":await this._handleSpellExtension(e);break;case"creature":this.creatureDrop(e);break;case"skill":case"imprint":case"essence":case"information":await this._addUniqueItem(e);break;case"patron":case"demonmark":await this._addDemonMarkOrPatron(e);break;default:ui.notifications.error(game.i18n.format("DSAError.canNotBeAdded",{item:e.name,category:g.categoryLocalization(e.type)}))}}async _handleEffectWrapper(e){this.actor.createEmbeddedDocuments("ActiveEffect",e.effects.map(t=>(t.origin=null,t)))}async _handleLookup(e){let t=await g.findAnyItem(e.items);if(t){for(let a of e.items)if(a.count){let s=t.find(i=>i.name==a.name&&i.type==a.type);s?(s.system.quantity.value=a.count,a.qs&&a.type=="consumable"&&(s.system.QL=a.qs)):ui.notifications.warn(game.i18n.format("DSAError.notFound",{category:a.type,name:a.name}))}await this.actor.createEmbeddedDocuments("Item",t)}else ui.notifications.error(game.i18n.format("DSAError.notFound",{category:thing.type,name:thing.name}))}async _handleApplication(e){e=Ze(e),this.actor.items.find(a=>a.type==e.type&&a.name==e.name)||await this.actor.createEmbeddedDocuments("Item",[e])}async _handleRemoveSourceOnDrop(e){let t=e.parent;t&&t.isOwner&&await t.deleteEmbeddedDocuments("Item",[e._id])}async _onDropItemCreate(e){return e instanceof Array?this.actor.createEmbeddedDocuments("Item",e):await this._manageDragItems(e,e.type)}async _onDropActor(e,t){if(!this.actor.isOwner)return!1;let{item:a,typeClass:s,selfTarget:i}=await Ee(t,this.id,!1);if(!i)return await this._manageDragItems(a,s)}async _onDropActiveEffect(e,t){let a=await ActiveEffect.implementation.fromDropData(t);if(!this.actor.isOwner||!a||this.actor.uuid===a.parent?.uuid)return!1;let s=a.toObject();return s.origin=null,ActiveEffect.create(s,{parent:this.actor})}async _onDropItem(e,t){if(!this.actor.isOwner)return!1;let a=await Item.implementation.fromDropData(t),s=a.toObject();N.obfuscateDropData(s,t.tabsinvisible);let i,n=!1,r=$(e.target).parents(".item");if(r&&b.equipmentCategories.has(a.type)){let c=r.attr("data-item-id");c!=a.id&&(r.attr("data-category")=="bags"?i=c:(r=this.actor.items.get(c),n=r&&Xs(a,"system.quantity.value")&&Xs(r,"system.quantity.value")&&D.areEquals(a,r)))}let l=this.actor.uuid===a.parent?.uuid;if(l)if(e.ctrlKey)await this.handleItemCopy(s,a.type);else if(n)await r.update({"system.quantity.value":r.system.quantity.value+a.system.quantity.value},{render:!1}),await this.actor.deleteEmbeddedDocuments("Item",[a.id]);else if(i){let c={_id:a.id,"system.parent_id":i};a.system.worn&&a.system.worn.value&&(c["system.worn.value"]=!1),await this.actor.updateEmbeddedDocuments("Item",[c])}else b.equipmentCategories.has(a.type)&&await this.actor.updateEmbeddedDocuments("Item",[{_id:a.id,system:{parent_id:0}}]);else{if(this._itemHasPrice(t)){let m=`${a.type=="consumable"?D.getSubClass(s.type).consumablePrice(s):Number(s.system.price.value)}`;if(m&&!await Q.payMoney(this.actor,m,!0,!1))return;ge(game.i18n.format("PAYMENT.pay",{actor:this.actor.name,amount:m})),K.playMoneySound()}await this._onDropItemCreate(s)}e.altKey&&!l&&b.equipmentCategories.has(a.type)&&await this._handleRemoveSourceOnDrop(a)}_itemHasPrice(e){return e.pay}},Zs=class extends Application{static{u(this,"TraditionArtifactpicker")}constructor(e,t={}){super(t),this.actor=e}get template(){return"systems/dsa5/templates/actors/traditionPicker.html"}static get defaultOptions(){let e=super.defaultOptions;return fa(e,{width:440,resizable:!0}),e}async getData(e){let t=await super.getData(e),a=this.actor.items.filter(s=>["equipment","armor","rangeweapon","meleeweapon"].includes(s.type));return fa(t,{items:a}),t}activateListeners(e){super.activateListeners(e),e.find(".slot").click(async t=>{let a=this.actor.items.get(t.currentTarget.dataset.itemId);await a.update({"system.isArtifact":!a.system.isArtifact})})}};var{mergeObject:Ur,duplicate:Vr,getProperty:Kr}=foundry.utils,ye=class o extends Application{static{u(this,"WizardDSA5")}constructor(e){super(e),this.actor=null,this.errors=[],this.attributes=[],this.updating=!1}static get defaultOptions(){let e=super.defaultOptions;return e.tabs=[{navSelector:".tabs",contentSelector:".content",initial:"description"}],Ur(e,{classes:e.classes.concat(["dsa5","largeDialog","generationWizard"]),width:770,height:740}),e.resizable=!0,e}async findCompendiumItem(e,t){for(let a of t){let s=await game.dsa5.itemLibrary.findCompendiumItem(e,a);if(s=s.find(i=>i.name==e&&i.type==a&&i.system),s)return s}}_parseAttributes(e,t=","){let a=[],s=game.i18n.localize("combatskillcountdivider")+":";for(let i of e.split(t))if(i.includes(s)){let n=i.split(":");a.push({choices:n[1].split("/").map(r=>r.trim()),allowedCount:Number(n[0].match(/\d/g))})}return a}async parseToItem(e,t){return e.trim()==""?[]:await Promise.all(e.split(", ").map(async a=>{let s=g.parseAbilityString(a.trim()),i=await this.findCompendiumItem(s.original,t);if(i||(i=await this.findCompendiumItem(s.name,t)),i){let r=i.uuid;i=Vr(i),i.uuid=r,i.tooltip=game.i18n.localize("Details"),i=te.reverseAdoptionCalculation(this.actor,s,i),i.system.APValue&&(i.APunparseable=isNaN(i.system.APValue.value),i.apCost=i.APunparseable?i.system.APValue.value:s.step*Number(i.system.APValue.value))}else if(this.attributes.includes(s.name)){let r=0;for(let l=this.actor.system.characteristics[game.dsa5.config.knownShortcuts[s.name.toLowerCase()][1]].value+1;l`);let r=t.map(l=>g.categoryLocalization(l)).join("/");this.errors.push(`${r}: ${a}`),i={name:a.trim(),notFound:!0,tooltip:game.i18n.localize("DSAError.itemNotFound"),apCost:"?"}}i.replaceName=s.original,i.step=s.step;let n=this.actor.items.find(r=>t.includes(r.type)&&r.name==s.original)!=null;return i.disabled=n||i.notFound||i.APunparseable,n&&(i.tooltip=game.i18n.localize("YouAlreadyHaveit")),i}))}mergeLevels(e,t,a){let s=!1,i=e.find(n=>n.name==t.name&&n.type==t.type);if(i){s=!0;let n=Number(Kr(t,"system.step.value"));n&&(i.system.step.value=Math.min(i.system.step.value+=n,i.system[a].value))}else e.push(t);return s}async addSelections(e,t=!0){let a=[];for(let s of e){if($(s).val()=="")continue;let n=(await fromUuid($(s).val())).toObject(),r=g.parseAbilityString(n.name);switch(n.name=$(s).attr("name"),n.type){case"advantage":case"disadvantage":n.system.step.value=Number(s.dataset.step),n=te.reverseAdoptionCalculation(this.actor,r,n),this.mergeLevels(a,n,"max")||P.vantageAdded(this.actor,n);break;case"specialability":n.system.step.value=Number(s.dataset.step),s.dataset.free=="true"&&(n.system.APValue.value=0),n=te.reverseAdoptionCalculation(this.actor,r,n),this.mergeLevels(a,n,"maxRank")||F.abilityAdded(this.actor,n);break;case"magictrick":this.mergeLevels(a,n);break}}await this.actor.createEmbeddedDocuments("Item",a,{render:t})}async fixPreviousCosts(e,t){for(let a of t){let s=e.find(i=>i.type==a.type&&i.name==a.name);s&&(a.apCost-=s.apCost)}}async alreadyAdded(e,t){if(e=="")return!1;let a=!1;try{a=await foundry.applications.api.DialogV2.wait({window:{title:"DIALOG.warning"},content:`

    ${game.i18n.format("DIALOG.alreadyAddedCharacterpart",{category:g.categoryLocalization(t)})}

    `,buttons:[{action:"ok",default:!0,icon:"fas fa-check",label:"Ok",callback:u(()=>!1,"callback")},{action:"cancel",icon:"fas fa-close",label:"Cancel",callback:u(()=>!0,"callback")}]})}catch{}return a}async updateSkill(e,t,a=1,s=!0){let i=[];for(let n of e){let r=g.parseAbilityString(n.trim()),l=this.actor.items.find(c=>c.type==t&&c.name==r.name);l?i.push({_id:l.id,"system.talentValue.value":Math.max(0,a*r.step+(s?Number(l.system.talentValue.value):0))}):(console.warn(`Could not find ${t} ${n}`),this.errors.push(`${g.categoryLocalization(t)}: ${n}`))}await this.actor.updateEmbeddedDocuments("Item",i,{render:!1})}async getData(e){let t=await super.getData(e);return await game.dsa5.itemLibrary.buildEquipmentIndex(),t}_validateInput(e,t=this){let a=/^exclusive_/;for(let s of e.find(".tab")){let i=$(s),n=new Set;for(let r of i.find(".exclusive"))n.add(r.className.split(/\s+/).filter(l=>a.test(l))[0]);for(let r of n){let l=i.find(".allowedCount_"+r.split("_")[1]),c=Number(l.attr("data-count"));if(i.find(`.${r}:checked`).length!=c)return this._showInputValidation(l,i,t),!1}}return!0}_showInputValidation(e,t,a){ui.notifications.error("DSAError.MissingChoices",{localize:!0});let s=e.closest(".tab").attr("data-tab");a.activateTab(s),o.flashElem(t.find(`.tabs a[data-tab='${s}']`)),o.flashElem(e.closest("div"))}activateListeners(e){super.activateListeners(e),me(e),e.find("button.ok").click(()=>{this.updating||(this.updating=!0,this.updateCharacter($(this._element)).then(()=>this.updating=!1))}),e.find("button.cancel").click(()=>{this.close()});let t=u(s=>{s.stopPropagation();let i=s.currentTarget.dataset.type,n=s.currentTarget.dataset.uuid;!n||!i||s.originalEvent.dataTransfer.setData("text/plain",JSON.stringify({type:i,uuid:n}))},"itemDragStart"),a=e.find(".show-item");a.click(async s=>{let i=s.currentTarget.dataset.uuid;(await fromUuid(i)).sheet.render(!0)}),a.attr("draggable",!0).on("dragstart",s=>t(s)),e.on("click",".searchableAbility a",s=>mt(s)),e.find(".exclusive").change(s=>{let i=$(s.currentTarget).closest(".tab"),n=$(s.currentTarget).attr("data-sel"),r=i.find(`.allowedCount_${n}`),l=Number(r.attr("data-count"));if(i.find(`.exclusive_${n}:checked`).length>l){s.currentTarget.checked=!1,o.flashElem(r);return}})}static flashElem(e,t="emphasize"){e.addClass(t),setTimeout(function(){e.removeClass(t)},600)}finalizeUpdate(){this.errors.length==0?this.close():$(this._element).find(".dialog-buttons").html(`

    ${game.i18n.localize("DSAError.notUnderstood")}

    • ${this.errors.join("
    • ")}
    `)}};var{mergeObject:Yr,getProperty:Pn,duplicate:Jr}=foundry.utils,et=class extends ye{static{u(this,"CultureWizard")}static get defaultOptions(){let e=super.defaultOptions;return e.title=game.i18n.format("WIZARD.addItem",{item:`${game.i18n.localize("TYPES.Item.culture")}`}),e.template="systems/dsa5/templates/wizard/add-culture-wizard.html",e}activateListeners(e){super.activateListeners(e),e.find(".optional").change(t=>{let a=$(t.currentTarget).closest(".content"),s=Number(a.attr("data-cost"));a.find(".optional:checked").each(function(){s+=Number($(this).attr("data-cost"))});let i=a.find(".apCost");i.text(s),ye.flashElem(i,"emphasize2")})}async getData(e){let t=await super.getData(e),a=await this.parseToItem(this.culture.system.recommendedAdvantages.value,["advantage"]),s=await this.parseToItem(this.culture.system.recommendedDisadvantages.value,["disadvantage"]),i=this.culture.system.writing.value==""?[]:await this.parseToItem(this.culture.system.writing.value.split(",").map(l=>`${game.i18n.localize("LocalizedIDs.literacy")} (${l.trim()})`).join(", "),["specialability"]),n=this.culture.system.language.value==""?[]:await this.parseToItem(this.culture.system.language.value.split(",").map(l=>`${game.i18n.localize("LocalizedIDs.language")} (${l.trim()}) 3`).join(", "),["specialability"]),r=Number(this.culture.system.APValue.value);return Yr(t,{title:game.i18n.format("WIZARD.addItem",{item:`${game.i18n.localize("TYPES.Item.culture")} ${this.culture.name}`}),culture:this.culture,description:game.i18n.format("WIZARD.culturedescr",{culture:this.culture.name,cost:r}),advantages:a,disadvantages:s,writings:i,languages:n,advantagesToChose:a.length>0,disadvantagesToChose:s.length>0,writingsToChose:i.length>0,languagesToChose:n.length>0,languagesToSelect:n.length>1,vantagesToChose:a.length>0||s.length>0,generalToChose:i.length>0||n.length>0,enrichedClothing:await TextEditor.enrichHTML(Pn(this.culture.system,"clothing.value"),{secrets:!1,async:!0}),enrichedDescription:await TextEditor.enrichHTML(Pn(this.culture.system,"description.value"),{secrets:!1,async:!0})}),t}async addCulture(e,t){this.actor=e,this.culture=t}_validateInput(e,t=this){let a=e.find(".localKnowledge");if(a.val()=="")return this._showInputValidation(a,e,t),!1;let s=e.find(".selectOnlyOne");return s.length&&s.find(".optional:checked").length!=1?(this._showInputValidation(s,e,t),!1):super._validateInput(e,t)}async updateCharacter(e,t=this){e.find("button.ok i").toggleClass("fa-check fa-spinner fa-spin");let a=Number(e.find(".apCost").text());if(!this._validateInput(e,t)||!await this.actor.checkEnoughXP(a)||await this.alreadyAdded(this.actor.system.details.culture.value,"culture")){e.find("button.ok i").toggleClass("fa-check fa-spinner fa-spin");return}let s={"system.details.culture.value":this.culture.name},i=await this.findCompendiumItem(`${game.i18n.localize("LocalizedIDs.localKnowledge")} ()`,["specialability"]);i&&(i=Jr(i),i.name=`${game.i18n.localize("LocalizedIDs.localKnowledge")} (${e.find(".localKnowledge").val()})`,i.system.APValue.value=0,await this.actor.createEmbeddedDocuments("Item",[i],{render:!1})),await this.addSelections(e.find(".optional:checked"),!1),await this.actor._updateAPs(a,{},{render:!1}),await this.updateSkill(this.culture.system.skills.value.split(","),"skill"),await this.actor.update(s),await _.track(this.actor,{type:"item",item:this.culture,state:1},a),this.finalizeUpdate()}};var{mergeObject:Qr,getProperty:Ln,duplicate:ei}=foundry.utils,tt=class o extends ye{static{u(this,"CareerWizard")}constructor(e){super(e),this.attributes=Object.keys(b.characteristics).map(t=>game.i18n.localize(`CHARAbbrev.${t.toUpperCase()}`))}static get abilityExceptions(){return{principles:new RegExp(`^${game.i18n.localize("LocalizedIDs.principles")} \\(`),obligations:new RegExp(`^${game.i18n.localize("LocalizedIDs.obligations")} \\(`)}}static get defaultOptions(){let e=super.defaultOptions;return e.title=game.i18n.format("WIZARD.addItem",{item:`${game.i18n.localize("TYPES.Item.career")}`}),e.template="systems/dsa5/templates/wizard/add-career-wizard.html",e}activateListeners(e){super.activateListeners(e),e.find(".optional").change(t=>{let a=$(t.currentTarget).closest(".content");if($(t.currentTarget).hasClass("exclusiveTricks")){let r=Number(a.find(".maxTricks").attr("data-spelltricklimit"));if(a.find(".exclusiveTricks:checked").length>r){t.currentTarget.checked=!1,ye.flashElem(a.find(".maxTricks"));return}}let s=Number(a.attr("data-cost")),i={};a.find(".optional:checked").each(function(){let r=Number($(this).attr("data-cost")),l=$(this).attr("name"),c=!1;for(let[m,d]of Object.entries(o.abilityExceptions))if(d.test(l)){(!i[m]||re.type=="specialability"&&e.system.category.value=="language").reduce((e,t)=>e+Number(t.system.APValue.value)*(t.system.step.value||1),0)}async getData(e){let t=await super.getData(e),a=await this.parseToItem(this.career.system.requirements.value,["disadvantage","advantage","specialability"]),s=a.filter(C=>["advantage","disadvantage"].includes(C.type)&&!C.disabled),i=await this.parseToItem(this.career.system.recommendedAdvantages.value,["advantage"]);this.fixPreviousCosts(a,i);let n=await this.parseToItem(this.career.system.recommendedDisadvantages.value,["disadvantage"]);this.fixPreviousCosts(a,n);let r=a.filter(C=>C.attributeRequirement),l=this._parseAttributes(this.career.system.combatSkills.value,/,|;/),c=this._parseAttributes(this.career.system.specialAbilities.value),m=this._parseAttributes(this.career.system.spells.value),d=this._parseAttributes(this.career.system.liturgies.value),p=Math.min(this._spendLanguagePoints(),Number(this.career.system.languagePoints.value)),f=Number(this.career.system.APValue.value)-p,h={},y=0;for(let C of a){if(C.disabled)continue;let v=!1;for(let[I,S]of Object.entries(o.abilityExceptions))if(S.test(C.name)){(!h[I]||C.apCostC.type=="specialability"&&!C.disabled);return Qr(t,{title:game.i18n.format("WIZARD.addItem",{item:`${game.i18n.localize("career")} ${this.career.name}`}),career:this.career,description:game.i18n.format("WIZARD.careerdescr",{career:this.career.name,cost:f+y}),baseCost:f,advantages:i,disadvantages:n,missingVantages:s,specAbChoices:c,spellChoices:m,liturgyChoices:d,missingSpecialabilities:k,combatskillchoices:l,spelltricks:await this.parseToItem(this.career.system.spelltricks.value,["magictrick"]),attributeRequirements:r,advantagesToChose:i.length,disadvantagesToChose:n.length,vantagesToChose:i.length||n.length||s.length,missingVantagesToChose:s.length,missingSpecialabiltiesToChose:k.length,combatToChose:l.length,magicToChose:this.career.system.spelltrickCount.value||m.length,religionToChose:d.length,anyAttributeRequirements:r.length,generalToChose:k.length||r.length||c.length,enrichedClothing:await TextEditor.enrichHTML(Ln(this.career.system,"clothing.value"),{secrets:!1,async:!0}),enrichedDescription:await TextEditor.enrichHTML(Ln(this.career.system,"description.value"),{secrets:!1,async:!0})}),t}async addCareer(e,t){this.actor=e,this.career=t}async setAbility(e,t,a=[]){if(e.trim()=="")return;let s=[],i=[],n=game.i18n.localize("combatskillcountdivider")+":";for(let r of e.split(",").concat(a)){if(r.includes(n)||r=="")continue;let l=g.parseAbilityString(r.trim()),c=this.actor.items.find(m=>t.includes(m.type)&&m.name==l.original);if(c)c=ei(c),c.system.talentValue?c.system.talentValue.value=l.step:c.system.step&&(c.system.step.value=l.step),c=te.reverseAdoptionCalculation(this.actor,l,c),i.push(c);else if(c=await this.findCompendiumItem(l.original,t),c||(c=await this.findCompendiumItem(l.name,t)),c)c=ei(c),c.name=l.original,c.system.talentValue?c.system.talentValue.value=l.step:c.system.step&&(c.system.step.value=l.step),c=te.reverseAdoptionCalculation(this.actor,l,c),s.push(c);else{let m=t.map(d=>g.categoryLocalization(d)).join("/");this.errors.push(`${m}: ${r}`),ui.notifications.error(game.i18n.format("DSAError.notFound",{category:m,name:r}))}}await this.actor.updateEmbeddedDocuments("Item",i,{render:!1}),await this.actor.createEmbeddedDocuments("Item",s,{render:!1})}async addBlessing(e,t){let a=[];for(let s of e){let i=s.trim();if(i=="")continue;let n=this.actor.items.find(r=>t==r.type&&r.name==i);n||(n=await this.findCompendiumItem(i,[t]),n?(n=ei(n),a.push(n)):(this.errors.push(`${g.categoryLocalization(t)}: ${s}`),ui.notifications.error(game.i18n.format("DSAError.notFound",{category:game.i18n.localize(t),name:i}))))}await this.actor.createEmbeddedDocuments("Item",a,{render:!1})}getExclusiveChoices(e,t){let a=[];for(let s of e.find(`${t}.exclusive:checked`))a.push($(s).val());return a}async updateCharacter(e,t=this){e.find("button.ok i").toggleClass("fa-check fa-spinner fa-spin");let a=Number(e.find(".apCost").text());if(!this._validateInput(e,t)||!await this.actor.checkEnoughXP(a)||await this.alreadyAdded(this.actor.system.details.career.value,"career")){e.find("button.ok i").toggleClass("fa-check fa-spinner fa-spin");return}let s={"system.details.career.value":this.career.name,"system.freeLanguagePoints.value":this.career.system.languagePoints.value,"system.freeLanguagePoints.used":Math.min(this._spendLanguagePoints(),Number(this.career.system.languagePoints.value))};for(let n of e.find(".attributes")){let r=$(n).attr("data-attribute").toLowerCase();r=game.dsa5.config.knownShortcuts[r.toLowerCase()][1],Number(this.actor.system.characteristics[r].initial)+Number(this.actor.system.characteristics[r].advances)!(n.includes(game.i18n.localize("combatskillcountdivider")+":")||n==""));await this.updateSkill(i,"combatskill",1,!1),await this.actor.update(s),await _.track(this.actor,{type:"item",item:this.career,state:1},a),this.finalizeUpdate()}};var{mergeObject:Xr}=foundry.utils,at=class extends ye{static{u(this,"SpeciesWizard")}static get defaultOptions(){let e=super.defaultOptions;return e.title=game.i18n.format("WIZARD.addItem",{item:`${game.i18n.localize("TYPES.Item.species")}`}),e.template="systems/dsa5/templates/wizard/add-species-wizard.html",e}activateListeners(e){super.activateListeners(e),e.find(".optional").change(t=>{let a=$(t.currentTarget).closest(".content"),s=Number(a.attr("data-cost"));a.find(".optional:checked").each(function(){s+=Number($(this).attr("data-cost"))});let i=a.find(".apCost");i.text(s),ye.flashElem(i,"emphasize2")})}async _toGroups(e,t,a){return await Promise.all(e.split(` +`).map(async i=>{let n=i.split(":"),r;return n.length>1?r={name:n[0].trim(),res:await this.parseToItem(n[1].trim(),t)}:r={name:"",res:await this.parseToItem(i,t)},this.fixPreviousCosts(a,r.res),r}))}async getData(e){let t=await super.getData(e),a=await this.parseToItem(this.species.system.requirements.value,["disadvantage","advantage"]),s=a.filter(m=>["advantage","disadvantage"].includes(m.type)&&!m.disabled),i=await this._toGroups(this.species.system.recommendedAdvantages.value,["advantage"],a),n=await this._toGroups(this.species.system.recommendedDisadvantages.value,["disadvantage"],a),r=this._parseAttributes(this.species.system.attributeChange.value),l=Number(this.species.system.APValue.value),c=a.reduce(function(m,d){return m+(d.disabled?0:Number(d.system.APValue.value)||0)},0);return Xr(t,{title:game.i18n.format("WIZARD.addItem",{item:`${game.i18n.localize("TYPES.Item.species")} ${this.species.name}`}),species:this.species,description:game.i18n.format("WIZARD.speciesdescr",{species:this.species.name,cost:l+c}),advantagegroups:i,baseCost:l,disadvantagegroups:n,missingVantages:s,attributeRequirements:r,hasLocalization:game.i18n.has(`Racedescr.${this.species.name}`),anyAttributeRequirements:r.length>0,advantagesToChose:i.length>0,missingVantagesToChose:s.length>0,disadvantagesToChose:n.length>0,vantagesToChose:i.length>0||n.length>0||s.length>0,generalToChose:r.length>0}),t}async addSpecies(e,t){this.actor=e,this.species=t}async updateCharacter(e,t=this){e.find("button.ok i").toggleClass("fa-check fa-spinner fa-spin");let a=Number(e.find(".apCost").text());if(!this._validateInput(e,t)||!await this.actor.checkEnoughXP(a)||await this.alreadyAdded(this.actor.system.details.species.value,"species")){e.find("button.ok i").toggleClass("fa-check fa-spinner fa-spin");return}let s={"system.details.species.value":this.species.name,"system.status.speed.initial":this.species.system.baseValues.speed.value,"system.status.soulpower.initial":this.species.system.baseValues.soulpower.value,"system.status.toughness.initial":this.species.system.baseValues.toughness.value,"system.status.wounds.initial":this.species.system.baseValues.wounds.value,"system.status.wounds.value":this.species.system.baseValues.wounds.value+this.actor.system.characteristics.ko.value*2},i=[];for(let n of e.find(".exclusive:checked"))i.push($(n).val());Object.keys(b.characteristics).forEach(n=>{s[`system.characteristics.${n}.species`]=0});for(let n of this.species.system.attributeChange.value.split(",").concat(i)){if(n.includes(game.i18n.localize("combatskillcountdivider")+":")||n=="")continue;let r=n.trim().split(" "),l=game.dsa5.config.knownShortcuts[r[0].toLowerCase().trim()].slice(0);l[l.length-1]="species",s[`system.${l.join(".")}`]=Number(r[1])}await this.actor._updateAPs(a,{},{render:!1}),await this.addSelections(e.find(".optional:checked"),!1),await this.actor.update(s),await this.actor.removeCondition("incapacitated"),await _.track(this.actor,{type:"item",item:this.species,state:1},a),this.finalizeUpdate()}};var{mergeObject:Zr}=foundry.utils,Ce=class extends ze{static{u(this,"ActorSheetdsa5Character")}static get defaultOptions(){let e=super.defaultOptions;return Zr(e,{classes:e.classes.concat(["dsa5","actor","character-sheet"]),width:784}),e}get template(){return this.showLimited()?"systems/dsa5/templates/actors/npc-limited.html":"systems/dsa5/templates/actors/actor-sheet.html"}async _manageDragItems(e,t){switch(t){case"aggregatedTest":await this.actor.createEmbeddedDocuments("Item",[e]);break;case"species":let a=new at;await a.addSpecies(this.actor,e),a.render(!0);break;case"culture":let s=new et;await s.addCulture(this.actor,e),s.render(!0);break;case"career":let i=new tt;await i.addCareer(this.actor,e),i.render(!0);break;default:return super._manageDragItems(e,t)}}};var{mergeObject:eo,getProperty:ga}=foundry.utils,Ne=class extends ze{static{u(this,"ActorSheetdsa5Creature")}static get defaultOptions(){let e=super.defaultOptions;return eo(e,{classes:e.classes.concat(["dsa5","actor","creature-sheet"])}),e}get template(){return this.showLimited()?"systems/dsa5/templates/actors/creature-limited.html":"systems/dsa5/templates/actors/creature-sheet.html"}async getData(e){let t=await super.getData(e);return t.enrichedDescription=await TextEditor.enrichHTML(ga(this.actor.system,"description.value"),{secrets:this.object.isOwner,async:!0}),t.enrichedBehaviour=await TextEditor.enrichHTML(ga(this.actor.system,"behaviour.value"),{secrets:this.object.isOwner,async:!0}),t.enrichedFlight=await TextEditor.enrichHTML(ga(this.actor.system,"flight.value"),{secrets:this.object.isOwner,async:!0}),t.enrichedSpecialrules=await TextEditor.enrichHTML(ga(this.actor.system,"specialRules.value"),{secrets:this.object.isOwner,async:!0}),t}async _cleverDeleteItem(e){let t=this.actor.items.find(a=>a.id==e);switch(t.type){case"trait":let a=t.system.APValue.value*-1;await this._updateAPs(a,{},{render:!1}),await _.track(this.actor,{type:"item",item:t,state:-1},a);break}await super._cleverDeleteItem(e)}async _addTrait(e){if(!this.actor.items.find(a=>a.type=="trait"&&a.name==e.name)){await this._updateAPs(e.system.APValue.value,{},{render:!1}),await he.traitAdded(this.actor,e);let a=(await this.actor.createEmbeddedDocuments("Item",[e]))[0];await _.track(this.actor,{type:"item",item:a,state:1},e.system.APValue.value)}}async _onDropItemCreate(e){return e.type=="trait"?this._addTrait(e):super._onDropItemCreate(e)}};var{mergeObject:to}=foundry.utils,Re=class extends Ce{static{u(this,"ActorSheetdsa5NPC")}static get defaultOptions(){let e=super.defaultOptions;return to(e,{classes:e.classes.concat(["dsa5","actor","npc-sheet"])}),e}get template(){return this.showLimited()?"systems/dsa5/templates/actors/npc-limited.html":"systems/dsa5/templates/actors/npc-sheet.html"}};var{getProperty:ao}=foundry.utils,je=u(o=>class extends o{async obfuscateItem(e){e.stopPropagation(),e.preventDefault();let t=e.currentTarget.dataset.obfuscate;await this.item.update({[`system.obfuscation.${t}`]:!this.isObfuscated(t)})}isObfuscated(e){return ao(this.item,`system.obfuscation.${e}`)}activateListeners(e){super.activateListeners(e),e.on("click",".obfuscateSection",t=>this.obfuscateItem(t))}obfuscationCss(e){return this.isObfuscated(e)?"":" pale"}async _render(e=!1,t={}){await super._render(e,t);let a=["details","effects","description","enchantment"],s=!1;for(let i of a){let n=$(this._element).find(`nav [data-tab="${i}"]`);if(!n.length)continue;let r=t.tabsinvisible||this.isObfuscated(i),l=game.i18n.localize(`SHEET.${r?"deobfuscateItem":"obfuscateItem"}`);if(game.user.isGM){let c=`obfuscateSection${this.obfuscationCss(i)}`,m=n.find(`.${c}`),d=``;m.length?m.replaceWith(d):n.append(` ${d}`)}else r&&(n.hasClass("active")&&(s=!0),n.remove(),i=="details"&&$(this._element).find('[name="system.price.value"],[name="system.price.raw"]').replaceWith(""))}if(s){let i=$(this._element).find("nav .item:first-child");if(i.length)this.activateTab(i.attr("data-tab"));else{let n=await renderTemplate("systems/dsa5/templates/items/obfuscatedItem.html",{item:this.item});$(this._element).find(".content").html(n)}}}},"ItemSheetObfuscation");var{mergeObject:ce,getProperty:be,duplicate:Di}=foundry.utils,Y=class o extends ItemSheet{static{u(this,"ItemSheetdsa5")}_getSubmitData(e={}){let t=super._getSubmitData(e),a=foundry.utils.flattenObject(this.item.overrides||{});return Object.keys(a).forEach(s=>delete t[s]),t}static get defaultOptions(){let e=super.defaultOptions;return ce(e,{tabs:[{navSelector:".tabs",contentSelector:".content",group:"primary"},{group:"secondary",navSelector:".tabs2",contentSelector:".content2"}],classes:e.classes.concat(["dsa5","item"]),width:471,height:500}),e}static setupSheets(){Items.unregisterSheet("core",ItemSheet),Items.registerSheet("dsa5",o,{makeDefault:!0}),Items.registerSheet("dsa5",vi,{makeDefault:!0,types:["species"]}),Items.registerSheet("dsa5",ci,{makeDefault:!0,types:["book"]}),Items.registerSheet("dsa5",pi,{makeDefault:!0,types:["career"]}),Items.registerSheet("dsa5",gi,{makeDefault:!0,types:["culture"]}),Items.registerSheet("dsa5",Ci,{makeDefault:!0,types:["advantage","disadvantage"]}),Items.registerSheet("dsa5",Si,{makeDefault:!0,types:["ritual","ceremony","liturgy","spell"]}),Items.registerSheet("dsa5",wi,{makeDefault:!0,types:["specialability"]}),Items.registerSheet("dsa5",bi,{makeDefault:!0,types:["meleeweapon"]}),Items.registerSheet("dsa5",ki,{makeDefault:!0,types:["poison"]}),Items.registerSheet("dsa5",hi,{makeDefault:!0,types:["disease"]}),Items.registerSheet("dsa5",fi,{makeDefault:!0,types:["consumable"]}),Items.registerSheet("dsa5",Ai,{makeDefault:!0,types:["spellextension"]}),Items.registerSheet("dsa5",yi,{makeDefault:!0,types:["magictrick"]}),Items.registerSheet("dsa5",mi,{makeDefault:!0,types:["blessing"]}),Items.registerSheet("dsa5",di,{makeDefault:!0,types:["rangeweapon"]}),Items.registerSheet("dsa5",ii,{makeDefault:!0,types:["equipment"]}),Items.registerSheet("dsa5",ni,{makeDefault:!0,types:["armor"]}),Items.registerSheet("dsa5",si,{makeDefault:!0,types:["ammunition"]}),Items.registerSheet("dsa5",ri,{makeDefault:!0,types:["plant"]}),Items.registerSheet("dsa5",li,{makeDefault:!0,types:["magicalsign"]}),Items.registerSheet("dsa5",oi,{makeDefault:!0,types:["patron"]}),Items.registerSheet("dsa5",ai,{makeDefault:!0,types:["information"]}),Items.registerSheet("dsa5",ti,{makeDefault:!0,types:["aggregatedTest"]}),Items.registerSheet("dsa5",Ti,{makeDefault:!0,types:["trap"]}),Items.unregisterSheet("dsa5",o,{types:["armor","equipment","rangeweapon","blessing","magictrick","spellextension","consumable","aggregatedTest","species","career","culture","advantage","specialability","disadvantage","ritual","information","trap","ceremony","liturgy","spell","disease","poison","meleeweapon","ammunition","plant","magicalsign","patron"]})}async _render(e=!1,t={}){await super._render(e,t),$(this._element).find(".close").attr("data-tooltip","SHEET.Close"),$(this._element).find(".configure-sheet").attr("data-tooltip","SHEET.Configure"),$(this._element).find(".import").attr("data-tooltip","SHEET.Import")}_getHeaderButtons(){let e=super._getHeaderButtons();return e.unshift({class:"showItemHead",icon:"fas fa-comment",tooltip:"SHEET.PostItem",onclick:u(async()=>this.item.postItem(),"onclick")}),this.item.actor&&J.getOnUseEffect(this.item)&&e.unshift({class:"onUseEffect",tooltip:"SHEET.onUseEffect",icon:"fas fa-dice-six",onclick:u(async()=>{new J(this.item).executeOnUseEffect()},"onclick")}),e}setupEffect(e){this.item.setupEffect().then(t=>this.item.itemTest(t))}get template(){return`systems/dsa5/templates/items/item-${this.item.type}-sheet.html`}_getItemId(e){return $(e.currentTarget).parents(".item").attr("data-item-id")}_advanceStep(){}_refundStep(){}async advanceWrapper(e,t){this.wrapperLocked||(this.wrapperLocked=!0,$(e.currentTarget).find("i").addClass("fa-spin fa-spinner"),await this[t]())||(this.wrapperLocked=!1,$(e.currentTarget).find("i").removeClass("fa-spin fa-spinner"))}activateListeners(e){super.activateListeners(e),me(e),e.find(".advance-step").mousedown(a=>this.advanceWrapper(a,"_advanceStep")),e.find(".refund-step").mousedown(a=>this.advanceWrapper(a,"_refundStep")),e.find(".domainsPretty").click(a=>{$(a.currentTarget).hide(),$(a.currentTarget).next(".domainToggle").show()}),e.find('[data-edit="img"]').mousedown(a=>{a.button==2&&g.showArtwork(this.item)}),e.find(".status-add").click(async()=>{z.createCustomEffect(this.item,"",this.item.name)}),e.find(".condition-show").mousedown(a=>{a.preventDefault();let s=a.currentTarget.dataset.id;a.button==0?this.item.effects.get(s).sheet.render(!0):a.button==2&&this.item.deleteEmbeddedDocuments("ActiveEffect",[s])}),e.find(".select2").select2(),e.find(".condition-toggle").mousedown(a=>{let s=$(a.currentTarget).parents(".statusEffect").attr("data-id"),i=this.item.effects.get(s);i.update({disabled:!i.disabled})}),e.find(".condition-edit").click(a=>{this.item.effects.get(a.currentTarget.dataset.id).sheet.render(!0)}),re.bindRollCommands(e),z.bindButtons(e);let t=e.find("header.item-header");if(t.length){let a=t.find("svg");if(a){new ResizeObserver(function(n){un(a,n[0].contentRect.width)}).observe(t.get(0));let i=t.find("input");i.get(0).disabled||(a.click(()=>{a.hide(),i.show(),i.focus()}),i.blur(function(){a.show(),i.hide()}))}}}async getData(e){let t=super.getData(e).data;switch(this.wrapperLocked=!1,this.item.type){case"skill":t.characteristics=b.characteristics,t.skillGroups=b.skillGroups,t.skillBurdens=b.skillBurdens,t.hasLocalization=game.i18n.has(`SKILLdescr.${this.item.name}`),t.StFs=b.StFs;break;case"application":t.hasLocalization=game.i18n.has(`APPLICATION.${this.item.system.skill} - ${this.item.name}`),t.localization=game.i18n.localize(`APPLICATION.${this.item.system.skill} - ${this.item.name}`),t.allSkills=await g.allSkillsList();break;case"combatskill":t.weapontypes=b.weapontypes,t.guidevalues=b.combatskillsGuidevalues,t.hasLocalization=game.i18n.has(`Combatskilldescr.${this.item.name}`),t.StFs=b.StFs;break;case"money":t.moneyTypes=b.moneyTypes;break;case"trait":t.traitCategories=b.traitCategories,t.ranges=b.meleeRanges;break}if(t.isOwned=this.item.actor,t.editable=this.isEditable,t.isOwned){t.canAdvance=this.item.actor.canAdvance&&this._advancable();let a=be(this.item,"flags.dsa5.customPriceTag");!this.isEditable&&a&&(t.customPrice=a)}return t.conditions=this.item.effects,game.user.isGM||t.conditions.filter(a=>!a.getFlag("dsa5","hidePlayers")),t.item=this.item,t.enableWeaponAdvantages=game.settings.get("dsa5","enableWeaponAdvantages"),t.armorAndWeaponDamage=game.settings.get("dsa5","armorAndWeaponDamage"),t.isGM=game.user.isGM,t.yesNoGroup={true:game.i18n.localize("yes"),false:game.i18n.localize("no")},t.enrichedDescription=await TextEditor.enrichHTML(be(this.item.system,"description.value"),{secrets:this.object.isOwner,async:!0}),t.enrichedGmdescription=await TextEditor.enrichHTML(be(this.item.system,"gmdescription.value"),{secrets:this.object.isOwner,async:!0}),t}_advancable(){return!1}},ti=class extends Y{static{u(this,"AggregatedTestSheet")}async getData(e){let t=await super.getData(e),a=this.item.getFlag("dsa5","embeddedItem"),s;return a&&(s=await renderTemplate(`systems/dsa5/templates/items/browse/${a.type}.html`,{document:a})),ce(t,{allSkills:await g.allSkillsList(),embeddedItem:a,renderedItem:s,enrichedsuccess:await TextEditor.enrichHTML(this.item.system.success,{secrets:this.item.isOwner,async:!0}),enrichedpartsuccess:await TextEditor.enrichHTML(this.item.system.partsuccess,{secrets:this.item.isOwner,async:!0})}),t}static get defaultOptions(){let e=super.defaultOptions;return ce(e,{dragDrop:[{dragSelector:".item-list .item",dropSelector:".content"}]}),e}_getHeaderButtons(){let e=super._getHeaderButtons();return this.item.isOwned||e.unshift({class:"postAsGroupCheck",tooltip:"SHEET.postAsGroupCheck",icon:"fas fa-dice-d20",onclick:u(async()=>this.postAsGroupCheck(),"onclick")}),e}async postAsGroupCheck(){let e=["value","value2","value3"].filter(a=>this.item.system.talent[a]).map(a=>({type:"skill",modifier:this.item.system.baseModifier,calculatedModifier:this.item.system.baseModifier,target:this.item.system.talent[a]}));if(!e.length)return;let t={modifier:this.item.system.baseModifier,maxRolls:this.item.system.allowedTestCount.value,enrichedsuccess:await TextEditor.enrichHTML(this.item.system.success,{secrets:this.item.isOwner,async:!0}),enrichedpartsuccess:await TextEditor.enrichHTML(this.item.system.partsuccess,{secrets:this.item.isOwner,async:!0}),rollOptions:e};ie.showGCMessage(e[0].target,0,t)}activateListeners(e){super.activateListeners(e),e.find(".buildItem").click(async()=>this.postFinishedItem())}async postFinishedItem(){if(!this.item.actor)return;let e=this.item.getFlag("dsa5","embeddedItem");if(!e)return;let t=await renderTemplate("systems/dsa5/templates/chat/production-result.html",{actor:this.item.actor,item:e,actorImg:ee.videoOrImgTag(this.item.actor.img)}),a=g.chatDataSetup(t);a.flags={dsa5:{embeddedItem:e}},await ChatMessage.create(a)}_canDragDrop(e){return this.isEditable}async _onDrop(e){let t=JSON.parse(e.dataTransfer.getData("text/plain"));await this.dropCreation(t)}async dropCreation(e){let{item:t,typeClass:a,selfTarget:s}=await Ee(e,void 0,!1);b.equipmentCategories.has(a)&&this.item.setFlag("dsa5","embeddedItem",t.toObject())}},st=class extends Y{static{u(this,"Enchantable")}async _onDrop(e){await this.enchant(e),this.isPoisonable&&await this.poison(e)}async enchant(e){let t=JSON.parse(e.dataTransfer.getData("text/plain"));await this._enchant([t])}async _enchant(e){let t=this.item.getFlag("dsa5","enchantments")||[];if(t.length+e.length>7)return ui.notifications.error("DSAError.tooManyEnchants",{localize:!0});for(let a of e){let{item:s,typeClass:i,selfTarget:n}=await Ee(a,void 0,!1);if(["spell","liturgy","ceremony","ritual"].includes(i)){if(!s.pack)return ui.notifications.error("DSAError.onlyCompendiumSpells",{localize:!0});let r={name:s.name,pack:s.pack,id:t.length,itemId:s.id,permanent:["liturgy","ceremony"].includes(i)||a.permanent,actorId:a.actorId,charged:!0,talisman:["liturgy","ceremony"].includes(i),fw:["liturgy","ceremony"].includes(i)?18:a.fw||0};t.push(r)}}if(t.length){let a={flags:{dsa5:{enchantments:t}}};await this.item.update(a)}}async poison(e){let t=JSON.parse(e.dataTransfer.getData("text/plain")),{item:a,typeClass:s,selfTarget:i}=await Ee(t,void 0,!1);if(s=="poison"){let r={flags:{dsa5:{poison:{name:a.name,pack:a.pack,itemId:a._id,permanent:!1,actorId:t.actorId}}}};await this.item.update(r)}}toggleChargedState(e,t){for(let a of t)if(a.id==e){a.charged=a.talisman&&a.permanent?!0:!a.charged;break}this.item.update({flags:{dsa5:{enchantments:t}}})}async rollEnchantment(e,t){let a=t.find(i=>i.id==e);if(!a.charged)return ui.notifications.error("DSAError.NotEnoughCharges",{localize:!0});let s=await this.getSpell(a);if(s){s=s.toObject(),s.system.talentValue.value=a.fw;let i=await g.emptyActor(14,this.item.name);i.setupSpell(s,{},"emptyActor").then(async n=>{let r=game.i18n.format("CHATNOTIFICATION.enchantmentUsed",{item:this.item.name,spell:s.name});await ChatMessage.create(g.chatDataSetup(r)),await i.basicTest(n),a.permanent?this.toggleChargedState(e,t):this.deleteEnchantment(e,t)})}}activateListeners(e){super.activateListeners(e),e.find(".ench-toggle-permanent").click(t=>{let{id:a,enchantments:s}=this.enchantMentId(t);for(let i of s)if(i.id==a){i.permanent=!i.permanent;break}this.item.update({flags:{dsa5:{enchantments:s}}})}),e.find(".ench-toggle-charge").click(t=>{let{id:a,enchantments:s}=this.enchantMentId(t);this.toggleChargedState(a,s)}),e.find(".ench-roll").click(async t=>{let{id:a,enchantments:s}=this.enchantMentId(t);this.rollEnchantment(a,s)}),e.find(".ench-fw").change(t=>{let{id:a,enchantments:s}=this.enchantMentId(t),i=Number($(t.currentTarget).val());if(i){for(let n of s)if(n.id==a){n.fw=i;break}this.item.update({flags:{dsa5:{enchantments:s}}})}}),e.find(".ench-delete").click(t=>{let{id:a,enchantments:s}=this.enchantMentId(t);this.deleteEnchantment(a,s)}),e.find(".ench-show").click(async t=>{let{id:a,enchantments:s}=this.enchantMentId(t),i=s.find(r=>r.id==a),n=await this.getSpell(i);n&&n.sheet.render(!0)}),e.find(".poison-toggle-permanent").click(t=>{this.item.update({flags:{dsa5:{poison:{permanent:!this.item.flags.dsa5.poison.permanent}}}})}),e.find(".poison-delete").click(t=>{this.deletePoison()}),e.find(".poison-show").click(async()=>{let t;this.item.actor&&(t=this.item.actor.items.find(a=>a.type=="poison"&&a.name==this.item.flags.dsa5.poison.name)),t||(t=await this.getSpell(this.item.flags.dsa5.poison)),t&&t.sheet.render(!0)})}deletePoison(){this.item.update({"flags.dsa5.-=poison":null})}deleteEnchantment(e,t){let a=t.findIndex(s=>s.id==e);t.splice(a,1),this.item.update({flags:{dsa5:{enchantments:t}}})}async getSpell(e){let t=await game.packs.get(e.pack),a;if(t&&(a=await t.getDocument(e.itemId),!a)){let s=await t.index.getName(e.name);s&&(a=await t.getDocument(s._id))}if(!a){let s=game.dsa5.itemLibrary;s.equipmentBuild||await s.buildEquipmentIndex(),s.findCompendiumItem;let i=e.talisman?["liturgy","ceremony"]:["spell","ritual"];for(let n of i)if(a=await game.dsa5.itemLibrary.findCompendiumItem(e.name,n),a=a.find(r=>r.name==e.name&&r.type==n&&r.system),a)break}return a||ui.notifications.error("DSAError.enchantmentNotFound",{localize:!0}),a}enchantMentId(e){return{id:$(e.currentTarget).parents(".statusEffect").attr("data-id"),enchantments:this.item.getFlag("dsa5","enchantments")}}prepareDomains(){let e=be(this.item.system,"effect.attributes");if(e){let t=new RegExp(game.i18n.localize("WEAPON.magical"),"i"),a=new RegExp(game.i18n.localize("WEAPON.clerical"),"i");e=e.split(",").map(s=>{let i="";return t.test(s)?i="magical":a.test(s)&&(i="blessed"),`
  • ${s}
  • `}).join("")}return e}static get defaultOptions(){let e=super.defaultOptions;return ce(e,{dragDrop:[{dragSelector:".item-list .item",dropSelector:".content"}]}),e}_canDragDrop(e){return this.isEditable}async getData(e){let t=await super.getData(e);t.enchantments=this.item.getFlag("dsa5","enchantments");let a=[];t.poison=this.item.getFlag("dsa5","poison"),t.poison&&a.push("TYPES.Item.poison"),t.enchantments&&t.enchantments.some(i=>!i.talisman)&&a.push("enchantment"),t.enchantments&&t.enchantments.some(i=>i.talisman)&&a.push("talisman"),t.enchantmentLabel=a.map(i=>game.i18n.localize(i)).join("/");let s={};for(let i of Object.keys(b.traditionArtifacts))s[i]=game.i18n.localize(`traditionArtifacts.${i}`);return t.traditionArtifacts=s,t.hasEnchantments=t.poison||t.enchantments&&t.enchantments.length>0,t}},ai=class extends Y{static{u(this,"InformationSheet")}async getData(e){let t=await super.getData(e);return ce(t,{allSkills:await g.allSkillsList(),enrichedqs1:await TextEditor.enrichHTML(this.item.system.qs1,{async:!0}),enrichedqs2:await TextEditor.enrichHTML(this.item.system.qs2,{async:!0}),enrichedqs3:await TextEditor.enrichHTML(this.item.system.qs3,{async:!0}),enrichedqs4:await TextEditor.enrichHTML(this.item.system.qs4,{async:!0}),enrichedqs5:await TextEditor.enrichHTML(this.item.system.qs5,{async:!0}),enrichedqs6:await TextEditor.enrichHTML(this.item.system.qs6,{async:!0}),enrichedCrit:await TextEditor.enrichHTML(this.item.system.crit,{async:!0}),enrichedBotch:await TextEditor.enrichHTML(this.item.system.botch,{async:!0}),enrichedFail:await TextEditor.enrichHTML(this.item.system.fail,{async:!0})}),t}},si=class extends st{static{u(this,"AmmunitionSheet")}constructor(e,t){super(e,t),this.isPoisonable=!0}async getData(e){let t=await super.getData(e);return t.ammunitiongroups=b.ammunitiongroups,t.domains=this.prepareDomains(),t}},ii=class extends je(st){static{u(this,"EquipmentSheet")}async getData(e){let t=await super.getData(e);if(ce(t,{equipmentTypes:b.equipmentTypes,domains:this.prepareDomains(),canOnUseEffect:game.user.isGM||game.settings.get("dsa5","playerCanEditSpellMacro")}),this.isBagWithContents()){let a=0;ce(t,{containerContent:this.item.actor.items.filter(s=>b.equipmentCategories.has(s.type)&&s.system.parent_id==this.item.id).map(s=>{s.system.preparedWeight=parseFloat((s.system.weight.value*s.system.quantity.value).toFixed(3)),a+=Number(s.system.preparedWeight);let i=be(s,"flags.dsa5.enchantments");return i&&i.length>0?s.enchantClass="rar":(s.system.effect&&s.system.effect.value!=""||s.effects.length>0)&&(s.enchantClass="common"),s}),weightSum:parseFloat(a.toFixed(3)),weightWidth:`style="width: ${Math.min(this.item.system.capacity?a/this.item.system.capacity*100:0,100)}%"`,weightExceeded:a>Number(this.item.system.capacity)?"exceeded":""})}return t}async breakOverflow(e,t){let a=$(await renderTemplate("systems/dsa5/templates/items/baghover.html",e)),s=t.offset().top+52,i=t.offset().left-75;return a.appendTo($("body")),a.css({position:"absolute",left:i+"px",top:s+"px",bottom:"auto",right:"auto","z-index":1e4}),a}activateListeners(e){super.activateListeners(e);let t=e.find(".slot");t.mouseenter(async a=>{let s=$(a.currentTarget),i=await this.breakOverflow({name:s.attr("data-name"),weight:s.attr("data-weight"),quantity:s.attr("data-quantity")},s);i.fadeIn(),s.mouseleave(()=>{i.remove(),s.off("mouseleave")})}),t.mousedown(async a=>{let s=a.currentTarget.dataset.itemId,i=this.actor.items.get(s);a.button==0?i.sheet.render(!0):a.button==2&&($(".itemInfo").remove(),await i.update({"system.parent_id":0}),this.render(!0))})}isBagWithContents(){return this.item.actor&&be(this.item,"system.equipmentType.value")=="bags"}async _onDrop(e){if(this.isBagWithContents()){let t=JSON.parse(e.dataTransfer.getData("text/plain")),{item:a,typeClass:s,selfTarget:i}=await Ee(t,void 0),n=this.item.id==a.id,r=this.item.parent.id==t.actorId;if(b.equipmentCategories.has(s)&&!n){a.system.parent_id=this.item.id,a.system.worn&&a.system.worn.value&&(a.system.worn.value=!1),r?await this.item.actor.updateEmbeddedDocuments("Item",[a]):await this.item.actor.sheet._addLoot(a),this.render(!0);return}}await super._onDrop(e)}},ni=class extends je(st){static{u(this,"ArmorSheet")}async getData(e){let t=await super.getData(e);return ce(t,{domains:this.prepareDomains(),armorSubcategories:Object.keys(b.armorSubcategories).reduce((a,s)=>(a[s]=game.i18n.localize(`ARMORSUBCATEGORIES.${s}`),a),{}),breakPointRating:b.armorSubcategories[this.item.system.subcategory]}),t.canOnUseEffect=game.user.isGM||game.settings.get("dsa5","playerCanEditSpellMacro"),t}_getHeaderButtons(){let e=super._getHeaderButtons();return this.item.isOwned&&game.settings.get("dsa5","armorAndWeaponDamage")&&this.item.system.structure.max>0&&e.unshift({class:"rollDamaged",tooltip:"DSASETTINGS.armorAndWeaponDamage",icon:"fas fa-dice-d20",onclick:u(async()=>W.breakingTest(this.item),"onclick")}),e}},ri=class extends je(Y){static{u(this,"PlantSheet")}async getData(e){let t=await super.getData(e);return t.attributes=Object.keys(t.system.planttype).map(a=>({name:a,checked:t.system.planttype[a]})),t.enrichedEffect=await TextEditor.enrichHTML(be(this.item.system,"effect"),{secrets:this.object.isOwner,async:!0}),t.enrichedRecipes=await TextEditor.enrichHTML(be(this.item.system,"recipes"),{secrets:this.object.isOwner,async:!0}),t.enrichedInformation=await TextEditor.enrichHTML(be(this.item.system,"infos"),{secrets:this.object.isOwner,async:!0}),t}},oi=class extends Y{static{u(this,"PatronSheet")}async getData(e){let t=await super.getData(e);return t.patronCategories=[0,1,2,3].map(a=>({name:game.i18n.localize(`PATRON.${a}`),val:a})),t.priorities={0:game.i18n.localize("PATRON.primary"),1:game.i18n.localize("PATRON.secondary")},t}},li=class extends Y{static{u(this,"MagicalSignSheet")}async getData(e){let t=await super.getData(e);return t.categories={1:game.i18n.localize("TYPES.Item.magicalsign"),2:game.i18n.localize("additionalsign")},t.canOnUseEffect=game.user.isGM||game.settings.get("dsa5","playerCanEditSpellMacro"),t}_getHeaderButtons(){let e=super._getHeaderButtons();return this.item.isOwned&&e.unshift({class:"rolleffect",tooltip:"SHEET.RollEffect",icon:"fas fa-dice-d20",onclick:u(async t=>this.setupEffect(t),"onclick")}),e}async setupEffect(e){let t=Number(this.item.system.asp)||0;if(this.item.actor.system.status.astralenergy.valuer.type=="skill"&&r.name==game.i18n.localize("LocalizedIDs.artisticAbility")),n=`

    ${this.item.name}

    ${this.item.system.description.value}

    ${s.chatData(this.item.system,"").join("
    ")}

    `;a.setupSkill(i,{other:[n],subtitle:` (${game.i18n.localize("TYPES.Item.magicalsign")})`},void 0).then(async r=>{let l=await a.basicTest(r,{suppressMessage:!0});l.result.preData.calculatedSpellModifiers={finalcost:t,costsMana:!0},await R.renderRollCard(l.cardOptions,l.result,l.options.rerenderMessage)})}},ci=class extends je(st){static{u(this,"ItemBookDSA5")}async getData(e){let t=await super.getData(e);return ce(t,{formats:b.bookFormats,qualities:b.bookQualities,exemplarTypes:b.exemplarTypes,legalities:b.legalities}),t}},ha=class extends je(st){static{u(this,"WeaponSheetDSA5")}activateListeners(e){super.activateListeners(e),e.find(".attack-add").on("click",()=>this.addAttackSheet()),e.find(".attack-delete").on("click",t=>this.deleteAttack(t))}async getData(e){let t=await super.getData(e);return t.alternateAttacks=be(this.item,"flags.dsa5.alternateAttacks"),t.hasAlternateAttacks=t.alternateAttacks&&Object.keys(t.alternateAttacks).length>0,t}async deleteAttack(e){let t=e.currentTarget.dataset.key;await this.item.update({[`flags.dsa5.alternateAttacks.-=${t}`]:null})}_onChangeTab(e,t,a){super._onChangeTab(e,t,a),a=="details"&&$(this.element).find('[data-tab-container="secondary"]').length&&this.activateTab("baseAttack",{group:"secondary"})}async addAttackSheet(){let e=foundry.utils.randomID();await this.item.update({flags:{dsa5:{alternateAttacks:{[e]:{name:game.i18n.localize("CHAR.ATTACK")}}}}})}},di=class extends ha{static{u(this,"RangeweaponSheet")}get isPoisonable(){return game.i18n.localize(`LocalizedCTs.${this.item.system.combatskill.value}`)=="Throwing Weapons"}_getHeaderButtons(){let e=super._getHeaderButtons();return this.item.isOwned&&game.settings.get("dsa5","armorAndWeaponDamage")&&this.item.system.structure.max>0&&e.unshift({class:"rollDamaged",icon:"fas fa-dice-d20",onclick:u(async()=>W.breakingTest(this.item),"onclick")}),e}async getData(e){let t=await super.getData(e);return ce(t,{canOnUseEffect:game.user.isGM||game.settings.get("dsa5","playerCanEditSpellMacro"),ammunitiongroups:b.ammunitiongroups,combatskills:await g.allCombatSkillsList("range"),domains:this.prepareDomains(),breakPointRating:b.weaponStabilities[game.i18n.localize(`LocalizedCTs.${this.item.system.combatskill.value}`)]}),t}},mi=class extends Y{static{u(this,"BlessingSheetDSA5")}_getHeaderButtons(){let e=super._getHeaderButtons();return this.item.isOwned&&e.unshift({class:"rolleffect",icon:"fas fa-dice-d20",tooltip:"SHEET.RollEffect",onclick:u(async t=>this.setupEffect(t),"onclick")}),e}async getData(e){let t=await super.getData(e);return t.canOnUseEffect=game.user.isGM||game.settings.get("dsa5","playerCanEditSpellMacro"),t}async setupEffect(e){if(this.item.actor.system.status.karmaenergy.value<1)return ui.notifications.error("DSAError.NotEnoughKaP",{localize:!0});let t=game.dsa5.config.ItemSubclasses.magictrick;await this.item.actor.update({"system.status.karmaenergy.value":this.item.actor.system.status.karmaenergy.value-=1});let a=`

    ${this.item.name} - ${game.i18n.localize("blessing")} ${game.i18n.localize("probe")}

    ${this.item.system.description.value}

    ${t.chatData(this.item.system,"").join("
    ")}

    `;await ChatMessage.create(g.chatDataSetup(a))}},pi=class extends Y{static{u(this,"ItemCareerDSA5")}static get defaultOptions(){let e=super.defaultOptions;return ce(e,{width:700,height:700}),e}async getData(e){let t=await super.getData(e),a=Di(b.characteristics);return a["-"]="-",t.mageLevels=b.mageLevels,t.guidevalues=a,t.enrichedClothing=await TextEditor.enrichHTML(be(this.item.system,"clothing.value"),{secrets:this.object.isOwner,async:!0}),t}},fi=class extends je(Y){static{u(this,"ConsumableSheetDSA5")}static get defaultOptions(){let e=super.defaultOptions;return ce(e,{width:480}),e}_getHeaderButtons(){let e=super._getHeaderButtons();return this.item.isOwned&&e.unshift({class:"consumeItem",icon:"fas fa-dice-d20",tooltip:"SHEET.ConsumeItem",onclick:u(async t=>this.setupEffect(t),"onclick")}),e}async getData(e){let t=await super.getData(e);t.calculatedPrice=D.getSubClass(this.item.type).consumablePrice(this.item),t.availableSteps=t.system.QLList.split(` `).map((a,s)=>s+1).reduce((a,s)=>(a[s]=s,a),{}),t.equipmentTypes=b.equipmentTypes,t.targetTypes={};for(let[a,s]of Object.entries(b.areaTargetTypes))t.targetTypes[a]=game.i18n.localize(`areaTargetTypes.${s}`);return t.enrichedIngredients=await TextEditor.enrichHTML(be(this.item.system,"ingredients"),{secrets:this.object.isOwner,async:!0}),t}setupEffect(e){this.item.setupEffect()}},gi=class extends Y{static{u(this,"ItemCultureDSA5")}static get defaultOptions(){let e=super.defaultOptions;return ce(e,{width:700,height:700}),e}async getData(e){let t=await super.getData(e);return t.enrichedClothing=await TextEditor.enrichHTML(be(this.item.system,"clothing.value"),{secrets:this.object.isOwner,async:!0}),t}},hi=class extends Y{static{u(this,"DiseaseSheetDSA5")}_getHeaderButtons(){let e=super._getHeaderButtons();return e.unshift({class:"rolleffect",icon:"fas fa-dice-d20",tooltip:"SHEET.RollEffect",onclick:u(async t=>this.setupEffect(t),"onclick")}),e}async getData(e){let t=await super.getData(e);return t.resistances=b.magicResistanceModifiers,t}},yi=class extends Y{static{u(this,"MagictrickSheetDSA5")}_getHeaderButtons(){let e=super._getHeaderButtons();return this.item.isOwned&&e.unshift({class:"rolleffect",icon:"fas fa-dice-d20",tooltip:"SHEET.RollEffect",onclick:u(async t=>this.setupEffect(t),"onclick")}),e}async getData(e){let t=await super.getData(e);return t.canOnUseEffect=game.user.isGM||game.settings.get("dsa5","playerCanEditSpellMacro"),t}async setupEffect(e){if(this.item.actor.system.status.astralenergy.value<1)return ui.notifications.error("DSAError.NotEnoughAsP",{localize:!0});let t=game.dsa5.config.ItemSubclasses.magictrick;await this.item.actor.update({"system.status.astralenergy.value":this.item.actor.system.status.astralenergy.value-=1});let a=`

    ${this.item.name} - ${game.i18n.localize("magictrick")} ${game.i18n.localize("probe")}

    ${this.item.system.description.value}

    ${t.chatData(this.item.system,"").join("
    ")}

    `;await ChatMessage.create(g.chatDataSetup(a))}},bi=class extends ha{static{u(this,"MeleeweaponSheetDSA5")}constructor(e,t){super(e,t),this.isPoisonable=!0}getGripInfo(){let e=N.regex2h.test(this.item.name),t="";if(!e)t="wrongGrip.yieldTwo";else switch(game.i18n.localize(`LocalizedCTs.${this.item.system.combatskill.value}`)){case"Two-Handed Impact Weapons":case"Two-Handed Swords":new RegExp(game.i18n.localize("wrongGrip.wrongGripBastardRegex")).test(this.item.name)?t="wrongGrip.yieldOneBastard":t="wrongGrip.yieldOneSwordBlunt";break;default:t="wrongGrip.yieldOnePolearms"}return{twoHanded:e,wrongGripHint:t,wrongGripLabel:e?"wrongGrip.oneHanded":"wrongGrip.twoHanded"}}async getData(e){let t=await super.getData(e),a=ce(Di(b.characteristics),{"ge/kk":game.i18n.localize("CHAR.GEKK"),"-":"-"});if(ce(t,{...this.getGripInfo(),characteristics:a,combatskills:await g.allCombatSkillsList("melee"),ranges:b.meleeRanges,shieldSizes:b.shieldSizes,isShield:N.isShield(this.item),domains:this.prepareDomains(),breakPointRating:b.weaponStabilities[game.i18n.localize(`LocalizedCTs.${this.item.system.combatskill.value}`)]}),this.item.actor){let s=this.item.actor.items.find(i=>i.type=="combatskill"&&i.name==this.item.system.combatskill.value);t.canBeOffHand=s&&!s.system.weapontype.twoHanded&&this.item.system.worn.value,t.canBeWrongGrip=!["Daggers","Fencing Weapons"].includes(game.i18n.localize(`LocalizedCTs.${this.item.system.combatskill.value}`))}return t.canOnUseEffect=game.user.isGM||game.settings.get("dsa5","playerCanEditSpellMacro"),t}_getHeaderButtons(){let e=super._getHeaderButtons();return this.item.isOwned&&game.settings.get("dsa5","armorAndWeaponDamage")&&this.item.system.structure.max>0&&e.unshift({class:"rollDamaged",icon:"fas fa-dice-d20",onclick:u(async()=>W.breakingTest(this.item),"onclick")}),e}},ki=class extends je(Y){static{u(this,"PoisonSheetDSA5")}_getHeaderButtons(){let e=super._getHeaderButtons();return e.unshift({class:"rolleffect",icon:"fas fa-dice-d20",tooltip:"SHEET.RollEffect",onclick:u(async t=>this.setupEffect(t),"onclick")}),e}async getData(e){let t=await super.getData(e);return t.resistances=b.magicResistanceModifiers,t.poisonCategories=b.poisonSubTypes,t}},wi=class extends Y{static{u(this,"SpecialAbilitySheetDSA5")}async _refundStep(){let e=this.item.system.step.value;if(e>1){let t=await F.stepXPCost(this.item,e-1);return t=await F.refundFreelanguage(this.item,this.item.actor,t,!1),await this.item.actor._updateAPs(t*-1,{},{render:!1}),await this.item.update({"system.step.value":e-1}),await _.track(this.item.actor,{type:"item",item:this.item,previous:e,next:e-1},t),!0}}async _advanceStep(){let e=this.item.system.step.value;if(e0}async getData(e){let t=await super.getData(e),a={};for(let n of Object.keys(b.traditionArtifacts))a[n]=game.i18n.localize(`traditionArtifacts.${n}`);let s={general:{},clerical:{},magical:{}},i="general";for(let[n,r]of Object.entries(b.specialAbilityCategories))n=="clerical"?i="clerical":n=="magical"&&(i="magical"),s[i][n]=game.i18n.localize(r);return ce(t,{categories:s,subCategories:b.combatSkillSubCategories,traditionArtifacts:a,canOnUseEffect:game.user.isGM||game.settings.get("dsa5","playerCanEditSpellMacro")}),t}},vi=class extends Y{static{u(this,"ItemSpeciesDSA5")}static get defaultOptions(){let e=super.defaultOptions;return ce(e,{width:530,height:570}),e}async getData(e){let t=await super.getData(e);return ce(t,{hasLocalization:game.i18n.has(`Racedescr.${this.item.name}`)}),t}},Ti=class extends Y{static{u(this,"TrapSheetDSA5")}async getData(e){return await super.getData(e)}},Si=class extends Y{static{u(this,"SpellSheetDSA5")}async getData(e){let t=await super.getData(e);t.characteristics=b.characteristics,t.StFs=b.StFs,t.resistances=b.magicResistanceModifiers,t.targetTypes={};for(let[a,s]of Object.entries(b.areaTargetTypes))t.targetTypes[a]=game.i18n.localize(`areaTargetTypes.${s}`);return t.isOwned&&(t.extensions=this.item.actor.items.filter(a=>a.type=="spellextension"&&a.system.source==this.item.name&&this.item.type==a.system.category)),t}activateListeners(e){super.activateListeners(e),e.find(".item-edit").click(t=>{t.preventDefault();let a=this._getItemId(t);this.item.actor.items.get(a).sheet.render(!0)}),e.find(".item-delete").click(t=>{this._deleteItem(t)})}async _deleteItem(e){let t=this._getItemId(e),a=this.actor.items.find(r=>r.id==t),s=game.i18n.format("DIALOG.DeleteItemDetail",{item:a.name}),i=await renderTemplate("systems/dsa5/templates/dialog/delete-item-dialog.html",{message:s});await foundry.applications.api.DialogV2.confirm({window:{title:"DIALOG.deleteConfirmation"},content:i,rejectClose:!1,modal:!0})&&(this._cleverDeleteItem(t),$(e.currentTarget).closest(".item").remove())}async _cleverDeleteItem(e){let t=this.item.actor.items.find(a=>a.id==e);await this.item.actor._updateAPs(-1*t.system.APValue.value,{},{render:!1}),await this.item.actor.deleteEmbeddedDocuments("Item",[e]),await _.track(this.actor,{type:"item",item:t,state:-1},apCost)}},Ai=class extends Y{static{u(this,"SpellExtensionSheetDSA5")}async getData(e){let t=await super.getData(e);return ce(t,{categories:{spell:"spell",liturgy:"liturgy",ritual:"ritual",ceremony:"ceremony"}}),t}},Ci=class extends Y{static{u(this,"VantageSheetDSA5")}_advancable(){return this.item.system.max.value>0}async getData(e){let t=await super.getData(e);return t.canOnUseEffect=game.user.isGM||game.settings.get("dsa5","playerCanEditSpellMacro"),t}async _refundStep(){let e=this.item.system.step.value;if(e>1){let t=await P.stepXPCost(this.item,e-1);return t=await P.reduceSingularVantages(this.item.actor,this.item,t),await this.item.actor._updateAPs(t*-1,{},{render:!1}),await this.item.update({"system.step.value":e-1}),await _.track(this.item.actor,{type:"item",item:this.item,previous:e,next:e-1},t),!0}}async _advanceStep(){let e=this.item.system.step.value;if(e{let a=t.split(":"),s=a.length>1;return a.map((i,n)=>n==0&&s?`${i}`:``+i.split(",").map(r=>`${r}`).join(", ")+"").join(":")}).join("
    ")}u(io,"clickableAbilities");function _n(o,e,t,a){if(a)return e.map(s=>`${s.name}${Fn(ya(s.system,t),ya(s.system,a))}`).join(", ");if(t){let s=[];for(let i of e){let n=ya(i.system,t);if(n){s.push(`${i.name} ${n}`);continue}}return s.join(", ")}else return e.map(s=>`${s.name}`).join(", ")}u(_n,"clickableActorItems");function no(o,e,t,a){let s=[];for(let i of Object.values(e)){if(i.length==0)continue;let n=_n(o,i,t,a);n&&s.push(n)}return s.join(", ")}u(no,"clickableSection");function Fn(o,e){return e!=null&&Number(e)<2?"":[" I"," II"," III"," IV"," V"," VI"," VII"," VIII"," IX"," X"][o-1]}u(Fn,"roman");function Mi(){Handlebars.registerHelper({concatUp:u((o,e)=>o+e.toUpperCase(),"concatUp"),mod:u((o,e)=>o%e,"mod"),roman:u((o,e)=>Fn(o,e),"roman"),isWEBM:u(o=>/.webm$/.test(o),"isWEBM"),itemCategory:u(o=>g.categoryLocalization(o),"itemCategory"),joinStr:u((o,e)=>e.join(o),"joinStr"),attrName:u(o=>g.attributeLocalization(o),"attrName"),attrAbbr:u(o=>g.attributeAbbrLocalization(o),"attrAbbr"),diceThingsUp:u((o,e)=>g.replaceDies(o,!1),"diceThingsUp"),clickableAbilities:u((o,e)=>io(o,e),"clickableAbilities"),traitName:u(o=>game.i18n.localize(b.traitCategories[o]),"traitName"),consumableQL:u(o=>o.system.QLList.split(` `)[Number(o.system.QL)-1],"consumableQL"),clickableActorItems:u((o,e,t,a)=>_n(o,e,t,a),"clickableActorItems"),clickableSection:u((o,e,t,a)=>no(o,e,t,a),"clickableSection"),hasLocalization:u((o,e)=>{let t=o.string||o;return game.i18n.has(t)?game.i18n.localize(t):e||""},"hasLocalization"),successEffect:u((o,e)=>{let t=ya(o,"flags.dsa5.successEffect");if(t==1)return` (${game.i18n.localize("ActiveEffects.onSuccess")})`;if(t==2)return` (${game.i18n.localize("ActiveEffects.onFailure")})`;let a=o.system.equipmentAdvantage;return a?` (${game.i18n.localize(`AdvantageRuleItems.${e?.type}.${a}`)})`:""},"successEffect"),replaceConditions:g.replaceConditions,floor:u(o=>Math.floor(Number(o)),"floor"),sum:u((o,e)=>o+e,"sum"),br:u(o=>o.replace(/\n/g,"
    "),"br"),getAttr:u((o,e,t)=>o.system.characteristics[e][t],"getAttr"),hasElem:u((o,e)=>o.some(t=>e==t),"hasElem"),situationalTooltip:u(o=>{let e=game.i18n.localize(so[o.type]||"Modifier"),t=`${o.name}
    ${e}: ${o.value}`;return o.source&&(t+=`
    ${game.i18n.localize("source")}: ${o.source}`),t},"situationalTooltip"),grouped_each:u((o,e,t)=>{let a="",s=[],i;if(e&&e.length>0){for(i=0;i0&&i%o===0&&(a+=t.fn(s),s=[]),s.push(e[i]);a+=t.fn(s)}return a},"grouped_each"),plantify:u(o=>game.i18n.localize(`PLANT.avLevels.${o||0}`),"plantify"),oddLength:u(o=>o.length%2==1,"oddLength"),selfObj:u(o=>o.reduce((e,t)=>(e[t]=t,e),{}),"selfObj")})}u(Mi,"default");var{mergeObject:oo}=foundry.utils;function Ei(){Hooks.once("init",()=>{game.dsa5.apps.DiceSoNiceCustomization=new ba}),Hooks.once("diceSoNiceReady",(o,e,t,a)=>{o.addColorset({name:"mu",description:"DSA5.mu",category:"DSA5.dies",foreground:"#FFFFFF",background:"#b3241a",edge:"#b3241a",outline:"#FFFFFF",texture:"none"}),o.addColorset({name:"kl",description:"DSA5.kl",category:"DSA5.dies",foreground:"#FFFFFF",background:"#8259a3",edge:"#8259a3",outline:"#FFFFFF",texture:"none"}),o.addColorset({name:"in",description:"DSA5.in",category:"DSA5.dies",foreground:"#FFFFFF",background:"#388834",edge:"#388834",outline:"#FFFFFF",texture:"none"}),o.addColorset({name:"ch",description:"DSA5.ch",category:"DSA5.dies",foreground:"#FFFFFF",background:"#0d0d0d",edge:"#0d0d0d",outline:"#FFFFFF",texture:"none"}),o.addColorset({name:"ff",description:"DSA5.ff",category:"DSA5.dies",foreground:"#000000",background:"#d5b467",edge:"#d5b467",outline:"#FFFFFF",texture:"none"}),o.addColorset({name:"ge",description:"DSA5.ge",category:"DSA5.dies",foreground:"#000000",background:"#688ec4",edge:"#688ec4",outline:"#FFFFFF",texture:"none"}),o.addColorset({name:"ko",description:"DSA5.ko",category:"DSA5.dies",foreground:"#000000",background:"#a3a3a3",edge:"#a3a3a3",outline:"#FFFFFF",texture:"none"}),o.addColorset({name:"kk",description:"DSA5.kk",category:"DSA5.dies",foreground:"#000000",background:"#d6a878",edge:"#d6a878",outline:"#FFFFFF",texture:"none"}),o.addColorset({name:"attack",description:"DSA5.attack",category:"DSA5.dies",foreground:"#FFFFFF",background:"#b3241a",edge:"#b3241a",outline:"#b3241a",texture:"none"}),o.addColorset({name:"dodge",description:"DSA5.dodge",category:"DSA5.dies",foreground:"#FFFFFF",background:"#388834",edge:"#388834",outline:"#FFFFFF",texture:"none"}),o.addColorset({name:"parry",description:"DSA5.parry",category:"DSA5.dies",foreground:"#FFFFFF",background:"#388834",edge:"#388834",outline:"#FFFFFF",texture:"none"}),game.dsa5.apps.DiceSoNiceCustomization.initConfigs(),ba.onConnect()})}u(Ei,"default");var ba=class o extends Application{static{u(this,"DiceSoNiceCustomization")}static unloadedModels=[];static retries=0;static retrying=!1;static attrs=["mu","kl","in","ch","ff","ge","ko","kk","attack","dodge","parry","damage"];initConfigs(){let e={damage:"black"};game.settings.registerMenu("dsa5","dicesonicesettings",{name:"DiceSoNiceSettings",label:"DiceSoNice Settings",hint:game.i18n.localize("DSASETTINGS.dicesonicesettings"),type:Ii,restricted:!1});for(let t of o.attrs)game.settings.register("dsa5",`dice3d_${t}`,{name:`CHAR.${t.toUpperCase()}`,scope:"client",config:!1,default:e[t]||t,type:String}),game.settings.register("dsa5",`dice3d_system_${t}`,{name:`CHAR.${t.toUpperCase()}`,scope:"client",config:!1,default:"standard",type:String})}getAttributeConfiguration(e){return g.moduleEnabled("dice-so-nice")&&game.dice3d?{colorset:game.settings.get("dsa5",`dice3d_${e}`),appearance:{colorset:game.settings.get("dsa5",`dice3d_${e}`),system:game.settings.get("dsa5",`dice3d_system_${e}`)}}:{colorset:e}}activateListeners(e){super.activateListeners(),e.find('[name="entryselection"]').change(async t=>{await game.settings.set("dsa5",`dice3d_${t.currentTarget.dataset.attr}`,t.currentTarget.value)}),e.find('[name="systemselection"]').change(async t=>{await game.settings.set("dsa5",`dice3d_system_${t.currentTarget.dataset.attr}`,t.currentTarget.value),o.preloadDiceAssets([t.currentTarget.value]),game.socket.emit("system.dsa5",{type:"preloadDice3d",payload:{toPreload:[t.currentTarget.value]}})})}static onConnect(){game.socket.on("system.dsa5",e=>{switch(e.type){case"preloadDice3d":console.warn("Preloading forced DSA dice assets"),o.preloadDiceAssets(e.payload);break;case"getPreloadDice3d":o.requestDicePreloads();break}}),this.collectPreloads(),game.socket.emit("system.dsa5",{type:"getPreloadDice3d"})}static collectPreloads(e=!0){let t=new Set;for(let a of o.attrs)t.add(game.settings.get("dsa5",`dice3d_system_${a}`));t=Array.from(t),e&&this.preloadDiceAssets(t),game.socket.emit("system.dsa5",{type:"preloadDice3d",payload:t})}static requestDicePreloads(){this.collectPreloads(!1)}static async preloadDiceAssets(e,t=[]){console.warn("loading",e);for(let a of e){let s=game.dice3d.DiceFactory.systems[a];if(!s){this.unloadedModels.push(a);continue}let i=s.dice.filter(n=>t.length==0||t.includes(n.type));for(let n of i)try{n.modelFile?await n.loadModel(game.dice3d.DiceFactory.loaderGLTF):await n.loadTextures()}catch{console.warn("Unable to load dice model",a,n)}}this.unloadedModels.length&&this.retries<6&&!this.retrying&&(this.retrying=!0,setTimeout(()=>{this.retries+=1;let a=new Set(this.unloadedModels);this.unloadedModels=[],this.retrying=!1,this.preloadDiceAssets(a)},1e4))}async getData(e){let t=await super.getData(e);t.choices=game.dice3d.exports.Utils.prepareColorsetList(),delete t.choices.custom,t.systems=game.dice3d.exports.Utils.prepareSystemList(),t.selections={};for(let a of o.attrs)t.selections[a]={color:game.settings.get("dsa5",`dice3d_${a}`),system:game.settings.get("dsa5",`dice3d_system_${a}`)};return t}static get defaultOptions(){let e=super.defaultOptions;return oo(e,{template:"systems/dsa5/templates/wizard/dicesonice-configuration.html",title:game.i18n.localize("DSASETTINGS.dicesonicesettings"),width:600}),e}},Ii=class extends FormApplication{static{u(this,"DiceSoNiceForm")}render(){game.dsa5.apps.DiceSoNiceCustomization.render(!0)}};function $i(){Hooks.on("hotbarDrop",(o,e,t)=>{if(e.mod=="dodge"){let a={name:game.i18n.localize(e.mod),img:"systems/dsa5/icons/categories/Dodge.webp"},s;return game.user.isGM||e.actorId==null?s=`game.dsa5.macro.charMacro("${e.mod}")`:s=`game.dsa5.macro.charMacroById("${e.mod}", "${e.actorId}")`,ka(s,a.name,a.img,t)}else if(e.mod=="attackWeaponless"||e.mod=="parryWeaponless"){let a={name:game.i18n.localize(e.mod),img:"systems/dsa5/icons/categories/attack_weaponless.webp"},s;return game.user.isGM||e.actorId==null?s=`game.dsa5.macro.weaponLessMacro("${e.mod}")`:s=`game.dsa5.macro.weaponLessMacroId("${e.mod}", "${e.actorId}")`,ka(s,a.name,a.img,t)}else if(e.type=="Item"){let a=fromUuidSync(e.uuid);if(!["ritual","ceremony","meleeweapon","rangeweapon","skill","combatskill","spell","liturgy","char","trait"].includes(a.type)||(a.type=="meleeweapon"||a.type=="combatskill")&&!["attack","parry"].includes(e.mod))return;if((a.type=="rangeweapon"||a.type=="trait")&&!["attack"].includes(e.mod))return;let i=`{mod: "${e.mod}"}`,n;game.user.isGM||e.actorId==null?n=`game.dsa5.macro.itemMacro("${a.name}", "${a.type}", ${i});`:n=`game.dsa5.macro.itemMacroById("${e.actorId}", "${a.name}", "${a.type}", ${i})`;let r=e.mod==null?a.name:`${a.name} - ${game.i18n.localize("CHAR."+e.mod.toUpperCase())}`;return ka(n,r,a.img,t)}else if(e.type=="Actor"||e.type=="JournalEntry"){let a=fromUuidSync(e.uuid),s=`(await fromUuid('${e.uuid}')).sheet.render(true)`;return ka(s,a.name,a.img,t)}})}u($i,"default");function ka(o,e,t,a){let s=game.macros.contents.find(i=>i.name===e&&i.command===o);return s?game.user.assignHotbarMacro(s,a):Macro.create({name:e,type:"script",img:t,command:o},{displaySheet:!1}).then(i=>game.user.assignHotbarMacro(i,a)),!1}u(ka,"createHotBarMacro");var{getProperty:Hn}=foundry.utils;function Oi(){Hooks.on("renderChatLog",(o,e,t)=>{ee.chatListeners(e),R.chatListeners(e),Q.chatListeners(e);let a=new re;Hooks.call("startDSA5ChatAutoCompletion",a),a.chatListeners(e),le.chatListeners(e)}),Hooks.on("renderChatMessage",(o,e,t)=>{if(game.user.isGM)e.find(".chat-button-player").remove();else{e.find(".chat-button-gm").remove();let a,s=e.find(".chat-button-target");s.length&&(a=ke.getTargetActor(t.message),a&&a.actor&&!a.actor.isOwner&&s.remove());let i=g.getSpeaker(t.message.speaker);i&&!i.isOwner&&(e.find(".selfButton").remove(),e.find(".d20").attr("data-tooltip",""));let n=e.find(".onlyTarget");n.length&&(a=g.getSpeaker({token:n.attr("data-token"),actor:n.attr("data-actor"),scene:canvas.scene?canvas.scene.id:null}),a&&!a.isOwner&&n.remove()),e.find(".hideData").remove(),Hn(t.message,`flags.dsa5.userHidden.${game.user.id}`)&&e.find(".payButton").remove()}game.settings.get("dsa5","expandChatModifierlist")&&(e.find(".expand-mods i").toggleClass("fa-minus fa-plus"),e.find(".expand-mods + ul").css({display:"block"})),z.bindButtons(e),e.find(".embeddedItemDrag").each(function(a,s){s.setAttribute("draggable",!0),s.addEventListener("dragstart",i=>mo(i))})}),Hooks.on("chatMessage",(o,e,t)=>{let a=e.match(/^\/(pay|getPaid|help$|conditions$|tables)/);switch(a=a?a[0]:"",a){case"/pay":return game.user.isGM?Q.createPayChatMessage(e):Q.payMoney(g.getSpeaker(t.speaker),e),!1;case"/getPaid":return game.user.isGM?Q.createGetPaidChatMessage(e):Q.getMoney(g.getSpeaker(t.speaker),e),!1;case"/help":return le.getHelp(),!1;case"/conditions":return le.showConditions(),!1;case"/tables":return le.showTables(),!1}}),Hooks.on("preCreateChatMessage",(o,e,t,a)=>{if(Hn(o,"flags.core.initiativeRoll")){let s=o.rolls[0].terms,i=`${s[0].number}`.split(".")[0],n=`${game.i18n.localize("baseValue")}: ${i}, ${game.i18n.localize("randomValue")}: ${s.at(-3).values[0]}")}`,r=[];for(let m of s)if(m.faces&&m.faces==6)for(let d=0;d${m.results[d].result}
    `);let c={content:`
    @@ -64,7 +64,7 @@ var tr=Object.defineProperty;var u=(o,e)=>tr(o,"name",{value:e,configurable:!0})
    ${game.i18n.localize("initiative")}: ${Math.floor(o.rolls[0]._total*100)/100}
    -
    `,flavor:void 0};o.updateSource(c)}})}u(Oi,"default");function mo(o){let e=$(o.currentTarget).parents(".message").attr("data-message-id"),s={type:"Item",data:game.messages.get(e).getFlag("dsa5","embeddedItem")};o.dataTransfer.setData("text/plain",JSON.stringify(s))}u(mo,"embeddedDragStart");var Ft=class o{static{u(this,"DSA5Tutorial")}static async firstTimeMessage(){if(!game.settings.get("dsa5","firstTimeStart")){await o.setupDefaultOptions();let e=game.i18n.localize("WELCOME");ChatMessage.create(g.chatDataSetup(e)),o.firstTimeLanguage(),await game.settings.set("dsa5","firstTimeStart",!0)}}static firstTimeLanguage(){let e=["de","en"],t={window:{title:"DIALOG.firstTime"},position:{width:400},content:`

    ${game.i18n.localize("DIALOG.firstTimeWarning")}

    `,buttons:[]};for(let a of e)t.buttons.push({action:a,label:game.i18n.localize(a),callback:u(()=>o.setLanguage(a),"callback")});new foundry.applications.api.DialogV2(t).render(!0)}static async setLanguage(e){await game.settings.set("dsa5","firstTimeStart",!0),await game.settings.set("dsa5","forceLanguage",e),await game.settings.set("core","language",e),foundry.utils.debouncedReload()}static async setupDefaultOptions(){let e=game.settings.get("core",Combat.CONFIG_SETTING);e.skipDefeated=!0,await game.settings.set("core",Combat.CONFIG_SETTING,e),await game.settings.set("core","leftClickRelease",!0)}};var it=class o{static{u(this,"DidYouKnow")}static fadeOut=!0;static async stopFade(e){e.stopPropagation(),e.preventDefault(),this.fadeOut?(this.fadeOut=!1,$(e.currentTarget).find("i").removeClass("fa-stop").addClass("fa-angle-right"),$(".didYouKnow").off("click"),$(".didYouKnow .closeDidYou").on("click",()=>$(".didYouKnow").remove())):fetch(`systems/dsa5/lazy/didyouknow/${game.i18n.lang}.json`).then(async t=>t.json()).then(async t=>{let a=t.data[Math.floor(Math.random()*t.data.length)],s=await renderTemplate("systems/dsa5/templates/system/didyouknow.html",{msg:a,fadeOut:o.fadeOut});$("body").find(".didYouKnow").replaceWith(s),o.activateListeners()})}static activateListeners(){$(".didYouKnow .stopFade").on("click",async e=>await this.stopFade(e)),$(".didYouKnow").on("click",()=>$(".didYouKnow").remove()),$(".didYouKnow").fadeIn()}static async showOneMessage(e=8e3){game.settings.get("dsa5","disableDidYouKnow")||fetch(`systems/dsa5/lazy/didyouknow/${game.i18n.lang}.json`).then(async t=>t.json()).then(async t=>{let a=t.data[Math.floor(Math.random()*t.data.length)],s=await renderTemplate("systems/dsa5/templates/system/didyouknow.html",{msg:a,fadeOut:o.fadeOut});$("body").append(s),this.activateListeners(),setTimeout(function(){o.fadeOut&&$(".didYouKnow").fadeOut(1e3,()=>$(".didYouKnow").remove())},e)})}};var{debounce:po,getProperty:nt,mergeObject:fo}=foundry.utils,Ge=class o extends CombatTracker{static{u(this,"DSA5CombatTracker")}static get defaultOptions(){return foundry.utils.mergeObject(super.defaultOptions,{template:"systems/dsa5/templates/system/combattracker.html"})}activateListeners(e){super.activateListeners(e),e.find(".combatant.actor .aggroButton").click(t=>{t.preventDefault(),t.stopPropagation(),o.runActAttackDialog()}),e.find("#combat-tracker").on("scroll.combattracker",po(function(t){let a=$(t.target),s=e.find(".combatant.active")[0].offsetTop;e.find(".aggroButton").animate({top:s-a.scrollTop()},50)},50)),e.find(".convertToBrawl").click(()=>game.combat.convertToBrawl())}static runActAttackDialog(){if(!game.combat)return;let e=game.combat.combatant;(game.user.isGM||e.isOwner)&&bt.showDialog(e.actor,e.tokenId)}async getData(e){let t=await super.getData(e);for(let a of t.turns){let s=t.combat.turns.find(r=>r.id==a.id),i=game.user.isGM||s.actor&&s.actor.testUserPermission(game.user,"OBSERVER")||!game.settings.get("dsa5","hideEffects");a.defenseCount=s.getFlag("dsa5","defenseCount")||0,a.actionCount=Number(nt(s,"actor.system.actionCount.value"))||0,a.actionCounts=`${a.actionCount} ${game.i18n.localize("actionCount")}`;let n=[];if(s.actor){for(let r of s.actor.items)if(r.type=="rangeweapon"&&r.system.worn.value&&r.system.reloadTime.progress>0){let l={name:r.name,remaining:O.calcLZ(r,s.actor)-r.system.reloadTime.progress};l.remaining>0&&n.push(l)}else if(["spell","liturgy"].includes(r.type)&&r.system.castingTime.modified>0){let l={name:r.name,remaining:r.system.castingTime.modified-r.system.castingTime.progress};l.remaining>0&&n.push(l)}}n=n.sort((r,l)=>r.remaining-l.remaining),n.length>0&&(a.ongoings=`${game.i18n.localize("COMBATTRACKER.ongoing")}
    ${n.map(r=>`${r.name} - ${r.remaining}`).join("
    ")}`,a.ongoing=n[0].remaining),a.effects=[];for(let r of s.actor?.temporaryEffects||[])r.statuses.has("defeated")?a.defeated=!0:r.img&&i&&!r.notApplicable&&(game.user.isGM||!r.getFlag("dsa5","hidePlayers"))&&!r.getFlag("dsa5","hideOnToken")&&a.effects.push({img:r.img,name:r.name})}return t.isBrawling=game.combat?.isBrawling,t}},vt=class o extends Combat{static{u(this,"DSA5Combat")}constructor(e,t){super(e,t)}async refreshTokenbars(){game.dsa5.apps.tokenHotbar&&game.dsa5.apps.tokenHotbar.updateDSA5Hotbar()}get isBrawling(){return this.getFlag("dsa5","isBrawling")}_onCreate(e,t,a){super._onCreate(e,t,a),this.refreshTokenbars()}_onDelete(e,t){super._onDelete(e,t),this.refreshTokenbars()}async brawlingDialog(){return await foundry.applications.api.DialogV2.confirm({window:{title:"BRAWLING.unarmEveryone"},content:`

    ${game.i18n.localize("BRAWLING.unarmEveryoneText")}

    `,rejectClose:!1,modal:!0})}async convertToBrawl(e=void 0){let t=e??!this.isBrawling,a=[],s=[],i=[];if(t){await this.setFlag("dsa5","unarmEveryone",await this.brawlingDialog());for(let n of this.combatants){if(!n.actor)return{};let r=await n.brawlingChange();n.actor.isToken?await n.actor.update(r.actorChange):a.push(r.actorChange),s.push(...r.tokenChange),o.brawlStart()}}else for(let n of this.combatants){if(!n.actor)return{};let r=await n.undoBrawlingChange();n.actor.isToken?await n.actor.update(r.actorChange):a.push(r.actorChange),s.push(...r.tokenChange),r.damage.brawlDamage>0&&i.push({name:n.token.name,id:n.token.id,data:r.damage})}await O.updateDocuments(a),await game.canvas.scene.updateEmbeddedDocuments("Token",s),await this.setFlag("dsa5","isBrawling",t),i.length&&await this.showBrawlingDamage(i)}async showBrawlingDamage(e){let t=await renderTemplate("systems/dsa5/templates/chat/brawling-damage.html",{messages:e});ChatMessage.create(g.chatDataSetup(t))}static async brawlStart(e=2e3,t=!0){t&&g.isActiveGM()&&await game.socket.emit("system.dsa5",{type:"brawlStart",payload:{}}),$(".bumFight").remove();let a=await renderTemplate("systems/dsa5/templates/system/bumFight/animation.html",{});$("body").append(a);let s=$(".bumFight");s.on("click",()=>s.remove()),s.addClass("fight"),setTimeout(function(){s.fadeOut(1e3,()=>s.remove())},e)}async nextRound(){if(game.user.isGM)for(let e of this.turns)await e.setFlag("dsa5","defenseCount",0);else await game.socket.emit("system.dsa5",{type:"clearCombat",payload:{}});return await super.nextRound()}async getDefenseCount(e){let t=this.getCombatantFromActor(e);return t&&t.getFlag("dsa5","defenseCount")||0}getCombatantFromActor(e){let t;return e.token?t=Array.from(this.combatants).find(a=>a.tokenId==e.token):t=Array.from(this.combatants).find(a=>a.actorId==e.actor),t?this.combatants.get(t.id):void 0}async updateDefenseCount(e){if(game.user.isGM){let t=this.getCombatantFromActor(e);t&&!nt(t.actor,"system.config.defense")&&await t.setFlag("dsa5","defenseCount",(t.getFlag("dsa5","defenseCount")||0)+1)}else await game.socket.emit("system.dsa5",{type:"updateDefenseCount",payload:{speaker:e}})}},wa=class extends Combatant{static{u(this,"DSA5Combatant")}constructor(e,t){e.flags==null&&(e.flags={}),fo(e.flags,{dsa5:{defenseCount:0}}),super(e,t)}brawlingChange(){let e=g.getSpeaker({actor:this.actor.id,scene:this.sceneId,token:this.token.id}),t=this.combat.getFlag("dsa5","unarmEveryone"),a=nt(e,"system.config.autoBar")?e.getActiveTokens().map(i=>({_id:i.id,bar1:{attribute:"status.temporaryLeP"}})):[],s={_id:e.id,system:{status:{temporaryLeP:{value:e.system.status.wounds.value,max:e.system.status.wounds.value}}}};if(t){let i=this.actor.items.filter(n=>n.type=="meleeweapon"&&n.system.worn.value&&!N.improvisedWeapon.test(n.name));i.length&&(s.items=i.map(n=>({_id:n.id,"system.worn.value":!1})))}return{tokenChange:a,actorChange:s}}async getBrawlingTable(){if(!this.brawlingTable){let t=(await game.packs.get(game.i18n.lang=="de"?"dsa5.patzer":"dsa5.botch").getDocuments({name__in:[game.i18n.lang=="de"?"Pr\xFCgelei - Verletzungen":"Brawling - Injuries"]}))[0];this.brawlingTable=t}return this.brawlingTable}async undoBrawlingChange(){let e=g.getSpeaker({actor:this.actor.id,scene:this.sceneId,token:this.token.id}),t=nt(e,"system.config.autoBar")?e.getActiveTokens().map(r=>({_id:r.id,bar1:{attribute:"status.wounds"}})):[],a=Math.max(0,e.system.status.temporaryLeP.max-e.system.status.temporaryLeP.value),s=0,i;if(a>0){i=await(await this.getBrawlingTable()).draw({displayChat:!1}),i=i.results[0];let r=i.getFlag("dsa5","brawlDamage");s=Math.round(a*r)}let n={_id:e.id,system:{status:{temporaryLeP:{value:0,max:0},wounds:{value:e.system.status.wounds.value-s}}}};return{tokenChange:t,actorChange:n,damage:{brawlDamage:s,result:i}}}async recalcInitiative(){if(this.initiative){let t={initiative:(await this.getFlag("dsa5","baseRoll")||0)+this.actor.system.status.initiative.value};await this.update(t)}}};Hooks.on("preCreateCombatant",(o,e,t)=>{let a=g.getSpeaker({actor:o.actorId,scene:o.sceneId,token:o.tokenId});if(nt(a.system,"merchant.merchantType")=="loot")return!1;if(o.combat.isBrawling){let s=o.brawlingChange();delete s.actorChange._id,a.update(s.actorChange).then(()=>{game.canvas.scene.updateEmbeddedDocuments("Token",s.tokenChange)})}});Hooks.on("deleteCombatant",(o,e,t)=>{let a=g.getSpeaker({actor:o.actorId,scene:o.sceneId,token:o.tokenId});if(nt(a.system,"merchant.merchantType")=="loot")return!1;o.combat.isBrawling&&o.undoBrawlingChange().then(async s=>{o.token&&(delete s.actorChange._id,await a.update(s.actorChange),await game.canvas.scene.updateEmbeddedDocuments("Token",s.tokenChange),s.damage.brawlDamage>0&&o.combat.showBrawlingDamage([{name:o.token.name,id:o.token.id,data:s.damage}]))})});Hooks.on("preDeleteCombat",(o,e,t)=>{if(!e.noHook&&o.isBrawling)return o.convertToBrawl(!1).then(()=>{o.delete({noHook:!0})}),!1});Hooks.on("updateCombatant",(o,e,t)=>{if(game.user.isGM)if(e.initiative){if(!o.getFlag("dsa5","baseRoll")){let s=`${e.initiative}`.split("."),i=Number(s[0])-Math.round(o.actor.system.status.initiative.value);o.setFlag("dsa5","baseRoll",i)}}else"initiative"in e&&e.initiative==null&&o.update({"flags.dsa5.-=baseRoll":null})});var xi=class o{static{u(this,"RepeatingEffectsHelper")}static async updateCombatHook(e,t,a,s){!t.round&&!t.turn||e.round!=0&&e.turns&&e.active&&e.previous.roundm.value).join("+");if(!i)continue;let n=await new Roll(i).evaluate(),r=await n.render(),l=game.i18n.localize(n.total>0?"CHATNOTIFICATION.regenerates":"CHATNOTIFICATION.getsHurt"),c=`${this.buildActorName(e)} ${l} ${game.i18n.localize(s)} ${r}`;await this.sendEventMessage(c,t,e),s=="wounds"?await e.actor.applyDamage(n.total*-1):await e.actor.applyMana(n.total*-1,s=="astralenergy"?"AsP":"KaP")}}static async applyBleeding(e,t){if(e.actor.system.status.wounds.value<1)return;let a=game.i18n.format("CHATNOTIFICATION.bleeding",{actor:this.buildActorName(e)});await this.sendEventMessage(a,t,e),await e.actor.applyDamage(1)}static async applyBurning(e,t){if(e.actor?.system.status.wounds.value<1)return;let a=e.actor?.system.condition.burning,s=z.resistantToEffect(e.actor,"burning"),i={0:"1",1:"1d3",2:"1d6",3:"2d6"}[a-s]||"1",n=await new Roll(i).evaluate(),r=await n.render(),l=game.i18n.format(`CHATNOTIFICATION.burning.${a}`,{actor:this.buildActorName(e),damage:r});await this.sendEventMessage(l,t,e),await e.actor.applyDamage(n.total)}static buildActorName(e){let t=e.token.name;return game.settings.get("dsa5","hideRegenerationToOwner")&&e.token.name!=e.token.actor.name&&(t+=` (${e.token.actor.name})`),e.token.actor.toAnchor({name:t}).outerHTML}static async sendEventMessage(e,t,a){if(game.settings.get("dsa5","hideRegenerationToOwner")){let s=t.combatants.get(a.id).players;s.push(...game.users.filter(n=>n.isGM).map(n=>n.id));let i=g.chatDataSetup(e,void 0,void 0,s);delete i.speaker,await ChatMessage.create(i)}else await ChatMessage.create(g.chatDataSetup(e))}};Hooks.on("updateCombat",xi.updateCombatHook);var{mergeObject:jn,duplicate:go}=foundry.utils,Ht=class o extends Application{static{u(this,"DSAIniTracker")}static get defaultOptions(){let e=super.defaultOptions;return jn(e,{classes:e.classes.concat(["dsa5","initTracker"]),template:"systems/dsa5/templates/system/initracker.html",dragDrop:[{dragSelector:".iniItem",dropSelector:[".iniTrackerList"]}],top:100,left:170,title:"DSAIniTracker",itemWidth:game.settings.get("dsa5","iniTrackerSize"),actorCount:game.settings.get("dsa5","iniTrackerCount"),position:game.settings.get("dsa5","iniTrackerPosition")}),e}setPosition({left:e,top:t,width:a,height:s,scale:i}={}){let n=super.setPosition({left:e,top:t,width:a,height:s,scale:i}),r=this.element[0];if(!r.style.width||a){let l=a||r.offsetWidth,c=r.style.maxWidth||window.innerWidth;n.width=a=Math.clamp(l,0,c),r.style.width=a+"px",a+n.left>window.innerWidth&&(e=n.left)}return game.settings.set("dsa5","iniTrackerPosition",{left:n.left,top:n.top}),n}static connectHooks(){Hooks.on("renderDSA5CombatTracker",(e,t,a)=>{game.settings.get("dsa5","enableCombatFlow")&&(game.combat?(game.dsa5.apps.initTracker||(game.dsa5.apps.initTracker=new o),game.dsa5.apps.initTracker.updateTracker(a)):game.dsa5.apps.initTracker&&(game.dsa5.apps.initTracker.close(),game.dsa5.apps.initTracker=void 0))})}updateTracker(e){this.combatData=e,this.render(!0,{focus:!1})}async getData(e){let t=this.combatData,a=o.defaultOptions.itemWidth,s=o.defaultOptions.actorCount,i=t.round,n=t.turns,r=[],l=game.settings.get("core",Combat.CONFIG_SETTING).skipDefeated,c=n.some(d=>d.active),m=t.turns.some(d=>d.owner&&!d.hasRolled&&(!game.user.isGM||t.combat.combatants.get(d.id).isNPC));if(n.length){let d=[],p=s,f=!1,h=-1,y=0,k=0,D;for(;!(p==0||k==s);){let v=go(n[y]),I=t.combat.combatants.get(v.id);f&&y==h&&(v.css=v.css.replace("active","")),!i||v.active&&!f||!c&&!f?(f=!0,h=y):I.getFlag("dsa5","waitInit")==t.round+k&&!I.defeated&&(game.user.isGM||!I.hidden)&&r.push(v),f&&!(l&&I.defeated)&&(game.user.isGM||!I.hidden)&&(v.round=t.round+k,v.owner&&I.token?.actor&&(v.maxLP=I.token.actor.system.status.wounds.max,v.currentLP=I.token.actor.system.status.wounds.value),D&&D!=v.round&&(v.newRound="newRound"),D=v.round,d.push(v),p--),y++,y>=n.length&&(y=0,k++)}t.turns=d}return t.isLastRound=t.turns[1]?.newRound,this.position.width=a*s+s*3+80,this.position.height=a+10,jn(t,{itemWidth:a,unRolled:m,waitingTurns:r}),this.conditionalPanToCurrentCombatant(t),t}hasChangedTurn(e){let t=e.turn!=this.lastTurnUpdate||e.round!=this.lastRoundUpdate;return this.lastTurnUpdate=e.turn,this.lastRoundUpdate=e.round,t}async conditionalPanToCurrentCombatant(e){if(!game.settings.get("dsa5","enableCombatPan"))return;let t=e.turns[0];if(!t)return;let a=e.combat.combatants.get(t.id);!a||!this.hasChangedTurn(e)||setTimeout(()=>{let s=a.token;!s||!s.object||!s.object.isVisible||(canvas.animatePan({x:s.x,y:s.y}),!(!a.actor||!a.actor.isOwner)&&s.object.control({releaseOthers:!0}))},300)}async _onWheelResize(e){let t=game.settings.get("dsa5","iniTrackerSize");e.originalEvent.deltaY>0?t=Math.min(140,t+5):t=Math.max(30,t-5),await game.settings.set("dsa5","iniTrackerSize",t),await this.render(!0)}activateListeners(e){super.activateListeners(e);let t=e.find(".dragHandler");new Draggable(this,e,t[0],this.options.resizable),t.on("wheel",async s=>(s.stopPropagation(),s.preventDefault(),await this._onWheelResize(s),!1)),e.find(".toggleTracker").click(()=>{let s=ui.combat;s.renderPopout(s)}),e.find(".combat-control").click(s=>this._onCombatControl(s)),e.find(".convertToBrawl").click(s=>{game.combat?.convertToBrawl()});let a=e.find(".iniItem");a.hover(this._onCombatantHoverIn.bind(this),this._onCombatantHoverOut.bind(this)),a.click(this._onCombatantMouseDown.bind(this)),e.find(".waitingTackerList .iniItem").mousedown(s=>this._onRightClick(s)),e.find(".combatant-control").click(s=>this._onCombatantControl(s)),e.find(".combatant .aggroButton").click(s=>{s.preventDefault(),s.stopPropagation(),Ge.runActAttackDialog()}),e.find(".rollMine").click(s=>this.rollMyChars()),game.user.isGM&&e.find(".rolledInit").click(s=>this.editCombatant(s))}rollMyChars(){game.user.isGM?this._getCombatApp().viewed.rollNPC({}):this._getCombatApp().viewed.rollAll({})}_onRightClick(e){if(e.button==2){let t=game.combat.combatants.get(e.currentTarget.dataset.combatantId);t.isOwner&&t.unsetFlag("dsa5","waitInit")}}editCombatant(e){this._getCombatApp()._onConfigureCombatant($(e.currentTarget))}_onCombatantControl(e){this._getCombatApp()._onCombatantControl(e)}_onCombatControl(e){e.currentTarget.dataset.control=="waitInit"?this.waitInit(e):this._getCombatApp()._onCombatControl(e)}async waitInit(e){await game.combat.combatants.get(game.combat.current.combatantId).setFlag("dsa5","waitInit",game.combat.current.round),e.currentTarget.dataset.control="nextTurn",this._getCombatApp()._onCombatControl(e)}_onCombatantHoverOut(e){this._getCombatApp()._onCombatantHoverOut(e)}_onCombatantHoverIn(e){this._getCombatApp()._onCombatantHoverIn(e)}_onCombatantMouseDown(e){this._getCombatApp()._onCombatantMouseDown(e)}_getCombatApp(){return game.combats.apps[0]}_canDragStart(e){return!1}_canDragDrop(e){return!1}_onDragStart(e){let t=$(e.currentTarget).closestData("combatant-id");e.dataTransfer.setData("text/plain",JSON.stringify({type:"IniChange",combatantId:t}))}_onDrop(e){JSON.parse(e.dataTransfer.getData("text/plain")).type=="IniChange"}};var rt=class extends Tour{static{u(this,"DSATour")}static tours=["systems/dsa5/modules/tours/lang/initial","systems/dsa5/modules/tours/lang/library","systems/dsa5/modules/tours/lang/actor"];static gmTours=["systems/dsa5/modules/tours/lang/mastermenu"];static async travelAgency(){let e=game.i18n.lang=="de"?"de":"en";console.log("Adding DSA/TDE Tours");for(let t of this.tours){let a=await game.dsa5.apps.DSATour.fromJSON(`${t.replace("/lang/",`/${e}/`)}.json`);game.tours.register(a.config.module,a.id,a)}if(game.user.isGM)for(let t of this.gmTours){let a=await game.dsa5.apps.DSATour.fromJSON(`${t.replace("/lang/",`/${e}/`)}.json`);game.tours.register(a.config.module,a.id,a)}}async _preStep(){this.currentStep.activateTab?ui.sidebar.activateTab(this.currentStep.activateTab):this.currentStep.activateLayer&&canvas.activeLayer.options.name!=this.currentStep.activateLayer?(await canvas[this.currentStep.activateLayer].activate(),await ta(100)):this.currentStep.appTab&&this.app.activateTab(this.currentStep.appTab)}exit(){super.exit()}async start(){if(this.config.preCommand){let t=Object.getPrototypeOf(async function(){}).constructor;await new t(this.config.preCommand).call(this)}if(this.app)for(await this.app.render(!0,{focus:!0});!this.app.rendered;)await ta(50);if(this.app||this.config.preCommand)for(;!$(this.steps[this.stepIndex+1].selector+":visible").length;)await ta(50);let e=await super.start();return $("#tooltip").show(),e}};var{mergeObject:ho}=foundry.utils,va=class{static{u(this,"PlayerMenuSubApp")}static template="";static rulePath={};async _getData(e){return{}}activateListeners(e){}async _renderData(e){let t=await this._getData(e);return ho(t,e),await renderTemplate(this.constructor.template,t)}async prepareApp(e){return{name:game.i18n.localize(`PLAYER.${this.constructor.name}`),view:await this._renderData(e)}}async render(){await game.dsa5.apps.playerMenu.render(!0)}async activateTab(){await game.dsa5.apps.playerMenu.activateTab(game.i18n.localize(`PLAYER.${this.constructor.name}`))}get actor(){return game.dsa5.apps.playerMenu.actor}async _onDrop(e){}};var{getProperty:yo,setProperty:bo,mergeObject:jt,duplicate:ko}=foundry.utils,ot=class o extends Application{static{u(this,"PlayerMenu")}constructor(e){super(e),this.entityAbilities=[],game.dsa5.apps.PlayerMenuSubApp=va,this.summoningModifiers=[{id:1,name:"CONJURATION.offensiveImprovement",descr:"CONJURATION.offensiveImprovementDescr",changes:[{key:"system.meleeStats.attack",mode:2,value:2},{key:"system.meleeStats.damage",mode:2,value:4},{key:"system.rangeStats.attack",mode:2,value:2},{key:"system.rangeStats.damage",mode:2,value:4}]},{id:2,name:"CONJURATION.defensiveImprovement",descr:"CONJURATION.defensiveImprovementDescr",changes:[{key:"system.meleeStats.parry",mode:2,value:2},{key:"system.totalArmor",mode:2,value:2},{key:"system.status.wounds.gearmodifier",mode:2,value:10}]},{id:3,name:"CONJURATION.speedImprovement",descr:"CONJURATION.speedImprovementDescr",changes:[{key:"system.status.speed.gearmodifier",mode:2,value:2},{key:"system.status.dodge.gearmodifier",mode:2,value:2}]},{id:4,name:"CONJURATION.magicalImprovement",descr:"CONJURATION.magicalImprovementDescr",changes:[],fun:N.magicalImprovement},{id:5,name:"CONJURATION.resistanceImprovement",descr:"CONJURATION.resistanceImprovementDescr",changes:[{key:"system.status.soulpower.gearmodifier",mode:2,value:2},{key:"system.status.toughness.gearmodifier",mode:2,value:2}]},{id:6,name:"CONJURATION.mentalImprovement",descr:"CONJURATION.mentalImprovementDescr",changes:[{key:"system.characteristics.mu.gearmodifier",mode:2,value:2},{key:"system.characteristics.kl.gearmodifier",mode:2,value:2},{key:"system.characteristics.in.gearmodifier",mode:2,value:2},{key:"system.characteristics.ch.gearmodifier",mode:2,value:2}]},{id:7,name:"CONJURATION.physicalImprovement",descr:"CONJURATION.physicalImprovementDescr",changes:[{key:"system.characteristics.ff.gearmodifier",mode:2,value:2},{key:"system.characteristics.ge.gearmodifier",mode:2,value:2},{key:"system.characteristics.ko.gearmodifier",mode:2,value:2},{key:"system.characteristics.kk.gearmodifier",mode:2,value:2}]}],this.conjurationData={qs:0,consumedQS:0,packageModifier:0,selectedIds:[],selectedEntityIds:[],selectedPackageIds:[],conjurationTypes:{1:game.i18n.localize("CONJURATION.demon"),2:game.i18n.localize("CONJURATION.elemental")},rules:{1:{de:{pack:"dsa5-core.corerules",name:"Beschw\xF6rungen"},en:{pack:"dsa5-core.coreenrules",name:"Summoning"}},2:{de:{pack:"dsa5-core.corerules",name:"Beschw\xF6rungen"},en:{pack:"dsa5-core.coreenrules",name:"Summoning"}}},conjurationType:1,skills:{1:["invocatioMinima","invocatioMinor","invocatioMaior"].map(t=>game.i18n.localize(`LocalizedIDs.${t}`)),2:["manifesto","elementalServant","callDjinn","servantEarth","servantFlame","servantCold","servantWave","servantCloud","servantOre"].map(t=>game.i18n.localize(`LocalizedIDs.${t}`))},modifiers:{1:this.summoningModifiers,2:this.summoningModifiers},moreModifiers:{2:[{name:game.i18n.localize("CONJURATION.groupSummoning"),options:[1,2,3,4,5,6,7,8].map(t=>({name:t,val:t*-2+2}))}]},postFunction:{}},this.subApps=[]}registerSubApp(e){this.subApps.push(e)}async rollConjuration(e){if(!this.conjuration)return ui.notifications.warn("CONJURATION.dragConjuration",{localize:!0});let t=$(e.currentTarget).closest(".item").attr("data-item-id"),a=this.actor.items.get(t),s=[{name:game.i18n.localize("conjuringDifficulty"),value:yo(this.conjuration,"system.conjuringDifficulty.value")||0,selected:!0}];if(this.conjurationData.packageModifier&&s.push({name:game.i18n.localize("summoningPackage"),value:this.conjurationData.packageModifier,selected:!0}),this.conjurationData.moreModifiers[this.conjurationData.conjurationType]){let i=this.conjurationData.moreModifiers[this.conjurationData.conjurationType].filter(n=>n.selected);for(let n of i)s.push({name:n.name,value:Number(n.selected),selected:!0})}this.actor.setupSkill(a,{moreModifiers:s,subtitle:` (${this.conjuration.name})`},void 0).then(async i=>{let n=await this.actor.basicTest(i);this.conjurationData.qs=n.result.qualityStep||0,this.render(!0)})}activateListeners(e){super.activateListeners(e),me(e),e.find(".conjurationData").change(t=>{let a=$(t.currentTarget);bo(this.conjurationData,a.attr("name"),a.val()),a.attr("data-refresh")&&this.render()}),e.find(".skill-select").click(t=>this.rollConjuration(t)),e.find(".initLibrary").click(async t=>{$(t.currentTarget).html(''),await game.dsa5.itemLibrary.buildEquipmentIndex(),this.render()}),e.find(".item-edit").click(t=>{let a=$(t.currentTarget).closest(".item").attr("data-item-id");this.actor.items.get(a).sheet.render(!0)}),e.find(".selectableRow").click(t=>this.selectImprovement(t)),e.find(".finalizeConjuration").click(()=>this.finalizeConjuration()),e.find(".ruleLink").click(t=>this.openRules(t)),e.find(".openChar").click(()=>{this.actor?.sheet.render(!0)}),e.find(".showCC").click(()=>{let t=new game.dsa5.apps.DSACharacterCalculator;t.actor=this.actor,t.render(!0)}),e.find(".showEntity").click(t=>{t.stopPropagation(),u(async()=>{(await fromUuid(t.currentTarget.dataset.uuid)).sheet.render(!0)},"fun")()}),e.find(".moreModifiers").change(t=>{let a=this.conjurationData.moreModifiers[this.conjurationData.conjurationType].find(s=>s.name==t.currentTarget.dataset.name);a.selected=$(t.currentTarget).val()});for(let t of this.subApps)t.activateListeners(e)}async openRules(e){let t=e.currentTarget.dataset.subapp,a=(t?this.subApps.find(i=>i.constructor.name==t).constructor.rulePath:this.conjurationData.rules[this.conjurationData.conjurationType])[game.i18n.lang];u(async()=>{let n=await game.packs.get(a.pack).getDocuments({name:a.name});for(let r of n)r.sheet.render(!0)},"fun")()}finalizeConjuration(){if(!this.conjurationData)return;if(!this.conjuration)return ui.notifications.warn("DSAError.noConjurationActive",{localize:!0});let e=[];for(let a of this.conjurationData.selectedIds)e.push(this.conjurationData.modifiers[this.conjurationData.conjurationType].find(s=>s.id==a));let t={source:this.conjuration.toObject(),creationData:{type:this.conjurationData.conjurationType,typeName:this.conjurationData.conjurationTypes[this.conjurationData.conjurationType],qs:this.conjurationData.qs,consumedQS:this.conjurationData.consumedQS,modifiers:e,entityIds:this.conjurationData.selectedEntityIds,packageIds:this.conjurationData.selectedPackageIds},summoner:{name:this.actor.name,img:this.actor.img}};game.user.isGM?o.createConjuration(t):(game.socket.emit("system.dsa5",{type:"summonCreature",payload:t}),ui.notifications.info("CONJURATION.requestSend",{localize:!0}))}static createConjuration({source:e,creationData:t,summoner:a}){new zi(e,a,t).render(!0)}selectImprovement(e){let t=Number(e.currentTarget.dataset.max)||1,a=Number(e.currentTarget.dataset.selected)||0;a>=t?$(e.currentTarget).removeClass("selected"):($(e.currentTarget).addClass("selected"),e.currentTarget.dataset.selected=a+1);let s=[],i=[],n=[],r=0,l=0;$(this._element).find(".selectableRow.selected").each((c,m)=>{for(let d=0;d0){if(this.conjuration=a,this.conjurationData.selectedIds=[],this.conjurationData.selectedEntityIds=[],this.conjurationData.selectedPackageIds=[],a.type=="creature"){for(let s of Object.keys(this.conjurationData.conjurationTypes))if(a.system.creatureClass.value.includes(this.conjurationData.conjurationTypes[s])){this.conjurationData.conjurationType=s;break}}}else this.trackedId=t.id,this.actor=a;this.render(!0)}else for(let a of this.subApps)if(await a._onDrop(t)===!0)break}async prepareEntityAbilities(){let e={entityAbilities:[],entityPackages:[]};if(game.dsa5.itemLibrary.equipmentBuild){let t=[game.i18n.localize("LocalizedIDs.all"),this.conjurationData.conjurationTypes[this.conjurationData.conjurationType]],a=await Promise.all((await game.dsa5.itemLibrary.getCategoryItems("trait",!1)).map(n=>n.getItem())),s=new Set,i=new Set;for(let n of a)n.system.distribution&&t.some(r=>n.system.distribution.includes(r))&&(n.system.traitType.value=="entity"&&!s.has(n.name)?(s.add(n.name),e.entityAbilities.push(n),n.count=this.conjurationData.selectedEntityIds.filter(r=>r==n.uuid).length,n.max=n.system.at.value||1):n.system.traitType.value=="summoning"&&!i.has(n.name)&&(i.add(n.name),n.count=this.conjurationData.selectedPackageIds.filter(r=>r==n.uuid).length,e.entityPackages.push(n)))}return e}async getData(e){let t=await super.getData(e);if(!game.user.isGM&&!this.actor&&(this.actor=game.user.character),this.actor){let a=this.conjurationData.qs-this.conjurationData.consumedQS+1,s=game.dsa5.itemLibrary.equipmentBuild,{entityAbilities:i,entityPackages:n}=await this.prepareEntityAbilities(),r=this.actor.items.filter(f=>this.conjurationData.skills[this.conjurationData.conjurationType].includes(f.name)&&["liturgy","ceremony","spell","ritual"].includes(f.type)).map(f=>f.toObject()),l=!1;for(let f of r)f.hasMighty=this.actor.items.find(h=>h.name==`${f.name} - ${game.i18n.localize("CONJURATION.powerfulCreature")}`),l||=f.hasMighty;let c=this.conjurationData.modifiers[this.conjurationData.conjurationType],m=l?2:1;for(let f of c)f.max=m,f.count=this.conjurationData.selectedIds.filter(h=>h==f.id).length;let d=this.conjurationData.moreModifiers[this.conjurationData.conjurationType];if(d){d=ko(d);for(let f of d)f.options=f.options.map(h=>(h.label=`${h.name} (${h.val})`,h))}let p=await renderTemplate("systems/dsa5/templates/system/conjuration/summoning.html",{actor:this.actor,conjuration:this.conjuration||{name:game.i18n.localize("CONJURATION.dragConjuration"),img:"icons/svg/mystery-man-black.svg"},conjurationData:this.conjurationData,services:a,conjurationModifiers:c,equipmentIndexLoaded:s,entityAbilities:i,entityPackages:n,moreModifiers:d,hasMighty:l});jt(t,{conjurationSheet:p,conjurationskills:r})}return jt(t,{actor:this.actor||{name:game.i18n.localize("CONJURATION.dragActor"),img:"icons/svg/mystery-man-black.svg"},conjurationData:this.conjurationData,conjurationTypes:this.conjurationData.conjurationTypes,canCalculate:g.moduleEnabled("dsa5-core")&&this.actor?.type=="character"}),await this.prepareSubApps(t),t}async prepareSubApps(e){e.subApps=[];for(let t of this.subApps)e.subApps.push(await t.prepareApp(e))}},zi=class extends ae{static{u(this,"ConjurationRequest")}constructor(e,t,a){super({title:`${game.i18n.localize("CONJURATION.request")} (${t.name})`,default:"ok",buttons:{}}),this.conjuration=e,this.summoner=t,this.creationData=a,this.confirmed=!1}async getData(e){let t=await super.getData(e),a=this.uniqueCountIds(this.creationData.entityIds);return jt(t,{conjuration:this.conjuration,summoner:this.summoner,confirmed:this.confirmed,services:this.creationData.qs-this.creationData.consumedQS+1,creationData:this.creationData,conjurationModifiers:this.creationData.modifiers,entityModifiers:await Promise.all(Object.keys(a).map(async s=>{let i=(await fromUuid(s)).toObject(!1);return i.uuid=s,i.count=a[s],i.cost=Number(i.system.AsPCost.value)*a[s],i})),packageModifiers:await Promise.all(this.creationData.packageIds.map(s=>fromUuid(s))),actor:this.actor}),t}static get defaultOptions(){let e=super.defaultOptions;return e.tabs=[{navSelector:".tabs",contentSelector:".content",initial:"main"}],jt(e,{classes:e.classes.concat(["dsa5","largeDialog"]),width:470}),e.template="systems/dsa5/templates/system/conjuration/request.html",e}uniqueCountIds(e){return e.reduce((t,a)=>(t[a]?++t[a]:t[a]=1,t),{})}async createActor(){this.confirmed=!0;let e=await g.getFolderForType("Actor",null,game.i18n.localize("PLAYER.conjuration")),t=await g.getFolderForType("Actor",e.id,this.creationData.typeName),a=this.creationData.qs-this.creationData.consumedQS+1;this.conjuration.folder=t.id,this.conjuration.effects||(this.conjuration.effects=[]);for(let c of this.creationData.modifiers)this.conjuration.effects.push({changes:c.changes,duration:{},icon:"icons/svg/aura.svg",label:game.i18n.localize(c.name),flags:{dsa5:{description:`${game.i18n.localize("PLAYER.conjuration")} ${game.i18n.localize("extensions")}`,hideOnToken:!0,hidePlayers:!1}}}),c.fun&&c.fun(this.conjuration,this.creationData);let s=this.uniqueCountIds(this.creationData.entityIds),i=(await Promise.all(Object.keys(s).map(c=>fromUuid(c)))).map(c=>{let m=c.toObject(!1);return s[c.uuid]>1&&(m.system.step={value:s[c.uuid]}),m}),n=(await Promise.all(this.creationData.packageIds.map(c=>fromUuid(c)))).map(c=>c.toObject(!1));this.conjuration.effects.push({changes:[],duration:{},icon:"icons/svg/aura.svg",id:"services",name:game.i18n.localize("PLAYER.services"),flags:{dsa5:{value:a,max:500,description:`${game.i18n.localize("PLAYER.conjuration")} ${game.i18n.localize("PLAYER.services")}`,manual:a,auto:0,hideOnToken:!0,hidePlayers:!1}}}),game.dsa5.apps.playerMenu.conjurationData.postFunction[this.creationData.type]&&await game.dsa5.apps.playerMenu.conjurationData.postFunction[this.creationData.type](this.conjuration,this.creationData.qs-this.creationData.consumedQS,this.creationData.type),this.conjuration.type=="creature"&&!this.conjuration.system.creatureClass.value.includes(this.creationData.typeName)&&(this.conjuration.system.creatureClass.value+=`, ${this.creationData.typeName}`),this.actor=await O.create(this.conjuration);let r=[...i,...n].filter(c=>!this.conjuration.items.find(m=>m.type==c.type&&c.name==m.name));await this.actor.createEmbeddedDocuments("Item",r);for(let c of n)await he.traitAdded(this.actor,c);for(let c of i)await he.traitAdded(this.actor,c);await this.actor.update({"system.status.wounds.value":this.actor.system.status.wounds.max});let l=await renderTemplate("systems/dsa5/templates/system/conjuration/chat.html",{actor:this.actor,modifiers:this.creationData.modifiers,summoner:this.summoner,summonerImg:ee.videoOrImgTag(this.summoner.img),conjureImg:ee.videoOrImgTag(this.actor.img),services:a});await ChatMessage.create(g.chatDataSetup(l)),this.render()}activateListeners(e){super.activateListeners(e),e.find(".createActor").click(()=>{this.createActor()}),e.on("mousedown",".newNPC",async t=>{let a=t.currentTarget.dataset.id;t.button==2&&(game.actors.get(a).delete(),$(t.currentTarget).remove())}),e.on("click",".newNPC",async t=>{let a=t.currentTarget.dataset.id;game.actors.get(a).sheet.render(!0)}),e.on("dragstart",".newNPC",t=>{t.stopPropagation();let s={type:"Actor",uuid:t.currentTarget.dataset.uuid};t.originalEvent.dataTransfer.setData("text/plain",JSON.stringify(s))}),e.find(".showEntity").click(t=>{t.stopPropagation(),u(async()=>{(await fromUuid(t.currentTarget.dataset.uuid)).sheet.render(!0)},"fun")()})}};var{mergeObject:Ni,getProperty:V,duplicate:Ri}=foundry.utils,Be=u(o=>class extends o{static get defaultOptions(){let e=super.defaultOptions;return Ni(e,{classes:e.classes.concat(["merchant-sheet"])}),e}static get merchantTemplate(){return"systems/dsa5/templates/actors/merchant/merchant-sheet.html"}get template(){if(this.merchantSheetActivated())switch(V(this.actor.system,"merchant.merchantType")){case"merchant":return"systems/dsa5/templates/actors/merchant/merchant-limited.html";case"loot":return"systems/dsa5/templates/actors/merchant/merchant-limited-loot.html";case"epic":return"systems/dsa5/templates/actors/merchant/merchant-epic.html";default:return super.template}return this.constructor.merchantTemplate}merchantSheetActivated(){return this.showLimited()||this.playerViewEnabled()&&["merchant","loot","epic"].includes(V(this.actor.system,"merchant.merchantType"))}async allowMerchant(e,t){let a=Ri(this.actor.ownership),s=t?1:0;for(let i of e)a[i]=s;await this.actor.update({ownership:a},{diff:!1,recursive:!1,noHook:!0})}activateListeners(e){super.activateListeners(e),e.find(".allowMerchant").click(async t=>{let a=t.currentTarget.dataset.userId,s=$(t.currentTarget).find("i");await this.allowMerchant([a],!s.hasClass("fa-check-circle")),s.toggleClass("fa-circle fa-check-circle")}),e.find(".toggleAllAllowMerchant").click(async t=>{let a=game.users.filter(i=>!i.isGM).map(i=>i.id),s=t.currentTarget.dataset.lock=="true";await this.allowMerchant(a,s),this.render()}),e.find(".lockTradeSection").click(t=>this.lockTradeSection(t)),e.find(".item-tradeLock").click(t=>this.toggleTradeLock(t)),e.find(".randomGoods").click(t=>game.dsa5.dialogs.RandomGoodsAddition.showDialog(this.actor,t)),e.find(".clearInventory").click(t=>this.clearInventory(t)),e.find(".removeOtherTradeFriend").click(()=>this.removeOtherTradeFriend()),e.find(".choseTradefriend").click(()=>this.choseTradefriend()),e.find(".setCustomPrice").click(t=>$(t.currentTarget).addClass("edit")),e.find(".customPriceTag").change(async t=>this.setCustomPrice(t)).blur(t=>$(t.currentTarget).closest(".setCustomPrice").removeClass("edit")),e.find(".buy-item").click(t=>{this.advanceWrapper(t,"buyItem",t),K.playMoneySound()}),e.find(".sell-item").click(t=>{this.advanceWrapper(t,"sellItem",t),K.playMoneySound()}),e.find(".item-external-edit").click(t=>{t.preventDefault();let a=this._getItemId(t);this.getTradeFriend().items.get(a).sheet.render(!0)}),e.find(".changeAmountAllItems").mousedown(t=>this.changeAmountAllItems(t)),e.find(".gearSearch").prop("disabled",!1)}_canDragStart(e){return!this.merchantSheetActivated()&&this.isEditable}async toggleTradeLock(e){let t=this._getItemId(e),a=this.actor.items.get(t);this.actor.updateEmbeddedDocuments("Item",[{_id:a.id,"system.tradeLocked":!a.system.tradeLocked}])}async setCustomPrice(e){e.stopPropagation(),e.preventDefault();let t=this._getItemId(e);await this.actor.updateEmbeddedDocuments("Item",[{_id:t,"flags.dsa5.customPriceTag":Number(e.target.value)}])}removeOtherTradeFriend(){this.otherTradeFriend=void 0,this.render(!0)}async choseTradefriend(){(await Pi.getDialog(this)).render(!0)}async lockTradeSection(e){let t=[],a=this.filterRule(e),s;for(let i of this.actor.items)if(a(i)){let n=i.toObject();s===void 0&&(s=!n.system.tradeLocked),n.system.tradeLocked=s,t.push(n)}this.actor.updateEmbeddedDocuments("Item",t)}filterRule(e){let t=e.currentTarget.dataset.type;return b.equipmentTypes[t]?a=>a.type=="equipment"&&a.system.equipmentType.value==t:a=>a.type==t&&b.equipmentCategories.has(a.type)}async changeAmountAllItems(e){let t=[],a=this.filterRule(e);for(let s of this.actor.items)if(a(s)){let i=s.toObject();N.increment(e,i,"system.quantity.value",0),t.push(i)}this.actor.updateEmbeddedDocuments("Item",t)}async buyItem(e){await this.transferItem(this.actor,this.getTradeFriend(),e,!0)}async sellItem(e){await this.transferItem(this.getTradeFriend(),this.actor,e,!1)}async transferItem(e,t,a,s=!0){let i=this._getItemId(a),n=a.currentTarget.dataset.price,r=a.ctrlKey?10:1;game.user.isGM?await this.constructor.finishTransaction(e,t,n,i,s,r):(this.constructor.noNeedToPay(t,e,n)||await Q.canPay(t,n,!0))&&game.socket.emit("system.dsa5",{type:"trade",payload:{target:this.constructor.transferTokenData(t),source:this.constructor.transferTokenData(e),price:n,itemId:i,buy:s,amount:r}})}static transferTokenData(e){let t={actor:e.id};return e.token&&(t.token=e.token.id),t}static async finishTransaction(e,t,a,s,i,n){let r=e.items.get(s).toObject();if(Number(r.system.quantity.value)>0){n=Math.min(Number(r.system.quantity.value),n),a=`${Number(a)*n}`;let l=this.noNeedToPay(t,e,a);if(l||await Q.payMoney(t,a,!0,!1))if(V(r,"system.worn.value")&&(r.system.worn.value=!1),i){let m=await this.updateTargetTransaction(t,r,n,e,a);await this.updateSourceTransaction(e,t,r,a,s,n),await this.transferNotification(r,t,e,i,a,n,l,m),await this.selfDestruction(e)}else{await this.updateSourceTransaction(e,t,r,a,s,n);let m=await this.updateTargetTransaction(t,r,n,e,a);await this.transferNotification(r,e,t,i,a,n,l,m)}}e.sheet.render(),t.sheet.render(),game.socket.emit("system.dsa5",{type:"refreshSheets",payload:{sheets:[{id:e.id,type:"ActorSheet"},{id:t.id,type:"ActorSheet"}]}})}static isTemporaryToken(e){return V(e.system,"merchant.merchantType")=="loot"&&V(e.system,"merchant.temporary")}static async selfDestruction(e){if(this.isTemporaryToken(e)&&!e.items.some(a=>b.equipmentCategories.has(a.type)||a.type=="money"&&a.system.quantity.value>0)){game.socket.emit("system.dsa5",{type:"hideDeletedSheet",payload:{target:this.transferTokenData(e)}});let a=e.getActiveTokens().map(s=>s.id);await canvas.scene.deleteEmbeddedDocuments("Token",a),await game.actors.get(e.id).delete(),this.hideDeletedSheet(e)}}static async hideDeletedSheet(e){e.sheet.close(!0)}static async transferNotification(e,t,a,s,i,n,r,l){let c=game.settings.get("dsa5","merchantNotification");if(c==0||V(e,"system.equipmentType.value")=="service")return;let m="MERCHANT."+(s?"buy":"sell")+(r?"Loot":"")+"Notification",d=e.type=="money"?game.i18n.localize(e.name):l.toAnchor().outerHTML,p=game.i18n.format(m,{item:d,source:t.name,target:a.name,amount:n,price:i,buy:s}),f=g.chatDataSetup(p);c==2&&(f.whisper=ChatMessage.getWhisperRecipients("GM").map(h=>h.id)),await ChatMessage.create(f)}static noNeedToPay(e,t,a){return a==0||V(e.system,"merchant.merchantType")=="loot"||V(t.system,"merchant.merchantType")=="loot"}static async updateSourceTransaction(e,t,a,s,i,n){let r=Ri(a);Number(r.system.quantity.value)>n||r.type=="money"?(r.system.quantity.value=Number(r.system.quantity.value)-n,await e.updateEmbeddedDocuments("Item",[r],{render:!1})):await e.deleteEmbeddedDocuments("Item",[i],{render:!1}),this.noNeedToPay(e,t,s)||await Q.getMoney(e,s,!0,!1)}static async updateTargetTransaction(e,t,a,s,i){let n=Ri(t);if(V(n,"system.equipmentType.value")=="service"){let l=game.i18n.format("MERCHANT.buyNotification",{item:n.name,amount:a,source:e.name,target:s.name,price:i});ChatMessage.create(g.chatDataSetup(l))}else{let l=e.items.find(c=>C.areEquals(n,c));return n.system.quantity.value=a,l?(await C.stackItems(l,n,e,!1),l):(await e.createEmbeddedDocuments("Item",[n],{render:!1}))[0]}}getTradeFriend(){return this.otherTradeFriend||game.user.character}async _manageDragItems(e,t){switch(t){case"creature":case"npc":case"character":this.setTradeFriend(e);break;default:return super._manageDragItems(e,t)}}async _onDropActor(e,t){let a=this.actor.limited,s=this.actor.isOwner;if(!(a||s))return!1;let{item:i,typeClass:n,selfTarget:r}=await Ee(t,this.id,!1);if(!r&&(s||a&&i.documentName=="Actor"))return await this._manageDragItems(i,n)}setTradeFriend(e){let t=game.actors.get(e._id);t.isOwner&&(this.otherTradeFriend=t,this.render(!0))}async _render(e=!1,t={}){if(!game.user.isGM&&V(this.actor.system,"merchant.merchantType")=="loot"&&V(this.actor.system,"merchant.locked")){foundry.audio.AudioHelper.play({src:"sounds/lock.wav",loop:!1},!1);return}await super._render(e,t)}_togglePlayerview(e){this.actor.update({"system.merchant.playerView":!V(this.actor.system,"merchant.playerView")})}playerViewEnabled(){return V(this.actor.system,"merchant.playerView")}async clearInventory(e){await foundry.applications.api.DialogV2.confirm({window:{title:"MERCHANT.clearInventory"},content:game.i18n.localize("MERCHANT.deleteAllGoods"),rejectClose:!1,modal:!0})&&this.removeAllGoods(this.actor,e)}async removeAllGoods(e,t){let a=$(t.currentTarget).text();$(t.currentTarget).html(' ');let s=e.items.filter(i=>b.equipmentCategories.has(i.type)&&!V(i,"worn.value")).map(i=>i.id);await e.deleteEmbeddedDocuments("Item",s),$(t.currentTarget).text(a)}async getData(e){let t=await super.getData(e);return t.merchantType=V(this.actor.system,"merchant.merchantType")||"none",t.merchantTypes={none:game.i18n.localize("MERCHANT.typeNone"),merchant:game.i18n.localize("MERCHANT.typeMerchant"),loot:game.i18n.localize("MERCHANT.typeLoot"),epic:game.i18n.localize("MERCHANT.typeEpic")},t.invName=t.merchantTypes[t.merchantType],t.players=game.users.filter(a=>!a.isGM).map(a=>(a.allowedMerchant=this.actor.testUserPermission(a,"LIMITED",!1),a.buyingFactor=V(this.actor.system,`merchant.factors.buyingFactor.${a.id}`),a.sellingFactor=V(this.actor.system,`merchant.factors.sellingFactor.${a.id}`),a)),t.merchantType!="epic"?(this.prepareStorage(t),this.merchantSheetActivated()&&(this.filterWornEquipment(t),this.prepareTradeFriend(t),t.prepare.inventory.misc.items.length==0&&(t.prepare.inventory.misc.show=!1))):(this.prepareStorage(t),t.garadanOptions={1:game.i18n.localize("GARADAN.1"),2:game.i18n.localize("GARADAN.2"),3:game.i18n.localize("GARADAN.3"),4:game.i18n.localize("GARADAN.4"),6:game.i18n.localize("GARADAN.6")}),t.hasOtherTradeFriend=!!this.otherTradeFriend,t}filterWornEquipment(e){for(let[t,a]of Object.entries(e.prepare.inventory))a.items=a.items.filter(s=>!V(s,"system.worn.value"))}prepareStorage(e){if(e.merchantType=="merchant")for(let[t,a]of Object.entries(e.prepare.inventory))for(let s of a.items)s.defaultPrice=this.getItemPrice(s),s.calculatedPrice=Number(parseFloat(`${s.defaultPrice*(V(this.actor.system,"merchant.sellingFactor")||1)}`).toFixed(2))*(V(this.actor.system,`merchant.factors.sellingFactor.${game.user.id}`)||1),s.priceTag=` / ${s.calculatedPrice}`;else if(e.merchantType=="loot"){for(let[a,s]of Object.entries(e.prepare.inventory))for(let i of s.items)i.calculatedPrice=this.getItemPrice(i);let t={items:e.prepare.money.coins.map(a=>(a.name=game.i18n.localize(a.name),a)),show:!0,dataType:"money"};t.items.length&&(e.prepare.inventory.money=t)}}getItemPrice(e){return Number(V(e,"flags.dsa5.customPriceTag"))||(e.type=="consumable"?C.getSubClass(e.type).consumablePrice(e):Number(e.system.price.value))}prepareTradeFriend(e){let t=this.getTradeFriend();if(t){let a=t.prepareItems({details:[]}),s=V(this.actor.system,"merchant.merchantType")=="loot"?1:(V(this.actor.system,"merchant.buyingFactor")||1)*(V(this.actor.system,`merchant.factors.buyingFactor.${game.user.id}`)||1),i=this.prepareSellPrices(a.inventory,s);i.misc.items.length==0&&(i.misc.show=!1),e.merchantType=="loot"&&(i.money={items:a.money.coins.map(n=>(n.name=game.i18n.localize(n.name),n)),show:!0,dataType:"money"}),Ni(e,{tradeFriend:{img:t.img,name:t.name,inventory:i,money:a.money}})}else Ni(e,{tradeFriend:{inventory:[],money:{coins:[]}}})}prepareSellPrices(e,t){for(let[a,s]of Object.entries(e))for(let i of s.items)i.calculatedPrice=Number(parseFloat(`${this.getItemPrice(i)*t}`).toFixed(2));return e}},"MerchantSheetMixin"),Pi=class o extends foundry.applications.api.HandlebarsApplicationMixin(foundry.applications.api.ApplicationV2){static{u(this,"SelectTradefriendDialog")}static DEFAULT_OPTIONS={window:{title:"DIALOG.setTargetToUser",resizable:!0},position:{width:400}};static PARTS={main:{template:"systems/dsa5/templates/dialog/selectTradeFriend.html"}};async _prepareContext(e){let t=await super._prepareContext(e);return t.users=game.user.isGM?await game.dsa5.apps.gameMasterMenu.getTrackedHeros():game.actors.filter(a=>a.isOwner),t}static async getDialog(e){let t=new o;return t.actor=e,t}_onRender(e,t){super._onRender(t),$(this.element).find(".combatant").on("click",s=>this.setTargetToUser(s))}setTargetToUser(e){this.actor.setTradeFriend({_id:e.currentTarget.dataset.id}),this.close()}},Ta=class extends Dialog{static{u(this,"RandomGoodsAddition")}static get template(){return"systems/dsa5/templates/dialog/randomGoods-dialog.html"}static async contentData(e={}){return{categories:Array.from(b.equipmentCategories),options:e}}static async showDialog(e,t,a={}){let s=await renderTemplate(this.template,await this.contentData(a));new game.dsa5.dialogs.RandomGoodsAddition({title:game.i18n.localize("MERCHANT.randomGoods"),content:s,default:"Yes",options:a,buttons:{Yes:{icon:'',label:game.i18n.localize("yes"),callback:u(i=>this.addRandomGoods(e,i,t),"callback")},cancel:{icon:'',label:game.i18n.localize("cancel")}}}).render(!0)}static async generateItems(e,t){let a=game.dsa5.itemLibrary;await a.buildEquipmentIndex();let s=[];for(let i of e.find('input[type="checkbox"]:checked')){let n=i.value,r=Number(e.find(`input[name="each_${n}"]`).val()),l=Number(e.find(`input[name="number_${n}"]`).val()),c=(await a.getRandomItems(n,l)).map(m=>{let d=m.toObject();return d.system.quantity.value=r,d});s.push(...c)}return this.filterSeen(s,t)}static filterSeen(e,t){let a={},s=(t?.items||[]).reduce((n,r)=>(n.add(`${r.type}_${r.name}`),n),new Set);return e.filter(n=>{let r=V(n,"system.effect");r=typeof r=="object"&&r!==null&&V(r,"attributes")||"";let l=Number(V(n,"system.price.value"))||0;if(r!=""||l>1e4)return!1;let c=`${n.type}_${n.name}`;return(a.hasOwnProperty(c)?!1:a[c]=!0)&&!s.has(c)})}static async addRandomGoods(e,t,a){let s=$(a.currentTarget).text();$(a.currentTarget).html(' '),await e.createEmbeddedDocuments("Item",await this.generateItems(t,e)),$(a.currentTarget).text(s)}};var Ie=class extends Be(Re){static{u(this,"MerchantSheetDSA5")}};function Gn(){game.socket.on("system.dsa5",o=>{switch(o.type){case"brawlStart":vt.brawlStart(2e3,!1);return;case"hideDeletedSheet":let e=o.payload.target.token?game.actors.tokens[o.payload.target.token]:game.actors.get(o.payload.target.actor);Ie.hideDeletedSheet(e);return;case"refreshSheets":for(let t of Object.values(ui.windows))o.payload.sheets.find(a=>t?.options?.baseApplication==a.type&&a.id==t.object?.id)&&t.render(!0);break;default:if(xe.socketListeners(o))return}if(g.isActiveGM())switch(o.type){case"updateKeepField":b.allowedforeignfields.includes(o.payload.field)&&game.actors.get(o.payload.actorId).update({[o.payload.field]:o.payload.updateData});break;case"target":{let e=game.scenes.get(o.payload.scene);new Token(e.getEmbeddedDocument("Token",o.payload.target)).actor.update({"flags.oppose":o.payload.opposeFlag})}break;case"addEffect":Z.applyEffect(o.payload.id,o.payload.mode,o.payload.actors);break;case"updateMsg":game.messages.get(o.payload.id).update(o.payload.updateData);break;case"deleteMsg":game.messages.get(o.payload.id).delete();break;case"showDamage":ee.showDamage(game.messages.get(o.payload.id),o.payload.hide);break;case"hideQueryButton":ee.hideReactionButton(o.payload.id);break;case"updateGroupCheck":ie.rerenderGC(game.messages.get(o.payload.messageId),o.payload.data);break;case"apTracker":_.receiveSocketEvent(o);break;case"updateAttackMessage":game.messages.get(o.payload.messageId).update({"flags.data.unopposedStartMessage":o.payload.startMessageId});break;case"clearCombat":game.combat&&game.combat.nextRound();break;case"clearOpposed":ee.clearOpposed(game.actors.get(o.payload.actorId));break;case"updateDefenseCount":game.combat&&game.combat.updateDefenseCount(o.payload.speaker);break;case"trade":{let e=o.payload.source.token?game.actors.tokens[o.payload.source.token]:game.actors.get(o.payload.source.actor),t=o.payload.target.token?game.actors.tokens[o.payload.target.token]:game.actors.get(o.payload.target.actor);Ie.finishTransaction(e,t,o.payload.price,o.payload.itemId,o.payload.buy,o.payload.amount)}break;case"playWhisperSound":o.payload.whisper.includes(game.user.id)&&foundry.audio.AudioHelper.play({src:o.payload.soundPath,volume:.8,loop:!1},!1);break;case"socketedConditionAddActor":fromUuid(o.payload.id).then(e=>{new J(e).socketedConditionAddActor(o.payload.actors.map(a=>game.actors.get(a)),o.payload.data)});break;case"socketedConditionAdd":fromUuid(o.payload.id).then(e=>{new J(e).socketedConditionAdd(o.payload.targets,o.payload.data)});break;case"socketedRemoveCondition":fromUuid(o.payload.id).then(e=>{new J(e).socketedRemoveCondition(o.payload.targets,o.payload.coreId)});break;case"socketedActorTransformation":fromUuid(o.payload.id).then(e=>{new J(e).socketedActorTransformation(o.payload.targets,o.payload.update)});break;case"itemDrop":{let e=o.payload.sourceActorId?game.actors.get(o.payload.sourceActorId):void 0;fromUuid(o.payload.itemId).then(t=>{Qs(e,t,o.payload.data,o.payload.amount)})}break;case"finalizeFoodContribution":case"finalizeidentification":case"updateHits":case"hideResistButton":break;case"reduceGroupSchip":O.reduceGroupSchip();break;case"summonCreature":ot.createConjuration(o.payload);break;default:console.warn(`Unhandled socket data type ${o.type}`)}})}u(Gn,"connectSocket");function Li(){game.i18n.lang=="de"?game.dsa5.apps.journalBrowser.manuals.push({id:"Game Manual (Foundry VTT)",path:"systems/dsa5/modules/journal/bookde.json",visible:!0}):game.dsa5.apps.journalBrowser.manuals.push({id:"Game Manual (Foundry VTT)",path:"systems/dsa5/modules/journal/booken.json",visible:!0})}u(Li,"registerGameManual");function _i(){Hooks.on("ready",async()=>{Gn(),g.moduleEnabled("vtta-tokenizer")&&!game.settings.get("dsa5","tokenizerSetup")&&game.user.isGM&&(await game.settings.set("vtta-tokenizer","default-frame-pc","[data] systems/dsa5/icons/backgrounds/token_green.webp"),await game.settings.set("vtta-tokenizer","default-frame-npc","[data] systems/dsa5/icons/backgrounds/token_black.webp"),await game.settings.set("vtta-tokenizer","default-frame-neutral","[data] systems/dsa5/icons/backgrounds/token_blue.webp"),await game.settings.set("dsa5","tokenizerSetup",!0)),g.moduleEnabled("dice-so-nice")&&!game.settings.get("dsa5","diceSetup")&&game.user.isGM&&(await game.settings.set("dice-so-nice","immediatelyDisplayChatMessages",!0),await game.settings.set("dsa5","diceSetup",!0)),await Ft.firstTimeMessage(),C.setupSubClasses(),it.showOneMessage(),Xe.registerTokenHotbar(),Rn(),Ht.connectHooks();let o=u(e=>{e.tabName=="settings"&&(rt.travelAgency(),Hooks.off("changeSidebarTab",o))},"hook");Hooks.on("changeSidebarTab",o),xn(),gn(),_e.bindAuraHooks(),Li(),Hooks.call("DSA5ready",game.dsa5)})}u(_i,"default");var{getProperty:Bn}=foundry.utils;function vo(o,e,t){if(e.system.isPriest&&e.system.isMage){let s=`
    `;o.find(".col.middle").prepend(s),o.find(".bar3 input").change(async i=>{let n=i.currentTarget,r=n.value.trim(),l=r.startsWith("+")||r.startsWith("-");r.startsWith("=")&&(r=r.slice(1));let c=Number(r),m=n.name.split(".").reduce((d,p)=>d[p],e);await e.update({[n.name]:l?m+c:c}),t.clear()})}}u(vo,"addThirdBarToHUD");function To(o,e,t){if(!game.user.isGM)return;let a=o.object.actor;if(a.isToken){if(canvas.tokens.controlled.length>=2){let s=a._id;if(!canvas.tokens.controlled.every(n=>n.actor?._id==s))return;e.find(".col.left").prepend(qn("swarm.combine"));let i=e.find('.control-icon[data-action="swarm"]');i.click(()=>{Ao(a,o.object.document),i.remove()})}else if(a.isSwarm()){e.find(".col.left").prepend(qn("swarm.split"));let s=e.find('.control-icon[data-action="swarm"]');s.click(()=>{So(a,o.object.document),s.remove()})}}}u(To,"swarmButtons");var Fi=class extends foundry.applications.api.DialogV2{static{u(this,"SwarmDialog")}_onRender(e,t){super._onRender(t),$(this.element).find('input[type="range"]').on("change",s=>{$(s.currentTarget).closest(".row-section").find(".range-value").html($(s.currentTarget).val())})}};function qn(o){return`
    `}u(qn,"swarmHud");async function So(o,e){let t=Number(o.system.swarm.count)-1,a=await renderTemplate("systems/dsa5/templates/dialog/swarm-split-dialog.html",{actor:o,maxSplitsize:t});new Fi({window:{title:"swarm.split"},content:a,buttons:[{action:"yes",icon:"fa fa-check",label:"ok",default:!0,callback:u(async(s,i,n)=>{let r=i.form.elements.newswarmsplit.valueAsNumber,l=e.toObject();delete l._id;let c=Math.floor(o.system.status.wounds.value/o.system.swarm.count*r),m=o.system.status.wounds.value-c;await o.update({"system.swarm.count":o.system.swarm.count-r,"system.status.wounds.value":m},{skipSwarmUpdate:!0});let d=(await canvas.scene.createEmbeddedDocuments("Token",[l]))[0];await d.actor.update({"system.swarm.count":r,"system.status.wounds.value":c},{skipSwarmUpdate:!0});let p=["x","y"][Math.floor(Math.random()*2)],f=Math.random()>.5?1:-1;await canvas.scene.updateEmbeddedDocuments("Token",[{_id:d.id,[p]:e[p]+canvas.scene.grid.size*f}])},"callback")},{action:"delete",icon:"fas fa-trash",label:"cancel"}]}).render(!0)}u(So,"splitSwarm");async function Ao(o,e){let t=0,a=0;for(let i of canvas.tokens.controlled)t+=Number(i.actor.system.swarm?.count)||1,a+=Number(i.actor.system.status.wounds.value);await e.actor.update({"system.swarm.count":t,"system.status.wounds.value":a},{skipSwarmUpdate:!0});let s=canvas.tokens.controlled.map(i=>i.id).filter(i=>i!=e.id);await canvas.scene.updateEmbeddedDocuments("Token",s.map(i=>({_id:i,x:e.x,y:e.y}))),await canvas.scene.deleteEmbeddedDocuments("Token",s)}u(Ao,"combineSwarm");function Hi(){Hooks.on("renderTokenHUD",(o,e,t)=>{Ve.hide(o.object);let a=o.object.actor;a&&(vo(e,a,o),To(o,e,t),game.dsa5.apps.LightDialog?.lightHud(e,a,t)),e.find('.control-icon[data-action="target"]').mousedown(s=>{s.button==2&&(game.user.updateTokenTargets([]),$(s.currentTarget).trigger("click"),s.preventDefault())}),e.find(".attribute input").off("change"),H.renderTokenHUD(o,e,t)}),Hooks.on("renderTokenConfig",(o,e,t)=>{if(t.isPrototype){let a=Bn(o.actor,"system.config.autoBar"),s=e.find(".bar2-max").closest(".form-group"),i=$(`
    +
    `,flavor:void 0};o.updateSource(c)}})}u(Oi,"default");function mo(o){let e=$(o.currentTarget).parents(".message").attr("data-message-id"),s={type:"Item",data:game.messages.get(e).getFlag("dsa5","embeddedItem")};o.dataTransfer.setData("text/plain",JSON.stringify(s))}u(mo,"embeddedDragStart");var Ft=class o{static{u(this,"DSA5Tutorial")}static async firstTimeMessage(){if(!game.settings.get("dsa5","firstTimeStart")){await o.setupDefaultOptions();let e=game.i18n.localize("WELCOME");ChatMessage.create(g.chatDataSetup(e)),o.firstTimeLanguage(),await game.settings.set("dsa5","firstTimeStart",!0)}}static firstTimeLanguage(){let e=["de","en"],t={window:{title:"DIALOG.firstTime"},position:{width:400},content:`

    ${game.i18n.localize("DIALOG.firstTimeWarning")}

    `,buttons:[]};for(let a of e)t.buttons.push({action:a,label:game.i18n.localize(a),callback:u(()=>o.setLanguage(a),"callback")});new foundry.applications.api.DialogV2(t).render(!0)}static async setLanguage(e){await game.settings.set("dsa5","firstTimeStart",!0),await game.settings.set("dsa5","forceLanguage",e),await game.settings.set("core","language",e),foundry.utils.debouncedReload()}static async setupDefaultOptions(){let e=game.settings.get("core",Combat.CONFIG_SETTING);e.skipDefeated=!0,await game.settings.set("core",Combat.CONFIG_SETTING,e),await game.settings.set("core","leftClickRelease",!0)}};var it=class o{static{u(this,"DidYouKnow")}static fadeOut=!0;static async stopFade(e){e.stopPropagation(),e.preventDefault(),this.fadeOut?(this.fadeOut=!1,$(e.currentTarget).find("i").removeClass("fa-stop").addClass("fa-angle-right"),$(".didYouKnow").off("click"),$(".didYouKnow .closeDidYou").on("click",()=>$(".didYouKnow").remove())):fetch(`systems/dsa5/lazy/didyouknow/${game.i18n.lang}.json`).then(async t=>t.json()).then(async t=>{let a=t.data[Math.floor(Math.random()*t.data.length)],s=await renderTemplate("systems/dsa5/templates/system/didyouknow.html",{msg:a,fadeOut:o.fadeOut});$("body").find(".didYouKnow").replaceWith(s),o.activateListeners()})}static activateListeners(){$(".didYouKnow .stopFade").on("click",async e=>await this.stopFade(e)),$(".didYouKnow").on("click",()=>$(".didYouKnow").remove()),$(".didYouKnow").fadeIn()}static async showOneMessage(e=8e3){game.settings.get("dsa5","disableDidYouKnow")||fetch(`systems/dsa5/lazy/didyouknow/${game.i18n.lang}.json`).then(async t=>t.json()).then(async t=>{let a=t.data[Math.floor(Math.random()*t.data.length)],s=await renderTemplate("systems/dsa5/templates/system/didyouknow.html",{msg:a,fadeOut:o.fadeOut});$("body").append(s),this.activateListeners(),setTimeout(function(){o.fadeOut&&$(".didYouKnow").fadeOut(1e3,()=>$(".didYouKnow").remove())},e)})}};var{debounce:po,getProperty:nt,mergeObject:fo}=foundry.utils,Ge=class o extends CombatTracker{static{u(this,"DSA5CombatTracker")}static get defaultOptions(){return foundry.utils.mergeObject(super.defaultOptions,{template:"systems/dsa5/templates/system/combattracker.html"})}activateListeners(e){super.activateListeners(e),e.find(".combatant.actor .aggroButton").click(t=>{t.preventDefault(),t.stopPropagation(),o.runActAttackDialog()}),e.find("#combat-tracker").on("scroll.combattracker",po(function(t){let a=$(t.target),s=e.find(".combatant.active")[0].offsetTop;e.find(".aggroButton").animate({top:s-a.scrollTop()},50)},50)),e.find(".convertToBrawl").click(()=>game.combat.convertToBrawl())}static runActAttackDialog(){if(!game.combat)return;let e=game.combat.combatant;(game.user.isGM||e.isOwner)&&bt.showDialog(e.actor,e.tokenId)}async getData(e){let t=await super.getData(e);for(let a of t.turns){let s=t.combat.turns.find(r=>r.id==a.id),i=game.user.isGM||s.actor&&s.actor.testUserPermission(game.user,"OBSERVER")||!game.settings.get("dsa5","hideEffects");a.defenseCount=s.getFlag("dsa5","defenseCount")||0,a.actionCount=Number(nt(s,"actor.system.actionCount.value"))||0,a.actionCounts=`${a.actionCount} ${game.i18n.localize("actionCount")}`;let n=[];if(s.actor){for(let r of s.actor.items)if(r.type=="rangeweapon"&&r.system.worn.value&&r.system.reloadTime.progress>0){let l={name:r.name,remaining:O.calcLZ(r,s.actor)-r.system.reloadTime.progress};l.remaining>0&&n.push(l)}else if(["spell","liturgy"].includes(r.type)&&r.system.castingTime.modified>0){let l={name:r.name,remaining:r.system.castingTime.modified-r.system.castingTime.progress};l.remaining>0&&n.push(l)}}n=n.sort((r,l)=>r.remaining-l.remaining),n.length>0&&(a.ongoings=`${game.i18n.localize("COMBATTRACKER.ongoing")}
    ${n.map(r=>`${r.name} - ${r.remaining}`).join("
    ")}`,a.ongoing=n[0].remaining),a.effects=[];for(let r of s.actor?.temporaryEffects||[])r.statuses.has("defeated")?a.defeated=!0:r.img&&i&&!r.notApplicable&&(game.user.isGM||!r.getFlag("dsa5","hidePlayers"))&&!r.getFlag("dsa5","hideOnToken")&&a.effects.push({img:r.img,name:r.name})}return t.isBrawling=game.combat?.isBrawling,t}},vt=class o extends Combat{static{u(this,"DSA5Combat")}constructor(e,t){super(e,t)}async refreshTokenbars(){game.dsa5.apps.tokenHotbar&&game.dsa5.apps.tokenHotbar.updateDSA5Hotbar()}get isBrawling(){return this.getFlag("dsa5","isBrawling")}_onCreate(e,t,a){super._onCreate(e,t,a),this.refreshTokenbars()}_onDelete(e,t){super._onDelete(e,t),this.refreshTokenbars()}async brawlingDialog(){return await foundry.applications.api.DialogV2.confirm({window:{title:"BRAWLING.unarmEveryone"},content:`

    ${game.i18n.localize("BRAWLING.unarmEveryoneText")}

    `,rejectClose:!1,modal:!0})}async convertToBrawl(e=void 0){let t=e??!this.isBrawling,a=[],s=[],i=[];if(t){await this.setFlag("dsa5","unarmEveryone",await this.brawlingDialog());for(let n of this.combatants){if(!n.actor)return{};let r=await n.brawlingChange();n.actor.isToken?await n.actor.update(r.actorChange):a.push(r.actorChange),s.push(...r.tokenChange),o.brawlStart()}}else for(let n of this.combatants){if(!n.actor)return{};let r=await n.undoBrawlingChange();n.actor.isToken?await n.actor.update(r.actorChange):a.push(r.actorChange),s.push(...r.tokenChange),r.damage.brawlDamage>0&&i.push({name:n.token.name,id:n.token.id,data:r.damage})}await O.updateDocuments(a),await game.canvas.scene.updateEmbeddedDocuments("Token",s),await this.setFlag("dsa5","isBrawling",t),i.length&&await this.showBrawlingDamage(i)}async showBrawlingDamage(e){let t=await renderTemplate("systems/dsa5/templates/chat/brawling-damage.html",{messages:e});ChatMessage.create(g.chatDataSetup(t))}static async brawlStart(e=2e3,t=!0){t&&g.isActiveGM()&&await game.socket.emit("system.dsa5",{type:"brawlStart",payload:{}}),$(".bumFight").remove();let a=await renderTemplate("systems/dsa5/templates/system/bumFight/animation.html",{});$("body").append(a);let s=$(".bumFight");s.on("click",()=>s.remove()),s.addClass("fight"),setTimeout(function(){s.fadeOut(1e3,()=>s.remove())},e)}async nextRound(){if(game.user.isGM)for(let e of this.turns)await e.setFlag("dsa5","defenseCount",0);else await game.socket.emit("system.dsa5",{type:"clearCombat",payload:{}});return await super.nextRound()}async getDefenseCount(e){let t=this.getCombatantFromActor(e);return t&&t.getFlag("dsa5","defenseCount")||0}getCombatantFromActor(e){let t;return e.token?t=Array.from(this.combatants).find(a=>a.tokenId==e.token):t=Array.from(this.combatants).find(a=>a.actorId==e.actor),t?this.combatants.get(t.id):void 0}async updateDefenseCount(e){if(game.user.isGM){let t=this.getCombatantFromActor(e);t&&!nt(t.actor,"system.config.defense")&&await t.setFlag("dsa5","defenseCount",(t.getFlag("dsa5","defenseCount")||0)+1)}else await game.socket.emit("system.dsa5",{type:"updateDefenseCount",payload:{speaker:e}})}},wa=class extends Combatant{static{u(this,"DSA5Combatant")}constructor(e,t){e.flags==null&&(e.flags={}),fo(e.flags,{dsa5:{defenseCount:0}}),super(e,t)}brawlingChange(){let e=g.getSpeaker({actor:this.actor.id,scene:this.sceneId,token:this.token.id}),t=this.combat.getFlag("dsa5","unarmEveryone"),a=nt(e,"system.config.autoBar")?e.getActiveTokens().map(i=>({_id:i.id,bar1:{attribute:"status.temporaryLeP"}})):[],s={_id:e.id,system:{status:{temporaryLeP:{value:e.system.status.wounds.value,max:e.system.status.wounds.value}}}};if(t){let i=this.actor.items.filter(n=>n.type=="meleeweapon"&&n.system.worn.value&&!N.improvisedWeapon.test(n.name));i.length&&(s.items=i.map(n=>({_id:n.id,"system.worn.value":!1})))}return{tokenChange:a,actorChange:s}}async getBrawlingTable(){if(!this.brawlingTable){let t=(await game.packs.get(game.i18n.lang=="de"?"dsa5.patzer":"dsa5.botch").getDocuments({name__in:[game.i18n.lang=="de"?"Pr\xFCgelei - Verletzungen":"Brawling - Injuries"]}))[0];this.brawlingTable=t}return this.brawlingTable}async undoBrawlingChange(){let e=g.getSpeaker({actor:this.actor.id,scene:this.sceneId,token:this.token.id}),t=nt(e,"system.config.autoBar")?e.getActiveTokens().map(r=>({_id:r.id,bar1:{attribute:"status.wounds"}})):[],a=Math.max(0,e.system.status.temporaryLeP.max-e.system.status.temporaryLeP.value),s=0,i;if(a>0){i=await(await this.getBrawlingTable()).draw({displayChat:!1}),i=i.results[0];let r=i.getFlag("dsa5","brawlDamage");s=Math.round(a*r)}let n={_id:e.id,system:{status:{temporaryLeP:{value:0,max:0},wounds:{value:e.system.status.wounds.value-s}}}};return{tokenChange:t,actorChange:n,damage:{brawlDamage:s,result:i}}}async recalcInitiative(){if(this.initiative){let t={initiative:(await this.getFlag("dsa5","baseRoll")||0)+this.actor.system.status.initiative.value};await this.update(t)}}};Hooks.on("preCreateCombatant",(o,e,t)=>{let a=g.getSpeaker({actor:o.actorId,scene:o.sceneId,token:o.tokenId});if(nt(a.system,"merchant.merchantType")=="loot")return!1;if(o.combat.isBrawling){let s=o.brawlingChange();delete s.actorChange._id,a.update(s.actorChange).then(()=>{game.canvas.scene.updateEmbeddedDocuments("Token",s.tokenChange)})}});Hooks.on("deleteCombatant",(o,e,t)=>{let a=g.getSpeaker({actor:o.actorId,scene:o.sceneId,token:o.tokenId});if(nt(a.system,"merchant.merchantType")=="loot")return!1;o.combat.isBrawling&&o.undoBrawlingChange().then(async s=>{o.token&&(delete s.actorChange._id,await a.update(s.actorChange),await game.canvas.scene.updateEmbeddedDocuments("Token",s.tokenChange),s.damage.brawlDamage>0&&o.combat.showBrawlingDamage([{name:o.token.name,id:o.token.id,data:s.damage}]))})});Hooks.on("preDeleteCombat",(o,e,t)=>{if(!e.noHook&&o.isBrawling)return o.convertToBrawl(!1).then(()=>{o.delete({noHook:!0})}),!1});Hooks.on("updateCombatant",(o,e,t)=>{if(game.user.isGM)if(e.initiative){if(!o.getFlag("dsa5","baseRoll")){let s=`${e.initiative}`.split("."),i=Number(s[0])-Math.round(o.actor.system.status.initiative.value);o.setFlag("dsa5","baseRoll",i)}}else"initiative"in e&&e.initiative==null&&o.update({"flags.dsa5.-=baseRoll":null})});var xi=class o{static{u(this,"RepeatingEffectsHelper")}static async updateCombatHook(e,t,a,s){!t.round&&!t.turn||e.round!=0&&e.turns&&e.active&&e.previous.roundm.value).join("+");if(!i)continue;let n=await new Roll(i).evaluate(),r=await n.render(),l=game.i18n.localize(n.total>0?"CHATNOTIFICATION.regenerates":"CHATNOTIFICATION.getsHurt"),c=`${this.buildActorName(e)} ${l} ${game.i18n.localize(s)} ${r}`;await this.sendEventMessage(c,t,e),s=="wounds"?await e.actor.applyDamage(n.total*-1):await e.actor.applyMana(n.total*-1,s=="astralenergy"?"AsP":"KaP")}}static async applyBleeding(e,t){if(e.actor.system.status.wounds.value<1)return;let a=game.i18n.format("CHATNOTIFICATION.bleeding",{actor:this.buildActorName(e)});await this.sendEventMessage(a,t,e),await e.actor.applyDamage(1)}static async applyBurning(e,t){if(e.actor?.system.status.wounds.value<1)return;let a=e.actor?.system.condition.burning,s=z.resistantToEffect(e.actor,"burning"),i={0:"1",1:"1d3",2:"1d6",3:"2d6"}[a-s]||"1",n=await new Roll(i).evaluate(),r=await n.render(),l=game.i18n.format(`CHATNOTIFICATION.burning.${a}`,{actor:this.buildActorName(e),damage:r});await this.sendEventMessage(l,t,e),await e.actor.applyDamage(n.total)}static buildActorName(e){let t=e.token.name;return game.settings.get("dsa5","hideRegenerationToOwner")&&e.token.name!=e.token.actor.name&&(t+=` (${e.token.actor.name})`),e.token.actor.toAnchor({name:t}).outerHTML}static async sendEventMessage(e,t,a){if(game.settings.get("dsa5","hideRegenerationToOwner")){let s=t.combatants.get(a.id).players;s.push(...game.users.filter(n=>n.isGM).map(n=>n.id));let i=g.chatDataSetup(e,void 0,void 0,s);delete i.speaker,await ChatMessage.create(i)}else await ChatMessage.create(g.chatDataSetup(e))}};Hooks.on("updateCombat",xi.updateCombatHook);var{mergeObject:jn,duplicate:go}=foundry.utils,Ht=class o extends Application{static{u(this,"DSAIniTracker")}static get defaultOptions(){let e=super.defaultOptions;return jn(e,{classes:e.classes.concat(["dsa5","initTracker"]),template:"systems/dsa5/templates/system/initracker.html",dragDrop:[{dragSelector:".iniItem",dropSelector:[".iniTrackerList"]}],top:100,left:170,title:"DSAIniTracker",itemWidth:game.settings.get("dsa5","iniTrackerSize"),actorCount:game.settings.get("dsa5","iniTrackerCount"),position:game.settings.get("dsa5","iniTrackerPosition")}),e}setPosition({left:e,top:t,width:a,height:s,scale:i}={}){let n=super.setPosition({left:e,top:t,width:a,height:s,scale:i}),r=this.element[0];if(!r.style.width||a){let l=a||r.offsetWidth,c=r.style.maxWidth||window.innerWidth;n.width=a=Math.clamp(l,0,c),r.style.width=a+"px",a+n.left>window.innerWidth&&(e=n.left)}return game.settings.set("dsa5","iniTrackerPosition",{left:n.left,top:n.top}),n}static connectHooks(){Hooks.on("renderDSA5CombatTracker",(e,t,a)=>{game.settings.get("dsa5","enableCombatFlow")&&(game.combat?(game.dsa5.apps.initTracker||(game.dsa5.apps.initTracker=new o),game.dsa5.apps.initTracker.updateTracker(a)):game.dsa5.apps.initTracker&&(game.dsa5.apps.initTracker.close(),game.dsa5.apps.initTracker=void 0))})}updateTracker(e){this.combatData=e,this.render(!0,{focus:!1})}async getData(e){let t=this.combatData,a=o.defaultOptions.itemWidth,s=o.defaultOptions.actorCount,i=t.round,n=t.turns,r=[],l=game.settings.get("core",Combat.CONFIG_SETTING).skipDefeated,c=n.some(d=>d.active),m=t.turns.some(d=>d.owner&&!d.hasRolled&&(!game.user.isGM||t.combat.combatants.get(d.id).isNPC));if(n.length){let d=[],p=s,f=!1,h=-1,y=0,k=0,C;for(;!(p==0||k==s);){let v=go(n[y]),I=t.combat.combatants.get(v.id);f&&y==h&&(v.css=v.css.replace("active","")),!i||v.active&&!f||!c&&!f?(f=!0,h=y):I.getFlag("dsa5","waitInit")==t.round+k&&!I.defeated&&(game.user.isGM||!I.hidden)&&r.push(v),f&&!(l&&I.defeated)&&(game.user.isGM||!I.hidden)&&(v.round=t.round+k,v.owner&&I.token?.actor&&(v.maxLP=I.token.actor.system.status.wounds.max,v.currentLP=I.token.actor.system.status.wounds.value),C&&C!=v.round&&(v.newRound="newRound"),C=v.round,d.push(v),p--),y++,y>=n.length&&(y=0,k++)}t.turns=d}return t.isLastRound=t.turns[1]?.newRound,this.position.width=a*s+s*3+80,this.position.height=a+10,jn(t,{itemWidth:a,unRolled:m,waitingTurns:r}),this.conditionalPanToCurrentCombatant(t),t}hasChangedTurn(e){let t=e.turn!=this.lastTurnUpdate||e.round!=this.lastRoundUpdate;return this.lastTurnUpdate=e.turn,this.lastRoundUpdate=e.round,t}async conditionalPanToCurrentCombatant(e){if(!game.settings.get("dsa5","enableCombatPan"))return;let t=e.turns[0];if(!t)return;let a=e.combat.combatants.get(t.id);!a||!this.hasChangedTurn(e)||setTimeout(()=>{let s=a.token;!s||!s.object||!s.object.isVisible||(canvas.animatePan({x:s.x,y:s.y}),!(!a.actor||!a.actor.isOwner)&&s.object.control({releaseOthers:!0}))},300)}async _onWheelResize(e){let t=game.settings.get("dsa5","iniTrackerSize");e.originalEvent.deltaY>0?t=Math.min(140,t+5):t=Math.max(30,t-5),await game.settings.set("dsa5","iniTrackerSize",t),await this.render(!0)}activateListeners(e){super.activateListeners(e);let t=e.find(".dragHandler");new Draggable(this,e,t[0],this.options.resizable),t.on("wheel",async s=>(s.stopPropagation(),s.preventDefault(),await this._onWheelResize(s),!1)),e.find(".toggleTracker").click(()=>{let s=ui.combat;s.renderPopout(s)}),e.find(".combat-control").click(s=>this._onCombatControl(s)),e.find(".convertToBrawl").click(s=>{game.combat?.convertToBrawl()});let a=e.find(".iniItem");a.hover(this._onCombatantHoverIn.bind(this),this._onCombatantHoverOut.bind(this)),a.click(this._onCombatantMouseDown.bind(this)),e.find(".waitingTackerList .iniItem").mousedown(s=>this._onRightClick(s)),e.find(".combatant-control").click(s=>this._onCombatantControl(s)),e.find(".combatant .aggroButton").click(s=>{s.preventDefault(),s.stopPropagation(),Ge.runActAttackDialog()}),e.find(".rollMine").click(s=>this.rollMyChars()),game.user.isGM&&e.find(".rolledInit").click(s=>this.editCombatant(s))}rollMyChars(){game.user.isGM?this._getCombatApp().viewed.rollNPC({}):this._getCombatApp().viewed.rollAll({})}_onRightClick(e){if(e.button==2){let t=game.combat.combatants.get(e.currentTarget.dataset.combatantId);t.isOwner&&t.unsetFlag("dsa5","waitInit")}}editCombatant(e){this._getCombatApp()._onConfigureCombatant($(e.currentTarget))}_onCombatantControl(e){this._getCombatApp()._onCombatantControl(e)}_onCombatControl(e){e.currentTarget.dataset.control=="waitInit"?this.waitInit(e):this._getCombatApp()._onCombatControl(e)}async waitInit(e){await game.combat.combatants.get(game.combat.current.combatantId).setFlag("dsa5","waitInit",game.combat.current.round),e.currentTarget.dataset.control="nextTurn",this._getCombatApp()._onCombatControl(e)}_onCombatantHoverOut(e){this._getCombatApp()._onCombatantHoverOut(e)}_onCombatantHoverIn(e){this._getCombatApp()._onCombatantHoverIn(e)}_onCombatantMouseDown(e){this._getCombatApp()._onCombatantMouseDown(e)}_getCombatApp(){return game.combats.apps[0]}_canDragStart(e){return!1}_canDragDrop(e){return!1}_onDragStart(e){let t=$(e.currentTarget).closestData("combatant-id");e.dataTransfer.setData("text/plain",JSON.stringify({type:"IniChange",combatantId:t}))}_onDrop(e){JSON.parse(e.dataTransfer.getData("text/plain")).type=="IniChange"}};var rt=class extends Tour{static{u(this,"DSATour")}static tours=["systems/dsa5/modules/tours/lang/initial","systems/dsa5/modules/tours/lang/library","systems/dsa5/modules/tours/lang/actor"];static gmTours=["systems/dsa5/modules/tours/lang/mastermenu"];static async travelAgency(){let e=game.i18n.lang=="de"?"de":"en";console.log("Adding DSA/TDE Tours");for(let t of this.tours){let a=await game.dsa5.apps.DSATour.fromJSON(`${t.replace("/lang/",`/${e}/`)}.json`);game.tours.register(a.config.module,a.id,a)}if(game.user.isGM)for(let t of this.gmTours){let a=await game.dsa5.apps.DSATour.fromJSON(`${t.replace("/lang/",`/${e}/`)}.json`);game.tours.register(a.config.module,a.id,a)}}async _preStep(){this.currentStep.activateTab?ui.sidebar.activateTab(this.currentStep.activateTab):this.currentStep.activateLayer&&canvas.activeLayer.options.name!=this.currentStep.activateLayer?(await canvas[this.currentStep.activateLayer].activate(),await ta(100)):this.currentStep.appTab&&this.app.activateTab(this.currentStep.appTab)}exit(){super.exit()}async start(){if(this.config.preCommand){let t=Object.getPrototypeOf(async function(){}).constructor;await new t(this.config.preCommand).call(this)}if(this.app)for(await this.app.render(!0,{focus:!0});!this.app.rendered;)await ta(50);if(this.app||this.config.preCommand)for(;!$(this.steps[this.stepIndex+1].selector+":visible").length;)await ta(50);let e=await super.start();return $("#tooltip").show(),e}};var{mergeObject:ho}=foundry.utils,va=class{static{u(this,"PlayerMenuSubApp")}static template="";static rulePath={};async _getData(e){return{}}activateListeners(e){}async _renderData(e){let t=await this._getData(e);return ho(t,e),await renderTemplate(this.constructor.template,t)}async prepareApp(e){return{name:game.i18n.localize(`PLAYER.${this.constructor.name}`),view:await this._renderData(e)}}async render(){await game.dsa5.apps.playerMenu.render(!0)}async activateTab(){await game.dsa5.apps.playerMenu.activateTab(game.i18n.localize(`PLAYER.${this.constructor.name}`))}get actor(){return game.dsa5.apps.playerMenu.actor}async _onDrop(e){}};var{getProperty:yo,setProperty:bo,mergeObject:jt,duplicate:ko}=foundry.utils,ot=class o extends Application{static{u(this,"PlayerMenu")}constructor(e){super(e),this.entityAbilities=[],game.dsa5.apps.PlayerMenuSubApp=va,this.summoningModifiers=[{id:1,name:"CONJURATION.offensiveImprovement",descr:"CONJURATION.offensiveImprovementDescr",changes:[{key:"system.meleeStats.attack",mode:2,value:2},{key:"system.meleeStats.damage",mode:2,value:4},{key:"system.rangeStats.attack",mode:2,value:2},{key:"system.rangeStats.damage",mode:2,value:4}]},{id:2,name:"CONJURATION.defensiveImprovement",descr:"CONJURATION.defensiveImprovementDescr",changes:[{key:"system.meleeStats.parry",mode:2,value:2},{key:"system.totalArmor",mode:2,value:2},{key:"system.status.wounds.gearmodifier",mode:2,value:10}]},{id:3,name:"CONJURATION.speedImprovement",descr:"CONJURATION.speedImprovementDescr",changes:[{key:"system.status.speed.gearmodifier",mode:2,value:2},{key:"system.status.dodge.gearmodifier",mode:2,value:2}]},{id:4,name:"CONJURATION.magicalImprovement",descr:"CONJURATION.magicalImprovementDescr",changes:[],fun:N.magicalImprovement},{id:5,name:"CONJURATION.resistanceImprovement",descr:"CONJURATION.resistanceImprovementDescr",changes:[{key:"system.status.soulpower.gearmodifier",mode:2,value:2},{key:"system.status.toughness.gearmodifier",mode:2,value:2}]},{id:6,name:"CONJURATION.mentalImprovement",descr:"CONJURATION.mentalImprovementDescr",changes:[{key:"system.characteristics.mu.gearmodifier",mode:2,value:2},{key:"system.characteristics.kl.gearmodifier",mode:2,value:2},{key:"system.characteristics.in.gearmodifier",mode:2,value:2},{key:"system.characteristics.ch.gearmodifier",mode:2,value:2}]},{id:7,name:"CONJURATION.physicalImprovement",descr:"CONJURATION.physicalImprovementDescr",changes:[{key:"system.characteristics.ff.gearmodifier",mode:2,value:2},{key:"system.characteristics.ge.gearmodifier",mode:2,value:2},{key:"system.characteristics.ko.gearmodifier",mode:2,value:2},{key:"system.characteristics.kk.gearmodifier",mode:2,value:2}]}],this.conjurationData={qs:0,consumedQS:0,packageModifier:0,selectedIds:[],selectedEntityIds:[],selectedPackageIds:[],conjurationTypes:{1:game.i18n.localize("CONJURATION.demon"),2:game.i18n.localize("CONJURATION.elemental")},rules:{1:{de:{pack:"dsa5-core.corerules",name:"Beschw\xF6rungen"},en:{pack:"dsa5-core.coreenrules",name:"Summoning"}},2:{de:{pack:"dsa5-core.corerules",name:"Beschw\xF6rungen"},en:{pack:"dsa5-core.coreenrules",name:"Summoning"}}},conjurationType:1,skills:{1:["invocatioMinima","invocatioMinor","invocatioMaior"].map(t=>game.i18n.localize(`LocalizedIDs.${t}`)),2:["manifesto","elementalServant","callDjinn","servantEarth","servantFlame","servantCold","servantWave","servantCloud","servantOre"].map(t=>game.i18n.localize(`LocalizedIDs.${t}`))},modifiers:{1:this.summoningModifiers,2:this.summoningModifiers},moreModifiers:{2:[{name:game.i18n.localize("CONJURATION.groupSummoning"),options:[1,2,3,4,5,6,7,8].map(t=>({name:t,val:t*-2+2}))}]},postFunction:{}},this.subApps=[]}registerSubApp(e){this.subApps.push(e)}async rollConjuration(e){if(!this.conjuration)return ui.notifications.warn("CONJURATION.dragConjuration",{localize:!0});let t=$(e.currentTarget).closest(".item").attr("data-item-id"),a=this.actor.items.get(t),s=[{name:game.i18n.localize("conjuringDifficulty"),value:yo(this.conjuration,"system.conjuringDifficulty.value")||0,selected:!0}];if(this.conjurationData.packageModifier&&s.push({name:game.i18n.localize("summoningPackage"),value:this.conjurationData.packageModifier,selected:!0}),this.conjurationData.moreModifiers[this.conjurationData.conjurationType]){let i=this.conjurationData.moreModifiers[this.conjurationData.conjurationType].filter(n=>n.selected);for(let n of i)s.push({name:n.name,value:Number(n.selected),selected:!0})}this.actor.setupSkill(a,{moreModifiers:s,subtitle:` (${this.conjuration.name})`},void 0).then(async i=>{let n=await this.actor.basicTest(i);this.conjurationData.qs=n.result.qualityStep||0,this.render(!0)})}activateListeners(e){super.activateListeners(e),me(e),e.find(".conjurationData").change(t=>{let a=$(t.currentTarget);bo(this.conjurationData,a.attr("name"),a.val()),a.attr("data-refresh")&&this.render()}),e.find(".skill-select").click(t=>this.rollConjuration(t)),e.find(".initLibrary").click(async t=>{$(t.currentTarget).html(''),await game.dsa5.itemLibrary.buildEquipmentIndex(),this.render()}),e.find(".item-edit").click(t=>{let a=$(t.currentTarget).closest(".item").attr("data-item-id");this.actor.items.get(a).sheet.render(!0)}),e.find(".selectableRow").click(t=>this.selectImprovement(t)),e.find(".finalizeConjuration").click(()=>this.finalizeConjuration()),e.find(".ruleLink").click(t=>this.openRules(t)),e.find(".openChar").click(()=>{this.actor?.sheet.render(!0)}),e.find(".showCC").click(()=>{let t=new game.dsa5.apps.DSACharacterCalculator;t.actor=this.actor,t.render(!0)}),e.find(".showEntity").click(t=>{t.stopPropagation(),u(async()=>{(await fromUuid(t.currentTarget.dataset.uuid)).sheet.render(!0)},"fun")()}),e.find(".moreModifiers").change(t=>{let a=this.conjurationData.moreModifiers[this.conjurationData.conjurationType].find(s=>s.name==t.currentTarget.dataset.name);a.selected=$(t.currentTarget).val()});for(let t of this.subApps)t.activateListeners(e)}async openRules(e){let t=e.currentTarget.dataset.subapp,a=(t?this.subApps.find(i=>i.constructor.name==t).constructor.rulePath:this.conjurationData.rules[this.conjurationData.conjurationType])[game.i18n.lang];u(async()=>{let n=await game.packs.get(a.pack).getDocuments({name:a.name});for(let r of n)r.sheet.render(!0)},"fun")()}finalizeConjuration(){if(!this.conjurationData)return;if(!this.conjuration)return ui.notifications.warn("DSAError.noConjurationActive",{localize:!0});let e=[];for(let a of this.conjurationData.selectedIds)e.push(this.conjurationData.modifiers[this.conjurationData.conjurationType].find(s=>s.id==a));let t={source:this.conjuration.toObject(),creationData:{type:this.conjurationData.conjurationType,typeName:this.conjurationData.conjurationTypes[this.conjurationData.conjurationType],qs:this.conjurationData.qs,consumedQS:this.conjurationData.consumedQS,modifiers:e,entityIds:this.conjurationData.selectedEntityIds,packageIds:this.conjurationData.selectedPackageIds},summoner:{name:this.actor.name,img:this.actor.img}};game.user.isGM?o.createConjuration(t):(game.socket.emit("system.dsa5",{type:"summonCreature",payload:t}),ui.notifications.info("CONJURATION.requestSend",{localize:!0}))}static createConjuration({source:e,creationData:t,summoner:a}){new zi(e,a,t).render(!0)}selectImprovement(e){let t=Number(e.currentTarget.dataset.max)||1,a=Number(e.currentTarget.dataset.selected)||0;a>=t?$(e.currentTarget).removeClass("selected"):($(e.currentTarget).addClass("selected"),e.currentTarget.dataset.selected=a+1);let s=[],i=[],n=[],r=0,l=0;$(this._element).find(".selectableRow.selected").each((c,m)=>{for(let d=0;d0){if(this.conjuration=a,this.conjurationData.selectedIds=[],this.conjurationData.selectedEntityIds=[],this.conjurationData.selectedPackageIds=[],a.type=="creature"){for(let s of Object.keys(this.conjurationData.conjurationTypes))if(a.system.creatureClass.value.includes(this.conjurationData.conjurationTypes[s])){this.conjurationData.conjurationType=s;break}}}else this.trackedId=t.id,this.actor=a;this.render(!0)}else for(let a of this.subApps)if(await a._onDrop(t)===!0)break}async prepareEntityAbilities(){let e={entityAbilities:[],entityPackages:[]};if(game.dsa5.itemLibrary.equipmentBuild){let t=[game.i18n.localize("LocalizedIDs.all"),this.conjurationData.conjurationTypes[this.conjurationData.conjurationType]],a=await Promise.all((await game.dsa5.itemLibrary.getCategoryItems("trait",!1)).map(n=>n.getItem())),s=new Set,i=new Set;for(let n of a)n.system.distribution&&t.some(r=>n.system.distribution.includes(r))&&(n.system.traitType.value=="entity"&&!s.has(n.name)?(s.add(n.name),e.entityAbilities.push(n),n.count=this.conjurationData.selectedEntityIds.filter(r=>r==n.uuid).length,n.max=n.system.at.value||1):n.system.traitType.value=="summoning"&&!i.has(n.name)&&(i.add(n.name),n.count=this.conjurationData.selectedPackageIds.filter(r=>r==n.uuid).length,e.entityPackages.push(n)))}return e}async getData(e){let t=await super.getData(e);if(!game.user.isGM&&!this.actor&&(this.actor=game.user.character),this.actor){let a=this.conjurationData.qs-this.conjurationData.consumedQS+1,s=game.dsa5.itemLibrary.equipmentBuild,{entityAbilities:i,entityPackages:n}=await this.prepareEntityAbilities(),r=this.actor.items.filter(f=>this.conjurationData.skills[this.conjurationData.conjurationType].includes(f.name)&&["liturgy","ceremony","spell","ritual"].includes(f.type)).map(f=>f.toObject()),l=!1;for(let f of r)f.hasMighty=this.actor.items.find(h=>h.name==`${f.name} - ${game.i18n.localize("CONJURATION.powerfulCreature")}`),l||=f.hasMighty;let c=this.conjurationData.modifiers[this.conjurationData.conjurationType],m=l?2:1;for(let f of c)f.max=m,f.count=this.conjurationData.selectedIds.filter(h=>h==f.id).length;let d=this.conjurationData.moreModifiers[this.conjurationData.conjurationType];if(d){d=ko(d);for(let f of d)f.options=f.options.map(h=>(h.label=`${h.name} (${h.val})`,h))}let p=await renderTemplate("systems/dsa5/templates/system/conjuration/summoning.html",{actor:this.actor,conjuration:this.conjuration||{name:game.i18n.localize("CONJURATION.dragConjuration"),img:"icons/svg/mystery-man-black.svg"},conjurationData:this.conjurationData,services:a,conjurationModifiers:c,equipmentIndexLoaded:s,entityAbilities:i,entityPackages:n,moreModifiers:d,hasMighty:l});jt(t,{conjurationSheet:p,conjurationskills:r})}return jt(t,{actor:this.actor||{name:game.i18n.localize("CONJURATION.dragActor"),img:"icons/svg/mystery-man-black.svg"},conjurationData:this.conjurationData,conjurationTypes:this.conjurationData.conjurationTypes,canCalculate:g.moduleEnabled("dsa5-core")&&this.actor?.type=="character"}),await this.prepareSubApps(t),t}async prepareSubApps(e){e.subApps=[];for(let t of this.subApps)e.subApps.push(await t.prepareApp(e))}},zi=class extends ae{static{u(this,"ConjurationRequest")}constructor(e,t,a){super({title:`${game.i18n.localize("CONJURATION.request")} (${t.name})`,default:"ok",buttons:{}}),this.conjuration=e,this.summoner=t,this.creationData=a,this.confirmed=!1}async getData(e){let t=await super.getData(e),a=this.uniqueCountIds(this.creationData.entityIds);return jt(t,{conjuration:this.conjuration,summoner:this.summoner,confirmed:this.confirmed,services:this.creationData.qs-this.creationData.consumedQS+1,creationData:this.creationData,conjurationModifiers:this.creationData.modifiers,entityModifiers:await Promise.all(Object.keys(a).map(async s=>{let i=(await fromUuid(s)).toObject(!1);return i.uuid=s,i.count=a[s],i.cost=Number(i.system.AsPCost.value)*a[s],i})),packageModifiers:await Promise.all(this.creationData.packageIds.map(s=>fromUuid(s))),actor:this.actor}),t}static get defaultOptions(){let e=super.defaultOptions;return e.tabs=[{navSelector:".tabs",contentSelector:".content",initial:"main"}],jt(e,{classes:e.classes.concat(["dsa5","largeDialog"]),width:470}),e.template="systems/dsa5/templates/system/conjuration/request.html",e}uniqueCountIds(e){return e.reduce((t,a)=>(t[a]?++t[a]:t[a]=1,t),{})}async createActor(){this.confirmed=!0;let e=await g.getFolderForType("Actor",null,game.i18n.localize("PLAYER.conjuration")),t=await g.getFolderForType("Actor",e.id,this.creationData.typeName),a=this.creationData.qs-this.creationData.consumedQS+1;this.conjuration.folder=t.id,this.conjuration.effects||(this.conjuration.effects=[]);for(let c of this.creationData.modifiers)this.conjuration.effects.push({changes:c.changes,duration:{},icon:"icons/svg/aura.svg",label:game.i18n.localize(c.name),flags:{dsa5:{description:`${game.i18n.localize("PLAYER.conjuration")} ${game.i18n.localize("extensions")}`,hideOnToken:!0,hidePlayers:!1}}}),c.fun&&c.fun(this.conjuration,this.creationData);let s=this.uniqueCountIds(this.creationData.entityIds),i=(await Promise.all(Object.keys(s).map(c=>fromUuid(c)))).map(c=>{let m=c.toObject(!1);return s[c.uuid]>1&&(m.system.step={value:s[c.uuid]}),m}),n=(await Promise.all(this.creationData.packageIds.map(c=>fromUuid(c)))).map(c=>c.toObject(!1));this.conjuration.effects.push({changes:[],duration:{},icon:"icons/svg/aura.svg",id:"services",name:game.i18n.localize("PLAYER.services"),flags:{dsa5:{value:a,max:500,description:`${game.i18n.localize("PLAYER.conjuration")} ${game.i18n.localize("PLAYER.services")}`,manual:a,auto:0,hideOnToken:!0,hidePlayers:!1}}}),game.dsa5.apps.playerMenu.conjurationData.postFunction[this.creationData.type]&&await game.dsa5.apps.playerMenu.conjurationData.postFunction[this.creationData.type](this.conjuration,this.creationData.qs-this.creationData.consumedQS,this.creationData.type),this.conjuration.type=="creature"&&!this.conjuration.system.creatureClass.value.includes(this.creationData.typeName)&&(this.conjuration.system.creatureClass.value+=`, ${this.creationData.typeName}`),this.actor=await O.create(this.conjuration);let r=[...i,...n].filter(c=>!this.conjuration.items.find(m=>m.type==c.type&&c.name==m.name));await this.actor.createEmbeddedDocuments("Item",r);for(let c of n)await he.traitAdded(this.actor,c);for(let c of i)await he.traitAdded(this.actor,c);await this.actor.update({"system.status.wounds.value":this.actor.system.status.wounds.max});let l=await renderTemplate("systems/dsa5/templates/system/conjuration/chat.html",{actor:this.actor,modifiers:this.creationData.modifiers,summoner:this.summoner,summonerImg:ee.videoOrImgTag(this.summoner.img),conjureImg:ee.videoOrImgTag(this.actor.img),services:a});await ChatMessage.create(g.chatDataSetup(l)),this.render()}activateListeners(e){super.activateListeners(e),e.find(".createActor").click(()=>{this.createActor()}),e.on("mousedown",".newNPC",async t=>{let a=t.currentTarget.dataset.id;t.button==2&&(game.actors.get(a).delete(),$(t.currentTarget).remove())}),e.on("click",".newNPC",async t=>{let a=t.currentTarget.dataset.id;game.actors.get(a).sheet.render(!0)}),e.on("dragstart",".newNPC",t=>{t.stopPropagation();let s={type:"Actor",uuid:t.currentTarget.dataset.uuid};t.originalEvent.dataTransfer.setData("text/plain",JSON.stringify(s))}),e.find(".showEntity").click(t=>{t.stopPropagation(),u(async()=>{(await fromUuid(t.currentTarget.dataset.uuid)).sheet.render(!0)},"fun")()})}};var{mergeObject:Ni,getProperty:V,duplicate:Ri}=foundry.utils,Be=u(o=>class extends o{static get defaultOptions(){let e=super.defaultOptions;return Ni(e,{classes:e.classes.concat(["merchant-sheet"])}),e}static get merchantTemplate(){return"systems/dsa5/templates/actors/merchant/merchant-sheet.html"}get template(){if(this.merchantSheetActivated())switch(V(this.actor.system,"merchant.merchantType")){case"merchant":return"systems/dsa5/templates/actors/merchant/merchant-limited.html";case"loot":return"systems/dsa5/templates/actors/merchant/merchant-limited-loot.html";case"epic":return"systems/dsa5/templates/actors/merchant/merchant-epic.html";default:return super.template}return this.constructor.merchantTemplate}merchantSheetActivated(){return this.showLimited()||this.playerViewEnabled()&&["merchant","loot","epic"].includes(V(this.actor.system,"merchant.merchantType"))}async allowMerchant(e,t){let a=Ri(this.actor.ownership),s=t?1:0;for(let i of e)a[i]=s;await this.actor.update({ownership:a},{diff:!1,recursive:!1,noHook:!0})}activateListeners(e){super.activateListeners(e),e.find(".allowMerchant").click(async t=>{let a=t.currentTarget.dataset.userId,s=$(t.currentTarget).find("i");await this.allowMerchant([a],!s.hasClass("fa-check-circle")),s.toggleClass("fa-circle fa-check-circle")}),e.find(".toggleAllAllowMerchant").click(async t=>{let a=game.users.filter(i=>!i.isGM).map(i=>i.id),s=t.currentTarget.dataset.lock=="true";await this.allowMerchant(a,s),this.render()}),e.find(".lockTradeSection").click(t=>this.lockTradeSection(t)),e.find(".item-tradeLock").click(t=>this.toggleTradeLock(t)),e.find(".randomGoods").click(t=>game.dsa5.dialogs.RandomGoodsAddition.showDialog(this.actor,t)),e.find(".clearInventory").click(t=>this.clearInventory(t)),e.find(".removeOtherTradeFriend").click(()=>this.removeOtherTradeFriend()),e.find(".choseTradefriend").click(()=>this.choseTradefriend()),e.find(".setCustomPrice").click(t=>$(t.currentTarget).addClass("edit")),e.find(".customPriceTag").change(async t=>this.setCustomPrice(t)).blur(t=>$(t.currentTarget).closest(".setCustomPrice").removeClass("edit")),e.find(".buy-item").click(t=>{this.advanceWrapper(t,"buyItem",t),K.playMoneySound()}),e.find(".sell-item").click(t=>{this.advanceWrapper(t,"sellItem",t),K.playMoneySound()}),e.find(".item-external-edit").click(t=>{t.preventDefault();let a=this._getItemId(t);this.getTradeFriend().items.get(a).sheet.render(!0)}),e.find(".changeAmountAllItems").mousedown(t=>this.changeAmountAllItems(t)),e.find(".gearSearch").prop("disabled",!1)}_canDragStart(e){return!this.merchantSheetActivated()&&this.isEditable}async toggleTradeLock(e){let t=this._getItemId(e),a=this.actor.items.get(t);this.actor.updateEmbeddedDocuments("Item",[{_id:a.id,"system.tradeLocked":!a.system.tradeLocked}])}async setCustomPrice(e){e.stopPropagation(),e.preventDefault();let t=this._getItemId(e);await this.actor.updateEmbeddedDocuments("Item",[{_id:t,"flags.dsa5.customPriceTag":Number(e.target.value)}])}removeOtherTradeFriend(){this.otherTradeFriend=void 0,this.render(!0)}async choseTradefriend(){(await Pi.getDialog(this)).render(!0)}async lockTradeSection(e){let t=[],a=this.filterRule(e),s;for(let i of this.actor.items)if(a(i)){let n=i.toObject();s===void 0&&(s=!n.system.tradeLocked),n.system.tradeLocked=s,t.push(n)}this.actor.updateEmbeddedDocuments("Item",t)}filterRule(e){let t=e.currentTarget.dataset.type;return b.equipmentTypes[t]?a=>a.type=="equipment"&&a.system.equipmentType.value==t:a=>a.type==t&&b.equipmentCategories.has(a.type)}async changeAmountAllItems(e){let t=[],a=this.filterRule(e);for(let s of this.actor.items)if(a(s)){let i=s.toObject();N.increment(e,i,"system.quantity.value",0),t.push(i)}this.actor.updateEmbeddedDocuments("Item",t)}async buyItem(e){await this.transferItem(this.actor,this.getTradeFriend(),e,!0)}async sellItem(e){await this.transferItem(this.getTradeFriend(),this.actor,e,!1)}async transferItem(e,t,a,s=!0){let i=this._getItemId(a),n=a.currentTarget.dataset.price,r=a.ctrlKey?10:1;game.user.isGM?await this.constructor.finishTransaction(e,t,n,i,s,r):(this.constructor.noNeedToPay(t,e,n)||await Q.canPay(t,n,!0))&&game.socket.emit("system.dsa5",{type:"trade",payload:{target:this.constructor.transferTokenData(t),source:this.constructor.transferTokenData(e),price:n,itemId:i,buy:s,amount:r}})}static transferTokenData(e){let t={actor:e.id};return e.token&&(t.token=e.token.id),t}static async finishTransaction(e,t,a,s,i,n){let r=e.items.get(s).toObject();if(Number(r.system.quantity.value)>0){n=Math.min(Number(r.system.quantity.value),n),a=`${Number(a)*n}`;let l=this.noNeedToPay(t,e,a);if(l||await Q.payMoney(t,a,!0,!1))if(V(r,"system.worn.value")&&(r.system.worn.value=!1),i){let m=await this.updateTargetTransaction(t,r,n,e,a);await this.updateSourceTransaction(e,t,r,a,s,n),await this.transferNotification(r,t,e,i,a,n,l,m),await this.selfDestruction(e)}else{await this.updateSourceTransaction(e,t,r,a,s,n);let m=await this.updateTargetTransaction(t,r,n,e,a);await this.transferNotification(r,e,t,i,a,n,l,m)}}e.sheet.render(),t.sheet.render(),game.socket.emit("system.dsa5",{type:"refreshSheets",payload:{sheets:[{id:e.id,type:"ActorSheet"},{id:t.id,type:"ActorSheet"}]}})}static isTemporaryToken(e){return V(e.system,"merchant.merchantType")=="loot"&&V(e.system,"merchant.temporary")}static async selfDestruction(e){if(this.isTemporaryToken(e)&&!e.items.some(a=>b.equipmentCategories.has(a.type)||a.type=="money"&&a.system.quantity.value>0)){game.socket.emit("system.dsa5",{type:"hideDeletedSheet",payload:{target:this.transferTokenData(e)}});let a=e.getActiveTokens().map(s=>s.id);await canvas.scene.deleteEmbeddedDocuments("Token",a),await game.actors.get(e.id).delete(),this.hideDeletedSheet(e)}}static async hideDeletedSheet(e){e.sheet.close(!0)}static async transferNotification(e,t,a,s,i,n,r,l){let c=game.settings.get("dsa5","merchantNotification");if(c==0||V(e,"system.equipmentType.value")=="service")return;let m="MERCHANT."+(s?"buy":"sell")+(r?"Loot":"")+"Notification",d=e.type=="money"?game.i18n.localize(e.name):l.toAnchor().outerHTML,p=game.i18n.format(m,{item:d,source:t.name,target:a.name,amount:n,price:i,buy:s}),f=g.chatDataSetup(p);c==2&&(f.whisper=ChatMessage.getWhisperRecipients("GM").map(h=>h.id)),await ChatMessage.create(f)}static noNeedToPay(e,t,a){return a==0||V(e.system,"merchant.merchantType")=="loot"||V(t.system,"merchant.merchantType")=="loot"}static async updateSourceTransaction(e,t,a,s,i,n){let r=Ri(a);Number(r.system.quantity.value)>n||r.type=="money"?(r.system.quantity.value=Number(r.system.quantity.value)-n,await e.updateEmbeddedDocuments("Item",[r],{render:!1})):await e.deleteEmbeddedDocuments("Item",[i],{render:!1}),this.noNeedToPay(e,t,s)||await Q.getMoney(e,s,!0,!1)}static async updateTargetTransaction(e,t,a,s,i){let n=Ri(t);if(V(n,"system.equipmentType.value")=="service"){let l=game.i18n.format("MERCHANT.buyNotification",{item:n.name,amount:a,source:e.name,target:s.name,price:i});ChatMessage.create(g.chatDataSetup(l))}else{let l=e.items.find(c=>D.areEquals(n,c));return n.system.quantity.value=a,l?(await D.stackItems(l,n,e,!1),l):(await e.createEmbeddedDocuments("Item",[n],{render:!1}))[0]}}getTradeFriend(){return this.otherTradeFriend||game.user.character}async _manageDragItems(e,t){switch(t){case"creature":case"npc":case"character":this.setTradeFriend(e);break;default:return super._manageDragItems(e,t)}}async _onDropActor(e,t){let a=this.actor.limited,s=this.actor.isOwner;if(!(a||s))return!1;let{item:i,typeClass:n,selfTarget:r}=await Ee(t,this.id,!1);if(!r&&(s||a&&i.documentName=="Actor"))return await this._manageDragItems(i,n)}setTradeFriend(e){let t=game.actors.get(e._id);t.isOwner&&(this.otherTradeFriend=t,this.render(!0))}async _render(e=!1,t={}){if(!game.user.isGM&&V(this.actor.system,"merchant.merchantType")=="loot"&&V(this.actor.system,"merchant.locked")){foundry.audio.AudioHelper.play({src:"sounds/lock.wav",loop:!1},!1);return}await super._render(e,t)}_togglePlayerview(e){this.actor.update({"system.merchant.playerView":!V(this.actor.system,"merchant.playerView")})}playerViewEnabled(){return V(this.actor.system,"merchant.playerView")}async clearInventory(e){await foundry.applications.api.DialogV2.confirm({window:{title:"MERCHANT.clearInventory"},content:game.i18n.localize("MERCHANT.deleteAllGoods"),rejectClose:!1,modal:!0})&&this.removeAllGoods(this.actor,e)}async removeAllGoods(e,t){let a=$(t.currentTarget).text();$(t.currentTarget).html(' ');let s=e.items.filter(i=>b.equipmentCategories.has(i.type)&&!V(i,"worn.value")).map(i=>i.id);await e.deleteEmbeddedDocuments("Item",s),$(t.currentTarget).text(a)}async getData(e){let t=await super.getData(e);return t.merchantType=V(this.actor.system,"merchant.merchantType")||"none",t.merchantTypes={none:game.i18n.localize("MERCHANT.typeNone"),merchant:game.i18n.localize("MERCHANT.typeMerchant"),loot:game.i18n.localize("MERCHANT.typeLoot"),epic:game.i18n.localize("MERCHANT.typeEpic")},t.invName=t.merchantTypes[t.merchantType],t.players=game.users.filter(a=>!a.isGM).map(a=>(a.allowedMerchant=this.actor.testUserPermission(a,"LIMITED",!1),a.buyingFactor=V(this.actor.system,`merchant.factors.buyingFactor.${a.id}`),a.sellingFactor=V(this.actor.system,`merchant.factors.sellingFactor.${a.id}`),a)),t.merchantType!="epic"?(this.prepareStorage(t),this.merchantSheetActivated()&&(this.filterWornEquipment(t),this.prepareTradeFriend(t),t.prepare.inventory.misc.items.length==0&&(t.prepare.inventory.misc.show=!1))):(this.prepareStorage(t),t.garadanOptions={1:game.i18n.localize("GARADAN.1"),2:game.i18n.localize("GARADAN.2"),3:game.i18n.localize("GARADAN.3"),4:game.i18n.localize("GARADAN.4"),6:game.i18n.localize("GARADAN.6")}),t.hasOtherTradeFriend=!!this.otherTradeFriend,t}filterWornEquipment(e){for(let[t,a]of Object.entries(e.prepare.inventory))a.items=a.items.filter(s=>!V(s,"system.worn.value"))}prepareStorage(e){if(e.merchantType=="merchant")for(let[t,a]of Object.entries(e.prepare.inventory))for(let s of a.items)s.defaultPrice=this.getItemPrice(s),s.calculatedPrice=Number(parseFloat(`${s.defaultPrice*(V(this.actor.system,"merchant.sellingFactor")||1)}`).toFixed(2))*(V(this.actor.system,`merchant.factors.sellingFactor.${game.user.id}`)||1),s.priceTag=` / ${s.calculatedPrice}`;else if(e.merchantType=="loot"){for(let[a,s]of Object.entries(e.prepare.inventory))for(let i of s.items)i.calculatedPrice=this.getItemPrice(i);let t={items:e.prepare.money.coins.map(a=>(a.name=game.i18n.localize(a.name),a)),show:!0,dataType:"money"};t.items.length&&(e.prepare.inventory.money=t)}}getItemPrice(e){return Number(V(e,"flags.dsa5.customPriceTag"))||(e.type=="consumable"?D.getSubClass(e.type).consumablePrice(e):Number(e.system.price.value))}prepareTradeFriend(e){let t=this.getTradeFriend();if(t){let a=t.prepareItems({details:[]}),s=V(this.actor.system,"merchant.merchantType")=="loot"?1:(V(this.actor.system,"merchant.buyingFactor")||1)*(V(this.actor.system,`merchant.factors.buyingFactor.${game.user.id}`)||1),i=this.prepareSellPrices(a.inventory,s);i.misc.items.length==0&&(i.misc.show=!1),e.merchantType=="loot"&&(i.money={items:a.money.coins.map(n=>(n.name=game.i18n.localize(n.name),n)),show:!0,dataType:"money"}),Ni(e,{tradeFriend:{img:t.img,name:t.name,inventory:i,money:a.money}})}else Ni(e,{tradeFriend:{inventory:[],money:{coins:[]}}})}prepareSellPrices(e,t){for(let[a,s]of Object.entries(e))for(let i of s.items)i.calculatedPrice=Number(parseFloat(`${this.getItemPrice(i)*t}`).toFixed(2));return e}},"MerchantSheetMixin"),Pi=class o extends foundry.applications.api.HandlebarsApplicationMixin(foundry.applications.api.ApplicationV2){static{u(this,"SelectTradefriendDialog")}static DEFAULT_OPTIONS={window:{title:"DIALOG.setTargetToUser",resizable:!0},position:{width:400}};static PARTS={main:{template:"systems/dsa5/templates/dialog/selectTradeFriend.html"}};async _prepareContext(e){let t=await super._prepareContext(e);return t.users=game.user.isGM?await game.dsa5.apps.gameMasterMenu.getTrackedHeros():game.actors.filter(a=>a.isOwner),t}static async getDialog(e){let t=new o;return t.actor=e,t}_onRender(e,t){super._onRender(t),$(this.element).find(".combatant").on("click",s=>this.setTargetToUser(s))}setTargetToUser(e){this.actor.setTradeFriend({_id:e.currentTarget.dataset.id}),this.close()}},Ta=class extends Dialog{static{u(this,"RandomGoodsAddition")}static get template(){return"systems/dsa5/templates/dialog/randomGoods-dialog.html"}static async contentData(e={}){return{categories:Array.from(b.equipmentCategories),options:e}}static async showDialog(e,t,a={}){let s=await renderTemplate(this.template,await this.contentData(a));new game.dsa5.dialogs.RandomGoodsAddition({title:game.i18n.localize("MERCHANT.randomGoods"),content:s,default:"Yes",options:a,buttons:{Yes:{icon:'',label:game.i18n.localize("yes"),callback:u(i=>this.addRandomGoods(e,i,t),"callback")},cancel:{icon:'',label:game.i18n.localize("cancel")}}}).render(!0)}static async generateItems(e,t){let a=game.dsa5.itemLibrary;await a.buildEquipmentIndex();let s=[];for(let i of e.find('input[type="checkbox"]:checked')){let n=i.value,r=Number(e.find(`input[name="each_${n}"]`).val()),l=Number(e.find(`input[name="number_${n}"]`).val()),c=(await a.getRandomItems(n,l)).map(m=>{let d=m.toObject();return d.system.quantity.value=r,d});s.push(...c)}return this.filterSeen(s,t)}static filterSeen(e,t){let a={},s=(t?.items||[]).reduce((n,r)=>(n.add(`${r.type}_${r.name}`),n),new Set);return e.filter(n=>{let r=V(n,"system.effect");r=typeof r=="object"&&r!==null&&V(r,"attributes")||"";let l=Number(V(n,"system.price.value"))||0;if(r!=""||l>1e4)return!1;let c=`${n.type}_${n.name}`;return(a.hasOwnProperty(c)?!1:a[c]=!0)&&!s.has(c)})}static async addRandomGoods(e,t,a){let s=$(a.currentTarget).text();$(a.currentTarget).html(' '),await e.createEmbeddedDocuments("Item",await this.generateItems(t,e)),$(a.currentTarget).text(s)}};var Ie=class extends Be(Re){static{u(this,"MerchantSheetDSA5")}};function Gn(){game.socket.on("system.dsa5",o=>{switch(o.type){case"brawlStart":vt.brawlStart(2e3,!1);return;case"hideDeletedSheet":let e=o.payload.target.token?game.actors.tokens[o.payload.target.token]:game.actors.get(o.payload.target.actor);Ie.hideDeletedSheet(e);return;case"refreshSheets":for(let t of Object.values(ui.windows))o.payload.sheets.find(a=>t?.options?.baseApplication==a.type&&a.id==t.object?.id)&&t.render(!0);break;default:if(xe.socketListeners(o))return}if(g.isActiveGM())switch(o.type){case"updateKeepField":b.allowedforeignfields.includes(o.payload.field)&&game.actors.get(o.payload.actorId).update({[o.payload.field]:o.payload.updateData});break;case"target":{let e=game.scenes.get(o.payload.scene);new Token(e.getEmbeddedDocument("Token",o.payload.target)).actor.update({"flags.oppose":o.payload.opposeFlag})}break;case"addEffect":Z.applyEffect(o.payload.id,o.payload.mode,o.payload.actors);break;case"updateMsg":game.messages.get(o.payload.id).update(o.payload.updateData);break;case"deleteMsg":game.messages.get(o.payload.id).delete();break;case"showDamage":ee.showDamage(game.messages.get(o.payload.id),o.payload.hide);break;case"hideQueryButton":ee.hideReactionButton(o.payload.id);break;case"updateGroupCheck":ie.rerenderGC(game.messages.get(o.payload.messageId),o.payload.data);break;case"apTracker":_.receiveSocketEvent(o);break;case"updateAttackMessage":game.messages.get(o.payload.messageId).update({"flags.data.unopposedStartMessage":o.payload.startMessageId});break;case"clearCombat":game.combat&&game.combat.nextRound();break;case"clearOpposed":ee.clearOpposed(game.actors.get(o.payload.actorId));break;case"updateDefenseCount":game.combat&&game.combat.updateDefenseCount(o.payload.speaker);break;case"trade":{let e=o.payload.source.token?game.actors.tokens[o.payload.source.token]:game.actors.get(o.payload.source.actor),t=o.payload.target.token?game.actors.tokens[o.payload.target.token]:game.actors.get(o.payload.target.actor);Ie.finishTransaction(e,t,o.payload.price,o.payload.itemId,o.payload.buy,o.payload.amount)}break;case"playWhisperSound":o.payload.whisper.includes(game.user.id)&&foundry.audio.AudioHelper.play({src:o.payload.soundPath,volume:.8,loop:!1},!1);break;case"socketedConditionAddActor":fromUuid(o.payload.id).then(e=>{new J(e).socketedConditionAddActor(o.payload.actors.map(a=>game.actors.get(a)),o.payload.data)});break;case"socketedConditionAdd":fromUuid(o.payload.id).then(e=>{new J(e).socketedConditionAdd(o.payload.targets,o.payload.data)});break;case"socketedRemoveCondition":fromUuid(o.payload.id).then(e=>{new J(e).socketedRemoveCondition(o.payload.targets,o.payload.coreId)});break;case"socketedActorTransformation":fromUuid(o.payload.id).then(e=>{new J(e).socketedActorTransformation(o.payload.targets,o.payload.update)});break;case"itemDrop":{let e=o.payload.sourceActorId?game.actors.get(o.payload.sourceActorId):void 0;fromUuid(o.payload.itemId).then(t=>{Qs(e,t,o.payload.data,o.payload.amount)})}break;case"finalizeFoodContribution":case"finalizeidentification":case"updateHits":case"hideResistButton":break;case"reduceGroupSchip":O.reduceGroupSchip();break;case"summonCreature":ot.createConjuration(o.payload);break;default:console.warn(`Unhandled socket data type ${o.type}`)}})}u(Gn,"connectSocket");function Li(){game.i18n.lang=="de"?game.dsa5.apps.journalBrowser.manuals.push({id:"Game Manual (Foundry VTT)",path:"systems/dsa5/modules/journal/bookde.json",visible:!0}):game.dsa5.apps.journalBrowser.manuals.push({id:"Game Manual (Foundry VTT)",path:"systems/dsa5/modules/journal/booken.json",visible:!0})}u(Li,"registerGameManual");function _i(){Hooks.on("ready",async()=>{Gn(),g.moduleEnabled("vtta-tokenizer")&&!game.settings.get("dsa5","tokenizerSetup")&&game.user.isGM&&(await game.settings.set("vtta-tokenizer","default-frame-pc","[data] systems/dsa5/icons/backgrounds/token_green.webp"),await game.settings.set("vtta-tokenizer","default-frame-npc","[data] systems/dsa5/icons/backgrounds/token_black.webp"),await game.settings.set("vtta-tokenizer","default-frame-neutral","[data] systems/dsa5/icons/backgrounds/token_blue.webp"),await game.settings.set("dsa5","tokenizerSetup",!0)),g.moduleEnabled("dice-so-nice")&&!game.settings.get("dsa5","diceSetup")&&game.user.isGM&&(await game.settings.set("dice-so-nice","immediatelyDisplayChatMessages",!0),await game.settings.set("dsa5","diceSetup",!0)),await Ft.firstTimeMessage(),D.setupSubClasses(),it.showOneMessage(),Xe.registerTokenHotbar(),Rn(),Ht.connectHooks();let o=u(e=>{e.tabName=="settings"&&(rt.travelAgency(),Hooks.off("changeSidebarTab",o))},"hook");Hooks.on("changeSidebarTab",o),xn(),gn(),_e.bindAuraHooks(),Li(),Hooks.call("DSA5ready",game.dsa5)})}u(_i,"default");var{getProperty:Bn}=foundry.utils;function vo(o,e,t){if(e.system.isPriest&&e.system.isMage){let s=`
    `;o.find(".col.middle").prepend(s),o.find(".bar3 input").change(async i=>{let n=i.currentTarget,r=n.value.trim(),l=r.startsWith("+")||r.startsWith("-");r.startsWith("=")&&(r=r.slice(1));let c=Number(r),m=n.name.split(".").reduce((d,p)=>d[p],e);await e.update({[n.name]:l?m+c:c}),t.clear()})}}u(vo,"addThirdBarToHUD");function To(o,e,t){if(!game.user.isGM)return;let a=o.object.actor;if(a.isToken){if(canvas.tokens.controlled.length>=2){let s=a._id;if(!canvas.tokens.controlled.every(n=>n.actor?._id==s))return;e.find(".col.left").prepend(qn("swarm.combine"));let i=e.find('.control-icon[data-action="swarm"]');i.click(()=>{Ao(a,o.object.document),i.remove()})}else if(a.isSwarm()){e.find(".col.left").prepend(qn("swarm.split"));let s=e.find('.control-icon[data-action="swarm"]');s.click(()=>{So(a,o.object.document),s.remove()})}}}u(To,"swarmButtons");var Fi=class extends foundry.applications.api.DialogV2{static{u(this,"SwarmDialog")}_onRender(e,t){super._onRender(t),$(this.element).find('input[type="range"]').on("change",s=>{$(s.currentTarget).closest(".row-section").find(".range-value").html($(s.currentTarget).val())})}};function qn(o){return`
    `}u(qn,"swarmHud");async function So(o,e){let t=Number(o.system.swarm.count)-1,a=await renderTemplate("systems/dsa5/templates/dialog/swarm-split-dialog.html",{actor:o,maxSplitsize:t});new Fi({window:{title:"swarm.split"},content:a,buttons:[{action:"yes",icon:"fa fa-check",label:"ok",default:!0,callback:u(async(s,i,n)=>{let r=i.form.elements.newswarmsplit.valueAsNumber,l=e.toObject();delete l._id;let c=Math.floor(o.system.status.wounds.value/o.system.swarm.count*r),m=o.system.status.wounds.value-c;await o.update({"system.swarm.count":o.system.swarm.count-r,"system.status.wounds.value":m},{skipSwarmUpdate:!0});let d=(await canvas.scene.createEmbeddedDocuments("Token",[l]))[0];await d.actor.update({"system.swarm.count":r,"system.status.wounds.value":c},{skipSwarmUpdate:!0});let p=["x","y"][Math.floor(Math.random()*2)],f=Math.random()>.5?1:-1;await canvas.scene.updateEmbeddedDocuments("Token",[{_id:d.id,[p]:e[p]+canvas.scene.grid.size*f}])},"callback")},{action:"delete",icon:"fas fa-trash",label:"cancel"}]}).render(!0)}u(So,"splitSwarm");async function Ao(o,e){let t=0,a=0;for(let i of canvas.tokens.controlled)t+=Number(i.actor.system.swarm?.count)||1,a+=Number(i.actor.system.status.wounds.value);await e.actor.update({"system.swarm.count":t,"system.status.wounds.value":a},{skipSwarmUpdate:!0});let s=canvas.tokens.controlled.map(i=>i.id).filter(i=>i!=e.id);await canvas.scene.updateEmbeddedDocuments("Token",s.map(i=>({_id:i,x:e.x,y:e.y}))),await canvas.scene.deleteEmbeddedDocuments("Token",s)}u(Ao,"combineSwarm");function Hi(){Hooks.on("renderTokenHUD",(o,e,t)=>{Ve.hide(o.object);let a=o.object.actor;a&&(vo(e,a,o),To(o,e,t),game.dsa5.apps.LightDialog?.lightHud(e,a,t)),e.find('.control-icon[data-action="target"]').mousedown(s=>{s.button==2&&(game.user.updateTokenTargets([]),$(s.currentTarget).trigger("click"),s.preventDefault())}),e.find(".attribute input").off("change"),H.renderTokenHUD(o,e,t)}),Hooks.on("renderTokenConfig",(o,e,t)=>{if(t.isPrototype){let a=Bn(o.actor,"system.config.autoBar"),s=e.find(".bar2-max").closest(".form-group"),i=$(`

    ${game.i18n.localize("ActorConfig.AutoBarHint")}

    @@ -73,7 +73,7 @@ var tr=Object.defineProperty;var u=(o,e)=>tr(o,"name",{value:e,configurable:!0})

    ${game.i18n.localize("ActorConfig.AutoSizeHint")}

    `),s.after(i),i.find(".autoSize").on("change",r=>{o.actor.update({"system.config.autoSize":r.currentTarget.checked})})}})}u(Hi,"default");var{getProperty:Wn}=foundry.utils;function ji(){Token.prototype._drawEffects=async function(){this.effects.renderable=!1,this.effects.removeChildren().forEach(i=>i.destroy()),this.effects.bg=this.effects.addChild(new PIXI.Graphics),this.effects.overlay=null;let t=[],a=!1;this.actor&&(t=await this.actor.actorEffects(),this.actor.isSwarm()&&t.push(new ActiveEffect({img:"systems/dsa5/icons/thirdparty/bee.svg",id:"swarm",name:"swarm.name",flags:{dsa5:{value:this.actor.system.swarm?.effectiveCount||1}}})));let s=[];for(let i of t)i.img&&(i.getFlag("core","overlay")&&!a?(s.push(this._drawOverlay(i.img,i.tint)),a=!0):s.push(this._drawEffect(i.img,i.tint,Wn(i,"flags.dsa5.value"))));await Promise.allSettled(s),this.effects.renderable=!0,this.renderFlags.set({refreshEffects:!0})},Token.prototype._refreshEffects=function(){let t=0,a=Math.round(canvas.dimensions.size/10)*2,s=Math.floor(this.document.height*5),i=this.effects.bg.clear().beginFill(0,.4).lineStyle(1,0);for(let n of this.effects.children)if(n!==i&&!n.isCounter)if(n===this.effects.overlay){let{width:r,height:l}=this.getSize(),c=Math.min(r*.6,l*.6);n.width=n.height=c,n.position=this.getCenterPoint({x:0,y:0}),n.anchor.set(.5,.5)}else{if(n.width=n.height=a,n.x=Math.floor(t/s)*a,n.y=t%s*a,i.drawRoundedRect(n.x+1,n.y+1,a-2,a-2,2),n.counter>1&&!n.counterDrawn){let r=game.dsa5.config.effectTextStyle,l=game.settings.get("dsa5","statusEffectCounterColor");r._fill=/^#[0-9A-F]+$/.test(l)?l:"#000000";let c=this.effects.addChild(new PreciseText(n.counter,r));c.x=n.x,c.y=n.y,c.isCounter=!0,n.counterDrawn=!0}t++}},Token.prototype._drawEffect=async function(t,a,s){if(!t)return;let i=await loadTexture(t,{fallback:"icons/svg/hazard.svg"}),n=new PIXI.Sprite(i);return n.tint=a??16777215,n.counter=s,this.effects.addChild(n)},Token.prototype.drawAuras=async function(t=!1){await _e.drawAuras(this,t)};let o=Token.prototype._onClickLeft2,e=u(t=>t?["merchant","loot"].includes(Wn(t.system,"merchant.merchantType")):!1,"isMerchant");Token.prototype._onClickLeft2=function(t){if(!(game.user.isGM||!ne.isEnabled||!e(this.actor)||ne.inDistance(this)))return ui.notifications.warn("DSAError.notInRangeToLoot",{localize:!0});o.call(this,t)}}u(ji,"default");var{getProperty:Un}=foundry.utils;function Gi(){Hooks.on("renderSettings",(o,e,t)=>{let a=$(``);a.on("click",()=>{window.open("https://github.com/Plushtoast/dsa5-foundryVTT/issues","_blank")}),e.find("#settings-documentation").append(a),a=$(``),a.on("click",()=>{window.open("https://github.com/Plushtoast/dsa5-foundryVTT/wiki","_blank")}),e.find("#settings-documentation").append(a),a=$(''),a.on("click",()=>{window.open(game.i18n.localize("fshopLink"),"_blank")}),e.find("#settings-documentation").append(a);let s=game.system.title.split("/")[game.i18n.lang=="de"?0:1],i=e.find("#game-details .system .system-info").html();e.find("#game-details .system").html(`${s}${i}`)}),Hooks.on("renderCompendiumDirectory",(o,e,t)=>{let a=$(``);e.find(".header-actions").append(a),a.on("click",()=>g.renderToggle(game.dsa5.itemLibrary))}),Hooks.once("renderCompendiumDirectory",(o,e,t)=>{let a=game.i18n.lang=="de"?"en":"de",s=game.packs.filter(i=>Un(i.metadata,"flags.dsalang")==a);for(let i of s){let n=`${i.metadata.packageName}.${i.metadata.name}`;game.packs.delete(n),game.data.packs=game.data.packs.filter(r=>r.id!=n),e.find(`li[data-pack="${n}"]`).remove()}}),Hooks.on("renderActorDirectory",(o,e,t)=>{if(!game.user.isGM)for(let a of o.documents.filter(s=>s.isMerchant()&&Un(s,"system.merchant.hidePlayer")))e.find(`[data-document-id="${a.id}"]`).remove()})}u(Gi,"default");var{duplicate:Io,mergeObject:Vn}=foundry.utils;function Kn(){game.settings.register("dsa5","meleeBotchTableEnabled",{name:"DSASETTINGS.meleeBotchTableEnabled",hint:"DSASETTINGS.meleeBotchTableEnabledHint",scope:"world",config:!0,default:!1,type:Boolean}),game.settings.register("dsa5","rangeBotchTableEnabled",{name:"DSASETTINGS.rangeBotchTableEnabled",hint:"DSASETTINGS.rangeBotchTableEnabledHint",scope:"world",config:!0,default:!1,type:Boolean}),game.settings.register("dsa5","applyDamageInChat",{name:"DSASETTINGS.applyDamageInChat",hint:"DSASETTINGS.applyDamageInChatHint",scope:"world",config:!0,default:!1,type:Boolean}),game.settings.register("dsa5","notifyOnFadingEffects",{name:"DSASETTINGS.notifyOnFadingEffects",hint:"DSASETTINGS.notifyOnFadingEffectsHint",scope:"world",config:!0,default:!1,type:Boolean}),game.settings.register("dsa5","doubleDamageOptions",{name:"DSASETTINGS.doubleDamageOptions",hint:"DSASETTINGS.doubleDamageOptionsHint",scope:"client",config:!0,default:!1,type:Boolean,requiresReload:!0}),game.settings.register("dsa5","defenseBotchTableEnabled",{name:"DSASETTINGS.defenseBotchTableEnabled",hint:"DSASETTINGS.defenseBotchTableEnabledHint",scope:"world",config:!0,default:!1,type:Boolean}),game.settings.register("dsa5","higherDefense",{name:"DSASETTINGS.higherDefense",hint:"DSASETTINGS.higherDefenseHint",scope:"world",config:!0,default:"0",type:String,choices:{0:"0",2:"+2",4:"+4"}}),game.settings.register("dsa5","informationDistribution",{name:"DSASETTINGS.informationDistribution",hint:"DSASETTINGS.informationDistributionHint",scope:"world",config:!0,default:"0",type:String,choices:{0:"DSASETTINGS.information0",1:"DSASETTINGS.information1",2:"DSASETTINGS.information2"}}),game.settings.register("dsa5","enableItemDropToCanvas",{name:"DSASETTINGS.enableItemDropToCanvas",hint:"DSASETTINGS.enableItemDropToCanvasHint",scope:"world",config:!0,default:!0,type:Boolean}),game.settings.register("dsa5","statusEffectCounterColor",{name:"DSASETTINGS.statusEffectCounterColor",hint:"DSASETTINGS.statusEffectCounterColorHint",scope:"client",config:!0,default:"#FFFFFF",type:String}),game.settings.register("dsa5","migrationVersion",{name:"migrationVersion",hint:"migrationVersion",scope:"world",config:!1,default:30,type:Number}),game.settings.register("dsa5","journalFontSizeIndex",{name:"journalFontSizeIndex",hint:"journalFontSizeIndex",scope:"client",config:!1,default:5,type:Number}),game.settings.register("dsa5","firstTimeStart",{name:"firstTimeStart",hint:"firstTimeStart",scope:"world",config:!1,default:!1,type:Boolean}),game.settings.register("dsa5","defaultConfigFinished",{name:"defaultConfigFinished",hint:"defaultConfigFinished",scope:"world",config:!1,default:!1,type:Boolean}),game.settings.register("dsa5","tokenizerSetup",{name:"tokenizerSetup",hint:"tokenizerSetup",scope:"world",config:!1,default:!1,type:Boolean}),game.settings.register("dsa5","diceSetup",{name:"diceSetup",hint:"diceSetup",scope:"world",config:!1,default:!1,type:Boolean}),game.settings.register("dsa5","capQSat",{name:"DSASETTINGS.capQSat",hint:"DSASETTINGS.capQSatHint",scope:"world",config:!0,default:6,type:Number}),game.settings.register("dsa5","hideEffects",{name:"DSASETTINGS.hideEffects",hint:"DSASETTINGS.hideEffectsHint",scope:"world",config:!0,default:!0,type:Boolean}),game.settings.register("dsa5","inventorySound",{name:"DSASETTINGS.inventorySound",hint:"DSASETTINGS.inventorySoundHint",scope:"client",config:!0,default:!0,type:Boolean}),game.settings.register("dsa5","talentModifierEnabled",{name:"DSASETTINGS.talentModifierEnabled",hint:"DSASETTINGS.talentModifierEnabledHint",scope:"client",config:!0,default:!1,type:Boolean}),game.settings.register("dsa5","noConfirmationRoll",{name:"DSASETTINGS.noConfirmationRoll",hint:"DSASETTINGS.noConfirmationRollHint",scope:"world",config:!0,default:!1,type:Boolean}),game.settings.register("dsa5","lessRegeneration",{name:"DSASETTINGS.lessRegeneration",hint:"DSASETTINGS.lessRegenerationHint",scope:"world",config:!0,default:!1,type:Boolean}),game.settings.register("dsa5","limitCombatSpecAbs",{name:"DSASETTINGS.limitCombatSpecAbs",hint:"DSASETTINGS.limitCombatSpecAbsHint",scope:"world",config:!0,default:!0,type:Boolean}),game.settings.register("dsa5","allowPhysicalDice",{name:"DSASETTINGS.allowPhysicalDice",hint:"DSASETTINGS.allowPhysicalDiceHint",scope:"world",config:!0,default:!1,type:Boolean}),game.settings.register("dsa5","enableWeaponAdvantages",{name:"DSASETTINGS.enableWeaponAdvantages",hint:"DSASETTINGS.enableWeaponAdvantagesHint",scope:"world",config:!0,default:!1,type:Boolean}),game.settings.register("dsa5","hideOpposedDamageSelect",{name:"DSASETTINGS.hideOpposedDamageSelect",hint:"DSASETTINGS.hideOpposedDamageSelectHint",scope:"world",config:!0,default:0,type:Number,choices:{0:"hideOpposedOptions.0",1:"hideOpposedOptions.1",2:"hideOpposedOptions.2"}}),game.settings.register("dsa5","enableForeignSpellModifer",{name:"DSASETTINGS.enableForeignSpellModifer",hint:"DSASETTINGS.enableForeignSpellModiferHint",scope:"world",config:!0,default:!1,type:Boolean}),game.settings.register("dsa5","playerCanEditSpellMacro",{name:"DSASETTINGS.playerCanEditSpellMacro",hint:"DSASETTINGS.playerCanEditSpellMacroHint",scope:"world",config:!0,default:!1,type:Boolean}),game.settings.register("dsa5","enableDPS",{name:"DSASETTINGS.enableDPS",hint:"DSASETTINGS.enableDPSHint",scope:"world",config:!0,default:!0,type:Boolean}),game.settings.register("dsa5","iniTrackerSize",{name:"DSASETTINGS.iniTrackerSize",hint:"DSASETTINGS.iniTrackerSizeHint",scope:"client",config:!0,default:70,type:Number,range:{min:30,max:140,step:5},onChange:u(async t=>{game.dsa5.apps.initTracker&&(game.dsa5.apps.initTracker.constructor.defaultOptions.itemWidth=t)},"onChange")}),game.settings.register("dsa5","iniTrackerCount",{name:"DSASETTINGS.iniTrackerCount",hint:"DSASETTINGS.iniTrackerCountHint",scope:"client",config:!0,default:5,type:Number,range:{min:3,max:25,step:1},onChange:u(async t=>{game.dsa5.apps.initTracker&&(game.dsa5.apps.initTracker.constructor.defaultOptions.actorCount=t)},"onChange")}),game.settings.register("dsa5","tokenhotbarSize",{name:"DSASETTINGS.tokenhotbarSize",hint:"DSASETTINGS.tokenhotbarSizeHint",scope:"client",config:!1,default:35,type:Number,range:{min:15,max:100,step:5},onChange:u(()=>{game.dsa5.apps.tokenHotbar?.updateDSA5Hotbar()},"onChange")}),game.settings.register("dsa5","tokenhotbarLayout",{name:"DSASETTINGS.tokenhotbarLayout",hint:"DSASETTINGS.tokenhotbarLayoutHint",scope:"client",config:!1,default:0,type:Number,choices:{0:"DSASETTINGS.tokenhotbarLayout0",1:"DSASETTINGS.tokenhotbarLayout1",2:"DSASETTINGS.tokenhotbarLayout2",3:"DSASETTINGS.tokenhotbarLayout3"},onChange:u(async t=>{game.dsa5.apps.tokenHotbar?.updateDSA5Hotbar()},"onChange")});let o=u(()=>{let t={};for(let a of game.packs)a.metadata.type=="Item"&&a.index.some(s=>s.type=="money")&&(t[a.metadata.id]=a.metadata.id);return t},"moneyChoices");game.settings.register("dsa5","moneyKompendium",{name:"DSASETTINGS.moneyKompendium",hint:"DSASETTINGS.moneyKompendiumHint",scope:"world",config:!0,default:"",type:new foundry.data.fields.StringField({choices:o}),onChange:u(async t=>{ui.notifications.info(game.packs.get(t).index.filter(a=>a.type=="money").map(a=>a.name).join(", "))},"onChange")}),game.settings.register("dsa5","moneyHasWeight",{name:"DSASETTINGS.moneyHasWeight",hint:"DSASETTINGS.moneyHasWeightHint",scope:"world",config:!0,default:!1,type:Boolean,requiresReload:!0});let e=Io(b.styles);for(let t of Object.keys(e))e[t]=game.i18n.localize(e[t]);game.settings.register("dsa5","globalStyle",{name:"DSASETTINGS.globalStyle",hint:"DSASETTINGS.globalStyleHint",scope:"client",config:!0,default:"dsa5-immersive",type:String,choices:e,onChange:u(async t=>{$("body").removeClass(Object.keys(e).join(" ")).addClass(t)},"onChange")}),game.settings.register("dsa5","selfControlOnPain",{name:"DSASETTINGS.selfControlOnPain",hint:"DSASETTINGS.selfControlOnPainHint",scope:"world",config:!0,default:1,type:Number,choices:{0:"DSASETTINGS.selfControlOnPain0",1:"DSASETTINGS.selfControlOnPain1",2:"DSASETTINGS.selfControlOnPain2"}}),game.settings.register("dsa5","forceLanguage",{name:"DSASETTINGS.forceLanguage",hint:"DSASETTINGS.forceLanguageHint",scope:"world",config:!0,default:"none",type:String,choices:{none:"-",de:"German",en:"English"}}),game.settings.register("dsa5","hotbarv3",{name:"DSASETTINGS.hotbarv3",hint:"DSASETTINGS.hotbarv3Hint",scope:"client",config:!1,default:!0,type:Boolean,onChange:u(()=>{ui.hotbar.render(!0)},"onChange")}),game.settings.register("dsa5","libraryModulsFilter",{name:"libraryModulsFilter",scope:"client",config:!1,default:{},type:Object}),game.settings.register("dsa5","tokenhotbarPosition",{name:"tokenhotbarPosition",scope:"client",config:!1,default:{},type:Object}),game.settings.register("dsa5","masterSettings",{name:"masterSettings",scope:"world",config:!1,default:{},type:Object}),game.settings.register("dsa5","iniTrackerPosition",{name:"iniTrackerPosition",scope:"client",config:!1,default:{},type:Object}),game.settings.register("dsa5","soundConfig",{name:"DSASETTINGS.soundConfig",hint:"DSASETTINGS.soundConfigHint",scope:"world",config:!0,default:"",type:String,onChange:u(async()=>{K.loadSoundConfig()},"onChange")}),game.settings.registerMenu("dsa5","changelog",{name:"Changelog",label:"Changelog",hint:"DSASETTINGS.changelog",type:Bi,restricted:!1}),game.settings.registerMenu("dsa5","exportConfiguration",{name:"Export/Import Configuration",label:"Export/Import Configuration",hint:"DSASETTINGS.exportConfiguration",type:qi,restricted:!0}),game.settings.registerMenu("dsa5","configureTokenbar",{name:game.i18n.localize("DSASETTINGS.configureTokenbar"),label:game.i18n.localize("DSASETTINGS.configureTokenbar"),hint:"DSASETTINGS.configureTokenbarHint",type:Wi,restricted:!1}),game.settings.register("dsa5",`breadcrumbs_${game.world.id}`,{name:"DSASETTINGS.breadcrumbs",hint:"DSASETTINGS.breadcrumbsHint",scope:"client",config:!1,default:"",type:String}),game.settings.register("dsa5","groupschips",{name:"DSASETTINGS.groupschips",hint:"DSASETTINGS.groupschips",scope:"world",config:!1,default:"0/0",type:String,onChange:u(async()=>{game.user.isGM&&game.dsa5.apps.gameMasterMenu.render()},"onChange")}),game.settings.register("dsa5","expandChatModifierlist",{name:"DSASETTINGS.expandChatModifierlist",hint:"DSASETTINGS.expandChatModifierlistHint",scope:"client",config:!0,default:!1,type:Boolean}),game.settings.register("dsa5","indexWorldItems",{name:"DSASETTINGS.indexWorldItems",scope:"client",config:!1,default:!0,type:Boolean}),game.settings.register("dsa5","filterDuplicateItems",{name:"DSASETTINGS.filterDuplicateItems",scope:"client",config:!1,default:!1,type:Boolean}),game.settings.register("dsa5","enableCombatFlow",{name:"DSASETTINGS.enableCombatFlow",hint:"DSASETTINGS.enableCombatFlowHint",scope:"client",config:!0,default:!0,type:Boolean,onchange:u(()=>{game.dsa5.apps.initTracker&&(game.dsa5.apps.initTracker.close(),game.dsa5.apps.initTracker=void 0)},"onchange")}),game.settings.register("dsa5","enableCombatPan",{name:"DSASETTINGS.enableCombatPan",hint:"DSASETTINGS.enableCombatPanHint",scope:"client",config:!0,default:!0,type:Boolean}),game.settings.register("dsa5","enableAPTracking",{name:"DSASETTINGS.enableAPTracking",hint:"DSASETTINGS.enableAPTrackingHint",scope:"world",config:!0,default:!1,type:Boolean}),game.settings.register("dsa5","sightAutomationEnabled",{name:"sightAutomationEnabled",scope:"world",config:!1,default:!1,type:Boolean}),game.settings.register("dsa5","lightSightCompensationEnabled",{name:"lightSightCompensationEnabled",scope:"world",config:!1,default:!1,type:Boolean}),game.settings.register("dsa5","randomWeaponSelection",{name:"DSASETTINGS.randomWeaponSelection",hint:"DSASETTINGS.randomWeaponSelectionHint",scope:"world",config:!0,default:!0,type:Boolean}),game.settings.register("dsa5","showWeaponsOnHover",{name:"DSASETTINGS.showWeaponsOnHover",hint:"DSASETTINGS.showWeaponsOnHoverHint",scope:"world",config:!0,default:!0,type:Boolean}),game.settings.register("dsa5","disableDidYouKnow",{name:"DSASETTINGS.disableDidYouKnow",hint:"DSASETTINGS.disableDidYouKnowHint",scope:"client",config:!0,default:!1,type:Boolean}),game.settings.register("dsa5","disableTokenhotbar",{name:"DSASETTINGS.disableTokenhotbar",hint:"DSASETTINGS.disableTokenhotbarHint",scope:"client",config:!1,default:!0,type:Boolean,onChange:u(t=>{t?game.dsa5.apps.tokenHotbar?.close():game.dsa5.apps.tokenHotbar?.render(!0)},"onChange")}),game.settings.register("dsa5","disableTokenhotbarMaster",{name:"DSASETTINGS.disableTokenhotbarMaster",hint:"DSASETTINGS.disableTokenhotbarMasterHint",scope:"client",config:!1,default:!1,type:Boolean,onChange:u(()=>{game.dsa5.apps.tokenHotbar?.updateDSA5Hotbar()},"onChange")}),game.settings.register("dsa5","masterCanvasControls",{name:"DSASETTINGS.masterCanvasControls",hint:"DSASETTINGS.masterCanvasControls",scope:"client",config:!1,default:!1,type:Boolean}),game.settings.register("dsa5","scrollingFontsize",{name:"DSASETTINGS.scrollingFontsize",hint:"DSASETTINGS.scrollingFontsizeHint",scope:"client",config:!0,default:16,type:Number,range:{min:6,max:50,step:1}}),game.settings.register("dsa5","tokenhotbaropacity",{name:"DSASETTINGS.tokenhotbaropacity",hint:"DSASETTINGS.tokenhotbaropacityHint",scope:"client",config:!1,default:.75,type:Number,range:{min:0,max:1,step:.05},onChange:u(()=>{game.dsa5.apps.tokenHotbar?.updateDSA5Hotbar()},"onChange")}),game.settings.register("dsa5","armorAndWeaponDamage",{name:"DSASETTINGS.armorAndWeaponDamage",hint:"DSASETTINGS.armorAndWeaponDamageHint",scope:"world",config:!0,default:!1,type:Boolean}),game.settings.register("dsa5","hideRegenerationToOwner",{name:"DSASETTINGS.hideRegenerationToOwner",hint:"DSASETTINGS.hideRegenerationToOwnerHint",scope:"world",config:!0,default:!0,type:Boolean}),game.settings.register("dsa5","indexDescription",{name:"DSASETTINGS.indexDescription",scope:"client",config:!1,default:!0,type:Boolean}),game.settings.register("dsa5","encumbranceForRange",{name:"DSASETTINGS.encumbranceForRange",hint:"DSASETTINGS.encumbranceForRangeHint",scope:"world",config:!0,default:!1,type:Boolean}),game.settings.register("dsa5","obfuscateTokenNames",{name:"DSASETTINGS.obfuscateTokenNames",hint:"DSASETTINGS.obfuscateTokenNamesHint",scope:"world",config:!0,default:"0",type:String,choices:{0:"no",1:"DSASETTINGS.yesNumbered",2:"DSASETTINGS.renameNumbered",3:"yes",4:"DSASETTINGS.rename"}}),game.settings.register("dsa5","merchantNotification",{name:"DSASETTINGS.merchantNotification",hint:"DSASETTINGS.merchantNotificationHint",scope:"world",config:!0,default:"0",type:String,choices:{0:"no",1:"yes",2:"MERCHANT.onlyGM"}}),game.settings.register("dsa5","sightOptions",{name:"sightOptions",scope:"world",config:!1,default:"0.5|0.7|0.85|0.95",type:String}),game.settings.register("dsa5","trackedActors",{name:"sightOptions",scope:"world",config:!1,default:{},type:Object}),game.settings.register("dsa5","enableMasterTokenFunctions",{name:"enableMasterTokenFunctions",scope:"world",config:!1,default:{},type:Object,onChange:u(()=>{game.dsa5.apps.tokenHotbar?.updateDSA5Hotbar()},"onChange")}),game.settings.register("dsa5","selectedActors",{name:"selectedActors",scope:"world",config:!1,default:{},type:Object}),game.settings.register("dsa5","expansionPermissions",{name:"expansionPermissions",scope:"world",config:!1,default:{},type:Object})}u(Kn,"setupConfiguration");var Eo=u(o=>{let e=Array.from(game.settings.settings);o.elements.exportOnlyDSA.checked&&(e=e.filter(n=>/^dsa5\./.test(n[0])));let a={},s=/(^dsa5\.(selectedActors|trackedActors|groupschips|tokenhotbarPosition|iniTrackerPosition|migrationVersion)$|^dsa5\.breadcrumbs_)/;for(let n of e){if(s.test(n[0]))continue;let r=n[0].split("."),l=r.shift(),c=r.join(".");a[n[0]]=game.settings.get(l,c)}saveDataToFile(JSON.stringify(a,null,2),"text/json","fvtt-DSA5-Configuration.json")},"exportSetting"),$o=u(async o=>{if(!o.data.files.length)return ui.notifications?.error("You did not upload a data file!");readTextFromFile(o.data.files[0]).then(async e=>{let t=JSON.parse(e),a=Array.from(game.settings.settings).map(s=>s[0]);for(let s of Object.keys(t))if(a.includes(s)){let i=s.split("."),n=i.shift(),r=i.join(".");await game.settings.set(n,r,t[s])}game.settings.sheet.render(!0)})},"importSettings"),Bi=class extends FormApplication{static{u(this,"ChangelogForm")}render(){Ct()}},qi=class extends FormApplication{static{u(this,"ExportForm")}async render(){let e=await renderTemplate("systems/dsa5/templates/dialog/exportConfiguration-dialog.html",{});new foundry.applications.api.DialogV2({window:{title:"Export configuration"},content:e,buttons:[{action:"export",icon:"fa fa-check",label:"Export",callback:u((t,a,s)=>{Eo(a.form)},"callback")},{action:"import",icon:"fas fa-check",label:"Import",callback:u((t,a,s)=>{$o(a.form)},"callback")}]}).render(!0)}},Wi=class extends FormApplication{static{u(this,"ConfigureTokenHotbar")}get template(){return"systems/dsa5/templates/dialog/configureTokenhotbar.html"}static get defaultOptions(){let e=super.defaultOptions;return Vn(e,{title:game.i18n.localize("DSASETTINGS.configureTokenbar"),width:500}),e}activateListeners(e){super.activateListeners(e),e.find(".resetTokenhotbar").click(t=>this.resetTokenHotbar(t)),e.find("select, input").change(async t=>{let a=t.currentTarget.name.split("."),s=t.currentTarget.dataset.dtype=="Number"?Number(t.currentTarget.value):t.currentTarget.value;t.currentTarget.type=="checkbox"&&(s=t.currentTarget.checked),await game.settings.set(a[0],a[1],s),this.render()}),e.find(".bags .slot").click(t=>this._onMasterFunctionClicked(t))}async _onMasterFunctionClicked(e){let t=e.currentTarget.dataset.id,a=game.settings.get("dsa5","enableMasterTokenFunctions");a[t]=!a[t],$(e.currentTarget).toggleClass("deactivated",a[t]),game.dsa5.apps.tokenHotbar.gmItems.find(s=>s.id==t).disabled=a[t],await game.settings.set("dsa5","enableMasterTokenFunctions",a)}async getData(e){let t=await super.getData(e);return Vn(t,{tokenhotbarSize:game.settings.get("dsa5","tokenhotbarSize"),tokenhotbarLayout:game.settings.get("dsa5","tokenhotbarLayout"),disableTokenhotbarMaster:game.settings.get("dsa5","disableTokenhotbarMaster"),disableTokenhotbar:game.settings.get("dsa5","disableTokenhotbar"),tokenhotbaropacity:game.settings.get("dsa5","tokenhotbaropacity"),masterCanvasControls:game.settings.get("dsa5","masterCanvasControls"),hotbarv3:game.settings.get("dsa5","hotbarv3"),isGM:game.user.isGM,gmButtons:game.dsa5.apps.tokenHotbar?.gmItems,layoutChoices:game.settings.settings.get("dsa5.tokenhotbarLayout").choices}),t}async resetTokenHotbar(e){e.preventDefault(),e.stopPropagation(),await game.settings.set("dsa5","tokenhotbarPosition",{}),await game.settings.set("dsa5","tokenhotbarLayout",0),await game.settings.set("dsa5","tokenhotbarSize",35),game.dsa5.apps.tokenHotbar?.resetPosition(),game.dsa5.apps.tokenHotbar?.render(!0)}};function Ui(){Hooks.on("renderJournalSheet",(o,e,t)=>{e.find(".close").attr("data-tooltip","SHEET.Close"),e.find(".entry-image").attr("data-tooltip","SHEET.imageView"),e.find(".entry-text").attr("data-tooltip","SHEET.textView"),e.find(".share-image").attr("data-tooltip","SHEET.showToPlayers"),e.find(".import").attr("data-tooltip","SHEET.import"),e.find(".panMapNote").attr("data-tooltip","SHEET.panMapNote"),e.find(".increaseFontSize").attr("data-tooltip","SHEET.increaseFontSize")}),Hooks.on("renderJournalPageSheet",(o,e,t)=>{re.bindRollCommands(e),z.bindButtons(e),e.find("img").mousedown(a=>{a.button==2&&game.dsa5.apps.DSA5_Utility.showArtwork({name:o.name,uuid:"",img:$(a.currentTarget).attr("src")})}),Qe(e)}),Hooks.on("getJournalSheetHeaderButtons",(o,e)=>{e.unshift({class:"increaseFontSize",icon:"fas fa-arrows-up-down",onclick:u(async()=>Vi($(o._element).find(".journal-page-content")),"onclick")}),!(!o.document.sceneNote&&!o.document.pages.some(t=>t.sceneNote))&&e.unshift({class:"panMapNote",icon:"fas fa-map-pin",onclick:u(async()=>{let t=o._getCurrentPage(),a=Array.from(o.document.pages),s;if(a[t].sceneNote)s=a[t];else if(o.document.sceneNote)s=o.document;else if(s=a.find(i=>i.sceneNote),!s)return;canvas.notes.panToNote(s.sceneNote)},"onclick")})})}u(Ui,"default");async function Vi(o){let t=game.settings.get("dsa5","journalFontSizeIndex")+1;t==b.journalFontSizes.length+1?(t=0,await game.settings.set("dsa5","journalFontSizeIndex",t),o.css("fontSize",""),ge(game.i18n.format("CHATNOTIFICATION.fontsize",{size:"Default "}))):(await game.settings.set("dsa5","journalFontSizeIndex",t),Oo(o))}u(Vi,"increaseFontSize");function Oo(o){let e=game.settings.get("dsa5","journalFontSizeIndex"),t=b.journalFontSizes[e-1]||14;ge(game.i18n.format("CHATNOTIFICATION.fontsize",{size:t})),o.css("fontSize",`${t}px`)}u(Oo,"setOuterFontSize");var{getProperty:zo,mergeObject:No}=foundry.utils;function Ki(){Hooks.on("preCreateScene",function(o,e,t,a){if(e.grid?.units||o.updateSource({grid:{units:game.i18n.localize("gridUnits")}}),e.backgroundColor||o.updateSource({backgroundColor:"#000000"}),!o.pack&&!t.dsaInit&&e.notes?.some(s=>zo(s,"flags.dsa5.initName")))return new foundry.applications.api.DialogV2({window:{title:"DIALOG.warning"},content:`

    ${e.name}

    ${game.i18n.localize("DSAError.mapsViaJournalbrowser")}

    `,buttons:[{action:"yes",icon:"fa fa-check",default:!0,label:"yes",callback:u(()=>{let s=t||{};t.dsaInit=!0,Scene.create(e,s)},"callback")},{action:"withJournals",icon:"fas fa-book",label:"Book.tryInit",callback:u(async()=>{try{let s=o.flags.core.sourceId.split(".")[1],i=new game.dsa5.apps.DSA5Initializer("DSA5 Module Initialization","",s,game.i18n.lang),n=await i.loadJson();i.initScenes(n,[e.name])}catch{let i=t||{};t.dsaInit=!0,await Scene.create(e,i)}},"callback")},{action:"no",icon:"fas fa-times",label:"cancel"}]}).render(!0),!1}),Hooks.on("preCreateActiveEffect",function(o,e,t,a){if(o.parent.documentName!="Actor")return;let s={duration:{startTime:game.time.worldTime}};if(e.flags?.dsa5?.onDelayed&&No(s,{duration:{seconds:e.flags.dsa5.onDelayed},system:{delayed:!0,originalDuration:e.duration}}),!game.combat){o.updateSource(s);return}s.duration.combat=game.combat.id,s.duration.startRound=game.combat.round,s.duration.startTurn=game.combat.turn,!o.duration.rounds&&o.duration.seconds&&(s.duration.rounds=o.duration.seconds/5),o.updateSource(s)})}u(Ki,"default");function Yi(){game.keybindings.register("dsa5","masterMenu",{name:"gmMenu",hint:"KEYBINDINGS.masterMenu",editable:[{key:"KeyM"}],onDown:u(()=>g.renderToggle(game.dsa5.apps.gameMasterMenu),"onDown"),restricted:!0}),game.keybindings.register("dsa5","journalBrowser",{name:"Book.Wizard",hint:"KEYBINDINGS.journalBrowser",editable:[{key:"KeyJ"}],onDown:u(()=>g.renderToggle(game.dsa5.apps.journalBrowser),"onDown")}),game.keybindings.register("dsa5","library",{name:"ItemLibrary",hint:"KEYBINDINGS.library",editable:[{key:"KeyL"}],onDown:u(()=>g.renderToggle(game.dsa5.itemLibrary),"onDown")}),game.keybindings.register("dsa5","attacktest",{name:"attacktest",hint:"KEYBINDINGS.attack",editable:[{key:"KeyB"}],onDown:u(()=>Ge.runActAttackDialog(),"onDown")}),game.keybindings.register("dsa5","combatTrackerNext",{name:"COMBAT.TurnNext",hint:"COMBAT.TurnNext",editable:[{key:"KeyN"}],onDown:u(()=>Yn("nextTurn"),"onDown")}),game.keybindings.register("dsa5","combatTrackerPrevious",{name:"COMBAT.TurnPrev",hint:"COMBAT.TurnPrev",editable:[{key:"KeyV"}],onDown:u(()=>Yn("previousTurn"),"onDown")}),game.keybindings.register("dsa5","setTargetToUser",{name:"DIALOG.setTargetToUser",hint:"DIALOG.setTargetToUserHint",editable:[],onDown:u(async()=>(await pt.getDialog()).render(!0),"onDown"),restricted:!0})}u(Yi,"default");var Yn=u(o=>{game.combat?.combatant?.isOwner&&game.combat[o]()},"combatTurn");function Ji(){Roll.prototype.editRollAtIndex=function(o){let e=[];for(let t of o){let{index:a,val:s}=t,i=0;for(let n of this.terms){let r=n instanceof foundry.dice.terms.DiceTerm||n.class=="DiceTerm"||n instanceof foundry.dice.terms.Die||n.class=="Die",l=n instanceof foundry.dice.terms.OperatorTerm;if(r||n.faces){if(n.results[a-i]){let c=n.results[a-i].result;n.results[a-i].result=s,e.push(c)}r||(n.total=n.results.reduce((c,m)=>c+m.result,0)),i+=n.results.length}else!l&&(n.class=="OperatorTerm"||n.operator)&&(n.total=n.operator)}e.push(0)}return this._total=this._evaluateTotal(),e}}u(Ji,"default");var{mergeObject:Jn,duplicate:_o}=foundry.utils,Gt=class o extends Application{static{u(this,"BookWizard")}static wizard;constructor(e){super(e),this.adventures=[],this.books=[],this.rshs=[],this.manuals=[],this.fulltextsearch=!0}static get defaultOptions(){let e=super.defaultOptions;return e.tabs=[{navSelector:".tabs",contentSelector:".content",initial:"description"}],Jn(e,{classes:e.classes.concat(["dsa5","largeDialog","noscrollWizard","bookWizardsheet"]),width:800,height:880,scrollY:[".pages-list .scrollable"],template:"systems/dsa5/templates/wizard/adventure/adventure_wizard.html",title:game.i18n.localize("Book.Wizard"),resizable:!0,dragDrop:[{dragSelector:".item-list .item",dropSelector:null}]}),e}static initHook(){o.wizard=new o,game.dsa5.apps.journalBrowser=o.wizard,Hooks.on("renderJournalDirectory",(e,t)=>{let a=$('
    '),s=$(``);s.on("click",()=>{o.wizard.render(!0)}),a.append(s),t.find(".header-actions:first-child").after(a)})}_getHeaderButtons(){let e=super._getHeaderButtons();return e.unshift({class:"increaseFontSize",tooltip:"SHEET.increaseFontSize",icon:"fas fa-arrows-up-down",onclick:u(async()=>Vi($(this._element).find(".chapter")),"onclick")}),e.unshift({label:"Library",class:"library",tooltip:"Book.home",icon:"fas fa-book",onclick:u(async()=>this._showBooks(),"onclick")}),e}_showBooks(){this.book=null,this.bookData=null,this.selectedChapter=null,this.selectedType=null,this.journals=null,this.actors=null,this.scenes=null,this.content=void 0,this.journalIndex=null,this.fulltextsearch=!0,this.searchString=void 0,this.currentType=void 0,this.pageTocs=void 0,this.selectedSubChapter=void 0,this.loadPage(this._element)}async toggleBookVisibility(e,t,a){let s=game.settings.get("dsa5","expansionPermissions");s[e]=a,await game.settings.set("dsa5","expansionPermissions",s);let i=this[t].find(l=>l.id==e),n=await(await fetch(i.path)).json(),r=["actors","journal","scenes"];for(let l of r){if(!n[l])continue;let c=game.packs.get(n[l]),m=a?"OBSERVER":"NONE",d={ownership:{PLAYER:m,TRUSTED:m,ASSISTANT:"OWNER",GAMEMASTER:"OWNER"}};await c.configure(d)}this.render()}activateListeners(e){super.activateListeners(e),e.on("click",".toggleVisibility",async t=>{let a=t.currentTarget.dataset.itemid,s=t.currentTarget.dataset.type,i=$(t.currentTarget).find("i").hasClass("fa-toggle-off");this.toggleBookVisibility(a,s,i)}),e.on("click",".showMapNote",t=>{game.journal.get(t.currentTarget.dataset.entryid).panToNote()}),e.on("search keyup",".filterJournals",t=>{this.filterToc(t.currentTarget.value)}),e.on("click",".heading-link",t=>this._onClickPageLink(t)),e.on("click",".show-item",async t=>{let a=t.currentTarget.dataset.uuid;(await fromUuid(a)).sheet.render(!0)}),e.on("click",".movePage",async t=>this.movePage(t)),e.on("click",".loadBook",t=>{this.loadBook($(t.currentTarget).text(),e,t.currentTarget.dataset.type)}),e.on("click",".getChapter",t=>{this.selectedType=$(t.currentTarget).closest(".toc").attr("data-type"),this.selectedChapter=t.currentTarget.dataset.id,this.content=void 0,this.pageTocs=void 0,this.loadPage(e)}),e.on("click",".subChapter",async t=>{let a=$(t.currentTarget).text(),s=t.currentTarget.dataset.jid;s?this.selectedSubChapter==s?$(this.element.find("h1.journalHeader"))[0].scrollIntoView({behavior:"smooth"}):await this.loadJournalById(s):($(this._element).find(".subChapter").removeClass("selected"),$(this._element).find(`[data-id="${a}"]`).addClass("selected"),await this.loadJournal(a)),this._saveScrollPositions(e),e.find(".toc").html(await this.getToc()),this._restoreScrollPositions(e),this.searchString&&this.filterToc(this.searchString)}),re.bindRollCommands(e),e.find(".tocCollapser").click(t=>{$(t.currentTarget).find("i").toggleClass("fa-chevron-right fa-chevron-left"),e.find(".tocCollapsing").toggleClass("expanded")}),e.on("mousedown",".openPin",async t=>{let a=t.currentTarget.dataset.uuid;t.button==0?this.showJournal(await fromUuid(a)):t.button==2&&this.unpinJournal(a)}),e.on("click",".showJournal",t=>{this.popJournal($(t.currentTarget).closest("h1").attr("data-uuid"))}),e.on("click",".pinJournal",t=>{let a=$(t.currentTarget).closest("h1"),s=a.attr("data-uuid"),i=a.text();this.pinJournal(s,i)}),e.on("click",".activateScene",t=>{this.showSzene(t.currentTarget.dataset.id,t.currentTarget.dataset.mode)}),e.on("click",".fulltextsearch",t=>{this.fulltextsearch=!this.fulltextsearch,$(t.currentTarget).toggleClass("on"),this.filterToc(e.find(".filterJournals").val())}),e.on("mousedown",".chapter img",t=>{let a=this.book.id;t.button==2&&game.dsa5.apps.DSA5_Utility.showArtwork({name:a,uuid:"",img:$(t.currentTarget).attr("src")})}),z.bindButtons(e),e.on("click",".importBook",async()=>this.importBook()),Qe(e),aa(e,".breadcrumbs",this.resaveBreadCrumbs)}async getPagy(e,t){let a=this.journals.filter(i=>i.flags.dsa5.parent==e).sort((i,n)=>i.flags.dsa5.sort>n.flags.dsa5.sort?1:-1),s=a.findIndex(i=>i._id==t);return{journals:a,targetindex:s}}async movePage(e){let t=e.currentTarget.dataset.action,{journals:a,targetindex:s}=await this.getPagy(this.selectedChapter,this.selectedSubChapter),i=[];for(let c of this.bookData.chapters)for(let m of c.content)i.push(m.name);let n=i.findIndex(c=>c==this.selectedChapter);if(this.bookData.chapters.findIndex(c=>c.name==this.selectedChapter),t=="next"?s++:s--,s<0){if(this.selectedChapter=i[n-1],!this.selectedChapter)return;a=(await this.getPagy(this.selectedChapter,void 0)).journals,s=0}else if(s>=a.length){if(this.selectedChapter=i[n+1],!this.selectedChapter)return;a=(await this.getPagy(this.selectedChapter,void 0)).journals,s=0}if(["prep","foundryUsage"].includes(this.selectedChapter))return;let r=a[s];r&&await this.loadJournalById(r.id);let l=await this.getToc();this._saveScrollPositions(this._element),this._element.find(".toc").html(l),this._restoreScrollPositions(this._element)}async loadJournal(e){await this.showJournal(this.journals.find(t=>t.name==e&&t.flags.dsa5.parent==this.selectedChapter))}async loadJournalById(e){await this.showJournal(this.journals.find(t=>t.id==e))}async resaveBreadCrumbs(e){let t={};for(let a of e.getElementsByTagName("div"))t[a.dataset.uuid]=a.innerText;await game.settings.set("dsa5",`breadcrumbs_${game.world.id}`,JSON.stringify(t))}markFindings(e){let t=e.closest(".tocCollapsing");t.find(".searchLines").remove();let a=e.find(".searchMatch");if(a.length==0)return;let s=[],i=e.find("> div")[0].getBoundingClientRect();for(let r of a){let l=r.getBoundingClientRect();s.push(`
    `)}let n=$(`
    ${s.join("")}
    `);t.append(n)}async filterToc(e){if(this.searchString=e,e!=null)if(e=e.toLowerCase().trim(),e!=""){let s=[];this.fulltextsearch?(this.journalIndex||(this.journalIndex=new FlexSearch({encode:"simple",tokenize:"reverse",cache:!0,doc:{id:"id",field:["name","data"]}}),await this.journalIndex.add(this.journals.map(i=>new Xi(i)))),s=await this.journalIndex.search(e)):s=this.journals.filter(i=>i.name.toLowerCase().trim().indexOf(e)!=-1),s=s.map(i=>`
  • ${i.name}
  • `),$(this._element).find(".tocContent").html(`
      ${s.join(` -`)}
    `)}else{let s=await this.getToc();$(this._element).find(".toc").html(s).find(".filterJournals").trigger("focus")}let t=await this.getChapter(),a=$(this._element).find(".chapter");a.html(t),this.markFindings(a)}async showSearchResults(e){this.searchString&&await TextEditor._replaceTextContent(TextEditor._getTextNodes(e),new RegExp(this.searchString,"ig"),(t,a)=>$(`${t[0]}`)[0])}_onClickPageLink(e){let t=e.currentTarget.closest("[data-anchor]")?.dataset.anchor;if(t){let s=this.element[0].querySelector(`.chapter [data-anchor="${t}"]`);if(s){s.scrollIntoView({behavior:"smooth"});return}}this.element[0].querySelector(".journalHeader")?.scrollIntoView({behavior:"smooth"})}async _renderHeadings(e,t=!1){let a=Object.values(e);t&&a.shift();let s=Math.min(...a.map(i=>i.level));return await renderTemplate("templates/journal/journal-page-toc.html",{headings:a.reduce((i,{text:n,level:r,slug:l,element:c})=>(c&&(c.dataset.anchor=l),r${f}
    `),d||(f=`

    ${m}

    ${f}`),t+=f}this.pageTocs=a.join("");let s=this.findSceneNote(e.getFlag("dsa5","initId")),i=await TextEditor.enrichHTML(t,{secrets:game.user.isGM,async:!0});return`

    ${e.name}
    ${s}

    ${i}`}async showJournal(e){let t=$(this._element).find(".chapter");t.html(await this.renderContent(e)),this.selectedSubChapter=e.id,$(this._element).find(".subChapter").removeClass("selected"),$(this._element).find(`[data-jid="${e.id}"]`).addClass("selected"),Qe(t),this.markFindings(t),t.find(".documentName-link, .content-link").on("click",a=>{let s=a.currentTarget.dataset;this.bookData&&s.pack==this.bookData.journal&&s.type!="JournalEntryPage"&&(a.stopPropagation(),this.loadJournalById(s.id))})}findSceneNote(e){if(e){let t=game.journal.find(a=>a.getFlag("dsa5","initId")==e);if(t&&t.sceneNote)return``}return""}async importBook(){game.user.isGM&&new Qi().render(this.bookData.moduleName,this.bookData.options)}async loadBook(e,t,a){this.selectedChapter=void 0,this.selectedType=void 0,this.content=void 0,a||(a=this.currentType),this.currentType=a,this.book=this[a].find(s=>s.id==e),await fetch(this.book.path).then(async s=>s.json()).then(async s=>{this.bookData=s;let i=game.packs.get(s.journal);await i.getIndex();let n=await i.getDocuments();this.journals=n,s.actors&&(i=game.packs.get(s.actors),n=await i.getIndex(),this.actors=n),s.scenes&&(i=game.packs.get(s.scenes),n=await i.getIndex(),this.scenes=n),this.checkChapters(i),this.loadPage(t)})}checkChapters(e){this.bookData.chapters||(this.bookData.isDynamic=!0,this.bookData.chapters=[{name:game.i18n.localize(`${this.bookData.moduleName}.name`),content:e.folders.map(t=>({name:t.name,id:t.id}))}])}async prefillActors(e){if(!e.actors)return[];let t=[],a=await game.folders.contents.find(i=>i.name==game.i18n.localize(`${this.bookData.moduleName}.name`)&&i.type=="Actor"&&i.folder==null),s=a?await game.folders.contents.filter(i=>i.type=="Actor"&&i.folder?.id==a.id).map(i=>i.id):void 0;for(let i of e.actors){let n=s?.length?game.actors.contents.find(m=>m.name==i&&s.includes(m.folder?.id)):void 0,r,l=n?.id,c=n?.uuid;n||(n=this.actors.find(m=>m.name==i),r=this.bookData.actors,l=n?._id,c=n?`Compendium.${r}.${l}`:void 0),t.push({name:i,actor:n,pack:r,id:l,uuid:c})}return t}async popJournal(e){(await fromUuid(e)).sheet.render(!0)}async showSzene(e,t="activate"){let a=game.scenes.contents.find(s=>s.name==e);if(!a)return ui.notifications.error("DSAError.sceneNotInitialized",{localize:!0});switch(t){case"activate":a.activate();break;case"view":a.view();break;case"toggle":a.update({navigation:!a.navigation});break}}async getChapter(){if(this.book){if(this.content){let e=this.journals.find(t=>t.id==this.content);return await this.renderContent(e)}if(this.selectedChapter){if(this.selectedChapter=="prep"){let a={initDescr:game.i18n.format(`${this.bookData.options?.scope||this.bookData.moduleName}.importContent`,{defaultText:game.i18n.localize("importDefault")})},s=this.bookData.modules;for(let i of s)i.enabled=this.moduleEnabled(i.id);return await renderTemplate("systems/dsa5/templates/wizard/adventure/adventure_preparation.html",{modules:s,info:a})}else if(this.selectedChapter=="foundryUsage")return await renderTemplate("systems/dsa5/templates/wizard/adventure/adventure_foundry.html");let e=this.bookData.chapters.find(a=>a.name==this.selectedType).content.find(a=>a.id==this.selectedChapter),t=this.getSubChapters();return e.scenes||e.actors||t.length==0?await renderTemplate("systems/dsa5/templates/wizard/adventure/adventure_chapter.html",{chapter:e,subChapters:this.getSubChapters(),actors:await this.prefillActors(e)}):(this.selectedSubChapter=t[0].id,await this.loadJournalById(t[0].id))}return await renderTemplate("systems/dsa5/templates/wizard/adventure/adventure_cover.html",{book:this.book,bookData:this.bookData})}else return await renderTemplate("systems/dsa5/templates/wizard/adventure/adventure_intro.html",{rshs:this.filterBooks(this.rshs),rules:this.filterBooks(this.books),adventures:this.filterBooks(this.adventures),manuals:this.filterBooks(this.manuals),isGM:game.user.isGM})}filterBooks(e){let t=game.settings.get("dsa5","expansionPermissions");for(let a of e)t[a.id]!=null&&(a.visible=t[a.id]);return game.user.isGM?e:e.filter(a=>a.visible==null||a.visible).sort((a,s)=>a.id.localeCompare(s.id))}getSubChapters(){let e;return this.bookData.isDynamic?e=this.journals.filter(t=>t.folder.id==this.selectedChapter).sort((t,a)=>t.sort>a.sort?1:-1):e=this.journals.filter(t=>t.flags.dsa5.parent==this.selectedChapter).sort((t,a)=>t.flags.dsa5.sort>a.flags.dsa5.sort?1:-1),e.map(t=>{let a=this.selectedSubChapter==t.id;return{name:t.name,id:t.id,selected:a,cssClass:a?"selected":""}})}async getToc(){let e=[];if(this.book){if(e.push(..._o(this.bookData.chapters)),this.selectedChapter){let t;for(let a of e)if(t=a.content.find(s=>s.id==this.selectedChapter),t)break;t&&(t.cssClass="selected",t.subChapters=this.getSubChapters())}return await renderTemplate("systems/dsa5/templates/wizard/adventure/adventure_toc.html",{chapters:e,searchString:this.searchString,book:this.book,pageTocs:this.pageTocs,fulltextsearch:this.fulltextsearch?"on":""})}else return'
    '}async loadPage(e){let t=await this.getChapter(),a=await this.getToc();this._saveScrollPositions(e),e.find(".toc").html(a);let s=e.find(".chapter");s.html(t),this.markFindings(s),this._restoreScrollPositions(e)}async getData(e){let t=await super.getData(e),a=await this.getChapter(),s=await this.getToc(),i=game.settings.get("dsa5","journalFontSizeIndex"),n=b.journalFontSizes[i-1]||14;return Jn(t,{adventure:this.bookData,currentChapter:a,breadcrumbs:this.renderBreadcrumbs(),toc:s,fontSize:n}),t}async pinJournal(e,t=void 0){let a=this.readBreadCrumbs();t||(t=(await fromUuid(e))?.name||""),a[e]=t,game.settings.set("dsa5",`breadcrumbs_${game.world.id}`,JSON.stringify(a)),this.render(!0)}unpinJournal(e){let t=this.readBreadCrumbs();delete t[e],game.settings.set("dsa5",`breadcrumbs_${game.world.id}`,JSON.stringify(t)),this.render(!0)}_canDragDrop(e){return!0}async _onDrop(e){let t;try{t=JSON.parse(e.dataTransfer.getData("text/plain"))}catch{return!1}t.type=="JournalEntry"&&this.pinJournal(t.pack?`Compendium.${t.pack}.${t.id}`:`JournalEntry.${t.id}`)}readBreadCrumbs(){let e={};try{e=JSON.parse(game.settings.get("dsa5",`breadcrumbs_${game.world.id}`))}catch{console.log("No Journalbrowser notes found")}return e}renderBreadcrumbs(){let e=this.readBreadCrumbs(),t=Object.entries(e).map(a=>`
    ${a[1]}
    `);return t.length>0?``:""}moduleEnabled(e){return game.modules.get(e)?game.modules.get(e).active?"fa-check":"fa-dash":"fa-times"}},Qi=class extends FormApplication{static{u(this,"InitializerForm")}render(e,t){new game.dsa5.apps.DSA5Initializer("DSA5 Module Initialization",game.i18n.format(`${t?.scope||e}.importContent`,{defaultText:game.i18n.localize("importDefault")}),e,game.i18n.lang,t).render(!0)}},Xi=class{static{u(this,"JournalSearch")}constructor(e){let t=e.pages.find(a=>!0).text.content;this.document={name:e.name,data:$("
    ").html(t).text(),id:e.id}}get name(){return this.document.name}get data(){return this.document.data}get id(){return this.document.id}};var{hasProperty:Qn,expandObject:Pe,mergeObject:Sa,duplicate:Fo,randomID:Xn}=foundry.utils,Bt=class{static{u(this,"MastersMenu")}static registerButtons(){game.dsa5.apps.playerMenu=new ot,CONFIG.Canvas.layers.dsamenu={layerClass:Zi,group:"interface"},Hooks.on("getSceneControlButtons",e=>{let t=[{name:"JournalBrowser",title:"Book.Wizard",icon:"fa fa-book",button:!0,onClick:u(()=>{g.renderToggle(game.dsa5.apps.journalBrowser)},"onClick")},{name:"Library",title:"SHEET.Library",icon:"fas fa-university",button:!0,onClick:u(()=>{g.renderToggle(game.dsa5.itemLibrary)},"onClick")},{name:"PlayerMenu",title:"PLAYER.title",icon:"fas fa-dsa5-player",button:!0,onClick:u(()=>{g.renderToggle(game.dsa5.apps.playerMenu)},"onClick")}];if(game.settings.get("dsa5","masterCanvasControls")&&game.dsa5.apps.tokenHotbar)for(let a=3;agame.dsa5.apps.tokenHotbar.callbackFunctions[s.id](),"onClick")})}game.user.isGM&&(game.dsa5.apps.gameMasterMenu||(game.dsa5.apps.gameMasterMenu=new en),t.push({name:"mastersMenu",title:"gmMenu",icon:"fa fa-dsa5",button:!0,onClick:u(()=>{g.renderToggle(game.dsa5.apps.gameMasterMenu)},"onClick")})),e.push({name:"GM Menu",title:game.i18n.localize("gmMenu"),icon:"fas fa-dsa5",layer:"dsamenu",tools:t})})}},Zi=class extends InteractionLayer{static{u(this,"DSAMenuLayer")}static get layerOptions(){return foundry.utils.mergeObject(super.layerOptions,{name:"dsamenu",canDragCreate:!1,controllableObjects:!0,rotatableObjects:!0,zIndex:666})}selectObjects(e){canvas.tokens.selectObjects(e)}},en=class extends Application{static{u(this,"GameMasterMenu")}constructor(e){super(e),this.heros=[],this.lastSkill=`${game.i18n.localize("LocalizedIDs.perception")}|skill`,this.randomCreation=[],game.user.isGM&&(Hooks.on("updateActor",async(t,a,s,i)=>{if(!this.rendered)return;let n=["system.status.fatePoints","system.status.wounds","system.status.karmaenergy","system.status.astralenergy"];this.heros.some(r=>r.id==t.id)&&n.reduce((r,l)=>r||Qn(a,l),!1)&&this.render()}),Hooks.on("updateScene",async(t,a,s,i)=>{let n=["environment.darknessLevel"];if(game.canvas.id==t.id&&n.reduce((r,l)=>r||Qn(a,l),!1)){if(game.dsa5.apps.LightDialog&&game.dsa5.apps.LightDialog.onDarknessChange(),!this.rendered)return;this.render()}}),Hooks.on("canvasInit",()=>{this.rendered&&this.render()}))}async _render(e=!1,t={}){if(!game.user.isGM)return ui.notifications.error("DSAError.onlyGMallowed");await super._render(e,t)}getSelectedActors(){let e=game.settings.get("dsa5","selectedActors"),t=game.settings.get("dsa5","trackedActors"),a={};for(let s of Object.keys(e))t.actors?.includes(s)&&(a[s]=e[s]);return a}activateListeners(e){super.activateListeners(e),e.find("select.select2").select2(),me(e),e.find(".heroLink").click(a=>{a.stopPropagation(),game.actors.get(this.getID(a)).sheet.render(!0)}),e.find(".addGlobalMod").click(()=>this.addGlobalMod()),e.find(".globalModEnable").change(a=>this.toggleGlobalMod(a)),e.find(".removeGlobalMod").click(a=>this.removeGlobalMod(a)),e.find(".editGlobalMod").click(a=>this.editGlobalMod(a)),e.find(".heroSelector").change(a=>{a.stopPropagation();let s=this.getSelectedActors();s[this.getID(a)]=$(a.currentTarget).is(":checked"),game.settings.set("dsa5","selectedActors",s)}),e.find(".skillSelektor").change(a=>{a.stopPropagation(),this.lastSkill=$(a.currentTarget).val()}),e.find(".rollChar").click(a=>{a.stopPropagation(),this.rollAbility([this.getID(a)])}),e.find(".rollAll").click(a=>{a.stopPropagation(),this.rollAbility(this.selectedIDs())}),e.find(".pay").click(a=>{a.stopPropagation(),this.doPayment([this.getID(a)],!0)}),e.find(".actorItem").click(async a=>{a.stopPropagation();let s=a.currentTarget.dataset.uuid;(await fromUuid(s)).sheet.render(!0)}),e.find(".getPaid").click(a=>{a.stopPropagation(),this.doPayment([this.getID(a)],!1)}),e.find(".resetSightThresholds").click(()=>this.resetSightThresholds()),e.find(".payAll").click(a=>{a.stopPropagation(),this.doPayment(this.selectedIDs(a),!0)}),e.find(".getPaidAll").click(a=>{a.stopPropagation(),this.doPayment(this.selectedIDs(a),!1)}),e.find(".selectAll").change(a=>this._selectAll(a,e)),e.find(".exp").click(a=>{a.stopPropagation(),this.getExp([this.getID(a)])}),e.find(".expAll").click(a=>{a.stopPropagation(),this.getExp(this.selectedIDs())}),e.find(".randomPlayer").mousedown(a=>{a.stopPropagation(),this._randomPlayer(e,a)}),e.find(".requestRoll").click(a=>{a.stopPropagation(),this.rollRequest()}),e.find(".heroSelector").click(a=>a.stopPropagation()),e.find(".hero").click(a=>{a.stopPropagation(a),$(a.currentTarget).find(".expandDetails").fadeToggle()});let t=u(a=>this._deleteHero(a),"deletehand");e.find(".hero").mouseenter(a=>{if(a.currentTarget.getElementsByClassName("hovermenu").length==0){let s=document.createElement("div");s.classList.add("hovermenu");let i=document.createElement("i");i.classList.add("fas","fa-times"),i.dataset.tooltip="SHEET.DeleteItem",i.addEventListener("click",t,!1),s.appendChild(i),a.currentTarget.appendChild(s)}}),e.find(".hero").mouseleave(a=>{let s=a.toElement||a.relatedTarget;!s||s.parentNode==this||s==this||a.currentTarget.querySelectorAll(".hovermenu").forEach(i=>i.remove())}),e.find(".addGroupSchip").click(async a=>{await this.changeGroupSchipCount(Number(a.currentTarget.dataset.value))}),e.find(".groupschip").click(a=>{this.changeGroupSchip(a)}),e.find(".addFolder").click(async a=>this.editFolder(a)),e.find(".editFolder").change(async a=>this._editFolder(a)),e.find(".heroschip").click(a=>{a.stopPropagation(),a.preventDefault();let s=Number(a.currentTarget.getAttribute("data-val"));s==1&&$(a.currentTarget).closest(".hero").find(".fullSchip").length==1&&(s=0),game.actors.get(this.getID(a)).update({"system.status.fatePoints.value":s})}),e.find(".groupCheck").click(a=>{a.stopPropagation(),this.doGroupCheck()}),e.find(".changeSetting").change(async a=>{await game.settings.set("dsa5",a.currentTarget.name,a.currentTarget.checked)}),e.find(".changeSightTreshold").change(async a=>{$(a.currentTarget).closest(".row-section").find(".range-value").text(a.currentTarget.value),this.updateSightThreshold(a)}),e.find(".updateDarkness").change(async a=>{$(a.currentTarget).closest(".row-section").find(".range-value").text(a.currentTarget.value),this.updateDarkness(a)});for(let a of this.randomCreation)a.activateListeners(e);aa(e,".heros",this.updateHeroOrder,".hero"),e.on("dragstart",".hero",a=>{a.stopPropagation();let i={type:"Actor",uuid:a.currentTarget.dataset.uuid};a.originalEvent.dataTransfer.setData("text/plain",JSON.stringify(i))}),e.find(".dragEveryone").each(function(a,s){s.setAttribute("draggable",!0)}),e.on("dragstart",".dragEveryone",a=>this._dragEveryone(a)),game.dsa5.apps.LightDialog&&game.dsa5.apps.LightDialog.activateButtonListener(e)}async _dragEveryone(e){e.stopPropagation();let t;e.currentTarget.dataset.folder?t=Pe(game.settings.get("dsa5","masterSettings")).folders.find(i=>i.id==e.currentTarget.dataset.folder).content:t=this.selectedIDs();let a={type:"GroupDrop",ids:t};e.originalEvent.dataTransfer.setData("text/plain",JSON.stringify(a))}async _selectAll(e,t){e.stopPropagation();let a=".heroSelector";e.currentTarget.dataset.folder&&(a=`[data-id="${e.currentTarget.dataset.folder}"] .heroSelector`);let s=t.find(a);s.prop("checked",$(e.currentTarget).is(":checked")),s.change()}async _deleteHero(e){e.stopPropagation(),e.preventDefault();let t=$(e.currentTarget).closest(".hero").attr("data-id"),a=game.settings.get("dsa5","trackedActors").actors||[],s=a.indexOf(t);s>-1&&(a.splice(s,1),await this.setTrackedHeros(a),this.render(!0))}async updateHeroOrder(e){let t=[];for(let a of e.querySelectorAll(".hero"))t.push(a.dataset.id);await this.setTrackedHeros(t)}async setTrackedHeros(e){await game.settings.set("dsa5","trackedActors",{actors:e.filter(t=>game.actors.has(t))})}async updateDarkness(e){canvas.scene&&canvas.scene.update({"environment.darknessLevel":Number(e.currentTarget.value)},{animateDarkness:3e3})}async updateSightThreshold(e){let t=Number(e.currentTarget.dataset.index),a=Number(e.currentTarget.value),s=game.settings.get("dsa5","sightOptions").split("|");s[t]=a,await game.settings.set("dsa5","sightOptions",s.join("|"))}async resetSightThresholds(){await game.settings.set("dsa5","sightOptions",game.settings.settings.get("dsa5.sightOptions").default),this.render(!0)}getGroupSchipSetting(){return game.settings.get("dsa5","groupschips").split("/").map(e=>Number(e))}async changeGroupSchipCount(e){let t=this.getGroupSchipSetting();t[1]=Math.max(0,t[1]+e),t[0]=Math.min(t[1],t[0]),await game.settings.set("dsa5","groupschips",t.join("/"))}async changeGroupSchip(e){let t=Number(e.currentTarget.getAttribute("data-val"));t==1&&$(e.currentTarget).closest(".col").find(".fullSchip").length==1&&(t=0);let a=this.getGroupSchipSetting();a[0]=t,await game.settings.set("dsa5","groupschips",a.join("/"))}async _createFolder(){let e=Pe(game.settings.get("dsa5","masterSettings"));e.folders||(e.folders=[]),e.folders.push({id:Xn(),name:game.i18n.localize("FOLDER.ExportNewFolder"),content:[]}),await game.settings.set("dsa5","masterSettings",e),await this.render(!0)}async _deleteFolder(e){let t=e.currentTarget.dataset.id,a=Pe(game.settings.get("dsa5","masterSettings"));a.folders=a.folders.filter(s=>s.id!=t),await game.settings.set("dsa5","masterSettings",a),await this.render(!0)}async _editFolder(e){let t=e.currentTarget.dataset.id,a=Pe(game.settings.get("dsa5","masterSettings"));a.folders.find(s=>s.id==t).name=e.currentTarget.value,await game.settings.set("dsa5","masterSettings",a)}async editFolder(e){switch(e.currentTarget.dataset.action){case"create":this._createFolder();break;case"delete":this._deleteFolder(e);break}}async addGlobalMod(){new Aa().render(!0)}async editGlobalMod(e){let t=e.currentTarget.dataset.key;new Aa(t).render(!0)}async toggleGlobalMod(e){let t=game.settings.get("dsa5","masterSettings");t.globalMods[e.currentTarget.dataset.key].enabled=e.currentTarget.checked,await game.settings.set("dsa5","masterSettings",t)}async removeGlobalMod(e){let t=game.settings.get("dsa5","masterSettings");delete t.globalMods[e.currentTarget.dataset.key],await game.settings.set("dsa5","masterSettings",t),this.render()}async _randomPlayer(e,t){let a=e.find(".hero"),s=await this.rollRandomPlayer(t.button==2);$(t.currentTarget).find("i").addClass("fa-spin"),a.removeClass("victim"),setTimeout(()=>{$(this._element).find(`.hero[data-id="${s}"]`).addClass("victim"),$(t.currentTarget).find("i").removeClass("fa-spin")},500)}async rollRandomPlayer(e){let t={},a=1,s=this.getSelectedActors(),i=Object.values(s).filter(l=>l).length!=0,n=this.heros.length?this.heros:await this.getTrackedHeros();if(n.length==0){ui.notifications.warn("DIALOG.noTarget",{localize:!0});return}for(let l of n)!s[l.id]&&i||(t[a]=l.id,a++,e&&P.hasVantage(l,game.i18n.localize("LocalizedIDs.misfortune"))&&(t[a]=l.id,a++),e&&l.hasCondition("badluck")&&(t[a]=l.id,a++));let r=(await new Roll(`1d${a-1}`).evaluate()).total;return t[r]}async doPayment(e,t,a=0){let s=await this.getTrackedHeros(),i=await renderTemplate("systems/dsa5/templates/dialog/master-ap-award.html",{selected:e,amount:a,tracked:s,text:game.i18n.localize(game.i18n.format(t?"MASTER.payText":"MASTER.getPaidText",{heros:game.i18n.localize("MASTER.theGroup")}))}),n=u(r=>{let l=r.find(".input-text").val();if(!isNaN(l)){let c=[];r.find(".heroSelector:checked").each((m,d)=>c.push(game.actors.get(d.value)));for(let m of c)Q.handlePayAction(void 0,t,l,m)}},"callback");this.buildDialog(game.i18n.localize(t?"MASTER.payTT":"PAYMENT.payButton"),i,n)}async getPaid(e){this.doPayment(e,!1)}async getExp(e,t=0){let a=await this.getTrackedHeros(),s=await renderTemplate("systems/dsa5/templates/dialog/master-ap-award.html",{selected:e,tracked:a,amount:t,text:game.i18n.localize(game.i18n.format("MASTER.awardXPText",{heros:game.i18n.localize("MASTER.theGroup")}))}),i=u(async n=>{let r=Number(n.find(".input-text").val()),l=Math.max(1,Math.round(r*.25)),c=Math.max(1,Math.round(r*.1)),m=[],d=[],p=[],f=[];if(n.find(".heroSelector:checked").each((h,y)=>f.push(game.actors.get(y.value))),!isNaN(r)){for(let y of f){let k=r;y.system.isFamiliar?(k=l,d.push(y)):y.system.isPet?(k=c,p.push(y)):m.push(y),await y.update({"system.details.experience.total":y.system.details.experience.total+k})}let h=[];m.length>0&&h.push(game.i18n.format("MASTER.xpMessage",{heros:this.getNames(m),number:r})),d.length>0&&h.push(game.i18n.format("MASTER.xpMessage",{heros:this.getNames(d),number:l})),p.length>0&&h.push(game.i18n.format("MASTER.xpMessage",{heros:this.getNames(p),number:c})),h.length>0&&await ChatMessage.create(g.chatDataSetup(`

    ${h.join("

    ")}

    `)),this.rendered&&this.render(!0)}},"callback");this.buildDialog(game.i18n.localize("MASTER.awardXP"),s,i)}getNames(e){return e.map(t=>t.name).join(", ")}buildDialog(e,t,a){new de({title:e,content:t,default:"Yes",buttons:{Yes:{icon:'',label:game.i18n.localize("yes"),callback:u(s=>{a(s)},"callback")},cancel:{icon:'',label:game.i18n.localize("cancel")}}}).render(!0)}_canDragDrop(e){return!0}async _onDrop(e){let t;try{t=JSON.parse(e.dataTransfer.getData("text/plain")),t=await Actor.implementation.fromDropData(t)}catch{return!1}if(t.documentName=="Actor"){let a=game.settings.get("dsa5","trackedActors");a=a.actors||[],a.indexOf(t.id)==-1&&!t.pack&&(a.push(t.id),await this.setTrackedHeros(a),this.render(!0));let s=$(e.target).closest(".isFolder"),i=Pe(game.settings.get("dsa5","masterSettings"));s.length?i.folders=i.folders.map(n=>(n.content=n.content.filter(r=>r!=t.id),n.id==s[0].dataset.id&&n.content.push(t.id),n)):i.folders=i.folders?.map(n=>(n.content=n.content.filter(r=>r!=t.id),n))||[],await game.settings.set("dsa5","masterSettings",i),this.render(!0)}}selectedIDs(){let e=[],t=this.getSelectedActors();for(let[a,s]of Object.entries(t))s&&game.actors.has(a)&&e.push(a);return e.length?e:game.settings.get("dsa5","trackedActors").actors||[]}async doGroupCheck(e=0){let[t,a]=this.lastSkill.split("|");if(a!="skill")return;let s=await renderTemplate("systems/dsa5/templates/dialog/master-dialog-award.html",{amount:e,text:game.i18n.localize(game.i18n.format("MASTER.doGroupCheck",{skill:t}))}),i=u(n=>{let r=Number(n.find(".input-text").val()),[l,c]=this.lastSkill.split("|");c=="skill"&&ie.showGCMessage(l,r)},"callback");this.buildDialog(game.i18n.localize("HELP.groupcheck"),s,i)}async rollRequest(e=0){let[t,a]=this.lastSkill.split("|"),s=["attribute","skill","regeneration"];if(!s.includes(a))return;let i=await renderTemplate("systems/dsa5/templates/dialog/master-dialog-award.html",{amount:e,text:game.i18n.localize(game.i18n.format("MASTER.doRequestRoll",{skill:t}))}),n=u(r=>{let l=Number(r.find(".input-text").val()),[c,m]=this.lastSkill.split("|");s.includes(m)&&ie.showRQMessage(c,l)},"callback");this.buildDialog(game.i18n.localize("HELP.request"),i,n)}rollAbility(e){let[t,a]=this.lastSkill.split("|");switch(a){case"skill":this.rollSkill(e,t);break;case"attribute":this.rollAttribute(e,t);break;case"regeneration":this.rollRegeneration(e);break}}rollRegeneration(e){let t=game.actors.filter(a=>e.includes(a.id));for(let a of t)a.setupRegeneration("regenerate",{rollMode:"blindroll",subtitle:` (${a.name})`},void 0).then(s=>{a.basicTest(s)})}rollAttribute(e,t){let a=game.actors.filter(i=>e.includes(i.id)),s=Object.keys(game.dsa5.config.characteristics).find(i=>game.i18n.localize(game.dsa5.config.characteristics[i])==t);for(let i of a)i.setupCharacteristic(s,{rollMode:"blindroll",subtitle:` (${i.name})`},void 0).then(n=>{i.basicTest(n)})}rollSkill(e,t){let a=game.actors.filter(s=>e.includes(s.id));for(let s of a){let i=s.items.find(n=>n.name==t&&n.type=="skill");s.setupSkill(i,{rollMode:"blindroll",subtitle:` (${s.name})`},void 0).then(n=>{s.basicTest(n)})}}getID(e){return $(e.currentTarget).closest(".hero").attr("data-id")}static get defaultOptions(){let e=super.defaultOptions;return e.tabs=[{navSelector:".tabs",contentSelector:".content",initial:"main"}],Sa(e,{classes:e.classes.concat(["dsa5","largeDialog","masterMenu","sheet"]),width:470,height:740,title:game.i18n.localize("gmMenu"),dragDrop:[{dragSelector:null,dropSelector:null}]}),e.template="systems/dsa5/templates/system/mastermenu.html",e.resizable=!0,e}async getTrackedHeros(){let e=game.settings.get("dsa5","trackedActors"),t=[];return e.actors&&e.actors.length>0?t=game.actors.filter(a=>e.actors.includes(a.id)).sort((a,s)=>e.actors.indexOf(a.id)-e.actors.indexOf(s.id)):(t=game.actors.filter(a=>a.hasPlayerOwner),await this.setTrackedHeros(t.map(a=>a.id))),t}async getData(e){let t=await super.getData(e),a=await this.getTrackedHeros(),s=N.getGroupSchips(),i=game.settings.get("dsa5","sightOptions").split("|"),n=/ \[[a-zA-Zäöü\d-]+\]/,r=[1,2,3,4].map(p=>({label:game.i18n.localize(`VisionDisruption.step${p}`).replace(n,""),value:i[p-1]}));t.sceneConfig={sceneAutomationEnabled:game.settings.get("dsa5","sightAutomationEnabled"),enableDPS:game.settings.get("dsa5","enableDPS"),lightSightCompensationEnabled:game.settings.get("dsa5","lightSightCompensationEnabled"),visions:r,darkness:canvas.scene?.environment.darknessLevel||0},this.heros=a;let l=this.getSelectedActors(),c=Pe(game.settings.get("dsa5","masterSettings")),m=[],d=(c.folders||[]).map(p=>(p.contents=[],p.content=new Set(p.content),p));for(let p of a){let f=Fo(p),h=[],y=[],k=[];for(let v of f.items)switch(v.type){case"disadvantage":h.push({name:v.name,uuid:v.uuid});break;case"advantage":y.push({name:v.name,uuid:v.uuid});break;case"money":k.push(v);break}Sa(f,{id:p.id,uuid:p.uuid,selected:l[p.id],schips:p.schipshtml(),purse:k.sort((v,I)=>I.system.price.value-v.system.price.value).map(v=>`${v.system.quantity.value}`).join(" - "),advantages:y,disadvantages:h,system:{status:{wounds:{max:p.system.status.wounds.max},astralenergy:{max:p.system.status.astralenergy.max},karmaenergy:{max:p.system.status.karmaenergy.max}},isMage:p.system.isMage,isPriest:p.system.isPriest}});let D=!1;for(let v of d)if(v.content.has(p.id)){v.contents.push(f),D=!0;break}D||m.push(f)}if(!this.abilities){let p=await g.allSkillsList();this.abilities=p.map(f=>({name:f,type:"skill"})).concat(Object.values(game.dsa5.config.characteristics).map(f=>({name:game.i18n.localize(f),type:"attribute"})).concat({name:game.i18n.localize("regenerate"),type:"regeneration"})).map(f=>(f.key=`${f.name}|${f.type}`,f))}return Sa(t,{hasHeros:a.length>0,heros:m,folders:d,abilities:this.abilities,groupschips:s,masterSettings:c,lastSkill:this.lastSkill,randomCreation:this.randomCreation.map(p=>p.template),lightButton:game.dsa5.apps.LightDialog?await game.dsa5.apps.LightDialog.getButtonHTML():""}),t}registerRandomCreation(e){this.randomCreation.push(e)}},Aa=class extends FormApplication{static{u(this,"GlobalModAddition")}constructor(e){super(),this.mod_id=e}static get defaultOptions(){let e=super.defaultOptions;return e.template="systems/dsa5/templates/system/global-mod-addition.html",e.title=game.i18n.localize("MASTER.addGlobalMod"),e.width=400,e.resizable=!0,e}activateListeners(e){super.activateListeners(e),e.find(".addGlobalMod").click(t=>this.addGlobalMod(t))}async getData(e){let t=await super.getData(e);return this.mod_id?t.config=Pe(game.settings.get("dsa5","masterSettings").globalMods[this.mod_id]):t.config={value:0,victim:{npc:!0,player:!0}},t.categories=["skill","spell","meleeweapon","rangeweapon","ritual","ceremony","liturgy","trait"],t}async addGlobalMod(e){e.preventDefault();let t=Pe(game.settings.get("dsa5","masterSettings")),a=Pe(new FormDataExtended($(this._element).find("form")[0]).object);a.enabled=!0,a.name&&(this.mod_id?t.globalMods[this.mod_id]=a:Sa(t,{globalMods:{[Xn()]:a}}),await game.settings.set("dsa5","masterSettings",t),game.dsa5.apps.gameMasterMenu.render(),this.close())}};var qt=class extends Be(Ne){static{u(this,"CreatureMerchantSheetDSA5")}static get merchantTemplate(){return"systems/dsa5/templates/actors/merchant/creature-merchant-sheet.html"}};var Wt=class extends Be(Ce){static{u(this,"CharacterMerchantSheetDSA5")}static get merchantTemplate(){return"systems/dsa5/templates/actors/merchant/character-merchant-sheet.html"}};var{mergeObject:Ho}=foundry.utils,Ut=class extends JournalSheet{static{u(this,"DSAJournalSheet")}static get defaultOptions(){let e=super.defaultOptions;return Ho(e,{classes:e.classes.concat(["dsa5","dsajournal"])}),e}};function Zn(){let o=ActorDelta._onUpdateOperation;ActorDelta._onUpdateOperation=async(t,a,s)=>{for(let i of t)await O.postUpdateConditions(i.syntheticActor);return o(t,a,s)};let e=ActorDelta._onCreateOperation;ActorDelta._onCreateOperation=async(t,a,s)=>{for(let i of t)await O.postUpdateConditions(i.syntheticActor);return e(t,a,s)}}u(Zn,"setActorDelta");var{mergeObject:jo}=foundry.utils;function sn(){Mi(),Ei(),ys(),$i(),Oi(),_i(),$n(),ji(),Gi(),Ui(),Hi(),Ia(),Ki(),Ji(),Zn()}u(sn,"default");Hooks.once("init",()=>{loadTemplates(["systems/dsa5/templates/actors/actor-main.html","systems/dsa5/templates/actors/actor-talents.html","systems/dsa5/templates/items/item-description.html","systems/dsa5/templates/dialog/default-dialog.html","systems/dsa5/templates/dialog/parts/targets.html","systems/dsa5/templates/dialog/enhanced-default-dialog.html","systems/dsa5/templates/dialog/default-combat-dialog.html","systems/dsa5/templates/chat/roll/test-card.html","systems/dsa5/templates/items/item-equipment.html","systems/dsa5/templates/items/item-enchantment.html","systems/dsa5/templates/actors/actor-combat.html","systems/dsa5/templates/actors/actor-equipment.html","systems/dsa5/templates/actors/actor-notes.html","systems/dsa5/templates/dialog/parts/spellmodifiers.html","systems/dsa5/templates/dialog/parts/canChangeCastingTime.html","systems/dsa5/templates/actors/parts/schipspart.html","systems/dsa5/templates/chat/post-item.html","systems/dsa5/templates/items/item-stat.html","systems/dsa5/templates/items/item-extension.html","systems/dsa5/templates/actors/creature/creature-main.html","systems/dsa5/templates/actors/creature/creature-loot.html","systems/dsa5/templates/actors/creature/creature-notes.html","systems/dsa5/templates/actors/creature/creature-magic.html","systems/dsa5/templates/system/masterHeros.html","systems/dsa5/templates/actors/creature/creature-religion.html","systems/dsa5/templates/actors/parts/characteristics-large.html","systems/dsa5/templates/actors/parts/gearSearch.html","systems/dsa5/templates/actors/parts/magicalSigns.html","systems/dsa5/templates/actors/parts/containerContent.html","systems/dsa5/templates/actors/npc/npc-main.html","systems/dsa5/templates/actors/character/actor-magic.html","systems/dsa5/templates/actors/character/actor-religion.html","systems/dsa5/templates/actors/character/actor-aggregatedtests.html","systems/dsa5/templates/actors/parts/creature-derived-attributes-small.html","systems/dsa5/templates/actors/parts/creature-derived-attributes-large.html","systems/dsa5/templates/actors/parts/status_effects.html","systems/dsa5/templates/actors/parts/purse.html","systems/dsa5/templates/actors/parts/combat_weapon.hbs","systems/dsa5/templates/actors/parts/combat_rangeweapon.hbs","systems/dsa5/templates/actors/parts/horse.html","systems/dsa5/templates/actors/parts/healthbar.html","systems/dsa5/templates/actors/merchant/merchant-commerce.html","systems/dsa5/templates/items/item-header.html","systems/dsa5/templates/items/item-effects.html","systems/dsa5/templates/items/item-aoe.html","systems/dsa5/templates/items/traditionArtifact.html","systems/dsa5/templates/status/advanced_functions.html","systems/dsa5/templates/actors/parts/information.html","systems/dsa5/templates/actors/parts/personaltrait.html","systems/dsa5/templates/actors/parts/combatskills.html","systems/dsa5/templates/actors/parts/attributes.html","systems/dsa5/templates/actors/parts/swarm.html","systems/dsa5/templates/actors/parts/carryandpurse.html","systems/dsa5/templates/actors/parts/specialabilities.html","systems/dsa5/templates/actors/parts/experienceBox.html","systems/dsa5/templates/actors/parts/temperature.html","systems/dsa5/templates/actors/parts/temperatureSmall.html","systems/dsa5/templates/actors/parts/spells.html","systems/dsa5/templates/dialog/parts/expChoices.html","systems/dsa5/templates/actors/parts/liturgies.html","systems/dsa5/templates/items/browse/actor.html","systems/dsa5/templates/items/browse/garadan.html","systems/dsa5/templates/items/browse/culture.html","systems/dsa5/templates/items/browse/species.html","systems/dsa5/templates/items/browse/career.html","systems/dsa5/templates/items/meleeweapon-attack-part.hbs","systems/dsa5/templates/items/rangeweapon-attack-part.hbs","systems/dsa5/templates/actors/parts/specblock.html"]),Actors.unregisterSheet("core",ActorSheet),Actors.registerSheet("dsa5",Ce,{types:["character"],makeDefault:!0}),Actors.registerSheet("dsa5",Ne,{types:["creature"],makeDefault:!0}),Actors.registerSheet("dsa5",Re,{types:["npc"],makeDefault:!0}),Actors.registerSheet("dsa5",Ie,{types:["npc"]}),Actors.registerSheet("dsa5",qt,{types:["creature"]}),Actors.registerSheet("dsa5",Wt,{types:["character"]}),DocumentSheetConfig.registerSheet(ActiveEffect,"dsa5",Z,{makeDefault:!0}),Journal.registerSheet("dsa5",Ut,{makeDefault:!0}),Y.setupSheets(),Hooks.call("registerDSAstyle",b.styles),Kn(),ne.initDoorMinDistance(),jo(CONFIG.JournalEntry.noteIcons,b.noteIcons),K.prepareSoundEffects();let o=game.settings.get("dsa5","globalStyle");b.styles[o]||(o=Object.keys(b.styles)[0]),$("body").addClass(o)});Hooks.once("setup",()=>{if(!["de","en"].includes(game.i18n.lang))console.warn(`DSA5 - ${game.i18n.lang} is not a supported language. Falling back to default language.`),Go();else{let o=game.settings.get("dsa5","forceLanguage");["de","en"].includes(o)&&game.i18n.lang!=o&&Bo(o)}Gt.initHook(),Yi(),Bt.registerButtons(),pt.registerButtons(),CONFIG.Canvas.lightAnimations.daylight={label:"LIGHT.daylight",illuminationShader:an},P.setupFunctions(),F.setupFunctions()});Hooks.once("i18nInit",()=>{qo()});var tn=class extends foundry.applications.api.DialogV2{static{u(this,"ForbiddenLanguageDialog")}async close(e={}){if(["de","en"].includes(game.i18n.lang))return super.close(e)}},Go=u(()=>{new tn({window:{title:"language"},content:"

    Your foundry language is not supported by this system. Due to technical reasons your foundry language setting has to be switched to either english or german.

    ",buttons:[{action:"de",icon:"fa fa-check",label:"en",callback:u(async()=>{await game.settings.set("core","language","de"),foundry.utils.debouncedReload()},"callback")},{action:"en",icon:"fas fa-check",label:"de",callback:u(async()=>{await game.settings.set("core","language","en"),foundry.utils.debouncedReload()},"callback")},{action:"logout",icon:"fas fa-door-closed",label:"SETTINGS.Logout",callback:u(async()=>{ui.menu.items.logout.onClick()},"callback")}]}).render(!0)},"showForbiddenLanguageDialog"),Bo=u(o=>{new foundry.applications.api.DialogV2({window:{title:"DSASETTINGS.forceLanguage"},content:`

    ${game.i18n.format("DSAError.wrongLanguage",{lang:o})}

    `,buttons:[{action:"ok",icon:"fa fa-check",label:"ok",callback:u(async()=>{await game.settings.set("core","language",o),foundry.utils.debouncedReload()},"callback")},{action:"cancel",icon:"fas fa-times",label:"cancel"}]}).render(!0)},"showWrongLanguageDialog");function qo(){game.dsa5.config.knownShortcuts={[game.i18n.localize("CHARAbbrev.INI").toLowerCase()]:["status","initiative","gearmodifier"],[game.i18n.localize("CHARAbbrev.GS").toLowerCase()]:["status","speed","gearmodifier"],[game.i18n.localize("CHARAbbrev.AsP").toLowerCase()]:["status","astralenergy","gearmodifier"],[game.i18n.localize("CHARAbbrev.LeP").toLowerCase()]:["status","wounds","gearmodifier"],[game.i18n.localize("CHARAbbrev.KaP").toLowerCase()]:["status","karmaenergy","gearmodifier"],[game.i18n.localize("CHARAbbrev.AW").toLowerCase()]:["status","dodge","gearmodifier"],[game.i18n.localize("CHARAbbrev.SK").toLowerCase()]:["status","soulpower","gearmodifier"],[game.i18n.localize("CHARAbbrev.ZK").toLowerCase()]:["status","toughness","gearmodifier"],[game.i18n.localize("CHARAbbrev.FtP").toLowerCase()]:["status","fatePoints","gearmodifier"]};for(let o of Object.keys(b.characteristics))game.dsa5.config.knownShortcuts[game.i18n.localize(`CHARAbbrev.${o.toUpperCase()}`).toLowerCase()]=["characteristics",o.toLowerCase(),"gearmodifier"]}u(qo,"setupKnownEquipmentModifiers");var an=class extends AdaptiveIlluminationShader{static{u(this,"DaylightIlluminationShader")}static fragmentShader=` +`)}`)}else{let s=await this.getToc();$(this._element).find(".toc").html(s).find(".filterJournals").trigger("focus")}let t=await this.getChapter(),a=$(this._element).find(".chapter");a.html(t),this.markFindings(a)}async showSearchResults(e){this.searchString&&await TextEditor._replaceTextContent(TextEditor._getTextNodes(e),new RegExp(this.searchString,"ig"),(t,a)=>$(`${t[0]}`)[0])}_onClickPageLink(e){let t=e.currentTarget.closest("[data-anchor]")?.dataset.anchor;if(t){let s=this.element[0].querySelector(`.chapter [data-anchor="${t}"]`);if(s){s.scrollIntoView({behavior:"smooth"});return}}this.element[0].querySelector(".journalHeader")?.scrollIntoView({behavior:"smooth"})}async _renderHeadings(e,t=!1){let a=Object.values(e);t&&a.shift();let s=Math.min(...a.map(i=>i.level));return await renderTemplate("templates/journal/journal-page-toc.html",{headings:a.reduce((i,{text:n,level:r,slug:l,element:c})=>(c&&(c.dataset.anchor=l),r${f}
    `),d||(f=`

    ${m}

    ${f}`),t+=f}this.pageTocs=a.join("");let s=this.findSceneNote(e.getFlag("dsa5","initId")),i=await TextEditor.enrichHTML(t,{secrets:game.user.isGM,async:!0});return`

    ${e.name}
    ${s}

    ${i}`}async showJournal(e){let t=$(this._element).find(".chapter");t.html(await this.renderContent(e)),this.selectedSubChapter=e.id,$(this._element).find(".subChapter").removeClass("selected"),$(this._element).find(`[data-jid="${e.id}"]`).addClass("selected"),Qe(t),this.markFindings(t),t.find(".documentName-link, .content-link").on("click",a=>{let s=a.currentTarget.dataset;this.bookData&&s.pack==this.bookData.journal&&s.type!="JournalEntryPage"&&(a.stopPropagation(),this.loadJournalById(s.id))})}findSceneNote(e){if(e){let t=game.journal.find(a=>a.getFlag("dsa5","initId")==e);if(t&&t.sceneNote)return``}return""}async importBook(){game.user.isGM&&new Qi().render(this.bookData.moduleName,this.bookData.options)}async loadBook(e,t,a){this.selectedChapter=void 0,this.selectedType=void 0,this.content=void 0,a||(a=this.currentType),this.currentType=a,this.book=this[a].find(s=>s.id==e),await fetch(this.book.path).then(async s=>s.json()).then(async s=>{this.bookData=s;let i=game.packs.get(s.journal);await i.getIndex();let n=await i.getDocuments();this.journals=n,s.actors&&(i=game.packs.get(s.actors),n=await i.getIndex(),this.actors=n),s.scenes&&(i=game.packs.get(s.scenes),n=await i.getIndex(),this.scenes=n),this.checkChapters(i),this.loadPage(t)})}checkChapters(e){this.bookData.chapters||(this.bookData.isDynamic=!0,this.bookData.chapters=[{name:game.i18n.localize(`${this.bookData.moduleName}.name`),content:e.folders.map(t=>({name:t.name,id:t.id}))}])}async prefillActors(e){if(!e.actors)return[];let t=[],a=await game.folders.contents.find(i=>i.name==game.i18n.localize(`${this.bookData.moduleName}.name`)&&i.type=="Actor"&&i.folder==null),s=a?await game.folders.contents.filter(i=>i.type=="Actor"&&i.folder?.id==a.id).map(i=>i.id):void 0;for(let i of e.actors){let n=s?.length?game.actors.contents.find(m=>m.name==i&&s.includes(m.folder?.id)):void 0,r,l=n?.id,c=n?.uuid;n||(n=this.actors.find(m=>m.name==i),r=this.bookData.actors,l=n?._id,c=n?`Compendium.${r}.${l}`:void 0),t.push({name:i,actor:n,pack:r,id:l,uuid:c})}return t}async popJournal(e){(await fromUuid(e)).sheet.render(!0)}async showSzene(e,t="activate"){let a=game.scenes.contents.find(s=>s.name==e);if(!a)return ui.notifications.error("DSAError.sceneNotInitialized",{localize:!0});switch(t){case"activate":a.activate();break;case"view":a.view();break;case"toggle":a.update({navigation:!a.navigation});break}}async getChapter(){if(this.book){if(this.content){let e=this.journals.find(t=>t.id==this.content);return await this.renderContent(e)}if(this.selectedChapter){if(this.selectedChapter=="prep"){let a={initDescr:game.i18n.format(`${this.bookData.options?.scope||this.bookData.moduleName}.importContent`,{defaultText:game.i18n.localize("importDefault")})},s=this.bookData.modules;for(let i of s)i.enabled=this.moduleEnabled(i.id);return await renderTemplate("systems/dsa5/templates/wizard/adventure/adventure_preparation.html",{modules:s,info:a})}else if(this.selectedChapter=="foundryUsage")return await renderTemplate("systems/dsa5/templates/wizard/adventure/adventure_foundry.html");let e=this.bookData.chapters.find(a=>a.name==this.selectedType).content.find(a=>a.id==this.selectedChapter),t=this.getSubChapters();return e.scenes||e.actors||t.length==0?await renderTemplate("systems/dsa5/templates/wizard/adventure/adventure_chapter.html",{chapter:e,subChapters:this.getSubChapters(),actors:await this.prefillActors(e)}):(this.selectedSubChapter=t[0].id,await this.loadJournalById(t[0].id))}return await renderTemplate("systems/dsa5/templates/wizard/adventure/adventure_cover.html",{book:this.book,bookData:this.bookData})}else return await renderTemplate("systems/dsa5/templates/wizard/adventure/adventure_intro.html",{rshs:this.filterBooks(this.rshs),rules:this.filterBooks(this.books),adventures:this.filterBooks(this.adventures),manuals:this.filterBooks(this.manuals),isGM:game.user.isGM})}filterBooks(e){let t=game.settings.get("dsa5","expansionPermissions");for(let a of e)t[a.id]!=null&&(a.visible=t[a.id]);return game.user.isGM?e:e.filter(a=>a.visible==null||a.visible).sort((a,s)=>a.id.localeCompare(s.id))}getSubChapters(){let e;return this.bookData.isDynamic?e=this.journals.filter(t=>t.folder.id==this.selectedChapter).sort((t,a)=>t.sort>a.sort?1:-1):e=this.journals.filter(t=>t.flags.dsa5.parent==this.selectedChapter).sort((t,a)=>t.flags.dsa5.sort>a.flags.dsa5.sort?1:-1),e.map(t=>{let a=this.selectedSubChapter==t.id;return{name:t.name,id:t.id,selected:a,cssClass:a?"selected":""}})}async getToc(){let e=[];if(this.book){if(e.push(..._o(this.bookData.chapters)),this.selectedChapter){let t;for(let a of e)if(t=a.content.find(s=>s.id==this.selectedChapter),t)break;t&&(t.cssClass="selected",t.subChapters=this.getSubChapters())}return await renderTemplate("systems/dsa5/templates/wizard/adventure/adventure_toc.html",{chapters:e,searchString:this.searchString,book:this.book,pageTocs:this.pageTocs,fulltextsearch:this.fulltextsearch?"on":""})}else return'
    '}async loadPage(e){let t=await this.getChapter(),a=await this.getToc();this._saveScrollPositions(e),e.find(".toc").html(a);let s=e.find(".chapter");s.html(t),this.markFindings(s),this._restoreScrollPositions(e)}async getData(e){let t=await super.getData(e),a=await this.getChapter(),s=await this.getToc(),i=game.settings.get("dsa5","journalFontSizeIndex"),n=b.journalFontSizes[i-1]||14;return Jn(t,{adventure:this.bookData,currentChapter:a,breadcrumbs:this.renderBreadcrumbs(),toc:s,fontSize:n}),t}async pinJournal(e,t=void 0){let a=this.readBreadCrumbs();t||(t=(await fromUuid(e))?.name||""),a[e]=t,game.settings.set("dsa5",`breadcrumbs_${game.world.id}`,JSON.stringify(a)),this.render(!0)}unpinJournal(e){let t=this.readBreadCrumbs();delete t[e],game.settings.set("dsa5",`breadcrumbs_${game.world.id}`,JSON.stringify(t)),this.render(!0)}_canDragDrop(e){return!0}async _onDrop(e){let t;try{t=JSON.parse(e.dataTransfer.getData("text/plain"))}catch{return!1}t.type=="JournalEntry"&&this.pinJournal(t.pack?`Compendium.${t.pack}.${t.id}`:`JournalEntry.${t.id}`)}readBreadCrumbs(){let e={};try{e=JSON.parse(game.settings.get("dsa5",`breadcrumbs_${game.world.id}`))}catch{console.log("No Journalbrowser notes found")}return e}renderBreadcrumbs(){let e=this.readBreadCrumbs(),t=Object.entries(e).map(a=>`
    ${a[1]}
    `);return t.length>0?``:""}moduleEnabled(e){return game.modules.get(e)?game.modules.get(e).active?"fa-check":"fa-dash":"fa-times"}},Qi=class extends FormApplication{static{u(this,"InitializerForm")}render(e,t){new game.dsa5.apps.DSA5Initializer("DSA5 Module Initialization",game.i18n.format(`${t?.scope||e}.importContent`,{defaultText:game.i18n.localize("importDefault")}),e,game.i18n.lang,t).render(!0)}},Xi=class{static{u(this,"JournalSearch")}constructor(e){let t=e.pages.find(a=>!0).text.content;this.document={name:e.name,data:$("
    ").html(t).text(),id:e.id}}get name(){return this.document.name}get data(){return this.document.data}get id(){return this.document.id}};var{hasProperty:Qn,expandObject:Pe,mergeObject:Sa,duplicate:Fo,randomID:Xn}=foundry.utils,Bt=class{static{u(this,"MastersMenu")}static registerButtons(){game.dsa5.apps.playerMenu=new ot,CONFIG.Canvas.layers.dsamenu={layerClass:Zi,group:"interface"},Hooks.on("getSceneControlButtons",e=>{let t=[{name:"JournalBrowser",title:"Book.Wizard",icon:"fa fa-book",button:!0,onClick:u(()=>{g.renderToggle(game.dsa5.apps.journalBrowser)},"onClick")},{name:"Library",title:"SHEET.Library",icon:"fas fa-university",button:!0,onClick:u(()=>{g.renderToggle(game.dsa5.itemLibrary)},"onClick")},{name:"PlayerMenu",title:"PLAYER.title",icon:"fas fa-dsa5-player",button:!0,onClick:u(()=>{g.renderToggle(game.dsa5.apps.playerMenu)},"onClick")}];if(game.settings.get("dsa5","masterCanvasControls")&&game.dsa5.apps.tokenHotbar)for(let a=3;agame.dsa5.apps.tokenHotbar.callbackFunctions[s.id](),"onClick")})}game.user.isGM&&(game.dsa5.apps.gameMasterMenu||(game.dsa5.apps.gameMasterMenu=new en),t.push({name:"mastersMenu",title:"gmMenu",icon:"fa fa-dsa5",button:!0,onClick:u(()=>{g.renderToggle(game.dsa5.apps.gameMasterMenu)},"onClick")})),e.push({name:"GM Menu",title:game.i18n.localize("gmMenu"),icon:"fas fa-dsa5",layer:"dsamenu",tools:t})})}},Zi=class extends InteractionLayer{static{u(this,"DSAMenuLayer")}static get layerOptions(){return foundry.utils.mergeObject(super.layerOptions,{name:"dsamenu",canDragCreate:!1,controllableObjects:!0,rotatableObjects:!0,zIndex:666})}selectObjects(e){canvas.tokens.selectObjects(e)}},en=class extends Application{static{u(this,"GameMasterMenu")}constructor(e){super(e),this.heros=[],this.lastSkill=`${game.i18n.localize("LocalizedIDs.perception")}|skill`,this.randomCreation=[],game.user.isGM&&(Hooks.on("updateActor",async(t,a,s,i)=>{if(!this.rendered)return;let n=["system.status.fatePoints","system.status.wounds","system.status.karmaenergy","system.status.astralenergy"];this.heros.some(r=>r.id==t.id)&&n.reduce((r,l)=>r||Qn(a,l),!1)&&this.render()}),Hooks.on("updateScene",async(t,a,s,i)=>{let n=["environment.darknessLevel"];if(game.canvas.id==t.id&&n.reduce((r,l)=>r||Qn(a,l),!1)){if(game.dsa5.apps.LightDialog&&game.dsa5.apps.LightDialog.onDarknessChange(),!this.rendered)return;this.render()}}),Hooks.on("canvasInit",()=>{this.rendered&&this.render()}))}async _render(e=!1,t={}){if(!game.user.isGM)return ui.notifications.error("DSAError.onlyGMallowed");await super._render(e,t)}getSelectedActors(){let e=game.settings.get("dsa5","selectedActors"),t=game.settings.get("dsa5","trackedActors"),a={};for(let s of Object.keys(e))t.actors?.includes(s)&&(a[s]=e[s]);return a}activateListeners(e){super.activateListeners(e),e.find("select.select2").select2(),me(e),e.find(".heroLink").click(a=>{a.stopPropagation(),game.actors.get(this.getID(a)).sheet.render(!0)}),e.find(".addGlobalMod").click(()=>this.addGlobalMod()),e.find(".globalModEnable").change(a=>this.toggleGlobalMod(a)),e.find(".removeGlobalMod").click(a=>this.removeGlobalMod(a)),e.find(".editGlobalMod").click(a=>this.editGlobalMod(a)),e.find(".heroSelector").change(a=>{a.stopPropagation();let s=this.getSelectedActors();s[this.getID(a)]=$(a.currentTarget).is(":checked"),game.settings.set("dsa5","selectedActors",s)}),e.find(".skillSelektor").change(a=>{a.stopPropagation(),this.lastSkill=$(a.currentTarget).val()}),e.find(".rollChar").click(a=>{a.stopPropagation(),this.rollAbility([this.getID(a)])}),e.find(".rollAll").click(a=>{a.stopPropagation(),this.rollAbility(this.selectedIDs())}),e.find(".pay").click(a=>{a.stopPropagation(),this.doPayment([this.getID(a)],!0)}),e.find(".actorItem").click(async a=>{a.stopPropagation();let s=a.currentTarget.dataset.uuid;(await fromUuid(s)).sheet.render(!0)}),e.find(".getPaid").click(a=>{a.stopPropagation(),this.doPayment([this.getID(a)],!1)}),e.find(".resetSightThresholds").click(()=>this.resetSightThresholds()),e.find(".payAll").click(a=>{a.stopPropagation(),this.doPayment(this.selectedIDs(a),!0)}),e.find(".getPaidAll").click(a=>{a.stopPropagation(),this.doPayment(this.selectedIDs(a),!1)}),e.find(".selectAll").change(a=>this._selectAll(a,e)),e.find(".exp").click(a=>{a.stopPropagation(),this.getExp([this.getID(a)])}),e.find(".expAll").click(a=>{a.stopPropagation(),this.getExp(this.selectedIDs())}),e.find(".randomPlayer").mousedown(a=>{a.stopPropagation(),this._randomPlayer(e,a)}),e.find(".requestRoll").click(a=>{a.stopPropagation(),this.rollRequest()}),e.find(".heroSelector").click(a=>a.stopPropagation()),e.find(".hero").click(a=>{a.stopPropagation(a),$(a.currentTarget).find(".expandDetails").fadeToggle()});let t=u(a=>this._deleteHero(a),"deletehand");e.find(".hero").mouseenter(a=>{if(a.currentTarget.getElementsByClassName("hovermenu").length==0){let s=document.createElement("div");s.classList.add("hovermenu");let i=document.createElement("i");i.classList.add("fas","fa-times"),i.dataset.tooltip="SHEET.DeleteItem",i.addEventListener("click",t,!1),s.appendChild(i),a.currentTarget.appendChild(s)}}),e.find(".hero").mouseleave(a=>{let s=a.toElement||a.relatedTarget;!s||s.parentNode==this||s==this||a.currentTarget.querySelectorAll(".hovermenu").forEach(i=>i.remove())}),e.find(".addGroupSchip").click(async a=>{await this.changeGroupSchipCount(Number(a.currentTarget.dataset.value))}),e.find(".groupschip").click(a=>{this.changeGroupSchip(a)}),e.find(".addFolder").click(async a=>this.editFolder(a)),e.find(".editFolder").change(async a=>this._editFolder(a)),e.find(".heroschip").click(a=>{a.stopPropagation(),a.preventDefault();let s=Number(a.currentTarget.getAttribute("data-val"));s==1&&$(a.currentTarget).closest(".hero").find(".fullSchip").length==1&&(s=0),game.actors.get(this.getID(a)).update({"system.status.fatePoints.value":s})}),e.find(".groupCheck").click(a=>{a.stopPropagation(),this.doGroupCheck()}),e.find(".changeSetting").change(async a=>{await game.settings.set("dsa5",a.currentTarget.name,a.currentTarget.checked)}),e.find(".changeSightTreshold").change(async a=>{$(a.currentTarget).closest(".row-section").find(".range-value").text(a.currentTarget.value),this.updateSightThreshold(a)}),e.find(".updateDarkness").change(async a=>{$(a.currentTarget).closest(".row-section").find(".range-value").text(a.currentTarget.value),this.updateDarkness(a)});for(let a of this.randomCreation)a.activateListeners(e);aa(e,".heros",this.updateHeroOrder,".hero"),e.on("dragstart",".hero",a=>{a.stopPropagation();let i={type:"Actor",uuid:a.currentTarget.dataset.uuid};a.originalEvent.dataTransfer.setData("text/plain",JSON.stringify(i))}),e.find(".dragEveryone").each(function(a,s){s.setAttribute("draggable",!0)}),e.on("dragstart",".dragEveryone",a=>this._dragEveryone(a)),game.dsa5.apps.LightDialog&&game.dsa5.apps.LightDialog.activateButtonListener(e)}async _dragEveryone(e){e.stopPropagation();let t;e.currentTarget.dataset.folder?t=Pe(game.settings.get("dsa5","masterSettings")).folders.find(i=>i.id==e.currentTarget.dataset.folder).content:t=this.selectedIDs();let a={type:"GroupDrop",ids:t};e.originalEvent.dataTransfer.setData("text/plain",JSON.stringify(a))}async _selectAll(e,t){e.stopPropagation();let a=".heroSelector";e.currentTarget.dataset.folder&&(a=`[data-id="${e.currentTarget.dataset.folder}"] .heroSelector`);let s=t.find(a);s.prop("checked",$(e.currentTarget).is(":checked")),s.change()}async _deleteHero(e){e.stopPropagation(),e.preventDefault();let t=$(e.currentTarget).closest(".hero").attr("data-id"),a=game.settings.get("dsa5","trackedActors").actors||[],s=a.indexOf(t);s>-1&&(a.splice(s,1),await this.setTrackedHeros(a),this.render(!0))}async updateHeroOrder(e){let t=[];for(let a of e.querySelectorAll(".hero"))t.push(a.dataset.id);await this.setTrackedHeros(t)}async setTrackedHeros(e){await game.settings.set("dsa5","trackedActors",{actors:e.filter(t=>game.actors.has(t))})}async updateDarkness(e){canvas.scene&&canvas.scene.update({"environment.darknessLevel":Number(e.currentTarget.value)},{animateDarkness:3e3})}async updateSightThreshold(e){let t=Number(e.currentTarget.dataset.index),a=Number(e.currentTarget.value),s=game.settings.get("dsa5","sightOptions").split("|");s[t]=a,await game.settings.set("dsa5","sightOptions",s.join("|"))}async resetSightThresholds(){await game.settings.set("dsa5","sightOptions",game.settings.settings.get("dsa5.sightOptions").default),this.render(!0)}getGroupSchipSetting(){return game.settings.get("dsa5","groupschips").split("/").map(e=>Number(e))}async changeGroupSchipCount(e){let t=this.getGroupSchipSetting();t[1]=Math.max(0,t[1]+e),t[0]=Math.min(t[1],t[0]),await game.settings.set("dsa5","groupschips",t.join("/"))}async changeGroupSchip(e){let t=Number(e.currentTarget.getAttribute("data-val"));t==1&&$(e.currentTarget).closest(".col").find(".fullSchip").length==1&&(t=0);let a=this.getGroupSchipSetting();a[0]=t,await game.settings.set("dsa5","groupschips",a.join("/"))}async _createFolder(){let e=Pe(game.settings.get("dsa5","masterSettings"));e.folders||(e.folders=[]),e.folders.push({id:Xn(),name:game.i18n.localize("FOLDER.ExportNewFolder"),content:[]}),await game.settings.set("dsa5","masterSettings",e),await this.render(!0)}async _deleteFolder(e){let t=e.currentTarget.dataset.id,a=Pe(game.settings.get("dsa5","masterSettings"));a.folders=a.folders.filter(s=>s.id!=t),await game.settings.set("dsa5","masterSettings",a),await this.render(!0)}async _editFolder(e){let t=e.currentTarget.dataset.id,a=Pe(game.settings.get("dsa5","masterSettings"));a.folders.find(s=>s.id==t).name=e.currentTarget.value,await game.settings.set("dsa5","masterSettings",a)}async editFolder(e){switch(e.currentTarget.dataset.action){case"create":this._createFolder();break;case"delete":this._deleteFolder(e);break}}async addGlobalMod(){new Aa().render(!0)}async editGlobalMod(e){let t=e.currentTarget.dataset.key;new Aa(t).render(!0)}async toggleGlobalMod(e){let t=game.settings.get("dsa5","masterSettings");t.globalMods[e.currentTarget.dataset.key].enabled=e.currentTarget.checked,await game.settings.set("dsa5","masterSettings",t)}async removeGlobalMod(e){let t=game.settings.get("dsa5","masterSettings");delete t.globalMods[e.currentTarget.dataset.key],await game.settings.set("dsa5","masterSettings",t),this.render()}async _randomPlayer(e,t){let a=e.find(".hero"),s=await this.rollRandomPlayer(t.button==2);$(t.currentTarget).find("i").addClass("fa-spin"),a.removeClass("victim"),setTimeout(()=>{$(this._element).find(`.hero[data-id="${s}"]`).addClass("victim"),$(t.currentTarget).find("i").removeClass("fa-spin")},500)}async rollRandomPlayer(e){let t={},a=1,s=this.getSelectedActors(),i=Object.values(s).filter(l=>l).length!=0,n=this.heros.length?this.heros:await this.getTrackedHeros();if(n.length==0){ui.notifications.warn("DIALOG.noTarget",{localize:!0});return}for(let l of n)!s[l.id]&&i||(t[a]=l.id,a++,e&&P.hasVantage(l,game.i18n.localize("LocalizedIDs.misfortune"))&&(t[a]=l.id,a++),e&&l.hasCondition("badluck")&&(t[a]=l.id,a++));let r=(await new Roll(`1d${a-1}`).evaluate()).total;return t[r]}async doPayment(e,t,a=0){let s=await this.getTrackedHeros(),i=await renderTemplate("systems/dsa5/templates/dialog/master-ap-award.html",{selected:e,amount:a,tracked:s,text:game.i18n.localize(game.i18n.format(t?"MASTER.payText":"MASTER.getPaidText",{heros:game.i18n.localize("MASTER.theGroup")}))}),n=u(r=>{let l=r.find(".input-text").val();if(!isNaN(l)){let c=[];r.find(".heroSelector:checked").each((m,d)=>c.push(game.actors.get(d.value)));for(let m of c)Q.handlePayAction(void 0,t,l,m)}},"callback");this.buildDialog(game.i18n.localize(t?"MASTER.payTT":"PAYMENT.payButton"),i,n)}async getPaid(e){this.doPayment(e,!1)}async getExp(e,t=0){let a=await this.getTrackedHeros(),s=await renderTemplate("systems/dsa5/templates/dialog/master-ap-award.html",{selected:e,tracked:a,amount:t,text:game.i18n.localize(game.i18n.format("MASTER.awardXPText",{heros:game.i18n.localize("MASTER.theGroup")}))}),i=u(async n=>{let r=Number(n.find(".input-text").val()),l=Math.max(1,Math.round(r*.25)),c=Math.max(1,Math.round(r*.1)),m=[],d=[],p=[],f=[];if(n.find(".heroSelector:checked").each((h,y)=>f.push(game.actors.get(y.value))),!isNaN(r)){for(let y of f){let k=r;y.system.isFamiliar?(k=l,d.push(y)):y.system.isPet?(k=c,p.push(y)):m.push(y),await y.update({"system.details.experience.total":y.system.details.experience.total+k})}let h=[];m.length>0&&h.push(game.i18n.format("MASTER.xpMessage",{heros:this.getNames(m),number:r})),d.length>0&&h.push(game.i18n.format("MASTER.xpMessage",{heros:this.getNames(d),number:l})),p.length>0&&h.push(game.i18n.format("MASTER.xpMessage",{heros:this.getNames(p),number:c})),h.length>0&&await ChatMessage.create(g.chatDataSetup(`

    ${h.join("

    ")}

    `)),this.rendered&&this.render(!0)}},"callback");this.buildDialog(game.i18n.localize("MASTER.awardXP"),s,i)}getNames(e){return e.map(t=>t.name).join(", ")}buildDialog(e,t,a){new de({title:e,content:t,default:"Yes",buttons:{Yes:{icon:'',label:game.i18n.localize("yes"),callback:u(s=>{a(s)},"callback")},cancel:{icon:'',label:game.i18n.localize("cancel")}}}).render(!0)}_canDragDrop(e){return!0}async _onDrop(e){let t;try{t=JSON.parse(e.dataTransfer.getData("text/plain")),t=await Actor.implementation.fromDropData(t)}catch{return!1}if(t.documentName=="Actor"){let a=game.settings.get("dsa5","trackedActors");a=a.actors||[],a.indexOf(t.id)==-1&&!t.pack&&(a.push(t.id),await this.setTrackedHeros(a),this.render(!0));let s=$(e.target).closest(".isFolder"),i=Pe(game.settings.get("dsa5","masterSettings"));s.length?i.folders=i.folders.map(n=>(n.content=n.content.filter(r=>r!=t.id),n.id==s[0].dataset.id&&n.content.push(t.id),n)):i.folders=i.folders?.map(n=>(n.content=n.content.filter(r=>r!=t.id),n))||[],await game.settings.set("dsa5","masterSettings",i),this.render(!0)}}selectedIDs(){let e=[],t=this.getSelectedActors();for(let[a,s]of Object.entries(t))s&&game.actors.has(a)&&e.push(a);return e.length?e:game.settings.get("dsa5","trackedActors").actors||[]}async doGroupCheck(e=0){let[t,a]=this.lastSkill.split("|");if(a!="skill")return;let s=await renderTemplate("systems/dsa5/templates/dialog/master-dialog-award.html",{amount:e,text:game.i18n.localize(game.i18n.format("MASTER.doGroupCheck",{skill:t}))}),i=u(n=>{let r=Number(n.find(".input-text").val()),[l,c]=this.lastSkill.split("|");c=="skill"&&ie.showGCMessage(l,r)},"callback");this.buildDialog(game.i18n.localize("HELP.groupcheck"),s,i)}async rollRequest(e=0){let[t,a]=this.lastSkill.split("|"),s=["attribute","skill","regeneration"];if(!s.includes(a))return;let i=await renderTemplate("systems/dsa5/templates/dialog/master-dialog-award.html",{amount:e,text:game.i18n.localize(game.i18n.format("MASTER.doRequestRoll",{skill:t}))}),n=u(r=>{let l=Number(r.find(".input-text").val()),[c,m]=this.lastSkill.split("|");s.includes(m)&&ie.showRQMessage(c,l)},"callback");this.buildDialog(game.i18n.localize("HELP.request"),i,n)}rollAbility(e){let[t,a]=this.lastSkill.split("|");switch(a){case"skill":this.rollSkill(e,t);break;case"attribute":this.rollAttribute(e,t);break;case"regeneration":this.rollRegeneration(e);break}}rollRegeneration(e){let t=game.actors.filter(a=>e.includes(a.id));for(let a of t)a.setupRegeneration("regenerate",{rollMode:"blindroll",subtitle:` (${a.name})`},void 0).then(s=>{a.basicTest(s)})}rollAttribute(e,t){let a=game.actors.filter(i=>e.includes(i.id)),s=Object.keys(game.dsa5.config.characteristics).find(i=>game.i18n.localize(game.dsa5.config.characteristics[i])==t);for(let i of a)i.setupCharacteristic(s,{rollMode:"blindroll",subtitle:` (${i.name})`},void 0).then(n=>{i.basicTest(n)})}rollSkill(e,t){let a=game.actors.filter(s=>e.includes(s.id));for(let s of a){let i=s.items.find(n=>n.name==t&&n.type=="skill");s.setupSkill(i,{rollMode:"blindroll",subtitle:` (${s.name})`},void 0).then(n=>{s.basicTest(n)})}}getID(e){return $(e.currentTarget).closest(".hero").attr("data-id")}static get defaultOptions(){let e=super.defaultOptions;return e.tabs=[{navSelector:".tabs",contentSelector:".content",initial:"main"}],Sa(e,{classes:e.classes.concat(["dsa5","largeDialog","masterMenu","sheet"]),width:470,height:740,title:game.i18n.localize("gmMenu"),dragDrop:[{dragSelector:null,dropSelector:null}]}),e.template="systems/dsa5/templates/system/mastermenu.html",e.resizable=!0,e}async getTrackedHeros(){let e=game.settings.get("dsa5","trackedActors"),t=[];return e.actors&&e.actors.length>0?t=game.actors.filter(a=>e.actors.includes(a.id)).sort((a,s)=>e.actors.indexOf(a.id)-e.actors.indexOf(s.id)):(t=game.actors.filter(a=>a.hasPlayerOwner),await this.setTrackedHeros(t.map(a=>a.id))),t}async getData(e){let t=await super.getData(e),a=await this.getTrackedHeros(),s=N.getGroupSchips(),i=game.settings.get("dsa5","sightOptions").split("|"),n=/ \[[a-zA-Zäöü\d-]+\]/,r=[1,2,3,4].map(p=>({label:game.i18n.localize(`VisionDisruption.step${p}`).replace(n,""),value:i[p-1]}));t.sceneConfig={sceneAutomationEnabled:game.settings.get("dsa5","sightAutomationEnabled"),enableDPS:game.settings.get("dsa5","enableDPS"),lightSightCompensationEnabled:game.settings.get("dsa5","lightSightCompensationEnabled"),visions:r,darkness:canvas.scene?.environment.darknessLevel||0},this.heros=a;let l=this.getSelectedActors(),c=Pe(game.settings.get("dsa5","masterSettings")),m=[],d=(c.folders||[]).map(p=>(p.contents=[],p.content=new Set(p.content),p));for(let p of a){let f=Fo(p),h=[],y=[],k=[];for(let v of f.items)switch(v.type){case"disadvantage":h.push({name:v.name,uuid:v.uuid});break;case"advantage":y.push({name:v.name,uuid:v.uuid});break;case"money":k.push(v);break}Sa(f,{id:p.id,uuid:p.uuid,selected:l[p.id],schips:p.schipshtml(),purse:k.sort((v,I)=>I.system.price.value-v.system.price.value).map(v=>`${v.system.quantity.value}`).join(" - "),advantages:y,disadvantages:h,system:{status:{wounds:{max:p.system.status.wounds.max},astralenergy:{max:p.system.status.astralenergy.max},karmaenergy:{max:p.system.status.karmaenergy.max}},isMage:p.system.isMage,isPriest:p.system.isPriest}});let C=!1;for(let v of d)if(v.content.has(p.id)){v.contents.push(f),C=!0;break}C||m.push(f)}if(!this.abilities){let p=await g.allSkillsList();this.abilities=p.map(f=>({name:f,type:"skill"})).concat(Object.values(game.dsa5.config.characteristics).map(f=>({name:game.i18n.localize(f),type:"attribute"})).concat({name:game.i18n.localize("regenerate"),type:"regeneration"})).map(f=>(f.key=`${f.name}|${f.type}`,f))}return Sa(t,{hasHeros:a.length>0,heros:m,folders:d,abilities:this.abilities,groupschips:s,masterSettings:c,lastSkill:this.lastSkill,randomCreation:this.randomCreation.map(p=>p.template),lightButton:game.dsa5.apps.LightDialog?await game.dsa5.apps.LightDialog.getButtonHTML():""}),t}registerRandomCreation(e){this.randomCreation.push(e)}},Aa=class extends FormApplication{static{u(this,"GlobalModAddition")}constructor(e){super(),this.mod_id=e}static get defaultOptions(){let e=super.defaultOptions;return e.template="systems/dsa5/templates/system/global-mod-addition.html",e.title=game.i18n.localize("MASTER.addGlobalMod"),e.width=400,e.resizable=!0,e}activateListeners(e){super.activateListeners(e),e.find(".addGlobalMod").click(t=>this.addGlobalMod(t))}async getData(e){let t=await super.getData(e);return this.mod_id?t.config=Pe(game.settings.get("dsa5","masterSettings").globalMods[this.mod_id]):t.config={value:0,victim:{npc:!0,player:!0}},t.categories=["skill","spell","meleeweapon","rangeweapon","ritual","ceremony","liturgy","trait"],t}async addGlobalMod(e){e.preventDefault();let t=Pe(game.settings.get("dsa5","masterSettings")),a=Pe(new FormDataExtended($(this._element).find("form")[0]).object);a.enabled=!0,a.name&&(this.mod_id?t.globalMods[this.mod_id]=a:Sa(t,{globalMods:{[Xn()]:a}}),await game.settings.set("dsa5","masterSettings",t),game.dsa5.apps.gameMasterMenu.render(),this.close())}};var qt=class extends Be(Ne){static{u(this,"CreatureMerchantSheetDSA5")}static get merchantTemplate(){return"systems/dsa5/templates/actors/merchant/creature-merchant-sheet.html"}};var Wt=class extends Be(Ce){static{u(this,"CharacterMerchantSheetDSA5")}static get merchantTemplate(){return"systems/dsa5/templates/actors/merchant/character-merchant-sheet.html"}};var{mergeObject:Ho}=foundry.utils,Ut=class extends JournalSheet{static{u(this,"DSAJournalSheet")}static get defaultOptions(){let e=super.defaultOptions;return Ho(e,{classes:e.classes.concat(["dsa5","dsajournal"])}),e}};function Zn(){let o=ActorDelta._onUpdateOperation;ActorDelta._onUpdateOperation=async(t,a,s)=>{for(let i of t)await O.postUpdateConditions(i.syntheticActor);return o(t,a,s)};let e=ActorDelta._onCreateOperation;ActorDelta._onCreateOperation=async(t,a,s)=>{for(let i of t)await O.postUpdateConditions(i.syntheticActor);return e(t,a,s)}}u(Zn,"setActorDelta");var{mergeObject:jo}=foundry.utils;function sn(){Mi(),Ei(),ys(),$i(),Oi(),_i(),$n(),ji(),Gi(),Ui(),Hi(),Ia(),Ki(),Ji(),Zn()}u(sn,"default");Hooks.once("init",()=>{loadTemplates(["systems/dsa5/templates/actors/actor-main.html","systems/dsa5/templates/actors/actor-talents.html","systems/dsa5/templates/items/item-description.html","systems/dsa5/templates/dialog/default-dialog.html","systems/dsa5/templates/dialog/parts/targets.html","systems/dsa5/templates/dialog/enhanced-default-dialog.html","systems/dsa5/templates/dialog/default-combat-dialog.html","systems/dsa5/templates/chat/roll/test-card.html","systems/dsa5/templates/items/item-equipment.html","systems/dsa5/templates/items/item-enchantment.html","systems/dsa5/templates/actors/actor-combat.html","systems/dsa5/templates/actors/actor-equipment.html","systems/dsa5/templates/actors/actor-notes.html","systems/dsa5/templates/dialog/parts/spellmodifiers.html","systems/dsa5/templates/dialog/parts/canChangeCastingTime.html","systems/dsa5/templates/actors/parts/schipspart.html","systems/dsa5/templates/chat/post-item.html","systems/dsa5/templates/items/item-stat.html","systems/dsa5/templates/items/item-extension.html","systems/dsa5/templates/actors/creature/creature-main.html","systems/dsa5/templates/actors/creature/creature-loot.html","systems/dsa5/templates/actors/creature/creature-notes.html","systems/dsa5/templates/actors/creature/creature-magic.html","systems/dsa5/templates/system/masterHeros.html","systems/dsa5/templates/actors/creature/creature-religion.html","systems/dsa5/templates/actors/parts/characteristics-large.html","systems/dsa5/templates/actors/parts/gearSearch.html","systems/dsa5/templates/actors/parts/magicalSigns.html","systems/dsa5/templates/actors/parts/containerContent.html","systems/dsa5/templates/actors/npc/npc-main.html","systems/dsa5/templates/actors/character/actor-magic.html","systems/dsa5/templates/actors/character/actor-religion.html","systems/dsa5/templates/actors/character/actor-aggregatedtests.html","systems/dsa5/templates/actors/parts/creature-derived-attributes-small.html","systems/dsa5/templates/actors/parts/creature-derived-attributes-large.html","systems/dsa5/templates/actors/parts/status_effects.html","systems/dsa5/templates/actors/parts/purse.html","systems/dsa5/templates/actors/parts/combat_weapon.hbs","systems/dsa5/templates/actors/parts/combat_rangeweapon.hbs","systems/dsa5/templates/actors/parts/horse.html","systems/dsa5/templates/actors/parts/healthbar.html","systems/dsa5/templates/actors/merchant/merchant-commerce.html","systems/dsa5/templates/items/item-header.html","systems/dsa5/templates/items/item-effects.html","systems/dsa5/templates/items/item-aoe.html","systems/dsa5/templates/items/traditionArtifact.html","systems/dsa5/templates/status/advanced_functions.html","systems/dsa5/templates/actors/parts/information.html","systems/dsa5/templates/actors/parts/personaltrait.html","systems/dsa5/templates/actors/parts/combatskills.html","systems/dsa5/templates/actors/parts/attributes.html","systems/dsa5/templates/actors/parts/swarm.html","systems/dsa5/templates/actors/parts/carryandpurse.html","systems/dsa5/templates/actors/parts/specialabilities.html","systems/dsa5/templates/actors/parts/experienceBox.html","systems/dsa5/templates/actors/parts/temperature.html","systems/dsa5/templates/actors/parts/temperatureSmall.html","systems/dsa5/templates/actors/parts/spells.html","systems/dsa5/templates/dialog/parts/expChoices.html","systems/dsa5/templates/actors/parts/liturgies.html","systems/dsa5/templates/items/browse/actor.html","systems/dsa5/templates/items/browse/garadan.html","systems/dsa5/templates/items/browse/culture.html","systems/dsa5/templates/items/browse/species.html","systems/dsa5/templates/items/browse/career.html","systems/dsa5/templates/items/meleeweapon-attack-part.hbs","systems/dsa5/templates/items/rangeweapon-attack-part.hbs","systems/dsa5/templates/actors/parts/specblock.html"]),Actors.unregisterSheet("core",ActorSheet),Actors.registerSheet("dsa5",Ce,{types:["character"],makeDefault:!0}),Actors.registerSheet("dsa5",Ne,{types:["creature"],makeDefault:!0}),Actors.registerSheet("dsa5",Re,{types:["npc"],makeDefault:!0}),Actors.registerSheet("dsa5",Ie,{types:["npc"]}),Actors.registerSheet("dsa5",qt,{types:["creature"]}),Actors.registerSheet("dsa5",Wt,{types:["character"]}),DocumentSheetConfig.registerSheet(ActiveEffect,"dsa5",Z,{makeDefault:!0}),Journal.registerSheet("dsa5",Ut,{makeDefault:!0}),Y.setupSheets(),Hooks.call("registerDSAstyle",b.styles),Kn(),ne.initDoorMinDistance(),jo(CONFIG.JournalEntry.noteIcons,b.noteIcons),K.prepareSoundEffects();let o=game.settings.get("dsa5","globalStyle");b.styles[o]||(o=Object.keys(b.styles)[0]),$("body").addClass(o)});Hooks.once("setup",()=>{if(!["de","en"].includes(game.i18n.lang))console.warn(`DSA5 - ${game.i18n.lang} is not a supported language. Falling back to default language.`),Go();else{let o=game.settings.get("dsa5","forceLanguage");["de","en"].includes(o)&&game.i18n.lang!=o&&Bo(o)}Gt.initHook(),Yi(),Bt.registerButtons(),pt.registerButtons(),CONFIG.Canvas.lightAnimations.daylight={label:"LIGHT.daylight",illuminationShader:an},P.setupFunctions(),F.setupFunctions()});Hooks.once("i18nInit",()=>{qo()});var tn=class extends foundry.applications.api.DialogV2{static{u(this,"ForbiddenLanguageDialog")}async close(e={}){if(["de","en"].includes(game.i18n.lang))return super.close(e)}},Go=u(()=>{new tn({window:{title:"language"},content:"

    Your foundry language is not supported by this system. Due to technical reasons your foundry language setting has to be switched to either english or german.

    ",buttons:[{action:"de",icon:"fa fa-check",label:"en",callback:u(async()=>{await game.settings.set("core","language","de"),foundry.utils.debouncedReload()},"callback")},{action:"en",icon:"fas fa-check",label:"de",callback:u(async()=>{await game.settings.set("core","language","en"),foundry.utils.debouncedReload()},"callback")},{action:"logout",icon:"fas fa-door-closed",label:"SETTINGS.Logout",callback:u(async()=>{ui.menu.items.logout.onClick()},"callback")}]}).render(!0)},"showForbiddenLanguageDialog"),Bo=u(o=>{new foundry.applications.api.DialogV2({window:{title:"DSASETTINGS.forceLanguage"},content:`

    ${game.i18n.format("DSAError.wrongLanguage",{lang:o})}

    `,buttons:[{action:"ok",icon:"fa fa-check",label:"ok",callback:u(async()=>{await game.settings.set("core","language",o),foundry.utils.debouncedReload()},"callback")},{action:"cancel",icon:"fas fa-times",label:"cancel"}]}).render(!0)},"showWrongLanguageDialog");function qo(){game.dsa5.config.knownShortcuts={[game.i18n.localize("CHARAbbrev.INI").toLowerCase()]:["status","initiative","gearmodifier"],[game.i18n.localize("CHARAbbrev.GS").toLowerCase()]:["status","speed","gearmodifier"],[game.i18n.localize("CHARAbbrev.AsP").toLowerCase()]:["status","astralenergy","gearmodifier"],[game.i18n.localize("CHARAbbrev.LeP").toLowerCase()]:["status","wounds","gearmodifier"],[game.i18n.localize("CHARAbbrev.KaP").toLowerCase()]:["status","karmaenergy","gearmodifier"],[game.i18n.localize("CHARAbbrev.AW").toLowerCase()]:["status","dodge","gearmodifier"],[game.i18n.localize("CHARAbbrev.SK").toLowerCase()]:["status","soulpower","gearmodifier"],[game.i18n.localize("CHARAbbrev.ZK").toLowerCase()]:["status","toughness","gearmodifier"],[game.i18n.localize("CHARAbbrev.FtP").toLowerCase()]:["status","fatePoints","gearmodifier"]};for(let o of Object.keys(b.characteristics))game.dsa5.config.knownShortcuts[game.i18n.localize(`CHARAbbrev.${o.toUpperCase()}`).toLowerCase()]=["characteristics",o.toLowerCase(),"gearmodifier"]}u(qo,"setupKnownEquipmentModifiers");var an=class extends AdaptiveIlluminationShader{static{u(this,"DaylightIlluminationShader")}static fragmentShader=` ${this.SHADER_HEADER} ${this.PERCEIVED_BRIGHTNESS} @@ -95,4 +95,4 @@ var tr=Object.defineProperty;var u=(o,e)=>tr(o,"name",{value:e,configurable:!0}) ${i.join("")} -
    `,r={ammunition:[{label:"ammunitiongroup",attr:"ammunitiongroup.value",type:"select",options:b.ammunitiongroups}],equipment:[{label:"equipmentType",attr:"equipmentType.value",type:"select",options:b.equipmentTypes},{label:"PLANT.region",attr:"region",type:"text"}],book:[{label:"BOOKITEM.format",attr:"format",type:"select",options:b.bookFormats},{label:"BOOKITEM.quality",attr:"quality",type:"select",options:b.bookQualities},{label:"BOOKITEM.exemplarType",attr:"exemplarType",type:"select",options:b.exemplarTypes},{label:"BOOKITEM.availability",attr:"availability",type:"range"}],trap:[],rangeweapon:[{label:"TYPES.Item.combatskill",attr:"combatskill.value",type:"select",options:t},{label:"ammunitiongroup",attr:"ammunitiongroup.value",type:"select",options:b.ammunitiongroups},{label:"PLANT.region",attr:"region",type:"text"}],meleeweapon:[{label:"TYPES.Item.combatskill",attr:"combatskill.value",type:"select",options:a},{label:"guidevalue",attr:"guidevalue.value",type:"select",options:b.combatskillsGuidevalues},{label:"reach",attr:"reach.value",type:"select",options:b.meleeRanges},{label:"PLANT.region",attr:"region",type:"text"}],poison:[{label:"resistanceModifier",attr:"resistance.value",type:"select",options:b.magicResistanceModifiers},{label:"COMBATSKILLCATEGORY.subcategory",attr:"subcategory",type:"select",options:b.poisonSubTypes},{label:"poisonType",attr:"poisonType.value",type:"text"},{label:"PLANT.region",attr:"region",type:"text"}],disease:[{label:"resistanceModifier",attr:"resistance.value",type:"select",options:b.magicResistanceModifiers}],consumable:[{label:"equipmentType",attr:"equipmentType.value",type:"select",options:b.equipmentTypes}],application:[{label:"TYPES.Item.skill",attr:"skill",type:"select",options:e}],trait:[{label:"traitType",attr:"traitType.value",type:"select",options:b.traitCategories}],career:[{label:"mageLevel",attr:"mageLevel.value",type:"select",options:b.mageLevels}],specialability:[{type:"prerendered",attr:"category.value",content:n},{label:"TYPES.Item.combatskill",attr:"list.value",type:"select",options:s,notStrict:!0},{label:"distribution",attr:"distribution",type:"text"}],liturgy:[{label:"resistanceModifier",attr:"resistanceModifier.value",type:"select",options:b.magicResistanceModifiers},{label:"targetCategory",attr:"targetCategory.value",type:"text"},{label:"distribution",attr:"distribution.value",type:"text"}],spell:[{label:"resistanceModifier",attr:"resistanceModifier.value",type:"select",options:b.magicResistanceModifiers},{label:"targetCategory",attr:"targetCategory.value",type:"text"},{label:"distribution",attr:"distribution.value",type:"text"},{label:"feature",attr:"feature",type:"text"}],ritual:[{label:"resistanceModifier",attr:"resistanceModifier.value",type:"select",options:b.magicResistanceModifiers},{label:"targetCategory",attr:"targetCategory.value",type:"text"},{label:"distribution",attr:"distribution.value",type:"text"},{label:"feature",attr:"feature",type:"text"}],ceremony:[{label:"resistanceModifier",attr:"resistanceModifier.value",type:"select",options:b.magicResistanceModifiers},{label:"targetCategory",attr:"targetCategory.value",type:"text"},{label:"distribution",attr:"distribution.value",type:"text"}],spellextension:[{label:"Category",attr:"category",type:"select",options:{spell:"spell",liturgy:"liturgy",ritual:"ritual",ceremony:"ceremony"}}],magictrick:[{label:"targetCategory",attr:"targetCategory.value",type:"text"},{label:"feature",attr:"feature.value",type:"text"},{label:"distribution",attr:"distribution",type:"text"}],blessing:[{label:"targetCategory",attr:"targetCategory.value",type:"text"},{label:"feature",attr:"feature.value",type:"text"}],npc:[{label:"TYPES.Item.species",attr:"details.species.value",type:"text"},{label:"TYPES.Item.career",attr:"details.career.value",type:"text"},{label:"TYPES.Item.culture",attr:"details.culture.value",type:"text"}],character:[{label:"TYPES.Item.species",attr:"details.species.value",type:"text"},{label:"TYPES.Item.career",attr:"details.career.value",type:"text"},{label:"TYPES.Item.culture",attr:"details.culture.value",type:"text"}],creature:[{label:"creatureClass",attr:"creatureClass.value",type:"text"},{label:"sizeCategory",attr:"status.size.value",type:"select",options:b.sizeCategories}],armor:[{label:"protection",attr:"protection.value",type:"select",options:{0:"0",1:"1",2:"2",3:"3",4:"4",5:"5",6:"6",7:"7"}},{label:"encumbrance",attr:"encumbrance.value",type:"select",options:{0:"0",1:"1",2:"2",3:"3",4:"4"}},{label:"PLANT.region",attr:"region",type:"text"}],plant:[{label:"PLANT.landscape",attr:"location.landscape",type:"text"},{label:"PLANT.region",attr:"location.region",type:"text"},{label:"PLANT.healing",attr:"planttype.healing",type:"checkbox"},{label:"PLANT.poison",attr:"planttype.poison",type:"checkbox"},{label:"PLANT.physical",attr:"planttype.physical",type:"checkbox"},{label:"PLANT.psychic",attr:"planttype.psychic",type:"checkbox"},{label:"PLANT.crop",attr:"planttype.crop",type:"checkbox"},{label:"PLANT.defensive",attr:"planttype.defensive",type:"checkbox"},{label:"PLANT.supernatural",attr:"planttype.supernatural",type:"checkbox"},{label:"PLANT.highNorth",attr:"availability.highNorth",type:"range"},{label:"PLANT.grasLands",attr:"availability.grasLands",type:"range"},{label:"PLANT.swamps",attr:"availability.swamps",type:"range"},{label:"PLANT.woods",attr:"availability.woods",type:"range"},{label:"PLANT.jungle",attr:"availability.jungle",type:"range"},{label:"PLANT.mountains",attr:"availability.mountains",type:"range"},{label:"PLANT.desert",attr:"availability.desert",type:"range"},{label:"PLANT.maraskan",attr:"availability.maraskan",type:"range"}],magicalsign:[],patron:[],demonmark:[],essence:[],imprint:[{label:"Category",attr:"category",type:"text"}]};for(let[l,c]of Object.entries(r))for(let m of c)m.type=="text"&&(m.placeholder=`Library.advancedSearchPlaceholders.${l}.${m.attr}`);Wo(nn,r),game.dsa5.advancedFilters=nn})});var Ca=nn;var{getProperty:rn,duplicate:Uo,debounce:Vo,mergeObject:Ko}=foundry.utils,Kt=class{static{u(this,"SearchDocument")}constructor(e,t={}){let a=e.documentName||e.type;switch(e.documentName){case"Actor":case"Item":a=e.type;break}let s="";if(game.settings.get("dsa5","indexDescription"))switch(a){case"creature":case"npc":case"character":s=rn(e,"system.description.value");break;case"JournalEntry":s=rn(e,"system.content");break;default:s=rn(e,"description.value")}this.document={name:e.name,filterType:a,data:$("
    ").html(s).text(),id:e.id||e._id,visible:e.visible?e.visible:!0,compendium:e.compendium?e.compendium.metadata.packageName:t.packageName||"",pack:e.pack||(t.packageName?t.id:void 0),img:e.img,price:e.system?.price?.value}}get uuid(){if(this.document.compendium)return`Compendium.${this.document.pack}.${this.document.id}`;switch(this.itemType){case"character":case"creature":case"npc":return`Actor.${this.id}`;case"JournalEntry":return`JournalEntry.${this.id}`;default:return`Item.${this.id}`}}get name(){return this.document.name}get data(){return this.document.data}get id(){return this.document.id}get itemType(){return this.document.filterType}get hasPrice(){return b.equipmentCategories.has(this.document.filterType)}async getItem(){return await fromUuid(this.uuid)}hasPermission(){return this.document.visible}async render(){(await this.getItem()).sheet.render(!0)}get compendium(){return this.document.compendium}get img(){return this.itemType=="JournalEntry"?"systems/dsa5/icons/categories/DSA-Auge.webp":this.document.img}},Da=class extends Kt{static{u(this,"AdvancedSearchDocument")}constructor(e,t){super(e);let a=Ca[t]||[];for(let s of a)this[s.attr]=s.attr.split(".").reduce((i,n)=>i[n]===void 0?{}:i[n],e.system)}},Tt=class o extends Application{static{u(this,"DSA5ItemLibrary")}constructor(e){super(e),this.advancedFiltering=!1,this.journalBuild=!1,this.journalWorldBuild=!1,this.equipmentBuild=!1,this.equipmentWorldBuild,this.zooBuild=!1,this.zooWorldBuild=!1,this.currentDetailFilter={equipment:[],character:[],spell:[],journal:[],zoo:[]},this.journalIndex=new FlexSearch({encode:"simple",tokenize:"reverse",cache:!0,doc:{id:"id",field:["name","data"]}}),this.equipmentIndex=new FlexSearch({encode:"simple",tokenize:"reverse",cache:!0,doc:{id:"id",field:["name","data","itemType"],tag:["itemType"]}}),this.zooIndex=new FlexSearch({encode:"simple",tokenize:"reverse",cache:!0,doc:{id:"id",field:["name","data","itemType"],tag:["itemType"]}}),this.detailFilter={},this.pages={equipment:{},character:{},spell:{},journal:{},zoo:{}},this.filters={equipment:{categories:{armor:!1,ammunition:!1,equipment:!1,meleeweapon:!1,rangeweapon:!1,poison:!1,disease:!1,consumable:!1,plant:!1,book:!1,trap:!1},filterBy:{search:""}},character:{categories:{career:!1,advantage:!1,combatskill:!1,culture:!1,disadvantage:!1,trait:!1,skill:!1,specialability:!1,species:!1,application:!1,demonmark:!1,patron:!1,essence:!1,imprint:!1},filterBy:{search:""}},spell:{categories:{blessing:!1,ceremony:!1,liturgy:!1,magictrick:!1,ritual:!1,spell:!1,spellextension:!1,magicalsign:!1},filterBy:{search:""}},journal:{categories:{},filterBy:{search:""}},zoo:{categories:{npc:!1,character:!1,creature:!1},filterBy:{search:""}}}}async getData(e){let t=await super.getData(e);return t.categories=this.translateFilters(),t.isGM=game.user.isGM,t.advancedMode=this.advancedFiltering?"on":"",t.worldIndexed=game.settings.get("dsa5","indexWorldItems")?"on":"",t.fullTextEnabled=game.settings.get("dsa5","indexDescription")?"on":"",t.filterDuplicateItems=game.settings.get("dsa5","filterDuplicateItems")?"on":"",t.browseEnabled=this.browseEnabled?"on":"",this.advancedFiltering&&(t.advancedFilter=await this.buildDetailFilter("tbd",this.subcategory)),t}translateFilters(){return{equipment:this.buildFilter(this.filters.equipment),character:this.buildFilter(this.filters.character),spell:this.buildFilter(this.filters.spell),zoo:this.buildFilter(this.filters.zoo,"Actor"),journal:this.buildFilter(this.filters.journal)}}purgeAdvancedFilters(){for(let e in this.filters)for(let t in this.filters[e].categories)this.filters[e].categories[t]=!1;$(this._element).find('.filter[type="checkbox"]').prop("checked",!1),this.buildDetailFilter("none","none").then(e=>{$(this._element).find(".advancedSearch .groupbox").html(e)})}buildFilter(e,t="Item"){let a=[];return Object.keys(e.categories).forEach(function(s){a.push({label:game.i18n.localize(`TYPES.${t}.${s}`),selected:e.categories[s],key:s})}),a=a.sort(function(s,i){return s.label.localeCompare(i.label)}),a}static get defaultOptions(){let e=super.defaultOptions;return e.id="DSA5ItemLibrary",e.classes.push("dsa5","itemlibrary"),e.height=800,e.width=800,e.resizable=!0,e.title=game.i18n.localize("ItemLibrary"),e.template="systems/dsa5/templates/system/itemlibrary.html",e.tabs=[{navSelector:".tabs",contentSelector:".content",initial:"equipment"}],e}async getRandomItems(e,t){let a=[],s=this.equipmentIndex;return a.push(...await s.search(e,{field:["itemType"]})),(await Promise.all(this.shuffle(a.filter(i=>i.hasPermission)).slice(0,t+5).map(i=>i.getItem()))).filter(i=>{let n=i.getFlag("dsa5","enchantments");return!n||!n.find(r=>r.talisman)}).slice(0,t)}shuffle(e){let t=e.length,a,s;for(;t!==0;)s=Math.floor(Math.random()*t),t-=1,a=e[t],e[t]=e[s],e[s]=a;return e}async findCompendiumItem(e,t,a=!0){await this.buildEquipmentIndex();let s={field:["name"],where:{itemType:t}},i=await this.equipmentIndex.search(e,s);return a&&(i=i.filter(n=>n.compendium!="")),i=i.sort((n,r)=>{console.log(n.compendium,r.compendium);let l=n.compendium.startsWith("dsa5-core"),c=r.compendium.startsWith("dsa5-core");return l&&c?0:l?1:c?-1:0}),await Promise.all(i.map(n=>n.getItem()))}async getCategoryItems(e,t=!1,a=!1){await this.buildEquipmentIndex();let s=this.equipmentIndex.search(e,{field:["itemType"]});return t?(await Promise.all(s.map(i=>i.getItem()))).map(i=>i.toObject()):a?await Promise.all(s.map(i=>i.getItem())):s}async executeAdvancedFilter(e,t,a,s,i,n=[]){let r=u(f=>{for(let h of a)if(h[2]?f[h[0]]!=h[1]:f[h[0]].indexOf(h[1])==-1)return!1;return!0},"selFnct"),l=u(f=>{for(let h of s)if(f[h[0]].toLowerCase().indexOf(h[1])==-1)return!1;return!0},"txtFnct"),c=u(f=>{for(let h of i)if(f[h[0]]!=h[1])return!1;return!0},"cbFnct"),m=u(f=>{for(let h of n)if(f[h[0]]h[2])return!1;return!0},"rangeFct"),p=t.where(f=>(e==""||f.name.toLowerCase().indexOf(e)!=-1)&&r(f)&&l(f)&&c(f)&&m(f));return p=p.filter(f=>f.hasPermission).sort((f,h)=>f.name.toLowerCase()>h.name.toLowerCase()?1:-1),p}collectDetailSearch(e){let t=[],a=[],s=[];for(let i of e.find("select")){let n=$(i).val();n!=""&&t.push([$(i).attr("name"),n,i.dataset.notstrict!="true"])}for(let i of e.find('input[type="text"]:not(.manualFilter)')){let n=$(i).val();n!=""&&a.push([$(i).attr("name"),n.toLowerCase()])}for(let i of e.find('input[type="checkbox"]:checked:not(.manualFilter)')){let n=$(i).val();n!=""&&s.push([$(i).attr("name"),n.toLowerCase()])}return{sels:t,inps:a,checkboxes:s}}async advancedFilterStuff(e,t){let a=$(this._element).find(".detailFilters"),s=a.attr("data-subc"),i=this.detailFilter[s],n=this.filters[e].filterBy.search.toLowerCase(),{sels:r,inps:l,checkboxes:c}=this.collectDetailSearch(a),m=await this.executeAdvancedFilter(n,i,r,l,c);return this.setBGImage(m,e),m=this.filterDuplications(m),m}async findEquipmentItemDetailed(e,t,a=!0){await this.buildDetailFilter("Item",t);let s=this.detailFilter[t],i=await this.executeAdvancedFilter(e.search||"",s,e.selects||[],e.inputs||[],e.booleans||[],e.rangeSearches||[]);return a&&(i=i.filter(n=>n.compendium!="")),await Promise.all(i.map(n=>n.getItem()))}filterDuplications(e){return game.settings.get("dsa5","filterDuplicateItems")&&(e=[...new Map(e.map(t=>[`${t.name}_${t.type}`,t])).values()]),e}async filterStuff(e,t,a){let s=this.filters[e].filterBy.search,i={field:["name","data"]},n=[],r=!1;for(let l in this.filters[e].categories){if(this.filters[e].categories[l]){let c,m=null;s==""?c=t.search(l,{field:["itemType"],sort:"name",where:{itemType:l}}):c=t.search(s,{...i,sort:"name",where:{itemType:l}});let d=Number(a)||0;c=c.slice(d,Math.min(d+60,c.length)),c.length==60&&(m=`${d+60}`),this.pages[e].next=m,n.push(...c)}r=this.filters[e].categories[l]||r}return r||(n=t.search(s,{...i,limit:60,page:a||!0,sort:"name"}),this.pages[e].next=n.next),n=n.result?n.result:n,n=n.filter(l=>l.hasPermission),this.setBGImage(n,e),n}setBGImage(e,t){$(this._element).find(`.${t} .libcontainer`)[`${e.length>0?"remove":"add"}Class`]("libraryImg")}async getItemTemplate(e,t){return this.browseEnabled&&["Item","Actor"].includes(t)?e.map(a=>`
    `).join(""):await renderTemplate("systems/dsa5/templates/system/libraryItem.html",{items:e})}async renderBrowseItem(e){let t=await fromUuid(e),a=`systems/dsa5/templates/items/browse/${t.type}.html`,s=await renderTemplate(a,{document:t,isGM:game.user.isGM,...await t.sheet.getData()});return`
    ${s}
    `}intersectionObserved(e,t){for(let a of e)if(a.isIntersecting){let s=a.target.dataset.uuid;this.renderBrowseItem(s).then(i=>{a.target.outerHTML=i}),t.unobserve(a.target)}}async renderResult(e,t,{index:a,itemType:s},i){let n=e.find(".searchResult .item-list"),r=await this.getItemTemplate(t,s);i||n.empty(),r=$(r);let l=u((m,d,p,f=!1)=>{m.stopPropagation();let h=d.find(m.currentTarget.dataset.itemId);m.originalEvent.dataTransfer.setData("text/plain",JSON.stringify({type:p,uuid:h.uuid,pay:f}))},"itemDragStart");r.each(function(){let m=$(this);m.attr("draggable",!0).on("dragstart",d=>l(d,a,s)),m.find(".priceDrag").attr("draggable",!0).on("dragstart",d=>l(d,a,s,!0))}),n.append(r);let c=n.find(".loader");if(c.length>0){let m=new IntersectionObserver(this.intersectionObserved.bind(this),{root:e.find(".window-content")[0]});for(let d of c)m.observe(d)}}async filterItems(e,t,a){let s=this.selectIndex(t),i=this.advancedFiltering&&t!="journal"?await this.advancedFilterStuff(t,a):await this.filterStuff(t,s.index,a);return await this.renderResult(e,i,s,a),i}selectIndex(e){let t="Item",a=this.equipmentIndex;switch(e){case"zoo":t="Actor",a=this.zooIndex;break;case"journal":t="JournalEntry",a=this.journalIndex;break}return{index:a,itemType:t}}async _render(e=!1,t={}){await super._render(e,t),this.buildEquipmentIndex()}_getHeaderButtons(){let e=super._getHeaderButtons();return e.unshift({class:"libraryModulsFilter",tooltip:"DSASETTINGS.libraryModulsFilter",icon:"fas fa-filter",onclick:u(async()=>new on().render(!0),"onclick")}),e}async buildEquipmentIndex(){await this._createIndex("equipment","Item",game.items)}async _createIndex(e,t,a){if(this[`${e}Build`])return;let s=game.settings.get("dsa5","libraryModulsFilter");SceneNavigation.displayProgressBar({label:game.i18n.format("Library.loading",{item:""}),pct:0});let i=$(this._element).find(`*[data-tab="${e}"]`);this.showLoading(i,e);let n=game.packs.filter(f=>f.documentName==t&&(game.user.isGM||f.visible)&&!f.metadata.label.startsWith("WZ-")&&!s[f.metadata.packageName]),r=100/(n.length+1),l=r,c=["name","system.type","system.description.value","img"],m;t=="Actor"?m=u(f=>f.getIndex({actorFields:c}),"func"):t=="JournalEntry"?m=u(f=>f.getDocuments(),"func"):m=u(f=>f.getDocuments({type__in:Object.keys(game.system.documentTypes.Item)}),"func");let d=this.indexWorldItems(a,e);SceneNavigation.displayProgressBar({label:game.i18n.format("Library.loading",{item:"world items"}),pct:Math.round(r)});let p=n.map(async f=>{let h=await m(f);l+=r,SceneNavigation.displayProgressBar({label:game.i18n.format("Library.loading",{item:`${f.metadata.label} (${f.metadata.id})`}),pct:Math.round(l)}),d.push(...h.map(y=>new Kt(y,f.metadata)))});return Promise.all(p).then(f=>{this[`${e}Index`].add(d),this[`${e}Build`]=!0,SceneNavigation.displayProgressBar({label:game.i18n.format("Library.loading",{item:""}),pct:100}),this.hideLoading(i,e)})}subcategoryFields(e){let t=["name","itemType"],a=Ca[e]||[];for(let s of a)t.push(s.attr);return t}indexWorldItems(e,t){let a=[];return game.settings.get("dsa5","indexWorldItems")&&(a.push(...e.filter(s=>s.visible).map(s=>new Kt(s))),this[`${t}WorldBuild`]=!0),a}async createDetailIndex(e,t){if(!this.detailFilter[t]){let a=game.i18n.localize(`TYPES.Item.${t}`);SceneNavigation.displayProgressBar({label:game.i18n.format("Library.loading",{item:a}),pct:0});let s=this.subcategoryFields(t),i=$(this._element).find(`*[data-tab="${e}"]`);i.find(".searchResult ul").html(""),this.showLoading(i,e),this.detailFilter[t]=new FlexSearch({encode:"simple",tokenize:"full",cache:!0,doc:{id:"id",field:s}});let{index:n,itemType:r}=this.selectIndex(e),l=r=="Item"?game.items:game.actors,c=[];game.settings.get("dsa5","indexWorldItems")&&c.push(...l.filter(k=>k.visible&&k.type==t).map(k=>new Da(k,t)));let m=n.search(t,{field:["itemType"]}),d={};SceneNavigation.displayProgressBar({label:game.i18n.format("Library.loading",{item:a}),pct:10});for(let k of m)k.document.pack&&(d[k.document.pack]||(d[k.document.pack]=[]),d[k.document.pack].push(k.document.id));let p=[],f=60/Object.keys(d).length,h=0;for(let k of Object.entries(d))h+=1,p.push(game.packs.get(k[0]).getDocuments({_id__in:k[1],type:t})),SceneNavigation.displayProgressBar({label:game.i18n.format("Library.loading",{item:a}),pct:Math.round(10+h*f)});SceneNavigation.displayProgressBar({label:game.i18n.format("Library.loading",{item:a}),pct:70});let y=await Promise.all(p);f=30/y.length,h=0;for(let k of y)h+=1,c.push(...k.map(D=>new Da(D,t))),SceneNavigation.displayProgressBar({label:game.i18n.format("Library.loading",{item:a}),pct:Math.round(70+h*f)});this.detailFilter[t].add(c),this.hideLoading(i,e),SceneNavigation.displayProgressBar({label:game.i18n.format("Library.loading",{item:a}),pct:100})}}async buildDetailFilter(e,t,a=void 0){let s=Uo(Ca[t]||[]),i=!1;if(s){if(a){for(let c of s)switch(c.type){case"select":let m=a.selects.find(f=>f[0]==c.attr);m&&(c.value=m[1]);break;case"text":let d=a.inputs.find(f=>f[0]==c.attr);d&&(c.value=d[1]);break;case"checkbox":let p=a.booleans.find(f=>f[0]==c.attr);p&&(c.value=p[1]);break}i=a.selects.find(c=>c[0]=="compendium")?.[1]}let n=this.createDetailIndex(e,t),r=o.collectModulOptions(),l=await renderTemplate("systems/dsa5/templates/system/detailFilter.html",{fields:s,subcategory:t,moduleOptions:r,moduleSelected:i});return await n,l}else return`

    ${game.i18n.localize("Library.selectAdvanced")}

    `}static collectModulOptions(){return game.packs.filter(e=>e.metadata.type=="Item").reduce((e,t)=>{if(!e[t.metadata.packageName]){let a=game.i18n.has(`${t.metadata.packageName}.name`)?game.i18n.localize(`${t.metadata.packageName}.name`):game.modules.get(t.metadata.packageName)?.title.replace(/The Dark Eye 5th Ed. - /i,"")||game.system.title;e[t.metadata.packageName]=a}return e},{})}checkWorldStuffIndex(){game.settings.get("dsa5","indexWorldItems")&&(!this.journalWorldBuild&&this.journalBuild&&this.journalIndex.add(this.indexWorldItems(game.journal,"journal")),!this.equipmentWorldBuild&&this.equipmentBuild&&this.equipmentIndex.add(this.indexWorldItems(game.items,"equipment")),!this.zooWorldBuild&&this.zooBuild&&this.zooIndex.add(this.indexWorldItems(game.actors,"zoo")))}activateListeners(e){super.activateListeners(e),me(e),e.on("click",".searchableAbility a",s=>mt(s)),e.on("click",".toggleAdvancedMode",()=>{this.advancedFiltering=!this.advancedFiltering,this.advancedFiltering?($(this._element).find(".toggleAdvancedMode").addClass("on"),$(this._element).find(".advancedSearch").fadeIn(),this.purgeAdvancedFilters()):($(this._element).find(".toggleAdvancedMode").removeClass("on"),$(this._element).find(".advancedSearch").fadeOut())}),e.on("change",".detailFilters input, .detailFilters select",()=>{let s=$(this._element).find(".tab.active"),i=s.attr("data-tab");this.filterItems(s,i)}),e.on("click",".filter",async s=>{let i=$(s.currentTarget).closest(".tab"),n=i.attr("data-tab"),r=s.currentTarget.dataset.category,l=$(s.currentTarget).is(":checked");this.advancedFiltering&&l&&(this.purgeAdvancedFilters(),this.subcategory=r,$(s.currentTarget).prop("checked",l),$(this._element).find(".advancedSearch .groupbox").html(await this.buildDetailFilter(n,r))),this.filters[n].categories[r]=l,this.filterItems(i,n)}),e.on("click",".item-name",s=>{this.getItemFromHTML(s).render()}),e.on("mousedown",".item-name",s=>{s.button==2&&g.showArtwork(this.getItemFromHTML(s))}),e.on("keyup",".filterBy-search",s=>{let i=$(s.currentTarget).closest(".tab"),n=i.attr("data-tab");this.filters[n].filterBy.search=$(s.currentTarget).val(),this.filterItems(i,n)});let t=u(s=>{s.stopPropagation();let i=s.currentTarget.dataset.type,n=s.currentTarget.dataset.uuid;!n||!i||s.originalEvent.dataTransfer.setData("text/plain",JSON.stringify({type:i,uuid:n}))},"itemDragStart");e.on("click",".show-item",async s=>{let i=s.currentTarget.dataset.uuid;(await fromUuid(i)).sheet.render(!0)}),e.find(".show-item").attr("draggable",!0).on("dragstart",s=>t(s)),e.find('*[data-tab="journal"]').click(s=>{this._createIndex("journal","JournalEntry",game.journal)}),e.find('*[data-tab="zoo"]').click(s=>{this._createIndex("zoo","Actor",game.actors)}),e.find(".showDetails").click(s=>{let i=s.currentTarget.dataset.btn;$(s.currentTarget).find("i").toggleClass("fa-caret-left fa-caret-right"),e.find(`.${i} .detailBox`).toggleClass("dsahidden")}),e.find(".toggleWorldIndex").click(s=>{game.settings.set("dsa5","indexWorldItems",!game.settings.get("dsa5","indexWorldItems")),this.checkWorldStuffIndex(),$(s.currentTarget).toggleClass("on")}),e.find(".fulltextsearch").click(s=>{game.settings.set("dsa5","indexDescription",!game.settings.get("dsa5","indexDescription")),$(s.currentTarget).toggleClass("on")}),e.find(".browseEnabled").click(s=>{this.browseEnabled=!this.browseEnabled,$(s.currentTarget).toggleClass("on")}),e.find(".filterDuplicateItems").click(s=>{game.settings.set("dsa5","filterDuplicateItems",!game.settings.get("dsa5","filterDuplicateItems")),$(s.currentTarget).toggleClass("on")});let a=this;$(this._element).find(".window-content").on("scroll.infinit",Vo(function(s){if(a.advancedFiltering)return;let i=$(s.target),n=i.scrollTop()+i.innerHeight()>=i[0].scrollHeight-100,r=e.find(".tabs .item.active").attr("data-tab");if(n&&a.pages[r].next){let l=e.find(".tab.active");a.filterItems.call(a,l,r,a.pages[r].next)}},100))}getItemFromHTML(e){let t=$(e.currentTarget).parents(".browser-item").attr("data-item-id");switch($(e.currentTarget).closest(".tab").attr("data-tab")){case"zoo":return this.zooIndex.find(t);case"journal":return this.journalIndex.find(t);default:return this.equipmentIndex.find(t)}}showLoading(e,t){this.setBGImage([1],t),$(`
    ${game.i18n.localize("Library.buildingIndex")}
    `).appendTo(e.find(".searchResult"))}hideLoading(e,t){this.setBGImage([],t),e.find(".loader").remove()}},on=class extends Application{static{u(this,"LibraryModulsFilter")}static get defaultOptions(){let e=super.defaultOptions;return e.classes.push("dsa5"),e.resizable=!0,e.width=600,e.title=game.i18n.localize("DSASETTINGS.libraryModulsFilter"),e.template="systems/dsa5/templates/system/librarymodulesfilter.html",e}async getData(e){let t=await super.getData(e);return Ko(t,{moduleOptions:Tt.collectModulOptions(),rejectedModules:game.settings.get("dsa5","libraryModulsFilter")}),t}activateListeners(e){super.activateListeners(e),e.find(".moduleSelector").change(t=>this.moduleFilterChanged(t))}async moduleFilterChanged(e){let t=e.currentTarget.id,a=e.currentTarget.checked,s=game.settings.get("dsa5","libraryModulsFilter");a?delete s[t]:s[t]=!0,game.settings.set("dsa5","libraryModulsFilter",s)}};var{getProperty:ln}=foundry.utils,Yt=class extends foundry.applications.api.DialogV2{static{u(this,"DSA5Initializer")}constructor(e,t,a,s="",i={}){let n={window:{title:e},position:{width:500},content:t,buttons:[{action:"initialize",label:"initialize",callback:u(()=>{this.lock||this.initialize()},"callback")},{action:"cancel",label:"cancel",callback:u(()=>{this.lock||this.dontInitialize()},"callback")}]};super(n),this.module=a,this.lang=s,this.folders={},this.journals={},this.scenes={},this.actors={},this.lock=!1,this.scopeOptions=i}async initNotes(e,t,a){let s=await this.getFolderForType("JournalEntry");for(let i of e.notes)try{let n=t.find(r=>r.flags.dsa5.initId==i.entryId);if(!a.has(n._id)){let r=ln(n,"flags.dsa5.parent"),l=s;this.folders[r]?l=this.folders[r]:r&&(l=await this.getFolderForType("JournalEntry",s.id,r,0,ln(n,"flags.dsa5.foldercolor")||"")),n.folder=l.id;let c=game.journal.find(m=>m.name==n.name&&m.folder?.id==l.id&&m.flags.dsa5.initId==i.entryId);if(c)await c.update(n),a.set(n._id,c.id);else{let m=await JournalEntry.create(n);a.set(n._id,m.id)}}i.entryId=a.get(n._id)}catch(n){console.warn(`Could not initialize Scene Notes for scene :${e.name}`+n)}}async initScenes(e,t=void 0){let a=await this.getFolderForType("Scene"),i=(await game.packs.get(e.scenes).getDocuments()).map(f=>f.toObject()),r=(await game.packs.get(e.journal).getDocuments()).map(f=>f.toObject()),l=[],c=[],m=new Map,d=!1;t&&(i=i.filter(f=>t.includes(f.name)));for(let f of i){let h=d,y=game.scenes.find(k=>k.name==f.name&&k.folder?.id==a.id);if(!d&&y)try{[h,d]=await foundry.applications.api.DialogV2.wait({window:{title:"Book.sceneReset"},content:`

    ${game.i18n.format("Book.sceneResetDescription",{name:f.name})}

    `,buttons:[{action:"yes",icon:"fa fa-check",label:"yes",callback:u(()=>[!0,!1],"callback")},{action:"all",icon:"fa fa-check",label:"LocalizedIDs.all",callback:u(()=>[!0,!0],"callback")},{action:"no",icon:"fas fa-times",label:"cancel",default:!0,callback:u(()=>[!1,!1],"callback")}]})}catch{h=!1,d=!1}if(y&&!h){this.scenes[y.name]=y;continue}f.folder=a.id,await this.initNotes(f,r,m),y?(f._id=y.id,c.push(f)):l.push(f)}let p=await Scene.create(l,{dsaInit:!0,keepId:!0});for(let f of p){this.scenes[f.name]=f;let h=await f.createThumbnail();await f.update({thumb:h.thumb})}for(let f of c)await game.scenes.get(f._id).update(f),this.scenes[f.name]=game.scenes.get(f._id);if(e.initialScene){let f=this.scenes[e.initialScene];f&&(await game.settings.set("core",NotesLayer.TOGGLE_SETTING,!0),await f.activate(),await f.update({navigation:!0}))}}async loadJson(){let e=this.scopeOptions.initializer||`initialization${this.lang}`;return await(await fetch(`modules/${this.module}/${e}.json`)).json()}async initialize(){this.lock=!0;let e=$(this.element).find('[data-action="initialize"]');e.prepend('');let t={};try{game.settings.settings.has(`${this.moduleScope}.initialized`)&&await game.settings.set(this.moduleScope,"initialized",!0)}catch{}if(this.scopeOptions.scope)await fetch(`modules/${this.module}/${this.scopeOptions.scope}.json`).then(async i=>i.json()).then(async i=>{t=i});else try{await fetch(`modules/${this.module}/adventure${this.lang}.json`).then(async i=>i.json()).then(async i=>{t=i})}catch{try{await fetch(`modules/${this.module}/adventure.json`).then(async i=>i.json()).then(async i=>{t=i})}catch{console.warn(`Could not find book data for ${this.moduleScope} import.`)}}let a=await this.loadJson(),s=a.folders;if(s){let i=await this.getFolderForType("JournalEntry"),n=a.folders[0].name;i&&(this.folders[i.data.name]=i,a.folders.shift());let r=await Folder.create(s);Array.isArray(r)||(r=[r]);for(let c of r)this.folders[c.data.name]=c;let l=[];for(let c in this.folders){let m=this.folders[c].getFlag("dsa5","parent"),d=m==n?game.i18n.localize(`${this.moduleScope}.name`):m;d&&l.push({_id:this.folders[c].id,parent:this.folders[d].id})}await Folder.updateDocuments(l)}if(a.items&&a.items.length>0){let i=await this.getFolderForType("Item"),n=[],r=[];for(let l of a.items){l.folder=i.id;let c=game.items.find(m=>m.name==l.name&&m.folder?.id==i.id);c?(l._id=c.id,r.push(l)):n.push(l)}await C.create(n),await C.updateDocuments(r)}if(a.playlists){let i=await this.getFolderForType("Playlist"),n=[],r=[],c=(await game.packs.get(a.playlists).getDocuments()).map(m=>m.toObject());for(let m of c){m.folder=i.id;let d=game.playlists.find(p=>p.name==m.name&&p.folder?.id==i.id);d?(m._id=d._id,r.push(m)):n.push(m)}await Playlist.create(n,{keepId:!0}),await Playlist.updateDocuments(r)}if(a.scenes&&await this.initScenes(a),a.actors){let i=await this.getFolderForType("Actor"),r=(await game.packs.get(a.actors).getDocuments()).map(f=>f.toObject()),l=[],c=[],m=new Map,d=0;if(ln(t,"chapters")){for(let f of t.chapters)for(let h of f.content)if(h.actors){let y=!1;for(let k of h.actors)m.has(k)||(m.set(k,h.name),y=!0);y&&(await this.getFolderForType("Actor",i.id,h.name,d),d+=1)}}for(let f of r){let h=m.has(f.name)?await this.getFolderForType("Actor",i.id,m.get(f.name)):i;f.folder=h.id,f._id&&delete f._id;let y=game.actors.find(k=>k.name==f.name&&[i.id,h.id].includes(k.folder?.id));y?(f._id=y.id,await y.deleteEmbeddedDocuments("Item",y.items.map(k=>k.id)),c.push(f)):l.push(f)}let p=await Actor.create(l);await Actor.updateDocuments(c);for(let f of p)this.actors[f.name]=f}a.macro&&(Hooks.once("renderCompendium",(i,n,r)=>{n.find(`[data-pack="${a.macro}"] header`).append($(`

    ${game.i18n.localize("Book.macroHint")}

    `))}),await game.packs.get(a.macro).render(!0)),this.lock=!1,e.find("i").remove(),ui.notifications.info("initComplete",{localize:!0}),await this.close()}async dontInitialize(){game.settings.settings.has(`${this.moduleScope}.initialized`)&&await game.settings.set(this.moduleScope,"initialized",!0),ui.notifications.info("initSkipped",{localize:!0}),await this.close()}submit(e){try{e.callback&&e.callback(this.options.jQuery?this.element:this.element[0])}catch(t){throw ui.notifications.error(t),new Error(t)}}get moduleScope(){return this.scopeOptions.scope||this.module}async getFolderForType(e,t=null,a=null,s=0,i=""){return a||(a=game.i18n.localize(`${this.moduleScope}.name`)),g.getFolderForType(e,t,a,s,i)}};var Jt=class extends ChatMessage{static{u(this,"ChatMessageDSA5Roll")}get isRoll(){return this.isDSARoll||super.isRoll}get roll(){return this.isDSARoll?new cn(""):super.roll}get isDSARoll(){return this.flags.data?this.flags.data.isDSARoll:!1}},cn=class extends Roll{static{u(this,"EmptyRoll")}render(){return""}};var{getProperty:Yo,mergeObject:Jo}=foundry.utils,Qt=class extends Hotbar{static{u(this,"DSA5Hotbar")}async _render(e=!1,t={}){await super._render(e,t),this.addContextColor()}async collapse(){return this._collapsed?!0:($(this.element).addClass("collapsedHotbar"),super.collapse())}async expand(){return this._collapsed?($(this.element).removeClass("collapsedHotbar"),super.expand()):!0}async updateDSA5Hotbar(){if(!game.settings.get("dsa5","hotbarv3"))return;let e=canvas.tokens.controlled;if(this.token=void 0,this.showEffects=!1,e.length===1){let t=e[0].actor;t&&t.isOwner&&(this.token=e[0])}e.length>=1&&(this.showEffects=!0),await this.render(!0,{focus:!1})}addContextColor(){let e=new RegExp(` ${game.i18n.localize("CHAR.PARRY")}$`),t=new RegExp(` ${game.i18n.localize("CHAR.ATTACK")}$`),a=$(this._element).find("#macro-list");for(let s of this.macros)s.macro&&(e.test(s.macro.name)?a.find(`[data-macro-id="${s.macro.id}"]`).addClass("parry"):t.test(s.macro.name)&&a.find(`[data-macro-id="${s.macro.id}"]`).addClass("attack"))}_contextMenu(e){game.settings.get("dsa5","hotbarv3")?dn.create(this,e,".macro",this._getEntryContextOptions()):ContextMenu.create(this,e,".macro",this._getEntryContextOptions())}get template(){return game.settings.get("dsa5","hotbarv3")?"systems/dsa5/templates/system/hud/hotbar.html":super.template}activateListeners(e){if(super.activateListeners(e),game.settings.get("dsa5","hotbarv3")){e.find(".quantity-click").mousedown(i=>N.quantityClick(i)),e.on("mousedown","li.primary",async i=>(game.tooltip.deactivate(),i.currentTarget.classList.contains("macro")||(i.stopPropagation(),await this.tokenHotbar.executeQuickButton(i)),!1)),e.find(".categoryFilter").click(i=>{this.filterCategory(i,e)});let t=this,a=u(function(i){if(e.find(".sections").is(":hover"))return t.filterSections(i,e),!1},"fn"),s=u(function(){$(document).off("keydown.sectionFilter",a),t.searching="",e.find(".macro,.primary,.sections .skillItems").removeClass("dsahidden"),e.find(".longLayout").removeClass("longLayout")},"filterOff");e.find(".sections").hover(function(){$(document).off("keydown.sectionFilter",a).on("keydown.sectionFilter",a)},s),e.find(".primary").hover(i=>this._betterTooltip(i)),e.find(".itdarkness input").change(i=>this.tokenHotbar.changeDarkness(i))}}static get defaultOptions(){let e=super.defaultOptions;return e.scrollY=e.scrollY||[],e.scrollY.push("#macro-list"),e}async _betterTooltip(e){let t=e.currentTarget,a=t.dataset;if("tooltipClass"in t.dataset)return;let s,i,n;switch(a.category?.split(" ")[0]){case"skillgm":s=game.i18n.format("TT.skillgm",{name:a.name});break;case"effect":let l=this.token.actor?.effects.get(a.id);l&&(n=game.i18n.has(l.description)?game.i18n.localize(l.description):l.description);break;case"onUse":switch(i=this.token.actor?.items.get(a.id),i.type){case"specialability":n=i.system.rule?.value;break;case"advantage":case"disadvantage":break;default:n=i.system.description?.value}break;case"unequipped":case"consumable":case"weapon":case"spell":i=this.token.actor?.items.get(a.id),n=$(await renderTemplate(`systems/dsa5/templates/items/browse/${i.type}.html`,{isGM:game.user.isGM,...await i.sheet.getData(),document:i,skipHeader:!0,hint:!0})).find(".groupbox").html();break;case"enchantment":let c=a.id.split("_");i=this.token.actor?.items.get(c[0]);let m=i.getFlag("dsa5","enchantments").find(d=>d.id==c[1]);a.name=m.name,n=await renderTemplate("systems/dsa5/templates/items/enchantment-preview.html",{enchantment:m,document:i});break;default:return}n&&(s=`

    ${a.name}

    ${n}
    `),s&&($("#tooltip").addClass("dsatooltip").html(s),t.dataset.tooltip=s,t.dataset.tooltipClass="dsatooltip")}filterCategory(e,t){let a=e.currentTarget.dataset.filter;a?(t.find(".skillItems").addClass("collapsed"),t.find(`.skillItems[data-category="${a}"]`).removeClass("collapsed"),t.find(".categoryFilter").removeClass("active"),t.find(`.categoryFilter[data-filter="${a}"]`).addClass("active"),this.token?.actor?this.activeFilters=[a]:this.gmFilters=[a]):(t.find(".skillItems").removeClass("collapsed"),t.find(".categoryFilter").removeClass("active"),this.token?.actor?this.activeFilters=[]:this.gmFilters=[])}filterSections(e,t){switch(this.searching=this.searching||"",e.which){case 8:this.searching=this.searching.slice(0,-1);break;default:if(!e.key.match(/^[a-zA-Z0-9öäüÖÄÜ]$/))return;this.searching+=e.key}e.preventDefault(),e.stopPropagation();let a=this.searching.toLowerCase();ge(a);let s=t.find(".sections");a?s.addClass("longLayout"):s.removeClass("longLayout");let i=t.find(".primary");i.removeClass("dsahidden"),i.filter(function(){let n=this.dataset?.name?.toLowerCase().trim();return n?n.indexOf(a)==-1:!0}).addClass("dsahidden");for(let n of s.find(".skillItems")){let r=n.dataset.category,l=$(n);l.toggleClass("dsahidden",l.find(`li.${r}.dsahidden`).length==l.find(`li.${r}`).length)}return!1}async getData(e){let t=await super.getData(e);return game.settings.get("dsa5","hotbarv3")&&await this._h3Data(t),t}get tokenHotbar(){return game.dsa5.apps.tokenHotbar}async _h3Data(e){let t={skills:{},attacks:[]},a=[],s=[],i=!1,n=[],r=this.token?.actor;if(r){if(!["epic","loot"].includes(Yo(r,"system.merchant.merchantType"))){n=(this.activeFilters||[]).filter(k=>k!="gm");let f=r.items.filter(k=>k.type=="combatskill").map(k=>O._calculateCombatSkillValues(k.toObject(),r.system));s=await this.tokenHotbar._effectEntries(r);let h=this.tokenHotbar._brawlEntry(f);if(H.isRiding(r)){let k=this.tokenHotbar._ridingEntry(r);k&&(t.skills.skill=[k])}h&&t.attacks.push(h),t.functions=this.tokenHotbar?._functionEntries()||[];for(let k of r.items)switch(k.type){case"skill":t.skills[k.type]||(t.skills[k.type]=[]),t.skills[k.type].push(this.tokenHotbar._skillEntry(k,"skill"));break;case"spell":case"liturgy":t.skills[k.type]||(t.skills[k.type]=[]),t.skills[k.type].push(this.tokenHotbar._skillEntry(k,"spell"));break;case"trait":Xe.traitTypes.has(k.system.traitType.value)&&t.attacks.push(this.tokenHotbar._traitEntry(k,r.system));break;case"consumable":t.skills[k.type]||(t.skills[k.type]=[]),t.skills[k.type].push(this.tokenHotbar._actionEntry(k,"consumable",{abbrev:k.system.quantity.value}));break;case"meleeweapon":case"rangeweapon":let D=this.tokenHotbar._combatEntry(k,f,r);for(let v of D)k.system.worn.value||(v.cssClass="unequipped"),t.attacks.push(v);default:if(k.getFlag("dsa5","onUseEffect")&&(t.skills[k.type]||(t.skills[k.type]=[]),t.skills[k.type].push(this.tokenHotbar._actionEntry(k,"onUse",{subfunction:"onUse"}))),k.getFlag("dsa5","enchantments")){t.skills[k.type]||(t.skills[k.type]=[]);for(let v of k.getFlag("dsa5","enchantments"))t.skills[k.type].push(this.tokenHotbar._enchantmentEntry(v,"enchantment",k,{subfunction:"enchantment"}))}break}}}else if(game.user.isGM&&!game.settings.get("dsa5","disableTokenhotbarMaster")){n=this.gmFilters||[],t.skills.gm=this.tokenHotbar?._gmEntries()||[];let f=this.tokenHotbar?.skills||await this.tokenHotbar?.prepareSkills()||[];t.skills.skillgm=f,i=!0}let l=45,c=2,m={gm:"systems/dsa5/icons/categories/DSA-Auge.webp",skillgm:"systems/dsa5/icons/categories/Skill.webp"},d={gm:"gmMenu",skillgm:"TYPES.Item.skill"};for(let f of Object.keys(t.skills)){let h=`TYPES.Item.${f}`;a.push({key:f,tooltip:game.i18n.has(h)?game.i18n.localize(h):game.i18n.localize(d[f]),img:C.defaultImages[f]||m[f]})}let p=["body","social","nature","knowledge","trade"];if(t.skills.skill?.sort((f,h)=>p.indexOf(f.addClass)-p.indexOf(h.addClass)||f.name.localeCompare(h.name)),t.skills.skillgm?.sort((f,h)=>p.indexOf(f.addClass)-p.indexOf(h.addClass)||f.name.localeCompare(h.name)),t.attacks.length>0&&(t.attacks.sort((f,h)=>(h.cssClass||"").localeCompare(f.cssClass||"")||f.name.localeCompare(h.name)),a.unshift({key:"attacks",tooltip:game.i18n.localize("Combat"),img:"systems/dsa5/icons/categories/Meleeweapon.webp"})),this.showEffects){if(canvas.tokens.controlled.length>1){let y=await this.tokenHotbar._effectEntries(canvas.tokens.controlled[0].actor,{subfunction:"sharedEffect"});for(let k of canvas.tokens.controlled){let D=(await k.actor.actorEffects()).map(v=>v.name);y=y.filter(v=>D.includes(v.name))}s=y}let h={name:"CONDITION.add",id:"",icon:"icons/svg/aura.svg",cssClass:"effect",abbrev:game.i18n.localize("CONDITION.add")[0],subfunction:"addEffect",indicator:"+"};s.unshift(h)}n.length>0&&(n=Object.keys(t.skills).concat(["macro","attacks"]).filter(f=>!n.includes(f))),Jo(e,{token:{groups:t,effects:s},darkness:canvas?.scene?.environment.darknessLevel||0,hotBarcssClass:"hotbarV3",barWidth:"527px",baseBarHeight:`${l}px`,barHeight:`${(l+7)*c+30}px`,filterCategories:a,selectedCategories:(r?this.activeFilters:this.gmFilters)||[],showEffects:this.showEffects,activeFilters:n,gmMode:i,macros:this._getAllMacros()})}_getAllMacros(){let e=Array.from({length:50},()=>"");for(let[t,a]of Object.entries(game.user.hotbar))e[parseInt(t)-1]=a;return e.map((t,a)=>{let s=t?game.macros.get(t):null;return{slot:a+1,key:a+1,icon:s?.img||null,cssClass:s?"active":"inactive",tooltip:s?s.name:null,macro:s}})}},dn=class o extends ContextMenu{static{u(this,"HotbarV3ContextMenu")}_setPosition(e,t){t=t.closest(".flexrow"),super._setPosition(e,t)}static create(e,t,a,s,{hookName:i="EntryContext",...n}={}){for(let r of e.constructor._getInheritanceChain())Hooks.call(`get${r.name}${i}`,t,s);if(s)return new o(t,a,s,n)}};var{setProperty:Qo,getProperty:Xo}=foundry.utils,Xt=class o{static{u(this,"RollMemory")}constructor(){this.tokens={},this.actors={}}static get wantedKeys(){let e=["vision","targetMovement","shooterMovement","quickChange","mountOptions","narrowSpace","advantageousPosition","doubleAttack","reduceCostSpell","forceSpell","increaseCastingTime","decreaseCastingTime","removeGesture","removeFormula"];return ne.isEnabled||e.push("distance"),e}getPath(e,t,a){let s=a||"",i=t._id||t.type;return e.token?`tokens.${e.token||e.actor}.${i}${s}`:`actors.${e.actor}.${i}${s}`}remember(e,t,a,s){let i=this.formDataSerialize(s);Object.entries(i).length>0&&Qo(this,this.getPath(e,t,a),i)}recall(e,t,a){return Xo(this,this.getPath(e,t,a))}formDataSerialize(e){let t=e.find("form"),a={};return t.find("select").each(function(){let s=$(this).attr("name");o.wantedKeys.includes(s)&&(a[s]=$(this).val())}),t.find('input[type="checkbox"]').each(function(){let s=$(this).attr("name");o.wantedKeys.includes(s)&&(a[s]=this.checked)}),t.find(".specAbs.active").each(function(){a.specAbs||(a.specAbs=[]),a.specAbs.push({id:$(this).attr("data-id"),step:$(this).attr("data-step")})}),e.find('[name="situationalModifiers"] option').each(function(){a.situationalModifiers||(a.situationalModifiers=[]),a.situationalModifiers.push({name:$(this).text().trim(),selected:this.selected})}),a}};Hooks.once("init",()=>{console.log("Initializing DSA5 system"),CONFIG.statusEffects=b.statusEffects,game.dsa5={apps:{DSA5_Utility:g,DSA5Initializer:Yt,DSA5ChatListeners:le,DSA5Payment:Q,SpecialabilityRulesDSA5:F,AdvantageRulesDSA5:P,Migrakel:Je,DSA5Dialog:ae,DSA5StatusEffects:z,DPS:ne,DSATables:B,DSA5SoundEffect:K,RequestRoll:ie,DiceDSA5:R,DSATour:rt,OpposeDSA:ee,EquipmentDamage:W,APTracker:_,DidYouKnow:it,MeasuredTemplateDSA:Le,Riding:H,RuleChaos:N,Trade:xe,DSAActiveEffectConfig:Z},entities:{Actordsa5:O,Itemdsa5:C},sheets:{ActorSheetdsa5:ze,ActorSheetdsa5Character:Ce,ActorSheetdsa5Creature:Ne,ActorSheetdsa5NPC:Re,MerchantSheetMixin:Be,MerchantSheetDSA5:Ie,ItemSheetdsa5:Y},wizards:{CareerWizard:tt,CultureWizard:et,SpeciesWizard:at},view:{tinyNotification:ge,tabSlider:me,clickableAbility:mt},dialogs:{DialogReactDSA5:ke,ReactToSkillDialog:yt,ActAttackDialog:bt,ReactToAttackDialog:kt,RandomGoodsAddition:Ta},macro:Vt,config:b,memory:new Xt,itemLibrary:new Tt},CONFIG.Actor.documentClass=O,CONFIG.Item.documentClass=C,CONFIG.ChatMessage.template="systems/dsa5/templates/chat/chat-message.html",CONFIG.ChatMessage.documentClass=Jt,CONFIG.ui.combat=Ge,CONFIG.ui.hotbar=Qt,CONFIG.Combat.documentClass=vt,CONFIG.Combatant.documentClass=wa,CONFIG.ActiveEffect.documentClass=Me,CONFIG.ActiveEffect.legacyTransferral=!1});sn(); +
    `,r={ammunition:[{label:"ammunitiongroup",attr:"ammunitiongroup.value",type:"select",options:b.ammunitiongroups}],equipment:[{label:"equipmentType",attr:"equipmentType.value",type:"select",options:b.equipmentTypes},{label:"PLANT.region",attr:"region",type:"text"}],book:[{label:"BOOKITEM.format",attr:"format",type:"select",options:b.bookFormats},{label:"BOOKITEM.quality",attr:"quality",type:"select",options:b.bookQualities},{label:"BOOKITEM.exemplarType",attr:"exemplarType",type:"select",options:b.exemplarTypes},{label:"BOOKITEM.availability",attr:"availability",type:"range"}],trap:[],rangeweapon:[{label:"TYPES.Item.combatskill",attr:"combatskill.value",type:"select",options:t},{label:"ammunitiongroup",attr:"ammunitiongroup.value",type:"select",options:b.ammunitiongroups},{label:"PLANT.region",attr:"region",type:"text"}],meleeweapon:[{label:"TYPES.Item.combatskill",attr:"combatskill.value",type:"select",options:a},{label:"guidevalue",attr:"guidevalue.value",type:"select",options:b.combatskillsGuidevalues},{label:"reach",attr:"reach.value",type:"select",options:b.meleeRanges},{label:"PLANT.region",attr:"region",type:"text"}],poison:[{label:"resistanceModifier",attr:"resistance.value",type:"select",options:b.magicResistanceModifiers},{label:"COMBATSKILLCATEGORY.subcategory",attr:"subcategory",type:"select",options:b.poisonSubTypes},{label:"poisonType",attr:"poisonType.value",type:"text"},{label:"PLANT.region",attr:"region",type:"text"}],disease:[{label:"resistanceModifier",attr:"resistance.value",type:"select",options:b.magicResistanceModifiers}],consumable:[{label:"equipmentType",attr:"equipmentType.value",type:"select",options:b.equipmentTypes}],application:[{label:"TYPES.Item.skill",attr:"skill",type:"select",options:e}],trait:[{label:"traitType",attr:"traitType.value",type:"select",options:b.traitCategories}],career:[{label:"mageLevel",attr:"mageLevel.value",type:"select",options:b.mageLevels}],specialability:[{type:"prerendered",attr:"category.value",content:n},{label:"TYPES.Item.combatskill",attr:"list.value",type:"select",options:s,notStrict:!0},{label:"distribution",attr:"distribution",type:"text"}],liturgy:[{label:"resistanceModifier",attr:"resistanceModifier.value",type:"select",options:b.magicResistanceModifiers},{label:"targetCategory",attr:"targetCategory.value",type:"text"},{label:"distribution",attr:"distribution.value",type:"text"}],spell:[{label:"resistanceModifier",attr:"resistanceModifier.value",type:"select",options:b.magicResistanceModifiers},{label:"targetCategory",attr:"targetCategory.value",type:"text"},{label:"distribution",attr:"distribution.value",type:"text"},{label:"feature",attr:"feature",type:"text"}],ritual:[{label:"resistanceModifier",attr:"resistanceModifier.value",type:"select",options:b.magicResistanceModifiers},{label:"targetCategory",attr:"targetCategory.value",type:"text"},{label:"distribution",attr:"distribution.value",type:"text"},{label:"feature",attr:"feature",type:"text"}],ceremony:[{label:"resistanceModifier",attr:"resistanceModifier.value",type:"select",options:b.magicResistanceModifiers},{label:"targetCategory",attr:"targetCategory.value",type:"text"},{label:"distribution",attr:"distribution.value",type:"text"}],spellextension:[{label:"Category",attr:"category",type:"select",options:{spell:"spell",liturgy:"liturgy",ritual:"ritual",ceremony:"ceremony"}}],magictrick:[{label:"targetCategory",attr:"targetCategory.value",type:"text"},{label:"feature",attr:"feature.value",type:"text"},{label:"distribution",attr:"distribution",type:"text"}],blessing:[{label:"targetCategory",attr:"targetCategory.value",type:"text"},{label:"feature",attr:"feature.value",type:"text"}],npc:[{label:"TYPES.Item.species",attr:"details.species.value",type:"text"},{label:"TYPES.Item.career",attr:"details.career.value",type:"text"},{label:"TYPES.Item.culture",attr:"details.culture.value",type:"text"}],character:[{label:"TYPES.Item.species",attr:"details.species.value",type:"text"},{label:"TYPES.Item.career",attr:"details.career.value",type:"text"},{label:"TYPES.Item.culture",attr:"details.culture.value",type:"text"}],creature:[{label:"creatureClass",attr:"creatureClass.value",type:"text"},{label:"sizeCategory",attr:"status.size.value",type:"select",options:b.sizeCategories}],armor:[{label:"protection",attr:"protection.value",type:"select",options:{0:"0",1:"1",2:"2",3:"3",4:"4",5:"5",6:"6",7:"7"}},{label:"encumbrance",attr:"encumbrance.value",type:"select",options:{0:"0",1:"1",2:"2",3:"3",4:"4"}},{label:"PLANT.region",attr:"region",type:"text"}],plant:[{label:"PLANT.landscape",attr:"location.landscape",type:"text"},{label:"PLANT.region",attr:"location.region",type:"text"},{label:"PLANT.healing",attr:"planttype.healing",type:"checkbox"},{label:"PLANT.poison",attr:"planttype.poison",type:"checkbox"},{label:"PLANT.physical",attr:"planttype.physical",type:"checkbox"},{label:"PLANT.psychic",attr:"planttype.psychic",type:"checkbox"},{label:"PLANT.crop",attr:"planttype.crop",type:"checkbox"},{label:"PLANT.defensive",attr:"planttype.defensive",type:"checkbox"},{label:"PLANT.supernatural",attr:"planttype.supernatural",type:"checkbox"},{label:"PLANT.highNorth",attr:"availability.highNorth",type:"range"},{label:"PLANT.grasLands",attr:"availability.grasLands",type:"range"},{label:"PLANT.swamps",attr:"availability.swamps",type:"range"},{label:"PLANT.woods",attr:"availability.woods",type:"range"},{label:"PLANT.jungle",attr:"availability.jungle",type:"range"},{label:"PLANT.mountains",attr:"availability.mountains",type:"range"},{label:"PLANT.desert",attr:"availability.desert",type:"range"},{label:"PLANT.maraskan",attr:"availability.maraskan",type:"range"}],magicalsign:[],patron:[],demonmark:[],essence:[],imprint:[{label:"Category",attr:"category",type:"text"}]};for(let[l,c]of Object.entries(r))for(let m of c)m.type=="text"&&(m.placeholder=`Library.advancedSearchPlaceholders.${l}.${m.attr}`);Wo(nn,r),game.dsa5.advancedFilters=nn})});var Ca=nn;var{getProperty:rn,duplicate:Uo,debounce:Vo,mergeObject:Ko}=foundry.utils,Kt=class{static{u(this,"SearchDocument")}constructor(e,t={}){let a=e.documentName||e.type;switch(e.documentName){case"Actor":case"Item":a=e.type;break}let s="";if(game.settings.get("dsa5","indexDescription"))switch(a){case"creature":case"npc":case"character":s=rn(e,"system.description.value");break;case"JournalEntry":s=rn(e,"system.content");break;default:s=rn(e,"description.value")}this.document={name:e.name,filterType:a,data:$("
    ").html(s).text(),id:e.id||e._id,visible:e.visible?e.visible:!0,compendium:e.compendium?e.compendium.metadata.packageName:t.packageName||"",pack:e.pack||(t.packageName?t.id:void 0),img:e.img,price:e.system?.price?.value}}get uuid(){if(this.document.compendium)return`Compendium.${this.document.pack}.${this.document.id}`;switch(this.itemType){case"character":case"creature":case"npc":return`Actor.${this.id}`;case"JournalEntry":return`JournalEntry.${this.id}`;default:return`Item.${this.id}`}}get name(){return this.document.name}get data(){return this.document.data}get id(){return this.document.id}get itemType(){return this.document.filterType}get hasPrice(){return b.equipmentCategories.has(this.document.filterType)}async getItem(){return await fromUuid(this.uuid)}hasPermission(){return this.document.visible}async render(){(await this.getItem()).sheet.render(!0)}get compendium(){return this.document.compendium}get img(){return this.itemType=="JournalEntry"?"systems/dsa5/icons/categories/DSA-Auge.webp":this.document.img}},Da=class extends Kt{static{u(this,"AdvancedSearchDocument")}constructor(e,t){super(e);let a=Ca[t]||[];for(let s of a)this[s.attr]=s.attr.split(".").reduce((i,n)=>i[n]===void 0?{}:i[n],e.system)}},Tt=class o extends Application{static{u(this,"DSA5ItemLibrary")}constructor(e){super(e),this.advancedFiltering=!1,this.journalBuild=!1,this.journalWorldBuild=!1,this.equipmentBuild=!1,this.equipmentWorldBuild,this.zooBuild=!1,this.zooWorldBuild=!1,this.currentDetailFilter={equipment:[],character:[],spell:[],journal:[],zoo:[]},this.journalIndex=new FlexSearch({encode:"simple",tokenize:"reverse",cache:!0,doc:{id:"id",field:["name","data"]}}),this.equipmentIndex=new FlexSearch({encode:"simple",tokenize:"reverse",cache:!0,doc:{id:"id",field:["name","data","itemType"],tag:["itemType"]}}),this.zooIndex=new FlexSearch({encode:"simple",tokenize:"reverse",cache:!0,doc:{id:"id",field:["name","data","itemType"],tag:["itemType"]}}),this.detailFilter={},this.pages={equipment:{},character:{},spell:{},journal:{},zoo:{}},this.filters={equipment:{categories:{armor:!1,ammunition:!1,equipment:!1,meleeweapon:!1,rangeweapon:!1,poison:!1,disease:!1,consumable:!1,plant:!1,book:!1,trap:!1},filterBy:{search:""}},character:{categories:{career:!1,advantage:!1,combatskill:!1,culture:!1,disadvantage:!1,trait:!1,skill:!1,specialability:!1,species:!1,application:!1,demonmark:!1,patron:!1,essence:!1,imprint:!1},filterBy:{search:""}},spell:{categories:{blessing:!1,ceremony:!1,liturgy:!1,magictrick:!1,ritual:!1,spell:!1,spellextension:!1,magicalsign:!1},filterBy:{search:""}},journal:{categories:{},filterBy:{search:""}},zoo:{categories:{npc:!1,character:!1,creature:!1},filterBy:{search:""}}}}async getData(e){let t=await super.getData(e);return t.categories=this.translateFilters(),t.isGM=game.user.isGM,t.advancedMode=this.advancedFiltering?"on":"",t.worldIndexed=game.settings.get("dsa5","indexWorldItems")?"on":"",t.fullTextEnabled=game.settings.get("dsa5","indexDescription")?"on":"",t.filterDuplicateItems=game.settings.get("dsa5","filterDuplicateItems")?"on":"",t.browseEnabled=this.browseEnabled?"on":"",this.advancedFiltering&&(t.advancedFilter=await this.buildDetailFilter("tbd",this.subcategory)),t}translateFilters(){return{equipment:this.buildFilter(this.filters.equipment),character:this.buildFilter(this.filters.character),spell:this.buildFilter(this.filters.spell),zoo:this.buildFilter(this.filters.zoo,"Actor"),journal:this.buildFilter(this.filters.journal)}}purgeAdvancedFilters(){for(let e in this.filters)for(let t in this.filters[e].categories)this.filters[e].categories[t]=!1;$(this._element).find('.filter[type="checkbox"]').prop("checked",!1),this.buildDetailFilter("none","none").then(e=>{$(this._element).find(".advancedSearch .groupbox").html(e)})}buildFilter(e,t="Item"){let a=[];return Object.keys(e.categories).forEach(function(s){a.push({label:game.i18n.localize(`TYPES.${t}.${s}`),selected:e.categories[s],key:s})}),a=a.sort(function(s,i){return s.label.localeCompare(i.label)}),a}static get defaultOptions(){let e=super.defaultOptions;return e.id="DSA5ItemLibrary",e.classes.push("dsa5","itemlibrary"),e.height=800,e.width=800,e.resizable=!0,e.title=game.i18n.localize("ItemLibrary"),e.template="systems/dsa5/templates/system/itemlibrary.html",e.tabs=[{navSelector:".tabs",contentSelector:".content",initial:"equipment"}],e}async getRandomItems(e,t){let a=[],s=this.equipmentIndex;return a.push(...await s.search(e,{field:["itemType"]})),(await Promise.all(this.shuffle(a.filter(i=>i.hasPermission)).slice(0,t+5).map(i=>i.getItem()))).filter(i=>{let n=i.getFlag("dsa5","enchantments");return!n||!n.find(r=>r.talisman)}).slice(0,t)}shuffle(e){let t=e.length,a,s;for(;t!==0;)s=Math.floor(Math.random()*t),t-=1,a=e[t],e[t]=e[s],e[s]=a;return e}async findCompendiumItem(e,t,a=!0){await this.buildEquipmentIndex();let s={field:["name"],where:{itemType:t}},i=await this.equipmentIndex.search(e,s);return a&&(i=i.filter(n=>n.compendium!="")),i=i.sort((n,r)=>{let l=n.compendium.startsWith("dsa5-core"),c=r.compendium.startsWith("dsa5-core");return l&&c?0:l?1:c?-1:0}),await Promise.all(i.map(n=>n.getItem()))}async getCategoryItems(e,t=!1,a=!1){await this.buildEquipmentIndex();let s=this.equipmentIndex.search(e,{field:["itemType"]});return t?(await Promise.all(s.map(i=>i.getItem()))).map(i=>i.toObject()):a?await Promise.all(s.map(i=>i.getItem())):s}async executeAdvancedFilter(e,t,a,s,i,n=[]){let r=u(f=>{for(let h of a)if(h[2]?f[h[0]]!=h[1]:f[h[0]].indexOf(h[1])==-1)return!1;return!0},"selFnct"),l=u(f=>{for(let h of s)if(f[h[0]].toLowerCase().indexOf(h[1])==-1)return!1;return!0},"txtFnct"),c=u(f=>{for(let h of i)if(f[h[0]]!=h[1])return!1;return!0},"cbFnct"),m=u(f=>{for(let h of n)if(f[h[0]]h[2])return!1;return!0},"rangeFct"),p=t.where(f=>(e==""||f.name.toLowerCase().indexOf(e)!=-1)&&r(f)&&l(f)&&c(f)&&m(f));return p=p.filter(f=>f.hasPermission).sort((f,h)=>f.name.toLowerCase()>h.name.toLowerCase()?1:-1),p}collectDetailSearch(e){let t=[],a=[],s=[];for(let i of e.find("select")){let n=$(i).val();n!=""&&t.push([$(i).attr("name"),n,i.dataset.notstrict!="true"])}for(let i of e.find('input[type="text"]:not(.manualFilter)')){let n=$(i).val();n!=""&&a.push([$(i).attr("name"),n.toLowerCase()])}for(let i of e.find('input[type="checkbox"]:checked:not(.manualFilter)')){let n=$(i).val();n!=""&&s.push([$(i).attr("name"),n.toLowerCase()])}return{sels:t,inps:a,checkboxes:s}}async advancedFilterStuff(e,t){let a=$(this._element).find(".detailFilters"),s=a.attr("data-subc"),i=this.detailFilter[s],n=this.filters[e].filterBy.search.toLowerCase(),{sels:r,inps:l,checkboxes:c}=this.collectDetailSearch(a),m=await this.executeAdvancedFilter(n,i,r,l,c);return this.setBGImage(m,e),m=this.filterDuplications(m),m}async findEquipmentItemDetailed(e,t,a=!0){await this.buildDetailFilter("Item",t);let s=this.detailFilter[t],i=await this.executeAdvancedFilter(e.search||"",s,e.selects||[],e.inputs||[],e.booleans||[],e.rangeSearches||[]);return a&&(i=i.filter(n=>n.compendium!="")),await Promise.all(i.map(n=>n.getItem()))}filterDuplications(e){return game.settings.get("dsa5","filterDuplicateItems")&&(e=[...new Map(e.map(t=>[`${t.name}_${t.type}`,t])).values()]),e}async filterStuff(e,t,a){let s=this.filters[e].filterBy.search,i={field:["name","data"]},n=[],r=!1;for(let l in this.filters[e].categories){if(this.filters[e].categories[l]){let c,m=null;s==""?c=t.search(l,{field:["itemType"],sort:"name",where:{itemType:l}}):c=t.search(s,{...i,sort:"name",where:{itemType:l}});let d=Number(a)||0;c=c.slice(d,Math.min(d+60,c.length)),c.length==60&&(m=`${d+60}`),this.pages[e].next=m,n.push(...c)}r=this.filters[e].categories[l]||r}return r||(n=t.search(s,{...i,limit:60,page:a||!0,sort:"name"}),this.pages[e].next=n.next),n=n.result?n.result:n,n=n.filter(l=>l.hasPermission),this.setBGImage(n,e),n}setBGImage(e,t){$(this._element).find(`.${t} .libcontainer`)[`${e.length>0?"remove":"add"}Class`]("libraryImg")}async getItemTemplate(e,t){return this.browseEnabled&&["Item","Actor"].includes(t)?e.map(a=>`
    `).join(""):await renderTemplate("systems/dsa5/templates/system/libraryItem.html",{items:e})}async renderBrowseItem(e){let t=await fromUuid(e),a=`systems/dsa5/templates/items/browse/${t.type}.html`,s=await renderTemplate(a,{document:t,isGM:game.user.isGM,...await t.sheet.getData()});return`
    ${s}
    `}intersectionObserved(e,t){for(let a of e)if(a.isIntersecting){let s=a.target.dataset.uuid;this.renderBrowseItem(s).then(i=>{a.target.outerHTML=i}),t.unobserve(a.target)}}async renderResult(e,t,{index:a,itemType:s},i){let n=e.find(".searchResult .item-list"),r=await this.getItemTemplate(t,s);i||n.empty(),r=$(r);let l=u((m,d,p,f=!1)=>{m.stopPropagation();let h=d.find(m.currentTarget.dataset.itemId);m.originalEvent.dataTransfer.setData("text/plain",JSON.stringify({type:p,uuid:h.uuid,pay:f}))},"itemDragStart");r.each(function(){let m=$(this);m.attr("draggable",!0).on("dragstart",d=>l(d,a,s)),m.find(".priceDrag").attr("draggable",!0).on("dragstart",d=>l(d,a,s,!0))}),n.append(r);let c=n.find(".loader");if(c.length>0){let m=new IntersectionObserver(this.intersectionObserved.bind(this),{root:e.find(".window-content")[0]});for(let d of c)m.observe(d)}}async filterItems(e,t,a){let s=this.selectIndex(t),i=this.advancedFiltering&&t!="journal"?await this.advancedFilterStuff(t,a):await this.filterStuff(t,s.index,a);return await this.renderResult(e,i,s,a),i}selectIndex(e){let t="Item",a=this.equipmentIndex;switch(e){case"zoo":t="Actor",a=this.zooIndex;break;case"journal":t="JournalEntry",a=this.journalIndex;break}return{index:a,itemType:t}}async _render(e=!1,t={}){await super._render(e,t),this.buildEquipmentIndex()}_getHeaderButtons(){let e=super._getHeaderButtons();return e.unshift({class:"libraryModulsFilter",tooltip:"DSASETTINGS.libraryModulsFilter",icon:"fas fa-filter",onclick:u(async()=>new on().render(!0),"onclick")}),e}async buildEquipmentIndex(){await this._createIndex("equipment","Item",game.items)}async _createIndex(e,t,a){if(this[`${e}Build`])return;let s=game.settings.get("dsa5","libraryModulsFilter");SceneNavigation.displayProgressBar({label:game.i18n.format("Library.loading",{item:""}),pct:0});let i=$(this._element).find(`*[data-tab="${e}"]`);this.showLoading(i,e);let n=game.packs.filter(f=>f.documentName==t&&(game.user.isGM||f.visible)&&!f.metadata.label.startsWith("WZ-")&&!s[f.metadata.packageName]),r=100/(n.length+1),l=r,c=["name","system.type","system.description.value","img"],m;t=="Actor"?m=u(f=>f.getIndex({actorFields:c}),"func"):t=="JournalEntry"?m=u(f=>f.getDocuments(),"func"):m=u(f=>f.getDocuments({type__in:Object.keys(game.system.documentTypes.Item)}),"func");let d=this.indexWorldItems(a,e);SceneNavigation.displayProgressBar({label:game.i18n.format("Library.loading",{item:"world items"}),pct:Math.round(r)});let p=n.map(async f=>{let h=await m(f);l+=r,SceneNavigation.displayProgressBar({label:game.i18n.format("Library.loading",{item:`${f.metadata.label} (${f.metadata.id})`}),pct:Math.round(l)}),d.push(...h.map(y=>new Kt(y,f.metadata)))});return Promise.all(p).then(f=>{this[`${e}Index`].add(d),this[`${e}Build`]=!0,SceneNavigation.displayProgressBar({label:game.i18n.format("Library.loading",{item:""}),pct:100}),this.hideLoading(i,e)})}subcategoryFields(e){let t=["name","itemType"],a=Ca[e]||[];for(let s of a)t.push(s.attr);return t}indexWorldItems(e,t){let a=[];return game.settings.get("dsa5","indexWorldItems")&&(a.push(...e.filter(s=>s.visible).map(s=>new Kt(s))),this[`${t}WorldBuild`]=!0),a}async createDetailIndex(e,t){if(!this.detailFilter[t]){let a=game.i18n.localize(`TYPES.Item.${t}`);SceneNavigation.displayProgressBar({label:game.i18n.format("Library.loading",{item:a}),pct:0});let s=this.subcategoryFields(t),i=$(this._element).find(`*[data-tab="${e}"]`);i.find(".searchResult ul").html(""),this.showLoading(i,e),this.detailFilter[t]=new FlexSearch({encode:"simple",tokenize:"full",cache:!0,doc:{id:"id",field:s}});let{index:n,itemType:r}=this.selectIndex(e),l=r=="Item"?game.items:game.actors,c=[];game.settings.get("dsa5","indexWorldItems")&&c.push(...l.filter(k=>k.visible&&k.type==t).map(k=>new Da(k,t)));let m=n.search(t,{field:["itemType"]}),d={};SceneNavigation.displayProgressBar({label:game.i18n.format("Library.loading",{item:a}),pct:10});for(let k of m)k.document.pack&&(d[k.document.pack]||(d[k.document.pack]=[]),d[k.document.pack].push(k.document.id));let p=[],f=60/Object.keys(d).length,h=0;for(let k of Object.entries(d))h+=1,p.push(game.packs.get(k[0]).getDocuments({_id__in:k[1],type:t})),SceneNavigation.displayProgressBar({label:game.i18n.format("Library.loading",{item:a}),pct:Math.round(10+h*f)});SceneNavigation.displayProgressBar({label:game.i18n.format("Library.loading",{item:a}),pct:70});let y=await Promise.all(p);f=30/y.length,h=0;for(let k of y)h+=1,c.push(...k.map(C=>new Da(C,t))),SceneNavigation.displayProgressBar({label:game.i18n.format("Library.loading",{item:a}),pct:Math.round(70+h*f)});this.detailFilter[t].add(c),this.hideLoading(i,e),SceneNavigation.displayProgressBar({label:game.i18n.format("Library.loading",{item:a}),pct:100})}}async buildDetailFilter(e,t,a=void 0){let s=Uo(Ca[t]||[]),i=!1;if(s){if(a){for(let c of s)switch(c.type){case"select":let m=a.selects.find(f=>f[0]==c.attr);m&&(c.value=m[1]);break;case"text":let d=a.inputs.find(f=>f[0]==c.attr);d&&(c.value=d[1]);break;case"checkbox":let p=a.booleans.find(f=>f[0]==c.attr);p&&(c.value=p[1]);break}i=a.selects.find(c=>c[0]=="compendium")?.[1]}let n=this.createDetailIndex(e,t),r=o.collectModulOptions(),l=await renderTemplate("systems/dsa5/templates/system/detailFilter.html",{fields:s,subcategory:t,moduleOptions:r,moduleSelected:i});return await n,l}else return`

    ${game.i18n.localize("Library.selectAdvanced")}

    `}static collectModulOptions(){return game.packs.filter(e=>e.metadata.type=="Item").reduce((e,t)=>{if(!e[t.metadata.packageName]){let a=game.i18n.has(`${t.metadata.packageName}.name`)?game.i18n.localize(`${t.metadata.packageName}.name`):game.modules.get(t.metadata.packageName)?.title.replace(/The Dark Eye 5th Ed. - /i,"")||game.system.title;e[t.metadata.packageName]=a}return e},{})}checkWorldStuffIndex(){game.settings.get("dsa5","indexWorldItems")&&(!this.journalWorldBuild&&this.journalBuild&&this.journalIndex.add(this.indexWorldItems(game.journal,"journal")),!this.equipmentWorldBuild&&this.equipmentBuild&&this.equipmentIndex.add(this.indexWorldItems(game.items,"equipment")),!this.zooWorldBuild&&this.zooBuild&&this.zooIndex.add(this.indexWorldItems(game.actors,"zoo")))}activateListeners(e){super.activateListeners(e),me(e),e.on("click",".searchableAbility a",s=>mt(s)),e.on("click",".toggleAdvancedMode",()=>{this.advancedFiltering=!this.advancedFiltering,this.advancedFiltering?($(this._element).find(".toggleAdvancedMode").addClass("on"),$(this._element).find(".advancedSearch").fadeIn(),this.purgeAdvancedFilters()):($(this._element).find(".toggleAdvancedMode").removeClass("on"),$(this._element).find(".advancedSearch").fadeOut())}),e.on("change",".detailFilters input, .detailFilters select",()=>{let s=$(this._element).find(".tab.active"),i=s.attr("data-tab");this.filterItems(s,i)}),e.on("click",".filter",async s=>{let i=$(s.currentTarget).closest(".tab"),n=i.attr("data-tab"),r=s.currentTarget.dataset.category,l=$(s.currentTarget).is(":checked");this.advancedFiltering&&l&&(this.purgeAdvancedFilters(),this.subcategory=r,$(s.currentTarget).prop("checked",l),$(this._element).find(".advancedSearch .groupbox").html(await this.buildDetailFilter(n,r))),this.filters[n].categories[r]=l,this.filterItems(i,n)}),e.on("click",".item-name",s=>{this.getItemFromHTML(s).render()}),e.on("mousedown",".item-name",s=>{s.button==2&&g.showArtwork(this.getItemFromHTML(s))}),e.on("keyup",".filterBy-search",s=>{let i=$(s.currentTarget).closest(".tab"),n=i.attr("data-tab");this.filters[n].filterBy.search=$(s.currentTarget).val(),this.filterItems(i,n)});let t=u(s=>{s.stopPropagation();let i=s.currentTarget.dataset.type,n=s.currentTarget.dataset.uuid;!n||!i||s.originalEvent.dataTransfer.setData("text/plain",JSON.stringify({type:i,uuid:n}))},"itemDragStart");e.on("click",".show-item",async s=>{let i=s.currentTarget.dataset.uuid;(await fromUuid(i)).sheet.render(!0)}),e.find(".show-item").attr("draggable",!0).on("dragstart",s=>t(s)),e.find('*[data-tab="journal"]').click(s=>{this._createIndex("journal","JournalEntry",game.journal)}),e.find('*[data-tab="zoo"]').click(s=>{this._createIndex("zoo","Actor",game.actors)}),e.find(".showDetails").click(s=>{let i=s.currentTarget.dataset.btn;$(s.currentTarget).find("i").toggleClass("fa-caret-left fa-caret-right"),e.find(`.${i} .detailBox`).toggleClass("dsahidden")}),e.find(".toggleWorldIndex").click(s=>{game.settings.set("dsa5","indexWorldItems",!game.settings.get("dsa5","indexWorldItems")),this.checkWorldStuffIndex(),$(s.currentTarget).toggleClass("on")}),e.find(".fulltextsearch").click(s=>{game.settings.set("dsa5","indexDescription",!game.settings.get("dsa5","indexDescription")),$(s.currentTarget).toggleClass("on")}),e.find(".browseEnabled").click(s=>{this.browseEnabled=!this.browseEnabled,$(s.currentTarget).toggleClass("on")}),e.find(".filterDuplicateItems").click(s=>{game.settings.set("dsa5","filterDuplicateItems",!game.settings.get("dsa5","filterDuplicateItems")),$(s.currentTarget).toggleClass("on")});let a=this;$(this._element).find(".window-content").on("scroll.infinit",Vo(function(s){if(a.advancedFiltering)return;let i=$(s.target),n=i.scrollTop()+i.innerHeight()>=i[0].scrollHeight-100,r=e.find(".tabs .item.active").attr("data-tab");if(n&&a.pages[r].next){let l=e.find(".tab.active");a.filterItems.call(a,l,r,a.pages[r].next)}},100))}getItemFromHTML(e){let t=$(e.currentTarget).parents(".browser-item").attr("data-item-id");switch($(e.currentTarget).closest(".tab").attr("data-tab")){case"zoo":return this.zooIndex.find(t);case"journal":return this.journalIndex.find(t);default:return this.equipmentIndex.find(t)}}showLoading(e,t){this.setBGImage([1],t),$(`
    ${game.i18n.localize("Library.buildingIndex")}
    `).appendTo(e.find(".searchResult"))}hideLoading(e,t){this.setBGImage([],t),e.find(".loader").remove()}},on=class extends Application{static{u(this,"LibraryModulsFilter")}static get defaultOptions(){let e=super.defaultOptions;return e.classes.push("dsa5"),e.resizable=!0,e.width=600,e.title=game.i18n.localize("DSASETTINGS.libraryModulsFilter"),e.template="systems/dsa5/templates/system/librarymodulesfilter.html",e}async getData(e){let t=await super.getData(e);return Ko(t,{moduleOptions:Tt.collectModulOptions(),rejectedModules:game.settings.get("dsa5","libraryModulsFilter")}),t}activateListeners(e){super.activateListeners(e),e.find(".moduleSelector").change(t=>this.moduleFilterChanged(t))}async moduleFilterChanged(e){let t=e.currentTarget.id,a=e.currentTarget.checked,s=game.settings.get("dsa5","libraryModulsFilter");a?delete s[t]:s[t]=!0,game.settings.set("dsa5","libraryModulsFilter",s)}};var{getProperty:ln}=foundry.utils,Yt=class extends foundry.applications.api.DialogV2{static{u(this,"DSA5Initializer")}constructor(e,t,a,s="",i={}){let n={window:{title:e},position:{width:500},content:t,buttons:[{action:"initialize",label:"initialize",callback:u(()=>{this.lock||this.initialize()},"callback")},{action:"cancel",label:"cancel",callback:u(()=>{this.lock||this.dontInitialize()},"callback")}]};super(n),this.module=a,this.lang=s,this.folders={},this.journals={},this.scenes={},this.actors={},this.lock=!1,this.scopeOptions=i}async initNotes(e,t,a){let s=await this.getFolderForType("JournalEntry");for(let i of e.notes)try{let n=t.find(r=>r.flags.dsa5.initId==i.entryId);if(!a.has(n._id)){let r=ln(n,"flags.dsa5.parent"),l=s;this.folders[r]?l=this.folders[r]:r&&(l=await this.getFolderForType("JournalEntry",s.id,r,0,ln(n,"flags.dsa5.foldercolor")||"")),n.folder=l.id;let c=game.journal.find(m=>m.name==n.name&&m.folder?.id==l.id&&m.flags.dsa5.initId==i.entryId);if(c)await c.update(n),a.set(n._id,c.id);else{let m=await JournalEntry.create(n);a.set(n._id,m.id)}}i.entryId=a.get(n._id)}catch(n){console.warn(`Could not initialize Scene Notes for scene :${e.name}`+n)}}async initScenes(e,t=void 0){let a=await this.getFolderForType("Scene"),i=(await game.packs.get(e.scenes).getDocuments()).map(f=>f.toObject()),r=(await game.packs.get(e.journal).getDocuments()).map(f=>f.toObject()),l=[],c=[],m=new Map,d=!1;t&&(i=i.filter(f=>t.includes(f.name)));for(let f of i){let h=d,y=game.scenes.find(k=>k.name==f.name&&k.folder?.id==a.id);if(!d&&y)try{[h,d]=await foundry.applications.api.DialogV2.wait({window:{title:"Book.sceneReset"},content:`

    ${game.i18n.format("Book.sceneResetDescription",{name:f.name})}

    `,buttons:[{action:"yes",icon:"fa fa-check",label:"yes",callback:u(()=>[!0,!1],"callback")},{action:"all",icon:"fa fa-check",label:"LocalizedIDs.all",callback:u(()=>[!0,!0],"callback")},{action:"no",icon:"fas fa-times",label:"cancel",default:!0,callback:u(()=>[!1,!1],"callback")}]})}catch{h=!1,d=!1}if(y&&!h){this.scenes[y.name]=y;continue}f.folder=a.id,await this.initNotes(f,r,m),y?(f._id=y.id,c.push(f)):l.push(f)}let p=await Scene.create(l,{dsaInit:!0,keepId:!0});for(let f of p){this.scenes[f.name]=f;let h=await f.createThumbnail();await f.update({thumb:h.thumb})}for(let f of c)await game.scenes.get(f._id).update(f),this.scenes[f.name]=game.scenes.get(f._id);if(e.initialScene){let f=this.scenes[e.initialScene];f&&(await game.settings.set("core",NotesLayer.TOGGLE_SETTING,!0),await f.activate(),await f.update({navigation:!0}))}}async loadJson(){let e=this.scopeOptions.initializer||`initialization${this.lang}`;return await(await fetch(`modules/${this.module}/${e}.json`)).json()}async initialize(){this.lock=!0;let e=$(this.element).find('[data-action="initialize"]');e.prepend('');let t={};try{game.settings.settings.has(`${this.moduleScope}.initialized`)&&await game.settings.set(this.moduleScope,"initialized",!0)}catch{}if(this.scopeOptions.scope)await fetch(`modules/${this.module}/${this.scopeOptions.scope}.json`).then(async i=>i.json()).then(async i=>{t=i});else try{await fetch(`modules/${this.module}/adventure${this.lang}.json`).then(async i=>i.json()).then(async i=>{t=i})}catch{try{await fetch(`modules/${this.module}/adventure.json`).then(async i=>i.json()).then(async i=>{t=i})}catch{console.warn(`Could not find book data for ${this.moduleScope} import.`)}}let a=await this.loadJson(),s=a.folders;if(s){let i=await this.getFolderForType("JournalEntry"),n=a.folders[0].name;i&&(this.folders[i.data.name]=i,a.folders.shift());let r=await Folder.create(s);Array.isArray(r)||(r=[r]);for(let c of r)this.folders[c.data.name]=c;let l=[];for(let c in this.folders){let m=this.folders[c].getFlag("dsa5","parent"),d=m==n?game.i18n.localize(`${this.moduleScope}.name`):m;d&&l.push({_id:this.folders[c].id,parent:this.folders[d].id})}await Folder.updateDocuments(l)}if(a.items&&a.items.length>0){let i=await this.getFolderForType("Item"),n=[],r=[];for(let l of a.items){l.folder=i.id;let c=game.items.find(m=>m.name==l.name&&m.folder?.id==i.id);c?(l._id=c.id,r.push(l)):n.push(l)}await D.create(n),await D.updateDocuments(r)}if(a.playlists){let i=await this.getFolderForType("Playlist"),n=[],r=[],c=(await game.packs.get(a.playlists).getDocuments()).map(m=>m.toObject());for(let m of c){m.folder=i.id;let d=game.playlists.find(p=>p.name==m.name&&p.folder?.id==i.id);d?(m._id=d._id,r.push(m)):n.push(m)}await Playlist.create(n,{keepId:!0}),await Playlist.updateDocuments(r)}if(a.scenes&&await this.initScenes(a),a.actors){let i=await this.getFolderForType("Actor"),r=(await game.packs.get(a.actors).getDocuments()).map(f=>f.toObject()),l=[],c=[],m=new Map,d=0;if(ln(t,"chapters")){for(let f of t.chapters)for(let h of f.content)if(h.actors){let y=!1;for(let k of h.actors)m.has(k)||(m.set(k,h.name),y=!0);y&&(await this.getFolderForType("Actor",i.id,h.name,d),d+=1)}}for(let f of r){let h=m.has(f.name)?await this.getFolderForType("Actor",i.id,m.get(f.name)):i;f.folder=h.id,f._id&&delete f._id;let y=game.actors.find(k=>k.name==f.name&&[i.id,h.id].includes(k.folder?.id));y?(f._id=y.id,await y.deleteEmbeddedDocuments("Item",y.items.map(k=>k.id)),c.push(f)):l.push(f)}let p=await Actor.create(l);await Actor.updateDocuments(c);for(let f of p)this.actors[f.name]=f}a.macro&&(Hooks.once("renderCompendium",(i,n,r)=>{n.find(`[data-pack="${a.macro}"] header`).append($(`

    ${game.i18n.localize("Book.macroHint")}

    `))}),await game.packs.get(a.macro).render(!0)),this.lock=!1,e.find("i").remove(),ui.notifications.info("initComplete",{localize:!0}),await this.close()}async dontInitialize(){game.settings.settings.has(`${this.moduleScope}.initialized`)&&await game.settings.set(this.moduleScope,"initialized",!0),ui.notifications.info("initSkipped",{localize:!0}),await this.close()}submit(e){try{e.callback&&e.callback(this.options.jQuery?this.element:this.element[0])}catch(t){throw ui.notifications.error(t),new Error(t)}}get moduleScope(){return this.scopeOptions.scope||this.module}async getFolderForType(e,t=null,a=null,s=0,i=""){return a||(a=game.i18n.localize(`${this.moduleScope}.name`)),g.getFolderForType(e,t,a,s,i)}};var Jt=class extends ChatMessage{static{u(this,"ChatMessageDSA5Roll")}get isRoll(){return this.isDSARoll||super.isRoll}get roll(){return this.isDSARoll?new cn(""):super.roll}get isDSARoll(){return this.flags.data?this.flags.data.isDSARoll:!1}},cn=class extends Roll{static{u(this,"EmptyRoll")}render(){return""}};var{getProperty:Yo,mergeObject:Jo}=foundry.utils,Qt=class extends Hotbar{static{u(this,"DSA5Hotbar")}async _render(e=!1,t={}){await super._render(e,t),this.addContextColor()}async collapse(){return this._collapsed?!0:($(this.element).addClass("collapsedHotbar"),super.collapse())}async expand(){return this._collapsed?($(this.element).removeClass("collapsedHotbar"),super.expand()):!0}async updateDSA5Hotbar(){if(!game.settings.get("dsa5","hotbarv3"))return;let e=canvas.tokens.controlled;if(this.token=void 0,this.showEffects=!1,e.length===1){let t=e[0].actor;t&&t.isOwner&&(this.token=e[0])}e.length>=1&&(this.showEffects=!0),await this.render(!0,{focus:!1})}addContextColor(){let e=new RegExp(` ${game.i18n.localize("CHAR.PARRY")}$`),t=new RegExp(` ${game.i18n.localize("CHAR.ATTACK")}$`),a=$(this._element).find("#macro-list");for(let s of this.macros)s.macro&&(e.test(s.macro.name)?a.find(`[data-macro-id="${s.macro.id}"]`).addClass("parry"):t.test(s.macro.name)&&a.find(`[data-macro-id="${s.macro.id}"]`).addClass("attack"))}_contextMenu(e){game.settings.get("dsa5","hotbarv3")?dn.create(this,e,".macro",this._getEntryContextOptions()):ContextMenu.create(this,e,".macro",this._getEntryContextOptions())}get template(){return game.settings.get("dsa5","hotbarv3")?"systems/dsa5/templates/system/hud/hotbar.html":super.template}activateListeners(e){if(super.activateListeners(e),game.settings.get("dsa5","hotbarv3")){e.find(".quantity-click").mousedown(i=>N.quantityClick(i)),e.on("mousedown","li.primary",async i=>(game.tooltip.deactivate(),i.currentTarget.classList.contains("macro")||(i.stopPropagation(),await this.tokenHotbar.executeQuickButton(i)),!1)),e.find(".categoryFilter").click(i=>{this.filterCategory(i,e)});let t=this,a=u(function(i){if(e.find(".sections").is(":hover"))return t.filterSections(i,e),!1},"fn"),s=u(function(){$(document).off("keydown.sectionFilter",a),t.searching="",e.find(".macro,.primary,.sections .skillItems").removeClass("dsahidden"),e.find(".longLayout").removeClass("longLayout")},"filterOff");e.find(".sections").hover(function(){$(document).off("keydown.sectionFilter",a).on("keydown.sectionFilter",a)},s),e.find(".primary").hover(i=>this._betterTooltip(i)),e.find(".itdarkness input").change(i=>this.tokenHotbar.changeDarkness(i))}}static get defaultOptions(){let e=super.defaultOptions;return e.scrollY=e.scrollY||[],e.scrollY.push("#macro-list"),e}async _betterTooltip(e){let t=e.currentTarget,a=t.dataset;if("tooltipClass"in t.dataset)return;let s,i,n;switch(a.category?.split(" ")[0]){case"skillgm":s=game.i18n.format("TT.skillgm",{name:a.name});break;case"effect":let l=this.token.actor?.effects.get(a.id);l&&(n=game.i18n.has(l.description)?game.i18n.localize(l.description):l.description);break;case"onUse":switch(i=this.token.actor?.items.get(a.id),i.type){case"specialability":n=i.system.rule?.value;break;case"advantage":case"disadvantage":break;default:n=i.system.description?.value}break;case"unequipped":case"consumable":case"weapon":case"spell":i=this.token.actor?.items.get(a.id),n=$(await renderTemplate(`systems/dsa5/templates/items/browse/${i.type}.html`,{isGM:game.user.isGM,...await i.sheet.getData(),document:i,skipHeader:!0,hint:!0})).find(".groupbox").html();break;case"enchantment":let c=a.id.split("_");i=this.token.actor?.items.get(c[0]);let m=i.getFlag("dsa5","enchantments").find(d=>d.id==c[1]);a.name=m.name,n=await renderTemplate("systems/dsa5/templates/items/enchantment-preview.html",{enchantment:m,document:i});break;default:return}n&&(s=`

    ${a.name}

    ${n}
    `),s&&($("#tooltip").addClass("dsatooltip").html(s),t.dataset.tooltip=s,t.dataset.tooltipClass="dsatooltip")}filterCategory(e,t){let a=e.currentTarget.dataset.filter;a?(t.find(".skillItems").addClass("collapsed"),t.find(`.skillItems[data-category="${a}"]`).removeClass("collapsed"),t.find(".categoryFilter").removeClass("active"),t.find(`.categoryFilter[data-filter="${a}"]`).addClass("active"),this.token?.actor?this.activeFilters=[a]:this.gmFilters=[a]):(t.find(".skillItems").removeClass("collapsed"),t.find(".categoryFilter").removeClass("active"),this.token?.actor?this.activeFilters=[]:this.gmFilters=[])}filterSections(e,t){switch(this.searching=this.searching||"",e.which){case 8:this.searching=this.searching.slice(0,-1);break;default:if(!e.key.match(/^[a-zA-Z0-9öäüÖÄÜ]$/))return;this.searching+=e.key}e.preventDefault(),e.stopPropagation();let a=this.searching.toLowerCase();ge(a);let s=t.find(".sections");a?s.addClass("longLayout"):s.removeClass("longLayout");let i=t.find(".primary");i.removeClass("dsahidden"),i.filter(function(){let n=this.dataset?.name?.toLowerCase().trim();return n?n.indexOf(a)==-1:!0}).addClass("dsahidden");for(let n of s.find(".skillItems")){let r=n.dataset.category,l=$(n);l.toggleClass("dsahidden",l.find(`li.${r}.dsahidden`).length==l.find(`li.${r}`).length)}return!1}async getData(e){let t=await super.getData(e);return game.settings.get("dsa5","hotbarv3")&&await this._h3Data(t),t}get tokenHotbar(){return game.dsa5.apps.tokenHotbar}async _h3Data(e){let t={skills:{},attacks:[]},a=[],s=[],i=!1,n=[],r=this.token?.actor;if(r){if(!["epic","loot"].includes(Yo(r,"system.merchant.merchantType"))){n=(this.activeFilters||[]).filter(k=>k!="gm");let f=r.items.filter(k=>k.type=="combatskill").map(k=>O._calculateCombatSkillValues(k.toObject(),r.system));s=await this.tokenHotbar._effectEntries(r);let h=this.tokenHotbar._brawlEntry(f);if(H.isRiding(r)){let k=this.tokenHotbar._ridingEntry(r);k&&(t.skills.skill=[k])}h&&t.attacks.push(h),t.functions=this.tokenHotbar?._functionEntries()||[];for(let k of r.items)switch(k.type){case"skill":t.skills[k.type]||(t.skills[k.type]=[]),t.skills[k.type].push(this.tokenHotbar._skillEntry(k,"skill"));break;case"spell":case"liturgy":t.skills[k.type]||(t.skills[k.type]=[]),t.skills[k.type].push(this.tokenHotbar._skillEntry(k,"spell"));break;case"trait":Xe.traitTypes.has(k.system.traitType.value)&&t.attacks.push(this.tokenHotbar._traitEntry(k,r.system));break;case"consumable":t.skills[k.type]||(t.skills[k.type]=[]),t.skills[k.type].push(this.tokenHotbar._actionEntry(k,"consumable",{abbrev:k.system.quantity.value}));break;case"meleeweapon":case"rangeweapon":let C=this.tokenHotbar._combatEntry(k,f,r);for(let v of C)k.system.worn.value||(v.cssClass="unequipped"),t.attacks.push(v);default:if(k.getFlag("dsa5","onUseEffect")&&(t.skills[k.type]||(t.skills[k.type]=[]),t.skills[k.type].push(this.tokenHotbar._actionEntry(k,"onUse",{subfunction:"onUse"}))),k.getFlag("dsa5","enchantments")){t.skills[k.type]||(t.skills[k.type]=[]);for(let v of k.getFlag("dsa5","enchantments"))t.skills[k.type].push(this.tokenHotbar._enchantmentEntry(v,"enchantment",k,{subfunction:"enchantment"}))}break}}}else if(game.user.isGM&&!game.settings.get("dsa5","disableTokenhotbarMaster")){n=this.gmFilters||[],t.skills.gm=this.tokenHotbar?._gmEntries()||[];let f=this.tokenHotbar?.skills||await this.tokenHotbar?.prepareSkills()||[];t.skills.skillgm=f,i=!0}let l=45,c=2,m={gm:"systems/dsa5/icons/categories/DSA-Auge.webp",skillgm:"systems/dsa5/icons/categories/Skill.webp"},d={gm:"gmMenu",skillgm:"TYPES.Item.skill"};for(let f of Object.keys(t.skills)){let h=`TYPES.Item.${f}`;a.push({key:f,tooltip:game.i18n.has(h)?game.i18n.localize(h):game.i18n.localize(d[f]),img:D.defaultImages[f]||m[f]})}let p=["body","social","nature","knowledge","trade"];if(t.skills.skill?.sort((f,h)=>p.indexOf(f.addClass)-p.indexOf(h.addClass)||f.name.localeCompare(h.name)),t.skills.skillgm?.sort((f,h)=>p.indexOf(f.addClass)-p.indexOf(h.addClass)||f.name.localeCompare(h.name)),t.attacks.length>0&&(t.attacks.sort((f,h)=>(h.cssClass||"").localeCompare(f.cssClass||"")||f.name.localeCompare(h.name)),a.unshift({key:"attacks",tooltip:game.i18n.localize("Combat"),img:"systems/dsa5/icons/categories/Meleeweapon.webp"})),this.showEffects){if(canvas.tokens.controlled.length>1){let y=await this.tokenHotbar._effectEntries(canvas.tokens.controlled[0].actor,{subfunction:"sharedEffect"});for(let k of canvas.tokens.controlled){let C=(await k.actor.actorEffects()).map(v=>v.name);y=y.filter(v=>C.includes(v.name))}s=y}let h={name:"CONDITION.add",id:"",icon:"icons/svg/aura.svg",cssClass:"effect",abbrev:game.i18n.localize("CONDITION.add")[0],subfunction:"addEffect",indicator:"+"};s.unshift(h)}n.length>0&&(n=Object.keys(t.skills).concat(["macro","attacks"]).filter(f=>!n.includes(f))),Jo(e,{token:{groups:t,effects:s},darkness:canvas?.scene?.environment.darknessLevel||0,hotBarcssClass:"hotbarV3",barWidth:"527px",baseBarHeight:`${l}px`,barHeight:`${(l+7)*c+30}px`,filterCategories:a,selectedCategories:(r?this.activeFilters:this.gmFilters)||[],showEffects:this.showEffects,activeFilters:n,gmMode:i,macros:this._getAllMacros()})}_getAllMacros(){let e=Array.from({length:50},()=>"");for(let[t,a]of Object.entries(game.user.hotbar))e[parseInt(t)-1]=a;return e.map((t,a)=>{let s=t?game.macros.get(t):null;return{slot:a+1,key:a+1,icon:s?.img||null,cssClass:s?"active":"inactive",tooltip:s?s.name:null,macro:s}})}},dn=class o extends ContextMenu{static{u(this,"HotbarV3ContextMenu")}_setPosition(e,t){t=t.closest(".flexrow"),super._setPosition(e,t)}static create(e,t,a,s,{hookName:i="EntryContext",...n}={}){for(let r of e.constructor._getInheritanceChain())Hooks.call(`get${r.name}${i}`,t,s);if(s)return new o(t,a,s,n)}};var{setProperty:Qo,getProperty:Xo}=foundry.utils,Xt=class o{static{u(this,"RollMemory")}constructor(){this.tokens={},this.actors={}}static get wantedKeys(){let e=["vision","targetMovement","shooterMovement","quickChange","mountOptions","narrowSpace","advantageousPosition","doubleAttack","reduceCostSpell","forceSpell","increaseCastingTime","decreaseCastingTime","removeGesture","removeFormula"];return ne.isEnabled||e.push("distance"),e}getPath(e,t,a){let s=a||"",i=t._id||t.type;return e.token?`tokens.${e.token||e.actor}.${i}${s}`:`actors.${e.actor}.${i}${s}`}remember(e,t,a,s){let i=this.formDataSerialize(s);Object.entries(i).length>0&&Qo(this,this.getPath(e,t,a),i)}recall(e,t,a){return Xo(this,this.getPath(e,t,a))}formDataSerialize(e){let t=e.find("form"),a={};return t.find("select").each(function(){let s=$(this).attr("name");o.wantedKeys.includes(s)&&(a[s]=$(this).val())}),t.find('input[type="checkbox"]').each(function(){let s=$(this).attr("name");o.wantedKeys.includes(s)&&(a[s]=this.checked)}),t.find(".specAbs.active").each(function(){a.specAbs||(a.specAbs=[]),a.specAbs.push({id:$(this).attr("data-id"),step:$(this).attr("data-step")})}),e.find('[name="situationalModifiers"] option').each(function(){a.situationalModifiers||(a.situationalModifiers=[]),a.situationalModifiers.push({name:$(this).text().trim(),selected:this.selected})}),a}};Hooks.once("init",()=>{console.log("Initializing DSA5 system"),CONFIG.statusEffects=b.statusEffects,game.dsa5={apps:{DSA5_Utility:g,DSA5Initializer:Yt,DSA5ChatListeners:le,DSA5Payment:Q,SpecialabilityRulesDSA5:F,AdvantageRulesDSA5:P,Migrakel:Je,DSA5Dialog:ae,DSA5StatusEffects:z,DPS:ne,DSATables:B,DSA5SoundEffect:K,RequestRoll:ie,DiceDSA5:R,DSATour:rt,OpposeDSA:ee,EquipmentDamage:W,APTracker:_,DidYouKnow:it,MeasuredTemplateDSA:Le,Riding:H,RuleChaos:N,Trade:xe,DSAActiveEffectConfig:Z},entities:{Actordsa5:O,Itemdsa5:D},sheets:{ActorSheetdsa5:ze,ActorSheetdsa5Character:Ce,ActorSheetdsa5Creature:Ne,ActorSheetdsa5NPC:Re,MerchantSheetMixin:Be,MerchantSheetDSA5:Ie,ItemSheetdsa5:Y},wizards:{CareerWizard:tt,CultureWizard:et,SpeciesWizard:at},view:{tinyNotification:ge,tabSlider:me,clickableAbility:mt},dialogs:{DialogReactDSA5:ke,ReactToSkillDialog:yt,ActAttackDialog:bt,ReactToAttackDialog:kt,RandomGoodsAddition:Ta},macro:Vt,config:b,memory:new Xt,itemLibrary:new Tt},CONFIG.Actor.documentClass=O,CONFIG.Item.documentClass=D,CONFIG.ChatMessage.template="systems/dsa5/templates/chat/chat-message.html",CONFIG.ChatMessage.documentClass=Jt,CONFIG.ui.combat=Ge,CONFIG.ui.hotbar=Qt,CONFIG.Combat.documentClass=vt,CONFIG.Combatant.documentClass=wa,CONFIG.ActiveEffect.documentClass=Me,CONFIG.ActiveEffect.legacyTransferral=!1});sn(); diff --git a/modules/actor/actor-dsa5.js b/modules/actor/actor-dsa5.js index bd3de02c..aa4d8a69 100644 --- a/modules/actor/actor-dsa5.js +++ b/modules/actor/actor-dsa5.js @@ -1821,17 +1821,22 @@ export default class Actordsa5 extends Actor { await DiceDSA5.showDiceSoNice(newRoll, newTestData.rollMode); let ind = 0; - let changedRolls = []; + const changedRolls = []; + const changes = []; + newTestData.roll = Roll.fromData(newTestData.roll); for (let k of diesToReroll) { const characteristic = newTestData.source.system[`characteristic${k + 1}`]; const attr = characteristic ? game.i18n.localize(`CHARAbbrev.${characteristic.value.toUpperCase()}`) + ' - ' : ''; - changedRolls.push(`${attr}${newTestData.roll.terms[k * 2].results[0].result}/${newRoll.terms[ind * 2].results[0].result}`); - newTestData.roll.terms[k * 2].results[0].result = Math.min(newRoll.terms[ind * 2].results[0].result, newTestData.roll.terms[k * 2].results[0].result); + let val = newRoll.terms[ind * 2].results[0].result; + changedRolls.push(`${attr}${newTestData.roll.terms[k * 2].results[0].result}/${val}`); + val = Math.min(val, newTestData.roll.terms[k * 2].results[0].result); + changes.push({ index: k, val }); ind += 1; } + newTestData.roll.editRollAtIndex(changes); infoMsg += `${game.i18n.localize('Roll')}: ${changedRolls.join(', ')}`; ChatMessage.create(DSA5_Utility.chatDataSetup(infoMsg)); @@ -1888,17 +1893,21 @@ export default class Actordsa5 extends Actor { const phexTradition = game.i18n.localize('LocalizedIDs.traditionPhex'); const isPhex = actor.items.some((x) => x.type == 'specialability' && x.name == phexTradition); - //todo replace with roll.editrollatindex & istalented + newTestData.roll = Roll.fromData(newTestData.roll); + + const changes = []; for (let k of diesToReroll) { const characteristic = newTestData.source.system[`characteristic${k + 1}`]; const attr = characteristic ? `${game.i18n.localize(`CHARAbbrev.${characteristic.value.toUpperCase()}`)} - ` : ''; - changedRolls.push(`${attr}${newTestData.roll.terms[k * 2].results[0].result}/${newRoll.terms[ind * 2].results[0].result}`); - if (isPhex) newTestData.roll.terms[k * 2].results[0].result = Math.min(newRoll.terms[ind * 2].results[0].result, newTestData.roll.terms[k * 2].results[0].result); - else newTestData.roll.terms[k * 2].results[0].result = newRoll.terms[ind * 2].results[0].result; + let val = newRoll.terms[ind * 2].results[0].result; + changedRolls.push(`${attr}${newTestData.roll.terms[k * 2].results[0].result}/${val}`); + + if (isPhex) val = Math.min(val, newTestData.roll.terms[k * 2].results[0].result); + changes.push({ index: k, val }); ind += 1; } - + newTestData.roll.editRollAtIndex(changes); infoMsg += `
    ${game.i18n.localize('Roll')}: ${changedRolls.join(', ')}`; ChatMessage.create(DSA5_Utility.chatDataSetup(infoMsg)); newTestData.fateUsed = true; @@ -1971,7 +1980,8 @@ export default class Actordsa5 extends Actor { value: fws.join('|'), type: 'roll', }; - newTestData.roll.terms[diesToUpgrade * 2].results[0].result = Math.max(1, newTestData.roll.terms[diesToUpgrade * 2].results[0].result - 2); + newTestData.roll = Roll.fromData(newTestData.roll); + newTestData.roll.editRollAtIndex([{ index: diesToUpgrade, val: Math.max(1, newTestData.roll.terms[diesToUpgrade * 2].results[0].result - 2) }]); newTestData.situationalModifiers.push(modifier); this[`${data.postData.postFunction}`]({ testData: newTestData, cardOptions }, { rerenderMessage: message }); await message.update({ 'flags.data.fateImproved': true }); @@ -1993,7 +2003,8 @@ export default class Actordsa5 extends Actor { type: 'roll', }; newTestData.situationalModifiers.push(modifier); - newTestData.roll.terms[0].results[0].result = Math.max(1, newTestData.roll.terms[0].results[0].result - 2); + newTestData.roll = Roll.fromData(newTestData.roll); + newTestData.roll.editRollAtIndex([{ index: 0, val: Math.max(1, newTestData.roll.terms[0].results[0].result - 2) }]); this[`${data.postData.postFunction}`]({ testData: newTestData, cardOptions }, { rerenderMessage: message }); await message.update({ 'flags.data.fateImproved': true }); await this.reduceSchips(schipsource); @@ -2471,7 +2482,7 @@ export default class Actordsa5 extends Actor { if (item.system.guidevalue.value != '-') { let val = Math.max(...item.system.guidevalue.value.split('/').map((x) => Number(actorData.system.characteristics[x].value))); let extra = Math.max(val - Number(item.system.damageThreshold.value), 0) + gripDamageMod; - if (extra > 0) { + if (extra != 0) { item.extraDamage = extra; item.damageAdd = Roll.safeEval(item.damageAdd + ' + ' + Number(extra)); item.damageAdd = (item.damageAdd > 0 ? '+' : '') + item.damageAdd; diff --git a/modules/system/opposed-dsa5.js b/modules/system/opposed-dsa5.js index f70e636a..a7f3d298 100644 --- a/modules/system/opposed-dsa5.js +++ b/modules/system/opposed-dsa5.js @@ -465,8 +465,8 @@ export default class OpposedDsa5 { opposeResult.winner = 'attacker'; const title = [ - damage.armorMod != 0 ? `${damage.armorMod + ' ' + game.i18n.localize('Modifier')}` : '', - damage.armorMultiplier != 1 ? '*' + damage.armorMultiplier + ' ' + game.i18n.localize('Modifier') : '', + damage.armorMod != 0 ? `${damage.armorMod} ${game.i18n.localize('Modifier')}` : '', + damage.armorMultiplier != 1 ? `*${damage.armorMultiplier} ${game.i18n.localize('Modifier')}` : '', damage.spellArmor != 0 ? `${damage.spellArmor} ${game.i18n.localize('spellArmor')}` : '', damage.liturgyArmor != 0 ? `${damage.liturgyArmor} ${game.i18n.localize('liturgyArmor')}` : '', ].join(''); @@ -477,6 +477,10 @@ export default class OpposedDsa5 { description, value: damage.sum, sp: damage.damage, + armorMod: damage.armorMod, + armorMultiplier: damage.armorMultiplier, + spellArmor: damage.spellArmor, + liturgyArmor: damage.liturgyArmor, }; } else { opposeResult.winner = 'defender'; diff --git a/system.json b/system.json index 0ccd7acd..1e34426d 100644 --- a/system.json +++ b/system.json @@ -2,8 +2,8 @@ "id": "dsa5", "title": "Das Schwarze Auge/The Dark Eye (5th Edition)", "description": "The \"Das Schwarze Auge\" system for Foundry VTT. Includes all relevant mechanisms to play in the wonderous world of Aventuria and Das Schwarze Auge/The Dark Eye.", - "version": "6.1.3", - "download": "https://github.com/Plushtoast/dsa5-foundryVTT/releases/download/6.1.3/dsa5-foundryVTT-6.1.3.zip", + "version": "6.1.4", + "download": "https://github.com/Plushtoast/dsa5-foundryVTT/releases/download/6.1.4/dsa5-foundryVTT-6.1.4.zip", "authors": [ { "name": "Plushtoast"