Compare commits

..

14 Commits

1696 changed files with 8798 additions and 12188 deletions

View File

@@ -0,0 +1,92 @@
#!/usr/bin/env node
const fs = require('fs');
const path = require('path');
// Patterns pour détecter les variables JavaScript nommées "Blessures"
const patterns = [
// Déclarations de variables
/\b(let|const|var)\s+Blessures\b/g,
// Paramètres de fonction
/function\s+\w*\s*\([^)]*\bBlessures\b[^)]*\)/g,
// Arrow functions avec paramètres
/\(\s*[^)]*\bBlessures\b[^)]*\)\s*=>/g,
// Arrow function avec un seul paramètre sans parenthèses
/\bBlessures\s*=>/g,
// Destructuration d'objets
/\{\s*[^}]*\bBlessures\b[^}]*\}\s*=/g,
// Destructuration de tableaux
/\[\s*[^\]]*\bBlessures\b[^\]]*\]\s*=/g,
// Catch clause
/catch\s*\(\s*Blessures\s*\)/g,
// For...of/in loops
/for\s*\(\s*(let|const|var)?\s*Blessures\s+(of|in)\b/g,
];
function findBlessuresInFile(filePath) {
const content = fs.readFileSync(filePath, 'utf-8');
const lines = content.split('\n');
const results = [];
lines.forEach((line, index) => {
patterns.forEach(pattern => {
pattern.lastIndex = 0; // Reset regex
if (pattern.test(line)) {
results.push({
line: index + 1,
content: line.trim()
});
}
});
});
return results;
}
function walkDirectory(dir) {
const files = fs.readdirSync(dir);
const allResults = {};
files.forEach(file => {
const filePath = path.join(dir, file);
const stat = fs.statSync(filePath);
if (stat.isDirectory()) {
Object.assign(allResults, walkDirectory(filePath));
} else if (file.endsWith('.js')) {
const results = findBlessuresInFile(filePath);
if (results.length > 0) {
allResults[filePath] = results;
}
}
});
return allResults;
}
// Main
const scriptsDir = path.join(__dirname, 'scripts');
console.log('🔍 Recherche des variables JavaScript nommées "Blessures" dans le répertoire scripts/...\n');
if (!fs.existsSync(scriptsDir)) {
console.error('❌ Le répertoire scripts/ n\'existe pas');
process.exit(1);
}
const results = walkDirectory(scriptsDir);
if (Object.keys(results).length === 0) {
console.log('✅ Aucune variable JavaScript nommée "Blessures" trouvée.');
} else {
console.log(`⚠️ ${Object.keys(results).length} fichier(s) contenant des variables "Blessures" :\n`);
Object.entries(results).forEach(([filePath, occurrences]) => {
const relativePath = path.relative(__dirname, filePath);
console.log(`📄 ${relativePath}`);
occurrences.forEach(({ line, content }) => {
console.log(` Ligne ${line}: ${content}`);
});
console.log('');
});
}

92
find-tests-variables.cjs Normal file
View File

@@ -0,0 +1,92 @@
#!/usr/bin/env node
const fs = require('fs');
const path = require('path');
// Patterns pour détecter les variables JavaScript nommées "Tests"
const patterns = [
// Déclarations de variables
/\b(let|const|var)\s+Tests\b/g,
// Paramètres de fonction
/function\s+\w*\s*\([^)]*\bTests\b[^)]*\)/g,
// Arrow functions avec paramètres
/\(\s*[^)]*\bTests\b[^)]*\)\s*=>/g,
// Arrow function avec un seul paramètre sans parenthèses
/\bTests\s*=>/g,
// Destructuration d'objets
/\{\s*[^}]*\bTests\b[^}]*\}\s*=/g,
// Destructuration de tableaux
/\[\s*[^\]]*\bTests\b[^\]]*\]\s*=/g,
// Catch clause
/catch\s*\(\s*Tests\s*\)/g,
// For...of/in loops
/for\s*\(\s*(let|const|var)?\s*Tests\s+(of|in)\b/g,
];
function findTestsInFile(filePath) {
const content = fs.readFileSync(filePath, 'utf-8');
const lines = content.split('\n');
const results = [];
lines.forEach((line, index) => {
patterns.forEach(pattern => {
pattern.lastIndex = 0; // Reset regex
if (pattern.test(line)) {
results.push({
line: index + 1,
content: line.trim()
});
}
});
});
return results;
}
function walkDirectory(dir) {
const files = fs.readdirSync(dir);
const allResults = {};
files.forEach(file => {
const filePath = path.join(dir, file);
const stat = fs.statSync(filePath);
if (stat.isDirectory()) {
Object.assign(allResults, walkDirectory(filePath));
} else if (file.endsWith('.js')) {
const results = findTestsInFile(filePath);
if (results.length > 0) {
allResults[filePath] = results;
}
}
});
return allResults;
}
// Main
const scriptsDir = path.join(__dirname, 'scripts');
console.log('🔍 Recherche des variables JavaScript nommées "Tests" dans le répertoire scripts/...\n');
if (!fs.existsSync(scriptsDir)) {
console.error('❌ Le répertoire scripts/ n\'existe pas');
process.exit(1);
}
const results = walkDirectory(scriptsDir);
if (Object.keys(results).length === 0) {
console.log('✅ Aucune variable JavaScript nommée "Tests" trouvée.');
} else {
console.log(`⚠️ ${Object.keys(results).length} fichier(s) contenant des variables "Tests" :\n`);
Object.entries(results).forEach(([filePath, occurrences]) => {
const relativePath = path.relative(__dirname, filePath);
console.log(`📄 ${relativePath}`);
occurrences.forEach(({ line, content }) => {
console.log(` Ligne ${line}: ${content}`);
});
console.log('');
});
}

View File

@@ -0,0 +1,11 @@
{
"folders": [
{
"path": "."
},
{
"path": "../WFRP4e-FoundryVTT"
}
],
"settings": {}
}

4051
fr.json

File diff suppressed because it is too large Load Diff

View File

