Compare commits
5 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 20b41f2cd4 | |||
| 34b7e32d08 | |||
| 75f79c1c08 | |||
| 188717c925 | |||
| 066e3bbaf5 |
@@ -2179,6 +2179,25 @@ section.npc .cde-neon-tabs .item.active {
|
|||||||
.cde-magic-toggle:hover i {
|
.cde-magic-toggle:hover i {
|
||||||
color: #e2e8f4;
|
color: #e2e8f4;
|
||||||
}
|
}
|
||||||
|
.cde-magic-order-btn {
|
||||||
|
width: 20px;
|
||||||
|
height: 20px;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
cursor: pointer;
|
||||||
|
color: #7d94b8;
|
||||||
|
border-radius: 3px;
|
||||||
|
flex-shrink: 0;
|
||||||
|
transition: color 0.12s, background 0.12s;
|
||||||
|
}
|
||||||
|
.cde-magic-order-btn i {
|
||||||
|
font-size: 9px;
|
||||||
|
}
|
||||||
|
.cde-magic-order-btn:hover {
|
||||||
|
color: #e2e8f4;
|
||||||
|
background: rgba(38, 56, 83, 0.25);
|
||||||
|
}
|
||||||
.cde-magic-specialities {
|
.cde-magic-specialities {
|
||||||
border-top: 1px solid #1a2436;
|
border-top: 1px solid #1a2436;
|
||||||
padding: 4px 0;
|
padding: 4px 0;
|
||||||
@@ -3523,6 +3542,12 @@ ol.item-list li.item .item-controls a.item-control:hover {
|
|||||||
color: var(--rr-accent, #e2e8f4);
|
color: var(--rr-accent, #e2e8f4);
|
||||||
text-shadow: 0 0 12px var(--rr-accent, transparent);
|
text-shadow: 0 0 12px var(--rr-accent, transparent);
|
||||||
}
|
}
|
||||||
|
.cde-roll-result .cde-rr-hero .cde-rr-spell-power .cde-rr-spell-power-formula {
|
||||||
|
font-size: 10px;
|
||||||
|
color: #7d94b8;
|
||||||
|
margin: 2px 0;
|
||||||
|
white-space: nowrap;
|
||||||
|
}
|
||||||
.cde-roll-result .cde-rr-hero .cde-rr-spell-power .cde-rr-spell-power-label {
|
.cde-roll-result .cde-rr-hero .cde-rr-spell-power .cde-rr-spell-power-label {
|
||||||
font-size: 9px;
|
font-size: 9px;
|
||||||
font-weight: 700;
|
font-weight: 700;
|
||||||
|
|||||||
@@ -2253,6 +2253,23 @@ section.npc .cde-neon-tabs .item.active { color: @cde-supernatural; borde
|
|||||||
&:hover i { color: @cde-text; }
|
&:hover i { color: @cde-text; }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.cde-magic-order-btn {
|
||||||
|
width: 20px;
|
||||||
|
height: 20px;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
cursor: pointer;
|
||||||
|
color: @cde-muted;
|
||||||
|
border-radius: 3px;
|
||||||
|
flex-shrink: 0;
|
||||||
|
transition: color 0.12s, background 0.12s;
|
||||||
|
|
||||||
|
i { font-size: 9px; }
|
||||||
|
|
||||||
|
&:hover { color: @cde-text; background: fade(@cde-border-hi, 25%); }
|
||||||
|
}
|
||||||
|
|
||||||
// Specialities list
|
// Specialities list
|
||||||
.cde-magic-specialities {
|
.cde-magic-specialities {
|
||||||
border-top: 1px solid @cde-border;
|
border-top: 1px solid @cde-border;
|
||||||
@@ -3582,6 +3599,13 @@ ol.item-list {
|
|||||||
text-shadow: 0 0 12px var(--rr-accent, transparent);
|
text-shadow: 0 0 12px var(--rr-accent, transparent);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.cde-rr-spell-power-formula {
|
||||||
|
font-size: 10px;
|
||||||
|
color: @cde-muted;
|
||||||
|
margin: 2px 0;
|
||||||
|
white-space: nowrap;
|
||||||
|
}
|
||||||
|
|
||||||
.cde-rr-spell-power-label {
|
.cde-rr-spell-power-label {
|
||||||
font-size: 9px;
|
font-size: 9px;
|
||||||
font-weight: 700;
|
font-weight: 700;
|
||||||
|
|||||||
Vendored
+145
-61
@@ -595,6 +595,20 @@ function registerSettings() {
|
|||||||
water: { yin: 0, yang: 0 }
|
water: { yin: 0, yang: 0 }
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
game.settings.register(SYSTEM_ID, "loksyuConsumptionOrder", {
|
||||||
|
name: "CDE.Settings.LoksyuConsumptionOrder",
|
||||||
|
hint: "CDE.Settings.LoksyuConsumptionOrderHint",
|
||||||
|
scope: "world",
|
||||||
|
config: true,
|
||||||
|
type: String,
|
||||||
|
choices: {
|
||||||
|
"yang-first": "CDE.Settings.LoksyuOrderYangFirst",
|
||||||
|
"yin-first": "CDE.Settings.LoksyuOrderYinFirst",
|
||||||
|
"balanced": "CDE.Settings.LoksyuOrderBalanced"
|
||||||
|
},
|
||||||
|
default: "yang-first",
|
||||||
|
onChange: () => Hooks.callAll("cde:loksyuUpdated")
|
||||||
|
});
|
||||||
game.settings.register(SYSTEM_ID, "tinjiData", {
|
game.settings.register(SYSTEM_ID, "tinjiData", {
|
||||||
scope: "world",
|
scope: "world",
|
||||||
config: false,
|
config: false,
|
||||||
@@ -647,6 +661,7 @@ function preLocalizeConfig() {
|
|||||||
magic.aspectlabel = game.i18n.localize(magic.aspectlabel);
|
magic.aspectlabel = game.i18n.localize(magic.aspectlabel);
|
||||||
Object.values(magic.speciality).forEach((spec) => {
|
Object.values(magic.speciality).forEach((spec) => {
|
||||||
spec.label = game.i18n.localize(spec.label);
|
spec.label = game.i18n.localize(spec.label);
|
||||||
|
spec.labelelementkey = spec.labelelement;
|
||||||
spec.labelelement = game.i18n.localize(spec.labelelement);
|
spec.labelelement = game.i18n.localize(spec.labelelement);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
@@ -760,9 +775,8 @@ var CharacterDataModel = class extends foundry.abstract.TypeDataModel {
|
|||||||
typeofthrow: numberField(0),
|
typeofthrow: numberField(0),
|
||||||
aspectskill: numberField(0),
|
aspectskill: numberField(0),
|
||||||
bonusmalusskill: numberField(0),
|
bonusmalusskill: numberField(0),
|
||||||
aspectspeciality: numberField(0),
|
|
||||||
rolldifficulty: numberField(0),
|
rolldifficulty: numberField(0),
|
||||||
bonusmalusspeciality: numberField(0)
|
freepowerlevels: numberField(0)
|
||||||
})
|
})
|
||||||
}),
|
}),
|
||||||
aspect: new fields.SchemaField({
|
aspect: new fields.SchemaField({
|
||||||
@@ -801,6 +815,10 @@ var CharacterDataModel = class extends foundry.abstract.TypeDataModel {
|
|||||||
nine: componentField(),
|
nine: componentField(),
|
||||||
zero: componentField()
|
zero: componentField()
|
||||||
}),
|
}),
|
||||||
|
magicOrder: new fields.ArrayField(
|
||||||
|
new fields.StringField({ required: true, nullable: false, initial: "" }),
|
||||||
|
{ required: true, initial: [] }
|
||||||
|
),
|
||||||
magics: new fields.SchemaField({
|
magics: new fields.SchemaField({
|
||||||
internalcinnabar: magicField(),
|
internalcinnabar: magicField(),
|
||||||
alchemy: magicField(),
|
alchemy: magicField(),
|
||||||
@@ -917,7 +935,7 @@ var KungfuDataModel = class extends foundry.abstract.TypeDataModel {
|
|||||||
orientation: stringField("yin"),
|
orientation: stringField("yin"),
|
||||||
// yin | yang | yinyang
|
// yin | yang | yinyang
|
||||||
aspect: stringField("metal"),
|
aspect: stringField("metal"),
|
||||||
// metal | eau | terre | feu | bois
|
// metal | water | earth | fire | wood
|
||||||
skill: stringField("kungfu"),
|
skill: stringField("kungfu"),
|
||||||
// kungfu | rangedcombat
|
// kungfu | rangedcombat
|
||||||
speciality: stringField(""),
|
speciality: stringField(""),
|
||||||
@@ -943,7 +961,7 @@ var SpellDataModel = class extends foundry.abstract.TypeDataModel {
|
|||||||
description: htmlField(""),
|
description: htmlField(""),
|
||||||
specialityname: stringField(""),
|
specialityname: stringField(""),
|
||||||
associatedelement: stringField("metal"),
|
associatedelement: stringField("metal"),
|
||||||
// metal | eau | terre | feu | bois
|
// metal | water | earth | fire | wood
|
||||||
hei: stringField(""),
|
hei: stringField(""),
|
||||||
realizationtimeritual: stringField(""),
|
realizationtimeritual: stringField(""),
|
||||||
realizationtimeaccelerated: stringField(""),
|
realizationtimeaccelerated: stringField(""),
|
||||||
@@ -985,18 +1003,20 @@ var WeaponDataModel = class extends foundry.abstract.TypeDataModel {
|
|||||||
const stringField = (initial = "") => new fields.StringField({ required: true, nullable: false, initial });
|
const stringField = (initial = "") => new fields.StringField({ required: true, nullable: false, initial });
|
||||||
const htmlField = (initial = "") => new fields.HTMLField({ required: true, nullable: false, initial, textSearch: true });
|
const htmlField = (initial = "") => new fields.HTMLField({ required: true, nullable: false, initial, textSearch: true });
|
||||||
const intField = (initial = 0, opts = {}) => new fields.NumberField({ required: true, nullable: false, integer: true, initial, ...opts });
|
const intField = (initial = 0, opts = {}) => new fields.NumberField({ required: true, nullable: false, integer: true, initial, ...opts });
|
||||||
|
const boolField = (initial = false) => new fields.BooleanField({ required: true, initial });
|
||||||
return {
|
return {
|
||||||
reference: stringField(""),
|
reference: stringField(""),
|
||||||
description: htmlField(""),
|
description: htmlField(""),
|
||||||
|
hasSpeciality: boolField(false),
|
||||||
weaponType: stringField("melee"),
|
weaponType: stringField("melee"),
|
||||||
material: stringField(""),
|
material: stringField(""),
|
||||||
damageAspect: stringField("metal"),
|
damageAspect: stringField("metal"),
|
||||||
damageBase: intField(1),
|
damageBase: intField(0),
|
||||||
range: stringField("contact"),
|
range: stringField("contact"),
|
||||||
// contact | courte | mediane | longue | extreme
|
// contact | courte | mediane | longue | extreme
|
||||||
obtainLevel: intField(0, { min: 0, max: 5 }),
|
obtainLevel: intField(0, { min: 0, max: 5 }),
|
||||||
obtainDifficulty: intField(0, { min: 0, max: 3 }),
|
obtainDifficulty: intField(0, { min: 0, max: 3 }),
|
||||||
quantity: intField(1),
|
quantity: intField(1, { min: 0 }),
|
||||||
notes: htmlField("")
|
notes: htmlField("")
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
@@ -1016,7 +1036,7 @@ var ArmorDataModel = class extends foundry.abstract.TypeDataModel {
|
|||||||
domain: stringField(""),
|
domain: stringField(""),
|
||||||
obtainLevel: intField(0, { min: 0, max: 5 }),
|
obtainLevel: intField(0, { min: 0, max: 5 }),
|
||||||
obtainDifficulty: intField(0, { min: 0, max: 3 }),
|
obtainDifficulty: intField(0, { min: 0, max: 3 }),
|
||||||
quantity: intField(1),
|
quantity: intField(1, { min: 0 }),
|
||||||
notes: htmlField("")
|
notes: htmlField("")
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
@@ -1062,7 +1082,7 @@ var IngredientDataModel = class extends foundry.abstract.TypeDataModel {
|
|||||||
school: stringField("all"),
|
school: stringField("all"),
|
||||||
obtainLevel: intField(0, { min: 0, max: 5 }),
|
obtainLevel: intField(0, { min: 0, max: 5 }),
|
||||||
obtainDifficulty: intField(0, { min: 0, max: 3 }),
|
obtainDifficulty: intField(0, { min: 0, max: 3 }),
|
||||||
quantity: intField(1),
|
quantity: intField(1, { min: 0 }),
|
||||||
notes: htmlField("")
|
notes: htmlField("")
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
@@ -1552,20 +1572,16 @@ async function showMagicPrompt(params) {
|
|||||||
aspectskill: Number(params.aspectskill ?? 0),
|
aspectskill: Number(params.aspectskill ?? 0),
|
||||||
bonusmalusskill: params.bonusmalusskill ?? 0,
|
bonusmalusskill: params.bonusmalusskill ?? 0,
|
||||||
bonusauspiciousdice: params.bonusauspiciousdice ?? 0,
|
bonusauspiciousdice: params.bonusauspiciousdice ?? 0,
|
||||||
aspectspeciality: Number(params.aspectspeciality ?? 0),
|
|
||||||
rolldifficulty: params.rolldifficulty ?? 1,
|
rolldifficulty: params.rolldifficulty ?? 1,
|
||||||
bonusmalusspeciality: params.bonusmalusspeciality ?? 0,
|
freepowerlevels: params.freepowerlevels ?? 0,
|
||||||
heispend: params.heispend ?? 0,
|
|
||||||
typeofthrow: Number(params.typeofthrow ?? 0)
|
typeofthrow: Number(params.typeofthrow ?? 0)
|
||||||
},
|
},
|
||||||
fields: [
|
fields: [
|
||||||
"aspectskill",
|
"aspectskill",
|
||||||
"bonusmalusskill",
|
"bonusmalusskill",
|
||||||
"bonusauspiciousdice",
|
"bonusauspiciousdice",
|
||||||
"aspectspeciality",
|
|
||||||
"rolldifficulty",
|
"rolldifficulty",
|
||||||
"bonusmalusspeciality",
|
"freepowerlevels",
|
||||||
"heispend",
|
|
||||||
"typeofthrow"
|
"typeofthrow"
|
||||||
]
|
]
|
||||||
});
|
});
|
||||||
@@ -1580,7 +1596,7 @@ async function showWeaponPrompt(params) {
|
|||||||
weaponTypeLabel: params.weaponTypeLabel ?? "CDE.Weapon",
|
weaponTypeLabel: params.weaponTypeLabel ?? "CDE.Weapon",
|
||||||
weaponAspectIcon: params.weaponAspectIcon ?? "",
|
weaponAspectIcon: params.weaponAspectIcon ?? "",
|
||||||
weaponAspectLabel: params.weaponAspectLabel ?? "",
|
weaponAspectLabel: params.weaponAspectLabel ?? "",
|
||||||
damageBase: params.damageBase ?? 1,
|
damageBase: params.damageBase ?? 0,
|
||||||
weaponskill: params.weaponskill ?? "kungfu",
|
weaponskill: params.weaponskill ?? "kungfu",
|
||||||
aspect: Number(params.aspect ?? 0),
|
aspect: Number(params.aspect ?? 0),
|
||||||
effectiverange: params.effectiverange ?? "contact",
|
effectiverange: params.effectiverange ?? "contact",
|
||||||
@@ -1695,7 +1711,9 @@ async function rollForActor(actor, rollKey) {
|
|||||||
const kfSkill = kfItem.system.skill ?? "kungfu";
|
const kfSkill = kfItem.system.skill ?? "kungfu";
|
||||||
numberofdice = sys.skills?.[kfSkill]?.value ?? 0;
|
numberofdice = sys.skills?.[kfSkill]?.value ?? 0;
|
||||||
title = `${kfItem.name} [${game.i18n.localize(sys.skills?.[kfSkill]?.label ?? "CDE.KungFu")}]`;
|
title = `${kfItem.name} [${game.i18n.localize(sys.skills?.[kfSkill]?.label ?? "CDE.KungFu")}]`;
|
||||||
kfDefaultAspect = ASPECT_NAMES.indexOf(kfItem.system.aspect ?? "metal");
|
const kfAspect = kfItem.system.aspect?.toLowerCase() ?? "metal";
|
||||||
|
const ASPECT_NORMALIZE = { eau: "water", terre: "earth", feu: "fire", bois: "wood" };
|
||||||
|
kfDefaultAspect = ASPECT_NAMES.indexOf(ASPECT_NORMALIZE[kfAspect] ?? kfAspect);
|
||||||
if (kfDefaultAspect < 0) kfDefaultAspect = 0;
|
if (kfDefaultAspect < 0) kfDefaultAspect = 0;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -1724,7 +1742,7 @@ async function rollForActor(actor, rollKey) {
|
|||||||
weaponTypeLabel: WEAPON_TYPE_LABELS[wpType] ?? "CDE.Weapon",
|
weaponTypeLabel: WEAPON_TYPE_LABELS[wpType] ?? "CDE.Weapon",
|
||||||
weaponAspectIcon: ASPECT_ICONS[ASPECT_NAMES[wpAspectIdx]] ?? "",
|
weaponAspectIcon: ASPECT_ICONS[ASPECT_NAMES[wpAspectIdx]] ?? "",
|
||||||
weaponAspectLabel: game.i18n.localize(ASPECT_LABELS[ASPECT_NAMES[wpAspectIdx]] ?? ""),
|
weaponAspectLabel: game.i18n.localize(ASPECT_LABELS[ASPECT_NAMES[wpAspectIdx]] ?? ""),
|
||||||
damageBase: wpItem.system.damageBase ?? 1,
|
damageBase: wpItem.system.damageBase ?? 0,
|
||||||
weaponskill: wpSkill,
|
weaponskill: wpSkill,
|
||||||
aspect: wpAspectIdx,
|
aspect: wpAspectIdx,
|
||||||
effectiverange: wpRange,
|
effectiverange: wpRange,
|
||||||
@@ -1743,8 +1761,9 @@ async function rollForActor(actor, rollKey) {
|
|||||||
const wpWoundMalus = Number(wParams.woundmalus ?? 0);
|
const wpWoundMalus = Number(wParams.woundmalus ?? 0);
|
||||||
const wpBonusAusp = Number(wParams.bonusauspiciousdice ?? 0);
|
const wpBonusAusp = Number(wParams.bonusauspiciousdice ?? 0);
|
||||||
const wpThrowMode = Number(wParams.typeofthrow ?? 0);
|
const wpThrowMode = Number(wParams.typeofthrow ?? 0);
|
||||||
const wpDamageBase = wpItem.system.damageBase ?? 1;
|
const wpDamageBase = wpItem.system.damageBase ?? 0;
|
||||||
const wpTotalDice = wpSkillDice + wpAspectDice + wpRangeMalus + wpBonusMalus - wpWoundMalus;
|
const wpSpecialtyBonus = wpItem.system.hasSpeciality ? 1 : 0;
|
||||||
|
const wpTotalDice = wpSkillDice + wpAspectDice + wpRangeMalus + wpBonusMalus - wpWoundMalus + wpSpecialtyBonus;
|
||||||
if (wpTotalDice <= 0) {
|
if (wpTotalDice <= 0) {
|
||||||
ui.notifications.warn(game.i18n.localize("CDE.Error0"));
|
ui.notifications.warn(game.i18n.localize("CDE.Error0"));
|
||||||
return;
|
return;
|
||||||
@@ -1760,6 +1779,11 @@ async function rollForActor(actor, rollKey) {
|
|||||||
if (wpBonusMalus !== 0) wpModParts.push(`${wpBonusMalus > 0 ? "+" : ""}${wpBonusMalus} ${game.i18n.localize("CDE.BonusMalus")}`);
|
if (wpBonusMalus !== 0) wpModParts.push(`${wpBonusMalus > 0 ? "+" : ""}${wpBonusMalus} ${game.i18n.localize("CDE.BonusMalus")}`);
|
||||||
if (wpWoundMalus !== 0) wpModParts.push(`-${wpWoundMalus} ${game.i18n.localize("CDE.WoundMalus")}`);
|
if (wpWoundMalus !== 0) wpModParts.push(`-${wpWoundMalus} ${game.i18n.localize("CDE.WoundMalus")}`);
|
||||||
if (wpBonusAusp !== 0) wpModParts.push(`+${wpBonusAusp} ${game.i18n.localize("CDE.BonusAuspiciousDice")}`);
|
if (wpBonusAusp !== 0) wpModParts.push(`+${wpBonusAusp} ${game.i18n.localize("CDE.BonusAuspiciousDice")}`);
|
||||||
|
const wpDamageAspectRaw = wpItem.system.damageAspect ?? "metal";
|
||||||
|
const wpDamageAspectIdx = WEAPON_ASPECT_INDEX[wpDamageAspectRaw] ?? 0;
|
||||||
|
const wpDamageAspectName = ASPECT_NAMES[wpDamageAspectIdx];
|
||||||
|
const wpDamageAspectValue = sys.aspect?.[wpDamageAspectName]?.value ?? 0;
|
||||||
|
const wpDamageAspectLabel = game.i18n.localize(ASPECT_LABELS[wpDamageAspectName] ?? "");
|
||||||
const wpMsg = await sendResultMessage(actor, {
|
const wpMsg = await sendResultMessage(actor, {
|
||||||
rollLabel: `${wpItem.name}`,
|
rollLabel: `${wpItem.name}`,
|
||||||
aspectName: wpAspectName,
|
aspectName: wpAspectName,
|
||||||
@@ -1774,7 +1798,9 @@ async function rollForActor(actor, rollKey) {
|
|||||||
// weapon-specific
|
// weapon-specific
|
||||||
weaponName: wpItem.name,
|
weaponName: wpItem.name,
|
||||||
damageBase: wpDamageBase,
|
damageBase: wpDamageBase,
|
||||||
totalDamage: wpResults.successesdice * wpDamageBase,
|
damageAspectValue: wpDamageAspectValue,
|
||||||
|
damageAspectLabel: wpDamageAspectLabel,
|
||||||
|
totalDamage: wpDamageBase + wpDamageAspectValue,
|
||||||
...wpResults,
|
...wpResults,
|
||||||
aspect: wpAspectName,
|
aspect: wpAspectName,
|
||||||
d1: wpFaces[1],
|
d1: wpFaces[1],
|
||||||
@@ -1789,7 +1815,10 @@ async function rollForActor(actor, rollKey) {
|
|||||||
d0: wpFaces[0]
|
d0: wpFaces[0]
|
||||||
}, wpRoll, ROLL_MODES[wpThrowMode] ?? "roll");
|
}, wpRoll, ROLL_MODES[wpThrowMode] ?? "roll");
|
||||||
if (game.modules.get("dice-so-nice")?.active && wpMsg?.id) {
|
if (game.modules.get("dice-so-nice")?.active && wpMsg?.id) {
|
||||||
|
try {
|
||||||
await game.dice3d.waitFor3DAnimationByMessageID(wpMsg.id);
|
await game.dice3d.waitFor3DAnimationByMessageID(wpMsg.id);
|
||||||
|
} catch (_e) {
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if ((wpResults.loksyudice ?? 0) > 0) await updateLoksyuFromRoll(wpAspectName, wpFaces);
|
if ((wpResults.loksyudice ?? 0) > 0) await updateLoksyuFromRoll(wpAspectName, wpFaces);
|
||||||
if ((wpResults.tinjidice ?? 0) > 0) await updateTinjiFromRoll(wpResults.tinjidice);
|
if ((wpResults.tinjidice ?? 0) > 0) await updateTinjiFromRoll(wpResults.tinjidice);
|
||||||
@@ -1822,14 +1851,6 @@ async function rollForActor(actor, rollKey) {
|
|||||||
if (kfDefaultAspect >= 0) {
|
if (kfDefaultAspect >= 0) {
|
||||||
defaultAspect = kfDefaultAspect;
|
defaultAspect = kfDefaultAspect;
|
||||||
}
|
}
|
||||||
let defaultSpecialAspect = 0;
|
|
||||||
if (isMagicSpecial && specialLibel) {
|
|
||||||
const specialCfg = MAGICS?.[skillLibel]?.speciality?.[specialLibel];
|
|
||||||
const aspectName = LABELELEMENT_TO_ASPECT[specialCfg?.labelelement];
|
|
||||||
if (aspectName) {
|
|
||||||
defaultSpecialAspect = ASPECT_NAMES.indexOf(aspectName);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
let params;
|
let params;
|
||||||
if (isMagic) {
|
if (isMagic) {
|
||||||
params = await showMagicPrompt({
|
params = await showMagicPrompt({
|
||||||
@@ -1838,10 +1859,8 @@ async function rollForActor(actor, rollKey) {
|
|||||||
aspectskill: defaultAspect,
|
aspectskill: defaultAspect,
|
||||||
bonusmalusskill: 0,
|
bonusmalusskill: 0,
|
||||||
bonusauspiciousdice: 0,
|
bonusauspiciousdice: 0,
|
||||||
aspectspeciality: defaultSpecialAspect,
|
|
||||||
rolldifficulty: 1,
|
rolldifficulty: 1,
|
||||||
bonusmalusspeciality: 0,
|
freepowerlevels: 0,
|
||||||
heispend: 0,
|
|
||||||
typeofthrow: typeOfThrow
|
typeofthrow: typeOfThrow
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
@@ -1858,20 +1877,16 @@ async function rollForActor(actor, rollKey) {
|
|||||||
}
|
}
|
||||||
if (!params) return;
|
if (!params) return;
|
||||||
let aspectIndex, bonusMalus, bonusAuspicious, throwMode;
|
let aspectIndex, bonusMalus, bonusAuspicious, throwMode;
|
||||||
let spellAspectIndex = null;
|
|
||||||
let rollDifficulty = 1;
|
let rollDifficulty = 1;
|
||||||
if (isMagic) {
|
if (isMagic) {
|
||||||
const skillAspectIndex = Number(params.aspectskill ?? 0);
|
const skillAspectIndex = Number(params.aspectskill ?? 0);
|
||||||
spellAspectIndex = Number(params.aspectspeciality ?? skillAspectIndex);
|
|
||||||
aspectIndex = skillAspectIndex;
|
aspectIndex = skillAspectIndex;
|
||||||
bonusMalus = Number(params.bonusmalusskill ?? 0);
|
bonusMalus = Number(params.bonusmalusskill ?? 0);
|
||||||
bonusAuspicious = Number(params.bonusauspiciousdice ?? 0);
|
bonusAuspicious = Number(params.bonusauspiciousdice ?? 0);
|
||||||
rollDifficulty = Math.max(1, Number(params.rolldifficulty ?? 1));
|
rollDifficulty = Math.max(1, Number(params.rolldifficulty ?? 1));
|
||||||
throwMode = Number(params.typeofthrow ?? 0);
|
throwMode = Number(params.typeofthrow ?? 0);
|
||||||
const aspectDice = sys.aspect?.[ASPECT_NAMES[aspectIndex]]?.value ?? 0;
|
const aspectDice = sys.aspect?.[ASPECT_NAMES[aspectIndex]]?.value ?? 0;
|
||||||
const bonusSpec = Number(params.bonusmalusspeciality ?? 0);
|
numberofdice = numberofdice + aspectDice + bonusMalus + 1;
|
||||||
const heiDice = Number(params.heispend ?? 0);
|
|
||||||
numberofdice = numberofdice + aspectDice + bonusMalus + 1 + bonusSpec + heiDice;
|
|
||||||
} else {
|
} else {
|
||||||
aspectIndex = Number(params.aspect ?? 0);
|
aspectIndex = Number(params.aspect ?? 0);
|
||||||
bonusMalus = Number(params.bonusmalus ?? 0);
|
bonusMalus = Number(params.bonusmalus ?? 0);
|
||||||
@@ -1889,22 +1904,33 @@ async function rollForActor(actor, rollKey) {
|
|||||||
const roll = new Roll(`${numberofdice}d10`);
|
const roll = new Roll(`${numberofdice}d10`);
|
||||||
await roll.evaluate();
|
await roll.evaluate();
|
||||||
const rollModeKey = ROLL_MODES[throwMode] ?? "roll";
|
const rollModeKey = ROLL_MODES[throwMode] ?? "roll";
|
||||||
const wuXingAspectName = spellAspectIndex !== null ? ASPECT_NAMES[spellAspectIndex] : ASPECT_NAMES[aspectIndex];
|
let spellPower = null;
|
||||||
|
let spellPowerAspectName = null;
|
||||||
|
let spellPowerAspectValue = null;
|
||||||
|
if (isMagic) {
|
||||||
|
if (isMagicSpecial && specialLibel) {
|
||||||
|
const specialCfg = MAGICS?.[skillLibel]?.speciality?.[specialLibel];
|
||||||
|
const elemName = LABELELEMENT_TO_ASPECT[specialCfg?.labelelementkey];
|
||||||
|
if (elemName) spellPowerAspectName = elemName;
|
||||||
|
}
|
||||||
|
if (!spellPowerAspectName) spellPowerAspectName = ASPECT_NAMES[aspectIndex];
|
||||||
|
spellPowerAspectValue = sys.aspect?.[spellPowerAspectName]?.value ?? 0;
|
||||||
|
const freePowerLevels = Number(params.freepowerlevels ?? 0);
|
||||||
|
spellPower = rollDifficulty * (spellPowerAspectValue + freePowerLevels);
|
||||||
|
}
|
||||||
|
const wuXingAspectName = ASPECT_NAMES[aspectIndex];
|
||||||
const allResults = roll.dice[0]?.results ?? [];
|
const allResults = roll.dice[0]?.results ?? [];
|
||||||
const faces = countFaces(allResults);
|
const faces = countFaces(allResults);
|
||||||
const results = computeWuXingResults(faces, wuXingAspectName, bonusAuspicious);
|
const results = computeWuXingResults(faces, wuXingAspectName, bonusAuspicious);
|
||||||
if (!results) return;
|
if (!results) return;
|
||||||
const spellPower = isMagic ? results.successesdice * rollDifficulty : null;
|
|
||||||
const modParts = [];
|
const modParts = [];
|
||||||
if (isMagic) {
|
if (isMagic) {
|
||||||
const bm = Number(params.bonusmalusskill ?? 0);
|
const bm = Number(params.bonusmalusskill ?? 0);
|
||||||
const bs = Number(params.bonusmalusspeciality ?? 0);
|
|
||||||
const hs = Number(params.heispend ?? 0);
|
|
||||||
const ba = Number(params.bonusauspiciousdice ?? 0);
|
const ba = Number(params.bonusauspiciousdice ?? 0);
|
||||||
|
const fp = Number(params.freepowerlevels ?? 0);
|
||||||
if (bm !== 0) modParts.push(`${bm > 0 ? "+" : ""}${bm} ${game.i18n.localize("CDE.BonusMalus")}`);
|
if (bm !== 0) modParts.push(`${bm > 0 ? "+" : ""}${bm} ${game.i18n.localize("CDE.BonusMalus")}`);
|
||||||
if (bs !== 0) modParts.push(`${bs > 0 ? "+" : ""}${bs} ${game.i18n.localize("CDE.SpellBonus")}`);
|
|
||||||
if (ba !== 0) modParts.push(`+${ba} ${game.i18n.localize("CDE.BonusAuspiciousDice")}`);
|
if (ba !== 0) modParts.push(`+${ba} ${game.i18n.localize("CDE.BonusAuspiciousDice")}`);
|
||||||
if (hs !== 0) modParts.push(`${hs} ${game.i18n.localize("CDE.HeiSpend")}`);
|
if (fp !== 0) modParts.push(`+${fp} ${game.i18n.localize("CDE.FreePowerLevels")}`);
|
||||||
if (rollDifficulty !== 1) modParts.push(`\xD7${rollDifficulty} ${game.i18n.localize("CDE.RollDifficulty")}`);
|
if (rollDifficulty !== 1) modParts.push(`\xD7${rollDifficulty} ${game.i18n.localize("CDE.RollDifficulty")}`);
|
||||||
} else {
|
} else {
|
||||||
const bm = Number(params.bonusmalus ?? 0);
|
const bm = Number(params.bonusmalus ?? 0);
|
||||||
@@ -1924,6 +1950,9 @@ async function rollForActor(actor, rollKey) {
|
|||||||
modifiersText: modParts.length ? modParts.join(" \xB7 ") : "",
|
modifiersText: modParts.length ? modParts.join(" \xB7 ") : "",
|
||||||
// Spell power (magic only)
|
// Spell power (magic only)
|
||||||
spellPower,
|
spellPower,
|
||||||
|
spellPowerAspectLabel: spellPowerAspectName ? game.i18n.localize(ASPECT_LABELS[spellPowerAspectName] ?? "") : "",
|
||||||
|
spellPowerAspectValue,
|
||||||
|
spellPowerFreeLevels: isMagic ? Number(params.freepowerlevels ?? 0) : 0,
|
||||||
rollDifficulty: isMagic ? rollDifficulty : null,
|
rollDifficulty: isMagic ? rollDifficulty : null,
|
||||||
// Actor info
|
// Actor info
|
||||||
actorName: actor.name ?? "",
|
actorName: actor.name ?? "",
|
||||||
@@ -1944,7 +1973,10 @@ async function rollForActor(actor, rollKey) {
|
|||||||
d0: faces[0]
|
d0: faces[0]
|
||||||
}, roll, rollModeKey);
|
}, roll, rollModeKey);
|
||||||
if (game.modules.get("dice-so-nice")?.active && msg?.id) {
|
if (game.modules.get("dice-so-nice")?.active && msg?.id) {
|
||||||
|
try {
|
||||||
await game.dice3d.waitFor3DAnimationByMessageID(msg.id);
|
await game.dice3d.waitFor3DAnimationByMessageID(msg.id);
|
||||||
|
} catch (_e) {
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if ((results.loksyudice ?? 0) > 0) await updateLoksyuFromRoll(wuXingAspectName, faces);
|
if ((results.loksyudice ?? 0) > 0) await updateLoksyuFromRoll(wuXingAspectName, faces);
|
||||||
if ((results.tinjidice ?? 0) > 0) await updateTinjiFromRoll(results.tinjidice);
|
if ((results.tinjidice ?? 0) > 0) await updateTinjiFromRoll(results.tinjidice);
|
||||||
@@ -2040,9 +2072,13 @@ var CDEBaseActorSheet = class _CDEBaseActorSheet extends HandlebarsApplicationMi
|
|||||||
};
|
};
|
||||||
|
|
||||||
// src/ui/sheets/actors/character.js
|
// src/ui/sheets/actors/character.js
|
||||||
var CDECharacterSheet = class extends CDEBaseActorSheet {
|
var CDECharacterSheet = class _CDECharacterSheet extends CDEBaseActorSheet {
|
||||||
static DEFAULT_OPTIONS = {
|
static DEFAULT_OPTIONS = {
|
||||||
classes: ["character"]
|
classes: ["character"],
|
||||||
|
actions: {
|
||||||
|
moveMagicUp: _CDECharacterSheet.#onMoveMagicUp,
|
||||||
|
moveMagicDown: _CDECharacterSheet.#onMoveMagicDown
|
||||||
|
}
|
||||||
};
|
};
|
||||||
static PARTS = {
|
static PARTS = {
|
||||||
main: { template: "systems/fvtt-chroniques-de-l-etrange/templates/actor/cde-character-sheet.html" }
|
main: { template: "systems/fvtt-chroniques-de-l-etrange/templates/actor/cde-character-sheet.html" }
|
||||||
@@ -2065,8 +2101,7 @@ var CDECharacterSheet = class extends CDEBaseActorSheet {
|
|||||||
spellsByDiscipline[disc].push(spell);
|
spellsByDiscipline[disc].push(spell);
|
||||||
}
|
}
|
||||||
const systemMagics = context.systemData.magics ?? {};
|
const systemMagics = context.systemData.magics ?? {};
|
||||||
context.magicsDisplay = Object.fromEntries(
|
const magicEntries = Object.entries(MAGICS).map(([magicKey, magicDef]) => {
|
||||||
Object.entries(MAGICS).map(([magicKey, magicDef]) => {
|
|
||||||
const magicData = systemMagics[magicKey] ?? {};
|
const magicData = systemMagics[magicKey] ?? {};
|
||||||
return [
|
return [
|
||||||
magicKey,
|
magicKey,
|
||||||
@@ -2082,8 +2117,19 @@ var CDECharacterSheet = class extends CDEBaseActorSheet {
|
|||||||
grimoire: spellsByDiscipline[magicKey] ?? []
|
grimoire: spellsByDiscipline[magicKey] ?? []
|
||||||
}
|
}
|
||||||
];
|
];
|
||||||
})
|
});
|
||||||
);
|
const order = context.systemData.magicOrder ?? [];
|
||||||
|
if (order.length > 0) {
|
||||||
|
magicEntries.sort((a, b) => {
|
||||||
|
const ia = order.indexOf(a[0]);
|
||||||
|
const ib = order.indexOf(b[0]);
|
||||||
|
if (ia === -1 && ib === -1) return 0;
|
||||||
|
if (ia === -1) return 1;
|
||||||
|
if (ib === -1) return -1;
|
||||||
|
return ia - ib;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
context.magicsDisplay = Object.fromEntries(magicEntries);
|
||||||
return context;
|
return context;
|
||||||
}
|
}
|
||||||
_onRender(context, options) {
|
_onRender(context, options) {
|
||||||
@@ -2167,7 +2213,7 @@ var CDECharacterSheet = class extends CDEBaseActorSheet {
|
|||||||
cell.addEventListener("click", (event) => {
|
cell.addEventListener("click", (event) => {
|
||||||
event.preventDefault();
|
event.preventDefault();
|
||||||
const rollKey = cell.dataset.libelId;
|
const rollKey = cell.dataset.libelId;
|
||||||
if (rollKey) rollForActor(this.document, rollKey);
|
if (rollKey) rollForActor(this.document, rollKey)?.catch((err) => console.error("Roll failed:", err));
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -2181,6 +2227,26 @@ var CDECharacterSheet = class extends CDEBaseActorSheet {
|
|||||||
}).render(true);
|
}).render(true);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
static async #onMoveMagicUp(event, target) {
|
||||||
|
const key = target.dataset.magicKey;
|
||||||
|
let order = this.document.system.magicOrder ?? [];
|
||||||
|
if (!order.length) order = [...Object.keys(MAGICS)];
|
||||||
|
else order = [...order];
|
||||||
|
const idx = order.indexOf(key);
|
||||||
|
if (idx <= 0) return;
|
||||||
|
[order[idx - 1], order[idx]] = [order[idx], order[idx - 1]];
|
||||||
|
await this.document.update({ "system.magicOrder": order });
|
||||||
|
}
|
||||||
|
static async #onMoveMagicDown(event, target) {
|
||||||
|
const key = target.dataset.magicKey;
|
||||||
|
let order = this.document.system.magicOrder ?? [];
|
||||||
|
if (!order.length) order = [...Object.keys(MAGICS)];
|
||||||
|
else order = [...order];
|
||||||
|
const idx = order.indexOf(key);
|
||||||
|
if (idx === -1 || idx >= order.length - 1) return;
|
||||||
|
[order[idx], order[idx + 1]] = [order[idx + 1], order[idx]];
|
||||||
|
await this.document.update({ "system.magicOrder": order });
|
||||||
|
}
|
||||||
#bindComponentRandomize() {
|
#bindComponentRandomize() {
|
||||||
const btn = this.element?.querySelector("[data-action='randomize-component']");
|
const btn = this.element?.querySelector("[data-action='randomize-component']");
|
||||||
if (!btn) return;
|
if (!btn) return;
|
||||||
@@ -2250,7 +2316,7 @@ var CDENpcSheet = class extends CDEBaseActorSheet {
|
|||||||
cell.addEventListener("click", (event) => {
|
cell.addEventListener("click", (event) => {
|
||||||
event.preventDefault();
|
event.preventDefault();
|
||||||
const rollKey = cell.dataset.libelId;
|
const rollKey = cell.dataset.libelId;
|
||||||
if (rollKey) rollForActor(this.document, rollKey);
|
if (rollKey) rollForActor(this.document, rollKey)?.catch((err) => console.error("Roll failed:", err));
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -2437,11 +2503,11 @@ var CDESanheiSheet = class extends CDEBaseItemSheet {
|
|||||||
async _prepareContext() {
|
async _prepareContext() {
|
||||||
const context = await super._prepareContext();
|
const context = await super._prepareContext();
|
||||||
const enrich = (content) => foundry.applications.ux.TextEditor.implementation.enrichHTML(content ?? "", { async: true });
|
const enrich = (content) => foundry.applications.ux.TextEditor.implementation.enrichHTML(content ?? "", { async: true });
|
||||||
const props = this.document.system.properties;
|
const props = this.document.system.properties ?? {};
|
||||||
context.prop1DescriptionHTML = await enrich(props.prop1.description);
|
context.prop1DescriptionHTML = await enrich(props.prop1?.description);
|
||||||
context.prop2DescriptionHTML = await enrich(props.prop2.description);
|
context.prop2DescriptionHTML = await enrich(props.prop2?.description);
|
||||||
context.prop3DescriptionHTML = await enrich(props.prop3.description);
|
context.prop3DescriptionHTML = await enrich(props.prop3?.description);
|
||||||
context.propFields = this.document.system.schema.fields.properties.fields;
|
context.propFields = this.document.system.schema.fields.properties?.fields;
|
||||||
return context;
|
return context;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@@ -2649,7 +2715,7 @@ var CDETinjiApp = class _CDETinjiApp extends foundry.applications.api.Handlebars
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
await setTinjiValue(current - 1);
|
await setTinjiValue(current - 1);
|
||||||
ChatMessage.create({
|
await ChatMessage.create({
|
||||||
user: game.user.id,
|
user: game.user.id,
|
||||||
content: `<div class="cde-tinji-spend-msg">
|
content: `<div class="cde-tinji-spend-msg">
|
||||||
<i class="fas fa-star"></i>
|
<i class="fas fa-star"></i>
|
||||||
@@ -2668,7 +2734,7 @@ var CDECombat = class extends Combat {
|
|||||||
* for each selected combatant, then sync the result to the Combatant document.
|
* for each selected combatant, then sync the result to the Combatant document.
|
||||||
*/
|
*/
|
||||||
async rollInitiative(ids, options = {}) {
|
async rollInitiative(ids, options = {}) {
|
||||||
const combatantIds = typeof ids === "string" ? [ids] : ids;
|
const combatantIds = ids ? typeof ids === "string" ? [ids] : ids : this.combatants.map((c) => c.id);
|
||||||
for (const id of combatantIds) {
|
for (const id of combatantIds) {
|
||||||
const combatant = this.combatants.get(id);
|
const combatant = this.combatants.get(id);
|
||||||
if (!combatant) continue;
|
if (!combatant) continue;
|
||||||
@@ -2936,8 +3002,19 @@ async function _drawFromLoksyu(message, aspect, type, aspectLabel) {
|
|||||||
ui.notifications.warn(game.i18n.localize("CDE.LoksyuEmpty"));
|
ui.notifications.warn(game.i18n.localize("CDE.LoksyuEmpty"));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
const order = game.settings.get(SYSTEM_ID, "loksyuConsumptionOrder");
|
||||||
|
if (order === "yin-first") {
|
||||||
|
if (entry.yin > 0) entry.yin--;
|
||||||
|
else entry.yang--;
|
||||||
|
} else if (order === "balanced") {
|
||||||
|
if (entry.yin > entry.yang) entry.yin--;
|
||||||
|
else if (entry.yang > entry.yin) entry.yang--;
|
||||||
|
else if (entry.yang > 0) entry.yang--;
|
||||||
|
else entry.yin--;
|
||||||
|
} else {
|
||||||
if (entry.yang > 0) entry.yang--;
|
if (entry.yang > 0) entry.yang--;
|
||||||
else entry.yin--;
|
else entry.yin--;
|
||||||
|
}
|
||||||
data[aspect] = entry;
|
data[aspect] = entry;
|
||||||
await setLoksyuData(data);
|
await setLoksyuData(data);
|
||||||
const flags = message?.flags?.[SYSTEM_ID];
|
const flags = message?.flags?.[SYSTEM_ID];
|
||||||
@@ -2946,7 +3023,7 @@ async function _drawFromLoksyu(message, aspect, type, aspectLabel) {
|
|||||||
if (type === "success") {
|
if (type === "success") {
|
||||||
updated.successesdice = (updated.successesdice ?? 0) + 1;
|
updated.successesdice = (updated.successesdice ?? 0) + 1;
|
||||||
updated.loksyuBonusSuc = (updated.loksyuBonusSuc ?? 0) + 1;
|
updated.loksyuBonusSuc = (updated.loksyuBonusSuc ?? 0) + 1;
|
||||||
if (updated.damageBase) updated.totalDamage = updated.successesdice * updated.damageBase;
|
if (updated.damageBase != null) updated.totalDamage = updated.damageBase + (updated.damageAspectValue ?? 0);
|
||||||
} else {
|
} else {
|
||||||
updated.auspiciousdice = (updated.auspiciousdice ?? 0) + 1;
|
updated.auspiciousdice = (updated.auspiciousdice ?? 0) + 1;
|
||||||
updated.loksyuBonusFaste = (updated.loksyuBonusFaste ?? 0) + 1;
|
updated.loksyuBonusFaste = (updated.loksyuBonusFaste ?? 0) + 1;
|
||||||
@@ -2959,7 +3036,7 @@ async function _drawFromLoksyu(message, aspect, type, aspectLabel) {
|
|||||||
}
|
}
|
||||||
const remain = entry.yin + entry.yang;
|
const remain = entry.yin + entry.yang;
|
||||||
const typeLabel = type === "success" ? game.i18n.localize("CDE.Successes") : game.i18n.localize("CDE.AuspiciousDie");
|
const typeLabel = type === "success" ? game.i18n.localize("CDE.Successes") : game.i18n.localize("CDE.AuspiciousDie");
|
||||||
ChatMessage.create({
|
await ChatMessage.create({
|
||||||
user: game.user.id,
|
user: game.user.id,
|
||||||
content: `<div class="cde-loksyu-draw-msg">
|
content: `<div class="cde-loksyu-draw-msg">
|
||||||
<div class="cde-loksyu-draw-header">
|
<div class="cde-loksyu-draw-header">
|
||||||
@@ -2985,7 +3062,7 @@ async function _spendTinjiPostRoll() {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
await setTinjiValue(current - 1);
|
await setTinjiValue(current - 1);
|
||||||
ChatMessage.create({
|
await ChatMessage.create({
|
||||||
user: game.user.id,
|
user: game.user.id,
|
||||||
content: `<div class="cde-tinji-spend-msg">
|
content: `<div class="cde-tinji-spend-msg">
|
||||||
<span class="cde-tinji-icon">\u5929</span>
|
<span class="cde-tinji-icon">\u5929</span>
|
||||||
@@ -3051,7 +3128,14 @@ function injectWelcomeActions(_message, html) {
|
|||||||
// src/system.js
|
// src/system.js
|
||||||
Hooks.once("i18nInit", preLocalizeConfig);
|
Hooks.once("i18nInit", preLocalizeConfig);
|
||||||
Hooks.once("init", async () => {
|
Hooks.once("init", async () => {
|
||||||
console.info(`CHRONIQUESDELETRANGE | Initializing ${SYSTEM_ID}`);
|
console.log(
|
||||||
|
"%c\u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557\n%c\u2551 Chroniques de l'\xC9trange \u2014 FoundryVTT \u2551\n%c\u2551 Syst\xE8me de jeu par Antre-Monde \xC9ditions \u2551\n%c\u2551 Made by Uberwald - https://www.ubwerwald.me \u2551\n%c\u255A\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255D",
|
||||||
|
"color: #d4af37; font-weight: bold;",
|
||||||
|
"color: #e2e8f4;",
|
||||||
|
"color: #7d94b8;",
|
||||||
|
"color: #5a7a9a;",
|
||||||
|
"color: #d4af37; font-weight: bold;"
|
||||||
|
);
|
||||||
registerSettings();
|
registerSettings();
|
||||||
game.system.CONST = { MAGICS, SUBTYPES };
|
game.system.CONST = { MAGICS, SUBTYPES };
|
||||||
game.cde = { CDELoksyuApp, CDETinjiApp, CDEWheelApp };
|
game.cde = { CDELoksyuApp, CDETinjiApp, CDEWheelApp };
|
||||||
|
|||||||
Vendored
+2
-2
File diff suppressed because one or more lines are too long
@@ -34,6 +34,7 @@
|
|||||||
"CDE.HeiSpend": "Dépense HEI",
|
"CDE.HeiSpend": "Dépense HEI",
|
||||||
"CDE.SpellBonus": "Bonus Sort",
|
"CDE.SpellBonus": "Bonus Sort",
|
||||||
"CDE.SpellPower": "Puissance du Sort",
|
"CDE.SpellPower": "Puissance du Sort",
|
||||||
|
"CDE.BonusMalus": "Bonus/Malus",
|
||||||
"CDE.Boss": "Boss",
|
"CDE.Boss": "Boss",
|
||||||
"CDE.Cancel": "Annuler",
|
"CDE.Cancel": "Annuler",
|
||||||
"CDE.CancelChanges": "Annuler les modifications",
|
"CDE.CancelChanges": "Annuler les modifications",
|
||||||
@@ -81,6 +82,7 @@
|
|||||||
"CDE.EarthlyPrayer": "Prière Terrestre",
|
"CDE.EarthlyPrayer": "Prière Terrestre",
|
||||||
"CDE.Effects": "Effets",
|
"CDE.Effects": "Effets",
|
||||||
"CDE.Elixirs": "Élixirs",
|
"CDE.Elixirs": "Élixirs",
|
||||||
|
"CDE.EnablePrompt": "Toujours demander avant de lancer",
|
||||||
"CDE.Error0": "Impossible de poursuivre : le nombre total de vos dés à lancer est inférieur à 1.",
|
"CDE.Error0": "Impossible de poursuivre : le nombre total de vos dés à lancer est inférieur à 1.",
|
||||||
"CDE.Error1": "Impossible de poursuivre : vous ne possédez pas cette Compétence.",
|
"CDE.Error1": "Impossible de poursuivre : vous ne possédez pas cette Compétence.",
|
||||||
"CDE.Error10": "Impossible de poursuivre : vous avez 0 ou moins dans cet Aspect.",
|
"CDE.Error10": "Impossible de poursuivre : vous avez 0 ou moins dans cet Aspect.",
|
||||||
@@ -199,6 +201,7 @@
|
|||||||
"CDE.MartialArts": "Arts Martiaux",
|
"CDE.MartialArts": "Arts Martiaux",
|
||||||
"CDE.Masterized": "Vous maîtrisez cette Technique",
|
"CDE.Masterized": "Vous maîtrisez cette Technique",
|
||||||
"CDE.MasteryOfTheWay": "Maîtrise de la Voie",
|
"CDE.MasteryOfTheWay": "Maîtrise de la Voie",
|
||||||
|
"CDE.Material": "Matériau",
|
||||||
"CDE.Max": "Max",
|
"CDE.Max": "Max",
|
||||||
"CDE.Max-Present-Malus-Present-Max": "Max ● Actuel ● Malus ● Actuel ● Max",
|
"CDE.Max-Present-Malus-Present-Max": "Max ● Actuel ● Malus ● Actuel ● Max",
|
||||||
"CDE.Max-Present-Present-Max": "Max ● Actuel ● Actuel ● Max",
|
"CDE.Max-Present-Present-Max": "Max ● Actuel ● Actuel ● Max",
|
||||||
@@ -217,8 +220,11 @@
|
|||||||
"CDE.MsgMagic2": "s'élève à ",
|
"CDE.MsgMagic2": "s'élève à ",
|
||||||
"CDE.MsgMagic3": ". La puissance à invoquer est de ",
|
"CDE.MsgMagic3": ". La puissance à invoquer est de ",
|
||||||
"CDE.MsgMagic4": ", si toutefois le sort est lancé avec succès.",
|
"CDE.MsgMagic4": ", si toutefois le sort est lancé avec succès.",
|
||||||
|
"CDE.MoveUp": "Monter",
|
||||||
|
"CDE.MoveDown": "Descendre",
|
||||||
"CDE.NPCName": "Nom du PNJ",
|
"CDE.NPCName": "Nom du PNJ",
|
||||||
"CDE.FatSi": "Fat Si",
|
"CDE.FatSi": "Fat Si",
|
||||||
|
"CDE.FreePowerLevels": "Niveaux de puissance gratuits",
|
||||||
"CDE.PNJ": "PNJ",
|
"CDE.PNJ": "PNJ",
|
||||||
"CDE.Name": "Nom",
|
"CDE.Name": "Nom",
|
||||||
"CDE.Necromancy": "Nécromancie",
|
"CDE.Necromancy": "Nécromancie",
|
||||||
@@ -280,6 +286,7 @@
|
|||||||
"CDE.ResourceValue": "Valeur",
|
"CDE.ResourceValue": "Valeur",
|
||||||
"CDE.Resources": "Ressources",
|
"CDE.Resources": "Ressources",
|
||||||
"CDE.Results": "Résultats :",
|
"CDE.Results": "Résultats :",
|
||||||
|
"CDE.Roll": "Jet",
|
||||||
"CDE.RollDifficulty": "Difficulté du Jet",
|
"CDE.RollDifficulty": "Difficulté du Jet",
|
||||||
"CDE.SAN-ZING": "SAN ● ZING",
|
"CDE.SAN-ZING": "SAN ● ZING",
|
||||||
"CDE.Sanhei": "Sanhei",
|
"CDE.Sanhei": "Sanhei",
|
||||||
@@ -321,12 +328,18 @@
|
|||||||
"CDE.Technique": "Technique",
|
"CDE.Technique": "Technique",
|
||||||
"CDE.Technologies": "Technologies",
|
"CDE.Technologies": "Technologies",
|
||||||
"CDE.Threat": "Niveau de Menace",
|
"CDE.Threat": "Niveau de Menace",
|
||||||
|
"CDE.ThrowType": "Type de jet",
|
||||||
"CDE.TinJi": "Tin Ji :",
|
"CDE.TinJi": "Tin Ji :",
|
||||||
"CDE.TinJi2": "Tin Ji",
|
"CDE.TinJi2": "Tin Ji",
|
||||||
"CDE.TinJiName": "Nom de la Tin Ji",
|
"CDE.TinJiName": "Nom de la Tin Ji",
|
||||||
"CDE.TinjiNotFound": "Aucun acteur Tin Ji trouvé. Le Maître du Jeu doit en créer un.",
|
"CDE.TinjiNotFound": "Aucun acteur Tin Ji trouvé. Le Maître du Jeu doit en créer un.",
|
||||||
"CDE.TinjiEmpty": "Il n'y a plus de dés de Tin Ji disponibles.",
|
"CDE.TinjiEmpty": "Il n'y a plus de dés de Tin Ji disponibles.",
|
||||||
"CDE.TinjiSpent": "{name} dépense 1 dé de Tin Ji.",
|
"CDE.TinjiSpent": "{name} dépense 1 dé de Tin Ji.",
|
||||||
|
"CDE.Settings.LoksyuConsumptionOrder": "Ordre de consommation du Loksyu",
|
||||||
|
"CDE.Settings.LoksyuConsumptionOrderHint": "Définit quelle polarité (Yin ou Yang) est consommée en priorité lorsqu'un dé est puisé dans la réserve de Loksyu.",
|
||||||
|
"CDE.Settings.LoksyuOrderYangFirst": "Yang d'abord",
|
||||||
|
"CDE.Settings.LoksyuOrderYinFirst": "Yin d'abord",
|
||||||
|
"CDE.Settings.LoksyuOrderBalanced": "Équilibré (consomme la polarité la plus fournie)",
|
||||||
"CDE.PostRollActions": "Puiser dans le Loksyu / Dépenser Tin Ji",
|
"CDE.PostRollActions": "Puiser dans le Loksyu / Dépenser Tin Ji",
|
||||||
"CDE.LoksyuDrawsA": "pioche",
|
"CDE.LoksyuDrawsA": "pioche",
|
||||||
"CDE.LoksyuFromAspect": "du",
|
"CDE.LoksyuFromAspect": "du",
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
MANIFEST-000023
|
MANIFEST-000040
|
||||||
|
|||||||
+7
-11
@@ -1,11 +1,7 @@
|
|||||||
2026/06/01-22:35:11.880760 7f52c5bfd6c0 Delete type=3 #1
|
2026/06/10-16:26:13.211312 7f2fceffd6c0 Recovering log #38
|
||||||
2026/06/01-22:35:51.016255 7f52c4bfb6c0 Level-0 table #26: started
|
2026/06/10-16:26:13.220902 7f2fceffd6c0 Delete type=3 #36
|
||||||
2026/06/01-22:35:51.016270 7f52c4bfb6c0 Level-0 table #26: 0 bytes OK
|
2026/06/10-16:26:13.220927 7f2fceffd6c0 Delete type=0 #38
|
||||||
2026/06/01-22:35:51.023046 7f52c4bfb6c0 Delete type=0 #24
|
2026/06/10-16:29:53.729923 7f2fce7fc6c0 Level-0 table #43: started
|
||||||
2026/06/01-22:35:51.047956 7f52c4bfb6c0 Manual compaction at level-0 from '!items!3aig6MWvZCRoWXPW' @ 72057594037927935 : 1 .. '!items!cXaQG1TBE0jzrbNt' @ 0 : 0; will stop at '!items!cXaQG1TBE0jzrbNt' @ 8 : 1
|
2026/06/10-16:29:53.729930 7f2fce7fc6c0 Level-0 table #43: 0 bytes OK
|
||||||
2026/06/01-22:35:51.047965 7f52c4bfb6c0 Compacting 1@0 + 0@1 files
|
2026/06/10-16:29:53.735552 7f2fce7fc6c0 Delete type=0 #41
|
||||||
2026/06/01-22:35:51.051139 7f52c4bfb6c0 Generated table #27@0: 4 keys, 1387 bytes
|
2026/06/10-16:29:53.741380 7f2fce7fc6c0 Manual compaction at level-0 from '!items!3aig6MWvZCRoWXPW' @ 72057594037927935 : 1 .. '!items!cXaQG1TBE0jzrbNt' @ 0 : 0; will stop at (end)
|
||||||
2026/06/01-22:35:51.051154 7f52c4bfb6c0 Compacted 1@0 + 0@1 files => 1387 bytes
|
|
||||||
2026/06/01-22:35:51.057027 7f52c4bfb6c0 compacted to: files[ 0 1 0 0 0 0 0 ]
|
|
||||||
2026/06/01-22:35:51.057087 7f52c4bfb6c0 Delete type=2 #10
|
|
||||||
2026/06/01-22:35:51.067136 7f52c4bfb6c0 Manual compaction at level-0 from '!items!cXaQG1TBE0jzrbNt' @ 8 : 1 .. '!items!cXaQG1TBE0jzrbNt' @ 0 : 0; will stop at (end)
|
|
||||||
|
|||||||
@@ -1,4 +1,7 @@
|
|||||||
2026/06/01-22:35:11.858708 7f52c5bfd6c0 Log #21: 0 ops saved to Table #22 OK
|
2026/06/10-16:17:31.579029 7f301cbff6c0 Recovering log #34
|
||||||
2026/06/01-22:35:11.858788 7f52c5bfd6c0 Archiving /home/morr/foundry/foundrydata-dev/Data/systems/fvtt-chroniques-de-l-etrange/packs/cde-armors/000021.log: OK
|
2026/06/10-16:17:31.588884 7f301cbff6c0 Delete type=3 #32
|
||||||
2026/06/01-22:35:11.858829 7f52c5bfd6c0 Table #10: 4 entries OK
|
2026/06/10-16:17:31.588903 7f301cbff6c0 Delete type=0 #34
|
||||||
2026/06/01-22:35:11.862084 7f52c5bfd6c0 **** Repaired leveldb /home/morr/foundry/foundrydata-dev/Data/systems/fvtt-chroniques-de-l-etrange/packs/cde-armors; recovered 1 files; 1387 bytes. Some data may have been lost. ****
|
2026/06/10-16:19:32.836492 7f2fce7fc6c0 Level-0 table #39: started
|
||||||
|
2026/06/10-16:19:32.836504 7f2fce7fc6c0 Level-0 table #39: 0 bytes OK
|
||||||
|
2026/06/10-16:19:32.843139 7f2fce7fc6c0 Delete type=0 #37
|
||||||
|
2026/06/10-16:19:32.855656 7f2fce7fc6c0 Manual compaction at level-0 from '!items!3aig6MWvZCRoWXPW' @ 72057594037927935 : 1 .. '!items!cXaQG1TBE0jzrbNt' @ 0 : 0; will stop at (end)
|
||||||
|
|||||||
Binary file not shown.
Binary file not shown.
@@ -1 +1 @@
|
|||||||
MANIFEST-000023
|
MANIFEST-000040
|
||||||
|
|||||||
+7
-11
@@ -1,11 +1,7 @@
|
|||||||
2026/06/01-22:35:11.987923 7f52c53fc6c0 Delete type=3 #1
|
2026/06/10-16:26:13.276120 7f301cbff6c0 Recovering log #38
|
||||||
2026/06/01-22:35:51.085088 7f52c4bfb6c0 Level-0 table #26: started
|
2026/06/10-16:26:13.285508 7f301cbff6c0 Delete type=3 #36
|
||||||
2026/06/01-22:35:51.085109 7f52c4bfb6c0 Level-0 table #26: 0 bytes OK
|
2026/06/10-16:26:13.285526 7f301cbff6c0 Delete type=0 #38
|
||||||
2026/06/01-22:35:51.091460 7f52c4bfb6c0 Delete type=0 #24
|
2026/06/10-16:29:53.772491 7f2fce7fc6c0 Level-0 table #43: started
|
||||||
2026/06/01-22:35:51.107759 7f52c4bfb6c0 Manual compaction at level-0 from '!journal!CDEGuideMain0001' @ 72057594037927935 : 1 .. '!journal.pages!CDEGuideMain0001.wgqIHHVlO9miegn1' @ 0 : 0; will stop at '!journal.pages!CDEGuideMain0001.wgqIHHVlO9miegn1' @ 17 : 1
|
2026/06/10-16:29:53.772502 7f2fce7fc6c0 Level-0 table #43: 0 bytes OK
|
||||||
2026/06/01-22:35:51.107763 7f52c4bfb6c0 Compacting 1@0 + 0@1 files
|
2026/06/10-16:29:53.778096 7f2fce7fc6c0 Delete type=0 #41
|
||||||
2026/06/01-22:35:51.111831 7f52c4bfb6c0 Generated table #27@0: 21 keys, 18033 bytes
|
2026/06/10-16:29:53.791678 7f2fce7fc6c0 Manual compaction at level-0 from '!journal!CDEGuideMain0001' @ 72057594037927935 : 1 .. '!journal.pages!CDEGuideMain0001.wgqIHHVlO9miegn1' @ 0 : 0; will stop at (end)
|
||||||
2026/06/01-22:35:51.111846 7f52c4bfb6c0 Compacted 1@0 + 0@1 files => 18033 bytes
|
|
||||||
2026/06/01-22:35:51.117896 7f52c4bfb6c0 compacted to: files[ 0 1 0 0 0 0 0 ]
|
|
||||||
2026/06/01-22:35:51.117946 7f52c4bfb6c0 Delete type=2 #10
|
|
||||||
2026/06/01-22:35:51.124817 7f52c4bfb6c0 Manual compaction at level-0 from '!journal.pages!CDEGuideMain0001.wgqIHHVlO9miegn1' @ 17 : 1 .. '!journal.pages!CDEGuideMain0001.wgqIHHVlO9miegn1' @ 0 : 0; will stop at (end)
|
|
||||||
|
|||||||
@@ -1,4 +1,7 @@
|
|||||||
2026/06/01-22:35:11.970906 7f52c53fc6c0 Log #21: 0 ops saved to Table #22 OK
|
2026/06/10-16:17:31.644676 7f2fcf7fe6c0 Recovering log #34
|
||||||
2026/06/01-22:35:11.971023 7f52c53fc6c0 Archiving /home/morr/foundry/foundrydata-dev/Data/systems/fvtt-chroniques-de-l-etrange/packs/cde-help/000021.log: OK
|
2026/06/10-16:17:31.653678 7f2fcf7fe6c0 Delete type=3 #32
|
||||||
2026/06/01-22:35:11.971154 7f52c53fc6c0 Table #10: 21 entries OK
|
2026/06/10-16:17:31.653697 7f2fcf7fe6c0 Delete type=0 #34
|
||||||
2026/06/01-22:35:11.974528 7f52c53fc6c0 **** Repaired leveldb /home/morr/foundry/foundrydata-dev/Data/systems/fvtt-chroniques-de-l-etrange/packs/cde-help; recovered 1 files; 18033 bytes. Some data may have been lost. ****
|
2026/06/10-16:19:32.867823 7f2fce7fc6c0 Level-0 table #39: started
|
||||||
|
2026/06/10-16:19:32.867836 7f2fce7fc6c0 Level-0 table #39: 0 bytes OK
|
||||||
|
2026/06/10-16:19:32.874859 7f2fce7fc6c0 Delete type=0 #37
|
||||||
|
2026/06/10-16:19:32.874953 7f2fce7fc6c0 Manual compaction at level-0 from '!journal!CDEGuideMain0001' @ 72057594037927935 : 1 .. '!journal.pages!CDEGuideMain0001.wgqIHHVlO9miegn1' @ 0 : 0; will stop at (end)
|
||||||
|
|||||||
Binary file not shown.
Binary file not shown.
@@ -1 +1 @@
|
|||||||
MANIFEST-000023
|
MANIFEST-000040
|
||||||
|
|||||||
@@ -1,11 +1,7 @@
|
|||||||
2026/06/01-22:35:11.914967 7f52c6bff6c0 Delete type=3 #1
|
2026/06/10-16:26:13.232087 7f2fcf7fe6c0 Recovering log #38
|
||||||
2026/06/01-22:35:51.023125 7f52c4bfb6c0 Level-0 table #26: started
|
2026/06/10-16:26:13.242712 7f2fcf7fe6c0 Delete type=3 #36
|
||||||
2026/06/01-22:35:51.023151 7f52c4bfb6c0 Level-0 table #26: 0 bytes OK
|
2026/06/10-16:26:13.242732 7f2fcf7fe6c0 Delete type=0 #38
|
||||||
2026/06/01-22:35:51.028968 7f52c4bfb6c0 Delete type=0 #24
|
2026/06/10-16:29:53.748487 7f2fce7fc6c0 Level-0 table #43: started
|
||||||
2026/06/01-22:35:51.057155 7f52c4bfb6c0 Manual compaction at level-0 from '!items!0NDBw1YB54q3hLH0' @ 72057594037927935 : 1 .. '!items!ykekdZlirabRobEF' @ 0 : 0; will stop at '!items!ykekdZlirabRobEF' @ 108 : 1
|
2026/06/10-16:29:53.748497 7f2fce7fc6c0 Level-0 table #43: 0 bytes OK
|
||||||
2026/06/01-22:35:51.057162 7f52c4bfb6c0 Compacting 1@0 + 0@1 files
|
2026/06/10-16:29:53.754350 7f2fce7fc6c0 Delete type=0 #41
|
||||||
2026/06/01-22:35:51.060536 7f52c4bfb6c0 Generated table #27@0: 54 keys, 8881 bytes
|
2026/06/10-16:29:53.766297 7f2fce7fc6c0 Manual compaction at level-0 from '!items!0NDBw1YB54q3hLH0' @ 72057594037927935 : 1 .. '!items!ykekdZlirabRobEF' @ 0 : 0; will stop at (end)
|
||||||
2026/06/01-22:35:51.060550 7f52c4bfb6c0 Compacted 1@0 + 0@1 files => 8881 bytes
|
|
||||||
2026/06/01-22:35:51.067003 7f52c4bfb6c0 compacted to: files[ 0 1 0 0 0 0 0 ]
|
|
||||||
2026/06/01-22:35:51.067054 7f52c4bfb6c0 Delete type=2 #10
|
|
||||||
2026/06/01-22:35:51.073072 7f52c4bfb6c0 Manual compaction at level-0 from '!items!ykekdZlirabRobEF' @ 108 : 1 .. '!items!ykekdZlirabRobEF' @ 0 : 0; will stop at (end)
|
|
||||||
|
|||||||
@@ -1,4 +1,7 @@
|
|||||||
2026/06/01-22:35:11.900722 7f52c6bff6c0 Log #21: 0 ops saved to Table #22 OK
|
2026/06/10-16:17:31.600066 7f2fcf7fe6c0 Recovering log #34
|
||||||
2026/06/01-22:35:11.900766 7f52c6bff6c0 Archiving /home/morr/foundry/foundrydata-dev/Data/systems/fvtt-chroniques-de-l-etrange/packs/cde-ingredients/000021.log: OK
|
2026/06/10-16:17:31.609869 7f2fcf7fe6c0 Delete type=3 #32
|
||||||
2026/06/01-22:35:11.900837 7f52c6bff6c0 Table #10: 54 entries OK
|
2026/06/10-16:17:31.609890 7f2fcf7fe6c0 Delete type=0 #34
|
||||||
2026/06/01-22:35:11.904105 7f52c6bff6c0 **** Repaired leveldb /home/morr/foundry/foundrydata-dev/Data/systems/fvtt-chroniques-de-l-etrange/packs/cde-ingredients; recovered 1 files; 8881 bytes. Some data may have been lost. ****
|
2026/06/10-16:19:32.843204 7f2fce7fc6c0 Level-0 table #39: started
|
||||||
|
2026/06/10-16:19:32.843219 7f2fce7fc6c0 Level-0 table #39: 0 bytes OK
|
||||||
|
2026/06/10-16:19:32.849235 7f2fce7fc6c0 Delete type=0 #37
|
||||||
|
2026/06/10-16:19:32.855663 7f2fce7fc6c0 Manual compaction at level-0 from '!items!0NDBw1YB54q3hLH0' @ 72057594037927935 : 1 .. '!items!ykekdZlirabRobEF' @ 0 : 0; will stop at (end)
|
||||||
|
|||||||
Binary file not shown.
Binary file not shown.
@@ -1 +1 @@
|
|||||||
MANIFEST-000023
|
MANIFEST-000040
|
||||||
|
|||||||
+7
-11
@@ -1,11 +1,7 @@
|
|||||||
2026/06/01-22:35:11.932171 7f52c63fe6c0 Delete type=3 #1
|
2026/06/10-16:26:13.243837 7f2fcffff6c0 Recovering log #38
|
||||||
2026/06/01-22:35:51.010289 7f52c4bfb6c0 Level-0 table #26: started
|
2026/06/10-16:26:13.253357 7f2fcffff6c0 Delete type=3 #36
|
||||||
2026/06/01-22:35:51.010313 7f52c4bfb6c0 Level-0 table #26: 0 bytes OK
|
2026/06/10-16:26:13.253373 7f2fcffff6c0 Delete type=0 #38
|
||||||
2026/06/01-22:35:51.016160 7f52c4bfb6c0 Delete type=0 #24
|
2026/06/10-16:29:53.754405 7f2fce7fc6c0 Level-0 table #43: started
|
||||||
2026/06/01-22:35:51.037980 7f52c4bfb6c0 Manual compaction at level-0 from '!items!HKq5ANSGiBIdcnki' @ 72057594037927935 : 1 .. '!items!HKq5ANSGiBIdcnki' @ 0 : 0; will stop at '!items!HKq5ANSGiBIdcnki' @ 2 : 1
|
2026/06/10-16:29:53.754415 7f2fce7fc6c0 Level-0 table #43: 0 bytes OK
|
||||||
2026/06/01-22:35:51.037986 7f52c4bfb6c0 Compacting 1@0 + 0@1 files
|
2026/06/10-16:29:53.760076 7f2fce7fc6c0 Delete type=0 #41
|
||||||
2026/06/01-22:35:51.041162 7f52c4bfb6c0 Generated table #27@0: 1 keys, 596 bytes
|
2026/06/10-16:29:53.766302 7f2fce7fc6c0 Manual compaction at level-0 from '!items!HKq5ANSGiBIdcnki' @ 72057594037927935 : 1 .. '!items!HKq5ANSGiBIdcnki' @ 0 : 0; will stop at (end)
|
||||||
2026/06/01-22:35:51.041178 7f52c4bfb6c0 Compacted 1@0 + 0@1 files => 596 bytes
|
|
||||||
2026/06/01-22:35:51.047786 7f52c4bfb6c0 compacted to: files[ 0 1 0 0 0 0 0 ]
|
|
||||||
2026/06/01-22:35:51.047867 7f52c4bfb6c0 Delete type=2 #10
|
|
||||||
2026/06/01-22:35:51.067128 7f52c4bfb6c0 Manual compaction at level-0 from '!items!HKq5ANSGiBIdcnki' @ 2 : 1 .. '!items!HKq5ANSGiBIdcnki' @ 0 : 0; will stop at (end)
|
|
||||||
|
|||||||
@@ -1,4 +1,7 @@
|
|||||||
2026/06/01-22:35:11.918464 7f52c63fe6c0 Log #21: 0 ops saved to Table #22 OK
|
2026/06/10-16:17:31.611312 7f2fceffd6c0 Recovering log #34
|
||||||
2026/06/01-22:35:11.918512 7f52c63fe6c0 Archiving /home/morr/foundry/foundrydata-dev/Data/systems/fvtt-chroniques-de-l-etrange/packs/cde-items/000021.log: OK
|
2026/06/10-16:17:31.621229 7f2fceffd6c0 Delete type=3 #32
|
||||||
2026/06/01-22:35:11.918537 7f52c63fe6c0 Table #10: 1 entries OK
|
2026/06/10-16:17:31.621250 7f2fceffd6c0 Delete type=0 #34
|
||||||
2026/06/01-22:35:11.921448 7f52c63fe6c0 **** Repaired leveldb /home/morr/foundry/foundrydata-dev/Data/systems/fvtt-chroniques-de-l-etrange/packs/cde-items; recovered 1 files; 596 bytes. Some data may have been lost. ****
|
2026/06/10-16:19:32.849323 7f2fce7fc6c0 Level-0 table #39: started
|
||||||
|
2026/06/10-16:19:32.849339 7f2fce7fc6c0 Level-0 table #39: 0 bytes OK
|
||||||
|
2026/06/10-16:19:32.855577 7f2fce7fc6c0 Delete type=0 #37
|
||||||
|
2026/06/10-16:19:32.874930 7f2fce7fc6c0 Manual compaction at level-0 from '!items!HKq5ANSGiBIdcnki' @ 72057594037927935 : 1 .. '!items!HKq5ANSGiBIdcnki' @ 0 : 0; will stop at (end)
|
||||||
|
|||||||
Binary file not shown.
Binary file not shown.
@@ -1 +1 @@
|
|||||||
MANIFEST-000023
|
MANIFEST-000040
|
||||||
|
|||||||
+7
-11
@@ -1,11 +1,7 @@
|
|||||||
2026/06/01-22:35:11.796994 7f52c63fe6c0 Delete type=3 #1
|
2026/06/10-16:26:13.102940 7f2fcffff6c0 Recovering log #38
|
||||||
2026/06/01-22:35:50.937098 7f52c4bfb6c0 Level-0 table #26: started
|
2026/06/10-16:26:13.157514 7f2fcffff6c0 Delete type=3 #36
|
||||||
2026/06/01-22:35:50.937158 7f52c4bfb6c0 Level-0 table #26: 0 bytes OK
|
2026/06/10-16:26:13.157538 7f2fcffff6c0 Delete type=0 #38
|
||||||
2026/06/01-22:35:50.943430 7f52c4bfb6c0 Delete type=0 #24
|
2026/06/10-16:29:53.716605 7f2fce7fc6c0 Level-0 table #43: started
|
||||||
2026/06/01-22:35:50.962798 7f52c4bfb6c0 Manual compaction at level-0 from '!items!2nKXEHLG0fXtSOdy' @ 72057594037927935 : 1 .. '!items!tlIc1bmIAbQeUwj7' @ 0 : 0; will stop at '!items!tlIc1bmIAbQeUwj7' @ 40 : 1
|
2026/06/10-16:29:53.716618 7f2fce7fc6c0 Level-0 table #43: 0 bytes OK
|
||||||
2026/06/01-22:35:50.962805 7f52c4bfb6c0 Compacting 1@0 + 0@1 files
|
2026/06/10-16:29:53.723647 7f2fce7fc6c0 Delete type=0 #41
|
||||||
2026/06/01-22:35:50.966120 7f52c4bfb6c0 Generated table #27@0: 20 keys, 34454 bytes
|
2026/06/10-16:29:53.735595 7f2fce7fc6c0 Manual compaction at level-0 from '!items!2nKXEHLG0fXtSOdy' @ 72057594037927935 : 1 .. '!items!tlIc1bmIAbQeUwj7' @ 0 : 0; will stop at (end)
|
||||||
2026/06/01-22:35:50.966138 7f52c4bfb6c0 Compacted 1@0 + 0@1 files => 34454 bytes
|
|
||||||
2026/06/01-22:35:50.972309 7f52c4bfb6c0 compacted to: files[ 0 1 0 0 0 0 0 ]
|
|
||||||
2026/06/01-22:35:50.972597 7f52c4bfb6c0 Delete type=2 #10
|
|
||||||
2026/06/01-22:35:51.004209 7f52c4bfb6c0 Manual compaction at level-0 from '!items!tlIc1bmIAbQeUwj7' @ 40 : 1 .. '!items!tlIc1bmIAbQeUwj7' @ 0 : 0; will stop at (end)
|
|
||||||
|
|||||||
@@ -1,4 +1,7 @@
|
|||||||
2026/06/01-22:35:11.733217 7f52c63fe6c0 Log #21: 0 ops saved to Table #22 OK
|
2026/06/10-16:17:31.536886 7f301cbff6c0 Recovering log #34
|
||||||
2026/06/01-22:35:11.733303 7f52c63fe6c0 Archiving /home/morr/foundry/foundrydata-dev/Data/systems/fvtt-chroniques-de-l-etrange/packs/cde-kungfus/000021.log: OK
|
2026/06/10-16:17:31.546178 7f301cbff6c0 Delete type=3 #32
|
||||||
2026/06/01-22:35:11.733464 7f52c63fe6c0 Table #10: 20 entries OK
|
2026/06/10-16:17:31.546208 7f301cbff6c0 Delete type=0 #34
|
||||||
2026/06/01-22:35:11.736813 7f52c63fe6c0 **** Repaired leveldb /home/morr/foundry/foundrydata-dev/Data/systems/fvtt-chroniques-de-l-etrange/packs/cde-kungfus; recovered 1 files; 34454 bytes. Some data may have been lost. ****
|
2026/06/10-16:19:32.817770 7f2fce7fc6c0 Level-0 table #39: started
|
||||||
|
2026/06/10-16:19:32.817789 7f2fce7fc6c0 Level-0 table #39: 0 bytes OK
|
||||||
|
2026/06/10-16:19:32.823980 7f2fce7fc6c0 Delete type=0 #37
|
||||||
|
2026/06/10-16:19:32.830698 7f2fce7fc6c0 Manual compaction at level-0 from '!items!2nKXEHLG0fXtSOdy' @ 72057594037927935 : 1 .. '!items!tlIc1bmIAbQeUwj7' @ 0 : 0; will stop at (end)
|
||||||
|
|||||||
Binary file not shown.
Binary file not shown.
@@ -1 +1 @@
|
|||||||
MANIFEST-000023
|
MANIFEST-000040
|
||||||
|
|||||||
+7
-11
@@ -1,11 +1,7 @@
|
|||||||
2026/06/01-22:35:11.950430 7f52c6bff6c0 Delete type=3 #1
|
2026/06/10-16:26:13.254219 7f2fceffd6c0 Recovering log #38
|
||||||
2026/06/01-22:35:51.067200 7f52c4bfb6c0 Level-0 table #26: started
|
2026/06/10-16:26:13.263234 7f2fceffd6c0 Delete type=3 #36
|
||||||
2026/06/01-22:35:51.067214 7f52c4bfb6c0 Level-0 table #26: 0 bytes OK
|
2026/06/10-16:26:13.263255 7f2fceffd6c0 Delete type=0 #38
|
||||||
2026/06/01-22:35:51.072998 7f52c4bfb6c0 Delete type=0 #24
|
2026/06/10-16:29:53.760191 7f2fce7fc6c0 Level-0 table #43: started
|
||||||
2026/06/01-22:35:51.091558 7f52c4bfb6c0 Manual compaction at level-0 from '!actors!4ZjFZ1HoJV9mJStt' @ 72057594037927935 : 1 .. '!actors!zVpmacwoWEG8YTCQ' @ 0 : 0; will stop at '!actors!zVpmacwoWEG8YTCQ' @ 98 : 1
|
2026/06/10-16:29:53.760201 7f2fce7fc6c0 Level-0 table #43: 0 bytes OK
|
||||||
2026/06/01-22:35:51.091566 7f52c4bfb6c0 Compacting 1@0 + 0@1 files
|
2026/06/10-16:29:53.766249 7f2fce7fc6c0 Delete type=0 #41
|
||||||
2026/06/01-22:35:51.095457 7f52c4bfb6c0 Generated table #27@0: 49 keys, 50053 bytes
|
2026/06/10-16:29:53.772486 7f2fce7fc6c0 Manual compaction at level-0 from '!actors!4ZjFZ1HoJV9mJStt' @ 72057594037927935 : 1 .. '!actors!zVpmacwoWEG8YTCQ' @ 0 : 0; will stop at (end)
|
||||||
2026/06/01-22:35:51.095470 7f52c4bfb6c0 Compacted 1@0 + 0@1 files => 50053 bytes
|
|
||||||
2026/06/01-22:35:51.101290 7f52c4bfb6c0 compacted to: files[ 0 1 0 0 0 0 0 ]
|
|
||||||
2026/06/01-22:35:51.101339 7f52c4bfb6c0 Delete type=2 #10
|
|
||||||
2026/06/01-22:35:51.118034 7f52c4bfb6c0 Manual compaction at level-0 from '!actors!zVpmacwoWEG8YTCQ' @ 98 : 1 .. '!actors!zVpmacwoWEG8YTCQ' @ 0 : 0; will stop at (end)
|
|
||||||
|
|||||||
@@ -1,4 +1,7 @@
|
|||||||
2026/06/01-22:35:11.935539 7f52c6bff6c0 Log #21: 0 ops saved to Table #22 OK
|
2026/06/10-16:17:31.622266 7f2fcf7fe6c0 Recovering log #34
|
||||||
2026/06/01-22:35:11.935591 7f52c6bff6c0 Archiving /home/morr/foundry/foundrydata-dev/Data/systems/fvtt-chroniques-de-l-etrange/packs/cde-npcs/000021.log: OK
|
2026/06/10-16:17:31.631460 7f2fcf7fe6c0 Delete type=3 #32
|
||||||
2026/06/01-22:35:11.935674 7f52c6bff6c0 Table #10: 49 entries OK
|
2026/06/10-16:17:31.631480 7f2fcf7fe6c0 Delete type=0 #34
|
||||||
2026/06/01-22:35:11.939231 7f52c6bff6c0 **** Repaired leveldb /home/morr/foundry/foundrydata-dev/Data/systems/fvtt-chroniques-de-l-etrange/packs/cde-npcs; recovered 1 files; 50053 bytes. Some data may have been lost. ****
|
2026/06/10-16:19:32.855722 7f2fce7fc6c0 Level-0 table #39: started
|
||||||
|
2026/06/10-16:19:32.855734 7f2fce7fc6c0 Level-0 table #39: 0 bytes OK
|
||||||
|
2026/06/10-16:19:32.861808 7f2fce7fc6c0 Delete type=0 #37
|
||||||
|
2026/06/10-16:19:32.874938 7f2fce7fc6c0 Manual compaction at level-0 from '!actors!4ZjFZ1HoJV9mJStt' @ 72057594037927935 : 1 .. '!actors!zVpmacwoWEG8YTCQ' @ 0 : 0; will stop at (end)
|
||||||
|
|||||||
Binary file not shown.
Binary file not shown.
@@ -1 +1 @@
|
|||||||
MANIFEST-000002
|
MANIFEST-000018
|
||||||
|
|||||||
@@ -1,5 +1,8 @@
|
|||||||
2026/06/01-22:35:11.966943 7f52c5bfd6c0 Delete type=3 #1
|
2026/06/10-16:26:13.264620 7f2fceffd6c0 Recovering log #16
|
||||||
2026/06/01-22:35:51.073080 7f52c4bfb6c0 Level-0 table #5: started
|
2026/06/10-16:26:13.274036 7f2fceffd6c0 Delete type=3 #14
|
||||||
2026/06/01-22:35:51.079046 7f52c4bfb6c0 Level-0 table #5: 429877 bytes OK
|
2026/06/10-16:26:13.274051 7f2fceffd6c0 Delete type=0 #16
|
||||||
2026/06/01-22:35:51.084913 7f52c4bfb6c0 Delete type=0 #3
|
2026/06/10-16:29:53.766305 7f2fce7fc6c0 Level-0 table #21: started
|
||||||
2026/06/01-22:35:51.107744 7f52c4bfb6c0 Manual compaction at level-0 from '!actors!5OGW1fRUn12aNMMV' @ 72057594037927935 : 1 .. '!actors.items!zSWwOmFiFjN4YxC9.w8LXSYQ1eIygtlKV' @ 0 : 0; will stop at (end)
|
2026/06/10-16:29:53.766315 7f2fce7fc6c0 Level-0 table #21: 0 bytes OK
|
||||||
|
2026/06/10-16:29:53.772397 7f2fce7fc6c0 Delete type=0 #19
|
||||||
|
2026/06/10-16:29:53.791671 7f2fce7fc6c0 Manual compaction at level-0 from '!actors!5OGW1fRUn12aNMMV' @ 72057594037927935 : 1 .. '!actors.items!zSWwOmFiFjN4YxC9.w8LXSYQ1eIygtlKV' @ 0 : 0; will stop at (end)
|
||||||
|
2026/06/10-16:29:53.814542 7f2fce7fc6c0 Manual compaction at level-1 from '!actors!5OGW1fRUn12aNMMV' @ 72057594037927935 : 1 .. '!actors.items!zSWwOmFiFjN4YxC9.w8LXSYQ1eIygtlKV' @ 0 : 0; will stop at (end)
|
||||||
|
|||||||
@@ -0,0 +1,8 @@
|
|||||||
|
2026/06/10-16:17:31.632628 7f2fcf7fe6c0 Recovering log #12
|
||||||
|
2026/06/10-16:17:31.642483 7f2fcf7fe6c0 Delete type=3 #10
|
||||||
|
2026/06/10-16:17:31.642501 7f2fcf7fe6c0 Delete type=0 #12
|
||||||
|
2026/06/10-16:19:32.861885 7f2fce7fc6c0 Level-0 table #17: started
|
||||||
|
2026/06/10-16:19:32.861895 7f2fce7fc6c0 Level-0 table #17: 0 bytes OK
|
||||||
|
2026/06/10-16:19:32.867739 7f2fce7fc6c0 Delete type=0 #15
|
||||||
|
2026/06/10-16:19:32.874946 7f2fce7fc6c0 Manual compaction at level-0 from '!actors!5OGW1fRUn12aNMMV' @ 72057594037927935 : 1 .. '!actors.items!zSWwOmFiFjN4YxC9.w8LXSYQ1eIygtlKV' @ 0 : 0; will stop at (end)
|
||||||
|
2026/06/10-16:19:32.874957 7f2fce7fc6c0 Manual compaction at level-1 from '!actors!5OGW1fRUn12aNMMV' @ 72057594037927935 : 1 .. '!actors.items!zSWwOmFiFjN4YxC9.w8LXSYQ1eIygtlKV' @ 0 : 0; will stop at (end)
|
||||||
Binary file not shown.
Binary file not shown.
@@ -1 +1 @@
|
|||||||
MANIFEST-000023
|
MANIFEST-000040
|
||||||
|
|||||||
+7
-11
@@ -1,11 +1,7 @@
|
|||||||
2026/06/01-22:35:11.897294 7f52c63fe6c0 Delete type=3 #1
|
2026/06/10-16:26:13.222183 7f2fcffff6c0 Recovering log #38
|
||||||
2026/06/01-22:35:51.004437 7f52c4bfb6c0 Level-0 table #26: started
|
2026/06/10-16:26:13.231094 7f2fcffff6c0 Delete type=3 #36
|
||||||
2026/06/01-22:35:51.004459 7f52c4bfb6c0 Level-0 table #26: 0 bytes OK
|
2026/06/10-16:26:13.231111 7f2fcffff6c0 Delete type=0 #38
|
||||||
2026/06/01-22:35:51.010228 7f52c4bfb6c0 Delete type=0 #24
|
2026/06/10-16:29:53.735658 7f2fce7fc6c0 Level-0 table #43: started
|
||||||
2026/06/01-22:35:51.029047 7f52c4bfb6c0 Manual compaction at level-0 from '!items!DC2kimCi9sWxqhXG' @ 72057594037927935 : 1 .. '!items!qzfAEhmvVxEMzm0k' @ 0 : 0; will stop at '!items!qzfAEhmvVxEMzm0k' @ 10 : 1
|
2026/06/10-16:29:53.735668 7f2fce7fc6c0 Level-0 table #43: 0 bytes OK
|
||||||
2026/06/01-22:35:51.029057 7f52c4bfb6c0 Compacting 1@0 + 0@1 files
|
2026/06/10-16:29:53.741314 7f2fce7fc6c0 Delete type=0 #41
|
||||||
2026/06/01-22:35:51.032066 7f52c4bfb6c0 Generated table #27@0: 5 keys, 4934 bytes
|
2026/06/10-16:29:53.754398 7f2fce7fc6c0 Manual compaction at level-0 from '!items!DC2kimCi9sWxqhXG' @ 72057594037927935 : 1 .. '!items!qzfAEhmvVxEMzm0k' @ 0 : 0; will stop at (end)
|
||||||
2026/06/01-22:35:51.032071 7f52c4bfb6c0 Compacted 1@0 + 0@1 files => 4934 bytes
|
|
||||||
2026/06/01-22:35:51.037821 7f52c4bfb6c0 compacted to: files[ 0 1 0 0 0 0 0 ]
|
|
||||||
2026/06/01-22:35:51.037900 7f52c4bfb6c0 Delete type=2 #10
|
|
||||||
2026/06/01-22:35:51.067117 7f52c4bfb6c0 Manual compaction at level-0 from '!items!qzfAEhmvVxEMzm0k' @ 10 : 1 .. '!items!qzfAEhmvVxEMzm0k' @ 0 : 0; will stop at (end)
|
|
||||||
|
|||||||
@@ -1,4 +1,7 @@
|
|||||||
2026/06/01-22:35:11.883439 7f52c63fe6c0 Log #21: 0 ops saved to Table #22 OK
|
2026/06/10-16:17:31.589862 7f2fcffff6c0 Recovering log #34
|
||||||
2026/06/01-22:35:11.883485 7f52c63fe6c0 Archiving /home/morr/foundry/foundrydata-dev/Data/systems/fvtt-chroniques-de-l-etrange/packs/cde-sanhei/000021.log: OK
|
2026/06/10-16:17:31.599011 7f2fcffff6c0 Delete type=3 #32
|
||||||
2026/06/01-22:35:11.883523 7f52c63fe6c0 Table #10: 5 entries OK
|
2026/06/10-16:17:31.599029 7f2fcffff6c0 Delete type=0 #34
|
||||||
2026/06/01-22:35:11.886566 7f52c63fe6c0 **** Repaired leveldb /home/morr/foundry/foundrydata-dev/Data/systems/fvtt-chroniques-de-l-etrange/packs/cde-sanhei; recovered 1 files; 4934 bytes. Some data may have been lost. ****
|
2026/06/10-16:19:32.811842 7f2fce7fc6c0 Level-0 table #39: started
|
||||||
|
2026/06/10-16:19:32.811862 7f2fce7fc6c0 Level-0 table #39: 0 bytes OK
|
||||||
|
2026/06/10-16:19:32.817688 7f2fce7fc6c0 Delete type=0 #37
|
||||||
|
2026/06/10-16:19:32.830692 7f2fce7fc6c0 Manual compaction at level-0 from '!items!DC2kimCi9sWxqhXG' @ 72057594037927935 : 1 .. '!items!qzfAEhmvVxEMzm0k' @ 0 : 0; will stop at (end)
|
||||||
|
|||||||
Binary file not shown.
Binary file not shown.
@@ -1 +1 @@
|
|||||||
MANIFEST-000042
|
MANIFEST-000059
|
||||||
|
|||||||
+7
-11
@@ -1,11 +1,7 @@
|
|||||||
2026/06/01-22:35:12.007471 7f52c63fe6c0 Delete type=3 #1
|
2026/06/10-16:26:13.286742 7f2fcf7fe6c0 Recovering log #57
|
||||||
2026/06/01-22:35:51.124825 7f52c4bfb6c0 Level-0 table #45: started
|
2026/06/10-16:26:13.296421 7f2fcf7fe6c0 Delete type=3 #55
|
||||||
2026/06/01-22:35:51.124844 7f52c4bfb6c0 Level-0 table #45: 0 bytes OK
|
2026/06/10-16:26:13.296441 7f2fcf7fe6c0 Delete type=0 #57
|
||||||
2026/06/01-22:35:51.131445 7f52c4bfb6c0 Delete type=0 #43
|
2026/06/10-16:29:53.778131 7f2fce7fc6c0 Level-0 table #62: started
|
||||||
2026/06/01-22:35:51.145660 7f52c4bfb6c0 Manual compaction at level-0 from '!scenes!2C6gyZpvPxWlsVZi' @ 72057594037927935 : 1 .. '!scenes.levels!olYe9bhuXwRWQ8j7.defaultLevel0000' @ 0 : 0; will stop at '!scenes.levels!olYe9bhuXwRWQ8j7.defaultLevel0000' @ 1 : 1
|
2026/06/10-16:29:53.778141 7f2fce7fc6c0 Level-0 table #62: 0 bytes OK
|
||||||
2026/06/01-22:35:51.145675 7f52c4bfb6c0 Compacting 1@0 + 0@1 files
|
2026/06/10-16:29:53.783939 7f2fce7fc6c0 Delete type=0 #60
|
||||||
2026/06/01-22:35:51.149105 7f52c4bfb6c0 Generated table #46@0: 8 keys, 3172 bytes
|
2026/06/10-16:29:53.791683 7f2fce7fc6c0 Manual compaction at level-0 from '!scenes!2C6gyZpvPxWlsVZi' @ 72057594037927935 : 1 .. '!scenes.levels!olYe9bhuXwRWQ8j7.defaultLevel0000' @ 0 : 0; will stop at (end)
|
||||||
2026/06/01-22:35:51.149125 7f52c4bfb6c0 Compacted 1@0 + 0@1 files => 3172 bytes
|
|
||||||
2026/06/01-22:35:51.155673 7f52c4bfb6c0 compacted to: files[ 0 1 0 0 0 0 0 ]
|
|
||||||
2026/06/01-22:35:51.155780 7f52c4bfb6c0 Delete type=2 #5
|
|
||||||
2026/06/01-22:35:51.163444 7f52c4bfb6c0 Manual compaction at level-0 from '!scenes.levels!olYe9bhuXwRWQ8j7.defaultLevel0000' @ 1 : 1 .. '!scenes.levels!olYe9bhuXwRWQ8j7.defaultLevel0000' @ 0 : 0; will stop at (end)
|
|
||||||
|
|||||||
@@ -1,4 +1,7 @@
|
|||||||
2026/06/01-22:35:11.992251 7f52c63fe6c0 Log #40: 0 ops saved to Table #41 OK
|
2026/06/10-16:17:31.655147 7f2fceffd6c0 Recovering log #53
|
||||||
2026/06/01-22:35:11.992349 7f52c63fe6c0 Archiving /home/morr/foundry/foundrydata-dev/Data/systems/fvtt-chroniques-de-l-etrange/packs/cde-scenes/000040.log: OK
|
2026/06/10-16:17:31.664989 7f2fceffd6c0 Delete type=3 #51
|
||||||
2026/06/01-22:35:11.992433 7f52c63fe6c0 Table #5: 22 entries OK
|
2026/06/10-16:17:31.665009 7f2fceffd6c0 Delete type=0 #53
|
||||||
2026/06/01-22:35:11.995902 7f52c63fe6c0 **** Repaired leveldb /home/morr/foundry/foundrydata-dev/Data/systems/fvtt-chroniques-de-l-etrange/packs/cde-scenes; recovered 1 files; 7078 bytes. Some data may have been lost. ****
|
2026/06/10-16:19:32.875008 7f2fce7fc6c0 Level-0 table #58: started
|
||||||
|
2026/06/10-16:19:32.875020 7f2fce7fc6c0 Level-0 table #58: 0 bytes OK
|
||||||
|
2026/06/10-16:19:32.880947 7f2fce7fc6c0 Delete type=0 #56
|
||||||
|
2026/06/10-16:19:32.903220 7f2fce7fc6c0 Manual compaction at level-0 from '!scenes!2C6gyZpvPxWlsVZi' @ 72057594037927935 : 1 .. '!scenes.levels!olYe9bhuXwRWQ8j7.defaultLevel0000' @ 0 : 0; will stop at (end)
|
||||||
|
|||||||
Binary file not shown.
Binary file not shown.
@@ -1 +1 @@
|
|||||||
MANIFEST-000023
|
MANIFEST-000040
|
||||||
|
|||||||
+7
-11
@@ -1,11 +1,7 @@
|
|||||||
2026/06/01-22:35:11.817600 7f52c53fc6c0 Delete type=3 #1
|
2026/06/10-16:26:13.159784 7f2fceffd6c0 Recovering log #38
|
||||||
2026/06/01-22:35:50.950071 7f52c4bfb6c0 Level-0 table #26: started
|
2026/06/10-16:26:13.186364 7f2fceffd6c0 Delete type=3 #36
|
||||||
2026/06/01-22:35:50.950101 7f52c4bfb6c0 Level-0 table #26: 0 bytes OK
|
2026/06/10-16:26:13.186391 7f2fceffd6c0 Delete type=0 #38
|
||||||
2026/06/01-22:35:50.956859 7f52c4bfb6c0 Delete type=0 #24
|
2026/06/10-16:29:53.741387 7f2fce7fc6c0 Level-0 table #43: started
|
||||||
2026/06/01-22:35:50.982784 7f52c4bfb6c0 Manual compaction at level-0 from '!items!2f51pcvFkcZjaxDk' @ 72057594037927935 : 1 .. '!items!yVN7PZw35iIaBl0H' @ 0 : 0; will stop at '!items!yVN7PZw35iIaBl0H' @ 50 : 1
|
2026/06/10-16:29:53.741400 7f2fce7fc6c0 Level-0 table #43: 0 bytes OK
|
||||||
2026/06/01-22:35:50.982795 7f52c4bfb6c0 Compacting 1@0 + 0@1 files
|
2026/06/10-16:29:53.748439 7f2fce7fc6c0 Delete type=0 #41
|
||||||
2026/06/01-22:35:50.988505 7f52c4bfb6c0 Generated table #27@0: 25 keys, 124022 bytes
|
2026/06/10-16:29:53.760185 7f2fce7fc6c0 Manual compaction at level-0 from '!items!2f51pcvFkcZjaxDk' @ 72057594037927935 : 1 .. '!items!yVN7PZw35iIaBl0H' @ 0 : 0; will stop at (end)
|
||||||
2026/06/01-22:35:50.988522 7f52c4bfb6c0 Compacted 1@0 + 0@1 files => 124022 bytes
|
|
||||||
2026/06/01-22:35:50.994813 7f52c4bfb6c0 compacted to: files[ 0 1 0 0 0 0 0 ]
|
|
||||||
2026/06/01-22:35:50.994888 7f52c4bfb6c0 Delete type=2 #10
|
|
||||||
2026/06/01-22:35:51.004229 7f52c4bfb6c0 Manual compaction at level-0 from '!items!yVN7PZw35iIaBl0H' @ 50 : 1 .. '!items!yVN7PZw35iIaBl0H' @ 0 : 0; will stop at (end)
|
|
||||||
|
|||||||
@@ -1,4 +1,7 @@
|
|||||||
2026/06/01-22:35:11.800364 7f52c53fc6c0 Log #21: 0 ops saved to Table #22 OK
|
2026/06/10-16:17:31.547590 7f2fcffff6c0 Recovering log #34
|
||||||
2026/06/01-22:35:11.800471 7f52c53fc6c0 Archiving /home/morr/foundry/foundrydata-dev/Data/systems/fvtt-chroniques-de-l-etrange/packs/cde-spells/000021.log: OK
|
2026/06/10-16:17:31.557499 7f2fcffff6c0 Delete type=3 #32
|
||||||
2026/06/01-22:35:11.801036 7f52c53fc6c0 Table #10: 25 entries OK
|
2026/06/10-16:17:31.557521 7f2fcffff6c0 Delete type=0 #34
|
||||||
2026/06/01-22:35:11.805168 7f52c53fc6c0 **** Repaired leveldb /home/morr/foundry/foundrydata-dev/Data/systems/fvtt-chroniques-de-l-etrange/packs/cde-spells; recovered 1 files; 124022 bytes. Some data may have been lost. ****
|
2026/06/10-16:19:32.804540 7f2fce7fc6c0 Level-0 table #39: started
|
||||||
|
2026/06/10-16:19:32.804579 7f2fce7fc6c0 Level-0 table #39: 0 bytes OK
|
||||||
|
2026/06/10-16:19:32.811731 7f2fce7fc6c0 Delete type=0 #37
|
||||||
|
2026/06/10-16:19:32.830682 7f2fce7fc6c0 Manual compaction at level-0 from '!items!2f51pcvFkcZjaxDk' @ 72057594037927935 : 1 .. '!items!yVN7PZw35iIaBl0H' @ 0 : 0; will stop at (end)
|
||||||
|
|||||||
Binary file not shown.
Binary file not shown.
@@ -1 +1 @@
|
|||||||
MANIFEST-000023
|
MANIFEST-000040
|
||||||
|
|||||||
@@ -1,11 +1,7 @@
|
|||||||
2026/06/01-22:35:11.836158 7f52c63fe6c0 Delete type=3 #1
|
2026/06/10-16:26:13.188966 7f2fcf7fe6c0 Recovering log #38
|
||||||
2026/06/01-22:35:50.943540 7f52c4bfb6c0 Level-0 table #26: started
|
2026/06/10-16:26:13.198881 7f2fcf7fe6c0 Delete type=3 #36
|
||||||
2026/06/01-22:35:50.943578 7f52c4bfb6c0 Level-0 table #26: 0 bytes OK
|
2026/06/10-16:26:13.198898 7f2fcf7fe6c0 Delete type=0 #38
|
||||||
2026/06/01-22:35:50.949973 7f52c4bfb6c0 Delete type=0 #24
|
2026/06/10-16:29:53.710145 7f2fce7fc6c0 Level-0 table #43: started
|
||||||
2026/06/01-22:35:50.972693 7f52c4bfb6c0 Manual compaction at level-0 from '!items!APN91pQL0NBfZsG7' @ 72057594037927935 : 1 .. '!items!xxZKGqDVxAfr140W' @ 0 : 0; will stop at '!items!xxZKGqDVxAfr140W' @ 32 : 1
|
2026/06/10-16:29:53.710176 7f2fce7fc6c0 Level-0 table #43: 0 bytes OK
|
||||||
2026/06/01-22:35:50.972702 7f52c4bfb6c0 Compacting 1@0 + 0@1 files
|
2026/06/10-16:29:53.716550 7f2fce7fc6c0 Delete type=0 #41
|
||||||
2026/06/01-22:35:50.976827 7f52c4bfb6c0 Generated table #27@0: 16 keys, 8790 bytes
|
2026/06/10-16:29:53.735590 7f2fce7fc6c0 Manual compaction at level-0 from '!items!APN91pQL0NBfZsG7' @ 72057594037927935 : 1 .. '!items!xxZKGqDVxAfr140W' @ 0 : 0; will stop at (end)
|
||||||
2026/06/01-22:35:50.976844 7f52c4bfb6c0 Compacted 1@0 + 0@1 files => 8790 bytes
|
|
||||||
2026/06/01-22:35:50.982579 7f52c4bfb6c0 compacted to: files[ 0 1 0 0 0 0 0 ]
|
|
||||||
2026/06/01-22:35:50.982676 7f52c4bfb6c0 Delete type=2 #10
|
|
||||||
2026/06/01-22:35:51.004221 7f52c4bfb6c0 Manual compaction at level-0 from '!items!xxZKGqDVxAfr140W' @ 32 : 1 .. '!items!xxZKGqDVxAfr140W' @ 0 : 0; will stop at (end)
|
|
||||||
|
|||||||
@@ -1,4 +1,7 @@
|
|||||||
2026/06/01-22:35:11.821755 7f52c63fe6c0 Log #21: 0 ops saved to Table #22 OK
|
2026/06/10-16:17:31.558759 7f2fcf7fe6c0 Recovering log #34
|
||||||
2026/06/01-22:35:11.821828 7f52c63fe6c0 Archiving /home/morr/foundry/foundrydata-dev/Data/systems/fvtt-chroniques-de-l-etrange/packs/cde-supernaturals/000021.log: OK
|
2026/06/10-16:17:31.567443 7f2fcf7fe6c0 Delete type=3 #32
|
||||||
2026/06/01-22:35:11.821868 7f52c63fe6c0 Table #10: 16 entries OK
|
2026/06/10-16:17:31.567462 7f2fcf7fe6c0 Delete type=0 #34
|
||||||
2026/06/01-22:35:11.824849 7f52c63fe6c0 **** Repaired leveldb /home/morr/foundry/foundrydata-dev/Data/systems/fvtt-chroniques-de-l-etrange/packs/cde-supernaturals; recovered 1 files; 8790 bytes. Some data may have been lost. ****
|
2026/06/10-16:19:32.830760 7f2fce7fc6c0 Level-0 table #39: started
|
||||||
|
2026/06/10-16:19:32.830772 7f2fce7fc6c0 Level-0 table #39: 0 bytes OK
|
||||||
|
2026/06/10-16:19:32.836446 7f2fce7fc6c0 Delete type=0 #37
|
||||||
|
2026/06/10-16:19:32.855647 7f2fce7fc6c0 Manual compaction at level-0 from '!items!APN91pQL0NBfZsG7' @ 72057594037927935 : 1 .. '!items!xxZKGqDVxAfr140W' @ 0 : 0; will stop at (end)
|
||||||
|
|||||||
Binary file not shown.
Binary file not shown.
@@ -1 +1 @@
|
|||||||
MANIFEST-000023
|
MANIFEST-000040
|
||||||
|
|||||||
+7
-11
@@ -1,11 +1,7 @@
|
|||||||
2026/06/01-22:35:11.855333 7f52c53fc6c0 Delete type=3 #1
|
2026/06/10-16:26:13.200233 7f2fcffff6c0 Recovering log #38
|
||||||
2026/06/01-22:35:50.956960 7f52c4bfb6c0 Level-0 table #26: started
|
2026/06/10-16:26:13.210096 7f2fcffff6c0 Delete type=3 #36
|
||||||
2026/06/01-22:35:50.956991 7f52c4bfb6c0 Level-0 table #26: 0 bytes OK
|
2026/06/10-16:26:13.210116 7f2fcffff6c0 Delete type=0 #38
|
||||||
2026/06/01-22:35:50.962751 7f52c4bfb6c0 Delete type=0 #24
|
2026/06/10-16:29:53.723688 7f2fce7fc6c0 Level-0 table #43: started
|
||||||
2026/06/01-22:35:50.994960 7f52c4bfb6c0 Manual compaction at level-0 from '!items!2IYbyCPF9LJojzsj' @ 72057594037927935 : 1 .. '!items!uOpWyMGK3oiUJ1Sl' @ 0 : 0; will stop at '!items!uOpWyMGK3oiUJ1Sl' @ 30 : 1
|
2026/06/10-16:29:53.723697 7f2fce7fc6c0 Level-0 table #43: 0 bytes OK
|
||||||
2026/06/01-22:35:50.994966 7f52c4bfb6c0 Compacting 1@0 + 0@1 files
|
2026/06/10-16:29:53.729865 7f2fce7fc6c0 Delete type=0 #41
|
||||||
2026/06/01-22:35:50.998285 7f52c4bfb6c0 Generated table #27@0: 15 keys, 4529 bytes
|
2026/06/10-16:29:53.735599 7f2fce7fc6c0 Manual compaction at level-0 from '!items!2IYbyCPF9LJojzsj' @ 72057594037927935 : 1 .. '!items!uOpWyMGK3oiUJ1Sl' @ 0 : 0; will stop at (end)
|
||||||
2026/06/01-22:35:50.998300 7f52c4bfb6c0 Compacted 1@0 + 0@1 files => 4529 bytes
|
|
||||||
2026/06/01-22:35:51.004081 7f52c4bfb6c0 compacted to: files[ 0 1 0 0 0 0 0 ]
|
|
||||||
2026/06/01-22:35:51.004146 7f52c4bfb6c0 Delete type=2 #10
|
|
||||||
2026/06/01-22:35:51.004357 7f52c4bfb6c0 Manual compaction at level-0 from '!items!uOpWyMGK3oiUJ1Sl' @ 30 : 1 .. '!items!uOpWyMGK3oiUJ1Sl' @ 0 : 0; will stop at (end)
|
|
||||||
|
|||||||
@@ -1,4 +1,7 @@
|
|||||||
2026/06/01-22:35:11.839235 7f52c53fc6c0 Log #21: 0 ops saved to Table #22 OK
|
2026/06/10-16:17:31.568388 7f2fceffd6c0 Recovering log #34
|
||||||
2026/06/01-22:35:11.839283 7f52c53fc6c0 Archiving /home/morr/foundry/foundrydata-dev/Data/systems/fvtt-chroniques-de-l-etrange/packs/cde-weapons/000021.log: OK
|
2026/06/10-16:17:31.577902 7f2fceffd6c0 Delete type=3 #32
|
||||||
2026/06/01-22:35:11.839312 7f52c53fc6c0 Table #10: 15 entries OK
|
2026/06/10-16:17:31.577924 7f2fceffd6c0 Delete type=0 #34
|
||||||
2026/06/01-22:35:11.842894 7f52c53fc6c0 **** Repaired leveldb /home/morr/foundry/foundrydata-dev/Data/systems/fvtt-chroniques-de-l-etrange/packs/cde-weapons; recovered 1 files; 4529 bytes. Some data may have been lost. ****
|
2026/06/10-16:19:32.824041 7f2fce7fc6c0 Level-0 table #39: started
|
||||||
|
2026/06/10-16:19:32.824056 7f2fce7fc6c0 Level-0 table #39: 0 bytes OK
|
||||||
|
2026/06/10-16:19:32.830626 7f2fce7fc6c0 Delete type=0 #37
|
||||||
|
2026/06/10-16:19:32.830702 7f2fce7fc6c0 Manual compaction at level-0 from '!items!2IYbyCPF9LJojzsj' @ 72057594037927935 : 1 .. '!items!uOpWyMGK3oiUJ1Sl' @ 0 : 0; will stop at (end)
|
||||||
|
|||||||
Binary file not shown.
Binary file not shown.
@@ -801,18 +801,20 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "Revolver Glock 17, munitions à têtes en bois de saule (dégâts 3, distance longue)",
|
"name": "Revolver Glock 17, munitions à têtes en bois de saule (dégâts 3, distance longue)",
|
||||||
"type": "item",
|
"type": "weapon",
|
||||||
"_id": "nyLUo3lMYKVNohQj",
|
"_id": "nyLUo3lMYKVNohQj",
|
||||||
"img": "https://assets.forge-vtt.com/630dd9fa56bd61d804eb1dec/systems/chroniquesdeletrange/images/jetons/aides_de_jeu/jetons_technologie/pistol-gun.png",
|
"img": "https://assets.forge-vtt.com/630dd9fa56bd61d804eb1dec/systems/chroniquesdeletrange/images/jetons/aides_de_jeu/jetons_technologie/pistol-gun.png",
|
||||||
"system": {
|
"system": {
|
||||||
"subtype": "weapon",
|
|
||||||
"reference": "",
|
"reference": "",
|
||||||
"description": "<p> Revolver Glock 17, munitions à têtes en bois de saule (dégâts 3, distance longue)</p>",
|
"description": "<p> Revolver Glock 17, munitions à têtes en bois de saule (dégâts 3, distance longue)</p>",
|
||||||
"quantity": 1,
|
"weaponType": "firearm",
|
||||||
"weight": 0,
|
"material": "",
|
||||||
"protection": "",
|
"damageAspect": "feu",
|
||||||
"damage": "3",
|
"damageBase": 0,
|
||||||
"range": "longue",
|
"range": "longue",
|
||||||
|
"obtainLevel": 0,
|
||||||
|
"obtainDifficulty": 0,
|
||||||
|
"quantity": 1,
|
||||||
"notes": ""
|
"notes": ""
|
||||||
},
|
},
|
||||||
"effects": [],
|
"effects": [],
|
||||||
|
|||||||
@@ -762,13 +762,19 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "Revolver Glock 17, munitions à têtes en bois de saule (dégâts 3, distance longue)",
|
"name": "Revolver Glock 17, munitions à têtes en bois de saule (dégâts 3, distance longue)",
|
||||||
"type": "item",
|
"type": "weapon",
|
||||||
"img": "https://assets.forge-vtt.com/630dd9fa56bd61d804eb1dec/systems/chroniquesdeletrange/images/jetons/aides_de_jeu/jetons_technologie/pistol-gun.png",
|
"img": "https://assets.forge-vtt.com/630dd9fa56bd61d804eb1dec/systems/chroniquesdeletrange/images/jetons/aides_de_jeu/jetons_technologie/pistol-gun.png",
|
||||||
"system": {
|
"system": {
|
||||||
"reference": "",
|
"reference": "",
|
||||||
"description": "<p> Revolver Glock 17, munitions à têtes en bois de saule (dégâts 3, distance longue)</p>",
|
"description": "<p> Revolver Glock 17, munitions à têtes en bois de saule (dégâts 3, distance longue)</p>",
|
||||||
|
"weaponType": "firearm",
|
||||||
|
"material": "",
|
||||||
|
"damageAspect": "feu",
|
||||||
|
"damageBase": 0,
|
||||||
|
"range": "longue",
|
||||||
|
"obtainLevel": 0,
|
||||||
|
"obtainDifficulty": 0,
|
||||||
"quantity": 1,
|
"quantity": 1,
|
||||||
"weight": 0,
|
|
||||||
"notes": ""
|
"notes": ""
|
||||||
},
|
},
|
||||||
"_id": "W6uaY31VuCSetszi",
|
"_id": "W6uaY31VuCSetszi",
|
||||||
|
|||||||
@@ -863,13 +863,19 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "Pistolet LDB à cartouches alchimiques (et 3 fioles adaptées)",
|
"name": "Pistolet LDB à cartouches alchimiques (et 3 fioles adaptées)",
|
||||||
"type": "item",
|
"type": "weapon",
|
||||||
"img": "",
|
"img": "",
|
||||||
"system": {
|
"system": {
|
||||||
"reference": "",
|
"reference": "",
|
||||||
"description": "<p>Pistolet LDB à cartouches alchimiques (et 3 fioles adaptées) – dégâts 2+, distance longue</p>",
|
"description": "<p>Pistolet LDB à cartouches alchimiques (et 3 fioles adaptées) – dégâts 2+, distance longue</p>",
|
||||||
|
"weaponType": "firearm",
|
||||||
|
"material": "",
|
||||||
|
"damageAspect": "feu",
|
||||||
|
"damageBase": 0,
|
||||||
|
"range": "longue",
|
||||||
|
"obtainLevel": 0,
|
||||||
|
"obtainDifficulty": 0,
|
||||||
"quantity": 1,
|
"quantity": 1,
|
||||||
"weight": 0,
|
|
||||||
"notes": ""
|
"notes": ""
|
||||||
},
|
},
|
||||||
"_id": "vW6xY8zA0bC2dE4fG6hI8jK0",
|
"_id": "vW6xY8zA0bC2dE4fG6hI8jK0",
|
||||||
|
|||||||
@@ -801,13 +801,19 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "Pistolet dissimulé et un chargeur rempli de balles en argent gravées d'idéogrammes rituels (dégâts 2)",
|
"name": "Pistolet dissimulé et un chargeur rempli de balles en argent gravées d'idéogrammes rituels (dégâts 2)",
|
||||||
"type": "item",
|
"type": "weapon",
|
||||||
"img": "",
|
"img": "",
|
||||||
"system": {
|
"system": {
|
||||||
"reference": "",
|
"reference": "",
|
||||||
"description": "<p>Pistolet dissimulé et un chargeur rempli de balles en argent gravées d'idéogrammes rituels (dégâts 2)</p>",
|
"description": "<p>Pistolet dissimulé et un chargeur rempli de balles en argent gravées d'idéogrammes rituels (dégâts 2)</p>",
|
||||||
|
"weaponType": "firearm",
|
||||||
|
"material": "",
|
||||||
|
"damageAspect": "feu",
|
||||||
|
"damageBase": 0,
|
||||||
|
"range": "longue",
|
||||||
|
"obtainLevel": 0,
|
||||||
|
"obtainDifficulty": 0,
|
||||||
"quantity": 1,
|
"quantity": 1,
|
||||||
"weight": 0,
|
|
||||||
"notes": ""
|
"notes": ""
|
||||||
},
|
},
|
||||||
"_id": "v6B5n4M3l2K1j0H9",
|
"_id": "v6B5n4M3l2K1j0H9",
|
||||||
|
|||||||
@@ -762,13 +762,19 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "7 poignards ornés d'or et de jade (dégâts 2+Eau(4) avec Hei Yin)",
|
"name": "7 poignards ornés d'or et de jade (dégâts 2+Eau(4) avec Hei Yin)",
|
||||||
"type": "item",
|
"type": "weapon",
|
||||||
"img": "",
|
"img": "",
|
||||||
"system": {
|
"system": {
|
||||||
"reference": "",
|
"reference": "",
|
||||||
"description": "<p>7 poignards ornés d'or et de jade (dégâts 2+Eau(4) avec Hei Yin)</p>",
|
"description": "<p>7 poignards ornés d'or et de jade (dégâts 2+Eau(4) avec Hei Yin)</p>",
|
||||||
|
"weaponType": "melee",
|
||||||
|
"material": "",
|
||||||
|
"damageAspect": "metal",
|
||||||
|
"damageBase": 2,
|
||||||
|
"range": "contact",
|
||||||
|
"obtainLevel": 0,
|
||||||
|
"obtainDifficulty": 0,
|
||||||
"quantity": 1,
|
"quantity": 1,
|
||||||
"weight": 0,
|
|
||||||
"notes": ""
|
"notes": ""
|
||||||
},
|
},
|
||||||
"_id": "OllJUo8Qbq",
|
"_id": "OllJUo8Qbq",
|
||||||
|
|||||||
@@ -756,13 +756,19 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "Arc composite de très bonne qualité et 20 flèches artisanales (dégâts 2, distance longue)",
|
"name": "Arc composite de très bonne qualité et 20 flèches artisanales (dégâts 2, distance longue)",
|
||||||
"type": "item",
|
"type": "weapon",
|
||||||
"img": "https://assets.forge-vtt.com/630dd9fa56bd61d804eb1dec/systems/chroniquesdeletrange/images/jetons/aides_de_jeu/jetons_technologie/bow.png",
|
"img": "https://assets.forge-vtt.com/630dd9fa56bd61d804eb1dec/systems/chroniquesdeletrange/images/jetons/aides_de_jeu/jetons_technologie/bow.png",
|
||||||
"system": {
|
"system": {
|
||||||
"reference": "",
|
"reference": "",
|
||||||
"description": "<p>Arc composite de très bonne qualité et 20 flèches artisanales (dégâts 2, distance longue)</p>",
|
"description": "<p>Arc composite de très bonne qualité et 20 flèches artisanales (dégâts 2, distance longue)</p>",
|
||||||
|
"weaponType": "ranged",
|
||||||
|
"material": "",
|
||||||
|
"damageAspect": "terre",
|
||||||
|
"damageBase": 0,
|
||||||
|
"range": "longue",
|
||||||
|
"obtainLevel": 0,
|
||||||
|
"obtainDifficulty": 0,
|
||||||
"quantity": 1,
|
"quantity": 1,
|
||||||
"weight": 0,
|
|
||||||
"notes": ""
|
"notes": ""
|
||||||
},
|
},
|
||||||
"_id": "aRcCoMpOsItE01",
|
"_id": "aRcCoMpOsItE01",
|
||||||
|
|||||||
@@ -28,6 +28,7 @@ export function preLocalizeConfig() {
|
|||||||
magic.aspectlabel = game.i18n.localize(magic.aspectlabel)
|
magic.aspectlabel = game.i18n.localize(magic.aspectlabel)
|
||||||
Object.values(magic.speciality).forEach((spec) => {
|
Object.values(magic.speciality).forEach((spec) => {
|
||||||
spec.label = game.i18n.localize(spec.label)
|
spec.label = game.i18n.localize(spec.label)
|
||||||
|
spec.labelelementkey = spec.labelelement
|
||||||
spec.labelelement = game.i18n.localize(spec.labelelement)
|
spec.labelelement = game.i18n.localize(spec.labelelement)
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -41,6 +41,21 @@ export function registerSettings() {
|
|||||||
},
|
},
|
||||||
})
|
})
|
||||||
|
|
||||||
|
game.settings.register(SYSTEM_ID, "loksyuConsumptionOrder", {
|
||||||
|
name: "CDE.Settings.LoksyuConsumptionOrder",
|
||||||
|
hint: "CDE.Settings.LoksyuConsumptionOrderHint",
|
||||||
|
scope: "world",
|
||||||
|
config: true,
|
||||||
|
type: String,
|
||||||
|
choices: {
|
||||||
|
"yang-first": "CDE.Settings.LoksyuOrderYangFirst",
|
||||||
|
"yin-first": "CDE.Settings.LoksyuOrderYinFirst",
|
||||||
|
"balanced": "CDE.Settings.LoksyuOrderBalanced",
|
||||||
|
},
|
||||||
|
default: "yang-first",
|
||||||
|
onChange: () => Hooks.callAll("cde:loksyuUpdated"),
|
||||||
|
})
|
||||||
|
|
||||||
game.settings.register(SYSTEM_ID, "tinjiData", {
|
game.settings.register(SYSTEM_ID, "tinjiData", {
|
||||||
scope: "world",
|
scope: "world",
|
||||||
config: false,
|
config: false,
|
||||||
|
|||||||
@@ -122,9 +122,8 @@ export default class CharacterDataModel extends foundry.abstract.TypeDataModel {
|
|||||||
typeofthrow: numberField(0),
|
typeofthrow: numberField(0),
|
||||||
aspectskill: numberField(0),
|
aspectskill: numberField(0),
|
||||||
bonusmalusskill: numberField(0),
|
bonusmalusskill: numberField(0),
|
||||||
aspectspeciality: numberField(0),
|
|
||||||
rolldifficulty: numberField(0),
|
rolldifficulty: numberField(0),
|
||||||
bonusmalusspeciality: numberField(0),
|
freepowerlevels: numberField(0),
|
||||||
}),
|
}),
|
||||||
}),
|
}),
|
||||||
aspect: new fields.SchemaField({
|
aspect: new fields.SchemaField({
|
||||||
@@ -163,6 +162,10 @@ export default class CharacterDataModel extends foundry.abstract.TypeDataModel {
|
|||||||
nine: componentField(),
|
nine: componentField(),
|
||||||
zero: componentField(),
|
zero: componentField(),
|
||||||
}),
|
}),
|
||||||
|
magicOrder: new fields.ArrayField(
|
||||||
|
new fields.StringField({ required: true, nullable: false, initial: "" }),
|
||||||
|
{ required: true, initial: [] }
|
||||||
|
),
|
||||||
magics: new fields.SchemaField({
|
magics: new fields.SchemaField({
|
||||||
internalcinnabar: magicField(),
|
internalcinnabar: magicField(),
|
||||||
alchemy: magicField(),
|
alchemy: magicField(),
|
||||||
|
|||||||
@@ -25,7 +25,7 @@ export default class ArmorDataModel extends foundry.abstract.TypeDataModel {
|
|||||||
domain: stringField(""),
|
domain: stringField(""),
|
||||||
obtainLevel: intField(0, { min: 0, max: 5 }),
|
obtainLevel: intField(0, { min: 0, max: 5 }),
|
||||||
obtainDifficulty: intField(0, { min: 0, max: 3 }),
|
obtainDifficulty: intField(0, { min: 0, max: 3 }),
|
||||||
quantity: intField(1),
|
quantity: intField(1, { min: 0 }),
|
||||||
notes: htmlField(""),
|
notes: htmlField(""),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -24,7 +24,7 @@ export default class IngredientDataModel extends foundry.abstract.TypeDataModel
|
|||||||
school: stringField("all"),
|
school: stringField("all"),
|
||||||
obtainLevel: intField(0, { min: 0, max: 5 }),
|
obtainLevel: intField(0, { min: 0, max: 5 }),
|
||||||
obtainDifficulty: intField(0, { min: 0, max: 3 }),
|
obtainDifficulty: intField(0, { min: 0, max: 3 }),
|
||||||
quantity: intField(1),
|
quantity: intField(1, { min: 0 }),
|
||||||
notes: htmlField(""),
|
notes: htmlField(""),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -30,7 +30,7 @@ export default class KungfuDataModel extends foundry.abstract.TypeDataModel {
|
|||||||
reference: stringField(""),
|
reference: stringField(""),
|
||||||
description: htmlField(""),
|
description: htmlField(""),
|
||||||
orientation: stringField("yin"), // yin | yang | yinyang
|
orientation: stringField("yin"), // yin | yang | yinyang
|
||||||
aspect: stringField("metal"), // metal | eau | terre | feu | bois
|
aspect: stringField("metal"), // metal | water | earth | fire | wood
|
||||||
skill: stringField("kungfu"), // kungfu | rangedcombat
|
skill: stringField("kungfu"), // kungfu | rangedcombat
|
||||||
speciality: stringField(""),
|
speciality: stringField(""),
|
||||||
style: stringField(""),
|
style: stringField(""),
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ export default class SpellDataModel extends foundry.abstract.TypeDataModel {
|
|||||||
reference: stringField(""),
|
reference: stringField(""),
|
||||||
description: htmlField(""),
|
description: htmlField(""),
|
||||||
specialityname: stringField(""),
|
specialityname: stringField(""),
|
||||||
associatedelement: stringField("metal"), // metal | eau | terre | feu | bois
|
associatedelement: stringField("metal"), // metal | water | earth | fire | wood
|
||||||
hei: stringField(""),
|
hei: stringField(""),
|
||||||
realizationtimeritual: stringField(""),
|
realizationtimeritual: stringField(""),
|
||||||
realizationtimeaccelerated: stringField(""),
|
realizationtimeaccelerated: stringField(""),
|
||||||
|
|||||||
@@ -17,18 +17,20 @@ export default class WeaponDataModel extends foundry.abstract.TypeDataModel {
|
|||||||
const stringField = (initial = "") => new fields.StringField({ required: true, nullable: false, initial })
|
const stringField = (initial = "") => new fields.StringField({ required: true, nullable: false, initial })
|
||||||
const htmlField = (initial = "") => new fields.HTMLField({ required: true, nullable: false, initial, textSearch: true })
|
const htmlField = (initial = "") => new fields.HTMLField({ required: true, nullable: false, initial, textSearch: true })
|
||||||
const intField = (initial = 0, opts = {}) => new fields.NumberField({ required: true, nullable: false, integer: true, initial, ...opts })
|
const intField = (initial = 0, opts = {}) => new fields.NumberField({ required: true, nullable: false, integer: true, initial, ...opts })
|
||||||
|
const boolField = (initial = false) => new fields.BooleanField({ required: true, initial })
|
||||||
|
|
||||||
return {
|
return {
|
||||||
reference: stringField(""),
|
reference: stringField(""),
|
||||||
description: htmlField(""),
|
description: htmlField(""),
|
||||||
|
hasSpeciality: boolField(false),
|
||||||
weaponType: stringField("melee"),
|
weaponType: stringField("melee"),
|
||||||
material: stringField(""),
|
material: stringField(""),
|
||||||
damageAspect: stringField("metal"),
|
damageAspect: stringField("metal"),
|
||||||
damageBase: intField(1),
|
damageBase: intField(0),
|
||||||
range: stringField("contact"), // contact | courte | mediane | longue | extreme
|
range: stringField("contact"), // contact | courte | mediane | longue | extreme
|
||||||
obtainLevel: intField(0, { min: 0, max: 5 }),
|
obtainLevel: intField(0, { min: 0, max: 5 }),
|
||||||
obtainDifficulty: intField(0, { min: 0, max: 3 }),
|
obtainDifficulty: intField(0, { min: 0, max: 3 }),
|
||||||
quantity: intField(1),
|
quantity: intField(1, { min: 0 }),
|
||||||
notes: htmlField(""),
|
notes: htmlField(""),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -31,7 +31,9 @@ export class CDECombat extends Combat {
|
|||||||
* for each selected combatant, then sync the result to the Combatant document.
|
* for each selected combatant, then sync the result to the Combatant document.
|
||||||
*/
|
*/
|
||||||
async rollInitiative(ids, options = {}) {
|
async rollInitiative(ids, options = {}) {
|
||||||
const combatantIds = typeof ids === "string" ? [ids] : ids
|
const combatantIds = ids
|
||||||
|
? (typeof ids === "string" ? [ids] : ids)
|
||||||
|
: this.combatants.map(c => c.id)
|
||||||
for (const id of combatantIds) {
|
for (const id of combatantIds) {
|
||||||
const combatant = this.combatants.get(id)
|
const combatant = this.combatants.get(id)
|
||||||
if (!combatant) continue
|
if (!combatant) continue
|
||||||
|
|||||||
+12
-1
@@ -35,7 +35,18 @@ import { showWelcomeMessage, injectWelcomeActions } from "./ui/apps/welcome.js"
|
|||||||
Hooks.once("i18nInit", preLocalizeConfig)
|
Hooks.once("i18nInit", preLocalizeConfig)
|
||||||
|
|
||||||
Hooks.once("init", async () => {
|
Hooks.once("init", async () => {
|
||||||
console.info(`CHRONIQUESDELETRANGE | Initializing ${SYSTEM_ID}`)
|
console.log(
|
||||||
|
"%c╔══════════════════════════════════════════════════════════╗\n" +
|
||||||
|
"%c║ Chroniques de l'Étrange — FoundryVTT ║\n" +
|
||||||
|
"%c║ Système de jeu par Antre-Monde Éditions ║\n" +
|
||||||
|
"%c║ Made by Uberwald - https://www.ubwerwald.me ║\n" +
|
||||||
|
"%c╚══════════════════════════════════════════════════════════╝",
|
||||||
|
"color: #d4af37; font-weight: bold;",
|
||||||
|
"color: #e2e8f4;",
|
||||||
|
"color: #7d94b8;",
|
||||||
|
"color: #5a7a9a;",
|
||||||
|
"color: #d4af37; font-weight: bold;",
|
||||||
|
)
|
||||||
|
|
||||||
registerSettings()
|
registerSettings()
|
||||||
|
|
||||||
|
|||||||
@@ -105,7 +105,7 @@ export class CDETinjiApp extends foundry.applications.api.HandlebarsApplicationM
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
await setTinjiValue(current - 1)
|
await setTinjiValue(current - 1)
|
||||||
ChatMessage.create({
|
await ChatMessage.create({
|
||||||
user: game.user.id,
|
user: game.user.id,
|
||||||
content: `<div class="cde-tinji-spend-msg">
|
content: `<div class="cde-tinji-spend-msg">
|
||||||
<i class="fas fa-star"></i>
|
<i class="fas fa-star"></i>
|
||||||
|
|||||||
+16
-4
@@ -133,9 +133,21 @@ async function _drawFromLoksyu(message, aspect, type, aspectLabel) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// Remove 1 die (prefer yang first)
|
// Remove 1 die according to the consumption order setting
|
||||||
|
const order = game.settings.get(SYSTEM_ID, "loksyuConsumptionOrder")
|
||||||
|
if (order === "yin-first") {
|
||||||
|
if (entry.yin > 0) entry.yin--
|
||||||
|
else entry.yang--
|
||||||
|
} else if (order === "balanced") {
|
||||||
|
if (entry.yin > entry.yang) entry.yin--
|
||||||
|
else if (entry.yang > entry.yin) entry.yang--
|
||||||
|
else if (entry.yang > 0) entry.yang--
|
||||||
|
else entry.yin--
|
||||||
|
} else {
|
||||||
|
// yang-first (default)
|
||||||
if (entry.yang > 0) entry.yang--
|
if (entry.yang > 0) entry.yang--
|
||||||
else entry.yin--
|
else entry.yin--
|
||||||
|
}
|
||||||
data[aspect] = entry
|
data[aspect] = entry
|
||||||
await setLoksyuData(data)
|
await setLoksyuData(data)
|
||||||
|
|
||||||
@@ -147,7 +159,7 @@ async function _drawFromLoksyu(message, aspect, type, aspectLabel) {
|
|||||||
updated.successesdice = (updated.successesdice ?? 0) + 1
|
updated.successesdice = (updated.successesdice ?? 0) + 1
|
||||||
updated.loksyuBonusSuc = (updated.loksyuBonusSuc ?? 0) + 1
|
updated.loksyuBonusSuc = (updated.loksyuBonusSuc ?? 0) + 1
|
||||||
// Recalculate weapon damage if applicable
|
// Recalculate weapon damage if applicable
|
||||||
if (updated.damageBase) updated.totalDamage = updated.successesdice * updated.damageBase
|
if (updated.damageBase != null) updated.totalDamage = updated.damageBase + (updated.damageAspectValue ?? 0)
|
||||||
} else {
|
} else {
|
||||||
updated.auspiciousdice = (updated.auspiciousdice ?? 0) + 1
|
updated.auspiciousdice = (updated.auspiciousdice ?? 0) + 1
|
||||||
updated.loksyuBonusFaste = (updated.loksyuBonusFaste ?? 0) + 1
|
updated.loksyuBonusFaste = (updated.loksyuBonusFaste ?? 0) + 1
|
||||||
@@ -165,7 +177,7 @@ async function _drawFromLoksyu(message, aspect, type, aspectLabel) {
|
|||||||
? game.i18n.localize("CDE.Successes")
|
? game.i18n.localize("CDE.Successes")
|
||||||
: game.i18n.localize("CDE.AuspiciousDie")
|
: game.i18n.localize("CDE.AuspiciousDie")
|
||||||
|
|
||||||
ChatMessage.create({
|
await ChatMessage.create({
|
||||||
user: game.user.id,
|
user: game.user.id,
|
||||||
content: `<div class="cde-loksyu-draw-msg">
|
content: `<div class="cde-loksyu-draw-msg">
|
||||||
<div class="cde-loksyu-draw-header">
|
<div class="cde-loksyu-draw-header">
|
||||||
@@ -195,7 +207,7 @@ async function _spendTinjiPostRoll() {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
await setTinjiValue(current - 1)
|
await setTinjiValue(current - 1)
|
||||||
ChatMessage.create({
|
await ChatMessage.create({
|
||||||
user: game.user.id,
|
user: game.user.id,
|
||||||
content: `<div class="cde-tinji-spend-msg">
|
content: `<div class="cde-tinji-spend-msg">
|
||||||
<span class="cde-tinji-icon">天</span>
|
<span class="cde-tinji-icon">天</span>
|
||||||
|
|||||||
+54
-46
@@ -168,15 +168,12 @@ async function showMagicPrompt(params) {
|
|||||||
aspectskill: Number(params.aspectskill ?? 0),
|
aspectskill: Number(params.aspectskill ?? 0),
|
||||||
bonusmalusskill: params.bonusmalusskill ?? 0,
|
bonusmalusskill: params.bonusmalusskill ?? 0,
|
||||||
bonusauspiciousdice: params.bonusauspiciousdice ?? 0,
|
bonusauspiciousdice: params.bonusauspiciousdice ?? 0,
|
||||||
aspectspeciality: Number(params.aspectspeciality ?? 0),
|
|
||||||
rolldifficulty: params.rolldifficulty ?? 1,
|
rolldifficulty: params.rolldifficulty ?? 1,
|
||||||
bonusmalusspeciality: params.bonusmalusspeciality ?? 0,
|
freepowerlevels: params.freepowerlevels ?? 0,
|
||||||
heispend: params.heispend ?? 0,
|
|
||||||
typeofthrow: Number(params.typeofthrow ?? 0),
|
typeofthrow: Number(params.typeofthrow ?? 0),
|
||||||
},
|
},
|
||||||
fields: ["aspectskill", "bonusmalusskill", "bonusauspiciousdice",
|
fields: ["aspectskill", "bonusmalusskill", "bonusauspiciousdice",
|
||||||
"aspectspeciality", "rolldifficulty", "bonusmalusspeciality",
|
"rolldifficulty", "freepowerlevels", "typeofthrow"],
|
||||||
"heispend", "typeofthrow"],
|
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -193,7 +190,7 @@ async function showWeaponPrompt(params) {
|
|||||||
weaponTypeLabel: params.weaponTypeLabel ?? "CDE.Weapon",
|
weaponTypeLabel: params.weaponTypeLabel ?? "CDE.Weapon",
|
||||||
weaponAspectIcon: params.weaponAspectIcon ?? "",
|
weaponAspectIcon: params.weaponAspectIcon ?? "",
|
||||||
weaponAspectLabel: params.weaponAspectLabel ?? "",
|
weaponAspectLabel: params.weaponAspectLabel ?? "",
|
||||||
damageBase: params.damageBase ?? 1,
|
damageBase: params.damageBase ?? 0,
|
||||||
weaponskill: params.weaponskill ?? "kungfu",
|
weaponskill: params.weaponskill ?? "kungfu",
|
||||||
aspect: Number(params.aspect ?? 0),
|
aspect: Number(params.aspect ?? 0),
|
||||||
effectiverange: params.effectiverange ?? "contact",
|
effectiverange: params.effectiverange ?? "contact",
|
||||||
@@ -318,7 +315,9 @@ export async function rollForActor(actor, rollKey) {
|
|||||||
const kfSkill = kfItem.system.skill ?? "kungfu"
|
const kfSkill = kfItem.system.skill ?? "kungfu"
|
||||||
numberofdice = sys.skills?.[kfSkill]?.value ?? 0
|
numberofdice = sys.skills?.[kfSkill]?.value ?? 0
|
||||||
title = `${kfItem.name} [${game.i18n.localize(sys.skills?.[kfSkill]?.label ?? "CDE.KungFu")}]`
|
title = `${kfItem.name} [${game.i18n.localize(sys.skills?.[kfSkill]?.label ?? "CDE.KungFu")}]`
|
||||||
kfDefaultAspect = ASPECT_NAMES.indexOf(kfItem.system.aspect ?? "metal")
|
const kfAspect = kfItem.system.aspect?.toLowerCase() ?? "metal"
|
||||||
|
const ASPECT_NORMALIZE = { eau: "water", terre: "earth", feu: "fire", bois: "wood" }
|
||||||
|
kfDefaultAspect = ASPECT_NAMES.indexOf(ASPECT_NORMALIZE[kfAspect] ?? kfAspect)
|
||||||
if (kfDefaultAspect < 0) kfDefaultAspect = 0
|
if (kfDefaultAspect < 0) kfDefaultAspect = 0
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
@@ -350,7 +349,7 @@ export async function rollForActor(actor, rollKey) {
|
|||||||
weaponTypeLabel: WEAPON_TYPE_LABELS[wpType] ?? "CDE.Weapon",
|
weaponTypeLabel: WEAPON_TYPE_LABELS[wpType] ?? "CDE.Weapon",
|
||||||
weaponAspectIcon: ASPECT_ICONS[ASPECT_NAMES[wpAspectIdx]] ?? "",
|
weaponAspectIcon: ASPECT_ICONS[ASPECT_NAMES[wpAspectIdx]] ?? "",
|
||||||
weaponAspectLabel: game.i18n.localize(ASPECT_LABELS[ASPECT_NAMES[wpAspectIdx]] ?? ""),
|
weaponAspectLabel: game.i18n.localize(ASPECT_LABELS[ASPECT_NAMES[wpAspectIdx]] ?? ""),
|
||||||
damageBase: wpItem.system.damageBase ?? 1,
|
damageBase: wpItem.system.damageBase ?? 0,
|
||||||
weaponskill: wpSkill,
|
weaponskill: wpSkill,
|
||||||
aspect: wpAspectIdx,
|
aspect: wpAspectIdx,
|
||||||
effectiverange: wpRange,
|
effectiverange: wpRange,
|
||||||
@@ -372,9 +371,11 @@ export async function rollForActor(actor, rollKey) {
|
|||||||
const wpWoundMalus = Number(wParams.woundmalus ?? 0)
|
const wpWoundMalus = Number(wParams.woundmalus ?? 0)
|
||||||
const wpBonusAusp = Number(wParams.bonusauspiciousdice ?? 0)
|
const wpBonusAusp = Number(wParams.bonusauspiciousdice ?? 0)
|
||||||
const wpThrowMode = Number(wParams.typeofthrow ?? 0)
|
const wpThrowMode = Number(wParams.typeofthrow ?? 0)
|
||||||
const wpDamageBase = wpItem.system.damageBase ?? 1
|
const wpDamageBase = wpItem.system.damageBase ?? 0
|
||||||
|
|
||||||
const wpTotalDice = wpSkillDice + wpAspectDice + wpRangeMalus + wpBonusMalus - wpWoundMalus
|
const wpSpecialtyBonus = wpItem.system.hasSpeciality ? 1 : 0
|
||||||
|
|
||||||
|
const wpTotalDice = wpSkillDice + wpAspectDice + wpRangeMalus + wpBonusMalus - wpWoundMalus + wpSpecialtyBonus
|
||||||
if (wpTotalDice <= 0) {
|
if (wpTotalDice <= 0) {
|
||||||
ui.notifications.warn(game.i18n.localize("CDE.Error0"))
|
ui.notifications.warn(game.i18n.localize("CDE.Error0"))
|
||||||
return
|
return
|
||||||
@@ -394,6 +395,13 @@ export async function rollForActor(actor, rollKey) {
|
|||||||
if (wpWoundMalus !== 0) wpModParts.push(`-${wpWoundMalus} ${game.i18n.localize("CDE.WoundMalus")}`)
|
if (wpWoundMalus !== 0) wpModParts.push(`-${wpWoundMalus} ${game.i18n.localize("CDE.WoundMalus")}`)
|
||||||
if (wpBonusAusp !== 0) wpModParts.push(`+${wpBonusAusp} ${game.i18n.localize("CDE.BonusAuspiciousDice")}`)
|
if (wpBonusAusp !== 0) wpModParts.push(`+${wpBonusAusp} ${game.i18n.localize("CDE.BonusAuspiciousDice")}`)
|
||||||
|
|
||||||
|
// Damage = character's aspect value (from weapon's damageAspect) + weapon base damage
|
||||||
|
const wpDamageAspectRaw = wpItem.system.damageAspect ?? "metal"
|
||||||
|
const wpDamageAspectIdx = WEAPON_ASPECT_INDEX[wpDamageAspectRaw] ?? 0
|
||||||
|
const wpDamageAspectName = ASPECT_NAMES[wpDamageAspectIdx]
|
||||||
|
const wpDamageAspectValue = sys.aspect?.[wpDamageAspectName]?.value ?? 0
|
||||||
|
const wpDamageAspectLabel = game.i18n.localize(ASPECT_LABELS[wpDamageAspectName] ?? "")
|
||||||
|
|
||||||
const wpMsg = await sendResultMessage(actor, {
|
const wpMsg = await sendResultMessage(actor, {
|
||||||
rollLabel: `${wpItem.name}`,
|
rollLabel: `${wpItem.name}`,
|
||||||
aspectName: wpAspectName,
|
aspectName: wpAspectName,
|
||||||
@@ -408,7 +416,9 @@ export async function rollForActor(actor, rollKey) {
|
|||||||
// weapon-specific
|
// weapon-specific
|
||||||
weaponName: wpItem.name,
|
weaponName: wpItem.name,
|
||||||
damageBase: wpDamageBase,
|
damageBase: wpDamageBase,
|
||||||
totalDamage: wpResults.successesdice * wpDamageBase,
|
damageAspectValue: wpDamageAspectValue,
|
||||||
|
damageAspectLabel: wpDamageAspectLabel,
|
||||||
|
totalDamage: wpDamageBase + wpDamageAspectValue,
|
||||||
...wpResults,
|
...wpResults,
|
||||||
aspect: wpAspectName,
|
aspect: wpAspectName,
|
||||||
d1: wpFaces[1], d2: wpFaces[2], d3: wpFaces[3], d4: wpFaces[4], d5: wpFaces[5],
|
d1: wpFaces[1], d2: wpFaces[2], d3: wpFaces[3], d4: wpFaces[4], d5: wpFaces[5],
|
||||||
@@ -416,7 +426,7 @@ export async function rollForActor(actor, rollKey) {
|
|||||||
}, wpRoll, ROLL_MODES[wpThrowMode] ?? "roll")
|
}, wpRoll, ROLL_MODES[wpThrowMode] ?? "roll")
|
||||||
|
|
||||||
if (game.modules.get("dice-so-nice")?.active && wpMsg?.id) {
|
if (game.modules.get("dice-so-nice")?.active && wpMsg?.id) {
|
||||||
await game.dice3d.waitFor3DAnimationByMessageID(wpMsg.id)
|
try { await game.dice3d.waitFor3DAnimationByMessageID(wpMsg.id) } catch (_e) { /* DSN not available */ }
|
||||||
}
|
}
|
||||||
// Auto-update Loksyu/TinJi singletons from weapon roll faces
|
// Auto-update Loksyu/TinJi singletons from weapon roll faces
|
||||||
if ((wpResults.loksyudice ?? 0) > 0) await updateLoksyuFromRoll(wpAspectName, wpFaces)
|
if ((wpResults.loksyudice ?? 0) > 0) await updateLoksyuFromRoll(wpAspectName, wpFaces)
|
||||||
@@ -428,8 +438,7 @@ export async function rollForActor(actor, rollKey) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// For magic rolls the prompt allows adding HEI dice, so don't block early.
|
// For magic rolls / itemkungfu, allow 0 base dice (user can add bonus dice in the prompt).
|
||||||
// For itemkungfu, allow 0 base dice (user can add bonus dice in the prompt).
|
|
||||||
if (numberofdice <= 0 && typeLibel !== "aspect" && typeLibel !== "itemkungfu" && !isMagic) {
|
if (numberofdice <= 0 && typeLibel !== "aspect" && typeLibel !== "itemkungfu" && !isMagic) {
|
||||||
ui.notifications.warn(game.i18n.localize("CDE.Error0"))
|
ui.notifications.warn(game.i18n.localize("CDE.Error0"))
|
||||||
return
|
return
|
||||||
@@ -454,16 +463,6 @@ export async function rollForActor(actor, rollKey) {
|
|||||||
defaultAspect = kfDefaultAspect
|
defaultAspect = kfDefaultAspect
|
||||||
}
|
}
|
||||||
|
|
||||||
let defaultSpecialAspect = 0
|
|
||||||
if (isMagicSpecial && specialLibel) {
|
|
||||||
// Look up the speciality's element from the MAGICS config constant
|
|
||||||
const specialCfg = MAGICS?.[skillLibel]?.speciality?.[specialLibel]
|
|
||||||
const aspectName = LABELELEMENT_TO_ASPECT[specialCfg?.labelelement]
|
|
||||||
if (aspectName) {
|
|
||||||
defaultSpecialAspect = ASPECT_NAMES.indexOf(aspectName)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// ---- Show roll prompt ----
|
// ---- Show roll prompt ----
|
||||||
let params
|
let params
|
||||||
|
|
||||||
@@ -474,10 +473,8 @@ export async function rollForActor(actor, rollKey) {
|
|||||||
aspectskill: defaultAspect,
|
aspectskill: defaultAspect,
|
||||||
bonusmalusskill: 0,
|
bonusmalusskill: 0,
|
||||||
bonusauspiciousdice: 0,
|
bonusauspiciousdice: 0,
|
||||||
aspectspeciality: defaultSpecialAspect,
|
|
||||||
rolldifficulty: 1,
|
rolldifficulty: 1,
|
||||||
bonusmalusspeciality: 0,
|
freepowerlevels: 0,
|
||||||
heispend: 0,
|
|
||||||
typeofthrow: typeOfThrow,
|
typeofthrow: typeOfThrow,
|
||||||
})
|
})
|
||||||
} else {
|
} else {
|
||||||
@@ -497,22 +494,18 @@ export async function rollForActor(actor, rollKey) {
|
|||||||
|
|
||||||
// ---- Compute total dice and roll ----
|
// ---- Compute total dice and roll ----
|
||||||
let aspectIndex, bonusMalus, bonusAuspicious, throwMode
|
let aspectIndex, bonusMalus, bonusAuspicious, throwMode
|
||||||
let spellAspectIndex = null // magic only: aspect of the speciality for Wu Xing
|
|
||||||
let rollDifficulty = 1 // magic only: multiplier applied to successes
|
let rollDifficulty = 1 // magic only: multiplier applied to successes
|
||||||
|
|
||||||
if (isMagic) {
|
if (isMagic) {
|
||||||
const skillAspectIndex = Number(params.aspectskill ?? 0)
|
const skillAspectIndex = Number(params.aspectskill ?? 0)
|
||||||
spellAspectIndex = Number(params.aspectspeciality ?? skillAspectIndex)
|
aspectIndex = skillAspectIndex // used for both dice pool and Wu Xing cycle
|
||||||
aspectIndex = skillAspectIndex // used only for skill dice pool
|
|
||||||
bonusMalus = Number(params.bonusmalusskill ?? 0)
|
bonusMalus = Number(params.bonusmalusskill ?? 0)
|
||||||
bonusAuspicious = Number(params.bonusauspiciousdice ?? 0)
|
bonusAuspicious = Number(params.bonusauspiciousdice ?? 0)
|
||||||
rollDifficulty = Math.max(1, Number(params.rolldifficulty ?? 1))
|
rollDifficulty = Math.max(1, Number(params.rolldifficulty ?? 1))
|
||||||
throwMode = Number(params.typeofthrow ?? 0)
|
throwMode = Number(params.typeofthrow ?? 0)
|
||||||
// magic: magic skill + aspect + bonuses + 1 (speciality base) + HEI spent
|
// magic: magic skill + aspect + bonuses + 1 (speciality base) + HEI spent
|
||||||
const aspectDice = sys.aspect?.[ASPECT_NAMES[aspectIndex]]?.value ?? 0
|
const aspectDice = sys.aspect?.[ASPECT_NAMES[aspectIndex]]?.value ?? 0
|
||||||
const bonusSpec = Number(params.bonusmalusspeciality ?? 0)
|
numberofdice = numberofdice + aspectDice + bonusMalus + 1
|
||||||
const heiDice = Number(params.heispend ?? 0)
|
|
||||||
numberofdice = numberofdice + aspectDice + bonusMalus + 1 + bonusSpec + heiDice
|
|
||||||
} else {
|
} else {
|
||||||
aspectIndex = Number(params.aspect ?? 0)
|
aspectIndex = Number(params.aspect ?? 0)
|
||||||
bonusMalus = Number(params.bonusmalus ?? 0)
|
bonusMalus = Number(params.bonusmalus ?? 0)
|
||||||
@@ -539,31 +532,43 @@ export async function rollForActor(actor, rollKey) {
|
|||||||
|
|
||||||
const rollModeKey = ROLL_MODES[throwMode] ?? "roll"
|
const rollModeKey = ROLL_MODES[throwMode] ?? "roll"
|
||||||
|
|
||||||
|
// ---- Compute spell power (magic only) ----
|
||||||
|
// Power = rollDifficulty × character aspect value for the speciality's
|
||||||
|
// associated element (or the school's aspect for base magic rolls).
|
||||||
|
let spellPower = null
|
||||||
|
let spellPowerAspectName = null
|
||||||
|
let spellPowerAspectValue = null
|
||||||
|
if (isMagic) {
|
||||||
|
if (isMagicSpecial && specialLibel) {
|
||||||
|
const specialCfg = MAGICS?.[skillLibel]?.speciality?.[specialLibel]
|
||||||
|
const elemName = LABELELEMENT_TO_ASPECT[specialCfg?.labelelementkey]
|
||||||
|
if (elemName) spellPowerAspectName = elemName
|
||||||
|
}
|
||||||
|
if (!spellPowerAspectName) spellPowerAspectName = ASPECT_NAMES[aspectIndex]
|
||||||
|
spellPowerAspectValue = sys.aspect?.[spellPowerAspectName]?.value ?? 0
|
||||||
|
const freePowerLevels = Number(params.freepowerlevels ?? 0)
|
||||||
|
spellPower = rollDifficulty * (spellPowerAspectValue + freePowerLevels)
|
||||||
|
}
|
||||||
|
|
||||||
// ---- Compute Wu Xing results ----
|
// ---- Compute Wu Xing results ----
|
||||||
// For magic rolls, the spell's aspect (aspectspeciality) governs the Wu Xing
|
// The Wu Xing cycle always uses the roll's aspect (skill aspect for magic,
|
||||||
// cycle (which faces count as successes/auspicious/etc.), not the skill aspect.
|
// skill/resource aspect otherwise) to determine which faces count as
|
||||||
const wuXingAspectName = spellAspectIndex !== null
|
// successes/auspicious/etc.
|
||||||
? ASPECT_NAMES[spellAspectIndex]
|
const wuXingAspectName = ASPECT_NAMES[aspectIndex]
|
||||||
: ASPECT_NAMES[aspectIndex]
|
|
||||||
const allResults = roll.dice[0]?.results ?? []
|
const allResults = roll.dice[0]?.results ?? []
|
||||||
const faces = countFaces(allResults)
|
const faces = countFaces(allResults)
|
||||||
const results = computeWuXingResults(faces, wuXingAspectName, bonusAuspicious)
|
const results = computeWuXingResults(faces, wuXingAspectName, bonusAuspicious)
|
||||||
if (!results) return
|
if (!results) return
|
||||||
|
|
||||||
// For magic, successesdice × rollDifficulty = spell power
|
|
||||||
const spellPower = isMagic ? results.successesdice * rollDifficulty : null
|
|
||||||
|
|
||||||
// ---- Build modifier summary text ----
|
// ---- Build modifier summary text ----
|
||||||
const modParts = []
|
const modParts = []
|
||||||
if (isMagic) {
|
if (isMagic) {
|
||||||
const bm = Number(params.bonusmalusskill ?? 0)
|
const bm = Number(params.bonusmalusskill ?? 0)
|
||||||
const bs = Number(params.bonusmalusspeciality ?? 0)
|
|
||||||
const hs = Number(params.heispend ?? 0)
|
|
||||||
const ba = Number(params.bonusauspiciousdice ?? 0)
|
const ba = Number(params.bonusauspiciousdice ?? 0)
|
||||||
|
const fp = Number(params.freepowerlevels ?? 0)
|
||||||
if (bm !== 0) modParts.push(`${bm > 0 ? "+" : ""}${bm} ${game.i18n.localize("CDE.BonusMalus")}`)
|
if (bm !== 0) modParts.push(`${bm > 0 ? "+" : ""}${bm} ${game.i18n.localize("CDE.BonusMalus")}`)
|
||||||
if (bs !== 0) modParts.push(`${bs > 0 ? "+" : ""}${bs} ${game.i18n.localize("CDE.SpellBonus")}`)
|
|
||||||
if (ba !== 0) modParts.push(`+${ba} ${game.i18n.localize("CDE.BonusAuspiciousDice")}`)
|
if (ba !== 0) modParts.push(`+${ba} ${game.i18n.localize("CDE.BonusAuspiciousDice")}`)
|
||||||
if (hs !== 0) modParts.push(`${hs} ${game.i18n.localize("CDE.HeiSpend")}`)
|
if (fp !== 0) modParts.push(`+${fp} ${game.i18n.localize("CDE.FreePowerLevels")}`)
|
||||||
if (rollDifficulty !== 1) modParts.push(`×${rollDifficulty} ${game.i18n.localize("CDE.RollDifficulty")}`)
|
if (rollDifficulty !== 1) modParts.push(`×${rollDifficulty} ${game.i18n.localize("CDE.RollDifficulty")}`)
|
||||||
} else {
|
} else {
|
||||||
const bm = Number(params.bonusmalus ?? 0)
|
const bm = Number(params.bonusmalus ?? 0)
|
||||||
@@ -585,6 +590,9 @@ export async function rollForActor(actor, rollKey) {
|
|||||||
modifiersText: modParts.length ? modParts.join(" · ") : "",
|
modifiersText: modParts.length ? modParts.join(" · ") : "",
|
||||||
// Spell power (magic only)
|
// Spell power (magic only)
|
||||||
spellPower,
|
spellPower,
|
||||||
|
spellPowerAspectLabel: spellPowerAspectName ? game.i18n.localize(ASPECT_LABELS[spellPowerAspectName] ?? "") : "",
|
||||||
|
spellPowerAspectValue,
|
||||||
|
spellPowerFreeLevels: isMagic ? Number(params.freepowerlevels ?? 0) : 0,
|
||||||
rollDifficulty: isMagic ? rollDifficulty : null,
|
rollDifficulty: isMagic ? rollDifficulty : null,
|
||||||
// Actor info
|
// Actor info
|
||||||
actorName: actor.name ?? "",
|
actorName: actor.name ?? "",
|
||||||
@@ -599,7 +607,7 @@ export async function rollForActor(actor, rollKey) {
|
|||||||
|
|
||||||
// ---- Wait for Dice So Nice animation ----
|
// ---- Wait for Dice So Nice animation ----
|
||||||
if (game.modules.get("dice-so-nice")?.active && msg?.id) {
|
if (game.modules.get("dice-so-nice")?.active && msg?.id) {
|
||||||
await game.dice3d.waitFor3DAnimationByMessageID(msg.id)
|
try { await game.dice3d.waitFor3DAnimationByMessageID(msg.id) } catch (_e) { /* DSN not available */ }
|
||||||
}
|
}
|
||||||
|
|
||||||
// ---- Auto-update Loksyu / TinJi singletons ----
|
// ---- Auto-update Loksyu / TinJi singletons ----
|
||||||
|
|||||||
@@ -19,6 +19,10 @@ import { CDEBaseActorSheet } from "./base.js"
|
|||||||
export class CDECharacterSheet extends CDEBaseActorSheet {
|
export class CDECharacterSheet extends CDEBaseActorSheet {
|
||||||
static DEFAULT_OPTIONS = {
|
static DEFAULT_OPTIONS = {
|
||||||
classes: ["character"],
|
classes: ["character"],
|
||||||
|
actions: {
|
||||||
|
moveMagicUp: CDECharacterSheet.#onMoveMagicUp,
|
||||||
|
moveMagicDown: CDECharacterSheet.#onMoveMagicDown,
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
static PARTS = {
|
static PARTS = {
|
||||||
@@ -48,8 +52,7 @@ export class CDECharacterSheet extends CDEBaseActorSheet {
|
|||||||
|
|
||||||
// Build magicsDisplay: only include the 5 relevant specialities per magic type + grimoire
|
// Build magicsDisplay: only include the 5 relevant specialities per magic type + grimoire
|
||||||
const systemMagics = context.systemData.magics ?? {}
|
const systemMagics = context.systemData.magics ?? {}
|
||||||
context.magicsDisplay = Object.fromEntries(
|
const magicEntries = Object.entries(MAGICS).map(([magicKey, magicDef]) => {
|
||||||
Object.entries(MAGICS).map(([magicKey, magicDef]) => {
|
|
||||||
const magicData = systemMagics[magicKey] ?? {}
|
const magicData = systemMagics[magicKey] ?? {}
|
||||||
return [
|
return [
|
||||||
magicKey,
|
magicKey,
|
||||||
@@ -66,7 +69,18 @@ export class CDECharacterSheet extends CDEBaseActorSheet {
|
|||||||
},
|
},
|
||||||
]
|
]
|
||||||
})
|
})
|
||||||
)
|
const order = context.systemData.magicOrder ?? []
|
||||||
|
if (order.length > 0) {
|
||||||
|
magicEntries.sort((a, b) => {
|
||||||
|
const ia = order.indexOf(a[0])
|
||||||
|
const ib = order.indexOf(b[0])
|
||||||
|
if (ia === -1 && ib === -1) return 0
|
||||||
|
if (ia === -1) return 1
|
||||||
|
if (ib === -1) return -1
|
||||||
|
return ia - ib
|
||||||
|
})
|
||||||
|
}
|
||||||
|
context.magicsDisplay = Object.fromEntries(magicEntries)
|
||||||
|
|
||||||
return context
|
return context
|
||||||
}
|
}
|
||||||
@@ -155,7 +169,7 @@ export class CDECharacterSheet extends CDEBaseActorSheet {
|
|||||||
cell.addEventListener("click", (event) => {
|
cell.addEventListener("click", (event) => {
|
||||||
event.preventDefault()
|
event.preventDefault()
|
||||||
const rollKey = cell.dataset.libelId
|
const rollKey = cell.dataset.libelId
|
||||||
if (rollKey) rollForActor(this.document, rollKey)
|
if (rollKey) rollForActor(this.document, rollKey)?.catch(err => console.error("Roll failed:", err))
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
@@ -171,6 +185,28 @@ export class CDECharacterSheet extends CDEBaseActorSheet {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static async #onMoveMagicUp(event, target) {
|
||||||
|
const key = target.dataset.magicKey
|
||||||
|
let order = this.document.system.magicOrder ?? []
|
||||||
|
if (!order.length) order = [...Object.keys(MAGICS)]
|
||||||
|
else order = [...order]
|
||||||
|
const idx = order.indexOf(key)
|
||||||
|
if (idx <= 0) return
|
||||||
|
[order[idx - 1], order[idx]] = [order[idx], order[idx - 1]]
|
||||||
|
await this.document.update({ "system.magicOrder": order })
|
||||||
|
}
|
||||||
|
|
||||||
|
static async #onMoveMagicDown(event, target) {
|
||||||
|
const key = target.dataset.magicKey
|
||||||
|
let order = this.document.system.magicOrder ?? []
|
||||||
|
if (!order.length) order = [...Object.keys(MAGICS)]
|
||||||
|
else order = [...order]
|
||||||
|
const idx = order.indexOf(key)
|
||||||
|
if (idx === -1 || idx >= order.length - 1) return
|
||||||
|
[order[idx], order[idx + 1]] = [order[idx + 1], order[idx]]
|
||||||
|
await this.document.update({ "system.magicOrder": order })
|
||||||
|
}
|
||||||
|
|
||||||
#bindComponentRandomize() {
|
#bindComponentRandomize() {
|
||||||
const btn = this.element?.querySelector("[data-action='randomize-component']")
|
const btn = this.element?.querySelector("[data-action='randomize-component']")
|
||||||
if (!btn) return
|
if (!btn) return
|
||||||
|
|||||||
@@ -50,7 +50,7 @@ export class CDENpcSheet extends CDEBaseActorSheet {
|
|||||||
cell.addEventListener("click", (event) => {
|
cell.addEventListener("click", (event) => {
|
||||||
event.preventDefault()
|
event.preventDefault()
|
||||||
const rollKey = cell.dataset.libelId
|
const rollKey = cell.dataset.libelId
|
||||||
if (rollKey) rollForActor(this.document, rollKey)
|
if (rollKey) rollForActor(this.document, rollKey)?.catch(err => console.error("Roll failed:", err))
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -26,11 +26,11 @@ export class CDESanheiSheet extends CDEBaseItemSheet {
|
|||||||
async _prepareContext() {
|
async _prepareContext() {
|
||||||
const context = await super._prepareContext()
|
const context = await super._prepareContext()
|
||||||
const enrich = (content) => foundry.applications.ux.TextEditor.implementation.enrichHTML(content ?? "", { async: true })
|
const enrich = (content) => foundry.applications.ux.TextEditor.implementation.enrichHTML(content ?? "", { async: true })
|
||||||
const props = this.document.system.properties
|
const props = this.document.system.properties ?? {}
|
||||||
context.prop1DescriptionHTML = await enrich(props.prop1.description)
|
context.prop1DescriptionHTML = await enrich(props.prop1?.description)
|
||||||
context.prop2DescriptionHTML = await enrich(props.prop2.description)
|
context.prop2DescriptionHTML = await enrich(props.prop2?.description)
|
||||||
context.prop3DescriptionHTML = await enrich(props.prop3.description)
|
context.prop3DescriptionHTML = await enrich(props.prop3?.description)
|
||||||
context.propFields = this.document.system.schema.fields.properties.fields
|
context.propFields = this.document.system.schema.fields.properties?.fields
|
||||||
return context
|
return context
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -81,6 +81,14 @@
|
|||||||
title="{{ localize 'CDE.Roll' }} {{getMagicLabel key}}">
|
title="{{ localize 'CDE.Roll' }} {{getMagicLabel key}}">
|
||||||
<i class="fas fa-dice-d10"></i>
|
<i class="fas fa-dice-d10"></i>
|
||||||
</a>
|
</a>
|
||||||
|
<a class="cde-magic-order-btn" data-action="moveMagicUp" data-magic-key="{{key}}"
|
||||||
|
title="{{ localize 'CDE.MoveUp' }}">
|
||||||
|
<i class="fas fa-chevron-up"></i>
|
||||||
|
</a>
|
||||||
|
<a class="cde-magic-order-btn" data-action="moveMagicDown" data-magic-key="{{key}}"
|
||||||
|
title="{{ localize 'CDE.MoveDown' }}">
|
||||||
|
<i class="fas fa-chevron-down"></i>
|
||||||
|
</a>
|
||||||
<label class="cde-magic-toggle" title="{{ localize 'CDE.PracticeSpecialty' }}">
|
<label class="cde-magic-toggle" title="{{ localize 'CDE.PracticeSpecialty' }}">
|
||||||
<input type="checkbox" name="system.magics.{{key}}.visible" {{checked magic.visible}} />
|
<input type="checkbox" name="system.magics.{{key}}.visible" {{checked magic.visible}} />
|
||||||
<i class="fas {{#if magic.visible}}fa-chevron-up{{else}}fa-chevron-down{{/if}}"></i>
|
<i class="fas {{#if magic.visible}}fa-chevron-up{{else}}fa-chevron-down{{/if}}"></i>
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user