Add all systems effects scripts + translations

This commit is contained in:
LeRatierBretonnien 2024-05-17 01:07:37 +02:00
parent 0b286ac994
commit 7b97578bd7
191 changed files with 379 additions and 381 deletions

View File

@ -1,4 +1,5 @@
/************************************************************************************/ /************************************************************************************/
import loadScripts from "./loadScripts.js";
import statParserFR from "./modules/import-stat-2.js"; import statParserFR from "./modules/import-stat-2.js";
/************************************************************************************/ /************************************************************************************/
@ -117,6 +118,8 @@ Hooks.once('init', () => {
return statParserFR(statString, type); return statParserFR(statString, type);
} }
loadScripts();
/*---------------------------------------------------------------------*/ /*---------------------------------------------------------------------*/
/* DEPRECATED : game.wfrp4e.entities.ItemWfrp4e.prototype.computeSpellDamage = function (formula, isMagicMissile) { /* DEPRECATED : game.wfrp4e.entities.ItemWfrp4e.prototype.computeSpellDamage = function (formula, isMagicMissile) {
try { try {

View File

@ -1684,7 +1684,7 @@
"NAME.TraitWeapon": "Arme", "NAME.TraitWeapon": "Arme",
"NAME.TraitRanged": "A Distance", "NAME.TraitRanged": "A Distance",
"NAME.TraitArmour": "Armure", "NAME.TraitArmour": "Armure",
"NAME.MeleeBrawling": "Corps à coprs (Bagarre)", "NAME.MeleeBrawling": "Corps à corps (Bagarre)",
"NAME.AcuteSense":"Sens aiguisé", "NAME.AcuteSense":"Sens aiguisé",
"NAME.AnimalCare":"Soins des animaux", "NAME.AnimalCare":"Soins des animaux",
"NAME.AnimalTraining":"Dressage", "NAME.AnimalTraining":"Dressage",

6
loadScripts.js Normal file

File diff suppressed because one or more lines are too long

View File

@ -12,7 +12,8 @@
"esmodules": [ "esmodules": [
"babele-register.js", "babele-register.js",
"addon-register.js", "addon-register.js",
"modules/import-stat-2.js" "modules/import-stat-2.js",
"./loadScripts.js"
], ],
"styles": [ "styles": [
"patch-styles.css" "patch-styles.css"

17
package.json Normal file
View File

@ -0,0 +1,17 @@
{
"name": "foundryvtt-wh4-lang-fr-fr",
"version": "1.0.0",
"description": "WH4 Translation",
"main": "babele-register.js",
"type": "module",
"scripts": {
"build": "node scriptPacker.js",
"test": "echo \"Error: no test specified\" && exit 1"
},
"repository": {
"type": "git",
"url": "https://www.uberwald.me/gitea/public/foundryvtt-wh4-lang-fr-fr.git"
},
"author": "LeRatierBretonnien",
"license": "ISC"
}

View File

@ -1 +1 @@
MANIFEST-000673 MANIFEST-000689

View File

@ -1,7 +1,3 @@
2024/05/14-23:48:30.544546 7f505e0006c0 Recovering log #671 2024/05/17-00:32:51.990246 7fe5356006c0 Recovering log #687
2024/05/14-23:48:30.556244 7f505e0006c0 Delete type=3 #669 2024/05/17-00:32:52.000905 7fe5356006c0 Delete type=3 #685
2024/05/14-23:48:30.556333 7f505e0006c0 Delete type=0 #671 2024/05/17-00:32:52.001011 7fe5356006c0 Delete type=0 #687
2024/05/14-23:52:38.338843 7f50574006c0 Level-0 table #676: started
2024/05/14-23:52:38.338863 7f50574006c0 Level-0 table #676: 0 bytes OK
2024/05/14-23:52:38.344995 7f50574006c0 Delete type=0 #674
2024/05/14-23:52:38.345156 7f50574006c0 Manual compaction at level-0 from '!journal!3IgmiprzLB6Lwenc' @ 72057594037927935 : 1 .. '!journal!suuYN87Al1ZZWtQQ' @ 0 : 0; will stop at (end)

View File

@ -1,7 +1,7 @@
2024/05/12-19:57:00.248099 7f003e0006c0 Recovering log #667 2024/05/16-23:31:09.265904 7fe5356006c0 Recovering log #683
2024/05/12-19:57:00.258537 7f003e0006c0 Delete type=3 #665 2024/05/16-23:31:09.275748 7fe5356006c0 Delete type=3 #681
2024/05/12-19:57:00.258601 7f003e0006c0 Delete type=0 #667 2024/05/16-23:31:09.275914 7fe5356006c0 Delete type=0 #683
2024/05/12-20:49:52.183624 7f00374006c0 Level-0 table #672: started 2024/05/16-23:31:47.713351 7fe52e2006c0 Level-0 table #688: started
2024/05/12-20:49:52.183681 7f00374006c0 Level-0 table #672: 0 bytes OK 2024/05/16-23:31:47.713384 7fe52e2006c0 Level-0 table #688: 0 bytes OK
2024/05/12-20:49:52.190384 7f00374006c0 Delete type=0 #670 2024/05/16-23:31:47.720374 7fe52e2006c0 Delete type=0 #686
2024/05/12-20:49:52.197399 7f00374006c0 Manual compaction at level-0 from '!journal!3IgmiprzLB6Lwenc' @ 72057594037927935 : 1 .. '!journal!suuYN87Al1ZZWtQQ' @ 0 : 0; will stop at (end) 2024/05/16-23:31:47.740138 7fe52e2006c0 Manual compaction at level-0 from '!journal!3IgmiprzLB6Lwenc' @ 72057594037927935 : 1 .. '!journal!suuYN87Al1ZZWtQQ' @ 0 : 0; will stop at (end)

View File

@ -1 +1 @@
MANIFEST-000675 MANIFEST-000691

View File

@ -1,7 +1,3 @@
2024/05/14-23:48:30.559289 7f505fe006c0 Recovering log #673 2024/05/17-00:32:52.003117 7fe536a006c0 Recovering log #689
2024/05/14-23:48:30.569004 7f505fe006c0 Delete type=3 #671 2024/05/17-00:32:52.013524 7fe536a006c0 Delete type=3 #687
2024/05/14-23:48:30.569056 7f505fe006c0 Delete type=0 #673 2024/05/17-00:32:52.013746 7fe536a006c0 Delete type=0 #689
2024/05/14-23:52:38.318581 7f50574006c0 Level-0 table #678: started
2024/05/14-23:52:38.318638 7f50574006c0 Level-0 table #678: 0 bytes OK
2024/05/14-23:52:38.325513 7f50574006c0 Delete type=0 #676
2024/05/14-23:52:38.325810 7f50574006c0 Manual compaction at level-0 from '!folders!3uquYH73ttCdoH0I' @ 72057594037927935 : 1 .. '!items!ylFhk7mGZOnAJTUT' @ 0 : 0; will stop at (end)

View File

@ -1,7 +1,7 @@
2024/05/12-19:57:00.261517 7f003f4006c0 Recovering log #669 2024/05/16-23:31:09.278348 7fe536a006c0 Recovering log #685
2024/05/12-19:57:00.271873 7f003f4006c0 Delete type=3 #667 2024/05/16-23:31:09.288721 7fe536a006c0 Delete type=3 #683
2024/05/12-19:57:00.271979 7f003f4006c0 Delete type=0 #669 2024/05/16-23:31:09.288781 7fe536a006c0 Delete type=0 #685
2024/05/12-20:49:52.155346 7f00374006c0 Level-0 table #674: started 2024/05/16-23:31:47.726632 7fe52e2006c0 Level-0 table #690: started
2024/05/12-20:49:52.155386 7f00374006c0 Level-0 table #674: 0 bytes OK 2024/05/16-23:31:47.726653 7fe52e2006c0 Level-0 table #690: 0 bytes OK
2024/05/12-20:49:52.162269 7f00374006c0 Delete type=0 #672 2024/05/16-23:31:47.733317 7fe52e2006c0 Delete type=0 #688
2024/05/12-20:49:52.176604 7f00374006c0 Manual compaction at level-0 from '!folders!3uquYH73ttCdoH0I' @ 72057594037927935 : 1 .. '!items!ylFhk7mGZOnAJTUT' @ 0 : 0; will stop at (end) 2024/05/16-23:31:47.740158 7fe52e2006c0 Manual compaction at level-0 from '!folders!3uquYH73ttCdoH0I' @ 72057594037927935 : 1 .. '!items!ylFhk7mGZOnAJTUT' @ 0 : 0; will stop at (end)

View File

@ -1 +1 @@
MANIFEST-000673 MANIFEST-000689

View File

@ -1,7 +1,3 @@
2024/05/14-23:48:30.588953 7f505fe006c0 Recovering log #671 2024/05/17-00:32:52.030367 7fe536a006c0 Recovering log #687
2024/05/14-23:48:30.598904 7f505fe006c0 Delete type=3 #669 2024/05/17-00:32:52.040956 7fe536a006c0 Delete type=3 #685
2024/05/14-23:48:30.598970 7f505fe006c0 Delete type=0 #671 2024/05/17-00:32:52.041025 7fe536a006c0 Delete type=0 #687
2024/05/14-23:52:38.332297 7f50574006c0 Level-0 table #676: started
2024/05/14-23:52:38.332334 7f50574006c0 Level-0 table #676: 0 bytes OK
2024/05/14-23:52:38.338769 7f50574006c0 Delete type=0 #674
2024/05/14-23:52:38.345148 7f50574006c0 Manual compaction at level-0 from '!journal!cZtNgayIw2QFhC9u' @ 72057594037927935 : 1 .. '!journal!cZtNgayIw2QFhC9u' @ 0 : 0; will stop at (end)

View File

@ -1,7 +1,7 @@
2024/05/12-19:57:00.287738 7f003f4006c0 Recovering log #667 2024/05/16-23:31:09.306312 7fe536a006c0 Recovering log #683
2024/05/12-19:57:00.298489 7f003f4006c0 Delete type=3 #665 2024/05/16-23:31:09.315802 7fe536a006c0 Delete type=3 #681
2024/05/12-19:57:00.298560 7f003f4006c0 Delete type=0 #667 2024/05/16-23:31:09.315852 7fe536a006c0 Delete type=0 #683
2024/05/12-20:49:52.177056 7f00374006c0 Level-0 table #672: started 2024/05/16-23:31:47.740329 7fe52e2006c0 Level-0 table #688: started
2024/05/12-20:49:52.177114 7f00374006c0 Level-0 table #672: 0 bytes OK 2024/05/16-23:31:47.740348 7fe52e2006c0 Level-0 table #688: 0 bytes OK
2024/05/12-20:49:52.183382 7f00374006c0 Delete type=0 #670 2024/05/16-23:31:47.746309 7fe52e2006c0 Delete type=0 #686
2024/05/12-20:49:52.197375 7f00374006c0 Manual compaction at level-0 from '!journal!cZtNgayIw2QFhC9u' @ 72057594037927935 : 1 .. '!journal!cZtNgayIw2QFhC9u' @ 0 : 0; will stop at (end) 2024/05/16-23:31:47.746432 7fe52e2006c0 Manual compaction at level-0 from '!journal!cZtNgayIw2QFhC9u' @ 72057594037927935 : 1 .. '!journal!cZtNgayIw2QFhC9u' @ 0 : 0; will stop at (end)

View File

@ -1 +1 @@
MANIFEST-000673 MANIFEST-000689

View File

@ -1,7 +1,3 @@
2024/05/14-23:48:30.530779 7f505fe006c0 Recovering log #671 2024/05/17-00:32:51.977571 7fe536a006c0 Recovering log #687
2024/05/14-23:48:30.541409 7f505fe006c0 Delete type=3 #669 2024/05/17-00:32:51.987927 7fe536a006c0 Delete type=3 #685
2024/05/14-23:48:30.541472 7f505fe006c0 Delete type=0 #671 2024/05/17-00:32:51.987985 7fe536a006c0 Delete type=0 #687
2024/05/14-23:52:38.311751 7f50574006c0 Level-0 table #676: started
2024/05/14-23:52:38.311798 7f50574006c0 Level-0 table #676: 0 bytes OK
2024/05/14-23:52:38.318370 7f50574006c0 Delete type=0 #674
2024/05/14-23:52:38.325791 7f50574006c0 Manual compaction at level-0 from '!journal!50u8VAjdmovyr0hx' @ 72057594037927935 : 1 .. '!journal!yzw9I0r3hCK7PJnz' @ 0 : 0; will stop at (end)

View File

@ -1,7 +1,7 @@
2024/05/12-19:57:00.235722 7f003f4006c0 Recovering log #667 2024/05/16-23:31:09.251603 7fe536a006c0 Recovering log #683
2024/05/12-19:57:00.245590 7f003f4006c0 Delete type=3 #665 2024/05/16-23:31:09.263101 7fe536a006c0 Delete type=3 #681
2024/05/12-19:57:00.245724 7f003f4006c0 Delete type=0 #667 2024/05/16-23:31:09.263306 7fe536a006c0 Delete type=0 #683
2024/05/12-20:49:52.132991 7f00374006c0 Level-0 table #672: started 2024/05/16-23:31:47.720499 7fe52e2006c0 Level-0 table #688: started
2024/05/12-20:49:52.133062 7f00374006c0 Level-0 table #672: 0 bytes OK 2024/05/16-23:31:47.720525 7fe52e2006c0 Level-0 table #688: 0 bytes OK
2024/05/12-20:49:52.140350 7f00374006c0 Delete type=0 #670 2024/05/16-23:31:47.726531 7fe52e2006c0 Delete type=0 #686
2024/05/12-20:49:52.148293 7f00374006c0 Manual compaction at level-0 from '!journal!50u8VAjdmovyr0hx' @ 72057594037927935 : 1 .. '!journal!yzw9I0r3hCK7PJnz' @ 0 : 0; will stop at (end) 2024/05/16-23:31:47.740148 7fe52e2006c0 Manual compaction at level-0 from '!journal!50u8VAjdmovyr0hx' @ 72057594037927935 : 1 .. '!journal!yzw9I0r3hCK7PJnz' @ 0 : 0; will stop at (end)

View File

@ -1 +1 @@
MANIFEST-000673 MANIFEST-000689

View File

@ -1,7 +1,3 @@
2024/05/14-23:48:30.517212 7f505e0006c0 Recovering log #671 2024/05/17-00:32:51.964446 7fe5356006c0 Recovering log #687
2024/05/14-23:48:30.526840 7f505e0006c0 Delete type=3 #669 2024/05/17-00:32:51.974644 7fe5356006c0 Delete type=3 #685
2024/05/14-23:48:30.526888 7f505e0006c0 Delete type=0 #671 2024/05/17-00:32:51.974702 7fe5356006c0 Delete type=0 #687
2024/05/14-23:52:38.305306 7f50574006c0 Level-0 table #676: started
2024/05/14-23:52:38.305336 7f50574006c0 Level-0 table #676: 0 bytes OK
2024/05/14-23:52:38.311573 7f50574006c0 Delete type=0 #674
2024/05/14-23:52:38.325771 7f50574006c0 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 @@
2024/05/12-19:57:00.221253 7f003e0006c0 Recovering log #667 2024/05/16-23:31:09.239221 7fe5356006c0 Recovering log #683
2024/05/12-19:57:00.232421 7f003e0006c0 Delete type=3 #665 2024/05/16-23:31:09.249489 7fe5356006c0 Delete type=3 #681
2024/05/12-19:57:00.232556 7f003e0006c0 Delete type=0 #667 2024/05/16-23:31:09.249541 7fe5356006c0 Delete type=0 #683
2024/05/12-20:49:52.140566 7f00374006c0 Level-0 table #672: started 2024/05/16-23:31:47.706801 7fe52e2006c0 Level-0 table #688: started
2024/05/12-20:49:52.140628 7f00374006c0 Level-0 table #672: 0 bytes OK 2024/05/16-23:31:47.706831 7fe52e2006c0 Level-0 table #688: 0 bytes OK
2024/05/12-20:49:52.147897 7f00374006c0 Delete type=0 #670 2024/05/16-23:31:47.713069 7fe52e2006c0 Delete type=0 #686
2024/05/12-20:49:52.148331 7f00374006c0 Manual compaction at level-0 from '!tables!4l60Lxv8cpsyy2Cg' @ 72057594037927935 : 1 .. '!tables.results!tfaYKDZqu7kgZvRG.yvbwKursaixh2dby' @ 0 : 0; will stop at (end) 2024/05/16-23:31:47.713228 7fe52e2006c0 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-000316 MANIFEST-000332

View File

@ -1,8 +1,3 @@
2024/05/14-23:48:30.572338 7f505e0006c0 Recovering log #314 2024/05/17-00:32:52.016354 7fe5356006c0 Recovering log #330
2024/05/14-23:48:30.582605 7f505e0006c0 Delete type=3 #312 2024/05/17-00:32:52.027826 7fe5356006c0 Delete type=3 #328
2024/05/14-23:48:30.582656 7f505e0006c0 Delete type=0 #314 2024/05/17-00:32:52.027974 7fe5356006c0 Delete type=0 #330
2024/05/14-23:52:38.325971 7f50574006c0 Level-0 table #319: started
2024/05/14-23:52:38.326024 7f50574006c0 Level-0 table #319: 0 bytes OK
2024/05/14-23:52:38.332122 7f50574006c0 Delete type=0 #317
2024/05/14-23:52:38.345133 7f50574006c0 Manual compaction at level-0 from '!journal!056ILNNrLiPq3Gi3' @ 72057594037927935 : 1 .. '!journal!yfZxl4I7XAuUF6r3' @ 0 : 0; will stop at (end)
2024/05/14-23:52:38.345174 7f50574006c0 Manual compaction at level-1 from '!journal!056ILNNrLiPq3Gi3' @ 72057594037927935 : 1 .. '!journal!yfZxl4I7XAuUF6r3' @ 0 : 0; will stop at (end)

View File

@ -1,8 +1,8 @@
2024/05/12-19:57:00.275118 7f003e0006c0 Recovering log #310 2024/05/16-23:31:09.291953 7fe5356006c0 Recovering log #326
2024/05/12-19:57:00.285010 7f003e0006c0 Delete type=3 #308 2024/05/16-23:31:09.303368 7fe5356006c0 Delete type=3 #324
2024/05/12-19:57:00.285145 7f003e0006c0 Delete type=0 #310 2024/05/16-23:31:09.303512 7fe5356006c0 Delete type=0 #326
2024/05/12-20:49:52.162355 7f00374006c0 Level-0 table #315: started 2024/05/16-23:31:47.733464 7fe52e2006c0 Level-0 table #331: started
2024/05/12-20:49:52.162382 7f00374006c0 Level-0 table #315: 0 bytes OK 2024/05/16-23:31:47.733512 7fe52e2006c0 Level-0 table #331: 0 bytes OK
2024/05/12-20:49:52.168680 7f00374006c0 Delete type=0 #313 2024/05/16-23:31:47.740033 7fe52e2006c0 Delete type=0 #329
2024/05/12-20:49:52.176626 7f00374006c0 Manual compaction at level-0 from '!journal!056ILNNrLiPq3Gi3' @ 72057594037927935 : 1 .. '!journal!yfZxl4I7XAuUF6r3' @ 0 : 0; will stop at (end) 2024/05/16-23:31:47.740167 7fe52e2006c0 Manual compaction at level-0 from '!journal!056ILNNrLiPq3Gi3' @ 72057594037927935 : 1 .. '!journal!yfZxl4I7XAuUF6r3' @ 0 : 0; will stop at (end)
2024/05/12-20:49:52.176865 7f00374006c0 Manual compaction at level-1 from '!journal!056ILNNrLiPq3Gi3' @ 72057594037927935 : 1 .. '!journal!yfZxl4I7XAuUF6r3' @ 0 : 0; will stop at (end) 2024/05/16-23:31:47.740190 7fe52e2006c0 Manual compaction at level-1 from '!journal!056ILNNrLiPq3Gi3' @ 72057594037927935 : 1 .. '!journal!yfZxl4I7XAuUF6r3' @ 0 : 0; will stop at (end)

Binary file not shown.

View File

@ -13,10 +13,7 @@ for(let file of scripts)
let scriptLoader = `export default function() let scriptLoader = `export default function()
{ {
Hooks.on("init", () => mergeObject(game.wfrp4e.config.effectScripts, ${JSON.stringify(scriptObj)});
{
mergeObject(game.wfrp4e.config.effectScripts, ${JSON.stringify(scriptObj)});
});
}` }`

View File

@ -6,7 +6,7 @@ await this.actor.addCondition("poisoned", 3)
await this.actor.modifyWounds(this.actor.system.characteristics.t.bonus) await this.actor.modifyWounds(this.actor.system.characteristics.t.bonus)
// and acquires the Regenerate Creature Trait. // and acquires the Regenerate Creature Trait.
const hasRegenerate = this.actor.has("Regenerate") const hasRegenerate = this.actor.has("Régénération")
if (hasRegenerate === undefined) { if (hasRegenerate === undefined) {
fromUuid("Compendium.wfrp4e-core.items.SfUUdOGjdYpr3KSR").then(trait => { fromUuid("Compendium.wfrp4e-core.items.SfUUdOGjdYpr3KSR").then(trait => {
let traitItem = trait.toObject() let traitItem = trait.toObject()
@ -14,12 +14,12 @@ if (hasRegenerate === undefined) {
}) })
} }
this.script.scriptMessage(`<p><strong>${this.actor.prototypeToken.name}</strong> has this.script.scriptMessage(`<p><strong>${this.actor.prototypeToken.name}</strong> :
<ul> <ul>
<li>gained 3 Poisoned Conditions that cannot be resisted at first</li> <li>Reçoit 3 états Empoisonnés, sans Test de Résistance possible</li>
<li>recovered ${this.actor.system.characteristics.t.bonus} Wounds</li> <li>Récupère ${this.actor.system.characteristics.t.bonus} Blessures</li>
<li>acquired the Regenerate Creature Trait.</li> <li>Acuiert le Trait de Creature Régénération.</li>
</ul> </ul>
Its up to Ranald if their regenerating can outpace their poisoning.</p> C'est à Ranaldde choisir si la régénératin peut guérir de l'empoisonnement.</p>
<p>When all Poisoned Conditions are lost, so too is Regenerate.</p>`, <p>Lorsque tout les états Empoisonnés sont terminés, le Trait Régénération est perdu également.</p>`,
{ whisper: ChatMessage.getWhisperRecipients("GM"), blind: true }) { whisper: ChatMessage.getWhisperRecipients("GM"), blind: true })

View File

@ -1,6 +1,6 @@
if (args.applyAP && args.modifiers.ap.metal) if (args.applyAP && args.modifiers.ap.metal)
{ {
args.modifiers.ap.ignored += args.modifiers.ap.metal args.modifiers.ap.ignored += args.modifiers.ap.metal
args.modifiers.ap.details.push("<strong>" + this.effect.name + "</strong>: Ignore le Métal (" + args.modifiers.ap.metal + ")"); args.modifiers.ap.details.push("<strong>" + this.effect.name + "</strong>: Ignore le métal (" + args.modifiers.ap.metal + ")");
args.modifiers.ap.metal = 0 args.modifiers.ap.metal = 0
} }

View File

@ -1,6 +1,6 @@
let type = this.item.getFlag("wfrp4e", "breath"); let type = this.item.getFlag("wfrp4e", "breath");
if (["fire", "electricity", "poison"].includes(type)) if (["feu", "electricité", "poison"].includes(type))
{ {
args.applyAP = false; args.applyAP = false;
} }

View File

@ -7,22 +7,22 @@ if (!this.item.name.includes("(") || this.item.system.tests.value.includes("Terr
if (name.includes("(")) if (name.includes("("))
{ {
let terrain = name.split("(")[1].split(")")[0] let terrain = name.split("(")[1].split(")")[0]
tests = tests.replace("the Terrain", terrain) tests = tests.replace("Terrain", terrain)
} }
else // If no sense specified, provide dialog choice else // If no sense specified, provide dialog choice
{ {
let choice = await ItemDialog.create(ItemDialog.objectToArray({ let choice = await ItemDialog.create(ItemDialog.objectToArray({
coastal : "Coastal", coastal : "Côtes",
deserts : "Deserts", deserts : "Déserts",
marshes : "Marshes", marshes : "Marches",
rocky : "Rocky", rocky : "Rocailles",
tundra : "Tundra", tundra : "Tundra",
woodlands : "Woodlands" woodlands : "Forêts"
}, this.item.img), 1, "Choose Terrain"); }, this.item.img), 1, "Choisir le Terrain");
if (choice[0]) if (choice[0])
{ {
name = `${name.split("(")[0].trim()} (${choice[0].name})` name = `${name.split("(")[0].trim()} (${choice[0].name})`
tests = tests.replace("the Terrain", choice[0].name + " Terrain") tests = tests.replace("Terrain", "Terrain " + choice[0].name )
} }
} }

View File

@ -1,4 +1,4 @@
let item = await fromUuid("Compendium.wfrp4e-core.items.eWPN3CV2Eddwz8aM") let item = await fromUuid("Compendium.wfrp4e-core.items.eWPN3CV2Eddwz8aM")
let data = item.toObject(); let data = item.toObject();
data.system.location.value = "Back" data.system.location.value = "Dos"
this.actor.createEmbeddedDocuments("Item", [data], {fromEffect: this.effect.id}) this.actor.createEmbeddedDocuments("Item", [data], {fromEffect: this.effect.id})

View File

@ -1,4 +1,4 @@
let skill = `Trade (${this.item.parenthesesText})` let skill = `Métier (${this.item.parenthesesText})`
let currentCareer = this.actor.system.currentCareer; let currentCareer = this.actor.system.currentCareer;
let existingSkill = this.actor.itemTypes.skill.find(i => i.name == skill); let existingSkill = this.actor.itemTypes.skill.find(i => i.name == skill);

View File

@ -1,4 +1,4 @@
let item = await fromUuid("Compendium.wfrp4e-core.items.9h82z72XGo9tfgQS") let item = await fromUuid("Compendium.wfrp4e-core.items.9h82z72XGo9tfgQS")
let data = item.toObject(); let data = item.toObject();
data.name = data.name += " (Hearing)" data.name = data.name += " (Ouïe)"
this.actor.createEmbeddedDocuments("Item", [data], {fromEffect : this.effect.id}) this.actor.createEmbeddedDocuments("Item", [data], {fromEffect : this.effect.id})

View File

@ -4,15 +4,15 @@ if (!currentCareer)
return; return;
} }
let talents = ["Aethyric Attunement", let talents = ["Harmonisation Aethyrique",
"Arcane Magic (Any)", "Magie des Arcanes (Domaine)",
"Chaos Magic (Tzeentch)", "Magie du Chaos (Tzeentch)",
"Fast Hands", "Mains agiles",
"Instinctive Diction", "Diction Instinctive",
"Magical Sense", "Sens de la Magie",
"Petty Magic", "Magie Mineure",
"Second Sight", "Seconde Vue",
"War Wizard", "Mage de guerre",
"Witch!"].filter(t => !currentCareer.system.talents.includes(t)) "Sorcier!"].filter(t => !currentCareer.system.talents.includes(t))
currentCareer.system.talents = currentCareer.system.talents.concat(talents) currentCareer.system.talents = currentCareer.system.talents.concat(talents)

View File

@ -1,6 +1,6 @@
let wounds = this.actor.system.status.wounds let wounds = this.actor.system.status.wounds
if (wounds.value == 0) if (wounds.value == 0)
return this.script.scriptNotification("No effect at 0 Wounds", "error") return this.script.scriptNotification("Aucun effet à 0 Blessures", "error")
this.script.scriptNotification(`Healed ${this.actor.characteristics.t.bonus} Wounds`) this.script.scriptNotification(`Soin de ${this.actor.characteristics.t.bonus} Blessures`)
await this.actor.modifyWounds(this.actor.characteristics.t.bonus) await this.actor.modifyWounds(this.actor.characteristics.t.bonus)

View File

@ -5,5 +5,5 @@ let SL = Math.floor(args.test.target / 10) - Math.floor(args.test.result.roll /
let ones = Number(args.test.result.roll.toString().split("").pop()) let ones = Number(args.test.result.roll.toString().split("").pop())
if (ones > SL) if (ones > SL)
args.test.result.other.push(`<span class="hide-option"><b>${this.effect.name}</b>: ${ones + args.test.successBonus + args.test.slBonus} SL</span>`) args.test.result.other.push(`<span class="hide-option"><b>${this.effect.name}</b>: ${ones + args.test.successBonus + args.test.slBonus} DR</span>`)
} }

View File

@ -1,7 +1,7 @@
let fatigue = this.actor.hasCondition("fatigued") let fatigue = this.actor.hasCondition("fatigued")
if (fatigue) if (fatigue)
{ {
this.script.scriptNotification("Removing Fatigued Condition, disabled effect") this.script.scriptNotification("Suppression de l'état Fatigué, effet désactivé.")
this.effect.update({disabled : true}) this.effect.update({disabled : true})
await this.actor.removeCondition("fatigued") await this.actor.removeCondition("fatigued")
} }

View File

@ -13,7 +13,7 @@ if (["lArm", "rArm"].includes(location))
if (dropped.length) if (dropped.length)
{ {
this.script.scriptNotification(`Dropped ${dropped.map(i => i.name).join(", ")}!`) this.script.scriptNotification(`Lache ${dropped.map(i => i.name).join(", ")}!`)
for(let weapon of dropped) for(let weapon of dropped)
{ {
await weapon.system.toggleEquip(); await weapon.system.toggleEquip();

View File

@ -10,10 +10,13 @@ let characteristics = {
"wp" : 25, "wp" : 25,
"fel" : 10 "fel" : 10
} }
let skills = ["Cool", "Dodge", "Intimidate", "Intuition", "Leadership", "Lore (Warfare)", "Perception"] //let skills = ["Cool", "Dodge", "Intimidate", "Intuition", "Leadership", "Lore (Warfare)", "Perception"]
let skills = ["Calme", "Equive", "Intimidation", "Intuition", "Commandement", "Savoir (Guerre)", "Perception"]
let skillAdvancements = [15, 15, 15, 15, 15, 10, 10] let skillAdvancements = [15, 15, 15, 15, 15, 10, 10]
let talents = ["Combat Aware", "Combat Reflexes", "Feint", "Inspiring", "Resolute", "War Leader"] let talents = ["Vigilance", "Combat Instinctif", "Feinte", "Exaltant", "Déterminé", "Seigneur de guerre"]
let trappings = ["Hand Weapon", "Shield"] // TODO
let trappings = ["Arme simple", "Bouclier"]
let items = []; let items = [];
let updateObj = this.actor.toObject(); let updateObj = this.actor.toObject();
@ -48,7 +51,7 @@ for (let talent of talents)
} }
else else
{ {
ui.notifications.warn(`Could not find ${talent}`, {permanent : true}) ui.notifications.warn(`Impossible de trouver ${talent}`, {permanent : true})
} }
} }
@ -65,7 +68,7 @@ for (let trapping of trappings)
} }
else else
{ {
ui.notifications.warn(`Could not find ${trapping}`, {permanent : true}) ui.notifications.warn(`Impossible de trouver ${trapping}`, {permanent : true})
} }
} }

View File

@ -4,7 +4,7 @@ this.actor.setupSkill(game.i18n.localize("NAME.Endurance"), {skipTargets: true,
if (test.failed) if (test.failed)
{ {
let char = Math.ceil(CONFIG.Dice.randomUniform() * 2) == 2 ? "s" : "t"; let char = Math.ceil(CONFIG.Dice.randomUniform() * 2) == 2 ? "s" : "t";
this.script.scriptMessage(`<strong>${this.actor.name}</strong> lost 1 point of ${game.wfrp4e.config.characteristics[char]}`) this.script.scriptMessage(`<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}) this.actor.update({[`system.characteristics.${char}.initial`] : this.actor.system.characteristics[char].initial - 1})
} }
}) })

View File

@ -3,5 +3,5 @@ await test.roll();
if (test.failed && this.actor.type == "character") if (test.failed && this.actor.type == "character")
{ {
this.actor.update({"system.status.corruption.value" : parseInt(this.actor.status.corruption.value) + 1}) this.actor.update({"system.status.corruption.value" : parseInt(this.actor.status.corruption.value) + 1})
this.script.scriptMessage("Gained a Corruption point", {whisper : ChatMessage.getWhisperRecipients("GM")}) this.script.scriptMessage("Gain d'un Point de Corruption", {whisper : ChatMessage.getWhisperRecipients("GM")})
} }

View File

@ -1,7 +1,7 @@
let sourceActor = this.effect.sourceActor; let sourceActor = this.effect.sourceActor;
let damage = args.totalWoundLoss; let damage = args.totalWoundLoss;
let tb = sourceActor.system.characteristics.t.bonus let tb = sourceActor.system.characteristics.t.bonus
args.abort = `<strong>${this.effect.name}</strong>: Damage applied to ${sourceActor.name}`; args.abort = `<strong>${this.effect.name}</strong>: Dommages appliqués à ${sourceActor.name}`;
let message = await sourceActor.applyBasicDamage(damage - tb, {damageType: game.wfrp4e.config.DAMAGE_TYPE.IGNORE_AP, suppressMsg : true}) let message = await sourceActor.applyBasicDamage(damage - tb, {damageType: game.wfrp4e.config.DAMAGE_TYPE.IGNORE_AP, suppressMsg : true})

View File

@ -1,6 +1,5 @@
if (args.opposedTest.result.differenceSL >= 0 && args.opposedTest.result.differenceSL <= 2 && args.opposedTest.result.winner == "attacker") if (args.opposedTest.result.differenceSL >= 0 && args.opposedTest.result.differenceSL <= 2 && args.opposedTest.result.winner == "attacker")
{ {
this.actor.update({"system.status.fortune.value" : Math.max(0, (this.actor.system.status.fortune?.value - 1) || 0)}) this.actor.update({"system.status.fortune.value" : Math.max(0, (this.actor.system.status.fortune?.value - 1) || 0)})
this.script.scriptMessage(`Fortune point stolen from <strong>${this.actor.name}</strong>`, {blind : true, whisper : ChatMessage.getWhisperRecipients("GM")}) this.script.scriptMessage(`1 Point de Fortune volé à <strong>${this.actor.name}</strong>`, {blind : true, whisper : ChatMessage.getWhisperRecipients("GM")})
} }

View File

@ -1 +1 @@
return args.skill?.name.includes("Channelling") || args.type == "channelling" || args.skill?.name == game.i18n.localize("NAME.Charm") || args.skill?.name.includes("Language (Magick)") || args.type == "cast" return args.skill?.name.includes("Focalisation") || args.type == "channelling" || args.skill?.name == game.i18n.localize("NAME.Charm") || args.skill?.name.includes("Langue (Magick)") || args.type == "cast"

View File

@ -10,7 +10,7 @@ let characteristics = {
"wp" : 5, "wp" : 5,
"fel" : 0 "fel" : 0
} }
let skills = ["Dodge", "Perception"] let skills = ["Esquive", "Perception"]
let skillAdvancements = [10, 10] let skillAdvancements = [10, 10]
let talents = ["Flee!", "Marksman"] let talents = ["Flee!", "Marksman"]
let trappings = ["Hand Weapon"] let trappings = ["Hand Weapon"]

View File

@ -10,10 +10,11 @@ let characteristics = {
"wp" : 15, "wp" : 15,
"fel" : 0 "fel" : 0
} }
let skills = ["Cool", "Dodge", "Intimidate", "Leadership"] //let skills = ["Cool", "Dodge", "Intimidate", "Leadership"]
let skills = ["Calme", "Esquive", "Intimidation", "Commandement"]
let skillAdvancements = [15, 15, 10, 5] let skillAdvancements = [15, 15, 10, 5]
let talents = ["Combat Aware", "Combat Reflexes", "Feint", "Resolute"] let talents = ["Vigilance", "Combat Instinctif", "Feinte", "Déterminé"]
let trappings = ["Mail Coat", "Mail Chausses", "Mail Coif", "Hand Weapon", "Shield"] let trappings = ["Cotte de Mailles", "Chausses de Mailles", "Coiffe de Mailles", "Arme simple", "Bouclier"]
let items = []; let items = [];
let updateObj = this.actor.toObject(); let updateObj = this.actor.toObject();
@ -48,7 +49,7 @@ for (let talent of talents)
} }
else else
{ {
ui.notifications.warn(`Could not find ${talent}`, {permanent : true}) ui.notifications.warn(`Impossible de trouver ${talent}`, {permanent : true})
} }
} }
@ -65,7 +66,7 @@ for (let trapping of trappings)
} }
else else
{ {
ui.notifications.warn(`Could not find ${trapping}`, {permanent : true}) ui.notifications.warn(`Impossible de trouver ${trapping}`, {permanent : true})
} }
} }

View File

@ -1,15 +1,15 @@
let etiquette = (await fromUuid("Compendium.wfrp4e-core.items.Item.sYbgpSnRqSZWgwFP")).toObject(); let etiquette = (await fromUuid("Compendium.wfrp4e-core.items.Item.sYbgpSnRqSZWgwFP")).toObject();
etiquette.name += ` (Followers of Tzeentch)`; etiquette.name += ` (Suivants de Tzeentch)`;
let animosity = (await fromUuid("Compendium.wfrp4e-core.items.Item.0VpT5yubw4UL7j6f")).toObject(); let animosity = (await fromUuid("Compendium.wfrp4e-core.items.Item.0VpT5yubw4UL7j6f")).toObject();
animosity.system.specification.value = "Followers of Nurgle"; animosity.system.specification.value = "Suivants de Nurgle";
let roll = await new Roll("ceil(1d10 / 3)").roll(); let roll = await new Roll("ceil(1d10 / 3)").roll();
roll.toMessage(this.script.getChatData()); roll.toMessage(this.script.getChatData());
let mutations = []; let mutations = [];
let msg = `<p><strong>Mutations Gained</strong></p>` let msg = `<p><strong>Mutations acquises</strong></p>`
for(let i = 0; i < roll.total; i++) for(let i = 0; i < roll.total; i++)
{ {
let item; let item;

View File

@ -1 +1 @@
return !(["Animal Care", "Charm Animal"].includes(args.item?.name) || args.item?.name.includes("Ride") || args.item?.name.includes("Animal Training")) return !(["Soin aux animaux", "Emprise sur les animaux"].includes(args.item?.name) || args.item?.name.includes("Chevaucher") || args.item?.name.includes("Dressage"))

View File

@ -5,5 +5,5 @@ let SL = Math.floor(args.test.target / 10) - Math.floor(args.test.result.roll /
let ones = Number(args.test.result.roll.toString().split("").pop()) let ones = Number(args.test.result.roll.toString().split("").pop())
if (ones > SL) if (ones > SL)
args.test.result.other.push(`<span class="hide-option"><b>${this.effect.name}</b>: ${ones + args.test.successBonus + args.test.slBonus} SL</span>`) args.test.result.other.push(`<span class="hide-option"><b>${this.effect.name}</b>: ${ones + args.test.successBonus + args.test.slBonus} DR</span>`)
} }

View File

@ -1,12 +1,12 @@
// Imbibing this substance grants the user the Painless Creature Trait. // Imbibing this substance grants the user the Painless Creature Trait.
const hasColdBlooded = this.actor.has("Cold Blooded") const hasColdBlooded = this.actor.has("A Sang Froid")
if (hasColdBlooded === undefined) if (hasColdBlooded === undefined)
{ {
let item = await fromUuid("Compendium.wfrp4e-core.items.mCh1KK9jomwFZcLB") let item = await fromUuid("Compendium.wfrp4e-core.items.mCh1KK9jomwFZcLB")
let data = item.toObject() let data = item.toObject()
this.actor.createEmbeddedDocuments("Item", [data], {fromEffect: this.effect.id}) this.actor.createEmbeddedDocuments("Item", [data], {fromEffect: this.effect.id})
this.script.scriptMessage(`<p><strong>${this.actor.prototypeToken.name}</strong> has gained the Cold Blooded Creature Trait and may reverse any failed Willpower based Tests.</p> this.script.scriptMessage(`<p><strong>${this.actor.prototypeToken.name}</strong> reçoit le Trait de Créatuer A Sang Froid et peut inverser n'importe quel test de Force Mentale échoué.</p>
<p>If they gain a Surprised Condition, this Condition is not lost the first time it should be (which is typically at the end of the Round or if they victim is attacked).</p>`, <p>Si il reçoit un état Surpris, cet état n'est pas perdu la première fois (typiquement à la fin du Round ou si il est attaqué).</p>`,
{whisper: ChatMessage.getWhisperRecipients("GM"), blind: true }) {whisper: ChatMessage.getWhisperRecipients("GM"), blind: true })
} }

View File

@ -2,8 +2,8 @@
if (args.equipped) { if (args.equipped) {
this.actor.createEmbeddedDocuments("ActiveEffect", [this.item.effects.contents[1]?.convertToApplied()]) this.actor.createEmbeddedDocuments("ActiveEffect", [this.item.effects.contents[1]?.convertToApplied()])
this.script.scriptMessage(`${this.actor.name} dons the <strong>${this.item.name}</strong>. <br> this.script.scriptMessage(`${this.actor.name} porte le <strong>${this.item.name}</strong>. <br>
They gain +1 Corruption point if an exposure Test is failed, which will need to be manually applied.<br>If they wear the mask for more than an hour or benefit from any of its effects, they are exposed to @Corruption[moderate]{Moderate Corruption} Il gagne +1 Point de Corruption point si un Test de Corruption est échoué, à appliquer manuellement.<br>Si le personnage porte le masque pendant plus d'une heure ou utilise les effets du masque, il est exposé à une @Corruption[moderate]{Corruption Modérée}
`, `,
{whisper: ChatMessage.getWhisperRecipients("GM")}) {whisper: ChatMessage.getWhisperRecipients("GM")})
} }
@ -12,8 +12,8 @@ if (args.equipped) {
else if (!args.equipped) else if (!args.equipped)
{ {
await this.item.effects.contents[0].delete(); await this.item.effects.contents[0].delete();
await this.item.update({name : this.item.name += " (Used)"}) await this.item.update({name : this.item.name += " (Utilisé)"})
this.script.scriptMessage(`<strong>${this.item.name}</strong> on ${this.actor.name} has been taken off and loses its properties. However, the effects last for [[1d10+4]] days, after which they should be manually removed.`, this.script.scriptMessage(`<strong>${this.item.name}</strong> de ${this.actor.name} a été enlevé et a perdu ses propriétés. Cependant, les effets perdurent pendant [[1d10+4]] jours, après quoi ils devront être manuellement supprimés.`,
{whisper: ChatMessage.getWhisperRecipients("GM")} {whisper: ChatMessage.getWhisperRecipients("GM")}
) )

View File

@ -1,2 +1,2 @@
if (args.totalWoundLoss > 0) if (args.totalWoundLoss > 0)
this.script.scriptMessage(`<b>Blade of Nurglitch: ${args.actor.name}</b> must pass an <b>Difficult (-10) Endurance</b> Test or gain a @UUID[Compendium.wfrp4e-core.items.kKccDTGzWzSXCBOb]{Festering Wound}`, {whisper: ChatMessage.getWhisperRecipients("GM") }) this.script.scriptMessage(`<b>Lame de Nurglitch: ${args.actor.name}</b> doit réussir un <b>Test d'Endurance Difficile (-10) </b> ou recevoir une @UUID[Compendium.wfrp4e-core.items.kKccDTGzWzSXCBOb]{Blessure Purulente}`, {whisper: ChatMessage.getWhisperRecipients("GM") })

View File

@ -4,5 +4,5 @@ let biteData = bite.toObject();
let senseData = sense.toObject(); let senseData = sense.toObject();
biteData.system.specification.value = 6 - this.actor.characteristics.s.bonus; biteData.system.specification.value = 6 - this.actor.characteristics.s.bonus;
senseData.name = senseData.name += " (Smell)" senseData.name = senseData.name += " (Odorat)"
this.actor.createEmbeddedDocuments("Item", [biteData, senseData], {fromEffect : this.effect.id}) this.actor.createEmbeddedDocuments("Item", [biteData, senseData], {fromEffect : this.effect.id})

View File

@ -1,4 +1,4 @@
let regenerate = this.actor.items.getName('Regenerate') let regenerate = this.actor.items.getName('Régénération')
if (regenerate) if (regenerate)
{ {

View File

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

View File

@ -1,5 +1,5 @@
let item = await fromUuid("Compendium.wfrp4e-core.items.Q2MCUrG2HppMcvN0") let item = await fromUuid("Compendium.wfrp4e-core.items.Q2MCUrG2HppMcvN0")
item = item.toObject() item = item.toObject()
let species = args.actor.Species || " of your species" let species = args.actor.Species || " de votre espèce"
item.name = `Animosity (all not ${species})` item.name = `Animosité (tous sauf ${species})`
this.actor.createEmbeddedDocuments("Item", [item], {fromEffect : this.effect.id}) this.actor.createEmbeddedDocuments("Item", [item], {fromEffect : this.effect.id})

View File

@ -1,2 +1,2 @@
args.abort = true; args.abort = true;
this.script.scriptNotification(`Cannot use ${game.wfrp4e.config.locations[this.effect.getFlag("wfrp4e", "location")]}!`, "error") this.script.scriptNotification(`Impossible d'utiliser ${game.wfrp4e.config.locations[this.effect.getFlag("wfrp4e", "location")]}!`, "error")

View File

@ -1,6 +1,6 @@
let useWard = await Dialog.wait({ let useWard = await Dialog.wait({
title : this.effect.name, title : this.effect.name,
content : `<p>Use Ward provided by <strong>${this.effect.name}</strong>?`, content : `<p>Utiliser Ward fourni par <strong>${this.effect.name}</strong>?`,
buttons : { buttons : {
yes : { yes : {
label : "Yes", label : "Yes",

View File

@ -1,11 +1,11 @@
if (this.actor.system.status.advantage.value >= 2) if (this.actor.system.status.advantage.value >= 2)
{ {
await this.actor.modifyAdvantage(-2); await this.actor.modifyAdvantage(-2);
this.script.scriptNotification("Advantage Subtracted") this.script.scriptNotification("Avvantage soustrait")
} }
else else
{ {
return this.script.scriptNotification("Not enough Advantage!", "error") return this.script.scriptNotification("Pas assez d'Avantages!", "error")
} }
let test = await this.actor.setupTrait(this.item) let test = await this.actor.setupTrait(this.item)

View File

@ -2,7 +2,7 @@ let item = await fromUuid("Compendium.wfrp4e-core.items.uqGxFOEqeurwkAO3")
item = item.toObject() item = item.toObject()
item.system.specification.value = 10; item.system.specification.value = 10;
item.name += " (Fire)" item.name += " (Feu)"
setProperty(item, "flags.wfrp4e.breath", "fire") setProperty(item, "flags.wfrp4e.breath", "fire")
Item.create(item, {parent : this.actor, fromEffect: this.effect.id}) Item.create(item, {parent : this.actor, fromEffect: this.effect.id})

View File

@ -1,5 +1,5 @@
if (getProperty(args.data, "system.status.fortune.value")) if (getProperty(args.data, "system.status.fortune.value"))
{ {
this.script.scriptNotification("Cannot update Fortune"); this.script.scriptNotification("Impossible de mettre à jour la Fortune");
delete args.data.system.status.wounds.value; delete args.data.system.status.wounds.value;
} }

View File

@ -1,4 +1,4 @@
if (args.item.type == "skill" && args.item.name == "Melee (Basic)") if (args.item.type == "skill" && args.item.name == "Corps à corps (Base)")
{ {
args.item.system.modifier.value += 20; args.item.system.modifier.value += 20;
} }

View File

@ -1,6 +1,6 @@
if (args.test.result.castOutcome == "failure") if (args.test.result.castOutcome == "failure")
{ {
ValueDialog.create("Enter Wounds Lost to gain SL", this.effect.name, "0").then(async value => { ValueDialog.create("Sasir le nombre de Blessures perdues en échange de DR", this.effect.name, "0").then(async value => {
value = Math.clamped(value, 0, 3) value = Math.clamped(value, 0, 3)
if (value == 0) if (value == 0)
{ {
@ -8,11 +8,11 @@ if (args.test.result.castOutcome == "failure")
} }
else if (Number.isNumeric(value)) else if (Number.isNumeric(value))
{ {
this.script.scriptNotification(`Lost ${value} Wounds`) this.script.scriptNotification(`Perte de ${value} Blessures`)
this.actor.modifyWounds(-1 * value) this.actor.modifyWounds(-1 * value)
await this.item.system.toggleEquip(); await this.item.system.toggleEquip();
args.test.addSL(value); args.test.addSL(value);
args.test.preData.other.push(`<strong>${this.effect.name}</strong>: +${value} SL`) args.test.preData.other.push(`<strong>${this.effect.name}</strong>: +${value} DR`)
} }
}) })
} }

View File

@ -3,8 +3,8 @@
if (args.equipped) if (args.equipped)
{ {
this.actor.createEmbeddedDocuments("ActiveEffect", [this.item.effects.contents[1]?.convertToApplied()]) this.actor.createEmbeddedDocuments("ActiveEffect", [this.item.effects.contents[1]?.convertToApplied()])
this.script.scriptMessage(`${this.actor.name} dons the <strong>${this.item.name}</strong>. <br> this.script.scriptMessage(`${this.actor.name} porte le <strong>${this.item.name}</strong>. <br>
If they wear the mask for more than an hour or benefit from any of its effects, they are exposed to @Corruption[moderate]{Moderate Corruption}. Si le personnage porte le masque pendant plus d'une heure ou bénéficie de ses effets, il s'espose à une @Corruption[moderate]{Corruption Modérée}.
`, `,
{whisper: ChatMessage.getWhisperRecipients("GM")}) {whisper: ChatMessage.getWhisperRecipients("GM")})
} }
@ -13,8 +13,8 @@ if (args.equipped)
else if (!args.equipped) else if (!args.equipped)
{ {
await this.item.effects.contents[0].delete(); await this.item.effects.contents[0].delete();
await this.item.update({name : this.item.name += " (Used)"}) await this.item.update({name : this.item.name += " (Utilisé)"})
this.script.scriptMessage(`<strong>${this.item.name}</strong> on ${this.actor.name} has been taken off and loses its properties. However, the effects last for [[1d10+4]] days, after which they should be manually removed.`, this.script.scriptMessage(`<strong>${this.item.name}</strong> porté par ${this.actor.name} a été enlevé et a perdu ses capacités. Cependant, les effets perdurent pendant [[1d10+4]] jours, après quoi ils doivent être retirés manuellement.`,
{whisper: ChatMessage.getWhisperRecipients("GM")} {whisper: ChatMessage.getWhisperRecipients("GM")}
) )

View File

@ -1,8 +1,8 @@
let poisoned = args.actor.hasCondition("poisoned") let poisoned = args.actor.hasCondition("poisoned")
if (poisoned) if (poisoned)
{ {
this.script.scriptNotification(`Removed ${poisoned.conditionValue} Poisoned Conditions`) this.script.scriptNotification(`Suppression de ${poisoned.conditionValue} états Empoisonné`)
poisoned.delete(); poisoned.delete();
} }
else else
this.script.scriptNotification(`No Poisoned Conditions`) this.script.scriptNotification(`Aucun état Empoisonné`)

View File

@ -1 +1 @@
this.script.scriptMessage(`Claimed <strong>${this.effect.name}</strong> Bonus`); this.script.scriptMessage(`Revendiquer le Bonus de <strong>${this.effect.name}</strong> `);

View File

@ -1 +1 @@
return args.skill?.name == "Melee (Brawling)" || args.item?.weaponGroup?.value == "brawling" return args.skill?.name == "Corps à corps (Bagarre)" || args.item?.weaponGroup?.value == "brawling"

View File

@ -1,5 +1,5 @@
// Imbibing this substance grants the user the Painless Creature Trait. // Imbibing this substance grants the user the Painless Creature Trait.
const hasPainless = this.actor.has("Painless"); const hasPainless = this.actor.has("Insensible à la douleur");
if (hasPainless === undefined) if (hasPainless === undefined)
{ {
let item = await fromUuid("Compendium.wfrp4e-core.items.wMwSRDmgiF2IdCJr"); let item = await fromUuid("Compendium.wfrp4e-core.items.wMwSRDmgiF2IdCJr");
@ -7,11 +7,7 @@ if (hasPainless === undefined)
this.actor.createEmbeddedDocuments("Item", [data], {fromEffect: this.effect.id}) this.actor.createEmbeddedDocuments("Item", [data], {fromEffect: this.effect.id})
this.script.scriptMessage( this.script.scriptMessage(
`<p><strong>${this.actor.prototypeToken.name}</strong> has gained the Painless Creature Trait. This `<p><strong>${this.actor.prototypeToken.name}</strong> gagne le Trait de Creature Insensible à la Douleur. Cet effet dure 1 heure, après quoi il disparait et le total des Blessures encaissés par le buveur sont encaissés d'un coup.</p>
effect lasts for one hour, after which it dissipates and the full effect <p>Notez que cela n'empêche pas le buveur de recevoir une Blessure Critique ou de mourrir. Cela permet par contre d'éviter la majorité de leur effets.</p>`,
of all the imbiber's wounds come crashing down at once.</p>
<p>Note that this does not prevent the user from acquiring a Critical
Wound or dying from one. It merely allows them to ignore most
of their effects.</p>`,
{ whisper: ChatMessage.getWhisperRecipients("GM"), blind: true}) { whisper: ChatMessage.getWhisperRecipients("GM"), blind: true})
} }

View File

@ -1 +1 @@
return (["Animal Care", "Charm Animal"].includes(args.item?.name) || args.item?.name.includes("Ride") || args.item?.name.includes("Animal Training")) return (["Soin aux animaux", "Emprise sur les animaux"].includes(args.item?.name) || args.item?.name.includes("Chevaucher") || args.item?.name.includes("Dressage"))

View File

@ -1,9 +1,9 @@
let strLoss = Math.ceil(CONFIG.Dice.randomUniform() * 10) let strLoss = Math.ceil(CONFIG.Dice.randomUniform() * 10)
let tghLoss = Math.ceil(CONFIG.Dice.randomUniform() * 10) let tghLoss = Math.ceil(CONFIG.Dice.randomUniform() * 10)
if (!this.actor.has("Undead") && !this.actor.has("Daemonic")) if (!this.actor.has("Mort-vivant") && !this.actor.has("Démoniaque"))
{ {
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 => { this.actor.setupSkill(game.i18n.localize("NAME.Cool"), { appendTitle: " - " + this.effect.name, fields: { difficulty: "average" }, context: { failure: `Pert de ${strLoss} en Force et ${tghLoss} en Endurance` } }).then(async test => {
await test.roll(); await test.roll();
if (test.failed) { 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 }) 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 })
@ -12,5 +12,5 @@ if (!this.actor.has("Undead") && !this.actor.has("Daemonic"))
} }
else { else {
this.script.scriptNotification(`<strong>${this.actor.name}</strong> is immune to ${this.effect.name}`) this.script.scriptNotification(`<strong>${this.actor.name}</strong> est immunisé à ${this.effect.name}`)
} }

View File

@ -1,17 +1,17 @@
let type = this.item.getFlag("wfrp4e", "breath") let type = this.item.getFlag("wfrp4e", "breath")
let types = { let types = {
none : "None", none : "Aucun",
cold : "Cold", cold : "Froid",
corrosion : "Corrosion", corrosion : "Corrosion",
fire : "Fire", fire : "Feu",
electricity : "Electricity", electricity : "Electricité",
poison : "Poison", poison : "Poison",
smoke : "Smoke", smoke : "Fumée",
various : "Various" various : "Divers"
} }
if (!type) if (!type)
{ {
type = (await ItemDialog.create(ItemDialog.objectToArray(types, this.item.img), 1, "Choose Breath"))[0]?.id; type = (await ItemDialog.create(ItemDialog.objectToArray(types, this.item.img), 1, "Choisir le Souffle"))[0]?.id;
this.item.updateSource({"flags.wfrp4e.breath" : type}) this.item.updateSource({"flags.wfrp4e.breath" : type})
} }

View File

@ -3,5 +3,5 @@ let APIgnored = args.AP.layers.reduce((prev, current) => prev + ((current.weakpo
if (APIgnored) if (APIgnored)
{ {
args.modifiers.ap.ignored += APIgnored args.modifiers.ap.ignored += APIgnored
args.modifiers.ap.details.push(`<strong>${this.effect.name}</strong>: Ignore AP with Weakpoints (${APIgnored})`) args.modifiers.ap.details.push(`<strong>${this.effect.name}</strong>: Ignorer les PA avec des Points Faibles (${APIgnored})`)
} }

View File

@ -3,5 +3,5 @@ if (caster)
{ {
let healed= caster.characteristics.wp.bonus let healed= caster.characteristics.wp.bonus
this.actor.modifyWounds(healed); this.actor.modifyWounds(healed);
this.script.scriptMessage(`<strong>${this.actor.prototypeToken.name}</strong> regains ${healed} Wounds`) this.script.scriptMessage(`<strong>${this.actor.prototypeToken.name}</strong> regagne ${healed} Blessures`)
} }

View File

@ -3,5 +3,5 @@ let weakpointsAP = args.AP.layers.filter(i => !i.ignored && i.weakpoints).reduce
if (weakpointsAP > 0) if (weakpointsAP > 0)
{ {
args.modifiers.ap.ignored += weakpointsAP; args.modifiers.ap.ignored += weakpointsAP;
args.modifiers.ap.details.push(`${this.effect.name} - Ignore Weakpoints (${weakpointsAP})`); args.modifiers.ap.details.push(`${this.effect.name} - Ignore les Points Faibles (${weakpointsAP})`);
} }

View File

@ -9,7 +9,7 @@ let filters = [
} }
] ]
let petty = await game.wfrp4e.apps.ItemDialog.createFromFilters(filters, 6, "Choose 6 Petty Spells") let petty = await game.wfrp4e.apps.ItemDialog.createFromFilters(filters, 6, "Choisir 6 sorts de Magie Mineure")
filters = [ filters = [
@ -23,7 +23,7 @@ filters = [
} }
] ]
let arcane = await game.wfrp4e.apps.ItemDialog.createFromFilters(filters, 9, "Choose 9 Arcane Spells") let arcane = await game.wfrp4e.apps.ItemDialog.createFromFilters(filters, 9, "Choisir 9 Sorts d'Arcane")
let items = petty.concat(arcane).map(i => i.toObject()) let items = petty.concat(arcane).map(i => i.toObject())

View File

@ -1,6 +1,6 @@
fromUuid("Compendium.wfrp4e-core.items.5QcrpLQWWrsbKR79").then(item => { fromUuid("Compendium.wfrp4e-core.items.5QcrpLQWWrsbKR79").then(item => {
let data = item.toObject(); let data = item.toObject();
data.system.tests.value = data.system.tests.value.replace("coins", "metal objects"); data.system.tests.value = data.system.tests.value.replace("coins", "metal objects");
data.system.description.value += "<p>This Talent also extends to any metal object because of <strong>Metallic Affinity</strong></p>" data.system.description.value += "<p>Ce Talent s'applique également à tout objet métallique à cause de <strong>l'Affinité Metallique</strong></p>"
this.actor.createEmbeddedDocuments("Item", [data], {fromEffect : this.effect.id}) this.actor.createEmbeddedDocuments("Item", [data], {fromEffect : this.effect.id})
}) })

View File

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

View File

@ -1,4 +1,4 @@
let item = await fromUuid("Compendium.wfrp4e-core.items.AtpAudHA4ybXVlWM") let item = await fromUuid("Compendium.wfrp4e-core.items.AtpAudHA4ybXVlWM")
let data = item.toObject(); let data = item.toObject();
data.name += ` (When Charging)` data.name += ` (Si Charge)`
this.actor.createEmbeddedDocuments("Item", [data], {fromEffect : this.effect.id}) this.actor.createEmbeddedDocuments("Item", [data], {fromEffect : this.effect.id})

View File

@ -3,5 +3,5 @@ let sourceItem = this.effect.sourceItem;
if (sourceItem) if (sourceItem)
{ {
this.actor.applyEffect({effectUuids : [sourceItem.effects.contents[2].uuid]}) this.actor.applyEffect({effectUuids : [sourceItem.effects.contents[2].uuid]})
this.script.scriptNotification("Applied after effects"); this.script.scriptNotification("Applique après les effets");
} }

View File

@ -1,6 +1,6 @@
if (this.item.getFlag("wfrp4e", "failedCool")) if (this.item.getFlag("wfrp4e", "failedCool"))
{ {
this.item.name += " (No AP)" this.item.name += " (Aucun PA)"
this.item.system.AP = { this.item.system.AP = {
"head": 0, "head": 0,
"lArm": 0, "lArm": 0,

View File

@ -2,11 +2,11 @@ let test = await this.actor.setupSkill(game.i18n.localize("NAME.Endurance"), {sk
await test.roll(); await test.roll();
if (test.failed) if (test.failed)
{ {
this.script.scriptNotification("Gained a <strong>Festering Wound</strong>") this.script.scriptNotification("Subi une <strong>Blessure Purulente</strong>")
let item = await fromUuid("Compendium.wfrp4e-core.items.kKccDTGzWzSXCBOb") let item = await fromUuid("Compendium.wfrp4e-core.items.kKccDTGzWzSXCBOb")
this.actor.createEmbeddedDocuments("Item", [item.toObject()]) this.actor.createEmbeddedDocuments("Item", [item.toObject()])
} }
else else
{ {
this.script.scriptNotification("Avoided a <strong>Festering Wound</strong>") this.script.scriptNotification("Evite une <strong>Blessure Purulente</strong>")
} }

View File

@ -1,6 +1,6 @@
if (args.test.result.SL < 0) if (args.test.result.SL < 0)
{ {
this.script.scriptMessage(`Gained ${Math.abs(args.test.result.SL)} Corruption points`, {whisper : ChatMessage.getWhisperRecipients("GM")}) this.script.scriptMessage(`Reçoit ${Math.abs(args.test.result.SL)} Points de Corruption`, {whisper : ChatMessage.getWhisperRecipients("GM")})
if (args.test.failed && this.actor.type == "character") if (args.test.failed && this.actor.type == "character")
{ {
this.actor.update({"system.status.corruption.value" : parseInt(this.actor.status.corruption.value) + Math.abs(args.test.result.SL)}) this.actor.update({"system.status.corruption.value" : parseInt(this.actor.status.corruption.value) + Math.abs(args.test.result.SL)})

View File

@ -1,7 +1,7 @@
let choice1 = [ let choice1 = [
{ {
type : "skill", type : "skill",
name : "Melee (Basic)", name : "Corps à corps (Base)",
diff : { diff : {
system : { system : {
advances : { advances : {
@ -14,7 +14,7 @@ let choice1 = [
let choice2 = [ let choice2 = [
{ {
type : "skill", type : "skill",
name : "Melee (Polearm)", name : "Corps à corps (Armes d'hast)",
diff : { diff : {
system : { system : {
advances : { advances : {
@ -26,14 +26,14 @@ let choice2 = [
] ]
let choice = await Dialog.wait({ let choice = await Dialog.wait({
title : "Choice", title : "Choix",
content : content :
`<p> `<p>
Select your choice Choisissez une option
</p> </p>
<ol> <ol>
<li>Melee (Basic)</li> <li>Corps à corps (Base)</li>
<li>Melee (Polearm)</li> <li>Corps à corps (Armes d'hast)</li>
</ol> </ol>
`, `,
buttons : { buttons : {
@ -44,7 +44,7 @@ let choice = await Dialog.wait({
} }
}, },
2 : { 2 : {
label : "Polearm", label : "Armes d'hast",
callback : () => { callback : () => {
return choice2; return choice2;
} }
@ -76,7 +76,7 @@ for (let c of choice)
items.push(mergeObject(item, (c.diff || {}))) items.push(mergeObject(item, (c.diff || {})))
} }
else else
ui.notifications.warn(`Could not find ${talent}`, {permanent : true}) ui.notifications.warn(`Impossible de trouver ${talent}`, {permanent : true})
} }
} }

View File

@ -1,5 +1,5 @@
let roll = await new Roll("1d10").roll() let roll = await new Roll("1d10").roll()
roll.toMessage(this.script.getChatData({flavor : `${this.effect.name} (Duration)`})); roll.toMessage(this.script.getChatData({flavor : `${this.effect.name} (Durée)`}));
this.effect.updateSource({"duration.rounds" : roll.total}) this.effect.updateSource({"duration.rounds" : roll.total})

View File

@ -1 +1 @@
return !args.skill?.name.includes("Channelling") && args.type != "channelling" return !args.skill?.name.includes("Focalisation") && args.type != "channelling"

View File

@ -1,7 +1,7 @@
let halve; let halve;
if (args.opposedTest.attackerTest.item?.type != "spell") if (args.opposedTest.attackerTest.item?.type != "spell")
{ {
halve = await Dialog.confirm({title : this.effect.name, content : "Halve Damage? (Halves all damage other than fire, cold, and magic)"}) halve = await Dialog.confirm({title : this.effect.name, content : "Diviser les dommages? (Divise par 2 tout les dommages autre que ceux causés par le feu, le froid et magiques)"})
} }
else else
{ {
@ -11,5 +11,5 @@ else
if (halve) if (halve)
{ {
args.totalWoundLoss /= 2; args.totalWoundLoss /= 2;
args.modifiers.other.push({label : this.effect.name, details : "Halved", value : "× 0.5"}) args.modifiers.other.push({label : this.effect.name, details : "Divisé par 2", value : "× 0.5"})
} }

View File

@ -1 +1 @@
return args.type != "cast" || !["death", "necromancy", "life", "light", "heavens"].includes(args.spell?.system.lore.value) return args.type != "cast" || !["mort", "nécromancie", "vie", "lumière", "cieux"].includes(args.spell?.system.lore.value)

View File

@ -1,4 +1,4 @@
if (args.opposedTest.result.differenceSL >= 0 && args.opposedTest.result.differenceSL <= 2 && args.opposedTest.result.winner == "attacker") if (args.opposedTest.result.differenceSL >= 0 && args.opposedTest.result.differenceSL <= 2 && args.opposedTest.result.winner == "attacker")
{ {
this.script.scriptMessage(`Emits a cloud of foul-smelling blackpowder. Enable the <strong>Fellowship Penalty</strong> Active Effect on @UUID[${this.actor.uuid}].`, {blind : true, whisper : ChatMessage.getWhisperRecipients("GM")}) this.script.scriptMessage(`Émet un nuage de poudre noire nauséabonde. Active l'effet <strong>Fellowship Penalty</strong> sur @UUID[${this.actor.uuid}].`, {blind : true, whisper : ChatMessage.getWhisperRecipients("GM")})
} }

View File

@ -1 +1 @@
return args.skill?.name == "Ranged (Blackpowder)" return args.skill?.name == "Projectiles (Poudre noire)"

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