@@ -8,7 +8,7 @@
}
],
"url": "https://www.uberwald.me/gitea/public/foundryvtt-wh4-lang-fr-fr",
"version": "9.3.4",
"version": "9.4.3",
"esmodules": [
"wh4_fr.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",
"download": "https://www.uberwald.me/gitea/public/foundryvtt-wh4-lang-fr-fr/archive/foundryvtt-wh4-lang-fr-9-3-4.zip",
"download": "https://www.uberwald.me/gitea/public/foundryvtt-wh4-lang-fr-fr/archive/foundryvtt-wh4-lang-fr-9-4-3.zip",
"id": "wh4-fr-translation",
"compatibility": {
"minimum": "13",

View File

@@ -133,10 +133,10 @@ const __auto_patch_translation_journal_compendium = async (compmod) => {
if (game.user.isGM) {
let compData = game.packs.get("WH4-fr-translation.tables-des-traductions");
compData.locked = false;
let translEntries = await compData.getContent();
let translEntries = await compData.getDocuments();
for (let entryData of translEntries) {
let mydata = foundry.utils.duplicate(entryData.data);
mydata.content = mydata.content.replace(/wfrp4e-content/g, compmod);
let mydata = entryData.toObject();
mydata.text.content = mydata.text.content.replace(/wfrp4e-content/g, compmod);
entryData.update(mydata);
}
compData.locked = true;
@@ -175,9 +175,55 @@ const patch_core_tables = (tableList) => {
/************************************************************************************/
const patch_trade_gazeteer = () => {
if (game.wfrp4e.config.trade?.gazetteer) {
// Translate river cargoTypes to French (DotR module registers English values)
if (game.wfrp4e.trade?.tradeData?.river?.cargoTypes) {
Object.assign(game.wfrp4e.trade.tradeData.river.cargoTypes, {
"grain": game.i18n.localize("TRADE.Grain"),
"armaments": game.i18n.localize("TRADE.Armaments"),
"luxuries": game.i18n.localize("TRADE.Luxuries"),
"metal": game.i18n.localize("TRADE.Metal"),
"timber": game.i18n.localize("TRADE.Timber"),
"wine": game.i18n.localize("TRADE.Wine"),
"brandy": game.i18n.localize("TRADE.Brandy"),
"wool": game.i18n.localize("TRADE.Wool"),
});
}
// Translate maritime cargoTypes to French (SOC module)
if (game.wfrp4e.trade?.tradeData?.maritime?.cargoTypes) {
const maritimeKeys = {
"citrusfruit": "TRADE.Citrusfruit",
"olives": "TRADE.Olives",
"saltfish": "TRADE.Saltfish",
"stone": "TRADE.Stone",
};
for (let [key, locKey] of Object.entries(maritimeKeys)) {
if (game.wfrp4e.trade.tradeData.maritime.cargoTypes[key]) {
game.wfrp4e.trade.tradeData.maritime.cargoTypes[key] = game.i18n.localize(locKey);
}
}
// Translate shared keys that may also appear in maritime
Object.assign(game.wfrp4e.trade.tradeData.maritime.cargoTypes,
Object.fromEntries(
Object.entries(game.wfrp4e.trade.tradeData.maritime.cargoTypes)
.filter(([k]) => game.wfrp4e.trade.tradeData.river?.cargoTypes?.[k])
.map(([k]) => [k, game.wfrp4e.trade.tradeData.river.cargoTypes[k]])
)
);
}
// Translate season names shown in the trade dialog
if (game.wfrp4e.trade?.seasons) {
Object.assign(game.wfrp4e.trade.seasons, {
"spring": game.i18n.localize("TRADE.Spring"),
"summer": game.i18n.localize("TRADE.Summer"),
"autumn": game.i18n.localize("TRADE.Autumn"),
"winter": game.i18n.localize("TRADE.Winter"),
});
}
// Replace the English DotR gazetteer with the French-translated one
// New API: game.wfrp4e.trade.gazetteers.river (replaces old game.wfrp4e.config.trade.gazetteer)
if (game.wfrp4e.trade?.gazetteers?.river?.length) {
fetch("modules/wh4-fr-translation/trade/gazetteer_dotr.json").then(r => r.json()).then(records => {
game.wfrp4e.config.trade.gazetteer = records;
game.wfrp4e.trade.gazetteers.river = records;
});
}
}
@@ -231,7 +277,7 @@ const __check_fix_wrong_modules = (chatFlag, patchFinished) => {
}
} else if (game.user.isGM && patchFinished) {
ChatMessage.create({
content: "<div>Les modules WFRP4E ont été <strong>patchés avec succés</strong>. Vous pouvez y aller et que <strong>Shallya vous garde !</strong><div><div>Changements v9.3.4 : <ul><li>Ajout de la commande /voyage !</li><li>Améliorations de la commande /auberge</li><li>Très grosses mise à jour des scripts d'Effets et de leur traduction</li></ul></div>",
content: "<div>Les modules WFRP4E ont été <strong>patchés avec succés</strong>. Vous pouvez y aller et que <strong>Shallya vous garde !</strong><div><div>Changements v9.3.5 : <ul><li>Ajout de la commande /voyage !</li><li>Améliorations de la commande /auberge</li><li>Les joueurs doivent désormais pouvoir créer leur persos</li><li>Très grosses mise à jour des scripts d'Effets et de leur traduction</li></ul></div>",
user: game.user.id,
whisper: ChatMessage.getWhisperRecipients("GM")
});
@@ -385,7 +431,9 @@ Hooks.on('ready', () => {
"doom": "Maudit (-40)"
}
game.wfrp4e.warnDialog.render(true, { focus: true, left: 20, top: 20 });
if (game.user.isGM) {
game.wfrp4e.warnDialog.render(true, { focus: true, left: 20, top: 20 });
}
//setTimeout( __check_fix_wrong_modules, 2000, true, false);
setTimeout(__check_fix_wrong_modules, 20000, true, true);
setTimeout(__add_actors_translation, 21000, false, true);

View File

@@ -248,16 +248,16 @@ Hooks.once('init', () => {
let translw = translItem?.name || undefined
if (translw && translw != s1) {
let res2 = re.exec(translw);
transl = res2[1] + "(" + subword + ")";
transl = res2[1].trim() + " (" + subword + ")";
} else {
s1 = res[1].trim() + " ( )";
translItem = game.babele.translate(compData.metadata.id, { name: s1, type: "skill" }, true)
translw = translItem?.name || undefined
if(translw) {
let res2 = re.exec(translw);
transl = res2[1] + "(" + subword + ")";
transl = res2[1].trim() + " (" + subword + ")";
} else {
transl = res[1] + " (" + subword + ")";
transl = res[1].trim() + " (" + subword + ")";
}
}
}
@@ -366,7 +366,7 @@ Hooks.once('init', () => {
translItem = game.babele.translate(compData.metadata.id, { name: s1 }, true)
let translw = translItem?.name || undefined
if (translw && translw != s1) {
transl = translw + " (" + subword + ")";
transl = translw.trim() + " (" + subword + ")";
}
}
}
@@ -424,8 +424,10 @@ Hooks.once('init', () => {
if (trait_fr?.name && trait_fr?.name != name_en) {
trait_fr.name = trait_fr.name || trait_en.name
trait_en.name = nbt + trait_fr.name + special;
trait_en.system.description.value = trait_fr.system.description.value;
if (trait_en.system?.specification && isNaN(trait_en.system.specification.value)) { // This is a string, so translate it
if ( trait_en.system?.description?.value && trait_fr.system?.description?.value) {
trait_en.system.description.value = trait_fr.system.description.value;
}
if (trait_en?.system?.specification && isNaN(trait_en.system.specification?.value)) { // This is a string, so translate it
//console.log("Translating : ", trait_en.system.specification.value);
trait_en.system.specification.value = game.i18n.localize(trait_en.system.specification.value.trim());
}

File diff suppressed because one or more lines are too long

View File

@@ -1 +1 @@
MANIFEST-001251
MANIFEST-001311

View File

@@ -1,7 +1,7 @@
2026/01/07-15:05:51.801144 7f93ebfff6c0 Recovering log #1249
2026/01/07-15:05:51.812047 7f93ebfff6c0 Delete type=3 #1247
2026/01/07-15:05:51.812099 7f93ebfff6c0 Delete type=0 #1249
2026/01/07-15:06:45.486999 7f93e9ffb6c0 Level-0 table #1254: started
2026/01/07-15:06:45.487020 7f93e9ffb6c0 Level-0 table #1254: 0 bytes OK
2026/01/07-15:06:45.493208 7f93e9ffb6c0 Delete type=0 #1252
2026/01/07-15:06:45.493509 7f93e9ffb6c0 Manual compaction at level-0 from '!journal!3IgmiprzLB6Lwenc' @ 72057594037927935 : 1 .. '!journal.pages!suuYN87Al1ZZWtQQ.jhgNnhWhrkOpKs1B' @ 0 : 0; will stop at (end)
2026/03/07-00:45:53.808506 7fe8c37fe6c0 Recovering log #1309
2026/03/07-00:45:53.819278 7fe8c37fe6c0 Delete type=3 #1307
2026/03/07-00:45:53.819338 7fe8c37fe6c0 Delete type=0 #1309
2026/03/07-01:11:49.557068 7fe8c2ffd6c0 Level-0 table #1314: started
2026/03/07-01:11:49.557102 7fe8c2ffd6c0 Level-0 table #1314: 0 bytes OK
2026/03/07-01:11:49.563625 7fe8c2ffd6c0 Delete type=0 #1312
2026/03/07-01:11:49.577541 7fe8c2ffd6c0 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/07-14:19:22.396531 7f93ebfff6c0 Recovering log #1245
2026/01/07-14:19:22.406238 7f93ebfff6c0 Delete type=3 #1243
2026/01/07-14:19:22.406300 7f93ebfff6c0 Delete type=0 #1245
2026/01/07-15:04:29.638874 7f93e9ffb6c0 Level-0 table #1250: started
2026/01/07-15:04:29.638900 7f93e9ffb6c0 Level-0 table #1250: 0 bytes OK
2026/01/07-15:04:29.650961 7f93e9ffb6c0 Delete type=0 #1248
2026/01/07-15:04:29.667055 7f93e9ffb6c0 Manual compaction at level-0 from '!journal!3IgmiprzLB6Lwenc' @ 72057594037927935 : 1 .. '!journal.pages!suuYN87Al1ZZWtQQ.jhgNnhWhrkOpKs1B' @ 0 : 0; will stop at (end)
2026/03/05-20:38:02.743870 7f7930fff6c0 Recovering log #1305
2026/03/05-20:38:02.754744 7f7930fff6c0 Delete type=3 #1303
2026/03/05-20:38:02.754879 7f7930fff6c0 Delete type=0 #1305
2026/03/05-20:42:36.083534 7f78e15b46c0 Level-0 table #1310: started
2026/03/05-20:42:36.083606 7f78e15b46c0 Level-0 table #1310: 0 bytes OK
2026/03/05-20:42:36.090385 7f78e15b46c0 Delete type=0 #1308
2026/03/05-20:42:36.111635 7f78e15b46c0 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-001253
MANIFEST-001313

View File

@@ -1,7 +1,7 @@
2026/01/07-15:05:51.814570 7f93ea7fc6c0 Recovering log #1251
2026/01/07-15:05:51.824155 7f93ea7fc6c0 Delete type=3 #1249
2026/01/07-15:05:51.824233 7f93ea7fc6c0 Delete type=0 #1251
2026/01/07-15:06:45.493731 7f93e9ffb6c0 Level-0 table #1256: started
2026/01/07-15:06:45.493762 7f93e9ffb6c0 Level-0 table #1256: 0 bytes OK
2026/01/07-15:06:45.500998 7f93e9ffb6c0 Delete type=0 #1254
2026/01/07-15:06:45.529036 7f93e9ffb6c0 Manual compaction at level-0 from '!folders!3uquYH73ttCdoH0I' @ 72057594037927935 : 1 .. '!items!ylFhk7mGZOnAJTUT' @ 0 : 0; will stop at (end)
2026/03/07-00:45:53.822265 7fe9111ff6c0 Recovering log #1311
2026/03/07-00:45:53.832029 7fe9111ff6c0 Delete type=3 #1309
2026/03/07-00:45:53.832089 7fe9111ff6c0 Delete type=0 #1311
2026/03/07-01:11:49.549791 7fe8c2ffd6c0 Level-0 table #1316: started
2026/03/07-01:11:49.549814 7fe8c2ffd6c0 Level-0 table #1316: 0 bytes OK
2026/03/07-01:11:49.556940 7fe8c2ffd6c0 Delete type=0 #1314
2026/03/07-01:11:49.577524 7fe8c2ffd6c0 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/07-14:19:22.408420 7f93ea7fc6c0 Recovering log #1247
2026/01/07-14:19:22.419450 7f93ea7fc6c0 Delete type=3 #1245
2026/01/07-14:19:22.419496 7f93ea7fc6c0 Delete type=0 #1247
2026/01/07-15:04:29.689520 7f93e9ffb6c0 Level-0 table #1252: started
2026/01/07-15:04:29.689548 7f93e9ffb6c0 Level-0 table #1252: 0 bytes OK
2026/01/07-15:04:29.701802 7f93e9ffb6c0 Delete type=0 #1250
2026/01/07-15:04:29.713438 7f93e9ffb6c0 Manual compaction at level-0 from '!folders!3uquYH73ttCdoH0I' @ 72057594037927935 : 1 .. '!items!ylFhk7mGZOnAJTUT' @ 0 : 0; will stop at (end)
2026/03/05-20:38:02.758975 7f78e37fe6c0 Recovering log #1307
2026/03/05-20:38:02.770688 7f78e37fe6c0 Delete type=3 #1305
2026/03/05-20:38:02.770801 7f78e37fe6c0 Delete type=0 #1307
2026/03/05-20:42:36.097432 7f78e15b46c0 Level-0 table #1312: started
2026/03/05-20:42:36.097481 7f78e15b46c0 Level-0 table #1312: 0 bytes OK
2026/03/05-20:42:36.104419 7f78e15b46c0 Delete type=0 #1310
2026/03/05-20:42:36.111679 7f78e15b46c0 Manual compaction at level-0 from '!folders!3uquYH73ttCdoH0I' @ 72057594037927935 : 1 .. '!items!ylFhk7mGZOnAJTUT' @ 0 : 0; will stop at (end)

View File

@@ -1 +1 @@
MANIFEST-001251
MANIFEST-001311

View File

@@ -1,7 +1,7 @@
2026/01/07-15:05:51.839318 7f93eaffd6c0 Recovering log #1249
2026/01/07-15:05:51.849796 7f93eaffd6c0 Delete type=3 #1247
2026/01/07-15:05:51.849857 7f93eaffd6c0 Delete type=0 #1249
2026/01/07-15:06:45.501213 7f93e9ffb6c0 Level-0 table #1254: started
2026/01/07-15:06:45.501269 7f93e9ffb6c0 Level-0 table #1254: 0 bytes OK
2026/01/07-15:06:45.508204 7f93e9ffb6c0 Delete type=0 #1252
2026/01/07-15:06:45.529072 7f93e9ffb6c0 Manual compaction at level-0 from '!journal!cZtNgayIw2QFhC9u' @ 72057594037927935 : 1 .. '!journal.pages!cZtNgayIw2QFhC9u.ts265H1XkisLgdow' @ 0 : 0; will stop at (end)
2026/03/07-00:45:53.847464 7fe8c3fff6c0 Recovering log #1309
2026/03/07-00:45:53.857503 7fe8c3fff6c0 Delete type=3 #1307
2026/03/07-00:45:53.857563 7fe8c3fff6c0 Delete type=0 #1309
2026/03/07-01:11:49.577693 7fe8c2ffd6c0 Level-0 table #1314: started
2026/03/07-01:11:49.577722 7fe8c2ffd6c0 Level-0 table #1314: 0 bytes OK
2026/03/07-01:11:49.583840 7fe8c2ffd6c0 Delete type=0 #1312
2026/03/07-01:11:49.612617 7fe8c2ffd6c0 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/07-14:19:22.434524 7f93ea7fc6c0 Recovering log #1245
2026/01/07-14:19:22.444128 7f93ea7fc6c0 Delete type=3 #1243
2026/01/07-14:19:22.444200 7f93ea7fc6c0 Delete type=0 #1245
2026/01/07-15:04:29.701936 7f93e9ffb6c0 Level-0 table #1250: started
2026/01/07-15:04:29.701958 7f93e9ffb6c0 Level-0 table #1250: 0 bytes OK
2026/01/07-15:04:29.713305 7f93e9ffb6c0 Delete type=0 #1248
2026/01/07-15:04:29.713449 7f93e9ffb6c0 Manual compaction at level-0 from '!journal!cZtNgayIw2QFhC9u' @ 72057594037927935 : 1 .. '!journal.pages!cZtNgayIw2QFhC9u.ts265H1XkisLgdow' @ 0 : 0; will stop at (end)
2026/03/05-20:38:02.790472 7f78e3fff6c0 Recovering log #1305
2026/03/05-20:38:02.801425 7f78e3fff6c0 Delete type=3 #1303
2026/03/05-20:38:02.801553 7f78e3fff6c0 Delete type=0 #1305
2026/03/05-20:42:36.090593 7f78e15b46c0 Level-0 table #1310: started
2026/03/05-20:42:36.090646 7f78e15b46c0 Level-0 table #1310: 0 bytes OK
2026/03/05-20:42:36.097257 7f78e15b46c0 Delete type=0 #1308
2026/03/05-20:42:36.111659 7f78e15b46c0 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-001251
MANIFEST-001311

View File

@@ -1,7 +1,7 @@
2026/01/07-15:05:51.788330 7f93eaffd6c0 Recovering log #1249
2026/01/07-15:05:51.798442 7f93eaffd6c0 Delete type=3 #1247
2026/01/07-15:05:51.798508 7f93eaffd6c0 Delete type=0 #1249
2026/01/07-15:06:45.480176 7f93e9ffb6c0 Level-0 table #1254: started
2026/01/07-15:06:45.480197 7f93e9ffb6c0 Level-0 table #1254: 0 bytes OK
2026/01/07-15:06:45.486885 7f93e9ffb6c0 Delete type=0 #1252
2026/01/07-15:06:45.493497 7f93e9ffb6c0 Manual compaction at level-0 from '!journal!50u8VAjdmovyr0hx' @ 72057594037927935 : 1 .. '!journal.pages!yzw9I0r3hCK7PJnz.sPNCYj2nR3Cp3jHd' @ 0 : 0; will stop at (end)
2026/03/07-00:45:53.792556 7fe8c3fff6c0 Recovering log #1309
2026/03/07-00:45:53.805674 7fe8c3fff6c0 Delete type=3 #1307
2026/03/07-00:45:53.805724 7fe8c3fff6c0 Delete type=0 #1309
2026/03/07-01:11:49.563712 7fe8c2ffd6c0 Level-0 table #1314: started
2026/03/07-01:11:49.563733 7fe8c2ffd6c0 Level-0 table #1314: 0 bytes OK
2026/03/07-01:11:49.570212 7fe8c2ffd6c0 Delete type=0 #1312
2026/03/07-01:11:49.577555 7fe8c2ffd6c0 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/07-14:19:22.383713 7f93eb7fe6c0 Recovering log #1245
2026/01/07-14:19:22.394171 7f93eb7fe6c0 Delete type=3 #1243
2026/01/07-14:19:22.394305 7f93eb7fe6c0 Delete type=0 #1245
2026/01/07-15:04:29.651336 7f93e9ffb6c0 Level-0 table #1250: started
2026/01/07-15:04:29.651360 7f93e9ffb6c0 Level-0 table #1250: 0 bytes OK
2026/01/07-15:04:29.666893 7f93e9ffb6c0 Delete type=0 #1248
2026/01/07-15:04:29.667066 7f93e9ffb6c0 Manual compaction at level-0 from '!journal!50u8VAjdmovyr0hx' @ 72057594037927935 : 1 .. '!journal.pages!yzw9I0r3hCK7PJnz.sPNCYj2nR3Cp3jHd' @ 0 : 0; will stop at (end)
2026/03/05-20:38:02.727495 7f78e2ffd6c0 Recovering log #1305
2026/03/05-20:38:02.739900 7f78e2ffd6c0 Delete type=3 #1303
2026/03/05-20:38:02.740017 7f78e2ffd6c0 Delete type=0 #1305
2026/03/05-20:42:36.060514 7f78e15b46c0 Level-0 table #1310: started
2026/03/05-20:42:36.060577 7f78e15b46c0 Level-0 table #1310: 0 bytes OK
2026/03/05-20:42:36.067949 7f78e15b46c0 Delete type=0 #1308
2026/03/05-20:42:36.083144 7f78e15b46c0 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-001251
MANIFEST-001311

View File

@@ -1,7 +1,7 @@
2026/01/07-15:05:51.775857 7f93ea7fc6c0 Recovering log #1249
2026/01/07-15:05:51.785876 7f93ea7fc6c0 Delete type=3 #1247
2026/01/07-15:05:51.785947 7f93ea7fc6c0 Delete type=0 #1249
2026/01/07-15:06:45.473201 7f93e9ffb6c0 Level-0 table #1254: started
2026/01/07-15:06:45.473242 7f93e9ffb6c0 Level-0 table #1254: 0 bytes OK
2026/01/07-15:06:45.480074 7f93e9ffb6c0 Delete type=0 #1252
2026/01/07-15:06:45.493481 7f93e9ffb6c0 Manual compaction at level-0 from '!tables!4l60Lxv8cpsyy2Cg' @ 72057594037927935 : 1 .. '!tables.results!tfaYKDZqu7kgZvRG.yvbwKursaixh2dby' @ 0 : 0; will stop at (end)
2026/03/07-00:45:53.774458 7fe8c37fe6c0 Recovering log #1309
2026/03/07-00:45:53.787633 7fe8c37fe6c0 Delete type=3 #1307
2026/03/07-00:45:53.787702 7fe8c37fe6c0 Delete type=0 #1309
2026/03/07-01:11:49.543331 7fe8c2ffd6c0 Level-0 table #1314: started
2026/03/07-01:11:49.543361 7fe8c2ffd6c0 Level-0 table #1314: 0 bytes OK
2026/03/07-01:11:49.549597 7fe8c2ffd6c0 Delete type=0 #1312
2026/03/07-01:11:49.549676 7fe8c2ffd6c0 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/07-14:19:22.369653 7f93ebfff6c0 Recovering log #1245
2026/01/07-14:19:22.381041 7f93ebfff6c0 Delete type=3 #1243
2026/01/07-14:19:22.381133 7f93ebfff6c0 Delete type=0 #1245
2026/01/07-15:04:29.629205 7f93e9ffb6c0 Level-0 table #1250: started
2026/01/07-15:04:29.629243 7f93e9ffb6c0 Level-0 table #1250: 0 bytes OK
2026/01/07-15:04:29.638743 7f93e9ffb6c0 Delete type=0 #1248
2026/01/07-15:04:29.667035 7f93e9ffb6c0 Manual compaction at level-0 from '!tables!4l60Lxv8cpsyy2Cg' @ 72057594037927935 : 1 .. '!tables.results!tfaYKDZqu7kgZvRG.yvbwKursaixh2dby' @ 0 : 0; will stop at (end)
2026/03/05-20:38:02.710364 7f7930fff6c0 Recovering log #1305
2026/03/05-20:38:02.722794 7f7930fff6c0 Delete type=3 #1303
2026/03/05-20:38:02.722917 7f7930fff6c0 Delete type=0 #1305
2026/03/05-20:42:36.068193 7f78e15b46c0 Level-0 table #1310: started
2026/03/05-20:42:36.068246 7f78e15b46c0 Level-0 table #1310: 0 bytes OK
2026/03/05-20:42:36.074966 7f78e15b46c0 Delete type=0 #1308
2026/03/05-20:42:36.083182 7f78e15b46c0 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-000894
MANIFEST-000954

View File

@@ -1,7 +1,7 @@
2026/01/07-15:05:51.826614 7f93ebfff6c0 Recovering log #892
2026/01/07-15:05:51.837158 7f93ebfff6c0 Delete type=3 #890
2026/01/07-15:05:51.837206 7f93ebfff6c0 Delete type=0 #892
2026/01/07-15:06:45.521984 7f93e9ffb6c0 Level-0 table #897: started
2026/01/07-15:06:45.522031 7f93e9ffb6c0 Level-0 table #897: 0 bytes OK
2026/01/07-15:06:45.528836 7f93e9ffb6c0 Delete type=0 #895
2026/01/07-15:06:45.529100 7f93e9ffb6c0 Manual compaction at level-0 from '!journal!056ILNNrLiPq3Gi3' @ 72057594037927935 : 1 .. '!journal.pages!yfZxl4I7XAuUF6r3.apXmOlZRmGT4GreB' @ 0 : 0; will stop at (end)
2026/03/07-00:45:53.835083 7fe8c37fe6c0 Recovering log #952
2026/03/07-00:45:53.844848 7fe8c37fe6c0 Delete type=3 #950
2026/03/07-00:45:53.844893 7fe8c37fe6c0 Delete type=0 #952
2026/03/07-01:11:49.570293 7fe8c2ffd6c0 Level-0 table #957: started
2026/03/07-01:11:49.570316 7fe8c2ffd6c0 Level-0 table #957: 0 bytes OK
2026/03/07-01:11:49.577407 7fe8c2ffd6c0 Delete type=0 #955
2026/03/07-01:11:49.577567 7fe8c2ffd6c0 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/07-14:19:22.421981 7f93eb7fe6c0 Recovering log #888
2026/01/07-14:19:22.432249 7f93eb7fe6c0 Delete type=3 #886
2026/01/07-14:19:22.432317 7f93eb7fe6c0 Delete type=0 #888
2026/01/07-15:04:29.679197 7f93e9ffb6c0 Level-0 table #893: started
2026/01/07-15:04:29.679221 7f93e9ffb6c0 Level-0 table #893: 0 bytes OK
2026/01/07-15:04:29.689398 7f93e9ffb6c0 Delete type=0 #891
2026/01/07-15:04:29.713429 7f93e9ffb6c0 Manual compaction at level-0 from '!journal!056ILNNrLiPq3Gi3' @ 72057594037927935 : 1 .. '!journal.pages!yfZxl4I7XAuUF6r3.apXmOlZRmGT4GreB' @ 0 : 0; will stop at (end)
2026/03/05-20:38:02.775184 7f7930fff6c0 Recovering log #948
2026/03/05-20:38:02.786747 7f7930fff6c0 Delete type=3 #946
2026/03/05-20:38:02.786856 7f7930fff6c0 Delete type=0 #948
2026/03/05-20:42:36.104620 7f78e15b46c0 Level-0 table #953: started
2026/03/05-20:42:36.104679 7f78e15b46c0 Level-0 table #953: 0 bytes OK
2026/03/05-20:42:36.111433 7f78e15b46c0 Delete type=0 #951
2026/03/05-20:42:36.111701 7f78e15b46c0 Manual compaction at level-0 from '!journal!056ILNNrLiPq3Gi3' @ 72057594037927935 : 1 .. '!journal.pages!yfZxl4I7XAuUF6r3.apXmOlZRmGT4GreB' @ 0 : 0; will stop at (end)

View File

@@ -1,2 +0,0 @@
let item = await fromUuid("Compendium.wfrp4e-core.items.weczkAMPlTjX7lqU")
this.actor.createEmbeddedDocuments("Item", [item])

View File

@@ -1 +0,0 @@
return args.item?.system?.isRanged && args.data.targets[0]?.actor?.sizeNum < 3

View File

@@ -1,25 +0,0 @@
// The imbiber immediately
// takes 3 Poisoned Conditions that cannot be resisted at first,
await this.actor.addCondition("poisoned", 3)
// recovers a number of Wounds equal to their Toughness Bonus,
await this.actor.modifyWounds(this.actor.system.characteristics.t.bonus)
// and acquires the Regenerate Creature Trait.
const hasRegenerate = this.actor.has("Regenerate")
if (hasRegenerate === undefined) {
fromUuid("Compendium.wfrp4e-core.items.SfUUdOGjdYpr3KSR").then(trait => {
let traitItem = trait.toObject()
this.actor.createEmbeddedDocuments("Item", [traitItem], {fromEffect: this.effect.id})
})
}
this.script.scriptMessage(`<p><strong>${this.actor.prototypeToken.name}</strong> has
<ul>
<li>gained 3 Poisoned Conditions that cannot be resisted at first</li>
<li>recovered ${this.actor.system.characteristics.t.bonus} Wounds</li>
<li>acquired the Regenerate Creature Trait.</li>
</ul>
Its up to Ranald if their regenerating can outpace their poisoning.</p>
<p>When all Poisoned Conditions are lost, so too is Regenerate.</p>`,
{ whisper: ChatMessage.getWhisperRecipients("GM"), blind: true })

View File

@@ -1 +0,0 @@
this.actor.addCondition("blinded", 3)

View File

@@ -1,4 +0,0 @@
let item = await fromUuid("Compendium.wfrp4e-core.items.8piWcBKFlQ2J1E3A")
let data = item.toObject();
data.system.location.key= this.item.system.location.key
this.actor.createEmbeddedDocuments("Item", [data])

View File

@@ -1,5 +0,0 @@
if (!args.flags.quietenedApplied)
{
args.fields.modifier += 10;
args.flags.quietenedApplied = true
}

View File

@@ -1 +0,0 @@
return !args.options.terror && !args.extendedTest?.flags.wfrp4e?.fear

View File

@@ -1,22 +0,0 @@
let spells = await warhammer.utility.findAllItems("spell", "Loading Spells")
let text = (await game.wfrp4e.tables.rollTable("random-caster", {hideDSN: true})).result
lore = Array.from(text.matchAll(/{(.+?)}/gm))[0][1]
if (text == "GM's Choice")
{
return this.script.scriptNotification(text)
}
if (spellsWithLore.length > 0)
{
let spellsWithLore = spells.filter(i => game.wfrp4e.config.magicLores[i.system.lore.value] == lore)
let selectedSpell = spellsWithLore[Math.floor(CONFIG.Dice.randomUniform() * spellsWithLore.length)]
this.script.scriptNotification(selectedSpell.name);
this.actor.createEmbeddedDocuments("Item", [selectedSpell])
}
else
{
ui.notifications.notify(`Could not find ${lore} spell. Try Again`)
}

View File

@@ -1,6 +0,0 @@
let item = await fromUuid("Compendium.wfrp4e-core.items.4CMKeDTDrRQZbPIJ")
let fixation = (await game.wfrp4e.tables.rollTable("fixations"))
let data = item.toObject();
data.system.specification.value = fixation.result;
this.item.updateSource({name : this.item.name += ` (${fixation.result})`});
this.actor.createEmbeddedDocuments("Item", [data], {fromEffect : this.effect.id})

View File

@@ -1 +0,0 @@
return !["t", "wp"].includes(args.characteristic)

View File

@@ -1,18 +0,0 @@
let table = game.wfrp4e.tables.findTable("mutatephys");
if (!table)
{
return ui.notifications.error("Mutation table not found, please ensure a table with the `mutatephys` key is imported in the world.")
}
let result = (await table.roll()).results[0];
let uuid = `Compendium.${result.documentCollection}.${result.documentId}`
let item = await fromUuid(uuid);
if (item)
{
this.script.scriptNotification(`${item.name} added`)
this.actor.createEmbeddedDocuments("Item", [item])
}
else
{
ui.notifications.error("Item could not be found: " + uuid)
}

View File

@@ -1,21 +0,0 @@
let location = this.item.system.location.key;
if (location)
{
let dropped = this.item.system.weaponsAtLocation;
if (dropped.length)
{
this.script.scriptNotification(`Dropped ${dropped.map(i => i.name).join(", ")}!`)
for(let weapon of dropped)
{
await weapon.system.toggleEquip();
}
}
}
let roll = await new Roll("max(1, 1d10 - @system.characteristics.t.bonus)", this.actor).roll()
roll.toMessage(this.script.getChatData({flavor : `${this.effect.name} (Duration)`}));
this.effect.updateSource({"duration.rounds" : roll.total})

View File

@@ -1,9 +0,0 @@
if (args.skill?.name != game.i18n.localize("NAME.Gossip"))
{
return true;
}
else
{
args.data.canReverse = true; // 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

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

View File

@@ -1,3 +0,0 @@
let item = await fromUuid("Compendium.wfrp4e-core.items.GbDyBCu8ZjDp6dkj")
let data = item.toObject();
this.actor.createEmbeddedDocuments("Item", [data], {fromEffect : this.effect.id})

View File

@@ -1,10 +0,0 @@
let item1 = await fromUuid("Compendium.wfrp4e-core.items.3S4OYOZLauXctmev")
let item2 = await fromUuid("Compendium.wfrp4e-core.items.7mCcI3q7hgWcmbBU")
let data1 = item1.toObject();
data1.system.location.key = this.item.system.location.key
let data2 = item2.toObject();
data2.system.location.key = this.item.system.location.key
this.actor.createEmbeddedDocuments("Item", [data1, data2], {fromEffect: this.effect.id})

View File

@@ -1 +0,0 @@
args.fields.modifier -= 20;

View File

@@ -1,7 +0,0 @@
if (!args.flags.strikeToStun)
{
args.flags.strikeToStun = true
args.fields.modifier += 20;
args.fields.hitLocation = "head";
}
args.fields.successBonus++;

View File

@@ -1 +0,0 @@
return args.options.terror || args.extendedTest?.flags.wfrp4e?.fear

View File

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

View File

@@ -1 +0,0 @@
args.fields.modifier -= 20

View File

@@ -1,7 +0,0 @@
let state = !this.effect.disabled;
this.effect.update({"disabled": state});
if (state)
return ui.notifications.info("EFFECT.CreatureBackInWater", {localize: true})
return ui.notifications.info("EFFECT.CreatureOutOfWater", {localize: true});

View File

@@ -1,31 +0,0 @@
if (!this.item.name.includes("(") || this.item.system.tests.value.includes("Terrain"))
{
let tests = this.item.system.tests.value
let name = this.item.name
// If name already specifies, make sure tests value reflects that
if (name.includes("("))
{
let terrain = name.split("(")[1].split(")")[0]
tests = tests.replace("the Terrain", terrain)
}
else // If no sense specified, provide dialog choice
{
let choice = await ItemDialog.create(ItemDialog.objectToArray({
coastal : "Coastal",
deserts : "Deserts",
marshes : "Marshes",
rocky : "Rocky",
tundra : "Tundra",
woodlands : "Woodlands"
}, this.item.img), 1, "Choose Terrain");
if (choice[0])
{
name = `${name.split("(")[0].trim()} (${choice[0].name})`
tests = tests.replace("the Terrain", choice[0].name + " Terrain")
}
}
this.effect.updateSource({name})
this.item.updateSource({name, "system.tests.value" : tests})
}

View File

@@ -1,40 +0,0 @@
let characteristics = {
"ws" : 5,
"bs" : 5,
"s" : 5,
"t" : 0,
"i" : 5,
"ag" : 5,
"dex" : 5,
"int" : 0,
"wp" : 5,
"fel" : 5
}
let items = []
let updateObj = this.actor.toObject();
let talents = (await Promise.all([game.wfrp4e.tables.rollTable("talents"), game.wfrp4e.tables.rollTable("talents"), game.wfrp4e.tables.rollTable("talents")])).map(i => i.text)
for (let ch in characteristics)
{
updateObj.system.characteristics[ch].modifier += characteristics[ch];
}
for (let talent of talents)
{
let talentItem = await game.wfrp4e.utility.findTalent(talent)
if (talentItem)
{
items.push(talentItem.toObject());
}
else
{
ui.notifications.warn(`Could not find ${talent}`, {permanent : true})
}
}
await this.actor.update(updateObj)
this.actor.createEmbeddedDocuments("Item", items);

View File

@@ -1 +0,0 @@
return args.characteristic != "t"

View File

@@ -1 +0,0 @@
args.actor.details.move.run += 4

View File

@@ -1,2 +0,0 @@
await this.actor.addCondition("ablaze", 2)
await this.script.scriptMessage(await this.actor.applyBasicDamage(this.effect.sourceTest.result.damage, {suppressMsg: true}))

View File

@@ -1 +0,0 @@
return args.characteristic != "wp"

View File

@@ -1,6 +0,0 @@
let test = await this.actor.setupCharacteristic("wp", {skipTargets: true, appendTitle : ` ${this.effect.name}`})
await test.roll()
if (test.succeeded)
{
this.effect.delete();
}

View File

@@ -1 +0,0 @@
args.options.cardsharp = true;

View File

@@ -1,5 +0,0 @@
if (args.opposedTest.result.hitloc.value == this.item.system.location.key && args.totalWoundLoss > 0)
{
args.actor.addCondition("bleeding", 2);
}

View File

@@ -1 +0,0 @@
return ["ws", "bs", "s", "ag", "t", "dex"].includes(args.characteristic)

View File

@@ -1,7 +0,0 @@
let test = await args.actor.setupCharacteristic("wp", {skipTargets: true, appendTitle : " - " + this.effect.name, context : {failure: "Gained a Stunned Condition"}})
await test.roll();
if (test.failed)
{
args.actor.addCondition("stunned")
}

View File

@@ -1 +0,0 @@
this.actor.status.addArmour(1, {source: this.effect, magical : true})

View File

@@ -1 +0,0 @@
this.script.scriptNotification(`Cannot enter ${this.effect.name}!`);

View File

@@ -1,3 +0,0 @@
let healed = parseInt(this.effect.sourceTest.result.SL)
this.actor.modifyWounds(healed)
this.script.scriptMessage(`Healed ${healed} Wounds`)

View File

@@ -1,20 +0,0 @@
let damage = this.effect.sourceActor.hasCondition("fatigued") ? 6 : 10;
let loc = "body"
let APatLoc = this.actor.system.status.armour[loc];
let metalAP = APatLoc.layers.reduce((metal, layer) => metal += ((layer.metal && !layer.magical) ? layer.value : 0), 0)
let APused = Math.max(0, APatLoc.value - metalAP); // remove metal AP at location;
damage -= (APused + this.actor.system.characteristics.t.bonus)
let msg = await this.actor.applyBasicDamage(damage, {suppressMsg : true, damageType : game.wfrp4e.config.DAMAGE_TYPE.IGNORE_ALL});
msg += ` (ignored ${metalAP} metal AP on ${game.wfrp4e.config.locations[loc]})`
this.script.scriptMessage(msg)
let test = await this.actor.setupSkill("Endurance", {fields : {difficulty : "difficult"}, appendTitle : ` - ${this.effect.name}`});
await test.roll();
if (test.failed)
this.actor.addCondition("stunned");

View File

@@ -1 +0,0 @@
args.options.ballockKnife = true;

View File

@@ -1,2 +0,0 @@
if (args.effect.conditionId == "bleeding")
args.data.damage -= 1

View File

@@ -1,10 +0,0 @@
let choice = await ItemDialog.create(ItemDialog.objectToArray(game.wfrp4e.config.locations), 1, "Choose Location");
let location = choice[0].id;
let itemTargeted = this.actor.items.get(this.effect.getFlag("wfrp4e", "itemTargets")[0])
if (itemTargeted)
{
itemTargeted.update({[`system.APdamage.${location}`] : itemTargeted.system.APdamage[location] + 1})
}

View File

@@ -1 +0,0 @@
return args.options.reload

View File

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

View File

@@ -1 +0,0 @@
game.wfrp4e.utility.postCorruptionTest(this.item.system.specification.value, {speaker : {alias: this.actor.prototypeToken.name}})

View File

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

View File

@@ -1 +0,0 @@
return !["fel"].includes(args.characteristic)

View File

@@ -1 +0,0 @@
args.fields.slBonus += this.actor.system.characteristics.wp.bonus

View File

@@ -1,8 +0,0 @@
if (isNaN(parseInt(this.item.system.specification.value)))
{
let value = await ValueDialog.create("Enter Armour value", this.effect.name);
if (value)
{
this.item.updateSource({"system.specification.value" : value});
}
}

View File

@@ -1,9 +0,0 @@
if (!["rLeg", "lLeg"].includes(this.effect.getFlag("wfrp4e", "location")))
return true;
if (args.options.dodge)
{
args.abort = true;
this.script.scriptNotification("Cannot Dodge!")
}
return ["t", "int", "wp", "fel"].includes(args.characteristic)

View File

@@ -1,9 +0,0 @@
if (args.weapon && this.item.system.usesLocation(args.weapon))
{
args.bleedingHand = true;
let success = await this.effect.manualScripts[0].execute({actor: this.actor})
if (!success)
{
args.abort = true;
}
}

View File

@@ -1,10 +0,0 @@
if (this.item.system.quantity.value)
{
this.item.update({"system.quantity.value" : this.item.system.quantity.value - 0.25})
let actor = Array.from(game.user.targets)[0]?.actor || this.actor;
actor.applyEffect({effectData : [this.item.effects.contents[1].convertToApplied()]})
}
else
{
this.script.scriptNotification("None left!", "error")
}

View File

@@ -1,4 +0,0 @@
if (args.test.isFumble)
{
args.test.result.other.push("@Table[doomrocket-fumble]")
}

View File

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

View File

@@ -1 +0,0 @@
args.prefillModifiers.difficulty = "hard"

View File

@@ -1,6 +0,0 @@
if (args.opposedTest.result.winner == "attacker") {
if (args.opposedTest.defenderTest.weapon && args.opposedTest.defenderTest.item.properties.qualities.shield) {
ui.notifications.notify(`<b>${this.effect.name}</b>: Gained ${this.item.Advances} Advantage`)
this.actor.setAdvantage(this.item.Advances)
}
}

View File

@@ -1,18 +0,0 @@
let currentCareer = this.actor.system.currentCareer;
if (!currentCareer)
{
return;
}
let talents = ["Aethyric Attunement",
"Arcane Magic (Any)",
"Chaos Magic (Tzeentch)",
"Fast Hands",
"Instinctive Diction",
"Magical Sense",
"Petty Magic",
"Second Sight",
"War Wizard",
"Witch!"].filter(t => !currentCareer.system.talents.includes(t))
currentCareer.system.talents = currentCareer.system.talents.concat(talents)

View File

@@ -1,3 +0,0 @@
let item = await fromUuid("Compendium.wfrp4e-core.items.9GNpAqgsKzxZKJpp")
let data = item.toObject();
this.actor.createEmbeddedDocuments("Item", [data], {fromEffect : this.effect.id})

View File

@@ -1,2 +0,0 @@
args.data.canReverse = true;
args.options.fieldDressing = true;

View File

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

View File

@@ -1,4 +0,0 @@
if (args.item.type == "spell")
{
args.item.cn.value = Math.floor(args.item.cn.value / 2)
}

View File

@@ -1 +0,0 @@
return !args.options.handling

View File

@@ -1 +0,0 @@
this.script.scriptMessage(await this.actor.applyBasicDamage(8, {damageType : game.wfrp4e.config.DAMAGE_TYPE.IGNORE_AP, suppressMsg: true}))

View File

@@ -1,3 +0,0 @@
args.actor.system.details.move.value += 2;
args.actor.system.status.carries.max = Math.floor(args.actor.system.status.carries.max * 0.5);
args.actor.system.details.price.gc *= 1.1;

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