12 Commits

Author SHA1 Message Date
uberwald 6a0f43d45a Use folders
Release Creation / build (release) Successful in 44s
2026-06-08 22:45:11 +02:00
uberwald 19f8e6484d Use folders
Release Creation / build (release) Failing after 43s
2026-06-08 22:34:49 +02:00
uberwald 1286ca663e Use folders
Release Creation / build (release) Successful in 50s
2026-06-08 22:31:31 +02:00
uberwald 3fe5df7390 Use folders 2026-06-08 22:31:10 +02:00
uberwald 9ee6545a3c Various fixes for official release 2026-06-08 22:21:25 +02:00
uberwald 3851a38c9f Various fixes for official release 2026-06-08 22:20:44 +02:00
uberwald 7623123bb5 Fix load/Capacity 2026-06-07 21:32:05 +02:00
uberwald 2fb6bfe444 FIx map
Release Creation / build (release) Successful in 40s
2026-06-02 19:44:57 +02:00
uberwald 53b7e8cc9d Enhance text style 2026-05-29 23:03:37 +02:00
uberwald 7f758afa56 Fix CSS issues and add omen re-roll function
Release Creation / build (release) Successful in 42s
2026-05-23 09:19:32 +02:00
uberwald 7beda6c331 Fix CSS issues and add omen re-roll function 2026-05-23 08:48:29 +02:00
uberwald 12bf771e9d Fixes around character sheets and buttons
Release Creation / build (release) Successful in 44s
2026-05-19 13:30:05 +02:00
139 changed files with 1675 additions and 1089 deletions
+10 -10
View File
@@ -50,13 +50,13 @@ jobs:
system.json
api_key: "${{secrets.ALLOW_PUSH_RELEASE}}"
#- name: Publish to Foundry server
# uses: djlechuck/foundryvtt-publish-package-action@v1
# with:
# token: ${{ secrets.FOUNDRYVTT_RELEASE_TOKEN }}
# id: fvtt-machine-gods-noxian-expanse
# version: ${{github.event.release.tag_name}}
# manifest: 'https://www.uberwald.me/gitea/public/uberwald/fvtt-machine-gods-noxian-expanse/releases/download/latest/system.json'
# notes: 'https://www.uberwald.me/gitea/uberwald/fvtt-machine-gods-noxian-expanse/releases/download/${{github.event.release.tag_name}}/fvtt-machine-gods-noxian-expanse.zip'
# compatibility-minimum: '13'
# compatibility-verified: '13'
- name: Publish to Foundry server
uses: djlechuck/foundryvtt-publish-package-action@v1
with:
token: ${{ secrets.FOUNDRYVTT_RELEASE_TOKEN }}
id: fvtt-machine-gods-noxian-expanse
version: ${{github.event.release.tag_name}}
manifest: 'https://www.uberwald.me/gitea/uberwald/fvtt-machine-gods-noxian-expanse/releases/download/${{github.event.release.tag_name}}/system.json'
notes: 'https://www.uberwald.me/gitea/uberwald/fvtt-machine-gods-noxian-expanse/releases/download/${{github.event.release.tag_name}}/fvtt-machine-gods-noxian-expanse.zip'
compatibility-minimum: '14'
compatibility-verified: '14'
+1
View File
@@ -1,3 +1,4 @@
.github/
rules/
node_modules/
.history/
-94
View File
@@ -1,94 +0,0 @@
{
"id": "fvtt-machine-gods-noxian-expanse",
"title": "Machine Gods of the Noxian Expanse",
"description": "Foundry VTT system for Machine Gods of the Noxian Expanse.",
"version": "14..0",
"authors": [
{
"name": "Uberwald"
}
],
"compatibility": {
"minimum": "13",
"verified": "14"
},
"esmodules": [
"fvtt-machine-gods-noxian-expanse.mjs"
],
"styles": [
"css/mgne.css"
],
"languages": [
{
"lang": "en",
"name": "English",
"path": "lang/en.json"
}
],
"documentTypes": {
"Actor": {
"character": {
"htmlFields": [
"description",
"notes"
]
},
"creature": {
"htmlFields": [
"description",
"special",
"notes"
]
},
"companion": {
"htmlFields": [
"description",
"notes"
]
}
},
"Item": {
"weapon": {
"htmlFields": [
"description"
]
},
"armor": {
"htmlFields": [
"description"
]
},
"shield": {
"htmlFields": [
"description"
]
},
"equipment": {
"htmlFields": [
"description"
]
},
"resonance-core": {
"htmlFields": [
"description"
]
},
"artifact": {
"htmlFields": [
"description"
]
},
"feature": {
"htmlFields": [
"description"
]
}
}
},
"grid": {
"distance": 10,
"units": "ft"
},
"primaryTokenAttribute": "hp",
"socket": false
}
-94
View File
@@ -1,94 +0,0 @@
{
"id": "fvtt-machine-gods-noxian-expanse",
"title": "Machine Gods of the Noxian Expanse",
"description": "Foundry VTT system for Machine Gods of the Noxian Expanse.",
"version": "14..0",
"authors": [
{
"name": "Uberwald"
}
],
"compatibility": {
"minimum": "13",
"verified": "14"
},
"esmodules": [
"fvtt-machine-gods-noxian-expanse.mjs"
],
"styles": [
"css/mgne.css"
],
"languages": [
{
"lang": "en",
"name": "English",
"path": "lang/en.json"
}
],
"documentTypes": {
"Actor": {
"character": {
"htmlFields": [
"description",
"notes"
]
},
"creature": {
"htmlFields": [
"description",
"special",
"notes"
]
},
"companion": {
"htmlFields": [
"description",
"notes"
]
}
},
"Item": {
"weapon": {
"htmlFields": [
"description"
]
},
"armor": {
"htmlFields": [
"description"
]
},
"shield": {
"htmlFields": [
"description"
]
},
"equipment": {
"htmlFields": [
"description"
]
},
"resonance-core": {
"htmlFields": [
"description"
]
},
"artifact": {
"htmlFields": [
"description"
]
},
"feature": {
"htmlFields": [
"description"
]
}
}
},
"grid": {
"distance": 10,
"units": "ft"
},
"primaryTokenAttribute": "hp",
"socket": false
}
-94
View File
@@ -1,94 +0,0 @@
{
"id": "fvtt-machine-gods-noxian-expanse",
"title": "Machine Gods of the Noxian Expanse",
"description": "Foundry VTT system for Machine Gods of the Noxian Expanse.",
"version": "14.0.0",
"authors": [
{
"name": "Uberwald"
}
],
"compatibility": {
"minimum": "13",
"verified": "14"
},
"esmodules": [
"fvtt-machine-gods-noxian-expanse.mjs"
],
"styles": [
"css/mgne.css"
],
"languages": [
{
"lang": "en",
"name": "English",
"path": "lang/en.json"
}
],
"documentTypes": {
"Actor": {
"character": {
"htmlFields": [
"description",
"notes"
]
},
"creature": {
"htmlFields": [
"description",
"special",
"notes"
]
},
"companion": {
"htmlFields": [
"description",
"notes"
]
}
},
"Item": {
"weapon": {
"htmlFields": [
"description"
]
},
"armor": {
"htmlFields": [
"description"
]
},
"shield": {
"htmlFields": [
"description"
]
},
"equipment": {
"htmlFields": [
"description"
]
},
"resonance-core": {
"htmlFields": [
"description"
]
},
"artifact": {
"htmlFields": [
"description"
]
},
"feature": {
"htmlFields": [
"description"
]
}
}
},
"grid": {
"distance": 10,
"units": "ft"
},
"primaryTokenAttribute": "hp",
"socket": false
}
-94
View File
@@ -1,94 +0,0 @@
{
"id": "fvtt-machine-gods-noxian-expanse",
"title": "Machine Gods of the Noxian Expanse",
"description": "Foundry VTT system for Machine Gods of the Noxian Expanse.",
"version": "14.0.0",
"authors": [
{
"name": "Uberwald"
}
],
"compatibility": {
"minimum": "14",
"verified": "14"
},
"esmodules": [
"fvtt-machine-gods-noxian-expanse.mjs"
],
"styles": [
"css/mgne.css"
],
"languages": [
{
"lang": "en",
"name": "English",
"path": "lang/en.json"
}
],
"documentTypes": {
"Actor": {
"character": {
"htmlFields": [
"description",
"notes"
]
},
"creature": {
"htmlFields": [
"description",
"special",
"notes"
]
},
"companion": {
"htmlFields": [
"description",
"notes"
]
}
},
"Item": {
"weapon": {
"htmlFields": [
"description"
]
},
"armor": {
"htmlFields": [
"description"
]
},
"shield": {
"htmlFields": [
"description"
]
},
"equipment": {
"htmlFields": [
"description"
]
},
"resonance-core": {
"htmlFields": [
"description"
]
},
"artifact": {
"htmlFields": [
"description"
]
},
"feature": {
"htmlFields": [
"description"
]
}
}
},
"grid": {
"distance": 10,
"units": "ft"
},
"primaryTokenAttribute": "hp",
"socket": false
}
-94
View File
@@ -1,94 +0,0 @@
{
"id": "fvtt-machine-gods-noxian-expanse",
"title": "Machine Gods of the Noxian Expanse",
"description": "Foundry VTT system for Machine Gods of the Noxian Expanse.",
"version": "14.0.0",
"authors": [
{
"name": "Uberwald"
}
],
"compatibility": {
"minimum": "14",
"verified": "14"
},
"esmodules": [
"fvtt-machine-gods-noxian-expanse.mjs"
],
"styles": [
"css/mgne.css"
],
"languages": [
{
"lang": "en",
"name": "English",
"path": "lang/en.json"
}
],
"documentTypes": {
"Actor": {
"character": {
"htmlFields": [
"description",
"notes"
]
},
"creature": {
"htmlFields": [
"description",
"special",
"notes"
]
},
"companion": {
"htmlFields": [
"description",
"notes"
]
}
},
"Item": {
"weapon": {
"htmlFields": [
"description"
]
},
"armor": {
"htmlFields": [
"description"
]
},
"shield": {
"htmlFields": [
"description"
]
},
"equipment": {
"htmlFields": [
"description"
]
},
"resonance-core": {
"htmlFields": [
"description"
]
},
"artifact": {
"htmlFields": [
"description"
]
},
"feature": {
"htmlFields": [
"description"
]
}
}
},
"grid": {
"distance": 10,
"units": "ft"
},
"primaryTokenAttribute": "hp",
"socket": false
}
+13
View File
@@ -0,0 +1,13 @@
This is the official Foundry module for Machine Gods of the Noxian Expanse
Core Rules https://blackoathgames.com/machine-gods-of-the-noxian-expanse
In this release, you will find:
- All the necessary tools to create your Reclaimer and get them ready to explore the Expanse
- Tools to set up a game of Machine Gods, with everything in place to add your own gear, creatures, and more
- Automated rolls for all the core functionality of the game (Ability checks, Resonance Cores, Weapons, etc.)
- Full support for the game's mechanics, based on Mörk Borg
A game by Blackoath Entertainment https://blackoathgames.com/
Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

