Compare commits
119 Commits
bol-v10.0.
...
v10
Author | SHA1 | Date | |
---|---|---|---|
1a9933fdc7 | |||
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 |
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
|
.vscode/settings.json
|
||||||
logs
|
.idea
|
||||||
*.log
|
.history
|
||||||
npm-debug.log*
|
todo.md
|
||||||
yarn-debug.log*
|
/.vscode
|
||||||
yarn-error.log*
|
/ignored/
|
||||||
lerna-debug.log*
|
/node_modules/
|
||||||
package-lock.json
|
/jsconfig.json
|
||||||
|
/package.json
|
||||||
# Diagnostic reports (https://nodejs.org/api/report.html)
|
/package-lock.json
|
||||||
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/
|
|
||||||
|
@ -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
|
Barbarians of Lemuria, Mythic edition, est un jeu de Simon Washbourne
|
||||||
|
|
||||||
Auteur : Simon Washbourne.
|
Auteur : Simon Washbourne.
|
||||||
|
|
||||||
## Crédits de la version française
|
## 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.
|
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
|
# 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": "Armors & Shields",
|
||||||
|
"mapping": {
|
||||||
|
"description": "system.description"
|
||||||
|
},
|
||||||
|
|
||||||
|
"entries": {
|
||||||
|
"Armure légère": {
|
||||||
|
"name": "Armure légère",
|
||||||
|
"description": "<h1>Light Armour</h1><p>If your character prefers to avoid combat but knows that he is likely to be involved all the same, you might like your character to have some minimal protection. Light armour could represent extensive body coverage in soft leathers, or less coverage in thicker leather, or even light mail. So your character could wear a stout leather jerkin with leather vambraces, or a padded cloth doublet, leather boots and gloves. Or you could say that your light armour consists of a light mail shirt and nothing else.</p><p>Light armour is generally concealable (except on close inspection or by a seasoned soldier) and doesn’t mark you out specifically as a warrior.</p><h2>Light armour effects</h2><ul><li>Roll a d6-3 (0-3 points of damage reduction).</li><li>If you prefer static numbers, light armour absorbs 1 point of damage.</li><li>Wearing light armour restricts magicians and imposes an extra 1 Arcane Point cost on a spell casting.</li></ul>"
|
||||||
|
},
|
||||||
|
"Armure lourde": {
|
||||||
|
"name": "Armure lourde",
|
||||||
|
"description": "<h1>Heavy Armour</h1><p>This armour is worn by some gladiators, knights going into battle, or those expecting to participate in deadly combat in the near future. It is not worn all day long, and is certainly not worn when travelling or going about normal daily activities. Heavy armour would represent extensive coverage of mail, such as a knee- length hauberk, with gauntlets and greaves, or a steel breastplate with vambraces and greaves, or possibly a brigandine (leather coat with steel inserts) with gauntlets and boots.</p><p>Someone in heavy armour can usually remove portions of their armour to reduce it to medium armour, as necessary.</p><p>If your strength is below 0, you can’t wear heavy armour at all (at least you can’t do anything worthwhile whilst wearing it).</p><h2>Heavy armour effects</h2><ul><li>roll a d6-1 (0-5 points of damage reduction).</li><li>If you prefer static numbers, heavy armour absorbs 3 points of damage.</li><li>Heavy armour slows you down, so reduce agility by 2 whilst wearing it.</li><li>Wearing heavy armour restricts magicians and imposes an extra 3 Arcane Points cost on a spell casting.</li></ul>"
|
||||||
|
},
|
||||||
|
"Armure moyenne": {
|
||||||
|
"name": "Armure moyenne",
|
||||||
|
"description": "<h1>Medium Armour</h1><p>Combining some of the mobility of the lighter armour and better protection of heavy armour, this is the armour worn by the typical adventurer expecting to get into combat situations on a regular basis. Medium armour could represent fairly extensive coverage of leather armour, with stiffened leather in some of the more vital areas, or partial coverage of mail with leather in other areas. It could even represent a steel breastplate and minimal/no other armour.</p><p>Someone in medium armour can often remove portions of their armour to reduce it to light armour, as necessary.</p><h2>Medium armour effects</h2><ul><li>Roll a d6-2 (0-4 points of damage reduction).</li><li>If you prefer static numbers, medium armour absorbs 2 points of damage.</li><li>Wearing medium armour restricts magicians and imposes an extra 2 Arcane Points cost on a spell casting.</li></ul>"
|
||||||
|
},
|
||||||
|
"Casque": {
|
||||||
|
"name": "Casque",
|
||||||
|
"description": "<h1>Helmet</h1><p>If you are wearing a helmet, this adds +1 to your protection if already wearing armour. Therefore, if in light armour and helmet, you’d roll d6-2. In medium armour, roll d6-1. In heavy armour, roll d6.</p><p>Helmets give you a penalty in social situations and to your initiative (as it’s harder to notice things whilst wearing a helmet).</p><p>Most Heroes take their helmets off, unless preparing for battle.</p>"
|
||||||
|
},
|
||||||
|
"Grand bouclier": {
|
||||||
|
"name": "Grand bouclier",
|
||||||
|
"description": "<h1>Large shield</h1><p>Large shields give +1 to defence against all attacks that you are aware of, but modify your agility by -1.</p>"
|
||||||
|
},
|
||||||
|
"Petit bouclier": {
|
||||||
|
"name": "Petit bouclier",
|
||||||
|
"description": "<h1>Small Shield</h1><p>Small shields give +1 to defence against one attack per round that you are aware of.</p>"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
244
compendiums/en/bol.boons.json
Normal file
@ -0,0 +1,244 @@
|
|||||||
|
{
|
||||||
|
"label": "Boons",
|
||||||
|
"mapping": {
|
||||||
|
"description": "system.description"
|
||||||
|
},
|
||||||
|
"entries": {
|
||||||
|
"Agilité de l’homme-oiseau": {
|
||||||
|
"name": "Winged Folk Agility",
|
||||||
|
"description": "<h1>Winged Folk Agility:</h1><p>You may add 1 to your agility, and your maximum agility is 6 instead of 5.</p>"
|
||||||
|
},
|
||||||
|
"Ami des bêtes": {
|
||||||
|
"name": "Beast-Friend",
|
||||||
|
"description": "<h1>Beast-Friend</h1><p>You have a natural affinity with animals. Whenever dealing with animals, roll a bonus die. If you are a beastmaster, you will also have two or three small companions, or one medium or large companion.</p>"
|
||||||
|
},
|
||||||
|
"Ami des céruléens": {
|
||||||
|
"name": "Giant-Friend",
|
||||||
|
"description": "<h1>Giant-Friend</h1><p>vYou grew up around giants (or you have somehow made an impression on them) so they treat you like one of their own. Roll a bonus die when dealing with the Blue Nomads.</p>"
|
||||||
|
},
|
||||||
|
"Amis dans la pègre": {
|
||||||
|
"name": "Friends in Low Places",
|
||||||
|
"description": "<h1>Friends in Low Places</h1><p>You have friends in various hives of scum and villainy around the land. These favours might entail putting you in contact with a fence, getting you a hiding place, etc.</p>"
|
||||||
|
},
|
||||||
|
"Amis haut placés": {
|
||||||
|
"name": "Friends in High Places",
|
||||||
|
"description": "<h1>Friends in High Places</h1><p>You have contacts within the upper echelons of society. While they usually do not stick their necks out for you, they will give you aid, expecting a favour in return when it suits their own interests. The sorts of things that these favours usually entail is getting you access to another important person, sharing information with you, using their pull with the local nobility, etc.</p>"
|
||||||
|
},
|
||||||
|
"Arme favorite": {
|
||||||
|
"name": "Trademark Weapon",
|
||||||
|
"description": "<h1>Trademark Weapon</h1><p>You have a quality weapon (a Valgardian Blade, Tyrus Warbow, Axish Sling, Halakhi Kir, Malakut Khastok, Parsool Sea Axe, Satarlan Foil, or another weapon made especially for you or that you inherited) that you have practised with since a child. When using this weapon (or, if lost, stolen or broken, a replacement made to duplicate its qualities exactly, possibly at great expense), you receive a bonus die.</p>"
|
||||||
|
},
|
||||||
|
"Artiste": {
|
||||||
|
"name": "Artistic",
|
||||||
|
"description": "<h1>Artistic</h1><p>You have an artistic flair. Roll a bonus die when appraising or creating items of art</p>"
|
||||||
|
},
|
||||||
|
"Athlète": {
|
||||||
|
"name": "Born Athlete",
|
||||||
|
"description": "<h1>Born Athlete</h1><p>When doing any athletic activities such as sprinting, climbing, swimming, or leaping (other than fighting), you may roll a bonus die.</p>"
|
||||||
|
},
|
||||||
|
"Attirant": {
|
||||||
|
"name": "Attractive",
|
||||||
|
"description": "<h1>Attractive</h1><p>vYou are particularly handsome or pretty. Roll a bonus die in situations where good looks might be important.</p>"
|
||||||
|
},
|
||||||
|
"Bagarreur": {
|
||||||
|
"name": "Brawler",
|
||||||
|
"description": "<h1>Brawler</h1><p>You are a skilled pugilist and wrestler. Roll a bonus die to attack when you are fighting with your fists, feet, head, etc.</p>"
|
||||||
|
},
|
||||||
|
"Baudrier de guerre": {
|
||||||
|
"name": "Battle Harness",
|
||||||
|
"description": "<h1>Battle Harness</h1><p>This boon allows your character to wear a chainmail bikini or a loincloth and battle harness (light armour at best) and treat it as if it were medium armour for damage protection purposes, with no armour penalties at all.</p>"
|
||||||
|
},
|
||||||
|
"Beau parleur": {
|
||||||
|
"name": "Silver Tongue",
|
||||||
|
"description": "<h1>Silver Tongue</h1><p>You are very persuasive and can make any lie sound plausible. Roll a bonus die whenever trying to lie, con, fast-talk, or otherwise deceive someone.</p>"
|
||||||
|
},
|
||||||
|
"Bibliothèque savante": {
|
||||||
|
"name": "Excellent Library",
|
||||||
|
"description": "<h1>Excellent Library</h1><p>You have a first-rate library for conducting your research. You get a bonus die on any rolls to find out anything while you are in it. The library does need to be restocked from time to time, leading you to occasional adventures whilst you seek the means to do this.</p>"
|
||||||
|
},
|
||||||
|
"Bien né": {
|
||||||
|
"name": "High-Born",
|
||||||
|
"description": "<h1>High-Born</h1><p>You grew up in the palaces and courts of the rich and noble. You receive a bonus die when dealing with courtly manners and matters of good form.</p>"
|
||||||
|
},
|
||||||
|
"Colosse": {
|
||||||
|
"name": "Strength Feat",
|
||||||
|
"description": "<h1>Strength Feat</h1><p>You are able to focus your strength to perform particular tasks. Roll a bonus die when breaking, lifting, pulling or pushing things.</p>"
|
||||||
|
},
|
||||||
|
"Combat à l’aveugle": {
|
||||||
|
"name": "Blind Combat",
|
||||||
|
"description": "<h1>Blind Combat</h1><p>No light? No problem. By using smell, sound, disturbances in the surrounding air, etc., you are one with the universe. Whatever penalties the GM applies to fighting in the darkness, your character does not suffer at all.</p>"
|
||||||
|
},
|
||||||
|
"Cri de guerre": {
|
||||||
|
"name": "War Cry",
|
||||||
|
"description": "<h1>War Cry</h1><p>Scares the hell out of those of your character’s opponents that can hear the War Cry. They roll a penalty die on all their Attack Rolls for the first round following the War Cry. This ability can only be used once a day (once more for a Hero Point).</p>"
|
||||||
|
},
|
||||||
|
"Discret": {
|
||||||
|
"name": "Sneaky",
|
||||||
|
"description": "<h1>Sneaky</h1>\n<p>You are lithe and nimble. Roll a bonus die where stealth is important.</p>"
|
||||||
|
},
|
||||||
|
"Doigts de fée": {
|
||||||
|
"name": "Deft Hands",
|
||||||
|
"description": "<h1>Deft Hands</h1><p>When undertaking actions requiring fine manipulation, such as picking pockets, making things, juggling, or card-sharping, you receive a bonus die.</p>"
|
||||||
|
},
|
||||||
|
"Dur à cuire": {
|
||||||
|
"name": "Hard-to-Kill",
|
||||||
|
"description": "<h1>Hard-to-Kill</h1><p>You are hard to put down and have the toughness of a bronyx. Add +2 lifeblood to your total.</p>"
|
||||||
|
},
|
||||||
|
"Érudit": {
|
||||||
|
"name": "Learned",
|
||||||
|
"description": "<h1>Learned</h1><p>When recalling a fact from your area of speciality, you receive a bonus die.</p>"
|
||||||
|
},
|
||||||
|
"Fêtard": {
|
||||||
|
"name": "Carouser",
|
||||||
|
"description": "<h1>Carouser</h1><p>You were more-or-less brought up in a tavern and are popular when the drink is flowing. Roll a bonus die to gain information, make contacts, or acquire goods and services whilst in a tavern. You are also resilient to the effects of alcohol.</p>"
|
||||||
|
},
|
||||||
|
"Fils des plaines": {
|
||||||
|
"name": "Plains-Born",
|
||||||
|
"description": "<h1>Plains-Born</h1><p>You grew up on the plains. When tracking, trapping, hunting, or carrying out other similar activities (not fighting) in a plains environment, you receive a bonus die.</p>"
|
||||||
|
},
|
||||||
|
"Fortuné": {
|
||||||
|
"name": "Great Wealth",
|
||||||
|
"description": "<h1>Great Wealth</h1><p>You have a source of income or an inheritance. Roll a bonus die on any attempt to obtain any goods, services, or other items you need whilst in your home city.</p>"
|
||||||
|
},
|
||||||
|
"Gamin des rues": {
|
||||||
|
"name": "Low-Born",
|
||||||
|
"description": "<h1>Low-Born</h1><p>You grew up on the city streets. You receive a bonus die when dealing with the lowlife and scum of a city’s underground, or when carrying out activities (not fighting) such as trailing people or noticing things.</p>"
|
||||||
|
},
|
||||||
|
"Inspirateur": {
|
||||||
|
"name": "Inspire",
|
||||||
|
"description": "<h1>Inspire</h1><p>Inspires your friends and supporters. This could represent an appeal to the gods, inspired leadership, inspirational music, or just your own force of personality. Inspire gives a bonus die for one round after the call to all your companions’ Attack Rolls (if they can hear you). This can be done once a day for free, or again for a Hero Point.</p>"
|
||||||
|
},
|
||||||
|
"Intimidant": {
|
||||||
|
"name": "Fearsome Looks",
|
||||||
|
"description": "<h1>Fearsome Looks</h1><p>Roll a bonus die whenever you are trying to force somebody to give you information or do something they don’t want to do.</p>"
|
||||||
|
},
|
||||||
|
"Intrépide": {
|
||||||
|
"name": "Fearless",
|
||||||
|
"description": "<h1>Fearless</h1><p>Your character shows no fear. Even magically induced fear has no effect on him or her.</p>"
|
||||||
|
},
|
||||||
|
"Laboratoire fourni": {
|
||||||
|
"name": "Excellent Workshop",
|
||||||
|
"description": "<h1>Excellent Workshop</h1><p>You have a first-rate workshop for conducting your experiments. You get a bonus die on any rolls to make alchemical preparations or mechanical devices while you are in it. The workshop does need to be restocked from time to time, leading you to occasional adventures whilst you seek the means to do this.</p>"
|
||||||
|
},
|
||||||
|
"Magie des Rois-Sorciers": {
|
||||||
|
"name": "Magic of the Sorcerer-Kings",
|
||||||
|
"description": "<h1>Magic of the Sorcerer-Kings</h1><p>You understand some of the ancient secrets of the Sorcerer-Kings. You can roll a bonus die when casting spells, although you must also take an extra flaw.</p>"
|
||||||
|
},
|
||||||
|
"Mains guérisseuses": {
|
||||||
|
"name": "Healing Touch",
|
||||||
|
"description": "<h1>Healing Touch</h1><p>Gain a bonus die whenever rolling to help someone recover from injury, poison, etc. You must have the physician career to take this boon.</p>"
|
||||||
|
},
|
||||||
|
"Maître du déguisement": {
|
||||||
|
"name": "Master of Disguise",
|
||||||
|
"description": "<h1>Master of Disguise</h1><p>You gain a bonus die whenever you are trying to conceal your true identity. In addition, whenever you want to suddenly appear in a scene where your character wasn’t already, you can spend a Hero Point to emerge as one of the random guards, townsfolk, etc., in the background. You were there the whole time, merely incognito!</p>"
|
||||||
|
},
|
||||||
|
"Marqué par les dieux": {
|
||||||
|
"name": "Marked by the Gods",
|
||||||
|
"description": "<h1>Marked by the Gods</h1><p>The Gods favour you. You have an extra Hero Point.</p>"
|
||||||
|
},
|
||||||
|
"Montagnard": {
|
||||||
|
"name": "Mountain-Born",
|
||||||
|
"description": "<h1>Mountain-Born</h1><p>You grew up in the mountains. When tracking, trapping, hunting, or carrying out other similar activities (not fighting) in a mountainous terrain, you roll a bonus die.</p>"
|
||||||
|
},
|
||||||
|
"Né en selle": {
|
||||||
|
"name": "Born-in-the-Saddle",
|
||||||
|
"description": "<h1>When dealing with riding beasts or carrying out physical activities (other than fighting) while mounted, you may roll a bonus die.</p>"
|
||||||
|
},
|
||||||
|
"Odorat développé": {
|
||||||
|
"name": "Keen Scent",
|
||||||
|
"description": "<h1>Keen Scent</h1><p>Whenever you make a mind Task Roll to perceive something using your sense of smell, you receive a bonus die.</p>"
|
||||||
|
},
|
||||||
|
"Ouïe fine": {
|
||||||
|
"name": "Keen Hearing",
|
||||||
|
"description": "<h1>Keen Hearing</h1><p>Whenever you make a mind Task Roll to perceive something using your hearing, you receive a bonus die.</p>"
|
||||||
|
},
|
||||||
|
"Outillage": {
|
||||||
|
"name": "Tools of the Trade",
|
||||||
|
"description": "<h1>Tools of the Trade</h1><p>You own a set of tools suited to your trade or craft. Roll a bonus die when attempting any actions for which using these tools would be beneficial.</p>"
|
||||||
|
},
|
||||||
|
"Peau dure": {
|
||||||
|
"name": "Thick Skin",
|
||||||
|
"description": "<h1>Thick Skin</h1><p>You have particularly leathery skin, which gives you +1 to your protection from damage, even when not wearing armour.</p>"
|
||||||
|
},
|
||||||
|
"Perspicace": {
|
||||||
|
"name": "Detect Deception",
|
||||||
|
"description": "<h1>Detect Deception</h1><p>vYou are good at spotting when you are being lied to. Any time someone tries to lie to or con you, you often see right through them. You receive a bonus die to divine fact from fable. You won’t automatically know the truth, but you know that what you’re being told isn’t.</p>"
|
||||||
|
},
|
||||||
|
"Pied marin": {
|
||||||
|
"name": "Born-at-Sea",
|
||||||
|
"description": "<h1>Born-at-Sea</h1><p>You grew up on and around boats and ships. When dealing with ships or carrying out physical activities on board ship (other than fighting), you receive a bonus die.</p>"
|
||||||
|
},
|
||||||
|
"Pisteur des marais": {
|
||||||
|
"name": "Swamp-Born",
|
||||||
|
"description": "<h1>Swamp-Born</h1><p>You grew up in the swamps. When tracking, trapping, hunting, or carrying out similar activities (not fighting) in swamps and marshes, roll a bonus die.</p>"
|
||||||
|
},
|
||||||
|
"Poings d’acier": {
|
||||||
|
"name": "Mighty Fists",
|
||||||
|
"description": "<h1>Mighty Fists</h1><p>Your fists are rock-hard from years of training in the fighting pits or brawling in the city taverns. You can add your full strength to damage caused when fighting unarmed.</p>"
|
||||||
|
},
|
||||||
|
"Pouvoir du Néant": {
|
||||||
|
"name": "Power of the Void",
|
||||||
|
"description": "<h1>Power of the Void</h1><p>You have gazed upon the darkness of the Void and receive two extra points of Arcane Power. However, you also have to take an extra flaw.</p>"
|
||||||
|
},
|
||||||
|
"Récupération rapide": {
|
||||||
|
"name": "Quick Recovery",
|
||||||
|
"description": "<h1>Quick Recover</h1><p>You have a much better constitution than many. When recovering after a combat, you regain one additional lifeblood, on top of the half you normally recover. In addition, you recover one lifeblood each day regardless of the type of activity you carry out after being injured.</p>"
|
||||||
|
},
|
||||||
|
"Renard du désert": {
|
||||||
|
"name": "Desert-Born",
|
||||||
|
"description": "<h1>Desert-Born</h1><p>When tracking, trapping or hunting, or carrying out other similar activities (not fighting) in a desert, you roll a bonus die.</p>"
|
||||||
|
},
|
||||||
|
"Résistant à la magie": {
|
||||||
|
"name": "Resistant to Sorcery",
|
||||||
|
"description": "<h1>Resistant to Sorcery</h1><p>If a spell is cast at you, roll a d6. On a roll of 6, it simply does not work on you.</p>"
|
||||||
|
},
|
||||||
|
"Résistant aux poisons": {
|
||||||
|
"name": "Poison Resistance",
|
||||||
|
"description": "<h1>Poison Resistance</h1><p>You receive a bonus die whenever you are resisting the effects of drugs, venoms, toxins, and even alcohol.</p>"
|
||||||
|
},
|
||||||
|
"Roi de l’évasion": {
|
||||||
|
"name": "Escape Artist",
|
||||||
|
"description": "<h1>Escape Artist</h1><p>Ropes, chains, manacles, even prison cells – nothing holds you for long. Either by skill or by dumb luck, you always get away (eventually). Roll a bonus die whenever you are in this situation and are trying to break free.</p>"
|
||||||
|
},
|
||||||
|
"Roi de la jungle": {
|
||||||
|
"name": "Jungle-Born",
|
||||||
|
"description": "<h1>Jungle-Born</h1><p>You grew up in the jungle. When tracking, trapping, hunting, or carrying out other similar activities (not fighting) in a jungle environment, you roll a bonus die.</p>"
|
||||||
|
},
|
||||||
|
"Santé de fer": {
|
||||||
|
"name": "Disease Immunity",
|
||||||
|
"description": "<h1>Disease Immunity</h1><p>You are immune to all diseases, even magical ones.</p>"
|
||||||
|
},
|
||||||
|
"Savant": {
|
||||||
|
"name": "Savant",
|
||||||
|
"description": "<h1>Savant</h1><p>You may add +1 to your mind attribute. Your maximum mind is 6 rather than 5, and your maximum starting mind is 4 rather than 3.</p>"
|
||||||
|
},
|
||||||
|
"Sentir la magie": {
|
||||||
|
"name": "Nose for Magic",
|
||||||
|
"description": "<h1>Nose for Magic</h1><p>You receive a bonus die when trying to spot or track a wizard, or a magical effect or artefact.</p>"
|
||||||
|
},
|
||||||
|
"Tigre des neiges": {
|
||||||
|
"name": "Tundra-Born",
|
||||||
|
"description": "<h1>Tundra-Born</h1><p>You were born in the snowy tundra. When tracking, trapping, hunting, or carrying out other similar activities (not fighting) in a snowy terrain, you roll a bonus die.</p>"
|
||||||
|
},
|
||||||
|
"Tireur puissant": {
|
||||||
|
"name": "Mighty Shot",
|
||||||
|
"description": "<h1>Mighty Shot</h1><p>With your selected type of ranged weapon (bow, sling, javelin, etc.) you can cause your full strength to the damage on a hit.</p>"
|
||||||
|
},
|
||||||
|
"Vigilant": {
|
||||||
|
"name": "Alert",
|
||||||
|
"description": "<h1>Alert</h1><p>You are quick to spot danger and react. You receive a bonus die to your Priority Rolls.</p>"
|
||||||
|
},
|
||||||
|
"Vigueur céruléenne": {
|
||||||
|
"name": "Giant Strength",
|
||||||
|
"description": "<h1>Giant Strength</h1><p>You are big and strong. You may add 1 to your strength. Your maximum strength is 6 rather than 5, and your maximum starting strength is 4 rather than 3.</p>"
|
||||||
|
},
|
||||||
|
"Vision nocturne": {
|
||||||
|
"name": "Night Sight",
|
||||||
|
"description": "<h1>Night Sight</h1><p>You receive a bonus die when darkness causes negative modifiers to see things.</p>"
|
||||||
|
},
|
||||||
|
"Vue perçante": {
|
||||||
|
"name": "Keen Eyesight",
|
||||||
|
"description": "<h1>Keen Eyesight</h1><p>Whenever you make a mind Task Roll to perceive something using your eyesight, you receive a bonus die.</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": "Ferocious Attack"
|
||||||
|
},
|
||||||
|
"Attaque Multiple": {
|
||||||
|
"name": "Multiple Attacks"
|
||||||
|
},
|
||||||
|
"Attaque Spéciale": {
|
||||||
|
"name": "Special Attack"
|
||||||
|
},
|
||||||
|
"Attaque Timide": {
|
||||||
|
"name": "Docile Attack"
|
||||||
|
},
|
||||||
|
"Attaque Venimeuse": {
|
||||||
|
"name": "Venomous Attack"
|
||||||
|
},
|
||||||
|
"Camouflage": {
|
||||||
|
"name": "Camouflage"
|
||||||
|
},
|
||||||
|
"Déficience": {
|
||||||
|
"name": "Poor ..."
|
||||||
|
},
|
||||||
|
"Prédateur": {
|
||||||
|
"name": "Excellent Hunter"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
116
compendiums/en/bol.careers.json
Normal file
@ -0,0 +1,116 @@
|
|||||||
|
{
|
||||||
|
"label": "Heroic careers",
|
||||||
|
"mapping": {
|
||||||
|
"description": "system.description"
|
||||||
|
},
|
||||||
|
"entries": {
|
||||||
|
"Alchimiste (artificier/inventeur)": {
|
||||||
|
"name": "Alchemist (Artificer, Inventor)",
|
||||||
|
"description": "<h1>Alchemist (Artificer, Inventor)</h1><p>Alchemists are the scientists and inventors of Lemuria, and are often mistaken for wizards by those who do not understand science. They are masters of metallurgy and chemical processes, mixing and blending various ingredients together to create potions and tinctures, and have extensive knowledge of herbs and plants, often growing them in their own gardens.</p><p>Their work with chemicals and metals enables alchemists to produce perfumes, potions, powders, poisons, metal alloys, devices, machines, and other amazing creations. Some knowledgeable alchemists can splice living things to create bizarre and horrific chimeras. When making machines, alchemists work closely with blacksmiths to build their creations. For more information on Alchemy, see Chapter 6</p><p>Attributes: Mind is normally the most important attribute for alchemists, as they need to be able to make and read descriptive notes, understand ancient texts and diagrams, and build devices from the descriptions written by the Sorcerer-Kings.</p><p>Adventuring: This is not a terribly common career for Heroes as it requires much patience and little excitement. However, some of the more daring alchemists like to visit ancient sites to see the remains themselves, in case there are relics they’d recognise for their true worth that others would pass over.</p><p>Fighting: are very few circumstances where having ranks as an alchemist would help a character in combat.</p><p><p>Suggested Boons: Deft Hands, Excellent Library, Excellent Workshop, Keen Scent, Learned, Poison Resistance, Savant</p><p><p>Suggested Flaws: Absent-Minded, City Dweller, Combat Paralysis, Delicate, Non-Combatant, Obsession (knowledge or artefacts)</p><p>Perilous Career: For each rank above 2 in this career, the character must take a flaw (see the List of Boons and Flaws)</p><p><p>Languages: Alchemists need to learn Sorceric if they wish to use the powerful magics and alchemies of this ancient race. Learning this language is painfully difficult, and requires both spoken and written forms to be taken separately</p>"
|
||||||
|
},
|
||||||
|
"Assassin (agent/espion)": {
|
||||||
|
"name": "Assassin (Agent, Spy)",
|
||||||
|
"description": "<h1>Assassin (Agent, Spy</h1><p>Blades-for-hire, perhaps agents in the service of the king, spies and assassins make killing and stealing in a discreet manner a way of life. They are adept at sneak attacks, killing, information gathering, disguises, city lore, persuasion, poisons, and lock picking. Their methods involve gathering intelligence on their subject from various (sometimes seedy) sources, circumventing security measures of all types, adopting disguises that allow them to get close to the target, and building up a broad selection of contacts. They are also patient, sometimes hiding out in a single spot for days to await the perfect opportunity to strike. It is widely acknowledged that the best assassins are from Halakh.</p><p>Attributes: All of the attributes are important for assassin characters.</p><p>Adventuring: Assassins and spies tend to be loners, so this isn’t a career that lends itself to an adventuring group. However, ex-assassins do have skills that might be welcome in an adventuring party.</p><p>Fighting: In combat, an assassin might gain a brief advantage in a surprise attack, such as when he strikes out of the shadows, or when he attacks by surprise using a concealed blade.</pSuggested Boons: Alert, Keen Hearing, Keen Eyesight, Friends in High Places, Friends in Low Places, Master of Disguise, Poison Resistance, Silver Tongue, Sneaky, Trademark Weapon.</p><p>Suggested Flaws: Arrogant, City Dweller, Hunted, Infamous, Obsession (finish the mission).</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": "Barbarian (Berserker, Savage)",
|
||||||
|
"description": "<h1>Barbarian (Berserker, Savage)</h1><p>These characters are not from the cities of Lemuria, but from the Axos Mountains, the Valgardian Northlands, the Beshaar Deserts, and other wildernesses of the continent. Barbarians are wild and untamed, like the lands they live in. They have natural skills in wilderness lore, survival, beast riding, intimidation, natural instincts, berserk rages, and so on.</p><p>Attributes: Living rough requires a certain degree of hardiness, and so barbarians are generally noted for their strength. A good agility is also useful.</p><h2><p>Adventuring: Barbarian characters are natural adventurers and have the skills and abilities to survive where others wouldn’t.</p><h2><p>Fighting: In combat, barbarians are generally brutal and unrefined. This might shock city folks not used to dealing with such savagery, so a barbarian could gain a brief advantage where the fight is hard and dirty.</p><p>Suggested Boons: Alert, Disease Immunity, Fearsome Looks, Hard-to-Kill, Jungle-Born, Keen Eyesight, Keen Hearing, Keen Scent, Mountain-Born, Plains-Born, Quick Recovery, Battle Harness, Strength Feat, Swamp-Born, Thick Skin, Tundra-Born, Trademark Weapon, War Cry.</p>"
|
||||||
|
},
|
||||||
|
"Bourreau (geôlier/esclavagiste)": {
|
||||||
|
"name": "Executioner (Slaver, Torturer)",
|
||||||
|
"description": "<h1>Executioner (Slaver, Torturer)</h1><p>Executioners are expected to carry out public slayings as required by local nobles and judges.</p><p>Torturers are tasked with locking up some of the most hardened criminals in the cities of Lemuria. They ply their unpleasant trade in the most squalid of conditions, deep underground, extracting information from reticent prisoners and enemies of the kings.</p><p>Torturers are skilled in interrogation and intimidation, and have a basic awareness of anatomy and first aid (you’ve got to make sure your prisoners are healthy before they are broken).<p>Slavers travel to foreign parts to capture or buy “savages” to bring back to the cities of Lemuria for sale as gladiators, labourers, servants, and harem slaves</p></p><p>Attributes: They are not often blessed with a great deal of appeal, but strength is handy for beheadings and for maintaining a hold on your captives.</p><p>Adventuring: Although torturers rarely leave their dank prisons, and don’t have much interest in adventure, the odd executioner may find himself exiled and forced to choose riches and wealth over pain and suffering. Slavers travel far and wide.</p><p>Fighting: In combat, executioners prefer two-handed axes and great swords, and some slavers will be handy with a whip. Executioners are not subtle, so skilled fighters will rarely fall to their combat style unless already prone and helpless.</p><p>Suggested Boons: Strength Feat, Fearsome Looks, Hard-to-Kill, Quick Recovery, Friends in Low Places, Trademark Weapon.</p><p>Suggested Flaws: Braggart, Cowardly, City Dweller, Drunkard, Fear of …, Greed, Illiterate, Lumbering, Missing Eye or Ear, Missing Limb, Poor Eyesight, Poor Hearing, Ugly & Brutish, Unsettling, Unprepared, Zealot.</p>"
|
||||||
|
},
|
||||||
|
"Chasseur (éclaireur/pisteur)": {
|
||||||
|
"name": "Hunter (Scout, Tracker)",
|
||||||
|
"description": "<h1>Hunter (Scout, Tracker)</h1><p>The hunter is a master of tracking prey through the wilderness and the wastelands. Once hunters locate their target, they’ll use stealth, traps and/or expert bowmanship to bring it down. They are at home in the wild and can survive there for long periods, returning to more civilised areas only when they have furs and hides to sell, or when they require the company of their fellow men (or women).</p><p><p>Attributes: Agility is important to a hunter, as are strength and mind to a slightly lesser degree.</p><p>Adventuring: Hunting dangerous beasts is adventure enough. However, hunters are also very familiar with the areas they hunt in and sometimes stumble across old trails, ancient ruins, and strange places during their travels. For this reason, they can be highly sought after as guides.</p><p>Fighting: In combat, a hunter may receive a career bonus if fighting a creature of a type he is familiar with, but the career is rarely useful against human opponents.</p><p>Suggested Boons: Alert, Beast-Friend, Desert- Born, Keen Eyesight, Keen Hearing, Keen Scent, Mountain-Born, Night Sight, Plains-Born, Sneaky, Swamp-Born, Tools of the Trade</p><p>Suggested Flaws: Landlubber, Missing Eye or Ear, Missing Limb, Taciturn.</p>"
|
||||||
|
},
|
||||||
|
"Danseur (acrobate/saltimbanque)": {
|
||||||
|
"name": "Dancer (Acrobat, Tumbler)",
|
||||||
|
"description": "<h1>Dancer (Acrobat, Tumbler)</h1><p>Dancing is an important part of entertainment in Lemuria. Ceremonies and feasts will have dancers or acrobats. Dancers are athletic, showing feats of skill, agility, and coordination. Some dancers extend their skills to a few sleight of hand and juggling tricks, and others to exotic techniques using veils to barely conceal their nakedness.</p><p>Attributes: Dancers rely mostly on their agility and their appeal. Acrobats and tumblers tend to be stronger than they look.</p><p>Adventuring: These entertainers often travel around in troupes from city to city. This can lead to some dangerous situations on the road, from fierce monsters to brigands and thieves.</p><p>Fighting: In combat, a dancer might gain an advantage if her opponent is too busy examining her charms, or she might gain an edge performing a roll or diving tumble. However, dancing is not really a combat career and will rarely be of use against a skilled fighting man. Acrobats can make very good use of vines, ropes, and wall hangings in daring swashbuckling-style moves, though.</p><p>Suggested Boons: Alert, Attractive, Born Athlete, Deft Hands, Escape Artist, Quick Recovery, Sneaky.</p><p>Suggested Flaws: City Dweller, Delicate, Non- Combatant.</p>"
|
||||||
|
},
|
||||||
|
"Dresseur (maître des bêtes/montreur d’ours)": {
|
||||||
|
"name": "Beastmaster (Animal Handler, Beast Trainer)",
|
||||||
|
"description": "<h1>Beastmaster (Animal Handler, Beast Trainer)</h1><p>Beastmasters are in demand all over Lemuria for their special empathy and skill with animals. They train animals for riding, for pulling wagons, for combat, and even for the gladiatorial arena. Beastmasters can calm maddened creatures, are expert riders and wagoneers, can recognise whether creatures are dangerous and about to attack or not, and often have some skill in healing them if injured or sick. Some beastmasters rule their animals by fear and deprivation.</p><p>Attributes: Beastmasters have to have a strong personality, tempered with a good heart (in most cases) and steely determination. So appeal is the most important, but mind is a close runner-up.</p><p>Adventuring: Beastmasters are sought after by merchant with caravans, by nobles and commanders of armies to train and look after their mounts, by owners of gladiatorial arenas, and by adventurers who expect to come across strange beasts on their missions.</p><p>Fighting: Beastmasters know how to deal with beasts and where their weak spots are, so they will gain the occasional advantage if they ever have to fight them.</p><p>Suggested Boons: Alert, Beast-Friend, Born-in-the-Saddle, Keen Eyesight, Keen Hearing, Keen Scent, Night Sight, Poison Resistance, Battle Harness.</p><p>Suggested Flaws: Can’t Lie, Country Bumpkin, Hot-Headed, Illiterate.</p>"
|
||||||
|
},
|
||||||
|
"Esclave (serf/serviteur)": {
|
||||||
|
"name": "Slave (Serf, Thrall)",
|
||||||
|
"description": "<h1>Slave (Serf, Thrall)</h1><p>Slavery is not exactly a career of choice for a heroic adventurer. Nevertheless, it can be useful in rounding out a character concept, and does provide the opportunity to pick up a few skills and techniques that other careers do not give.</p><p>The career provides skill in things like humility, going unnoticed, listening and sneaking, as well as cooking, cleaning, gardening, sewing, and manual labour. Some slaves (the strong ones or the troublemakers) are sold to gladiatorial arenas. In Zalut, if you are not a priest, an alchemist, or a magician, you are a slave.</p><p>Attributes: Slaves that are used for labour need good strength – female slaves normally find things better (or worse!) if they have appeal. Slaves used to run errands often need high agility. Clever slaves are normally considered to be troublemakers.</p><p>Adventuring: Adventurous slaves invariably do not remain enslaved for very long, unless it suits their purposes. A life on the run from slavery leads to adventure, whether wanted or not.</p><p>Fighting: The career is not really of any practical use in a fight. Still, slaves will mostly be ignored by warriors, maybe to their cost.</p><p>Suggested Boons: Escape Artist, Keen Hearing, Sneaky, Strength Feat.</p><p>Suggested Flaws: City Dweller, Combat Paralysis, Cursed, Fear of …, Feels the Cold, Illiterate, Landlubber, Mute, Non-Combatant, Poor Recovery, Taciturn.</p>"
|
||||||
|
},
|
||||||
|
"Fermier (paysan/berger)": {
|
||||||
|
"name": "Farmer (Herder, Peasant)",
|
||||||
|
"description": "<h1>Farmer (Herder, Peasant)</h1><p>Farmers live outside the city, but often within half a day’s travel, so that they are able to get their produce to the city to feed the populace. They are hardy and hard-working, and are skilled in basic plant and animal lore, animal handling, cooking, baking and brewing, trading for basic goods, and such like.</p><p>Attributes: Farmers do not rely on any one attribute over any other, although appeal is probably the least important.</p><p>Adventuring: Farmers are not particularly adventurous, so something unusual or dreadful would have to happen to make a farmer leave his farm and take up a life of adventure.</p><p>Fighting: Farmers are not generally skilled combatants and so rarely receive any advantage from this career, except maybe when defending their own lands against raiders, or when turning an agricultural implement into a serviceable weapon.</p><p>Suggested Boons: Beast-Friend, Brawler, Carouser, Marked by the Gods.</p><p>Suggested Flaws: Country Bumpkin, Drunkard, Gullible, Landlubber, Lumbering, Taciturn, Ugly & Brutish, Unprepared.</p>"
|
||||||
|
},
|
||||||
|
"Forgeron (armurier)": {
|
||||||
|
"name": "Blacksmith (Armourer)",
|
||||||
|
"description": "<h1>Blacksmith (Armourer)</h1><p>Often found helping alchemists to build their inventions, these craftspeople work hard at their forges – melting, bending, shaping, and fixing metal objects. They are skilled at weapon and armour making and repair. They craft tools and implements, and manufacture many other metallic items and objects, from shackles and cages, to the metal parts of galleys and sky-boats. Their skills lie in metallurgy, and the knowledge of weapons, armour, and metal goods. This helps them when bartering and haggling the price of metallic items.</p><p>Attributes: Blacksmiths are noted for their strength and their toughness – being able to work hard at their forge tends to develop their muscles and hardiness.</p><p>Adventuring: Blacksmiths aren’t really adventurers, although some do join mercenary companies to craft and maintain their weapons and armour.</p><p>Fighting: Although not a combatant, a blacksmith might receive a melee bonus if his opponent is wearing metallic armour and if he knows its design and weak points.</p><p>Suggested Boons: Brawler, Battle Harness, Excellent Workshop, Master Crafter, Strength Feat, Tools of the Trade, Trademark Weapon.</p><p>Suggested Flaws: Feels the Cold, Gullible, Hot- Headed, Taciturn, Unprepared.</p>"
|
||||||
|
},
|
||||||
|
"Gladiateur (champion, belluaire)": {
|
||||||
|
"name": "Gladiator (champion, myrmidon)",
|
||||||
|
"description": "<h1>Gladiator (champion, myrmidon)</h1><p>Gladiators are specialists at individual combat. They are adept with a variety of weapons. They can fight humans or beasts in an entertaining fashion. Gladiators may have ended up in the arena as a slave or to pay off a debt – whatever the reason, they have survived to hear the howls of the crowd and their adversary at their feet. The best gladiators are often famous outside the arena, which can be to their advantage or to their detriment.</p><p><p>Attributes: Gladiators should be strong and agile, but the most popular ones also have plenty of appeal.</p><p><p>Adventuring: A life in the arena does not lend itself to a life of adventure. However, many Heroes have spent some of their time in a gladiatorial arena, either by choice, by circumstance, or by necessity</p><p>Fighting: They are especially good at fighting in a style that is designed for spectacular bloodletting rather than a simple quick kill. They might get a combat bonus on certain flashy moves, if not overused and, as usual, at the GM’s discretion.</p><p>Suggested Boons: Alert, Born Athlete, Brawler, Fearsome Looks, Hard-to-Kill, Marked by the Gods, Quick Recovery, Battle Harness, Trademark Weapon, War Cry.</p><p>Suggested Flaws: Braggart, Distinctive Appearance, Hot-Headed, Missing Eye or Ear, Missing Limb.</p>"
|
||||||
|
},
|
||||||
|
"Marchand (colporteur/négociant)": {
|
||||||
|
"name": "Merchant (Peddler, Trader)",
|
||||||
|
"description": "<h1>Merchant (Peddler, Trader)</h1><p>Merchants are not shopkeepers – they are wide- travelled adventurers, who seek new and exotic goods to sell from faraway places. As such, merchant characters pick up a range of useful skills like trading, appraisal, obtaining rare or unusual goods, persuasion, city lore, knowledge of distant places, and guild membership. If you want a strange or unusual item, speak to a merchant first.</p><p>Attributes: Merchants need a quick mind and a degree of appeal to haggle and barter for their living.</p><p>Adventuring: A life on the road is a life of adventure, whether the merchant tries to avoid it or not. Many merchants actively seek out new lands and new markets, leading to many adventures.</p><Fighting: Merchant is not a combat career, so this will almost never be helpful to a character in a fight.</p><p>Suggested Boons: Detect Deception, Great Wealth, Savant, Silver Tongue.</p><p>Suggested Flaws: Greed, Non-Combatant, Obsession, Unprepared.</p>"
|
||||||
|
},
|
||||||
|
"Marin (matelot/pirate)": {
|
||||||
|
"name": "Sailor (Mariner, Pirate)",
|
||||||
|
"description": "<h1>Sailor (Mariner, Pirate)</h1><p>Sailors are sea warriors and adventurers, are skilled in sea lore, navigation by stars, and boat handling, and have a good knowledge of local ports and nearby coastlines and islands.</p><p>Skilled mariners are always in demand and so they will rarely be refused working passage on board a galley. Rogues of the sea, pirates are skilled in seacraft and speak their own version of Lemurian, known as Sea-Tongue</p><p>Attributes: Sailors need strength, and some agility is useful too.</p><p>Adventuring: A life at sea is full of adventure – sea monsters, exotic places, strange people, sea battles and treasure maps are all food and drink to a mariner.</p><p>Fighting: Sailors may receive a combat bonus in actions at sea and possibly even against sea creatures that they might have some familiarity with or heard about.</p><Suggested Boons: Alert, Brawler, Born Athlete, Born- at-Sea, Carouser, Deft Hands, Friends in Low Places, Keen Eyesight, Battle Harness, Sneaky, War Cry.</p><p>Suggested Flaws: Braggart, Distinctive Appearance, Distrust of Sorcery, Drunkard, Fear of …, Greed, Hot Headed, Illiterate, Lustful, Missing Eye or Ear, Missing Limb.</p>"
|
||||||
|
},
|
||||||
|
"Médecin (guérisseur/rebouteux)": {
|
||||||
|
"name": "Physician (Healer, Leech)",
|
||||||
|
"description": "<h1>Physician (Healer, Leech)</h1><p>Physicians, and others who can heal injured or sick people, are very important individuals in the cities of Lemuria. With their great scale of knowledge and the importance of their job, they are held in high esteem in society. Most of the lowest-born citizens cannot afford the services of a physician, and are forced to use the services of charlatans and quacks.</p><p>Physicians are dispensers of potions and medicines and have practical skills in bone setting, surgery, and child delivery. They are knowledgeable of plant lore, first aid, and diseases and their cures. Many physicians have their own herb gardens, where they grow the exotic plants that are used in their medications. And some physicians practise a little basic alchemy (see Chapter 6). Physicians need to be literate.</p><p>Attributes: Mind is the most important attribute for a physician character.</p><p>Adventuring: Being a physician does not lend itself to a life of adventure, although physicians will be required by both sea and army captains.</p><p>Fighting: In combat, the physician’s career is not really of particular benefit to a character, although after the fight, they are often most welcome.</p><p>Suggested Boons: Deft Hands, Disease Immunity, Excellent Library, Healing Touch, Learned, Poison Resistance.</p><p>Suggested Flaws: Can’t Lie, City Dweller, Combat Paralysis, Drunkard, Non-Combatant.</p>"
|
||||||
|
},
|
||||||
|
"Mendiant (vagabond/clochard)": {
|
||||||
|
"name": "Beggar (Hobo, Vagabond)",
|
||||||
|
"description": "<h1>Beggar (Hobo, Vagabond)</h1><p>Beggars are vagrants or tramps, aimlessly wandering from place to place. They may do casual work here and there, they may sell a few small trinkets that they carry about in their backpacks, or they may have to beg for a few coins when times are really hard. Some even turn their hands to dishonest pursuits.</p><p>Attributes: There are no particular attributes that vagabonds are noted for, although it helps if begging to have a deformity, missing body part, or an unsocial disease (or at least to fake having one of these disabilities).</p><p>Adventuring: A life on the road means you will meet all sorts of people and can lead to adventure even if you are not actively seeking it.</p><p>Fighting: A vagabond is not normally a combatant, and therefore the only times having this career would be helpful in a fight is when the character is doing his best not to be noticed.</p><p>Suggested Boons: Deft Hands, Friends in Low Places, Low-Born, Sneaky.</p><p>Suggested Flaws: City Dweller, Cravings, Cursed, Delicate, Distinctive Appearance, Drunkard, Illiterate, Missing Eye or Ear, Missing Limb, Morgazzon’s Curse, Non- Combatant, Poor Recovery, Untrustworthy.</p>"
|
||||||
|
},
|
||||||
|
"Ménestrel (barde/poète)": {
|
||||||
|
"name": "Minstrel (Bard, Poet)",
|
||||||
|
"description": "<h1>Minstrel (Bard, Poet)</h1><p>As wandering entertainers, minstrels perform songs, music, poetry, and plays – telling tales of distant places and historical or fantastical events. They often create their own stories or memorise and embellish the work of others. Whilst most are travellers taking their songs and music from city to city, some are retained at the courts of nobles for their own entertainment.</p><p>These performers are happiest when playing to crowds and earning a few coins for their efforts. Some minstrels extend their art to a bit of juggling and possibly other sleight-of-hand trickery – this can be a good cover for a character who is also a thief. Because they travel and are great gossips, they learn ancient legends, are good orators, and have some knowledge of city and world lore. A minstrel is often a big hit with the ladies, having as they do a gift for saying the right thing.</p><p>Attributes: Minstrels require appeal as well as agility and quick minds.</p><p>Adventuring: Minstrels are wanderers, so by their very nature they can get caught up in some dangerous escapades on the road. Some might also follow soldiers and adventurers, simply to be able to create heroic tales from first-hand experience.</p><Fighting: Minstrel is not generally a combat career and there are very few circumstances where this career will provide a combat bonus. Possibly a trick or distraction might give the opportunity to get a surprise stab or, more likely, a chance to escape.</p><p>Suggested Boons: Artistic, Attractive, Carouser, Detect Deception, Keen Hearing, Learned, Master of Disguise, Inspire, Silver Tongue, Tools of the Trade (instrument).</p><p>Suggested Flaws: Arrogant, Delicate, Drunkard, Lustful, Non-Combatant.</p>"
|
||||||
|
},
|
||||||
|
"Mercenaire (brigand/guerrier)": {
|
||||||
|
"name": "Mercenary (Bandit, Warrior)",
|
||||||
|
"description": "<h1>Mercenary (Bandit, Warrior)</h1><p>These warriors work for anyone who will pay for their services. Some form themselves into companies under a strong leader and others travel individually or in small bands to seek employment. Often these mercenary groups turn to banditry when not gainfully employed. Just about all the city-states of Lemuria have used mercenaries in their past conflicts and most will continue to do so. They tend to have skill in living rough, riding, intimidation, carousing, and in basic upkeep and repair of weapons and armour.</p><p>Attributes: Mercenaries should be strong and agile to be able to ply their trade of war.</p><p>Adventuring: Mercenaries, by nature, tend to be drifters – travelling across Lemuria to seek employment. Even when warring has ceased, there will be jobs guarding merchant caravans, treasure-hunting expeditions, and working for the nobility as bodyguards.</p><p>Fighting: Mercenaries are notorious for their ability to fight well when well paid, but to fight badly – or not at all – when conned or badly paid. In combat, they might receive a career bonus if the money is particularly good.</p><p>Suggested Boons: Alert, Blind Combat, Brawler, Born-in-the-Saddle, Carouser, Hard-to-Kill, Quick Recovery, Inspire, Battle Harness, Trademark Weapon, War Cry.</p><p>Suggested Flaws: Braggart, Greed, Hot-Headed, Lustful.</p>"
|
||||||
|
},
|
||||||
|
"Noble (aristocrate/courtisan)": {
|
||||||
|
"name": "Noble (Aristocrat, Courtier)",
|
||||||
|
"description": "<h1>Noble (Aristocrat, Courtier)</h1><p>Often holding homes in the city and estates or villas outside the city, these characters are usually titled (though not necessarily deserving) and have some authority over the common people, peasants, and slaves. Nobles are often able to obtain credit, have high-ranking contacts, and are skilled in such things as bribery, browbeating, dress sense, and etiquette.</p><p>Attributes: Nobles need plenty of appeal as well as clever minds, although at the end of the day, money always talks whatever the circumstances.</p><p>Adventuring: Nobles are not notable adventurers, although they will often finance expeditions to remote areas to obtain artefacts or to carry out trade. Some more adventurous nobles will join expeditions to oversee them.</p><p>Fighting: In combat, having a career of noble will rarely be of any benefit whatsoever. However, some peasants or lower classes will have qualms about attacking their superiors. Also, nobles often lead armies (whether capable or not).</p><p>Suggested Boons: Attractive, Born-in-the-Saddle, Friends in High Places, Great Wealth, High-Born, Inspire.</p><p>Suggested Flaws: Arrogant, Braggart, City Dweller, Cravings, Greed, Hot-Headed, Lustful.</p>"
|
||||||
|
},
|
||||||
|
"Ouvrier (docker, manœuvre)": {
|
||||||
|
"name": "Worker (Docker, Labourer)",
|
||||||
|
"description": "<h1>Worker (Docker, Labourer)</h1><p>Workers are unskilled labourers – men who erect palisades, dig ditches, build homes, city walls and temples, or load and unload wagons and riverboats. Workers often move around doing a range of odd jobs here and there, many of which are seasonal or temporary. Workers will be skilled in heavy lifting, intimidation, carousing, and hard labour. Some of the tasks carried out by workers are also the work of slaves.</p><p>Attributes: Workers tend to find a high strength very useful in their physical endeavours.</p><p>Adventuring: Labour is dull and doesn’t really lead to a life of adventure. Therefore, a character with Worker as one of his careers is unlikely to have stuck it out for very long.</p><p>Fighting: Workers are not really fighters, although they do tend to settle their disputes with their fists. They might be given a bonus during a brawl, especially when grappling or choking someone.</p><p>Suggested Boons: Carouser, Brawler, Giant Strength, Hard-to-Kill, Strength Feat, Fearsome Looks, Poison Resistance, Tools of the Trade.</p><p>Suggested Flaws: Can’t Lie, Drunkard, Fear of …, Hot-Headed, Illiterate, Lumbering, Lustful, Poor Hearing, Taciturn, Unsettling.</p>"
|
||||||
|
},
|
||||||
|
"Pilote des airs": {
|
||||||
|
"name": "Sky-Pilot",
|
||||||
|
"description": "<h1>Sky-Pilot</h1><p>Sky-pilots are the elite of the fighting men of Satarla and are trained to fly the sky-boats of the Satarlan Sky-Navy. They are held in awe by those shackled by gravity. Along with their knowledge of piloting and general sky-boat maintenance, sky-pilots are also skilled navigators and highly observant, so they are much sought after as scouts, couriers and explorers. They are usually ex-soldiers, and most are nobles too.</p><p>Attributes: Mind, agility – and to a lesser extent appeal and strength – are all handy to an elite sky- pilot.</p><p>Adventuring: A sky-pilot is naturally a daring soul, so anyone coming from this career will still have a yearning for a life of adventure.</p><p>Fighting: Sky-pilots in combat will always have the advantage over any fighter unused to combat taking place in the skies.</p><p>Suggested Boons: Born Athlete, Friends in High Places, Great Wealth, Keen Eyesight, High-Born, Inspire, Marked by the Gods, Trademark Weapon.</p><p>Suggested Flaws: Arrogant, Braggart, City Dweller, Hot-Headed.</p>"
|
||||||
|
},
|
||||||
|
"Prêtre (druide/chaman)": {
|
||||||
|
"name": "Priest (Druid, Shaman)",
|
||||||
|
"description": "<h1>Priest (Druid, Shaman)</h1><p>Priests reside in their temples in the major cities of Lemuria – they lead worship of the gods. They also determine the will of the gods. Priests are knowledgeable in theology, ancient lore, astrology, astronomy, ancient languages, oratory, and must be literate. Their position gives them a special place in the minds of the rest of the populace, and this gives them great power over all aspects of the government, the military, and the populace in general.</p><p>Druids worship the Dark Lords and are less savoury – their form of worship includes human sacrifice. For more information on priests and druids, see Chapter 6.</pAttributes: Priests need to have clever minds, and the best ones have plenty of appeal to be able to sway or attract followers.</p><p>Adventuring: Some priests are highly adventurous – seeking out ancient knowledge and artefacts of their gods. Others prefer the easy life and rarely leave the safety of their temples.</p><p>Fighting: Having the priest career will rarely, if ever, give you any advantage in combat. The only plus might be that gods-fearing fighters will be loath to attack a priest.</p><p>Suggested Boons: Detect Deception, Friends in High Places, Inspire, Learned, Marked by the Gods, Nose for Magic, Resistance to Sorcery, Savant, Silver Tongue.</p><p>Suggested Flaws: Arrogant, Combat Paralysis, Cravings, Distrust of Sorcery, Morgazzon’s Curse, Non-Combatant, Obsession, Zealot.</p><p>Languages: Druids and priests need to learn Sorceric if they wish to use the powerful magics and alchemies of the ancient race of the Sorcerer- Kings. Learning this language is painfully difficult, and requires both spoken and written forms to be taken separately.</p>"
|
||||||
|
},
|
||||||
|
"Scribe (érudit/copiste)": {
|
||||||
|
"name": "Scribe (Librarian, Scholar)",
|
||||||
|
"description": "<h1>Scribe (Librarian, Scholar)</h1><p>Scribes are researchers and teachers, well- educated and knowledgeable on a wide variety of subjects – they are mathematicians, cartographers, astronomers, linguists, historians, and philosophers. Scribes are also skilled at debate as they discuss at length a variety of topics with other enlightened individuals. Scribes need to be clear of thought to do their laborious work of cataloguing volumes and copying texts. It goes without saying that they need to be literate.</p><p>Attributes: Mind is of primary importance to a scribe.</p><p>Adventuring: Scribes make poor adventurers, although to have some of the knowledge of a scribe would make such a character a useful addition to a party.</p><p>Fighting: Whilst scribes might have it that “the pen is mightier than the sword”, there are not actually many circumstances where having a career in scribe will have any discernible use in combat.</p><p>Suggested Boons: Excellent Library, Learned, Savant.</p><p>Suggested Flaws: Delicate, Can’t Lie, Combat Paralysis, Non-Combatant, City Dweller, Obsession.</p>"
|
||||||
|
},
|
||||||
|
"Soldat (garde/milicien)": {
|
||||||
|
"name": "Soldier (Guard, Militiaman)",
|
||||||
|
"description": "<h1>Soldier (Guard, Militiaman)</h1><p>Soldiers are the paid guards in a city or in the standing armies of rich nobles. They are often stoic but of limited imagination. They will have some city lore, perhaps skills in intimidation and riding, as well as a limited amount of authority – especially the officers.</p><p>Attributes: Strength is normally most important for soldiers, although archers and cavalrymen could do with a bit of agility. Officers need to have plenty of appeal to lead their men, and quick minds to make sound battle plans.</p><p>Adventuring: Most soldiers are dull and uninspired. However, characters will use their time in the city guard to hone their weapon skills ready for their next adventure.</p><p>Fighting: Soldiers are not specialists of any sort but will sometimes gain a career bonus in combat, especially if fighting tactically as a part of a well- led unit.</p><p>Suggested Boons: Born Athlete, Born-in-the-Saddle, Brawler, Carouser, Hard-to-Kill, Inspire, Quick Recovery, Trademark Weapon.</p><p>Suggested Flaws: Braggart, Drunkard, Gullible, Lustful, Poor Hearing, Taciturn.</p>"
|
||||||
|
},
|
||||||
|
"Sorcier (magicien/enchanteur)": {
|
||||||
|
"name": "Magician (Sorcerer, Witch)",
|
||||||
|
"description": "<h1>Magician (Sorcerer, Witch)</h1><p>Magicians are both respected and feared. There are few who will deal with them willingly without great need, as a great many magicians are amoral at best, exceedingly evil at worst, and all of them are at least slightly unhinged. Magicians often live alone, with only a few servants or the occasional apprentice to attend them. Along with the knowledge of such esoteric lore as astrology, astronomy, and demonology, magicians research forbidden tomes of arcane knowledge, or make pacts with demons to learn Words of Power that can shape reality itself.</p><p>Magicians steeped in the Lore of the Void are mostly from Zalut, although there are minor magicians in just about every city of Lemuria (apart from Tyrus, where magicians are outlawed). For more information on magicians, see Chapter 6.</p><p>Attributes: Magicians need a powerful mind both for their studies and for the will to create and cast mighty spells.</p><p>Adventuring: Magicians aren’t usually great adventurers, preferring to leave that stuff to their hirelings and minions. However, sometimes they will venture out of their lairs to personally supervise or join an expedition, when they may gain something of great mystical significance at the end of it</p><p>Fighting: There are not many circumstances where being a magician helps in a fight using ordinary weapons. But then, the best magicians don’t need to use mundane weapons to kill someone.</p>Perilous Career: Sorcery is a fast track to power but it also brings its own price. For each rank taken as a magician beyond the first, take one extra flaw. This also applies if you advance in rank as a magician later on during the Saga</p><p>Suggested Flaws: Absent-Minded, Arrogant, Cravings, Delicate, Distinctive Appearance, Fear of..., Infamous, Morgazzon’s Curse, Non-Combatant, Obsession, Poor Recovery, Unsettling, Untrustworthy</p><p>Suggested Boons: Detect Deception, Excellent Library, Learned, Magic of the Sorcerer-Kings, Power of the Void, Resistance to Sorcery, Savant.</p><p>Languages: Magicians must know Sorceric if they wish to use the powerful magics and alchemies of the ancient race of the Sorcerer-Kings. Learning this language is painfully difficult – both spoken and written forms must be taken separately.</p>"
|
||||||
|
},
|
||||||
|
"Tentatrice (courtisane/serveuse)": {
|
||||||
|
"name": "Temptress (Courtesan, Serving wench)",
|
||||||
|
"description": "<h1>Temptress (Courtesan, Serving wench)</h1><p>There are some who have honed seduction down to an art form. The temptress may be a nobleman’s mistress, a courtesan, or even a common tavern wench, but she uses her power over men for her own ends. She is as dangerous as she is beautiful: the sort that men fight battles and wars over. A temptress is skilled in fashion sense, savoir-faire, conversation, manipulation, and seduction. Some are even good at taking things from customers without them noticing.</p><p>Note that although Barbarians of Lemuria is designed to evoke the themes and feel of the classic sword-and-sorcery stories, this particular career is also open to men (using the career name lothario).</p><p>Attributes: Appeal is the most important attribute for a temptress. Agility and mind can be useful too.</p><p>Adventuring: Temptresses are usually not very adventurous (outside of the bedroom, at least!), so you’d need other careers to help explain your life of peril.</p><p>Fighting: This career is seldom helpful in combat, though a temptress may be able to add her career to distract guards.</p><p>Suggested Boons: Attractive, Beguiling, Carouser, Deft Fingers, Friends in High Places, Friends in Low Places, Inspire, Sneaky, Silver Tongue.</p><p>Suggested Flaws: City Dweller, Delicate, Hot- Headed, Lustful, Non-Combatant, Unprepared.</p>"
|
||||||
|
},
|
||||||
|
"Voleur (filou/crapule)": {
|
||||||
|
"name": "Thief (Rogue, Scoundrel)",
|
||||||
|
"description": "<h1>Thief (Rogue, Scoundrel)</h1><p>Perhaps you fell into a life of crime, or began as a young street urchin. In either case, you have a certain unique set of skills that most find unsavoury. Thieves, scoundrels, and other ne’er- do-wells will have skill in such things as city lore, climbing, burglary, sneaking, picking pockets, skulduggery, and gambling, and may be part of some “guild” organisation. Malakut is known as the City of Thieves, as you will almost certainly be robbed at some time or another if you stay in the city for any length of time.</p><p>Attributes: Thieves require agility for their trade, but a quick mind also helps.</p><p>Adventuring: Good thieves are sought after by adventurers looking to break into temples and tombs where there are locks and traps guarding the treasures.</p><p>Fighting: Thieves usually need to avoid combat where possible, so will normally only gain a career bonus in combat when trying to get away – and not always then, if up against well-trained city guards.</p><p>Suggested Boons: Alert, Carouser, Deft Hands, Escape Artist, Friends in Low Places, Keen Hearing, Low-Born, Night Sight, Sneaky, Tools of the Trade (lock picks).</p><p>Suggested Flaws: City Dweller, Cowardly, Greed, Hunted, Infamous, Illiterate, Poor Recovery, Untrustworthy.</p>"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
25
compendiums/en/bol.effets-exemples.json
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
{
|
||||||
|
"label": "Effects - Examples",
|
||||||
|
"mapping": {
|
||||||
|
"description": "system.description"
|
||||||
|
},
|
||||||
|
|
||||||
|
"entries": {
|
||||||
|
"Agilité -1": {
|
||||||
|
"name": "Agility -1",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
"Aura -1": {
|
||||||
|
"name": "Appeal -1",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
"Esprit -1": {
|
||||||
|
"name": "Miond -1",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
"Vigueur -1": {
|
||||||
|
"name": "Strenght -1",
|
||||||
|
"description": ""
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
181
compendiums/en/bol.equipment.json
Normal file
@ -0,0 +1,181 @@
|
|||||||
|
{
|
||||||
|
"label": "Equipment",
|
||||||
|
"mapping": {
|
||||||
|
"description": "system.description"
|
||||||
|
},
|
||||||
|
|
||||||
|
"entries": {
|
||||||
|
"Aumonière": {
|
||||||
|
"name": "Purse",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
"Bague": {
|
||||||
|
"name": "",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
"Bottes": {
|
||||||
|
"name": "Boots",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
"Bougie": {
|
||||||
|
"name": "Candle",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
"Bourse": {
|
||||||
|
"name": "Pouch",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
"Cape de Marchand": {
|
||||||
|
"name": "Merchant cape",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
"Capuchon": {
|
||||||
|
"name": "Hood",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
"Carquois": {
|
||||||
|
"name": "Holster",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
"Ceinture": {
|
||||||
|
"name": "Belt",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
"Chapeau": {
|
||||||
|
"name": "Hat",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
"Chope": {
|
||||||
|
"name": "Mug",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
"Collier": {
|
||||||
|
"name": "Necklace",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
"Corde + Grappin": {
|
||||||
|
"name": "Rope + Grapple",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
"Cuir Brut": {
|
||||||
|
"name": "Leather",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
"Dés à Jouer": {
|
||||||
|
"name": "Die",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
"Fourrure Brute": {
|
||||||
|
"name": "Fur",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
"Gants": {
|
||||||
|
"name": "Gloves",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
"Gourde": {
|
||||||
|
"name": "Gourd",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
"Instrument de Musique": {
|
||||||
|
"name": "Music Instrument",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
"Lanterne + Huile + Silex": {
|
||||||
|
"name": "Lantern + Oil + Flint",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
"Lingot d'Acier": {
|
||||||
|
"name": "Steel Ingot",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
"Lingot D'Or": {
|
||||||
|
"name": "Gold Ingot",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
"Livre": {
|
||||||
|
"name": "Book",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
"Manteau": {
|
||||||
|
"name": "Mantel",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
"Materiel de Pêche": {
|
||||||
|
"name": "Fishing tool",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
"Mortier": {
|
||||||
|
"name": "Mortar",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
"Nécessaire d'Alchimie": {
|
||||||
|
"name": "Alchemy Kit",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
"Nécessaire D'Ecriture": {
|
||||||
|
"name": "Writing Kit",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
"Nécessaire de Forge": {
|
||||||
|
"name": "Forge Kit",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
"Nécessaire de Survie": {
|
||||||
|
"name": "Survival Kit",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
"Outils de Crochetage": {
|
||||||
|
"name": "Lock Picking Tools",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
"Outils de Menuiserie": {
|
||||||
|
"name": "Carpentry Tools",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
"Outre": {
|
||||||
|
"name": "Wineskin",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
"Pantalon": {
|
||||||
|
"name": "Trouser",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
"Parchemins": {
|
||||||
|
"name": "Scrolls",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
"Petit Chaudron": {
|
||||||
|
"name": "Small Caldron",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
"Petit Coffre": {
|
||||||
|
"name": "Small chest",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
"Piege": {
|
||||||
|
"name": "Trap",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
"Pierre Precieuse": {
|
||||||
|
"name": "Gem",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
"Ration de Voyage": {
|
||||||
|
"name": "Travel food",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
"Sac": {
|
||||||
|
"name": "Bag",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
"Sac a Dos": {
|
||||||
|
"name": "Backpack",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
"Torche": {
|
||||||
|
"name": "Torch",
|
||||||
|
"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": "Flaws",
|
||||||
|
"mapping": {
|
||||||
|
"description": "system.description"
|
||||||
|
},
|
||||||
|
|
||||||
|
"entries": {
|
||||||
|
"Addiction": {
|
||||||
|
"name": "Cravings",
|
||||||
|
"description": "<h1>Cravings</h1><p>You are addicted to something and require it every day to function fully. Whenever you go more than a day without it, you have a penalty die on all rolls.</p>"
|
||||||
|
},
|
||||||
|
"Âgé": {
|
||||||
|
"name": "Elderly",
|
||||||
|
"description": "<h1>Elderly</h1><p>Your character is not as young as he used to be. If he has not had a decent amount of rest each day, he will begin to slow and tire. Use an extra penalty die for any physical action if pushed too hard without rest. Other opportunities for good role-play will undoubtedly come out of this flaw.</p>"
|
||||||
|
},
|
||||||
|
"Arrogant": {
|
||||||
|
"name": "Arrogant",
|
||||||
|
"description": "<h1>Arrogant</h1><p>Roll a penalty die when dealing with provincials or foreigners, where your arrogance might annoy or offend them. This flaw is especially common amongst the nobility.</p>"
|
||||||
|
},
|
||||||
|
"Bigleux": {
|
||||||
|
"name": "Poor Eyesight",
|
||||||
|
"description": "<h1>Poor Eyesight</h1><p>You take a penalty die when trying to observe or spot something.</p>"
|
||||||
|
},
|
||||||
|
"Borgne/oreille coupée": {
|
||||||
|
"name": "Missing Eye/Hear",
|
||||||
|
"description": "<h1>Missing Eye/Hear</h1><p>You take a penalty die whenever the GM feels it is appropriate to the situation..</p>"
|
||||||
|
},
|
||||||
|
"Bouseux": {
|
||||||
|
"name": "Country Bumpkin",
|
||||||
|
"description": "<h1>Country Bumpkin</h1><p>The big city is a confusing and heartless place for the new arrival. You take a penalty die in situations to do with urban survival.</p>"
|
||||||
|
},
|
||||||
|
"Chétif": {
|
||||||
|
"name": "Delicate",
|
||||||
|
"description": "<h1>Delicate</h1><p>You have a small or slender build. Deduct two from your lifeblood total.</p>"
|
||||||
|
},
|
||||||
|
"Crédule": {
|
||||||
|
"name": "Gullible",
|
||||||
|
"description": "<h1>Gullible</h1><p>You believe the most outrageous lies. Roll a penalty die when being persuaded something is a good idea when it isn’t.</p>"
|
||||||
|
},
|
||||||
|
"Cupide": {
|
||||||
|
"name": "Greed",
|
||||||
|
"description": "<h1>Greed</h1><p>You cannot resist any chance to make money. If money is to be made, your judgement goes out of the window. You take a penalty die whenever tempted by the offer of cash.</p>"
|
||||||
|
},
|
||||||
|
"Deux mains gauches": {
|
||||||
|
"name": "All Thumbs",
|
||||||
|
"description": "<h1>All Thumbs</h1><p>You take a penalty die when picking locks, firing a bow or crossbow, or when doing fine work.</p>"
|
||||||
|
},
|
||||||
|
"Distrait": {
|
||||||
|
"name": "Absent-Minded",
|
||||||
|
"description": "<h1>Absent-Minded</h1><p>vWhile you are not necessarily stupid – indeed, you may be brilliant – you have difficulty keeping track of appointments, people’s names, items on lists, and various other memory-based tasks. This means that sometimes the GM will spring things on you that your character forgot.</p>"
|
||||||
|
},
|
||||||
|
"Dur d’oreille": {
|
||||||
|
"name": "Poor Hearing",
|
||||||
|
"description": "<h1>Poor Hearing</h1><p>Whenever you make a check to perceive something using your hearing, you take a penalty die.</p>"
|
||||||
|
},
|
||||||
|
"Fanatique": {
|
||||||
|
"name": "Zealot",
|
||||||
|
"description": "<h1>Zealot</h1><p>This is a flaw far more common amongst villains than Heroes. There are many willing to die for their faith, but a zealot would kill for it. You get a penalty die whenever you must be civil to a non-believer.</p>"
|
||||||
|
},
|
||||||
|
"Fanfaron": {
|
||||||
|
"name": "Braggart",
|
||||||
|
"description": "<h1>Braggart</h1><p>You have a very high opinion of yourself and feel the need to share it with the world. You often take credit for things that you never did, and make those accomplishments you did achieve seem so much grander with each retelling, often disregarding the role anyone else played in the story. Needless to say, you often play fast and loose with the truth with these boasts, which could lead to you being called a liar.</p>"
|
||||||
|
},
|
||||||
|
"Foie jaune": {
|
||||||
|
"name": "Combat Paralysis",
|
||||||
|
"description": "<h1>Combat Paralysis</h1>\n<p>When swords are drawn, you tend to freeze up and act with uncertainty. Roll a d3. This is the number of rounds that you freeze, during which you can only take defensive actions.</p>"
|
||||||
|
},
|
||||||
|
"Gars de la ville": {
|
||||||
|
"name": "City Dweller",
|
||||||
|
"description": "<h1>City Dweller</h1><p>You aren’t happy in the great outdoors. You take a penalty die in situations to do with wilderness survival.</p>"
|
||||||
|
},
|
||||||
|
"Illettré": {
|
||||||
|
"name": "Illiterate",
|
||||||
|
"description": "<h1>Illiterate</h1><p>You cannot read or write, and you cannot choose a career with literacy as a requirement.</p>"
|
||||||
|
},
|
||||||
|
"Impétueux": {
|
||||||
|
"name": "Hot-Headed",
|
||||||
|
"description": "<h1>Hot-Headed</h1><p>Your anger often gets the better of you, and you are likely to fly off the handle at the slightest insult or imagined insult. You get a penalty die to any rolls when trying to suppress your anger and act rationally, such as not making a scene at a royal ball when insulted, or trying to ignore an enemy’s taunt. Your anger can also get you into duels, or worse.</p>"
|
||||||
|
},
|
||||||
|
"Inadapté à la chaleur": {
|
||||||
|
"name": "Feels the Heat",
|
||||||
|
"description": "<h1>Feels the Heat</h1><p>You are especially susceptible to heat. You take a penalty die for any tasks that you undertake in a hot or desert environment.</p>"
|
||||||
|
},
|
||||||
|
"Inadapté au froid": {
|
||||||
|
"name": "Feels the Cold",
|
||||||
|
"description": "<h1>Feels the Cold</h1><p>You are especially susceptible to the cold. You take a penalty die for any tasks undertaken in a cold environment.</p>"
|
||||||
|
},
|
||||||
|
"Incapable de mentir": {
|
||||||
|
"name": "Can’t Lie",
|
||||||
|
"description": "<h1>Can’t Lie</h1><p>Whether it is simple nervousness or a strong code of honour, you are terrible at lying. You get a penalty die whenever you try to deceive, tell half-truths, or conceal something that you know when you are asked about it directly. You’d much rather say, “I’m not going to tell you,” than “I don’t know what you are talking about.</p>"
|
||||||
|
},
|
||||||
|
"Indigne de confiance": {
|
||||||
|
"name": "Untrustworthy",
|
||||||
|
"description": "<h1>Untrustworthy</h1><p>You take a penalty die when the situation calls for someone to believe or trust you.</p>"
|
||||||
|
},
|
||||||
|
"Inquiétant": {
|
||||||
|
"name": "Unsettling",
|
||||||
|
"description": "<h1>Unsettling</h1><p>Something about you isn’t quite right – the way you look or smell or speak. Even animals shy away from you. Take a penalty die in social situations or when dealing with animals.</p>"
|
||||||
|
},
|
||||||
|
"Lent à la détente": {
|
||||||
|
"name": "Unprepared",
|
||||||
|
"description": "<h1>Unprepared</h1><p>You are not aware of what’s going on around you and are slow to react to danger. Add a penalty die for Priority Rolls.</p>"
|
||||||
|
},
|
||||||
|
"Lubrique": {
|
||||||
|
"name": "Lustful",
|
||||||
|
"description": "<h1>Lustful</h1><p>You find it hard to resist the charms of the opposite sex, and you get a penalty die to any rolls to avoid succumbing to a pretty or handsome face.</p>"
|
||||||
|
},
|
||||||
|
"Malédiction de Morgazzon": {
|
||||||
|
"name": "Morgazzon’s Curse",
|
||||||
|
"description": "<h1>Morgazzon’s Curse</h1><p>You are mad. Work with the GM to determine how this manifests itself.</p>"
|
||||||
|
},
|
||||||
|
"Manchot/unijambiste": {
|
||||||
|
"name": "Missing Limb",
|
||||||
|
"description": "<h1>Manchot/unijambiste</h1><p>You take a penalty die whenever the GM feels the situation is appropriate.</p>"
|
||||||
|
},
|
||||||
|
"Marin d’eau douce": {
|
||||||
|
"name": "Landlubber",
|
||||||
|
"description": "<h1>Landlubber</h1><p>You take a penalty die on activities whilst at sea..</p>"
|
||||||
|
},
|
||||||
|
"Maudit": {
|
||||||
|
"name": "Cursed",
|
||||||
|
"description": "<h1>Cursed</h1><p>The Gods have forsaken you or you are just plain unlucky. You begin with -1 Hero Point. For some reason, bad things always seem to happen to you. The town guard mistakes you for a wanted man, the wench you picked up in the tavern turns out to be a runaway princess, you step on a twig just as you nearly snuck away, etc.</p>"
|
||||||
|
},
|
||||||
|
"Mauvaise réputation": {
|
||||||
|
"name": "Infamous",
|
||||||
|
"description": "<h1>Infamous</h1><p>You are well known for some wicked deed in your past. Irrespective of whether the allegations are true or not, or whether you had a good reason to do what you did, this bad reputation precedes you wherever you go. You get a penalty die in social situations when making first impressions, and continue to receive the penalty until you earn a person’s trust.</p>"
|
||||||
|
},
|
||||||
|
"Méfiance envers la sorcellerie": {
|
||||||
|
"name": "Distrust of Sorcery",
|
||||||
|
"description": "<h1>Distrust of Sorcery</h1><p>When dealing with wizards and alchemists, you take a penalty die.</p>"
|
||||||
|
},
|
||||||
|
"Muet": {
|
||||||
|
"name": "Mute",
|
||||||
|
"description": "<h1>Mute</h1><p>You are unable to talk, so always roll a penalty die in social situations to make yourself understood.</p>"
|
||||||
|
},
|
||||||
|
"Non-combattant": {
|
||||||
|
"name": "Non-Combatant",
|
||||||
|
"description": "<h1>Non-Combatant</h1><p>You are not a warrior – your skills lie elsewhere. You have only two points to spend on combat abilities instead of four, but begin with six points for careers instead of four. In addition to this, it costs you twice as many advancement points to increase combat abilities.</p>"
|
||||||
|
},
|
||||||
|
"Obsession": {
|
||||||
|
"name": "Obsession",
|
||||||
|
"description": "<h1>Obsession</h1><p>There is something with which you are completely obsessed. It could be a fascination with a certain pursuit, person, or thing. You spend a great deal of time and money on this obsession. Whenever you are in the presence of the object of your obsession, you have a penalty die on all rolls that require you to ignore it. Sometimes your obsession can get you into a lot of trouble.</p>"
|
||||||
|
},
|
||||||
|
"Pataud": {
|
||||||
|
"name": "Lumbering",
|
||||||
|
"description": "<h1>Lumbering</h1><p>You are unsteady on your feet. You take a penalty die when balance is important – for example, crossing a narrow bridge or standing on a mountain ledge.</p>"
|
||||||
|
},
|
||||||
|
"Phobie": {
|
||||||
|
"name": "Fear of ...",
|
||||||
|
"description": "<h1>Fear of ...</h1><p>There is something that you have a great and irrational fear of. Roll a penalty die in the presence of (or when confronted by) your phobia. Some possible fears include: fear of fire, reptiles, spiders, heights, crowds, death, the dark, closed spaces, flying, etc</p>"
|
||||||
|
},
|
||||||
|
"Poltron": {
|
||||||
|
"name": "Cowardly",
|
||||||
|
"description": "<h1>Cowardly</h1><p>This is not a very common flaw for a Hero, but you have a great deal of difficulty resisting when the effects of fear take hold of you. Roll a penalty die to any rolls to resist the effects of fear or intimidation. In addition, you try to avoid any form of conflict, if at all possible.</p>"
|
||||||
|
},
|
||||||
|
"Repoussant": {
|
||||||
|
"name": "Ugly & Brutish",
|
||||||
|
"description": "<h1>Ugly & Brutish</h1><p>You are unattractive. Take a penalty die in situations where your looks are important.</p>"
|
||||||
|
},
|
||||||
|
"Signe distinctif": {
|
||||||
|
"name": "Distinctive Appearance",
|
||||||
|
"description": "<h1>Distinctive Appearance</h1><p>There is something about the way you look that sticks in men’s minds. Perhaps you have a very memorable scar or tattoo. Maybe you were born with six fingers on your left hand. Whatever it is, you have some superficial characteristic that causes you to stand out. You gain a penalty die whenever you try to disguise yourself or maintain a low profile. If you are also Hunted (see below), bounty hunters and spies are twice as likely to spot you on entering and leaving a city.</p>"
|
||||||
|
},
|
||||||
|
"Soiffard": {
|
||||||
|
"name": "Drunkard",
|
||||||
|
"description": "<h1>Drunkard</h1><p>qRoll a die when you are required to do something important for the rest of your companions. If a ’1’ comes up, you are drunk and unable to do anything until sobered up.</p>"
|
||||||
|
},
|
||||||
|
"Souffreteux": {
|
||||||
|
"name": "Poor Recovery",
|
||||||
|
"description": "<h1>Poor Recovery</h1><p>You have a poor constitution. You require medical attention to restore lost lifeblood, and recover nothing from normal rest.</p>"
|
||||||
|
},
|
||||||
|
"Taciturne": {
|
||||||
|
"name": "Taciturn",
|
||||||
|
"description": "<h1>Taciturn</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": "Hunted",
|
||||||
|
"description": "<h1>Hunted</h1><p>Your character is ridiculously tight- lipped. It’s a rare day on which he uses a sentence of more than three words, and it’s virtually unheard of for him to initiate conversation. His extreme reluctance to speak unfortunately means he never volunteers information without being asked. Take a penalty die in social situations.</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, Goddess of Life",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
"Charkond, Dieu de la Guerre et des Batailles": {
|
||||||
|
"name": "Charkond, God of War, Lord of Battle",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
"Chiomalla, Deesse des Grains et des Moissons": {
|
||||||
|
"name": "Chiomalla, Goddess of Crops, Lady of the Harvest",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
"Dyr, Dieu des Tempêtes et du Tonnerre": {
|
||||||
|
"name": "Dyr, God of Storms, the Thunder Lord",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
"Fillana, déesse des étoiles": {
|
||||||
|
"name": "Fillana, Goddess of the Stars",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
"Fyrzon la Sentinelle, l’Inébranlable": {
|
||||||
|
"name": "Fyrzon the Sentinel, the Steadfast",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
"Grondil, le dieu bâtisseur": {
|
||||||
|
"name": "Grondil the Builder God",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
"Hadron le Noir , seigneur du Néant": {
|
||||||
|
"name": "Hadron, Lord of the Void, the Dark One",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
"Hurm, le père des dieux, seigneur du ciel": {
|
||||||
|
"name": "Hurm, Father-God, God of the Sky",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
"Iondal le débauché": {
|
||||||
|
"name": "Iondal the Carouser",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
"Karyzon, le seigneur des vents": {
|
||||||
|
"name": "Karyzon the Wind Lord",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
"Knothakon, dieu de la sagesse, seigneur des âges": {
|
||||||
|
"name": "Knothakon, God of Wisdom, Lord of Aeons",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
"Lilandra la séductrice": {
|
||||||
|
"name": "Lilandra the Seductress",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
"Morgazzon, roi-démon de la folie": {
|
||||||
|
"name": "Morgazzon, The Demonlord of Madness",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
"Nemmereth du long sommeil, dieu de la mort": {
|
||||||
|
"name": "Nemmereth of the Long Sleep, The Death God",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
"Piandra, déesse de la chance, Dame Fortune": {
|
||||||
|
"name": "Piandra, The Goddess of Luck, Lady of Fortune",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
"Quathoomar, dieu du voyage": {
|
||||||
|
"name": "Quathoomar, Lord of Travel, The Pathfinder",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
"Sa’Tel, dieu des étoiles": {
|
||||||
|
"name": "Sa’Tel, The God of Stars",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
"Shazzadion, dieu des mers": {
|
||||||
|
"name": "Shazzadion the Sea Lord",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
"Tharungozoth le massacreur, seigneur des souffrances": {
|
||||||
|
"name": "Tharungozoth the Slaughterer, the Pain Lord",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
"Yrzlak le dieu forgeron": {
|
||||||
|
"name": "Yrzlak the Godsmith",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
"Zaggath, seigneur du Feu": {
|
||||||
|
"name": "Zaggath, Lord of Fire",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
"Zalkyr le Lumineux, dieu du soleil": {
|
||||||
|
"name": "Zalkyr the Bright, Lord of Light, Sun God",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
"Zylidith, seigneur du sang, dieu du sacrifice": {
|
||||||
|
"name": "Zylidith, Lord of Blood, God of the 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": "Sea Tongue",
|
||||||
|
"description": "<p>The Pirate Isles have a mixture of different people from all over the continent and beyond, and their languages have mixed and mingled to form a strange combination of the familiar and the unfamiliar. There is no written form.</p>"
|
||||||
|
},
|
||||||
|
"Axien": {
|
||||||
|
"name": "Axian",
|
||||||
|
"description": "<p>This (sometimes called Axish) is the language of the tribes of barbarians that live in the Axos mountain range. It is not at all well- known beyond the Axos Mountains, although there are believed to be some ancient texts written in times long gone – when Axian was spoken more widely – that have become lost in ancient caves hidden deep in those mountains.</p>"
|
||||||
|
},
|
||||||
|
"Beshaari": {
|
||||||
|
"name": "Beshaari",
|
||||||
|
"description": "<p>The desert nomads of Beshaar speak and write in their own language. Most of the people of Halakh speak Beshaari, although Lemurian is spoken in that city almost as much</p>"
|
||||||
|
},
|
||||||
|
"Céruléen": {
|
||||||
|
"name": "Giantish",
|
||||||
|
"description": "<p>The Blue Nomads speak their own language. It has no written form. Many of the merchants in Oomis learn Giantish as their second language.</p>"
|
||||||
|
},
|
||||||
|
"Chant du Vent": {
|
||||||
|
"name": "Windsong",
|
||||||
|
"description": "<p>The sing-song language of the Winged Folk. The language has the sound of breeze blowing through the crags of mountains, or high winds whistling around canyons and caverns. The language is very difficult for those other than Winged Folk to reproduce successfully. There is a written form, which is almost as difficult to translate.</p>"
|
||||||
|
},
|
||||||
|
"Démonique (Lire/Ecrire)": {
|
||||||
|
"name": "Sorceric (Read/write)",
|
||||||
|
"description": "<p>This is the ancient language of the Sorcerer-Kings. All their texts and manuals are written in this script. Magicians, alchemists, druids, and priests need to learn Sorceric if they wish to use the powerful magics and alchemies of this ancient race. Learning this language is painfully difficult, and requires both spoken and written forms to be taken separately. The Magicians of Zalut converse strictly in Sorceric, unless dealing with outsiders.</p>"
|
||||||
|
},
|
||||||
|
"Démonique (Parler)": {
|
||||||
|
"name": "Sorceric (Spoken)",
|
||||||
|
"description": "<p>This is the ancient language of the Sorcerer-Kings. All their texts and manuals are written in this script. Magicians, alchemists, druids, and priests need to learn Sorceric if they wish to use the powerful magics and alchemies of this ancient race. Learning this language is painfully difficult, and requires both spoken and written forms to be taken separately. The Magicians of Zalut converse strictly in Sorceric, unless dealing with outsiders.</p>"
|
||||||
|
},
|
||||||
|
"Festreli": {
|
||||||
|
"name": "Festrelish",
|
||||||
|
"description": "<p>Although with a basis in Lemurian, Festrelish is now so different to be almost unintelligible to a Lemurian speaker.</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>This is not really a fully developed language – more a collection of grunts as well as considerable displays of foot stamping, facial contortions and ape-like waving of arms. There is no written form. It is uncommon outside of the tribes of the Grooth.</p>"
|
||||||
|
},
|
||||||
|
"Kashtien": {
|
||||||
|
"name": "Kashtian",
|
||||||
|
"description": "<p>The inhabitants of the Kasht Swamp have their own language – each tribe speaking a variant of the basic language.</p>"
|
||||||
|
},
|
||||||
|
"Lemurien": {
|
||||||
|
"name": "Lemurian",
|
||||||
|
"description": "<p>Most people in Lemuria speak Lemurian. However, every city speaks a different dialect of Lemurian and that sometimes means the traveller can have difficulty understanding the locals. Sometimes you might be required to make a mind Task Roll to understand people from other cities.</p>"
|
||||||
|
},
|
||||||
|
"Malakutien": {
|
||||||
|
"name": "Malakutian",
|
||||||
|
"description": "<p>The people of Malakut and the surrounding area have their own language.</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>Shamballah has its own tongue, spoken in the city of Shamballah and surrounding areas.</p>"
|
||||||
|
},
|
||||||
|
"Valgardien": {
|
||||||
|
"name": "Valgardish",
|
||||||
|
"description": "<p>The people of Valgard speak and write in their own surprisingly elaborate language.</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": "Ygddari",
|
||||||
|
"description": "<p>The ancient language of man is called Ygddari (or Old Tongue). Not many speak it and even fewer can read it. However, old texts are occasionally recovered from the ruins of Ygddar, Qiddesh, Qeb, Qar, and Oosal, and some skilled scribes are needed to translate their writings.</p>"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
177
compendiums/en/bol.objets-alchimie.json
Normal file
@ -0,0 +1,177 @@
|
|||||||
|
{
|
||||||
|
"label": "Alchemy - Objects",
|
||||||
|
"mapping": {
|
||||||
|
"description": "system.description"
|
||||||
|
},
|
||||||
|
|
||||||
|
"entries": {
|
||||||
|
"Allume-feu": {
|
||||||
|
"name": "Fire self-starter",
|
||||||
|
"description": "<p>lights campfires easily</p>"
|
||||||
|
},
|
||||||
|
"Antirouille": {
|
||||||
|
"name": "Rust reversal",
|
||||||
|
"description": "<p>enough to clean the rust off a suit of armour</p>"
|
||||||
|
},
|
||||||
|
"Arbalète à Grappin": {
|
||||||
|
"name": "Grappler crossbow",
|
||||||
|
"description": "<p>fires a silk rope and grappling hook with 25’ range increment</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": "Weapons secreted in common items",
|
||||||
|
"description": "<p></p>"
|
||||||
|
},
|
||||||
|
"Arme Légendaire": {
|
||||||
|
"name": "Legendary weapon",
|
||||||
|
"description": "<p>roll a bonus die when rolling for damage – in addition, they are unbreakable and ignore armour, except that created by an alchemist. The weapon must be given a name</p>"
|
||||||
|
},
|
||||||
|
"Arme Mythique": {
|
||||||
|
"name": "Mythic weapon",
|
||||||
|
"description": "<p>as Legendary weapon, plus they are treated as a Trademark Weapon [see Boons]. The weapon must be given a name</p>"
|
||||||
|
},
|
||||||
|
"Arme Supérieure": {
|
||||||
|
"name": "Harder weapons",
|
||||||
|
"description": "<p>roll a bonus die when rolling for damage.</p>"
|
||||||
|
},
|
||||||
|
"Armure": {
|
||||||
|
"name": "Masterwork armour",
|
||||||
|
"description": "<p>Masterwork weapons and armour reroll any result of 1 when rolling damage or protection (only one reroll allowed).</p>"
|
||||||
|
},
|
||||||
|
"Armure Légendaire": {
|
||||||
|
"name": "Legendary armour",
|
||||||
|
"description": "<p>provides one grade better protection [or d6 for heavy armour] – in addition, you roll a bonus die – so roll two dice and drop the lowest one. For example, light armour becomes medium armour with a bonus: d6H-2, so you roll 2d6 and take the highest result, and then subtract 2. This armour also halves the additional damage caused by Mighty and Legendary successes, where Bloody Slash/Crushing Blow is selected.</p>"
|
||||||
|
},
|
||||||
|
"Armure Mythique": {
|
||||||
|
"name": "Mythic armour",
|
||||||
|
"description": "<p>As Legendary armour, with no agility penalties at all for wearing it – so you can even swim while wearing the armour</p>"
|
||||||
|
},
|
||||||
|
"Armure Supérieure": {
|
||||||
|
"name": "Lighter armour",
|
||||||
|
"description": "<p>provides one grade better protection than the actual armour [or d6 for heavy armour] – so light armour would provide the same protection as medium armour – and also halves the additional damage caused by Mighty and Legendary successes, where Bloody Slash/Crushing Blow is selected</p>"
|
||||||
|
},
|
||||||
|
"Automate ou golem ayant la forme d’une armure animée": {
|
||||||
|
"name": "Automatons and guardians from living suits of armour",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
"Casque permettant à son porteur de respirer sous l’eau": {
|
||||||
|
"name": "Water-breathing helmets",
|
||||||
|
"description": "allow the wearer to breathe under water"
|
||||||
|
},
|
||||||
|
"Ceinture d’allanium": {
|
||||||
|
"name": "Lighter-than-air belts",
|
||||||
|
"description": "<p>made of allanium, allows the wearer to float up and down</p>"
|
||||||
|
},
|
||||||
|
"Ceinture d’invisibilité": {
|
||||||
|
"name": "Invisibility belts",
|
||||||
|
"description": "<p>provides the effect of Invisibility Powder, in a belt</p>"
|
||||||
|
},
|
||||||
|
"Création de formes de vie en laboratoire": {
|
||||||
|
"name": "Creating life from chemical vats",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
"Création de formes de vie hybrides d’homme et d’animal": {
|
||||||
|
"name": "Create man-beast hybrid life forms",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
"Création par croisement et hybridation de plantes ou d’animaux mortellement dangereux": {
|
||||||
|
"name": "Breeding plants and animals into deadly life forms",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
"Cuve de clonage des individus": {
|
||||||
|
"name": "Vats for cloning individuals",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
"Dague à lame creuse en verre": {
|
||||||
|
"name": "Hollow glass knife",
|
||||||
|
"description": "<p>filled with acid or poison</p>"
|
||||||
|
},
|
||||||
|
"Fabrication d’allanium et de janium": {
|
||||||
|
"name": "Distilled allanium and janium",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
"Habitation intelligente": {
|
||||||
|
"name": "Intelligent dwellings",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
"Horloge": {
|
||||||
|
"name": "Timepiece",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
"Huile Brulante": {
|
||||||
|
"name": "Burning oil",
|
||||||
|
"description": "<p>lights on contact and burns for d6 damage</p>"
|
||||||
|
},
|
||||||
|
"Instrument de musique au son parfait": {
|
||||||
|
"name": "Perfectly pitched musical instruments",
|
||||||
|
"description": "<p>Tools of the Trade</p>"
|
||||||
|
},
|
||||||
|
"Lance-éclair": {
|
||||||
|
"name": "Lightning-gun",
|
||||||
|
"description": "<p>vaguely arbalest-like devices causing d6 ×2 damage, ignoring armour, with a base range of 250</p>"
|
||||||
|
},
|
||||||
|
"Machine de guerre blindée": {
|
||||||
|
"name": "Armoured war machines",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
"Machine dotée d'une semi-conscience": {
|
||||||
|
"name": "Semi-sentient machines",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
"Machine Volante": {
|
||||||
|
"name": "Flying machines",
|
||||||
|
"description": "<p>see sky-boats</p>"
|
||||||
|
},
|
||||||
|
"Membre Artificiel": {
|
||||||
|
"name": "Artificial limbs",
|
||||||
|
"description": "<p>with few or no moving parts, but nicer than a hook or peg</p>"
|
||||||
|
},
|
||||||
|
"Microscope": {
|
||||||
|
"name": "Microscope",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
"Navire submersible": {
|
||||||
|
"name": "Submersible boat",
|
||||||
|
"description": "<p>a submarine that can carry a crew of four, but no more than 20’ beneath the water’s surface. It is fitted with a floating hose that carries down air from the surface, but this can be noticed. Otherwise, it holds enough air to last four people one hour while submerged. It can move about 5 miles an hour by the people inside pedalling to turn the propeller.</p>"
|
||||||
|
},
|
||||||
|
"Outil": {
|
||||||
|
"name": "Masterwork tools",
|
||||||
|
"description": "<p>Masterwork weapons and armour reroll any result of 1 when rolling damage or protection (only one reroll allowed).</p>"
|
||||||
|
},
|
||||||
|
"Périscope": {
|
||||||
|
"name": "Periscope",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
"Piège": {
|
||||||
|
"name": "Traps",
|
||||||
|
"description": "<p>ordinary trap of -2 difficulty to find and disarm, and cause d3+1 damage when triggered.</p>"
|
||||||
|
},
|
||||||
|
"Serrure": {
|
||||||
|
"name": "Locks",
|
||||||
|
"description": "<p>malus de -2 pour la forcer</p>"
|
||||||
|
},
|
||||||
|
"Serrure ou piège à la complexité unique": {
|
||||||
|
"name": "Unique lock or trap",
|
||||||
|
"description": "<p>-8 Difficulty to get by these – traps cause d6 ×3 damage if triggered</p>"
|
||||||
|
},
|
||||||
|
"Serrure ou piège élaboré": {
|
||||||
|
"name": "Elaborate locks and traps",
|
||||||
|
"description": "<p>difficulty is -4 to get past them – traps cause d6+1 damage when triggered)</p>"
|
||||||
|
},
|
||||||
|
"Serrure ou piège particulièrement ingénieux": {
|
||||||
|
"name": "Ingenious locks or traps",
|
||||||
|
"description": "<p>-6 difficulty to get by them – traps cause d6 ×2 damage if triggered</p>"
|
||||||
|
},
|
||||||
|
"Substance chimique luminescente": {
|
||||||
|
"name": "Light-producing chemicals",
|
||||||
|
"description": "<p>produces light for up to half a day</p>"
|
||||||
|
},
|
||||||
|
"Télescope": {
|
||||||
|
"name": "Telescope",
|
||||||
|
"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": "Fire Coast",
|
||||||
|
"description": "<h1>Fire Coast</h1><p>The Fire Coast is home to the Witch Queen and her Kalukan Sentinels. If you are from the Fire Coast (and you may need to check with your GM first), you can choose to be a Kalukan. Refer to Chapter 5 for a Kalukan’s boons and flaws, as well as some sample names. If you choose to be human, use the details given for Halakh or the Kasht Swamp.</p>"
|
||||||
|
},
|
||||||
|
"Désert de Beshaar": {
|
||||||
|
"name": "Beshaar Desert",
|
||||||
|
"description": "<h1>Beshaar Desert</h1><p>The Beshaari are short, slim, nomadic people, who ride the desert runners – large flightless ostrich-like creatures. The Beshaari tend to have swarthy skins – becoming wrinkled and leathery as they age under the baking desert sun. Their eyes are black or dark brown, green, purple, and crimson. It is not uncommon for the Beshaari to have one eye of a different colour to the other.</p><p>The young women of the Beshaar are considered very exotic and beautiful – often finding themselves captured in raids and sold as slaves and dancers. Many a hot-blooded male has lost his life fighting over the affections of an enticing Beshaari maiden.</p><p>LThe Beshaari are noted for being hot-headed and quick to anger. They have some very specific and peculiar cultural customs, making any negotiations with the people of the Beshaar full of potential pitfalls.</p><p>All Beshaari characters will have barbarian as their first career. Their warriors like to use javelins in hunting and combat, which they throw from their mounts.</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>The Halakhi are a slim, swarthy, dark-skinned people with dark hair and eye colouring. They are close kin to the Beshaari and the city is where those desert nomads come to conduct most of their trade – there are many merchants here from all over Lemuria. The Halakhi are noted for their wavy-bladed long fighting knives, known as kir. If you want to hire an assassin, the best are from the Mountain City of Halakh.</p>"
|
||||||
|
},
|
||||||
|
"Îles du Crâne": {
|
||||||
|
"name": "Pirate Isles",
|
||||||
|
"description": "<h1>Pirate Isles</h1><p>OPeople originally from just about any city can be found on the Pirate Isles. They are a coarse, lewd, rough-and-ready bunch of misfits and sea dogs. Men far outweigh women here, and female characters are most likely to be serving wenches, although a few female pirates are known. Two things bring almost everyone here – the call of the sea and the promise of gold. At least one of your careers will be pirate if you are from here.</p>"
|
||||||
|
},
|
||||||
|
"Jungle de Qo et jungle de Qush": {
|
||||||
|
"name": "Qo and Qush Jungles",
|
||||||
|
"description": "<h1>Qo and Qush Jungles</h1><p>If you come from either of these jungle lands, you will most likely be a Grooth, but check with your GM first. There are a few tribes of barbarians and hunters on the fringes of the jungles – if you are one of these tribesmen, use the boons, flaws, and names of Shamballah .</p>"
|
||||||
|
},
|
||||||
|
"Lysor": {
|
||||||
|
"name": "Lysor",
|
||||||
|
"description": "<h1>Lysor</h1><p>Lysorians are a quiet and meditative people. Whilst the city around them bustles with foreigners full of energy and excitement, those born here seem calmer and more reflective. They appear unaffected by the chaos around them and rarely become embroiled in the frenzied activities of visitors and outsiders.</p><p>Lysorians are generally fair- or light-brown haired, and blue- or green-eyed, but other colourings are not too uncommon. Their skin has a healthy hue with a pale tan colouration. Although the opinionated inhabitants of Satarla might have something to say about this, Lysor boasts the best healers and physicians in Lemuria.</p>"
|
||||||
|
},
|
||||||
|
"Malakut": {
|
||||||
|
"name": "Malakut",
|
||||||
|
"description": "<h1>Malakut</h1><p>The people of this city tend to be slim-built with a slightly sinister air. Malakuti commonly have olive skins, dark brown or black hair, thin lips, narrow eyes and hooked noses. The Ragged Knaves and the Brotherhood of Shadows are two powerful but opposing thieves’ guilds in Malakut, both wielding massive power throughout the city and with interests in neighbouring cities. Malakut is known for its leaf-bladed fighting spears called khastoks, used by the Royal Jemadar Guard. Thief is a likely first career for a character from Malakut.</p>"
|
||||||
|
},
|
||||||
|
"Marais de Festrel": {
|
||||||
|
"name": "Festrel Swamp",
|
||||||
|
"description": "<h1>Festrel Swamp</h1><p>Few people dwell in the Festrel Swamp, for it is not the most hospitable place in Lemuria. Those that do dwell here tend to be secretive and hard to find if they don’t want to be found. They are short and stocky but surprisingly nimble. They are expert boaters and rafters.</p>"
|
||||||
|
},
|
||||||
|
"Marais de Kasht": {
|
||||||
|
"name": "Kasht Swamp",
|
||||||
|
"description": "<h1>Kasht Swamp</h1><p>The people of the Kasht Swamp tend to be light and willowy – they move silently and shadowlike through their homeland using paths set by generations of hunters, trappers, and fishers. Their hair is dark and their faces pale. They are skilled at using the materials around them for camouflage, and to disguise their scent from the swamp animals they hunt.</p>"
|
||||||
|
},
|
||||||
|
"Montagnes de l’Axos": {
|
||||||
|
"name": "Axos Mountains",
|
||||||
|
"description": "<h1>Axos Mountains</h1><p>In the lower reaches and foothills of the mountains live several fierce tribes of tall, rangy, fair-skinned barbarians. Skilled climbers, excellent hunters and herders, these people use the materials they have around them in their art, craft, hunting, and warfare. If you are from one of the Axos tribes, your first career will be barbarian. You are also likely to be a hunter. The tribes of the Axos range are noted for their use of the sling to bring down game. Living in the high peaks and crags of the Axos range are the Winged Folk.</p>"
|
||||||
|
},
|
||||||
|
"Oomis": {
|
||||||
|
"name": "Oomis",
|
||||||
|
"description": "<h1>Oomis</h1><p>Oomisians are generally tall, solidly built, and often have a blue tinge to their skins – there is speculation about just how deep their friendship with Blue Giants runs! Their eyes are usually various shades of blue. They often have very small, almost non-existent ears, and silvery-white hair. They are a people of very fine merchants, which is a likely first career for an Oomisian character.</p>"
|
||||||
|
},
|
||||||
|
"Parsool": {
|
||||||
|
"name": "Parsool",
|
||||||
|
"description": "<h1>Parsool</h1><p>The people of Parsool are a mixed bag of all types, shapes, and hair and skin colouring. The very best mariners are from Parsool, so it is likely that one of your character’s career choices will be sailor.</p>"
|
||||||
|
},
|
||||||
|
"Plaines de Klaar": {
|
||||||
|
"name": "Klaar",
|
||||||
|
"description": "<h1>Klaar</h1><p>The Klaar Plains are home to the Blue Giants, a race of blue-grey skinned nomadic giants, also known as Blue Nomads. Whilst they are fearsome- looking, Blue Giants are not especially aggressive – in fact, they actually make great traders. If you are a Blue Giant character, your first career must be barbarian and the second is likely to be merchant, because nearly all Blue Giant children are taught to trade at an early age. You cannot be an alchemist, physician, scribe or magician. Their priests are called shamans. Refer to Chapter 5 for Blue Giants’ boons and flaws, as well as some sample names.</p>"
|
||||||
|
},
|
||||||
|
"Satarla": {
|
||||||
|
"name": "Satarla",
|
||||||
|
"description": "<h1>Satarla</h1><p>Satarla – known as the Jewel of Lemuria – is a city of high culture and sophistication. The people tend to be taller than average, but as people come from everywhere to this city, there is a mix of all colours, sizes and types. Once here, though, people tend to adopt an air of superiority. Beggars are outlawed, so no character can begin with that career. Only Satarlans may take the career of sky-pilot. Satarlan knights are legendary.</p>"
|
||||||
|
},
|
||||||
|
"Shamballah": {
|
||||||
|
"name": "Shamballah",
|
||||||
|
"description": "<h1>Shamballah</h1><p>Shamballahns are generally a dark-skinned and dark-haired people with purple, mauve, scarlet, and indigo eye colouring. They are very perceptive and make good hunters.</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>A bustling river city – the people of Tyrus tend towards dark complexions and hair, with green and brown eyes. Tyrus soldiers are noted for their skill at archery, and their craftsmen produce superb longbows. Sorcerers are outlawed in Tyrus.</p>"
|
||||||
|
},
|
||||||
|
"Urceb": {
|
||||||
|
"name": "Urceb",
|
||||||
|
"description": "<h1>Urceb</h1><p>Urceb’s inhabitants are risk-takers, gamblers, and opportunists. Many have ventured into Urceb’s undercity and are at home in dark underground areas – tunnels, catacombs, and caverns.</p>"
|
||||||
|
},
|
||||||
|
"Valgard": {
|
||||||
|
"name": "Valgard",
|
||||||
|
"description": "<h1>Valgard</h1><p>Valgardians are a tall, muscular, red- or fair- haired race of warlike tribesmen. If you come from Valgard, one of your careers is barbarian. You are unlikely to be a magician or alchemist, but they are not unknown in Valgard.</p>"
|
||||||
|
},
|
||||||
|
"Zalut": {
|
||||||
|
"name": "Zalut",
|
||||||
|
"description": "<h1>Zalut</h1><p>Also known as the City of Magicians, Zalut is ruled by magicians, priests, and alchemists. Zaluti are usually bald, and have very pale skins – albinos are not uncommon. They are very insular. It is thought that they are the last remaining descendants of the Sorcerer-Kings.</p><p>Characters from Zalut are usually from one of the above three careers or they are slaves (other careers are possible, however).</p>"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
157
compendiums/en/bol.potions-alchimie.json
Normal file
@ -0,0 +1,157 @@
|
|||||||
|
{
|
||||||
|
"label": "Alchimie - Potions",
|
||||||
|
"mapping": {
|
||||||
|
"description": "system.description"
|
||||||
|
},
|
||||||
|
|
||||||
|
"entries": {
|
||||||
|
"Acide": {
|
||||||
|
"name": "Acids",
|
||||||
|
"description": "<p>1 small vial does d3 damage or burns through an inch of metal or wood</p>"
|
||||||
|
},
|
||||||
|
"Agrandissement ou Rapetissement": {
|
||||||
|
"name": "Growing or shrinking",
|
||||||
|
"description": "<p>for the scene</p>"
|
||||||
|
},
|
||||||
|
"Alcool de Qualité": {
|
||||||
|
"name": "Alcoholic Spirits",
|
||||||
|
"description": "<p>good quality, 3 bottles</p>"
|
||||||
|
},
|
||||||
|
"Altération permanente": {
|
||||||
|
"name": "Permanent Alteration",
|
||||||
|
"description": "<p>+1 to any attribute permanently, will only ever work once on any given individual</p>"
|
||||||
|
},
|
||||||
|
"Antalgique": {
|
||||||
|
"name": "Painkillers",
|
||||||
|
"description": "<p>lasts 2d6 hours, 3 doses</p>"
|
||||||
|
},
|
||||||
|
"Anti-Fièvre": {
|
||||||
|
"name": "Fever Relief",
|
||||||
|
"description": "<p>lasts 2d6 hours, 3 doses</p>"
|
||||||
|
},
|
||||||
|
"Antidote aux Poisons Alchimiques": {
|
||||||
|
"name": "Antidote to Alchemical Poisons",
|
||||||
|
"description": "<p>recovery in 1 hour, 3 doses</p>"
|
||||||
|
},
|
||||||
|
"Antidote contre les Venins Animaux et Poisons Végétaux": {
|
||||||
|
"name": "Antidotes to natural venoms and herbal toxins",
|
||||||
|
"description": "<p>recovery in 1 hour, 3 doses</p>"
|
||||||
|
},
|
||||||
|
"Antidote Universel": {
|
||||||
|
"name": "Universal Antidote",
|
||||||
|
"description": "<p>can cure any poison, instantly reversing its effects, 1 dose</p>"
|
||||||
|
},
|
||||||
|
"Beauté": {
|
||||||
|
"name": "Beauty",
|
||||||
|
"description": "<p>+1 appeal for the scene</p>"
|
||||||
|
},
|
||||||
|
"Encre Invisible": {
|
||||||
|
"name": "Invisible Ink",
|
||||||
|
"description": "<p>becomes visible when wet or warmed</p>"
|
||||||
|
},
|
||||||
|
"Feu Alchimique": {
|
||||||
|
"name": "Alchemist’s Fire",
|
||||||
|
"description": "<p>explodes in a 10’ radius doing d6 ×2 damage</p>"
|
||||||
|
},
|
||||||
|
"Héroïsme": {
|
||||||
|
"name": "Heroism",
|
||||||
|
"description": "<p>imbiber gets +1 to all combat abilities for one scene, 1 dose</p>"
|
||||||
|
},
|
||||||
|
"Illusion de la Jeunesse": {
|
||||||
|
"name": "Appearance of Youth",
|
||||||
|
"description": "<p>imbiber appears to be no more than 25 years old for a week, 1 dose</p>"
|
||||||
|
},
|
||||||
|
"Immortalité": {
|
||||||
|
"name": "Immortality",
|
||||||
|
"description": "<p>you aren’t ever going to die naturally, although you might age slowly, becoming more withered the longer you go on – only violence or accident can kill you.</p>"
|
||||||
|
},
|
||||||
|
"Métamorphose": {
|
||||||
|
"name": "Shape Change",
|
||||||
|
"description": "<p>imbiber changes to look like someone else for 1 hour. Requires some hair, fingernails, blood, etc. from that person to make it, 1 dose.</p>"
|
||||||
|
},
|
||||||
|
"Mort aux Rats": {
|
||||||
|
"name": "Animal Poison",
|
||||||
|
"description": "<p>kills small pests</p>"
|
||||||
|
},
|
||||||
|
"Neutralisant d’acide": {
|
||||||
|
"name": "Acid Neutraliser",
|
||||||
|
"description": "<p>instantly stops effects of equal amount of acid – makes 9 small vials</p>"
|
||||||
|
},
|
||||||
|
"Panacée": {
|
||||||
|
"name": "Plague Cure",
|
||||||
|
"description": "<p>imbiber is cured of any disease, 2 doses</p>"
|
||||||
|
},
|
||||||
|
"Paralysant": {
|
||||||
|
"name": "Paralysis",
|
||||||
|
"description": "<p>imbiber must roll strength vs. your alchemist rank or be completely paralysed for 24 hours, 1 dose</p>"
|
||||||
|
},
|
||||||
|
"Perspicacité": {
|
||||||
|
"name": "Clarity",
|
||||||
|
"description": "<p>+1 mind for the scene</p>"
|
||||||
|
},
|
||||||
|
"Philtre d’amour": {
|
||||||
|
"name": "Love",
|
||||||
|
"description": "<p>imbiber must roll mind vs. your alchemist rank or be in love till the next full moon, 1 dose</p>"
|
||||||
|
},
|
||||||
|
"Poudre d’invisibilité": {
|
||||||
|
"name": "Invisibility Powder",
|
||||||
|
"description": "<p>people seem not to notice the wearer unless he does something to draw attention to himself, lasts for one scene</p>"
|
||||||
|
},
|
||||||
|
"Poudre de Phénix": {
|
||||||
|
"name": "Phoenix Dust",
|
||||||
|
"description": "<p>powder that burns on contact for d6 ×3 damage, even underwater</p>"
|
||||||
|
},
|
||||||
|
"Précision": {
|
||||||
|
"name": "Precision",
|
||||||
|
"description": "<p>bonus die on Ranged Attack Rolls for the scene</p>"
|
||||||
|
},
|
||||||
|
"Prouesse": {
|
||||||
|
"name": "Prowess",
|
||||||
|
"description": "<p>bonus die on Melee Attack Rolls for the scene</p>"
|
||||||
|
},
|
||||||
|
"Puissance": {
|
||||||
|
"name": "Might",
|
||||||
|
"description": "<p>+1 strength for the scene</p>"
|
||||||
|
},
|
||||||
|
"Régénération Suprême": {
|
||||||
|
"name": "Perfect Regeneration",
|
||||||
|
"description": "<p>regrows a lost limb, eye, etc., effectively erasing the flaw associated with it</p>"
|
||||||
|
},
|
||||||
|
"Remède contre la Vérole": {
|
||||||
|
"name": "Pox Cure",
|
||||||
|
"description": "imbiber is cured of the pox"
|
||||||
|
},
|
||||||
|
"Remède contre le Scorbut": {
|
||||||
|
"name": "Scurvy Cure",
|
||||||
|
"description": "imbiber is cured of scurvy"
|
||||||
|
},
|
||||||
|
"Répulsifs à Insecte": {
|
||||||
|
"name": "Insect Repellent",
|
||||||
|
"description": "<p>lasts 4d6 hours, 3 doses</p>"
|
||||||
|
},
|
||||||
|
"Résistance": {
|
||||||
|
"name": "Resilience",
|
||||||
|
"description": "<p>imbiber’s skin counts as protection d6 armour for one scene, 1 dose</p>"
|
||||||
|
},
|
||||||
|
"Sens Accrus": {
|
||||||
|
"name": "Improved Senses",
|
||||||
|
"description": "<p>bonus die for Task Rolls for noticing things for the scene</p>"
|
||||||
|
},
|
||||||
|
"Sommeil Instantané": {
|
||||||
|
"name": "Instant Sleep",
|
||||||
|
"description": "<p>imbiber must roll strength vs. your alchemist rank or fall into a deep sleep for half a day</p>"
|
||||||
|
},
|
||||||
|
"Somnifere": {
|
||||||
|
"name": "Sleep Inducers",
|
||||||
|
"description": "<p>ingested, gives 2d6 hours sound sleep, 3 doses</p>"
|
||||||
|
},
|
||||||
|
"Teinture de respiration aquatique": {
|
||||||
|
"name": "Water-Breathing Tincture",
|
||||||
|
"description": "<p>allows imbiber to breathe underwater for half a day</p>"
|
||||||
|
},
|
||||||
|
"Vivacité": {
|
||||||
|
"name": "Quickness",
|
||||||
|
"description": "<p>+1 agility for the scene</p>"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
41
compendiums/en/bol.races.json
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
{
|
||||||
|
"label": "Races",
|
||||||
|
"mapping": {
|
||||||
|
"description": "system.description"
|
||||||
|
},
|
||||||
|
|
||||||
|
"entries": {
|
||||||
|
"Céruléens": {
|
||||||
|
"name": "Blue Giants",
|
||||||
|
"description": "<h1>Blue Giants</h1><p>Although called Blue Giants (or sometimes Blue Nomads), these people are actually mostly grey- skinned, but colour variations do occur from green-grey, through grey, to blue- and purple-grey. Males range from about 7½ to 8½ feet high, but there are known to be some over 9 feet tall. Females are, on average, a foot shorter and a little less stocky. Males and females tend to be hairless.</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>Blue Giants roam the Plains of Klaar in their mighty wagons, pulled by huge, slow-moving banths. They are a proud race that has little to do with men, except maybe to trade occasionally with trusted merchants at Urceb or Oomis. There are several major tribes and twenty or thirty smaller tribes. Each tribe has its own name, which forms the second name of the tribal members. The most famous tribes are the Hegga, Karvoona, Kazzorla, Chunth, Thazaar and Kozaar. They are led by a chieftain and, in addition, each tribe boasts its own spiritual leader and doctor, called a shaman historical journals certainly mention that blue- skinned giants were with the Sorcerer-Kings at the various battles around Ygddar and the other cities at the time of Lord Kylarth and then King Thangard. At the battle of Hyrdral Chasm, the Blue Giant, Chunak, led a revolt against their reptiloid masters and caused hundreds of them to fall to their deaths before they could bring the worst of their foul sorceries to bear. Without this turnaround, the Sorcerer-Kings would have won the day.</p><p>Blue Giants do not make good magicians or alchemists and cannot select these careers at all. Blue Giant priests are called shamans and they generally worship Quathoomar.</p>"
|
||||||
|
},
|
||||||
|
"Grooth": {
|
||||||
|
"name": "Grooth",
|
||||||
|
"description": "<h1>Grooth</h1><p>Grooth are primitive, man-eating beast men, living in small scruffy settlements of rude huts in the jungle-lands. The Grooth are just one or two steps above apehood. They have squat, powerful bodies, long powerful arms that dangle almost to the ground, and short bowed legs. Their faces are brute-like with little red eyes beneath immense bony ridges, and great jaws with up-thrusting lower teeth. The only signs of a culture any higher than the brutes they resemble are that they use clubs of hard wood and the wooden shafted spears tipped with pointed stones – these and a scrap of filthy animal hide bound about their loins.</p><p>If you want to play a Grooth, you can only initially select from these careers: savage (barbarian), beastmaster, slaver, gladiator, hunter, warrior, shaman (priest), slave, worker.</p><p>All Grooth automatically have the flaw: Illiterate.</p>"
|
||||||
|
},
|
||||||
|
"Hommes-oiseaux": {
|
||||||
|
"name": "Winged Folk",
|
||||||
|
"description": "<h1>Winged Folk</h1><p>These are a mysterious race that lives in hidden valleys high up in the Mountains of Axos. They are very secretive, rarely dealing with outsiders at all. The Winged Folk (both male and female) are slender, agile, and highly creative. Their homes are built in well-adapted caves and on rock ledges. Their wings are functional, allowing them to glide around the rocky cliff faces or even to fly for short distances if unencumbered. Their feet are bird-like claws, allowing them to cling to rock faces with ease. They are not great warriors, and use only darts – light missile weapons – with which to defend their homes or to hunt small game. Most armour is too cumbersome for flight, although a few of the stronger ones might – if danger threatens – don leather bracers, battle harnesses and greaves (light armour), or use a small shield.</p><p>If you play a Winged Folk, you can choose any career, although the following are very rare: assassin, executioner, gladiator, sailor, soldier, thief, worker, and vagabond, so create a good explanation for how your character’s career path includes any of these.</p>"
|
||||||
|
},
|
||||||
|
"Humain": {
|
||||||
|
"name": "Human",
|
||||||
|
"description": "<h1>Human</h1>\n<p> </p>"
|
||||||
|
},
|
||||||
|
"Kalukans": {
|
||||||
|
"name": "Kalukans",
|
||||||
|
"description": "<h1>Kalukans</h1><p>The Kalukan are a race of headless eunuchs with a large single eye set in the centre of their chests, behind which their brain is located. Bred in vats by ancient alchemies, these beings are incredibly strong, need no food, and never sleep. They were created to be able to protect their masters (from magicians in particular). Their bodies are covered in tattoos which have ancient sorceries embedded in them to help maintain the Kalukan’s unnatural life. They are entirely sexless, although their bodies are muscled and proportioned like men.</p><p>The Witch Queen of the Fire Coast uses the Kalukan (called the Kalukan Sentinels) to guard her fortress, and arms them with great tulwars. The Kalukan are unable to speak as they have no mouths, and so always roll a penalty die in social situations to make themselves understood. They also have no written language, which might lead some to believe they are stupid, but this is not the case. They are quick learners and can be taught to read and write.</p><p>All Kalukan are born slaves, so Kalukan Heroes automatically have slave as their first career and guard (soldier) or worker as their second. Most other career choices are open to them – strangely, perhaps because they were created by alchemy, some have an affinity for creating and making potions and devices when given the opportunity. Kalukan cannot be minstrels, merchants, or temptresses and some other careers are difficult for them.</p><p>All Kalukan automatically have the flaw: Mute.</p>"
|
||||||
|
},
|
||||||
|
"Morgal": {
|
||||||
|
"name": "Morgal",
|
||||||
|
"description": "<h1>Morgal</h1><p>The Morgal are a race of blood-drinking vampires who can live for many centuries (or possibly eternally). They start off human-like, albeit very tall and pale, but as they age they become more deranged and less than human. Their eyes range from red to violet to black. Their fingernails grow very quickly, so unless a Morgal constantly cuts them, they always end up resembling beast-like claws within a week. Some scribes believe the Morgal might be an offshoot of Sorcerer- Kings that were separated from the rest of their race at some point in the dim and distant past.</p>"
|
||||||
|
},
|
||||||
|
"Rois-Sorciers": {
|
||||||
|
"name": "Sorcerer-Kings",
|
||||||
|
"description": "<h1>Sorcerer-Kings</h1><p>These are the previous rulers of Lemuria – or even the entire world – before man came. The Sorcerer- Kings may have possessed enhanced strength and durability, but they were not especially skilled warriors. They were certainly very clever and creative, and had knowledge of the forces of sorcery. They could draw their power from Hadron and other unspecified Lords of the Void.</p><p>The Sorcerer-Kings were destroyed at Hyrdral Chasm, when the Blue Giant slave, Chunak, revolted and pushed one of their master’s sorcerous weapons into the chasm. A very small number of Sorcerer-Kings are believed to have escaped and fled to the island of Thule, where their descendants now live in Zalut, the City of Magicians</p>"
|
||||||
|
},
|
||||||
|
"Slorth": {
|
||||||
|
"name": "Slorth",
|
||||||
|
"description": "<h1>Slorth</h1><p>Slorth are almost certainly the creations of the Sorcerer-Kings. They are woman-headed serpents that dwell in the Beshaar Deserts and can also be found (though less commonly) on the Plains of Klaar. They are pale (almost colourless), putrid snakes but with the head of a beautiful, white-faced woman with needle-sharp teeth. Their bite is mildly toxic, sending their victims into a deep sleep.</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>"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
149
compendiums/en/bol.weapons.json
Normal file
@ -0,0 +1,149 @@
|
|||||||
|
{
|
||||||
|
"label": "Weapons",
|
||||||
|
"mapping": {
|
||||||
|
"description": "system.description"
|
||||||
|
},
|
||||||
|
|
||||||
|
"entries": {
|
||||||
|
"Arbalète": {
|
||||||
|
"name": "Crossbow",
|
||||||
|
"description": "<h1>Crossbow</h1><p>A crossbow is a simple device for firing a short bolt or quarrel with some force and little training. They take a round to load (ready to fire on the second round).</p>"
|
||||||
|
},
|
||||||
|
"Arbalète lourde": {
|
||||||
|
"name": "Arbalest",
|
||||||
|
"description": "<h1>Arbalest</h1><p>A much larger crossbow, the arbalest (sometimes called a heavy crossbow) is little used in Lemuria except as a mobile siege weapon.</p>"
|
||||||
|
},
|
||||||
|
"Arc": {
|
||||||
|
"name": "Bow",
|
||||||
|
"description": "<h1>Bow</h1><p>This represents a wide variety of weapons that fire arrows by drawing back and releasing a bowstring, strung between the two ends of a curving length of wood.</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": "Pole Arm",
|
||||||
|
"description": "<h1>Pole Arm</h1><p>This is a catch-all name for a pole weapon – that is, a close-combat weapon in which the main fighting part of the weapon is placed on the end of a long shaft, typically of wood, thereby extending the user’s effective range. They are used with two hands and can be called halberds, mauls, great-axes, battle-axes, glaives, war scythes, and many other names besides.</p>"
|
||||||
|
},
|
||||||
|
"Armes Improvisée": {
|
||||||
|
"name": "Armes Improvisée",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
"Armes Improvisée (Lancer)": {
|
||||||
|
"name": "Armes Improvisée (Lancer)",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
"Bâton": {
|
||||||
|
"name": "Quarterstaff",
|
||||||
|
"description": "<h1>Quarterstaff</h1><p>A quarterstaff is a simple stout pole of around 6’ in length, used as an aid to walking, and as an effective weapon.</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": "Dagger",
|
||||||
|
"description": "<h1>Dagger</h1><p>This covers all forms of short stabbing, thrusting or slashing weapons, either with one or two edges, that can be thrown with 10’ range increments or used in close quarters. Highly concealable, it is a favourite of rogues and assassins.</p>"
|
||||||
|
},
|
||||||
|
"Dague (Lancer)": {
|
||||||
|
"name": "Dagger (Throw)",
|
||||||
|
"description": "<h1>Dagger (Throw)</h1><p>This covers all forms of short stabbing, thrusting or slashing weapons, either with one or two edges, that can be thrown with 10’ range increments or used in close quarters. Highly concealable, it is a favourite of rogues and assassins..</p>"
|
||||||
|
},
|
||||||
|
"Épée": {
|
||||||
|
"name": "Sword",
|
||||||
|
"description": "<h1>Sword</h1><p>This weapon is a favourite amongst Heroes. This is the catch-all description for all manner of long-bladed, one-handed weapons used all over Lemuria, such as cutlasses, tulwars, scimitars, rapiers, broadswords and longswords. Call it what you want on your character sheet, because that will add flavour to your character, but at the end of the day a sword is a long blade used for killing.</p>"
|
||||||
|
},
|
||||||
|
"Épée à deux mains": {
|
||||||
|
"name": "Great Sword",
|
||||||
|
"description": "<h1>Great Sword</h1><p>These are larger two-handed swords, up to 6’ in length. They can be called claymores, bastard swords, tulwars, war blades and battle blades.</p>"
|
||||||
|
},
|
||||||
|
"Fléau": {
|
||||||
|
"name": "Flail",
|
||||||
|
"description": "<h1>Flail</h1><p>Flails are made with a shaft of wood, mounted by a length of chain with a spike-ball head. They are not too common in general use in Lemuria, but can sometimes be found in gladiatorial arenas. Flails ignore the defence addition gained from using a shield.</p>"
|
||||||
|
},
|
||||||
|
"Fléchettes": {
|
||||||
|
"name": "Dart",
|
||||||
|
"description": "<h1>Dart</h1><p>Darts are missile weapons, designed to be thrown such that a sharp (often weighted) point will strike first. They are larger than arrows and shorter than javelins, although like arrows they have flights. You would usually carry a number of these into battle.</p>"
|
||||||
|
},
|
||||||
|
"Fouet": {
|
||||||
|
"name": "Whip",
|
||||||
|
"description": "<p></p>"
|
||||||
|
},
|
||||||
|
"Fronde": {
|
||||||
|
"name": "Sling",
|
||||||
|
"description": "<h1>Sling</h1><p>The sling is inexpensive and easy to build. It is a simple leather thong whirled around the head to cast small stones or cast lead bullets with some force, at 30’ range increments. Two-handed versions are fitted onto a staff and are called staff-slings. This imparts a greater range, making the increments 60’. The Axish sling is actually little different to any other common sling; it’s just that the people of the Axos mountains are particularly proficient with them. They have however played up the idea that there is some special plant fibre that the thongs are made from that gives them their extra range.</p>"
|
||||||
|
},
|
||||||
|
"Gourdin": {
|
||||||
|
"name": "Cudgel",
|
||||||
|
"description": "<h1>Cudgel</h1><p>The simplest of all weapons, a cudgel is a crude weapon like a stout stick or truncheon of less than 3’ in length, a chair leg or even an unbroken bottle used to bludgeon your opponent. You can use a cudgel to cause non-lethal damage to knock out your opponent rather than kill him.</p>"
|
||||||
|
},
|
||||||
|
"Gourdin Clouté": {
|
||||||
|
"name": "Club",
|
||||||
|
"description": "<h1>Club<h1><p>This is a larger version of the cudgel. It is a stout length of wood, used in one hand to bludgeon and batter your opponent. Clubs usually have a wider or knobbed head and can be called war-clubs, knobkerries, or shillelaghs.</p>"
|
||||||
|
},
|
||||||
|
"Hache": {
|
||||||
|
"name": "Axe",
|
||||||
|
"description": "<h1>Axe</h1><p>These are usually made with bronze, iron, or steel heads on a wooden haft. They can be called war-axes, long-axes, or hand-axes. They are one- or two-bladed.</p>"
|
||||||
|
},
|
||||||
|
"Hache (Lancer)": {
|
||||||
|
"name": "Axe (Throw)",
|
||||||
|
"description": "<h1>Axe (Throw)</h1><p>These are usually made with bronze, iron, or steel heads on a wooden haft. They can be called war-axes, long-axes, or hand-axes. They are one- or two-bladed.</p>"
|
||||||
|
},
|
||||||
|
"Hâche à deux mains": {
|
||||||
|
"name": "Axe (2-hands)",
|
||||||
|
"description": "<h1>Axe (2-hands)</h1><p></p>"
|
||||||
|
},
|
||||||
|
"Javelot": {
|
||||||
|
"name": "Javelin",
|
||||||
|
"description": "<h1>Javelin</h1><p>This weapon represents a light throwing spear with a short pointed tip. Fighters who use these weapons would typically arm themselves with two or three such weapons. Winged Folk of Axos are fond of javelins.</p>"
|
||||||
|
},
|
||||||
|
"Khastok": {
|
||||||
|
"name": "Khastok",
|
||||||
|
"description": "<h1>Khastok</h1><p>The leaf-bladed fighting spear of the Jemadar Guard of Malakut. The Jemadar Guard prize their Khastok and will do anything rather than let it fall into enemy hands.</p>"
|
||||||
|
},
|
||||||
|
"Kriss": {
|
||||||
|
"name": "Kir",
|
||||||
|
"description": "<h1>Kir</h1><p>A wavy-bladed long fighting knife typical from Halakh, and rarely found elsewhere.</p>"
|
||||||
|
},
|
||||||
|
"Lance": {
|
||||||
|
"name": "Spear",
|
||||||
|
"description": "<h1>Spear</h1><p>A 6’ or longer length of wood with a pointed tip, designed for throwing at 20’ range increments, or for use in combat against mounted opponents in particular.</p>"
|
||||||
|
},
|
||||||
|
"Lance (Lancer)": {
|
||||||
|
"name": "Spear (Throw)",
|
||||||
|
"description": "<h1>Spear</h1><p>A 6’ or longer length of wood with a pointed tip, designed for throwing at 20’ range increments, or for use in combat against mounted opponents in particular.</p>"
|
||||||
|
},
|
||||||
|
"Mains Nues": {
|
||||||
|
"name": "Bare Hands",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
"Masse d’armes": {
|
||||||
|
"name": "Mace",
|
||||||
|
"description": "<h1>Mace</h1><p>cA mace is similar to a club, but with a metal head, often with spikes or flanges. One-handed maces can be thrown at increments of 5’ as they aren’t very effective used this way.</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": "Morning Star",
|
||||||
|
"description": "<h1>Morning Star</h1><p>A large lump of metal with spikes at all angles on the end of a 4’-5’ pole. It is basic but effective.</p>"
|
||||||
|
},
|
||||||
|
"Rapière": {
|
||||||
|
"name": "Foil",
|
||||||
|
"description": "<h1>Foil</h1><p>The foil is a small slim-bladed sword, primarily used by the fops and courtiers of the city-states of Lemuria, who have turned fencing into an art. They are often used with a parrying dagger, buckler/small shield, or rolled cloak in the off-hand.</p>"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
74
css/bol.css
@ -1,7 +1,6 @@
|
|||||||
/* ----------------------------------------- */
|
/* ----------------------------------------- */
|
||||||
/* LOCAL FONTS */
|
/* LOCAL FONTS */
|
||||||
/* ----------------------------------------- */
|
/* ----------------------------------------- */
|
||||||
@import "../node_modules/rpg-awesome/css/rpg-awesome.min.css";
|
|
||||||
@font-face {
|
@font-face {
|
||||||
font-family: 'Contrail One';
|
font-family: 'Contrail One';
|
||||||
font-style: normal;
|
font-style: normal;
|
||||||
@ -59,8 +58,6 @@ a:hover {
|
|||||||
top: -50px;
|
top: -50px;
|
||||||
left: calc(50% - 100px);
|
left: calc(50% - 100px);
|
||||||
opacity: 0.7;
|
opacity: 0.7;
|
||||||
-webkit-animation: rotation 10s infinite linear;
|
|
||||||
animation: rotation 10s infinite linear;
|
|
||||||
}
|
}
|
||||||
#pause h3 {
|
#pause h3 {
|
||||||
font-family: "IMFellDWPicaSC-Regular", serif;
|
font-family: "IMFellDWPicaSC-Regular", serif;
|
||||||
@ -389,16 +386,16 @@ ul.no-bullets {
|
|||||||
background-color: lightgray;
|
background-color: lightgray;
|
||||||
}
|
}
|
||||||
.bol h1.form-header {
|
.bol h1.form-header {
|
||||||
font-size: 2.5em;
|
font-size: 2.2em;
|
||||||
font-weight: 700;
|
font-weight: 700;
|
||||||
}
|
}
|
||||||
.bol h2.form-header {
|
.bol h2.form-header {
|
||||||
font-size: 2em;
|
font-size: 1.8em;
|
||||||
font-weight: 500;
|
font-weight: 500;
|
||||||
border-bottom: 1px groove #eeede0;
|
border-bottom: 1px groove #eeede0;
|
||||||
}
|
}
|
||||||
.bol h3.form-header {
|
.bol h3.form-header {
|
||||||
font-size: 1.5em;
|
font-size: 1.2em;
|
||||||
font-weight: 500;
|
font-weight: 500;
|
||||||
border-bottom: 1px groove #eeede0;
|
border-bottom: 1px groove #eeede0;
|
||||||
}
|
}
|
||||||
@ -444,12 +441,16 @@ ul.no-bullets {
|
|||||||
.bol .inc-dec-btns {
|
.bol .inc-dec-btns {
|
||||||
color: #4b4a44;
|
color: #4b4a44;
|
||||||
}
|
}
|
||||||
|
.summmary-number {
|
||||||
|
padding-left: 4rem;
|
||||||
|
}
|
||||||
/* Items List */
|
/* Items List */
|
||||||
.items-list {
|
.items-list {
|
||||||
list-style: none;
|
list-style: none;
|
||||||
margin: 7px 0;
|
margin: 7px 0;
|
||||||
padding: 0;
|
padding: 0;
|
||||||
overflow-y: auto;
|
overflow-y:hidden;
|
||||||
|
/*overflow-y: auto;*/
|
||||||
}
|
}
|
||||||
.items-list .item-header {
|
.items-list .item-header {
|
||||||
font-family: 'Signika', sans-serif;
|
font-family: 'Signika', sans-serif;
|
||||||
@ -520,6 +521,18 @@ ul.no-bullets {
|
|||||||
.items-list .item .item-control {
|
.items-list .item .item-control {
|
||||||
color: #4b4a44;
|
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 */
|
/* Premade colors */
|
||||||
@ -790,6 +803,18 @@ body.system-bol img#logo {
|
|||||||
max-width: calc(250px - 10px);
|
max-width: calc(250px - 10px);
|
||||||
margin-right: 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 {
|
.bol.sheet.actor .window-content form .main .sheet-body {
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
}
|
}
|
||||||
@ -924,6 +949,7 @@ body.system-bol img#logo {
|
|||||||
min-height: 400px;
|
min-height: 400px;
|
||||||
}
|
}
|
||||||
.bol.sheet.item h1 input.itemname {
|
.bol.sheet.item h1 input.itemname {
|
||||||
|
margin-top: 32px;
|
||||||
font-family: "Wolfsbane2Expanded", cursive;
|
font-family: "Wolfsbane2Expanded", cursive;
|
||||||
}
|
}
|
||||||
.bol.sheet.item .item-properties {
|
.bol.sheet.item .item-properties {
|
||||||
@ -1024,15 +1050,25 @@ body.system-bol img#logo {
|
|||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
position: absolute;
|
position: absolute;
|
||||||
top: 2.75rem;
|
top: 2.75rem;
|
||||||
right: 4rem;
|
right: 16rem;
|
||||||
}
|
}
|
||||||
.tokenhudext.right {
|
.tokenhudext.right {
|
||||||
justify-content: flex-start;
|
justify-content: flex-start;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
position: absolute;
|
position: absolute;
|
||||||
top: 2.75rem;
|
/*transform: translate(0, -30%);*/
|
||||||
|
top: -4rem;
|
||||||
|
max-width: 250px;
|
||||||
left: 4rem;
|
left: 4rem;
|
||||||
}
|
}
|
||||||
|
.tokenhudext.right2 {
|
||||||
|
justify-content: flex-start;
|
||||||
|
flex-direction: column;
|
||||||
|
/*transform: translate(0, -30%);*/
|
||||||
|
position: absolute;
|
||||||
|
top: -4rem;
|
||||||
|
left: 11rem;
|
||||||
|
}
|
||||||
.control-icon.tokenhudicon {
|
.control-icon.tokenhudicon {
|
||||||
width: fit-content;
|
width: fit-content;
|
||||||
height: fit-content;
|
height: fit-content;
|
||||||
@ -1049,5 +1085,23 @@ body.system-bol img#logo {
|
|||||||
z-index: 2;
|
z-index: 2;
|
||||||
}
|
}
|
||||||
.bol-hud-menu label {
|
.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;
|
||||||
}
|
}
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
[Dolphin]
|
[Dolphin]
|
||||||
Timestamp=2022,7,17,14,58,4.757
|
Timestamp=2024,11,2,20,30,2.2800000000000002
|
||||||
Version=4
|
Version=4
|
||||||
|
ViewMode=1
|
||||||
VisibleRoles=Details_text,Details_size,Details_modificationtime,Details_creationtime,CustomizedDetails
|
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.armorAgiMalus": "Rüschtung+Schild-Malus (Geschick)",
|
||||||
"BOL.ui.armorInitMalus": "Rüstungsmalus (Init)",
|
"BOL.ui.armorInitMalus": "Rüstungsmalus (Init)",
|
||||||
"BOL.ui.attackValue": "Angriffswert",
|
"BOL.ui.attackValue": "Angriffswert",
|
||||||
|
"BOL.ui.initMalus": "Init malus",
|
||||||
|
"BOL.ui.createEquipment": "Create Equipment",
|
||||||
|
|
||||||
"BOL.featureCategory.origins": "Herkünfte",
|
"BOL.featureCategory.origins": "Herkünfte",
|
||||||
"BOL.featureCategory.races": "Rassen",
|
"BOL.featureCategory.races": "Rassen",
|
||||||
@ -354,6 +356,16 @@
|
|||||||
"BOL.vehicleCategory.boat" : "Schiff",
|
"BOL.vehicleCategory.boat" : "Schiff",
|
||||||
"BOL.vehicleCategory.other" : "Anderes",
|
"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.PointBlank": "Direkt",
|
||||||
"BOL.range.Short": "Kurz",
|
"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.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.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.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)"
|
||||||
}
|
}
|
||||||
|
186
lang/en.json
@ -1,13 +1,22 @@
|
|||||||
{
|
{
|
||||||
"ACTOR.TypeCharacter": "Character",
|
"TYPES": {
|
||||||
"ACTOR.TypeEncounter": "Encounter",
|
"Actor": {
|
||||||
"ITEM.TypeItem": "Item",
|
"character": "PC",
|
||||||
"ITEM.TypeFeature": "Feature",
|
"encounter": "NPC",
|
||||||
"ITEM.TypeWeapon": "Weapon",
|
"npc": "NPC",
|
||||||
"ITEM.TypeArmor": "Armor",
|
"vehicle": "Vehicle",
|
||||||
|
"horde": "Horde"
|
||||||
|
},
|
||||||
|
"Item": {
|
||||||
|
"item": "Object",
|
||||||
|
"feature": "Trait",
|
||||||
|
"weapon": "Weapon",
|
||||||
|
"armure": "Armor"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
"BOL.attributes.vigor": "Vigor",
|
"BOL.attributes.vigor": "Strength",
|
||||||
"BOL.attributes.halfvigor" : "Half-Vigor",
|
"BOL.attributes.halfvigor" : "Half-Strength",
|
||||||
"BOL.attributes.agility": "Agility",
|
"BOL.attributes.agility": "Agility",
|
||||||
"BOL.attributes.mind": "Mind",
|
"BOL.attributes.mind": "Mind",
|
||||||
"BOL.attributes.appeal": "Appeal",
|
"BOL.attributes.appeal": "Appeal",
|
||||||
@ -16,12 +25,12 @@
|
|||||||
"BOL.aptitudes.ranged": "Ranged",
|
"BOL.aptitudes.ranged": "Ranged",
|
||||||
"BOL.aptitudes.def": "Defense",
|
"BOL.aptitudes.def": "Defense",
|
||||||
"BOL.aptitudes.prot": "Protection",
|
"BOL.aptitudes.prot": "Protection",
|
||||||
"BOL.resources.hp": "Vitality",
|
"BOL.resources.hp": "Lifeblood",
|
||||||
"BOL.resources.hero": "Hero",
|
"BOL.resources.hero": "Hero",
|
||||||
"BOL.resources.faith": "Faith",
|
"BOL.resources.faith": "Fate",
|
||||||
"BOL.resources.creation": "Creation",
|
"BOL.resources.creation": "Creation",
|
||||||
"BOL.resources.power": "Power",
|
"BOL.resources.power": "Arcane",
|
||||||
"BOL.resources.villainy": "Villany",
|
"BOL.resources.villainy": "Villain P.",
|
||||||
"BOL.resources.alchemypoints": "Alchemy Points",
|
"BOL.resources.alchemypoints": "Alchemy Points",
|
||||||
"BOL.traits.xp": "Experience",
|
"BOL.traits.xp": "Experience",
|
||||||
|
|
||||||
@ -33,7 +42,22 @@
|
|||||||
"BOL.ui.tab.description": "Description",
|
"BOL.ui.tab.description": "Description",
|
||||||
"BOL.ui.tab.details": "Details",
|
"BOL.ui.tab.details": "Details",
|
||||||
"BOL.ui.tab.spellalchemy": "Spells & Alchemy",
|
"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.properties": "Properties",
|
||||||
"BOL.ui.description": "Description",
|
"BOL.ui.description": "Description",
|
||||||
"BOL.ui.actions": "Actions",
|
"BOL.ui.actions": "Actions",
|
||||||
@ -115,6 +139,7 @@
|
|||||||
"BOL.ui.isSorcerer": "Is Sorcerer ?",
|
"BOL.ui.isSorcerer": "Is Sorcerer ?",
|
||||||
"BOL.ui.isAlchemist": "Is Alchemist ?",
|
"BOL.ui.isAlchemist": "Is Alchemist ?",
|
||||||
"BOL.ui.isPriest": "Is Priest/Druid ?",
|
"BOL.ui.isPriest": "Is Priest/Druid ?",
|
||||||
|
"BOL.ui.isAstrologer": "Is Astrologer?",
|
||||||
"BOL.ui.circle": "Circle",
|
"BOL.ui.circle": "Circle",
|
||||||
"BOL.ui.spells": "Spells",
|
"BOL.ui.spells": "Spells",
|
||||||
"BOL.ui.focusSpell": "Cast a spell",
|
"BOL.ui.focusSpell": "Cast a spell",
|
||||||
@ -122,8 +147,8 @@
|
|||||||
"BOL.ui.alchemistRank": "Alchemist Rank",
|
"BOL.ui.alchemistRank": "Alchemist Rank",
|
||||||
"BOL.ui.mandatoryconditions": "Mandatory conditions",
|
"BOL.ui.mandatoryconditions": "Mandatory conditions",
|
||||||
"BOL.ui.optionnalconditions": "Optional conditions",
|
"BOL.ui.optionnalconditions": "Optional conditions",
|
||||||
"BOL.ui.ppcost": "Power Points cost",
|
"BOL.ui.ppcost": "Arcane Points cost",
|
||||||
"BOL.ui.ppAvailable": "Available Power Points",
|
"BOL.ui.ppAvailable": "Available Arcane Points",
|
||||||
"BOL.ui.pccost": "Creation Points cost",
|
"BOL.ui.pccost": "Creation Points cost",
|
||||||
"BOL.ui.pcnow": "Actual Creation Points",
|
"BOL.ui.pcnow": "Actual Creation Points",
|
||||||
"BOL.ui.alchemyType": "Type",
|
"BOL.ui.alchemyType": "Type",
|
||||||
@ -151,6 +176,57 @@
|
|||||||
"BOL.ui.armorAgiMalus": "Armor+Shield Modifier (Agi)",
|
"BOL.ui.armorAgiMalus": "Armor+Shield Modifier (Agi)",
|
||||||
"BOL.ui.armorInitMalus": "Armor Modifier (Init)",
|
"BOL.ui.armorInitMalus": "Armor Modifier (Init)",
|
||||||
"BOL.ui.attackValue": "Attack Value",
|
"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.origins": "Origins",
|
||||||
"BOL.featureCategory.races": "Races",
|
"BOL.featureCategory.races": "Races",
|
||||||
@ -168,6 +244,11 @@
|
|||||||
"BOL.featureSubtypes.language": "Language",
|
"BOL.featureSubtypes.language": "Language",
|
||||||
"BOL.featureSubtypes.gods": "Faith & Gods",
|
"BOL.featureSubtypes.gods": "Faith & Gods",
|
||||||
"BOL.featureSubtypes.fightOption": "Combat Option",
|
"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.nomoney": "Nothing",
|
||||||
"BOL.bougette.tolive": "To live",
|
"BOL.bougette.tolive": "To live",
|
||||||
@ -182,6 +263,7 @@
|
|||||||
"BOL.fightOptionTypes.fulldefense": "Full Defense",
|
"BOL.fightOptionTypes.fulldefense": "Full Defense",
|
||||||
"BOL.fightOptionTypes.defense": "Defensive Posture",
|
"BOL.fightOptionTypes.defense": "Defensive Posture",
|
||||||
"BOL.fightOptionTypes.attack": "Offensive Posture",
|
"BOL.fightOptionTypes.attack": "Offensive Posture",
|
||||||
|
"BOL.fightOptionTypes.other": "Other",
|
||||||
|
|
||||||
"BOL.itemCategory.object": "Object",
|
"BOL.itemCategory.object": "Object",
|
||||||
"BOL.itemCategory.equipment": "Equipment",
|
"BOL.itemCategory.equipment": "Equipment",
|
||||||
@ -191,6 +273,7 @@
|
|||||||
"BOL.itemCategory.other": "Other",
|
"BOL.itemCategory.other": "Other",
|
||||||
"BOL.itemCategory.capacity" : "Capacity",
|
"BOL.itemCategory.capacity" : "Capacity",
|
||||||
"BOL.itemCategory.alchemy": "Alchemy",
|
"BOL.itemCategory.alchemy": "Alchemy",
|
||||||
|
"BOL.itemCategory.vehicleweapon": "Vehicle weapon",
|
||||||
|
|
||||||
"BOL.combatCategory.protections": "Protections",
|
"BOL.combatCategory.protections": "Protections",
|
||||||
"BOL.combatCategory.shields": "Shields",
|
"BOL.combatCategory.shields": "Shields",
|
||||||
@ -302,7 +385,7 @@
|
|||||||
"BOL.itemModifiers.init": "Modifier (Initiative)",
|
"BOL.itemModifiers.init": "Modifier (Initiative)",
|
||||||
"BOL.itemModifiers.social": "Modifier (Social)",
|
"BOL.itemModifiers.social": "Modifier (Social)",
|
||||||
"BOL.itemModifiers.agility": "Modifier (Agility)",
|
"BOL.itemModifiers.agility": "Modifier (Agility)",
|
||||||
"BOL.itemModifiers.powercost": "Modifier (Additional Cost in PP)",
|
"BOL.itemModifiers.powercost": "Modifier (Additional Cost in AP)",
|
||||||
|
|
||||||
"BOL.itemBlocking.malus": "Modifier",
|
"BOL.itemBlocking.malus": "Modifier",
|
||||||
"BOL.itemBlocking.nbAttacksPerRound": "Agility",
|
"BOL.itemBlocking.nbAttacksPerRound": "Agility",
|
||||||
@ -390,11 +473,14 @@
|
|||||||
"BOL.chat.rolldamage": "Roll for damages",
|
"BOL.chat.rolldamage": "Roll for damages",
|
||||||
"BOL.chat.rolldamage6": "Roll for damages +6",
|
"BOL.chat.rolldamage6": "Roll for damages +6",
|
||||||
"BOL.chat.rolldamage12": "Roll for damages +12 (1 HP)",
|
"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.damageresult": "Damages of {name} : {total}",
|
||||||
"BOL.chat.damagetarget": "Target : {target}",
|
"BOL.chat.damagetarget": "Target : {target}",
|
||||||
"BOL.chat.applydamagetotarget": "Apply damages to the target",
|
"BOL.chat.applydamagetotarget": "Apply damages to the target",
|
||||||
"BOL.chat.fightoption": "Combat options",
|
"BOL.chat.fightoption": "Combat options",
|
||||||
"BOL.chat.reroll": "Reroll (1 HP)",
|
"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.toheroic": "Convert to Mighty success (1 HP)",
|
||||||
"BOL.chat.tolegend": "Convert to Legendary succes (1 HP)",
|
"BOL.chat.tolegend": "Convert to Legendary succes (1 HP)",
|
||||||
"BOL.chat.hurttitle": "{name} is going to receive {damageTotal} damages !",
|
"BOL.chat.hurttitle": "{name} is going to receive {damageTotal} damages !",
|
||||||
@ -410,8 +496,53 @@
|
|||||||
"BOL.chat.herosplintered": "No damages received, thanks to splintered shield/sword with {weaponHero.name}. The weapon/shield has been destroyed ! One HP point has been spent also.",
|
"BOL.chat.herosplintered": "No damages received, thanks to splintered shield/sword with {weaponHero.name}. The weapon/shield has been destroyed ! One HP point has been spent also.",
|
||||||
"BOL.chat.finaldamage": "Final Damage : {finalDamage} damages !",
|
"BOL.chat.finaldamage": "Final Damage : {finalDamage} damages !",
|
||||||
"BOL.chat.spell": "Spell",
|
"BOL.chat.spell": "Spell",
|
||||||
"BOL.chat.spellcost": "Power Points cost",
|
"BOL.chat.spellcost": "Arcane Points cost",
|
||||||
"BOL.chat.spellremaining": "Remaining Power Points",
|
"BOL.chat.spellremaining": "Remaining Arcane 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.soeasy": "So easy (+4)",
|
||||||
"BOL.dialog.veryeasy": "Very easy (+2)",
|
"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.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.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.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",
|
"TYPES": {
|
||||||
"ACTOR.TypeEncounter": "Rencontre",
|
"Actor": {
|
||||||
"ITEM.TypeItem": "Objet",
|
"character": "Personnage",
|
||||||
"ITEM.TypeFeature": "Trait",
|
"encounter": "PNJ",
|
||||||
"ITEM.TypeWeapon": "Arme",
|
"npc": "PNJ",
|
||||||
"ITEM.TypeArmor": "Armure",
|
"vehicle": "Véhicule",
|
||||||
|
"horde": "Horde"
|
||||||
|
},
|
||||||
|
"Item": {
|
||||||
|
"item": "Objet",
|
||||||
|
"feature": "Trait",
|
||||||
|
"weapon": "Arme",
|
||||||
|
"armure": "Armure"
|
||||||
|
}
|
||||||
|
},
|
||||||
"BOL.attributes.vigor": "Vigueur",
|
"BOL.attributes.vigor": "Vigueur",
|
||||||
"BOL.attributes.halfvigor": "Demi-vigueur",
|
"BOL.attributes.halfvigor": "Demi-vigueur",
|
||||||
"BOL.attributes.agility": "Agilité",
|
"BOL.attributes.agility": "Agilité",
|
||||||
"BOL.attributes.mind": "Esprit",
|
"BOL.attributes.mind": "Esprit",
|
||||||
"BOL.attributes.appeal": "Aura",
|
"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.init": "Initiative",
|
||||||
"BOL.aptitudes.melee": "Mêlée",
|
"BOL.aptitudes.melee": "Mêlée",
|
||||||
"BOL.aptitudes.ranged": "Tir",
|
"BOL.aptitudes.ranged": "Tir",
|
||||||
@ -22,7 +35,9 @@
|
|||||||
"BOL.resources.power": "Pouvoir",
|
"BOL.resources.power": "Pouvoir",
|
||||||
"BOL.resources.villainy": "Vilénie",
|
"BOL.resources.villainy": "Vilénie",
|
||||||
"BOL.resources.alchemypoints": "Points de Creation",
|
"BOL.resources.alchemypoints": "Points de Creation",
|
||||||
|
"BOL.resources.astrologypoints": "Points d'Astrologie",
|
||||||
"BOL.traits.xp": "Expérience",
|
"BOL.traits.xp": "Expérience",
|
||||||
|
|
||||||
"BOL.ui.tab.stats": "Attributs",
|
"BOL.ui.tab.stats": "Attributs",
|
||||||
"BOL.ui.tab.combat": "Combat",
|
"BOL.ui.tab.combat": "Combat",
|
||||||
"BOL.ui.tab.actions": "Actions",
|
"BOL.ui.tab.actions": "Actions",
|
||||||
@ -30,7 +45,19 @@
|
|||||||
"BOL.ui.tab.equipment": "Equipement",
|
"BOL.ui.tab.equipment": "Equipement",
|
||||||
"BOL.ui.tab.description": "Description",
|
"BOL.ui.tab.description": "Description",
|
||||||
"BOL.ui.tab.details": "Details",
|
"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.properties": "Propriétés",
|
||||||
"BOL.ui.description": "Description",
|
"BOL.ui.description": "Description",
|
||||||
"BOL.ui.actions": "Actions",
|
"BOL.ui.actions": "Actions",
|
||||||
@ -86,8 +113,8 @@
|
|||||||
"BOL.ui.success": "Succès",
|
"BOL.ui.success": "Succès",
|
||||||
"BOL.ui.failure": "Échec",
|
"BOL.ui.failure": "Échec",
|
||||||
"BOL.ui.fumble": "Échec critique",
|
"BOL.ui.fumble": "Échec critique",
|
||||||
"BOL.ui.critical": "Succès critique",
|
"BOL.ui.critical": "Succès Héroïque",
|
||||||
"BOL.ui.criticallegend": "Succès légendaire !",
|
"BOL.ui.criticallegend": "Succès Légendaire !",
|
||||||
"BOL.ui.maneuvers": "Actions de combat",
|
"BOL.ui.maneuvers": "Actions de combat",
|
||||||
"BOL.ui.stacksize": "Taille de pile (max)",
|
"BOL.ui.stacksize": "Taille de pile (max)",
|
||||||
"BOL.ui.weapons": "Armes",
|
"BOL.ui.weapons": "Armes",
|
||||||
@ -108,12 +135,23 @@
|
|||||||
"BOL.ui.difficulty": "Difficulté",
|
"BOL.ui.difficulty": "Difficulté",
|
||||||
"BOL.ui.spellProperties": "Propriétés du Sort",
|
"BOL.ui.spellProperties": "Propriétés du Sort",
|
||||||
"BOL.ui.duration": "Durée",
|
"BOL.ui.duration": "Durée",
|
||||||
"BOL.ui.spellkeep": "Prolongation",
|
"BOL.ui.spellkeep": "Prolongation possible ?",
|
||||||
"BOL.ui.concentrate": "Concentration",
|
"BOL.ui.concentrate": "Concentration à maintenir ?",
|
||||||
|
"BOL.ui.aggressive": "Sort aggressif ?",
|
||||||
"BOL.ui.registerInit": "Enregistrer comme Init. de combat",
|
"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.isSorcerer": "Carrière de Sorcier ?",
|
||||||
"BOL.ui.isAlchemist": "Carrière d'Alchimiste ?",
|
"BOL.ui.isAlchemist": "Carrière d'Alchimiste ?",
|
||||||
"BOL.ui.isPriest": "Carrière de Prêtre/Druide ?",
|
"BOL.ui.isPriest": "Carrière de Prêtre/Druide ?",
|
||||||
|
"BOL.ui.isAstrologer": "Carrière d'Astrologue?",
|
||||||
"BOL.ui.circle": "Cercle",
|
"BOL.ui.circle": "Cercle",
|
||||||
"BOL.ui.spells": "Sorts",
|
"BOL.ui.spells": "Sorts",
|
||||||
"BOL.ui.focusSpell": "Lance un sort",
|
"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.alchemyCostTotal": "Points de Création nécessaires pour la Préparation",
|
||||||
"BOL.ui.alchemyInvest": "Points de Création investis",
|
"BOL.ui.alchemyInvest": "Points de Création investis",
|
||||||
"BOL.ui.alchemyCurrent": "Points de Création actuel dans la Préparation",
|
"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.advance": "Avancement",
|
||||||
"BOL.ui.isbonusdice": "Fourni un dé bonus?",
|
"BOL.ui.isbonusdice": "Fourni un dé bonus?",
|
||||||
"BOL.ui.ismalusdice": "Fourni un dé malus?",
|
"BOL.ui.ismalusdice": "Fourni un dé malus?",
|
||||||
@ -151,6 +204,49 @@
|
|||||||
"BOL.ui.armorAgiMalus": "Malus d'Armure+Bouclier (Agi)",
|
"BOL.ui.armorAgiMalus": "Malus d'Armure+Bouclier (Agi)",
|
||||||
"BOL.ui.armorInitMalus": "Malus d'Armure (Init)",
|
"BOL.ui.armorInitMalus": "Malus d'Armure (Init)",
|
||||||
"BOL.ui.attackValue": "Valeur d'attaque",
|
"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.origins": "Origines",
|
||||||
"BOL.featureCategory.races": "Races",
|
"BOL.featureCategory.races": "Races",
|
||||||
"BOL.featureCategory.careers": "Carrières",
|
"BOL.featureCategory.careers": "Carrières",
|
||||||
@ -163,6 +259,7 @@
|
|||||||
"BOL.bougette.easylife": "A l'aise",
|
"BOL.bougette.easylife": "A l'aise",
|
||||||
"BOL.bougette.luxury": "Luxe&Volupté",
|
"BOL.bougette.luxury": "Luxe&Volupté",
|
||||||
"BOL.bougette.rich": "Richissime",
|
"BOL.bougette.rich": "Richissime",
|
||||||
|
|
||||||
"BOL.featureSubtypes.origin": "Origine",
|
"BOL.featureSubtypes.origin": "Origine",
|
||||||
"BOL.featureSubtypes.race": "Race",
|
"BOL.featureSubtypes.race": "Race",
|
||||||
"BOL.featureSubtypes.career": "Carrière",
|
"BOL.featureSubtypes.career": "Carrière",
|
||||||
@ -171,6 +268,12 @@
|
|||||||
"BOL.featureSubtypes.language": "Langue",
|
"BOL.featureSubtypes.language": "Langue",
|
||||||
"BOL.featureSubtypes.gods": "Dieux & Foi",
|
"BOL.featureSubtypes.gods": "Dieux & Foi",
|
||||||
"BOL.featureSubtypes.fightOption": "Option de Combat",
|
"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.armor": "Attaque au défaut d'armure",
|
||||||
"BOL.fightOptionTypes.intrepid": "Attaque intrépide",
|
"BOL.fightOptionTypes.intrepid": "Attaque intrépide",
|
||||||
"BOL.fightOptionTypes.twoweaponsdef": "Combat à 2 armes (Défense)",
|
"BOL.fightOptionTypes.twoweaponsdef": "Combat à 2 armes (Défense)",
|
||||||
@ -178,6 +281,8 @@
|
|||||||
"BOL.fightOptionTypes.fulldefense": "Défense totale",
|
"BOL.fightOptionTypes.fulldefense": "Défense totale",
|
||||||
"BOL.fightOptionTypes.defense": "Posture défensive",
|
"BOL.fightOptionTypes.defense": "Posture défensive",
|
||||||
"BOL.fightOptionTypes.attack": "Posture offensive",
|
"BOL.fightOptionTypes.attack": "Posture offensive",
|
||||||
|
"BOL.fightOptionTypes.other": "Autres",
|
||||||
|
|
||||||
"BOL.itemCategory.object": "Objet",
|
"BOL.itemCategory.object": "Objet",
|
||||||
"BOL.itemCategory.equipment": "Équipement",
|
"BOL.itemCategory.equipment": "Équipement",
|
||||||
"BOL.itemCategory.consumable": "Consommable",
|
"BOL.itemCategory.consumable": "Consommable",
|
||||||
@ -186,12 +291,15 @@
|
|||||||
"BOL.itemCategory.other": "Autre",
|
"BOL.itemCategory.other": "Autre",
|
||||||
"BOL.itemCategory.capacity": "Capacité",
|
"BOL.itemCategory.capacity": "Capacité",
|
||||||
"BOL.itemCategory.alchemy": "Préparation Alchimique",
|
"BOL.itemCategory.alchemy": "Préparation Alchimique",
|
||||||
|
"BOL.itemCategory.vehicleweapon": "Armes de Véhicule",
|
||||||
|
|
||||||
"BOL.combatCategory.protections": "Protections",
|
"BOL.combatCategory.protections": "Protections",
|
||||||
"BOL.combatCategory.shields": "Boucliers",
|
"BOL.combatCategory.shields": "Boucliers",
|
||||||
"BOL.combatCategory.melee": "Armes de contact",
|
"BOL.combatCategory.melee": "Armes de contact",
|
||||||
"BOL.combatCategory.ranged": "Armes à distance",
|
"BOL.combatCategory.ranged": "Armes à distance",
|
||||||
"BOL.combatCategory.fightOptions": "Options de combat",
|
"BOL.combatCategory.fightOptions": "Options de combat",
|
||||||
"BOL.combatCategory.natural": "Armes Naturelless",
|
"BOL.combatCategory.natural": "Armes Naturelless",
|
||||||
|
|
||||||
"BOL.equipmentCategory.weapon": "Arme",
|
"BOL.equipmentCategory.weapon": "Arme",
|
||||||
"BOL.equipmentCategory.armor": "Armure",
|
"BOL.equipmentCategory.armor": "Armure",
|
||||||
"BOL.equipmentCategory.protection": "Protection",
|
"BOL.equipmentCategory.protection": "Protection",
|
||||||
@ -203,21 +311,26 @@
|
|||||||
"BOL.equipmentCategory.container": "Conteneur",
|
"BOL.equipmentCategory.container": "Conteneur",
|
||||||
"BOL.equipmentCategory.currency": "Monnaie",
|
"BOL.equipmentCategory.currency": "Monnaie",
|
||||||
"BOL.equipmentCategory.other": "Autre",
|
"BOL.equipmentCategory.other": "Autre",
|
||||||
|
|
||||||
"BOL.protectionCategory.armor": "Armure",
|
"BOL.protectionCategory.armor": "Armure",
|
||||||
"BOL.protectionCategory.shield": "Bouclier",
|
"BOL.protectionCategory.shield": "Bouclier",
|
||||||
"BOL.protectionCategory.helm": "Casque",
|
"BOL.protectionCategory.helm": "Casque",
|
||||||
"BOL.protectionCategory.other": "Autre",
|
"BOL.protectionCategory.other": "Autre",
|
||||||
|
|
||||||
"BOL.spellItem.charm": "Charme",
|
"BOL.spellItem.charm": "Charme",
|
||||||
"BOL.spellItem.circle1": "Premier Cercle",
|
"BOL.spellItem.circle1": "Premier Cercle",
|
||||||
"BOL.spellItem.circle2": "Second Cercle",
|
"BOL.spellItem.circle2": "Second Cercle",
|
||||||
"BOL.spellItem.circle3": "Troisième Cercle",
|
"BOL.spellItem.circle3": "Troisième Cercle",
|
||||||
|
|
||||||
"BOL.alchemyItem.common": "Courante",
|
"BOL.alchemyItem.common": "Courante",
|
||||||
"BOL.alchemyItem.scarce": "Rare",
|
"BOL.alchemyItem.scarce": "Rare",
|
||||||
"BOL.alchemyItem.legend": "Légendaire",
|
"BOL.alchemyItem.legend": "Légendaire",
|
||||||
"BOL.alchemyItem.mythic": "Mythique",
|
"BOL.alchemyItem.mythic": "Mythique",
|
||||||
|
|
||||||
"BOL.weaponCategory.melee": "Arme de mêlée",
|
"BOL.weaponCategory.melee": "Arme de mêlée",
|
||||||
"BOL.weaponCategory.ranged": "Arme de tir",
|
"BOL.weaponCategory.ranged": "Arme de tir",
|
||||||
"BOL.weaponCategory.other": "Autre",
|
"BOL.weaponCategory.other": "Autre",
|
||||||
|
|
||||||
"BOL.itemProperty.damageMultiplier": "Multiplicateur de dommages",
|
"BOL.itemProperty.damageMultiplier": "Multiplicateur de dommages",
|
||||||
"BOL.itemProperty.attackBonusDice": "Dé de Bonus d'attaque",
|
"BOL.itemProperty.attackBonusDice": "Dé de Bonus d'attaque",
|
||||||
"BOL.itemProperty.equipable": "Équipable",
|
"BOL.itemProperty.equipable": "Équipable",
|
||||||
@ -270,6 +383,18 @@
|
|||||||
"BOL.itemProperty.difficulty": "Difficulté",
|
"BOL.itemProperty.difficulty": "Difficulté",
|
||||||
"BOL.itemProperty.natural": "Arme naturelle",
|
"BOL.itemProperty.natural": "Arme naturelle",
|
||||||
"BOL.itemProperty.onlymodifier": "Modificateur uniquement (ie attaques de créatures)",
|
"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.quantity": "Quantité",
|
||||||
"BOL.itemStat.weight": "Poids",
|
"BOL.itemStat.weight": "Poids",
|
||||||
"BOL.itemStat.price": "Prix",
|
"BOL.itemStat.price": "Prix",
|
||||||
@ -279,21 +404,26 @@
|
|||||||
"BOL.itemStat.soak": "Valeur de protection",
|
"BOL.itemStat.soak": "Valeur de protection",
|
||||||
"BOL.itemStat.blocking": "Bloquage",
|
"BOL.itemStat.blocking": "Bloquage",
|
||||||
"BOL.itemStat.modifiers": "Modificateurs",
|
"BOL.itemStat.modifiers": "Modificateurs",
|
||||||
|
|
||||||
"BOL.weaponSize.unarmed": "Mains nues",
|
"BOL.weaponSize.unarmed": "Mains nues",
|
||||||
"BOL.weaponSize.improvised": "Arme improvisée",
|
"BOL.weaponSize.improvised": "Arme improvisée",
|
||||||
"BOL.weaponSize.light": "Légère",
|
"BOL.weaponSize.light": "Légère",
|
||||||
"BOL.weaponSize.medium": "Moyenne",
|
"BOL.weaponSize.medium": "Moyenne",
|
||||||
"BOL.weaponSize.heavy": "Lourde",
|
"BOL.weaponSize.heavy": "Lourde",
|
||||||
|
|
||||||
"BOL.itemModifiers.init": "Malus (Initiative)",
|
"BOL.itemModifiers.init": "Malus (Initiative)",
|
||||||
"BOL.itemModifiers.social": "Malus (Social)",
|
"BOL.itemModifiers.social": "Malus (Social)",
|
||||||
"BOL.itemModifiers.agility": "Malus (Agilité)",
|
"BOL.itemModifiers.agility": "Malus (Agilité)",
|
||||||
"BOL.itemModifiers.powercost": "Malus (Coût supplémentaire en PP)",
|
"BOL.itemModifiers.powercost": "Malus (Coût supplémentaire en PP)",
|
||||||
|
|
||||||
"BOL.itemBlocking.malus": "Social",
|
"BOL.itemBlocking.malus": "Social",
|
||||||
"BOL.itemBlocking.nbAttacksPerRound": "Agilité",
|
"BOL.itemBlocking.nbAttacksPerRound": "Agilité",
|
||||||
|
|
||||||
"BOL.soakFormula.none": "-",
|
"BOL.soakFormula.none": "-",
|
||||||
"BOL.soakFormula.light": "Légère (Annule d6-3 dégâts subis)",
|
"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.medium": "Moyenne (Annule d6-2 dégâts subis)",
|
||||||
"BOL.soakFormula.heavy": "Lourde (Annule d6-1 dégâts subis)",
|
"BOL.soakFormula.heavy": "Lourde (Annule d6-1 dégâts subis)",
|
||||||
|
|
||||||
"BOL.armorQuality.none": "-",
|
"BOL.armorQuality.none": "-",
|
||||||
"BOL.armorQuality.light": "Légère",
|
"BOL.armorQuality.light": "Légère",
|
||||||
"BOL.armorQuality.lightQ": "Légère de qualité",
|
"BOL.armorQuality.lightQ": "Légère de qualité",
|
||||||
@ -307,6 +437,7 @@
|
|||||||
"BOL.armorQuality.heavyQ": "Lourde de qualité",
|
"BOL.armorQuality.heavyQ": "Lourde de qualité",
|
||||||
"BOL.armorQuality.heavySup": "Lourde Supérieure",
|
"BOL.armorQuality.heavySup": "Lourde Supérieure",
|
||||||
"BOL.armorQuality.heavyLeg": "Lourde Légendaire",
|
"BOL.armorQuality.heavyLeg": "Lourde Légendaire",
|
||||||
|
|
||||||
"BOL.equipmentSlots.none": "-",
|
"BOL.equipmentSlots.none": "-",
|
||||||
"BOL.equipmentSlots.head": "Tête",
|
"BOL.equipmentSlots.head": "Tête",
|
||||||
"BOL.equipmentSlots.neck": "Cou",
|
"BOL.equipmentSlots.neck": "Cou",
|
||||||
@ -323,10 +454,12 @@
|
|||||||
"BOL.equipmentSlots.feet": "Pieds",
|
"BOL.equipmentSlots.feet": "Pieds",
|
||||||
"BOL.equipmentSlots.finder": "Doigt",
|
"BOL.equipmentSlots.finder": "Doigt",
|
||||||
"BOL.equipmentSlots.ear": "Oreille",
|
"BOL.equipmentSlots.ear": "Oreille",
|
||||||
|
|
||||||
"BOL.vehicleCategory.mount": "Monture terrestre",
|
"BOL.vehicleCategory.mount": "Monture terrestre",
|
||||||
"BOL.vehicleCategory.flying": "Monture volante",
|
"BOL.vehicleCategory.flying": "Monture volante",
|
||||||
"BOL.vehicleCategory.boat": "Bateau",
|
"BOL.vehicleCategory.boat": "Bateau",
|
||||||
"BOL.vehicleCategory.other": "Autre",
|
"BOL.vehicleCategory.other": "Autre",
|
||||||
|
|
||||||
"BOL.range.PointBlank": "Bout portant",
|
"BOL.range.PointBlank": "Bout portant",
|
||||||
"BOL.range.Short": "Courte",
|
"BOL.range.Short": "Courte",
|
||||||
"BOL.range.Medium": "Moyenne",
|
"BOL.range.Medium": "Moyenne",
|
||||||
@ -334,6 +467,7 @@
|
|||||||
"BOL.range.VeryLong": "Très longue",
|
"BOL.range.VeryLong": "Très longue",
|
||||||
"BOL.range.Extreme": "Extrême",
|
"BOL.range.Extreme": "Extrême",
|
||||||
"BOL.range.Maximum": "Maximale",
|
"BOL.range.Maximum": "Maximale",
|
||||||
|
|
||||||
"BOL.notification.MacroMultipleTokensSelected": "Vous avez sélectionné plusieurs tokens",
|
"BOL.notification.MacroMultipleTokensSelected": "Vous avez sélectionné plusieurs tokens",
|
||||||
"BOL.notification.MacroNoActorAvailable": "Aucun acteur n'a pu être ciblé",
|
"BOL.notification.MacroNoActorAvailable": "Aucun acteur n'a pu être ciblé",
|
||||||
"BOL.notification.MacroNoTokenSelected": "Vous devez sélectionner un token",
|
"BOL.notification.MacroNoTokenSelected": "Vous devez sélectionner un token",
|
||||||
@ -356,10 +490,10 @@
|
|||||||
"BOL.chat.isdead": "{name} est mort !",
|
"BOL.chat.isdead": "{name} est mort !",
|
||||||
"BOL.chat.epitaph": "Que son nom soit honoré sur les champs de batailles de Lémurie !",
|
"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.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.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.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.alchemytitle": "Préparation Alchimique : {name}",
|
||||||
"BOL.chat.alchemypoints": "Points de Création Investis : {pcCostCurrent}",
|
"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.",
|
"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.rolldamage": "Lancer les dommages",
|
||||||
"BOL.chat.rolldamage6": "Lancer les dommages +6",
|
"BOL.chat.rolldamage6": "Lancer les dommages +6",
|
||||||
"BOL.chat.rolldamage12": "Dommages +12 (1 Pt. d'Heroisme)",
|
"BOL.chat.rolldamage12": "Dommages +12 (1 Pt. d'Heroisme)",
|
||||||
|
"BOL.chat.rolldamage12Legend": "Dommages +12",
|
||||||
"BOL.chat.damageresult": "Dommages de {name} : {total}",
|
"BOL.chat.damageresult": "Dommages de {name} : {total}",
|
||||||
"BOL.chat.damagetarget": "Cible : {target}",
|
"BOL.chat.damagetarget": "Cible : {target}",
|
||||||
"BOL.chat.applydamagetotarget": "Appliquer les dommages à la cible",
|
"BOL.chat.applydamagetotarget": "Appliquer les dommages à la cible",
|
||||||
"BOL.chat.fightoption": "Option de combat",
|
"BOL.chat.fightoption": "Option de combat",
|
||||||
"BOL.chat.reroll": "Relancer (1 P. Heroisme)",
|
"BOL.chat.reroll": "Relancer (1 P. Heroisme)",
|
||||||
"BOL.chat.toheroic": "Transformer en succés Héroïque (1 P. Héroisme)",
|
"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.tolegend": "Transformer en succes Légendaire (1 P. Heroisme)",
|
"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.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.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.witharmor": "Encaisser avec la protection de l'armure",
|
||||||
"BOL.chat.withoutarmor": "Encaisser sans 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.shakeoff": "Juste une égratignure (1 Point d'Héroisme/Vilainie)",
|
||||||
"BOL.chat.splinteredshield": "Parade in Extremis avec {name} (1 Point d'Héroisme)",
|
"BOL.chat.splinteredshield": "Parade in Extremis avec {name} (1 Point d'Héroisme/Vilainie)",
|
||||||
"BOL.chat.damagesummary": "Dégats subis par {name}",
|
"BOL.chat.damagesummary": "Dégats subis par {name}",
|
||||||
"BOL.chat.protectvalue": "Protection de l'armure",
|
"BOL.chat.protectvalue": "Protection de l'armure",
|
||||||
"BOL.chat.noprotectvalue": "Aucune protection d'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.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 a également été dépensé.",
|
"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.finaldamage": "Encaissement final : {finalDamage} dégats !",
|
||||||
"BOL.chat.spell": "Sort",
|
"BOL.chat.spell": "Sort",
|
||||||
"BOL.chat.spellcost": "Cout en Points de Pouvoir",
|
"BOL.chat.spellcost": "Cout en Points de Pouvoir",
|
||||||
"BOL.chat.spellremaining": "Points de Pouvoir restants",
|
"BOL.chat.spellremaining": "Points de Pouvoir restants",
|
||||||
"BOL.chat.nodamagesummary": "Aucun dégats n'a été subi ....",
|
"BOL.chat.nodamagesummary": "Aucun dégats n'a été subi ....",
|
||||||
"BOL.chat.damageresume": "{name} a subi des blessures ...",
|
"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.soeasy": "Inmanquable (+4)",
|
||||||
"BOL.dialog.veryeasy": "Trés Facile (+2)",
|
"BOL.dialog.veryeasy": "Trés Facile (+2)",
|
||||||
@ -424,11 +606,41 @@
|
|||||||
"BOL.ui.biosigns": "Signes distinctifs",
|
"BOL.ui.biosigns": "Signes distinctifs",
|
||||||
"BOL.ui.biodescription": "Description",
|
"BOL.ui.biodescription": "Description",
|
||||||
"BOL.ui.bionotes": "Notes",
|
"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.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.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.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": "Bon jeu en Lemurie !"
|
"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 */
|
/** @override */
|
||||||
static get defaultOptions() {
|
static get defaultOptions() {
|
||||||
return mergeObject(super.defaultOptions, {
|
return foundry.utils.mergeObject(super.defaultOptions, {
|
||||||
classes: ["bol", "sheet", "actor"],
|
classes: ["bol", "sheet", "actor"],
|
||||||
template: "systems/bol/templates/actor/actor-sheet.hbs",
|
template: "systems/bol/templates/actor/actor-sheet.hbs",
|
||||||
width: 600,
|
width: 860,
|
||||||
height: 600,
|
height: 600,
|
||||||
dragDrop: [{ dragSelector: ".items-list .item", dropSelector: null }],
|
dragDrop: [{ dragSelector: ".items-list .item", dropSelector: null }],
|
||||||
tabs: [{ navSelector: ".sheet-tabs", contentSelector: ".sheet-body", initial: "stats" }]
|
tabs: [{ navSelector: ".sheet-tabs", contentSelector: ".sheet-body", initial: "stats" }]
|
||||||
@ -27,7 +27,7 @@ export class BoLActorSheet extends ActorSheet {
|
|||||||
|
|
||||||
function onLoad() {
|
function onLoad() {
|
||||||
let logoSheet = BoLUtility.getLogoActorSheet()
|
let logoSheet = BoLUtility.getLogoActorSheet()
|
||||||
$(".bol-actor-form").css("backgroundImage",`url(${logoSheet})`)
|
$(".bol-actor-form").css("backgroundImage", `url(${logoSheet})`)
|
||||||
}
|
}
|
||||||
// Setup everything onload
|
// Setup everything onload
|
||||||
$(function () { onLoad(); });
|
$(function () { onLoad(); });
|
||||||
@ -47,10 +47,19 @@ export class BoLActorSheet extends ActorSheet {
|
|||||||
// Equip/Unequip item
|
// Equip/Unequip item
|
||||||
html.find('.item-equip').click(this._onToggleEquip.bind(this));
|
html.find('.item-equip').click(this._onToggleEquip.bind(this));
|
||||||
|
|
||||||
html.find('.create_item').click(ev => {
|
html.find('.create-item').click(ev => {
|
||||||
this.actor.createEmbeddedDocuments('Item', [{ name: "Nouvel Equipement", type: "item" }], { renderSheet: true });
|
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) => {
|
html.find(".toggle-fight-option").click((ev) => {
|
||||||
const li = $(ev.currentTarget).parents(".item")
|
const li = $(ev.currentTarget).parents(".item")
|
||||||
this.actor.toggleFightOption(li.data("itemId"))
|
this.actor.toggleFightOption(li.data("itemId"))
|
||||||
@ -60,6 +69,12 @@ export class BoLActorSheet extends ActorSheet {
|
|||||||
const li = $(ev.currentTarget).parents(".item");
|
const li = $(ev.currentTarget).parents(".item");
|
||||||
this.actor.spendAlchemyPoint(li.data("itemId"), 1)
|
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
|
// Incr./Decr. career ranks
|
||||||
html.find(".inc-dec-btns").click((ev) => {
|
html.find(".inc-dec-btns").click((ev) => {
|
||||||
@ -94,8 +109,8 @@ export class BoLActorSheet extends ActorSheet {
|
|||||||
// Delete Inventory Item
|
// Delete Inventory Item
|
||||||
html.find('.item-delete').click(ev => {
|
html.find('.item-delete').click(ev => {
|
||||||
Dialog.confirm({
|
Dialog.confirm({
|
||||||
title: "Suppression",
|
title: game.i18n.localize("BOL.ui.deletetitle"),
|
||||||
content: `Vous êtes sûr de vouloir supprimer cet item ?`,
|
content: game.i18n.localize("BOL.ui.confirmdelete"),
|
||||||
yes: () => {
|
yes: () => {
|
||||||
const li = $(ev.currentTarget).parents(".item");
|
const li = $(ev.currentTarget).parents(".item");
|
||||||
this.actor.deleteEmbeddedDocuments("Item", [li.data("itemId")])
|
this.actor.deleteEmbeddedDocuments("Item", [li.data("itemId")])
|
||||||
@ -114,10 +129,10 @@ export class BoLActorSheet extends ActorSheet {
|
|||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
|
|
||||||
/** @override */
|
/** @override */
|
||||||
getData(options) {
|
async getData(options) {
|
||||||
const data = super.getData(options)
|
const data = super.getData(options)
|
||||||
const actorData = duplicate(data)
|
const actorData = foundry.utils.duplicate(data)
|
||||||
let formData = duplicate(data)
|
let formData = foundry.utils.duplicate(data)
|
||||||
|
|
||||||
formData.config = game.bol.config
|
formData.config = game.bol.config
|
||||||
formData.data = actorData
|
formData.data = actorData
|
||||||
@ -125,6 +140,7 @@ export class BoLActorSheet extends ActorSheet {
|
|||||||
formData.attributes = this.actor.attributes
|
formData.attributes = this.actor.attributes
|
||||||
formData.aptitudes = this.actor.aptitudes
|
formData.aptitudes = this.actor.aptitudes
|
||||||
formData.resources = this.actor.getResourcesFromType()
|
formData.resources = this.actor.getResourcesFromType()
|
||||||
|
formData.xp = this.actor.system.xp
|
||||||
formData.equipment = this.actor.equipment
|
formData.equipment = this.actor.equipment
|
||||||
formData.equipmentCreature = this.actor.equipmentCreature
|
formData.equipmentCreature = this.actor.equipmentCreature
|
||||||
formData.weapons = this.actor.weapons
|
formData.weapons = this.actor.weapons
|
||||||
@ -133,25 +149,35 @@ export class BoLActorSheet extends ActorSheet {
|
|||||||
formData.alchemy = this.actor.alchemy
|
formData.alchemy = this.actor.alchemy
|
||||||
formData.containers = this.actor.containers
|
formData.containers = this.actor.containers
|
||||||
formData.treasure = this.actor.treasure
|
formData.treasure = this.actor.treasure
|
||||||
|
formData.boleffects = this.actor.boleffects
|
||||||
formData.alchemyrecipe = this.actor.alchemyrecipe
|
formData.alchemyrecipe = this.actor.alchemyrecipe
|
||||||
|
formData.horoscopes = this.actor.horoscopes
|
||||||
formData.vehicles = this.actor.vehicles
|
formData.vehicles = this.actor.vehicles
|
||||||
formData.fightoptions = this.actor.fightoptions
|
formData.fightoptions = this.actor.fightoptions
|
||||||
formData.ammos = this.actor.ammos
|
formData.ammos = this.actor.ammos
|
||||||
formData.misc = this.actor.misc
|
formData.misc = this.actor.misc
|
||||||
|
formData.xplog = this.actor.xplog
|
||||||
formData.combat = this.actor.buildCombat()
|
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.features = this.actor.buildFeatures()
|
||||||
formData.isGM = game.user.isGM
|
formData.isGM = game.user.isGM
|
||||||
formData.options = this.options
|
formData.options = this.options
|
||||||
formData.owner = this.document.isOwner
|
formData.owner = this.document.isOwner
|
||||||
formData.editScore = this.options.editScore
|
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.charType = this.actor.getCharType()
|
||||||
formData.villainy = this.actor.getVillainy()
|
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.isSorcerer = this.actor.isSorcerer()
|
||||||
formData.isAlchemist = this.actor.isAlchemist()
|
formData.isAlchemist = this.actor.isAlchemist()
|
||||||
|
formData.isAstrologer = this.actor.isAstrologer()
|
||||||
|
formData.isMysteries = formData.isSorcerer || formData.isAlchemist || formData.isAstrologer
|
||||||
formData.isPriest = this.actor.isPriest()
|
formData.isPriest = this.actor.isPriest()
|
||||||
|
formData.horoscopeGroupList = game.settings.get("bol", "horoscope-group")
|
||||||
|
|
||||||
formData.isGM = game.user.isGM
|
formData.isGM = game.user.isGM
|
||||||
|
|
||||||
@ -171,7 +197,7 @@ export class BoLActorSheet extends ActorSheet {
|
|||||||
// Get the type of item to create.
|
// Get the type of item to create.
|
||||||
const type = header.dataset.type;
|
const type = header.dataset.type;
|
||||||
// Grab any data associated with this control.
|
// Grab any data associated with this control.
|
||||||
const data = duplicate(header.dataset);
|
const data = foundry.utils.duplicate(header.dataset);
|
||||||
// Initialize a default name.
|
// Initialize a default name.
|
||||||
const name = `New ${type.capitalize()}`;
|
const name = `New ${type.capitalize()}`;
|
||||||
// Prepare the item object.
|
// Prepare the item object.
|
||||||
@ -234,7 +260,19 @@ export class BoLActorSheet extends ActorSheet {
|
|||||||
this.actor.incAttributeXP(dataset.key)
|
this.actor.incAttributeXP(dataset.key)
|
||||||
break;
|
break;
|
||||||
case "careerxp":
|
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;
|
break;
|
||||||
|
|
||||||
default: 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";
|
import { BoLUtility } from "../system/bol-utility.js";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -7,6 +7,39 @@ import { BoLUtility } from "../system/bol-utility.js";
|
|||||||
*/
|
*/
|
||||||
export class BoLActor extends Actor {
|
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 */
|
/** @override */
|
||||||
prepareData() {
|
prepareData() {
|
||||||
|
|
||||||
@ -18,22 +51,108 @@ export class BoLActor extends Actor {
|
|||||||
this.chartype = 'tough'
|
this.chartype = 'tough'
|
||||||
this.villainy = true
|
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()
|
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() {
|
getCharType() {
|
||||||
if (this.type === 'character') {
|
if (this.type === 'character') {
|
||||||
return 'player'
|
return "player"
|
||||||
}
|
}
|
||||||
return this.system.chartype
|
return this.system.chartype
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
getVillainy() {
|
getVillainy() {
|
||||||
if (this.type === 'character') {
|
return ( (this.type === 'encounter' && this.chartype == "adversary") || this.chartype == "creature")
|
||||||
return false
|
}
|
||||||
|
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') {
|
if (this.type == 'character') {
|
||||||
let newVitality = 10 + this.system.attributes.vigor.value + this.system.resources.hp.bonus
|
let newVitality = 10 + this.system.attributes.vigor.value + this.system.resources.hp.bonus
|
||||||
if (this.system.resources.hp.max != newVitality) {
|
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
|
let newPower = 10 + this.system.attributes.mind.value + this.system.resources.power.bonus
|
||||||
if (this.system.resources.power.max != newPower) {
|
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() {
|
prepareDerivedData() {
|
||||||
super.prepareDerivedData()
|
if (this.type == "vehicle") {
|
||||||
this.updateResourcesData()
|
|
||||||
this.manageHealthState();
|
} else {
|
||||||
|
super.prepareDerivedData()
|
||||||
|
if (this.id) {
|
||||||
|
this.updateResourcesData()
|
||||||
|
this.manageHealthState()
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
get details() {
|
get details() {
|
||||||
return this.system.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() {
|
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() {
|
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") {
|
if (fo && fo.system.properties.fightoptiontype == "attack") {
|
||||||
defMod += -1
|
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
|
return this.system.aptitudes.def.value + defMod
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -105,21 +257,40 @@ export class BoLActor extends Actor {
|
|||||||
getActiveFightOption() {
|
getActiveFightOption() {
|
||||||
let it = this.items.find(i => i.type === "feature" && i.system.subtype === "fightoption" && i.system.properties.activated)
|
let it = this.items.find(i => i.type === "feature" && i.system.subtype === "fightoption" && i.system.properties.activated)
|
||||||
if (it) {
|
if (it) {
|
||||||
return duplicate(it)
|
return foundry.utils.duplicate(it)
|
||||||
}
|
}
|
||||||
return undefined
|
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) {
|
incAttributeXP(key) {
|
||||||
let attr = duplicate(this.system.attributes[key])
|
let attr = foundry.utils.duplicate(this.system.attributes[key])
|
||||||
if (attr) {
|
if (attr) {
|
||||||
let nextXP = (attr.value == -1) ? 2 : attr.value + (attr.value + 1)
|
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) {
|
if (xp.total - xp.spent >= nextXP) {
|
||||||
attr.value += 1
|
attr.value += 1
|
||||||
xp.spent += nextXP
|
xp.spent += nextXP
|
||||||
this.update({ [`system.attributes.${key}`]: attr, [`system.xp`]: xp })
|
this.update({ [`system.attributes.${key}`]: attr, [`system.xp`]: xp })
|
||||||
|
this.addXPLog("attribute", key, nextXP, attr.value)
|
||||||
} else {
|
} else {
|
||||||
ui.notifications.warn("Pas assez de points d'expérience !")
|
ui.notifications.warn("Pas assez de points d'expérience !")
|
||||||
}
|
}
|
||||||
@ -128,14 +299,15 @@ export class BoLActor extends Actor {
|
|||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
incAptitudeXP(key) {
|
incAptitudeXP(key) {
|
||||||
let apt = duplicate(this.system.aptitudes[key])
|
let apt = foundry.utils.duplicate(this.system.aptitudes[key])
|
||||||
if (apt) {
|
if (apt) {
|
||||||
let nextXP = (apt.value == -1) ? 1 : apt.value + 2
|
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) {
|
if (xp.total - xp.spent >= nextXP) {
|
||||||
apt.value += 1
|
apt.value += 1
|
||||||
xp.spent += nextXP
|
xp.spent += nextXP
|
||||||
this.update({ [`system.aptitudes.${key}`]: apt, [`system.xp`]: xp })
|
this.update({ [`system.aptitudes.${key}`]: apt, [`system.xp`]: xp })
|
||||||
|
this.addXPLog("aptitude", key, nextXP, apt.value)
|
||||||
} else {
|
} else {
|
||||||
ui.notifications.warn("Pas assez de points d'expérience !")
|
ui.notifications.warn("Pas assez de points d'expérience !")
|
||||||
}
|
}
|
||||||
@ -145,13 +317,14 @@ export class BoLActor extends Actor {
|
|||||||
incCareerXP(itemId) {
|
incCareerXP(itemId) {
|
||||||
let career = this.items.get(itemId)
|
let career = this.items.get(itemId)
|
||||||
if (career) {
|
if (career) {
|
||||||
career = duplicate(career)
|
career = foundry.utils.duplicate(career)
|
||||||
let nextXP = career.system.rank + 1
|
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) {
|
if (xp.total - xp.spent >= nextXP) {
|
||||||
xp.spent += nextXP
|
xp.spent += nextXP
|
||||||
this.update({ [`system.xp`]: xp })
|
this.update({ [`system.xp`]: xp })
|
||||||
this.updateEmbeddedDocuments('Item', [{ _id: career._id, 'system.rank': career.system.rank + 1 }])
|
this.updateEmbeddedDocuments('Item', [{ _id: career._id, 'system.rank': career.system.rank + 1 }])
|
||||||
|
this.addXPLog("career", career.name, nextXP, career.system.rank + 1)
|
||||||
} else {
|
} else {
|
||||||
ui.notifications.warn("Pas assez de points d'expérience !")
|
ui.notifications.warn("Pas assez de points d'expérience !")
|
||||||
}
|
}
|
||||||
@ -165,7 +338,7 @@ export class BoLActor extends Actor {
|
|||||||
let updates = []
|
let updates = []
|
||||||
|
|
||||||
if (fightOption) {
|
if (fightOption) {
|
||||||
fightOption = duplicate(fightOption)
|
fightOption = foundry.utils.duplicate(fightOption)
|
||||||
if (fightOption.system.properties.activated) {
|
if (fightOption.system.properties.activated) {
|
||||||
state = false
|
state = false
|
||||||
} else {
|
} else {
|
||||||
@ -186,30 +359,38 @@ export class BoLActor extends Actor {
|
|||||||
/*-------------------------------------------- */
|
/*-------------------------------------------- */
|
||||||
get armorMalusValue() { // used for Fight Options
|
get armorMalusValue() { // used for Fight Options
|
||||||
for (let armor of this.armors) {
|
for (let armor of this.armors) {
|
||||||
if (armor.system.properties.armorQuality.includes("light")) {
|
if (armor.system.properties.armorQuality?.includes("light")) {
|
||||||
return 1
|
return 1
|
||||||
}
|
}
|
||||||
if (armor.system.properties.armorQuality.includes("medium")) {
|
if (armor.system.properties.armorQuality?.includes("medium")) {
|
||||||
return 2
|
return 2
|
||||||
}
|
}
|
||||||
if (armor.system.properties.armorQuality.includes("heavy")) {
|
if (armor.system.properties.armorQuality?.includes("heavy")) {
|
||||||
return 3
|
return 3
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return 0
|
return 0
|
||||||
}
|
}
|
||||||
|
|
||||||
get resources() {
|
get resources() {
|
||||||
return Object.values(this.system.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() {
|
get boons() {
|
||||||
return duplicate(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() {
|
get flaws() {
|
||||||
return duplicate(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() {
|
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() {
|
get origins() {
|
||||||
return this.items.filter(i => i.type === "feature" && i.system.subtype === "origin");
|
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")
|
return this.items.filter(i => i.type === "item")
|
||||||
}
|
}
|
||||||
get equipmentCreature() {
|
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() {
|
get armors() {
|
||||||
return this.items.filter(i => i.type === "item" && i.system.category === "equipment" && i.system.subtype === "armor");
|
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() {
|
get shields() {
|
||||||
return this.items.filter(i => i.type === "item" && i.system.category === "equipment" && i.system.subtype === "shield");
|
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() {
|
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() {
|
get protections() {
|
||||||
return this.armors.concat(this.helms).concat(this.shields)
|
return this.armors.concat(this.helms).concat(this.shields)
|
||||||
@ -289,26 +472,23 @@ export class BoLActor extends Actor {
|
|||||||
|
|
||||||
get bonusBoons() {
|
get bonusBoons() {
|
||||||
let boons = 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 duplicate( boons || [])
|
return foundry.utils.duplicate(boons || [])
|
||||||
}
|
}
|
||||||
get malusFlaws() {
|
get malusFlaws() {
|
||||||
return duplicate( 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() {
|
isSorcerer() {
|
||||||
if (this.careers.find(item => item.system.properties.sorcerer == true))
|
return (this.careers.find(item => item.system.properties.sorcerer))
|
||||||
return true
|
|
||||||
return false
|
|
||||||
}
|
}
|
||||||
isAlchemist() {
|
isAlchemist() {
|
||||||
if (this.careers.find(item => item.system.properties.alchemist == true))
|
return (this.careers.find(item => item.system.properties.alchemist))
|
||||||
return true
|
}
|
||||||
return false
|
isAstrologer() {
|
||||||
|
return (this.careers.find(item => item.system.properties.astrologer))
|
||||||
}
|
}
|
||||||
isPriest() {
|
isPriest() {
|
||||||
if (this.careers.find(item => item.system.properties.priest == true))
|
return (this.careers.find(item => item.system.properties.priest))
|
||||||
return true
|
|
||||||
return false
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*-------------------------------------------- */
|
/*-------------------------------------------- */
|
||||||
@ -323,6 +503,23 @@ export class BoLActor extends Actor {
|
|||||||
return ppCostArmor
|
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() {
|
getArmorAgiMalus() {
|
||||||
let malusAgi = 0
|
let malusAgi = 0
|
||||||
for (let armor of this.protections) {
|
for (let armor of this.protections) {
|
||||||
@ -359,11 +556,93 @@ export class BoLActor extends Actor {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*-------------------------------------------- */
|
||||||
|
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)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/*-------------------------------------------- */
|
/*-------------------------------------------- */
|
||||||
async spendAlchemyPoint(alchemyId, pcCost) {
|
async spendAlchemyPoint(alchemyId, pcCost) {
|
||||||
let alchemy = this.items.get(alchemyId)
|
let alchemy = this.items.get(alchemyId)
|
||||||
if (alchemy) {
|
if (alchemy) {
|
||||||
pcCost = Number(pcCost) ?? 0
|
pcCost = Number(pcCost) || 0
|
||||||
if (this.system.resources.alchemypoints.value >= pcCost) {
|
if (this.system.resources.alchemypoints.value >= pcCost) {
|
||||||
let newPC = this.system.resources.alchemypoints.value - pcCost
|
let newPC = this.system.resources.alchemypoints.value - pcCost
|
||||||
newPC = (newPC < 0) ? 0 : newPC
|
newPC = (newPC < 0) ? 0 : newPC
|
||||||
@ -371,14 +650,21 @@ export class BoLActor extends Actor {
|
|||||||
newPC = alchemy.system.properties.pccurrent + pcCost
|
newPC = alchemy.system.properties.pccurrent + pcCost
|
||||||
await this.updateEmbeddedDocuments('Item', [{ _id: alchemy.id, 'system.properties.pccurrent': newPC }])
|
await this.updateEmbeddedDocuments('Item', [{ _id: alchemy.id, 'system.properties.pccurrent': newPC }])
|
||||||
} else {
|
} 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() {
|
getAlchemistBonus() {
|
||||||
let sorcerer = this.careers.find(item => item.system.properties.alchemist == true)
|
let sorcerer = this.careers.find(item => item.system.properties.alchemist)
|
||||||
if (sorcerer) {
|
if (sorcerer) {
|
||||||
return sorcerer.system.rank
|
return sorcerer.system.rank
|
||||||
}
|
}
|
||||||
@ -386,7 +672,7 @@ export class BoLActor extends Actor {
|
|||||||
}
|
}
|
||||||
/*-------------------------------------------- */
|
/*-------------------------------------------- */
|
||||||
getSorcererBonus() {
|
getSorcererBonus() {
|
||||||
let sorcerer = this.careers.find(item => item.system.properties.sorcerer == true)
|
let sorcerer = this.careers.find(item => item.system.properties.sorcerer)
|
||||||
if (sorcerer) {
|
if (sorcerer) {
|
||||||
return sorcerer.system.rank
|
return sorcerer.system.rank
|
||||||
}
|
}
|
||||||
@ -395,26 +681,29 @@ export class BoLActor extends Actor {
|
|||||||
|
|
||||||
/*-------------------------------------------- */
|
/*-------------------------------------------- */
|
||||||
heroReroll() {
|
heroReroll() {
|
||||||
if (this.type == 'character') {
|
if (this.type == 'character' || this.system.villainy == 'adversary') {
|
||||||
return this.system.resources.hero.value > 0;
|
return this.system.resources.hero.value > 0;
|
||||||
} else {
|
|
||||||
if (this.system.type == 'adversary') {
|
|
||||||
return this.system.resources.hero.value > 0;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
/*-------------------------------------------- */
|
||||||
|
getHeroPoints() {
|
||||||
|
if (this.type == 'character' || this.system.villainy == 'adversary') {
|
||||||
|
return this.system.resources.hero.value
|
||||||
|
}
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
/*-------------------------------------------- */
|
||||||
getResourcesFromType() {
|
getResourcesFromType() {
|
||||||
let resources = {};
|
let resources = {};
|
||||||
if (this.type == 'encounter') {
|
if (this.type == 'encounter') {
|
||||||
resources['hp'] = this.system.resources.hp;
|
resources['hp'] = this.system.resources.hp;
|
||||||
if (this.system.type != 'base') {
|
if (this.system.chartype != 'base') {
|
||||||
resources['faith'] = this.system.resources.faith
|
resources['faith'] = this.system.resources.faith
|
||||||
resources['power'] = this.system.resources.power
|
resources['power'] = this.system.resources.power
|
||||||
}
|
}
|
||||||
if (this.system.type == 'adversary') {
|
if (this.system.chartype == 'adversary' || this.system.chartype == 'creature') {
|
||||||
resources['hero'] = duplicate(this.system.resources.hero)
|
resources['hero'] = foundry.utils.duplicate(this.system.resources.hero)
|
||||||
resources['hero'].label = "BOL.resources.villainy"
|
resources['hero'].label = "BOL.resources.villainy"
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@ -464,6 +753,11 @@ export class BoLActor extends Actor {
|
|||||||
"label": "BOL.featureSubtypes.gods",
|
"label": "BOL.featureSubtypes.gods",
|
||||||
"ranked": false,
|
"ranked": false,
|
||||||
"items": this.godsfaith
|
"items": this.godsfaith
|
||||||
|
},
|
||||||
|
"boleffects": {
|
||||||
|
"label": "BOL.featureSubtypes.effects",
|
||||||
|
"ranked": false,
|
||||||
|
"items": this.boleffects
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -479,6 +773,15 @@ export class BoLActor extends Actor {
|
|||||||
"options": false,
|
"options": false,
|
||||||
"items": this.melee
|
"items": this.melee
|
||||||
},
|
},
|
||||||
|
"natural": {
|
||||||
|
"label": "BOL.combatCategory.natural",
|
||||||
|
"weapon": true,
|
||||||
|
"protection": false,
|
||||||
|
"blocking": false,
|
||||||
|
"ranged": false,
|
||||||
|
"options": false,
|
||||||
|
"items": this.natural
|
||||||
|
},
|
||||||
"ranged": {
|
"ranged": {
|
||||||
"label": "BOL.combatCategory.ranged",
|
"label": "BOL.combatCategory.ranged",
|
||||||
"weapon": true,
|
"weapon": true,
|
||||||
@ -518,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() {
|
buildRollList() {
|
||||||
@ -559,33 +840,198 @@ export class BoLActor extends Actor {
|
|||||||
|
|
||||||
/*-------------------------------------------- */
|
/*-------------------------------------------- */
|
||||||
buildListeActions() {
|
buildListeActions() {
|
||||||
return this.melee.concat(this.ranged).concat(this.natural)
|
return this.melee.concat(this.ranged).concat(this.natural).concat(this.fightoptions)
|
||||||
}
|
}
|
||||||
|
|
||||||
/*-------------------------------------------- */
|
/*-------------------------------------------- */
|
||||||
async manageHealthState() {
|
async manageHealthState() {
|
||||||
let hpID = "lastHP" + this.id
|
let hpID = "lastHP" + this.id
|
||||||
let lastHP = await this.getFlag("world", hpID)
|
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)
|
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 (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({
|
ChatMessage.create({
|
||||||
alias: this.name,
|
alias: this.name,
|
||||||
whisper: BoLUtility.getWhisperRecipientsAndGMs(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) {
|
async registerInit(rollData) {
|
||||||
this.update({ 'system.combat.lastinit': initScore, 'system.combat.iscritical': isCritical, 'system.combat.isfumble': isFumble })
|
rollData.actor = undefined // Cleanup if present
|
||||||
|
await this.setFlag("world", "last-initiative", rollData)
|
||||||
}
|
}
|
||||||
|
|
||||||
/*-------------------------------------------- */
|
/*-------------------------------------------- */
|
||||||
getLastInitData() {
|
storeVitaliteCombat() {
|
||||||
return this.system.combat
|
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
|
||||||
}
|
}
|
||||||
|
|
||||||
/*-------------------------------------------- */
|
/*-------------------------------------------- */
|
||||||
@ -594,11 +1040,29 @@ export class BoLActor extends Actor {
|
|||||||
newHeroP = (newHeroP < 0) ? 0 : newHeroP;
|
newHeroP = (newHeroP < 0) ? 0 : newHeroP;
|
||||||
await this.update({ 'system.resources.hero.value': 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) {
|
async sufferDamage(damage) {
|
||||||
|
let updates = {}
|
||||||
let newHP = this.system.resources.hp.value - damage
|
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)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
@ -611,13 +1075,13 @@ export class BoLActor extends Actor {
|
|||||||
} else if (protect.system.subtype == 'armor') {
|
} else if (protect.system.subtype == 'armor') {
|
||||||
if (BoLUtility.getRollArmor()) {
|
if (BoLUtility.getRollArmor()) {
|
||||||
if (!protect.system.properties.soak.formula || protect.system.properties.soak.formula == "") {
|
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 {
|
} else {
|
||||||
formula += "+" + " max(" + protect.system.properties.soak.formula +",0)"
|
formula += "+" + " max(" + protect.system.properties.soak.formula + ",0)"
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (protect.system.properties.soak.value == undefined) {
|
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 {
|
} else {
|
||||||
formula += "+ " + protect.system.properties.soak.value
|
formula += "+ " + protect.system.properties.soak.value
|
||||||
}
|
}
|
||||||
@ -629,20 +1093,21 @@ export class BoLActor extends Actor {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
rollProtection(itemId) {
|
async rollProtection(itemId) {
|
||||||
let armor = duplicate(this.items.get(itemId))
|
let armor = foundry.utils.duplicate(this.items.get(itemId))
|
||||||
if (armor) {
|
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)
|
let rollArmor = new Roll(armorFormula)
|
||||||
rollArmor.roll({ async: false }).toMessage()
|
await rollArmor.roll()
|
||||||
|
rollArmor.toMessage()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
rollWeaponDamage(itemId) {
|
rollWeaponDamage(itemId) {
|
||||||
let weapon = duplicate(this.items.get(itemId))
|
let weapon = foundry.utils.duplicate(this.items.get(itemId))
|
||||||
if (weapon) {
|
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.setSuccess(true)
|
||||||
r.rollDamage()
|
r.rollDamage()
|
||||||
}
|
}
|
||||||
@ -652,7 +1117,7 @@ export class BoLActor extends Actor {
|
|||||||
toggleEquipItem(item) {
|
toggleEquipItem(item) {
|
||||||
const equipable = item.system.properties.equipable;
|
const equipable = item.system.properties.equipable;
|
||||||
if (equipable) {
|
if (equipable) {
|
||||||
let itemData = duplicate(item);
|
let itemData = foundry.utils.duplicate(item);
|
||||||
itemData.system.worn = !itemData.system.worn;
|
itemData.system.worn = !itemData.system.worn;
|
||||||
return item.update(itemData);
|
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 Modules
|
||||||
import { BoLActor } from "./actor/actor.js"
|
import { BoLActor } from "./actor/actor.js"
|
||||||
import { BoLActorSheet } from "./actor/actor-sheet.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 { BoLItem } from "./item/item.js"
|
||||||
import { BoLItemSheet } from "./item/item-sheet.js"
|
import { BoLItemSheet } from "./item/item-sheet.js"
|
||||||
import { System, BOL } from "./system/config.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 { BoLCombatManager } from "./system/bol-combat.js"
|
||||||
import { BoLTokenHud } from "./system/bol-action-hud.js"
|
import { BoLTokenHud } from "./system/bol-action-hud.js"
|
||||||
import { BoLHotbar } from "./system/bol-hotbar.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 () {
|
Hooks.once('init', async function () {
|
||||||
@ -23,25 +25,26 @@ Hooks.once('init', async function () {
|
|||||||
BoLActor,
|
BoLActor,
|
||||||
BoLItem,
|
BoLItem,
|
||||||
BoLHotbar,
|
BoLHotbar,
|
||||||
|
BoLRoll,
|
||||||
|
BoLUtility,
|
||||||
macros: Macros,
|
macros: Macros,
|
||||||
config: BOL
|
config: BOL
|
||||||
};
|
};
|
||||||
|
|
||||||
// Game socket
|
// Game socket
|
||||||
game.socket.on("system.bol", sockmsg => {
|
game.socket.on("system.bol", sockmsg => {
|
||||||
BoLUtility.onSocketMessage(sockmsg);
|
BoLUtility.onSocketMessage(sockmsg);
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set an initiative formula for the system
|
* Set an initiative formula for the system
|
||||||
* @type {String}
|
* @type {String}
|
||||||
*/
|
*/
|
||||||
CONFIG.Combat.initiative = {
|
CONFIG.Combat.initiative = {
|
||||||
formula: "2d6+@attributes.mind.value+@aptitudes.init.value",
|
formula: "2d6+@attributes.mind.value+@aptitudes.init.value",
|
||||||
decimals: 3
|
decimals: 2
|
||||||
};
|
};
|
||||||
|
|
||||||
// Define custom Entity classes
|
// Define custom Entity classes
|
||||||
CONFIG.Actor.documentClass = BoLActor;
|
CONFIG.Actor.documentClass = BoLActor;
|
||||||
CONFIG.Item.documentClass = BoLItem;
|
CONFIG.Item.documentClass = BoLItem;
|
||||||
@ -49,7 +52,10 @@ Hooks.once('init', async function () {
|
|||||||
|
|
||||||
// Register sheet application classes
|
// Register sheet application classes
|
||||||
Actors.unregisterSheet("core", ActorSheet);
|
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.unregisterSheet("core", ItemSheet);
|
||||||
Items.registerSheet("bol", BoLItemSheet, { makeDefault: true });
|
Items.registerSheet("bol", BoLItemSheet, { makeDefault: true });
|
||||||
|
|
||||||
@ -58,7 +64,6 @@ Hooks.once('init', async function () {
|
|||||||
BoLTokenHud.init()
|
BoLTokenHud.init()
|
||||||
BoLHotbar.init()
|
BoLHotbar.init()
|
||||||
BoLCommands.init()
|
BoLCommands.init()
|
||||||
BoLAdventureGenerator.init()
|
|
||||||
|
|
||||||
// Preload Handlebars Templates
|
// Preload Handlebars Templates
|
||||||
await preloadHandlebarsTemplates();
|
await preloadHandlebarsTemplates();
|
||||||
@ -69,55 +74,58 @@ Hooks.once('init', async function () {
|
|||||||
// Register hooks
|
// Register hooks
|
||||||
registerHooks()
|
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}"`
|
|
||||||
//$.ajaxSetup({
|
|
||||||
//headers: { 'Access-Control-Allow-Origin': '*' }
|
|
||||||
//})
|
|
||||||
$.ajax(regURL)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
function welcomeMessage() {
|
function welcomeMessage() {
|
||||||
ChatMessage.create({
|
ChatMessage.create({
|
||||||
user: game.user.id,
|
user: game.user.id,
|
||||||
whisper: [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>` +
|
<strong>` + game.i18n.localize("BOL.chat.welcome1") + `</strong><p>` +
|
||||||
game.i18n.localize("BOL.chat.welcome2") + "<p>" +
|
game.i18n.localize("BOL.chat.welcome2") + "<p>" +
|
||||||
game.i18n.localize("BOL.chat.welcome3") + "<p>" +
|
game.i18n.localize("BOL.chat.welcome3") + "<p>" +
|
||||||
game.i18n.localize("BOL.chat.welcome4") + "</p>" +
|
game.i18n.localize("BOL.chat.welcome4") + "</p>" +
|
||||||
game.i18n.localize("BOL.chat.welcome5") + "</p>"
|
game.i18n.localize("BOL.chat.welcome5") + "<br>" +
|
||||||
} )
|
game.i18n.localize("BOL.chat.welcome6")
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
Hooks.once('ready', async function () {
|
Hooks.once('ready', async function () {
|
||||||
BoLUtility.ready()
|
|
||||||
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()
|
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() {
|
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
|
static buildHoroscopeGroupList() {
|
||||||
let description = game.i18n.localize('BOL.ui.attributeCheck') + " - " + game.i18n.localize(attribute.label)
|
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 = {
|
let rollData = {
|
||||||
mode: "attribute",
|
mode: mode,
|
||||||
actorId: actor.id,
|
actorId: actor.id,
|
||||||
|
tokenId: actor.token?.id,
|
||||||
img: actor.img,
|
img: actor.img,
|
||||||
attribute: attribute,
|
attribute: attribute,
|
||||||
attrValue: attribute.value,
|
attrValue: attribute.value,
|
||||||
aptValue: 0,
|
aptValue: 0,
|
||||||
label: label,
|
|
||||||
careerBonus: 0,
|
careerBonus: 0,
|
||||||
description: description,
|
horoscopeBonus: 0,
|
||||||
|
horoscopeMalus: 0,
|
||||||
|
selectedHoroscope: [],
|
||||||
armorAgiMalus: actor.getArmorAgiMalus(),
|
armorAgiMalus: actor.getArmorAgiMalus(),
|
||||||
armorInitMalus: actor.getArmorInitMalus(),
|
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)
|
console.log(">>>>>>>>>>", rollData, actor)
|
||||||
return this.displayRollDialog(rollData)
|
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 aptitude = eval(`actor.system.aptitudes.${key}`)
|
||||||
let attrKey = this.getDefaultAttribute(key)
|
let attrKey = this.getDefaultAttribute(key)
|
||||||
let attribute = eval(`actor.system.attributes.${attrKey}`)
|
let attribute = eval(`actor.system.attributes.${attrKey}`)
|
||||||
|
|
||||||
let label = (aptitude.label) ? game.i18n.localize(aptitude.label) : null;
|
let rollData = this.getCommonRollData(actor, "aptitude", attribute, aptitude)
|
||||||
let description = game.i18n.localize('BOL.ui.aptitudeCheck') + " - " + game.i18n.localize(aptitude.label);
|
|
||||||
return this.displayRollDialog(
|
rollData.label = (aptitude.label) ? game.i18n.localize(aptitude.label) : null
|
||||||
{
|
rollData.description = game.i18n.localize('BOL.ui.aptitudeCheck') + " - " + game.i18n.localize(aptitude.label)
|
||||||
mode: "aptitude",
|
rollData.combatData = combatData // For initiative mainly
|
||||||
actorId: actor.id,
|
|
||||||
img: actor.img,
|
return this.displayRollDialog(rollData)
|
||||||
attribute: attribute,
|
}
|
||||||
aptitude: aptitude,
|
|
||||||
attrValue: attribute.value,
|
/* -------------------------------------------- */
|
||||||
aptValue: aptitude.value,
|
static async detectDistance(weapon, target) {
|
||||||
armorAgiMalus: actor.getArmorAgiMalus(),
|
let visible, dist
|
||||||
armorInitMalus: actor.getArmorInitMalus(),
|
if (target && (weapon.system.properties.ranged || weapon.system.properties.throwing)) {
|
||||||
label: label,
|
console.log("target", target, weapon)
|
||||||
careerBonus: 0,
|
visible = canvas.effects.visibility.testVisibility(target.center, { object: _token })
|
||||||
description: description,
|
dist = Number(canvas.grid.measureDistances([{ ray: new Ray(_token.center, target.center) }], { gridSpaces: false })).toFixed(2)
|
||||||
mod: 0
|
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 attribute = eval(`actor.system.attributes.${weaponData.properties.attackAttribute}`)
|
||||||
let aptitude = eval(`actor.system.aptitudes.${weaponData.properties.attackAptitude}`)
|
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
|
// Manage specific case
|
||||||
let fightOption = actor.getActiveFightOption()
|
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.`)
|
ui.notifications.warn(`{{actor.name}} est en Défense Totale ! Il ne peut pas attaquer ce round.`)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
// Build the roll structure
|
|
||||||
let rolldata = {
|
// Update the roll structure
|
||||||
mode: "weapon",
|
rollData.weapon = weapon
|
||||||
actorId: actor.id,
|
rollData.isRanged = weaponData.properties.ranged || weaponData.properties.throwing
|
||||||
img: actor.img,
|
rollData.targetId = target?.id
|
||||||
weapon: weapon,
|
rollData.fightOption = fightOption
|
||||||
isRanged: weaponData.properties.ranged || weaponData.properties.throwing,
|
rollData.defenderId = target?.actor.id
|
||||||
targetId: target?.id,
|
rollData.label = (weapon.name) ? weapon.name : game.i18n.localize('BOL.ui.noWeaponName')
|
||||||
fightOption: fightOption,
|
rollData.description = game.i18n.localize('BOL.ui.weaponAttack') + " : " + weapon.name
|
||||||
careerBonus: 0,
|
|
||||||
defenderId: target?.actor.id,
|
return this.displayRollDialog(rollData)
|
||||||
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)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static weaponCheck(actor, event) {
|
static weaponCheck(actor, event) {
|
||||||
const li = $(event.currentTarget).parents(".item")
|
const li = $(event.currentTarget).parents(".item")
|
||||||
@ -114,7 +183,7 @@ export class BoLRoll {
|
|||||||
ui.notifications.warn("Unable to find weapon !")
|
ui.notifications.warn("Unable to find weapon !")
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
weapon = duplicate(weapon)
|
weapon = foundry.utils.duplicate(weapon)
|
||||||
return this.weaponCheckWithWeapon(actor, weapon)
|
return this.weaponCheckWithWeapon(actor, weapon)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -126,56 +195,66 @@ export class BoLRoll {
|
|||||||
ui.notifications.warn("Unable to find Alchemy !");
|
ui.notifications.warn("Unable to find Alchemy !");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
alchemy = duplicate(alchemy)
|
alchemy = foundry.utils.duplicate(alchemy)
|
||||||
let alchemyData = alchemy.data
|
let alchemyData = alchemy.system
|
||||||
if (alchemyData.properties.pccurrent < alchemyData.properties.pccost) {
|
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
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
let alchemyDef = {
|
let rollData = this.getCommonRollData(actor, "alchemy", actor.system.attributes.mind)
|
||||||
mode: "alchemy",
|
|
||||||
actorId: actor.id,
|
rollData.alchemy = alchemy
|
||||||
img: actor.img,
|
rollData.careerBonus = actor.getAlchemistBonus()
|
||||||
alchemy: alchemy,
|
rollData.pcCost = Number(alchemyData.properties.pccost)
|
||||||
attribute: actor.system.attributes.mind,
|
rollData.pcCostCurrent = Number(alchemyData.properties.pccurrent)
|
||||||
attrValue: actor.system.attributes.mind.value,
|
rollData.mod = Number(alchemyData.properties.difficulty)
|
||||||
aptValue: 0,
|
rollData.label = alchemy.name
|
||||||
careerBonus: actor.getAlchemistBonus(),
|
rollData.description = game.i18n.localize('BOL.ui.makeAlchemy') + "+" + alchemy.name
|
||||||
pcCost: Number(alchemyData.properties.pccost),
|
|
||||||
pcCostCurrent: Number(alchemyData.properties.pccurrent),
|
console.log("ALCHEMY!", rollData);
|
||||||
mod: Number(alchemyData.properties.difficulty),
|
return this.displayRollDialog(rollData);
|
||||||
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);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static spellCheckWithSpell( actor, spell ) {
|
static horoscopeCheck(actor, event, horoscopeType) {
|
||||||
let spellDef = {
|
|
||||||
mode: "spell",
|
let target = BoLUtility.getTarget()
|
||||||
actorId: actor.id,
|
|
||||||
img: actor.img,
|
let cost = (horoscopeType == "minor") ? 1 : 2
|
||||||
spell: spell,
|
if (cost > actor.getAstrologyPoints()) {
|
||||||
attribute: actor.system.attributes.mind,
|
ui.notifications.warn(game.i18n.localize("BOL.ui.astrologyNoPoints"))
|
||||||
attrValue: actor.system.attributes.mind.value,
|
return
|
||||||
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,
|
|
||||||
}
|
}
|
||||||
|
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)
|
//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 !")
|
ui.notifications.warn("Impossible de trouver ce sort !")
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
spell = duplicate(spell)
|
spell = foundry.utils.duplicate(spell)
|
||||||
return this.spellCheckWithSpell( actor, spell)
|
return this.spellCheckWithSpell(actor, spell)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
@ -200,8 +279,35 @@ export class BoLRoll {
|
|||||||
this.updateArmorMalus(this.rollData)
|
this.updateArmorMalus(this.rollData)
|
||||||
this.updatePPCost(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
|
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)
|
this.rollData.nbDice = 2 + Math.abs(this.rollData.bmDice)
|
||||||
|
// Bonus or Malus ?
|
||||||
if (this.rollData.bmDice == 0) {
|
if (this.rollData.bmDice == 0) {
|
||||||
$('#roll-nbdice').val("2")
|
$('#roll-nbdice').val("2")
|
||||||
} else {
|
} else {
|
||||||
@ -209,12 +315,19 @@ export class BoLRoll {
|
|||||||
$('#roll-nbdice').val("2 + " + String(Math.abs(this.rollData.bmDice)) + letter)
|
$('#roll-nbdice').val("2 + " + String(Math.abs(this.rollData.bmDice)) + letter)
|
||||||
}
|
}
|
||||||
let rollbase = this.rollData.attrValue + "+" + this.rollData.aptValue
|
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 = ""
|
rollbase = ""
|
||||||
}
|
}
|
||||||
$('#roll-modifier').val(rollbase + "+" + this.rollData.careerBonus + "+" + this.rollData.mod + "+" +
|
$('#roll-modifier').val(rollbase + "+" + this.rollData.careerBonus + "+" + this.rollData.mod + "+" +
|
||||||
this.rollData.modRanged + "+" + this.rollData.weaponModifier + "-" + this.rollData.defence + "-" + this.rollData.modArmorMalus + "-" +
|
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
|
html.find('#optcond').change((event) => { // Dynamic change of PP cost of spell
|
||||||
let pp = BoLUtility.computeSpellCost(this.rollData.spell, event.currentTarget.selectedOptions.length)
|
let pp = BoLUtility.computeSpellCost(this.rollData.spell, event.currentTarget.selectedOptions.length)
|
||||||
this.rollData.ppCost = pp
|
this.rollData.ppCost = pp
|
||||||
this.updatePPCost( this.rollData)
|
this.updatePPCost(this.rollData)
|
||||||
})
|
})
|
||||||
|
|
||||||
html.find('#mod').change((event) => {
|
html.find('#mod').change((event) => {
|
||||||
@ -288,16 +401,18 @@ export class BoLRoll {
|
|||||||
|
|
||||||
html.find('#attr').change((event) => {
|
html.find('#attr').change((event) => {
|
||||||
let attrKey = event.currentTarget.value
|
let attrKey = event.currentTarget.value
|
||||||
let actor = game.actors.get( this.rollData.actorId)
|
let actor = BoLUtility.getActorFromRollData(this.rollData)
|
||||||
this.rollData.attribute = duplicate(actor.system.attributes[attrKey])
|
this.rollData.attribute = foundry.utils.duplicate(actor.system.attributes[attrKey])
|
||||||
this.rollData.attrValue = actor.system.attributes[attrKey].value
|
this.rollData.attrValue = actor.system.attributes[attrKey].value
|
||||||
|
this.rollData.bolApplicableEffects = this.updateApplicableEffects(this.rollData)
|
||||||
this.updateTotalDice()
|
this.updateTotalDice()
|
||||||
})
|
})
|
||||||
html.find('#apt').change((event) => {
|
html.find('#apt').change((event) => {
|
||||||
let aptKey = event.currentTarget.value
|
let aptKey = event.currentTarget.value
|
||||||
let actor = game.actors.get( this.rollData.actorId)
|
let actor = BoLUtility.getActorFromRollData(this.rollData)
|
||||||
this.rollData.aptitude = duplicate(actor.system.aptitudes[aptKey])
|
this.rollData.aptitude = foundry.utils.duplicate(actor.system.aptitudes[aptKey])
|
||||||
this.rollData.aptValue = actor.system.aptitudes[aptKey].value
|
this.rollData.aptValue = actor.system.aptitudes[aptKey].value
|
||||||
|
this.rollData.bolApplicableEffects = this.updateApplicableEffects(this.rollData)
|
||||||
this.updateTotalDice()
|
this.updateTotalDice()
|
||||||
})
|
})
|
||||||
|
|
||||||
@ -307,6 +422,7 @@ export class BoLRoll {
|
|||||||
} else {
|
} else {
|
||||||
this.rollData.shieldMalus = 0
|
this.rollData.shieldMalus = 0
|
||||||
}
|
}
|
||||||
|
this.updateTotalDice()
|
||||||
})
|
})
|
||||||
|
|
||||||
html.find('#career').change((event) => {
|
html.find('#career').change((event) => {
|
||||||
@ -334,22 +450,52 @@ export class BoLRoll {
|
|||||||
this.rollData.mDice = Number(event.currentTarget.value)
|
this.rollData.mDice = Number(event.currentTarget.value)
|
||||||
this.updateTotalDice()
|
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) {
|
static preProcessWeapon(rollData, defender) {
|
||||||
if (rollData.mode == "weapon") {
|
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
|
rollData.attackBonusDice = rollData.weapon.system.properties.attackBonusDice
|
||||||
|
if (rollData.attackBonusDice) {
|
||||||
|
rollData.adv = "1B"
|
||||||
|
rollData.bDice = 1
|
||||||
|
}
|
||||||
if (defender) { // If target is selected
|
if (defender) { // If target is selected
|
||||||
rollData.defence = defender.defenseValue
|
rollData.defence = defender.defenseValue
|
||||||
rollData.armorMalus = defender.armorMalusValue
|
rollData.armorMalus = defender.armorMalusValue
|
||||||
|
rollData.defenderHeroPoints = defender.getHeroPoints()
|
||||||
rollData.shieldBlock = 'none'
|
rollData.shieldBlock = 'none'
|
||||||
let shields = defender.shields
|
let shields = defender.shields
|
||||||
|
//console.log("Defender stats", defender)
|
||||||
for (let shield of shields) {
|
for (let shield of shields) {
|
||||||
rollData.shieldBlock = (shield.system.properties.blocking.blockingAll) ? 'blockall' : 'blockone';
|
rollData.shieldBlock = (shield.system.properties.blocking.blockingAll) ? 'blockall' : 'blockone';
|
||||||
rollData.shieldAttackMalus = (shield.system.properties.blocking.malus) ? shield.system.properties.blocking.malus : 1;
|
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
|
// initialize default flags/values
|
||||||
const rollOptionTpl = `systems/bol/templates/dialogs/${rollData.mode}-roll-dialog.hbs`
|
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
|
let defender
|
||||||
if ( rollData.targetId) {
|
if (rollData.targetId) {
|
||||||
let token = game.scenes.current.tokens.get(rollData.targetId)
|
let token = game.scenes.current.tokens.get(rollData.targetId)
|
||||||
defender = token.actor
|
defender = token.actor
|
||||||
}
|
}
|
||||||
@ -381,15 +527,11 @@ export class BoLRoll {
|
|||||||
rollData.nbBoons = 0
|
rollData.nbBoons = 0
|
||||||
rollData.nbFlaws = 0
|
rollData.nbFlaws = 0
|
||||||
rollData.nbDice = 0
|
rollData.nbDice = 0
|
||||||
if (rollData.shieldBlock == 'blockall') {
|
rollData.isHeroAdversary = actor.isHeroAdversary()
|
||||||
rollData.shieldMalus = rollData.shieldAttackMalus;
|
|
||||||
} else {
|
|
||||||
rollData.shieldMalus = 0
|
|
||||||
}
|
|
||||||
rollData.careerBonus = rollData.careerBonus ?? 0
|
rollData.careerBonus = rollData.careerBonus ?? 0
|
||||||
rollData.modRanged = rollData.modRanged ?? 0
|
rollData.modRanged = rollData.modRanged ?? 0
|
||||||
rollData.mod = rollData.mod ?? 0
|
rollData.mod = rollData.mod ?? 0
|
||||||
rollData.id = randomID(16)
|
rollData.id = foundry.utils.randomID(16)
|
||||||
rollData.weaponModifier = 0
|
rollData.weaponModifier = 0
|
||||||
rollData.attackBonusDice = false
|
rollData.attackBonusDice = false
|
||||||
rollData.armorMalus = 0
|
rollData.armorMalus = 0
|
||||||
@ -398,6 +540,12 @@ export class BoLRoll {
|
|||||||
this.preProcessFightOption(rollData)
|
this.preProcessFightOption(rollData)
|
||||||
this.updateArmorMalus(rollData)
|
this.updateArmorMalus(rollData)
|
||||||
this.updatePPCost(rollData)
|
this.updatePPCost(rollData)
|
||||||
|
// Prepare blocking case
|
||||||
|
if (rollData.shieldBlock == 'blockall') {
|
||||||
|
rollData.shieldMalus = rollData.shieldAttackMalus;
|
||||||
|
} else {
|
||||||
|
rollData.shieldMalus = 0
|
||||||
|
}
|
||||||
// Save
|
// Save
|
||||||
this.rollData = rollData
|
this.rollData = rollData
|
||||||
console.log("ROLLDATA", rollData)
|
console.log("ROLLDATA", rollData)
|
||||||
@ -420,24 +568,26 @@ export class BoLRoll {
|
|||||||
icon: '<i class="fas fa-check"></i>',
|
icon: '<i class="fas fa-check"></i>',
|
||||||
label: game.i18n.localize("BOL.ui.submit"),
|
label: game.i18n.localize("BOL.ui.submit"),
|
||||||
callback: (html) => {
|
callback: (html) => {
|
||||||
|
console.log("Submit Roll!!!!");
|
||||||
if (rollData.mode == 'spell' && rollData.ppCurrent < rollData.ppCost) { // Check PP available
|
if (rollData.mode == 'spell' && rollData.ppCurrent < rollData.ppCost) { // Check PP available
|
||||||
ui.notifications.warn("Pas assez de Points de Pouvoir !")
|
ui.notifications.warn("Pas assez de Points de Pouvoir !")
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
rollData.registerInit = (rollData.aptitude && rollData.aptitude.key == 'init') ? $('#register-init').is(":checked") : false;
|
rollData.registerInit = (rollData.aptitude && rollData.aptitude.key == 'init') ? $('#register-init').is(":checked") : false;
|
||||||
|
|
||||||
const isMalus = rollData.mDice > 0
|
const isMalus = (rollData.bmDice < 0)
|
||||||
rollData.nbDice += (rollData.attackBonusDice) ? 1 : 0
|
|
||||||
|
|
||||||
let rollbase = rollData.attrValue + rollData.aptValue
|
let rollbase = rollData.attrValue + rollData.aptValue
|
||||||
if ( rollData.weapon && rollData.weapon.system.properties.onlymodifier ) {
|
if (rollData.weapon?.system.properties.onlymodifier) {
|
||||||
rollbase = 0
|
rollbase = 0
|
||||||
}
|
}
|
||||||
const modifiers = rollbase + rollData.careerBonus + rollData.mod + rollData.weaponModifier - rollData.defence - rollData.modArmorMalus + rollData.shieldMalus + rollData.attackModifier + rollData.appliedArmorMalus
|
let diceData = BoLUtility.getDiceData()
|
||||||
const formula = (isMalus) ? rollData.nbDice + "d6kl2 + " + modifiers : rollData.nbDice + "d6kh2 + " + modifiers
|
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.formula = formula
|
||||||
rollData.modifiers = modifiers
|
rollData.modifiers = modifiers
|
||||||
|
console.log("Rolldata before", rollData)
|
||||||
|
|
||||||
let r = new BoLDefaultRoll(rollData);
|
let r = new BoLDefaultRoll(rollData);
|
||||||
r.roll();
|
r.roll();
|
||||||
@ -463,61 +613,95 @@ export class BoLDefaultRoll {
|
|||||||
this.rollData.isFumble = false;
|
this.rollData.isFumble = false;
|
||||||
}
|
}
|
||||||
if (this.rollData.optionsId) {
|
if (this.rollData.optionsId) {
|
||||||
BoLUtility.cleanupButtons( this.rollData.optionsId)
|
BoLUtility.cleanupButtons(this.rollData.optionsId)
|
||||||
}
|
}
|
||||||
if (this.rollData.applyId) {
|
if (this.rollData.applyId) {
|
||||||
BoLUtility.cleanupButtons( this.rollData.applyId)
|
BoLUtility.cleanupButtons(this.rollData.applyId)
|
||||||
}
|
}
|
||||||
this.rollData.optionsId = randomID(16)
|
this.rollData.optionsId = foundry.utils.randomID(16)
|
||||||
this.rollData.applyId = randomID(16)
|
this.rollData.applyId = foundry.utils.randomID(16)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
async roll() {
|
async roll() {
|
||||||
|
|
||||||
const r = new Roll(this.rollData.formula)
|
const r = new Roll(this.rollData.formula)
|
||||||
// console.log("Roll formula", this.rollData.formula)
|
await r.roll()
|
||||||
await r.roll({ "async": false })
|
|
||||||
|
let diceData = BoLUtility.getDiceData()
|
||||||
|
//console.log("DICEDATA", diceData)
|
||||||
const activeDice = r.terms[0].results.filter(r => r.active)
|
const activeDice = r.terms[0].results.filter(r => r.active)
|
||||||
const diceTotal = activeDice.map(r => r.result).reduce((a, b) => a + b)
|
const diceTotal = activeDice.map(r => r.result).reduce((a, b) => a + b)
|
||||||
this.rollData.roll = r
|
this.rollData.roll = r
|
||||||
this.rollData.isSuccess = (r.total >= 9)
|
this.rollData.isFumble = (diceTotal <= diceData.criticalFailureValue)
|
||||||
this.rollData.isCritical = (diceTotal === 12)
|
if ( this.rollData.isFumble ) {
|
||||||
this.rollData.isRealCritical = (diceTotal === 12)
|
this.rollData.isSuccess = false
|
||||||
this.rollData.isHeroic = (diceTotal === 12)
|
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.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) {
|
if (this.rollData.reroll == undefined) {
|
||||||
this.rollData.reroll = actor.heroReroll()
|
this.rollData.reroll = actor.heroReroll()
|
||||||
}
|
}
|
||||||
|
|
||||||
if (this.rollData.registerInit) {
|
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
|
if (this.rollData.isSuccess && this.rollData.mode == "spell") { // PP cost management
|
||||||
this.rollData.remainingPP = actor.spendPowerPoint(this.rollData.ppCost + this.rollData.ppCostArmor)
|
this.rollData.remainingPP = actor.spendPowerPoint(this.rollData.ppCost + this.rollData.ppCostArmor)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (this.rollData.mode == "alchemy") { // PP cost management
|
if (this.rollData.mode == "alchemy") { // PP cost management
|
||||||
actor.resetAlchemyStatus(this.rollData.alchemy._id)
|
actor.resetAlchemyStatus(this.rollData.alchemy._id)
|
||||||
}
|
}
|
||||||
|
if (this.rollData.mode == "bougette" && this.rollData.isFailure) {
|
||||||
|
actor.decBougette()
|
||||||
|
}
|
||||||
|
|
||||||
await this.sendChatMessage()
|
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() {
|
async sendChatMessage() {
|
||||||
let actor = game.actors.get( this.rollData.actorId)
|
let actor = BoLUtility.getActorFromRollData(this.rollData)
|
||||||
this._buildChatMessage(this.rollData).then( async msgFlavor => {
|
this._buildChatMessage(this.rollData).then(async msgFlavor => {
|
||||||
|
//console.log("MSG", msgFlavor )
|
||||||
let msg = await this.rollData.roll.toMessage({
|
let msg = await this.rollData.roll.toMessage({
|
||||||
user: game.user.id,
|
user: game.user.id,
|
||||||
rollMode: game.settings.get("core", "rollMode"),
|
rollMode: game.settings.get("core", "rollMode"),
|
||||||
//whisper: BoLUtility.getWhisperRecipientsAndGMs(this.rollData.actor.name),
|
|
||||||
flavor: msgFlavor,
|
flavor: msgFlavor,
|
||||||
speaker: ChatMessage.getSpeaker({ actor: actor }),
|
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)
|
msg.setFlag("world", "bol-roll-data", this.rollData)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
@ -525,12 +709,15 @@ export class BoLDefaultRoll {
|
|||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
upgradeToLegendary() {
|
upgradeToLegendary() {
|
||||||
// Force to Critical roll
|
// Force to Critical roll
|
||||||
|
let diceData = BoLUtility.getDiceData()
|
||||||
|
let maxValue = Number(diceData.diceFormula) * 2
|
||||||
|
|
||||||
this.rollData.isCritical = true
|
this.rollData.isCritical = true
|
||||||
this.rollData.isLegendary = true
|
this.rollData.isLegendary = true
|
||||||
this.rollData.isRealCritical = false
|
this.rollData.isRealCritical = false
|
||||||
this.rollData.isSuccess = true
|
this.rollData.isSuccess = true
|
||||||
this.rollData.isFailure = false
|
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.rollData.reroll = false
|
||||||
this.sendChatMessage()
|
this.sendChatMessage()
|
||||||
}
|
}
|
||||||
@ -538,17 +725,20 @@ export class BoLDefaultRoll {
|
|||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
upgradeToHeroic() {
|
upgradeToHeroic() {
|
||||||
// Force to Critical roll
|
// Force to Critical roll
|
||||||
|
let diceData = BoLUtility.getDiceData()
|
||||||
|
let maxValue = Number(diceData.diceFormula) * 2
|
||||||
|
|
||||||
this.rollData.isCritical = true
|
this.rollData.isCritical = true
|
||||||
this.rollData.isHeroic = true
|
this.rollData.isHeroic = true
|
||||||
this.rollData.isLegendary = false
|
this.rollData.isLegendary = false
|
||||||
this.rollData.isRealCritical = false
|
this.rollData.isRealCritical = false
|
||||||
this.rollData.isSuccess = true
|
this.rollData.isSuccess = true
|
||||||
this.rollData.isFailure = false
|
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.rollData.reroll = false
|
||||||
this.sendChatMessage()
|
this.sendChatMessage()
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
setSuccess(flag) {
|
setSuccess(flag) {
|
||||||
this.rollData.isSuccess = flag
|
this.rollData.isSuccess = flag
|
||||||
@ -556,7 +746,7 @@ export class BoLDefaultRoll {
|
|||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
async sendDamageMessage() {
|
async sendDamageMessage() {
|
||||||
let actor = game.actors.get( this.rollData.actorId)
|
let actor = BoLUtility.getActorFromRollData(this.rollData)
|
||||||
this._buildDamageChatMessage(this.rollData).then(async msgFlavor => {
|
this._buildDamageChatMessage(this.rollData).then(async msgFlavor => {
|
||||||
let msg = await this.rollData.damageRoll.toMessage({
|
let msg = await this.rollData.damageRoll.toMessage({
|
||||||
user: game.user.id,
|
user: game.user.id,
|
||||||
@ -564,6 +754,7 @@ export class BoLDefaultRoll {
|
|||||||
speaker: ChatMessage.getSpeaker({ actor: actor }),
|
speaker: ChatMessage.getSpeaker({ actor: actor }),
|
||||||
flags: { msgType: "default" }
|
flags: { msgType: "default" }
|
||||||
})
|
})
|
||||||
|
this.rollData.damageRoll = foundry.utils.duplicate(this.rollData.damageRoll)
|
||||||
this.rollData.actor = undefined // Cleanup
|
this.rollData.actor = undefined // Cleanup
|
||||||
msg.setFlag("world", "bol-roll-data", this.rollData)
|
msg.setFlag("world", "bol-roll-data", this.rollData)
|
||||||
})
|
})
|
||||||
@ -571,16 +762,8 @@ export class BoLDefaultRoll {
|
|||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
getDamageAttributeValue(attrDamage, actorId = undefined) {
|
getDamageAttributeValue(attrDamage, actorId = undefined) {
|
||||||
let attrDamageValue = 0
|
let actor = BoLUtility.getActorFromRollData(this.rollData)
|
||||||
|
return actor.getDamageAttributeValue(attrDamage)
|
||||||
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
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
@ -595,20 +778,24 @@ export class BoLDefaultRoll {
|
|||||||
if (this.rollData.damageMode == 'damage-plus-6') {
|
if (this.rollData.damageMode == 'damage-plus-6') {
|
||||||
bonusDmg = 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
|
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 attrDamageValue = this.getDamageAttributeValue(this.rollData.weapon.system.properties.damageAttribute)
|
||||||
let weaponFormula = BoLUtility.getDamageFormula(this.rollData.weapon.system, this.rollData.fightOption)
|
let weaponFormula = BoLUtility.getDamageFormula(this.rollData.weapon.system, this.rollData.fightOption)
|
||||||
|
|
||||||
let damageFormula = weaponFormula + "+" + bonusDmg + "+" + attrDamageValue
|
let damageFormula = weaponFormula + "+" + bonusDmg + "+" + attrDamageValue
|
||||||
console.log("DAMAGE !!!", damageFormula, attrDamageValue, this.rollData)
|
|
||||||
|
|
||||||
//console.log("Formula", weaponFormula, damageFormula, this.rollData.weapon.data.data.properties.damage)
|
//console.log("Formula", weaponFormula, damageFormula, this.rollData.weapon.data.data.properties.damage)
|
||||||
this.rollData.damageFormula = damageFormula
|
this.rollData.damageFormula = damageFormula
|
||||||
this.rollData.damageRoll = new Roll(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
|
this.rollData.damageTotal = this.rollData.damageRoll.total
|
||||||
|
console.log("DAMAGE !!!", damageFormula, attrDamageValue, this.rollData)
|
||||||
}
|
}
|
||||||
BoLUtility.cleanupButtons(this.rollData.optionsId)
|
BoLUtility.cleanupButtons(this.rollData.optionsId)
|
||||||
this.sendDamageMessage()
|
this.sendDamageMessage()
|
||||||
@ -623,8 +810,8 @@ export class BoLDefaultRoll {
|
|||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
_buildChatMessage(rollData) {
|
_buildChatMessage(rollData) {
|
||||||
const rollMessageTpl = 'systems/bol/templates/chat/rolls/default-roll-card.hbs';
|
const rollMessageTpl = 'systems/bol/templates/chat/rolls/default-roll-card.hbs'
|
||||||
return renderTemplate(rollMessageTpl, rollData);
|
return renderTemplate(rollMessageTpl, rollData)
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -8,7 +8,7 @@ export class BoLItemSheet extends ItemSheet {
|
|||||||
|
|
||||||
/** @override */
|
/** @override */
|
||||||
static get defaultOptions() {
|
static get defaultOptions() {
|
||||||
return mergeObject(super.defaultOptions, {
|
return foundry.utils.mergeObject(super.defaultOptions, {
|
||||||
classes: ["bol", "sheet", "item"],
|
classes: ["bol", "sheet", "item"],
|
||||||
template: "systems/bol/templates/item/item-sheet.hbs",
|
template: "systems/bol/templates/item/item-sheet.hbs",
|
||||||
width: 650,
|
width: 650,
|
||||||
@ -19,30 +19,33 @@ export class BoLItemSheet extends ItemSheet {
|
|||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
/** @override */
|
/** @override */
|
||||||
getData(options) {
|
async getData(options) {
|
||||||
const data = super.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.config = game.bol.config
|
||||||
data.item = itemData
|
data.item = itemData
|
||||||
data.category = itemData.system.category
|
data.category = itemData.system.category
|
||||||
data.isGM = game.user.isGM;
|
data.isGM = game.user.isGM;
|
||||||
data.itemProperties = this.item.itemProperties;
|
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
|
// Dynamic default data fix/adapt
|
||||||
if (itemData.type == "item") {
|
if (itemData.type == "item") {
|
||||||
if (!itemData.system.category) {
|
if (!itemData.system.category) {
|
||||||
itemData.system.category = "equipment"
|
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) {
|
if (!itemData.system.properties.slot) {
|
||||||
itemData.system.properties.slot = "-"
|
itemData.system.properties.slot = "-"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (itemData.system.category == 'spell') {
|
if (itemData.system.category == 'spell') {
|
||||||
if(!itemData.system.properties.mandatoryconditions) {
|
if (!itemData.system.properties.mandatoryconditions) {
|
||||||
itemData.system.properties.mandatoryconditions = []
|
itemData.system.properties.mandatoryconditions = []
|
||||||
}
|
}
|
||||||
if(!itemData.system.properties.optionnalconditions) {
|
if (!itemData.system.properties.optionnalconditions) {
|
||||||
itemData.system.properties.optionnalconditions = []
|
itemData.system.properties.optionnalconditions = []
|
||||||
}
|
}
|
||||||
for (let i = 0; i < 4; i++) {
|
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 */
|
/** @override */
|
||||||
setPosition(options = {}) {
|
setPosition(options = {}) {
|
||||||
const position = super.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 { BoLRoll } from "../controllers/bol-rolls.js";
|
||||||
|
import { BoLUtility } from "../system/bol-utility.js";
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
export class BoLTokenHud {
|
export class BoLTokenHud {
|
||||||
@ -30,10 +31,17 @@ export class BoLTokenHud {
|
|||||||
(event) => {
|
(event) => {
|
||||||
let actionIndex = Number(event.currentTarget.attributes['data-action-index'].value)
|
let actionIndex = Number(event.currentTarget.attributes['data-action-index'].value)
|
||||||
let action = hudData.actionsList[actionIndex]
|
let action = hudData.actionsList[actionIndex]
|
||||||
const weapon = actor.items.get( action._id )
|
const actionItem = actor.items.get(action._id)
|
||||||
BoLRoll.weaponCheckWithWeapon(hudData.actor, duplicate(weapon))
|
if (actionItem.system.subtype == "weapon") {
|
||||||
//console.log("Clicked", action)
|
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]');
|
const controlIconTarget = html.find('.control-icon[data-action=target]');
|
||||||
// att+apt+career
|
// att+apt+career
|
||||||
@ -41,18 +49,18 @@ export class BoLTokenHud {
|
|||||||
(event) => {
|
(event) => {
|
||||||
let rollIndex = Number(event.currentTarget.attributes['data-roll-index'].value)
|
let rollIndex = Number(event.currentTarget.attributes['data-roll-index'].value)
|
||||||
let roll = hudData.rollsList[rollIndex]
|
let roll = hudData.rollsList[rollIndex]
|
||||||
if ( roll.type == "aptitude") {
|
if (roll.type == "aptitude") {
|
||||||
BoLRoll.aptitudeCheck(actor, roll.key )
|
BoLRoll.aptitudeCheck(actor, roll.key)
|
||||||
} else if ( roll.type == "attribute") {
|
} else if (roll.type == "attribute") {
|
||||||
BoLRoll.attributeCheck(actor, roll.key )
|
BoLRoll.attributeCheck(actor, roll.key)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static async addTokenHudExtensions(app, html, tokenId) {
|
static async addTokenHudExtensions(app, html, tokenId) {
|
||||||
const controlIconCombat = html.find('.control-icon[data-action=combat]')
|
const controlIconCombat = html.find('.control-icon[data-action=combat]')
|
||||||
if (controlIconCombat.length>0 ) {
|
if (controlIconCombat.length > 0) {
|
||||||
BoLTokenHud.addExtensionHud(app, html, tokenId);
|
BoLTokenHud.addExtensionHud(app, html, tokenId);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -61,9 +69,9 @@ export class BoLTokenHud {
|
|||||||
static async _configureSubMenu(insertionPoint, template, hudData, onMenuItem) {
|
static async _configureSubMenu(insertionPoint, template, hudData, onMenuItem) {
|
||||||
const hud = $(await renderTemplate(template, hudData))
|
const hud = $(await renderTemplate(template, hudData))
|
||||||
const list = hud.find('div.bol-hud-list')
|
const list = hud.find('div.bol-hud-list')
|
||||||
|
|
||||||
BoLTokenHud._toggleHudListActive(hud, list);
|
BoLTokenHud._toggleHudListActive(hud, list);
|
||||||
|
|
||||||
hud.find('img.bol-hud-togglebutton').click(event => BoLTokenHud._toggleHudListActive(hud, list));
|
hud.find('img.bol-hud-togglebutton').click(event => BoLTokenHud._toggleHudListActive(hud, list));
|
||||||
list.find('.bol-hud-menu').click(onMenuItem);
|
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() {
|
constructor() {
|
||||||
super();
|
super();
|
||||||
// position
|
// 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) {
|
if (this.calendarPos == undefined || this.calendarPos.top == undefined) {
|
||||||
this.calendrierPos = BoLCalendar.createCalendarPos()
|
this.calendrierPos = BoLCalendar.createCalendarPos()
|
||||||
game.settings.set("bol", "calendar-pos", this.calendarPos)
|
game.settings.set("bol", "calendar-pos", this.calendarPos)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Calendar
|
// 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.year = this.calendar.year || 900
|
||||||
this.calendar.month = 0
|
this.calendar.month = 0
|
||||||
|
|
||||||
@ -58,7 +58,7 @@ export class BoLCalendar extends Application {
|
|||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static get defaultOptions() {
|
static get defaultOptions() {
|
||||||
return mergeObject(super.defaultOptions, {
|
return foundry.utils.mergeObject(super.defaultOptions, {
|
||||||
template: "systems/bol/templates/calendar-template.html",
|
template: "systems/bol/templates/calendar-template.html",
|
||||||
popOut: false,
|
popOut: false,
|
||||||
resizable: false
|
resizable: false
|
||||||
@ -95,11 +95,11 @@ export class BoLCalendar extends Application {
|
|||||||
this.calendar.hour -= 24
|
this.calendar.hour -= 24
|
||||||
await this.incrementDay()
|
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
|
// Notification aux joueurs // TODO: replace with Hook on game settings update
|
||||||
game.socket.emit(SYSTEM_SOCKET_ID, {
|
game.socket.emit(SYSTEM_SOCKET_ID, {
|
||||||
msg: "msg_sync_time",
|
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) {
|
syncPlayerTime(calendrier) {
|
||||||
this.calendrier = duplicate(calendrier); // Local copy update
|
this.calendrier = foundry.utils.duplicate(calendrier); // Local copy update
|
||||||
this.updateDisplay();
|
this.updateDisplay();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -123,7 +123,7 @@ export class BoLCalendar extends Application {
|
|||||||
}
|
}
|
||||||
this.calendrier.heureRdD = indexHeure;
|
this.calendrier.heureRdD = indexHeure;
|
||||||
this.calendrier.minutesRelative = 0;
|
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.jour = Number(calendrierData.jourMois) - 1;
|
||||||
this.calendrier.moisRdD = RdDCalendrier.getChiffreFromSigne(calendrierData.moisKey);
|
this.calendrier.moisRdD = RdDCalendrier.getChiffreFromSigne(calendrierData.moisKey);
|
||||||
this.calendrier.heureRdD = RdDCalendrier.getChiffreFromSigne(calendrierData.heureKey);
|
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();
|
await this.rebuildListeNombreAstral();
|
||||||
|
|
||||||
game.socket.emit(SYSTEM_SOCKET_ID, {
|
game.socket.emit(SYSTEM_SOCKET_ID, {
|
||||||
msg: "msg_sync_time",
|
msg: "msg_sync_time",
|
||||||
data: duplicate(this.calendrier)
|
data: foundry.utils.duplicate(this.calendrier)
|
||||||
});
|
});
|
||||||
|
|
||||||
this.updateDisplay();
|
this.updateDisplay();
|
||||||
@ -326,7 +326,7 @@ export class BoLCalendar extends Application {
|
|||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
async showCalendarEditor() {
|
async showCalendarEditor() {
|
||||||
let calendrierData = duplicate(this.fillCalendrierData());
|
let calendrierData = foundry.utils.duplicate(this.fillCalendrierData());
|
||||||
if (this.editeur == undefined) {
|
if (this.editeur == undefined) {
|
||||||
calendrierData.jourMoisOptions = RdDCalendrier.buildJoursMois();
|
calendrierData.jourMoisOptions = RdDCalendrier.buildJoursMois();
|
||||||
calendrierData.heuresOptions = [0, 1];
|
calendrierData.heuresOptions = [0, 1];
|
||||||
@ -344,7 +344,7 @@ export class BoLCalendar extends Application {
|
|||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
async showAstrologieEditor() {
|
async showAstrologieEditor() {
|
||||||
let calendrierData = duplicate(this.fillCalendrierData());
|
let calendrierData = foundry.utils.duplicate(this.fillCalendrierData());
|
||||||
let astrologieArray = [];
|
let astrologieArray = [];
|
||||||
this.listeNombreAstral = this.listeNombreAstral || [];
|
this.listeNombreAstral = this.listeNombreAstral || [];
|
||||||
for (let astralData of this.listeNombreAstral) {
|
for (let astralData of this.listeNombreAstral) {
|
||||||
@ -353,7 +353,7 @@ export class BoLCalendar extends Application {
|
|||||||
let actor = game.actors.get(vf.actorId);
|
let actor = game.actors.get(vf.actorId);
|
||||||
vf.actorName = (actor) ? actor.name : "Inconnu";
|
vf.actorName = (actor) ? actor.name : "Inconnu";
|
||||||
}
|
}
|
||||||
astrologieArray.push(duplicate(astralData));
|
astrologieArray.push(foundry.utils.duplicate(astralData));
|
||||||
}
|
}
|
||||||
let heuresParActeur = {};
|
let heuresParActeur = {};
|
||||||
for (let actor of game.actors) {
|
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.top = yPos;
|
||||||
game.system.rdd.calendrier.calendrierPos.left = xPos;
|
game.system.rdd.calendrier.calendrierPos.left = xPos;
|
||||||
if (game.user.isGM) {
|
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.top = 200;
|
||||||
game.system.rdd.calendrier.calendrierPos.left = 200;
|
game.system.rdd.calendrier.calendrierPos.left = 200;
|
||||||
if (game.user.isGM) {
|
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);
|
this.setPos(game.system.rdd.calendrier.calendrierPos);
|
||||||
}
|
}
|
||||||
|
@ -10,41 +10,25 @@ Init order =
|
|||||||
3 - Echec critique
|
3 - Echec critique
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
import { BoLUtility } from "../system/bol-utility.js";
|
||||||
|
|
||||||
|
|
||||||
export class BoLCombatManager extends Combat {
|
export class BoLCombatManager extends Combat {
|
||||||
|
|
||||||
/************************************************************************************/
|
/************************************************************************************/
|
||||||
async rollInitiative(ids, formula = undefined, messageOptions = {}) {
|
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
|
// Structure input data
|
||||||
ids = typeof ids === "string" ? [ids] : ids;
|
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
|
// calculate initiative
|
||||||
for (let cId = 0; cId < ids.length; cId++) {
|
for (let cId = 0; cId < ids.length; cId++) {
|
||||||
const combatant = this.combatants.get(ids[cId]);
|
const combatant = this.combatants.get(ids[cId])
|
||||||
let fvttInit = 5
|
let fvttInit = combatant.actor.getInitiativeRank(false, true, { combatId: this.id, combatantId: combatant.id, malusInit })
|
||||||
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
|
|
||||||
}
|
|
||||||
}
|
|
||||||
fvttInit += (cId / 100)
|
fvttInit += (cId / 100)
|
||||||
await this.updateEmbeddedDocuments("Combatant", [{ _id: ids[cId], initiative: fvttInit }]);
|
await this.updateEmbeddedDocuments("Combatant", [{ _id: ids[cId], initiative: fvttInit }]);
|
||||||
}
|
}
|
||||||
@ -52,14 +36,65 @@ export class BoLCombatManager extends Combat {
|
|||||||
|
|
||||||
/************************************************************************************/
|
/************************************************************************************/
|
||||||
nextRound() {
|
nextRound() {
|
||||||
let combatants = this.combatants.contents
|
if (game.user.isGM) {
|
||||||
for (let c of combatants) {
|
let combatants = this.combatants.contents
|
||||||
let actor = game.actors.get( c.data.actorId )
|
let autoRemoveDead = game.settings.get("bol", "auto-remove-dead") // Optionnal auto-removal of dead char.
|
||||||
actor.clearRoundModifiers()
|
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()
|
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 {
|
export class BoLCommands {
|
||||||
@ -7,7 +5,6 @@ export class BoLCommands {
|
|||||||
static init() {
|
static init() {
|
||||||
if (!game.bol.commands) {
|
if (!game.bol.commands) {
|
||||||
const bolCommands = new BoLCommands()
|
const bolCommands = new BoLCommands()
|
||||||
bolCommands.registerCommand({ path: ["/adventure"], func: (content, msg, params) => BoLAdventureGenerator.createAdventure(), descr: "Nouvelle idée d'aventure!" });
|
|
||||||
game.bol.commands = bolCommands
|
game.bol.commands = bolCommands
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -86,7 +83,7 @@ export class BoLCommands {
|
|||||||
console.log("===> Processing command")
|
console.log("===> Processing command")
|
||||||
let command = commandsTable[name];
|
let command = commandsTable[name];
|
||||||
path = path + name + " ";
|
path = path + name + " ";
|
||||||
if (command && command.subTable) {
|
if (command?.subTable) {
|
||||||
if (params[0]) {
|
if (params[0]) {
|
||||||
return this._processCommand(command.subTable, params[0], params.slice(1), content, msg, path)
|
return this._processCommand(command.subTable, params[0], params.slice(1), content, msg, path)
|
||||||
}
|
}
|
||||||
@ -95,9 +92,9 @@ export class BoLCommands {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (command && command.func) {
|
if (command?.func) {
|
||||||
const result = command.func(content, msg, params);
|
const result = command.func(content, msg, params);
|
||||||
if (result == false) {
|
if (!result) {
|
||||||
BoLCommands._chatAnswer(msg, command.descr);
|
BoLCommands._chatAnswer(msg, command.descr);
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
|
@ -2,6 +2,21 @@ import { BoLRoll } from "../controllers/bol-rolls.js";
|
|||||||
|
|
||||||
export class BoLHotbar {
|
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
|
* Create a macro when dropping an entity on the hotbar
|
||||||
* Item - open roll dialog for item
|
* Item - open roll dialog for item
|
||||||
@ -10,55 +25,20 @@ export class BoLHotbar {
|
|||||||
*/
|
*/
|
||||||
static init( ) {
|
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
|
// Create item macro if rollable item - weapon, spell, prayer, trait, or skill
|
||||||
if (documentData.type == "Item") {
|
if (documentData.type == "Item") {
|
||||||
console.log("Drop done !!!", bar, documentData, slot)
|
let item = fromUuidSync(documentData.uuid)
|
||||||
let item = documentData.data
|
if (item == undefined) {
|
||||||
let command = `game.bol.BoLHotbar.rollMacro("${item.name}", "${item.type}");`
|
item = this.actor.items.get(documentData.uuid)
|
||||||
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 })
|
|
||||||
}
|
}
|
||||||
game.user.assignHotbarMacro(macro, slot);
|
if (item && (item.system.subtype === "weapon" || item.system.category === "spell")) {
|
||||||
}
|
this.assignToHotBar( item, slot )
|
||||||
// Create a macro to open the actor sheet of the actor dropped on the hotbar
|
return false
|
||||||
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);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// Create a macro to open the journal sheet of the journal dropped on the hotbar
|
return true
|
||||||
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;
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Roll macro */
|
/** Roll macro */
|
||||||
@ -68,18 +48,18 @@ export class BoLHotbar {
|
|||||||
if (speaker.token) actor = game.actors.tokens[speaker.token]
|
if (speaker.token) actor = game.actors.tokens[speaker.token]
|
||||||
if (!actor) actor = game.actors.get(speaker.actor)
|
if (!actor) actor = game.actors.get(speaker.actor)
|
||||||
if (!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)
|
let item = actor.items.find(it => it.name === itemName && it.type == itemType)
|
||||||
if (!item ) {
|
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
|
// 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)
|
return BoLRoll.weaponCheckWithWeapon( actor, item)
|
||||||
}
|
}
|
||||||
if (item.data.data.category === "spell") {
|
if (item.system.category === "spell") {
|
||||||
return BoLRoll.spellCheckWithSpell( actor, item)
|
return BoLRoll.spellCheckWithSpell( actor, item)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,18 +1,16 @@
|
|||||||
import { BoLDefaultRoll } from "../controllers/bol-rolls.js";
|
import { BoLRoll, BoLDefaultRoll } from "../controllers/bol-rolls.js";
|
||||||
|
|
||||||
// Spell circle to min PP cost
|
// Spell circle to min PP cost
|
||||||
const __circle2minpp = { 0: 0, 1: 2, 2: 6, 3: 11 }
|
const __circle2minpp = { 0: 0, 1: 2, 2: 6, 3: 11 }
|
||||||
|
const __validDices = { "6": 1, "8": 1, "10": 1, "12": 1 }
|
||||||
export class BoLUtility {
|
export class BoLUtility {
|
||||||
|
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static init() {
|
static init() {
|
||||||
this.attackStore = {}
|
|
||||||
|
|
||||||
game.settings.register("bol", "rollArmor", {
|
game.settings.register("bol", "rollArmor", {
|
||||||
name: "Effectuer des jets pour les armures",
|
name: game.i18n.localize("BOL.settings.rollArmor"),
|
||||||
hint: "Effectue un jet de dés pour les armures (valeur fixe si désactivé)",
|
hint: game.i18n.localize("BOL.settings.rollArmorTooltip"),
|
||||||
scope: "world",
|
scope: "world",
|
||||||
config: true,
|
config: true,
|
||||||
default: true,
|
default: true,
|
||||||
@ -20,17 +18,92 @@ export class BoLUtility {
|
|||||||
onChange: lang => window.location.reload()
|
onChange: lang => window.location.reload()
|
||||||
})
|
})
|
||||||
game.settings.register("bol", "useBougette", {
|
game.settings.register("bol", "useBougette", {
|
||||||
name: "Utiliser la Bougette (règle fan-made)",
|
name: game.i18n.localize("BOL.settings.useBougette"),
|
||||||
hint: "Utilise un indicateur de Bougette, comme décrit dans l'aide de jeu Gold&Glory du RatierBretonnien (https://www.lahiette.com/leratierbretonnien/)",
|
hint: game.i18n.localize("BOL.settings.useBougetteTooltip"),
|
||||||
scope: "world",
|
scope: "world",
|
||||||
config: true,
|
config: true,
|
||||||
default: false,
|
default: false,
|
||||||
type: Boolean,
|
type: Boolean,
|
||||||
onChange: lang => window.location.reload()
|
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", {
|
game.settings.register("bol", "logoActorSheet", {
|
||||||
name: "Chemin du logo des fiches de perso",
|
name: game.i18n.localize("BOL.settings.defaultLogoActorSheetPath"),
|
||||||
hint: "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)",
|
hint: game.i18n.localize("BOL.settings.defaultLogoPathActorSheetTooltip"),
|
||||||
scope: "world",
|
scope: "world",
|
||||||
config: true,
|
config: true,
|
||||||
default: "/systems/bol/ui/logo.webp",
|
default: "/systems/bol/ui/logo.webp",
|
||||||
@ -38,21 +111,62 @@ export class BoLUtility {
|
|||||||
onChange: lang => window.location.reload()
|
onChange: lang => window.location.reload()
|
||||||
})
|
})
|
||||||
game.settings.register("bol", "logoTopLeft", {
|
game.settings.register("bol", "logoTopLeft", {
|
||||||
name: "Chemin du logo haut gauche",
|
name: game.i18n.localize("BOL.settings.defaultLogoTopLeftPath"),
|
||||||
hint: "Vous pouvez changer le logo BoL en haut à gauche de chaque écran (idéalement 718 x 416, défaut : /systems/bol/ui/logo2.webp)",
|
hint: game.i18n.localize("BOL.settings.defaultLogoTopLeftPathTooltip"),
|
||||||
scope: "world",
|
scope: "world",
|
||||||
config: true,
|
config: true,
|
||||||
default: "/systems/bol/ui/logo2.webp",
|
default: "/systems/bol/ui/logo2.webp",
|
||||||
type: String,
|
type: String,
|
||||||
onChange: lang => window.location.reload()
|
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.rollArmor = game.settings.get("bol", "rollArmor") // Roll armor or not
|
||||||
this.useBougette = game.settings.get("bol", "useBougette") // Use optionnal bougette rules
|
this.useBougette = game.settings.get("bol", "useBougette") // Use optionnal bougette rules
|
||||||
this.actorSheetLogo = game.settings.get("bol", "logoActorSheet") || "/systems/bol/ui/logo.webp"
|
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.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() {
|
static getRollArmor() {
|
||||||
return this.rollArmor
|
return this.rollArmor
|
||||||
@ -69,36 +183,64 @@ export class BoLUtility {
|
|||||||
static getLogoTopLeft() {
|
static getLogoTopLeft() {
|
||||||
return this.logoTopLeft
|
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() {
|
static async ready() {
|
||||||
//$("#logo").attr("src", this.getLogoTopLeft() )
|
//$("#logo").attr("src", this.getLogoTopLeft() )
|
||||||
$("#logo").css("content",`url(${this.getLogoTopLeft()})`)
|
$("#logo").css("content", `url(${this.getLogoTopLeft()})`)
|
||||||
|
|
||||||
|
CONFIG.statusEffects = foundry.utils.duplicate(game.bol.config.statusEffects)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static templateData(it) {
|
static chatDataSetup(content, modeOverride, isRoll = false, forceWhisper) {
|
||||||
return BoLUtility.data(it)?.data ?? {}
|
let chatData = {
|
||||||
}
|
user: game.user.id,
|
||||||
|
rollMode: modeOverride || game.settings.get("core", "rollMode"),
|
||||||
|
content: content
|
||||||
|
};
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
if (["gmroll", "blindroll"].includes(chatData.rollMode)) chatData["whisper"] = ChatMessage.getWhisperRecipients("GM").map(u => u.id);
|
||||||
static data(it) {
|
if (chatData.rollMode === "blindroll") chatData["blind"] = true;
|
||||||
if (it instanceof Actor || it instanceof Item || it instanceof Combatant) {
|
else if (chatData.rollMode === "selfroll") chatData["whisper"] = [game.user];
|
||||||
return it.data;
|
|
||||||
|
if (forceWhisper) { // Final force !
|
||||||
|
chatData["speaker"] = ChatMessage.getSpeaker();
|
||||||
|
chatData["whisper"] = ChatMessage.getWhisperRecipients(forceWhisper);
|
||||||
}
|
}
|
||||||
return it;
|
|
||||||
|
return chatData;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static storeRoll(roll) {
|
static postItem(chatData) {
|
||||||
this.rollTab[roll.id] = roll
|
// 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,
|
||||||
|
});
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
renderTemplate('systems/bol/templates/item/post-item.hbs', chatData).then(html => {
|
||||||
static getRoll(rollId) {
|
let chatOptions = BoLUtility.chatDataSetup(html);
|
||||||
return this.rollTab[roll.id]
|
ChatMessage.create(chatOptions)
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static createDirectOptionList(min, max) {
|
static createDirectOptionList(min, max) {
|
||||||
let options = {};
|
let options = {};
|
||||||
@ -143,7 +285,7 @@ export class BoLUtility {
|
|||||||
}
|
}
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static getUsers(filter) {
|
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) {
|
static getWhisperRecipients(rollMode, name) {
|
||||||
@ -173,7 +315,7 @@ export class BoLUtility {
|
|||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static blindMessageToGM(chatOptions) {
|
static blindMessageToGM(chatOptions) {
|
||||||
let chatGM = duplicate(chatOptions);
|
let chatGM = foundry.utils.duplicate(chatOptions);
|
||||||
chatGM.whisper = this.getUsers(user => user.isGM);
|
chatGM.whisper = this.getUsers(user => user.isGM);
|
||||||
chatGM.content = "Blind message of " + game.user.name + "<br>" + chatOptions.content;
|
chatGM.content = "Blind message of " + game.user.name + "<br>" + chatOptions.content;
|
||||||
console.log("blindMessageToGM", chatGM);
|
console.log("blindMessageToGM", chatGM);
|
||||||
@ -181,13 +323,13 @@ export class BoLUtility {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static sendAttackSuccess(attackDef) {
|
static sendAttackSuccess(rollData) {
|
||||||
if (attackDef.targetId) {
|
if (rollData.targetId) {
|
||||||
// Broadcast to GM or process it directly in case of GM defense
|
// Broadcast to GM or process it directly in case of GM defense
|
||||||
if (!game.user.isGM) {
|
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 {
|
} else {
|
||||||
BoLUtility.processAttackSuccess(attackDef)
|
BoLUtility.processAttackSuccess(rollData)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -199,7 +341,7 @@ export class BoLUtility {
|
|||||||
// If the user is the message author or the actor owner, proceed
|
// If the user is the message author or the actor owner, proceed
|
||||||
const actor = game.actors.get(data.message.speaker.actor)
|
const actor = game.actors.get(data.message.speaker.actor)
|
||||||
//console.log("FOUND 1!!! ", 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
|
else if (game.user.isGM || data.author.id === game.user.id) return
|
||||||
|
|
||||||
const divButtons = chatCard.find('.actions-section')
|
const divButtons = chatCard.find('.actions-section')
|
||||||
@ -213,6 +355,14 @@ export class BoLUtility {
|
|||||||
let message = game.messages.get(messageId)
|
let message = game.messages.get(messageId)
|
||||||
return message.getFlag("world", "bol-roll-data")
|
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) {
|
static cleanupButtons(id) {
|
||||||
@ -268,10 +418,15 @@ export class BoLUtility {
|
|||||||
|
|
||||||
html.on("click", '.damage-handling', event => {
|
html.on("click", '.damage-handling', event => {
|
||||||
event.preventDefault()
|
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 attackId = event.currentTarget.attributes['data-attack-id'].value
|
||||||
let defenseMode = event.currentTarget.attributes['data-defense-mode'].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
|
let weaponId = (event.currentTarget.attributes['data-weapon-id']) ? event.currentTarget.attributes['data-weapon-id'].value : -1
|
||||||
|
|
||||||
// Remove message for all
|
// Remove message for all
|
||||||
let msgId = BoLUtility.findChatMessageId(event.currentTarget)
|
let msgId = BoLUtility.findChatMessageId(event.currentTarget)
|
||||||
if (game.user.isGM) {
|
if (game.user.isGM) {
|
||||||
@ -280,75 +435,94 @@ export class BoLUtility {
|
|||||||
game.socket.emit("system.bol", { name: "msg_damage_handling", data: { msgId: msgId, attackId: attackId, defenseMode: defenseMode, weaponId: weaponId } })
|
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) {
|
if (!game.user.isGM) {
|
||||||
return
|
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)
|
console.log("Damage Handling", attackId, defenseMode, weaponId)
|
||||||
// Only GM process this
|
// Only GM process this
|
||||||
let attackDef = this.attackStore[attackId]
|
if (rollData?.defenderId) {
|
||||||
if (attackDef && attackDef.defenderId) {
|
if (rollData.defenseDone || defenseMode == 'damage-not-applied') {
|
||||||
if (attackDef.defenseDone) {
|
|
||||||
return
|
return
|
||||||
} // ?? Why ???
|
} // ?? Why ???
|
||||||
attackDef.defenseDone = true
|
rollData.defenseDone = true
|
||||||
attackDef.defenseMode = defenseMode
|
rollData.defenseMode = defenseMode
|
||||||
let token = game.scenes.current.tokens.get(attackDef.targetId)
|
let token = game.scenes.current.tokens.get(rollData.targetId)
|
||||||
let defender = token.actor
|
let defender = token.actor
|
||||||
|
|
||||||
if (defenseMode == 'damage-with-armor') {
|
if (defenseMode == 'damage-with-armor') {
|
||||||
let armorFormula = defender.getArmorFormula()
|
let armorFormula = defender.getArmorFormula()
|
||||||
attackDef.rollArmor = new Roll(armorFormula)
|
rollData.rollArmor = new Roll(armorFormula)
|
||||||
attackDef.rollArmor.roll({ async: false })
|
await rollData.rollArmor.roll()
|
||||||
attackDef.armorProtect = (attackDef.rollArmor.total < 0) ? 0 : attackDef.rollArmor.total
|
let msg = await rollData.rollArmor.toMessage({ flavor: "BOL.chat.armorRoll : " + armorFormula });
|
||||||
attackDef.finalDamage = attackDef.damageTotal - attackDef.armorProtect
|
if ( game.dice3d) { // wait animation end when DsN is there
|
||||||
attackDef.finalDamage = (attackDef.finalDamage < 0) ? 0 : attackDef.finalDamage
|
await game.dice3d.waitFor3DAnimationByMessageID(msg.id);
|
||||||
defender.sufferDamage(attackDef.finalDamage)
|
}
|
||||||
console.log("Armor roll -> result ", attackDef)
|
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') {
|
if (defenseMode == 'damage-without-armor') {
|
||||||
attackDef.finalDamage = attackDef.damageTotal
|
rollData.finalDamage = rollData.damageTotal
|
||||||
defender.sufferDamage(attackDef.finalDamage)
|
defender.sufferDamage(rollData.finalDamage)
|
||||||
}
|
}
|
||||||
if (defenseMode == 'hero-reduce-damage') {
|
if (defenseMode == 'hero-reduce-damage') {
|
||||||
let armorFormula = defender.getArmorFormula()
|
let armorFormula = defender.getArmorFormula()
|
||||||
attackDef.rollArmor = new Roll(armorFormula)
|
rollData.rollArmor = new Roll(armorFormula)
|
||||||
attackDef.rollArmor.roll({ async: false })
|
await rollData.rollArmor.roll()
|
||||||
attackDef.armorProtect = (attackDef.rollArmor.total < 0) ? 0 : attackDef.rollArmor.total
|
rollData.armorProtect = (rollData.rollArmor.total < 0) ? 0 : rollData.rollArmor.total
|
||||||
attackDef.rollHero = new Roll("1d6")
|
rollData.rollHero = new Roll("1d6")
|
||||||
attackDef.rollHero.roll({ async: false })
|
await rollData.rollHero.roll()
|
||||||
attackDef.finalDamage = attackDef.damageTotal - attackDef.rollHero.total - attackDef.armorProtect
|
rollData.finalDamage = rollData.damageTotal - rollData.rollHero.total - rollData.armorProtect
|
||||||
attackDef.finalDamage = (attackDef.finalDamage < 0) ? 0 : attackDef.finalDamage
|
rollData.finalDamage = (rollData.finalDamage < 0) ? 0 : rollData.finalDamage
|
||||||
defender.sufferDamage(attackDef.finalDamage)
|
await defender.sufferDamage(rollData.finalDamage)
|
||||||
defender.subHeroPoints(1)
|
defender.subHeroPoints(1)
|
||||||
}
|
}
|
||||||
if (defenseMode == 'hero-in-extremis') {
|
if (defenseMode == 'hero-in-extremis') {
|
||||||
attackDef.finalDamage = 0;
|
rollData.finalDamage = 0;
|
||||||
attackDef.weaponHero = defender.weapons.find(item => item._id == weaponId);
|
rollData.weaponHero = defender.weapons.find(item => item._id == weaponId);
|
||||||
defender.deleteEmbeddedDocuments("Item", [weaponId]);
|
await defender.deleteEmbeddedDocuments("Item", [weaponId]);
|
||||||
}
|
}
|
||||||
|
|
||||||
let defenderUser
|
let defenderUser
|
||||||
for (let user of game.users) {
|
for (let user of game.users) {
|
||||||
if ( user.character && user.character.id == defender.id ) {
|
if (user.character && user.character.id == defender.id) {
|
||||||
defenderUser = user
|
defenderUser = user
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
let damageResults = {
|
let damageResults = {
|
||||||
attackId: attackDef.id,
|
attackId: rollData.id,
|
||||||
attacker: attackDef.attacker,
|
attacker: rollData.attacker,
|
||||||
rollArmor: attackDef.rollArmor,
|
rollArmor: rollData.rollArmor,
|
||||||
rollHero: attackDef.rollHero,
|
rollHero: rollData.rollHero,
|
||||||
weaponHero: attackDef.weaponHero,
|
weaponHero: rollData.weaponHero,
|
||||||
armorProtect: attackDef.armorProtect,
|
armorProtect: rollData.armorProtect,
|
||||||
name: defender.name,
|
name: defender.name,
|
||||||
defender: defender,
|
defender: defender,
|
||||||
defenseMode: attackDef.defenseMode,
|
defenseMode: rollData.defenseMode,
|
||||||
finalDamage: attackDef.finalDamage
|
finalDamage: rollData.finalDamage
|
||||||
}
|
}
|
||||||
ChatMessage.create({
|
ChatMessage.create({
|
||||||
alias: defender.name,
|
alias: defender.name,
|
||||||
@ -392,7 +566,7 @@ export class BoLUtility {
|
|||||||
}
|
}
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static isRangedWeapon(weapon) {
|
static isRangedWeapon(weapon) {
|
||||||
return weapon.data.type == 'ranged' || weapon.data.thrown;
|
return weapon.system.type == 'ranged' || weapon.system.thrown;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
@ -435,28 +609,29 @@ export class BoLUtility {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static async processAttackSuccess(attackDef) {
|
static async processAttackSuccess(rollData) {
|
||||||
console.log("Attack success processing", attackDef)
|
console.log("Attack success processing", rollData)
|
||||||
if (!game.user.isGM || !attackDef.defenderId) { // Only GM process this
|
if (!game.user.isGM || !rollData.defenderId) { // Only GM process this
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
// Build and send the defense message to the relevant people (ie GM + defender)
|
// Build and send the defense message to the relevant people (ie GM + defender)
|
||||||
let defender = game.actors.get(attackDef.defenderId)
|
let defender = game.actors.get(rollData.defenderId)
|
||||||
console.log("DEF WEP", attackDef, defender)
|
|
||||||
let defenderWeapons = defender.weapons || []
|
let defenderWeapons = defender.weapons || []
|
||||||
this.attackStore[attackDef.id] = attackDef // Store !
|
let msg = await ChatMessage.create({
|
||||||
ChatMessage.create({
|
|
||||||
alias: defender.name,
|
alias: defender.name,
|
||||||
whisper: BoLUtility.getWhisperRecipientsAndGMs(defender.name),
|
whisper: BoLUtility.getWhisperRecipientsAndGMs(defender.name),
|
||||||
content: await renderTemplate('systems/bol/templates/chat/rolls/defense-request-card.hbs', {
|
content: await renderTemplate('systems/bol/templates/chat/rolls/defense-request-card.hbs', {
|
||||||
attackId: attackDef.id,
|
attackId: rollData.id,
|
||||||
attacker: attackDef.attacker,
|
attacker: rollData.attacker,
|
||||||
defender: defender,
|
defender: defender,
|
||||||
|
defenderHeroPoints:defender.getHeroPoints(),
|
||||||
defenderWeapons: defenderWeapons,
|
defenderWeapons: defenderWeapons,
|
||||||
damageTotal: attackDef.damageRoll.total,
|
damageTotal: rollData.damageTotal,
|
||||||
damagesIgnoresArmor: attackDef.damagesIgnoresArmor,
|
damagesIgnoresArmor: rollData.damagesIgnoresArmor,
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
msg.setFlag("world", "bol-roll-data", rollData)
|
||||||
|
console.log("DEF WEP", rollData, defender)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
@ -467,6 +642,9 @@ export class BoLUtility {
|
|||||||
if (sockmsg.name == "msg_cleanup_buttons") {
|
if (sockmsg.name == "msg_cleanup_buttons") {
|
||||||
$(`#${sockmsg.data.id}`).hide() // Hide the options roll 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") {
|
if (sockmsg.name == "msg_damage_handling") {
|
||||||
BoLUtility.processDamageHandling(sockmsg.data.attackId, sockmsg.data.defenseMode, sockmsg.data.weaponId, sockmsg.data.msgId)
|
BoLUtility.processDamageHandling(sockmsg.data.attackId, sockmsg.data.defenseMode, sockmsg.data.weaponId, sockmsg.data.msgId)
|
||||||
}
|
}
|
||||||
@ -474,15 +652,15 @@ export class BoLUtility {
|
|||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static computeSpellCost(spell, nbOptCond = 0) {
|
static computeSpellCost(spell, nbOptCond = 0) {
|
||||||
let pp = spell.data.properties.ppcost
|
let pp = spell.system.properties.ppcost
|
||||||
let minpp = __circle2minpp[spell.data.properties.circle]
|
let minpp = __circle2minpp[spell.system.properties.circle]
|
||||||
pp = (pp - nbOptCond < minpp) ? minpp : pp - nbOptCond
|
pp = (pp - nbOptCond < minpp) ? minpp : pp - nbOptCond
|
||||||
return pp
|
return pp
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static getDamageFormula(weaponData, fightOption) {
|
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 damageString = weaponData.properties.damage
|
||||||
let modifier = weaponData.properties.damageModifiers ?? 0
|
let modifier = weaponData.properties.damageModifiers ?? 0
|
||||||
let multiplier = weaponData.properties.damageMultiplier ?? 1
|
let multiplier = weaponData.properties.damageMultiplier ?? 1
|
||||||
@ -494,11 +672,10 @@ export class BoLUtility {
|
|||||||
|
|
||||||
let formula = damageString
|
let formula = damageString
|
||||||
if (damageString.includes("d") || damageString.includes("D")) {
|
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 res = myReg.exec(damageString)
|
||||||
let nbDice = parseInt(res[1])
|
let nbDice = parseInt(res[1])
|
||||||
let postForm = 'kh' + nbDice
|
let postForm = 'kh' + nbDice
|
||||||
let modIndex = 3
|
|
||||||
// Upgrade damage if needed
|
// Upgrade damage if needed
|
||||||
if (upgradeDamage && (!res[3] || res[3] == "")) {
|
if (upgradeDamage && (!res[3] || res[3] == "")) {
|
||||||
res[3] = "B" // Upgrade to bonus
|
res[3] = "B" // Upgrade to bonus
|
||||||
@ -510,22 +687,18 @@ export class BoLUtility {
|
|||||||
if (res[3] == 'M') {
|
if (res[3] == 'M') {
|
||||||
postForm = 'kl' + nbDice
|
postForm = 'kl' + nbDice
|
||||||
nbDice++
|
nbDice++
|
||||||
modIndex = 4
|
|
||||||
}
|
}
|
||||||
if (res[3] == 'MM') {
|
if (res[3] == 'MM') {
|
||||||
postForm = 'kl' + nbDice
|
postForm = 'kl' + nbDice
|
||||||
nbDice += 2
|
nbDice += 2
|
||||||
modIndex = 4
|
|
||||||
}
|
}
|
||||||
if (res[3] == 'B') {
|
if (res[3] == 'B') {
|
||||||
postForm = 'kh' + nbDice
|
postForm = 'kh' + nbDice
|
||||||
nbDice++
|
nbDice++
|
||||||
modIndex = 4
|
|
||||||
}
|
}
|
||||||
if (res[3] == 'BB') {
|
if (res[3] == 'BB') {
|
||||||
postForm = 'kh' + nbDice
|
postForm = 'kh' + nbDice
|
||||||
nbDice += 2
|
nbDice += 2
|
||||||
modIndex = 4
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
formula = "(" + nbDice + "d" + res[2] + reroll + postForm + "+" + modifier + ") *" + multiplier
|
formula = "(" + nbDice + "d" + res[2] + reroll + postForm + "+" + modifier + ") *" + multiplier
|
||||||
@ -534,31 +707,53 @@ export class BoLUtility {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static async confirmDelete(actorSheet, li) {
|
static async loadCompendiumData(compendium) {
|
||||||
let itemId = li.data("item-id");
|
const pack = game.packs.get(compendium);
|
||||||
let msgTxt = "<p>Are you sure to remove this Item ?";
|
return await pack?.getDocuments() ?? [];
|
||||||
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 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 = {};
|
export const BOL = {};
|
||||||
|
|
||||||
BOL.damageValues = {
|
BOL.damageValues = {
|
||||||
"1": "1",
|
"0": "0",
|
||||||
"2": "2",
|
"1": "1",
|
||||||
"3": "3",
|
"2": "2",
|
||||||
"d3" : "d3",
|
"3": "3",
|
||||||
"d6M" : "d6M (Malus)",
|
"d3": "d3",
|
||||||
"d6" : "d6",
|
"d6M": "d6M (Malus)",
|
||||||
"d6B" : "d6B (Bonus)",
|
"d6": "d6",
|
||||||
"d6BB" : "d6B + dé bonus",
|
"d6B": "d6B (Bonus)",
|
||||||
|
"d6BB": "d6B + dé bonus",
|
||||||
}
|
}
|
||||||
|
|
||||||
BOL.damageMultiplier = {
|
BOL.damageMultiplier = {
|
||||||
@ -25,6 +26,19 @@ BOL.damageMultiplier = {
|
|||||||
"2": "x2",
|
"2": "x2",
|
||||||
"3": "x3",
|
"3": "x3",
|
||||||
"4": "x4",
|
"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 = {
|
BOL.spellType = {
|
||||||
@ -42,116 +56,125 @@ BOL.alchemyType = {
|
|||||||
}
|
}
|
||||||
|
|
||||||
BOL.equipmentSlots = {
|
BOL.equipmentSlots = {
|
||||||
"none" : "BOL.equipmentSlots.none",
|
"none": "BOL.equipmentSlots.none",
|
||||||
"head" : "BOL.equipmentSlots.head",
|
"head": "BOL.equipmentSlots.head",
|
||||||
"neck" : "BOL.equipmentSlots.neck",
|
"neck": "BOL.equipmentSlots.neck",
|
||||||
"shoulders" : "BOL.equipmentSlots.shoulders",
|
"shoulders": "BOL.equipmentSlots.shoulders",
|
||||||
"body" : "BOL.equipmentSlots.body",
|
"body": "BOL.equipmentSlots.body",
|
||||||
"rhand" : "BOL.equipmentSlots.rhand",
|
"rhand": "BOL.equipmentSlots.rhand",
|
||||||
"lhand" : "BOL.equipmentSlots.lhand",
|
"lhand": "BOL.equipmentSlots.lhand",
|
||||||
"2hands" : "BOL.equipmentSlots.2hands",
|
"2hands": "BOL.equipmentSlots.2hands",
|
||||||
"rarm" : "BOL.equipmentSlots.rarm",
|
"rarm": "BOL.equipmentSlots.rarm",
|
||||||
"larm" : "BOL.equipmentSlots.larm",
|
"larm": "BOL.equipmentSlots.larm",
|
||||||
"chest" : "BOL.equipmentSlots.chest",
|
"chest": "BOL.equipmentSlots.chest",
|
||||||
"belt" : "BOL.equipmentSlots.belt",
|
"belt": "BOL.equipmentSlots.belt",
|
||||||
"legs" : "BOL.equipmentSlots.legs",
|
"legs": "BOL.equipmentSlots.legs",
|
||||||
"feet" : "BOL.equipmentSlots.feet",
|
"feet": "BOL.equipmentSlots.feet",
|
||||||
"finder" : "BOL.equipmentSlots.finder",
|
"finder": "BOL.equipmentSlots.finder",
|
||||||
"ear" : "BOL.equipmentSlots.ear"
|
"ear": "BOL.equipmentSlots.ear"
|
||||||
}
|
}
|
||||||
|
|
||||||
BOL.armorQualities = {
|
BOL.armorQualities = {
|
||||||
"none" : "BOL.armorQuality.none",
|
"none": "BOL.armorQuality.none",
|
||||||
"light" : "BOL.armorQuality.light",
|
"light": "BOL.armorQuality.light",
|
||||||
"lightQ" : "BOL.armorQuality.lightQ",
|
"lightQ": "BOL.armorQuality.lightQ",
|
||||||
"lightSup" : "BOL.armorQuality.lightSup",
|
"lightSup": "BOL.armorQuality.lightSup",
|
||||||
"lightLeg" : "BOL.armorQuality.lightLeg",
|
"lightLeg": "BOL.armorQuality.lightLeg",
|
||||||
"medium" : "BOL.armorQuality.medium",
|
"medium": "BOL.armorQuality.medium",
|
||||||
"mediumQ" : "BOL.armorQuality.mediumQ",
|
"mediumQ": "BOL.armorQuality.mediumQ",
|
||||||
"mediumSup" : "BOL.armorQuality.mediumSup",
|
"mediumSup": "BOL.armorQuality.mediumSup",
|
||||||
"mediumLeg" : "BOL.armorQuality.mediumLeg",
|
"mediumLeg": "BOL.armorQuality.mediumLeg",
|
||||||
"heavy" : "BOL.armorQuality.heavy",
|
"heavy": "BOL.armorQuality.heavy",
|
||||||
"heavyQ" : "BOL.armorQuality.heavyQ",
|
"heavyQ": "BOL.armorQuality.heavyQ",
|
||||||
"heavySup" : "BOL.armorQuality.heavySup",
|
"heavySup": "BOL.armorQuality.heavySup",
|
||||||
"heavyLeg" : "BOL.armorQuality.heavyLeg"
|
"heavyLeg": "BOL.armorQuality.heavyLeg"
|
||||||
}
|
}
|
||||||
|
|
||||||
BOL.soakFormulas = {
|
BOL.soakFormulas = {
|
||||||
"none" : "0",
|
"none": "0",
|
||||||
"light" : "1d6-3",
|
"light": "1d6-3",
|
||||||
"lightQ" : "1d6r1-3",
|
"lightQ": "1d6r1-3",
|
||||||
"lightSup" : "1d6-2",
|
"lightSup": "1d6-2",
|
||||||
"lightLeg" : "2d6kh1-2",
|
"lightLeg": "2d6kh1-2",
|
||||||
"medium" : "1d6-2",
|
"medium": "1d6-2",
|
||||||
"mediumQ" : "1d6r1-2",
|
"mediumQ": "1d6r1-2",
|
||||||
"mediumSup" : "1d6-1",
|
"mediumSup": "1d6-1",
|
||||||
"mediumLeg" : "2d6kh1-1",
|
"mediumLeg": "2d6kh1-1",
|
||||||
"heavy" : "1d6-1",
|
"heavy": "1d6-1",
|
||||||
"heavyQ" : "1d6r1-1",
|
"heavyQ": "1d6r1-1",
|
||||||
"heavySup" : "1d6",
|
"heavySup": "1d6",
|
||||||
"heavyLeg" : "2d6kh1"
|
"heavyLeg": "2d6kh1"
|
||||||
}
|
}
|
||||||
|
|
||||||
BOL.attackAttributes = {
|
BOL.attackAttributes = {
|
||||||
"vigor" : "BOL.attributes.vigor",
|
"vigor": "BOL.attributes.vigor",
|
||||||
"agility" : "BOL.attributes.agility",
|
"agility": "BOL.attributes.agility",
|
||||||
"mind" : "BOL.attributes.mind",
|
"mind": "BOL.attributes.mind",
|
||||||
"appeal" : "BOL.attributes.appeal"
|
"appeal": "BOL.attributes.appeal"
|
||||||
}
|
}
|
||||||
|
|
||||||
BOL.attackAptitudes = {
|
BOL.attackAptitudes = {
|
||||||
"melee" : "BOL.aptitudes.melee",
|
"melee": "BOL.aptitudes.melee",
|
||||||
"ranged" : "BOL.aptitudes.ranged"
|
"ranged": "BOL.aptitudes.ranged"
|
||||||
}
|
}
|
||||||
|
|
||||||
BOL.aptitudes = {
|
BOL.aptitudes = {
|
||||||
"melee" : "BOL.aptitudes.melee",
|
"melee": "BOL.aptitudes.melee",
|
||||||
"ranged" : "BOL.aptitudes.ranged",
|
"ranged": "BOL.aptitudes.ranged",
|
||||||
"init" : "BOL.aptitudes.init",
|
"init": "BOL.aptitudes.init",
|
||||||
"def" : "BOL.aptitudes.def"
|
"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 = {
|
BOL.weaponSizes = {
|
||||||
"unarmed" : "BOL.weaponSize.unarmed",
|
"unarmed": "BOL.weaponSize.unarmed",
|
||||||
"improvised" : "BOL.weaponSize.improvised",
|
"improvised": "BOL.weaponSize.improvised",
|
||||||
"light" : "BOL.weaponSize.light",
|
"light": "BOL.weaponSize.light",
|
||||||
"medium" : "BOL.weaponSize.medium",
|
"medium": "BOL.weaponSize.medium",
|
||||||
"heavy" : "BOL.weaponSize.heavy"
|
"heavy": "BOL.weaponSize.heavy"
|
||||||
}
|
}
|
||||||
|
|
||||||
BOL.damageAttributes = {
|
BOL.damageAttributes = {
|
||||||
"zero" : "0",
|
"zero": "0",
|
||||||
"vigor" : "BOL.attributes.vigor",
|
"vigor": "BOL.attributes.vigor",
|
||||||
"half-vigor" : "BOL.attributes.halfvigor"
|
"half-vigor": "BOL.attributes.halfvigor"
|
||||||
}
|
}
|
||||||
|
|
||||||
BOL.itemCategories = {
|
BOL.itemCategories = {
|
||||||
"equipment" : "BOL.itemCategory.equipment",
|
"equipment": "BOL.itemCategory.equipment",
|
||||||
"capacity" : "BOL.itemCategory.capacity",
|
"capacity": "BOL.itemCategory.capacity",
|
||||||
"spell" : "BOL.itemCategory.spell",
|
"spell": "BOL.itemCategory.spell",
|
||||||
"alchemy" : "BOL.itemCategory.alchemy",
|
"alchemy": "BOL.itemCategory.alchemy",
|
||||||
"vehicle" : "BOL.itemCategory.vehicle",
|
"vehicle": "BOL.itemCategory.vehicle",
|
||||||
"other" : "BOL.itemCategory.other"
|
"vehicleweapon": "BOL.itemCategory.vehicleweapon",
|
||||||
|
"other": "BOL.itemCategory.other"
|
||||||
}
|
}
|
||||||
|
|
||||||
BOL.itemSubtypes = {
|
BOL.itemSubtypes = {
|
||||||
"armor" : "BOL.equipmentCategory.armor",
|
"armor": "BOL.equipmentCategory.armor",
|
||||||
"weapon" : "BOL.equipmentCategory.weapon",
|
"weapon": "BOL.equipmentCategory.weapon",
|
||||||
"shield" : "BOL.equipmentCategory.shield",
|
"shield": "BOL.equipmentCategory.shield",
|
||||||
"helm" : "BOL.equipmentCategory.helm",
|
"helm": "BOL.equipmentCategory.helm",
|
||||||
"jewel" : "BOL.equipmentCategory.jewel",
|
"jewel": "BOL.equipmentCategory.jewel",
|
||||||
"scroll" : "BOL.equipmentCategory.scroll",
|
"scroll": "BOL.equipmentCategory.scroll",
|
||||||
"container" : "BOL.equipmentCategory.container",
|
"container": "BOL.equipmentCategory.container",
|
||||||
"ammunition" : "BOL.equipmentCategory.ammunition",
|
"ammunition": "BOL.equipmentCategory.ammunition",
|
||||||
"currency" : "BOL.equipmentCategory.currency",
|
"currency": "BOL.equipmentCategory.currency",
|
||||||
"other" : "BOL.equipmentCategory.other"
|
"other": "BOL.equipmentCategory.other"
|
||||||
}
|
}
|
||||||
|
|
||||||
BOL.vehicleSubtypes = {
|
BOL.vehicleSubtypes = {
|
||||||
"mount" : "BOL.vehicleCategory.mount",
|
"mount": "BOL.vehicleCategory.mount",
|
||||||
"flying" : "BOL.vehicleCategory.flying",
|
"flying": "BOL.vehicleCategory.flying",
|
||||||
"boat" : "BOL.vehicleCategory.boat",
|
"boat": "BOL.vehicleCategory.boat",
|
||||||
"other" : "BOL.vehicleCategory.other"
|
"other": "BOL.vehicleCategory.other"
|
||||||
}
|
}
|
||||||
|
|
||||||
// BOL.equipmentCategories = {
|
// BOL.equipmentCategories = {
|
||||||
@ -167,95 +190,153 @@ BOL.vehicleSubtypes = {
|
|||||||
// "other" : "BOL.equipmentCategory.other"
|
// "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 = {
|
BOL.protectionCategories = {
|
||||||
"armor" : "BOL.protectionCategory.armor",
|
"armor": "BOL.protectionCategory.armor",
|
||||||
"shield" : "BOL.protectionCategory.shield",
|
"shield": "BOL.protectionCategory.shield",
|
||||||
"helm" : "BOL.protectionCategory.helm",
|
"helm": "BOL.protectionCategory.helm",
|
||||||
"other" : "BOL.protectionCategory.other"
|
"other": "BOL.protectionCategory.other"
|
||||||
}
|
}
|
||||||
|
|
||||||
BOL.weaponCategories = {
|
BOL.weaponCategories = {
|
||||||
"melee" : "BOL.weaponCategory.melee",
|
"melee": "BOL.weaponCategory.melee",
|
||||||
"ranged" : "BOL.weaponCategory.ranged",
|
"ranged": "BOL.weaponCategory.ranged",
|
||||||
"other" : "BOL.weaponCategory.other"
|
"other": "BOL.weaponCategory.other"
|
||||||
}
|
}
|
||||||
|
|
||||||
BOL.itemProperties1 = {
|
BOL.itemProperties1 = {
|
||||||
"equipable" : "BOL.itemProperty.equipable",
|
"equipable": "BOL.itemProperty.equipable",
|
||||||
"protection" : "BOL.itemProperty.protection",
|
"protection": "BOL.itemProperty.protection",
|
||||||
"magical" : "BOL.itemProperty.magical",
|
"magical": "BOL.itemProperty.magical",
|
||||||
"worn" : "BOL.itemProperty.worn",
|
"worn": "BOL.itemProperty.worn",
|
||||||
}
|
}
|
||||||
|
|
||||||
BOL.itemProperties2 = {
|
BOL.itemProperties2 = {
|
||||||
"equipable" : "BOL.itemProperty.equipable",
|
"equipable": "BOL.itemProperty.equipable",
|
||||||
"protection" : "BOL.itemProperty.protection",
|
"protection": "BOL.itemProperty.protection",
|
||||||
"blocking" : "BOL.itemProperty.blocking",
|
"blocking": "BOL.itemProperty.blocking",
|
||||||
"magical" : "BOL.itemProperty.magical",
|
"magical": "BOL.itemProperty.magical",
|
||||||
"concealable" : "BOL.itemProperty.concealable",
|
"concealable": "BOL.itemProperty.concealable",
|
||||||
"2H" : "BOL.itemProperty.2H",
|
"2H": "BOL.itemProperty.2H",
|
||||||
"helm" : "BOL.itemProperty.helm",
|
"helm": "BOL.itemProperty.helm",
|
||||||
"improvised" : "BOL.itemProperty.improvised",
|
"improvised": "BOL.itemProperty.improvised",
|
||||||
"shield" : "BOL.itemProperty.shield",
|
"shield": "BOL.itemProperty.shield",
|
||||||
"melee" : "BOL.itemProperty.melee",
|
"melee": "BOL.itemProperty.melee",
|
||||||
"throwable" : "BOL.itemProperty.throwable",
|
"throwable": "BOL.itemProperty.throwable",
|
||||||
"ignoreshield" : "BOL.itemProperty.ignoreshield",
|
"ignoreshield": "BOL.itemProperty.ignoreshield",
|
||||||
"bashing" : "BOL.itemProperty.bashing",
|
"bashing": "BOL.itemProperty.bashing",
|
||||||
"stackable" : "BOL.itemProperty.stackable",
|
"stackable": "BOL.itemProperty.stackable",
|
||||||
"ranged" : "BOL.itemProperty.ranged",
|
"ranged": "BOL.itemProperty.ranged",
|
||||||
"weapon" : "BOL.itemProperty.weapon",
|
"weapon": "BOL.itemProperty.weapon",
|
||||||
"reloadable" : "BOL.itemProperty.reloadable",
|
"reloadable": "BOL.itemProperty.reloadable",
|
||||||
"worn" : "BOL.itemProperty.worn",
|
"worn": "BOL.itemProperty.worn",
|
||||||
"spell" : "BOL.itemProperty.spell",
|
"spell": "BOL.itemProperty.spell",
|
||||||
"armor" : "BOL.itemProperty.armor",
|
"armor": "BOL.itemProperty.armor",
|
||||||
"consumable" : "BOL.itemProperty.consumable",
|
"consumable": "BOL.itemProperty.consumable",
|
||||||
"bow" : "BOL.itemProperty.bow",
|
"bow": "BOL.itemProperty.bow",
|
||||||
"crossbow" : "BOL.itemProperty.crossbow",
|
"crossbow": "BOL.itemProperty.crossbow",
|
||||||
"throwing" : "BOL.itemProperty.throwing",
|
"throwing": "BOL.itemProperty.throwing",
|
||||||
"activable" : "BOL.itemProperty.activable",
|
"activable": "BOL.itemProperty.activable",
|
||||||
"powder" : "BOL.itemProperty.powder",
|
"powder": "BOL.itemProperty.powder",
|
||||||
"damage" : "BOL.itemProperty.damage",
|
"damage": "BOL.itemProperty.damage",
|
||||||
"difficulty": "BOL.itemProperty.difficulty"
|
"difficulty": "BOL.itemProperty.difficulty"
|
||||||
}
|
}
|
||||||
|
|
||||||
BOL.itemStats = {
|
BOL.itemStats = {
|
||||||
"quantity" : "BOL.itemStat.quantity",
|
"quantity": "BOL.itemStat.quantity",
|
||||||
"weight" : "BOL.itemStat.weight",
|
"weight": "BOL.itemStat.weight",
|
||||||
"price" : "BOL.itemStat.price",
|
"price": "BOL.itemStat.price",
|
||||||
"range" : "BOL.itemStat.range",
|
"range": "BOL.itemStat.range",
|
||||||
"damage" : "BOL.itemStat.damage",
|
"damage": "BOL.itemStat.damage",
|
||||||
"reload" : "BOL.itemStat.reload",
|
"reload": "BOL.itemStat.reload",
|
||||||
"soak" : "BOL.itemStat.soak",
|
"soak": "BOL.itemStat.soak",
|
||||||
"blocking" : "BOL.itemStat.blocking",
|
"blocking": "BOL.itemStat.blocking",
|
||||||
"modifiers" : "BOL.itemStat.modifiers"
|
"modifiers": "BOL.itemStat.modifiers"
|
||||||
}
|
}
|
||||||
|
|
||||||
BOL.itemModifiers = {
|
BOL.itemModifiers = {
|
||||||
"init" : "BOL.itemModifiers.init",
|
"init": "BOL.itemModifiers.init",
|
||||||
"social" : "BOL.itemModifiers.social",
|
"social": "BOL.itemModifiers.social",
|
||||||
"agility" : "BOL.itemModifiers.agility",
|
"agility": "BOL.itemModifiers.agility",
|
||||||
"powercost" : "BOL.itemModifiers.powercost"
|
"powercost": "BOL.itemModifiers.powercost"
|
||||||
}
|
}
|
||||||
|
|
||||||
BOL.itemBlocking = {
|
BOL.itemBlocking = {
|
||||||
"malus" : "BOL.itemBlocking.malus",
|
"malus": "BOL.itemBlocking.malus",
|
||||||
"nbAttacksPerRound" : "BOL.itemBlocking.nbAttacksPerRound"
|
"nbAttacksPerRound": "BOL.itemBlocking.nbAttacksPerRound"
|
||||||
}
|
}
|
||||||
|
|
||||||
BOL.itemSoak = {
|
BOL.itemSoak = {
|
||||||
"formula" : "BOL.itemSoak.formula",
|
"formula": "BOL.itemSoak.formula",
|
||||||
"value" : "BOL.itemSoak.value"
|
"value": "BOL.itemSoak.value"
|
||||||
}
|
}
|
||||||
|
|
||||||
BOL.featureSubtypes = {
|
BOL.featureSubtypes = {
|
||||||
"origin" : "BOL.featureSubtypes.origin",
|
"origin": "BOL.featureSubtypes.origin",
|
||||||
"race" : "BOL.featureSubtypes.race",
|
"race": "BOL.featureSubtypes.race",
|
||||||
"career" : "BOL.featureSubtypes.career",
|
"career": "BOL.featureSubtypes.career",
|
||||||
"boon" : "BOL.featureSubtypes.boon",
|
"boon": "BOL.featureSubtypes.boon",
|
||||||
"flaw" : "BOL.featureSubtypes.flaw",
|
"flaw": "BOL.featureSubtypes.flaw",
|
||||||
"language" : "BOL.featureSubtypes.language",
|
"language": "BOL.featureSubtypes.language",
|
||||||
"godsfaith" : "BOL.featureSubtypes.gods",
|
"godsfaith": "BOL.featureSubtypes.gods",
|
||||||
"fightoption" : "BOL.featureSubtypes.fightOption"
|
"fightoption": "BOL.featureSubtypes.fightOption",
|
||||||
|
"boleffect": "BOL.featureSubtypes.effect",
|
||||||
|
"horoscope": "BOL.featureSubtypes.horoscope",
|
||||||
|
"xplog": "BOL.featureSubtypes.xplog",
|
||||||
}
|
}
|
||||||
|
|
||||||
BOL.fightOptionTypes = {
|
BOL.fightOptionTypes = {
|
||||||
@ -266,43 +347,322 @@ BOL.fightOptionTypes = {
|
|||||||
"fulldefense": "BOL.fightOptionTypes.fulldefense",
|
"fulldefense": "BOL.fightOptionTypes.fulldefense",
|
||||||
"defense": "BOL.fightOptionTypes.defense",
|
"defense": "BOL.fightOptionTypes.defense",
|
||||||
"attack": "BOL.fightOptionTypes.attack",
|
"attack": "BOL.fightOptionTypes.attack",
|
||||||
|
"other": "BOL.fightOptionTypes.other"
|
||||||
}
|
}
|
||||||
|
|
||||||
BOL.itemIcons = {
|
BOL.itemIcons = {
|
||||||
"item": "icons/containers/chest/chest-worn-oak-tan.webp",
|
"item": "icons/containers/chest/chest-worn-oak-tan.webp",
|
||||||
"capacity": "icons/sundries/scrolls/scroll-plain-tan-red.webp",
|
"feature": "icons/sundries/scrolls/scroll-plain-tan-red.webp",
|
||||||
"species": "icons/environment/people/group.webp",
|
"species": "icons/environment/people/group.webp",
|
||||||
"profile": "icons/sundries/documents/blueprint-axe.webp",
|
"profile": "icons/sundries/documents/blueprint-axe.webp",
|
||||||
"path": "icons/sundries/books/book-embossed-gold-red.webp"
|
"path": "icons/sundries/books/book-embossed-gold-red.webp"
|
||||||
}
|
}
|
||||||
|
|
||||||
BOL.actorIcons = {
|
BOL.actorIcons = {
|
||||||
"npc": "icons/environment/people/commoner.webp",
|
"npc": "icons/environment/people/commoner.webp",
|
||||||
"encounter": "icons/svg/mystery-man-black.svg",
|
"encounter": "icons/svg/mystery-man-black.svg",
|
||||||
"loot": "icons/containers/bags/sack-simple-leather-brown.webp"
|
"loot": "icons/containers/bags/sack-simple-leather-brown.webp"
|
||||||
}
|
}
|
||||||
|
|
||||||
BOL.bougetteState = {
|
BOL.bougetteState = {
|
||||||
"nomoney": "BOL.bougette.nomoney",
|
"0": "BOL.bougette.nomoney",
|
||||||
"tolive": "BOL.bougette.tolive",
|
"1": "BOL.bougette.tolive",
|
||||||
"easylife": "BOL.bougette.easylife",
|
"2": "BOL.bougette.easylife",
|
||||||
"luxury": "BOL.bougette.luxury",
|
"3": "BOL.bougette.luxury",
|
||||||
"rich": "BOL.bougette.rich"
|
"4": "BOL.bougette.rich"
|
||||||
|
}
|
||||||
|
BOL.bougetteDice = {
|
||||||
|
"0": "0",
|
||||||
|
"1": "2d6-1",
|
||||||
|
"2": "2d6",
|
||||||
|
"3": "2d6+1",
|
||||||
|
"4": "2d6+2"
|
||||||
}
|
}
|
||||||
|
|
||||||
BOL.creatureSize = {
|
BOL.creatureSize = {
|
||||||
"tiny": "BOL.size.tiny",
|
"tiny": { order: 1, label: "BOL.size.tiny" },
|
||||||
"verysmall": "BOL.size.verysmall",
|
"verysmall": { order: 2, label: "BOL.size.verysmall" },
|
||||||
"small": "BOL.size.small",
|
"small": { order: 3, label: "BOL.size.small" },
|
||||||
"medium": "BOL.size.medium",
|
"medium": { order: 4, label: "BOL.size.medium" },
|
||||||
"large": "BOL.size.large",
|
"large": { order: 5, label: "BOL.size.large" },
|
||||||
"verylarge": "BOL.size.verylarge",
|
"verylarge": { order: 6, label: "BOL.size.verylarge" },
|
||||||
"huge": "BOL.size.huge",
|
"huge": { order: 7, label: "BOL.size.huge" },
|
||||||
"massive": "BOL.size.massive",
|
"massive": { order: 8, label: "BOL.size.massive" },
|
||||||
"enormous": "BOL.size.enormous",
|
"enormous": { order: 9, label: "BOL.size.enormous" },
|
||||||
"gigantic": "BOL.size.gigantic",
|
"gigantic": { order: 10, label: "BOL.size.gigantic" },
|
||||||
"immense": "BOL.size.immense",
|
"immense": { order: 11, label: "BOL.size.immense" },
|
||||||
"colossal": "BOL.size.colossal"
|
"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;
|
BOL.debug = false;
|
@ -10,7 +10,7 @@ export const registerHandlebarsHelpers = function () {
|
|||||||
|
|
||||||
Handlebars.registerHelper('isEmpty', function (list) {
|
Handlebars.registerHelper('isEmpty', function (list) {
|
||||||
if (list) return list.length == 0;
|
if (list) return list.length == 0;
|
||||||
else return 0;
|
else return false;
|
||||||
});
|
});
|
||||||
|
|
||||||
Handlebars.registerHelper('notEmpty', function (list) {
|
Handlebars.registerHelper('notEmpty', function (list) {
|
||||||
@ -64,8 +64,8 @@ export const registerHandlebarsHelpers = function () {
|
|||||||
})
|
})
|
||||||
|
|
||||||
Handlebars.registerHelper('for', function (from, to, incr, block) {
|
Handlebars.registerHelper('for', function (from, to, incr, block) {
|
||||||
var accum = '';
|
let accum = '';
|
||||||
for (var i = from; i < to; i += incr)
|
for (let i = from; i < to; i += incr)
|
||||||
accum += block.fn(i);
|
accum += block.fn(i);
|
||||||
return accum;
|
return accum;
|
||||||
})
|
})
|
||||||
@ -76,6 +76,10 @@ export const registerHandlebarsHelpers = function () {
|
|||||||
Handlebars.registerHelper('count', function (list) {
|
Handlebars.registerHelper('count', function (list) {
|
||||||
return list.length;
|
return list.length;
|
||||||
})
|
})
|
||||||
|
Handlebars.registerHelper('countKeys', function (obj) {
|
||||||
|
return Object.keys(obj).length;
|
||||||
|
})
|
||||||
|
|
||||||
Handlebars.registerHelper('isEnabled', function (configKey) {
|
Handlebars.registerHelper('isEnabled', function (configKey) {
|
||||||
return game.settings.get("bol", 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:
|
// If you need to add Handlebars helpers, here are a few useful examples:
|
||||||
Handlebars.registerHelper('concat', function () {
|
Handlebars.registerHelper('concat', function () {
|
||||||
var outStr = '';
|
let outStr = '';
|
||||||
for (var arg in arguments) {
|
for (let arg in arguments) {
|
||||||
if (typeof arguments[arg] != 'object') {
|
if (typeof arguments[arg] != 'object') {
|
||||||
outStr += arguments[arg];
|
outStr += arguments[arg];
|
||||||
}
|
}
|
||||||
@ -103,12 +107,17 @@ export const registerHandlebarsHelpers = function () {
|
|||||||
Handlebars.registerHelper('sub', function (a, b) {
|
Handlebars.registerHelper('sub', function (a, b) {
|
||||||
return parseInt(a) - parseInt(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) {
|
Handlebars.registerHelper('valueAtIndex', function (arr, idx) {
|
||||||
return arr[idx];
|
return arr[idx];
|
||||||
})
|
})
|
||||||
Handlebars.registerHelper('includesKey', function (items, type, key) {
|
Handlebars.registerHelper('includesKey', function (items, type, key) {
|
||||||
// console.log(items);
|
return items.filter(i => i.type === type).map(i => i.system.key).includes(key);
|
||||||
return items.filter(i => i.type === type).map(i => i.data.key).includes(key);
|
|
||||||
})
|
})
|
||||||
Handlebars.registerHelper('includes', function (array, val) {
|
Handlebars.registerHelper('includes', function (array, val) {
|
||||||
return array.includes(val);
|
return array.includes(val);
|
||||||
@ -118,12 +127,26 @@ export const registerHandlebarsHelpers = function () {
|
|||||||
})
|
})
|
||||||
Handlebars.registerHelper('isOwnerOrGM', function (actor) {
|
Handlebars.registerHelper('isOwnerOrGM', function (actor) {
|
||||||
console.log("Testing actor", actor.isOwner, game.userId)
|
console.log("Testing actor", actor.isOwner, game.userId)
|
||||||
if (actor.isOwner || game.isGM) {
|
return actor.isOwner || game.isGM;
|
||||||
return true
|
})
|
||||||
}
|
Handlebars.registerHelper('upperFirst', function (text) {
|
||||||
return false
|
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") {
|
if (data.type == "Item") {
|
||||||
let item = data.data;
|
let item = data.data;
|
||||||
console.log(item);
|
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
|
// Create a macro to open the actor sheet of the actor dropped on the hotbar
|
||||||
else if (data.type == "Actor") {
|
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));
|
let macro = game.macros.entities.find(m => (m.name === actor.name) && (m.command === command));
|
||||||
if (!macro) {
|
if (!macro) {
|
||||||
macro = await Macro.create({
|
macro = await Macro.create({
|
||||||
name: actor.data.name,
|
name: actor.name,
|
||||||
type: "script",
|
type: "script",
|
||||||
img: "icons/svg/dice-target.svg",
|
img: "icons/svg/dice-target.svg",
|
||||||
command: command
|
command: command
|
||||||
@ -65,9 +53,9 @@ export default function registerHooks() {
|
|||||||
let macro = game.macros.entities.find(m => (m.name === journal.name) && (m.command === command));
|
let macro = game.macros.entities.find(m => (m.name === journal.name) && (m.command === command));
|
||||||
if (!macro) {
|
if (!macro) {
|
||||||
macro = await Macro.create({
|
macro = await Macro.create({
|
||||||
name: journal.data.name,
|
name: journal.name,
|
||||||
type: "script",
|
type: "script",
|
||||||
img: (journal.data.img) ? journal.data.img : "icons/svg/book.svg",
|
img: (journal.img) ? journal.img : "icons/svg/book.svg",
|
||||||
command: command
|
command: command
|
||||||
}, {displaySheet: false})
|
}, {displaySheet: false})
|
||||||
game.user.assignHotbarMacro(macro, slot);
|
game.user.assignHotbarMacro(macro, slot);
|
||||||
@ -75,4 +63,18 @@ export default function registerHooks() {
|
|||||||
}
|
}
|
||||||
return false;
|
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") {
|
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 rollLabel = (attribute.label) ? game.i18n.localize(attribute.label) : null;
|
||||||
let description = actor.name + " - " + game.i18n.localize('BOL.ui.attributeCheck') + " - " + game.i18n.localize(attribute.label) ;
|
let description = actor.name + " - " + game.i18n.localize('BOL.ui.attributeCheck') + " - " + game.i18n.localize(attribute.label) ;
|
||||||
BoLRoll.attributeRollDialog(actor, actorData, attribute, rollLabel, description, adv, mod);
|
BoLRoll.attributeRollDialog(actor, actorData, attribute, rollLabel, description, adv, mod);
|
||||||
}
|
}
|
||||||
else if(rollType === "aptitude") {
|
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 rollLabel = (aptitude.label) ? game.i18n.localize(aptitude.label) : null;
|
||||||
let description = actor.name + " - " + game.i18n.localize('BOL.ui.aptitudeCheck') + " - " + game.i18n.localize(aptitude.label) ;
|
let description = actor.name + " - " + game.i18n.localize('BOL.ui.aptitudeCheck') + " - " + game.i18n.localize(aptitude.label) ;
|
||||||
BoLRoll.aptitudeRollDialog(actor, actorData, aptitude, rollLabel, description, adv, mod);
|
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-equipment.hbs",
|
||||||
"systems/bol/templates/actor/parts/tabs/actor-spellalchemy.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-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-stats.hbs",
|
||||||
"systems/bol/templates/actor/parts/tabs/creature-actions.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
|
// ITEMS
|
||||||
"systems/bol/templates/item/parts/item-header.hbs",
|
"systems/bol/templates/item/parts/item-header.hbs",
|
||||||
"systems/bol/templates/item/parts/properties/feature-properties.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/career-properties.hbs",
|
||||||
"systems/bol/templates/item/parts/properties/feature/boon-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/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/origin-properties.hbs",
|
||||||
"systems/bol/templates/item/parts/properties/feature/race-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/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
|
// DIALOGS
|
||||||
"systems/bol/templates/chat/rolls/attack-damage-card.hbs",
|
"systems/bol/templates/chat/rolls/attack-damage-card.hbs",
|
||||||
"systems/bol/templates/chat/rolls/spell-roll-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/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/aptitude-roll-part.hbs",
|
||||||
"systems/bol/templates/dialogs/attribute-roll-part.hbs",
|
"systems/bol/templates/dialogs/attribute-roll-part.hbs",
|
||||||
"systems/bol/templates/dialogs/mod-roll-part.hbs",
|
"systems/bol/templates/dialogs/mod-roll-part.hbs",
|
||||||
"systems/bol/templates/dialogs/adv-roll-part.hbs",
|
"systems/bol/templates/dialogs/adv-roll-part.hbs",
|
||||||
"systems/bol/templates/dialogs/career-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/boons-roll-part.hbs",
|
||||||
"systems/bol/templates/dialogs/flaws-roll-part.hbs",
|
"systems/bol/templates/dialogs/flaws-roll-part.hbs",
|
||||||
"systems/bol/templates/dialogs/total-roll-part.hbs",
|
"systems/bol/templates/dialogs/total-roll-part.hbs",
|
||||||
"systems/bol/templates/dialogs/fightoptions-roll-part.hbs",
|
"systems/bol/templates/dialogs/fightoptions-roll-part.hbs",
|
||||||
|
"systems/bol/templates/dialogs/horoscope-roll-part.hbs"
|
||||||
];
|
];
|
||||||
|
|
||||||
// Load the template parts
|
// 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-000508
|
0
packs/aides-de-jeu/LOCK
Normal file
8
packs/aides-de-jeu/LOG
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
2024/11/11-17:40:19.565131 7fb51d6006c0 Recovering log #506
|
||||||
|
2024/11/11-17:40:19.612343 7fb51d6006c0 Delete type=3 #504
|
||||||
|
2024/11/11-17:40:19.612471 7fb51d6006c0 Delete type=0 #506
|
||||||
|
2024/11/11-18:11:38.541777 7fb51b2006c0 Level-0 table #511: started
|
||||||
|
2024/11/11-18:11:38.541829 7fb51b2006c0 Level-0 table #511: 0 bytes OK
|
||||||
|
2024/11/11-18:11:38.548347 7fb51b2006c0 Delete type=0 #509
|
||||||
|
2024/11/11-18:11:38.555731 7fb51b2006c0 Manual compaction at level-0 from '!journal!3xJg1rCxnWvEmoxS' @ 72057594037927935 : 1 .. '!journal.pages!veAAxCtCKcFIsnln.0kUgZspxXO7VS8bd' @ 0 : 0; will stop at (end)
|
||||||
|
2024/11/11-18:11:38.555798 7fb51b2006c0 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/11-17:32:15.539289 7fb51e0006c0 Recovering log #502
|
||||||
|
2024/11/11-17:32:15.598910 7fb51e0006c0 Delete type=3 #500
|
||||||
|
2024/11/11-17:32:15.598975 7fb51e0006c0 Delete type=0 #502
|
||||||
|
2024/11/11-17:40:13.952540 7fb51b2006c0 Level-0 table #507: started
|
||||||
|
2024/11/11-17:40:13.952583 7fb51b2006c0 Level-0 table #507: 0 bytes OK
|
||||||
|
2024/11/11-17:40:13.971805 7fb51b2006c0 Delete type=0 #505
|
||||||
|
2024/11/11-17:40:14.057635 7fb51b2006c0 Manual compaction at level-0 from '!journal!3xJg1rCxnWvEmoxS' @ 72057594037927935 : 1 .. '!journal.pages!veAAxCtCKcFIsnln.0kUgZspxXO7VS8bd' @ 0 : 0; will stop at (end)
|
||||||
|
2024/11/11-17:40:14.057680 7fb51b2006c0 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-000508
Normal file
BIN
packs/armors/000365.ldb
Normal file
0
packs/armors/000416.log
Normal file
1
packs/armors/CURRENT
Normal file
@ -0,0 +1 @@
|
|||||||
|
MANIFEST-000414
|
0
packs/armors/LOCK
Normal file
8
packs/armors/LOG
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
2024/11/11-17:40:19.458112 7fb51e0006c0 Recovering log #412
|
||||||
|
2024/11/11-17:40:19.508385 7fb51e0006c0 Delete type=3 #410
|
||||||
|
2024/11/11-17:40:19.508443 7fb51e0006c0 Delete type=0 #412
|
||||||
|
2024/11/11-18:11:38.528248 7fb51b2006c0 Level-0 table #417: started
|
||||||
|
2024/11/11-18:11:38.528270 7fb51b2006c0 Level-0 table #417: 0 bytes OK
|
||||||
|
2024/11/11-18:11:38.535321 7fb51b2006c0 Delete type=0 #415
|
||||||
|
2024/11/11-18:11:38.555690 7fb51b2006c0 Manual compaction at level-0 from '!items!G3dZTHIabA3LA1hY' @ 72057594037927935 : 1 .. '!items!xhEcsi3WHjbt2ro9' @ 0 : 0; will stop at (end)
|
||||||
|
2024/11/11-18:11:38.555766 7fb51b2006c0 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/11-17:32:15.511723 7fb51d6006c0 Recovering log #408
|
||||||
|
2024/11/11-17:32:15.522161 7fb51d6006c0 Delete type=3 #406
|
||||||
|
2024/11/11-17:32:15.522220 7fb51d6006c0 Delete type=0 #408
|
||||||
|
2024/11/11-17:40:13.997542 7fb51b2006c0 Level-0 table #413: started
|
||||||
|
2024/11/11-17:40:13.997578 7fb51b2006c0 Level-0 table #413: 0 bytes OK
|
||||||
|
2024/11/11-17:40:14.032179 7fb51b2006c0 Delete type=0 #411
|
||||||
|
2024/11/11-17:40:14.057661 7fb51b2006c0 Manual compaction at level-0 from '!items!G3dZTHIabA3LA1hY' @ 72057594037927935 : 1 .. '!items!xhEcsi3WHjbt2ro9' @ 0 : 0; will stop at (end)
|
||||||
|
2024/11/11-17:40:14.057705 7fb51b2006c0 Manual compaction at level-1 from '!items!G3dZTHIabA3LA1hY' @ 72057594037927935 : 1 .. '!items!xhEcsi3WHjbt2ro9' @ 0 : 0; will stop at (end)
|
BIN
packs/armors/MANIFEST-000414
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/000509.log
Normal file
1
packs/boons/CURRENT
Normal file
@ -0,0 +1 @@
|
|||||||
|
MANIFEST-000507
|
0
packs/boons/LOCK
Normal file
8
packs/boons/LOG
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
2024/11/11-17:40:19.042384 7fb51e0006c0 Recovering log #505
|
||||||
|
2024/11/11-17:40:19.098631 7fb51e0006c0 Delete type=3 #503
|
||||||
|
2024/11/11-17:40:19.098693 7fb51e0006c0 Delete type=0 #505
|
||||||
|
2024/11/11-18:11:38.476928 7fb51b2006c0 Level-0 table #510: started
|
||||||
|
2024/11/11-18:11:38.476967 7fb51b2006c0 Level-0 table #510: 0 bytes OK
|
||||||
|
2024/11/11-18:11:38.482864 7fb51b2006c0 Delete type=0 #508
|
||||||
|
2024/11/11-18:11:38.502396 7fb51b2006c0 Manual compaction at level-0 from '!items!039ZF3E3MtAGwbiX' @ 72057594037927935 : 1 .. '!items!zgspy1QKaxdEetEw' @ 0 : 0; will stop at (end)
|
||||||
|
2024/11/11-18:11:38.502432 7fb51b2006c0 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/11-17:32:15.396290 7fb51d6006c0 Recovering log #501
|
||||||
|
2024/11/11-17:32:15.405860 7fb51d6006c0 Delete type=3 #499
|
||||||
|
2024/11/11-17:32:15.405913 7fb51d6006c0 Delete type=0 #501
|
||||||
|
2024/11/11-17:40:13.776004 7fb51b2006c0 Level-0 table #506: started
|
||||||
|
2024/11/11-17:40:13.776036 7fb51b2006c0 Level-0 table #506: 0 bytes OK
|
||||||
|
2024/11/11-17:40:13.801318 7fb51b2006c0 Delete type=0 #504
|
||||||
|
2024/11/11-17:40:13.849346 7fb51b2006c0 Manual compaction at level-0 from '!items!039ZF3E3MtAGwbiX' @ 72057594037927935 : 1 .. '!items!zgspy1QKaxdEetEw' @ 0 : 0; will stop at (end)
|
||||||
|
2024/11/11-17:40:13.849410 7fb51b2006c0 Manual compaction at level-1 from '!items!039ZF3E3MtAGwbiX' @ 72057594037927935 : 1 .. '!items!zgspy1QKaxdEetEw' @ 0 : 0; will stop at (end)
|
BIN
packs/boons/MANIFEST-000507
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/000509.log
Normal file
1
packs/boonsflawscreatures/CURRENT
Normal file
@ -0,0 +1 @@
|
|||||||
|
MANIFEST-000507
|
0
packs/boonsflawscreatures/LOCK
Normal file
8
packs/boonsflawscreatures/LOG
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
2024/11/11-17:40:19.101460 7fb51cc006c0 Recovering log #505
|
||||||
|
2024/11/11-17:40:19.152129 7fb51cc006c0 Delete type=3 #503
|
||||||
|
2024/11/11-17:40:19.152256 7fb51cc006c0 Delete type=0 #505
|
||||||
|
2024/11/11-18:11:38.490419 7fb51b2006c0 Level-0 table #510: started
|
||||||
|
2024/11/11-18:11:38.490456 7fb51b2006c0 Level-0 table #510: 0 bytes OK
|
||||||
|
2024/11/11-18:11:38.496457 7fb51b2006c0 Delete type=0 #508
|
||||||
|
2024/11/11-18:11:38.502422 7fb51b2006c0 Manual compaction at level-0 from '!items!CoqlfsDV1gL5swbK' @ 72057594037927935 : 1 .. '!items!yofwG0YrsL902G77' @ 0 : 0; will stop at (end)
|
||||||
|
2024/11/11-18:11:38.502465 7fb51b2006c0 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/11-17:32:15.409265 7fb51cc006c0 Recovering log #501
|
||||||
|
2024/11/11-17:32:15.427785 7fb51cc006c0 Delete type=3 #499
|
||||||
|
2024/11/11-17:32:15.427855 7fb51cc006c0 Delete type=0 #501
|
||||||
|
2024/11/11-17:40:13.801428 7fb51b2006c0 Level-0 table #506: started
|
||||||
|
2024/11/11-17:40:13.801453 7fb51b2006c0 Level-0 table #506: 0 bytes OK
|
||||||
|
2024/11/11-17:40:13.824124 7fb51b2006c0 Delete type=0 #504
|
||||||
|
2024/11/11-17:40:13.849363 7fb51b2006c0 Manual compaction at level-0 from '!items!CoqlfsDV1gL5swbK' @ 72057594037927935 : 1 .. '!items!yofwG0YrsL902G77' @ 0 : 0; will stop at (end)
|
||||||
|
2024/11/11-17:40:13.849426 7fb51b2006c0 Manual compaction at level-1 from '!items!CoqlfsDV1gL5swbK' @ 72057594037927935 : 1 .. '!items!yofwG0YrsL902G77' @ 0 : 0; will stop at (end)
|
BIN
packs/boonsflawscreatures/MANIFEST-000507
Normal file
BIN
packs/careers/000294.ldb
Normal file
0
packs/careers/000509.log
Normal file
1
packs/careers/CURRENT
Normal file
@ -0,0 +1 @@
|
|||||||
|
MANIFEST-000507
|
0
packs/careers/LOCK
Normal file
8
packs/careers/LOG
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
2024/11/11-17:40:19.199186 7fb51c2006c0 Recovering log #505
|
||||||
|
2024/11/11-17:40:19.252022 7fb51c2006c0 Delete type=3 #503
|
||||||
|
2024/11/11-17:40:19.252133 7fb51c2006c0 Delete type=0 #505
|
||||||
|
2024/11/11-18:11:38.496554 7fb51b2006c0 Level-0 table #510: started
|
||||||
|
2024/11/11-18:11:38.496575 7fb51b2006c0 Level-0 table #510: 0 bytes OK
|
||||||
|
2024/11/11-18:11:38.502326 7fb51b2006c0 Delete type=0 #508
|
||||||
|
2024/11/11-18:11:38.502439 7fb51b2006c0 Manual compaction at level-0 from '!items!4S4xAfMXGnuU0O1a' @ 72057594037927935 : 1 .. '!items!zxY3sW0iCJBvwjOS' @ 0 : 0; will stop at (end)
|
||||||
|
2024/11/11-18:11:38.502472 7fb51b2006c0 Manual compaction at level-1 from '!items!4S4xAfMXGnuU0O1a' @ 72057594037927935 : 1 .. '!items!zxY3sW0iCJBvwjOS' @ 0 : 0; will stop at (end)
|