3 Commits

Author SHA1 Message Date
uberwald 98c319767e Use socket to manage loksyu
Release Creation / build (release) Successful in 1m3s
2026-06-14 22:55:26 +02:00
uberwald 50038a13f9 Use socket to manage loksyu 2026-06-14 22:54:37 +02:00
uberwald 4cb8e26333 Correction sur police des equipements
Release Creation / build (release) Successful in 1m3s
2026-06-14 22:33:49 +02:00
72 changed files with 469 additions and 228 deletions
+2
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;
+1 -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;
+111 -13
View File
@@ -1561,6 +1561,7 @@ async function rollInitiativeNPC(actor) {
}
// src/ui/apps/singletons.js
var SOCKET_CHANNEL = `system.${SYSTEM_ID}`;
function getLoksyuData() {
return game.settings.get(SYSTEM_ID, "loksyuData") ?? {
wood: { yin: 0, yang: 0 },
@@ -1570,16 +1571,75 @@ function getLoksyuData() {
water: { yin: 0, yang: 0 }
};
}
async function setLoksyuData(data) {
async function writeLoksyuData(data) {
await game.settings.set(SYSTEM_ID, "loksyuData", data);
Hooks.callAll("cde:loksyuUpdated", data);
}
async function writeTinjiValue(value) {
value = Math.max(0, value);
await game.settings.set(SYSTEM_ID, "tinjiData", value);
Hooks.callAll("cde:tinjiUpdated", value);
}
async function setLoksyuData(data) {
if (game.user.isGM) return writeLoksyuData(data);
game.socket.emit(SOCKET_CHANNEL, { action: "setLoksyuData", data });
}
function getTinjiValue() {
return game.settings.get(SYSTEM_ID, "tinjiData") ?? 0;
}
async function setTinjiValue(value) {
await game.settings.set(SYSTEM_ID, "tinjiData", Math.max(0, value));
Hooks.callAll("cde:tinjiUpdated", Math.max(0, value));
if (game.user.isGM) return writeTinjiValue(value);
game.socket.emit(SOCKET_CHANNEL, { action: "setTinjiValue", value });
}
function requestLoksyuDraw(aspect, order) {
game.socket.emit(SOCKET_CHANNEL, { action: "loksyuDraw", aspect, order });
}
function requestTinjiSpend() {
game.socket.emit(SOCKET_CHANNEL, { action: "tinjiSpend" });
}
function registerSingletonSocket() {
game.socket.on(SOCKET_CHANNEL, async (payload) => {
if (!game.user.isGM) return;
switch (payload.action) {
case "setLoksyuData":
await writeLoksyuData(payload.data);
break;
case "setTinjiValue":
await writeTinjiValue(payload.value);
break;
case "updateLoksyuFromRoll":
await updateLoksyuFromRoll(payload.activeAspect, payload.faces);
break;
case "updateTinjiFromRoll":
await updateTinjiFromRoll(payload.delta);
break;
case "loksyuDraw": {
const data = getLoksyuData();
const entry = data[payload.aspect] ?? { yin: 0, yang: 0 };
const order = payload.order ?? "yang-first";
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--;
else entry.yin--;
}
data[payload.aspect] = entry;
await writeLoksyuData(data);
break;
}
case "tinjiSpend": {
const cur = getTinjiValue();
if (cur > 0) await writeTinjiValue(cur - 1);
break;
}
}
});
}
async function updateLoksyuFromRoll(activeAspect, faces) {
const cycle = WU_XING_CYCLE[activeAspect];
@@ -1590,18 +1650,23 @@ async function updateLoksyuFromRoll(activeAspect, faces) {
const yinCount = faces[yinFace] ?? 0;
const yangCount = faces[yangFace] ?? 0;
if (yinCount === 0 && yangCount === 0) return;
if (game.user.isGM) {
const data = getLoksyuData();
const current = data[lokAspect] ?? { yin: 0, yang: 0 };
data[lokAspect] = {
yin: (current.yin ?? 0) + yinCount,
yang: (current.yang ?? 0) + yangCount
};
await setLoksyuData(data);
data[lokAspect] = { yin: (current.yin ?? 0) + yinCount, yang: (current.yang ?? 0) + yangCount };
await writeLoksyuData(data);
} else {
game.socket.emit(SOCKET_CHANNEL, { action: "updateLoksyuFromRoll", activeAspect, faces });
}
}
async function updateTinjiFromRoll(count) {
if (!count || count <= 0) return;
if (game.user.isGM) {
const current = getTinjiValue();
await setTinjiValue(current + count);
await writeTinjiValue(current + count);
} else {
game.socket.emit(SOCKET_CHANNEL, { action: "updateTinjiFromRoll", delta: count });
}
}
// src/ui/rolling.js
@@ -2685,6 +2750,8 @@ var CDELoksyuApp = class _CDELoksyuApp extends foundry.applications.api.Handleba
};
/** @type {Function|null} bound hook handler */
_updateHook = null;
/** @type {Function|null} updateSetting hook handler (for socket-propagated writes) */
_settingHook = null;
/** Singleton accessor — open or bring to front */
static open() {
const existing = Array.from(foundry.applications.instances.values()).find(
@@ -2719,13 +2786,24 @@ var CDELoksyuApp = class _CDELoksyuApp extends foundry.applications.api.Handleba
_onRender(context, options) {
super._onRender(context, options);
this.#bindInputs();
if (!this._updateHook) {
this._updateHook = Hooks.on("cde:loksyuUpdated", () => this.render());
}
if (!this._settingHook) {
this._settingHook = Hooks.on("updateSetting", (setting) => {
if (setting.key === `${SYSTEM_ID}.loksyuData`) this.render();
});
}
}
_onClose(options) {
if (this._updateHook !== null) {
Hooks.off("cde:loksyuUpdated", this._updateHook);
this._updateHook = null;
}
if (this._settingHook !== null) {
Hooks.off("updateSetting", this._settingHook);
this._settingHook = null;
}
super._onClose(options);
}
#bindInputs() {
@@ -2794,6 +2872,8 @@ var CDETinjiApp = class _CDETinjiApp extends foundry.applications.api.Handlebars
};
/** @type {Function|null} */
_updateHook = null;
/** @type {Function|null} */
_settingHook = null;
static open() {
const existing = Array.from(foundry.applications.instances.values()).find(
(app2) => app2 instanceof _CDETinjiApp
@@ -2815,13 +2895,24 @@ var CDETinjiApp = class _CDETinjiApp extends foundry.applications.api.Handlebars
_onRender(context, options) {
super._onRender(context, options);
this.#bindDirectInput();
if (!this._updateHook) {
this._updateHook = Hooks.on("cde:tinjiUpdated", () => this.render());
}
if (!this._settingHook) {
this._settingHook = Hooks.on("updateSetting", (setting) => {
if (setting.key === `${SYSTEM_ID}.tinjiData`) this.render();
});
}
}
_onClose(options) {
if (this._updateHook !== null) {
Hooks.off("cde:tinjiUpdated", this._updateHook);
this._updateHook = null;
}
if (this._settingHook !== null) {
Hooks.off("updateSetting", this._settingHook);
this._settingHook = null;
}
super._onClose(options);
}
#bindDirectInput() {
@@ -3078,8 +3169,7 @@ function refreshRollActions(rollCard, aspect, message) {
const tinji = getTinjiValue();
const successAvail = (loksyu[aspect]?.yin ?? 0) + (loksyu[aspect]?.yang ?? 0);
const fasteAvail = (loksyu[fasteAspect]?.yin ?? 0) + (loksyu[fasteAspect]?.yang ?? 0);
const isGM = game.user.isGM;
const hasSomething = successAvail > 0 || fasteAvail > 0 || isGM && tinji > 0;
const hasSomething = successAvail > 0 || fasteAvail > 0 || tinji > 0;
if (!hasSomething) return;
const aspLabel = game.i18n.localize(ASPECT_LABELS[aspect]);
const fasteLabel = game.i18n.localize(ASPECT_LABELS[fasteAspect]);
@@ -3098,7 +3188,7 @@ function refreshRollActions(rollCard, aspect, message) {
<span class="cde-roll-action-count">${fasteAvail}</span>
</button>`;
}
if (isGM && tinji > 0) {
if (tinji > 0) {
btns += `<button class="cde-roll-action-btn cde-roll-action--tinji" data-action="tinji">
<span class="cde-roll-action-tinji-char">\u5929</span>
<span class="cde-roll-action-label">${game.i18n.localize("CDE.TinJi2")}</span>
@@ -3151,7 +3241,11 @@ async function _drawFromLoksyu(message, aspect, type, aspectLabel) {
else entry.yin--;
}
data[aspect] = entry;
if (game.user.isGM) {
await setLoksyuData(data);
} else {
requestLoksyuDraw(aspect, order);
}
const flags = message?.flags?.[SYSTEM_ID];
if (flags?.rollResult && message.isOwner) {
const updated = foundry.utils.deepClone(flags.rollResult);
@@ -3190,13 +3284,16 @@ async function _drawFromLoksyu(message, aspect, type, aspectLabel) {
});
}
async function _spendTinjiPostRoll() {
if (!game.user.isGM) return;
const current = getTinjiValue();
if (current <= 0) {
ui.notifications.warn(game.i18n.localize("CDE.TinjiEmpty"));
return;
}
if (game.user.isGM) {
await setTinjiValue(current - 1);
} else {
requestTinjiSpend();
}
await ChatMessage.create({
user: game.user.id,
content: `<div class="cde-tinji-spend-msg">
@@ -3354,6 +3451,7 @@ Hooks.once("ready", async () => {
await migrateIfNeeded();
await loadWelcomeSceneIfNeeded();
CDEWheelApp.registerHooks();
registerSingletonSocket();
if (game.user.isGM) showWelcomeMessage();
});
Hooks.on("renderChatLog", (_app, html) => {
+2 -2
View File
File diff suppressed because one or more lines are too long
+1 -1
View File
@@ -1 +1 @@
MANIFEST-000040
MANIFEST-000052
+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:49:59.100287 7f29d5fed6c0 Recovering log #50
2026/06/14-22:49:59.110340 7f29d5fed6c0 Delete type=3 #48
2026/06/14-22:49:59.110396 7f29d5fed6c0 Delete type=0 #50
2026/06/14-22:52:09.917197 7f29d4feb6c0 Level-0 table #55: started
2026/06/14-22:52:09.917225 7f29d4feb6c0 Level-0 table #55: 0 bytes OK
2026/06/14-22:52:09.923646 7f29d4feb6c0 Delete type=0 #53
2026/06/14-22:52:09.923831 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/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)
+1 -1
View File
@@ -1 +1 @@
MANIFEST-000040
MANIFEST-000052
+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:49:59.185177 7f29d5fed6c0 Recovering log #50
2026/06/14-22:49:59.194849 7f29d5fed6c0 Delete type=3 #48
2026/06/14-22:49:59.194912 7f29d5fed6c0 Delete type=0 #50
2026/06/14-22:52:09.979071 7f29d4feb6c0 Level-0 table #55: started
2026/06/14-22:52:09.979102 7f29d4feb6c0 Level-0 table #55: 0 bytes OK
2026/06/14-22:52:09.985673 7f29d4feb6c0 Delete type=0 #53
2026/06/14-22:52:10.010878 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/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)
+1 -1
View File
@@ -1 +1 @@
MANIFEST-000040
MANIFEST-000052
+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:49:59.128336 7f29d5fed6c0 Recovering log #50
2026/06/14-22:49:59.138475 7f29d5fed6c0 Delete type=3 #48
2026/06/14-22:49:59.138521 7f29d5fed6c0 Delete type=0 #50
2026/06/14-22:52:09.937223 7f29d4feb6c0 Level-0 table #55: started
2026/06/14-22:52:09.937263 7f29d4feb6c0 Level-0 table #55: 0 bytes OK
2026/06/14-22:52:09.944028 7f29d4feb6c0 Delete type=0 #53
2026/06/14-22:52:09.951911 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/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)
+1 -1
View File
@@ -1 +1 @@
MANIFEST-000040
MANIFEST-000052
+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:49:59.141353 7f29d6fef6c0 Recovering log #50
2026/06/14-22:49:59.151373 7f29d6fef6c0 Delete type=3 #48
2026/06/14-22:49:59.151426 7f29d6fef6c0 Delete type=0 #50
2026/06/14-22:52:09.944165 7f29d4feb6c0 Level-0 table #55: started
2026/06/14-22:52:09.944196 7f29d4feb6c0 Level-0 table #55: 0 bytes OK
2026/06/14-22:52:09.951751 7f29d4feb6c0 Delete type=0 #53
2026/06/14-22:52:09.952015 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/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)
+1 -1
View File
@@ -1 +1 @@
MANIFEST-000040
MANIFEST-000052
+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:49:59.045733 7f29d57ec6c0 Recovering log #50
2026/06/14-22:49:59.056842 7f29d57ec6c0 Delete type=3 #48
2026/06/14-22:49:59.056897 7f29d57ec6c0 Delete type=0 #50
2026/06/14-22:52:09.896535 7f29d4feb6c0 Level-0 table #55: started
2026/06/14-22:52:09.896595 7f29d4feb6c0 Level-0 table #55: 0 bytes OK
2026/06/14-22:52:09.903914 7f29d4feb6c0 Delete type=0 #53
2026/06/14-22:52:09.923752 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/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)
+1 -1
View File
@@ -1 +1 @@
MANIFEST-000040
MANIFEST-000052
+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:49:59.154286 7f29d5fed6c0 Recovering log #50
2026/06/14-22:49:59.165791 7f29d5fed6c0 Delete type=3 #48
2026/06/14-22:49:59.165837 7f29d5fed6c0 Delete type=0 #50
2026/06/14-22:52:09.952102 7f29d4feb6c0 Level-0 table #55: started
2026/06/14-22:52:09.952142 7f29d4feb6c0 Level-0 table #55: 0 bytes OK
2026/06/14-22:52:09.958682 7f29d4feb6c0 Delete type=0 #53
2026/06/14-22:52:09.978831 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/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)
+1 -1
View File
@@ -1 +1 @@
MANIFEST-000018
MANIFEST-000030
+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:49:59.169462 7f29d5fed6c0 Recovering log #28
2026/06/14-22:49:59.179433 7f29d5fed6c0 Delete type=3 #26
2026/06/14-22:49:59.179471 7f29d5fed6c0 Delete type=0 #28
2026/06/14-22:52:09.985789 7f29d4feb6c0 Level-0 table #33: started
2026/06/14-22:52:09.985816 7f29d4feb6c0 Level-0 table #33: 0 bytes OK
2026/06/14-22:52:09.992966 7f29d4feb6c0 Delete type=0 #31
2026/06/14-22:52:10.010894 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:52:10.011012 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/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)
+1 -1
View File
@@ -1 +1 @@
MANIFEST-000040
MANIFEST-000052
+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:49:59.113546 7f29d67ee6c0 Recovering log #50
2026/06/14-22:49:59.125289 7f29d67ee6c0 Delete type=3 #48
2026/06/14-22:49:59.125333 7f29d67ee6c0 Delete type=0 #50
2026/06/14-22:52:09.930699 7f29d4feb6c0 Level-0 table #55: started
2026/06/14-22:52:09.930727 7f29d4feb6c0 Level-0 table #55: 0 bytes OK
2026/06/14-22:52:09.937112 7f29d4feb6c0 Delete type=0 #53
2026/06/14-22:52:09.951899 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/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)
+1 -1
View File
@@ -1 +1 @@
MANIFEST-000059
MANIFEST-000072
+7 -7
View File
@@ -1,7 +1,7 @@
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:49:59.198719 7f29d57ec6c0 Recovering log #69
2026/06/14-22:49:59.210387 7f29d57ec6c0 Delete type=3 #67
2026/06/14-22:49:59.210425 7f29d57ec6c0 Delete type=0 #69
2026/06/14-22:52:09.958777 7f29d4feb6c0 Level-0 table #75: started
2026/06/14-22:52:09.958803 7f29d4feb6c0 Level-0 table #75: 0 bytes OK
2026/06/14-22:52:09.965059 7f29d4feb6c0 Delete type=0 #73
2026/06/14-22:52:09.978852 7f29d4feb6c0 Manual compaction at level-0 from '!scenes!2C6gyZpvPxWlsVZi' @ 72057594037927935 : 1 .. '!scenes.levels!olYe9bhuXwRWQ8j7.defaultLevel0000' @ 0 : 0; will stop at (end)
+14 -7
View File
@@ -1,7 +1,14 @@
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/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)
Binary file not shown.
Binary file not shown.
+1 -1
View File
@@ -1 +1 @@
MANIFEST-000040
MANIFEST-000052
+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:49:59.060460 7f29d5fed6c0 Recovering log #50
2026/06/14-22:49:59.070829 7f29d5fed6c0 Delete type=3 #48
2026/06/14-22:49:59.070872 7f29d5fed6c0 Delete type=0 #50
2026/06/14-22:52:09.904026 7f29d4feb6c0 Level-0 table #55: started
2026/06/14-22:52:09.904053 7f29d4feb6c0 Level-0 table #55: 0 bytes OK
2026/06/14-22:52:09.910627 7f29d4feb6c0 Delete type=0 #53
2026/06/14-22:52:09.923769 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/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)
+1 -1
View File
@@ -1 +1 @@
MANIFEST-000040
MANIFEST-000052
+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:49:59.074203 7f29d57ec6c0 Recovering log #50
2026/06/14-22:49:59.085196 7f29d57ec6c0 Delete type=3 #48
2026/06/14-22:49:59.085240 7f29d57ec6c0 Delete type=0 #50
2026/06/14-22:52:09.923913 7f29d4feb6c0 Level-0 table #55: started
2026/06/14-22:52:09.923940 7f29d4feb6c0 Level-0 table #55: 0 bytes OK
2026/06/14-22:52:09.930579 7f29d4feb6c0 Delete type=0 #53
2026/06/14-22:52:09.951882 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/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)
+1 -1
View File
@@ -1 +1 @@
MANIFEST-000040
MANIFEST-000052
+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:49:59.087477 7f29d67ee6c0 Recovering log #50
2026/06/14-22:49:59.097614 7f29d67ee6c0 Delete type=3 #48
2026/06/14-22:49:59.097669 7f29d67ee6c0 Delete type=0 #50
2026/06/14-22:52:09.910724 7f29d4feb6c0 Level-0 table #55: started
2026/06/14-22:52:09.910751 7f29d4feb6c0 Level-0 table #55: 0 bytes OK
2026/06/14-22:52:09.917084 7f29d4feb6c0 Delete type=0 #53
2026/06/14-22:52:09.923779 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/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)
+2
View File
@@ -28,6 +28,7 @@ import { CDEItemSheet, CDEKungfuSheet, CDESpellSheet, CDESupernaturalSheet, CDEW
import { CDELoksyuApp } from "./ui/apps/loksyu-app.js"
import { CDETinjiApp } from "./ui/apps/tinji-app.js"
import { CDEWheelApp } from "./ui/apps/wheel-app.js"
import { registerSingletonSocket } from "./ui/apps/singletons.js"
import { injectRollActions, refreshAllRollActions } from "./ui/roll-actions.js"
import { CDECombat } from "./documents/combat.js"
import { showWelcomeMessage, injectWelcomeActions } from "./ui/apps/welcome.js"
@@ -144,6 +145,7 @@ Hooks.once("ready", async () => {
await migrateIfNeeded()
await loadWelcomeSceneIfNeeded()
CDEWheelApp.registerHooks()
registerSingletonSocket()
if (game.user.isGM) showWelcomeMessage()
})
+14
View File
@@ -43,6 +43,9 @@ export class CDELoksyuApp extends foundry.applications.api.HandlebarsApplication
/** @type {Function|null} bound hook handler */
_updateHook = null
/** @type {Function|null} updateSetting hook handler (for socket-propagated writes) */
_settingHook = null
/** Singleton accessor — open or bring to front */
static open() {
const existing = Array.from(foundry.applications.instances.values()).find(
@@ -78,14 +81,25 @@ export class CDELoksyuApp extends foundry.applications.api.HandlebarsApplication
super._onRender(context, options)
this.#bindInputs()
if (!this._updateHook) {
this._updateHook = Hooks.on("cde:loksyuUpdated", () => this.render())
}
if (!this._settingHook) {
this._settingHook = Hooks.on("updateSetting", (setting) => {
if (setting.key === `${SYSTEM_ID}.loksyuData`) this.render()
})
}
}
_onClose(options) {
if (this._updateHook !== null) {
Hooks.off("cde:loksyuUpdated", this._updateHook)
this._updateHook = null
}
if (this._settingHook !== null) {
Hooks.off("updateSetting", this._settingHook)
this._settingHook = null
}
super._onClose(options)
}
+107 -10
View File
@@ -15,10 +15,14 @@
* Loksyu / TinJi settings-based helpers.
*
* Data is stored as world settings instead of singleton Actor documents.
* Socket-based replication allows non-GM players to update Loksyu and
* TinJi the GM processes the actual writes.
*/
import { SYSTEM_ID, WU_XING_CYCLE, ASPECT_FACES } from "../../config/constants.js"
const SOCKET_CHANNEL = `system.${SYSTEM_ID}`
/** Read the current loksyu data object from world settings */
export function getLoksyuData() {
return game.settings.get(SYSTEM_ID, "loksyuData") ?? {
@@ -26,27 +30,112 @@ export function getLoksyuData() {
}
}
/** Write the loksyu data object to world settings */
export async function setLoksyuData(data) {
/** Write the loksyu data object to world settings (GM only). */
async function writeLoksyuData(data) {
await game.settings.set(SYSTEM_ID, "loksyuData", data)
Hooks.callAll("cde:loksyuUpdated", data)
}
/** Write TinJi value to world settings (GM only). */
async function writeTinjiValue(value) {
value = Math.max(0, value)
await game.settings.set(SYSTEM_ID, "tinjiData", value)
Hooks.callAll("cde:tinjiUpdated", value)
}
/** Write the loksyu data object — non-GM emits via socket. */
export async function setLoksyuData(data) {
if (game.user.isGM) return writeLoksyuData(data)
game.socket.emit(SOCKET_CHANNEL, { action: "setLoksyuData", data })
}
/** Read current TinJi value from world settings */
export function getTinjiValue() {
return game.settings.get(SYSTEM_ID, "tinjiData") ?? 0
}
/** Write TinJi value to world settings */
/** Write TinJi value — non-GM emits via socket. */
export async function setTinjiValue(value) {
await game.settings.set(SYSTEM_ID, "tinjiData", Math.max(0, value))
Hooks.callAll("cde:tinjiUpdated", Math.max(0, value))
if (game.user.isGM) return writeTinjiValue(value)
game.socket.emit(SOCKET_CHANNEL, { action: "setTinjiValue", value })
}
/**
* Non-GM: request an atomic Loksyu die draw via socket. The GM reads
* current state, decrements, and writes avoiding stale-read races.
*/
export function requestLoksyuDraw(aspect, order) {
game.socket.emit(SOCKET_CHANNEL, { action: "loksyuDraw", aspect, order })
}
/**
* Non-GM: request an atomic TinJi spend via socket. The GM reads current
* value, decrements if > 0, and writes.
*/
export function requestTinjiSpend() {
game.socket.emit(SOCKET_CHANNEL, { action: "tinjiSpend" })
}
/**
* Register the socket listener that processes Loksyu/TinJi write requests
* from non-GM clients. Only the GM actually performs the writes; other
* clients ignore the message.
*
* Must be called after the `ready` hook (when game.socket is available).
*/
export function registerSingletonSocket() {
game.socket.on(SOCKET_CHANNEL, async (payload) => {
if (!game.user.isGM) return
switch (payload.action) {
case "setLoksyuData":
await writeLoksyuData(payload.data)
break
case "setTinjiValue":
await writeTinjiValue(payload.value)
break
case "updateLoksyuFromRoll":
await updateLoksyuFromRoll(payload.activeAspect, payload.faces)
break
case "updateTinjiFromRoll":
await updateTinjiFromRoll(payload.delta)
break
case "loksyuDraw": {
const data = getLoksyuData()
const entry = data[payload.aspect] ?? { yin: 0, yang: 0 }
const order = payload.order ?? "yang-first"
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--
else entry.yin--
}
data[payload.aspect] = entry
await writeLoksyuData(data)
break
}
case "tinjiSpend": {
const cur = getTinjiValue()
if (cur > 0) await writeTinjiValue(cur - 1)
break
}
}
})
}
/**
* After a WuXing roll, add the loksyu faces (yin + yang) of the relevant
* aspect to the loksyu settings data.
*
* Non-GM: emits raw activeAspect+faces via socket so the GM recomputes
* from current state avoids stale-read races when two players roll
* simultaneously.
*
* @param {string} activeAspect - e.g. "fire"
* @param {Object} faces - Die face counts { 0: n, 1: n, , 9: n }
*/
@@ -62,22 +151,30 @@ export async function updateLoksyuFromRoll(activeAspect, faces) {
const yangCount = faces[yangFace] ?? 0
if (yinCount === 0 && yangCount === 0) return
if (game.user.isGM) {
const data = getLoksyuData()
const current = data[lokAspect] ?? { yin: 0, yang: 0 }
data[lokAspect] = {
yin: (current.yin ?? 0) + yinCount,
yang: (current.yang ?? 0) + yangCount,
data[lokAspect] = { yin: (current.yin ?? 0) + yinCount, yang: (current.yang ?? 0) + yangCount }
await writeLoksyuData(data)
} else {
game.socket.emit(SOCKET_CHANNEL, { action: "updateLoksyuFromRoll", activeAspect, faces })
}
await setLoksyuData(data)
}
/**
* After a WuXing roll, add tinji faces to the TinJi settings.
*
* Non-GM: emits delta via socket so the GM adds to the current value
* atomically.
*
* @param {number} count - Number of tinji faces rolled
*/
export async function updateTinjiFromRoll(count) {
if (!count || count <= 0) return
if (game.user.isGM) {
const current = getTinjiValue()
await setTinjiValue(current + count)
await writeTinjiValue(current + count)
} else {
game.socket.emit(SOCKET_CHANNEL, { action: "updateTinjiFromRoll", delta: count })
}
}
+14
View File
@@ -44,6 +44,9 @@ export class CDETinjiApp extends foundry.applications.api.HandlebarsApplicationM
/** @type {Function|null} */
_updateHook = null
/** @type {Function|null} */
_settingHook = null
static open() {
const existing = Array.from(foundry.applications.instances.values()).find(
(app) => app instanceof CDETinjiApp
@@ -64,14 +67,25 @@ export class CDETinjiApp extends foundry.applications.api.HandlebarsApplicationM
_onRender(context, options) {
super._onRender(context, options)
this.#bindDirectInput()
if (!this._updateHook) {
this._updateHook = Hooks.on("cde:tinjiUpdated", () => this.render())
}
if (!this._settingHook) {
this._settingHook = Hooks.on("updateSetting", (setting) => {
if (setting.key === `${SYSTEM_ID}.tinjiData`) this.render()
})
}
}
_onClose(options) {
if (this._updateHook !== null) {
Hooks.off("cde:tinjiUpdated", this._updateHook)
this._updateHook = null
}
if (this._settingHook !== null) {
Hooks.off("updateSetting", this._settingHook)
this._settingHook = null
}
super._onClose(options)
}
+11 -5
View File
@@ -20,7 +20,7 @@
* with the new counts, without creating noise.
*/
import { getLoksyuData, setLoksyuData, getTinjiValue, setTinjiValue } from "./apps/singletons.js"
import { getLoksyuData, setLoksyuData, getTinjiValue, setTinjiValue, requestLoksyuDraw, requestTinjiSpend } from "./apps/singletons.js"
import { SYSTEM_ID, WU_XING_CYCLE, ASPECT_LABELS, ASPECT_ICONS } from "../config/constants.js"
const RESULT_TEMPLATE = "systems/fvtt-chroniques-de-l-etrange/templates/form/cde-dice-result.html"
@@ -53,9 +53,8 @@ function refreshRollActions(rollCard, aspect, message) {
const successAvail = (loksyu[aspect]?.yin ?? 0) + (loksyu[aspect]?.yang ?? 0)
const fasteAvail = (loksyu[fasteAspect]?.yin ?? 0) + (loksyu[fasteAspect]?.yang ?? 0)
const isGM = game.user.isGM
const hasSomething = successAvail > 0 || fasteAvail > 0 || (isGM && tinji > 0)
const hasSomething = successAvail > 0 || fasteAvail > 0 || tinji > 0
if (!hasSomething) return
const aspLabel = game.i18n.localize(ASPECT_LABELS[aspect])
@@ -79,7 +78,7 @@ function refreshRollActions(rollCard, aspect, message) {
</button>`
}
if (isGM && tinji > 0) {
if (tinji > 0) {
btns += `<button class="cde-roll-action-btn cde-roll-action--tinji" data-action="tinji">
<span class="cde-roll-action-tinji-char"></span>
<span class="cde-roll-action-label">${game.i18n.localize("CDE.TinJi2")}</span>
@@ -149,7 +148,11 @@ async function _drawFromLoksyu(message, aspect, type, aspectLabel) {
else entry.yin--
}
data[aspect] = entry
if (game.user.isGM) {
await setLoksyuData(data)
} else {
requestLoksyuDraw(aspect, order)
}
// Update the roll-result message in-place if it has stored flags
const flags = message?.flags?.[SYSTEM_ID]
@@ -200,13 +203,16 @@ async function _drawFromLoksyu(message, aspect, type, aspectLabel) {
* Spend 1 Tin Ji point (GM only) and post a notification.
*/
async function _spendTinjiPostRoll() {
if (!game.user.isGM) return
const current = getTinjiValue()
if (current <= 0) {
ui.notifications.warn(game.i18n.localize("CDE.TinjiEmpty"))
return
}
if (game.user.isGM) {
await setTinjiValue(current - 1)
} else {
requestTinjiSpend()
}
await ChatMessage.create({
user: game.user.id,
content: `<div class="cde-tinji-spend-msg">
+2 -1
View File
@@ -1,6 +1,7 @@
{
"id": "fvtt-chroniques-de-l-etrange",
"version": "13.0.0",
"socket": true,
"title": "Les Chroniques de l'Étrange",
"url": "https://www.uberwald.me/gitea/uberwald/fvtt-chroniques-de-l-etrange",
"description": "Game system for Les Chroniques de l'Étrange, from Antre-Monde éditions",
@@ -245,7 +246,7 @@
}
},
"compatibility": {
"minimum": "13",
"minimum": "14",
"verified": "14"
},
"relationships": {},