Compare commits

...

2 Commits

Author SHA1 Message Date
uberwald 4cb8e26333 Correction sur police des equipements
Release Creation / build (release) Successful in 1m3s
2026-06-14 22:33:49 +02:00
uberwald faf8c4ca92 Import de masse des PNJ ancien système
Release Creation / build (release) Successful in 1m13s
2026-06-10 22:16:25 +02:00
70 changed files with 741 additions and 220 deletions
+101
View File
@@ -3209,7 +3209,9 @@ ol.item-list li.item h4.item-name {
flex: 1 1 0;
margin: 0;
font-size: 13px;
font-weight: 600;
color: #e2e8f4;
font-family: "Signika", sans-serif;
}
ol.item-list li.item .cde-item-stat {
font-family: monospace;
@@ -4443,6 +4445,105 @@ ol.item-list li.item .item-controls a.item-control:hover {
color: #7d94b8;
text-align: center;
}
/* Duplicate row highlight */
.cde-migration-row-duplicate {
background: rgba(212, 175, 55, 0.15);
}
.cde-migration-duplicate-icon {
color: #d4af37;
margin-right: 4px;
font-size: 11px;
}
/* Confirmation bar */
.cde-migration-confirm-bar {
display: flex;
flex-direction: column;
gap: 8px;
padding: 12px;
border: 1px solid rgba(212, 175, 55, 0.7);
border-radius: 6px;
background: rgba(212, 175, 55, 0.1);
}
.cde-migration-confirm-msg {
margin: 0;
font-size: 12px;
color: #e2e8f4;
display: flex;
align-items: center;
gap: 6px;
}
.cde-migration-confirm-msg i {
color: #d4af37;
}
.cde-migration-confirm-duplicates {
margin: 0;
font-size: 11px;
color: #e07070;
display: flex;
align-items: center;
gap: 6px;
}
.cde-migration-confirm-duplicates i {
color: #e07070;
}
.cde-migration-confirm-actions {
display: flex;
gap: 8px;
justify-content: center;
margin-top: 4px;
}
.cde-migration-confirm-btn {
display: inline-flex;
align-items: center;
gap: 8px;
padding: 9px 24px;
border: none;
border-radius: 6px;
background: #4a9eff;
color: #fff;
font-size: 13px;
font-weight: 700;
cursor: pointer;
transition: filter 0.15s;
}
.cde-migration-confirm-btn:hover {
filter: brightness(1.15);
}
.cde-migration-cancel-btn {
display: inline-flex;
align-items: center;
gap: 8px;
padding: 9px 24px;
border: 1px solid #1a2436;
border-radius: 6px;
background: none;
color: #7d94b8;
font-size: 13px;
cursor: pointer;
transition: color 0.15s, border-color 0.15s;
}
.cde-migration-cancel-btn:hover {
color: #e04444;
border-color: #e04444;
}
/* Progress section */
.cde-migration-progress {
display: flex;
align-items: center;
justify-content: center;
gap: 8px;
padding: 16px;
font-size: 13px;
color: #e2e8f4;
}
.cde-migration-progress i {
color: #4a9eff;
}
.cde-migration-progress-count {
font-weight: 700;
color: #4a9eff;
font-variant-numeric: tabular-nums;
}
.cde-welcome-message {
display: flex;
flex-direction: column;
+107 -1
View File
@@ -3264,7 +3264,7 @@ ol.item-list {
img { border: none; border-radius: 3px; flex-shrink: 0; }
h4.item-name { flex: 1 1 0; margin: 0; font-size: 13px; color: @cde-text; }
h4.item-name { flex: 1 1 0; margin: 0; font-size: 13px; font-weight: 600; color: @cde-text; font-family: "Signika", sans-serif; }
.cde-item-stat {
font-family: monospace;
@@ -4631,6 +4631,112 @@ ol.item-list {
text-align: center;
}
/* Duplicate row highlight */
.cde-migration-row-duplicate {
background: fadeout(#d4af37, 85%);
}
.cde-migration-duplicate-icon {
color: #d4af37;
margin-right: 4px;
font-size: 11px;
}
/* Confirmation bar */
.cde-migration-confirm-bar {
display: flex;
flex-direction: column;
gap: 8px;
padding: 12px;
border: 1px solid fadeout(#d4af37, 30%);
border-radius: 6px;
background: fadeout(#d4af37, 90%);
}
.cde-migration-confirm-msg {
margin: 0;
font-size: 12px;
color: @cde-text;
display: flex;
align-items: center;
gap: 6px;
i { color: #d4af37; }
}
.cde-migration-confirm-duplicates {
margin: 0;
font-size: 11px;
color: #e07070;
display: flex;
align-items: center;
gap: 6px;
i { color: #e07070; }
}
.cde-migration-confirm-actions {
display: flex;
gap: 8px;
justify-content: center;
margin-top: 4px;
}
.cde-migration-confirm-btn {
display: inline-flex;
align-items: center;
gap: 8px;
padding: 9px 24px;
border: none;
border-radius: 6px;
background: @cde-spell;
color: #fff;
font-size: 13px;
font-weight: 700;
cursor: pointer;
transition: filter 0.15s;
&:hover { filter: brightness(1.15); }
}
.cde-migration-cancel-btn {
display: inline-flex;
align-items: center;
gap: 8px;
padding: 9px 24px;
border: 1px solid @cde-border;
border-radius: 6px;
background: none;
color: @cde-muted;
font-size: 13px;
cursor: pointer;
transition: color 0.15s, border-color 0.15s;
&:hover {
color: #e04444;
border-color: #e04444;
}
}
/* Progress section */
.cde-migration-progress {
display: flex;
align-items: center;
justify-content: center;
gap: 8px;
padding: 16px;
font-size: 13px;
color: @cde-text;
i { color: @cde-spell; }
}
.cde-migration-progress-count {
font-weight: 700;
color: @cde-spell;
font-variant-numeric: tabular-nums;
}
// ============================================================
// Welcome message
// ============================================================
+143 -8
View File
@@ -311,6 +311,89 @@ function migrateSupernaturalItem(oldItem) {
}
};
}
function migrateWeaponItem(oldItem) {
const s = oldItem.system ?? {};
return {
name: oldItem.name,
type: "weapon",
img: oldItem.img || DEFAULT_ITEM_IMG,
system: {
reference: s.reference ?? "",
description: s.description ?? "",
hasSpeciality: Boolean(s.hasSpeciality),
weaponType: s.weaponType || "melee",
material: s.material ?? "",
damageAspect: elementKey(s.damageAspect ?? ""),
damageBase: Number(s.damageBase ?? 0),
range: s.range || "contact",
obtainLevel: Number(s.obtainLevel ?? 0),
obtainDifficulty: Number(s.obtainDifficulty ?? 0),
quantity: Number(s.quantity ?? 1),
notes: s.notes ?? ""
}
};
}
function migrateArmorItem(oldItem) {
const s = oldItem.system ?? {};
return {
name: oldItem.name,
type: "armor",
img: oldItem.img || DEFAULT_ITEM_IMG,
system: {
reference: s.reference ?? "",
description: s.description ?? "",
protectionValue: Number(s.protectionValue ?? 0),
domain: s.domain ?? "",
obtainLevel: Number(s.obtainLevel ?? 0),
obtainDifficulty: Number(s.obtainDifficulty ?? 0),
quantity: Number(s.quantity ?? 1),
notes: s.notes ?? ""
}
};
}
function migrateSanheiItem(oldItem) {
const s = oldItem.system ?? {};
const props = s.properties ?? {};
const propSchema = (p) => ({
name: p?.name ?? "",
heiCost: Number(p?.heiCost ?? 0),
heiType: heiKey(p?.heiType ?? ""),
description: p?.description ?? ""
});
return {
name: oldItem.name,
type: "sanhei",
img: oldItem.img || DEFAULT_ITEM_IMG,
system: {
reference: s.reference ?? "",
description: s.description ?? "",
heiType: heiKey(s.heiType ?? ""),
properties: {
prop1: propSchema(props.prop1),
prop2: propSchema(props.prop2),
prop3: propSchema(props.prop3)
},
notes: s.notes ?? ""
}
};
}
function migrateIngredientItem(oldItem) {
const s = oldItem.system ?? {};
return {
name: oldItem.name,
type: "ingredient",
img: oldItem.img || DEFAULT_ITEM_IMG,
system: {
reference: s.reference ?? "",
description: s.description ?? "",
school: s.school ?? "all",
obtainLevel: Number(s.obtainLevel ?? 0),
obtainDifficulty: Number(s.obtainDifficulty ?? 0),
quantity: Number(s.quantity ?? 1),
notes: s.notes ?? ""
}
};
}
function migrateItem(oldItem) {
switch (oldItem.type) {
case "item":
@@ -321,6 +404,14 @@ function migrateItem(oldItem) {
return migrateSpellItem(oldItem);
case "supernatural":
return migrateSupernaturalItem(oldItem);
case "weapon":
return migrateWeaponItem(oldItem);
case "armor":
return migrateArmorItem(oldItem);
case "sanhei":
return migrateSanheiItem(oldItem);
case "ingredient":
return migrateIngredientItem(oldItem);
default:
return migrateEquipmentItem({ ...oldItem, type: "item" });
}
@@ -394,6 +485,7 @@ function migrateCharacter(old) {
resources,
component,
magics,
magicOrder: [],
threetreasures,
experience: {
value: Number(s.experience?.value ?? 0),
@@ -471,10 +563,12 @@ var CDEMigrationApp = class _CDEMigrationApp extends foundry.applications.api.Ha
icon: "fas fa-file-import",
resizable: false
},
position: { width: 560, height: "auto" },
position: { width: 600, height: "auto" },
actions: {
clearFiles: _CDEMigrationApp.#clearFiles,
doImport: _CDEMigrationApp.#doImport
doImport: _CDEMigrationApp.#doImport,
confirmImport: _CDEMigrationApp.#confirmImport,
cancelImport: _CDEMigrationApp.#cancelImport
}
};
static PARTS = {
@@ -484,13 +578,28 @@ var CDEMigrationApp = class _CDEMigrationApp extends foundry.applications.api.Ha
#pending = [];
/** @type {string[]} - error messages per file */
#errors = [];
/** @type {"idle"|"confirm"|"importing"} */
#importState = "idle";
/** @type {number} - actors created so far (during importing) */
#progress = 0;
async _prepareContext(options) {
const enrichDuplicate = (a) => ({
...a,
_duplicate: game.actors?.getName(a.name) !== null
});
const pending = this.#pending.map(enrichDuplicate);
const duplicateCount = pending.filter((a) => a._duplicate).length;
return {
pending: this.#pending,
pending,
errors: this.#errors,
hasPending: this.#pending.length > 0,
hasErrors: this.#errors.length > 0,
count: this.#pending.length
hasDuplicates: duplicateCount > 0,
duplicateCount,
count: this.#pending.length,
importState: this.#importState,
progress: this.#progress,
total: this.#pending.length
};
}
/** After render, wire up the file input. */
@@ -528,37 +637,59 @@ var CDEMigrationApp = class _CDEMigrationApp extends foundry.applications.api.Ha
const actors = parseLegacyJson(text);
for (const actor of actors) {
actor._srcFile = file.name;
if (!this.#pending.some((p) => p.name === actor.name)) {
this.#pending.push(actor);
if (this.#pending.some((p) => p.name === actor.name)) {
this.#errors.push(`\xAB ${actor.name} \xBB ignor\xE9 (nom d\xE9j\xE0 dans la liste d'attente, fichier \xAB ${file.name} \xBB)`);
continue;
}
this.#pending.push(actor);
}
} catch (err) {
this.#errors.push(game.i18n.format("CDE.MigrationErrorParse", { file: file.name, error: err.message }));
}
}
this.#importState = "idle";
this.render();
}
static async #clearFiles() {
this.#pending = [];
this.#errors = [];
this.#importState = "idle";
this.#progress = 0;
this.render();
}
/** First click: switch to confirmation state instead of importing immediately. */
static async #doImport() {
if (!this.#pending.length) return;
this.#importState = "confirm";
this.render();
}
/** Second click: actually perform the import. */
static async #confirmImport() {
if (!this.#pending.length) return;
this.#importState = "importing";
this.#progress = 0;
this.render();
const total = this.#pending.length;
const created = [];
const failed = [];
for (const data of this.#pending) {
for (let i = 0; i < total; i++) {
const data = this.#pending[i];
try {
const { _srcFile, ...actorData } = data;
const actor = await Actor.create(actorData);
created.push(actor.name);
} catch (err) {
failed.push(`${data.name}: ${err.message}`);
console.error(`CHRONIQUESDELETRANGE | Migration failed for "${data.name}":`, err);
console.error(`CHRONIQUESDELETRANGE | Import failed for "${data.name}":`, err);
}
this.#progress = i + 1;
const progEl = this.element?.querySelector(".cde-migration-progress-count");
if (progEl) progEl.textContent = `${this.#progress}/${total}`;
}
this.#pending = [];
this.#errors = failed;
this.#importState = "idle";
this.#progress = 0;
this.render();
if (created.length) {
ui.notifications.info(
@@ -571,6 +702,10 @@ var CDEMigrationApp = class _CDEMigrationApp extends foundry.applications.api.Ha
);
}
}
static async #cancelImport() {
this.#importState = "idle";
this.render();
}
};
// src/config/settings.js
+2 -2
View File
File diff suppressed because one or more lines are too long
+5
View File
@@ -150,6 +150,11 @@
"CDE.MigrationPartialError": "{count} personnage(s) n'ont pas pu être importés.",
"CDE.MigrationErrorNotJson": "Le fichier « {file} » n'est pas un fichier JSON.",
"CDE.MigrationErrorParse": "Erreur lors de la lecture de « {file} » : {error}",
"CDE.MigrationConfirmAction": "Confirmer l'importation",
"CDE.MigrationDuplicate": "Ce nom existe déjà dans le monde",
"CDE.MigrationDuplicateCount": "{count} personnage(s) existent déjà dans le monde",
"CDE.MigrationImportConfirm": "Vous allez importer {count} personnage(s). Confirmez-vous ?",
"CDE.MigrationImporting": "Importation en cours...",
"CDE.InitiativeWheel": "Roue d'Initiative",
"CDE.InitiativeWheelOpen": "Ouvrir la Roue d'Initiative",
"CDE.InitiativeWheelHint": "Roue d'initiative Les Chroniques de l'Étrange",
+1 -1
View File
@@ -1 +1 @@
MANIFEST-000040
MANIFEST-000048
+7 -7
View File
@@ -1,7 +1,7 @@
2026/06/10-16:26:13.211312 7f2fceffd6c0 Recovering log #38
2026/06/10-16:26:13.220902 7f2fceffd6c0 Delete type=3 #36
2026/06/10-16:26:13.220927 7f2fceffd6c0 Delete type=0 #38
2026/06/10-16:29:53.729923 7f2fce7fc6c0 Level-0 table #43: started
2026/06/10-16:29:53.729930 7f2fce7fc6c0 Level-0 table #43: 0 bytes OK
2026/06/10-16:29:53.735552 7f2fce7fc6c0 Delete type=0 #41
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/14-22:22:39.661219 7f29d6fef6c0 Recovering log #46
2026/06/14-22:22:39.671056 7f29d6fef6c0 Delete type=3 #44
2026/06/14-22:22:39.671114 7f29d6fef6c0 Delete type=0 #46
2026/06/14-22:32:37.952133 7f29d4feb6c0 Level-0 table #51: started
2026/06/14-22:32:37.952163 7f29d4feb6c0 Level-0 table #51: 0 bytes OK
2026/06/14-22:32:37.958637 7f29d4feb6c0 Delete type=0 #49
2026/06/14-22:32:37.965966 7f29d4feb6c0 Manual compaction at level-0 from '!items!3aig6MWvZCRoWXPW' @ 72057594037927935 : 1 .. '!items!cXaQG1TBE0jzrbNt' @ 0 : 0; will stop at (end)
+7 -7
View File
@@ -1,7 +1,7 @@
2026/06/10-16:17:31.579029 7f301cbff6c0 Recovering log #34
2026/06/10-16:17:31.588884 7f301cbff6c0 Delete type=3 #32
2026/06/10-16:17:31.588903 7f301cbff6c0 Delete type=0 #34
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)
2026/06/10-22:16:59.072626 7f2fceffd6c0 Recovering log #42
2026/06/10-22:16:59.081861 7f2fceffd6c0 Delete type=3 #40
2026/06/10-22:16:59.081884 7f2fceffd6c0 Delete type=0 #42
2026/06/10-22:17:30.144147 7f2fce7fc6c0 Level-0 table #47: started
2026/06/10-22:17:30.144159 7f2fce7fc6c0 Level-0 table #47: 0 bytes OK
2026/06/10-22:17:30.150289 7f2fce7fc6c0 Delete type=0 #45
2026/06/10-22:17:30.156728 7f2fce7fc6c0 Manual compaction at level-0 from '!items!3aig6MWvZCRoWXPW' @ 72057594037927935 : 1 .. '!items!cXaQG1TBE0jzrbNt' @ 0 : 0; will stop at (end)
+1 -1
View File
@@ -1 +1 @@
MANIFEST-000040
MANIFEST-000048
+7 -7
View File
@@ -1,7 +1,7 @@
2026/06/10-16:26:13.276120 7f301cbff6c0 Recovering log #38
2026/06/10-16:26:13.285508 7f301cbff6c0 Delete type=3 #36
2026/06/10-16:26:13.285526 7f301cbff6c0 Delete type=0 #38
2026/06/10-16:29:53.772491 7f2fce7fc6c0 Level-0 table #43: started
2026/06/10-16:29:53.772502 7f2fce7fc6c0 Level-0 table #43: 0 bytes OK
2026/06/10-16:29:53.778096 7f2fce7fc6c0 Delete type=0 #41
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/14-22:22:39.748395 7f29d6fef6c0 Recovering log #46
2026/06/14-22:22:39.759263 7f29d6fef6c0 Delete type=3 #44
2026/06/14-22:22:39.759326 7f29d6fef6c0 Delete type=0 #46
2026/06/14-22:32:38.022572 7f29d4feb6c0 Level-0 table #51: started
2026/06/14-22:32:38.022623 7f29d4feb6c0 Level-0 table #51: 0 bytes OK
2026/06/14-22:32:38.028952 7f29d4feb6c0 Delete type=0 #49
2026/06/14-22:32:38.054477 7f29d4feb6c0 Manual compaction at level-0 from '!journal!CDEGuideMain0001' @ 72057594037927935 : 1 .. '!journal.pages!CDEGuideMain0001.wgqIHHVlO9miegn1' @ 0 : 0; will stop at (end)
+7 -7
View File
@@ -1,7 +1,7 @@
2026/06/10-16:17:31.644676 7f2fcf7fe6c0 Recovering log #34
2026/06/10-16:17:31.653678 7f2fcf7fe6c0 Delete type=3 #32
2026/06/10-16:17:31.653697 7f2fcf7fe6c0 Delete type=0 #34
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)
2026/06/10-22:16:59.141528 7f2fceffd6c0 Recovering log #42
2026/06/10-22:16:59.150670 7f2fceffd6c0 Delete type=3 #40
2026/06/10-22:16:59.150697 7f2fceffd6c0 Delete type=0 #42
2026/06/10-22:17:30.188270 7f2fce7fc6c0 Level-0 table #47: started
2026/06/10-22:17:30.188284 7f2fce7fc6c0 Level-0 table #47: 0 bytes OK
2026/06/10-22:17:30.194047 7f2fce7fc6c0 Delete type=0 #45
2026/06/10-22:17:30.206835 7f2fce7fc6c0 Manual compaction at level-0 from '!journal!CDEGuideMain0001' @ 72057594037927935 : 1 .. '!journal.pages!CDEGuideMain0001.wgqIHHVlO9miegn1' @ 0 : 0; will stop at (end)
+1 -1
View File
@@ -1 +1 @@
MANIFEST-000040
MANIFEST-000048
+7 -7
View File
@@ -1,7 +1,7 @@
2026/06/10-16:26:13.232087 7f2fcf7fe6c0 Recovering log #38
2026/06/10-16:26:13.242712 7f2fcf7fe6c0 Delete type=3 #36
2026/06/10-16:26:13.242732 7f2fcf7fe6c0 Delete type=0 #38
2026/06/10-16:29:53.748487 7f2fce7fc6c0 Level-0 table #43: started
2026/06/10-16:29:53.748497 7f2fce7fc6c0 Level-0 table #43: 0 bytes OK
2026/06/10-16:29:53.754350 7f2fce7fc6c0 Delete type=0 #41
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/14-22:22:39.688631 7f29d6fef6c0 Recovering log #46
2026/06/14-22:22:39.699291 7f29d6fef6c0 Delete type=3 #44
2026/06/14-22:22:39.699355 7f29d6fef6c0 Delete type=0 #46
2026/06/14-22:32:37.979476 7f29d4feb6c0 Level-0 table #51: started
2026/06/14-22:32:37.979507 7f29d4feb6c0 Level-0 table #51: 0 bytes OK
2026/06/14-22:32:37.985981 7f29d4feb6c0 Delete type=0 #49
2026/06/14-22:32:37.994186 7f29d4feb6c0 Manual compaction at level-0 from '!items!0NDBw1YB54q3hLH0' @ 72057594037927935 : 1 .. '!items!ykekdZlirabRobEF' @ 0 : 0; will stop at (end)
+7 -7
View File
@@ -1,7 +1,7 @@
2026/06/10-16:17:31.600066 7f2fcf7fe6c0 Recovering log #34
2026/06/10-16:17:31.609869 7f2fcf7fe6c0 Delete type=3 #32
2026/06/10-16:17:31.609890 7f2fcf7fe6c0 Delete type=0 #34
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)
2026/06/10-22:16:59.094638 7f301cbff6c0 Recovering log #42
2026/06/10-22:16:59.105309 7f301cbff6c0 Delete type=3 #40
2026/06/10-22:16:59.105334 7f301cbff6c0 Delete type=0 #42
2026/06/10-22:17:30.162703 7f2fce7fc6c0 Level-0 table #47: started
2026/06/10-22:17:30.162714 7f2fce7fc6c0 Level-0 table #47: 0 bytes OK
2026/06/10-22:17:30.168944 7f2fce7fc6c0 Delete type=0 #45
2026/06/10-22:17:30.181202 7f2fce7fc6c0 Manual compaction at level-0 from '!items!0NDBw1YB54q3hLH0' @ 72057594037927935 : 1 .. '!items!ykekdZlirabRobEF' @ 0 : 0; will stop at (end)
+1 -1
View File
@@ -1 +1 @@
MANIFEST-000040
MANIFEST-000048
+7 -7
View File
@@ -1,7 +1,7 @@
2026/06/10-16:26:13.243837 7f2fcffff6c0 Recovering log #38
2026/06/10-16:26:13.253357 7f2fcffff6c0 Delete type=3 #36
2026/06/10-16:26:13.253373 7f2fcffff6c0 Delete type=0 #38
2026/06/10-16:29:53.754405 7f2fce7fc6c0 Level-0 table #43: started
2026/06/10-16:29:53.754415 7f2fce7fc6c0 Level-0 table #43: 0 bytes OK
2026/06/10-16:29:53.760076 7f2fce7fc6c0 Delete type=0 #41
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/14-22:22:39.702477 7f29d5fed6c0 Recovering log #46
2026/06/14-22:22:39.712938 7f29d5fed6c0 Delete type=3 #44
2026/06/14-22:22:39.712993 7f29d5fed6c0 Delete type=0 #46
2026/06/14-22:32:37.986092 7f29d4feb6c0 Level-0 table #51: started
2026/06/14-22:32:37.986120 7f29d4feb6c0 Level-0 table #51: 0 bytes OK
2026/06/14-22:32:37.994045 7f29d4feb6c0 Delete type=0 #49
2026/06/14-22:32:37.994361 7f29d4feb6c0 Manual compaction at level-0 from '!items!HKq5ANSGiBIdcnki' @ 72057594037927935 : 1 .. '!items!HKq5ANSGiBIdcnki' @ 0 : 0; will stop at (end)
+7 -7
View File
@@ -1,7 +1,7 @@
2026/06/10-16:17:31.611312 7f2fceffd6c0 Recovering log #34
2026/06/10-16:17:31.621229 7f2fceffd6c0 Delete type=3 #32
2026/06/10-16:17:31.621250 7f2fceffd6c0 Delete type=0 #34
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)
2026/06/10-22:16:59.106484 7f2fcf7fe6c0 Recovering log #42
2026/06/10-22:16:59.115923 7f2fcf7fe6c0 Delete type=3 #40
2026/06/10-22:16:59.115950 7f2fcf7fe6c0 Delete type=0 #42
2026/06/10-22:17:30.174912 7f2fce7fc6c0 Level-0 table #47: started
2026/06/10-22:17:30.174926 7f2fce7fc6c0 Level-0 table #47: 0 bytes OK
2026/06/10-22:17:30.181136 7f2fce7fc6c0 Delete type=0 #45
2026/06/10-22:17:30.181212 7f2fce7fc6c0 Manual compaction at level-0 from '!items!HKq5ANSGiBIdcnki' @ 72057594037927935 : 1 .. '!items!HKq5ANSGiBIdcnki' @ 0 : 0; will stop at (end)
+1 -1
View File
@@ -1 +1 @@
MANIFEST-000040
MANIFEST-000048
+7 -7
View File
@@ -1,7 +1,7 @@
2026/06/10-16:26:13.102940 7f2fcffff6c0 Recovering log #38
2026/06/10-16:26:13.157514 7f2fcffff6c0 Delete type=3 #36
2026/06/10-16:26:13.157538 7f2fcffff6c0 Delete type=0 #38
2026/06/10-16:29:53.716605 7f2fce7fc6c0 Level-0 table #43: started
2026/06/10-16:29:53.716618 7f2fce7fc6c0 Level-0 table #43: 0 bytes OK
2026/06/10-16:29:53.723647 7f2fce7fc6c0 Delete type=0 #41
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/14-22:22:39.603745 7f29d67ee6c0 Recovering log #46
2026/06/14-22:22:39.614957 7f29d67ee6c0 Delete type=3 #44
2026/06/14-22:22:39.615010 7f29d67ee6c0 Delete type=0 #46
2026/06/14-22:32:37.939036 7f29d4feb6c0 Level-0 table #51: started
2026/06/14-22:32:37.939102 7f29d4feb6c0 Level-0 table #51: 0 bytes OK
2026/06/14-22:32:37.945655 7f29d4feb6c0 Delete type=0 #49
2026/06/14-22:32:37.965934 7f29d4feb6c0 Manual compaction at level-0 from '!items!2nKXEHLG0fXtSOdy' @ 72057594037927935 : 1 .. '!items!tlIc1bmIAbQeUwj7' @ 0 : 0; will stop at (end)
+7 -7
View File
@@ -1,7 +1,7 @@
2026/06/10-16:17:31.536886 7f301cbff6c0 Recovering log #34
2026/06/10-16:17:31.546178 7f301cbff6c0 Delete type=3 #32
2026/06/10-16:17:31.546208 7f301cbff6c0 Delete type=0 #34
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)
2026/06/10-22:16:59.023554 7f2fcffff6c0 Recovering log #42
2026/06/10-22:16:59.033543 7f2fcffff6c0 Delete type=3 #40
2026/06/10-22:16:59.033571 7f2fcffff6c0 Delete type=0 #42
2026/06/10-22:17:30.131435 7f2fce7fc6c0 Level-0 table #47: started
2026/06/10-22:17:30.131469 7f2fce7fc6c0 Level-0 table #47: 0 bytes OK
2026/06/10-22:17:30.138026 7f2fce7fc6c0 Delete type=0 #45
2026/06/10-22:17:30.156715 7f2fce7fc6c0 Manual compaction at level-0 from '!items!2nKXEHLG0fXtSOdy' @ 72057594037927935 : 1 .. '!items!tlIc1bmIAbQeUwj7' @ 0 : 0; will stop at (end)
+1 -1
View File
@@ -1 +1 @@
MANIFEST-000040
MANIFEST-000048
+7 -7
View File
@@ -1,7 +1,7 @@
2026/06/10-16:26:13.254219 7f2fceffd6c0 Recovering log #38
2026/06/10-16:26:13.263234 7f2fceffd6c0 Delete type=3 #36
2026/06/10-16:26:13.263255 7f2fceffd6c0 Delete type=0 #38
2026/06/10-16:29:53.760191 7f2fce7fc6c0 Level-0 table #43: started
2026/06/10-16:29:53.760201 7f2fce7fc6c0 Level-0 table #43: 0 bytes OK
2026/06/10-16:29:53.766249 7f2fce7fc6c0 Delete type=0 #41
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/14-22:22:39.716564 7f29d6fef6c0 Recovering log #46
2026/06/14-22:22:39.726981 7f29d6fef6c0 Delete type=3 #44
2026/06/14-22:22:39.727264 7f29d6fef6c0 Delete type=0 #46
2026/06/14-22:32:37.994382 7f29d4feb6c0 Level-0 table #51: started
2026/06/14-22:32:37.994411 7f29d4feb6c0 Level-0 table #51: 0 bytes OK
2026/06/14-22:32:38.000939 7f29d4feb6c0 Delete type=0 #49
2026/06/14-22:32:38.022274 7f29d4feb6c0 Manual compaction at level-0 from '!actors!4ZjFZ1HoJV9mJStt' @ 72057594037927935 : 1 .. '!actors!zVpmacwoWEG8YTCQ' @ 0 : 0; will stop at (end)
+7 -7
View File
@@ -1,7 +1,7 @@
2026/06/10-16:17:31.622266 7f2fcf7fe6c0 Recovering log #34
2026/06/10-16:17:31.631460 7f2fcf7fe6c0 Delete type=3 #32
2026/06/10-16:17:31.631480 7f2fcf7fe6c0 Delete type=0 #34
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)
2026/06/10-22:16:59.117278 7f2fceffd6c0 Recovering log #42
2026/06/10-22:16:59.126816 7f2fceffd6c0 Delete type=3 #40
2026/06/10-22:16:59.126846 7f2fceffd6c0 Delete type=0 #42
2026/06/10-22:17:30.168999 7f2fce7fc6c0 Level-0 table #47: started
2026/06/10-22:17:30.169011 7f2fce7fc6c0 Level-0 table #47: 0 bytes OK
2026/06/10-22:17:30.174853 7f2fce7fc6c0 Delete type=0 #45
2026/06/10-22:17:30.181208 7f2fce7fc6c0 Manual compaction at level-0 from '!actors!4ZjFZ1HoJV9mJStt' @ 72057594037927935 : 1 .. '!actors!zVpmacwoWEG8YTCQ' @ 0 : 0; will stop at (end)
+1 -1
View File
@@ -1 +1 @@
MANIFEST-000018
MANIFEST-000026
+8 -8
View File
@@ -1,8 +1,8 @@
2026/06/10-16:26:13.264620 7f2fceffd6c0 Recovering log #16
2026/06/10-16:26:13.274036 7f2fceffd6c0 Delete type=3 #14
2026/06/10-16:26:13.274051 7f2fceffd6c0 Delete type=0 #16
2026/06/10-16:29:53.766305 7f2fce7fc6c0 Level-0 table #21: started
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)
2026/06/14-22:22:39.731841 7f29d6fef6c0 Recovering log #24
2026/06/14-22:22:39.741957 7f29d6fef6c0 Delete type=3 #22
2026/06/14-22:22:39.742028 7f29d6fef6c0 Delete type=0 #24
2026/06/14-22:32:38.007843 7f29d4feb6c0 Level-0 table #29: started
2026/06/14-22:32:38.007886 7f29d4feb6c0 Level-0 table #29: 0 bytes OK
2026/06/14-22:32:38.014714 7f29d4feb6c0 Delete type=0 #27
2026/06/14-22:32:38.022308 7f29d4feb6c0 Manual compaction at level-0 from '!actors!5OGW1fRUn12aNMMV' @ 72057594037927935 : 1 .. '!actors.items!zSWwOmFiFjN4YxC9.w8LXSYQ1eIygtlKV' @ 0 : 0; will stop at (end)
2026/06/14-22:32:38.022452 7f29d4feb6c0 Manual compaction at level-1 from '!actors!5OGW1fRUn12aNMMV' @ 72057594037927935 : 1 .. '!actors.items!zSWwOmFiFjN4YxC9.w8LXSYQ1eIygtlKV' @ 0 : 0; will stop at (end)
+8 -8
View File
@@ -1,8 +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)
2026/06/10-22:16:59.128431 7f2fceffd6c0 Recovering log #20
2026/06/10-22:16:59.138004 7f2fceffd6c0 Delete type=3 #18
2026/06/10-22:16:59.138034 7f2fceffd6c0 Delete type=0 #20
2026/06/10-22:17:30.194124 7f2fce7fc6c0 Level-0 table #25: started
2026/06/10-22:17:30.194157 7f2fce7fc6c0 Level-0 table #25: 0 bytes OK
2026/06/10-22:17:30.200786 7f2fce7fc6c0 Delete type=0 #23
2026/06/10-22:17:30.206841 7f2fce7fc6c0 Manual compaction at level-0 from '!actors!5OGW1fRUn12aNMMV' @ 72057594037927935 : 1 .. '!actors.items!zSWwOmFiFjN4YxC9.w8LXSYQ1eIygtlKV' @ 0 : 0; will stop at (end)
2026/06/10-22:17:30.206854 7f2fce7fc6c0 Manual compaction at level-1 from '!actors!5OGW1fRUn12aNMMV' @ 72057594037927935 : 1 .. '!actors.items!zSWwOmFiFjN4YxC9.w8LXSYQ1eIygtlKV' @ 0 : 0; will stop at (end)
+1 -1
View File
@@ -1 +1 @@
MANIFEST-000040
MANIFEST-000048
+7 -7
View File
@@ -1,7 +1,7 @@
2026/06/10-16:26:13.222183 7f2fcffff6c0 Recovering log #38
2026/06/10-16:26:13.231094 7f2fcffff6c0 Delete type=3 #36
2026/06/10-16:26:13.231111 7f2fcffff6c0 Delete type=0 #38
2026/06/10-16:29:53.735658 7f2fce7fc6c0 Level-0 table #43: started
2026/06/10-16:29:53.735668 7f2fce7fc6c0 Level-0 table #43: 0 bytes OK
2026/06/10-16:29:53.741314 7f2fce7fc6c0 Delete type=0 #41
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/14-22:22:39.674682 7f29d5fed6c0 Recovering log #46
2026/06/14-22:22:39.685769 7f29d5fed6c0 Delete type=3 #44
2026/06/14-22:22:39.685821 7f29d5fed6c0 Delete type=0 #46
2026/06/14-22:32:37.972754 7f29d4feb6c0 Level-0 table #51: started
2026/06/14-22:32:37.972783 7f29d4feb6c0 Level-0 table #51: 0 bytes OK
2026/06/14-22:32:37.979353 7f29d4feb6c0 Delete type=0 #49
2026/06/14-22:32:37.994176 7f29d4feb6c0 Manual compaction at level-0 from '!items!DC2kimCi9sWxqhXG' @ 72057594037927935 : 1 .. '!items!qzfAEhmvVxEMzm0k' @ 0 : 0; will stop at (end)
+7 -7
View File
@@ -1,7 +1,7 @@
2026/06/10-16:17:31.589862 7f2fcffff6c0 Recovering log #34
2026/06/10-16:17:31.599011 7f2fcffff6c0 Delete type=3 #32
2026/06/10-16:17:31.599029 7f2fcffff6c0 Delete type=0 #34
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)
2026/06/10-22:16:59.083173 7f2fcffff6c0 Recovering log #42
2026/06/10-22:16:59.093107 7f2fcffff6c0 Delete type=3 #40
2026/06/10-22:16:59.093136 7f2fcffff6c0 Delete type=0 #42
2026/06/10-22:17:30.206915 7f2fce7fc6c0 Level-0 table #47: started
2026/06/10-22:17:30.206925 7f2fce7fc6c0 Level-0 table #47: 0 bytes OK
2026/06/10-22:17:30.212983 7f2fce7fc6c0 Delete type=0 #45
2026/06/10-22:17:30.225529 7f2fce7fc6c0 Manual compaction at level-0 from '!items!DC2kimCi9sWxqhXG' @ 72057594037927935 : 1 .. '!items!qzfAEhmvVxEMzm0k' @ 0 : 0; will stop at (end)
+1 -1
View File
@@ -1 +1 @@
MANIFEST-000059
MANIFEST-000067
+14 -7
View File
@@ -1,7 +1,14 @@
2026/06/10-16:26:13.286742 7f2fcf7fe6c0 Recovering log #57
2026/06/10-16:26:13.296421 7f2fcf7fe6c0 Delete type=3 #55
2026/06/10-16:26:13.296441 7f2fcf7fe6c0 Delete type=0 #57
2026/06/10-16:29:53.778131 7f2fce7fc6c0 Level-0 table #62: started
2026/06/10-16:29:53.778141 7f2fce7fc6c0 Level-0 table #62: 0 bytes OK
2026/06/10-16:29:53.783939 7f2fce7fc6c0 Delete type=0 #60
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/14-22:22:39.763440 7f29d67ee6c0 Recovering log #65
2026/06/14-22:22:39.773982 7f29d67ee6c0 Delete type=3 #63
2026/06/14-22:22:39.774029 7f29d67ee6c0 Delete type=0 #65
2026/06/14-22:32:38.029088 7f29d4feb6c0 Level-0 table #70: started
2026/06/14-22:32:38.032823 7f29d4feb6c0 Level-0 table #70: 3169 bytes OK
2026/06/14-22:32:38.039619 7f29d4feb6c0 Delete type=0 #68
2026/06/14-22:32:38.054502 7f29d4feb6c0 Manual compaction at level-0 from '!scenes!2C6gyZpvPxWlsVZi' @ 72057594037927935 : 1 .. '!scenes.levels!olYe9bhuXwRWQ8j7.defaultLevel0000' @ 0 : 0; will stop at '!scenes.levels!olYe9bhuXwRWQ8j7.defaultLevel0000' @ 29 : 1
2026/06/14-22:32:38.054509 7f29d4feb6c0 Compacting 1@0 + 1@1 files
2026/06/14-22:32:38.058254 7f29d4feb6c0 Generated table #71@0: 8 keys, 3169 bytes
2026/06/14-22:32:38.058277 7f29d4feb6c0 Compacted 1@0 + 1@1 files => 3169 bytes
2026/06/14-22:32:38.064919 7f29d4feb6c0 compacted to: files[ 0 1 0 0 0 0 0 ]
2026/06/14-22:32:38.065170 7f29d4feb6c0 Delete type=2 #46
2026/06/14-22:32:38.065328 7f29d4feb6c0 Delete type=2 #70
2026/06/14-22:32:38.072993 7f29d4feb6c0 Manual compaction at level-0 from '!scenes.levels!olYe9bhuXwRWQ8j7.defaultLevel0000' @ 29 : 1 .. '!scenes.levels!olYe9bhuXwRWQ8j7.defaultLevel0000' @ 0 : 0; will stop at (end)
+7 -7
View File
@@ -1,7 +1,7 @@
2026/06/10-16:17:31.655147 7f2fceffd6c0 Recovering log #53
2026/06/10-16:17:31.664989 7f2fceffd6c0 Delete type=3 #51
2026/06/10-16:17:31.665009 7f2fceffd6c0 Delete type=0 #53
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)
2026/06/10-22:16:59.152572 7f2fcffff6c0 Recovering log #61
2026/06/10-22:16:59.162721 7f2fcffff6c0 Delete type=3 #59
2026/06/10-22:16:59.162748 7f2fcffff6c0 Delete type=0 #61
2026/06/10-22:17:30.213038 7f2fce7fc6c0 Level-0 table #66: started
2026/06/10-22:17:30.213049 7f2fce7fc6c0 Level-0 table #66: 0 bytes OK
2026/06/10-22:17:30.219379 7f2fce7fc6c0 Delete type=0 #64
2026/06/10-22:17:30.234624 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
View File
@@ -1 +1 @@
MANIFEST-000040
MANIFEST-000048
+7 -7
View File
@@ -1,7 +1,7 @@
2026/06/10-16:26:13.159784 7f2fceffd6c0 Recovering log #38
2026/06/10-16:26:13.186364 7f2fceffd6c0 Delete type=3 #36
2026/06/10-16:26:13.186391 7f2fceffd6c0 Delete type=0 #38
2026/06/10-16:29:53.741387 7f2fce7fc6c0 Level-0 table #43: started
2026/06/10-16:29:53.741400 7f2fce7fc6c0 Level-0 table #43: 0 bytes OK
2026/06/10-16:29:53.748439 7f2fce7fc6c0 Delete type=0 #41
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/14-22:22:39.618536 7f29d57ec6c0 Recovering log #46
2026/06/14-22:22:39.628785 7f29d57ec6c0 Delete type=3 #44
2026/06/14-22:22:39.628834 7f29d57ec6c0 Delete type=0 #46
2026/06/14-22:32:37.966108 7f29d4feb6c0 Level-0 table #51: started
2026/06/14-22:32:37.966141 7f29d4feb6c0 Level-0 table #51: 0 bytes OK
2026/06/14-22:32:37.972646 7f29d4feb6c0 Delete type=0 #49
2026/06/14-22:32:37.994161 7f29d4feb6c0 Manual compaction at level-0 from '!items!2f51pcvFkcZjaxDk' @ 72057594037927935 : 1 .. '!items!yVN7PZw35iIaBl0H' @ 0 : 0; will stop at (end)
+7 -7
View File
@@ -1,7 +1,7 @@
2026/06/10-16:17:31.547590 7f2fcffff6c0 Recovering log #34
2026/06/10-16:17:31.557499 7f2fcffff6c0 Delete type=3 #32
2026/06/10-16:17:31.557521 7f2fcffff6c0 Delete type=0 #34
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)
2026/06/10-22:16:59.036129 7f301cbff6c0 Recovering log #42
2026/06/10-22:16:59.045169 7f301cbff6c0 Delete type=3 #40
2026/06/10-22:16:59.045189 7f301cbff6c0 Delete type=0 #42
2026/06/10-22:17:30.138111 7f2fce7fc6c0 Level-0 table #47: started
2026/06/10-22:17:30.138127 7f2fce7fc6c0 Level-0 table #47: 0 bytes OK
2026/06/10-22:17:30.144090 7f2fce7fc6c0 Delete type=0 #45
2026/06/10-22:17:30.156722 7f2fce7fc6c0 Manual compaction at level-0 from '!items!2f51pcvFkcZjaxDk' @ 72057594037927935 : 1 .. '!items!yVN7PZw35iIaBl0H' @ 0 : 0; will stop at (end)
+1 -1
View File
@@ -1 +1 @@
MANIFEST-000040
MANIFEST-000048
+7 -7
View File
@@ -1,7 +1,7 @@
2026/06/10-16:26:13.188966 7f2fcf7fe6c0 Recovering log #38
2026/06/10-16:26:13.198881 7f2fcf7fe6c0 Delete type=3 #36
2026/06/10-16:26:13.198898 7f2fcf7fe6c0 Delete type=0 #38
2026/06/10-16:29:53.710145 7f2fce7fc6c0 Level-0 table #43: started
2026/06/10-16:29:53.710176 7f2fce7fc6c0 Level-0 table #43: 0 bytes OK
2026/06/10-16:29:53.716550 7f2fce7fc6c0 Delete type=0 #41
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/14-22:22:39.633149 7f29d6fef6c0 Recovering log #46
2026/06/14-22:22:39.644445 7f29d6fef6c0 Delete type=3 #44
2026/06/14-22:22:39.644504 7f29d6fef6c0 Delete type=0 #46
2026/06/14-22:32:37.945805 7f29d4feb6c0 Level-0 table #51: started
2026/06/14-22:32:37.945837 7f29d4feb6c0 Level-0 table #51: 0 bytes OK
2026/06/14-22:32:37.952016 7f29d4feb6c0 Delete type=0 #49
2026/06/14-22:32:37.965952 7f29d4feb6c0 Manual compaction at level-0 from '!items!APN91pQL0NBfZsG7' @ 72057594037927935 : 1 .. '!items!xxZKGqDVxAfr140W' @ 0 : 0; will stop at (end)
+7 -7
View File
@@ -1,7 +1,7 @@
2026/06/10-16:17:31.558759 7f2fcf7fe6c0 Recovering log #34
2026/06/10-16:17:31.567443 7f2fcf7fe6c0 Delete type=3 #32
2026/06/10-16:17:31.567462 7f2fcf7fe6c0 Delete type=0 #34
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)
2026/06/10-22:16:59.047090 7f2fceffd6c0 Recovering log #42
2026/06/10-22:16:59.057530 7f2fceffd6c0 Delete type=3 #40
2026/06/10-22:16:59.057556 7f2fceffd6c0 Delete type=0 #42
2026/06/10-22:17:30.150367 7f2fce7fc6c0 Level-0 table #47: started
2026/06/10-22:17:30.150382 7f2fce7fc6c0 Level-0 table #47: 0 bytes OK
2026/06/10-22:17:30.156663 7f2fce7fc6c0 Delete type=0 #45
2026/06/10-22:17:30.156732 7f2fce7fc6c0 Manual compaction at level-0 from '!items!APN91pQL0NBfZsG7' @ 72057594037927935 : 1 .. '!items!xxZKGqDVxAfr140W' @ 0 : 0; will stop at (end)
+1 -1
View File
@@ -1 +1 @@
MANIFEST-000040
MANIFEST-000048
+7 -7
View File
@@ -1,7 +1,7 @@
2026/06/10-16:26:13.200233 7f2fcffff6c0 Recovering log #38
2026/06/10-16:26:13.210096 7f2fcffff6c0 Delete type=3 #36
2026/06/10-16:26:13.210116 7f2fcffff6c0 Delete type=0 #38
2026/06/10-16:29:53.723688 7f2fce7fc6c0 Level-0 table #43: started
2026/06/10-16:29:53.723697 7f2fce7fc6c0 Level-0 table #43: 0 bytes OK
2026/06/10-16:29:53.729865 7f2fce7fc6c0 Delete type=0 #41
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/14-22:22:39.647097 7f29d67ee6c0 Recovering log #46
2026/06/14-22:22:39.657645 7f29d67ee6c0 Delete type=3 #44
2026/06/14-22:22:39.657692 7f29d67ee6c0 Delete type=0 #46
2026/06/14-22:32:37.958747 7f29d4feb6c0 Level-0 table #51: started
2026/06/14-22:32:37.958775 7f29d4feb6c0 Level-0 table #51: 0 bytes OK
2026/06/14-22:32:37.965805 7f29d4feb6c0 Delete type=0 #49
2026/06/14-22:32:37.966067 7f29d4feb6c0 Manual compaction at level-0 from '!items!2IYbyCPF9LJojzsj' @ 72057594037927935 : 1 .. '!items!uOpWyMGK3oiUJ1Sl' @ 0 : 0; will stop at (end)
+7 -7
View File
@@ -1,7 +1,7 @@
2026/06/10-16:17:31.568388 7f2fceffd6c0 Recovering log #34
2026/06/10-16:17:31.577902 7f2fceffd6c0 Delete type=3 #32
2026/06/10-16:17:31.577924 7f2fceffd6c0 Delete type=0 #34
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)
2026/06/10-22:16:59.059510 7f2fcffff6c0 Recovering log #42
2026/06/10-22:16:59.070966 7f2fcffff6c0 Delete type=3 #40
2026/06/10-22:16:59.071001 7f2fcffff6c0 Delete type=0 #42
2026/06/10-22:17:30.156791 7f2fce7fc6c0 Level-0 table #47: started
2026/06/10-22:17:30.156799 7f2fce7fc6c0 Level-0 table #47: 0 bytes OK
2026/06/10-22:17:30.162648 7f2fce7fc6c0 Delete type=0 #45
2026/06/10-22:17:30.181195 7f2fce7fc6c0 Manual compaction at level-0 from '!items!2IYbyCPF9LJojzsj' @ 72057594037927935 : 1 .. '!items!uOpWyMGK3oiUJ1Sl' @ 0 : 0; will stop at (end)
+92
View File
@@ -231,12 +231,103 @@ function migrateSupernaturalItem(oldItem) {
}
}
function migrateWeaponItem(oldItem) {
const s = oldItem.system ?? {}
return {
name: oldItem.name,
type: "weapon",
img: oldItem.img || DEFAULT_ITEM_IMG,
system: {
reference: s.reference ?? "",
description: s.description ?? "",
hasSpeciality: Boolean(s.hasSpeciality),
weaponType: s.weaponType || "melee",
material: s.material ?? "",
damageAspect: elementKey(s.damageAspect ?? ""),
damageBase: Number(s.damageBase ?? 0),
range: s.range || "contact",
obtainLevel: Number(s.obtainLevel ?? 0),
obtainDifficulty: Number(s.obtainDifficulty ?? 0),
quantity: Number(s.quantity ?? 1),
notes: s.notes ?? "",
},
}
}
function migrateArmorItem(oldItem) {
const s = oldItem.system ?? {}
return {
name: oldItem.name,
type: "armor",
img: oldItem.img || DEFAULT_ITEM_IMG,
system: {
reference: s.reference ?? "",
description: s.description ?? "",
protectionValue: Number(s.protectionValue ?? 0),
domain: s.domain ?? "",
obtainLevel: Number(s.obtainLevel ?? 0),
obtainDifficulty: Number(s.obtainDifficulty ?? 0),
quantity: Number(s.quantity ?? 1),
notes: s.notes ?? "",
},
}
}
function migrateSanheiItem(oldItem) {
const s = oldItem.system ?? {}
const props = s.properties ?? {}
const propSchema = (p) => ({
name: p?.name ?? "",
heiCost: Number(p?.heiCost ?? 0),
heiType: heiKey(p?.heiType ?? ""),
description: p?.description ?? "",
})
return {
name: oldItem.name,
type: "sanhei",
img: oldItem.img || DEFAULT_ITEM_IMG,
system: {
reference: s.reference ?? "",
description: s.description ?? "",
heiType: heiKey(s.heiType ?? ""),
properties: {
prop1: propSchema(props.prop1),
prop2: propSchema(props.prop2),
prop3: propSchema(props.prop3),
},
notes: s.notes ?? "",
},
}
}
function migrateIngredientItem(oldItem) {
const s = oldItem.system ?? {}
return {
name: oldItem.name,
type: "ingredient",
img: oldItem.img || DEFAULT_ITEM_IMG,
system: {
reference: s.reference ?? "",
description: s.description ?? "",
school: s.school ?? "all",
obtainLevel: Number(s.obtainLevel ?? 0),
obtainDifficulty: Number(s.obtainDifficulty ?? 0),
quantity: Number(s.quantity ?? 1),
notes: s.notes ?? "",
},
}
}
function migrateItem(oldItem) {
switch (oldItem.type) {
case "item": return migrateEquipmentItem(oldItem)
case "kungfu": return migrateKungfuItem(oldItem)
case "spell": return migrateSpellItem(oldItem)
case "supernatural": return migrateSupernaturalItem(oldItem)
case "weapon": return migrateWeaponItem(oldItem)
case "armor": return migrateArmorItem(oldItem)
case "sanhei": return migrateSanheiItem(oldItem)
case "ingredient": return migrateIngredientItem(oldItem)
default:
// Unknown item type: keep as generic equipment
return migrateEquipmentItem({ ...oldItem, type: "item" })
@@ -329,6 +420,7 @@ function migrateCharacter(old) {
resources,
component,
magics,
magicOrder: [],
threetreasures,
experience: {
value: Number(s.experience?.value ?? 0),
+57 -20
View File
@@ -1,16 +1,3 @@
/**
* Chroniques de l'Étrange — Système FoundryVTT
*
* Chroniques de l'Étrange est un jeu de rôle édité par Antre-Monde Éditions.
* Ce système FoundryVTT est une implémentation indépendante et n'est pas
* affilié à Antre-Monde Éditions,
* mais a été réalisé avec l'autorisation d'Antre-Monde Éditions.
*
* @author LeRatierBretonnien
* @copyright 20242026 LeRatierBretonnien
* @license CC BY-NC-SA 4.0 https://creativecommons.org/licenses/by-nc-sa/4.0/
*/
import { parseLegacyJson } from "../../migration/migrator.js"
const MIGRATION_TEMPLATE = "systems/fvtt-chroniques-de-l-etrange/templates/apps/cde-migration-app.html"
@@ -33,10 +20,12 @@ export class CDEMigrationApp extends foundry.applications.api.HandlebarsApplicat
icon: "fas fa-file-import",
resizable: false,
},
position: { width: 560, height: "auto" },
position: { width: 600, height: "auto" },
actions: {
clearFiles: CDEMigrationApp.#clearFiles,
doImport: CDEMigrationApp.#doImport,
confirmImport: CDEMigrationApp.#confirmImport,
cancelImport: CDEMigrationApp.#cancelImport,
},
}
@@ -50,13 +39,31 @@ export class CDEMigrationApp extends foundry.applications.api.HandlebarsApplicat
/** @type {string[]} - error messages per file */
#errors = []
/** @type {"idle"|"confirm"|"importing"} */
#importState = "idle"
/** @type {number} - actors created so far (during importing) */
#progress = 0
async _prepareContext(options) {
// Compute _duplicate live from the world each render, to avoid stale flags
const enrichDuplicate = (a) => ({
...a,
_duplicate: game.actors?.getName(a.name) !== null,
})
const pending = this.#pending.map(enrichDuplicate)
const duplicateCount = pending.filter(a => a._duplicate).length
return {
pending: this.#pending,
pending,
errors: this.#errors,
hasPending: this.#pending.length > 0,
hasErrors: this.#errors.length > 0,
hasDuplicates: duplicateCount > 0,
duplicateCount,
count: this.#pending.length,
importState: this.#importState,
progress: this.#progress,
total: this.#pending.length,
}
}
@@ -95,43 +102,68 @@ export class CDEMigrationApp extends foundry.applications.api.HandlebarsApplicat
const actors = parseLegacyJson(text)
for (const actor of actors) {
actor._srcFile = file.name
// Avoid duplicates by name
if (!this.#pending.some(p => p.name === actor.name)) {
this.#pending.push(actor)
// Avoid duplicates-by-name in our pending list
if (this.#pending.some(p => p.name === actor.name)) {
this.#errors.push(`« ${actor.name} » ignoré (nom déjà dans la liste d'attente, fichier « ${file.name} »)`)
continue
}
this.#pending.push(actor)
}
} catch (err) {
this.#errors.push(game.i18n.format("CDE.MigrationErrorParse", { file: file.name, error: err.message }))
}
}
this.#importState = "idle"
this.render()
}
static async #clearFiles() {
this.#pending = []
this.#errors = []
this.#importState = "idle"
this.#progress = 0
this.render()
}
/** First click: switch to confirmation state instead of importing immediately. */
static async #doImport() {
if (!this.#pending.length) return
this.#importState = "confirm"
this.render()
}
/** Second click: actually perform the import. */
static async #confirmImport() {
if (!this.#pending.length) return
this.#importState = "importing"
this.#progress = 0
this.render()
const total = this.#pending.length
const created = []
const failed = []
for (const data of this.#pending) {
for (let i = 0; i < total; i++) {
const data = this.#pending[i]
try {
const { _srcFile, ...actorData } = data
const actor = await Actor.create(actorData)
created.push(actor.name)
} catch (err) {
failed.push(`${data.name}: ${err.message}`)
console.error(`CHRONIQUESDELETRANGE | Migration failed for "${data.name}":`, err)
console.error(`CHRONIQUESDELETRANGE | Import failed for "${data.name}":`, err)
}
this.#progress = i + 1
// Live-update the progress element in the DOM without full re-render
const progEl = this.element?.querySelector(".cde-migration-progress-count")
if (progEl) progEl.textContent = `${this.#progress}/${total}`
}
this.#pending = []
this.#errors = failed
this.#importState = "idle"
this.#progress = 0
this.render()
if (created.length) {
@@ -145,4 +177,9 @@ export class CDEMigrationApp extends foundry.applications.api.HandlebarsApplicat
)
}
}
static async #cancelImport() {
this.#importState = "idle"
this.render()
}
}
+43 -5
View File
@@ -13,7 +13,7 @@
</div>
{{! Preview table }}
{{#if hasPending}}
{{#if (and hasPending (ne importState "importing"))}}
<div class="cde-migration-preview">
<div class="cde-migration-preview-header">
<span>{{ localize "CDE.MigrationPreviewTitle" }}</span>
@@ -34,9 +34,12 @@
</thead>
<tbody>
{{#each pending}}
<tr>
<tr class="{{#if _duplicate}}cde-migration-row-duplicate{{/if}}">
<td><img src="{{img}}" class="cde-migration-thumb" alt=""></td>
<td class="cde-migration-name">{{name}}</td>
<td class="cde-migration-name">
{{#if _duplicate}}<i class="fa-solid fa-triangle-exclamation cde-migration-duplicate-icon" title="{{ localize 'CDE.MigrationDuplicate' }}"></i>{{/if}}
{{name}}
</td>
<td>
<span class="cde-migration-type-badge cde-migration-type-{{type}}">
{{#if (eq type "character")}}
@@ -55,6 +58,41 @@
</div>
{{/if}}
{{! Duplicate warning banner (confirmation step) }}
{{#if (eq importState "confirm")}}
<div class="cde-migration-confirm-bar">
<p class="cde-migration-confirm-msg">
<i class="fa-solid fa-triangle-exclamation"></i>
{{ localize "CDE.MigrationImportConfirm" count=count }}
</p>
{{#if hasDuplicates}}
<p class="cde-migration-confirm-duplicates">
<i class="fa-solid fa-triangle-exclamation"></i>
{{ localize "CDE.MigrationDuplicateCount" count=duplicateCount }}
</p>
{{/if}}
<div class="cde-migration-confirm-actions">
<button type="button" class="cde-migration-confirm-btn" data-action="confirmImport">
<i class="fa-solid fa-download"></i>
{{ localize "CDE.MigrationConfirmAction" }} ({{count}})
</button>
<button type="button" class="cde-migration-cancel-btn" data-action="cancelImport">
<i class="fa-solid fa-xmark"></i>
{{ localize "CDE.Cancel" }}
</button>
</div>
</div>
{{/if}}
{{! Progress (importing state) }}
{{#if (eq importState "importing")}}
<div class="cde-migration-progress">
<i class="fa-solid fa-spinner fa-spin"></i>
<span>{{ localize "CDE.MigrationImporting" }}</span>
<span class="cde-migration-progress-count">{{progress}}/{{total}}</span>
</div>
{{/if}}
{{! Errors }}
{{#if hasErrors}}
<ul class="cde-migration-errors">
@@ -66,12 +104,12 @@
{{! Action bar }}
<div class="cde-migration-actions">
{{#if hasPending}}
{{#if (and hasPending (eq importState "idle"))}}
<button type="button" class="cde-migration-import-btn" data-action="doImport">
<i class="fa-solid fa-download"></i>
{{ localize "CDE.MigrationImport" }} ({{count}})
</button>
{{else}}
{{else if (and (not hasPending) (eq importState "idle"))}}
<p class="cde-migration-hint">{{ localize "CDE.MigrationHint" }}</p>
{{/if}}
</div>