Compare commits
13 Commits
foundryvtt
...
foundryvtt
| Author | SHA1 | Date | |
|---|---|---|---|
| 5bc6d0d2f5 | |||
| d557fac83f | |||
| f07ef0b01d | |||
| 301cc830bc | |||
| 786afeab74 | |||
| e0383def30 | |||
| 7dc51444f0 | |||
| 752a6701c0 | |||
| 0e8237c233 | |||
| df26a699a0 | |||
| 0a1fa37e49 | |||
| 5b7fba4c87 | |||
| d710061eeb |
92
find-blessures-variables.cjs
Normal file
92
find-blessures-variables.cjs
Normal 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
92
find-tests-variables.cjs
Normal 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('');
|
||||
});
|
||||
}
|
||||
11
foundryvtt-wh4-lang-fr-fr.code-workspace
Normal file
11
foundryvtt-wh4-lang-fr-fr.code-workspace
Normal file
@@ -0,0 +1,11 @@
|
||||
{
|
||||
"folders": [
|
||||
{
|
||||
"path": "."
|
||||
},
|
||||
{
|
||||
"path": "../WFRP4e-FoundryVTT"
|
||||
}
|
||||
],
|
||||
"settings": {}
|
||||
}
|
||||
6
fr.json
6
fr.json
@@ -1192,6 +1192,10 @@
|
||||
"CHAT.ExpReceivedNoReason":"Vous avez reçu <b>{amount}</b> points d'expérience",
|
||||
"CHAT.CriticalDeflection":"Déviation de Critique",
|
||||
"CHAT.DamageToArmour":"1 Dommages appliqués à {item} ({type})",
|
||||
"CHAT.CastSpell":"Incanter {spell}",
|
||||
"CHAT.Dispel":"Dissiper {spell}",
|
||||
"CHAT.DissolutionTable":"Lancer sur la Table de Dissolution du Corps et de l'Esprit pour votre Espèce:<br>@Table[corruption]",
|
||||
"CHAT.InvokePrayer":"Invoquer {prayer}",
|
||||
|
||||
"Error.SpeciesSkills" : "Impossible d'ajouter des compétences pour les races",
|
||||
"Error.SpeciesTalents" : "Impossible d'ajouter des talents pour les races",
|
||||
@@ -2348,6 +2352,8 @@
|
||||
"EFFECT.AffectTheSourceOfFearName":"Tests qui affectent {name}",
|
||||
"EFFECT.DeletingEffectItems":"Suppression des items d'effets: {items}",
|
||||
"EFFECT.BlackpowderShock":"Contre-coup de Poudre Noire",
|
||||
"EFFECT.BonusModifier":"Modificateur de Bonus",
|
||||
"EFFECT.CharacteristicsBonus":"Caractéristiques (Modificateur de Bonus)",
|
||||
|
||||
"GRIEVANCE.Warning1":"Attention",
|
||||
"GRIEVANCE.Warning2":": Cette information est envoyé sur l'espace Github, qui est un espace publique, donc le Tag Discord est préférable. Sinon, contactez moi (MooMan) directement. Si vous avez l'impression que le bug concerne le module FR, contactez LeRatierBretonnier (Discord Foundry FR)",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -231,7 +231,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 +385,9 @@ Hooks.on('ready', () => {
|
||||
"doom": "Maudit (-40)"
|
||||
}
|
||||
|
||||
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);
|
||||
|
||||
@@ -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;
|
||||
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
|
||||
}
|
||||
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
@@ -1 +1 @@
|
||||
MANIFEST-001251
|
||||
MANIFEST-001307
|
||||
|
||||
@@ -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/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)
|
||||
|
||||
@@ -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:35:58.958021 7f78e2ffd6c0 Recovering log #1301
|
||||
2026/03/05-20:35:59.014393 7f78e2ffd6c0 Delete type=3 #1299
|
||||
2026/03/05-20:35:59.014563 7f78e2ffd6c0 Delete type=0 #1301
|
||||
2026/03/05-20:36:36.801154 7f78e15b46c0 Level-0 table #1306: started
|
||||
2026/03/05-20:36:36.801207 7f78e15b46c0 Level-0 table #1306: 0 bytes OK
|
||||
2026/03/05-20:36:36.851951 7f78e15b46c0 Delete type=0 #1304
|
||||
2026/03/05-20:36:36.886757 7f78e15b46c0 Manual compaction at level-0 from '!journal!3IgmiprzLB6Lwenc' @ 72057594037927935 : 1 .. '!journal.pages!suuYN87Al1ZZWtQQ.jhgNnhWhrkOpKs1B' @ 0 : 0; will stop at (end)
|
||||
|
||||
Binary file not shown.
@@ -1 +1 @@
|
||||
MANIFEST-001253
|
||||
MANIFEST-001309
|
||||
|
||||
@@ -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/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)
|
||||
|
||||
@@ -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:35:59.019628 7f7930fff6c0 Recovering log #1303
|
||||
2026/03/05-20:35:59.074111 7f7930fff6c0 Delete type=3 #1301
|
||||
2026/03/05-20:35:59.074362 7f7930fff6c0 Delete type=0 #1303
|
||||
2026/03/05-20:36:37.079874 7f78e15b46c0 Level-0 table #1308: started
|
||||
2026/03/05-20:36:37.079944 7f78e15b46c0 Level-0 table #1308: 0 bytes OK
|
||||
2026/03/05-20:36:37.117249 7f78e15b46c0 Delete type=0 #1306
|
||||
2026/03/05-20:36:37.117631 7f78e15b46c0 Manual compaction at level-0 from '!folders!3uquYH73ttCdoH0I' @ 72057594037927935 : 1 .. '!items!ylFhk7mGZOnAJTUT' @ 0 : 0; will stop at (end)
|
||||
|
||||
Binary file not shown.
@@ -1 +1 @@
|
||||
MANIFEST-001251
|
||||
MANIFEST-001307
|
||||
|
||||
@@ -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/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)
|
||||
|
||||
@@ -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:35:59.141622 7f7930fff6c0 Recovering log #1301
|
||||
2026/03/05-20:35:59.197458 7f7930fff6c0 Delete type=3 #1299
|
||||
2026/03/05-20:35:59.197605 7f7930fff6c0 Delete type=0 #1301
|
||||
2026/03/05-20:36:36.998926 7f78e15b46c0 Level-0 table #1306: started
|
||||
2026/03/05-20:36:36.999012 7f78e15b46c0 Level-0 table #1306: 0 bytes OK
|
||||
2026/03/05-20:36:37.079601 7f78e15b46c0 Delete type=0 #1304
|
||||
2026/03/05-20:36:37.117606 7f78e15b46c0 Manual compaction at level-0 from '!journal!cZtNgayIw2QFhC9u' @ 72057594037927935 : 1 .. '!journal.pages!cZtNgayIw2QFhC9u.ts265H1XkisLgdow' @ 0 : 0; will stop at (end)
|
||||
|
||||
Binary file not shown.
@@ -1 +1 @@
|
||||
MANIFEST-001251
|
||||
MANIFEST-001307
|
||||
|
||||
@@ -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/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)
|
||||
|
||||
@@ -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:35:58.885055 7f78e37fe6c0 Recovering log #1301
|
||||
2026/03/05-20:35:58.952601 7f78e37fe6c0 Delete type=3 #1299
|
||||
2026/03/05-20:35:58.952732 7f78e37fe6c0 Delete type=0 #1301
|
||||
2026/03/05-20:36:36.852227 7f78e15b46c0 Level-0 table #1306: started
|
||||
2026/03/05-20:36:36.852283 7f78e15b46c0 Level-0 table #1306: 0 bytes OK
|
||||
2026/03/05-20:36:36.886395 7f78e15b46c0 Delete type=0 #1304
|
||||
2026/03/05-20:36:36.886780 7f78e15b46c0 Manual compaction at level-0 from '!journal!50u8VAjdmovyr0hx' @ 72057594037927935 : 1 .. '!journal.pages!yzw9I0r3hCK7PJnz.sPNCYj2nR3Cp3jHd' @ 0 : 0; will stop at (end)
|
||||
|
||||
Binary file not shown.
@@ -1 +1 @@
|
||||
MANIFEST-001251
|
||||
MANIFEST-001307
|
||||
|
||||
@@ -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/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)
|
||||
|
||||
@@ -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:35:58.822672 7f78e2ffd6c0 Recovering log #1301
|
||||
2026/03/05-20:35:58.879917 7f78e2ffd6c0 Delete type=3 #1299
|
||||
2026/03/05-20:35:58.880051 7f78e2ffd6c0 Delete type=0 #1301
|
||||
2026/03/05-20:36:36.762561 7f78e15b46c0 Level-0 table #1306: started
|
||||
2026/03/05-20:36:36.762639 7f78e15b46c0 Level-0 table #1306: 0 bytes OK
|
||||
2026/03/05-20:36:36.800890 7f78e15b46c0 Delete type=0 #1304
|
||||
2026/03/05-20:36:36.886730 7f78e15b46c0 Manual compaction at level-0 from '!tables!4l60Lxv8cpsyy2Cg' @ 72057594037927935 : 1 .. '!tables.results!tfaYKDZqu7kgZvRG.yvbwKursaixh2dby' @ 0 : 0; will stop at (end)
|
||||
|
||||
Binary file not shown.
@@ -1 +1 @@
|
||||
MANIFEST-000894
|
||||
MANIFEST-000950
|
||||
|
||||
@@ -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/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)
|
||||
|
||||
@@ -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:35:59.080273 7f78e2ffd6c0 Recovering log #944
|
||||
2026/03/05-20:35:59.136381 7f78e2ffd6c0 Delete type=3 #942
|
||||
2026/03/05-20:35:59.136563 7f78e2ffd6c0 Delete type=0 #944
|
||||
2026/03/05-20:36:36.924587 7f78e15b46c0 Level-0 table #949: started
|
||||
2026/03/05-20:36:36.924663 7f78e15b46c0 Level-0 table #949: 0 bytes OK
|
||||
2026/03/05-20:36:36.998629 7f78e15b46c0 Delete type=0 #947
|
||||
2026/03/05-20:36:37.117578 7f78e15b46c0 Manual compaction at level-0 from '!journal!056ILNNrLiPq3Gi3' @ 72057594037927935 : 1 .. '!journal.pages!yfZxl4I7XAuUF6r3.apXmOlZRmGT4GreB' @ 0 : 0; will stop at (end)
|
||||
|
||||
Binary file not shown.
@@ -1,2 +0,0 @@
|
||||
let item = await fromUuid("Compendium.wfrp4e-core.items.weczkAMPlTjX7lqU")
|
||||
this.actor.createEmbeddedDocuments("Item", [item])
|
||||
@@ -1 +0,0 @@
|
||||
return args.item?.system?.isRanged && args.data.targets[0]?.actor?.sizeNum < 3
|
||||
@@ -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>
|
||||
It’s 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 })
|
||||
@@ -1 +0,0 @@
|
||||
this.actor.addCondition("blinded", 3)
|
||||
@@ -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])
|
||||
@@ -1,5 +0,0 @@
|
||||
if (!args.flags.quietenedApplied)
|
||||
{
|
||||
args.fields.modifier += 10;
|
||||
args.flags.quietenedApplied = true
|
||||
}
|
||||
@@ -1 +0,0 @@
|
||||
return !args.options.terror && !args.extendedTest?.flags.wfrp4e?.fear
|
||||
@@ -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`)
|
||||
}
|
||||
@@ -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})
|
||||
@@ -1 +0,0 @@
|
||||
return !["t", "wp"].includes(args.characteristic)
|
||||
@@ -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)
|
||||
}
|
||||
@@ -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})
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
@@ -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})
|
||||
@@ -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})
|
||||
@@ -1 +0,0 @@
|
||||
args.fields.modifier -= 20;
|
||||
@@ -1,7 +0,0 @@
|
||||
if (!args.flags.strikeToStun)
|
||||
{
|
||||
args.flags.strikeToStun = true
|
||||
args.fields.modifier += 20;
|
||||
args.fields.hitLocation = "head";
|
||||
}
|
||||
args.fields.successBonus++;
|
||||
@@ -1 +0,0 @@
|
||||
return args.options.terror || args.extendedTest?.flags.wfrp4e?.fear
|
||||
@@ -1,6 +0,0 @@
|
||||
let type = this.item.getFlag("wfrp4e", "breath");
|
||||
|
||||
if (["fire", "electricity", "poison"].includes(type))
|
||||
{
|
||||
args.applyAP = false;
|
||||
}
|
||||
@@ -1 +0,0 @@
|
||||
args.fields.modifier -= 20
|
||||
@@ -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});
|
||||
@@ -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})
|
||||
}
|
||||
@@ -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);
|
||||
|
||||
@@ -1 +0,0 @@
|
||||
return args.characteristic != "t"
|
||||
@@ -1 +0,0 @@
|
||||
args.actor.details.move.run += 4
|
||||
@@ -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}))
|
||||
@@ -1 +0,0 @@
|
||||
return args.characteristic != "wp"
|
||||
@@ -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();
|
||||
}
|
||||
@@ -1 +0,0 @@
|
||||
args.options.cardsharp = true;
|
||||
@@ -1,5 +0,0 @@
|
||||
if (args.opposedTest.result.hitloc.value == this.item.system.location.key && args.totalWoundLoss > 0)
|
||||
{
|
||||
args.actor.addCondition("bleeding", 2);
|
||||
}
|
||||
|
||||
@@ -1 +0,0 @@
|
||||
return ["ws", "bs", "s", "ag", "t", "dex"].includes(args.characteristic)
|
||||
@@ -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")
|
||||
}
|
||||
|
||||
@@ -1 +0,0 @@
|
||||
this.actor.status.addArmour(1, {source: this.effect, magical : true})
|
||||
@@ -1 +0,0 @@
|
||||
this.script.scriptNotification(`Cannot enter ${this.effect.name}!`);
|
||||
@@ -1,3 +0,0 @@
|
||||
let healed = parseInt(this.effect.sourceTest.result.SL)
|
||||
this.actor.modifyWounds(healed)
|
||||
this.script.scriptMessage(`Healed ${healed} Wounds`)
|
||||
@@ -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");
|
||||
@@ -1 +0,0 @@
|
||||
args.options.ballockKnife = true;
|
||||
@@ -1,2 +0,0 @@
|
||||
if (args.effect.conditionId == "bleeding")
|
||||
args.data.damage -= 1
|
||||
@@ -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})
|
||||
}
|
||||
@@ -1 +0,0 @@
|
||||
return args.options.reload
|
||||
@@ -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})
|
||||
@@ -1 +0,0 @@
|
||||
game.wfrp4e.utility.postCorruptionTest(this.item.system.specification.value, {speaker : {alias: this.actor.prototypeToken.name}})
|
||||
@@ -1 +0,0 @@
|
||||
return args.item?.system.attackType
|
||||
@@ -1 +0,0 @@
|
||||
return !["fel"].includes(args.characteristic)
|
||||
@@ -1 +0,0 @@
|
||||
args.fields.slBonus += this.actor.system.characteristics.wp.bonus
|
||||
@@ -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});
|
||||
}
|
||||
}
|
||||
@@ -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)
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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")
|
||||
}
|
||||
@@ -1,4 +0,0 @@
|
||||
if (args.test.isFumble)
|
||||
{
|
||||
args.test.result.other.push("@Table[doomrocket-fumble]")
|
||||
}
|
||||
@@ -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})
|
||||
@@ -1 +0,0 @@
|
||||
args.prefillModifiers.difficulty = "hard"
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
@@ -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)
|
||||
@@ -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})
|
||||
@@ -1,2 +0,0 @@
|
||||
args.data.canReverse = true;
|
||||
args.options.fieldDressing = true;
|
||||
@@ -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)
|
||||
@@ -1,4 +0,0 @@
|
||||
if (args.item.type == "spell")
|
||||
{
|
||||
args.item.cn.value = Math.floor(args.item.cn.value / 2)
|
||||
}
|
||||
@@ -1 +0,0 @@
|
||||
return !args.options.handling
|
||||
@@ -1 +0,0 @@
|
||||
this.script.scriptMessage(await this.actor.applyBasicDamage(8, {damageType : game.wfrp4e.config.DAMAGE_TYPE.IGNORE_AP, suppressMsg: true}))
|
||||
@@ -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
Reference in New Issue
Block a user