diff --git a/modules/addon-register.js b/modules/addon-register.js
index aebd566..b7a13a9 100644
--- a/modules/addon-register.js
+++ b/modules/addon-register.js
@@ -16,30 +16,27 @@ const _patch_eis = () => {
game.wfrp4e.config.symptomTreatment["swelling"] = "La plupart des traitements consistent à plonger la partie affectée, ou parfois tout le corps, dans un bain d'eau glacée pour réduire la chaleur qui accompagne les gonflements. Un Test de Guérison Difficile (-20) étendu nécessitant +3 DR réduit le renflement de 2d10 heures. Chaque test dure une heure. Le patient se retrouve avec l'Etat Exténué +1 pour chaque test effectué au cours du processus.
A la place, certains médecins saignent le patient avec une lame ou des sangsues. Un Test de Guérison étendu réussi nécessitant +4 SL et des Outils (médecin) réduit le renflement de ( 1d10 + Bonus d'Endurance du patient) heures. Chaque test a une difficulté de base impossible (-50) et dure une demi-heure.";
game.wfrp4e.config.loreEffects["tzeentch"] = {
- label: "Domaine de Tzeentch",
- icon: "modules/wfrp4e-core/icons/spells/tzeentch.png",
- transfer: true,
- flags: {
- wfrp4e: {
- "effectApplication": "apply",
- "effectTrigger": "oneTime",
- "lore": true,
- "script": `
- if (this.actor.isOwner)
- args.actor.setupSkill("Résistance", {context : {failure: "1 Point de Corruption reçu", success : "1 Point de Chance gagné"}}).then(setupData => {
- args.actor.basicTest(setupData).then(test =>
- {
- if (test.result.result == "success" && args.actor.type == "character")
- {
- args.actor.update({"system.status.fortune.value" : args.actor.system.status.fortune.value + 1})
- }
- else if (test.result.result == "failure" && args.actor.type == "character")
- {
- args.actor.update({"system.status.corruption.value" : args.actor.system.status.corruption.value + 1})
- }
- })
- })`
- }
+ name: "Domaine de Tzeentch",
+ img: "modules/wfrp4e-core/icons/spells/tzeentch.png",
+ system: {
+ transferData: {
+ type: "target"
+ },
+ scriptData: [{
+ trigger: "immediate",
+ label: "Test d'Endurance",
+ script: `
+ this.actor.setupSkill(game.i18n.localize("NAME.Endurance"), {appendTitle : " - " + this.effect.name, context : {failure: "1 Point de Corruption reçu", success : "1 Point de Chance gagné"}}).then(setupData => {
+ this.actor.basicTest(setupData).then(test => {
+ if (test.succeeded && this.actor.type == "character") {
+ this.actor.update({"system.status.fortune.value" : this.actor.system.status.fortune.value + 1})
+ } else if (test.failed && this.actor.type == "character") {
+ this.actor.update({"system.status.corruption.value" : this.actor.system.status.corruption.value + 1})
+ }
+ })
+ })
+ return false;`
+ }]
}
}
}
@@ -404,6 +401,40 @@ Hooks.on('ready', () => {
// Patch function for effects
game.wfrp4e.utility.findKey = warhammer.utility.findKey
+ // Patch SpellModel.computeSpellDamage to handle English characteristic bonus names.
+ // Babele instantiates actors TWICE: first with untranslated data (English formulas like
+ // "Willpower Bonus+4"), then with translated data. The first pass fails because
+ // characteristicsBonus values are already French ("Bonus de Force Mentale").
+ // This patch pre-replaces English bonus names with numeric values before the original
+ // formula evaluation runs, preventing SyntaxErrors and notification spam.
+ const __EN_BONUS_TO_CHAR = {
+ "weapon skill bonus": "ws", "ballistic skill bonus": "bs",
+ "strength bonus": "s", "toughness bonus": "t",
+ "initiative bonus": "i", "agility bonus": "ag",
+ "dexterity bonus": "dex", "intelligence bonus": "int",
+ "willpower bonus": "wp", "fellowship bonus": "fel"
+ };
+ const SpellModel = CONFIG.Item.dataModels?.["spell"];
+ if (SpellModel?.prototype?.computeSpellDamage) {
+ const _origComputeSpellDamage = SpellModel.prototype.computeSpellDamage;
+ SpellModel.prototype.computeSpellDamage = function(formula, options) {
+ if (typeof formula === "string") {
+ const actor = options?.actor || this.parent?.actor;
+ if (actor?.system?.characteristics) {
+ let f = formula.toLowerCase();
+ for (const [enName, ch] of Object.entries(__EN_BONUS_TO_CHAR)) {
+ if (f.includes(enName)) {
+ const bonus = actor.system.characteristics[ch]?.bonus ?? 0;
+ f = f.replace(enName, bonus);
+ }
+ }
+ formula = f;
+ }
+ }
+ return _origComputeSpellDamage.call(this, formula, options);
+ };
+ }
+
// Patch postSymptom to handle English symptom names in @Symptom[...] links.
// After i18nInit, config.symptoms values are French strings (e.g. "Fièvre"), so
// findKey("Fever", config.symptoms) fails. We normalize via game.i18n.localize first.
diff --git a/modules/babele-register.js b/modules/babele-register.js
index bbf9be8..bc6b326 100644
--- a/modules/babele-register.js
+++ b/modules/babele-register.js
@@ -30,6 +30,20 @@ const __SELECT_BONUS_PREFIX_D = {
"agilité": 1
}
+// Map English characteristic names (as they appear in spell formulas) to WFRP4e abbreviations
+const __CHAR_EN_TO_ABBR = {
+ "weapon skill": "ws",
+ "ballistic skill": "bs",
+ "strength": "s",
+ "toughness": "t",
+ "initiative": "i",
+ "agility": "ag",
+ "dexterity": "dex",
+ "intelligence": "int",
+ "willpower": "wp",
+ "fellowship": "fel"
+}
+
/************************************************************************************/
export class WFRP4FrTranslation {
@@ -57,16 +71,23 @@ export class WFRP4FrTranslation {
if (value == "You") return "Vous"; // Hop !
if (value == "Instant") return "Instantané"; // Hop !
let translw = value;
- let re = /(.*)\s+[Bb]onus\s*(\w*)/i;
+ let re = /(.*)\s+[Bb]onus\s*(.*)/i; // (.*) at end captures modifiers like "+4"
let res = re.exec(value);
let unit = "";
- if (res) { // Test " Bonus " pattern
+ if (res) { // Test " Bonus " pattern
if (res[1]) { // We have char name, then convert it
- translw = game.i18n.localize(res[1].trim());
- let bonusPrefix = (translw.toLowerCase() in __SELECT_BONUS_PREFIX_D) ? "Bonus d'" : "Bonus de ";
- translw = bonusPrefix + translw
+ const charEN = res[1].trim().toLowerCase();
+ const abbr = __CHAR_EN_TO_ABBR[charEN];
+ if (abbr && game.wfrp4e?.config?.characteristicsBonus?.[abbr]) {
+ // Use the localized French bonus name from config (already resolved by localizeConfig at i18nInit)
+ translw = game.wfrp4e.config.characteristicsBonus[abbr];
+ } else {
+ translw = game.i18n.localize(res[1].trim());
+ let bonusPrefix = (translw.toLowerCase() in __SELECT_BONUS_PREFIX_D) ? "Bonus d'" : "Bonus de ";
+ translw = bonusPrefix + translw;
+ }
}
- unit = res[2];
+ unit = res[2]; // may be "+4", "-2", "2", "yards", etc.
} else {
re = /(\d+) (\w+)/i;
res = re.exec(value);
@@ -90,6 +111,8 @@ export class WFRP4FrTranslation {
if (unit == "Bonus") { // Another weird management
console.log("Translating bonus", unit);
translw = "Bonus de " + translw;
+ } else if (unit && /^[+\-*\/]/.test(unit)) {
+ translw += unit; // No space before operators like "+4"
} else {
translw += " " + unit;
}
@@ -278,6 +301,8 @@ Hooks.once('init', () => {
"process_effects": (effectsData, translations, data, tc, tc_translations) => {
//console.log("Effects :", effectsData, translations, data, tc, tc_translations)
for (let e of effectsData) {
+ // Foundry v13 requires name; migrate legacy data where only label was stored
+ if (e.name == null) e.name = e.label || "";
let origName = e.name
// Symptom effects have their own name (Fever, Malaise, etc.) — don't overwrite with the parent item name
if (e.flags?.wfrp4e?.symptom) {
@@ -293,7 +318,7 @@ Hooks.once('init', () => {
}
e.name = game.i18n.localize(symName) + gravity;
} else {
- e.name = tc_translations.name || game.i18n.localize(e.name)
+ e.name = tc_translations.name || game.i18n.localize(e.name) || e.label || ""
}
if ( e.flags?.wfrp4e?.scriptData) {
for (let script of e.flags.wfrp4e.scriptData) {
@@ -411,10 +436,18 @@ Hooks.once('init', () => {
return beast_traits
}
//console.log("TRANS:", beast_traits)
+ // Normalize: Foundry v13 requires ActiveEffect.name; migrate legacy v12 data
+ for (let trait_en of beast_traits) {
+ if (trait_en.effects) {
+ for (let eff of trait_en.effects) {
+ if (eff.name == null) eff.name = eff.label || "";
+ }
+ }
+ }
for (let trait_en of beast_traits) {
let special = "";
let nbt = "";
- let name_en = trait_en.name.trim(); // strip \r in some traits name
+ let name_en = trait_en.name.replace(/\r/g, '').trim(); // strip \r (including internal) in some traits name
if (!trait_en.name || trait_en.name.length == 0) {
console.log("Wrong item name found!!!!")
continue
@@ -430,8 +463,11 @@ Hooks.once('init', () => {
} else if (name_en.includes("(") && name_en.includes(")")) { // Then process specific traits name with (xxxx) inside
let re = /(.*) \((.*)\)/i;
let res = re.exec(name_en);
- name_en = res[1]; // Get the root traits name
- special = " (" + game.i18n.localize(res[2].trim()) + ")"; // And the special keyword
+ if (!res) { console.warn("WFRP4E-FR | bestiary_traits: regex failed for trait:", name_en); }
+ else {
+ name_en = res[1]; // Get the root traits name
+ special = " (" + game.i18n.localize(res[2].trim()) + ")"; // And the special keyword
+ }
}
let validCompendiums = game.wfrp4e.tags.getPacksWithTag("trait")
for (let compData of validCompendiums) {
@@ -453,8 +489,11 @@ Hooks.once('init', () => {
if (name_en.includes("(") && name_en.includes(")")) { // Then process specific skills name with (xxxx) inside
let re = /(.*) +\((.*)\)/i;
let res = re.exec(name_en);
- name_en = res[1].trim(); // Get the root skill name
- special = " (" + game.i18n.localize(res[2].trim()) + ")"; // And the special keyword
+ if (!res) { console.warn("WFRP4E-FR | bestiary_traits: regex failed for skill:", name_en); }
+ else {
+ name_en = res[1].trim(); // Get the root skill name
+ special = " (" + game.i18n.localize(res[2].trim()) + ")"; // And the special keyword
+ }
}
let validCompendiums = game.wfrp4e.tags.getPacksWithTag("skill")
for (let compData of validCompendiums) {
@@ -499,8 +538,11 @@ Hooks.once('init', () => {
if (name_en.includes("(") && name_en.includes(")")) { // Then process specific skills name with (xxxx) inside
let re = /(.*) +\((.*)\)/i;
let res = re.exec(name_en);
- name_en = res[1].trim(); // Get the root talent name, no parenthesis this time...
- special = " (" + game.i18n.localize(res[2].trim()) + ")"; // And the special keyword
+ if (!res) { console.warn("WFRP4E-FR | bestiary_traits: regex failed for talent:", name_en); }
+ else {
+ name_en = res[1].trim(); // Get the root talent name, no parenthesis this time...
+ special = " (" + game.i18n.localize(res[2].trim()) + ")"; // And the special keyword
+ }
}
let validCompendiums = game.wfrp4e.tags.getPacksWithTag("talent")
for (let compData of validCompendiums) {
diff --git a/modules/config-patch.js b/modules/config-patch.js
index ff51f46..2a50fea 100644
--- a/modules/config-patch.js
+++ b/modules/config-patch.js
@@ -225,16 +225,15 @@ export class WH4FRPatchConfig {
}
if (game.wfrp4e.config.loreEffects) {
- game.wfrp4e.config.loreEffects["beasts"].label = "Domaine des Bêtes"
- game.wfrp4e.config.loreEffects["death"].label = "Domaine de la Mort"
- game.wfrp4e.config.loreEffects["fire"].label = "Domaine du Feu"
- game.wfrp4e.config.loreEffects["metal"].label = "Domaine du Métal"
- game.wfrp4e.config.loreEffects["heavens"].label = "Domaine des Cieux"
- game.wfrp4e.config.loreEffects["life"].label = "Domaine de la Vie"
- game.wfrp4e.config.loreEffects["light"].label = "Domaine de la Lumière"
- game.wfrp4e.config.loreEffects["shadow"].label = "Domaine des Ombres"
- game.wfrp4e.config.loreEffects["hedgecraft"].label = "Domaine de la Magie de Village"
- game.wfrp4e.config.loreEffects["hedgecraft"].label = "Domaine de la Sorcellerie"
+ game.wfrp4e.config.loreEffects["beasts"].name = "Domaine des Bêtes"
+ game.wfrp4e.config.loreEffects["death"].name = "Domaine de la Mort"
+ game.wfrp4e.config.loreEffects["fire"].name = "Domaine du Feu"
+ game.wfrp4e.config.loreEffects["metal"].name = "Domaine du Métal"
+ game.wfrp4e.config.loreEffects["heavens"].name = "Domaine des Cieux"
+ game.wfrp4e.config.loreEffects["life"].name = "Domaine de la Vie"
+ game.wfrp4e.config.loreEffects["light"].name = "Domaine de la Lumière"
+ game.wfrp4e.config.loreEffects["shadow"].name = "Domaine des Ombres"
+ game.wfrp4e.config.loreEffects["hedgecraft"].name = "Domaine de la Sorcellerie"
}
if (game.wfrp4e.config.species) {
diff --git a/modules/inn/InnRoller.js b/modules/inn/InnRoller.js
index fe6342c..96b3f37 100644
--- a/modules/inn/InnRoller.js
+++ b/modules/inn/InnRoller.js
@@ -155,7 +155,7 @@ export default class InnRoller {
}
// Extraire les informations du résultat
- const resultText = rollResult.results[0]?.text || "Résultat inconnu";
+ const resultText = rollResult.results[0]?.name || rollResult.results[0]?.description || "Résultat inconnu";
const rollFormula = rollResult.roll?.formula || "1d100";
const rollTotal = rollResult.roll?.total || 0;
@@ -349,7 +349,7 @@ export default class InnRoller {
if (rollTable) {
try {
const roll = await rollTable.draw({ displayChat: false });
- const resultText = roll.results[0]?.text || "Résultat inconnu";
+ const resultText = roll.results[0]?.name || roll.results[0]?.description || "Résultat inconnu";
results.push({
category: this.getCategoryName(tableName),
name: resultText,
diff --git a/packs/aides-de-jeu-fr/001329.log b/packs/aides-de-jeu-fr/001333.log
similarity index 100%
rename from packs/aides-de-jeu-fr/001329.log
rename to packs/aides-de-jeu-fr/001333.log
diff --git a/packs/antidotes-and-remedes/001331.log b/packs/aides-de-jeu-fr/001341.log
similarity index 100%
rename from packs/antidotes-and-remedes/001331.log
rename to packs/aides-de-jeu-fr/001341.log
diff --git a/packs/aides-de-jeu-fr/CURRENT b/packs/aides-de-jeu-fr/CURRENT
index e75a971..59ecd4f 100644
--- a/packs/aides-de-jeu-fr/CURRENT
+++ b/packs/aides-de-jeu-fr/CURRENT
@@ -1 +1 @@
-MANIFEST-001327
+MANIFEST-001339
diff --git a/packs/aides-de-jeu-fr/LOG b/packs/aides-de-jeu-fr/LOG
index 4214fac..289983a 100644
--- a/packs/aides-de-jeu-fr/LOG
+++ b/packs/aides-de-jeu-fr/LOG
@@ -1,7 +1,7 @@
-2026/03/22-16:42:23.352679 7f766abff6c0 Recovering log #1325
-2026/03/22-16:42:23.362109 7f766abff6c0 Delete type=3 #1323
-2026/03/22-16:42:23.362175 7f766abff6c0 Delete type=0 #1325
-2026/03/22-16:47:51.291160 7f7668bfb6c0 Level-0 table #1330: started
-2026/03/22-16:47:51.291261 7f7668bfb6c0 Level-0 table #1330: 0 bytes OK
-2026/03/22-16:47:51.297984 7f7668bfb6c0 Delete type=0 #1328
-2026/03/22-16:47:51.312338 7f7668bfb6c0 Manual compaction at level-0 from '!journal!3IgmiprzLB6Lwenc' @ 72057594037927935 : 1 .. '!journal.pages!suuYN87Al1ZZWtQQ.jhgNnhWhrkOpKs1B' @ 0 : 0; will stop at (end)
+2026/04/13-23:10:07.603169 7fddd97be6c0 Recovering log #1337
+2026/04/13-23:10:07.613544 7fddd97be6c0 Delete type=3 #1335
+2026/04/13-23:10:07.613619 7fddd97be6c0 Delete type=0 #1337
+2026/04/13-23:14:52.439353 7fddca1c26c0 Level-0 table #1342: started
+2026/04/13-23:14:52.439375 7fddca1c26c0 Level-0 table #1342: 0 bytes OK
+2026/04/13-23:14:52.447401 7fddca1c26c0 Delete type=0 #1340
+2026/04/13-23:14:52.447538 7fddca1c26c0 Manual compaction at level-0 from '!journal!3IgmiprzLB6Lwenc' @ 72057594037927935 : 1 .. '!journal.pages!suuYN87Al1ZZWtQQ.jhgNnhWhrkOpKs1B' @ 0 : 0; will stop at (end)
diff --git a/packs/aides-de-jeu-fr/LOG.old b/packs/aides-de-jeu-fr/LOG.old
index ff9124c..2a05664 100644
--- a/packs/aides-de-jeu-fr/LOG.old
+++ b/packs/aides-de-jeu-fr/LOG.old
@@ -1,7 +1,7 @@
-2026/03/22-16:36:37.688691 7f76693fc6c0 Recovering log #1321
-2026/03/22-16:36:37.776281 7f76693fc6c0 Delete type=3 #1319
-2026/03/22-16:36:37.776343 7f76693fc6c0 Delete type=0 #1321
-2026/03/22-16:36:43.868900 7f7668bfb6c0 Level-0 table #1326: started
-2026/03/22-16:36:43.868921 7f7668bfb6c0 Level-0 table #1326: 0 bytes OK
-2026/03/22-16:36:43.928319 7f7668bfb6c0 Delete type=0 #1324
-2026/03/22-16:36:43.978234 7f7668bfb6c0 Manual compaction at level-0 from '!journal!3IgmiprzLB6Lwenc' @ 72057594037927935 : 1 .. '!journal.pages!suuYN87Al1ZZWtQQ.jhgNnhWhrkOpKs1B' @ 0 : 0; will stop at (end)
+2026/04/13-23:01:32.388566 7fddd97be6c0 Recovering log #1333
+2026/04/13-23:01:32.399282 7fddd97be6c0 Delete type=3 #1331
+2026/04/13-23:01:32.399346 7fddd97be6c0 Delete type=0 #1333
+2026/04/13-23:07:12.207745 7fddca1c26c0 Level-0 table #1338: started
+2026/04/13-23:07:12.207766 7fddca1c26c0 Level-0 table #1338: 0 bytes OK
+2026/04/13-23:07:12.214487 7fddca1c26c0 Delete type=0 #1336
+2026/04/13-23:07:12.214671 7fddca1c26c0 Manual compaction at level-0 from '!journal!3IgmiprzLB6Lwenc' @ 72057594037927935 : 1 .. '!journal.pages!suuYN87Al1ZZWtQQ.jhgNnhWhrkOpKs1B' @ 0 : 0; will stop at (end)
diff --git a/packs/aides-de-jeu-fr/MANIFEST-001327 b/packs/aides-de-jeu-fr/MANIFEST-001339
similarity index 84%
rename from packs/aides-de-jeu-fr/MANIFEST-001327
rename to packs/aides-de-jeu-fr/MANIFEST-001339
index bfa4328..16dbf14 100644
Binary files a/packs/aides-de-jeu-fr/MANIFEST-001327 and b/packs/aides-de-jeu-fr/MANIFEST-001339 differ
diff --git a/packs/apothicarium/001329.log b/packs/antidotes-and-remedes/001335.log
similarity index 100%
rename from packs/apothicarium/001329.log
rename to packs/antidotes-and-remedes/001335.log
diff --git a/packs/dons-de-rhya/001329.log b/packs/antidotes-and-remedes/001343.log
similarity index 100%
rename from packs/dons-de-rhya/001329.log
rename to packs/antidotes-and-remedes/001343.log
diff --git a/packs/antidotes-and-remedes/CURRENT b/packs/antidotes-and-remedes/CURRENT
index cfd0000..42c5923 100644
--- a/packs/antidotes-and-remedes/CURRENT
+++ b/packs/antidotes-and-remedes/CURRENT
@@ -1 +1 @@
-MANIFEST-001329
+MANIFEST-001341
diff --git a/packs/antidotes-and-remedes/LOG b/packs/antidotes-and-remedes/LOG
index 2ed304f..d6dea39 100644
--- a/packs/antidotes-and-remedes/LOG
+++ b/packs/antidotes-and-remedes/LOG
@@ -1,7 +1,7 @@
-2026/03/22-16:42:23.364546 7f7669bfd6c0 Recovering log #1327
-2026/03/22-16:42:23.374494 7f7669bfd6c0 Delete type=3 #1325
-2026/03/22-16:42:23.374542 7f7669bfd6c0 Delete type=0 #1327
-2026/03/22-16:47:51.298142 7f7668bfb6c0 Level-0 table #1332: started
-2026/03/22-16:47:51.298174 7f7668bfb6c0 Level-0 table #1332: 0 bytes OK
-2026/03/22-16:47:51.304520 7f7668bfb6c0 Delete type=0 #1330
-2026/03/22-16:47:51.312349 7f7668bfb6c0 Manual compaction at level-0 from '!folders!3uquYH73ttCdoH0I' @ 72057594037927935 : 1 .. '!items!ylFhk7mGZOnAJTUT' @ 0 : 0; will stop at (end)
+2026/04/13-23:10:07.616013 7fddcbfff6c0 Recovering log #1339
+2026/04/13-23:10:07.625710 7fddcbfff6c0 Delete type=3 #1337
+2026/04/13-23:10:07.625777 7fddcbfff6c0 Delete type=0 #1339
+2026/04/13-23:14:52.426320 7fddca1c26c0 Level-0 table #1344: started
+2026/04/13-23:14:52.426354 7fddca1c26c0 Level-0 table #1344: 0 bytes OK
+2026/04/13-23:14:52.432796 7fddca1c26c0 Delete type=0 #1342
+2026/04/13-23:14:52.447521 7fddca1c26c0 Manual compaction at level-0 from '!folders!3uquYH73ttCdoH0I' @ 72057594037927935 : 1 .. '!items!ylFhk7mGZOnAJTUT' @ 0 : 0; will stop at (end)
diff --git a/packs/antidotes-and-remedes/LOG.old b/packs/antidotes-and-remedes/LOG.old
index 405be99..d334cb5 100644
--- a/packs/antidotes-and-remedes/LOG.old
+++ b/packs/antidotes-and-remedes/LOG.old
@@ -1,7 +1,7 @@
-2026/03/22-16:36:37.779289 7f766abff6c0 Recovering log #1323
-2026/03/22-16:36:37.874995 7f766abff6c0 Delete type=3 #1321
-2026/03/22-16:36:37.875069 7f766abff6c0 Delete type=0 #1323
-2026/03/22-16:36:43.761021 7f7668bfb6c0 Level-0 table #1328: started
-2026/03/22-16:36:43.761049 7f7668bfb6c0 Level-0 table #1328: 0 bytes OK
-2026/03/22-16:36:43.810545 7f7668bfb6c0 Delete type=0 #1326
-2026/03/22-16:36:43.978196 7f7668bfb6c0 Manual compaction at level-0 from '!folders!3uquYH73ttCdoH0I' @ 72057594037927935 : 1 .. '!items!ylFhk7mGZOnAJTUT' @ 0 : 0; will stop at (end)
+2026/04/13-23:01:32.401911 7fddd8fbd6c0 Recovering log #1335
+2026/04/13-23:01:32.411157 7fddd8fbd6c0 Delete type=3 #1333
+2026/04/13-23:01:32.411219 7fddd8fbd6c0 Delete type=0 #1335
+2026/04/13-23:07:12.194188 7fddca1c26c0 Level-0 table #1340: started
+2026/04/13-23:07:12.194235 7fddca1c26c0 Level-0 table #1340: 0 bytes OK
+2026/04/13-23:07:12.201298 7fddca1c26c0 Delete type=0 #1338
+2026/04/13-23:07:12.214646 7fddca1c26c0 Manual compaction at level-0 from '!folders!3uquYH73ttCdoH0I' @ 72057594037927935 : 1 .. '!items!ylFhk7mGZOnAJTUT' @ 0 : 0; will stop at (end)
diff --git a/packs/antidotes-and-remedes/MANIFEST-001329 b/packs/antidotes-and-remedes/MANIFEST-001341
similarity index 71%
rename from packs/antidotes-and-remedes/MANIFEST-001329
rename to packs/antidotes-and-remedes/MANIFEST-001341
index 1363cc8..24c6307 100644
Binary files a/packs/antidotes-and-remedes/MANIFEST-001329 and b/packs/antidotes-and-remedes/MANIFEST-001341 differ
diff --git a/packs/plats-dauberges/001329.log b/packs/apothicarium/001333.log
similarity index 100%
rename from packs/plats-dauberges/001329.log
rename to packs/apothicarium/001333.log
diff --git a/packs/tables-des-traductions/000972.log b/packs/apothicarium/001341.log
similarity index 100%
rename from packs/tables-des-traductions/000972.log
rename to packs/apothicarium/001341.log
diff --git a/packs/apothicarium/CURRENT b/packs/apothicarium/CURRENT
index e75a971..59ecd4f 100644
--- a/packs/apothicarium/CURRENT
+++ b/packs/apothicarium/CURRENT
@@ -1 +1 @@
-MANIFEST-001327
+MANIFEST-001339
diff --git a/packs/apothicarium/LOG b/packs/apothicarium/LOG
index cab0436..9292911 100644
--- a/packs/apothicarium/LOG
+++ b/packs/apothicarium/LOG
@@ -1,7 +1,7 @@
-2026/03/22-16:42:23.390520 7f766abff6c0 Recovering log #1325
-2026/03/22-16:42:23.399767 7f766abff6c0 Delete type=3 #1323
-2026/03/22-16:42:23.399819 7f766abff6c0 Delete type=0 #1325
-2026/03/22-16:47:51.312439 7f7668bfb6c0 Level-0 table #1330: started
-2026/03/22-16:47:51.312465 7f7668bfb6c0 Level-0 table #1330: 0 bytes OK
-2026/03/22-16:47:51.318661 7f7668bfb6c0 Delete type=0 #1328
-2026/03/22-16:47:51.342631 7f7668bfb6c0 Manual compaction at level-0 from '!journal!cZtNgayIw2QFhC9u' @ 72057594037927935 : 1 .. '!journal.pages!cZtNgayIw2QFhC9u.ts265H1XkisLgdow' @ 0 : 0; will stop at (end)
+2026/04/13-23:10:07.641322 7fddd9fbf6c0 Recovering log #1337
+2026/04/13-23:10:07.651537 7fddd9fbf6c0 Delete type=3 #1335
+2026/04/13-23:10:07.651623 7fddd9fbf6c0 Delete type=0 #1337
+2026/04/13-23:14:52.478583 7fddca1c26c0 Level-0 table #1342: started
+2026/04/13-23:14:52.478613 7fddca1c26c0 Level-0 table #1342: 0 bytes OK
+2026/04/13-23:14:52.484781 7fddca1c26c0 Delete type=0 #1340
+2026/04/13-23:14:52.484989 7fddca1c26c0 Manual compaction at level-0 from '!journal!cZtNgayIw2QFhC9u' @ 72057594037927935 : 1 .. '!journal.pages!cZtNgayIw2QFhC9u.ts265H1XkisLgdow' @ 0 : 0; will stop at (end)
diff --git a/packs/apothicarium/LOG.old b/packs/apothicarium/LOG.old
index 4ee80ea..b901e68 100644
--- a/packs/apothicarium/LOG.old
+++ b/packs/apothicarium/LOG.old
@@ -1,7 +1,7 @@
-2026/03/22-16:36:37.968048 7f7669bfd6c0 Recovering log #1321
-2026/03/22-16:36:38.054640 7f7669bfd6c0 Delete type=3 #1319
-2026/03/22-16:36:38.054710 7f7669bfd6c0 Delete type=0 #1321
-2026/03/22-16:36:43.810785 7f7668bfb6c0 Level-0 table #1326: started
-2026/03/22-16:36:43.810821 7f7668bfb6c0 Level-0 table #1326: 0 bytes OK
-2026/03/22-16:36:43.868750 7f7668bfb6c0 Delete type=0 #1324
-2026/03/22-16:36:43.978217 7f7668bfb6c0 Manual compaction at level-0 from '!journal!cZtNgayIw2QFhC9u' @ 72057594037927935 : 1 .. '!journal.pages!cZtNgayIw2QFhC9u.ts265H1XkisLgdow' @ 0 : 0; will stop at (end)
+2026/04/13-23:01:32.426243 7fddcbfff6c0 Recovering log #1333
+2026/04/13-23:01:32.436951 7fddcbfff6c0 Delete type=3 #1331
+2026/04/13-23:01:32.437016 7fddcbfff6c0 Delete type=0 #1333
+2026/04/13-23:07:12.201427 7fddca1c26c0 Level-0 table #1338: started
+2026/04/13-23:07:12.201453 7fddca1c26c0 Level-0 table #1338: 0 bytes OK
+2026/04/13-23:07:12.207634 7fddca1c26c0 Delete type=0 #1336
+2026/04/13-23:07:12.214659 7fddca1c26c0 Manual compaction at level-0 from '!journal!cZtNgayIw2QFhC9u' @ 72057594037927935 : 1 .. '!journal.pages!cZtNgayIw2QFhC9u.ts265H1XkisLgdow' @ 0 : 0; will stop at (end)
diff --git a/packs/apothicarium/MANIFEST-001327 b/packs/apothicarium/MANIFEST-001339
similarity index 84%
rename from packs/apothicarium/MANIFEST-001327
rename to packs/apothicarium/MANIFEST-001339
index fcbcecf..68bc06b 100644
Binary files a/packs/apothicarium/MANIFEST-001327 and b/packs/apothicarium/MANIFEST-001339 differ
diff --git a/packs/dons-de-rhya/001333.log b/packs/dons-de-rhya/001333.log
new file mode 100644
index 0000000..e69de29
diff --git a/packs/dons-de-rhya/001341.log b/packs/dons-de-rhya/001341.log
new file mode 100644
index 0000000..e69de29
diff --git a/packs/dons-de-rhya/CURRENT b/packs/dons-de-rhya/CURRENT
index e75a971..59ecd4f 100644
--- a/packs/dons-de-rhya/CURRENT
+++ b/packs/dons-de-rhya/CURRENT
@@ -1 +1 @@
-MANIFEST-001327
+MANIFEST-001339
diff --git a/packs/dons-de-rhya/LOG b/packs/dons-de-rhya/LOG
index a3996e9..ab8fc3c 100644
--- a/packs/dons-de-rhya/LOG
+++ b/packs/dons-de-rhya/LOG
@@ -1,7 +1,7 @@
-2026/03/22-16:42:23.338520 7f766abff6c0 Recovering log #1325
-2026/03/22-16:42:23.349125 7f766abff6c0 Delete type=3 #1323
-2026/03/22-16:42:23.349194 7f766abff6c0 Delete type=0 #1325
-2026/03/22-16:47:51.284088 7f7668bfb6c0 Level-0 table #1330: started
-2026/03/22-16:47:51.284128 7f7668bfb6c0 Level-0 table #1330: 0 bytes OK
-2026/03/22-16:47:51.290785 7f7668bfb6c0 Delete type=0 #1328
-2026/03/22-16:47:51.312323 7f7668bfb6c0 Manual compaction at level-0 from '!journal!50u8VAjdmovyr0hx' @ 72057594037927935 : 1 .. '!journal.pages!yzw9I0r3hCK7PJnz.sPNCYj2nR3Cp3jHd' @ 0 : 0; will stop at (end)
+2026/04/13-23:10:07.590923 7fddd8fbd6c0 Recovering log #1337
+2026/04/13-23:10:07.600770 7fddd8fbd6c0 Delete type=3 #1335
+2026/04/13-23:10:07.600832 7fddd8fbd6c0 Delete type=0 #1337
+2026/04/13-23:14:52.419409 7fddca1c26c0 Level-0 table #1342: started
+2026/04/13-23:14:52.419440 7fddca1c26c0 Level-0 table #1342: 0 bytes OK
+2026/04/13-23:14:52.426167 7fddca1c26c0 Delete type=0 #1340
+2026/04/13-23:14:52.447511 7fddca1c26c0 Manual compaction at level-0 from '!journal!50u8VAjdmovyr0hx' @ 72057594037927935 : 1 .. '!journal.pages!yzw9I0r3hCK7PJnz.sPNCYj2nR3Cp3jHd' @ 0 : 0; will stop at (end)
diff --git a/packs/dons-de-rhya/LOG.old b/packs/dons-de-rhya/LOG.old
index 2a1bf3e..265e5da 100644
--- a/packs/dons-de-rhya/LOG.old
+++ b/packs/dons-de-rhya/LOG.old
@@ -1,7 +1,7 @@
-2026/03/22-16:36:37.600423 7f7669bfd6c0 Recovering log #1321
-2026/03/22-16:36:37.685656 7f7669bfd6c0 Delete type=3 #1319
-2026/03/22-16:36:37.685721 7f7669bfd6c0 Delete type=0 #1321
-2026/03/22-16:36:43.698690 7f7668bfb6c0 Level-0 table #1326: started
-2026/03/22-16:36:43.698733 7f7668bfb6c0 Level-0 table #1326: 0 bytes OK
-2026/03/22-16:36:43.734104 7f7668bfb6c0 Delete type=0 #1324
-2026/03/22-16:36:43.760901 7f7668bfb6c0 Manual compaction at level-0 from '!journal!50u8VAjdmovyr0hx' @ 72057594037927935 : 1 .. '!journal.pages!yzw9I0r3hCK7PJnz.sPNCYj2nR3Cp3jHd' @ 0 : 0; will stop at (end)
+2026/04/13-23:01:32.376215 7fddcbfff6c0 Recovering log #1333
+2026/04/13-23:01:32.386265 7fddcbfff6c0 Delete type=3 #1331
+2026/04/13-23:01:32.386335 7fddcbfff6c0 Delete type=0 #1333
+2026/04/13-23:07:12.172988 7fddca1c26c0 Level-0 table #1338: started
+2026/04/13-23:07:12.173015 7fddca1c26c0 Level-0 table #1338: 0 bytes OK
+2026/04/13-23:07:12.180381 7fddca1c26c0 Delete type=0 #1336
+2026/04/13-23:07:12.187032 7fddca1c26c0 Manual compaction at level-0 from '!journal!50u8VAjdmovyr0hx' @ 72057594037927935 : 1 .. '!journal.pages!yzw9I0r3hCK7PJnz.sPNCYj2nR3Cp3jHd' @ 0 : 0; will stop at (end)
diff --git a/packs/dons-de-rhya/MANIFEST-001327 b/packs/dons-de-rhya/MANIFEST-001339
similarity index 84%
rename from packs/dons-de-rhya/MANIFEST-001327
rename to packs/dons-de-rhya/MANIFEST-001339
index 8bf3011..1273c81 100644
Binary files a/packs/dons-de-rhya/MANIFEST-001327 and b/packs/dons-de-rhya/MANIFEST-001339 differ
diff --git a/packs/plats-dauberges/001333.log b/packs/plats-dauberges/001333.log
new file mode 100644
index 0000000..e69de29
diff --git a/packs/plats-dauberges/001341.log b/packs/plats-dauberges/001341.log
new file mode 100644
index 0000000..e69de29
diff --git a/packs/plats-dauberges/CURRENT b/packs/plats-dauberges/CURRENT
index e75a971..59ecd4f 100644
--- a/packs/plats-dauberges/CURRENT
+++ b/packs/plats-dauberges/CURRENT
@@ -1 +1 @@
-MANIFEST-001327
+MANIFEST-001339
diff --git a/packs/plats-dauberges/LOG b/packs/plats-dauberges/LOG
index 2e2a1fc..8c44d8f 100644
--- a/packs/plats-dauberges/LOG
+++ b/packs/plats-dauberges/LOG
@@ -1,7 +1,7 @@
-2026/03/22-16:42:23.326365 7f766abff6c0 Recovering log #1325
-2026/03/22-16:42:23.336381 7f766abff6c0 Delete type=3 #1323
-2026/03/22-16:42:23.336459 7f766abff6c0 Delete type=0 #1325
-2026/03/22-16:47:51.277178 7f7668bfb6c0 Level-0 table #1330: started
-2026/03/22-16:47:51.277256 7f7668bfb6c0 Level-0 table #1330: 0 bytes OK
-2026/03/22-16:47:51.283812 7f7668bfb6c0 Delete type=0 #1328
-2026/03/22-16:47:51.283961 7f7668bfb6c0 Manual compaction at level-0 from '!tables!4l60Lxv8cpsyy2Cg' @ 72057594037927935 : 1 .. '!tables.results!tfaYKDZqu7kgZvRG.yvbwKursaixh2dby' @ 0 : 0; will stop at (end)
+2026/04/13-23:10:07.578503 7fddd9fbf6c0 Recovering log #1337
+2026/04/13-23:10:07.588788 7fddd9fbf6c0 Delete type=3 #1335
+2026/04/13-23:10:07.588855 7fddd9fbf6c0 Delete type=0 #1337
+2026/04/13-23:14:52.432890 7fddca1c26c0 Level-0 table #1342: started
+2026/04/13-23:14:52.432912 7fddca1c26c0 Level-0 table #1342: 0 bytes OK
+2026/04/13-23:14:52.439225 7fddca1c26c0 Delete type=0 #1340
+2026/04/13-23:14:52.447529 7fddca1c26c0 Manual compaction at level-0 from '!tables!4l60Lxv8cpsyy2Cg' @ 72057594037927935 : 1 .. '!tables.results!tfaYKDZqu7kgZvRG.yvbwKursaixh2dby' @ 0 : 0; will stop at (end)
diff --git a/packs/plats-dauberges/LOG.old b/packs/plats-dauberges/LOG.old
index b5621fc..56d2ade 100644
--- a/packs/plats-dauberges/LOG.old
+++ b/packs/plats-dauberges/LOG.old
@@ -1,7 +1,7 @@
-2026/03/22-16:36:37.504471 7f76693fc6c0 Recovering log #1321
-2026/03/22-16:36:37.597157 7f76693fc6c0 Delete type=3 #1319
-2026/03/22-16:36:37.597217 7f76693fc6c0 Delete type=0 #1321
-2026/03/22-16:36:43.734281 7f7668bfb6c0 Level-0 table #1326: started
-2026/03/22-16:36:43.734305 7f7668bfb6c0 Level-0 table #1326: 0 bytes OK
-2026/03/22-16:36:43.760674 7f7668bfb6c0 Delete type=0 #1324
-2026/03/22-16:36:43.760915 7f7668bfb6c0 Manual compaction at level-0 from '!tables!4l60Lxv8cpsyy2Cg' @ 72057594037927935 : 1 .. '!tables.results!tfaYKDZqu7kgZvRG.yvbwKursaixh2dby' @ 0 : 0; will stop at (end)
+2026/04/13-23:01:32.363321 7fddd9fbf6c0 Recovering log #1333
+2026/04/13-23:01:32.373224 7fddd9fbf6c0 Delete type=3 #1331
+2026/04/13-23:01:32.373285 7fddd9fbf6c0 Delete type=0 #1333
+2026/04/13-23:07:12.180494 7fddca1c26c0 Level-0 table #1338: started
+2026/04/13-23:07:12.180514 7fddca1c26c0 Level-0 table #1338: 0 bytes OK
+2026/04/13-23:07:12.186759 7fddca1c26c0 Delete type=0 #1336
+2026/04/13-23:07:12.187045 7fddca1c26c0 Manual compaction at level-0 from '!tables!4l60Lxv8cpsyy2Cg' @ 72057594037927935 : 1 .. '!tables.results!tfaYKDZqu7kgZvRG.yvbwKursaixh2dby' @ 0 : 0; will stop at (end)
diff --git a/packs/plats-dauberges/MANIFEST-001327 b/packs/plats-dauberges/MANIFEST-001339
similarity index 83%
rename from packs/plats-dauberges/MANIFEST-001327
rename to packs/plats-dauberges/MANIFEST-001339
index 0827281..a6edab5 100644
Binary files a/packs/plats-dauberges/MANIFEST-001327 and b/packs/plats-dauberges/MANIFEST-001339 differ
diff --git a/packs/tables-des-traductions/000976.log b/packs/tables-des-traductions/000976.log
new file mode 100644
index 0000000..e69de29
diff --git a/packs/tables-des-traductions/000984.log b/packs/tables-des-traductions/000984.log
new file mode 100644
index 0000000..e69de29
diff --git a/packs/tables-des-traductions/CURRENT b/packs/tables-des-traductions/CURRENT
index ff619c7..d0e8e6e 100644
--- a/packs/tables-des-traductions/CURRENT
+++ b/packs/tables-des-traductions/CURRENT
@@ -1 +1 @@
-MANIFEST-000970
+MANIFEST-000982
diff --git a/packs/tables-des-traductions/LOG b/packs/tables-des-traductions/LOG
index 7b01339..e8bde45 100644
--- a/packs/tables-des-traductions/LOG
+++ b/packs/tables-des-traductions/LOG
@@ -1,7 +1,7 @@
-2026/03/22-16:42:23.377345 7f766abff6c0 Recovering log #968
-2026/03/22-16:42:23.388209 7f766abff6c0 Delete type=3 #966
-2026/03/22-16:42:23.388272 7f766abff6c0 Delete type=0 #968
-2026/03/22-16:47:51.304649 7f7668bfb6c0 Level-0 table #973: started
-2026/03/22-16:47:51.304679 7f7668bfb6c0 Level-0 table #973: 0 bytes OK
-2026/03/22-16:47:51.312155 7f7668bfb6c0 Delete type=0 #971
-2026/03/22-16:47:51.312359 7f7668bfb6c0 Manual compaction at level-0 from '!journal!056ILNNrLiPq3Gi3' @ 72057594037927935 : 1 .. '!journal.pages!yfZxl4I7XAuUF6r3.apXmOlZRmGT4GreB' @ 0 : 0; will stop at (end)
+2026/04/13-23:10:07.628261 7fddd97be6c0 Recovering log #980
+2026/04/13-23:10:07.638743 7fddd97be6c0 Delete type=3 #978
+2026/04/13-23:10:07.638813 7fddd97be6c0 Delete type=0 #980
+2026/04/13-23:14:52.447639 7fddca1c26c0 Level-0 table #985: started
+2026/04/13-23:14:52.447658 7fddca1c26c0 Level-0 table #985: 0 bytes OK
+2026/04/13-23:14:52.454058 7fddca1c26c0 Delete type=0 #983
+2026/04/13-23:14:52.484949 7fddca1c26c0 Manual compaction at level-0 from '!journal!056ILNNrLiPq3Gi3' @ 72057594037927935 : 1 .. '!journal.pages!yfZxl4I7XAuUF6r3.apXmOlZRmGT4GreB' @ 0 : 0; will stop at (end)
diff --git a/packs/tables-des-traductions/LOG.old b/packs/tables-des-traductions/LOG.old
index 9009ad1..babe04a 100644
--- a/packs/tables-des-traductions/LOG.old
+++ b/packs/tables-des-traductions/LOG.old
@@ -1,7 +1,7 @@
-2026/03/22-16:36:37.879467 7f7669bfd6c0 Recovering log #964
-2026/03/22-16:36:37.964554 7f7669bfd6c0 Delete type=3 #962
-2026/03/22-16:36:37.964638 7f7669bfd6c0 Delete type=0 #964
-2026/03/22-16:36:43.928514 7f7668bfb6c0 Level-0 table #969: started
-2026/03/22-16:36:43.928542 7f7668bfb6c0 Level-0 table #969: 0 bytes OK
-2026/03/22-16:36:43.977973 7f7668bfb6c0 Delete type=0 #967
-2026/03/22-16:36:43.978253 7f7668bfb6c0 Manual compaction at level-0 from '!journal!056ILNNrLiPq3Gi3' @ 72057594037927935 : 1 .. '!journal.pages!yfZxl4I7XAuUF6r3.apXmOlZRmGT4GreB' @ 0 : 0; will stop at (end)
+2026/04/13-23:01:32.413810 7fddd97be6c0 Recovering log #976
+2026/04/13-23:01:32.423395 7fddd97be6c0 Delete type=3 #974
+2026/04/13-23:01:32.423455 7fddd97be6c0 Delete type=0 #976
+2026/04/13-23:07:12.187249 7fddca1c26c0 Level-0 table #981: started
+2026/04/13-23:07:12.187284 7fddca1c26c0 Level-0 table #981: 0 bytes OK
+2026/04/13-23:07:12.194022 7fddca1c26c0 Delete type=0 #979
+2026/04/13-23:07:12.214628 7fddca1c26c0 Manual compaction at level-0 from '!journal!056ILNNrLiPq3Gi3' @ 72057594037927935 : 1 .. '!journal.pages!yfZxl4I7XAuUF6r3.apXmOlZRmGT4GreB' @ 0 : 0; will stop at (end)
diff --git a/packs/tables-des-traductions/MANIFEST-000970 b/packs/tables-des-traductions/MANIFEST-000982
similarity index 84%
rename from packs/tables-des-traductions/MANIFEST-000970
rename to packs/tables-des-traductions/MANIFEST-000982
index 24a7aeb..9f7a794 100644
Binary files a/packs/tables-des-traductions/MANIFEST-000970 and b/packs/tables-des-traductions/MANIFEST-000982 differ