Compare commits

...

3 Commits

Author SHA1 Message Date
f07ef0b01d Fix release 2026-03-01 10:19:24 +01:00
301cc830bc Sync to latest WFRP release 2026-02-26 21:54:28 +01:00
786afeab74 Sync to latest WFRP release 2026-02-26 21:53:55 +01:00
482 changed files with 4223 additions and 96 deletions

View File

@@ -5,9 +5,6 @@
}, },
{ {
"path": "../WFRP4e-FoundryVTT" "path": "../WFRP4e-FoundryVTT"
},
{
"path": "../WarhammerLibrary-FVTT"
} }
], ],
"settings": {} "settings": {}

View File

@@ -1192,6 +1192,10 @@
"CHAT.ExpReceivedNoReason":"Vous avez reçu <b>{amount}</b> points d'expérience", "CHAT.ExpReceivedNoReason":"Vous avez reçu <b>{amount}</b> points d'expérience",
"CHAT.CriticalDeflection":"Déviation de Critique", "CHAT.CriticalDeflection":"Déviation de Critique",
"CHAT.DamageToArmour":"1 Dommages appliqués à {item} ({type})", "CHAT.DamageToArmour":"1 Dommages appliqués à {item} ({type})",
"CHAT.CastSpell":"Incanter {spell}",
"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}",
"Error.SpeciesSkills" : "Impossible d'ajouter des compétences pour les races", "Error.SpeciesSkills" : "Impossible d'ajouter des compétences pour les races",
"Error.SpeciesTalents" : "Impossible d'ajouter des talents pour les races", "Error.SpeciesTalents" : "Impossible d'ajouter des talents pour les races",
@@ -2348,6 +2352,8 @@
"EFFECT.AffectTheSourceOfFearName":"Tests qui affectent {name}", "EFFECT.AffectTheSourceOfFearName":"Tests qui affectent {name}",
"EFFECT.DeletingEffectItems":"Suppression des items d'effets: {items}", "EFFECT.DeletingEffectItems":"Suppression des items d'effets: {items}",
"EFFECT.BlackpowderShock":"Contre-coup de Poudre Noire", "EFFECT.BlackpowderShock":"Contre-coup de Poudre Noire",
"EFFECT.BonusModifier":"Modificateur de Bonus",
"EFFECT.CharacteristicsBonus":"Caractéristiques (Modificateur de Bonus)",
"GRIEVANCE.Warning1":"Attention", "GRIEVANCE.Warning1":"Attention",
"GRIEVANCE.Warning2":": Cette information est envoyé sur l'espace Github, qui est un espace publique, donc le Tag Discord est préférable. Sinon, contactez moi (MooMan) directement. Si vous avez l'impression que le bug concerne le module FR, contactez LeRatierBretonnier (Discord Foundry FR)", "GRIEVANCE.Warning2":": Cette information est envoyé sur l'espace Github, qui est un espace publique, donc le Tag Discord est préférable. Sinon, contactez moi (MooMan) directement. Si vous avez l'impression que le bug concerne le module FR, contactez LeRatierBretonnier (Discord Foundry FR)",

View File

