Compare commits

...

4 Commits

Author SHA1 Message Date
uberwald 05cc3eb9e2 fix: correction des noms de méthodes, variables et clés de propriétés JS traduits par erreur (applyPeur→applyFear, postPeur→postFear, effet→effect, Test→test, Blessures→wounds)
Validation JSON / validate (push) Successful in 14s
Release Creation / build (release) Successful in 1m5s
2026-07-24 13:22:31 +02:00
uberwald 636632063c Ajout chaine de traduction manquante
Validation JSON / validate (push) Successful in 14s
Release Creation / build (release) Successful in 58s
2026-07-23 21:39:04 +02:00
uberwald c54a625a42 fix: correction des tests de Corruption pour la locale FR
- Remplacement des comparaisons localisées dans handleCorruptionResult
  par des chaînes anglaises en dur pour que les paliers de Corruption
  soient correctement appliqués
- Correction de _onResist pour accepter les valeurs anglaises et
  françaises de sévérité de Corruption
- Correction des liens @Corruption[modérée] → @Corruption[moderate]
  dans les scripts d'effets
- Élargissement de la clause de garde dans xS2su09zcza9du09.js pour
  couvrir les valeurs anglaises et françaises
- Ajout de AGENTS.md
2026-07-23 20:58:38 +02:00
uberwald 1f917bfdfd Ajout de nouvelles clés de traduction
Validation JSON / validate (push) Successful in 13s
2026-06-13 21:35:02 +02:00
78 changed files with 326 additions and 216 deletions
+55
View File
@@ -0,0 +1,55 @@
# AGENTS.md — foundryvtt-wh4-lang-fr-fr
FoundryVTT WFRP4e French translation module (wh4-fr-translation).
## Quick start
```bash
npm run build # packs scripts/*.js → modules/loadScripts.js (do NOT edit loadScripts.js manually)
python3 -mjson.tool fr.json > /dev/null # validate JSON (CI check)
python3 -mjson.tool module.json > /dev/null
```
No test framework exists. Only automated check is JSON validity (`.gitea/workflows/validate.yaml` on every push).
## Architecture
- **`fr.json`** (2715 keys) — UI/system flat key→val translations (`WFRP4E.*` namespace)
- **`compendium/*.json`** — compendium translations named `{source-module}.{pack-type}.json`; entries keyed by English `id`
- **`scripts/*.js`** — ActiveEffect scripts named by Foundry item IDs (GUID-like `a7v422EZcOUUC20X.js`)
- **`modules/loadScripts.js`** — **generated** by `npm run build`; never edit directly
- **`modules/babele-register.js`** — registers all compendium JSONs with Babele at `init` hook; contains all converter logic
- **`modules/addon-register.js`** — patches `game.wfrp4e.config.*` with French strings at `init`/`ready`
- **`modules/config-patch.js`** — `WH4FRPatchConfig` class (skill list translation, talent list, NPC details)
- **`modules/import-stat-2.js`** — French stat block parser (replaces WFRP4e default)
- **`wh4_fr.js`** — entry point, inits `travelv2` and `inn` submodules from `modules/`
- **`packs/`** — custom French compendium packs (LevelDB format)
- **`patch-styles.css`** — CSS patches
## Critical conventions
- **Never use French words as JS variable names** in `scripts/`. `Blessures` and `Tests` shadow WFRP4e internals (the system uses `game.wfrp4e.config.*` lookup based on English names, and `Blessures`/`Tests` as variable names break this). Scan with:
```bash
node find-blessures-variables.cjs
node find-tests-variables.cjs
```
- Conflicts in the release workflow: `compatibility-verified: '13'` in `.gitea/workflows/release.yaml` but `"verified": "14"` in `module.json`. The CI step overwrites the release yaml's value — but if adding module.json updates, match both.
## Upstream sync workflow
When updating to a new WFRP4e release:
```bash
node tools/copy-new-scripts.js --list # count new scripts
node tools/copy-new-scripts.js --dry-run # preview
node tools/copy-new-scripts.js --copy # copy new scripts
node tools/sync-scripts.js # compare scripts with upstream
node tools/translate-scripts.js # apply auto-translation passes
node tools/check-tests.js # scan for "Tests" in scripts/ content
```
## Release
Published via Gitea release. The zip includes: `module.json`, `fr.json`, `wh4_fr.js`, `patch-styles.css`, `README.md`, `LICENSE`, `compendium/`, `modules/`, `packs/`, `icons/`, `images/`, `trade/`.
Detailed architecture reference in `.github/copilot-instructions.md`.
+6
View File
@@ -1175,6 +1175,12 @@
"CHAT.Dispel": "Dissiper {spell}",
"CHAT.DissolutionTable": "Lancer sur la Table de Dissolution du Corps et de l'Esprit pour votre Espèce:<br>@Table[corruption]",
"CHAT.InvokePrayer": "Invoquer {prayer}",
"CHAT.TestModifiers.MovedThisRound":"Tir lors d'un tour où vous utilisez également votre mouvement",
"CHAT.ApplyHealing":"Appliquer les soins",
"Healing":"Soins",
"RestRecoverHealed":"<strong>{actor}</strong> a soigné {amount} Blessures .",
"Error.SpeciesSkills": "Impossible d'ajouter des compétences pour les races",
"Error.SpeciesTalents": "Impossible d'ajouter des talents pour les races",
"Error.CriticalWound": "Erreur lors de l'application des blessures",
+73
View File
@@ -478,6 +478,79 @@ Hooks.on('ready', () => {
"doom": "Maudit (-40)"
}
// Patch handleCorruptionResult to use hardcoded English severity comparisons.
// The system compares this.options.corruption against game.i18n.localize() values,
// which works in English by coincidence ("minor" === "minor") but breaks in French
// ("minor" !== "mineur"). Since corruption severity strings ("minor"/"moderate"/"major")
// are internal API constants, not user-facing text, we use hardcoded comparisons.
const TestWFRP = game.wfrp4e.rolls.TestWFRP;
if (TestWFRP?.prototype?.handleCorruptionResult) {
TestWFRP.prototype.handleCorruptionResult = async function () {
const strength = this.options.corruption;
const failed = this.failed;
let corruption = 0;
switch (strength) {
case "minor":
if (failed) corruption++;
break;
case "moderate":
if (failed) corruption += 2;
else if (this.result.SL < 2) corruption += 1;
break;
case "major":
if (failed) corruption += 3;
else if (this.result.SL < 2) corruption += 2;
else if (this.result.SL < 4) corruption += 1;
break;
}
if (this.context.reroll || this.context.fortuneUsedAddSL) {
const prevFailed = this.context.previousResult.outcome === "failure";
switch (strength) {
case "minor":
if (prevFailed) corruption--;
break;
case "moderate":
if (prevFailed) corruption -= 2;
else if (this.context.previousResult.SL < 2) corruption -= 1;
break;
case "major":
if (prevFailed) corruption -= 3;
else if (this.context.previousResult.SL < 2) corruption -= 2;
else if (this.context.previousResult.SL < 4) corruption -= 1;
break;
}
}
let newCorruption = Number(this.actor.system.status.corruption.value) + corruption;
if (newCorruption < 0) newCorruption = 0;
if (!this.context.reroll && !this.context.fortuneUsedAddSL)
ChatMessage.create(game.wfrp4e.utility.chatDataSetup(game.i18n.format("CHAT.CorruptionFail", { name: this.actor.name, number: corruption }), "gmroll", false));
else
ChatMessage.create(game.wfrp4e.utility.chatDataSetup(game.i18n.format("CHAT.CorruptionReroll", { name: this.actor.name, number: corruption }), "gmroll", false));
await this.actor.update({ "system.status.corruption.value": newCorruption });
};
}
// Patch _onResist to accept both raw English and localized French corruption severity.
// The original validation compares `this.strength` against localized CORRUPTION.* keys,
// which fails when the stored strength is an English API value like "minor" vs French "Mineur".
const CorruptionMsgModel = CONFIG.ChatMessage.dataModels?.["corruption"];
if (CorruptionMsgModel?._onResist) {
CorruptionMsgModel._onResist = async function (ev, target) {
const strength = this.strength.toLowerCase();
const sMap = {
"minor": "minor", "moderate": "moderate", "major": "major",
[game.i18n.localize("CORRUPTION.Minor").toLowerCase()]: "minor",
[game.i18n.localize("CORRUPTION.Moderate").toLowerCase()]: "moderate",
[game.i18n.localize("CORRUPTION.Major").toLowerCase()]: "major",
};
const normalized = sMap[strength];
if (!normalized) return ui.notifications.error("ErrorCorruption", { localize: true });
const actors = warhammer.utility.targetedOrAssignedActors();
if (!actors.length) return ui.notifications.error("ErrorCharAssigned", { localize: true });
actors.forEach(a => a.corruptionDialog(normalized, this.skill));
};
}
if (game.user.isGM) {
game.wfrp4e.warnDialog.render(true, { focus: true, left: 20, top: 20 });
}
File diff suppressed because one or more lines are too long
+1 -1
View File
@@ -1 +1 @@
MANIFEST-001364
MANIFEST-001372
+7 -7
View File
@@ -1,7 +1,7 @@
2026/05/18-07:28:58.536469 7f5a46ffd6c0 Recovering log #1361
2026/05/18-07:28:58.548900 7f5a46ffd6c0 Delete type=3 #1359
2026/05/18-07:28:58.549070 7f5a46ffd6c0 Delete type=0 #1361
2026/05/18-07:30:05.697583 7f5a467fc6c0 Level-0 table #1367: started
2026/05/18-07:30:05.697633 7f5a467fc6c0 Level-0 table #1367: 0 bytes OK
2026/05/18-07:30:05.704017 7f5a467fc6c0 Delete type=0 #1365
2026/05/18-07:30:05.718239 7f5a467fc6c0 Manual compaction at level-0 from '!journal!3IgmiprzLB6Lwenc' @ 72057594037927935 : 1 .. '!journal.pages!suuYN87Al1ZZWtQQ.jhgNnhWhrkOpKs1B' @ 0 : 0; will stop at (end)
2026/07/23-21:32:46.337262 7fb396ffd6c0 Recovering log #1370
2026/07/23-21:32:46.347360 7fb396ffd6c0 Delete type=3 #1368
2026/07/23-21:32:46.347448 7fb396ffd6c0 Delete type=0 #1370
2026/07/23-21:38:47.750711 7fb394b4f6c0 Level-0 table #1375: started
2026/07/23-21:38:47.750736 7fb394b4f6c0 Level-0 table #1375: 0 bytes OK
2026/07/23-21:38:47.784333 7fb394b4f6c0 Delete type=0 #1373
2026/07/23-21:38:47.834602 7fb394b4f6c0 Manual compaction at level-0 from '!journal!3IgmiprzLB6Lwenc' @ 72057594037927935 : 1 .. '!journal.pages!suuYN87Al1ZZWtQQ.jhgNnhWhrkOpKs1B' @ 0 : 0; will stop at (end)
+7 -11
View File
@@ -1,11 +1,7 @@
2026/05/18-07:26:22.617911 7f5a94bff6c0 Delete type=3 #1
2026/05/18-07:27:45.533452 7f5a467fc6c0 Level-0 table #1362: started
2026/05/18-07:27:45.533503 7f5a467fc6c0 Level-0 table #1362: 0 bytes OK
2026/05/18-07:27:45.540598 7f5a467fc6c0 Delete type=0 #1360
2026/05/18-07:27:45.568568 7f5a467fc6c0 Manual compaction at level-0 from '!journal!3IgmiprzLB6Lwenc' @ 72057594037927935 : 1 .. '!journal.pages!suuYN87Al1ZZWtQQ.jhgNnhWhrkOpKs1B' @ 0 : 0; will stop at '!journal.pages!suuYN87Al1ZZWtQQ.jhgNnhWhrkOpKs1B' @ 29 : 1
2026/05/18-07:27:45.568588 7f5a467fc6c0 Compacting 1@0 + 0@1 files
2026/05/18-07:27:45.575581 7f5a467fc6c0 Generated table #1363@0: 13 keys, 49760 bytes
2026/05/18-07:27:45.575663 7f5a467fc6c0 Compacted 1@0 + 0@1 files => 49760 bytes
2026/05/18-07:27:45.582576 7f5a467fc6c0 compacted to: files[ 0 1 0 0 0 0 0 ]
2026/05/18-07:27:45.582792 7f5a467fc6c0 Delete type=2 #1226
2026/05/18-07:27:45.611087 7f5a467fc6c0 Manual compaction at level-0 from '!journal.pages!suuYN87Al1ZZWtQQ.jhgNnhWhrkOpKs1B' @ 29 : 1 .. '!journal.pages!suuYN87Al1ZZWtQQ.jhgNnhWhrkOpKs1B' @ 0 : 0; will stop at (end)
2026/07/23-21:30:54.821703 7fb3977fe6c0 Recovering log #1366
2026/07/23-21:30:54.880645 7fb3977fe6c0 Delete type=3 #1364
2026/07/23-21:30:54.880743 7fb3977fe6c0 Delete type=0 #1366
2026/07/23-21:32:07.239111 7fb394b4f6c0 Level-0 table #1371: started
2026/07/23-21:32:07.239141 7fb394b4f6c0 Level-0 table #1371: 0 bytes OK
2026/07/23-21:32:07.245796 7fb394b4f6c0 Delete type=0 #1369
2026/07/23-21:32:07.253300 7fb394b4f6c0 Manual compaction at level-0 from '!journal!3IgmiprzLB6Lwenc' @ 72057594037927935 : 1 .. '!journal.pages!suuYN87Al1ZZWtQQ.jhgNnhWhrkOpKs1B' @ 0 : 0; will stop at (end)
+1 -1
View File
@@ -1 +1 @@
MANIFEST-001366
MANIFEST-001374
+7 -7
View File
@@ -1,7 +1,7 @@
2026/05/18-07:28:58.553517 7f5a477fe6c0 Recovering log #1363
2026/05/18-07:28:58.565268 7f5a477fe6c0 Delete type=3 #1361
2026/05/18-07:28:58.565423 7f5a477fe6c0 Delete type=0 #1363
2026/05/18-07:30:05.704317 7f5a467fc6c0 Level-0 table #1369: started
2026/05/18-07:30:05.704383 7f5a467fc6c0 Level-0 table #1369: 0 bytes OK
2026/05/18-07:30:05.711087 7f5a467fc6c0 Delete type=0 #1367
2026/05/18-07:30:05.718264 7f5a467fc6c0 Manual compaction at level-0 from '!folders!3uquYH73ttCdoH0I' @ 72057594037927935 : 1 .. '!items!ylFhk7mGZOnAJTUT' @ 0 : 0; will stop at (end)
2026/07/23-21:32:46.352107 7fb3e4fff6c0 Recovering log #1372
2026/07/23-21:32:46.362976 7fb3e4fff6c0 Delete type=3 #1370
2026/07/23-21:32:46.363061 7fb3e4fff6c0 Delete type=0 #1372
2026/07/23-21:38:47.805575 7fb394b4f6c0 Level-0 table #1377: started
2026/07/23-21:38:47.805603 7fb394b4f6c0 Level-0 table #1377: 0 bytes OK
2026/07/23-21:38:47.834447 7fb394b4f6c0 Delete type=0 #1375
2026/07/23-21:38:47.865254 7fb394b4f6c0 Manual compaction at level-0 from '!folders!3uquYH73ttCdoH0I' @ 72057594037927935 : 1 .. '!items!ylFhk7mGZOnAJTUT' @ 0 : 0; will stop at (end)
+7 -11
View File
@@ -1,11 +1,7 @@
2026/05/18-07:26:22.652077 7f5a47fff6c0 Delete type=3 #1
2026/05/18-07:27:45.540983 7f5a467fc6c0 Level-0 table #1364: started
2026/05/18-07:27:45.541077 7f5a467fc6c0 Level-0 table #1364: 0 bytes OK
2026/05/18-07:27:45.548306 7f5a467fc6c0 Delete type=0 #1362
2026/05/18-07:27:45.583119 7f5a467fc6c0 Manual compaction at level-0 from '!folders!3uquYH73ttCdoH0I' @ 72057594037927935 : 1 .. '!items!ylFhk7mGZOnAJTUT' @ 0 : 0; will stop at '!items!ylFhk7mGZOnAJTUT' @ 416 : 1
2026/05/18-07:27:45.583140 7f5a467fc6c0 Compacting 1@0 + 0@1 files
2026/05/18-07:27:45.590339 7f5a467fc6c0 Generated table #1365@0: 103 keys, 115060 bytes
2026/05/18-07:27:45.590381 7f5a467fc6c0 Compacted 1@0 + 0@1 files => 115060 bytes
2026/05/18-07:27:45.596853 7f5a467fc6c0 compacted to: files[ 0 1 0 0 0 0 0 ]
2026/05/18-07:27:45.597062 7f5a467fc6c0 Delete type=2 #1228
2026/05/18-07:27:45.611108 7f5a467fc6c0 Manual compaction at level-0 from '!items!ylFhk7mGZOnAJTUT' @ 416 : 1 .. '!items!ylFhk7mGZOnAJTUT' @ 0 : 0; will stop at (end)
2026/07/23-21:30:54.895642 7fb397fff6c0 Recovering log #1368
2026/07/23-21:30:54.946258 7fb397fff6c0 Delete type=3 #1366
2026/07/23-21:30:54.946385 7fb397fff6c0 Delete type=0 #1368
2026/07/23-21:32:07.253662 7fb394b4f6c0 Level-0 table #1373: started
2026/07/23-21:32:07.253706 7fb394b4f6c0 Level-0 table #1373: 0 bytes OK
2026/07/23-21:32:07.260031 7fb394b4f6c0 Delete type=0 #1371
2026/07/23-21:32:07.292474 7fb394b4f6c0 Manual compaction at level-0 from '!folders!3uquYH73ttCdoH0I' @ 72057594037927935 : 1 .. '!items!ylFhk7mGZOnAJTUT' @ 0 : 0; will stop at (end)
+1 -1
View File
@@ -1 +1 @@
MANIFEST-001364
MANIFEST-001372
+7 -7
View File
@@ -1,7 +1,7 @@
2026/05/18-07:28:58.588715 7f5a46ffd6c0 Recovering log #1361
2026/05/18-07:28:58.601140 7f5a46ffd6c0 Delete type=3 #1359
2026/05/18-07:28:58.601277 7f5a46ffd6c0 Delete type=0 #1361
2026/05/18-07:30:05.740416 7f5a467fc6c0 Level-0 table #1367: started
2026/05/18-07:30:05.740496 7f5a467fc6c0 Level-0 table #1367: 0 bytes OK
2026/05/18-07:30:05.747194 7f5a467fc6c0 Delete type=0 #1365
2026/05/18-07:30:05.747493 7f5a467fc6c0 Manual compaction at level-0 from '!journal!cZtNgayIw2QFhC9u' @ 72057594037927935 : 1 .. '!journal.pages!cZtNgayIw2QFhC9u.ts265H1XkisLgdow' @ 0 : 0; will stop at (end)
2026/07/23-21:32:46.383400 7fb396ffd6c0 Recovering log #1370
2026/07/23-21:32:46.393737 7fb396ffd6c0 Delete type=3 #1368
2026/07/23-21:32:46.393827 7fb396ffd6c0 Delete type=0 #1370
2026/07/23-21:38:47.834624 7fb394b4f6c0 Level-0 table #1375: started
2026/07/23-21:38:47.834644 7fb394b4f6c0 Level-0 table #1375: 0 bytes OK
2026/07/23-21:38:47.865104 7fb394b4f6c0 Delete type=0 #1373
2026/07/23-21:38:47.935946 7fb394b4f6c0 Manual compaction at level-0 from '!journal!cZtNgayIw2QFhC9u' @ 72057594037927935 : 1 .. '!journal.pages!cZtNgayIw2QFhC9u.ts265H1XkisLgdow' @ 0 : 0; will stop at (end)
+7 -11
View File
@@ -1,11 +1,7 @@
2026/05/18-07:26:22.724053 7f5a477fe6c0 Delete type=3 #1
2026/05/18-07:27:45.611259 7f5a467fc6c0 Level-0 table #1362: started
2026/05/18-07:27:45.611332 7f5a467fc6c0 Level-0 table #1362: 0 bytes OK
2026/05/18-07:27:45.617997 7f5a467fc6c0 Delete type=0 #1360
2026/05/18-07:27:45.646323 7f5a467fc6c0 Manual compaction at level-0 from '!journal!cZtNgayIw2QFhC9u' @ 72057594037927935 : 1 .. '!journal.pages!cZtNgayIw2QFhC9u.ts265H1XkisLgdow' @ 0 : 0; will stop at '!journal.pages!cZtNgayIw2QFhC9u.ts265H1XkisLgdow' @ 5 : 1
2026/05/18-07:27:45.646350 7f5a467fc6c0 Compacting 1@0 + 0@1 files
2026/05/18-07:27:45.651592 7f5a467fc6c0 Generated table #1363@0: 3 keys, 19341 bytes
2026/05/18-07:27:45.651637 7f5a467fc6c0 Compacted 1@0 + 0@1 files => 19341 bytes
2026/05/18-07:27:45.658205 7f5a467fc6c0 compacted to: files[ 0 1 0 0 0 0 0 ]
2026/05/18-07:27:45.658493 7f5a467fc6c0 Delete type=2 #1226
2026/05/18-07:27:45.658909 7f5a467fc6c0 Manual compaction at level-0 from '!journal.pages!cZtNgayIw2QFhC9u.ts265H1XkisLgdow' @ 5 : 1 .. '!journal.pages!cZtNgayIw2QFhC9u.ts265H1XkisLgdow' @ 0 : 0; will stop at (end)
2026/07/23-21:30:55.024458 7fb3977fe6c0 Recovering log #1366
2026/07/23-21:30:55.079364 7fb3977fe6c0 Delete type=3 #1364
2026/07/23-21:30:55.079438 7fb3977fe6c0 Delete type=0 #1366
2026/07/23-21:32:07.260189 7fb394b4f6c0 Level-0 table #1371: started
2026/07/23-21:32:07.260219 7fb394b4f6c0 Level-0 table #1371: 0 bytes OK
2026/07/23-21:32:07.267866 7fb394b4f6c0 Delete type=0 #1369
2026/07/23-21:32:07.292502 7fb394b4f6c0 Manual compaction at level-0 from '!journal!cZtNgayIw2QFhC9u' @ 72057594037927935 : 1 .. '!journal.pages!cZtNgayIw2QFhC9u.ts265H1XkisLgdow' @ 0 : 0; will stop at (end)
+1 -1
View File
@@ -1 +1 @@
MANIFEST-001364
MANIFEST-001372
+7 -7
View File
@@ -1,7 +1,7 @@
2026/05/18-07:28:58.518987 7f5a47fff6c0 Recovering log #1361
2026/05/18-07:28:58.530654 7f5a47fff6c0 Delete type=3 #1359
2026/05/18-07:28:58.530808 7f5a47fff6c0 Delete type=0 #1361
2026/05/18-07:30:05.690995 7f5a467fc6c0 Level-0 table #1367: started
2026/05/18-07:30:05.691047 7f5a467fc6c0 Level-0 table #1367: 0 bytes OK
2026/05/18-07:30:05.697374 7f5a467fc6c0 Delete type=0 #1365
2026/05/18-07:30:05.718212 7f5a467fc6c0 Manual compaction at level-0 from '!journal!50u8VAjdmovyr0hx' @ 72057594037927935 : 1 .. '!journal.pages!yzw9I0r3hCK7PJnz.sPNCYj2nR3Cp3jHd' @ 0 : 0; will stop at (end)
2026/07/23-21:32:46.321063 7fb3977fe6c0 Recovering log #1370
2026/07/23-21:32:46.332477 7fb3977fe6c0 Delete type=3 #1368
2026/07/23-21:32:46.332563 7fb3977fe6c0 Delete type=0 #1370
2026/07/23-21:38:47.731514 7fb394b4f6c0 Level-0 table #1375: started
2026/07/23-21:38:47.731544 7fb394b4f6c0 Level-0 table #1375: 0 bytes OK
2026/07/23-21:38:47.750533 7fb394b4f6c0 Delete type=0 #1373
2026/07/23-21:38:47.805560 7fb394b4f6c0 Manual compaction at level-0 from '!journal!50u8VAjdmovyr0hx' @ 72057594037927935 : 1 .. '!journal.pages!yzw9I0r3hCK7PJnz.sPNCYj2nR3Cp3jHd' @ 0 : 0; will stop at (end)
+7 -11
View File
@@ -1,11 +1,7 @@
2026/05/18-07:26:22.583179 7f5a46ffd6c0 Delete type=3 #1
2026/05/18-07:27:45.526779 7f5a467fc6c0 Level-0 table #1362: started
2026/05/18-07:27:45.526853 7f5a467fc6c0 Level-0 table #1362: 0 bytes OK
2026/05/18-07:27:45.533273 7f5a467fc6c0 Delete type=0 #1360
2026/05/18-07:27:45.555413 7f5a467fc6c0 Manual compaction at level-0 from '!journal!50u8VAjdmovyr0hx' @ 72057594037927935 : 1 .. '!journal.pages!yzw9I0r3hCK7PJnz.sPNCYj2nR3Cp3jHd' @ 0 : 0; will stop at '!journal.pages!yzw9I0r3hCK7PJnz.sPNCYj2nR3Cp3jHd' @ 114 : 1
2026/05/18-07:27:45.555438 7f5a467fc6c0 Compacting 1@0 + 0@1 files
2026/05/18-07:27:45.561268 7f5a467fc6c0 Generated table #1363@0: 46 keys, 60465 bytes
2026/05/18-07:27:45.561341 7f5a467fc6c0 Compacted 1@0 + 0@1 files => 60465 bytes
2026/05/18-07:27:45.568073 7f5a467fc6c0 compacted to: files[ 0 1 0 0 0 0 0 ]
2026/05/18-07:27:45.568270 7f5a467fc6c0 Delete type=2 #1226
2026/05/18-07:27:45.611060 7f5a467fc6c0 Manual compaction at level-0 from '!journal.pages!yzw9I0r3hCK7PJnz.sPNCYj2nR3Cp3jHd' @ 114 : 1 .. '!journal.pages!yzw9I0r3hCK7PJnz.sPNCYj2nR3Cp3jHd' @ 0 : 0; will stop at (end)
2026/07/23-21:30:54.763392 7fb3e4fff6c0 Recovering log #1366
2026/07/23-21:30:54.817497 7fb3e4fff6c0 Delete type=3 #1364
2026/07/23-21:30:54.817575 7fb3e4fff6c0 Delete type=0 #1366
2026/07/23-21:32:07.232391 7fb394b4f6c0 Level-0 table #1371: started
2026/07/23-21:32:07.232438 7fb394b4f6c0 Level-0 table #1371: 0 bytes OK
2026/07/23-21:32:07.238943 7fb394b4f6c0 Delete type=0 #1369
2026/07/23-21:32:07.253287 7fb394b4f6c0 Manual compaction at level-0 from '!journal!50u8VAjdmovyr0hx' @ 72057594037927935 : 1 .. '!journal.pages!yzw9I0r3hCK7PJnz.sPNCYj2nR3Cp3jHd' @ 0 : 0; will stop at (end)
+1 -1
View File
@@ -1 +1 @@
MANIFEST-001364
MANIFEST-001372
+7 -7
View File
@@ -1,7 +1,7 @@
2026/05/18-07:28:58.501212 7f5a46ffd6c0 Recovering log #1361
2026/05/18-07:28:58.513409 7f5a46ffd6c0 Delete type=3 #1359
2026/05/18-07:28:58.513573 7f5a46ffd6c0 Delete type=0 #1361
2026/05/18-07:30:05.682910 7f5a467fc6c0 Level-0 table #1367: started
2026/05/18-07:30:05.683011 7f5a467fc6c0 Level-0 table #1367: 0 bytes OK
2026/05/18-07:30:05.690419 7f5a467fc6c0 Delete type=0 #1365
2026/05/18-07:30:05.690705 7f5a467fc6c0 Manual compaction at level-0 from '!tables!4l60Lxv8cpsyy2Cg' @ 72057594037927935 : 1 .. '!tables.results!tfaYKDZqu7kgZvRG.yvbwKursaixh2dby' @ 0 : 0; will stop at (end)
2026/07/23-21:32:46.304963 7fb3e4fff6c0 Recovering log #1370
2026/07/23-21:32:46.316282 7fb3e4fff6c0 Delete type=3 #1368
2026/07/23-21:32:46.316381 7fb3e4fff6c0 Delete type=0 #1370
2026/07/23-21:38:47.694700 7fb394b4f6c0 Level-0 table #1375: started
2026/07/23-21:38:47.694730 7fb394b4f6c0 Level-0 table #1375: 0 bytes OK
2026/07/23-21:38:47.731162 7fb394b4f6c0 Delete type=0 #1373
2026/07/23-21:38:47.731496 7fb394b4f6c0 Manual compaction at level-0 from '!tables!4l60Lxv8cpsyy2Cg' @ 72057594037927935 : 1 .. '!tables.results!tfaYKDZqu7kgZvRG.yvbwKursaixh2dby' @ 0 : 0; will stop at (end)
+7 -11
View File
@@ -1,11 +1,7 @@
2026/05/18-07:26:22.549412 7f5a46ffd6c0 Delete type=3 #1
2026/05/18-07:27:45.506132 7f5a467fc6c0 Level-0 table #1362: started
2026/05/18-07:27:45.506206 7f5a467fc6c0 Level-0 table #1362: 0 bytes OK
2026/05/18-07:27:45.513652 7f5a467fc6c0 Delete type=0 #1360
2026/05/18-07:27:45.513973 7f5a467fc6c0 Manual compaction at level-0 from '!tables!4l60Lxv8cpsyy2Cg' @ 72057594037927935 : 1 .. '!tables.results!tfaYKDZqu7kgZvRG.yvbwKursaixh2dby' @ 0 : 0; will stop at '!tables.results!tfaYKDZqu7kgZvRG.yvbwKursaixh2dby' @ 695 : 1
2026/05/18-07:27:45.513989 7f5a467fc6c0 Compacting 1@0 + 0@1 files
2026/05/18-07:27:45.519341 7f5a467fc6c0 Generated table #1363@0: 234 keys, 27934 bytes
2026/05/18-07:27:45.519389 7f5a467fc6c0 Compacted 1@0 + 0@1 files => 27934 bytes
2026/05/18-07:27:45.525840 7f5a467fc6c0 compacted to: files[ 0 1 0 0 0 0 0 ]
2026/05/18-07:27:45.526182 7f5a467fc6c0 Delete type=2 #1226
2026/05/18-07:27:45.526639 7f5a467fc6c0 Manual compaction at level-0 from '!tables.results!tfaYKDZqu7kgZvRG.yvbwKursaixh2dby' @ 695 : 1 .. '!tables.results!tfaYKDZqu7kgZvRG.yvbwKursaixh2dby' @ 0 : 0; will stop at (end)
2026/07/23-21:30:54.705033 7fb397fff6c0 Recovering log #1366
2026/07/23-21:30:54.759053 7fb397fff6c0 Delete type=3 #1364
2026/07/23-21:30:54.759134 7fb397fff6c0 Delete type=0 #1366
2026/07/23-21:32:07.212952 7fb394b4f6c0 Level-0 table #1371: started
2026/07/23-21:32:07.213006 7fb394b4f6c0 Level-0 table #1371: 0 bytes OK
2026/07/23-21:32:07.219722 7fb394b4f6c0 Delete type=0 #1369
2026/07/23-21:32:07.220049 7fb394b4f6c0 Manual compaction at level-0 from '!tables!4l60Lxv8cpsyy2Cg' @ 72057594037927935 : 1 .. '!tables.results!tfaYKDZqu7kgZvRG.yvbwKursaixh2dby' @ 0 : 0; will stop at (end)
+1 -1
View File
@@ -1 +1 @@
MANIFEST-001007
MANIFEST-001015
+7 -7
View File
@@ -1,7 +1,7 @@
2026/05/18-07:28:58.571772 7f5a94bff6c0 Recovering log #1004
2026/05/18-07:28:58.582799 7f5a94bff6c0 Delete type=3 #1002
2026/05/18-07:28:58.582927 7f5a94bff6c0 Delete type=0 #1004
2026/05/18-07:30:05.711307 7f5a467fc6c0 Level-0 table #1010: started
2026/05/18-07:30:05.711365 7f5a467fc6c0 Level-0 table #1010: 0 bytes OK
2026/05/18-07:30:05.718010 7f5a467fc6c0 Delete type=0 #1008
2026/05/18-07:30:05.718285 7f5a467fc6c0 Manual compaction at level-0 from '!journal!056ILNNrLiPq3Gi3' @ 72057594037927935 : 1 .. '!journal.pages!yfZxl4I7XAuUF6r3.apXmOlZRmGT4GreB' @ 0 : 0; will stop at (end)
2026/07/23-21:32:46.368053 7fb397fff6c0 Recovering log #1013
2026/07/23-21:32:46.379073 7fb397fff6c0 Delete type=3 #1011
2026/07/23-21:32:46.379161 7fb397fff6c0 Delete type=0 #1013
2026/07/23-21:38:47.784533 7fb394b4f6c0 Level-0 table #1018: started
2026/07/23-21:38:47.784566 7fb394b4f6c0 Level-0 table #1018: 0 bytes OK
2026/07/23-21:38:47.805371 7fb394b4f6c0 Delete type=0 #1016
2026/07/23-21:38:47.834614 7fb394b4f6c0 Manual compaction at level-0 from '!journal!056ILNNrLiPq3Gi3' @ 72057594037927935 : 1 .. '!journal.pages!yfZxl4I7XAuUF6r3.apXmOlZRmGT4GreB' @ 0 : 0; will stop at (end)
+7 -11
View File
@@ -1,11 +1,7 @@
2026/05/18-07:26:22.688104 7f5a94bff6c0 Delete type=3 #1
2026/05/18-07:27:45.548530 7f5a467fc6c0 Level-0 table #1005: started
2026/05/18-07:27:45.548593 7f5a467fc6c0 Level-0 table #1005: 0 bytes OK
2026/05/18-07:27:45.555108 7f5a467fc6c0 Delete type=0 #1003
2026/05/18-07:27:45.597357 7f5a467fc6c0 Manual compaction at level-0 from '!journal!056ILNNrLiPq3Gi3' @ 72057594037927935 : 1 .. '!journal.pages!yfZxl4I7XAuUF6r3.apXmOlZRmGT4GreB' @ 0 : 0; will stop at '!journal.pages!yfZxl4I7XAuUF6r3.apXmOlZRmGT4GreB' @ 59 : 1
2026/05/18-07:27:45.597377 7f5a467fc6c0 Compacting 1@0 + 0@1 files
2026/05/18-07:27:45.602670 7f5a467fc6c0 Generated table #1006@0: 24 keys, 67879 bytes
2026/05/18-07:27:45.602722 7f5a467fc6c0 Compacted 1@0 + 0@1 files => 67879 bytes
2026/05/18-07:27:45.610609 7f5a467fc6c0 compacted to: files[ 0 1 0 0 0 0 0 ]
2026/05/18-07:27:45.610794 7f5a467fc6c0 Delete type=2 #869
2026/05/18-07:27:45.611142 7f5a467fc6c0 Manual compaction at level-0 from '!journal.pages!yfZxl4I7XAuUF6r3.apXmOlZRmGT4GreB' @ 59 : 1 .. '!journal.pages!yfZxl4I7XAuUF6r3.apXmOlZRmGT4GreB' @ 0 : 0; will stop at (end)
2026/07/23-21:30:54.950889 7fb3e4fff6c0 Recovering log #1009
2026/07/23-21:30:55.020209 7fb3e4fff6c0 Delete type=3 #1007
2026/07/23-21:30:55.020289 7fb3e4fff6c0 Delete type=0 #1009
2026/07/23-21:32:07.245955 7fb394b4f6c0 Level-0 table #1014: started
2026/07/23-21:32:07.245987 7fb394b4f6c0 Level-0 table #1014: 0 bytes OK
2026/07/23-21:32:07.253115 7fb394b4f6c0 Delete type=0 #1012
2026/07/23-21:32:07.253437 7fb394b4f6c0 Manual compaction at level-0 from '!journal!056ILNNrLiPq3Gi3' @ 72057594037927935 : 1 .. '!journal.pages!yfZxl4I7XAuUF6r3.apXmOlZRmGT4GreB' @ 0 : 0; will stop at (end)
+1 -1
View File
@@ -2,4 +2,4 @@ let fearCounter = this.item.effects.filter(i => i.name == this.effect.name).leng
fearCounter += Number(this.actor.has("Peur")?.system.specification.value) || 0
game.wfrp4e.utility.postPeur(fearCounter || 1, this.effect.name)
game.wfrp4e.utility.postFear(fearCounter || 1, this.effect.name)
+1 -1
View File
@@ -14,7 +14,7 @@ let msg = await this.actor.applyBasicDamage(damage, {suppressMsg : true, damageT
msg += ` (Ignore ${metalAP} PA de métal sur ${game.wfrp4e.config.locations[loc]})`
this.script.message(msg)
let Test = await this.actor.setupSkill("Résistance", {fields : {difficulty : "difficult"}, appendTitle : ` - ${this.effect.name}`});
let test = await this.actor.setupSkill("Résistance", {fields : {difficulty : "difficult"}, appendTitle : ` - ${this.effect.name}`});
await test.roll();
if (test.failed)
this.actor.addCondition("stunned");
+3 -3
View File
@@ -1,5 +1,5 @@
const repaired_message = `<p>Réparation terminée <em>${this.item.name}</em>.</p>`;
const Test = 'Métier (Charpentier)';
const test = 'Métier (Charpentier)';
const difficulty = 'challenging';
const target = 40;
@@ -12,8 +12,8 @@ const extendedTestData = {
current: 0,
target: target
},
Test: {
value: Test
test: {
value: test
},
completion: {
value: "remove"
+1 -1
View File
@@ -41,7 +41,7 @@ scriptData[0].script = `
this.script.message(message, {whisper: ChatMessage.getWhisperRecipients("GM")});
`
await effet.update({
await effect.update({
name,
"system.scriptData": scriptData
});
+1 -1
View File
@@ -3,7 +3,7 @@
if (args.equipped) {
this.actor.createEmbeddedDocuments("ActiveEffect", [this.item.effects.contents[1]?.convertToApplied()])
this.script.message(`${this.actor.name} porte le <strong>${this.item.name}</strong>. <br>
Ils gagnent +1 point de Corruption si un Test d'exposition échoue, ce qui devra être appliqué manuellement.<br> S'ils portent le masque pendant plus d'une heure ou bénéficient de l'un de ses effets, ils sont exposés à @Corruption[modérée]{Corruption Modérée}
Ils gagnent +1 point de Corruption si un Test d'exposition échoue, ce qui devra être appliqué manuellement.<br> S'ils portent le masque pendant plus d'une heure ou bénéficient de l'un de ses effets, ils sont exposés à @Corruption[moderate]{Corruption Modérée}
`,
{whisper: ChatMessage.getWhisperRecipients("GM")})
}
+3 -3
View File
@@ -16,7 +16,7 @@ if (actor.itemTypes.skill.find(s => s.name === "Savoir (Océans)")) {
}
}
let Test = await actor.setupSkill('Calme', {
let test = await actor.setupSkill('Calme', {
appendTitle: ` ${this.effect.name}`,
skipTargets: true,
fields: {difficulty: 'easy'},
@@ -24,8 +24,8 @@ let Test = await actor.setupSkill('Calme', {
});
await test.roll();
if (!Test.succeeded) {
Test.result.other.push(`<b>${actor.name}</b> est devenu @Condition[Stunned] par la vue.`);
if (!test.succeeded) {
test.result.other.push(`<b>${actor.name}</b> est devenu @Condition[Stunned] par la vue.`);
test.renderRollCard();
actor.addCondition("stunned");
}
+4 -4
View File
@@ -16,7 +16,7 @@ if (actor.itemTypes.skill.find(s => s.name === "Savoir (Voies fluviales)")) {
}
}
let Test = await actor.setupSkill('Calme', {
let test = await actor.setupSkill('Calme', {
appendTitle: ` ${this.effect.name}`,
skipTargets: true,
fields: {difficulty: 'easy'},
@@ -24,8 +24,8 @@ let Test = await actor.setupSkill('Calme', {
});
await test.roll();
if (!Test.succeeded) {
Test.result.other.push(`<b>${actor.name}</b> est devenu fasciné par la vue et incapable d'effectuer une quelconque action autre que de se déplacer vers la lumière.`);
Test.renderRollCard();
if (!test.succeeded) {
test.result.other.push(`<b>${actor.name}</b> est devenu fasciné par la vue et incapable d'effectuer une quelconque action autre que de se déplacer vers la lumière.`);
test.renderRollCard();
actor.addCondition("unconscious");
}
+3 -3
View File
@@ -1,5 +1,5 @@
const repaired_message = `<p>Réparation terminée <em>${this.item.name}</em>.</p>`;
const Test = 'Métier (Charpentier)';
const test = 'Métier (Charpentier)';
const difficulty = 'difficult';
const target = 20;
@@ -12,8 +12,8 @@ const extendedTestData = {
current: 0,
target: target
},
Test: {
value: Test
test: {
value: test
},
completion: {
value: "remove"
+3 -3
View File
@@ -1,5 +1,5 @@
const repaired_message = `<p>Réparation terminée <em>${this.item.name}</em>.</p>`;
const Test = 'Trade (Carpentry)';
const test = 'Trade (Carpentry)';
const difficulty = 'easy';
const target = 20;
@@ -12,8 +12,8 @@ const extendedTestData = {
current: 0,
target: target
},
Test: {
value: Test
test: {
value: test
},
completion: {
value: "remove"
+3 -3
View File
@@ -1,5 +1,5 @@
const repaired_message = `<p>Réparation terminée <em>${this.item.name}</em>.</p>`;
const Test = 'Voile';
const test = 'Voile';
const difficulty = 'easy';
const target = 10;
@@ -12,8 +12,8 @@ const extendedTestData = {
current: 0,
target: target
},
Test: {
value: Test
test: {
value: test
},
completion: {
value: "remove"
+2 -2
View File
@@ -4,12 +4,12 @@ let name = this.actor.prototypeToken.name
if (game.user.isGM && game.user.targets.size)
{
game.user.targets.forEach(t => {
t.actor.applyPeur(value, name)
t.actor.applyFear(value, name)
})
game.canvas.tokens.setTargets([])
}
else
{
game.wfrp4e.utility.postPeur(value, name)
game.wfrp4e.utility.postFear(value, name)
}
+1 -1
View File
@@ -7,7 +7,7 @@ let options = {
characteristic: 'wp',
}
let Test = await args.actor.setupSkill('Calme', options);
let test = await args.actor.setupSkill('Calme', options);
await test.roll();
if (!test.succeeded) {
+3 -3
View File
@@ -1,5 +1,5 @@
const repaired_message = `<p>Réparation terminée <em>${this.item.name}</em>.</p>`;
const Test = 'Trade (Carpentry)';
const test = 'Trade (Carpentry)';
const difficulty = 'hard';
const target = 30;
@@ -12,8 +12,8 @@ const extendedTestData = {
current: 0,
target: target
},
Test: {
value: Test
test: {
value: test
},
completion: {
value: "remove"
+1 -1
View File
@@ -1,5 +1,5 @@
if (this.actor.Species.toLowerCase() != "skaven") {
this.actor.setupCharacteristic("t", {skipTargets: true, appendTitle : ` - Utilise ${this.effect.name}`, fields: { difficulty: "difficult" } }).then(async Test => {
this.actor.setupCharacteristic("t", {skipTargets: true, appendTitle : ` - Utilise ${this.effect.name}`, fields: { difficulty: "difficult" } }).then(async test => {
await test.roll()
if (test.failed)
{
+1 -1
View File
@@ -4,7 +4,7 @@ if (args.equipped) {
this.actor.createEmbeddedDocuments("ActiveEffect", [this.item.effects.contents[1]?.convertToApplied()])
this.script.message(`${this.actor.name} porte le <strong>${this.item.name}</strong>. <br>
Ils ne peuvent pas lancer de sorts ni prier pour des Bénédictions et des Miracles.<br>
S'ils portent le masque pendant plus d'une heure ou bénéficient de l'un de ses effets, ils sont exposés à @Corruption[modérée]{Corruption modérée}.
S'ils portent le masque pendant plus d'une heure ou bénéficient de l'un de ses effets, ils sont exposés à @Corruption[moderate]{Corruption modérée}.
`,
{whisper: ChatMessage.getWhisperRecipients("GM")})
}
+3 -3
View File
@@ -1,5 +1,5 @@
const repaired_message = `<p>Réparation terminée <em>${this.item.name}</em>.</p>`;
const Test = 'Voile';
const test = 'Voile';
const difficulty = 'average';
const target = 30;
@@ -12,8 +12,8 @@ const extendedTestData = {
current: 0,
target: target
},
Test: {
value: Test
test: {
value: test
},
completion: {
value: "remove"
+3 -3
View File
@@ -1,5 +1,5 @@
const repaired_message = `<p>Réparation terminée <em>${this.item.name}</em>.</p>`;
const Test = 'Métier (Ingénieur)';
const test = 'Métier (Ingénieur)';
const difficulty = 'easy';
const target = 10;
@@ -12,8 +12,8 @@ const extendedTestData = {
current: 0,
target: target
},
Test: {
value: Test
test: {
value: test
},
completion: {
value: "remove"
+3 -3
View File
@@ -1,5 +1,5 @@
const repaired_message = `<p>Réparation terminée <em>${this.item.name}</em>.</p>`;
const Test = 'Métier (Charpentier)';
const test = 'Métier (Charpentier)';
const difficulty = 'difficult';
const target = 40;
@@ -12,8 +12,8 @@ const extendedTestData = {
current: 0,
target: target
},
Test: {
value: Test
test: {
value: test
},
completion: {
value: "remove"
+3 -3
View File
@@ -1,5 +1,5 @@
const repaired_message = `<p>Réparation terminée <em>${this.item.name}</em>.</p>`;
const Test = 'Métier (Charpentier)';
const test = 'Métier (Charpentier)';
const difficulty = 'hard';
const target = 40;
@@ -12,8 +12,8 @@ const extendedTestData = {
current: 0,
target: target
},
Test: {
value: Test
test: {
value: test
},
completion: {
value: "remove"
+3 -3
View File
@@ -1,5 +1,5 @@
const repaired_message = `<p>Réparation terminée <em>${this.item.name}</em>.</p>`;
const Test = 'Maintenance Crew Test';
const test = 'Maintenance Crew Test';
const difficulty = 'hard';
const target = 80;
@@ -12,8 +12,8 @@ const extendedTestData = {
current: 0,
target: target
},
Test: {
value: Test
test: {
value: test
},
completion: {
value: "remove"
+3 -3
View File
@@ -1,5 +1,5 @@
const repaired_message = `<p>Réparation terminée <em>${this.item.name}</em>.</p>`;
const Test = 'Strength';
const test = 'Strength';
const difficulty = 'average';
const target = 10;
@@ -12,8 +12,8 @@ const extendedTestData = {
current: 0,
target: target
},
Test: {
value: Test
test: {
value: test
},
completion: {
value: "remove"
+3 -3
View File
@@ -1,5 +1,5 @@
const repaired_message = `<p>Réparation terminée <em>${this.item.name}</em>.</p>`;
const Test = 'Métier (Charpentier)';
const test = 'Métier (Charpentier)';
const difficulty = 'challenging';
const target = 10;
@@ -12,8 +12,8 @@ const extendedTestData = {
current: 0,
target: target
},
Test: {
value: Test
test: {
value: test
},
completion: {
value: "remove"
+1 -1
View File
@@ -6,7 +6,7 @@ await this.actor.addCondition("stunned", stunned);
if (stunned > this.actor.system.characteristics.t.bonus) {
const crit = `<a data-action="clickTable" class="action-link critical" data-table="crithead" data-modifier="0"><i class="fas fa-list"></i> Critique</a>`;
const Test = await this.actor.setupSkill(game.i18n.localize("NAME.Cool"), {
const test = await this.actor.setupSkill(game.i18n.localize("NAME.Cool"), {
skipTargets: true,
appendTitle: ` - ${this.effect.name}`,
fields: {difficulty: "average"},
+3 -3
View File
@@ -1,5 +1,5 @@
const repaired_message = `<p>Le remplacement de <em>${this.item.name}</em> par un équipement de fortune est terminé.</p>`;
const Test = 'Test de l\'équipe de maintenance';
const test = 'Test de l\'équipe de maintenance';
const difficulty = 'difficile';
const target = 80;
@@ -12,8 +12,8 @@ const extendedTestData = {
current: 0,
target: target
},
Test: {
value: Test
test: {
value: test
},
completion: {
value: "remove"
+1 -1
View File
@@ -19,7 +19,7 @@ scriptData.push({
// /REMINDER
// update Effect's name
await effet.update({
await effect.update({
name,
"system.scriptData": scriptData
});
+3 -3
View File
@@ -1,5 +1,5 @@
const repaired_message = `<p>Réparation terminée <em>${this.item.name}</em>.</p>`;
const Test = 'Trade (Tailor)';
const test = 'Trade (Tailor)';
const difficulty = 'difficult';
const target = 40;
@@ -12,8 +12,8 @@ const extendedTestData = {
current: 0,
target: target
},
Test: {
value: Test
test: {
value: test
},
completion: {
value: "remove"
+3 -3
View File
@@ -1,5 +1,5 @@
const repaired_message = `<p>Réparation terminée <em>${this.item.name}</em>.</p>`;
const Test = 'Trade (Carpentry)';
const test = 'Trade (Carpentry)';
const difficulty = 'easy';
const target = 10;
@@ -12,8 +12,8 @@ const extendedTestData = {
current: 0,
target: target
},
Test: {
value: Test
test: {
value: test
},
completion: {
value: "remove"
+3 -3
View File
@@ -1,5 +1,5 @@
const repaired_message = `<p>Réparation terminée <em>${this.item.name}</em>.</p>`;
const Test = 'Trade (Carpentry)';
const test = 'Trade (Carpentry)';
const difficulty = 'difficult';
const target = 30;
@@ -12,8 +12,8 @@ const extendedTestData = {
current: 0,
target: target
},
Test: {
value: Test
test: {
value: test
},
completion: {
value: "remove"
+1 -1
View File
@@ -1,3 +1,3 @@
// The wearer of the cloak causes Peur 2
// in Wolves, Lions, Goats, and Chimeras.
game.wfrp4e.utility.postPeur(2, this.effect.name)
game.wfrp4e.utility.postFear(2, this.effect.name)
+1 -1
View File
@@ -4,4 +4,4 @@ let data = item.toObject();
data.system.specification.value = 2;
this.script.notification("Ajout de " + data.name);
await this.actor.createEmbeddedDocuments("Item", [data], {fromEffect: this.effect.id});
game.wfrp4e.utility.postPeur(2, this.actor.prototypeToken.name)
game.wfrp4e.utility.postFear(2, this.actor.prototypeToken.name)
+3 -3
View File
@@ -1,5 +1,5 @@
const repaired_message = `<p>Réparation terminée <em>${this.item.name}</em>.</p>`;
const Test = 'Strength';
const test = 'Strength';
const difficulty = 'easy';
const target = 10;
@@ -12,8 +12,8 @@ const extendedTestData = {
current: 0,
target: target
},
Test: {
value: Test
test: {
value: test
},
completion: {
value: "remove"
+4 -4
View File
@@ -24,9 +24,9 @@ const extendedTestData = {
system: {
SL: {
current: 0,
target: target.actor.system.status.Blessures.value
target: target.actor.system.status.wounds.value
},
Test: {
test: {
value: 'Strength'
},
completion: {
@@ -43,7 +43,7 @@ const extendedTest = extendedTests[0];
this.script.message(`<p><b>${speaker.alias}</b> a fini de s'enrouler autour de <b>${target.name}</b>. Il peut maintenant commencer à écraser via le Test Étendu @UUID[${extendedTest.uuid}].</p>`);
let effet = {
let effect = {
name: extendedTest.name,
img: extendedTest.img,
system: {
@@ -61,7 +61,7 @@ let effet = {
const targetId = effect.getFlag("wfrp4e", "target");
const target = canvas.scene.tokens.get(targetId);
this.script.message(\`<p><b>${speaker.alias}</b> a écrasé <b>${target.name}</b>. Le bateau se brise, réduit à un amas d'épaves.</p>\`);
await effet.delete();
await effect.delete();
`,
trigger: "deleteEffect"
}
+3 -3
View File
@@ -1,5 +1,5 @@
const repaired_message = `<p>Réparation terminée <em>${this.item.name}</em>.</p>`;
const Test = 'Trade (Tailor)';
const test = 'Trade (Tailor)';
const difficulty = 'easy';
const target = 20;
@@ -12,8 +12,8 @@ const extendedTestData = {
current: 0,
target: target
},
Test: {
value: Test
test: {
value: test
},
completion: {
value: "remove"
+3 -3
View File
@@ -1,5 +1,5 @@
const repaired_message = `<p>Réparation terminée <em>${this.item.name}</em>.</p>`;
const Test = 'Trade (Carpentry)';
const test = 'Trade (Carpentry)';
const difficulty = 'challenging';
const target = 20;
@@ -12,8 +12,8 @@ const extendedTestData = {
current: 0,
target: target
},
Test: {
value: Test
test: {
value: test
},
completion: {
value: "remove"
+3 -3
View File
@@ -1,5 +1,5 @@
const repaired_message = `<p>Réparation terminée <em>${this.item.name}</em>.</p>`;
const Test = 'Métier (Charpentier)';
const test = 'Métier (Charpentier)';
const difficulty = 'difficult';
const target = 50;
@@ -12,8 +12,8 @@ const extendedTestData = {
current: 0,
target: target
},
Test: {
value: Test
test: {
value: test
},
completion: {
value: "remove"
+1 -1
View File
@@ -1 +1 @@
game.wfrp4e.utility.postPeur(this.item.Advances, this.actor.name)
game.wfrp4e.utility.postFear(this.item.Advances, this.actor.name)
+1 -1
View File
@@ -1 +1 @@
this.actor.applyPeur(Math.min(4, this.effect.sourceTest.result.overcast.usage.other.current))
this.actor.applyFear(Math.min(4, this.effect.sourceTest.result.overcast.usage.other.current))
+3 -3
View File
@@ -1,5 +1,5 @@
const repaired_message = `<p>Réparation terminée <em>${this.item.name}</em>.</p>`;
const Test = 'Trade (Tailor)';
const test = 'Trade (Tailor)';
const difficulty = 'easy';
const target = 30;
@@ -12,8 +12,8 @@ const extendedTestData = {
current: 0,
target: target
},
Test: {
value: Test
test: {
value: test
},
completion: {
value: "remove"
+1 -1
View File
@@ -4,7 +4,7 @@ let damage = 0;
let rolls = new Array(cured).fill("").map(i => `max(0, 1d10 - ${this.actor.system.characteristics.fel.bonus})`)
let Test = new Roll(`${rolls.join(" + ")}`);
let test = new Roll(`${rolls.join(" + ")}`);
await test.roll();
test.toMessage({speaker : {alias : this.actor.name}, flavor : this.effect.name});
this.script.message(await this.actor.applyBasicDamage(test.total, { damageType: game.wfrp4e.config.DAMAGE_TYPE.IGNORE_ALL, suppressMsg : true }))
+1 -1
View File
@@ -1,6 +1,6 @@
if (args.totalWoundLoss > 0)
{
args.actor.setupCharacteristic("t", {skipTargets: true, appendTitle : ` - ${this.effect.name}`, fields: { difficulty: "difficult" } }).then(async Test => {
args.actor.setupCharacteristic("t", {skipTargets: true, appendTitle : ` - ${this.effect.name}`, fields: { difficulty: "difficult" } }).then(async test => {
await test.roll();
if (test.failed)
{
+3 -3
View File
@@ -1,5 +1,5 @@
const repaired_message = `<p>Réparation terminée <em>${this.item.name}</em>.</p>`;
const Test = 'Métier (Charpentier)';
const test = 'Métier (Charpentier)';
const difficulty = 'challenging';
const target = 20;
@@ -12,8 +12,8 @@ const extendedTestData = {
current: 0,
target: target
},
Test: {
value: Test
test: {
value: test
},
completion: {
value: "remove"
+1 -1
View File
@@ -1,4 +1,4 @@
if ([game.i18n.localize("CORRUPTION.Minor"), game.i18n.localize("CORRUPTION.Moderate"), game.i18n.localize("CORRUPTION.Major")].includes(this.item.system.specification.value))
if (["minor", "moderate", "major", "Minor", "Moderate", "Major", game.i18n.localize("CORRUPTION.Minor"), game.i18n.localize("CORRUPTION.Moderate"), game.i18n.localize("CORRUPTION.Major")].includes(this.item.system.specification.value))
{
return
}
+3 -3
View File
@@ -1,5 +1,5 @@
const repaired_message = `<p>Réparation terminée <em>${this.item.name}</em>.</p>`;
const Test = 'Voile';
const test = 'Voile';
const difficulty = 'challenging';
const target = 40;
@@ -12,8 +12,8 @@ const extendedTestData = {
current: 0,
target: target
},
Test: {
value: Test
test: {
value: test
},
completion: {
value: "remove"
+3 -3
View File
@@ -1,5 +1,5 @@
const repaired_message = `<p>Réparation terminée <em>${this.item.name}</em>.</p>`;
const Test = 'Métier (Charpentier)';
const test = 'Métier (Charpentier)';
const difficulty = 'easy';
const target = 40;
@@ -12,8 +12,8 @@ const extendedTestData = {
current: 0,
target: target
},
Test: {
value: Test
test: {
value: test
},
completion: {
value: "remove"