+452 -213
View File
File diff suppressed because it is too large Load Diff
+109 -4
View File
@@ -73,10 +73,50 @@ Hooks.once("init", () => {
Hooks.once("setup", () => {
localizeSystemConfig()
})
Hooks.once("ready", () => {
// Strip phantom null-_id entries from all compendium indices.
// Foundry V14 LevelDatabase creates !items!null entries on open under Node24.
if (typeof CompendiumCollection !== "undefined") {
const orig = CompendiumCollection.prototype.getIndex;
CompendiumCollection.prototype.getIndex = async function(opts) {
const r = await orig.call(this, opts);
for (const k of [...this.index.keys()]) { if (!k) this.index.delete(k); }
return r;
};
}
});
Hooks.once("ready", async () => {
console.info(`${SYSTEM_ID} | Ready`)
// Clean anything already in the index before we patched
for (const pack of game.packs) {
for (const k of [...pack.index.keys()]) { if (!k) pack.index.delete(k); }
}
if (!game.user.isGM) return
if (game.scenes.getName("Noxian Expanse")) return
const pack = game.packs.get("fvtt-machine-gods-noxian-expanse.scenes")
if (!pack) {
console.warn(`${SYSTEM_ID} | Scenes compendium not found`)
return
}
const index = await pack.getIndex()
const entry = index.find(s => s.name === "Noxian Expanse")
if (!entry) {
console.warn(`${SYSTEM_ID} | Noxian Expanse scene not found in compendium`)
return
}
const doc = await pack.getDocument(entry._id)
if (doc) {
const scene = await Scene.create(doc.toObject(), { keepId: false })
if (scene) {
await scene.activate()
}
}
})
Hooks.on("deleteCombat", (combat) => {
@@ -92,7 +132,7 @@ Hooks.on("deleteCombat", (combat) => {
if (!cores.length) return
const lines = cores.map(c => `<li><strong>${c.parent.name}</strong> — ${c.name} (${c.system.usageDie})</li>`).join("")
ChatMessage.create({
content: `<article class="mgne-chat-card mode-check"><div class="chat-card-body"><p class="chat-special">⚙️ ${game.i18n.localize("MGNE.Notification.RollUsageDiceReminder")}</p><ul style="margin:.3rem 0 0 1rem;padding:0">${lines}</ul></div></article>`,
content: `<article class="mgne-chat-card"><div class="chat-card-body" style="color:#ccb292;font-size:0.72rem;line-height:1.4"><p style="margin:0">⚙️ ${game.i18n.localize("MGNE.Notification.RollUsageDiceReminder")}</p><ul style="margin:.3rem 0 0 1rem;padding:0;color:#ccb292;font-size:0.72rem">${lines}</ul></div></article>`,
})
})
@@ -146,6 +186,67 @@ Hooks.on("renderChatMessageHTML", (message, element) => {
})
})
root.querySelectorAll(".mgne-omen-reroll-btn").forEach(btn => {
btn.addEventListener("click", async () => {
const actorId = btn.dataset.actorId
const actor = game.actors.get(actorId)
if (!actor) {
ui.notifications.warn(game.i18n.localize("MGNE.Notification.ActorNotFound"))
return
}
const currentOmens = actor.system.omens?.current ?? 0
if (currentOmens === 0) {
ui.notifications.warn(game.i18n.localize("MGNE.Notification.NoOmensLeft"))
return
}
// Save original state for rollback
const originalOmens = currentOmens
// Disable button and show loading state
const originalInnerHTML = btn.innerHTML
btn.disabled = true
btn.innerHTML = '<i class="fa-solid fa-star"></i> ' + game.i18n.localize("MGNE.Common.Processing")
try {
// Spend the omen
await actor.update({ "system.omens.current": Math.max(0, currentOmens - 1) })
// Re-roll with the same parameters
const abilityId = btn.dataset.abilityId
const label = btn.dataset.label
const baseDR = parseInt(btn.dataset.baseDr ?? "12", 10)
const modifier = parseInt(btn.dataset.modifier ?? "0", 10)
const rollType = btn.dataset.rollType ?? "check"
const itemId = btn.dataset.itemId
const item = itemId ? actor.items.get(itemId) : null
await MGNERoll.promptCheck({
actor,
abilityId,
label,
baseDR,
modifier,
rollType,
item,
})
} catch (error) {
// Rollback omen spend on error
const currentOmensAfterError = actor.system.omens?.current ?? 0
if (currentOmensAfterError < originalOmens) {
await actor.update({ "system.omens.current": originalOmens })
}
ui.notifications.error(game.i18n.localize("MGNE.Notification.RollError"))
console.error("Omen re-roll failed:", error)
} finally {
// Restore button state
btn.disabled = false
btn.innerHTML = originalInnerHTML
}
})
})
root.querySelectorAll(".mgne-apply-damage-select").forEach(select => {
const isAllowed = game.user.isGM || message.isAuthor
if (!isAllowed) {
@@ -156,6 +257,7 @@ Hooks.on("renderChatMessageHTML", (message, element) => {
const card = select.closest(".mgne-chat-card")
const damageTotal = parseInt(card?.dataset.damageTotal ?? "0", 10) || 0
const damageCritical = card?.dataset.damageCritical === "true"
const targetActorId = card?.dataset.targetActorId ?? null
const tokens = canvas.scene?.tokens.contents ?? []
for (const token of tokens) {
@@ -163,6 +265,9 @@ Hooks.on("renderChatMessageHTML", (message, element) => {
const opt = document.createElement("option")
opt.value = token.id
opt.textContent = token.name
if (targetActorId && token.actor.id === targetActorId) {
opt.selected = true
}
select.appendChild(opt)
}
@@ -206,7 +311,7 @@ Hooks.on("renderChatMessageHTML", (message, element) => {
await ChatMessage.create({
speaker: ChatMessage.getSpeaker({ actor: targetActor }),
rolls: [reduceRoll],
content: `<article class="mgne-chat-card mode-check"><div class="chat-card-body"><p class="chat-special">${reduceMsg}</p></div></article>`,
content: `<article class="mgne-chat-card"><div class="chat-card-body"><p style="margin:0;color:#ccb292;font-size:0.72rem;line-height:1.4">${reduceMsg}</p></div></article>`,
})
}
}
+12
View File
@@ -115,6 +115,7 @@
"ArtifactSync": "Artifact Sync",
"CarryingCapacity": "Carrying Capacity",
"Load": "Load",
"CapacityModifier": "Carrying Capacity",
"Rations": "Rations",
"Kiffol": "Kiffol",
"Weapons": "Weapons",
@@ -223,6 +224,9 @@
"carryCapacity": {
"label": "Carrying Capacity"
},
"carryCapacityModifier": {
"label": "Capacity Modifier"
},
"rations": {
"label": "Rations"
},
@@ -452,6 +456,7 @@
"QuantityShort": "Qty",
"Range": "Range",
"Resonation": "Resonation",
"Processing": "Processing...",
"Roll": "Roll",
"No": "No",
"Subtype": "Subtype",
@@ -512,8 +517,11 @@
"StudyHelp": "Each action lowers the target number by 1, to a minimum of 2+."
},
"Notification": {
"ActorNotFound": "Actor not found.",
"ActorOrItemNotFound": "Actor or item not found for damage roll.",
"CannotSyncMore": "{actor} cannot synchronize any more artifacts today.",
"NoOmensLeft": "No omens left to spend!",
"RollError": "Failed to re-roll. Omen refunded.",
"ItemBroken": "{item} is broken.",
"ItemBurnedOut": "{item} is burned out.",
"ItemDepleted": "{item} is already depleted.",
@@ -585,6 +593,7 @@
"OutcomeSuccess": "Success",
"QuickRestLabel": "{actor} Takes a Quick Rest",
"RestoredHP": "Restored {amount} HP",
"RerollWithOmen": "Reroll with Omen",
"RollDamage": "Roll Damage",
"TakesDamageLabel": "{actor} Takes Damage",
"TargetName": "Target: {target}",
@@ -789,6 +798,9 @@
},
"featureId": {
"label": "Feature Id"
},
"capacity": {
"label": "Capacity"
}
}
},
+71 -14
View File
@@ -19,7 +19,12 @@
.window-header {
background:
linear-gradient(90deg, fade(@blood, 40%), fade(@ember, 18%) 25%, transparent 70%),
linear-gradient(
90deg,
fade(@blood, 40%),
fade(@ember, 18%) 25%,
transparent 70%
),
linear-gradient(180deg, color-mix(in srgb, @bg-char 80%, black), @bg-void);
border-bottom: 1px solid fade(@gold-acid, 35%);
color: @bone;
@@ -64,7 +69,11 @@
.window-content {
background:
radial-gradient(circle at top left, fade(@ember, 12%), transparent 28%),
radial-gradient(circle at top right, fade(@verdigris, 10%), transparent 24%),
radial-gradient(
circle at top right,
fade(@verdigris, 10%),
transparent 24%
),
linear-gradient(180deg, fade(@bg-char, 30%), fade(@bg-void, 28%)),
url("@{page-bg-url}") center top / cover no-repeat,
linear-gradient(180deg, @bg-char, @bg-void 120%);
@@ -107,8 +116,7 @@
border: 1px solid fade(@bone, 22%);
border-radius: @radius-sm;
background:
linear-gradient(180deg, fade(@bone, 4%), transparent 60%),
@bg-input;
linear-gradient(180deg, fade(@bone, 4%), transparent 60%), @bg-input;
color: @parchment;
padding: 0.4rem 0.52rem;
box-shadow: inset 0 1px 0 fade(white, 4%);
@@ -116,7 +124,9 @@
&:focus {
outline: none;
border-color: fade(@ember-bright, 70%);
box-shadow: 0 0 0 1px fade(@ember-bright, 25%), inset 0 1px 0 fade(white, 6%);
box-shadow:
0 0 0 1px fade(@ember-bright, 25%),
inset 0 1px 0 fade(white, 6%);
}
}
@@ -131,7 +141,10 @@
calc(100% - 11px) calc(50% - 2px),
calc(100% - 7px) calc(50% - 2px),
0 0;
background-size: 4px 4px, 4px 4px, auto;
background-size:
4px 4px,
4px 4px,
auto;
background-repeat: no-repeat;
}
@@ -147,16 +160,27 @@
.application.mgne label {
.caps-heading();
color: @label-ink;
color: @bone;
font-size: 0.74rem;
}
// Item sheets: dark labels for parchment backgrounds
.application.mgne.item-sheet label,
.application.mgne.item-sheet .item-form-row > label {
color: @bg-char;
}
.application.mgne fieldset {
.panel-shell();
.ornate-frame();
margin: 0;
}
// Character sheet: Rules Snapshot fieldset text - dark color for parchment bg
.application.mgne.character fieldset p {
color: @bg-char;
}
// ProseMirror / toggled editor inside fieldset — enforce contrast on dark bg
.application.mgne fieldset {
.editor,
@@ -168,9 +192,18 @@
}
.editor-content,
.ProseMirror {
p, li { color: lighten(@parchment, 8%); }
h1, h2, h3 { color: @gold-acid; }
.is-empty::before { color: fade(@gold-acid, 40%); }
p,
li {
color: lighten(@parchment, 8%);
}
h1,
h2,
h3 {
color: @gold-acid;
}
.is-empty::before {
color: fade(@gold-acid, 40%);
}
}
.editor-menu button {
color: @bone;
@@ -203,17 +236,17 @@
}
.application.mgne .empty-state {
color: fade(@ash, 94%);
color: @bg-char;
font-style: italic;
letter-spacing: 0.03em;
}
.application.mgne .rollable {
color: @ember-bright;
text-shadow: 0 0 12px fade(@ember, 18%);
color: lighten(@parchment, 8%);
text-shadow: 0 0 12px fade(@gold-acid, 18%);
&:hover {
color: lighten(@ember-bright, 10%);
color: lighten(@parchment, 12%);
}
}
@@ -243,3 +276,27 @@
opacity: 0.5;
}
}
// ============================================================
// PAUSE OVERLAY — replace default Foundry spinner with system logo
// ============================================================
#pause {
& > img {
content: url("../assets/ui/machine_god_skull.png");
animation: none;
width: 260px;
height: auto;
filter: drop-shadow(0 0 18px rgba(0, 0, 0, 0.8));
}
figcaption {
font-family: @font-display;
font-size: 2rem;
font-weight: bold;
color: @label-ink;
text-shadow:
0 0 10px rgba(0, 0, 0, 0.9),
1px 1px 2px #000;
letter-spacing: 2px;
}
}
+294 -105
View File
@@ -3,8 +3,8 @@
.ornate-frame();
display: flex;
flex-direction: column;
gap: 0.6rem;
padding: 0.68rem;
gap: 0.5rem;
padding: 0.62rem 0.68rem;
color: @iron;
background:
radial-gradient(circle at top right, fade(@verdigris, 10%), transparent 22%),
@@ -17,189 +17,351 @@
.mgne-chat-card .chat-card-header {
display: flex;
gap: 0.6rem;
gap: 0.55rem;
align-items: center;
padding-bottom: 0.4rem;
border-bottom: 1px solid fade(@gold-acid, 14%);
}
.mgne-chat-card .chat-card-header img {
width: 36px;
height: 36px;
width: 34px;
height: 34px;
object-fit: cover;
border-radius: 50%;
border: 1px solid fade(@gold-acid, 38%);
box-shadow: 0 0 0 2px fade(@parchment, 6%);
border: 1px solid fade(@gold-acid, 32%);
box-shadow: 0 0 0 2px fade(@parchment, 5%);
flex-shrink: 0;
}
.mgne-chat-card .chat-eyebrow {
display: none;
.mgne-chat-card .chat-header-text {
flex: 1;
min-width: 0;
display: flex;
flex-direction: column;
gap: 0.05rem;
}
.mgne-chat-card h3 {
.caps-heading();
margin: 0;
color: @label-ink;
font-size: 0.82rem;
}
.mgne-chat-card .chat-actor,
.mgne-chat-card .chat-subtitle,
.mgne-chat-card .chat-formula,
.mgne-chat-card .chat-special {
margin: 0;
color: darken(@label-ink, 22%);
font-size: 0.78rem;
line-height: 1.2;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.mgne-chat-card .chat-actor {
color: @iron;
margin: 0;
color: darken(@label-ink, 12%);
font-size: 0.68rem;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.mgne-chat-card .chat-formula {
color: @iron;
code {
color: @parchment;
background: fade(@bg-void, 75%);
padding: 0.1em 0.42em;
border-radius: 3px;
}
}
.mgne-chat-card .chat-result-line {
display: flex;
justify-content: space-between;
align-items: end;
padding: 0.38rem 0.55rem;
border: 1px solid fade(@gold-acid, 28%);
border-radius: @radius-sm;
background: fade(@bg-void, 78%);
}
.mgne-chat-card .chat-result-label {
.mgne-chat-card .chat-mode-badge {
.caps-heading();
font-size: 0.62rem;
color: @parchment;
font-size: 0.6rem;
letter-spacing: 0.1em;
padding: 0.15rem 0.45rem;
border-radius: 999px;
background: fade(@bg-void, 70%);
border: 1px solid fade(@bone, 22%);
color: @ash;
flex-shrink: 0;
line-height: 1.3;
}
.mgne-chat-card .chat-result-total {
font-family: @font-display;
font-size: 1.08rem;
color: @parchment;
.mgne-chat-card .chat-card-body {
display: flex;
flex-direction: column;
gap: 0.4rem;
}
.mgne-chat-card .chat-outcome,
.mgne-chat-card .chat-damage-total {
// Subtitle line
.mgne-chat-card .chat-subtitle {
margin: 0;
color: darken(@label-soft, 10%);
font-size: 0.72rem;
letter-spacing: 0.03em;
}
// Formula display
.mgne-chat-card .chat-formula-wrap {
display: flex;
align-items: center;
gap: 0.5rem;
padding: 0.25rem 0.5rem;
background: fade(@bg-void, 60%);
border-radius: @radius-sm;
border: 1px solid fade(@bone, 10%);
}
.mgne-chat-card .chat-formula-label {
.caps-heading();
font-size: 0.6rem;
color: @gold-acid;
letter-spacing: 0.08em;
flex-shrink: 0;
}
.mgne-chat-card .chat-formula-code {
font-family: "Courier New", monospace;
font-size: 0.76rem;
color: @parchment;
background: fade(@bg-void, 50%);
padding: 0.08rem 0.45rem;
border-radius: 3px;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
// Outcome display (check results, morale)
.mgne-chat-card .chat-outcome {
display: flex;
align-items: center;
gap: 0.5rem;
padding: 0.4rem 0.55rem;
border-radius: @radius-sm;
background: fade(@bg-void, 68%);
border-left: 3px solid fade(@ember-bright, 60%);
&.has-tooltip {
cursor: pointer;
user-select: none;
&:hover { filter: brightness(1.12); }
&:hover { filter: brightness(1.1); }
}
.chat-outcome-icon {
flex-shrink: 0;
font-size: 0.85rem;
width: 1.2rem;
text-align: center;
opacity: 0.8;
}
.chat-outcome-label {
.caps-heading();
flex: 1;
font-size: 0.72rem;
letter-spacing: 0.06em;
color: lighten(@ember-bright, 12%);
}
.chat-outcome-total {
font-family: @font-display;
font-size: 1.18rem;
font-weight: 700;
color: @parchment;
line-height: 1;
}
.chat-tooltip-icon {
opacity: 0.55;
font-size: 0.75em;
margin-left: 0.3rem;
vertical-align: middle;
opacity: 0.5;
font-size: 0.7rem;
margin-left: 0.15rem;
flex-shrink: 0;
transition: opacity 0.15s;
}
&.tooltip-open .chat-tooltip-icon { opacity: 1; }
}
// Damage total display
.mgne-chat-card .chat-damage-total {
display: flex;
align-items: center;
gap: 0.5rem;
padding: 0.45rem 0.6rem;
border-radius: @radius-sm;
background: fade(@bg-void, 68%);
border-left: 3px solid fade(@ember-bright, 60%);
&.has-tooltip {
cursor: pointer;
user-select: none;
&:hover { filter: brightness(1.1); }
}
.chat-damage-label {
.caps-heading();
font-size: 0.65rem;
letter-spacing: 0.06em;
color: @ash;
flex: 1;
}
.chat-damage-number {
font-family: @font-display;
font-size: 1.3rem;
font-weight: 700;
color: lighten(@ember-bright, 8%);
line-height: 1;
}
.chat-tooltip-icon {
opacity: 0.5;
font-size: 0.7rem;
flex-shrink: 0;
transition: opacity 0.15s;
}
&.tooltip-open .chat-tooltip-icon { opacity: 1; }
}
// Outcome classes — success/crit/steady color
.mgne-chat-card.outcome-critical-success,
.mgne-chat-card.outcome-success,
.mgne-chat-card.outcome-steady {
.chat-outcome {
border-left-color: fade(@verdigris, 75%);
.chat-outcome-label { color: lighten(@verdigris, 28%); }
.chat-outcome-icon { color: lighten(@verdigris, 30%); }
}
.chat-damage-total {
border-left-color: fade(@verdigris, 60%);
.chat-damage-number { color: lighten(@verdigris, 25%); }
}
}
// Outcome classes — failure/broken/fumble color
.mgne-chat-card.outcome-failure,
.mgne-chat-card.outcome-broken,
.mgne-chat-card.outcome-fumble {
.chat-outcome {
border-left-color: fade(@ember-bright, 75%);
.chat-outcome-label { color: lighten(@ember-bright, 18%); }
.chat-outcome-icon { color: lighten(@blood, 10%); }
}
.chat-damage-total {
border-left-color: fade(@ember-bright, 60%);
}
}
// Dice tooltip reveal panel
.mgne-chat-card .chat-dice-tooltip {
margin-top: 0.4rem;
padding: 0.4rem 0.55rem;
padding: 0.35rem 0.5rem;
background: fade(@bg-void, 85%);
border: 1px solid fade(@bone, 22%);
border: 1px solid fade(@bone, 18%);
border-radius: @radius-sm;
// Foundry's standard dice-roll markup
.dice-roll {
display: flex;
flex-direction: column;
gap: 0.2rem;
gap: 0.15rem;
}
.dice-formula {
font-family: "Courier New", monospace;
font-size: 0.72rem;
color: fade(@parchment, 65%);
font-size: 0.7rem;
color: fade(@parchment, 72%);
}
.dice-tooltip {
font-size: 0.78rem;
font-size: 0.75rem;
}
.dice {
margin: 0.15rem 0;
margin: 0.1rem 0;
}
.die-icon, .die-face {
color: @gold-acid;
font-size: 0.8rem;
font-size: 0.78rem;
}
.part-formula { color: fade(@parchment, 70%); font-size: 0.72rem; }
.part-formula { color: fade(@parchment, 78%); font-size: 0.7rem; }
.part-total { color: @parchment; font-weight: 600; }
.max { color: lighten(@verdigris, 20%); }
.min { color: lighten(@ember-bright, 10%); }
.dice-total {
font-family: "CastorTwoMGNE", serif;
font-size: 1.05rem;
font-family: @font-display;
font-size: 1rem;
color: @gold-acid;
text-align: right;
border-top: 1px solid fade(@bone, 20%);
text-align: center;
border-top: 1px solid fade(@bone, 16%);
padding-top: 0.2rem;
margin-top: 0.15rem;
margin-top: 0.1rem;
}
}
.mgne-chat-card .chat-outcome {
.caps-heading();
margin: 0;
padding: 0.3rem 0.55rem;
// Special text
.mgne-chat-card .chat-special-wrap {
display: flex;
align-items: flex-start;
gap: 0.4rem;
padding: 0.35rem 0.5rem;
border-left: 2px solid fade(@ember-bright, 40%);
background: fade(@bg-input, 80%);
border-radius: @radius-sm;
background: fade(@bg-void, 72%);
border-left: 3px solid fade(@ember-bright, 70%);
color: lighten(@ember-bright, 12%);
font-size: 0.8rem;
}
.mgne-chat-card .chat-special {
padding: 0.42rem 0.55rem;
border-left: 3px solid fade(@ember-bright, 55%);
background: fade(@bg-input, 85%);
.mgne-chat-card .chat-special-icon {
flex-shrink: 0;
font-size: 0.7rem;
color: @ember-bright;
margin-top: 0.08rem;
}
.mgne-chat-card .chat-special-text {
color: @parchment;
font-size: 0.72rem;
line-height: 1.4;
}
.mgne-chat-card.outcome-critical-success,
.mgne-chat-card.outcome-success,
.mgne-chat-card.outcome-steady {
border-color: fade(@verdigris, 42%);
// Omen reminders
.mgne-chat-card .chat-omen-remind,
.mgne-chat-card .chat-omen-used {
margin: 0;
padding: 0.35rem 0.5rem;
border-radius: @radius-sm;
font-size: 0.7rem;
display: flex;
align-items: center;
gap: 0.35rem;
}
.chat-outcome {
color: lighten(@verdigris, 28%);
border-left-color: fade(@verdigris, 80%);
.mgne-chat-card .chat-omen-remind {
background: fade(@gold-acid, 18%);
border: 1px solid fade(@gold-acid, 35%);
color: lighten(@gold-acid, 18%);
i {
color: @gold-acid;
font-size: 0.7rem;
}
}
.mgne-chat-card.outcome-failure,
.mgne-chat-card.outcome-broken,
.mgne-chat-card.outcome-fumble {
border-color: fade(@blood, 48%);
.mgne-chat-card .chat-omen-neutralize {
background: fade(@ember-bright, 18%);
border-color: fade(@ember-bright, 35%);
color: lighten(@ember-bright, 15%);
.chat-outcome {
color: lighten(@ember-bright, 18%);
border-left-color: fade(@ember-bright, 80%);
i {
color: @ember-bright;
}
}
.mgne-chat-card.mode-apply-damage .chat-result-total,
.mgne-chat-card.mode-damage .chat-result-total {
color: lighten(@ember-bright, 8%);
.mgne-chat-card .chat-omen-used {
background: fade(@verdigris, 18%);
border: 1px solid fade(@verdigris, 32%);
color: lighten(@verdigris, 32%);
i {
color: lighten(@verdigris, 35%);
font-size: 0.7rem;
}
}
// Card action buttons container
.mgne-chat-card .chat-card-actions {
margin-top: 0.2rem;
margin-top: 0.1rem;
}
// Roll damage button
.mgne-roll-damage-btn {
display: flex;
align-items: center;
justify-content: center;
gap: 0.45rem;
gap: 0.4rem;
width: 100%;
padding: 0.38rem 0.7rem;
border: 1px solid @ember-bright;
@@ -207,7 +369,7 @@
background: @ember;
color: #f8ede0;
font-family: @font-display;
font-size: 0.78rem;
font-size: 0.76rem;
font-weight: 600;
letter-spacing: 0.06em;
cursor: pointer;
@@ -215,7 +377,7 @@
.dmg-formula {
color: #fff5e8;
font-size: 0.75rem;
font-size: 0.73rem;
font-weight: 700;
}
@@ -242,8 +404,35 @@
}
}
// Omen reroll button
.mgne-omen-reroll-btn {
display: flex;
align-items: center;
justify-content: center;
gap: 0.4rem;
width: 100%;
padding: 0.38rem 0.7rem;
border: 1px solid @gold-acid;
border-radius: @radius-sm;
background: darken(@gold-acid, 15%);
color: #fff5d0;
font-family: @font-display;
font-size: 0.76rem;
font-weight: 600;
letter-spacing: 0.06em;
cursor: pointer;
transition: background 0.15s, border-color 0.15s;
&:hover {
background: lighten(darken(@gold-acid, 15%), 8%);
border-color: lighten(@gold-acid, 12%);
color: #fff;
}
}
// Apply damage select
.chat-apply-actions {
margin-top: 0.35rem;
margin-top: 0.25rem;
}
.mgne-apply-damage-select {
@@ -254,7 +443,7 @@
background: @bg-char;
color: @bone;
font-family: @font-body;
font-size: 0.8rem;
font-size: 0.78rem;
font-weight: 600;
cursor: pointer;
transition: border-color 0.15s, background 0.15s;
+89 -34
View File
@@ -203,15 +203,15 @@
}
.application.mgne .resource-box-inline-track .numeric-caption {
color: @label-ink;
color: @bone;
}
.application.mgne .resource-box-inline-track .numeric-caption-strong {
padding: 0.08rem 0.34rem;
border-radius: 999px;
background: fade(@gold-acid, 18%);
border: 1px solid fade(@label-ink, 28%);
color: darken(@label-ink, 4%);
border: 1px solid fade(@bone, 28%);
color: @bone;
font-size: 0.6rem;
letter-spacing: 0.11em;
}
@@ -261,7 +261,7 @@
.application.mgne .numeric-caption {
.caps-heading();
color: fade(@label-soft, 94%);
color: lighten(@label-soft, 2%);
font-size: 0.58rem;
letter-spacing: 0.12em;
}
@@ -479,6 +479,18 @@
font-size: 0.82rem;
}
// Item sheets: dark h3 for parchment backgrounds
.application.mgne.item-sheet h3,
.application.mgne.item-sheet .inventory-header h3 {
color: @bg-char;
}
// Character sheet: Conditions block - use dark color like item sheets
.application.mgne.character .condition-value-grid label,
.application.mgne.character .condition-flag-grid label {
color: @bg-char;
}
.application.mgne .item-row {
position: relative;
display: grid;
@@ -584,8 +596,8 @@
}
.application.mgne .resource-label-accent {
color: @ember-bright;
text-shadow: 0 0 12px fade(@ember, 18%);
color: lighten(@parchment, 8%);
text-shadow: 0 0 12px fade(@gold-acid, 18%);
}
.application.mgne .ability-score {
@@ -647,6 +659,32 @@
@bg-panel-soft;
}
// ─── Companion sheet label contrast ──────────────────────────────────────────
// Panel-shell backgrounds expose the parchment page texture; @bone caps labels
// blend into the warm background. Use dark ink — matching the character sheet's
// condition-label treatment.
.application.mgne.companion {
// Section headers (Attack, Adventuring/Combat Behavior, Description, Notes)
.inventory-header h3 {
color: @bg-char;
}
// Compact resource labels (Morale, Armor Die) — HP uses resource-label-accent and stays light
.resource-box > label:not(.resource-label-accent) {
color: @bg-char;
}
// Labels inside fieldsets (Label, Damage in the Attack section)
fieldset label {
color: @bg-char;
}
// Floating grid labels (They Value, Trait, Specialty)
.grid > div > label {
color: @bg-char;
}
}
@media (max-width: 960px) {
.application.mgne .sheet-header,
.application.mgne .resource-bar,
@@ -693,9 +731,9 @@
}
&.weight-heavy {
color: @blood;
border-color: fade(@blood, 45%);
background: fade(@blood, 12%);
color: @bone;
border-color: fade(@gold-acid, 45%);
background: fade(@ash, 12%);
}
}
@@ -707,16 +745,16 @@
}
.load-overloaded {
color: @blood !important;
text-shadow: 0 0 6px fade(@blood, 50%);
color: lighten(@parchment, 8%) !important;
text-shadow: 0 0 6px fade(@gold-acid, 50%);
}
.resource-box-overloaded {
border-color: fade(@blood, 60%) !important;
background: fade(@blood, 10%) !important;
border-color: fade(@gold-acid, 60%) !important;
background: fade(@ash, 10%) !important;
.resource-label-accent {
color: @blood !important;
color: lighten(@parchment, 8%) !important;
}
}
@@ -748,9 +786,9 @@
font-weight: 700;
text-transform: uppercase;
letter-spacing: 0.06em;
color: @blood;
background: fade(@blood, 14%);
border: 1px solid fade(@blood, 45%);
color: lighten(@parchment, 8%);
background: fade(@ash, 14%);
border: 1px solid fade(@bone, 45%);
border-radius: 3px;
vertical-align: middle;
}
@@ -775,9 +813,9 @@
letter-spacing: 0.03em;
&.durability-broken {
color: @blood;
border-color: fade(@blood, 40%);
background: fade(@blood, 10%);
color: lighten(@parchment, 8%);
border-color: fade(@bone, 40%);
background: fade(@ash, 10%);
text-decoration: line-through;
}
}
@@ -788,7 +826,7 @@
.item-name {
text-decoration: line-through;
color: fade(@parchment, 55%);
color: lighten(@parchment, 6%);
}
}
@@ -874,7 +912,7 @@
font-weight: 700;
text-transform: uppercase;
letter-spacing: 0.08em;
color: fade(@blood, 90%);
color: lighten(@blood, 8%);
}
button {
@@ -882,7 +920,7 @@
padding: 0.15em 0.6em;
background: fade(@blood, 12%);
border: 1px solid fade(@blood, 35%);
color: fade(@blood, 80%);
color: lighten(@blood, 4%);
border-radius: 3px;
cursor: pointer;
transition: background 0.15s, color 0.15s;
@@ -992,7 +1030,7 @@
font-weight: 700;
text-transform: uppercase;
letter-spacing: 0.07em;
color: fade(@ember, 80%);
color: @parchment;
white-space: nowrap;
}
@@ -1008,15 +1046,27 @@
align-items: center;
gap: 0.3em;
font-size: 0.83rem;
color: @parchment;
color: @parchment !important;
cursor: pointer;
user-select: none;
> span {
color: @parchment !important;
}
input[type="checkbox"] {
appearance: checkbox;
-webkit-appearance: checkbox;
accent-color: @ember;
width: 0.9rem;
height: 0.9rem;
cursor: pointer;
margin: 0;
flex-shrink: 0;
&::before, &::after {
display: none;
}
}
}
@@ -1067,12 +1117,17 @@
&.drop-hint {
border: 2px dashed fade(@ember, 35%);
background: fade(@ember, 4%);
color: fade(@parchment, 50%);
color: @parchment;
font-style: italic;
justify-content: center;
cursor: default;
transition: background 0.15s, border-color 0.15s;
// Companion sheet: darker text for better contrast
.application.mgne.companion & {
color: @bg-char;
}
i { color: fade(@ember, 50%); }
&:hover, &.drag-over {
@@ -1092,9 +1147,9 @@
button {
font-size: 0.75rem;
padding: 0.15em 0.55em;
background: fade(@ember, 10%);
border: 1px solid fade(@ember, 30%);
color: fade(@ember, 80%);
background: fade(@ash, 10%);
border: 1px solid fade(@gold-acid, 30%);
color: lighten(@parchment, 6%);
border-radius: 3px;
cursor: pointer;
transition: background 0.15s, color 0.15s;
@@ -1103,8 +1158,8 @@
gap: 0.3em;
&:hover {
background: fade(@ember, 22%);
color: @ember;
background: fade(@ash, 22%);
color: @bone;
}
}
}
@@ -1233,7 +1288,7 @@
}
.application.mgne.party .party-member-hp {
color: @ember-bright;
color: @bone;
font-family: @font-display;
font-size: 0.82rem;
font-weight: 700;
@@ -1241,7 +1296,7 @@
}
.application.mgne.party .party-member-type {
color: @dust;
color: lighten(@dust, 12%);
font-size: 0.78rem;
font-style: italic;
}
@@ -1300,7 +1355,7 @@
// ── Party drop hint ────────────────────────────────────────────
.application.mgne.party .party-drop-hint {
color: fade(@dust, 70%);
color: @parchment;
font-size: 0.75rem;
font-style: italic;
text-align: center;
+9 -9
View File
@@ -9,16 +9,16 @@
@bg-input: rgba(17, 12, 10, 0.72);
@parchment: #ccb292;
@bone: #ab8b68;
@dust: #7e664f;
@ash: #5f4d40;
@label-ink: #6e3d2a;
@label-soft: #81533b;
@iron: #52453c;
@copper: #8d5f3f;
@dust: #a68e78;
@ash: #958068;
@label-ink: #a67054;
@label-soft: #b1856c;
@iron: #a08878;
@copper: #b49c73;
@verdigris: #4f7d73;
@ember: #b7461f;
@ember-bright: #dd6b2d;
@blood: #7f1d17;
@ember: #d87a4f;
@ember-bright: #e89a5f;
@blood: #e85a50;
@gold-acid: #c49a45;
@shadow-heavy: 0 14px 30px rgba(0, 0, 0, 0.36);
@shadow-inset: inset 0 1px 0 rgba(255, 236, 203, 0.08), inset 0 0 0 1px rgba(255, 236, 203, 0.03);
@@ -83,16 +83,16 @@ export default class MGNECharacterSheet extends MGNEActorSheet {
break
case "equipment":
context.tab = context.tabs.equipment
context.weapons = doc.itemTypes.weapon.map(i => ({ ...i, tooltip: stripHtml(i.system.description) }))
context.armors = doc.itemTypes.armor.map(i => ({ ...i, tooltip: stripHtml(i.system.description) }))
context.shields = doc.itemTypes.shield.map(i => ({ ...i, tooltip: stripHtml(i.system.description) }))
context.equipmentItems = doc.itemTypes.equipment.map(i => ({ ...i, tooltip: stripHtml(i.system.description) }))
context.cores = doc.itemTypes["resonance-core"].map(i => ({ ...i, tooltip: stripHtml(i.system.description) }))
context.artifacts = doc.itemTypes.artifact.map(i => ({ ...i, tooltip: stripHtml(i.system.description) }))
context.weapons = doc.itemTypes.weapon.map(i => ({ id: i.id, name: i.name, img: i.img, system: i.system, tooltip: stripHtml(i.system.description) }))
context.armors = doc.itemTypes.armor.map(i => ({ id: i.id, name: i.name, img: i.img, system: i.system, tooltip: stripHtml(i.system.description) }))
context.shields = doc.itemTypes.shield.map(i => ({ id: i.id, name: i.name, img: i.img, system: i.system, tooltip: stripHtml(i.system.description) }))
context.equipmentItems = doc.itemTypes.equipment.map(i => ({ id: i.id, name: i.name, img: i.img, system: i.system, tooltip: stripHtml(i.system.description) }))
context.cores = doc.itemTypes["resonance-core"].map(i => ({ id: i.id, name: i.name, img: i.img, system: i.system, tooltip: stripHtml(i.system.description) }))
context.artifacts = doc.itemTypes.artifact.map(i => ({ id: i.id, name: i.name, img: i.img, system: i.system, tooltip: stripHtml(i.system.description) }))
break
case "features":
context.tab = context.tabs.features
context.features = doc.itemTypes.feature.map(i => ({ ...i, tooltip: stripHtml(i.system.description) }))
context.features = doc.itemTypes.feature.map(i => ({ id: i.id, name: i.name, img: i.img, system: i.system, tooltip: stripHtml(i.system.description) }))
break
case "notes":
context.tab = context.tabs.notes
@@ -30,7 +30,7 @@ export default class MGNECreatureSheet extends MGNEActorSheet {
async _prepareContext() {
const context = await super._prepareContext()
context.traits = (this.document.itemTypes["creature-trait"] ?? [])
.map(i => ({ ...i, tooltip: stripHtml(i.system.description) }))
.map(i => ({ id: i.id, name: i.name, img: i.img, system: i.system, tooltip: stripHtml(i.system.description) }))
// Resolve linked action table
const uuid = this.document.system.actionTableUuid
+4 -1
View File
@@ -96,6 +96,9 @@ export const SYSTEM = {
get weaponPropertyLabels() {
return Object.fromEntries(Object.entries(this.weaponProperties).map(([k, v]) => [k, v.label]))
},
get weaponPropertyHints() {
return Object.fromEntries(Object.entries(this.weaponProperties).map(([k, v]) => [k, v.hint]))
},
resonanceList: {
accelerate: "Accelerate",
blast: "Blast",
@@ -136,7 +139,7 @@ export const SYSTEM = {
{ name: "Clothing (Average)", type: "armor", armorDie: "d2", penalty: 0 },
{ name: "Helm", type: "armor", armorDie: "d2", penalty: 0 },
{ name: "Medium Shield", type: "shield", armorDie: "d4", penalty: 0 },
{ name: "Gambeson", type: "armor", armorDie: "d4", penalty: 0 },
{ name: "Gambeson", type: "armor", armorDie: "d2", penalty: 0 },
{ name: "Padded Leather", type: "armor", armorDie: "d4", penalty: 1 },
{ name: "Chain Shirt", type: "armor", armorDie: "d6", penalty: 1 },
{ name: "Half Plate", type: "armor", armorDie: "d8", penalty: 2 },
+40 -12
View File
@@ -48,14 +48,28 @@ function numericOptions(min, max, current = null) {
})
}
const OUTCOME_ICONS = {
"critical-success": '<i class="fa-solid fa-star"></i>',
"success": '<i class="fa-solid fa-check"></i>',
"steady": '<i class="fa-solid fa-minus"></i>',
"failure": '<i class="fa-solid fa-xmark"></i>',
"broken": '<i class="fa-solid fa-skull"></i>',
"fumble": '<i class="fa-solid fa-skull"></i>',
"rolled": '<i class="fa-solid fa-bolt"></i>',
}
const SPECIAL_ICONS = {
default: '<i class="fa-solid fa-circle-info"></i>',
}
async function renderCard(context) {
const outcomeClass = `${context.outcome ?? ""}`
.toLowerCase()
.replace(/[^a-z0-9]+/g, "-")
.replace(/^-|-$/g, "")
const eyebrow = context.eyebrow ?? getChatModeLabel(context.mode ?? "generic")
const normalizedEyebrow = `${eyebrow}`.trim().toLowerCase()
const normalizedLabel = `${context.label ?? ""}`.trim().toLowerCase()
const modeLabel = getChatModeLabel(context.mode ?? "generic")
const outcomeIcon = OUTCOME_ICONS[outcomeClass] || ""
const specialIcon = SPECIAL_ICONS.default
// Render dice tooltip HTML if a roll was provided
const diceTooltip = context._roll ? await context._roll.render() : null
@@ -63,22 +77,25 @@ async function renderCard(context) {
return foundry.applications.handlebars.renderTemplate(`systems/${SYSTEM_ID}/templates/chat-message.hbs`, {
...context,
modeClass: context.mode ?? "generic",
eyebrow: "",
modeLabel,
outcomeClass,
outcomeIcon,
specialIcon,
diceTooltip,
})
}
export default class MGNERoll {
static async promptCheck({ actor, abilityId, label, baseDR = 12, rollType = "check", item = null }) {
static async promptCheck({ actor, abilityId, label, baseDR = 12, modifier = 0, rollType = "check", item = null }) {
const abilityLabel = SYSTEM.abilities[abilityId]?.label ?? abilityId
const content = await foundry.applications.handlebars.renderTemplate(`systems/${SYSTEM_ID}/templates/roll-dialog.hbs`, {
actorName: actor.name,
label,
abilityLabel,
baseDR,
modifier,
drOptions: numericOptions(6, 20, baseDR),
modifierOptions: numericOptions(-6, 6, 0),
modifierOptions: numericOptions(-6, 6, modifier),
omens: actor.system.omens?.current ?? 0,
rollType,
})
@@ -99,15 +116,15 @@ export default class MGNERoll {
if (!dialogData) return null
const modifier = Number.parseInt(dialogData.modifier ?? 0, 10) || 0
const dialogModifier = Number.parseInt(dialogData.modifier ?? 0, 10) || 0
const spendOmen = Boolean(dialogData.spendOmen)
// Re-read omens after dialog close to avoid race condition (omen could have changed)
const currentOmensAfterDialog = actor.system.omens?.current ?? 0
const canSpendOmen = spendOmen && currentOmensAfterDialog > 0
const dr = (Number.parseInt(dialogData.dr ?? baseDR, 10) || baseDR) - (canSpendOmen ? 4 : 0)
const abilityValue = actor.system.abilities?.[abilityId]?.value ?? 0
const sign = modifier >= 0 ? "+" : "-"
const formula = modifier === 0 ? `1d20 + ${abilityValue}` : `1d20 + ${abilityValue} ${sign} ${Math.abs(modifier)}`
const sign = dialogModifier >= 0 ? "+" : "-"
const formula = dialogModifier === 0 ? `1d20 + ${abilityValue}` : `1d20 + ${abilityValue} ${sign} ${Math.abs(dialogModifier)}`
const roll = await (new Roll(formula)).evaluate()
const natural = roll.dice?.[0]?.results?.[0]?.result ?? roll.total
@@ -143,6 +160,7 @@ export default class MGNERoll {
}
const showDamageButton = rollType === "attack" && (success || critical) && !!item
const showOmenRerollButton = Boolean(omenRerollReminder)
const contentHtml = await renderCard({
mode: "check",
actorName: actor.name,
@@ -160,6 +178,14 @@ export default class MGNERoll {
damageItemId: showDamageButton ? item.id : null,
damageFormula: showDamageButton ? (item.system.damage || "1") : null,
damageCritical: showDamageButton && critical,
showOmenRerollButton,
omenRerollActorId: showOmenRerollButton ? actor.id : null,
omenRerollAbilityId: showOmenRerollButton ? abilityId : null,
omenRerollLabel: showOmenRerollButton ? label : null,
omenRerollBaseDR: showOmenRerollButton ? baseDR : null,
omenRerollModifier: showOmenRerollButton ? dialogModifier : 0,
omenRerollRollType: showOmenRerollButton ? rollType : null,
omenRerollItemId: showOmenRerollButton ? item?.id : null,
_roll: roll,
})
@@ -198,7 +224,7 @@ export default class MGNERoll {
return { roll, broken }
}
static async rollDamage({ actor, item }) {
static async rollDamage({ actor, item, targetActor = null }) {
const damageBonus = await actor.consumePendingDamageBonus(item.id)
const multiplier = damageBonus?.multiplier ?? 1
const baseFormula = item.system.damage || "1"
@@ -232,7 +258,7 @@ export default class MGNERoll {
mode: "damage",
actorName: actor.name,
actorImg: actor.img,
label: `${item.name} Damage`,
label: f("MGNE.Roll.ItemDamageLabel", { item: item.name }),
subtitle: null,
formula: roll.formula,
total: roll.total,
@@ -242,6 +268,7 @@ export default class MGNERoll {
showApplyButton: true,
damageTotal: roll.total,
damageCritical: isCritical,
damageTargetActorId: targetActor?.id ?? null,
_roll: roll,
})
@@ -254,7 +281,7 @@ export default class MGNERoll {
return { roll }
}
static async rollFlatDamage({ actor, label, formula }) {
static async rollFlatDamage({ actor, label, formula, targetActor = null }) {
const damageBonus = await actor.consumePendingDamageBonus("profile-attack")
const multiplier = damageBonus?.multiplier ?? 1
const baseFormula = formula || "1"
@@ -274,6 +301,7 @@ export default class MGNERoll {
showApplyButton: true,
damageTotal: roll.total,
damageCritical: isCritical,
damageTargetActorId: targetActor?.id ?? null,
_roll: roll,
})
+11 -11
View File
@@ -25,6 +25,7 @@ export default class MGNECharacter extends foundry.abstract.TypeDataModel {
}),
conditions: conditionSchema(),
carryCapacity: numberField(8, 0),
carryCapacityModifier: numberField(0, 0),
rations: numberField(0, 0),
kiffol: numberField(0, 0),
background: stringField(""),
@@ -40,18 +41,25 @@ export default class MGNECharacter extends foundry.abstract.TypeDataModel {
prepareDerivedData() {
super.prepareDerivedData()
this.carryCapacity = (this.abilities.strength?.value ?? 0) + 8
this.resonance.remaining = Math.max(0, (this.resonance.max ?? 0) - (this.resonance.used ?? 0))
this.syncLimit = Math.max(0, this.abilities.toughness?.value ?? 0)
this.syncRemaining = Math.max(0, this.syncLimit - (this.artifactSync.used ?? 0))
this.armorFormula = this.parent?.getArmorRollFormula?.() ?? "0"
// Compute carry capacity: base STR + 8 + feature capacities + direct modifier
const featureCapacity = (this.parent?.items ?? [])
.filter(i => i.type === "feature")
.reduce((sum, f) => sum + (f.system?.capacity ?? 0), 0)
this.carryCapacity = (this.abilities.strength?.value ?? 0) + 8 + featureCapacity + (this.carryCapacityModifier ?? 0)
// Compute current load per RAW:
// trivial = 0, light = 10 per slot, normal = 1, heavy = fills remaining capacity (max 1)
// Only items with a weight field count — features and creature-traits are excluded
// trivial = 0, light = 10 per slot, normal = 1, heavy = 2
let normalLoad = 0
let lightCount = 0
let heavyCount = 0
for (const item of (this.parent?.items ?? [])) {
if (!("weight" in (item.system ?? {}))) continue // no weight field (features, traits)
if (item.system?.carried === false) continue // not being carried
const w = item.system?.weight ?? "normal"
if (w === "trivial") continue
@@ -63,15 +71,7 @@ export default class MGNECharacter extends foundry.abstract.TypeDataModel {
this.lightItemCount = lightCount
this.heavyItemCount = heavyCount
if (heavyCount >= 2) {
// Can't carry two heavy items — automatically overloaded
this.currentLoad = this.carryCapacity + (heavyCount - 1)
} else if (heavyCount === 1) {
// Heavy fills remaining capacity; other items fit alongside it
this.currentLoad = Math.max(normalLoad, this.carryCapacity)
} else {
this.currentLoad = normalLoad
}
this.currentLoad = normalLoad + heavyCount * 2
this.overloaded = this.currentLoad > this.carryCapacity
}
+2 -1
View File
@@ -1,5 +1,5 @@
import { SYSTEM } from "../config/system.mjs"
import { htmlField } from "./shared.mjs"
import { htmlField, numberField } from "./shared.mjs"
export default class MGNEFeature extends foundry.abstract.TypeDataModel {
static defineSchema() {
@@ -10,6 +10,7 @@ export default class MGNEFeature extends foundry.abstract.TypeDataModel {
blank: true,
initial: "",
}),
capacity: numberField(0, 0),
description: htmlField(""),
}
}
+75 -18
View File
@@ -7,9 +7,11 @@
"": {
"name": "fvtt-machine-gods-noxian-expanse",
"version": "0.1.0",
"hasInstallScript": true,
"license": "UNLICENSED",
"devDependencies": {
"@foundryvtt/foundryvtt-cli": "^3.0.3",
"classic-level": "^3.0.0",
"less": "^4.6.4",
"patch-package": "^8.0.1"
}
@@ -36,6 +38,53 @@
"node": ">17.0.0"
}
},
"node_modules/@foundryvtt/foundryvtt-cli/node_modules/abstract-level": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/abstract-level/-/abstract-level-1.0.4.tgz",
"integrity": "sha512-eUP/6pbXBkMbXFdx4IH2fVgvB7M0JvR7/lIL33zcs0IBcwjdzSSl31TOJsaCzmKSSDF9h8QYSOJux4Nd4YJqFg==",
"dev": true,
"license": "MIT",
"dependencies": {
"buffer": "^6.0.3",
"catering": "^2.1.0",
"is-buffer": "^2.0.5",
"level-supports": "^4.0.0",
"level-transcoder": "^1.0.1",
"module-error": "^1.0.1",
"queue-microtask": "^1.2.3"
},
"engines": {
"node": ">=12"
}
},
"node_modules/@foundryvtt/foundryvtt-cli/node_modules/classic-level": {
"version": "1.4.1",
"resolved": "https://registry.npmjs.org/classic-level/-/classic-level-1.4.1.tgz",
"integrity": "sha512-qGx/KJl3bvtOHrGau2WklEZuXhS3zme+jf+fsu6Ej7W7IP/C49v7KNlWIsT1jZu0YnfzSIYDGcEWpCa1wKGWXQ==",
"dev": true,
"hasInstallScript": true,
"license": "MIT",
"dependencies": {
"abstract-level": "^1.0.2",
"catering": "^2.1.0",
"module-error": "^1.0.1",
"napi-macros": "^2.2.2",
"node-gyp-build": "^4.3.0"
},
"engines": {
"node": ">=12"
}
},
"node_modules/@foundryvtt/foundryvtt-cli/node_modules/level-supports": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/level-supports/-/level-supports-4.0.1.tgz",
"integrity": "sha512-PbXpve8rKeNcZ9C1mUicC9auIYFyGpkV9/i6g76tLgANwWhtG2v7I4xNBUlkn3lE2/dZF3Pi0ygYGtLc4RXXdA==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=12"
}
},
"node_modules/@seald-io/binary-search-tree": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/@seald-io/binary-search-tree/-/binary-search-tree-1.0.3.tgz",
@@ -62,22 +111,21 @@
"license": "BSD-2-Clause"
},
"node_modules/abstract-level": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/abstract-level/-/abstract-level-1.0.4.tgz",
"integrity": "sha512-eUP/6pbXBkMbXFdx4IH2fVgvB7M0JvR7/lIL33zcs0IBcwjdzSSl31TOJsaCzmKSSDF9h8QYSOJux4Nd4YJqFg==",
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/abstract-level/-/abstract-level-3.1.1.tgz",
"integrity": "sha512-CW2gKbJFTuX1feMvOrvsVMmijAOgI9kg2Ie9Dq3gOcMt/dVVoVmqNlLcEUCT13NxHFMEajcUcVBIplbyDroDiw==",
"dev": true,
"license": "MIT",
"dependencies": {
"buffer": "^6.0.3",
"catering": "^2.1.0",
"is-buffer": "^2.0.5",
"level-supports": "^4.0.0",
"level-supports": "^6.2.0",
"level-transcoder": "^1.0.1",
"module-error": "^1.0.1",
"queue-microtask": "^1.2.3"
"maybe-combine-errors": "^1.0.0",
"module-error": "^1.0.1"
},
"engines": {
"node": ">=12"
"node": ">=18"
}
},
"node_modules/ansi-regex": {
@@ -278,21 +326,20 @@
}
},
"node_modules/classic-level": {
"version": "1.4.1",
"resolved": "https://registry.npmjs.org/classic-level/-/classic-level-1.4.1.tgz",
"integrity": "sha512-qGx/KJl3bvtOHrGau2WklEZuXhS3zme+jf+fsu6Ej7W7IP/C49v7KNlWIsT1jZu0YnfzSIYDGcEWpCa1wKGWXQ==",
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/classic-level/-/classic-level-3.0.0.tgz",
"integrity": "sha512-yGy8j8LjPbN0Bh3+ygmyYvrmskVita92pD/zCoalfcC9XxZj6iDtZTAnz+ot7GG8p9KLTG+MZ84tSA4AhkgVZQ==",
"dev": true,
"hasInstallScript": true,
"license": "MIT",
"dependencies": {
"abstract-level": "^1.0.2",
"catering": "^2.1.0",
"abstract-level": "^3.1.0",
"module-error": "^1.0.1",
"napi-macros": "^2.2.2",
"node-gyp-build": "^4.3.0"
},
"engines": {
"node": ">=12"
"node": ">=18"
}
},
"node_modules/cliui": {
@@ -1017,13 +1064,13 @@
}
},
"node_modules/level-supports": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/level-supports/-/level-supports-4.0.1.tgz",
"integrity": "sha512-PbXpve8rKeNcZ9C1mUicC9auIYFyGpkV9/i6g76tLgANwWhtG2v7I4xNBUlkn3lE2/dZF3Pi0ygYGtLc4RXXdA==",
"version": "6.2.0",
"resolved": "https://registry.npmjs.org/level-supports/-/level-supports-6.2.0.tgz",
"integrity": "sha512-QNxVXP0IRnBmMsJIh+sb2kwNCYcKciQZJEt+L1hPCHrKNELllXhvrlClVHXBYZVT+a7aTSM6StgNXdAldoab3w==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=12"
"node": ">=16"
}
},
"node_modules/level-transcoder": {
@@ -1085,6 +1132,16 @@
"node": ">= 0.4"
}
},
"node_modules/maybe-combine-errors": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/maybe-combine-errors/-/maybe-combine-errors-1.0.0.tgz",
"integrity": "sha512-eefp6IduNPT6fVdwPp+1NgD0PML1NU5P6j1Mj5nz1nidX8/sWY7119WL8vTAHgqfsY74TzW0w1XPgdYEKkGZ5A==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=10"
}
},
"node_modules/micromatch": {
"version": "4.0.8",
"resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz",
+1
View File
@@ -15,6 +15,7 @@
},
"devDependencies": {
"@foundryvtt/foundryvtt-cli": "^3.0.3",
"classic-level": "^3.0.0",
"less": "^4.6.4",
"patch-package": "^8.0.1"
}
Binary file not shown.
Binary file not shown.
Binary file not shown.
View File
Binary file not shown.
+1 -1
View File
@@ -1 +1 @@
MANIFEST-000025
MANIFEST-000032
+14
View File
@@ -0,0 +1,14 @@
2026/06/08-22:30:14.302066 7f5208bff6c0 Recovering log #29
2026/06/08-22:30:14.311260 7f5208bff6c0 Delete type=3 #27
2026/06/08-22:30:14.311276 7f5208bff6c0 Delete type=0 #29
2026/06/08-22:30:22.508073 7f51ba7fc6c0 Level-0 table #35: started
2026/06/08-22:30:22.511267 7f51ba7fc6c0 Level-0 table #35: 1820 bytes OK
2026/06/08-22:30:22.517613 7f51ba7fc6c0 Delete type=0 #33
2026/06/08-22:30:22.543986 7f51ba7fc6c0 Manual compaction at level-0 from '!items!mgne-arm-chainshirt' @ 72057594037927935 : 1 .. '!items!null' @ 0 : 0; will stop at '!items!null' @ 41 : 1
2026/06/08-22:30:22.543992 7f51ba7fc6c0 Compacting 1@0 + 1@1 files
2026/06/08-22:30:22.546985 7f51ba7fc6c0 Generated table #36@0: 9 keys, 1445 bytes
2026/06/08-22:30:22.546989 7f51ba7fc6c0 Compacted 1@0 + 1@1 files => 1445 bytes
2026/06/08-22:30:22.553011 7f51ba7fc6c0 compacted to: files[ 0 1 0 0 0 0 0 ]
2026/06/08-22:30:22.553091 7f51ba7fc6c0 Delete type=2 #31
2026/06/08-22:30:22.553161 7f51ba7fc6c0 Delete type=2 #35
2026/06/08-22:30:22.563914 7f51ba7fc6c0 Manual compaction at level-0 from '!items!null' @ 41 : 1 .. '!items!null' @ 0 : 0; will stop at (end)
+14 -3
View File
@@ -1,3 +1,14 @@
2026/05/17-15:40:00.779700 7f1642bfd6c0 Recovering log #22
2026/05/17-15:40:00.789740 7f1642bfd6c0 Delete type=3 #20
2026/05/17-15:40:00.789807 7f1642bfd6c0 Delete type=0 #22
2026/06/08-22:28:49.244498 7f51baffd6c0 Recovering log #24
2026/06/08-22:28:49.253761 7f51baffd6c0 Delete type=3 #22
2026/06/08-22:28:49.253785 7f51baffd6c0 Delete type=0 #24
2026/06/08-22:29:08.699377 7f51ba7fc6c0 Level-0 table #30: started
2026/06/08-22:29:08.702874 7f51ba7fc6c0 Level-0 table #30: 1820 bytes OK
2026/06/08-22:29:08.709319 7f51ba7fc6c0 Delete type=0 #28
2026/06/08-22:29:08.715547 7f51ba7fc6c0 Manual compaction at level-0 from '!items!mgne-arm-chainshirt' @ 72057594037927935 : 1 .. '!items!null' @ 0 : 0; will stop at '!items!null' @ 33 : 1
2026/06/08-22:29:08.715551 7f51ba7fc6c0 Compacting 1@0 + 1@1 files
2026/06/08-22:29:08.718787 7f51ba7fc6c0 Generated table #31@0: 9 keys, 1445 bytes
2026/06/08-22:29:08.718802 7f51ba7fc6c0 Compacted 1@0 + 1@1 files => 1445 bytes
2026/06/08-22:29:08.724761 7f51ba7fc6c0 compacted to: files[ 0 1 0 0 0 0 0 ]
2026/06/08-22:29:08.724834 7f51ba7fc6c0 Delete type=2 #26
2026/06/08-22:29:08.724899 7f51ba7fc6c0 Delete type=2 #30
2026/06/08-22:29:08.737992 7f51ba7fc6c0 Manual compaction at level-0 from '!items!null' @ 33 : 1 .. '!items!null' @ 0 : 0; will stop at (end)
Binary file not shown.
Binary file not shown.
View File
Binary file not shown.
Binary file not shown.
Binary file not shown.
View File
Binary file not shown.
+1 -1
View File
@@ -1 +1 @@
MANIFEST-000025
MANIFEST-000030
+14 -3
View File
@@ -1,3 +1,14 @@
2026/05/17-15:40:00.750239 7f16423fc6c0 Recovering log #22
2026/05/17-15:40:00.760411 7f16423fc6c0 Delete type=3 #20
2026/05/17-15:40:00.760461 7f16423fc6c0 Delete type=0 #22
2026/06/08-22:30:14.280655 7f51bb7fe6c0 Recovering log #27
2026/06/08-22:30:14.289768 7f51bb7fe6c0 Delete type=3 #25
2026/06/08-22:30:14.289787 7f51bb7fe6c0 Delete type=0 #27
2026/06/08-22:30:22.461106 7f51ba7fc6c0 Level-0 table #33: started
2026/06/08-22:30:22.464602 7f51ba7fc6c0 Level-0 table #33: 4899 bytes OK
2026/06/08-22:30:22.471064 7f51ba7fc6c0 Delete type=0 #31
2026/06/08-22:30:22.489630 7f51ba7fc6c0 Manual compaction at level-0 from '!actors!mgne-comp-beguiled-noble' @ 72057594037927935 : 1 .. '!actors!null' @ 0 : 0; will stop at '!actors!null' @ 21 : 1
2026/06/08-22:30:22.489634 7f51ba7fc6c0 Compacting 1@0 + 1@1 files
2026/06/08-22:30:22.492585 7f51ba7fc6c0 Generated table #34@0: 5 keys, 3562 bytes
2026/06/08-22:30:22.492593 7f51ba7fc6c0 Compacted 1@0 + 1@1 files => 3562 bytes
2026/06/08-22:30:22.499213 7f51ba7fc6c0 compacted to: files[ 0 1 0 0 0 0 0 ]
2026/06/08-22:30:22.499275 7f51ba7fc6c0 Delete type=2 #29
2026/06/08-22:30:22.499325 7f51ba7fc6c0 Delete type=2 #33
2026/06/08-22:30:22.507968 7f51ba7fc6c0 Manual compaction at level-0 from '!actors!null' @ 21 : 1 .. '!actors!null' @ 0 : 0; will stop at (end)
+14 -15
View File
@@ -1,15 +1,14 @@
2026/05/17-13:26:05.090885 7f16423fc6c0 Recovering log #17
2026/05/17-13:26:05.101315 7f16423fc6c0 Delete type=3 #15
2026/05/17-13:26:05.101364 7f16423fc6c0 Delete type=0 #17
2026/05/17-15:39:46.172949 7f1641bfb6c0 Level-0 table #23: started
2026/05/17-15:39:46.177184 7f1641bfb6c0 Level-0 table #23: 4899 bytes OK
2026/05/17-15:39:46.183241 7f1641bfb6c0 Delete type=0 #21
2026/05/17-15:39:46.215307 7f1641bfb6c0 Manual compaction at level-0 from '!actors!mgne-comp-beguiled-noble' @ 72057594037927935 : 1 .. '!actors!null' @ 0 : 0; will stop at (end)
2026/05/17-15:39:46.224653 7f1641bfb6c0 Manual compaction at level-1 from '!actors!mgne-comp-beguiled-noble' @ 72057594037927935 : 1 .. '!actors!null' @ 0 : 0; will stop at '!actors!null' @ 17 : 1
2026/05/17-15:39:46.224663 7f1641bfb6c0 Compacting 1@1 + 1@2 files
2026/05/17-15:39:46.227820 7f1641bfb6c0 Generated table #24@1: 1 keys, 1984 bytes
2026/05/17-15:39:46.227830 7f1641bfb6c0 Compacted 1@1 + 1@2 files => 1984 bytes
2026/05/17-15:39:46.233855 7f1641bfb6c0 compacted to: files[ 0 0 2 0 0 0 0 ]
2026/05/17-15:39:46.233946 7f1641bfb6c0 Delete type=2 #19
2026/05/17-15:39:46.234305 7f1641bfb6c0 Delete type=2 #23
2026/05/17-15:39:46.253812 7f1641bfb6c0 Manual compaction at level-1 from '!actors!null' @ 17 : 1 .. '!actors!null' @ 0 : 0; will stop at (end)
2026/06/08-22:28:49.222288 7f51bb7fe6c0 Recovering log #22
2026/06/08-22:28:49.232786 7f51bb7fe6c0 Delete type=3 #20
2026/06/08-22:28:49.232806 7f51bb7fe6c0 Delete type=0 #22
2026/06/08-22:29:08.601469 7f51ba7fc6c0 Level-0 table #28: started
2026/06/08-22:29:08.604604 7f51ba7fc6c0 Level-0 table #28: 4899 bytes OK
2026/06/08-22:29:08.610544 7f51ba7fc6c0 Delete type=0 #26
2026/06/08-22:29:08.630909 7f51ba7fc6c0 Manual compaction at level-0 from '!actors!mgne-comp-beguiled-noble' @ 72057594037927935 : 1 .. '!actors!null' @ 0 : 0; will stop at '!actors!null' @ 17 : 1
2026/06/08-22:29:08.630913 7f51ba7fc6c0 Compacting 1@0 + 1@1 files
2026/06/08-22:29:08.633954 7f51ba7fc6c0 Generated table #29@0: 5 keys, 3562 bytes
2026/06/08-22:29:08.633965 7f51ba7fc6c0 Compacted 1@0 + 1@1 files => 3562 bytes
2026/06/08-22:29:08.639624 7f51ba7fc6c0 compacted to: files[ 0 1 0 0 0 0 0 ]
2026/06/08-22:29:08.639660 7f51ba7fc6c0 Delete type=2 #24
2026/06/08-22:29:08.639710 7f51ba7fc6c0 Delete type=2 #28
2026/06/08-22:29:08.649354 7f51ba7fc6c0 Manual compaction at level-0 from '!actors!null' @ 17 : 1 .. '!actors!null' @ 0 : 0; will stop at (end)
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
View File
+1 -1
View File
@@ -1 +1 @@
MANIFEST-000025
MANIFEST-000030
+14 -3
View File
@@ -1,3 +1,14 @@
2026/05/17-15:40:00.736377 7f1643bff6c0 Recovering log #22
2026/05/17-15:40:00.746313 7f1643bff6c0 Delete type=3 #20
2026/05/17-15:40:00.746417 7f1643bff6c0 Delete type=0 #22
2026/06/08-22:30:14.270038 7f5208bff6c0 Recovering log #27
2026/06/08-22:30:14.279434 7f5208bff6c0 Delete type=3 #25
2026/06/08-22:30:14.279458 7f5208bff6c0 Delete type=0 #27
2026/06/08-22:30:22.441981 7f51ba7fc6c0 Level-0 table #33: started
2026/06/08-22:30:22.445390 7f51ba7fc6c0 Level-0 table #33: 10411 bytes OK
2026/06/08-22:30:22.452159 7f51ba7fc6c0 Delete type=0 #31
2026/06/08-22:30:22.471146 7f51ba7fc6c0 Manual compaction at level-0 from '!items!mgne-feat-11' @ 72057594037927935 : 1 .. '!items!null' @ 0 : 0; will stop at '!items!null' @ 181 : 1
2026/06/08-22:30:22.471150 7f51ba7fc6c0 Compacting 1@0 + 1@1 files
2026/06/08-22:30:22.474171 7f51ba7fc6c0 Generated table #34@0: 37 keys, 8891 bytes
2026/06/08-22:30:22.474190 7f51ba7fc6c0 Compacted 1@0 + 1@1 files => 8891 bytes
2026/06/08-22:30:22.480499 7f51ba7fc6c0 compacted to: files[ 0 1 0 0 0 0 0 ]
2026/06/08-22:30:22.480746 7f51ba7fc6c0 Delete type=2 #29
2026/06/08-22:30:22.480804 7f51ba7fc6c0 Delete type=2 #33
2026/06/08-22:30:22.507958 7f51ba7fc6c0 Manual compaction at level-0 from '!items!null' @ 181 : 1 .. '!items!null' @ 0 : 0; will stop at (end)
+14 -15
View File
@@ -1,15 +1,14 @@
2026/05/17-13:26:05.076690 7f1643bff6c0 Recovering log #17
2026/05/17-13:26:05.087217 7f1643bff6c0 Delete type=3 #15
2026/05/17-13:26:05.087270 7f1643bff6c0 Delete type=0 #17
2026/05/17-15:39:46.194394 7f1641bfb6c0 Level-0 table #23: started
2026/05/17-15:39:46.197937 7f1641bfb6c0 Level-0 table #23: 10414 bytes OK
2026/05/17-15:39:46.204111 7f1641bfb6c0 Delete type=0 #21
2026/05/17-15:39:46.215335 7f1641bfb6c0 Manual compaction at level-0 from '!items!mgne-feat-11' @ 72057594037927935 : 1 .. '!items!null' @ 0 : 0; will stop at (end)
2026/05/17-15:39:46.234408 7f1641bfb6c0 Manual compaction at level-1 from '!items!mgne-feat-11' @ 72057594037927935 : 1 .. '!items!null' @ 0 : 0; will stop at '!items!null' @ 145 : 1
2026/05/17-15:39:46.234419 7f1641bfb6c0 Compacting 1@1 + 1@2 files
2026/05/17-15:39:46.238287 7f1641bfb6c0 Generated table #24@1: 1 keys, 727 bytes
2026/05/17-15:39:46.238317 7f1641bfb6c0 Compacted 1@1 + 1@2 files => 727 bytes
2026/05/17-15:39:46.244549 7f1641bfb6c0 compacted to: files[ 0 0 2 0 0 0 0 ]
2026/05/17-15:39:46.244607 7f1641bfb6c0 Delete type=2 #19
2026/05/17-15:39:46.244675 7f1641bfb6c0 Delete type=2 #23
2026/05/17-15:39:46.253828 7f1641bfb6c0 Manual compaction at level-1 from '!items!null' @ 145 : 1 .. '!items!null' @ 0 : 0; will stop at (end)
2026/06/08-22:28:49.211463 7f51bbfff6c0 Recovering log #22
2026/06/08-22:28:49.220803 7f51bbfff6c0 Delete type=3 #20
2026/06/08-22:28:49.220825 7f51bbfff6c0 Delete type=0 #22
2026/06/08-22:29:08.581725 7f51ba7fc6c0 Level-0 table #28: started
2026/06/08-22:29:08.585305 7f51ba7fc6c0 Level-0 table #28: 10414 bytes OK
2026/06/08-22:29:08.591259 7f51ba7fc6c0 Delete type=0 #26
2026/06/08-22:29:08.610605 7f51ba7fc6c0 Manual compaction at level-0 from '!items!mgne-feat-11' @ 72057594037927935 : 1 .. '!items!null' @ 0 : 0; will stop at '!items!null' @ 145 : 1
2026/06/08-22:29:08.610609 7f51ba7fc6c0 Compacting 1@0 + 1@1 files
2026/06/08-22:29:08.614617 7f51ba7fc6c0 Generated table #29@0: 37 keys, 8891 bytes
2026/06/08-22:29:08.614629 7f51ba7fc6c0 Compacted 1@0 + 1@1 files => 8891 bytes
2026/06/08-22:29:08.620444 7f51ba7fc6c0 compacted to: files[ 0 1 0 0 0 0 0 ]
2026/06/08-22:29:08.620779 7f51ba7fc6c0 Delete type=2 #24
2026/06/08-22:29:08.620832 7f51ba7fc6c0 Delete type=2 #28
2026/06/08-22:29:08.649344 7f51ba7fc6c0 Manual compaction at level-0 from '!items!null' @ 145 : 1 .. '!items!null' @ 0 : 0; will stop at (end)
Binary file not shown.
Binary file not shown.
View File
+1
View File
@@ -0,0 +1 @@
MANIFEST-000010
View File
+7
View File
@@ -0,0 +1,7 @@
2026/06/08-22:30:14.247791 7f5208bff6c0 Recovering log #8
2026/06/08-22:30:14.256936 7f5208bff6c0 Delete type=3 #6
2026/06/08-22:30:14.256960 7f5208bff6c0 Delete type=0 #8
2026/06/08-22:30:22.435551 7f51ba7fc6c0 Level-0 table #13: started
2026/06/08-22:30:22.435653 7f51ba7fc6c0 Level-0 table #13: 0 bytes OK
2026/06/08-22:30:22.441906 7f51ba7fc6c0 Delete type=0 #11
2026/06/08-22:30:22.471135 7f51ba7fc6c0 Manual compaction at level-0 from 'undefined' @ 72057594037927935 : 1 .. 'undefined' @ 0 : 0; will stop at (end)
+7
View File
@@ -0,0 +1,7 @@
2026/06/08-22:28:49.189521 7f51bb7fe6c0 Recovering log #4
2026/06/08-22:28:49.198820 7f51bb7fe6c0 Delete type=3 #2
2026/06/08-22:28:49.198836 7f51bb7fe6c0 Delete type=0 #4
2026/06/08-22:29:08.575568 7f51ba7fc6c0 Level-0 table #9: started
2026/06/08-22:29:08.575599 7f51ba7fc6c0 Level-0 table #9: 0 bytes OK
2026/06/08-22:29:08.581655 7f51ba7fc6c0 Delete type=0 #7
2026/06/08-22:29:08.610595 7f51ba7fc6c0 Manual compaction at level-0 from 'undefined' @ 72057594037927935 : 1 .. 'undefined' @ 0 : 0; will stop at (end)
Binary file not shown.
Binary file not shown.
Binary file not shown.
View File
Binary file not shown.
+1 -1
View File
@@ -1 +1 @@
MANIFEST-000026
MANIFEST-000031
+14 -3
View File
@@ -1,3 +1,14 @@
2026/05/17-15:40:00.792467 7f16423fc6c0 Recovering log #23
2026/05/17-15:40:00.805587 7f16423fc6c0 Delete type=3 #21
2026/05/17-15:40:00.805652 7f16423fc6c0 Delete type=0 #23
2026/06/08-22:30:14.312612 7f51bb7fe6c0 Recovering log #28
2026/06/08-22:30:14.321802 7f51bb7fe6c0 Delete type=3 #26
2026/06/08-22:30:14.321819 7f51bb7fe6c0 Delete type=0 #28
2026/06/08-22:30:22.527571 7f51ba7fc6c0 Level-0 table #34: started
2026/06/08-22:30:22.531034 7f51ba7fc6c0 Level-0 table #34: 36447 bytes OK
2026/06/08-22:30:22.536962 7f51ba7fc6c0 Delete type=0 #32
2026/06/08-22:30:22.553199 7f51ba7fc6c0 Manual compaction at level-0 from '!tables!mgne-tbl-armor' @ 72057594037927935 : 1 .. '!tables.results!zZwxMwSXnTigTfwv' @ 0 : 0; will stop at '!tables.results!zZwxMwSXnTigTfwv' @ 2187 : 1
2026/06/08-22:30:22.553204 7f51ba7fc6c0 Compacting 1@0 + 1@1 files
2026/06/08-22:30:22.557404 7f51ba7fc6c0 Generated table #35@0: 436 keys, 40321 bytes
2026/06/08-22:30:22.557428 7f51ba7fc6c0 Compacted 1@0 + 1@1 files => 40321 bytes
2026/06/08-22:30:22.563722 7f51ba7fc6c0 compacted to: files[ 0 1 0 0 0 0 0 ]
2026/06/08-22:30:22.563803 7f51ba7fc6c0 Delete type=2 #30
2026/06/08-22:30:22.563872 7f51ba7fc6c0 Delete type=2 #34
2026/06/08-22:30:22.569911 7f51ba7fc6c0 Manual compaction at level-0 from '!tables.results!zZwxMwSXnTigTfwv' @ 2187 : 1 .. '!tables.results!zZwxMwSXnTigTfwv' @ 0 : 0; will stop at (end)
+14 -15
View File
@@ -1,15 +1,14 @@
2026/05/17-13:26:05.132672 7f16423fc6c0 Recovering log #18
2026/05/17-13:26:05.142773 7f16423fc6c0 Delete type=3 #16
2026/05/17-13:26:05.142824 7f16423fc6c0 Delete type=0 #18
2026/05/17-15:39:46.374557 7f1641bfb6c0 Level-0 table #24: started
2026/05/17-15:39:46.380380 7f1641bfb6c0 Level-0 table #24: 36276 bytes OK
2026/05/17-15:39:46.386967 7f1641bfb6c0 Delete type=0 #22
2026/05/17-15:39:46.393402 7f1641bfb6c0 Manual compaction at level-0 from '!tables!mgne-tbl-armor' @ 72057594037927935 : 1 .. '!tables.results!zjYp8qq96SSCUgBi' @ 0 : 0; will stop at (end)
2026/05/17-15:39:46.403700 7f1641bfb6c0 Manual compaction at level-1 from '!tables!mgne-tbl-armor' @ 72057594037927935 : 1 .. '!tables.results!zjYp8qq96SSCUgBi' @ 0 : 0; will stop at '!tables.results!zuw1vPYn2wNmreKL' @ 1530 : 0
2026/05/17-15:39:46.403711 7f1641bfb6c0 Compacting 1@1 + 1@2 files
2026/05/17-15:39:46.422351 7f1641bfb6c0 Generated table #25@1: 436 keys, 40426 bytes
2026/05/17-15:39:46.422374 7f1641bfb6c0 Compacted 1@1 + 1@2 files => 40426 bytes
2026/05/17-15:39:46.428514 7f1641bfb6c0 compacted to: files[ 0 0 1 0 0 0 0 ]
2026/05/17-15:39:46.428618 7f1641bfb6c0 Delete type=2 #20
2026/05/17-15:39:46.428754 7f1641bfb6c0 Delete type=2 #24
2026/05/17-15:39:46.428833 7f1641bfb6c0 Manual compaction at level-1 from '!tables.results!zuw1vPYn2wNmreKL' @ 1530 : 0 .. '!tables.results!zjYp8qq96SSCUgBi' @ 0 : 0; will stop at (end)
2026/06/08-22:28:49.254855 7f5208bff6c0 Recovering log #23
2026/06/08-22:28:49.264171 7f5208bff6c0 Delete type=3 #21
2026/06/08-22:28:49.264195 7f5208bff6c0 Delete type=0 #23
2026/06/08-22:29:08.671838 7f51ba7fc6c0 Level-0 table #29: started
2026/06/08-22:29:08.675902 7f51ba7fc6c0 Level-0 table #29: 36492 bytes OK
2026/06/08-22:29:08.681972 7f51ba7fc6c0 Delete type=0 #27
2026/06/08-22:29:08.682176 7f51ba7fc6c0 Manual compaction at level-0 from '!tables!mgne-tbl-armor' @ 72057594037927935 : 1 .. '!tables.results!zXqNG5BZhujFQKgC' @ 0 : 0; will stop at '!tables.results!zmWoeAL1ttcplGwL' @ 1530 : 0
2026/06/08-22:29:08.682179 7f51ba7fc6c0 Compacting 1@0 + 1@1 files
2026/06/08-22:29:08.686025 7f51ba7fc6c0 Generated table #30@0: 436 keys, 40541 bytes
2026/06/08-22:29:08.686040 7f51ba7fc6c0 Compacted 1@0 + 1@1 files => 40541 bytes
2026/06/08-22:29:08.692738 7f51ba7fc6c0 compacted to: files[ 0 1 0 0 0 0 0 ]
2026/06/08-22:29:08.692811 7f51ba7fc6c0 Delete type=2 #25
2026/06/08-22:29:08.692886 7f51ba7fc6c0 Delete type=2 #29
2026/06/08-22:29:08.709397 7f51ba7fc6c0 Manual compaction at level-0 from '!tables.results!zmWoeAL1ttcplGwL' @ 1530 : 0 .. '!tables.results!zXqNG5BZhujFQKgC' @ 0 : 0; will stop at (end)
Binary file not shown.
Binary file not shown.
View File
Binary file not shown.
Binary file not shown.
View File
+1 -1
View File
@@ -1 +1 @@
MANIFEST-000025
MANIFEST-000030
+14 -3
View File
@@ -1,3 +1,14 @@
2026/05/17-15:40:00.721783 7f16433fe6c0 Recovering log #22
2026/05/17-15:40:00.732595 7f16433fe6c0 Delete type=3 #20
2026/05/17-15:40:00.732660 7f16433fe6c0 Delete type=0 #22
2026/06/08-22:30:14.258238 7f51baffd6c0 Recovering log #27
2026/06/08-22:30:14.268354 7f51baffd6c0 Delete type=3 #25
2026/06/08-22:30:14.268384 7f51baffd6c0 Delete type=0 #27
2026/06/08-22:30:22.452241 7f51ba7fc6c0 Level-0 table #33: started
2026/06/08-22:30:22.455121 7f51ba7fc6c0 Level-0 table #33: 7117 bytes OK
2026/06/08-22:30:22.461042 7f51ba7fc6c0 Delete type=0 #31
2026/06/08-22:30:22.480832 7f51ba7fc6c0 Manual compaction at level-0 from '!items!mgne-res-accelerate' @ 72057594037927935 : 1 .. '!items!null' @ 0 : 0; will stop at '!items!null' @ 101 : 1
2026/06/08-22:30:22.480835 7f51ba7fc6c0 Compacting 1@0 + 1@1 files
2026/06/08-22:30:22.483906 7f51ba7fc6c0 Generated table #34@0: 21 keys, 6260 bytes
2026/06/08-22:30:22.483914 7f51ba7fc6c0 Compacted 1@0 + 1@1 files => 6260 bytes
2026/06/08-22:30:22.489545 7f51ba7fc6c0 compacted to: files[ 0 1 0 0 0 0 0 ]
2026/06/08-22:30:22.489564 7f51ba7fc6c0 Delete type=2 #29
2026/06/08-22:30:22.489603 7f51ba7fc6c0 Delete type=2 #33
2026/06/08-22:30:22.507963 7f51ba7fc6c0 Manual compaction at level-0 from '!items!null' @ 101 : 1 .. '!items!null' @ 0 : 0; will stop at (end)
+14 -15
View File
@@ -1,15 +1,14 @@
2026/05/17-13:26:05.061355 7f1642bfd6c0 Recovering log #17
2026/05/17-13:26:05.072897 7f1642bfd6c0 Delete type=3 #15
2026/05/17-13:26:05.072969 7f1642bfd6c0 Delete type=0 #17
2026/05/17-15:39:46.204241 7f1641bfb6c0 Level-0 table #23: started
2026/05/17-15:39:46.207933 7f1641bfb6c0 Level-0 table #23: 7117 bytes OK
2026/05/17-15:39:46.215151 7f1641bfb6c0 Delete type=0 #21
2026/05/17-15:39:46.215347 7f1641bfb6c0 Manual compaction at level-0 from '!items!mgne-res-accelerate' @ 72057594037927935 : 1 .. '!items!null' @ 0 : 0; will stop at (end)
2026/05/17-15:39:46.244725 7f1641bfb6c0 Manual compaction at level-1 from '!items!mgne-res-accelerate' @ 72057594037927935 : 1 .. '!items!null' @ 0 : 0; will stop at '!items!null' @ 81 : 1
2026/05/17-15:39:46.244731 7f1641bfb6c0 Compacting 1@1 + 1@2 files
2026/05/17-15:39:46.247722 7f1641bfb6c0 Generated table #24@1: 1 keys, 910 bytes
2026/05/17-15:39:46.247731 7f1641bfb6c0 Compacted 1@1 + 1@2 files => 910 bytes
2026/05/17-15:39:46.253408 7f1641bfb6c0 compacted to: files[ 0 0 2 0 0 0 0 ]
2026/05/17-15:39:46.253506 7f1641bfb6c0 Delete type=2 #19
2026/05/17-15:39:46.253663 7f1641bfb6c0 Delete type=2 #23
2026/05/17-15:39:46.253842 7f1641bfb6c0 Manual compaction at level-1 from '!items!null' @ 81 : 1 .. '!items!null' @ 0 : 0; will stop at (end)
2026/06/08-22:28:49.200176 7f5208bff6c0 Recovering log #22
2026/06/08-22:28:49.209944 7f5208bff6c0 Delete type=3 #20
2026/06/08-22:28:49.209966 7f5208bff6c0 Delete type=0 #22
2026/06/08-22:29:08.591310 7f51ba7fc6c0 Level-0 table #28: started
2026/06/08-22:29:08.594536 7f51ba7fc6c0 Level-0 table #28: 7117 bytes OK
2026/06/08-22:29:08.601407 7f51ba7fc6c0 Delete type=0 #26
2026/06/08-22:29:08.620865 7f51ba7fc6c0 Manual compaction at level-0 from '!items!mgne-res-accelerate' @ 72057594037927935 : 1 .. '!items!null' @ 0 : 0; will stop at '!items!null' @ 81 : 1
2026/06/08-22:29:08.620870 7f51ba7fc6c0 Compacting 1@0 + 1@1 files
2026/06/08-22:29:08.624059 7f51ba7fc6c0 Generated table #29@0: 21 keys, 6260 bytes
2026/06/08-22:29:08.624070 7f51ba7fc6c0 Compacted 1@0 + 1@1 files => 6260 bytes
2026/06/08-22:29:08.630785 7f51ba7fc6c0 compacted to: files[ 0 1 0 0 0 0 0 ]
2026/06/08-22:29:08.630825 7f51ba7fc6c0 Delete type=2 #24
2026/06/08-22:29:08.630879 7f51ba7fc6c0 Delete type=2 #28
2026/06/08-22:29:08.649350 7f51ba7fc6c0 Manual compaction at level-0 from '!items!null' @ 81 : 1 .. '!items!null' @ 0 : 0; will stop at (end)
Binary file not shown.
Binary file not shown.
Binary file not shown.
View File
+1
View File
@@ -0,0 +1 @@
MANIFEST-000078
View File
+8
View File
@@ -0,0 +1,8 @@
2026/06/08-22:30:14.327510 7f51bb7fe6c0 Recovering log #76
2026/06/08-22:30:14.337488 7f51bb7fe6c0 Delete type=3 #74
2026/06/08-22:30:14.337504 7f51bb7fe6c0 Delete type=0 #76
2026/06/08-22:30:22.537044 7f51ba7fc6c0 Level-0 table #81: started
2026/06/08-22:30:22.537057 7f51ba7fc6c0 Level-0 table #81: 0 bytes OK
2026/06/08-22:30:22.543904 7f51ba7fc6c0 Delete type=0 #79
2026/06/08-22:30:22.563905 7f51ba7fc6c0 Manual compaction at level-0 from '!scenes!D6yaY8sk0WN8mCr5' @ 72057594037927935 : 1 .. '!scenes.levels!D6yaY8sk0WN8mCr5.defaultLevel0000' @ 0 : 0; will stop at (end)
2026/06/08-22:30:22.569921 7f51ba7fc6c0 Manual compaction at level-1 from '!scenes!D6yaY8sk0WN8mCr5' @ 72057594037927935 : 1 .. '!scenes.levels!D6yaY8sk0WN8mCr5.defaultLevel0000' @ 0 : 0; will stop at (end)
+8
View File
@@ -0,0 +1,8 @@
2026/06/08-22:28:49.269367 7f51bbfff6c0 Recovering log #72
2026/06/08-22:28:49.278531 7f51bbfff6c0 Delete type=3 #70
2026/06/08-22:28:49.278550 7f51bbfff6c0 Delete type=0 #72
2026/06/08-22:29:08.665780 7f51ba7fc6c0 Level-0 table #77: started
2026/06/08-22:29:08.665796 7f51ba7fc6c0 Level-0 table #77: 0 bytes OK
2026/06/08-22:29:08.671775 7f51ba7fc6c0 Delete type=0 #75
2026/06/08-22:29:08.682100 7f51ba7fc6c0 Manual compaction at level-0 from '!scenes!D6yaY8sk0WN8mCr5' @ 72057594037927935 : 1 .. '!scenes.levels!D6yaY8sk0WN8mCr5.defaultLevel0000' @ 0 : 0; will stop at (end)
2026/06/08-22:29:08.692925 7f51ba7fc6c0 Manual compaction at level-1 from '!scenes!D6yaY8sk0WN8mCr5' @ 72057594037927935 : 1 .. '!scenes.levels!D6yaY8sk0WN8mCr5.defaultLevel0000' @ 0 : 0; will stop at (end)

Some files were not shown because too many files have changed in this diff Show More