Rework des fiches creature/PJ et Tinji/Loksyu

This commit is contained in:
2026-03-30 16:36:38 +02:00
parent 0689fae792
commit cab77645b7
70 changed files with 1712 additions and 1075 deletions
+41 -25
View File
@@ -1,7 +1,7 @@
import { ACTOR_TYPES, ITEM_TYPES, MAGICS, SUBTYPES, SYSTEM_ID } from "./config/constants.js"
import { preLocalizeConfig } from "./config/localize.js"
import { configureRuntime } from "./config/runtime.js"
import { CharacterDataModel, LoksyuDataModel, NpcDataModel, TinjiDataModel } from "./data/actors/index.js"
import { CharacterDataModel, NpcDataModel } from "./data/actors/index.js"
import { EquipmentDataModel, KungfuDataModel, SpellDataModel, SupernaturalDataModel, WeaponDataModel, ArmorDataModel, SanheiDataModel, IngredientDataModel } from "./data/items/index.js"
import { CDEMessage } from "./documents/chat-message.js"
import { CDEActor } from "./documents/actor.js"
@@ -9,11 +9,12 @@ import { CDEItem } from "./documents/item.js"
import { registerDice } from "./ui/dice.js"
import { registerHandlebarsHelpers } from "./ui/helpers.js"
import { preloadPartials } from "./ui/templates.js"
import { CDELoksyuSheet, CDECharacterSheet, CDENpcSheet, CDETinjiSheet } from "./ui/sheets/actors/index.js"
import { CDECharacterSheet, CDENpcSheet } from "./ui/sheets/actors/index.js"
import { CDEItemSheet, CDEKungfuSheet, CDESpellSheet, CDESupernaturalSheet, CDEWeaponSheet, CDEArmorSheet, CDESanheiSheet, CDEIngredientSheet } from "./ui/sheets/items/index.js"
import { CDELoksyuApp } from "./ui/apps/loksyu-app.js"
import { CDETinjiApp } from "./ui/apps/tinji-app.js"
import { migrateIfNeeded, registerSettings } from "./migration.js"
import { injectRollActions, refreshAllRollActions } from "./ui/roll-actions.js"
Hooks.once("i18nInit", preLocalizeConfig)
@@ -24,11 +25,12 @@ Hooks.once("init", async () => {
game.system.CONST = { MAGICS, SUBTYPES }
// Expose standalone apps globally for macros
game.cde = { CDELoksyuApp, CDETinjiApp }
CONFIG.Actor.dataModels = {
[ACTOR_TYPES.character]: CharacterDataModel,
[ACTOR_TYPES.npc]: NpcDataModel,
[ACTOR_TYPES.tinji]: TinjiDataModel,
[ACTOR_TYPES.loksyu]: LoksyuDataModel,
}
CONFIG.Item.dataModels = {
[ITEM_TYPES.item]: EquipmentDataModel,
@@ -47,8 +49,8 @@ Hooks.once("init", async () => {
configureRuntime()
foundry.applications.apps.DocumentSheetConfig.unregisterSheet(Actor, "core", ActorSheet)
foundry.applications.apps.DocumentSheetConfig.unregisterSheet(Item, "core", ItemSheet)
foundry.applications.apps.DocumentSheetConfig.unregisterSheet(Actor, "core", foundry.appv1.sheets.ActorSheet)
foundry.applications.apps.DocumentSheetConfig.unregisterSheet(Item, "core", foundry.appv1.sheets.ItemSheet)
foundry.applications.apps.DocumentSheetConfig.registerSheet(Actor, SYSTEM_ID, CDECharacterSheet, {
types: [ACTOR_TYPES.character],
@@ -60,16 +62,6 @@ Hooks.once("init", async () => {
makeDefault: true,
label: "CDE NPC Sheet (V2)",
})
foundry.applications.apps.DocumentSheetConfig.registerSheet(Actor, SYSTEM_ID, CDETinjiSheet, {
types: [ACTOR_TYPES.tinji],
makeDefault: true,
label: "CDE Tinji Sheet (V2)",
})
foundry.applications.apps.DocumentSheetConfig.registerSheet(Actor, SYSTEM_ID, CDELoksyuSheet, {
types: [ACTOR_TYPES.loksyu],
makeDefault: true,
label: "CDE Loksyu Sheet (V2)",
})
foundry.applications.apps.DocumentSheetConfig.registerSheet(Item, SYSTEM_ID, CDEItemSheet, {
types: [ITEM_TYPES.item],
@@ -124,26 +116,50 @@ Hooks.once("ready", async () => {
await migrateIfNeeded()
})
/** Add Loksyu + Tin Ji quick-access buttons to the chat footer */
/** Add Loksyu + Tin Ji quick-access buttons to the chat panel (FoundryVTT v13) */
Hooks.on("renderChatLog", (_app, html) => {
const el = html instanceof HTMLElement ? html : html[0]
const controls = el?.querySelector?.(".chat-controls")
if (!controls) return
const el = html instanceof HTMLElement ? html : (html[0] ?? html)
if (!el?.querySelector) return
// Avoid double-injection on re-renders
if (el.querySelector(".cde-chat-app-buttons")) return
const wrapper = document.createElement("div")
wrapper.classList.add("cde-chat-app-buttons")
wrapper.innerHTML = `
<button class="cde-chat-btn cde-chat-btn--loksyu" title="${game.i18n.localize("CDE.Loksyu")}">
<button type="button" class="cde-chat-btn cde-chat-btn--loksyu">
<i class="fas fa-yin-yang"></i> ${game.i18n.localize("CDE.Loksyu")}
</button>
<button class="cde-chat-btn cde-chat-btn--tinji" title="${game.i18n.localize("CDE.TinJi2")}">
<button type="button" class="cde-chat-btn cde-chat-btn--tinji">
<i class="fas fa-star"></i> ${game.i18n.localize("CDE.TinJi2")}
</button>
`
controls.appendChild(wrapper)
wrapper.querySelector(".cde-chat-btn--loksyu")?.addEventListener("click", () => CDELoksyuApp.open())
wrapper.querySelector(".cde-chat-btn--tinji")?.addEventListener("click", () => CDETinjiApp.open())
// Use event delegation to avoid being swallowed by Foundry's own handlers
wrapper.addEventListener("click", (ev) => {
if (ev.target.closest(".cde-chat-btn--loksyu")) CDELoksyuApp.open()
if (ev.target.closest(".cde-chat-btn--tinji")) CDETinjiApp.open()
})
// Insert before the chat form — works on v12 and v13
const anchor = el.querySelector(".chat-form")
?? el.querySelector(".chat-message-form")
?? el.querySelector("form")
if (anchor) anchor.parentElement.insertBefore(wrapper, anchor)
else el.appendChild(wrapper)
})
/** Inject Loksyu / TinJi action buttons into roll-result chat messages */
Hooks.on("renderChatMessageHTML", (message, html) => {
injectRollActions(message, html)
})
/** Refresh all visible roll-result buttons whenever Loksyu or TinJi settings change */
Hooks.on("updateSetting", setting => {
if (!setting.key) return
if (setting.key.includes("loksyuData") || setting.key.includes("tinjiData")) {
refreshAllRollActions()
}
})
function injectCompendiumLink(html) {