var __defProp=Object.defineProperty;var __defNormalProp=(obj,key,value)=>key in obj?__defProp(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value;var __publicField=(obj,key,value)=>(__defNormalProp(obj,typeof key!="symbol"?key+"":key,value),value);var define_TEMPLATE_PATHS_default=["systems/blade-runner/templates/actor/actor-crit-chatcard.hbs","systems/blade-runner/templates/actor/actor-damage-chatcard.hbs","systems/blade-runner/templates/actor/actor-sheet-config.hbs","systems/blade-runner/templates/actor/character/character-limited-sheet.hbs","systems/blade-runner/templates/actor/character/character-sheet.hbs","systems/blade-runner/templates/actor/character/sheet-tabs/bio-tab.hbs","systems/blade-runner/templates/actor/character/sheet-tabs/combat-tab.hbs","systems/blade-runner/templates/actor/character/sheet-tabs/inventory-tab.hbs","systems/blade-runner/templates/actor/character/sheet-tabs/mods-tab.hbs","systems/blade-runner/templates/actor/character/sheet-tabs/stats-tab.hbs","systems/blade-runner/templates/actor/loot/loot-sheet.hbs","systems/blade-runner/templates/actor/inventory-partial.hbs","systems/blade-runner/templates/actor/vehicle/vehicle-seat-partial.hbs","systems/blade-runner/templates/actor/vehicle/vehicle-sheet.hbs","systems/blade-runner/templates/components/dialog/range-picker-dialog.hbs","systems/blade-runner/templates/components/dialog/table-draw-dialog.hbs","systems/blade-runner/templates/components/roll/roll-askdie-dialog.hbs","systems/blade-runner/templates/components/roll/roll-chatcard-infos-partial.hbs","systems/blade-runner/templates/components/roll/roll-chatcard-tooltip-partial.hbs","systems/blade-runner/templates/components/roll/roll-chatcard.hbs","systems/blade-runner/templates/components/roll/roll-push-select-dialog.hbs","systems/blade-runner/templates/components/roll/roller.hbs","systems/blade-runner/templates/item/actions-partial.hbs","systems/blade-runner/templates/item/active-effects-partial.hbs","systems/blade-runner/templates/item/attacks-partial.hbs","systems/blade-runner/templates/item/item-chatcard.hbs","systems/blade-runner/templates/item/item-sheet.hbs","systems/blade-runner/templates/item/modifiers-partial.hbs"];var SYSTEM_ID="blade-runner",DIE_SCORES={A:12,B:10,C:8,D:6},ATTRIBUTES={STRENGTH:"str",AGILITY:"agi",INTELLIGENCE:"int",EMPATHY:"emp",VEHICLE_MANEUVERABILITY:"mvr"},SKILLS={FORCE:"force",CLOSE_COMBAT:"closeCombat",STAMINA:"stamina",FIREARMS:"firearms",MOBILITY:"mobility",STEALTH:"stealth",MEDICAL_AID:"medicalAid",OBSERVATION:"observation",TECH:"tech",DRIVING:"driving",CONNECTIONS:"connections",INSIGHT:"insight",MANIPULATION:"manipulation"},CAPACITIES={HEALTH:"health",RESOLVE:"resolve"},NATURES={HUMAN:"human",REPLICANT:"replicant"},ARCHETYPES={ANALYST:"analyst",CITY_SPEAKER:"citySpeaker",DOXIE:"doxie",ENFORCER:"enforcer",FIXER:"fixer",INSPECTOR:"inspector",SKIMMER:"skimmer"},RANGES={ENGAGED:0,SHORT:1,MEDIUM:2,LONG:3,EXTREME:4},COMBAT_ACTIONS={SPRINT:"action-sprint",CRAWL:"action-crawl",UNARMED_ATTACK:"action-unarmed-attack",MELEE_ATTACK:"action-melee-attack",GRAPPLE:"action-grapple",BREAK_FREE:"action-break-free",SHOOT_FIREARM:"action-shoot-firearm",CAREFUL_AIM:"action-careful-aim",THROW_WEAPON:"action-throw-weapon",FIRST_AID:"action-first-aid",MANIPULATE:"action-manipulate",USE_ITEM:"action-use-item",VEHICLE_CRASH:"action-vehicle-crash",VEHICLE_MASSIVE_CRASH:"action-vehicle-massive-crash",VEHICLE_RAMMING:"action-vehicle-ramming",VEHICLE_REPAIR:"action-vehicle-repair",VEHICLE_SPEEDING:"action-vehicle-speeding",VEHICLE_EXPLODE:"action-vehicle-explode"},DAMAGE_TYPES={NONE:0,CRUSHING:1,PIERCING:2,STRESS:3},AVAILABILITIES={INCIDENTAL:5,STANDARD:4,PREMIUM:3,RARE:2,LUXURY:1},ACTOR_TYPES={CHAR:"character",VEHICLE:"vehicle",LOOT:"loot"},ACTOR_SUBTYPES={PC:"pc",NPC:"npc"},ITEM_TYPES={GENERIC:"generic",SYNTHETIC_AUGMENTATION:"upgrade",ARMOR:"armor",WEAPON:"weapon",EXPLOSIVE:"explosive",SPECIALTY:"specialty",CRITICAL_INJURY:"injury"},SETTINGS_KEYS={SYSTEM_MIGRATION_VERSION:"systemMigrationVersion",DISPLAYED_MESSAGES:"messages",AUTO_APPLY_DAMAGE:"autoApplyDamage",AUTO_ARMOR_ROLL:"autoArmorRoll",CRASH_TABLE:"crashTable",CRUSHING_TABLE:"crushingTable",DO_NOT_USE_HANDWRITTEN_FONT:"doNotUseHandwrittenFont",EDIT_NATURE_PERMISSION:"editNaturePermission",OPEN_FIRST_WEAPON_ATTACK:"openFirstWeaponAttack",PIERCING_TABLE:"piercingTable",UPDATE_ACTOR_MANEUVERABILITY_ON_CREW:"updateActorMvrOnCrew",UPDATE_ACTOR_MANEUVERABILITY_ON_UNCREW:"updateActorMvrOnUncrew",USE_ACTIVE_EFFECTS:"useActiveEffects"};var FLBR={};FLBR.systemMacroFolder="Blade Runner Macros";FLBR.scoreMap=new Map;FLBR.scoreMap.set("\u2013",0);for(let[k,v]of Object.entries(DIE_SCORES))FLBR.scoreMap.set(k,v);FLBR.dieMap=new Map(Array.from(FLBR.scoreMap,([n,v])=>[v,n]));FLBR.vehicleSkill=SKILLS.DRIVING;FLBR.vehicleAttribute=ATTRIBUTES.VEHICLE_MANEUVERABILITY;FLBR.attributes=Object.values(ATTRIBUTES).filter(a=>a!==FLBR.vehicleAttribute);FLBR.skillMap={[SKILLS.CLOSE_COMBAT]:ATTRIBUTES.STRENGTH,[SKILLS.FORCE]:ATTRIBUTES.STRENGTH,[SKILLS.STAMINA]:ATTRIBUTES.STRENGTH,[SKILLS.FIREARMS]:ATTRIBUTES.AGILITY,[SKILLS.MOBILITY]:ATTRIBUTES.AGILITY,[SKILLS.STEALTH]:ATTRIBUTES.AGILITY,[SKILLS.MEDICAL_AID]:ATTRIBUTES.INTELLIGENCE,[SKILLS.OBSERVATION]:ATTRIBUTES.INTELLIGENCE,[SKILLS.TECH]:ATTRIBUTES.INTELLIGENCE,[SKILLS.CONNECTIONS]:ATTRIBUTES.EMPATHY,[SKILLS.INSIGHT]:ATTRIBUTES.EMPATHY,[SKILLS.MANIPULATION]:ATTRIBUTES.EMPATHY,[SKILLS.DRIVING]:ATTRIBUTES.VEHICLE_MANEUVERABILITY};FLBR.skills=Object.keys(FLBR.skillMap);FLBR.archetypes={};for(let[k,v]of Object.entries(ARCHETYPES))FLBR.archetypes[v]=`FLBR.ARCHETYPE.${k}`;FLBR.capacitiesMap={[CAPACITIES.HEALTH]:{attributes:[ATTRIBUTES.STRENGTH,ATTRIBUTES.AGILITY],max:10},[CAPACITIES.RESOLVE]:{attributes:[ATTRIBUTES.INTELLIGENCE,ATTRIBUTES.EMPATHY],max:10}};FLBR.natures={[NATURES.HUMAN]:"FLBR.NATURE.Human",[NATURES.REPLICANT]:"FLBR.NATURE.Replicant"};FLBR.natureModifierMap={[NATURES.HUMAN]:{[CAPACITIES.HEALTH]:0,[CAPACITIES.RESOLVE]:0},[NATURES.REPLICANT]:{[CAPACITIES.HEALTH]:2,[CAPACITIES.RESOLVE]:-2}};FLBR.maxPushMap={[NATURES.HUMAN]:1,[NATURES.REPLICANT]:2};FLBR.pushTraumaMap={[NATURES.HUMAN]:{[ATTRIBUTES.STRENGTH]:CAPACITIES.HEALTH,[ATTRIBUTES.AGILITY]:CAPACITIES.HEALTH,[ATTRIBUTES.INTELLIGENCE]:CAPACITIES.RESOLVE,[ATTRIBUTES.EMPATHY]:CAPACITIES.RESOLVE},[NATURES.REPLICANT]:{[ATTRIBUTES.STRENGTH]:CAPACITIES.RESOLVE,[ATTRIBUTES.AGILITY]:CAPACITIES.RESOLVE,[ATTRIBUTES.INTELLIGENCE]:CAPACITIES.RESOLVE,[ATTRIBUTES.EMPATHY]:CAPACITIES.RESOLVE}};FLBR.characterSubtypes={[ACTOR_SUBTYPES.PC]:"ACTOR.SubtypePc",[ACTOR_SUBTYPES.NPC]:"ACTOR.SubtypeNpc"};FLBR.physicalItems=[ITEM_TYPES.GENERIC,ITEM_TYPES.WEAPON,ITEM_TYPES.ARMOR,ITEM_TYPES.EXPLOSIVE];FLBR.allowedItems={[ACTOR_TYPES.CHAR]:[ITEM_TYPES.SPECIALTY,ITEM_TYPES.SYNTHETIC_AUGMENTATION,ITEM_TYPES.CRITICAL_INJURY],[ACTOR_TYPES.VEHICLE]:[],[ACTOR_TYPES.LOOT]:[]};FLBR.ranges={[RANGES.ENGAGED]:"FLBR.WEAPON_RANGE.Engaged",[RANGES.SHORT]:"FLBR.WEAPON_RANGE.Short",[RANGES.MEDIUM]:"FLBR.WEAPON_RANGE.Medium",[RANGES.LONG]:"FLBR.WEAPON_RANGE.Long",[RANGES.EXTREME]:"FLBR.WEAPON_RANGE.Extreme"};FLBR.availabilities={[AVAILABILITIES.INCIDENTAL]:"FLBR.ITEM_AVAILABILITY.Incidental",[AVAILABILITIES.STANDARD]:"FLBR.ITEM_AVAILABILITY.Standard",[AVAILABILITIES.PREMIUM]:"FLBR.ITEM_AVAILABILITY.Premium",[AVAILABILITIES.RARE]:"FLBR.ITEM_AVAILABILITY.Rare",[AVAILABILITIES.LUXURY]:"FLBR.ITEM_AVAILABILITY.Luxury"};FLBR.damageTypes={[DAMAGE_TYPES.NONE]:"FLBR.WEAPON_DAMAGE_TYPE.None",[DAMAGE_TYPES.CRUSHING]:"FLBR.WEAPON_DAMAGE_TYPE.Crushing",[DAMAGE_TYPES.PIERCING]:"FLBR.WEAPON_DAMAGE_TYPE.Piercing",[DAMAGE_TYPES.STRESS]:"FLBR.WEAPON_DAMAGE_TYPE.Stress"};FLBR.blastPowerMap={12:{damage:4,crit:12},10:{damage:3,crit:10},8:{damage:2,crit:8},6:{damage:1,crit:6}};FLBR.startingAttributeLevel=8;FLBR.startingSkillLevel=6;FLBR.deathSaveTest=SKILLS.STAMINA;FLBR.baselineTest=SKILLS.INSIGHT;FLBR.maxPromotionPoints=20;FLBR.maxHumanityPoints=20;FLBR.maxChinyenPoints=20;FLBR.maxVehicleHull=10;FLBR.maxRolledDice=3;FLBR.itemSpecialInputMaxLength=80;FLBR.vehicleCrashDamage="1d3 + @altitude";FLBR.vehicleMassiveCrashDamage="1d6 + @altitude";FLBR.vehicleExplosionBlastPower=10;FLBR.rollModes={};for(let[k,v]of Object.entries(CONST.DICE_ROLL_MODES))FLBR.rollModes[v]=`CHAT.Roll${k.toLowerCase().capitalize()}`;FLBR.Actions=[{id:COMBAT_ACTIONS.SPRINT,label:"FLBR.COMBAT_ACTION.Sprint",hint:"FLBR.COMBAT_ACTION_HINT.Sprint",skill:SKILLS.MOBILITY,attribute:null,callback:null,actorType:ACTOR_TYPES.CHAR},{id:COMBAT_ACTIONS.CRAWL,label:"FLBR.COMBAT_ACTION.Crawl",hint:"FLBR.COMBAT_ACTION_HINT.Crawl",skill:null,callback:()=>ui.notifications.warn("Not implemented yet."),actorType:ACTOR_TYPES.CHAR},{id:COMBAT_ACTIONS.UNARMED_ATTACK,label:"FLBR.COMBAT_ACTION.UnarmedAttack",hint:"FLBR.COMBAT_ACTION_HINT.UnarmedAttack",skill:SKILLS.CLOSE_COMBAT,actorType:ACTOR_TYPES.CHAR},{id:COMBAT_ACTIONS.MELEE_ATTACK,label:"FLBR.COMBAT_ACTION.MeleeAttack",hint:"FLBR.COMBAT_ACTION_HINT.MeleeAttack",skill:SKILLS.CLOSE_COMBAT,actorType:ACTOR_TYPES.CHAR},{id:COMBAT_ACTIONS.GRAPPLE,label:"FLBR.COMBAT_ACTION.Grapple",hint:"FLBR.COMBAT_ACTION_HINT.Grapple",skill:SKILLS.CLOSE_COMBAT,actorType:ACTOR_TYPES.CHAR},{id:COMBAT_ACTIONS.BREAK_FREE,label:"FLBR.COMBAT_ACTION.BreakFree",hint:"FLBR.COMBAT_ACTION_HINT.BreakFree",skill:SKILLS.CLOSE_COMBAT,actorType:ACTOR_TYPES.CHAR},{id:COMBAT_ACTIONS.SHOOT_FIREARM,label:"FLBR.COMBAT_ACTION.ShootFirearm",hint:"FLBR.COMBAT_ACTION_HINT.ShootFirearm",skill:SKILLS.FIREARMS,actorType:ACTOR_TYPES.CHAR},{id:COMBAT_ACTIONS.CAREFUL_AIM,label:"FLBR.COMBAT_ACTION.CarefulAim",hint:"FLBR.COMBAT_ACTION_HINT.CarefulAim",callback:()=>ui.notifications.warn("Not implemented yet."),actorType:ACTOR_TYPES.CHAR},{id:COMBAT_ACTIONS.THROW_WEAPON,label:"FLBR.COMBAT_ACTION.ThrowWeapon",hint:"FLBR.COMBAT_ACTION_HINT.ThrowWeapon",skill:SKILLS.FIREARMS,actorType:ACTOR_TYPES.CHAR},{id:COMBAT_ACTIONS.FIRST_AID,label:"FLBR.COMBAT_ACTION.FirstAid",hint:"FLBR.COMBAT_ACTION_HINT.FirstAid",skill:SKILLS.MEDICAL_AID,actorType:ACTOR_TYPES.CHAR},{id:COMBAT_ACTIONS.MANIPULATE,label:"FLBR.COMBAT_ACTION.Manipulate",hint:"FLBR.COMBAT_ACTION_HINT.Manipulate",skill:SKILLS.MANIPULATION,actorType:ACTOR_TYPES.CHAR},{id:COMBAT_ACTIONS.USE_ITEM,label:"FLBR.COMBAT_ACTION.UseItem",hint:"FLBR.COMBAT_ACTION_HINT.UseItem",callback:()=>ui.notifications.warn("Not implemented yet."),actorType:ACTOR_TYPES.CHAR},{id:COMBAT_ACTIONS.VEHICLE_SPEEDING,label:"FLBR.VEHICLE.Action.Speeding",hint:"FLBR.VEHICLE.Action.SpeedingHint",skill:SKILLS.MOBILITY,actorType:ACTOR_TYPES.VEHICLE,onCrew:!0},{id:COMBAT_ACTIONS.VEHICLE_RAMMING,label:"FLBR.VEHICLE.Action.Ramming",hint:"FLBR.VEHICLE.Action.RammingHint",actorType:ACTOR_TYPES.VEHICLE,callback:actor=>actor.rollRamming()},{id:COMBAT_ACTIONS.VEHICLE_REPAIR,label:"FLBR.VEHICLE.Action.Repair",hint:"FLBR.VEHICLE.Action.RepairHint",skill:SKILLS.TECH,actorType:ACTOR_TYPES.VEHICLE,onCrew:!0},{id:COMBAT_ACTIONS.VEHICLE_CRASH,label:"FLBR.VEHICLE.Action.Crash",hint:"FLBR.VEHICLE.Action.CrashHint",actorType:ACTOR_TYPES.VEHICLE,callback:actor=>actor.crashVehicle()},{id:COMBAT_ACTIONS.VEHICLE_MASSIVE_CRASH,label:"FLBR.VEHICLE.Action.MassiveCrash",hint:"FLBR.VEHICLE.Action.CrashHint",actorType:ACTOR_TYPES.VEHICLE,callback:actor=>actor.crashVehicle(!0)},{id:COMBAT_ACTIONS.VEHICLE_EXPLODE,label:"FLBR.VEHICLE.Action.Explode",hint:"FLBR.VEHICLE.Action.ExplodeHint",actorType:ACTOR_TYPES.VEHICLE,callback:actor=>actor.explodeVehicle()}];FLBR.Icons={tabs:{action:'',bio:'',combat:'',features:'',inventory:'',mods:'',roll:'',stats:''},boxes:{empty:'',full:'',lost:''},dice:{success:'',failure:''},links:{choice:'',rolltable:'',drawtable:''},buttons:{action:'',edit:'',delete:'',remove:'',plus:'',minus:'',advantage:'',disadvantage:'',mount:'',unmount:'',attack:'',armor:'',bomb:'',melee:'',gun:'',crit:'',crush:'',pierce:'',stress:'',range:'',damage:'',lethal:'',vehicle:'',wheel:'',seat:'',chat:'',roll:'',onoff:''}};FLBR.customItemTypesTemplates={};var ActorAction=class{constructor(actionData){if(!actionData.id)throw new SyntaxError("Missing ID for actor action");this.id=actionData.id,this.actorType=actionData.actorType,this._label=actionData.label,this._hint=actionData.hint,this.attribute=actionData.attribute,this.skill=actionData.skill,this.onCrew=actionData.onCrew,this.callback=actionData.callback}get label(){return game.i18n.localize(this._label)}get hint(){return game.i18n.localize(this._hint)}async execute(actor){if(typeof this.callback=="function")return this.callback(actor);let attribute=this.attribute||FLBR.skillMap[this.skill],title=`${actor.name}: ${this.label} (${game.i18n.localize(`FLBR.SKILL.${this.skill.capitalize()}`)})`;return actor.rollStat(attribute,this.skill,{title})}toObject(){return{id:this.id,actorType:this.actorType,label:this._label,hint:this._hint,attribute:this.attribute,skill:this.skill,onCrew:this.onCrew,callback:this.callback}}},ActionCollection=class extends foundry.utils.Collection{constructor(entries){super(entries.map(([id,data])=>data instanceof ActorAction?[id,data]:[id,new ActorAction(data)]))}add(actionData){return actionData instanceof ActorAction?this.set(actionData.id,actionData):this.set(actionData.id,new ActorAction(actionData))}};var YearZeroDie=class extends foundry.dice.terms.Die{constructor(termData={}){termData.faces=Number.isInteger(termData.faces)?termData.faces:6,super(termData),this.maxPush==null&&(this.maxPush=termData.maxPush??1)}get denomination(){return this.constructor.DENOMINATION}get type(){return this.constructor.TYPE}get pushable(){if(this.pushCount>=this.maxPush)return!1;for(let r of this.results)if(!(!r.active||r.discarded)&&!this.constructor.LOCKED_VALUES.includes(r.result))return!0;return!1}get pushCount(){return this.results.reduce((c,r)=>Math.max(c,r.indexPush||0),0)}get pushed(){return this.pushCount>0}get isYearZeroDie(){return!0}get success(){if(!this._evaluated)return;let s=this.results.reduce((tot,r)=>r.active?r.count!==void 0?tot+r.count:this.constructor.SUCCESS_TABLE?tot+this.constructor.SUCCESS_TABLE[r.result]:tot+(r.result>=6?1:0):tot,0);return this.type==="neg"?-s:s}get failure(){if(this._evaluated)return this.results.reduce((tot,r)=>r.active?tot+(r.result<=1):tot,0)}async roll(options={}){let roll=await super.roll(options);return roll.indexResult=options.indexResult,roll.indexResult==null&&(roll.indexResult=1+this.results.reduce((c,r)=>{let i=r.indexResult;return i==null&&(i=-1),Math.max(c,i)},-1)),roll.indexPush=options.indexPush??this.pushCount,this.results[this.results.length-1]=roll,roll}count(n){return this.values.filter(v=>v===n).length}push(){if(!this.pushable)return this;let indexPush=this.pushCount+1,indexesResult=[];for(let r of this.results)!r.active||r.locked||(this.constructor.LOCKED_VALUES.includes(r.result)?r.hidden=!0:(r.active=!1,r.discarded=!0,r.pushed=!0,r.hidden=!0,indexesResult.push(r.indexResult)));for(let i=0;i=6,isMin=result.result===1&&!noMin.includes(this.type)}else isMax=result.result===this.faces,isMin=result.result===1;return[this.constructor.name.toLowerCase(),"d"+this.faces,hasSuccess?"success":null,hasFailure?"failure":null,result.rerolled?"rerolled":null,result.exploded?"exploded":null,result.discarded?"discarded":null,result.pushed?"pushed":null,!(hasSuccess||hasFailure)&&isMin?"min":null,!(hasSuccess||hasFailure)&&isMax?"max":null]}getTooltipData(){return{formula:this.expression,total:this.success,banes:this.failure,faces:this.faces,number:this.number,type:this.type,isYearZeroDie:this.isYearZeroDie,flavor:this.options.flavor??(CONFIG.YZUR?.Dice?.localizeDieTerms?game.i18n.localize(`YZUR.DIETERMS.${this.constructor.name}`):null),rolls:this.results.map(r=>({result:this.getResultLabel(r),classes:this.getResultCSS(r).filterJoin(" "),row:r.indexPush,col:r.indexResult}))}}};YearZeroDie.TYPE="blank";YearZeroDie.LOCKED_VALUES=[6];YearZeroDie.SERIALIZE_ATTRIBUTES.push("maxPush");YearZeroDie.MODIFIERS=foundry.utils.mergeObject({p:"setpush",np:"nopush"},foundry.dice.terms.Die.MODIFIERS);var BaseDie=class extends YearZeroDie{};BaseDie.TYPE="base";BaseDie.DENOMINATION="b";BaseDie.LOCKED_VALUES=[1,6];var SkillDie=class extends YearZeroDie{};SkillDie.TYPE="skill";SkillDie.DENOMINATION="s";var GearDie=class extends YearZeroDie{};GearDie.TYPE="gear";GearDie.DENOMINATION="g";GearDie.LOCKED_VALUES=[1,6];var NegativeDie=class extends SkillDie{};NegativeDie.TYPE="neg";NegativeDie.DENOMINATION="n";var StressDie=class extends YearZeroDie{};StressDie.TYPE="stress";StressDie.DENOMINATION="z";StressDie.LOCKED_VALUES=[1,6];var ArtifactDie=class extends SkillDie{getResultLabel(result){return CONFIG.YZUR.Icons.getLabel(`d${this.constructor.DENOMINATION}`,result.result)}};ArtifactDie.TYPE="arto";ArtifactDie.SUCCESS_TABLE=[null,0,0,0,0,0,1,1,2,2,3,3,4];ArtifactDie.LOCKED_VALUES=[6,7,8,9,10,11,12];var D8ArtifactDie=class extends ArtifactDie{constructor(termData={}){termData.faces=8,super(termData)}};D8ArtifactDie.DENOMINATION="8";var D10ArtifactDie=class extends ArtifactDie{constructor(termData={}){termData.faces=10,super(termData)}};D10ArtifactDie.DENOMINATION="10";var D12ArtifactDie=class extends ArtifactDie{constructor(termData={}){termData.faces=12,super(termData)}};D12ArtifactDie.DENOMINATION="12";var TwilightDie=class extends ArtifactDie{getResultLabel(result){return CONFIG.YZUR.Icons.getLabel("base",result.result)}};TwilightDie.TYPE="base";TwilightDie.SUCCESS_TABLE=[null,0,0,0,0,0,1,1,1,1,2,2,2];TwilightDie.LOCKED_VALUES=[1,6,7,8,9,10,11,12];var D6TwilightDie=class extends TwilightDie{constructor(termData={}){termData.faces=6,super(termData)}};D6TwilightDie.DENOMINATION="6";var D8TwilightDie=class extends TwilightDie{constructor(termData={}){termData.faces=8,super(termData)}};D8TwilightDie.DENOMINATION="8";var D10TwilightDie=class extends TwilightDie{constructor(termData={}){termData.faces=10,super(termData)}};D10TwilightDie.DENOMINATION="10";var D12TwilightDie=class extends TwilightDie{constructor(termData={}){termData.faces=12,super(termData)}};D12TwilightDie.DENOMINATION="12";var AmmoDie=class extends YearZeroDie{constructor(termData={}){termData.faces=6,super(termData)}};AmmoDie.TYPE="ammo";AmmoDie.DENOMINATION="m";AmmoDie.LOCKED_VALUES=[1,6];var LocationDie=class extends YearZeroDie{constructor(termData={}){termData.faces=6,super(termData)}get pushable(){return!1}roll(options){let roll=super.roll(options);return roll.count=0,this.results[this.results.length-1]=roll,roll}};LocationDie.TYPE="loc";LocationDie.DENOMINATION="l";LocationDie.SUCCESS_TABLE=[null,0,0,0,0,0,0];LocationDie.LOCKED_VALUES=[1,2,3,4,5,6];var BladeRunnerDie=class extends ArtifactDie{getResultLabel(result){return CONFIG.YZUR.Icons.getLabel("base",result.result)}};BladeRunnerDie.TYPE="base";BladeRunnerDie.SUCCESS_TABLE=[null,0,0,0,0,0,1,1,1,1,2,2,2];BladeRunnerDie.LOCKED_VALUES=[1];var D6BladeRunnerDie=class extends BladeRunnerDie{constructor(termData={}){termData.faces=6,super(termData)}};D6BladeRunnerDie.DENOMINATION="6";D6BladeRunnerDie.LOCKED_VALUES=[1,6];var D8BladeRunnerDie=class extends BladeRunnerDie{constructor(termData={}){termData.faces=8,super(termData)}};D8BladeRunnerDie.DENOMINATION="8";D8BladeRunnerDie.LOCKED_VALUES=[1,6,7,8];var D10BladeRunnerDie=class extends BladeRunnerDie{constructor(termData={}){termData.faces=10,super(termData)}};D10BladeRunnerDie.DENOMINATION="10";D10BladeRunnerDie.LOCKED_VALUES=[1,10];var D12BladeRunnerDie=class extends BladeRunnerDie{constructor(termData={}){termData.faces=12,super(termData)}};D12BladeRunnerDie.DENOMINATION="12";D12BladeRunnerDie.LOCKED_VALUES=[1,10,11,12];var YZUR={game:"",Chat:{showInfos:!0,diceSorting:["base","skill","neg","gear","arto","loc","ammo"]},Roll:{chatTemplate:"templates/dice/roll.html",tooltipTemplate:"templates/dice/tooltip.html",infosTemplate:"templates/dice/infos.hbs"},Dice:{localizeDieTerms:!0,DIE_TYPES:["base","skill","neg","gear","stress","arto","ammo","loc"],DIE_TERMS:{base:BaseDie,skill:SkillDie,neg:NegativeDie,gear:GearDie,stress:StressDie,artoD8:D8ArtifactDie,artoD10:D10ArtifactDie,artoD12:D12ArtifactDie,a:D12TwilightDie,b:D10TwilightDie,c:D8TwilightDie,d:D6TwilightDie,ammo:AmmoDie,loc:LocationDie,brD12:D12BladeRunnerDie,brD10:D10BladeRunnerDie,brD8:D8BladeRunnerDie,brD6:D6BladeRunnerDie}},Icons:{getLabel:function(type,result){return["d8","d10","d12"].includes(type)&&(type="arto"),String(CONFIG.YZUR.Icons[CONFIG.YZUR.game][type][result])},myz:{base:{1:"\u2623",2:2,3:3,4:4,5:5,6:"\u2622"},skill:{1:1,2:2,3:3,4:4,5:5,6:"\u2622"},neg:{1:1,2:2,3:3,4:4,5:5,6:"\u2796"},gear:{1:"\u{1F4A5}",2:2,3:3,4:4,5:5,6:"\u2622"}},fbl:{base:{1:"\u2620",2:2,3:3,4:4,5:5,6:"\u2694\uFE0F"},skill:{1:1,2:2,3:3,4:4,5:5,6:"\u2694\uFE0F"},neg:{1:1,2:2,3:3,4:4,5:5,6:"\u2796"},gear:{1:"\u{1F4A5}",2:2,3:3,4:4,5:5,6:"\u2694\uFE0F"},arto:{1:1,2:2,3:3,4:4,5:5,6:6,7:7,8:8,9:9,10:10,11:11,12:12}},alien:{skill:{1:1,2:2,3:3,4:4,5:5,6:"\u{1F4A0}"},stress:{1:"\u{1F631}",2:2,3:3,4:4,5:5,6:"\u{1F4A0}"}},tales:{skill:{1:1,2:2,3:3,4:4,5:5,6:"\u269B\uFE0F"}},cor:{skill:{1:1,2:2,3:3,4:4,5:5,6:"\u{1F41E}"}},vae:{skill:{1:1,2:2,3:3,4:4,5:5,6:"\u{1F98B}"}},t2k:{base:{1:"\u{1F4A5}",2:2,3:3,4:4,5:5,6:6,7:7,8:8,9:9,10:10,11:11,12:12},ammo:{1:"\u{1F4A5}",2:2,3:3,4:4,5:5,6:"\u{1F3AF}"},loc:{1:"L",2:"T",3:"T",4:"T",5:"A",6:"H"}},br:{base:{1:"\u{1F984}",2:2,3:3,4:4,5:5,6:6,7:7,8:8,9:9,10:10,11:11,12:12}}}},GameTypeError=class extends TypeError{constructor(msg){super(`Unknown game: "${msg}". Allowed games are: ${YearZeroRollManager.GAMES.join(", ")}.`),this.name="YZUR | GameType Error"}},DieTermError=class extends TypeError{constructor(msg){super(`Unknown die term: "${msg}". Allowed terms are: ${Object.keys(CONFIG.YZUR.Dice.DIE_TERMS).join(", ")}.`),this.name="YZUR | DieTerm Error"}},YearZeroRoll=class extends Roll{constructor(formula,data={},options={}){options.name==null&&(options.name=data.name),options.game==null&&(options.game=data.game),options.maxPush==null&&(options.maxPush=data.maxPush),super(formula,data,options),this.game||(this.game=CONFIG.YZUR.game??"myz"),options.maxPush!=null&&(this.maxPush=options.maxPush)}get game(){return this.options.game}set game(yzGame){this.options.game=yzGame}get name(){return this.options.name}set name(str){this.options.name=str}set maxPush(n){this.options.maxPush=n;for(let t of this.terms)t instanceof YearZeroDie&&(t.maxPush=n)}get maxPush(){return this.terms.reduce((max,t)=>t instanceof YearZeroDie?Math.max(max,t.maxPush):max,null)}get size(){return this.terms.reduce((s,t)=>t instanceof YearZeroDie?s+t.number:s,0)}get pushCount(){return this.terms.reduce((c,t)=>Math.max(c,t.pushCount||0),0)}get pushed(){return this.pushCount>0}get pushable(){return this.pushCountt.pushable)}get successCount(){return this.terms.reduce((sc,t)=>sc+(t.success??0),0)}get baneCount(){let banableTypes=["base","gear","stress","ammo"],count=0;for(let bt of banableTypes)count+=this.count(bt,1);return count}get attributeTrauma(){return this.count("base",1)}get gearDamage(){return this.count("gear",1)}get stress(){return this.count("stress")}get panic(){return this.count("stress",1)}get mishap(){return!1}get ammoSpent(){let mt=this.getTerms("ammo");return mt.length?mt.reduce((tot,t)=>tot+t.values.reduce((a,b)=>a+b,0),0):0}get hitCount(){return this.count("ammo",6)}get jamCount(){let n=this.count("ammo",1);return n>0?n+this.attributeTrauma:0}get jammed(){return this.pushed?this.jamCount>=2:!1}get baseSuccessQty(){return this.successCount-this.hitCount}get hitLocations(){let lt=this.getTerms("loc");return lt.length?lt.reduce((tot,t)=>tot.concat(t.values),[]):[]}get bestHitLocation(){if(this.hitLocations.length)return Math.max(...this.hitLocations)}static create(formula,data={},options={}){return new YearZeroRoll(formula,data,options)}static forge(dice=[],{title,yzGame=null,maxPush=1}={},options={}){if(yzGame=yzGame??options.game??CONFIG.YZUR?.game,!YearZeroRollManager.GAMES.includes(yzGame))throw new GameTypeError(yzGame);if(!Array.isArray(dice)&&typeof dice=="object"&&!Object.keys(dice).includes("term")){let _dice=[];for(let[term,n]of Object.entries(dice)){if(n<=0)continue;let deno=CONFIG.YZUR.Dice.DIE_TERMS[term].DENOMINATION;deno=CONFIG.Dice.terms[deno].DENOMINATION,_dice.push({term:deno,number:n})}dice=_dice}Array.isArray(dice)||(dice=[dice]);let out=[];for(let d of dice)out.push(YearZeroRoll._getTermFormulaFromBlok(d));let formula=out.join(" + ");YearZeroRoll.validate(formula)||(formula=yzGame==="t2k"?"1d6":"1ds"),options.name==null&&(options.name=title),options.game==null&&(options.game=yzGame),options.maxPush==null&&(options.maxPush=maxPush);let roll=YearZeroRoll.create(formula,{},options);return CONFIG.debug.dice,roll}static createFromDiceQuantities(dice={},{title,yzGame=null,maxPush=1,push=!1}={}){return YearZeroRoll.forge(dice,{title,yzGame,maxPush})}static _getTermFormulaFromBlok(termBlok){let{term,number,flavor,maxPush}=termBlok;return YearZeroRoll.generateTermFormula(number,term,flavor,maxPush)}static generateTermFormula(number,term,flavor="",maxPush=null){let f=`${number}d${term}`;return typeof maxPush=="number"&&(f+=`p${maxPush}`),flavor&&(f+=`[${flavor}]`),f}getTerms(search){return typeof search=="string"?this.terms.filter(t=>t.type===search):this.terms.filter(t=>{let f=!0;if(search.type!=null&&(f=f&&search.type===t.type),search.number!=null&&(f=f&&search.number===t.number),search.faces!=null&&(f=f&&search.faces===t.faces),search.options)for(let key in search.options)f=f&&search.options[key]===t.options[key];if(search.results)for(let key in search.results)f=f&&t.results.some(r=>r[key]===search.results[key]);return f})}count(type,seed=null,comparison="="){return this.terms.reduce((c,t)=>{if(t.type===type)if(t.results.length)for(let r of t.results)r.active&&(seed!=null?comparison===">"?r.result>seed&&c++:comparison===">="?r.result>=seed&&c++:comparison==="<"?r.result0;qty--)term.number++,this._evaluated&&(term.roll(),value!=null&&(term.results[term.results.length-1].result=value));else{let cls=CONFIG.YZUR.Dice.DIE_TERMS[type];term=new cls({number:qty,faces:range2,maxPush:this.maxPush??1,options}),this._evaluated&&(await term.evaluate(),value!=null&&term.results.forEach(r=>r.result=value)),this.terms.length>0&&this.terms.push(new OperatorTerm({operator:type==="neg"?"-":"+"})),this.terms.push(term)}return this._formula=this.constructor.getFormula(this.terms),this._evaluated&&(this._total=this._evaluateTotal()),this}removeDice(qty,search,{discard=!1,disable=!1}={}){if(!qty)return this;for(;qty>0;qty--){let term=this.getTerms(search)[0];if(term){if(term.number--,term.number<=0){let type=search.type??search,index=this.terms.findIndex(t=>t.type===type&&t.number===0);this.terms.splice(index,1),this.terms[index-1]?.operator&&this.terms.splice(index-1,1)}else if(this._evaluated){let index=term.results.findIndex(r=>r.active);if(index<0)break;discard||disable?(discard&&(term.results[index].discarded=discard),disable&&(term.results[index].active=!disable)):term.results.splice(index,1)}}else break}let terms=this.terms;return terms[0]instanceof OperatorTerm&&terms.shift(),this._formula=this.constructor.getFormula(this.terms),this._evaluated&&(this.terms.length?this._total=this._evaluateTotal():this._total=0),this}async push(){return this._evaluated||await this.evaluate(),this.pushable?(this.terms.forEach(t=>t instanceof YearZeroDie?t.push():t),this._evaluated=!1,await this.evaluate(),this):this}async modify(mod=0){if(mod)if(this.game==="t2k"||this.game==="br"){let diceMap=[null,6,8,10,12,1/0],typesMap=["d","d","c","b","a","a"],refactorRange=(range2,n)=>diceMap[diceMap.indexOf(range2)+n],getTypeFromRange=range2=>typesMap[diceMap.indexOf(range2)],_terms=this.getTerms("base"),dice=_terms.flatMap(t=>new Array(t.number).fill(t.faces));if(this.game==="br"){let lowest=Math.min(...dice);if(mod>0)dice.push(lowest);else if(mod<0){let i=dice.indexOf(lowest);dice.splice(i,1)}mod=0}else for(;mod!==0;){let i;if(mod>0?(dice.length<2?(i=1,dice.push(diceMap[1])):(i=dice.indexOf(Math.min(...dice)),dice[i]=refactorRange(dice[i],1)),mod--):(i=dice.indexOf(Math.max(...dice)),dice[i]=refactorRange(dice[i],-1),mod++),dice[i]===1/0)dice[i]=refactorRange(dice[i],-1);else if(dice[i]===null)dice.length>1?dice.splice(i,1):dice[i]=refactorRange(dice[i],1);else if(dice[i]===void 0)throw new Error(`YZUR | YearZeroRoll#modify | dice[${i}] is out of bounds (mod: ${mod})`)}this.removeDice(100,"base");let skilled=_terms.length>1&&dice.length>1;for(let index=0;index0&&this.count("neg")>0;)this.removeDice(1,"skill"),this.removeDice(1,"neg")}else{let skill=this.count("skill");mod<0&&(mod=Math.max(-skill+1,mod)),await this.addDice(mod,"skill")}else return this;if(this._evaluated)for(let t of this.terms)t._evaluated||await t.evaluate();return this}async getTooltip(){let parts=this.dice.map(d=>d.getTooltipData()).sort((a,b)=>{let sorts=CONFIG?.YZUR?.Chat?.diceSorting||YZUR.Chat.diceSorting||[];if(!sorts.length)return 0;let at=sorts.indexOf(a.type),bt=sorts.indexOf(b.type);return at-bt});if(this.pushed)for(let part of parts){let matrix=[],n=part.number,p=this.pushCount;for(;p>=0;p--)matrix[p]=new Array(n).fill(void 0);for(let r of part.rolls){let row=r.row||0,col=r.col||0;matrix[row][col]=r}part.rolls=matrix}return foundry.applications.handlebars.renderTemplate(this.constructor.TOOLTIP_TEMPLATE,{parts,pushed:this.pushed,pushCounts:this.pushed?[...Array(this.pushCount+1).keys()].sort((a,b)=>b-a):void 0,config:CONFIG.YZUR??{},options:this.options})}async getRollInfos(template=null){template=template??CONFIG.YZUR?.Roll?.infosTemplate;let context={roll:this};return foundry.applications.handlebars.renderTemplate(template,context)}async render(chatOptions={}){CONFIG.debug.dice,chatOptions=foundry.utils.mergeObject({user:game.user.id,flavor:this.name,template:this.constructor.CHAT_TEMPLATE,blind:!1},chatOptions);let isPrivate=chatOptions.isPrivate;this._evaluated||await this.evaluate();let chatData={formula:isPrivate?"???":this._formula,flavor:isPrivate?null:chatOptions.flavor,user:chatOptions.user,tooltip:isPrivate?"":await this.getTooltip(),total:isPrivate?"?":Math.round(this.total*100)/100,success:isPrivate?"?":this.successCount,showInfos:isPrivate?!1:CONFIG.YZUR?.Chat?.showInfos,infos:isPrivate?null:await this.getRollInfos(chatOptions.infosTemplate),pushable:isPrivate?!1:this.pushable,options:chatOptions,isPrivate,roll:this};return foundry.applications.handlebars.renderTemplate(chatOptions.template,chatData)}async toMessage(messageData={},{rollMode=null,create=!0}={}){return messageData=foundry.utils.mergeObject({user:game.user.id,speaker:ChatMessage.getSpeaker(),content:this.total},messageData),await super.toMessage(messageData,{rollMode,create})}duplicate(){return this.constructor.fromData(this.toJSON())}},YearZeroRollManager=class{constructor(){throw new SyntaxError(`YZUR | ${this.constructor.name} cannot be instanciated!`)}static register(yzGame,config,options={}){YearZeroRollManager._overrideDiceTermFromData(),YearZeroRollManager.registerConfig(config),YearZeroRollManager._initialize(yzGame),YearZeroRollManager.registerDice(yzGame,options?.index)}static registerConfig(config){CONFIG.YZUR=foundry.utils.mergeObject(YZUR,config)}static registerDice(yzGame,i){if(!yzGame||typeof yzGame!="string")throw new SyntaxError("YZUR | A game must be specified for the registration.");YearZeroRollManager.GAMES.includes(yzGame)||YearZeroRollManager.DIE_TERMS_MAP[yzGame]||(YearZeroRollManager.DIE_TERMS_MAP[yzGame]=[]);let diceTypes=YearZeroRollManager.DIE_TERMS_MAP[yzGame];for(let type of diceTypes)YearZeroRollManager.registerDie(type);YearZeroRollManager.registerRoll(void 0,i)}static registerRoll(cls=YearZeroRoll,i=0){CONFIG.Dice.rolls[i]=cls,CONFIG.Dice.rolls[i].CHAT_TEMPLATE=CONFIG.YZUR.Roll.chatTemplate,CONFIG.Dice.rolls[i].TOOLTIP_TEMPLATE=CONFIG.YZUR.Roll.tooltipTemplate,CONFIG.YZUR.Roll.index=i,i>0&&YearZeroRollManager._overrideRollCreate(i)}static registerDie(term){let cls=CONFIG.YZUR.Dice.DIE_TERMS[term];if(!cls)throw new DieTermError(term);let deno=cls.DENOMINATION;if(!deno)throw new SyntaxError(`YZUR | Undefined DENOMINATION for "${cls.name}".`);let reg=CONFIG.Dice.terms[deno];CONFIG.Dice.terms[deno]=cls}static registerCustomDie(term,data){if(!YearZeroRollManager.GAMES.includes(CONFIG.YZUR.game))throw new GameTypeError("YZUR | Unregistered game. Please register a game before registering a custom die.");let cls=YearZeroRollManager.createDieClass(data);CONFIG.YZUR.Dice.DIE_TERMS[term],CONFIG.YZUR.Dice.DIE_TERMS[term]=cls,YearZeroRollManager.DIE_TERMS_MAP[CONFIG.YZUR.game].push(term),YearZeroRollManager.registerDie(term)}static _initialize(yzGame){if(!CONFIG.YZUR)throw new ReferenceError("YZUR | CONFIG.YZUR does not exists!");CONFIG.YZUR.game,CONFIG.YZUR.game=yzGame}static _overrideDiceTermFromData(){foundry.dice.terms.DiceTerm.prototype.constructor.fromData=function(data){let cls=CONFIG.Dice.termTypes[data.class];if(!cls){let termkeys=Object.keys(CONFIG.Dice.terms),stringifiedFaces=String(data.faces);data.class==="Die"&&termkeys.includes(stringifiedFaces)?(cls=CONFIG.Dice.terms[stringifiedFaces],data.class=cls.name):cls=Object.values(CONFIG.Dice.terms).find(c=>c.name===data.class)||foundry.dice.terms.Die}return cls._fromData(data)}}static _overrideRollCreate(index=1){Roll.prototype.constructor.create=function(formula,data={},options={}){let n=options.yzur??("game"in data||"maxPush"in data||"game"in options||"maxPush"in options||formula.match(/\d*d(:?[bsngzml]|6|8|10|12)/i))?index:0,cls=CONFIG.Dice.rolls[n];return new cls(formula,data,options)}}static createDieClass(data){if(!data||typeof data!="object")throw new SyntaxError("YZUR | To create a Die class, you must pass a DieClassData object!");let{name,denomination:deno,faces,type,lockedValues}=data;if(typeof faces!="number"||faces<=0)throw new DieTermError(`YZUR | Invalid die class faces "${faces}"`);let YearZeroCustomDie=class extends YearZeroDie{constructor(termData={}){termData.faces=faces,super(termData)}};if(!name|typeof name!="string")throw new DieTermError(`YZUR | Invalid die class name "${name}"`);if(Object.defineProperty(YearZeroCustomDie,"name",{value:name}),!deno||typeof deno!="string")throw new DieTermError(`YZUR | Invalid die class denomination "${deno}"`);if(YearZeroCustomDie.DENOMINATION=deno,type!=null){if(typeof type!="string")throw new DieTermError(`YZUR | Invalid die class type "${type}"`);CONFIG.YZUR.Dice.DIE_TYPES.includes(type),CONFIG.YZUR.Icons[CONFIG.YZUR.game][type],YearZeroCustomDie.TYPE=type}if(lockedValues!=null){if(!Array.isArray(lockedValues))throw new DieTermError(`YZUR | Invalid die class locked values "${lockedValues}" (Not an Array)`);for(let[i,v]of lockedValues.entries())if(typeof v!="number")throw new DieTermError(`YZUR | Invalid die class locked value "${v}" at [${i}] (Not a Number)`);YearZeroCustomDie.LOCKED_VALUES=lockedValues}return YearZeroCustomDie}};YearZeroRollManager.DIE_TERMS_MAP={myz:["base","skill","gear","neg"],fbl:["base","skill","gear","neg","artoD8","artoD10","artoD12"],alien:["skill","stress"],tales:["skill"],cor:["skill"],vae:["skill"],t2k:["a","b","c","d","ammo","loc"],br:["brD12","brD10","brD8","brD6"]};YearZeroRollManager.GAMES;Object.defineProperty(YearZeroRollManager,"GAMES",{get:()=>Object.keys(YearZeroRollManager.DIE_TERMS_MAP)});async function getActiveActor(){let actor;if(game.user.isGM&&canvas.ready&&canvas.tokens.controlled.length>1)return chooseActor(canvas.tokens.controlled.map(t=>t.actor),{title:game.i18n.localize("FLBR.MACRO.GetActorTitle"),notes:game.i18n.localize("FLBR.MACRO.GetActorHint")});let speaker=ChatMessage.getSpeaker();if(speaker.token&&(actor=game.actors.tokens[speaker.token]),actor||(actor=game.actors.get(speaker.actor)),!actor){ui.notifications.warn(game.i18n.format("FLBR.MACRO.NoActor",{actor:speaker.alias}));return}return actor}async function chooseActor(actors=[],options={}){if(!actors.length)return;if(actors.length===1)return actors[0];let content='
",options.notes&&(content+=`

${options.notes}

`),content+="
";let actorId=await Dialog.prompt({title:options.title??"Choose an Actor",content,label:game.i18n.localize("FLBR.OK"),callback:html=>html[0].querySelector("form").actor.value,rejectClose:!1,options:{width:400,classes:["blade-runner","dialog"],minimizable:!1}});return actors.find(a=>a.id===actorId)}var BRRollHandler=class extends FormApplication{roll={};messageId;constructor({title="Blade Runner RPG",actor={},items=[],attributeKey=null,skillKey=null,dice=[6],modifier=0,modifiers=[],maxPush=1},options={}){super({},options),this.title=title,this.actor=actor,this.items=Array.isArray(items)?items:[items],this.item=this.items[0],this.attributeKey=attributeKey,this.skillKey=skillKey,this.modifiers=Array.isArray(modifiers)?modifiers:[modifiers],this.items.length>0&&this.modifiers.push(...this.items.flatMap(i=>i.getModifiers({targets:[attributeKey,skillKey]}))),this._modifier=modifier,this.dice=Array.isArray(dice)?dice:[dice],this.dice=this.dice.filter(d=>d>0),this.maxPush=maxPush??1,this.damage=options.damage??this.item?.attacks?.[0]?.damage,this.damageType=options.damageType??this.item?.attacks?.[0]?.damageType,this.crit=options.crit??this.item?.attacks?.[0]?.crit,this.options.sendMessage=options.sendMessage??!0,this.options.unlimitedPush=!!options.unlimitedPush,this.options.disabledPush=!!options.disabledPush}get title(){return this.options.title}set title(str){this.options.title=str}get modifier(){return this._modifier+this.modifiers.reduce((sum,m)=>sum+(m.active?m.value:0),0)}set modifier(val){this._modifier=val}get advantage(){return this.dice.length>2||this.modifier>0}get disadvantage(){return this.dice.length<2||this.modifier<0}get isAttack(){return!!this.damage||[ITEM_TYPES.WEAPON,ITEM_TYPES.EXPLOSIVE].includes(this.item?.type)}get message(){return game.messages.get(this.messageId)}static get defaultOptions(){let sysId=game.system.id||SYSTEM_ID;return foundry.utils.mergeObject(super.defaultOptions,{classes:[sysId,"roll-application"],width:"450",resizable:!1})}get template(){let sysId=game.system.id||SYSTEM_ID;return this.options.template||`systems/${sysId}/templates/components/roll/roller.hbs`}getData(options){return{title:this.title,dice:this.dice,maxPush:this.maxPush,modifier:this.modifier>=0?`+${this.modifier}`:this.modifier,modifiers:this.modifiers,advantage:this.disadvantage?!1:this.advantage,disadvantage:this.advantage?!1:this.disadvantage,attributeKey:this.attributeKey,skillKey:this.skillKey,rollMode:this.options.rollMode??game.settings.get("core","rollMode"),attack:this.isAttack,damage:this.damage,damageType:this.damageType,config:CONFIG.BLADE_RUNNER,options}}createSpeaker(){return{alias:this.options.alias||this.actor?.name,actor:this.options.actorId||this.actor?.id,token:this.options.tokenId||this.actor?.token?.id,scene:this.options.sceneId||this.actor?.token?.parent.id}}static create(data={},options={}){return new this(data,options).render(!0)}static getSpeaker({actor,scene,token}){return scene&&token?game.scenes.get(scene)?.tokens.get(token)?.actor:game.actors.get(actor)}async _updateObject(event,formData){return this._validateForm(event,formData),this._handleFormData(event,formData)}_validateForm(event,formData){if(foundry.utils.isEmpty(formData)||!this.dice.length||this.dice.includes("0")||!["roll","advantage","disadvantage"].includes(event.submitter.id)){let msg=game.i18n.localize("WARNING.NoDiceInput");throw ui.notifications.warn(msg),new Error(msg)}return!0}_handleFormData(event,formData){this.options.rollMode=formData.rollMode;let modifier=this._handleModifier(event.submitter.id);return this.executeRoll(modifier)}_handleModifier(buttonId){switch(buttonId){case"roll":return 0;case"advantage":return this.dice.length>2?0:1;case"disadvantage":return this.dice.length<2?0:-1}return this.modifier}getRollOptions(){let speaker=this.createSpeaker(),unlimitedPush=this.options.unlimitedPush;return{name:this.actor?this.title.replace(`${this.actor.name}: `,""):this.title,maxPush:unlimitedPush?1e3:this.maxPush,attributeKey:this.attributeKey,alias:speaker.alias,actorId:speaker.actor,actorType:this.options.actorType||this.actor?.type,tokenId:speaker.token,sceneId:speaker.scene,damage:this.damage,damageType:this.damageType,damageTypeName:FLBR.damageTypes[this.damageType],crit:this.crit,isExplosive:this.item?.type===ITEM_TYPES.EXPLOSIVE,item:this.item?.name||this.items.map(i=>i.name),itemId:this.item?.id||this.items.map(i=>i.id),yzur:!0}}async executeRoll(modifier=0){if(modifier){let min=Math.min(...this.dice);if(modifier>0)this.dice.push(min);else{let index=this.dice.indexOf(min);this.dice=this.dice.filter((_d,i)=>i!==index)}}let dice=this.dice.map(d=>({term:`${d}`,number:1}));if(this.roll=YearZeroRoll.forge(dice,{},this.getRollOptions()),await this.roll.roll(),this.options.sendMessage){let message=await this.roll.toMessage({speaker:this.createSpeaker()},{rollMode:this.options.rollMode});return this.messageId=message.id,message}return this.roll}static async pushRoll(message,{sendMessage=!0}={}){if(!message||!message.rolls.length)return;let roll=message.rolls[0].duplicate();if(roll.dice.some(d=>d.faces>=10&&d.pushable&&d.values.some(v=>v>=6&&v<10))){let pushSelections=await BRRollHandler.selectPush(roll.dice);if(pushSelections)for(let el of pushSelections){let[x,y]=el.name.split("."),result=roll.dice[x].results.find(r=>r.active&&r.indexResult===Number(y));if(!result)throw new Error(`Push Selection | No result found for index ${el.name}`);!el.disabled&&!el.checked?result.locked=!0:result.locked&&(result.locked=!1)}else return game.messages.directory.updateMessage(message),roll}await roll.push();let flavor=message.flavor,speakerData=message.speaker,speaker=this.getSpeaker(speakerData);return speaker&&await this.updateActor(roll,speaker),sendMessage?(await message.delete(),roll.toMessage({flavor,speaker:speakerData})):roll}static async cancelPush(message){if(!message||!message.rolls.length)return;let roll=message.rolls[0].duplicate();return roll.maxPush=0,await message.update({rolls:[roll.toJSON()]}),message}static async updateActor(roll,speaker){roll.baneCount&&await this.applyDamage(roll,speaker)}static async applyDamage({attributeTrauma,options:{attributeKey}},speaker){let currentDamage=attributeTrauma,nature=speaker?.system.nature;if(!nature)return ui.notifications.error("WARNING.ApplyDamageNoNature",{localize:!0});let cap=FLBR.pushTraumaMap[nature]?.[attributeKey];if(!cap)return ui.notifications.error("WARNING.ApplyDamageNoCapacityKey",{localize:!0});let capacity=speaker?.system[cap];if(!capacity||foundry.utils.isEmpty(capacity))return ui.notifications.error("WARNING.ApplyDamageNoActorCapacity",{localize:!0});let{value,max}=capacity;return value=Math.clamp(value-currentDamage,0,max),value===0&&ui.notifications.info("FLBR.YouAreBroken",{localize:!0}),await speaker.update({[`system.${cap}.value`]:value}),value}static async applyCrit(roll){let actor=await getActiveActor()||game.user.character;if(!actor){let actors=game.actors.filter(a=>a.type===ACTOR_TYPES.CHAR||a.isVehicle);actor=await chooseActor(actors,{title:game.i18n.localize("FLBR.CRIT.CriticalInjury"),notes:game.i18n.localize("FLBR.CRIT.ChooseActor")})}if(actor)return actor.drawCrit(roll.options.damageType,roll.successCount-1,`D${roll.options.crit}`)}activateListeners(html){super.activateListeners(html),html.find("input").on("change",ev=>{ev.preventDefault();let elem=ev.currentTarget,key=elem.name;if(key==null)return;let value=elem.type==="checkbox"?elem.checked:elem.value;return(elem.dataset.dtype==="Number"||elem.type==="number")&&(value=Number(value)),foundry.utils.setProperty(this,key,value),this.render()}),html.find(".add-die").on("click",async ev=>{ev.preventDefault();let elem=ev.currentTarget,lowestDie=Math.min(...this.dice);elem.style.display="none";let die=await BRRollHandler.askDie(lowestDie);if(elem.style.display="flex",!!die)return this.modifiers.forEach(m=>m.active=!1),this.dice.push(die),this.render()}),html.find(".modifiers input[type=checkbox]").on("click",ev=>{ev.preventDefault();let elem=ev.currentTarget,modifierId=elem.dataset.id;if(!modifierId)return;let mod=this.modifiers.find(m=>m.id===modifierId);if(mod)return mod.active=elem.checked,this.render()})}static async waitForRoll(data,options){return new Promise((resolve,reject)=>{let roller=new this(data,options),originalClose=roller.close;roller.close=async opts=>{await originalClose.bind(roller,opts)();let roll=roller.roll;roll instanceof foundry.dice.Roll?(roller.message&&game.dice3d&&game.dice3d.isEnabled()&&await game.dice3d.waitFor3DAnimationByMessageID(roller.messageId),resolve(roll)):reject(new Error("The dialog was closed without a choice being made."))},roller.render(!0)})}static async askDie(lowest=6){let template="systems/blade-runner/templates/components/roll/roll-askdie-dialog.hbs",content=await foundry.applications.handlebars.renderTemplate(template,{lowest});return Dialog.prompt({title:game.i18n.localize("FLBR.ROLLER.AddDie"),content,label:game.i18n.localize("FLBR.OK"),callback:html=>Number(html[0].querySelector("form").diesize.value),rejectClose:!1,options:{width:100,classes:["blade-runner","dialog"],minimizable:!1}})}static async selectPush(dice){return Dialog.wait({title:game.i18n.localize("FLBR.ROLLER.SelectDiceToPush"),content:await foundry.applications.handlebars.renderTemplate("systems/blade-runner/templates/components/roll/roll-push-select-dialog.hbs",{dice}),buttons:{ok:{label:game.i18n.localize("YZUR.CHAT.ROLL.Push"),icon:'',callback:html=>html[0].querySelector("form")},cancel:{label:game.i18n.localize("FLBR.Cancel"),icon:'',callback:()=>!1}}},{},{classes:["blade-runner","dialog","dice-push-select"]})}};var BladeRunnerDialog=class extends Dialog{static get defaultOptions(){let sysId=game.system.id||SYSTEM_ID;return foundry.utils.mergeObject(super.defaultOptions,{classes:[sysId,"dialog"]})}activateListeners(html){super.activateListeners(html),html.find("input").focus(ev=>ev.currentTarget.select()),html.find("input[type=range]").change(event=>{event.preventDefault();let elem=event.currentTarget,span=elem.nextElementSibling;span.innerHTML=elem.value})}static async rangePicker({value=1,min=1,max,title,description}){max=max??value;let template=`systems/${SYSTEM_ID}/templates/components/dialog/range-picker-dialog.hbs`,content=await foundry.applications.handlebars.renderTemplate(template,{value,min,max,description});return this.prompt({title,content,label:game.i18n.localize("FLBR.OK"),callback:html=>html[0].querySelector("form").chooser.value,rejectClose:!1})}static async choose(choices,title,{content,icon="fa-solid fa-play"}={}){if(choices.length<=1)return choices[0][0];let buttons=choices.reduce((btns,[id,label])=>(btns[id]={label,icon:``,callback:()=>id},btns),{});return this.wait({title,content,buttons,default:choices[0][0]},{},{classes:[SYSTEM_ID,"dialog","choice-dialog"]})}static async drawTable(tables,options={}){let template=`systems/${SYSTEM_ID}/templates/components/dialog/table-draw-dialog.hbs`,content=await foundry.applications.handlebars.renderTemplate(template,{formula:options.formula,qty:options.qty||1,selected:options.defaultSelected,disableSelection:options.disableSelection,disableFormula:options.disableFormula,hideFormula:options.disableFormula&&!options.formula,tables}),form=await Dialog.prompt({title:options.title??"Draw From Table",label:game.i18n.localize("FLBR.OK"),content,callback:html=>html[0].querySelector("form"),options:{classes:[SYSTEM_ID,"dialog","table-draw-dialog"]}});if(!form)return;let table=game.tables.get(form.table.value),formula=form.formula?.value||table.formula,drawOptions={displayChat:options.displayChat,rollMode:options.rollMode};formula&&(drawOptions.roll=new Roll(formula));let n=Number(form.qty.value)||1;return n>1?table.drawMany(n,drawOptions):table.draw(drawOptions)}};function addChatMessageContextOptions(_html,options){let canApplyDamage=li=>game.user.isGM&&game.user.targets.size&&!!li.querySelector(".chat-card[data-damage]");return options.push({name:game.i18n.localize("FLBR.CHAT_ACTION.ApplyDamage"),icon:FLBR.Icons.buttons.attack,condition:canApplyDamage,callback:li=>distributeDamageFromMessage(li.dataset.messageId)}),options}async function distributeDamageFromMessage(messageId){let roll=game.messages.get(messageId).rolls[0],damageType=roll.options.damageType,s=roll.successCount;if(!s)return;let boom=roll.options.isExplosive,defenderTokens=game.user.targets;for(let defenderToken of defenderTokens){if(defenderToken.actor.type===ACTOR_TYPES.LOOT){ui.notifications.info(game.i18n.format("FLBR.COMBAT.SkippedDefender",{name:`${defenderToken.name}`})+" ("+game.i18n.localize("FLBR.COMBAT.CannotBeDamaged")+")");continue}if(!s)break;let n=s;if(defenderTokens.size>1&&!boom)if(n=await BladeRunnerDialog.rangePicker({title:game.i18n.localize("FLBR.DIALOG.AssignSuccesses"),description:game.i18n.format("FLBR.DIALOG.AssignSuccessesHint",{name:`${defenderToken.name}`}),value:s}),n)s-=n;else continue;let actor=defenderToken.actor,damage=n>0?(roll.options.damage||0)+1*(n-1):0;await actor.applyDamage(damage);let brokenByDamage=actor.isBroken&&[DAMAGE_TYPES.CRUSHING,DAMAGE_TYPES.PIERCING].includes(damageType);if(roll.successCount>=2||brokenByDamage)try{await actor.drawCrit(damageType,roll.successCount-1,`D${roll.options.crit}`)}catch{}}}function hideChatActionButtons(html){let chatCard=html.querySelector(".yzur.chat-card");if(!chatCard)return;let actor=game.actors.get(chatCard.getAttribute("data-actor-id")),buttons=chatCard.querySelectorAll("button");for(let btn of buttons)actor&&!actor.isOwner&&(btn.style.display="none")}function addChatListeners(html){html.addEventListener("click",ev=>{ev.target.closest(".blade-runner-display-manual")&&game.bladerunner.macros.displayManual.call(ev.target,ev)}),html.addEventListener("click",ev=>{ev.target.closest(".roll-button")&&_onRollAction.call(ev.target,ev)}),html.addEventListener("click",ev=>{ev.target.closest(".crit-roll")&&_onCritRoll.call(ev.target,ev)})}async function _onRollAction(event){event.preventDefault();let button=event.target;button.disabled=!0;let messageId=button.closest(".chat-message").dataset.messageId,message=game.messages.get(messageId);switch(button.dataset.action){case"push":await BRRollHandler.pushRoll(message);break;case"cancel-push":await BRRollHandler.cancelPush(message);break;default:break}button.disabled=!1}function _onCritRoll(event){event.preventDefault();let messageId=event.target.closest(".chat-message").dataset.messageId,roll=game.messages.get(messageId)?.rolls[0];return BRRollHandler.applyCrit(roll)}function createBladeRunnerMacro(data,slot){if(data.type==="Stat")return _createBladeRunnerStatMacro(data,slot),!1;if(data.type==="Action")return _createBladeRunnerActionMacro(data,slot),!1;if(data.type==="Item"&&typeof data.uuid=="string"){if(!data.uuid.includes("Actor")&&!data.uuid.includes("Token"))return;let item=foundry.utils.fromUuidSync(data.uuid);return!item||!item.rollable?void 0:(_createBladeRunnerItemMacro(item,slot),!1)}}async function setupMacroFolder(){if(!game.user.isGM)return;let folderName=FLBR.systemMacroFolder;game.folders.filter(f=>f.type==="Macro").find(f=>f.name===folderName)||await Folder.create({name:folderName,type:"Macro",parent:null})}async function _createBladeRunnerStatMacro(data,slot){let folder=game.folders.find(f=>f.type==="Macro"&&f.name===FLBR.systemMacroFolder),command=`game.bladerunner.macros.rollStat("${data.attribute}"`+(data.skill?`, "${data.skill}"`:"")+");";if(!await foundry.utils.fromUuid(data.uuid))return;let commandName=game.i18n.format("FLBR.MACRO.RollStat",{stat:game.i18n.localize(data.skill?`FLBR.SKILL.${data.skill.capitalize()}`:`FLBR.ATTRIBUTE.${data.attribute.toUpperCase()}`)}),macro=findMacro(commandName,command);macro||(macro=await Macro.create({name:commandName,type:"script",img:"icons/svg/dice-target.svg",command,flags:{"bladerunner.statMacro":!0},folder:folder.id,"ownership.default":CONST.DOCUMENT_OWNERSHIP_LEVELS.OBSERVER})),game.user.assignHotbarMacro(macro,slot)}async function _createBladeRunnerActionMacro(data,slot){let folder=game.folders.find(f=>f.type==="Macro"&&f.name===FLBR.systemMacroFolder),command=`game.bladerunner.macros.rollAction("${data.action}");`;if(!await foundry.utils.fromUuid(data.uuid))return;let action=FLBR.Actions.find(a=>a.id===data.action),commandName=game.i18n.format("FLBR.MACRO.RollAction",{action:game.i18n.localize(action?.label)}),macro=findMacro(commandName,command);macro||(macro=await Macro.create({name:commandName,type:"script",img:"icons/svg/dice-target.svg",command,flags:{"bladerunner.actionMacro":!0},folder:folder.id,"ownership.default":CONST.DOCUMENT_OWNERSHIP_LEVELS.OBSERVER})),game.user.assignHotbarMacro(macro,slot)}async function _createBladeRunnerItemMacro(item,slot){let folder=game.folders.find(f=>f.type==="Macro"&&f.name===FLBR.systemMacroFolder),command=`game.bladerunner.macros.rollItem("${item.name}");`,macro=findMacro(item.name,command);macro||(macro=await Macro.create({name:item.name,type:"script",img:item.img,command,flags:{"bladerunner.itemMacro":!0},folder:folder.id,"ownership.default":CONST.DOCUMENT_OWNERSHIP_LEVELS.OBSERVER})),game.user.assignHotbarMacro(macro,slot)}async function rollStat(attributeKey,skillKey,options){let actor=await getActiveActor();if(actor)return actor.rollStat(attributeKey,skillKey,options)}async function rollAction(actionKey){return game.bladerunner.actions.has(actionKey)?game.bladerunner.actions.get(actionKey).execute(await getActiveActor()):ui.notifications.error(`Action "${actionKey}" not found!`)}async function rollItem(itemName){let actor=await getActiveActor(),items=actor?actor.items.filter(i=>i.name===itemName):[];if(items.length>1)ui.notifications.warn(game.i18n.format("FLBR.MACRO.MultipleItems",{actor:actor.name,item:itemName}));else if(items.length===0)return ui.notifications.warn(game.i18n.format("FLBR.MACRO.NoItem",{actor:actor.name,item:itemName}));return items[0].roll()}function showRollDialog(data={}){return game.bladerunner.roller.create({title:"Generic Roll",actor:game.user.character,attributeKey:null,skillKey:null,dice:[],maxPush:1,...data})}function findMacro(commandName,command){return game.macros.find(m=>m.name===commandName&&m.command===command&&(m.author===game.user.id||m.ownership.default>=CONST.DOCUMENT_OWNERSHIP_LEVELS.OBSERVER||m.ownership[game.user.id]>=CONST.DOCUMENT_OWNERSHIP_LEVELS.OBSERVER))}async function enrichTextFields(sheetData,fieldNames){for(let fieldName of fieldNames)foundry.utils.hasProperty(sheetData,fieldName)&&foundry.utils.setProperty(sheetData,fieldName,await foundry.applications.ux.TextEditor.enrichHTML(foundry.utils.getProperty(sheetData,fieldName)))}var _ActorSheetConfig=class extends foundry.applications.apps.DocumentSheetConfig{get title(){return`${this.document.name} - ${super.title}`}async _preparePartContext(partId,context,options){let data=await super._preparePartContext(partId,context,options);return partId==="character"&&(data.types=FLBR.characterSubtypes,data.isGM=game.user.isGM),data}static async myFormHandler(_event,_form,formData){let updateData=foundry.utils.expandObject(formData.object);await this.document.update(updateData);let{object}=formData,{documentName,type=CONST.BASE_DOCUMENT_TYPE}=this.document,themes=game.settings.get("core","sheetThemes"),defaultTheme=foundry.utils.getProperty(themes,`defaults.${documentName}.${type}`),documentTheme=themes.documents?.[this.document.uuid],themeChanged=object.defaultTheme!==defaultTheme||object.theme!==documentTheme;themeChanged&&(foundry.utils.setProperty(themes,`defaults.${documentName}.${type}`,object.defaultTheme),themes.documents??={},themes.documents[this.document.uuid]=object.theme,await game.settings.set("core","sheetThemes",themes));let{defaultClass}=this.constructor.getSheetClassesForSubType(documentName,type),sheetClass=this.document.getFlag("core","sheetClass")??"",defaultSheetChanged=object.defaultClass!==defaultClass,documentSheetChanged=object.sheetClass!==sheetClass;if(themeChanged||game.user.isGM&&defaultSheetChanged){if(game.user.isGM&&defaultSheetChanged){let setting=game.settings.get("core","sheetClasses");foundry.utils.setProperty(setting,`${documentName}.${type}`,object.defaultClass),await game.settings.set("core","sheetClasses",setting)}if(!documentSheetChanged)return this.document._onSheetChange({sheetOpen:!0})}if(documentSheetChanged)return this.document.setFlag("core","sheetClass",object.sheetClass)}},ActorSheetConfig=_ActorSheetConfig;__publicField(ActorSheetConfig,"DEFAULT_OPTIONS",{tag:"form",form:{handler:_ActorSheetConfig.myFormHandler,submitOnChange:!1,closeOnSubmit:!0}}),__publicField(ActorSheetConfig,"PARTS",{character:{classes:["standard-form"],template:`systems/${SYSTEM_ID}/templates/actor/actor-sheet-config.hbs`},form:{classes:["standard-form"],template:"templates/sheets/document-sheet-config.hbs"},footer:{template:"templates/generic/form-footer.hbs"}});var BladeRunnerActorSheet=class extends foundry.appv1.sheets.ActorSheet{static get defaultOptions(){return foundry.utils.mergeObject(super.defaultOptions,{dragDrop:[{dragSelector:".embedded-items .embedded-item",dropSelector:null},{dragSelector:".stat-roll[data-attribute]",dropSelector:null}]})}get template(){return`systems/${game.system.id||SYSTEM_ID}/templates/actor/${this.actor.type}/${this.actor.type}-sheet.hbs`}get rollData(){return this.actor.getRollData()}async getData(options){let isOwner=this.actor.isOwner,showEffects=game.settings.get(SYSTEM_ID,SETTINGS_KEYS.USE_ACTIVE_EFFECTS),baseData=super.getData(options),sheetData={cssClass:isOwner?"editable":"locked",owner:isOwner,limited:this.actor.limited,editable:this.isEditable,options:this.options,isGM:game.user.isGM,actor:baseData.actor,system:foundry.utils.duplicate(baseData.actor.system),items:[...this.actor.items].sort((a,b)=>(a.sort||0)-(b.sort||0)),showEffects,effects:showEffects?[...this.actor.effects]:null,rollData:this.rollData,config:CONFIG.BLADE_RUNNER};return await enrichTextFields(sheetData,["system.description"]),sheetData}async _onDropItemCreate(itemData){let type=itemData.type,alwaysAllowedItems=FLBR.physicalItems,allowedItems=FLBR.allowedItems,allowed=!0;if(alwaysAllowedItems.includes(type)||allowedItems[this.actor.type].includes(type)||(allowed=!1),!allowed){let msg=game.i18n.format("FLBR.ActorSheet.NotifWrongItemType",{type:game.i18n.localize(`TYPES.Item.${type}`),actor:game.i18n.localize(`TYPES.Actor.${this.actor.type}`)});return ui.notifications.warn(msg),!1}return super._onDropItemCreate(itemData)}_onDragStart(event){let data=event.currentTarget.dataset;if(typeof data.attribute<"u"||typeof data.skill<"u"||typeof data.action<"u"){let dragData={actorId:this.actor.id,sceneId:this.actor.isToken?canvas.scene?.id:null,tokenId:this.actor.isToken?this.actor.token.id:null,uuid:this.actor.uuid,type:data.action?"Action":"Stat",attribute:data.attribute,skill:data.skill,action:data.action};return event.dataTransfer.setData("text/plain",JSON.stringify(dragData))}return super._onDragStart(event)}_onConfigureSheet(event){event.preventDefault(),new ActorSheetConfig({document:this.actor,position:{top:this.position.top+40,left:this.position.left+(this.position.width-400)/2}}).render(!0)}_getHeaderButtons(){let originalButtons=super._getHeaderButtons();return!game.user.isGM&&this.actor.limited||this.actor.type===ACTOR_TYPES.LOOT?originalButtons:[{label:game.i18n.localize("FLBR.SHEET_HEADER.GenericRoll"),class:"custom-roll",icon:"fas fa-dice",onclick:()=>this.actor.roll()}].concat(originalButtons)}activateListeners(html){if(super.activateListeners(html),!game.user.isGM&&this.actor.limited||!this.isEditable)return;html.find("input").focus(ev=>ev.currentTarget.select()),html.find(".action-roll").click(this._onActionRoll.bind(this)),html.find(".capacities .capacity-boxes").on("click contextmenu",this._onCapacityIncrease.bind(this)),html.find(".item-create").click(this._onItemCreate.bind(this)),html.find(".item-delete").click(this._onItemDelete.bind(this)),html.find(".item-delete-confirmed").click(this._onItemDeleteConfirmed.bind(this)),html.find(".item-control").click(this._onItemControl.bind(this)),html.find(".embedded-item").on("contextmenu",this._onItemEdit.bind(this)),game.settings.get(SYSTEM_ID,SETTINGS_KEYS.USE_ACTIVE_EFFECTS)&&(html.find(".add-active-effect").click(this._onAddActiveEffect.bind(this)),html.find(".active-effect-controls .btn").click(this._onActiveEffectAction.bind(this)))}_onActionRoll(event){event.preventDefault();let actionKey=event.currentTarget.dataset.action;return game.bladerunner.actions.get(actionKey)?.execute(this.actor)}_onItemCreate(event){event.preventDefault();let type=event.currentTarget.dataset.type,itemData={name:game.i18n.format("FLBR.NewItem",{type:game.i18n.localize(`TYPES.Item.${type}`)}),type};return this.actor.createEmbeddedDocuments("Item",[itemData]).then(itmData=>{let itemId=itmData[0].id;this.actor.items.get(itemId).sheet.render(!0)})}_onItemDelete(event){event.preventDefault();let elem=event.currentTarget;elem.style.display="none";let deleteButton=elem.closest(".embedded-item").getElementsByClassName("item-delete-confirmed")[0];deleteButton.style.display="inline"}_onItemDeleteConfirmed(event){event.preventDefault();let itemId=event.currentTarget.closest(".embedded-item").dataset.itemId;return this.actor.deleteEmbeddedDocuments("Item",[itemId])}_onItemEdit(event){return event.preventDefault(),event.currentTarget.dataset.action="edit",this._onItemControl(event)}_onItemControl(event){event.preventDefault();let elem=event.currentTarget,itemId=elem.closest(".embedded-item").dataset.itemId,item=this.actor.items.get(itemId);if(item)switch(elem.dataset.action){case"edit":return item.sheet.render(!0);case"roll":return item.roll();case"blast":return item._rollExplosive();case"mount":return item.update({"system.mounted":!0});case"unmount":return item.update({"system.mounted":!1});case"chat":return item.toMessage()}}_onCapacityIncrease(event){return this._onCapacityChange(event,1)}_onCapacityDecrease(event){return this._onCapacityChange(event,-1)}_onCapacityChange(event,mod=1){event.preventDefault();let elem=event.currentTarget,min=+elem.dataset.min,max=+elem.dataset.max||10,field=elem.dataset.field;if(!field)return;let count=foundry.utils.getProperty(this.actor,field)??0;return event.type==="click"?count+=mod:count-=mod,count=Math.clamp(count,min,max),this.actor.update({[field]:count})}_onAddActiveEffect(event){return event.preventDefault(),this.actor.createEmbeddedDocuments("ActiveEffect",[{label:game.i18n.localize("FLBR.ACTIVE_EFFECT.New"),icon:"icons/svg/aura.svg",origin:this.actor.uuid}])}_onActiveEffectAction(event){event.preventDefault();let effectId=event.currentTarget.closest("[data-effect-id]").dataset.effectId,effect=this.actor.effects.get(effectId);if(effect)switch(event.currentTarget.dataset.action){case"toggle":return effect.update({disabled:!effect.disabled});case"edit":return effect.sheet.render(!0);case"delete":return effect.delete()}}};var BladeRunnerCharacterSheet=class extends BladeRunnerActorSheet{static get defaultOptions(){let sysId=game.system.id||SYSTEM_ID;return foundry.utils.mergeObject(super.defaultOptions,{classes:[sysId,"sheet","actor","character"],width:525,height:616,resizable:!0,scrollY:[".sheet-body"],tabs:[{navSelector:".sheet-tabs",contentSelector:".sheet-body",initial:"stats"}]})}get template(){let sysId=game.system.id||SYSTEM_ID;return!game.user.isGM&&this.actor.limited?`systems/${sysId}/templates/actor/${this.actor.type}/${this.actor.type}-limited-sheet.hbs`:`systems/${sysId}/templates/actor/${this.actor.type}/${this.actor.type}-sheet.hbs`}async getData(options){let sheetData=await super.getData(options);return sheetData.isPC=this.actor.system.subtype===ACTOR_SUBTYPES.PC,sheetData.isNPC=this.actor.system.subtype===ACTOR_SUBTYPES.NPC,sheetData.driving=this.actor.skills.driving?.value,sheetData.actions=game.bladerunner.actions.filter(a=>a.actorType===this.actor.type),sheetData.editNature=game.settings.get(SYSTEM_ID,SETTINGS_KEYS.EDIT_NATURE_PERMISSION)||sheetData.isGM,this.actor.system.subtype===ACTOR_SUBTYPES.PC&&await enrichTextFields(sheetData,["system.bio.keyMemory","system.bio.keyRelationship","system.bio.home","system.bio.appearance"]),sheetData}activateListeners(html){super.activateListeners(html),!(!game.user.isGM&&this.actor.limited)&&this.isEditable&&(html.find(".stat-roll").click(this._onStatRoll.bind(this)),html.find(".meta-currencies .capacity-boxes").on("click contextmenu",super._onCapacityIncrease.bind(this)),html.find(".capacity-resolve .capacity-boxes").on("contextmenu",this._onResolveDecrease.bind(this)),this.actor.isOwner&&html.find(".action-roll[data-action]").each((_index,elem)=>{elem.setAttribute("draggable",!0),elem.addEventListener("dragstart",ev=>this._onDragStart(ev),!1)}))}_onStatRoll(event){event.preventDefault();let elem=event.currentTarget,attrKey=elem.dataset.attribute,skillKey=elem.dataset.skill;return this.actor.rollStat(attrKey,skillKey)}_onResolveDecrease(event){if(event.preventDefault(),this.actor.system.subtype===ACTOR_SUBTYPES.PC&&!(this.actor.system.resolve.value>1))return this.actor.rollResolve()}};var BladeRunnerLootSheet=class extends BladeRunnerActorSheet{static get defaultOptions(){let sysId=game.system.id||SYSTEM_ID;return foundry.utils.mergeObject(super.defaultOptions,{classes:[sysId,"sheet","actor","loot"],width:525,height:616,resizable:!0})}get template(){return`systems/${game.system.id||SYSTEM_ID}/templates/actor/${ACTOR_TYPES.LOOT}/${ACTOR_TYPES.LOOT}-sheet.hbs`}};var BladeRunnerVehicleSheet=class extends BladeRunnerActorSheet{get vehicle(){return this.actor}static get defaultOptions(){let sysId=game.system.id||SYSTEM_ID,opts=foundry.utils.mergeObject(super.defaultOptions,{classes:[sysId,"sheet","actor","vehicle"],width:569,height:700,resizable:!0,scrollY:[".sheet-body"],tabs:[{navSelector:".sheet-tabs",contentSelector:".sheet-body",initial:"combat"}]});return opts.dragDrop.push({dragSelector:".vehicle-seat.occupied img",dropSelector:null}),opts}async getData(options){let sheetData=await super.getData(options),[otherItems,mountedWeapons]=sheetData.items.partition(i=>!!i.system.mounted);return sheetData.trunk=otherItems,sheetData.mountedWeapons=mountedWeapons,sheetData.crew=this.vehicle.crew.contents,sheetData.actions=game.bladerunner.actions.filter(a=>a.actorType===this.actor.type),sheetData}_onDragStart(event){super._onDragStart(event);let elem=event.currentTarget.closest(".vehicle-seat");if(!elem)return;let actor=this.vehicle.crew.get(elem.dataset.occupantId);if(!actor)return;let dragData=actor.toDragData();dragData.parent=this.vehicle.id,event.dataTransfer.setData("text/plain",JSON.stringify(dragData))}async _onDropActor(event,data){if(await super._onDropActor(event,data),!this.vehicle.isOwner)return;let actor=await foundry.utils.fromUuid(data.uuid);if(actor)return data.parent===this.vehicle.id?this._sortCrew(event,actor):actor.type===ACTOR_TYPES.CHAR?this.dropCrew(actor):ui.notifications.info(`FLBR.VEHICLE.NotifDropCrew${actor.type.capitalize()}`,{localize:!0})}async _sortCrew(event,newOccupant){if(this.vehicle.crew.size<=1)return;let crew=this.vehicle.system.crew,newOccupantId=newOccupant.id;crew.splice(crew.findIndex(o=>o.id===newOccupantId),1);let targetOccupantId=event.target.closest(".vehicle-seat.occupied")?.dataset.occupantId;return targetOccupantId?crew.splice(crew.findIndex(o=>o.id===targetOccupantId),0,{id:newOccupantId}):crew.push({id:newOccupantId}),this.vehicle.update({"system.crew":crew})}async dropCrew(actor){if(this.vehicle.crew.full)return ui.notifications.info("FLBR.VEHICLE.NotifCrewFull",{localize:!0});if((actor.system.subtype===ACTOR_SUBTYPES.NPC||!actor.prototypeToken.actorLink)&&await Dialog.confirm({title:game.i18n.localize("FLBR.VEHICLE.CreateActor"),content:game.i18n.format("FLBR.VEHICLE.CreateActorHint",{name:actor.name})})){let actorData=actor.toObject();actorData.prototypeToken.actorLink=!0,actorData.name=`[${this.vehicle.name}] ${game.i18n.format("DOCUMENT.CopyOf",{name:actor.name})}`,actor=await Actor.create(actorData)}await this.vehicle.addVehicleOccupant(actor)}activateListeners(html){super.activateListeners(html),!(!game.user.isGM&&this.actor.limited)&&this.isEditable&&(html.find(".mvr-roll").click(this._onManeuverabilityRoll.bind(this)),html.find(".roll-vehicle-armor").click(this._onVehicleArmorRoll.bind(this)),new foundry.applications.ux.ContextMenu.implementation(html[0],".hull",[{name:game.i18n.localize("FLBR.VEHICLE.IncreaseHull"),icon:FLBR.Icons.buttons.plus,callback:()=>this.vehicle.update({"system.hull.max":this.vehicle.system.hull.max+1}),condition:()=>this.vehicle.system.hull.maxthis.vehicle.update({"system.hull.max":this.vehicle.system.hull.max-1}),condition:()=>this.vehicle.system.hull.max>1}],{jQuery:!0}),html.find(".vehicle-seat:not(.empty):not(.broken)").click(this._onCrewAction.bind(this)),new foundry.applications.ux.ContextMenu.implementation(html[0],".vehicle-seat:not(.button)",[{name:game.i18n.localize("FLBR.VEHICLE.EditPassenger"),icon:FLBR.Icons.buttons.edit,callback:el=>game.actors.get(el.data("occupant-id"))?.sheet.render(!0),condition:el=>el.hasClass("occupied")},{name:game.i18n.localize("FLBR.VEHICLE.RemovePassenger"),icon:FLBR.Icons.buttons.delete,callback:el=>this.vehicle.removeVehicleOccupant(el.data("occupant-id")),condition:el=>el.hasClass("occupied")},{name:game.i18n.localize("FLBR.VEHICLE.DeleteSeat"),icon:FLBR.Icons.buttons.remove,callback:()=>this.vehicle.update({"system.passengers":this.vehicle.system.passengers-1}),condition:()=>!this.vehicle.crew.full&&this.vehicle.system.passengers>1}],{jQuery:!0}),this.actor.isOwner)}async _onActionRoll(event){event.preventDefault();let actionKey=event.currentTarget.dataset.action,action=game.bladerunner.actions.get(actionKey);if(action)if(action.onCrew){let actor=await this.vehicle.crew.choose();return actor?action.execute(actor):void 0}else return action.execute(this.vehicle)}_onCrewAction(event){event.preventDefault();let elem=event.currentTarget,action=elem.dataset.action;if(action==="add-occupant")return this.vehicle.update({"system.passengers":this.vehicle.system.passengers+1});if(action==="roll-occupant")return this.vehicle.crew.get(elem.dataset.occupantId)?.rollStat(ATTRIBUTES.VEHICLE_MANEUVERABILITY,SKILLS.DRIVING)}_onManeuverabilityRoll(event){return event.preventDefault(),this.vehicle.roll({title:`${this.vehicle.name}: ${game.i18n.localize("FLBR.ATTRIBUTE.MVR")}`,dice:[this.vehicle.system.maneuverability]})}_onVehicleArmorRoll(event){return event.preventDefault(),this.vehicle.roll({title:`${this.vehicle.name}: ${game.i18n.localize("FLBR.ItemArmor")}`,dice:new Array(2).fill(this.vehicle.system.armor),maxPush:0},{disabledPush:!0})}};var ItemAction=class{constructor(type,{name,item,attribute,skill,macro}){switch(this.id=foundry.utils.randomID(8),this.type=type||ItemAction.Types.ROLL_SKILL,this.name=name,this.item=item,this.type){case ItemAction.Types.ROLL_SKILL:this.attribute=attribute||"str",this.skill=skill||"closeCombat";break;case ItemAction.Types.RUN_MACRO:this.macro=macro}}get actor(){return this.item?.actor}get title(){switch(this.type){case ItemAction.Types.ROLL_SKILL:return this.name+" ("+game.i18n.localize(`FLBR.ATTRIBUTE.${this.attribute.toUpperCase()}`)+" + "+game.i18n.localize(`FLBR.SKILL.${this.skill.capitalize()}`)+")";default:return this.name}}toObject(){return{type:this.type,name:this.name,attribute:this.attribute,skill:this.skill,macro:this.macro}}};ItemAction.Types={ROLL_SKILL:"skill",RUN_MACRO:"macro"};var ItemAttack=class{constructor({name,item,damage,damageType,crit,range:range2}){this.id=foundry.utils.randomID(8),this.name=name,this.item=item,this.damage=damage??1,this.damageType=damageType??2,this.crit=crit||6,this.range={min:range2?.min??0,max:range2?.max??1}}get actor(){return this.item?.actor}get title(){return`${this.name}
[ ${game.i18n.localize("FLBR.WeaponDamage")}: ${this.damage} ${game.i18n.localize(CONFIG.BLADE_RUNNER.damageTypes[this.damageType])},  ${game.i18n.localize("FLBR.CRIT.Crit")}: ${game.i18n.localize("FLBR.D")}${this.crit},  ${game.i18n.localize("FLBR.Range")}: ${game.i18n.localize(CONFIG.BLADE_RUNNER.ranges[this.range.max])} ]`}toObject(){return{name:this.name,damage:this.damage,damageType:this.damageType,crit:this.crit,range:this.range}}};var BladeRunnerItemSheet=class extends foundry.appv1.sheets.ItemSheet{collapsibleStates={};static get defaultOptions(){let sysId=game.system.id||SYSTEM_ID;return foundry.utils.mergeObject(super.defaultOptions,{classes:[sysId,"sheet","item"],width:250,scrollY:[".sheet-body"],resizable:!1,tabs:[{navSelector:".sheet-tabs",contentSelector:".sheet-body",initial:"info"}],top:100})}get template(){return`systems/${game.system.id||SYSTEM_ID}/templates/item/item-sheet.hbs`}async getData(options){let showEffects=game.settings.get(SYSTEM_ID,SETTINGS_KEYS.USE_ACTIVE_EFFECTS),baseData=super.getData(options),sheetData={cssClass:this.isEditable?"editable":"locked",owner:!!this.item.actor?.isOwner,editable:this.isEditable,options:this.options,isGM:game.user.isGM,inActor:!!this.item.actor,isOffensive:this.item.isOffensive,isConsumable:this.item.isConsumable,inVehicle:this.item.actor?.isVehicle,item:baseData.item,system:foundry.utils.duplicate(baseData.item.system),showEffects,effects:showEffects?this.item.effects.contents:null,rollable:this.item.rollable,rollData:this.item.getRollData(),collapsibleStates:this.collapsibleStates,config:CONFIG.BLADE_RUNNER};return await enrichTextFields(sheetData,["system.description"]),sheetData}_getHeaderButtons(){let originalButtons=super._getHeaderButtons(),myButtons=[];return this.item.hasAction&&this.item.actor&&myButtons.push({label:game.i18n.localize("FLBR.SHEET_HEADER.ItemRoll"),class:"item-roll",icon:"fas fa-dice",onclick:()=>this.item.roll()}),this.item.type===ITEM_TYPES.ARMOR?myButtons.push({label:game.i18n.localize("FLBR.SHEET_HEADER.ArmorRoll"),class:"item-roll",icon:"fas fa-shield-alt",onclick:()=>this.item.roll()}):this.item.type===ITEM_TYPES.EXPLOSIVE&&myButtons.push({label:game.i18n.localize("FLBR.SHEET_HEADER.BlastPowerRoll"),class:"blast-roll",icon:"fas fa-bomb",onclick:()=>this.item._rollExplosive()}),myButtons.push({label:game.i18n.localize("FLBR.SHEET_HEADER.ItemPost"),class:"item-post",icon:"far fa-comment-dots",onclick:()=>this.item.toMessage()}),myButtons.concat(originalButtons)}activateListeners(html){if(super.activateListeners(html),this._setupAccordions(),!game.user.isGM&&this.actor.limited||!this.isEditable)return;let inputs=html.find("input");inputs.focus(ev=>ev.currentTarget.select()),inputs.addBack().find('[data-dtype="Number"]').change(this._onChangeInputDelta.bind(this)),html.find(".add-action").click(this._onAddItemAction.bind(this)),html.find(".delete-action").click(this._onDeleteItemAction.bind(this)),html.find(".add-attack").click(this._onAddItemAttack.bind(this)),html.find(".delete-attack").click(this._onDeleteItemAttack.bind(this)),html.find(".add-modifier").click(this._onAddModifier.bind(this)),html.find(".delete-modifier").click(this._onDeleteModifier.bind(this)),game.settings.get(SYSTEM_ID,SETTINGS_KEYS.USE_ACTIVE_EFFECTS)&&(html.find(".add-active-effect").click(this._onAddActiveEffect.bind(this)),html.find(".active-effect-controls .btn").click(this._onActiveEffectAction.bind(this))),this.item.type===ITEM_TYPES.EXPLOSIVE&&html.find(".item-property-blast .score-selector").change(this._onBlastChange.bind(this))}_onChangeInputDelta(event){event.preventDefault();let input=event.target,value=input.value;if(value[0]==="+"||value[0]==="-"){let delta=parseFloat(value);input.value=foundry.utils.getProperty(this.item,input.name)+delta}else value[0]==="="&&(input.value=value.slice(1))}_onAddItemAction(event){event.preventDefault();let itemAction=new ItemAction(null,{name:game.i18n.localize("FLBR.ItemNewAction")});return this.item.update({[`system.actions.${itemAction.id}`]:itemAction.toObject()})}_onDeleteItemAction(event){event.preventDefault();let itemActionId=event.currentTarget.dataset.actionId;this.item.system.actions[itemActionId]&&this.item.update({[`system.actions.-=${itemActionId}`]:null})}_onAddItemAttack(event){event.preventDefault();let itemAttack=new ItemAttack({name:game.i18n.localize("FLBR.ItemNewAttack")});return this.collapsibleStates[itemAttack.id]=!0,this.item.update({[`system.attacks.${itemAttack.id}`]:itemAttack.toObject()})}_onDeleteItemAttack(event){event.preventDefault();let itemAttackId=event.currentTarget.dataset.attackId;this.item.system.attacks[itemAttackId]&&this.item.update({[`system.attacks.-=${itemAttackId}`]:null})}_onAddModifier(event){event.preventDefault();let modifiers=foundry.utils.duplicate(this.item.system.modifiers??{}),modifierId=Math.max(-1,...Object.getOwnPropertyNames(modifiers))+1;return this.item.update({[`system.modifiers.${modifierId}`]:{name:"attribute.str",value:"+1"}})}_onDeleteModifier(event){event.preventDefault();let modifierId=event.currentTarget.dataset.modifierId;this.item.system.modifiers[modifierId]&&this.item.update({[`system.modifiers.-=${modifierId}`]:null})}_onAddActiveEffect(event){return event.preventDefault(),this.item.createEmbeddedDocuments("ActiveEffect",[{name:game.i18n.localize("FLBR.ACTIVE_EFFECT.New"),icon:"icons/svg/aura.svg",origin:this.item.uuid}])}_onActiveEffectAction(event){event.preventDefault();let effectId=event.currentTarget.closest("[data-effect-id]").dataset.effectId,effect=this.item.effects.get(effectId);if(effect)switch(event.currentTarget.dataset.action){case"toggle":return effect.update({disabled:!effect.disabled});case"edit":return effect.sheet.render(!0);case"delete":return effect.delete()}}_onBlastChange(event){event.preventDefault();let blast=+event.currentTarget.value;if(!(blast in FLBR.blastPowerMap)||this.item.attacks.length<=0)return;let{damage,crit}=FLBR.blastPowerMap[blast],updatedAttacks=foundry.utils.duplicate(this.item.system.attacks);for(let id in updatedAttacks)updatedAttacks[id].damage=damage,updatedAttacks[id].crit=crit;return this.item.update({"system.attacks":updatedAttacks})}_setupAccordions(){this.form?.querySelectorAll(".item-attacks-list details").forEach((el,i)=>{let id=el.dataset.actionId;(i===0&&game.settings.get(SYSTEM_ID,SETTINGS_KEYS.OPEN_FIRST_WEAPON_ATTACK)||this.collapsibleStates[id])&&(el.open=!0),el.querySelector("summary")?.addEventListener("click",()=>{this.collapsibleStates[id]=!this.collapsibleStates[id]})})}};function registerSheets(){let br=game.system.id||SYSTEM_ID;foundry.documents.collections.Actors.unregisterSheet("core",foundry.appv1.sheets.ActorSheet),foundry.documents.collections.Actors.registerSheet(br,BladeRunnerCharacterSheet,{types:[ACTOR_TYPES.CHAR],makeDefault:!0}),foundry.documents.collections.Actors.registerSheet(br,BladeRunnerVehicleSheet,{types:[ACTOR_TYPES.VEHICLE],makeDefault:!0}),foundry.documents.collections.Actors.registerSheet(br,BladeRunnerLootSheet,{types:[ACTOR_TYPES.LOOT],makeDefault:!0}),foundry.documents.collections.Items.unregisterSheet("core",foundry.appv1.sheets.ItemSheet),foundry.documents.collections.Items.registerSheet(br,BladeRunnerItemSheet,{types:[ITEM_TYPES.GENERIC],makeDefault:!0}),foundry.documents.collections.Items.registerSheet(br,BladeRunnerItemSheet,{types:[ITEM_TYPES.SYNTHETIC_AUGMENTATION],makeDefault:!0}),foundry.documents.collections.Items.registerSheet(br,BladeRunnerItemSheet,{types:[ITEM_TYPES.ARMOR],makeDefault:!0}),foundry.documents.collections.Items.registerSheet(br,BladeRunnerItemSheet,{types:[ITEM_TYPES.WEAPON],makeDefault:!0}),foundry.documents.collections.Items.registerSheet(br,BladeRunnerItemSheet,{types:[ITEM_TYPES.EXPLOSIVE],makeDefault:!0}),foundry.documents.collections.Items.registerSheet(br,BladeRunnerItemSheet,{types:[ITEM_TYPES.SPECIALTY],makeDefault:!0}),foundry.documents.collections.Items.registerSheet(br,BladeRunnerItemSheet,{types:[ITEM_TYPES.CRITICAL_INJURY],makeDefault:!0})}function preloadHandlebarsTemplates(){let paths=define_TEMPLATE_PATHS_default;return foundry.applications.handlebars.loadTemplates(paths)}function registerCustomItemTypesTemplates(){let customItemTypesTemplates=Object.values(FLBR.customItemTypesTemplates);return foundry.applications.handlebars.loadTemplates(customItemTypesTemplates)}function registerHandlebarsHelpers(){Handlebars.registerHelper("concat",function(){let str="";for(let arg in arguments)typeof arguments[arg]!="object"&&(str+=arguments[arg]);return str}),Handlebars.registerHelper("capitalize",function(str){return str.capitalize()}),Handlebars.registerHelper("toLowerCase",function(str){return str.toLowerCase()}),Handlebars.registerHelper("toUpperCase",function(str){return str.toUpperCase()}),Handlebars.registerHelper("trim",function(str,n){return n=+n,isNaN(n)&&(n=100),foundry.applications.ux.TextEditor.previewHTML(str,n)}),Handlebars.registerHelper("times",function(n,content){let str="";for(let i=0;i`${p2??foundry.utils.fromUuidSync(p1)?.name??"{undefined}"}`)),new Handlebars.SafeString(text)}),Handlebars.registerHelper("select",function(selected,options){let escapedValue=RegExp.escape(Handlebars.escapeExpression(selected)),rgx=new RegExp(` value=["']${escapedValue}["']`);return options.fn(foundry.applications.handlebars).replace(rgx,"$& selected")}),Handlebars.registerHelper("scoreSelector",function(target,options){let selectOptions=[],selected=Number(options.hash.selected);for(let[score,size]of FLBR.scoreMap){let opt=``;selectOptions.push(opt)}return new Handlebars.SafeString(``)}),Handlebars.registerHelper("boxes",function(field,options){let value=Number(options.hash.value),min=Number(options.hash.min),max=Number(options.hash.max),loss=Number(options.hash.loss),str=``;for(let i=0;i"),value>i?str+=`${FLBR.Icons.boxes.full}`:str+=`${FLBR.Icons.boxes.empty}`;if(loss<0){for(str+='';loss<0;loss++)str+=`${FLBR.Icons.boxes.lost}`;str+=""}return str+="",new Handlebars.SafeString(str)}),Handlebars.registerHelper("createNewItemButton",function(type){let title=game.i18n.format("FLBR.CreateNewItem",{type:game.i18n.localize(`TYPES.Item.${type}`)}),str=`${FLBR.Icons.buttons.plus}`;return new Handlebars.SafeString(str)})}async function initializeHandlebars(){await preloadHandlebarsTemplates(),registerHandlebarsHelpers()}function registerSystemSettings(){let sysId=game.system.id||SYSTEM_ID;game.settings.register(sysId,SETTINGS_KEYS.SYSTEM_MIGRATION_VERSION,{name:"System Migration Version",scope:"world",config:!1,type:String,default:""}),game.settings.register(sysId,SETTINGS_KEYS.DISPLAYED_MESSAGES,{name:"Displayed Messages",hint:"Used to track which messages have been displayed",scope:"world",config:!1,type:Array,default:[]}),game.settings.register(sysId,SETTINGS_KEYS.CRUSHING_TABLE,{name:"SETTINGS.BLADE_RUNNER.CrushingTableName",hint:"SETTINGS.BLADE_RUNNER.CrushingTableHint",scope:"world",config:!0,type:String,default:""}),game.settings.register(sysId,SETTINGS_KEYS.PIERCING_TABLE,{name:"SETTINGS.BLADE_RUNNER.PiercingTableName",hint:"SETTINGS.BLADE_RUNNER.PiercingTableHint",scope:"world",config:!0,type:String,default:""}),game.settings.register(sysId,SETTINGS_KEYS.CRASH_TABLE,{name:"SETTINGS.BLADE_RUNNER.CrashTableName",hint:"SETTINGS.BLADE_RUNNER.CrashTableHint",scope:"world",config:!0,type:String,default:""}),game.settings.register(sysId,SETTINGS_KEYS.EDIT_NATURE_PERMISSION,{name:"SETTINGS.BLADE_RUNNER.EditNaturePermissionName",hint:"SETTINGS.BLADE_RUNNER.EditNaturePermissionHint",scope:"world",config:!0,type:Boolean,default:!1}),game.settings.register(sysId,SETTINGS_KEYS.AUTO_APPLY_DAMAGE,{name:"SETTINGS.BLADE_RUNNER.AutomaticApplyDamageName",hint:"SETTINGS.BLADE_RUNNER.AutomaticApplyDamageHint",scope:"world",config:!0,type:Boolean,default:!0}),game.settings.register(sysId,SETTINGS_KEYS.AUTO_ARMOR_ROLL,{name:"SETTINGS.BLADE_RUNNER.AutomaticArmorRollName",hint:"SETTINGS.BLADE_RUNNER.AutomaticArmorRollHint",scope:"world",config:!0,type:Boolean,default:!1}),game.settings.register(sysId,SETTINGS_KEYS.OPEN_FIRST_WEAPON_ATTACK,{name:"SETTINGS.BLADE_RUNNER.OpenFirstWeaponAttackName",hint:"SETTINGS.BLADE_RUNNER.OpenFirstWeaponAttackHint",scope:"client",config:!0,type:Boolean,default:!0}),game.settings.register(sysId,SETTINGS_KEYS.UPDATE_ACTOR_MANEUVERABILITY_ON_CREW,{name:"SETTINGS.BLADE_RUNNER.UpdateActorManeuverabilityOnCrewName",hint:"SETTINGS.BLADE_RUNNER.UpdateActorManeuverabilityOnCrewHint",scope:"world",config:!0,type:Boolean,default:!0}),game.settings.register(sysId,SETTINGS_KEYS.UPDATE_ACTOR_MANEUVERABILITY_ON_UNCREW,{name:"SETTINGS.BLADE_RUNNER.UpdateActorManeuverabilityOnUncrewName",hint:"SETTINGS.BLADE_RUNNER.UpdateActorManeuverabilityOnUncrewHint",scope:"world",config:!0,type:Boolean,default:!1}),game.settings.register(sysId,SETTINGS_KEYS.USE_ACTIVE_EFFECTS,{name:"SETTINGS.BLADE_RUNNER.UseActiveEffectsName",hint:"SETTINGS.BLADE_RUNNER.UseActiveEffectsHint",scope:"world",config:!0,type:Boolean,default:!1}),game.settings.register(sysId,SETTINGS_KEYS.DO_NOT_USE_HANDWRITTEN_FONT,{name:"SETTINGS.BLADE_RUNNER.DoNotUseHandwrittenFontName",hint:"SETTINGS.BLADE_RUNNER.DoNotUseHandwrittenFontHint",scope:"client",config:!0,type:Boolean,default:!1,onChange:s=>changeEditorFont(s)})}function changeEditorFont(useAlternateFont){let root=document.querySelector(":root"),ff=getComputedStyle(root).getPropertyValue("--font-editor");if(useAlternateFont)ff=ff.replace('"Caveat", ',"");else if(!ff.includes("Caveat"))ff='"Caveat", '+ff;else return;root.style.setProperty("--font-editor",ff)}var ROLL_TABLE_PATTERN=/\[\[\/(?:t|table) (.+?)\]\](?:{(.+?)})?/gm;function rollTableEnricher(match,_options){let tableDoc=document.createElement("span"),table=game.tables.get(match[1]);if(table||(table=game.tables.getName(match[1])),!table)return tableDoc.innerHTML=_createBrokenLink("entity-link",match[2]??"[table?]"),tableDoc;let title=match[2]??table.name;return tableDoc.innerHTML=`${FLBR.Icons.links.rolltable}${title}`,tableDoc}var DRAW_TABLE_PATTERN=/\[\[(?:t|table): (.+?)\]\](?:{(.*?)})?(?:{(.+?)})?/gm;async function drawTableEnricher(match,options){let tableDoc=document.createElement("span"),table=game.tables.get(match[1]);if(table||(table=game.tables.getName(match[1])),!table)return tableDoc.innerHTML=_createBrokenLink("entity-link",match[2]||"[table?]"),tableDoc;let title=match[2],tableDrawOptions={displayChat:!1};match[3]&&(tableDrawOptions.roll=foundry.dice.Roll.create(match[3],options.rollData));let drawResult=await table.draw(tableDrawOptions),result=drawResult.results[0];if(!result)return tableDoc.innerHTML=_createBrokenLink("entity-link",match[2]||"[result?]"),tableDoc;let htmlFormat=` `;return result.type==="text"?htmlFormat+=(title?`${title}: `:"")+(result.name?result.name:result.description):htmlFormat+=`@UUID[${result.documentUuid}]${title?`{${title}}`:""}`,htmlFormat+="",tableDoc.innerHTML=await foundry.applications.ux.TextEditor.enrichHTML(htmlFormat,{rollData:options.rollData}),tableDoc}var CHOOSER_PATTERN=/\[\[choose: (.+?) ?#(.+?)\]\](?:{(.+?)})?/gm;async function chooserEnricher(match,options){let chooseDoc=document.createElement("span"),roll=foundry.dice.Roll.create(match[1],options.rollData);await roll.roll();let choices=match[2].split("|"),index=Math.clamp(roll.total,1,choices.length)-1,result=(match[3]?`${match[3]}: `:"")+choices[index];return chooseDoc.innerHTML=`
  • ")}
  • " >${FLBR.Icons.links.choice}${result}
    `,chooseDoc}var ACTOR_PATTERN=/@BladeRunnerActor\[(.+?)\](?:{(.+?)})?/gm;async function actorEnricher(match,_options){let actorDoc=document.createElement("div"),actor=game.actors.get(match[1]);if(actor||(actor=game.actors.getName(match[1])),!actor)return actorDoc.innerHTML=_createBrokenLink("entity-link",match[2]||"[actor?]"),actorDoc;let title=match[2]||actor.name,sys=actor.system,attributes=[];for(let attr of FLBR.attributes){let value=sys.attributes[attr].value,text=game.i18n.localize(`FLBR.ATTRIBUTE.${attr.toUpperCase()}`)+` ${FLBR.dieMap.get(+value)}`;attributes.push(text)}let skills=[];for(let sk of FLBR.skills){let value=sys.skills[sk].value;if(value<=6)continue;let text=game.i18n.localize(`FLBR.SKILL.${sk.capitalize()}`)+` ${FLBR.dieMap.get(+value)}`;skills.push(text)}let specialties=[];for(let item of actor.items)item.type===ITEM_TYPES.SPECIALTY&&specialties.push(`@UUID[${item.uuid}]`);specialties.length===0&&specialties.push("\u2014");let gear=[];for(let item of actor.items)if(item.isPhysical){let text=(item.qty>1?`${item.qty}X `:"")+`@UUID[${item.uuid}]`;gear.push(text)}sys.signatureItem?.name&&gear.push(sys.signatureItem.name),gear.length===0&&gear.push("\u2014");let htmlFormat=`

    @UUID[${actor.uuid}]{${title}}

    ${sys.description?`
    ${sys.description}
    `:""}
    Attributes ${attributes.join("
    ")}
    Health ${sys.health.max}
    Resolve ${sys.resolve.max}
    Skills ${skills.join("
    ")}
    Specialties ${specialties.join("
    ")}
    Gear ${gear.join("
    ")}
    `;return actorDoc.className="flbr-enriched-actor",actorDoc.innerHTML=await foundry.applications.ux.TextEditor.enrichHTML(htmlFormat),actorDoc}var WEAPON_PATTERN=/@BladeRunnerWeapon\[(.+?)\](?:{(.+?)})?/gm;async function weaponEnricher(match,_options){let itemDoc=document.createElement("div"),item=game.items.get(match[1]);if(item||(item=game.items.getName(match[1])),!item||item.type!==ITEM_TYPES.WEAPON)return itemDoc.innerHTML=_createBrokenLink("entity-link",match[2]||"[weapon?]"),itemDoc;let title=match[2]||item.name,sys=item.system,atk=sys.attacks[item.attacks[0]?.id]||{},htmlFormat=`

    @UUID[${item.uuid}]{${title}}

    ${sys.description}
    DAMAGE: ${atk.damage}
    CRIT DIE: D${atk.crit}
    TYPE: ${game.i18n.localize(FLBR.damageTypes[atk.damageType])}
    MIN. RANGE: ${game.i18n.localize(FLBR.ranges[atk.range?.min])}
    MAX. RANGE: ${game.i18n.localize(FLBR.ranges[atk.range?.max])}
    AVAILABILITY: ${game.i18n.localize(FLBR.availabilities[sys.availability])}
    COST: ${sys.cost}
    `;return itemDoc.className="flbr-enriched-weapon flexrow",itemDoc.style.flexWrap="nowrap",itemDoc.innerHTML=await foundry.applications.ux.TextEditor.enrichHTML(htmlFormat),itemDoc}var HANDOUT_PATTERN=/@BladeRunnerHandout\[(.+?)\](?:{(.+?)})?/gm;async function handoutEnricher(match){let divDoc=document.createElement("div"),page=await foundry.utils.fromUuid(match[1]);if(!page||page.type!=="image")return divDoc.innerHTML=_createBrokenLink("entity-link",match[2]||"[handout?]"),divDoc;let title=match[2]||page.name,htmlFormat=`

    @UUID[${page.uuid}]{${title}}

    `;return divDoc.className="flbr-enriched-handout flbr-tab-box handout",divDoc.innerHTML=await foundry.applications.ux.TextEditor.enrichHTML(htmlFormat),divDoc}var BLADERUNNER_SYMBOL_PATTERN=/\[\[([SF]+)\]\]/gm;async function bladeRunnerSymbolEnricher(match){let symbolDoc=document.createElement("span");return symbolDoc.className="blade-runner-symbols",symbolDoc.innerHTML=match[1],symbolDoc}var FONT_AWESOME_ICON_PATTERN=/@FontAwesomeIcon\[(.+?)\]/gm;async function fontAwesomeIconEnricher(match){let iconDoc=document.createElement("i");return iconDoc.style.textIndent=0,iconDoc.className=match[1],iconDoc}var INLINE_ICON_IMAGE=/@IconImage\[(.+?)\](?:{(.+?)})?/gm;async function iconImageEnricher(match){let imgDoc=document.createElement("img");return imgDoc.setAttribute("src",match[1]),imgDoc.style.width="1em",imgDoc.style.height="1em",imgDoc.style.verticalAlign="middle",imgDoc.className="nopopout",match[2]&&imgDoc.setAttribute("data-tooltip",match[2]),imgDoc}function _createBrokenLink(type,title){return`${title}`}function enrichTextEditors(){CONFIG.TextEditor.enrichers.push({pattern:ROLL_TABLE_PATTERN,enricher:rollTableEnricher},{pattern:DRAW_TABLE_PATTERN,enricher:drawTableEnricher},{pattern:CHOOSER_PATTERN,enricher:chooserEnricher},{pattern:ACTOR_PATTERN,enricher:actorEnricher},{pattern:WEAPON_PATTERN,enricher:weaponEnricher},{pattern:HANDOUT_PATTERN,enricher:handoutEnricher},{pattern:BLADERUNNER_SYMBOL_PATTERN,enricher:bladeRunnerSymbolEnricher},{pattern:FONT_AWESOME_ICON_PATTERN,enricher:fontAwesomeIconEnricher},{pattern:INLINE_ICON_IMAGE,enricher:iconImageEnricher})}function registerDiceSoNice(dice3d){dice3d.addSystem({id:"blade-runner",name:"Blade Runner RPG"},"preferred"),dice3d.addColorset({name:"blade-runner-base-die",category:"Blade Runner RPG",description:"Blade Runner Base Die",foreground:"#fff",background:"#C53426",outline:"none",texture:"none",material:"metal",font:"IdentikalSans, Consolas, sans-Serif"},"default"),dice3d.addDicePreset({type:"d2",labels:range(2),system:"blade-runner",colorset:"blade-runner-base-die"},"d2"),dice3d.addDicePreset({type:"d3",labels:range(3),system:"blade-runner",colorset:"blade-runner-base-die"},"d3"),dice3d.addDicePreset({type:"d4",labels:range(4),system:"blade-runner",colorset:"blade-runner-base-die"},"d4"),dice3d.addDicePreset({type:"d6",labels:["systems/blade-runner/assets/dice/d6/br_d6_1.webp","2","3","4","5","systems/blade-runner/assets/dice/d6/br_d6_6.webp"],bumpMaps:["systems/blade-runner/assets/dice/d6/br_d6_1.webp",,,,,"systems/blade-runner/assets/dice/d6/br_d6_6.webp"],system:"blade-runner",colorset:"blade-runner-base-die"},"d6"),dice3d.addDicePreset({type:"d8",labels:["systems/blade-runner/assets/dice/d8/br_d8_1.webp","2","3","4","5","systems/blade-runner/assets/dice/d8/br_d8_6.webp","systems/blade-runner/assets/dice/d8/br_d8_7.webp","systems/blade-runner/assets/dice/d8/br_d8_8.webp"],bumpMaps:["systems/blade-runner/assets/dice/d8/br_d8_1_bump.webp",,,,,"systems/blade-runner/assets/dice/d8/br_d8_6_bump.webp","systems/blade-runner/assets/dice/d8/br_d8_7_bump.webp","systems/blade-runner/assets/dice/d8/br_d8_8_bump.webp"],system:"blade-runner",colorset:"blade-runner-base-die"},"d8"),dice3d.addDicePreset({type:"d10",labels:["systems/blade-runner/assets/dice/d10/br_d10_1.webp","2","3","4","5","systems/blade-runner/assets/dice/d10/br_d10_6.webp","systems/blade-runner/assets/dice/d10/br_d10_7.webp","systems/blade-runner/assets/dice/d10/br_d10_8.webp","systems/blade-runner/assets/dice/d10/br_d10_9.webp","systems/blade-runner/assets/dice/d10/br_d10_10.webp"],bumpMaps:["systems/blade-runner/assets/dice/d10/br_d10_1_bump.webp",,,,,"systems/blade-runner/assets/dice/d10/br_d10_6_bump.webp","systems/blade-runner/assets/dice/d10/br_d10_7_bump.webp","systems/blade-runner/assets/dice/d10/br_d10_8_bump.webp","systems/blade-runner/assets/dice/d10/br_d10_9_bump.webp","systems/blade-runner/assets/dice/d10/br_d10_10_bump.webp"],system:"blade-runner",colorset:"blade-runner-base-die"},"d10"),dice3d.addDicePreset({type:"d12",labels:["systems/blade-runner/assets/dice/d12/br_d12_1.webp","2","3","4","5","systems/blade-runner/assets/dice/d12/br_d12_6.webp","systems/blade-runner/assets/dice/d12/br_d12_7.webp","systems/blade-runner/assets/dice/d12/br_d12_8.webp","systems/blade-runner/assets/dice/d12/br_d12_9.webp","systems/blade-runner/assets/dice/d12/br_d12_10.webp","systems/blade-runner/assets/dice/d12/br_d12_11.webp","systems/blade-runner/assets/dice/d12/br_d12_12.webp"],bumpMaps:["systems/blade-runner/assets/dice/d12/br_d12_1_bump.webp",,,,,"systems/blade-runner/assets/dice/d12/br_d12_6_bump.webp","systems/blade-runner/assets/dice/d12/br_d12_7_bump.webp","systems/blade-runner/assets/dice/d12/br_d12_8_bump.webp","systems/blade-runner/assets/dice/d12/br_d12_9_bump.webp","systems/blade-runner/assets/dice/d12/br_d12_10_bump.webp","systems/blade-runner/assets/dice/d12/br_d12_11_bump.webp","systems/blade-runner/assets/dice/d12/br_d12_12_bump.webp"],system:"blade-runner",colorset:"blade-runner-base-die"},"d12"),dice3d.addDicePreset({type:"d20",labels:range(20),system:"blade-runner",colorset:"blade-runner-base-die"},"d20"),dice3d.addDicePreset({type:"d100",labels:range(9).map(i=>`${+i*10}`).concat("00"),system:"blade-runner",colorset:"blade-runner-base-die"},"d100")}function range(size,startAt=1){return[...Array(size).keys()].map(i=>`${i+startAt}`)}var item_piles_default={VERSION:"1.0.1",ACTOR_CLASS_TYPE:ACTOR_TYPES.LOOT,ITEM_CLASS_LOOT_TYPE:ITEM_TYPES.GENERIC,ITEM_CLASS_WEAPON_TYPE:ITEM_TYPES.WEAPON,ITEM_CLASS_EQUIPMENT_TYPE:ITEM_TYPES.ARMOR,ITEM_QUANTITY_ATTRIBUTE:"system.qty",ITEM_PRICE_ATTRIBUTE:"system.cost",ITEM_FILTERS:[{path:"type",filters:[ITEM_TYPES.SPECIALTY,ITEM_TYPES.CRITICAL_INJURY].join(",")}],UNSTACKABLE_ITEM_TYPES:[ITEM_TYPES.WEAPON,ITEM_TYPES.ARMOR,ITEM_TYPES.SYNTHETIC_AUGMENTATION],PILE_DEFAULTS:{merchantColumns:[{label:"FLBR.ItemAvailability",path:"system.availability",formatting:"{#}",buying:!0,selling:!0,mapping:{5:"FLBR.ITEM_AVAILABILITY.Incidental",4:"FLBR.ITEM_AVAILABILITY.Standard",3:"FLBR.ITEM_AVAILABILITY.Premium",2:"FLBR.ITEM_AVAILABILITY.Rare",1:"FLBR.ITEM_AVAILABILITY.Luxury"}},{label:" ",path:"system.consumable",formatting:"{#}",buying:!0,selling:!0,mapping:{true:'',false:""}},{label:'',path:"system.armor",formatting:"{#}",buying:!0,selling:!0,mapping:{0:"",6:"D",8:"C",10:"B",12:"A"}}]},ITEM_TRANSFORMER:async itemData=>(itemData?.system?.mounted&&(itemData.system.mounted=!1),itemData),ITEM_SIMILARITIES:["name","type"],CURRENCIES:[{type:"attribute",name:"FLBR.HEADER.ChinyenPoints",img:"icons/commodities/currency/coins-plain-stack-silver.webp",abbreviation:"{#}C\xA5",data:{path:"system.metaCurrencies.chinyen"},primary:!0,exchangeRate:1}],SECONDARY_CURRENCIES:[{type:"attribute",name:"FLBR.HEADER.PromotionPoints",img:"icons/commodities/treasure/medal-ribbon-gold-blue.webp",abbreviation:'{#}',data:{path:"system.metaCurrencies.promotion"}},{type:"attribute",name:"FLBR.HEADER.HumanityPoints",img:"icons/sundries/gaming/chess-knight-white.webp",abbreviation:'{#}',data:{path:"system.metaCurrencies.humanity"}}],VAULT_STYLES:[{path:"system.availability",value:AVAILABILITIES.LUXURY,styling:{"box-shadow":"inset 0px 0px 7px 0px rgba(255,119,0,1)"}},{path:"system.availability",value:AVAILABILITIES.RARE,styling:{"box-shadow":"inset 0px 0px 7px 0px rgba(255,0,247,1)"}},{path:"system.availability",value:AVAILABILITIES.PREMIUM,styling:{"box-shadow":"inset 0px 0px 7px 0px rgba(0,136,255,1)"}}]};async function getManual(){let compedium=game.packs.get("blade-runner.blade-runner-rpg-system");if(!compedium)return;let index=(await compedium.getIndex()).contents.find(i=>i.name==="Game System's Manual");return await compedium.getDocument(index._id)}var Modifier=class{constructor(key,value,item={},{active,name,type,description}={}){this.id=foundry.utils.randomID(),this.item=item,this._name=name??item.name,this._type=type??item.type,this._description=description??item.system?.description,this._key=key,this.value=+value||0;let keys=key.split(".");if(keys.length!==2)throw new SyntaxError(`Modifier "${this.name}" | Key invalid \u2192 key#length not equal to 2: "${key}"`);this.category=keys[0],this.target=keys[1],this.active=active??this.value<=0}get name(){return this._name??this.item?.name??this.target}get type(){return this._type??this.item?.type}get signedValue(){return this.value!==0&&!this.value?null:(this.value>=0?"+":"\u2212")+Math.abs(this.value)}get label(){return this.name+(this.value?` ${this.signedValue}`:"")}get description(){return(this._description??this.item.system?.description??"").replace(/<[^>]*>?/gm,"")}static getModifiers(item,path="system.modifiers",{targets=[],onlyActive=!1}={}){let out=[],mods=foundry.utils.getProperty(item,path);if(mods){for(let mod of Object.values(mods)){let m;try{m=new Modifier(mod.name,mod.value,item),out.push(m)}catch(error){ui.notifications.error(error.message,{permanent:!0})}}return Array.isArray(targets)||(targets=[targets]),(onlyActive||targets.length>0)&&(out=out.filter(m=>(onlyActive?m.active:!0)&&targets.includes(m.target))),out}}static getRangedCombatModifiers(){let category="combat";return[new Modifier(`${category}.outOfRange`,-1,{},{active:!1,name:game.i18n.localize("FLBR.RANGED_COMBAT.OutOfRange")}),new Modifier(`${category}.smallTarget`,-1,{},{active:!1,name:game.i18n.localize("FLBR.RANGED_COMBAT.SmallTarget")}),new Modifier(`${category}.largeTarget`,1,{},{active:!1,name:game.i18n.localize("FLBR.RANGED_COMBAT.LargeTarget")}),new Modifier(`${category}.targetBehindCover`,-1,{},{active:!1,name:game.i18n.localize("FLBR.RANGED_COMBAT.TargetBehindCover")}),new Modifier(`${category}.carefulAim`,1,{},{active:!1,name:game.i18n.localize("FLBR.RANGED_COMBAT.CarefulAim")}),new Modifier(`${category}.unseenTarget`,-1,{},{active:!1,name:game.i18n.localize("FLBR.RANGED_COMBAT.UnseenTarget")})]}};var CrewCollection=class extends foundry.utils.Collection{constructor(parentVehicle,sourcePropertyName,passengersPropertyName){super(),this.vehicle=parentVehicle,this._source=sourcePropertyName,this._passengers=passengersPropertyName}get source(){return foundry.utils.getProperty(this.vehicle,this._source)}get max(){return foundry.utils.getProperty(this.vehicle,this._passengers)}get full(){return this.size>=this.max}update(){this.clear();for(let occupant of this.source){let{id}=occupant,actor=game.actors.get(id);this.set(id,actor)}return this}async choose(options={}){if(this.size)return chooseActor(this.contents,{title:options.title??`${this.vehicle.name}: ${game.i18n.localize("FLBR.VEHICLE.ChoosePassenger")}`,notes:options.notes??game.i18n.localize("FLBR.VEHICLE.ChoosePassengerHint")})}};function getTable(idOrName){let table=game.tables.get(idOrName);return table||(table=game.tables.getName(idOrName)),table}var BladeRunnerActor=class extends Actor{get attributes(){return this.system.attributes}get skills(){return this.system.skills}get isVehicle(){return this.type===ACTOR_TYPES.VEHICLE}get isBroken(){switch(this.type){case ACTOR_TYPES.CHAR:for(let cap of Object.values(CAPACITIES)){let capacity=this.system[cap];if(capacity&&capacity.value<=0)return!0}return!1;case ACTOR_TYPES.VEHICLE:return this.system.hull.value<=0;default:return}}get maxPush(){switch(this.type){case ACTOR_TYPES.CHAR:return this.system.subtype===ACTOR_SUBTYPES.PC?FLBR.maxPushMap[this.system.nature]:0;default:return 1}}get armored(){switch(this.type){case ACTOR_TYPES.CHAR:return this.items.filter(i=>i.type===ITEM_TYPES.ARMOR&&i.qty>0).length;case ACTOR_TYPES.VEHICLE:return this.system.armor>0;default:return!1}}get healthBarColor(){let pct=this.system.health?.ratio;return foundry.utils.Color.fromRGB([1-pct/2,pct,0]).css}get resolveBarColor(){let pct=this.system.resolve?.ratio;return foundry.utils.Color.fromRGB([.5*pct,.7*pct,.5+pct/2]).css}get itemTypes(){let types=super.itemTypes;for(let type in types)types[type].sort((a,b)=>(a.sort||0)-(b.sort||0));return types}get rollData(){return this.getRollData()}getRollData(){let rollData=super.getRollData();if(this.type===ACTOR_TYPES.CHAR){for(let[k,v]of Object.entries(this.attributes))rollData[k]=v.value;for(let[k,v]of Object.entries(this.skills))rollData[k]=v.value}return rollData.maxPush=this.maxPush,rollData}prepareData(){switch(super.prepareData(),this.type){case ACTOR_TYPES.CHAR:this._prepareCharacterData();break;case ACTOR_TYPES.VEHICLE:this._prepareVehicleData();break}}_prepareCharacterData(){this._prepareCapacities(),this._prepareDrawSize()}_prepareCapacities(){for(let cap of Object.values(CAPACITIES)){let capacity=this.system[cap],capData=FLBR.capacitiesMap[cap];if(capacity&&capData){let natureModifier=FLBR.natureModifierMap[this.system.nature]?.[cap]??0,permanentLoss=capacity.permanentLoss??0,max=0;for(let attribute of capData.attributes)max+=this.getAttribute(attribute);max=Math.ceil(max/4)+natureModifier+capacity.mod+permanentLoss,max+=this.getRollModifiers({targets:[cap]}).reduce((tot,m)=>tot+m.value,0),max=Math.clamp(max,0,capData.max),capacity.max=max,capacity.value>max&&(capacity.value=max),capacity.ratio=capacity.value/capacity.max}}}_prepareDrawSize(){let drawSize=this.getRollModifiers({targets:"drawSize"}).reduce((tot,m)=>tot+m.value,0);drawSize>0&&(this.system.drawSize=drawSize+1)}_prepareVehicleData(){this._prepareHull(),this._prepareCrew(),this._prepareDrawSize()}_prepareHull(){let hull=this.system.hull;hull.value>hull.max&&(hull.value=hull.max,this.updateSource({"system.hull.value":hull.max}))}_prepareCrew(){if(!Object.hasOwn(this,"crew")){let c=new CrewCollection(this,"system.crew","system.passengers");Object.defineProperty(this,"crew",{value:c,writable:!1})}let updatedCrew=this.system.crew.filter(p=>game.actors.has(p.id));updatedCrew.length!==this.system.crew.length&&this.updateSource({"system.crew":updatedCrew}),this.crew.update()}async _preCreate(data,options,userId){await super._preCreate(data,options,userId);let updateData={"prototypeToken.displayName":CONST.TOKEN_DISPLAY_MODES.OWNER_HOVER};switch(this.type){case ACTOR_TYPES.CHAR:if(updateData["prototypeToken.displayBars"]=CONST.TOKEN_DISPLAY_MODES.OWNER,!this.system.attributes||!this.system.skills)throw new TypeError(`FLBR | "${this.type}" has No attribute nor skill`);if(foundry.utils.isEmpty(this.system.skills)){for(let attribute in this.system.attributes)updateData[`system.attributes.${attribute}.value`]=FLBR.startingAttributeLevel;for(let skill in FLBR.skillMap)updateData[`system.skills.${skill}.value`]=FLBR.startingSkillLevel}break;case ACTOR_TYPES.VEHICLE:updateData["prototypeToken.displayBars"]=CONST.TOKEN_DISPLAY_MODES.OWNER,updateData["prototypeToken.bar1.attribute"]="hull",this.img==="icons/svg/mystery-man.svg"&&(updateData.img=`systems/${SYSTEM_ID}/assets/icons/steering-wheel.svg`);break;case ACTOR_TYPES.LOOT:this.img==="icons/svg/mystery-man.svg"&&(updateData.img=`systems/${SYSTEM_ID}/assets/icons/cardboard-box-closed.svg`);break}foundry.utils.isEmpty(updateData)||await this.updateSource(updateData)}async addVehicleOccupant(actor){if(!this.isVehicle||this.crew.full)return;if(this.crew.has(actor.id))return ui.notifications.info("FLBR.VEHICLE.NotifPassengerAlreadyPresent",{localize:!0});let occupant={id:actor.id},crew=this.system.crew;return crew.push(occupant),await this.update({"system.crew":crew}),game.settings.get(SYSTEM_ID,SETTINGS_KEYS.UPDATE_ACTOR_MANEUVERABILITY_ON_CREW)&&await actor.updateCharacterManeuverability(this.system.maneuverability),crew}async removeVehicleOccupant(occupantId){if(!this.isVehicle)return;let crew=this.system.crew.filter(p=>p.id!==occupantId);return crew.length!==this.system.crew.length&&await this.update({"system.crew":crew}),game.settings.get(SYSTEM_ID,SETTINGS_KEYS.UPDATE_ACTOR_MANEUVERABILITY_ON_UNCREW)&&await game.actors.get(occupantId)?.updateCharacterManeuverability(0),crew}async updateCharacterManeuverability(value){if(this.type!==ACTOR_TYPES.CHAR)return;let mvr=FLBR.vehicleAttribute;this.attributes[mvr]?.value!==value&&await this.updateSource({[`system.attributes.${mvr}.value`]:value})}getRollModifiers(options){let modifiers=[];for(let i of this.items)if(i.hasModifier){let mods=i.getModifiers(options);mods.length>0&&modifiers.push(...mods)}return modifiers}getAttribute(attributeKey){return+this.attributes?.[attributeKey]?.value}getSkill(skillKey){return+this.skills?.[skillKey]?.value}async kill(){let capacity;switch(this.type){case ACTOR_TYPES.CHAR:capacity="health";break;case ACTOR_TYPES.VEHICLE:capacity="hull";break;default:return}await this.update({[`system.${capacity}.value`]:0})}async roll(rollData={},options={}){return options.title&&(rollData.title=options.title),rollData.title||(rollData.title=`${this.name}: ${game.i18n.localize("FLBR.SHEET_HEADER.GenericRoll")}`),rollData.modifiers||(rollData.modifiers=this.getRollModifiers()),new BRRollHandler({actor:this,dice:[],maxPush:this.maxPush,...rollData},{unlimitedPush:this.flags.bladerunner?.unlimitedPush,...options}).render(!0)}async rollStat(attributeKey,skillKey,options={}){if(!attributeKey)return this.roll(null,options);let attributeName=game.i18n.localize(`FLBR.ATTRIBUTE.${attributeKey.toUpperCase()}`),skillName=skillKey?game.i18n.localize(`FLBR.SKILL.${skillKey.capitalize()}`):null,title=`${this.name}: `;options.title?title=options.title:skillName?title+=`${skillName} (${attributeName})`:title+=attributeName;let attributeValue=this.getAttribute(attributeKey),skillValue=this.getSkill(skillKey),targets=[attributeKey];skillKey&&targets.push(skillKey);let dice=[];attributeValue&&dice.push(attributeValue),skillValue&&dice.push(skillValue);let modifiers=this.getRollModifiers({targets});return skillKey===SKILLS.FIREARMS&&modifiers.push(...Modifier.getRangedCombatModifiers()),new BRRollHandler({title,actor:this,attributeKey,skillKey,dice,modifiers,maxPush:this.maxPush},{unlimitedPush:this.flags.bladerunner?.unlimitedPush}).render(!0)}async rollResolve(){let title=game.i18n.localize("FLBR.ROLLER.ResolveTest");if(!await Dialog.confirm({title,content:`

    ${game.i18n.localize("FLBR.ROLLER.ResolveTestHint")}

    `}))return;if((await new BRRollHandler({title,actor:this,dice:[this.attributes.emp.value],maxPush:0}).executeRoll()).rolls[0].baneCount){ui.notifications.info(game.i18n.format("FLBR.ROLLER.ResolveTestFailed",{name:this.name}),{permanent:!0});let loss=+this.system.resolve.permanentLoss;return loss--,await this.update({"system.resolve.permanentLoss":loss}),loss}return 0}async rollRamming(){if(!this.isVehicle)return;let actor=await this.crew.choose();if(!actor)return;let driving=FLBR.vehicleSkill,hullDamage=Math.ceil(this.system.hull.max/2);return this.roll({title:`${this.name} | ${actor.name}: ${game.i18n.localize("FLBR.VEHICLE.Action.Ramming")} (${game.i18n.localize(`FLBR.SKILL.${driving.capitalize()}`)})`,actor,attributeKey:FLBR.vehicleAttribute,skillKey:driving,dice:[this.system.maneuverability,actor.skills[driving]?.value],modifiers:[...this.getRollModifiers(),...actor.getRollModifiers()],maxPush:actor.maxPush},{damage:hullDamage,damageType:DAMAGE_TYPES.CRUSHING,crit:Math.max(12,hullDamage*2),unlimitedPush:this.flags.bladerunner?.unlimitedPush||actor.flags.bladerunner?.unlimitedPush})}async applyDamage(damage,{capacity,ignoreArmor}={}){if(!capacity)switch(this.type){case ACTOR_TYPES.CHAR:capacity="health";break;case ACTOR_TYPES.VEHICLE:capacity="hull";break;default:return this}return this._applyDamage(damage,capacity,ignoreArmor)}async _applyDamage(damage,capacity,ignoreArmor=!1){if(damage<=0)return;if(!(capacity in this.system))throw new Error(`FLBR | BladeRunnerActor.applyDamage \u2192 Non-existent capacity "${capacity}"`);let initialDamage=damage;if(!ignoreArmor&&this.armored&&(damage-=await this.getArmorAblation()),damage>0){let max=this.system[capacity].max,oldVal=this.system[capacity].value,newVal=Math.clamp(oldVal-damage,0,max);newVal-oldVal!==0&&await this.update({[`system.${capacity}.value`]:newVal})}let template=`systems/${SYSTEM_ID}/templates/actor/actor-damage-chatcard.hbs`,chatData={content:await foundry.applications.handlebars.renderTemplate(template,{name:this.name,initialDamage,damage,deflectedDamage:initialDamage-damage,armored:this.armored,broken:this.isBroken,vroom:this.isVehicle,config:CONFIG.BLADE_RUNNER}),sound:CONFIG.sounds.notification,speaker:ChatMessage.getSpeaker({actor:this,token:this.token}),user:game.user.id};return ChatMessage.applyRollMode(chatData,game.settings.get("core","rollMode")),await ChatMessage.create(chatData),this}async getArmorAblation(){let armorAblation=0;if(this.type===ACTOR_TYPES.CHAR){let armors=this.itemTypes[ITEM_TYPES.ARMOR].filter(i=>i.qty>0);for(let armor of armors){let rollMessage=await armor.roll();rollMessage&&(game.dice3d&&game.dice3d.isEnabled()&&await game.dice3d.waitFor3DAnimationByMessageID(rollMessage.id),armorAblation+=rollMessage.rolls[0].successCount??0)}}else if(this.type===ACTOR_TYPES.VEHICLE){let armorRoll=game.bladerunner.roll.create(`2d${this.system.armor}p0`,{},{name:`${this.name}: ${game.i18n.localize("FLBR.ItemArmor")}`,yzur:!0});await armorRoll.roll();let armorRollMessage=await armorRoll.toMessage();game.dice3d&&game.dice3d.isEnabled()&&await game.dice3d.waitFor3DAnimationByMessageID(armorRollMessage.id),armorAblation=armorRoll.successCount}return armorAblation}async crashVehicle(massive=!1){if(!this.isVehicle)return;let formula=massive?FLBR.vehicleMassiveCrashDamage:FLBR.vehicleCrashDamage;if(!await Dialog.confirm({title:`${this.name}: ${game.i18n.localize("FLBR.VEHICLE.Action.Crash")}`,content:game.i18n.format("FLBR.VEHICLE.Action.CrashDialog",{damage:`${formula}`})}))return;let armorAblation=this.armored?await this.getArmorAblation():0,rollData=this.rollData;rollData.armor=armorAblation,formula+=" - @armor";let crashDamageRoll=foundry.dice.Roll.create(formula,rollData,{name:`${this.name}: ${game.i18n.localize("FLBR.VEHICLE.Action.Crash")}`});await crashDamageRoll.roll();let crashDamageRollMessage=await crashDamageRoll.toMessage({flavor:`${game.i18n.localize("FLBR.VEHICLE.Action.Crash")}: ${formula}`});game.dice3d&&game.dice3d.isEnabled()&&await game.dice3d.waitFor3DAnimationByMessageID(crashDamageRollMessage.id);let crashDamage=crashDamageRoll.total;if(crashDamage>0&&game.settings.get(SYSTEM_ID,SETTINGS_KEYS.AUTO_APPLY_DAMAGE))for(let passenger of this.crew){let attributeKey=ATTRIBUTES.AGILITY,skillKey=SKILLS.MOBILITY,mitigation=(await BRRollHandler.waitForRoll({title:`${this.name} | ${passenger.name}: Crash Damage Mitigation (MOBILITY)`,actor:passenger,attributeKey,skillKey,dice:[passenger.attributes[attributeKey].value,passenger.skills[skillKey].value],modifiers:[...passenger.getRollModifiers()],maxPush:0},{disabledPush:!0}).catch(err=>{}))?.successCount||0;await passenger.applyDamage(crashDamage-mitigation,{ignoreArmor:!0})}return await this.kill(),this}async explodeVehicle(){if(!this.isVehicle||!await Dialog.confirm({title:`${this.name}: ${game.i18n.localize("FLBR.VEHICLE.Action.Explode")}`,content:game.i18n.localize("FLBR.VEHICLE.Action.ExplodeHint")}))return;let blastPower=FLBR.vehicleExplosionBlastPower,blast=FLBR.blastPowerMap[FLBR.vehicleExplosionBlastPower],damageType=DAMAGE_TYPES.PIERCING,blastRoll=game.bladerunner.roll.create(`2d${blastPower}p0`,{},{damage:blast.damage,damageType,damageTypeName:game.i18n.localize(FLBR.damageTypes[damageType]),crit:blast.crit,yzur:!0});await blastRoll.roll();let blastRollMessage=await blastRoll.toMessage({flavor:game.i18n.localize("FLBR.VEHICLE.Action.Explode")});if(game.dice3d&&game.dice3d.isEnabled()&&await game.dice3d.waitFor3DAnimationByMessageID(blastRollMessage.id),blastRoll.successCount>0&&game.settings.get(SYSTEM_ID,SETTINGS_KEYS.AUTO_APPLY_DAMAGE)){let damage=blast.damage+(blastRoll.successCount-1)+1;for(let passenger of this.crew)await passenger.applyDamage(damage)}return await this.kill(),this}async drawCrit(damageType=DAMAGE_TYPES.CRUSHING,severity,critRollFormula){switch(this.type){case ACTOR_TYPES.CHAR:return this._drawCritForCharacter(damageType,severity,critRollFormula);case ACTOR_TYPES.VEHICLE:return this._drawCritForVehicle(severity,critRollFormula)}}async _drawCritForCharacter(damageType,severity,critRollFormula){if(this.type!==ACTOR_TYPES.CHAR)return;let index=damageType-DAMAGE_TYPES.CRUSHING,tableIds=[game.settings.get(SYSTEM_ID,SETTINGS_KEYS.CRUSHING_TABLE),game.settings.get(SYSTEM_ID,SETTINGS_KEYS.PIERCING_TABLE)],tables=tableIds.map(id=>getTable(id)).filter(Boolean);(!tables.length||index>tables.length-1)&&(tables=game.tables.contents);let{results}=await BladeRunnerDialog.drawTable(tables,{title:`${this.name}: ${game.i18n.localize("FLBR.CRIT.DrawCrit")}`,defaultSelected:tableIds[index],disableSelection:!game.user.isGM,disableFormula:!game.user.isGM,formula:critRollFormula,qty:severity}),itemUuid=await BladeRunnerDialog.choose(results.sort((a,b)=>b.range[0]-a.range[0]).map(r=>[r.documentUuid,`${r.name} (${r.range[0]})`]),`${this.name}: ${game.i18n.localize("FLBR.CRIT.ChooseCrit")}`,{icon:"fa-solid fa-burst"}),item=await foundry.utils.fromUuid(itemUuid),[crit]=await this.createEmbeddedDocuments("Item",[item]),template=`systems/${SYSTEM_ID}/templates/actor/actor-crit-chatcard.hbs`,resultText=await foundry.applications.ux.TextEditor.enrichHTML(game.i18n.format("FLBR.CHAT.CritInflicted",{name:`${this.name}`,crit:`@UUID[${crit.uuid}]`})),chatData={content:await foundry.applications.handlebars.renderTemplate(template,{img:crit.img,result:resultText}),speaker:ChatMessage.getSpeaker({actor:this,token:this.token,scene:canvas.scene}),user:game.user.id};return ChatMessage.applyRollMode(chatData,game.settings.get("core","rollMode")),await ChatMessage.create(chatData),crit}async _drawCritForVehicle(severity,critRollFormula){if(!this.isVehicle)return;let id=game.settings.get(SYSTEM_ID,SETTINGS_KEYS.CRASH_TABLE),table=getTable(id),tables=[];table?tables.push(table):tables=game.tables.contents;let{results}=await BladeRunnerDialog.drawTable(tables,{title:`${this.name}: ${game.i18n.localize("FLBR.CRIT.DrawVehicleDamage")}`,defaultSelected:tables[0].id,disableSelection:!game.user.isGM,disableFormula:!game.user.isGM,formula:critRollFormula,qty:severity}),resultIndex=await BladeRunnerDialog.choose(results.sort((a,b)=>b.range[0]-a.range[0]).map((r,i)=>{let title=r.description.split(":")[0];return[i,`${title} (${r.range[0]})`]}),`${this.name}: ${game.i18n.localize("FLBR.CRIT.ChooseVehicleDamage")}`,{icon:"fa-solid fa-car-burst"}),result=results[resultIndex],template=`systems/${SYSTEM_ID}/templates/actor/actor-crit-chatcard.hbs`,text=await foundry.applications.ux.TextEditor.enrichHTML(result.description),chatData={content:await foundry.applications.handlebars.renderTemplate(template,{img:result.img,result:text}),speaker:ChatMessage.getSpeaker({actor:this,token:this.token,scene:canvas.scene}),user:game.user.id};return ChatMessage.applyRollMode(chatData,game.settings.get("core","rollMode")),await ChatMessage.create(chatData),result.name}};var BladeRunnerItem=class extends Item{get qty(){return this.system.qty}get isPhysical(){return FLBR.physicalItems.includes(this.type)}get isConsumable(){return typeof this.system.consumable<"u"}get isOffensive(){return!!this.system.attacks}get melee(){if(!this.isOffensive)return!1;let atk=this.attacks[0]||{};return atk.min===atk.max===RANGES.ENGAGED}get rollable(){return!!this.system.actions}get hasAttack(){return this.isOffensive&&this.attacks.length>0}get hasAction(){return this.rollable&&this.actions.length>0}get hasModifier(){return this.system.modifiers?!foundry.utils.isEmpty(this.system.modifiers):!1}get detailedName(){let str="";return this.qty>1&&(str+=`${this.qty}x `),str+=this.name,str}get modifiersDescription(){if(!this.hasModifier)return;let out=[];for(let m of Object.values(this.system.modifiers))if(m&&m.name){let[t,n]=m.name.split("."),str="FLBR.";switch(t){case"attribute":str+=`ATTRIBUTE.${n.toUpperCase()}`;break;case"skill":str+=`SKILL.${n.capitalize()}`;break;case"capacity":str+=`HEADER.${n.capitalize()}`;break;case"combat":str+=`COMBAT.${n.capitalize()}`;break;default:str+=n.titleCase()}str=game.i18n.localize(str),t==="capacity"?str+=" "+Number(m.value)>0?"+1":"\u22121":str+=Number(m.value)>0?"+":"\u2212",out.push(str)}return out.join(", ")}static get CHAT_TEMPLATE(){return`systems/${game.system.id||SYSTEM_ID}/templates/item/item-chatcard.hbs`}prepareDerivedData(){if(this.system.actions){let itemActions=[];for(let[id,{type,name}]of Object.entries(this.system.actions))itemActions.push({id,type,name});this.actions=itemActions}if(this.type===ITEM_TYPES.WEAPON||this.type===ITEM_TYPES.EXPLOSIVE){let itemAttacks=[];for(let atk in this.system.attacks)itemAttacks.push({id:atk,name:this.system.attacks[atk].name});this.attacks=itemAttacks}}getModifiers(options={}){return Modifier.getModifiers(this,"system.modifiers",options)??[]}async consumeUnit(qty=1){return this.modifyNumberedProperty("qty",-qty)}async modifyNumberedProperty(key,mod,min=0,max=1/0){let currentValue=+foundry.utils.getProperty(this.system,key);if(typeof currentValue!="number")return;let newValue=Math.clamp(currentValue+mod,min,max);return await this.update({[`system.${key}`]:newValue}),newValue-currentValue}async roll(){if(this.system.consumable){if(this.qty<=0){ui.notifications.error(game.i18n.format("WARNING.NoItemUnit",{name:this.name}));return}let consumed=-await this.consumeUnit();ui.notifications.info(game.i18n.format("FLBR.ItemConsumeNotif",{name:this.name,qty:consumed}))}switch(this.type){case ITEM_TYPES.ARMOR:return this._rollArmor()}if(!this.rollable)return;let actor;if(this.actor?.isVehicle){if(actor=await this.actor.crew.choose(),!actor)return}else actor=this.actor;let actionId;this.actions.length>1?actionId=await BladeRunnerDialog.choose(this.actions.map(a=>{let actData=this.system.actions[a.id],itemAction=new ItemAction(actData.type,actData);return[a.id,itemAction.title]}),`${this.detailedName}: ${game.i18n.localize("FLBR.DIALOG.ChooseAction")}`):actionId=this.actions[0]?.id;let action=this.system.actions[actionId];if(!action){ui.notifications.warn("WARNING.NoItemAction",{localize:!0});return}if(action.type===ItemAction.Types.RUN_MACRO){let macro=game.macros.get(action.macro);if(macro||(macro=game.macros.getName(action.macro)),!macro){ui.notifications.warn(game.i18n.format("WARNING.ItemActionMacroNotFound",{macro:action.macro}));return}return macro.execute()}let attack;if(this.isOffensive){let attackId;this.attacks.length>1?attackId=await BladeRunnerDialog.choose(this.attacks.map(a=>{let atk=new ItemAttack(this.system.attacks[a.id]);return[a.id,atk.title]}),`${this.detailedName}: ${game.i18n.localize("FLBR.DIALOG.ChooseAttack")}`):attackId=this.attacks[0]?.id,attack=this.system.attacks[attackId]}let attributeKey=action.attribute,skillKey=action.skill,attributeName=game.i18n.localize(`FLBR.ATTRIBUTE.${attributeKey.toUpperCase()}`),skillName=skillKey?game.i18n.localize(`FLBR.SKILL.${skillKey.capitalize()}`):null,title=(this.actor?`${this.actor.name}: `:"")+`${this.detailedName} (${attributeName}${skillKey?` + ${skillName}`:""})`+(attack?` \u2192 ${attack.name}`:""),attributeValue=actor?.getAttribute(attributeKey),skillValue=actor?.getSkill(skillKey),targets=[];attributeKey&&targets.push(attributeKey),skillKey&&targets.push(skillKey);let dice=[];attributeValue&&dice.push(attributeValue),skillValue&&dice.push(skillValue);let modifiers=actor?.getRollModifiers({targets})??[];return skillKey===SKILLS.FIREARMS&&modifiers.push(...Modifier.getRangedCombatModifiers()),new BRRollHandler({title,actor,attributeKey,skillKey,dice,items:[this],modifiers,maxPush:actor?.maxPush},{damage:attack?.damage,damageType:attack?.damageType,crit:attack?.crit,unlimitedPush:actor?.flags.bladerunner?.unlimitedPush}).render(!0)}_rollArmor(){return this._rollSpecial(this.system.armor)}_rollExplosive(){return this._rollSpecial(this.system.blast)}async _rollSpecial(value){let autoArmorRoll=this.type===ITEM_TYPES.ARMOR&&game.settings.get(game.system.id,SETTINGS_KEYS.AUTO_ARMOR_ROLL),title=(this.actor?`${this.actor.name}: `:"")+game.i18n.localize(`TYPES.Item.${this.type}`);return autoArmorRoll||await Dialog.confirm({title,content:`

    ${game.i18n.format("FLBR.ROLLER.RollSpecialHint",{name:`${this.name}`})}

    `})?new BRRollHandler({title:this.name,actor:this.actor,dice:[value,value],items:[this],maxPush:0}).executeRoll():void 0}async toMessage(messageData={},{rollMode,create=!0}={}){let content=await foundry.applications.handlebars.renderTemplate(this.constructor.CHAT_TEMPLATE,{name:this.name,img:this.img,type:this.type,system:foundry.utils.duplicate(this.system),link:this.link,inActor:!!this.actor,showProperties:this.type!==ITEM_TYPES.GENERIC||this.hasModifier,isOffensive:this.isOffensive,hasAttack:this.hasAttack,hasModifier:this.hasModifier,modifiersDescription:this.modifiersDescription,config:CONFIG.BLADE_RUNNER});messageData=foundry.utils.mergeObject({user:game.user.id,speaker:ChatMessage.getSpeaker(),content,sound:CONFIG.sounds.notification},messageData);let cls=getDocumentClass("ChatMessage"),msg=new cls(messageData);return rollMode==null&&(rollMode=game.settings.get("core","rollMode")),rollMode&&msg.applyRollMode(rollMode),create?cls.create(msg):msg.toObject()}};function semverComp(min,curr,max,opt={}){if(!min&&!max||!curr)throw new Error(`Missing Comparators. min ${min}; curr ${curr}; max ${max}`);return min=min&&coerceNum(min),curr=curr&&coerceNum(curr),max=max&&coerceNum(max),min&&max&&opt.eqMin&&opt.eqMax?min===curr&&curr===max:min&&opt.eqMin?min===curr:max&&opt.eqMax?max===curr:(min?opt.gEqMin?min=min<=curr:min=minparseInt(v));if(array.some(v=>isNaN(v))||array.length!==3)throw new Error(`Invalid SemVer string: ${string}`);return array[0]=array[0]*1e6,array[1]=array[1]*1e3,array.reduce((sum,val)=>sum+=val)}async function displayMessages(){(await fetch(`systems/${SYSTEM_ID}/assets/messages/messages.jsonc`).then(resp=>resp.text()).then(jsonc=>JSON.parse(stripJSON(jsonc)))).forEach(message=>{handleDisplay(message)})}var stripJSON=data=>data.replace(/[^:]\/\/(.*)/g,""),handleDisplay=msg=>{let{content,title,type}=msg;if(isCurrent(msg)){if(type==="prompt")return displayPrompt(title,content);if(type==="chat")return sendToChat(title,content)}},isCurrent=msg=>{let isDisplayable=!msg.display==="once"||!hasDisplayed(msg.title),correctCoreVersion=foundry.utils.isNewerVersion(msg["max-core-version"]??"100.0.0",game.version)&&foundry.utils.isNewerVersion(game.version,msg["min-core-version"]??"0.0.0"),correctSysVersion=semverComp(msg["min-sys-version"]??"0.0.0",game.system.version,msg["max-sys-version"]??"100.0.0",{gEqMin:!0});return isDisplayable&&correctCoreVersion&&correctSysVersion},hasDisplayed=identifier=>!!game.settings.get(SYSTEM_ID,SETTINGS_KEYS.DISPLAYED_MESSAGES)?.includes(identifier),displayPrompt=(title,content)=>(content=content.replace("{name}",game.user.name),Dialog.prompt({title,content:`${content}`,label:"Understood!",options:{width:600,classes:[SYSTEM_ID,"dialog"]},callback:()=>setDisplayed(title)})),sendToChat=(title,content)=>{content=content.replace("{name}",game.user.name),setDisplayed(title);let footer=`
    ${game.i18n.localize("NUE.FirstLaunchHint")}
    `;return ChatMessage.create({whisper:[game.user.id],speaker:{alias:"Blade Runner RPG"},flags:{core:{canPopout:!0}},title,content:`

    ${title}

    ${content}${footer}
    `})},setDisplayed=async identifier=>{let settings=game.settings.get(SYSTEM_ID,SETTINGS_KEYS.DISPLAYED_MESSAGES)||[];settings.push(identifier),await game.settings.set(SYSTEM_ID,SETTINGS_KEYS.DISPLAYED_MESSAGES,settings.flat())};Hooks.once("init",async()=>{YearZeroRollManager.register("br",{"Roll.chatTemplate":"systems/blade-runner/templates/components/roll/roll-chatcard.hbs","Roll.tooltipTemplate":"systems/blade-runner/templates/components/roll/roll-chatcard-tooltip-partial.hbs","Roll.infosTemplate":"systems/blade-runner/templates/components/roll/roll-chatcard-infos-partial.hbs","Icons.br.base.1":"F"},{index:1}),foundry.dice.Roll.prototype.constructor.create=function(formula,data={},options={}){let n=options.yzur??("game"in data||"game"in options||"maxPush"in options||/np|p(?:\d+|@maxPush)/i.test(formula))?1:0,cls=CONFIG.Dice.rolls[n];return new cls(formula,data,options)},game.bladerunner={config:FLBR,roll:YearZeroRoll,roller:BRRollHandler,dialog:BladeRunnerDialog,macros:{rollAction,rollDice:showRollDialog,rollItem,rollStat,displayManual:async()=>(await getManual()).sheet.render(!0)},actions:new ActionCollection(FLBR.Actions.map(a=>[a.id,a]))},CONFIG.BLADE_RUNNER=FLBR,CONFIG.Actor.documentClass=BladeRunnerActor,CONFIG.Item.documentClass=BladeRunnerItem,CONFIG.Combat.initiative={formula:"1d10 + (@agi / 100)",decimals:2},registerSheets(),registerSystemSettings(),enrichTextEditors(),await initializeHandlebars(),Object.defineProperty(game,"vehicles",{enumerable:!0,get:()=>new Collection(game.actors.filter(a=>a.isVehicle).map(a=>[a.id,a]))})});Hooks.once("ready",()=>{setupMacroFolder(),Hooks.on("hotbarDrop",(_bar,data,slot)=>createBladeRunnerMacro(data,slot)),displayMessages(),registerCustomItemTypesTemplates(),Hooks.callAll("bladeRunnerReady",game.bladerunner,CONFIG.BLADE_RUNNER),game.settings.get(SYSTEM_ID,SETTINGS_KEYS.DO_NOT_USE_HANDWRITTEN_FONT)&&changeEditorFont(!0)});Hooks.once("diceSoNiceReady",dice3d=>registerDiceSoNice(dice3d));Hooks.once("yzeCombatReady",yzec=>yzec.register({actorDrawSizeAttribute:"system.drawSize"}));Hooks.once("item-piles-ready",()=>game.itempiles.API.addSystemIntegration(item_piles_default));Hooks.on("renderItemSheet",(app,_html)=>{app._element[0].style.height="auto"});Hooks.on("updateActor",(actor,updateData,_options,_userId)=>{if(foundry.utils.hasProperty(updateData,`system.${CAPACITIES.HEALTH}`)||foundry.utils.hasProperty(updateData,`system.${CAPACITIES.RESOLVE}`)||foundry.utils.hasProperty(updateData,"system.hull")){if(actor.isBroken){let statusCondition=game.i18n.localize(`FLBR.${actor.isVehicle?"Wrecked":"Broken"}`);ui.notifications.error(game.i18n.format("FLBR.SomeoneIsSomething",{name:`${actor.name}`,status:statusCondition.toLowerCase()}))}if(actor.type===ACTOR_TYPES.CHAR){let vehicles=game.vehicles.filter(v=>v.sheet?._state===Application.RENDER_STATES.RENDERED);for(let vehicle of vehicles)vehicle.crew.has(actor.id)&&vehicle.sheet.render(!0)}}});Hooks.on("deleteActor",async actor=>{if(actor.type===ACTOR_TYPES.CHAR){let vehicles=game.vehicles;for(let vehicle of vehicles)if(vehicle.crew.has(actor.id)){let crew=vehicle.system.crew.filter(p=>p.id!==actor.id);await vehicle.update({"system.crew":crew})}}});Hooks.on("getChatMessageContextOptions",addChatMessageContextOptions);Hooks.on("renderChatMessageHTML",(_msg,html,_data)=>addChatListeners(html));Hooks.on("renderChatMessageHTML",(_msg,html,_data)=>hideChatActionButtons(html));Hooks.on("chatMessage",async(_chatlog,content,_chatData)=>{let regex=/^\/([a-z]+)(?: (.+))?$/i;if(content.match(regex)){let[,command,args]=regex.exec(content);if(command==="table"||command==="t"){let table=game.tables.get(args);if(table||(table=game.tables.getName(args)),table)return await table.draw(),!1}return!0}});