Corrections diverses autout du combat
This commit is contained in:
@@ -572,8 +572,10 @@ async function _onApplyWeaponDamageClick(event, message) {
|
||||
|
||||
const button = event.currentTarget
|
||||
const card = button.closest(".celestopol.chat-roll")
|
||||
const select = button.closest(".weapon-damage-actions")?.querySelector('select[name="targetActorId"]')
|
||||
const actorId = button.dataset.actorId || select?.value || ""
|
||||
const select = button.closest(".weapon-damage-actions")?.querySelector('select[name="targetActorUuid"]')
|
||||
const selectedOption = select?.selectedOptions?.[0] ?? null
|
||||
const actorUuid = button.dataset.actorUuid || select?.value || ""
|
||||
const actorId = button.dataset.actorId || selectedOption?.dataset.actorId || ""
|
||||
const incomingWounds = Number.parseInt(button.dataset.incomingWounds ?? "", 10)
|
||||
const currentState = _getDamageApplicationState(message)
|
||||
|
||||
@@ -582,7 +584,7 @@ async function _onApplyWeaponDamageClick(event, message) {
|
||||
return
|
||||
}
|
||||
|
||||
if (!actorId) {
|
||||
if (!actorUuid && !actorId) {
|
||||
ui.notifications.warn(game.i18n.localize("CELESTOPOL.Combat.selectCharacterFirst"))
|
||||
return
|
||||
}
|
||||
@@ -593,14 +595,15 @@ async function _onApplyWeaponDamageClick(event, message) {
|
||||
button.disabled = true
|
||||
await _requestWeaponDamageApplication({
|
||||
actorId,
|
||||
actorUuid,
|
||||
incomingWounds,
|
||||
chatMessageId: message?.id ?? null,
|
||||
})
|
||||
}
|
||||
|
||||
async function _requestWeaponDamageApplication({ actorId, incomingWounds, chatMessageId = null }) {
|
||||
async function _requestWeaponDamageApplication({ actorId, actorUuid = null, incomingWounds, chatMessageId = null }) {
|
||||
if (game.user.isGM) {
|
||||
return _applyWeaponDamage({ actorId, incomingWounds, chatMessageId })
|
||||
return _applyWeaponDamage({ actorId, actorUuid, incomingWounds, chatMessageId })
|
||||
}
|
||||
|
||||
if (!game.socket) return
|
||||
@@ -608,6 +611,7 @@ async function _requestWeaponDamageApplication({ actorId, incomingWounds, chatMe
|
||||
game.socket.emit(`system.${SYSTEM_ID}`, {
|
||||
type: "applyWeaponDamage",
|
||||
actorId,
|
||||
actorUuid,
|
||||
incomingWounds,
|
||||
chatMessageId,
|
||||
})
|
||||
@@ -645,7 +649,7 @@ function _setDamageStatus(root, { text, cssClass = "" }) {
|
||||
|
||||
function _renderPendingWeaponDamageState(root) {
|
||||
const button = root.querySelector('[data-action="apply-weapon-damage"]')
|
||||
const select = root.querySelector('select[name="targetActorId"]')
|
||||
const select = root.querySelector('select[name="targetActorUuid"]')
|
||||
if (button) {
|
||||
button.disabled = true
|
||||
button.textContent = game.i18n.localize("CELESTOPOL.Combat.damageApplying")
|
||||
@@ -659,7 +663,7 @@ function _renderPendingWeaponDamageState(root) {
|
||||
|
||||
function _renderWeaponDamageState(message, root) {
|
||||
const button = root.querySelector('[data-action="apply-weapon-damage"]')
|
||||
const select = root.querySelector('select[name="targetActorId"]')
|
||||
const select = root.querySelector('select[name="targetActorUuid"]')
|
||||
const state = _getDamageApplicationState(message)
|
||||
|
||||
if (!state?.applied) {
|
||||
@@ -701,8 +705,8 @@ async function _markChatMessageDamageApplied(chatMessageId, data) {
|
||||
_updateRenderedChatMessageState(message)
|
||||
}
|
||||
|
||||
async function _applyWeaponDamage({ actorId, incomingWounds, chatMessageId = null }) {
|
||||
const actor = game.actors.get(actorId)
|
||||
async function _applyWeaponDamage({ actorId, actorUuid = null, incomingWounds, chatMessageId = null }) {
|
||||
const actor = await CelestopolRoll.resolveActor({ actorId, actorUuid })
|
||||
if (!actor) return null
|
||||
|
||||
const message = chatMessageId ? game.messages.get(chatMessageId) : null
|
||||
|
||||
13
lang/fr.json
13
lang/fr.json
@@ -202,19 +202,23 @@
|
||||
"Combat": {
|
||||
"initiative": "Initiative",
|
||||
"attack": "Attaquer",
|
||||
"unarmedAttack": "Attaque à main nue",
|
||||
"baseActions": "Actions de base",
|
||||
"baseRangedDefense": "Esquive d'attaque à distance",
|
||||
"rangedAttack": "Attaque à distance",
|
||||
"corpsPnj": "Corps du PNJ",
|
||||
"tie": "ÉGALITÉ",
|
||||
"tieDesc": "Personne n'est blessé",
|
||||
"successHit": "Attaque réussie — cible touchée",
|
||||
"failureHit": "Joueur touché — 1 blessure (mêlée)",
|
||||
"failureHit": "Joueur touché — dégâts de l'arme appliqués (mêlée)",
|
||||
"distanceNoWound": "Raté — pas de riposte",
|
||||
"weaponDamage": "dégâts supplémentaires",
|
||||
"playerWounded": "Blessure infligée au joueur (mêlée)",
|
||||
"playerWounded": "Blessures infligées au joueur (mêlée)",
|
||||
"rangedDefenseTitle": "Esquiver (Mobilité)",
|
||||
"rangedDefenseTag": "Défense à distance",
|
||||
"rangedDefenseSuccess": "Attaque esquivée — pas de blessure",
|
||||
"rangedDefenseFailure": "Touché par le PNJ — 1 blessure",
|
||||
"rangedDefensePlayerWounded": "Blessure infligée par attaque à distance",
|
||||
"rangedDefenseFailure": "Touché par le PNJ — dégâts de l'arme appliqués",
|
||||
"rangedDefensePlayerWounded": "Blessures infligées par attaque à distance",
|
||||
"targetLabel": "Cible",
|
||||
"targetAuto": "Saisir manuellement",
|
||||
"targetCharacterLabel": "Personnage visé",
|
||||
@@ -248,6 +252,7 @@
|
||||
"competences": "Domaines",
|
||||
"blessures": "Jauges",
|
||||
"factions": "Factions",
|
||||
"combat": "Combat",
|
||||
"equipement": "Équipement",
|
||||
"biography": "Biographie",
|
||||
"description": "Description",
|
||||
|
||||
@@ -40,6 +40,8 @@ export default class CelestopolActorSheet extends HandlebarsApplicationMixin(fou
|
||||
delete: CelestopolActorSheet.#onItemDelete,
|
||||
attack: CelestopolActorSheet.#onAttack,
|
||||
rangedDefense: CelestopolActorSheet.#onRangedDefense,
|
||||
unarmedAttack: CelestopolActorSheet.#onUnarmedAttack,
|
||||
baseRangedDefense: CelestopolActorSheet.#onBaseRangedDefense,
|
||||
trackBox: CelestopolActorSheet.#onTrackBox,
|
||||
skillLevel: CelestopolActorSheet.#onSkillLevel,
|
||||
factionLevel: CelestopolActorSheet.#onFactionLevel,
|
||||
@@ -197,6 +199,16 @@ export default class CelestopolActorSheet extends HandlebarsApplicationMixin(fou
|
||||
await this.document.system.rollRangedDefense(itemId)
|
||||
}
|
||||
|
||||
static async #onUnarmedAttack() {
|
||||
if (typeof this.document.system.rollUnarmedAttack !== "function") return
|
||||
await this.document.system.rollUnarmedAttack()
|
||||
}
|
||||
|
||||
static async #onBaseRangedDefense() {
|
||||
if (typeof this.document.system.rollRangedDefenseBase !== "function") return
|
||||
await this.document.system.rollRangedDefenseBase()
|
||||
}
|
||||
|
||||
/** Met à jour une jauge de piste (blessures/destin/spleen) par clic sur une case. */
|
||||
static #onTrackBox(_event, target) {
|
||||
if (!this.isEditable) return
|
||||
|
||||
@@ -42,6 +42,7 @@ export default class CelestopolCharacterSheet extends CelestopolActorSheet {
|
||||
competences:{ template: "systems/fvtt-celestopol/templates/character-competences.hbs" },
|
||||
blessures: { template: "systems/fvtt-celestopol/templates/character-blessures.hbs" },
|
||||
factions: { template: "systems/fvtt-celestopol/templates/character-factions.hbs" },
|
||||
combat: { template: "systems/fvtt-celestopol/templates/character-combat.hbs" },
|
||||
equipement: { template: "systems/fvtt-celestopol/templates/character-equipement.hbs" },
|
||||
biography: { template: "systems/fvtt-celestopol/templates/character-biography.hbs" },
|
||||
}
|
||||
@@ -53,6 +54,7 @@ export default class CelestopolCharacterSheet extends CelestopolActorSheet {
|
||||
competences:{ id: "competences", group: "sheet", icon: "fa-solid fa-dice-d6", label: "CELESTOPOL.Tab.competences" },
|
||||
blessures: { id: "blessures", group: "sheet", icon: "fa-solid fa-heart-crack", label: "CELESTOPOL.Tab.blessures" },
|
||||
factions: { id: "factions", group: "sheet", icon: "fa-solid fa-flag", label: "CELESTOPOL.Tab.factions" },
|
||||
combat: { id: "combat", group: "sheet", icon: "fa-solid fa-khanda", label: "CELESTOPOL.Tab.combat" },
|
||||
equipement: { id: "equipement", group: "sheet", icon: "fa-solid fa-shield-halved",label: "CELESTOPOL.Tab.equipement" },
|
||||
biography: { id: "biography", group: "sheet", icon: "fa-solid fa-book", label: "CELESTOPOL.Tab.biography" },
|
||||
}
|
||||
@@ -156,6 +158,12 @@ export default class CelestopolCharacterSheet extends CelestopolActorSheet {
|
||||
})
|
||||
break
|
||||
|
||||
case "combat":
|
||||
context.tab = context.tabs.combat
|
||||
context.weapons = doc.itemTypes.weapon.sort((a, b) => a.name.localeCompare(b.name))
|
||||
context.armures = doc.itemTypes.armure.sort((a, b) => a.name.localeCompare(b.name))
|
||||
break
|
||||
|
||||
case "biography":
|
||||
context.tab = context.tabs.biography
|
||||
context.xpLogEmpty = (doc.system.xp?.log?.length ?? 0) === 0
|
||||
@@ -173,8 +181,6 @@ export default class CelestopolCharacterSheet extends CelestopolActorSheet {
|
||||
|
||||
case "equipement":
|
||||
context.tab = context.tabs.equipement
|
||||
context.weapons = doc.itemTypes.weapon.sort((a, b) => a.name.localeCompare(b.name))
|
||||
context.armures = doc.itemTypes.armure.sort((a, b) => a.name.localeCompare(b.name))
|
||||
context.equipments= doc.itemTypes.equipment.sort((a, b) => a.name.localeCompare(b.name))
|
||||
break
|
||||
}
|
||||
|
||||
@@ -35,6 +35,7 @@ export default class CelestopolNPCSheet extends CelestopolActorSheet {
|
||||
tabs: { template: "templates/generic/tab-navigation.hbs" },
|
||||
competences: { template: "systems/fvtt-celestopol/templates/npc-competences.hbs" },
|
||||
blessures: { template: "systems/fvtt-celestopol/templates/npc-blessures.hbs" },
|
||||
combat: { template: "systems/fvtt-celestopol/templates/npc-combat.hbs" },
|
||||
equipement: { template: "systems/fvtt-celestopol/templates/npc-equipement.hbs" },
|
||||
biographie: { template: "systems/fvtt-celestopol/templates/npc-biographie.hbs" },
|
||||
}
|
||||
@@ -45,6 +46,7 @@ export default class CelestopolNPCSheet extends CelestopolActorSheet {
|
||||
const tabs = {
|
||||
competences: { id: "competences", group: "sheet", icon: "fa-solid fa-dice-d6", label: "CELESTOPOL.Tab.competences" },
|
||||
blessures: { id: "blessures", group: "sheet", icon: "fa-solid fa-heart-crack", label: "CELESTOPOL.Tab.blessures" },
|
||||
combat: { id: "combat", group: "sheet", icon: "fa-solid fa-khanda", label: "CELESTOPOL.Tab.combat" },
|
||||
equipement: { id: "equipement", group: "sheet", icon: "fa-solid fa-shield-halved",label: "CELESTOPOL.Tab.equipement" },
|
||||
biographie: { id: "biographie", group: "sheet", icon: "fa-solid fa-book-open", label: "CELESTOPOL.Tab.biographie" },
|
||||
}
|
||||
@@ -106,6 +108,9 @@ export default class CelestopolNPCSheet extends CelestopolActorSheet {
|
||||
context.system.notes, { relativeTo: this.document }
|
||||
)
|
||||
break
|
||||
case "combat":
|
||||
context.tab = context.tabs.combat
|
||||
break
|
||||
case "equipement":
|
||||
context.tab = context.tabs.equipement
|
||||
break
|
||||
|
||||
@@ -78,6 +78,22 @@ export class CelestopolRoll extends Roll {
|
||||
.reduce((sum, a) => sum + Math.abs(a.system.protection ?? a.system.malus ?? 0), 0)
|
||||
}
|
||||
|
||||
/**
|
||||
* Résout un acteur à partir de son UUID si disponible, sinon via son identifiant monde.
|
||||
* @param {object} ref
|
||||
* @param {string|null} ref.actorUuid
|
||||
* @param {string|null} ref.actorId
|
||||
* @returns {Promise<Actor|null>}
|
||||
*/
|
||||
static async resolveActor({ actorUuid = null, actorId = null } = {}) {
|
||||
if (actorUuid) {
|
||||
const actorFromUuid = await fromUuid(actorUuid)
|
||||
if (actorFromUuid) return actorFromUuid
|
||||
}
|
||||
if (actorId) return game.actors.get(actorId) ?? null
|
||||
return null
|
||||
}
|
||||
|
||||
/**
|
||||
* Ouvre le dialogue de configuration du jet via DialogV2 et exécute le jet.
|
||||
* @param {object} options
|
||||
@@ -298,11 +314,14 @@ export class CelestopolRoll extends Roll {
|
||||
const useFortune = fortuneValue > 0 && (rollContext.useFortune === true || rollContext.useFortune === "true")
|
||||
const puiserRessources = rollContext.puiserRessources === true || rollContext.puiserRessources === "true"
|
||||
const rollMoonDie = rollContext.rollMoonDie === true || rollContext.rollMoonDie === "true"
|
||||
const selectedCombatTargetId = typeof rollContext.targetSelect === "string" ? rollContext.targetSelect : ""
|
||||
const selectedCombatTarget = selectedCombatTargetId
|
||||
? availableTargets.find(t => t.id === selectedCombatTargetId) ?? null
|
||||
const selectedCombatTargetRef = typeof rollContext.targetSelect === "string" ? rollContext.targetSelect : ""
|
||||
const selectedCombatTarget = selectedCombatTargetRef
|
||||
? availableTargets.find(t => t.uuid === selectedCombatTargetRef || t.id === selectedCombatTargetRef) ?? null
|
||||
: null
|
||||
const resolvedWeaponName = (isRangedDefense && selectedCombatTarget?.weaponName) ? selectedCombatTarget.weaponName : weaponName
|
||||
const resolvedWeaponDegats = (isRangedDefense && selectedCombatTarget?.weaponDegats) ? selectedCombatTarget.weaponDegats : weaponDegats
|
||||
const targetActorId = selectedCombatTarget?.id || ""
|
||||
const targetActorUuid = selectedCombatTarget?.uuid || ""
|
||||
const targetActorName = selectedCombatTarget?.name || ""
|
||||
|
||||
// En résistance : forcer puiser=false, lune=false, fortune=false, destin=false
|
||||
@@ -352,9 +371,10 @@ export class CelestopolRoll extends Roll {
|
||||
isCombat,
|
||||
isRangedDefense,
|
||||
weaponType,
|
||||
weaponName,
|
||||
weaponDegats,
|
||||
weaponName: resolvedWeaponName,
|
||||
weaponDegats: resolvedWeaponDegats,
|
||||
targetActorId,
|
||||
targetActorUuid,
|
||||
targetActorName,
|
||||
availableTargets,
|
||||
rangedMod: effectiveRangedMod,
|
||||
@@ -375,7 +395,10 @@ export class CelestopolRoll extends Roll {
|
||||
roll.computeResult()
|
||||
|
||||
// Test de résistance échoué → cocher automatiquement la prochaine case de blessure
|
||||
const actor = game.actors.get(options.actorId)
|
||||
const actor = await this.resolveActor({
|
||||
actorUuid: options.actorUuid ?? null,
|
||||
actorId: options.actorId ?? null,
|
||||
})
|
||||
if (isResistance && actor && roll.options.resultType === "failure") {
|
||||
const nextLvl = (actor.system.blessures.lvl ?? 0) + 1
|
||||
if (nextLvl <= 8) {
|
||||
@@ -384,16 +407,25 @@ export class CelestopolRoll extends Roll {
|
||||
}
|
||||
}
|
||||
|
||||
// Mêlée échouée OU défense à distance échouée → joueur prend une blessure
|
||||
// Mêlée échouée OU défense à distance échouée → le protagoniste subit les dégâts de l'arme PNJ
|
||||
if (isCombat && (weaponType === "melee" || isRangedDefense) && actor && roll.options.resultType === "failure") {
|
||||
const nextLvl = (actor.system.blessures.lvl ?? 0) + 1
|
||||
if (nextLvl <= 8) {
|
||||
const incomingWounds = this.getIncomingWounds(resolvedWeaponDegats)
|
||||
const protection = this.getActorArmorProtection(actor)
|
||||
const appliedWounds = incomingWounds === null
|
||||
? 1
|
||||
: Math.max(0, incomingWounds - protection)
|
||||
if (appliedWounds > 0) {
|
||||
const nextLvl = Math.min(8, (actor.system.blessures.lvl ?? 0) + appliedWounds)
|
||||
await actor.update({ "system.blessures.lvl": nextLvl })
|
||||
roll.options.woundTaken = nextLvl
|
||||
roll.options.woundTakenCount = appliedWounds
|
||||
roll.options.incomingWounds = incomingWounds
|
||||
roll.options.selectedTargetProtection = protection
|
||||
roll.options.selectedTargetAppliedWounds = appliedWounds
|
||||
}
|
||||
}
|
||||
|
||||
await roll.toMessage({}, { rollMode: rollData.rollMode })
|
||||
await roll.toMessage({}, { messageMode: rollData.rollMode })
|
||||
|
||||
// Batching de toutes les mises à jour de l'acteur en un seul appel réseau
|
||||
if (actor) {
|
||||
@@ -506,12 +538,16 @@ export class CelestopolRoll extends Roll {
|
||||
const incomingWounds = isWeaponHit ? this.constructor.getIncomingWounds(weaponDegats) : null
|
||||
const hasVariableDamage = isWeaponHit && incomingWounds === null
|
||||
const targetActorId = this.options.targetActorId ?? ""
|
||||
const targetActorUuid = this.options.targetActorUuid ?? ""
|
||||
const targetActorName = this.options.targetActorName ?? ""
|
||||
const availableTargets = (this.options.availableTargets ?? []).map(target => ({
|
||||
...target,
|
||||
selected: target.id === targetActorId,
|
||||
selected: target.uuid === targetActorUuid || target.id === targetActorId,
|
||||
}))
|
||||
const selectedTargetActor = targetActorId ? game.actors.get(targetActorId) : null
|
||||
const selectedTargetActor = await this.constructor.resolveActor({
|
||||
actorUuid: targetActorUuid,
|
||||
actorId: targetActorId,
|
||||
})
|
||||
const selectedTargetProtection = selectedTargetActor
|
||||
? this.constructor.getActorArmorProtection(selectedTargetActor)
|
||||
: null
|
||||
@@ -569,6 +605,7 @@ export class CelestopolRoll extends Roll {
|
||||
weaponType: this.options.weaponType ?? null,
|
||||
isRangedDefense: this.options.isRangedDefense ?? false,
|
||||
woundTaken: this.options.woundTaken ?? null,
|
||||
woundTakenCount: this.options.woundTakenCount ?? null,
|
||||
situationMod: this.options.situationMod ?? 0,
|
||||
rangedMod: this.options.rangedMod ?? 0,
|
||||
hasDamageSummary: isWeaponHit,
|
||||
@@ -577,6 +614,7 @@ export class CelestopolRoll extends Roll {
|
||||
hasVariableDamage,
|
||||
canApplyWeaponDamage: incomingWounds !== null,
|
||||
targetActorId,
|
||||
targetActorUuid,
|
||||
targetActorName,
|
||||
selectedTargetProtection,
|
||||
selectedTargetAppliedWounds,
|
||||
@@ -595,14 +633,40 @@ export class CelestopolRoll extends Roll {
|
||||
}
|
||||
|
||||
/** @override */
|
||||
async toMessage(messageData = {}, { rollMode, create = true } = {}) {
|
||||
async toMessage(messageData = {}, { messageMode, rollMode, create = true } = {}) {
|
||||
if (rollMode) {
|
||||
messageMode = Roll._mapLegacyRollMode(rollMode)
|
||||
}
|
||||
messageMode ||= game.settings.get("core", "messageMode")
|
||||
if (!this._evaluated) await this.evaluate({ allowInteractive: messageMode !== "blind" })
|
||||
|
||||
const skillLocalized = this.skillLabel ? game.i18n.localize(this.skillLabel) : ""
|
||||
const statLocalized = this.options.statLabel
|
||||
? game.i18n.localize(this.options.statLabel) : ""
|
||||
const flavor = statLocalized
|
||||
? `<strong>${statLocalized} › ${skillLocalized}</strong>`
|
||||
: `<strong>${skillLocalized}</strong>`
|
||||
return super.toMessage({ flavor, ...messageData }, { rollMode })
|
||||
const speakerActor = await this.constructor.resolveActor({
|
||||
actorUuid: this.options.actorUuid ?? null,
|
||||
actorId: this.options.actorId ?? null,
|
||||
})
|
||||
const content = await this.render({ isPrivate: messageMode !== "public" })
|
||||
const chatData = foundry.utils.mergeObject({
|
||||
author: game.user.id,
|
||||
content,
|
||||
flavor,
|
||||
sound: CONFIG.sounds.dice,
|
||||
rolls: [this],
|
||||
speaker: speakerActor ? ChatMessage.getSpeaker({ actor: speakerActor }) : undefined,
|
||||
style: CONST.CHAT_MESSAGE_STYLES.OTHER,
|
||||
}, messageData)
|
||||
|
||||
const cls = foundry.utils.getDocumentClass("ChatMessage")
|
||||
const msg = new cls(chatData)
|
||||
msg.applyMode(messageMode)
|
||||
|
||||
if (create) return cls.create(msg)
|
||||
return msg.toObject()
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -641,7 +705,7 @@ export class CelestopolRoll extends Roll {
|
||||
content,
|
||||
speaker,
|
||||
rolls: [roll],
|
||||
style: CONST.CHAT_MESSAGE_STYLES?.ROLL ?? 5,
|
||||
style: CONST.CHAT_MESSAGE_STYLES.OTHER,
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
@@ -13,6 +13,8 @@
|
||||
|
||||
import { SYSTEM } from "../config/system.mjs"
|
||||
|
||||
const WEAPON_DAMAGE_PRIORITY = { "0": 0, "1": 1, "2": 2, X: 3 }
|
||||
|
||||
export default class CelestopolCharacter extends foundry.abstract.TypeDataModel {
|
||||
static defineSchema() {
|
||||
const fields = foundry.data.fields
|
||||
@@ -218,6 +220,7 @@ export default class CelestopolCharacter extends foundry.abstract.TypeDataModel
|
||||
|
||||
return CelestopolRoll.prompt({
|
||||
actorId: this.parent.id,
|
||||
actorUuid: this.parent.uuid,
|
||||
actorName: this.parent.name,
|
||||
actorImage: this.parent.img,
|
||||
statId,
|
||||
@@ -249,6 +252,7 @@ export default class CelestopolCharacter extends foundry.abstract.TypeDataModel
|
||||
|
||||
return CelestopolRoll.prompt({
|
||||
actorId: this.parent.id,
|
||||
actorUuid: this.parent.uuid,
|
||||
actorName: this.parent.name,
|
||||
actorImage: this.parent.img,
|
||||
statId,
|
||||
@@ -270,21 +274,47 @@ export default class CelestopolCharacter extends foundry.abstract.TypeDataModel
|
||||
/**
|
||||
* Collecte les cibles de combat sur la scène active.
|
||||
* Pour un PJ attaquant, seules les cibles PNJ présentes sur la scène sont proposées.
|
||||
* @returns {Array<{id:string, name:string, corps:number}>}
|
||||
* @param {object} options
|
||||
* @param {boolean} [options.onlyRanged=false]
|
||||
* @param {boolean} [options.fallbackToAll=false]
|
||||
* @returns {Array<{id:string, uuid:string, name:string, corps:number, weaponName?:string, weaponDegats?:string}>}
|
||||
*/
|
||||
_getCombatTargets() {
|
||||
_getCombatTargets({ onlyRanged = false, fallbackToAll = false } = {}) {
|
||||
const getBestRangedWeapon = actor => {
|
||||
const rangedWeapons = actor.itemTypes?.weapon?.filter(item => item.system.type === "distance") ?? []
|
||||
if (!rangedWeapons.length) return null
|
||||
return rangedWeapons.reduce((best, item) => {
|
||||
if (!best) return item
|
||||
const bestPriority = WEAPON_DAMAGE_PRIORITY[best.system.degats] ?? -1
|
||||
const itemPriority = WEAPON_DAMAGE_PRIORITY[item.system.degats] ?? -1
|
||||
if (itemPriority !== bestPriority) return itemPriority > bestPriority ? item : best
|
||||
return item.name.localeCompare(best.name) < 0 ? item : best
|
||||
}, null)
|
||||
}
|
||||
|
||||
const toEntry = actor => ({
|
||||
id: actor.id,
|
||||
uuid: actor.uuid,
|
||||
name: actor.name,
|
||||
corps: actor.system.stats?.corps?.res ?? 0,
|
||||
...(onlyRanged ? (() => {
|
||||
const weapon = getBestRangedWeapon(actor)
|
||||
return weapon ? {
|
||||
weaponName: weapon.name,
|
||||
weaponDegats: weapon.system.degats,
|
||||
} : {}
|
||||
})() : {}),
|
||||
})
|
||||
const sceneTokens = canvas?.scene?.isView ? (canvas.tokens?.placeables ?? []) : []
|
||||
return [...new Map(sceneTokens
|
||||
const targets = [...new Map(sceneTokens
|
||||
.filter(t => t.actor?.type === "npc" && t.actor.id !== this.parent.id)
|
||||
.filter(t => !onlyRanged || getBestRangedWeapon(t.actor))
|
||||
.map(t => {
|
||||
const actor = t.actor
|
||||
return [actor.id, toEntry(actor)]
|
||||
return [actor.uuid, toEntry(actor)]
|
||||
})).values()]
|
||||
if (!targets.length && onlyRanged && fallbackToAll) return this._getCombatTargets()
|
||||
return targets
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -304,6 +334,7 @@ export default class CelestopolCharacter extends foundry.abstract.TypeDataModel
|
||||
|
||||
return CelestopolRoll.prompt({
|
||||
actorId: this.parent.id,
|
||||
actorUuid: this.parent.uuid,
|
||||
actorName: this.parent.name,
|
||||
actorImage: this.parent.img,
|
||||
statId: "corps",
|
||||
@@ -326,6 +357,40 @@ export default class CelestopolCharacter extends foundry.abstract.TypeDataModel
|
||||
})
|
||||
}
|
||||
|
||||
/**
|
||||
* Lance une attaque de mêlée à mains nues.
|
||||
* @returns {Promise<import("../documents/roll.mjs").CelestopolRoll|null>}
|
||||
*/
|
||||
async rollUnarmedAttack() {
|
||||
const { CelestopolRoll } = await import("../documents/roll.mjs")
|
||||
const echauffouree = this.stats.corps.echauffouree
|
||||
if (!echauffouree) return null
|
||||
|
||||
return CelestopolRoll.prompt({
|
||||
actorId: this.parent.id,
|
||||
actorUuid: this.parent.uuid,
|
||||
actorName: this.parent.name,
|
||||
actorImage: this.parent.img,
|
||||
statId: "corps",
|
||||
skillId: "echauffouree",
|
||||
statLabel: SYSTEM.STATS.corps.label,
|
||||
skillLabel: SYSTEM.SKILLS.corps.echauffouree.label,
|
||||
skillValue: echauffouree.value,
|
||||
woundMalus: this.getWoundMalus(),
|
||||
armorMalus: this.getArmorMalusForRoll("corps", "echauffouree"),
|
||||
woundLevel: this.blessures.lvl,
|
||||
rollMoonDie: this.prefs.rollMoonDie ?? false,
|
||||
destGaugeFull: this.destin.lvl > 0,
|
||||
fortuneValue: this.attributs.fortune.value,
|
||||
isCombat: true,
|
||||
isRangedDefense: false,
|
||||
weaponType: "melee",
|
||||
weaponName: game.i18n.localize("CELESTOPOL.Combat.unarmedAttack"),
|
||||
weaponDegats: "0",
|
||||
availableTargets: this._getCombatTargets(),
|
||||
})
|
||||
}
|
||||
|
||||
/**
|
||||
* Lance un jet de défense contre une attaque à distance (test Mobilité vs Corps PNJ).
|
||||
* Succès → esquive réussie.
|
||||
@@ -342,6 +407,7 @@ export default class CelestopolCharacter extends foundry.abstract.TypeDataModel
|
||||
|
||||
return CelestopolRoll.prompt({
|
||||
actorId: this.parent.id,
|
||||
actorUuid: this.parent.uuid,
|
||||
actorName: this.parent.name,
|
||||
actorImage: this.parent.img,
|
||||
statId: "corps",
|
||||
@@ -363,4 +429,38 @@ export default class CelestopolCharacter extends foundry.abstract.TypeDataModel
|
||||
availableTargets: this._getCombatTargets(),
|
||||
})
|
||||
}
|
||||
|
||||
/**
|
||||
* Lance une esquive d'attaque à distance sans dépendre d'une arme possédée par le PJ.
|
||||
* @returns {Promise<import("../documents/roll.mjs").CelestopolRoll|null>}
|
||||
*/
|
||||
async rollRangedDefenseBase() {
|
||||
const { CelestopolRoll } = await import("../documents/roll.mjs")
|
||||
const mobilite = this.stats.corps.mobilite
|
||||
if (!mobilite) return null
|
||||
|
||||
return CelestopolRoll.prompt({
|
||||
actorId: this.parent.id,
|
||||
actorUuid: this.parent.uuid,
|
||||
actorName: this.parent.name,
|
||||
actorImage: this.parent.img,
|
||||
statId: "corps",
|
||||
skillId: "mobilite",
|
||||
statLabel: SYSTEM.STATS.corps.label,
|
||||
skillLabel: SYSTEM.SKILLS.corps.mobilite.label,
|
||||
skillValue: mobilite.value,
|
||||
woundMalus: this.getWoundMalus(),
|
||||
armorMalus: this.getArmorMalusForRoll("corps", "mobilite"),
|
||||
woundLevel: this.blessures.lvl,
|
||||
rollMoonDie: this.prefs.rollMoonDie ?? false,
|
||||
destGaugeFull: this.destin.lvl > 0,
|
||||
fortuneValue: this.attributs.fortune.value,
|
||||
isCombat: true,
|
||||
isRangedDefense: true,
|
||||
weaponType: "distance",
|
||||
weaponName: game.i18n.localize("CELESTOPOL.Combat.rangedAttack"),
|
||||
weaponDegats: "0",
|
||||
availableTargets: this._getCombatTargets({ onlyRanged: true, fallbackToAll: true }),
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
@@ -112,6 +112,7 @@ export default class CelestopolNPC extends foundry.abstract.TypeDataModel {
|
||||
|
||||
return CelestopolRoll.prompt({
|
||||
actorId: this.parent.id,
|
||||
actorUuid: this.parent.uuid,
|
||||
actorName: this.parent.name,
|
||||
actorImage: this.parent.img,
|
||||
statId,
|
||||
@@ -127,4 +128,95 @@ export default class CelestopolNPC extends foundry.abstract.TypeDataModel {
|
||||
async rollResistance(statId) {
|
||||
return this.roll(statId)
|
||||
}
|
||||
|
||||
/**
|
||||
* Collecte les cibles protagonistes de la scène active pour les jets de combat PNJ.
|
||||
* @returns {Array<{id:string, name:string, corps:number}>}
|
||||
*/
|
||||
_getCombatTargets() {
|
||||
const toEntry = actor => ({
|
||||
id: actor.id,
|
||||
uuid: actor.uuid,
|
||||
name: actor.name,
|
||||
corps: actor.system.stats?.corps?.res ?? 0,
|
||||
})
|
||||
const sceneTokens = canvas?.scene?.isView ? (canvas.tokens?.placeables ?? []) : []
|
||||
return [...new Map(sceneTokens
|
||||
.filter(t => t.actor?.type === "character" && t.actor.id !== this.parent.id)
|
||||
.map(t => {
|
||||
const actor = t.actor
|
||||
return [actor.id, toEntry(actor)]
|
||||
})).values()]
|
||||
}
|
||||
|
||||
/**
|
||||
* Lance une attaque PNJ avec une arme.
|
||||
* Le test utilise le domaine Corps et transmet explicitement les dégâts de l'arme.
|
||||
* @param {string} itemId
|
||||
* @returns {Promise<import("../documents/roll.mjs").CelestopolRoll|null>}
|
||||
*/
|
||||
async rollAttack(itemId) {
|
||||
const { CelestopolRoll } = await import("../documents/roll.mjs")
|
||||
const item = this.parent.items.get(itemId)
|
||||
if (!item || item.type !== "weapon") return null
|
||||
|
||||
return CelestopolRoll.prompt({
|
||||
actorId: this.parent.id,
|
||||
actorUuid: this.parent.uuid,
|
||||
actorName: this.parent.name,
|
||||
actorImage: this.parent.img,
|
||||
statId: "corps",
|
||||
skillId: null,
|
||||
statLabel: SYSTEM.STATS.corps.label,
|
||||
skillLabel: "CELESTOPOL.Combat.attack",
|
||||
skillValue: this.stats.corps.res,
|
||||
woundMalus: this.getWoundMalus(),
|
||||
armorMalus: this.getArmorMalusForRoll("corps"),
|
||||
woundLevel: this.blessures.lvl,
|
||||
rollMoonDie: false,
|
||||
destGaugeFull: false,
|
||||
fortuneValue: 0,
|
||||
isCombat: true,
|
||||
isRangedDefense: false,
|
||||
weaponType: item.system.type,
|
||||
weaponName: item.name,
|
||||
weaponDegats: item.system.degats,
|
||||
availableTargets: this._getCombatTargets(),
|
||||
})
|
||||
}
|
||||
|
||||
/**
|
||||
* Lance un jet de tir/esquive PNJ avec une arme à distance.
|
||||
* @param {string} itemId
|
||||
* @returns {Promise<import("../documents/roll.mjs").CelestopolRoll|null>}
|
||||
*/
|
||||
async rollRangedDefense(itemId) {
|
||||
const { CelestopolRoll } = await import("../documents/roll.mjs")
|
||||
const item = this.parent.items.get(itemId)
|
||||
if (!item || item.type !== "weapon" || item.system.type !== "distance") return null
|
||||
|
||||
return CelestopolRoll.prompt({
|
||||
actorId: this.parent.id,
|
||||
actorUuid: this.parent.uuid,
|
||||
actorName: this.parent.name,
|
||||
actorImage: this.parent.img,
|
||||
statId: "corps",
|
||||
skillId: null,
|
||||
statLabel: SYSTEM.STATS.corps.label,
|
||||
skillLabel: "CELESTOPOL.Combat.rangedDefenseTitle",
|
||||
skillValue: this.stats.corps.res,
|
||||
woundMalus: this.getWoundMalus(),
|
||||
armorMalus: this.getArmorMalusForRoll("corps"),
|
||||
woundLevel: this.blessures.lvl,
|
||||
rollMoonDie: false,
|
||||
destGaugeFull: false,
|
||||
fortuneValue: 0,
|
||||
isCombat: true,
|
||||
isRangedDefense: true,
|
||||
weaponType: "distance",
|
||||
weaponName: item.name,
|
||||
weaponDegats: item.system.degats,
|
||||
availableTargets: this._getCombatTargets(),
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1 +1 @@
|
||||
MANIFEST-000050
|
||||
MANIFEST-000062
|
||||
|
||||
@@ -1,8 +1,3 @@
|
||||
2026/04/12-11:08:25.575175 7f20ed3fd6c0 Recovering log #48
|
||||
2026/04/12-11:08:25.624792 7f20ed3fd6c0 Delete type=3 #46
|
||||
2026/04/12-11:08:25.624844 7f20ed3fd6c0 Delete type=0 #48
|
||||
2026/04/12-11:51:45.335730 7f1e4ffff6c0 Level-0 table #53: started
|
||||
2026/04/12-11:51:45.335775 7f1e4ffff6c0 Level-0 table #53: 0 bytes OK
|
||||
2026/04/12-11:51:45.341863 7f1e4ffff6c0 Delete type=0 #51
|
||||
2026/04/12-11:51:45.348345 7f1e4ffff6c0 Manual compaction at level-0 from '!journal!eNYstmPK0mMmVJYC' @ 72057594037927935 : 1 .. '!journal.pages!eNYstmPK0mMmVJYC.r9h1ggd3G9hiqYJX' @ 0 : 0; will stop at (end)
|
||||
2026/04/12-11:51:45.358808 7f1e4ffff6c0 Manual compaction at level-1 from '!journal!eNYstmPK0mMmVJYC' @ 72057594037927935 : 1 .. '!journal.pages!eNYstmPK0mMmVJYC.r9h1ggd3G9hiqYJX' @ 0 : 0; will stop at (end)
|
||||
2026/04/13-13:11:31.249954 7f2a6b7fe6c0 Recovering log #60
|
||||
2026/04/13-13:11:31.302525 7f2a6b7fe6c0 Delete type=3 #58
|
||||
2026/04/13-13:11:31.302579 7f2a6b7fe6c0 Delete type=0 #60
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
2026/04/12-00:49:47.046033 7f20ee3ff6c0 Recovering log #44
|
||||
2026/04/12-00:49:47.104410 7f20ee3ff6c0 Delete type=3 #42
|
||||
2026/04/12-00:49:47.104480 7f20ee3ff6c0 Delete type=0 #44
|
||||
2026/04/12-00:50:13.912349 7f1e4ffff6c0 Level-0 table #49: started
|
||||
2026/04/12-00:50:13.912377 7f1e4ffff6c0 Level-0 table #49: 0 bytes OK
|
||||
2026/04/12-00:50:13.950240 7f1e4ffff6c0 Delete type=0 #47
|
||||
2026/04/12-00:50:14.032932 7f1e4ffff6c0 Manual compaction at level-0 from '!journal!eNYstmPK0mMmVJYC' @ 72057594037927935 : 1 .. '!journal.pages!eNYstmPK0mMmVJYC.r9h1ggd3G9hiqYJX' @ 0 : 0; will stop at (end)
|
||||
2026/04/12-00:50:14.032969 7f1e4ffff6c0 Manual compaction at level-1 from '!journal!eNYstmPK0mMmVJYC' @ 72057594037927935 : 1 .. '!journal.pages!eNYstmPK0mMmVJYC.r9h1ggd3G9hiqYJX' @ 0 : 0; will stop at (end)
|
||||
2026/04/13-13:10:44.862648 7ff582bff6c0 Recovering log #56
|
||||
2026/04/13-13:10:44.908015 7ff582bff6c0 Delete type=3 #54
|
||||
2026/04/13-13:10:44.908061 7ff582bff6c0 Delete type=0 #56
|
||||
2026/04/13-13:10:47.939764 7ff580bfb6c0 Level-0 table #61: started
|
||||
2026/04/13-13:10:47.939788 7ff580bfb6c0 Level-0 table #61: 0 bytes OK
|
||||
2026/04/13-13:10:47.972855 7ff580bfb6c0 Delete type=0 #59
|
||||
2026/04/13-13:10:47.973045 7ff580bfb6c0 Manual compaction at level-0 from '!journal!eNYstmPK0mMmVJYC' @ 72057594037927935 : 1 .. '!journal.pages!eNYstmPK0mMmVJYC.r9h1ggd3G9hiqYJX' @ 0 : 0; will stop at (end)
|
||||
2026/04/13-13:10:48.030502 7ff580bfb6c0 Manual compaction at level-1 from '!journal!eNYstmPK0mMmVJYC' @ 72057594037927935 : 1 .. '!journal.pages!eNYstmPK0mMmVJYC.r9h1ggd3G9hiqYJX' @ 0 : 0; will stop at (end)
|
||||
|
||||
Binary file not shown.
Binary file not shown.
BIN
packs-system/anomalies/000113.log
Normal file
BIN
packs-system/anomalies/000113.log
Normal file
Binary file not shown.
@@ -1 +1 @@
|
||||
MANIFEST-000097
|
||||
MANIFEST-000112
|
||||
|
||||
@@ -1,15 +1,3 @@
|
||||
2026/04/12-11:08:25.489879 7f20ee3ff6c0 Recovering log #94
|
||||
2026/04/12-11:08:25.531956 7f20ee3ff6c0 Delete type=3 #92
|
||||
2026/04/12-11:08:25.532005 7f20ee3ff6c0 Delete type=0 #94
|
||||
2026/04/12-11:51:45.326621 7f1e4ffff6c0 Level-0 table #100: started
|
||||
2026/04/12-11:51:45.329690 7f1e4ffff6c0 Level-0 table #100: 3523 bytes OK
|
||||
2026/04/12-11:51:45.335542 7f1e4ffff6c0 Delete type=0 #98
|
||||
2026/04/12-11:51:45.348335 7f1e4ffff6c0 Manual compaction at level-0 from '!items!anomCommMorts001' @ 72057594037927935 : 1 .. '!items!null' @ 0 : 0; will stop at (end)
|
||||
2026/04/12-11:51:45.348374 7f1e4ffff6c0 Manual compaction at level-1 from '!items!anomCommMorts001' @ 72057594037927935 : 1 .. '!items!null' @ 0 : 0; will stop at '!items!null' @ 85 : 1
|
||||
2026/04/12-11:51:45.348379 7f1e4ffff6c0 Compacting 1@1 + 1@2 files
|
||||
2026/04/12-11:51:45.352270 7f1e4ffff6c0 Generated table #101@1: 9 keys, 6617 bytes
|
||||
2026/04/12-11:51:45.352285 7f1e4ffff6c0 Compacted 1@1 + 1@2 files => 6617 bytes
|
||||
2026/04/12-11:51:45.358113 7f1e4ffff6c0 compacted to: files[ 0 0 1 0 0 0 0 ]
|
||||
2026/04/12-11:51:45.358185 7f1e4ffff6c0 Delete type=2 #96
|
||||
2026/04/12-11:51:45.358728 7f1e4ffff6c0 Delete type=2 #100
|
||||
2026/04/12-11:51:45.369801 7f1e4ffff6c0 Manual compaction at level-1 from '!items!null' @ 85 : 1 .. '!items!null' @ 0 : 0; will stop at (end)
|
||||
2026/04/13-13:11:31.130509 7f2a6bfff6c0 Recovering log #109
|
||||
2026/04/13-13:11:31.189864 7f2a6bfff6c0 Delete type=3 #107
|
||||
2026/04/13-13:11:31.189928 7f2a6bfff6c0 Delete type=0 #109
|
||||
|
||||
@@ -1,15 +1,15 @@
|
||||
2026/04/12-00:49:46.933364 7f20edbfe6c0 Recovering log #89
|
||||
2026/04/12-00:49:46.983904 7f20edbfe6c0 Delete type=3 #87
|
||||
2026/04/12-00:49:46.983978 7f20edbfe6c0 Delete type=0 #89
|
||||
2026/04/12-00:50:13.950345 7f1e4ffff6c0 Level-0 table #95: started
|
||||
2026/04/12-00:50:13.969002 7f1e4ffff6c0 Level-0 table #95: 3524 bytes OK
|
||||
2026/04/12-00:50:14.003699 7f1e4ffff6c0 Delete type=0 #93
|
||||
2026/04/12-00:50:14.032943 7f1e4ffff6c0 Manual compaction at level-0 from '!items!anomCommMorts001' @ 72057594037927935 : 1 .. '!items!null' @ 0 : 0; will stop at (end)
|
||||
2026/04/12-00:50:14.032984 7f1e4ffff6c0 Manual compaction at level-1 from '!items!anomCommMorts001' @ 72057594037927935 : 1 .. '!items!null' @ 0 : 0; will stop at '!items!null' @ 81 : 1
|
||||
2026/04/12-00:50:14.032989 7f1e4ffff6c0 Compacting 1@1 + 1@2 files
|
||||
2026/04/12-00:50:14.051385 7f1e4ffff6c0 Generated table #96@1: 9 keys, 6617 bytes
|
||||
2026/04/12-00:50:14.051412 7f1e4ffff6c0 Compacted 1@1 + 1@2 files => 6617 bytes
|
||||
2026/04/12-00:50:14.088461 7f1e4ffff6c0 compacted to: files[ 0 0 1 0 0 0 0 ]
|
||||
2026/04/12-00:50:14.088607 7f1e4ffff6c0 Delete type=2 #91
|
||||
2026/04/12-00:50:14.088750 7f1e4ffff6c0 Delete type=2 #95
|
||||
2026/04/12-00:50:14.152217 7f1e4ffff6c0 Manual compaction at level-1 from '!items!null' @ 81 : 1 .. '!items!null' @ 0 : 0; will stop at (end)
|
||||
2026/04/13-13:10:44.750651 7ff581bfd6c0 Recovering log #104
|
||||
2026/04/13-13:10:44.797855 7ff581bfd6c0 Delete type=3 #102
|
||||
2026/04/13-13:10:44.797919 7ff581bfd6c0 Delete type=0 #104
|
||||
2026/04/13-13:10:47.796281 7ff580bfb6c0 Level-0 table #110: started
|
||||
2026/04/13-13:10:47.824966 7ff580bfb6c0 Level-0 table #110: 3524 bytes OK
|
||||
2026/04/13-13:10:47.857042 7ff580bfb6c0 Delete type=0 #108
|
||||
2026/04/13-13:10:47.973011 7ff580bfb6c0 Manual compaction at level-0 from '!items!anomCommMorts001' @ 72057594037927935 : 1 .. '!items!null' @ 0 : 0; will stop at (end)
|
||||
2026/04/13-13:10:47.973057 7ff580bfb6c0 Manual compaction at level-1 from '!items!anomCommMorts001' @ 72057594037927935 : 1 .. '!items!null' @ 0 : 0; will stop at '!items!null' @ 93 : 1
|
||||
2026/04/13-13:10:47.973063 7ff580bfb6c0 Compacting 1@1 + 1@2 files
|
||||
2026/04/13-13:10:47.995133 7ff580bfb6c0 Generated table #111@1: 9 keys, 6617 bytes
|
||||
2026/04/13-13:10:47.995159 7ff580bfb6c0 Compacted 1@1 + 1@2 files => 6617 bytes
|
||||
2026/04/13-13:10:48.030149 7ff580bfb6c0 compacted to: files[ 0 0 1 0 0 0 0 ]
|
||||
2026/04/13-13:10:48.030263 7ff580bfb6c0 Delete type=2 #106
|
||||
2026/04/13-13:10:48.030388 7ff580bfb6c0 Delete type=2 #110
|
||||
2026/04/13-13:10:48.030511 7ff580bfb6c0 Manual compaction at level-1 from '!items!null' @ 93 : 1 .. '!items!null' @ 0 : 0; will stop at (end)
|
||||
|
||||
Binary file not shown.
BIN
packs-system/anomalies/MANIFEST-000112
Normal file
BIN
packs-system/anomalies/MANIFEST-000112
Normal file
Binary file not shown.
Binary file not shown.
BIN
packs-system/pretires/000018.ldb
Normal file
BIN
packs-system/pretires/000018.ldb
Normal file
Binary file not shown.
@@ -1 +1 @@
|
||||
MANIFEST-000010
|
||||
MANIFEST-000023
|
||||
|
||||
@@ -1,8 +1,3 @@
|
||||
2026/04/12-11:08:25.534143 7f20ecbfc6c0 Recovering log #8
|
||||
2026/04/12-11:08:25.572191 7f20ecbfc6c0 Delete type=3 #6
|
||||
2026/04/12-11:08:25.572253 7f20ecbfc6c0 Delete type=0 #8
|
||||
2026/04/12-11:51:45.320556 7f1e4ffff6c0 Level-0 table #13: started
|
||||
2026/04/12-11:51:45.320610 7f1e4ffff6c0 Level-0 table #13: 0 bytes OK
|
||||
2026/04/12-11:51:45.326525 7f1e4ffff6c0 Delete type=0 #11
|
||||
2026/04/12-11:51:45.348323 7f1e4ffff6c0 Manual compaction at level-0 from '!actors!6RZ6IzJUHm4dB5Ut' @ 72057594037927935 : 1 .. '!folders!MbFQgPdF6Gtbj5AU' @ 0 : 0; will stop at (end)
|
||||
2026/04/12-11:51:45.348363 7f1e4ffff6c0 Manual compaction at level-1 from '!actors!6RZ6IzJUHm4dB5Ut' @ 72057594037927935 : 1 .. '!folders!MbFQgPdF6Gtbj5AU' @ 0 : 0; will stop at (end)
|
||||
2026/04/13-13:11:31.193586 7f2a6b7fe6c0 Recovering log #21
|
||||
2026/04/13-13:11:31.247393 7f2a6b7fe6c0 Delete type=3 #19
|
||||
2026/04/13-13:11:31.247448 7f2a6b7fe6c0 Delete type=0 #21
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
2026/04/12-00:49:46.986008 7f20ecbfc6c0 Recovering log #4
|
||||
2026/04/12-00:49:47.043344 7f20ecbfc6c0 Delete type=3 #2
|
||||
2026/04/12-00:49:47.043415 7f20ecbfc6c0 Delete type=0 #4
|
||||
2026/04/12-00:50:13.879524 7f1e4ffff6c0 Level-0 table #9: started
|
||||
2026/04/12-00:50:13.879596 7f1e4ffff6c0 Level-0 table #9: 0 bytes OK
|
||||
2026/04/12-00:50:13.912203 7f1e4ffff6c0 Delete type=0 #7
|
||||
2026/04/12-00:50:14.032916 7f1e4ffff6c0 Manual compaction at level-0 from '!actors!6RZ6IzJUHm4dB5Ut' @ 72057594037927935 : 1 .. '!folders!MbFQgPdF6Gtbj5AU' @ 0 : 0; will stop at (end)
|
||||
2026/04/12-00:50:14.032961 7f1e4ffff6c0 Manual compaction at level-1 from '!actors!6RZ6IzJUHm4dB5Ut' @ 72057594037927935 : 1 .. '!folders!MbFQgPdF6Gtbj5AU' @ 0 : 0; will stop at (end)
|
||||
2026/04/13-13:10:44.800502 7ff582bff6c0 Recovering log #16
|
||||
2026/04/13-13:10:44.846821 7ff582bff6c0 Delete type=3 #14
|
||||
2026/04/13-13:10:44.846886 7ff582bff6c0 Delete type=0 #16
|
||||
2026/04/13-13:10:47.902261 7ff580bfb6c0 Level-0 table #22: started
|
||||
2026/04/13-13:10:47.902285 7ff580bfb6c0 Level-0 table #22: 0 bytes OK
|
||||
2026/04/13-13:10:47.939594 7ff580bfb6c0 Delete type=0 #20
|
||||
2026/04/13-13:10:47.973036 7ff580bfb6c0 Manual compaction at level-0 from '!actors!6RZ6IzJUHm4dB5Ut' @ 72057594037927935 : 1 .. '!folders!MbFQgPdF6Gtbj5AU' @ 0 : 0; will stop at (end)
|
||||
2026/04/13-13:10:48.030491 7ff580bfb6c0 Manual compaction at level-1 from '!actors!6RZ6IzJUHm4dB5Ut' @ 72057594037927935 : 1 .. '!folders!MbFQgPdF6Gtbj5AU' @ 0 : 0; will stop at (end)
|
||||
|
||||
Binary file not shown.
BIN
packs-system/pretires/MANIFEST-000023
Normal file
BIN
packs-system/pretires/MANIFEST-000023
Normal file
Binary file not shown.
Binary file not shown.
BIN
packs-system/scenes/000057.ldb
Normal file
BIN
packs-system/scenes/000057.ldb
Normal file
Binary file not shown.
@@ -1 +1 @@
|
||||
MANIFEST-000049
|
||||
MANIFEST-000062
|
||||
|
||||
@@ -1,8 +1,3 @@
|
||||
2026/04/12-11:08:25.627510 7f20ee3ff6c0 Recovering log #47
|
||||
2026/04/12-11:08:25.675320 7f20ee3ff6c0 Delete type=3 #45
|
||||
2026/04/12-11:08:25.675385 7f20ee3ff6c0 Delete type=0 #47
|
||||
2026/04/12-11:51:45.341965 7f1e4ffff6c0 Level-0 table #52: started
|
||||
2026/04/12-11:51:45.341993 7f1e4ffff6c0 Level-0 table #52: 0 bytes OK
|
||||
2026/04/12-11:51:45.348210 7f1e4ffff6c0 Delete type=0 #50
|
||||
2026/04/12-11:51:45.348355 7f1e4ffff6c0 Manual compaction at level-0 from '!scenes!Jr7lGxYk2RETlXRv' @ 72057594037927935 : 1 .. '!scenes.tokens.delta.items!Jr7lGxYk2RETlXRv.6urwC5SVcou6UOAG.CTg4yBE12iMee1RU.BYT1CrA37R3Og0nu' @ 0 : 0; will stop at (end)
|
||||
2026/04/12-11:51:45.358820 7f1e4ffff6c0 Manual compaction at level-1 from '!scenes!Jr7lGxYk2RETlXRv' @ 72057594037927935 : 1 .. '!scenes.tokens.delta.items!Jr7lGxYk2RETlXRv.6urwC5SVcou6UOAG.CTg4yBE12iMee1RU.BYT1CrA37R3Og0nu' @ 0 : 0; will stop at (end)
|
||||
2026/04/13-13:11:31.305113 7f2a6a7fc6c0 Recovering log #60
|
||||
2026/04/13-13:11:31.358709 7f2a6a7fc6c0 Delete type=3 #58
|
||||
2026/04/13-13:11:31.358775 7f2a6a7fc6c0 Delete type=0 #60
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
2026/04/12-00:49:47.108083 7f20edbfe6c0 Recovering log #43
|
||||
2026/04/12-00:49:47.169074 7f20edbfe6c0 Delete type=3 #41
|
||||
2026/04/12-00:49:47.169141 7f20edbfe6c0 Delete type=0 #43
|
||||
2026/04/12-00:50:14.003843 7f1e4ffff6c0 Level-0 table #48: started
|
||||
2026/04/12-00:50:14.003869 7f1e4ffff6c0 Level-0 table #48: 0 bytes OK
|
||||
2026/04/12-00:50:14.032742 7f1e4ffff6c0 Delete type=0 #46
|
||||
2026/04/12-00:50:14.032953 7f1e4ffff6c0 Manual compaction at level-0 from '!scenes!Jr7lGxYk2RETlXRv' @ 72057594037927935 : 1 .. '!scenes.tokens.delta.items!Jr7lGxYk2RETlXRv.6urwC5SVcou6UOAG.CTg4yBE12iMee1RU.BYT1CrA37R3Og0nu' @ 0 : 0; will stop at (end)
|
||||
2026/04/12-00:50:14.088824 7f1e4ffff6c0 Manual compaction at level-1 from '!scenes!Jr7lGxYk2RETlXRv' @ 72057594037927935 : 1 .. '!scenes.tokens.delta.items!Jr7lGxYk2RETlXRv.6urwC5SVcou6UOAG.CTg4yBE12iMee1RU.BYT1CrA37R3Og0nu' @ 0 : 0; will stop at (end)
|
||||
2026/04/13-13:10:44.916572 7ff5813fc6c0 Recovering log #55
|
||||
2026/04/13-13:10:44.960340 7ff5813fc6c0 Delete type=3 #53
|
||||
2026/04/13-13:10:44.960396 7ff5813fc6c0 Delete type=0 #55
|
||||
2026/04/13-13:10:47.857212 7ff580bfb6c0 Level-0 table #61: started
|
||||
2026/04/13-13:10:47.857237 7ff580bfb6c0 Level-0 table #61: 0 bytes OK
|
||||
2026/04/13-13:10:47.902098 7ff580bfb6c0 Delete type=0 #59
|
||||
2026/04/13-13:10:47.973025 7ff580bfb6c0 Manual compaction at level-0 from '!scenes!Jr7lGxYk2RETlXRv' @ 72057594037927935 : 1 .. '!scenes.tokens.delta.items!Jr7lGxYk2RETlXRv.6urwC5SVcou6UOAG.CTg4yBE12iMee1RU.BYT1CrA37R3Og0nu' @ 0 : 0; will stop at (end)
|
||||
2026/04/13-13:10:48.030475 7ff580bfb6c0 Manual compaction at level-1 from '!scenes!Jr7lGxYk2RETlXRv' @ 72057594037927935 : 1 .. '!scenes.tokens.delta.items!Jr7lGxYk2RETlXRv.6urwC5SVcou6UOAG.CTg4yBE12iMee1RU.BYT1CrA37R3Og0nu' @ 0 : 0; will stop at (end)
|
||||
|
||||
Binary file not shown.
BIN
packs-system/scenes/MANIFEST-000062
Normal file
BIN
packs-system/scenes/MANIFEST-000062
Normal file
Binary file not shown.
791
snapshot-current.txt
Normal file
791
snapshot-current.txt
Normal file
@@ -0,0 +1,791 @@
|
||||
uid=8_0 RootWebArea "Foundry Virtual Tabletop" url="https://localhost:31000/game"
|
||||
uid=8_1 tab "Outils de token" selectable
|
||||
uid=8_2 tab "Outils de tuile" selectable
|
||||
uid=8_3 tab "Outils de dessin" selectable
|
||||
uid=8_4 tab "Outils de mur" selectable
|
||||
uid=8_5 tab "Outils de lumière" selectable
|
||||
uid=8_6 tab "Outils de son d’ambiance" selectable
|
||||
uid=8_7 tab "Outils de région" selectable
|
||||
uid=8_8 tab "Notes" selectable
|
||||
uid=8_9 button "Sélection de tokens" pressed
|
||||
uid=8_10 button "Sélection de cibles"
|
||||
uid=8_11 button "Règle"
|
||||
uid=8_12 button "Déplacement sans contrainte"
|
||||
uid=8_13 StaticText "Gamemaster [MJ]"
|
||||
uid=8_24 StaticText ""
|
||||
uid=8_14 StaticText "Latence"
|
||||
uid=8_15 StaticText " "
|
||||
uid=9_0 StaticText "1ms"
|
||||
uid=8_17 StaticText "IPS"
|
||||
uid=8_18 StaticText " "
|
||||
uid=10_0 StaticText "55"
|
||||
uid=8_20 button
|
||||
uid=8_21 navigation
|
||||
uid=8_22 StaticText "Accueil Celestopol 1922"
|
||||
uid=8_23 StaticText "G"
|
||||
uid=8_24 StaticText ""
|
||||
uid=8_25 generic roledescription="Barre de raccourcis"
|
||||
uid=8_26 button "Couper le son"
|
||||
uid=8_27 button "Menu principal"
|
||||
uid=8_28 button "Emplacement vide"
|
||||
uid=8_29 button "Emplacement vide"
|
||||
uid=8_30 button "Emplacement vide"
|
||||
uid=8_31 button "Emplacement vide"
|
||||
uid=8_32 button "Emplacement vide"
|
||||
uid=8_33 button "Emplacement vide"
|
||||
uid=8_34 button "Emplacement vide"
|
||||
uid=8_35 button "Emplacement vide"
|
||||
uid=8_36 button "Emplacement vide"
|
||||
uid=8_37 button "Emplacement vide"
|
||||
uid=8_38 navigation
|
||||
uid=8_39 button "Page suivante"
|
||||
uid=8_40 StaticText "1"
|
||||
uid=8_41 button "Page précédente"
|
||||
uid=8_42 button "Verrouiller la barre de raccourcis"
|
||||
uid=8_43 button "Effacer la barre de raccourcis"
|
||||
uid=8_44 generic value="
|
||||
"
|
||||
uid=8_45 paragraph
|
||||
uid=8_46 LineBreak "
|
||||
"
|
||||
uid=8_24 StaticText "Entrer un message"
|
||||
uid=8_47 button "Public en tant qu'utilisateur" pressed
|
||||
uid=8_48 button "Privé pour les maîtres de jeu"
|
||||
uid=8_49 button "Aveugle pour les maîtres de jeu"
|
||||
uid=8_50 button "Seulement pour soi-même"
|
||||
uid=8_51 button "Public en tant que personnage"
|
||||
uid=8_52 tab "Messages du tchat" selectable
|
||||
uid=8_53 tab "Rencontres de combat" selectable
|
||||
uid=8_54 tab "Scènes" selectable
|
||||
uid=8_55 tab "Objets plaçables" selectable
|
||||
uid=8_56 tab "Acteurs" selectable
|
||||
uid=8_57 tab "Objets" selectable
|
||||
uid=8_58 tab "Journaux" selectable
|
||||
uid=8_59 tab "Tables aléatoires" selectable
|
||||
uid=8_60 tab "Jeux de cartes" selectable
|
||||
uid=8_61 tab "Macros" selectable
|
||||
uid=8_62 tab "Playlists" selectable
|
||||
uid=8_63 tab "Compendiums" selectable
|
||||
uid=8_64 tab "Paramètres de la partie" selectable
|
||||
uid=8_65 button "Agrandir"
|
||||
uid=8_66 heading "Foundry Virtual Tabletop" level="4"
|
||||
uid=10_1 StaticText "Il y a 1j 22h"
|
||||
uid=8_68 StaticText "À: Gamemaster"
|
||||
uid=8_69 heading "Pour commencer" level="3"
|
||||
uid=8_70 StaticText "Il semble que ce soit un nouveau monde. Pour commencer, vous devez d’abord ajouter les joueurs supplémentaires attendus via le menu "
|
||||
uid=8_71 StaticText "Configuration des Joueurs"
|
||||
uid=8_72 StaticText ". Ensuite vous pourrez créer des "
|
||||
uid=8_73 StaticText "Acteurs"
|
||||
uid=8_74 StaticText " pour eux, ainsi que tout autre personnage important que vous devez représenter. Les cartes et autres visuels peuvent être configurés à l’aide des "
|
||||
uid=8_75 StaticText "Scènes"
|
||||
uid=8_76 StaticText ", et les documents, notes et autres informations peuvent être créés dans des "
|
||||
uid=8_77 StaticText "journaux"
|
||||
uid=8_78 StaticText "."
|
||||
uid=8_79 StaticText "N’oubliez pas d’explorer tous les onglets disponibles dans cette barre latérale, et pour plus d’informations, vous pouvez consulter la série "
|
||||
uid=8_80 link "Gamemaster Tutorial" url="https://foundryvtt.com/article/tutorial/"
|
||||
uid=8_81 StaticText "Gamemaster Tutorial"
|
||||
uid=8_82 StaticText " (en Anglais) dans la "
|
||||
uid=8_83 link "Base de connaissances" url="https://foundryvtt.com/kb/"
|
||||
uid=8_84 StaticText "Base de connaissances"
|
||||
uid=8_85 StaticText "."
|
||||
uid=8_86 StaticText " Ce message peut être extrait en cliquant dessus avec le bouton droit de la souris, vous pouvez également extraire tout l’onglet de chat en cliquant avec le bouton droit de la souris sur l’icône de la bulle de dialogue (menu du haut). Cette dernière méthode (clic droit sur les icones du menu) permet de la même manière de faire apparaître n’importe quel autre onglet de la barre latérale dans une fenêtre indépendante."
|
||||
uid=8_87 heading "Foundry Virtual Tabletop" level="4"
|
||||
uid=10_2 StaticText "Il y a 1j 22h"
|
||||
uid=8_89 StaticText "À: Gamemaster"
|
||||
uid=8_90 heading "Inviter vos joueurs" level="3"
|
||||
uid=8_91 StaticText "Lorsque tout est configuré et que vous êtes prêt à inviter vos joueurs, vous pouvez leur envoyer un lien vers votre monde depuis le "
|
||||
uid=8_92 StaticText "Liens d’invitation"
|
||||
uid=8_93 StaticText "."
|
||||
uid=8_94 StaticText "Si la boîte de dialogue « Liens d’invitation » indique que votre connexion est fermée, vous devrez peut-être configurer la redirection de port. Vous trouverez des instructions à ce sujet sur le site officiel : "
|
||||
uid=8_95 link "Port Forwarding Guide" url="https://foundryvtt.com/article/port-forwarding/"
|
||||
uid=8_96 StaticText "Port Forwarding Guide"
|
||||
uid=8_97 StaticText " (en Anglais) ou sur le wiki en Français : "
|
||||
uid=8_98 link "Impossible de se connecter à distance" url="https://foundryvtt.wiki/fr/pour-commencer/pbcnx/"
|
||||
uid=8_99 StaticText "Impossible de se connecter à distance"
|
||||
uid=8_100 StaticText ". Si vous avez toujours besoin d’aide, vous pouvez également chercher du support : Sur le Discord officiel "
|
||||
uid=8_101 StaticText "Anglais"
|
||||
uid=8_102 StaticText " : postez un message dans "
|
||||
uid=8_103 link "#install-and-connection" url="https://discord.com/channels/170995199584108546/689889940590690323"
|
||||
uid=8_104 StaticText "#install-and-connection"
|
||||
uid=8_105 StaticText " pour les problèmes d’invitation, "
|
||||
uid=8_106 link "#troubleshooting" url="https://discord.com/channels/170995199584108546/486930822465716249"
|
||||
uid=8_107 StaticText "#troubleshooting"
|
||||
uid=8_108 StaticText " pour les problèmes généraux avec le logiciel, ou "
|
||||
uid=8_109 link "#core-how-to" url="https://discord.com/channels/170995199584108546/713259405667205193"
|
||||
uid=8_110 StaticText "#core-how-to"
|
||||
uid=8_111 StaticText " pour une aide plus générique sur Foundry VTT. Sur le serveur Discord "
|
||||
uid=8_112 StaticText "Francophone"
|
||||
uid=8_113 StaticText " de FoundryVTT : "
|
||||
uid=8_114 link "La Fonderie" url="https://discord.gg/pPSDNJk"
|
||||
uid=8_115 StaticText "La Fonderie"
|
||||
uid=8_116 StaticText "."
|
||||
uid=8_117 StaticText " Ce message peut être extrait en cliquant dessus avec le bouton droit de la souris, vous pouvez également extraire tout l’onglet de chat en cliquant avec le bouton droit de la souris sur l’icône de la bulle de dialogue (menu du haut). Cette dernière méthode (clic droit sur les icones du menu) permet de la même manière de faire apparaître n’importe quel autre onglet de la barre latérale dans une fenêtre indépendante."
|
||||
uid=8_118 heading "Gamemaster" level="4"
|
||||
uid=10_3 StaticText "Il y a 1j 22h"
|
||||
uid=8_120 StaticText "✦"
|
||||
uid=8_121 StaticText "BIENVENUE DANS CÉLESTOPOL 1922"
|
||||
uid=8_122 StaticText "Bienvenue dans le système FoundryVTT de Célestopol 1922."
|
||||
uid=8_123 StaticText "AIDE DE JEU"
|
||||
uid=8_124 StaticText "Une aide de jeu est disponible dans le compendium : "
|
||||
uid=8_125 StaticText "Aide — Utiliser le système Célestopol 1922"
|
||||
uid=8_126 StaticText "."
|
||||
uid=8_127 StaticText "LIVRE DE BASE"
|
||||
uid=8_128 link "Voir le livre de base sur le site d’Antre-Monde Éditions" url="https://antre-monde.com/produit/celestopol-1922-le-jeu-de-role-livre-de-base/"
|
||||
uid=8_129 StaticText "Voir le livre de base sur le site d’Antre-Monde Éditions"
|
||||
uid=8_130 heading "Gamemaster" level="4"
|
||||
uid=10_4 StaticText "Il y a 1j 22h"
|
||||
uid=8_132 StaticText "Âme › Artifice"
|
||||
uid=8_133 image "Protagoniste" url="https://localhost:31000/icons/svg/mystery-man.svg"
|
||||
uid=8_134 StaticText "Protagoniste"
|
||||
uid=8_135 StaticText "Âme"
|
||||
uid=8_136 StaticText " › "
|
||||
uid=8_137 StaticText "Artifice"
|
||||
uid=8_138 StaticText "4"
|
||||
uid=8_139 StaticText "6"
|
||||
uid=8_140 StaticText "FORMULE :"
|
||||
uid=8_141 StaticText "2d8"
|
||||
uid=8_142 StaticText "="
|
||||
uid=8_143 StaticText "10"
|
||||
uid=8_144 StaticText "="
|
||||
uid=8_145 StaticText "10"
|
||||
uid=8_146 StaticText "VS"
|
||||
uid=8_147 StaticText "Seuil : 11"
|
||||
uid=8_148 StaticText "(11)"
|
||||
uid=8_149 StaticText "-1"
|
||||
uid=8_150 StaticText "✖"
|
||||
uid=8_151 StaticText "ÉCHEC"
|
||||
uid=8_152 heading "Gamemaster" level="4"
|
||||
uid=10_5 StaticText "Il y a 1j 22h"
|
||||
uid=8_154 StaticText "✦"
|
||||
uid=8_155 StaticText "BIENVENUE DANS CÉLESTOPOL 1922"
|
||||
uid=8_156 StaticText "Bienvenue dans le système FoundryVTT de Célestopol 1922."
|
||||
uid=8_157 StaticText "AIDE DE JEU"
|
||||
uid=8_158 StaticText "Une aide de jeu est disponible dans le compendium : "
|
||||
uid=8_159 StaticText "Aide — Utiliser le système Célestopol 1922"
|
||||
uid=8_160 StaticText "."
|
||||
uid=8_161 StaticText "LIVRE DE BASE"
|
||||
uid=8_162 link "Voir le livre de base sur le site d’Antre-Monde Éditions" url="https://antre-monde.com/produit/celestopol-1922-le-jeu-de-role-livre-de-base/"
|
||||
uid=8_163 StaticText "Voir le livre de base sur le site d’Antre-Monde Éditions"
|
||||
uid=8_164 heading "Gamemaster" level="4"
|
||||
uid=10_6 StaticText "Il y a 1j 22h"
|
||||
uid=8_166 StaticText "Esprit › Instruction"
|
||||
uid=8_167 image "Protagoniste" url="https://localhost:31000/icons/svg/mystery-man.svg"
|
||||
uid=8_168 StaticText "Protagoniste"
|
||||
uid=8_169 StaticText "Esprit"
|
||||
uid=8_170 StaticText " › "
|
||||
uid=8_171 StaticText "Instruction"
|
||||
uid=8_172 StaticText "8"
|
||||
uid=8_173 StaticText "8"
|
||||
uid=8_174 StaticText "FORMULE :"
|
||||
uid=8_175 StaticText "2d8"
|
||||
uid=8_176 StaticText "="
|
||||
uid=8_177 StaticText "16"
|
||||
uid=8_178 StaticText "="
|
||||
uid=8_179 StaticText "16"
|
||||
uid=8_180 StaticText "VS"
|
||||
uid=8_181 StaticText "Seuil : 11"
|
||||
uid=8_182 StaticText "(11)"
|
||||
uid=8_183 StaticText "+5"
|
||||
uid=8_184 StaticText "✦"
|
||||
uid=8_185 StaticText "SUCCÈS"
|
||||
uid=8_186 heading "Gamemaster" level="4"
|
||||
uid=10_7 StaticText "Il y a 1j 21h"
|
||||
uid=8_188 StaticText "✦"
|
||||
uid=8_189 StaticText "BIENVENUE DANS CÉLESTOPOL 1922"
|
||||
uid=8_190 StaticText "Bienvenue dans le système FoundryVTT de Célestopol 1922."
|
||||
uid=8_191 StaticText "AIDE DE JEU"
|
||||
uid=8_192 StaticText "Une aide de jeu est disponible dans le compendium : "
|
||||
uid=8_193 StaticText "Aide — Utiliser le système Célestopol 1922"
|
||||
uid=8_194 StaticText "."
|
||||
uid=8_195 StaticText "LIVRE DE BASE"
|
||||
uid=8_196 link "Voir le livre de base sur le site d’Antre-Monde Éditions" url="https://antre-monde.com/produit/celestopol-1922-le-jeu-de-role-livre-de-base/"
|
||||
uid=8_197 StaticText "Voir le livre de base sur le site d’Antre-Monde Éditions"
|
||||
uid=8_198 heading "Gamemaster" level="4"
|
||||
uid=10_8 StaticText "Il y a 2h 53s"
|
||||
uid=8_200 StaticText "✦"
|
||||
uid=8_201 StaticText "BIENVENUE DANS CÉLESTOPOL 1922"
|
||||
uid=8_202 StaticText "Bienvenue dans le système FoundryVTT de Célestopol 1922."
|
||||
uid=8_203 StaticText "AIDE DE JEU"
|
||||
uid=8_204 StaticText "Une aide de jeu est disponible dans le compendium : "
|
||||
uid=8_205 StaticText "Aide — Utiliser le système Célestopol 1922"
|
||||
uid=8_206 StaticText "."
|
||||
uid=8_207 StaticText "LIVRE DE BASE"
|
||||
uid=8_208 link "Voir le livre de base sur le site d’Antre-Monde Éditions" url="https://antre-monde.com/produit/celestopol-1922-le-jeu-de-role-livre-de-base/"
|
||||
uid=8_209 StaticText "Voir le livre de base sur le site d’Antre-Monde Éditions"
|
||||
uid=8_210 heading "Gamemaster" level="4"
|
||||
uid=10_9 StaticText "Il y a 43min 19s"
|
||||
uid=8_212 StaticText "✦"
|
||||
uid=8_213 StaticText "BIENVENUE DANS CÉLESTOPOL 1922"
|
||||
uid=8_214 StaticText "Bienvenue dans le système FoundryVTT de Célestopol 1922."
|
||||
uid=8_215 StaticText "AIDE DE JEU"
|
||||
uid=8_216 StaticText "Une aide de jeu est disponible dans le compendium : "
|
||||
uid=8_217 StaticText "Aide — Utiliser le système Célestopol 1922"
|
||||
uid=8_218 StaticText "."
|
||||
uid=8_219 StaticText "LIVRE DE BASE"
|
||||
uid=8_220 link "Voir le livre de base sur le site d’Antre-Monde Éditions" url="https://antre-monde.com/produit/celestopol-1922-le-jeu-de-role-livre-de-base/"
|
||||
uid=8_221 StaticText "Voir le livre de base sur le site d’Antre-Monde Éditions"
|
||||
uid=8_222 heading "Gamemaster" level="4"
|
||||
uid=10_10 StaticText "Il y a 39min 53s"
|
||||
uid=8_224 StaticText "✦"
|
||||
uid=8_225 StaticText "BIENVENUE DANS CÉLESTOPOL 1922"
|
||||
uid=8_226 StaticText "Bienvenue dans le système FoundryVTT de Célestopol 1922."
|
||||
uid=8_227 StaticText "AIDE DE JEU"
|
||||
uid=8_228 StaticText "Une aide de jeu est disponible dans le compendium : "
|
||||
uid=8_229 StaticText "Aide — Utiliser le système Célestopol 1922"
|
||||
uid=8_230 StaticText "."
|
||||
uid=8_231 StaticText "LIVRE DE BASE"
|
||||
uid=8_232 link "Voir le livre de base sur le site d’Antre-Monde Éditions" url="https://antre-monde.com/produit/celestopol-1922-le-jeu-de-role-livre-de-base/"
|
||||
uid=8_233 StaticText "Voir le livre de base sur le site d’Antre-Monde Éditions"
|
||||
uid=8_234 heading "Gamemaster" level="4"
|
||||
uid=10_11 StaticText "Il y a 22min 25s"
|
||||
uid=8_236 StaticText "✦"
|
||||
uid=8_237 StaticText "BIENVENUE DANS CÉLESTOPOL 1922"
|
||||
uid=8_238 StaticText "Bienvenue dans le système FoundryVTT de Célestopol 1922."
|
||||
uid=8_239 StaticText "AIDE DE JEU"
|
||||
uid=8_240 StaticText "Une aide de jeu est disponible dans le compendium : "
|
||||
uid=8_241 StaticText "Aide — Utiliser le système Célestopol 1922"
|
||||
uid=8_242 StaticText "."
|
||||
uid=8_243 StaticText "LIVRE DE BASE"
|
||||
uid=8_244 link "Voir le livre de base sur le site d’Antre-Monde Éditions" url="https://antre-monde.com/produit/celestopol-1922-le-jeu-de-role-livre-de-base/"
|
||||
uid=8_245 StaticText "Voir le livre de base sur le site d’Antre-Monde Éditions"
|
||||
uid=8_246 heading "Elemiah Cowen" level="4"
|
||||
uid=10_12 StaticText "Il y a 18min 38s"
|
||||
uid=8_248 image "Elemiah Cowen" url="https://localhost:31000/systems/fvtt-celestopol/assets/tokens/elemia.webp"
|
||||
uid=8_249 StaticText "Elemiah Cowen"
|
||||
uid=8_250 StaticText "⚡ Initiative"
|
||||
uid=8_251 StaticText "⚡"
|
||||
uid=8_252 StaticText "10"
|
||||
uid=8_253 StaticText "4 + 2 (Mobilité) + 4 (Inspiration)"
|
||||
uid=8_254 heading "PNJ01" level="4"
|
||||
uid=10_13 StaticText "Il y a 18min 37s"
|
||||
uid=8_256 image "PNJ01" url="https://localhost:31000/icons/svg/mystery-man.svg"
|
||||
uid=8_257 StaticText "PNJ01"
|
||||
uid=8_258 StaticText "⚡ Initiative"
|
||||
uid=8_259 StaticText "⚡"
|
||||
uid=8_260 StaticText "6"
|
||||
uid=8_261 StaticText "Corps : 6"
|
||||
uid=8_262 heading "Gamemaster" level="4"
|
||||
uid=10_14 StaticText "Il y a 17min 4s"
|
||||
uid=8_264 StaticText "Corps › Échauffourée"
|
||||
uid=8_265 image "Elemiah Cowen" url="https://localhost:31000/systems/fvtt-celestopol/assets/tokens/elemia.webp"
|
||||
uid=8_266 StaticText "Elemiah Cowen"
|
||||
uid=8_267 StaticText "⚔"
|
||||
uid=8_268 StaticText "Attaque à main nue"
|
||||
uid=8_269 StaticText "Corps"
|
||||
uid=8_270 StaticText " › "
|
||||
uid=8_271 StaticText "Échauffourée"
|
||||
uid=8_272 StaticText "1"
|
||||
uid=8_273 StaticText "8"
|
||||
uid=8_274 StaticText "FORMULE :"
|
||||
uid=8_275 StaticText "2d8"
|
||||
uid=8_276 StaticText "="
|
||||
uid=8_277 StaticText "9"
|
||||
uid=8_278 StaticText "+"
|
||||
uid=8_279 StaticText "2"
|
||||
uid=8_280 StaticText "="
|
||||
uid=8_281 StaticText "11"
|
||||
uid=8_282 StaticText "VS"
|
||||
uid=8_283 StaticText "Corps du PNJ : 6"
|
||||
uid=8_284 StaticText "+5"
|
||||
uid=8_285 StaticText "✦"
|
||||
uid=8_286 StaticText "SUCCÈS"
|
||||
uid=8_287 StaticText "Attaque réussie — cible touchée"
|
||||
uid=8_288 StaticText "DÉGÂTS INFLIGÉS"
|
||||
uid=8_289 StaticText "1"
|
||||
uid=8_290 StaticText "blessure(s)"
|
||||
uid=8_291 StaticText "Cible :"
|
||||
uid=8_292 StaticText " PNJ01"
|
||||
uid=8_293 StaticText "Protection d'armure :"
|
||||
uid=8_294 StaticText " −0"
|
||||
uid=8_295 StaticText "Blessures après armure :"
|
||||
uid=8_296 StaticText " 1"
|
||||
uid=8_297 button "Appliquer les blessures"
|
||||
uid=8_298 heading "Gamemaster" level="4"
|
||||
uid=10_15 StaticText "Il y a 16min 5s"
|
||||
uid=8_300 StaticText "Corps › Mobilité"
|
||||
uid=8_301 image "Elemiah Cowen" url="https://localhost:31000/systems/fvtt-celestopol/assets/tokens/elemia.webp"
|
||||
uid=8_302 StaticText "Elemiah Cowen"
|
||||
uid=8_303 StaticText "⚔"
|
||||
uid=8_304 StaticText "Arc"
|
||||
uid=8_305 StaticText "+1"
|
||||
uid=8_306 StaticText "Corps"
|
||||
uid=8_307 StaticText " › "
|
||||
uid=8_308 StaticText "Mobilité"
|
||||
uid=8_309 StaticText "7"
|
||||
uid=8_310 StaticText "7"
|
||||
uid=8_311 StaticText "FORMULE :"
|
||||
uid=8_312 StaticText "2d8"
|
||||
uid=8_313 StaticText "="
|
||||
uid=8_314 StaticText "14"
|
||||
uid=8_315 StaticText "+"
|
||||
uid=8_316 StaticText "2"
|
||||
uid=8_317 StaticText "="
|
||||
uid=8_318 StaticText "16"
|
||||
uid=8_319 StaticText "VS"
|
||||
uid=8_320 StaticText "Corps du PNJ : 6"
|
||||
uid=8_321 StaticText "★"
|
||||
uid=8_322 StaticText "RÉUSSITE AUTOMATIQUE"
|
||||
uid=8_323 heading "Gamemaster" level="4"
|
||||
uid=10_16 StaticText "Il y a 15min 19s"
|
||||
uid=8_325 StaticText "Corps › Attaquer"
|
||||
uid=8_326 image "PNJ01" url="https://localhost:31000/icons/svg/mystery-man.svg"
|
||||
uid=8_327 StaticText "PNJ01"
|
||||
uid=8_328 StaticText "⚔"
|
||||
uid=8_329 StaticText "Arc"
|
||||
uid=8_330 StaticText "+1"
|
||||
uid=8_331 StaticText "Corps"
|
||||
uid=8_332 StaticText " › "
|
||||
uid=8_333 StaticText "Attaquer"
|
||||
uid=8_334 StaticText "2"
|
||||
uid=8_335 StaticText "1"
|
||||
uid=8_336 StaticText "FORMULE :"
|
||||
uid=8_337 StaticText "2d8"
|
||||
uid=8_338 StaticText "="
|
||||
uid=8_339 StaticText "3"
|
||||
uid=8_340 StaticText "+"
|
||||
uid=8_341 StaticText "6"
|
||||
uid=8_342 StaticText "="
|
||||
uid=8_343 StaticText "9"
|
||||
uid=8_344 StaticText "VS"
|
||||
uid=8_345 StaticText "Corps du PNJ : 2"
|
||||
uid=8_346 StaticText "★"
|
||||
uid=8_347 StaticText "RÉUSSITE AUTOMATIQUE"
|
||||
uid=8_348 StaticText "DÉGÂTS INFLIGÉS"
|
||||
uid=8_349 StaticText "2"
|
||||
uid=8_350 StaticText "blessure(s)"
|
||||
uid=8_351 StaticText "Cible :"
|
||||
uid=8_352 StaticText " Elemiah Cowen"
|
||||
uid=8_353 StaticText "Protection d'armure :"
|
||||
uid=8_354 StaticText " −0"
|
||||
uid=8_355 StaticText "Blessures après armure :"
|
||||
uid=8_356 StaticText " 2"
|
||||
uid=8_357 button "Appliquer les blessures"
|
||||
uid=8_358 heading "Gamemaster" level="4"
|
||||
uid=10_17 StaticText "Il y a 13min"
|
||||
uid=8_360 StaticText "✦"
|
||||
uid=8_361 StaticText "BIENVENUE DANS CÉLESTOPOL 1922"
|
||||
uid=8_362 StaticText "Bienvenue dans le système FoundryVTT de Célestopol 1922."
|
||||
uid=8_363 StaticText "AIDE DE JEU"
|
||||
uid=8_364 StaticText "Une aide de jeu est disponible dans le compendium : "
|
||||
uid=8_365 StaticText "Aide — Utiliser le système Célestopol 1922"
|
||||
uid=8_366 StaticText "."
|
||||
uid=8_367 StaticText "LIVRE DE BASE"
|
||||
uid=8_368 link "Voir le livre de base sur le site d’Antre-Monde Éditions" url="https://antre-monde.com/produit/celestopol-1922-le-jeu-de-role-livre-de-base/"
|
||||
uid=8_369 StaticText "Voir le livre de base sur le site d’Antre-Monde Éditions"
|
||||
uid=8_370 heading "Gamemaster" level="4"
|
||||
uid=10_18 StaticText "Il y a 11min 14s"
|
||||
uid=8_372 StaticText "✦"
|
||||
uid=8_373 StaticText "BIENVENUE DANS CÉLESTOPOL 1922"
|
||||
uid=8_374 StaticText "Bienvenue dans le système FoundryVTT de Célestopol 1922."
|
||||
uid=8_375 StaticText "AIDE DE JEU"
|
||||
uid=8_376 StaticText "Une aide de jeu est disponible dans le compendium : "
|
||||
uid=8_377 StaticText "Aide — Utiliser le système Célestopol 1922"
|
||||
uid=8_378 StaticText "."
|
||||
uid=8_379 StaticText "LIVRE DE BASE"
|
||||
uid=8_380 link "Voir le livre de base sur le site d’Antre-Monde Éditions" url="https://antre-monde.com/produit/celestopol-1922-le-jeu-de-role-livre-de-base/"
|
||||
uid=8_381 StaticText "Voir le livre de base sur le site d’Antre-Monde Éditions"
|
||||
uid=8_382 heading "Elemiah Cowen" level="4"
|
||||
uid=10_19 StaticText "Il y a 11min 4s"
|
||||
uid=8_384 StaticText "Corps › Échauffourée"
|
||||
uid=8_385 image "Elemiah Cowen" url="https://localhost:31000/systems/fvtt-celestopol/assets/tokens/elemia.webp"
|
||||
uid=8_386 StaticText "Elemiah Cowen"
|
||||
uid=8_387 StaticText "⚔"
|
||||
uid=8_388 StaticText "Attaque à main nue"
|
||||
uid=8_389 StaticText "Corps"
|
||||
uid=8_390 StaticText " › "
|
||||
uid=8_391 StaticText "Échauffourée"
|
||||
uid=8_392 StaticText "2"
|
||||
uid=8_393 StaticText "3"
|
||||
uid=8_394 StaticText "FORMULE :"
|
||||
uid=8_395 StaticText "2d8"
|
||||
uid=8_396 StaticText "="
|
||||
uid=8_397 StaticText "5"
|
||||
uid=8_398 StaticText "+"
|
||||
uid=8_399 StaticText "2"
|
||||
uid=8_400 StaticText "="
|
||||
uid=8_401 StaticText "7"
|
||||
uid=8_402 StaticText "VS"
|
||||
uid=8_403 StaticText "Corps du PNJ : 6"
|
||||
uid=8_404 StaticText "+1"
|
||||
uid=8_405 StaticText "✦"
|
||||
uid=8_406 StaticText "SUCCÈS"
|
||||
uid=8_407 StaticText "Attaque réussie — cible touchée"
|
||||
uid=8_408 StaticText "DÉGÂTS INFLIGÉS"
|
||||
uid=8_409 StaticText "1"
|
||||
uid=8_410 StaticText "blessure(s)"
|
||||
uid=8_411 StaticText "Aucune cible de la scène active disponible pour appliquer les blessures."
|
||||
uid=8_412 dialog
|
||||
uid=8_413 banner
|
||||
uid=8_414 heading "Corps › Attaquer" level="1"
|
||||
uid=8_415 button "Basculer les contrôles"
|
||||
uid=8_416 button "Fermer la fenêtre"
|
||||
uid=8_417 StaticText "PNJ01"
|
||||
uid=8_418 StaticText "⚔"
|
||||
uid=8_419 StaticText "Arme"
|
||||
uid=8_420 StaticText "+1"
|
||||
uid=8_421 StaticText "Corps"
|
||||
uid=8_422 StaticText " › "
|
||||
uid=8_423 StaticText "Attaquer"
|
||||
uid=8_424 StaticText "2d8"
|
||||
uid=8_425 StaticText "+"
|
||||
uid=8_426 StaticText "6"
|
||||
uid=8_427 StaticText "CIBLE"
|
||||
uid=8_428 combobox "CIBLE CIBLE CIBLE CIBLE CIBLE" expandable haspopup="menu" value="— Saisir manuellement —"
|
||||
uid=8_429 option "— Saisir manuellement —" selectable selected value="— Saisir manuellement —"
|
||||
uid=8_430 option "Elemiah Cowen" selectable value="Elemiah Cowen"
|
||||
uid=8_431 StaticText "CORPS DU PNJ"
|
||||
uid=8_432 spinbutton "CORPS DU PNJ CORPS DU PNJ CORPS DU PNJ CORPS DU PNJ CORPS DU PNJ" value="7" valuemax="30" valuemin="1" valuetext="7"
|
||||
uid=8_433 StaticText "MODIFICATEUR"
|
||||
uid=8_434 combobox "MODIFICATEUR MODIFICATEUR MODIFICATEUR MODIFICATEUR MODIFICATEUR" expandable haspopup="menu" value="Malaisé (0)"
|
||||
uid=8_435 option "Évident — Réussite automatique" selectable value="Évident — Réussite automatique"
|
||||
uid=8_436 option "Malaisé (0)" selectable selected value="Malaisé (0)"
|
||||
uid=8_437 option "Difficile (−2)" selectable value="Difficile (−2)"
|
||||
uid=8_438 option "Très difficile (−4)" selectable value="Très difficile (−4)"
|
||||
uid=8_439 option "Extrêmement difficile (−6)" selectable value="Extrêmement difficile (−6)"
|
||||
uid=8_440 option "Incroyablement difficile (−8)" selectable value="Incroyablement difficile (−8)"
|
||||
uid=8_441 StaticText "ASPECT"
|
||||
uid=8_442 combobox "ASPECT ASPECT ASPECT ASPECT ASPECT" expandable haspopup="menu" value="0"
|
||||
uid=8_443 option "-4" selectable value="-4"
|
||||
uid=8_444 option "-3" selectable value="-3"
|
||||
uid=8_445 option "-2" selectable value="-2"
|
||||
uid=8_446 option "-1" selectable value="-1"
|
||||
uid=8_447 option "0" selectable selected value="0"
|
||||
uid=8_448 option "+1" selectable value="+1"
|
||||
uid=8_449 option "+2" selectable value="+2"
|
||||
uid=8_450 option "+3" selectable value="+3"
|
||||
uid=8_451 option "+4" selectable value="+4"
|
||||
uid=8_452 checkbox "🌑 Lancer le Dé de la Lune 🌑 Lancer le Dé de la Lune 🌑 Lancer le Dé de la Lune 🌑 Lancer le Dé de la Lune 🌑 Lancer le Dé de la Lune"
|
||||
uid=8_453 StaticText "🌑"
|
||||
uid=8_454 StaticText "Lancer le Dé de la Lune"
|
||||
uid=8_455 checkbox "✦ Utiliser le Destin 3d8 au lieu de 2d8 Jauge destin vide ✦ Utiliser le Destin 3d8 au lieu de 2d8 Jauge destin vide ✦ Utiliser le Destin 3d8 au lieu de 2d8 Jauge destin vide ✦ Utiliser le Destin 3d8 au lieu de 2d8 Jauge destin vide ✦ Utiliser le Destin 3d8 au lieu de 2d8 Jauge destin vide" disableable disabled
|
||||
uid=8_456 StaticText "✦"
|
||||
uid=8_457 StaticText "Utiliser le Destin"
|
||||
uid=8_458 StaticText "3d8 au lieu de 2d8"
|
||||
uid=8_459 StaticText "Jauge destin vide"
|
||||
uid=8_460 StaticText "MODIFICATEURS SITUATIONNELS"
|
||||
uid=8_461 combobox "MODIFICATEURS SITUATIONNELS MODIFICATEURS SITUATIONNELS MODIFICATEURS SITUATIONNELS MODIFICATEURS SITUATIONNELS MODIFICATEURS SITUATIONNELS" expandable haspopup="menu" value="0"
|
||||
uid=8_462 option "-8" selectable value="-8"
|
||||
uid=8_463 option "-7" selectable value="-7"
|
||||
uid=8_464 option "-6" selectable value="-6"
|
||||
uid=8_465 option "-5" selectable value="-5"
|
||||
uid=8_466 option "-4" selectable value="-4"
|
||||
uid=8_467 option "-3" selectable value="-3"
|
||||
uid=8_468 option "-2" selectable value="-2"
|
||||
uid=8_469 option "-1" selectable value="-1"
|
||||
uid=8_470 option "0" selectable selected value="0"
|
||||
uid=8_471 option "+1" selectable value="+1"
|
||||
uid=8_472 option "+2" selectable value="+2"
|
||||
uid=8_473 option "+3" selectable value="+3"
|
||||
uid=8_474 option "+4" selectable value="+4"
|
||||
uid=8_475 option "+5" selectable value="+5"
|
||||
uid=8_476 option "+6" selectable value="+6"
|
||||
uid=8_477 option "+7" selectable value="+7"
|
||||
uid=8_478 option "+8" selectable value="+8"
|
||||
uid=8_479 StaticText "VISIBILITÉ"
|
||||
uid=8_480 combobox "VISIBILITÉ VISIBILITÉ VISIBILITÉ VISIBILITÉ VISIBILITÉ" expandable haspopup="menu" value="Public"
|
||||
uid=8_481 option "Public" selectable selected value="Public"
|
||||
uid=8_482 option "MJ uniquement" selectable value="MJ uniquement"
|
||||
uid=8_483 option "Secret (moi)" selectable value="Secret (moi)"
|
||||
uid=8_484 StaticText "FORMULE"
|
||||
uid=8_485 StaticText "2d8 + 6"
|
||||
uid=8_486 button "Lancer !"
|
||||
uid=9_21 dialog
|
||||
uid=9_22 banner
|
||||
uid=9_23 heading "Corps › Attaquer" level="1"
|
||||
uid=9_24 button "Basculer les contrôles"
|
||||
uid=9_25 button "Fermer la fenêtre"
|
||||
uid=9_26 StaticText "PNJ01"
|
||||
uid=9_27 StaticText "⚔"
|
||||
uid=9_28 StaticText "Arme"
|
||||
uid=9_29 StaticText "+1"
|
||||
uid=9_30 StaticText "Corps"
|
||||
uid=9_31 StaticText " › "
|
||||
uid=9_32 StaticText "Attaquer"
|
||||
uid=9_33 StaticText "2d8"
|
||||
uid=9_34 StaticText "+"
|
||||
uid=9_35 StaticText "6"
|
||||
uid=9_36 StaticText "CIBLE"
|
||||
uid=9_37 combobox expandable haspopup="menu" value="— Saisir manuellement —"
|
||||
uid=9_38 option "— Saisir manuellement —" selectable selected value="— Saisir manuellement —"
|
||||
uid=9_39 option "Elemiah Cowen" selectable value="Elemiah Cowen"
|
||||
uid=9_40 StaticText "CORPS DU PNJ"
|
||||
uid=9_41 spinbutton value="7" valuemax="30" valuemin="1" valuetext="7"
|
||||
uid=9_42 StaticText "MODIFICATEUR"
|
||||
uid=9_43 combobox expandable haspopup="menu" value="Malaisé (0)"
|
||||
uid=9_44 option "Évident — Réussite automatique" selectable value="Évident — Réussite automatique"
|
||||
uid=9_45 option "Malaisé (0)" selectable selected value="Malaisé (0)"
|
||||
uid=9_46 option "Difficile (−2)" selectable value="Difficile (−2)"
|
||||
uid=9_47 option "Très difficile (−4)" selectable value="Très difficile (−4)"
|
||||
uid=9_48 option "Extrêmement difficile (−6)" selectable value="Extrêmement difficile (−6)"
|
||||
uid=9_49 option "Incroyablement difficile (−8)" selectable value="Incroyablement difficile (−8)"
|
||||
uid=9_50 StaticText "ASPECT"
|
||||
uid=9_51 combobox expandable haspopup="menu" value="0"
|
||||
uid=9_52 option "-4" selectable value="-4"
|
||||
uid=9_53 option "-3" selectable value="-3"
|
||||
uid=9_54 option "-2" selectable value="-2"
|
||||
uid=9_55 option "-1" selectable value="-1"
|
||||
uid=9_56 option "0" selectable selected value="0"
|
||||
uid=9_57 option "+1" selectable value="+1"
|
||||
uid=9_58 option "+2" selectable value="+2"
|
||||
uid=9_59 option "+3" selectable value="+3"
|
||||
uid=9_60 option "+4" selectable value="+4"
|
||||
uid=9_61 checkbox
|
||||
uid=9_62 StaticText "🌑"
|
||||
uid=9_63 StaticText "Lancer le Dé de la Lune"
|
||||
uid=9_64 checkbox disableable disabled
|
||||
uid=9_65 StaticText "✦"
|
||||
uid=9_66 StaticText "Utiliser le Destin"
|
||||
uid=9_67 StaticText "3d8 au lieu de 2d8"
|
||||
uid=9_68 StaticText "Jauge destin vide"
|
||||
uid=9_69 StaticText "MODIFICATEURS SITUATIONNELS"
|
||||
uid=9_70 combobox expandable haspopup="menu" value="0"
|
||||
uid=9_71 option "-8" selectable value="-8"
|
||||
uid=9_72 option "-7" selectable value="-7"
|
||||
uid=9_73 option "-6" selectable value="-6"
|
||||
uid=9_74 option "-5" selectable value="-5"
|
||||
uid=9_75 option "-4" selectable value="-4"
|
||||
uid=9_76 option "-3" selectable value="-3"
|
||||
uid=9_77 option "-2" selectable value="-2"
|
||||
uid=9_78 option "-1" selectable value="-1"
|
||||
uid=9_79 option "0" selectable selected value="0"
|
||||
uid=9_80 option "+1" selectable value="+1"
|
||||
uid=9_81 option "+2" selectable value="+2"
|
||||
uid=9_82 option "+3" selectable value="+3"
|
||||
uid=9_83 option "+4" selectable value="+4"
|
||||
uid=9_84 option "+5" selectable value="+5"
|
||||
uid=9_85 option "+6" selectable value="+6"
|
||||
uid=9_86 option "+7" selectable value="+7"
|
||||
uid=9_87 option "+8" selectable value="+8"
|
||||
uid=9_88 StaticText "VISIBILITÉ"
|
||||
uid=9_89 combobox expandable haspopup="menu" value="Public"
|
||||
uid=9_90 option "Public" selectable selected value="Public"
|
||||
uid=9_91 option "MJ uniquement" selectable value="MJ uniquement"
|
||||
uid=9_92 option "Secret (moi)" selectable value="Secret (moi)"
|
||||
uid=9_93 StaticText "FORMULE"
|
||||
uid=9_94 StaticText "2d8 + 6"
|
||||
uid=9_95 button "Lancer !"
|
||||
uid=9_96 dialog
|
||||
uid=9_97 banner
|
||||
uid=9_98 heading "Corps › Attaquer" level="1"
|
||||
uid=9_99 button "Basculer les contrôles"
|
||||
uid=9_100 button "Fermer la fenêtre"
|
||||
uid=9_101 StaticText "PNJ01"
|
||||
uid=9_102 StaticText "⚔"
|
||||
uid=9_103 StaticText "Arme"
|
||||
uid=9_104 StaticText "+1"
|
||||
uid=9_105 StaticText "Corps"
|
||||
uid=9_106 StaticText " › "
|
||||
uid=9_107 StaticText "Attaquer"
|
||||
uid=9_108 StaticText "2d8"
|
||||
uid=9_109 StaticText "+"
|
||||
uid=9_110 StaticText "6"
|
||||
uid=9_111 StaticText "CIBLE"
|
||||
uid=9_112 combobox expandable haspopup="menu" value="— Saisir manuellement —"
|
||||
uid=9_113 option "— Saisir manuellement —" selectable selected value="— Saisir manuellement —"
|
||||
uid=9_114 option "Elemiah Cowen" selectable value="Elemiah Cowen"
|
||||
uid=9_115 StaticText "CORPS DU PNJ"
|
||||
uid=9_116 spinbutton value="7" valuemax="30" valuemin="1" valuetext="7"
|
||||
uid=9_117 StaticText "MODIFICATEUR"
|
||||
uid=9_118 combobox expandable haspopup="menu" value="Malaisé (0)"
|
||||
uid=9_119 option "Évident — Réussite automatique" selectable value="Évident — Réussite automatique"
|
||||
uid=9_120 option "Malaisé (0)" selectable selected value="Malaisé (0)"
|
||||
uid=9_121 option "Difficile (−2)" selectable value="Difficile (−2)"
|
||||
uid=9_122 option "Très difficile (−4)" selectable value="Très difficile (−4)"
|
||||
uid=9_123 option "Extrêmement difficile (−6)" selectable value="Extrêmement difficile (−6)"
|
||||
uid=9_124 option "Incroyablement difficile (−8)" selectable value="Incroyablement difficile (−8)"
|
||||
uid=9_125 StaticText "ASPECT"
|
||||
uid=9_126 combobox expandable haspopup="menu" value="0"
|
||||
uid=9_127 option "-4" selectable value="-4"
|
||||
uid=9_128 option "-3" selectable value="-3"
|
||||
uid=9_129 option "-2" selectable value="-2"
|
||||
uid=9_130 option "-1" selectable value="-1"
|
||||
uid=9_131 option "0" selectable selected value="0"
|
||||
uid=9_132 option "+1" selectable value="+1"
|
||||
uid=9_133 option "+2" selectable value="+2"
|
||||
uid=9_134 option "+3" selectable value="+3"
|
||||
uid=9_135 option "+4" selectable value="+4"
|
||||
uid=9_136 checkbox
|
||||
uid=9_137 StaticText "🌑"
|
||||
uid=9_138 StaticText "Lancer le Dé de la Lune"
|
||||
uid=9_139 checkbox disableable disabled
|
||||
uid=9_140 StaticText "✦"
|
||||
uid=9_141 StaticText "Utiliser le Destin"
|
||||
uid=9_142 StaticText "3d8 au lieu de 2d8"
|
||||
uid=9_143 StaticText "Jauge destin vide"
|
||||
uid=9_144 StaticText "MODIFICATEURS SITUATIONNELS"
|
||||
uid=9_145 combobox expandable haspopup="menu" value="0"
|
||||
uid=9_146 option "-8" selectable value="-8"
|
||||
uid=9_147 option "-7" selectable value="-7"
|
||||
uid=9_148 option "-6" selectable value="-6"
|
||||
uid=9_149 option "-5" selectable value="-5"
|
||||
uid=9_150 option "-4" selectable value="-4"
|
||||
uid=9_151 option "-3" selectable value="-3"
|
||||
uid=9_152 option "-2" selectable value="-2"
|
||||
uid=9_153 option "-1" selectable value="-1"
|
||||
uid=9_154 option "0" selectable selected value="0"
|
||||
uid=9_155 option "+1" selectable value="+1"
|
||||
uid=9_156 option "+2" selectable value="+2"
|
||||
uid=9_157 option "+3" selectable value="+3"
|
||||
uid=9_158 option "+4" selectable value="+4"
|
||||
uid=9_159 option "+5" selectable value="+5"
|
||||
uid=9_160 option "+6" selectable value="+6"
|
||||
uid=9_161 option "+7" selectable value="+7"
|
||||
uid=9_162 option "+8" selectable value="+8"
|
||||
uid=9_163 StaticText "VISIBILITÉ"
|
||||
uid=9_164 combobox expandable haspopup="menu" value="Public"
|
||||
uid=9_165 option "Public" selectable selected value="Public"
|
||||
uid=9_166 option "MJ uniquement" selectable value="MJ uniquement"
|
||||
uid=9_167 option "Secret (moi)" selectable value="Secret (moi)"
|
||||
uid=9_168 StaticText "FORMULE"
|
||||
uid=9_169 StaticText "2d8 + 6"
|
||||
uid=9_170 button "Lancer !"
|
||||
uid=9_171 dialog
|
||||
uid=9_172 banner
|
||||
uid=9_173 heading "Corps › Attaquer" level="1"
|
||||
uid=9_174 button "Basculer les contrôles"
|
||||
uid=9_175 button "Fermer la fenêtre"
|
||||
uid=9_176 StaticText "PNJ01"
|
||||
uid=9_177 StaticText "⚔"
|
||||
uid=9_178 StaticText "Arme"
|
||||
uid=9_179 StaticText "+1"
|
||||
uid=9_180 StaticText "Corps"
|
||||
uid=9_181 StaticText " › "
|
||||
uid=9_182 StaticText "Attaquer"
|
||||
uid=9_183 StaticText "2d8"
|
||||
uid=9_184 StaticText "+"
|
||||
uid=9_185 StaticText "6"
|
||||
uid=9_186 StaticText "CIBLE"
|
||||
uid=9_187 combobox expandable haspopup="menu" value="— Saisir manuellement —"
|
||||
uid=9_188 option "— Saisir manuellement —" selectable selected value="— Saisir manuellement —"
|
||||
uid=9_189 option "Elemiah Cowen" selectable value="Elemiah Cowen"
|
||||
uid=9_190 StaticText "CORPS DU PNJ"
|
||||
uid=9_191 spinbutton value="7" valuemax="30" valuemin="1" valuetext="7"
|
||||
uid=9_192 StaticText "MODIFICATEUR"
|
||||
uid=9_193 combobox expandable haspopup="menu" value="Malaisé (0)"
|
||||
uid=9_194 option "Évident — Réussite automatique" selectable value="Évident — Réussite automatique"
|
||||
uid=9_195 option "Malaisé (0)" selectable selected value="Malaisé (0)"
|
||||
uid=9_196 option "Difficile (−2)" selectable value="Difficile (−2)"
|
||||
uid=9_197 option "Très difficile (−4)" selectable value="Très difficile (−4)"
|
||||
uid=9_198 option "Extrêmement difficile (−6)" selectable value="Extrêmement difficile (−6)"
|
||||
uid=9_199 option "Incroyablement difficile (−8)" selectable value="Incroyablement difficile (−8)"
|
||||
uid=9_200 StaticText "ASPECT"
|
||||
uid=9_201 combobox expandable haspopup="menu" value="0"
|
||||
uid=9_202 option "-4" selectable value="-4"
|
||||
uid=9_203 option "-3" selectable value="-3"
|
||||
uid=9_204 option "-2" selectable value="-2"
|
||||
uid=9_205 option "-1" selectable value="-1"
|
||||
uid=9_206 option "0" selectable selected value="0"
|
||||
uid=9_207 option "+1" selectable value="+1"
|
||||
uid=9_208 option "+2" selectable value="+2"
|
||||
uid=9_209 option "+3" selectable value="+3"
|
||||
uid=9_210 option "+4" selectable value="+4"
|
||||
uid=9_211 checkbox
|
||||
uid=9_212 StaticText "🌑"
|
||||
uid=9_213 StaticText "Lancer le Dé de la Lune"
|
||||
uid=9_214 checkbox disableable disabled
|
||||
uid=9_215 StaticText "✦"
|
||||
uid=9_216 StaticText "Utiliser le Destin"
|
||||
uid=9_217 StaticText "3d8 au lieu de 2d8"
|
||||
uid=9_218 StaticText "Jauge destin vide"
|
||||
uid=9_219 StaticText "MODIFICATEURS SITUATIONNELS"
|
||||
uid=9_220 combobox expandable haspopup="menu" value="0"
|
||||
uid=9_221 option "-8" selectable value="-8"
|
||||
uid=9_222 option "-7" selectable value="-7"
|
||||
uid=9_223 option "-6" selectable value="-6"
|
||||
uid=9_224 option "-5" selectable value="-5"
|
||||
uid=9_225 option "-4" selectable value="-4"
|
||||
uid=9_226 option "-3" selectable value="-3"
|
||||
uid=9_227 option "-2" selectable value="-2"
|
||||
uid=9_228 option "-1" selectable value="-1"
|
||||
uid=9_229 option "0" selectable selected value="0"
|
||||
uid=9_230 option "+1" selectable value="+1"
|
||||
uid=9_231 option "+2" selectable value="+2"
|
||||
uid=9_232 option "+3" selectable value="+3"
|
||||
uid=9_233 option "+4" selectable value="+4"
|
||||
uid=9_234 option "+5" selectable value="+5"
|
||||
uid=9_235 option "+6" selectable value="+6"
|
||||
uid=9_236 option "+7" selectable value="+7"
|
||||
uid=9_237 option "+8" selectable value="+8"
|
||||
uid=9_238 StaticText "VISIBILITÉ"
|
||||
uid=9_239 combobox expandable haspopup="menu" value="Public"
|
||||
uid=9_240 option "Public" selectable selected value="Public"
|
||||
uid=9_241 option "MJ uniquement" selectable value="MJ uniquement"
|
||||
uid=9_242 option "Secret (moi)" selectable value="Secret (moi)"
|
||||
uid=9_243 StaticText "FORMULE"
|
||||
uid=9_244 StaticText "2d8 + 6"
|
||||
uid=9_245 button "Lancer !"
|
||||
uid=9_246 dialog
|
||||
uid=9_247 banner
|
||||
uid=9_248 heading "Corps › Attaquer" level="1"
|
||||
uid=9_249 button "Basculer les contrôles"
|
||||
uid=9_250 button "Fermer la fenêtre"
|
||||
uid=9_251 StaticText "PNJ01"
|
||||
uid=9_252 StaticText "⚔"
|
||||
uid=9_253 StaticText "Arme"
|
||||
uid=9_254 StaticText "+1"
|
||||
uid=9_255 StaticText "Corps"
|
||||
uid=9_256 StaticText " › "
|
||||
uid=9_257 StaticText "Attaquer"
|
||||
uid=9_258 StaticText "2d8"
|
||||
uid=9_259 StaticText "+"
|
||||
uid=9_260 StaticText "6"
|
||||
uid=9_261 StaticText "CIBLE"
|
||||
uid=9_262 combobox expandable haspopup="menu" value="— Saisir manuellement —"
|
||||
uid=9_263 option "— Saisir manuellement —" selectable selected value="— Saisir manuellement —"
|
||||
uid=9_264 option "Elemiah Cowen" selectable value="Elemiah Cowen"
|
||||
uid=9_265 StaticText "CORPS DU PNJ"
|
||||
uid=9_266 spinbutton value="7" valuemax="30" valuemin="1" valuetext="7"
|
||||
uid=9_267 StaticText "MODIFICATEUR"
|
||||
uid=9_268 combobox expandable haspopup="menu" value="Malaisé (0)"
|
||||
uid=9_269 option "Évident — Réussite automatique" selectable value="Évident — Réussite automatique"
|
||||
uid=9_270 option "Malaisé (0)" selectable selected value="Malaisé (0)"
|
||||
uid=9_271 option "Difficile (−2)" selectable value="Difficile (−2)"
|
||||
uid=9_272 option "Très difficile (−4)" selectable value="Très difficile (−4)"
|
||||
uid=9_273 option "Extrêmement difficile (−6)" selectable value="Extrêmement difficile (−6)"
|
||||
uid=9_274 option "Incroyablement difficile (−8)" selectable value="Incroyablement difficile (−8)"
|
||||
uid=9_275 StaticText "ASPECT"
|
||||
uid=9_276 combobox expandable haspopup="menu" value="0"
|
||||
uid=9_277 option "-4" selectable value="-4"
|
||||
uid=9_278 option "-3" selectable value="-3"
|
||||
uid=9_279 option "-2" selectable value="-2"
|
||||
uid=9_280 option "-1" selectable value="-1"
|
||||
uid=9_281 option "0" selectable selected value="0"
|
||||
uid=9_282 option "+1" selectable value="+1"
|
||||
uid=9_283 option "+2" selectable value="+2"
|
||||
uid=9_284 option "+3" selectable value="+3"
|
||||
uid=9_285 option "+4" selectable value="+4"
|
||||
uid=9_286 checkbox
|
||||
uid=9_287 StaticText "🌑"
|
||||
uid=9_288 StaticText "Lancer le Dé de la Lune"
|
||||
uid=9_289 checkbox disableable disabled
|
||||
uid=9_290 StaticText "✦"
|
||||
uid=9_291 StaticText "Utiliser le Destin"
|
||||
uid=9_292 StaticText "3d8 au lieu de 2d8"
|
||||
uid=9_293 StaticText "Jauge destin vide"
|
||||
uid=9_294 StaticText "MODIFICATEURS SITUATIONNELS"
|
||||
uid=9_295 combobox expandable haspopup="menu" value="0"
|
||||
uid=9_296 option "-8" selectable value="-8"
|
||||
uid=9_297 option "-7" selectable value="-7"
|
||||
uid=9_298 option "-6" selectable value="-6"
|
||||
uid=9_299 option "-5" selectable value="-5"
|
||||
uid=9_300 option "-4" selectable value="-4"
|
||||
uid=9_301 option "-3" selectable value="-3"
|
||||
uid=9_302 option "-2" selectable value="-2"
|
||||
uid=9_303 option "-1" selectable value="-1"
|
||||
uid=9_304 option "0" selectable selected value="0"
|
||||
uid=9_305 option "+1" selectable value="+1"
|
||||
uid=9_306 option "+2" selectable value="+2"
|
||||
uid=9_307 option "+3" selectable value="+3"
|
||||
uid=9_308 option "+4" selectable value="+4"
|
||||
uid=9_309 option "+5" selectable value="+5"
|
||||
uid=9_310 option "+6" selectable value="+6"
|
||||
uid=9_311 option "+7" selectable value="+7"
|
||||
uid=9_312 option "+8" selectable value="+8"
|
||||
uid=9_313 StaticText "VISIBILITÉ"
|
||||
uid=9_314 combobox expandable haspopup="menu" value="Public"
|
||||
uid=9_315 option "Public" selectable selected value="Public"
|
||||
uid=9_316 option "MJ uniquement" selectable value="MJ uniquement"
|
||||
uid=9_317 option "Secret (moi)" selectable value="Secret (moi)"
|
||||
uid=9_318 StaticText "FORMULE"
|
||||
uid=9_319 StaticText "2d8 + 6"
|
||||
uid=9_320 button "Lancer !" focusable focused
|
||||
@@ -608,6 +608,7 @@
|
||||
}
|
||||
|
||||
// Onglet Équipement
|
||||
.tab.combat,
|
||||
.tab.equipement {
|
||||
.equip-section {
|
||||
margin-bottom: 14px;
|
||||
@@ -666,6 +667,22 @@
|
||||
}
|
||||
}
|
||||
|
||||
.base-combat-row {
|
||||
.base-action-icon {
|
||||
width: 32px;
|
||||
height: 32px;
|
||||
border-radius: 6px;
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
background: rgba(12,76,12,0.1);
|
||||
border: 1px solid rgba(12,76,12,0.25);
|
||||
color: var(--cel-green);
|
||||
font-size: 1rem;
|
||||
flex-shrink: 0;
|
||||
}
|
||||
}
|
||||
|
||||
.equip-empty {
|
||||
font-size: 0.85em;
|
||||
font-style: italic;
|
||||
|
||||
@@ -346,6 +346,7 @@
|
||||
}
|
||||
}
|
||||
|
||||
.tab.combat,
|
||||
.tab.equipement {
|
||||
.equip-section {
|
||||
margin-bottom: 14px;
|
||||
|
||||
90
templates/character-combat.hbs
Normal file
90
templates/character-combat.hbs
Normal file
@@ -0,0 +1,90 @@
|
||||
<div class="tab combat {{tab.cssClass}}" data-group="sheet" data-tab="combat">
|
||||
|
||||
<div class="equip-section combat-actions-section">
|
||||
<div class="section-header">
|
||||
<i class="fas fa-burst"></i>
|
||||
<span>{{localize "CELESTOPOL.Combat.baseActions"}}</span>
|
||||
</div>
|
||||
|
||||
<div class="item-row base-combat-row">
|
||||
<div class="base-action-icon"><i class="fas fa-hand-fist"></i></div>
|
||||
<span class="item-name">{{localize "CELESTOPOL.Combat.unarmedAttack"}}</span>
|
||||
<span class="item-tag type">{{localize "CELESTOPOL.Weapon.typeMelee"}}</span>
|
||||
<span class="item-tag dmg">{{localize "CELESTOPOL.Weapon.degats"}} 0</span>
|
||||
<div class="item-controls">
|
||||
{{#unless isEditMode}}
|
||||
<a data-action="unarmedAttack" title="{{localize 'CELESTOPOL.Combat.unarmedAttack'}}"><i class="fas fa-khanda"></i></a>
|
||||
{{/unless}}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="item-row base-combat-row">
|
||||
<div class="base-action-icon"><i class="fas fa-person-running"></i></div>
|
||||
<span class="item-name">{{localize "CELESTOPOL.Combat.baseRangedDefense"}}</span>
|
||||
<span class="item-tag type">{{localize "CELESTOPOL.Combat.rangedDefenseTag"}}</span>
|
||||
<span class="item-tag dmg">{{localize "CELESTOPOL.Skill.mobilite"}}</span>
|
||||
<div class="item-controls">
|
||||
{{#unless isEditMode}}
|
||||
<a data-action="baseRangedDefense" title="{{localize 'CELESTOPOL.Combat.baseRangedDefense'}}"><i class="fas fa-shield-halved"></i></a>
|
||||
{{/unless}}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="equip-section">
|
||||
<div class="section-header">
|
||||
<i class="fas fa-khanda"></i>
|
||||
<span>{{localize "CELESTOPOL.Item.weapons"}}</span>
|
||||
{{#if isEditMode}}
|
||||
<a data-action="createWeapon" title="{{localize 'CELESTOPOL.Item.newWeapon'}}"><i class="fas fa-plus"></i></a>
|
||||
{{/if}}
|
||||
</div>
|
||||
{{#each weapons as |item|}}
|
||||
<div class="item-row weapon" data-item-id="{{item.id}}" data-item-uuid="{{item.uuid}}" data-drag="true">
|
||||
<img src="{{item.img}}" class="item-icon">
|
||||
<span class="item-name">{{item.name}}</span>
|
||||
<span class="item-tag type">{{#if (eq item.system.type "melee")}}{{localize "CELESTOPOL.Weapon.typeMelee"}}{{else}}{{localize "CELESTOPOL.Weapon.typeDistance"}}{{/if}}</span>
|
||||
<span class="item-tag dmg">{{localize "CELESTOPOL.Weapon.degats"}} {{item.system.degats}}</span>
|
||||
<div class="item-controls">
|
||||
{{#unless ../isEditMode}}
|
||||
<a data-action="attack" data-item-id="{{item.id}}" title="{{localize 'CELESTOPOL.Combat.attack'}}"><i class="fas fa-khanda"></i></a>
|
||||
{{/unless}}
|
||||
<a data-action="edit" data-item-uuid="{{item.uuid}}"><i class="fas fa-edit"></i></a>
|
||||
{{#if ../isEditMode}}<a data-action="delete" data-item-uuid="{{item.uuid}}"><i class="fas fa-trash"></i></a>{{/if}}
|
||||
</div>
|
||||
</div>
|
||||
{{else}}
|
||||
<p class="equip-empty">{{localize "CELESTOPOL.Item.noWeapons"}}</p>
|
||||
{{/each}}
|
||||
</div>
|
||||
|
||||
<div class="equip-section">
|
||||
<div class="section-header">
|
||||
<i class="fas fa-shield-halved"></i>
|
||||
<span>{{localize "CELESTOPOL.Item.armures"}}</span>
|
||||
{{#if isEditMode}}
|
||||
<a data-action="createArmure" title="{{localize 'CELESTOPOL.Item.newArmure'}}"><i class="fas fa-plus"></i></a>
|
||||
{{/if}}
|
||||
</div>
|
||||
{{#each armures as |item|}}
|
||||
<div class="item-row armure {{#if item.system.equipped}}is-equipped{{/if}}" data-item-id="{{item.id}}" data-item-uuid="{{item.uuid}}" data-drag="true">
|
||||
<img src="{{item.img}}" class="item-icon">
|
||||
<span class="item-name">{{item.name}}</span>
|
||||
<span class="item-tag prot"><i class="fas fa-shield"></i> {{item.system.protection}}</span>
|
||||
{{#if item.system.protection}}<span class="item-tag malus">−{{item.system.protection}} {{localize "CELESTOPOL.Armure.malus"}}</span>{{/if}}
|
||||
<div class="item-controls">
|
||||
<a data-action="toggleArmure" data-item-uuid="{{item.uuid}}"
|
||||
class="equip-toggle {{#if item.system.equipped}}equipped{{/if}}"
|
||||
title="{{#if item.system.equipped}}{{localize 'CELESTOPOL.Armure.unequip'}}{{else}}{{localize 'CELESTOPOL.Armure.equip'}}{{/if}}">
|
||||
<i class="fas fa-shield{{#unless item.system.equipped}}-halved{{/unless}}"></i>
|
||||
</a>
|
||||
<a data-action="edit" data-item-uuid="{{item.uuid}}"><i class="fas fa-edit"></i></a>
|
||||
{{#if ../isEditMode}}<a data-action="delete" data-item-uuid="{{item.uuid}}"><i class="fas fa-trash"></i></a>{{/if}}
|
||||
</div>
|
||||
</div>
|
||||
{{else}}
|
||||
<p class="equip-empty">{{localize "CELESTOPOL.Item.noArmures"}}</p>
|
||||
{{/each}}
|
||||
</div>
|
||||
|
||||
</div>
|
||||
@@ -1,67 +1,4 @@
|
||||
<div class="tab equipement {{tab.cssClass}}" data-group="sheet" data-tab="equipement">
|
||||
|
||||
{{!-- ── Armes ─────────────────────────────────────────────────────────── --}}
|
||||
<div class="equip-section">
|
||||
<div class="section-header">
|
||||
<i class="fas fa-khanda"></i>
|
||||
<span>{{localize "CELESTOPOL.Item.weapons"}}</span>
|
||||
{{#if isEditMode}}
|
||||
<a data-action="createWeapon" title="{{localize 'CELESTOPOL.Item.newWeapon'}}"><i class="fas fa-plus"></i></a>
|
||||
{{/if}}
|
||||
</div>
|
||||
{{#each weapons as |item|}}
|
||||
<div class="item-row weapon" data-item-id="{{item.id}}" data-item-uuid="{{item.uuid}}" data-drag="true">
|
||||
<img src="{{item.img}}" class="item-icon">
|
||||
<span class="item-name">{{item.name}}</span>
|
||||
<span class="item-tag type">{{#if (eq item.system.type "melee")}}{{localize "CELESTOPOL.Weapon.typeMelee"}}{{else}}{{localize "CELESTOPOL.Weapon.typeDistance"}}{{/if}}</span>
|
||||
<span class="item-tag dmg">{{localize "CELESTOPOL.Weapon.degats"}} {{item.system.degats}}</span>
|
||||
<div class="item-controls">
|
||||
{{#unless ../isEditMode}}
|
||||
<a data-action="attack" data-item-id="{{item.id}}" title="{{localize 'CELESTOPOL.Combat.attack'}}"><i class="fas fa-khanda"></i></a>
|
||||
{{#if (eq item.system.type "distance")}}
|
||||
<a data-action="rangedDefense" data-item-id="{{item.id}}" title="{{localize 'CELESTOPOL.Combat.rangedDefenseTitle'}}"><i class="fas fa-shield-halved"></i></a>
|
||||
{{/if}}
|
||||
{{/unless}}
|
||||
<a data-action="edit" data-item-uuid="{{item.uuid}}"><i class="fas fa-edit"></i></a>
|
||||
{{#if ../isEditMode}}<a data-action="delete" data-item-uuid="{{item.uuid}}"><i class="fas fa-trash"></i></a>{{/if}}
|
||||
</div>
|
||||
</div>
|
||||
{{else}}
|
||||
<p class="equip-empty">{{localize "CELESTOPOL.Item.noWeapons"}}</p>
|
||||
{{/each}}
|
||||
</div>
|
||||
|
||||
{{!-- ── Armures ───────────────────────────────────────────────────────── --}}
|
||||
<div class="equip-section">
|
||||
<div class="section-header">
|
||||
<i class="fas fa-shield-halved"></i>
|
||||
<span>{{localize "CELESTOPOL.Item.armures"}}</span>
|
||||
{{#if isEditMode}}
|
||||
<a data-action="createArmure" title="{{localize 'CELESTOPOL.Item.newArmure'}}"><i class="fas fa-plus"></i></a>
|
||||
{{/if}}
|
||||
</div>
|
||||
{{#each armures as |item|}}
|
||||
<div class="item-row armure {{#if item.system.equipped}}is-equipped{{/if}}" data-item-id="{{item.id}}" data-item-uuid="{{item.uuid}}" data-drag="true">
|
||||
<img src="{{item.img}}" class="item-icon">
|
||||
<span class="item-name">{{item.name}}</span>
|
||||
<span class="item-tag prot"><i class="fas fa-shield"></i> {{item.system.protection}}</span>
|
||||
{{#if item.system.protection}}<span class="item-tag malus">−{{item.system.protection}} {{localize "CELESTOPOL.Armure.malus"}}</span>{{/if}}
|
||||
<div class="item-controls">
|
||||
<a data-action="toggleArmure" data-item-uuid="{{item.uuid}}"
|
||||
class="equip-toggle {{#if item.system.equipped}}equipped{{/if}}"
|
||||
title="{{#if item.system.equipped}}{{localize 'CELESTOPOL.Armure.unequip'}}{{else}}{{localize 'CELESTOPOL.Armure.equip'}}{{/if}}">
|
||||
<i class="fas fa-shield{{#unless item.system.equipped}}-halved{{/unless}}"></i>
|
||||
</a>
|
||||
<a data-action="edit" data-item-uuid="{{item.uuid}}"><i class="fas fa-edit"></i></a>
|
||||
{{#if ../isEditMode}}<a data-action="delete" data-item-uuid="{{item.uuid}}"><i class="fas fa-trash"></i></a>{{/if}}
|
||||
</div>
|
||||
</div>
|
||||
{{else}}
|
||||
<p class="equip-empty">{{localize "CELESTOPOL.Item.noArmures"}}</p>
|
||||
{{/each}}
|
||||
</div>
|
||||
|
||||
{{!-- ── Équipements ──────────────────────────────────────────────────── --}}
|
||||
<div class="equip-section">
|
||||
<div class="section-header">
|
||||
<i class="fas fa-briefcase"></i>
|
||||
|
||||
@@ -183,23 +183,23 @@
|
||||
{{#if hasVariableDamage}}
|
||||
<div class="damage-note">{{localize "CELESTOPOL.Combat.damageManual"}}</div>
|
||||
{{else}}
|
||||
{{#if targetActorId}}
|
||||
{{#if targetActorUuid}}
|
||||
<div class="damage-breakdown">
|
||||
<div><strong>{{localize "CELESTOPOL.Combat.targetLabel"}} :</strong> {{targetActorName}}</div>
|
||||
<div><strong>{{localize "CELESTOPOL.Combat.damageArmorReduction"}} :</strong> −{{selectedTargetProtection}}</div>
|
||||
<div><strong>{{localize "CELESTOPOL.Combat.damageApplied"}} :</strong> {{selectedTargetAppliedWounds}}</div>
|
||||
</div>
|
||||
<div class="weapon-damage-actions">
|
||||
<button type="button" class="damage-apply-button" data-action="apply-weapon-damage" data-actor-id="{{targetActorId}}" data-incoming-wounds="{{incomingWounds}}">
|
||||
<button type="button" class="damage-apply-button" data-action="apply-weapon-damage" data-actor-id="{{targetActorId}}" data-actor-uuid="{{targetActorUuid}}" data-incoming-wounds="{{incomingWounds}}">
|
||||
{{localize "CELESTOPOL.Combat.applyDamage"}}
|
||||
</button>
|
||||
</div>
|
||||
{{else if availableTargets.length}}
|
||||
<div class="weapon-damage-actions">
|
||||
<select name="targetActorId">
|
||||
<select name="targetActorUuid">
|
||||
<option value="">{{localize "CELESTOPOL.Combat.targetAuto"}}</option>
|
||||
{{#each availableTargets as |target|}}
|
||||
<option value="{{target.id}}" {{#if target.selected}}selected{{/if}}>{{target.name}}</option>
|
||||
<option value="{{target.uuid}}" data-actor-id="{{target.id}}" {{#if target.selected}}selected{{/if}}>{{target.name}}</option>
|
||||
{{/each}}
|
||||
</select>
|
||||
<button type="button" class="damage-apply-button" data-action="apply-weapon-damage" data-incoming-wounds="{{incomingWounds}}">
|
||||
|
||||
59
templates/npc-combat.hbs
Normal file
59
templates/npc-combat.hbs
Normal file
@@ -0,0 +1,59 @@
|
||||
<div class="tab combat {{tab.cssClass}}" data-group="sheet" data-tab="combat">
|
||||
|
||||
<div class="equip-section">
|
||||
<div class="section-header">
|
||||
<i class="fas fa-khanda"></i>
|
||||
<span>{{localize "CELESTOPOL.Item.weapons"}}</span>
|
||||
{{#if isEditMode}}
|
||||
<a data-action="createWeapon" title="{{localize 'CELESTOPOL.Item.newWeapon'}}"><i class="fas fa-plus"></i></a>
|
||||
{{/if}}
|
||||
</div>
|
||||
{{#each weapons as |item|}}
|
||||
<div class="item-row weapon" data-item-id="{{item.id}}" data-item-uuid="{{item.uuid}}" data-drag="true">
|
||||
<img src="{{item.img}}" class="item-icon">
|
||||
<span class="item-name">{{item.name}}</span>
|
||||
<span class="item-tag type">{{#if (eq item.system.type "melee")}}{{localize "CELESTOPOL.Weapon.typeMelee"}}{{else}}{{localize "CELESTOPOL.Weapon.typeDistance"}}{{/if}}</span>
|
||||
<span class="item-tag dmg">{{localize "CELESTOPOL.Weapon.degats"}} {{item.system.degats}}</span>
|
||||
<div class="item-controls">
|
||||
{{#unless ../isEditMode}}
|
||||
<a data-action="attack" data-item-id="{{item.id}}" title="{{localize 'CELESTOPOL.Combat.attack'}}"><i class="fas fa-khanda"></i></a>
|
||||
{{/unless}}
|
||||
<a data-action="edit" data-item-uuid="{{item.uuid}}"><i class="fas fa-edit"></i></a>
|
||||
{{#if ../isEditMode}}<a data-action="delete" data-item-uuid="{{item.uuid}}"><i class="fas fa-trash"></i></a>{{/if}}
|
||||
</div>
|
||||
</div>
|
||||
{{else}}
|
||||
<p class="equip-empty">{{localize "CELESTOPOL.Item.noWeapons"}}</p>
|
||||
{{/each}}
|
||||
</div>
|
||||
|
||||
<div class="equip-section">
|
||||
<div class="section-header">
|
||||
<i class="fas fa-shield-halved"></i>
|
||||
<span>{{localize "CELESTOPOL.Item.armures"}}</span>
|
||||
{{#if isEditMode}}
|
||||
<a data-action="createArmure" title="{{localize 'CELESTOPOL.Item.newArmure'}}"><i class="fas fa-plus"></i></a>
|
||||
{{/if}}
|
||||
</div>
|
||||
{{#each armures as |item|}}
|
||||
<div class="item-row armure {{#if item.system.equipped}}is-equipped{{/if}}" data-item-id="{{item.id}}" data-item-uuid="{{item.uuid}}" data-drag="true">
|
||||
<img src="{{item.img}}" class="item-icon">
|
||||
<span class="item-name">{{item.name}}</span>
|
||||
<span class="item-tag prot"><i class="fas fa-shield"></i> {{item.system.protection}}</span>
|
||||
{{#if item.system.protection}}<span class="item-tag malus">−{{item.system.protection}} {{localize "CELESTOPOL.Armure.malus"}}</span>{{/if}}
|
||||
<div class="item-controls">
|
||||
<a data-action="toggleArmure" data-item-uuid="{{item.uuid}}"
|
||||
title="{{#if item.system.equipped}}{{localize 'CELESTOPOL.Armure.unequip'}}{{else}}{{localize 'CELESTOPOL.Armure.equip'}}{{/if}}"
|
||||
class="equip-toggle {{#if item.system.equipped}}equipped{{/if}}">
|
||||
<i class="fas fa-shield{{#unless item.system.equipped}}-halved{{/unless}}"></i>
|
||||
</a>
|
||||
<a data-action="edit" data-item-uuid="{{item.uuid}}"><i class="fas fa-edit"></i></a>
|
||||
{{#if ../isEditMode}}<a data-action="delete" data-item-uuid="{{item.uuid}}"><i class="fas fa-trash"></i></a>{{/if}}
|
||||
</div>
|
||||
</div>
|
||||
{{else}}
|
||||
<p class="equip-empty">{{localize "CELESTOPOL.Item.noArmures"}}</p>
|
||||
{{/each}}
|
||||
</div>
|
||||
|
||||
</div>
|
||||
@@ -1,61 +1,4 @@
|
||||
<div class="tab equipement {{tab.cssClass}}" data-group="sheet" data-tab="equipement">
|
||||
|
||||
{{!-- ── Armes ─────────────────────────────────────────────────────────── --}}
|
||||
<div class="equip-section">
|
||||
<div class="section-header">
|
||||
<i class="fas fa-khanda"></i>
|
||||
<span>{{localize "CELESTOPOL.Item.weapons"}}</span>
|
||||
{{#if isEditMode}}
|
||||
<a data-action="createWeapon" title="{{localize 'CELESTOPOL.Item.newWeapon'}}"><i class="fas fa-plus"></i></a>
|
||||
{{/if}}
|
||||
</div>
|
||||
{{#each weapons as |item|}}
|
||||
<div class="item-row weapon" data-item-id="{{item.id}}" data-item-uuid="{{item.uuid}}" data-drag="true">
|
||||
<img src="{{item.img}}" class="item-icon">
|
||||
<span class="item-name">{{item.name}}</span>
|
||||
<span class="item-tag type">{{#if (eq item.system.type "melee")}}{{localize "CELESTOPOL.Weapon.typeMelee"}}{{else}}{{localize "CELESTOPOL.Weapon.typeDistance"}}{{/if}}</span>
|
||||
<span class="item-tag dmg">{{localize "CELESTOPOL.Weapon.degats"}} {{item.system.degats}}</span>
|
||||
<div class="item-controls">
|
||||
<a data-action="edit" data-item-uuid="{{item.uuid}}"><i class="fas fa-edit"></i></a>
|
||||
{{#if ../isEditMode}}<a data-action="delete" data-item-uuid="{{item.uuid}}"><i class="fas fa-trash"></i></a>{{/if}}
|
||||
</div>
|
||||
</div>
|
||||
{{else}}
|
||||
<p class="equip-empty">{{localize "CELESTOPOL.Item.noWeapons"}}</p>
|
||||
{{/each}}
|
||||
</div>
|
||||
|
||||
{{!-- ── Armures ───────────────────────────────────────────────────────── --}}
|
||||
<div class="equip-section">
|
||||
<div class="section-header">
|
||||
<i class="fas fa-shield-halved"></i>
|
||||
<span>{{localize "CELESTOPOL.Item.armures"}}</span>
|
||||
{{#if isEditMode}}
|
||||
<a data-action="createArmure" title="{{localize 'CELESTOPOL.Item.newArmure'}}"><i class="fas fa-plus"></i></a>
|
||||
{{/if}}
|
||||
</div>
|
||||
{{#each armures as |item|}}
|
||||
<div class="item-row armure {{#if item.system.equipped}}is-equipped{{/if}}" data-item-id="{{item.id}}" data-item-uuid="{{item.uuid}}" data-drag="true">
|
||||
<img src="{{item.img}}" class="item-icon">
|
||||
<span class="item-name">{{item.name}}</span>
|
||||
<span class="item-tag prot"><i class="fas fa-shield"></i> {{item.system.protection}}</span>
|
||||
{{#if item.system.protection}}<span class="item-tag malus">−{{item.system.protection}} {{localize "CELESTOPOL.Armure.malus"}}</span>{{/if}}
|
||||
<div class="item-controls">
|
||||
<a data-action="toggleArmure" data-item-uuid="{{item.uuid}}"
|
||||
title="{{#if item.system.equipped}}{{localize 'CELESTOPOL.Armure.unequip'}}{{else}}{{localize 'CELESTOPOL.Armure.equip'}}{{/if}}"
|
||||
class="equip-toggle {{#if item.system.equipped}}equipped{{/if}}">
|
||||
<i class="fas fa-shield{{#unless item.system.equipped}}-halved{{/unless}}"></i>
|
||||
</a>
|
||||
<a data-action="edit" data-item-uuid="{{item.uuid}}"><i class="fas fa-edit"></i></a>
|
||||
{{#if ../isEditMode}}<a data-action="delete" data-item-uuid="{{item.uuid}}"><i class="fas fa-trash"></i></a>{{/if}}
|
||||
</div>
|
||||
</div>
|
||||
{{else}}
|
||||
<p class="equip-empty">{{localize "CELESTOPOL.Item.noArmures"}}</p>
|
||||
{{/each}}
|
||||
</div>
|
||||
|
||||
{{!-- ── Équipements ──────────────────────────────────────────────────── --}}
|
||||
<div class="equip-section">
|
||||
<div class="section-header">
|
||||
<i class="fas fa-briefcase"></i>
|
||||
|
||||
@@ -52,7 +52,7 @@
|
||||
<select id="targetSelect" name="targetSelect">
|
||||
<option value="">— {{localize "CELESTOPOL.Combat.targetAuto"}} —</option>
|
||||
{{#each availableTargets as |t|}}
|
||||
<option value="{{t.id}}" data-corps="{{t.corps}}">{{t.name}}</option>
|
||||
<option value="{{t.uuid}}" data-corps="{{t.corps}}">{{t.name}}{{#if t.weaponName}} — {{t.weaponName}} [{{t.weaponDegats}}]{{/if}}</option>
|
||||
{{/each}}
|
||||
</select>
|
||||
</div>
|
||||
|
||||
Reference in New Issue
Block a user