Refactor des fiches de creatures
This commit is contained in:
@@ -860,6 +860,72 @@ section.npc .cde-neon-tabs .item.active {
|
|||||||
.cde-aptitudes-table .cde-spec-cell {
|
.cde-aptitudes-table .cde-spec-cell {
|
||||||
flex: 1 1 0;
|
flex: 1 1 0;
|
||||||
}
|
}
|
||||||
|
.cde-aptitudes-table .cde-roll-cell {
|
||||||
|
width: 28px;
|
||||||
|
flex-shrink: 0;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
.cde-aptitudes-table .cde-roll-cell .cde-roll-trigger {
|
||||||
|
display: inline-flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
width: 24px;
|
||||||
|
height: 24px;
|
||||||
|
color: #7d94b8;
|
||||||
|
border-radius: 4px;
|
||||||
|
transition: color 0.15s, background 0.15s;
|
||||||
|
}
|
||||||
|
.cde-aptitudes-table .cde-roll-cell .cde-roll-trigger:hover {
|
||||||
|
color: #cc44ff;
|
||||||
|
background: rgba(204, 68, 255, 0.12);
|
||||||
|
}
|
||||||
|
.cde-empty-list {
|
||||||
|
color: #7d94b8;
|
||||||
|
font-style: italic;
|
||||||
|
font-size: 11px;
|
||||||
|
text-align: center;
|
||||||
|
padding: 10px 0;
|
||||||
|
}
|
||||||
|
.cde-supernatural-list .cde-supernatural-item {
|
||||||
|
background: rgba(16, 22, 34, 0.6);
|
||||||
|
border: 1px solid #1a2436;
|
||||||
|
border-radius: 4px;
|
||||||
|
margin-bottom: 6px;
|
||||||
|
padding: 6px;
|
||||||
|
list-style: none;
|
||||||
|
}
|
||||||
|
.cde-supernatural-list .cde-supernatural-header {
|
||||||
|
align-items: center;
|
||||||
|
gap: 8px;
|
||||||
|
}
|
||||||
|
.cde-supernatural-list .cde-supernatural-header img {
|
||||||
|
border-radius: 4px;
|
||||||
|
flex-shrink: 0;
|
||||||
|
}
|
||||||
|
.cde-supernatural-list .cde-supernatural-info {
|
||||||
|
flex: 1 1 0;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: 6px;
|
||||||
|
min-width: 0;
|
||||||
|
}
|
||||||
|
.cde-supernatural-list .cde-supernatural-info .cde-supernatural-name {
|
||||||
|
font-size: 12px;
|
||||||
|
font-weight: 600;
|
||||||
|
white-space: nowrap;
|
||||||
|
overflow: hidden;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
}
|
||||||
|
.cde-supernatural-list .cde-supernatural-desc {
|
||||||
|
font-size: 10px;
|
||||||
|
color: #7d94b8;
|
||||||
|
margin-top: 4px;
|
||||||
|
padding-left: 36px;
|
||||||
|
line-height: 1.4;
|
||||||
|
}
|
||||||
|
.cde-supernatural-list .cde-supernatural-desc p {
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
.cde-npc-tracks {
|
.cde-npc-tracks {
|
||||||
margin-top: 12px;
|
margin-top: 12px;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -891,6 +891,82 @@ section.npc .cde-neon-tabs .item.active { color: @cde-supernatural; borde
|
|||||||
.cde-aptitudes-table {
|
.cde-aptitudes-table {
|
||||||
// Inherits .cde-skills-table styles; just ensure consistent width
|
// Inherits .cde-skills-table styles; just ensure consistent width
|
||||||
.cde-spec-cell { flex: 1 1 0; }
|
.cde-spec-cell { flex: 1 1 0; }
|
||||||
|
|
||||||
|
.cde-roll-cell {
|
||||||
|
width: 28px;
|
||||||
|
flex-shrink: 0;
|
||||||
|
text-align: center;
|
||||||
|
|
||||||
|
.cde-roll-trigger {
|
||||||
|
display: inline-flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
width: 24px;
|
||||||
|
height: 24px;
|
||||||
|
color: @cde-muted;
|
||||||
|
border-radius: 4px;
|
||||||
|
transition: color 0.15s, background 0.15s;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
color: @cde-supernatural;
|
||||||
|
background: fade(@cde-supernatural, 12%);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Empty list placeholder
|
||||||
|
.cde-empty-list {
|
||||||
|
color: @cde-muted;
|
||||||
|
font-style: italic;
|
||||||
|
font-size: 11px;
|
||||||
|
text-align: center;
|
||||||
|
padding: 10px 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// NPC supernatural item cards
|
||||||
|
.cde-supernatural-list {
|
||||||
|
.cde-supernatural-item {
|
||||||
|
background: fade(@cde-surface, 60%);
|
||||||
|
border: 1px solid @cde-border;
|
||||||
|
border-radius: 4px;
|
||||||
|
margin-bottom: 6px;
|
||||||
|
padding: 6px;
|
||||||
|
list-style: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.cde-supernatural-header {
|
||||||
|
align-items: center;
|
||||||
|
gap: 8px;
|
||||||
|
|
||||||
|
img { border-radius: 4px; flex-shrink: 0; }
|
||||||
|
}
|
||||||
|
|
||||||
|
.cde-supernatural-info {
|
||||||
|
flex: 1 1 0;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: 6px;
|
||||||
|
min-width: 0;
|
||||||
|
|
||||||
|
.cde-supernatural-name {
|
||||||
|
font-size: 12px;
|
||||||
|
font-weight: 600;
|
||||||
|
white-space: nowrap;
|
||||||
|
overflow: hidden;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.cde-supernatural-desc {
|
||||||
|
font-size: 10px;
|
||||||
|
color: @cde-muted;
|
||||||
|
margin-top: 4px;
|
||||||
|
padding-left: 36px;
|
||||||
|
line-height: 1.4;
|
||||||
|
|
||||||
|
p { margin: 0; }
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// NPC vitality / hei tracker
|
// NPC vitality / hei tracker
|
||||||
|
|||||||
116
dist/system.js
vendored
116
dist/system.js
vendored
@@ -740,6 +740,11 @@ function registerHandlebarsHelpers() {
|
|||||||
Handlebars.registerHelper("getElementIcon", function(aspect) {
|
Handlebars.registerHelper("getElementIcon", function(aspect) {
|
||||||
const icons = {
|
const icons = {
|
||||||
metal: "/systems/fvtt-chroniques-de-l-etrange/images/cde_metal.webp",
|
metal: "/systems/fvtt-chroniques-de-l-etrange/images/cde_metal.webp",
|
||||||
|
water: "/systems/fvtt-chroniques-de-l-etrange/images/cde_eau.webp",
|
||||||
|
earth: "/systems/fvtt-chroniques-de-l-etrange/images/cde_terre.webp",
|
||||||
|
fire: "/systems/fvtt-chroniques-de-l-etrange/images/cde_feu.webp",
|
||||||
|
wood: "/systems/fvtt-chroniques-de-l-etrange/images/cde_bois.webp",
|
||||||
|
// legacy French keys
|
||||||
eau: "/systems/fvtt-chroniques-de-l-etrange/images/cde_eau.webp",
|
eau: "/systems/fvtt-chroniques-de-l-etrange/images/cde_eau.webp",
|
||||||
terre: "/systems/fvtt-chroniques-de-l-etrange/images/cde_terre.webp",
|
terre: "/systems/fvtt-chroniques-de-l-etrange/images/cde_terre.webp",
|
||||||
feu: "/systems/fvtt-chroniques-de-l-etrange/images/cde_feu.webp",
|
feu: "/systems/fvtt-chroniques-de-l-etrange/images/cde_feu.webp",
|
||||||
@@ -825,7 +830,7 @@ function buildNPCOptions(sys) {
|
|||||||
function readInitFields(dialog) {
|
function readInitFields(dialog) {
|
||||||
const root = dialog.element ?? dialog;
|
const root = dialog.element ?? dialog;
|
||||||
const selectedKey = root.querySelector("select[name='firstaction']")?.value ?? "";
|
const selectedKey = root.querySelector("select[name='firstaction']")?.value ?? "";
|
||||||
const modifier = parseInt(root.querySelector("input[name='modifier']")?.value ?? 0) || 0;
|
const modifier = parseInt(root.querySelector("input[name='modifier']")?.value ?? "0", 10) || 0;
|
||||||
return { selectedKey, modifier };
|
return { selectedKey, modifier };
|
||||||
}
|
}
|
||||||
async function sendInitChatMessage({ actor, baseName, baseValue, actionName, actionValue, modifier, initiative, antiInitiative }) {
|
async function sendInitChatMessage({ actor, baseName, baseValue, actionName, actionValue, modifier, initiative, antiInitiative }) {
|
||||||
@@ -1139,6 +1144,10 @@ async function rollForActor(actor, rollKey) {
|
|||||||
numberofdice = sys.aspect[skillLibel]?.value ?? 0;
|
numberofdice = sys.aspect[skillLibel]?.value ?? 0;
|
||||||
title = game.i18n.localize(sys.aspect[skillLibel]?.label ?? "CDE.Roll");
|
title = game.i18n.localize(sys.aspect[skillLibel]?.label ?? "CDE.Roll");
|
||||||
break;
|
break;
|
||||||
|
case "aptitude":
|
||||||
|
numberofdice = sys.aptitudes?.[skillLibel]?.value ?? 0;
|
||||||
|
title = game.i18n.localize(`CDE.${skillLibel.charAt(0).toUpperCase() + skillLibel.slice(1)}`);
|
||||||
|
break;
|
||||||
case "skill":
|
case "skill":
|
||||||
numberofdice = sys.skills[skillLibel]?.value ?? 0;
|
numberofdice = sys.skills[skillLibel]?.value ?? 0;
|
||||||
title = game.i18n.localize(sys.skills[skillLibel]?.label ?? "CDE.Roll");
|
title = game.i18n.localize(sys.skills[skillLibel]?.label ?? "CDE.Roll");
|
||||||
@@ -1180,7 +1189,7 @@ async function rollForActor(actor, rollKey) {
|
|||||||
ui.notifications.warn(game.i18n.localize("CDE.Error6"));
|
ui.notifications.warn(game.i18n.localize("CDE.Error6"));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
title = `${game.i18n.localize(MAGIC_I18N_KEYS[skillLibel] ?? "CDE.Magics")} [${game.i18n.localize(game.system.CONST?.MAGICS?.[skillLibel]?.speciality?.[specialLibel]?.label ?? "")}]`;
|
title = `${game.i18n.localize(MAGIC_I18N_KEYS[skillLibel] ?? "CDE.Magics")} [${game.i18n.localize(MAGICS?.[skillLibel]?.speciality?.[specialLibel]?.label ?? "")}]`;
|
||||||
break;
|
break;
|
||||||
case "itemkungfu": {
|
case "itemkungfu": {
|
||||||
const kfItem = actor.items.get(skillLibel);
|
const kfItem = actor.items.get(skillLibel);
|
||||||
@@ -1318,7 +1327,7 @@ async function rollForActor(actor, rollKey) {
|
|||||||
}
|
}
|
||||||
let defaultSpecialAspect = 0;
|
let defaultSpecialAspect = 0;
|
||||||
if (isMagicSpecial && specialLibel) {
|
if (isMagicSpecial && specialLibel) {
|
||||||
const specialCfg = game.system.CONST?.MAGICS?.[skillLibel]?.speciality?.[specialLibel];
|
const specialCfg = MAGICS?.[skillLibel]?.speciality?.[specialLibel];
|
||||||
const aspectName = LABELELEMENT_TO_ASPECT[specialCfg?.labelelement];
|
const aspectName = LABELELEMENT_TO_ASPECT[specialCfg?.labelelement];
|
||||||
if (aspectName) {
|
if (aspectName) {
|
||||||
defaultSpecialAspect = ASPECT_NAMES.indexOf(aspectName);
|
defaultSpecialAspect = ASPECT_NAMES.indexOf(aspectName);
|
||||||
@@ -1454,7 +1463,8 @@ var CDEBaseActorSheet = class _CDEBaseActorSheet extends HandlebarsApplicationMi
|
|||||||
actions: {
|
actions: {
|
||||||
create: _CDEBaseActorSheet.#onItemCreate,
|
create: _CDEBaseActorSheet.#onItemCreate,
|
||||||
edit: _CDEBaseActorSheet.#onItemEdit,
|
edit: _CDEBaseActorSheet.#onItemEdit,
|
||||||
delete: _CDEBaseActorSheet.#onItemDelete
|
delete: _CDEBaseActorSheet.#onItemDelete,
|
||||||
|
editImage: _CDEBaseActorSheet.#onEditImage
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
tabGroups = { primary: "description" };
|
tabGroups = { primary: "description" };
|
||||||
@@ -1462,7 +1472,7 @@ var CDEBaseActorSheet = class _CDEBaseActorSheet extends HandlebarsApplicationMi
|
|||||||
return this.document.name;
|
return this.document.name;
|
||||||
}
|
}
|
||||||
async _prepareContext() {
|
async _prepareContext() {
|
||||||
const descriptionHTML = await foundry.applications.ux.TextEditor.implementation.enrichHTML(this.document.system.description ?? "", { async: true });
|
const descriptionHTML = await TextEditor.enrichHTML(this.document.system.description ?? "", { async: true });
|
||||||
const cssClass = this.options.classes?.join(" ") ?? "";
|
const cssClass = this.options.classes?.join(" ") ?? "";
|
||||||
return {
|
return {
|
||||||
actor: this.document,
|
actor: this.document,
|
||||||
@@ -1514,6 +1524,20 @@ var CDEBaseActorSheet = class _CDEBaseActorSheet extends HandlebarsApplicationMi
|
|||||||
const item = this.document.items.get(itemId);
|
const item = this.document.items.get(itemId);
|
||||||
if (item) item.delete();
|
if (item) item.delete();
|
||||||
}
|
}
|
||||||
|
static async #onEditImage(event, target) {
|
||||||
|
const attr = target.dataset.edit;
|
||||||
|
const current = foundry.utils.getProperty(this.document, attr);
|
||||||
|
const { img } = this.document.constructor.getDefaultArtwork?.(this.document.toObject()) ?? {};
|
||||||
|
const fp = new FilePicker({
|
||||||
|
current,
|
||||||
|
type: "image",
|
||||||
|
redirectToRoot: img ? [img] : [],
|
||||||
|
callback: (path) => this.document.update({ [attr]: path }),
|
||||||
|
top: this.position.top + 40,
|
||||||
|
left: this.position.left + 10
|
||||||
|
});
|
||||||
|
return fp.browse();
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
// src/ui/sheets/actors/character.js
|
// src/ui/sheets/actors/character.js
|
||||||
@@ -1564,7 +1588,7 @@ var CDECharacterSheet = class extends CDEBaseActorSheet {
|
|||||||
return context;
|
return context;
|
||||||
}
|
}
|
||||||
_onRender(context, options) {
|
_onRender(context, options) {
|
||||||
super._onRender?.(context, options);
|
super._onRender(context, options);
|
||||||
this.#bindInitiativeControls();
|
this.#bindInitiativeControls();
|
||||||
this.#bindPrefs();
|
this.#bindPrefs();
|
||||||
this.#bindRollButtons();
|
this.#bindRollButtons();
|
||||||
@@ -1602,7 +1626,7 @@ var CDECharacterSheet = class extends CDEBaseActorSheet {
|
|||||||
<form class="flexcol">
|
<form class="flexcol">
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label>${game.i18n.localize("CDE.ThrowType")}</label>
|
<label>${game.i18n.localize("CDE.ThrowType")}</label>
|
||||||
<select name="choice" value="${current.choice}">
|
<select name="choice">
|
||||||
<option value="0"${current.choice === "0" ? " selected" : ""}>0</option>
|
<option value="0"${current.choice === "0" ? " selected" : ""}>0</option>
|
||||||
<option value="1"${current.choice === "1" ? " selected" : ""}>1</option>
|
<option value="1"${current.choice === "1" ? " selected" : ""}>1</option>
|
||||||
<option value="2"${current.choice === "2" ? " selected" : ""}>2</option>
|
<option value="2"${current.choice === "2" ? " selected" : ""}>2</option>
|
||||||
@@ -1614,15 +1638,19 @@ var CDECharacterSheet = class extends CDEBaseActorSheet {
|
|||||||
<input type="checkbox" name="check" ${current.check ? "checked" : ""}/>
|
<input type="checkbox" name="check" ${current.check ? "checked" : ""}/>
|
||||||
</div>
|
</div>
|
||||||
</form>`;
|
</form>`;
|
||||||
const prefs = await Dialog.prompt({
|
const prefs = await foundry.applications.api.DialogV2.prompt({
|
||||||
title: game.i18n.localize("CDE.Preferences"),
|
window: { title: game.i18n.localize("CDE.Preferences") },
|
||||||
content: html,
|
content: html,
|
||||||
|
rejectClose: false,
|
||||||
|
ok: {
|
||||||
label: game.i18n.localize("CDE.Validate"),
|
label: game.i18n.localize("CDE.Validate"),
|
||||||
callback: (dlg) => {
|
callback: (_ev, _btn, dialog) => {
|
||||||
const choice = dlg.querySelector("select[name='choice']")?.value ?? "0";
|
const root = dialog.element ?? dialog;
|
||||||
const check = dlg.querySelector("input[name='check']")?.checked ?? false;
|
const choice = root.querySelector("select[name='choice']")?.value ?? "0";
|
||||||
|
const check = root.querySelector("input[name='check']")?.checked ?? false;
|
||||||
return { choice, check };
|
return { choice, check };
|
||||||
}
|
}
|
||||||
|
}
|
||||||
});
|
});
|
||||||
if (prefs) {
|
if (prefs) {
|
||||||
await this.document.update({
|
await this.document.update({
|
||||||
@@ -1675,7 +1703,7 @@ var CDECharacterSheet = class extends CDEBaseActorSheet {
|
|||||||
speaker: ChatMessage.getSpeaker({ actor: this.document }),
|
speaker: ChatMessage.getSpeaker({ actor: this.document }),
|
||||||
content,
|
content,
|
||||||
rolls: [roll],
|
rolls: [roll],
|
||||||
rollMode: "roll"
|
rollMode: game.settings.get("core", "rollMode") ?? "roll"
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -1695,12 +1723,26 @@ var CDENpcSheet = class extends CDEBaseActorSheet {
|
|||||||
context.supernaturals = context.items.filter((item) => item.type === "supernatural");
|
context.supernaturals = context.items.filter((item) => item.type === "supernatural");
|
||||||
context.spells = context.items.filter((item) => item.type === "spell");
|
context.spells = context.items.filter((item) => item.type === "spell");
|
||||||
context.kungfus = context.items.filter((item) => item.type === "kungfu");
|
context.kungfus = context.items.filter((item) => item.type === "kungfu");
|
||||||
|
context.weapons = context.items.filter((item) => item.type === "weapon");
|
||||||
|
context.armors = context.items.filter((item) => item.type === "armor");
|
||||||
context.equipments = context.items.filter((item) => item.type === "item");
|
context.equipments = context.items.filter((item) => item.type === "item");
|
||||||
return context;
|
return context;
|
||||||
}
|
}
|
||||||
_onRender(context, options) {
|
_onRender(context, options) {
|
||||||
super._onRender?.(context, options);
|
super._onRender(context, options);
|
||||||
this.#bindInitiativeControls();
|
this.#bindInitiativeControls();
|
||||||
|
this.#bindRollButtons();
|
||||||
|
}
|
||||||
|
#bindRollButtons() {
|
||||||
|
const cells = this.element?.querySelectorAll(".cde-roll-trigger[data-libel-id]");
|
||||||
|
if (!cells?.length) return;
|
||||||
|
cells.forEach((cell) => {
|
||||||
|
cell.addEventListener("click", (event) => {
|
||||||
|
event.preventDefault();
|
||||||
|
const rollKey = cell.dataset.libelId;
|
||||||
|
if (rollKey) rollForActor(this.document, rollKey);
|
||||||
|
});
|
||||||
|
});
|
||||||
}
|
}
|
||||||
#bindInitiativeControls() {
|
#bindInitiativeControls() {
|
||||||
const buttons = this.element?.querySelectorAll(".click-initiative-npc");
|
const buttons = this.element?.querySelectorAll(".click-initiative-npc");
|
||||||
@@ -1751,13 +1793,15 @@ var CDELoksyuSheet = class extends CDEBaseActorSheet {
|
|||||||
|
|
||||||
// src/ui/sheets/items/base.js
|
// src/ui/sheets/items/base.js
|
||||||
var { HandlebarsApplicationMixin: HandlebarsApplicationMixin2 } = foundry.applications.api;
|
var { HandlebarsApplicationMixin: HandlebarsApplicationMixin2 } = foundry.applications.api;
|
||||||
var CDEBaseItemSheet = class extends HandlebarsApplicationMixin2(foundry.applications.sheets.ItemSheetV2) {
|
var CDEBaseItemSheet = class _CDEBaseItemSheet extends HandlebarsApplicationMixin2(foundry.applications.sheets.ItemSheetV2) {
|
||||||
static DEFAULT_OPTIONS = {
|
static DEFAULT_OPTIONS = {
|
||||||
classes: ["fvtt-chroniques-de-l-etrange", "item"],
|
classes: ["fvtt-chroniques-de-l-etrange", "item"],
|
||||||
position: { width: 520, height: "auto" },
|
position: { width: 520, height: "auto" },
|
||||||
window: { resizable: true },
|
window: { resizable: true },
|
||||||
form: { submitOnChange: true },
|
form: { submitOnChange: true },
|
||||||
actions: {}
|
actions: {
|
||||||
|
editImage: _CDEBaseItemSheet.#onEditImage
|
||||||
|
}
|
||||||
};
|
};
|
||||||
tabGroups = { primary: "details" };
|
tabGroups = { primary: "details" };
|
||||||
get title() {
|
get title() {
|
||||||
@@ -1765,8 +1809,8 @@ var CDEBaseItemSheet = class extends HandlebarsApplicationMixin2(foundry.applica
|
|||||||
}
|
}
|
||||||
async _prepareContext() {
|
async _prepareContext() {
|
||||||
const cssClass = this.options.classes?.join(" ") ?? "";
|
const cssClass = this.options.classes?.join(" ") ?? "";
|
||||||
const enrichedDescription = await foundry.applications.ux.TextEditor.implementation.enrichHTML(this.document.system.description ?? "", { async: true });
|
const enrichedDescription = await TextEditor.enrichHTML(this.document.system.description ?? "", { async: true });
|
||||||
const enrichedNotes = await foundry.applications.ux.TextEditor.implementation.enrichHTML(this.document.system.notes ?? "", { async: true });
|
const enrichedNotes = await TextEditor.enrichHTML(this.document.system.notes ?? "", { async: true });
|
||||||
return {
|
return {
|
||||||
item: this.document,
|
item: this.document,
|
||||||
system: this.document.system,
|
system: this.document.system,
|
||||||
@@ -1787,6 +1831,20 @@ var CDEBaseItemSheet = class extends HandlebarsApplicationMixin2(foundry.applica
|
|||||||
this.changeTab(tab, group, { force: true });
|
this.changeTab(tab, group, { force: true });
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
static async #onEditImage(event, target) {
|
||||||
|
const attr = target.dataset.edit;
|
||||||
|
const current = foundry.utils.getProperty(this.document, attr);
|
||||||
|
const { img } = this.document.constructor.getDefaultArtwork?.(this.document.toObject()) ?? {};
|
||||||
|
const fp = new FilePicker({
|
||||||
|
current,
|
||||||
|
type: "image",
|
||||||
|
redirectToRoot: img ? [img] : [],
|
||||||
|
callback: (path) => this.document.update({ [attr]: path }),
|
||||||
|
top: this.position.top + 40,
|
||||||
|
left: this.position.left + 10
|
||||||
|
});
|
||||||
|
return fp.browse();
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
// src/ui/sheets/items/item.js
|
// src/ui/sheets/items/item.js
|
||||||
@@ -1923,7 +1981,7 @@ function registerSettings() {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
async function migrateIfNeeded() {
|
async function migrateIfNeeded() {
|
||||||
const current = game.system.version ?? MIGRATION_VERSION;
|
const current = MIGRATION_VERSION;
|
||||||
const stored = game.settings.get(SYSTEM_ID, "migrationVersion") ?? "0.0.0";
|
const stored = game.settings.get(SYSTEM_ID, "migrationVersion") ?? "0.0.0";
|
||||||
if (!foundry.utils.isNewerVersion(current, stored)) return;
|
if (!foundry.utils.isNewerVersion(current, stored)) return;
|
||||||
ui.notifications.info(`CHRONIQUESDELETRANGE | Migration vers ${current} en cours...`, { permanent: true });
|
ui.notifications.info(`CHRONIQUESDELETRANGE | Migration vers ${current} en cours...`, { permanent: true });
|
||||||
@@ -1939,7 +1997,7 @@ async function migrateActors() {
|
|||||||
for (const actor of game.actors.contents) {
|
for (const actor of game.actors.contents) {
|
||||||
const updateData = migrateActorData(actor);
|
const updateData = migrateActorData(actor);
|
||||||
if (Object.keys(updateData).length > 0) {
|
if (Object.keys(updateData).length > 0) {
|
||||||
updates.push(actor.update(updateData, { enforceTypes: false }));
|
updates.push(actor.update(updateData));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
await Promise.all(updates);
|
await Promise.all(updates);
|
||||||
@@ -1951,7 +2009,7 @@ async function migrateCompendiumActors() {
|
|||||||
for (const actor of content) {
|
for (const actor of content) {
|
||||||
const updateData = migrateActorData(actor);
|
const updateData = migrateActorData(actor);
|
||||||
if (Object.keys(updateData).length > 0) {
|
if (Object.keys(updateData).length > 0) {
|
||||||
await actor.update(updateData, { pack: pack.collection, enforceTypes: false });
|
await actor.update(updateData, { pack: pack.collection });
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1961,7 +2019,7 @@ async function migrateItems() {
|
|||||||
for (const item of game.items.contents) {
|
for (const item of game.items.contents) {
|
||||||
const updateData = migrateItemData(item);
|
const updateData = migrateItemData(item);
|
||||||
if (Object.keys(updateData).length > 0) {
|
if (Object.keys(updateData).length > 0) {
|
||||||
updates.push(item.update(updateData, { enforceTypes: false }));
|
updates.push(item.update(updateData));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
await Promise.all(updates);
|
await Promise.all(updates);
|
||||||
@@ -1973,7 +2031,7 @@ async function migrateCompendiumItems() {
|
|||||||
for (const item of content) {
|
for (const item of content) {
|
||||||
const updateData = migrateItemData(item);
|
const updateData = migrateItemData(item);
|
||||||
if (Object.keys(updateData).length > 0) {
|
if (Object.keys(updateData).length > 0) {
|
||||||
await item.update(updateData, { pack: pack.collection, enforceTypes: false });
|
await item.update(updateData, { pack: pack.collection });
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -2012,6 +2070,13 @@ function migrateActorData(actor) {
|
|||||||
function migrateItemData(item) {
|
function migrateItemData(item) {
|
||||||
const updateData = {};
|
const updateData = {};
|
||||||
const system = item.system ?? {};
|
const system = item.system ?? {};
|
||||||
|
if (item.type === "weapon") {
|
||||||
|
const ASPECT_FR_TO_EN = { eau: "water", terre: "earth", feu: "fire", bois: "wood" };
|
||||||
|
const normalized = ASPECT_FR_TO_EN[system.damageAspect];
|
||||||
|
if (normalized) {
|
||||||
|
updateData["system.damageAspect"] = normalized;
|
||||||
|
}
|
||||||
|
}
|
||||||
return updateData;
|
return updateData;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2110,9 +2175,6 @@ Hooks.once("init", async () => {
|
|||||||
console.info(`CHRONIQUESDELETRANGE | Initialized`);
|
console.info(`CHRONIQUESDELETRANGE | Initialized`);
|
||||||
});
|
});
|
||||||
Hooks.once("ready", async () => {
|
Hooks.once("ready", async () => {
|
||||||
if (!game.modules.get("lib-wrapper")?.active && game.user.isGM) {
|
|
||||||
ui.notifications.error("System fvtt-chroniques-de-l-etrange requires the 'libWrapper' module. Please install and activate it.");
|
|
||||||
}
|
|
||||||
await migrateIfNeeded();
|
await migrateIfNeeded();
|
||||||
});
|
});
|
||||||
function injectCompendiumLink(html) {
|
function injectCompendiumLink(html) {
|
||||||
@@ -2138,7 +2200,7 @@ function injectCompendiumLink(html) {
|
|||||||
</section>
|
</section>
|
||||||
`;
|
`;
|
||||||
section.querySelector("button[data-action='open-cde-link']")?.addEventListener("click", () => {
|
section.querySelector("button[data-action='open-cde-link']")?.addEventListener("click", () => {
|
||||||
window.open("https://antre-monde.com/les-chroniques-de-letrengae/", "_blank");
|
window.open("https://antre-monde.com/les-chroniques-de-letrange/", "_blank");
|
||||||
});
|
});
|
||||||
header.parentNode.insertBefore(section, header);
|
header.parentNode.insertBefore(section, header);
|
||||||
}
|
}
|
||||||
|
|||||||
4
dist/system.js.map
vendored
4
dist/system.js.map
vendored
File diff suppressed because one or more lines are too long
@@ -18,6 +18,9 @@
|
|||||||
"CDE.DefineTemplate": "Define as Template",
|
"CDE.DefineTemplate": "Define as Template",
|
||||||
"CDE.UnsetTemplate": "Unset Template",
|
"CDE.UnsetTemplate": "Unset Template",
|
||||||
"CDE.NoTemplate": "No Template",
|
"CDE.NoTemplate": "No Template",
|
||||||
|
"CDE.NoSupernaturals": "No supernatural powers",
|
||||||
|
"CDE.NoSpells": "No spells",
|
||||||
|
"CDE.NoKungFu": "No martial arts",
|
||||||
|
|
||||||
"CDE.Quantity": "Quantity",
|
"CDE.Quantity": "Quantity",
|
||||||
"CDE.Weight": "Weight",
|
"CDE.Weight": "Weight",
|
||||||
|
|||||||
@@ -187,6 +187,9 @@
|
|||||||
"CDE.NextTimeGoToTheSettings": "Tout ceci est paramétrable dans les Préférences",
|
"CDE.NextTimeGoToTheSettings": "Tout ceci est paramétrable dans les Préférences",
|
||||||
"CDE.NgHang": "Ng Hang",
|
"CDE.NgHang": "Ng Hang",
|
||||||
"CDE.NoTemplate": "Aucun Modèle",
|
"CDE.NoTemplate": "Aucun Modèle",
|
||||||
|
"CDE.NoSupernaturals": "Aucun pouvoir surnaturel",
|
||||||
|
"CDE.NoSpells": "Aucun sortilège",
|
||||||
|
"CDE.NoKungFu": "Aucun art martial",
|
||||||
"CDE.Notes": "Notes",
|
"CDE.Notes": "Notes",
|
||||||
"CDE.Noxious": "Dés-Néfastes",
|
"CDE.Noxious": "Dés-Néfastes",
|
||||||
"CDE.Nuisance": "Capacité de Nuisance",
|
"CDE.Nuisance": "Capacité de Nuisance",
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
MANIFEST-000062
|
MANIFEST-000070
|
||||||
|
|||||||
@@ -1,7 +1,3 @@
|
|||||||
2026/03/27-23:40:07.003627 7f90f7fff6c0 Recovering log #60
|
2026/03/30-08:26:03.921273 7f4bd9fec6c0 Recovering log #68
|
||||||
2026/03/27-23:40:07.014585 7f90f7fff6c0 Delete type=3 #58
|
2026/03/30-08:26:03.931083 7f4bd9fec6c0 Delete type=3 #66
|
||||||
2026/03/27-23:40:07.014647 7f90f7fff6c0 Delete type=0 #60
|
2026/03/30-08:26:03.931138 7f4bd9fec6c0 Delete type=0 #68
|
||||||
2026/03/28-01:06:04.060694 7f90f5ffb6c0 Level-0 table #65: started
|
|
||||||
2026/03/28-01:06:04.060719 7f90f5ffb6c0 Level-0 table #65: 0 bytes OK
|
|
||||||
2026/03/28-01:06:04.067602 7f90f5ffb6c0 Delete type=0 #63
|
|
||||||
2026/03/28-01:06:04.080111 7f90f5ffb6c0 Manual compaction at level-0 from '!journal!ZWBHiWW5QlUeseAX' @ 72057594037927935 : 1 .. '!journal.pages!ZWBHiWW5QlUeseAX.jtQXIqLfyet8Nlte' @ 0 : 0; will stop at (end)
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
2026/03/27-21:21:30.280454 7f90f67fc6c0 Recovering log #56
|
2026/03/30-08:16:07.267863 7f4bda7ed6c0 Recovering log #64
|
||||||
2026/03/27-21:21:30.290347 7f90f67fc6c0 Delete type=3 #54
|
2026/03/30-08:16:07.277952 7f4bda7ed6c0 Delete type=3 #62
|
||||||
2026/03/27-21:21:30.290399 7f90f67fc6c0 Delete type=0 #56
|
2026/03/30-08:16:07.278023 7f4bda7ed6c0 Delete type=0 #64
|
||||||
2026/03/27-21:21:32.095874 7f90f5ffb6c0 Level-0 table #61: started
|
2026/03/30-08:24:08.126726 7f4bd8fea6c0 Level-0 table #69: started
|
||||||
2026/03/27-21:21:32.095896 7f90f5ffb6c0 Level-0 table #61: 0 bytes OK
|
2026/03/30-08:24:08.126763 7f4bd8fea6c0 Level-0 table #69: 0 bytes OK
|
||||||
2026/03/27-21:21:32.102427 7f90f5ffb6c0 Delete type=0 #59
|
2026/03/30-08:24:08.132783 7f4bd8fea6c0 Delete type=0 #67
|
||||||
2026/03/27-21:21:32.116179 7f90f5ffb6c0 Manual compaction at level-0 from '!journal!ZWBHiWW5QlUeseAX' @ 72057594037927935 : 1 .. '!journal.pages!ZWBHiWW5QlUeseAX.jtQXIqLfyet8Nlte' @ 0 : 0; will stop at (end)
|
2026/03/30-08:24:08.146517 7f4bd8fea6c0 Manual compaction at level-0 from '!journal!ZWBHiWW5QlUeseAX' @ 72057594037927935 : 1 .. '!journal.pages!ZWBHiWW5QlUeseAX.jtQXIqLfyet8Nlte' @ 0 : 0; will stop at (end)
|
||||||
|
|||||||
Binary file not shown.
@@ -1 +1 @@
|
|||||||
MANIFEST-000178
|
MANIFEST-000186
|
||||||
|
|||||||
@@ -1,8 +1,3 @@
|
|||||||
2026/03/27-23:40:06.991314 7f90f77fe6c0 Recovering log #176
|
2026/03/30-08:26:03.909166 7f4bdafee6c0 Recovering log #184
|
||||||
2026/03/27-23:40:07.001875 7f90f77fe6c0 Delete type=3 #174
|
2026/03/30-08:26:03.919289 7f4bdafee6c0 Delete type=3 #182
|
||||||
2026/03/27-23:40:07.001926 7f90f77fe6c0 Delete type=0 #176
|
2026/03/30-08:26:03.919342 7f4bdafee6c0 Delete type=0 #184
|
||||||
2026/03/28-01:06:04.048472 7f90f5ffb6c0 Level-0 table #181: started
|
|
||||||
2026/03/28-01:06:04.048493 7f90f5ffb6c0 Level-0 table #181: 0 bytes OK
|
|
||||||
2026/03/28-01:06:04.054367 7f90f5ffb6c0 Delete type=0 #179
|
|
||||||
2026/03/28-01:06:04.054479 7f90f5ffb6c0 Manual compaction at level-0 from '!journal!TniC3ok9W0hDYxJS' @ 72057594037927935 : 1 .. '!journal.pages!yZsG9QaBHT3cUfNd.AHcfBcO96nUCELxv' @ 0 : 0; will stop at (end)
|
|
||||||
2026/03/28-01:06:04.054500 7f90f5ffb6c0 Manual compaction at level-1 from '!journal!TniC3ok9W0hDYxJS' @ 72057594037927935 : 1 .. '!journal.pages!yZsG9QaBHT3cUfNd.AHcfBcO96nUCELxv' @ 0 : 0; will stop at (end)
|
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
2026/03/27-21:21:30.268953 7f90f6ffd6c0 Recovering log #172
|
2026/03/30-08:16:07.254592 7f4bd97eb6c0 Recovering log #180
|
||||||
2026/03/27-21:21:30.278662 7f90f6ffd6c0 Delete type=3 #170
|
2026/03/30-08:16:07.264713 7f4bd97eb6c0 Delete type=3 #178
|
||||||
2026/03/27-21:21:30.278730 7f90f6ffd6c0 Delete type=0 #172
|
2026/03/30-08:16:07.264785 7f4bd97eb6c0 Delete type=0 #180
|
||||||
2026/03/27-21:21:32.067762 7f90f5ffb6c0 Level-0 table #177: started
|
2026/03/30-08:24:08.112328 7f4bd8fea6c0 Level-0 table #185: started
|
||||||
2026/03/27-21:21:32.067784 7f90f5ffb6c0 Level-0 table #177: 0 bytes OK
|
2026/03/30-08:24:08.112359 7f4bd8fea6c0 Level-0 table #185: 0 bytes OK
|
||||||
2026/03/27-21:21:32.074619 7f90f5ffb6c0 Delete type=0 #175
|
2026/03/30-08:24:08.119443 7f4bd8fea6c0 Delete type=0 #183
|
||||||
2026/03/27-21:21:32.089332 7f90f5ffb6c0 Manual compaction at level-0 from '!journal!TniC3ok9W0hDYxJS' @ 72057594037927935 : 1 .. '!journal.pages!yZsG9QaBHT3cUfNd.AHcfBcO96nUCELxv' @ 0 : 0; will stop at (end)
|
2026/03/30-08:24:08.119714 7f4bd8fea6c0 Manual compaction at level-0 from '!journal!TniC3ok9W0hDYxJS' @ 72057594037927935 : 1 .. '!journal.pages!yZsG9QaBHT3cUfNd.AHcfBcO96nUCELxv' @ 0 : 0; will stop at (end)
|
||||||
2026/03/27-21:21:32.089368 7f90f5ffb6c0 Manual compaction at level-1 from '!journal!TniC3ok9W0hDYxJS' @ 72057594037927935 : 1 .. '!journal.pages!yZsG9QaBHT3cUfNd.AHcfBcO96nUCELxv' @ 0 : 0; will stop at (end)
|
2026/03/30-08:24:08.119737 7f4bd8fea6c0 Manual compaction at level-1 from '!journal!TniC3ok9W0hDYxJS' @ 72057594037927935 : 1 .. '!journal.pages!yZsG9QaBHT3cUfNd.AHcfBcO96nUCELxv' @ 0 : 0; will stop at (end)
|
||||||
|
|||||||
Binary file not shown.
@@ -1 +1 @@
|
|||||||
MANIFEST-000750
|
MANIFEST-000758
|
||||||
|
|||||||
@@ -1,8 +1,3 @@
|
|||||||
2026/03/27-23:40:06.977536 7f90f67fc6c0 Recovering log #748
|
2026/03/30-08:26:03.896176 7f4bd97eb6c0 Recovering log #756
|
||||||
2026/03/27-23:40:06.987624 7f90f67fc6c0 Delete type=3 #746
|
2026/03/30-08:26:03.907046 7f4bd97eb6c0 Delete type=3 #754
|
||||||
2026/03/27-23:40:06.987699 7f90f67fc6c0 Delete type=0 #748
|
2026/03/30-08:26:03.907119 7f4bd97eb6c0 Delete type=0 #756
|
||||||
2026/03/28-01:06:04.041962 7f90f5ffb6c0 Level-0 table #753: started
|
|
||||||
2026/03/28-01:06:04.041998 7f90f5ffb6c0 Level-0 table #753: 0 bytes OK
|
|
||||||
2026/03/28-01:06:04.048371 7f90f5ffb6c0 Delete type=0 #751
|
|
||||||
2026/03/28-01:06:04.054466 7f90f5ffb6c0 Manual compaction at level-0 from '!journal!f6UhPlIUh2O0F36q' @ 72057594037927935 : 1 .. '!journal.pages!f6UhPlIUh2O0F36q.keqszrb6FAI7CVZx' @ 0 : 0; will stop at (end)
|
|
||||||
2026/03/28-01:06:04.054494 7f90f5ffb6c0 Manual compaction at level-1 from '!journal!f6UhPlIUh2O0F36q' @ 72057594037927935 : 1 .. '!journal.pages!f6UhPlIUh2O0F36q.keqszrb6FAI7CVZx' @ 0 : 0; will stop at (end)
|
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
2026/03/27-21:21:30.255554 7f90f77fe6c0 Recovering log #744
|
2026/03/30-08:16:07.240824 7f4bdafee6c0 Recovering log #752
|
||||||
2026/03/27-21:21:30.266879 7f90f77fe6c0 Delete type=3 #742
|
2026/03/30-08:16:07.251864 7f4bdafee6c0 Delete type=3 #750
|
||||||
2026/03/27-21:21:30.266948 7f90f77fe6c0 Delete type=0 #744
|
2026/03/30-08:16:07.251919 7f4bdafee6c0 Delete type=0 #752
|
||||||
2026/03/27-21:21:32.081193 7f90f5ffb6c0 Level-0 table #749: started
|
2026/03/30-08:24:08.092532 7f4bd8fea6c0 Level-0 table #757: started
|
||||||
2026/03/27-21:21:32.081218 7f90f5ffb6c0 Level-0 table #749: 0 bytes OK
|
2026/03/30-08:24:08.092592 7f4bd8fea6c0 Level-0 table #757: 0 bytes OK
|
||||||
2026/03/27-21:21:32.089124 7f90f5ffb6c0 Delete type=0 #747
|
2026/03/30-08:24:08.099028 7f4bd8fea6c0 Delete type=0 #755
|
||||||
2026/03/27-21:21:32.089363 7f90f5ffb6c0 Manual compaction at level-0 from '!journal!f6UhPlIUh2O0F36q' @ 72057594037927935 : 1 .. '!journal.pages!f6UhPlIUh2O0F36q.keqszrb6FAI7CVZx' @ 0 : 0; will stop at (end)
|
2026/03/30-08:24:08.119656 7f4bd8fea6c0 Manual compaction at level-0 from '!journal!f6UhPlIUh2O0F36q' @ 72057594037927935 : 1 .. '!journal.pages!f6UhPlIUh2O0F36q.keqszrb6FAI7CVZx' @ 0 : 0; will stop at (end)
|
||||||
2026/03/27-21:21:32.089373 7f90f5ffb6c0 Manual compaction at level-1 from '!journal!f6UhPlIUh2O0F36q' @ 72057594037927935 : 1 .. '!journal.pages!f6UhPlIUh2O0F36q.keqszrb6FAI7CVZx' @ 0 : 0; will stop at (end)
|
2026/03/30-08:24:08.119722 7f4bd8fea6c0 Manual compaction at level-1 from '!journal!f6UhPlIUh2O0F36q' @ 72057594037927935 : 1 .. '!journal.pages!f6UhPlIUh2O0F36q.keqszrb6FAI7CVZx' @ 0 : 0; will stop at (end)
|
||||||
|
|||||||
Binary file not shown.
@@ -1 +1 @@
|
|||||||
MANIFEST-004371
|
MANIFEST-004379
|
||||||
|
|||||||
@@ -1,7 +1,3 @@
|
|||||||
2026/03/27-23:40:06.951174 7f90f77fe6c0 Recovering log #4369
|
2026/03/30-08:26:03.870788 7f4bd9fec6c0 Recovering log #4377
|
||||||
2026/03/27-23:40:06.961084 7f90f77fe6c0 Delete type=3 #4367
|
2026/03/30-08:26:03.881274 7f4bd9fec6c0 Delete type=3 #4375
|
||||||
2026/03/27-23:40:06.961153 7f90f77fe6c0 Delete type=0 #4369
|
2026/03/30-08:26:03.881332 7f4bd9fec6c0 Delete type=0 #4377
|
||||||
2026/03/28-01:06:04.029376 7f90f5ffb6c0 Level-0 table #4374: started
|
|
||||||
2026/03/28-01:06:04.029452 7f90f5ffb6c0 Level-0 table #4374: 0 bytes OK
|
|
||||||
2026/03/28-01:06:04.035591 7f90f5ffb6c0 Delete type=0 #4372
|
|
||||||
2026/03/28-01:06:04.054447 7f90f5ffb6c0 Manual compaction at level-0 from '!journal!0lxwWrzKsdTBQhH0' @ 72057594037927935 : 1 .. '!journal.pages!wgSyae4GTJDkmBOm.6Ql0lgquUCTrMyTZ' @ 0 : 0; will stop at (end)
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
2026/03/27-21:21:30.230925 7f90f67fc6c0 Recovering log #4365
|
2026/03/30-08:16:07.214667 7f4bd97eb6c0 Recovering log #4373
|
||||||
2026/03/27-21:21:30.240633 7f90f67fc6c0 Delete type=3 #4363
|
2026/03/30-08:16:07.224699 7f4bd97eb6c0 Delete type=3 #4371
|
||||||
2026/03/27-21:21:30.240686 7f90f67fc6c0 Delete type=0 #4365
|
2026/03/30-08:16:07.224769 7f4bd97eb6c0 Delete type=0 #4373
|
||||||
2026/03/27-21:21:32.060793 7f90f5ffb6c0 Level-0 table #4370: started
|
2026/03/30-08:24:08.099151 7f4bd8fea6c0 Level-0 table #4378: started
|
||||||
2026/03/27-21:21:32.060834 7f90f5ffb6c0 Level-0 table #4370: 0 bytes OK
|
2026/03/30-08:24:08.099181 7f4bd8fea6c0 Level-0 table #4378: 0 bytes OK
|
||||||
2026/03/27-21:21:32.067619 7f90f5ffb6c0 Delete type=0 #4368
|
2026/03/30-08:24:08.105876 7f4bd8fea6c0 Delete type=0 #4376
|
||||||
2026/03/27-21:21:32.089309 7f90f5ffb6c0 Manual compaction at level-0 from '!journal!0lxwWrzKsdTBQhH0' @ 72057594037927935 : 1 .. '!journal.pages!wgSyae4GTJDkmBOm.6Ql0lgquUCTrMyTZ' @ 0 : 0; will stop at (end)
|
2026/03/30-08:24:08.119676 7f4bd8fea6c0 Manual compaction at level-0 from '!journal!0lxwWrzKsdTBQhH0' @ 72057594037927935 : 1 .. '!journal.pages!wgSyae4GTJDkmBOm.6Ql0lgquUCTrMyTZ' @ 0 : 0; will stop at (end)
|
||||||
|
|||||||
Binary file not shown.
@@ -1 +1 @@
|
|||||||
MANIFEST-000091
|
MANIFEST-000099
|
||||||
|
|||||||
@@ -1,8 +1,3 @@
|
|||||||
2026/03/27-23:40:07.041219 7f90f6ffd6c0 Recovering log #89
|
2026/03/30-08:26:03.960135 7f4bdafee6c0 Recovering log #97
|
||||||
2026/03/27-23:40:07.052133 7f90f6ffd6c0 Delete type=3 #87
|
2026/03/30-08:26:03.970139 7f4bdafee6c0 Delete type=3 #95
|
||||||
2026/03/27-23:40:07.052198 7f90f6ffd6c0 Delete type=0 #89
|
2026/03/30-08:26:03.970187 7f4bdafee6c0 Delete type=0 #97
|
||||||
2026/03/28-01:06:04.074099 7f90f5ffb6c0 Level-0 table #94: started
|
|
||||||
2026/03/28-01:06:04.074129 7f90f5ffb6c0 Level-0 table #94: 0 bytes OK
|
|
||||||
2026/03/28-01:06:04.080023 7f90f5ffb6c0 Delete type=0 #92
|
|
||||||
2026/03/28-01:06:04.080128 7f90f5ffb6c0 Manual compaction at level-0 from '!tables!J9VdvrwkbyKxMAT7' @ 72057594037927935 : 1 .. '!tables.results!jGKjfCyk4ROSy9fU.zRzADzATtijaBdNX' @ 0 : 0; will stop at (end)
|
|
||||||
2026/03/28-01:06:04.080153 7f90f5ffb6c0 Manual compaction at level-1 from '!tables!J9VdvrwkbyKxMAT7' @ 72057594037927935 : 1 .. '!tables.results!jGKjfCyk4ROSy9fU.zRzADzATtijaBdNX' @ 0 : 0; will stop at (end)
|
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
2026/03/27-21:21:30.316292 7f90f77fe6c0 Recovering log #85
|
2026/03/30-08:16:07.306304 7f4bd9fec6c0 Recovering log #93
|
||||||
2026/03/27-21:21:30.326791 7f90f77fe6c0 Delete type=3 #83
|
2026/03/30-08:16:07.316612 7f4bd9fec6c0 Delete type=3 #91
|
||||||
2026/03/27-21:21:30.326838 7f90f77fe6c0 Delete type=0 #85
|
2026/03/30-08:16:07.316673 7f4bd9fec6c0 Delete type=0 #93
|
||||||
2026/03/27-21:21:32.102543 7f90f5ffb6c0 Level-0 table #90: started
|
2026/03/30-08:24:08.119869 7f4bd8fea6c0 Level-0 table #98: started
|
||||||
2026/03/27-21:21:32.102564 7f90f5ffb6c0 Level-0 table #90: 0 bytes OK
|
2026/03/30-08:24:08.119905 7f4bd8fea6c0 Level-0 table #98: 0 bytes OK
|
||||||
2026/03/27-21:21:32.109807 7f90f5ffb6c0 Delete type=0 #88
|
2026/03/30-08:24:08.126557 7f4bd8fea6c0 Delete type=0 #96
|
||||||
2026/03/27-21:21:32.116185 7f90f5ffb6c0 Manual compaction at level-0 from '!tables!J9VdvrwkbyKxMAT7' @ 72057594037927935 : 1 .. '!tables.results!jGKjfCyk4ROSy9fU.zRzADzATtijaBdNX' @ 0 : 0; will stop at (end)
|
2026/03/30-08:24:08.146502 7f4bd8fea6c0 Manual compaction at level-0 from '!tables!J9VdvrwkbyKxMAT7' @ 72057594037927935 : 1 .. '!tables.results!jGKjfCyk4ROSy9fU.zRzADzATtijaBdNX' @ 0 : 0; will stop at (end)
|
||||||
2026/03/27-21:21:32.123641 7f90f5ffb6c0 Manual compaction at level-1 from '!tables!J9VdvrwkbyKxMAT7' @ 72057594037927935 : 1 .. '!tables.results!jGKjfCyk4ROSy9fU.zRzADzATtijaBdNX' @ 0 : 0; will stop at (end)
|
2026/03/30-08:24:08.146547 7f4bd8fea6c0 Manual compaction at level-1 from '!tables!J9VdvrwkbyKxMAT7' @ 72057594037927935 : 1 .. '!tables.results!jGKjfCyk4ROSy9fU.zRzADzATtijaBdNX' @ 0 : 0; will stop at (end)
|
||||||
|
|||||||
Binary file not shown.
@@ -1 +1 @@
|
|||||||
MANIFEST-000072
|
MANIFEST-000080
|
||||||
|
|||||||
@@ -1,8 +1,3 @@
|
|||||||
2026/03/27-23:40:07.028975 7f90f7fff6c0 Recovering log #70
|
2026/03/30-08:26:03.946656 7f4bd9fec6c0 Recovering log #78
|
||||||
2026/03/27-23:40:07.039557 7f90f7fff6c0 Delete type=3 #68
|
2026/03/30-08:26:03.958209 7f4bd9fec6c0 Delete type=3 #76
|
||||||
2026/03/27-23:40:07.039615 7f90f7fff6c0 Delete type=0 #70
|
2026/03/30-08:26:03.958276 7f4bd9fec6c0 Delete type=0 #78
|
||||||
2026/03/28-01:06:04.054602 7f90f5ffb6c0 Level-0 table #75: started
|
|
||||||
2026/03/28-01:06:04.054622 7f90f5ffb6c0 Level-0 table #75: 0 bytes OK
|
|
||||||
2026/03/28-01:06:04.060604 7f90f5ffb6c0 Delete type=0 #73
|
|
||||||
2026/03/28-01:06:04.080099 7f90f5ffb6c0 Manual compaction at level-0 from '!macros!apyHJT40enTKFUfX' @ 72057594037927935 : 1 .. '!macros!suexsLbORUfE9ptz' @ 0 : 0; will stop at (end)
|
|
||||||
2026/03/28-01:06:04.080138 7f90f5ffb6c0 Manual compaction at level-1 from '!macros!apyHJT40enTKFUfX' @ 72057594037927935 : 1 .. '!macros!suexsLbORUfE9ptz' @ 0 : 0; will stop at (end)
|
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
2026/03/27-21:21:30.304400 7f90f67fc6c0 Recovering log #66
|
2026/03/30-08:16:07.294776 7f4bda7ed6c0 Recovering log #74
|
||||||
2026/03/27-21:21:30.314598 7f90f67fc6c0 Delete type=3 #64
|
2026/03/30-08:16:07.304322 7f4bda7ed6c0 Delete type=3 #72
|
||||||
2026/03/27-21:21:30.314668 7f90f67fc6c0 Delete type=0 #66
|
2026/03/30-08:16:07.304388 7f4bda7ed6c0 Delete type=0 #74
|
||||||
2026/03/27-21:21:32.089478 7f90f5ffb6c0 Level-0 table #71: started
|
2026/03/30-08:24:08.132921 7f4bd8fea6c0 Level-0 table #79: started
|
||||||
2026/03/27-21:21:32.089505 7f90f5ffb6c0 Level-0 table #71: 0 bytes OK
|
2026/03/30-08:24:08.132958 7f4bd8fea6c0 Level-0 table #79: 0 bytes OK
|
||||||
2026/03/27-21:21:32.095733 7f90f5ffb6c0 Delete type=0 #69
|
2026/03/30-08:24:08.139231 7f4bd8fea6c0 Delete type=0 #77
|
||||||
2026/03/27-21:21:32.116170 7f90f5ffb6c0 Manual compaction at level-0 from '!macros!apyHJT40enTKFUfX' @ 72057594037927935 : 1 .. '!macros!suexsLbORUfE9ptz' @ 0 : 0; will stop at (end)
|
2026/03/30-08:24:08.146528 7f4bd8fea6c0 Manual compaction at level-0 from '!macros!apyHJT40enTKFUfX' @ 72057594037927935 : 1 .. '!macros!suexsLbORUfE9ptz' @ 0 : 0; will stop at (end)
|
||||||
2026/03/27-21:21:32.123631 7f90f5ffb6c0 Manual compaction at level-1 from '!macros!apyHJT40enTKFUfX' @ 72057594037927935 : 1 .. '!macros!suexsLbORUfE9ptz' @ 0 : 0; will stop at (end)
|
2026/03/30-08:24:08.146565 7f4bd8fea6c0 Manual compaction at level-1 from '!macros!apyHJT40enTKFUfX' @ 72057594037927935 : 1 .. '!macros!suexsLbORUfE9ptz' @ 0 : 0; will stop at (end)
|
||||||
|
|||||||
Binary file not shown.
@@ -1 +1 @@
|
|||||||
MANIFEST-000250
|
MANIFEST-000258
|
||||||
|
|||||||
@@ -1,8 +1,3 @@
|
|||||||
2026/03/27-23:40:07.017004 7f90f6ffd6c0 Recovering log #248
|
2026/03/30-08:26:03.934190 7f4bd97eb6c0 Recovering log #256
|
||||||
2026/03/27-23:40:07.027187 7f90f6ffd6c0 Delete type=3 #246
|
2026/03/30-08:26:03.945052 7f4bd97eb6c0 Delete type=3 #254
|
||||||
2026/03/27-23:40:07.027254 7f90f6ffd6c0 Delete type=0 #248
|
2026/03/30-08:26:03.945123 7f4bd97eb6c0 Delete type=0 #256
|
||||||
2026/03/28-01:06:04.067738 7f90f5ffb6c0 Level-0 table #253: started
|
|
||||||
2026/03/28-01:06:04.067767 7f90f5ffb6c0 Level-0 table #253: 0 bytes OK
|
|
||||||
2026/03/28-01:06:04.073991 7f90f5ffb6c0 Delete type=0 #251
|
|
||||||
2026/03/28-01:06:04.080120 7f90f5ffb6c0 Manual compaction at level-0 from '!macros!Admg6zBHid4mfbJY' @ 72057594037927935 : 1 .. '!macros!wY3tga12higX7soz' @ 0 : 0; will stop at (end)
|
|
||||||
2026/03/28-01:06:04.080146 7f90f5ffb6c0 Manual compaction at level-1 from '!macros!Admg6zBHid4mfbJY' @ 72057594037927935 : 1 .. '!macros!wY3tga12higX7soz' @ 0 : 0; will stop at (end)
|
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
2026/03/27-21:21:30.291918 7f90f7fff6c0 Recovering log #244
|
2026/03/30-08:16:07.280810 7f4bdafee6c0 Recovering log #252
|
||||||
2026/03/27-21:21:30.302711 7f90f7fff6c0 Delete type=3 #242
|
2026/03/30-08:16:07.292094 7f4bdafee6c0 Delete type=3 #250
|
||||||
2026/03/27-21:21:30.302762 7f90f7fff6c0 Delete type=0 #244
|
2026/03/30-08:16:07.292157 7f4bdafee6c0 Delete type=0 #252
|
||||||
2026/03/27-21:21:32.109958 7f90f5ffb6c0 Level-0 table #249: started
|
2026/03/30-08:24:08.139393 7f4bd8fea6c0 Level-0 table #257: started
|
||||||
2026/03/27-21:21:32.109983 7f90f5ffb6c0 Level-0 table #249: 0 bytes OK
|
2026/03/30-08:24:08.139445 7f4bd8fea6c0 Level-0 table #257: 0 bytes OK
|
||||||
2026/03/27-21:21:32.116069 7f90f5ffb6c0 Delete type=0 #247
|
2026/03/30-08:24:08.146369 7f4bd8fea6c0 Delete type=0 #255
|
||||||
2026/03/27-21:21:32.116191 7f90f5ffb6c0 Manual compaction at level-0 from '!macros!Admg6zBHid4mfbJY' @ 72057594037927935 : 1 .. '!macros!wY3tga12higX7soz' @ 0 : 0; will stop at (end)
|
2026/03/30-08:24:08.146539 7f4bd8fea6c0 Manual compaction at level-0 from '!macros!Admg6zBHid4mfbJY' @ 72057594037927935 : 1 .. '!macros!wY3tga12higX7soz' @ 0 : 0; will stop at (end)
|
||||||
2026/03/27-21:21:32.116205 7f90f5ffb6c0 Manual compaction at level-1 from '!macros!Admg6zBHid4mfbJY' @ 72057594037927935 : 1 .. '!macros!wY3tga12higX7soz' @ 0 : 0; will stop at (end)
|
2026/03/30-08:24:08.146556 7f4bd8fea6c0 Manual compaction at level-1 from '!macros!Admg6zBHid4mfbJY' @ 72057594037927935 : 1 .. '!macros!wY3tga12higX7soz' @ 0 : 0; will stop at (end)
|
||||||
|
|||||||
Binary file not shown.
@@ -1 +1 @@
|
|||||||
MANIFEST-000992
|
MANIFEST-001000
|
||||||
|
|||||||
@@ -1,8 +1,3 @@
|
|||||||
2026/03/27-23:40:06.964100 7f90f7fff6c0 Recovering log #990
|
2026/03/30-08:26:03.884089 7f4bda7ed6c0 Recovering log #998
|
||||||
2026/03/27-23:40:06.975062 7f90f7fff6c0 Delete type=3 #988
|
2026/03/30-08:26:03.894023 7f4bda7ed6c0 Delete type=3 #996
|
||||||
2026/03/27-23:40:06.975129 7f90f7fff6c0 Delete type=0 #990
|
2026/03/30-08:26:03.894104 7f4bda7ed6c0 Delete type=0 #998
|
||||||
2026/03/28-01:06:04.035671 7f90f5ffb6c0 Level-0 table #995: started
|
|
||||||
2026/03/28-01:06:04.035691 7f90f5ffb6c0 Level-0 table #995: 0 bytes OK
|
|
||||||
2026/03/28-01:06:04.041795 7f90f5ffb6c0 Delete type=0 #993
|
|
||||||
2026/03/28-01:06:04.054457 7f90f5ffb6c0 Manual compaction at level-0 from '!journal!OgzOugwIXfHtijaY' @ 72057594037927935 : 1 .. '!journal.pages!OgzOugwIXfHtijaY.OOev7kj2KoMOGoMD' @ 0 : 0; will stop at (end)
|
|
||||||
2026/03/28-01:06:04.054505 7f90f5ffb6c0 Manual compaction at level-1 from '!journal!OgzOugwIXfHtijaY' @ 72057594037927935 : 1 .. '!journal.pages!OgzOugwIXfHtijaY.OOev7kj2KoMOGoMD' @ 0 : 0; will stop at (end)
|
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
2026/03/27-21:21:30.242574 7f90f7fff6c0 Recovering log #986
|
2026/03/30-08:16:07.228048 7f4bda7ed6c0 Recovering log #994
|
||||||
2026/03/27-21:21:30.253063 7f90f7fff6c0 Delete type=3 #984
|
2026/03/30-08:16:07.237984 7f4bda7ed6c0 Delete type=3 #992
|
||||||
2026/03/27-21:21:30.253116 7f90f7fff6c0 Delete type=0 #986
|
2026/03/30-08:16:07.238051 7f4bda7ed6c0 Delete type=0 #994
|
||||||
2026/03/27-21:21:32.074771 7f90f5ffb6c0 Level-0 table #991: started
|
2026/03/30-08:24:08.106011 7f4bd8fea6c0 Level-0 table #999: started
|
||||||
2026/03/27-21:21:32.074793 7f90f5ffb6c0 Level-0 table #991: 0 bytes OK
|
2026/03/30-08:24:08.106044 7f4bd8fea6c0 Level-0 table #999: 0 bytes OK
|
||||||
2026/03/27-21:21:32.081032 7f90f5ffb6c0 Delete type=0 #989
|
2026/03/30-08:24:08.112158 7f4bd8fea6c0 Delete type=0 #997
|
||||||
2026/03/27-21:21:32.089348 7f90f5ffb6c0 Manual compaction at level-0 from '!journal!OgzOugwIXfHtijaY' @ 72057594037927935 : 1 .. '!journal.pages!OgzOugwIXfHtijaY.OOev7kj2KoMOGoMD' @ 0 : 0; will stop at (end)
|
2026/03/30-08:24:08.119694 7f4bd8fea6c0 Manual compaction at level-0 from '!journal!OgzOugwIXfHtijaY' @ 72057594037927935 : 1 .. '!journal.pages!OgzOugwIXfHtijaY.OOev7kj2KoMOGoMD' @ 0 : 0; will stop at (end)
|
||||||
2026/03/27-21:21:32.089398 7f90f5ffb6c0 Manual compaction at level-1 from '!journal!OgzOugwIXfHtijaY' @ 72057594037927935 : 1 .. '!journal.pages!OgzOugwIXfHtijaY.OOev7kj2KoMOGoMD' @ 0 : 0; will stop at (end)
|
2026/03/30-08:24:08.119729 7f4bd8fea6c0 Manual compaction at level-1 from '!journal!OgzOugwIXfHtijaY' @ 72057594037927935 : 1 .. '!journal.pages!OgzOugwIXfHtijaY.OOev7kj2KoMOGoMD' @ 0 : 0; will stop at (end)
|
||||||
|
|||||||
Binary file not shown.
@@ -13,7 +13,7 @@ export function registerSettings() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export async function migrateIfNeeded() {
|
export async function migrateIfNeeded() {
|
||||||
const current = game.system.version ?? MIGRATION_VERSION
|
const current = MIGRATION_VERSION
|
||||||
const stored = game.settings.get(SYSTEM_ID, "migrationVersion") ?? "0.0.0"
|
const stored = game.settings.get(SYSTEM_ID, "migrationVersion") ?? "0.0.0"
|
||||||
if (!foundry.utils.isNewerVersion(current, stored)) return
|
if (!foundry.utils.isNewerVersion(current, stored)) return
|
||||||
|
|
||||||
@@ -31,7 +31,7 @@ async function migrateActors() {
|
|||||||
for (const actor of game.actors.contents) {
|
for (const actor of game.actors.contents) {
|
||||||
const updateData = migrateActorData(actor)
|
const updateData = migrateActorData(actor)
|
||||||
if (Object.keys(updateData).length > 0) {
|
if (Object.keys(updateData).length > 0) {
|
||||||
updates.push(actor.update(updateData, { enforceTypes: false }))
|
updates.push(actor.update(updateData))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
await Promise.all(updates)
|
await Promise.all(updates)
|
||||||
@@ -44,7 +44,7 @@ async function migrateCompendiumActors() {
|
|||||||
for (const actor of content) {
|
for (const actor of content) {
|
||||||
const updateData = migrateActorData(actor)
|
const updateData = migrateActorData(actor)
|
||||||
if (Object.keys(updateData).length > 0) {
|
if (Object.keys(updateData).length > 0) {
|
||||||
await actor.update(updateData, { pack: pack.collection, enforceTypes: false })
|
await actor.update(updateData, { pack: pack.collection })
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -55,7 +55,7 @@ async function migrateItems() {
|
|||||||
for (const item of game.items.contents) {
|
for (const item of game.items.contents) {
|
||||||
const updateData = migrateItemData(item)
|
const updateData = migrateItemData(item)
|
||||||
if (Object.keys(updateData).length > 0) {
|
if (Object.keys(updateData).length > 0) {
|
||||||
updates.push(item.update(updateData, { enforceTypes: false }))
|
updates.push(item.update(updateData))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
await Promise.all(updates)
|
await Promise.all(updates)
|
||||||
@@ -68,7 +68,7 @@ async function migrateCompendiumItems() {
|
|||||||
for (const item of content) {
|
for (const item of content) {
|
||||||
const updateData = migrateItemData(item)
|
const updateData = migrateItemData(item)
|
||||||
if (Object.keys(updateData).length > 0) {
|
if (Object.keys(updateData).length > 0) {
|
||||||
await item.update(updateData, { pack: pack.collection, enforceTypes: false })
|
await item.update(updateData, { pack: pack.collection })
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -119,7 +119,14 @@ function migrateItemData(item) {
|
|||||||
const updateData = {}
|
const updateData = {}
|
||||||
const system = item.system ?? {}
|
const system = item.system ?? {}
|
||||||
|
|
||||||
// Add item-specific migrations here as needed
|
// Normalize legacy French damageAspect values to English keys
|
||||||
|
if (item.type === "weapon") {
|
||||||
|
const ASPECT_FR_TO_EN = { eau: "water", terre: "earth", feu: "fire", bois: "wood" }
|
||||||
|
const normalized = ASPECT_FR_TO_EN[system.damageAspect]
|
||||||
|
if (normalized) {
|
||||||
|
updateData["system.damageAspect"] = normalized
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return updateData
|
return updateData
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -119,9 +119,6 @@ Hooks.once("init", async () => {
|
|||||||
})
|
})
|
||||||
|
|
||||||
Hooks.once("ready", async () => {
|
Hooks.once("ready", async () => {
|
||||||
if (!game.modules.get("lib-wrapper")?.active && game.user.isGM) {
|
|
||||||
ui.notifications.error("System fvtt-chroniques-de-l-etrange requires the 'libWrapper' module. Please install and activate it.")
|
|
||||||
}
|
|
||||||
await migrateIfNeeded()
|
await migrateIfNeeded()
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -149,7 +146,7 @@ function injectCompendiumLink(html) {
|
|||||||
</section>
|
</section>
|
||||||
`
|
`
|
||||||
section.querySelector("button[data-action='open-cde-link']")?.addEventListener("click", () => {
|
section.querySelector("button[data-action='open-cde-link']")?.addEventListener("click", () => {
|
||||||
window.open("https://antre-monde.com/les-chroniques-de-letrengae/", "_blank")
|
window.open("https://antre-monde.com/les-chroniques-de-letrange/", "_blank")
|
||||||
})
|
})
|
||||||
|
|
||||||
header.parentNode.insertBefore(section, header)
|
header.parentNode.insertBefore(section, header)
|
||||||
|
|||||||
@@ -61,6 +61,11 @@ export function registerHandlebarsHelpers() {
|
|||||||
Handlebars.registerHelper("getElementIcon", function (aspect) {
|
Handlebars.registerHelper("getElementIcon", function (aspect) {
|
||||||
const icons = {
|
const icons = {
|
||||||
metal: "/systems/fvtt-chroniques-de-l-etrange/images/cde_metal.webp",
|
metal: "/systems/fvtt-chroniques-de-l-etrange/images/cde_metal.webp",
|
||||||
|
water: "/systems/fvtt-chroniques-de-l-etrange/images/cde_eau.webp",
|
||||||
|
earth: "/systems/fvtt-chroniques-de-l-etrange/images/cde_terre.webp",
|
||||||
|
fire: "/systems/fvtt-chroniques-de-l-etrange/images/cde_feu.webp",
|
||||||
|
wood: "/systems/fvtt-chroniques-de-l-etrange/images/cde_bois.webp",
|
||||||
|
// legacy French keys
|
||||||
eau: "/systems/fvtt-chroniques-de-l-etrange/images/cde_eau.webp",
|
eau: "/systems/fvtt-chroniques-de-l-etrange/images/cde_eau.webp",
|
||||||
terre: "/systems/fvtt-chroniques-de-l-etrange/images/cde_terre.webp",
|
terre: "/systems/fvtt-chroniques-de-l-etrange/images/cde_terre.webp",
|
||||||
feu: "/systems/fvtt-chroniques-de-l-etrange/images/cde_feu.webp",
|
feu: "/systems/fvtt-chroniques-de-l-etrange/images/cde_feu.webp",
|
||||||
|
|||||||
@@ -55,7 +55,7 @@ function buildNPCOptions(sys) {
|
|||||||
function readInitFields(dialog) {
|
function readInitFields(dialog) {
|
||||||
const root = dialog.element ?? dialog
|
const root = dialog.element ?? dialog
|
||||||
const selectedKey = root.querySelector("select[name='firstaction']")?.value ?? ""
|
const selectedKey = root.querySelector("select[name='firstaction']")?.value ?? ""
|
||||||
const modifier = parseInt(root.querySelector("input[name='modifier']")?.value ?? 0) || 0
|
const modifier = parseInt(root.querySelector("input[name='modifier']")?.value ?? "0", 10) || 0
|
||||||
return { selectedKey, modifier }
|
return { selectedKey, modifier }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -13,6 +13,8 @@
|
|||||||
* Each category is associated with one of the five aspects in Wu Xing cycle order.
|
* Each category is associated with one of the five aspects in Wu Xing cycle order.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
import { MAGICS } from "../config/constants.js"
|
||||||
|
|
||||||
const RESULT_TEMPLATE = "systems/fvtt-chroniques-de-l-etrange/templates/form/cde-dice-result.html"
|
const RESULT_TEMPLATE = "systems/fvtt-chroniques-de-l-etrange/templates/form/cde-dice-result.html"
|
||||||
const SKILL_PROMPT_TEMPLATE = "systems/fvtt-chroniques-de-l-etrange/templates/form/cde-skill-dice-prompt.html"
|
const SKILL_PROMPT_TEMPLATE = "systems/fvtt-chroniques-de-l-etrange/templates/form/cde-skill-dice-prompt.html"
|
||||||
const SKILL_SPECIAL_PROMPT_TEMPLATE = "systems/fvtt-chroniques-de-l-etrange/templates/form/cde-skill-special-dice-prompt.html"
|
const SKILL_SPECIAL_PROMPT_TEMPLATE = "systems/fvtt-chroniques-de-l-etrange/templates/form/cde-skill-special-dice-prompt.html"
|
||||||
@@ -288,6 +290,11 @@ export async function rollForActor(actor, rollKey) {
|
|||||||
numberofdice = sys.aspect[skillLibel]?.value ?? 0
|
numberofdice = sys.aspect[skillLibel]?.value ?? 0
|
||||||
title = game.i18n.localize(sys.aspect[skillLibel]?.label ?? "CDE.Roll")
|
title = game.i18n.localize(sys.aspect[skillLibel]?.label ?? "CDE.Roll")
|
||||||
break
|
break
|
||||||
|
case "aptitude":
|
||||||
|
// NPC aptitude roll — flat pool with WuXing prompt
|
||||||
|
numberofdice = sys.aptitudes?.[skillLibel]?.value ?? 0
|
||||||
|
title = game.i18n.localize(`CDE.${skillLibel.charAt(0).toUpperCase() + skillLibel.slice(1)}`)
|
||||||
|
break
|
||||||
case "skill":
|
case "skill":
|
||||||
numberofdice = sys.skills[skillLibel]?.value ?? 0
|
numberofdice = sys.skills[skillLibel]?.value ?? 0
|
||||||
title = game.i18n.localize(sys.skills[skillLibel]?.label ?? "CDE.Roll")
|
title = game.i18n.localize(sys.skills[skillLibel]?.label ?? "CDE.Roll")
|
||||||
@@ -329,7 +336,7 @@ export async function rollForActor(actor, rollKey) {
|
|||||||
ui.notifications.warn(game.i18n.localize("CDE.Error6"))
|
ui.notifications.warn(game.i18n.localize("CDE.Error6"))
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
title = `${game.i18n.localize(MAGIC_I18N_KEYS[skillLibel] ?? "CDE.Magics")} [${game.i18n.localize(game.system.CONST?.MAGICS?.[skillLibel]?.speciality?.[specialLibel]?.label ?? "")}]`
|
title = `${game.i18n.localize(MAGIC_I18N_KEYS[skillLibel] ?? "CDE.Magics")} [${game.i18n.localize(MAGICS?.[skillLibel]?.speciality?.[specialLibel]?.label ?? "")}]`
|
||||||
break
|
break
|
||||||
case "itemkungfu": {
|
case "itemkungfu": {
|
||||||
// skillLibel = item._id — look up the kungfu item to find which skill + aspect to use
|
// skillLibel = item._id — look up the kungfu item to find which skill + aspect to use
|
||||||
@@ -474,7 +481,7 @@ export async function rollForActor(actor, rollKey) {
|
|||||||
let defaultSpecialAspect = 0
|
let defaultSpecialAspect = 0
|
||||||
if (isMagicSpecial && specialLibel) {
|
if (isMagicSpecial && specialLibel) {
|
||||||
// Look up the speciality's element from the MAGICS config constant
|
// Look up the speciality's element from the MAGICS config constant
|
||||||
const specialCfg = game.system.CONST?.MAGICS?.[skillLibel]?.speciality?.[specialLibel]
|
const specialCfg = MAGICS?.[skillLibel]?.speciality?.[specialLibel]
|
||||||
const aspectName = LABELELEMENT_TO_ASPECT[specialCfg?.labelelement]
|
const aspectName = LABELELEMENT_TO_ASPECT[specialCfg?.labelelement]
|
||||||
if (aspectName) {
|
if (aspectName) {
|
||||||
defaultSpecialAspect = ASPECT_NAMES.indexOf(aspectName)
|
defaultSpecialAspect = ASPECT_NAMES.indexOf(aspectName)
|
||||||
|
|||||||
@@ -11,6 +11,7 @@ export class CDEBaseActorSheet extends HandlebarsApplicationMixin(foundry.applic
|
|||||||
create: CDEBaseActorSheet.#onItemCreate,
|
create: CDEBaseActorSheet.#onItemCreate,
|
||||||
edit: CDEBaseActorSheet.#onItemEdit,
|
edit: CDEBaseActorSheet.#onItemEdit,
|
||||||
delete: CDEBaseActorSheet.#onItemDelete,
|
delete: CDEBaseActorSheet.#onItemDelete,
|
||||||
|
editImage: CDEBaseActorSheet.#onEditImage,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -21,7 +22,7 @@ export class CDEBaseActorSheet extends HandlebarsApplicationMixin(foundry.applic
|
|||||||
}
|
}
|
||||||
|
|
||||||
async _prepareContext() {
|
async _prepareContext() {
|
||||||
const descriptionHTML = await foundry.applications.ux.TextEditor.implementation.enrichHTML(this.document.system.description ?? "", { async: true })
|
const descriptionHTML = await TextEditor.enrichHTML(this.document.system.description ?? "", { async: true })
|
||||||
const cssClass = this.options.classes?.join(" ") ?? ""
|
const cssClass = this.options.classes?.join(" ") ?? ""
|
||||||
return {
|
return {
|
||||||
actor: this.document,
|
actor: this.document,
|
||||||
@@ -77,4 +78,19 @@ export class CDEBaseActorSheet extends HandlebarsApplicationMixin(foundry.applic
|
|||||||
const item = this.document.items.get(itemId)
|
const item = this.document.items.get(itemId)
|
||||||
if (item) item.delete()
|
if (item) item.delete()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static async #onEditImage(event, target) {
|
||||||
|
const attr = target.dataset.edit
|
||||||
|
const current = foundry.utils.getProperty(this.document, attr)
|
||||||
|
const { img } = this.document.constructor.getDefaultArtwork?.(this.document.toObject()) ?? {}
|
||||||
|
const fp = new FilePicker({
|
||||||
|
current,
|
||||||
|
type: "image",
|
||||||
|
redirectToRoot: img ? [img] : [],
|
||||||
|
callback: (path) => this.document.update({ [attr]: path }),
|
||||||
|
top: this.position.top + 40,
|
||||||
|
left: this.position.left + 10,
|
||||||
|
})
|
||||||
|
return fp.browse()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -59,7 +59,7 @@ export class CDECharacterSheet extends CDEBaseActorSheet {
|
|||||||
}
|
}
|
||||||
|
|
||||||
_onRender(context, options) {
|
_onRender(context, options) {
|
||||||
super._onRender?.(context, options)
|
super._onRender(context, options)
|
||||||
this.#bindInitiativeControls()
|
this.#bindInitiativeControls()
|
||||||
this.#bindPrefs()
|
this.#bindPrefs()
|
||||||
this.#bindRollButtons()
|
this.#bindRollButtons()
|
||||||
@@ -99,7 +99,7 @@ export class CDECharacterSheet extends CDEBaseActorSheet {
|
|||||||
<form class="flexcol">
|
<form class="flexcol">
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label>${game.i18n.localize("CDE.ThrowType")}</label>
|
<label>${game.i18n.localize("CDE.ThrowType")}</label>
|
||||||
<select name="choice" value="${current.choice}">
|
<select name="choice">
|
||||||
<option value="0"${current.choice === "0" ? " selected" : ""}>0</option>
|
<option value="0"${current.choice === "0" ? " selected" : ""}>0</option>
|
||||||
<option value="1"${current.choice === "1" ? " selected" : ""}>1</option>
|
<option value="1"${current.choice === "1" ? " selected" : ""}>1</option>
|
||||||
<option value="2"${current.choice === "2" ? " selected" : ""}>2</option>
|
<option value="2"${current.choice === "2" ? " selected" : ""}>2</option>
|
||||||
@@ -111,15 +111,19 @@ export class CDECharacterSheet extends CDEBaseActorSheet {
|
|||||||
<input type="checkbox" name="check" ${current.check ? "checked" : ""}/>
|
<input type="checkbox" name="check" ${current.check ? "checked" : ""}/>
|
||||||
</div>
|
</div>
|
||||||
</form>`
|
</form>`
|
||||||
const prefs = await Dialog.prompt({
|
const prefs = await foundry.applications.api.DialogV2.prompt({
|
||||||
title: game.i18n.localize("CDE.Preferences"),
|
window: { title: game.i18n.localize("CDE.Preferences") },
|
||||||
content: html,
|
content: html,
|
||||||
|
rejectClose: false,
|
||||||
|
ok: {
|
||||||
label: game.i18n.localize("CDE.Validate"),
|
label: game.i18n.localize("CDE.Validate"),
|
||||||
callback: (dlg) => {
|
callback: (_ev, _btn, dialog) => {
|
||||||
const choice = dlg.querySelector("select[name='choice']")?.value ?? "0"
|
const root = dialog.element ?? dialog
|
||||||
const check = dlg.querySelector("input[name='check']")?.checked ?? false
|
const choice = root.querySelector("select[name='choice']")?.value ?? "0"
|
||||||
|
const check = root.querySelector("input[name='check']")?.checked ?? false
|
||||||
return { choice, check }
|
return { choice, check }
|
||||||
},
|
},
|
||||||
|
},
|
||||||
})
|
})
|
||||||
if (prefs) {
|
if (prefs) {
|
||||||
await this.document.update({
|
await this.document.update({
|
||||||
@@ -166,7 +170,7 @@ export class CDECharacterSheet extends CDEBaseActorSheet {
|
|||||||
speaker: ChatMessage.getSpeaker({ actor: this.document }),
|
speaker: ChatMessage.getSpeaker({ actor: this.document }),
|
||||||
content,
|
content,
|
||||||
rolls: [roll],
|
rolls: [roll],
|
||||||
rollMode: "roll",
|
rollMode: game.settings.get("core", "rollMode") ?? "roll",
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
import { rollInitiativeNPC } from "../../initiative.js"
|
import { rollInitiativeNPC } from "../../initiative.js"
|
||||||
|
import { rollForActor } from "../../rolling.js"
|
||||||
import { CDEBaseActorSheet } from "./base.js"
|
import { CDEBaseActorSheet } from "./base.js"
|
||||||
|
|
||||||
export class CDENpcSheet extends CDEBaseActorSheet {
|
export class CDENpcSheet extends CDEBaseActorSheet {
|
||||||
@@ -17,13 +18,28 @@ export class CDENpcSheet extends CDEBaseActorSheet {
|
|||||||
context.supernaturals = context.items.filter((item) => item.type === "supernatural")
|
context.supernaturals = context.items.filter((item) => item.type === "supernatural")
|
||||||
context.spells = context.items.filter((item) => item.type === "spell")
|
context.spells = context.items.filter((item) => item.type === "spell")
|
||||||
context.kungfus = context.items.filter((item) => item.type === "kungfu")
|
context.kungfus = context.items.filter((item) => item.type === "kungfu")
|
||||||
|
context.weapons = context.items.filter((item) => item.type === "weapon")
|
||||||
|
context.armors = context.items.filter((item) => item.type === "armor")
|
||||||
context.equipments = context.items.filter((item) => item.type === "item")
|
context.equipments = context.items.filter((item) => item.type === "item")
|
||||||
return context
|
return context
|
||||||
}
|
}
|
||||||
|
|
||||||
_onRender(context, options) {
|
_onRender(context, options) {
|
||||||
super._onRender?.(context, options)
|
super._onRender(context, options)
|
||||||
this.#bindInitiativeControls()
|
this.#bindInitiativeControls()
|
||||||
|
this.#bindRollButtons()
|
||||||
|
}
|
||||||
|
|
||||||
|
#bindRollButtons() {
|
||||||
|
const cells = this.element?.querySelectorAll(".cde-roll-trigger[data-libel-id]")
|
||||||
|
if (!cells?.length) return
|
||||||
|
cells.forEach((cell) => {
|
||||||
|
cell.addEventListener("click", (event) => {
|
||||||
|
event.preventDefault()
|
||||||
|
const rollKey = cell.dataset.libelId
|
||||||
|
if (rollKey) rollForActor(this.document, rollKey)
|
||||||
|
})
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
#bindInitiativeControls() {
|
#bindInitiativeControls() {
|
||||||
|
|||||||
@@ -6,7 +6,9 @@ export class CDEBaseItemSheet extends HandlebarsApplicationMixin(foundry.applica
|
|||||||
position: { width: 520, height: "auto" },
|
position: { width: 520, height: "auto" },
|
||||||
window: { resizable: true },
|
window: { resizable: true },
|
||||||
form: { submitOnChange: true },
|
form: { submitOnChange: true },
|
||||||
actions: {},
|
actions: {
|
||||||
|
editImage: CDEBaseItemSheet.#onEditImage,
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
tabGroups = { primary: "details" }
|
tabGroups = { primary: "details" }
|
||||||
@@ -17,8 +19,8 @@ export class CDEBaseItemSheet extends HandlebarsApplicationMixin(foundry.applica
|
|||||||
|
|
||||||
async _prepareContext() {
|
async _prepareContext() {
|
||||||
const cssClass = this.options.classes?.join(" ") ?? ""
|
const cssClass = this.options.classes?.join(" ") ?? ""
|
||||||
const enrichedDescription = await foundry.applications.ux.TextEditor.implementation.enrichHTML(this.document.system.description ?? "", { async: true })
|
const enrichedDescription = await TextEditor.enrichHTML(this.document.system.description ?? "", { async: true })
|
||||||
const enrichedNotes = await foundry.applications.ux.TextEditor.implementation.enrichHTML(this.document.system.notes ?? "", { async: true })
|
const enrichedNotes = await TextEditor.enrichHTML(this.document.system.notes ?? "", { async: true })
|
||||||
return {
|
return {
|
||||||
item: this.document,
|
item: this.document,
|
||||||
system: this.document.system,
|
system: this.document.system,
|
||||||
@@ -40,4 +42,19 @@ export class CDEBaseItemSheet extends HandlebarsApplicationMixin(foundry.applica
|
|||||||
this.changeTab(tab, group, { force: true })
|
this.changeTab(tab, group, { force: true })
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static async #onEditImage(event, target) {
|
||||||
|
const attr = target.dataset.edit
|
||||||
|
const current = foundry.utils.getProperty(this.document, attr)
|
||||||
|
const { img } = this.document.constructor.getDefaultArtwork?.(this.document.toObject()) ?? {}
|
||||||
|
const fp = new FilePicker({
|
||||||
|
current,
|
||||||
|
type: "image",
|
||||||
|
redirectToRoot: img ? [img] : [],
|
||||||
|
callback: (path) => this.document.update({ [attr]: path }),
|
||||||
|
top: this.position.top + 40,
|
||||||
|
left: this.position.left + 10,
|
||||||
|
})
|
||||||
|
return fp.browse()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
{{log 'actor-sheet' this}}
|
{{log 'actor-sheet' this}}
|
||||||
|
|
||||||
<header class="cde-header cde-actor-header">
|
<header class="cde-header cde-actor-header">
|
||||||
<img class="profile-img" src="{{actor.img}}" data-edit="img" title="{{actor.name}}" />
|
<img class="profile-img" src="{{actor.img}}" data-action="editImage" data-edit="img" title="{{actor.name}}" />
|
||||||
<div class="header-fields">
|
<div class="header-fields">
|
||||||
<div class="cde-header-top">
|
<div class="cde-header-top">
|
||||||
<h1 class="charname">
|
<h1 class="charname">
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
<section class="flexcol cde-sheet cde-actor {{cssClass}}">
|
<section class="flexcol cde-sheet cde-actor {{cssClass}}">
|
||||||
<header class="cde-header cde-actor-header">
|
<header class="cde-header cde-actor-header">
|
||||||
<img class="profile-img" src="{{actor.img}}" data-edit="img" title="{{actor.name}}" />
|
<img class="profile-img" src="{{actor.img}}" data-action="editImage" data-edit="img" title="{{actor.name}}" />
|
||||||
<div class="header-fields">
|
<div class="header-fields">
|
||||||
<h1 class="charname">
|
<h1 class="charname">
|
||||||
<input name="name" type="text" value="{{actor.name}}" placeholder="{{ localize 'CDE.LoksyuName' }}" />
|
<input name="name" type="text" value="{{actor.name}}" placeholder="{{ localize 'CDE.LoksyuName' }}" />
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
<section class="flexcol cde-sheet cde-actor {{cssClass}}">
|
<section class="flexcol cde-sheet cde-actor {{cssClass}}">
|
||||||
<header class="cde-header cde-actor-header">
|
<header class="cde-header cde-actor-header">
|
||||||
<img class="profile-img" src="{{actor.img}}" data-edit="img" title="{{actor.name}}" />
|
<img class="profile-img" src="{{actor.img}}" data-action="editImage" data-edit="img" title="{{actor.name}}" />
|
||||||
<div class="header-fields">
|
<div class="header-fields">
|
||||||
<div class="cde-header-top">
|
<div class="cde-header-top">
|
||||||
<h1 class="charname">
|
<h1 class="charname">
|
||||||
@@ -110,6 +110,9 @@
|
|||||||
<td class="cde-spec-cell">
|
<td class="cde-spec-cell">
|
||||||
<input type="text" placeholder="{{ localize 'CDE.Specialities' }}…" name="system.aptitudes.physical.speciality" value="{{systemData.aptitudes.physical.speciality}}" />
|
<input type="text" placeholder="{{ localize 'CDE.Specialities' }}…" name="system.aptitudes.physical.speciality" value="{{systemData.aptitudes.physical.speciality}}" />
|
||||||
</td>
|
</td>
|
||||||
|
<td class="cde-roll-cell">
|
||||||
|
<a class="cde-roll-trigger" data-libel-id="physical-aptitude" title="{{ localize 'CDE.Roll' }}"><i class="fas fa-dice-d10"></i></a>
|
||||||
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td class="cde-skill-label"><b>{{ localize "CDE.Martial" }}</b></td>
|
<td class="cde-skill-label"><b>{{ localize "CDE.Martial" }}</b></td>
|
||||||
@@ -119,6 +122,9 @@
|
|||||||
<td class="cde-spec-cell">
|
<td class="cde-spec-cell">
|
||||||
<input type="text" placeholder="{{ localize 'CDE.Specialities' }}…" name="system.aptitudes.martial.speciality" value="{{systemData.aptitudes.martial.speciality}}" />
|
<input type="text" placeholder="{{ localize 'CDE.Specialities' }}…" name="system.aptitudes.martial.speciality" value="{{systemData.aptitudes.martial.speciality}}" />
|
||||||
</td>
|
</td>
|
||||||
|
<td class="cde-roll-cell">
|
||||||
|
<a class="cde-roll-trigger" data-libel-id="martial-aptitude" title="{{ localize 'CDE.Roll' }}"><i class="fas fa-dice-d10"></i></a>
|
||||||
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td class="cde-skill-label"><b>{{ localize "CDE.Mental" }}</b></td>
|
<td class="cde-skill-label"><b>{{ localize "CDE.Mental" }}</b></td>
|
||||||
@@ -128,6 +134,9 @@
|
|||||||
<td class="cde-spec-cell">
|
<td class="cde-spec-cell">
|
||||||
<input type="text" placeholder="{{ localize 'CDE.Specialities' }}…" name="system.aptitudes.mental.speciality" value="{{systemData.aptitudes.mental.speciality}}" />
|
<input type="text" placeholder="{{ localize 'CDE.Specialities' }}…" name="system.aptitudes.mental.speciality" value="{{systemData.aptitudes.mental.speciality}}" />
|
||||||
</td>
|
</td>
|
||||||
|
<td class="cde-roll-cell">
|
||||||
|
<a class="cde-roll-trigger" data-libel-id="mental-aptitude" title="{{ localize 'CDE.Roll' }}"><i class="fas fa-dice-d10"></i></a>
|
||||||
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td class="cde-skill-label"><b>{{ localize "CDE.Social" }}</b></td>
|
<td class="cde-skill-label"><b>{{ localize "CDE.Social" }}</b></td>
|
||||||
@@ -137,6 +146,9 @@
|
|||||||
<td class="cde-spec-cell">
|
<td class="cde-spec-cell">
|
||||||
<input type="text" placeholder="{{ localize 'CDE.Specialities' }}…" name="system.aptitudes.social.speciality" value="{{systemData.aptitudes.social.speciality}}" />
|
<input type="text" placeholder="{{ localize 'CDE.Specialities' }}…" name="system.aptitudes.social.speciality" value="{{systemData.aptitudes.social.speciality}}" />
|
||||||
</td>
|
</td>
|
||||||
|
<td class="cde-roll-cell">
|
||||||
|
<a class="cde-roll-trigger" data-libel-id="social-aptitude" title="{{ localize 'CDE.Roll' }}"><i class="fas fa-dice-d10"></i></a>
|
||||||
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td class="cde-skill-label"><b>{{ localize "CDE.Spiritual" }}</b></td>
|
<td class="cde-skill-label"><b>{{ localize "CDE.Spiritual" }}</b></td>
|
||||||
@@ -146,6 +158,9 @@
|
|||||||
<td class="cde-spec-cell">
|
<td class="cde-spec-cell">
|
||||||
<input type="text" placeholder="{{ localize 'CDE.Specialities' }}…" name="system.aptitudes.spiritual.speciality" value="{{systemData.aptitudes.spiritual.speciality}}" />
|
<input type="text" placeholder="{{ localize 'CDE.Specialities' }}…" name="system.aptitudes.spiritual.speciality" value="{{systemData.aptitudes.spiritual.speciality}}" />
|
||||||
</td>
|
</td>
|
||||||
|
<td class="cde-roll-cell">
|
||||||
|
<a class="cde-roll-trigger" data-libel-id="spiritual-aptitude" title="{{ localize 'CDE.Roll' }}"><i class="fas fa-dice-d10"></i></a>
|
||||||
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
</table>
|
</table>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
<section class="flexcol cde-sheet cde-actor {{cssClass}}">
|
<section class="flexcol cde-sheet cde-actor {{cssClass}}">
|
||||||
<header class="cde-header cde-actor-header">
|
<header class="cde-header cde-actor-header">
|
||||||
<img class="profile-img" src="{{actor.img}}" data-edit="img" title="{{actor.name}}" />
|
<img class="profile-img" src="{{actor.img}}" data-action="editImage" data-edit="img" title="{{actor.name}}" />
|
||||||
<div class="header-fields">
|
<div class="header-fields">
|
||||||
<h1 class="charname">
|
<h1 class="charname">
|
||||||
<input name="name" type="text" value="{{actor.name}}" placeholder="{{ localize 'CDE.TinJiName' }}" />
|
<input name="name" type="text" value="{{actor.name}}" placeholder="{{ localize 'CDE.TinJiName' }}" />
|
||||||
|
|||||||
@@ -1,8 +1,58 @@
|
|||||||
|
{{!-- Weapons --}}
|
||||||
|
{{#if weapons.length}}
|
||||||
|
<p class="cde-item-group-label">{{ localize "CDE.Weapons" }}</p>
|
||||||
|
{{/if}}
|
||||||
<ol class="item-list">
|
<ol class="item-list">
|
||||||
{{#each equipments as |item id|}}
|
{{#each weapons as |item|}}
|
||||||
<li class="item flexrow" data-item-id="{{item._id}}">
|
<li class="item flexrow" data-item-id="{{item._id}}">
|
||||||
<img src="{{item.img}}" title="{{item.name}}" width="24" height="24" />
|
<img src="{{item.img}}" title="{{item.name}}" width="24" height="24" />
|
||||||
<h4 class="item-name">{{item.name}}</h4>
|
<h4 class="item-name">{{item.name}}</h4>
|
||||||
|
<span class="cde-badge weapon">{{ localize "CDE.WeaponType" }}</span>
|
||||||
|
{{#if item.system.damageBase}}<span class="cde-item-stat cde-item-damage">{{item.system.damageBase}}</span>{{/if}}
|
||||||
|
<div class="item-controls">
|
||||||
|
<a class="item-control cde-roll-trigger cde-weapon-roll-btn" title="{{ localize 'CDE.WeaponRoll' }}" data-libel-id="{{item._id}}-itemweapon"><i class="fas fa-dice-d10"></i></a>
|
||||||
|
<a class="item-control" title="{{ localize 'CDE.ItemEdit' }}" data-action="edit"><i class="fas fa-edit"></i></a>
|
||||||
|
<a class="item-control" title="{{ localize 'CDE.ItemDelete' }}" data-action="delete"><i class="fas fa-trash"></i></a>
|
||||||
|
</div>
|
||||||
|
</li>
|
||||||
|
{{/each}}
|
||||||
|
</ol>
|
||||||
|
<p>
|
||||||
|
<a class="item-control" title="{{ localize 'CDE.WeaponCreate' }}" data-action="create" data-type="weapon"><i class="fas fa-plus"></i> {{ localize "CDE.WeaponCreate" }}</a>
|
||||||
|
</p>
|
||||||
|
|
||||||
|
{{!-- Armors --}}
|
||||||
|
{{#if armors.length}}
|
||||||
|
<p class="cde-item-group-label">{{ localize "CDE.Armors" }}</p>
|
||||||
|
{{/if}}
|
||||||
|
<ol class="item-list">
|
||||||
|
{{#each armors as |item|}}
|
||||||
|
<li class="item flexrow" data-item-id="{{item._id}}">
|
||||||
|
<img src="{{item.img}}" title="{{item.name}}" width="24" height="24" />
|
||||||
|
<h4 class="item-name">{{item.name}}</h4>
|
||||||
|
<span class="cde-badge armor">{{ localize "CDE.ArmorType" }}</span>
|
||||||
|
{{#if item.system.protection}}<span class="cde-item-stat">{{item.system.protection}}</span>{{/if}}
|
||||||
|
<div class="item-controls">
|
||||||
|
<a class="item-control" title="{{ localize 'CDE.ItemEdit' }}" data-action="edit"><i class="fas fa-edit"></i></a>
|
||||||
|
<a class="item-control" title="{{ localize 'CDE.ItemDelete' }}" data-action="delete"><i class="fas fa-trash"></i></a>
|
||||||
|
</div>
|
||||||
|
</li>
|
||||||
|
{{/each}}
|
||||||
|
</ol>
|
||||||
|
<p>
|
||||||
|
<a class="item-control" title="{{ localize 'CDE.ArmorCreate' }}" data-action="create" data-type="armor"><i class="fas fa-plus"></i> {{ localize "CDE.ArmorCreate" }}</a>
|
||||||
|
</p>
|
||||||
|
|
||||||
|
{{!-- Generic items --}}
|
||||||
|
{{#if equipments.length}}
|
||||||
|
<p class="cde-item-group-label">{{ localize "CDE.Items" }}</p>
|
||||||
|
{{/if}}
|
||||||
|
<ol class="item-list">
|
||||||
|
{{#each equipments as |item|}}
|
||||||
|
<li class="item flexrow" data-item-id="{{item._id}}">
|
||||||
|
<img src="{{item.img}}" title="{{item.name}}" width="24" height="24" />
|
||||||
|
<h4 class="item-name">{{item.name}}</h4>
|
||||||
|
<span class="cde-badge item">{{ localize "CDE.ItemType" }}</span>
|
||||||
<div class="item-controls">
|
<div class="item-controls">
|
||||||
<a class="item-control" title="{{ localize 'CDE.ItemEdit' }}" data-action="edit"><i class="fas fa-edit"></i></a>
|
<a class="item-control" title="{{ localize 'CDE.ItemEdit' }}" data-action="edit"><i class="fas fa-edit"></i></a>
|
||||||
<a class="item-control" title="{{ localize 'CDE.ItemDelete' }}" data-action="delete"><i class="fas fa-trash"></i></a>
|
<a class="item-control" title="{{ localize 'CDE.ItemDelete' }}" data-action="delete"><i class="fas fa-trash"></i></a>
|
||||||
|
|||||||
@@ -1,15 +1,2 @@
|
|||||||
<ol class="item-list">
|
{{!-- NPC Kung-Fu tab — reuse character card design --}}
|
||||||
{{#each kungfus as |item id|}}
|
{{> "systems/fvtt-chroniques-de-l-etrange/templates/actor/parts/cde-character-kungfus.html"}}
|
||||||
<li class="item flexrow" data-item-id="{{item._id}}">
|
|
||||||
<img src="{{item.img}}" title="{{item.name}}" width="24" height="24" />
|
|
||||||
<h4 class="item-name">{{item.name}}</h4>
|
|
||||||
<div class="item-controls">
|
|
||||||
<a class="item-control" title="{{ localize 'CDE.KFEdit' }}" data-action="edit"><i class="fas fa-edit"></i></a>
|
|
||||||
<a class="item-control" title="{{ localize 'CDE.KFDelete' }}" data-action="delete"><i class="fas fa-trash"></i></a>
|
|
||||||
</div>
|
|
||||||
</li>
|
|
||||||
{{/each}}
|
|
||||||
</ol>
|
|
||||||
<p>
|
|
||||||
<a class="item-control" title="{{ localize 'CDE.KFCreate' }}" data-action="create" data-type="kungfu"><i class="fas fa-plus"></i> {{ localize "CDE.KFCreate" }}</a>
|
|
||||||
</p>
|
|
||||||
|
|||||||
@@ -1,8 +1,14 @@
|
|||||||
|
{{#if spells.length}}
|
||||||
<ol class="item-list">
|
<ol class="item-list">
|
||||||
{{#each spells as |item id|}}
|
{{#each spells as |item|}}
|
||||||
<li class="item flexrow" data-item-id="{{item._id}}">
|
<li class="item flexrow" data-item-id="{{item._id}}">
|
||||||
|
{{#if item.system.aspect}}
|
||||||
|
<img class="cde-spell-aspect-icon" src="{{ getElementIcon item.system.aspect }}" title="{{item.system.aspect}}" width="24" height="24" />
|
||||||
|
{{else}}
|
||||||
<img src="{{item.img}}" title="{{item.name}}" width="24" height="24" />
|
<img src="{{item.img}}" title="{{item.name}}" width="24" height="24" />
|
||||||
|
{{/if}}
|
||||||
<h4 class="item-name">{{item.name}}</h4>
|
<h4 class="item-name">{{item.name}}</h4>
|
||||||
|
{{#if item.system.discipline}}<span class="cde-badge spell">{{item.system.discipline}}</span>{{/if}}
|
||||||
<div class="item-controls">
|
<div class="item-controls">
|
||||||
<a class="item-control" title="{{ localize 'CDE.SpellEdit' }}" data-action="edit"><i class="fas fa-edit"></i></a>
|
<a class="item-control" title="{{ localize 'CDE.SpellEdit' }}" data-action="edit"><i class="fas fa-edit"></i></a>
|
||||||
<a class="item-control" title="{{ localize 'CDE.SpellDelete' }}" data-action="delete"><i class="fas fa-trash"></i></a>
|
<a class="item-control" title="{{ localize 'CDE.SpellDelete' }}" data-action="delete"><i class="fas fa-trash"></i></a>
|
||||||
@@ -10,6 +16,9 @@
|
|||||||
</li>
|
</li>
|
||||||
{{/each}}
|
{{/each}}
|
||||||
</ol>
|
</ol>
|
||||||
|
{{else}}
|
||||||
|
<p class="cde-empty-list">{{ localize "CDE.NoSpells" }}</p>
|
||||||
|
{{/if}}
|
||||||
<p>
|
<p>
|
||||||
<a class="item-control" title="{{ localize 'CDE.SpellCreate' }}" data-action="create" data-type="spell"><i class="fas fa-plus"></i> {{ localize "CDE.SpellCreate" }}</a>
|
<a class="item-control" title="{{ localize 'CDE.SpellCreate' }}" data-action="create" data-type="spell"><i class="fas fa-plus"></i> {{ localize "CDE.SpellCreate" }}</a>
|
||||||
</p>
|
</p>
|
||||||
|
|||||||
@@ -1,15 +1,29 @@
|
|||||||
<ol class="item-list">
|
{{#if supernaturals.length}}
|
||||||
{{#each supernaturals as |item id|}}
|
<ol class="item-list cde-supernatural-list">
|
||||||
<li class="item flexrow" data-item-id="{{item._id}}">
|
{{#each supernaturals as |item|}}
|
||||||
<img src="{{item.img}}" title="{{item.name}}" width="24" height="24" />
|
<li class="item cde-supernatural-item" data-item-id="{{item._id}}">
|
||||||
<h4 class="item-name">{{item.name}}</h4>
|
<div class="cde-supernatural-header flexrow">
|
||||||
|
<img src="{{item.img}}" title="{{item.name}}" width="28" height="28" />
|
||||||
|
<div class="cde-supernatural-info">
|
||||||
|
<span class="cde-supernatural-name">{{item.name}}</span>
|
||||||
|
{{#if item.system.activation}}
|
||||||
|
<span class="cde-act-badge cde-act--{{item.system.activation}}" title="{{ getActivationLabel item.system.activation }}">{{ getActivationLabel item.system.activation }}</span>
|
||||||
|
{{/if}}
|
||||||
|
</div>
|
||||||
<div class="item-controls">
|
<div class="item-controls">
|
||||||
<a class="item-control" title="{{ localize 'CDE.SupernaturalEdit' }}" data-action="edit"><i class="fas fa-edit"></i></a>
|
<a class="item-control" title="{{ localize 'CDE.SupernaturalEdit' }}" data-action="edit"><i class="fas fa-edit"></i></a>
|
||||||
<a class="item-control" title="{{ localize 'CDE.SupernaturalDelete' }}" data-action="delete"><i class="fas fa-trash"></i></a>
|
<a class="item-control" title="{{ localize 'CDE.SupernaturalDelete' }}" data-action="delete"><i class="fas fa-trash"></i></a>
|
||||||
</div>
|
</div>
|
||||||
|
</div>
|
||||||
|
{{#if item.system.description}}
|
||||||
|
<div class="cde-supernatural-desc">{{{item.system.description}}}</div>
|
||||||
|
{{/if}}
|
||||||
</li>
|
</li>
|
||||||
{{/each}}
|
{{/each}}
|
||||||
</ol>
|
</ol>
|
||||||
|
{{else}}
|
||||||
|
<p class="cde-empty-list">{{ localize "CDE.NoSupernaturals" }}</p>
|
||||||
|
{{/if}}
|
||||||
<p>
|
<p>
|
||||||
<a class="item-control" title="{{ localize 'CDE.SupernaturalCreate' }}" data-action="create" data-type="supernatural"><i class="fas fa-plus"></i> {{ localize "CDE.SupernaturalCreate" }}</a>
|
<a class="item-control" title="{{ localize 'CDE.SupernaturalCreate' }}" data-action="create" data-type="supernatural"><i class="fas fa-plus"></i> {{ localize "CDE.SupernaturalCreate" }}</a>
|
||||||
</p>
|
</p>
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
<section class="flexcol cde-sheet {{cssClass}}">
|
<section class="flexcol cde-sheet {{cssClass}}">
|
||||||
<header class="cde-neon-header armor">
|
<header class="cde-neon-header armor">
|
||||||
<img class="cde-avatar" src="{{item.img}}" data-edit="img" title="{{item.name}}" />
|
<img class="cde-avatar" src="{{item.img}}" data-action="editImage" data-edit="img" title="{{item.name}}" />
|
||||||
<div class="cde-header-content">
|
<div class="cde-header-content">
|
||||||
<h1 class="cde-item-name">
|
<h1 class="cde-item-name">
|
||||||
<input name="name" type="text" value="{{item.name}}" placeholder="{{ localize 'CDE.Name' }}" />
|
<input name="name" type="text" value="{{item.name}}" placeholder="{{ localize 'CDE.Name' }}" />
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
<section class="flexcol cde-sheet {{cssClass}}">
|
<section class="flexcol cde-sheet {{cssClass}}">
|
||||||
<header class="cde-neon-header ingredient">
|
<header class="cde-neon-header ingredient">
|
||||||
<img class="cde-avatar" src="{{item.img}}" data-edit="img" title="{{item.name}}" />
|
<img class="cde-avatar" src="{{item.img}}" data-action="editImage" data-edit="img" title="{{item.name}}" />
|
||||||
<div class="cde-header-content">
|
<div class="cde-header-content">
|
||||||
<h1 class="cde-item-name">
|
<h1 class="cde-item-name">
|
||||||
<input name="name" type="text" value="{{item.name}}" placeholder="{{ localize 'CDE.Name' }}" />
|
<input name="name" type="text" value="{{item.name}}" placeholder="{{ localize 'CDE.Name' }}" />
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
<section class="flexcol cde-sheet {{cssClass}}">
|
<section class="flexcol cde-sheet {{cssClass}}">
|
||||||
<header class="cde-neon-header item">
|
<header class="cde-neon-header item">
|
||||||
<img class="cde-avatar" src="{{item.img}}" data-edit="img" title="{{item.name}}" />
|
<img class="cde-avatar" src="{{item.img}}" data-action="editImage" data-edit="img" title="{{item.name}}" />
|
||||||
<div class="cde-header-content">
|
<div class="cde-header-content">
|
||||||
<h1 class="cde-item-name">
|
<h1 class="cde-item-name">
|
||||||
<input name="name" type="text" value="{{item.name}}" placeholder="{{ localize 'CDE.Name' }}" />
|
<input name="name" type="text" value="{{item.name}}" placeholder="{{ localize 'CDE.Name' }}" />
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
<section class="flexcol cde-sheet {{cssClass}}">
|
<section class="flexcol cde-sheet {{cssClass}}">
|
||||||
<header class="cde-neon-header kungfu">
|
<header class="cde-neon-header kungfu">
|
||||||
<img class="cde-avatar" src="{{item.img}}" data-edit="img" title="{{item.name}}" />
|
<img class="cde-avatar" src="{{item.img}}" data-action="editImage" data-edit="img" title="{{item.name}}" />
|
||||||
<div class="cde-header-content">
|
<div class="cde-header-content">
|
||||||
<h1 class="cde-item-name">
|
<h1 class="cde-item-name">
|
||||||
<input name="name" type="text" value="{{item.name}}" placeholder="{{ localize 'CDE.Name' }}" />
|
<input name="name" type="text" value="{{item.name}}" placeholder="{{ localize 'CDE.Name' }}" />
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
<section class="flexcol cde-sheet {{cssClass}}">
|
<section class="flexcol cde-sheet {{cssClass}}">
|
||||||
<header class="cde-neon-header sanhei">
|
<header class="cde-neon-header sanhei">
|
||||||
<img class="cde-avatar" src="{{item.img}}" data-edit="img" title="{{item.name}}" />
|
<img class="cde-avatar" src="{{item.img}}" data-action="editImage" data-edit="img" title="{{item.name}}" />
|
||||||
<div class="cde-header-content">
|
<div class="cde-header-content">
|
||||||
<h1 class="cde-item-name">
|
<h1 class="cde-item-name">
|
||||||
<input name="name" type="text" value="{{item.name}}" placeholder="{{ localize 'CDE.Name' }}" />
|
<input name="name" type="text" value="{{item.name}}" placeholder="{{ localize 'CDE.Name' }}" />
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
<section class="flexcol cde-sheet {{cssClass}}">
|
<section class="flexcol cde-sheet {{cssClass}}">
|
||||||
<header class="cde-neon-header spell">
|
<header class="cde-neon-header spell">
|
||||||
<img class="cde-avatar" src="{{item.img}}" data-edit="img" title="{{item.name}}" />
|
<img class="cde-avatar" src="{{item.img}}" data-action="editImage" data-edit="img" title="{{item.name}}" />
|
||||||
<div class="cde-header-content">
|
<div class="cde-header-content">
|
||||||
<h1 class="cde-item-name">
|
<h1 class="cde-item-name">
|
||||||
<input name="name" type="text" value="{{item.name}}" placeholder="{{ localize 'CDE.Name' }}" />
|
<input name="name" type="text" value="{{item.name}}" placeholder="{{ localize 'CDE.Name' }}" />
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
<section class="flexcol cde-sheet {{cssClass}}">
|
<section class="flexcol cde-sheet {{cssClass}}">
|
||||||
<header class="cde-neon-header supernatural">
|
<header class="cde-neon-header supernatural">
|
||||||
<img class="cde-avatar" src="{{item.img}}" data-edit="img" title="{{item.name}}" />
|
<img class="cde-avatar" src="{{item.img}}" data-action="editImage" data-edit="img" title="{{item.name}}" />
|
||||||
<div class="cde-header-content">
|
<div class="cde-header-content">
|
||||||
<h1 class="cde-item-name">
|
<h1 class="cde-item-name">
|
||||||
<input name="name" type="text" value="{{item.name}}" placeholder="{{ localize 'CDE.Name' }}" />
|
<input name="name" type="text" value="{{item.name}}" placeholder="{{ localize 'CDE.Name' }}" />
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
<section class="flexcol cde-sheet {{cssClass}}">
|
<section class="flexcol cde-sheet {{cssClass}}">
|
||||||
<header class="cde-neon-header weapon">
|
<header class="cde-neon-header weapon">
|
||||||
<img class="cde-avatar" src="{{item.img}}" data-edit="img" title="{{item.name}}" />
|
<img class="cde-avatar" src="{{item.img}}" data-action="editImage" data-edit="img" title="{{item.name}}" />
|
||||||
<div class="cde-header-content">
|
<div class="cde-header-content">
|
||||||
<h1 class="cde-item-name">
|
<h1 class="cde-item-name">
|
||||||
<input name="name" type="text" value="{{item.name}}" placeholder="{{ localize 'CDE.Name' }}" />
|
<input name="name" type="text" value="{{item.name}}" placeholder="{{ localize 'CDE.Name' }}" />
|
||||||
|
|||||||
Reference in New Issue
Block a user