Update fight options
All checks were successful
Release Creation / build (release) Successful in 53s

This commit is contained in:
2025-11-11 19:56:33 +01:00
parent 8d9cc1045c
commit 68a0d03740
30 changed files with 406 additions and 213 deletions

View File

@@ -205,6 +205,7 @@
"Struggle": "Struggle" "Struggle": "Struggle"
}, },
"Skill": { "Skill": {
"DodgeName": "Dodge",
"Unnatural": "Unnatural", "Unnatural": "Unnatural",
"Melee": "Melee Weapons", "Melee": "Melee Weapons",
"Firearms": "Firearms", "Firearms": "Firearms",
@@ -552,6 +553,10 @@
} }
}, },
"Label": { "Label": {
"noTarget": "No target selected",
"noDefenseRoll": "No defense roll available",
"opposedRoll": "Opposed Roll",
"Target": "Target",
"sanLoss5": "You suffered a SAN loss of 5+ ({value}) : you suffer a temporary insanity (Flee, Submit, Struggle or understanding the Unnatural).", "sanLoss5": "You suffered a SAN loss of 5+ ({value}) : you suffer a temporary insanity (Flee, Submit, Struggle or understanding the Unnatural).",
"sanViolenceReset": "The violence SAN loss count has been reset.", "sanViolenceReset": "The violence SAN loss count has been reset.",
"sanHelplessnessReset": "The helplessness SAN loss count has been reset.", "sanHelplessnessReset": "The helplessness SAN loss count has been reset.",
@@ -761,6 +766,7 @@
"woundsApplied": "Wounds applied to {name}: {effectiveWounds} (armor absorbed : {armorText})" "woundsApplied": "Wounds applied to {name}: {effectiveWounds} (armor absorbed : {armorText})"
}, },
"Notifications": { "Notifications": {
"AttackNoTarget": "No target selected for the attack, please select one target to get automations.",
"NoWeaponSkill": "No weapon skill found for this weapon. Check Weapon definition or available skills/era", "NoWeaponSkill": "No weapon skill found for this weapon. Check Weapon definition or available skills/era",
"NoWeaponType": "No weapon type found for this weapon subtype. Check Weapon definition or available skills/era", "NoWeaponType": "No weapon type found for this weapon subtype. Check Weapon definition or available skills/era",
"skillAlreadyExists": "Skill already exists", "skillAlreadyExists": "Skill already exists",

View File

@@ -217,6 +217,7 @@
"Struggle": "Lutter" "Struggle": "Lutter"
}, },
"Skill": { "Skill": {
"DodgeName": "Esquive",
"Unnatural": "Inconcevable", "Unnatural": "Inconcevable",
"Melee": "Armes de mêlée", "Melee": "Armes de mêlée",
"Firearms": "Armes à feu", "Firearms": "Armes à feu",
@@ -564,6 +565,10 @@
} }
}, },
"Label": { "Label": {
"noTarget": "Aucune cible sélectionnée",
"noDefenseRoll": "Aucun jet de défense existant",
"opposedRoll": "Jet opposé",
"Target": "Cible",
"feet": "pieds (ie 30cm)", "feet": "pieds (ie 30cm)",
"feets": "pieds (ie 30cm)", "feets": "pieds (ie 30cm)",
"yard": "mètres", "yard": "mètres",
@@ -782,6 +787,7 @@
"woundsApplied": "Blessures appliquées à {name} : {effectiveWounds} (armure absorbée : {armorText})" "woundsApplied": "Blessures appliquées à {name} : {effectiveWounds} (armure absorbée : {armorText})"
}, },
"Notifications": { "Notifications": {
"AttackNoTarget": "Aucune cible n'a été sélectionnée pour cette attaque, veuillez sélectionner une cible pour bénéficier des automatisations.",
"NoWeaponSkill": "Aucune compétence associée n'a été trouvé pour cette arme. Vérifier la définition de l'arme ainsi que l'époque configurée.", "NoWeaponSkill": "Aucune compétence associée n'a été trouvé pour cette arme. Vérifier la définition de l'arme ainsi que l'époque configurée.",
"NoWeaponType": "Aucun type d'arme trouvé pour ce sous-type. Vérifier la définition de l'arme ainsi que l'époque configurée.", "NoWeaponType": "Aucun type d'arme trouvé pour ce sous-type. Vérifier la définition de l'arme ainsi que l'époque configurée.",
"skillAlreadyExists": "La compétence existe déja", "skillAlreadyExists": "La compétence existe déja",

View File

@@ -25,7 +25,7 @@ export default class CthulhuEternalActor extends Actor {
} }
data.items.push({ data.items.push({
type: "weapon", img: "systems/fvtt-cthulhu-eternal/assets/icons/icon_fist.svg", type: "weapon", img: "systems/fvtt-cthulhu-eternal/assets/icons/icon_fist.svg",
name: game.i18n.localize("CTHULHUETERNAL.Label.Unarmed"), system: { damage: "1d4-1", weaponType: "unarmed" } name: game.i18n.localize("CTHULHUETERNAL.Label.Unarmed"), system: { damage: "1d4-1", weaponType: "unarmed", applyDamageBonus: true }
}) })
} }
@@ -45,8 +45,15 @@ export default class CthulhuEternalActor extends Actor {
return super._onUpdate(changed, options, userId) return super._onUpdate(changed, options, userId)
} }
setLastDefenseRoll(rollData) {
this.setFlag("fvtt-cthulhu-eternal", "last-defense-roll", rollData)
}
getLastDefenseRoll() {
return this.getFlag("fvtt-cthulhu-eternal", "last-defense-roll")
}
applyWounds(woundData) { applyWounds(woundData) {
let updates = {}
// Get available armor // Get available armor
let armors = this.items.filter(i => i.type === "armor" && i.system.equipped) let armors = this.items.filter(i => i.type === "armor" && i.system.equipped)
let totalArmor = 0 let totalArmor = 0
@@ -60,10 +67,7 @@ export default class CthulhuEternalActor extends Actor {
// Apply armor reduction // Apply armor reduction
let hp = Math.max(this.system.hp.value - effectiveWounds, 0) let hp = Math.max(this.system.hp.value - effectiveWounds, 0)
if (this.system.hp.value !== hp) { if (this.system.hp.value !== hp) {
updates[`system.hp.value`] = hp this.update({ "system.hp.value": hp })
}
if (Object.keys(updates).length > 0) {
this.update(updates)
} }
// Chat message for GM only // Chat message for GM only
if (game.user.isGM) { if (game.user.isGM) {

View File

@@ -1,5 +1,6 @@
import { SYSTEM } from "../config/system.mjs" import { SYSTEM } from "../config/system.mjs"
import CthulhuEternalUtils from "../utils.mjs"
export default class CthulhuEternalRoll extends Roll { export default class CthulhuEternalRoll extends Roll {
/** /**
@@ -128,29 +129,21 @@ export default class CthulhuEternalRoll extends Roll {
static async processWeaponDamage(actor, options) { static async processWeaponDamage(actor, options) {
let isLethal = false let isLethal = false
let weapon = options.rollItem let weapon = options.rollItem
let ammoUsed = weapon.system.weaponType.includes("ranged") ? 1 : 0 // Default ammo used for melee weapons is 0
options.isNudge = false options.isNudge = false
// Selective fire management // Selective fire management
if (weapon.system.hasSelectiveFire && weapon.selectiveFireChoice) { if (weapon.system.hasSelectiveFire && weapon.selectiveFireChoice) {
let choice = SYSTEM.WEAPON_SELECTIVE_FIRE_CHOICES[weapon.selectiveFireChoice] let choice = SYSTEM.WEAPON_SELECTIVE_FIRE_CHOICES[weapon.selectiveFireChoice]
if (choice.ammoUsed > weapon.system.ammo.value) {
ui.notifications.warn(game.i18n.localize("CTHULHUETERNAL.Notifications.NoAmmo"))
return
}
weapon.system.selectiveFireChoiceLabel = choice.label // Store the choice in the weapon weapon.system.selectiveFireChoiceLabel = choice.label // Store the choice in the weapon
weapon.system.lethality = choice.lethality // Override lethality weapon.system.lethality = choice.lethality // Override lethality
weapon.system.killRadius = choice.killRadius // Override kill radius weapon.system.killRadius = choice.killRadius // Override kill radius
ammoUsed = choice.ammoUsed // Override ammo used
} }
ammoUsed = Number(ammoUsed)
let combatants = [] let combatants = []
if (game?.combat?.combatants) { if (game?.combat?.combatants) {
for (let c of game.combat.combatants) { for (let c of game.combat.combatants) {
if (c.actor.id !== actor.id) { if (c.actor.id !== actor.id) {
combatants.push({ id: c.actor.id, name: c.name }) combatants.push({ id: c.id, name: c.name })
} }
} }
} }
@@ -160,12 +153,6 @@ export default class CthulhuEternalRoll extends Roll {
await lethalityRoll.evaluate() await lethalityRoll.evaluate()
let lethalScore = (options?.previousResultType === "successCritical") ? weapon.system.lethality * 2 : weapon.system.lethality let lethalScore = (options?.previousResultType === "successCritical") ? weapon.system.lethality * 2 : weapon.system.lethality
isLethal = (lethalityRoll.total <= lethalScore) isLethal = (lethalityRoll.total <= lethalScore)
if (ammoUsed > 0) {
await actor.updateEmbeddedDocuments("Item", [{
_id: weapon._id,
"system.ammo.value": Math.max(0, weapon.system.ammo.value - ammoUsed)
}])
}
let wounds = Math.floor(lethalityRoll.total / 10) + (lethalityRoll.total % 10) let wounds = Math.floor(lethalityRoll.total / 10) + (lethalityRoll.total % 10)
let msgData = { let msgData = {
actorId: actor.id, actorId: actor.id,
@@ -173,7 +160,7 @@ export default class CthulhuEternalRoll extends Roll {
wounds, wounds,
lethalScore, lethalScore,
isLethal, isLethal,
ammoUsed, ammoUsed: weapon?.ammoUsed || 0,
rollResult: lethalityRoll.total, rollResult: lethalityRoll.total,
combatants: combatants combatants: combatants
} }
@@ -195,12 +182,6 @@ export default class CthulhuEternalRoll extends Roll {
if (options?.previousResultType === "successCritical") { if (options?.previousResultType === "successCritical") {
formula = `( ${formula} ) * 2` formula = `( ${formula} ) * 2`
} }
if (ammoUsed > 0) {
await actor.updateEmbeddedDocuments("Item", [{
_id: weapon._id,
"system.ammo.value": Math.max(0, weapon.system.ammo.value - ammoUsed)
}])
}
let damageRoll = new Roll(formula) let damageRoll = new Roll(formula)
await damageRoll.evaluate() await damageRoll.evaluate()
@@ -208,7 +189,7 @@ export default class CthulhuEternalRoll extends Roll {
actorId: actor.id, actorId: actor.id,
weapon, weapon,
formula, formula,
ammoUsed, ammoUsed: weapon?.ammoUsed || 0,
rollResult: damageRoll.total, rollResult: damageRoll.total,
combatants: combatants combatants: combatants
} }
@@ -234,6 +215,27 @@ export default class CthulhuEternalRoll extends Roll {
return modifier return modifier
} }
static async processAmmoUsed(actor, weapon) {
let ammoUsed = weapon.system.weaponType.includes("ranged") ? 1 : 0 // Default ammo used for melee weapons is 0
// Selective fire management
if (weapon.system.hasSelectiveFire && weapon.selectiveFireChoice) {
let choice = SYSTEM.WEAPON_SELECTIVE_FIRE_CHOICES[weapon.selectiveFireChoice]
if (choice.ammoUsed > weapon.system.ammo.value) {
ui.notifications.warn(game.i18n.localize("CTHULHUETERNAL.Notifications.NoAmmo"))
return
}
ammoUsed = choice.ammoUsed // Override ammo used
}
ammoUsed = Number(ammoUsed)
if (ammoUsed > 0) {
await actor.updateEmbeddedDocuments("Item", [{
_id: weapon._id,
"system.ammo.value": Math.max(0, weapon.system.ammo.value - ammoUsed)
}])
}
weapon.ammoUsed = ammoUsed
}
/** /**
* Prompt the user with a dialog to configure and execute a roll. * Prompt the user with a dialog to configure and execute a roll.
* *
@@ -255,9 +257,10 @@ export default class CthulhuEternalRoll extends Roll {
options.isNudge = true options.isNudge = true
let actor = game.actors.get(options.actorId) let actor = game.actors.get(options.actorId)
let target = CthulhuEternalUtils.getTarget()
switch (options.rollType) { switch (options.rollType) {
case "skill": case "skill":
console.log(options.rollItem)
options.initialScore = options.rollItem.system.computeScore() options.initialScore = options.rollItem.system.computeScore()
break break
case "luck": case "luck":
@@ -295,12 +298,16 @@ export default class CthulhuEternalRoll extends Roll {
console.log("WP Not found", era, options.rollItem.system.weaponType) console.log("WP Not found", era, options.rollItem.system.weaponType)
return return
} }
if (!target) {
ui.notifications.warn(game.i18n.localize("CTHULHUETERNAL.Notifications.AttackNoTarget"))
}
// Check if the weapon has enouth ammo in case of a firearm // Check if the weapon has enouth ammo in case of a firearm
if (options.rollItem.system.isFireArm() && options.rollItem.system.ammo.value <= 0) { if (options.rollItem.system.isFireArm() && options.rollItem.system.ammo.value <= 0) {
ui.notifications.warn(game.i18n.localize("CTHULHUETERNAL.Notifications.NoAmmo")) ui.notifications.warn(game.i18n.localize("CTHULHUETERNAL.Notifications.NoAmmo"))
return return
} }
options.weapon = options.rollItem options.weapon = options.rollItem
if (options.rollItem.system.hasDirectSkill) { if (options.rollItem.system.hasDirectSkill) {
let skillName = options.rollItem.name let skillName = options.rollItem.name
options.rollItem = { type: "skill", name: skillName, system: { base: 0, bonus: options.weapon.system.directSkillValue } } options.rollItem = { type: "skill", name: skillName, system: { base: 0, bonus: options.weapon.system.directSkillValue } }
@@ -371,6 +378,7 @@ export default class CthulhuEternalRoll extends Roll {
aimingWithSight: false, aimingWithSight: false,
modifier, modifier,
formula, formula,
targetName: target?.name,
hasTarget: options.hasTarget, hasTarget: options.hasTarget,
hasModifier, hasModifier,
hasMultiplier, hasMultiplier,
@@ -423,10 +431,14 @@ export default class CthulhuEternalRoll extends Roll {
if (rollContext === null) return if (rollContext === null) return
let rollData = foundry.utils.mergeObject(foundry.utils.duplicate(options), rollContext) let rollData = foundry.utils.mergeObject(foundry.utils.duplicate(options), rollContext)
// If we have a target, get its data
rollData.targetId = target?.id
rollData.targetName = target?.name
rollData.rollMode = rollContext.visibility rollData.rollMode = rollContext.visibility
// Update target score // Update target score
console.log("Rolldata", rollData, options) console.log("Rolldata", rollData)
if (options.rollType === "resource") { if (options.rollType === "resource") {
rollData.targetScore = options.initialScore * Number(rollContext.multiplier) rollData.targetScore = options.initialScore * Number(rollContext.multiplier)
} else { } else {
@@ -446,6 +458,10 @@ export default class CthulhuEternalRoll extends Roll {
rollData.modifier = "0" rollData.modifier = "0"
} }
if (options.rollType === "weapon") {
await this.processAmmoUsed(actor, rollData.weapon)
}
if (Hooks.call("fvtt-cthulhu-eternal.preRoll", options, rollData) === false) return if (Hooks.call("fvtt-cthulhu-eternal.preRoll", options, rollData) === false) return
const roll = new this(formula, options.data, rollData) const roll = new this(formula, options.data, rollData)
@@ -506,7 +522,64 @@ export default class CthulhuEternalRoll extends Roll {
this.options.isLowWP = rollData.isLowWP this.options.isLowWP = rollData.isLowWP
this.options.isZeroWP = rollData.isZeroWP this.options.isZeroWP = rollData.isZeroWP
this.options.isExhausted = rollData.isExhausted this.options.isExhausted = rollData.isExhausted
rollData.isSuccess = this.options.isSuccess
rollData.isFailure = this.options.isFailure
rollData.isCritical = this.options.isCritical
rollData.resultType = resultType
this.options.rollData = foundry.utils.duplicate(rollData) this.options.rollData = foundry.utils.duplicate(rollData)
// Keep track of the last defense roll for the actor
if (game.combat && (rollData?.weapon?.system.type === "melee" || (rollData?.rollItem.type === "skill" && rollData?.rollItem.name?.toLowerCase().includes(game.i18n.localize("CTHULHUETERNAL.Skill.dodgeName").toLowerCase())))) {
let actor = game.actors.get(options.actorId)
rollData.round = game.combat.round
actor.setLastDefenseRoll(foundry.utils.duplicate(rollData))
}
if (game.combat && rollData?.weapon) { // An attack roll
rollData.isAttackRoll = true
}
// Now check if we have a target for the current roll, and if the target has done its defense roll this round
if (rollData.targetId) {
let token = game.scenes.current.tokens.get(rollData.targetId)
let defender = token.actor
let lastDefenseRoll = defender?.getLastDefenseRoll()
// Now compare opposition
this.compareRolls(rollData, lastDefenseRoll)
rollData.defenseRoll = lastDefenseRoll
}
}
compareRolls(attackRoll, defenseRoll) {
if (!defenseRoll || defenseRoll.round !== game?.combat?.round) {
ui.notifications.info(game.i18n.localize("CTHULHUETERNAL.Notifications.NoDefenseRoll"))
return
}
if (attackRoll.isFailure) {
attackRoll.attackSucess = false
}
if (attackRoll.isSuccess && defenseRoll.isFailure) {
attackRoll.attackSucess = true
}
if (attackRoll.isSuccess && defenseRoll.isSuccess) {
if (attackRoll.isCritical && !defenseRoll.isCritical) {
attackRoll.attackSucess = true
}
else if (!attackRoll.isCritical && defenseRoll.isCritical) {
attackRoll.attackSucess = false
}
else {
// Both are normal success, compare the roll results
if (attackRoll.total >= defenseRoll.total) {
// Attack successful
attackRoll.attackSucess = true
} else {
// Defense successful
attackRoll.attackSucess = false
}
}
}
} }
/** /**

View File

@@ -375,6 +375,15 @@ export default class CthulhuEternalUtils {
document.documentElement.style.setProperty('--background-image-base', `linear-gradient(rgba(255, 255, 255, 0.8), rgba(255, 255, 255, 0.8)), url("../assets/ui/${era}_background_main.webp")`); document.documentElement.style.setProperty('--background-image-base', `linear-gradient(rgba(255, 255, 255, 0.8), rgba(255, 255, 255, 0.8)), url("../assets/ui/${era}_background_main.webp")`);
} }
static getTarget() {
if (game.user.targets && game.user.targets.size === 1) {
for (let target of game.user.targets) {
return target
}
}
return undefined;
}
static applyWounds(message, event) { static applyWounds(message, event) {
let woundData = message.getFlag("fvtt-cthulhu-eternal", "woundData") let woundData = message.getFlag("fvtt-cthulhu-eternal", "woundData")
if (!woundData) { if (!woundData) {
@@ -387,10 +396,11 @@ export default class CthulhuEternalUtils {
return return
} }
// Get the targetted actorId from the HTML select event // Get the targetted actorId from the HTML select event
let targetActorId = event.target.value let targetCombatantId = event.target.value
let targetActor = game.actors.get(targetActorId) let combatant = game.combat.combatants.get(targetCombatantId)
let targetActor = combatant.token?.actor || game.actors.get(combatant.actorId)
if (!targetActor) { if (!targetActor) {
ui.notifications.error(game.i18n.localize("CTHULHUETERNAL.Notifications.noTargetActorFound") + targetActorId) ui.notifications.error(game.i18n.localize("CTHULHUETERNAL.Notifications.noTargetActorFound") + targetCombatantId)
return return
} }
targetActor.applyWounds(woundData) targetActor.applyWounds(woundData)

Binary file not shown.

View File

View File

@@ -1 +1 @@
MANIFEST-000249 MANIFEST-000261

View File

@@ -1,7 +1,7 @@
2025/10/01-10:24:47.689741 7fc4987f86c0 Recovering log #246 2025/10/08-22:08:44.664871 7f77151f96c0 Recovering log #259
2025/10/01-10:24:47.787870 7fc4987f86c0 Delete type=3 #244 2025/10/08-22:08:44.675676 7f77151f96c0 Delete type=3 #257
2025/10/01-10:24:47.787986 7fc4987f86c0 Delete type=0 #246 2025/10/08-22:08:44.675773 7f77151f96c0 Delete type=0 #259
2025/10/01-11:24:12.555415 7fc497ff76c0 Level-0 table #252: started 2025/10/08-23:43:02.763720 7f770f3ff6c0 Level-0 table #264: started
2025/10/01-11:24:12.555461 7fc497ff76c0 Level-0 table #252: 0 bytes OK 2025/10/08-23:43:02.763751 7f770f3ff6c0 Level-0 table #264: 0 bytes OK
2025/10/01-11:24:12.565317 7fc497ff76c0 Delete type=0 #250 2025/10/08-23:43:02.770330 7f770f3ff6c0 Delete type=0 #262
2025/10/01-11:24:12.577205 7fc497ff76c0 Manual compaction at level-0 from '!items!4oyPRBWPBWAChrJP' @ 72057594037927935 : 1 .. '!items!zVFfp3o0G0Zg3Ia4' @ 0 : 0; will stop at (end) 2025/10/08-23:43:02.770574 7f770f3ff6c0 Manual compaction at level-0 from '!items!4oyPRBWPBWAChrJP' @ 72057594037927935 : 1 .. '!items!zVFfp3o0G0Zg3Ia4' @ 0 : 0; will stop at (end)

View File

@@ -1,11 +1,7 @@
2025/10/01-09:23:25.493413 7fc499ffb6c0 Delete type=3 #1 2025/10/01-17:34:00.770173 7fc4987f86c0 Recovering log #255
2025/10/01-09:24:30.037985 7fc497ff76c0 Level-0 table #247: started 2025/10/01-17:34:00.786532 7fc4987f86c0 Delete type=3 #253
2025/10/01-09:24:30.038031 7fc497ff76c0 Level-0 table #247: 0 bytes OK 2025/10/01-17:34:00.786591 7fc4987f86c0 Delete type=0 #255
2025/10/01-09:24:30.044462 7fc497ff76c0 Delete type=0 #245 2025/10/01-20:52:25.677932 7fc497ff76c0 Level-0 table #260: started
2025/10/01-09:24:30.069660 7fc497ff76c0 Manual compaction at level-0 from '!items!4oyPRBWPBWAChrJP' @ 72057594037927935 : 1 .. '!items!zVFfp3o0G0Zg3Ia4' @ 0 : 0; will stop at '!items!zVFfp3o0G0Zg3Ia4' @ 52 : 1 2025/10/01-20:52:25.677997 7fc497ff76c0 Level-0 table #260: 0 bytes OK
2025/10/01-09:24:30.069672 7fc497ff76c0 Compacting 1@0 + 0@1 files 2025/10/01-20:52:26.027584 7fc497ff76c0 Delete type=0 #258
2025/10/01-09:24:30.073695 7fc497ff76c0 Generated table #248@0: 26 keys, 60964 bytes 2025/10/01-20:52:26.508239 7fc497ff76c0 Manual compaction at level-0 from '!items!4oyPRBWPBWAChrJP' @ 72057594037927935 : 1 .. '!items!zVFfp3o0G0Zg3Ia4' @ 0 : 0; will stop at (end)
2025/10/01-09:24:30.073722 7fc497ff76c0 Compacted 1@0 + 0@1 files => 60964 bytes
2025/10/01-09:24:30.080151 7fc497ff76c0 compacted to: files[ 0 1 0 0 0 0 0 ]
2025/10/01-09:24:30.080234 7fc497ff76c0 Delete type=2 #242
2025/10/01-09:24:30.086925 7fc497ff76c0 Manual compaction at level-0 from '!items!zVFfp3o0G0Zg3Ia4' @ 52 : 1 .. '!items!zVFfp3o0G0Zg3Ia4' @ 0 : 0; will stop at (end)

Binary file not shown.

View File

Binary file not shown.

View File

View File

@@ -1 +1 @@
MANIFEST-000418 MANIFEST-000430

View File

@@ -1,7 +1,7 @@
2025/10/01-10:24:47.499257 7fc4997fa6c0 Recovering log #415 2025/10/08-22:08:44.633139 7f77159fa6c0 Recovering log #428
2025/10/01-10:24:47.596647 7fc4997fa6c0 Delete type=3 #413 2025/10/08-22:08:44.643368 7f77159fa6c0 Delete type=3 #426
2025/10/01-10:24:47.596724 7fc4997fa6c0 Delete type=0 #415 2025/10/08-22:08:44.643480 7f77159fa6c0 Delete type=0 #428
2025/10/01-11:24:12.545465 7fc497ff76c0 Level-0 table #421: started 2025/10/08-23:43:02.756716 7f770f3ff6c0 Level-0 table #433: started
2025/10/01-11:24:12.545499 7fc497ff76c0 Level-0 table #421: 0 bytes OK 2025/10/08-23:43:02.756789 7f770f3ff6c0 Level-0 table #433: 0 bytes OK
2025/10/01-11:24:12.555310 7fc497ff76c0 Delete type=0 #419 2025/10/08-23:43:02.763557 7f770f3ff6c0 Delete type=0 #431
2025/10/01-11:24:12.577192 7fc497ff76c0 Manual compaction at level-0 from '!folders!5PrT9QmN1cFPzDFP' @ 72057594037927935 : 1 .. '!items!zvoUByzWSWZ87fxA' @ 0 : 0; will stop at (end) 2025/10/08-23:43:02.770557 7f770f3ff6c0 Manual compaction at level-0 from '!folders!5PrT9QmN1cFPzDFP' @ 72057594037927935 : 1 .. '!items!zvoUByzWSWZ87fxA' @ 0 : 0; will stop at (end)

View File

@@ -1,11 +1,7 @@
2025/10/01-09:23:25.444068 7fc499ffb6c0 Delete type=3 #1 2025/10/01-17:34:00.727436 7fc499ffb6c0 Recovering log #424
2025/10/01-09:24:30.024822 7fc497ff76c0 Level-0 table #416: started 2025/10/01-17:34:00.744993 7fc499ffb6c0 Delete type=3 #422
2025/10/01-09:24:30.024870 7fc497ff76c0 Level-0 table #416: 0 bytes OK 2025/10/01-17:34:00.745065 7fc499ffb6c0 Delete type=0 #424
2025/10/01-09:24:30.030665 7fc497ff76c0 Delete type=0 #414 2025/10/01-20:52:26.571766 7fc497ff76c0 Level-0 table #429: started
2025/10/01-09:24:30.044587 7fc497ff76c0 Manual compaction at level-0 from '!folders!5PrT9QmN1cFPzDFP' @ 72057594037927935 : 1 .. '!items!zvoUByzWSWZ87fxA' @ 0 : 0; will stop at '!items!zvoUByzWSWZ87fxA' @ 1281 : 1 2025/10/01-20:52:26.571816 7fc497ff76c0 Level-0 table #429: 0 bytes OK
2025/10/01-09:24:30.044598 7fc497ff76c0 Compacting 1@0 + 0@1 files 2025/10/01-20:52:26.607301 7fc497ff76c0 Delete type=0 #427
2025/10/01-09:24:30.051264 7fc497ff76c0 Generated table #417@0: 556 keys, 320457 bytes 2025/10/01-20:52:26.607477 7fc497ff76c0 Manual compaction at level-0 from '!folders!5PrT9QmN1cFPzDFP' @ 72057594037927935 : 1 .. '!items!zvoUByzWSWZ87fxA' @ 0 : 0; will stop at (end)
2025/10/01-09:24:30.051285 7fc497ff76c0 Compacted 1@0 + 0@1 files => 320457 bytes
2025/10/01-09:24:30.058278 7fc497ff76c0 compacted to: files[ 0 1 0 0 0 0 0 ]
2025/10/01-09:24:30.058439 7fc497ff76c0 Delete type=2 #411
2025/10/01-09:24:30.086897 7fc497ff76c0 Manual compaction at level-0 from '!items!zvoUByzWSWZ87fxA' @ 1281 : 1 .. '!items!zvoUByzWSWZ87fxA' @ 0 : 0; will stop at (end)

Binary file not shown.

View File

Binary file not shown.

View File

View File

@@ -1 +1 @@
MANIFEST-000064 MANIFEST-000076

View File

@@ -1,7 +1,7 @@
2025/10/01-10:24:47.601344 7fc499ffb6c0 Recovering log #61 2025/10/08-22:08:44.648914 7f770ffff6c0 Recovering log #74
2025/10/01-10:24:47.686801 7fc499ffb6c0 Delete type=3 #59 2025/10/08-22:08:44.660220 7f770ffff6c0 Delete type=3 #72
2025/10/01-10:24:47.686869 7fc499ffb6c0 Delete type=0 #61 2025/10/08-22:08:44.660388 7f770ffff6c0 Delete type=0 #74
2025/10/01-11:24:12.535658 7fc497ff76c0 Level-0 table #67: started 2025/10/08-23:43:02.832863 7f770f3ff6c0 Level-0 table #79: started
2025/10/01-11:24:12.535725 7fc497ff76c0 Level-0 table #67: 0 bytes OK 2025/10/08-23:43:02.832918 7f770f3ff6c0 Level-0 table #79: 0 bytes OK
2025/10/01-11:24:12.545352 7fc497ff76c0 Delete type=0 #65 2025/10/08-23:43:02.839997 7f770f3ff6c0 Delete type=0 #77
2025/10/01-11:24:12.577171 7fc497ff76c0 Manual compaction at level-0 from '!folders!0DI3T2jve3nsmsfZ' @ 72057594037927935 : 1 .. '!items!zyxA9DhO36t5OBDv' @ 0 : 0; will stop at (end) 2025/10/08-23:43:02.852551 7f770f3ff6c0 Manual compaction at level-0 from '!folders!0DI3T2jve3nsmsfZ' @ 72057594037927935 : 1 .. '!items!zyxA9DhO36t5OBDv' @ 0 : 0; will stop at (end)

View File

@@ -1,11 +1,7 @@
2025/10/01-09:23:25.469063 7fc499ffb6c0 Delete type=3 #1 2025/10/01-17:34:00.750882 7fc4997fa6c0 Recovering log #70
2025/10/01-09:24:30.030754 7fc497ff76c0 Level-0 table #62: started 2025/10/01-17:34:00.765634 7fc4997fa6c0 Delete type=3 #68
2025/10/01-09:24:30.030783 7fc497ff76c0 Level-0 table #62: 0 bytes OK 2025/10/01-17:34:00.765703 7fc4997fa6c0 Delete type=0 #70
2025/10/01-09:24:30.037809 7fc497ff76c0 Delete type=0 #60 2025/10/01-20:52:26.472838 7fc497ff76c0 Level-0 table #75: started
2025/10/01-09:24:30.058634 7fc497ff76c0 Manual compaction at level-0 from '!folders!0DI3T2jve3nsmsfZ' @ 72057594037927935 : 1 .. '!items!zyxA9DhO36t5OBDv' @ 0 : 0; will stop at '!items!zyxA9DhO36t5OBDv' @ 55 : 1 2025/10/01-20:52:26.472892 7fc497ff76c0 Level-0 table #75: 0 bytes OK
2025/10/01-09:24:30.058646 7fc497ff76c0 Compacting 1@0 + 0@1 files 2025/10/01-20:52:26.508046 7fc497ff76c0 Delete type=0 #73
2025/10/01-09:24:30.063565 7fc497ff76c0 Generated table #63@0: 362 keys, 93592 bytes 2025/10/01-20:52:26.508280 7fc497ff76c0 Manual compaction at level-0 from '!folders!0DI3T2jve3nsmsfZ' @ 72057594037927935 : 1 .. '!items!zyxA9DhO36t5OBDv' @ 0 : 0; will stop at (end)
2025/10/01-09:24:30.063591 7fc497ff76c0 Compacted 1@0 + 0@1 files => 93592 bytes
2025/10/01-09:24:30.069446 7fc497ff76c0 compacted to: files[ 0 1 0 0 0 0 0 ]
2025/10/01-09:24:30.069529 7fc497ff76c0 Delete type=2 #57
2025/10/01-09:24:30.086915 7fc497ff76c0 Manual compaction at level-0 from '!items!zyxA9DhO36t5OBDv' @ 55 : 1 .. '!items!zyxA9DhO36t5OBDv' @ 0 : 0; will stop at (end)

Binary file not shown.

View File

View File

@@ -6,7 +6,7 @@
"download": "#{DOWNLOAD}#", "download": "#{DOWNLOAD}#",
"url": "https://www.uberwald.me/gitea/public/fvtt-cthulhu-eternal", "url": "https://www.uberwald.me/gitea/public/fvtt-cthulhu-eternal",
"license": "LICENSE", "license": "LICENSE",
"version": "13.0.1", "version": "13.0.2",
"authors": [ "authors": [
{ {
"name": "Uberwald", "name": "Uberwald",

View File

@@ -7,125 +7,218 @@
<div class="intro-right"> <div class="intro-right">
<ul> <ul>
{{#if (eq rollType "char")}} {{#if (eq rollType "char")}}
<li><strong>{{localize "CTHULHUETERNAL.Label.charRoll"}}</strong></li> <li><strong>{{localize "CTHULHUETERNAL.Label.charRoll"}}</strong></li>
{{/if}} {{/if}}
{{#if (eq rollType "skill")}} {{#if (eq rollType "skill")}}
<li><strong>{{localize "CTHULHUETERNAL.Label.skillRoll"}}</strong></li> <li><strong>{{localize
"CTHULHUETERNAL.Label.skillRoll"
}}</strong></li>
{{/if}} {{/if}}
{{#if isNudgedRoll}} {{#if isNudgedRoll}}
<li><strong>{{localize "CTHULHUETERNAL.Label.nudgedRoll"}} : {{wpCost}} {{localize "CTHULHUETERNAL.Label.WPSpent"}}</strong></li> <li><strong>{{localize "CTHULHUETERNAL.Label.nudgedRoll"}}
:
{{wpCost}}
{{localize "CTHULHUETERNAL.Label.WPSpent"}}</strong></li>
{{/if}} {{/if}}
{{#if weapon}} {{#if weapon}}
<li><strong>{{localize "CTHULHUETERNAL.Label.Weapon"}} : {{weapon.name}}</strong></li> <li><strong>{{localize "CTHULHUETERNAL.Label.Weapon"}}
:
{{weapon.name}}</strong></li>
{{/if}} {{/if}}
{{#if (eq rollType "resource")}} {{#if (eq rollType "resource")}}
<li><strong>{{rollItem.name}} : {{initialScore}}</strong></li> <li><strong>{{rollItem.name}} : {{initialScore}}</strong></li>
{{else}} {{else}}
<li><strong>{{rollItem.name}} : {{initialScore}}%</strong></li> <li><strong>{{rollItem.name}} : {{initialScore}}%</strong></li>
{{/if}} {{/if}}
{{#if isZeroWP}} {{#if isZeroWP}}
<li class="red-warning">{{localize "CTHULHUETERNAL.Label.ZeroWP"}}</li> <li class="red-warning">{{localize
"CTHULHUETERNAL.Label.ZeroWP"
}}</li>
{{else}} {{else}}
{{#if isLowWP}} {{#if isLowWP}}
<li class="orange-warning">{{localize "CTHULHUETERNAL.Label.LowWP"}} : -20%</li> <li class="orange-warning">{{localize "CTHULHUETERNAL.Label.LowWP"}}
{{/if}} : -20%</li>
{{/if}}
{{/if}} {{/if}}
{{#if isExhausted}} {{#if isExhausted}}
<li class="orange-warning">{{localize "CTHULHUETERNAL.Label.Exhausted"}} : -20%</li> <li class="orange-warning">{{localize
"CTHULHUETERNAL.Label.Exhausted"
}}
: -20%</li>
{{/if}} {{/if}}
{{#if (eq rollType "resource")}} {{#if (eq rollType "resource")}}
<li>{{localize "CTHULHUETERNAL.Label.multiplier"}} : {{multiplier}}</li> <li>{{localize "CTHULHUETERNAL.Label.multiplier"}}
:
{{multiplier}}</li>
{{else}} {{else}}
<li>{{localize "CTHULHUETERNAL.Label.modifier"}} : {{totalModifier}}%</li> <li>{{localize "CTHULHUETERNAL.Label.modifier"}}
:
{{totalModifier}}%</li>
{{/if}} {{/if}}
<li>{{localize "CTHULHUETERNAL.Label.targetScore"}} : {{targetScore}}%</li> <li>{{localize "CTHULHUETERNAL.Label.targetScore"}}
:
{{targetScore}}%</li>
{{#if isSuccess}} {{#if isSuccess}}
{{#if isCritical}} {{#if isCritical}}
<li class="result-critical-success">{{localize "CTHULHUETERNAL.Label.criticalSuccess"}} <li class="result-critical-success">{{localize
"CTHULHUETERNAL.Label.criticalSuccess"
}}
</li> </li>
{{else}} {{else}}
<li class="result-success"> <li class="result-success">
{{localize "CTHULHUETERNAL.Label.success"}} {{localize "CTHULHUETERNAL.Label.success"}}
{{#if isNudge}} {{#if isNudge}}
<a class="nudge-roll" data-tooltip="{{localize "CTHULHUETERNAL.Label.rollNudge"}}"><i class="fa-solid fa-circle-sort-down"></i></a> <a
{{/if}} class="nudge-roll"
data-tooltip="{{localize ' CTHULHUETERNAL.Label.rollNudge'}}"
><i class="fa-solid fa-circle-sort-down"></i></a>
{{/if}}
</li> </li>
{{/if}} {{/if}}
{{#if (eq rollType "weapon")}} {{#if (eq rollType "weapon")}}
<li> <li>
{{#if (eq weapon.system.weaponType "rangedfirearm")}} {{#if (eq weapon.system.weaponType "rangedfirearm")}}
{{#if weapon.system.hasDamageDistance}} {{#if weapon.system.hasDamageDistance}}
{{#each weapon.system.damageDistance as |damageDistance|}} {{#each weapon.system.damageDistance as |damageDistance|}}
{{#if (gt damageDistance.distance 0)}} {{#if (gt damageDistance.distance 0)}}
<a class="damage-roll" data-item-id="{{weapon.id}}" data-action="roll" data-roll-type="damage" <a
data-roll-value="{{damageDistance.damage}}" > class="damage-roll"
<i class="fa-solid fa-gun"></i> data-item-id="{{weapon.id}}"
<span class="damage-distance">{{damageDistance.distance}}:{{damageDistance.damage}}&nbsp;&nbsp;</span> data-action="roll"
</a> data-roll-type="damage"
data-roll-value="{{damageDistance.damage}}"
>
<i class="fa-solid fa-gun"></i>
<span
class="damage-distance"
>{{damageDistance.distance}}:{{damageDistance.damage}}&nbsp;&nbsp;</span>
</a>
{{/if}} {{/if}}
{{/each}} {{/each}}
{{else}} {{else}}
<a class="damage-roll" data-roll-value="{{weapon.system.damage}}" data-tooltip="{{localize "CTHULHUETERNAL.Label.rollDamage"}}"><i class="fa-solid fa-gun"></i></a> <a
class="damage-roll"
data-roll-value="{{weapon.system.damage}}"
data-tooltip="{{localize
'
CTHULHUETERNAL.Label.rollDamage'
}}"
><i class="fa-solid fa-gun"></i></a>
{{/if}} {{/if}}
{{else}} {{else}}
<a class="damage-roll" data-roll-value="{{weapon.system.damage}}" data-tooltip="{{localize "CTHULHUETERNAL.Label.rollDamage"}}"><i class="fa-solid fa-sword"></i></a> <a
class="damage-roll"
data-roll-value="{{weapon.system.damage}}"
data-tooltip="{{localize
'
CTHULHUETERNAL.Label.rollDamage'
}}"
><i class="fa-solid fa-sword"></i></a>
{{/if}} {{/if}}
</li>
{{/if}}
{{#if (eq rollType "skill")}}
{{#if rollItem.system.isHealing}}
<li>
<a
class="healing-roll"
data-tooltip="{{localize
' CTHULHUETERNAL.Label.rollHealing'
}}"
><i class="fa-solid fa-heart"></i></a>
</li> </li>
{{/if}} {{/if}}
{{#if (eq rollType "skill") }} {{/if}}
{{#if rollItem.system.isHealing}}
<li>
<a class="healing-roll" data-tooltip="{{localize "CTHULHUETERNAL.Label.rollHealing"}}"><i class="fa-solid fa-heart"></i></a>
</li>
{{/if}}
{{/if}}
</li>
{{/if}} {{/if}}
{{#if isFailure}} {{#if isFailure}}
{{#if isCritical}} {{#if isCritical}}
<li class="result-critical-failure">{{localize "CTHULHUETERNAL.Label.criticalFailure"}} <li class="result-critical-failure">{{localize
"CTHULHUETERNAL.Label.criticalFailure"
}}
</li> </li>
{{else}} {{else}}
<li class="result-failure"> <li class="result-failure">
{{localize "CTHULHUETERNAL.Label.failure"}} {{localize "CTHULHUETERNAL.Label.failure"}}
</li> </li>
{{/if}} {{/if}}
{{#if isNudge}} {{#if isNudge}}
<li> <li>
<a class="nudge-roll" data-tooltip="{{localize "CTHULHUETERNAL.Label.rollNudge"}}"><i class="fa-solid fa-circle-sort-down"></i></a> <a
</li> class="nudge-roll"
data-tooltip="{{localize 'CTHULHUETERNAL.Label.rollNudge'}}"
><i class="fa-solid fa-circle-sort-down"></i></a>
</li>
{{/if}} {{/if}}
{{/if}} {{/if}}
{{#if isAttackRoll}}
{{#if defenseRoll}}
<li>{{localize "CTHULHUETERNAL.Label.defenseRoll"}}</li>
{{#if attackSuccess}}
<li class="result-success">{{localize
"CTHULHUETERNAL.Label.attackSuccess"
}}</li>
{{else}}
<li class="result-failure">{{localize
"CTHULHUETERNAL.Label.attackFailure"
}}</li>
{{/if}}
{{else}}
{{#if targetId}}
<li class="orange-warning">{{localize
"CTHULHUETERNAL.Label.noDefenseRoll"
}}</li>
<a
class="opposed-roll"
data-tooltip="{{localize 'CTHULHUETERNAL.Label.opposedRoll'}}"
>
<i class="fa-duotone fa-light fa-arrows-to-line"></i></a>
{{else}}
<li class="orange-warning">{{localize
"CTHULHUETERNAL.Label.noTarget"
}}</li>
<a
class="opposed-roll"
data-tooltip="{{localize 'CTHULHUETERNAL.Label.opposedRoll'}}"
>
<i class="fa-duotone fa-light fa-arrows-to-line"></i></a>
{{/if}}
{{/if}}
{{/if}}
</ul> </ul>
</div> </div>
</div> </div>
{{#if isDamage}} {{#if isDamage}}
<div> <div>
{{#if (and isGM hasTarget)}} {{#if (and isGM hasTarget)}}
{{{localize "CTHULHUETERNAL.Roll.displayArmor" targetName=targetName targetArmor=targetArmor {{{localize
realDamage=realDamage}}} "CTHULHUETERNAL.Roll.displayArmor"
{{/if}} targetName=targetName
</div> targetArmor=targetArmor
realDamage=realDamage
}}}
{{/if}}
</div>
{{/if}} {{/if}}
{{#unless isPrivate}} {{#unless isPrivate}}
<div class="dice-result"> <div class="dice-result">
<h4 class="dice-total">{{total}}</h4> <h4 class="dice-total">{{total}}</h4>
<div class="dice-formula">{{formula}}</div> <div class="dice-formula">{{formula}}</div>
{{{tooltip}}} {{{tooltip}}}
</div> </div>
{{/unless}} {{/unless}}
</div> </div>

View File

@@ -23,6 +23,7 @@
<li class="li-apply-wounds"> <li class="li-apply-wounds">
{{localize "CTHULHUETERNAL.Label.applyWounds"}} {{localize "CTHULHUETERNAL.Label.applyWounds"}}
<select name="combatant" class="li-apply-wounds-select"> <select name="combatant" class="li-apply-wounds-select">
<option value="none"></option>
{{selectOptions combatants valueAttr="id" labelAttr="name"}} {{selectOptions combatants valueAttr="id" labelAttr="name"}}
</select> </select>
</li> </li>

View File

@@ -9,9 +9,12 @@
{{#if (eq rollType "resource")}} {{#if (eq rollType "resource")}}
<legend>{{localize "CTHULHUETERNAL.Label.resourceRating"}}</legend> <legend>{{localize "CTHULHUETERNAL.Label.resourceRating"}}</legend>
<div class="dialog-skill">{{rollItem.name}} : <span class="resource-score">{{initialScore}} ({{mul initialScore 5}}%)</span></div> <div class="dialog-skill">{{rollItem.name}} : <span class="resource-score">{{initialScore}} ({{mul initialScore
<div class="dialog-skill">{{localize "CTHULHUETERNAL.Label.Hand"}} : {{rollItem.hand}} <input type="checkbox" data-action="selectHand" {{checked rollItem.enableHand}}></div> 5}}%)</span></div>
<div class="dialog-skill">{{localize "CTHULHUETERNAL.Label.Stowed"}} : {{rollItem.stowed}} <input type="checkbox" data-action="selectStowed" {{checked rollItem.enableStowed}}></div> <div class="dialog-skill">{{localize "CTHULHUETERNAL.Label.Hand"}} : {{rollItem.hand}} <input type="checkbox"
data-action="selectHand" {{checked rollItem.enableHand}}></div>
<div class="dialog-skill">{{localize "CTHULHUETERNAL.Label.Stowed"}} : {{rollItem.stowed}} <input type="checkbox"
data-action="selectStowed" {{checked rollItem.enableStowed}}></div>
<div class="dialog-skill"> <div class="dialog-skill">
{{localize "CTHULHUETERNAL.Label.Storage"}} : {{rollItem.storage}} {{localize "CTHULHUETERNAL.Label.Storage"}} : {{rollItem.storage}}
<input type="checkbox" data-action="selectStorage" {{checked rollItem.enableStorage}}> <input type="checkbox" data-action="selectStorage" {{checked rollItem.enableStorage}}>
@@ -23,76 +26,85 @@
{{#if weapon}} {{#if weapon}}
<div class="dialog-skill">{{localize "CTHULHUETERNAL.Label.Weapon"}} : {{weapon.name}}</div> <div class="dialog-skill">{{localize "CTHULHUETERNAL.Label.Weapon"}} : {{weapon.name}}</div>
{{#if (eq weapon.system.weaponType "melee")}} {{#if targetName}}
<div class="dialog-skill"> <div class="dialog-skill">{{localize "CTHULHUETERNAL.Label.Target"}} : {{targetName}}</div>
{{localize "CTHULHUETERNAL.Label.targetMove"}} {{/if}}
<select name="meleeTargetMoveChoice" class="roll-skill-modifier">
{{selectOptions choiceMeleeTargetMove localize=true selected=meleeTargetMoveChoice valueAttr="id" labelAttr="label"}}
</select>
</div>
{{/if}}
{{#if isRangedWeapon}}
<div class="dialog-skill">
{{localize "CTHULHUETERNAL.Label.rangedRange"}}
<select name="rangedRangeChoice" class="roll-skill-modifier">
{{selectOptions choiceRangedRange localize=true selected=rangedRangeChoice valueAttr="id" labelAttr="label"}}
</select>
</div>
<div class="dialog-skill">
{{localize "CTHULHUETERNAL.Label.targetMove"}}
<select name="rangedTargetMoveChoice" class="roll-skill-modifier">
{{selectOptions choiceRangedTargetMove localize=true selected=rangedTargetMoveChoice valueAttr="id" labelAttr="label"}}
</select>
</div>
<div class="dialog-skill">
{{localize "CTHULHUETERNAL.Label.aimingLastRound"}}
<input type="checkbox" name="aimingLastRound">
</div>
{{#if weapon.system.hasSight}}
<div class="dialog-skill">
{{localize "CTHULHUETERNAL.Label.aimingWithSight"}}
<input type="checkbox" name="aimingWithSight">
</div>
{{/if}}
{{/if}} {{#if (eq weapon.system.weaponType "melee")}}
<div class="dialog-skill">
{{localize "CTHULHUETERNAL.Label.targetMove"}}
<select name="meleeTargetMoveChoice" class="roll-skill-modifier">
{{selectOptions choiceMeleeTargetMove localize=true selected=meleeTargetMoveChoice valueAttr="id"
labelAttr="label"}}
</select>
</div>
{{/if}}
{{#if isRangedWeapon}}
<div class="dialog-skill">
{{localize "CTHULHUETERNAL.Label.rangedRange"}}
<select name="rangedRangeChoice" class="roll-skill-modifier">
{{selectOptions choiceRangedRange localize=true selected=rangedRangeChoice valueAttr="id" labelAttr="label"}}
</select>
</div>
<div class="dialog-skill">
{{localize "CTHULHUETERNAL.Label.targetMove"}}
<select name="rangedTargetMoveChoice" class="roll-skill-modifier">
{{selectOptions choiceRangedTargetMove localize=true selected=rangedTargetMoveChoice valueAttr="id"
labelAttr="label"}}
</select>
</div>
<div class="dialog-skill"> <div class="dialog-skill">
{{localize "CTHULHUETERNAL.Label.visibility"}} {{localize "CTHULHUETERNAL.Label.aimingLastRound"}}
<select name="visibilityChoice" class="roll-skill-modifier"> <input type="checkbox" name="aimingLastRound">
{{selectOptions choiceVisibility localize=true selected=visibilityChoice valueAttr="id" labelAttr="label"}} </div>
</select> {{#if weapon.system.hasSight}}
</div> <div class="dialog-skill">
<div class="dialog-skill"> {{localize "CTHULHUETERNAL.Label.aimingWithSight"}}
{{localize "CTHULHUETERNAL.Label.attackerState"}} <input type="checkbox" name="aimingWithSight">
<select name="attackerStateChoice" class="roll-skill-modifier"> </div>
{{selectOptions choiceAttackerState localize=true selected=attackerStateChoice valueAttr="id" labelAttr="label"}} {{/if}}
</select>
</div>
<div class="dialog-skill">
{{localize "CTHULHUETERNAL.Label.targetSize"}}
<select name="targetSizeChoice" class="roll-skill-modifier">
{{selectOptions choiceTargetSize localize=true selected=targetSizeChoice valueAttr="id" labelAttr="label"}}
</select>
</div>
{{#if weapon.system.hasSelectiveFire}} {{/if}}
<div class="dialog-skill">Selective Fire :
<select name="selectiveFireChoice" class="roll-skill-modifier"> <div class="dialog-skill">
{{selectOptions choiceSelectiveFire localize=true selected=selectiveFireChoice valueAttr="id" labelAttr="label"}} {{localize "CTHULHUETERNAL.Label.visibility"}}
</select> <select name="visibilityChoice" class="roll-skill-modifier">
</div> {{selectOptions choiceVisibility localize=true selected=visibilityChoice valueAttr="id" labelAttr="label"}}
{{/if}} </select>
</div>
<div class="dialog-skill">
{{localize "CTHULHUETERNAL.Label.attackerState"}}
<select name="attackerStateChoice" class="roll-skill-modifier">
{{selectOptions choiceAttackerState localize=true selected=attackerStateChoice valueAttr="id"
labelAttr="label"}}
</select>
</div>
<div class="dialog-skill">
{{localize "CTHULHUETERNAL.Label.targetSize"}}
<select name="targetSizeChoice" class="roll-skill-modifier">
{{selectOptions choiceTargetSize localize=true selected=targetSizeChoice valueAttr="id" labelAttr="label"}}
</select>
</div>
{{#if weapon.system.hasSelectiveFire}}
<div class="dialog-skill">Selective Fire :
<select name="selectiveFireChoice" class="roll-skill-modifier">
{{selectOptions choiceSelectiveFire localize=true selected=selectiveFireChoice valueAttr="id"
labelAttr="label"}}
</select>
</div>
{{/if}}
{{/if}} {{/if}}
{{#if isZeroWP}} {{#if isZeroWP}}
<div class="dialog-skill red-warning">{{localize "CTHULHUETERNAL.Label.ZeroWP"}}</div> <div class="dialog-skill red-warning">{{localize "CTHULHUETERNAL.Label.ZeroWP"}}</div>
{{else}} {{else}}
{{#if isLowWP}} {{#if isLowWP}}
<div class="dialog-skill orange-warning">{{localize "CTHULHUETERNAL.Label.LowWP"}} : -20%</div> <div class="dialog-skill orange-warning">{{localize "CTHULHUETERNAL.Label.LowWP"}} : -20%</div>
{{/if}} {{/if}}
{{/if}} {{/if}}
{{#if isExhausted}} {{#if isExhausted}}