17 Commits

Author SHA1 Message Date
a2b712b78d Diverses corrections + ajouts armes en compendiums
All checks were successful
Release Creation / build (release) Successful in 1m53s
2026-02-26 13:30:53 +01:00
fc6bb7a4b1 CSS rework et autres améliorations
All checks were successful
Release Creation / build (release) Successful in 46s
2026-02-12 23:08:51 +01:00
f26130d208 CSS rework et autres améliorations 2026-02-12 23:05:22 +01:00
39da08d4cb CSS rework et autres améliorations 2026-02-12 23:04:37 +01:00
e639b6ae3e Fix rollData = 1
All checks were successful
Release Creation / build (release) Successful in 3m36s
2025-12-01 17:57:19 +01:00
8c247a8981 Echec automatique sur 1
All checks were successful
Release Creation / build (release) Successful in 49s
2025-11-21 21:36:27 +01:00
a09e1a1d95 Les compétences de base ne peuvent être supprimées
All checks were successful
Release Creation / build (release) Successful in 47s
2025-11-02 18:30:20 +01:00
787f88873a Les compétences de base ne peuvent être supprimées 2025-11-02 18:29:46 +01:00
ac481e0dd9 Various minot fixes
All checks were successful
Release Creation / build (release) Successful in 1m18s
2025-10-30 20:24:24 +00:00
375622d900 Add welcome message 2025-10-17 15:31:32 +02:00
3bc055cc1f Add welcome message 2025-10-17 15:28:15 +02:00
c97b7a4889 Correction sur blessures et actions restantes
All checks were successful
Release Creation / build (release) Successful in 53s
2025-10-16 22:59:32 +02:00
5d13500838 Fix sur combat + mains gauche
All checks were successful
Release Creation / build (release) Successful in 43s
2025-09-24 16:43:52 +02:00
d21515e1e3 Fix sur combat + mains gauche 2025-09-24 16:43:40 +02:00
78ef009465 Fix sur combat + mains gauche 2025-09-24 16:42:08 +02:00
e794611bf3 Gestion assistée pour les actions
All checks were successful
Release Creation / build (release) Successful in 46s
2025-09-24 15:11:58 +02:00
529a62045e Gestion assistée pour les actions 2025-09-24 15:09:00 +02:00
90 changed files with 4076 additions and 2607 deletions

54
.gitignore vendored Normal file
View File

@@ -0,0 +1,54 @@
# Dependencies
node_modules/
package-lock.json
# Build outputs
styles/tedeum.css
styles/*.css.map
# IDE & Editor files
.vscode/
.idea/
*.swp
*.swo
*~
.DS_Store
# System files
Thumbs.db
desktop.ini
# Logs
npm-debug.log*
yarn-debug.log*
yarn-error.log*
*.log
# Temporary files
*.tmp
*.temp
.cache/
# Environment variables
.env
.env.local
# Optional: Uncomment if you want to ignore pack database files
# These are usually committed for systems, but can be regenerated
# packs/**/*.ldb
# packs/**/LOG
# packs/**/LOG.old
# packs/**/MANIFEST-*
# packs/**/CURRENT
# Compiled source
dist/
build/
# OS generated files
.DS_Store
.DS_Store?
._*
.Spotlight-V100
.Trashes
ehthumbs.db

View File

@@ -1,25 +1,17 @@
var gulp = require('gulp'); var gulp = require('gulp');
var less = require('gulp-less');
var postcss = require('gulp-postcss'); var postcss = require('gulp-postcss');
var autoprefixer = require('autoprefixer'); var autoprefixer = require('autoprefixer');
var cssnext = require('postcss-preset-env');
var precss = require('precss');
gulp.task('css', function () { gulp.task('css', function () {
return gulp.src('./less/*.less')
var processors = [ .pipe(less())
autoprefixer, .pipe(postcss([autoprefixer]))
cssnext,
precss
];
return gulp.src('./postcss/*.css')
.pipe(postcss(processors))
.pipe(gulp.dest('./styles')); .pipe(gulp.dest('./styles'));
}); });
gulp.task('watch', function () {
gulp.watch('./less/*.less', gulp.series('css'));
});
function watchUpdates() { gulp.task('default', gulp.series('css'));
gulp.watch('./postcss/*.css', css);
}

