Compare commits
5 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| b3cf0b0aa1 | |||
| 63c0153860 | |||
| 8bfbdedf43 | |||
| 6d2fca9fc2 | |||
| b26ce2f114 |
@@ -68,4 +68,4 @@ jobs:
|
|||||||
manifest: 'https://www.uberwald.me/gitea/${{gitea.repository}}/releases/download/latest/system.json'
|
manifest: 'https://www.uberwald.me/gitea/${{gitea.repository}}/releases/download/latest/system.json'
|
||||||
notes: 'https://www.uberwald.me/gitea/${{gitea.repository}}/releases/download/${{github.event.release.tag_name}}/fvtt-celestopol-${{github.event.release.tag_name}}.zip'
|
notes: 'https://www.uberwald.me/gitea/${{gitea.repository}}/releases/download/${{github.event.release.tag_name}}/fvtt-celestopol-${{github.event.release.tag_name}}.zip'
|
||||||
compatibility-minimum: '13'
|
compatibility-minimum: '13'
|
||||||
compatibility-verified: '13'
|
compatibility-verified: '14'
|
||||||
|
|||||||
87
.github/copilot-instructions.md
vendored
87
.github/copilot-instructions.md
vendored
@@ -1,87 +0,0 @@
|
|||||||
# Copilot Instructions — fvtt-celestopol
|
|
||||||
|
|
||||||
## Project Overview
|
|
||||||
|
|
||||||
This is a **Foundry VTT system** for **Célestopol 1922**, a French tabletop RPG set in an art-deco 1922 universe. The project targets FoundryVTT v13+ and is developed in French.
|
|
||||||
|
|
||||||
The reference rulebooks are in `__regles/` (gitignored):
|
|
||||||
- *Célestopol 1922 Livre de base* — core rulebook
|
|
||||||
- *Célestopol 1922 Fiches de prêts à jouer* — pre-generated character sheets
|
|
||||||
|
|
||||||
## Architecture
|
|
||||||
|
|
||||||
This system uses **FoundryVTT v13 DataModels + ApplicationV2** — NOT the legacy template.json / AppV1 approach.
|
|
||||||
|
|
||||||
```
|
|
||||||
fvtt-celestopol.mjs # Main entry point (Hooks.once("init"))
|
|
||||||
module/
|
|
||||||
config/system.mjs # All game constants (SYSTEM export)
|
|
||||||
models/ # TypeDataModel subclasses (character, npc, items)
|
|
||||||
documents/ # Actor, Item, ChatMessage, Roll wrappers
|
|
||||||
applications/sheets/ # AppV2 sheets (HandlebarsApplicationMixin)
|
|
||||||
lang/fr.json # French i18n (key prefix: CELESTOPOL.*)
|
|
||||||
styles/ # LESS source files
|
|
||||||
css/ # Compiled CSS (via gulp)
|
|
||||||
templates/ # Handlebars (.hbs) templates
|
|
||||||
assets/fonts/ # CopaseticNF art-deco font
|
|
||||||
assets/ui/ # Background images
|
|
||||||
assets/icons/ # Item icons
|
|
||||||
packs-system/ # Source files for compendium packs
|
|
||||||
```
|
|
||||||
|
|
||||||
## DataModels (no template.json)
|
|
||||||
|
|
||||||
- Extend `foundry.abstract.TypeDataModel`
|
|
||||||
- Schema in `static defineSchema()` using `foundry.data.fields.*`
|
|
||||||
- `prepareDerivedData()` for computed values
|
|
||||||
- Files: `module/models/character.mjs`, `npc.mjs`, `items.mjs`
|
|
||||||
|
|
||||||
## ApplicationV2 / Sheets
|
|
||||||
|
|
||||||
- Actor sheets: `HandlebarsApplicationMixin(foundry.applications.sheets.ActorSheetV2)`
|
|
||||||
- Item sheets: `HandlebarsApplicationMixin(foundry.applications.sheets.ItemSheetV2)`
|
|
||||||
- `static DEFAULT_OPTIONS` for config; `static PARTS` for templates
|
|
||||||
- `_prepareContext()` for base context; `_preparePartContext(partId, context)` for per-tab
|
|
||||||
- Edit/Play mode toggle via `_sheetMode` + `isPlayMode`/`isEditMode` getters
|
|
||||||
- Actions: `static #onXxx(event, target)` private static methods in `DEFAULT_OPTIONS.actions`
|
|
||||||
- `form: { submitOnChange: true }` enables live saving
|
|
||||||
|
|
||||||
## Roll Mechanics
|
|
||||||
|
|
||||||
- Pool of d6 dice: `nbDice = max(1, skillValue + woundMalus)`
|
|
||||||
- Formula: `{n}d6 [+ moonBonus + modifier]`
|
|
||||||
- Moon phase bonus: Nouvelle Lune=0, Croissants=+1, Gibbeuse=+2, Pleine Lune=+3
|
|
||||||
- Compare total vs difficulty threshold (normal=7)
|
|
||||||
- Wound malus: levels 1-2=0, 3-4=-1, 5-6=-2, 7=-3, 8=-999 (out)
|
|
||||||
- DialogV2 for roll configuration: `foundry.applications.api.DialogV2.wait(...)`
|
|
||||||
|
|
||||||
## Game Data (4 stats × 4 skills)
|
|
||||||
|
|
||||||
- **Âme**: Artifice, Attraction, Coercition, Faveur
|
|
||||||
- **Corps**: Échauffourée, Effacement, Mobilité, Prouesse
|
|
||||||
- **Cœur**: Appréciation, Arts, Inspiration, Traque
|
|
||||||
- **Esprit**: Instruction, Merveilleux technologique, Raisonnement, Traitement
|
|
||||||
|
|
||||||
**Tracks**: Blessures (8 niveaux), Destin (8), Spleen (8)
|
|
||||||
**Anomalies**: 9 types (none + 8)
|
|
||||||
**Factions**: 8 standard + 2 custom
|
|
||||||
|
|
||||||
## Build
|
|
||||||
|
|
||||||
```bash
|
|
||||||
npm install # Install dev deps
|
|
||||||
npx gulp css # Compile LESS → css/fvtt-celestopol.css (once)
|
|
||||||
npx gulp # Compile + watch
|
|
||||||
```
|
|
||||||
|
|
||||||
## Visual Style
|
|
||||||
|
|
||||||
- Font: **CopaseticNF** (Regular + Bold, in `assets/fonts/`) — art-deco style
|
|
||||||
- Header bg color: `rgb(12, 76, 12)` (dark green) with orange text (`#e07b00`)
|
|
||||||
- Sheet header texture: `assets/ui/fond_cadrille.jpg`
|
|
||||||
- CSS variables: `--cel-green`, `--cel-orange`, `--cel-font-title`, etc.
|
|
||||||
|
|
||||||
## Language
|
|
||||||
|
|
||||||
All in-game text, labels, and code comments should be in **French**. Code identifiers may be English. All i18n keys use the `CELESTOPOL.*` prefix (see `lang/fr.json`).
|
|
||||||
|
|
||||||
1
.gitignore
vendored
1
.gitignore
vendored
@@ -13,3 +13,4 @@ css/*.css
|
|||||||
# Règles (PDFs privés)
|
# Règles (PDFs privés)
|
||||||
__regles/
|
__regles/
|
||||||
*.pdf
|
*.pdf
|
||||||
|
.github/
|
||||||
|
|||||||
@@ -449,7 +449,9 @@
|
|||||||
"rangeLongue": "Longue portée",
|
"rangeLongue": "Longue portée",
|
||||||
"type": "Type",
|
"type": "Type",
|
||||||
"typeMelee": "Mêlée",
|
"typeMelee": "Mêlée",
|
||||||
"typeDistance": "Distance"
|
"typeDistance": "Distance",
|
||||||
|
"equip": "Équiper",
|
||||||
|
"unequip": "Retirer"
|
||||||
},
|
},
|
||||||
"Armure": {
|
"Armure": {
|
||||||
"protection": "Protection",
|
"protection": "Protection",
|
||||||
|
|||||||
@@ -46,6 +46,7 @@ export default class CelestopolActorSheet extends HandlebarsApplicationMixin(fou
|
|||||||
skillLevel: CelestopolActorSheet.#onSkillLevel,
|
skillLevel: CelestopolActorSheet.#onSkillLevel,
|
||||||
factionLevel: CelestopolActorSheet.#onFactionLevel,
|
factionLevel: CelestopolActorSheet.#onFactionLevel,
|
||||||
toggleArmure: CelestopolActorSheet.#onToggleArmure,
|
toggleArmure: CelestopolActorSheet.#onToggleArmure,
|
||||||
|
toggleWeapon: CelestopolActorSheet.#onToggleWeapon,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -237,6 +238,13 @@ export default class CelestopolActorSheet extends HandlebarsApplicationMixin(fou
|
|||||||
if (item?.type === "armure") await item.update({ "system.equipped": !item.system.equipped })
|
if (item?.type === "armure") await item.update({ "system.equipped": !item.system.equipped })
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static async #onToggleWeapon(_event, target) {
|
||||||
|
const uuid = target.closest('[data-item-uuid]')?.dataset.itemUuid
|
||||||
|
if (!uuid) return
|
||||||
|
const item = await fromUuid(uuid)
|
||||||
|
if (item?.type === "weapon") await item.update({ "system.equipped": !item.system.equipped })
|
||||||
|
}
|
||||||
|
|
||||||
static #onFactionLevel(_event, target) {
|
static #onFactionLevel(_event, target) {
|
||||||
if (!this.isEditable) return
|
if (!this.isEditable) return
|
||||||
const factionId = target.dataset.faction
|
const factionId = target.dataset.faction
|
||||||
|
|||||||
@@ -320,6 +320,8 @@ export class CelestopolRoll extends Roll {
|
|||||||
: null
|
: null
|
||||||
const resolvedWeaponName = (isRangedDefense && selectedCombatTarget?.weaponName) ? selectedCombatTarget.weaponName : weaponName
|
const resolvedWeaponName = (isRangedDefense && selectedCombatTarget?.weaponName) ? selectedCombatTarget.weaponName : weaponName
|
||||||
const resolvedWeaponDegats = (isRangedDefense && selectedCombatTarget?.weaponDegats) ? selectedCombatTarget.weaponDegats : weaponDegats
|
const resolvedWeaponDegats = (isRangedDefense && selectedCombatTarget?.weaponDegats) ? selectedCombatTarget.weaponDegats : weaponDegats
|
||||||
|
// Dégâts de l'arme adverse en cas d'échec (arme équipée du PNJ ciblé en mêlée, arme distance en esquive)
|
||||||
|
const incomingWeaponDegats = selectedCombatTarget?.weaponDegats ?? resolvedWeaponDegats
|
||||||
const targetActorId = selectedCombatTarget?.id || ""
|
const targetActorId = selectedCombatTarget?.id || ""
|
||||||
const targetActorUuid = selectedCombatTarget?.uuid || ""
|
const targetActorUuid = selectedCombatTarget?.uuid || ""
|
||||||
const targetActorName = selectedCombatTarget?.name || ""
|
const targetActorName = selectedCombatTarget?.name || ""
|
||||||
@@ -373,6 +375,7 @@ export class CelestopolRoll extends Roll {
|
|||||||
weaponType,
|
weaponType,
|
||||||
weaponName: resolvedWeaponName,
|
weaponName: resolvedWeaponName,
|
||||||
weaponDegats: resolvedWeaponDegats,
|
weaponDegats: resolvedWeaponDegats,
|
||||||
|
incomingWeaponDegats,
|
||||||
targetActorId,
|
targetActorId,
|
||||||
targetActorUuid,
|
targetActorUuid,
|
||||||
targetActorName,
|
targetActorName,
|
||||||
@@ -383,7 +386,7 @@ export class CelestopolRoll extends Roll {
|
|||||||
puiserRessources: effectivePuiser,
|
puiserRessources: effectivePuiser,
|
||||||
nbDice: (!isResistance && useFortune) ? 1 : nbDice,
|
nbDice: (!isResistance && useFortune) ? 1 : nbDice,
|
||||||
formula,
|
formula,
|
||||||
rollMode: rollContext.visibility ?? "publicroll",
|
rollMode: rollContext.visibility ?? "public",
|
||||||
rollMoonDie: effectiveMoon,
|
rollMoonDie: effectiveMoon,
|
||||||
moonDieResult,
|
moonDieResult,
|
||||||
moonFace,
|
moonFace,
|
||||||
@@ -407,9 +410,9 @@ export class CelestopolRoll extends Roll {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Mêlée échouée OU défense à distance échouée → le protagoniste subit les dégâts de l'arme PNJ
|
// Mêlée échouée OU défense à distance échouée → le protagoniste (PJ uniquement) subit les dégâts de l'arme PNJ
|
||||||
if (isCombat && (weaponType === "melee" || isRangedDefense) && actor && roll.options.resultType === "failure") {
|
if (isCombat && (weaponType === "melee" || isRangedDefense) && actor?.type === "character" && roll.options.resultType === "failure") {
|
||||||
const incomingWounds = this.getIncomingWounds(resolvedWeaponDegats)
|
const incomingWounds = this.getIncomingWounds(roll.options.incomingWeaponDegats ?? resolvedWeaponDegats)
|
||||||
const protection = this.getActorArmorProtection(actor)
|
const protection = this.getActorArmorProtection(actor)
|
||||||
const appliedWounds = incomingWounds === null
|
const appliedWounds = incomingWounds === null
|
||||||
? 1
|
? 1
|
||||||
@@ -555,6 +558,13 @@ export class CelestopolRoll extends Roll {
|
|||||||
? Math.max(0, incomingWounds - selectedTargetProtection)
|
? Math.max(0, incomingWounds - selectedTargetProtection)
|
||||||
: null
|
: null
|
||||||
|
|
||||||
|
// Type de l'acteur qui lance le jet (character | npc)
|
||||||
|
const rollingActor = await this.constructor.resolveActor({
|
||||||
|
actorUuid: this.options.actorUuid ?? null,
|
||||||
|
actorId: this.options.actorId ?? null,
|
||||||
|
})
|
||||||
|
const actorType = rollingActor?.type ?? this.options.actorType ?? null
|
||||||
|
|
||||||
// Libellé de difficulté : en combat "Corps PNJ : N", en opposition "vs ?", sinon "Seuil : 11"
|
// Libellé de difficulté : en combat "Corps PNJ : N", en opposition "vs ?", sinon "Seuil : 11"
|
||||||
const difficultyLabel = this.options.isCombat
|
const difficultyLabel = this.options.isCombat
|
||||||
? `${game.i18n.localize("CELESTOPOL.Combat.corpsPnj")} : ${threshold}`
|
? `${game.i18n.localize("CELESTOPOL.Combat.corpsPnj")} : ${threshold}`
|
||||||
@@ -600,6 +610,8 @@ export class CelestopolRoll extends Roll {
|
|||||||
woundLabel,
|
woundLabel,
|
||||||
isResistance: this.options.isResistance ?? false,
|
isResistance: this.options.isResistance ?? false,
|
||||||
isCombat: this.options.isCombat ?? false,
|
isCombat: this.options.isCombat ?? false,
|
||||||
|
actorType,
|
||||||
|
isNpcAttack: actorType === "npc",
|
||||||
weaponName: this.options.weaponName ?? null,
|
weaponName: this.options.weaponName ?? null,
|
||||||
weaponDegats,
|
weaponDegats,
|
||||||
weaponType: this.options.weaponType ?? null,
|
weaponType: this.options.weaponType ?? null,
|
||||||
@@ -634,11 +646,20 @@ export class CelestopolRoll extends Roll {
|
|||||||
|
|
||||||
/** @override */
|
/** @override */
|
||||||
async toMessage(messageData = {}, { messageMode, rollMode, create = true } = {}) {
|
async toMessage(messageData = {}, { messageMode, rollMode, create = true } = {}) {
|
||||||
if (rollMode) {
|
const modernToLegacyRollMode = {
|
||||||
messageMode = Roll._mapLegacyRollMode(rollMode)
|
public: CONST.DICE_ROLL_MODES.PUBLIC,
|
||||||
|
gm: CONST.DICE_ROLL_MODES.PRIVATE,
|
||||||
|
blind: CONST.DICE_ROLL_MODES.BLIND,
|
||||||
|
self: CONST.DICE_ROLL_MODES.SELF,
|
||||||
|
ic: CONST.DICE_ROLL_MODES.PUBLIC,
|
||||||
}
|
}
|
||||||
messageMode ||= game.settings.get("core", "messageMode")
|
let effectiveRollMode = rollMode ?? messageMode ?? game.settings.get("core", "rollMode") ?? CONST.DICE_ROLL_MODES.PUBLIC
|
||||||
if (!this._evaluated) await this.evaluate({ allowInteractive: messageMode !== "blind" })
|
effectiveRollMode = modernToLegacyRollMode[effectiveRollMode] ?? effectiveRollMode
|
||||||
|
if (!Object.values(CONST.DICE_ROLL_MODES).includes(effectiveRollMode)) {
|
||||||
|
effectiveRollMode = game.settings.get("core", "rollMode") ?? CONST.DICE_ROLL_MODES.PUBLIC
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!this._evaluated) await this.evaluate({ allowInteractive: effectiveRollMode !== CONST.DICE_ROLL_MODES.BLIND })
|
||||||
|
|
||||||
const skillLocalized = this.skillLabel ? game.i18n.localize(this.skillLabel) : ""
|
const skillLocalized = this.skillLabel ? game.i18n.localize(this.skillLabel) : ""
|
||||||
const statLocalized = this.options.statLabel
|
const statLocalized = this.options.statLabel
|
||||||
@@ -650,7 +671,7 @@ export class CelestopolRoll extends Roll {
|
|||||||
actorUuid: this.options.actorUuid ?? null,
|
actorUuid: this.options.actorUuid ?? null,
|
||||||
actorId: this.options.actorId ?? null,
|
actorId: this.options.actorId ?? null,
|
||||||
})
|
})
|
||||||
const content = await this.render({ isPrivate: messageMode !== "public" })
|
const content = await this.render({ isPrivate: effectiveRollMode !== CONST.DICE_ROLL_MODES.PUBLIC })
|
||||||
const chatData = foundry.utils.mergeObject({
|
const chatData = foundry.utils.mergeObject({
|
||||||
author: game.user.id,
|
author: game.user.id,
|
||||||
content,
|
content,
|
||||||
@@ -660,13 +681,9 @@ export class CelestopolRoll extends Roll {
|
|||||||
speaker: speakerActor ? ChatMessage.getSpeaker({ actor: speakerActor }) : undefined,
|
speaker: speakerActor ? ChatMessage.getSpeaker({ actor: speakerActor }) : undefined,
|
||||||
style: CONST.CHAT_MESSAGE_STYLES.OTHER,
|
style: CONST.CHAT_MESSAGE_STYLES.OTHER,
|
||||||
}, messageData)
|
}, messageData)
|
||||||
|
ChatMessage.applyRollMode(chatData, effectiveRollMode)
|
||||||
const cls = foundry.utils.getDocumentClass("ChatMessage")
|
if (create) return ChatMessage.create(chatData)
|
||||||
const msg = new cls(chatData)
|
return chatData
|
||||||
msg.applyMode(messageMode)
|
|
||||||
|
|
||||||
if (create) return cls.create(msg)
|
|
||||||
return msg.toObject()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -13,8 +13,6 @@
|
|||||||
|
|
||||||
import { SYSTEM } from "../config/system.mjs"
|
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 {
|
export default class CelestopolCharacter extends foundry.abstract.TypeDataModel {
|
||||||
static defineSchema() {
|
static defineSchema() {
|
||||||
const fields = foundry.data.fields
|
const fields = foundry.data.fields
|
||||||
@@ -275,40 +273,39 @@ export default class CelestopolCharacter extends foundry.abstract.TypeDataModel
|
|||||||
* Collecte les cibles de combat sur la scène active.
|
* 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.
|
* Pour un PJ attaquant, seules les cibles PNJ présentes sur la scène sont proposées.
|
||||||
* @param {object} options
|
* @param {object} options
|
||||||
* @param {boolean} [options.onlyRanged=false]
|
* @param {boolean} [options.onlyRanged=false] - Filtrer sur les PNJ ayant une arme à distance équipée
|
||||||
* @param {boolean} [options.fallbackToAll=false]
|
* @param {boolean} [options.fallbackToAll=false] - Revenir à tous les PNJ si aucune cible trouvée
|
||||||
|
* @param {boolean} [options.includeMeleeWeapon=false] - Inclure l'arme de mêlée équipée du PNJ (dégâts adverses)
|
||||||
* @returns {Array<{id:string, uuid:string, name:string, corps:number, weaponName?:string, weaponDegats?:string}>}
|
* @returns {Array<{id:string, uuid:string, name:string, corps:number, weaponName?:string, weaponDegats?:string}>}
|
||||||
*/
|
*/
|
||||||
_getCombatTargets({ onlyRanged = false, fallbackToAll = false } = {}) {
|
_getCombatTargets({ onlyRanged = false, fallbackToAll = false, includeMeleeWeapon = false } = {}) {
|
||||||
const getBestRangedWeapon = actor => {
|
const getEquippedWeapon = (actor, type) =>
|
||||||
const rangedWeapons = actor.itemTypes?.weapon?.filter(item => item.system.type === "distance") ?? []
|
actor.itemTypes?.weapon?.find(item => item.system.type === type && item.system.equipped) ?? null
|
||||||
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 => ({
|
const toEntry = actor => {
|
||||||
|
const entry = {
|
||||||
id: actor.id,
|
id: actor.id,
|
||||||
uuid: actor.uuid,
|
uuid: actor.uuid,
|
||||||
name: actor.name,
|
name: actor.name,
|
||||||
corps: actor.system.stats?.corps?.res ?? 0,
|
corps: actor.system.stats?.corps?.res ?? 0,
|
||||||
...(onlyRanged ? (() => {
|
}
|
||||||
const weapon = getBestRangedWeapon(actor)
|
if (onlyRanged) {
|
||||||
return weapon ? {
|
const weapon = getEquippedWeapon(actor, "distance")
|
||||||
weaponName: weapon.name,
|
if (weapon) {
|
||||||
weaponDegats: weapon.system.degats,
|
entry.weaponName = weapon.name
|
||||||
} : {}
|
entry.weaponDegats = weapon.system.degats
|
||||||
})() : {}),
|
}
|
||||||
})
|
} else if (includeMeleeWeapon) {
|
||||||
|
const weapon = getEquippedWeapon(actor, "melee")
|
||||||
|
entry.weaponDegats = weapon ? weapon.system.degats : "0"
|
||||||
|
}
|
||||||
|
return entry
|
||||||
|
}
|
||||||
|
|
||||||
const sceneTokens = canvas?.scene?.isView ? (canvas.tokens?.placeables ?? []) : []
|
const sceneTokens = canvas?.scene?.isView ? (canvas.tokens?.placeables ?? []) : []
|
||||||
const targets = [...new Map(sceneTokens
|
const targets = [...new Map(sceneTokens
|
||||||
.filter(t => t.actor?.type === "npc" && t.actor.id !== this.parent.id)
|
.filter(t => t.actor?.type === "npc" && t.actor.id !== this.parent.id)
|
||||||
.filter(t => !onlyRanged || getBestRangedWeapon(t.actor))
|
.filter(t => !onlyRanged || getEquippedWeapon(t.actor, "distance"))
|
||||||
.map(t => {
|
.map(t => {
|
||||||
const actor = t.actor
|
const actor = t.actor
|
||||||
return [actor.uuid, toEntry(actor)]
|
return [actor.uuid, toEntry(actor)]
|
||||||
@@ -353,13 +350,12 @@ export default class CelestopolCharacter extends foundry.abstract.TypeDataModel
|
|||||||
weaponType: item.system.type,
|
weaponType: item.system.type,
|
||||||
weaponName: item.name,
|
weaponName: item.name,
|
||||||
weaponDegats: item.system.degats,
|
weaponDegats: item.system.degats,
|
||||||
availableTargets: this._getCombatTargets(),
|
availableTargets: this._getCombatTargets({ includeMeleeWeapon: item.system.type === "melee" }),
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Lance une attaque de mêlée à mains nues.
|
* Lance une attaque à mains nues (Échauffourée sans arme).
|
||||||
* @returns {Promise<import("../documents/roll.mjs").CelestopolRoll|null>}
|
|
||||||
*/
|
*/
|
||||||
async rollUnarmedAttack() {
|
async rollUnarmedAttack() {
|
||||||
const { CelestopolRoll } = await import("../documents/roll.mjs")
|
const { CelestopolRoll } = await import("../documents/roll.mjs")
|
||||||
@@ -387,7 +383,7 @@ export default class CelestopolCharacter extends foundry.abstract.TypeDataModel
|
|||||||
weaponType: "melee",
|
weaponType: "melee",
|
||||||
weaponName: game.i18n.localize("CELESTOPOL.Combat.unarmedAttack"),
|
weaponName: game.i18n.localize("CELESTOPOL.Combat.unarmedAttack"),
|
||||||
weaponDegats: "0",
|
weaponDegats: "0",
|
||||||
availableTargets: this._getCombatTargets(),
|
availableTargets: this._getCombatTargets({ includeMeleeWeapon: true }),
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -426,7 +422,7 @@ export default class CelestopolCharacter extends foundry.abstract.TypeDataModel
|
|||||||
weaponType: "distance",
|
weaponType: "distance",
|
||||||
weaponName: item.name,
|
weaponName: item.name,
|
||||||
weaponDegats: "0",
|
weaponDegats: "0",
|
||||||
availableTargets: this._getCombatTargets(),
|
availableTargets: this._getCombatTargets({ onlyRanged: true, fallbackToAll: true }),
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -85,6 +85,7 @@ export class CelestopolWeapon extends foundry.abstract.TypeDataModel {
|
|||||||
choices: Object.keys(SYSTEM.WEAPON_DAMAGE_TYPES) }),
|
choices: Object.keys(SYSTEM.WEAPON_DAMAGE_TYPES) }),
|
||||||
portee: new fields.StringField({ required: true, nullable: false, initial: "contact",
|
portee: new fields.StringField({ required: true, nullable: false, initial: "contact",
|
||||||
choices: Object.keys(SYSTEM.WEAPON_RANGE_TYPES) }),
|
choices: Object.keys(SYSTEM.WEAPON_RANGE_TYPES) }),
|
||||||
|
equipped: new fields.BooleanField({ initial: false }),
|
||||||
description: new fields.HTMLField({ required: true, textSearch: true }),
|
description: new fields.HTMLField({ required: true, textSearch: true }),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
MANIFEST-000062
|
MANIFEST-000074
|
||||||
|
|||||||
@@ -1,8 +1,3 @@
|
|||||||
2026/04/13-13:11:31.249954 7f2a6b7fe6c0 Recovering log #60
|
2026/04/14-10:43:54.304360 7fddcbfff6c0 Recovering log #72
|
||||||
2026/04/13-13:11:31.302525 7f2a6b7fe6c0 Delete type=3 #58
|
2026/04/14-10:43:54.314599 7fddcbfff6c0 Delete type=3 #70
|
||||||
2026/04/13-13:11:31.302579 7f2a6b7fe6c0 Delete type=0 #60
|
2026/04/14-10:43:54.314647 7fddcbfff6c0 Delete type=0 #72
|
||||||
2026/04/13-14:20:41.118813 7f2a69ffb6c0 Level-0 table #65: started
|
|
||||||
2026/04/13-14:20:41.118847 7f2a69ffb6c0 Level-0 table #65: 0 bytes OK
|
|
||||||
2026/04/13-14:20:41.156390 7f2a69ffb6c0 Delete type=0 #63
|
|
||||||
2026/04/13-14:20:41.210923 7f2a69ffb6c0 Manual compaction at level-0 from '!journal!eNYstmPK0mMmVJYC' @ 72057594037927935 : 1 .. '!journal.pages!eNYstmPK0mMmVJYC.r9h1ggd3G9hiqYJX' @ 0 : 0; will stop at (end)
|
|
||||||
2026/04/13-14:20:41.272745 7f2a69ffb6c0 Manual compaction at level-1 from '!journal!eNYstmPK0mMmVJYC' @ 72057594037927935 : 1 .. '!journal.pages!eNYstmPK0mMmVJYC.r9h1ggd3G9hiqYJX' @ 0 : 0; will stop at (end)
|
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
2026/04/13-13:10:44.862648 7ff582bff6c0 Recovering log #56
|
2026/04/14-00:55:24.427256 7f68497ed6c0 Recovering log #68
|
||||||
2026/04/13-13:10:44.908015 7ff582bff6c0 Delete type=3 #54
|
2026/04/14-00:55:24.442232 7f68497ed6c0 Delete type=3 #66
|
||||||
2026/04/13-13:10:44.908061 7ff582bff6c0 Delete type=0 #56
|
2026/04/14-00:55:24.442302 7f68497ed6c0 Delete type=0 #68
|
||||||
2026/04/13-13:10:47.939764 7ff580bfb6c0 Level-0 table #61: started
|
2026/04/14-00:56:01.490011 7f6833fff6c0 Level-0 table #73: started
|
||||||
2026/04/13-13:10:47.939788 7ff580bfb6c0 Level-0 table #61: 0 bytes OK
|
2026/04/14-00:56:01.490050 7f6833fff6c0 Level-0 table #73: 0 bytes OK
|
||||||
2026/04/13-13:10:47.972855 7ff580bfb6c0 Delete type=0 #59
|
2026/04/14-00:56:01.496026 7f6833fff6c0 Delete type=0 #71
|
||||||
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/14-00:56:01.502797 7f6833fff6c0 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)
|
2026/04/14-00:56:01.513341 7f6833fff6c0 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/000128.log
Normal file
BIN
packs-system/anomalies/000128.log
Normal file
Binary file not shown.
@@ -1 +1 @@
|
|||||||
MANIFEST-000112
|
MANIFEST-000127
|
||||||
|
|||||||
@@ -1,15 +1,3 @@
|
|||||||
2026/04/13-13:11:31.130509 7f2a6bfff6c0 Recovering log #109
|
2026/04/14-10:43:54.279048 7fddd97be6c0 Recovering log #124
|
||||||
2026/04/13-13:11:31.189864 7f2a6bfff6c0 Delete type=3 #107
|
2026/04/14-10:43:54.288686 7fddd97be6c0 Delete type=3 #122
|
||||||
2026/04/13-13:11:31.189928 7f2a6bfff6c0 Delete type=0 #109
|
2026/04/14-10:43:54.288755 7fddd97be6c0 Delete type=0 #124
|
||||||
2026/04/13-14:20:41.156517 7f2a69ffb6c0 Level-0 table #115: started
|
|
||||||
2026/04/13-14:20:41.173655 7f2a69ffb6c0 Level-0 table #115: 3524 bytes OK
|
|
||||||
2026/04/13-14:20:41.210761 7f2a69ffb6c0 Delete type=0 #113
|
|
||||||
2026/04/13-14:20:41.210932 7f2a69ffb6c0 Manual compaction at level-0 from '!items!anomCommMorts001' @ 72057594037927935 : 1 .. '!items!null' @ 0 : 0; will stop at (end)
|
|
||||||
2026/04/13-14:20:41.210963 7f2a69ffb6c0 Manual compaction at level-1 from '!items!anomCommMorts001' @ 72057594037927935 : 1 .. '!items!null' @ 0 : 0; will stop at '!items!null' @ 97 : 1
|
|
||||||
2026/04/13-14:20:41.210970 7f2a69ffb6c0 Compacting 1@1 + 1@2 files
|
|
||||||
2026/04/13-14:20:41.229806 7f2a69ffb6c0 Generated table #116@1: 9 keys, 6617 bytes
|
|
||||||
2026/04/13-14:20:41.229844 7f2a69ffb6c0 Compacted 1@1 + 1@2 files => 6617 bytes
|
|
||||||
2026/04/13-14:20:41.272334 7f2a69ffb6c0 compacted to: files[ 0 0 1 0 0 0 0 ]
|
|
||||||
2026/04/13-14:20:41.272481 7f2a69ffb6c0 Delete type=2 #111
|
|
||||||
2026/04/13-14:20:41.272658 7f2a69ffb6c0 Delete type=2 #115
|
|
||||||
2026/04/13-14:20:41.365704 7f2a69ffb6c0 Manual compaction at level-1 from '!items!null' @ 97 : 1 .. '!items!null' @ 0 : 0; will stop at (end)
|
|
||||||
|
|||||||
@@ -1,15 +1,15 @@
|
|||||||
2026/04/13-13:10:44.750651 7ff581bfd6c0 Recovering log #104
|
2026/04/14-00:55:24.391968 7f6848fec6c0 Recovering log #119
|
||||||
2026/04/13-13:10:44.797855 7ff581bfd6c0 Delete type=3 #102
|
2026/04/14-00:55:24.406978 7f6848fec6c0 Delete type=3 #117
|
||||||
2026/04/13-13:10:44.797919 7ff581bfd6c0 Delete type=0 #104
|
2026/04/14-00:55:24.407044 7f6848fec6c0 Delete type=0 #119
|
||||||
2026/04/13-13:10:47.796281 7ff580bfb6c0 Level-0 table #110: started
|
2026/04/14-00:56:01.480723 7f6833fff6c0 Level-0 table #125: started
|
||||||
2026/04/13-13:10:47.824966 7ff580bfb6c0 Level-0 table #110: 3524 bytes OK
|
2026/04/14-00:56:01.483872 7f6833fff6c0 Level-0 table #125: 3524 bytes OK
|
||||||
2026/04/13-13:10:47.857042 7ff580bfb6c0 Delete type=0 #108
|
2026/04/14-00:56:01.489828 7f6833fff6c0 Delete type=0 #123
|
||||||
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/14-00:56:01.502786 7f6833fff6c0 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/14-00:56:01.502828 7f6833fff6c0 Manual compaction at level-1 from '!items!anomCommMorts001' @ 72057594037927935 : 1 .. '!items!null' @ 0 : 0; will stop at '!items!null' @ 105 : 1
|
||||||
2026/04/13-13:10:47.973063 7ff580bfb6c0 Compacting 1@1 + 1@2 files
|
2026/04/14-00:56:01.502835 7f6833fff6c0 Compacting 1@1 + 1@2 files
|
||||||
2026/04/13-13:10:47.995133 7ff580bfb6c0 Generated table #111@1: 9 keys, 6617 bytes
|
2026/04/14-00:56:01.506551 7f6833fff6c0 Generated table #126@1: 9 keys, 6617 bytes
|
||||||
2026/04/13-13:10:47.995159 7ff580bfb6c0 Compacted 1@1 + 1@2 files => 6617 bytes
|
2026/04/14-00:56:01.506586 7f6833fff6c0 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/14-00:56:01.512723 7f6833fff6c0 compacted to: files[ 0 0 1 0 0 0 0 ]
|
||||||
2026/04/13-13:10:48.030263 7ff580bfb6c0 Delete type=2 #106
|
2026/04/14-00:56:01.513072 7f6833fff6c0 Delete type=2 #121
|
||||||
2026/04/13-13:10:48.030388 7ff580bfb6c0 Delete type=2 #110
|
2026/04/14-00:56:01.513274 7f6833fff6c0 Delete type=2 #125
|
||||||
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)
|
2026/04/14-00:56:01.519560 7f6833fff6c0 Manual compaction at level-1 from '!items!null' @ 105 : 1 .. '!items!null' @ 0 : 0; will stop at (end)
|
||||||
|
|||||||
Binary file not shown.
BIN
packs-system/anomalies/MANIFEST-000127
Normal file
BIN
packs-system/anomalies/MANIFEST-000127
Normal file
Binary file not shown.
@@ -1 +1 @@
|
|||||||
MANIFEST-000023
|
MANIFEST-000035
|
||||||
|
|||||||
@@ -1,8 +1,3 @@
|
|||||||
2026/04/13-13:11:31.193586 7f2a6b7fe6c0 Recovering log #21
|
2026/04/14-10:43:54.291004 7fddd8fbd6c0 Recovering log #33
|
||||||
2026/04/13-13:11:31.247393 7f2a6b7fe6c0 Delete type=3 #19
|
2026/04/14-10:43:54.301929 7fddd8fbd6c0 Delete type=3 #31
|
||||||
2026/04/13-13:11:31.247448 7f2a6b7fe6c0 Delete type=0 #21
|
2026/04/14-10:43:54.301981 7fddd8fbd6c0 Delete type=0 #33
|
||||||
2026/04/13-14:20:41.081350 7f2a69ffb6c0 Level-0 table #26: started
|
|
||||||
2026/04/13-14:20:41.081377 7f2a69ffb6c0 Level-0 table #26: 0 bytes OK
|
|
||||||
2026/04/13-14:20:41.118613 7f2a69ffb6c0 Delete type=0 #24
|
|
||||||
2026/04/13-14:20:41.210913 7f2a69ffb6c0 Manual compaction at level-0 from '!actors!6RZ6IzJUHm4dB5Ut' @ 72057594037927935 : 1 .. '!folders!MbFQgPdF6Gtbj5AU' @ 0 : 0; will stop at (end)
|
|
||||||
2026/04/13-14:20:41.210940 7f2a69ffb6c0 Manual compaction at level-1 from '!actors!6RZ6IzJUHm4dB5Ut' @ 72057594037927935 : 1 .. '!folders!MbFQgPdF6Gtbj5AU' @ 0 : 0; will stop at (end)
|
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
2026/04/13-13:10:44.800502 7ff582bff6c0 Recovering log #16
|
2026/04/14-00:55:24.409141 7f68497ed6c0 Recovering log #29
|
||||||
2026/04/13-13:10:44.846821 7ff582bff6c0 Delete type=3 #14
|
2026/04/14-00:55:24.424702 7f68497ed6c0 Delete type=3 #27
|
||||||
2026/04/13-13:10:44.846886 7ff582bff6c0 Delete type=0 #16
|
2026/04/14-00:55:24.424755 7f68497ed6c0 Delete type=0 #29
|
||||||
2026/04/13-13:10:47.902261 7ff580bfb6c0 Level-0 table #22: started
|
2026/04/14-00:56:01.473754 7f6833fff6c0 Level-0 table #34: started
|
||||||
2026/04/13-13:10:47.902285 7ff580bfb6c0 Level-0 table #22: 0 bytes OK
|
2026/04/14-00:56:01.473797 7f6833fff6c0 Level-0 table #34: 0 bytes OK
|
||||||
2026/04/13-13:10:47.939594 7ff580bfb6c0 Delete type=0 #20
|
2026/04/14-00:56:01.480607 7f6833fff6c0 Delete type=0 #32
|
||||||
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/14-00:56:01.502772 7f6833fff6c0 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)
|
2026/04/14-00:56:01.502817 7f6833fff6c0 Manual compaction at level-1 from '!actors!6RZ6IzJUHm4dB5Ut' @ 72057594037927935 : 1 .. '!folders!MbFQgPdF6Gtbj5AU' @ 0 : 0; will stop at (end)
|
||||||
|
|||||||
Binary file not shown.
@@ -1 +1 @@
|
|||||||
MANIFEST-000062
|
MANIFEST-000074
|
||||||
|
|||||||
@@ -1,8 +1,3 @@
|
|||||||
2026/04/13-13:11:31.305113 7f2a6a7fc6c0 Recovering log #60
|
2026/04/14-10:43:54.317254 7fddd9fbf6c0 Recovering log #72
|
||||||
2026/04/13-13:11:31.358709 7f2a6a7fc6c0 Delete type=3 #58
|
2026/04/14-10:43:54.326872 7fddd9fbf6c0 Delete type=3 #70
|
||||||
2026/04/13-13:11:31.358775 7f2a6a7fc6c0 Delete type=0 #60
|
2026/04/14-10:43:54.326932 7fddd9fbf6c0 Delete type=0 #72
|
||||||
2026/04/13-14:20:41.045418 7f2a69ffb6c0 Level-0 table #65: started
|
|
||||||
2026/04/13-14:20:41.045487 7f2a69ffb6c0 Level-0 table #65: 0 bytes OK
|
|
||||||
2026/04/13-14:20:41.081154 7f2a69ffb6c0 Delete type=0 #63
|
|
||||||
2026/04/13-14:20:41.210899 7f2a69ffb6c0 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-14:20:41.210948 7f2a69ffb6c0 Manual compaction at level-1 from '!scenes!Jr7lGxYk2RETlXRv' @ 72057594037927935 : 1 .. '!scenes.tokens.delta.items!Jr7lGxYk2RETlXRv.6urwC5SVcou6UOAG.CTg4yBE12iMee1RU.BYT1CrA37R3Og0nu' @ 0 : 0; will stop at (end)
|
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
2026/04/13-13:10:44.916572 7ff5813fc6c0 Recovering log #55
|
2026/04/14-00:55:24.444791 7f684a7ef6c0 Recovering log #68
|
||||||
2026/04/13-13:10:44.960340 7ff5813fc6c0 Delete type=3 #53
|
2026/04/14-00:55:24.460229 7f684a7ef6c0 Delete type=3 #66
|
||||||
2026/04/13-13:10:44.960396 7ff5813fc6c0 Delete type=0 #55
|
2026/04/14-00:55:24.460280 7f684a7ef6c0 Delete type=0 #68
|
||||||
2026/04/13-13:10:47.857212 7ff580bfb6c0 Level-0 table #61: started
|
2026/04/14-00:56:01.496164 7f6833fff6c0 Level-0 table #73: started
|
||||||
2026/04/13-13:10:47.857237 7ff580bfb6c0 Level-0 table #61: 0 bytes OK
|
2026/04/14-00:56:01.496194 7f6833fff6c0 Level-0 table #73: 0 bytes OK
|
||||||
2026/04/13-13:10:47.902098 7ff580bfb6c0 Delete type=0 #59
|
2026/04/14-00:56:01.502678 7f6833fff6c0 Delete type=0 #71
|
||||||
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/14-00:56:01.502807 7f6833fff6c0 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)
|
2026/04/14-00:56:01.513358 7f6833fff6c0 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.
@@ -16,8 +16,8 @@
|
|||||||
</span>
|
</span>
|
||||||
{{/if}}
|
{{/if}}
|
||||||
<span class="skill-info">
|
<span class="skill-info">
|
||||||
{{#if statLabel}}<span class="stat-lbl">{{statLabel}}</span><span class="sep"> › </span>{{/if}}
|
{{#if statLabel}}<span class="stat-lbl">{{localize statLabel}}</span><span class="sep"> › </span>{{/if}}
|
||||||
<span class="skill-lbl">{{skillLabel}}</span>
|
<span class="skill-lbl">{{localize skillLabel}}</span>
|
||||||
</span>
|
</span>
|
||||||
{{#if woundLabel}}<span class="wound-info">⚠ {{woundLabel}}</span>{{/if}}
|
{{#if woundLabel}}<span class="wound-info">⚠ {{woundLabel}}</span>{{/if}}
|
||||||
</div>
|
</div>
|
||||||
@@ -162,7 +162,7 @@
|
|||||||
<span class="result-label">{{localize "CELESTOPOL.Roll.failure"}}</span>
|
<span class="result-label">{{localize "CELESTOPOL.Roll.failure"}}</span>
|
||||||
{{#if isCombat}}
|
{{#if isCombat}}
|
||||||
{{#if (eq weaponType "melee")}}
|
{{#if (eq weaponType "melee")}}
|
||||||
<span class="result-desc">{{localize "CELESTOPOL.Combat.failureHit"}}</span>
|
{{#unless isNpcAttack}}<span class="result-desc">{{localize "CELESTOPOL.Combat.failureHit"}}</span>{{/unless}}
|
||||||
{{else if isRangedDefense}}
|
{{else if isRangedDefense}}
|
||||||
<span class="result-desc">{{localize "CELESTOPOL.Combat.rangedDefenseFailure"}}</span>
|
<span class="result-desc">{{localize "CELESTOPOL.Combat.rangedDefenseFailure"}}</span>
|
||||||
{{else}}
|
{{else}}
|
||||||
|
|||||||
@@ -9,7 +9,7 @@
|
|||||||
{{/if}}
|
{{/if}}
|
||||||
</div>
|
</div>
|
||||||
{{#each weapons as |item|}}
|
{{#each weapons as |item|}}
|
||||||
<div class="item-row weapon" data-item-id="{{item.id}}" data-item-uuid="{{item.uuid}}" data-drag="true">
|
<div class="item-row weapon {{#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">
|
<img src="{{item.img}}" class="item-icon">
|
||||||
<span class="item-name">{{item.name}}</span>
|
<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 type">{{#if (eq item.system.type "melee")}}{{localize "CELESTOPOL.Weapon.typeMelee"}}{{else}}{{localize "CELESTOPOL.Weapon.typeDistance"}}{{/if}}</span>
|
||||||
@@ -18,6 +18,11 @@
|
|||||||
{{#unless ../isEditMode}}
|
{{#unless ../isEditMode}}
|
||||||
<a data-action="attack" data-item-id="{{item.id}}" title="{{localize 'CELESTOPOL.Combat.attack'}}"><i class="fas fa-khanda"></i></a>
|
<a data-action="attack" data-item-id="{{item.id}}" title="{{localize 'CELESTOPOL.Combat.attack'}}"><i class="fas fa-khanda"></i></a>
|
||||||
{{/unless}}
|
{{/unless}}
|
||||||
|
<a data-action="toggleWeapon" data-item-uuid="{{item.uuid}}"
|
||||||
|
title="{{#if item.system.equipped}}{{localize 'CELESTOPOL.Weapon.unequip'}}{{else}}{{localize 'CELESTOPOL.Weapon.equip'}}{{/if}}"
|
||||||
|
class="equip-toggle {{#if item.system.equipped}}equipped{{/if}}">
|
||||||
|
<i class="fas fa-khanda"></i>
|
||||||
|
</a>
|
||||||
<a data-action="edit" data-item-uuid="{{item.uuid}}"><i class="fas fa-edit"></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}}
|
{{#if ../isEditMode}}<a data-action="delete" data-item-uuid="{{item.uuid}}"><i class="fas fa-trash"></i></a>{{/if}}
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -220,9 +220,9 @@
|
|||||||
<div class="form-row-line form-visibility">
|
<div class="form-row-line form-visibility">
|
||||||
<label for="visibility">{{localize "CELESTOPOL.Roll.visibility"}}</label>
|
<label for="visibility">{{localize "CELESTOPOL.Roll.visibility"}}</label>
|
||||||
<select id="visibility" name="visibility">
|
<select id="visibility" name="visibility">
|
||||||
<option value="publicroll">{{localize "CELESTOPOL.Roll.visibilityPublic"}}</option>
|
<option value="public">{{localize "CELESTOPOL.Roll.visibilityPublic"}}</option>
|
||||||
<option value="gmroll">{{localize "CELESTOPOL.Roll.visibilityGM"}}</option>
|
<option value="gm">{{localize "CELESTOPOL.Roll.visibilityGM"}}</option>
|
||||||
<option value="selfroll">{{localize "CELESTOPOL.Roll.visibilitySelf"}}</option>
|
<option value="self">{{localize "CELESTOPOL.Roll.visibilitySelf"}}</option>
|
||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user