@@ -8,7 +8,7 @@
} }
], ],
"url": "https://www.uberwald.me/gitea/public/foundryvtt-wh4-lang-fr-fr", "url": "https://www.uberwald.me/gitea/public/foundryvtt-wh4-lang-fr-fr",
"version": "9.3.7", "version": "9.4.1",
"esmodules": [ "esmodules": [
"wh4_fr.js", "wh4_fr.js",
"modules/babele-register.js", "modules/babele-register.js",
@@ -120,7 +120,7 @@
} }
], ],
"manifest": "https://www.uberwald.me/gitea/public/foundryvtt-wh4-lang-fr-fr/raw/v10/module.json", "manifest": "https://www.uberwald.me/gitea/public/foundryvtt-wh4-lang-fr-fr/raw/v10/module.json",
"download": "https://www.uberwald.me/gitea/public/foundryvtt-wh4-lang-fr-fr/archive/foundryvtt-wh4-lang-fr-9-3-7.zip", "download": "https://www.uberwald.me/gitea/public/foundryvtt-wh4-lang-fr-fr/archive/foundryvtt-wh4-lang-fr-9-4-1.zip",
"id": "wh4-fr-translation", "id": "wh4-fr-translation",
"compatibility": { "compatibility": {
"minimum": "13", "minimum": "13",

File diff suppressed because one or more lines are too long

View File

@@ -1 +1 @@
MANIFEST-001283 MANIFEST-001295

View File

@@ -1,7 +1,7 @@
2026/01/29-20:23:41.937265 7fac3cbfe6c0 Recovering log #1281 2026/02/26-22:04:24.137615 7f63f7fff6c0 Recovering log #1293
2026/01/29-20:23:41.947854 7fac3cbfe6c0 Delete type=3 #1279 2026/02/26-22:04:24.149067 7f63f7fff6c0 Delete type=3 #1291
2026/01/29-20:23:41.947908 7fac3cbfe6c0 Delete type=0 #1281 2026/02/26-22:04:24.149129 7f63f7fff6c0 Delete type=0 #1293
2026/01/29-20:30:28.237866 7fa9a6fef6c0 Level-0 table #1286: started 2026/02/26-22:04:46.481770 7f61f6fff6c0 Level-0 table #1298: started
2026/01/29-20:30:28.237897 7fa9a6fef6c0 Level-0 table #1286: 0 bytes OK 2026/02/26-22:04:46.481795 7f61f6fff6c0 Level-0 table #1298: 0 bytes OK
2026/01/29-20:30:28.274449 7fa9a6fef6c0 Delete type=0 #1284 2026/02/26-22:04:46.488240 7f61f6fff6c0 Delete type=0 #1296
2026/01/29-20:30:28.305057 7fa9a6fef6c0 Manual compaction at level-0 from '!journal!3IgmiprzLB6Lwenc' @ 72057594037927935 : 1 .. '!journal.pages!suuYN87Al1ZZWtQQ.jhgNnhWhrkOpKs1B' @ 0 : 0; will stop at (end) 2026/02/26-22:04:46.495528 7f61f6fff6c0 Manual compaction at level-0 from '!journal!3IgmiprzLB6Lwenc' @ 72057594037927935 : 1 .. '!journal.pages!suuYN87Al1ZZWtQQ.jhgNnhWhrkOpKs1B' @ 0 : 0; will stop at (end)

View File

@@ -1,7 +1,7 @@
2026/01/29-10:58:42.937989 7fac277fe6c0 Recovering log #1277 2026/02/26-22:02:13.939121 7f640dbff6c0 Recovering log #1289
2026/01/29-10:58:42.947978 7fac277fe6c0 Delete type=3 #1275 2026/02/26-22:02:13.988348 7f640dbff6c0 Delete type=3 #1287
2026/01/29-10:58:42.948038 7fac277fe6c0 Delete type=0 #1277 2026/02/26-22:02:13.988418 7f640dbff6c0 Delete type=0 #1289
2026/01/29-11:43:15.082893 7fa9a6fef6c0 Level-0 table #1282: started 2026/02/26-22:03:13.280219 7f61f6fff6c0 Level-0 table #1294: started
2026/01/29-11:43:15.082936 7fa9a6fef6c0 Level-0 table #1282: 0 bytes OK 2026/02/26-22:03:13.280273 7f61f6fff6c0 Level-0 table #1294: 0 bytes OK
2026/01/29-11:43:15.089469 7fa9a6fef6c0 Delete type=0 #1280 2026/02/26-22:03:13.287523 7f61f6fff6c0 Delete type=0 #1292
2026/01/29-11:43:15.099933 7fa9a6fef6c0 Manual compaction at level-0 from '!journal!3IgmiprzLB6Lwenc' @ 72057594037927935 : 1 .. '!journal.pages!suuYN87Al1ZZWtQQ.jhgNnhWhrkOpKs1B' @ 0 : 0; will stop at (end) 2026/02/26-22:03:13.287733 7f61f6fff6c0 Manual compaction at level-0 from '!journal!3IgmiprzLB6Lwenc' @ 72057594037927935 : 1 .. '!journal.pages!suuYN87Al1ZZWtQQ.jhgNnhWhrkOpKs1B' @ 0 : 0; will stop at (end)

View File

@@ -1 +1 @@
MANIFEST-001285 MANIFEST-001297

View File

@@ -1,7 +1,7 @@
2026/01/29-20:23:41.951251 7fac277fe6c0 Recovering log #1283 2026/02/26-22:04:24.151462 7f640d3fe6c0 Recovering log #1295
2026/01/29-20:23:41.961856 7fac277fe6c0 Delete type=3 #1281 2026/02/26-22:04:24.164087 7f640d3fe6c0 Delete type=3 #1293
2026/01/29-20:23:41.961911 7fac277fe6c0 Delete type=0 #1283 2026/02/26-22:04:24.164148 7f640d3fe6c0 Delete type=0 #1295
2026/01/29-20:30:28.274586 7fa9a6fef6c0 Level-0 table #1288: started 2026/02/26-22:04:46.511516 7f61f6fff6c0 Level-0 table #1300: started
2026/01/29-20:30:28.274614 7fa9a6fef6c0 Level-0 table #1288: 0 bytes OK 2026/02/26-22:04:46.511542 7f61f6fff6c0 Level-0 table #1300: 0 bytes OK
2026/01/29-20:30:28.304924 7fa9a6fef6c0 Delete type=0 #1286 2026/02/26-22:04:46.518083 7f61f6fff6c0 Delete type=0 #1298
2026/01/29-20:30:28.305066 7fa9a6fef6c0 Manual compaction at level-0 from '!folders!3uquYH73ttCdoH0I' @ 72057594037927935 : 1 .. '!items!ylFhk7mGZOnAJTUT' @ 0 : 0; will stop at (end) 2026/02/26-22:04:46.532552 7f61f6fff6c0 Manual compaction at level-0 from '!folders!3uquYH73ttCdoH0I' @ 72057594037927935 : 1 .. '!items!ylFhk7mGZOnAJTUT' @ 0 : 0; will stop at (end)

View File

@@ -1,7 +1,7 @@
2026/01/29-10:58:42.950367 7fac277fe6c0 Recovering log #1279 2026/02/26-22:02:13.990565 7f640d3fe6c0 Recovering log #1291
2026/01/29-10:58:42.959516 7fac277fe6c0 Delete type=3 #1277 2026/02/26-22:02:14.041205 7f640d3fe6c0 Delete type=3 #1289
2026/01/29-10:58:42.959596 7fac277fe6c0 Delete type=0 #1279 2026/02/26-22:02:14.041341 7f640d3fe6c0 Delete type=0 #1291
2026/01/29-11:43:14.910167 7fa9a6fef6c0 Level-0 table #1284: started 2026/02/26-22:03:13.287859 7f61f6fff6c0 Level-0 table #1296: started
2026/01/29-11:43:14.910204 7fa9a6fef6c0 Level-0 table #1284: 0 bytes OK 2026/02/26-22:03:13.287883 7f61f6fff6c0 Level-0 table #1296: 0 bytes OK
2026/01/29-11:43:14.916676 7fa9a6fef6c0 Delete type=0 #1282 2026/02/26-22:03:13.294100 7f61f6fff6c0 Delete type=0 #1294
2026/01/29-11:43:14.924493 7fa9a6fef6c0 Manual compaction at level-0 from '!folders!3uquYH73ttCdoH0I' @ 72057594037927935 : 1 .. '!items!ylFhk7mGZOnAJTUT' @ 0 : 0; will stop at (end) 2026/02/26-22:03:13.315154 7f61f6fff6c0 Manual compaction at level-0 from '!folders!3uquYH73ttCdoH0I' @ 72057594037927935 : 1 .. '!items!ylFhk7mGZOnAJTUT' @ 0 : 0; will stop at (end)

View File

@@ -1 +1 @@
MANIFEST-001283 MANIFEST-001295

View File

@@ -1,7 +1,7 @@
2026/01/29-20:23:41.979254 7fac277fe6c0 Recovering log #1281 2026/02/26-22:04:24.183291 7f640dbff6c0 Recovering log #1293
2026/01/29-20:23:41.990432 7fac277fe6c0 Delete type=3 #1279 2026/02/26-22:04:24.198373 7f640dbff6c0 Delete type=3 #1291
2026/01/29-20:23:41.990499 7fac277fe6c0 Delete type=0 #1281 2026/02/26-22:04:24.198448 7f640dbff6c0 Delete type=0 #1293
2026/01/29-20:30:28.407331 7fa9a6fef6c0 Level-0 table #1286: started 2026/02/26-22:04:46.518228 7f61f6fff6c0 Level-0 table #1298: started
2026/01/29-20:30:28.407362 7fa9a6fef6c0 Level-0 table #1286: 0 bytes OK 2026/02/26-22:04:46.518251 7f61f6fff6c0 Level-0 table #1298: 0 bytes OK
2026/01/29-20:30:28.441323 7fa9a6fef6c0 Delete type=0 #1284 2026/02/26-22:04:46.524767 7f61f6fff6c0 Delete type=0 #1296
2026/01/29-20:30:28.642713 7fa9a6fef6c0 Manual compaction at level-0 from '!journal!cZtNgayIw2QFhC9u' @ 72057594037927935 : 1 .. '!journal.pages!cZtNgayIw2QFhC9u.ts265H1XkisLgdow' @ 0 : 0; will stop at (end) 2026/02/26-22:04:46.532566 7f61f6fff6c0 Manual compaction at level-0 from '!journal!cZtNgayIw2QFhC9u' @ 72057594037927935 : 1 .. '!journal.pages!cZtNgayIw2QFhC9u.ts265H1XkisLgdow' @ 0 : 0; will stop at (end)

View File

@@ -1,7 +1,7 @@
2026/01/29-10:58:42.977033 7fac3cbfe6c0 Recovering log #1277 2026/02/26-22:02:14.115468 7f640cbfd6c0 Recovering log #1289
2026/01/29-10:58:42.986296 7fac3cbfe6c0 Delete type=3 #1275 2026/02/26-22:02:14.169882 7f640cbfd6c0 Delete type=3 #1287
2026/01/29-10:58:42.986342 7fac3cbfe6c0 Delete type=0 #1277 2026/02/26-22:02:14.169955 7f640cbfd6c0 Delete type=0 #1289
2026/01/29-11:43:14.924604 7fa9a6fef6c0 Level-0 table #1282: started 2026/02/26-22:03:13.301545 7f61f6fff6c0 Level-0 table #1294: started
2026/01/29-11:43:14.924660 7fa9a6fef6c0 Level-0 table #1282: 0 bytes OK 2026/02/26-22:03:13.301610 7f61f6fff6c0 Level-0 table #1294: 0 bytes OK
2026/01/29-11:43:14.930959 7fa9a6fef6c0 Delete type=0 #1280 2026/02/26-22:03:13.307921 7f61f6fff6c0 Delete type=0 #1292
2026/01/29-11:43:14.954971 7fa9a6fef6c0 Manual compaction at level-0 from '!journal!cZtNgayIw2QFhC9u' @ 72057594037927935 : 1 .. '!journal.pages!cZtNgayIw2QFhC9u.ts265H1XkisLgdow' @ 0 : 0; will stop at (end) 2026/02/26-22:03:13.315187 7f61f6fff6c0 Manual compaction at level-0 from '!journal!cZtNgayIw2QFhC9u' @ 72057594037927935 : 1 .. '!journal.pages!cZtNgayIw2QFhC9u.ts265H1XkisLgdow' @ 0 : 0; will stop at (end)

View File

@@ -1 +1 @@
MANIFEST-001283 MANIFEST-001295

View File

@@ -1,7 +1,7 @@
2026/01/29-20:23:41.924353 7fac3d3ff6c0 Recovering log #1281 2026/02/26-22:04:24.123515 7f640d3fe6c0 Recovering log #1293
2026/01/29-20:23:41.933825 7fac3d3ff6c0 Delete type=3 #1279 2026/02/26-22:04:24.135202 7f640d3fe6c0 Delete type=3 #1291
2026/01/29-20:23:41.933878 7fac3d3ff6c0 Delete type=0 #1281 2026/02/26-22:04:24.135283 7f640d3fe6c0 Delete type=0 #1293
2026/01/29-20:30:28.174496 7fa9a6fef6c0 Level-0 table #1286: started 2026/02/26-22:04:46.488408 7f61f6fff6c0 Level-0 table #1298: started
2026/01/29-20:30:28.174527 7fa9a6fef6c0 Level-0 table #1286: 0 bytes OK 2026/02/26-22:04:46.488442 7f61f6fff6c0 Level-0 table #1298: 0 bytes OK
2026/01/29-20:30:28.203862 7fa9a6fef6c0 Delete type=0 #1284 2026/02/26-22:04:46.495308 7f61f6fff6c0 Delete type=0 #1296
2026/01/29-20:30:28.305039 7fa9a6fef6c0 Manual compaction at level-0 from '!journal!50u8VAjdmovyr0hx' @ 72057594037927935 : 1 .. '!journal.pages!yzw9I0r3hCK7PJnz.sPNCYj2nR3Cp3jHd' @ 0 : 0; will stop at (end) 2026/02/26-22:04:46.495540 7f61f6fff6c0 Manual compaction at level-0 from '!journal!50u8VAjdmovyr0hx' @ 72057594037927935 : 1 .. '!journal.pages!yzw9I0r3hCK7PJnz.sPNCYj2nR3Cp3jHd' @ 0 : 0; will stop at (end)

View File

@@ -1,7 +1,7 @@
2026/01/29-10:58:42.926104 7fac277fe6c0 Recovering log #1277 2026/02/26-22:02:13.889590 7f63f7fff6c0 Recovering log #1289
2026/01/29-10:58:42.935779 7fac277fe6c0 Delete type=3 #1275 2026/02/26-22:02:13.936962 7f63f7fff6c0 Delete type=3 #1287
2026/01/29-10:58:42.935842 7fac277fe6c0 Delete type=0 #1277 2026/02/26-22:02:13.937017 7f63f7fff6c0 Delete type=0 #1289
2026/01/29-11:43:14.916846 7fa9a6fef6c0 Level-0 table #1282: started 2026/02/26-22:03:13.273521 7f61f6fff6c0 Level-0 table #1294: started
2026/01/29-11:43:14.916889 7fa9a6fef6c0 Level-0 table #1282: 0 bytes OK 2026/02/26-22:03:13.273553 7f61f6fff6c0 Level-0 table #1294: 0 bytes OK
2026/01/29-11:43:14.924373 7fa9a6fef6c0 Delete type=0 #1280 2026/02/26-22:03:13.280005 7f61f6fff6c0 Delete type=0 #1292
2026/01/29-11:43:14.924501 7fa9a6fef6c0 Manual compaction at level-0 from '!journal!50u8VAjdmovyr0hx' @ 72057594037927935 : 1 .. '!journal.pages!yzw9I0r3hCK7PJnz.sPNCYj2nR3Cp3jHd' @ 0 : 0; will stop at (end) 2026/02/26-22:03:13.287724 7f61f6fff6c0 Manual compaction at level-0 from '!journal!50u8VAjdmovyr0hx' @ 72057594037927935 : 1 .. '!journal.pages!yzw9I0r3hCK7PJnz.sPNCYj2nR3Cp3jHd' @ 0 : 0; will stop at (end)

View File

@@ -1 +1 @@
MANIFEST-001283 MANIFEST-001295

View File

@@ -1,7 +1,7 @@
2026/01/29-20:23:41.909492 7fac277fe6c0 Recovering log #1281 2026/02/26-22:04:24.106231 7f640dbff6c0 Recovering log #1293
2026/01/29-20:23:41.920402 7fac277fe6c0 Delete type=3 #1279 2026/02/26-22:04:24.120853 7f640dbff6c0 Delete type=3 #1291
2026/01/29-20:23:41.920469 7fac277fe6c0 Delete type=0 #1281 2026/02/26-22:04:24.120905 7f640dbff6c0 Delete type=0 #1293
2026/01/29-20:30:28.203984 7fa9a6fef6c0 Level-0 table #1286: started 2026/02/26-22:04:46.475371 7f61f6fff6c0 Level-0 table #1298: started
2026/01/29-20:30:28.204007 7fa9a6fef6c0 Level-0 table #1286: 0 bytes OK 2026/02/26-22:04:46.475399 7f61f6fff6c0 Level-0 table #1298: 0 bytes OK
2026/01/29-20:30:28.237718 7fa9a6fef6c0 Delete type=0 #1284 2026/02/26-22:04:46.481643 7f61f6fff6c0 Delete type=0 #1296
2026/01/29-20:30:28.305049 7fa9a6fef6c0 Manual compaction at level-0 from '!tables!4l60Lxv8cpsyy2Cg' @ 72057594037927935 : 1 .. '!tables.results!tfaYKDZqu7kgZvRG.yvbwKursaixh2dby' @ 0 : 0; will stop at (end) 2026/02/26-22:04:46.495513 7f61f6fff6c0 Manual compaction at level-0 from '!tables!4l60Lxv8cpsyy2Cg' @ 72057594037927935 : 1 .. '!tables.results!tfaYKDZqu7kgZvRG.yvbwKursaixh2dby' @ 0 : 0; will stop at (end)

View File

@@ -1,7 +1,7 @@
2026/01/29-10:58:42.911172 7fac3cbfe6c0 Recovering log #1277 2026/02/26-22:02:13.830812 7f640d3fe6c0 Recovering log #1289
2026/01/29-10:58:42.922025 7fac3cbfe6c0 Delete type=3 #1275 2026/02/26-22:02:13.887231 7f640d3fe6c0 Delete type=3 #1287
2026/01/29-10:58:42.922081 7fac3cbfe6c0 Delete type=0 #1277 2026/02/26-22:02:13.887289 7f640d3fe6c0 Delete type=0 #1289
2026/01/29-11:43:14.903068 7fa9a6fef6c0 Level-0 table #1282: started 2026/02/26-22:03:13.266764 7f61f6fff6c0 Level-0 table #1294: started
2026/01/29-11:43:14.903107 7fa9a6fef6c0 Level-0 table #1282: 0 bytes OK 2026/02/26-22:03:13.266813 7f61f6fff6c0 Level-0 table #1294: 0 bytes OK
2026/01/29-11:43:14.910024 7fa9a6fef6c0 Delete type=0 #1280 2026/02/26-22:03:13.273358 7f61f6fff6c0 Delete type=0 #1292
2026/01/29-11:43:14.924484 7fa9a6fef6c0 Manual compaction at level-0 from '!tables!4l60Lxv8cpsyy2Cg' @ 72057594037927935 : 1 .. '!tables.results!tfaYKDZqu7kgZvRG.yvbwKursaixh2dby' @ 0 : 0; will stop at (end) 2026/02/26-22:03:13.287711 7f61f6fff6c0 Manual compaction at level-0 from '!tables!4l60Lxv8cpsyy2Cg' @ 72057594037927935 : 1 .. '!tables.results!tfaYKDZqu7kgZvRG.yvbwKursaixh2dby' @ 0 : 0; will stop at (end)

View File

@@ -1 +1 @@
MANIFEST-000926 MANIFEST-000938

View File

@@ -1,7 +1,7 @@
2026/01/29-20:23:41.966258 7fac3cbfe6c0 Recovering log #924 2026/02/26-22:04:24.166725 7f63f7fff6c0 Recovering log #936
2026/01/29-20:23:41.975859 7fac3cbfe6c0 Delete type=3 #922 2026/02/26-22:04:24.181007 7f63f7fff6c0 Delete type=3 #934
2026/01/29-20:23:41.975913 7fac3cbfe6c0 Delete type=0 #924 2026/02/26-22:04:24.181079 7f63f7fff6c0 Delete type=0 #936
2026/01/29-20:30:28.375267 7fa9a6fef6c0 Level-0 table #929: started 2026/02/26-22:04:46.525121 7f61f6fff6c0 Level-0 table #941: started
2026/01/29-20:30:28.375310 7fa9a6fef6c0 Level-0 table #929: 0 bytes OK 2026/02/26-22:04:46.525166 7f61f6fff6c0 Level-0 table #941: 0 bytes OK
2026/01/29-20:30:28.407196 7fa9a6fef6c0 Delete type=0 #927 2026/02/26-22:04:46.532271 7f61f6fff6c0 Delete type=0 #939
2026/01/29-20:30:28.642703 7fa9a6fef6c0 Manual compaction at level-0 from '!journal!056ILNNrLiPq3Gi3' @ 72057594037927935 : 1 .. '!journal.pages!yfZxl4I7XAuUF6r3.apXmOlZRmGT4GreB' @ 0 : 0; will stop at (end) 2026/02/26-22:04:46.532577 7f61f6fff6c0 Manual compaction at level-0 from '!journal!056ILNNrLiPq3Gi3' @ 72057594037927935 : 1 .. '!journal.pages!yfZxl4I7XAuUF6r3.apXmOlZRmGT4GreB' @ 0 : 0; will stop at (end)

View File

@@ -1,7 +1,7 @@
2026/01/29-10:58:42.964451 7fac3cbfe6c0 Recovering log #920 2026/02/26-22:02:14.050871 7f640dbff6c0 Recovering log #932
2026/01/29-10:58:42.974523 7fac3cbfe6c0 Delete type=3 #918 2026/02/26-22:02:14.109358 7f640dbff6c0 Delete type=3 #930
2026/01/29-10:58:42.974583 7fac3cbfe6c0 Delete type=0 #920 2026/02/26-22:02:14.109436 7f640dbff6c0 Delete type=0 #932
2026/01/29-11:43:14.948296 7fa9a6fef6c0 Level-0 table #925: started 2026/02/26-22:03:13.308043 7f61f6fff6c0 Level-0 table #937: started
2026/01/29-11:43:14.948359 7fa9a6fef6c0 Level-0 table #925: 0 bytes OK 2026/02/26-22:03:13.308070 7f61f6fff6c0 Level-0 table #937: 0 bytes OK
2026/01/29-11:43:14.954859 7fa9a6fef6c0 Delete type=0 #923 2026/02/26-22:03:13.315010 7f61f6fff6c0 Delete type=0 #935
2026/01/29-11:43:14.955000 7fa9a6fef6c0 Manual compaction at level-0 from '!journal!056ILNNrLiPq3Gi3' @ 72057594037927935 : 1 .. '!journal.pages!yfZxl4I7XAuUF6r3.apXmOlZRmGT4GreB' @ 0 : 0; will stop at (end) 2026/02/26-22:03:13.315204 7f61f6fff6c0 Manual compaction at level-0 from '!journal!056ILNNrLiPq3Gi3' @ 72057594037927935 : 1 .. '!journal.pages!yfZxl4I7XAuUF6r3.apXmOlZRmGT4GreB' @ 0 : 0; will stop at (end)

View File

@@ -0,0 +1 @@
return !args.skill?.name.includes(game.i18n.localize("NAME.Row")) && !args.skill?.name.includes(game.i18n.localize("NAME.Sail"));

View File

@@ -0,0 +1,4 @@
if (!this.item.system.properties.qualities.fast)
this.item.system.qualities.value.push({name : 'fast'});
if (!this.item.system.properties.qualities.magical)
this.item.system.qualities.value.push({name : 'magical'});

View File

@@ -0,0 +1,9 @@
if (args.skill?.name != game.i18n.localize("NAME.Gossip"))
{
return true;
}
else
{
args.data.reversal = {allowed : true, if: "success"}; // Kind of a kludge here, the talent Tests has a specific condition, but the description simply says "any gossip test can be reversed" so check it here instead of submission
}

View File

@@ -0,0 +1,7 @@
this.actor.setupSkill(game.i18n.localize("NAME.Cool"), {skipTargets: true, appendTitle : ` - ${this.effect.name}`}).then(async test => {
await test.roll()
if (test.failed)
{
this.actor.addCondition("stunned")
}
})

View File

@@ -0,0 +1,18 @@
const balanced = game.i18n.localize("WFRP4E.YenluiBalanced");
const light = game.i18n.localize("WFRP4E.YenluiLight");
const dark = game.i18n.localize("WFRP4E.YenluiDark");
let newName, newDescription;
if (this.effect.name === game.i18n.localize("WFRP4E.YenluiDark")) {
newName = game.i18n.localize("WFRP4E.YenluiBalanced");
newDescription = game.i18n.localize("WFRP4E.YenluiBalancedDesc");
} else if (this.effect.name === game.i18n.localize("WFRP4E.YenluiBalanced")) {
newName = game.i18n.localize("WFRP4E.YenluiLight");
newDescription = game.i18n.localize("WFRP4E.YenluiLightDesc");
}
if (newName) {
await this.effect.update({name: newName});
await this.item.update({name: newName, "system.description.value": newDescription});
}

View File

@@ -0,0 +1 @@
return !args.skill?.name.includes(game.i18n.localize("NAME.Language"));

View File

@@ -0,0 +1 @@
return args.skill?.name.includes(game.i18n.localize("NAME.Channelling")) || args.skill?.name == `${game.i18n.localize("NAME.Language")} (${game.i18n.localize("SPEC.Magick")})`

View File

@@ -0,0 +1,3 @@
const qualities = foundry.utils.deepClone(args.item.system.qualities.value);
qualities.push({name:"fine", value: 1});
args.item?.update({"system.qualities.value": qualities});

View File

@@ -0,0 +1,19 @@
let test = await this.actor.setupSkill(game.i18n.localize("NAME.Endurance"), {skipTargets: true, appendTitle : " - " + this.effect.name})
await test.roll();
if (!test.succeeded)
{
let item = await fromUuid("Compendium.wfrp4e-core.items.ZhMADOqoo0y8Q9bx")
let data = item.toObject();
if (this.item.system.location.key == "rLeg")
{
data.system.location.value = "Orteil Droit"
data.system.location.key = "rToe";
}
else if (this.item.system.location.key == "lLeg")
{
data.system.location.value = "Orteil Gauche"
data.system.location.key = "lToe";
}
this.actor.createEmbeddedDocuments("Item", [data])
}
this.effect.delete();

View File

@@ -0,0 +1,7 @@
this.actor.setupSkill(game.i18n.localize("NAME.Cool"), {skipTargets: true, appendTitle : ` - ${this.effect.name}`}).then(async test => {
await test.roll();
if (test.failed)
{
this.actor.addCondition("stunned", 3)
}
})

View File

@@ -0,0 +1 @@
return !args.skill?.name?.includes(game.i18n.localize("NAME.Sail"))

View File

@@ -0,0 +1 @@
return args.type != "channelling" && !args.skill?.name.includes(game.i18n.localize("NAME.Channelling"))

View File

@@ -0,0 +1,5 @@
if (args.item.range && args.item.range.bands)
{
args.item.range.bands[game.i18n.localize("Long Range")].modifier = 0
args.item.range.bands[game.i18n.localize("Extreme")].modifier /= 2
}

View File

@@ -0,0 +1,6 @@
if (args.test.result.castOutcome == "success" && args.test.spell.system.lore.value.includes("high"))
{
this.effect.update({name: this.effect.setSpecifier(parseInt(this.effect.specifier - 1))})
this.script.message("La valeur de Protection est maintenant de " + (this.effect.specifier - 1), {flavor: this.effect.sourceItem.name})
}

View File

@@ -0,0 +1 @@
return args.skill?.name == game.i18n.localize("NAME.Bribery") || args.skill?.name.includes(game.i18n.localize("NAME.Stealth"));

View File

@@ -0,0 +1 @@
return args.item?.name != game.i18n.localize("NAME.Navigation")

View File

@@ -0,0 +1,9 @@
if (args.totalWoundLoss > 0)
{
let test = await args.actor.setupSkill(game.i18n.localize("NAME.Endurance"), {skipTargets: true, appendTitle : ` - ${this.effect.name}`})
await test.roll();
if (test.failed && parseInt(args.sourceTest?.result.SL) > 0)
{
args.actor.addCondition("stunned", parseInt(args.sourceTest?.attackerTest.result.SL))
}
}

View File

@@ -0,0 +1,19 @@
let skill = `${game.i18n.localize("NAME.Trade")} (${this.item.parenthesesText})`
let currentCareer = this.actor.system.currentCareer;
let existingSkill = this.actor.itemTypes.skill.find(i => i.name == skill);
if (!currentCareer) return
let inCurrentCareer = currentCareer.system.skills.concat(currentCareer.system.addedSkills).includes(skill);
let craftsmanAdded = this.actor.getFlag("wfrp4e", "craftsmanAdded") || {};
if (existingSkill && inCurrentCareer && !craftsmanAdded[existingSkill.name])
{
existingSkill.system.advances.costModifier = -5;
}
else
{
craftsmanAdded[skill] = true;
currentCareer.system.addedSkills.push(skill);
foundry.utils.setProperty(this.actor, "flags.wfrp4e.craftsmanAdded", craftsmanAdded)
}

View File

@@ -0,0 +1,4 @@
let item = await fromUuid("Compendium.wfrp4e-core.items.9h82z72XGo9tfgQS")
let data = item.toObject();
data.name = data.name += ` (${game.i18n.localize("SPEC.Hearing")})`
this.actor.createEmbeddedDocuments("Item", [data], {fromEffect : this.effect.id})

View File

@@ -0,0 +1 @@
return args.skill?.name.includes(game.i18n.localize("NAME.Lore"));

View File

@@ -0,0 +1,20 @@
if (!["Goblin", "Orc"].includes(this.actor.system.details.species.value)) {
let test = await this.actor.setupSkill(game.i18n.localize("NAME.Endurance"), { appendTitle: ` - ${this.effect.name}` })
await test.roll();
if (test.failed) {
let infection = await fromUuid("Compendium.wfrp4e-core.items.Item.1hQuVFZt9QnnbWzg")
this.actor.createEmbeddedDocuments("Item", [infection])
}
}
// Since wounds change when the effect is deleted, need to wait until after
// the max wounds have been recalculated to apply damage
warhammer.utility.sleep(1000).then(async () => {
let roll = await new Roll("1d10").roll({allowInteractive : false});
roll.toMessage(this.script.getChatData());
this.script.message(await this.actor.applyBasicDamage(roll.total, { damageType: game.wfrp4e.config.DAMAGE_TYPE.IGNORE_ALL, suppressMsg: true }))
})

View File

@@ -0,0 +1,18 @@
let currentCareer = this.actor.system.currentCareer;
if (!currentCareer)
{
return;
}
let talents = [game.i18n.localize("NAME.AA"),
`${game.i18n.localize("NAME.ArcaneMagic")} (${game.i18n.localize("SPEC.Any")})`,
game.i18n.localize("NAME.ChaosMagic") + " " + "(Tzeentch)",
game.i18n.localize("NAME.FastHands"),
game.i18n.localize("NAME.ID"),
game.i18n.localize("NAME.MagicalSense"),
game.i18n.localize("NAME.PettyMagic"),
game.i18n.localize("NAME.SecondSight"),
game.i18n.localize("NAME.WarWizard"),
game.i18n.localize("NAME.Witch")].filter(t => !currentCareer.system.talents.includes(t))
currentCareer.system.talents = currentCareer.system.talents.concat(talents)

View File

@@ -0,0 +1,3 @@
const qualities = foundry.utils.deepClone(args.item.system.qualities.value);
qualities.push({name:"lightweight"});
args.item?.update({"system.qualities.value": qualities});

View File

@@ -0,0 +1,3 @@
return !args.actor?.has(game.i18n.localize("NAME.Swarm")) ||
![game.wfrp4e.config.actorSizeNums.tiny, game.wfrp4e.config.actorSizeNums.ltl]
.includes(args.actor?.sizeNum)

View File

@@ -0,0 +1,14 @@
if (Number(this.actor.system.details.age.value) > 870) {
if (["t", "wp", "fel"].includes(args.characteristic))
args.fields.slBonus -= 3;
if (["ag", "dex", "int"].includes(args.characteristic))
args.fields.slBonus -= 2;
} else if (Number(this.actor.system.details.age.value) > 350) {
if (["t", "wp"].includes(args.characteristic))
args.fields.slBonus -= 2;
if (["fel"].includes(args.characteristic))
args.fields.slBonus -= 1;
} else {
if (["t", "wp"].includes(args.characteristic))
args.fields.slBonus -= 1;
}

View File

@@ -0,0 +1 @@
this.effect.updateSource({name: this.effect.setSpecifier("9")});

View File

@@ -0,0 +1,44 @@
let choice = await ItemDialog.create(ItemDialog.objectToArray(game.wfrp4e.config.locations, this.effect.img), 1, "Choose Location");
if (choice[0])
{
this.effect.updateSource({name : `${this.effect.name} (${choice[0].name})`})
this.effect.updateSource({"flags.wfrp4e.location" : choice[0].id})
}
let location = choice[0].id;
if (["lArm", "rArm"].includes(location))
{
let dropped = this.actor.itemTypes.weapon.filter(i => i.isEquipped & i.system.usesHands.includes(location));
if (dropped.length)
{
this.script.notification(`Dropped ${dropped.map(i => i.name).join(", ")}!`)
for(let weapon of dropped)
{
await weapon.system.toggleEquip();
}
}
}
if (location == "body")
{
await this.actor.addCondition("fatigued");
test = await this.actor.setupSkill(game.i18n.localize("NAME.Endurance"), {fields : {difficulty : "hard"}, skipTargets: true, appendTitle : ` - ${this.effect.name}`})
await test.roll();
if (test.failed)
{
this.actor.addCondition("prone");
}
}
if (location == "head")
{
await this.actor.addCondition("stunned");
test = await this.actor.setupSkill(game.i18n.localize("NAME.Endurance"), {fields : {difficulty : "average"}, skipTargets: true, appendTitle : ` - ${this.effect.name}`})
await test.roll();
if (test.failed)
{
this.actor.addCondition("unconscious");
}
}

View File

@@ -0,0 +1,2 @@
args.abort = true;
this.script.notification("Impossible d'attaquer cette cible !");

View File

@@ -0,0 +1 @@
return args.skill?.name != game.i18n.localize("NAME.CharmAnimal") && !args.skill?.name.includes(game.i18n.localize("NAME.AnimalTraining"));

View File

@@ -0,0 +1 @@
return !["NAME.Evaluate", "NAME.Gamble"].map(i => game.i18n.localize(i)).includes(args.skill?.name)

View File

@@ -0,0 +1,4 @@
if (this.actor.hasCondition("surprised"))
{
this.actor.setupSkill(game.i18n.localize("NAME.Cool"), {fields : {difficulty : "average"}, skipTargets: true, appendTitle : " - " + this.effect.name}).then(test => test.roll())
}

View File

@@ -0,0 +1 @@
return this.effect.name !== game.i18n.localize("WFRP4E.YenluiLight")

View File

@@ -0,0 +1 @@
return args.skill?.name == game.i18n.localize("NAME.ConsumeAlcohol");

View File

@@ -0,0 +1 @@
return args.item?.system.isRanged;

View File

@@ -0,0 +1 @@
return args.skill?.name != game.i18n.localize("NAME.Research") && !args.skill?.name?.includes(game.i18n.localize("NAME.Language"));

View File

@@ -0,0 +1 @@
this.actor.addEffectItems("Compendium.wfrp4e-core.items.Item.EO05HX7jql0g605A", this.effect, {"system.specification.value": this.actor.system.characteristics.ag.value});

View File

@@ -0,0 +1 @@
return args.skill?.name !== game.i18n.localize("NAME.Endurance");

View File

@@ -0,0 +1,10 @@
this.actor.setupSkill(game.i18n.localize("NAME.Endurance"), {skipTargets: true, appendTitle : ` - ${this.effect.name}`, fields: {difficulty : "average"}}).then(async test =>
{
await test.roll()
if (test.failed)
{
let char = Math.ceil(CONFIG.Dice.randomUniform() * 2) == 2 ? "s" : "t";
this.script.message(`<strong>${this.actor.name}</strong> perd 1 point de ${game.wfrp4e.config.characteristics[char]}`)
this.actor.update({[`system.characteristics.${char}.initial`] : this.actor.system.characteristics[char].initial - 1})
}
})

View File

@@ -0,0 +1 @@
return args.skill?.name?.includes(game.i18n.localize("NAME.Language")) || args.type == "cast"

View File

@@ -0,0 +1,7 @@
let test = await this.actor.setupSkill(game.i18n.localize("NAME.Endurance"), {skipTargets: true, appendTitle : ` - ${this.effect.name}`, fields : {difficulty : "average"}, context : {failure: "1 Corruption Point Gained"}})
await test.roll();
if (test.failed && this.actor.type == "character")
{
this.actor.update({"system.status.corruption.value" : parseInt(this.actor.status.corruption.value) + 1})
this.script.message("Gain de 1 point de Corruption", {whisper : ChatMessage.getWhisperRecipients("GM")})
}

View File

@@ -0,0 +1,10 @@
if (args.totalWoundLoss > 0)
{
let test = await args.actor.setupSkill(game.i18n.localize("NAME.Endurance"), {skipTargets: true, appendTitle : " - " + this.effect.name})
await test.roll();
if (test.failed)
{
args.totalWoundLoss += 5;
args.modifiers.other.push({label : this.effect.name, value : 5})
}
}

View File

@@ -0,0 +1 @@
return args.skill?.name != game.i18n.localize("NAME.Research");

View File

@@ -0,0 +1 @@
return args.skill?.name.includes(game.i18n.localize("NAME.Channelling")) || args.type == "channelling" || args.skill?.name == game.i18n.localize("NAME.Charm") || args.skill?.name.includes(`${game.i18n.localize("NAME.Language")} (${game.i18n.localize("SPEC.Magick")})`) || args.type == "cast"

View File

@@ -0,0 +1 @@
await this.effect.update({duration:{rounds: this.actor.system.characteristics.ws.bonus}});

View File

@@ -0,0 +1,9 @@
let test = await this.actor.setupSkill(game.i18n.localize("NAME.Endurance"), {fields: {difficulty : "average"}, appendTitle : " - Wounded"})
await test.roll();
if (test.failed)
{
fromUuid("Compendium.wfrp4e-core.items.kKccDTGzWzSXCBOb").then(disease => {
this.actor.createEmbeddedDocuments("Item", [disease.toObject()])
this.script.scriptNotification("Gain de " + disease.name)
})
}

View File

@@ -0,0 +1 @@
return !args.item?.name.includes(game.i18n.localize("NAME.Stealth"))

View File

@@ -0,0 +1,2 @@
const traits = this.actor.itemTypes.trait.filter(t => ["bestial", "skittish"].includes(s.name.toLowerCase()));
trait.system.disabled = true;

View File

@@ -0,0 +1 @@
return !([game.i18n.localize("NAME.AnimalCare"), game.i18n.localize("NAME.CharmAnimal")].includes(args.item?.name) || args.item?.name.includes(game.i18n.localize("NAME.Ride")) || args.item?.name.includes(game.i18n.localize("NAME.AnimalTraining")));

View File

@@ -0,0 +1,8 @@
let bite = await fromUuid("Compendium.wfrp4e-core.items.pLW9SVX0TVTYPiPv")
let sense = await fromUuid("Compendium.wfrp4e-core.items.9h82z72XGo9tfgQS")
let biteData = bite.toObject();
let senseData = sense.toObject();
biteData.system.specification.value = 6 - this.actor.characteristics.s.bonus;
senseData.name = senseData.name += game.i18n.localize("SPEC.Smell")
this.actor.createEmbeddedDocuments("Item", [biteData, senseData], {fromEffect : this.effect.id})

View File

@@ -0,0 +1,6 @@
let test = await this.actor.setupSkill(game.i18n.localize("NAME.Endurance"), {skipTargets: true, appendTitle : ` - ${this.effect.name}`})
await test.roll();
if (test.failed)
{
this.actor.addCondition("prone");
}

View File

@@ -0,0 +1,11 @@
let roll = Math.ceil(CONFIG.Dice.randomUniform() * 10)
if (args.test.isFumble && roll == 1 && !args.test.result.misfire)
{
args.test.result.misfire = game.i18n.localize("Misfire") + " (Rolled 1)"
args.test.result.misfireDamage = eval(parseInt(args.test.result.roll.toString().split('').pop()) + args.test.item.Damage)
}
else if (args.test.isFumble && roll != 1)
{
args.test.result.other.push("Misfire Roll: " + roll)
}

View File

@@ -0,0 +1,6 @@
const deduct = this.effect.setFlag("wfrp4e", "failed");
if (!deduct) return;
this.actor.system.characteristics.ws.modifier -= 20;
this.actor.system.characteristics.bs.modifier -= 20;

View File

@@ -0,0 +1,6 @@
let test = await this.actor.setupSkill(game.i18n.localize("NAME.Endurance"), {skipTargets: true, appendTitle : ` - ${this.effect.name}`, fields: {difficulty: "average"}});
await test.roll();
if (test.failed)
{
this.actor.addCondition("prone")
}

View File

@@ -0,0 +1 @@
return args.type == "channelling" || args.skill?.name.includes(game.i18n.localize("NAME.Channelling"))

View File

@@ -0,0 +1 @@
return ["NAME.Row", "NAME.Swim"].map(i => game.i18n.localize(i)).includes(args.skill?.name);

View File

@@ -0,0 +1 @@
return !(args.skill?.name == game.i18n.localize("NAME.Bribery") || args.skill?.name.includes(game.i18n.localize("NAME.Stealth")))

View File

@@ -0,0 +1,21 @@
if (args.totalWoundLoss <= 0) return;
const test = await this.actor.setupSkill(
game.i18n.localize("NAME.Endurance"),
{
fields: {difficulty: "difficult"},
skipTargets: true,
appendTitle: `${this.effect.name}`,
},
);
await test.roll();
if (test.failed) {
const item = await fromUuid("Compendium.wfrp4e-core.items.Item.kKccDTGzWzSXCBOb");
const data = item.toObject();
data.system.duration.active = true;
args.actor.createEmbeddedDocuments("Item", [data]);
}

View File

@@ -0,0 +1,4 @@
if (args.item.type == "skill" && args.item.name == `${game.i18n.localize("NAME.Melee")} (${game.i18n.localize("SPEC.Basic")})`)
{
args.item.system.modifier.value += 20;
}

View File

@@ -0,0 +1 @@
return args.skill?.name == game.i18n.localize("NAME.Cool");

View File

@@ -0,0 +1 @@
return args.item?.name == game.i18n.localize("NAME.Endurance");

View File

@@ -0,0 +1 @@
return args.skill?.name == game.i18n.localize("NAME.MeleeBrawling") || args.item?.weaponGroup?.value == "brawling"

View File

@@ -0,0 +1,6 @@
let test = await this.actor.setupSkill(game.i18n.localize("NAME.Endurance"), {skipTargets: true, appendTitle : ` - ${this.effect.name}`, fields : {difficulty : "easy"}})
await test.roll();
if (test.failed)
{
await this.actor.addCondition("fatigued")
}

View File

@@ -0,0 +1 @@
return ([game.i18n.localize("NAME.AnimalCare"), game.i18n.localize("NAME.CharmAnimal")].includes(args.item?.name) || args.item?.name.includes(game.i18n.localize("NAME.Ride")) || args.item?.name.includes(game.i18n.localize("NAME.AnimalTraining")));

View File

@@ -0,0 +1,6 @@
let test = await this.actor.setupSkill(game.i18n.localize("NAME.Endurance"), {fields : {difficulty : "hard"}, appendTitle : ` - ${this.effect.name}`, skipTargets: true});
await test.roll();
if (test.failed)
{
this.actor.addCondition("poisoned");
}

View File

@@ -0,0 +1,16 @@
let strLoss = Math.ceil(CONFIG.Dice.randomUniform() * 10)
let tghLoss = Math.ceil(CONFIG.Dice.randomUniform() * 10)
if (!this.actor.has("Undead") && !this.actor.has("Daemonic"))
{
this.actor.setupSkill(game.i18n.localize("NAME.Cool"), { appendTitle: " - " + this.effect.name, fields: { difficulty: "average" }, context: { failure: `Lost ${strLoss} Strength and ${tghLoss} Toughness` } }).then(async test => {
await test.roll();
if (test.failed) {
this.actor.update({ "system.characteristics.s.initial": this.actor.system.characteristics.s.initial - strLoss, "system.characteristics.t.initial": this.actor.system.characteristics.t.initial - tghLoss })
}
})
}
else {
this.script.notification(`<strong>${this.actor.name}</strong> est immunisé contre ${this.effect.name}`)
}

View File

@@ -0,0 +1,12 @@
let damage = this.effect.sourceTest.result.damage;
if (this.actor.sizeNum >= game.wfrp4e.config.actorSizeNums.lrg)
damage += 7; // goes from +8 to +15;
if (this.actor.has(game.i18n.localize("NAME.Unstable")))
damage *= 2;
this.actor.applyDamage(damage, {
loc: "roll",
createMessage: this.script.getChatData()
});

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