2070
less/tedeum.less Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -77,6 +77,31 @@ export class TeDeumActor extends Actor {
return 0 return 0
} }
/* -------------------------------------------- */
getMeilleureCompetenceMainGauche(comp) {
let compScore = this.getCompetenceScore(comp.name)
let mainGaucheScore = this.getCompetenceScore("main gauche")
if (mainGaucheScore < compScore) {
ui.notifications.info(`${this.name} : Utilisation de la compétence Main Gauche au lieu de ${comp.name}`)
let mainGaucheComp = this.items.find(item => item.type == "competence" && item.name.toLowerCase() == "main gauche")
if (!mainGaucheComp) {
// Create a fake competence object
mainGaucheComp = foundry.utils.duplicate(comp)
mainGaucheComp.name = "Main Gauche"
mainGaucheComp.system.isBase = false
mainGaucheComp.system.score = 0
mainGaucheComp.system.caracteristique = "adresse"
mainGaucheComp.system.description = "Compétence Main Gauche (automatique)"
mainGaucheComp.system.isMainGauche = true
return mainGaucheComp
} else {
return mainGaucheComp
}
} else {
return comp
}
}
/* -------------------------------------------- */ /* -------------------------------------------- */
_onUpdate(changed, options, userId) { _onUpdate(changed, options, userId) {
let updates = [] let updates = []
@@ -116,12 +141,6 @@ export class TeDeumActor extends Actor {
updates.push({ _id: initiative.id, "system.score": Number(newScore) }) updates.push({ _id: initiative.id, "system.score": Number(newScore) })
} }
let actionsTour = this.items.find(item => item.type == "competence" && item.name.toLowerCase() == "actions/tour")
newScore = this.getCommonBaseValue(this.system.caracteristiques.adresse.value)
if (actionsTour && actionsTour?.system.score != newScore) {
updates.push({ _id: actionsTour.id, "system.score": Number(newScore) })
}
let effort = this.items.find(item => item.type == "competence" && item.name.toLowerCase() == "effort") let effort = this.items.find(item => item.type == "competence" && item.name.toLowerCase() == "effort")
newScore = this.getCommonBaseValue(this.system.caracteristiques.puissance.value) newScore = this.getCommonBaseValue(this.system.caracteristiques.puissance.value)
if (effort && effort?.system.score != newScore) { if (effort && effort?.system.score != newScore) {
@@ -151,7 +170,7 @@ export class TeDeumActor extends Actor {
getCommonBaseValue(value) { getCommonBaseValue(value) {
return game.system.tedeum.config.COMMON_VALUE[value]?.value || 0 return game.system.tedeum.config.COMMON_VALUE[value]?.value || 0
} }
getInitiative() { getInitiativeValue() {
return game.system.tedeum.config.COMMON_VALUE[this.system.caracteristiques.adresse.value]?.value || 0 return game.system.tedeum.config.COMMON_VALUE[this.system.caracteristiques.adresse.value]?.value || 0
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
@@ -616,21 +635,16 @@ export class TeDeumActor extends Actor {
/* -------------------------------------------- */ /* -------------------------------------------- */
getInitiativeScore() { getInitiativeScore() {
let initiative = this.items.find(it => it.type == "competence" && it.name.toLowerCase() == "initiative") let initiative = this.getInitiativeValue()
initiative = foundry.utils.duplicate(initiative)
// Vérifie les armes avec bonus d'initiative // Vérifie les armes avec bonus d'initiative
let armes = this.getArmes() let armes = this.getArmes()
for (let arme of armes) { for (let arme of armes) {
if (arme.system.equipe && arme.system.bonusInitiative != 0) { if (arme.system.equipe && Number(arme.system.initiativeBonus) && Number(arme.system.initiativeBonus) != 0) {
ui.notifications.info("L'arme " + arme.name + " vous confère un bonus d'initiative de " + arme.system.bonusInitiative) ui.notifications.info("L'arme " + arme.name + " vous confère un bonus d'initiative de " + arme.system.initiativeBonus)
initiative.system.score += 1 initiative += arme.system.initiativeBonus
} }
} }
if (initiative) { return initiative
return initiative.system.score
}
ui.notifications.warn("Impossible de trouver la compétence Initiative pour l'acteur " + this.name)
return -1;
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
@@ -699,7 +713,7 @@ export class TeDeumActor extends Actor {
async rollDegatsArme(armeId) { async rollDegatsArme(armeId) {
let weapon = this.items.get(armeId) let weapon = this.items.get(armeId)
if (weapon) { if (weapon) {
let bDegats = 0 let bDegats = { value: 0 }
if (weapon.system.typeArme == "melee") { if (weapon.system.typeArme == "melee") {
bDegats = this.getBonusDegats() bDegats = this.getBonusDegats()
} }
@@ -714,7 +728,7 @@ export class TeDeumActor extends Actor {
rollData.degats = degatsRoll.total rollData.degats = degatsRoll.total
let msg = await TeDeumUtility.createChatWithRollMode(rollData.alias, { let msg = await TeDeumUtility.createChatWithRollMode(rollData.alias, {
content: await renderTemplate(`systems/fvtt-te-deum/templates/chat/chat-degats-result.hbs`, rollData) content: await foundry.applications.handlebars.renderTemplate(`systems/fvtt-te-deum/templates/chat/chat-degats-result.hbs`, rollData)
}) })
await msg.setFlag("world", "te-deum-rolldata", rollData) await msg.setFlag("world", "te-deum-rolldata", rollData)
console.log("Rolldata result", rollData) console.log("Rolldata result", rollData)

View File

@@ -4,18 +4,42 @@ import { TeDeumUtility } from "../common/tedeum-utility.js";
export class TeDeumCombat extends Combat { export class TeDeumCombat extends Combat {
/* -------------------------------------------- */ /* -------------------------------------------- */
async rollInitiative(ids, formula = undefined, messageOptions = {} ) { async rollInitiative(ids, formula = undefined, messageOptions = {}) {
//console.log("Roll INIT !") //console.log("Roll INIT !")
ids = typeof ids === "string" ? [ids] : ids; ids = typeof ids === "string" ? [ids] : ids;
for (let cId of ids) { for (let cId of ids) {
const c = this.combatants.get(cId); const c = this.combatants.get(cId);
let initBonus = c.actor ? c.actor.getInitiativeScore( this.id, cId ) : -1; let initBonus = c.actor ? c.actor.getInitiativeScore(this.id, cId) : -1;
await this.updateEmbeddedDocuments("Combatant", [ { _id: cId, initiative: initBonus } ]); console.log("Init Bonus : ", c.name, initBonus)
await this.updateEmbeddedDocuments("Combatant", [{ _id: cId, initiative: initBonus }]);
} }
return this; return this;
} }
/* -------------------------------------------- */
async modifyAction(combatantId, delta, isMainGauche = false) {
let combatant = this.combatants.get(combatantId)
if (!combatant) return;
let ca = combatant.getFlag("world", "available-actions")
if (!ca) {
ca = { nbActions: 1, nbActionsMainGauche: 0 }
}
if (isMainGauche) {
ca.nbActionsMainGauche += delta
} else {
ca.nbActions += delta
}
if (ca.nbActionsMainGauche < 0) ca.nbActionsMainGauche = 0
if (ca.nbActions < 0) ca.nbActions = 0
console.log("Modify Action : ", combatant.name, ca)
if (game.user.isGM) {
await TeDeumUtility.updateCombatantActions(combatant, ca)
} else {
game.socket.emit("system.fvtt-te-deum", { msg: "msg_modify_combat_action", data: { combatantId: combatantId, ca: ca } })
}
}
/* -------------------------------------------- */ /* -------------------------------------------- */
static async checkTurnPosition() { static async checkTurnPosition() {
while (game.combat.turn > 0) { while (game.combat.turn > 0) {

View File

@@ -59,11 +59,11 @@ export const TEDEUM_CONFIG = {
}, },
ARME_PORTEES: { ARME_PORTEES: {
"brulepourpoint": { label: "Brûle-pourpoint", difficulty: "facile", id: "brulepourpoint" }, "brulepourpoint": { label: "Brûle-pourpoint (5)", difficulty: "facile", id: "brulepourpoint" },
"courte": { label: "Courte", difficulty: "pardefaut", id: "courte" }, "courte": { label: "Courte (7)", difficulty: "pardefaut", id: "courte" },
"moyenne": { label: "Moyenne", difficulty: "difficile", id: "moyenne" }, "moyenne": { label: "Moyenne (11)", difficulty: "difficile", id: "moyenne" },
"longue": { label: "Longue", difficulty: "perilleux", id: "longue" }, "longue": { label: "Longue (13)", difficulty: "perilleux", id: "longue" },
"extreme": { label: "Extrême", difficulty: "desespere", id: "extreme" }, "extreme": { label: "Extrême (15)", difficulty: "desespere", id: "extreme" },
}, },
genre: { genre: {
@@ -168,13 +168,13 @@ export const TEDEUM_CONFIG = {
}, },
difficulte: { difficulte: {
aucune: { label: "Aucune", key: "aucune", value: 0 }, aucune: { label: "Aucune", key: "aucune", value: 0 },
routine: { label: "Routine", key: "routine", value: 3 }, routine: { label: "Routine (3)", key: "routine", value: 3 },
facile: { label: "Facile", key: "facile", value: 5 }, facile: { label: "Facile (5)", key: "facile", value: 5 },
pardefaut: { label: "Par Défaut", key: "pardefaut", value: 7 }, pardefaut: { label: "Par Défaut (7)", key: "pardefaut", value: 7 },
malaise: { label: "Malaisé", key: "malaise", value: 9 }, malaise: { label: "Malaisé (9)", key: "malaise", value: 9 },
difficile: { label: "Difficile", key: "difficile", value: 11 }, difficile: { label: "Difficile (11)", key: "difficile", value: 11 },
perilleux: { label: "Perilleux", key: "perilleux", value: 13 }, perilleux: { label: "Perilleux (13)", key: "perilleux", value: 13 },
desespere: { label: "Désespéré", key: "desespere", value: 15 } desespere: { label: "Désespéré (15)", key: "desespere", value: 15 }
}, },
monnaie: { monnaie: {
denier: { label: "Deniers", id: "denier", value: 1 }, denier: { label: "Deniers", id: "denier", value: 1 },

View File

@@ -1,6 +1,8 @@
/* -------------------------------------------- */ /* -------------------------------------------- */
/* -------------------------------------------- */ /* -------------------------------------------- */
const ECRYME_WELCOME_MESSAGE_URL = "https://www.uberwald.me/gitea/public/fvtt-te-deum/raw/branch/main/welcome-message-tedeum.html"
export class TeDeumUtility { export class TeDeumUtility {
/* -------------------------------------------- */ /* -------------------------------------------- */
@@ -12,8 +14,13 @@ export class TeDeumUtility {
CONFIG.JournalEntry.compendiumBanner = "systems/fvtt-te-deum/images/ui/compendium_banner.webp" CONFIG.JournalEntry.compendiumBanner = "systems/fvtt-te-deum/images/ui/compendium_banner.webp"
CONFIG.Macro.compendiumBanner = "systems/fvtt-te-deum/images/ui/compendium_banner.webp" CONFIG.Macro.compendiumBanner = "systems/fvtt-te-deum/images/ui/compendium_banner.webp"
CONFIG.Adventure.compendiumBanner = "systems/fvtt-te-deum/images/ui/compendium_banner.webp" CONFIG.Adventure.compendiumBanner = "systems/fvtt-te-deum/images/ui/compendium_banner.webp"
}
Hooks.on('renderChatLog', (log, html, data) => TeDeumUtility.chatListeners(html)); static installHooks() {
Hooks.on('renderChatMessageHTML', (message, html) => {
TeDeumUtility.chatListeners(html);
TeDeumUtility.onRenderChatMessage(message, html);
});
Hooks.on("renderActorDirectory", (app, html, data) => { Hooks.on("renderActorDirectory", (app, html, data) => {
if (game.user.can('ACTOR_CREATE')) { if (game.user.can('ACTOR_CREATE')) {
@@ -28,7 +35,47 @@ export class TeDeumUtility {
$(html).find('.header-actions').after(button) $(html).find('.header-actions').after(button)
} }
}) })
//Hooks.on("getChatLogEntryContext", (html, options) => TeDeumUtility.chatMenuManager(html, options));
Hooks.on("combatStart", async (combat, updateData, options) => {
this.resetCombatActions(combat)
});
Hooks.on("combatRound", (combat, updateData, updateOptions) => {
// List all actors related to combatant
if (game.user.isGM) {
this.resetCombatActions(combat)
}
})
Hooks.on("getCombatTrackerContextOptions", (html, options) => {
console.log("Get Combat Tracker Context", html, options)
this.pushCombatOptions(html, options);
});
}
/* -------------------------------------------- */
static pushCombatOptions(html, options) {
options.push({ name: "Actions +1", condition: true, icon: '<i class="fas fa-plus"></i>', callback: target => { game.combat.modifyAction($(target).data('combatant-id'), 1); } })
options.push({ name: "Actions -1", condition: true, icon: '<i class="fas fa-minus"></i>', callback: target => { game.combat.modifyAction($(target).data('combatant-id'), -1); } })
options.push({ name: "Actions MG +1", condition: true, icon: '<i class="fas fa-plus"></i>', callback: target => { game.combat.modifyAction($(target).data('combatant-id'), 1, true); } })
options.push({ name: "Actions MG -1", condition: true, icon: '<i class="fas fa-minus"></i>', callback: target => { game.combat.modifyAction($(target).data('combatant-id'), -1, true); } })
}
/* -------------------------------------------- */
static async resetCombatActions(combat) {
if (game.user.isGM) {
for (let c of combat.combatants) {
let actor = game.actors.get(c.actorId)
if (actor) {
let nbActions = actor.getNbActions()?.value || 0
let isMainGauche = (actor.getCompetenceScore("Main gauche") > 0)
let nbActionsMainGauche = isMainGauche ? nbActions : 0
await c.setFlag("world", "available-actions", { nbActions, nbActionsMainGauche })
await c.update({ name: `${c.token.name} (${nbActions} / ${nbActionsMainGauche})` })
}
}
}
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
@@ -127,14 +174,24 @@ export class TeDeumUtility {
/* -------------------------------------------- */ /* -------------------------------------------- */
static welcomeMessage() { static welcomeMessage() {
if (game.user.isGM) { if (game.user.isGM) {
// Try to fetch the welcome message from the github repo "welcome-message-ecryme.html"
fetch(ECRYME_WELCOME_MESSAGE_URL)
.then(response => response.text())
.then(html => {
ChatMessage.create({ ChatMessage.create({
user: game.user.id, user: game.user.id,
whisper: [game.user.id], whisper: [game.user.id],
content: `<div id="chat-welcome welcome-message-tedeum"><span class="rdd-roll-part"> content: html
<strong>Bienvenu dans Te Deum Pour Un Massacre !</strong> });
<div class="chat-welcome">Ce système vous est proposé par Open Sesame Games.<br> })
Vous trouverez de l'aide dans @UUID[Compendium.fvtt-te-deum.aides.JournalEntry.uNwJgi4kXBCiZmAH]{Aide pour Te Deum}<br> .catch(error => {
ainsi que sur le Discord de Foundry FR : https://discord.gg/pPSDNJk</div>` }); console.error("Error fetching welcome message:", error);
ChatMessage.create({
user: game.user.id,
whisper: [game.user.id],
content: "<b>Bienvenue dans Ecryme RPG !</b><br>Visitez le site officiel pour plus d'informations."
});
});
} }
} }
@@ -201,7 +258,7 @@ export class TeDeumUtility {
return actor return actor
} }
/* -------------------------------------------- */ /* -------------------------------------------- */ /* -------------------------------------------- */
static async manageOpposition(rollData) { static async manageOpposition(rollData) {
if (!this.currentOpposition) { if (!this.currentOpposition) {
// Store rollData as current GM opposition // Store rollData as current GM opposition
@@ -210,12 +267,15 @@ export class TeDeumUtility {
} else { } else {
// Perform the opposition // Perform the opposition
let isAttackWinner = true let isAttackWinner = true
let rWinner = this.currentOpposition let rWinner, rLooser
let rLooser = rollData if (this.currentOpposition.total <= rollData.total) {
if (rWinner.total <= rLooser.total) { rWinner = foundry.utils.duplicate(rollData)
rWinner = rollData rLooser = foundry.utils.duplicate(this.currentOpposition)
rLooser = this.currentOpposition
isAttackWinner = false isAttackWinner = false
} else {
rWinner = foundry.utils.duplicate(this.currentOpposition)
rLooser = foundry.utils.duplicate(rollData)
isAttackWinner = true
} }
this.currentOpposition = undefined // Reset opposition this.currentOpposition = undefined // Reset opposition
let oppositionData = { let oppositionData = {
@@ -247,18 +307,30 @@ export class TeDeumUtility {
await this.appliquerDegats(rWinner) await this.appliquerDegats(rWinner)
} }
console.log("Opposition result", rollData, isAttackWinner, oppositionData) console.log("Opposition result", rollData, isAttackWinner, oppositionData)
} }
} }
/* -------------------------------------------- */ /* -------------------------------------------- */ /* -------------------------------------------- */
static getTokenActorFromId(tokenId) {
for (let scene of game.scenes) {
const tokenDoc = scene.tokens.get(tokenId)
if (tokenDoc) return tokenDoc.actor
}
return null
}
/* -------------------------------------------- */
static async appliquerDegats(rollData) { static async appliquerDegats(rollData) {
await this.processAttaqueMelee(rollData) await this.processAttaqueMelee(rollData)
let defenderToken = canvas.tokens.placeables.find(t => t.id == rollData.defenderTokenId) let defenderActor = this.getTokenActorFromId(rollData.defenderTokenId)
if (defenderToken) { if (defenderActor) {
let actor = defenderToken.actor if (game.user.isGM || defenderActor.isOwner) {
await actor.appliquerDegats(rollData) await defenderActor.appliquerDegats(rollData)
} else {
// Send a socket message — seul le premier MJ actif le traitera
game.socket.emit("system.fvtt-te-deum", { name: "msg_apply_damage", data: { rollData } });
}
// Attaque naturelle avec dégats inférieur à -2 // Attaque naturelle avec dégats inférieur à -2
if ((rollData?.arme?.system.specificites?.poing?.hasSpec || rollData?.arme?.system.specificites?.pied?.hasSpec) && rollData.degats < -2) { if ((rollData?.arme?.system.specificites?.poing?.hasSpec || rollData?.arme?.system.specificites?.pied?.hasSpec) && rollData.degats < -2) {
let attacker = this.getActorFromRollData(rollData) let attacker = this.getActorFromRollData(rollData)
@@ -289,19 +361,27 @@ export class TeDeumUtility {
TeDeumUtility.appliquerDegats(rollData, messageId) TeDeumUtility.appliquerDegats(rollData, messageId)
} }
}) })
$(html).on("click", '.chat-command-gain-xp', event => { $(html).on("click", '.chat-command-gain-xp', async event => {
let messageId = TeDeumUtility.findChatMessageId(event.currentTarget) let messageId = TeDeumUtility.findChatMessageId(event.currentTarget)
let message = game.messages.get(messageId) let message = game.messages.get(messageId)
let rollData = message.getFlag("world", "te-deum-rolldata") let rollData = message.getFlag("world", "te-deum-rolldata")
if (rollData) { if (rollData) {
let actor = TeDeumUtility.getActorFromRollData(rollData) let actor = TeDeumUtility.getActorFromRollData(rollData)
actor.modifyXP(rollData.carac.key, 1) actor.modifyXP(rollData.carac.key, 1)
// Hide this button event.currentTarget.style.display = 'none'; // feedback immédiat local
event.currentTarget.style.display = 'none'; await message.setFlag("world", "te-deum-xp-used", true) // sync tous les clients
} }
}) })
} }
/* -------------------------------------------- */
static onRenderChatMessage(message, html) {
if (message.getFlag("world", "te-deum-xp-used")) {
const btn = html.querySelector('.chat-command-gain-xp');
if (btn) btn.style.display = 'none';
}
}
/* -------------------------------------------- */ /* -------------------------------------------- */
static async preloadHandlebarsTemplates() { static async preloadHandlebarsTemplates() {
@@ -394,6 +474,28 @@ export class TeDeumUtility {
chatMsg.setFlag("world", "tedeum-rolldata", rollData) chatMsg.setFlag("world", "tedeum-rolldata", rollData)
} }
} }
if (msg.name == "msg_modify_combat_action") {
if (game.user.isGM) {
let { combatantId, ca } = msg.data
let combatant = game.combat.combatants.get(combatantId)
if (combatant) {
console.log("sock - Modify Combat Action : ", combatant.name, ca)
await TeDeumUtility.updateCombatantActions(combatant, ca)
}
}
}
if (msg.name == "msg_apply_damage") {
const firstGM = game.users.find(u => u.isGM && u.active)
if (game.user === firstGM) {
let rollData = msg.data.rollData
let defenderActor = TeDeumUtility.getTokenActorFromId(rollData.defenderTokenId)
if (defenderActor) {
await defenderActor.appliquerDegats(rollData)
} else {
ui.notifications.error("Impossible de trouver la cible de l'attaque, aucun degats appliqué")
}
}
}
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
@@ -479,9 +581,11 @@ export class TeDeumUtility {
} }
if (rollData.diceSum == 1) { if (rollData.diceSum == 1) {
let critiqueRoll = await new Roll(rollData.carac.negativeDice) let critiqueRoll = await new Roll(rollData.carac.negativeDice)
rollData.isSuccess = false
await critiqueRoll.evaluate() await critiqueRoll.evaluate()
await this.showDiceSoNice(critiqueRoll, game.settings.get("core", "rollMode")) await this.showDiceSoNice(critiqueRoll, game.settings.get("core", "rollMode"))
rollData.critiqueRoll = foundry.utils.duplicate(critiqueRoll) rollData.critiqueRoll = foundry.utils.duplicate(critiqueRoll)
rollData.critiqueTotal = critiqueRoll.total
if (critiqueRoll.total > rollData.competence.system.score) { if (critiqueRoll.total > rollData.competence.system.score) {
rollData.isEchecCritique = true rollData.isEchecCritique = true
} }
@@ -570,12 +674,51 @@ export class TeDeumUtility {
await this.getLocalisation(rollData) await this.getLocalisation(rollData)
// Now the degats // Now the degats
let degatsRoll = await new Roll(rollData.arme.system.degats).roll() let degatsRoll = await new Roll(rollData.arme.system.degats).roll()
await this.showDiceSoNice(rollData.degatsRoll, game.settings.get("core", "rollMode")) await this.showDiceSoNice(degatsRoll, game.settings.get("core", "rollMode"))
rollData.degatsRoll = foundry.utils.duplicate(degatsRoll) rollData.degatsRoll = foundry.utils.duplicate(degatsRoll)
rollData.degats = degatsRoll.total rollData.degats = degatsRoll.total
} }
} }
/* -------------------------------------------- */
static async updateCombatantActions(combatant, ca) {
await combatant.setFlag("world", "available-actions", ca)
await combatant.update({ name: `${combatant.token.name} (${ca.nbActions} / ${ca.nbActionsMainGauche})` })
}
/* -------------------------------------------- */
static async manageCombatActions(actor, rollData) {
let combat = game.combats.active
if (!combat) return;
let combatant = combat.getCombatantByActor(actor)
if (!combatant) return;
let ca = combatant.getFlag("world", "available-actions")
if (!ca) return;
if (rollData.mode == "arme" && rollData.isMainGauche) {
if (ca.nbActionsMainGauche > 0) {
ca.nbActionsMainGauche -= 1
ca.nbActions = Math.max(ca.nbActions - 1, 0)
} else {
ui.notifications.error(`${actor.name} n'a plus d'actions disponibles à la main gauche pour ce round`)
}
}
if (ca.nbActions > 0) {
ca.nbActions -= 1
} else {
ui.notifications.error(`${actor.name} n'a plus d'actions disponibles pour ce round`)
}
console.log("Manage combat actions 1", actor.name, combatant)
if (game.user.isGM) {
await this.updateCombatantActions(combatant, ca)
} else {
// Send a socket message
game.socket.emit("system.fvtt-te-deum", { name: "msg_modify_combat_action", data: { combatantId: combatant.id, ca } });
}
rollData.hasActions = true
rollData.remainingActions = ca.nbActions
rollData.remainingActionsMainGauche = ca.nbActionsMainGauche
}
/* -------------------------------------------- */ /* -------------------------------------------- */
static async rollTeDeum(rollData) { static async rollTeDeum(rollData) {
@@ -585,8 +728,12 @@ export class TeDeumUtility {
rollData.difficulty = "pardefaut" rollData.difficulty = "pardefaut"
} }
rollData.difficulty = game.system.tedeum.config.difficulte[rollData.difficulty].value rollData.difficulty = game.system.tedeum.config.difficulte[rollData.difficulty].value
// Compute the real competence score // Compute the real competence score
if (rollData.competence) { if (rollData.competence) {
if (rollData.isMainGauche) {
rollData.competence = actor.getMeilleureCompetenceMainGauche(rollData.competence)
}
if (rollData.competence.system.isBase) { if (rollData.competence.system.isBase) {
rollData.compScore = actor.system.caracteristiques[rollData.competence.system.caracteristique].value rollData.compScore = actor.system.caracteristiques[rollData.competence.system.caracteristique].value
} else { } else {
@@ -609,6 +756,8 @@ export class TeDeumUtility {
await this.processAttaqueDistance(rollData) await this.processAttaqueDistance(rollData)
await this.manageCombatActions(actor, rollData)
let msg = await this.createChatWithRollMode(rollData.alias, { let msg = await this.createChatWithRollMode(rollData.alias, {
content: await foundry.applications.handlebars.renderTemplate(`systems/fvtt-te-deum/templates/chat/chat-generic-result.hbs`, rollData) content: await foundry.applications.handlebars.renderTemplate(`systems/fvtt-te-deum/templates/chat/chat-generic-result.hbs`, rollData)
}) })

View File

@@ -5,13 +5,13 @@ export class TeDeumArmeSchema extends foundry.abstract.TypeDataModel {
const requiredDouble = { required: true, nullable: false, integer: false }; const requiredDouble = { required: true, nullable: false, integer: false };
const schema = {}; const schema = {};
schema.typeArme = new fields.StringField({required: true, choices: ["melee", "tir"], initial: "melee"}); schema.typeArme = new fields.StringField({ required: true, choices: ["melee", "tir"], initial: "melee" });
schema.allonge = new fields.StringField({required: true, choices: ["courte", "moyenne", "longue", "treslongue"], initial: "courte"}); schema.allonge = new fields.StringField({ required: true, choices: ["courte", "moyenne", "longue", "treslongue"], initial: "courte" });
schema.specificites = new fields.SchemaField( schema.specificites = new fields.SchemaField(
Object.values((game.system.tedeum.config.ARME_SPECIFICITE)).reduce((obj, spec) => { Object.values((game.system.tedeum.config.ARME_SPECIFICITE)).reduce((obj, spec) => {
obj[spec.id] = new fields.SchemaField({ obj[spec.id] = new fields.SchemaField({
hasSpec: new fields.BooleanField({initial: false}), hasSpec: new fields.BooleanField({ initial: false }),
}); });
return obj; return obj;
}, {}) }, {})
@@ -26,18 +26,18 @@ export class TeDeumArmeSchema extends foundry.abstract.TypeDataModel {
}, {}) }, {})
); );
schema.degatsArmure = new fields.SchemaField( { schema.degatsArmure = new fields.SchemaField({
sansarmure : new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 }), sansarmure: new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 }),
cuir : new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 }), cuir: new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 }),
plates : new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 }), plates: new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 }),
mailles : new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 }), mailles: new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 }),
}); });
schema.tempsRecharge = new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 }); schema.tempsRecharge = new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 });
schema.competenceRecharge = new fields.StringField({ required: false, choices:["aucune", "archerie", "arquebusade"], initial: "aucune", blank: true }); schema.competenceRecharge = new fields.StringField({ required: false, choices: ["aucune", "archerie", "arquebusade"], initial: "aucune", blank: true });
schema.valeurEchecCritique = new fields.NumberField({ ...requiredInteger, initial: 1, min: 1 }); schema.valeurEchecCritique = new fields.NumberField({ ...requiredInteger, initial: 1, min: 1 });
schema.initiativeBonus = new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 }); schema.initiativeBonus = new fields.NumberField({ ...requiredInteger, initial: 0 });
schema.degats = new fields.StringField({ required: false, blank: true, initial: "0" }); schema.degats = new fields.StringField({ required: false, blank: true, initial: "0" });
schema.degatscrosse = new fields.StringField({ required: false, blank: true, initial: "0" }); schema.degatscrosse = new fields.StringField({ required: false, blank: true, initial: "0" });
@@ -46,13 +46,13 @@ export class TeDeumArmeSchema extends foundry.abstract.TypeDataModel {
for (let key of Object.keys(game.system.tedeum.config.armeCompetences)) { for (let key of Object.keys(game.system.tedeum.config.armeCompetences)) {
comp.push(key); comp.push(key);
} }
schema.competence = new fields.StringField({ required: true, choices:comp, initial: "bagarre" }); schema.competence = new fields.StringField({ required: true, choices: comp, initial: "bagarre" });
schema.competence2 = new fields.StringField({ required: false, choices:comp, initial: "", blank: true }); schema.competence2 = new fields.StringField({ required: false, choices: comp, initial: "", blank: true });
schema.prix = new fields.NumberField({ ...requiredDouble, initial: 0, min: 0 }); schema.prix = new fields.NumberField({ ...requiredDouble, initial: 0, min: 0 });
schema.monnaie = new fields.StringField({ required: true, blank: false, initial: "denier" }); schema.monnaie = new fields.StringField({ required: true, blank: false, initial: "denier" });
schema.equipe = new fields.BooleanField({initial: false}), schema.equipe = new fields.BooleanField({ initial: false }),
schema.description = new fields.HTMLField({ required: true, blank: true }); schema.description = new fields.HTMLField({ required: true, blank: true });

View File

@@ -6,7 +6,7 @@ export class TeDeumRollDialog extends Dialog {
static async create(actor, rollData) { static async create(actor, rollData) {
let options = { classes: ["tedeum-roll-dialog"], width: 540, height: 'fit-content', 'z-index': 99999 } let options = { classes: ["tedeum-roll-dialog"], width: 540, height: 'fit-content', 'z-index': 99999 }
let html = await renderTemplate('systems/fvtt-te-deum/templates/dialogs/roll-dialog-generic.hbs', rollData); let html = await foundry.applications.handlebars.renderTemplate('systems/fvtt-te-deum/templates/dialogs/roll-dialog-generic.hbs', rollData);
return new TeDeumRollDialog(actor, rollData, html, options); return new TeDeumRollDialog(actor, rollData, html, options);
} }
@@ -43,7 +43,7 @@ export class TeDeumRollDialog extends Dialog {
/* -------------------------------------------- */ /* -------------------------------------------- */
async refreshDialog() { async refreshDialog() {
const content = await renderTemplate("systems/fvtt-te-deum/templates/dialogs/roll-dialog-generic.hbs", this.rollData) const content = await foundry.applications.handlebars.renderTemplate("systems/fvtt-te-deum/templates/dialogs/roll-dialog-generic.hbs", this.rollData)
this.data.content = content this.data.content = content
this.render(true) this.render(true)
} }
@@ -63,6 +63,9 @@ export class TeDeumRollDialog extends Dialog {
html.find('#roll-allonge').change((event) => { html.find('#roll-allonge').change((event) => {
this.rollData.allongeId = event.currentTarget.value this.rollData.allongeId = event.currentTarget.value
}) })
html.find('#roll-main-gauche').change((event) => {
this.rollData.isMainGauche = event.currentTarget.checked
})
html.find('#roll-difficulty').change((event) => { html.find('#roll-difficulty').change((event) => {
this.rollData.difficulty = String(event.currentTarget.value) || "pardefaut" this.rollData.difficulty = String(event.currentTarget.value) || "pardefaut"
}) })

View File

@@ -91,7 +91,7 @@ export class TeDeumItemSheet extends foundry.appv1.sheets.ItemSheet {
payload: chatData, payload: chatData,
}); });
renderTemplate('systems/fvtt-te-deum/templates/post-item.html', chatData).then(html => { foundry.applications.handlebars.renderTemplate('systems/fvtt-te-deum/templates/post-item.html', chatData).then(html => {
let chatOptions = TeDeumUtility.chatDataSetup(html); let chatOptions = TeDeumUtility.chatDataSetup(html);
ChatMessage.create(chatOptions) ChatMessage.create(chatOptions)
}); });

View File

@@ -90,6 +90,8 @@ Hooks.once("init", async function () {
foundry.documents.collections.Items.registerSheet("fvtt-te-deum", TeDeumItemSheet, { makeDefault: true }); foundry.documents.collections.Items.registerSheet("fvtt-te-deum", TeDeumItemSheet, { makeDefault: true });
TeDeumUtility.init() TeDeumUtility.init()
TeDeumUtility.installHooks()
}); });
@@ -98,6 +100,7 @@ Hooks.once("init", async function () {
/* -------------------------------------------- */ /* -------------------------------------------- */
Hooks.once("ready", function () { Hooks.once("ready", function () {
// User warning // User warning
if (!game.user.isGM && game.user.character == undefined) { if (!game.user.isGM && game.user.character == undefined) {
ui.notifications.info("Attention ! Aucun personnage relié au joueur !"); ui.notifications.info("Attention ! Aucun personnage relié au joueur !");
@@ -107,10 +110,10 @@ Hooks.once("ready", function () {
}); });
} }
import("https://www.uberwald.me/fvtt_appcount/count-class-ready.js").then(moduleCounter=>{ import("https://www.uberwald.me/fvtt_appcount/count-class-ready.js").then(moduleCounter => {
console.log("ClassCounter loaded", moduleCounter) console.log("ClassCounter loaded", moduleCounter)
moduleCounter.ClassCounter.registerUsageCount() moduleCounter.ClassCounter.registerUsageCount()
}).catch(err=> }).catch(err =>
console.log("No stats available, giving up.") console.log("No stats available, giving up.")
) )
TeDeumUtility.ready(); TeDeumUtility.ready();

21
package.json Normal file
View File

@@ -0,0 +1,21 @@
{
"name": "fvtt-te-deum",
"version": "1.0.0",
"description": "Système Te Deum pour FoundryVTT",
"private": true,
"scripts": {
"build:css": "gulp css",
"watch:css": "gulp watch"
},
"devDependencies": {
"gulp": "^4.0.2",
"gulp-less": "^5.0.0",
"less": "^4.2.0",
"autoprefixer": "^10.4.20",
"gulp-postcss": "^9.0.1",
"postcss": "^8.4.49"
},
"keywords": ["foundry-vtt", "te-deum"],
"author": "",
"license": "ISC"
}

View File

@@ -1 +1 @@
MANIFEST-000137 MANIFEST-000226

View File

@@ -1,7 +1,3 @@
2025/09/18-17:25:25.945688 7f7f2affd6c0 Recovering log #134 2026/02/25-16:17:49.096861 7f821f7fe6c0 Recovering log #224
2025/09/18-17:25:25.962577 7f7f2affd6c0 Delete type=3 #132 2026/02/25-16:17:49.106471 7f821f7fe6c0 Delete type=3 #222
2025/09/18-17:25:25.962629 7f7f2affd6c0 Delete type=0 #134 2026/02/25-16:17:49.106539 7f821f7fe6c0 Delete type=0 #224
2025/09/18-17:25:58.096205 7f7f29bff6c0 Level-0 table #140: started
2025/09/18-17:25:58.096281 7f7f29bff6c0 Level-0 table #140: 0 bytes OK
2025/09/18-17:25:58.103314 7f7f29bff6c0 Delete type=0 #138
2025/09/18-17:25:58.103571 7f7f29bff6c0 Manual compaction at level-0 from '!journal!uNwJgi4kXBCiZmAH' @ 72057594037927935 : 1 .. '!journal.pages!uNwJgi4kXBCiZmAH.onhNU0mXhOpdNZJF' @ 0 : 0; will stop at (end)

View File

@@ -1,11 +1,7 @@
2025/09/18-11:50:45.746719 7f7f2bfff6c0 Delete type=3 #1 2026/02/25-15:53:40.937630 7f821ffff6c0 Recovering log #220
2025/09/18-17:24:09.744265 7f7f29bff6c0 Level-0 table #135: started 2026/02/25-15:53:40.949873 7f821ffff6c0 Delete type=3 #218
2025/09/18-17:24:09.744308 7f7f29bff6c0 Level-0 table #135: 0 bytes OK 2026/02/25-15:53:40.949933 7f821ffff6c0 Delete type=0 #220
2025/09/18-17:24:09.802551 7f7f29bff6c0 Delete type=0 #133 2026/02/25-16:16:19.716603 7f821d8d46c0 Level-0 table #225: started
2025/09/18-17:24:09.802767 7f7f29bff6c0 Manual compaction at level-0 from '!journal!uNwJgi4kXBCiZmAH' @ 72057594037927935 : 1 .. '!journal.pages!uNwJgi4kXBCiZmAH.onhNU0mXhOpdNZJF' @ 0 : 0; will stop at '!journal.pages!uNwJgi4kXBCiZmAH.onhNU0mXhOpdNZJF' @ 25 : 1 2026/02/25-16:16:19.716652 7f821d8d46c0 Level-0 table #225: 0 bytes OK
2025/09/18-17:24:09.802780 7f7f29bff6c0 Compacting 1@0 + 0@1 files 2026/02/25-16:16:19.765894 7f821d8d46c0 Delete type=0 #223
2025/09/18-17:24:09.830358 7f7f29bff6c0 Generated table #136@0: 5 keys, 3728 bytes 2026/02/25-16:16:19.766155 7f821d8d46c0 Manual compaction at level-0 from '!journal!uNwJgi4kXBCiZmAH' @ 72057594037927935 : 1 .. '!journal.pages!uNwJgi4kXBCiZmAH.onhNU0mXhOpdNZJF' @ 0 : 0; will stop at (end)
2025/09/18-17:24:09.830408 7f7f29bff6c0 Compacted 1@0 + 0@1 files => 3728 bytes
2025/09/18-17:24:09.891222 7f7f29bff6c0 compacted to: files[ 0 1 0 0 0 0 0 ]
2025/09/18-17:24:09.891483 7f7f29bff6c0 Delete type=2 #103
2025/09/18-17:24:10.130709 7f7f29bff6c0 Manual compaction at level-0 from '!journal.pages!uNwJgi4kXBCiZmAH.onhNU0mXhOpdNZJF' @ 25 : 1 .. '!journal.pages!uNwJgi4kXBCiZmAH.onhNU0mXhOpdNZJF' @ 0 : 0; will stop at (end)

Binary file not shown.

BIN
packs/aides/MANIFEST-000226 Normal file

Binary file not shown.

View File

@@ -1 +1 @@
MANIFEST-000240 MANIFEST-000329

View File

@@ -1,7 +1,3 @@
2025/09/18-17:25:25.808742 7f7f2bfff6c0 Recovering log #237 2026/02/25-16:17:49.007591 7f821f7fe6c0 Recovering log #327
2025/09/18-17:25:25.826162 7f7f2bfff6c0 Delete type=3 #235 2026/02/25-16:17:49.018485 7f821f7fe6c0 Delete type=3 #325
2025/09/18-17:25:25.826217 7f7f2bfff6c0 Delete type=0 #237 2026/02/25-16:17:49.018548 7f821f7fe6c0 Delete type=0 #327
2025/09/18-17:25:58.034192 7f7f29bff6c0 Level-0 table #243: started
2025/09/18-17:25:58.034230 7f7f29bff6c0 Level-0 table #243: 0 bytes OK
2025/09/18-17:25:58.040524 7f7f29bff6c0 Delete type=0 #241
2025/09/18-17:25:58.047737 7f7f29bff6c0 Manual compaction at level-0 from '!folders!InCQeTRdT5jXMX82' @ 72057594037927935 : 1 .. '!items!wxIHkrq98eQ3cOvp' @ 0 : 0; will stop at (end)

View File

@@ -1,11 +1,7 @@
2025/09/18-11:50:45.598190 7f7f2a7fc6c0 Delete type=3 #1 2026/02/25-15:53:40.848906 7f821effd6c0 Recovering log #323
2025/09/18-17:24:08.419689 7f7f29bff6c0 Level-0 table #238: started 2026/02/25-15:53:40.858667 7f821effd6c0 Delete type=3 #321
2025/09/18-17:24:08.419727 7f7f29bff6c0 Level-0 table #238: 0 bytes OK 2026/02/25-15:53:40.858720 7f821effd6c0 Delete type=0 #323
2025/09/18-17:24:08.484925 7f7f29bff6c0 Delete type=0 #236 2026/02/25-16:16:19.467652 7f821d8d46c0 Level-0 table #328: started
2025/09/18-17:24:08.766692 7f7f29bff6c0 Manual compaction at level-0 from '!folders!InCQeTRdT5jXMX82' @ 72057594037927935 : 1 .. '!items!wxIHkrq98eQ3cOvp' @ 0 : 0; will stop at '!items!wxIHkrq98eQ3cOvp' @ 73 : 1 2026/02/25-16:16:19.467677 7f821d8d46c0 Level-0 table #328: 0 bytes OK
2025/09/18-17:24:08.766704 7f7f29bff6c0 Compacting 1@0 + 0@1 files 2026/02/25-16:16:19.528659 7f821d8d46c0 Delete type=0 #326
2025/09/18-17:24:08.800723 7f7f29bff6c0 Generated table #239@0: 38 keys, 31247 bytes 2026/02/25-16:16:19.528885 7f821d8d46c0 Manual compaction at level-0 from '!folders!InCQeTRdT5jXMX82' @ 72057594037927935 : 1 .. '!items!wxIHkrq98eQ3cOvp' @ 0 : 0; will stop at (end)
2025/09/18-17:24:08.800756 7f7f29bff6c0 Compacted 1@0 + 0@1 files => 31247 bytes
2025/09/18-17:24:08.859553 7f7f29bff6c0 compacted to: files[ 0 1 0 0 0 0 0 ]
2025/09/18-17:24:08.859745 7f7f29bff6c0 Delete type=2 #206
2025/09/18-17:24:08.860015 7f7f29bff6c0 Manual compaction at level-0 from '!items!wxIHkrq98eQ3cOvp' @ 73 : 1 .. '!items!wxIHkrq98eQ3cOvp' @ 0 : 0; will stop at (end)

Binary file not shown.

BIN
packs/armes/MANIFEST-000329 Normal file

Binary file not shown.

View File

@@ -1 +1 @@
MANIFEST-000239 MANIFEST-000329

View File

@@ -1,7 +1,3 @@
2025/09/18-17:25:25.829687 7f7f2a7fc6c0 Recovering log #236 2026/02/25-16:17:49.020792 7f821effd6c0 Recovering log #327
2025/09/18-17:25:25.846790 7f7f2a7fc6c0 Delete type=3 #234 2026/02/25-16:17:49.030955 7f821effd6c0 Delete type=3 #325
2025/09/18-17:25:25.846846 7f7f2a7fc6c0 Delete type=0 #236 2026/02/25-16:17:49.031024 7f821effd6c0 Delete type=0 #327
2025/09/18-17:25:58.026302 7f7f29bff6c0 Level-0 table #242: started
2025/09/18-17:25:58.026357 7f7f29bff6c0 Level-0 table #242: 0 bytes OK
2025/09/18-17:25:58.034035 7f7f29bff6c0 Delete type=0 #240
2025/09/18-17:25:58.047715 7f7f29bff6c0 Manual compaction at level-0 from '!folders!2wTJBj3dicRKzNOE' @ 72057594037927935 : 1 .. '!items!ufvhWG5V8pX0qrtR' @ 0 : 0; will stop at (end)

View File

@@ -1,11 +1,7 @@
2025/09/18-11:50:45.617997 7f7f2a7fc6c0 Delete type=3 #1 2026/02/25-15:53:40.860848 7f821f7fe6c0 Recovering log #323
2025/09/18-17:24:08.294497 7f7f29bff6c0 Level-0 table #237: started 2026/02/25-15:53:40.871268 7f821f7fe6c0 Delete type=3 #321
2025/09/18-17:24:08.294539 7f7f29bff6c0 Level-0 table #237: 0 bytes OK 2026/02/25-15:53:40.871372 7f821f7fe6c0 Delete type=0 #323
2025/09/18-17:24:08.351872 7f7f29bff6c0 Delete type=0 #235 2026/02/25-16:16:19.298465 7f821d8d46c0 Level-0 table #328: started
2025/09/18-17:24:08.582142 7f7f29bff6c0 Manual compaction at level-0 from '!folders!2wTJBj3dicRKzNOE' @ 72057594037927935 : 1 .. '!items!ufvhWG5V8pX0qrtR' @ 0 : 0; will stop at '!items!ufvhWG5V8pX0qrtR' @ 54 : 1 2026/02/25-16:16:19.298546 7f821d8d46c0 Level-0 table #328: 0 bytes OK
2025/09/18-17:24:08.582154 7f7f29bff6c0 Compacting 1@0 + 0@1 files 2026/02/25-16:16:19.356349 7f821d8d46c0 Delete type=0 #326
2025/09/18-17:24:08.616167 7f7f29bff6c0 Generated table #238@0: 29 keys, 12111 bytes 2026/02/25-16:16:19.528831 7f821d8d46c0 Manual compaction at level-0 from '!folders!2wTJBj3dicRKzNOE' @ 72057594037927935 : 1 .. '!items!ufvhWG5V8pX0qrtR' @ 0 : 0; will stop at (end)
2025/09/18-17:24:08.616198 7f7f29bff6c0 Compacted 1@0 + 0@1 files => 12111 bytes
2025/09/18-17:24:08.671918 7f7f29bff6c0 compacted to: files[ 0 1 0 0 0 0 0 ]
2025/09/18-17:24:08.672212 7f7f29bff6c0 Delete type=2 #205
2025/09/18-17:24:08.859972 7f7f29bff6c0 Manual compaction at level-0 from '!items!ufvhWG5V8pX0qrtR' @ 54 : 1 .. '!items!ufvhWG5V8pX0qrtR' @ 0 : 0; will stop at (end)

Binary file not shown.

Binary file not shown.

View File

@@ -1 +1 @@
MANIFEST-000238 MANIFEST-000327

View File

@@ -1,7 +1,3 @@
2025/09/18-17:25:25.789090 7f7f2b7fe6c0 Recovering log #235 2026/02/25-16:17:48.995540 7f821e7fc6c0 Recovering log #325
2025/09/18-17:25:25.805571 7f7f2b7fe6c0 Delete type=3 #233 2026/02/25-16:17:49.005262 7f821e7fc6c0 Delete type=3 #323
2025/09/18-17:25:25.805686 7f7f2b7fe6c0 Delete type=0 #235 2026/02/25-16:17:49.005349 7f821e7fc6c0 Delete type=0 #325
2025/09/18-17:25:58.040659 7f7f29bff6c0 Level-0 table #241: started
2025/09/18-17:25:58.040687 7f7f29bff6c0 Level-0 table #241: 0 bytes OK
2025/09/18-17:25:58.047473 7f7f29bff6c0 Delete type=0 #239
2025/09/18-17:25:58.047759 7f7f29bff6c0 Manual compaction at level-0 from '!folders!4OPhigzcPv46qbWW' @ 72057594037927935 : 1 .. '!items!yx4k7lQHGcom99mk' @ 0 : 0; will stop at (end)

View File

@@ -1,11 +1,7 @@
2025/09/18-11:50:45.576078 7f7f2affd6c0 Delete type=3 #1 2026/02/25-15:53:40.836015 7f821ffff6c0 Recovering log #321
2025/09/18-17:24:08.352040 7f7f29bff6c0 Level-0 table #236: started 2026/02/25-15:53:40.846129 7f821ffff6c0 Delete type=3 #319
2025/09/18-17:24:08.352081 7f7f29bff6c0 Level-0 table #236: 0 bytes OK 2026/02/25-15:53:40.846180 7f821ffff6c0 Delete type=0 #321
2025/09/18-17:24:08.419524 7f7f29bff6c0 Delete type=0 #234 2026/02/25-16:16:19.415073 7f821d8d46c0 Level-0 table #326: started
2025/09/18-17:24:08.672479 7f7f29bff6c0 Manual compaction at level-0 from '!folders!4OPhigzcPv46qbWW' @ 72057594037927935 : 1 .. '!items!yx4k7lQHGcom99mk' @ 0 : 0; will stop at '!items!yx4k7lQHGcom99mk' @ 237 : 1 2026/02/25-16:16:19.415106 7f821d8d46c0 Level-0 table #326: 0 bytes OK
2025/09/18-17:24:08.672498 7f7f29bff6c0 Compacting 1@0 + 0@1 files 2026/02/25-16:16:19.467523 7f821d8d46c0 Delete type=0 #324
2025/09/18-17:24:08.706074 7f7f29bff6c0 Generated table #237@0: 115 keys, 38139 bytes 2026/02/25-16:16:19.528868 7f821d8d46c0 Manual compaction at level-0 from '!folders!4OPhigzcPv46qbWW' @ 72057594037927935 : 1 .. '!items!yx4k7lQHGcom99mk' @ 0 : 0; will stop at (end)
2025/09/18-17:24:08.706156 7f7f29bff6c0 Compacted 1@0 + 0@1 files => 38139 bytes
2025/09/18-17:24:08.766397 7f7f29bff6c0 compacted to: files[ 0 1 0 0 0 0 0 ]
2025/09/18-17:24:08.766527 7f7f29bff6c0 Delete type=2 #231
2025/09/18-17:24:08.859995 7f7f29bff6c0 Manual compaction at level-0 from '!items!yx4k7lQHGcom99mk' @ 237 : 1 .. '!items!yx4k7lQHGcom99mk' @ 0 : 0; will stop at (end)

Binary file not shown.

Binary file not shown.

View File

@@ -1 +1 @@
MANIFEST-000249 MANIFEST-000339

View File

@@ -1,7 +1,3 @@
2025/09/18-17:25:25.849643 7f7f2affd6c0 Recovering log #246 2026/02/25-16:17:49.032966 7f821ffff6c0 Recovering log #337
2025/09/18-17:25:25.865539 7f7f2affd6c0 Delete type=3 #244 2026/02/25-16:17:49.043199 7f821ffff6c0 Delete type=3 #335
2025/09/18-17:25:25.865600 7f7f2affd6c0 Delete type=0 #246 2026/02/25-16:17:49.043264 7f821ffff6c0 Delete type=0 #337
2025/09/18-17:25:58.061760 7f7f29bff6c0 Level-0 table #252: started
2025/09/18-17:25:58.061807 7f7f29bff6c0 Level-0 table #252: 0 bytes OK
2025/09/18-17:25:58.069452 7f7f29bff6c0 Delete type=0 #250
2025/09/18-17:25:58.076019 7f7f29bff6c0 Manual compaction at level-0 from '!folders!9PQi3Lv54rpcxavo' @ 72057594037927935 : 1 .. '!items!zGlRtP7zSnkjuuue' @ 0 : 0; will stop at (end)

View File

@@ -1,11 +1,7 @@
2025/09/18-11:50:45.638850 7f7f2bfff6c0 Delete type=3 #1 2026/02/25-15:53:40.874436 7f821ffff6c0 Recovering log #333
2025/09/18-17:24:08.232941 7f7f29bff6c0 Level-0 table #247: started 2026/02/25-15:53:40.884848 7f821ffff6c0 Delete type=3 #331
2025/09/18-17:24:08.233014 7f7f29bff6c0 Level-0 table #247: 0 bytes OK 2026/02/25-15:53:40.884904 7f821ffff6c0 Delete type=0 #333
2025/09/18-17:24:08.294274 7f7f29bff6c0 Delete type=0 #245 2026/02/25-16:16:19.356498 7f821d8d46c0 Level-0 table #338: started
2025/09/18-17:24:08.485079 7f7f29bff6c0 Manual compaction at level-0 from '!folders!9PQi3Lv54rpcxavo' @ 72057594037927935 : 1 .. '!items!zGlRtP7zSnkjuuue' @ 0 : 0; will stop at '!items!zGlRtP7zSnkjuuue' @ 510 : 1 2026/02/25-16:16:19.356535 7f821d8d46c0 Level-0 table #338: 0 bytes OK
2025/09/18-17:24:08.485093 7f7f29bff6c0 Compacting 1@0 + 0@1 files 2026/02/25-16:16:19.414898 7f821d8d46c0 Delete type=0 #336
2025/09/18-17:24:08.521894 7f7f29bff6c0 Generated table #248@0: 71 keys, 264331 bytes 2026/02/25-16:16:19.528852 7f821d8d46c0 Manual compaction at level-0 from '!folders!9PQi3Lv54rpcxavo' @ 72057594037927935 : 1 .. '!items!zGlRtP7zSnkjuuue' @ 0 : 0; will stop at (end)
2025/09/18-17:24:08.521971 7f7f29bff6c0 Compacted 1@0 + 0@1 files => 264331 bytes
2025/09/18-17:24:08.581818 7f7f29bff6c0 compacted to: files[ 0 1 0 0 0 0 0 ]
2025/09/18-17:24:08.581947 7f7f29bff6c0 Delete type=2 #231
2025/09/18-17:24:08.859951 7f7f29bff6c0 Manual compaction at level-0 from '!items!zGlRtP7zSnkjuuue' @ 510 : 1 .. '!items!zGlRtP7zSnkjuuue' @ 0 : 0; will stop at (end)

Binary file not shown.

Binary file not shown.

View File

@@ -1 +1 @@
MANIFEST-000239 MANIFEST-000328

View File

@@ -1,7 +1,3 @@
2025/09/18-17:25:25.869600 7f7f2b7fe6c0 Recovering log #236 2026/02/25-16:17:49.045639 7f821e7fc6c0 Recovering log #326
2025/09/18-17:25:25.884627 7f7f2b7fe6c0 Delete type=3 #234 2026/02/25-16:17:49.056537 7f821e7fc6c0 Delete type=3 #324
2025/09/18-17:25:25.884728 7f7f2b7fe6c0 Delete type=0 #236 2026/02/25-16:17:49.056606 7f821e7fc6c0 Delete type=0 #326
2025/09/18-17:25:58.019852 7f7f29bff6c0 Level-0 table #242: started
2025/09/18-17:25:58.019893 7f7f29bff6c0 Level-0 table #242: 0 bytes OK
2025/09/18-17:25:58.026069 7f7f29bff6c0 Delete type=0 #240
2025/09/18-17:25:58.047683 7f7f29bff6c0 Manual compaction at level-0 from '!items!17mjvwS8R3B6LloG' @ 72057594037927935 : 1 .. '!items!zUYIVOuFpRur9aAR' @ 0 : 0; will stop at (end)

View File

@@ -1,11 +1,7 @@
2025/09/18-11:50:45.661051 7f7f2b7fe6c0 Delete type=3 #1 2026/02/25-15:53:40.888183 7f821effd6c0 Recovering log #322
2025/09/18-17:24:08.860133 7f7f29bff6c0 Level-0 table #237: started 2026/02/25-15:53:40.897808 7f821effd6c0 Delete type=3 #320
2025/09/18-17:24:08.860169 7f7f29bff6c0 Level-0 table #237: 0 bytes OK 2026/02/25-15:53:40.897873 7f821effd6c0 Delete type=0 #322
2025/09/18-17:24:08.917842 7f7f29bff6c0 Delete type=0 #235 2026/02/25-16:16:19.645632 7f821d8d46c0 Level-0 table #327: started
2025/09/18-17:24:09.119729 7f7f29bff6c0 Manual compaction at level-0 from '!items!17mjvwS8R3B6LloG' @ 72057594037927935 : 1 .. '!items!zUYIVOuFpRur9aAR' @ 0 : 0; will stop at '!items!zUYIVOuFpRur9aAR' @ 109 : 1 2026/02/25-16:16:19.645665 7f821d8d46c0 Level-0 table #327: 0 bytes OK
2025/09/18-17:24:09.119743 7f7f29bff6c0 Compacting 1@0 + 0@1 files 2026/02/25-16:16:19.716424 7f821d8d46c0 Delete type=0 #325
2025/09/18-17:24:09.155742 7f7f29bff6c0 Generated table #238@0: 49 keys, 20052 bytes 2026/02/25-16:16:19.766141 7f821d8d46c0 Manual compaction at level-0 from '!items!17mjvwS8R3B6LloG' @ 72057594037927935 : 1 .. '!items!zUYIVOuFpRur9aAR' @ 0 : 0; will stop at (end)
2025/09/18-17:24:09.155788 7f7f29bff6c0 Compacted 1@0 + 0@1 files => 20052 bytes
2025/09/18-17:24:09.214820 7f7f29bff6c0 compacted to: files[ 0 1 0 0 0 0 0 ]
2025/09/18-17:24:09.214942 7f7f29bff6c0 Delete type=2 #205
2025/09/18-17:24:09.499501 7f7f29bff6c0 Manual compaction at level-0 from '!items!zUYIVOuFpRur9aAR' @ 109 : 1 .. '!items!zUYIVOuFpRur9aAR' @ 0 : 0; will stop at (end)

Binary file not shown.

Binary file not shown.

View File

@@ -1 +1 @@
MANIFEST-000239 MANIFEST-000328

View File

@@ -1,7 +1,3 @@
2025/09/18-17:25:25.887557 7f7f2a7fc6c0 Recovering log #236 2026/02/25-16:17:49.058989 7f821effd6c0 Recovering log #326
2025/09/18-17:25:25.903745 7f7f2a7fc6c0 Delete type=3 #234 2026/02/25-16:17:49.068511 7f821effd6c0 Delete type=3 #324
2025/09/18-17:25:25.903805 7f7f2a7fc6c0 Delete type=0 #236 2026/02/25-16:17:49.068568 7f821effd6c0 Delete type=0 #326
2025/09/18-17:25:58.055681 7f7f29bff6c0 Level-0 table #242: started
2025/09/18-17:25:58.055706 7f7f29bff6c0 Level-0 table #242: 0 bytes OK
2025/09/18-17:25:58.061636 7f7f29bff6c0 Delete type=0 #240
2025/09/18-17:25:58.076006 7f7f29bff6c0 Manual compaction at level-0 from '!items!1icaxIywAwDXQcMz' @ 72057594037927935 : 1 .. '!items!ysGehYm1VkMWrI22' @ 0 : 0; will stop at (end)

View File

@@ -1,11 +1,7 @@
2025/09/18-11:50:45.681692 7f7f2affd6c0 Delete type=3 #1 2026/02/25-15:53:40.899737 7f821f7fe6c0 Recovering log #322
2025/09/18-17:24:08.917988 7f7f29bff6c0 Level-0 table #237: started 2026/02/25-15:53:40.910545 7f821f7fe6c0 Delete type=3 #320
2025/09/18-17:24:08.918018 7f7f29bff6c0 Level-0 table #237: 0 bytes OK 2026/02/25-15:53:40.910590 7f821f7fe6c0 Delete type=0 #322
2025/09/18-17:24:08.983600 7f7f29bff6c0 Delete type=0 #235 2026/02/25-16:16:19.529006 7f821d8d46c0 Level-0 table #327: started
2025/09/18-17:24:09.215118 7f7f29bff6c0 Manual compaction at level-0 from '!items!1icaxIywAwDXQcMz' @ 72057594037927935 : 1 .. '!items!ysGehYm1VkMWrI22' @ 0 : 0; will stop at '!items!ysGehYm1VkMWrI22' @ 71 : 1 2026/02/25-16:16:19.529044 7f821d8d46c0 Level-0 table #327: 0 bytes OK
2025/09/18-17:24:09.215131 7f7f29bff6c0 Compacting 1@0 + 0@1 files 2026/02/25-16:16:19.584573 7f821d8d46c0 Delete type=0 #325
2025/09/18-17:24:09.251613 7f7f29bff6c0 Generated table #238@0: 17 keys, 11517 bytes 2026/02/25-16:16:19.766110 7f821d8d46c0 Manual compaction at level-0 from '!items!1icaxIywAwDXQcMz' @ 72057594037927935 : 1 .. '!items!ysGehYm1VkMWrI22' @ 0 : 0; will stop at (end)
2025/09/18-17:24:09.251694 7f7f29bff6c0 Compacted 1@0 + 0@1 files => 11517 bytes
2025/09/18-17:24:09.305026 7f7f29bff6c0 compacted to: files[ 0 1 0 0 0 0 0 ]
2025/09/18-17:24:09.305314 7f7f29bff6c0 Delete type=2 #205
2025/09/18-17:24:09.499516 7f7f29bff6c0 Manual compaction at level-0 from '!items!ysGehYm1VkMWrI22' @ 71 : 1 .. '!items!ysGehYm1VkMWrI22' @ 0 : 0; will stop at (end)

Binary file not shown.

Binary file not shown.

View File

@@ -1 +1 @@
MANIFEST-000176 MANIFEST-000265

View File

@@ -1,7 +1,3 @@
2025/09/18-17:25:25.926154 7f7f2b7fe6c0 Recovering log #173 2026/02/25-16:17:49.082827 7f821e7fc6c0 Recovering log #263
2025/09/18-17:25:25.941736 7f7f2b7fe6c0 Delete type=3 #171 2026/02/25-16:17:49.093869 7f821e7fc6c0 Delete type=3 #261
2025/09/18-17:25:25.941811 7f7f2b7fe6c0 Delete type=0 #173 2026/02/25-16:17:49.093933 7f821e7fc6c0 Delete type=0 #263
2025/09/18-17:25:58.069595 7f7f29bff6c0 Level-0 table #179: started
2025/09/18-17:25:58.069627 7f7f29bff6c0 Level-0 table #179: 0 bytes OK
2025/09/18-17:25:58.075769 7f7f29bff6c0 Delete type=0 #177
2025/09/18-17:25:58.076032 7f7f29bff6c0 Manual compaction at level-0 from '!scenes!FJXugdbkBpEJEdR6' @ 72057594037927935 : 1 .. '!scenes!FJXugdbkBpEJEdR6' @ 0 : 0; will stop at (end)

View File

@@ -1,11 +1,7 @@
2025/09/18-11:50:45.725670 7f7f2a7fc6c0 Delete type=3 #1 2026/02/25-15:53:40.925187 7f821effd6c0 Recovering log #259
2025/09/18-17:24:09.049574 7f7f29bff6c0 Level-0 table #174: started 2026/02/25-15:53:40.934520 7f821effd6c0 Delete type=3 #257
2025/09/18-17:24:09.049607 7f7f29bff6c0 Level-0 table #174: 0 bytes OK 2026/02/25-15:53:40.934568 7f821effd6c0 Delete type=0 #259
2025/09/18-17:24:09.119551 7f7f29bff6c0 Delete type=0 #172 2026/02/25-16:16:19.945947 7f821d8d46c0 Level-0 table #264: started
2025/09/18-17:24:09.404507 7f7f29bff6c0 Manual compaction at level-0 from '!scenes!FJXugdbkBpEJEdR6' @ 72057594037927935 : 1 .. '!scenes!FJXugdbkBpEJEdR6' @ 0 : 0; will stop at '!scenes!FJXugdbkBpEJEdR6' @ 5 : 1 2026/02/25-16:16:19.946001 7f821d8d46c0 Level-0 table #264: 0 bytes OK
2025/09/18-17:24:09.404524 7f7f29bff6c0 Compacting 1@0 + 0@1 files 2026/02/25-16:16:20.001848 7f821d8d46c0 Delete type=0 #262
2025/09/18-17:24:09.434413 7f7f29bff6c0 Generated table #175@0: 1 keys, 1344 bytes 2026/02/25-16:16:20.001994 7f821d8d46c0 Manual compaction at level-0 from '!scenes!FJXugdbkBpEJEdR6' @ 72057594037927935 : 1 .. '!scenes!FJXugdbkBpEJEdR6' @ 0 : 0; will stop at (end)
2025/09/18-17:24:09.434448 7f7f29bff6c0 Compacted 1@0 + 0@1 files => 1344 bytes
2025/09/18-17:24:09.499220 7f7f29bff6c0 compacted to: files[ 0 1 0 0 0 0 0 ]
2025/09/18-17:24:09.499350 7f7f29bff6c0 Delete type=2 #142
2025/09/18-17:24:09.499541 7f7f29bff6c0 Manual compaction at level-0 from '!scenes!FJXugdbkBpEJEdR6' @ 5 : 1 .. '!scenes!FJXugdbkBpEJEdR6' @ 0 : 0; will stop at (end)

Binary file not shown.

Binary file not shown.

View File

@@ -1 +1 @@
MANIFEST-000240 MANIFEST-000329

View File

@@ -1,7 +1,3 @@
2025/09/18-17:25:25.906336 7f7f2bfff6c0 Recovering log #237 2026/02/25-16:17:49.070393 7f821ffff6c0 Recovering log #327
2025/09/18-17:25:25.922455 7f7f2bfff6c0 Delete type=3 #235 2026/02/25-16:17:49.080654 7f821ffff6c0 Delete type=3 #325
2025/09/18-17:25:25.922542 7f7f2bfff6c0 Delete type=0 #237 2026/02/25-16:17:49.080720 7f821ffff6c0 Delete type=0 #327
2025/09/18-17:25:58.047930 7f7f29bff6c0 Level-0 table #243: started
2025/09/18-17:25:58.048063 7f7f29bff6c0 Level-0 table #243: 0 bytes OK
2025/09/18-17:25:58.055551 7f7f29bff6c0 Delete type=0 #241
2025/09/18-17:25:58.075985 7f7f29bff6c0 Manual compaction at level-0 from '!items!1bAL2MQVpVBd0c5Z' @ 72057594037927935 : 1 .. '!items!zs67k4sxCid6oTK3' @ 0 : 0; will stop at (end)

View File

@@ -1,11 +1,7 @@
2025/09/18-11:50:45.701807 7f7f2a7fc6c0 Delete type=3 #1 2026/02/25-15:53:40.912618 7f821e7fc6c0 Recovering log #323
2025/09/18-17:24:08.983751 7f7f29bff6c0 Level-0 table #238: started 2026/02/25-15:53:40.922737 7f821e7fc6c0 Delete type=3 #321
2025/09/18-17:24:08.983779 7f7f29bff6c0 Level-0 table #238: 0 bytes OK 2026/02/25-15:53:40.922804 7f821e7fc6c0 Delete type=0 #323
2025/09/18-17:24:09.049421 7f7f29bff6c0 Delete type=0 #236 2026/02/25-16:16:19.584692 7f821d8d46c0 Level-0 table #328: started
2025/09/18-17:24:09.305611 7f7f29bff6c0 Manual compaction at level-0 from '!items!1bAL2MQVpVBd0c5Z' @ 72057594037927935 : 1 .. '!items!zs67k4sxCid6oTK3' @ 0 : 0; will stop at '!items!zs67k4sxCid6oTK3' @ 80 : 1 2026/02/25-16:16:19.584724 7f821d8d46c0 Level-0 table #328: 0 bytes OK
2025/09/18-17:24:09.305631 7f7f29bff6c0 Compacting 1@0 + 0@1 files 2026/02/25-16:16:19.645484 7f821d8d46c0 Delete type=0 #326
2025/09/18-17:24:09.339316 7f7f29bff6c0 Generated table #239@0: 36 keys, 20892 bytes 2026/02/25-16:16:19.766128 7f821d8d46c0 Manual compaction at level-0 from '!items!1bAL2MQVpVBd0c5Z' @ 72057594037927935 : 1 .. '!items!zs67k4sxCid6oTK3' @ 0 : 0; will stop at (end)
2025/09/18-17:24:09.339411 7f7f29bff6c0 Compacted 1@0 + 0@1 files => 20892 bytes
2025/09/18-17:24:09.404093 7f7f29bff6c0 compacted to: files[ 0 1 0 0 0 0 0 ]
2025/09/18-17:24:09.404255 7f7f29bff6c0 Delete type=2 #218
2025/09/18-17:24:09.499531 7f7f29bff6c0 Manual compaction at level-0 from '!items!zs67k4sxCid6oTK3' @ 80 : 1 .. '!items!zs67k4sxCid6oTK3' @ 0 : 0; will stop at (end)

Binary file not shown.

Binary file not shown.

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -148,8 +148,8 @@
], ],
"title": "Te Deum pour Un Massacre, le Jeu de Rôles (Officiel)", "title": "Te Deum pour Un Massacre, le Jeu de Rôles (Officiel)",
"url": "https://www.uberwald.me/gitea/public/fvtt-te-deum", "url": "https://www.uberwald.me/gitea/public/fvtt-te-deum",
"version": "13.0.1", "version": "13.0.2",
"download": "https://www.uberwald.me/gitea/public/fvtt-te-deum/releases/download/13.0.1/fvtt-te-deum-13.0.1.zip", "download": "https://www.uberwald.me/gitea/public/fvtt-te-deum/releases/download/13.0.1/fvtt-te-deum-13.0.2.zip",
"background": "systems/fvtt-te-deum/images/ui/tdeum_welcome_page_01.webp", "background": "systems/fvtt-te-deum/images/ui/tdeum_welcome_page_01.webp",
"flags": { "flags": {
"hotReload": { "hotReload": {

View File

@@ -238,7 +238,11 @@
</label> </label>
<span>&nbsp;</span> <span>&nbsp;</span>
<a class="item-control item-edit" title="Editer"><i class="fas fa-edit"></i></a> <a class="item-control item-edit" title="Editer"><i class="fas fa-edit"></i></a>
{{#if comp.system.isBase}}
<span class="item-control"><i class="fa-solid fa-trash-slash"></i></span>
{{else}}
<a class="item-control item-delete" title="Supprimer"><i class="fas fa-trash"></i></a> <a class="item-control item-delete" title="Supprimer"><i class="fas fa-trash"></i></a>
{{/if}}
</li> </li>
{{/each}} {{/each}}
</ul> </ul>

View File

@@ -5,25 +5,33 @@
<h4 class="chat-actor-name">{{alias}}</h4> <h4 class="chat-actor-name">{{alias}}</h4>
</div> </div>
<hr> <div class="chat-roll-details" style="margin-top: 0.3rem;">
{{#if img}}
{{#if img}} <div style="text-align: center; margin-bottom: 0.3rem;">
<div>
<img class="chat-icon" src="{{img}}" alt="{{name}}" /> <img class="chat-icon" src="{{img}}" alt="{{name}}" />
</div> </div>
{{/if}} {{/if}}
<div class="flexcol"> <div class="chat-info-badge" style="margin-bottom: 0.4rem;">
</div> <strong>{{alias}}</strong>
attaque
<strong>{{defenderName}}</strong>
</div>
<ul style="margin: 0; padding-left: 0.5rem;">
<div>
<ul>
{{#if arme}} {{#if arme}}
<label class="chat-weapon-name">Dégats {{arme.name}} : {{degats}} ({{degatsFormula}})</label> <li style="margin: 0.2rem 0;"><span class="chat-info-badge">Dégâts
{{arme.name}}
:
{{degats}}
({{degatsFormula}})</span></li>
{{/if}} {{/if}}
{{#if loc}} {{#if loc}}
<li>Localisation : {{loc.label}}</li> <li style="margin: 0.2rem 0;"><span
<li>Touché : {{touche}}</li> class="chat-difficulty-badge"
>Localisation : {{loc.label}}</span></li>
<li style="margin: 0.2rem 0;">Touché : {{touche}}</li>
{{/if}} {{/if}}
{{#if gantelet}} {{#if gantelet}}
@@ -38,56 +46,65 @@
{{/if}} {{/if}}
{{#if isReussiteCritique}} {{#if isReussiteCritique}}
<li><strong class="chat-result-success">Réussite critique : La blessure a été augmentée d'un niveau</strong></li> <li style="margin: 0.3rem 0;"><span class="chat-result-success">🎯
Réussite critique : La blessure a été augmentée d'un niveau</span></li>
{{/if}} {{/if}}
{{#if blessure}} {{#if blessure}}
<li>{{defenderName}} a subi une blessure!</li> <li style="margin: 0.3rem 0;"><span class="chat-warning-badge">⚔️
<li>Gravité : {{blessure.name}}</li> {{defenderName}}
a subi une blessure!</span></li>
<li style="margin: 0.2rem 0;"><strong>Gravité :
{{blessure.name}}</strong></li>
{{#if (eq loc.categorie "tete")}} {{#if (eq loc.categorie "tete")}}
{{#if (gt blessure.system.value 0)}} {{#if (gt blessure.system.value 0)}}
<li><strong class="chat-result-warning">{{alias}} doit réussir un test d'Endurance de difficulté 7 ou être <li style="margin: 0.3rem 0;"><span class="chat-result-failure">💥
assomé</strong></li> {{defenderName}}
doit réussir un test d'Endurance de difficulté 7 ou être assommé</span></li>
{{/if}} {{/if}}
{{/if}} {{/if}}
{{#if (eq loc.categorie "bras")}} {{#if (eq loc.categorie "bras")}}
{{#if (gt blessure.system.value 2)}} {{#if (gt blessure.system.value 2)}}
<li><strong class="chat-result-warning">{{alias}} lache l'objet tenu par son bras. Il doit faire un test d'endurance <li style="margin: 0.3rem 0;"><span class="chat-result-failure">💥
pour l'utiliser désormais.</strong></li> {{defenderName}}
lâche l'objet tenu par son bras. Il doit faire un test d'endurance
pour l'utiliser désormais.</span></li>
{{/if}} {{/if}}
{{/if}} {{/if}}
{{#if (eq loc.categorie "jambe")}} {{#if (eq loc.categorie "jambe")}}
{{#if (gt blessure.system.value 2)}} {{#if (gt blessure.system.value 2)}}
<li><strong class="chat-result-warning">{{alias}} tombe au sol. Pour se relever et marcher, il doit réussir un test <li style="margin: 0.3rem 0;"><span class="chat-result-failure">💥
d'Endurance à chaque tour. {{defenderName}}
</strong></li> tombe au sol. Pour se relever et marcher, il doit réussir un test
d'Endurance à chaque tour.</span></li>
{{/if}} {{/if}}
{{/if}} {{/if}}
{{#if (eq loc.categorie "main")}} {{#if (eq loc.categorie "main")}}
{{#if (gt blessure.system.value 1)}} {{#if (gt blessure.system.value 1)}}
<li><strong class="chat-result-warning">{{alias}} lache l'objet tenu par sa main. Il doit faire un test d'endurance <li style="margin: 0.3rem 0;"><span class="chat-result-failure">💥
pour l'utiliser désormais.</strong></li> {{defenderName}}
lâche l'objet tenu par sa main. Il doit faire un test d'endurance
pour l'utiliser désormais.</span></li>
{{/if}} {{/if}}
{{/if}} {{/if}}
{{#if (eq loc.categorie "pied")}} {{#if (eq loc.categorie "pied")}}
{{#if (gt blessure.system.value 1)}} {{#if (gt blessure.system.value 1)}}
<li><strong class="chat-result-warning">{{alias}} tombe au sol. Pour se relever et marcher, il doit réussir un test <li style="margin: 0.3rem 0;"><span class="chat-result-failure">💥
d'Endurance à chaque tour. {{defenderName}}
</strong></li> tombe au sol. Pour se relever et marcher, il doit réussir un test
d'Endurance à chaque tour.</span></li>
{{/if}} {{/if}}
{{/if}} {{/if}}
{{else}} {{else}}
<li>Aucune blessure subie par {{defenderName}}</li> <li style="margin: 0.3rem 0;"><span class="chat-result-success">✓ Aucune
blessure subie par
{{defenderName}}</span></li>
{{/if}} {{/if}}
</ul> </ul>
</div> </div>
</div>

View File

@@ -5,34 +5,40 @@
<h4 class="chat-actor-name">{{alias}}</h4> <h4 class="chat-actor-name">{{alias}}</h4>
</div> </div>
<hr> <div class="chat-roll-details" style="margin-top: 0.3rem;">
{{#if img}}
{{#if img}} <div style="text-align: center; margin-bottom: 0.3rem;">
<div>
<img class="chat-icon" src="{{arme.img}}" alt="{{name}}" /> <img class="chat-icon" src="{{arme.img}}" alt="{{name}}" />
</div> </div>
{{/if}} {{/if}}
<div> <ul style="margin: 0; padding-left: 0.5rem;">
<ul> <li style="margin: 0.2rem 0;"><span class="chat-info-badge">Dégâts de
<li>Dégats de {{arme.name}}: {{formula}} </li> {{arme.name}}:
{{formula}}</span></li>
{{#if gantelet}} {{#if gantelet}}
<li>Poing avec gantelet: +1 dégat</li> <li style="margin: 0.2rem 0;"><span class="chat-difficulty-badge">🥊 Poing
avec gantelet: +1 dégât</span></li>
{{/if}} {{/if}}
{{#if isChargeAPied}} {{#if isChargeAPied}}
<li>Charge à pied (+Course)</li> <li style="margin: 0.2rem 0;"><span class="chat-difficulty-badge">🏃
Charge à pied (+Course)</span></li>
{{/if}} {{/if}}
{{#if isChargeACheval}} {{#if isChargeACheval}}
<li>Charge à cheval (+Equitation)</li> <li style="margin: 0.2rem 0;"><span class="chat-difficulty-badge">🐴
Charge à cheval (+Équitation)</span></li>
{{/if}} {{/if}}
<li>Dégats infligés : {{degats}}</li> <li style="margin: 0.3rem 0;"><span class="chat-warning-badge">⚔️ Dégâts
infligés :
{{degats}}</span></li>
{{#if loc}} {{#if loc}}
<li>Localisation : {{loc.label}}</li> <li style="margin: 0.2rem 0;"><span class="chat-difficulty-badge">🎯
Localisation :
{{loc.label}}</span></li>
{{/if}} {{/if}}
{{#if isReussiteCritique}} {{#if isReussiteCritique}}
<li><strong class="chat-result-success">Réussite critique : La blessure sera augmentée d'un niveau</strong></li> <li style="margin: 0.3rem 0;"><span class="chat-result-success">🎯
Réussite critique : La blessure sera augmentée d'un niveau</span></li>
{{/if}} {{/if}}
</ul> </ul>
</div> </div>
</div>

View File

@@ -5,99 +5,113 @@
<h4 class="chat-actor-name">{{alias}}</h4> <h4 class="chat-actor-name">{{alias}}</h4>
</div> </div>
<hr>
{{#if img}} {{#if img}}
<div> <div style="text-align: center; padding: 0.25rem;">
<img class="chat-icon" src="{{img}}" alt="{{name}}" /> <img class="chat-icon" src="{{img}}" alt="{{name}}" style="border-radius: 4px; box-shadow: 0 2px 4px rgba(0,0,0,0.15);" />
</div> </div>
{{/if}} {{/if}}
<div class="flexcol"> <div class="chat-roll-details">
</div>
<div>
<ul> <ul>
{{#if carac}} {{#if carac}}
<li>{{carac.name}}: {{carac.qualite}} ({{carac.dice}}) </li> <li><strong>{{carac.name}}:</strong> {{carac.qualite}} <span class="chat-dice-formula">{{carac.dice}}</span></li>
{{/if}} {{/if}}
{{#if competence}} {{#if competence}}
<li>{{competence.name}}: {{compScore}} </li> <li><strong>{{competence.name}}:</strong> {{compScore}}</li>
{{/if}} {{/if}}
{{#if bonusMalus}} {{#if bonusMalus}}
<li>Bonus/Malus: {{bonusMalus}} </li> <li class="chat-info-badge"><strong>Bonus/Malus:</strong> {{bonusMalus}}</li>
{{/if}} {{/if}}
{{#if santeModifier}} {{#if santeModifier}}
<li>Santé: {{santeModifier}} niveaux</li> <li class="chat-warning-badge"><strong>Santé:</strong> {{santeModifier}} niveaux</li>
{{/if}} {{/if}}
{{#if enableProvidence}} {{#if enableProvidence}}
<li>Un niveau de Providence a été utilisé !</li> <li class="chat-info-badge" style="background: rgba(255, 215, 0, 0.2); border-left-color: goldenrod;">⭐ Un niveau de Providence a été utilisé !</li>
{{/if}}
{{#if isViser}}
<li>Bonus de visée (+1 niveau)</li>
{{/if}}
{{#if isMouvement}}
<li>Malus de cible petite ou en mouvement (-1 niveau)</li>
{{/if}}
{{#if attaqueCiblee}}
<li>Attaque ciblée, -1 niveau</li>
{{/if}}
{{#if allongeMalus}}
<li>Malus d'allonge: {{allongeMalus}} niveau</li>
{{/if}} {{/if}}
<li>Dés: {{diceFormula}} </li> {{#if hasActions}}
{{#if isTir}} <li class="chat-info-badge" data-tooltip="Nombre d'actions restantes, avec MG = Main Gauche">
<li>Portée: {{porteeLabel}} ( {{difficulty}} )</li> <strong>Actions restantes:</strong> {{remainingActions}} (MG:{{remainingActionsMainGauche}})
{{else}}
<li>Difficulté: {{difficulty}} </li>
{{/if}}
</ul>
</div>
<div class="flexrow">
<ul class="chat-result-column">
<li><strong>Résultat: {{total}}</strong> </li>
{{#if isSuccess}}
<li><strong class="chat-result-success">Succès !</strong> </li>
{{#if isReussiteCritique}}
<li data-tooltip="Si le jet n'est pas opposé, cliquez sur le bouton pour gagner 1 XP gagné en {{carac.name}}">
<strong class="chat-result-success">Réussite critique (XP potentiel) !</strong>
</li> </li>
{{/if}} {{/if}}
{{#if arme}} {{#if arme}}
<li><strong class="">Attaque réussie ! Faites une opposition avec la défense de la cible ou appliquez directement {{#if isViser}}
les dégats.</strong> </li> <li class="chat-info-badge">✓ Bonus de visée (+1 niveau)</li>
{{/if}}
{{#if isMouvement}}
<li class="chat-warning-badge">⚠ Malus de cible petite ou en mouvement (-1 niveau)</li>
{{/if}}
{{#if attaqueCiblee}}
<li class="chat-warning-badge">⚠ Attaque ciblée, -1 niveau</li>
{{/if}}
{{#if allongeMalus}}
<li class="chat-warning-badge">⚠ Malus d'allonge: {{allongeMalus}} niveau</li>
{{/if}}
{{/if}}
<li><strong>Formule:</strong> <span class="chat-dice-formula">{{diceFormula}}</span></li>
{{#if isTir}}
<li><strong>Portée:</strong> {{porteeLabel}} <span class="chat-difficulty-badge">Difficulté: {{difficulty}}</span></li>
{{else}}
<li><strong>Difficulté:</strong> <span class="chat-difficulty-badge">{{difficulty}}</span></li>
{{/if}}
</ul>
</div>
<div class="chat-roll-result-section">
<div class="chat-total-result">Résultat: {{total}}</div>
<div style="text-align: center;">
{{#if isSuccess}}
<div class="chat-result-success">Succès !</div>
{{#if isReussiteCritique}}
<div class="chat-result-success" data-tooltip="Si le jet n'est pas opposé, cliquez sur le bouton pour gagner 1 XP en {{carac.name}}" style="margin-top: 0.3rem;">
🌟 Réussite critique (XP potentiel) !
</div>
{{/if}}
{{#if arme}}
<div class="chat-info-badge" style="display: block; margin-top: 0.4rem; padding: 0.3rem; font-size: 0.9em;">
⚔️ <strong>Attaque réussie !</strong> Faites une opposition avec la défense de la cible ou appliquez directement les dégâts.
</div>
{{/if}} {{/if}}
{{else}} {{else}}
<li><strong class="chat-result-failure">Echec !</strong> </li> <div class="chat-result-failure">Échec !</div>
{{#if critiqueTotal}}
<div class="chat-negative-dice" style="margin-top: 0.3rem;">
Dé négatif: {{critiqueTotal}}
</div>
{{/if}}
{{#if isEchecCritique}} {{#if isEchecCritique}}
<li data-tooltip="Si le jet n'est pas opposé, cliquez sur le bouton pour gagner 1 XP gagné en {{carac.name}}"> <div class="chat-result-failure" data-tooltip="Si le jet n'est pas opposé, cliquez sur le bouton pour gagner 1 XP en {{carac.name}}" style="margin-top: 0.3rem;">
<strong class="chat-result-failure">Echec critique (XP potentiel) !</strong> 💀 Échec critique (XP potentiel) !
</li> </div>
{{/if}} {{/if}}
{{/if}} {{/if}}
{{#if nbEsquives}} {{#if nbEsquives}}
<li>Rappel : vous devez réussir {{nbEsquives}} tests d'esquive pour arriver au contact (règle d'allonge des armes). <div class="chat-warning-badge" style="display: block; margin-top: 0.4rem; padding: 0.3rem;">
</li> ⚠️ Rappel : vous devez réussir {{nbEsquives}} tests d'esquive pour arriver au contact (règle d'allonge des armes).
</div>
{{/if}} {{/if}}
{{#if loc}} {{#if loc}}
<li><strong>Attaque réussie !!</strong> </li> <div class="chat-info-badge" style="display: block; margin-top: 0.4rem; padding: 0.3rem; background: rgba(255, 215, 0, 0.15); border-left-color: goldenrod;">
<li>Localisation: {{loc.label}} </li> 🎯 <strong>Localisation:</strong> {{loc.label}}
</div>
{{/if}} {{/if}}
{{#if degats}} {{#if degats}}
<li>Dégats: {{degats}} {{#if isReussiteCritique}}(Augmentez la gravité de la blessure d'un niveau){{/if}}</li> <div class="chat-warning-badge" style="display: block; margin-top: 0.4rem; padding: 0.3rem; font-size: 0.95em; background: rgba(255, 100, 100, 0.15); border-left-color: #a82020;">
⚔️ <strong>Dégâts:</strong> {{degats}} {{#if isReussiteCritique}}<em>(Augmentez la gravité de la blessure d'un niveau)</em>{{/if}}
</div>
{{/if}} {{/if}}
</div>
</div>
</ul> <div class="chat-actions-bar">
<div>
{{#if (or isEchecCritique isReussiteCritique)}} {{#if (or isEchecCritique isReussiteCritique)}}
<a class="chat-command-gain-xp"> <a class="chat-command-gain-xp">
<img class="chat-command-img" data-tooltip="Cliquez ici pour +1 XP en {{carac.name}} si pas d'opposition" <img class="chat-command-img" data-tooltip="Cliquez ici pour +1 XP en {{carac.name}} si pas d'opposition"
@@ -113,14 +127,12 @@
{{#if arme}} {{#if arme}}
{{#if isSuccess}} {{#if isSuccess}}
<a class="chat-command-appliquer-degats"> <a class="chat-command-appliquer-degats">
<img class="chat-command-img" data-tooltip="Appliquer les dégats directement sans opposition" <img class="chat-command-img" data-tooltip="Appliquer les dégâts directement sans opposition"
src="systems/fvtt-te-deum/images/icons/appliquer-degats.webp"> src="systems/fvtt-te-deum/images/icons/appliquer-degats.webp">
</a> </a>
{{/if}} {{/if}}
{{/if}} {{/if}}
</div>
</div>
</div> </div>
</div> </div>

View File

@@ -8,43 +8,69 @@
<div class="flexcol"> <div class="flexcol">
<div class="flexrow"> <div class="flexrow">
<span class="roll-dialog-label">Caracteristique </span> <span class="roll-dialog-label">Caractéristique </span>
<span class="roll-dialog-label">{{carac.name}} : {{carac.qualite}} ({{carac.dice}})</span> <span class="roll-dialog-label">{{carac.name}}
:
{{carac.qualite}}
({{carac.dice}})</span>
</div> </div>
{{#if competence}} {{#if competence}}
<div class="flexrow"> <div class="flexrow">
<span class="roll-dialog-label">Compétence </span> <span class="roll-dialog-label">🎯 Compétence </span>
<span class="roll-dialog-label">{{competence.name}} ({{compScore}})</span> <span class="roll-dialog-label">{{competence.name}}
({{compScore}})</span>
</div> </div>
{{/if}} {{/if}}
{{#if santeModifier}} {{#if santeModifier}}
<div class="flexrow"> <div class="flexrow">
<span class="roll-dialog-label">Malus Blessures </span> <span class="roll-dialog-label">💔 Malus Blessures </span>
<span class="roll-dialog-label">{{santeModifier}} niveaux</span> <span class="roll-dialog-label">{{santeModifier}} niveaux</span>
</div> </div>
{{/if}} {{/if}}
<div class="flexrow"> <div class="flexrow">
<span class="roll-dialog-label">Bonus/Malus : </span> <span class="roll-dialog-label"> Bonus/Malus : </span>
<select class="" type="text" id="roll-bonus-malus" value="{{bonusMalus}}" data-dtype="Number"> <select
{{selectOptions config.bonusMalus selected=bonusMalus labelAttr="label" valueAttr="value" nameAttr="value"}} class=""
type="text"
id="roll-bonus-malus"
value="{{bonusMalus}}"
data-dtype="Number"
>
{{selectOptions
config.bonusMalus
selected=bonusMalus
labelAttr="label"
valueAttr="value"
nameAttr="value"
}}
</select> </select>
</div> </div>
{{#if providence.value}} {{#if providence.value}}
<div class="flexrow"> <div class="flexrow">
<span class="roll-dialog-label">Utiliser la Providence ({{providence.dice}})</span> <span class="roll-dialog-label">Utiliser la Providence ({{providence.dice}})</span>
<input type="checkbox" id="roll-enable-providence" {{checked enableProvidence}} /> <input
type="checkbox"
id="roll-enable-providence"
{{checked enableProvidence}}
/>
</div> </div>
{{/if}} {{/if}}
{{#if arme}} {{#if arme}}
{{#if isTir}} {{#if isTir}}
<div class="flexrow"> <div class="flexrow">
<span class="roll-dialog-label">Portée : </span> <span class="roll-dialog-label">🏹 Portée : </span>
<select class="" type="text" id="roll-portee-tir" value="{{porteeTir}}" data-dtype="String"> <select
class=""
type="text"
id="roll-portee-tir"
value="{{porteeTir}}"
data-dtype="String"
>
{{#select porteeTir}} {{#select porteeTir}}
{{#each config.ARME_PORTEES as |portee key|}} {{#each config.ARME_PORTEES as |portee key|}}
<option value="{{key}}">{{portee.label}}</option> <option value="{{key}}">{{portee.label}}</option>
@@ -53,23 +79,36 @@
</select> </select>
</div> </div>
<div class="flexrow"> <div class="flexrow">
<span class="roll-dialog-label">Viser : </span> <span class="roll-dialog-label">👁️ Viser : </span>
<input type="checkbox" id="roll-tir-viser" {{checked isViser}} /> <input type="checkbox" id="roll-tir-viser" {{checked isViser}} />
</div> </div>
<div class="flexrow"> <div class="flexrow">
<span class="roll-dialog-label">Cible petite/en mouvement : </span> <span class="roll-dialog-label">🏃 Cible petite/en mouvement : </span>
<input type="checkbox" id="roll-tir-mouvement" {{checked isMouvement}} /> <input
type="checkbox"
id="roll-tir-mouvement"
{{checked isMouvement}}
/>
</div> </div>
{{else}} {{else}}
<div class="flexrow"> <div class="flexrow">
<span class="roll-dialog-label">Allonge {{allongeLabel}} : Indiquez l'allonge de votre adversaire <span class="roll-dialog-label">⚔️ Allonge
ci-dessous.</span> {{allongeLabel}}
: Indiquez l'allonge de votre adversaire ci-dessous.</span>
</div> </div>
<div class="flexrow"> <div class="flexrow">
<span class="roll-dialog-label" <span
data-tooltip="Modification d'allonge selon votre arme et celle de votre adversaire">Allonge arme adversaire : class="roll-dialog-label"
data-tooltip="Modification d'allonge selon votre arme et celle de votre adversaire"
>🗡️ Allonge arme adversaire :
</span> </span>
<select class="" type="text" id="roll-allonge" value="{{allongeId}}" data-dtype="String"> <select
class=""
type="text"
id="roll-allonge"
value="{{allongeId}}"
data-dtype="String"
>
{{#select allongeId}} {{#select allongeId}}
{{#each allonges as |allonge key|}} {{#each allonges as |allonge key|}}
<option value="{{key}}">{{allonge.label}}</option> <option value="{{key}}">{{allonge.label}}</option>
@@ -78,17 +117,35 @@
</select> </select>
</div> </div>
<div class="flexrow"> <div class="flexrow">
<span class="roll-dialog-label">Charge à pied ?</span> <span class="roll-dialog-label">🏃 Charge à pied ?</span>
<input type="checkbox" id="roll-charge-a-pied" {{checked isChargeAPied}} /> <input
type="checkbox"
id="roll-charge-a-pied"
{{checked isChargeAPied}}
/>
</div> </div>
<div class="flexrow"> <div class="flexrow">
<span class="roll-dialog-label">Charge à cheval ?</span> <span class="roll-dialog-label">🐴 Charge à cheval ?</span>
<input type="checkbox" id="roll-charge-a-cheval" {{checked isChargeACheval}} /> <input
type="checkbox"
id="roll-charge-a-cheval"
{{checked isChargeACheval}}
/>
</div> </div>
{{/if}} {{/if}}
<div class="flexrow"> <div class="flexrow">
<span class="roll-dialog-label">Attaque ciblée (-1 Niveau): </span> <span class="roll-dialog-label">✋ Main gauche ?</span>
<select class="" type="text" id="roll-attaque-ciblee" value="{{attaqueCiblee}}" data-dtype="String"> <input type="checkbox" id="roll-main-gauche" {{checked isMainGauche}} />
</div>
<div class="flexrow">
<span class="roll-dialog-label">🎯 Attaque ciblée (-1 Niveau): </span>
<select
class=""
type="text"
id="roll-attaque-ciblee"
value="{{attaqueCiblee}}"
data-dtype="String"
>
{{#select attaqueCiblee}} {{#select attaqueCiblee}}
{{#each config.ATTAQUE_CIBLEES as |attaque key|}} {{#each config.ATTAQUE_CIBLEES as |attaque key|}}
<option value="{{key}}">{{attaque.label}}</option> <option value="{{key}}">{{attaque.label}}</option>
@@ -96,6 +153,24 @@
{{/select}} {{/select}}
</select> </select>
</div> </div>
{{else}}
<div class="flexrow">
<span class="roll-dialog-label">📊 Difficulté : </span>
<select
class=""
type="text"
id="roll-difficulty"
value="{{difficulty}}"
data-dtype="String"
>
{{selectOptions
config.difficulte
selected=difficulty
valueAttr="key"
labelAttr="label"
}}
</select>
</div>
{{/if}} {{/if}}
</div> </div>

View File

@@ -38,22 +38,22 @@
</select> </select>
</li> </li>
<h3>Spécificités</h3> <h3>⚔️ Spécificités</h3>
<li class="flexrow"> <li class="flexrow">
<label class="item-name-label-long">Dégâts</label> <label class="item-name-label-long">💥 Dégâts</label>
<input type="text" class="padd-right numeric-input item-field-label-short" <input type="text" class="padd-right numeric-input item-field-label-short"
name="system.degats" value="{{system.degats}}" data-dtype="String" /> name="system.degats" value="{{system.degats}}" data-dtype="String" />
</li> </li>
<li class="flexrow"> <li class="flexrow">
<label class="item-name-label-long">Valeur d'echec critique (ie 1 par défaut)</label> <label class="item-name-label-long">⚠️ Valeur d'échec critique (ie 1 par défaut)</label>
<input type="text" class="padd-right numeric-input item-field-label-short" <input type="text" class="padd-right numeric-input item-field-label-short"
name="system.valeurEchecCritique" value="{{system.valeurEchecCritique}}" data-dtype="Numeric" /> name="system.valeurEchecCritique" value="{{system.valeurEchecCritique}}" data-dtype="Numeric" />
</li> </li>
{{#if (eq system.typeArme "melee")}} {{#if (eq system.typeArme "melee")}}
<li class="flexrow"> <li class="flexrow">
<label class="item-name-label-long">Allonge</label> <label class="item-name-label-long">🗡️ Allonge</label>
<select name="system.allonge"> <select name="system.allonge">
{{selectOptions config.armeAllonges selected=system.allonge labelAttr="label"}} {{selectOptions config.armeAllonges selected=system.allonge labelAttr="label"}}
</select> </select>
@@ -62,12 +62,12 @@
{{#if (eq system.typeArme "tir")}} {{#if (eq system.typeArme "tir")}}
<li class="flexrow"> <li class="flexrow">
<label class="item-name-label-long">Temps de recharge</label> <label class="item-name-label-long">⏱️ Temps de recharge</label>
<input type="text" class="padd-right numeric-input item-field-label-short" <input type="text" class="padd-right numeric-input item-field-label-short"
name="system.tempsRecharge" value="{{system.tempsRecharge}}" data-dtype="Number" /> name="system.tempsRecharge" value="{{system.tempsRecharge}}" data-dtype="Number" />
</li> </li>
<li class="flexrow"> <li class="flexrow">
<label class="item-name-label-long">Compétence de recharge</label> <label class="item-name-label-long">🔄 Compétence de recharge</label>
<select name="system.competenceRecharge"> <select name="system.competenceRecharge">
{{selectOptions config.competencesRecharge selected=system.competenceRecharge labelAttr="label"}} {{selectOptions config.competencesRecharge selected=system.competenceRecharge labelAttr="label"}}
</select> </select>
@@ -90,7 +90,7 @@
{{/each}} {{/each}}
{{#if (eq system.typeArme "tir")}} {{#if (eq system.typeArme "tir")}}
<h3>Portées</h3> <h3>🎯 Portées</h3>
{{#each system.portees as |portee porteeId|}} {{#each system.portees as |portee porteeId|}}
<li class="flexrow"> <li class="flexrow">
<label class="item-name-label-long">{{getConfigLabel "ARME_PORTEES" porteeId}}</label> <label class="item-name-label-long">{{getConfigLabel "ARME_PORTEES" porteeId}}</label>
@@ -100,7 +100,7 @@
{{/each}} {{/each}}
{{/if}} {{/if}}
<h3>Degats sur armures</h3> <h3>🛡️ Degats sur armures</h3>
{{#each system.degatsArmure as |degat degtId|}} {{#each system.degatsArmure as |degat degtId|}}
<li class="flexrow"> <li class="flexrow">
<label class="item-name-label-long">{{getConfigLabel "degatsArmure" degtId}}</label> <label class="item-name-label-long">{{getConfigLabel "degatsArmure" degtId}}</label>
@@ -109,21 +109,21 @@
</li> </li>
{{/each}} {{/each}}
<h3>Autres</h3> <h3>📝 Autres</h3>
<li class="flexrow"> <li class="flexrow">
<label class="item-name-label-long">Equipé?</label> <label class="item-name-label-long">Equipé?</label>
<input type="checkbox" name="system.equipe" {{checked system.equipe}} /> <input type="checkbox" name="system.equipe" {{checked system.equipe}} />
</li> </li>
<li class="flexrow"> <li class="flexrow">
<label class="item-name-label-long">Bonus d'Initiative</label> <label class="item-name-label-long">Bonus d'Initiative</label>
<input type="text" class="padd-right numeric-input item-field-label-short" <input type="text" class="padd-right numeric-input item-field-label-short"
name="system.initiativeBonus" value="{{system.initiativeBonus}}" data-dtype="Number" /> name="system.initiativeBonus" value="{{system.initiativeBonus}}" data-dtype="Number" />
</li> </li>
<li class="flexrow"> <li class="flexrow">
<label class="item-name-label-long">Prix</label> <label class="item-name-label-long">💰 Prix</label>
<input type="text" class="padd-right numeric-input item-field-label-short" <input type="text" class="padd-right numeric-input item-field-label-short"
name="system.prix" value="{{system.prix}}" data-dtype="Number" /> name="system.prix" value="{{system.prix}}" data-dtype="Number" />
<select name="system.monnaie"> <select name="system.monnaie">

View File

@@ -33,13 +33,13 @@
{{/each}} {{/each}}
<li class="flexrow"> <li class="flexrow">
<label class="item-name-label-long">Protection</label> <label class="item-name-label-long">🛡️ Protection</label>
<input type="text" class="padd-right numeric-input item-field-label-short" <input type="text" class="padd-right numeric-input item-field-label-short"
name="system.protection" value="{{system.protection}}" data-dtype="Number" /> name="system.protection" value="{{system.protection}}" data-dtype="Number" />
</li> </li>
<li class="flexrow"> <li class="flexrow">
<label class="item-name-label-long">Cout en pièces d'Armure Lourde</label> <label class="item-name-label-long">⚖️ Cout en pièces d'Armure Lourde</label>
<input type="text" class="padd-right numeric-input item-field-label-short" <input type="text" class="padd-right numeric-input item-field-label-short"
name="system.coutArmureLourde" value="{{system.coutArmureLourde}}" data-dtype="Number" /> name="system.coutArmureLourde" value="{{system.coutArmureLourde}}" data-dtype="Number" />
</li> </li>
@@ -57,12 +57,12 @@
</li> </li>
<li class="flexrow"> <li class="flexrow">
<label class="item-name-label-long">Equipé?</label> <label class="item-name-label-long">Equipé?</label>
<input type="checkbox" name="system.equipe" {{checked system.equipe}} /> <input type="checkbox" name="system.equipe" {{checked system.equipe}} />
</li> </li>
<li class="flexrow"> <li class="flexrow">
<label class="item-name-label-long">Prix</label> <label class="item-name-label-long">💰 Prix</label>
<input type="text" class="padd-right numeric-input item-field-label-short" <input type="text" class="padd-right numeric-input item-field-label-short"
name="system.prix" value="{{system.prix}}" data-dtype="Number" /> name="system.prix" value="{{system.prix}}" data-dtype="Number" />
<select name="system.monnaie"> <select name="system.monnaie">

View File

@@ -18,13 +18,13 @@
<ul> <ul>
<li class="flexrow"> <li class="flexrow">
<label class="item-name-label-long">Type de Blessure</label> <label class="item-name-label-long">🩸 Type de Blessure</label>
<select name="system.typeBlessure"> <select name="system.typeBlessure">
{{selectOptions config.blessures selected=system.typeBlessure valueAttr="key" nameAttr="key" labelAttr="label"}} {{selectOptions config.blessures selected=system.typeBlessure valueAttr="key" nameAttr="key" labelAttr="label"}}
</select> </select>
</li> </li>
<li class="flexrow"> <li class="flexrow">
<label class="item-name-label-long">Localisation</label> <label class="item-name-label-long">🎯 Localisation</label>
<select name="system.localisation"> <select name="system.localisation">
{{selectOptions config.LOCALISATION selected=system.localisation valueAttr="id" nameAttr="id" labelAttr="label"}} {{selectOptions config.LOCALISATION selected=system.localisation valueAttr="id" nameAttr="id" labelAttr="label"}}
</select> </select>

View File

@@ -19,19 +19,19 @@
<div class="tab" data-group="primary"> <div class="tab" data-group="primary">
<ul> <ul>
<li class="flexrow"> <li class="flexrow">
<label class="item-name-label-long">Caractéristique</label> <label class="item-name-label-long">Caractéristique</label>
<select name="system.caracteristique"> <select name="system.caracteristique">
{{selectOptions config.caracteristiques selected=system.caracteristique labelAttr="label" blank=""}} {{selectOptions config.caracteristiques selected=system.caracteristique labelAttr="label" blank=""}}
</select> </select>
</li> </li>
<li class="flexrow"> <li class="flexrow">
<label class="item-name-label-long">Compétence de base</label> <label class="item-name-label-long">🎯 Compétence de base</label>
<input type="checkbox" name="system.isBase" {{checked system.isBase}} /> <input type="checkbox" name="system.isBase" {{checked system.isBase}} />
</li> </li>
<li class="flexrow"> <li class="flexrow">
<label class="item-name-label-long">Score</label> <label class="item-name-label-long">📊 Score</label>
<input type="text" class="padd-right numeric-input item-field-label-short" <input type="text" class="padd-right numeric-input item-field-label-short"
name="system.score" value="{{system.score}}" data-dtype="Number" {{#if system.isBase}}disabled{{/if}}/> name="system.score" value="{{system.score}}" data-dtype="Number" {{#if system.isBase}}disabled{{/if}}/>
</li> </li>

View File

@@ -21,7 +21,7 @@
<li class="flexrow"> <li class="flexrow">
<label class="item-name-label-long">Prix</label> <label class="item-name-label-long">💰 Prix</label>
<input type="text" class="padd-right numeric-input item-field-label-short" <input type="text" class="padd-right numeric-input item-field-label-short"
name="system.prix" value="{{system.prix}}" data-dtype="Number" /> name="system.prix" value="{{system.prix}}" data-dtype="Number" />
<select name="system.monnaie"> <select name="system.monnaie">

View File

@@ -25,25 +25,25 @@
<div class="tab details" data-group="primary" data-tab="details"> <div class="tab details" data-group="primary" data-tab="details">
<h4 class="item-name-label-long">Vertus médicinales</h4> <h4 class="item-name-label-long">🌿 Vertus médicinales</h4>
<textarea name="system.vertus" rows="6" data-dtype="String"> <textarea name="system.vertus" rows="6" data-dtype="String">
{{{system.vertus}}} {{{system.vertus}}}
</textarea> </textarea>
<h4 class="item-name-label-long">Toxicité</h4> <h4 class="item-name-label-long">☠️ Toxicité</h4>
<textarea name="system.toxicite" rows="6" data-dtype="String"> <textarea name="system.toxicite" rows="6" data-dtype="String">
{{{system.toxicite}}} {{{system.toxicite}}}
</textarea> </textarea>
<ul> <ul>
<li class="flexrow"> <li class="flexrow">
<label class="item-name-label-long">Difficulté au test d'Endurance</label> <label class="item-name-label-long">💪 Difficulté au test d'Endurance</label>
<select class="" type="text" name="system.difficulteEndurance" data-dtype="String"> <select class="" type="text" name="system.difficulteEndurance" data-dtype="String">
{{selectOptions config.difficulte selected=system.difficulteEndurance abelAttr="label"}} {{selectOptions config.difficulte selected=system.difficulteEndurance abelAttr="label"}}
</select> </select>
</li> </li>
<li class="flexrow"> <li class="flexrow">
<label class="item-name-label-long">Virulence</label> <label class="item-name-label-long">🔥 Virulence</label>
<select name="system.virulence"> <select name="system.virulence">
{{selectOptions config.virulencePoison selected=system.virulence labelAttr="label"}} {{selectOptions config.virulencePoison selected=system.virulence labelAttr="label"}}
</select> </select>

View File

@@ -0,0 +1,26 @@
<h3 class="welcome-message-h3">Bonjour à tous !</h3>
<div class="message-chat-center">
Open Sesame Game a mis en place un nouveau Discord pour ceux ou celles qui
souhaiteraient participer plus activement à la communauté des jeux d'Open
Sesame Games, avec un espace dédié à Te Deum ! <br />
Nouveaux joueurs comme vétérans sont les bienvenus, n'hésitez pas à passer
pour papoter, profiter de nos ressources, ou suivre les nouvelles d'OSG plus
directement. Cliquez ici :<br />
<a href="https://discord.gg/dUPhNfJdaD">https://discord.gg/dUPhNfJdaD</a
><br />
</div>
<div class="message-chat-center">
Ce système vous est proposé par Open Sesame Games.<br />
Vous trouverez de l'aide dans
@UUID[Compendium.fvtt-te-deum.aides.JournalEntry.uNwJgi4kXBCiZmAH]{Aide pour
Te Deum}<br />
ainsi que sur le Discord de Foundry FR :
<a href="https://discord.gg/pPSDNJk">https://discord.gg/pPSDNJk</a>
</div>
<div>
Merci pour votre attention et à très bientôt pour la suite ! L'équipe Open
Sesame Games
</div>