Enhancements as per issue tracking sheet
This commit is contained in:
@@ -19,7 +19,7 @@ export default class OathHammerWeaponDialog {
|
||||
const sys = weapon.system
|
||||
const actorSys = actor.system
|
||||
|
||||
const isRanged = !sys.usesMight && (sys.shortRange > 0 || sys.longRange > 0)
|
||||
const isRanged = sys.proficiencyGroup === "bows" || sys.proficiencyGroup === "throwing"
|
||||
const skillKey = isRanged ? "shooting" : "fighting"
|
||||
const skillDef = SYSTEM.SKILLS[skillKey]
|
||||
const defaultAttr = skillDef.attribute
|
||||
@@ -30,6 +30,16 @@ export default class OathHammerWeaponDialog {
|
||||
|
||||
const hasNimble = sys.traits.has("nimble")
|
||||
|
||||
// Luck
|
||||
const availableLuck = actorSys.luck?.value ?? 0
|
||||
const isHuman = (actorSys.lineage?.name ?? "").toLowerCase() === "human"
|
||||
const luckDicePerPoint = isHuman ? 3 : 2
|
||||
const luckOptions = Array.from({ length: availableLuck + 1 }, (_, i) => ({
|
||||
value: i,
|
||||
label: i === 0 ? "0" : `${i} (+${i * luckDicePerPoint}d)`,
|
||||
selected: i === 0,
|
||||
}))
|
||||
|
||||
// Auto-bonuses from special properties
|
||||
let autoAttackBonus = 0
|
||||
if (sys.specialProperties.has("master-crafted")) autoAttackBonus += 1
|
||||
@@ -56,12 +66,11 @@ export default class OathHammerWeaponDialog {
|
||||
return { value: v, label: v > 0 ? `+${v}` : String(v), selected: v === 0 }
|
||||
})
|
||||
|
||||
const rangeOptions = [
|
||||
{ value: 0, label: game.i18n.localize("OATHHAMMER.Dialog.RangeNormal") },
|
||||
{ value: -1, label: game.i18n.localize("OATHHAMMER.Dialog.RangeLong") + " (−1)" },
|
||||
{ value: -2, label: game.i18n.localize("OATHHAMMER.Dialog.RangeMoving") + " (−2)" },
|
||||
{ value: -2, label: game.i18n.localize("OATHHAMMER.Dialog.RangeConcealment") + " (−2)" },
|
||||
{ value: -3, label: game.i18n.localize("OATHHAMMER.Dialog.RangeCover") + " (−3)" },
|
||||
const rangeConditions = [
|
||||
{ name: "range_long", penalty: -1, label: `${game.i18n.localize("OATHHAMMER.Dialog.RangeLong")} (−1)` },
|
||||
{ name: "range_moving", penalty: -2, label: `${game.i18n.localize("OATHHAMMER.Dialog.RangeMoving")} (−2)` },
|
||||
{ name: "range_concealment", penalty: -2, label: `${game.i18n.localize("OATHHAMMER.Dialog.RangeConcealment")} (−2)` },
|
||||
{ name: "range_cover", penalty: -3, label: `${game.i18n.localize("OATHHAMMER.Dialog.RangeCover")} (−3)` },
|
||||
]
|
||||
|
||||
const rollModes = foundry.utils.duplicate(CONFIG.Dice.rollModes)
|
||||
@@ -96,10 +105,13 @@ export default class OathHammerWeaponDialog {
|
||||
apValue: sys.ap,
|
||||
traits: traitLabels,
|
||||
attackBonusOptions,
|
||||
rangeOptions,
|
||||
rangeConditions,
|
||||
colorOptions: _colorOptions(skillColor),
|
||||
rollModes,
|
||||
visibility: game.settings.get("core", "rollMode"),
|
||||
availableLuck,
|
||||
isHuman,
|
||||
luckOptions,
|
||||
}
|
||||
|
||||
const content = await foundry.applications.handlebars.renderTemplate(
|
||||
@@ -110,6 +122,7 @@ export default class OathHammerWeaponDialog {
|
||||
const result = await foundry.applications.api.DialogV2.wait({
|
||||
window: { title: game.i18n.format("OATHHAMMER.Dialog.AttackTitle", { weapon: weapon.name }) },
|
||||
classes: ["fvtt-oath-hammer"],
|
||||
position: { width: 420 },
|
||||
content,
|
||||
rejectClose: false,
|
||||
buttons: [{
|
||||
@@ -128,12 +141,17 @@ export default class OathHammerWeaponDialog {
|
||||
if (!result) return null
|
||||
return {
|
||||
attackBonus: parseInt(result.attackBonus) || 0,
|
||||
rangeCondition: parseInt(result.rangeCondition) || 0,
|
||||
rangeCondition: (result.range_long === "true" ? -1 : 0)
|
||||
+ (result.range_moving === "true" ? -2 : 0)
|
||||
+ (result.range_concealment === "true" ? -2 : 0)
|
||||
+ (result.range_cover === "true" ? -3 : 0),
|
||||
attrOverride: result.attrOverride || defaultAttr,
|
||||
colorOverride: result.colorOverride || skillColor,
|
||||
visibility: result.visibility ?? game.settings.get("core", "rollMode"),
|
||||
autoAttackBonus,
|
||||
explodeOn5: result.explodeOn5 === "true",
|
||||
luckSpend: Math.min(Math.max(0, parseInt(result.luckSpend) || 0), availableLuck),
|
||||
luckIsHuman: result.luckIsHuman === "true",
|
||||
}
|
||||
}
|
||||
|
||||
@@ -172,6 +190,16 @@ export default class OathHammerWeaponDialog {
|
||||
.filter(i => i.type === "armor" && i.system.equipped)
|
||||
.reduce((sum, a) => sum + (a.system.penalty ?? 0), 0)
|
||||
|
||||
// Luck
|
||||
const availableLuck = actorSys.luck?.value ?? 0
|
||||
const isHuman = (actorSys.lineage?.name ?? "").toLowerCase() === "human"
|
||||
const luckDicePerPoint = isHuman ? 3 : 2
|
||||
const luckOptions = Array.from({ length: availableLuck + 1 }, (_, i) => ({
|
||||
value: i,
|
||||
label: i === 0 ? "0" : `${i} (+${i * luckDicePerPoint}d)`,
|
||||
selected: i === 0,
|
||||
}))
|
||||
|
||||
// Pre-select attack type: block weapons default to ranged, parry to melee
|
||||
const defaultAttackType = hasBlock && !hasParry ? "ranged" : "melee"
|
||||
|
||||
@@ -229,6 +257,9 @@ export default class OathHammerWeaponDialog {
|
||||
colorOptions: _colorOptions(defaultDefenseColor),
|
||||
rollModes,
|
||||
visibility: game.settings.get("core", "rollMode"),
|
||||
availableLuck,
|
||||
isHuman,
|
||||
luckOptions,
|
||||
}
|
||||
|
||||
const content = await foundry.applications.handlebars.renderTemplate(
|
||||
@@ -239,6 +270,7 @@ export default class OathHammerWeaponDialog {
|
||||
const result = await foundry.applications.api.DialogV2.wait({
|
||||
window: { title: game.i18n.format("OATHHAMMER.Dialog.WeaponDefenseTitle", { weapon: weapon.name }) },
|
||||
classes: ["fvtt-oath-hammer"],
|
||||
position: { width: 420 },
|
||||
content,
|
||||
rejectClose: false,
|
||||
buttons: [{
|
||||
@@ -279,6 +311,8 @@ export default class OathHammerWeaponDialog {
|
||||
bonus,
|
||||
visibility: result.visibility ?? game.settings.get("core", "rollMode"),
|
||||
explodeOn5: result.explodeOn5 === "true",
|
||||
luckSpend: Math.min(Math.max(0, parseInt(result.luckSpend) || 0), availableLuck),
|
||||
luckIsHuman: result.luckIsHuman === "true",
|
||||
}
|
||||
}
|
||||
|
||||
@@ -343,6 +377,7 @@ export default class OathHammerWeaponDialog {
|
||||
const result = await foundry.applications.api.DialogV2.wait({
|
||||
window: { title: game.i18n.format("OATHHAMMER.Dialog.DamageTitle", { weapon: weapon.name }) },
|
||||
classes: ["fvtt-oath-hammer"],
|
||||
position: { width: 420 },
|
||||
content,
|
||||
rejectClose: false,
|
||||
buttons: [{
|
||||
|
||||
Reference in New Issue
Block a user