${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| Attributes | ${attributes.join(" ")} |
| Health | ${sys.health.max} |
| Resolve | ${sys.resolve.max} |
| Skills | ${skills.join(" ")} |
| Specialties | ${specialties.join(" ")} |
| Gear | ${gear.join(" ")} |
| 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} |
${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=min
${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=``;return ChatMessage.create({whisper:[game.user.id],speaker:{alias:"Blade Runner RPG"},flags:{core:{canPopout:!0}},title,content:`