Compare commits
10 Commits
foundryvtt
...
9.4.5
| Author | SHA1 | Date | |
|---|---|---|---|
| 047933a610 | |||
| b489f65618 | |||
| 406a535c76 | |||
| 5bc6d0d2f5 | |||
| d557fac83f | |||
| f07ef0b01d | |||
| 301cc830bc | |||
| 786afeab74 | |||
| e0383def30 | |||
| 7dc51444f0 |
89
.gitea/workflows/release.yaml
Normal file
89
.gitea/workflows/release.yaml
Normal file
@@ -0,0 +1,89 @@
|
||||
name: Release Creation
|
||||
|
||||
on:
|
||||
release:
|
||||
types: [published]
|
||||
|
||||
jobs:
|
||||
build:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- run: echo "💡 The ${{ gitea.repository }} repository will be cloned to the runner."
|
||||
|
||||
- uses: RouxAntoine/checkout@v3.5.4
|
||||
|
||||
# Valider les JSON avant de packager
|
||||
- name: Valider fr.json et module.json
|
||||
run: |
|
||||
python3 -mjson.tool fr.json > /dev/null
|
||||
python3 -mjson.tool module.json > /dev/null
|
||||
|
||||
# Générer modules/loadScripts.js depuis scripts/
|
||||
- name: Build (génération de loadScripts.js)
|
||||
run: node scriptPacker.js
|
||||
|
||||
# Extraire le numéro de version depuis le tag (sans le 'v' initial)
|
||||
- name: Extraire la version depuis le tag
|
||||
id: get_version
|
||||
uses: battila7/get-version-action@v2
|
||||
|
||||
# Mettre à jour version, url, manifest et download dans module.json
|
||||
- name: Substituer les URLs de Manifest et Download
|
||||
id: sub_manifest_link_version
|
||||
uses: microsoft/variable-substitution@v1
|
||||
with:
|
||||
files: 'module.json'
|
||||
env:
|
||||
version: ${{ steps.get_version.outputs.version-without-v }}
|
||||
url: https://www.uberwald.me/gitea/${{ gitea.repository }}
|
||||
manifest: https://www.uberwald.me/gitea/public/foundryvtt-wh4-lang-fr-fr/releases/download/latest/module.json
|
||||
download: https://www.uberwald.me/gitea/${{ gitea.repository }}/releases/download/${{ github.event.release.tag_name }}/foundryvtt-wh4-lang-fr-fr.zip
|
||||
|
||||
# Créer le zip avec uniquement les fichiers nécessaires au module Foundry
|
||||
- name: Installer zip
|
||||
run: |
|
||||
apt update -y
|
||||
apt install -y zip
|
||||
|
||||
- name: Créer l'archive foundryvtt-wh4-lang-fr-fr.zip
|
||||
run: >
|
||||
zip -r ./foundryvtt-wh4-lang-fr-fr.zip
|
||||
module.json
|
||||
fr.json
|
||||
wh4_fr.js
|
||||
patch-styles.css
|
||||
README.md
|
||||
LICENSE
|
||||
compendium/
|
||||
modules/
|
||||
packs/
|
||||
icons/
|
||||
images/
|
||||
trade/
|
||||
|
||||
# Publier le zip et le module.json sur la release Gitea
|
||||
- name: setup go
|
||||
uses: https://github.com/actions/setup-go@v4
|
||||
with:
|
||||
go-version: '>=1.20.1'
|
||||
|
||||
- name: Publier les assets sur la release Gitea
|
||||
id: use-go-action
|
||||
uses: https://gitea.com/actions/release-action@main
|
||||
with:
|
||||
files: |-
|
||||
./foundryvtt-wh4-lang-fr-fr.zip
|
||||
module.json
|
||||
api_key: '${{ secrets.ALLOW_PUSH_RELEASE }}'
|
||||
|
||||
# Déclarer la release sur le portail FoundryVTT
|
||||
- name: Publier sur FoundryVTT
|
||||
uses: https://github.com/djlechuck/foundryvtt-publish-package-action@v1
|
||||
with:
|
||||
token: ${{ secrets.FOUNDRYVTT_RELEASE_TOKEN }}
|
||||
id: 'wh4-fr-translation'
|
||||
version: ${{ github.event.release.tag_name }}
|
||||
manifest: 'https://www.uberwald.me/gitea/public/foundryvtt-wh4-lang-fr-fr/releases/download/latest/module.json'
|
||||
notes: 'https://www.uberwald.me/gitea/${{ gitea.repository }}/releases/tag/${{ github.event.release.tag_name }}'
|
||||
compatibility-minimum: '13'
|
||||
compatibility-verified: '13'
|
||||
19
.gitea/workflows/validate.yaml
Normal file
19
.gitea/workflows/validate.yaml
Normal file
@@ -0,0 +1,19 @@
|
||||
name: Validation JSON
|
||||
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- '**'
|
||||
pull_request:
|
||||
|
||||
jobs:
|
||||
validate:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: RouxAntoine/checkout@v3.5.4
|
||||
|
||||
- name: Valider fr.json
|
||||
run: python3 -mjson.tool fr.json > /dev/null
|
||||
|
||||
- name: Valider module.json
|
||||
run: python3 -mjson.tool module.json > /dev/null
|
||||
@@ -1,29 +0,0 @@
|
||||
image: python:3-alpine
|
||||
|
||||
before_script:
|
||||
- apk update
|
||||
- apk add zip
|
||||
|
||||
stages:
|
||||
- test
|
||||
- build
|
||||
|
||||
test:
|
||||
stage: test
|
||||
script:
|
||||
- python -mjson.tool 'fr.json' > /dev/null
|
||||
- python -mjson.tool 'module.json' > /dev/null
|
||||
|
||||
build:
|
||||
stage: build
|
||||
script:
|
||||
- zip wh4-fr-FR.zip -r *.js *.json *.md compendium lang tables -x ".*"
|
||||
artifacts:
|
||||
name: wh4-fr-FR
|
||||
when: on_success
|
||||
paths:
|
||||
- wh4-fr-FR.zip
|
||||
when: on_success
|
||||
only:
|
||||
- tags
|
||||
- master
|
||||
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('');
|
||||
});
|
||||
}
|
||||
@@ -5,9 +5,6 @@
|
||||
},
|
||||
{
|
||||
"path": "../WFRP4e-FoundryVTT"
|
||||
},
|
||||
{
|
||||
"path": "../WarhammerLibrary-FVTT"
|
||||
}
|
||||
],
|
||||
"settings": {}
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
}
|
||||
],
|
||||
"url": "https://www.uberwald.me/gitea/public/foundryvtt-wh4-lang-fr-fr",
|
||||
"version": "9.3.6",
|
||||
"version": "9.4.3",
|
||||
"esmodules": [
|
||||
"wh4_fr.js",
|
||||
"modules/babele-register.js",
|
||||
@@ -119,8 +119,8 @@
|
||||
"folders": []
|
||||
}
|
||||
],
|
||||
"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-6.zip",
|
||||
"manifest": "https://www.uberwald.me/gitea/public/foundryvtt-wh4-lang-fr-fr/releases/download/latest/module.json",
|
||||
"download": "https://www.uberwald.me/gitea/public/foundryvtt-wh4-lang-fr-fr/releases/download/latest/foundryvtt-wh4-lang-fr-fr.zip",
|
||||
"id": "wh4-fr-translation",
|
||||
"compatibility": {
|
||||
"minimum": "13",
|
||||
|
||||
@@ -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;
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@@ -424,10 +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) {
|
||||
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-001279
|
||||
MANIFEST-001311
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
2026/01/29-10:58:42.937989 7fac277fe6c0 Recovering log #1277
|
||||
2026/01/29-10:58:42.947978 7fac277fe6c0 Delete type=3 #1275
|
||||
2026/01/29-10:58:42.948038 7fac277fe6c0 Delete type=0 #1277
|
||||
2026/01/29-11:43:15.082893 7fa9a6fef6c0 Level-0 table #1282: started
|
||||
2026/01/29-11:43:15.082936 7fa9a6fef6c0 Level-0 table #1282: 0 bytes OK
|
||||
2026/01/29-11:43:15.089469 7fa9a6fef6c0 Delete type=0 #1280
|
||||
2026/01/29-11:43:15.099933 7fa9a6fef6c0 Manual compaction at level-0 from '!journal!3IgmiprzLB6Lwenc' @ 72057594037927935 : 1 .. '!journal.pages!suuYN87Al1ZZWtQQ.jhgNnhWhrkOpKs1B' @ 0 : 0; will stop at (end)
|
||||
2026/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)
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
2026/01/29-10:52:14.344493 7fac277fe6c0 Recovering log #1273
|
||||
2026/01/29-10:52:14.354354 7fac277fe6c0 Delete type=3 #1271
|
||||
2026/01/29-10:52:14.354436 7fac277fe6c0 Delete type=0 #1273
|
||||
2026/01/29-10:55:44.810919 7fa9a6fef6c0 Level-0 table #1278: started
|
||||
2026/01/29-10:55:44.810962 7fa9a6fef6c0 Level-0 table #1278: 0 bytes OK
|
||||
2026/01/29-10:55:44.820672 7fa9a6fef6c0 Delete type=0 #1276
|
||||
2026/01/29-10:55:44.820811 7fa9a6fef6c0 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)
|
||||
|
||||
Binary file not shown.
@@ -1 +1 @@
|
||||
MANIFEST-001281
|
||||
MANIFEST-001313
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
2026/01/29-10:58:42.950367 7fac277fe6c0 Recovering log #1279
|
||||
2026/01/29-10:58:42.959516 7fac277fe6c0 Delete type=3 #1277
|
||||
2026/01/29-10:58:42.959596 7fac277fe6c0 Delete type=0 #1279
|
||||
2026/01/29-11:43:14.910167 7fa9a6fef6c0 Level-0 table #1284: started
|
||||
2026/01/29-11:43:14.910204 7fa9a6fef6c0 Level-0 table #1284: 0 bytes OK
|
||||
2026/01/29-11:43:14.916676 7fa9a6fef6c0 Delete type=0 #1282
|
||||
2026/01/29-11:43:14.924493 7fa9a6fef6c0 Manual compaction at level-0 from '!folders!3uquYH73ttCdoH0I' @ 72057594037927935 : 1 .. '!items!ylFhk7mGZOnAJTUT' @ 0 : 0; will stop at (end)
|
||||
2026/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)
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
2026/01/29-10:52:14.356741 7fac27fff6c0 Recovering log #1275
|
||||
2026/01/29-10:52:14.366627 7fac27fff6c0 Delete type=3 #1273
|
||||
2026/01/29-10:52:14.366686 7fac27fff6c0 Delete type=0 #1275
|
||||
2026/01/29-10:55:44.821680 7fa9a6fef6c0 Level-0 table #1280: started
|
||||
2026/01/29-10:55:44.821714 7fa9a6fef6c0 Level-0 table #1280: 0 bytes OK
|
||||
2026/01/29-10:55:44.835173 7fa9a6fef6c0 Delete type=0 #1278
|
||||
2026/01/29-10:55:44.835325 7fa9a6fef6c0 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)
|
||||
|
||||
Binary file not shown.
@@ -1 +1 @@
|
||||
MANIFEST-001279
|
||||
MANIFEST-001311
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
2026/01/29-10:58:42.977033 7fac3cbfe6c0 Recovering log #1277
|
||||
2026/01/29-10:58:42.986296 7fac3cbfe6c0 Delete type=3 #1275
|
||||
2026/01/29-10:58:42.986342 7fac3cbfe6c0 Delete type=0 #1277
|
||||
2026/01/29-11:43:14.924604 7fa9a6fef6c0 Level-0 table #1282: started
|
||||
2026/01/29-11:43:14.924660 7fa9a6fef6c0 Level-0 table #1282: 0 bytes OK
|
||||
2026/01/29-11:43:14.930959 7fa9a6fef6c0 Delete type=0 #1280
|
||||
2026/01/29-11:43:14.954971 7fa9a6fef6c0 Manual compaction at level-0 from '!journal!cZtNgayIw2QFhC9u' @ 72057594037927935 : 1 .. '!journal.pages!cZtNgayIw2QFhC9u.ts265H1XkisLgdow' @ 0 : 0; will stop at (end)
|
||||
2026/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)
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
2026/01/29-10:52:14.382212 7fac27fff6c0 Recovering log #1273
|
||||
2026/01/29-10:52:14.391540 7fac27fff6c0 Delete type=3 #1271
|
||||
2026/01/29-10:52:14.391602 7fac27fff6c0 Delete type=0 #1273
|
||||
2026/01/29-10:55:44.848192 7fa9a6fef6c0 Level-0 table #1278: started
|
||||
2026/01/29-10:55:44.848229 7fa9a6fef6c0 Level-0 table #1278: 0 bytes OK
|
||||
2026/01/29-10:55:44.858087 7fa9a6fef6c0 Delete type=0 #1276
|
||||
2026/01/29-10:55:44.858262 7fa9a6fef6c0 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)
|
||||
|
||||
Binary file not shown.
@@ -1 +1 @@
|
||||
MANIFEST-001279
|
||||
MANIFEST-001311
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
2026/01/29-10:58:42.926104 7fac277fe6c0 Recovering log #1277
|
||||
2026/01/29-10:58:42.935779 7fac277fe6c0 Delete type=3 #1275
|
||||
2026/01/29-10:58:42.935842 7fac277fe6c0 Delete type=0 #1277
|
||||
2026/01/29-11:43:14.916846 7fa9a6fef6c0 Level-0 table #1282: started
|
||||
2026/01/29-11:43:14.916889 7fa9a6fef6c0 Level-0 table #1282: 0 bytes OK
|
||||
2026/01/29-11:43:14.924373 7fa9a6fef6c0 Delete type=0 #1280
|
||||
2026/01/29-11:43:14.924501 7fa9a6fef6c0 Manual compaction at level-0 from '!journal!50u8VAjdmovyr0hx' @ 72057594037927935 : 1 .. '!journal.pages!yzw9I0r3hCK7PJnz.sPNCYj2nR3Cp3jHd' @ 0 : 0; will stop at (end)
|
||||
2026/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)
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
2026/01/29-10:52:14.331605 7fac3d3ff6c0 Recovering log #1273
|
||||
2026/01/29-10:52:14.341908 7fac3d3ff6c0 Delete type=3 #1271
|
||||
2026/01/29-10:52:14.341974 7fac3d3ff6c0 Delete type=0 #1273
|
||||
2026/01/29-10:55:44.799059 7fa9a6fef6c0 Level-0 table #1278: started
|
||||
2026/01/29-10:55:44.799092 7fa9a6fef6c0 Level-0 table #1278: 0 bytes OK
|
||||
2026/01/29-10:55:44.809892 7fa9a6fef6c0 Delete type=0 #1276
|
||||
2026/01/29-10:55:44.810048 7fa9a6fef6c0 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)
|
||||
|
||||
Binary file not shown.
@@ -1 +1 @@
|
||||
MANIFEST-001279
|
||||
MANIFEST-001311
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
2026/01/29-10:58:42.911172 7fac3cbfe6c0 Recovering log #1277
|
||||
2026/01/29-10:58:42.922025 7fac3cbfe6c0 Delete type=3 #1275
|
||||
2026/01/29-10:58:42.922081 7fac3cbfe6c0 Delete type=0 #1277
|
||||
2026/01/29-11:43:14.903068 7fa9a6fef6c0 Level-0 table #1282: started
|
||||
2026/01/29-11:43:14.903107 7fa9a6fef6c0 Level-0 table #1282: 0 bytes OK
|
||||
2026/01/29-11:43:14.910024 7fa9a6fef6c0 Delete type=0 #1280
|
||||
2026/01/29-11:43:14.924484 7fa9a6fef6c0 Manual compaction at level-0 from '!tables!4l60Lxv8cpsyy2Cg' @ 72057594037927935 : 1 .. '!tables.results!tfaYKDZqu7kgZvRG.yvbwKursaixh2dby' @ 0 : 0; will stop at (end)
|
||||
2026/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)
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
2026/01/29-10:52:14.318846 7fac277fe6c0 Recovering log #1273
|
||||
2026/01/29-10:52:14.328479 7fac277fe6c0 Delete type=3 #1271
|
||||
2026/01/29-10:52:14.328545 7fac277fe6c0 Delete type=0 #1273
|
||||
2026/01/29-10:55:44.787338 7fa9a6fef6c0 Level-0 table #1278: started
|
||||
2026/01/29-10:55:44.787395 7fa9a6fef6c0 Level-0 table #1278: 0 bytes OK
|
||||
2026/01/29-10:55:44.798087 7fa9a6fef6c0 Delete type=0 #1276
|
||||
2026/01/29-10:55:44.798228 7fa9a6fef6c0 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)
|
||||
|
||||
Binary file not shown.
@@ -1 +1 @@
|
||||
MANIFEST-000922
|
||||
MANIFEST-000954
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
2026/01/29-10:58:42.964451 7fac3cbfe6c0 Recovering log #920
|
||||
2026/01/29-10:58:42.974523 7fac3cbfe6c0 Delete type=3 #918
|
||||
2026/01/29-10:58:42.974583 7fac3cbfe6c0 Delete type=0 #920
|
||||
2026/01/29-11:43:14.948296 7fa9a6fef6c0 Level-0 table #925: started
|
||||
2026/01/29-11:43:14.948359 7fa9a6fef6c0 Level-0 table #925: 0 bytes OK
|
||||
2026/01/29-11:43:14.954859 7fa9a6fef6c0 Delete type=0 #923
|
||||
2026/01/29-11:43:14.955000 7fa9a6fef6c0 Manual compaction at level-0 from '!journal!056ILNNrLiPq3Gi3' @ 72057594037927935 : 1 .. '!journal.pages!yfZxl4I7XAuUF6r3.apXmOlZRmGT4GreB' @ 0 : 0; will stop at (end)
|
||||
2026/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)
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
2026/01/29-10:52:14.369127 7fac277fe6c0 Recovering log #916
|
||||
2026/01/29-10:52:14.379523 7fac277fe6c0 Delete type=3 #914
|
||||
2026/01/29-10:52:14.379589 7fac277fe6c0 Delete type=0 #916
|
||||
2026/01/29-10:55:44.836202 7fa9a6fef6c0 Level-0 table #921: started
|
||||
2026/01/29-10:55:44.836244 7fa9a6fef6c0 Level-0 table #921: 0 bytes OK
|
||||
2026/01/29-10:55:44.847287 7fa9a6fef6c0 Delete type=0 #919
|
||||
2026/01/29-10:55:44.847494 7fa9a6fef6c0 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)
|
||||
|
||||
Binary file not shown.
1
scripts/0FNOq4J1AdPd2A0q.js
Normal file
1
scripts/0FNOq4J1AdPd2A0q.js
Normal file
@@ -0,0 +1 @@
|
||||
return !args.skill?.name.includes(game.i18n.localize("NAME.Row")) && !args.skill?.name.includes(game.i18n.localize("NAME.Sail"));
|
||||
4
scripts/0J1yHP1jkGR9y89H.js
Normal file
4
scripts/0J1yHP1jkGR9y89H.js
Normal file
@@ -0,0 +1,4 @@
|
||||
if (!this.item.system.properties.qualities.fast)
|
||||
this.item.system.qualities.value.push({name : 'fast'});
|
||||
if (!this.item.system.properties.qualities.magical)
|
||||
this.item.system.qualities.value.push({name : 'magical'});
|
||||
9
scripts/0YKQGbsKdHSmYGE7.js
Normal file
9
scripts/0YKQGbsKdHSmYGE7.js
Normal file
@@ -0,0 +1,9 @@
|
||||
if (args.skill?.name != game.i18n.localize("NAME.Gossip"))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
args.data.reversal = {allowed : true, if: "success"}; // Kind of a kludge here, the talent Tests has a specific condition, but the description simply says "any gossip test can be reversed" so check it here instead of submission
|
||||
}
|
||||
|
||||
7
scripts/0mrUnxzufYgsR0Ph.js
Normal file
7
scripts/0mrUnxzufYgsR0Ph.js
Normal file
@@ -0,0 +1,7 @@
|
||||
this.actor.setupSkill(game.i18n.localize("NAME.Cool"), {skipTargets: true, appendTitle : ` - ${this.effect.name}`}).then(async test => {
|
||||
await test.roll()
|
||||
if (test.failed)
|
||||
{
|
||||
this.actor.addCondition("stunned")
|
||||
}
|
||||
})
|
||||
18
scripts/11ir8nibM5HD69na.js
Normal file
18
scripts/11ir8nibM5HD69na.js
Normal file
@@ -0,0 +1,18 @@
|
||||
const balanced = game.i18n.localize("WFRP4E.YenluiBalanced");
|
||||
const light = game.i18n.localize("WFRP4E.YenluiLight");
|
||||
const dark = game.i18n.localize("WFRP4E.YenluiDark");
|
||||
|
||||
let newName, newDescription;
|
||||
|
||||
if (this.effect.name === game.i18n.localize("WFRP4E.YenluiDark")) {
|
||||
newName = game.i18n.localize("WFRP4E.YenluiBalanced");
|
||||
newDescription = game.i18n.localize("WFRP4E.YenluiBalancedDesc");
|
||||
} else if (this.effect.name === game.i18n.localize("WFRP4E.YenluiBalanced")) {
|
||||
newName = game.i18n.localize("WFRP4E.YenluiLight");
|
||||
newDescription = game.i18n.localize("WFRP4E.YenluiLightDesc");
|
||||
}
|
||||
|
||||
if (newName) {
|
||||
await this.effect.update({name: newName});
|
||||
await this.item.update({name: newName, "system.description.value": newDescription});
|
||||
}
|
||||
@@ -1,31 +1,28 @@
|
||||
if (!this.item.name.includes("(") || this.item.system.tests.value.includes("Terrain") || this.item.system.tests.value.toLowerCase().includes("(any)"))
|
||||
{
|
||||
let Tests = this.item.system.tests.value
|
||||
let name = this.item.name
|
||||
if (!this.item.name.includes("(") || this.item.system.tests.value.includes("Terrain") || this.item.system.tests.value.toLowerCase().includes("(any)")) {
|
||||
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("(") && !name.toLowerCase().includes("(any)"))
|
||||
{
|
||||
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 : "Littoral",
|
||||
deserts : "Déserts",
|
||||
marshes : "Marécages",
|
||||
rocky : "Rocailleux",
|
||||
tundra : "Toundra",
|
||||
woodlands : "Régions boisées"
|
||||
}, this.item.img), 1, "Choisissez un Terrain");
|
||||
if (choice[0])
|
||||
{
|
||||
name = `${name.split("(")[0].trim()} (${choice[0].name})`
|
||||
tests = tests.replace("Terrain", choice[0].name + " Terrain")
|
||||
}
|
||||
// If name already specifies, make sure Tests value reflects that
|
||||
if (name.includes("(") && !name.toLowerCase().includes("(any)")) {
|
||||
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: "Littoral",
|
||||
deserts: "Déserts",
|
||||
marshes: "Marécages",
|
||||
rocky: "Rocailleux",
|
||||
tundra: "Toundra",
|
||||
woodlands: "Régions boisées"
|
||||
}, this.item.img), 1, "Choisissez un Terrain");
|
||||
if (choice[0]) {
|
||||
name = `${name.split("(")[0].trim()} (${choice[0].name})`
|
||||
tests = tests.replace("Terrain", choice[0].name + " Terrain")
|
||||
}
|
||||
}
|
||||
|
||||
this.effect.updateSource({name})
|
||||
this.item.updateSource({name, "system.tests.value" : tests})
|
||||
this.effect.updateSource({ name })
|
||||
this.item.updateSource({ name, "system.tests.value": tests })
|
||||
}
|
||||
1
scripts/1A87vGLh2PXH0rG0.js
Normal file
1
scripts/1A87vGLh2PXH0rG0.js
Normal file
@@ -0,0 +1 @@
|
||||
return !args.skill?.name.includes(game.i18n.localize("NAME.Language"));
|
||||
1
scripts/1LDSzXeO5CzXgTOc.js
Normal file
1
scripts/1LDSzXeO5CzXgTOc.js
Normal file
@@ -0,0 +1 @@
|
||||
return args.skill?.name.includes(game.i18n.localize("NAME.Channelling")) || args.skill?.name == `${game.i18n.localize("NAME.Language")} (${game.i18n.localize("SPEC.Magick")})`
|
||||
3
scripts/1XAilPQEyMWVPA5z.js
Normal file
3
scripts/1XAilPQEyMWVPA5z.js
Normal file
@@ -0,0 +1,3 @@
|
||||
const qualities = foundry.utils.deepClone(args.item.system.qualities.value);
|
||||
qualities.push({name:"fine", value: 1});
|
||||
args.item?.update({"system.qualities.value": qualities});
|
||||
19
scripts/1kB2su7hLRYDhZ2H.js
Normal file
19
scripts/1kB2su7hLRYDhZ2H.js
Normal file
@@ -0,0 +1,19 @@
|
||||
let test = await this.actor.setupSkill(game.i18n.localize("NAME.Endurance"), {skipTargets: true, appendTitle : " - " + this.effect.name})
|
||||
await test.roll();
|
||||
if (!test.succeeded)
|
||||
{
|
||||
let item = await fromUuid("Compendium.wfrp4e-core.items.ZhMADOqoo0y8Q9bx")
|
||||
let data = item.toObject();
|
||||
if (this.item.system.location.key == "rLeg")
|
||||
{
|
||||
data.system.location.value = "Orteil Droit"
|
||||
data.system.location.key = "rToe";
|
||||
}
|
||||
else if (this.item.system.location.key == "lLeg")
|
||||
{
|
||||
data.system.location.value = "Orteil Gauche"
|
||||
data.system.location.key = "lToe";
|
||||
}
|
||||
this.actor.createEmbeddedDocuments("Item", [data])
|
||||
}
|
||||
this.effect.delete();
|
||||
7
scripts/1mNkLj9JYNr3ofC6.js
Normal file
7
scripts/1mNkLj9JYNr3ofC6.js
Normal file
@@ -0,0 +1,7 @@
|
||||
this.actor.setupSkill(game.i18n.localize("NAME.Cool"), {skipTargets: true, appendTitle : ` - ${this.effect.name}`}).then(async test => {
|
||||
await test.roll();
|
||||
if (test.failed)
|
||||
{
|
||||
this.actor.addCondition("stunned", 3)
|
||||
}
|
||||
})
|
||||
1
scripts/1wKVvxRTHOyV4Qdv.js
Normal file
1
scripts/1wKVvxRTHOyV4Qdv.js
Normal file
@@ -0,0 +1 @@
|
||||
return !args.skill?.name?.includes(game.i18n.localize("NAME.Sail"))
|
||||
1
scripts/22bW97lkvCqisfHX.js
Normal file
1
scripts/22bW97lkvCqisfHX.js
Normal file
@@ -0,0 +1 @@
|
||||
return args.type != "channelling" && !args.skill?.name.includes(game.i18n.localize("NAME.Channelling"))
|
||||
5
scripts/23HgjCB1oecxANvA.js
Normal file
5
scripts/23HgjCB1oecxANvA.js
Normal file
@@ -0,0 +1,5 @@
|
||||
if (args.item.range && args.item.range.bands)
|
||||
{
|
||||
args.item.range.bands[game.i18n.localize("Long Range")].modifier = 0
|
||||
args.item.range.bands[game.i18n.localize("Extreme")].modifier /= 2
|
||||
}
|
||||
6
scripts/23PDHNZEnihcEvdK.js
Normal file
6
scripts/23PDHNZEnihcEvdK.js
Normal file
@@ -0,0 +1,6 @@
|
||||
if (args.test.result.castOutcome == "success" && args.test.spell.system.lore.value.includes("high"))
|
||||
{
|
||||
this.effect.update({name: this.effect.setSpecifier(parseInt(this.effect.specifier - 1))})
|
||||
|
||||
this.script.message("La valeur de Protection est maintenant de " + (this.effect.specifier - 1), {flavor: this.effect.sourceItem.name})
|
||||
}
|
||||
1
scripts/2AdSBXw7IwCiqawQ.js
Normal file
1
scripts/2AdSBXw7IwCiqawQ.js
Normal file
@@ -0,0 +1 @@
|
||||
return args.skill?.name == game.i18n.localize("NAME.Bribery") || args.skill?.name.includes(game.i18n.localize("NAME.Stealth"));
|
||||
1
scripts/2NLINicPQWbuvp2n.js
Normal file
1
scripts/2NLINicPQWbuvp2n.js
Normal file
@@ -0,0 +1 @@
|
||||
return args.item?.name != game.i18n.localize("NAME.Navigation")
|
||||
9
scripts/2VNnVrtktdGUqXEV.js
Normal file
9
scripts/2VNnVrtktdGUqXEV.js
Normal file
@@ -0,0 +1,9 @@
|
||||
if (args.totalWoundLoss > 0)
|
||||
{
|
||||
let test = await args.actor.setupSkill(game.i18n.localize("NAME.Endurance"), {skipTargets: true, appendTitle : ` - ${this.effect.name}`})
|
||||
await test.roll();
|
||||
if (test.failed && parseInt(args.sourceTest?.result.SL) > 0)
|
||||
{
|
||||
args.actor.addCondition("stunned", parseInt(args.sourceTest?.attackerTest.result.SL))
|
||||
}
|
||||
}
|
||||
19
scripts/2W9uMTT6iJhfQ044.js
Normal file
19
scripts/2W9uMTT6iJhfQ044.js
Normal file
@@ -0,0 +1,19 @@
|
||||
let skill = `${game.i18n.localize("NAME.Trade")} (${this.item.parenthesesText})`
|
||||
let currentCareer = this.actor.system.currentCareer;
|
||||
let existingSkill = this.actor.itemTypes.skill.find(i => i.name == skill);
|
||||
|
||||
if (!currentCareer) return
|
||||
|
||||
|
||||
let inCurrentCareer = currentCareer.system.skills.concat(currentCareer.system.addedSkills).includes(skill);
|
||||
let craftsmanAdded = this.actor.getFlag("wfrp4e", "craftsmanAdded") || {};
|
||||
if (existingSkill && inCurrentCareer && !craftsmanAdded[existingSkill.name])
|
||||
{
|
||||
existingSkill.system.advances.costModifier = -5;
|
||||
}
|
||||
else
|
||||
{
|
||||
craftsmanAdded[skill] = true;
|
||||
currentCareer.system.addedSkills.push(skill);
|
||||
foundry.utils.setProperty(this.actor, "flags.wfrp4e.craftsmanAdded", craftsmanAdded)
|
||||
}
|
||||
4
scripts/2WSN306tL4apjRtD.js
Normal file
4
scripts/2WSN306tL4apjRtD.js
Normal file
@@ -0,0 +1,4 @@
|
||||
let item = await fromUuid("Compendium.wfrp4e-core.items.9h82z72XGo9tfgQS")
|
||||
let data = item.toObject();
|
||||
data.name = data.name += ` (${game.i18n.localize("SPEC.Hearing")})`
|
||||
this.actor.createEmbeddedDocuments("Item", [data], {fromEffect : this.effect.id})
|
||||
1
scripts/2hzDv8ROulOe1elK.js
Normal file
1
scripts/2hzDv8ROulOe1elK.js
Normal file
@@ -0,0 +1 @@
|
||||
return args.skill?.name.includes(game.i18n.localize("NAME.Lore"));
|
||||
20
scripts/2sDH6RvoOAR40oqH.js
Normal file
20
scripts/2sDH6RvoOAR40oqH.js
Normal file
@@ -0,0 +1,20 @@
|
||||
|
||||
|
||||
if (!["Goblin", "Orc"].includes(this.actor.system.details.species.value)) {
|
||||
let test = await this.actor.setupSkill(game.i18n.localize("NAME.Endurance"), { appendTitle: ` - ${this.effect.name}` })
|
||||
await test.roll();
|
||||
if (test.failed) {
|
||||
let infection = await fromUuid("Compendium.wfrp4e-core.items.Item.1hQuVFZt9QnnbWzg")
|
||||
this.actor.createEmbeddedDocuments("Item", [infection])
|
||||
}
|
||||
}
|
||||
|
||||
// Since wounds change when the effect is deleted, need to wait until after
|
||||
// the max wounds have been recalculated to apply damage
|
||||
warhammer.utility.sleep(1000).then(async () => {
|
||||
let roll = await new Roll("1d10").roll({allowInteractive : false});
|
||||
|
||||
roll.toMessage(this.script.getChatData());
|
||||
this.script.message(await this.actor.applyBasicDamage(roll.total, { damageType: game.wfrp4e.config.DAMAGE_TYPE.IGNORE_ALL, suppressMsg: true }))
|
||||
|
||||
})
|
||||
18
scripts/2vTVR0quRZQtjNfQ.js
Normal file
18
scripts/2vTVR0quRZQtjNfQ.js
Normal file
@@ -0,0 +1,18 @@
|
||||
let currentCareer = this.actor.system.currentCareer;
|
||||
if (!currentCareer)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
let talents = [game.i18n.localize("NAME.AA"),
|
||||
`${game.i18n.localize("NAME.ArcaneMagic")} (${game.i18n.localize("SPEC.Any")})`,
|
||||
game.i18n.localize("NAME.ChaosMagic") + " " + "(Tzeentch)",
|
||||
game.i18n.localize("NAME.FastHands"),
|
||||
game.i18n.localize("NAME.ID"),
|
||||
game.i18n.localize("NAME.MagicalSense"),
|
||||
game.i18n.localize("NAME.PettyMagic"),
|
||||
game.i18n.localize("NAME.SecondSight"),
|
||||
game.i18n.localize("NAME.WarWizard"),
|
||||
game.i18n.localize("NAME.Witch")].filter(t => !currentCareer.system.talents.includes(t))
|
||||
|
||||
currentCareer.system.talents = currentCareer.system.talents.concat(talents)
|
||||
3
scripts/2z6DazIpsfiRZHdl.js
Normal file
3
scripts/2z6DazIpsfiRZHdl.js
Normal file
@@ -0,0 +1,3 @@
|
||||
const qualities = foundry.utils.deepClone(args.item.system.qualities.value);
|
||||
qualities.push({name:"lightweight"});
|
||||
args.item?.update({"system.qualities.value": qualities});
|
||||
3
scripts/2zpYzKVDNE5y9RLL.js
Normal file
3
scripts/2zpYzKVDNE5y9RLL.js
Normal file
@@ -0,0 +1,3 @@
|
||||
return !args.actor?.has(game.i18n.localize("NAME.Swarm")) ||
|
||||
![game.wfrp4e.config.actorSizeNums.tiny, game.wfrp4e.config.actorSizeNums.ltl]
|
||||
.includes(args.actor?.sizeNum)
|
||||
14
scripts/32EPIAz7Qm71ut3m.js
Normal file
14
scripts/32EPIAz7Qm71ut3m.js
Normal file
@@ -0,0 +1,14 @@
|
||||
if (Number(this.actor.system.details.age.value) > 870) {
|
||||
if (["t", "wp", "fel"].includes(args.characteristic))
|
||||
args.fields.slBonus -= 3;
|
||||
if (["ag", "dex", "int"].includes(args.characteristic))
|
||||
args.fields.slBonus -= 2;
|
||||
} else if (Number(this.actor.system.details.age.value) > 350) {
|
||||
if (["t", "wp"].includes(args.characteristic))
|
||||
args.fields.slBonus -= 2;
|
||||
if (["fel"].includes(args.characteristic))
|
||||
args.fields.slBonus -= 1;
|
||||
} else {
|
||||
if (["t", "wp"].includes(args.characteristic))
|
||||
args.fields.slBonus -= 1;
|
||||
}
|
||||
1
scripts/3AbonnSVfoSlGye8.js
Normal file
1
scripts/3AbonnSVfoSlGye8.js
Normal file
@@ -0,0 +1 @@
|
||||
this.effect.updateSource({name: this.effect.setSpecifier("9")});
|
||||
44
scripts/3JEzEzF1SeYA9lsV.js
Normal file
44
scripts/3JEzEzF1SeYA9lsV.js
Normal file
@@ -0,0 +1,44 @@
|
||||
let choice = await ItemDialog.create(ItemDialog.objectToArray(game.wfrp4e.config.locations, this.effect.img), 1, "Choose Location");
|
||||
if (choice[0])
|
||||
{
|
||||
this.effect.updateSource({name : `${this.effect.name} (${choice[0].name})`})
|
||||
this.effect.updateSource({"flags.wfrp4e.location" : choice[0].id})
|
||||
}
|
||||
|
||||
let location = choice[0].id;
|
||||
|
||||
if (["lArm", "rArm"].includes(location))
|
||||
{
|
||||
let dropped = this.actor.itemTypes.weapon.filter(i => i.isEquipped & i.system.usesHands.includes(location));
|
||||
|
||||
if (dropped.length)
|
||||
{
|
||||
this.script.notification(`Dropped ${dropped.map(i => i.name).join(", ")}!`)
|
||||
for(let weapon of dropped)
|
||||
{
|
||||
await weapon.system.toggleEquip();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (location == "body")
|
||||
{
|
||||
await this.actor.addCondition("fatigued");
|
||||
test = await this.actor.setupSkill(game.i18n.localize("NAME.Endurance"), {fields : {difficulty : "hard"}, skipTargets: true, appendTitle : ` - ${this.effect.name}`})
|
||||
await test.roll();
|
||||
if (test.failed)
|
||||
{
|
||||
this.actor.addCondition("prone");
|
||||
}
|
||||
}
|
||||
|
||||
if (location == "head")
|
||||
{
|
||||
await this.actor.addCondition("stunned");
|
||||
test = await this.actor.setupSkill(game.i18n.localize("NAME.Endurance"), {fields : {difficulty : "average"}, skipTargets: true, appendTitle : ` - ${this.effect.name}`})
|
||||
await test.roll();
|
||||
if (test.failed)
|
||||
{
|
||||
this.actor.addCondition("unconscious");
|
||||
}
|
||||
}
|
||||
2
scripts/3VhUyqNY18PzeMKG.js
Normal file
2
scripts/3VhUyqNY18PzeMKG.js
Normal file
@@ -0,0 +1,2 @@
|
||||
args.abort = true;
|
||||
this.script.notification("Impossible d'attaquer cette cible !");
|
||||
1
scripts/3hfMQkUKYI4rCuBy.js
Normal file
1
scripts/3hfMQkUKYI4rCuBy.js
Normal file
@@ -0,0 +1 @@
|
||||
return args.skill?.name != game.i18n.localize("NAME.CharmAnimal") && !args.skill?.name.includes(game.i18n.localize("NAME.AnimalTraining"));
|
||||
1
scripts/3plV9WFqs2prfAdp.js
Normal file
1
scripts/3plV9WFqs2prfAdp.js
Normal file
@@ -0,0 +1 @@
|
||||
return !["NAME.Evaluate", "NAME.Gamble"].map(i => game.i18n.localize(i)).includes(args.skill?.name)
|
||||
4
scripts/3sfD1nedXLzuYoXJ.js
Normal file
4
scripts/3sfD1nedXLzuYoXJ.js
Normal file
@@ -0,0 +1,4 @@
|
||||
if (this.actor.hasCondition("surprised"))
|
||||
{
|
||||
this.actor.setupSkill(game.i18n.localize("NAME.Cool"), {fields : {difficulty : "average"}, skipTargets: true, appendTitle : " - " + this.effect.name}).then(test => test.roll())
|
||||
}
|
||||
1
scripts/3z3m1pmw03DbQzcb.js
Normal file
1
scripts/3z3m1pmw03DbQzcb.js
Normal file
@@ -0,0 +1 @@
|
||||
return this.effect.name !== game.i18n.localize("WFRP4E.YenluiLight")
|
||||
1
scripts/454x3Q95pLvZm0Kx.js
Normal file
1
scripts/454x3Q95pLvZm0Kx.js
Normal file
@@ -0,0 +1 @@
|
||||
return args.skill?.name == game.i18n.localize("NAME.ConsumeAlcohol");
|
||||
1
scripts/49smPAj5J0INSFPI.js
Normal file
1
scripts/49smPAj5J0INSFPI.js
Normal file
@@ -0,0 +1 @@
|
||||
return args.item?.system.isRanged;
|
||||
1
scripts/4FGKZk2f0xrmIDnp.js
Normal file
1
scripts/4FGKZk2f0xrmIDnp.js
Normal file
@@ -0,0 +1 @@
|
||||
return args.skill?.name != game.i18n.localize("NAME.Research") && !args.skill?.name?.includes(game.i18n.localize("NAME.Language"));
|
||||
1
scripts/4WQ25VsJSUZ2DeRB.js
Normal file
1
scripts/4WQ25VsJSUZ2DeRB.js
Normal file
@@ -0,0 +1 @@
|
||||
this.actor.addEffectItems("Compendium.wfrp4e-core.items.Item.EO05HX7jql0g605A", this.effect, {"system.specification.value": this.actor.system.characteristics.ag.value});
|
||||
1
scripts/4ZR7p8G3OzOBWx0L.js
Normal file
1
scripts/4ZR7p8G3OzOBWx0L.js
Normal file
@@ -0,0 +1 @@
|
||||
return args.skill?.name !== game.i18n.localize("NAME.Endurance");
|
||||
10
scripts/4fnTKgl0HW9ZrWyJ.js
Normal file
10
scripts/4fnTKgl0HW9ZrWyJ.js
Normal file
@@ -0,0 +1,10 @@
|
||||
this.actor.setupSkill(game.i18n.localize("NAME.Endurance"), {skipTargets: true, appendTitle : ` - ${this.effect.name}`, fields: {difficulty : "average"}}).then(async test =>
|
||||
{
|
||||
await test.roll()
|
||||
if (test.failed)
|
||||
{
|
||||
let char = Math.ceil(CONFIG.Dice.randomUniform() * 2) == 2 ? "s" : "t";
|
||||
this.script.message(`<strong>${this.actor.name}</strong> perd 1 point de ${game.wfrp4e.config.characteristics[char]}`)
|
||||
this.actor.update({[`system.characteristics.${char}.initial`] : this.actor.system.characteristics[char].initial - 1})
|
||||
}
|
||||
})
|
||||
1
scripts/4iuTz0uInAfMaoGl.js
Normal file
1
scripts/4iuTz0uInAfMaoGl.js
Normal file
@@ -0,0 +1 @@
|
||||
return args.skill?.name?.includes(game.i18n.localize("NAME.Language")) || args.type == "cast"
|
||||
7
scripts/4pQW4WLyhjbZR85k.js
Normal file
7
scripts/4pQW4WLyhjbZR85k.js
Normal file
@@ -0,0 +1,7 @@
|
||||
let test = await this.actor.setupSkill(game.i18n.localize("NAME.Endurance"), {skipTargets: true, appendTitle : ` - ${this.effect.name}`, fields : {difficulty : "average"}, context : {failure: "1 Corruption Point Gained"}})
|
||||
await test.roll();
|
||||
if (test.failed && this.actor.type == "character")
|
||||
{
|
||||
this.actor.update({"system.status.corruption.value" : parseInt(this.actor.status.corruption.value) + 1})
|
||||
this.script.message("Gain de 1 point de Corruption", {whisper : ChatMessage.getWhisperRecipients("GM")})
|
||||
}
|
||||
10
scripts/4rb7LfMq9CTnlrpn.js
Normal file
10
scripts/4rb7LfMq9CTnlrpn.js
Normal file
@@ -0,0 +1,10 @@
|
||||
if (args.totalWoundLoss > 0)
|
||||
{
|
||||
let test = await args.actor.setupSkill(game.i18n.localize("NAME.Endurance"), {skipTargets: true, appendTitle : " - " + this.effect.name})
|
||||
await test.roll();
|
||||
if (test.failed)
|
||||
{
|
||||
args.totalWoundLoss += 5;
|
||||
args.modifiers.other.push({label : this.effect.name, value : 5})
|
||||
}
|
||||
}
|
||||
1
scripts/52mwb33mGrQjq89B.js
Normal file
1
scripts/52mwb33mGrQjq89B.js
Normal file
@@ -0,0 +1 @@
|
||||
return args.skill?.name != game.i18n.localize("NAME.Research");
|
||||
1
scripts/5Fe1ELaS6Gnvy0Cj.js
Normal file
1
scripts/5Fe1ELaS6Gnvy0Cj.js
Normal file
@@ -0,0 +1 @@
|
||||
return args.skill?.name.includes(game.i18n.localize("NAME.Channelling")) || args.type == "channelling" || args.skill?.name == game.i18n.localize("NAME.Charm") || args.skill?.name.includes(`${game.i18n.localize("NAME.Language")} (${game.i18n.localize("SPEC.Magick")})`) || args.type == "cast"
|
||||
1
scripts/5QR83whGk4ZyuJcA.js
Normal file
1
scripts/5QR83whGk4ZyuJcA.js
Normal file
@@ -0,0 +1 @@
|
||||
await this.effect.update({duration:{rounds: this.actor.system.characteristics.ws.bonus}});
|
||||
9
scripts/5QjaPBFbv5rIYpla.js
Normal file
9
scripts/5QjaPBFbv5rIYpla.js
Normal file
@@ -0,0 +1,9 @@
|
||||
let test = await this.actor.setupSkill(game.i18n.localize("NAME.Endurance"), {fields: {difficulty : "average"}, appendTitle : " - Wounded"})
|
||||
await test.roll();
|
||||
if (test.failed)
|
||||
{
|
||||
fromUuid("Compendium.wfrp4e-core.items.kKccDTGzWzSXCBOb").then(disease => {
|
||||
this.actor.createEmbeddedDocuments("Item", [disease.toObject()])
|
||||
this.script.scriptNotification("Gain de " + disease.name)
|
||||
})
|
||||
}
|
||||
@@ -10,17 +10,17 @@ scriptData[0].script = `
|
||||
let chatData = {whisper: ChatMessage.getWhisperRecipients("GM")};
|
||||
let message = "";
|
||||
|
||||
let Blessures = foundry.utils.duplicate(this.actor.status.Blessures);
|
||||
let wounds = foundry.utils.duplicate(this.actor.status.wounds);
|
||||
let regenRoll = await new Roll("1d10").roll({allowInteractive : false});
|
||||
let regen = regenRoll.total;
|
||||
|
||||
if (Blessures.value >= Blessures.max)
|
||||
if (wounds.value >= wounds.max)
|
||||
return;
|
||||
|
||||
if (Blessures.value > 0) {
|
||||
Blessures.value += Math.floor(regen / 2);
|
||||
if (Blessures.value > Blessures.max) {
|
||||
Blessures.value = Blessures.max;
|
||||
if (wounds.value > 0) {
|
||||
wounds.value += Math.floor(regen / 2);
|
||||
if (wounds.value > wounds.max) {
|
||||
wounds.value = wounds.max;
|
||||
}
|
||||
message += \`<b>\${this.actor.name}</b> regagne \${regen} Blessures.\`;
|
||||
|
||||
@@ -29,7 +29,7 @@ scriptData[0].script = `
|
||||
}
|
||||
} else if (regen >= 8) {
|
||||
message += \`<b>\${this.actor.name}</b> a obtenu un \${regen} et regagne 1 Blessure.\`;
|
||||
Blessures.value += 1;
|
||||
wounds.value += 1;
|
||||
if (regen === 10) {
|
||||
message += "<br>De plus, il régénère une Blessure Critique.";
|
||||
}
|
||||
@@ -37,7 +37,7 @@ scriptData[0].script = `
|
||||
message += \`<b>\${this.actor.name}</b> Résultat de régénération de \${regen} - Aucun effet.\`;
|
||||
}
|
||||
|
||||
await this.actor.update({"system.status.wounds": Blessures});
|
||||
await this.actor.update({"system.status.wounds": wounds});
|
||||
this.script.message(message, {whisper: ChatMessage.getWhisperRecipients("GM")});
|
||||
`
|
||||
|
||||
@@ -46,4 +46,4 @@ await effet.update({
|
||||
"system.scriptData": scriptData
|
||||
});
|
||||
|
||||
await trait.update({name});
|
||||
await trait.update({ name });
|
||||
1
scripts/5o1XiceC4rutjMms.js
Normal file
1
scripts/5o1XiceC4rutjMms.js
Normal file
@@ -0,0 +1 @@
|
||||
return !args.item?.name.includes(game.i18n.localize("NAME.Stealth"))
|
||||
2
scripts/5rlneScoI5feQ3Di.js
Normal file
2
scripts/5rlneScoI5feQ3Di.js
Normal file
@@ -0,0 +1,2 @@
|
||||
const traits = this.actor.itemTypes.trait.filter(t => ["bestial", "skittish"].includes(s.name.toLowerCase()));
|
||||
trait.system.disabled = true;
|
||||
1
scripts/5sI9iYh5j2nx2XyT.js
Normal file
1
scripts/5sI9iYh5j2nx2XyT.js
Normal file
@@ -0,0 +1 @@
|
||||
return !([game.i18n.localize("NAME.AnimalCare"), game.i18n.localize("NAME.CharmAnimal")].includes(args.item?.name) || args.item?.name.includes(game.i18n.localize("NAME.Ride")) || args.item?.name.includes(game.i18n.localize("NAME.AnimalTraining")));
|
||||
8
scripts/6JrUjs3g5x6bFnj3.js
Normal file
8
scripts/6JrUjs3g5x6bFnj3.js
Normal file
@@ -0,0 +1,8 @@
|
||||
let bite = await fromUuid("Compendium.wfrp4e-core.items.pLW9SVX0TVTYPiPv")
|
||||
let sense = await fromUuid("Compendium.wfrp4e-core.items.9h82z72XGo9tfgQS")
|
||||
let biteData = bite.toObject();
|
||||
let senseData = sense.toObject();
|
||||
|
||||
biteData.system.specification.value = 6 - this.actor.characteristics.s.bonus;
|
||||
senseData.name = senseData.name += game.i18n.localize("SPEC.Smell")
|
||||
this.actor.createEmbeddedDocuments("Item", [biteData, senseData], {fromEffect : this.effect.id})
|
||||
6
scripts/6V3qHON3mcerlBlB.js
Normal file
6
scripts/6V3qHON3mcerlBlB.js
Normal file
@@ -0,0 +1,6 @@
|
||||
let test = await this.actor.setupSkill(game.i18n.localize("NAME.Endurance"), {skipTargets: true, appendTitle : ` - ${this.effect.name}`})
|
||||
await test.roll();
|
||||
if (test.failed)
|
||||
{
|
||||
this.actor.addCondition("prone");
|
||||
}
|
||||
11
scripts/6ZS1rQLkNvMDO0Fp.js
Normal file
11
scripts/6ZS1rQLkNvMDO0Fp.js
Normal file
@@ -0,0 +1,11 @@
|
||||
let roll = Math.ceil(CONFIG.Dice.randomUniform() * 10)
|
||||
if (args.test.isFumble && roll == 1 && !args.test.result.misfire)
|
||||
{
|
||||
args.test.result.misfire = game.i18n.localize("Misfire") + " (Rolled 1)"
|
||||
args.test.result.misfireDamage = eval(parseInt(args.test.result.roll.toString().split('').pop()) + args.test.item.Damage)
|
||||
}
|
||||
else if (args.test.isFumble && roll != 1)
|
||||
{
|
||||
args.test.result.other.push("Misfire Roll: " + roll)
|
||||
}
|
||||
|
||||
6
scripts/6a5nBENmfxy93vGY.js
Normal file
6
scripts/6a5nBENmfxy93vGY.js
Normal file
@@ -0,0 +1,6 @@
|
||||
const deduct = this.effect.setFlag("wfrp4e", "failed");
|
||||
|
||||
if (!deduct) return;
|
||||
|
||||
this.actor.system.characteristics.ws.modifier -= 20;
|
||||
this.actor.system.characteristics.bs.modifier -= 20;
|
||||
6
scripts/6fElmBxTjdAaubbK.js
Normal file
6
scripts/6fElmBxTjdAaubbK.js
Normal file
@@ -0,0 +1,6 @@
|
||||
let test = await this.actor.setupSkill(game.i18n.localize("NAME.Endurance"), {skipTargets: true, appendTitle : ` - ${this.effect.name}`, fields: {difficulty: "average"}});
|
||||
await test.roll();
|
||||
if (test.failed)
|
||||
{
|
||||
this.actor.addCondition("prone")
|
||||
}
|
||||
1
scripts/6qUKKep5vhFYmo1J.js
Normal file
1
scripts/6qUKKep5vhFYmo1J.js
Normal file
@@ -0,0 +1 @@
|
||||
return args.type == "channelling" || args.skill?.name.includes(game.i18n.localize("NAME.Channelling"))
|
||||
1
scripts/6tjn0RH4VyOPFneS.js
Normal file
1
scripts/6tjn0RH4VyOPFneS.js
Normal file
@@ -0,0 +1 @@
|
||||
return ["NAME.Row", "NAME.Swim"].map(i => game.i18n.localize(i)).includes(args.skill?.name);
|
||||
1
scripts/715G1Bf0haOHvmYQ.js
Normal file
1
scripts/715G1Bf0haOHvmYQ.js
Normal file
@@ -0,0 +1 @@
|
||||
return !(args.skill?.name == game.i18n.localize("NAME.Bribery") || args.skill?.name.includes(game.i18n.localize("NAME.Stealth")))
|
||||
21
scripts/7BgJe9YkbHTh3ucm.js
Normal file
21
scripts/7BgJe9YkbHTh3ucm.js
Normal file
@@ -0,0 +1,21 @@
|
||||
if (args.totalWoundLoss <= 0) return;
|
||||
|
||||
const test = await this.actor.setupSkill(
|
||||
game.i18n.localize("NAME.Endurance"),
|
||||
{
|
||||
fields: {difficulty: "difficult"},
|
||||
skipTargets: true,
|
||||
appendTitle: ` — ${this.effect.name}`,
|
||||
},
|
||||
);
|
||||
|
||||
await test.roll();
|
||||
|
||||
if (test.failed) {
|
||||
const item = await fromUuid("Compendium.wfrp4e-core.items.Item.kKccDTGzWzSXCBOb");
|
||||
const data = item.toObject();
|
||||
|
||||
data.system.duration.active = true;
|
||||
|
||||
args.actor.createEmbeddedDocuments("Item", [data]);
|
||||
}
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user