diff --git a/css/abfalter.css b/css/abfalter.css index a08cdb0..e735e81 100644 --- a/css/abfalter.css +++ b/css/abfalter.css @@ -3829,12 +3829,20 @@ h6 { border: 1px solid var(--boxColor); } .weapon-item .weaponSubHeaderContainer { - display: grid; - grid-template-columns: 1fr auto; - align-items: center; + display: flex; width: 100%; padding: 5px 0 0 0; } +.wepSubLeft { + display: flex; + justify-content: flex-start; + width: 50%; +} +.wepSubRight { + display: flex; + justify-content: flex-end; + width: 50%; +} .weaponSubTrap { display: flex; align-items: center; @@ -3851,16 +3859,15 @@ h6 { display: flex; align-items: center; white-space: nowrap; - justify-self: end; } .weaponSubThrow > span:nth-of-type(2) { - padding: 0 5px 0 3px; + padding: 0 3px 0 5px; } .weaponSubThrow > a { font-size: 13px; } -.weaponSubThrow > span:nth-of-type(3) { - padding: 0 2px 0 2px; +.weaponSubThrow > span:nth-of-type(1) { + padding: 0 5px; } /* #endregion */ @@ -5966,7 +5973,7 @@ h6 { width: 5%; } /* #endregion */ -/* #region Weapon Attack Prompt */ +/* #region Weapon Attack Prompt & Chat Card */ .wepAtkDiceRoll { padding: 0 3%; } @@ -5989,4 +5996,63 @@ h6 { .wepAtkDiceRoll > label > select { width: 45%; } + +.weaponChatRollMsg > div:first-of-type { + display: grid; + font-size: 23px; + justify-items: center; +} +.weaponChatRollMsg > div:first-of-type > span:nth-of-type(2) { + text-decoration: underline; + font-style: italic; + font-size: 15px; +} +.chatAtkRoll { + font-size: 17px; + display: flex; + justify-content: space-between; +} +.chatAtkRoll > span:nth-of-type(1) { + padding-left: 7%; + max-width: 75%; +} +.chatAtkRoll > span:nth-of-type(2) { + padding-right: 7%; + align-self: center; +} +.weaponChatRollMsg > div:nth-last-of-type(2) { + border-image: url(../img/border.png) 10 stretch; + border-top: 5px solid black; + border-bottom: 5px solid black; + margin-top: 3px; + margin-bottom: 3px; +} + + + +.atkCustomTitleContainer { + position: relative; +} +.atkCustomTitle { + visibility: hidden; + opacity: 0; + background-color: #333; + color: #fff; + text-align: center; + border-radius: 4px; + padding: 5px; + position: absolute; + top: 100%; /* Position it below the container */ + z-index: 10; + left: 50%; + width: 200px; + transform: translateX(-50%); + transition: opacity 0.2s ease-in-out; + font-size: 14px; + pointer-events: none; +} +.atkCustomTitleContainer:hover .atkCustomTitle { + visibility: visible; + opacity: 1; +} /* #endregion */ \ No newline at end of file diff --git a/lang/en.json b/lang/en.json index ab39dd4..2420e46 100644 --- a/lang/en.json +++ b/lang/en.json @@ -798,6 +798,8 @@ "trapRoll": "Trap opp. rolls are", "fortitudeShort": "Fort", "breakageShort": "Break", + "targetAim": "Direct atk. target", + "armoryTab": { "wearArmor": "Wear Armor", diff --git a/module/abfalter.js b/module/abfalter.js index 7b2a91a..adfc32a 100644 --- a/module/abfalter.js +++ b/module/abfalter.js @@ -933,11 +933,11 @@ class weaponDataModel extends foundry.abstract.DataModel { quantityConsumed: makeBoolField(), consumedValue: makeIntField(), ignorePrecision: makeBoolField(), - ignoreVorpal: makeBoolField(), - ignoreTrapping: makeBoolField(), + ignoreVorpal: makeBoolField(false), + ignoreTrapping: makeBoolField(false), trappingType: makeBoolField(), trappingValue: makeIntField(), - parentPercision: makeBoolField(), + parentPrecision: makeBoolField(), parentVorpal: makeBoolField(), parentTrapping: makeBoolField(), parentThrowable: makeBoolField(), diff --git a/module/chat.js b/module/chat.js index 0f71a59..3e28812 100644 --- a/module/chat.js +++ b/module/chat.js @@ -1,10 +1,14 @@ import { openRollFunction } from "./diceroller.js"; +import { wepOpenRollFunction } from "./diceroller.js"; import { fumbleRollFunction } from "./diceroller.js"; export function addChatListeners(html, _msg) { html.find('button.secOpenRoll').click(ev => { openRollFunction(_msg.message); }); + html.find('button.wepOpenRoll').click(ev => { + wepOpenRollFunction(_msg.message); + }); html.find('button.secFumbleRoll').click(ev => { fumbleRollFunction(_msg.message); diff --git a/module/config.js b/module/config.js index 1626daf..2fe6dd2 100644 --- a/module/config.js +++ b/module/config.js @@ -529,6 +529,9 @@ export const abfalter = { activeActionMod: "abfalter.activeActionMod", directedAttackPrompt: "abfalter.directedAttackPrompt", trapRoll: "abfalter.trapRoll", + fortitudeShort: "abfalter.fortitudeShort", + breakageShort: "abfalter.breakageShort", + targetAim: "abfalter.targetAim", }; abfalter.kiTab = { kiAbilities: "abfalter.kiTab.kiAbilities", diff --git a/module/diceroller.js b/module/diceroller.js index 20c19a7..a4534a2 100644 --- a/module/diceroller.js +++ b/module/diceroller.js @@ -149,7 +149,6 @@ async function abilityRoll(html, actorData, finalValue, label) { roll: rollResult.rolledDice, total: rollResult._total, doubles: rollResult.doubles, openRange: rollResult.openRange, label: label, fumbleLevel: rollResult.fumbleLevel, fumble: rollResult.fumble, explode: rollResult.explode, result: rollResult.result, color: rollResult.color }; - console.log(rollData); const template = "systems/abfalter/templates/dialogues/abilityRoll.hbs" const content = await renderTemplate(template, { rollData: rollData, label: label, actor: actorData }); const chatData = { @@ -231,7 +230,7 @@ async function rollCombatWeapon(html, actorData, finalValue, label, complex) { } export async function openRollFunction(msg) { - let actorData = msg.flags.actorData; + let actor = msg.flags.actor; let num = msg.flags.num; let oldData = msg.flags.rollData[num]; let baseDice = "1d100"; @@ -243,7 +242,6 @@ export async function openRollFunction(msg) { rollResult.color = "normalRoll"; let isDouble = rollResult.rolledDice % 11 === 0 && rollResult.rolledDice <= 88; if (rollResult.rolledDice > oldData.roll) { - if (oldData.doubles === true) { if (isDouble === true) { rollResult.color = "openRoll"; @@ -261,7 +259,6 @@ export async function openRollFunction(msg) { } else { rollResult.color = "normalRoll"; } - msg.flags.rollData[num] = { roll: oldData.rolledDice, total: oldData.total, doubles: null, openRange: null, label: oldData.label, explode: false, result: oldData.result, color: oldData.color @@ -273,8 +270,16 @@ export async function openRollFunction(msg) { }; const rollData = msg.flags.rollData; - const template = "systems/abfalter/templates/dialogues/abilityRoll.hbs" - const content = await renderTemplate(template, { rollData: msg.flags.rollData, actor: actorData }); + let template; + switch (msg.flags.type) { + case "weapon": + template = "systems/abfalter/templates/dialogues/diceRolls/weaponRoll.hbs"; + break; + default: + template = "systems/abfalter/templates/dialogues/abilityRoll.hbs"; + break; + } + const content = await renderTemplate(template, { rollData: msg.flags.rollData, actor: actor }); game.messages.get(msg._id).update({ content: content, flags: { rollData, num} @@ -377,14 +382,26 @@ export async function openMeleeWeaponAtkDialogue(actor, label, wepId) { let confirmed = false; const weapon = actor.items.get(wepId); if (event.shiftKey) { - console.log('shift key held, skipping dialog.'); - return; //TO DO: Implement a way to skip the dialog + console.log('shift key held, skipping attack dialog.'); + const basicAttackDetails = { + label: game.i18n.localize("abfalter.attack"), + name: "", + base: weapon.system.derived.baseAtk, + value: weapon.system.derived.baseAtk, + formula: `${weapon.system.derived.baseAtk}(${game.i18n.localize("abfalter.value")})`, + dmg: weapon.system.melee.baseDmg, + dmgType: weapon.system.primDmgT, + atPen: weapon.system.melee.finalATPen, + target: game.i18n.localize("abfalter.none"), + }; + weaponRoll(actor, weapon, basicAttackDetails); + return; } const attacks = weapon.system.attacks; if (attacks.length === 0) { - console.log("No Attacks Found"); + console.log("No Attacks Found, using default attack"); openModifierDialogue(actor, weapon.system.derived.baseAtk, "Attack", "combatRoll"); - return; //TO DO: Implement default values + return; } const template = "systems/abfalter/templates/dialogues/weaponPrompts/meleeAtk.hbs"; @@ -410,12 +427,9 @@ export async function openMeleeWeaponAtkDialogue(actor, label, wepId) { const modifierInput = html.find('#modifierMod'); const fatigueDropdown = html.find('#fatigueDropdown'); const atkDmgTypeDropdown = html.find('#atkDmgTypeDropdown'); - const directedAtkDropdown = html.find('#directedAtkDropdown'); - const fatigueValue = actor.system.fatigue.value; const maxFatigue = actor.system.kiAbility.kiUseOfEne.status ? 5 : 2; - let isPrecise = weapon.system.info.precision && !attacks[usedIndex].ignorePrecision; const directedAtk = [ {tag: 'none', name: game.i18n.localize('abfalter.none'), penalty: 0}, {tag: 'head', name: game.i18n.localize('abfalter.head'), penalty: -60}, @@ -445,10 +459,10 @@ export async function openMeleeWeaponAtkDialogue(actor, label, wepId) { ELE: game.i18n.localize('abfalter.armoryTab.ele'), ENE: game.i18n.localize('abfalter.armoryTab.ene') }; - let isVorpal = weapon.system.info.vorpal && !attacks[usedIndex].ignoreVorpal; const vorpalLocation = weapon.system.info.vorpalLocation; const vorpalModifier = weapon.system.info.vorpalMod; - + let isPrecise = weapon.system.info.precision && !attacks[usedIndex].ignorePrecision; + let isVorpal = weapon.system.info.vorpal && !attacks[usedIndex].ignoreVorpal; let wepValue = 0; attacks.forEach((attack, index) => { @@ -552,10 +566,6 @@ export async function openMeleeWeaponAtkDialogue(actor, label, wepId) { const damageNum = html.find('#damageNum'); const atPenNum = html.find('#atPenNum'); - const isThrowing = html.find('#isThrowing'); - const infiniteAmmo = html.find('#infiniteAmmo'); - const isTrapping = html.find('#isTrapping'); - isPrecise = weapon.system.info.precision && !attacks[usedIndex].ignorePrecision; isVorpal = weapon.system.info.vorpal && !attacks[usedIndex].ignoreVorpal; populateDirectedAtkDropdown(); //Repopulate Dropdown in-case precision/vorpal rule changed. @@ -569,10 +579,6 @@ export async function openMeleeWeaponAtkDialogue(actor, label, wepId) { damageNum.text(selectedAttack.finalDamage); // Update dmg span atPenNum.text(selectedAttack.finalAtPen); // Update At pen span - isThrowing.bool(weapon.system.melee.throwable && !selectedAttack.ignoreThrown); // Update thoriwng bool - infiniteAmmo.bool(selectedAttack.quantityConsumed); // Update ammo bool - isTrapping.bool(weapon.system.melee.trapping && !selectedAttack.ignoreTrapping); // Update trapping bool - wepValue = selectedAttack.finalAttack; updateFinalValue(); }); @@ -585,8 +591,8 @@ export async function openMeleeWeaponAtkDialogue(actor, label, wepId) { const selectedPenalty = parseInt(selectedOption.data('penalty'), 10); fatigueUsed = fatigueValue; - finalValue = wepValue + selectedModifier + (fatigueValue * 15) + modifierValue + selectedPenalty; - + finalValue = wepValue + (fatigueValue * 15) + modifierValue + selectedPenalty + selectedModifier; + finalFormula = `${wepValue}(Value) + ${fatigueValue * 15}(Fatigue) + ${modifierValue}(Mod) + ${selectedPenalty}(Aim) + ${selectedModifier}(Action)`; const rollButton = html.closest('.dialog').find('.dialog-button:first'); rollButton.text(`${game.i18n.localize("abfalter.dialogs.roll")}: ${finalValue}`); } @@ -603,14 +609,284 @@ export async function openMeleeWeaponAtkDialogue(actor, label, wepId) { if (confirmed) { actor.update({ "system.fatigue.value": Math.floor(actor.system.fatigue.value - fatigueUsed) }); weapon.update({ 'system.info.lastWepUsed': usedIndex, 'system.melee.throwQuantity': Math.floor(weapon.system.melee.throwQuantity - ammoUsed) }); - console.log('finished'); - //abilityRoll(html, actor, finalValue, "Attack"); + const attackDetails = { + label: game.i18n.localize("abfalter.attack"), + name: attacks[usedIndex].name, + base: weapon.system.derived.baseAtk, + value: finalValue, + formula: finalFormula, + dmg: parseInt(html.find('#damageNum').text(), 10), + dmgType: html.find('#atkDmgTypeDropdown').val(), + atPen: parseInt(html.find('#atPenNum').text(), 10), + target: html.find('#directedAtkDropdown').val(), + }; + weaponRoll(actor, weapon, attackDetails); + console.log('Attack Handle Finished'); } } }).render(true); } +async function weaponRoll(actor, weapon, attackDetails) { + let baseDice = "1d100"; + let rollFormula = `${baseDice} + ${attackDetails.value}`; + const rollResult = await new Roll(rollFormula, actor).roll(); + rollResult.rolledDice = rollResult.total - attackDetails.value; + attackDetails.formula = `(${rollResult.rolledDice}) + ${attackDetails.formula}`; + attackDetails.wepName = weapon.name; + + let fumbleRange = weapon.system.derived.baseFumbleRange; + if (attackDetails.base > 199 && fumbleRange > 1) { + fumbleRange -= 1; + } + rollResult.doubles = actor.system.rollRange.doubles; + rollResult.color = ""; + rollResult.fumbleLevel = 0; + rollResult.fumble = false; + rollResult.explode = false; + rollResult.openRange = weapon.system.derived.baseOpenRollRange; + + if (rollResult.rolledDice <= fumbleRange) { + rollResult.color = "fumbleRoll"; + rollResult.fumble = true; + while (fumbleRange > rollResult.rolledDice) { + rollResult.fumbleLevel += 15; + fumbleRange--; + } + } else if (rollResult.rolledDice >= rollResult.openRange) { + rollResult.color = "openRoll"; + rollResult.explode = true; + } else { + rollResult.color = "normalRoll"; + } + if (rollResult.doubles === true) { + if (rollResult.rolledDice % 11 === 0 && rollResult.rolledDice <= 88) { + rollResult.color = "openRoll"; + rollResult.explode = true; + } + } + + let num = 0; + let type = "weapon"; + const rollData = []; + rollData[0] = { + roll: rollResult.rolledDice, total: rollResult._total, doubles: rollResult.doubles, openRange: rollResult.openRange, fumbleLevel: rollResult.fumbleLevel, + fumble: rollResult.fumble, explode: rollResult.explode, color: rollResult.color, formula: attackDetails.formula, label: `${attackDetails.name} ${attackDetails.label}` + }; + + const template = "systems/abfalter/templates/dialogues/diceRolls/weaponRoll.hbs" + const content = await renderTemplate(template, { rollData: rollData, actor: actor, attackDetails: attackDetails }); + const chatData = { + user: game.user.id, + speaker: ChatMessage.getSpeaker({ actor: actor }), + sound: CONFIG.sounds.dice, + content: content, + rolls: [rollResult], + flags: { attackDetails, rollData, actor, num, type } + }; + ChatMessage.applyRollMode(chatData, game.settings.get("core", "rollMode")); + ChatMessage.create(chatData); +} + +export async function wepOpenRollFunction(msg) { + let actor = msg.flags.actor; + let num = msg.flags.num; + let oldData = msg.flags.rollData[msg.flags.num]; + + let baseDice = "1d100"; + let rollFormula = `${baseDice} + ${oldData.total}`; + let rollResult = await new Roll(rollFormula).roll(); + rollResult.rolledDice = rollResult.total - oldData.total; + let formula = `(${rollResult.rolledDice}) + ${oldData.total}(Previous Roll)`; + rollResult.rolledDice = rollResult.total - oldData.total; + rollResult.openRange = oldData.openRange; + rollResult.color = "normalRoll"; + let isDouble = rollResult.rolledDice % 11 === 0 && rollResult.rolledDice <= 88; + if (rollResult.rolledDice > oldData.roll) { + if (oldData.doubles === true) { + if (isDouble === true) { + rollResult.color = "openRoll"; + rollResult.explode = true; + } else if (rollResult.rolledDice >= rollResult.openRange) { + rollResult.color = "openRoll"; + rollResult.explode = true; + } + } else { + if (rollResult.rolledDice >= rollResult.openRange) { + rollResult.color = "openRoll"; + rollResult.explode = true; + } + } + } else { + rollResult.color = "normalRoll"; + } + msg.flags.rollData[num].doubles = null; + msg.flags.rollData[num].openRange = null; + msg.flags.rollData[num].explode = false; + num = num + 1; + msg.flags.rollData[num] = { + roll: rollResult.rolledDice, total: rollResult._total, doubles: oldData.doubles, openRange: oldData.openRange, label: `Open Roll #${num}`, + explode: rollResult.explode, formula: formula, color: rollResult.color + }; + + const rollData = msg.flags.rollData; + let template; + switch (msg.flags.type) { + case "weapon": + template = "systems/abfalter/templates/dialogues/diceRolls/weaponRoll.hbs"; + break; + default: + template = "systems/abfalter/templates/dialogues/abilityRoll.hbs"; + break; + } + const content = await renderTemplate(template, { rollData: msg.flags.rollData, actor: actor, attackDetails: msg.flags.attackDetails }); + game.messages.get(msg._id).update({ + content: content, + flags: { rollData, num} + }); +} + export async function openMeleeTrapDialogue(actor, label, wepId) { - console.log("Trap Handle Test Start"); + let confirmed = false; + const weapon = actor.items.get(wepId); + const attacks = weapon.system.attacks; + + if (attacks.length === 0) { + console.log("No Attacks Found, using default trap"); + ui.notifications.error("Must have an attack created under the attacks tab to use Trapping."); + //function here + return; + } + + //Values to send to roll function or actor update + let usedIndex = (weapon.system.info.lastWepUsed < attacks.length) ? weapon.system.info.lastWepUsed : 0; + let trapType = attacks[usedIndex].trappingType; + let finalValue = 0; + let finalFormula = ""; + + if (event.shiftKey) { + console.log('shift key held, skipping trap dialog.'); + const basisTrapDetails = { + label: `${attacks[usedIndex].name} ${game.i18n.localize("abfalter.trap")}`, + name: attacks[usedIndex].name, + wepName: weapon.name, + value: attacks[usedIndex].trappingValue, + formula: `${attacks[usedIndex].trappingValue}(Value)`, + type: attacks[usedIndex].trappingType + }; + trapRoll(actor, basisTrapDetails); + return; + } + + + + const template = "systems/abfalter/templates/dialogues/weaponPrompts/trapAtk.hbs"; + const html = await renderTemplate(template, {weapon: weapon}, {attacks: attacks}, {label: label}); + + new diceDialog({ + title: "Trap Attack", + content: html, + buttons: { + roll: { label: game.i18n.localize('abfalter.dialogs.roll'), callback: () => confirmed = true }, + cancel: { label: game.i18n.localize('abfalter.dialogs.cancel'), callback: () => confirmed = false } + }, + render: (html) => { + const attackSelect = html.find('#attackSelect'); + const modifierInput = html.find('#modifierMod'); + let trapValue = attacks[usedIndex].trappingValue; + let usedFormula = "" + + attacks.forEach((attack, index) => { + const option = document.createElement('option'); + option.value = index; + option.text = attack.name; + attackSelect.append(option); + }); + attackSelect.val(usedIndex); //Default to last used attack + + attackSelect.change(function() { + const selectedIndex = $(this).val(); + usedIndex = selectedIndex; + const selectedAttack = attacks[selectedIndex] + + trapValue = selectedAttack.trappingValue; + trapType = selectedAttack.trappingType; + + updateFinalValue(); + }); + + function updateFinalValue() { + const modifierValue = parseInt(modifierInput.val(), 10) || 0; + finalValue = trapValue + modifierValue; + finalFormula = `${trapValue}(Value) + ${modifierValue}(Mod)`; + if (trapType === true) { + usedFormula = `${finalValue}`; + } else { + usedFormula = `1d10 + ${finalValue}`; + } + + const rollButton = html.closest('.dialog').find('.dialog-button:first'); + rollButton.text(`${game.i18n.localize("abfalter.dialogs.roll")}: ${usedFormula}`); + } + + modifierInput.on('input', updateFinalValue); + attackSelect.trigger('change'); + }, + close: html => { + console.log('Trap Handle Finished'); + const trapDetails = { + label: `${attacks[usedIndex].name} ${game.i18n.localize("abfalter.trap")}`, + name: attacks[usedIndex].name, + wepName: weapon.name, + value: finalValue, + formula: finalFormula, + type: trapType + } + trapRoll(actor, trapDetails); + } + }).render(true); return; +} + +async function trapRoll(actor, trapDetails) { + let baseDice = "1d10"; + let rollFormula = (trapDetails.type === true) ? `${trapDetails.value}` : `${baseDice} + ${trapDetails.value}`; + + const rollResult = await new Roll(rollFormula, actor).roll(); + rollResult.rolledDice = rollResult.total - trapDetails.value; + + rollResult.color = ""; + rollResult.fumble = false; + rollResult.explode = false; + + switch (rollResult.rolledDice) { + case 1: + rollResult.color = "fumbleRoll"; + rollResult.fumble = true; + rollResult.newTotal = rollResult.total - 3; + trapDetails.formula = `(${rollResult.rolledDice} - 3) + ${trapDetails.formula}`; + break; + case 10: + rollResult.color = "openRoll"; + rollResult.explode = true; + rollResult.newTotal = rollResult.total + 2; + trapDetails.formula = `(${rollResult.rolledDice} + 2) + ${trapDetails.formula}`; + break; + default: + rollResult.color = "normalRoll"; + rollResult.newTotal = rollResult.total; + trapDetails.formula = (trapDetails.type === true) ? `${trapDetails.formula}` : `(${rollResult.rolledDice}) + ${trapDetails.formula}`; + break; + } + + const template = "systems/abfalter/templates/dialogues/diceRolls/trapRoll.hbs" + const content = await renderTemplate(template, { actor: actor, rollResult: rollResult, trapDetails: trapDetails}); + const chatData = { + user: game.user.id, + speaker: ChatMessage.getSpeaker({ actor: actor }), + sound: CONFIG.sounds.dice, + content: content + }; + ChatMessage.applyRollMode(chatData, game.settings.get("core", "rollMode")); + ChatMessage.create(chatData); } \ No newline at end of file diff --git a/module/item/abfalterItem.js b/module/item/abfalterItem.js index 559221b..18d1aaa 100644 --- a/module/item/abfalterItem.js +++ b/module/item/abfalterItem.js @@ -219,7 +219,6 @@ export default class abfalterItem extends Item { this.system.attacks[i].finalDamage = this.system.attacks[i].damage + this.system.melee.baseDmg; } } - /* switch (this.system.shield) { case "none": diff --git a/module/item/abfalterItemSheet.js b/module/item/abfalterItemSheet.js index 69161ef..9e0168b 100644 --- a/module/item/abfalterItemSheet.js +++ b/module/item/abfalterItemSheet.js @@ -101,14 +101,13 @@ export default class abfalterItemSheet extends ItemSheet { this.document.update({ [label]: value }); }); - html.find(".wepAtkToggle").click(ev => { - let index = $(ev.currentTarget).attr("data-value"); - let label = $(ev.currentTarget).attr("data-label"); - let arr = this.item.toObject().system.attacks; - let value = arr[index][label]; - value = !value; - arr[index][label] = value; - this.document.update({ "system.attacks": arr }); + html.find(".wepAtkToggle").click(async (ev) => { + const index = $(ev.currentTarget).attr("data-value"); + const label = $(ev.currentTarget).attr("data-label"); + let attacks = this.item.system.attacks; + attacks[index][label] = !attacks[index][label]; + + await this.item.update({ "system.attacks": attacks }); }); html.on('click', '.effect-control', (ev) => { diff --git a/packs/compendiums/000710.log b/packs/compendiums/000730.log similarity index 100% rename from packs/compendiums/000710.log rename to packs/compendiums/000730.log diff --git a/packs/compendiums/CURRENT b/packs/compendiums/CURRENT index 6f3ddd2..e832db5 100644 --- a/packs/compendiums/CURRENT +++ b/packs/compendiums/CURRENT @@ -1 +1 @@ -MANIFEST-000709 +MANIFEST-000729 diff --git a/packs/compendiums/LOG b/packs/compendiums/LOG index 74f2b0f..d4ca2e7 100644 --- a/packs/compendiums/LOG +++ b/packs/compendiums/LOG @@ -1,3 +1,3 @@ -2024/12/09-01:21:48.503 3f38 Recovering log #708 -2024/12/09-01:21:48.511 3f38 Delete type=0 #708 -2024/12/09-01:21:48.511 3f38 Delete type=3 #707 +2024/12/15-13:53:45.892 85c8 Recovering log #728 +2024/12/15-13:53:45.897 85c8 Delete type=0 #728 +2024/12/15-13:53:45.897 85c8 Delete type=3 #727 diff --git a/packs/compendiums/LOG.old b/packs/compendiums/LOG.old index f952816..78ea279 100644 --- a/packs/compendiums/LOG.old +++ b/packs/compendiums/LOG.old @@ -1,3 +1,3 @@ -2024/12/08-03:19:08.737 3c3c Recovering log #706 -2024/12/08-03:19:08.743 3c3c Delete type=0 #706 -2024/12/08-03:19:08.743 3c3c Delete type=3 #705 +2024/12/14-19:45:36.106 5760 Recovering log #725 +2024/12/14-19:45:36.113 5760 Delete type=0 #725 +2024/12/14-19:45:36.113 5760 Delete type=3 #723 diff --git a/packs/compendiums/MANIFEST-000709 b/packs/compendiums/MANIFEST-000729 similarity index 71% rename from packs/compendiums/MANIFEST-000709 rename to packs/compendiums/MANIFEST-000729 index 7a4bdd7..288f91f 100644 Binary files a/packs/compendiums/MANIFEST-000709 and b/packs/compendiums/MANIFEST-000729 differ diff --git a/templates/actor/parts/armory.hbs b/templates/actor/parts/armory.hbs index 3e2f125..7d7061c 100644 --- a/templates/actor/parts/armory.hbs +++ b/templates/actor/parts/armory.hbs @@ -269,23 +269,29 @@ {{#ifEquals system.info.type "melee"}}