Compare commits
128 Commits
bol-v10.0.
...
v10
Author | SHA1 | Date | |
---|---|---|---|
cc6c7d076e | |||
f427369962 | |||
6b19cb19bd | |||
e93a554715 | |||
3ba0449c12 | |||
819548567b | |||
133f7aa428 | |||
ed68c17304 | |||
e6bdc427f2 | |||
321052fd33 | |||
165a18e897 | |||
7ed9265a26 | |||
ae43c7c920 | |||
20ab9a17a4 | |||
5de40d4998 | |||
c7c26c0033 | |||
5c4c6d73ee | |||
1a0049a3f5 | |||
5d30482ce3 | |||
3fb8e92428 | |||
7738746994 | |||
761179bc5a | |||
a4d7c13383 | |||
ee6bf1a4d4 | |||
469948e296 | |||
def271b8b9 | |||
c9ed514ed6 | |||
2ffd3f35c8 | |||
e3b281f195 | |||
|
29ecb04ec3 | ||
ca3064dc0a | |||
|
9fd8751124 | ||
2d63b63b86 | |||
|
b44250e728 | ||
|
63c3e24296 | ||
8a87f6deab | |||
759b099bdf | |||
ade88fb54b | |||
f1a3f2df36 | |||
a357c6ddfc | |||
26a6c7fc28 | |||
6fcac36580 | |||
34924b07c0 | |||
66bf299ea4 | |||
37ab0d01dc | |||
2e3a97de04 | |||
01dbe76f59 | |||
ca33defd75 | |||
2e616e3e31 | |||
3be7f4bf9f | |||
1b8e0840b0 | |||
2cdd096c98 | |||
8fcb17b566 | |||
ad79dbb015 | |||
73ccf44dd4 | |||
ec3649799f | |||
3f5f090bb9 | |||
268ac0a25a | |||
59ee6684ab | |||
41fbc094bb | |||
5b91041a3f | |||
e7f3851daa | |||
75d562f922 | |||
ba7e25e8c7 | |||
83d3f17dd0 | |||
0c502a2188 | |||
5df2b7e624 | |||
f6554f6945 | |||
fbe232266f | |||
4b9c3bcd1e | |||
05f09aa3f5 | |||
727db74545 | |||
ccb3a458c0 | |||
1ac9605f08 | |||
1bbefd3499 | |||
bcb377db7a | |||
7a8cf9f8fd | |||
d74f7784bb | |||
6d6fec99b0 | |||
884823a1bc | |||
399c22d623 | |||
085265df5d | |||
593db9ba5b | |||
ac96f3ca67 | |||
b2fe67ab05 | |||
47178d7359 | |||
e1c7304551 | |||
7b4e5bcbfa | |||
31bd83b0ab | |||
e35187433e | |||
5e7dc3ad9d | |||
add6893864 | |||
3a591e750a | |||
fe1cda67c4 | |||
985aba0318 | |||
5d8cc300e9 | |||
aa27168c2b | |||
1135e3aff2 | |||
30e316d34e | |||
f3bd84c5c9 | |||
985d393de5 | |||
815b5ff2ac | |||
edf8325109 | |||
895aa01419 | |||
9631e5e72a | |||
716cc53b29 | |||
44952d4410 | |||
a7991bce92 | |||
a1c20019e8 | |||
af8576a4a1 | |||
6c35ddfb0b | |||
0cbcaee45e | |||
904ff821e1 | |||
5c13cde07a | |||
51c1e205e9 | |||
90a83f4571 | |||
3311bc091a | |||
fa8f9869a6 | |||
36b905134e | |||
eeb0a906e7 | |||
c552411d61 | |||
d3ae59f70d | |||
cf7d76fdba | |||
89ec404ca8 | |||
8f60aa95ee | |||
d888c6a2eb | |||
165e41fef6 | |||
19bb0798c8 |
54
.gitea/workflows/main.yml
Normal file
@ -0,0 +1,54 @@
|
||||
name: Release Creation
|
||||
|
||||
on:
|
||||
release:
|
||||
types: [published]
|
||||
|
||||
jobs:
|
||||
build:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- run: echo "💡 The ${{ gitea.repository }} repository will cloned to the runner."
|
||||
|
||||
#- uses: actions/checkout@v3
|
||||
- uses: RouxAntoine/checkout@v3.5.4
|
||||
with:
|
||||
ref: 'v10'
|
||||
|
||||
# get part of the tag after the `v`
|
||||
- name: Extract tag version number
|
||||
id: get_version
|
||||
uses: battila7/get-version-action@v2
|
||||
|
||||
# Substitute the Manifest and Download URLs in the module.json
|
||||
- name: Substitute Manifest and Download Links For Versioned Ones
|
||||
id: sub_manifest_link_version
|
||||
uses: microsoft/variable-substitution@v1
|
||||
with:
|
||||
files: 'system.json'
|
||||
env:
|
||||
version: ${{steps.get_version.outputs.version-without-v}}
|
||||
url: https://www.uberwald.me/gitea/public/bol
|
||||
manifest: https://www.uberwald.me/gitea/public/bol/releases/latest/system.json
|
||||
download: https://www.uberwald.me/gitea/public/bol/releases/download/${{github.event.release.tag_name}}/bol.zip
|
||||
|
||||
# Create a zip file with all files required by the module to add to the release
|
||||
- run: |
|
||||
apt update -y
|
||||
apt install -y zip
|
||||
|
||||
- run: zip -r ./bol.zip system.json template.json README.md LICENSE assets/ css/ fonts/ images/ lang/ module/ packs/ styles/ templates/ ui/
|
||||
|
||||
- name: setup go
|
||||
uses: https://github.com/actions/setup-go@v4
|
||||
with:
|
||||
go-version: '>=1.20.1'
|
||||
|
||||
- name: Use Go Action
|
||||
id: use-go-action
|
||||
uses: https://gitea.com/actions/release-action@main
|
||||
with:
|
||||
files: |-
|
||||
./bol.zip
|
||||
system.json
|
||||
api_key: '${{secrets.RELEASE_TOKEN_UBERWALD}}'
|
118
.gitignore
vendored
@ -1,108 +1,10 @@
|
||||
# Logs
|
||||
logs
|
||||
*.log
|
||||
npm-debug.log*
|
||||
yarn-debug.log*
|
||||
yarn-error.log*
|
||||
lerna-debug.log*
|
||||
package-lock.json
|
||||
|
||||
# Diagnostic reports (https://nodejs.org/api/report.html)
|
||||
report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json
|
||||
|
||||
# Runtime data
|
||||
pids
|
||||
*.pid
|
||||
*.seed
|
||||
*.pid.lock
|
||||
|
||||
# Directory for instrumented libs generated by jscoverage/JSCover
|
||||
lib-cov
|
||||
|
||||
# Coverage directory used by tools like istanbul
|
||||
coverage
|
||||
*.lcov
|
||||
|
||||
# nyc test coverage
|
||||
.nyc_output
|
||||
|
||||
# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files)
|
||||
.grunt
|
||||
|
||||
# Bower dependency directory (https://bower.io/)
|
||||
bower_components
|
||||
|
||||
# node-waf configuration
|
||||
.lock-wscript
|
||||
|
||||
# Compiled binary addons (https://nodejs.org/api/addons.html)
|
||||
build/Release
|
||||
|
||||
# Dependency directories
|
||||
node_modules/
|
||||
jspm_packages/
|
||||
|
||||
# TypeScript v1 declaration files
|
||||
typings/
|
||||
|
||||
# TypeScript cache
|
||||
*.tsbuildinfo
|
||||
|
||||
# Optional npm cache directory
|
||||
.npm
|
||||
|
||||
# Optional eslint cache
|
||||
.eslintcache
|
||||
|
||||
# Microbundle cache
|
||||
.rpt2_cache/
|
||||
.rts2_cache_cjs/
|
||||
.rts2_cache_es/
|
||||
.rts2_cache_umd/
|
||||
|
||||
# Optional REPL history
|
||||
.node_repl_history
|
||||
|
||||
# Output of 'npm pack'
|
||||
*.tgz
|
||||
|
||||
# Yarn Integrity file
|
||||
.yarn-integrity
|
||||
|
||||
# dotenv environment variables file
|
||||
.env
|
||||
.env.test
|
||||
|
||||
# parcel-bundler cache (https://parceljs.org/)
|
||||
.cache
|
||||
|
||||
# Next.js build output
|
||||
.next
|
||||
|
||||
# Nuxt.js build / generate output
|
||||
.nuxt
|
||||
dist
|
||||
|
||||
# Gatsby files
|
||||
.cache/
|
||||
# Comment in the public line in if your project uses Gatsby and *not* Next.js
|
||||
# https://nextjs.org/blog/next-9-1#public-directory-support
|
||||
# public
|
||||
|
||||
# vuepress build output
|
||||
.vuepress/dist
|
||||
|
||||
# Serverless directories
|
||||
.serverless/
|
||||
|
||||
# FuseBox cache
|
||||
.fusebox/
|
||||
|
||||
# DynamoDB Local files
|
||||
.dynamodb/
|
||||
|
||||
# TernJS port file
|
||||
.tern-port
|
||||
|
||||
# BOL Data
|
||||
#/data/
|
||||
.vscode/settings.json
|
||||
.idea
|
||||
.history
|
||||
todo.md
|
||||
/.vscode
|
||||
/ignored/
|
||||
/node_modules/
|
||||
/jsconfig.json
|
||||
/package.json
|
||||
/package-lock.json
|
||||
|
@ -24,6 +24,7 @@ Les livres du jeu sont nécessaires pour jouer, et sont disponibles ici : http:/
|
||||
Barbarians of Lemuria, Mythic edition, est un jeu de Simon Washbourne
|
||||
|
||||
Auteur : Simon Washbourne.
|
||||
|
||||
## Crédits de la version française
|
||||
|
||||
Barbarians of Lemuria, le jeu de rôle de Sword & Sorcery, est une publication des éditions Ludospherik, tous droits réservés.
|
||||
@ -40,4 +41,4 @@ Maps : Emmanuel Roudier.
|
||||
|
||||
# Developmement
|
||||
|
||||
Zigmund, LeRatierBretonnien
|
||||
LeRatierBretonnien, Zigmund (historical)
|
||||
|
BIN
assets/bol_monnaies_v1_2.pdf
Executable file
4
assets/pages/.directory
Normal file
@ -0,0 +1,4 @@
|
||||
[Dolphin]
|
||||
Timestamp=2024,10,13,11,44,9.171
|
||||
Version=4
|
||||
VisibleRoles=Details_text,Details_size,Details_modificationtime,Details_creationtime,CustomizedDetails
|
After Width: | Height: | Size: 253 KiB |
After Width: | Height: | Size: 287 KiB |
After Width: | Height: | Size: 104 KiB |
After Width: | Height: | Size: 265 KiB |
After Width: | Height: | Size: 127 KiB |
After Width: | Height: | Size: 541 KiB |
After Width: | Height: | Size: 207 KiB |
After Width: | Height: | Size: 109 KiB |
After Width: | Height: | Size: 27 KiB |
After Width: | Height: | Size: 131 KiB |
After Width: | Height: | Size: 227 KiB |
After Width: | Height: | Size: 174 KiB |
BIN
assets/pages/init-combat.webp
Normal file
After Width: | Height: | Size: 40 KiB |
58
changelog.md
Normal file
@ -0,0 +1,58 @@
|
||||
Changes :
|
||||
|
||||
# v12.1.0
|
||||
|
||||
## French
|
||||
- Correction sur les conditions des sorts
|
||||
- Jet d'armures correctement affichés
|
||||
- Dégat à 0 possibles sur les armes/capacités
|
||||
|
||||
## English
|
||||
- Corrected spell conditions
|
||||
- Armor rolls are now correctly displayed
|
||||
- Weapon/capacity damage can now be set to 0
|
||||
|
||||
|
||||
# v12.1.0
|
||||
|
||||
- Gestion des Hordes
|
||||
- Ajout de la traduction Espagnole
|
||||
- Nouvelles clés de traduction
|
||||
- Petites amélioration diverses
|
||||
|
||||
# v11.1.2
|
||||
|
||||
- Ajout des traductions manquantes en anglais
|
||||
|
||||
# v11.1.1
|
||||
|
||||
- Re-organisation des compendiums + ajouts de nouveaux equipements
|
||||
- Correction sur la langue Démonique (1 Parlé, 1 Lu/Ecrit)
|
||||
|
||||
# v11.1.0
|
||||
|
||||
- Foundry v11 seulement
|
||||
- Re-organisation des compendiums
|
||||
- Correction sur les créatures
|
||||
- Correction sur l'encaissement sans armure
|
||||
- Ajout d'une note d'explication sur l'initiative
|
||||
|
||||
# v11.0.8
|
||||
|
||||
- Correction sur les malus de bouclier (blocage)
|
||||
- Corrrection sur le malus d'init des boucliers qui était mal affiché dans la fiche d'item
|
||||
|
||||
# v10.4.0
|
||||
|
||||
- Ajout de la gestion d'effets
|
||||
- Aide intégré
|
||||
- Intégration du PDF de la bougette
|
||||
|
||||
# v10.3.3
|
||||
|
||||
- Nouvelles clés de traduction
|
||||
- Lorsqu'une arme a un dé bonus, prise en compte plus claire du dé bonus et affichage de l'information dans la fenêtre de jet
|
||||
- Lorsqu'une arme relance les 1 sur ses dégats, l'information est affichée dans le tchat
|
||||
- Termes corrects pour les PNJs (ie rival)
|
||||
- Nouveaux équipements issus du Dieu Voilé
|
||||
|
33
compendiums/en/bol.armors.json
Normal file
@ -0,0 +1,33 @@
|
||||
{
|
||||
"label": "Armures et Boucliers",
|
||||
"mapping": {
|
||||
"description": "system.description"
|
||||
},
|
||||
|
||||
"entries": {
|
||||
"Armure légère": {
|
||||
"name": "Armure légère",
|
||||
"description": "<h1>Amure légère</h1><p>Si votre personnage préfère éviter les combats mais sait qu’il risque de ne pas y couper, vous souhaiterez peut-être qu’il bénéficie au moins d’une petite protection. La catégorie des armures légères comprend les différentes sortes d’armures de cuir et les chemises de mailles. Votre personnage pourrait ainsi porter un robuste gilet et des brassards en cuir, ou un pourpoint doublé, accompagné de bottes et de gants en cuir souple. À moins que vous ne décidiez qu’il soit vêtu d’une légère chemise de mailles et de rien d’autre.</p><p>Une armure légère est généralement dissimulable (à moins d’être inspecté de près ou d’avoir affaire à l’œil exercé d’un soldat vétéran) et ne vous désigne pas au premier regard comme un guerrier.</p><h2>Effets des armures légères</h2><ul><li>protection d6-3 (0-3 points de réduction des dégâts) ;</li><li>si vous préférez un chiffre fixe, une armure légère offre 1 point de protection ;</li><li>le port d’une armure légère handicape un sorcier et augmente de 1 point de pouvoir le coût de ses sorts.</li></ul>"
|
||||
},
|
||||
"Armure lourde": {
|
||||
"name": "Armure lourde",
|
||||
"description": "<h1>Armure lourde</h1><p>Ce type d’armure est porté par des gladiateurs, des chevaliers partant à la guerre, ou par ceux prévoyant de participer à une bataille sanglante dans un proche avenir. Ce n’ est pas une armure que l’on peut porter la journée entière, et encore moins pour voyager ou s’adonner aux activités ordinaires du quotidien. Il peut s’agir d’un haubert de mailles descendant jusqu’aux genoux ou d’une cuirasse en acier, complétée de grèves et de gantelets, ou encore d’une brigandine (une veste de cuir cousue de plaques de métal) avec gantelets et hautes bottes.</p><p>Un personnage portant une armure lourde peut généralement ôter certaines parties de celle-ci pour la transformer en armure moyenne s’il le souhaite.</p><p>Les personnages ayant moins de 0 en vigueur ne peuvent pas porter d’armure lourde (ils ne sont pas assez robustes pour supporter un pareil attirail).</p><h2>Effets des armures lourdes</h2><ul><li>protection d6-1 (0-5 points de réduction des dégâts) ;</li><li>si vous préférez un chiffre fixe, une armure lourde offre 3 points de protection ;</li><li>le port d’une armure lourde s’accompagne d’un malus de -2 en agilité du fait de l’ encombrement ;</li><li>le port d’une armure lourde handicape un sorcier et augmente de 3 points de pouvoir le coût de ses sorts.</li></ul>"
|
||||
},
|
||||
"Armure moyenne": {
|
||||
"name": "Armure moyenne",
|
||||
"description": "<h1>Armure moyenne</h1><p>Ce type d’armure, compromis entre la maniabilité de l’armure légère et la protection de l’armure lourde, est le choix favori des aventuriers qui s’attendent à affronter des combats de manière régulière. Il peut s’agir d’une armure de cuir couvrant la majeure partie du corps, avec des parties en cuir bouilli pour protéger les points vitaux, ou d’une armure mêlant le cuir et la cotte de mailles, ou encore d’une cuirasse en acier, simple mais efficace.</p><p>Un personnage portant une armure moyenne peut généralement en ôter certaines parties pour la transformer en armure légère s’il le souhaite.</p><h2>Effets des armures moyennes</h2><ul><li>protection d6-2 (0-4 points de réduction des dégâts) ;</li><li>si vous préférez un chiffre fixe, une armure moyenne offre 2 points de protection ;</li><li>le port d’une armure moyenne s’accompagne d’un malus de -1 en agilité du fait de l’encombrement ;</li><li>le port d’une armure moyenne handicape un sorcier et augmente de 2 points de pouvoir le coût de ses sorts.</li></ul>"
|
||||
},
|
||||
"Casque": {
|
||||
"name": "Casque",
|
||||
"description": "<h1>Casque</h1><p>Si vous êtes équipé d’un casque, celui-ci ajoute +1 à la protection de votre armure, dans le cas où vous en portez une. Si vous portez par exemple une armure légère et un casque, votre dé de protection sera égal à d6-2 (d6-1 en armure moyenne et d6 en armure lourde).</p><p>En revanche, un casque vous inflige un malus à l’initiative (il est plus difficile de remarquer ce qui se passe autour de vous avec un casque qui limite votre champ de vision), ainsi que dans certaines situations sociales.</p><p>En général, un héros ne porte pas son casque en permanence et ne le met que lorsqu’il se prépare au combat.</p>"
|
||||
},
|
||||
"Grand bouclier": {
|
||||
"name": "Grand bouclier",
|
||||
"description": "<h1>Grand bouclier</h1><p>Un personnage ne peut bénéficier de son bouclier que s’il est conscient de l’attaque qui le vise, et donc s’il est prêt à la parer.</p>"
|
||||
},
|
||||
"Petit bouclier": {
|
||||
"name": "Petit bouclier",
|
||||
"description": "<h1>Petit bouclier</h1><p>Un personnage ne peut bénéficier de son bouclier que s’il est conscient de l’attaque qui le vise, et donc s’il est prêt à la parer.</p>"
|
||||
}
|
||||
}
|
||||
}
|
244
compendiums/en/bol.boons.json
Normal file
@ -0,0 +1,244 @@
|
||||
{
|
||||
"label": "Avantages",
|
||||
"mapping": {
|
||||
"description": "system.description"
|
||||
},
|
||||
"entries": {
|
||||
"Agilité de l’homme-oiseau": {
|
||||
"name": "Agilité de l’homme-oiseau",
|
||||
"description": "<h1>Agilité de l’homme-oiseau</h1><p>ajoutez 1 à votre agilité. Votre score maximum en agilité passe à 6 au lieu de 5, et votre score de départ maximum en agilité peut être de 4 (au lieu de 3).</p>"
|
||||
},
|
||||
"Ami des bêtes": {
|
||||
"name": "Ami des bêtes",
|
||||
"description": "<h1>Ami des bêtes</h1><p>vous possédez une affinité naturelle avec les animaux. Vous bénéficiez d’un dé de bonus quand vous interagissez avec eux. Si vous êtes dresseur, vous pouvez avoir avec vous deux ou trois compagnons animaux de taille petite, ou un seul de taille moyenne ou grande.</p>"
|
||||
},
|
||||
"Ami des céruléens": {
|
||||
"name": "Ami des céruléens",
|
||||
"description": "<h1>Ami des céruléens</h1><p>vous avez grandi à proximité des géants bleus, ou bien des circonstances particulières vous ont valu leur amitié, et ils vous considèrent comme un des leurs. Vous bénéficiez d’un dé de bonus quand vous interagissez avec les nomades bleus.</p>"
|
||||
},
|
||||
"Amis dans la pègre": {
|
||||
"name": "Amis dans la pègre",
|
||||
"description": "<h1>Amis dans la pègre</h1><p>vous comptez des amis peu recommandables parmi les différentes pègres qui gangrènent la Lémurie. Ils peuvent vous aider à trouver un receleur, vous fournir une planque, etc.</p>"
|
||||
},
|
||||
"Amis haut placés": {
|
||||
"name": "Amis haut placés",
|
||||
"description": "<h1>Amis haut placés</h1><p>vous jouissez de contacts au sein des plus hauts échelons de la société. Même s’ils ne seront pas en général disposés à risquer leur tête pour vous, ils pourront vous apporter de l’aide (comme vous obtenir une audience auprès d’un autre personnage important, vous fournir des informations, jouer de leur influence auprès de la noblesse locale, etc.). Bien sûr, ces amis attendront parfois en retour une faveur de votre part...</p>"
|
||||
},
|
||||
"Arme favorite": {
|
||||
"name": "Arme favorite",
|
||||
"description": "<h1>Arme favorite</h1><p>vous disposez d’une arme de qualité (une grande épée valgardienne, un arc long de Tyrus, une fronde d’Axos, un kriss halakhi, un khastok de Malakut, une hache d’abordage de Parsool, une rapière de Satarla, ou une arme spécialement fabriquée pour vous ou dont vous avez hérité) et vous vous êtes entraîné à son maniement depuis l’enfance. Vous bénéficiez d’un dé de bonus lorsque vous utilisez cette arme (ou, si elle est perdue, volée ou détruite, une arme de substitution qui devra reproduire ses qualités uniques, ce qui risque d’être particulièrement onéreux).</p>"
|
||||
},
|
||||
"Artiste": {
|
||||
"name": "Artiste",
|
||||
"description": "<h1>Artiste</h1><p>vous avez une sensibilité d’artiste. Vous bénéficiez d’un dé de bonus pour créer ou estimer des objets d’art.</p>"
|
||||
},
|
||||
"Athlète": {
|
||||
"name": "Athlète",
|
||||
"description": "<h1>Athlète</h1><p>vous bénéficiez d’un dé de bonus quand vous entreprenez des activités athlétiques (autres que le combat) comme courir, nager, grimper ou sauter.</p>"
|
||||
},
|
||||
"Attirant": {
|
||||
"name": "Attirant",
|
||||
"description": "<h1>Attirant</h1><p>vous êtes particulièrement beau ou séduisant. Vous bénéficiez d’un dé de bonus dans les situations où l’apparence peut jouer un rôle.</p>"
|
||||
},
|
||||
"Bagarreur": {
|
||||
"name": "Bagarreur",
|
||||
"description": "<h1>Bagarreur</h1><p>vous êtes un boxeur et un lutteur compétent. Vous bénéficiez d’un dé de bonus à l’attaque quand vous combattez à mains nues.</p>"
|
||||
},
|
||||
"Baudrier de guerre": {
|
||||
"name": "Baudrier de guerre",
|
||||
"description": "<h1>Baudrier de guerre</h1><p>cet avantage autorise votre personnage à ne porter qu’un pagne ou un bikini en cotte de mailles et un simple baudrier (l’équivalent d’une armure légère au mieux), tout en considérant qu’il s’agit d’une armure moyenne en terme de protection, et ce sans subir le moindre malus d’armure.</p>"
|
||||
},
|
||||
"Beau parleur": {
|
||||
"name": "Beau parleur",
|
||||
"description": "<h1>Beau parleur</h1><p>vous êtes très persuasif et excellent menteur. Vous bénéficiez d’un dé de bonus quand vous voulez mentir, escroquer, baratiner ou tromper quelqu’un.</p>"
|
||||
},
|
||||
"Bibliothèque savante": {
|
||||
"name": "Bibliothèque savante",
|
||||
"description": "<h1>Bibliothèque savante</h1><p>vous disposez d’une bibliothèque de qualité pour mener vos recherches. Vous bénéficiez d’un dé de bonus pour recueillir des informations lorsque vous vous trouvez dans votre bibliothèque. Vous devez toutefois enrichir régulièrement vos collections, ce qui vous conduit à partir à l’aventure pour trouver les moyens d’acquérir de nouveaux manuscrits.</p>"
|
||||
},
|
||||
"Bien né": {
|
||||
"name": "Bien né",
|
||||
"description": "<h1>Bien né</h1><p>vous avez grandi dans les palais et les cours, parmi la noblesse et la haute société. Vous bénéficiez d’un dé de bonus pour agir selon les règles de l’étiquette et de la courtoisie.</p>"
|
||||
},
|
||||
"Colosse": {
|
||||
"name": "Colosse",
|
||||
"description": "<h1>Colosse</h1><p>vous savez mobiliser votre vigueur pour accomplir de véritables tours de force. Vous bénéficiez d’un dé de bonus pour briser, lever, tirer ou pousser des objets.</p>"
|
||||
},
|
||||
"Combat à l’aveugle": {
|
||||
"name": "Combat à l’aveugle",
|
||||
"description": "<h1>Combat à l’aveugle</h1><p>pas de lumière ? Aucun problème. En vous basant sur les odeurs, les bruits, les déplacements d’air, vous ne faites plus qu’un avec le monde qui vous entoure. Votre personnage ignore les malus imposés par le MJ pour combattre dans l’obscurité.</p>"
|
||||
},
|
||||
"Cri de guerre": {
|
||||
"name": "Cri de guerre",
|
||||
"description": "<h1>Cri de guerre</h1><p>le personnage pousse son cri de guerre pour effrayer les ennemis à portée de voix. Ces derniers subissent un dé de malus sur tous leurs jets d’attaque durant le round qui suit le cri de guerre. Cet avantage ne peut être utilisé gratuitement qu’une fois par jour ; toute utilisation supplémentaire exigera la dépense de 1 point d’héroïsme.</p>"
|
||||
},
|
||||
"Discret": {
|
||||
"name": "Discret",
|
||||
"description": "<h1>Discret</h1>\n<p>vous êtes vif et agile. Vous bénéficiez d’un dé de bonus dans les situations où vous essayez de faire preuve de discrétion.</p>"
|
||||
},
|
||||
"Doigts de fée": {
|
||||
"name": "Doigts de fée",
|
||||
"description": "<h1>Doigts de fée</h1><p>vous bénéficiez d’un dé de bonus pour toutes les tâches exigeant une grande dextérité, comme le vol à la tire, la fabrication d’objets, le jonglage ou la triche aux cartes et aux dés.</p>"
|
||||
},
|
||||
"Dur à cuire": {
|
||||
"name": "Dur à cuire",
|
||||
"description": "<h1>Dur à cuire</h1><p>vous avez la robustesse d’un bronyx. Ajoutez 2 points à votre vitalité.</p>"
|
||||
},
|
||||
"Érudit": {
|
||||
"name": "Érudit",
|
||||
"description": "<h1>Érudit</h1><p>quand vous cherchez à vous souvenir d’un fait relevant de votre domaine de compétence, vous bénéficiez d’un dé de bonus.</p>"
|
||||
},
|
||||
"Fêtard": {
|
||||
"name": "Fêtard",
|
||||
"description": "<h1>Fêtard</h1><p>vous connaissez bien les auberges et les tavernes, et vous n’êtes pas le dernier quand il s’agit de lever le coude. Vous bénéficiez d’un dé de bonus pour recueillir des informations, trouver des contacts ou obtenir des biens et des services quand vous vous trouvez dans une taverne. De plus, vous tenez très bien l’alcool et bénéficiez également d’un dé de bonus pour résister aux effets de la boisson.</p>"
|
||||
},
|
||||
"Fils des plaines": {
|
||||
"name": "Fils des plaines",
|
||||
"description": "<h1>Fils des plaines</h1><p>vous avez grandi dans les plaines. Lorsque vous vous trouvez dans un paysage de plaine, vous bénéficiez d’un dé de bonus pour pister, piéger ou chasser, ainsi que pour d’autres activités similaires de survie (mais pas pour combattre).</p>"
|
||||
},
|
||||
"Fortuné": {
|
||||
"name": "Fortuné",
|
||||
"description": "<h1>Fortuné</h1><p>vous disposez d’une source de revenus ou d’un héritage. Vous bénéficiez d’un dé de bonus quand vous cherchez à acquérir des biens ou des services dans votre cité d’origine.</p>"
|
||||
},
|
||||
"Gamin des rues": {
|
||||
"name": "Gamin des rues",
|
||||
"description": "<h1>Gamin des rues</h1><p>vous êtes un enfant des rues. Vous bénéficiez d’un dé de bonus quand vous interagissez avec les gens des bas-fonds de la cité, ou pour des activités comme filer quelqu’un ou remarquer un détail dans la rue (mais pas pour combattre).</p>"
|
||||
},
|
||||
"Inspirateur": {
|
||||
"name": "Inspirateur",
|
||||
"description": "<h1>Inspirateur</h1><p>vous savez motiver vos amis et vos partisans. Cela peut se faire au moyen d’une invocation aux dieux, d’un discours enflammé ou d’une musique inspirante, à moins que cela ne vienne simplement de votre présence charismatique. Pour le round qui suit l’utilisation de cet avantage, vos compagnons bénéficient d’un dé de bonus à tous leurs jets d’attaque (à condition d’être à portée de voix). Cet avantage ne peut être utilisé gratuitement qu’une fois par jour ; toute utilisation supplémentaire exigera la dépense de 1 point d’héroïsme.</p>"
|
||||
},
|
||||
"Intimidant": {
|
||||
"name": "Intimidant",
|
||||
"description": "<h1>Intimidant</h1><p>vous bénéficiez d’un dé de bonus à chaque fois que vous essayez de forcer quelqu’un à vous donner une information ou à faire une chose à laquelle il répugne.</p>"
|
||||
},
|
||||
"Intrépide": {
|
||||
"name": "Intrépide",
|
||||
"description": "<h1>Intrépide</h1><p>votre personnage est insensible à la peur. Même une peur magiquement induite n’a aucune prise sur lui.</p>"
|
||||
},
|
||||
"Laboratoire fourni": {
|
||||
"name": "Laboratoire fourni",
|
||||
"description": "<h1>Laboratoire fourni</h1><p>vous disposez d’un laboratoire de qualité pour mener vos expériences. Vous bénéficiez d’un dé de bonus aux jets pour créer des préparations alchimiques ou des instruments mécaniques lorsque vous vous trouvez dans votre laboratoire. Celui-ci doit toutefois être réapprovisionné de temps à autre, ce qui vous conduit à partir à l’aventure pour trouver les moyens financiers et matériels de refaire vos stocks.</p>"
|
||||
},
|
||||
"Magie des Rois-Sorciers": {
|
||||
"name": "Magie des Rois-Sorciers",
|
||||
"description": "<h1>Magie des Rois-Sorciers</h1><p>vous avez atteint une certaine compréhension des antiques secrets des Rois-Sorciers. Vous bénéficiez d’un dé de bonus pour lancer des sortilèges. Si vous choisissez cet avantage, vous devez prendre un désavantage supplémentaire.</p>"
|
||||
},
|
||||
"Mains guérisseuses": {
|
||||
"name": "Mains guérisseuses",
|
||||
"description": "<h1>Mains guérisseuses</h1><p>vous bénéficiez d’un dé de bonus sur les tests destinés à aider un blessé à récupérer de ses blessures, d’un empoisonnement, etc. Vous devez posséder la carrière médecin pour prendre cet avantage.</p>"
|
||||
},
|
||||
"Maître du déguisement": {
|
||||
"name": "Maître du déguisement",
|
||||
"description": "<h1>Maître du déguisement</h1><p>vous bénéficiez d’un dé de bonus quand vous tentez de dissimuler votre identité. De plus, si vous souhaitez intervenir promptement dans une scène où votre personnage n’était pas présent, vous pouvez dépenser 1 point d’héroïsme pour faire partie du décor, par exemple déguisé en garde de la patrouille ou en bourgeois passant dans la rue. En fait, vous étiez là depuis le début, mais incognito!</p>"
|
||||
},
|
||||
"Marqué par les dieux": {
|
||||
"name": "Marqué par les dieux",
|
||||
"description": "<h1>Marqué par les dieux</h1><p>les dieux vous accordent leur faveur. Vous gagnez 1 point d’héroïsme supplémentaire.</p>"
|
||||
},
|
||||
"Montagnard": {
|
||||
"name": "Montagnard",
|
||||
"description": "<h1>Montagnard</h1><p>vous avez grandi dans les montagnes. Lorsque vous vous trouvez dans un paysage montagneux, vous bénéficiez d’un dé de bonus pour pister, piéger ou chasser, ainsi que pour d’autres activités similaires de survie (mais pas pour combattre).</p>"
|
||||
},
|
||||
"Né en selle": {
|
||||
"name": "Né en selle",
|
||||
"description": "<h1>Né en selle</h1><p>vous bénéficiez d’un dé de bonus pour chevaucher des montures et agir en selle (mais pas pour combattre).</p>"
|
||||
},
|
||||
"Odorat développé": {
|
||||
"name": "Odorat développé",
|
||||
"description": "<h1>Odorat développé</h1><p>à chaque fois que vous effectuez un jet d’action sous esprit pour percevoir quelque chose grâce à votre odorat, vous bénéficiez d’un dé de bonus.</p>"
|
||||
},
|
||||
"Ouïe fine": {
|
||||
"name": "Ouïe fine",
|
||||
"description": "<h1>Ouïe fine</h1><p>à chaque fois que vous effectuez un jet d’action sous esprit pour percevoir quelque chose grâce à votre ouïe, vous bénéficiez d’un dé de bonus.</p>"
|
||||
},
|
||||
"Outillage": {
|
||||
"name": "Outillage",
|
||||
"description": "<h1>Outillage</h1><p>vous possédez un jeu d’outils adaptés à votre métier ou votre artisanat. Vous bénéficiez d’un dé de bonus quand vous entreprenez une action où l’emploi de ces outils peut se révéler efficace.</p>"
|
||||
},
|
||||
"Peau dure": {
|
||||
"name": "Peau dure",
|
||||
"description": "<h1>Peau dure</h1><p>vous avez une peau particulièrement résistante et épaisse qui vous confère +1 en protection, même quand vous ne portez pas d’armure.</p>"
|
||||
},
|
||||
"Perspicace": {
|
||||
"name": "Perspicace",
|
||||
"description": "<h1>Perspicace</h1><p>vous êtes doué pour percer à jour les menteurs. Quand quelqu’un tente de vous mentir ou de vous entourlouper, vous bénéficiez d’un dé de bonus pour le remarquer. Cela ne veut pas dire que vous connaîtrez forcément la vérité, mais vous saurez au moins qu’on est en train de vous mentir.</p>"
|
||||
},
|
||||
"Pied marin": {
|
||||
"name": "Pied marin",
|
||||
"description": "<h1>Pied marin</h1><p>vous avez grandi dans un environnement de navires et de bateaux. Vous bénéficiez d’un dé de bonus pour manœuvrer une embarcation ou entreprendre des activités physiques à bord d’un navire (mais pas pour combattre).</p>"
|
||||
},
|
||||
"Pisteur des marais": {
|
||||
"name": "Pisteur des marais",
|
||||
"description": "<h1>Pisteur des marais</h1><p>vous avez grandi dans les marais. Lorsque vous vous trouvez dans un paysage de marécage, vous bénéficiez d’un dé de bonus pour pister, piéger ou chasser, ainsi que pour d’autres activités similaires de survie (mais pas pour combattre).</p>"
|
||||
},
|
||||
"Poings d’acier": {
|
||||
"name": "Poings d’acier",
|
||||
"description": "<h1>Poings d’acier</h1><p>vous avez les poings durs comme la pierre après des années d’entraînement ou à force de vous bagarrer dans toutes les tavernes de la ville. Vous ajoutez votre vigueur aux dégâts quand vous combattez à mains nues.</p>"
|
||||
},
|
||||
"Pouvoir du Néant": {
|
||||
"name": "Pouvoir du Néant",
|
||||
"description": "<h1>Pouvoir du Néant</h1><p>vous avez porté le regard sur l’abîme de noirceur du Néant, et recevez deux points de pouvoir supplémentaires. Si vous choisissez cet avantage, vous devez aussi prendre un désavantage supplémentaire.</p>"
|
||||
},
|
||||
"Récupération rapide": {
|
||||
"name": "Récupération rapide",
|
||||
"description": "<h1>Récupération rapide</h1><p>vous jouissiez d’une constitution hors norme. Lorsque vous récupérez après un combat, vous regagnez 1 point de vitalité supplémentaire (qui s’ajoute à la récupération normale, égale à la moitié des points perdus). De plus, si vous êtes blessé, vous récupérez 1 point de vitalité par jour, peu importe les activités que vous entreprenez.</p>"
|
||||
},
|
||||
"Renard du désert": {
|
||||
"name": "Renard du désert",
|
||||
"description": "<h1>Renard du désert</h1><p>lorsque vous vous trouvez dans un désert, vous bénéficiez d’un dé de bonus pour pister, piéger ou chasser, ainsi que pour d’autres activités similaires de survie (mais pas pour combattre).</p>"
|
||||
},
|
||||
"Résistant à la magie": {
|
||||
"name": "Résistant à la magie",
|
||||
"description": "<h1>Résistant à la magie</h1><p>si vous êtes visé par un sortilège, lancez un d6. Sur un 6, le sortilège n’a aucun effet sur vous.</p>"
|
||||
},
|
||||
"Résistant aux poisons": {
|
||||
"name": "Résistant aux poisons",
|
||||
"description": "<h1>Résistant aux poisons</h1><p>vous bénéficiez d’un dé de bonus pour résister aux effets des drogues, des venins, des toxines, ainsi que de l’alcool.</p>"
|
||||
},
|
||||
"Roi de l’évasion": {
|
||||
"name": "Roi de l’évasion",
|
||||
"description": "<h1>Roi de l’évasion</h1><p>cordes, chaînes, menottes, prison, rien ne vous retient bien longtemps. Que ce soit par vos talents ou par un coup de chance, vous finissez toujours par vous libérer. Vous bénéficiez d’un dé de bonus lorsque vous tentez de vous évader ou de vous libérer de vos liens.</p>"
|
||||
},
|
||||
"Roi de la jungle": {
|
||||
"name": "Roi de la jungle",
|
||||
"description": "<h1>Roi de la jungle</h1><p>vous avez grandi dans la jungle. Lorsque vous vous trouvez dans un paysage de jungle, vous bénéficiez d’un dé de bonus pour pister, piéger ou chasser, ainsi que pour d’autres activités similaires de survie (mais pas pour combattre).</p>"
|
||||
},
|
||||
"Santé de fer": {
|
||||
"name": "Santé de fer",
|
||||
"description": "<h1>Santé de fer</h1><p>vous êtes immunisé à toutes les maladies, y compris celles d’origine magique.</p>"
|
||||
},
|
||||
"Savant": {
|
||||
"name": "Savant",
|
||||
"description": "<h1>Savant</h1><p>ajoutez 1 à votre esprit. Votre score maximum en esprit passe à 6 au lieu de 5, et votre score de départ maximum en esprit peut être de 4 (au lieu de 3).</p>"
|
||||
},
|
||||
"Sentir la magie": {
|
||||
"name": "Sentir la magie",
|
||||
"description": "<h1>Sentir la magie</h1><p>vous bénéficiez d’un dé de bonus quand vous essayez de reconnaître (ou de traquer) un sorcier, un effet ou un artefact magique.</p>"
|
||||
},
|
||||
"Tigre des neiges": {
|
||||
"name": "Tigre des neiges",
|
||||
"description": "<h1>Tigre des neiges</h1><p>vous avez grandi dans la toundra gelée. Lorsque vous vous trouvez dans un paysage neigeux, vous bénéficiez d’un dé de bonus pour pister, piéger ou chasser, ainsi que pour d’autres activités similaires de survie (mais pas pour combattre).</p>"
|
||||
},
|
||||
"Tireur puissant": {
|
||||
"name": "Tireur puissant",
|
||||
"description": "<h1>Tireur puissant</h1><p>avec un type d’arme à distance choisi (arc, fronde, javelot, etc.), vous ajoutez votre vigueur aux dégâts.</p>"
|
||||
},
|
||||
"Vigilant": {
|
||||
"name": "Vigilant",
|
||||
"description": "<h1>Vigilant</h1><p>vous jouissez d’une excellente capacité de réaction face au danger. Vous bénéficiez d’un dé de bonus à vos jets de réaction.</p>"
|
||||
},
|
||||
"Vigueur céruléenne": {
|
||||
"name": "Vigueur céruléenne",
|
||||
"description": "<h1>Vigueur céruléenne</h1><p>vous êtes grand et fort. Ajoutez 1 à votre vigueur. Votre score maximum en vigueur passe à 6 au lieu de 5, et votre score de départ maximum en vigueur peut être de 4 (au lieu de 3).</p>"
|
||||
},
|
||||
"Vision nocturne": {
|
||||
"name": "Vision nocturne",
|
||||
"description": "<h1>Vision nocturne</h1><p>vous bénéficiez d’un dé de bonus quand l’obscurité impose un malus à la vision.</p>"
|
||||
},
|
||||
"Vue perçante": {
|
||||
"name": "Vue perçante",
|
||||
"description": "<h1>Vue perçante</h1><p>à chaque fois que vous effectuez un jet d’action sous esprit pour percevoir quelque chose grâce à votre vue, vous bénéficiez d’un dé de bonus.</p>"
|
||||
}
|
||||
}
|
||||
}
|
33
compendiums/en/bol.boonsflawscreatures.json
Normal file
@ -0,0 +1,33 @@
|
||||
{
|
||||
"label": "Avantages/Désavantages de Créatures",
|
||||
"mapping": {
|
||||
"description": "system.description"
|
||||
},
|
||||
|
||||
"entries": {
|
||||
"Attaque féroce": {
|
||||
"name": "Attaque féroce"
|
||||
},
|
||||
"Attaque Multiple": {
|
||||
"name": "Attaque Multiple"
|
||||
},
|
||||
"Attaque Spéciale": {
|
||||
"name": "Attaque Spéciale"
|
||||
},
|
||||
"Attaque Timide": {
|
||||
"name": "Attaque Timide"
|
||||
},
|
||||
"Attaque Venimeuse": {
|
||||
"name": "Attaque Venimeuse"
|
||||
},
|
||||
"Camouflage": {
|
||||
"name": "Camouflage"
|
||||
},
|
||||
"Déficience": {
|
||||
"name": "Déficience"
|
||||
},
|
||||
"Prédateur": {
|
||||
"name": "Prédateur"
|
||||
}
|
||||
}
|
||||
}
|
116
compendiums/en/bol.careers.json
Normal file
@ -0,0 +1,116 @@
|
||||
{
|
||||
"label": "Carrières héroïques",
|
||||
"mapping": {
|
||||
"description": "system.description"
|
||||
},
|
||||
"entries": {
|
||||
"Alchimiste (artificier/inventeur)": {
|
||||
"name": "Alchimiste (artificier/inventeur)",
|
||||
"description": "<h1>Alchimiste (artificier/inventeur)</h1><p>Les alchimistes sont les scientifiques et les inventeurs de Lémurie. Souvent confondus avec les sorciers par ceux qui ne comprennent rien à leur science, les alchimistes ont une connaissance approfondie des principes de la chimie et de la métallurgie, ainsi que des vertus des plantes et herbes qu’ils cultivent parfois dans leurs propres jardins médicinaux.</p><p>Les alchimistes sont ainsi capables de créer des parfums, des potions, des poudres et des poisons, de composer des alliages aux propriétés uniques, de concevoir des instruments et des machines étranges, entre autres inventions étonnantes. Certains alchimistes particulièrement brillants sont même capables d’assembler des morceaux issus de différentes créatures vivantes pour créer d’horribles chimères. Quand ils conçoivent des machines, les alchimistes travaillent souvent en étroite collaboration avec des forgerons. Vous trouverez davantage d’informations sur l’alchimie au chapitre 6.</p><h2>Attributs</h2><p>à l’évidence l’esprit est l’attribut essentiel pour un alchimiste, dont la profession exige une grande intelligence et de vastes connaissances, que ce soit pour mener ses propres recherches ou pour déchiffrer les textes et les plans rédigés par de lointains prédécesseurs.</p><h2>À l’aventure</h2><p>ce n’ est pas une carrière très courante chez les héros, car elle impose d’austères recherches et beaucoup de patience. Il arrive cependant que des alchimistes audacieux s’aventurent à explorer d’antiques ruines dans l’ espoir d’y découvrir d’anciennes reliques dont la véritable valeur pourrait échapper à des héros moins instruits qu’eux.</p><h2>Combat</h2><p>les circonstances où des rangs dans la carrière d’alchimiste pourraient se révéler utiles au combat sont particulièrement rares.</p><h2>Idées d’Avantages</h2><p>bibliothèque savante, doigts de fée, érudit, laboratoire fourni, odorat développé, résistant aux poisons, savant.</p><h2>Idées de Désavantages</h2><p>chétif, distrait, foie jaune, gars de la ville, non-combattant, obsession (savoir ou artefacts anciens).</p><h2>Carrière dangereuse</h2><p>pour chaque rang d’alchimiste au-dessus du rang 2, le personnage doit prendre un désavantage (consultez la liste des avantages et désavantages, page 40).</p><h2>Langues</h2><p>les alchimistes doivent apprendre le démonique s’ils veulent pouvoir utiliser les puissantes créations magiques et alchimiques de l’antique race des Rois-Sorciers. Ce langage est particulièrement ardu et ses formes orale et écrite exigent d’être apprises séparément.</p>"
|
||||
},
|
||||
"Assassin (agent/espion)": {
|
||||
"name": "Assassin (agent/espion)",
|
||||
"description": "<h1>Assassin (agent/espion)</h1><p>Tueurs à gages, quand ils ne sont pas des agents au service d’un souverain, les espions et les assassins ont élevé le meurtre et le vol au rang d’art. Ce sont des experts de la collecte secrète d’informations et de rumeurs, de l’attaque sournoise et du meurtre discret, parfois maquillé en mort naturelle (par l’usage de poison, par exemple). Ils utilisent des méthodes éprouvées pour réunir des informations sur un sujet ou un personnage, se bâtir un solide réseau de contacts (dont tous ne sont pas forcément très recommandables), et se rapprocher de leur cible (qu’il s’agisse de crocheter une serrure, de mentir ou de se déguiser). Ils savent se montrer patients et peuvent parfois rester en planque des jours durant, à attendre l’occasion parfaite de frapper. Il est de notoriété publique que les meilleurs assassins de Lémurie proviennent de la cité d’Halakh.</p><h2>Attributs</h2><p>tous les attributs sont importants pour un assassin.</p><h2>À l’aventure</h2><p>les assassins et les espions sont généralement des solitaires, ce qui n’en fait pas des candidats évidents pour rejoindre un groupe d’aventuriers. En revanche, d’anciens assassins ont des compétences très utiles à offrir à un groupe de héros.</p><h2>Combat</h2><p>un assassin peut obtenir un avantage ponctuel s’il attaque par surprise, en frappant un adversaire qui ne l’a pas vu approcher, ou en utilisant une arme dissimulée, par exemple.</p><h2>Idées d’Avantages</h2><p>amis dans la pègre, amis haut placés, arme favorite, beau parleur, discret, maître du déguisement, ouïe fine, résistant aux poisons, vigilant, vue perçante.</p><h2>Idées de Désavantages</h2><p>arrogant, gars de la ville, mauvaise réputation, obsession (achever la mission), traqué.</p>"
|
||||
},
|
||||
"Astrologue": {
|
||||
"name": "Astrologue",
|
||||
"description": "<h1>Alchimiste </h1>\n<p>Lorsque les dieux veulent communiquer avec les hommes, ils utilisent le plus souvent les rêves ou les oracles. Mais leurs messages sont généralement abscons, énigmatiques, mystérieux. Pour les déchiffrer, il est nécessaire de faire appel aux talents d’un voyant, d’un devin ou de quelque autre interprète des volontés célestes. Encore faut-il que les dieux aient le désir de révéler leurs secrets aux simples mortels. La plupart du temps, ils préfèrent s’amuser à fourvoyer les malheureux plutôt que de tenter de les sauver de leur destin tragique. En effet, les prêtres affirment que l’avenir est écrit et que les dieux connaissent le début et la fin de toute chose.</p>\n<p>L’astrologie naquit lorsque les hommes, anxieux de connaître leur sort sans devoir attendre la bonne volonté des dieux, levèrent les yeux vers leur domaine et scrutèrent les signes qui s’y manifestaient. Car Hurm arbitre le destin de tout être et de toute chose, et Sa’Tel a consigné les décrets du roi des dieux sur la voûte céleste. Ils découvrirent ainsi que le destin pouvait se laisser augurer dans les étoiles du firmament, à condition de savoir interpréter les conjonctions et les transits des astres, et de connaître la signification de chaque corps et phénomène célestes. Mais il n’est pas donné à tout le monde de pouvoir déchiffrer les Glyphes sacrés que constituent les constellations.</p>\n<p>Les sages capables de lire l’avenir dans les étoiles sont désignés sous le nom d’astrologues. Leur art consiste à établir des cartes du ciel et à en donner une interprétation afin de révéler le destin d’un individu et le sort que lui réservent les dieux, par exemple à l’occasion d’un voyage, d’un choix à faire, d’une tâche à entreprendre. Qu’ils soient princes, généraux, marchands, aventuriers ou simples paysans, tous consultent des astrologues, car même le héros le plus brave peut hésiter devant une quête en apparence impossible, à moins d’avoir l’assurance que les dieux lui souriront.</p>\n<h2>Attributs</h2>\n<p>étudier les conjonctions et analyser le mouvement des astres requièrent une solide érudition et une intelligence pénétrante. Tout personnage voulant se lancer dans cette carrière aura donc intérêt à privilégier l’esprit. Mais pour l’astrologue qui serait moins doué dans l’établissement d’un thème astral précis, une bonne aura permettra d’énoncer des prédictions avec conviction, même si lui-même n’est pas vraiment certain de leur fiabilité...</p>\n<h2>À l’aventure</h2>\n<p>quitter son observatoire pour parcourir des centaines de lieues, affronter des dangers, risquer de se faire capturer et réduire en esclavage ? Parfois la connaissance est à ce prix. Même si un astrologue a plutôt tendance à vouloir rester en ville pour vendre ses horoscopes et examiner le ciel, il est des événements qui ne peuvent s’observer qu’à un endroit et à un moment précis. De plus, un groupe ne refusera probablement pas la présence d’un astrologue suffisamment doué pour déterminer si les conjonctures sont favorables avant de s’engager dans quelque périlleuse expédition.</p>\n<h2>Combat</h2>\n<p>pour sauver sa vie, un astrologue en situation critique fera comme la plupart des gens sensés : il cherchera à se cacher ou à fuir. Et surtout, jamais il ne se risquera à provoquer une réaction qui pourrait entraîner un affrontement physique. À moins, peut-être, que son horoscope ne lui prédise une issue favorable !</p>\n<h2>Idées d’Avantages</h2>\n<p>amis haut placés, beau parleur, bibliothèque savante, érudit, laboratoire fourni, savant.</p>\n<h2>Idées de Désavantages</h2>\n<p>chétif, distrait, foie jaune, gars de la ville, non-combattant, obsession, souffreteux.</p>\n<p> </p>"
|
||||
},
|
||||
"Barbare (berserk/primitif)": {
|
||||
"name": "Barbare (berserk/primitif)",
|
||||
"description": "<h1>Barbare (berserk/primitif)</h1><p>Ces personnages ne sont pas originaires des grandes cités de Lémurie, mais plutôt des montagnes de l’Axos, des toundras glacées de Valgard, du désert de Beshaar ou d’autres contrées sauvages du continent.</p><p>Les barbares sont des êtres farouches et sauvages, comme les terres qui les ont vus naître. Doués d’instincts aussi aiguisés que ceux d’un fauve, ils possèdent un talent inné pour la survie en milieu hostile et de solides connaissances sur la nature. Ce sont généralement de bons cavaliers. Mais les barbares restent surtout célèbres pour la rage indomptable avec laquelle ils combattent et leur faculté innée d’intimider les âmes les mieux trempées.</p><h2>Attributs</h2><p>la vie rude des barbares exige robustesse et endurance, aussi une bonne vigueur est essentielle pour un barbare, bien qu’il ne doive pas non plus négliger l’agilité.</p><h2>Idées de Désavantages</h2><p>arrogant, gars de la ville, mauvaise réputation, obsession (achever la mission), traqué.</p><h2>À l’aventure</h2><p>les barbares sont des aventuriersnés et possèdent les talents et les aptitudes nécessaires pour survivre aux pires situations.</p><h2>Combat</h2><p>les barbares se battent généralement de manière brutale, sans le moindre raffinement. Cela pourrait impressionner des citadins inaccoutumés à une telle sauvagerie, et offrir un avantage ponctuel à un barbare dans le cadre d’un combat particulièrement violent et sans pitié.</p><h2>Idées d’Avantages</h2><p>arme favorite, baudrier de guerre, colosse, cri de guerre, dur à cuire, fils des plaines, intimidant, montagnard, odorat développé, ouïe fine, peau dure, pisteur des marais, récupération rapide, roi de la jungle, santé de fer, tigre des neiges, vigilant, vue perçante.</p><h2>Idées de Désavantages</h2><p>bouseux, crédule, illettré, impétueux, lubrique, marin d’eau douce, méfiance envers la sorcellerie, signe distinctif, taciturne.</p>"
|
||||
},
|
||||
"Bourreau (geôlier/esclavagiste)": {
|
||||
"name": "Bourreau (geôlier/esclavagiste)",
|
||||
"description": "<h1>Bourreau (geôlier/esclavagiste)</h1><p>Les bourreaux sont chargés des exécutions publiques décrétées par le tribunal ou les autorités.</p><p>Les geôliers s’occupent des prisons où croupissent les pires criminels des cités de Lémurie. Ils exercent leur sinistre activité dans de sordides cachots où ils se chargent d’extirper des informations aux prisonniers récalcitrants et aux ennemis des rois qui les emploient. Passés maîtres dans l’art de l’intimidation et de l’interrogatoire, ils possèdent de bonnes connaissances de base en anatomie et en premiers soins (des savoirs indispensables pour briser un prisonnier sans qu’il meure avant d’avoir parlé).</p><p>Les esclavagistes mènent des raids dans des terres lointaines pour capturer ou acheter des « sauvages » qu’ils ramènent dans les grandes cités de Lémurie afin de les revendre comme gladiateurs, travailleurs de force ou serviteurs, ou pour peupler de jeunes esclaves nubiles les harems des riches.</p><h2>Attributs</h2><p>les bourreaux ont rarement un score d’aura élevé, tandis que la vigueur reste un attribut indispensable pour accomplir une décapitation dans les règles de l’art ou pour maintenir le calme parmi leurs prisonniers.</p><h2>À l’aventure</h2><p>les geôliers quittent rarement leurs cachots humides, mais il peut arriver qu’un bourreau se retrouve frappé d’exil et contraint de mener une vie d’errance et d’aventure. Les esclavagistes sont toujours par monts et par vaux pour les besoins de leur sordide commerce.</p><h2>Combat</h2><p>les bourreaux préfèrent les grandes haches ou les épées à deux mains, tandis que certains esclavagistes sont particulièrement habiles avec un fouet. Les bourreaux ne sont pas des combattants très subtils et les guerriers expérimentés se laisseront rarement surprendre par leur style de combat brutal et sans finesse.</p><h2>Idées d’Avantages</h2><p>amis dans la pègre, arme favorite, colosse, dur à cuire, intimidant, récupération rapide.</p><h2>Idées de Désavantages</h2><p>bigleux, borgne/oreille coupée, cupide, dur d’oreille, fanatique, fanfaron, gars de la ville, illettré, inquiétant, lent à la détente, manchot/unijambiste, pataud, phobie, poltron, repoussant, soiffard.</p>"
|
||||
},
|
||||
"Chasseur (éclaireur/pisteur)": {
|
||||
"name": "Chasseur (éclaireur/pisteur)",
|
||||
"description": "<h1>Chasseur (éclaireur/pisteur)</h1><p>Le chasseur est passé maître dans l’art de pister et de traquer les animaux. Une fois qu’il a localisé sa proie, il utilise des techniques d’approche discrète, la pose de pièges, ou son habileté à l’arc pour l’abattre. Les chasseurs sont parfaitement à leur aise dans la nature sauvage et sont capables d’y survivre sur de longues périodes, pour ne retourner vers les zones civilisées qu’une fois qu’ils ont réuni suffisamment de fourrures et de peaux à vendre, ou quand la compagnie de leurs semblables commence à leur manquer.</p><h2>Attributs</h2><p>l’agilité est importante pour un chasseur, tout comme la vigueur et l’esprit, encore qu’à un moindre degré.</p><h2>À l’aventure</h2><p>la traque de bêtes féroces est déjà une aventure en soi. Mais les chasseurs connaissent très bien les territoires sur lesquels ils opèrent et il leur arrive de découvrir au gré de leurs pérégrinations d’anciennes pistes abandonnées, de vieilles ruines ou des lieux étranges. Pour cette raison, les chasseurs se voient fréquemment proposer de servir de guide à des groupes d’aventuriers.</p><h2>Combat</h2><p>un chasseur pourra recevoir un bonus de carrière ponctuel s’il affronte une créature sauvage qu’il connaît bien. En revanche, cette carrière est rarement utile contre des adversaires humains.</p><h2>Idées d’Avantages</h2><p>ami des bêtes, discret, fils des plaines, montagnard, odorat développé, ouïe fine, outillage, pisteur des marais, renard du désert, vigilant, vision nocturne, vue perçante.</p><h2>Idées de Désavantages</h2><p>borgne/oreille coupée, manchot/unijambiste, marin d’eau douce, taciturne.</p>"
|
||||
},
|
||||
"Danseur (acrobate/saltimbanque)": {
|
||||
"name": "Danseur (acrobate/saltimbanque)",
|
||||
"description": "<h1>Danseur (acrobate/saltimbanque)</h1><p>La danse est un divertissement apprécié en Lémurie. Toute cérémonie ou fête digne de ce nom se doit de comporter des danseurs ou des acrobates. Les danseurs sont de véritables athlètes, capables de prouesses en termes de précision, d’agilité et de coordination. Les saltimbanques maîtrisent aussi quelques tours de prestidigitation ou de jonglage, tandis que certaines danseuses pratiquent des danses exotiques et utilisent des voiles qui soulignent plus qu’ils ne masquent vraiment leurs attraits.</p><h2>Attributs</h2><p>les danseurs font principalement appel à leur agilité et leur aura. Les acrobates et les saltimbanques sont souvent plus costauds qu’ils n’y paraissent.</p><h2>À l’aventure</h2><p>les saltimbanques voyagent de ville en ville au sein de troupes itinérantes. Cela peut les confronter aux dangers de la route, qu’il s’agisse de bêtes féroces ou de brigands.</p><h2>Combat</h2><p>cette carrière n’a rien d’une carrière martiale et elle ne sera que rarement utile face à un combattant expérimenté. Dans certaines circonstances, une danseuse pourra obtenir un avantage ponctuel si son adversaire est déconcentré par ses charmes, ou en accomplissant une acrobatie, comme une roulade, pour surprendre son ennemi. Un acrobate pourra cependant tirer parti des lianes, des cordes ou des tentures murales pour effectuer de spectaculaires actions comme on peut en voir dans les films de cape et d’épée.</p><h2>Idées d’Avantages</h2><p>athlète, attirant, discret, doigts de fée, récupération rapide, roi de l’évasion, vigilant.</p><h2>Idées de Désavantages</h2><p>chétif, gars de la ville, non-combattant.</p>"
|
||||
},
|
||||
"Dresseur (maître des bêtes/montreur d’ours)": {
|
||||
"name": "Dresseur (maître des bêtes/montreur d’ours)",
|
||||
"description": "<h1>Dresseur (maître des bêtes/montreur d’ours)</h1><p>Les maîtres des bêtes sont demandés dans toute la Lémurie pour leur capacité à s’occuper des animaux, envers lesquels ils manifestent généralement une forme particulière d’empathie. Ils les dressent à être montés, à servir de bêtes de trait ou à combattre, que ce soit sur le champ de bataille ou dans une arène. Les dresseurs sont capables de calmer une créature enragée, de soigner des animaux blessés ou malades, de reconnaître une bête dangereuse et de dire si celle-ci est sur le point d’attaquer. En général, ce sont également des cavaliers émérites et de remarquables conducteurs d’attelage. Certains dresseurs tiennent leurs animaux par la peur et les privations plutôt que d’établir une relation de confiance avec eux.</p><h2>Attributs</h2><p>un dresseur doit posséder une forte personnalité et une détermination sans faille, tempérées par un cœur généreux (même si ce n’est pas toujours le cas). L’aura est donc l’attribut le plus important pour un dresseur, suivi de près par l’esprit.</p><h2>À l’aventure</h2><p>les dresseurs sont très demandés, que ce soit par des marchands organisant une caravane, par des nobles ou des militaires pour entraîner et soigner leurs montures, par des propriétaires d’arènes, ou par des aventuriers qui s’attendent à croiser d’étranges bêtes sauvages sur leur route.</p><h2>Combat</h2><p>un dresseur sait comment se comporter face à un animal et a des chances de connaître ses points faibles. Face à une bête sauvage, cette carrière pourra parfois apporter un avantage ponctuel.</p><h2>Idées d’Avantages</h2><p>ami des bêtes, baudrier de guerre, né en selle, odorat développé, ouïe fine, résistant aux poisons, vigilant, vision nocturne, vue perçante.</p><h2>Idées de Désavantages</h2><p>bouseux, illettré, impétueux, incapable de mentir.</p>"
|
||||
},
|
||||
"Esclave (serf/serviteur)": {
|
||||
"name": "Esclave (serf/serviteur)",
|
||||
"description": "<h1>Esclave (serf/serviteur)</h1><p>L’esclavage n’ est pas un choix de carrière évident pour un aventurier, mais il peut contribuer utilement à définir le personnage et offre quelques compétences et talents originaux.</p><p>Cette carrière permet à un personnage d’apprendre à ne pas se faire remarquer, à voir et écouter discrètement, à cuisiner, nettoyer, coudre, et à effectuer toutes sortes de travaux ménagers. Certains esclaves (les plus forts ou les fauteurs de trouble) sont parfois vendus aux arènes pour y combattre comme gladiateurs.</p><h2>Attributs</h2><p>selon à quoi ils sont employés, les esclaves ont besoin d’une bonne vigueur ou d’une bonne agilité. Les femmes esclaves voient leur situation s’améliorer (ou empirer !) si elles ont un bon score d’aura. Les esclaves trop intelligents sont généralement considérés comme des fauteurs de trouble.</p><h2>À l’aventure</h2><p>les esclaves à l’esprit aventureux ne restent pas longtemps sous le joug de leur maître, à moins bien sûr que cela ne serve leurs intérêts. Une vie d’esclave fugitif mène tout naturellement à l’aventure.</p><h2>Combat</h2><p>cette carrière n’ est pas d’un grand intérêt au combat. Toutefois des guerriers pourraient négliger de s’occuper d’un esclave, ne le considérant pas comme une menace, ce qui risque d’être une grave erreur.</p><h2>Idées d’Avantages</h2><p>colosse, discret, ouïe fine, roi de l’évasion.</p><h2>Idées de Désavantages</h2><p>foie jaune, gars de la ville, illettré, inadapté au froid, marin d’eau douce, maudit, muet, non-combattant, phobie, souffreteux, taciturne.</p>"
|
||||
},
|
||||
"Fermier (paysan/berger)": {
|
||||
"name": "Fermier (paysan/berger)",
|
||||
"description": "<h1>Fermier (paysan/berger)</h1><p>Les fermiers vivent à l’extérieur de l’enceinte de la cité, mais généralement à moins d’une journée de voyage de celle-ci, afin de pouvoir aller y vendre leurs récoltes. Ce sont des gens robustes habitués au dur labeur. Bons connaisseurs des plantes et des animaux dont ils savent prendre soin, les fermiers sont également capables de préparer la cuisine, de cuire du pain, de brasser de la bière, de négocier au meilleur prix leur production sur le marché local, etc.</p><h2>Attributs</h2><p>pour un fermier, il n’y a pas d’attribut plus important qu’un autre, encore que l’aura soit sans doute celui qui lui sera le moins utile.</p><h2>À l’aventure</h2><p>les fermiers ne sont pas particulièrement aventureux et il faut quelque événement inhabituel ou funeste pour les pousser à abandonner leur ferme et à se lancer dans une vie d’errance.</p><h2>Combat</h2><p>en général, les fermiers ne sont pas des combattants aguerris et ils ne recevront qu’exceptionnellement un avantage au combat en raison de cette carrière, par exemple s’ils défendent leurs terres contre des pillards ou utilisent un outil agricole comme arme improvisée.</p><h2>Idées d’Avantages</h2><p>ami des bêtes, bagarreur, fêtard, marqué par les dieux.</p><h2>Idées de Désavantages</h2><p>bouseux, crédule, lent à la détente, marin d’eau douce, pataud, repoussant, soiffard, taciturne.</p>"
|
||||
},
|
||||
"Forgeron (armurier)": {
|
||||
"name": "Forgeron (armurier)",
|
||||
"description": "<h1>Forgeron (armurier)</h1><p>Spécialisés dans le travail des métaux, ces artisans passent de longues heures dans leurs forges à créer et réparer des objets en métal. Ils fabriquent aussi bien des instruments et des outils que des armes et des armures, ou encore les pièces métalliques qui entrent dans la construction des galères et des nefs volantes. Les alchimistes font souvent appel à des forgerons pour fabriquer leurs inventions. Leur expérience leur est bien utile quand il s’agit d’estimer et de marchander le prix d’objets en métal, notamment les armes et armures.</p><h2>Attributs</h2><p>les forgerons sont souvent solidement bâtis, avec une bonne vigueur, car le dur labeur de la forge implique force et endurance.</p><h2>À l’aventure</h2><p>les forgerons ne sont pas vraiment des aventuriers, mais certains s’engagent parfois dans une troupe de mercenaires pour s’occuper de l’ entretien des armes et des armures.</p><h2>Combat</h2><p>bien qu’un forgeron ne soit pas à proprement parler un combattant, il pourra recevoir ponctuellement un bonus de mêlée s’il affronte un adversaire portant une armure métallique dont il connaît les spécificités et les éventuels points faibles.</p><h2>Idées d’Avantages</h2><p>arme favorite, bagarreur, baudrier de guerre, colosse, outillage.</p><h2>Idées de Désavantages</h2><p>crédule, impétueux, inadapté au froid, lent à la détente, taciturne.</p>"
|
||||
},
|
||||
"Gladiateur (champion, belluaire)": {
|
||||
"name": "Gladiateur (champion, belluaire)",
|
||||
"description": "<h1>Gladiateur (champion, belluaire)</h1><p>Les gladiateurs sont des experts du duel, habiles au maniement de toutes sortes d’armes et capables d’affronter des hommes ou des bêtes féroces avec style et panache. Les combattants des arènes sont généralement des esclaves, ou parfois des hommes libres contraints de se battre en remboursement d’une dette impayée ou en punition d’un crime. Ceux qui survivent au combat sont récompensés par les cris enthousiastes de la foule tandis que leur adversaire agonise à leurs pieds. Les meilleurs gladiateurs acquièrent une renommée qui dépasse le cadre de l’arène, et qui peut aussi bien jouer à leur avantage qu’à leur détriment.</p><h2>Attributs</h2><p>pour un gladiateur, la vigueur et l’agilité sont essentielles, mais les plus populaires des guerriers de l’arène possèdent aussi beaucoup d’aura.</p><h2>À l’aventure</h2><p>la vie de gladiateur ne conduit pas d’elle-même à l’aventure, mais de nombreux héros ont fait un passage dans les arènes, que ce soit par choix, par nécessité, ou au gré de circonstances particulières.</p><h2>Combat</h2><p>les gladiateurs sont entraînés à un style de combat dont le but n’ est pas simplement de tuer rapidement l’adversaire, mais de faire de la passe d’armes un échange de coups spectaculaires. Ils pourront obtenir un bonus au combat en tentant une botte particulièrement théâtrale, à condition de ne pas en abuser et, comme toujours, avec l’approbation du MJ.</p><h2>Idées d’Avantages</h2><p>arme favorite, athlète, bagarreur, baudrier de guerre, cri de guerre, dur à cuire, intimidant, marqué par les dieux, récupération rapide, vigilant.</p><h2>Idées de Désavantages</h2><p>borgne/oreille coupée, fanfaron, impétueux, manchot/unijambiste, signe distinctif.</p>"
|
||||
},
|
||||
"Marchand (colporteur/négociant)": {
|
||||
"name": "Marchand (colporteur/négociant)",
|
||||
"description": "<h1>Marchand (colporteur/négociant)</h1><p>Les marchands ne sont pas des boutiquiers, mais des négociants qui voyagent au loin, à la recherche de produits nouveaux et exotiques à acheter et à vendre. Les personnages marchands ont donc acquis de nombreux savoirs utiles. Ils maîtrisent l’art de la négociation, savent estimer les marchandises, ont de bonnes connaissances géographiques, et sont bien renseignés sur des villes et des régions lointaines ainsi que sur les institutions qui gouvernent les cités et les guildes. Si vous recherchez un objet rare ou inhabituel, parlez-en d’abord à un marchand !</p><h2>Attributs</h2><p>les marchands ont besoin d’un esprit vif et d’un certain degré d’aura pour marchander et faire des affaires.</p><h2>À l’aventure</h2><p>une vie itinérante est forcément une vie d’aventure, que le marchand la recherche ou pas. Les marchands sont toujours en quête de nouvelles contrées et de nouveaux marchés, ce qui les entraîne dans de nombreuses aventures.</p><h2>Combat</h2><p>la carrière de marchand n’étant pas une carrière martiale, elle ne sera presque jamais utile à un personnage engagé au combat.</p><h2>Idées d’Avantages</h2><p>beau parleur, fortuné, perspicace, savant.</p><h2>Idées de Désavantages</h2><p>cupide, lent à la détente, non-combattant, obsession.</p>"
|
||||
},
|
||||
"Marin (matelot/pirate)": {
|
||||
"name": "Marin (matelot/pirate)",
|
||||
"description": "<h1>Marin (matelot/pirate)</h1><p>Les marins sont les combattants et les aventuriers des mers. Ils savent manœuvrer une embarcation, s’orienter aux étoiles, ont de bonnes connaissances sur le milieu marin ainsi que sur les ports et les îles côtières.</p><p>Les matelots expérimentés sont toujours recherchés, et il est rare qu’un capitaine refuse d’accepter à son bord un matelot prêt à payer son voyage en participant à la manœuvre.</p><p>Les pirates sont les brigands des mers. Ils parlent leur propre version du lémurien, qu’on appelle l’argot des mers.</p><h2>Attributs</h2><p>les marins ont besoin d’une bonne vigueur et d’une bonne agilité.</p><h2>À l’aventure</h2><p>la vie en mer ne manque pas d’aventures. Les monstres marins, les batailles navales, les ports exotiques remplis de gens étranges et les cartes au trésor sont le pain quotidien des loups de mer.</p><h2>Combat</h2><p>un marin pourra recevoir un bonus ponctuel lors d’affrontements en mer, et peut-être aussi contre des créatures marines qu’il aurait déjà combattues ou dont il aurait entendu parler.</p><h2>Idées d’Avantages</h2><p>amis dans la pègre, athlète, bagarreur, baudrier de guerre, cri de guerre, discret, doigts de fée, fêtard, pied marin, vigilant, vue perçante.</p><h2>Idées de Désavantages</h2><p>borgne/oreille coupée, cupide, fanfaron, illettré, impétueux, lubrique, manchot/unijambiste, méfiance envers la sorcellerie, phobie, signe distinctif, soiffard.</p>"
|
||||
},
|
||||
"Médecin (guérisseur/rebouteux)": {
|
||||
"name": "Médecin (guérisseur/rebouteux)",
|
||||
"description": "<h1>Médecin (guérisseur/rebouteux)</h1><p>Les médecins et tous ceux capables de soigner les personnes blessées ou malades jouissent d’un grand respect au sein des villes de Lémurie. La population sait reconnaître l’importance de leur mission et l’étendue de leur savoir, même si les petites gens n’ont pas forcément les moyens de s’offrir les services d’un vrai médecin et s’en remettent plutôt à des charlatans.</p><p>Les médecins prescrivent des potions et des onguents, savent réduire les fractures, recoudre les plaies et aident à mettre les enfants au monde. Ils connaissent les maladies et leurs remèdes, savent administrer les premiers soins, et les plantes médicinales n’ont plus de secret pour eux. Souvent, ils possèdent un petit jardin où ils cultivent des herbes aux vertus curatives puissantes. Certains médecins ont des connaissances de base en alchimie (cf. chapitre 6), et tous se doivent bien sûr de savoir lire et écrire.</p><h2>Attributs</h2><p>l’esprit est l’attribut essentiel pour un médecin.</p><h2>À l’aventure</h2><p>la carrière de médecin n’ est pas en elle-même propice à une vie d’aventure, mais il arrive que des médecins soient recrutés pour accompagner une expédition maritime ou une armée en marche.</p><h2>Combat</h2><p>au combat, la carrière de médecin n’ est pas d’un grand secours. Ce n’ est qu’après le combat qu’elle révèle tout son intérêt !</p><h2>Idées d’Avantages</h2><p>bibliothèque savante, doigts de fée, érudit, mains guérisseuses, résistant aux poisons, santé de fer.</p><h2>Idées de Désavantages</h2><p>foie jaune, gars de la ville, incapable de mentir, non-combattant, soiffard.</p>"
|
||||
},
|
||||
"Mendiant (vagabond/clochard)": {
|
||||
"name": "Mendiant (vagabond/clochard)",
|
||||
"description": "<h1>Mendiant (vagabond/clochard)</h1><p>Les vagabonds errent d’un lieu à l’autre avec pour seul objectif de réussir à survivre. Ils peuvent à l’occasion travailler ici ou là, vendre quelques babioles sorties de leur besace, ou simplement mendier dans les rues quand les temps sont vraiment durs. En dernier recours, certains s’adonnent à de petits larcins pour se remplir le ventre.</p><h2>Attributs</h2><p>aucun attribut n’ est plus important que les autres pour un mendiant. Être affligé d’une difformité, d’un handicap, ou d’une maladie repoussante (ou simplement le simuler) peut cependant se révéler utile quand il s’agit de faire appel à la compassion des passants.</p><h2>À l’aventure</h2><p>la vie d’un vagabond implique des rencontres en tous genres sur les routes, ce qui peut mener à l’aventure sans même la rechercher.</p><h2>Combat</h2><p>en général, un mendiant n’a rien d’un combattant. Cette carrière ne pourra donc se révéler utile dans le cadre d’un combat, sauf quand le personnage fait de son mieux pour ne pas être remarqué.</p><h2>Idées d’Avantages</h2><p>amis dans la pègre, discret, doigts de fée, gamin des rues.</p><h2>Idées de Désavantages</h2><p>addiction, borgne/ oreille coupée, chétif, gars de la ville, illettré, indigne de confiance, malédiction de Morgazzon, manchot/ unijambiste, maudit, non-combattant, signe distinctif, soiffard, souffreteux.</p>"
|
||||
},
|
||||
"Ménestrel (barde/poète)": {
|
||||
"name": "Ménestrel (barde/poète)",
|
||||
"description": "<h1>Ménestrel (barde/poète)</h1><p>Artistes itinérants, les ménestrels chantent des chansons, jouent de la musique, récitent des poèmes, racontent des fables et des légendes. Ils inventent souvent leurs propres contes ou apprennent des histoires fameuses auxquelles ils ne manquent pas d’apporter leur touche personnelle. Certains ménestrels n’ errent pas de ville en ville pour exercer leur art, mais sont attachés au service de quelque noble et fortuné personnage qui les garde auprès de lui pour le divertir.</p><p>Ces artistes sont toujours heureux de jouer pour un large public et de récolter quelques piécettes pour leur effort. Certains ménestrels étendent leurs talents au jonglage et à la prestidigitation, ce qui peut être une bonne couverture pour un personnage qui est aussi voleur. Comme ils voyagent beaucoup et sont aussi doués pour écouter que pour captiver les foules par leurs récits, ils connaissent de nombreuses légendes anciennes et ont une bonne connaissance du monde et des événements qui agitent les cités. Les ménestrels sont souvent de grands séducteurs ; ils ont un don certain pour savoir trouver les mots qui toucheront le cœur des belles.</p><h2>Attributs</h2><p>la carrière de ménestrel exige un bon score d’aura, ainsi qu’une bonne dose d’agilité et un esprit aiguisé.</p><h2>À l’aventure</h2><p>les ménestrels sont itinérants, ce qui les expose forcément aux dangers de la route. Certains choisissent d’accompagner des soldats et des aventuriers afin de connaître eux-mêmes l’excitation de l’aventure et de créer des récits épiques basés sur ce qu’ils auront vécu.</p><h2>Combat</h2><p>la carrière de ménestrel n’ est pas à la base une carrière martiale, et celle-ci n’accordera de bonus au combat que dans de rares situations. Un tour de passe-passe ou une diversion pourra éventuellement permettre à un ménestrel de surprendre son adversaire, ou plus probablement lui offrir une chance de prendre ses jambes à son cou.</p><h2>Idées d’Avantages</h2><p>artiste, attirant, beau parleur, érudit, fêtard, inspirateur, maître du déguisement, ouïe fine, outillage (instrument de musique), perspicace.</p><h2>Idées de Désavantages</h2><p>arrogant, chétif, lubrique, non-combattant, soiffard.</p>"
|
||||
},
|
||||
"Mercenaire (brigand/guerrier)": {
|
||||
"name": "Mercenaire (brigand/guerrier)",
|
||||
"description": "<h1>Mercenaire (brigand/guerrier)</h1><p>Les mercenaires sont des guerriers qui louent leurs services au plus offrant. Certains s’assemblent en troupes sous l’autorité d’un chef respecté, tandis que d’autres voyagent seuls ou en petits groupes à la recherche d’un employeur.</p><p>Ces petites bandes se tournent fréquemment vers le brigandage quand elles se retrouvent trop longtemps sans engagement. Toutes les cités de Lémurie ont déjà fait appel à des mercenaires pour mener leurs guerres et la profession a encore de beaux jours devant elle. Rudes guerriers, bons cavaliers pour certains, les mercenaires savent se montrer intimidants, entretenir leurs armes et leur équipement et se débrouiller pour vivre à la dure en pleine nature. En ville, ils fréquentent assidûment tavernes et tripots.</p><h2>Attributs</h2><p>pour s’adonner au métier des armes, les mercenaires doivent posséder de bonnes prédispositions en vigueur et en agilité.</p><h2>À l’aventure</h2><p>par nature, les mercenaires sont des vagabonds qui parcourent la Lémurie en quête d’un nouvel engagement. Même en temps de paix, ils trouvent à s’employer pour escorter les caravanes marchandes, participer à des expéditions de chasseurs de trésor, ou servir de gardes du corps pour la noblesse.</p><h2>Combat</h2><p>les mercenaires sont connus pour se battre d’autant mieux que la paie est bonne, et pour mettre peu de cœur à l’ouvrage (voire tourner casaque) quand ils sont mal payés ou abusés. Au combat, un mercenaire pourra recevoir un bonus de carrière ponctuel si sa paie est particulièrement satisfaisante.</p><h2>Idées d’Avantages</h2><p>arme favorite, bagarreur, baudrier de guerre, combat à l’aveugle, cri de guerre, dur à cuire, fêtard, inspirateur, né en selle, récupération rapide, vigilant.</p><h2>Idées de Désavantages</h2><p>cupide, fanfaron, impétueux, lubrique.</p>"
|
||||
},
|
||||
"Noble (aristocrate/courtisan)": {
|
||||
"name": "Noble (aristocrate/courtisan)",
|
||||
"description": "<h1>Noble (aristocrate/courtisan)</h1><p>Ces personnages, qui portent généralement un titre de noblesse (sans forcément le mériter), jouissent d’une certaine autorité sur les gens du peuple, les paysans et les esclaves. Ils possèdent souvent de belles propriétés en ville ou des villas dans la campagne environnante, sont en mesure d’obtenir des prêts monétaires, disposent de contacts haut placés, connaissent les règles de l’étiquette et savent s’habiller avec élégance. La vie de courtisan développe également leurs talents pour ce qui est du mensonge, du chantage et de l’intimidation.</p><h2>Attributs</h2><p>les nobles ont besoin d’une aura forte ainsi que d’un esprit vif, même si, en fin de compte, c’est bien souvent la richesse qui dicte sa loi.</p><h2>À l’aventure</h2><p>les nobles n’ont pas de goût particulier pour l’aventure, même s’il arrive qu’ils financent des expéditions lointaines à la recherche d’artefacts anciens ou montent des opérations de négoce. Certains nobles audacieux se joignent parfois à ces expéditions afin d’en assumer eux-mêmes la direction.</p><h2>Combat</h2><p>une carrière de noble apportera rarement un avantage au combat. Toutefois, des paysans ou des gens du bas peuple pourront, selon les circonstances, manifester des réticences à s’en prendre à un de leurs supérieurs. Les nobles se retrouvent souvent comme commandants à la tête d’armées, qu’ils en aient les qualités ou pas.</p><h2>Idées d’Avantages</h2><p>amis haut placés, attirant, bien né, fortuné, inspirateur, né en selle.</p><h2>Idées de Désavantages</h2><p>addiction, arrogant, cupide, fanfaron, gars de la ville, impétueux, lubrique.</p>"
|
||||
},
|
||||
"Ouvrier (docker, manœuvre)": {
|
||||
"name": "Ouvrier (docker, manœuvre)",
|
||||
"description": "<h1>Ouvrier (docker, manœuvre)</h1><p>Les ouvriers sont les travailleurs manuels, ceux qui montent les palissades, creusent les fossés, construisent les maisons, édifient les remparts et les temples, chargent et déchargent les chariots et les bateaux. Ils se déplacent souvent au gré des emplois, dont beaucoup sont saisonniers ou temporaires. Les ouvriers sont habitués à travailler dur et à porter de lourdes charges ; ils savent aussi tenir l’alcool et s’y entendent en intimidation. Certaines des tâches qu’effectuent les ouvriers sont parfois confiées à des esclaves.</p><h2>Attributs</h2><p>une forte vigueur est utile aux travailleurs de force que sont les ouvriers.</p><h2>À l’aventure</h2><p>le labeur des ouvriers est monotone et pas vraiment propice à l’aventure. Un personnage qui possède cette carrière n’a pas dû l’exercer très longtemps.</p><h2>Combat</h2><p>les ouvriers ne sont pas vraiment des combattants, même s’ils ont tendance à régler les disputes à coups de poing. Ils peuvent recevoir un bonus lors d’une bagarre, notamment quand il s’agit de saisir ou d’étrangler leur adversaire.</p><h2>Idées d’Avantages</h2><p>bagarreur, colosse, dur à cuire, fêtard, intimidant, outillage, résistant aux poisons, vigueur céruléenne.</p><h2>Idées de Désavantages</h2><p>dur d’oreille, illettré, impétueux, incapable de mentir, inquiétant, lubrique, pataud, phobie, soiffard, taciturne.</p>"
|
||||
},
|
||||
"Pilote des airs": {
|
||||
"name": "Pilote des airs",
|
||||
"description": "<h1>Pilote des airs</h1><p>Les pilotes des airs représentent l’élite des combattants de Satarla. Formés au pilotage et à l’entretien des nefs volantes, ce sont aussi des navigateurs et des observateurs expérimentés qui remplissent de nombreuses missions en tant qu’éclaireurs, explorateurs ou messagers. Ce sont généralement d’anciens soldats, souvent d’origine noble.</p><h2>Attributs</h2><p>esprit et agilité sont très utiles à un pilote des airs, ainsi que vigueur, dans une moindre mesure.</p><h2>À l’aventure</h2><p>un pilote des airs est par essence un casse-cou et quiconque est passé par cette carrière manifeste forcément un goût pour l’aventure.</p><h2>Combat</h2><p>un pilote des airs aura toujours un avantage au combat contre un adversaire peu familier des nefs volantes, à condition bien sûr que l’affrontement ait lieu en plein ciel.</p><h2>Idées d’Avantages</h2><p>amis haut placés, arme favorite, athlète, bien né, fortuné, inspirateur, marqué par les dieux, vue perçante.</p><h2>Idées de Désavantages</h2><p>arrogant, fanfaron, gars de la ville, impétueux.</p>"
|
||||
},
|
||||
"Prêtre (druide/chaman)": {
|
||||
"name": "Prêtre (druide/chaman)",
|
||||
"description": "<h1>Prêtre (druide/chaman)</h1><p>Au sein des temples que l’on rencontre dans toutes les grandes cités de Lémurie, les prêtres dirigent le culte rendu aux dieux et sont les interprètes de la volonté divine. Ce sont des lettrés instruits en théologie, en savoir antique et en langues anciennes, en astrologie et en astronomie. Leur fonction leur confère un statut particulier au sein de la cité, et ils jouissent d’une forte influence sur les affaires politiques, mais aussi sur l’armée et la population en général.</p><p>Les druides rendent un culte aux Seigneurs Sombres et sont moins « fréquentables », notamment du fait qu’ils pratiquent les sacrifices humains.</p><p>Vous trouverez davantage d’informations sur les prêtres au chapitre 6.</p><h2>Attributs</h2><p>les prêtres ont surtout besoin d’un esprit aiguisé, mais les meilleurs d’entre eux ont également l’aura nécessaire pour attirer les fidèles en nombre.</p><h2>À l’aventure</h2><p>certains prêtres mènent une vie particulièrement aventureuse, toujours en quête de savoirs anciens ou de reliques liées à leurs dieux. D’autres préfèrent une vie plus paisible et ne quittent que rarement la sécurité de leur temple.</p><h2>Combat</h2><p>une carrière de prêtre n’apporte aucun avantage au combat, si ce n’est éventuellement lors d’un affrontement face à des adversaires superstitieux qui hésiteront à s’en prendre à un serviteur des dieux.</p><h2>Idées d’Avantages</h2><p>amis haut placés, beau parleur, érudit, inspirateur, marqué par les dieux, perspicace, résistant à la magie, savant, sentir la magie.</p><h2>Idées de Désavantages</h2><p>addiction, arrogant, fanatique, foie jaune, malédiction de Morgazzon, méfiance envers la sorcellerie, non-combattant, obsession.</p><h2>Langues</h2><p>les prêtres et les druides doivent apprendre le démonique s’ils veulent pouvoir utiliser les puissantes créations magiques et alchimiques de l’antique race des Rois-Sorciers. Ce langage est particulièrement ardu et ses formes orale et écrite exigent d’être apprises séparément.</p>"
|
||||
},
|
||||
"Scribe (érudit/copiste)": {
|
||||
"name": "Scribe (érudit/copiste)",
|
||||
"description": "<h1>Scribe (érudit/copiste)</h1><p>Savants et pédagogues, les scribes sont pourvus d’une solide érudition qui couvre une large variété de sujets. Ils sont mathématiciens, cartographes, astronomes, linguistes, historiens et philosophes. Certains se chargent plus spécifiquement de la tâche fastidieuse de copier les manuscrits anciens. Les scribes sont aussi des débatteurs de talent, habitués aux discussions passionnées entre beaux esprits. Il va sans dire que les scribes savent lire et écrire.</p><h2>Attributs</h2><p>l’esprit est l’attribut essentiel pour un scribe.</p><h2>À l’aventure</h2><p>les scribes font d’ordinaire de piètres aventuriers, mais il peut être très utile pour un groupe d’avoir avec lui un personnage aussi érudit.</p><h2>Combat</h2><p>même si les scribes aiment à rappeler que « la plume est plus forte que l’épée », il y a peu de situations où cette carrière pourra être d’une quelconque utilité au combat.</p><h2>Idées d’Avantages</h2><p>bibliothèque savante, érudit, savant.</p><h2>Idées de Désavantages</h2><p>chétif, foie jaune, gars de la ville, incapable de mentir, non-combattant, obsession.</p>"
|
||||
},
|
||||
"Soldat (garde/milicien)": {
|
||||
"name": "Soldat (garde/milicien)",
|
||||
"description": "<h1>Soldat (garde/milicien)</h1><p>Les soldats sont les combattants professionnels payés pour garder les remparts d’une cité ou constituer les armées des rois. Stoïques, habitués à obéir aux ordres, ce ne sont pas les plus imaginatifs des guerriers. Les soldats, qui peuvent être aussi de bons cavaliers, savent se montrer intimidants et jouissent d’une certaine autorité, surtout quand ils sont officiers. Ils connaissent bien la cité qu’ils servent, ainsi que la rude vie des camps militaires.</p><h2>Attributs</h2><p>la vigueur est normalement l’attribut essentiel pour un soldat, mais les archers et les cavaliers auront besoin d’une bonne agilité. Les officiers doivent avoir de l’aura pour diriger leurs hommes et un esprit aiguisé pour établir de solides plans de bataille.</p><h2>À l’aventure</h2><p>la plupart des soldats manquent d’inspiration et de fantaisie pour faire de bons aventuriers. En revanche, le temps passé à l’armée permet à un personnage d’affûter ses talents martiaux en attendant de repartir à l’aventure.</p><h2>Combat</h2><p>les soldats pourront parfois bénéficier d’un bonus de carrière au combat, notamment s’ils se battent selon une tactique établie, au sein d’une unité bien commandée.</p><h2>Idées d’Avantages</h2><p>arme favorite, athlète, bagarreur, dur à cuire, fêtard, inspirateur, né en selle, récupération rapide.</p><h2>Idées de Désavantages</h2><p>crédule, dur d’oreille, fanfaron, lubrique, soiffard, taciturne.</p>"
|
||||
},
|
||||
"Sorcier (magicien/enchanteur)": {
|
||||
"name": "Sorcier (magicien/enchanteur)",
|
||||
"description": "<h1>Sorcier (magicien/enchanteur)</h1><p>Les sorciers sont à la fois craints et respectés. Personne ne les fréquente volontiers à moins d’une absolue nécessité car, dans leur grande majorité, ce sont des êtres immoraux et déséquilibrés, quand ils ne sont pas totalement déments et malfaisants. Les sorciers vivent généralement seuls, uniquement entourés de quelques serviteurs ou d’un apprenti. Ils s’adonnent à l’étude de sciences ésotériques comme l’astrologie, l’astronomie et la démonologie, recherchent fiévreusement d’antiques manuscrits interdits renfermant un savoir occulte, quand ils ne concluent pas des pactes avec les démons afin d’apprendre des mots de pouvoir capables de façonner le tissu de la réalité.</p><p>Beaucoup sont originaires de Zalut, la cité des magiciens, mais on trouve des sorciers de moindre envergure dans presque toutes les grandes cités de Lémurie (à exception de Tyrus, où ils sont proscrits). Vous trouverez davantage d’informations sur les sorciers au chapitre 6.</p><h2>Attributs</h2><p>les sorciers ont besoin d’un esprit fort, à la fois pour mener leurs études et pour être en mesure de lancer des sorts puissants.</p><h2>À l’aventure</h2><p>les sorciers ne font pas de bons aventuriers, préférant déléguer ce genre de choses à leurs sbires et à leurs serviteurs. Mais il arrive parfois qu’ils quittent leur antre pour prendre part eux-mêmes à une expédition dont ils espèrent quelque gain mystique d’importance.</p><h2>Combat</h2><p>rares sont les circonstances où le fait d’être sorcier offre un avantage durant un combat utilisant des armes ordinaires. Mais cela importe peu, car les sorciers talentueux n’ont pas besoin de savoir manier une épée pour venir à bout d’un adversaire.</p><h2>Carrière dangereuse</h2><p>la sorcellerie est un moyen rapide d’obtenir du pouvoir, mais elle a un prix. Pour chaque rang de cette carrière au-delà du premier, vous devez choisir un désavantage supplémentaire (cf. chapitre 5). Cela s’applique également si vous choisissez d’augmenter votre rang de sorcier plus tard dans le jeu, par l’utilisation de points d’expérience.</p><h2>Idées d’Avantages</h2><p>bibliothèque savante, érudit, magie des Rois-Sorciers, perspicace, pouvoir du Néant, résistant à la magie, savant.</p><h2>Idées de Désavantages</h2><p>addiction, arrogant, distrait, indigne de confiance, inquiétant, malédiction de Morgazzon, mauvaise réputation, non-combattant, obsession, phobie, signe distinctif, souffreteux.</p><h2>Langues</h2><p>les sorciers doivent apprendre le démonique s’ils veulent pouvoir utiliser les puissantes créations magiques et alchimiques de l’antique race des Rois-Sorciers. Ce langage est particulièrement ardu et ses formes orale et écrite exigent d’être apprises séparément.</p>"
|
||||
},
|
||||
"Tentatrice (courtisane/serveuse)": {
|
||||
"name": "Tentatrice (courtisane/serveuse)",
|
||||
"description": "<h1>Tentatrice (courtisane/serveuse)</h1><p>Certaines personnes ont élevé la séduction au rang d’art. La tentatrice peut être la maîtresse d’un noble, une prostituée, ou une simple serveuse de taverne (qui, peut-être, fait les poches des clients distraits par ses charmes), mais dans tous les cas elle sait utiliser son pouvoir sur les hommes pour arriver à ses fins. Elle est aussi dangereuse qu’elle est belle, car c’est le genre de femme pour laquelle les hommes se battent et les guerres éclatent. Une tentatrice est passée maîtresse dans l’art de la manipulation et de la séduction.</p><p>N.B. Barbarians of Lemuria étant conçu pour évoquer les thèmes et l’ambiance des histoires classiques de Sword & Sorcery, cette carrière est présentée au féminin, mais peut très bien être prise par un personnage masculin, selon les circonstances.</p><h2>Attributs</h2><p>l’aura est l’attribut le plus important pour une tentatrice. L’agilité et l’esprit sont également utiles.</p><h2>À l’aventure</h2><p>les tentatrices ne sont d’habitude pas très aventureuses (du moins en dehors d’un lit !), et il faudra donc que d’autres carrières viennent expliquer ce choix peu probable d’une vie itinérante à courir le danger.</p><h2>Combat</h2><p>cette carrière est rarement utile au combat, encore qu’une tentatrice puisse utiliser son rang dans cette carrière pour distraire des gardes, par exemple.</p><h2>Idées d’Avantages</h2><p>amis dans la pègre, amis haut placés, attirant, beau parleur, discret, doigts de fée, fêtard, inspirateur.</p><h2>Idées de Désavantages</h2><p>chétif, gars de la ville, impétueux, lent à la détente, lubrique, noncombattant.</p>"
|
||||
},
|
||||
"Voleur (filou/crapule)": {
|
||||
"name": "Voleur (filou/crapule)",
|
||||
"description": "<h1>Voleur (filou/crapule)</h1><p>Votre personnage est tombé dans le crime, à moins qu’il n’ait commencé sa vie comme gamin des rues obligé de voler pour survivre. Quoi qu’il en soit, il possède certains talents, que beaucoup jugent peu recommandables. Les voleurs savent grimper aux murs et crocheter les serrures, se faufiler discrètement, faire les poches des passants, monter des arnaques ou tricher aux jeux de hasard. Ils savent aussi se renseigner sur ce qui se passe en ville et appartiennent parfois à une « guilde », une organisation qui réunit les criminels de la cité.</p><h2>Attributs</h2><p>les voleurs ont besoin d’une bonne agilité, mais aussi d’un esprit aiguisé.</p><h2>À l’aventure</h2><p>les bons voleurs font des recrues de choix pour les aventuriers prévoyant d’explorer des temples ou des tombeaux renfermant des trésors protégés par des pièges et de solides serrures.</p><h2>Combat</h2><p>en général, les voleurs cherchent plutôt à éviter le combat. Ils peuvent bénéficier d’un bonus de carrière quand ils cherchent à prendre la poudre d’escampette, surtout face aux gardes de la cité.</p><h2>Idées d’Avantages</h2><p>amis dans la pègre, discret, doigts de fée, fêtard, gamin des rues, ouïe fine, outillage (outils de voleur), roi de l’évasion, vigilant, vision nocturne.</p><h2>Idées de Désavantages</h2><p>cupide, gars de la ville, illettré, indigne de confiance, mauvaise réputation, poltron, souffreteux, traqué.</p>"
|
||||
}
|
||||
}
|
||||
}
|
25
compendiums/en/bol.effets-exemples.json
Normal file
@ -0,0 +1,25 @@
|
||||
{
|
||||
"label": "Effets - Exemples",
|
||||
"mapping": {
|
||||
"description": "system.description"
|
||||
},
|
||||
|
||||
"entries": {
|
||||
"Agilité -1": {
|
||||
"name": "Agilité -1",
|
||||
"description": ""
|
||||
},
|
||||
"Aura -1": {
|
||||
"name": "Aura -1",
|
||||
"description": ""
|
||||
},
|
||||
"Esprit -1": {
|
||||
"name": "Esprit -1",
|
||||
"description": ""
|
||||
},
|
||||
"Vigueur -1": {
|
||||
"name": "Vigueur -1",
|
||||
"description": ""
|
||||
}
|
||||
}
|
||||
}
|
181
compendiums/en/bol.equipment.json
Normal file
@ -0,0 +1,181 @@
|
||||
{
|
||||
"label": "Equipement",
|
||||
"mapping": {
|
||||
"description": "system.description"
|
||||
},
|
||||
|
||||
"entries": {
|
||||
"Aumonière": {
|
||||
"name": "Aumonière",
|
||||
"description": ""
|
||||
},
|
||||
"Bague": {
|
||||
"name": "Bague",
|
||||
"description": ""
|
||||
},
|
||||
"Bottes": {
|
||||
"name": "Bottes",
|
||||
"description": ""
|
||||
},
|
||||
"Bougie": {
|
||||
"name": "Bougie",
|
||||
"description": ""
|
||||
},
|
||||
"Bourse": {
|
||||
"name": "Bourse",
|
||||
"description": ""
|
||||
},
|
||||
"Cape de Marchand": {
|
||||
"name": "Cape de Marchand",
|
||||
"description": ""
|
||||
},
|
||||
"Capuchon": {
|
||||
"name": "Capuchon",
|
||||
"description": ""
|
||||
},
|
||||
"Carquois": {
|
||||
"name": "Carquois",
|
||||
"description": ""
|
||||
},
|
||||
"Ceinture": {
|
||||
"name": "Ceinture",
|
||||
"description": ""
|
||||
},
|
||||
"Chapeau": {
|
||||
"name": "Chapeau",
|
||||
"description": ""
|
||||
},
|
||||
"Chope": {
|
||||
"name": "Chope",
|
||||
"description": ""
|
||||
},
|
||||
"Collier": {
|
||||
"name": "Collier",
|
||||
"description": ""
|
||||
},
|
||||
"Corde + Grappin": {
|
||||
"name": "Corde + Grappin",
|
||||
"description": ""
|
||||
},
|
||||
"Cuir Brut": {
|
||||
"name": "Cuir Brut",
|
||||
"description": ""
|
||||
},
|
||||
"Dés à Jouer": {
|
||||
"name": "Dés à Jouer",
|
||||
"description": ""
|
||||
},
|
||||
"Fourrure Brute": {
|
||||
"name": "Fourrure Brute",
|
||||
"description": ""
|
||||
},
|
||||
"Gants": {
|
||||
"name": "Gants",
|
||||
"description": ""
|
||||
},
|
||||
"Gourde": {
|
||||
"name": "Gourde",
|
||||
"description": ""
|
||||
},
|
||||
"Instrument de Musique": {
|
||||
"name": "Instrument de Musique",
|
||||
"description": ""
|
||||
},
|
||||
"Lanterne + Huile + Silex": {
|
||||
"name": "Lanterne + Huile + Silex",
|
||||
"description": ""
|
||||
},
|
||||
"Lingot d'Acier": {
|
||||
"name": "Lingot d'Acier",
|
||||
"description": ""
|
||||
},
|
||||
"Lingot D'Or": {
|
||||
"name": "Lingot D'Or",
|
||||
"description": ""
|
||||
},
|
||||
"Livre": {
|
||||
"name": "Livre",
|
||||
"description": ""
|
||||
},
|
||||
"Manteau": {
|
||||
"name": "Manteau",
|
||||
"description": ""
|
||||
},
|
||||
"Materiel de Pêche": {
|
||||
"name": "Materiel de Pêche",
|
||||
"description": ""
|
||||
},
|
||||
"Mortier": {
|
||||
"name": "Mortier",
|
||||
"description": ""
|
||||
},
|
||||
"Nécessaire d'Alchimie": {
|
||||
"name": "Nécessaire d'Alchimie",
|
||||
"description": ""
|
||||
},
|
||||
"Nécessaire D'Ecriture": {
|
||||
"name": "Nécessaire D'Ecriture",
|
||||
"description": ""
|
||||
},
|
||||
"Nécessaire de Forge": {
|
||||
"name": "Nécessaire de Forge",
|
||||
"description": ""
|
||||
},
|
||||
"Nécessaire de Survie": {
|
||||
"name": "Nécessaire de Survie",
|
||||
"description": ""
|
||||
},
|
||||
"Outils de Crochetage": {
|
||||
"name": "Outils de Crochetage",
|
||||
"description": ""
|
||||
},
|
||||
"Outils de Menuiserie": {
|
||||
"name": "Outils de Menuiserie",
|
||||
"description": ""
|
||||
},
|
||||
"Outre": {
|
||||
"name": "Outre",
|
||||
"description": ""
|
||||
},
|
||||
"Pantalon": {
|
||||
"name": "Pantalon",
|
||||
"description": ""
|
||||
},
|
||||
"Parchemins": {
|
||||
"name": "Parchemins",
|
||||
"description": ""
|
||||
},
|
||||
"Petit Chaudron": {
|
||||
"name": "Petit Chaudron",
|
||||
"description": ""
|
||||
},
|
||||
"Petit Coffre": {
|
||||
"name": "Petit Coffre",
|
||||
"description": ""
|
||||
},
|
||||
"Piege": {
|
||||
"name": "Piege",
|
||||
"description": ""
|
||||
},
|
||||
"Pierre Precieuse": {
|
||||
"name": "Pierre Precieuse",
|
||||
"description": ""
|
||||
},
|
||||
"Ration de Voyage": {
|
||||
"name": "Ration de Voyage",
|
||||
"description": ""
|
||||
},
|
||||
"Sac": {
|
||||
"name": "Sac",
|
||||
"description": ""
|
||||
},
|
||||
"Sac a Dos": {
|
||||
"name": "Sac a Dos",
|
||||
"description": ""
|
||||
},
|
||||
"Torche": {
|
||||
"name": "Torche",
|
||||
"description": ""
|
||||
}
|
||||
}
|
||||
}
|
129
compendiums/en/bol.fightoptions.json
Normal file
@ -0,0 +1,129 @@
|
||||
{
|
||||
"label": "Options de Combat",
|
||||
"mapping": {
|
||||
"description": "system.description"
|
||||
},
|
||||
|
||||
"entries": {
|
||||
"L’Oeil du Chasseur (Viser)": {
|
||||
"name": "L’Oeil du Chasseur (Viser)",
|
||||
"description": "<p>Armes de jet ou de tir uniquement. Vous passez le round à viser. Vous bénéficiez d’un bonus de +2 à votre prochain jet de tir ou de lancer.</p>"
|
||||
},
|
||||
"L’oeil du Mercenaire (Observer)": {
|
||||
"name": "L’oeil du Mercenaire (Observer)",
|
||||
"description": "<p>Vous observez attentivement l’un des adversaires ou un groupe d’adversaires similaires. Vous ne<br>portez pas d’attaque.</p>\n<p>Si vous réussissez un jet d’Esprit + Carrière guerrière (mercenaire, soldat, etc.) en observant l’adversaire, vous pouvez donner un bonus de +2 à l’attaque ou à la défense à l’un de vos allié contre ce même adversaire pour sa prochaine action de ce type. Une seule assistance peut être obtenue pour un même adversaire.</p>"
|
||||
},
|
||||
"La Corde de Tyrus (Arc de Tyrus)": {
|
||||
"name": "La Corde de Tyrus (Arc de Tyrus)",
|
||||
"description": "<p>Uniquement avec un arc long de Tyrus. Vous tendez la corde si fort que votre flèche porte plus loin.</p>\n<p>Votre attaque souffre d’un malus de -2, mais si elle réussit, vous doublez la distance de tir de l’Arc (44m au lieu de 22m).</p>"
|
||||
},
|
||||
"La Danseuse (Combat à Deux Armes - Défensif)": {
|
||||
"name": "La Danseuse (Combat à Deux Armes - Défensif)",
|
||||
"description": "<p>Vous ne pouvez utiliser que des armes légères ou moyennes.</p>\n<p>Vous attaquez avec une arme et parez avec l’autre. Vous considérez l’arme de parade comme l’équivalent d’un petit bouclier (+1 en défense contre une attaque), mais vous subissez un malus de -1 sur votre jet d’attaque avec votre autre arme.</p>"
|
||||
},
|
||||
"La Feinte du Druide (Attaque au Défaut d'armure)": {
|
||||
"name": "La Feinte du Druide (Attaque au Défaut d'armure)",
|
||||
"description": "<p>Vous visez une zone du corps non protégée ou un point faible de l’armure de votre adversaire.</p>\n<p>Appliquez la valeur de protection fixe de l’armure comme malus à votre jet d’attaque (-1 pour une armure légère, -2 pour une armure moyenne et -3 pour une armure lourde). Si votre attaque passe malgré ce malus, les dégâts de votre coup ignorent la protection de l’armure.</p>\n<p>Si le MJ l’accepte, cette option de combat pourra également permettre de trouver le défaut de l’armure naturelle d’une créature.</p>"
|
||||
},
|
||||
"La Folie de Dyr (Occuper)": {
|
||||
"name": "La Folie de Dyr (Occuper)",
|
||||
"description": "<p>Vous faites tournoyer votre arme dans tout les sens, pour faire reculer votre adversaire.</p>\n<p>Votre attaque reçoit un malus supplémentaire de -1 et n’occasionne pas de dégâts. En cas<br>de succès, votre adversaire ne peut pas attaquer ce round. Uniquement sur des adversaires au maximum de de taille supérieure d’un cran à la vôtre.</p>"
|
||||
},
|
||||
"La Folie du Gladiateur (Attaque Intrépide)": {
|
||||
"name": "La Folie du Gladiateur (Attaque Intrépide)",
|
||||
"description": "<p>Vous attaquez avec la plus extrême témérité.</p>\n<p>Vous ne bénéficiez pas de l’éventuel bonus d’un bouclier ou d’une arme secondaire de parade et subissez un malus de -2 à la défense. En revanche, vous bénéficiez d’un bonus de +2 au jet d’attaque.</p>"
|
||||
},
|
||||
"La Force de Grondil (Frappe Brutale)": {
|
||||
"name": "La Force de Grondil (Frappe Brutale)",
|
||||
"description": "<p>Vous placez une attaque brutale, sans finesse, mais avec toute votre force. Uniquement avec des armes moyenne ou plus (minimum d6 dégâts).</p>\n<p>Votre attaque souffre d’un malus de -2, mais si elle réussit, vous pouvez ajouter la moitié de votre Vigueur pour le calcul des dégâts (minimum 1). Ce bonus vient en plus du bonus de Vigueur de base déjà applicable.</p>"
|
||||
},
|
||||
"La Frappe Lémurienne (Attaque Standard)": {
|
||||
"name": "La Frappe Lémurienne (Attaque Standard)",
|
||||
"description": "<p>Vous portez une attaque à votre adversaire, avec votre arme. Au contact ou à distance.</p>"
|
||||
},
|
||||
"La Fureur de Charkond (Intimider)": {
|
||||
"name": "La Fureur de Charkond (Intimider)",
|
||||
"description": "<p>Vous faites une manœuvre physique dans l’objectif d’impressionner votre adversaire en lieu et place de votre attaque.</p>\n<p>Si vous réussissez un test de Vigueur+Mêlée, avec l’Esprit de votre cible en malus, elle subit un malus de -2 sur tout ses tests d’attaque pour le reste du round. Ne fonctionne que sur un adversaire sur lequel l’Intimidation est applicable, donc en général ne fonctionne pas sur les créatures.</p>"
|
||||
},
|
||||
"La Main d’Afyra (Se Reposer)": {
|
||||
"name": "La Main d’Afyra (Se Reposer)",
|
||||
"description": "<p>Vous restez au contact de votre adversaire, mais vous vous concentrez sur vous-même. Vous<br>ne pouvez pas attaquer ce round.</p>\n<p>Si vous réussissez un jet de Vigueur, vous récupérez 2 Points de Vitalité, 4 sur un succès Héroïque. Ces points ne peuvent être récupérés que si ils ont été perdus lors du combat en cours.</p>"
|
||||
},
|
||||
"La Parade de l’Erudit (Défense Totale)": {
|
||||
"name": "La Parade de l’Erudit (Défense Totale)",
|
||||
"description": "<p>Vous consacrez votre round à esquiver, parer et vous protéger des coups. Vous n’ effectuez pas d’attaque durant le round, mais bénéficiez d’un bonus de +2 en défense, qui s’ajoute éventuellement à celui que pourrait vous apporter un bouclier ou une arme secondaire de parade.</p>"
|
||||
},
|
||||
"La Passe de Charkond (Feinte)": {
|
||||
"name": "La Passe de Charkond (Feinte)",
|
||||
"description": "<p>Vous placez une botte spéciale, pour tromper et profiter de la défense de votre adversaire. Uniquement possible avec un dague ou une arme de type épée (sabre, cimeterre, etc.).</p>\n<p>Si vous réussissez un jet d’Esprit +Carrière guerrière (mercenaire, soldat, etc.) en plus de votre<br>attaque, la défense de votre adversaire s’ajoute à vos dégâts.</p>"
|
||||
},
|
||||
"La Passe de l’Assassin (Avantage)": {
|
||||
"name": "La Passe de l’Assassin (Avantage)",
|
||||
"description": "<p>Vous vous placez de manière à obtenir une position plus avantageuse pour portez vos attaques.</p>\n<p>En plus de votre attaque normale, vous devez réussir un jet de Réaction (Esprit+Initiative). Sur une<br>réussite, vous bénéficiez d’un dé bonus pour votre prochaine attaque. Si vous renoncez à votre attaque, vous bénéficiez d’un bonus de +2 pour le jet de Réaction. Sur un échec, c’est votre adversaire qui bénéficie d’un dé bonus pour sa prochaine attaque.</p>"
|
||||
},
|
||||
"La Passe du Khastok": {
|
||||
"name": "La Passe du Khastok",
|
||||
"description": "<p>Uniquement avec un Khastok de Malakut. Vous fauchez les jambes (ou les membres inférieurs) de<br>votre adversaire.</p>\n<p>Votre attaque souffre d’un malus de -2, mais si elle occasionne des dégâts, la cible doit réussir un test d’Agilité, avec votre score de Mêlée en malus ou tomber au sol.</p>"
|
||||
},
|
||||
"La pose de l’Esclave (Posture Défensive)": {
|
||||
"name": "La pose de l’Esclave (Posture Défensive)",
|
||||
"description": "<p>Vous choisissez d’adopter une attitude prudente, en restant toujours prêt à parer ou à esquiver l’attaque de votre adversaire. Combattre en posture défensive vous confère un bonus de +1 en défense, mais vous subissez un malus de -1 à votre jet d’attaque.</p>"
|
||||
},
|
||||
"La Rage du Barbare (Posture Offensive)": {
|
||||
"name": "La Rage du Barbare (Posture Offensive)",
|
||||
"description": "<p>Vous vous concentrez sur l’attaque, au détriment de votre défense. Cette option vous confère un bonus de +1 au jet d’attaque, mais vous subissez un malus de -1 en défense.</p>"
|
||||
},
|
||||
"La Ruade de l’Axos (Déséquilibrer)": {
|
||||
"name": "La Ruade de l’Axos (Déséquilibrer)",
|
||||
"description": "<p>Vous cherchez à déséquilibrer votre adversaire. Vous ne portez pas d’attaque.</p>\n<p>Si vous réussissez un jet de Réaction (Esprit+Initiative) avec l’Agilité de votre cible comme malus, elle reçoit un dé malus pour sa prochaine action et un malus de -1 en défense sur la prochaine attaque. Sur un succès héroïque et que votre cible est de la piétaille ou un coriace, elle tombe au sol.</p>"
|
||||
},
|
||||
"La Vengeance du Valgard (Epee Valgardienne)": {
|
||||
"name": "La Vengeance du Valgard (Epee Valgardienne)",
|
||||
"description": "<p>Uniquement avec une épée Valgardienne. Si vous avez subit des dégâts lors de l’attaque précédente, vous profitez du poids de votre arme pour appuyer votre coup.</p>\n<p>Si vous avez perdu des Points de Vitalité lors de l’attaque précédente, vous pouvez faire un<br>jet de Vigueur+Barbare en plus de votre attaque. Si les deux jets sont réussis, vous augmentez les dégâts de 2 points. Si seule l’attaque est réussi, appliquez les dégâts normaux.</p>"
|
||||
},
|
||||
"Le Coup de Mangaï (Entraver - Fouet)": {
|
||||
"name": "Le Coup de Mangaï (Entraver - Fouet)",
|
||||
"description": "<p>Uniquement avec un fouet. Vous fouettez votre adversaire pour le gêner et l’entraver.</p>\n<p>Votre attaque souffre d’un malus de -2, mais si elle réussit, votre fouet s’enroule autour d’un membre de votre cible. Tant que vous maintenez le fouet, elle subit un malus de -2 pour toutes ses actions, et -1 en défense. En lieu et place d’une attaque, la cible peut tenter de se libérer en réussissant un jet de Vigueur+Initiative, avec votre Vigueur en malus.</p>"
|
||||
},
|
||||
"Le Coup du Gladiateur (Combat à Deux Armes - Offensif)": {
|
||||
"name": "Le Coup du Gladiateur (Combat à Deux Armes - Offensif)",
|
||||
"description": "<p>Vous ne pouvez utiliser que des armes légères ou moyennes.</p>\n<p><span style=\"font-family: var(--font-primary); font-size: var(--font-size-14);\">Vous attaquez avec vos deux armes. </span><span style=\"font-family: var(--font-primary); font-size: var(--font-size-14);\">Vous n’effectuez qu’un seul jet d’attaque avec un </span>malus de -1, mais vous infligez des dégâts comme si vous maniez une arme moyenne (si vous utilisez deux armes légères) ou une arme lourde (si vous utilisez une arme moyenne et une arme légère, ou deux armes moyennes).</p>"
|
||||
},
|
||||
"Le Coup du Soldat (Désarmer)": {
|
||||
"name": "Le Coup du Soldat (Désarmer)",
|
||||
"description": "<p>Vous ne pouvez utiliser que des armes légères ou moyennes. Vous visez l’arme de votre adversaire<br>pour la faire tomber.</p>\n<p>Vous portez une attaque sur l’arme, avec pour malus l’Agilité+Mêlée de votre adversaire. En cas de réussite, l’arme visée tombe au sol à 1d6-2 mètres de votre opposant.</p>"
|
||||
},
|
||||
"Le Dit de Iondal (Moquer)": {
|
||||
"name": "Le Dit de Iondal (Moquer)",
|
||||
"description": "<p>Vous moquez votre adversaire avec une phrase bien sentie.</p>\n<p>Si vous réussissez un test d’Esprit+Carrière appropriée, avec l’Esprit de votre cible en malus, elle<br>subit un malus de -2 en défense pour le reste du round.</p>"
|
||||
},
|
||||
"Le Doigt de Karyzon (Tir x2)": {
|
||||
"name": "Le Doigt de Karyzon (Tir x2)",
|
||||
"description": "<p>Vous enchaînez 2 tirs au lieu d’un, sans précision. Uniquement avec armes de jet et arcs.</p>\n<p>Vous tirez (ou lancer) très rapidement, sans précision, sur la même cible. Chaque tir/lancer souffre d’un malus de -2.</p>"
|
||||
},
|
||||
"Le Halakh-Kriss (Spéciale Kriss)": {
|
||||
"name": "Le Halakh-Kriss (Spéciale Kriss)",
|
||||
"description": "<p>Uniquement avec un Kriss d’Halakh. Vous portez un coup vicieux à votre adversaire.</p>\n<p>Votre attaque souffre d’un malus de -1, mais si elle réussit, vous augmentez les dégâts de 1 point.</p>"
|
||||
},
|
||||
"Le Plomb de l’Axos (Fronde Axos)": {
|
||||
"name": "Le Plomb de l’Axos (Fronde Axos)",
|
||||
"description": "<p>Uniquement avec une Fronde de l’Axos. Vous faites tournoyer votre fronde à grande vitesse.</p>\n<p>Votre tir souffre d’un malus de -2, mais vos dégâts bénéficient de la vigueur entière à la place de la moitié de la Vigueur.</p>"
|
||||
},
|
||||
"Le Saut du Voleur (Distraire)": {
|
||||
"name": "Le Saut du Voleur (Distraire)",
|
||||
"description": "<p>Vous faites une manœuvre ayant pour objectif de distraire l’adversaire. Vous ne portez pas<br>d’attaque.</p>\n<p>Si vous réussissez un test de Réaction (Esprit+Initiative) avec l’Esprit de votre cible en malus, elle<br>subit un malus de -1 pour toutes ses actions dans le round en cours.</p>"
|
||||
},
|
||||
"Le Trait du Beshaar (Javelot)": {
|
||||
"name": "Le Trait du Beshaar (Javelot)",
|
||||
"description": "<p>Uniquement avec un Javelot. Vous lancez votre javelot à une distance plus grande que la plupart des<br>autres aventuriers.</p>\n<p>Votre tir souffre d’un malus de -1, mais la portée du javelot est doublée (12m au lieu de 6m).</p>"
|
||||
},
|
||||
"Le Tranchant de Parsool (Hache de Parsool)": {
|
||||
"name": "Le Tranchant de Parsool (Hache de Parsool)",
|
||||
"description": "<p>Uniquement avec une Hache d’Abordage de Parsool. Vous placez une attaque visant l’armure de votre adversaire pour la détruire.</p>\n<p>Votre attaque souffre d’un malus de -1, mais si elle réussit, vous faites sauter une pièce d’armure de votre adversaire au lieu de faire des dégâts. L’armure touchée se dégrade d’un rang de protection. Uniquement valable sur des adversaires portant une armure artificielle.</p>"
|
||||
},
|
||||
"Les Poignards de Karyzon (Lancer x2)": {
|
||||
"name": "Les Poignards de Karyzon (Lancer x2)",
|
||||
"description": "<p>Uniquement avec deux Couteaux ou Poignards de lancer. Armé d’un Poignard dans chaque main, vous<br>les lancez sur 2 cibles différentes en même temps</p>\n<p>Chaque attaque est résolue séparément et souffre d’un malus de -2.</p>"
|
||||
}
|
||||
}
|
||||
}
|
181
compendiums/en/bol.flaws.json
Normal file
@ -0,0 +1,181 @@
|
||||
{
|
||||
"label": "Désavantages",
|
||||
"mapping": {
|
||||
"description": "system.description"
|
||||
},
|
||||
|
||||
"entries": {
|
||||
"Addiction": {
|
||||
"name": "Addiction",
|
||||
"description": "<h1>Addiction</h1><p>vous avez développé une dépendance à une substance, et vous en avez besoin de manière quotidienne pour vivre normalement. Si vous passez une journée sans assouvir votre vice, vous subissez un dé de malus sur tous vos jets.</p>"
|
||||
},
|
||||
"Âgé": {
|
||||
"name": "Âgé",
|
||||
"description": "<h1>Âgé</h1><p>votre personnage n’a plus vingt ans. S’il ne dispose pas chaque jour d’une période décente de repos, il commence à se fatiguer et subit un dé de malus pour toute action physique éreintante. Ce désavantage devrait aussi offrir bien d’autres situations cocasses au cours de la partie.</p>"
|
||||
},
|
||||
"Arrogant": {
|
||||
"name": "Arrogant",
|
||||
"description": "<h1>Arrogant</h1><p>vous subissez un dé de malus lorsque vous interagissez avec des provinciaux ou des étrangers, qui pourraient prendre ombrage de votre arrogance. Ce désavantage est très fréquent au sein de la noblesse.</p>"
|
||||
},
|
||||
"Bigleux": {
|
||||
"name": "Bigleux",
|
||||
"description": "<h1>Bigleux</h1><p>lorsque vous faites appel à votre vue pour observer ou repérer quelque chose, vous subissez un dé de malus.</p>"
|
||||
},
|
||||
"Borgne/oreille coupée": {
|
||||
"name": "Borgne/oreille coupée",
|
||||
"description": "<h1>Borgne/oreille coupée</h1><p>vous subissez un dé de malus quand le MJ estime que cela est approprié à la situation.</p>"
|
||||
},
|
||||
"Bouseux": {
|
||||
"name": "Bouseux",
|
||||
"description": "<h1>Bouseux</h1><p>la grande ville est un endroit déstabilisant et impitoyable pour les nouveaux venus. Vous subissez un dé de malus dans les situations concernant la survie en milieu urbain.</p>"
|
||||
},
|
||||
"Chétif": {
|
||||
"name": "Chétif",
|
||||
"description": "<h1>Chétif</h1><p>vous ne jouissez pas d’une solide constitution. Ôtez 2 points à votre score de vitalité.</p>"
|
||||
},
|
||||
"Crédule": {
|
||||
"name": "Crédule",
|
||||
"description": "<h1>Crédule</h1><p>vous gobez les mensonges les plus gros. Vous subissez un dé de malus quand quelqu’un essaie de vous convaincre qu’une idée est bonne, alors qu’elle ne l’est pas.</p>"
|
||||
},
|
||||
"Cupide": {
|
||||
"name": "Cupide",
|
||||
"description": "<h1>Cupide</h1><p>vous êtes incapable de résister à une occasion de vous enrichir. S’il y a une chance de se remplir les poches, vous perdez tout bon sens. Vous subissez un dé de malus à chaque fois que vous êtes tenté par une offre alléchante.</p>"
|
||||
},
|
||||
"Deux mains gauches": {
|
||||
"name": "Deux mains gauches",
|
||||
"description": "<h1>Deux mains gauches</h1><p>vous subissez un dé de malus pour crocheter une serrure, tirer à l’arc ou à l’arbalète, ou accomplir toute autre tâche de précision requérant une bonne dextérité.</p>"
|
||||
},
|
||||
"Distrait": {
|
||||
"name": "Distrait",
|
||||
"description": "<h1>Distrait</h1><p>vous n’êtes pas forcément stupide – en fait, vous pouvez même être brillant – mais vous êtes tête-en-l’air, incapable de vous souvenir de vos obligations ou du nom des gens. Un défaut que le MJ se fera un plaisir d’exploiter de temps à autre au détriment de votre personnage…</p>"
|
||||
},
|
||||
"Dur d’oreille": {
|
||||
"name": "Dur d’oreille",
|
||||
"description": "<h1>Dur d’oreille</h1><p>lorsque vous faites appel à votre audition pour percevoir quelque chose, vous subissez un dé de malus.</p>"
|
||||
},
|
||||
"Fanatique": {
|
||||
"name": "Fanatique",
|
||||
"description": "<h1>Fanatique</h1><p>ce désavantage est plus fréquent chez les rivaux que chez les héros. Beaucoup d’hommes sont prêts à mourir pour leur foi, mais un fanatique est prêt à tuer pour elle. Vous subissez un dé de malus à chaque fois que vous essayez de vous montrer courtois envers un infidèle.</p>"
|
||||
},
|
||||
"Fanfaron": {
|
||||
"name": "Fanfaron",
|
||||
"description": "<h1>Fanfaron</h1><p>vous avez une très haute opinion de vous-même et ressentez le besoin de la partager avec le reste du monde. Vous avez tendance à vous attribuer le mérite qui revient à d’autres et à exagérer vos propres exploits tout en minimisant le rôle que vos compagnons ont pu jouer. Inutile de le dire, vous prenez de grandes libertés avec la vérité, ce qui pourrait vous valoir d’être traité de menteur.</p>"
|
||||
},
|
||||
"Foie jaune": {
|
||||
"name": "Foie jaune",
|
||||
"description": "<h1>Foie jaune</h1>\n<p>Quand les épées sont tirées, vous connaissez toujours un moment d’indécision. Lancez un d3 : c’est le nombre de rounds où vous restez paralysé par la situation, incapable d’agir autrement qu’en effectuant des actions défensives.</p>"
|
||||
},
|
||||
"Gars de la ville": {
|
||||
"name": "Gars de la ville",
|
||||
"description": "<h1>Gars de la ville</h1><p>vous n’êtes pas à votre aise dans les grands espaces naturels. Vous subissez un dé de malus dans les situations concernant la survie en milieu sauvage.</p>"
|
||||
},
|
||||
"Illettré": {
|
||||
"name": "Illettré",
|
||||
"description": "<h1>Illettré</h1><p>vous ne savez ni lire ni écrire, et ne pouvez pas choisir de carrière exigeant d’être lettré.</p>"
|
||||
},
|
||||
"Impétueux": {
|
||||
"name": "Impétueux",
|
||||
"description": "<h1>Impétueux</h1><p>vous vous laissez souvent emporter par votre colère et réagissez à la moindre insulte, réelle ou supposée. Vous subissez un dé de malus pour vous efforcer de contrôler votre colère et d’agir rationnellement, par exemple pour éviter de faire un esclandre en plein bal au palais, ou pour ignorer la raillerie d’un ennemi. Votre colère peut vous mettre en danger, en vous incitant par exemple à vous battre en duel pour des motifs futiles.</p>"
|
||||
},
|
||||
"Inadapté à la chaleur": {
|
||||
"name": "Inadapté à la chaleur",
|
||||
"description": "<h1>Inadapté à la chaleur</h1><p>vous êtes extrêmement sensible à la chaleur. Vous subissez un dé de malus sur toutes les actions entreprises dans un environnement de grande chaleur.</p>"
|
||||
},
|
||||
"Inadapté au froid": {
|
||||
"name": "Inadapté au froid",
|
||||
"description": "<h1>Inadapté au froid</h1><p>vous êtes particulièrement sensible au froid. Vous subissez un dé de malus sur toutes les actions entreprises dans un environnement de grand froid.</p>"
|
||||
},
|
||||
"Incapable de mentir": {
|
||||
"name": "Incapable de mentir",
|
||||
"description": "<h1>Incapable de mentir</h1><p>que ce soit par nervosité ou par respect d’un code de l’honneur strict, vous êtes un très mauvais menteur. Vous subissez un dé de malus à chaque fois que vous essayez de tromper autrui, de dire des demi-vérités ou de cacher une information à quelqu’un qui vous pose une question directe. Vous êtes du genre à répondre « je ne vous dirai rien » plutôt que « je ne vois pas de quoi vous voulez parler ».</p>"
|
||||
},
|
||||
"Indigne de confiance": {
|
||||
"name": "Indigne de confiance",
|
||||
"description": "<h1>Indigne de confiance</h1><p>vous subissez un dé de malus quand la situation exige que quelqu’un vous croie ou vous fasse confiance.</p>"
|
||||
},
|
||||
"Inquiétant": {
|
||||
"name": "Inquiétant",
|
||||
"description": "<h1>Inquiétant</h1><p>il y a quelque chose en vous qui perturbe les autres. Cela peut provenir de votre regard, de votre odeur ou de votre façon de parler. Même les animaux vous évitent. Vous subissez un dé de malus dans les interactions sociales ou quand vous tentez d’amadouer des animaux.</p>"
|
||||
},
|
||||
"Lent à la détente": {
|
||||
"name": "Lent à la détente",
|
||||
"description": "<h1>Lent à la détente</h1><p>vous n’êtes jamais très vigilant à ce qui se passe autour de vous et vous êtes lent à réagir face au danger. Vous subissez un dé de malus sur vos jets de réaction.</p>"
|
||||
},
|
||||
"Lubrique": {
|
||||
"name": "Lubrique",
|
||||
"description": "<h1>Lubrique</h1><p>vous avez le plus grand mal à résister aux charmes du sexe opposé et subissez un dé de malus sur vos jets pour ne pas succomber à un joli minois.</p>"
|
||||
},
|
||||
"Malédiction de Morgazzon": {
|
||||
"name": "Malédiction de Morgazzon",
|
||||
"description": "<h1>Malédiction de Morgazzon</h1><p>vous êtes atteint de démence. Vous devrez travailler avec le MJ pour déterminer la façon dont votre folie se manifeste.</p>"
|
||||
},
|
||||
"Manchot/unijambiste": {
|
||||
"name": "Manchot/unijambiste",
|
||||
"description": "<h1>Manchot/unijambiste</h1><p>vous subissez un dé de malus quand le MJ estime que cela est approprié à la situation.</p>"
|
||||
},
|
||||
"Marin d’eau douce": {
|
||||
"name": "Marin d’eau douce",
|
||||
"description": "<h1>Marin d’eau douce</h1><p>vous subissez un dé de malus pour toute activité entreprise à bord d’un navire.</p>"
|
||||
},
|
||||
"Maudit": {
|
||||
"name": "Maudit",
|
||||
"description": "<h1>Maudit</h1><p>les dieux se sont détournés de vous, ou alors c’est que vous êtes tout simplement malchanceux. Pour une raison incompréhensible, les tuiles tombent toujours sur vous. Les gardes de la ville vous prennent pour un criminel recherché, la servante de la taverne que vous avez attirée dans votre lit se révèle être une princesse en fuite, vous marchez sur une petite branche qui se brise avec un craquement sonore juste au moment où vous alliez réussir à passer discrètement, etc. En d’autres termes, vous commencez le jeu avec 1 point d’héroïsme en moins.</p>"
|
||||
},
|
||||
"Mauvaise réputation": {
|
||||
"name": "Mauvaise réputation",
|
||||
"description": "<h1>Mauvaise réputation</h1><p>vous avez commis dans le passé quelque méfait de sinistre mémoire. Peu importe si vous êtes réellement coupable ou pas, ou si vous aviez une bonne raison d’agir comme vous l’avez fait, vous êtes précédé par votre mauvaise réputation. Vous subissez un dé de malus dans les interactions sociales où il s’agit de faire bonne impression, et continuez à subir ce malus jusqu’à ce que vous ayez (re)gagné la confiance de la personne en question.</p>"
|
||||
},
|
||||
"Méfiance envers la sorcellerie": {
|
||||
"name": "Méfiance envers la sorcellerie",
|
||||
"description": "<h1>Méfiance envers la sorcellerie</h1><p>vous subissez un dé de malus quand vous êtes confronté à des sorciers et des alchimistes.</p>"
|
||||
},
|
||||
"Muet": {
|
||||
"name": "Muet",
|
||||
"description": "<h1>Muet</h1><p>vous êtes incapable de parler, et vous subissez toujours un dé de malus dans les interactions sociales où vous avez besoin de vous faire comprendre.</p>"
|
||||
},
|
||||
"Non-combattant": {
|
||||
"name": "Non-combattant",
|
||||
"description": "<h1>Non-combattant</h1><p>vous n’êtes pas un guerrier, vos talents sont ailleurs. Vous ne disposez que de deux points (au lieu de quatre) à répartir dans les aptitudes de combat, mais vous débutez avec six points de carrière (au lieu de quatre). De plus, le coût en points d’expérience pour améliorer vos aptitudes de combat est doublé.</p>"
|
||||
},
|
||||
"Obsession": {
|
||||
"name": "Obsession",
|
||||
"description": "<h1>Obsession</h1><p>vous êtes totalement obsédé par quelque chose. Il peut s’agir d’un but, d’une personne ou d’un objet. Vous consacrez beaucoup de temps, d’énergie et d’argent à cette obsession. À chaque fois que vous vous trouvez en présence de l’objet de votre obsession, vous subissez un dé de malus sur tous les jets qui impliquent que vous l’ignoriez. Il peut arriver que votre obsession vous plonge dans des situations inextricables ou cocasses.</p>"
|
||||
},
|
||||
"Pataud": {
|
||||
"name": "Pataud",
|
||||
"description": "<h1>Pataud</h1><p>vous n’avez pas un bon sens de l’équilibre. Vous subissez un dé de malus à chaque fois que l’équilibre entre en jeu, par exemple pour traverser un précipice sur une passerelle étroite, ou prendre pied sur une saillie à flanc de montagne.</p>"
|
||||
},
|
||||
"Phobie": {
|
||||
"name": "Phobie",
|
||||
"description": "<h1>Phobie</h1><p>vous êtes affligé d’une peur irrationnelle. Vous subissez un dé de malus en présence de l’objet de votre phobie. Il peut s’agir par exemple de la peur du feu, des reptiles, des araignées, des hauteurs, de la foule, de la mort, de l’obscurité, des espaces confinés, des navires volants, etc.</p>"
|
||||
},
|
||||
"Poltron": {
|
||||
"name": "Poltron",
|
||||
"description": "<h1>Poltron</h1><p>ce n’est pas un désavantage très fréquent chez les héros, mais vous avez les pires difficultés à contrôler votre peur. Vous subissez un dé de malus sur les jets destinés à résister aux effets de la peur ou de l’intimidation. De plus, vous faites toujours de votre mieux pour éviter toute forme de conflit.</p>"
|
||||
},
|
||||
"Repoussant": {
|
||||
"name": "Repoussant",
|
||||
"description": "<h1>Repoussant</h1><p>vous êtes particulièrement laid. Vous subissez un dé de malus dans les situations où l’apparence peut avoir son importance.</p>"
|
||||
},
|
||||
"Signe distinctif": {
|
||||
"name": "Signe distinctif",
|
||||
"description": "<h1>Signe distinctif</h1><p>il y a quelque chose chez vous qui ne s’oublie pas. Il peut s’agir d’une cicatrice particulière ou d’un tatouage, à moins que vous ne soyez né avec six doigts à la main gauche. Bref, vous possédez une caractéristique physique qui se remarque. Vous subissez un dé de malus quand vous essayez de vous déguiser ou de passer inaperçu. Si vous êtes également affligé du désavantage traqué, les chasseurs de primes et les espions ont deux fois plus de chances de vous repérer quand vous entrez ou sortez d’une cité.</p>"
|
||||
},
|
||||
"Soiffard": {
|
||||
"name": "Soiffard",
|
||||
"description": "<h1>Soiffard</h1><p>quand vous êtes chargé d’une tâche importante par vos compagnons, lancez un dé. Si vous obtenez un 1, vous êtes ivre et incapable de faire quoi que ce soit jusqu’à ce que vous ayez dessoûlé.</p>"
|
||||
},
|
||||
"Souffreteux": {
|
||||
"name": "Souffreteux",
|
||||
"description": "<h1>Souffreteux</h1><p>vous souffrez d’une constitution fragile. Vous ne pouvez récupérer de points de vitalité perdus que si vous bénéficiez de soins médicaux ; vous ne récupérez rien par du simple repos, comme c’est normalement la règle.</p>"
|
||||
},
|
||||
"Taciturne": {
|
||||
"name": "Taciturne",
|
||||
"description": "<h1>Taciturne</h1><p>votre personnage est incroyablement taiseux. Les jours où il prononce une phrase de plus de trois mots sont à marquer d’une pierre blanche, et il est très rare qu’il engage de lui-même la conversation. Son extrême réticence à parler implique malheureusement qu’il ne donne jamais une information si on ne la lui demande pas. Vous subissez un dé de malus dans les interactions sociales.</p>"
|
||||
},
|
||||
"Traqué": {
|
||||
"name": "Traqué",
|
||||
"description": "<h1>Traqué</h1><p>vous êtes recherché par les autorités, ou bien vous avez offensé un aristocrate puissant ou un roi des pirates. Quoi qu’il en soit, vous devez constamment échapper à leurs agents qui tentent de vous capturer ou de vous tuer. Lancez un d6 à chaque fois que vous entrez dans une ville nouvelle. Sur un 1, les agents à la solde de votre ennemi (ou cet ennemi lui-même) vous auront repéré et vous tomberont dessus.</p>"
|
||||
}
|
||||
}
|
||||
}
|
105
compendiums/en/bol.godsfaith.json
Normal file
@ -0,0 +1,105 @@
|
||||
{
|
||||
"label": "Dieux",
|
||||
"mapping": {
|
||||
"description": "system.description"
|
||||
},
|
||||
|
||||
"entries": {
|
||||
"Afyra, Deesse de la Vie": {
|
||||
"name": "Afyra, Deesse de la Vie",
|
||||
"description": ""
|
||||
},
|
||||
"Charkond, Dieu de la Guerre et des Batailles": {
|
||||
"name": "Charkond, Dieu de la Guerre et des Batailles",
|
||||
"description": ""
|
||||
},
|
||||
"Chiomalla, Deesse des Grains et des Moissons": {
|
||||
"name": "Chiomalla, Deesse des Grains et des Moissons",
|
||||
"description": ""
|
||||
},
|
||||
"Dyr, Dieu des Tempêtes et du Tonnerre": {
|
||||
"name": "Dyr, Dieu des Tempêtes et du Tonnerre",
|
||||
"description": ""
|
||||
},
|
||||
"Fillana, déesse des étoiles": {
|
||||
"name": "Fillana, déesse des étoiles",
|
||||
"description": ""
|
||||
},
|
||||
"Fyrzon la Sentinelle, l’Inébranlable": {
|
||||
"name": "Fyrzon la Sentinelle, l’Inébranlable",
|
||||
"description": ""
|
||||
},
|
||||
"Grondil, le dieu bâtisseur": {
|
||||
"name": "Grondil, le dieu bâtisseur",
|
||||
"description": ""
|
||||
},
|
||||
"Hadron le Noir , seigneur du Néant": {
|
||||
"name": "Hadron le Noir , seigneur du Néant",
|
||||
"description": ""
|
||||
},
|
||||
"Hurm, le père des dieux, seigneur du ciel": {
|
||||
"name": "Hurm, le père des dieux, seigneur du ciel",
|
||||
"description": ""
|
||||
},
|
||||
"Iondal le débauché": {
|
||||
"name": "Iondal le débauché",
|
||||
"description": ""
|
||||
},
|
||||
"Karyzon, le seigneur des vents": {
|
||||
"name": "Karyzon, le seigneur des vents",
|
||||
"description": ""
|
||||
},
|
||||
"Knothakon, dieu de la sagesse, seigneur des âges": {
|
||||
"name": "Knothakon, dieu de la sagesse, seigneur des âges",
|
||||
"description": ""
|
||||
},
|
||||
"Lilandra la séductrice": {
|
||||
"name": "Lilandra la séductrice",
|
||||
"description": ""
|
||||
},
|
||||
"Morgazzon, roi-démon de la folie": {
|
||||
"name": "Morgazzon, roi-démon de la folie",
|
||||
"description": ""
|
||||
},
|
||||
"Nemmereth du long sommeil, dieu de la mort": {
|
||||
"name": "Nemmereth du long sommeil, dieu de la mort",
|
||||
"description": ""
|
||||
},
|
||||
"Piandra, déesse de la chance, Dame Fortune": {
|
||||
"name": "Piandra, déesse de la chance, Dame Fortune",
|
||||
"description": ""
|
||||
},
|
||||
"Quathoomar, dieu du voyage": {
|
||||
"name": "Quathoomar, dieu du voyage",
|
||||
"description": ""
|
||||
},
|
||||
"Sa’Tel, dieu des étoiles": {
|
||||
"name": "Sa’Tel, dieu des étoiles",
|
||||
"description": ""
|
||||
},
|
||||
"Shazzadion, dieu des mers": {
|
||||
"name": "Shazzadion, dieu des mers",
|
||||
"description": ""
|
||||
},
|
||||
"Tharungozoth le massacreur, seigneur des souffrances": {
|
||||
"name": "Tharungozoth le massacreur, seigneur des souffrances",
|
||||
"description": ""
|
||||
},
|
||||
"Yrzlak le dieu forgeron": {
|
||||
"name": "Yrzlak le dieu forgeron",
|
||||
"description": ""
|
||||
},
|
||||
"Zaggath, seigneur du Feu": {
|
||||
"name": "Zaggath, seigneur du Feu",
|
||||
"description": ""
|
||||
},
|
||||
"Zalkyr le Lumineux, dieu du soleil": {
|
||||
"name": "Zalkyr le Lumineux, dieu du soleil",
|
||||
"description": ""
|
||||
},
|
||||
"Zylidith, seigneur du sang, dieu du sacrifice": {
|
||||
"name": "Zylidith, seigneur du sang, dieu du sacrifice",
|
||||
"description": ""
|
||||
}
|
||||
}
|
||||
}
|
81
compendiums/en/bol.languages.json
Normal file
@ -0,0 +1,81 @@
|
||||
{
|
||||
"label": "Langues",
|
||||
"mapping": {
|
||||
"description": "system.description"
|
||||
},
|
||||
|
||||
"entries": {
|
||||
"Argot des Mers": {
|
||||
"name": "Argot des Mers",
|
||||
"description": "<p>Les îles du Crâne, à la population hétéroclite en provenance des quatre coins du monde, ont développé leur propre langue, un assemblage bigarré d’influences diverses. Il n’en existe pas de forme écrite.</p>"
|
||||
},
|
||||
"Axien": {
|
||||
"name": "Axien",
|
||||
"description": "<p>L’axien est la langue des tribus barbares qui vivent dans la chaîne de l’Axos. Cette langue reste plutôt confinée à cette région montagneuse, mais on raconte que d’anciens textes datant de l’époque lointaine où l’axien était plus largement répandu seraient entreposés dans des grottes oubliées au cœur des montagnes.</p>"
|
||||
},
|
||||
"Beshaari": {
|
||||
"name": "Beshaari",
|
||||
"description": "<p>Les nomades du désert de Beshaar parlent et écrivent leur propre langue. La plupart des habitants d’Halakh parlent le beshaari en plus du lémurien.</p>"
|
||||
},
|
||||
"Céruléen": {
|
||||
"name": "Céruléen",
|
||||
"description": "<p>Les nomades bleus parlent leur propre langue, qui n’a pas de forme écrite. Les marchands d’Oomis apprennent souvent le céruléen.</p>"
|
||||
},
|
||||
"Chant du Vent": {
|
||||
"name": "Chant du Vent",
|
||||
"description": "<p>La langue chantante des hommes-oiseaux peut évoquer tour à tour le son de la brise se faufilant entre les rochers escarpés des sommets et le sifflement des bourrasques s’engouffrant dans les canyons montagneux et les cavernes. Cette langue est très difficile à parler correctement pour un étranger. Elle possède une forme écrite, qui est tout aussi difficile à maîtriser et à traduire.</p>"
|
||||
},
|
||||
"Démonique (Lire/Ecrire)": {
|
||||
"name": "Démonique (Lire/Ecrire)",
|
||||
"description": "<p>C’est l’ancienne langue des Rois- Sorciers, dans laquelle sont rédigés tous les textes remontant à leur époque. Les magiciens, alchimistes, druides et prêtres doivent apprendre le démonique s’ils veulent pouvoir utiliser les puissants sortilèges et recettes alchimiques de cette antique race. Ce langage est particulièrement ardu et ses formes orale et écrite exigent d’être apprises séparément. Les magiciens de Zalut conversent toujours en démonique, à moins de devoir parler à des étrangers.</p>\n<p>Connaissance de l'éctriture/lecture seulement.</p>"
|
||||
},
|
||||
"Démonique (Parler)": {
|
||||
"name": "Démonique (Parler)",
|
||||
"description": "<p>C’est l’ancienne langue des Rois- Sorciers, dans laquelle sont rédigés tous les textes remontant à leur époque. Les magiciens, alchimistes, druides et prêtres doivent apprendre le démonique s’ils veulent pouvoir utiliser les puissants sortilèges et recettes alchimiques de cette antique race. Ce langage est particulièrement ardu et ses formes orale et écrite exigent d’être apprises séparément. Les magiciens de Zalut conversent toujours en démonique, à moins de devoir parler à des étrangers.</p>\n<p>Connaissance parlé.</p>"
|
||||
},
|
||||
"Festreli": {
|
||||
"name": "Festreli",
|
||||
"description": "<p>A l’origine, le festreli était un dialecte du lémurien, mais il s’en est tellement éloigné qu’il est à présent devenu presque inintelligible pour des locuteurs du lémurien.</p>"
|
||||
},
|
||||
"Ghatai": {
|
||||
"name": "Ghatai",
|
||||
"description": "<p>Langue des nomades du sud du Khanat, le ghataï s’apparente à un dialecte ancien du lémurien, avec de nombreux emprunts au pinxi (cf. ci-dessous), pour le vocabulaire notamment. Avec un peu d’ effort et beaucoup de patience, un locuteur du lémurien sera en mesure de communiquer de manière rudimentaire avec des gens qui parlent le ghataï. Cette langue, qui à l’origine ne possédait pas son propre système d’écriture, utilise désormais celui du pinxi.</p>"
|
||||
},
|
||||
"Grooth": {
|
||||
"name": "Grooth",
|
||||
"description": "<p>Il ne s’agit pas d’une langue à proprement parler, mais plutôt d’un langage rudimentaire fait de grognements, de grimaces, de tapements du pied et de grands mouvements simiesques. Ce langage n’a pas de forme écrite et est totalement inusité en dehors des tribus des grooth.</p>"
|
||||
},
|
||||
"Kashtien": {
|
||||
"name": "Kashtien",
|
||||
"description": "<p>Les habitants des marais de Kasht ont leur propre langue, dont chaque tribu utilise une variante qui lui est propre.</p>"
|
||||
},
|
||||
"Lemurien": {
|
||||
"name": "Lemurien",
|
||||
"description": "<p>La langue la plus communément parlée en Lémurie. Chaque cité parle cependant son propre dialecte lémurien, ce qui veut dire qu’un voyageur aura parfois du mal à comprendre les gens du coin. Le MJ pourra à l’occasion vous demander de réussir un jet d’esprit pour communiquer avec des gens d’autres cités que la vôtre.</p>"
|
||||
},
|
||||
"Malakutien": {
|
||||
"name": "Malakutien",
|
||||
"description": "<p>Lles habitants de Malakut et de la région environnante parlent leur propre langue.</p>"
|
||||
},
|
||||
"Pinxi": {
|
||||
"name": "Pinxi",
|
||||
"description": "<p>la langue des Xi Lu, encore communément parlée par cette ethnie, même si la plupart des Xi Lu apprennent au moins des rudiments de gathaï, la langue officielle du gouvernement du grand khan.</p>"
|
||||
},
|
||||
"Shamite": {
|
||||
"name": "Shamite",
|
||||
"description": "<p>Les habitants de Shamballah et de la région environnante parlent leur propre langue.</p>"
|
||||
},
|
||||
"Valgardien": {
|
||||
"name": "Valgardien",
|
||||
"description": "<p>Les gens du Valgard parlent et écrivent leur propre langue, qui est étonnamment élaborée.</p>"
|
||||
},
|
||||
"Wei": {
|
||||
"name": "Wei",
|
||||
"description": "<p>Les Wei possèdent leur propre langue, difficile à maîtriser pour des étrangers en raison de ses sonorités particulières, avec un emploi abondant de claquements de langue. Les Wei n’ont pas d’écriture ; leur culture repose sur la transmission orale des savoirs et des coutumes.</p>"
|
||||
},
|
||||
"Yggdari": {
|
||||
"name": "Yggdari",
|
||||
"description": "<p>C’est le nom de l’ancienne langue des hommes (aussi appelée langue des Anciens). Peu d’individus la parlent aujourd’hui, et encore moins peuvent la lire. Il arrive cependant que d’antiques textes soient retrouvés dans les ruines d’Ygddar, de Qiddesh, de Qeb, de Qar ou d’Oosal, mais leur traduction requiert généralement les services d’un scribe particulièrement compétent.</p>"
|
||||
}
|
||||
}
|
||||
}
|
177
compendiums/en/bol.objets-alchimie.json
Normal file
@ -0,0 +1,177 @@
|
||||
{
|
||||
"label": "Alchimie - Objets",
|
||||
"mapping": {
|
||||
"description": "system.description"
|
||||
},
|
||||
|
||||
"entries": {
|
||||
"Allume-feu": {
|
||||
"name": "Allume-feu",
|
||||
"description": "<p>permet d’allumer un feu facilement et rapidement</p>"
|
||||
},
|
||||
"Antirouille": {
|
||||
"name": "Antirouille",
|
||||
"description": "<p>quantité suffisante pour ôter la rouille d’une armure complète</p>"
|
||||
},
|
||||
"Arbalète à Grappin": {
|
||||
"name": "Arbalète à Grappin",
|
||||
"description": "<p>tire un grappin attaché à une corde en soie avec un facteur de portée de 7,5 m</p>"
|
||||
},
|
||||
"Arme": {
|
||||
"name": "Arme",
|
||||
"description": "<p>Les armes et armures de cette qualité permettent, une fois par round, de relancer un 1 obtenu sur un jet de dégâts/de protection.</p>"
|
||||
},
|
||||
"Arme dissimulée dans un Objet Courant": {
|
||||
"name": "Arme dissimulée dans un Objet Courant",
|
||||
"description": "<p>En dehors des armes, les autres créations infligeant des dégâts ou soignant des blessures provoquent respectivement la perte ou la récupération de d6 points de vitalité.</p>"
|
||||
},
|
||||
"Arme Légendaire": {
|
||||
"name": "Arme Légendaire",
|
||||
"description": "<p>ajoute un dé de bonus aux jets de dégâts et ignore les armures, à l’exception de celles créées par un alchimiste. De plus, l’arme est incassable. Une arme aussi exceptionnelle se doit de recevoir un nom</p>"
|
||||
},
|
||||
"Arme Mythique": {
|
||||
"name": "Arme Mythique",
|
||||
"description": "<p>comme une arme légendaire, mais elle est de plus considérée comme une arme favorite, cf. l’avantage du même nom</p>"
|
||||
},
|
||||
"Arme Supérieure": {
|
||||
"name": "Arme Supérieure",
|
||||
"description": "<p>un dé de bonus aux jets de dégâts</p>"
|
||||
},
|
||||
"Armure": {
|
||||
"name": "Armure",
|
||||
"description": "<p>Les armes et armures de cette qualité permettent, une fois par round, de relancer un 1 obtenu sur un jet de dégâts/de protection.</p>"
|
||||
},
|
||||
"Armure Légendaire": {
|
||||
"name": "Armure Légendaire",
|
||||
"description": "<p>offre une protection semblable à celle d’une armure de la catégorie supérieure – une armure légère apporte la même protection qu’une armure moyenne, et une armure lourde apporte une protection de d6. De plus, le jet de protection de l’armure se fait avec un dé de bonus, et elle diminue de moitié les dégâts supplémentaires infligés par un succès héroïque ou légendaire.</p>"
|
||||
},
|
||||
"Armure Mythique": {
|
||||
"name": "Armure Mythique",
|
||||
"description": "<p>comme une armure légendaire, mais sans malus d’agilité ; un héros pourrait même nager en portant cette armure</p>"
|
||||
},
|
||||
"Armure Supérieure": {
|
||||
"name": "Armure Supérieure",
|
||||
"description": "<p>offre une protection semblable à celle d’une armure de la catégorie supérieure – une armure légère apporte la même protection qu’une armure moyenne, et une armure lourde apporte une protection de d6. De plus, l’armure diminue de moitié les dégâts supplémentaires infligés par un succès héroïque ou légendaire</p>"
|
||||
},
|
||||
"Automate ou golem ayant la forme d’une armure animée": {
|
||||
"name": "Automate ou golem ayant la forme d’une armure animée",
|
||||
"description": ""
|
||||
},
|
||||
"Casque permettant à son porteur de respirer sous l’eau": {
|
||||
"name": "Casque permettant à son porteur de respirer sous l’eau",
|
||||
"description": ""
|
||||
},
|
||||
"Ceinture d’allanium": {
|
||||
"name": "Ceinture d’allanium",
|
||||
"description": "<p>permet de flotter dans les airs</p>"
|
||||
},
|
||||
"Ceinture d’invisibilité": {
|
||||
"name": "Ceinture d’invisibilité",
|
||||
"description": "<p>quand on la boucle, cette ceinture offre le même effet que la poudre d’invisibilité</p>"
|
||||
},
|
||||
"Création de formes de vie en laboratoire": {
|
||||
"name": "Création de formes de vie en laboratoire",
|
||||
"description": ""
|
||||
},
|
||||
"Création de formes de vie hybrides d’homme et d’animal": {
|
||||
"name": "Création de formes de vie hybrides d’homme et d’animal",
|
||||
"description": ""
|
||||
},
|
||||
"Création par croisement et hybridation de plantes ou d’animaux mortellement dangereux": {
|
||||
"name": "Création par croisement et hybridation de plantes ou d’animaux mortellement dangereux",
|
||||
"description": ""
|
||||
},
|
||||
"Cuve de clonage des individus": {
|
||||
"name": "Cuve de clonage des individus",
|
||||
"description": ""
|
||||
},
|
||||
"Dague à lame creuse en verre": {
|
||||
"name": "Dague à lame creuse en verre",
|
||||
"description": "<p>remplie d’acide ou de poison</p>"
|
||||
},
|
||||
"Fabrication d’allanium et de janium": {
|
||||
"name": "Fabrication d’allanium et de janium",
|
||||
"description": ""
|
||||
},
|
||||
"Habitation intelligente": {
|
||||
"name": "Habitation intelligente",
|
||||
"description": ""
|
||||
},
|
||||
"Horloge": {
|
||||
"name": "Horloge",
|
||||
"description": ""
|
||||
},
|
||||
"Huile Brulante": {
|
||||
"name": "Huile Brulante",
|
||||
"description": "<p>brûle au contact et inflige d6 points de dégâts</p>"
|
||||
},
|
||||
"Instrument de musique au son parfait": {
|
||||
"name": "Instrument de musique au son parfait",
|
||||
"description": "<p>un dé de bonus pour en jouer</p>"
|
||||
},
|
||||
"Lance-éclair": {
|
||||
"name": "Lance-éclair",
|
||||
"description": "<p>une arme qui a vaguement la forme d’une arbalète et projette un éclair. Facteur de portée : 75 m ; d6 x2 points de dégâts ignorant les armure</p>"
|
||||
},
|
||||
"Machine de guerre blindée": {
|
||||
"name": "Machine de guerre blindée",
|
||||
"description": ""
|
||||
},
|
||||
"Machine dotée d'une semi-conscience": {
|
||||
"name": "Machine dotée d'une semi-conscience",
|
||||
"description": ""
|
||||
},
|
||||
"Machine Volante": {
|
||||
"name": "Machine Volante",
|
||||
"description": "<p>nef volante, par exemple</p>"
|
||||
},
|
||||
"Membre Artificiel": {
|
||||
"name": "Membre Artificiel",
|
||||
"description": "<p>non articulé, mais bien plus élégant qu’un simple crochet</p>"
|
||||
},
|
||||
"Microscope": {
|
||||
"name": "Microscope",
|
||||
"description": ""
|
||||
},
|
||||
"Navire submersible": {
|
||||
"name": "Navire submersible",
|
||||
"description": "<p>un sous-marin descendant à une profondeur maximale de 6 mètres et pouvant emporter un équipage de quatre personnes. Un tuyau flottant jusqu’à la surface alimente le sous-marin en oxygène (et peut être repéré en surface). Le sous-marin contient suffisamment d’air pour rester en plongée pendant une heure. Il se déplace à une vitesse d’environ 8 kilomètres à l’heure, propulsé par la force des membres de l’équipage qui pédalent pour faire tourner l’hélice</p>"
|
||||
},
|
||||
"Outil": {
|
||||
"name": "Outil",
|
||||
"description": "<p>Les armes et armures de cette qualité permettent, une fois par round, de relancer un 1 obtenu sur un jet de dégâts/de protection.</p>\n<p>En dehors des armes, les autres créations infligeant des dégâts ou soignant des blessures provoquent respectivement la perte ou la récupération de d3 points de vitalité.</p>"
|
||||
},
|
||||
"Périscope": {
|
||||
"name": "Périscope",
|
||||
"description": ""
|
||||
},
|
||||
"Piège": {
|
||||
"name": "Piège",
|
||||
"description": "<p>malus de -2 pour le repérer et le désamorcer ; inflige d3+1 points de dégât</p>"
|
||||
},
|
||||
"Serrure": {
|
||||
"name": "Serrure",
|
||||
"description": "<p>malus de -2 pour la forcer</p>"
|
||||
},
|
||||
"Serrure ou piège à la complexité unique": {
|
||||
"name": "Serrure ou piège à la complexité unique",
|
||||
"description": "<p>-8 pour les crocheter/désamorcer ; un piège inflige d6 x3 points de dégâts</p>"
|
||||
},
|
||||
"Serrure ou piège élaboré": {
|
||||
"name": "Serrure ou piège élaboré",
|
||||
"description": "<p>-4 pour les crocheter/désamorcer ; un piège inflige d6+1 points de dégâts</p>"
|
||||
},
|
||||
"Serrure ou piège particulièrement ingénieux": {
|
||||
"name": "Serrure ou piège particulièrement ingénieux",
|
||||
"description": "<p>-6 pour les crocheter/désamorcer ; le piège inflige d6 x2 points de dégâts</p>"
|
||||
},
|
||||
"Substance chimique luminescente": {
|
||||
"name": "Substance chimique luminescente",
|
||||
"description": "<p>produit de la lumière pour une demi-journée</p>"
|
||||
},
|
||||
"Télescope": {
|
||||
"name": "Télescope",
|
||||
"description": ""
|
||||
}
|
||||
}
|
||||
}
|
97
compendiums/en/bol.origins.json
Normal file
@ -0,0 +1,97 @@
|
||||
{
|
||||
"label": "Origines",
|
||||
"mapping": {
|
||||
"description": "system.description"
|
||||
},
|
||||
|
||||
"entries": {
|
||||
"Bei Wei": {
|
||||
"name": "Bei Wei",
|
||||
"description": "<h1>Bei Wei</h1>\n<p>Peuplade de la forêt boréale, les Wei sont trapus (les hommes dépassent rarement les 1,70 m) avec un visage rond au nez aplati, à la peau brune et aux cheveux noirs. Ils ont de petits yeux bridés (noirs ou marron) qui leur confèrent un regard intense et plutôt inquiétant, du moins pour ceux qui les rencontrent pour la première fois.</p>\n<p>Éleveurs de xalibu (des cervidés domestiqués), trappeurs et bûcherons, ce sont de grands connaisseurs des terres gelées du bout du monde, capables de survivre dans un environnement qui serait fatal à tout autre qu’eux. Si vous incarnez un Wei, une de vos carrières doit être barbare ou chasseur. Chez les Wei, les carrières de prêtre, sorcier ou médecin sont interdites aux hommes et ressortent du domaine exclusif des femmes.</p>\n<p> </p>\n<h2>Avantages </h2>\n<p>ami des bêtes, intrépide, mains guérisseuses, santé de fer, tigre des neiges, tireur puissant, vigilant, vue perçante.</p>\n<p> </p>\n<h2>Désavantages</h2>\n<p>bouseux, illettré, inadapté à la chaleur, inquiétant, méfiance envers la sorcellerie, taciturne.</p>\n<p> </p>\n<h2>Noms masculins </h2>\n<p>Bongyur, Dongge, Dreugpa, Gempo, Jungnen, Kamzo, Kempo, Lungpo, Nagpo, Nyetri, Phagpa, Sengtsen.</p>\n<p> </p>\n<h2>Noms féminins </h2>\n<p>Bkrubati, Chantra, Chodra, Jigmei, Lhalung, Logzen, Meito, Mirlapa, Palgye, Samaye, Santara, Tangba.</p>"
|
||||
},
|
||||
"Côte de Feu": {
|
||||
"name": "Côte de Feu",
|
||||
"description": "<h1>Côte de Feu</h1><p>La Côte de Feu est le domaine où vit la Reine Sorcière, entourée de ses sentinelles kalukans. Si votre héros est originaire de la Côte de Feu, vous pouvez décider d’en faire un kalukan, à condition que le MJ l’autorise. Dans ce cas, reportez-vous au chapitre 5 pour une liste des avantages/désavantages éligibles pour un personnage kalukan. Si vous choisissez plutôt d’être un humain, utilisez les listes proposées pour Halakh ou les marais de Kasht.</p>"
|
||||
},
|
||||
"Désert de Beshaar": {
|
||||
"name": "Désert de Beshaar",
|
||||
"description": "<h1>Désert de Beshaar</h1><p>Les Beshaaris sont des nomades qui chevauchent de gros oiseaux coureurs ressemblant à des autruches. Plutôt de petite taille, les Beshaaris ont une peau basanée qui a tendance à se rider profondément avec l’âge en raison du soleil implacable du désert. Ils ont les yeux noirs, marron foncé, verts, violets ou pourpres. Chez eux, on rencontre plus souvent qu’ailleurs des individus aux yeux vairons.</p><p>Les Beshaaris ont la réputation d’être susceptibles et prompts à la colère. Ils possèdent des coutumes complexes et extrêmement codifiées qu’ils respectent avec un scrupule sourcilleux ; une négociation avec les nomades du Beshaar est un exercice délicat où les occasions de commettre un impair sont nombreuses.</p><p>L’exotique beauté des jeunes filles beshaaries est célèbre, et celles capturées lors de raids contre les tribus nomades se retrouvent souvent vendues</p><p>comme esclaves ou danseuses. Plus d’un homme impétueux a perdu la vie en se battant pour les faveurs d’une séduisante vierge beshaarie.</p><p>Tous les personnages beshaaris doivent choisir barbare pour première carrière. À la chasse comme à la guerre, les guerriers beshaaris aiment à s’armer de longs javelots qu’ils lancent depuis le dos de leurs montures.</p><h2>Avantages</h2><p>ami des bêtes, arme favorite (javelot), attirant, baudrier de guerre, né en selle, renard du désert, vision nocturne, vue perçante.</p><h2>Désavantages</h2><p>bouseux, chétif, impétueux, inadapté au froid, marin d’eau douce, signe distinctif, taciturne.</p><h2>Noms masculins</h2><p>Aban, Akar, Akon, Atak, Basit, Boulos, Darwish, Fath, Ferran, Harith, Jalid, Karim, Makil, Mujib, Nur, Sadin, Samad, Surk, Yazan.</p><h2>Noms féminins</h2><p>Alima, Almas, Ambre, Bisara, Dimah, Felina, Hilela, Husina, Isimi, Jamara, Judi, Kalila, Lula, Maysam, Mumi, Namara, Nuha, Qisa, Rua, Thara.</p>"
|
||||
},
|
||||
"Ghataï": {
|
||||
"name": "Ghataï",
|
||||
"description": "<h1>Ghataï (steppe du Khanat)</h1>\n<p>Les Ghataï ont la peau cuivrée et les cheveux bruns, châtain foncé ou roux. Leurs yeux en amande sont généralement noirs ou marron, plus rarement bleus ou indigo. De taille moyenne, les Ghataï sont râblés, endurcis par une vie rude dans un environnement austère.</p>\n<p>Ce sont des nomades et des éleveurs, maîtres de la grande steppe qui s’ étend entre les montagnes de l’Axos au sud et le Bois du Sage au nord. C’est un peuple de cavaliers émérites, dont une partie s’est sédentarisée après avoir conquis les cités des Xi Lu. Si votre personnage appartient aux nomades ghataï, une de ses carrières doit être barbare ou mercenaire.</p>\n<p> </p>\n<h2>Avantages </h2>\n<p>arme favorite (arc ghataï ou fouet), dur à cuire, fils des plaines, vision nocturne, vue perçante.</p>\n<p> </p>\n<h2>Désavantages </h2>\n<p>bouseux, illettré, impétueux, inadapté à la chaleur, indigne de confiance, marin d’eau douce.</p>\n<p> </p>\n<h2>Noms masculins </h2>\n<p>Akta, Alagh, Chimeg, Gentulga, Gorgeg, Khubilaï, Mangaï, Nemtar, Subotaï, Telagu, Ulba, Zhengar.</p>\n<p> </p>\n<h2>Noms féminins </h2>\n<p>Bolaarma, Enthu, Erdene, Kushi, Narrantseg, Ner, Odval, Oyunn, Setseg, Silta, Suren, Yeshe.</p>"
|
||||
},
|
||||
"Halakh": {
|
||||
"name": "Halakh",
|
||||
"description": "<h1>Halakh</h1><p>Les graciles Halakhis ont la peau brune, les cheveux noirs et les yeux sombres. Leur cité dans les montagnes est un important centre de commerce pour les nomades beshaaris, qui sont leurs proches cousins, et des marchands de toutes les contrées de Lémurie convergent en ce lieu. Les Halakhis portent souvent le kriss, un long poignard à la lame sinueuse, et il se murmure que c’est à Halakh que l’on trouve les meilleurs assassins.</p><h2>Avantages</h2><p>arme favorite (kriss), discret, montagnard, outillage, renard du désert, résistant aux poisons, vision nocturne.</p><h2>Désavantages</h2><p>addiction, fanatique, gars de la ville, indigne de confiance, marin d’eau douce.</p><h2>Noms masculins</h2><p>Angada, Balaram, Bhadrakil, Chalam, Chedi, Daruk, Devad, Drajit, Govardan, Iravan, Janak, Jiwal, Karna, Kichaka, Kurava, Maharak, Mapoutra, Parada, Parasara, Shoumat.</p><h2>Noms féminins</h2><p>Anjana, Ardana, Charla, Damayanti, Devaki, Gadiva, Hanala, Holi, Ilvala, Jasura, Kalindi, Kesha, Madri, Mashini, Nakula, Nala, Neta, Ralekha, Rasena, Vahana.</p>"
|
||||
},
|
||||
"Îles du Crâne": {
|
||||
"name": "Îles du Crâne",
|
||||
"description": "<h1>Îles du Crâne</h1><p>On trouve sur les îles du Crâne des gens originaires des quatre coins de Lémurie, qui forment le pire rassemblement de crapules et de forbans qui se puisse trouver. Les hommes y sont bien plus nombreux que les femmes, lesquelles restent souvent cantonnées au rôle de serveuses dans les tripots, même si certaines ont su se tailler une place parmi les pirates. Ceux qui viennent ici le font généralement pour deux raisons : l’appel du large et la promesse du butin. Si votre héros vient des îles du Crâne, une de ses carrières doit être pirate.</p><h2>Avantages</h2><p>amis dans la pègre, athlète, bagarreur, discret, doigts de fée, fêtard, gamin des rues, pied marin, récupération rapide, roi de l’évasion, vigilant, vue perçante.</p><h2>Désavantages</h2><p>borgne / oreille coupée, cupide, fanfaron, illettré, indigne de confiance, lubrique, malédiction de Morgazzon, manchot / unijambiste, maudit, phobie, poltron, signe distinctif, soiffard, traqué.</p><h2>Noms</h2><p>comme des gens de tous horizons se retrouvent ici, on y rencontre des noms provenant de toutes les contrées de Lémurie.</p>"
|
||||
},
|
||||
"Jungle de Qo et jungle de Qush": {
|
||||
"name": "Jungle de Qo et jungle de Qush",
|
||||
"description": "<h1>Jungle de Qo et jungle de Qush</h1><p>Si vous provenez de ces jungles impénétrables, vous serez certainement un grooth (cf. chapitre 5), mais demandez d’abord l’accord du MJ. Sinon, il existe quelques tribus humaines de barbares et de chasseurs installées à la lisière de la jungle. Si votre héros provient d’une de ces tribus, utilisez la liste d’avantages/désavantages et les noms propres de Shamballah (cf. ci-après).</p>"
|
||||
},
|
||||
"Lysor": {
|
||||
"name": "Lysor",
|
||||
"description": "<h1>Lysor</h1><p>Les Lysoriens sont des gens paisibles et méditatifs. Alors que leur cité grouille d’étrangers affairés et bruyants, les natifs de Lysor tranchent par leur calme et leur attitude méditative, comme s’ils restaient insensibles à l’agitation ambiante.</p><p>Les Lysoriens ont habituellement les cheveux blonds ou châtain clair et les yeux bleus ou verts, bien que les autres couleurs ne soient pas non plus inhabituelles. Ils affichent généralement un teint frais, légèrement hâlé, qui respire la santé. Lysor s’enorgueillit de compter les meilleurs guérisseurs et médecins de toute la Lémurie, même si les fiers Satarlans contestent cette assertion.</p><h2>Avantages</h2><p>amis haut placés, artiste, attirant, bibliothèque savante, érudit, fortuné, mains guérisseuses, perspicace, récupération rapide, résistant aux poisons, santé de fer, savant.</p><h2>Désavantages</h2><p>chétif, foie jaune, gars de la ville, incapable de mentir, lent à la détente, malédiction de Morgazzon, non-combattant.</p><h2>Noms masculins</h2><p>Aklaton, Bardak, Bazyli, Creon, Cyr, Dramik, Erechon, Jenko, Morgos, Myron, Otos, Skorpos, Vaston, Zedek, Zerro.</p><h2>Noms féminins</h2><p>Adara, Alesta, Cora, Dresina, Elma, Furka, Honna, Irusina, Jace, Letha, Megara, Melika, Nirla, Timandra, Uvikka, Vara, Zeva.</p>"
|
||||
},
|
||||
"Malakut": {
|
||||
"name": "Malakut",
|
||||
"description": "<h1>Malakut</h1><p>Les Malakutis ont une apparence qui leur confère souvent un air inquiétant. Plutôt frêles, le teint olivâtre et les cheveux noirs ou châtain foncé, ils ont les lèvres minces, de petits yeux et le nez aquilin. Deux redoutables guildes de voleurs s’opposent à Malakut, les Guenillards et les Poignards Sanglants. Extrêmement puissantes au sein de la cité, les deux guildes étendent également leur influence aux villes voisines de la région. Malakut produit de fameuses lances au fer en forme de longue feuille de laurier, les khastoks, qui sont utilisées par la Garde royale jemadar. Si votre personnage est originaire de Malakut, il y a de fortes chances pour que sa première carrière soit voleur.</p><h2>Avantages</h2><p>amis dans la pègre, arme favorite (khastok), combat à l’aveugle, discret, doigts de fée, fêtard, fils des plaines, gamin des rues, outillage (outils de voleur), vigilant.</p><h2>Désavantages</h2><p>chétif, gars de la ville, indigne de confiance, marin d’eau douce, mauvaise réputation, traqué.</p><h2>Noms masculins</h2><p>Arfi, Badar, Crixas, Darzi, Erfan, Firdos, Gilki, Jandak, Krugar, Lodar, Midum, Nakum, Purdos, Qalader, Qatir, Qorbi, Ralak, Sardan, Tamar, Zemar.</p><h2>Noms féminins</h2><p>Adala, Azra, Bursebala, Coza, Daliya, Dua, Ethibela, Lamala, Mirvala, Norva, Qisi, Roshan, Sakina, Saran, Simi, Tala, Tikina, Wella, Xua, Zinah.</p>"
|
||||
},
|
||||
"Marais de Festrel": {
|
||||
"name": "Marais de Festrel",
|
||||
"description": "<h1>Marais de Festrel</h1><p>Les marais de Festrel hébergent une population clairsemée, car cette région est loin d’être la plus hospitalière de Lémurie. Les hommes qui vivent ici cultivent leur isolement et, quand ils n’ont pas envie de se montrer aux étrangers, sont très difficiles à trouver. Petits et trapus, ils font preuve d’une agilité étonnante et sont de formidables bateliers.</p><h2>Avantages</h2><p>athlète, bagarreur, discret, odorat développé, ouïe fine, pisteur des marais, résistant aux poisons, santé de fer, vigilant.</p><h2>Désavantages</h2><p>bouseux, illettré, inadapté à la chaleur, maudit, taciturne.</p><h2>Noms</h2><p>les habitants des marais de Festrel portent le même genre de noms que ceux de Parsool et d’Oomis.</p>"
|
||||
},
|
||||
"Marais de Kasht": {
|
||||
"name": "Marais de Kasht",
|
||||
"description": "<h1>Marais de Kasht</h1><p>Les habitants des marais de Kasht sont généralement petits et sveltes, avec des cheveux noirs et la peau pâle. Aussi silencieux et invisibles que des ombres, ils se déplacent à travers leur pays marécageux, empruntant des chemins secrets tracés par plusieurs générations de chasseurs, de trappeurs et de pêcheurs. Ils sont passés maîtres dans l’art d’utiliser leur environnement pour se camoufler et masquer leur odeur, afin d’approcher les créatures du marais qu’ils chassent pour se nourrir.</p><h2>Avantages</h2><p>ami des bêtes, athlète, discret, odorat développé, ouïe fine, pisteur des marais, résistant aux poisons, santé de fer, vigilant.</p><h2>Désavantages</h2><p>bouseux, chétif, crédule.</p><h2>Noms masculins</h2><p>Achak, Ahmik, Akando, Akule, Ashok, Bidi, Chepi, Chetan, Ciqala, Dogon, Goth, Hinto, Hokee, Jolon, Keme, Knoton, Kourouk, Molimo, T’kala, T’kouna.</p><h2>Noms féminins</h2><p>Aiyana, Alawa, Atiaran, Bly, Camarin, Cathecassa, Chapala, Chimalis, Dena, Doli, Donoma, Etania, Kalama, Landina, Mitenah, Nitika, Onatah, Orenda, Z’kala, Z’kouna.</p>"
|
||||
},
|
||||
"Montagnes de l’Axos": {
|
||||
"name": "Montagnes de l’Axos",
|
||||
"description": "<h1>Montagnes de l’Axos</h1><p>Les contreforts de ces montagnes sont habités par plusieurs tribus de farouches barbares. Blancs de peau, grands et athlétiques, ces éleveurs sont aussi d’excellents chasseurs et des grimpeurs réputés. Les hommes des tribus de l’Axos mènent une vie fruste ; leur artisanat et leur art n’utilisent que les matériaux que leurs offrent leurs montagnes, et c’est également le cas pour leurs armes de chasse et de guerre.</p><p>Si vous êtes originaire des montagnes de l’Axos, votre première carrière doit être barbare, et il ne serait pas étonnant que vous soyez aussi chasseur. Les tribus de l’Axos sont réputées pour leur habileté à la fronde.</p><p>Les cimes de la chaîne de l’Axos sont la demeure d’un énigmatique peuple d’hommesoiseaux (cf. chapitre 5).</p><h2>Avantages</h2><p>arme favorite (fronde de l’Axos), athlète, colosse, cri de guerre, dur à cuire, montagnard, odorat développé, ouïe fine, récupération rapide, santé de fer, vigilant.</p><h2>Désavantages</h2><p>bouseux, illettré, inadapté à la chaleur, marin d’eau douce, méfiance envers la sorcellerie, taciturne.</p><h2>Noms masculins</h2><p>Almod, Amerik, Borc, Drogar, Erkil, Fiak, Finvar, Ginnar, Hakon, Krakar, Oslac, Rokar, Salgarth, Sungar, Thork, Thurkil, Travik, Vali, Vikar, Vogg.</p><h2>Noms féminins</h2><p>Arlin, Asta, Birla, Dalla, Emelle, Esja, Evenni, Finna, Forla, Froda, Gevi, Glevara, Herdis, Jodis, Jofa, Klima, Runa, Rym, Sivora, Varda.</p>"
|
||||
},
|
||||
"Oomis": {
|
||||
"name": "Oomis",
|
||||
"description": "<h1>Oomis</h1><p>Les Oomisiens sont généralement grands et solidement charpentés, avec les cheveux d’un blanc argenté, des yeux de différentes nuances de bleu, des petites oreilles (à peine dessinées) et une peau présentant une légère teinte bleutée. Ces caractéristiques physiques amènent certains à se demander jusqu’où va l’amitié qui les lie aux nomades bleus…</p><p>C’est un peuple d’habiles négociants, et un personnage originaire d’Oomis prendra souvent marchand pour première carrière.</p><h2>Avantages</h2><p>ami des céruléens, dur à cuire, fortuné, perspicace.</p><h2>Désavantages</h2><p>cupide, dur d’oreille, lent à la détente, malédiction de Morgazzon.</p><h2>Noms masculins</h2><p>Aceld, Algeros, Curcio, Dalmar, Deston, Kaarlo, Norf, Quent, Rust, Sevrik, Vardon, Vik.</p><h2>Noms féminins</h2><p>Afrodille, Alix, Daisi, Dany, Delit, Jance, Jenina, Jessamin, Miette, Myrla, Questa.</p>"
|
||||
},
|
||||
"Parsool": {
|
||||
"name": "Parsool",
|
||||
"description": "<h1>Parsool</h1><p>La population de Parsool est très cosmopolite et l’on y croise tous les types de morphologie et toutes les couleurs de peau. Les meilleurs marins de Lémurie viennent de Parsool. Un personnage originaire de cette cité prendra certainement marin parmi ses choix de carrières.</p><h2>Avantages</h2><p>arme favorite (hache d’abordage de Parsool), cri de guerre (Parsool), fêtard, pied marin.</p><h2>Désavantages</h2><p>borgne/oreille coupée, gars de la ville, illettré, manchot/unijambiste, soiffard.</p><h2>Noms masculins</h2><p>Agroc, Bardhyl, Besmir, Dar, Driton, Erion, Jaak, Jeton, Jodoc, Juhan, Kalev, Koit, Lek, Loic, Nighul, Paol, Pavo, Ropar, Skender, Toomaas.</p><h2>Noms féminins</h2><p>Arvesa, Besa, Bora, Dritta, Eha, Genta, Kaias, Kaja, Leka, Liridona, Loviise, Marika, Mimiza, Mirjam, Reet, Riina, Rovena, Tuule, Viu, Zami.</p>"
|
||||
},
|
||||
"Plaines de Klaar": {
|
||||
"name": "Plaines de Klaar",
|
||||
"description": "<h1>Plaines de Klaar</h1><p>Les plaines de Klaar sont la demeure des céruléens, une race de géants à la peau gris-bleu qu’on surnomme aussi les nomades bleus. Effrayants par leur taille, les céruléens ne sont pourtant pas un peuple particulièrement agressif. De fait, ce sont surtout d’excellents marchands.</p><p>Si votre personnage est un céruléen, vous devez choisir barbare comme première carrière. Votre deuxième carrière sera certainement marchand, puisque tous les enfants des nomades bleus apprennent dès leur plus jeune âge l’art du négoce. Les carrières d’alchimiste, de médecin, de scribe et de sorcier sont interdites aux céruléens. Chez eux, les prêtres sont appelés des chamans. Vous trouverez au chapitre 5 une liste des avantages/ désavantages pour un personnage céruléen, ainsi que quelques exemples de noms.</p>"
|
||||
},
|
||||
"Satarla": {
|
||||
"name": "Satarla",
|
||||
"description": "<h1>Satarla</h1><p>La cité de Satarla, qu’on surnomme le « Joyau de Lémurie », est un haut lieu de culture et de sophistication. Les Satarlans sont souvent plus grands que la moyenne, mais comme la ville accueille des gens de toutes origines, on y rencontre toutes les morphologies et toutes les couleurs de peau. Il est amusant de noter que ceux qui s’installent ici ont tôt fait d’adopter cet air supérieur qui semble commun à tous les natifs de Satarla. La mendicité y est interdite, aussi un personnage originaire de Satarla ne peut-il débuter avec une carrière de mendiant. Seuls les Satarlans peuvent choisir d’adopter la carrière de pilote des airs. Les prouesses des chevaliers de Satarla sont légendaires.</p><h2>Avantages</h2><p>amis haut placés, artiste, bibliothèque savante, bien né, érudit, fortuné, marqué par les dieux, né en selle, savant.</p><h2>Désavantages : arrogant, cupide, gars de la ville. Noms masculins</h2><p>Alban, Avitus, Blasius, Brutor, Cassian, Corvin, Crisus, Drusus, Emilian, Festus, Gallus, Gord, Hilaro, Hort, Juven, Luman, Martis, Nonus, Petron, Regul, Rufin, Sabin, Severan, Terent, Torc, Vitan.</p><h2>Noms féminins</h2><p>Amilia, Arlana, Cassi, Cloel, Domitia, Fabula, Floriana, Gemellia, Junia, Laela, Laurenia, Manda, Marina, Nunia, Quina, Severina, Tullia, Valeria, Varinia, Vita.</p>"
|
||||
},
|
||||
"Shamballah": {
|
||||
"name": "Shamballah",
|
||||
"description": "<h1>Shamballah</h1><p>Les natifs de Shamballah ont la peau mate, les cheveux foncés et des yeux violets, écarlates ou indigo. Ils ont des sens particulièrement affûtés et font d’excellents chasseurs.</p><h2>Avantages</h2><p>ami des bêtes, athlète, odorat développé, ouïe fine, roi de la jungle, vigilant, vue perçante.</p><h2>Désavantages</h2><p>bouseux, illettré, inadapté au froid, marin d’eau douce, méfiance envers la sorcellerie.</p><h2>Noms masculins</h2><p>Akri, Badran, Bello, Diallo, Donkor, Eze, Jaafar, Juma, Kamouzou, M’Boutou, M’Dogo, Nasso, Ohin, Oulan, Rasoul, Simballa, Talib, Watimou, Zareb, Zouri.</p><h2>Noms féminins</h2><p>Afi, Bembel, Binta, Chipi, Damisi, Dayo, Elomi, Geli, Habika, Jahia, Lila, M’Lala, Panya, Sabra, Shani, Tabita, Tisha, Yousra, Zalika, Zina.</p>"
|
||||
},
|
||||
"Terres Désolées": {
|
||||
"name": "Terres Désolées",
|
||||
"description": "<h1>Terres Désolées</h1><p>Personne ne sait grand-chose au sujet des Terres Désolées, et moins encore sur les contrées qui s’étendraient au-delà. Des gens vivent assurément dans cette région, s’il faut en croire les récits de chasseurs et d’explorateurs qui ont relevé des traces de présence. Mais à ce jour, personne n’a découvert le moindre village ou hameau, et on ignore tout de l’apparence de leurs habitants.</p><p>Si votre héros est originaire des Terres Désolées, il vous faudra travailler avec le MJ pour déterminer à quoi ressemble votre personnage. Mais attendezvous à ce qu’il soit toujours considéré comme un étranger, où qu’il se rende en Lémurie.</p>"
|
||||
},
|
||||
"Tyrus": {
|
||||
"name": "Tyrus",
|
||||
"description": "<h1>Tyrus</h1><p>Les habitants de la prospère cité fluviale de Tyrus ont la peau et les cheveux sombres, les yeux verts ou marron. Les soldats de Tyrus sont des archers fameux et les artisans de la ville produisent de magnifiques arcs longs. Les sorciers y sont proscrits.</p><h2>Avantages</h2><p>arme favorite (arc long de Tyrus), bagarreur, cri de guerre (Tyrus), fêtard, résistant à la magie, roi de la jungle, sentir la magie, vigilant.</p><h2>Désavantages</h2><p>fanfaron, gars de la ville, illettré, méfiance envers la sorcellerie, soiffard.</p><h2>Noms masculins</h2><p>Anxo, Baldo, Bartol, Bento, Dimas, Eloy, Ericos, Gaspar, Helder, Jorg, Mogos, Nuno, Ovanto, Pluco, Qido, Raul, Rui, Tacito, Thiago, Valen.</p><h2>Noms féminins</h2><p>Ana, Branca, Carmo, Desideria, Dorotana, Jovita, Judita, Kardelia, Lia, Lotia, Lygia, Miella, Nona, Rebeqa, Sabella, Tuvia, Uxia, Xania, Xoanna, Zeta.</p>"
|
||||
},
|
||||
"Urceb": {
|
||||
"name": "Urceb",
|
||||
"description": "<h1>Urceb</h1><p>Les habitants d’Urceb sont des risque-tout, des joueurs et des opportunistes. Habitués à s’aventurer dans les souterrains qui s’étendent sous leur cité, ils sont à leur aise dans les tunnels, les catacombes et les grottes.</p><h2>Avantages</h2><p>amis dans la pègre, amis haut placés, combat à l’aveugle, fêtard, outillage, roi de l’évasion, vision nocturne.</p><h2>Désavantages : gars de la ville, illettré, taciturne. Noms masculins</h2><p>Ambros, Axel, Bodo, Curd, Dolf, Egond, Falkor, Golo, Hegbran, Jonar, Kurnvarn, Londar, Lothar, Mennus, Rudig, Sepp, Till, Torsten, Urs, Volkard.</p><h2>Noms féminins</h2><p>Alhella, Barbella, Crika, Dorlina, Erna, Frekka, Gusala, Hannelor, Jolanda, Karolinda, Letta, Lieselotte, Margita, Nadja, Pia, Resi, Seffi, Theda, Ursa, Uta.</p>"
|
||||
},
|
||||
"Valgard": {
|
||||
"name": "Valgard",
|
||||
"description": "<h1>Valgard</h1><p>Grands et musclés, arborant des tignasses blondes ou rousses, les Valgardiens vivent en tribus belliqueuses. Si votre personnage est originaire de Valgard, une de ses carrières doit être barbare. Les sorciers ou les alchimistes sont rares parmi les Valgardiens, sans être non plus totalement inédits.</p><h2>Avantages</h2><p>arme favorite (épée valgardienne), cri de guerre (Valgard), marqué par les dieux, odorat développé, récupération rapide, tigre des neiges.</p><h2>Désavantages</h2><p>bouseux, illettré, inadapté à la chaleur, incapable de mentir, marin d’eau douce, méfiance envers la sorcellerie, taciturne.</p><h2>Noms masculins</h2><p>Abrak, Ankar, Asvith, Banfar, Borkar, Broti, Craigor, Drakkar, Elkor, Fingor, Gonnar, Grimar, Hevik, Jark, Korik, Krok, Morkrar, Rokor, Thagric, Voldar.</p><h2>Noms féminins</h2><p>Adisa, Alvora, Asara, Berna, Brongara, Disa, Edarra, Erindis, Finnara, Fraorka, Gyllana, Hakatla, Helvera, Jarngera, Jodis, Jolinn, Kitta, Marfora, Rakela, Sesilida.</p>"
|
||||
},
|
||||
"Zalut": {
|
||||
"name": "Zalut",
|
||||
"description": "<h1>Zalut</h1><p>Surnommée la cité des magiciens, Zalut est gouvernée par des sorciers, des prêtres et des alchimistes. Les Zalutis ont la peau très pâle (les albinos y sont moins rares qu’ailleurs) et aiment à se raser le crâne. Ils cultivent leur isolement et la légende prétend qu’ils seraient les derniers descendants des Rois-Sorciers.</p><p>En général, les personnages originaires de Zalut possèdent une de ces trois carrières susnommées, ou sont esclaves. D’autres choix de carrières restent toutefois possibles.</p><h2>Avantages</h2><p>érudit, intimidant, magie des RoisSorciers, pouvoir du Néant, résistant à la magie, résistant aux poisons, savant, sentir la magie, vision nocturne.</p><h2>Désavantages</h2><p>addiction, arrogant, chétif, foie jaune, indigne de confiance, inquiétant, malédiction de Morgazzon, maudit, obsession, poltron, signe distinctif, souffreteux.</p><h2>Noms masculins</h2><p>Ariistuzuun, Ar’siuqqu, Balathu, Bashaa, Dadanuum, Hunzuu, Ikuppi, Libulluth, Nigsummu, Nikannuur, NurYunna, Nutesh, Puzzur, Rihaatu, Sargon, Suusaandar, Tattaanu, Yamazuubaar, Zorgal, Zuuthusu.</p><h2>Noms féminins</h2><p>Amatia, Ashlultum, Banuna, Gemeti, Iltani, Ishtaya, Jaarthula, Kishu, Ku-Aya, Nidintu, Numunia, Nuteshi, Sillashu, Sumia, Thuulia, Yadidatum, Zadia, Zakiti, Zemibi, Zorkara.</p>"
|
||||
}
|
||||
}
|
||||
}
|
157
compendiums/en/bol.potions-alchimie.json
Normal file
@ -0,0 +1,157 @@
|
||||
{
|
||||
"label": "Alchimie - Potions",
|
||||
"mapping": {
|
||||
"description": "system.description"
|
||||
},
|
||||
|
||||
"entries": {
|
||||
"Acide": {
|
||||
"name": "Acide",
|
||||
"description": "<p>1 petite fiole, inflige d3 points de dégâts ou peut percer 2,5 cm de bois ou de métal</p>"
|
||||
},
|
||||
"Agrandissement ou Rapetissement": {
|
||||
"name": "Agrandissement ou Rapetissement",
|
||||
"description": "<p>Durée : 1 scène</p>"
|
||||
},
|
||||
"Alcool de Qualité": {
|
||||
"name": "Alcool de Qualité",
|
||||
"description": "<p>3 bouteilles</p>"
|
||||
},
|
||||
"Altération permanente": {
|
||||
"name": "Altération permanente",
|
||||
"description": "<p>bonus permanent de +1 dans un attribut ; on ne peut bénéficier qu’une seule fois des effets de cet élixir</p>"
|
||||
},
|
||||
"Antalgique": {
|
||||
"name": "Antalgique",
|
||||
"description": "<p>2d6 heures d'effet, 3 doses</p>"
|
||||
},
|
||||
"Anti-Fièvre": {
|
||||
"name": "Anti-Fièvre",
|
||||
"description": "<p>2d6 heures d'effet, 3 doses</p>"
|
||||
},
|
||||
"Antidote aux Poisons Alchimiques": {
|
||||
"name": "Antidote aux Poisons Alchimiques",
|
||||
"description": "<p>Soigne l’ empoisonnement en 1 heure, 3 doses</p>"
|
||||
},
|
||||
"Antidote contre les Venins Animaux et Poisons Végétaux": {
|
||||
"name": "Antidote contre les Venins Animaux et Poisons Végétaux",
|
||||
"description": "<p>soigne l’ empoisonnement en 1 heure, 3 doses</p>"
|
||||
},
|
||||
"Antidote Universel": {
|
||||
"name": "Antidote Universel",
|
||||
"description": "<p>soigne instantanément n’importe quel empoisonnement, même magique ; 1 dose</p>"
|
||||
},
|
||||
"Beauté": {
|
||||
"name": "Beauté",
|
||||
"description": "<p>+1 en aura ; durée : une scène</p>"
|
||||
},
|
||||
"Encre Invisible": {
|
||||
"name": "Encre Invisible",
|
||||
"description": "<p>Réapparaît quand elle est mouillée ou chauffée</p>"
|
||||
},
|
||||
"Feu Alchimique": {
|
||||
"name": "Feu Alchimique",
|
||||
"description": "<p>une fiole qui, quand elle est brisée, explose en une boule de feu de 3 m de rayon, infligeant d6 x2 points de dégâts</p>"
|
||||
},
|
||||
"Héroïsme": {
|
||||
"name": "Héroïsme",
|
||||
"description": "<p>le buveur bénéficie d’un bonus de +1 à toutes ses aptitudes de combat ; durée : une scène ; 1 dose</p>"
|
||||
},
|
||||
"Illusion de la Jeunesse": {
|
||||
"name": "Illusion de la Jeunesse",
|
||||
"description": "<p>le buveur retrouve l’apparence qu’il avait à 25 ans ; durée : une semaine ; 1 dose</p>"
|
||||
},
|
||||
"Immortalité": {
|
||||
"name": "Immortalité",
|
||||
"description": "<p>Prévient toute mort naturelle. Le buveur vieillit lentement, en se desséchant au fil des siècles. Seule une mort violente peut l’ emporter.</p>"
|
||||
},
|
||||
"Métamorphose": {
|
||||
"name": "Métamorphose",
|
||||
"description": "<p>le buveur prend l’apparence d’une autre personne, pour une durée d’une heure. Nécessite quelques cheveux, rognures d’ongles, ou gouttes de sang de la personne en question ; 1 dose</p>"
|
||||
},
|
||||
"Mort aux Rats": {
|
||||
"name": "Mort aux Rats",
|
||||
"description": "<p>Tue les petits animaux nuisibles</p>"
|
||||
},
|
||||
"Neutralisant d’acide": {
|
||||
"name": "Neutralisant d’acide",
|
||||
"description": "<p>stoppe instantanément les effets d’une quantité équivalente d’acide ; 9 petites fioles</p>"
|
||||
},
|
||||
"Panacée": {
|
||||
"name": "Panacée",
|
||||
"description": "<p>le buveur est guéri de n’importe quelle maladie ; 2 doses</p>"
|
||||
},
|
||||
"Paralysant": {
|
||||
"name": "Paralysant",
|
||||
"description": "<p>le buveur doit réussir un jet de vigueur avec votre rang d’alchimiste en malus ou se retrouver paralysé pour une durée de 24 heures ; 1 dose</p>"
|
||||
},
|
||||
"Perspicacité": {
|
||||
"name": "Perspicacité",
|
||||
"description": "<p>+1 en esprit ; durée : une scène</p>"
|
||||
},
|
||||
"Philtre d’amour": {
|
||||
"name": "Philtre d’amour",
|
||||
"description": "<p>le buveur doit réussir un jet d’esprit avec votre rang d’alchimiste en malus ou tomber follement amoureux ; durée : une lune ; 1 dose</p>"
|
||||
},
|
||||
"Poudre d’invisibilité": {
|
||||
"name": "Poudre d’invisibilité",
|
||||
"description": "<p>rend invisible aux yeux d’autrui, à moins d’entreprendre une action qui attire l’attention ; durée : une scène</p>"
|
||||
},
|
||||
"Poudre de Phénix": {
|
||||
"name": "Poudre de Phénix",
|
||||
"description": "<p>une poudre qui brûle au contact, même sous l’ eau, en infligeant d6 x3 points de dégâts</p>"
|
||||
},
|
||||
"Précision": {
|
||||
"name": "Précision",
|
||||
"description": "<p>un dé de bonus aux jets d’attaque de tir ; durée : une scène</p>"
|
||||
},
|
||||
"Prouesse": {
|
||||
"name": "Prouesse",
|
||||
"description": "<p>un dé de bonus aux jets d’attaque de corps à corps ; durée : une scène</p>"
|
||||
},
|
||||
"Puissance": {
|
||||
"name": "Puissance",
|
||||
"description": "<p>+1 en vigueur ; durée : une scène</p>"
|
||||
},
|
||||
"Régénération Suprême": {
|
||||
"name": "Régénération Suprême",
|
||||
"description": "<p>provoque la régénération d’un membre amputé, d’un œil perdu, etc., annulant le désavantage associé à ce handicap</p>"
|
||||
},
|
||||
"Remède contre la Vérole": {
|
||||
"name": "Remède contre la Vérole",
|
||||
"description": ""
|
||||
},
|
||||
"Remède contre le Scorbut": {
|
||||
"name": "Remède contre le Scorbut",
|
||||
"description": ""
|
||||
},
|
||||
"Répulsifs à Insecte": {
|
||||
"name": "Répulsifs à Insecte",
|
||||
"description": "<p>4d6 heures d’effet, 3 doses</p>"
|
||||
},
|
||||
"Résistance": {
|
||||
"name": "Résistance",
|
||||
"description": "<p>la peau du buveur devient aussi résistante qu’une armure, lui offrant d6 de protection ; durée : une scène ; 1 dose</p>"
|
||||
},
|
||||
"Sens Accrus": {
|
||||
"name": "Sens Accrus",
|
||||
"description": "<p>Un dé de bonus aux jets d’action pour détecter ou repérer quelque chose ; durée : une scène</p>"
|
||||
},
|
||||
"Sommeil Instantané": {
|
||||
"name": "Sommeil Instantané",
|
||||
"description": "<p>le buveur doit réussir un jet de vigueur avec votre rang d’alchimiste en malus, ou sombrer dans un profond sommeil pendant une demi-journée.</p>"
|
||||
},
|
||||
"Somnifere": {
|
||||
"name": "Somnifere",
|
||||
"description": "<p>A l’ingestion, provoque 2d6 heures de sommeil profond, 3 doses</p>"
|
||||
},
|
||||
"Teinture de respiration aquatique": {
|
||||
"name": "Teinture de respiration aquatique",
|
||||
"description": "<p>permet au buveur de respirer sous l’eau pendant une demi-journée</p>"
|
||||
},
|
||||
"Vivacité": {
|
||||
"name": "Vivacité",
|
||||
"description": "<p>+1 en agilité ; durée : une scène</p>"
|
||||
}
|
||||
}
|
||||
}
|
41
compendiums/en/bol.races.json
Normal file
@ -0,0 +1,41 @@
|
||||
{
|
||||
"label": "Races",
|
||||
"mapping": {
|
||||
"description": "system.description"
|
||||
},
|
||||
|
||||
"entries": {
|
||||
"Céruléens": {
|
||||
"name": "Céruléens",
|
||||
"description": "<h1>Céruléens</h1><p>Malgré leur nom, les céruléens (aussi appelés les nomades bleus) ont plutôt la peau grise, avec des variations de teinte allant du gris-vert au gris-bleu, voire au gris-violet. Les mâles mesurent entre 2,20 et 2,50 m, mais certains peuvent atteindre jusqu’à 2,70 m. En moyenne, les femmes font une trentaine de centimètres de moins que les hommes et possèdent une silhouette moins massive qu’eux. Tous sont généralement chauves.</p><p>Les céruléens parcourent les plaines de Klaar dans leurs grands chariots, au rythme lent des énormes banths qui les tirent. C’est une race farouche qui se mêle peu aux hommes, à part pour commercer de temps à autre avec certains marchands qui ont su gagner leur confiance, à Urceb ou Oomis. Il existe plusieurs grandes tribus et une vingtaine ou une trentaine de tribus mineures. Chacune possède son propre nom, que ses membres accolent à leur prénom. Voici les noms des tribus les plus connues : Hegga, Karvoona, Kazzorla, Chunth, Thazaar et Kozaar. Chaque tribu est dirigée par un chef et compte également un chaman, qui tient le rôle de chef spirituel et de médecin.</p><p>Malgré leur physique impressionnant, les céruléens ne sont pas un peuple particulièrement belliqueux, même s’ils ne manquent pas d’atouts pour le combat. Lorsque deux tribus s’affrontent, ils vont à la bataille montés sur des eldaphons spécialement entraînés pour la guerre.</p><p>Les nomades bleus préfèrent le commerce à la guerre. La dernière semaine de chaque mois, différentes tribus se rassemblent dans les ruines d’Ygddar pour échanger des marchandises et retrouver de vieux amis. Certaines tribus sont en conflit et il arrive parfois que des rixes éclatent, mais ces périodes consacrées au commerce se déroulent en général dans une ambiance cordiale.</p><p>On raconte que les céruléens seraient le résultat d’expériences alchimiques menées par les Rois-Sorciers.</p><p>L’Edda pourpre et d’autres chroniques anciennes indiquent sans l’ombre d’un doute que des géants à la peau bleue combattaient au côté des Rois-Sorciers à l’époque de Kylarth, comme du temps du roi Thangard. À la bataille du gouffre d’Hyrdral, le géant bleu Chunak mena ses frères à la révolte contre leurs maîtres reptiliens, qu’ils massacrèrent en grand nombre avant que ceux-ci aient pu faire appel à toute la puissance de leur magie maléfique. Sans ce revirement des céruléens, il est probable que les Rois-Sorciers auraient remporté cette bataille.</p><p>Les céruléens n’ont aucune aptitude naturelle pour devenir sorciers ou alchimistes ; ces carrières leur sont donc interdites. Les prêtres des céruléens sont appelés des chamans et ils vénèrent principalement Quathoomar.</p><h2>Avantages</h2><p>ami des bêtes, ami des céruléens, bagarreur, colosse, dur à cuire, fils des plaines, intimidant, peau dure, récupération rapide, vigueur céruléenne.</p><h2>Désavantages</h2><p>bouseux, deux mains gauches, marin d’eau douce, méfiance envers la sorcellerie, pataud, signe distinctif.</p><h2>Noms masculins</h2><p>Bork, Chun, Dekk, Erkk, Fakk, Gort, Gozaar, Gurnt, Jaakko, Jank, Jouka, Jrycki, Kall, Kerrik, Kook, Koozo, Kukk, Lekk, Lozzar, Nukk, Penkk, Tarrk, Venk, Vilk, Vork.</p><h2>Noms féminins</h2><p>Akki, Bekka, Bezis, Danki, Eeva, Furka, Inka, Irka, Joona, Jurva, Kalli, Karis, Kella, Kooki, Krakki, Lazzis, Likka, Lovi, Marjukka, Marzi, Nukeel, Nukka, Oki, Rikki,Tharki.</p>"
|
||||
},
|
||||
"Grooth": {
|
||||
"name": "Grooth",
|
||||
"description": "<h1>Grooth</h1><p>Les grooth sont une race d’hommes primitifs anthropophages vivant dans de petits campements de huttes rudimentaires au cœur des jungles. À peine plus évolués que des singes, ils possèdent un corps trapu et puissant, de longs bras musculeux qui pendent presque jusqu’au sol et des jambes courtaudes et arquées. Ils ont un visage aux traits simiesques, de petits yeux rouges sous un front proéminent et de larges mâchoires aux canines inférieures remontant comme des crocs. Les grooth s’arment de solides gourdins ainsi que de lances à pointe en silex, et se ceignent les reins d’un pagne en peau d’animal, seuls signes chez eux d’un semblant de culture.</p><p>Si vous souhaitez jouer un grooth, vous ne pouvez choisir vos carrières de départ que parmi celles-ci : barbare, dresseur, esclavagiste, gladiateur, chasseur, guerrier, chaman (prêtre), esclave, ouvrier.</p><p>Tous les grooth ont automatiquement le désavantage illettré.</p><h2>Avantages</h2><p>bagarreur, colosse, dur à cuire, intimidant, odorat développé, ouïe fine, récupération rapide, roi de la jungle, vision nocturne.</p><h2>Désavantages</h2><p>bigleux, bouseux, deux mains gauches, distrait, impétueux, marin d’eau douce, maudit, méfiance envers la sorcellerie, phobie du feu, repoussant, signe distinctif, taciturne.</p><h2>Noms masculins et féminins</h2><p>Ak, Bruk, Cek, Dur, Erg, Fik, Grar, Hig, Ig, Jat, Kof, Lurt, Mak, Nin, Op, Prek, Quh, Rir, Sum, Tulk, Um, Vit, Wat, Zuk.</p>"
|
||||
},
|
||||
"Hommes-oiseaux": {
|
||||
"name": "Hommes-oiseaux",
|
||||
"description": "<h1>Hommes-oiseaux</h1><p>Cette race mystérieuse et très secrète vit au cœur de vallées cachées dans les hauteurs des montagnes de l’Axos. Les hommes-oiseaux sont élancés, agiles et très créatifs. Ils bâtissent leurs demeures dans des grottes et sur des corniches ; leurs ailes leur permettent de planer ou même de voler sur de courtes distances, à condition de ne pas être trop chargés. Leurs pieds présentent des serres semblables à celles d’oiseaux, qui leur permettent de grimper les parois rocheuses avec une grande aisance. Ce ne sont pas de grands guerriers et ils se servent essentiellement d’armes de jet légères qu’ils utilisent aussi bien à la chasse que pour défendre leur territoire. Les armures sont trop encombrantes et les empêcheraient de voler ; seuls les plus forts d’entre eux s’équipent en cas de danger de brassards, d’un harnais et de jambières en cuir (l’équivalent d’une armure légère), ou utilisent un petit bouclier.</p><p>Si vous jouez un homme-oiseau, vous pouvez choisir n’importe quelle carrière, mais les carrières suivantes sont rares chez eux, et il vous faudra une bonne histoire pour expliquer ce choix : assassin, bourreau, gladiateur, marin, soldat, voleur, ouvrier, vagabond.</p><h2>Avantages</h2><p>agilité de l’homme-oiseau, ami des bêtes, arme favorite (fléchette), artiste, athlète, montagnard, vigilant, vision nocturne, vue perçante.</p><h2>Désavantages</h2><p>chétif, foie jaune, méfiance envers la sorcellerie, non-combattant, signe distinctif.</p><h2>Noms masculins</h2><p>Aaleevic, Aamaneeth, Aaneet, Cloonacool, Easreth, Eemenearl, Eveearic, Faerloec, Flaanaceel, Graaranic, Heael, Heoorl, Himeen, Hoorcaaarl, Iaoween, Jaoor, Laaric, Meerscaaarl, Nyaneeth, Oorlacooth, Raoeeth, Raor, Saamaneal, Soorth, Urllaanic.</p><h2>Noms féminins</h2><p>Aaroel, Aellaarree, Aerieena, Earraa, Eeleemeena, Evearilla, Flaermeena, Flitillia, Flooressa, Galaania, Gleeemaa, Gleesinra, Haorellee, Heelestraa, Iastreena, Ieliellaa, Ifeelea, Laeesa, Lolaandrea, Loornaea, Meerceena, Nyleea, Oorea, Raoreea, Seeorea.</p>"
|
||||
},
|
||||
"Humain": {
|
||||
"name": "Humain",
|
||||
"description": "<h1>Humain</h1>\n<p> </p>"
|
||||
},
|
||||
"Kalukans": {
|
||||
"name": "Kalukans",
|
||||
"description": "<h1>Kalukans</h1><p>Les kalukans sont une race d’eunuques sans tête, qui possèdent un seul gros œil au centre de leur poitrine, derrière lequel se situe leur cerveau. Créés artificiellement par d’antiques rituels alchimiques afin de servir de gardes à leurs maîtres (notamment contre d’autres magiciens), ces êtres possèdent une force surhumaine et n’ont besoin ni de manger, ni de dormir.</p><p>Leur corps est couvert de tatouages investis d’une puissante sorcellerie qui les maintient en vie. Ils sont asexués, même s’ils possèdent des corps musclés et proportionnés comme ceux d’hommes adultes.</p><p>La Reine Sorcière de la Côte de Feu utilise des kalukans comme sentinelles dans sa forteresse, où ils veillent armés de ces grands cimeterres qui portent le nom de tulwars.</p><p>Les kalukans n’ont pas de bouche et sont donc incapables de parler, ce qui leur inflige un dé de malus dans les situations sociales où ils ont besoin de se faire comprendre. Ils ne possèdent pas non plus d’écriture, ce qui conduit certains à les prendre pour des brutes stupides.</p><p>En réalité, ils font preuve d’une grande capacité d’apprentissage et peuvent parfaitement apprendre à lire et écrire.</p><p>Tous les kalukans sont nés esclaves, les héros kalukans sont donc automatiquement esclaves pour leur première carrière, et gardes (soldats) ou ouvriers pour leur deuxième carrière. Le choix reste libre pour leurs autres carrières. Étrangement, peut-être parce qu’ils sont eux-mêmes issus d’une création alchimique, les kalukans manifestent parfois un grand talent pour la création de potions, d’objets et d’instruments quand ils ont l’occasion d’apprendre cet art. Les kalukans ne peuvent pas être ménestrels, marchands ou courtisans, et d’autres carrières leur sont également difficiles d’accès.</p><p>Tous les kalukans ont automatiquement le désavantage muet.</p><h2>Avantages</h2><p>arme favorite (tulwar), colosse, dur à cuire, intimidant, peau dure, récupération rapide, résistant à la magie, résistant aux poisons, santé de fer, sentir la magie, vigilant, vigueur céruléenne, vision nocturne.</p><h2>Désavantages</h2><p>deux mains gauches, illettré, inquiétant, maudit, pataud, signe distinctif.</p><p>D’ordinaire, les kalukans n’ont pas de nom, mais il arrive qu’ils reçoivent un surnom. Si vous jouez un héros kalukan, vous pouvez par exemple demander à un autre joueur (ou au MJ) de donner un surnom à votre personnage.</p>"
|
||||
},
|
||||
"Morgal": {
|
||||
"name": "Morgal",
|
||||
"description": "<h1>Morgal</h1><p>Les morgal sont une race de vampires buveurs de sang qui peuvent vivre pendant des siècles (et peut-être même éternellement). Ils ressemblent au départ à des humains normaux, même s’ils sont particulièrement grands et pâles de peau. Mais à mesure qu’ils prennent de l’âge, les morgal perdent progressivement leur humanité et sombrent dans la démence. La couleur de leurs yeux peut aller du rouge au violet, voire au noir le plus profond. Leurs ongles poussent à une vitesse surnaturelle et à moins qu’un morgal ne prenne soin de les couper très régulièrement, il suffit d’une semaine pour que ses mains soient griffues comme celles d’une bête. Certains érudits pensent que les morgal seraient les rejetons d’une lignée de Rois-Sorciers qui se serait séparée du reste de leur race dans un lointain passé.</p><h2>Avantages</h2><p>bibliothèque savante, dur à cuire, magie des Rois-Sorciers, perspicace, pouvoir du Néant, récupération rapide, résistant à la magie, savant, vision nocturne.</p><h2>Désavantages</h2><p>addiction, inquiétant, malédiction de Morgazzon, obsession, phobie du feu, poltron, signe distinctif.</p>"
|
||||
},
|
||||
"Rois-Sorciers": {
|
||||
"name": "Rois-Sorciers",
|
||||
"description": "<h1>Rois-Sorciers</h1><p>La race des Rois-Sorciers a dominé la Lémurie, et sans doute le monde entier, avant la venue de l’homme. Ils possédaient une force et une robustesse exceptionnelles, même s’ils n’étaient pas particulièrement des guerriers. Ils étaient en revanche très intelligents et créatifs, et maîtrisaient une puissante sorcellerie qui tirait sa force d’Hadron et des autres seigneurs du Néant.</p><p>Les Rois-Sorciers furent détruits à la bataille du gouffre d’Hyrdral. Seuls quelques-uns d’entre eux parvinrent à s’enfuir pour gagner l’île de Thulé, où leurs descendants vivraient encore de nos jours, dans la ville de Zalut, la cité des magiciens.</p><h2>Avantages</h2><p>beau parleur, bibliothèque savante, dur à cuire, magie des Rois-Sorciers, perspicace, pouvoir du Néant, récupération rapide, résistant à la magie, savant, vigueur céruléenne, vision nocturne.</p><h2>Désavantages</h2><p>addiction, arrogant, foie jaune, inquiétant, non-combattant, obsession, phobie, poltron, signe distinctif.</p><h2>Noms masculins</h2><p>Apuulluunideeszu, Kadashmasazz, Kiipluuu, Nigsummuzzugal, Niiqarquusu, Shamazzad, Shudduggaat, Shu-Thuzzul, Thusuzuu, Ugurnaszir, Vaargaxx, Xhaothigguzzar.</p><h2>Noms féminins</h2><p>Aplazza, Arishakka, Deemethresu, Labashi, Puzuri, Rihatzzi, Ripaazz, Selukzu, Utuala, Yaattirram, Yahattizzi, Zashimbra.</p>"
|
||||
},
|
||||
"Slorth": {
|
||||
"name": "Slorth",
|
||||
"description": "<h1>Slorth</h1><p>Il est presque assuré que les slorth sont une création des Rois-</p><p>Sorciers. Ces serpents à tête de femme</p><p>résident habituellement dans les déserts de Beshaar, mais on peut également les rencontrer (plus exceptionnellement) dans les plaines de Klaar. Ce sont des êtres au corps de serpent blafard (presque incolore) et putride, surmonté d’une tête de femme, belle et blanche de peau, aux dents effilées. Leur morsure est venimeuse et plonge la victime dans un profond sommeil.</p><h2>Avantages</h2><p>artiste, beau parleur, discret, fils des plaines, intimidant, odorat développé, peau dure, perspicace, renard du désert, résistant aux poisons, roi de l’évasion, vigilant, vision nocturne.</p><h2>Désavantages</h2><p>inadapté au froid, indigne de confiance, inquiétant, maudit, signe distinctif.</p><h2>Noms</h2><p>Bashaa, Demetzri, Eneshu, Giléru, Ishmè, Labashi, Memorashi, Numunia, Salishmè, Tiggarati.</p>"
|
||||
}
|
||||
}
|
||||
}
|
25
compendiums/en/bol.spells.json
Normal file
@ -0,0 +1,25 @@
|
||||
{
|
||||
"label": "Sorts",
|
||||
"mapping": {
|
||||
"description": "system.description"
|
||||
},
|
||||
|
||||
"entries": {
|
||||
"Arme Démoniaque": {
|
||||
"name": "Arme Démoniaque",
|
||||
"description": "<p>Description</p>\n<p>Permet d’animer une arme de corps à corps qui s’attaque aux ennemis du sorcier en obéissant à ses injonctions mentales.</p>\n<p>Effet</p>\n<p>Les jets d’attaque et de dégâts de l’arme sont réalisés avec l’esprit du sorcier et non son agilité et sa vigueur.</p>"
|
||||
},
|
||||
"Caresse de Zaggath": {
|
||||
"name": "Caresse de Zaggath",
|
||||
"description": "<p>Description</p>\n<p>Permet de prendre le contrôle d’une source de feu et de la faire exploser. </p>\n<p>Effet</p>\n<p>La source de feu explose dans un déluge de flammes causant d6 dégâts à tous ceux se trouvant à portée de l’explosion.</p>"
|
||||
},
|
||||
"Javelot de Methyn Sarr": {
|
||||
"name": "Javelot de Methyn Sarr",
|
||||
"description": "<p>Description</p>\n<p>Permet de projeter un javelot de flammes magiques sur la cible.</p>\n<p>Effet</p>\n<p>Le sorcier réalise un test de tir classique. En cas de réussite, le javelot inflige d6B points de dégâts. Si le résultat du dé de dégât est un 6, la cible s’enflamme.</p>"
|
||||
},
|
||||
"Mauvais Oeil": {
|
||||
"name": "Mauvais Oeil",
|
||||
"description": "<p>Description</p>\n<p>Permet d’infliger à la cible une malédiction qui affecte sa capacité d’agir.</p>\n<p>Effet</p>\n<p>La victime reçoit 1 dé malus sur tous ses jets d’action pendant la durée du sortilège. La difficulté est modifiée par l'Esprit de la cible.</p>"
|
||||
}
|
||||
}
|
||||
}
|
33
compendiums/en/bol.vehicleweapons.json
Normal file
@ -0,0 +1,33 @@
|
||||
{
|
||||
"label": "Armes de Véhicules",
|
||||
"mapping": {
|
||||
"description": "system.description"
|
||||
},
|
||||
|
||||
"entries": {
|
||||
"Abordage": {
|
||||
"name": "Abordage",
|
||||
"description": "<p>Une action d’Abordage peut être tentée si deux navires sont bloqués l’un contre l’autre suite à une action réussie d’Éperonner ou de Lancer les grappins. L’Abordage est la seule action pour laquelle il n’y a pas de limite aux points de ressources que vous pouvez engager afin d’avoir un bonus au jet d’attaque. L’Abordage est aussi l’occasion pour des héros d’entreprendre des Actions héroïques en mer, de la même façon qu’ils peuvent le faire lors de batailles terrestres. Ces actions formeront une petite aventure à part entière, par exemple si les héros doivent fouiller le navire ennemi tout en affrontant son équipage.</p>"
|
||||
},
|
||||
"Briser les Rames": {
|
||||
"name": "Briser les Rames",
|
||||
"description": "<p>Le navire attaquant frôle le navire ennemi dans le but de briser ses rangées de rames afin de<br />l’immobiliser sans le couler. Pour cette manœuvre, les navires doivent commencer le round à Bout<br />portant ou à portée Courte. L’attaquant effectue un jet d’action. Le défenseur peut utiliser ses<br />ressources pour éviter l’attaque (ce qui lui octroie un bonus en défense).</p>"
|
||||
},
|
||||
"Catapulte (Feu)": {
|
||||
"name": "Catapulte (Feu)",
|
||||
"description": "<p>Les catapultes peuvent tirer des pierres ou des pots de goudron enflammé jusqu’à une portée<br />Extrême. Les pierres font des dégâts à la coque et au gréement du navire, mais peuvent aussi<br />tuer des matelots. Un pot à feu qui explose sur le pont arrose la coque et l’équipage de goudron<br />enflammé, qui continue à brûler jusqu’à ce que l’incendie soit maîtrisé.</p>"
|
||||
},
|
||||
"Catapulte (Pierre)": {
|
||||
"name": "Catapulte (Pierre)",
|
||||
"description": "<p>Les catapultes peuvent tirer des pierres ou des pots de goudron enflammé jusqu’à une portée<br />Extrême. Les pierres font des dégâts à la coque et au gréement du navire, mais peuvent aussi<br />tuer des matelots. Un pot à feu qui explose sur le pont arrose la coque et l’équipage de goudron<br />enflammé, qui continue à brûler jusqu’à ce que l’incendie soit maîtrisé.</p>"
|
||||
},
|
||||
"Crache Feu": {
|
||||
"name": "Crache Feu",
|
||||
"description": "<p>L’usage de cet appareil d’alchimiste exige des compétences particulières. Sa conception comme<br />la formule du produit qui l’alimente sont des secrets jalousement gardés. Le crache-feu est un<br />gros réservoir pressurisé équipé d’un tube à son sommet. La machine tire un jet de liquide brûlant<br />à de grandes distances (jusqu’à portée Longue).</p>\n<p>Les flammes sont presque impossibles à éteindre.</p>"
|
||||
},
|
||||
"Projectiles": {
|
||||
"name": "Projectiles",
|
||||
"description": "<p>L’équipage du navire envoie une volée de projectiles (javelines, flèches, billes de fronde) sur le vaisseau ennemi, à condition que ce dernier se trouve au maximum à portée Longue.</p>"
|
||||
}
|
||||
}
|
||||
}
|
145
compendiums/en/bol.weapons.json
Normal file
@ -0,0 +1,145 @@
|
||||
{
|
||||
"label": "Armes",
|
||||
"mapping": {
|
||||
"description": "system.description"
|
||||
},
|
||||
|
||||
"entries": {
|
||||
"Arbalète": {
|
||||
"name": "Arbalète",
|
||||
"description": "<h1>Arbalète</h1><p>une arme de tir qui nécessite peu d’entraînement et offre beaucoup de puissance. Les lourds projectiles tirés par une arbalète portent le nom de carreaux. Il faut un round complet pour charger une arbalète.</p>"
|
||||
},
|
||||
"Arbalète lourde": {
|
||||
"name": "Arbalète lourde",
|
||||
"description": "<h1>Arbalète lourde</h1><p>plus lourde et plus puissante qu’une arbalète normale, l’arbalète lourde est peu usitée en Lémurie, sauf comme arme de siège portative. Il faut 2 rounds complets pour charger une arbalète lourde.</p>"
|
||||
},
|
||||
"Arc": {
|
||||
"name": "Arc",
|
||||
"description": "<h1>Arc</h1><p>une longue tige flexible en bois dont les extrémités sont reliées par une corde et qui permet de tirer des flèches. Il existe différentes formes d’arcs.</p>"
|
||||
},
|
||||
"Arc Ghataï": {
|
||||
"name": "Arc Ghataï",
|
||||
"description": "<p>L’arme emblématique des Ghataï est un arc composite, particulièrement adapté pour des cavaliers. Les archers de cavalerie forment le gros des forces gathaï, qui utilisent des tactiques de harcèlement plutôt que de charge frontale.</p>"
|
||||
},
|
||||
"Arme d’hast": {
|
||||
"name": "Arme d’hast",
|
||||
"description": "<h1>Arme d’hast</h1><p>ce nom recouvre une catégorie d’armes possédant toutes un fer destiné à frapper, fixé au bout d’une longue hampe en bois, qui offre à son utilisateur une grande allonge. Selon leur forme, ces armes à deux mains portent le nom de hallebarde, coutille, guisarme, vouge…</p>"
|
||||
},
|
||||
"Armes Improvisée": {
|
||||
"name": "Armes Improvisée",
|
||||
"description": ""
|
||||
},
|
||||
"Armes Improvisée (Lancer)": {
|
||||
"name": "Armes Improvisée (Lancer)",
|
||||
"description": ""
|
||||
},
|
||||
"Bâton": {
|
||||
"name": "Bâton",
|
||||
"description": "<h1>Bâton</h1><p>une longueur de bois robuste (environ 1,80 m de hauteur), qui sert aussi bien de bâton de marche que d’arme.</p>"
|
||||
},
|
||||
"Bâton-Fronde": {
|
||||
"name": "Bâton-Fronde",
|
||||
"description": "<h1>Bâton-Fronde</h1><p>Version plus puissante de la fronde, montée au bout d’un bâton (ce qui en fait une arme à deux mains), qui permet des tirs à plus longue portée.</p>"
|
||||
},
|
||||
"Cimeterre": {
|
||||
"name": "Cimeterre",
|
||||
"description": "<h1>Épée</h1><p>l’arme favorite des héros. Elle se décline en différents modèles utilisés un peu partout en Lémurie, comme les sabres d’abordage, les tulwars, les cimeterres ou les épées longues. Inscrivez le nom de l’arme que vous voulez sur la fiche de votre personnage en fonction de l’image que vous vous faites de ce dernier. Mais au final, une épée reste une longue lame utilisée pour tuer l’ennemi.</p>"
|
||||
},
|
||||
"Dague": {
|
||||
"name": "Dague",
|
||||
"description": "<h1>Dague</h1><p>cette catégorie regroupe toutes les lames courtes destinées à lacérer ou poignarder un adversaire. Les dagues sont à un ou deux tranchants selon les modèles, et peuvent être lancées aussi bien qu’utilisées au corps à corps. Facilement dissimulable, la dague est l’arme favorite des truands et des assassins.</p>"
|
||||
},
|
||||
"Dague (Lancer)": {
|
||||
"name": "Dague (Lancer)",
|
||||
"description": "<h1>Dague</h1><p>cette catégorie regroupe toutes les lames courtes destinées à lacérer ou poignarder un adversaire. Les dagues sont à un ou deux tranchants selon les modèles, et peuvent être lancées aussi bien qu’utilisées au corps à corps. Facilement dissimulable, la dague est l’arme favorite des truands et des assassins.</p>"
|
||||
},
|
||||
"Épée": {
|
||||
"name": "Épée",
|
||||
"description": "<h1>Épée</h1><p>l’arme favorite des héros. Elle se décline en différents modèles utilisés un peu partout en Lémurie, comme les sabres d’abordage, les tulwars, les cimeterres ou les épées longues. Inscrivez le nom de l’arme que vous voulez sur la fiche de votre personnage en fonction de l’image que vous vous faites de ce dernier. Mais au final, une épée reste une longue lame utilisée pour tuer l’ennemi.</p>"
|
||||
},
|
||||
"Épée à deux mains": {
|
||||
"name": "Épée à deux mains",
|
||||
"description": "<h1>Épée à deux mains</h1><p>Une lourde épée pouvant mesurer jusqu’à 1,80 m de long pour les plus grandes, et s’utilisant à deux mains. Elle peut porter différents noms selon les modèles : claymore, espadon, épée bâtarde…</p>"
|
||||
},
|
||||
"Fléau": {
|
||||
"name": "Fléau",
|
||||
"description": "<h1>Fléau</h1><p>un fléau consiste en un manche de bois prolongé d’une chaîne, à l’extrémité de laquelle est fixée une boule hérissée de pointes métalliques. Les fléaux ne sont pas des armes employées couramment en Lémurie, mais les gladiateurs en utilisent parfois dans les arènes. Les attaques au fléau ignorent le bonus en défense accordé par l’emploi d’un bouclier.</p>"
|
||||
},
|
||||
"Fléchettes": {
|
||||
"name": "Fléchettes",
|
||||
"description": "<h1>Fléchettes</h1><p>de petits projectiles ressemblant à des flèches miniatures, destinés à être lancés à la main. En général, un personnage qui utilise des fléchettes en possède un petit stock.</p>"
|
||||
},
|
||||
"Fouet": {
|
||||
"name": "Fouet",
|
||||
"description": "<p><span dir=\"ltr\" style=\"left:609.197px;top:442.965px;font-size:18.3333px;font-family:serif;transform:scaleX(0.92363)\">Outil indispensable pour des éleveurs, </span><span dir=\"ltr\" style=\"left:595.026px;top:466.304px;font-size:18.3333px;font-family:serif;transform:scaleX(0.930262)\">le fouet peut devenir une véritable arme </span><span dir=\"ltr\" style=\"left:595.026px;top:489.642px;font-size:18.3333px;font-family:serif;transform:scaleX(0.868979)\">de</span><span dir=\"ltr\" style=\"left:610.059px;top:489.642px;font-size:18.3333px;font-family:serif\"> </span><span dir=\"ltr\" style=\"left:621.719px;top:489.642px;font-size:18.3333px;font-family:serif;transform:scaleX(0.924893)\">guerre</span><span dir=\"ltr\" style=\"left:665.004px;top:489.642px;font-size:18.3333px;font-family:serif\"> </span><span dir=\"ltr\" style=\"left:676.664px;top:489.642px;font-size:18.3333px;font-family:serif;transform:scaleX(0.954368)\">entre</span><span dir=\"ltr\" style=\"left:711.626px;top:489.642px;font-size:18.3333px;font-family:serif\"> </span><span dir=\"ltr\" style=\"left:723.286px;top:489.642px;font-size:18.3333px;font-family:serif;transform:scaleX(0.83588)\">des</span><span dir=\"ltr\" style=\"left:743.709px;top:489.642px;font-size:18.3333px;font-family:serif\"> </span><span dir=\"ltr\" style=\"left:755.369px;top:489.642px;font-size:18.3333px;font-family:serif;transform:scaleX(0.956849)\">mains</span><span dir=\"ltr\" style=\"left:797.279px;top:489.642px;font-size:18.3333px;font-family:serif\"> </span><span dir=\"ltr\" style=\"left:808.939px;top:489.642px;font-size:18.3333px;font-family:serif;transform:scaleX(0.889718)\">expertes. </span><span dir=\"ltr\" style=\"left:595.026px;top:512.98px;font-size:18.3333px;font-family:serif;transform:scaleX(0.955811)\">Certains cavaliers ghataï s’en sont fait </span><span dir=\"ltr\" style=\"left:595.026px;top:536.319px;font-size:18.3333px;font-family:serif;transform:scaleX(0.901031)\">une spécialité.</span></p>"
|
||||
},
|
||||
"Fronde": {
|
||||
"name": "Fronde",
|
||||
"description": "<h1>Fronde</h1><p>simple pièce de cuir équipée de lanières, une fronde permet de projeter de petites pierres ou des billes de plomb avec une certaine force. C’est une arme peu coûteuse et facile à fabriquer. Il existe une version plus puissante, montée au bout d’un bâton (ce qui en fait une arme à deux mains), qui permet des tirs à plus longue portée.</p>"
|
||||
},
|
||||
"Gourdin": {
|
||||
"name": "Gourdin",
|
||||
"description": "<h1>Gourdin</h1><p>c’est l’arme la plus rudimentaire qui soit. Un gourdin consiste généralement en un bâton de bois noueux, extrêmement dur et mesurant moins de 90 cm de long. Par commodité, on regroupe sous ce terme toute autre arme contondante du même genre (matraque, etc.). Il est possible d’utiliser un gourdin pour infliger des dégâts non létaux et assommer son ennemi plutôt que de le tuer.</p>"
|
||||
},
|
||||
"Gourdin Clouté": {
|
||||
"name": "Gourdin Clouté",
|
||||
"description": "<h1>Gourdin</h1><p>c’est l’arme la plus rudimentaire qui soit. Un gourdin consiste généralement en un bâton de bois noueux, extrêmement dur et mesurant moins de 90 cm de long. Par commodité, on regroupe sous ce terme toute autre arme contondante du même genre (matraque, etc.). Il est possible d’utiliser un gourdin pour infliger des dégâts non létaux et assommer son ennemi plutôt que de le tuer.</p>"
|
||||
},
|
||||
"Hache": {
|
||||
"name": "Hache",
|
||||
"description": "<h1>Hache</h1><p>un fer à un ou deux tranchants (qui peut être en bronze, en fer ou en acier) monté sur un manche en bois.</p>"
|
||||
},
|
||||
"Hache (Lancer)": {
|
||||
"name": "Hache (Lancer)",
|
||||
"description": "<h1>Hache</h1><p>un fer à un ou deux tranchants (qui peut être en bronze, en fer ou en acier) monté sur un manche en bois.</p>"
|
||||
},
|
||||
"Hâche à deux mains": {
|
||||
"name": "Hâche à deux mains",
|
||||
"description": "<h1>Hâche à deux mains</h1><p>Une lourde hache s’utilisant à deux mains.</p>"
|
||||
},
|
||||
"Javelot": {
|
||||
"name": "Javelot",
|
||||
"description": "<h1>Javelot</h1><p>une arme de jet constituée d’une courte hampe surmontée d’une tête pointue. En général, un guerrier qui utilise le javelot en emporte deux ou trois avec lui. Cette arme a la faveur des hommes-oiseaux de l’Axos.</p>"
|
||||
},
|
||||
"Kriss": {
|
||||
"name": "Kriss",
|
||||
"description": "<h1>Dague</h1><p>cette catégorie regroupe toutes les lames courtes destinées à lacérer ou poignarder un adversaire. Les dagues sont à un ou deux tranchants selon les modèles, et peuvent être lancées aussi bien qu’utilisées au corps à corps. Facilement dissimulable, la dague est l’arme favorite des truands et des assassins.</p>"
|
||||
},
|
||||
"Lance": {
|
||||
"name": "Lance",
|
||||
"description": "<h1>Lance</h1><p>une hampe de bois de 1,80 m de long (parfois davantage), pourvue d’une pointe, qui peut être lancée ou utilisée au corps à corps, notamment contre des adversaires montés.</p>"
|
||||
},
|
||||
"Lance (Lancer)": {
|
||||
"name": "Lance (Lancer)",
|
||||
"description": "<h1>Lance</h1><p>une hampe de bois de 1,80 m de long (parfois davantage), pourvue d’une pointe, qui peut être lancée ou utilisée au corps à corps, notamment contre des adversaires montés.</p>"
|
||||
},
|
||||
"Mains Nues": {
|
||||
"name": "Mains Nues",
|
||||
"description": ""
|
||||
},
|
||||
"Masse d’armes": {
|
||||
"name": "Masse d’armes",
|
||||
"description": "<h1>Masse d’armes</h1><p>cette arme a la même forme qu’un gourdin, mais possède une tête en métal, souvent agrémentée de pointes ou d’ailettes pour plus d’efficacité. Les masses d’armes à une main peuvent se lancer, mais à courte distance, car elles ne sont pas vraiment prévues pour cet usage.</p>"
|
||||
},
|
||||
"Masse d’armes (Lancer)": {
|
||||
"name": "Masse d’armes (Lancer)",
|
||||
"description": "<h1>Masse d’armes</h1><p>cette arme a la même forme qu’un gourdin, mais possède une tête en métal, souvent agrémentée de pointes ou d’ailettes pour plus d’efficacité. Les masses d’armes à une main peuvent se lancer, mais à courte distance, car elles ne sont pas vraiment prévues pour cet usage.</p>"
|
||||
},
|
||||
"Massue": {
|
||||
"name": "Massue",
|
||||
"description": "<h1>Massue</h1><p>la version lourde du gourdin. Une massue consiste en un solide manche en bois dont l’extrémité, plus volumineuse, sert à fracasser le crâne de ses adversaires, d’où son autre nom de casse-tête.</p>"
|
||||
},
|
||||
"Massue (Lancer)": {
|
||||
"name": "Massue (Lancer)",
|
||||
"description": "<h1>Massue</h1><p>la version lourde du gourdin. Une massue consiste en un solide manche en bois dont l’extrémité, plus volumineuse, sert à fracasser le crâne de ses adversaires, d’où son autre nom de casse-tête.</p>"
|
||||
},
|
||||
"Morgenstern": {
|
||||
"name": "Morgenstern",
|
||||
"description": "<h1>Morgenstern</h1><p>une grosse boule de métal hérissée de pointes, montée à l’extrémité d’une longue hampe de 1,20 à 1,50 m de long. Rudimentaire, mais efficace.</p>"
|
||||
},
|
||||
"Rapière": {
|
||||
"name": "Rapière",
|
||||
"description": "<h1>Rapière</h1><p>cette épée fine et légère est essentiellement utilisée par les bellâtres et les courtisans des cités-états de Lémurie, chez qui l’escrime a été élevé au rang d’art. La rapière s’utilise généralement en conjonction avec une dague de parade (aussi appelée main gauche), un petit bouclier, ou une simple cape roulée en boule.</p>"
|
||||
}
|
||||
}
|
||||
}
|
76
css/bol.css
@ -1,7 +1,6 @@
|
||||
/* ----------------------------------------- */
|
||||
/* LOCAL FONTS */
|
||||
/* ----------------------------------------- */
|
||||
@import "../node_modules/rpg-awesome/css/rpg-awesome.min.css";
|
||||
@font-face {
|
||||
font-family: 'Contrail One';
|
||||
font-style: normal;
|
||||
@ -59,8 +58,6 @@ a:hover {
|
||||
top: -50px;
|
||||
left: calc(50% - 100px);
|
||||
opacity: 0.7;
|
||||
-webkit-animation: rotation 10s infinite linear;
|
||||
animation: rotation 10s infinite linear;
|
||||
}
|
||||
#pause h3 {
|
||||
font-family: "IMFellDWPicaSC-Regular", serif;
|
||||
@ -389,16 +386,16 @@ ul.no-bullets {
|
||||
background-color: lightgray;
|
||||
}
|
||||
.bol h1.form-header {
|
||||
font-size: 2.5em;
|
||||
font-size: 2.2em;
|
||||
font-weight: 700;
|
||||
}
|
||||
.bol h2.form-header {
|
||||
font-size: 2em;
|
||||
font-size: 1.8em;
|
||||
font-weight: 500;
|
||||
border-bottom: 1px groove #eeede0;
|
||||
}
|
||||
.bol h3.form-header {
|
||||
font-size: 1.5em;
|
||||
font-size: 1.2em;
|
||||
font-weight: 500;
|
||||
border-bottom: 1px groove #eeede0;
|
||||
}
|
||||
@ -444,12 +441,16 @@ ul.no-bullets {
|
||||
.bol .inc-dec-btns {
|
||||
color: #4b4a44;
|
||||
}
|
||||
.summmary-number {
|
||||
padding-left: 4rem;
|
||||
}
|
||||
/* Items List */
|
||||
.items-list {
|
||||
list-style: none;
|
||||
margin: 7px 0;
|
||||
padding: 0;
|
||||
overflow-y: auto;
|
||||
overflow-y:hidden;
|
||||
/*overflow-y: auto;*/
|
||||
}
|
||||
.items-list .item-header {
|
||||
font-family: 'Signika', sans-serif;
|
||||
@ -520,6 +521,18 @@ ul.no-bullets {
|
||||
.items-list .item .item-control {
|
||||
color: #4b4a44;
|
||||
}
|
||||
.items-list .item-name-fixed-medium {
|
||||
min-width: 8rem;
|
||||
width: 8rem;
|
||||
}
|
||||
.items-list .item-field-fixed-short {
|
||||
max-width: 3rem;
|
||||
min-width: 3rem;
|
||||
width: 3rem;
|
||||
}
|
||||
.bougette-dice-img {
|
||||
color:rgba(150, 44, 44, 0.70);
|
||||
}
|
||||
|
||||
/* ----------------------------------------- */
|
||||
/* Premade colors */
|
||||
@ -769,7 +782,7 @@ body.system-bol img#logo {
|
||||
min-height: 700px;
|
||||
height: 700px;
|
||||
}
|
||||
.bol.sheet.actor .window-content form {
|
||||
.bol.sheet.actor .window-content .bol-actor-form {
|
||||
background-image: url("/systems/bol/ui/logo.webp");
|
||||
background-repeat: no-repeat;
|
||||
background-size: 190px 115px;
|
||||
@ -790,6 +803,18 @@ body.system-bol img#logo {
|
||||
max-width: calc(250px - 10px);
|
||||
margin-right: 10px;
|
||||
}
|
||||
.sheet-profile-img {
|
||||
cursor: pointer;
|
||||
border: none;
|
||||
background-color: #EEE;
|
||||
height: auto;
|
||||
width: 96px;
|
||||
height: 96px;
|
||||
min-width: 96px;
|
||||
min-height: 96px;
|
||||
max-width: 96px;
|
||||
margin-right: 10px;
|
||||
}
|
||||
.bol.sheet.actor .window-content form .main .sheet-body {
|
||||
overflow: hidden;
|
||||
}
|
||||
@ -924,6 +949,7 @@ body.system-bol img#logo {
|
||||
min-height: 400px;
|
||||
}
|
||||
.bol.sheet.item h1 input.itemname {
|
||||
margin-top: 32px;
|
||||
font-family: "Wolfsbane2Expanded", cursive;
|
||||
}
|
||||
.bol.sheet.item .item-properties {
|
||||
@ -1024,15 +1050,25 @@ body.system-bol img#logo {
|
||||
flex-direction: column;
|
||||
position: absolute;
|
||||
top: 2.75rem;
|
||||
right: 4rem;
|
||||
right: 16rem;
|
||||
}
|
||||
.tokenhudext.right {
|
||||
justify-content: flex-start;
|
||||
flex-direction: column;
|
||||
position: absolute;
|
||||
top: 2.75rem;
|
||||
/*transform: translate(0, -30%);*/
|
||||
top: -4rem;
|
||||
max-width: 250px;
|
||||
left: 4rem;
|
||||
}
|
||||
.tokenhudext.right2 {
|
||||
justify-content: flex-start;
|
||||
flex-direction: column;
|
||||
/*transform: translate(0, -30%);*/
|
||||
position: absolute;
|
||||
top: -4rem;
|
||||
left: 11rem;
|
||||
}
|
||||
.control-icon.tokenhudicon {
|
||||
width: fit-content;
|
||||
height: fit-content;
|
||||
@ -1049,5 +1085,23 @@ body.system-bol img#logo {
|
||||
z-index: 2;
|
||||
}
|
||||
.bol-hud-menu label {
|
||||
font-size: 0.75rem;
|
||||
font-size: 0.6rem;
|
||||
}
|
||||
.bol-margin-tb-2 {
|
||||
margin-top: 2px;
|
||||
margin-bottom: 2px;
|
||||
}
|
||||
.character-summary-container {
|
||||
opacity: 0.95;
|
||||
}
|
||||
.character-summary-rollable {
|
||||
text-decoration: underline;
|
||||
}
|
||||
.activated-green {
|
||||
color: darkgreen;
|
||||
}
|
||||
|
||||
/* Hide compendium background image */
|
||||
.compendium-sidebar .directory-item.compendium.locked .compendium-banner {
|
||||
opacity: 00;
|
||||
}
|
||||
|
4
images/.directory
Normal file
@ -0,0 +1,4 @@
|
||||
[Dolphin]
|
||||
Timestamp=2022,7,17,14,58,4.757
|
||||
Version=4
|
||||
VisibleRoles=Details_text,Details_size,Details_modificationtime,Details_creationtime,CustomizedDetails
|
Before Width: | Height: | Size: 372 KiB |
34
lang/de.json
@ -156,6 +156,8 @@
|
||||
"BOL.ui.armorAgiMalus": "Rüschtung+Schild-Malus (Geschick)",
|
||||
"BOL.ui.armorInitMalus": "Rüstungsmalus (Init)",
|
||||
"BOL.ui.attackValue": "Angriffswert",
|
||||
"BOL.ui.initMalus": "Init malus",
|
||||
"BOL.ui.createEquipment": "Create Equipment",
|
||||
|
||||
"BOL.featureCategory.origins": "Herkünfte",
|
||||
"BOL.featureCategory.races": "Rassen",
|
||||
@ -354,6 +356,16 @@
|
||||
"BOL.vehicleCategory.boat" : "Schiff",
|
||||
"BOL.vehicleCategory.other" : "Anderes",
|
||||
|
||||
"BOL.ui.astrologerPoints": "Points d'Astrologie",
|
||||
"BOL.ui.astrologerPointsLabel": "Points d'Astrologie actuels",
|
||||
"BOL.ui.ishoroscopemajor": "Horoscope Majeur (ie de groupe) ?",
|
||||
"BOL.ui.answer": "Réponse",
|
||||
"BOL.ui.horoscopefavorable": "Favorable (1dB)",
|
||||
"BOL.ui.horoscopeunfavorable": "Défavorable (1dM)",
|
||||
"BOL.ui.horoscopes": "Horoscopes",
|
||||
"BOL.ui.horoscopesBonus": "Horoscopes (Bonus)",
|
||||
"BOL.ui.horoscopesMalus": "Horoscopes (Malus)",
|
||||
"BOL.ui.groupHoroscope": "Horoscrope de Groupe de ",
|
||||
|
||||
"BOL.range.PointBlank": "Direkt",
|
||||
"BOL.range.Short": "Kurz",
|
||||
@ -454,5 +466,25 @@
|
||||
"BOL.chat.welcome2": "Zum Spielen werden zwingend die passenden BoL Bücher benötigt. Die französischen Originalbücher für dieses System gibt es hier: http://www.ludospherik.fr/content/14-barbarians-of-lemuria<br>Die deutsche Übersetzung gibt es bei Truant Spiele: https://truant.com/produkt/barbarians-of-lemuria-2",
|
||||
"BOL.chat.welcome3": "Die enthaltenen Karten wurden von Guillaume Tavernier und Ludospherik zur Verfügung gestellt. Vielen Dank dafür!",
|
||||
"BOL.chat.welcome4": "Im Discord findet ihr Support für die FoundryVTT-Implementierung dieses Systems: https://discord.gg/pPSDNJk",
|
||||
"BOL.chat.welcome5": "Auf ein gutes Spiel in Lemuria!"
|
||||
"BOL.chat.welcome5": "Auf ein gutes Spiel in Lemuria!",
|
||||
"BOL.chat.welcome6": "",
|
||||
|
||||
"BOL.settings.rollArmor": "Roll for armor",
|
||||
"BOL.settings.rollArmorTooltip": "Roll for armor value, fixed value if unchecked",
|
||||
"BOL.settings.useBougette": "Use Bougette (fan-made French rule)",
|
||||
"BOL.settings.useBougetteTooltip": "Use the Bougette value, as described in Annales Lemurienne from LeRatierBretonnien (https://www.lahiette.com/leratierbretonnien/)",
|
||||
"BOL.settings.removeDead": "Automatically remove dead NPCs by end of the round",
|
||||
"BOL.settings.removeDeadTooltip": "Remove NPCs Automatically when HP are 0 or less, at the end of each round",
|
||||
"BOL.settings.diceFormula": "Dice Formula",
|
||||
"BOL.settings.diceFormulaTooltip": "Main dice formula (2d6 per default)",
|
||||
"BOL.settings.diceSuccessValue" : "Success value",
|
||||
"BOL.settings.diceSuccessValueTooltip": "Value of the success threshold (9 per default for 2d6)",
|
||||
"BOL.settings.diceCriticalValue" : "Critical success value",
|
||||
"BOL.settings.diceCriticalValueTooltip": "Minimum value for critical success (12 per default for 2d6)",
|
||||
"BOL.settings.diceCriticalFailure" : "Critical failure value",
|
||||
"BOL.settings.diceCriticalFailureTooltip": "Maximum value for critical failure (2 per default for 2d6)",
|
||||
"BOL.settings.defaultLogoActorSheetPath" : "Path for Actor sheet logo",
|
||||
"BOL.settings.defaultLogoPathActorSheetTooltip": "Path of the Actor sheet logo (346 x 200, default : /systems/bol/ui/logo.webp)",
|
||||
"BOL.settings.defaultLogoTopLeftPath" : "Path for main top left logo",
|
||||
"BOL.settings.defaultLogoTopLeftPathTooltip": "Path of the logo in the top left window (718 x 416, default : /systems/bol/ui/logo2.webp)"
|
||||
}
|
||||
|
168
lang/en.json
@ -1,13 +1,22 @@
|
||||
{
|
||||
"ACTOR.TypeCharacter": "Character",
|
||||
"ACTOR.TypeEncounter": "Encounter",
|
||||
"ITEM.TypeItem": "Item",
|
||||
"ITEM.TypeFeature": "Feature",
|
||||
"ITEM.TypeWeapon": "Weapon",
|
||||
"ITEM.TypeArmor": "Armor",
|
||||
"TYPES": {
|
||||
"Actor": {
|
||||
"character": "PC",
|
||||
"encounter": "NPC",
|
||||
"npc": "NPC",
|
||||
"vehicle": "Vehicle",
|
||||
"horde": "Horde"
|
||||
},
|
||||
"Item": {
|
||||
"item": "Object",
|
||||
"feature": "Trait",
|
||||
"weapon": "Weapon",
|
||||
"armure": "Armor"
|
||||
}
|
||||
},
|
||||
|
||||
"BOL.attributes.vigor": "Vigor",
|
||||
"BOL.attributes.halfvigor" : "Half-Vigor",
|
||||
"BOL.attributes.vigor": "Strength",
|
||||
"BOL.attributes.halfvigor" : "Half-Strength",
|
||||
"BOL.attributes.agility": "Agility",
|
||||
"BOL.attributes.mind": "Mind",
|
||||
"BOL.attributes.appeal": "Appeal",
|
||||
@ -33,7 +42,22 @@
|
||||
"BOL.ui.tab.description": "Description",
|
||||
"BOL.ui.tab.details": "Details",
|
||||
"BOL.ui.tab.spellalchemy": "Spells & Alchemy",
|
||||
"BOL.ui.tab.astrologer": "Astrologer",
|
||||
|
||||
"BOL.ui.astrologerPoints": "Points d'Astrologie",
|
||||
"BOL.ui.astrologerPointsLabel": "Points d'Astrologie actuels",
|
||||
"BOL.ui.ishoroscopemajor": "Horoscope Majeur (ie de groupe) ?",
|
||||
"BOL.ui.answer": "Réponse",
|
||||
"BOL.ui.horoscopefavorable": "Favorable (1dB)",
|
||||
"BOL.ui.horoscopeunfavorable": "Défavorable (1dM)",
|
||||
"BOL.ui.horoscopes": "Horoscopes",
|
||||
"BOL.ui.horoscopesBonus": "Horoscopes (Bonus)",
|
||||
"BOL.ui.horoscopesMalus": "Horoscopes (Malus)",
|
||||
"BOL.ui.groupHoroscope": "Horoscrope de Groupe de ",
|
||||
|
||||
"BOL.ui.rabble": "Rabble",
|
||||
"BOL.ui.tough": "Tough",
|
||||
"BOL.ui.villain": "Villain",
|
||||
"BOL.ui.properties": "Properties",
|
||||
"BOL.ui.description": "Description",
|
||||
"BOL.ui.actions": "Actions",
|
||||
@ -115,6 +139,7 @@
|
||||
"BOL.ui.isSorcerer": "Is Sorcerer ?",
|
||||
"BOL.ui.isAlchemist": "Is Alchemist ?",
|
||||
"BOL.ui.isPriest": "Is Priest/Druid ?",
|
||||
"BOL.ui.isAstrologer": "Is Astrologer?",
|
||||
"BOL.ui.circle": "Circle",
|
||||
"BOL.ui.spells": "Spells",
|
||||
"BOL.ui.focusSpell": "Cast a spell",
|
||||
@ -151,6 +176,57 @@
|
||||
"BOL.ui.armorAgiMalus": "Armor+Shield Modifier (Agi)",
|
||||
"BOL.ui.armorInitMalus": "Armor Modifier (Init)",
|
||||
"BOL.ui.attackValue": "Attack Value",
|
||||
"BOL.ui.attackModifier": "Attack Modifier",
|
||||
"BOL.ui.weaponbonus": "Cette arme bénéficie déja d'un Dé de Bonus (Arme Favorite prise en compte, par exemple)",
|
||||
"BOL.ui.initMalus": "Init malus",
|
||||
"BOL.ui.creature": "Creature",
|
||||
"BOL.ui.undead": "Undead",
|
||||
"BOL.ui.daemon": "Daemon",
|
||||
"BOL.ui.attributaptitude": "Attribut ou Aptitude",
|
||||
"BOL.ui.always": "Tout les jets (ie toujours)",
|
||||
"BOL.ui.effectbonusmalus": "Bonus ou Malus à appliquer",
|
||||
"BOL.ui.boleffects": "Effects (automatic)",
|
||||
"BOL.ui.modifier": "Modifier",
|
||||
"BOL.ui.effects": "Ongoing effects",
|
||||
"BOL.ui.pcname": "PCs",
|
||||
"BOL.ui.npcname": "NPCs",
|
||||
"BOL.ui.pclistbutton": "Compact view",
|
||||
"BOL.ui.noactorfound": "Unknown NPC. The NPC must be known in the world to be displayed here.",
|
||||
"BOL.ui.deletetitle": "Delete",
|
||||
"BOL.ui.confirmdelete": "Are you sure to delete this item ?",
|
||||
"BOL.ui.nomorealchemypoints": "No more Creation Point !",
|
||||
"BOL.ui.armornoformula": "The Armor {protect.name} has no protection formula !",
|
||||
"BOL.ui.selectactor": "Select the actors to apply the macro",
|
||||
"BOL.ui.itemnotfound": "Impossible to find the object of this macro",
|
||||
"BOL.ui.noinit": "No initiative recorded. Roll initiative from the actor's sheet.",
|
||||
"BOL.ui.warninitiative": "No available initiative. Roll Initiative for this combat.",
|
||||
"BOL.ui.isspecial": "Special ?",
|
||||
"BOL.ui.createEquipment": "Create an equipment",
|
||||
"BOL.ui.astrology": "Astrology and Horoscope",
|
||||
"BOL.ui.astrologyMinor": "Build a Minor Horoscope",
|
||||
"BOL.ui.astrologyMajor": "Build a Major Horoscope",
|
||||
"BOL.ui.astrologyMajorGroup": "Build a Major Group Horoscope",
|
||||
"BOL.ui.makeHoroscope": "Build a Horoscope",
|
||||
"BOL.ui.astrologerRank": "Astrologer Rank",
|
||||
"BOL.ui.horoscopeCost": "Astrology Points cost",
|
||||
"BOL.ui.minor": "Minor",
|
||||
"BOL.ui.major": "Major",
|
||||
"BOL.ui.majorgroup": "Group Major",
|
||||
"BOL.ui.horoscopeGroup": "Group Horoscope",
|
||||
"BOL.ui.horoscopeDiceRemaining": "Remaining Dice",
|
||||
"BOL.ui.horoscopeDiceMax": "Max Dice",
|
||||
"BOL.ui.astrologyNoPoints": "You do not have enough Astrology Points!",
|
||||
"BOL.ui.newEquipment": "New equipment",
|
||||
"BOL.ui.newNaturalWeapon": "Natural weapon",
|
||||
"BOL.ui.newNaturalProtection": "Natural protection",
|
||||
"BOL.ui.createNaturalWeapon": "Create a natural weapon",
|
||||
"BOL.ui.createNaturalProtection": "Create a natural protection",
|
||||
"BOL.ui.hordeSize": "Horde size",
|
||||
"BOL.ui.hordeAttack": "Horde attack",
|
||||
"BOL.ui.hordeName": "Name of the Horde",
|
||||
"BOL.ui.criticallegend": "Legendary Success",
|
||||
"BOL.ui.hordeHP": "Horde Vitality (1 member)",
|
||||
"BOL.ui.hordehp": "Horde Vitality (total)",
|
||||
|
||||
"BOL.featureCategory.origins": "Origins",
|
||||
"BOL.featureCategory.races": "Races",
|
||||
@ -168,6 +244,11 @@
|
||||
"BOL.featureSubtypes.language": "Language",
|
||||
"BOL.featureSubtypes.gods": "Faith & Gods",
|
||||
"BOL.featureSubtypes.fightOption": "Combat Option",
|
||||
"BOL.featureSubtypes.effect": "Effect",
|
||||
"BOL.featureSubtypes.effects": "Effects",
|
||||
"BOL.featureSubtypes.boleffect": "Effect",
|
||||
"BOL.featureSubtypes.horoscope": "Horoscope",
|
||||
"BOL.featureSubtypes.xplog": "XP Journal",
|
||||
|
||||
"BOL.bougette.nomoney": "Nothing",
|
||||
"BOL.bougette.tolive": "To live",
|
||||
@ -182,6 +263,7 @@
|
||||
"BOL.fightOptionTypes.fulldefense": "Full Defense",
|
||||
"BOL.fightOptionTypes.defense": "Defensive Posture",
|
||||
"BOL.fightOptionTypes.attack": "Offensive Posture",
|
||||
"BOL.fightOptionTypes.other": "Other",
|
||||
|
||||
"BOL.itemCategory.object": "Object",
|
||||
"BOL.itemCategory.equipment": "Equipment",
|
||||
@ -191,6 +273,7 @@
|
||||
"BOL.itemCategory.other": "Other",
|
||||
"BOL.itemCategory.capacity" : "Capacity",
|
||||
"BOL.itemCategory.alchemy": "Alchemy",
|
||||
"BOL.itemCategory.vehicleweapon": "Vehicle weapon",
|
||||
|
||||
"BOL.combatCategory.protections": "Protections",
|
||||
"BOL.combatCategory.shields": "Shields",
|
||||
@ -390,11 +473,14 @@
|
||||
"BOL.chat.rolldamage": "Roll for damages",
|
||||
"BOL.chat.rolldamage6": "Roll for damages +6",
|
||||
"BOL.chat.rolldamage12": "Roll for damages +12 (1 HP)",
|
||||
"BOL.chat.rolldamage12Legend": "Roll for damages +12",
|
||||
"BOL.chat.damageresult": "Damages of {name} : {total}",
|
||||
"BOL.chat.damagetarget": "Target : {target}",
|
||||
"BOL.chat.applydamagetotarget": "Apply damages to the target",
|
||||
"BOL.chat.fightoption": "Combat options",
|
||||
"BOL.chat.reroll": "Reroll (1 HP)",
|
||||
"BOL.chat.heroicreminder": "In addition of the actions below, you can : <ul><li>Carnage : Do a second free attack on the same opponent</li><li>Precise : 1 Malus Die on your opponent on a chosen location</li><li>Disarm</li><li>Rabble Massacre</li><li>Prone : Push your opponent on the ground (max +1 size)</li></ul>If you spent 1 Hero Point in addition, all these effects can be doubled.",
|
||||
"BOL.chat.legendaryreminder": "In addition of the actions below, you can twice the following actions: <ul><li>Carnage : Do a second free attack on the same opponent</li><li>Precise : 1 Malus Die on your opponent on a chosen location</li><li>Disarm</li><li>Rabble Massacre</li><li>Prone : Push your opponent on the ground (max +1 size)</li></ul>",
|
||||
"BOL.chat.toheroic": "Convert to Mighty success (1 HP)",
|
||||
"BOL.chat.tolegend": "Convert to Legendary succes (1 HP)",
|
||||
"BOL.chat.hurttitle": "{name} is going to receive {damageTotal} damages !",
|
||||
@ -412,6 +498,51 @@
|
||||
"BOL.chat.spell": "Spell",
|
||||
"BOL.chat.spellcost": "Power Points cost",
|
||||
"BOL.chat.spellremaining": "Remaining Power Points",
|
||||
"BOL.chat.nodamagesummary": "No damage ....",
|
||||
"BOL.chat.damageresume": "{name} as taken wounds ...",
|
||||
"BOL.chat.fumblemessage": "If you accept the consequences of a fumble (GM choice), you can get 1 additionnal Hero Point.",
|
||||
"BOL.chat.rangeinfo": "Range/Throw of {attackerName} to {defenderName}",
|
||||
"BOL.chat.rangeweaponinfo": "Weapon : {weaponName} - Base range {weaponRange}",
|
||||
"BOL.chat.rangeout": "Modifier : Out of range",
|
||||
"BOL.chat.range0": "Modifier : Point blank (+1)",
|
||||
"BOL.chat.range1": "Modifier : Short Range (0)",
|
||||
"BOL.chat.range2": "Modifier : Middle Range (-1)",
|
||||
"BOL.chat.range3": "Modifier : Long Range (-2)",
|
||||
"BOL.chat.range4": "Modifier : Very Long Range (-4)",
|
||||
"BOL.chat.range5": "Modifier : Extrem Range (-6)",
|
||||
"BOL.chat.range6": "Modifier : Max Range (-8)",
|
||||
"BOL.chat.rangeprefix": "Evaluated distance : ",
|
||||
"BOL.chat.rangevisible": "Line of sight is cleared between tokens.",
|
||||
"BOL.chat.rangenotvisible": "Line of sight is blocked between tokens.",
|
||||
"BOL.chat.rangetitle": "GM Information",
|
||||
"BOL.chat.weaponreroll1": "As a reminder, this weapon re-roll 1 whend rolling for damage.",
|
||||
"BOL.chat.rollbougette": "Budget roll",
|
||||
"BOL.chat.bougettesuccess": "Your budget remains unchanged !",
|
||||
"BOL.chat.bougettefailure": "You spent too much money, your budget is going down by one level...",
|
||||
"BOL.chat.initiative": "Initiative rank (10 to 1)",
|
||||
"BOL.chat.horoscope": "Horoscope",
|
||||
"BOL.chat.horoscopepoints": "Cost : {points} Astrology Points",
|
||||
"BOL.chat.horoscopeminorsuccess": "Your minor horoscope is a success : change the horoscope name in your sheet. You will benefit of 1 Bonus Die for the given situation.",
|
||||
"BOL.chat.horoscopeminorfailure": "Your minor horoscope mineur isa failure : change the horoscope name in your sheet. Vous will suffer 1 Malus Die for the given situation.",
|
||||
"BOL.chat.horoscopemajorsuccess": "Your major horoscope is a success : {horoscopeName} gets 1 new Hero Point for this adventure. This point has been automatically added.",
|
||||
"BOL.chat.horoscopemajorfailure": "Your major horoscope is a failure : {horoscopeName} looses 1 Hero Point for this adventure. This point has been automatically substracted.",
|
||||
"BOL.chat.horoscopemajorgroupsuccess": "Your major group horoscope majeur is a success. Your and your party gets {careerBonus} Bonus Dice during this adventure.",
|
||||
"BOL.chat.horoscopemajorgroupfailure": "Your major group horoscope is a failure. You and your party suffers {careerBonus} Malus Dice durig this adventure.",
|
||||
"BOL.chat.usedhoroscope": "Horoscope has been used",
|
||||
"BOL.chat.horoscopedeleted": "The Horoscopes used are deleted automatically.",
|
||||
"BOL.chat.criticaloptions": "Critical success !! You can (select 1 option) :",
|
||||
"BOL.chat.criticalcarnage": "Dual attack : you gain 1 free attack. This second attack can't benefit from a Hero/Villain Point.",
|
||||
"BOL.chat.criticalplus6": "Devastating : damage +6 aux dommages (cf button below).",
|
||||
"BOL.chat.criticalprecise": "Precise : You hit to harm your opponent. Describe what your are doing, and if the GM agree, your opponent will suffer 1 Malus Die for the relevant actions.",
|
||||
"BOL.chat.criticalunarm": "Disarm : Si your opponnent has a weapon in hand, you disarm him.",
|
||||
"BOL.chat.criticalrabble": "Rabble Massacre : If you fight against rabble, damages results indicate the amount of rabble you kill.",
|
||||
"BOL.chat.criticalpush": "Prone : If the size allow it, you push your opponent on the ground. He suffer 1 Malus Die for all his actions during the next round.",
|
||||
"BOL.chat.criticalup": "Transform to Legendary : If you spent 1 Hero Point/Villain, you can transform this Heroic success into a Legendary success.You can the choose 2 options in this list above.",
|
||||
"BOL.chat.criticalinfo": "This is an Heroic success ! Choose your options and effects !",
|
||||
"BOL.chat.criticallegendaryinfo": "This is a Legendary succes ! Choisissez vos options et effets !",
|
||||
"BOL.chat.criticalbuttonjournal": "Legendary/Heroic Success",
|
||||
"BOL.chat.nodamage": "Do not apply damages",
|
||||
"BOL.chat.armorRoll": "Armor roll",
|
||||
|
||||
"BOL.dialog.soeasy": "So easy (+4)",
|
||||
"BOL.dialog.veryeasy": "Very easy (+2)",
|
||||
@ -450,6 +581,25 @@
|
||||
"BOL.chat.welcome2": "Books are necessary to play, and ca be found here : http://www.ludospherik.fr/content/14-barbarians-of-lemuria",
|
||||
"BOL.chat.welcome3": "The integrated maps are authorized by Guillaume Tavernier and Ludospherik. Thanks to them !.",
|
||||
"BOL.chat.welcome4": "All support for this system is available on this Discord server : https://discord.gg/pPSDNJk",
|
||||
"BOL.chat.welcome5": "Good game in Lemuria !"
|
||||
"BOL.chat.welcome5": "Good game in Lemuria !",
|
||||
"BOL.chat.welcome6": "",
|
||||
|
||||
"BOL.settings.rollArmor": "Roll for armor",
|
||||
"BOL.settings.rollArmorTooltip": "Roll for armor value, fixed value if unchecked",
|
||||
"BOL.settings.useBougette": "Use Bougette (fan-made French rule)",
|
||||
"BOL.settings.useBougetteTooltip": "Use the Bougette value, as described in Annales Lemurienne from LeRatierBretonnien (https://www.lahiette.com/leratierbretonnien/)",
|
||||
"BOL.settings.removeDead": "Automatically remove dead NPCs by end of the round",
|
||||
"BOL.settings.removeDeadTooltip": "Remove NPCs Automatically when HP are 0 or less, at the end of each round",
|
||||
"BOL.settings.diceFormula": "Dice Formula",
|
||||
"BOL.settings.diceFormulaTooltip": "Main dice formula (2d6 per default)",
|
||||
"BOL.settings.diceSuccessValue" : "Success value",
|
||||
"BOL.settings.diceSuccessValueTooltip": "Value of the success threshold (9 per default for 2d6)",
|
||||
"BOL.settings.diceCriticalValue" : "Critical success value",
|
||||
"BOL.settings.diceCriticalValueTooltip": "Minimum value for critical success (12 per default for 2d6)",
|
||||
"BOL.settings.diceCriticalFailure" : "Critical failure value",
|
||||
"BOL.settings.diceCriticalFailureTooltip": "Maximum value for critical failure (2 per default for 2d6)",
|
||||
"BOL.settings.defaultLogoActorSheetPath" : "Path for Actor sheet logo",
|
||||
"BOL.settings.defaultLogoPathActorSheetTooltip": "Path of the Actor sheet logo (346 x 200, default : /systems/bol/ui/logo.webp)",
|
||||
"BOL.settings.defaultLogoTopLeftPath" : "Path for main top left logo",
|
||||
"BOL.settings.defaultLogoTopLeftPathTooltip": "Path of the logo in the top left window (718 x 416, default : /systems/bol/ui/logo2.webp)"
|
||||
}
|
596
lang/es.json
Normal file
@ -0,0 +1,596 @@
|
||||
{
|
||||
"TYPES": {
|
||||
"Actor": {
|
||||
"character": "PJ",
|
||||
"encounter": "PNJ",
|
||||
"npc": "PNJ",
|
||||
"vehicle": "Vehículo"
|
||||
},
|
||||
"Item": {
|
||||
"item": "Objeto",
|
||||
"feature": "Rasgo",
|
||||
"weapon": "Arma",
|
||||
"armure": "Armadura"
|
||||
}
|
||||
},
|
||||
|
||||
"BOL.attributes.vigor": "Fuerza",
|
||||
"BOL.attributes.halfvigor" : "Media-Fuerza",
|
||||
"BOL.attributes.agility": "Agilidad",
|
||||
"BOL.attributes.mind": "Mente",
|
||||
"BOL.attributes.appeal": "Atractivo",
|
||||
"BOL.aptitudes.init": "Iniciativa",
|
||||
"BOL.aptitudes.melee": "Melé",
|
||||
"BOL.aptitudes.ranged": "Distancia",
|
||||
"BOL.aptitudes.def": "Defensa",
|
||||
"BOL.aptitudes.prot": "Protección",
|
||||
"BOL.resources.hp": "Vitalidad",
|
||||
"BOL.resources.hero": "Héroe",
|
||||
"BOL.resources.faith": "Fe",
|
||||
"BOL.resources.creation": "Creación",
|
||||
"BOL.resources.power": "Poder",
|
||||
"BOL.resources.villainy": "Villano",
|
||||
"BOL.resources.alchemypoints": "Puntos Alquimia",
|
||||
"BOL.traits.xp": "Experiencia",
|
||||
|
||||
"BOL.ui.tab.stats": "Atributos",
|
||||
"BOL.ui.tab.combat": "Combate",
|
||||
"BOL.ui.tab.actions": "Acciones",
|
||||
"BOL.ui.tab.features": "Rasgos",
|
||||
"BOL.ui.tab.equipment": "Equipo",
|
||||
"BOL.ui.tab.description": "Descripción",
|
||||
"BOL.ui.tab.details": "Detalles",
|
||||
"BOL.ui.tab.spellalchemy": "Alquimia",
|
||||
"BOL.ui.tab.astrologer": "Astrólogo",
|
||||
|
||||
"BOL.ui.astrologerPoints": "Puntos Astrología",
|
||||
"BOL.ui.astrologerPointsLabel": "Puntos Astrología actuales",
|
||||
"BOL.ui.ishoroscopemajor": "¿Horóscopo Mayor (ej del grupo)?",
|
||||
"BOL.ui.answer": "Respuesta",
|
||||
"BOL.ui.horoscopefavorable": "Favorable (1dB)",
|
||||
"BOL.ui.horoscopeunfavorable": "Desfavorable (1dM)",
|
||||
"BOL.ui.horoscopes": "Horóscopos",
|
||||
"BOL.ui.horoscopesBonus": "Horóscopos (Ventaja)",
|
||||
"BOL.ui.horoscopesMalus": "Horóscopos (Desventaja)",
|
||||
"BOL.ui.groupHoroscope": "Horóscropo de Grupo de ",
|
||||
|
||||
"BOL.ui.rabble": "Chusma",
|
||||
"BOL.ui.tough": "Matones",
|
||||
"BOL.ui.villain": "Villanos",
|
||||
"BOL.ui.properties": "Propiedades",
|
||||
"BOL.ui.description": "Descripción",
|
||||
"BOL.ui.actions": "Acciones",
|
||||
"BOL.ui.capacities": "Capacidad",
|
||||
"BOL.ui.damages": "Daño",
|
||||
"BOL.ui.details": "Detalles",
|
||||
"BOL.ui.category": "Categoría",
|
||||
"BOL.ui.subcategory": "Sub-Categoría",
|
||||
"BOL.ui.type": "Tipo",
|
||||
"BOL.ui.subtype": "Subtipo",
|
||||
"BOL.ui.attribute" : "Atributo",
|
||||
"BOL.ui.aptitude" : "Habilidad",
|
||||
"BOL.ui.advantages" : "Ventaja/Desventaja",
|
||||
"BOL.ui.modifiers": "Modificador",
|
||||
"BOL.ui.item": "Objeto",
|
||||
"BOL.ui.edit": "Editar",
|
||||
"BOL.ui.unequip": "Quitar",
|
||||
"BOL.ui.equip": "Equipar",
|
||||
"BOL.ui.delete": "Borrar",
|
||||
"BOL.ui.roll" : "Tirar",
|
||||
"BOL.ui.equipment" : "Equipo",
|
||||
"BOL.ui.equipmentProperties" : "Propiedades Equipo",
|
||||
"BOL.ui.weaponAttack" : "Ataque Arma",
|
||||
"BOL.ui.weaponProperties" : "Propiedades Arma",
|
||||
"BOL.ui.protectionProperties" : "Propiedades Protección",
|
||||
"BOL.ui.magicalProperties" : "Propiedades Mágicas",
|
||||
"BOL.ui.alchemyProperties": "Propiedades Alquimia",
|
||||
"BOL.ui.armor" : "Armadura",
|
||||
"BOL.ui.reach" : "Alcance",
|
||||
"BOL.ui.weapon" : "Arma",
|
||||
"BOL.ui.melee" : "Melé",
|
||||
"BOL.ui.ranged" : "Distancia",
|
||||
"BOL.ui.protection" : "Protección",
|
||||
"BOL.ui.shield" : "Escudo",
|
||||
"BOL.ui.blocking" : "Bloqueo",
|
||||
"BOL.ui.range" : "Alcance",
|
||||
"BOL.ui.quantity" : "Cantidad",
|
||||
"BOL.ui.qty" : "Cant.",
|
||||
"BOL.ui.slot" : "Hueco",
|
||||
"BOL.ui.weight" : "Peso",
|
||||
"BOL.ui.price": "Precio",
|
||||
"BOL.ui.cancel": "Cancelar",
|
||||
"BOL.ui.submit": "OK",
|
||||
"BOL.ui.attributeCheck" : "Tirada Atributo",
|
||||
"BOL.ui.aptitudeCheck" : "Tirada Habilidad",
|
||||
"BOL.ui.weaponCheck" : "Tirada Arma",
|
||||
"BOL.ui.spellCheck" : "Tirada Conjuro",
|
||||
"BOL.ui.careers" : "Oficios",
|
||||
"BOL.ui.boons" : "Ventaja",
|
||||
"BOL.ui.flaws" : "Desventaja",
|
||||
"BOL.ui.rank" : "Rango",
|
||||
"BOL.ui.success" : "Éxito",
|
||||
"BOL.ui.failure" : "Fallo",
|
||||
"BOL.ui.fumble" : "Pifia",
|
||||
"BOL.ui.critical" : "Éxito Asombroso",
|
||||
"BOL.ui.criticallegend" : "Éxito Legendario",
|
||||
"BOL.ui.maneuvers" : "Maniobras",
|
||||
"BOL.ui.stacksize" : "Tamaño Pila (máx)",
|
||||
"BOL.ui.weapons" : "Armas",
|
||||
"BOL.ui.protections" : "Protección",
|
||||
"BOL.ui.ammos" : "Munición",
|
||||
"BOL.ui.containers" : "Contenedor",
|
||||
"BOL.ui.treasure" : "Tesoro",
|
||||
"BOL.ui.vehicles" : "Vehículo/Montura",
|
||||
"BOL.ui.misc" : "Varios",
|
||||
"BOL.ui.vehicleProperties" : "Propiedades Vehículo",
|
||||
"BOL.ui.speed" : "Velocidad",
|
||||
"BOL.ui.noWeaponName" : "Nombre Arma",
|
||||
"BOL.ui.targetDefence": "Defensa",
|
||||
"BOL.ui.applyShieldMalus": "Aplicar Mod. Escudo",
|
||||
"BOL.ui.shieldMalus": "Mod. Escudo",
|
||||
"BOL.ui.defenseScore": "Valor Defensa",
|
||||
"BOL.ui.defender": "Defensor",
|
||||
"BOL.ui.difficulty": "Dificultad",
|
||||
"BOL.ui.spellProperties": "Propiedades Conjuro",
|
||||
"BOL.ui.duration": "Duración",
|
||||
"BOL.ui.spellkeep": "Mantenimiento",
|
||||
"BOL.ui.concentrate": "Concentración",
|
||||
"BOL.ui.registerInit": "Registrar Inic.",
|
||||
"BOL.ui.isSorcerer": "¿Es Hechicero?",
|
||||
"BOL.ui.isAlchemist": "¿Es Alquimista?",
|
||||
"BOL.ui.isPriest": "¿Es Clérigo/Druida?",
|
||||
"BOL.ui.isAstrologer": "¿Es Astrólogo?",
|
||||
"BOL.ui.circle": "Círculo",
|
||||
"BOL.ui.spells": "Conjuros",
|
||||
"BOL.ui.focusSpell": "Lanzar conjuro",
|
||||
"BOL.ui.sorcererRank" : "Rango Hechicero",
|
||||
"BOL.ui.alchemistRank": "Rango Alquimista",
|
||||
"BOL.ui.mandatoryconditions": "Condiciones obligatorias",
|
||||
"BOL.ui.optionnalconditions": "Condiciones opcionales",
|
||||
"BOL.ui.ppcost": "Coste Puntos Poder",
|
||||
"BOL.ui.ppAvailable": "Puntos Poder Disponibles",
|
||||
"BOL.ui.pccost": "Coste Puntos Creación",
|
||||
"BOL.ui.pcnow": "Puntos Creación Actuales",
|
||||
"BOL.ui.alchemyType": "Tipo",
|
||||
"BOL.ui.alchemy": "Alquimia",
|
||||
"BOL.ui.makeAlchemy": "Realizar Alquimia",
|
||||
"BOL.ui.alchemyCostTotal": "Coste Total Puntos Alquimia",
|
||||
"BOL.ui.alchemyInvest": "Invertir Puntos Alquimia",
|
||||
"BOL.ui.alchemyCurrent": "Puntos Alquimia actuales en Objeto",
|
||||
"BOL.ui.advance": "Estado",
|
||||
"BOL.ui.isadvantage": "¿Da un dado ventaja?",
|
||||
"BOL.ui.bonusmalus": "Ventaja/desventaja adicional",
|
||||
"BOL.ui.nbdices": "Número Dados",
|
||||
"BOL.ui.totalmod": "Mod. Total",
|
||||
"BOL.ui.rangeModifiers": "Mod. distancia",
|
||||
"BOL.ui.money": "Dinero",
|
||||
"BOL.ui.moneyTitle": "Tesoro",
|
||||
"BOL.ui.fightOption": "Opciones Combate",
|
||||
"BOL.ui.none": "Ninguno",
|
||||
"BOL.ui.fightOptionType": "Tipo Opción Combate",
|
||||
"BOL.ui.activated": "Activado",
|
||||
"BOL.ui.deactivated": "Desactivado",
|
||||
"BOL.ui.status": "Estado",
|
||||
"BOL.ui.toactivated": "Activo",
|
||||
"BOL.ui.todeactivated": "Inactivo",
|
||||
"BOL.ui.armorAgiMalus": "Mod. Armadura+Escudo (Agi)",
|
||||
"BOL.ui.armorInitMalus": "Mod. Armadura (Inic)",
|
||||
"BOL.ui.attackValue": "Valor Ataque",
|
||||
"BOL.ui.attackModifier": "Mod. Ataque",
|
||||
"BOL.ui.weaponbonus": "Esta arma se beneficia de un Dado de ventaja (ej Arma Personal)",
|
||||
"BOL.ui.initMalus": "Desventaja Inic.",
|
||||
"BOL.ui.creature": "Criatura",
|
||||
"BOL.ui.undead": "No-muerto",
|
||||
"BOL.ui.daemon": "Demonio",
|
||||
"BOL.ui.attributaptitude": "Atributo o Habilidad",
|
||||
"BOL.ui.always": "Todos (ej siempre)",
|
||||
"BOL.ui.effectbonusmalus": "Ventaja o Desventaja a aplicar",
|
||||
"BOL.ui.boleffects": "Efectos (automático)",
|
||||
"BOL.ui.modifier": "Modificador",
|
||||
"BOL.ui.effects": "Efectos Activos",
|
||||
"BOL.ui.pcname": "PCs",
|
||||
"BOL.ui.npcname": "NPCs",
|
||||
"BOL.ui.pclistbutton": "Vista compacta",
|
||||
"BOL.ui.noactorfound": "PNJ Desconocido. El PNJ debe ser conocido en el mundo de juego para poder mostrase.",
|
||||
"BOL.ui.deletetitle": "Borrar",
|
||||
"BOL.ui.confirmdelete": "¿Seguro que quieres borrar este objeto?",
|
||||
"BOL.ui.nomorealchemypoints": "¡Sin Puntos de Creación!",
|
||||
"BOL.ui.armornoformula": "La Armadura {protect.name} no dispone de fórmula de protección!",
|
||||
"BOL.ui.selectactor": "Selecciona un actora para aplicar la macro",
|
||||
"BOL.ui.itemnotfound": "Imposible encontrar el objeto de esta macro",
|
||||
"BOL.ui.noinit": "Sin iniciativa. Tira por iniciativa desde la hoja del actor.",
|
||||
"BOL.ui.warninitiative": "Iniciativa no disponible. Tira Iniciativa para este combate.",
|
||||
"BOL.ui.isspecial": "¿Especial?",
|
||||
"BOL.ui.createEquipment": "Crear equipo",
|
||||
"BOL.ui.astrology": "Astrología",
|
||||
"BOL.ui.astrologyMinor": "Crear Horóscopo Menor",
|
||||
"BOL.ui.astrologyMajor": "Crear Horóscopo Mayor",
|
||||
"BOL.ui.astrologyMajorGroup": "Crear Grupo Horóscopo Mayor",
|
||||
"BOL.ui.makeHoroscope": "Crear Horóscopo",
|
||||
"BOL.ui.astrologerRank": "Rango Astrólogo",
|
||||
"BOL.ui.horoscopeCost": "Coste Puntos Astrología",
|
||||
"BOL.ui.minor": "Menor",
|
||||
"BOL.ui.major": "Mayor",
|
||||
"BOL.ui.majorgroup": "Grupo Mayor",
|
||||
"BOL.ui.horoscopeGroup": "Grupo Horóscopo",
|
||||
"BOL.ui.horoscopeDiceRemaining": "Dados Restantes",
|
||||
"BOL.ui.horoscopeDiceMax": "Dado Máx",
|
||||
"BOL.ui.astrologyNoPoints": "¡No dispones de suficientes Puntos Astrología!",
|
||||
"BOL.ui.newEquipment": "Nuevo equipo",
|
||||
"BOL.ui.newNaturalWeapon": "Arma natural",
|
||||
"BOL.ui.newNaturalProtection": "Protección natural",
|
||||
"BOL.ui.createNaturalWeapon": "Crear un arma natural",
|
||||
"BOL.ui.createNaturalProtection": "Crear una protección natural",
|
||||
|
||||
"BOL.featureCategory.origins": "Origen",
|
||||
"BOL.featureCategory.races": "Raza",
|
||||
"BOL.featureCategory.careers": "Oficios",
|
||||
"BOL.featureCategory.boons": "Ventajas",
|
||||
"BOL.featureCategory.flaws": "Desventajas",
|
||||
"BOL.featureCategory.languages": "Idiomas",
|
||||
"BOL.featureCategory.fightoptions": "Opciones Combate",
|
||||
|
||||
"BOL.featureSubtypes.origin": "Origen",
|
||||
"BOL.featureSubtypes.race": "Raza",
|
||||
"BOL.featureSubtypes.career": "Oficio",
|
||||
"BOL.featureSubtypes.boon": "Ventaja",
|
||||
"BOL.featureSubtypes.flaw": "Desventaja",
|
||||
"BOL.featureSubtypes.language": "Idioma",
|
||||
"BOL.featureSubtypes.gods": "Dioses",
|
||||
"BOL.featureSubtypes.fightOption": "Opción Combate",
|
||||
"BOL.featureSubtypes.effect": "Efecto",
|
||||
"BOL.featureSubtypes.effects": "Efectos",
|
||||
"BOL.featureSubtypes.boleffect": "Efecto",
|
||||
"BOL.featureSubtypes.horoscope": "Horóscopo",
|
||||
"BOL.featureSubtypes.xplog": "Diario PX",
|
||||
|
||||
"BOL.bougette.nomoney": "Nada",
|
||||
"BOL.bougette.tolive": "Vivir justo",
|
||||
"BOL.bougette.easylife": "Vida simple",
|
||||
"BOL.bougette.luxury" : "Vida lujosa",
|
||||
"BOL.bougette.rich": "¡Rico!",
|
||||
|
||||
"BOL.fightOptionTypes.armor": "Ataque Armadura",
|
||||
"BOL.fightOptionTypes.intrepid": "Ataque Total",
|
||||
"BOL.fightOptionTypes.twoweaponsdef": "Dos Armas (Defensa)",
|
||||
"BOL.fightOptionTypes.twoweaponsatt": "Dos Armas (Ataque)",
|
||||
"BOL.fightOptionTypes.fulldefense": "Defensa Total",
|
||||
"BOL.fightOptionTypes.defense": "Posición Defensiva",
|
||||
"BOL.fightOptionTypes.attack": "Posición Ofensiva",
|
||||
"BOL.fightOptionTypes.other": "Otro",
|
||||
|
||||
"BOL.itemCategory.object": "Objeto",
|
||||
"BOL.itemCategory.equipment": "Equipo",
|
||||
"BOL.itemCategory.consumable": "Consumible",
|
||||
"BOL.itemCategory.spell": "Conjuro",
|
||||
"BOL.itemCategory.vehicle": "Montura/Vehículo",
|
||||
"BOL.itemCategory.other": "Otro",
|
||||
"BOL.itemCategory.capacity" : "Capacidad",
|
||||
"BOL.itemCategory.alchemy": "Alquimia",
|
||||
"BOL.itemCategory.vehicleweapon": "Arma Vehicular",
|
||||
|
||||
"BOL.combatCategory.protections": "Protecciones",
|
||||
"BOL.combatCategory.shields": "Escudos",
|
||||
"BOL.combatCategory.melee": "Melé",
|
||||
"BOL.combatCategory.ranged": "Distancia",
|
||||
"BOL.combatCategory.fightOptions": "Opciones combate",
|
||||
"BOL.combatCategory.natural": "Armas Naturales",
|
||||
|
||||
"BOL.equipmentCategory.weapon": "Arma",
|
||||
"BOL.equipmentCategory.armor": "Armadura",
|
||||
"BOL.equipmentCategory.protection": "Protección",
|
||||
"BOL.equipmentCategory.shield": "Escudo",
|
||||
"BOL.equipmentCategory.helm": "Casco",
|
||||
"BOL.equipmentCategory.jewel": "Joya",
|
||||
"BOL.equipmentCategory.scroll": "Pergamino",
|
||||
"BOL.equipmentCategory.ammunition": "Munición",
|
||||
"BOL.equipmentCategory.container": "Contenedor",
|
||||
"BOL.equipmentCategory.currency": "Moneda",
|
||||
"BOL.equipmentCategory.other": "Otro",
|
||||
|
||||
"BOL.protectionCategory.armor": "Armadura",
|
||||
"BOL.protectionCategory.shield": "Escudo",
|
||||
"BOL.protectionCategory.helm": "Casco",
|
||||
"BOL.protectionCategory.other": "Otro",
|
||||
|
||||
"BOL.spellItem.charm": "Truco",
|
||||
"BOL.spellItem.circle1": "Primer Círculo",
|
||||
"BOL.spellItem.circle2": "Segundo Círculo",
|
||||
"BOL.spellItem.circle3": "Tercer Círculo",
|
||||
|
||||
"BOL.alchemyItem.common": "Común",
|
||||
"BOL.alchemyItem.scarce": "Escaso",
|
||||
"BOL.alchemyItem.legend": "Legendario",
|
||||
"BOL.alchemyItem.mythic": "Mítico",
|
||||
|
||||
"BOL.weaponCategory.melee": "Melé",
|
||||
"BOL.weaponCategory.ranged": "Distancia",
|
||||
"BOL.weaponCategory.other": "Otro",
|
||||
|
||||
"BOL.itemProperty.damageMultiplier": "Multiplicador Daño",
|
||||
"BOL.itemProperty.attackBonusDice": "Dado Ventaja Ataque",
|
||||
"BOL.itemProperty.equipable": "Equipable",
|
||||
"BOL.itemProperty.protection": "Protección",
|
||||
"BOL.itemProperty.blocking": "Bloqueo",
|
||||
"BOL.itemProperty.magical": "Mágico",
|
||||
"BOL.itemProperty.concealable": "Ocultable",
|
||||
"BOL.itemProperty.2H": "Arma 2M",
|
||||
"BOL.itemProperty.helm": "Casco",
|
||||
"BOL.itemProperty.improvised": "Improvisada",
|
||||
"BOL.itemProperty.shield": "Escudo",
|
||||
"BOL.itemProperty.melee": "Melé",
|
||||
"BOL.itemProperty.throwable": "Arrojadiza",
|
||||
"BOL.itemProperty.ignoreshield": "Ignora Escudo",
|
||||
"BOL.itemProperty.bashing": "Golpea",
|
||||
"BOL.itemProperty.stackable": "Apilable",
|
||||
"BOL.itemProperty.ranged": "Distancia",
|
||||
"BOL.itemProperty.weapon": "Arma",
|
||||
"BOL.itemProperty.reloadable": "Recargable",
|
||||
"BOL.itemProperty.worn": "Equipada",
|
||||
"BOL.itemProperty.spell" : "Conjuro",
|
||||
"BOL.itemProperty.armor" : "Armadura",
|
||||
"BOL.itemProperty.consumable" : "Consumible",
|
||||
"BOL.itemProperty.bow" : "Arco",
|
||||
"BOL.itemProperty.crossbow" : "Ballesta",
|
||||
"BOL.itemProperty.throwing" : "Arrojadiza",
|
||||
"BOL.itemProperty.activable" : "Activable",
|
||||
"BOL.itemProperty.powder" : "Polvo",
|
||||
"BOL.itemProperty.attackAttribute" : "Ataque (Atributo)",
|
||||
"BOL.itemProperty.attackAptitude" : "Ataque (Habilidad)",
|
||||
"BOL.itemProperty.attackModifiers" : "Ataque (Modificadores)",
|
||||
"BOL.itemProperty.attackReroll1" : "Ataque (Relanzar 1s)",
|
||||
"BOL.itemProperty.damage" : "Daño",
|
||||
"BOL.itemProperty.damageModifiers" : "Daño (Modificador)",
|
||||
"BOL.itemProperty.damageAttribute" : "Daño (Atributo)",
|
||||
"BOL.itemProperty.damageSpecial" : "Damage (Especial)",
|
||||
"BOL.itemProperty.damageReroll1" : "Relanzar 1s",
|
||||
"BOL.itemProperty.range" : "Alcance (en m)",
|
||||
"BOL.itemProperty.soakFormula": "Absorver (Fórmula)",
|
||||
"BOL.itemProperty.soakModifiers": "Absorver (Modificador)",
|
||||
"BOL.itemProperty.soakValue": "Absorver (Valor Defecto)",
|
||||
"BOL.itemProperty.armorQuality": "Calidad Armadura",
|
||||
"BOL.itemProperty.blockingMalus" : "Mod. Bloqueo",
|
||||
"BOL.itemProperty.blockingAttacksBlocked" : "Ataques bloqueados",
|
||||
"BOL.itemProperty.blocking1Attack" : "Bloquea 1 ataque",
|
||||
"BOL.itemProperty.blockingAllAttacks" : "Bloquea todos ataques",
|
||||
"BOL.itemProperty.slot" : "Hueco",
|
||||
"BOL.itemProperty.reload": "Recarga (Acción)",
|
||||
"BOL.itemProperty.weaponSize" : "Tamaño Arma",
|
||||
"BOL.itemProperty.difficulty": "Dificultad",
|
||||
"BOL.itemProperty.natural": "Arma natural",
|
||||
"BOL.itemProperty.onlymodifier": "Sólo modificador (ej criatura)",
|
||||
|
||||
"BOL.itemStat.quantity": "Cantidad",
|
||||
"BOL.itemStat.weight": "Peso",
|
||||
"BOL.itemStat.price": "Precio",
|
||||
"BOL.itemStat.range": "Alcance",
|
||||
"BOL.itemStat.damage": "Daño",
|
||||
"BOL.itemStat.reload": "Recargar (Acción)",
|
||||
"BOL.itemStat.soak": "Absorver",
|
||||
"BOL.itemStat.blocking": "Bloqueo",
|
||||
"BOL.itemStat.modifiers": "Modificadores",
|
||||
|
||||
"BOL.weaponSize.unarmed" : "Desarmado",
|
||||
"BOL.weaponSize.improvised" : "Improvisada",
|
||||
"BOL.weaponSize.light" : "Ligera",
|
||||
"BOL.weaponSize.medium" : "Mediana",
|
||||
"BOL.weaponSize.heavy" : "Pesada",
|
||||
|
||||
"BOL.itemModifiers.init": "Mod. (Iniciativa)",
|
||||
"BOL.itemModifiers.social": "Mod. (Social)",
|
||||
"BOL.itemModifiers.agility": "Mod. (Agilidad)",
|
||||
"BOL.itemModifiers.powercost": "Mod. (Coste adicional en PP)",
|
||||
|
||||
"BOL.itemBlocking.malus": "Modificador",
|
||||
"BOL.itemBlocking.nbAttacksPerRound": "Agilidad",
|
||||
|
||||
"BOL.soakFormula.none" : "-",
|
||||
"BOL.soakFormula.light" : "Ligero (Cancela d6-3 daño)",
|
||||
"BOL.soakFormula.medium" : "Mediano (Cancela d6-2 daño)",
|
||||
"BOL.soakFormula.heavy" : "Pesado (Cancela d6-1 daño)",
|
||||
|
||||
"BOL.armorQuality.none" : "-",
|
||||
"BOL.armorQuality.light" : "Ligera",
|
||||
"BOL.armorQuality.lightQ" : "Ligera Calidad",
|
||||
"BOL.armorQuality.lightSup" : "Ligera Superior",
|
||||
"BOL.armorQuality.lightLeg" : "Ligera Legendaria",
|
||||
"BOL.armorQuality.medium" : "Mediana",
|
||||
"BOL.armorQuality.mediumQ" : "Mediana Calidad",
|
||||
"BOL.armorQuality.mediumSup" : "Mediana Superior",
|
||||
"BOL.armorQuality.mediumLeg" : "Mediana Legendaria",
|
||||
"BOL.armorQuality.heavy" : "Pesada",
|
||||
"BOL.armorQuality.heavyQ" : "Pesada Calidad",
|
||||
"BOL.armorQuality.heavySup" : "Pesada Superior",
|
||||
"BOL.armorQuality.heavyLeg" : "Pesada Legendaria",
|
||||
|
||||
"BOL.equipmentSlots.none" : "-",
|
||||
"BOL.equipmentSlots.head" : "Cabeza",
|
||||
"BOL.equipmentSlots.neck" : "Cuello",
|
||||
"BOL.equipmentSlots.shoulders" : "Ombros",
|
||||
"BOL.equipmentSlots.body" : "Cuerpo",
|
||||
"BOL.equipmentSlots.rhand" : "Mano derecha",
|
||||
"BOL.equipmentSlots.lhand" : "Mano izquierda",
|
||||
"BOL.equipmentSlots.2hands" : "2 manos",
|
||||
"BOL.equipmentSlots.rarm" : "Brazo derecho",
|
||||
"BOL.equipmentSlots.larm" : "Brazo izquierdo",
|
||||
"BOL.equipmentSlots.chest" : "Pecho",
|
||||
"BOL.equipmentSlots.belt" : "Cintura",
|
||||
"BOL.equipmentSlots.legs" : "Piernas",
|
||||
"BOL.equipmentSlots.feet" : "Pies",
|
||||
"BOL.equipmentSlots.finder" : "Dedo",
|
||||
"BOL.equipmentSlots.ear" : "Oreja",
|
||||
|
||||
"BOL.vehicleCategory.mount" : "Montura terrestre",
|
||||
"BOL.vehicleCategory.flying" : "Montura voladora",
|
||||
"BOL.vehicleCategory.boat" : "Bote",
|
||||
"BOL.vehicleCategory.other" : "Otro",
|
||||
|
||||
|
||||
"BOL.range.PointBlank": "Quemarropa",
|
||||
"BOL.range.Short": "Corta",
|
||||
"BOL.range.Medium": "Media",
|
||||
"BOL.range.Long": "Larga",
|
||||
"BOL.range.VeryLong": "Distante",
|
||||
"BOL.range.Extreme": "Extrema",
|
||||
"BOL.range.Maximum": "Límite",
|
||||
|
||||
"BOL.notification.MacroMultipleTokensSelected": "¡Has seleccionado varios tokens!",
|
||||
"BOL.notification.MacroNoActorAvailable": "¡No se pudo marcar el actor como objetivo!",
|
||||
"BOL.notification.MacroNoTokenSelected": "¡Debes seleccionar un token!",
|
||||
|
||||
"BOL.size.tiny": "Minúsculo",
|
||||
"BOL.size.verysmall": "Muy pequeño",
|
||||
"BOL.size.small" : "Pequeño",
|
||||
"BOL.size.medium" : "Mediano",
|
||||
"BOL.size.large" : "Grande",
|
||||
"BOL.size.verylarge": "Muy Grande",
|
||||
"BOL.size.huge" : "Monstruoso",
|
||||
"BOL.size.massive" : "Monumental",
|
||||
"BOL.size.enormous": "Enorme",
|
||||
"BOL.size.gigantic": "Gigante",
|
||||
"BOL.size.immense": "Inmenso",
|
||||
"BOL.size.colossal": "Colosal",
|
||||
|
||||
"BOL.chat.fightactive": "¡Activa la opción de combate {foName} este asalto!",
|
||||
"BOL.chat.fightunactive": "¡Desactiva la opción de combate {foName} este asalto!",
|
||||
"BOL.chat.isdead": "¡{name} esta muerto!",
|
||||
"BOL.chat.epitaph": "¡Guardar el honor de su nombre y su memoria!",
|
||||
"BOL.chat.vitalityzero": "Vitalidad de {name} es {hp}: ¡va a caer inconsciente!",
|
||||
"BOL.chat.vitalityheroism": "Puedes gastar 1 Punto Héroe para levantarte en 1 asalto.",
|
||||
"BOL.chat.vitalityheroismhint": "En este caso, tu vitalidad se incrementa a su máximo dividido por 2.",
|
||||
"BOL.chat.vitalitydying": "Vitalidad de {name} es {hp}! Se esta muriendo...",
|
||||
"BOL.chat.vitalitydyingheroism": "Puedes gastar 1 Punto Héroe para Desafiar la Muerte.",
|
||||
"BOL.chat.alchemytitle": "Receta alquímica: {name}",
|
||||
"BOL.chat.alchemypoints": "Coste Puntos Creación: {pcCostCurrent}",
|
||||
"BOL.chat.alchemysuccess": "¡La receta alquímica es un éxito!<br>Crea el objeto/efecto relevante en el inventario.<br>El estadio se reinicia.",
|
||||
"BOL.chat.alchemyfailure": "¡La receta alquímica ha fallado!<br>El estadio se reinicia.",
|
||||
"BOL.chat.rolldamage": "Tirada de daño",
|
||||
"BOL.chat.rolldamage6": "Tirada de daño +6",
|
||||
"BOL.chat.rolldamage12": "Tirada de daño +12 (1 PH)",
|
||||
"BOL.chat.damageresult": "Daño {name}: {total}",
|
||||
"BOL.chat.damagetarget": "Objetivo: {target}",
|
||||
"BOL.chat.applydamagetotarget": "Aplicar daño al objetivo",
|
||||
"BOL.chat.fightoption": "Opciones de combate",
|
||||
"BOL.chat.reroll": "Relanzar (1 PH)",
|
||||
"BOL.chat.heroicreminder": "Adicionalmente a las acciones abajo puedes: <ul><li>Carnicería: 1 ataque adicional al mismo oponente</li><li>Golpe Preciso: 1 Dado desventaja para oponente en localización</li><li>Desarme</li><li>Asesino de Chusma</li><li>Derribado: empujas oponente al suelo (máx +1 tamaño)</li></ul>Si gastas 1 Punto Heroe adicional, todos estos efectos pueden doblarse.",
|
||||
"BOL.chat.toheroic": "Convertir en éxito Asombroso (1 PH)",
|
||||
"BOL.chat.tolegend": "Convertir en éxito Legendario (1 PH)",
|
||||
"BOL.chat.hurttitle": "¡{name} va a recibir {damageTotal} daño!",
|
||||
"BOL.chat.armordefault": "Este ataque atraviesa armadura: la armadura no se utiliza para reducir daño.",
|
||||
"BOL.chat.witharmor": "Impacto con armadura",
|
||||
"BOL.chat.withoutarmor": "Impacto sin armadura",
|
||||
"BOL.chat.shakeoff": "Sacudirse las Heridas (1 PH)",
|
||||
"BOL.chat.splinteredshield": "Sacrificar Escudo/Arma {name} (1 PH)",
|
||||
"BOL.chat.nodamage": "Sin daño",
|
||||
"BOL.chat.damagesummary": "{name} recibe daño",
|
||||
"BOL.chat.protectvalue": "Protección armadura",
|
||||
"BOL.chat.noprotectvalue": "¡Sin armadura!",
|
||||
"BOL.chat.heroreducedamage": "Un Punto de Héroe se ha gastado, para reducir el daño en {total}.",
|
||||
"BOL.chat.herosplintered": "No recibes daño gracias a sacrificar el escudo/arma {weaponHero.name}. ¡El escudo/arma se ha destruido! y un PH se ha gastado.",
|
||||
"BOL.chat.finaldamage": "Daño Final: ¡{finalDamage} de daño!",
|
||||
"BOL.chat.spell": "Conjuro",
|
||||
"BOL.chat.spellcost": "Coste Puntos Poder",
|
||||
"BOL.chat.spellremaining": "Puntos Poder restantes",
|
||||
"BOL.chat.nodamagesummary": "Sin daño ....",
|
||||
"BOL.chat.damageresume": "{name} recibe heridas ...",
|
||||
"BOL.chat.fumblemessage": "Si aceptas un fallo calamitoso (DJ escoje consecuencia), puedes ganar 1 Punto Héroe adicional.",
|
||||
"BOL.chat.rangeinfo": "Disparo de {attackerName} a {defenderName}",
|
||||
"BOL.chat.rangeweaponinfo": "Arma: {weaponName} - Alcance base {weaponRange}",
|
||||
"BOL.chat.rangeout": "Mod: Fuera de alcance",
|
||||
"BOL.chat.range0": "Mod: Quemarropa (+1)",
|
||||
"BOL.chat.range1": "Mod: Alcance Corto (0)",
|
||||
"BOL.chat.range2": "Mod: Alcance Medio (-1)",
|
||||
"BOL.chat.range3": "Mod: Alcance Largo (-2)",
|
||||
"BOL.chat.range4": "Mod: Alcance Distante (-4)",
|
||||
"BOL.chat.range5": "Mod: Alcance Extremo (-6)",
|
||||
"BOL.chat.range6": "Mod: Alcance Límite (-8)",
|
||||
"BOL.chat.rangeprefix": "Distancia calculada: ",
|
||||
"BOL.chat.rangevisible": "Linea de visión limpia entre tokens.",
|
||||
"BOL.chat.rangenotvisible": "Linea de visión bloqueada entre tokens.",
|
||||
"BOL.chat.rangetitle": "Información DJ",
|
||||
"BOL.chat.weaponreroll1": "Recordatorio, este arma vuelve a tirar los 1s en daño.",
|
||||
"BOL.chat.rollbougette": "Tirada moneda",
|
||||
"BOL.chat.bougettesuccess": "¡Tus fondos monetarios no varían!",
|
||||
"BOL.chat.bougettefailure": "Has gastado demasiado dinero, tu balance se decrementa un nivel...",
|
||||
"BOL.chat.initiative": "Rango iniciativa (10 a 1)",
|
||||
"BOL.chat.horoscope": "Horóscopo",
|
||||
"BOL.chat.horoscopepoints": "Coste: {points} Puntos Astrología",
|
||||
"BOL.chat.horoscopeminorsuccess": "Éxito horóscopo menor: cambia el nombre del horóscopo en la hoja. Te beneficias de 1 Dado Ventaja en la situación.",
|
||||
"BOL.chat.horoscopeminorfailure": "Fallo horóscopo menor: cambia el nombre del horóscopo en la hoja. Sufres 1 Dado Desventaja en la situación.",
|
||||
"BOL.chat.horoscopemajorsuccess": "Éxito horóscopo mayor: {horoscopeName} consigue 1 Punto Héroe en esta aventura. El punto ha sido añadido automáticamente.",
|
||||
"BOL.chat.horoscopemajorfailure": "Fallo horóscopo mayor: {horoscopeName} pierde 1 Punto Héroe en esta aventura. El punto ha sido reducido automáticamente.",
|
||||
"BOL.chat.horoscopemajorgroupsuccess": "Éxito en tu grupo de horóscopo mayor. Tu y tus compañeros ganáis {careerBonus} Dado Ventaja durante esta aventura.",
|
||||
"BOL.chat.horoscopemajorgroupfailure": "Fallo en tu grupo de horóscopo mayor. Tu y tus compañeros sufrís {careerBonus} Dado Desventaja durante esta aventura.",
|
||||
"BOL.chat.usedhoroscope": "Se ha utilizado Horóscopo",
|
||||
"BOL.chat.horoscopedeleted": "Los horóscopos utilizados son borrados automáticamente.",
|
||||
"BOL.chat.criticaloptions": "¡Éxito Asombroso! Selecciona 1 opción:",
|
||||
"BOL.chat.criticalcarnage": "Carnicería: ganas 1 ataque adicional. Este segundo ataque no se puede beneficiar de Puntos Héroe/Villano.",
|
||||
"BOL.chat.criticalplus6": "Golpe Devastador: añade +6 al daño causado (botón abajo).",
|
||||
"BOL.chat.criticalprecise": "Golpe Preciso: impactas y dañas a tu oponente. Describe lo que haces (DJ de acuerdo), tu oponente sufre 1 Dado Desventaja en acciones relevantes.",
|
||||
"BOL.chat.criticalunarm": "Desarme: si su oponente lleva algún arma, puede decidir desarmarlo en lugar de hacerle daño.",
|
||||
"BOL.chat.criticalrabble": "Asesino de Chusma: si luchas contra Chusma, el daño resultante se convierte en el número de enemigos que derrotas.",
|
||||
"BOL.chat.criticalpush": "Derribado: si el tamaño lo permite, empujas oponente al suelo. Sufre un 1 Dado Desventaja en todas sus acciones el siguiente asalto.",
|
||||
"BOL.chat.criticalup": "Transforma en Legendario: si gastas 1 Punto Héroe/Villano transformas el éxito Asombroso en Legendario. Selecciona 2 opciones de la lista.",
|
||||
"BOL.chat.criticalinfo": "¡Esto es un éxito Asombroso o Legendario! Escoge tus opciones y efectos",
|
||||
"BOL.chat.criticalbuttonjournal": "Éxito Asombroso/Legendario",
|
||||
"BOL.chat.armorRoll": "Tirada de Armadura",
|
||||
|
||||
"BOL.dialog.soeasy": "Demasiado fácil (+4)",
|
||||
"BOL.dialog.veryeasy": "Muy fácil (+2)",
|
||||
"BOL.dialog.easy": "Fácil (+1)",
|
||||
"BOL.dialog.moderate": "Moderado (0)",
|
||||
"BOL.dialog.hard": "Difícil (-1)",
|
||||
"BOL.dialog.tough": "Duro (-2)",
|
||||
"BOL.dialog.demanding": "Exigente (-4)",
|
||||
"BOL.dialog.formidable": "Formidable (-6)",
|
||||
"BOL.dialog.heroic": "Heroica (-8)",
|
||||
"BOL.dialog.mythic": "Mítica (-10)",
|
||||
"BOL.dialog.divine": "Divina (-12)",
|
||||
|
||||
"BOL.dialog.pointblank": "Quemarropa (+1)",
|
||||
"BOL.dialog.close": "Corta (0)",
|
||||
"BOL.dialog.medium": "Media (-1))",
|
||||
"BOL.dialog.long": "Larga (-2)",
|
||||
"BOL.dialog.distant": "Distante (-4)",
|
||||
"BOL.dialog.extreme": "Extrema (-6)",
|
||||
"BOL.dialog.utmost": "Límite (-8)",
|
||||
|
||||
"BOL.ui.name": "Nombre",
|
||||
"BOL.ui.xp": "Experiencia",
|
||||
"BOL.ui.xpspent": "Consumida",
|
||||
"BOL.ui.xptotal": "Total",
|
||||
"BOL.ui.biosize": "Tamaño",
|
||||
"BOL.ui.bioweight": "Peso",
|
||||
"BOL.ui.bioage": "Edad",
|
||||
"BOL.ui.biohair": "Pelo",
|
||||
"BOL.ui.bioeyes": "Ojos",
|
||||
"BOL.ui.biosigns": "Marcas",
|
||||
"BOL.ui.biodescription": "Descripción",
|
||||
"BOL.ui.bionotes": "Notas",
|
||||
|
||||
"BOL.chat.welcome1": "Bienvenidos a Bárbaros de Lemuria (Ludospherik)",
|
||||
"BOL.chat.welcome2": "Para jugar es necesario usar el manual, que lo podéis conseguir aquí: https://www.ludospherik-editions.com/en_gb/",
|
||||
"BOL.chat.welcome3": "Los mapas incluidos tienen autorización de Guillaume Tavernier y Ludospherik. ¡Nuestro agradecimiento!",
|
||||
"BOL.chat.welcome4": "Todo el soporte para el sistema es a través del servidor Discord: https://discord.gg/pPSDNJk",
|
||||
"BOL.chat.welcome5": "¡Buena partida en Lemuria!",
|
||||
"BOL.chat.welcome6": "",
|
||||
|
||||
"BOL.settings.rollArmor": "Tiradas de armadura",
|
||||
"BOL.settings.rollArmorTooltip": "Tiradas de armadura, si no esta activo usará el valor fijo",
|
||||
"BOL.settings.useBougette": "Utilizar Bougette (regla casera francesa)",
|
||||
"BOL.settings.useBougetteTooltip": "Utilizar valor Bougette (Monedero), descrito en Annales Lemurienne de LeRatierBretonnien (https://www.lahiette.com/leratierbretonnien/)",
|
||||
"BOL.settings.removeDead": "Automáticamente eliminar PNJs muertos al final del asalto",
|
||||
"BOL.settings.removeDeadTooltip": "Automáticamente eliminar PNJs, cuando la Vitalidad es menor de 0 al final de cada asalto",
|
||||
"BOL.settings.diceFormula": "Fórmula de Dados",
|
||||
"BOL.settings.diceFormulaTooltip": "Fórmula general de dados (2d6 por defecto)",
|
||||
"BOL.settings.diceSuccessValue" : "Valor éxito",
|
||||
"BOL.settings.diceSuccessValueTooltip": "Valor del umbral para el éxito (9 por defecto en 2d6)",
|
||||
"BOL.settings.diceCriticalValue" : "Valor éxito crítico",
|
||||
"BOL.settings.diceCriticalValueTooltip": "Valor del umbral mínimo para el éxito crítico (12 por defecto en 2d6)",
|
||||
"BOL.settings.diceCriticalFailure" : "Valor fallo crítico",
|
||||
"BOL.settings.diceCriticalFailureTooltip": "Valor del umbral máximo para el fallo crítico (2 por defecto en 2d6)",
|
||||
"BOL.settings.defaultLogoActorSheetPath" : "Logo para la Hoja",
|
||||
"BOL.settings.defaultLogoPathActorSheetTooltip": "Hubicación del logo para la hoja del Actor (346x200, por defecto: /systems/bol/ui/logo.webp)",
|
||||
"BOL.settings.defaultLogoTopLeftPath" : "Logo esquina superior izquierda",
|
||||
"BOL.settings.defaultLogoTopLeftPathTooltip": "Hubicación logo ventana principal superior izquierda (718x416, por defecto: /systems/bol/ui/logo2.webp)"
|
||||
}
|
256
lang/fr.json
@ -1,15 +1,28 @@
|
||||
{
|
||||
"ACTOR.TypeCharacter": "Personnage",
|
||||
"ACTOR.TypeEncounter": "Rencontre",
|
||||
"ITEM.TypeItem": "Objet",
|
||||
"ITEM.TypeFeature": "Trait",
|
||||
"ITEM.TypeWeapon": "Arme",
|
||||
"ITEM.TypeArmor": "Armure",
|
||||
"TYPES": {
|
||||
"Actor": {
|
||||
"character": "Personnage",
|
||||
"encounter": "PNJ",
|
||||
"npc": "PNJ",
|
||||
"vehicle": "Véhicule",
|
||||
"horde": "Horde"
|
||||
},
|
||||
"Item": {
|
||||
"item": "Objet",
|
||||
"feature": "Trait",
|
||||
"weapon": "Arme",
|
||||
"armure": "Armure"
|
||||
}
|
||||
},
|
||||
"BOL.attributes.vigor": "Vigueur",
|
||||
"BOL.attributes.halfvigor": "Demi-vigueur",
|
||||
"BOL.attributes.agility": "Agilité",
|
||||
"BOL.attributes.mind": "Esprit",
|
||||
"BOL.attributes.appeal": "Aura",
|
||||
"BOL.attributes.hull": "Coque",
|
||||
"BOL.attributes.crew": "Equipage",
|
||||
"BOL.attributes.resources": "Resources",
|
||||
"BOL.attributes.row": "Rames",
|
||||
"BOL.aptitudes.init": "Initiative",
|
||||
"BOL.aptitudes.melee": "Mêlée",
|
||||
"BOL.aptitudes.ranged": "Tir",
|
||||
@ -22,7 +35,9 @@
|
||||
"BOL.resources.power": "Pouvoir",
|
||||
"BOL.resources.villainy": "Vilénie",
|
||||
"BOL.resources.alchemypoints": "Points de Creation",
|
||||
"BOL.resources.astrologypoints": "Points d'Astrologie",
|
||||
"BOL.traits.xp": "Expérience",
|
||||
|
||||
"BOL.ui.tab.stats": "Attributs",
|
||||
"BOL.ui.tab.combat": "Combat",
|
||||
"BOL.ui.tab.actions": "Actions",
|
||||
@ -30,7 +45,19 @@
|
||||
"BOL.ui.tab.equipment": "Equipement",
|
||||
"BOL.ui.tab.description": "Description",
|
||||
"BOL.ui.tab.details": "Details",
|
||||
"BOL.ui.tab.spellalchemy": "Sorts&Alchimie",
|
||||
"BOL.ui.tab.spellalchemy": "Mystères",
|
||||
|
||||
"BOL.ui.astrologerPoints": "Points d'Astrologie",
|
||||
"BOL.ui.astrologerPointsLabel": "Points d'Astrologie actuels",
|
||||
"BOL.ui.ishoroscopemajor": "Horoscope Majeur (ie de groupe) ?",
|
||||
"BOL.ui.answer": "Réponse",
|
||||
"BOL.ui.horoscopefavorable": "Favorable (1dB)",
|
||||
"BOL.ui.horoscopeunfavorable": "Défavorable (1dM)",
|
||||
"BOL.ui.horoscopes": "Horoscopes",
|
||||
"BOL.ui.horoscopesBonus": "Horoscopes (Bonus)",
|
||||
"BOL.ui.horoscopesMalus": "Horoscopes (Malus)",
|
||||
"BOL.ui.groupHoroscope": "Horoscrope de Groupe de ",
|
||||
|
||||
"BOL.ui.properties": "Propriétés",
|
||||
"BOL.ui.description": "Description",
|
||||
"BOL.ui.actions": "Actions",
|
||||
@ -86,8 +113,8 @@
|
||||
"BOL.ui.success": "Succès",
|
||||
"BOL.ui.failure": "Échec",
|
||||
"BOL.ui.fumble": "Échec critique",
|
||||
"BOL.ui.critical": "Succès critique",
|
||||
"BOL.ui.criticallegend": "Succès légendaire !",
|
||||
"BOL.ui.critical": "Succès Héroïque",
|
||||
"BOL.ui.criticallegend": "Succès Légendaire !",
|
||||
"BOL.ui.maneuvers": "Actions de combat",
|
||||
"BOL.ui.stacksize": "Taille de pile (max)",
|
||||
"BOL.ui.weapons": "Armes",
|
||||
@ -108,12 +135,23 @@
|
||||
"BOL.ui.difficulty": "Difficulté",
|
||||
"BOL.ui.spellProperties": "Propriétés du Sort",
|
||||
"BOL.ui.duration": "Durée",
|
||||
"BOL.ui.spellkeep": "Prolongation",
|
||||
"BOL.ui.concentrate": "Concentration",
|
||||
"BOL.ui.spellkeep": "Prolongation possible ?",
|
||||
"BOL.ui.concentrate": "Concentration à maintenir ?",
|
||||
"BOL.ui.aggressive": "Sort aggressif ?",
|
||||
"BOL.ui.registerInit": "Enregistrer comme Init. de combat",
|
||||
"BOL.ui.initMalus": "Malus d'initiative",
|
||||
"BOL.ui.magicnewrules": "Règles supplémentaires (cf. supplément fan-made Sorcellerie!)",
|
||||
"BOL.ui.other":"Autre",
|
||||
"BOL.ui.career":"Carrière",
|
||||
"BOL.ui.boon":"Avantage",
|
||||
"BOL.ui.flaw":"Désanvatage",
|
||||
"BOL.ui.cost":"Cout XP",
|
||||
"BOL.ui.date":"Date",
|
||||
|
||||
"BOL.ui.isSorcerer": "Carrière de Sorcier ?",
|
||||
"BOL.ui.isAlchemist": "Carrière d'Alchimiste ?",
|
||||
"BOL.ui.isPriest": "Carrière de Prêtre/Druide ?",
|
||||
"BOL.ui.isAstrologer": "Carrière d'Astrologue?",
|
||||
"BOL.ui.circle": "Cercle",
|
||||
"BOL.ui.spells": "Sorts",
|
||||
"BOL.ui.focusSpell": "Lance un sort",
|
||||
@ -131,6 +169,21 @@
|
||||
"BOL.ui.alchemyCostTotal": "Points de Création nécessaires pour la Préparation",
|
||||
"BOL.ui.alchemyInvest": "Points de Création investis",
|
||||
"BOL.ui.alchemyCurrent": "Points de Création actuel dans la Préparation",
|
||||
"BOL.ui.astrology": "Astrologie et Horoscopes",
|
||||
"BOL.ui.astrologyMinor": "Etablir un Horoscope Mineur",
|
||||
"BOL.ui.astrologyMajor": "Etablir un Horoscope Majeur",
|
||||
"BOL.ui.astrologyMajorGroup": "Etablir un Horoscope Majeur de Groupe",
|
||||
"BOL.ui.makeHoroscope": "Etablir un Horoscope",
|
||||
"BOL.ui.astrologerRank": "Rang de l'Astrologue",
|
||||
"BOL.ui.horoscopeCost": "Cout en Points d'Astrologie",
|
||||
"BOL.ui.minor": "Mineur",
|
||||
"BOL.ui.major": "Majeur",
|
||||
"BOL.ui.majorgroup": "Majeur de Groupe",
|
||||
"BOL.ui.horoscopeGroup": "Horoscopes de Groupe",
|
||||
"BOL.ui.horoscopeDiceRemaining": "Dés restants",
|
||||
"BOL.ui.horoscopeDiceMax": "Dés Max",
|
||||
"BOL.ui.astrologyNoPoints": "Vous n'avez pas assez de Points d'Astrologie!",
|
||||
|
||||
"BOL.ui.advance": "Avancement",
|
||||
"BOL.ui.isbonusdice": "Fourni un dé bonus?",
|
||||
"BOL.ui.ismalusdice": "Fourni un dé malus?",
|
||||
@ -151,6 +204,49 @@
|
||||
"BOL.ui.armorAgiMalus": "Malus d'Armure+Bouclier (Agi)",
|
||||
"BOL.ui.armorInitMalus": "Malus d'Armure (Init)",
|
||||
"BOL.ui.attackValue": "Valeur d'attaque",
|
||||
"BOL.ui.attackModifier": "Attaque",
|
||||
"BOL.ui.vehicleWeapons": "Armes de véhicules",
|
||||
"BOL.ui.hullDamage": "D.coque",
|
||||
"BOL.ui.crewDamage": "D.équipage",
|
||||
"BOL.ui.fireDamage": "Feu ?",
|
||||
"BOL.ui.weaponbonus": "Cette arme bénéficie déja d'un Dé de Bonus (Arme Favorite prise en compte, par exemple)",
|
||||
"BOL.ui.creature": "Créature",
|
||||
"BOL.ui.undead": "Mort vivant",
|
||||
"BOL.ui.daemon": "Démon",
|
||||
"BOL.ui.rabble": "Piétaille",
|
||||
"BOL.ui.tough": "Coriace",
|
||||
"BOL.ui.villain": "Rival",
|
||||
"BOL.ui.attributaptitude": "Attribut ou Aptitude",
|
||||
"BOL.ui.always": "Tout les jets (ie toujours)",
|
||||
"BOL.ui.effectbonusmalus": "Bonus ou Malus à appliquer",
|
||||
"BOL.ui.boleffects": "Effets (automatiques)",
|
||||
"BOL.ui.modifier": "Modificateur",
|
||||
"BOL.ui.effects": "Effets en cours",
|
||||
"BOL.ui.pcname": "PJs",
|
||||
"BOL.ui.npcname": "PNJs",
|
||||
"BOL.ui.pclistbutton": "Vue compacte",
|
||||
"BOL.ui.noactorfound": "PNJ inconnu, le PNJ doit être présent dans le monde pour s'afficher ici.",
|
||||
"BOL.ui.deletetitle": "Suppression",
|
||||
"BOL.ui.confirmdelete": "Vous êtes sûr de vouloir supprimer cet item ?",
|
||||
"BOL.ui.nomorealchemypoints": "Plus assez de Points de Création !",
|
||||
"BOL.ui.armornoformula": "L'armure {protect.name} n'a pas de formule pour la protection !",
|
||||
"BOL.ui.selectactor": "Selectionnez votre personnage pour utiliser la macro",
|
||||
"BOL.ui.itemnotfound": "Impossible de trouver l'objet de cette macro",
|
||||
"BOL.ui.noinit": "Pas d'initiative trouvée, veuillez en enregistrer une.",
|
||||
"BOL.ui.warninitiative": "Votre initiative n'est pas disponible. Effectuez un jet d'Initiative pour ce combat.",
|
||||
"BOL.ui.isspecial": "Spéciale ?",
|
||||
"BOL.ui.createEquipment": "Créer un Equipement",
|
||||
"BOL.ui.newEquipment": "Nouvel équipement",
|
||||
"BOL.ui.newNaturalWeapon": "Arme naturelle",
|
||||
"BOL.ui.newNaturalProtection": "Protection naturelle",
|
||||
"BOL.ui.createNaturalWeapon": "Créer une arme naturelle",
|
||||
"BOL.ui.createNaturalProtection": "Créer une protection naturelle",
|
||||
"BOL.ui.hordeSize": "Taille de la horde",
|
||||
"BOL.ui.hordeAttack": "Attaque de Horde",
|
||||
"BOL.ui.hordeName": "Nom de la Horde",
|
||||
"BOL.ui.hordeHP": "Vitalité (1 membre)",
|
||||
"BOL.ui.hordehp": "Vitalité (total)",
|
||||
|
||||
"BOL.featureCategory.origins": "Origines",
|
||||
"BOL.featureCategory.races": "Races",
|
||||
"BOL.featureCategory.careers": "Carrières",
|
||||
@ -163,6 +259,7 @@
|
||||
"BOL.bougette.easylife": "A l'aise",
|
||||
"BOL.bougette.luxury": "Luxe&Volupté",
|
||||
"BOL.bougette.rich": "Richissime",
|
||||
|
||||
"BOL.featureSubtypes.origin": "Origine",
|
||||
"BOL.featureSubtypes.race": "Race",
|
||||
"BOL.featureSubtypes.career": "Carrière",
|
||||
@ -171,6 +268,12 @@
|
||||
"BOL.featureSubtypes.language": "Langue",
|
||||
"BOL.featureSubtypes.gods": "Dieux & Foi",
|
||||
"BOL.featureSubtypes.fightOption": "Option de Combat",
|
||||
"BOL.featureSubtypes.effect": "Effet",
|
||||
"BOL.featureSubtypes.effects": "Effets",
|
||||
"BOL.featureSubtypes.boleffect": "Effet",
|
||||
"BOL.featureSubtypes.horoscope": "Horoscope",
|
||||
"BOL.featureSubtypes.xplog": "Log d'XP",
|
||||
|
||||
"BOL.fightOptionTypes.armor": "Attaque au défaut d'armure",
|
||||
"BOL.fightOptionTypes.intrepid": "Attaque intrépide",
|
||||
"BOL.fightOptionTypes.twoweaponsdef": "Combat à 2 armes (Défense)",
|
||||
@ -178,6 +281,8 @@
|
||||
"BOL.fightOptionTypes.fulldefense": "Défense totale",
|
||||
"BOL.fightOptionTypes.defense": "Posture défensive",
|
||||
"BOL.fightOptionTypes.attack": "Posture offensive",
|
||||
"BOL.fightOptionTypes.other": "Autres",
|
||||
|
||||
"BOL.itemCategory.object": "Objet",
|
||||
"BOL.itemCategory.equipment": "Équipement",
|
||||
"BOL.itemCategory.consumable": "Consommable",
|
||||
@ -186,12 +291,15 @@
|
||||
"BOL.itemCategory.other": "Autre",
|
||||
"BOL.itemCategory.capacity": "Capacité",
|
||||
"BOL.itemCategory.alchemy": "Préparation Alchimique",
|
||||
"BOL.itemCategory.vehicleweapon": "Armes de Véhicule",
|
||||
|
||||
"BOL.combatCategory.protections": "Protections",
|
||||
"BOL.combatCategory.shields": "Boucliers",
|
||||
"BOL.combatCategory.melee": "Armes de contact",
|
||||
"BOL.combatCategory.ranged": "Armes à distance",
|
||||
"BOL.combatCategory.fightOptions": "Options de combat",
|
||||
"BOL.combatCategory.natural": "Armes Naturelless",
|
||||
|
||||
"BOL.equipmentCategory.weapon": "Arme",
|
||||
"BOL.equipmentCategory.armor": "Armure",
|
||||
"BOL.equipmentCategory.protection": "Protection",
|
||||
@ -203,21 +311,26 @@
|
||||
"BOL.equipmentCategory.container": "Conteneur",
|
||||
"BOL.equipmentCategory.currency": "Monnaie",
|
||||
"BOL.equipmentCategory.other": "Autre",
|
||||
|
||||
"BOL.protectionCategory.armor": "Armure",
|
||||
"BOL.protectionCategory.shield": "Bouclier",
|
||||
"BOL.protectionCategory.helm": "Casque",
|
||||
"BOL.protectionCategory.other": "Autre",
|
||||
|
||||
"BOL.spellItem.charm": "Charme",
|
||||
"BOL.spellItem.circle1": "Premier Cercle",
|
||||
"BOL.spellItem.circle2": "Second Cercle",
|
||||
"BOL.spellItem.circle3": "Troisième Cercle",
|
||||
|
||||
"BOL.alchemyItem.common": "Courante",
|
||||
"BOL.alchemyItem.scarce": "Rare",
|
||||
"BOL.alchemyItem.legend": "Légendaire",
|
||||
"BOL.alchemyItem.mythic": "Mythique",
|
||||
|
||||
"BOL.weaponCategory.melee": "Arme de mêlée",
|
||||
"BOL.weaponCategory.ranged": "Arme de tir",
|
||||
"BOL.weaponCategory.other": "Autre",
|
||||
|
||||
"BOL.itemProperty.damageMultiplier": "Multiplicateur de dommages",
|
||||
"BOL.itemProperty.attackBonusDice": "Dé de Bonus d'attaque",
|
||||
"BOL.itemProperty.equipable": "Équipable",
|
||||
@ -270,6 +383,18 @@
|
||||
"BOL.itemProperty.difficulty": "Difficulté",
|
||||
"BOL.itemProperty.natural": "Arme naturelle",
|
||||
"BOL.itemProperty.onlymodifier": "Modificateur uniquement (ie attaques de créatures)",
|
||||
"BOL.itemProperty.vehicleDamageType": "Type de dommages de véhicules",
|
||||
"BOL.itemProperty.isfiredamage": "Dommages de Feu",
|
||||
"BOL.itemProperty.ishulldamage": "Dommages à la coque",
|
||||
"BOL.itemProperty.iscrewdamage": "Dommages à l'équipage",
|
||||
"BOL.itemProperty.hulldamage": "Valeur des dommages à la coque",
|
||||
"BOL.itemProperty.crewdamage": "Valeur des dommages à l'équipage",
|
||||
"BOL.itemProperty.hullDamageMultiplier": "Multiplicateur",
|
||||
"BOL.itemProperty.crewDamageMultiplier": "Multiplicateur",
|
||||
"BOL.itemProperty.isboarding": "Abordage",
|
||||
"BOL.itemProperty.isspur": "Eperonnage",
|
||||
"BOL.itemProperty.isbreakrow": "Briser les rames",
|
||||
|
||||
"BOL.itemStat.quantity": "Quantité",
|
||||
"BOL.itemStat.weight": "Poids",
|
||||
"BOL.itemStat.price": "Prix",
|
||||
@ -279,21 +404,26 @@
|
||||
"BOL.itemStat.soak": "Valeur de protection",
|
||||
"BOL.itemStat.blocking": "Bloquage",
|
||||
"BOL.itemStat.modifiers": "Modificateurs",
|
||||
|
||||
"BOL.weaponSize.unarmed": "Mains nues",
|
||||
"BOL.weaponSize.improvised": "Arme improvisée",
|
||||
"BOL.weaponSize.light": "Légère",
|
||||
"BOL.weaponSize.medium": "Moyenne",
|
||||
"BOL.weaponSize.heavy": "Lourde",
|
||||
|
||||
"BOL.itemModifiers.init": "Malus (Initiative)",
|
||||
"BOL.itemModifiers.social": "Malus (Social)",
|
||||
"BOL.itemModifiers.agility": "Malus (Agilité)",
|
||||
"BOL.itemModifiers.powercost": "Malus (Coût supplémentaire en PP)",
|
||||
|
||||
"BOL.itemBlocking.malus": "Social",
|
||||
"BOL.itemBlocking.nbAttacksPerRound": "Agilité",
|
||||
|
||||
"BOL.soakFormula.none": "-",
|
||||
"BOL.soakFormula.light": "Légère (Annule d6-3 dégâts subis)",
|
||||
"BOL.soakFormula.medium": "Moyenne (Annule d6-2 dégâts subis)",
|
||||
"BOL.soakFormula.heavy": "Lourde (Annule d6-1 dégâts subis)",
|
||||
|
||||
"BOL.armorQuality.none": "-",
|
||||
"BOL.armorQuality.light": "Légère",
|
||||
"BOL.armorQuality.lightQ": "Légère de qualité",
|
||||
@ -307,6 +437,7 @@
|
||||
"BOL.armorQuality.heavyQ": "Lourde de qualité",
|
||||
"BOL.armorQuality.heavySup": "Lourde Supérieure",
|
||||
"BOL.armorQuality.heavyLeg": "Lourde Légendaire",
|
||||
|
||||
"BOL.equipmentSlots.none": "-",
|
||||
"BOL.equipmentSlots.head": "Tête",
|
||||
"BOL.equipmentSlots.neck": "Cou",
|
||||
@ -323,10 +454,12 @@
|
||||
"BOL.equipmentSlots.feet": "Pieds",
|
||||
"BOL.equipmentSlots.finder": "Doigt",
|
||||
"BOL.equipmentSlots.ear": "Oreille",
|
||||
|
||||
"BOL.vehicleCategory.mount": "Monture terrestre",
|
||||
"BOL.vehicleCategory.flying": "Monture volante",
|
||||
"BOL.vehicleCategory.boat": "Bateau",
|
||||
"BOL.vehicleCategory.other": "Autre",
|
||||
|
||||
"BOL.range.PointBlank": "Bout portant",
|
||||
"BOL.range.Short": "Courte",
|
||||
"BOL.range.Medium": "Moyenne",
|
||||
@ -334,6 +467,7 @@
|
||||
"BOL.range.VeryLong": "Très longue",
|
||||
"BOL.range.Extreme": "Extrême",
|
||||
"BOL.range.Maximum": "Maximale",
|
||||
|
||||
"BOL.notification.MacroMultipleTokensSelected": "Vous avez sélectionné plusieurs tokens",
|
||||
"BOL.notification.MacroNoActorAvailable": "Aucun acteur n'a pu être ciblé",
|
||||
"BOL.notification.MacroNoTokenSelected": "Vous devez sélectionner un token",
|
||||
@ -356,10 +490,10 @@
|
||||
"BOL.chat.isdead": "{name} est mort !",
|
||||
"BOL.chat.epitaph": "Que son nom soit honoré sur les champs de batailles de Lémurie !",
|
||||
"BOL.chat.vitalityzero": "La Vitalité de {name} est {hp} : il va s'écrouler au sol et sombrer dans l'inconscience !",
|
||||
"BOL.chat.vitalityheroism": "Vous pouvez dépenser 1 Point d'Héroisme pour reprendre vos esprits pendant 1 round.",
|
||||
"BOL.chat.vitalityheroism": "Vous pouvez dépenser 1 Point d'Héroisme/Vilainie pour reprendre vos esprits pendant 1 round.",
|
||||
"BOL.chat.vitalityheroismhint": "Dans ce cas votre vitalité remonte à son maximum divisé par 2 (arrondi au supérieur).",
|
||||
"BOL.chat.vitalitydying": "La Vitalité de {name} est de {hp} ! Il est mourant ...",
|
||||
"BOL.chat.vitalitydyingheroism": "Vous pouvez cependant dépenser 1 Point d'Héroisme pour Défier la Mort (cf. page 58).",
|
||||
"BOL.chat.vitalitydyingheroism": "Vous pouvez cependant dépenser 1 Point d'Héroisme/Vilainie pour Défier la Mort (cf. page 58).",
|
||||
"BOL.chat.alchemytitle": "Préparation Alchimique : {name}",
|
||||
"BOL.chat.alchemypoints": "Points de Création Investis : {pcCostCurrent}",
|
||||
"BOL.chat.alchemysuccess": "La préparation alchimique a été réalisée avec succès !<br>Créez l'item ou l'effet correspondant dans votre Inventaire.<br>L'avancement dans la préparation a été remis à 0.",
|
||||
@ -367,30 +501,78 @@
|
||||
"BOL.chat.rolldamage": "Lancer les dommages",
|
||||
"BOL.chat.rolldamage6": "Lancer les dommages +6",
|
||||
"BOL.chat.rolldamage12": "Dommages +12 (1 Pt. d'Heroisme)",
|
||||
"BOL.chat.rolldamage12Legend": "Dommages +12",
|
||||
"BOL.chat.damageresult": "Dommages de {name} : {total}",
|
||||
"BOL.chat.damagetarget": "Cible : {target}",
|
||||
"BOL.chat.applydamagetotarget": "Appliquer les dommages à la cible",
|
||||
"BOL.chat.fightoption": "Option de combat",
|
||||
"BOL.chat.reroll": "Relancer (1 P. Heroisme)",
|
||||
"BOL.chat.toheroic": "Transformer en succés Héroïque (1 P. Héroisme)",
|
||||
"BOL.chat.tolegend": "Transformer en succes Légendaire (1 P. Heroisme)",
|
||||
"BOL.chat.heroicreminder": "En plus des actions indiquées sur les boutons ci-dessous, vous pouvez : <ul><li>Carnage : Attaquer une seconde fois le même adversaire</li><li>Coup précis : Un dé de malus à votre adversaire sur une localisation choisie</li><li>Désarmement</li><li>Massacrer la piétaille</li><li>Renversement : Renversez votre adversaire (1 taille de plus max)</li></ul>Si vous dépensez un Point d'Héroisme en plus, tout ces effets peuvent être doublés",
|
||||
"BOL.chat.legendaryreminder": "En plus des actions indiquées sur les boutons ci-dessous, vous pouvez effectuer 2 actions parmis: <ul><li>Carnage : Attaquer une seconde fois le même adversaire</li><li>Coup précis : Un dé de malus à votre adversaire sur une localisation choisie</li><li>Désarmement</li><li>Massacrer la piétaille</li><li>Renversement : Renversez votre adversaire (1 taille de plus max)</li></ul>",
|
||||
"BOL.chat.toheroic": "Transformer en succés Héroïque (1 P. Héroisme/Vilainie)",
|
||||
"BOL.chat.tolegend": "Transformer en succes Légendaire (1 P. Heroisme/Vilainie)",
|
||||
"BOL.chat.hurttitle": "{name} va encaisser {damageTotal} dégats !",
|
||||
"BOL.chat.armordefault": "C'est une attaque au défaut de l'armure : vous devez encaisser SANS la protection de l'armure !",
|
||||
"BOL.chat.witharmor": "Encaisser avec la protection de l'armure",
|
||||
"BOL.chat.withoutarmor": "Encaisser sans la protection de l'armure",
|
||||
"BOL.chat.shakeoff": "Juste une égratignure (1 Point d'Héroisme)",
|
||||
"BOL.chat.splinteredshield": "Parade in Extremis avec {name} (1 Point d'Héroisme)",
|
||||
"BOL.chat.shakeoff": "Juste une égratignure (1 Point d'Héroisme/Vilainie)",
|
||||
"BOL.chat.splinteredshield": "Parade in Extremis avec {name} (1 Point d'Héroisme/Vilainie)",
|
||||
"BOL.chat.damagesummary": "Dégats subis par {name}",
|
||||
"BOL.chat.protectvalue": "Protection de l'armure",
|
||||
"BOL.chat.noprotectvalue": "Aucune protection d'armure !",
|
||||
"BOL.chat.heroreducedamage": "Un point d'héroisme dépensé, pour une réduction des dommages supplémentaire de {total}.",
|
||||
"BOL.chat.herosplintered": "Aucun dommage encaissé, grâce à la parade in-extremis avec {weaponHero.name}. L'arme a été détruite pendant cette parade ! Un point d'héroisme a également été dépensé.",
|
||||
"BOL.chat.heroreducedamage": "Un point d'héroisme/vilainie dépensé, pour une réduction des dommages supplémentaire de {total}.",
|
||||
"BOL.chat.herosplintered": "Aucun dommage encaissé, grâce à la parade in-extremis avec {weaponHero.name}. L'arme a été détruite pendant cette parade ! Un point d'héroisme/vilainie a également été dépensé.",
|
||||
"BOL.chat.finaldamage": "Encaissement final : {finalDamage} dégats !",
|
||||
"BOL.chat.spell": "Sort",
|
||||
"BOL.chat.spellcost": "Cout en Points de Pouvoir",
|
||||
"BOL.chat.spellremaining": "Points de Pouvoir restants",
|
||||
"BOL.chat.nodamagesummary": "Aucun dégats n'a été subi ....",
|
||||
"BOL.chat.damageresume": "{name} a subi des blessures ...",
|
||||
"BOL.chat.fumblemessage": "Si vous acceptez les conséquences d'un echec catastrophique (au choix du MJ), vous pourrez bénéficier d'1 point d'Héroïsme supplémentaire",
|
||||
"BOL.chat.rangeinfo": "Tir/Lancer de {attackerName} vers {defenderName}",
|
||||
"BOL.chat.rangeweaponinfo": "Arme : {weaponName} - Portée de base {weaponRange}",
|
||||
"BOL.chat.rangeout": "Modificateur : Hors de portée",
|
||||
"BOL.chat.range0": "Modificateur : Bout portant (+1)",
|
||||
"BOL.chat.range1": "Modificateur : Portée courte (0)",
|
||||
"BOL.chat.range2": "Modificateur : Portée moyenne (-1)",
|
||||
"BOL.chat.range3": "Modificateur : Portée longue (-2)",
|
||||
"BOL.chat.range4": "Modificateur : Portée très longue (-4)",
|
||||
"BOL.chat.range5": "Modificateur : Portée extrême (-6)",
|
||||
"BOL.chat.range6": "Modificateur : Portée maximale (-8)",
|
||||
"BOL.chat.rangeprefix": "Distance évaluée : ",
|
||||
"BOL.chat.rangevisible": "La ligne de vue est dégagée entre les protagonistes.",
|
||||
"BOL.chat.rangenotvisible": "La ligne de vue est bloquée entre les protagonistes.",
|
||||
"BOL.chat.rangetitle": "Information MJ",
|
||||
"BOL.chat.weaponreroll1": "Pour information, cette arme relance les 1 sur ses dégâts.",
|
||||
"BOL.chat.rollbougette": "Jet de Bougette",
|
||||
"BOL.chat.bougettesuccess": "Votre bougette reste inchangée !",
|
||||
"BOL.chat.bougettefailure": "Vous avez trop dépensé, votre bougette s'est réduite...",
|
||||
"BOL.chat.initiative": "Rang d'intiative (10 à 1)",
|
||||
"BOL.chat.horoscope": "Horoscope",
|
||||
"BOL.chat.horoscopepoints": "Coût : {points} Points d'Astrologie",
|
||||
"BOL.chat.horoscopeminorsuccess": "Votre horoscope mineur est un succès : éditez le nom de l'horoscope sur votre fiche. Vous bénéficiez d'1 dé Bonus pour cette situation.",
|
||||
"BOL.chat.horoscopeminorfailure": "Votre horoscope mineur est un échec : éditez le nom de l'horoscope sur votre fiche. Vous souffrez d'1 dé Malus pour cette situation.",
|
||||
"BOL.chat.horoscopemajorsuccess": "Votre horoscope majeur est un succès : {horoscopeName} bénéficie d'1 point d'Héroisme de plus pour cette aventure. Ce point a été ajouté automatiquement.",
|
||||
"BOL.chat.horoscopemajorfailure": "Votre horoscope majeur est un échec : {horoscopeName} a perdu 1 point d'Héroisme pour cette aventure. Ce point a été enlevé automatiquement.",
|
||||
"BOL.chat.horoscopemajorgroupsuccess": "Votre horoscope majeur de groupe est un succès. Vous et vos amis bénéficiez de {careerBonus} dés bonus pendant cette aventure.",
|
||||
"BOL.chat.horoscopemajorgroupfailure": "Votre horoscope majeur de groupe est un échec. Vous et vos amis souffrez de {careerBonus} dés malus pendant cette aventure.",
|
||||
"BOL.chat.usedhoroscope": "Horoscope utilisé",
|
||||
"BOL.chat.horoscopedeleted": "Le(s) Horoscopes utilisé(s) a/ont été supprimé(s) automatiquement.",
|
||||
"BOL.chat.criticaloptions": "Succès critique !! Vous pouvez faire (1 option au choix) :",
|
||||
"BOL.chat.criticalcarnage": "Faire un Carnage : vous avez une attaque gratuite supplémentaire. Cette seconde attaque ne peut bénéficier d'un Point d'Héroisme/vilainie.",
|
||||
"BOL.chat.criticalplus6": "Coup Dévastateur : +6 aux dommages (cf bouton ci-dessous).",
|
||||
"BOL.chat.criticalprecise": "Coup Précis : Vous frappez pour diminuer les capacités de votre adversaire. Décrivez ce que vous faites, et si le MJ l'accepte, votre opposant subira un Dé de Malus pour les actions concernées.",
|
||||
"BOL.chat.criticalunarm": "Désarmement : Si votre adversaire a une arme en main, vous le désarmez.",
|
||||
"BOL.chat.criticalrabble": "Massacrer la piétaille : Si vous combattez de la Piétaille, les résultats des dommages indiquent le nombre d'adversaires mis hors de combat.",
|
||||
"BOL.chat.criticalpush": "Renversement : Si la taille le permet, vous poussez votre adversaire au sol, il souffrira d'1 Dé de Malus pour toutes ses actions au round suivant.",
|
||||
"BOL.chat.criticalup": "Transformer en Légendaire : En dépensant 1 point d'Héroisme/Vilainie, vous pouvez transformer ce Succès Héroïque en Légendaire, qui vous permet de prendre 2 options dans la liste ci-dessus (cf. bouton pour un +12 aux dommages par exemple).",
|
||||
"BOL.chat.criticalinfo": "C'est un succès Héroïque ! Choisissez vos options et effets !",
|
||||
"BOL.chat.criticallegendaryinfo": "C'est un succès Légendaire ! Choisissez vos options et effets !",
|
||||
"BOL.chat.criticalbuttonjournal": "Succès Héroïque/Légendaire",
|
||||
|
||||
"BOL.chat.losshp": "{name} a perdu {lossHP} points de Vitalité. Si il se repose quelques minutes, il peut récupérer {recupHP} points de Vitalité.",
|
||||
"BOL.chat.applyrecup": "Récupérer pendant quelques minutes (+{recupHP} Vitalité)",
|
||||
"BOL.chat.inforecup": "{name} vient de récupérer {recupHP} points de Vitalité après quelques minutes de repos.",
|
||||
|
||||
"BOL.dialog.soeasy": "Inmanquable (+4)",
|
||||
"BOL.dialog.veryeasy": "Trés Facile (+2)",
|
||||
@ -424,11 +606,41 @@
|
||||
"BOL.ui.biosigns": "Signes distinctifs",
|
||||
"BOL.ui.biodescription": "Description",
|
||||
"BOL.ui.bionotes": "Notes",
|
||||
"BOL.ui.xplog":"Journal d'XP",
|
||||
"BOL.ui.value":"Valeur",
|
||||
|
||||
"BOL.chat.welcome1": "Bienvenue dans Barbarians of Lemuria (Ludospherik version)",
|
||||
"BOL.chat.welcome2": "Les livres nécessaires pour jouer sont disponibles sur le site de l'éditeur : http://www.ludospherik.fr/content/14-barbarians-of-lemuria",
|
||||
"BOL.chat.welcome2": "Les livres nécessaires pour jouer sont disponibles sur le site de <a href='http://www.ludospherik.fr/content/14-barbarians-of-lemuria'>l'éditeur Ludospherik.</a>",
|
||||
"BOL.chat.welcome3": "Les cartes intégrées au système le sont grace à l'aimable autorisation de leur auteur Guillaume Tavernier et des éditions Ludospherik. Merci à eux !.",
|
||||
"BOL.chat.welcome4": "Tout le support et le suivi de ce système est disponible via le Discord Foundry FR : https://discord.gg/pPSDNJk",
|
||||
"BOL.chat.welcome5": "Bon jeu en Lemurie !"
|
||||
"BOL.chat.welcome4": "Tout le support et le suivi de ce système est disponible via le <a href='https://discord.gg/pPSDNJk'>Discord Foundry FR</a>.",
|
||||
"BOL.chat.welcome5": "Consulter l'aide en ligne pour plus d'informations : @UUID[Compendium.bol.aides-de-jeu.JournalEntry.8ihDiCxC47fcdKVA]{Aide du Jeu}.",
|
||||
"BOL.chat.welcome6": "Bon jeu en Lemurie !",
|
||||
"BOL.chat.nodamage": "Ne pas appliquer les dommages",
|
||||
"BOL.chat.pcwarning": "Attention ! Aucun personnage n'est relié au joueur !",
|
||||
"BOL.chat.pcwarningmsg": "<b>ATTENTION</b> Le joueur n'est relié à aucun personnage !",
|
||||
"BOL.chat.pcnotlinked": "Le token du personnage joueur n'est pas relié à l'acteur",
|
||||
"BOL.chat.pcnotlinkedmsg": "<b>ATTENTION</b> Le token du personnage joueur n'est pas relié à l'acteur !",
|
||||
"BOL.chat.armorRoll": "Jet d'armure",
|
||||
|
||||
"BOL.settings.rollArmor": "Effectuer des jets pour les armures",
|
||||
"BOL.settings.rollArmorTooltip": "Effectue un jet de dés pour les armures (valeur fixe si désactivé)",
|
||||
"BOL.settings.useBougette": "Utiliser la Bougette (règle fan-made)",
|
||||
"BOL.settings.useBougetteTooltip": "Utilise un indicateur de Bougette, comme décrit dans l'aide de jeu Annales Lemurienne du RatierBretonnien (https://www.lahiette.com/leratierbretonnien/)",
|
||||
"BOL.settings.removeDead": "Enlever les PNJs morts automatiquement au round suivant",
|
||||
"BOL.settings.removeDeadTooltip": "Supprime les PNJ (piétaille, créatures, coriaces) automatiquement du combat lorsqu'ils sont à 0 Vitalité ou moins, lors du passage au round suivant",
|
||||
"BOL.settings.diceFormula": "Formule de dés",
|
||||
"BOL.settings.diceFormulaTooltip": "Formule de dés utilisée pour les jets de dés (par défaut 2d6)",
|
||||
"BOL.settings.diceSuccessValue" : "Seuil de succès",
|
||||
"BOL.settings.diceSuccessValueTooltip": "Seuil de succès pour les jets de dés (par défaut 9 pour 2d6)",
|
||||
"BOL.settings.diceCriticalValue" : "Seuil de succès critique",
|
||||
"BOL.settings.diceCriticalValueTooltip": "Seuil de succès critique pour les jets de dés (par défaut 12 pour 2d6)",
|
||||
"BOL.settings.diceCriticalFailure" : "Valeur max d'échec critique",
|
||||
"BOL.settings.diceCriticalFailureTooltip": "Valeur max d'échec critique pour les jets de dés (par défaut 2 pour 2d6)",
|
||||
"BOL.settings.defaultLogoActorSheetPath" : "Chemin du logo des fiches de perso",
|
||||
"BOL.settings.defaultLogoPathActorSheetTooltip": "Vous pouvez changer le logo BoL des fiches de perso, pour jouer dans un autre univers (idéalement 346 x 200, défaut : /systems/bol/ui/logo.webp)",
|
||||
"BOL.settings.defaultLogoTopLeftPath" : "Chemin du logo haut gauche",
|
||||
"BOL.settings.defaultLogoTopLeftPathTooltip": "Vous pouvez changer le logo BoL en haut à gauche de chaque écran (idéalement 718 x 416, défaut : /systems/bol/ui/logo2.webp)",
|
||||
|
||||
"EFFECT.StatusProne": "A terre",
|
||||
"EFFECT.StatusDead": "Mort"
|
||||
}
|
@ -9,10 +9,10 @@ export class BoLActorSheet extends ActorSheet {
|
||||
|
||||
/** @override */
|
||||
static get defaultOptions() {
|
||||
return mergeObject(super.defaultOptions, {
|
||||
return foundry.utils.mergeObject(super.defaultOptions, {
|
||||
classes: ["bol", "sheet", "actor"],
|
||||
template: "systems/bol/templates/actor/actor-sheet.hbs",
|
||||
width: 600,
|
||||
width: 860,
|
||||
height: 600,
|
||||
dragDrop: [{ dragSelector: ".items-list .item", dropSelector: null }],
|
||||
tabs: [{ navSelector: ".sheet-tabs", contentSelector: ".sheet-body", initial: "stats" }]
|
||||
@ -25,6 +25,13 @@ export class BoLActorSheet extends ActorSheet {
|
||||
activateListeners(html) {
|
||||
super.activateListeners(html);
|
||||
|
||||
function onLoad() {
|
||||
let logoSheet = BoLUtility.getLogoActorSheet()
|
||||
$(".bol-actor-form").css("backgroundImage", `url(${logoSheet})`)
|
||||
}
|
||||
// Setup everything onload
|
||||
$(function () { onLoad(); });
|
||||
|
||||
// Everything below here is only needed if the sheet is editable
|
||||
if (!this.options.editable) return;
|
||||
|
||||
@ -40,10 +47,19 @@ export class BoLActorSheet extends ActorSheet {
|
||||
// Equip/Unequip item
|
||||
html.find('.item-equip').click(this._onToggleEquip.bind(this));
|
||||
|
||||
html.find('.create_item').click(ev => {
|
||||
this.actor.createEmbeddedDocuments('Item', [{ name: "Nouvel Equipement", type: "item" }], { renderSheet: true });
|
||||
html.find('.create-item').click(ev => {
|
||||
this.actor.createEmbeddedDocuments('Item', [{ name: game.i18n.localize("BOL.ui.newEquipment"), type: "item" }], { renderSheet: true });
|
||||
});
|
||||
|
||||
html.find('.create-natural-weapon').click(ev => {
|
||||
let system = foundry.utils.duplicate(game.bol.config.defaultNaturalWeapon)
|
||||
this.actor.createEmbeddedDocuments('Item', [{ name: game.i18n.localize("BOL.ui.newNaturalWeapon"), type: "item", system }], { renderSheet: true });
|
||||
});
|
||||
html.find('.create-natural-protection').click(ev => {
|
||||
let system = foundry.utils.duplicate(game.bol.config.defaultNaturalProtection)
|
||||
this.actor.createEmbeddedDocuments('Item', [{ name: game.i18n.localize("BOL.ui.newNaturalProtection"), type: "item", system }], { renderSheet: true });
|
||||
});
|
||||
|
||||
html.find(".toggle-fight-option").click((ev) => {
|
||||
const li = $(ev.currentTarget).parents(".item")
|
||||
this.actor.toggleFightOption(li.data("itemId"))
|
||||
@ -53,6 +69,12 @@ export class BoLActorSheet extends ActorSheet {
|
||||
const li = $(ev.currentTarget).parents(".item");
|
||||
this.actor.spendAlchemyPoint(li.data("itemId"), 1)
|
||||
})
|
||||
html.find(".inc-dec-btns-resource").click((ev) => {
|
||||
const dataset = ev.currentTarget.dataset;
|
||||
const target = dataset.target
|
||||
const incr = parseInt(dataset.incr)
|
||||
this.actor.incDecResources(target, incr)
|
||||
})
|
||||
|
||||
// Incr./Decr. career ranks
|
||||
html.find(".inc-dec-btns").click((ev) => {
|
||||
@ -87,8 +109,8 @@ export class BoLActorSheet extends ActorSheet {
|
||||
// Delete Inventory Item
|
||||
html.find('.item-delete').click(ev => {
|
||||
Dialog.confirm({
|
||||
title: "Suppression",
|
||||
content: `Vous êtes sûr de vouloir supprimer cet item ?`,
|
||||
title: game.i18n.localize("BOL.ui.deletetitle"),
|
||||
content: game.i18n.localize("BOL.ui.confirmdelete"),
|
||||
yes: () => {
|
||||
const li = $(ev.currentTarget).parents(".item");
|
||||
this.actor.deleteEmbeddedDocuments("Item", [li.data("itemId")])
|
||||
@ -107,10 +129,10 @@ export class BoLActorSheet extends ActorSheet {
|
||||
/* -------------------------------------------- */
|
||||
|
||||
/** @override */
|
||||
getData(options) {
|
||||
async getData(options) {
|
||||
const data = super.getData(options)
|
||||
const actorData = duplicate(data)
|
||||
let formData = duplicate(data)
|
||||
const actorData = foundry.utils.duplicate(data)
|
||||
let formData = foundry.utils.duplicate(data)
|
||||
|
||||
formData.config = game.bol.config
|
||||
formData.data = actorData
|
||||
@ -118,6 +140,7 @@ export class BoLActorSheet extends ActorSheet {
|
||||
formData.attributes = this.actor.attributes
|
||||
formData.aptitudes = this.actor.aptitudes
|
||||
formData.resources = this.actor.getResourcesFromType()
|
||||
formData.xp = this.actor.system.xp
|
||||
formData.equipment = this.actor.equipment
|
||||
formData.equipmentCreature = this.actor.equipmentCreature
|
||||
formData.weapons = this.actor.weapons
|
||||
@ -126,25 +149,35 @@ export class BoLActorSheet extends ActorSheet {
|
||||
formData.alchemy = this.actor.alchemy
|
||||
formData.containers = this.actor.containers
|
||||
formData.treasure = this.actor.treasure
|
||||
formData.boleffects = this.actor.boleffects
|
||||
formData.alchemyrecipe = this.actor.alchemyrecipe
|
||||
formData.horoscopes = this.actor.horoscopes
|
||||
formData.vehicles = this.actor.vehicles
|
||||
formData.fightoptions = this.actor.fightoptions
|
||||
formData.ammos = this.actor.ammos
|
||||
formData.misc = this.actor.misc
|
||||
formData.xplog = this.actor.xplog
|
||||
formData.combat = this.actor.buildCombat()
|
||||
formData.combatCreature = this.actor.buildCombatCreature()
|
||||
formData.initiativeRank = this.actor.getInitiativeRank()
|
||||
//formData.combatCreature = this.actor.buildCombatCreature()
|
||||
formData.features = this.actor.buildFeatures()
|
||||
formData.isGM = game.user.isGM
|
||||
formData.options = this.options
|
||||
formData.owner = this.document.isOwner
|
||||
formData.editScore = this.options.editScore
|
||||
formData.useBougette = BoLUtility.getUseBougette()
|
||||
formData.useBougette = (this.actor.type == "character" && BoLUtility.getUseBougette()) || false
|
||||
formData.bougette = this.actor.getBougette()
|
||||
formData.charType = this.actor.getCharType()
|
||||
formData.villainy = this.actor.getVillainy()
|
||||
|
||||
formData.isUndead = this.actor.isUndead()
|
||||
formData.biography = await TextEditor.enrichHTML(this.object.system.details?.biography || "", { async: true })
|
||||
formData.notes = await TextEditor.enrichHTML(this.object.system.details.notes || "", { async: true })
|
||||
formData.isSorcerer = this.actor.isSorcerer()
|
||||
formData.isAlchemist = this.actor.isAlchemist()
|
||||
formData.isAstrologer = this.actor.isAstrologer()
|
||||
formData.isMysteries = formData.isSorcerer || formData.isAlchemist || formData.isAstrologer
|
||||
formData.isPriest = this.actor.isPriest()
|
||||
formData.horoscopeGroupList = game.settings.get("bol", "horoscope-group")
|
||||
|
||||
formData.isGM = game.user.isGM
|
||||
|
||||
@ -164,7 +197,7 @@ export class BoLActorSheet extends ActorSheet {
|
||||
// Get the type of item to create.
|
||||
const type = header.dataset.type;
|
||||
// Grab any data associated with this control.
|
||||
const data = duplicate(header.dataset);
|
||||
const data = foundry.utils.duplicate(header.dataset);
|
||||
// Initialize a default name.
|
||||
const name = `New ${type.capitalize()}`;
|
||||
// Prepare the item object.
|
||||
@ -227,7 +260,19 @@ export class BoLActorSheet extends ActorSheet {
|
||||
this.actor.incAttributeXP(dataset.key)
|
||||
break;
|
||||
case "careerxp":
|
||||
this.actor.incCareerXP( li.data("item-id"))
|
||||
this.actor.incCareerXP(li.data("item-id"))
|
||||
break;
|
||||
case "horoscope-minor":
|
||||
BoLRoll.horoscopeCheck(this.actor, event, "minor")
|
||||
break
|
||||
case "horoscope-major":
|
||||
BoLRoll.horoscopeCheck(this.actor, event, "major")
|
||||
break
|
||||
case "horoscope-major-group":
|
||||
BoLRoll.horoscopeCheck(this.actor, event, "majorgroup")
|
||||
break
|
||||
case "bougette":
|
||||
this.actor.rollBougette()
|
||||
break;
|
||||
|
||||
default: break;
|
||||
|
@ -1,4 +1,4 @@
|
||||
import { BoLDefaultRoll } from "../controllers/bol-rolls.js";
|
||||
import { BoLDefaultRoll, BoLRoll } from "../controllers/bol-rolls.js";
|
||||
import { BoLUtility } from "../system/bol-utility.js";
|
||||
|
||||
/**
|
||||
@ -7,6 +7,39 @@ import { BoLUtility } from "../system/bol-utility.js";
|
||||
*/
|
||||
export class BoLActor extends Actor {
|
||||
|
||||
static async create(data, options) {
|
||||
|
||||
// Case of compendium global import
|
||||
if (data instanceof Array) {
|
||||
return super.create(data, options);
|
||||
}
|
||||
// If the created actor has items (only applicable to duplicated actors) bypass the new actor creation logic
|
||||
if (data.items) {
|
||||
let actor = super.create(data, options);
|
||||
return actor;
|
||||
}
|
||||
|
||||
if (data.type == 'encounter') {
|
||||
data.system = { resources: { hero : { max : 0, value: 0 } } }
|
||||
}
|
||||
|
||||
if (data.type == 'horde') {
|
||||
let weapon = {
|
||||
name: game.i18n.localize("BOL.ui.hordeAttack"), type: "item",
|
||||
img: "ui/icons/attaque_melee.webp",
|
||||
system: foundry.utils.duplicate(game.bol.config.defaultNaturalWeapon)
|
||||
}
|
||||
weapon.system.properties.attackModifiers = 1
|
||||
weapon.system.properties.damage = "1d6M"
|
||||
data.items = [weapon]
|
||||
|
||||
data.img = "systems/bol/ui/icons/icon-horde-token.webp"
|
||||
data.prototypeToken = { texture: "systems/bol/ui/icons/icon-horde-token.webp" }
|
||||
}
|
||||
|
||||
return super.create(data, options);
|
||||
}
|
||||
|
||||
/** @override */
|
||||
prepareData() {
|
||||
|
||||
@ -18,22 +51,108 @@ export class BoLActor extends Actor {
|
||||
this.chartype = 'tough'
|
||||
this.villainy = true
|
||||
}
|
||||
if (this.type === 'creature') {
|
||||
this.villainy = true
|
||||
}
|
||||
if (this.type == "horde") {
|
||||
let weapon = this.items.find(i => i.type === "item" && i.system.subtype === "weapon")
|
||||
// Check if the horde attack is inline with the hordesize
|
||||
if (weapon?.system?.properties?.attackModifiers != this.system.hordesize) {
|
||||
this.updateEmbeddedDocuments('Item', [{ _id: weapon.id, 'system.properties.attackModifiers': this.system.hordesize }])
|
||||
}
|
||||
}
|
||||
|
||||
super.prepareData()
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
async _onCreateOperation(documents, operation, user) {
|
||||
await super._onCreateOperation(documents, operation, user);
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
getTokenSizeFromHordeSize(hordeSize) {
|
||||
hordeSize = hordeSize || this.system.hordesize
|
||||
// If size > 50 then max is 50
|
||||
let size = Math.min(hordeSize, 20)
|
||||
// Compute the size of the token from 1 to 5
|
||||
let tokenSize = Math.max((size / 4), 1) // Never below 1
|
||||
return tokenSize
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
async _preCreate(data, options, user) {
|
||||
await super._preCreate(data, options, user);
|
||||
|
||||
// Configure prototype token settings
|
||||
const prototypeToken = {};
|
||||
if (this.type === "character") {
|
||||
Object.assign(prototypeToken, {
|
||||
sight: { enabled: true }, actorLink: true, disposition: CONST.TOKEN_DISPOSITIONS.FRIENDLY
|
||||
});
|
||||
this.updateSource({ prototypeToken });
|
||||
}
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
isHeroAdversary() {
|
||||
if (this.type === 'character') {
|
||||
return true
|
||||
}
|
||||
return (this.type === 'encounter' && this.chartype == "adversary")
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
getCharType() {
|
||||
if (this.type === 'character') {
|
||||
return 'player'
|
||||
return "player"
|
||||
}
|
||||
return 'tough'
|
||||
return this.system.chartype
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
getVillainy() {
|
||||
if (this.type === 'character') {
|
||||
return false
|
||||
return ( (this.type === 'encounter' && this.chartype == "adversary") || this.chartype == "creature")
|
||||
}
|
||||
isUndead() {
|
||||
return (this.type == "encounter" && this.system.isundead)
|
||||
}
|
||||
/* -------------------------------------------- */
|
||||
getInitiativeMalus() {
|
||||
if (this.type === 'encounter' && (this.chartype == "adversary" || this.chartype == "tough")) {
|
||||
return this.system.aptitudes.init.value
|
||||
}
|
||||
return 0
|
||||
}
|
||||
/* -------------------------------------------- */
|
||||
getBougette() {
|
||||
if (this.type == "character") {
|
||||
let b = foundry.utils.duplicate(this.system.bougette)
|
||||
b.label = game.i18n.localize(game.bol.config.bougetteState[String(this.system.bougette.value)])
|
||||
b.diceImg = "icons/dice/" + game.bol.config.bougetteDice[String(this.system.bougette.value)] + "black.svg"
|
||||
return b
|
||||
}
|
||||
return undefined
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
async rollBougette() {
|
||||
if (this.type == "character") {
|
||||
let attribute = foundry.utils.duplicate(this.system.attributes.vigor)
|
||||
let rollData = BoLRoll.getCommonRollData(this, "bougette", attribute, undefined)
|
||||
rollData.formula = game.bol.config.bougetteDice[String(this.system.bougette.value)]
|
||||
let r = new BoLDefaultRoll(rollData)
|
||||
r.roll()
|
||||
}
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
decBougette() {
|
||||
if (this.type == "character") {
|
||||
let bougette = foundry.utils.duplicate(this.system.bougette)
|
||||
bougette.value = Math.max(Number(bougette.value) - 1, 0)
|
||||
this.update({ 'system.bougette': bougette })
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
@ -41,31 +160,57 @@ export class BoLActor extends Actor {
|
||||
if (this.type == 'character') {
|
||||
let newVitality = 10 + this.system.attributes.vigor.value + this.system.resources.hp.bonus
|
||||
if (this.system.resources.hp.max != newVitality) {
|
||||
this.update({ 'system.resources.hp.max': newVitality })
|
||||
let actor = this
|
||||
setTimeout(function () { actor.update({ 'system.resources.hp.max': newVitality }) }, 800)
|
||||
}
|
||||
let newPower = 10 + this.system.attributes.mind.value + this.system.resources.power.bonus
|
||||
if (this.system.resources.power.max != newPower) {
|
||||
this.update({ 'system.resources.power.max': newPower })
|
||||
let actor = this
|
||||
setTimeout(function () { actor.update({ 'system.resources.power.max': newPower }) }, 800)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
prepareDerivedData() {
|
||||
super.prepareDerivedData()
|
||||
this.updateResourcesData()
|
||||
this.manageHealthState();
|
||||
if (this.type == "vehicle") {
|
||||
|
||||
} else {
|
||||
super.prepareDerivedData()
|
||||
if (this.id) {
|
||||
this.updateResourcesData()
|
||||
this.manageHealthState()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
get details() {
|
||||
return this.system.details
|
||||
}
|
||||
addEffectModifiers(myList, dataPath) {
|
||||
for (let attr of myList) {
|
||||
attr.numModifier = 0
|
||||
attr.diceModifier = ""
|
||||
let effects = this.items.filter(i => i.type === "feature" && i.system.subtype === "boleffect" && i.system.properties.identifier == dataPath + attr.key)
|
||||
for (let effect of effects) {
|
||||
if (Number(effect.system.properties.modifier)) {
|
||||
attr.numModifier += Number(effect.system.properties.modifier)
|
||||
} else {
|
||||
attr.diceModifier += "+" + effect.system.properties.modifier
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
get attributes() {
|
||||
return Object.values(this.system.attributes)
|
||||
let attrList = foundry.utils.duplicate(Object.values(this.system.attributes))
|
||||
this.addEffectModifiers(attrList, "system.attributes.")
|
||||
return attrList
|
||||
}
|
||||
get aptitudes() {
|
||||
return Object.values(this.system.aptitudes)
|
||||
let aptList = Object.values(this.system.aptitudes)
|
||||
this.addEffectModifiers(aptList, "system.aptitudes.")
|
||||
return aptList
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
@ -98,6 +243,13 @@ export class BoLActor extends Actor {
|
||||
if (fo && fo.system.properties.fightoptiontype == "attack") {
|
||||
defMod += -1
|
||||
}
|
||||
// Apply defense effects
|
||||
for (let i of this.items) {
|
||||
if (i.type === "feature" && i.system.subtype === "boleffect" && i.system.properties.identifier.includes("aptitudes.def")) {
|
||||
defMod += Number(i.system.properties.modifier)
|
||||
}
|
||||
}
|
||||
console.log("Defense : ", defMod)
|
||||
return this.system.aptitudes.def.value + defMod
|
||||
}
|
||||
|
||||
@ -105,21 +257,40 @@ export class BoLActor extends Actor {
|
||||
getActiveFightOption() {
|
||||
let it = this.items.find(i => i.type === "feature" && i.system.subtype === "fightoption" && i.system.properties.activated)
|
||||
if (it) {
|
||||
return duplicate(it)
|
||||
return foundry.utils.duplicate(it)
|
||||
}
|
||||
return undefined
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
addXPLog(type, name, cost, value) {
|
||||
let xplog = {
|
||||
name: "XP : " + game.i18n.localize(type), type: "feature",
|
||||
img: "icons/magic/symbols/chevron-elipse-circle-blue.webp",
|
||||
system: {
|
||||
subtype: "xplog", properties: {
|
||||
xptype: type,
|
||||
xpdate: new Date().toLocaleDateString(),
|
||||
xpname: name,
|
||||
xpcost: cost,
|
||||
xpvalue: value
|
||||
}
|
||||
}
|
||||
}
|
||||
this.createEmbeddedDocuments('Item', [xplog])
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
incAttributeXP(key) {
|
||||
let attr = duplicate(this.system.attributes[key])
|
||||
let attr = foundry.utils.duplicate(this.system.attributes[key])
|
||||
if (attr) {
|
||||
let nextXP = (attr.value == -1) ? 2 : attr.value + (attr.value + 1)
|
||||
let xp = duplicate(this.system.xp)
|
||||
let xp = foundry.utils.duplicate(this.system.xp)
|
||||
if (xp.total - xp.spent >= nextXP) {
|
||||
attr.value += 1
|
||||
xp.spent += nextXP
|
||||
this.update({ [`system.attributes.${key}`]: attr, [`system.xp`]: xp })
|
||||
this.addXPLog("attribute", key, nextXP, attr.value)
|
||||
} else {
|
||||
ui.notifications.warn("Pas assez de points d'expérience !")
|
||||
}
|
||||
@ -128,14 +299,15 @@ export class BoLActor extends Actor {
|
||||
|
||||
/* -------------------------------------------- */
|
||||
incAptitudeXP(key) {
|
||||
let apt = duplicate(this.system.aptitudes[key])
|
||||
let apt = foundry.utils.duplicate(this.system.aptitudes[key])
|
||||
if (apt) {
|
||||
let nextXP = (apt.value == -1) ? 1 : apt.value + 2
|
||||
let xp = duplicate(this.system.xp)
|
||||
let xp = foundry.utils.duplicate(this.system.xp)
|
||||
if (xp.total - xp.spent >= nextXP) {
|
||||
apt.value += 1
|
||||
xp.spent += nextXP
|
||||
this.update({ [`system.aptitudes.${key}`]: apt, [`system.xp`]: xp })
|
||||
this.addXPLog("aptitude", key, nextXP, apt.value)
|
||||
} else {
|
||||
ui.notifications.warn("Pas assez de points d'expérience !")
|
||||
}
|
||||
@ -145,13 +317,14 @@ export class BoLActor extends Actor {
|
||||
incCareerXP(itemId) {
|
||||
let career = this.items.get(itemId)
|
||||
if (career) {
|
||||
career = duplicate(career)
|
||||
career = foundry.utils.duplicate(career)
|
||||
let nextXP = career.system.rank + 1
|
||||
let xp = duplicate(this.system.xp)
|
||||
let xp = foundry.utils.duplicate(this.system.xp)
|
||||
if (xp.total - xp.spent >= nextXP) {
|
||||
xp.spent += nextXP
|
||||
this.update({ [`system.xp`]: xp })
|
||||
this.updateEmbeddedDocuments('Item', [{ _id: career._id, 'system.rank': career.system.rank + 1 }])
|
||||
this.addXPLog("career", career.name, nextXP, career.system.rank + 1)
|
||||
} else {
|
||||
ui.notifications.warn("Pas assez de points d'expérience !")
|
||||
}
|
||||
@ -165,7 +338,7 @@ export class BoLActor extends Actor {
|
||||
let updates = []
|
||||
|
||||
if (fightOption) {
|
||||
fightOption = duplicate(fightOption)
|
||||
fightOption = foundry.utils.duplicate(fightOption)
|
||||
if (fightOption.system.properties.activated) {
|
||||
state = false
|
||||
} else {
|
||||
@ -186,30 +359,38 @@ export class BoLActor extends Actor {
|
||||
/*-------------------------------------------- */
|
||||
get armorMalusValue() { // used for Fight Options
|
||||
for (let armor of this.armors) {
|
||||
if (armor.system.properties.armorQuality.includes("light")) {
|
||||
if (armor.system.properties.armorQuality?.includes("light")) {
|
||||
return 1
|
||||
}
|
||||
if (armor.system.properties.armorQuality.includes("medium")) {
|
||||
if (armor.system.properties.armorQuality?.includes("medium")) {
|
||||
return 2
|
||||
}
|
||||
if (armor.system.properties.armorQuality.includes("heavy")) {
|
||||
if (armor.system.properties.armorQuality?.includes("heavy")) {
|
||||
return 3
|
||||
}
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
get resources() {
|
||||
return Object.values(this.system.resources)
|
||||
}
|
||||
get boleffects() {
|
||||
return this.items.filter(i => i.type === "feature" && i.system.subtype === "boleffect")
|
||||
}
|
||||
get xplog() {
|
||||
return this.items.filter(i => i.type === "feature" && i.system.subtype === "xplog")
|
||||
}
|
||||
get horoscopes() {
|
||||
return this.items.filter(i => i.type === "feature" && i.system.subtype === "horoscope")
|
||||
}
|
||||
get boons() {
|
||||
return this.items.filter(i => i.type === "feature" && i.system.subtype === "boon");
|
||||
return foundry.utils.duplicate(this.items.filter(i => i.type === "feature" && i.system.subtype === "boon") || []);
|
||||
}
|
||||
get flaws() {
|
||||
return this.items.filter(i => i.type === "feature" && i.system.subtype === "flaw");
|
||||
return foundry.utils.duplicate(this.items.filter(i => i.type === "feature" && i.system.subtype === "flaw") || []);
|
||||
}
|
||||
get careers() {
|
||||
return duplicate( this.items.filter(i => i.type === "feature" && i.system.subtype === "career") || [])
|
||||
return foundry.utils.duplicate(this.items.filter(i => i.type === "feature" && i.system.subtype === "career") || [])
|
||||
}
|
||||
get origins() {
|
||||
return this.items.filter(i => i.type === "feature" && i.system.subtype === "origin");
|
||||
@ -233,7 +414,7 @@ export class BoLActor extends Actor {
|
||||
return this.items.filter(i => i.type === "item")
|
||||
}
|
||||
get equipmentCreature() {
|
||||
return this.items.filter(i => i.type === "item" && i.system.category === "equipment" && (( i.system.subtype === "weapon" && i.system.properties.natural === true) || (i.system.subtype === "armor")) )
|
||||
return this.items.filter(i => i.type === "item" && i.system.category === "equipment" && ((i.system.subtype === "weapon" && i.system.properties.natural === true) || (i.system.subtype === "armor")))
|
||||
}
|
||||
get armors() {
|
||||
return this.items.filter(i => i.type === "item" && i.system.category === "equipment" && i.system.subtype === "armor");
|
||||
@ -244,9 +425,11 @@ export class BoLActor extends Actor {
|
||||
get shields() {
|
||||
return this.items.filter(i => i.type === "item" && i.system.category === "equipment" && i.system.subtype === "shield");
|
||||
}
|
||||
|
||||
get vehicleWeapons() {
|
||||
return this.items.filter(i => i.type === "item" && i.system.category === "vehicleweapon")
|
||||
}
|
||||
get weapons() {
|
||||
return this.items.filter(i => i.type === "item" && i.system.category === "equipment" && i.system.subtype === "weapon");
|
||||
return this.items.filter(i => i.type === "item" && i.system.category === "equipment" && i.system.subtype === "weapon")
|
||||
}
|
||||
get protections() {
|
||||
return this.armors.concat(this.helms).concat(this.shields)
|
||||
@ -288,26 +471,24 @@ export class BoLActor extends Actor {
|
||||
}
|
||||
|
||||
get bonusBoons() {
|
||||
return this.items.filter(i => i.type === "feature" && i.system.subtype === "boon" && i.system.properties.isbonusdice);
|
||||
let boons = this.items.filter(i => i.type === "feature" && i.system.subtype === "boon" && i.system.properties.isbonusdice)
|
||||
return foundry.utils.duplicate(boons || [])
|
||||
}
|
||||
get malusFlaws() {
|
||||
return this.items.filter(i => i.type === "feature" && i.system.subtype === "flaw" && i.system.properties.ismalusdice);
|
||||
return foundry.utils.duplicate(this.items.filter(i => i.type === "feature" && i.system.subtype === "flaw" && i.system.properties.ismalusdice) || []);
|
||||
}
|
||||
|
||||
isSorcerer() {
|
||||
if (this.careers.find(item => item.system.properties.sorcerer == true))
|
||||
return true
|
||||
return false
|
||||
return (this.careers.find(item => item.system.properties.sorcerer))
|
||||
}
|
||||
isAlchemist() {
|
||||
if (this.careers.find(item => item.system.properties.alchemist == true))
|
||||
return true
|
||||
return false
|
||||
return (this.careers.find(item => item.system.properties.alchemist))
|
||||
}
|
||||
isAstrologer() {
|
||||
return (this.careers.find(item => item.system.properties.astrologer))
|
||||
}
|
||||
isPriest() {
|
||||
if (this.careers.find(item => item.system.properties.priest == true))
|
||||
return true
|
||||
return false
|
||||
return (this.careers.find(item => item.system.properties.priest))
|
||||
}
|
||||
|
||||
/*-------------------------------------------- */
|
||||
@ -322,6 +503,23 @@ export class BoLActor extends Actor {
|
||||
return ppCostArmor
|
||||
}
|
||||
/*-------------------------------------------- */
|
||||
getDamageAttributeValue(attrDamage) {
|
||||
let attrDamageValue = 0
|
||||
if (attrDamage.includes("vigor")) {
|
||||
attrDamageValue = this.system.attributes.vigor.value
|
||||
if (attrDamage.includes("half")) {
|
||||
attrDamageValue = Math.floor(attrDamageValue / 2)
|
||||
}
|
||||
// Apply vigor effects
|
||||
for (let i of this.items) {
|
||||
if (i.type === "feature" && i.system.subtype === "boleffect" && i.system.properties.identifier.includes("vigor")) {
|
||||
attrDamageValue += Number(i.system.properties.modifier)
|
||||
}
|
||||
}
|
||||
}
|
||||
return attrDamageValue
|
||||
}
|
||||
/*-------------------------------------------- */
|
||||
getArmorAgiMalus() {
|
||||
let malusAgi = 0
|
||||
for (let armor of this.protections) {
|
||||
@ -346,7 +544,7 @@ export class BoLActor extends Actor {
|
||||
spendPowerPoint(ppCost) {
|
||||
let newPP = this.system.resources.power.value - ppCost
|
||||
newPP = (newPP < 0) ? 0 : newPP
|
||||
this.update({ 'data.resources.power.value': newPP })
|
||||
this.update({ 'system.resources.power.value': newPP })
|
||||
return newPP
|
||||
}
|
||||
|
||||
@ -354,7 +552,89 @@ export class BoLActor extends Actor {
|
||||
resetAlchemyStatus(alchemyId) {
|
||||
let alchemy = this.items.get(alchemyId)
|
||||
if (alchemy) {
|
||||
this.updateEmbeddedDocuments('Item', [{ _id: alchemy.id, 'data.properties.pccurrent': 0 }])
|
||||
this.updateEmbeddedDocuments('Item', [{ _id: alchemy.id, 'system.properties.pccurrent': 0 }])
|
||||
}
|
||||
}
|
||||
|
||||
/*-------------------------------------------- */
|
||||
spentAstrologyPoints(points) {
|
||||
let astrology = foundry.utils.duplicate(this.system.resources.astrologypoints)
|
||||
astrology.value -= points
|
||||
astrology.value = Math.max(astrology.value, 0)
|
||||
this.update({ 'system.resources.astrologypoints': astrology })
|
||||
}
|
||||
|
||||
/*-------------------------------------------- */
|
||||
getHoroscopesBonus() {
|
||||
let astro = this.items.filter(it => it.type == "feature" && it.system.subtype == "horoscope" && !it.system.properties.ishoroscopemajor
|
||||
&& it.system.properties.horoscopeanswer == "favorable")
|
||||
return astro
|
||||
}
|
||||
/*-------------------------------------------- */
|
||||
getHoroscopesMalus() {
|
||||
let astro = this.items.filter(it => it.type == "feature" && it.system.subtype == "horoscope" && !it.system.properties.ishoroscopemajor
|
||||
&& it.system.properties.horoscopeanswer == "unfavorable")
|
||||
return astro
|
||||
}
|
||||
|
||||
/*-------------------------------------------- */
|
||||
manageHoroscope(rollData) {
|
||||
//Spent points
|
||||
this.spentAstrologyPoints(rollData.astrologyPointsCost)
|
||||
if (rollData.horoscopeType == "minor") {
|
||||
let horoscope = {
|
||||
name: "SITUATION A SPECIFIER", type: "feature",
|
||||
img: "icons/magic/perception/eye-ringed-glow-angry-large-red.webp",
|
||||
system: {
|
||||
subtype: "horoscope", properties: {
|
||||
ishoroscopemajor: false,
|
||||
horoscopeanswer: (rollData.isSuccess) ? "favorable" : "unfavorable",
|
||||
rank: rollData.careerBonus
|
||||
}
|
||||
}
|
||||
}
|
||||
this.createEmbeddedDocuments('Item', [horoscope])
|
||||
}
|
||||
if (rollData.horoscopeType == "major") {
|
||||
let actorHoroscope = this
|
||||
if (rollData.targetId) {
|
||||
let token = game.scenes.current.tokens.get(rollData.targetId)
|
||||
actorHoroscope = token.actor
|
||||
}
|
||||
if (rollData.isSuccess) {
|
||||
actorHoroscope.addHeroPoints(1)
|
||||
} else {
|
||||
actorHoroscope.subHeroPoints(1)
|
||||
}
|
||||
rollData.horoscopeName = actorHoroscope.name
|
||||
}
|
||||
if (rollData.horoscopeType == "majorgroup") {
|
||||
let rID = foundry.utils.randomID(16)
|
||||
let horoscopes = foundry.utils.duplicate(game.settings.get("bol", "horoscope-group"))
|
||||
horoscopes[rID] = {
|
||||
id: rID,
|
||||
name: game.i18n.localize("BOL.ui.groupHoroscope") + this.name,
|
||||
maxDice: rollData.careerBonus,
|
||||
availableDice: rollData.careerBonus,
|
||||
type: (rollData.isSuccess) ? "bonus" : "malus"
|
||||
}
|
||||
game.settings.set("bol", "horoscope-group", horoscopes)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/*-------------------------------------------- */
|
||||
getAstrologyPoints() {
|
||||
return this.system.resources.astrologypoints.value
|
||||
}
|
||||
/*-------------------------------------------- */
|
||||
removeHoroscopeMinor(rollData) {
|
||||
let toDel = []
|
||||
for (let horo of rollData.selectedHoroscope) {
|
||||
toDel.push(horo._id)
|
||||
}
|
||||
if (toDel.length > 0) {
|
||||
this.deleteEmbeddedDocuments('Item', toDel)
|
||||
}
|
||||
}
|
||||
|
||||
@ -362,22 +642,29 @@ export class BoLActor extends Actor {
|
||||
async spendAlchemyPoint(alchemyId, pcCost) {
|
||||
let alchemy = this.items.get(alchemyId)
|
||||
if (alchemy) {
|
||||
pcCost = Number(pcCost) ?? 0
|
||||
pcCost = Number(pcCost) || 0
|
||||
if (this.system.resources.alchemypoints.value >= pcCost) {
|
||||
let newPC = this.system.resources.alchemypoints.value - pcCost
|
||||
newPC = (newPC < 0) ? 0 : newPC
|
||||
this.update({ 'data.resources.alchemypoints.value': newPC })
|
||||
newPC = alchemy.system.properties.pccurrent + pcCost
|
||||
await this.updateEmbeddedDocuments('Item', [{ _id: alchemy.id, 'data.properties.pccurrent': newPC }])
|
||||
await this.updateEmbeddedDocuments('Item', [{ _id: alchemy.id, 'system.properties.pccurrent': newPC }])
|
||||
} else {
|
||||
ui.notifications.warn("Plus assez de Points de Création !")
|
||||
ui.notifications.warn(game.i18n.localize("BOL.ui.nomorealchemypoints"))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*-------------------------------------------- */
|
||||
getAstrologerBonus() {
|
||||
let astrologer = this.careers.find(item => item.system.properties.astrologer)
|
||||
if (astrologer) {
|
||||
return astrologer.system.rank
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
/*-------------------------------------------- */
|
||||
getAlchemistBonus() {
|
||||
let sorcerer = this.careers.find(item => item.system.properties.alchemist == true)
|
||||
let sorcerer = this.careers.find(item => item.system.properties.alchemist)
|
||||
if (sorcerer) {
|
||||
return sorcerer.system.rank
|
||||
}
|
||||
@ -385,7 +672,7 @@ export class BoLActor extends Actor {
|
||||
}
|
||||
/*-------------------------------------------- */
|
||||
getSorcererBonus() {
|
||||
let sorcerer = this.careers.find(item => item.system.properties.sorcerer == true)
|
||||
let sorcerer = this.careers.find(item => item.system.properties.sorcerer)
|
||||
if (sorcerer) {
|
||||
return sorcerer.system.rank
|
||||
}
|
||||
@ -394,26 +681,29 @@ export class BoLActor extends Actor {
|
||||
|
||||
/*-------------------------------------------- */
|
||||
heroReroll() {
|
||||
if (this.type == 'character') {
|
||||
if (this.type == 'character' || this.system.villainy == 'adversary') {
|
||||
return this.system.resources.hero.value > 0;
|
||||
} else {
|
||||
if (this.system.type == 'adversary') {
|
||||
return this.system.resources.hero.value > 0;
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
/*-------------------------------------------- */
|
||||
getHeroPoints() {
|
||||
if (this.type == 'character' || this.system.villainy == 'adversary') {
|
||||
return this.system.resources.hero.value
|
||||
}
|
||||
return 0
|
||||
}
|
||||
/*-------------------------------------------- */
|
||||
getResourcesFromType() {
|
||||
let resources = {};
|
||||
if (this.type == 'encounter') {
|
||||
resources['hp'] = this.system.resources.hp;
|
||||
if (this.system.type != 'base') {
|
||||
if (this.system.chartype != 'base') {
|
||||
resources['faith'] = this.system.resources.faith
|
||||
resources['power'] = this.system.resources.power
|
||||
}
|
||||
if (this.system.type == 'adversary') {
|
||||
resources['hero'] = duplicate(this.system.resources.hero)
|
||||
if (this.system.chartype == 'adversary' || this.system.chartype == 'creature') {
|
||||
resources['hero'] = foundry.utils.duplicate(this.system.resources.hero)
|
||||
resources['hero'].label = "BOL.resources.villainy"
|
||||
}
|
||||
} else {
|
||||
@ -463,6 +753,11 @@ export class BoLActor extends Actor {
|
||||
"label": "BOL.featureSubtypes.gods",
|
||||
"ranked": false,
|
||||
"items": this.godsfaith
|
||||
},
|
||||
"boleffects": {
|
||||
"label": "BOL.featureSubtypes.effects",
|
||||
"ranked": false,
|
||||
"items": this.boleffects
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -478,6 +773,15 @@ export class BoLActor extends Actor {
|
||||
"options": false,
|
||||
"items": this.melee
|
||||
},
|
||||
"natural": {
|
||||
"label": "BOL.combatCategory.natural",
|
||||
"weapon": true,
|
||||
"protection": false,
|
||||
"blocking": false,
|
||||
"ranged": false,
|
||||
"options": false,
|
||||
"items": this.natural
|
||||
},
|
||||
"ranged": {
|
||||
"label": "BOL.combatCategory.ranged",
|
||||
"weapon": true,
|
||||
@ -517,28 +821,6 @@ export class BoLActor extends Actor {
|
||||
}
|
||||
}
|
||||
|
||||
buildCombatCreature() {
|
||||
return {
|
||||
"natural": {
|
||||
"label": "BOL.combatCategory.natural",
|
||||
"weapon": true,
|
||||
"protection": false,
|
||||
"blocking": false,
|
||||
"ranged": false,
|
||||
"options": false,
|
||||
"items": this.natural
|
||||
},
|
||||
"protections": {
|
||||
"label": "BOL.combatCategory.protections",
|
||||
"weapon": false,
|
||||
"protection": true,
|
||||
"blocking": false,
|
||||
"ranged": false,
|
||||
"options": false,
|
||||
"items": this.protections
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
/*-------------------------------------------- */
|
||||
buildRollList() {
|
||||
@ -558,33 +840,198 @@ export class BoLActor extends Actor {
|
||||
|
||||
/*-------------------------------------------- */
|
||||
buildListeActions() {
|
||||
return this.melee.concat(this.ranged).concat(this.natural)
|
||||
return this.melee.concat(this.ranged).concat(this.natural).concat(this.fightoptions)
|
||||
}
|
||||
|
||||
/*-------------------------------------------- */
|
||||
async manageHealthState() {
|
||||
let hpID = "lastHP" + this.id
|
||||
let lastHP = await this.getFlag("world", hpID)
|
||||
if (lastHP != this.system.resources.hp.value && game.user.isGM ) { // Only GM sends this
|
||||
if (lastHP != this.system.resources.hp.value && game.user.isGM) { // Only GM sends this
|
||||
await this.setFlag("world", hpID, this.system.resources.hp.value)
|
||||
let prone = this.effects.find(ef => ef.name == game.i18n.localize("EFFECT.StatusProne"))
|
||||
let dead = this.effects.find(ef => ef.name == game.i18n.localize("EFFECT.StatusDead"))
|
||||
if (this.system.resources.hp.value <= 0) {
|
||||
if (!prone) {
|
||||
await this.createEmbeddedDocuments("ActiveEffect", [
|
||||
{ name: game.i18n.localize('EFFECT.StatusProne'), icon: 'icons/svg/falling.svg', statuses: 'prone' }
|
||||
])
|
||||
}
|
||||
if (this.system.resources.hp.value < -5 && !dead) {
|
||||
await this.createEmbeddedDocuments("ActiveEffect", [
|
||||
{ name: game.i18n.localize('EFFECT.StatusDead'), icon: 'icons/svg/skull.svg', statuses: 'dead' }
|
||||
])
|
||||
}
|
||||
ChatMessage.create({
|
||||
alias: this.name,
|
||||
whisper: BoLUtility.getWhisperRecipientsAndGMs(this.name),
|
||||
content: await renderTemplate('systems/bol/templates/chat/chat-vitality-zero.hbs', { name: this.name, img: this.img, hp: this.system.resources.hp.value })
|
||||
content: await renderTemplate('systems/bol/templates/chat/chat-vitality-zero.hbs', { name: this.name, img: this.img, hp: this.system.resources.hp.value, isHeroAdversary: this.isHeroAdversary() })
|
||||
})
|
||||
} else {
|
||||
if (prone) {
|
||||
await this.deleteEmbeddedDocuments("ActiveEffect", [prone.id])
|
||||
}
|
||||
if (dead) {
|
||||
await this.deleteEmbeddedDocuments("ActiveEffect", [dead.id])
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*-------------------------------------------- */
|
||||
registerInit(initScore, isCritical, isFumble) {
|
||||
this.update({ 'system.combat.lastinit': initScore, 'system.combat.iscritical': isCritical, 'system.combat.isfumble': isFumble })
|
||||
async registerInit(rollData) {
|
||||
rollData.actor = undefined // Cleanup if present
|
||||
await this.setFlag("world", "last-initiative", rollData)
|
||||
}
|
||||
|
||||
/*-------------------------------------------- */
|
||||
getLastInitData() {
|
||||
return this.system.combat
|
||||
storeVitaliteCombat() {
|
||||
this.setFlag("world", "vitalite-before-combat", foundry.utils.duplicate(this.system.resources.hp))
|
||||
}
|
||||
/*-------------------------------------------- */
|
||||
async displayRecuperation() {
|
||||
let previousHP = this.getFlag("world", "vitalite-before-combat")
|
||||
let lossHP = previousHP.value - this.system.resources.hp.value
|
||||
//console.log(">>>>> RECUP INFO", previousHP, this.system.resources.hp.value)
|
||||
if (previousHP && lossHP > 0 && this.system.resources.hp.value > 0) {
|
||||
let msg = await ChatMessage.create({
|
||||
alias: this.name,
|
||||
whisper: BoLUtility.getWhisperRecipientsAndGMs(this.name),
|
||||
content: await renderTemplate('systems/bol/templates/chat/chat-recup-information.hbs', {
|
||||
name: this.name,
|
||||
img: this.img,
|
||||
actorId: this.id,
|
||||
lossHP: lossHP,
|
||||
recupHP: Math.ceil(lossHP / 2)
|
||||
})
|
||||
})
|
||||
}
|
||||
this.unsetFlag("world", "vitalite-before-combat")
|
||||
}
|
||||
/*-------------------------------------------- */
|
||||
async applyRecuperation(recupHP) {
|
||||
let hp = foundry.utils.duplicate(this.system.resources.hp)
|
||||
//console.log("RECUP !!!!", hp, recupHP)
|
||||
hp.value += Number(recupHP)
|
||||
hp.value = Math.min(hp.value, hp.max)
|
||||
this.update({ 'system.resources.hp': hp })
|
||||
let msg = await ChatMessage.create({
|
||||
alias: this.name,
|
||||
whisper: BoLUtility.getWhisperRecipientsAndGMs(this.name),
|
||||
content: game.i18n.format("BOL.chat.inforecup", { name: this.name, recupHP: recupHP })
|
||||
})
|
||||
}
|
||||
|
||||
/*-------------------------------------------- */
|
||||
clearInitiative() {
|
||||
this.unsetFlag("world", "last-initiative")
|
||||
}
|
||||
|
||||
/*-------------------------------------------- */
|
||||
getSize() {
|
||||
if (this.system.details.size.length > 0 && game.bol.config.creatureSize[this.system.details.size]) {
|
||||
return game.bol.config.creatureSize[this.system.details.size].order
|
||||
}
|
||||
return game.bol.config.creatureSize["medium"].order // Medium size per default
|
||||
}
|
||||
/*-------------------------------------------- */
|
||||
checkNumeric(myObject) {
|
||||
if (myObject) {
|
||||
for (let key in myObject) {
|
||||
if (myObject[key].value === null || isNaN(myObject[key].value)) {
|
||||
myObject[key].value = 0
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*-------------------------------------------- */
|
||||
_preUpdate(data, options, userId) {
|
||||
if (data.system?.attributes) {
|
||||
this.checkNumeric(data.system.attributes)
|
||||
}
|
||||
if (data.system?.aptitudes) {
|
||||
this.checkNumeric(data.system.aptitudes)
|
||||
}
|
||||
if (data.system?.resources) {
|
||||
this.checkNumeric(data.system.resources)
|
||||
}
|
||||
// Apply changes in Horde size to Token width/height
|
||||
if (this.type == "horde") {
|
||||
if (data?.system?.hordesize) { // If horde size is changed}
|
||||
let newHP = data.system.hordesize * this.system.hordebasehp
|
||||
if (newHP != this.system.resources.hp.value) {
|
||||
data.system.resources = { hp: { value: newHP, max: newHP } } // Update HP
|
||||
}
|
||||
let tokenSize = this.getTokenSizeFromHordeSize(data?.system?.hordesize)
|
||||
if (this.isToken && (tokenSize !== this.token.width)) {
|
||||
this.token.update({ width: tokenSize, height: tokenSize })
|
||||
} else {
|
||||
if (tokenSize && (tokenSize !== this.prototypeToken.width)) {
|
||||
if (!foundry.utils.hasProperty(data, "prototypeToken.width")) {
|
||||
data.prototypeToken ||= {};
|
||||
data.prototypeToken.height = tokenSize;
|
||||
data.prototypeToken.width = tokenSize;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (data?.system?.hordebasehp) {
|
||||
let newHP = this.system.hordesize * data.system.hordebasehp
|
||||
if (newHP != this.system.resources.hp.value) {
|
||||
data.system.resources = { hp: { value: newHP, max: newHP } }
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
super._preUpdate(data, options, userId)
|
||||
}
|
||||
|
||||
/*-------------------------------------------- */
|
||||
getInitiativeRank(rollData = undefined, isCombat = false, combatData = undefined) {
|
||||
let fvttInit = 4 // Pietaille par defaut
|
||||
if (this.type == 'character') {
|
||||
fvttInit = 5
|
||||
if (!rollData) {
|
||||
if (isCombat) {
|
||||
if (game.user.isGM) {
|
||||
if (this.hasPlayerOwner) {
|
||||
game.socket.emit("system.bol", { name: "msg_request_init_roll", data: { actorId: this.id, combatData } })
|
||||
} else {
|
||||
BoLRoll.aptitudeCheck(this, "init", undefined, combatData);
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if (rollData.isLegendary) {
|
||||
fvttInit = 10
|
||||
} else if (rollData.isCritical) {
|
||||
fvttInit = 9
|
||||
} else if (rollData.isSuccess) {
|
||||
fvttInit = 8
|
||||
} else if (rollData.isFumble) {
|
||||
fvttInit = 3
|
||||
}
|
||||
}
|
||||
}
|
||||
if (this.getCharType() == 'adversary') {
|
||||
fvttInit = 7
|
||||
}
|
||||
if (this.getCharType() == 'tough') {
|
||||
fvttInit = 6
|
||||
}
|
||||
if (this.getCharType() == 'creature') {
|
||||
let mySize = this.getSize()
|
||||
let sizeSmall = game.bol.config.creatureSize["small"].order
|
||||
let sizeMedium = game.bol.config.creatureSize["medium"].order
|
||||
if (mySize >= sizeSmall && mySize <= sizeMedium) {
|
||||
fvttInit = 6
|
||||
}
|
||||
if (mySize > sizeMedium) {
|
||||
fvttInit = 7
|
||||
}
|
||||
}
|
||||
return fvttInit
|
||||
}
|
||||
|
||||
/*-------------------------------------------- */
|
||||
@ -593,11 +1040,29 @@ export class BoLActor extends Actor {
|
||||
newHeroP = (newHeroP < 0) ? 0 : newHeroP;
|
||||
await this.update({ 'system.resources.hero.value': newHeroP });
|
||||
}
|
||||
/*-------------------------------------------- */
|
||||
async addHeroPoints(nb) {
|
||||
let newHeroP = this.system.resources.hero.value + nb;
|
||||
newHeroP = (newHeroP < 0) ? 0 : newHeroP;
|
||||
await this.update({ 'system.resources.hero.value': newHeroP });
|
||||
}
|
||||
|
||||
/*-------------------------------------------- */
|
||||
incDecResources(target, value) {
|
||||
let newValue = this.system.resources[target].value + value
|
||||
this.update({ [`system.resources.${target}.value`]: newValue })
|
||||
}
|
||||
/*-------------------------------------------- */
|
||||
async sufferDamage(damage) {
|
||||
let updates = {}
|
||||
let newHP = this.system.resources.hp.value - damage
|
||||
await this.update({ 'system.resources.hp.value': newHP })
|
||||
updates['system.resources.hp.value'] = newHP
|
||||
if (this.type == "horde") {
|
||||
let newSize = Math.ceil(newHP / this.system.hordebasehp)
|
||||
updates['system.hordesize'] = newSize
|
||||
}
|
||||
await this.update(updates)
|
||||
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
@ -610,13 +1075,13 @@ export class BoLActor extends Actor {
|
||||
} else if (protect.system.subtype == 'armor') {
|
||||
if (BoLUtility.getRollArmor()) {
|
||||
if (!protect.system.properties.soak.formula || protect.system.properties.soak.formula == "") {
|
||||
ui.notifications.warn(`L'armure ${protect.name} n'a pas de formule pour la protection !`)
|
||||
ui.notifications.warn(game.i18n.localize("BOL.ui.armornoformula", protect.name))
|
||||
} else {
|
||||
formula += "+" + " max(" + protect.system.properties.soak.formula +",0)"
|
||||
formula += "+" + " max(" + protect.system.properties.soak.formula + ",0)"
|
||||
}
|
||||
} else {
|
||||
if (protect.system.properties.soak.value == undefined) {
|
||||
ui.notifications.warn(`L'armure ${protect.name} n'a pas de valeur fixe pour la protection !`)
|
||||
ui.notifications.warn(game.i18n.localize("BOL.ui.armornoformula", protect.name))
|
||||
} else {
|
||||
formula += "+ " + protect.system.properties.soak.value
|
||||
}
|
||||
@ -628,20 +1093,21 @@ export class BoLActor extends Actor {
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
rollProtection(itemId) {
|
||||
let armor = duplicate(this.items.get(itemId))
|
||||
async rollProtection(itemId) {
|
||||
let armor = foundry.utils.duplicate(this.items.get(itemId))
|
||||
if (armor) {
|
||||
let armorFormula = "max("+armor.system.properties.soak.formula + ", 0)"
|
||||
let armorFormula = "max(" + armor.system.properties.soak.formula + ", 0)"
|
||||
let rollArmor = new Roll(armorFormula)
|
||||
rollArmor.roll({ async: false }).toMessage()
|
||||
await rollArmor.roll()
|
||||
rollArmor.toMessage()
|
||||
}
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
rollWeaponDamage(itemId) {
|
||||
let weapon = duplicate(this.items.get(itemId))
|
||||
let weapon = foundry.utils.duplicate(this.items.get(itemId))
|
||||
if (weapon) {
|
||||
let r = new BoLDefaultRoll({ id: randomID(16), isSuccess: true, mode: "weapon", weapon: weapon, actorId: this.id, actor: this })
|
||||
let r = new BoLDefaultRoll({ id: foundry.utils.randomID(16), isSuccess: true, mode: "weapon", weapon: weapon, actorId: this.id, actor: this })
|
||||
r.setSuccess(true)
|
||||
r.rollDamage()
|
||||
}
|
||||
@ -651,7 +1117,7 @@ export class BoLActor extends Actor {
|
||||
toggleEquipItem(item) {
|
||||
const equipable = item.system.properties.equipable;
|
||||
if (equipable) {
|
||||
let itemData = duplicate(item);
|
||||
let itemData = foundry.utils.duplicate(item);
|
||||
itemData.system.worn = !itemData.system.worn;
|
||||
return item.update(itemData);
|
||||
}
|
||||
|
217
module/actor/horde-sheet.js
Normal file
@ -0,0 +1,217 @@
|
||||
/**
|
||||
* Extend the basic ActorSheet with some very simple modifications
|
||||
* @extends {ActorSheet}
|
||||
*/
|
||||
import { BoLRoll } from "../controllers/bol-rolls.js";
|
||||
import { BoLUtility } from "../system/bol-utility.js";
|
||||
|
||||
export class BoLHordeSheet extends ActorSheet {
|
||||
|
||||
/** @override */
|
||||
static get defaultOptions() {
|
||||
return foundry.utils.mergeObject(super.defaultOptions, {
|
||||
classes: ["bol", "sheet", "actor"],
|
||||
template: "systems/bol/templates/actor/horde-sheet.hbs",
|
||||
width: 860,
|
||||
height: 600,
|
||||
dragDrop: [{ dragSelector: ".items-list .item", dropSelector: null }],
|
||||
tabs: [{ navSelector: ".sheet-tabs", contentSelector: ".sheet-body", initial: "stats" }]
|
||||
});
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
|
||||
/** @override */
|
||||
activateListeners(html) {
|
||||
super.activateListeners(html);
|
||||
|
||||
function onLoad() {
|
||||
let logoSheet = BoLUtility.getLogoActorSheet()
|
||||
$(".bol-actor-form").css("backgroundImage",`url(${logoSheet})`)
|
||||
}
|
||||
// Setup everything onload
|
||||
$(function () { onLoad(); });
|
||||
|
||||
// Everything below here is only needed if the sheet is editable
|
||||
if (!this.options.editable) return;
|
||||
|
||||
// Add Inventory Item
|
||||
html.find('.item-create').click(this._onItemCreate.bind(this));
|
||||
|
||||
// Update Inventory Item
|
||||
html.find('.item-edit').click(ev => {
|
||||
const li = $(ev.currentTarget).parents(".item");
|
||||
const item = this.actor.items.get(li.data("itemId"));
|
||||
item.sheet.render(true);
|
||||
})
|
||||
// Equip/Unequip item
|
||||
html.find('.item-equip').click(this._onToggleEquip.bind(this));
|
||||
|
||||
html.find('.create_item').click(ev => {
|
||||
this.actor.createEmbeddedDocuments('Item', [{ name: "Nouvel Equipement", type: "item" }], { renderSheet: true });
|
||||
});
|
||||
|
||||
// Incr./Decr. career ranks
|
||||
html.find(".inc-dec-btns").click((ev) => {
|
||||
const li = $(ev.currentTarget).parents(".item");
|
||||
if (li) {
|
||||
const item = this.actor.items.get(li.data("itemId"));
|
||||
if (item) {
|
||||
const dataset = ev.currentTarget.dataset;
|
||||
const operator = dataset.operator;
|
||||
const target = dataset.target;
|
||||
const incr = parseInt(dataset.incr)
|
||||
const min = parseInt(dataset.min)
|
||||
const max = parseInt(dataset.max) || 10000
|
||||
let value = eval("item." + target)
|
||||
value = value || 0
|
||||
//console.log("IncDec", item, target, value, operator, min, max)
|
||||
if (operator === "minus") {
|
||||
if (value >= min + incr) value -= incr;
|
||||
else value = min;
|
||||
}
|
||||
if (operator === "plus") {
|
||||
if (value <= max - incr) value += incr;
|
||||
else value = max;
|
||||
}
|
||||
let update = { [`${target}`]: value };
|
||||
item.update(update);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
// Delete Inventory Item
|
||||
html.find('.item-delete').click(ev => {
|
||||
Dialog.confirm({
|
||||
title: "Suppression",
|
||||
content: `Vous êtes sûr de vouloir supprimer cet item ?`,
|
||||
yes: () => {
|
||||
const li = $(ev.currentTarget).parents(".item");
|
||||
this.actor.deleteEmbeddedDocuments("Item", [li.data("itemId")])
|
||||
li.slideUp(200, () => this.render(false));
|
||||
},
|
||||
no: () => { },
|
||||
defaultYes: false,
|
||||
});
|
||||
});
|
||||
|
||||
// Rollable abilities.
|
||||
html.find('.rollable').click(this._onRoll.bind(this));
|
||||
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
|
||||
/** @override */
|
||||
async getData(options) {
|
||||
const data = super.getData(options)
|
||||
let formData = foundry.utils.duplicate(data)
|
||||
|
||||
formData.config = game.bol.config
|
||||
formData.name = this.actor.name
|
||||
formData.img = this.actor.img
|
||||
formData.system = foundry.utils.duplicate(this.actor.system)
|
||||
formData.isGM = game.user.isGM
|
||||
formData.options = this.options
|
||||
formData.owner = this.document.isOwner
|
||||
formData.editScore = this.options.editScore
|
||||
formData.description = await TextEditor.enrichHTML(this.actor.system.description, {async: true})
|
||||
|
||||
formData.isGM = game.user.isGM
|
||||
|
||||
console.log("HORDE", formData)
|
||||
return formData;
|
||||
}
|
||||
/* -------------------------------------------- */
|
||||
|
||||
/**
|
||||
* Handle creating a new Owned Item for the actor using initial data defined in the HTML dataset
|
||||
* @param {Event} event The originating click event
|
||||
* @private
|
||||
*/
|
||||
_onItemCreate(event) {
|
||||
event.preventDefault();
|
||||
const header = event.currentTarget;
|
||||
// Get the type of item to create.
|
||||
const type = header.dataset.type;
|
||||
// Grab any data associated with this control.
|
||||
const data = foundry.utils.duplicate(header.dataset);
|
||||
// Initialize a default name.
|
||||
const name = `New ${type.capitalize()}`;
|
||||
// Prepare the item object.
|
||||
const itemData = {
|
||||
name: name,
|
||||
type: type,
|
||||
data: data
|
||||
};
|
||||
// Remove the type from the dataset since it's in the itemData.type prop.
|
||||
delete itemData.data["type"];
|
||||
|
||||
// Finally, create the item!
|
||||
return this.actor.createEmbeddedDocuments("Item", [itemData]);
|
||||
}
|
||||
|
||||
_onToggleEquip(event) {
|
||||
event.preventDefault();
|
||||
const li = $(event.currentTarget).closest(".item");
|
||||
const item = this.actor.items.get(li.data("itemId"));
|
||||
return this.actor.toggleEquipItem(item);
|
||||
}
|
||||
|
||||
/**
|
||||
* Handle clickable rolls.
|
||||
* @param {Event} event The originating click event
|
||||
* @private
|
||||
*/
|
||||
_onRoll(event) {
|
||||
event.preventDefault();
|
||||
const element = event.currentTarget
|
||||
const dataset = element.dataset
|
||||
const rollType = dataset.rollType
|
||||
const li = $(event.currentTarget).closest(".item")
|
||||
switch (rollType) {
|
||||
case "attribute":
|
||||
BoLRoll.attributeCheck(this.actor, dataset.key, event)
|
||||
break;
|
||||
case "aptitude":
|
||||
BoLRoll.aptitudeCheck(this.actor, dataset.key, event)
|
||||
break;
|
||||
case "weapon":
|
||||
BoLRoll.weaponCheck(this.actor, event)
|
||||
break;
|
||||
case "spell":
|
||||
BoLRoll.spellCheck(this.actor, event)
|
||||
break;
|
||||
case "alchemy":
|
||||
BoLRoll.alchemyCheck(this.actor, event)
|
||||
break;
|
||||
case "protection":
|
||||
this.actor.rollProtection(li.data("item-id"))
|
||||
break;
|
||||
case "damage":
|
||||
this.actor.rollWeaponDamage(li.data("item-id"))
|
||||
break;
|
||||
case "aptitudexp":
|
||||
this.actor.incAptitudeXP(dataset.key)
|
||||
break;
|
||||
case "attributexp":
|
||||
this.actor.incAttributeXP(dataset.key)
|
||||
break;
|
||||
case "careerxp":
|
||||
this.actor.incCareerXP( li.data("item-id"))
|
||||
break;
|
||||
|
||||
default: break;
|
||||
}
|
||||
}
|
||||
|
||||
/** @override */
|
||||
setPosition(options = {}) {
|
||||
const position = super.setPosition(options);
|
||||
const sheetBody = this.element.find(".sheet-body");
|
||||
const bodyHeight = position.height - 192;
|
||||
sheetBody.css("height", bodyHeight);
|
||||
return position;
|
||||
}
|
||||
}
|
228
module/actor/vehicle-sheet.js
Normal file
@ -0,0 +1,228 @@
|
||||
/**
|
||||
* Extend the basic ActorSheet with some very simple modifications
|
||||
* @extends {ActorSheet}
|
||||
*/
|
||||
import { BoLRoll } from "../controllers/bol-rolls.js";
|
||||
import { BoLUtility } from "../system/bol-utility.js";
|
||||
|
||||
export class BoLVehicleSheet extends ActorSheet {
|
||||
|
||||
/** @override */
|
||||
static get defaultOptions() {
|
||||
return foundry.utils.mergeObject(super.defaultOptions, {
|
||||
classes: ["bol", "sheet", "actor"],
|
||||
template: "systems/bol/templates/actor/vehicle-sheet.hbs",
|
||||
width: 860,
|
||||
height: 600,
|
||||
dragDrop: [{ dragSelector: ".items-list .item", dropSelector: null }],
|
||||
tabs: [{ navSelector: ".sheet-tabs", contentSelector: ".sheet-body", initial: "stats" }]
|
||||
});
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
|
||||
/** @override */
|
||||
activateListeners(html) {
|
||||
super.activateListeners(html);
|
||||
|
||||
function onLoad() {
|
||||
let logoSheet = BoLUtility.getLogoActorSheet()
|
||||
$(".bol-actor-form").css("backgroundImage",`url(${logoSheet})`)
|
||||
}
|
||||
// Setup everything onload
|
||||
$(function () { onLoad(); });
|
||||
|
||||
// Everything below here is only needed if the sheet is editable
|
||||
if (!this.options.editable) return;
|
||||
|
||||
// Add Inventory Item
|
||||
html.find('.item-create').click(this._onItemCreate.bind(this));
|
||||
|
||||
// Update Inventory Item
|
||||
html.find('.item-edit').click(ev => {
|
||||
const li = $(ev.currentTarget).parents(".item");
|
||||
const item = this.actor.items.get(li.data("itemId"));
|
||||
item.sheet.render(true);
|
||||
})
|
||||
// Equip/Unequip item
|
||||
html.find('.item-equip').click(this._onToggleEquip.bind(this));
|
||||
|
||||
html.find('.create_item').click(ev => {
|
||||
this.actor.createEmbeddedDocuments('Item', [{ name: "Nouvel Equipement", type: "item" }], { renderSheet: true });
|
||||
});
|
||||
|
||||
html.find(".toggle-fight-option").click((ev) => {
|
||||
const li = $(ev.currentTarget).parents(".item")
|
||||
this.actor.toggleFightOption(li.data("itemId"))
|
||||
})
|
||||
|
||||
html.find(".inc-dec-btns-alchemy").click((ev) => {
|
||||
const li = $(ev.currentTarget).parents(".item");
|
||||
this.actor.spendAlchemyPoint(li.data("itemId"), 1)
|
||||
})
|
||||
|
||||
// Incr./Decr. career ranks
|
||||
html.find(".inc-dec-btns").click((ev) => {
|
||||
const li = $(ev.currentTarget).parents(".item");
|
||||
if (li) {
|
||||
const item = this.actor.items.get(li.data("itemId"));
|
||||
if (item) {
|
||||
const dataset = ev.currentTarget.dataset;
|
||||
const operator = dataset.operator;
|
||||
const target = dataset.target;
|
||||
const incr = parseInt(dataset.incr)
|
||||
const min = parseInt(dataset.min)
|
||||
const max = parseInt(dataset.max) || 10000
|
||||
let value = eval("item." + target)
|
||||
value = value || 0
|
||||
//console.log("IncDec", item, target, value, operator, min, max)
|
||||
if (operator === "minus") {
|
||||
if (value >= min + incr) value -= incr;
|
||||
else value = min;
|
||||
}
|
||||
if (operator === "plus") {
|
||||
if (value <= max - incr) value += incr;
|
||||
else value = max;
|
||||
}
|
||||
let update = { [`${target}`]: value };
|
||||
item.update(update);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
// Delete Inventory Item
|
||||
html.find('.item-delete').click(ev => {
|
||||
Dialog.confirm({
|
||||
title: "Suppression",
|
||||
content: `Vous êtes sûr de vouloir supprimer cet item ?`,
|
||||
yes: () => {
|
||||
const li = $(ev.currentTarget).parents(".item");
|
||||
this.actor.deleteEmbeddedDocuments("Item", [li.data("itemId")])
|
||||
li.slideUp(200, () => this.render(false));
|
||||
},
|
||||
no: () => { },
|
||||
defaultYes: false,
|
||||
});
|
||||
});
|
||||
|
||||
// Rollable abilities.
|
||||
html.find('.rollable').click(this._onRoll.bind(this));
|
||||
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
|
||||
/** @override */
|
||||
async getData(options) {
|
||||
const data = super.getData(options)
|
||||
let formData = foundry.utils.duplicate(data)
|
||||
|
||||
formData.config = game.bol.config
|
||||
formData.name = this.actor.name
|
||||
formData.img = this.actor.img
|
||||
formData.system = foundry.utils.duplicate(this.actor.system)
|
||||
formData.weapons = this.actor.vehicleWeapons
|
||||
formData.isGM = game.user.isGM
|
||||
formData.options = this.options
|
||||
formData.owner = this.document.isOwner
|
||||
formData.editScore = this.options.editScore
|
||||
formData.description = await TextEditor.enrichHTML(this.actor.system.description, {async: true})
|
||||
|
||||
formData.isGM = game.user.isGM
|
||||
|
||||
console.log("VEHICLEDATA", formData)
|
||||
return formData;
|
||||
}
|
||||
/* -------------------------------------------- */
|
||||
|
||||
/**
|
||||
* Handle creating a new Owned Item for the actor using initial data defined in the HTML dataset
|
||||
* @param {Event} event The originating click event
|
||||
* @private
|
||||
*/
|
||||
_onItemCreate(event) {
|
||||
event.preventDefault();
|
||||
const header = event.currentTarget;
|
||||
// Get the type of item to create.
|
||||
const type = header.dataset.type;
|
||||
// Grab any data associated with this control.
|
||||
const data = foundry.utils.duplicate(header.dataset);
|
||||
// Initialize a default name.
|
||||
const name = `New ${type.capitalize()}`;
|
||||
// Prepare the item object.
|
||||
const itemData = {
|
||||
name: name,
|
||||
type: type,
|
||||
data: data
|
||||
};
|
||||
// Remove the type from the dataset since it's in the itemData.type prop.
|
||||
delete itemData.data["type"];
|
||||
|
||||
// Finally, create the item!
|
||||
return this.actor.createEmbeddedDocuments("Item", [itemData]);
|
||||
}
|
||||
|
||||
_onToggleEquip(event) {
|
||||
event.preventDefault();
|
||||
const li = $(event.currentTarget).closest(".item");
|
||||
const item = this.actor.items.get(li.data("itemId"));
|
||||
return this.actor.toggleEquipItem(item);
|
||||
}
|
||||
|
||||
/**
|
||||
* Handle clickable rolls.
|
||||
* @param {Event} event The originating click event
|
||||
* @private
|
||||
*/
|
||||
_onRoll(event) {
|
||||
event.preventDefault();
|
||||
const element = event.currentTarget
|
||||
const dataset = element.dataset
|
||||
const rollType = dataset.rollType
|
||||
const li = $(event.currentTarget).closest(".item")
|
||||
switch (rollType) {
|
||||
case "attribute":
|
||||
BoLRoll.attributeCheck(this.actor, dataset.key, event)
|
||||
break;
|
||||
case "aptitude":
|
||||
BoLRoll.aptitudeCheck(this.actor, dataset.key, event)
|
||||
break;
|
||||
case "weapon":
|
||||
BoLRoll.weaponCheck(this.actor, event)
|
||||
break;
|
||||
case "spell":
|
||||
BoLRoll.spellCheck(this.actor, event)
|
||||
break;
|
||||
case "alchemy":
|
||||
BoLRoll.alchemyCheck(this.actor, event)
|
||||
break;
|
||||
case "protection":
|
||||
this.actor.rollProtection(li.data("item-id"))
|
||||
break;
|
||||
case "damage":
|
||||
this.actor.rollWeaponDamage(li.data("item-id"))
|
||||
break;
|
||||
case "aptitudexp":
|
||||
this.actor.incAptitudeXP(dataset.key)
|
||||
break;
|
||||
case "attributexp":
|
||||
this.actor.incAttributeXP(dataset.key)
|
||||
break;
|
||||
case "careerxp":
|
||||
this.actor.incCareerXP( li.data("item-id"))
|
||||
break;
|
||||
|
||||
default: break;
|
||||
}
|
||||
}
|
||||
|
||||
/** @override */
|
||||
setPosition(options = {}) {
|
||||
const position = super.setPosition(options);
|
||||
const sheetBody = this.element.find(".sheet-body");
|
||||
const bodyHeight = position.height - 192;
|
||||
sheetBody.css("height", bodyHeight);
|
||||
return position;
|
||||
}
|
||||
}
|
@ -2,6 +2,8 @@
|
||||
// Import Modules
|
||||
import { BoLActor } from "./actor/actor.js"
|
||||
import { BoLActorSheet } from "./actor/actor-sheet.js"
|
||||
import { BoLVehicleSheet } from "./actor/vehicle-sheet.js"
|
||||
import { BoLHordeSheet } from "./actor/horde-sheet.js"
|
||||
import { BoLItem } from "./item/item.js"
|
||||
import { BoLItemSheet } from "./item/item-sheet.js"
|
||||
import { System, BOL } from "./system/config.js"
|
||||
@ -13,8 +15,8 @@ import { BoLUtility } from "./system/bol-utility.js"
|
||||
import { BoLCombatManager } from "./system/bol-combat.js"
|
||||
import { BoLTokenHud } from "./system/bol-action-hud.js"
|
||||
import { BoLHotbar } from "./system/bol-hotbar.js"
|
||||
import { BoLAdventureGenerator } from "./system/bol-adventure-generator.js"
|
||||
import { BoLCommands} from "./system/bol-commands.js"
|
||||
import { BoLCommands } from "./system/bol-commands.js"
|
||||
import { BoLRoll } from "./controllers/bol-rolls.js"
|
||||
|
||||
/* -------------------------------------------- */
|
||||
Hooks.once('init', async function () {
|
||||
@ -23,25 +25,26 @@ Hooks.once('init', async function () {
|
||||
BoLActor,
|
||||
BoLItem,
|
||||
BoLHotbar,
|
||||
BoLRoll,
|
||||
BoLUtility,
|
||||
macros: Macros,
|
||||
config: BOL
|
||||
};
|
||||
|
||||
|
||||
// Game socket
|
||||
game.socket.on("system.bol", sockmsg => {
|
||||
BoLUtility.onSocketMessage(sockmsg);
|
||||
})
|
||||
|
||||
|
||||
/**
|
||||
* Set an initiative formula for the system
|
||||
* @type {String}
|
||||
*/
|
||||
CONFIG.Combat.initiative = {
|
||||
formula: "2d6+@attributes.mind.value+@aptitudes.init.value",
|
||||
decimals: 3
|
||||
decimals: 2
|
||||
};
|
||||
|
||||
|
||||
// Define custom Entity classes
|
||||
CONFIG.Actor.documentClass = BoLActor;
|
||||
CONFIG.Item.documentClass = BoLItem;
|
||||
@ -49,7 +52,10 @@ Hooks.once('init', async function () {
|
||||
|
||||
// Register sheet application classes
|
||||
Actors.unregisterSheet("core", ActorSheet);
|
||||
Actors.registerSheet("bol", BoLActorSheet, { makeDefault: true });
|
||||
Actors.registerSheet("bol", BoLActorSheet, { types: ["character", "encounter"], makeDefault: true })
|
||||
Actors.registerSheet("bol", BoLVehicleSheet, { types: ["vehicle"], makeDefault: true })
|
||||
Actors.registerSheet("bol", BoLHordeSheet, { types: ["horde"], makeDefault: true })
|
||||
|
||||
Items.unregisterSheet("core", ItemSheet);
|
||||
Items.registerSheet("bol", BoLItemSheet, { makeDefault: true });
|
||||
|
||||
@ -58,7 +64,6 @@ Hooks.once('init', async function () {
|
||||
BoLTokenHud.init()
|
||||
BoLHotbar.init()
|
||||
BoLCommands.init()
|
||||
BoLAdventureGenerator.init()
|
||||
|
||||
// Preload Handlebars Templates
|
||||
await preloadHandlebarsTemplates();
|
||||
@ -69,50 +74,58 @@ Hooks.once('init', async function () {
|
||||
// Register hooks
|
||||
registerHooks()
|
||||
|
||||
if (typeof Babele !== 'undefined') {
|
||||
Babele.get().setSystemTranslationsDir("compendiums");
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
/* -------------------------------------------- */
|
||||
// Register world usage statistics
|
||||
function registerUsageCount( registerKey ) {
|
||||
if ( game.user.isGM ) {
|
||||
game.settings.register(registerKey, "world-key", {
|
||||
name: "Unique world key",
|
||||
scope: "world",
|
||||
config: false,
|
||||
default: "",
|
||||
type: String
|
||||
});
|
||||
|
||||
let worldKey = game.settings.get(registerKey, "world-key")
|
||||
if ( worldKey == undefined || worldKey == "" ) {
|
||||
worldKey = randomID(32)
|
||||
game.settings.set(registerKey, "world-key", worldKey )
|
||||
}
|
||||
// Simple API counter
|
||||
let regURL = `https://www.uberwald.me/fvtt_appcount/count.php?name="${registerKey}"&worldKey="${worldKey}"&version="${game.release.generation}.${game.release.build}"&system="${game.system.id}"&systemversion="${game.system.version}"`
|
||||
$.ajax(regURL)
|
||||
}
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
function welcomeMessage() {
|
||||
ChatMessage.create({
|
||||
user: game.user.id,
|
||||
whisper: [game.user.id],
|
||||
content: `<div id="welcome-message-pegasus"><span class="rdd-roll-part">
|
||||
content: `<div id="welcome-message-bol"><span class="rdd-roll-part">
|
||||
<strong>` + game.i18n.localize("BOL.chat.welcome1") + `</strong><p>` +
|
||||
game.i18n.localize("BOL.chat.welcome2") + "<p>" +
|
||||
game.i18n.localize("BOL.chat.welcome3") + "<p>" +
|
||||
game.i18n.localize("BOL.chat.welcome4") + "</p>" +
|
||||
game.i18n.localize("BOL.chat.welcome5") + "</p>"
|
||||
} )
|
||||
game.i18n.localize("BOL.chat.welcome2") + "<p>" +
|
||||
game.i18n.localize("BOL.chat.welcome3") + "<p>" +
|
||||
game.i18n.localize("BOL.chat.welcome4") + "</p>" +
|
||||
game.i18n.localize("BOL.chat.welcome5") + "<br>" +
|
||||
game.i18n.localize("BOL.chat.welcome6")
|
||||
})
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
Hooks.once('ready', async function () {
|
||||
registerUsageCount('bol')
|
||||
|
||||
BoLUtility.ready()
|
||||
|
||||
import("https://www.uberwald.me/fvtt_appcount/count-class-ready.js").then(moduleCounter => {
|
||||
console.log("ClassCounter loaded", moduleCounter)
|
||||
moduleCounter.ClassCounter.registerUsageCount()
|
||||
}).catch(err =>
|
||||
console.log("No stats available, giving up.")
|
||||
)
|
||||
|
||||
welcomeMessage()
|
||||
|
||||
// User warning
|
||||
if (!game.user.isGM && game.user.character == undefined) {
|
||||
ui.notifications.info(game.i18n.localize("BOL.chat.pcwarning"));
|
||||
ChatMessage.create({
|
||||
content: game.i18n.localize("BOL.chat.pcwarningmsg") + game.user.name,
|
||||
user: game.user._id
|
||||
});
|
||||
}
|
||||
if (!game.user.isGM && game.user.character && !game.user.character.prototypeToken.actorLink) {
|
||||
ui.notifications.info(game.i18n.localize("BOL.chat.pcnotlinked"));
|
||||
ChatMessage.create({
|
||||
content: game.i18n.localize("BOL.chat.pcnotlinkedmsg") + game.user.name,
|
||||
user: game.user._id
|
||||
});
|
||||
}
|
||||
|
||||
})
|
||||
|
||||
|
||||
|
@ -7,7 +7,7 @@ export class BoLRoll {
|
||||
|
||||
/* -------------------------------------------- */
|
||||
static options() {
|
||||
return { classes: ["bol", "dialog"], width: 480, height: 540 };
|
||||
return { classes: ["bol", "dialog"], width: 480, height: 'fit-content' };
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
@ -16,55 +16,130 @@ export class BoLRoll {
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
static attributeCheck(actor, key) {
|
||||
static updateApplicableEffects(rollData) {
|
||||
let appEffects = []
|
||||
for (let effect of rollData.bolEffects) {
|
||||
if ( (effect.system.properties.identifier == "always") ||
|
||||
(effect.system.properties.identifier.includes(rollData.attribute.key)) ||
|
||||
(rollData.aptitude && effect.system.properties.identifier.includes(rollData.aptitude.key)) ){
|
||||
appEffects.push(effect)
|
||||
}
|
||||
}
|
||||
return appEffects
|
||||
}
|
||||
|
||||
let attribute = eval(`actor.system.attributes.${key}`)
|
||||
let label = (attribute.label) ? game.i18n.localize(attribute.label) : null
|
||||
let description = game.i18n.localize('BOL.ui.attributeCheck') + " - " + game.i18n.localize(attribute.label)
|
||||
/* -------------------------------------------- */
|
||||
static buildHoroscopeGroupList() {
|
||||
let horoscopes = game.settings.get("bol", "horoscope-group")
|
||||
let horoList = [{ id: -1, name: "Aucun", type: "malus", nbDice: 0 }]
|
||||
for (let id in horoscopes) {
|
||||
let horo = horoscopes[id]
|
||||
for (let i = 0; i < horo.availableDice; i++) {
|
||||
horoList.push({ id: id, name: horo.name, type: horo.type, nbDice: i + 1 })
|
||||
}
|
||||
}
|
||||
return horoList
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
static getCommonRollData(actor, mode, attribute, aptitude = undefined) {
|
||||
|
||||
let rollData = {
|
||||
mode: "attribute",
|
||||
mode: mode,
|
||||
actorId: actor.id,
|
||||
tokenId: actor.token?.id,
|
||||
img: actor.img,
|
||||
attribute: attribute,
|
||||
attrValue: attribute.value,
|
||||
aptValue: 0,
|
||||
label: label,
|
||||
careerBonus: 0,
|
||||
description: description,
|
||||
horoscopeBonus: 0,
|
||||
horoscopeMalus: 0,
|
||||
selectedHoroscope: [],
|
||||
armorAgiMalus: actor.getArmorAgiMalus(),
|
||||
armorInitMalus: actor.getArmorInitMalus(),
|
||||
mod: 0
|
||||
horoscopeBonusList: actor.getHoroscopesBonus(),
|
||||
horoscopeMalusList: actor.getHoroscopesMalus(),
|
||||
config: game.bol.config,
|
||||
adv: "0",
|
||||
mod: 0,
|
||||
modRanged: 0,
|
||||
bolEffects: actor.boleffects,
|
||||
horoscopeGroupList: this.buildHoroscopeGroupList()
|
||||
}
|
||||
if (aptitude) {
|
||||
rollData.aptitude = aptitude
|
||||
rollData.aptValue = aptitude.value
|
||||
}
|
||||
rollData.bolApplicableEffects = this.updateApplicableEffects(rollData)
|
||||
return rollData
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
static attributeCheck(actor, key="vigor", event=undefined, combatData=undefined) {
|
||||
|
||||
let attribute = eval(`actor.system.attributes.${key}`)
|
||||
|
||||
let rollData = this.getCommonRollData(actor, "attribute", attribute)
|
||||
rollData.description = game.i18n.localize('BOL.ui.attributeCheck') + " - " + game.i18n.localize(attribute.label)
|
||||
rollData.label = (attribute.label) ? game.i18n.localize(attribute.label) : null
|
||||
|
||||
console.log(">>>>>>>>>>", rollData, actor)
|
||||
return this.displayRollDialog(rollData)
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
static aptitudeCheck(actor, key) {
|
||||
static aptitudeCheck(actor, key="init", event=undefined, combatData=undefined) {
|
||||
|
||||
let aptitude = eval(`actor.system.aptitudes.${key}`)
|
||||
let attrKey = this.getDefaultAttribute(key)
|
||||
let attribute = eval(`actor.system.attributes.${attrKey}`)
|
||||
|
||||
let label = (aptitude.label) ? game.i18n.localize(aptitude.label) : null;
|
||||
let description = game.i18n.localize('BOL.ui.aptitudeCheck') + " - " + game.i18n.localize(aptitude.label);
|
||||
return this.displayRollDialog(
|
||||
{
|
||||
mode: "aptitude",
|
||||
actorId: actor.id,
|
||||
img: actor.img,
|
||||
attribute: attribute,
|
||||
aptitude: aptitude,
|
||||
attrValue: attribute.value,
|
||||
aptValue: aptitude.value,
|
||||
armorAgiMalus: actor.getArmorAgiMalus(),
|
||||
armorInitMalus: actor.getArmorInitMalus(),
|
||||
label: label,
|
||||
careerBonus: 0,
|
||||
description: description,
|
||||
mod: 0
|
||||
let rollData = this.getCommonRollData(actor, "aptitude", attribute, aptitude)
|
||||
|
||||
rollData.label = (aptitude.label) ? game.i18n.localize(aptitude.label) : null
|
||||
rollData.description = game.i18n.localize('BOL.ui.aptitudeCheck') + " - " + game.i18n.localize(aptitude.label)
|
||||
rollData.combatData = combatData // For initiative mainly
|
||||
|
||||
return this.displayRollDialog(rollData)
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
static async detectDistance(weapon, target) {
|
||||
let visible, dist
|
||||
if (target && (weapon.system.properties.ranged || weapon.system.properties.throwing)) {
|
||||
console.log("target", target, weapon)
|
||||
visible = canvas.effects.visibility.testVisibility(target.center, { object: _token })
|
||||
dist = Number(canvas.grid.measureDistances([{ ray: new Ray(_token.center, target.center) }], { gridSpaces: false })).toFixed(2)
|
||||
let range = Number(weapon.system.properties.range)
|
||||
let rangeMsg = "BOL.chat.rangeout"
|
||||
if (dist <= range) {
|
||||
rangeMsg = "BOL.chat.range0"
|
||||
} else if (dist < range * 2) {
|
||||
rangeMsg = "BOL.chat.range1"
|
||||
} else if (dist < range * 3) {
|
||||
rangeMsg = "BOL.chat.range2"
|
||||
} else if (dist < range * 4) {
|
||||
rangeMsg = "BOL.chat.range3"
|
||||
} else if (dist < range * 5) {
|
||||
rangeMsg = "BOL.chat.range4"
|
||||
} else if (dist < range * 6) {
|
||||
rangeMsg = "BOL.chat.range5"
|
||||
} else if (dist < range * 7) {
|
||||
rangeMsg = "BOL.chat.range6"
|
||||
}
|
||||
ChatMessage.create({
|
||||
content: await renderTemplate('systems/bol/templates/chat/chat-info-range.hbs', {
|
||||
weapon: weapon,
|
||||
attackerName: _token.actor.name,
|
||||
defenderName: target.actor.name,
|
||||
weaponRange: weapon.system.properties.range,
|
||||
visible: visible,
|
||||
distance: dist,
|
||||
rangeMsg: rangeMsg
|
||||
})
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
@ -76,36 +151,30 @@ export class BoLRoll {
|
||||
let attribute = eval(`actor.system.attributes.${weaponData.properties.attackAttribute}`)
|
||||
let aptitude = eval(`actor.system.aptitudes.${weaponData.properties.attackAptitude}`)
|
||||
|
||||
let rollData = this.getCommonRollData(actor, "weapon", attribute, aptitude)
|
||||
|
||||
// Compute distance
|
||||
this.detectDistance(weapon, target)
|
||||
|
||||
// Manage specific case
|
||||
let fightOption = actor.getActiveFightOption()
|
||||
if (fightOption && fightOption.system.fightoptiontype == "fulldefense") {
|
||||
if (fightOption && fightOption.system.properties.fightoptiontype == "fulldefense") {
|
||||
ui.notifications.warn(`{{actor.name}} est en Défense Totale ! Il ne peut pas attaquer ce round.`)
|
||||
return
|
||||
}
|
||||
// Build the roll structure
|
||||
let rolldata = {
|
||||
mode: "weapon",
|
||||
actorId: actor.id,
|
||||
img: actor.img,
|
||||
weapon: weapon,
|
||||
isRanged: weaponData.properties.ranged || weaponData.properties.throwing,
|
||||
targetId: target?.id,
|
||||
fightOption: fightOption,
|
||||
careerBonus: 0,
|
||||
defenderId: target?.actor.id,
|
||||
attribute: attribute,
|
||||
aptitude: aptitude,
|
||||
attrValue: attribute.value,
|
||||
aptValue: aptitude.value,
|
||||
armorAgiMalus: actor.getArmorAgiMalus(),
|
||||
armorInitMalus: actor.getArmorInitMalus(),
|
||||
mod: 0,
|
||||
modRanged: 0,
|
||||
label: (weapon.name) ? weapon.name : game.i18n.localize('BOL.ui.noWeaponName'),
|
||||
description: game.i18n.localize('BOL.ui.weaponAttack') + " : " + weapon.name,
|
||||
}
|
||||
return this.displayRollDialog(rolldata)
|
||||
|
||||
// Update the roll structure
|
||||
rollData.weapon = weapon
|
||||
rollData.isRanged = weaponData.properties.ranged || weaponData.properties.throwing
|
||||
rollData.targetId = target?.id
|
||||
rollData.fightOption = fightOption
|
||||
rollData.defenderId = target?.actor.id
|
||||
rollData.label = (weapon.name) ? weapon.name : game.i18n.localize('BOL.ui.noWeaponName')
|
||||
rollData.description = game.i18n.localize('BOL.ui.weaponAttack') + " : " + weapon.name
|
||||
|
||||
return this.displayRollDialog(rollData)
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
static weaponCheck(actor, event) {
|
||||
const li = $(event.currentTarget).parents(".item")
|
||||
@ -114,7 +183,7 @@ export class BoLRoll {
|
||||
ui.notifications.warn("Unable to find weapon !")
|
||||
return
|
||||
}
|
||||
weapon = duplicate(weapon)
|
||||
weapon = foundry.utils.duplicate(weapon)
|
||||
return this.weaponCheckWithWeapon(actor, weapon)
|
||||
}
|
||||
|
||||
@ -126,56 +195,66 @@ export class BoLRoll {
|
||||
ui.notifications.warn("Unable to find Alchemy !");
|
||||
return;
|
||||
}
|
||||
alchemy = duplicate(alchemy)
|
||||
let alchemyData = alchemy.data
|
||||
alchemy = foundry.utils.duplicate(alchemy)
|
||||
let alchemyData = alchemy.system
|
||||
if (alchemyData.properties.pccurrent < alchemyData.properties.pccost) {
|
||||
ui.notifications.warn("Pas assez de Points de Cration investis dans la Préparation !")
|
||||
ui.notifications.warn("Pas assez de Points de Création investis dans la Préparation !")
|
||||
return
|
||||
}
|
||||
|
||||
let alchemyDef = {
|
||||
mode: "alchemy",
|
||||
actorId: actor.id,
|
||||
img: actor.img,
|
||||
alchemy: alchemy,
|
||||
attribute: actor.system.attributes.mind,
|
||||
attrValue: actor.system.attributes.mind.value,
|
||||
aptValue: 0,
|
||||
careerBonus: actor.getAlchemistBonus(),
|
||||
pcCost: Number(alchemyData.properties.pccost),
|
||||
pcCostCurrent: Number(alchemyData.properties.pccurrent),
|
||||
mod: Number(alchemyData.properties.difficulty),
|
||||
armorAgiMalus: actor.getArmorAgiMalus(),
|
||||
armorInitMalus: actor.getArmorInitMalus(),
|
||||
label: alchemy.name,
|
||||
description: game.i18n.localize('BOL.ui.makeAlchemy') + "+" + alchemy.name,
|
||||
}
|
||||
console.log("ALCHEMY!", alchemyDef);
|
||||
return this.displayRollDialog(alchemyDef);
|
||||
let rollData = this.getCommonRollData(actor, "alchemy", actor.system.attributes.mind)
|
||||
|
||||
rollData.alchemy = alchemy
|
||||
rollData.careerBonus = actor.getAlchemistBonus()
|
||||
rollData.pcCost = Number(alchemyData.properties.pccost)
|
||||
rollData.pcCostCurrent = Number(alchemyData.properties.pccurrent)
|
||||
rollData.mod = Number(alchemyData.properties.difficulty)
|
||||
rollData.label = alchemy.name
|
||||
rollData.description = game.i18n.localize('BOL.ui.makeAlchemy') + "+" + alchemy.name
|
||||
|
||||
console.log("ALCHEMY!", rollData);
|
||||
return this.displayRollDialog(rollData);
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
static spellCheckWithSpell( actor, spell ) {
|
||||
let spellDef = {
|
||||
mode: "spell",
|
||||
actorId: actor.id,
|
||||
img: actor.img,
|
||||
spell: spell,
|
||||
attribute: actor.system.attributes.mind,
|
||||
attrValue: actor.system.attributes.mind.value,
|
||||
aptValue: 0,
|
||||
ppCurrent: Number(actor.system.resources.power.value),
|
||||
careerBonus: actor.getSorcererBonus(),
|
||||
ppCostArmor: actor.getPPCostArmor(),
|
||||
ppCost: Number(spell.system.properties.ppcost),
|
||||
mod: Number(spell.system.properties.difficulty),
|
||||
armorAgiMalus: actor.getArmorAgiMalus(),
|
||||
armorInitMalus: actor.getArmorInitMalus(),
|
||||
label: spell.name,
|
||||
description: game.i18n.localize('BOL.ui.focusSpell') + " : " + spell.name,
|
||||
static horoscopeCheck(actor, event, horoscopeType) {
|
||||
|
||||
let target = BoLUtility.getTarget()
|
||||
|
||||
let cost = (horoscopeType == "minor") ? 1 : 2
|
||||
if (cost > actor.getAstrologyPoints()) {
|
||||
ui.notifications.warn(game.i18n.localize("BOL.ui.astrologyNoPoints"))
|
||||
return
|
||||
}
|
||||
let rollData = this.getCommonRollData(actor, "horoscope", actor.system.attributes.mind)
|
||||
|
||||
rollData.careerBonus = actor.getAstrologerBonus()
|
||||
rollData.horoscopeType = horoscopeType
|
||||
rollData.horoscopeTypeLabel = "BOL.ui." + horoscopeType
|
||||
rollData.astrologyPointsCost = cost
|
||||
rollData.label = game.i18n.localize('BOL.ui.makeHoroscope')
|
||||
rollData.description = game.i18n.localize('BOL.ui.makeHoroscope') + " " + game.i18n.localize(rollData.horoscopeTypeLabel)
|
||||
rollData.targetId = target?.id
|
||||
|
||||
console.log("HOROSCOPE!", rollData);
|
||||
return this.displayRollDialog(rollData);
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
static spellCheckWithSpell(actor, spell) {
|
||||
let rollData = this.getCommonRollData(actor, "spell", actor.system.attributes.mind)
|
||||
|
||||
rollData.spell = spell
|
||||
rollData.ppCurrent = Number(actor.system.resources.power.value),
|
||||
rollData.careerBonus = actor.getSorcererBonus(),
|
||||
rollData.ppCostArmor = actor.getPPCostArmor(),
|
||||
rollData.ppCost = Number(spell.system.properties.ppcost),
|
||||
rollData.mod = Number(spell.system.properties.difficulty),
|
||||
rollData.label = spell.name,
|
||||
rollData.description = game.i18n.localize('BOL.ui.focusSpell') + " : " + spell.name
|
||||
|
||||
//console.log("SPELL!", spellDef)
|
||||
return this.displayRollDialog(spellDef)
|
||||
return this.displayRollDialog(rollData)
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
@ -190,8 +269,8 @@ export class BoLRoll {
|
||||
ui.notifications.warn("Impossible de trouver ce sort !")
|
||||
return
|
||||
}
|
||||
spell = duplicate(spell)
|
||||
return this.spellCheckWithSpell( actor, spell)
|
||||
spell = foundry.utils.duplicate(spell)
|
||||
return this.spellCheckWithSpell(actor, spell)
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
@ -200,8 +279,35 @@ export class BoLRoll {
|
||||
this.updateArmorMalus(this.rollData)
|
||||
this.updatePPCost(this.rollData)
|
||||
|
||||
// get basic dices from boons/flaws
|
||||
let effectModifier = 0
|
||||
this.rollData.bmDice = this.rollData.nbBoons - this.rollData.nbFlaws + this.rollData.bDice - this.rollData.mDice
|
||||
// add applicable bonus/malus dices effects
|
||||
for (let effect of this.rollData.bolApplicableEffects) {
|
||||
if (effect.system.properties.modifier == "1B") {
|
||||
this.rollData.bmDice++;
|
||||
} else if (effect.system.properties.modifier == "2B") {
|
||||
this.rollData.bmDice += 2;
|
||||
} else if (effect.system.properties.modifier == "1M") {
|
||||
this.rollData.bmDice--;
|
||||
} else if (effect.system.properties.modifier == "2M") {
|
||||
this.rollData.bmDice -= 2;
|
||||
} else {
|
||||
effectModifier += Number(effect.system.properties.modifier)
|
||||
}
|
||||
}
|
||||
this.rollData.bmDice += this.rollData.horoscopeBonus
|
||||
this.rollData.bmDice -= this.rollData.horoscopeMalus
|
||||
if (this.rollData.selectedGroupHoroscopeIndex && this.rollData.selectedGroupHoroscopeIndex > 0) {
|
||||
let horo = this.rollData.horoscopeGroupList[this.rollData.selectedGroupHoroscopeIndex]
|
||||
this.rollData.bmDice += (horo.type == "malus") ? -horo.nbDice : horo.nbDice;
|
||||
}
|
||||
// Keep track of the final effect modifier
|
||||
this.rollData.effectModifier = effectModifier
|
||||
|
||||
// Final number of dices
|
||||
this.rollData.nbDice = 2 + Math.abs(this.rollData.bmDice)
|
||||
// Bonus or Malus ?
|
||||
if (this.rollData.bmDice == 0) {
|
||||
$('#roll-nbdice').val("2")
|
||||
} else {
|
||||
@ -209,12 +315,19 @@ export class BoLRoll {
|
||||
$('#roll-nbdice').val("2 + " + String(Math.abs(this.rollData.bmDice)) + letter)
|
||||
}
|
||||
let rollbase = this.rollData.attrValue + "+" + this.rollData.aptValue
|
||||
if ( this.rollData.weapon && this.rollData.weapon.system.properties.onlymodifier ) {
|
||||
if (this.rollData.weapon && this.rollData.weapon.system.properties.onlymodifier) {
|
||||
rollbase = ""
|
||||
}
|
||||
$('#roll-modifier').val(rollbase + "+" + this.rollData.careerBonus + "+" + this.rollData.mod + "+" +
|
||||
this.rollData.modRanged + "+" + this.rollData.weaponModifier + "-" + this.rollData.defence + "-" + this.rollData.modArmorMalus + "-" +
|
||||
this.rollData.shieldMalus + "+" + this.rollData.attackModifier + "+" + this.rollData.appliedArmorMalus)
|
||||
this.rollData.shieldMalus + "+" + this.rollData.attackModifier + "+" + this.rollData.appliedArmorMalus + "+" + effectModifier)
|
||||
|
||||
// Rebuild lits of applicable effects
|
||||
let selectEffects = ""
|
||||
for (let effect of this.rollData.bolApplicableEffects) {
|
||||
selectEffects += `<option value="${effect.id}" selected>${effect.name}</option>`
|
||||
}
|
||||
$('#applicable-effects').html(selectEffects)
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
@ -274,7 +387,7 @@ export class BoLRoll {
|
||||
html.find('#optcond').change((event) => { // Dynamic change of PP cost of spell
|
||||
let pp = BoLUtility.computeSpellCost(this.rollData.spell, event.currentTarget.selectedOptions.length)
|
||||
this.rollData.ppCost = pp
|
||||
this.updatePPCost( this.rollData)
|
||||
this.updatePPCost(this.rollData)
|
||||
})
|
||||
|
||||
html.find('#mod').change((event) => {
|
||||
@ -288,16 +401,18 @@ export class BoLRoll {
|
||||
|
||||
html.find('#attr').change((event) => {
|
||||
let attrKey = event.currentTarget.value
|
||||
let actor = game.actors.get( this.rollData.actorId)
|
||||
this.rollData.attribute = duplicate(actor.system.attributes[attrKey])
|
||||
let actor = BoLUtility.getActorFromRollData(this.rollData)
|
||||
this.rollData.attribute = foundry.utils.duplicate(actor.system.attributes[attrKey])
|
||||
this.rollData.attrValue = actor.system.attributes[attrKey].value
|
||||
this.rollData.bolApplicableEffects = this.updateApplicableEffects(this.rollData)
|
||||
this.updateTotalDice()
|
||||
})
|
||||
html.find('#apt').change((event) => {
|
||||
let aptKey = event.currentTarget.value
|
||||
let actor = game.actors.get( this.rollData.actorId)
|
||||
this.rollData.aptitude = duplicate(actor.system.aptitudes[aptKey])
|
||||
let actor = BoLUtility.getActorFromRollData(this.rollData)
|
||||
this.rollData.aptitude = foundry.utils.duplicate(actor.system.aptitudes[aptKey])
|
||||
this.rollData.aptValue = actor.system.aptitudes[aptKey].value
|
||||
this.rollData.bolApplicableEffects = this.updateApplicableEffects(this.rollData)
|
||||
this.updateTotalDice()
|
||||
})
|
||||
|
||||
@ -307,6 +422,7 @@ export class BoLRoll {
|
||||
} else {
|
||||
this.rollData.shieldMalus = 0
|
||||
}
|
||||
this.updateTotalDice()
|
||||
})
|
||||
|
||||
html.find('#career').change((event) => {
|
||||
@ -334,22 +450,52 @@ export class BoLRoll {
|
||||
this.rollData.mDice = Number(event.currentTarget.value)
|
||||
this.updateTotalDice()
|
||||
})
|
||||
html.find('#horoscope-bonus-applied').change((event) => {
|
||||
this.rollData.selectedHoroscope = []
|
||||
for (let option of event.currentTarget.selectedOptions) {
|
||||
this.rollData.selectedHoroscope.push(foundry.utils.duplicate(this.rollData.horoscopeBonusList[Number(option.index)]))
|
||||
}
|
||||
let horoscopes = $('#horoscope-bonus-applied').val()
|
||||
this.rollData.horoscopeBonus = (!horoscopes || horoscopes.length == 0) ? 0 : horoscopes.length
|
||||
this.updateTotalDice()
|
||||
})
|
||||
|
||||
html.find('#horoscope-malus-applied').change((event) => {
|
||||
this.rollData.selectedHoroscope = []
|
||||
for (let option of event.currentTarget.selectedOptions) {
|
||||
this.rollData.selectedHoroscope.push(foundry.utils.duplicate(this.rollData.horoscopeBonusList[Number(option.index)]))
|
||||
}
|
||||
let horoscopes = $('#horoscope-malus-applied').val()
|
||||
this.rollData.horoscopeMalus = (!horoscopes || horoscopes.length == 0) ? 0 : horoscopes.length
|
||||
this.updateTotalDice()
|
||||
})
|
||||
html.find('#horoscope-group-applied').change((event) => {
|
||||
this.rollData.selectedGroupHoroscopeIndex = event.currentTarget.value
|
||||
this.updateTotalDice()
|
||||
})
|
||||
|
||||
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
static preProcessWeapon(rollData, defender) {
|
||||
if (rollData.mode == "weapon") {
|
||||
rollData.weaponModifier = rollData.weapon.system.properties.attackModifiers ?? 0;
|
||||
rollData.weaponModifier = rollData.weapon.system.properties.attackModifiers ?? 0
|
||||
rollData.attackBonusDice = rollData.weapon.system.properties.attackBonusDice
|
||||
if (rollData.attackBonusDice) {
|
||||
rollData.adv = "1B"
|
||||
rollData.bDice = 1
|
||||
}
|
||||
if (defender) { // If target is selected
|
||||
rollData.defence = defender.defenseValue
|
||||
rollData.armorMalus = defender.armorMalusValue
|
||||
rollData.defenderHeroPoints = defender.getHeroPoints()
|
||||
rollData.shieldBlock = 'none'
|
||||
let shields = defender.shields
|
||||
//console.log("Defender stats", defender)
|
||||
for (let shield of shields) {
|
||||
rollData.shieldBlock = (shield.system.properties.blocking.blockingAll) ? 'blockall' : 'blockone';
|
||||
rollData.shieldAttackMalus = (shield.system.properties.blocking.malus) ? shield.system.properties.blocking.malus : 1;
|
||||
rollData.applyShieldMalus = false
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -362,9 +508,9 @@ export class BoLRoll {
|
||||
// initialize default flags/values
|
||||
const rollOptionTpl = `systems/bol/templates/dialogs/${rollData.mode}-roll-dialog.hbs`
|
||||
|
||||
let actor = game.actors.get( rollData.actorId )
|
||||
let actor = BoLUtility.getActorFromRollData(rollData)
|
||||
let defender
|
||||
if ( rollData.targetId) {
|
||||
if (rollData.targetId) {
|
||||
let token = game.scenes.current.tokens.get(rollData.targetId)
|
||||
defender = token.actor
|
||||
}
|
||||
@ -381,15 +527,11 @@ export class BoLRoll {
|
||||
rollData.nbBoons = 0
|
||||
rollData.nbFlaws = 0
|
||||
rollData.nbDice = 0
|
||||
if (rollData.shieldBlock == 'blockall') {
|
||||
rollData.shieldMalus = rollData.shieldAttackMalus;
|
||||
} else {
|
||||
rollData.shieldMalus = 0
|
||||
}
|
||||
rollData.isHeroAdversary = actor.isHeroAdversary()
|
||||
rollData.careerBonus = rollData.careerBonus ?? 0
|
||||
rollData.modRanged = rollData.modRanged ?? 0
|
||||
rollData.mod = rollData.mod ?? 0
|
||||
rollData.id = randomID(16)
|
||||
rollData.id = foundry.utils.randomID(16)
|
||||
rollData.weaponModifier = 0
|
||||
rollData.attackBonusDice = false
|
||||
rollData.armorMalus = 0
|
||||
@ -398,6 +540,12 @@ export class BoLRoll {
|
||||
this.preProcessFightOption(rollData)
|
||||
this.updateArmorMalus(rollData)
|
||||
this.updatePPCost(rollData)
|
||||
// Prepare blocking case
|
||||
if (rollData.shieldBlock == 'blockall') {
|
||||
rollData.shieldMalus = rollData.shieldAttackMalus;
|
||||
} else {
|
||||
rollData.shieldMalus = 0
|
||||
}
|
||||
// Save
|
||||
this.rollData = rollData
|
||||
console.log("ROLLDATA", rollData)
|
||||
@ -420,24 +568,26 @@ export class BoLRoll {
|
||||
icon: '<i class="fas fa-check"></i>',
|
||||
label: game.i18n.localize("BOL.ui.submit"),
|
||||
callback: (html) => {
|
||||
console.log("Submit Roll!!!!");
|
||||
if (rollData.mode == 'spell' && rollData.ppCurrent < rollData.ppCost) { // Check PP available
|
||||
ui.notifications.warn("Pas assez de Points de Pouvoir !")
|
||||
return
|
||||
}
|
||||
|
||||
rollData.registerInit = (rollData.aptitude && rollData.aptitude.key == 'init') ? $('#register-init').is(":checked") : false;
|
||||
|
||||
const isMalus = rollData.mDice > 0
|
||||
rollData.nbDice += (rollData.attackBonusDice) ? 1 : 0
|
||||
const isMalus = (rollData.bmDice < 0)
|
||||
|
||||
let rollbase = rollData.attrValue + rollData.aptValue
|
||||
if ( rollData.weapon && rollData.weapon.system.properties.onlymodifier ) {
|
||||
if (rollData.weapon?.system.properties.onlymodifier) {
|
||||
rollbase = 0
|
||||
}
|
||||
const modifiers = rollbase + rollData.careerBonus + rollData.mod + rollData.weaponModifier - rollData.defence - rollData.modArmorMalus + rollData.shieldMalus + rollData.attackModifier + rollData.appliedArmorMalus
|
||||
const formula = (isMalus) ? rollData.nbDice + "d6kl2 + " + modifiers : rollData.nbDice + "d6kh2 + " + modifiers
|
||||
}
|
||||
let diceData = BoLUtility.getDiceData()
|
||||
let malusInit = rollData.combatData?.malusInit || 0
|
||||
const modifiers = rollbase + rollData.careerBonus + rollData.mod + rollData.weaponModifier - rollData.defence - rollData.modArmorMalus + rollData.shieldMalus + rollData.attackModifier + rollData.appliedArmorMalus + rollData.effectModifier - malusInit
|
||||
const formula = (isMalus) ? rollData.nbDice + "d" + diceData.diceFormula + "kl2 + " + modifiers : rollData.nbDice + "d" + diceData.diceFormula + "kh2 + " + modifiers
|
||||
rollData.formula = formula
|
||||
rollData.modifiers = modifiers
|
||||
console.log("Rolldata before", rollData)
|
||||
|
||||
let r = new BoLDefaultRoll(rollData);
|
||||
r.roll();
|
||||
@ -463,61 +613,95 @@ export class BoLDefaultRoll {
|
||||
this.rollData.isFumble = false;
|
||||
}
|
||||
if (this.rollData.optionsId) {
|
||||
BoLUtility.cleanupButtons( this.rollData.optionsId)
|
||||
BoLUtility.cleanupButtons(this.rollData.optionsId)
|
||||
}
|
||||
if (this.rollData.applyId) {
|
||||
BoLUtility.cleanupButtons( this.rollData.applyId)
|
||||
BoLUtility.cleanupButtons(this.rollData.applyId)
|
||||
}
|
||||
this.rollData.optionsId = randomID(16)
|
||||
this.rollData.applyId = randomID(16)
|
||||
this.rollData.optionsId = foundry.utils.randomID(16)
|
||||
this.rollData.applyId = foundry.utils.randomID(16)
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
async roll() {
|
||||
|
||||
const r = new Roll(this.rollData.formula)
|
||||
// console.log("Roll formula", this.rollData.formula)
|
||||
await r.roll({ "async": false })
|
||||
await r.roll()
|
||||
|
||||
let diceData = BoLUtility.getDiceData()
|
||||
//console.log("DICEDATA", diceData)
|
||||
const activeDice = r.terms[0].results.filter(r => r.active)
|
||||
const diceTotal = activeDice.map(r => r.result).reduce((a, b) => a + b)
|
||||
this.rollData.roll = r
|
||||
this.rollData.isSuccess = (r.total >= 9)
|
||||
this.rollData.isCritical = (diceTotal === 12)
|
||||
this.rollData.isRealCritical = (diceTotal === 12)
|
||||
this.rollData.isHeroic = (diceTotal === 12)
|
||||
this.rollData.isFumble = (diceTotal <= diceData.criticalFailureValue)
|
||||
if ( this.rollData.isFumble ) {
|
||||
this.rollData.isSuccess = false
|
||||
this.rollData.isCritical = false
|
||||
this.rollData.isRealCritical = false
|
||||
this.rollData.isHeroic = false
|
||||
this.rollData.isFailure = true
|
||||
} else {
|
||||
this.rollData.isCritical = (diceTotal >= diceData.criticalSuccessValue)
|
||||
if ( this.rollData.isCritical) {
|
||||
this.rollData.isSuccess = true
|
||||
} else {
|
||||
this.rollData.isSuccess = (r.total >= diceData.successValue)
|
||||
}
|
||||
this.rollData.isRealCritical = (diceTotal >= diceData.criticalSuccessValue)
|
||||
this.rollData.isHeroic = (diceTotal >= diceData.criticalSuccessValue)
|
||||
this.rollData.isFailure = !this.rollData.isSuccess
|
||||
}
|
||||
this.rollData.isLegendary = false
|
||||
this.rollData.isFumble = (diceTotal === 2)
|
||||
this.rollData.isFailure = !this.rollData.isSuccess
|
||||
|
||||
let actor = game.actors.get( this.rollData.actorId)
|
||||
let actor = BoLUtility.getActorFromRollData(this.rollData)
|
||||
if (this.rollData.reroll == undefined) {
|
||||
this.rollData.reroll = actor.heroReroll()
|
||||
}
|
||||
|
||||
if (this.rollData.registerInit) {
|
||||
actor.registerInit(r.total, this.rollData.isCritical, this.rollData.isFumble)
|
||||
await actor.registerInit(this.rollData)
|
||||
this.rollData.initiativeRank = actor.getInitiativeRank(this.rollData)
|
||||
if (this.rollData.combatData) { // If combatData present
|
||||
let combat = game.combats.get(this.rollData.combatData.combatId)
|
||||
//console.log("SET INIT!!!!!", this.rollData.initiativeRank)
|
||||
combat.setInitiative(this.rollData.combatData.combatantId, this.rollData.initiativeRank)
|
||||
}
|
||||
}
|
||||
if (this.rollData.isSuccess && this.rollData.mode == "spell") { // PP cost management
|
||||
this.rollData.remainingPP = actor.spendPowerPoint(this.rollData.ppCost + this.rollData.ppCostArmor)
|
||||
}
|
||||
|
||||
if (this.rollData.mode == "alchemy") { // PP cost management
|
||||
actor.resetAlchemyStatus(this.rollData.alchemy._id)
|
||||
}
|
||||
if (this.rollData.mode == "bougette" && this.rollData.isFailure) {
|
||||
actor.decBougette()
|
||||
}
|
||||
|
||||
await this.sendChatMessage()
|
||||
|
||||
if (this.rollData.mode == "horoscope") { // PP cost management
|
||||
actor.manageHoroscope(this.rollData)
|
||||
}
|
||||
if (this.rollData.selectedHoroscope.length > 0) { // PP cost management
|
||||
actor.removeHoroscopeMinor(this.rollData)
|
||||
}
|
||||
if (this.rollData.selectedGroupHoroscopeIndex && this.rollData.selectedGroupHoroscopeIndex > 0) { // PP cost management
|
||||
BoLUtility.removeGroupHoroscope(this.rollData)
|
||||
}
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
async sendChatMessage() {
|
||||
let actor = game.actors.get( this.rollData.actorId)
|
||||
this._buildChatMessage(this.rollData).then( async msgFlavor => {
|
||||
let actor = BoLUtility.getActorFromRollData(this.rollData)
|
||||
this._buildChatMessage(this.rollData).then(async msgFlavor => {
|
||||
//console.log("MSG", msgFlavor )
|
||||
let msg = await this.rollData.roll.toMessage({
|
||||
user: game.user.id,
|
||||
rollMode: game.settings.get("core", "rollMode"),
|
||||
//whisper: BoLUtility.getWhisperRecipientsAndGMs(this.rollData.actor.name),
|
||||
flavor: msgFlavor,
|
||||
speaker: ChatMessage.getSpeaker({ actor: actor }),
|
||||
})
|
||||
this.rollData.roll = foundry.utils.duplicate(this.rollData.roll) // Remove object, keep data (v111 ready)
|
||||
msg.setFlag("world", "bol-roll-data", this.rollData)
|
||||
})
|
||||
}
|
||||
@ -525,12 +709,15 @@ export class BoLDefaultRoll {
|
||||
/* -------------------------------------------- */
|
||||
upgradeToLegendary() {
|
||||
// Force to Critical roll
|
||||
let diceData = BoLUtility.getDiceData()
|
||||
let maxValue = Number(diceData.diceFormula) * 2
|
||||
|
||||
this.rollData.isCritical = true
|
||||
this.rollData.isLegendary = true
|
||||
this.rollData.isRealCritical = false
|
||||
this.rollData.isSuccess = true
|
||||
this.rollData.isFailure = false
|
||||
this.rollData.roll = new Roll("12+" + this.rollData.modifiers)
|
||||
this.rollData.roll = new Roll(maxValue + "+" + this.rollData.modifiers)
|
||||
this.rollData.reroll = false
|
||||
this.sendChatMessage()
|
||||
}
|
||||
@ -538,17 +725,20 @@ export class BoLDefaultRoll {
|
||||
/* -------------------------------------------- */
|
||||
upgradeToHeroic() {
|
||||
// Force to Critical roll
|
||||
let diceData = BoLUtility.getDiceData()
|
||||
let maxValue = Number(diceData.diceFormula) * 2
|
||||
|
||||
this.rollData.isCritical = true
|
||||
this.rollData.isHeroic = true
|
||||
this.rollData.isLegendary = false
|
||||
this.rollData.isRealCritical = false
|
||||
this.rollData.isSuccess = true
|
||||
this.rollData.isFailure = false
|
||||
this.rollData.roll = new Roll("12+" + this.rollData.modifiers)
|
||||
this.rollData.roll = new Roll(maxValue + "+" + this.rollData.modifiers)
|
||||
this.rollData.reroll = false
|
||||
this.sendChatMessage()
|
||||
}
|
||||
|
||||
|
||||
/* -------------------------------------------- */
|
||||
setSuccess(flag) {
|
||||
this.rollData.isSuccess = flag
|
||||
@ -556,7 +746,7 @@ export class BoLDefaultRoll {
|
||||
|
||||
/* -------------------------------------------- */
|
||||
async sendDamageMessage() {
|
||||
let actor = game.actors.get( this.rollData.actorId)
|
||||
let actor = BoLUtility.getActorFromRollData(this.rollData)
|
||||
this._buildDamageChatMessage(this.rollData).then(async msgFlavor => {
|
||||
let msg = await this.rollData.damageRoll.toMessage({
|
||||
user: game.user.id,
|
||||
@ -564,22 +754,16 @@ export class BoLDefaultRoll {
|
||||
speaker: ChatMessage.getSpeaker({ actor: actor }),
|
||||
flags: { msgType: "default" }
|
||||
})
|
||||
this.rollData.damageRoll = foundry.utils.duplicate(this.rollData.damageRoll)
|
||||
this.rollData.actor = undefined // Cleanup
|
||||
msg.setFlag("world", "bol-roll-data", this.rollData)
|
||||
})
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
getDamageAttributeValue(attrDamage, actorId = undefined) {
|
||||
let attrDamageValue = 0
|
||||
|
||||
let actor = game.actors.get( (actorId) ? actorId: this.rollData.actorId)
|
||||
if (attrDamage.includes("vigor")) {
|
||||
attrDamageValue = actor.system.attributes.vigor.value
|
||||
if (attrDamage.includes("half")) {
|
||||
attrDamageValue = Math.floor(attrDamageValue / 2)
|
||||
}
|
||||
}
|
||||
return attrDamageValue
|
||||
let actor = BoLUtility.getActorFromRollData(this.rollData)
|
||||
return actor.getDamageAttributeValue(attrDamage)
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
@ -594,20 +778,24 @@ export class BoLDefaultRoll {
|
||||
if (this.rollData.damageMode == 'damage-plus-6') {
|
||||
bonusDmg = 6
|
||||
}
|
||||
if (this.rollData.damageMode == 'damage-plus-12') {
|
||||
if (this.rollData.damageMode == 'damage-plus-12' || this.rollData.damageMode == 'damage-plus-12-legend') {
|
||||
bonusDmg = 12
|
||||
if (this.rollData.damageMode == 'damage-plus-12') { // In this case, the hero point is used (ie shortcut)
|
||||
let actor = BoLUtility.getActorFromRollData(this.rollData)
|
||||
actor.subHeroPoints(1)
|
||||
}
|
||||
}
|
||||
let attrDamageValue = this.getDamageAttributeValue(this.rollData.weapon.system.properties.damageAttribute)
|
||||
let weaponFormula = BoLUtility.getDamageFormula(this.rollData.weapon.system, this.rollData.fightOption)
|
||||
|
||||
let damageFormula = weaponFormula + "+" + bonusDmg + "+" + attrDamageValue
|
||||
console.log("DAMAGE !!!", damageFormula, attrDamageValue, this.rollData)
|
||||
|
||||
//console.log("Formula", weaponFormula, damageFormula, this.rollData.weapon.data.data.properties.damage)
|
||||
this.rollData.damageFormula = damageFormula
|
||||
this.rollData.damageRoll = new Roll(damageFormula)
|
||||
await this.rollData.damageRoll.roll({ "async": false })
|
||||
await this.rollData.damageRoll.roll()
|
||||
this.rollData.damageTotal = this.rollData.damageRoll.total
|
||||
console.log("DAMAGE !!!", damageFormula, attrDamageValue, this.rollData)
|
||||
}
|
||||
BoLUtility.cleanupButtons(this.rollData.optionsId)
|
||||
this.sendDamageMessage()
|
||||
@ -622,8 +810,8 @@ export class BoLDefaultRoll {
|
||||
|
||||
/* -------------------------------------------- */
|
||||
_buildChatMessage(rollData) {
|
||||
const rollMessageTpl = 'systems/bol/templates/chat/rolls/default-roll-card.hbs';
|
||||
return renderTemplate(rollMessageTpl, rollData);
|
||||
const rollMessageTpl = 'systems/bol/templates/chat/rolls/default-roll-card.hbs'
|
||||
return renderTemplate(rollMessageTpl, rollData)
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -8,7 +8,7 @@ export class BoLItemSheet extends ItemSheet {
|
||||
|
||||
/** @override */
|
||||
static get defaultOptions() {
|
||||
return mergeObject(super.defaultOptions, {
|
||||
return foundry.utils.mergeObject(super.defaultOptions, {
|
||||
classes: ["bol", "sheet", "item"],
|
||||
template: "systems/bol/templates/item/item-sheet.hbs",
|
||||
width: 650,
|
||||
@ -19,30 +19,33 @@ export class BoLItemSheet extends ItemSheet {
|
||||
|
||||
/* -------------------------------------------- */
|
||||
/** @override */
|
||||
getData(options) {
|
||||
async getData(options) {
|
||||
const data = super.getData(options)
|
||||
let itemData = duplicate(data.document)
|
||||
let itemData = foundry.utils.duplicate(data.document)
|
||||
data.config = game.bol.config
|
||||
data.item = itemData
|
||||
data.category = itemData.system.category
|
||||
data.isGM = game.user.isGM;
|
||||
data.itemProperties = this.item.itemProperties;
|
||||
|
||||
data.description = await TextEditor.enrichHTML(this.object.system.description, { async: true })
|
||||
if (data.document.actor) {
|
||||
data.careers = data.document.actor.careers
|
||||
}
|
||||
// Dynamic default data fix/adapt
|
||||
if (itemData.type == "item") {
|
||||
if (!itemData.system.category) {
|
||||
itemData.system.category = "equipment"
|
||||
}
|
||||
if ( itemData.system.category == "equipment" && itemData.system.properties.equipable) {
|
||||
if (itemData.system.category == "equipment" && itemData.system.properties.equipable) {
|
||||
if (!itemData.system.properties.slot) {
|
||||
itemData.system.properties.slot = "-"
|
||||
}
|
||||
}
|
||||
if (itemData.system.category == 'spell') {
|
||||
if(!itemData.system.properties.mandatoryconditions) {
|
||||
if (!itemData.system.properties.mandatoryconditions) {
|
||||
itemData.system.properties.mandatoryconditions = []
|
||||
}
|
||||
if(!itemData.system.properties.optionnalconditions) {
|
||||
if (!itemData.system.properties.optionnalconditions) {
|
||||
itemData.system.properties.optionnalconditions = []
|
||||
}
|
||||
for (let i = 0; i < 4; i++) {
|
||||
@ -63,7 +66,27 @@ export class BoLItemSheet extends ItemSheet {
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
_getHeaderButtons() {
|
||||
let buttons = super._getHeaderButtons();
|
||||
buttons.unshift({
|
||||
class: "post",
|
||||
icon: "fas fa-comment",
|
||||
onclick: ev => this.postItem()
|
||||
});
|
||||
return buttons
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
postItem() {
|
||||
let chatData = foundry.utils.duplicate(this.item)
|
||||
if (this.actor) {
|
||||
chatData.actor = { id: this.actor.id };
|
||||
}
|
||||
BoLUtility.postItem(chatData);
|
||||
}
|
||||
|
||||
|
||||
/* -------------------------------------------- */
|
||||
/** @override */
|
||||
setPosition(options = {}) {
|
||||
const position = super.setPosition(options);
|
||||
|
@ -1,620 +0,0 @@
|
||||
{
|
||||
"titre1": [
|
||||
{
|
||||
"prefix": "la",
|
||||
"name": "Prophétie"
|
||||
},
|
||||
{
|
||||
"prefix": "les",
|
||||
"name": "Grottes",
|
||||
"isLieu": true
|
||||
},
|
||||
{
|
||||
"prefix": "les",
|
||||
"name": "Collines",
|
||||
"isLieu": true
|
||||
},
|
||||
{
|
||||
"prefix": "les",
|
||||
"name": "Voleurs",
|
||||
"isEnnemi": true,
|
||||
"isCarriere": true
|
||||
},
|
||||
{
|
||||
"prefix": "les",
|
||||
"name": "Sorcier(s)",
|
||||
"isEnnemi": true,
|
||||
"isCarriere": true
|
||||
},
|
||||
{
|
||||
"prefix": "la",
|
||||
"name": "Bataille"
|
||||
},
|
||||
{
|
||||
"prefix": "la",
|
||||
"name": "Légende"
|
||||
},
|
||||
{
|
||||
"prefix": "la",
|
||||
"name": "Tour",
|
||||
"isLieu": true
|
||||
},
|
||||
{
|
||||
"prefix": "l'",
|
||||
"name": "Ile",
|
||||
"isLieu": true
|
||||
},
|
||||
{
|
||||
"prefix": "les",
|
||||
"name": "Pirates",
|
||||
"isEnnemi": true,
|
||||
"isCarriere": true
|
||||
},
|
||||
{
|
||||
"prefix": "les",
|
||||
"name": "Druide(s)",
|
||||
"isEnnemi": true,
|
||||
"isCarriere": true
|
||||
},
|
||||
{
|
||||
"prefix": "le",
|
||||
"name": "Navire",
|
||||
"isCarriere": false
|
||||
},
|
||||
{
|
||||
"prefix": "la",
|
||||
"name": "Couronne",
|
||||
"isObjet": true
|
||||
},
|
||||
{
|
||||
"prefix": "la",
|
||||
"name": "Cité",
|
||||
"isLieu": true
|
||||
},
|
||||
{
|
||||
"prefix": "le",
|
||||
"name": "Désert",
|
||||
"isLieu": true
|
||||
},
|
||||
{
|
||||
"prefix": "les",
|
||||
"name": "Bête(s)",
|
||||
"isEnnemi": true,
|
||||
"isLieu": false
|
||||
},
|
||||
{
|
||||
"prefix": "les",
|
||||
"name": "Démon(s)",
|
||||
"isEnnemi": true,
|
||||
"isLieu": false
|
||||
},
|
||||
{
|
||||
"prefix": "le",
|
||||
"name": "Trésor",
|
||||
"isObjet": true
|
||||
},
|
||||
{
|
||||
"prefix": "l'",
|
||||
"name": "Epée",
|
||||
"isObjet": true
|
||||
},
|
||||
{
|
||||
"prefix": "l'",
|
||||
"name": "Arène",
|
||||
"isLieu": true
|
||||
},
|
||||
{
|
||||
"prefix": "les",
|
||||
"name": "Marais",
|
||||
"isLieu": true
|
||||
},
|
||||
{
|
||||
"prefix": "les",
|
||||
"name": "Seigneur(s)",
|
||||
"isEnnemi": true,
|
||||
"isLieu": false
|
||||
},
|
||||
{
|
||||
"prefix": "les",
|
||||
"name": "Assassin(s)",
|
||||
"isEnnemi": true,
|
||||
"isCarriere": true
|
||||
},
|
||||
{
|
||||
"prefix": "le",
|
||||
"name": "Culte",
|
||||
"isEnnemi": true,
|
||||
"isCarriere": false
|
||||
},
|
||||
{
|
||||
"prefix": "le",
|
||||
"name": "Secret",
|
||||
"isCarriere": false
|
||||
},
|
||||
{
|
||||
"prefix": "le",
|
||||
"name": "Palais",
|
||||
"isLieu": true
|
||||
},
|
||||
{
|
||||
"prefix": "la",
|
||||
"name": "Mer",
|
||||
"isLieu": true
|
||||
},
|
||||
{
|
||||
"prefix": "les",
|
||||
"name": "Barbares",
|
||||
"isEnnemi": true,
|
||||
"isCarriere": true
|
||||
},
|
||||
{
|
||||
"prefix": "le",
|
||||
"name": "Manuscrit",
|
||||
"isObjet": true
|
||||
},
|
||||
{
|
||||
"prefix": "les",
|
||||
"name": "Plaines",
|
||||
"isLieu": true
|
||||
},
|
||||
{
|
||||
"prefix": "le",
|
||||
"name": "Sang",
|
||||
"isLieu": false
|
||||
},
|
||||
{
|
||||
"prefix": "la",
|
||||
"name": "Tombe",
|
||||
"isLieu": true
|
||||
},
|
||||
{
|
||||
"prefix": "la",
|
||||
"name": "Forêt",
|
||||
"isLieu": true
|
||||
},
|
||||
{
|
||||
"prefix": "les",
|
||||
"name": "Esclaves",
|
||||
"isEnnemi": true,
|
||||
"isCarriere": true
|
||||
},
|
||||
{
|
||||
"prefix": "les",
|
||||
"name": "Mendiant(s)",
|
||||
"isEnnemi": true,
|
||||
"isCarriere": true
|
||||
},
|
||||
{
|
||||
"prefix": "les",
|
||||
"name": "Montagnes",
|
||||
"isCarriereLieu": true
|
||||
}
|
||||
],
|
||||
"titre2": [
|
||||
{
|
||||
"prefix": "du",
|
||||
"name": "mal"
|
||||
},
|
||||
{
|
||||
"prefix": "et le",
|
||||
"name": "Roi Maussade",
|
||||
"isEnnemi": true
|
||||
},
|
||||
{
|
||||
"prefix": "et la",
|
||||
"name": "pestilence",
|
||||
"isEnnemi": false
|
||||
},
|
||||
{
|
||||
"prefix": "de",
|
||||
"name": "Malakut",
|
||||
"isLieu": true
|
||||
},
|
||||
{
|
||||
"prefix": "d'",
|
||||
"name": "Halakh",
|
||||
"isLieu": true
|
||||
},
|
||||
{
|
||||
"prefix": "d'",
|
||||
"name": "Hyrdral",
|
||||
"isLieu": true
|
||||
},
|
||||
{
|
||||
"prefix": "des",
|
||||
"name": "esprits abandonnés",
|
||||
"isEnnemi": true
|
||||
},
|
||||
{
|
||||
"prefix": "du",
|
||||
"name": "chaos",
|
||||
"isEnnemi": true
|
||||
},
|
||||
{
|
||||
"prefix": "de la",
|
||||
"name": "folie",
|
||||
"isEnnemi": false
|
||||
},
|
||||
{
|
||||
"prefix": "de",
|
||||
"name": "Satarla",
|
||||
"isLieu": true
|
||||
},
|
||||
{
|
||||
"prefix": "d'",
|
||||
"name": "Urceb",
|
||||
"isLieu": true
|
||||
},
|
||||
{
|
||||
"prefix": "des",
|
||||
"name": "Terres Désolées",
|
||||
"isLieu": true
|
||||
},
|
||||
{
|
||||
"prefix": "de la",
|
||||
"name": "mort",
|
||||
"isLieu": false
|
||||
},
|
||||
{
|
||||
"prefix": "des",
|
||||
"name": "idoles impies",
|
||||
"isObjet": true
|
||||
},
|
||||
{
|
||||
"prefix": "des",
|
||||
"name": "ténèbres",
|
||||
"isObjet": false
|
||||
},
|
||||
{
|
||||
"prefix": "de",
|
||||
"name": "Parsool",
|
||||
"isLieu": true
|
||||
},
|
||||
{
|
||||
"prefix": "de",
|
||||
"name": "Qiddesh",
|
||||
"isLieu": true
|
||||
},
|
||||
{
|
||||
"prefix": "de",
|
||||
"name": "Kasht",
|
||||
"isLieu": true
|
||||
},
|
||||
{
|
||||
"prefix": "de la ",
|
||||
"name": "falalité",
|
||||
"isLieu": false
|
||||
},
|
||||
{
|
||||
"prefix": "du",
|
||||
"name": "Nécromant",
|
||||
"isEnnemi": true
|
||||
},
|
||||
{
|
||||
"prefix": "du",
|
||||
"name": "Néant",
|
||||
"isEnnemi": false
|
||||
},
|
||||
{
|
||||
"prefix": "de",
|
||||
"name": "Lysor",
|
||||
"isLieu": true
|
||||
},
|
||||
{
|
||||
"prefix": "d'",
|
||||
"name": "Oosal",
|
||||
"isLieu": true
|
||||
},
|
||||
{
|
||||
"prefix": "de",
|
||||
"name": "Thulé",
|
||||
"isLieu": true
|
||||
},
|
||||
{
|
||||
"prefix": "du",
|
||||
"name": "désespoir",
|
||||
"isLieu": false
|
||||
},
|
||||
{
|
||||
"prefix": "du",
|
||||
"name": "Dieu Bouffi",
|
||||
"isEnnemi": true
|
||||
},
|
||||
{
|
||||
"prefix": "du",
|
||||
"name": "silence",
|
||||
"isEnnemi": false
|
||||
},
|
||||
{
|
||||
"prefix": "de",
|
||||
"name": "Tyrus",
|
||||
"isLieu": true
|
||||
},
|
||||
{
|
||||
"prefix": "d'",
|
||||
"name": "Ygddar",
|
||||
"isLieu": true
|
||||
},
|
||||
{
|
||||
"prefix": "de",
|
||||
"name": "la Côte de Feu",
|
||||
"isLieu": true
|
||||
},
|
||||
{
|
||||
"prefix": "des",
|
||||
"name": "ombres cruelles",
|
||||
"isLieu": false
|
||||
},
|
||||
{
|
||||
"prefix": "de la",
|
||||
"name": "poussière écarlate",
|
||||
"isLieu": false
|
||||
},
|
||||
{
|
||||
"prefix": "du",
|
||||
"name": "destin",
|
||||
"isLieu": false
|
||||
},
|
||||
{
|
||||
"prefix": "du",
|
||||
"name": "Valgard",
|
||||
"isLieu": true
|
||||
},
|
||||
{
|
||||
"prefix": "de",
|
||||
"name": "Qeb",
|
||||
"isLieu": true
|
||||
},
|
||||
{
|
||||
"prefix": "de",
|
||||
"name": "la Mer Inconnue",
|
||||
"isLieu": true
|
||||
}
|
||||
],
|
||||
"mission": [
|
||||
{
|
||||
"name": "d’attaquer un lieu."
|
||||
},
|
||||
{
|
||||
"name": "de détruire un certain objet."
|
||||
},
|
||||
{
|
||||
"name": "de kidnapper quelqu’un."
|
||||
},
|
||||
{
|
||||
"name": "d’obtenir une certaine chose."
|
||||
},
|
||||
{
|
||||
"name": "d’explorer un lieu."
|
||||
},
|
||||
{
|
||||
"name": "de sauver une personne."
|
||||
},
|
||||
{
|
||||
"name": "d’échapper à quelqu’un."
|
||||
},
|
||||
{
|
||||
"name": "de fuir un lieu."
|
||||
},
|
||||
{
|
||||
"name": "de trouver une personne."
|
||||
},
|
||||
{
|
||||
"name": "de trouver un lieu."
|
||||
},
|
||||
{
|
||||
"name": "de trouver chose."
|
||||
},
|
||||
{
|
||||
"name": "de protéger une personne."
|
||||
},
|
||||
{
|
||||
"name": "de protéger un lieu."
|
||||
},
|
||||
{
|
||||
"name": "de protéger chose."
|
||||
},
|
||||
{
|
||||
"name": "de dérober une certaine chose."
|
||||
},
|
||||
{
|
||||
"name": "de tuer une personne."
|
||||
},
|
||||
{
|
||||
"name": "de détruire une chose."
|
||||
},
|
||||
{
|
||||
"name": "d’escorter une personne."
|
||||
},
|
||||
{
|
||||
"name": "de transporter une chose."
|
||||
}
|
||||
],
|
||||
"carriere": [
|
||||
"Noble",
|
||||
"Acrobate",
|
||||
"Sorcier",
|
||||
"Alchimiste",
|
||||
"Esclave",
|
||||
"Courtisane",
|
||||
"Médecin",
|
||||
"Marin",
|
||||
"Érudit",
|
||||
"Mendiant",
|
||||
"Scribe",
|
||||
"Poète",
|
||||
"Forgeron",
|
||||
"Prêtre",
|
||||
"Danseur",
|
||||
"Marchand",
|
||||
"Pilote des airs",
|
||||
"Fermier"
|
||||
],
|
||||
"lieux1": [
|
||||
"Palais",
|
||||
"Donjon",
|
||||
"Ruines",
|
||||
"Sanctuaire",
|
||||
"Crypte",
|
||||
"Forteresse",
|
||||
"Tombeau",
|
||||
"Grottes",
|
||||
"Tour",
|
||||
"Antre",
|
||||
"Île",
|
||||
"Montagne"
|
||||
],
|
||||
"lieux2": [
|
||||
"de la mort.",
|
||||
"de la destruction.",
|
||||
"du désespoir.",
|
||||
"des morts-vivants.",
|
||||
"du sage.",
|
||||
"de l'or.",
|
||||
"de la tempête.",
|
||||
"de la terreur.",
|
||||
"descannibales.",
|
||||
"du désespoir.",
|
||||
"des Rois-Sorciers.",
|
||||
"des âmes perdues."
|
||||
],
|
||||
"objets1": [
|
||||
"Livre",
|
||||
"Anneau",
|
||||
"Coupe",
|
||||
"Joyau",
|
||||
"Casque",
|
||||
"Parchemin",
|
||||
"Couronne",
|
||||
"Sceau",
|
||||
"Cristal",
|
||||
"Crâne",
|
||||
"Épée",
|
||||
"Bâton"
|
||||
],
|
||||
"objets2": [
|
||||
"des sept sceaux.",
|
||||
"de l'éternelle douleur.",
|
||||
"du sang bouillonnant.",
|
||||
"de la mort hideuse.",
|
||||
"du pouvoir suprême.",
|
||||
"du serpent sournois.",
|
||||
"du plaisir infini.",
|
||||
"de la richesse illusoire.",
|
||||
"de la cruelle trahison.",
|
||||
"du froid funeste.",
|
||||
"des spectres inapaisés.",
|
||||
"du mystère."
|
||||
],
|
||||
"motivation": [
|
||||
"c’est le genre de choses que fait Krongar.",
|
||||
"sinon il finira en prison.",
|
||||
"il est victime d’un chantage.",
|
||||
"il a trouvé une carte.",
|
||||
"il a été maudit.",
|
||||
"il a eu une vision (peut-être un soir de beuverie).",
|
||||
"il a été engagé pour le faire.",
|
||||
"il a surpris une conversation.",
|
||||
"il a lu quelque chose dans un ancien manuscrit.",
|
||||
"il est tombé accidentellement dans cette affaire.",
|
||||
"il cherche à assouvir une vengeance.",
|
||||
"il a ,été dupé."
|
||||
],
|
||||
"rival": [
|
||||
"un poète obsédé.",
|
||||
"un prince (esse) guerrier.",
|
||||
"un ministre corrompu.",
|
||||
"un sectateur fanatique.",
|
||||
"un noble arrogant.",
|
||||
"un étrange alchimiste.",
|
||||
"un sorcier maléfique.",
|
||||
"un druide cruel.",
|
||||
"un marchand cupide.",
|
||||
"un brigand sans foi ni loi.",
|
||||
"un démon sanguinaire.",
|
||||
"un fantôme errant."
|
||||
],
|
||||
"dieu": [
|
||||
"Tharungozoth",
|
||||
"Yrzlak",
|
||||
"Dyr",
|
||||
"Knothakon",
|
||||
"Hadron",
|
||||
"Shazzadion",
|
||||
"Chiomalla",
|
||||
"Sa’Tel",
|
||||
"Morgazzon",
|
||||
"Hurm",
|
||||
"Afyra",
|
||||
"Grondil",
|
||||
"Zaggath",
|
||||
"Zalkyr",
|
||||
"Fillana",
|
||||
"Lilandra",
|
||||
"Zylidith",
|
||||
"Quathoomar",
|
||||
"Iondal",
|
||||
"Piandra",
|
||||
"Nemmereth",
|
||||
"Charkond",
|
||||
"Karyzon",
|
||||
"Zarymphyxos",
|
||||
"Kryphondus"
|
||||
],
|
||||
"complique1": [
|
||||
"c’est toujours comme ça avec Krongar !",
|
||||
"la situation réveille chez Krongar des peurs ancestrales.",
|
||||
"un usurier et ses hommes de main veulent récupérer leur argent.",
|
||||
"une grave épidémie ravage la région.",
|
||||
"Krongar est traqué pour un crime passé.",
|
||||
"les actions d’un groupe de rebelles rendent la région peu sûre.",
|
||||
"des hordes de guerriers envahissent la région pour la conquérir",
|
||||
"un(e) ancien(ne) admirateur (trice) éconduit(e) cherche à se venger.",
|
||||
"la loi locale est très sévère et interdit une chose nécessaire à l’accomplissement de la mission.",
|
||||
"un(e) admirateur (trice) inattendu(e) déclare son amour.",
|
||||
"un rival qui fut défait autrefois réapparaît et met son grain de sel.",
|
||||
"la folie de Morgazzon fait des ravages dans la région."
|
||||
],
|
||||
"obstacle": [
|
||||
"d’un ancien secret.",
|
||||
"d’un long voyage.",
|
||||
"d’une malédiction.",
|
||||
"d’un voleur rusé.",
|
||||
"d’une forte troupe de soldats.",
|
||||
"d’un énorme monstre.",
|
||||
"d’une horde de monstres.",
|
||||
"d’un manque de temps.",
|
||||
"de gardes et de pièges magiques.",
|
||||
"d’une catastrophe naturelle sur le point de se produire.",
|
||||
"d’une énigme à résoudre.",
|
||||
"d’une bataille à gagner."
|
||||
],
|
||||
"retournement": [
|
||||
"L’ennemi est en fait Krongar lui-même, venu d’une autre réalité !",
|
||||
"Toute cette histoire était un piège machiavélique !",
|
||||
"L’ennemi est en fait un vieil ami ou un allié qui a comploté dans l’ombre !",
|
||||
"Krongar est contraint de s’associer à un rival pour accomplir la mission !",
|
||||
"Tout ce qui semblait ordinaire se révèle en fait surnaturel !",
|
||||
"L’ennemi est en fait le père, la mère, le frère ou la sœur de Krongar !",
|
||||
"Une toute autre mission attend en fait notre héros !",
|
||||
"Parfois, il n’y a pas de retournement de situation !",
|
||||
"i la mission est accomplie, cela entraînera de terribles répercussions !",
|
||||
"Le destin offre à Krongar une chance d’améliorer les choses, et il est renvoyé dans le temps au début de l’aventure. La saga recommence, mais cette fois sans retournement de situation !",
|
||||
"Un ami ou un allié a trahi Krongar !",
|
||||
"Les dieux sont furieux et lui imposent d'autres tâches"
|
||||
],
|
||||
"recompense": [
|
||||
"Rien du tout ! On s’est joué de lui !",
|
||||
"Beaucoup moins qu’escompté.",
|
||||
"Beaucoup moins qu’escompté, mais il gagne au moins la reconnaissance d’une personne haut placée.",
|
||||
"Beaucoup moins qu’escompté, mais il est marqué par les dieux (avantage).",
|
||||
"La récompense escomptée.",
|
||||
"La récompense escomptée, et il est marqué par les dieux (avantage).",
|
||||
"La récompense escomptée, ainsi que la reconnaissance d’une personne haut placée.",
|
||||
"Plus qu’escompté.",
|
||||
"Plus qu’escompté, ainsi que la reconnaissance d’une personne haut placée.",
|
||||
"Plus qu’escompté, et il est marqué par les dieux (avantage).",
|
||||
"Plus qu’escompté, ainsi que la reconnaissance d’une personne haut placée, et il est marqué par les dieux (avantage).",
|
||||
"Une promotion... Longue vie au roi Krongar !"
|
||||
]
|
||||
}
|
@ -1,5 +1,6 @@
|
||||
/* -------------------------------------------- */
|
||||
import { BoLRoll } from "../controllers/bol-rolls.js";
|
||||
import { BoLUtility } from "../system/bol-utility.js";
|
||||
|
||||
/* -------------------------------------------- */
|
||||
export class BoLTokenHud {
|
||||
@ -30,10 +31,17 @@ export class BoLTokenHud {
|
||||
(event) => {
|
||||
let actionIndex = Number(event.currentTarget.attributes['data-action-index'].value)
|
||||
let action = hudData.actionsList[actionIndex]
|
||||
const weapon = actor.items.get( action._id )
|
||||
BoLRoll.weaponCheckWithWeapon(hudData.actor, duplicate(weapon))
|
||||
//console.log("Clicked", action)
|
||||
} )
|
||||
const actionItem = actor.items.get(action._id)
|
||||
if (actionItem.system.subtype == "weapon") {
|
||||
BoLRoll.weaponCheckWithWeapon(hudData.actor, foundry.utils.duplicate(actionItem))
|
||||
} else if (actionItem.system.subtype == "fightoption") {
|
||||
let chatData = foundry.utils.duplicate(actionItem)
|
||||
if (actionItem.actor) {
|
||||
chatData.actor = { id: actionItem.actor._id };
|
||||
}
|
||||
BoLUtility.postItem(chatData);
|
||||
}
|
||||
})
|
||||
|
||||
const controlIconTarget = html.find('.control-icon[data-action=target]');
|
||||
// att+apt+career
|
||||
@ -41,18 +49,18 @@ export class BoLTokenHud {
|
||||
(event) => {
|
||||
let rollIndex = Number(event.currentTarget.attributes['data-roll-index'].value)
|
||||
let roll = hudData.rollsList[rollIndex]
|
||||
if ( roll.type == "aptitude") {
|
||||
BoLRoll.aptitudeCheck(actor, roll.key )
|
||||
} else if ( roll.type == "attribute") {
|
||||
BoLRoll.attributeCheck(actor, roll.key )
|
||||
if (roll.type == "aptitude") {
|
||||
BoLRoll.aptitudeCheck(actor, roll.key)
|
||||
} else if (roll.type == "attribute") {
|
||||
BoLRoll.attributeCheck(actor, roll.key)
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
static async addTokenHudExtensions(app, html, tokenId) {
|
||||
const controlIconCombat = html.find('.control-icon[data-action=combat]')
|
||||
if (controlIconCombat.length>0 ) {
|
||||
const controlIconCombat = html.find('.control-icon[data-action=combat]')
|
||||
if (controlIconCombat.length > 0) {
|
||||
BoLTokenHud.addExtensionHud(app, html, tokenId);
|
||||
}
|
||||
}
|
||||
@ -61,9 +69,9 @@ export class BoLTokenHud {
|
||||
static async _configureSubMenu(insertionPoint, template, hudData, onMenuItem) {
|
||||
const hud = $(await renderTemplate(template, hudData))
|
||||
const list = hud.find('div.bol-hud-list')
|
||||
|
||||
|
||||
BoLTokenHud._toggleHudListActive(hud, list);
|
||||
|
||||
|
||||
hud.find('img.bol-hud-togglebutton').click(event => BoLTokenHud._toggleHudListActive(hud, list));
|
||||
list.find('.bol-hud-menu').click(onMenuItem);
|
||||
|
||||
|
@ -1,86 +0,0 @@
|
||||
/* -------------------------------------------- */
|
||||
import { BoLUtility } from "./bol-utility.js";
|
||||
|
||||
/* -------------------------------------------- */
|
||||
export class BoLAdventureGenerator {
|
||||
|
||||
/* -------------------------------------------- */
|
||||
static async init() {
|
||||
this.adventureData = await fetchJsonWithTimeout("systems/bol/module/system/adventure_data.json")
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
static async createAdventure() {
|
||||
let roll1 = new Roll("1d" + this.adventureData.titre1.length).evaluate({ async: false })
|
||||
let roll2 = new Roll("1d" + this.adventureData.titre2.length).evaluate({ async: false })
|
||||
|
||||
let p1 = this.adventureData.titre1[roll1.result - 1]
|
||||
let p2 = this.adventureData.titre2[roll2.result - 1]
|
||||
|
||||
let story = {}
|
||||
story.title = "Krongar et " + p1.prefix + " " + p1.name + " " + p2.prefix + " " + p2.name
|
||||
|
||||
let rollM = new Roll("1d" + this.adventureData.mission.length).evaluate({ async: false })
|
||||
story.mission = "La mission de Krongar est de " + this.adventureData.mission[rollM.result - 1].name
|
||||
|
||||
if (!p1.isCarriere && !p2.isCarriere) {
|
||||
let rollC = new Roll("1d" + this.adventureData.carriere.length).evaluate({ async: false })
|
||||
story.carriere = "Une carrière : " + this.adventureData.carriere[rollC.result - 1]
|
||||
}
|
||||
|
||||
if (!p1.isLieu && !p2.isLieu) {
|
||||
let rollL1 = new Roll("1d" + this.adventureData.lieux1.length).evaluate({ async: false })
|
||||
let rollL2 = new Roll("1d" + this.adventureData.lieux2.length).evaluate({ async: false })
|
||||
story.lieu = "Un lieu : " + this.adventureData.lieux1[rollL1.result - 1] + " " + this.adventureData.lieux2[rollL2.result - 1]
|
||||
}
|
||||
|
||||
if (!p1.isObjet && !p2.isObjet) {
|
||||
let rollO1 = new Roll("1d" + this.adventureData.objets1.length).evaluate({ async: false })
|
||||
let rollO2 = new Roll("1d" + this.adventureData.objets2.length).evaluate({ async: false })
|
||||
story.objet = "Un objet : " + this.adventureData.objets1[rollO1.result - 1] + " " + this.adventureData.objets2[rollO2.result - 1]
|
||||
}
|
||||
|
||||
let rollMOT = new Roll("1d" + this.adventureData.motivation.length).evaluate({ async: false })
|
||||
story.motivation = "Krongar entreprend cette mission parce que " + this.adventureData.motivation[rollMOT.result - 1]
|
||||
|
||||
if (!p1.isEnnemi && !p2.isEnnemi) {
|
||||
let rollE = new Roll("1d" + this.adventureData.rival.length).evaluate({ async: false })
|
||||
story.rival = "Un rival : " + this.adventureData.rival[rollE.result - 1]
|
||||
}
|
||||
|
||||
let rollDieu = new Roll("1d6").evaluate({ async: false })
|
||||
if (rollDieu.result == 6) {
|
||||
rollDieu = new Roll("1d" + this.adventureData.dieu.length).evaluate({ async: false })
|
||||
story.dieu = "Un Dieu est impliqué : " + this.adventureData.dieu[rollDieu.result - 1]
|
||||
}
|
||||
|
||||
let rollComp = new Roll("1d6").evaluate({ async: false })
|
||||
if (rollComp.result >= 5) {
|
||||
rollComp = new Roll("1d" + this.adventureData.complique1.length).evaluate({ async: false })
|
||||
story.complication = "Une complication : " + this.adventureData.complique1[rollComp.result - 1]
|
||||
}
|
||||
|
||||
let rollObs = new Roll("1d6").evaluate({ async: false })
|
||||
if (rollObs.result >= 5) {
|
||||
rollObs = new Roll("1d" + this.adventureData.obstacle.length).evaluate({ async: false })
|
||||
story.obstacle = "Un obstacle : " + this.adventureData.obstacle[rollObs.result - 1]
|
||||
}
|
||||
|
||||
let rollRet = new Roll("1d6").evaluate({ async: false })
|
||||
if (rollRet.result == 6) {
|
||||
rollRet = new Roll("1d" + this.adventureData.retournement.length).evaluate({ async: false })
|
||||
story.retournement = "Un retournement : " + this.adventureData.retournement[rollRet.result - 1]
|
||||
}
|
||||
|
||||
let rollRec = new Roll("1d" + this.adventureData.recompense.length).evaluate({ async: false })
|
||||
story.recompense = "Pour sa peine, Krongar reçoit " + this.adventureData.recompense[rollRec.result - 1]
|
||||
|
||||
ChatMessage.create({
|
||||
alias: this.name,
|
||||
whisper: BoLUtility.getUsers(user => user.isGM),
|
||||
content: await renderTemplate('systems/bol/templates/chat/chat-adventure-result.hbs',
|
||||
{ name: "Aventure !", img: "icons/commodities/gems/gem-cluster-red.webp", story : story})
|
||||
})
|
||||
|
||||
}
|
||||
}
|
@ -40,14 +40,14 @@ export class BoLCalendar extends Application {
|
||||
constructor() {
|
||||
super();
|
||||
// position
|
||||
this.calendarPos = duplicate(game.settings.get(SYSTEM_RDD, "calendar-pos"));
|
||||
this.calendarPos = foundry.utils.duplicate(game.settings.get("bol", "calendar-pos"));
|
||||
if (this.calendarPos == undefined || this.calendarPos.top == undefined) {
|
||||
this.calendrierPos = BoLCalendar.createCalendarPos()
|
||||
game.settings.set("bol", "calendar-pos", this.calendarPos)
|
||||
}
|
||||
|
||||
// Calendar
|
||||
this.calendar = duplicate(game.settings.get("bol", "calendar") ?? BoLCalendar.getCalendar(0));
|
||||
this.calendar = foundry.utils.duplicate(game.settings.get("bol", "calendar") ?? BoLCalendar.getCalendar(0));
|
||||
this.calendar.year = this.calendar.year || 900
|
||||
this.calendar.month = 0
|
||||
|
||||
@ -58,7 +58,7 @@ export class BoLCalendar extends Application {
|
||||
|
||||
/* -------------------------------------------- */
|
||||
static get defaultOptions() {
|
||||
return mergeObject(super.defaultOptions, {
|
||||
return foundry.utils.mergeObject(super.defaultOptions, {
|
||||
template: "systems/bol/templates/calendar-template.html",
|
||||
popOut: false,
|
||||
resizable: false
|
||||
@ -95,11 +95,11 @@ export class BoLCalendar extends Application {
|
||||
this.calendar.hour -= 24
|
||||
await this.incrementDay()
|
||||
}
|
||||
game.settings.set("bol", "calendar", duplicate(this.calendar));
|
||||
game.settings.set("bol", "calendar", foundry.utils.duplicate(this.calendar));
|
||||
// Notification aux joueurs // TODO: replace with Hook on game settings update
|
||||
game.socket.emit(SYSTEM_SOCKET_ID, {
|
||||
msg: "msg_sync_time",
|
||||
data: duplicate(this.calendrier)
|
||||
data: foundry.utils.duplicate(this.calendrier)
|
||||
});
|
||||
}
|
||||
|
||||
@ -112,7 +112,7 @@ export class BoLCalendar extends Application {
|
||||
|
||||
/* -------------------------------------------- */
|
||||
syncPlayerTime(calendrier) {
|
||||
this.calendrier = duplicate(calendrier); // Local copy update
|
||||
this.calendrier = foundry.utils.duplicate(calendrier); // Local copy update
|
||||
this.updateDisplay();
|
||||
}
|
||||
|
||||
@ -123,7 +123,7 @@ export class BoLCalendar extends Application {
|
||||
}
|
||||
this.calendrier.heureRdD = indexHeure;
|
||||
this.calendrier.minutesRelative = 0;
|
||||
game.settings.set(SYSTEM_RDD, "calendrier", duplicate(this.calendrier));
|
||||
game.settings.set(SYSTEM_RDD, "calendrier", foundry.utils.duplicate(this.calendrier));
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
@ -312,13 +312,13 @@ export class BoLCalendar extends Application {
|
||||
this.calendrier.jour = Number(calendrierData.jourMois) - 1;
|
||||
this.calendrier.moisRdD = RdDCalendrier.getChiffreFromSigne(calendrierData.moisKey);
|
||||
this.calendrier.heureRdD = RdDCalendrier.getChiffreFromSigne(calendrierData.heureKey);
|
||||
game.settings.set(SYSTEM_RDD, "calendrier", duplicate(this.calendrier));
|
||||
game.settings.set(SYSTEM_RDD, "calendrier", foundry.utils.duplicate(this.calendrier));
|
||||
|
||||
await this.rebuildListeNombreAstral();
|
||||
|
||||
game.socket.emit(SYSTEM_SOCKET_ID, {
|
||||
msg: "msg_sync_time",
|
||||
data: duplicate(this.calendrier)
|
||||
data: foundry.utils.duplicate(this.calendrier)
|
||||
});
|
||||
|
||||
this.updateDisplay();
|
||||
@ -326,7 +326,7 @@ export class BoLCalendar extends Application {
|
||||
|
||||
/* -------------------------------------------- */
|
||||
async showCalendarEditor() {
|
||||
let calendrierData = duplicate(this.fillCalendrierData());
|
||||
let calendrierData = foundry.utils.duplicate(this.fillCalendrierData());
|
||||
if (this.editeur == undefined) {
|
||||
calendrierData.jourMoisOptions = RdDCalendrier.buildJoursMois();
|
||||
calendrierData.heuresOptions = [0, 1];
|
||||
@ -344,7 +344,7 @@ export class BoLCalendar extends Application {
|
||||
|
||||
/* -------------------------------------------- */
|
||||
async showAstrologieEditor() {
|
||||
let calendrierData = duplicate(this.fillCalendrierData());
|
||||
let calendrierData = foundry.utils.duplicate(this.fillCalendrierData());
|
||||
let astrologieArray = [];
|
||||
this.listeNombreAstral = this.listeNombreAstral || [];
|
||||
for (let astralData of this.listeNombreAstral) {
|
||||
@ -353,7 +353,7 @@ export class BoLCalendar extends Application {
|
||||
let actor = game.actors.get(vf.actorId);
|
||||
vf.actorName = (actor) ? actor.name : "Inconnu";
|
||||
}
|
||||
astrologieArray.push(duplicate(astralData));
|
||||
astrologieArray.push(foundry.utils.duplicate(astralData));
|
||||
}
|
||||
let heuresParActeur = {};
|
||||
for (let actor of game.actors) {
|
||||
@ -448,7 +448,7 @@ export class BoLCalendar extends Application {
|
||||
game.system.rdd.calendrier.calendrierPos.top = yPos;
|
||||
game.system.rdd.calendrier.calendrierPos.left = xPos;
|
||||
if (game.user.isGM) {
|
||||
game.settings.set(SYSTEM_RDD, "calendrier-pos", duplicate(game.system.rdd.calendrier.calendrierPos));
|
||||
game.settings.set(SYSTEM_RDD, "calendrier-pos", foundry.utils.duplicate(game.system.rdd.calendrier.calendrierPos));
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -456,7 +456,7 @@ export class BoLCalendar extends Application {
|
||||
game.system.rdd.calendrier.calendrierPos.top = 200;
|
||||
game.system.rdd.calendrier.calendrierPos.left = 200;
|
||||
if (game.user.isGM) {
|
||||
game.settings.set(SYSTEM_RDD, "calendrier-pos", duplicate(game.system.rdd.calendrier.calendrierPos));
|
||||
game.settings.set(SYSTEM_RDD, "calendrier-pos", foundry.utils.duplicate(game.system.rdd.calendrier.calendrierPos));
|
||||
}
|
||||
this.setPos(game.system.rdd.calendrier.calendrierPos);
|
||||
}
|
||||
|
@ -10,41 +10,25 @@ Init order =
|
||||
3 - Echec critique
|
||||
*/
|
||||
|
||||
import { BoLUtility } from "../system/bol-utility.js";
|
||||
|
||||
|
||||
export class BoLCombatManager extends Combat {
|
||||
|
||||
/************************************************************************************/
|
||||
async rollInitiative(ids, formula = undefined, messageOptions = {}) {
|
||||
console.log(`${game.data.system.data.title} | Combat.rollInitiative()`, ids, formula, messageOptions);
|
||||
console.log(`${game.system.title} | Combat.rollInitiative()`, ids, formula, messageOptions);
|
||||
// Structure input data
|
||||
ids = typeof ids === "string" ? [ids] : ids;
|
||||
const currentId = this.combatant._id;
|
||||
|
||||
// Get initiative malus from tough/adversary
|
||||
let malusInit = 0
|
||||
for (let combatant of this.combatants) {
|
||||
malusInit = Math.max(malusInit, combatant.actor.getInitiativeMalus())
|
||||
}
|
||||
// calculate initiative
|
||||
for (let cId = 0; cId < ids.length; cId++) {
|
||||
const combatant = this.combatants.get(ids[cId]);
|
||||
let fvttInit = 5
|
||||
if (combatant.actor.type == 'character') {
|
||||
let initData = combatant.actor.getLastInitData()
|
||||
console.log("Init data !!!", initData)
|
||||
if (initData.isLegendary) {
|
||||
fvttInit = 10
|
||||
} else if (initData.isCritical) {
|
||||
fvttInit = 9
|
||||
} else if (initData.lastinit >= 9) {
|
||||
fvttInit = 8
|
||||
} else if (initData.isFumble) {
|
||||
fvttInit = 3
|
||||
}
|
||||
} else {
|
||||
fvttInit = 4 // Pietaille par defaut
|
||||
if ( combatant.actor.getSubtype == 'adversary') {
|
||||
fvttInit = 7
|
||||
}
|
||||
if ( combatant.actor.getSubtype == 'tough') {
|
||||
fvttInit = 6
|
||||
}
|
||||
}
|
||||
const combatant = this.combatants.get(ids[cId])
|
||||
let fvttInit = combatant.actor.getInitiativeRank(false, true, { combatId: this.id, combatantId: combatant.id, malusInit })
|
||||
fvttInit += (cId / 100)
|
||||
await this.updateEmbeddedDocuments("Combatant", [{ _id: ids[cId], initiative: fvttInit }]);
|
||||
}
|
||||
@ -52,14 +36,65 @@ export class BoLCombatManager extends Combat {
|
||||
|
||||
/************************************************************************************/
|
||||
nextRound() {
|
||||
let combatants = this.combatants.contents
|
||||
for (let c of combatants) {
|
||||
let actor = game.actors.get( c.data.actorId )
|
||||
actor.clearRoundModifiers()
|
||||
if (game.user.isGM) {
|
||||
let combatants = this.combatants.contents
|
||||
let autoRemoveDead = game.settings.get("bol", "auto-remove-dead") // Optionnal auto-removal of dead char.
|
||||
let updates = []
|
||||
for (let c of combatants) {
|
||||
if (c.actor.type == "horde") {
|
||||
let actor = game.actors.get(c.actorId)
|
||||
updates.push({ _id: c.id, name: actor.name + " (" + actor.system.hordesize + ")" })
|
||||
}
|
||||
c.actor.clearRoundModifiers()
|
||||
let toRemove = []
|
||||
if (autoRemoveDead && c.actor.type == "encounter" &&
|
||||
(c.actor.system.chartype == "tough" || c.actor.system.chartype == "creature" || c.actor.system.chartype == "base") && c.actor.system.resources.hp.value <= 0) {
|
||||
toRemove.push(c.id || c._id)
|
||||
}
|
||||
//console.log("REM", autoRemoveDead, toRemove, c.actor)
|
||||
if (toRemove.length > 0) {
|
||||
this.deleteEmbeddedDocuments('Combatant', toRemove)
|
||||
}
|
||||
if (updates.length > 0) {
|
||||
this.updateEmbeddedDocuments('Combatant', updates)
|
||||
}
|
||||
}
|
||||
}
|
||||
super.nextRound()
|
||||
}
|
||||
|
||||
/************************************************************************************/
|
||||
startCombat() {
|
||||
if (game.user.isGM) {
|
||||
let updates = []
|
||||
let combatants = this.combatants.contents
|
||||
for (let c of combatants) {
|
||||
let actor = game.actors.get(c.actorId)
|
||||
actor.storeVitaliteCombat()
|
||||
if (c.actor.type == "horde") {
|
||||
let actor = game.actors.get(c.actorId)
|
||||
updates.push({ _id: c.id, name: actor.name + " (" + actor.system.hordesize + ")" })
|
||||
}
|
||||
}
|
||||
if (updates.length > 0) {
|
||||
this.updateEmbeddedDocuments('Combatant', updates)
|
||||
}
|
||||
}
|
||||
return super.startCombat()
|
||||
}
|
||||
|
||||
/*-***********************************************************************************/
|
||||
_onDelete() {
|
||||
if (game.user.isGM) {
|
||||
let combatants = this.combatants.contents
|
||||
for (let c of combatants) {
|
||||
let actor = game.actors.get(c.actorId)
|
||||
actor.clearInitiative()
|
||||
actor.displayRecuperation()
|
||||
}
|
||||
}
|
||||
super._onDelete()
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
@ -1,5 +1,3 @@
|
||||
/* -------------------------------------------- */
|
||||
import { BoLAdventureGenerator } from "./bol-adventure-generator.js"
|
||||
|
||||
/* -------------------------------------------- */
|
||||
export class BoLCommands {
|
||||
@ -7,7 +5,6 @@ export class BoLCommands {
|
||||
static init() {
|
||||
if (!game.bol.commands) {
|
||||
const bolCommands = new BoLCommands()
|
||||
bolCommands.registerCommand({ path: ["/adventure"], func: (content, msg, params) => BoLAdventureGenerator.createAdventure(), descr: "Nouvelle idée d'aventure!" });
|
||||
game.bol.commands = bolCommands
|
||||
}
|
||||
|
||||
@ -86,7 +83,7 @@ export class BoLCommands {
|
||||
console.log("===> Processing command")
|
||||
let command = commandsTable[name];
|
||||
path = path + name + " ";
|
||||
if (command && command.subTable) {
|
||||
if (command?.subTable) {
|
||||
if (params[0]) {
|
||||
return this._processCommand(command.subTable, params[0], params.slice(1), content, msg, path)
|
||||
}
|
||||
@ -95,9 +92,9 @@ export class BoLCommands {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
if (command && command.func) {
|
||||
if (command?.func) {
|
||||
const result = command.func(content, msg, params);
|
||||
if (result == false) {
|
||||
if (!result) {
|
||||
BoLCommands._chatAnswer(msg, command.descr);
|
||||
}
|
||||
return true;
|
||||
|
@ -2,6 +2,21 @@ import { BoLRoll } from "../controllers/bol-rolls.js";
|
||||
|
||||
export class BoLHotbar {
|
||||
|
||||
|
||||
static async assignToHotBar( item, slot) {
|
||||
let command = `game.bol.BoLHotbar.rollMacro("${item.name}", "${item.type}");`
|
||||
let macro = game.macros.contents.find(m => (m.name === item.name) && (m.command === command))
|
||||
if (!macro) {
|
||||
macro = await Macro.create({
|
||||
name: item.name,
|
||||
type: "script",
|
||||
img: item.img,
|
||||
command: command
|
||||
}, { displaySheet: false })
|
||||
}
|
||||
await game.user.assignHotbarMacro(macro, slot);
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a macro when dropping an entity on the hotbar
|
||||
* Item - open roll dialog for item
|
||||
@ -10,55 +25,20 @@ export class BoLHotbar {
|
||||
*/
|
||||
static init( ) {
|
||||
|
||||
Hooks.on("hotbarDrop", async (bar, documentData, slot) => {
|
||||
Hooks.on("hotbarDrop", (bar, documentData, slot) => {
|
||||
// Create item macro if rollable item - weapon, spell, prayer, trait, or skill
|
||||
if (documentData.type == "Item") {
|
||||
console.log("Drop done !!!", bar, documentData, slot)
|
||||
let item = documentData.data
|
||||
let command = `game.bol.BoLHotbar.rollMacro("${item.name}", "${item.type}");`
|
||||
let macro = game.macros.contents.find(m => (m.name === item.name) && (m.command === command))
|
||||
if (!macro) {
|
||||
macro = await Macro.create({
|
||||
name: item.name,
|
||||
type: "script",
|
||||
img: item.img,
|
||||
command: command
|
||||
}, { displaySheet: false })
|
||||
let item = fromUuidSync(documentData.uuid)
|
||||
if (item == undefined) {
|
||||
item = this.actor.items.get(documentData.uuid)
|
||||
}
|
||||
game.user.assignHotbarMacro(macro, slot);
|
||||
}
|
||||
// Create a macro to open the actor sheet of the actor dropped on the hotbar
|
||||
else if (documentData.type == "Actor") {
|
||||
let actor = game.actors.get(documentData.id);
|
||||
let command = `game.actors.get("${documentData.id}").sheet.render(true)`
|
||||
let macro = game.macros.contents.find(m => (m.name === actor.name) && (m.command === command));
|
||||
if (!macro) {
|
||||
macro = await Macro.create({
|
||||
name: actor.data.name,
|
||||
type: "script",
|
||||
img: actor.data.img,
|
||||
command: command
|
||||
}, { displaySheet: false })
|
||||
game.user.assignHotbarMacro(macro, slot);
|
||||
if (item && (item.system.subtype === "weapon" || item.system.category === "spell")) {
|
||||
this.assignToHotBar( item, slot )
|
||||
return false
|
||||
}
|
||||
}
|
||||
// Create a macro to open the journal sheet of the journal dropped on the hotbar
|
||||
else if (documentData.type == "JournalEntry") {
|
||||
let journal = game.journal.get(documentData.id);
|
||||
let command = `game.journal.get("${documentData.id}").sheet.render(true)`
|
||||
let macro = game.macros.contents.find(m => (m.name === journal.name) && (m.command === command));
|
||||
if (!macro) {
|
||||
macro = await Macro.create({
|
||||
name: journal.data.name,
|
||||
type: "script",
|
||||
img: "systems/bol/icons/images/icone_parchement_vierge.webp",
|
||||
command: command
|
||||
}, { displaySheet: false })
|
||||
game.user.assignHotbarMacro(macro, slot);
|
||||
}
|
||||
}
|
||||
return false;
|
||||
});
|
||||
return true
|
||||
})
|
||||
}
|
||||
|
||||
/** Roll macro */
|
||||
@ -68,18 +48,18 @@ export class BoLHotbar {
|
||||
if (speaker.token) actor = game.actors.tokens[speaker.token]
|
||||
if (!actor) actor = game.actors.get(speaker.actor)
|
||||
if (!actor) {
|
||||
return ui.notifications.warn(`Selectionnez votre personnage pour utiliser la macro`)
|
||||
return ui.notifications.warn( game.i18n.localize("BOL.ui.selectactor") )
|
||||
}
|
||||
|
||||
let item = actor.items.find(it => it.name === itemName && it.type == itemType)
|
||||
if (!item ) {
|
||||
return ui.notifications.warn(`Impossible de trouver l'objet de cette macro`)
|
||||
return ui.notifications.warn( game.i18n.localize("BOL.ui.itemnotfound") )
|
||||
}
|
||||
// Trigger the item roll
|
||||
if (item.data.data.category === "equipment" && item.data.data.subtype === "weapon") {
|
||||
if (item.system.category === "equipment" && item.system.subtype === "weapon") {
|
||||
return BoLRoll.weaponCheckWithWeapon( actor, item)
|
||||
}
|
||||
if (item.data.data.category === "spell") {
|
||||
if (item.system.category === "spell") {
|
||||
return BoLRoll.spellCheckWithSpell( actor, item)
|
||||
}
|
||||
}
|
||||
|
@ -1,40 +1,172 @@
|
||||
import { BoLDefaultRoll } from "../controllers/bol-rolls.js";
|
||||
import { BoLRoll, BoLDefaultRoll } from "../controllers/bol-rolls.js";
|
||||
|
||||
// Spell circle to min PP cost
|
||||
const __circle2minpp = { 0: 0, 1: 2, 2: 6, 3: 11 }
|
||||
|
||||
const __validDices = { "6": 1, "8": 1, "10": 1, "12": 1 }
|
||||
export class BoLUtility {
|
||||
|
||||
|
||||
/* -------------------------------------------- */
|
||||
static init() {
|
||||
this.attackStore = {}
|
||||
|
||||
game.settings.register("bol", "rollArmor", {
|
||||
name: "Effectuer des jets pour les armures",
|
||||
hint: "Effectue un jet de dés pour les armures (valeur fixe si désactivé)",
|
||||
name: game.i18n.localize("BOL.settings.rollArmor"),
|
||||
hint: game.i18n.localize("BOL.settings.rollArmorTooltip"),
|
||||
scope: "world",
|
||||
config: true,
|
||||
default: true,
|
||||
type: Boolean,
|
||||
onChange: lang => window.location.reload()
|
||||
});
|
||||
})
|
||||
game.settings.register("bol", "useBougette", {
|
||||
name: "Utiliser la Bougette (règle fan-made)",
|
||||
hint: "Utilise un indicateur de Bougette, comme décrit dans l'aide de jeu Gold&Glory du RatierBretonnien (https://www.lahiette.com/leratierbretonnien/)",
|
||||
name: game.i18n.localize("BOL.settings.useBougette"),
|
||||
hint: game.i18n.localize("BOL.settings.useBougetteTooltip"),
|
||||
scope: "world",
|
||||
config: true,
|
||||
default: false,
|
||||
type: Boolean,
|
||||
onChange: lang => window.location.reload()
|
||||
});
|
||||
})
|
||||
game.settings.register("bol", "auto-remove-dead", {
|
||||
name: game.i18n.localize("BOL.settings.removeDead"),
|
||||
hint: game.i18n.localize("BOL.settings.removeDeadTooltip"),
|
||||
scope: "world",
|
||||
config: true,
|
||||
default: false,
|
||||
type: Boolean
|
||||
})
|
||||
game.settings.register("bol", "dice-formula", {
|
||||
name: game.i18n.localize("BOL.settings.diceFormula"),
|
||||
hint: game.i18n.localize("BOL.settings.diceFormulaTooltip"),
|
||||
scope: "world",
|
||||
config: true,
|
||||
default: "6",
|
||||
type: String,
|
||||
choices: { "6": "2d6", "8": "2d8", "10": "2d10", "12": "2d12", "20": "2d20" },
|
||||
onChange: value => {
|
||||
BoLUtility.setDiceFormula(value)
|
||||
}
|
||||
})
|
||||
game.settings.register("bol", "dice-success-value", {
|
||||
name: game.i18n.localize("BOL.settings.diceSuccessValue"),
|
||||
hint: game.i18n.localize("BOL.settings.diceSuccessValueTooltip"),
|
||||
scope: "world",
|
||||
config: true,
|
||||
default: 9,
|
||||
range: {
|
||||
min: 2,
|
||||
max: 40,
|
||||
step: 1
|
||||
},
|
||||
type: Number,
|
||||
onChange: value => {
|
||||
BoLUtility.setSuccessValue(value)
|
||||
}
|
||||
})
|
||||
game.settings.register("bol", "dice-critical-success-value", {
|
||||
name: game.i18n.localize("BOL.settings.diceCriticalValue"),
|
||||
hint: game.i18n.localize("BOL.settings.diceCriticalValueTooltip"),
|
||||
scope: "world",
|
||||
config: true,
|
||||
default: 12,
|
||||
range: {
|
||||
min: 2,
|
||||
max: 40,
|
||||
step: 1
|
||||
},
|
||||
type: Number,
|
||||
onChange: value => {
|
||||
BoLUtility.setCriticalSuccessValue(value)
|
||||
}
|
||||
})
|
||||
game.settings.register("bol", "dice-critical-failure-value", {
|
||||
name: game.i18n.localize("BOL.settings.diceCriticalFailure"),
|
||||
hint: game.i18n.localize("BOL.settings.diceCriticalFailureTooltip"),
|
||||
scope: "world",
|
||||
config: true,
|
||||
default: 2,
|
||||
range: {
|
||||
min: 2,
|
||||
max: 40,
|
||||
step: 1
|
||||
},
|
||||
type: Number,
|
||||
onChange: value => {
|
||||
BoLUtility.setCriticalFailureValue(value)
|
||||
}
|
||||
})
|
||||
game.settings.register("world", "character-summary-data", {
|
||||
name: "character-summary-data",
|
||||
scope: "world",
|
||||
config: false,
|
||||
default: { npcList: [], x: 200, y: 200 },
|
||||
type: Object
|
||||
})
|
||||
game.settings.register("bol", "logoActorSheet", {
|
||||
name: game.i18n.localize("BOL.settings.defaultLogoActorSheetPath"),
|
||||
hint: game.i18n.localize("BOL.settings.defaultLogoPathActorSheetTooltip"),
|
||||
scope: "world",
|
||||
config: true,
|
||||
default: "/systems/bol/ui/logo.webp",
|
||||
type: String,
|
||||
onChange: lang => window.location.reload()
|
||||
})
|
||||
game.settings.register("bol", "logoTopLeft", {
|
||||
name: game.i18n.localize("BOL.settings.defaultLogoTopLeftPath"),
|
||||
hint: game.i18n.localize("BOL.settings.defaultLogoTopLeftPathTooltip"),
|
||||
scope: "world",
|
||||
config: true,
|
||||
default: "/systems/bol/ui/logo2.webp",
|
||||
type: String,
|
||||
onChange: lang => window.location.reload()
|
||||
})
|
||||
game.settings.register("bol", "horoscope-group", {
|
||||
name: "horoscope-group",
|
||||
scope: "world",
|
||||
config: false,
|
||||
default: {},
|
||||
type: Object
|
||||
})
|
||||
|
||||
this.rollArmor = game.settings.get("bol", "rollArmor") // Roll armor or not
|
||||
this.useBougette = game.settings.get("bol", "useBougette") // Use optionnal bougette rules
|
||||
this.actorSheetLogo = game.settings.get("bol", "logoActorSheet") || "/systems/bol/ui/logo.webp"
|
||||
this.logoTopLeft = game.settings.get("bol", "logoTopLeft") || "/systems/bol/ui/logo2.webp"
|
||||
|
||||
this.diceFormula = game.settings.get("bol", "dice-formula")
|
||||
this.successValue = Number(game.settings.get("bol", "dice-success-value"))
|
||||
this.criticalSuccessValue = Number(game.settings.get("bol", "dice-critical-success-value"))
|
||||
this.criticalFailureValue = Number(game.settings.get("bol", "dice-critical-failure-value"))
|
||||
|
||||
// Update the effect modifiers
|
||||
game.bol.config.effectIdentifiers = foundry.utils.mergeObject(game.bol.config.effectIdentifiers, game.bol.config.attackAttributes)
|
||||
game.bol.config.effectIdentifiers = foundry.utils.mergeObject(game.bol.config.effectIdentifiers, game.bol.config.aptitudes)
|
||||
}
|
||||
|
||||
|
||||
/* -------------------------------------------- */
|
||||
static setDiceFormula(value) {
|
||||
this.diceFormula = value
|
||||
}
|
||||
static setSuccessValue(value) {
|
||||
this.successValue = Number(value)
|
||||
}
|
||||
static setCriticalSuccessValue(value) {
|
||||
this.criticalSuccessValue = Number(value)
|
||||
}
|
||||
static setCriticalFailureValue(value) {
|
||||
this.criticalFailureValue = Number(value)
|
||||
}
|
||||
static getDiceData() {
|
||||
let df = this.diceFormula
|
||||
if (!__validDices[String(this.diceFormula)]) {
|
||||
df = "6"
|
||||
}
|
||||
return {
|
||||
diceFormula: df,
|
||||
successValue: this.successValue,
|
||||
criticalSuccessValue: this.criticalSuccessValue,
|
||||
criticalFailureValue: this.criticalFailureValue
|
||||
}
|
||||
}
|
||||
/* -------------------------------------------- */
|
||||
static getRollArmor() {
|
||||
return this.rollArmor
|
||||
@ -43,34 +175,72 @@ export class BoLUtility {
|
||||
static getUseBougette() {
|
||||
return this.useBougette
|
||||
}
|
||||
/* -------------------------------------------- */
|
||||
static getLogoActorSheet() {
|
||||
return this.actorSheetLogo
|
||||
}
|
||||
/* -------------------------------------------- */
|
||||
static getLogoTopLeft() {
|
||||
return this.logoTopLeft
|
||||
}
|
||||
/* -------------------------------------------- */
|
||||
static getActorFromRollData(rollData) {
|
||||
let actor = game.actors.get(rollData.actorId)
|
||||
if (rollData.tokenId) {
|
||||
let token = canvas.tokens.placeables.find(t => t.id == rollData.tokenId)
|
||||
if (token) {
|
||||
actor = token.actor
|
||||
}
|
||||
}
|
||||
return actor
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
static async ready() {
|
||||
//$("#logo").attr("src", this.getLogoTopLeft() )
|
||||
$("#logo").css("content", `url(${this.getLogoTopLeft()})`)
|
||||
|
||||
CONFIG.statusEffects = foundry.utils.duplicate(game.bol.config.statusEffects)
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
static templateData(it) {
|
||||
return BoLUtility.data(it)?.data ?? {}
|
||||
}
|
||||
static chatDataSetup(content, modeOverride, isRoll = false, forceWhisper) {
|
||||
let chatData = {
|
||||
user: game.user.id,
|
||||
rollMode: modeOverride || game.settings.get("core", "rollMode"),
|
||||
content: content
|
||||
};
|
||||
|
||||
/* -------------------------------------------- */
|
||||
static data(it) {
|
||||
if (it instanceof Actor || it instanceof Item || it instanceof Combatant) {
|
||||
return it.data;
|
||||
if (["gmroll", "blindroll"].includes(chatData.rollMode)) chatData["whisper"] = ChatMessage.getWhisperRecipients("GM").map(u => u.id);
|
||||
if (chatData.rollMode === "blindroll") chatData["blind"] = true;
|
||||
else if (chatData.rollMode === "selfroll") chatData["whisper"] = [game.user];
|
||||
|
||||
if (forceWhisper) { // Final force !
|
||||
chatData["speaker"] = ChatMessage.getSpeaker();
|
||||
chatData["whisper"] = ChatMessage.getWhisperRecipients(forceWhisper);
|
||||
}
|
||||
return it;
|
||||
|
||||
return chatData;
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
static storeRoll(roll) {
|
||||
this.rollTab[roll.id] = roll
|
||||
}
|
||||
static postItem(chatData) {
|
||||
// Don't post any image for the item (which would leave a large gap) if the default image is used
|
||||
if (chatData.img.includes("/blank.png")) {
|
||||
chatData.img = null;
|
||||
}
|
||||
// JSON object for easy creation
|
||||
chatData.jsondata = JSON.stringify(
|
||||
{
|
||||
compendium: "postedItem",
|
||||
payload: chatData,
|
||||
});
|
||||
|
||||
/* -------------------------------------------- */
|
||||
static getRoll(rollId) {
|
||||
return this.rollTab[roll.id]
|
||||
renderTemplate('systems/bol/templates/item/post-item.hbs', chatData).then(html => {
|
||||
let chatOptions = BoLUtility.chatDataSetup(html);
|
||||
ChatMessage.create(chatOptions)
|
||||
});
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
static createDirectOptionList(min, max) {
|
||||
let options = {};
|
||||
@ -115,7 +285,7 @@ export class BoLUtility {
|
||||
}
|
||||
/* -------------------------------------------- */
|
||||
static getUsers(filter) {
|
||||
return game.users.filter(filter).map(user => user.data._id);
|
||||
return game.users.filter(filter).map(user => user.id);
|
||||
}
|
||||
/* -------------------------------------------- */
|
||||
static getWhisperRecipients(rollMode, name) {
|
||||
@ -131,7 +301,7 @@ export class BoLUtility {
|
||||
let users = []
|
||||
for (let user of game.users) {
|
||||
if (!user.isGM && user.name != name) {
|
||||
users.push(user.data._id)
|
||||
users.push(user.id)
|
||||
}
|
||||
}
|
||||
return users
|
||||
@ -145,7 +315,7 @@ export class BoLUtility {
|
||||
|
||||
/* -------------------------------------------- */
|
||||
static blindMessageToGM(chatOptions) {
|
||||
let chatGM = duplicate(chatOptions);
|
||||
let chatGM = foundry.utils.duplicate(chatOptions);
|
||||
chatGM.whisper = this.getUsers(user => user.isGM);
|
||||
chatGM.content = "Blind message of " + game.user.name + "<br>" + chatOptions.content;
|
||||
console.log("blindMessageToGM", chatGM);
|
||||
@ -153,13 +323,13 @@ export class BoLUtility {
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
static sendAttackSuccess(attackDef) {
|
||||
if (attackDef.targetId) {
|
||||
static sendAttackSuccess(rollData) {
|
||||
if (rollData.targetId) {
|
||||
// Broadcast to GM or process it directly in case of GM defense
|
||||
if (!game.user.isGM) {
|
||||
game.socket.emit("system.bol", { name: "msg_attack_success", data: duplicate(attackDef) })
|
||||
game.socket.emit("system.bol", { name: "msg_attack_success", data: foundry.utils.duplicate(rollData) })
|
||||
} else {
|
||||
BoLUtility.processAttackSuccess(attackDef)
|
||||
BoLUtility.processAttackSuccess(rollData)
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -171,7 +341,7 @@ export class BoLUtility {
|
||||
// If the user is the message author or the actor owner, proceed
|
||||
const actor = game.actors.get(data.message.speaker.actor)
|
||||
//console.log("FOUND 1!!! ", actor)
|
||||
if (actor && actor.isOwner) return
|
||||
if (actor?.isOwner) return
|
||||
else if (game.user.isGM || data.author.id === game.user.id) return
|
||||
|
||||
const divButtons = chatCard.find('.actions-section')
|
||||
@ -185,6 +355,14 @@ export class BoLUtility {
|
||||
let message = game.messages.get(messageId)
|
||||
return message.getFlag("world", "bol-roll-data")
|
||||
}
|
||||
/* -------------------------------------------- */
|
||||
static requestInitRoll(actorId, combatData) {
|
||||
let actor = game.actors.get(actorId)
|
||||
if (actor?.isOwner) {
|
||||
ui.notifications.info(game.i18n.localize("BOL.ui.warninitiative"))
|
||||
BoLRoll.aptitudeCheck(actor, "init", undefined, combatData)
|
||||
}
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
static cleanupButtons(id) {
|
||||
@ -240,10 +418,15 @@ export class BoLUtility {
|
||||
|
||||
html.on("click", '.damage-handling', event => {
|
||||
event.preventDefault()
|
||||
let attr = event.currentTarget.attributes['data-attack-id']
|
||||
if ( !attr) {
|
||||
ui.notifications.warn("Impossible de trouver l'attaque correspondante, erreur de suivi de combat.")
|
||||
return
|
||||
}
|
||||
let attackId = event.currentTarget.attributes['data-attack-id'].value
|
||||
let defenseMode = event.currentTarget.attributes['data-defense-mode'].value
|
||||
let weaponId = (event.currentTarget.attributes['data-weapon-id']) ? event.currentTarget.attributes['data-weapon-id'].value : -1
|
||||
|
||||
|
||||
// Remove message for all
|
||||
let msgId = BoLUtility.findChatMessageId(event.currentTarget)
|
||||
if (game.user.isGM) {
|
||||
@ -252,75 +435,94 @@ export class BoLUtility {
|
||||
game.socket.emit("system.bol", { name: "msg_damage_handling", data: { msgId: msgId, attackId: attackId, defenseMode: defenseMode, weaponId: weaponId } })
|
||||
}
|
||||
})
|
||||
|
||||
html.on("click", '.recup-vitalite', event => {
|
||||
event.preventDefault()
|
||||
let actorId = event.currentTarget.attributes['data-actor-id'].value
|
||||
let recupHP = event.currentTarget.attributes['data-recup-hp'].value
|
||||
let actor = game.actors.get(actorId)
|
||||
|
||||
let messageId = BoLUtility.findChatMessageId(event.currentTarget)
|
||||
BoLUtility.removeChatMessageId(messageId)
|
||||
|
||||
actor.applyRecuperation(recupHP)
|
||||
})
|
||||
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
static async processDamageHandling(attackId, defenseMode, weaponId = -1, msgId) {
|
||||
static async processDamageHandling(attackId, defenseMode, weaponId, msgId) {
|
||||
if (!game.user.isGM) {
|
||||
return
|
||||
}
|
||||
BoLUtility.removeChatMessageId( msgId )
|
||||
let message = game.messages.get(msgId)
|
||||
let rollData = message.getFlag("world", "bol-roll-data")
|
||||
BoLUtility.removeChatMessageId(msgId)
|
||||
|
||||
console.log("Damage Handling", attackId, defenseMode, weaponId)
|
||||
// Only GM process this
|
||||
let attackDef = this.attackStore[attackId]
|
||||
if (attackDef && attackDef.defenderId) {
|
||||
if (attackDef.defenseDone) {
|
||||
// Only GM process this
|
||||
if (rollData?.defenderId) {
|
||||
if (rollData.defenseDone || defenseMode == 'damage-not-applied') {
|
||||
return
|
||||
} // ?? Why ???
|
||||
attackDef.defenseDone = true
|
||||
attackDef.defenseMode = defenseMode
|
||||
let token = game.scenes.current.tokens.get(attackDef.targetId)
|
||||
rollData.defenseDone = true
|
||||
rollData.defenseMode = defenseMode
|
||||
let token = game.scenes.current.tokens.get(rollData.targetId)
|
||||
let defender = token.actor
|
||||
|
||||
if (defenseMode == 'damage-with-armor') {
|
||||
let armorFormula = defender.getArmorFormula()
|
||||
attackDef.rollArmor = new Roll(armorFormula)
|
||||
attackDef.rollArmor.roll({ async: false })
|
||||
attackDef.armorProtect = (attackDef.rollArmor.total < 0) ? 0 : attackDef.rollArmor.total
|
||||
attackDef.finalDamage = attackDef.damageTotal - attackDef.armorProtect
|
||||
attackDef.finalDamage = (attackDef.finalDamage < 0) ? 0 : attackDef.finalDamage
|
||||
defender.sufferDamage(attackDef.finalDamage)
|
||||
console.log("Armor roll -> result ", attackDef)
|
||||
rollData.rollArmor = new Roll(armorFormula)
|
||||
await rollData.rollArmor.roll()
|
||||
let msg = await rollData.rollArmor.toMessage({ flavor: "BOL.chat.armorRoll : " + armorFormula });
|
||||
if ( game.dice3d) { // wait animation end when DsN is there
|
||||
await game.dice3d.waitFor3DAnimationByMessageID(msg.id);
|
||||
}
|
||||
rollData.armorProtect = (rollData.rollArmor.total < 0) ? 0 : rollData.rollArmor.total
|
||||
rollData.finalDamage = rollData.damageTotal - rollData.armorProtect
|
||||
rollData.finalDamage = (rollData.finalDamage < 0) ? 0 : rollData.finalDamage
|
||||
await defender.sufferDamage(rollData.finalDamage)
|
||||
console.log("Armor roll -> result ", rollData)
|
||||
}
|
||||
if (defenseMode == 'damage-without-armor') {
|
||||
attackDef.finalDamage = attackDef.damageTotal
|
||||
defender.sufferDamage(attackDef.finalDamage)
|
||||
rollData.finalDamage = rollData.damageTotal
|
||||
defender.sufferDamage(rollData.finalDamage)
|
||||
}
|
||||
if (defenseMode == 'hero-reduce-damage') {
|
||||
let armorFormula = defender.getArmorFormula()
|
||||
attackDef.rollArmor = new Roll(armorFormula)
|
||||
attackDef.rollArmor.roll({ async: false })
|
||||
attackDef.armorProtect = (attackDef.rollArmor.total < 0) ? 0 : attackDef.rollArmor.total
|
||||
attackDef.rollHero = new Roll("1d6")
|
||||
attackDef.rollHero.roll({ async: false })
|
||||
attackDef.finalDamage = attackDef.damageTotal - attackDef.rollHero.total - attackDef.armorProtect
|
||||
attackDef.finalDamage = (attackDef.finalDamage < 0) ? 0 : attackDef.finalDamage
|
||||
defender.sufferDamage(attackDef.finalDamage)
|
||||
rollData.rollArmor = new Roll(armorFormula)
|
||||
await rollData.rollArmor.roll()
|
||||
rollData.armorProtect = (rollData.rollArmor.total < 0) ? 0 : rollData.rollArmor.total
|
||||
rollData.rollHero = new Roll("1d6")
|
||||
await rollData.rollHero.roll()
|
||||
rollData.finalDamage = rollData.damageTotal - rollData.rollHero.total - rollData.armorProtect
|
||||
rollData.finalDamage = (rollData.finalDamage < 0) ? 0 : rollData.finalDamage
|
||||
await defender.sufferDamage(rollData.finalDamage)
|
||||
defender.subHeroPoints(1)
|
||||
}
|
||||
if (defenseMode == 'hero-in-extremis') {
|
||||
attackDef.finalDamage = 0;
|
||||
attackDef.weaponHero = defender.weapons.find(item => item._id == weaponId);
|
||||
defender.deleteEmbeddedDocuments("Item", [weaponId]);
|
||||
rollData.finalDamage = 0;
|
||||
rollData.weaponHero = defender.weapons.find(item => item._id == weaponId);
|
||||
await defender.deleteEmbeddedDocuments("Item", [weaponId]);
|
||||
}
|
||||
|
||||
let defenderUser
|
||||
for (let user of game.users) {
|
||||
if ( user.character && user.character.id == defender.id ) {
|
||||
if (user.character && user.character.id == defender.id) {
|
||||
defenderUser = user
|
||||
}
|
||||
}
|
||||
}
|
||||
let damageResults = {
|
||||
attackId: attackDef.id,
|
||||
attacker: attackDef.attacker,
|
||||
rollArmor: attackDef.rollArmor,
|
||||
rollHero: attackDef.rollHero,
|
||||
weaponHero: attackDef.weaponHero,
|
||||
armorProtect: attackDef.armorProtect,
|
||||
attackId: rollData.id,
|
||||
attacker: rollData.attacker,
|
||||
rollArmor: rollData.rollArmor,
|
||||
rollHero: rollData.rollHero,
|
||||
weaponHero: rollData.weaponHero,
|
||||
armorProtect: rollData.armorProtect,
|
||||
name: defender.name,
|
||||
defender: defender,
|
||||
defenseMode: attackDef.defenseMode,
|
||||
finalDamage: attackDef.finalDamage
|
||||
defenseMode: rollData.defenseMode,
|
||||
finalDamage: rollData.finalDamage
|
||||
}
|
||||
ChatMessage.create({
|
||||
alias: defender.name,
|
||||
@ -364,7 +566,7 @@ export class BoLUtility {
|
||||
}
|
||||
/* -------------------------------------------- */
|
||||
static isRangedWeapon(weapon) {
|
||||
return weapon.data.type == 'ranged' || weapon.data.thrown;
|
||||
return weapon.system.type == 'ranged' || weapon.system.thrown;
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
@ -407,28 +609,29 @@ export class BoLUtility {
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
static async processAttackSuccess(attackDef) {
|
||||
console.log("Attack success processing", attackDef)
|
||||
if (!game.user.isGM || !attackDef.defenderId) { // Only GM process this
|
||||
static async processAttackSuccess(rollData) {
|
||||
console.log("Attack success processing", rollData)
|
||||
if (!game.user.isGM || !rollData.defenderId) { // Only GM process this
|
||||
return
|
||||
}
|
||||
// Build and send the defense message to the relevant people (ie GM + defender)
|
||||
let defender = game.actors.get(attackDef.defenderId)
|
||||
console.log("DEF WEP", attackDef, defender)
|
||||
let defender = game.actors.get(rollData.defenderId)
|
||||
let defenderWeapons = defender.weapons || []
|
||||
this.attackStore[attackDef.id] = attackDef // Store !
|
||||
ChatMessage.create({
|
||||
let msg = await ChatMessage.create({
|
||||
alias: defender.name,
|
||||
whisper: BoLUtility.getWhisperRecipientsAndGMs(defender.name),
|
||||
content: await renderTemplate('systems/bol/templates/chat/rolls/defense-request-card.hbs', {
|
||||
attackId: attackDef.id,
|
||||
attacker: attackDef.attacker,
|
||||
attackId: rollData.id,
|
||||
attacker: rollData.attacker,
|
||||
defender: defender,
|
||||
defenderHeroPoints:defender.getHeroPoints(),
|
||||
defenderWeapons: defenderWeapons,
|
||||
damageTotal: attackDef.damageRoll.total,
|
||||
damagesIgnoresArmor: attackDef.damagesIgnoresArmor,
|
||||
damageTotal: rollData.damageTotal,
|
||||
damagesIgnoresArmor: rollData.damagesIgnoresArmor,
|
||||
})
|
||||
})
|
||||
msg.setFlag("world", "bol-roll-data", rollData)
|
||||
console.log("DEF WEP", rollData, defender)
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
@ -439,6 +642,9 @@ export class BoLUtility {
|
||||
if (sockmsg.name == "msg_cleanup_buttons") {
|
||||
$(`#${sockmsg.data.id}`).hide() // Hide the options roll buttons
|
||||
}
|
||||
if (sockmsg.name == "msg_request_init_roll") {
|
||||
this.requestInitRoll(sockmsg.data.actorId, sockmsg.data.combatData)
|
||||
}
|
||||
if (sockmsg.name == "msg_damage_handling") {
|
||||
BoLUtility.processDamageHandling(sockmsg.data.attackId, sockmsg.data.defenseMode, sockmsg.data.weaponId, sockmsg.data.msgId)
|
||||
}
|
||||
@ -446,15 +652,15 @@ export class BoLUtility {
|
||||
|
||||
/* -------------------------------------------- */
|
||||
static computeSpellCost(spell, nbOptCond = 0) {
|
||||
let pp = spell.data.properties.ppcost
|
||||
let minpp = __circle2minpp[spell.data.properties.circle]
|
||||
let pp = spell.system.properties.ppcost
|
||||
let minpp = __circle2minpp[spell.system.properties.circle]
|
||||
pp = (pp - nbOptCond < minpp) ? minpp : pp - nbOptCond
|
||||
return pp
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
static getDamageFormula(weaponData, fightOption) {
|
||||
let upgradeDamage = (fightOption && fightOption.data.properties.fightoptiontype == "twoweaponsatt")
|
||||
let upgradeDamage = (fightOption && fightOption.system.properties.fightoptiontype == "twoweaponsatt")
|
||||
let damageString = weaponData.properties.damage
|
||||
let modifier = weaponData.properties.damageModifiers ?? 0
|
||||
let multiplier = weaponData.properties.damageMultiplier ?? 1
|
||||
@ -466,11 +672,10 @@ export class BoLUtility {
|
||||
|
||||
let formula = damageString
|
||||
if (damageString.includes("d") || damageString.includes("D")) {
|
||||
var myReg = new RegExp('(\\d+)[dD]([\\d]+)([MB]*)?([\\+\\d]*)?', 'g')
|
||||
let myReg = new RegExp('(\\d+)[dD]([\\d]+)([MB]*)?([\\+\\d]*)?', 'g')
|
||||
let res = myReg.exec(damageString)
|
||||
let nbDice = parseInt(res[1])
|
||||
let postForm = 'kh' + nbDice
|
||||
let modIndex = 3
|
||||
// Upgrade damage if needed
|
||||
if (upgradeDamage && (!res[3] || res[3] == "")) {
|
||||
res[3] = "B" // Upgrade to bonus
|
||||
@ -482,12 +687,18 @@ export class BoLUtility {
|
||||
if (res[3] == 'M') {
|
||||
postForm = 'kl' + nbDice
|
||||
nbDice++
|
||||
modIndex = 4
|
||||
}
|
||||
if (res[3] == 'MM') {
|
||||
postForm = 'kl' + nbDice
|
||||
nbDice += 2
|
||||
}
|
||||
if (res[3] == 'B') {
|
||||
postForm = 'kh' + nbDice
|
||||
nbDice++
|
||||
modIndex = 4
|
||||
}
|
||||
if (res[3] == 'BB') {
|
||||
postForm = 'kh' + nbDice
|
||||
nbDice += 2
|
||||
}
|
||||
}
|
||||
formula = "(" + nbDice + "d" + res[2] + reroll + postForm + "+" + modifier + ") *" + multiplier
|
||||
@ -496,31 +707,53 @@ export class BoLUtility {
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
static async confirmDelete(actorSheet, li) {
|
||||
let itemId = li.data("item-id");
|
||||
let msgTxt = "<p>Are you sure to remove this Item ?";
|
||||
let buttons = {
|
||||
delete: {
|
||||
icon: '<i class="fas fa-check"></i>',
|
||||
label: "Yes, remove it",
|
||||
callback: () => {
|
||||
actorSheet.actor.deleteEmbeddedDocuments("Item", [itemId]);
|
||||
li.slideUp(200, () => actorSheet.render(false));
|
||||
}
|
||||
},
|
||||
cancel: {
|
||||
icon: '<i class="fas fa-times"></i>',
|
||||
label: "Cancel"
|
||||
}
|
||||
}
|
||||
msgTxt += "</p>";
|
||||
let d = new Dialog({
|
||||
title: "Confirm removal",
|
||||
content: msgTxt,
|
||||
buttons: buttons,
|
||||
default: "cancel"
|
||||
});
|
||||
d.render(true);
|
||||
static async loadCompendiumData(compendium) {
|
||||
const pack = game.packs.get(compendium);
|
||||
return await pack?.getDocuments() ?? [];
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
static async loadCompendium(compendium, filter = item => true) {
|
||||
let compendiumData = await this.loadCompendiumData(compendium);
|
||||
return compendiumData.filter(filter);
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
static async searchItem(dataItem) {
|
||||
let item
|
||||
if (dataItem.pack) {
|
||||
let id = dataItem.id || dataItem._id
|
||||
let items = await this.loadCompendium(dataItem.pack, item => item.id == id)
|
||||
item = items[0] || undefined
|
||||
} else {
|
||||
item = game.items.get(dataItem.id)
|
||||
}
|
||||
return item
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
static updateSheets() {
|
||||
// Then force opened actor refresh if needed
|
||||
for (let actor of game.actors) {
|
||||
if (actor.sheet.rendered) {
|
||||
actor.sheet.render()
|
||||
}
|
||||
}
|
||||
game.bol.charSummary.updatePCSummary() // Refresh if needed
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
static removeGroupHoroscope(rollData) {
|
||||
let horo = rollData.horoscopeGroupList[rollData.selectedGroupHoroscopeIndex]
|
||||
let horoscopes = foundry.utils.duplicate(game.settings.get("bol", "horoscope-group"))
|
||||
let toChange = foundry.utils.duplicate(horoscopes[horo.id])
|
||||
toChange.availableDice -= horo.nbDice // Remove the dice
|
||||
if (toChange.availableDice <= 0) {
|
||||
horoscopes[horo.id] = undefined
|
||||
} else {
|
||||
horoscopes[horo.id] = toChange
|
||||
}
|
||||
game.settings.set("bol", "horoscope-group", horoscopes)
|
||||
this.updateSheets()
|
||||
}
|
||||
}
|
||||
|
@ -10,14 +10,15 @@ System.debugMode = true;
|
||||
export const BOL = {};
|
||||
|
||||
BOL.damageValues = {
|
||||
"1": "1",
|
||||
"2": "2",
|
||||
"3": "3",
|
||||
"d3" : "d3",
|
||||
"d6M" : "d6M (Malus)",
|
||||
"d6" : "d6",
|
||||
"d6B" : "d6B (Bonus)",
|
||||
"d6BB" : "d6B + dé bonus",
|
||||
"0": "0",
|
||||
"1": "1",
|
||||
"2": "2",
|
||||
"3": "3",
|
||||
"d3": "d3",
|
||||
"d6M": "d6M (Malus)",
|
||||
"d6": "d6",
|
||||
"d6B": "d6B (Bonus)",
|
||||
"d6BB": "d6B + dé bonus",
|
||||
}
|
||||
|
||||
BOL.damageMultiplier = {
|
||||
@ -25,6 +26,19 @@ BOL.damageMultiplier = {
|
||||
"2": "x2",
|
||||
"3": "x3",
|
||||
"4": "x4",
|
||||
"5": "x5",
|
||||
"6": "x6",
|
||||
"7": "7",
|
||||
"8": "x8"
|
||||
}
|
||||
|
||||
BOL.listTypes = {
|
||||
"attribute": "BOL.ui.attribute",
|
||||
"aptitude": "BOL.ui.aptitude",
|
||||
"career": "BOL.ui.career",
|
||||
"boon": "BOL.ui.boon",
|
||||
"flaw": "BOL.ui.flaw",
|
||||
"other": "BOL.ui.other"
|
||||
}
|
||||
|
||||
BOL.spellType = {
|
||||
@ -42,116 +56,125 @@ BOL.alchemyType = {
|
||||
}
|
||||
|
||||
BOL.equipmentSlots = {
|
||||
"none" : "BOL.equipmentSlots.none",
|
||||
"head" : "BOL.equipmentSlots.head",
|
||||
"neck" : "BOL.equipmentSlots.neck",
|
||||
"shoulders" : "BOL.equipmentSlots.shoulders",
|
||||
"body" : "BOL.equipmentSlots.body",
|
||||
"rhand" : "BOL.equipmentSlots.rhand",
|
||||
"lhand" : "BOL.equipmentSlots.lhand",
|
||||
"2hands" : "BOL.equipmentSlots.2hands",
|
||||
"rarm" : "BOL.equipmentSlots.rarm",
|
||||
"larm" : "BOL.equipmentSlots.larm",
|
||||
"chest" : "BOL.equipmentSlots.chest",
|
||||
"belt" : "BOL.equipmentSlots.belt",
|
||||
"legs" : "BOL.equipmentSlots.legs",
|
||||
"feet" : "BOL.equipmentSlots.feet",
|
||||
"finder" : "BOL.equipmentSlots.finder",
|
||||
"ear" : "BOL.equipmentSlots.ear"
|
||||
"none": "BOL.equipmentSlots.none",
|
||||
"head": "BOL.equipmentSlots.head",
|
||||
"neck": "BOL.equipmentSlots.neck",
|
||||
"shoulders": "BOL.equipmentSlots.shoulders",
|
||||
"body": "BOL.equipmentSlots.body",
|
||||
"rhand": "BOL.equipmentSlots.rhand",
|
||||
"lhand": "BOL.equipmentSlots.lhand",
|
||||
"2hands": "BOL.equipmentSlots.2hands",
|
||||
"rarm": "BOL.equipmentSlots.rarm",
|
||||
"larm": "BOL.equipmentSlots.larm",
|
||||
"chest": "BOL.equipmentSlots.chest",
|
||||
"belt": "BOL.equipmentSlots.belt",
|
||||
"legs": "BOL.equipmentSlots.legs",
|
||||
"feet": "BOL.equipmentSlots.feet",
|
||||
"finder": "BOL.equipmentSlots.finder",
|
||||
"ear": "BOL.equipmentSlots.ear"
|
||||
}
|
||||
|
||||
BOL.armorQualities = {
|
||||
"none" : "BOL.armorQuality.none",
|
||||
"light" : "BOL.armorQuality.light",
|
||||
"lightQ" : "BOL.armorQuality.lightQ",
|
||||
"lightSup" : "BOL.armorQuality.lightSup",
|
||||
"lightLeg" : "BOL.armorQuality.lightLeg",
|
||||
"medium" : "BOL.armorQuality.medium",
|
||||
"mediumQ" : "BOL.armorQuality.mediumQ",
|
||||
"mediumSup" : "BOL.armorQuality.mediumSup",
|
||||
"mediumLeg" : "BOL.armorQuality.mediumLeg",
|
||||
"heavy" : "BOL.armorQuality.heavy",
|
||||
"heavyQ" : "BOL.armorQuality.heavyQ",
|
||||
"heavySup" : "BOL.armorQuality.heavySup",
|
||||
"heavyLeg" : "BOL.armorQuality.heavyLeg"
|
||||
"none": "BOL.armorQuality.none",
|
||||
"light": "BOL.armorQuality.light",
|
||||
"lightQ": "BOL.armorQuality.lightQ",
|
||||
"lightSup": "BOL.armorQuality.lightSup",
|
||||
"lightLeg": "BOL.armorQuality.lightLeg",
|
||||
"medium": "BOL.armorQuality.medium",
|
||||
"mediumQ": "BOL.armorQuality.mediumQ",
|
||||
"mediumSup": "BOL.armorQuality.mediumSup",
|
||||
"mediumLeg": "BOL.armorQuality.mediumLeg",
|
||||
"heavy": "BOL.armorQuality.heavy",
|
||||
"heavyQ": "BOL.armorQuality.heavyQ",
|
||||
"heavySup": "BOL.armorQuality.heavySup",
|
||||
"heavyLeg": "BOL.armorQuality.heavyLeg"
|
||||
}
|
||||
|
||||
BOL.soakFormulas = {
|
||||
"none" : "0",
|
||||
"light" : "1d6-3",
|
||||
"lightQ" : "1d6r1-3",
|
||||
"lightSup" : "1d6-2",
|
||||
"lightLeg" : "2d6kh1-2",
|
||||
"medium" : "1d6-2",
|
||||
"mediumQ" : "1d6r1-2",
|
||||
"mediumSup" : "1d6-1",
|
||||
"mediumLeg" : "2d6kh1-1",
|
||||
"heavy" : "1d6-1",
|
||||
"heavyQ" : "1d6r1-1",
|
||||
"heavySup" : "1d6",
|
||||
"heavyLeg" : "2d6kh1"
|
||||
"none": "0",
|
||||
"light": "1d6-3",
|
||||
"lightQ": "1d6r1-3",
|
||||
"lightSup": "1d6-2",
|
||||
"lightLeg": "2d6kh1-2",
|
||||
"medium": "1d6-2",
|
||||
"mediumQ": "1d6r1-2",
|
||||
"mediumSup": "1d6-1",
|
||||
"mediumLeg": "2d6kh1-1",
|
||||
"heavy": "1d6-1",
|
||||
"heavyQ": "1d6r1-1",
|
||||
"heavySup": "1d6",
|
||||
"heavyLeg": "2d6kh1"
|
||||
}
|
||||
|
||||
BOL.attackAttributes = {
|
||||
"vigor" : "BOL.attributes.vigor",
|
||||
"agility" : "BOL.attributes.agility",
|
||||
"mind" : "BOL.attributes.mind",
|
||||
"appeal" : "BOL.attributes.appeal"
|
||||
"vigor": "BOL.attributes.vigor",
|
||||
"agility": "BOL.attributes.agility",
|
||||
"mind": "BOL.attributes.mind",
|
||||
"appeal": "BOL.attributes.appeal"
|
||||
}
|
||||
|
||||
BOL.attackAptitudes = {
|
||||
"melee" : "BOL.aptitudes.melee",
|
||||
"ranged" : "BOL.aptitudes.ranged"
|
||||
"melee": "BOL.aptitudes.melee",
|
||||
"ranged": "BOL.aptitudes.ranged"
|
||||
}
|
||||
|
||||
BOL.aptitudes = {
|
||||
"melee" : "BOL.aptitudes.melee",
|
||||
"ranged" : "BOL.aptitudes.ranged",
|
||||
"init" : "BOL.aptitudes.init",
|
||||
"def" : "BOL.aptitudes.def"
|
||||
"melee": "BOL.aptitudes.melee",
|
||||
"ranged": "BOL.aptitudes.ranged",
|
||||
"init": "BOL.aptitudes.init",
|
||||
"def": "BOL.aptitudes.def"
|
||||
}
|
||||
|
||||
BOL.resources = {
|
||||
"hp": "BOL.resources.hp",
|
||||
"hero": "BOL.resources.hero",
|
||||
"faith": "BOL.resources.faith",
|
||||
"power": "BOL.resources.power",
|
||||
"alchemypoints": "BOL.resources.alchemypoints"
|
||||
}
|
||||
|
||||
BOL.weaponSizes = {
|
||||
"unarmed" : "BOL.weaponSize.unarmed",
|
||||
"improvised" : "BOL.weaponSize.improvised",
|
||||
"light" : "BOL.weaponSize.light",
|
||||
"medium" : "BOL.weaponSize.medium",
|
||||
"heavy" : "BOL.weaponSize.heavy"
|
||||
"unarmed": "BOL.weaponSize.unarmed",
|
||||
"improvised": "BOL.weaponSize.improvised",
|
||||
"light": "BOL.weaponSize.light",
|
||||
"medium": "BOL.weaponSize.medium",
|
||||
"heavy": "BOL.weaponSize.heavy"
|
||||
}
|
||||
|
||||
BOL.damageAttributes = {
|
||||
"zero" : "0",
|
||||
"vigor" : "BOL.attributes.vigor",
|
||||
"half-vigor" : "BOL.attributes.halfvigor"
|
||||
"zero": "0",
|
||||
"vigor": "BOL.attributes.vigor",
|
||||
"half-vigor": "BOL.attributes.halfvigor"
|
||||
}
|
||||
|
||||
BOL.itemCategories = {
|
||||
"equipment" : "BOL.itemCategory.equipment",
|
||||
"capacity" : "BOL.itemCategory.capacity",
|
||||
"spell" : "BOL.itemCategory.spell",
|
||||
"alchemy" : "BOL.itemCategory.alchemy",
|
||||
"vehicle" : "BOL.itemCategory.vehicle",
|
||||
"other" : "BOL.itemCategory.other"
|
||||
"equipment": "BOL.itemCategory.equipment",
|
||||
"capacity": "BOL.itemCategory.capacity",
|
||||
"spell": "BOL.itemCategory.spell",
|
||||
"alchemy": "BOL.itemCategory.alchemy",
|
||||
"vehicle": "BOL.itemCategory.vehicle",
|
||||
"vehicleweapon": "BOL.itemCategory.vehicleweapon",
|
||||
"other": "BOL.itemCategory.other"
|
||||
}
|
||||
|
||||
BOL.itemSubtypes = {
|
||||
"armor" : "BOL.equipmentCategory.armor",
|
||||
"weapon" : "BOL.equipmentCategory.weapon",
|
||||
"shield" : "BOL.equipmentCategory.shield",
|
||||
"helm" : "BOL.equipmentCategory.helm",
|
||||
"jewel" : "BOL.equipmentCategory.jewel",
|
||||
"scroll" : "BOL.equipmentCategory.scroll",
|
||||
"container" : "BOL.equipmentCategory.container",
|
||||
"ammunition" : "BOL.equipmentCategory.ammunition",
|
||||
"currency" : "BOL.equipmentCategory.currency",
|
||||
"other" : "BOL.equipmentCategory.other"
|
||||
"armor": "BOL.equipmentCategory.armor",
|
||||
"weapon": "BOL.equipmentCategory.weapon",
|
||||
"shield": "BOL.equipmentCategory.shield",
|
||||
"helm": "BOL.equipmentCategory.helm",
|
||||
"jewel": "BOL.equipmentCategory.jewel",
|
||||
"scroll": "BOL.equipmentCategory.scroll",
|
||||
"container": "BOL.equipmentCategory.container",
|
||||
"ammunition": "BOL.equipmentCategory.ammunition",
|
||||
"currency": "BOL.equipmentCategory.currency",
|
||||
"other": "BOL.equipmentCategory.other"
|
||||
}
|
||||
|
||||
BOL.vehicleSubtypes = {
|
||||
"mount" : "BOL.vehicleCategory.mount",
|
||||
"flying" : "BOL.vehicleCategory.flying",
|
||||
"boat" : "BOL.vehicleCategory.boat",
|
||||
"other" : "BOL.vehicleCategory.other"
|
||||
"mount": "BOL.vehicleCategory.mount",
|
||||
"flying": "BOL.vehicleCategory.flying",
|
||||
"boat": "BOL.vehicleCategory.boat",
|
||||
"other": "BOL.vehicleCategory.other"
|
||||
}
|
||||
|
||||
// BOL.equipmentCategories = {
|
||||
@ -167,95 +190,153 @@ BOL.vehicleSubtypes = {
|
||||
// "other" : "BOL.equipmentCategory.other"
|
||||
// }
|
||||
|
||||
BOL.rangeModifiers = {
|
||||
"1": "BOL.dialog.pointblank",
|
||||
"0": "BOL.dialog.close",
|
||||
"-1": "BOL.dialog.medium",
|
||||
"-2": "BOL.dialog.long",
|
||||
"-4": "BOL.dialog.distant",
|
||||
"-6": "BOL.dialog.extreme",
|
||||
"-8": "BOL.dialog.utmost"
|
||||
}
|
||||
|
||||
BOL.difficultyModifiers = {
|
||||
"4": "BOL.dialog.soeasy",
|
||||
"2": "BOL.dialog.veryeasy",
|
||||
"1": "BOL.dialog.easy",
|
||||
"0": "BOL.dialog.moderate",
|
||||
"-1": "BOL.dialog.hard",
|
||||
"-2": "BOL.dialog.tough",
|
||||
"-4": "BOL.dialog.demanding",
|
||||
"-6": "BOL.dialog.formidable",
|
||||
"-8": "BOL.dialog.heroic",
|
||||
"-10": "BOL.dialog.mythic",
|
||||
"-12": "BOL.dialog.divine"
|
||||
}
|
||||
|
||||
BOL.alchemyModifiers = {
|
||||
"2": "BOL.dialog.veryeasy",
|
||||
"1": "BOL.dialog.easy",
|
||||
"0": "BOL.dialog.moderate",
|
||||
"-1": "BOL.dialog.hard",
|
||||
"-2": "BOL.dialog.tough",
|
||||
"-4": "BOL.dialog.demanding",
|
||||
"-6": "BOL.dialog.formidable",
|
||||
"-8": "BOL.dialog.heroic",
|
||||
}
|
||||
BOL.spellModifiers = BOL.alchemyModifiers
|
||||
|
||||
BOL.spellMandatoryConditions = {
|
||||
"1": "1",
|
||||
"2": "2",
|
||||
"3": "3",
|
||||
"4": "4"
|
||||
}
|
||||
BOL.spellOptionnalConditions = {
|
||||
"1": "1",
|
||||
"2": "2",
|
||||
"3": "3",
|
||||
"4": "4",
|
||||
"5": "5",
|
||||
"6": "6",
|
||||
"7": "7",
|
||||
"8": "8"
|
||||
}
|
||||
BOL.effectIdentifiers = {
|
||||
"always": "BOL.ui.always",
|
||||
}
|
||||
BOL.protectionCategories = {
|
||||
"armor" : "BOL.protectionCategory.armor",
|
||||
"shield" : "BOL.protectionCategory.shield",
|
||||
"helm" : "BOL.protectionCategory.helm",
|
||||
"other" : "BOL.protectionCategory.other"
|
||||
"armor": "BOL.protectionCategory.armor",
|
||||
"shield": "BOL.protectionCategory.shield",
|
||||
"helm": "BOL.protectionCategory.helm",
|
||||
"other": "BOL.protectionCategory.other"
|
||||
}
|
||||
|
||||
BOL.weaponCategories = {
|
||||
"melee" : "BOL.weaponCategory.melee",
|
||||
"ranged" : "BOL.weaponCategory.ranged",
|
||||
"other" : "BOL.weaponCategory.other"
|
||||
"melee": "BOL.weaponCategory.melee",
|
||||
"ranged": "BOL.weaponCategory.ranged",
|
||||
"other": "BOL.weaponCategory.other"
|
||||
}
|
||||
|
||||
BOL.itemProperties1 = {
|
||||
"equipable" : "BOL.itemProperty.equipable",
|
||||
"protection" : "BOL.itemProperty.protection",
|
||||
"magical" : "BOL.itemProperty.magical",
|
||||
"worn" : "BOL.itemProperty.worn",
|
||||
"equipable": "BOL.itemProperty.equipable",
|
||||
"protection": "BOL.itemProperty.protection",
|
||||
"magical": "BOL.itemProperty.magical",
|
||||
"worn": "BOL.itemProperty.worn",
|
||||
}
|
||||
|
||||
BOL.itemProperties2 = {
|
||||
"equipable" : "BOL.itemProperty.equipable",
|
||||
"protection" : "BOL.itemProperty.protection",
|
||||
"blocking" : "BOL.itemProperty.blocking",
|
||||
"magical" : "BOL.itemProperty.magical",
|
||||
"concealable" : "BOL.itemProperty.concealable",
|
||||
"2H" : "BOL.itemProperty.2H",
|
||||
"helm" : "BOL.itemProperty.helm",
|
||||
"improvised" : "BOL.itemProperty.improvised",
|
||||
"shield" : "BOL.itemProperty.shield",
|
||||
"melee" : "BOL.itemProperty.melee",
|
||||
"throwable" : "BOL.itemProperty.throwable",
|
||||
"ignoreshield" : "BOL.itemProperty.ignoreshield",
|
||||
"bashing" : "BOL.itemProperty.bashing",
|
||||
"stackable" : "BOL.itemProperty.stackable",
|
||||
"ranged" : "BOL.itemProperty.ranged",
|
||||
"weapon" : "BOL.itemProperty.weapon",
|
||||
"reloadable" : "BOL.itemProperty.reloadable",
|
||||
"worn" : "BOL.itemProperty.worn",
|
||||
"spell" : "BOL.itemProperty.spell",
|
||||
"armor" : "BOL.itemProperty.armor",
|
||||
"consumable" : "BOL.itemProperty.consumable",
|
||||
"bow" : "BOL.itemProperty.bow",
|
||||
"crossbow" : "BOL.itemProperty.crossbow",
|
||||
"throwing" : "BOL.itemProperty.throwing",
|
||||
"activable" : "BOL.itemProperty.activable",
|
||||
"powder" : "BOL.itemProperty.powder",
|
||||
"damage" : "BOL.itemProperty.damage",
|
||||
"difficulty": "BOL.itemProperty.difficulty"
|
||||
"equipable": "BOL.itemProperty.equipable",
|
||||
"protection": "BOL.itemProperty.protection",
|
||||
"blocking": "BOL.itemProperty.blocking",
|
||||
"magical": "BOL.itemProperty.magical",
|
||||
"concealable": "BOL.itemProperty.concealable",
|
||||
"2H": "BOL.itemProperty.2H",
|
||||
"helm": "BOL.itemProperty.helm",
|
||||
"improvised": "BOL.itemProperty.improvised",
|
||||
"shield": "BOL.itemProperty.shield",
|
||||
"melee": "BOL.itemProperty.melee",
|
||||
"throwable": "BOL.itemProperty.throwable",
|
||||
"ignoreshield": "BOL.itemProperty.ignoreshield",
|
||||
"bashing": "BOL.itemProperty.bashing",
|
||||
"stackable": "BOL.itemProperty.stackable",
|
||||
"ranged": "BOL.itemProperty.ranged",
|
||||
"weapon": "BOL.itemProperty.weapon",
|
||||
"reloadable": "BOL.itemProperty.reloadable",
|
||||
"worn": "BOL.itemProperty.worn",
|
||||
"spell": "BOL.itemProperty.spell",
|
||||
"armor": "BOL.itemProperty.armor",
|
||||
"consumable": "BOL.itemProperty.consumable",
|
||||
"bow": "BOL.itemProperty.bow",
|
||||
"crossbow": "BOL.itemProperty.crossbow",
|
||||
"throwing": "BOL.itemProperty.throwing",
|
||||
"activable": "BOL.itemProperty.activable",
|
||||
"powder": "BOL.itemProperty.powder",
|
||||
"damage": "BOL.itemProperty.damage",
|
||||
"difficulty": "BOL.itemProperty.difficulty"
|
||||
}
|
||||
|
||||
BOL.itemStats = {
|
||||
"quantity" : "BOL.itemStat.quantity",
|
||||
"weight" : "BOL.itemStat.weight",
|
||||
"price" : "BOL.itemStat.price",
|
||||
"range" : "BOL.itemStat.range",
|
||||
"damage" : "BOL.itemStat.damage",
|
||||
"reload" : "BOL.itemStat.reload",
|
||||
"soak" : "BOL.itemStat.soak",
|
||||
"blocking" : "BOL.itemStat.blocking",
|
||||
"modifiers" : "BOL.itemStat.modifiers"
|
||||
"quantity": "BOL.itemStat.quantity",
|
||||
"weight": "BOL.itemStat.weight",
|
||||
"price": "BOL.itemStat.price",
|
||||
"range": "BOL.itemStat.range",
|
||||
"damage": "BOL.itemStat.damage",
|
||||
"reload": "BOL.itemStat.reload",
|
||||
"soak": "BOL.itemStat.soak",
|
||||
"blocking": "BOL.itemStat.blocking",
|
||||
"modifiers": "BOL.itemStat.modifiers"
|
||||
}
|
||||
|
||||
BOL.itemModifiers = {
|
||||
"init" : "BOL.itemModifiers.init",
|
||||
"social" : "BOL.itemModifiers.social",
|
||||
"agility" : "BOL.itemModifiers.agility",
|
||||
"powercost" : "BOL.itemModifiers.powercost"
|
||||
"init": "BOL.itemModifiers.init",
|
||||
"social": "BOL.itemModifiers.social",
|
||||
"agility": "BOL.itemModifiers.agility",
|
||||
"powercost": "BOL.itemModifiers.powercost"
|
||||
}
|
||||
|
||||
BOL.itemBlocking = {
|
||||
"malus" : "BOL.itemBlocking.malus",
|
||||
"nbAttacksPerRound" : "BOL.itemBlocking.nbAttacksPerRound"
|
||||
"malus": "BOL.itemBlocking.malus",
|
||||
"nbAttacksPerRound": "BOL.itemBlocking.nbAttacksPerRound"
|
||||
}
|
||||
|
||||
BOL.itemSoak = {
|
||||
"formula" : "BOL.itemSoak.formula",
|
||||
"value" : "BOL.itemSoak.value"
|
||||
"formula": "BOL.itemSoak.formula",
|
||||
"value": "BOL.itemSoak.value"
|
||||
}
|
||||
|
||||
BOL.featureSubtypes = {
|
||||
"origin" : "BOL.featureSubtypes.origin",
|
||||
"race" : "BOL.featureSubtypes.race",
|
||||
"career" : "BOL.featureSubtypes.career",
|
||||
"boon" : "BOL.featureSubtypes.boon",
|
||||
"flaw" : "BOL.featureSubtypes.flaw",
|
||||
"language" : "BOL.featureSubtypes.language",
|
||||
"godsfaith" : "BOL.featureSubtypes.gods",
|
||||
"fightoption" : "BOL.featureSubtypes.fightOption"
|
||||
"origin": "BOL.featureSubtypes.origin",
|
||||
"race": "BOL.featureSubtypes.race",
|
||||
"career": "BOL.featureSubtypes.career",
|
||||
"boon": "BOL.featureSubtypes.boon",
|
||||
"flaw": "BOL.featureSubtypes.flaw",
|
||||
"language": "BOL.featureSubtypes.language",
|
||||
"godsfaith": "BOL.featureSubtypes.gods",
|
||||
"fightoption": "BOL.featureSubtypes.fightOption",
|
||||
"boleffect": "BOL.featureSubtypes.effect",
|
||||
"horoscope": "BOL.featureSubtypes.horoscope",
|
||||
"xplog": "BOL.featureSubtypes.xplog",
|
||||
}
|
||||
|
||||
BOL.fightOptionTypes = {
|
||||
@ -266,43 +347,322 @@ BOL.fightOptionTypes = {
|
||||
"fulldefense": "BOL.fightOptionTypes.fulldefense",
|
||||
"defense": "BOL.fightOptionTypes.defense",
|
||||
"attack": "BOL.fightOptionTypes.attack",
|
||||
"other": "BOL.fightOptionTypes.other"
|
||||
}
|
||||
|
||||
BOL.itemIcons = {
|
||||
"item": "icons/containers/chest/chest-worn-oak-tan.webp",
|
||||
"capacity": "icons/sundries/scrolls/scroll-plain-tan-red.webp",
|
||||
"species": "icons/environment/people/group.webp",
|
||||
"profile": "icons/sundries/documents/blueprint-axe.webp",
|
||||
"path": "icons/sundries/books/book-embossed-gold-red.webp"
|
||||
"item": "icons/containers/chest/chest-worn-oak-tan.webp",
|
||||
"feature": "icons/sundries/scrolls/scroll-plain-tan-red.webp",
|
||||
"species": "icons/environment/people/group.webp",
|
||||
"profile": "icons/sundries/documents/blueprint-axe.webp",
|
||||
"path": "icons/sundries/books/book-embossed-gold-red.webp"
|
||||
}
|
||||
|
||||
BOL.actorIcons = {
|
||||
"npc": "icons/environment/people/commoner.webp",
|
||||
"encounter": "icons/svg/mystery-man-black.svg",
|
||||
"loot": "icons/containers/bags/sack-simple-leather-brown.webp"
|
||||
"npc": "icons/environment/people/commoner.webp",
|
||||
"encounter": "icons/svg/mystery-man-black.svg",
|
||||
"loot": "icons/containers/bags/sack-simple-leather-brown.webp"
|
||||
}
|
||||
|
||||
BOL.bougetteState = {
|
||||
"nomoney": "BOL.bougette.nomoney",
|
||||
"tolive": "BOL.bougette.tolive",
|
||||
"easylife": "BOL.bougette.easylife",
|
||||
"luxury": "BOL.bougette.luxury",
|
||||
"rich": "BOL.bougette.rich"
|
||||
"0": "BOL.bougette.nomoney",
|
||||
"1": "BOL.bougette.tolive",
|
||||
"2": "BOL.bougette.easylife",
|
||||
"3": "BOL.bougette.luxury",
|
||||
"4": "BOL.bougette.rich"
|
||||
}
|
||||
BOL.bougetteDice = {
|
||||
"0": "0",
|
||||
"1": "2d6-1",
|
||||
"2": "2d6",
|
||||
"3": "2d6+1",
|
||||
"4": "2d6+2"
|
||||
}
|
||||
|
||||
BOL.creatureSize = {
|
||||
"tiny": "BOL.size.tiny",
|
||||
"verysmall": "BOL.size.verysmall",
|
||||
"small": "BOL.size.small",
|
||||
"medium": "BOL.size.medium",
|
||||
"large": "BOL.size.large",
|
||||
"verylarge": "BOL.size.verylarge",
|
||||
"huge": "BOL.size.huge",
|
||||
"massive": "BOL.size.massive",
|
||||
"enormous": "BOL.size.enormous",
|
||||
"gigantic": "BOL.size.gigantic",
|
||||
"immense": "BOL.size.immense",
|
||||
"colossal": "BOL.size.colossal"
|
||||
"tiny": { order: 1, label: "BOL.size.tiny" },
|
||||
"verysmall": { order: 2, label: "BOL.size.verysmall" },
|
||||
"small": { order: 3, label: "BOL.size.small" },
|
||||
"medium": { order: 4, label: "BOL.size.medium" },
|
||||
"large": { order: 5, label: "BOL.size.large" },
|
||||
"verylarge": { order: 6, label: "BOL.size.verylarge" },
|
||||
"huge": { order: 7, label: "BOL.size.huge" },
|
||||
"massive": { order: 8, label: "BOL.size.massive" },
|
||||
"enormous": { order: 9, label: "BOL.size.enormous" },
|
||||
"gigantic": { order: 10, label: "BOL.size.gigantic" },
|
||||
"immense": { order: 11, label: "BOL.size.immense" },
|
||||
"colossal": { order: 12, label: "BOL.size.colossal" }
|
||||
}
|
||||
|
||||
BOL.horoscopeAnswer = {
|
||||
"favorable": "BOL.ui.horoscopefavorable",
|
||||
"unfavorable": "BOL.ui.horoscopeunfavorable",
|
||||
}
|
||||
|
||||
BOL.bolEffectModifier = {
|
||||
"-8": "-8",
|
||||
"-6": "-6",
|
||||
"-4": "-4",
|
||||
"-2": "-2",
|
||||
"-1": "-1",
|
||||
"1B": "1B",
|
||||
"2B": "2B",
|
||||
"1M": "1M",
|
||||
"2M": "2M",
|
||||
"+1": "+1",
|
||||
"+2": "+2",
|
||||
"+4": "+4",
|
||||
"+6": "+6",
|
||||
"+8": "+8",
|
||||
}
|
||||
|
||||
BOL.statusEffects = [
|
||||
{
|
||||
"id": "dead",
|
||||
"label": "EFFECT.StatusDead",
|
||||
"icon": "icons/svg/skull.svg"
|
||||
},
|
||||
{
|
||||
"id": "unconscious",
|
||||
"label": "EFFECT.StatusUnconscious",
|
||||
"icon": "icons/svg/unconscious.svg"
|
||||
},
|
||||
{
|
||||
"id": "sleep",
|
||||
"label": "EFFECT.StatusAsleep",
|
||||
"icon": "icons/svg/sleep.svg"
|
||||
},
|
||||
{
|
||||
"id": "stun",
|
||||
"label": "EFFECT.StatusStunned",
|
||||
"icon": "icons/svg/daze.svg"
|
||||
},
|
||||
{
|
||||
"id": "prone",
|
||||
"label": "EFFECT.StatusProne",
|
||||
"icon": "icons/svg/falling.svg"
|
||||
},
|
||||
{
|
||||
"id": "restrain",
|
||||
"label": "EFFECT.StatusRestrained",
|
||||
"icon": "icons/svg/net.svg"
|
||||
},
|
||||
{
|
||||
"id": "paralysis",
|
||||
"label": "EFFECT.StatusParalysis",
|
||||
"icon": "icons/svg/paralysis.svg"
|
||||
},
|
||||
{
|
||||
"id": "fly",
|
||||
"label": "EFFECT.StatusFlying",
|
||||
"icon": "icons/svg/wing.svg"
|
||||
},
|
||||
{
|
||||
"id": "blind",
|
||||
"label": "EFFECT.StatusBlind",
|
||||
"icon": "icons/svg/blind.svg"
|
||||
},
|
||||
{
|
||||
"id": "deaf",
|
||||
"label": "EFFECT.StatusDeaf",
|
||||
"icon": "icons/svg/deaf.svg"
|
||||
},
|
||||
{
|
||||
"id": "silence",
|
||||
"label": "EFFECT.StatusSilenced",
|
||||
"icon": "icons/svg/silenced.svg"
|
||||
},
|
||||
{
|
||||
"id": "fear",
|
||||
"label": "EFFECT.StatusFear",
|
||||
"icon": "icons/svg/terror.svg"
|
||||
},
|
||||
{
|
||||
"id": "burning",
|
||||
"label": "EFFECT.StatusBurning",
|
||||
"icon": "icons/svg/fire.svg"
|
||||
},
|
||||
{
|
||||
"id": "frozen",
|
||||
"label": "EFFECT.StatusFrozen",
|
||||
"icon": "icons/svg/frozen.svg"
|
||||
},
|
||||
{
|
||||
"id": "shock",
|
||||
"label": "EFFECT.StatusShocked",
|
||||
"icon": "icons/svg/lightning.svg"
|
||||
},
|
||||
{
|
||||
"id": "disease",
|
||||
"label": "EFFECT.StatusDisease",
|
||||
"icon": "icons/svg/biohazard.svg"
|
||||
},
|
||||
{
|
||||
"id": "poison",
|
||||
"label": "EFFECT.StatusPoison",
|
||||
"icon": "icons/svg/poison.svg"
|
||||
},
|
||||
{
|
||||
"id": "curse",
|
||||
"label": "EFFECT.StatusCursed",
|
||||
"icon": "icons/svg/sun.svg"
|
||||
},
|
||||
{
|
||||
"id": "invisible",
|
||||
"label": "EFFECT.StatusInvisible",
|
||||
"icon": "icons/svg/invisible.svg"
|
||||
},
|
||||
{
|
||||
"id": "target",
|
||||
"label": "EFFECT.StatusTarget",
|
||||
"icon": "icons/svg/target.svg"
|
||||
},
|
||||
{
|
||||
"id": "eye",
|
||||
"label": "EFFECT.StatusMarked",
|
||||
"icon": "icons/svg/eye.svg"
|
||||
}
|
||||
]
|
||||
|
||||
BOL.defaultNaturalWeapon = {
|
||||
"category": "equipment",
|
||||
"subtype": "weapon",
|
||||
"description": "",
|
||||
"properties": {
|
||||
"ranged": false,
|
||||
"melee": false,
|
||||
"spell": false,
|
||||
"protection": false,
|
||||
"weapon": true,
|
||||
"armor": false,
|
||||
"helm": false,
|
||||
"shield": false,
|
||||
"equipable": false,
|
||||
"consumable": false,
|
||||
"magical": false,
|
||||
"2H": false,
|
||||
"reloadable": false,
|
||||
"bow": false,
|
||||
"crossbow": false,
|
||||
"throwing": false,
|
||||
"stackable": false,
|
||||
"natural": true,
|
||||
"concealable": false,
|
||||
"ignoreshield": false,
|
||||
"attackBonusDice": false,
|
||||
"onlymodifier": true,
|
||||
"attackAttribute": "vigor",
|
||||
"attackAptitude": "melee",
|
||||
"attackModifiers": 1,
|
||||
"weaponSize": "unarmed",
|
||||
"damage": "d6B",
|
||||
"damageAttribute": "",
|
||||
"damageModifiers": null,
|
||||
"damageMultiplier": "1",
|
||||
"damageReroll1": false
|
||||
},
|
||||
"quantity": 1,
|
||||
"weight": 0,
|
||||
"price": 0,
|
||||
"worn": false
|
||||
}
|
||||
|
||||
BOL.defaultHordeAttack = {
|
||||
"category": "equipment",
|
||||
"subtype": "weapon",
|
||||
"description": "",
|
||||
"properties": {
|
||||
"ranged": false,
|
||||
"melee": true,
|
||||
"spell": false,
|
||||
"protection": false,
|
||||
"weapon": true,
|
||||
"armor": false,
|
||||
"helm": false,
|
||||
"shield": false,
|
||||
"equipable": false,
|
||||
"consumable": false,
|
||||
"magical": false,
|
||||
"2H": false,
|
||||
"reloadable": false,
|
||||
"bow": false,
|
||||
"crossbow": false,
|
||||
"throwing": false,
|
||||
"stackable": false,
|
||||
"natural": true,
|
||||
"concealable": false,
|
||||
"ignoreshield": false,
|
||||
"attackBonusDice": false,
|
||||
"onlymodifier": true,
|
||||
"attackAttribute": "vigor",
|
||||
"attackAptitude": "melee",
|
||||
"attackModifiers": 1,
|
||||
"weaponSize": "unarmed",
|
||||
"damage": "d6M",
|
||||
"damageAttribute": "",
|
||||
"damageModifiers": null,
|
||||
"damageMultiplier": "1",
|
||||
"damageReroll1": false
|
||||
},
|
||||
"quantity": 1,
|
||||
"weight": 0,
|
||||
"price": 0,
|
||||
"worn": false
|
||||
}
|
||||
|
||||
BOL.defaultNaturalProtection = {
|
||||
"category": "equipment",
|
||||
"subtype": "armor",
|
||||
"description": "",
|
||||
"properties": {
|
||||
"ranged": false,
|
||||
"melee": false,
|
||||
"spell": false,
|
||||
"protection": true,
|
||||
"weapon": false,
|
||||
"armor": true,
|
||||
"helm": false,
|
||||
"shield": false,
|
||||
"equipable": true,
|
||||
"consumable": false,
|
||||
"magical": false,
|
||||
"2H": false,
|
||||
"reloadable": false,
|
||||
"bow": false,
|
||||
"crossbow": false,
|
||||
"throwing": false,
|
||||
"stackable": false,
|
||||
"natural": true,
|
||||
"concealable": false,
|
||||
"ignoreshield": false,
|
||||
"attackBonusDice": false,
|
||||
"onlymodifier": true,
|
||||
"attackAttribute": "vigor",
|
||||
"attackAptitude": "melee",
|
||||
"attackModifiers": 1,
|
||||
"weaponSize": "unarmed",
|
||||
"damage": "d6B",
|
||||
"damageAttribute": "vigor",
|
||||
"damageModifiers": null,
|
||||
"damageMultiplier": "1",
|
||||
"damageReroll1": false,
|
||||
"modifiers": {
|
||||
"init": null,
|
||||
"agility": null,
|
||||
"powercost": null,
|
||||
"social": false
|
||||
},
|
||||
"armorQuality": "none",
|
||||
"soak": {
|
||||
"formula": "",
|
||||
"value": 1
|
||||
},
|
||||
"slot": "none"
|
||||
},
|
||||
"quantity": 1,
|
||||
"weight": 0,
|
||||
"price": 0,
|
||||
"worn": true
|
||||
}
|
||||
|
||||
BOL.debug = false;
|
@ -10,7 +10,7 @@ export const registerHandlebarsHelpers = function () {
|
||||
|
||||
Handlebars.registerHelper('isEmpty', function (list) {
|
||||
if (list) return list.length == 0;
|
||||
else return 0;
|
||||
else return false;
|
||||
});
|
||||
|
||||
Handlebars.registerHelper('notEmpty', function (list) {
|
||||
@ -64,8 +64,8 @@ export const registerHandlebarsHelpers = function () {
|
||||
})
|
||||
|
||||
Handlebars.registerHelper('for', function (from, to, incr, block) {
|
||||
var accum = '';
|
||||
for (var i = from; i < to; i += incr)
|
||||
let accum = '';
|
||||
for (let i = from; i < to; i += incr)
|
||||
accum += block.fn(i);
|
||||
return accum;
|
||||
})
|
||||
@ -76,6 +76,10 @@ export const registerHandlebarsHelpers = function () {
|
||||
Handlebars.registerHelper('count', function (list) {
|
||||
return list.length;
|
||||
})
|
||||
Handlebars.registerHelper('countKeys', function (obj) {
|
||||
return Object.keys(obj).length;
|
||||
})
|
||||
|
||||
Handlebars.registerHelper('isEnabled', function (configKey) {
|
||||
return game.settings.get("bol", configKey);
|
||||
})
|
||||
@ -85,8 +89,8 @@ export const registerHandlebarsHelpers = function () {
|
||||
|
||||
// If you need to add Handlebars helpers, here are a few useful examples:
|
||||
Handlebars.registerHelper('concat', function () {
|
||||
var outStr = '';
|
||||
for (var arg in arguments) {
|
||||
let outStr = '';
|
||||
for (let arg in arguments) {
|
||||
if (typeof arguments[arg] != 'object') {
|
||||
outStr += arguments[arg];
|
||||
}
|
||||
@ -103,12 +107,17 @@ export const registerHandlebarsHelpers = function () {
|
||||
Handlebars.registerHelper('sub', function (a, b) {
|
||||
return parseInt(a) - parseInt(b);
|
||||
})
|
||||
Handlebars.registerHelper('abbrev2', function (a) {
|
||||
return a.substring(0, 2);
|
||||
})
|
||||
Handlebars.registerHelper('abbrev3', function (a) {
|
||||
return a.substring(0, 3);
|
||||
})
|
||||
Handlebars.registerHelper('valueAtIndex', function (arr, idx) {
|
||||
return arr[idx];
|
||||
})
|
||||
Handlebars.registerHelper('includesKey', function (items, type, key) {
|
||||
// console.log(items);
|
||||
return items.filter(i => i.type === type).map(i => i.data.key).includes(key);
|
||||
return items.filter(i => i.type === type).map(i => i.system.key).includes(key);
|
||||
})
|
||||
Handlebars.registerHelper('includes', function (array, val) {
|
||||
return array.includes(val);
|
||||
@ -118,12 +127,26 @@ export const registerHandlebarsHelpers = function () {
|
||||
})
|
||||
Handlebars.registerHelper('isOwnerOrGM', function (actor) {
|
||||
console.log("Testing actor", actor.isOwner, game.userId)
|
||||
if (actor.isOwner || game.isGM) {
|
||||
return true
|
||||
}
|
||||
return false
|
||||
return actor.isOwner || game.isGM;
|
||||
})
|
||||
Handlebars.registerHelper('upperFirst', function (text) {
|
||||
if (typeof text !== 'string') return text
|
||||
return text.charAt(0).toUpperCase() + text.slice(1)
|
||||
})
|
||||
Handlebars.registerHelper('upperFirstOnly', function (text) {
|
||||
if (typeof text !== 'string') return text
|
||||
return text.charAt(0).toUpperCase()
|
||||
})
|
||||
Handlebars.registerHelper('isCreature', function (key) {
|
||||
return key == "creature" || key == "daemon";
|
||||
})
|
||||
|
||||
|
||||
// Handle v12 removal of this helper
|
||||
Handlebars.registerHelper('select', function (selected, options) {
|
||||
const escapedValue = RegExp.escape(Handlebars.escapeExpression(selected));
|
||||
const rgx = new RegExp(' value=[\"\']' + escapedValue + '[\"\']');
|
||||
const html = options.fn(this);
|
||||
return html.replace(rgx, "$& selected");
|
||||
});
|
||||
|
||||
}
|
@ -29,18 +29,6 @@ export default function registerHooks() {
|
||||
if (data.type == "Item") {
|
||||
let item = data.data;
|
||||
console.log(item);
|
||||
// let command = `let onlyDamage = false;\nlet customLabel = "";\nlet skillDescription = "";\nlet dmgDescription = "";\n\nif (event) {\n if (event.shiftKey) onlyDamage = true;\n}\n\ngame.cof.macros.rollItemMacro("${item._id}", "${item.name}", "${item.type}", 0, 0, 0, onlyDamage, customLabel, skillDescription, dmgDescription);`;
|
||||
|
||||
// let macro = game.macros.entities.find(m => (m.name === item.name) && (m.command === command));
|
||||
// if (!macro) {
|
||||
// macro = await Macro.create({
|
||||
// name: item.name,
|
||||
// type : "script",
|
||||
// img: item.img,
|
||||
// command : command
|
||||
// }, {displaySheet: false})
|
||||
// }
|
||||
// game.user.assignHotbarMacro(macro, slot);
|
||||
}
|
||||
// Create a macro to open the actor sheet of the actor dropped on the hotbar
|
||||
else if (data.type == "Actor") {
|
||||
@ -49,7 +37,7 @@ export default function registerHooks() {
|
||||
let macro = game.macros.entities.find(m => (m.name === actor.name) && (m.command === command));
|
||||
if (!macro) {
|
||||
macro = await Macro.create({
|
||||
name: actor.data.name,
|
||||
name: actor.name,
|
||||
type: "script",
|
||||
img: "icons/svg/dice-target.svg",
|
||||
command: command
|
||||
@ -65,9 +53,9 @@ export default function registerHooks() {
|
||||
let macro = game.macros.entities.find(m => (m.name === journal.name) && (m.command === command));
|
||||
if (!macro) {
|
||||
macro = await Macro.create({
|
||||
name: journal.data.name,
|
||||
name: journal.name,
|
||||
type: "script",
|
||||
img: (journal.data.img) ? journal.data.img : "icons/svg/book.svg",
|
||||
img: (journal.img) ? journal.img : "icons/svg/book.svg",
|
||||
command: command
|
||||
}, {displaySheet: false})
|
||||
game.user.assignHotbarMacro(macro, slot);
|
||||
@ -75,4 +63,18 @@ export default function registerHooks() {
|
||||
}
|
||||
return false;
|
||||
});
|
||||
|
||||
/********************************************************************************** */
|
||||
Hooks.on("renderActorDirectory", (app, html, data) => {
|
||||
if (game.user.isGM) {
|
||||
const button = document.createElement('button');
|
||||
button.style.width = '95%';
|
||||
button.innerHTML = game.i18n.localize("BOL.ui.pclistbutton")
|
||||
button.addEventListener('click', () => {
|
||||
game.bol.charSummary.render(true)
|
||||
})
|
||||
html.find('.header-actions').after(button)
|
||||
}
|
||||
})
|
||||
|
||||
}
|
||||
|
@ -37,13 +37,13 @@ export class Macros {
|
||||
};
|
||||
|
||||
if(rollType === "attribute") {
|
||||
let attribute = eval(`actor.data.data.attributes.${key}`);
|
||||
let attribute = eval(`actor.system.attributes.${key}`);
|
||||
let rollLabel = (attribute.label) ? game.i18n.localize(attribute.label) : null;
|
||||
let description = actor.name + " - " + game.i18n.localize('BOL.ui.attributeCheck') + " - " + game.i18n.localize(attribute.label) ;
|
||||
BoLRoll.attributeRollDialog(actor, actorData, attribute, rollLabel, description, adv, mod);
|
||||
}
|
||||
else if(rollType === "aptitude") {
|
||||
let aptitude = eval(`actor.data.data.aptitudes.${key}`);
|
||||
let aptitude = eval(`actor.system.aptitudes.${key}`);
|
||||
let rollLabel = (aptitude.label) ? game.i18n.localize(aptitude.label) : null;
|
||||
let description = actor.name + " - " + game.i18n.localize('BOL.ui.aptitudeCheck') + " - " + game.i18n.localize(aptitude.label) ;
|
||||
BoLRoll.aptitudeRollDialog(actor, actorData, aptitude, rollLabel, description, adv, mod);
|
||||
|
@ -16,8 +16,13 @@ export const preloadHandlebarsTemplates = async function () {
|
||||
"systems/bol/templates/actor/parts/tabs/actor-equipment.hbs",
|
||||
"systems/bol/templates/actor/parts/tabs/actor-spellalchemy.hbs",
|
||||
"systems/bol/templates/actor/parts/tabs/actor-biodata.hbs",
|
||||
"systems/bol/templates/actor/parts/tabs/actor-horoscope-group.hbs",
|
||||
"systems/bol/templates/actor/parts/tabs/creature-stats.hbs",
|
||||
"systems/bol/templates/actor/parts/tabs/creature-actions.hbs",
|
||||
"systems/bol/templates/actor/parts/tabs/vehicle-stats.hbs",
|
||||
"systems/bol/templates/actor/parts/tabs/vehicle-description.hbs",
|
||||
"systems/bol/templates/actor/parts/tabs/vehicle-weapons.hbs",
|
||||
"systems/bol/templates/actor/parts/tabs/horde-description.hbs",
|
||||
// ITEMS
|
||||
"systems/bol/templates/item/parts/item-header.hbs",
|
||||
"systems/bol/templates/item/parts/properties/feature-properties.hbs",
|
||||
@ -33,23 +38,31 @@ export const preloadHandlebarsTemplates = async function () {
|
||||
"systems/bol/templates/item/parts/properties/feature/career-properties.hbs",
|
||||
"systems/bol/templates/item/parts/properties/feature/boon-properties.hbs",
|
||||
"systems/bol/templates/item/parts/properties/feature/flaw-properties.hbs",
|
||||
"systems/bol/templates/item/parts/properties/feature/effect-properties.hbs",
|
||||
"systems/bol/templates/item/parts/properties/feature/origin-properties.hbs",
|
||||
"systems/bol/templates/item/parts/properties/feature/race-properties.hbs",
|
||||
"systems/bol/templates/item/parts/properties/feature/fightoption-properties.hbs",
|
||||
"systems/bol/templates/item/parts/properties/item/weapon-vehicle-properties.hbs",
|
||||
"systems/bol/templates/item/parts/properties/feature/horoscope-properties.hbs",
|
||||
"systems/bol/templates/item/parts/properties/feature/xplog-properties.hbs",
|
||||
|
||||
// DIALOGS
|
||||
"systems/bol/templates/chat/rolls/attack-damage-card.hbs",
|
||||
"systems/bol/templates/chat/rolls/spell-roll-card.hbs",
|
||||
"systems/bol/templates/chat/rolls/alchemy-roll-card.hbs",
|
||||
"systems/bol/templates/chat/rolls/selected-horoscope-roll-card.hbs",
|
||||
"systems/bol/templates/chat/rolls/horoscope-roll-card.hbs",
|
||||
"systems/bol/templates/dialogs/aptitude-roll-part.hbs",
|
||||
"systems/bol/templates/dialogs/attribute-roll-part.hbs",
|
||||
"systems/bol/templates/dialogs/mod-roll-part.hbs",
|
||||
"systems/bol/templates/dialogs/adv-roll-part.hbs",
|
||||
"systems/bol/templates/dialogs/career-roll-part.hbs",
|
||||
"systems/bol/templates/dialogs/effect-roll-part.hbs",
|
||||
"systems/bol/templates/dialogs/boons-roll-part.hbs",
|
||||
"systems/bol/templates/dialogs/flaws-roll-part.hbs",
|
||||
"systems/bol/templates/dialogs/total-roll-part.hbs",
|
||||
"systems/bol/templates/dialogs/fightoptions-roll-part.hbs",
|
||||
"systems/bol/templates/dialogs/horoscope-roll-part.hbs"
|
||||
];
|
||||
|
||||
// Load the template parts
|
||||
|
BIN
packs/aides-de-jeu/000435.ldb
Normal file
1
packs/aides-de-jeu/CURRENT
Normal file
@ -0,0 +1 @@
|
||||
MANIFEST-000476
|
0
packs/aides-de-jeu/LOCK
Normal file
8
packs/aides-de-jeu/LOG
Normal file
@ -0,0 +1,8 @@
|
||||
2024/11/02-18:11:52.801787 7fd4174006c0 Recovering log #474
|
||||
2024/11/02-18:11:52.812594 7fd4174006c0 Delete type=3 #472
|
||||
2024/11/02-18:11:52.812664 7fd4174006c0 Delete type=0 #474
|
||||
2024/11/02-18:28:41.334703 7fd415a006c0 Level-0 table #479: started
|
||||
2024/11/02-18:28:41.334730 7fd415a006c0 Level-0 table #479: 0 bytes OK
|
||||
2024/11/02-18:28:41.340776 7fd415a006c0 Delete type=0 #477
|
||||
2024/11/02-18:28:41.347610 7fd415a006c0 Manual compaction at level-0 from '!journal!3xJg1rCxnWvEmoxS' @ 72057594037927935 : 1 .. '!journal.pages!veAAxCtCKcFIsnln.0kUgZspxXO7VS8bd' @ 0 : 0; will stop at (end)
|
||||
2024/11/02-18:28:41.347669 7fd415a006c0 Manual compaction at level-1 from '!journal!3xJg1rCxnWvEmoxS' @ 72057594037927935 : 1 .. '!journal.pages!veAAxCtCKcFIsnln.0kUgZspxXO7VS8bd' @ 0 : 0; will stop at (end)
|
8
packs/aides-de-jeu/LOG.old
Normal file
@ -0,0 +1,8 @@
|
||||
2024/11/02-16:12:38.910727 7fd417e006c0 Recovering log #470
|
||||
2024/11/02-16:12:38.921033 7fd417e006c0 Delete type=3 #468
|
||||
2024/11/02-16:12:38.921087 7fd417e006c0 Delete type=0 #470
|
||||
2024/11/02-18:00:40.869808 7fd415a006c0 Level-0 table #475: started
|
||||
2024/11/02-18:00:40.869830 7fd415a006c0 Level-0 table #475: 0 bytes OK
|
||||
2024/11/02-18:00:40.875801 7fd415a006c0 Delete type=0 #473
|
||||
2024/11/02-18:00:40.889720 7fd415a006c0 Manual compaction at level-0 from '!journal!3xJg1rCxnWvEmoxS' @ 72057594037927935 : 1 .. '!journal.pages!veAAxCtCKcFIsnln.0kUgZspxXO7VS8bd' @ 0 : 0; will stop at (end)
|
||||
2024/11/02-18:00:40.889754 7fd415a006c0 Manual compaction at level-1 from '!journal!3xJg1rCxnWvEmoxS' @ 72057594037927935 : 1 .. '!journal.pages!veAAxCtCKcFIsnln.0kUgZspxXO7VS8bd' @ 0 : 0; will stop at (end)
|
BIN
packs/aides-de-jeu/MANIFEST-000476
Normal file
BIN
packs/armors/000365.ldb
Normal file
0
packs/armors/000384.log
Normal file
1
packs/armors/CURRENT
Normal file
@ -0,0 +1 @@
|
||||
MANIFEST-000382
|
0
packs/armors/LOCK
Normal file
8
packs/armors/LOG
Normal file
@ -0,0 +1,8 @@
|
||||
2024/11/02-18:11:52.775827 7fd417e006c0 Recovering log #380
|
||||
2024/11/02-18:11:52.785630 7fd417e006c0 Delete type=3 #378
|
||||
2024/11/02-18:11:52.785785 7fd417e006c0 Delete type=0 #380
|
||||
2024/11/02-18:28:41.340904 7fd415a006c0 Level-0 table #385: started
|
||||
2024/11/02-18:28:41.340930 7fd415a006c0 Level-0 table #385: 0 bytes OK
|
||||
2024/11/02-18:28:41.347249 7fd415a006c0 Delete type=0 #383
|
||||
2024/11/02-18:28:41.347624 7fd415a006c0 Manual compaction at level-0 from '!items!G3dZTHIabA3LA1hY' @ 72057594037927935 : 1 .. '!items!xhEcsi3WHjbt2ro9' @ 0 : 0; will stop at (end)
|
||||
2024/11/02-18:28:41.347658 7fd415a006c0 Manual compaction at level-1 from '!items!G3dZTHIabA3LA1hY' @ 72057594037927935 : 1 .. '!items!xhEcsi3WHjbt2ro9' @ 0 : 0; will stop at (end)
|
8
packs/armors/LOG.old
Normal file
@ -0,0 +1,8 @@
|
||||
2024/11/02-16:12:38.884173 7fd416a006c0 Recovering log #376
|
||||
2024/11/02-16:12:38.894444 7fd416a006c0 Delete type=3 #374
|
||||
2024/11/02-16:12:38.894501 7fd416a006c0 Delete type=0 #376
|
||||
2024/11/02-18:00:40.875999 7fd415a006c0 Level-0 table #381: started
|
||||
2024/11/02-18:00:40.876052 7fd415a006c0 Level-0 table #381: 0 bytes OK
|
||||
2024/11/02-18:00:40.883214 7fd415a006c0 Delete type=0 #379
|
||||
2024/11/02-18:00:40.889730 7fd415a006c0 Manual compaction at level-0 from '!items!G3dZTHIabA3LA1hY' @ 72057594037927935 : 1 .. '!items!xhEcsi3WHjbt2ro9' @ 0 : 0; will stop at (end)
|
||||
2024/11/02-18:00:40.889763 7fd415a006c0 Manual compaction at level-1 from '!items!G3dZTHIabA3LA1hY' @ 72057594037927935 : 1 .. '!items!xhEcsi3WHjbt2ro9' @ 0 : 0; will stop at (end)
|
BIN
packs/armors/MANIFEST-000382
Normal file
@ -1,59 +0,0 @@
|
||||
{"_id":"039ZF3E3MtAGwbiX","name":"Intrépide","type":"feature","img":"/systems/bol/ui/icons/boon.webp","data":{"category":null,"subtype":"boon","description":"<h1>Intrépide</h1><p>votre personnage est insensible à la peur. Même une peur magiquement induite n’a aucune prise sur lui.</p>","properties":{"isbonusdice":false},"rank":0},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"EEnCVoPAR7pMjRym":3},"flags":{}}
|
||||
{"_id":"2bSL4HJMu8Zh8UKq","name":"Attirant","type":"feature","img":"/systems/bol/ui/icons/boon.webp","data":{"category":null,"subtype":"boon","description":"<h1>Attirant</h1><p>vous êtes particulièrement beau ou séduisant. Vous bénéficiez d’un dé de bonus dans les situations où l’apparence peut jouer un rôle.</p>","properties":{"isbonusdice":true},"rank":0},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"EEnCVoPAR7pMjRym":3},"flags":{}}
|
||||
{"_id":"3fRMKd0xX0NL0kxO","name":"Vigueur céruléenne","type":"feature","img":"/systems/bol/ui/icons/boon.webp","data":{"category":null,"subtype":"boon","description":"<h1>Vigueur céruléenne</h1><p>vous êtes grand et fort. Ajoutez 1 à votre vigueur. Votre score maximum en vigueur passe à 6 au lieu de 5, et votre score de départ maximum en vigueur peut être de 4 (au lieu de 3).</p>","properties":{"isbonusdice":false},"rank":0},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"EEnCVoPAR7pMjRym":3},"flags":{}}
|
||||
{"_id":"3jxkJo7vakII1kw0","name":"Renard du désert","type":"feature","img":"/systems/bol/ui/icons/boon.webp","data":{"category":null,"subtype":"boon","description":"<h1>Renard du désert</h1><p>lorsque vous vous trouvez dans un désert, vous bénéficiez d’un dé de bonus pour pister, piéger ou chasser, ainsi que pour d’autres activités similaires de survie (mais pas pour combattre).</p>","properties":{"isbonusdice":true},"rank":0},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"EEnCVoPAR7pMjRym":3},"flags":{}}
|
||||
{"_id":"44bJY4xBP9ICdxrR","name":"Vue perçante","type":"feature","img":"/systems/bol/ui/icons/boon.webp","data":{"category":null,"subtype":"boon","description":"<h1>Vue perçante</h1><p>à chaque fois que vous effectuez un jet d’action sous esprit pour percevoir quelque chose grâce à votre vue, vous bénéficiez d’un dé de bonus.</p>","properties":{"isbonusdice":true},"rank":0},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"EEnCVoPAR7pMjRym":3},"flags":{}}
|
||||
{"_id":"4eCfIflrqYcQMQEE","name":"Laboratoire fourni","type":"feature","img":"/systems/bol/ui/icons/boon.webp","data":{"category":null,"subtype":"boon","description":"<h1>Laboratoire fourni</h1><p>vous disposez d’un laboratoire de qualité pour mener vos expériences. Vous bénéficiez d’un dé de bonus aux jets pour créer des préparations alchimiques ou des instruments mécaniques lorsque vous vous trouvez dans votre laboratoire. Celui-ci doit toutefois être réapprovisionné de temps à autre, ce qui vous conduit à partir à l’aventure pour trouver les moyens financiers et matériels de refaire vos stocks.</p>","properties":{"isbonusdice":true},"rank":0},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"EEnCVoPAR7pMjRym":3},"flags":{}}
|
||||
{"_id":"4j27jk1sauYKXUUY","name":"Magie des Rois-Sorciers","type":"feature","img":"/systems/bol/ui/icons/boon.webp","data":{"category":null,"subtype":"boon","description":"<h1>Magie des Rois-Sorciers</h1><p>vous avez atteint une certaine compréhension des antiques secrets des Rois-Sorciers. Vous bénéficiez d’un dé de bonus pour lancer des sortilèges. Si vous choisissez cet avantage, vous devez prendre un désavantage supplémentaire.</p>","properties":{"isbonusdice":true},"rank":0},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"EEnCVoPAR7pMjRym":3},"flags":{}}
|
||||
{"_id":"76IT7lAHNjPHvoxu","name":"Savant","type":"feature","img":"/systems/bol/ui/icons/boon.webp","data":{"category":null,"subtype":"boon","description":"<h1>Savant</h1><p>ajoutez 1 à votre esprit. Votre score maximum en esprit passe à 6 au lieu de 5, et votre score de départ maximum en esprit peut être de 4 (au lieu de 3).</p>","properties":{"isbonusdice":false},"rank":0},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"EEnCVoPAR7pMjRym":3},"flags":{}}
|
||||
{"_id":"7iHc6ZbgRDTcWx1x","name":"Poings d’acier","type":"feature","img":"/systems/bol/ui/icons/boon.webp","data":{"category":null,"subtype":"boon","description":"<h1>Poings d’acier</h1><p>vous avez les poings durs comme la pierre après des années d’entraînement ou à force de vous bagarrer dans toutes les tavernes de la ville. Vous ajoutez votre vigueur aux dégâts quand vous combattez à mains nues.</p>","properties":{"isbonusdice":false},"rank":0},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"EEnCVoPAR7pMjRym":3},"flags":{}}
|
||||
{"_id":"88DKwHbEHNr2zkb4","name":"Gamin des rues","type":"feature","img":"/systems/bol/ui/icons/boon.webp","data":{"category":null,"subtype":"boon","description":"<h1>Gamin des rues</h1><p>vous êtes un enfant des rues. Vous bénéficiez d’un dé de bonus quand vous interagissez avec les gens des bas-fonds de la cité, ou pour des activités comme filer quelqu’un ou remarquer un détail dans la rue (mais pas pour combattre).</p>","properties":{"isbonusdice":true},"rank":0},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"EEnCVoPAR7pMjRym":3},"flags":{}}
|
||||
{"_id":"8LbWRVmpo2byaOae","name":"Colosse","type":"feature","img":"/systems/bol/ui/icons/boon.webp","data":{"category":null,"subtype":"boon","description":"<h1>Colosse</h1><p>vous savez mobiliser votre vigueur pour accomplir de véritables tours de force. Vous bénéficiez d’un dé de bonus pour briser, lever, tirer ou pousser des objets.</p>","properties":{"isbonusdice":true},"rank":0},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"EEnCVoPAR7pMjRym":3},"flags":{}}
|
||||
{"_id":"8TKFwebDXkT4r3TW","name":"Dur à cuire","type":"feature","img":"/systems/bol/ui/icons/boon.webp","data":{"category":null,"subtype":"boon","description":"<h1>Dur à cuire</h1><p>vous avez la robustesse d’un bronyx. Ajoutez 2 points à votre vitalité.</p>","properties":{"isbonusdice":false},"rank":0},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"EEnCVoPAR7pMjRym":3},"flags":{}}
|
||||
{"_id":"969U7SVd2JSBkHDq","name":"Artiste","type":"feature","img":"/systems/bol/ui/icons/boon.webp","data":{"category":null,"subtype":"boon","description":"<h1>Artiste</h1><p>vous avez une sensibilité d’artiste. Vous bénéficiez d’un dé de bonus pour créer ou estimer des objets d’art.</p>","properties":{"isbonusdice":true},"rank":0},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"EEnCVoPAR7pMjRym":3},"flags":{}}
|
||||
{"_id":"DTZhsPUxseKuahCa","name":"Amis dans la pègre","type":"feature","img":"/systems/bol/ui/icons/boon.webp","data":{"category":null,"subtype":"boon","description":"<h1>Amis dans la pègre</h1><p>vous comptez des amis peu recommandables parmi les différentes pègres qui gangrènent la Lémurie. Ils peuvent vous aider à trouver un receleur, vous fournir une planque, etc.</p>","properties":{"isbonusdice":false},"rank":0},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"EEnCVoPAR7pMjRym":3},"flags":{}}
|
||||
{"_id":"DpO9z1NEg9C8MHGY","name":"Amis haut placés","type":"feature","img":"/systems/bol/ui/icons/boon.webp","data":{"category":null,"subtype":"boon","description":"<h1>Amis haut placés</h1><p>vous jouissez de contacts au sein des plus hauts échelons de la société. Même s’ils ne seront pas en général disposés à risquer leur tête pour vous, ils pourront vous apporter de l’aide (comme vous obtenir une audience auprès d’un autre personnage important, vous fournir des informations, jouer de leur influence auprès de la noblesse locale, etc.). Bien sûr, ces amis attendront parfois en retour une faveur de votre part...</p>","properties":{"isbonusdice":false},"rank":0},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"EEnCVoPAR7pMjRym":3},"flags":{}}
|
||||
{"_id":"DxCf9WsPm4tGRGri","name":"Athlète","type":"feature","img":"/systems/bol/ui/icons/boon.webp","data":{"category":null,"subtype":"boon","description":"<h1>Athlète</h1><p>vous bénéficiez d’un dé de bonus quand vous entreprenez des activités athlétiques (autres que le combat) comme courir, nager, grimper ou sauter.</p>","properties":{"isbonusdice":true},"rank":0},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"EEnCVoPAR7pMjRym":3},"flags":{}}
|
||||
{"_id":"FaACBPxznjBInrNN","name":"Doigts de fée","type":"feature","img":"/systems/bol/ui/icons/boon.webp","data":{"category":null,"subtype":"boon","description":"<h1>Doigts de fée</h1><p>vous bénéficiez d’un dé de bonus pour toutes les tâches exigeant une grande dextérité, comme le vol à la tire, la fabrication d’objets, le jonglage ou la triche aux cartes et aux dés.</p>","properties":{"isbonusdice":true},"rank":0},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"EEnCVoPAR7pMjRym":3},"flags":{}}
|
||||
{"_id":"GyNOCPaFw7bfjDUE","name":"Tireur puissant","type":"feature","img":"/systems/bol/ui/icons/boon.webp","data":{"category":null,"subtype":"boon","description":"<h1>Tireur puissant</h1><p>avec un type d’arme à distance choisi (arc, fronde, javelot, etc.), vous ajoutez votre vigueur aux dégâts.</p>","properties":{"isbonusdice":false},"rank":0},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"EEnCVoPAR7pMjRym":3},"flags":{}}
|
||||
{"_id":"HiD90AY8nD7OXXmr","name":"Bien né","type":"feature","img":"/systems/bol/ui/icons/boon.webp","data":{"category":null,"subtype":"boon","description":"<h1>Bien né</h1><p>vous avez grandi dans les palais et les cours, parmi la noblesse et la haute société. Vous bénéficiez d’un dé de bonus pour agir selon les règles de l’étiquette et de la courtoisie.</p>","properties":{"isbonusdice":true},"rank":0},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"EEnCVoPAR7pMjRym":3},"flags":{}}
|
||||
{"_id":"HkJU2TaccPnBtZPh","name":"Montagnard","type":"feature","img":"/systems/bol/ui/icons/boon.webp","data":{"category":null,"subtype":"boon","description":"<h1>Montagnard</h1><p>vous avez grandi dans les montagnes. Lorsque vous vous trouvez dans un paysage montagneux, vous bénéficiez d’un dé de bonus pour pister, piéger ou chasser, ainsi que pour d’autres activités similaires de survie (mais pas pour combattre).</p>","properties":{"isbonusdice":true},"rank":0},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"EEnCVoPAR7pMjRym":3},"flags":{}}
|
||||
{"_id":"IQdY6CJwUpXofsbM","name":"Ami des céruléens","type":"feature","img":"/systems/bol/ui/icons/boon.webp","data":{"category":null,"subtype":"boon","description":"<h1>Ami des céruléens</h1><p>vous avez grandi à proximité des géants bleus, ou bien des circonstances particulières vous ont valu leur amitié, et ils vous considèrent comme un des leurs. Vous bénéficiez d’un dé de bonus quand vous interagissez avec les nomades bleus.</p>","properties":{"isbonusdice":true},"rank":0},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"EEnCVoPAR7pMjRym":3},"flags":{}}
|
||||
{"_id":"J08pVCsXzQYKijOF","name":"Résistant à la magie","type":"feature","img":"/systems/bol/ui/icons/boon.webp","data":{"category":null,"subtype":"boon","description":"<h1>Résistant à la magie</h1><p>si vous êtes visé par un sortilège, lancez un d6. Sur un 6, le sortilège n’a aucun effet sur vous.</p>","properties":{"isbonusdice":false},"rank":0},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"EEnCVoPAR7pMjRym":3},"flags":{}}
|
||||
{"_id":"JrxFjMUc9emmaiJe","name":"Ouïe fine","type":"feature","img":"/systems/bol/ui/icons/boon.webp","data":{"category":null,"subtype":"boon","description":"<h1>Ouïe fine</h1><p>à chaque fois que vous effectuez un jet d’action sous esprit pour percevoir quelque chose grâce à votre ouïe, vous bénéficiez d’un dé de bonus.</p>","properties":{"isbonusdice":true},"rank":0},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"EEnCVoPAR7pMjRym":3},"flags":{}}
|
||||
{"_id":"JxFxp2CS8dluwC16","name":"Bagarreur","type":"feature","img":"/systems/bol/ui/icons/boon.webp","data":{"category":null,"subtype":"boon","description":"<h1>Bagarreur</h1><p>vous êtes un boxeur et un lutteur compétent. Vous bénéficiez d’un dé de bonus à l’attaque quand vous combattez à mains nues.</p>","properties":{"isbonusdice":true},"rank":0},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"EEnCVoPAR7pMjRym":3},"flags":{}}
|
||||
{"_id":"LNP6F8z4j15HuuNC","name":"Fêtard","type":"feature","img":"/systems/bol/ui/icons/boon.webp","data":{"category":null,"subtype":"boon","description":"<h1>Fêtard</h1><p>vous connaissez bien les auberges et les tavernes, et vous n’êtes pas le dernier quand il s’agit de lever le coude. Vous bénéficiez d’un dé de bonus pour recueillir des informations, trouver des contacts ou obtenir des biens et des services quand vous vous trouvez dans une taverne. De plus, vous tenez très bien l’alcool et bénéficiez également d’un dé de bonus pour résister aux effets de la boisson.</p>","properties":{"isbonusdice":true},"rank":0},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"EEnCVoPAR7pMjRym":3},"flags":{}}
|
||||
{"_id":"Ota12xlPiqDfM3te","name":"Maître du déguisement","type":"feature","img":"/systems/bol/ui/icons/boon.webp","data":{"category":null,"subtype":"boon","description":"<h1>Maître du déguisement</h1><p>vous bénéficiez d’un dé de bonus quand vous tentez de dissimuler votre identité. De plus, si vous souhaitez intervenir promptement dans une scène où votre personnage n’était pas présent, vous pouvez dépenser 1 point d’héroïsme pour faire partie du décor, par exemple déguisé en garde de la patrouille ou en bourgeois passant dans la rue. En fait, vous étiez là depuis le début, mais incognito!</p>","properties":{"isbonusdice":true},"rank":0},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"EEnCVoPAR7pMjRym":3},"flags":{}}
|
||||
{"_id":"Td0r46VMDXd5Z65z","name":"Tigre des neiges","type":"feature","img":"/systems/bol/ui/icons/boon.webp","data":{"category":null,"subtype":"boon","description":"<h1>Tigre des neiges</h1><p>vous avez grandi dans la toundra gelée. Lorsque vous vous trouvez dans un paysage neigeux, vous bénéficiez d’un dé de bonus pour pister, piéger ou chasser, ainsi que pour d’autres activités similaires de survie (mais pas pour combattre).</p>","properties":{"isbonusdice":true},"rank":0},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"EEnCVoPAR7pMjRym":3},"flags":{}}
|
||||
{"_id":"VXVu8CTas4nhfUST","name":"Sentir la magie","type":"feature","img":"/systems/bol/ui/icons/boon.webp","data":{"category":null,"subtype":"boon","description":"<h1>Sentir la magie</h1><p>vous bénéficiez d’un dé de bonus quand vous essayez de reconnaître (ou de traquer) un sorcier, un effet ou un artefact magique.</p>","properties":{"isbonusdice":true},"rank":0},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"EEnCVoPAR7pMjRym":3},"flags":{}}
|
||||
{"_id":"W4onU67kbMUL3WVa","name":"Résistant aux poisons","type":"feature","img":"/systems/bol/ui/icons/boon.webp","data":{"category":null,"subtype":"boon","description":"<h1>Résistant aux poisons</h1><p>vous bénéficiez d’un dé de bonus pour résister aux effets des drogues, des venins, des toxines, ainsi que de l’alcool.</p>","properties":{"isbonusdice":true},"rank":0},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"EEnCVoPAR7pMjRym":3},"flags":{}}
|
||||
{"_id":"WSXuMtTEvjC2qOH7","name":"Pied marin","type":"feature","img":"/systems/bol/ui/icons/boon.webp","data":{"category":null,"subtype":"boon","description":"<h1>Pied marin</h1><p>vous avez grandi dans un environnement de navires et de bateaux. Vous bénéficiez d’un dé de bonus pour manœuvrer une embarcation ou entreprendre des activités physiques à bord d’un navire (mais pas pour combattre).</p>","properties":{"isbonusdice":true},"rank":0},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"EEnCVoPAR7pMjRym":3},"flags":{}}
|
||||
{"_id":"WTl5A8SbC6o2bRna","name":"Fortuné","type":"feature","img":"/systems/bol/ui/icons/boon.webp","data":{"category":null,"subtype":"boon","description":"<h1>Fortuné</h1><p>vous disposez d’une source de revenus ou d’un héritage. Vous bénéficiez d’un dé de bonus quand vous cherchez à acquérir des biens ou des services dans votre cité d’origine.</p>","properties":{"isbonusdice":true},"rank":0},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"EEnCVoPAR7pMjRym":3},"flags":{}}
|
||||
{"_id":"XXaAGtAadv5Ltlht","name":"Santé de fer","type":"feature","img":"/systems/bol/ui/icons/boon.webp","data":{"category":null,"subtype":"boon","description":"<h1>Santé de fer</h1><p>vous êtes immunisé à toutes les maladies, y compris celles d’origine magique.</p>","properties":{"isbonusdice":false},"rank":0},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"EEnCVoPAR7pMjRym":3},"flags":{}}
|
||||
{"_id":"XfGnKJU87Tv9AKtL","name":"Bibliothèque savante","type":"feature","img":"/systems/bol/ui/icons/boon.webp","data":{"category":null,"subtype":"boon","description":"<h1>Bibliothèque savante</h1><p>vous disposez d’une bibliothèque de qualité pour mener vos recherches. Vous bénéficiez d’un dé de bonus pour recueillir des informations lorsque vous vous trouvez dans votre bibliothèque. Vous devez toutefois enrichir régulièrement vos collections, ce qui vous conduit à partir à l’aventure pour trouver les moyens d’acquérir de nouveaux manuscrits.</p>","properties":{"isbonusdice":true},"rank":0},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"EEnCVoPAR7pMjRym":3},"flags":{}}
|
||||
{"_id":"XiUi4LnrOswsEpXR","name":"Vigilant","type":"feature","img":"/systems/bol/ui/icons/boon.webp","data":{"category":null,"subtype":"boon","description":"<h1>Vigilant</h1><p>vous jouissez d’une excellente capacité de réaction face au danger. Vous bénéficiez d’un dé de bonus à vos jets de réaction.</p>","properties":{"isbonusdice":true},"rank":0},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"EEnCVoPAR7pMjRym":3},"flags":{}}
|
||||
{"_id":"aYv5FEDWzYRwIwRm","name":"Né en selle","type":"feature","img":"/systems/bol/ui/icons/boon.webp","data":{"category":null,"subtype":"boon","description":"<h1>Né en selle</h1><p>vous bénéficiez d’un dé de bonus pour chevaucher des montures et agir en selle (mais pas pour combattre).</p>","properties":{"isbonusdice":true},"rank":0},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"EEnCVoPAR7pMjRym":3},"flags":{}}
|
||||
{"_id":"cDe8mZ7vjpI1o1lZ","name":"Mains guérisseuses","type":"feature","img":"/systems/bol/ui/icons/boon.webp","data":{"category":null,"subtype":"boon","description":"<h1>Mains guérisseuses</h1><p>vous bénéficiez d’un dé de bonus sur les tests destinés à aider un blessé à récupérer de ses blessures, d’un empoisonnement, etc. Vous devez posséder la carrière médecin pour prendre cet avantage.</p>","properties":{"isbonusdice":true},"rank":0},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"EEnCVoPAR7pMjRym":3},"flags":{}}
|
||||
{"_id":"dpS4VXHUGddCq7FY","name":"Intimidant","type":"feature","img":"/systems/bol/ui/icons/boon.webp","data":{"category":null,"subtype":"boon","description":"<h1>Intimidant</h1><p>vous bénéficiez d’un dé de bonus à chaque fois que vous essayez de forcer quelqu’un à vous donner une information ou à faire une chose à laquelle il répugne.</p>","properties":{"isbonusdice":true},"rank":0},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"EEnCVoPAR7pMjRym":3},"flags":{}}
|
||||
{"_id":"dslHEmEqSZN8IsPa","name":"Fils des plaines","type":"feature","img":"/systems/bol/ui/icons/boon.webp","data":{"category":null,"subtype":"boon","description":"<h1>Fils des plaines</h1><p>vous avez grandi dans les plaines. Lorsque vous vous trouvez dans un paysage de plaine, vous bénéficiez d’un dé de bonus pour pister, piéger ou chasser, ainsi que pour d’autres activités similaires de survie (mais pas pour combattre).</p>","properties":{"isbonusdice":true},"rank":0},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"EEnCVoPAR7pMjRym":3},"flags":{}}
|
||||
{"_id":"eH6ER2AVPrhzZGn1","name":"Combat à l’aveugle","type":"feature","img":"/systems/bol/ui/icons/boon.webp","data":{"category":null,"subtype":"boon","description":"<h1>Combat à l’aveugle</h1><p>pas de lumière ? Aucun problème. En vous basant sur les odeurs, les bruits, les déplacements d’air, vous ne faites plus qu’un avec le monde qui vous entoure. Votre personnage ignore les malus imposés par le MJ pour combattre dans l’obscurité.</p>","properties":{"isbonusdice":false},"rank":0},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"EEnCVoPAR7pMjRym":3},"flags":{}}
|
||||
{"_id":"ft3lNO5aDd9eK40k","name":"Roi de la jungle","type":"feature","img":"/systems/bol/ui/icons/boon.webp","data":{"category":null,"subtype":"boon","description":"<h1>Roi de la jungle</h1><p>vous avez grandi dans la jungle. Lorsque vous vous trouvez dans un paysage de jungle, vous bénéficiez d’un dé de bonus pour pister, piéger ou chasser, ainsi que pour d’autres activités similaires de survie (mais pas pour combattre).</p>","properties":{"isbonusdice":true},"rank":0},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"EEnCVoPAR7pMjRym":3},"flags":{}}
|
||||
{"_id":"fzsDuaqZtvt4wue4","name":"Arme favorite","type":"feature","img":"/systems/bol/ui/icons/boon.webp","data":{"category":null,"subtype":"boon","description":"<h1>Arme favorite</h1><p>vous disposez d’une arme de qualité (une grande épée valgardienne, un arc long de Tyrus, une fronde d’Axos, un kriss halakhi, un khastok de Malakut, une hache d’abordage de Parsool, une rapière de Satarla, ou une arme spécialement fabriquée pour vous ou dont vous avez hérité) et vous vous êtes entraîné à son maniement depuis l’enfance. Vous bénéficiez d’un dé de bonus lorsque vous utilisez cette arme (ou, si elle est perdue, volée ou détruite, une arme de substitution qui devra reproduire ses qualités uniques, ce qui risque d’être particulièrement onéreux).</p>","properties":{"isbonusdice":true},"rank":0},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"EEnCVoPAR7pMjRym":3},"flags":{}}
|
||||
{"_id":"giB7dYrcKv12m13K","name":"Peau dure","type":"feature","img":"/systems/bol/ui/icons/boon.webp","data":{"category":null,"subtype":"boon","description":"<h1>Peau dure</h1><p>vous avez une peau particulièrement résistante et épaisse qui vous confère +1 en protection, même quand vous ne portez pas d’armure.</p>","properties":{"isbonusdice":false},"rank":0},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"EEnCVoPAR7pMjRym":3},"flags":{}}
|
||||
{"_id":"glCazKBiZ4TA5Tnt","name":"Inspirateur","type":"feature","img":"/systems/bol/ui/icons/boon.webp","data":{"category":null,"subtype":"boon","description":"<h1>Inspirateur</h1><p>vous savez motiver vos amis et vos partisans. Cela peut se faire au moyen d’une invocation aux dieux, d’un discours enflammé ou d’une musique inspirante, à moins que cela ne vienne simplement de votre présence charismatique. Pour le round qui suit l’utilisation de cet avantage, vos compagnons bénéficient d’un dé de bonus à tous leurs jets d’attaque (à condition d’être à portée de voix). Cet avantage ne peut être utilisé gratuitement qu’une fois par jour ; toute utilisation supplémentaire exigera la dépense de 1 point d’héroïsme.</p>","properties":{"isbonusdice":false},"rank":0},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"EEnCVoPAR7pMjRym":3},"flags":{}}
|
||||
{"_id":"jkgnvC8cAK7K5Ck9","name":"Récupération rapide","type":"feature","img":"/systems/bol/ui/icons/boon.webp","data":{"category":null,"subtype":"boon","description":"<h1>Récupération rapide</h1><p>vous jouissiez d’une constitution hors norme. Lorsque vous récupérez après un combat, vous regagnez 1 point de vitalité supplémentaire (qui s’ajoute à la récupération normale, égale à la moitié des points perdus). De plus, si vous êtes blessé, vous récupérez 1 point de vitalité par jour, peu importe les activités que vous entreprenez.</p>","properties":{"isbonusdice":false},"rank":0},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"EEnCVoPAR7pMjRym":3},"flags":{}}
|
||||
{"_id":"lDSYZ54BnXt4VYlE","name":"Cri de guerre","type":"feature","img":"/systems/bol/ui/icons/boon.webp","data":{"category":null,"subtype":"boon","description":"<h1>Cri de guerre</h1><p>le personnage pousse son cri de guerre pour effrayer les ennemis à portée de voix. Ces derniers subissent un dé de malus sur tous leurs jets d’attaque durant le round qui suit le cri de guerre. Cet avantage ne peut être utilisé gratuitement qu’une fois par jour ; toute utilisation supplémentaire exigera la dépense de 1 point d’héroïsme.</p>","properties":{"isbonusdice":false},"rank":0},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"EEnCVoPAR7pMjRym":3},"flags":{}}
|
||||
{"_id":"mwK667DIyh2QGqPV","name":"Beau parleur","type":"feature","img":"/systems/bol/ui/icons/boon.webp","data":{"category":null,"subtype":"boon","description":"<h1>Beau parleur</h1><p>vous êtes très persuasif et excellent menteur. Vous bénéficiez d’un dé de bonus quand vous voulez mentir, escroquer, baratiner ou tromper quelqu’un.</p>","properties":{"isbonusdice":true},"rank":0},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"EEnCVoPAR7pMjRym":3},"flags":{}}
|
||||
{"_id":"nl7sgrsCy0T0P127","name":"Pouvoir du Néant","type":"feature","img":"/systems/bol/ui/icons/boon.webp","data":{"category":null,"subtype":"boon","description":"<h1>Pouvoir du Néant</h1><p>vous avez porté le regard sur l’abîme de noirceur du Néant, et recevez deux points de pouvoir supplémentaires. Si vous choisissez cet avantage, vous devez aussi prendre un désavantage supplémentaire.</p>","properties":{"isbonusdice":false},"rank":0},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"EEnCVoPAR7pMjRym":3},"flags":{}}
|
||||
{"_id":"oFnXU6VPTG5QypMz","name":"Agilité de l’homme-oiseau","type":"feature","img":"/systems/bol/ui/icons/boon.webp","data":{"category":null,"subtype":"boon","description":"<h1>Agilité de l’homme-oiseau</h1><p>ajoutez 1 à votre agilité. Votre score maximum en agilité passe à 6 au lieu de 5, et votre score de départ maximum en agilité peut être de 4 (au lieu de 3).</p>","properties":{"isbonusdice":false},"rank":0},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"EEnCVoPAR7pMjRym":3},"flags":{}}
|
||||
{"_id":"oiASQBPLrFXYEVuP","name":"Ami des bêtes","type":"feature","img":"/systems/bol/ui/icons/boon.webp","data":{"category":null,"subtype":"boon","description":"<h1>Ami des bêtes</h1><p>vous possédez une affinité naturelle avec les animaux. Vous bénéficiez d’un dé de bonus quand vous interagissez avec eux. Si vous êtes dresseur, vous pouvez avoir avec vous deux ou trois compagnons animaux de taille petite, ou un seul de taille moyenne ou grande.</p>","properties":{"isbonusdice":true},"rank":0},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"EEnCVoPAR7pMjRym":3},"flags":{}}
|
||||
{"_id":"qGI3aI5xA0mqHXdU","name":"Discret","type":"feature","img":"/systems/bol/ui/icons/boon.webp","data":{"category":null,"subtype":"boon","description":"<h1>Discret</h1>\n<p>vous êtes vif et agile. Vous bénéficiez d’un dé de bonus dans les situations où vous essayez de faire preuve de discrétion.</p>","properties":{"isbonusdice":true},"rank":0},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"EEnCVoPAR7pMjRym":3},"flags":{}}
|
||||
{"_id":"sggncrizxp9b84sY","name":"Érudit","type":"feature","img":"/systems/bol/ui/icons/boon.webp","data":{"category":null,"subtype":"boon","description":"<h1>Érudit</h1><p>quand vous cherchez à vous souvenir d’un fait relevant de votre domaine de compétence, vous bénéficiez d’un dé de bonus.</p>","properties":{"isbonusdice":true},"rank":0},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"EEnCVoPAR7pMjRym":3},"flags":{}}
|
||||
{"_id":"snSCU6lBKz8nzqeQ","name":"Baudrier de guerre","type":"feature","img":"/systems/bol/ui/icons/boon.webp","data":{"category":null,"subtype":"boon","description":"<h1>Baudrier de guerre</h1><p>cet avantage autorise votre personnage à ne porter qu’un pagne ou un bikini en cotte de mailles et un simple baudrier (l’équivalent d’une armure légère au mieux), tout en considérant qu’il s’agit d’une armure moyenne en terme de protection, et ce sans subir le moindre malus d’armure.</p>","properties":{"isbonusdice":false},"rank":0},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"EEnCVoPAR7pMjRym":3},"flags":{}}
|
||||
{"_id":"wZjOWMREZRw1tLO0","name":"Marqué par les dieux","type":"feature","img":"/systems/bol/ui/icons/boon.webp","data":{"category":null,"subtype":"boon","description":"<h1>Marqué par les dieux</h1><p>les dieux vous accordent leur faveur. Vous gagnez 1 point d’héroïsme supplémentaire.</p>","properties":{"isbonusdice":false},"rank":0},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"EEnCVoPAR7pMjRym":3},"flags":{}}
|
||||
{"_id":"xAyqso8n6MaJNTJs","name":"Perspicace","type":"feature","img":"/systems/bol/ui/icons/boon.webp","data":{"category":null,"subtype":"boon","description":"<h1>Perspicace</h1><p>vous êtes doué pour percer à jour les menteurs. Quand quelqu’un tente de vous mentir ou de vous entourlouper, vous bénéficiez d’un dé de bonus pour le remarquer. Cela ne veut pas dire que vous connaîtrez forcément la vérité, mais vous saurez au moins qu’on est en train de vous mentir.</p>","properties":{"isbonusdice":true},"rank":0},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"EEnCVoPAR7pMjRym":3},"flags":{}}
|
||||
{"_id":"yEsGuSGUDVYFdzRV","name":"Roi de l’évasion","type":"feature","img":"/systems/bol/ui/icons/boon.webp","data":{"category":null,"subtype":"boon","description":"<h1>Roi de l’évasion</h1><p>cordes, chaînes, menottes, prison, rien ne vous retient bien longtemps. Que ce soit par vos talents ou par un coup de chance, vous finissez toujours par vous libérer. Vous bénéficiez d’un dé de bonus lorsque vous tentez de vous évader ou de vous libérer de vos liens.</p>","properties":{"isbonusdice":true},"rank":0},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"EEnCVoPAR7pMjRym":3},"flags":{}}
|
||||
{"_id":"ywZsgCLCszvZWzfB","name":"Odorat développé","type":"feature","img":"/systems/bol/ui/icons/boon.webp","data":{"category":null,"subtype":"boon","description":"<h1>Odorat développé</h1><p>à chaque fois que vous effectuez un jet d’action sous esprit pour percevoir quelque chose grâce à votre odorat, vous bénéficiez d’un dé de bonus.</p>","properties":{"isbonusdice":true},"rank":0},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"EEnCVoPAR7pMjRym":3},"flags":{}}
|
||||
{"_id":"yxkhtcJA6ziEBsHa","name":"Pisteur des marais","type":"feature","img":"/systems/bol/ui/icons/boon.webp","data":{"category":null,"subtype":"boon","description":"<h1>Pisteur des marais</h1><p>vous avez grandi dans les marais. Lorsque vous vous trouvez dans un paysage de marécage, vous bénéficiez d’un dé de bonus pour pister, piéger ou chasser, ainsi que pour d’autres activités similaires de survie (mais pas pour combattre).</p>","properties":{"isbonusdice":true},"rank":0},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"EEnCVoPAR7pMjRym":3},"flags":{}}
|
||||
{"_id":"yy7b6rYzyXTXAc5K","name":"Outillage","type":"feature","img":"/systems/bol/ui/icons/boon.webp","data":{"category":null,"subtype":"boon","description":"<h1>Outillage</h1><p>vous possédez un jeu d’outils adaptés à votre métier ou votre artisanat. Vous bénéficiez d’un dé de bonus quand vous entreprenez une action où l’emploi de ces outils peut se révéler efficace.</p>","properties":{"isbonusdice":true},"rank":0},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"EEnCVoPAR7pMjRym":3},"flags":{}}
|
||||
{"_id":"zgspy1QKaxdEetEw","name":"Vision nocturne","type":"feature","img":"/systems/bol/ui/icons/boon.webp","data":{"category":null,"subtype":"boon","description":"<h1>Vision nocturne</h1><p>vous bénéficiez d’un dé de bonus quand l’obscurité impose un malus à la vision.</p>","properties":{"isbonusdice":true},"rank":0},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"EEnCVoPAR7pMjRym":3},"flags":{}}
|
BIN
packs/boons/000294.ldb
Normal file
0
packs/boons/000477.log
Normal file
1
packs/boons/CURRENT
Normal file
@ -0,0 +1 @@
|
||||
MANIFEST-000475
|
0
packs/boons/LOCK
Normal file
8
packs/boons/LOG
Normal file
@ -0,0 +1,8 @@
|
||||
2024/11/02-18:11:52.669962 7fd417e006c0 Recovering log #473
|
||||
2024/11/02-18:11:52.680307 7fd417e006c0 Delete type=3 #471
|
||||
2024/11/02-18:11:52.680392 7fd417e006c0 Delete type=0 #473
|
||||
2024/11/02-18:28:41.288914 7fd415a006c0 Level-0 table #478: started
|
||||
2024/11/02-18:28:41.288941 7fd415a006c0 Level-0 table #478: 0 bytes OK
|
||||
2024/11/02-18:28:41.294891 7fd415a006c0 Delete type=0 #476
|
||||
2024/11/02-18:28:41.295081 7fd415a006c0 Manual compaction at level-0 from '!items!039ZF3E3MtAGwbiX' @ 72057594037927935 : 1 .. '!items!zgspy1QKaxdEetEw' @ 0 : 0; will stop at (end)
|
||||
2024/11/02-18:28:41.295111 7fd415a006c0 Manual compaction at level-1 from '!items!039ZF3E3MtAGwbiX' @ 72057594037927935 : 1 .. '!items!zgspy1QKaxdEetEw' @ 0 : 0; will stop at (end)
|
8
packs/boons/LOG.old
Normal file
@ -0,0 +1,8 @@
|
||||
2024/11/02-16:12:38.774517 7fd416a006c0 Recovering log #469
|
||||
2024/11/02-16:12:38.784384 7fd416a006c0 Delete type=3 #467
|
||||
2024/11/02-16:12:38.784438 7fd416a006c0 Delete type=0 #469
|
||||
2024/11/02-18:00:40.818721 7fd415a006c0 Level-0 table #474: started
|
||||
2024/11/02-18:00:40.818772 7fd415a006c0 Level-0 table #474: 0 bytes OK
|
||||
2024/11/02-18:00:40.824834 7fd415a006c0 Delete type=0 #472
|
||||
2024/11/02-18:00:40.837595 7fd415a006c0 Manual compaction at level-0 from '!items!039ZF3E3MtAGwbiX' @ 72057594037927935 : 1 .. '!items!zgspy1QKaxdEetEw' @ 0 : 0; will stop at (end)
|
||||
2024/11/02-18:00:40.837641 7fd415a006c0 Manual compaction at level-1 from '!items!039ZF3E3MtAGwbiX' @ 72057594037927935 : 1 .. '!items!zgspy1QKaxdEetEw' @ 0 : 0; will stop at (end)
|
BIN
packs/boons/MANIFEST-000475
Normal file
@ -1,8 +0,0 @@
|
||||
{"name":"Attaque Timide","type":"feature","img":"icons/svg/item-bag.svg","data":{"category":null,"subtype":"flaw","description":"<p>Attaque timide : la créature subit un dé de malus aux jets d’attaque.</p>","properties":{"isbonusdice":true,"ismalusdice":true},"rank":0},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"kQghu0tL1dft5xLu":3},"flags":{},"_id":"CoqlfsDV1gL5swbK"}
|
||||
{"name":"Prédateur","type":"feature","img":"icons/svg/item-bag.svg","data":{"category":null,"subtype":"boon","description":"<p> la créature lance un dé de bonus pour tout ce qui concerne le pistage d’une proie.</p>","properties":{"isbonusdice":true},"rank":0},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"kQghu0tL1dft5xLu":3},"flags":{},"_id":"DFdLY7fkVZDIf7rU"}
|
||||
{"name":"Camouflage","type":"feature","img":"icons/svg/item-bag.svg","data":{"category":null,"subtype":"boon","description":"<p>Camouflage : la créature est difficile à repérer en raison de la coloration ou de la texture de sa peau ou de son pelage (dé de bonus pour se cacher).</p>","properties":{"isbonusdice":true},"rank":0},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"kQghu0tL1dft5xLu":3},"flags":{"core":{"sourceId":"Item.b0PsoNEd8a0dN2Wm"}},"_id":"P2pgGD4FVKzOZ4uM"}
|
||||
{"name":"Attaque féroce","type":"feature","img":"icons/svg/item-bag.svg","data":{"category":null,"subtype":"boon","description":"<p> la créature bénéficie d’un dé de bonus aux jets d’attaque.</p>","properties":{"isbonusdice":true},"rank":0},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"kQghu0tL1dft5xLu":3},"flags":{"core":{"sourceId":"Item.b0PsoNEd8a0dN2Wm"}},"_id":"RqEO7ELH72MZBZFV"}
|
||||
{"name":"Attaque Venimeuse","type":"feature","img":"icons/svg/item-bag.svg","data":{"category":null,"subtype":"boon","description":"<p>Attaque venimeuse : la description de la créature indique les effets de son venin</p>","properties":{"isbonusdice":false},"rank":0},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"kQghu0tL1dft5xLu":3},"flags":{"core":{"sourceId":"Item.b0PsoNEd8a0dN2Wm"}},"_id":"U77iMP7V529zbJt9"}
|
||||
{"name":"Attaque Multiple","type":"feature","img":"icons/svg/item-bag.svg","data":{"category":null,"subtype":"boon","description":"<p>Attaques multiples : la créature possède <span style=\"font-family: var(--font-primary); font-size: var(--font-size-14);\"> deux types d’attaque totalement différents qui </span>nécessitent deux jets d’attaque séparés.</p>","properties":{"isbonusdice":false},"rank":0},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"kQghu0tL1dft5xLu":3},"flags":{"core":{"sourceId":"Item.b0PsoNEd8a0dN2Wm"}},"_id":"USkChPye9J4sZxwC"}
|
||||
{"name":"Déficience","type":"feature","img":"icons/svg/item-bag.svg","data":{"category":null,"subtype":"flaw","description":"<p>Déficience : la créature est affligée d’un odorat, d’une audition ou d’une vision déficiente et subit un dé de malus quand elle doit y faire appel.</p>","properties":{"isbonusdice":true,"ismalusdice":true},"rank":0},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"kQghu0tL1dft5xLu":3},"flags":{"core":{"sourceId":"Item.P0r8grkVY7xu5HOS"}},"_id":"htSqR7I7F5GVIelK"}
|
||||
{"name":"Attaque Spéciale","type":"feature","img":"icons/svg/item-bag.svg","data":{"category":null,"subtype":"boon","description":"<p>Attaque spéciale : la créature attaque selon une méthode inhabituelle. La nature de cette attaque est expliquée dans sa description.</p>\n<p> </p>","properties":{"isbonusdice":false},"rank":0},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"kQghu0tL1dft5xLu":3},"flags":{"core":{"sourceId":"Item.b0PsoNEd8a0dN2Wm"}},"_id":"yofwG0YrsL902G77"}
|
BIN
packs/boonsflawscreatures/000294.ldb
Normal file
0
packs/boonsflawscreatures/000477.log
Normal file
1
packs/boonsflawscreatures/CURRENT
Normal file
@ -0,0 +1 @@
|
||||
MANIFEST-000475
|
0
packs/boonsflawscreatures/LOCK
Normal file
8
packs/boonsflawscreatures/LOG
Normal file
@ -0,0 +1,8 @@
|
||||
2024/11/02-18:11:52.683312 7fd416a006c0 Recovering log #473
|
||||
2024/11/02-18:11:52.693678 7fd416a006c0 Delete type=3 #471
|
||||
2024/11/02-18:11:52.693735 7fd416a006c0 Delete type=0 #473
|
||||
2024/11/02-18:28:41.269927 7fd415a006c0 Level-0 table #478: started
|
||||
2024/11/02-18:28:41.270021 7fd415a006c0 Level-0 table #478: 0 bytes OK
|
||||
2024/11/02-18:28:41.276102 7fd415a006c0 Delete type=0 #476
|
||||
2024/11/02-18:28:41.295042 7fd415a006c0 Manual compaction at level-0 from '!items!CoqlfsDV1gL5swbK' @ 72057594037927935 : 1 .. '!items!yofwG0YrsL902G77' @ 0 : 0; will stop at (end)
|
||||
2024/11/02-18:28:41.295089 7fd415a006c0 Manual compaction at level-1 from '!items!CoqlfsDV1gL5swbK' @ 72057594037927935 : 1 .. '!items!yofwG0YrsL902G77' @ 0 : 0; will stop at (end)
|
8
packs/boonsflawscreatures/LOG.old
Normal file
@ -0,0 +1,8 @@
|
||||
2024/11/02-16:12:38.787439 7fd4174006c0 Recovering log #469
|
||||
2024/11/02-16:12:38.798191 7fd4174006c0 Delete type=3 #467
|
||||
2024/11/02-16:12:38.798313 7fd4174006c0 Delete type=0 #469
|
||||
2024/11/02-18:00:40.824934 7fd415a006c0 Level-0 table #474: started
|
||||
2024/11/02-18:00:40.824955 7fd415a006c0 Level-0 table #474: 0 bytes OK
|
||||
2024/11/02-18:00:40.831123 7fd415a006c0 Delete type=0 #472
|
||||
2024/11/02-18:00:40.837604 7fd415a006c0 Manual compaction at level-0 from '!items!CoqlfsDV1gL5swbK' @ 72057594037927935 : 1 .. '!items!yofwG0YrsL902G77' @ 0 : 0; will stop at (end)
|
||||
2024/11/02-18:00:40.837649 7fd415a006c0 Manual compaction at level-1 from '!items!CoqlfsDV1gL5swbK' @ 72057594037927935 : 1 .. '!items!yofwG0YrsL902G77' @ 0 : 0; will stop at (end)
|
BIN
packs/boonsflawscreatures/MANIFEST-000475
Normal file
BIN
packs/careers/000294.ldb
Normal file
0
packs/careers/000477.log
Normal file
1
packs/careers/CURRENT
Normal file
@ -0,0 +1 @@
|
||||
MANIFEST-000475
|
0
packs/careers/LOCK
Normal file
8
packs/careers/LOG
Normal file
@ -0,0 +1,8 @@
|
||||
2024/11/02-18:11:52.709120 7fd41ce006c0 Recovering log #473
|
||||
2024/11/02-18:11:52.718878 7fd41ce006c0 Delete type=3 #471
|
||||
2024/11/02-18:11:52.718948 7fd41ce006c0 Delete type=0 #473
|
||||
2024/11/02-18:28:41.282575 7fd415a006c0 Level-0 table #478: started
|
||||
2024/11/02-18:28:41.282601 7fd415a006c0 Level-0 table #478: 0 bytes OK
|
||||
2024/11/02-18:28:41.288788 7fd415a006c0 Delete type=0 #476
|
||||
2024/11/02-18:28:41.295070 7fd415a006c0 Manual compaction at level-0 from '!items!4S4xAfMXGnuU0O1a' @ 72057594037927935 : 1 .. '!items!zxY3sW0iCJBvwjOS' @ 0 : 0; will stop at (end)
|
||||
2024/11/02-18:28:41.295104 7fd415a006c0 Manual compaction at level-1 from '!items!4S4xAfMXGnuU0O1a' @ 72057594037927935 : 1 .. '!items!zxY3sW0iCJBvwjOS' @ 0 : 0; will stop at (end)
|