11 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
130 changed files with 1646 additions and 1136 deletions
+10 -10
View File
@@ -50,13 +50,13 @@ jobs:
system.json system.json
api_key: "${{secrets.ALLOW_PUSH_RELEASE}}" api_key: "${{secrets.ALLOW_PUSH_RELEASE}}"
#- name: Publish to Foundry server - name: Publish to Foundry server
# uses: djlechuck/foundryvtt-publish-package-action@v1 uses: djlechuck/foundryvtt-publish-package-action@v1
# with: with:
# token: ${{ secrets.FOUNDRYVTT_RELEASE_TOKEN }} token: ${{ secrets.FOUNDRYVTT_RELEASE_TOKEN }}
# id: fvtt-machine-gods-noxian-expanse id: fvtt-machine-gods-noxian-expanse
# version: ${{github.event.release.tag_name}} version: ${{github.event.release.tag_name}}
# manifest: 'https://www.uberwald.me/gitea/public/uberwald/fvtt-machine-gods-noxian-expanse/releases/download/latest/system.json' 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' 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-minimum: '14'
# compatibility-verified: '13' compatibility-verified: '14'
+1
View File
@@ -1,3 +1,4 @@
.github/ .github/
rules/ rules/
node_modules/ 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

+444 -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", () => { Hooks.once("setup", () => {
localizeSystemConfig() 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`) 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) => { Hooks.on("deleteCombat", (combat) => {
@@ -92,7 +132,7 @@ Hooks.on("deleteCombat", (combat) => {
if (!cores.length) return if (!cores.length) return
const lines = cores.map(c => `<li><strong>${c.parent.name}</strong> — ${c.name} (${c.system.usageDie})</li>`).join("") const lines = cores.map(c => `<li><strong>${c.parent.name}</strong> — ${c.name} (${c.system.usageDie})</li>`).join("")
ChatMessage.create({ 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 => { root.querySelectorAll(".mgne-apply-damage-select").forEach(select => {
const isAllowed = game.user.isGM || message.isAuthor const isAllowed = game.user.isGM || message.isAuthor
if (!isAllowed) { if (!isAllowed) {
@@ -156,6 +257,7 @@ Hooks.on("renderChatMessageHTML", (message, element) => {
const card = select.closest(".mgne-chat-card") const card = select.closest(".mgne-chat-card")
const damageTotal = parseInt(card?.dataset.damageTotal ?? "0", 10) || 0 const damageTotal = parseInt(card?.dataset.damageTotal ?? "0", 10) || 0
const damageCritical = card?.dataset.damageCritical === "true" const damageCritical = card?.dataset.damageCritical === "true"
const targetActorId = card?.dataset.targetActorId ?? null
const tokens = canvas.scene?.tokens.contents ?? [] const tokens = canvas.scene?.tokens.contents ?? []
for (const token of tokens) { for (const token of tokens) {
@@ -163,6 +265,9 @@ Hooks.on("renderChatMessageHTML", (message, element) => {
const opt = document.createElement("option") const opt = document.createElement("option")
opt.value = token.id opt.value = token.id
opt.textContent = token.name opt.textContent = token.name
if (targetActorId && token.actor.id === targetActorId) {
opt.selected = true
}
select.appendChild(opt) select.appendChild(opt)
} }
@@ -206,7 +311,7 @@ Hooks.on("renderChatMessageHTML", (message, element) => {
await ChatMessage.create({ await ChatMessage.create({
speaker: ChatMessage.getSpeaker({ actor: targetActor }), speaker: ChatMessage.getSpeaker({ actor: targetActor }),
rolls: [reduceRoll], 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", "ArtifactSync": "Artifact Sync",
"CarryingCapacity": "Carrying Capacity", "CarryingCapacity": "Carrying Capacity",
"Load": "Load", "Load": "Load",
"CapacityModifier": "Carrying Capacity",
"Rations": "Rations", "Rations": "Rations",
"Kiffol": "Kiffol", "Kiffol": "Kiffol",
"Weapons": "Weapons", "Weapons": "Weapons",
@@ -223,6 +224,9 @@
"carryCapacity": { "carryCapacity": {
"label": "Carrying Capacity" "label": "Carrying Capacity"
}, },
"carryCapacityModifier": {
"label": "Capacity Modifier"
},
"rations": { "rations": {
"label": "Rations" "label": "Rations"
}, },
@@ -452,6 +456,7 @@
"QuantityShort": "Qty", "QuantityShort": "Qty",
"Range": "Range", "Range": "Range",
"Resonation": "Resonation", "Resonation": "Resonation",
"Processing": "Processing...",
"Roll": "Roll", "Roll": "Roll",
"No": "No", "No": "No",
"Subtype": "Subtype", "Subtype": "Subtype",
@@ -512,8 +517,11 @@
"StudyHelp": "Each action lowers the target number by 1, to a minimum of 2+." "StudyHelp": "Each action lowers the target number by 1, to a minimum of 2+."
}, },
"Notification": { "Notification": {
"ActorNotFound": "Actor not found.",
"ActorOrItemNotFound": "Actor or item not found for damage roll.", "ActorOrItemNotFound": "Actor or item not found for damage roll.",
"CannotSyncMore": "{actor} cannot synchronize any more artifacts today.", "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.", "ItemBroken": "{item} is broken.",
"ItemBurnedOut": "{item} is burned out.", "ItemBurnedOut": "{item} is burned out.",
"ItemDepleted": "{item} is already depleted.", "ItemDepleted": "{item} is already depleted.",
@@ -585,6 +593,7 @@
"OutcomeSuccess": "Success", "OutcomeSuccess": "Success",
"QuickRestLabel": "{actor} Takes a Quick Rest", "QuickRestLabel": "{actor} Takes a Quick Rest",
"RestoredHP": "Restored {amount} HP", "RestoredHP": "Restored {amount} HP",
"RerollWithOmen": "Reroll with Omen",
"RollDamage": "Roll Damage", "RollDamage": "Roll Damage",
"TakesDamageLabel": "{actor} Takes Damage", "TakesDamageLabel": "{actor} Takes Damage",
"TargetName": "Target: {target}", "TargetName": "Target: {target}",
@@ -789,6 +798,9 @@
}, },
"featureId": { "featureId": {
"label": "Feature Id" "label": "Feature Id"
},
"capacity": {
"label": "Capacity"
} }
} }
}, },
+71 -14
View File
@@ -19,7 +19,12 @@
.window-header { .window-header {
background: 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); linear-gradient(180deg, color-mix(in srgb, @bg-char 80%, black), @bg-void);
border-bottom: 1px solid fade(@gold-acid, 35%); border-bottom: 1px solid fade(@gold-acid, 35%);
color: @bone; color: @bone;
@@ -64,7 +69,11 @@
.window-content { .window-content {
background: background:
radial-gradient(circle at top left, fade(@ember, 12%), transparent 28%), 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%)), linear-gradient(180deg, fade(@bg-char, 30%), fade(@bg-void, 28%)),
url("@{page-bg-url}") center top / cover no-repeat, url("@{page-bg-url}") center top / cover no-repeat,
linear-gradient(180deg, @bg-char, @bg-void 120%); linear-gradient(180deg, @bg-char, @bg-void 120%);
@@ -107,8 +116,7 @@
border: 1px solid fade(@bone, 22%); border: 1px solid fade(@bone, 22%);
border-radius: @radius-sm; border-radius: @radius-sm;
background: background:
linear-gradient(180deg, fade(@bone, 4%), transparent 60%), linear-gradient(180deg, fade(@bone, 4%), transparent 60%), @bg-input;
@bg-input;
color: @parchment; color: @parchment;
padding: 0.4rem 0.52rem; padding: 0.4rem 0.52rem;
box-shadow: inset 0 1px 0 fade(white, 4%); box-shadow: inset 0 1px 0 fade(white, 4%);
@@ -116,7 +124,9 @@
&:focus { &:focus {
outline: none; outline: none;
border-color: fade(@ember-bright, 70%); 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% - 11px) calc(50% - 2px),
calc(100% - 7px) calc(50% - 2px), calc(100% - 7px) calc(50% - 2px),
0 0; 0 0;
background-size: 4px 4px, 4px 4px, auto; background-size:
4px 4px,
4px 4px,
auto;
background-repeat: no-repeat; background-repeat: no-repeat;
} }
@@ -147,16 +160,27 @@
.application.mgne label { .application.mgne label {
.caps-heading(); .caps-heading();
color: @label-ink; color: @bone;
font-size: 0.74rem; 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 { .application.mgne fieldset {
.panel-shell(); .panel-shell();
.ornate-frame(); .ornate-frame();
margin: 0; 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 // ProseMirror / toggled editor inside fieldset — enforce contrast on dark bg
.application.mgne fieldset { .application.mgne fieldset {
.editor, .editor,
@@ -168,9 +192,18 @@
} }
.editor-content, .editor-content,
.ProseMirror { .ProseMirror {
p, li { color: lighten(@parchment, 8%); } p,
h1, h2, h3 { color: @gold-acid; } li {
.is-empty::before { color: fade(@gold-acid, 40%); } color: lighten(@parchment, 8%);
}
h1,
h2,
h3 {
color: @gold-acid;
}
.is-empty::before {
color: fade(@gold-acid, 40%);
}
} }
.editor-menu button { .editor-menu button {
color: @bone; color: @bone;
@@ -203,17 +236,17 @@
} }
.application.mgne .empty-state { .application.mgne .empty-state {
color: fade(@ash, 94%); color: @bg-char;
font-style: italic; font-style: italic;
letter-spacing: 0.03em; letter-spacing: 0.03em;
} }
.application.mgne .rollable { .application.mgne .rollable {
color: @ember-bright; color: lighten(@parchment, 8%);
text-shadow: 0 0 12px fade(@ember, 18%); text-shadow: 0 0 12px fade(@gold-acid, 18%);
&:hover { &:hover {
color: lighten(@ember-bright, 10%); color: lighten(@parchment, 12%);
} }
} }
@@ -243,3 +276,27 @@
opacity: 0.5; 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(); .ornate-frame();
display: flex; display: flex;
flex-direction: column; flex-direction: column;
gap: 0.6rem; gap: 0.5rem;
padding: 0.68rem; padding: 0.62rem 0.68rem;
color: @iron; color: @iron;
background: background:
radial-gradient(circle at top right, fade(@verdigris, 10%), transparent 22%), radial-gradient(circle at top right, fade(@verdigris, 10%), transparent 22%),
@@ -17,189 +17,351 @@
.mgne-chat-card .chat-card-header { .mgne-chat-card .chat-card-header {
display: flex; display: flex;
gap: 0.6rem; gap: 0.55rem;
align-items: center; align-items: center;
padding-bottom: 0.4rem;
border-bottom: 1px solid fade(@gold-acid, 14%);
} }
.mgne-chat-card .chat-card-header img { .mgne-chat-card .chat-card-header img {
width: 36px; width: 34px;
height: 36px; height: 34px;
object-fit: cover; object-fit: cover;
border-radius: 50%; border-radius: 50%;
border: 1px solid fade(@gold-acid, 38%); border: 1px solid fade(@gold-acid, 32%);
box-shadow: 0 0 0 2px fade(@parchment, 6%); box-shadow: 0 0 0 2px fade(@parchment, 5%);
flex-shrink: 0;
} }
.mgne-chat-card .chat-eyebrow { .mgne-chat-card .chat-header-text {
display: none; flex: 1;
min-width: 0;
display: flex;
flex-direction: column;
gap: 0.05rem;
} }
.mgne-chat-card h3 { .mgne-chat-card h3 {
.caps-heading(); .caps-heading();
margin: 0; margin: 0;
color: @label-ink; color: darken(@label-ink, 22%);
font-size: 0.82rem; font-size: 0.78rem;
} line-height: 1.2;
white-space: nowrap;
.mgne-chat-card .chat-actor, overflow: hidden;
.mgne-chat-card .chat-subtitle, text-overflow: ellipsis;
.mgne-chat-card .chat-formula,
.mgne-chat-card .chat-special {
margin: 0;
} }
.mgne-chat-card .chat-actor { .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 { .mgne-chat-card .chat-mode-badge {
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 {
.caps-heading(); .caps-heading();
font-size: 0.62rem; font-size: 0.6rem;
color: @parchment; 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 { .mgne-chat-card .chat-card-body {
font-family: @font-display; display: flex;
font-size: 1.08rem; flex-direction: column;
color: @parchment; gap: 0.4rem;
} }
.mgne-chat-card .chat-outcome, // Subtitle line
.mgne-chat-card .chat-damage-total { .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 { &.has-tooltip {
cursor: pointer; cursor: pointer;
user-select: none; 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 { .chat-tooltip-icon {
opacity: 0.55; opacity: 0.5;
font-size: 0.75em; font-size: 0.7rem;
margin-left: 0.3rem; margin-left: 0.15rem;
vertical-align: middle; flex-shrink: 0;
transition: opacity 0.15s; transition: opacity 0.15s;
} }
&.tooltip-open .chat-tooltip-icon { opacity: 1; } &.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 // Dice tooltip reveal panel
.mgne-chat-card .chat-dice-tooltip { .mgne-chat-card .chat-dice-tooltip {
margin-top: 0.4rem; padding: 0.35rem 0.5rem;
padding: 0.4rem 0.55rem;
background: fade(@bg-void, 85%); background: fade(@bg-void, 85%);
border: 1px solid fade(@bone, 22%); border: 1px solid fade(@bone, 18%);
border-radius: @radius-sm; border-radius: @radius-sm;
// Foundry's standard dice-roll markup
.dice-roll { .dice-roll {
display: flex; display: flex;
flex-direction: column; flex-direction: column;
gap: 0.2rem; gap: 0.15rem;
} }
.dice-formula { .dice-formula {
font-family: "Courier New", monospace; font-family: "Courier New", monospace;
font-size: 0.72rem; font-size: 0.7rem;
color: fade(@parchment, 65%); color: fade(@parchment, 72%);
} }
.dice-tooltip { .dice-tooltip {
font-size: 0.78rem; font-size: 0.75rem;
} }
.dice { .dice {
margin: 0.15rem 0; margin: 0.1rem 0;
} }
.die-icon, .die-face { .die-icon, .die-face {
color: @gold-acid; 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; } .part-total { color: @parchment; font-weight: 600; }
.max { color: lighten(@verdigris, 20%); } .max { color: lighten(@verdigris, 20%); }
.min { color: lighten(@ember-bright, 10%); } .min { color: lighten(@ember-bright, 10%); }
.dice-total { .dice-total {
font-family: "CastorTwoMGNE", serif; font-family: @font-display;
font-size: 1.05rem; font-size: 1rem;
color: @gold-acid; color: @gold-acid;
text-align: right; text-align: center;
border-top: 1px solid fade(@bone, 20%); border-top: 1px solid fade(@bone, 16%);
padding-top: 0.2rem; padding-top: 0.2rem;
margin-top: 0.15rem; margin-top: 0.1rem;
} }
} }
.mgne-chat-card .chat-outcome { // Special text
.caps-heading(); .mgne-chat-card .chat-special-wrap {
margin: 0; display: flex;
padding: 0.3rem 0.55rem; 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; 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 { .mgne-chat-card .chat-special-icon {
padding: 0.42rem 0.55rem; flex-shrink: 0;
border-left: 3px solid fade(@ember-bright, 55%); font-size: 0.7rem;
background: fade(@bg-input, 85%); color: @ember-bright;
margin-top: 0.08rem;
}
.mgne-chat-card .chat-special-text {
color: @parchment; color: @parchment;
font-size: 0.72rem;
line-height: 1.4;
} }
.mgne-chat-card.outcome-critical-success, // Omen reminders
.mgne-chat-card.outcome-success, .mgne-chat-card .chat-omen-remind,
.mgne-chat-card.outcome-steady { .mgne-chat-card .chat-omen-used {
border-color: fade(@verdigris, 42%); 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 { .mgne-chat-card .chat-omen-remind {
color: lighten(@verdigris, 28%); background: fade(@gold-acid, 18%);
border-left-color: fade(@verdigris, 80%); 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 .chat-omen-neutralize {
.mgne-chat-card.outcome-broken, background: fade(@ember-bright, 18%);
.mgne-chat-card.outcome-fumble { border-color: fade(@ember-bright, 35%);
border-color: fade(@blood, 48%); color: lighten(@ember-bright, 15%);
.chat-outcome { i {
color: lighten(@ember-bright, 18%); color: @ember-bright;
border-left-color: fade(@ember-bright, 80%);
} }
} }
.mgne-chat-card.mode-apply-damage .chat-result-total, .mgne-chat-card .chat-omen-used {
.mgne-chat-card.mode-damage .chat-result-total { background: fade(@verdigris, 18%);
color: lighten(@ember-bright, 8%); 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 { .mgne-chat-card .chat-card-actions {
margin-top: 0.2rem; margin-top: 0.1rem;
} }
// Roll damage button
.mgne-roll-damage-btn { .mgne-roll-damage-btn {
display: flex; display: flex;
align-items: center; align-items: center;
justify-content: center; justify-content: center;
gap: 0.45rem; gap: 0.4rem;
width: 100%; width: 100%;
padding: 0.38rem 0.7rem; padding: 0.38rem 0.7rem;
border: 1px solid @ember-bright; border: 1px solid @ember-bright;
@@ -207,7 +369,7 @@
background: @ember; background: @ember;
color: #f8ede0; color: #f8ede0;
font-family: @font-display; font-family: @font-display;
font-size: 0.78rem; font-size: 0.76rem;
font-weight: 600; font-weight: 600;
letter-spacing: 0.06em; letter-spacing: 0.06em;
cursor: pointer; cursor: pointer;
@@ -215,7 +377,7 @@
.dmg-formula { .dmg-formula {
color: #fff5e8; color: #fff5e8;
font-size: 0.75rem; font-size: 0.73rem;
font-weight: 700; 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 { .chat-apply-actions {
margin-top: 0.35rem; margin-top: 0.25rem;
} }
.mgne-apply-damage-select { .mgne-apply-damage-select {
@@ -254,7 +443,7 @@
background: @bg-char; background: @bg-char;
color: @bone; color: @bone;
font-family: @font-body; font-family: @font-body;
font-size: 0.8rem; font-size: 0.78rem;
font-weight: 600; font-weight: 600;
cursor: pointer; cursor: pointer;
transition: border-color 0.15s, background 0.15s; transition: border-color 0.15s, background 0.15s;
+81 -34
View File
@@ -203,15 +203,15 @@
} }
.application.mgne .resource-box-inline-track .numeric-caption { .application.mgne .resource-box-inline-track .numeric-caption {
color: @label-ink; color: @bone;
} }
.application.mgne .resource-box-inline-track .numeric-caption-strong { .application.mgne .resource-box-inline-track .numeric-caption-strong {
padding: 0.08rem 0.34rem; padding: 0.08rem 0.34rem;
border-radius: 999px; border-radius: 999px;
background: fade(@gold-acid, 18%); background: fade(@gold-acid, 18%);
border: 1px solid fade(@label-ink, 28%); border: 1px solid fade(@bone, 28%);
color: darken(@label-ink, 4%); color: @bone;
font-size: 0.6rem; font-size: 0.6rem;
letter-spacing: 0.11em; letter-spacing: 0.11em;
} }
@@ -261,7 +261,7 @@
.application.mgne .numeric-caption { .application.mgne .numeric-caption {
.caps-heading(); .caps-heading();
color: fade(@label-soft, 94%); color: lighten(@label-soft, 2%);
font-size: 0.58rem; font-size: 0.58rem;
letter-spacing: 0.12em; letter-spacing: 0.12em;
} }
@@ -479,6 +479,18 @@
font-size: 0.82rem; 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 { .application.mgne .item-row {
position: relative; position: relative;
display: grid; display: grid;
@@ -584,8 +596,8 @@
} }
.application.mgne .resource-label-accent { .application.mgne .resource-label-accent {
color: @ember-bright; color: lighten(@parchment, 8%);
text-shadow: 0 0 12px fade(@ember, 18%); text-shadow: 0 0 12px fade(@gold-acid, 18%);
} }
.application.mgne .ability-score { .application.mgne .ability-score {
@@ -647,6 +659,32 @@
@bg-panel-soft; @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) { @media (max-width: 960px) {
.application.mgne .sheet-header, .application.mgne .sheet-header,
.application.mgne .resource-bar, .application.mgne .resource-bar,
@@ -693,9 +731,9 @@
} }
&.weight-heavy { &.weight-heavy {
color: @blood; color: @bone;
border-color: fade(@blood, 45%); border-color: fade(@gold-acid, 45%);
background: fade(@blood, 12%); background: fade(@ash, 12%);
} }
} }
@@ -707,16 +745,16 @@
} }
.load-overloaded { .load-overloaded {
color: @blood !important; color: lighten(@parchment, 8%) !important;
text-shadow: 0 0 6px fade(@blood, 50%); text-shadow: 0 0 6px fade(@gold-acid, 50%);
} }
.resource-box-overloaded { .resource-box-overloaded {
border-color: fade(@blood, 60%) !important; border-color: fade(@gold-acid, 60%) !important;
background: fade(@blood, 10%) !important; background: fade(@ash, 10%) !important;
.resource-label-accent { .resource-label-accent {
color: @blood !important; color: lighten(@parchment, 8%) !important;
} }
} }
@@ -748,9 +786,9 @@
font-weight: 700; font-weight: 700;
text-transform: uppercase; text-transform: uppercase;
letter-spacing: 0.06em; letter-spacing: 0.06em;
color: @blood; color: lighten(@parchment, 8%);
background: fade(@blood, 14%); background: fade(@ash, 14%);
border: 1px solid fade(@blood, 45%); border: 1px solid fade(@bone, 45%);
border-radius: 3px; border-radius: 3px;
vertical-align: middle; vertical-align: middle;
} }
@@ -775,9 +813,9 @@
letter-spacing: 0.03em; letter-spacing: 0.03em;
&.durability-broken { &.durability-broken {
color: @blood; color: lighten(@parchment, 8%);
border-color: fade(@blood, 40%); border-color: fade(@bone, 40%);
background: fade(@blood, 10%); background: fade(@ash, 10%);
text-decoration: line-through; text-decoration: line-through;
} }
} }
@@ -788,7 +826,7 @@
.item-name { .item-name {
text-decoration: line-through; text-decoration: line-through;
color: fade(@parchment, 55%); color: lighten(@parchment, 6%);
} }
} }
@@ -874,7 +912,7 @@
font-weight: 700; font-weight: 700;
text-transform: uppercase; text-transform: uppercase;
letter-spacing: 0.08em; letter-spacing: 0.08em;
color: fade(@blood, 90%); color: lighten(@blood, 8%);
} }
button { button {
@@ -882,7 +920,7 @@
padding: 0.15em 0.6em; padding: 0.15em 0.6em;
background: fade(@blood, 12%); background: fade(@blood, 12%);
border: 1px solid fade(@blood, 35%); border: 1px solid fade(@blood, 35%);
color: fade(@blood, 80%); color: lighten(@blood, 4%);
border-radius: 3px; border-radius: 3px;
cursor: pointer; cursor: pointer;
transition: background 0.15s, color 0.15s; transition: background 0.15s, color 0.15s;
@@ -992,7 +1030,7 @@
font-weight: 700; font-weight: 700;
text-transform: uppercase; text-transform: uppercase;
letter-spacing: 0.07em; letter-spacing: 0.07em;
color: fade(@ember, 80%); color: @parchment;
white-space: nowrap; white-space: nowrap;
} }
@@ -1008,10 +1046,14 @@
align-items: center; align-items: center;
gap: 0.3em; gap: 0.3em;
font-size: 0.83rem; font-size: 0.83rem;
color: @parchment; color: @parchment !important;
cursor: pointer; cursor: pointer;
user-select: none; user-select: none;
> span {
color: @parchment !important;
}
input[type="checkbox"] { input[type="checkbox"] {
appearance: checkbox; appearance: checkbox;
-webkit-appearance: checkbox; -webkit-appearance: checkbox;
@@ -1075,12 +1117,17 @@
&.drop-hint { &.drop-hint {
border: 2px dashed fade(@ember, 35%); border: 2px dashed fade(@ember, 35%);
background: fade(@ember, 4%); background: fade(@ember, 4%);
color: fade(@parchment, 50%); color: @parchment;
font-style: italic; font-style: italic;
justify-content: center; justify-content: center;
cursor: default; cursor: default;
transition: background 0.15s, border-color 0.15s; 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%); } i { color: fade(@ember, 50%); }
&:hover, &.drag-over { &:hover, &.drag-over {
@@ -1100,9 +1147,9 @@
button { button {
font-size: 0.75rem; font-size: 0.75rem;
padding: 0.15em 0.55em; padding: 0.15em 0.55em;
background: fade(@ember, 10%); background: fade(@ash, 10%);
border: 1px solid fade(@ember, 30%); border: 1px solid fade(@gold-acid, 30%);
color: fade(@ember, 80%); color: lighten(@parchment, 6%);
border-radius: 3px; border-radius: 3px;
cursor: pointer; cursor: pointer;
transition: background 0.15s, color 0.15s; transition: background 0.15s, color 0.15s;
@@ -1111,8 +1158,8 @@
gap: 0.3em; gap: 0.3em;
&:hover { &:hover {
background: fade(@ember, 22%); background: fade(@ash, 22%);
color: @ember; color: @bone;
} }
} }
} }
@@ -1241,7 +1288,7 @@
} }
.application.mgne.party .party-member-hp { .application.mgne.party .party-member-hp {
color: @ember-bright; color: @bone;
font-family: @font-display; font-family: @font-display;
font-size: 0.82rem; font-size: 0.82rem;
font-weight: 700; font-weight: 700;
@@ -1249,7 +1296,7 @@
} }
.application.mgne.party .party-member-type { .application.mgne.party .party-member-type {
color: @dust; color: lighten(@dust, 12%);
font-size: 0.78rem; font-size: 0.78rem;
font-style: italic; font-style: italic;
} }
@@ -1308,7 +1355,7 @@
// ── Party drop hint ──────────────────────────────────────────── // ── Party drop hint ────────────────────────────────────────────
.application.mgne.party .party-drop-hint { .application.mgne.party .party-drop-hint {
color: fade(@dust, 70%); color: @parchment;
font-size: 0.75rem; font-size: 0.75rem;
font-style: italic; font-style: italic;
text-align: center; text-align: center;
+9 -9
View File
@@ -9,16 +9,16 @@
@bg-input: rgba(17, 12, 10, 0.72); @bg-input: rgba(17, 12, 10, 0.72);
@parchment: #ccb292; @parchment: #ccb292;
@bone: #ab8b68; @bone: #ab8b68;
@dust: #7e664f; @dust: #a68e78;
@ash: #5f4d40; @ash: #958068;
@label-ink: #6e3d2a; @label-ink: #a67054;
@label-soft: #81533b; @label-soft: #b1856c;
@iron: #52453c; @iron: #a08878;
@copper: #8d5f3f; @copper: #b49c73;
@verdigris: #4f7d73; @verdigris: #4f7d73;
@ember: #b7461f; @ember: #d87a4f;
@ember-bright: #dd6b2d; @ember-bright: #e89a5f;
@blood: #7f1d17; @blood: #e85a50;
@gold-acid: #c49a45; @gold-acid: #c49a45;
@shadow-heavy: 0 14px 30px rgba(0, 0, 0, 0.36); @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); @shadow-inset: inset 0 1px 0 rgba(255, 236, 203, 0.08), inset 0 0 0 1px rgba(255, 236, 203, 0.03);
+1 -1
View File
@@ -139,7 +139,7 @@ export const SYSTEM = {
{ name: "Clothing (Average)", type: "armor", armorDie: "d2", penalty: 0 }, { name: "Clothing (Average)", type: "armor", armorDie: "d2", penalty: 0 },
{ name: "Helm", type: "armor", armorDie: "d2", penalty: 0 }, { name: "Helm", type: "armor", armorDie: "d2", penalty: 0 },
{ name: "Medium Shield", type: "shield", armorDie: "d4", 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: "Padded Leather", type: "armor", armorDie: "d4", penalty: 1 },
{ name: "Chain Shirt", type: "armor", armorDie: "d6", penalty: 1 }, { name: "Chain Shirt", type: "armor", armorDie: "d6", penalty: 1 },
{ name: "Half Plate", type: "armor", armorDie: "d8", penalty: 2 }, { 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) { async function renderCard(context) {
const outcomeClass = `${context.outcome ?? ""}` const outcomeClass = `${context.outcome ?? ""}`
.toLowerCase() .toLowerCase()
.replace(/[^a-z0-9]+/g, "-") .replace(/[^a-z0-9]+/g, "-")
.replace(/^-|-$/g, "") .replace(/^-|-$/g, "")
const eyebrow = context.eyebrow ?? getChatModeLabel(context.mode ?? "generic") const modeLabel = getChatModeLabel(context.mode ?? "generic")
const normalizedEyebrow = `${eyebrow}`.trim().toLowerCase() const outcomeIcon = OUTCOME_ICONS[outcomeClass] || ""
const normalizedLabel = `${context.label ?? ""}`.trim().toLowerCase() const specialIcon = SPECIAL_ICONS.default
// Render dice tooltip HTML if a roll was provided // Render dice tooltip HTML if a roll was provided
const diceTooltip = context._roll ? await context._roll.render() : null 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`, { return foundry.applications.handlebars.renderTemplate(`systems/${SYSTEM_ID}/templates/chat-message.hbs`, {
...context, ...context,
modeClass: context.mode ?? "generic", modeClass: context.mode ?? "generic",
eyebrow: "", modeLabel,
outcomeClass, outcomeClass,
outcomeIcon,
specialIcon,
diceTooltip, diceTooltip,
}) })
} }
export default class MGNERoll { 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 abilityLabel = SYSTEM.abilities[abilityId]?.label ?? abilityId
const content = await foundry.applications.handlebars.renderTemplate(`systems/${SYSTEM_ID}/templates/roll-dialog.hbs`, { const content = await foundry.applications.handlebars.renderTemplate(`systems/${SYSTEM_ID}/templates/roll-dialog.hbs`, {
actorName: actor.name, actorName: actor.name,
label, label,
abilityLabel, abilityLabel,
baseDR, baseDR,
modifier,
drOptions: numericOptions(6, 20, baseDR), drOptions: numericOptions(6, 20, baseDR),
modifierOptions: numericOptions(-6, 6, 0), modifierOptions: numericOptions(-6, 6, modifier),
omens: actor.system.omens?.current ?? 0, omens: actor.system.omens?.current ?? 0,
rollType, rollType,
}) })
@@ -99,15 +116,15 @@ export default class MGNERoll {
if (!dialogData) return null 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) const spendOmen = Boolean(dialogData.spendOmen)
// Re-read omens after dialog close to avoid race condition (omen could have changed) // Re-read omens after dialog close to avoid race condition (omen could have changed)
const currentOmensAfterDialog = actor.system.omens?.current ?? 0 const currentOmensAfterDialog = actor.system.omens?.current ?? 0
const canSpendOmen = spendOmen && currentOmensAfterDialog > 0 const canSpendOmen = spendOmen && currentOmensAfterDialog > 0
const dr = (Number.parseInt(dialogData.dr ?? baseDR, 10) || baseDR) - (canSpendOmen ? 4 : 0) const dr = (Number.parseInt(dialogData.dr ?? baseDR, 10) || baseDR) - (canSpendOmen ? 4 : 0)
const abilityValue = actor.system.abilities?.[abilityId]?.value ?? 0 const abilityValue = actor.system.abilities?.[abilityId]?.value ?? 0
const sign = modifier >= 0 ? "+" : "-" const sign = dialogModifier >= 0 ? "+" : "-"
const formula = modifier === 0 ? `1d20 + ${abilityValue}` : `1d20 + ${abilityValue} ${sign} ${Math.abs(modifier)}` const formula = dialogModifier === 0 ? `1d20 + ${abilityValue}` : `1d20 + ${abilityValue} ${sign} ${Math.abs(dialogModifier)}`
const roll = await (new Roll(formula)).evaluate() const roll = await (new Roll(formula)).evaluate()
const natural = roll.dice?.[0]?.results?.[0]?.result ?? roll.total 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 showDamageButton = rollType === "attack" && (success || critical) && !!item
const showOmenRerollButton = Boolean(omenRerollReminder)
const contentHtml = await renderCard({ const contentHtml = await renderCard({
mode: "check", mode: "check",
actorName: actor.name, actorName: actor.name,
@@ -160,6 +178,14 @@ export default class MGNERoll {
damageItemId: showDamageButton ? item.id : null, damageItemId: showDamageButton ? item.id : null,
damageFormula: showDamageButton ? (item.system.damage || "1") : null, damageFormula: showDamageButton ? (item.system.damage || "1") : null,
damageCritical: showDamageButton && critical, 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, _roll: roll,
}) })
@@ -198,7 +224,7 @@ export default class MGNERoll {
return { roll, broken } return { roll, broken }
} }
static async rollDamage({ actor, item }) { static async rollDamage({ actor, item, targetActor = null }) {
const damageBonus = await actor.consumePendingDamageBonus(item.id) const damageBonus = await actor.consumePendingDamageBonus(item.id)
const multiplier = damageBonus?.multiplier ?? 1 const multiplier = damageBonus?.multiplier ?? 1
const baseFormula = item.system.damage || "1" const baseFormula = item.system.damage || "1"
@@ -232,7 +258,7 @@ export default class MGNERoll {
mode: "damage", mode: "damage",
actorName: actor.name, actorName: actor.name,
actorImg: actor.img, actorImg: actor.img,
label: `${item.name} Damage`, label: f("MGNE.Roll.ItemDamageLabel", { item: item.name }),
subtitle: null, subtitle: null,
formula: roll.formula, formula: roll.formula,
total: roll.total, total: roll.total,
@@ -242,6 +268,7 @@ export default class MGNERoll {
showApplyButton: true, showApplyButton: true,
damageTotal: roll.total, damageTotal: roll.total,
damageCritical: isCritical, damageCritical: isCritical,
damageTargetActorId: targetActor?.id ?? null,
_roll: roll, _roll: roll,
}) })
@@ -254,7 +281,7 @@ export default class MGNERoll {
return { roll } return { roll }
} }
static async rollFlatDamage({ actor, label, formula }) { static async rollFlatDamage({ actor, label, formula, targetActor = null }) {
const damageBonus = await actor.consumePendingDamageBonus("profile-attack") const damageBonus = await actor.consumePendingDamageBonus("profile-attack")
const multiplier = damageBonus?.multiplier ?? 1 const multiplier = damageBonus?.multiplier ?? 1
const baseFormula = formula || "1" const baseFormula = formula || "1"
@@ -274,6 +301,7 @@ export default class MGNERoll {
showApplyButton: true, showApplyButton: true,
damageTotal: roll.total, damageTotal: roll.total,
damageCritical: isCritical, damageCritical: isCritical,
damageTargetActorId: targetActor?.id ?? null,
_roll: roll, _roll: roll,
}) })
+11 -11
View File
@@ -25,6 +25,7 @@ export default class MGNECharacter extends foundry.abstract.TypeDataModel {
}), }),
conditions: conditionSchema(), conditions: conditionSchema(),
carryCapacity: numberField(8, 0), carryCapacity: numberField(8, 0),
carryCapacityModifier: numberField(0, 0),
rations: numberField(0, 0), rations: numberField(0, 0),
kiffol: numberField(0, 0), kiffol: numberField(0, 0),
background: stringField(""), background: stringField(""),
@@ -40,18 +41,25 @@ export default class MGNECharacter extends foundry.abstract.TypeDataModel {
prepareDerivedData() { prepareDerivedData() {
super.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.resonance.remaining = Math.max(0, (this.resonance.max ?? 0) - (this.resonance.used ?? 0))
this.syncLimit = Math.max(0, this.abilities.toughness?.value ?? 0) this.syncLimit = Math.max(0, this.abilities.toughness?.value ?? 0)
this.syncRemaining = Math.max(0, this.syncLimit - (this.artifactSync.used ?? 0)) this.syncRemaining = Math.max(0, this.syncLimit - (this.artifactSync.used ?? 0))
this.armorFormula = this.parent?.getArmorRollFormula?.() ?? "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: // 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 normalLoad = 0
let lightCount = 0 let lightCount = 0
let heavyCount = 0 let heavyCount = 0
for (const item of (this.parent?.items ?? [])) { 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 if (item.system?.carried === false) continue // not being carried
const w = item.system?.weight ?? "normal" const w = item.system?.weight ?? "normal"
if (w === "trivial") continue if (w === "trivial") continue
@@ -63,15 +71,7 @@ export default class MGNECharacter extends foundry.abstract.TypeDataModel {
this.lightItemCount = lightCount this.lightItemCount = lightCount
this.heavyItemCount = heavyCount this.heavyItemCount = heavyCount
if (heavyCount >= 2) { this.currentLoad = normalLoad + 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.overloaded = this.currentLoad > this.carryCapacity this.overloaded = this.currentLoad > this.carryCapacity
} }
+2 -1
View File
@@ -1,5 +1,5 @@
import { SYSTEM } from "../config/system.mjs" 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 { export default class MGNEFeature extends foundry.abstract.TypeDataModel {
static defineSchema() { static defineSchema() {
@@ -10,6 +10,7 @@ export default class MGNEFeature extends foundry.abstract.TypeDataModel {
blank: true, blank: true,
initial: "", initial: "",
}), }),
capacity: numberField(0, 0),
description: htmlField(""), description: htmlField(""),
} }
} }
+75 -18
View File
@@ -7,9 +7,11 @@
"": { "": {
"name": "fvtt-machine-gods-noxian-expanse", "name": "fvtt-machine-gods-noxian-expanse",
"version": "0.1.0", "version": "0.1.0",
"hasInstallScript": true,
"license": "UNLICENSED", "license": "UNLICENSED",
"devDependencies": { "devDependencies": {
"@foundryvtt/foundryvtt-cli": "^3.0.3", "@foundryvtt/foundryvtt-cli": "^3.0.3",
"classic-level": "^3.0.0",
"less": "^4.6.4", "less": "^4.6.4",
"patch-package": "^8.0.1" "patch-package": "^8.0.1"
} }
@@ -36,6 +38,53 @@
"node": ">17.0.0" "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": { "node_modules/@seald-io/binary-search-tree": {
"version": "1.0.3", "version": "1.0.3",
"resolved": "https://registry.npmjs.org/@seald-io/binary-search-tree/-/binary-search-tree-1.0.3.tgz", "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" "license": "BSD-2-Clause"
}, },
"node_modules/abstract-level": { "node_modules/abstract-level": {
"version": "1.0.4", "version": "3.1.1",
"resolved": "https://registry.npmjs.org/abstract-level/-/abstract-level-1.0.4.tgz", "resolved": "https://registry.npmjs.org/abstract-level/-/abstract-level-3.1.1.tgz",
"integrity": "sha512-eUP/6pbXBkMbXFdx4IH2fVgvB7M0JvR7/lIL33zcs0IBcwjdzSSl31TOJsaCzmKSSDF9h8QYSOJux4Nd4YJqFg==", "integrity": "sha512-CW2gKbJFTuX1feMvOrvsVMmijAOgI9kg2Ie9Dq3gOcMt/dVVoVmqNlLcEUCT13NxHFMEajcUcVBIplbyDroDiw==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"buffer": "^6.0.3", "buffer": "^6.0.3",
"catering": "^2.1.0",
"is-buffer": "^2.0.5", "is-buffer": "^2.0.5",
"level-supports": "^4.0.0", "level-supports": "^6.2.0",
"level-transcoder": "^1.0.1", "level-transcoder": "^1.0.1",
"module-error": "^1.0.1", "maybe-combine-errors": "^1.0.0",
"queue-microtask": "^1.2.3" "module-error": "^1.0.1"
}, },
"engines": { "engines": {
"node": ">=12" "node": ">=18"
} }
}, },
"node_modules/ansi-regex": { "node_modules/ansi-regex": {
@@ -278,21 +326,20 @@
} }
}, },
"node_modules/classic-level": { "node_modules/classic-level": {
"version": "1.4.1", "version": "3.0.0",
"resolved": "https://registry.npmjs.org/classic-level/-/classic-level-1.4.1.tgz", "resolved": "https://registry.npmjs.org/classic-level/-/classic-level-3.0.0.tgz",
"integrity": "sha512-qGx/KJl3bvtOHrGau2WklEZuXhS3zme+jf+fsu6Ej7W7IP/C49v7KNlWIsT1jZu0YnfzSIYDGcEWpCa1wKGWXQ==", "integrity": "sha512-yGy8j8LjPbN0Bh3+ygmyYvrmskVita92pD/zCoalfcC9XxZj6iDtZTAnz+ot7GG8p9KLTG+MZ84tSA4AhkgVZQ==",
"dev": true, "dev": true,
"hasInstallScript": true, "hasInstallScript": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"abstract-level": "^1.0.2", "abstract-level": "^3.1.0",
"catering": "^2.1.0",
"module-error": "^1.0.1", "module-error": "^1.0.1",
"napi-macros": "^2.2.2", "napi-macros": "^2.2.2",
"node-gyp-build": "^4.3.0" "node-gyp-build": "^4.3.0"
}, },
"engines": { "engines": {
"node": ">=12" "node": ">=18"
} }
}, },
"node_modules/cliui": { "node_modules/cliui": {
@@ -1017,13 +1064,13 @@
} }
}, },
"node_modules/level-supports": { "node_modules/level-supports": {
"version": "4.0.1", "version": "6.2.0",
"resolved": "https://registry.npmjs.org/level-supports/-/level-supports-4.0.1.tgz", "resolved": "https://registry.npmjs.org/level-supports/-/level-supports-6.2.0.tgz",
"integrity": "sha512-PbXpve8rKeNcZ9C1mUicC9auIYFyGpkV9/i6g76tLgANwWhtG2v7I4xNBUlkn3lE2/dZF3Pi0ygYGtLc4RXXdA==", "integrity": "sha512-QNxVXP0IRnBmMsJIh+sb2kwNCYcKciQZJEt+L1hPCHrKNELllXhvrlClVHXBYZVT+a7aTSM6StgNXdAldoab3w==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"engines": { "engines": {
"node": ">=12" "node": ">=16"
} }
}, },
"node_modules/level-transcoder": { "node_modules/level-transcoder": {
@@ -1085,6 +1132,16 @@
"node": ">= 0.4" "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": { "node_modules/micromatch": {
"version": "4.0.8", "version": "4.0.8",
"resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz",
+1
View File
@@ -15,6 +15,7 @@
}, },
"devDependencies": { "devDependencies": {
"@foundryvtt/foundryvtt-cli": "^3.0.3", "@foundryvtt/foundryvtt-cli": "^3.0.3",
"classic-level": "^3.0.0",
"less": "^4.6.4", "less": "^4.6.4",
"patch-package": "^8.0.1" "patch-package": "^8.0.1"
} }
Binary file not shown.
Binary file not shown.
Binary file not shown.
+1 -1
View File
@@ -1 +1 @@
MANIFEST-000035 MANIFEST-000032
+14 -8
View File
@@ -1,8 +1,14 @@
2026/05/19-11:43:58.491683 7f5a477fe6c0 Recovering log #32 2026/06/08-22:30:14.302066 7f5208bff6c0 Recovering log #29
2026/05/19-11:43:58.503266 7f5a477fe6c0 Delete type=3 #30 2026/06/08-22:30:14.311260 7f5208bff6c0 Delete type=3 #27
2026/05/19-11:43:58.503328 7f5a477fe6c0 Delete type=0 #32 2026/06/08-22:30:14.311276 7f5208bff6c0 Delete type=0 #29
2026/05/19-13:29:47.340536 7f5a467fc6c0 Level-0 table #38: started 2026/06/08-22:30:22.508073 7f51ba7fc6c0 Level-0 table #35: started
2026/05/19-13:29:47.344381 7f5a467fc6c0 Level-0 table #38: 1354 bytes OK 2026/06/08-22:30:22.511267 7f51ba7fc6c0 Level-0 table #35: 1820 bytes OK
2026/05/19-13:29:47.350519 7f5a467fc6c0 Delete type=0 #36 2026/06/08-22:30:22.517613 7f51ba7fc6c0 Delete type=0 #33
2026/05/19-13:29:47.378833 7f5a467fc6c0 Manual compaction at level-0 from '!items!mgne-arm-chainshirt' @ 72057594037927935 : 1 .. '!items!null' @ 0 : 0; will stop at (end) 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/05/19-13:29:47.401042 7f5a467fc6c0 Manual compaction at level-1 from '!items!mgne-arm-chainshirt' @ 72057594037927935 : 1 .. '!items!null' @ 0 : 0; will stop at (end) 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 -16
View File
@@ -1,16 +1,14 @@
2026/05/19-11:02:18.769006 7f8fcb7fe6c0 Recovering log #27 2026/06/08-22:28:49.244498 7f51baffd6c0 Recovering log #24
2026/05/19-11:02:18.779483 7f8fcb7fe6c0 Delete type=3 #25 2026/06/08-22:28:49.253761 7f51baffd6c0 Delete type=3 #22
2026/05/19-11:02:18.779537 7f8fcb7fe6c0 Delete type=0 #27 2026/06/08-22:28:49.253785 7f51baffd6c0 Delete type=0 #24
2026/05/19-11:02:18.787924 7f8fcaffd6c0 Level-0 table #33: started 2026/06/08-22:29:08.699377 7f51ba7fc6c0 Level-0 table #30: started
2026/05/19-11:02:18.791070 7f8fcaffd6c0 Level-0 table #33: 1193 bytes OK 2026/06/08-22:29:08.702874 7f51ba7fc6c0 Level-0 table #30: 1820 bytes OK
2026/05/19-11:02:18.797355 7f8fcaffd6c0 Delete type=0 #31 2026/06/08-22:29:08.709319 7f51ba7fc6c0 Delete type=0 #28
2026/05/19-11:02:18.797604 7f8fcaffd6c0 Manual compaction at level-0 from '!items!mgne-arm-chainshirt' @ 72057594037927935 : 1 .. '!items!mgne-shd-medshield' @ 0 : 0; will stop at (end) 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/05/19-11:02:18.797649 7f8fcaffd6c0 Manual compaction at level-1 from '!items!mgne-arm-chainshirt' @ 72057594037927935 : 1 .. '!items!mgne-shd-medshield' @ 0 : 0; will stop at '!items!null' @ 57 : 0 2026/06/08-22:29:08.715551 7f51ba7fc6c0 Compacting 1@0 + 1@1 files
2026/05/19-11:02:18.797659 7f8fcaffd6c0 Compacting 1@1 + 2@2 files 2026/06/08-22:29:08.718787 7f51ba7fc6c0 Generated table #31@0: 9 keys, 1445 bytes
2026/05/19-11:02:18.800889 7f8fcaffd6c0 Generated table #34@1: 8 keys, 1176 bytes 2026/06/08-22:29:08.718802 7f51ba7fc6c0 Compacted 1@0 + 1@1 files => 1445 bytes
2026/05/19-11:02:18.800920 7f8fcaffd6c0 Compacted 1@1 + 2@2 files => 1176 bytes 2026/06/08-22:29:08.724761 7f51ba7fc6c0 compacted to: files[ 0 1 0 0 0 0 0 ]
2026/05/19-11:02:18.807939 7f8fcaffd6c0 compacted to: files[ 0 0 1 0 0 0 0 ] 2026/06/08-22:29:08.724834 7f51ba7fc6c0 Delete type=2 #26
2026/05/19-11:02:18.808063 7f8fcaffd6c0 Delete type=2 #5 2026/06/08-22:29:08.724899 7f51ba7fc6c0 Delete type=2 #30
2026/05/19-11:02:18.808159 7f8fcaffd6c0 Delete type=2 #29 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)
2026/05/19-11:02:18.808228 7f8fcaffd6c0 Delete type=2 #33
2026/05/19-11:02:18.808291 7f8fcaffd6c0 Manual compaction at level-1 from '!items!null' @ 57 : 0 .. '!items!mgne-shd-medshield' @ 0 : 0; will stop at (end)
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+1 -1
View File
@@ -1 +1 @@
MANIFEST-000035 MANIFEST-000030
+14 -8
View File
@@ -1,8 +1,14 @@
2026/05/19-11:43:58.466515 7f5a47fff6c0 Recovering log #32 2026/06/08-22:30:14.280655 7f51bb7fe6c0 Recovering log #27
2026/05/19-11:43:58.477301 7f5a47fff6c0 Delete type=3 #30 2026/06/08-22:30:14.289768 7f51bb7fe6c0 Delete type=3 #25
2026/05/19-11:43:58.477387 7f5a47fff6c0 Delete type=0 #32 2026/06/08-22:30:14.289787 7f51bb7fe6c0 Delete type=0 #27
2026/05/19-13:29:47.310841 7f5a467fc6c0 Level-0 table #38: started 2026/06/08-22:30:22.461106 7f51ba7fc6c0 Level-0 table #33: started
2026/05/19-13:29:47.314286 7f5a467fc6c0 Level-0 table #38: 4899 bytes OK 2026/06/08-22:30:22.464602 7f51ba7fc6c0 Level-0 table #33: 4899 bytes OK
2026/05/19-13:29:47.320795 7f5a467fc6c0 Delete type=0 #36 2026/06/08-22:30:22.471064 7f51ba7fc6c0 Delete type=0 #31
2026/05/19-13:29:47.340397 7f5a467fc6c0 Manual compaction at level-0 from '!actors!mgne-comp-beguiled-noble' @ 72057594037927935 : 1 .. '!actors!null' @ 0 : 0; will stop at (end) 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/05/19-13:29:47.340431 7f5a467fc6c0 Manual compaction at level-1 from '!actors!mgne-comp-beguiled-noble' @ 72057594037927935 : 1 .. '!actors!null' @ 0 : 0; will stop at (end) 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 -16
View File
@@ -1,16 +1,14 @@
2026/05/19-11:02:18.809449 7f8fcb7fe6c0 Recovering log #27 2026/06/08-22:28:49.222288 7f51bb7fe6c0 Recovering log #22
2026/05/19-11:02:18.819291 7f8fcb7fe6c0 Delete type=3 #25 2026/06/08-22:28:49.232786 7f51bb7fe6c0 Delete type=3 #20
2026/05/19-11:02:18.819384 7f8fcb7fe6c0 Delete type=0 #27 2026/06/08-22:28:49.232806 7f51bb7fe6c0 Delete type=0 #22
2026/05/19-11:02:18.822817 7f8fcaffd6c0 Level-0 table #33: started 2026/06/08-22:29:08.601469 7f51ba7fc6c0 Level-0 table #28: started
2026/05/19-11:02:18.826056 7f8fcaffd6c0 Level-0 table #33: 2612 bytes OK 2026/06/08-22:29:08.604604 7f51ba7fc6c0 Level-0 table #28: 4899 bytes OK
2026/05/19-11:02:18.832282 7f8fcaffd6c0 Delete type=0 #31 2026/06/08-22:29:08.610544 7f51ba7fc6c0 Delete type=0 #26
2026/05/19-11:02:18.832460 7f8fcaffd6c0 Manual compaction at level-0 from '!actors!mgne-comp-beguiled-noble' @ 72057594037927935 : 1 .. '!actors!mgne-comp-silicon-cantor' @ 0 : 0; will stop at (end) 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/05/19-11:02:18.832489 7f8fcaffd6c0 Manual compaction at level-1 from '!actors!mgne-comp-beguiled-noble' @ 72057594037927935 : 1 .. '!actors!mgne-comp-silicon-cantor' @ 0 : 0; will stop at '!actors!null' @ 29 : 0 2026/06/08-22:29:08.630913 7f51ba7fc6c0 Compacting 1@0 + 1@1 files
2026/05/19-11:02:18.832498 7f8fcaffd6c0 Compacting 1@1 + 2@2 files 2026/06/08-22:29:08.633954 7f51ba7fc6c0 Generated table #29@0: 5 keys, 3562 bytes
2026/05/19-11:02:18.836012 7f8fcaffd6c0 Generated table #34@1: 4 keys, 2597 bytes 2026/06/08-22:29:08.633965 7f51ba7fc6c0 Compacted 1@0 + 1@1 files => 3562 bytes
2026/05/19-11:02:18.836038 7f8fcaffd6c0 Compacted 1@1 + 2@2 files => 2597 bytes 2026/06/08-22:29:08.639624 7f51ba7fc6c0 compacted to: files[ 0 1 0 0 0 0 0 ]
2026/05/19-11:02:18.842468 7f8fcaffd6c0 compacted to: files[ 0 0 1 0 0 0 0 ] 2026/06/08-22:29:08.639660 7f51ba7fc6c0 Delete type=2 #24
2026/05/19-11:02:18.842559 7f8fcaffd6c0 Delete type=2 #5 2026/06/08-22:29:08.639710 7f51ba7fc6c0 Delete type=2 #28
2026/05/19-11:02:18.842644 7f8fcaffd6c0 Delete type=2 #29 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)
2026/05/19-11:02:18.842691 7f8fcaffd6c0 Delete type=2 #33
2026/05/19-11:02:18.842740 7f8fcaffd6c0 Manual compaction at level-1 from '!actors!null' @ 29 : 0 .. '!actors!mgne-comp-silicon-cantor' @ 0 : 0; will stop at (end)
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+1 -1
View File
@@ -1 +1 @@
MANIFEST-000035 MANIFEST-000030
+14 -8
View File
@@ -1,8 +1,14 @@
2026/05/19-11:43:58.453269 7f5a94bff6c0 Recovering log #32 2026/06/08-22:30:14.270038 7f5208bff6c0 Recovering log #27
2026/05/19-11:43:58.463527 7f5a94bff6c0 Delete type=3 #30 2026/06/08-22:30:14.279434 7f5208bff6c0 Delete type=3 #25
2026/05/19-11:43:58.463573 7f5a94bff6c0 Delete type=0 #32 2026/06/08-22:30:14.279458 7f5208bff6c0 Delete type=0 #27
2026/05/19-13:29:47.301133 7f5a467fc6c0 Level-0 table #38: started 2026/06/08-22:30:22.441981 7f51ba7fc6c0 Level-0 table #33: started
2026/05/19-13:29:47.304584 7f5a467fc6c0 Level-0 table #38: 10414 bytes OK 2026/06/08-22:30:22.445390 7f51ba7fc6c0 Level-0 table #33: 10411 bytes OK
2026/05/19-13:29:47.310712 7f5a467fc6c0 Delete type=0 #36 2026/06/08-22:30:22.452159 7f51ba7fc6c0 Delete type=0 #31
2026/05/19-13:29:47.340382 7f5a467fc6c0 Manual compaction at level-0 from '!items!mgne-feat-11' @ 72057594037927935 : 1 .. '!items!null' @ 0 : 0; will stop at (end) 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/05/19-13:29:47.340424 7f5a467fc6c0 Manual compaction at level-1 from '!items!mgne-feat-11' @ 72057594037927935 : 1 .. '!items!null' @ 0 : 0; will stop at (end) 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 -16
View File
@@ -1,16 +1,14 @@
2026/05/19-11:02:18.844260 7f8fcb7fe6c0 Recovering log #27 2026/06/08-22:28:49.211463 7f51bbfff6c0 Recovering log #22
2026/05/19-11:02:18.853625 7f8fcb7fe6c0 Delete type=3 #25 2026/06/08-22:28:49.220803 7f51bbfff6c0 Delete type=3 #20
2026/05/19-11:02:18.853672 7f8fcb7fe6c0 Delete type=0 #27 2026/06/08-22:28:49.220825 7f51bbfff6c0 Delete type=0 #22
2026/05/19-11:02:18.858431 7f8fcaffd6c0 Level-0 table #33: started 2026/06/08-22:29:08.581725 7f51ba7fc6c0 Level-0 table #28: started
2026/05/19-11:02:18.861570 7f8fcaffd6c0 Level-0 table #33: 8690 bytes OK 2026/06/08-22:29:08.585305 7f51ba7fc6c0 Level-0 table #28: 10414 bytes OK
2026/05/19-11:02:18.868803 7f8fcaffd6c0 Delete type=0 #31 2026/06/08-22:29:08.591259 7f51ba7fc6c0 Delete type=0 #26
2026/05/19-11:02:18.869044 7f8fcaffd6c0 Manual compaction at level-0 from '!items!mgne-feat-11' @ 72057594037927935 : 1 .. '!items!mgne-feat-66' @ 0 : 0; will stop at (end) 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/05/19-11:02:18.869099 7f8fcaffd6c0 Manual compaction at level-1 from '!items!mgne-feat-11' @ 72057594037927935 : 1 .. '!items!mgne-feat-66' @ 0 : 0; will stop at '!items!null' @ 253 : 0 2026/06/08-22:29:08.610609 7f51ba7fc6c0 Compacting 1@0 + 1@1 files
2026/05/19-11:02:18.869112 7f8fcaffd6c0 Compacting 1@1 + 2@2 files 2026/06/08-22:29:08.614617 7f51ba7fc6c0 Generated table #29@0: 37 keys, 8891 bytes
2026/05/19-11:02:18.872810 7f8fcaffd6c0 Generated table #34@1: 36 keys, 8674 bytes 2026/06/08-22:29:08.614629 7f51ba7fc6c0 Compacted 1@0 + 1@1 files => 8891 bytes
2026/05/19-11:02:18.872822 7f8fcaffd6c0 Compacted 1@1 + 2@2 files => 8674 bytes 2026/06/08-22:29:08.620444 7f51ba7fc6c0 compacted to: files[ 0 1 0 0 0 0 0 ]
2026/05/19-11:02:18.878554 7f8fcaffd6c0 compacted to: files[ 0 0 1 0 0 0 0 ] 2026/06/08-22:29:08.620779 7f51ba7fc6c0 Delete type=2 #24
2026/05/19-11:02:18.878610 7f8fcaffd6c0 Delete type=2 #5 2026/06/08-22:29:08.620832 7f51ba7fc6c0 Delete type=2 #28
2026/05/19-11:02:18.878700 7f8fcaffd6c0 Delete type=2 #29 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)
2026/05/19-11:02:18.878747 7f8fcaffd6c0 Delete type=2 #33
2026/05/19-11:02:18.878825 7f8fcaffd6c0 Manual compaction at level-1 from '!items!null' @ 253 : 0 .. '!items!mgne-feat-66' @ 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.
View File
Binary file not shown.
Binary file not shown.
+1 -1
View File
@@ -1 +1 @@
MANIFEST-000036 MANIFEST-000031
+14 -15
View File
@@ -1,15 +1,14 @@
2026/05/19-11:43:58.505418 7f5a46ffd6c0 Recovering log #33 2026/06/08-22:30:14.312612 7f51bb7fe6c0 Recovering log #28
2026/05/19-11:43:58.516284 7f5a46ffd6c0 Delete type=3 #31 2026/06/08-22:30:14.321802 7f51bb7fe6c0 Delete type=3 #26
2026/05/19-11:43:58.516350 7f5a46ffd6c0 Delete type=0 #33 2026/06/08-22:30:14.321819 7f51bb7fe6c0 Delete type=0 #28
2026/05/19-13:29:47.350654 7f5a467fc6c0 Level-0 table #39: started 2026/06/08-22:30:22.527571 7f51ba7fc6c0 Level-0 table #34: started
2026/05/19-13:29:47.354446 7f5a467fc6c0 Level-0 table #39: 31043 bytes OK 2026/06/08-22:30:22.531034 7f51ba7fc6c0 Level-0 table #34: 36447 bytes OK
2026/05/19-13:29:47.361835 7f5a467fc6c0 Delete type=0 #37 2026/06/08-22:30:22.536962 7f51ba7fc6c0 Delete type=0 #32
2026/05/19-13:29:47.378848 7f5a467fc6c0 Manual compaction at level-0 from '!tables!mgne-tbl-armor' @ 72057594037927935 : 1 .. '!tables.results!zjIS1gXpPC2gCY8t' @ 0 : 0; will stop at (end) 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/05/19-13:29:47.378915 7f5a467fc6c0 Manual compaction at level-1 from '!tables!mgne-tbl-armor' @ 72057594037927935 : 1 .. '!tables.results!zjIS1gXpPC2gCY8t' @ 0 : 0; will stop at '!tables.results!zjIS1gXpPC2gCY8t' @ 2661 : 1 2026/06/08-22:30:22.553204 7f51ba7fc6c0 Compacting 1@0 + 1@1 files
2026/05/19-13:29:47.378921 7f5a467fc6c0 Compacting 1@1 + 1@2 files 2026/06/08-22:30:22.557404 7f51ba7fc6c0 Generated table #35@0: 436 keys, 40321 bytes
2026/05/19-13:29:47.383027 7f5a467fc6c0 Generated table #40@1: 436 keys, 40533 bytes 2026/06/08-22:30:22.557428 7f51ba7fc6c0 Compacted 1@0 + 1@1 files => 40321 bytes
2026/05/19-13:29:47.383047 7f5a467fc6c0 Compacted 1@1 + 1@2 files => 40533 bytes 2026/06/08-22:30:22.563722 7f51ba7fc6c0 compacted to: files[ 0 1 0 0 0 0 0 ]
2026/05/19-13:29:47.389114 7f5a467fc6c0 compacted to: files[ 0 0 1 0 0 0 0 ] 2026/06/08-22:30:22.563803 7f51ba7fc6c0 Delete type=2 #30
2026/05/19-13:29:47.389270 7f5a467fc6c0 Delete type=2 #35 2026/06/08-22:30:22.563872 7f51ba7fc6c0 Delete type=2 #34
2026/05/19-13:29:47.389435 7f5a467fc6c0 Delete type=2 #39 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)
2026/05/19-13:29:47.407497 7f5a467fc6c0 Manual compaction at level-1 from '!tables.results!zjIS1gXpPC2gCY8t' @ 2661 : 1 .. '!tables.results!zjIS1gXpPC2gCY8t' @ 0 : 0; will stop at (end)
+14 -15
View File
@@ -1,15 +1,14 @@
2026/05/19-11:02:18.880496 7f8fcb7fe6c0 Recovering log #28 2026/06/08-22:28:49.254855 7f5208bff6c0 Recovering log #23
2026/05/19-11:02:18.890669 7f8fcb7fe6c0 Delete type=3 #26 2026/06/08-22:28:49.264171 7f5208bff6c0 Delete type=3 #21
2026/05/19-11:02:18.890721 7f8fcb7fe6c0 Delete type=0 #28 2026/06/08-22:28:49.264195 7f5208bff6c0 Delete type=0 #23
2026/05/19-11:02:18.903169 7f8fcaffd6c0 Level-0 table #34: started 2026/06/08-22:29:08.671838 7f51ba7fc6c0 Level-0 table #29: started
2026/05/19-11:02:18.906993 7f8fcaffd6c0 Level-0 table #34: 20747 bytes OK 2026/06/08-22:29:08.675902 7f51ba7fc6c0 Level-0 table #29: 36492 bytes OK
2026/05/19-11:02:18.913179 7f8fcaffd6c0 Delete type=0 #32 2026/06/08-22:29:08.681972 7f51ba7fc6c0 Delete type=0 #27
2026/05/19-11:02:18.913340 7f8fcaffd6c0 Manual compaction at level-0 from '!tables!mgne-tbl-armor' @ 72057594037927935 : 1 .. '!tables.results!mgne-tbl-weapons.mgne-tbl-wpn-12' @ 0 : 0; will stop at (end) 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/05/19-11:02:18.913365 7f8fcaffd6c0 Manual compaction at level-1 from '!tables!mgne-tbl-armor' @ 72057594037927935 : 1 .. '!tables.results!mgne-tbl-weapons.mgne-tbl-wpn-12' @ 0 : 0; will stop at '!tables.results!zvHZSivLEOLcr48A' @ 2626 : 0 2026/06/08-22:29:08.682179 7f51ba7fc6c0 Compacting 1@0 + 1@1 files
2026/05/19-11:02:18.913369 7f8fcaffd6c0 Compacting 1@1 + 1@2 files 2026/06/08-22:29:08.686025 7f51ba7fc6c0 Generated table #30@0: 436 keys, 40541 bytes
2026/05/19-11:02:18.916838 7f8fcaffd6c0 Generated table #35@1: 225 keys, 15451 bytes 2026/06/08-22:29:08.686040 7f51ba7fc6c0 Compacted 1@0 + 1@1 files => 40541 bytes
2026/05/19-11:02:18.916863 7f8fcaffd6c0 Compacted 1@1 + 1@2 files => 15451 bytes 2026/06/08-22:29:08.692738 7f51ba7fc6c0 compacted to: files[ 0 1 0 0 0 0 0 ]
2026/05/19-11:02:18.924177 7f8fcaffd6c0 compacted to: files[ 0 0 1 0 0 0 0 ] 2026/06/08-22:29:08.692811 7f51ba7fc6c0 Delete type=2 #25
2026/05/19-11:02:18.924301 7f8fcaffd6c0 Delete type=2 #30 2026/06/08-22:29:08.692886 7f51ba7fc6c0 Delete type=2 #29
2026/05/19-11:02:18.924433 7f8fcaffd6c0 Delete type=2 #34 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)
2026/05/19-11:02:18.924527 7f8fcaffd6c0 Manual compaction at level-1 from '!tables.results!zvHZSivLEOLcr48A' @ 2626 : 0 .. '!tables.results!mgne-tbl-weapons.mgne-tbl-wpn-12' @ 0 : 0; will stop at (end)
Binary file not shown.
Binary file not shown.
View File
View File
Binary file not shown.
Binary file not shown.
+1 -1
View File
@@ -1 +1 @@
MANIFEST-000035 MANIFEST-000030
+14 -8
View File
@@ -1,8 +1,14 @@
2026/05/19-11:43:58.439933 7f5a47fff6c0 Recovering log #32 2026/06/08-22:30:14.258238 7f51baffd6c0 Recovering log #27
2026/05/19-11:43:58.449841 7f5a47fff6c0 Delete type=3 #30 2026/06/08-22:30:14.268354 7f51baffd6c0 Delete type=3 #25
2026/05/19-11:43:58.449917 7f5a47fff6c0 Delete type=0 #32 2026/06/08-22:30:14.268384 7f51baffd6c0 Delete type=0 #27
2026/05/19-13:29:47.320927 7f5a467fc6c0 Level-0 table #38: started 2026/06/08-22:30:22.452241 7f51ba7fc6c0 Level-0 table #33: started
2026/05/19-13:29:47.324319 7f5a467fc6c0 Level-0 table #38: 7117 bytes OK 2026/06/08-22:30:22.455121 7f51ba7fc6c0 Level-0 table #33: 7117 bytes OK
2026/05/19-13:29:47.330350 7f5a467fc6c0 Delete type=0 #36 2026/06/08-22:30:22.461042 7f51ba7fc6c0 Delete type=0 #31
2026/05/19-13:29:47.340407 7f5a467fc6c0 Manual compaction at level-0 from '!items!mgne-res-accelerate' @ 72057594037927935 : 1 .. '!items!null' @ 0 : 0; will stop at (end) 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/05/19-13:29:47.340437 7f5a467fc6c0 Manual compaction at level-1 from '!items!mgne-res-accelerate' @ 72057594037927935 : 1 .. '!items!null' @ 0 : 0; will stop at (end) 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 -16
View File
@@ -1,16 +1,14 @@
2026/05/19-11:02:18.925517 7f9018bfe6c0 Recovering log #27 2026/06/08-22:28:49.200176 7f5208bff6c0 Recovering log #22
2026/05/19-11:02:18.934880 7f9018bfe6c0 Delete type=3 #25 2026/06/08-22:28:49.209944 7f5208bff6c0 Delete type=3 #20
2026/05/19-11:02:18.934945 7f9018bfe6c0 Delete type=0 #27 2026/06/08-22:28:49.209966 7f5208bff6c0 Delete type=0 #22
2026/05/19-11:02:18.938495 7f8fcaffd6c0 Level-0 table #33: started 2026/06/08-22:29:08.591310 7f51ba7fc6c0 Level-0 table #28: started
2026/05/19-11:02:18.941974 7f8fcaffd6c0 Level-0 table #33: 6054 bytes OK 2026/06/08-22:29:08.594536 7f51ba7fc6c0 Level-0 table #28: 7117 bytes OK
2026/05/19-11:02:18.949380 7f8fcaffd6c0 Delete type=0 #31 2026/06/08-22:29:08.601407 7f51ba7fc6c0 Delete type=0 #26
2026/05/19-11:02:18.949596 7f8fcaffd6c0 Manual compaction at level-0 from '!items!mgne-res-accelerate' @ 72057594037927935 : 1 .. '!items!mgne-res-summonmist' @ 0 : 0; will stop at (end) 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/05/19-11:02:18.949632 7f8fcaffd6c0 Manual compaction at level-1 from '!items!mgne-res-accelerate' @ 72057594037927935 : 1 .. '!items!mgne-res-summonmist' @ 0 : 0; will stop at '!items!null' @ 141 : 0 2026/06/08-22:29:08.620870 7f51ba7fc6c0 Compacting 1@0 + 1@1 files
2026/05/19-11:02:18.949641 7f8fcaffd6c0 Compacting 1@1 + 2@2 files 2026/06/08-22:29:08.624059 7f51ba7fc6c0 Generated table #29@0: 21 keys, 6260 bytes
2026/05/19-11:02:18.953049 7f8fcaffd6c0 Generated table #34@1: 20 keys, 6039 bytes 2026/06/08-22:29:08.624070 7f51ba7fc6c0 Compacted 1@0 + 1@1 files => 6260 bytes
2026/05/19-11:02:18.953070 7f8fcaffd6c0 Compacted 1@1 + 2@2 files => 6039 bytes 2026/06/08-22:29:08.630785 7f51ba7fc6c0 compacted to: files[ 0 1 0 0 0 0 0 ]
2026/05/19-11:02:18.958965 7f8fcaffd6c0 compacted to: files[ 0 0 1 0 0 0 0 ] 2026/06/08-22:29:08.630825 7f51ba7fc6c0 Delete type=2 #24
2026/05/19-11:02:18.959068 7f8fcaffd6c0 Delete type=2 #5 2026/06/08-22:29:08.630879 7f51ba7fc6c0 Delete type=2 #28
2026/05/19-11:02:18.959179 7f8fcaffd6c0 Delete type=2 #29 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)
2026/05/19-11:02:18.959228 7f8fcaffd6c0 Delete type=2 #33
2026/05/19-11:02:18.959314 7f8fcaffd6c0 Manual compaction at level-1 from '!items!null' @ 141 : 0 .. '!items!mgne-res-summonmist' @ 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)
Binary file not shown.
Binary file not shown.
View File
Binary file not shown.
Binary file not shown.
+1 -1
View File
@@ -1 +1 @@
MANIFEST-000035 MANIFEST-000032
+14 -8
View File
@@ -1,8 +1,14 @@
2026/05/19-11:43:58.479956 7f5a47fff6c0 Recovering log #32 2026/06/08-22:30:14.290763 7f51bb7fe6c0 Recovering log #29
2026/05/19-11:43:58.489548 7f5a47fff6c0 Delete type=3 #30 2026/06/08-22:30:14.300902 7f51bb7fe6c0 Delete type=3 #27
2026/05/19-11:43:58.489595 7f5a47fff6c0 Delete type=0 #32 2026/06/08-22:30:14.300923 7f51bb7fe6c0 Delete type=0 #29
2026/05/19-13:29:47.330472 7f5a467fc6c0 Level-0 table #38: started 2026/06/08-22:30:22.499353 7f51ba7fc6c0 Level-0 table #35: started
2026/05/19-13:29:47.333528 7f5a467fc6c0 Level-0 table #38: 1965 bytes OK 2026/06/08-22:30:22.502224 7f51ba7fc6c0 Level-0 table #35: 2478 bytes OK
2026/05/19-13:29:47.340237 7f5a467fc6c0 Delete type=0 #36 2026/06/08-22:30:22.507920 7f51ba7fc6c0 Delete type=0 #33
2026/05/19-13:29:47.340417 7f5a467fc6c0 Manual compaction at level-0 from '!items!mgne-wpn-club' @ 72057594037927935 : 1 .. '!items!null' @ 0 : 0; will stop at (end) 2026/06/08-22:30:22.517660 7f51ba7fc6c0 Manual compaction at level-0 from '!items!mgne-wpn-club' @ 72057594037927935 : 1 .. '!items!null' @ 0 : 0; will stop at '!items!null' @ 61 : 1
2026/05/19-13:29:47.340444 7f5a467fc6c0 Manual compaction at level-1 from '!items!mgne-wpn-club' @ 72057594037927935 : 1 .. '!items!null' @ 0 : 0; will stop at (end) 2026/06/08-22:30:22.517662 7f51ba7fc6c0 Compacting 1@0 + 1@1 files
2026/06/08-22:30:22.520579 7f51ba7fc6c0 Generated table #36@0: 13 keys, 2314 bytes
2026/06/08-22:30:22.520585 7f51ba7fc6c0 Compacted 1@0 + 1@1 files => 2314 bytes
2026/06/08-22:30:22.527392 7f51ba7fc6c0 compacted to: files[ 0 1 0 0 0 0 0 ]
2026/06/08-22:30:22.527479 7f51ba7fc6c0 Delete type=2 #31
2026/06/08-22:30:22.527541 7f51ba7fc6c0 Delete type=2 #35
2026/06/08-22:30:22.553189 7f51ba7fc6c0 Manual compaction at level-0 from '!items!null' @ 61 : 1 .. '!items!null' @ 0 : 0; will stop at (end)
+14 -16
View File
@@ -1,16 +1,14 @@
2026/05/19-11:02:18.960160 7f9018bfe6c0 Recovering log #27 2026/06/08-22:28:49.233935 7f51bb7fe6c0 Recovering log #24
2026/05/19-11:02:18.971164 7f9018bfe6c0 Delete type=3 #25 2026/06/08-22:28:49.243575 7f51bb7fe6c0 Delete type=3 #22
2026/05/19-11:02:18.971219 7f9018bfe6c0 Delete type=0 #27 2026/06/08-22:28:49.243596 7f51bb7fe6c0 Delete type=0 #24
2026/05/19-11:02:18.972967 7f8fcaffd6c0 Level-0 table #33: started 2026/06/08-22:29:08.639738 7f51ba7fc6c0 Level-0 table #30: started
2026/05/19-11:02:18.976102 7f8fcaffd6c0 Level-0 table #33: 1312 bytes OK 2026/06/08-22:29:08.643104 7f51ba7fc6c0 Level-0 table #30: 2480 bytes OK
2026/05/19-11:02:18.983166 7f8fcaffd6c0 Delete type=0 #31 2026/06/08-22:29:08.649284 7f51ba7fc6c0 Delete type=0 #28
2026/05/19-11:02:18.983370 7f8fcaffd6c0 Manual compaction at level-0 from '!items!mgne-wpn-club' @ 72057594037927935 : 1 .. '!items!mgne-wpn-whip' @ 0 : 0; will stop at (end) 2026/06/08-22:29:08.649619 7f51ba7fc6c0 Manual compaction at level-0 from '!items!mgne-wpn-club' @ 72057594037927935 : 1 .. '!items!null' @ 0 : 0; will stop at '!items!null' @ 49 : 1
2026/05/19-11:02:18.983394 7f8fcaffd6c0 Manual compaction at level-1 from '!items!mgne-wpn-club' @ 72057594037927935 : 1 .. '!items!mgne-wpn-whip' @ 0 : 0; will stop at '!items!null' @ 85 : 0 2026/06/08-22:29:08.649630 7f51ba7fc6c0 Compacting 1@0 + 1@1 files
2026/05/19-11:02:18.983398 7f8fcaffd6c0 Compacting 1@1 + 2@2 files 2026/06/08-22:29:08.652741 7f51ba7fc6c0 Generated table #31@0: 13 keys, 2314 bytes
2026/05/19-11:02:18.987181 7f8fcaffd6c0 Generated table #34@1: 12 keys, 1295 bytes 2026/06/08-22:29:08.652748 7f51ba7fc6c0 Compacted 1@0 + 1@1 files => 2314 bytes
2026/05/19-11:02:18.987209 7f8fcaffd6c0 Compacted 1@1 + 2@2 files => 1295 bytes 2026/06/08-22:29:08.659340 7f51ba7fc6c0 compacted to: files[ 0 1 0 0 0 0 0 ]
2026/05/19-11:02:18.993337 7f8fcaffd6c0 compacted to: files[ 0 0 1 0 0 0 0 ] 2026/06/08-22:29:08.659411 7f51ba7fc6c0 Delete type=2 #26
2026/05/19-11:02:18.993426 7f8fcaffd6c0 Delete type=2 #5 2026/06/08-22:29:08.659486 7f51ba7fc6c0 Delete type=2 #30
2026/05/19-11:02:18.993528 7f8fcaffd6c0 Delete type=2 #29 2026/06/08-22:29:08.682082 7f51ba7fc6c0 Manual compaction at level-0 from '!items!null' @ 49 : 1 .. '!items!null' @ 0 : 0; will stop at (end)
2026/05/19-11:02:18.993593 7f8fcaffd6c0 Delete type=2 #33
2026/05/19-11:02:18.993658 7f8fcaffd6c0 Manual compaction at level-1 from '!items!null' @ 85 : 0 .. '!items!mgne-wpn-whip' @ 0 : 0; will stop at (end)

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