Compare commits
149 Commits
v1.3.5
...
bol-v11.1.
Author | SHA1 | Date | |
---|---|---|---|
20ab9a17a4 | |||
5de40d4998 | |||
c7c26c0033 | |||
5c4c6d73ee | |||
1a0049a3f5 | |||
5d30482ce3 | |||
3fb8e92428 | |||
7738746994 | |||
761179bc5a | |||
a4d7c13383 | |||
ee6bf1a4d4 | |||
469948e296 | |||
def271b8b9 | |||
c9ed514ed6 | |||
2ffd3f35c8 | |||
e3b281f195 | |||
29ecb04ec3 | |||
ca3064dc0a | |||
9fd8751124 | |||
2d63b63b86 | |||
b44250e728 | |||
63c3e24296 | |||
8a87f6deab | |||
759b099bdf | |||
ade88fb54b | |||
f1a3f2df36 | |||
a357c6ddfc | |||
26a6c7fc28 | |||
6fcac36580 | |||
34924b07c0 | |||
66bf299ea4 | |||
37ab0d01dc | |||
2e3a97de04 | |||
01dbe76f59 | |||
ca33defd75 | |||
2e616e3e31 | |||
3be7f4bf9f | |||
1b8e0840b0 | |||
2cdd096c98 | |||
8fcb17b566 | |||
ad79dbb015 | |||
73ccf44dd4 | |||
ec3649799f | |||
3f5f090bb9 | |||
268ac0a25a | |||
59ee6684ab | |||
41fbc094bb | |||
5b91041a3f | |||
e7f3851daa | |||
75d562f922 | |||
ba7e25e8c7 | |||
83d3f17dd0 | |||
0c502a2188 | |||
5df2b7e624 | |||
f6554f6945 | |||
fbe232266f | |||
4b9c3bcd1e | |||
05f09aa3f5 | |||
727db74545 | |||
ccb3a458c0 | |||
1ac9605f08 | |||
1bbefd3499 | |||
bcb377db7a | |||
7a8cf9f8fd | |||
d74f7784bb | |||
6d6fec99b0 | |||
884823a1bc | |||
399c22d623 | |||
085265df5d | |||
593db9ba5b | |||
ac96f3ca67 | |||
b2fe67ab05 | |||
47178d7359 | |||
e1c7304551 | |||
7b4e5bcbfa | |||
31bd83b0ab | |||
e35187433e | |||
5e7dc3ad9d | |||
add6893864 | |||
3a591e750a | |||
fe1cda67c4 | |||
985aba0318 | |||
5d8cc300e9 | |||
aa27168c2b | |||
1135e3aff2 | |||
30e316d34e | |||
f3bd84c5c9 | |||
985d393de5 | |||
815b5ff2ac | |||
edf8325109 | |||
895aa01419 | |||
9631e5e72a | |||
716cc53b29 | |||
44952d4410 | |||
a7991bce92 | |||
a1c20019e8 | |||
af8576a4a1 | |||
6c35ddfb0b | |||
0cbcaee45e | |||
904ff821e1 | |||
5c13cde07a | |||
51c1e205e9 | |||
90a83f4571 | |||
3311bc091a | |||
fa8f9869a6 | |||
36b905134e | |||
eeb0a906e7 | |||
c552411d61 | |||
d3ae59f70d | |||
cf7d76fdba | |||
89ec404ca8 | |||
8f60aa95ee | |||
d888c6a2eb | |||
165e41fef6 | |||
19bb0798c8 | |||
05f044bc7c | |||
996ac1c88d | |||
cc1964093d | |||
d27b78d1d2 | |||
7259d3dc21 | |||
ef5cf6f393 | |||
3e50a9135f | |||
82c902099f | |||
c26e43bac7 | |||
4159b6b181 | |||
45cb082d8e | |||
2637f698ad | |||
9b8762300e | |||
dfac102925 | |||
fad281a7b3 | |||
1191442f04 | |||
fe93888c1b | |||
127f200c27 | |||
b078ffa992 | |||
d713066b5c | |||
7adfbfe148 | |||
2186d986ca | |||
590fba0cbd | |||
0c9e598958 | |||
049604ce98 | |||
471a18cd14 | |||
58c781f2f2 | |||
c9722b9b04 | |||
44ce88dd17 | |||
a31fe251e0 | |||
76a050b023 | |||
b68a6dbd23 | |||
34c7024191 | |||
33da01707d |
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
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 |
38
changelog.md
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
Changes :
|
||||||
|
|
||||||
|
# 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é
|
||||||
|
|
71
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 */
|
||||||
@ -769,7 +782,7 @@ body.system-bol img#logo {
|
|||||||
min-height: 700px;
|
min-height: 700px;
|
||||||
height: 700px;
|
height: 700px;
|
||||||
}
|
}
|
||||||
.bol.sheet.actor .window-content form {
|
.bol.sheet.actor .window-content .bol-actor-form {
|
||||||
background-image: url("/systems/bol/ui/logo.webp");
|
background-image: url("/systems/bol/ui/logo.webp");
|
||||||
background-repeat: no-repeat;
|
background-repeat: no-repeat;
|
||||||
background-size: 190px 115px;
|
background-size: 190px 115px;
|
||||||
@ -855,11 +868,30 @@ body.system-bol img#logo {
|
|||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
color: #4b4a44;
|
color: #4b4a44;
|
||||||
}
|
}
|
||||||
|
.bol.sheet.actor .bonus-text {
|
||||||
|
margin-top: 7px;
|
||||||
|
}
|
||||||
.bol.sheet.actor .stat-value {
|
.bol.sheet.actor .stat-value {
|
||||||
font-size: 1.5rem;
|
font-size: 1.5rem;
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
color: darkred;
|
color: darkred;
|
||||||
}
|
}
|
||||||
|
.bol.sheet.actor .resource-bonus {
|
||||||
|
font-weight: bold;
|
||||||
|
color: darkred;
|
||||||
|
}
|
||||||
|
.bol.sheet.actor .resources-value {
|
||||||
|
background-color:#2a2a2a30;
|
||||||
|
border-color: #003c1e;
|
||||||
|
margin-top: 4px;
|
||||||
|
border-radius: 0.5rem;
|
||||||
|
}
|
||||||
|
.bol.sheet.actor .resources-novalue {
|
||||||
|
background-color:#2a2a2a00;
|
||||||
|
border-color: #003c1e;
|
||||||
|
margin-top: 4px;
|
||||||
|
border-radius: 0.5rem;
|
||||||
|
}
|
||||||
.bol.sheet.actor .stat-roll {
|
.bol.sheet.actor .stat-roll {
|
||||||
font-size: 1.5rem;
|
font-size: 1.5rem;
|
||||||
color: #4b4a44;
|
color: #4b4a44;
|
||||||
@ -1011,9 +1043,18 @@ body.system-bol img#logo {
|
|||||||
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;
|
||||||
|
position: absolute;
|
||||||
|
top: -4rem;
|
||||||
|
left: 12rem;
|
||||||
|
}
|
||||||
.control-icon.tokenhudicon {
|
.control-icon.tokenhudicon {
|
||||||
width: fit-content;
|
width: fit-content;
|
||||||
height: fit-content;
|
height: fit-content;
|
||||||
@ -1030,5 +1071,15 @@ 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;
|
||||||
}
|
}
|
||||||
|
4
images/.directory
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
[Dolphin]
|
||||||
|
Timestamp=2022,7,17,14,58,4.757
|
||||||
|
Version=4
|
||||||
|
VisibleRoles=Details_text,Details_size,Details_modificationtime,Details_creationtime,CustomizedDetails
|
Before Width: | Height: | Size: 372 KiB |
490
lang/de.json
Normal file
@ -0,0 +1,490 @@
|
|||||||
|
{
|
||||||
|
"ACTOR.TypeCharacter": "Charakter",
|
||||||
|
"ACTOR.TypeEncounter": "NSC",
|
||||||
|
"ITEM.TypeItem": "Objekt",
|
||||||
|
"ITEM.TypeFeature": "Eigenschaft",
|
||||||
|
"ITEM.TypeWeapon": "Waffe",
|
||||||
|
"ITEM.TypeArmor": "Rüstung",
|
||||||
|
|
||||||
|
"BOL.attributes.vigor": "Stärke",
|
||||||
|
"BOL.attributes.halfvigor" : "Demi-vigueur",
|
||||||
|
"BOL.attributes.agility": "Geschicklichkeit",
|
||||||
|
"BOL.attributes.mind": "Verstand",
|
||||||
|
"BOL.attributes.appeal": "Auftreten",
|
||||||
|
"BOL.aptitudes.init": "Initiative",
|
||||||
|
"BOL.aptitudes.melee": "Nahkampf",
|
||||||
|
"BOL.aptitudes.ranged": "Fernkampf",
|
||||||
|
"BOL.aptitudes.def": "Verteidigung",
|
||||||
|
"BOL.aptitudes.prot": "Schutz",
|
||||||
|
"BOL.resources.hp": "Lebensblut",
|
||||||
|
"BOL.resources.hero": "Heldenpunkte",
|
||||||
|
"BOL.resources.faith": "Glaube",
|
||||||
|
"BOL.resources.creation": "Erschaffung",
|
||||||
|
"BOL.resources.power": "Arkane Macht",
|
||||||
|
"BOL.resources.villainy": "Boshaftigkeit",
|
||||||
|
"BOL.resources.alchemypoints": "Alchemiepunkte",
|
||||||
|
"BOL.traits.xp": "Erfahrung",
|
||||||
|
|
||||||
|
"BOL.ui.tab.stats": "Attribute",
|
||||||
|
"BOL.ui.tab.combat": "Kampf",
|
||||||
|
"BOL.ui.tab.actions": "Aktionen",
|
||||||
|
"BOL.ui.tab.features": "Eigenschaften",
|
||||||
|
"BOL.ui.tab.equipment": "Ausrüstung",
|
||||||
|
"BOL.ui.tab.description": "Beschreibung",
|
||||||
|
"BOL.ui.tab.details": "Details",
|
||||||
|
"BOL.ui.tab.spellalchemy": "Zaubersprüche & Alchemie",
|
||||||
|
|
||||||
|
"BOL.ui.properties": "Eigenschaften",
|
||||||
|
"BOL.ui.description": "Beschreibung",
|
||||||
|
"BOL.ui.actions": "Aktionen",
|
||||||
|
"BOL.ui.capacities": "Fähigkeiten",
|
||||||
|
"BOL.ui.capacityProperties": "Fähigkeitenseigenschaften",
|
||||||
|
"BOL.ui.damages": "Schaden",
|
||||||
|
"BOL.ui.details": "Details",
|
||||||
|
"BOL.ui.category": "Kategorie",
|
||||||
|
"BOL.ui.subcategory": "Unterkategorie",
|
||||||
|
"BOL.ui.type": "Typ",
|
||||||
|
"BOL.ui.subtype": "Untertyp",
|
||||||
|
"BOL.ui.attribute" : "Attribut",
|
||||||
|
"BOL.ui.aptitude" : "Einstellungen",
|
||||||
|
"BOL.ui.advantages" : "Vorteile/Nachteile",
|
||||||
|
"BOL.ui.modifiers": "Modifikatoren",
|
||||||
|
"BOL.ui.item": "Objekt",
|
||||||
|
"BOL.ui.edit": "Ändern",
|
||||||
|
"BOL.ui.unequip": "Ablegen",
|
||||||
|
"BOL.ui.equip": "Anlegen",
|
||||||
|
"BOL.ui.delete": "Löschen",
|
||||||
|
"BOL.ui.roll" : "Würfeln",
|
||||||
|
"BOL.ui.equipment" : "Ausrüstung",
|
||||||
|
"BOL.ui.equipmentProperties" : "Ausrüstungseigenschaften",
|
||||||
|
"BOL.ui.weaponAttack" : "Waffenangriff",
|
||||||
|
"BOL.ui.weaponProperties" : "Waffeneigenschaften",
|
||||||
|
"BOL.ui.protectionProperties" : "Schutzeigenschaften",
|
||||||
|
"BOL.ui.magicalProperties" : "Magieeigenschaften",
|
||||||
|
"BOL.ui.capacatyProperties" : "Fähigkeiteneigenschaften",
|
||||||
|
"BOL.ui.alchemyProperties": "Alchemieeigenschaften",
|
||||||
|
"BOL.ui.armor" : "Rüstung",
|
||||||
|
"BOL.ui.reach" : "Reichweite",
|
||||||
|
"BOL.ui.weapon" : "Waffe",
|
||||||
|
"BOL.ui.melee" : "Nahkampf",
|
||||||
|
"BOL.ui.ranged" : "Fernkampf",
|
||||||
|
"BOL.ui.protection" : "Schutz",
|
||||||
|
"BOL.ui.shield" : "Schild",
|
||||||
|
"BOL.ui.blocking" : "Blocken",
|
||||||
|
"BOL.ui.range" : "Reichweite",
|
||||||
|
"BOL.ui.quantity" : "Menge",
|
||||||
|
"BOL.ui.qty" : "Anz.",
|
||||||
|
"BOL.ui.slot" : "Slot",
|
||||||
|
"BOL.ui.weight" : "Gewicht",
|
||||||
|
"BOL.ui.price": "Preis",
|
||||||
|
"BOL.ui.cancel": "Abbrechen",
|
||||||
|
"BOL.ui.submit": "OK",
|
||||||
|
"BOL.ui.attributeCheck" : "Attributsprobe",
|
||||||
|
"BOL.ui.aptitudeCheck" : "Fähigkeitsprobe",
|
||||||
|
"BOL.ui.weaponCheck" : "Waffenprobe",
|
||||||
|
"BOL.ui.spellCheck" : "Zauberprobe",
|
||||||
|
"BOL.ui.careers" : "Laufbahnen",
|
||||||
|
"BOL.ui.boons" : "Gaben",
|
||||||
|
"BOL.ui.flaws" : "Schwächen",
|
||||||
|
"BOL.ui.rank" : "Rang",
|
||||||
|
"BOL.ui.success" : "Erfolg",
|
||||||
|
"BOL.ui.failure" : "Fehlschlag",
|
||||||
|
"BOL.ui.fumble" : "Kritischer Fehlschlag",
|
||||||
|
"BOL.ui.critical" : "Mächtiger Erfolg",
|
||||||
|
"BOL.ui.criticallegend" : "Legendärer Erfolg",
|
||||||
|
"BOL.ui.maneuvers" : "Kampfmanöver",
|
||||||
|
"BOL.ui.stacksize" : "Stapelgröße (max)",
|
||||||
|
"BOL.ui.weapons" : "Waffen",
|
||||||
|
"BOL.ui.protections" : "Schutz",
|
||||||
|
"BOL.ui.ammos" : "Munition",
|
||||||
|
"BOL.ui.containers" : "Behälter",
|
||||||
|
"BOL.ui.treasure" : "Schätze",
|
||||||
|
"BOL.ui.vehicles" : "Fahrzeuge/Reittiere",
|
||||||
|
"BOL.ui.misc" : "Verschiedenes",
|
||||||
|
"BOL.ui.vehicleProperties" : "Fahrzeugeigenschaften",
|
||||||
|
"BOL.ui.speed" : "Geschwindigkeit",
|
||||||
|
"BOL.ui.noWeaponName" : "Unbekannte Waffe",
|
||||||
|
"BOL.ui.targetDefence": "Verteidigung",
|
||||||
|
"BOL.ui.applyShieldMalus": "Schildmalus anwenden",
|
||||||
|
"BOL.ui.shieldMalus": "Schildmalus",
|
||||||
|
"BOL.ui.defenseScore": "Verteidigungswert",
|
||||||
|
"BOL.ui.defender": "Verteidiger",
|
||||||
|
"BOL.ui.difficulty": "Schwierigkeit",
|
||||||
|
"BOL.ui.spellProperties": "Zaubereigenschaften",
|
||||||
|
"BOL.ui.duration": "Dauer",
|
||||||
|
"BOL.ui.spellkeep": "Aufrechterhalten",
|
||||||
|
"BOL.ui.concentrate": "Konzentrieren",
|
||||||
|
"BOL.ui.registerInit": "Register Init.",
|
||||||
|
"BOL.ui.isSorcerer": "Ist Zauberer?",
|
||||||
|
"BOL.ui.isAlchemist": "Ist Alchemist?",
|
||||||
|
"BOL.ui.isPriest": "Ist Priester/Druide?",
|
||||||
|
"BOL.ui.circle": "Kreis",
|
||||||
|
"BOL.ui.spells": "Zaubersprüche",
|
||||||
|
"BOL.ui.focusSpell": "Zauberspruch wirken",
|
||||||
|
"BOL.ui.sorcererRank" : "Zaubererrang",
|
||||||
|
"BOL.ui.alchemistRank": "Alchemistenrang",
|
||||||
|
"BOL.ui.mandatoryconditions": "Benötigte Vorraussetzungen",
|
||||||
|
"BOL.ui.optionnalconditions": "Optionale Vorraussetzungen",
|
||||||
|
"BOL.ui.ppcost": "Arkane Macht-Kosten",
|
||||||
|
"BOL.ui.ppAvailable": "Verfügbare Arkane Macht",
|
||||||
|
"BOL.ui.pccost": "Creation Points cost",
|
||||||
|
"BOL.ui.pcnow": "Actual Creation Points",
|
||||||
|
"BOL.ui.alchemyType": "Typ",
|
||||||
|
"BOL.ui.alchemy": "Alchemie",
|
||||||
|
"BOL.ui.makeAlchemy": "Alchemika herstellen",
|
||||||
|
"BOL.ui.alchemyCostTotal": "Alchemiepunkte ingesamt",
|
||||||
|
"BOL.ui.alchemyInvest": "Alchemiepunkte investieren",
|
||||||
|
"BOL.ui.alchemyCurrent": "Aktuelle Alchemiepunkte in Objekten",
|
||||||
|
"BOL.ui.advance": "Status",
|
||||||
|
"BOL.ui.isadvantage": "Gibt zusätzlichen Würfel?",
|
||||||
|
"BOL.ui.isbonusdice": "Gibt zusätzlichen Würfel?",
|
||||||
|
"BOL.ui.ismalusdice": "Gibt zusätzlichen Würfel?",
|
||||||
|
"BOL.ui.bonusmalus": "Zusätzliche Boni/Mali?",
|
||||||
|
"BOL.ui.nbdices": "Anzahl der Würfel",
|
||||||
|
"BOL.ui.totalmod": "Kompletter Mod.",
|
||||||
|
"BOL.ui.rangeModifiers": "Reichweitenmodifikator",
|
||||||
|
"BOL.ui.money": "Gold",
|
||||||
|
"BOL.ui.moneyTitle": "Gold & Schätze",
|
||||||
|
"BOL.ui.fightOption": "Kampfoptionen",
|
||||||
|
"BOL.ui.none": "Nichts",
|
||||||
|
"BOL.ui.fightOptionType": "Kampfoptionstypen",
|
||||||
|
"BOL.ui.activated": "Aktiviert",
|
||||||
|
"BOL.ui.deactivated": "Deaktiviert",
|
||||||
|
"BOL.ui.status": "Status",
|
||||||
|
"BOL.ui.toactivated": "Aktiv (>Deaktivieren)",
|
||||||
|
"BOL.ui.todeactivated": "Inaktiv (>Aktivieren)",
|
||||||
|
"BOL.ui.armorAgiMalus": "Rüschtung+Schild-Malus (Geschick)",
|
||||||
|
"BOL.ui.armorInitMalus": "Rüstungsmalus (Init)",
|
||||||
|
"BOL.ui.attackValue": "Angriffswert",
|
||||||
|
"BOL.ui.initMalus": "Init malus",
|
||||||
|
"BOL.ui.createEquipment": "Create Equipment",
|
||||||
|
|
||||||
|
"BOL.featureCategory.origins": "Herkünfte",
|
||||||
|
"BOL.featureCategory.races": "Rassen",
|
||||||
|
"BOL.featureCategory.careers": "Laufbahnen",
|
||||||
|
"BOL.featureCategory.boons": "Gaben",
|
||||||
|
"BOL.featureCategory.flaws": "Schwächen",
|
||||||
|
"BOL.featureCategory.languages": "Sprachen",
|
||||||
|
"BOL.featureCategory.fightoptions": "Kampfoptionen",
|
||||||
|
|
||||||
|
"BOL.featureSubtypes.origin": "Herkunft",
|
||||||
|
"BOL.featureSubtypes.race": "Rasse",
|
||||||
|
"BOL.featureSubtypes.career": "Laufbahn",
|
||||||
|
"BOL.featureSubtypes.boon": "Gabe",
|
||||||
|
"BOL.featureSubtypes.flaw": "Schwäche",
|
||||||
|
"BOL.featureSubtypes.language": "Sprache",
|
||||||
|
"BOL.featureSubtypes.gods": "Glauben & Götter",
|
||||||
|
"BOL.featureSubtypes.fightOption": "Kampfoption",
|
||||||
|
|
||||||
|
"BOL.bougette.nomoney": "Mittellos",
|
||||||
|
"BOL.bougette.tolive": "Zum Überleben",
|
||||||
|
"BOL.bougette.easylife": "Einfaches Leben",
|
||||||
|
"BOL.bougette.luxury" : "Luxuriöses Leben",
|
||||||
|
"BOL.bougette.rich": "Reich!",
|
||||||
|
|
||||||
|
"BOL.fightOptionTypes.armor": "Angriff um die Rüstung zu umgehen",
|
||||||
|
"BOL.fightOptionTypes.intrepid": "Rücksichtsloser Angriff",
|
||||||
|
"BOL.fightOptionTypes.twoweaponsdef": "Kampf mit zwei Waffen (Verteidigung)",
|
||||||
|
"BOL.fightOptionTypes.twoweaponsatt": "Kampf mit zwei Waffen (Angriff)",
|
||||||
|
"BOL.fightOptionTypes.fulldefense": "Volle Verteidigung",
|
||||||
|
"BOL.fightOptionTypes.defense": "Verteidigungshaltung",
|
||||||
|
"BOL.fightOptionTypes.attack": "Angriffshaltung",
|
||||||
|
|
||||||
|
"BOL.itemCategory.object": "Objekt",
|
||||||
|
"BOL.itemCategory.equipment": "Ausrüstung",
|
||||||
|
"BOL.itemCategory.consumable": "Verbrauchsgut",
|
||||||
|
"BOL.itemCategory.spell": "Zauber",
|
||||||
|
"BOL.itemCategory.vehicle": "Fahrzeug/Reittier",
|
||||||
|
"BOL.itemCategory.other": "Verschiedenes",
|
||||||
|
"BOL.itemCategory.capacity" : "Fähigkeiten",
|
||||||
|
"BOL.itemCategory.alchemy": "Alchemie",
|
||||||
|
|
||||||
|
"BOL.combatCategory.protections": "Schutz",
|
||||||
|
"BOL.combatCategory.shields": "Schilde",
|
||||||
|
"BOL.combatCategory.melee": "Nahkampfwaffen",
|
||||||
|
"BOL.combatCategory.ranged": "Fernkampfwaffen",
|
||||||
|
"BOL.combatCategory.fightOptions": "Kampfoptionen",
|
||||||
|
"BOL.combatCategory.natural": "Natürliche Waffen",
|
||||||
|
|
||||||
|
"BOL.equipmentCategory.weapon": "Waffe",
|
||||||
|
"BOL.equipmentCategory.armor": "Rüstung",
|
||||||
|
"BOL.equipmentCategory.protection": "Schutz",
|
||||||
|
"BOL.equipmentCategory.shield": "Schild",
|
||||||
|
"BOL.equipmentCategory.helm": "Helm",
|
||||||
|
"BOL.equipmentCategory.jewel": "Schmuck",
|
||||||
|
"BOL.equipmentCategory.scroll": "Schriftrolle",
|
||||||
|
"BOL.equipmentCategory.ammunition": "Munition",
|
||||||
|
"BOL.equipmentCategory.container": "Behälter",
|
||||||
|
"BOL.equipmentCategory.currency": "Gold",
|
||||||
|
"BOL.equipmentCategory.other": "Verschiedenes",
|
||||||
|
|
||||||
|
"BOL.protectionCategory.armor": "Rüstung",
|
||||||
|
"BOL.protectionCategory.shield": "Schild",
|
||||||
|
"BOL.protectionCategory.helm": "Helm",
|
||||||
|
"BOL.protectionCategory.other": "Verschiedenes",
|
||||||
|
|
||||||
|
"BOL.spellItem.charm": "Zauber",
|
||||||
|
"BOL.spellItem.circle1": "Erster Kreis",
|
||||||
|
"BOL.spellItem.circle2": "Zweiter Kreis",
|
||||||
|
"BOL.spellItem.circle3": "Dritter Kreis",
|
||||||
|
|
||||||
|
"BOL.alchemyItem.common": "Häufig",
|
||||||
|
"BOL.alchemyItem.scarce": "Selten",
|
||||||
|
"BOL.alchemyItem.legend": "Legendär",
|
||||||
|
"BOL.alchemyItem.mythic": "Mystisch",
|
||||||
|
|
||||||
|
"BOL.weaponCategory.melee": "Nahkampf",
|
||||||
|
"BOL.weaponCategory.ranged": "Fernkampf",
|
||||||
|
"BOL.weaponCategory.other": "Verschiedenes",
|
||||||
|
|
||||||
|
"BOL.itemProperty.damageMultiplier": "Schadensmultiplikator",
|
||||||
|
"BOL.itemProperty.attackBonusDice": "Angriffsbonuswürfel",
|
||||||
|
"BOL.itemProperty.equipable": "Ausrüstbar",
|
||||||
|
"BOL.itemProperty.protection": "Schutz",
|
||||||
|
"BOL.itemProperty.blocking": "Blocken",
|
||||||
|
"BOL.itemProperty.magical": "Magisch",
|
||||||
|
"BOL.itemProperty.magicalProperties": "Magische Eigenschaften",
|
||||||
|
"BOL.itemProperty.concealable": "Versteckbar",
|
||||||
|
"BOL.itemProperty.2H": "Zweihändig",
|
||||||
|
"BOL.itemProperty.helm": "Helm",
|
||||||
|
"BOL.itemProperty.improvised": "Improvisiert",
|
||||||
|
"BOL.itemProperty.shield": "Schild",
|
||||||
|
"BOL.itemProperty.melee": "Nahkampf",
|
||||||
|
"BOL.itemProperty.throwable": "Werfbar",
|
||||||
|
"BOL.itemProperty.ignoreshield": "Ignoriert Schilde",
|
||||||
|
"BOL.itemProperty.bashing": "Nicht-tödlicher Schaden",
|
||||||
|
"BOL.itemProperty.stackable": "Stapelbar",
|
||||||
|
"BOL.itemProperty.ranged": "Fernkampf",
|
||||||
|
"BOL.itemProperty.weapon": "Waffe",
|
||||||
|
"BOL.itemProperty.reloadable": "Nachladbar",
|
||||||
|
"BOL.itemProperty.worn": "Angelegt",
|
||||||
|
"BOL.itemProperty.spell" : "Zauber",
|
||||||
|
"BOL.itemProperty.armor" : "Rüstung",
|
||||||
|
"BOL.itemProperty.consumable" : "Verbrauchsgut",
|
||||||
|
"BOL.itemProperty.bow" : "Bogen",
|
||||||
|
"BOL.itemProperty.crossbow" : "Armbrust",
|
||||||
|
"BOL.itemProperty.throwing" : "Wurfwaffe",
|
||||||
|
"BOL.itemProperty.activable" : "Aktivierbar",
|
||||||
|
"BOL.itemProperty.powder" : "Schießpulverwaffe",
|
||||||
|
"BOL.itemProperty.attackAttribute" : "Angriff (Attribut)",
|
||||||
|
"BOL.itemProperty.attackAptitude" : "Angriff (Fähigkeit)",
|
||||||
|
"BOL.itemProperty.attackModifiers" : "Angriff (Modifikatoren)",
|
||||||
|
"BOL.itemProperty.attackReroll1" : "Angriff (bei 1 erneut würfeln)",
|
||||||
|
"BOL.itemProperty.damage" : "Schaden (Sch)",
|
||||||
|
"BOL.itemProperty.damageModifiers" : "Schaden (Modifikatoren)",
|
||||||
|
"BOL.itemProperty.damageAttribute" : "Schaden (Attribut)",
|
||||||
|
"BOL.itemProperty.damageSpecial" : "Schaden (Spezial)",
|
||||||
|
"BOL.itemProperty.damageReroll1" : "bei 1 erneut würfeln",
|
||||||
|
"BOL.itemProperty.range" : "Reichweite (in m)",
|
||||||
|
"BOL.itemProperty.soakFormula": "Auslösen (Formel)",
|
||||||
|
"BOL.itemProperty.soakModifiers": "Auslösen (Modifikatoren)",
|
||||||
|
"BOL.itemProperty.soakValue": "Auslösen (Wert)",
|
||||||
|
"BOL.itemProperty.armorQuality": "Rüstungsqualität",
|
||||||
|
"BOL.itemProperty.blockingMalus" : "Blockmalus",
|
||||||
|
"BOL.itemProperty.blockingAttacksBlocked" : "Angriff geblockt",
|
||||||
|
"BOL.itemProperty.blocking1Attack" : "Ein Angriff blocken",
|
||||||
|
"BOL.itemProperty.blockingAllAttacks" : "Alle Angriffe blocken",
|
||||||
|
"BOL.itemProperty.slot" : "Slotplatz",
|
||||||
|
"BOL.itemProperty.reload": "Nachladen (Aktion)",
|
||||||
|
"BOL.itemProperty.weaponSize" : "Waffengröße",
|
||||||
|
"BOL.itemProperty.difficulty": "Schwierigkeit",
|
||||||
|
"BOL.itemProperty.natural": "Natürliche Waffe",
|
||||||
|
"BOL.itemProperty.onlymodifier": "Nur Modifikator (d.h. Angriffe von Kreaturen)",
|
||||||
|
|
||||||
|
"BOL.itemStat.quantity": "Anzahl",
|
||||||
|
"BOL.itemStat.weight": "Gewicht",
|
||||||
|
"BOL.itemStat.price": "Preis",
|
||||||
|
"BOL.itemStat.range": "Reichweite",
|
||||||
|
"BOL.itemStat.damage": "Schaden",
|
||||||
|
"BOL.itemStat.reload": "Nachladen (Aktion)",
|
||||||
|
"BOL.itemStat.soak": "Auslösen",
|
||||||
|
"BOL.itemStat.blocking": "Blocken",
|
||||||
|
"BOL.itemStat.modifiers": "Modifikatoren",
|
||||||
|
|
||||||
|
"BOL.weaponSize.unarmed" : "Unbewaffnet",
|
||||||
|
"BOL.weaponSize.improvised" : "Improvisiert",
|
||||||
|
"BOL.weaponSize.light" : "Leicht",
|
||||||
|
"BOL.weaponSize.medium" : "Mittel",
|
||||||
|
"BOL.weaponSize.heavy" : "Schwer",
|
||||||
|
|
||||||
|
"BOL.itemModifiers.init": "Malus (Initiative)",
|
||||||
|
"BOL.itemModifiers.social": "Malus (Sozial)",
|
||||||
|
"BOL.itemModifiers.agility": "Malus (Geschick)",
|
||||||
|
"BOL.itemModifiers.powercost": "Malus (Zusatzkosten Arkane Macht)",
|
||||||
|
|
||||||
|
"BOL.itemBlocking.malus": "Sozial",
|
||||||
|
"BOL.itemBlocking.nbAttacksPerRound": "Beweglichkeit",
|
||||||
|
|
||||||
|
"BOL.soakFormula.none" : "-",
|
||||||
|
"BOL.soakFormula.light" : "Leicht (Verhindert d6-3 erlittenen Schaden)",
|
||||||
|
"BOL.soakFormula.medium" : "Mittel (Verhindert d6-2 erlittenen Schaden)",
|
||||||
|
"BOL.soakFormula.heavy" : "Schwer (Verhindert d6-1 erlittenen Schaden)",
|
||||||
|
|
||||||
|
"BOL.armorQuality.none" : "-",
|
||||||
|
"BOL.armorQuality.light" : "Leicht",
|
||||||
|
"BOL.armorQuality.lightQ" : "Leicht Qualität",
|
||||||
|
"BOL.armorQuality.lightSup" : "Leicht Überlegen",
|
||||||
|
"BOL.armorQuality.lightLeg" : "Leicht Legendär",
|
||||||
|
"BOL.armorQuality.medium" : "Mittel",
|
||||||
|
"BOL.armorQuality.mediumQ" : "Mittel Qualität",
|
||||||
|
"BOL.armorQuality.mediumSup" : "Mittel Überlegen",
|
||||||
|
"BOL.armorQuality.mediumLeg" : "Mittel Legendär",
|
||||||
|
"BOL.armorQuality.heavy" : "Schwer",
|
||||||
|
"BOL.armorQuality.heavyQ" : "Schwer Qualität",
|
||||||
|
"BOL.armorQuality.heavySup" : "Schwer Überlegen",
|
||||||
|
"BOL.armorQuality.heavyLeg" : "Schwer Legendär",
|
||||||
|
|
||||||
|
"BOL.equipmentSlots.none" : "-",
|
||||||
|
"BOL.equipmentSlots.head" : "Kopf",
|
||||||
|
"BOL.equipmentSlots.neck" : "Hals",
|
||||||
|
"BOL.equipmentSlots.shoulders" : "Schultern",
|
||||||
|
"BOL.equipmentSlots.body" : "Körper",
|
||||||
|
"BOL.equipmentSlots.rhand" : "Rechte Hand",
|
||||||
|
"BOL.equipmentSlots.lhand" : "Linke Hand",
|
||||||
|
"BOL.equipmentSlots.2hands" : "Zweihändig",
|
||||||
|
"BOL.equipmentSlots.rarm" : "Rechter Arm",
|
||||||
|
"BOL.equipmentSlots.larm" : "Linker Arm",
|
||||||
|
"BOL.equipmentSlots.chest" : "Torso",
|
||||||
|
"BOL.equipmentSlots.belt" : "Gürtel",
|
||||||
|
"BOL.equipmentSlots.legs" : "Beine",
|
||||||
|
"BOL.equipmentSlots.feet" : "Füße",
|
||||||
|
"BOL.equipmentSlots.finder" : "Finger",
|
||||||
|
"BOL.equipmentSlots.ear" : "Ohr",
|
||||||
|
|
||||||
|
"BOL.vehicleCategory.mount" : "Reittier",
|
||||||
|
"BOL.vehicleCategory.flying" : "Fluggerät",
|
||||||
|
"BOL.vehicleCategory.boat" : "Schiff",
|
||||||
|
"BOL.vehicleCategory.other" : "Anderes",
|
||||||
|
|
||||||
|
"BOL.ui.astrologerPoints": "Points d'Astrologie",
|
||||||
|
"BOL.ui.astrologerPointsLabel": "Points d'Astrologie actuels",
|
||||||
|
"BOL.ui.ishoroscopemajor": "Horoscope Majeur (ie de groupe) ?",
|
||||||
|
"BOL.ui.answer": "Réponse",
|
||||||
|
"BOL.ui.horoscopefavorable": "Favorable (1dB)",
|
||||||
|
"BOL.ui.horoscopeunfavorable": "Défavorable (1dM)",
|
||||||
|
"BOL.ui.horoscopes": "Horoscopes",
|
||||||
|
"BOL.ui.horoscopesBonus": "Horoscopes (Bonus)",
|
||||||
|
"BOL.ui.horoscopesMalus": "Horoscopes (Malus)",
|
||||||
|
"BOL.ui.groupHoroscope": "Horoscrope de Groupe de ",
|
||||||
|
|
||||||
|
"BOL.range.PointBlank": "Direkt",
|
||||||
|
"BOL.range.Short": "Kurz",
|
||||||
|
"BOL.range.Medium": "Mittel",
|
||||||
|
"BOL.range.Long": "Weit",
|
||||||
|
"BOL.range.VeryLong": "Sehr weit",
|
||||||
|
"BOL.range.Extreme": "Extrem weit",
|
||||||
|
"BOL.range.Maximum": "Maximale Reichweite",
|
||||||
|
|
||||||
|
"BOL.notification.MacroMultipleTokensSelected": "Du hast mehrere Token ausgewählt",
|
||||||
|
"BOL.notification.MacroNoActorAvailable": "Es konnte kein Akteur gefunden werden",
|
||||||
|
"BOL.notification.MacroNoTokenSelected": "Du musst einen Token auswählen",
|
||||||
|
|
||||||
|
"BOL.size.tiny": "Winzig",
|
||||||
|
"BOL.size.verysmall": "Sehr klein",
|
||||||
|
"BOL.size.small" : "Klein",
|
||||||
|
"BOL.size.medium" : "Mittel",
|
||||||
|
"BOL.size.large" : "Groß",
|
||||||
|
"BOL.size.verylarge": "Sehr groß",
|
||||||
|
"BOL.size.huge" :"Riesig",
|
||||||
|
"BOL.size.massive" : "Massiv",
|
||||||
|
"BOL.size.enormous": "Enorm",
|
||||||
|
"BOL.size.gigantic": "Gigantisch",
|
||||||
|
"BOL.size.immense": "Immens",
|
||||||
|
"BOL.size.colossal": "Kolossal",
|
||||||
|
|
||||||
|
"BOL.chat.fightactive": "{name} aktiviert die Kampfoption {foName} für diese Runde!",
|
||||||
|
"BOL.chat.fightunactive": "{name} deaktiviert die Kampfoption {foName} für diese Runde!",
|
||||||
|
"BOL.chat.isdead": "{name} ist tot!",
|
||||||
|
"BOL.chat.epitaph": "Möge sein Name auf den Schlachtfeldern Lemurias in Ehren gehalten werden.!",
|
||||||
|
"BOL.chat.vitalityzero": "Das Lebensblut von {name} ist {hp}: {name} geht zu Boden und wird bewusstlos!",
|
||||||
|
"BOL.chat.vitalityheroism": "Gib einen Heldenpunkt aus um für eine Runde wieder auf die Beine zu kommen.",
|
||||||
|
"BOL.chat.vitalityheroismhint": "Dadurch steigt dein Lebensblut auf das Maximum geteilt durch 2 (aufgerundet).",
|
||||||
|
"BOL.chat.vitalitydying": "Das Lebensblut von {name} ist {hp}! {name} stirbt...",
|
||||||
|
"BOL.chat.vitalitydyingheroism": "Gib einen Heldenpunkt aus um den Tod herauszufordern.",
|
||||||
|
"BOL.chat.alchemytitle": "Alchemiepräparat: {name}",
|
||||||
|
"BOL.chat.alchemypoints": "Investierte Charaktererschaffungspunkte: {pcCostCurrent}",
|
||||||
|
"BOL.chat.alchemysuccess": "Das alchemistische Präparat wurde erfolgreich abgeschlossen!<br>Erstelle den entsprechenden Gegenstand oder Effekt in deinem Inventar.<br>Der Vorbereitungsfortschritt wurde auf 0 zurückgesetzt.",
|
||||||
|
"BOL.chat.alchemyfailure": "Das Alchemistische Präparat ist fehlgeschlagen!<br>Der Fortschritt wurde auf 0 zurückgesetzt.",
|
||||||
|
"BOL.chat.rolldamage": "Schaden auswürfeln",
|
||||||
|
"BOL.chat.rolldamage6": "Schaden auswürfeln +6",
|
||||||
|
"BOL.chat.rolldamage12": "Schaden auswürfeln +12 (1 Heldenpunkt)",
|
||||||
|
"BOL.chat.damageresult": "Schaden von {name}: {total}",
|
||||||
|
"BOL.chat.damagetarget": "Ziel: {target}",
|
||||||
|
"BOL.chat.applydamagetotarget": "Schaden auf Ziel anwenden",
|
||||||
|
"BOL.chat.fightoption": "Kampfoption",
|
||||||
|
"BOL.chat.reroll": "Erneut Würfeln (1 Heldenpunkt)",
|
||||||
|
"BOL.chat.toheroic": "In mächtigen Erfolg umwandeln (1 Heldenpunkt)",
|
||||||
|
"BOL.chat.tolegend": "In legendären Erfolg umwandeln (1 Heldenpunkt)",
|
||||||
|
"BOL.chat.hurttitle": "{name} wird {damageTotal} Schaden erleiden!",
|
||||||
|
"BOL.chat.armordefault": "Dieser Angriff richtet sich gegen Fehler in deiner Rüstung. Du musst den Schaden ohne den Schutz deiner Rüstung einstecken!",
|
||||||
|
"BOL.chat.witharmor": "Schaden MIT Rüstungsschutz anwenden",
|
||||||
|
"BOL.chat.withoutarmor": "Schaden OHNE Rüstungsschutz anwenden",
|
||||||
|
"BOL.chat.shakeoff": "Nur ein Kratzer (1 Heldenpunkt)",
|
||||||
|
"BOL.chat.splinteredshield": "Opfere dein Schild/Schwert {name} (1 Heldenpunkt)",
|
||||||
|
"BOL.chat.damagesummary": "Schaden durch {name} erlitten",
|
||||||
|
"BOL.chat.protectvalue": "Rüstungsschutz",
|
||||||
|
"BOL.chat.noprotectvalue": "Kein Rüstungsschutz!",
|
||||||
|
"BOL.chat.heroreducedamage": "Gib einen Heldenpunkt aus um eine zusätzliche Schadensreduktion von {total} zu bekommen.",
|
||||||
|
"BOL.chat.herosplintered": "Du hast keinen Schaden eingesteckt dank {weaponHero.name}. Leider wurde es während der Parade zerstört. Du hast einen Heldenpunkt verloren.",
|
||||||
|
"BOL.chat.finaldamage": "Endergebnis: {finalDamage} Schaden!",
|
||||||
|
"BOL.chat.spell": "Zauber",
|
||||||
|
"BOL.chat.spellcost": "Arkane Macht-Kosten",
|
||||||
|
"BOL.chat.spellremaining": "Verbleibende Arkane Macht",
|
||||||
|
"BOL.dialog.soeasy": "Trivial (+4)",
|
||||||
|
"BOL.dialog.veryeasy": "Sehr leicht (+2)",
|
||||||
|
"BOL.dialog.easy": "Leicht (+1)",
|
||||||
|
"BOL.dialog.moderate": "Normal (0)",
|
||||||
|
"BOL.dialog.hard": "Knifflig (-1)",
|
||||||
|
"BOL.dialog.tough": "Schwierig (-2)",
|
||||||
|
"BOL.dialog.demanding": "Sehr Schwierig (-4)",
|
||||||
|
"BOL.dialog.formidable": "Herausfordernd (-6)",
|
||||||
|
"BOL.dialog.heroic": "Heldenhaft (-8)",
|
||||||
|
"BOL.dialog.mythic": "Mystisch (-10)",
|
||||||
|
"BOL.dialog.divine": "Göttlich (-12)",
|
||||||
|
"BOL.dialog.pointblank": "Direkt (+1)",
|
||||||
|
"BOL.dialog.close": "Kurz (0)",
|
||||||
|
"BOL.dialog.medium": "Mittel (-1)",
|
||||||
|
"BOL.dialog.long": "Weit (-2)",
|
||||||
|
"BOL.dialog.distant": "Sehr Weit (-4)",
|
||||||
|
"BOL.dialog.extreme": "Extrem Weit (-6)",
|
||||||
|
"BOL.dialog.utmost": "Maximale Reichweite (-8)",
|
||||||
|
|
||||||
|
"BOL.ui.name": "Name",
|
||||||
|
"BOL.ui.xp": "Erfahrung",
|
||||||
|
"BOL.ui.xpspent": "Ausgegeben",
|
||||||
|
"BOL.ui.xptotal": "Insgesamt",
|
||||||
|
"BOL.ui.biosize": "Größe",
|
||||||
|
"BOL.ui.bioweight": "Gewicht",
|
||||||
|
"BOL.ui.bioage": "Alter",
|
||||||
|
"BOL.ui.biohair": "Haare",
|
||||||
|
"BOL.ui.bioeyes": "Augen",
|
||||||
|
"BOL.ui.biosigns": "Erkennungszeichen",
|
||||||
|
"BOL.ui.biodescription": "Beschreibung",
|
||||||
|
"BOL.ui.bionotes": "Notizen",
|
||||||
|
|
||||||
|
"BOL.chat.welcome1": "Willkommen zu Barbarians of Lemuria (französische Ludospherik-Version, deutsche Übersetzung von Truant Spiele)",
|
||||||
|
"BOL.chat.welcome2": "Zum Spielen werden zwingend die passenden BoL Bücher benötigt. Die französischen Originalbücher für dieses System gibt es hier: http://www.ludospherik.fr/content/14-barbarians-of-lemuria<br>Die deutsche Übersetzung gibt es bei Truant Spiele: https://truant.com/produkt/barbarians-of-lemuria-2",
|
||||||
|
"BOL.chat.welcome3": "Die enthaltenen Karten wurden von Guillaume Tavernier und Ludospherik zur Verfügung gestellt. Vielen Dank dafür!",
|
||||||
|
"BOL.chat.welcome4": "Im Discord findet ihr Support für die FoundryVTT-Implementierung dieses Systems: https://discord.gg/pPSDNJk",
|
||||||
|
"BOL.chat.welcome5": "Auf ein gutes Spiel in Lemuria!",
|
||||||
|
"BOL.chat.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)"
|
||||||
|
}
|
619
lang/en.json
@ -1,111 +1,123 @@
|
|||||||
{
|
{
|
||||||
"ACTOR.TypeCharacter": "Personnage",
|
"ACTOR.TypeCharacter": "Character",
|
||||||
"ACTOR.TypeEncounter": "Rencontre",
|
"ACTOR.TypeEncounter": "Encounter",
|
||||||
"ITEM.TypeItem": "Objet",
|
"ITEM.TypeItem": "Item",
|
||||||
"ITEM.TypeFeature": "Trait",
|
"ITEM.TypeFeature": "Feature",
|
||||||
"ITEM.TypeWeapon": "Arme",
|
"ITEM.TypeWeapon": "Weapon",
|
||||||
"ITEM.TypeArmor": "Armure",
|
"ITEM.TypeArmor": "Armor",
|
||||||
|
|
||||||
"BOL.attributes.vigor": "Vigueur",
|
"BOL.attributes.vigor": "Strength",
|
||||||
"BOL.attributes.halfvigor" : "Demi-vigueur",
|
"BOL.attributes.halfvigor" : "Half-Strength",
|
||||||
"BOL.attributes.agility": "Agilité",
|
"BOL.attributes.agility": "Agility",
|
||||||
"BOL.attributes.mind": "Esprit",
|
"BOL.attributes.mind": "Mind",
|
||||||
"BOL.attributes.appeal": "Aura",
|
"BOL.attributes.appeal": "Appeal",
|
||||||
"BOL.aptitudes.init": "Initiative",
|
"BOL.aptitudes.init": "Initiative",
|
||||||
"BOL.aptitudes.melee": "Mêlée",
|
"BOL.aptitudes.melee": "Melee",
|
||||||
"BOL.aptitudes.ranged": "Tir",
|
"BOL.aptitudes.ranged": "Ranged",
|
||||||
"BOL.aptitudes.def": "Défense",
|
"BOL.aptitudes.def": "Defense",
|
||||||
"BOL.aptitudes.prot": "Protection",
|
"BOL.aptitudes.prot": "Protection",
|
||||||
"BOL.resources.hp": "Vitalité",
|
"BOL.resources.hp": "Vitality",
|
||||||
"BOL.resources.hero": "Héroïsme",
|
"BOL.resources.hero": "Hero",
|
||||||
"BOL.resources.faith": "Foi",
|
"BOL.resources.faith": "Faith",
|
||||||
"BOL.resources.creation": "Création",
|
"BOL.resources.creation": "Creation",
|
||||||
"BOL.resources.power": "Pouvoir",
|
"BOL.resources.power": "Power",
|
||||||
"BOL.resources.villainy": "Vilénie",
|
"BOL.resources.villainy": "Villany",
|
||||||
"BOL.resources.alchemypoints": "Alchemy Points",
|
"BOL.resources.alchemypoints": "Alchemy Points",
|
||||||
"BOL.traits.xp": "Expérience",
|
"BOL.traits.xp": "Experience",
|
||||||
|
|
||||||
"BOL.ui.tab.stats": "Attributs",
|
"BOL.ui.tab.stats": "Attributes",
|
||||||
"BOL.ui.tab.combat": "Combat",
|
"BOL.ui.tab.combat": "Combat",
|
||||||
"BOL.ui.tab.actions": "Actions",
|
"BOL.ui.tab.actions": "Actions",
|
||||||
"BOL.ui.tab.features": "Traits",
|
"BOL.ui.tab.features": "Traits",
|
||||||
"BOL.ui.tab.equipment": "Equipement",
|
"BOL.ui.tab.equipment": "Equipment",
|
||||||
"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.properties": "Propriétés",
|
"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": "Properties",
|
||||||
"BOL.ui.description": "Description",
|
"BOL.ui.description": "Description",
|
||||||
"BOL.ui.actions": "Actions",
|
"BOL.ui.actions": "Actions",
|
||||||
"BOL.ui.capacities": "Capacités",
|
"BOL.ui.capacities": "Capacity",
|
||||||
"BOL.ui.damages": "Dommages",
|
"BOL.ui.damages": "Damage",
|
||||||
"BOL.ui.details": "Détails",
|
"BOL.ui.details": "Details",
|
||||||
"BOL.ui.category": "Catégorie",
|
"BOL.ui.category": "Category",
|
||||||
"BOL.ui.subcategory": "Sous-catégorie",
|
"BOL.ui.subcategory": "Sub-Category",
|
||||||
"BOL.ui.type": "Type",
|
"BOL.ui.type": "Type",
|
||||||
"BOL.ui.subtype": "Sous-type",
|
"BOL.ui.subtype": "Subtype",
|
||||||
"BOL.ui.attribute" : "Attribut",
|
"BOL.ui.attribute" : "Attribute",
|
||||||
"BOL.ui.aptitude" : "Aptitude",
|
"BOL.ui.aptitude" : "Aptitude",
|
||||||
"BOL.ui.advantages" : "Avantages/Désavantages",
|
"BOL.ui.advantages" : "Boons/Flaws",
|
||||||
"BOL.ui.modifiers": "Modificateurs",
|
"BOL.ui.modifiers": "Modifiers",
|
||||||
"BOL.ui.item": "Objet",
|
"BOL.ui.item": "Item",
|
||||||
"BOL.ui.edit": "Editer",
|
"BOL.ui.edit": "Edit",
|
||||||
"BOL.ui.unequip": "Déséquiper",
|
"BOL.ui.unequip": "Unequip",
|
||||||
"BOL.ui.equip": "Équiper",
|
"BOL.ui.equip": "Equip",
|
||||||
"BOL.ui.delete": "Supprimer",
|
"BOL.ui.delete": "Delete",
|
||||||
"BOL.ui.roll" : "Utiliser",
|
"BOL.ui.roll" : "Roll",
|
||||||
"BOL.ui.equipment" : "Équipement",
|
"BOL.ui.equipment" : "Equipment",
|
||||||
"BOL.ui.equipmentProperties" : "Propiétés d'équipement",
|
"BOL.ui.equipmentProperties" : "Equipment properties",
|
||||||
"BOL.ui.weaponAttack" : "Weapon attack",
|
"BOL.ui.weaponAttack" : "Weapon attack",
|
||||||
"BOL.ui.weaponProperties" : "Propiétés offensives",
|
"BOL.ui.weaponProperties" : "Weapon properties",
|
||||||
"BOL.ui.protectionProperties" : "Protection",
|
"BOL.ui.protectionProperties" : "Protection properties",
|
||||||
"BOL.ui.magicalProperties" : "Propriétés magiques",
|
"BOL.ui.magicalProperties" : "Magical properties",
|
||||||
"BOL.ui.alchemyProperties": "Alchemy properties",
|
"BOL.ui.alchemyProperties": "Alchemy properties",
|
||||||
"BOL.ui.armor" : "Armure",
|
"BOL.ui.armor" : "Armor",
|
||||||
"BOL.ui.reach" : "Allonge",
|
"BOL.ui.reach" : "Reach",
|
||||||
"BOL.ui.weapon" : "Arme",
|
"BOL.ui.weapon" : "Weapon",
|
||||||
"BOL.ui.melee" : "Arme de contact",
|
"BOL.ui.melee" : "Melee",
|
||||||
"BOL.ui.ranged" : "Arme à distance",
|
"BOL.ui.ranged" : "Ranged",
|
||||||
"BOL.ui.protection" : "Protection",
|
"BOL.ui.protection" : "Protection",
|
||||||
"BOL.ui.shield" : "Bouclier",
|
"BOL.ui.shield" : "Shield",
|
||||||
"BOL.ui.blocking" : "Blocage",
|
"BOL.ui.blocking" : "Blocking",
|
||||||
"BOL.ui.range" : "Portée",
|
"BOL.ui.range" : "Range",
|
||||||
"BOL.ui.quantity" : "Quantité",
|
"BOL.ui.quantity" : "Quantity",
|
||||||
"BOL.ui.qty" : "Qté",
|
"BOL.ui.qty" : "Qty",
|
||||||
"BOL.ui.slot" : "Empl.",
|
"BOL.ui.slot" : "Slot",
|
||||||
"BOL.ui.weight" : "Poids",
|
"BOL.ui.weight" : "Weight",
|
||||||
"BOL.ui.price": "Prix",
|
"BOL.ui.price": "Price",
|
||||||
"BOL.ui.cancel": "Annuler",
|
"BOL.ui.cancel": "Cancel",
|
||||||
"BOL.ui.submit": "OK",
|
"BOL.ui.submit": "OK",
|
||||||
"BOL.ui.attributeCheck" : "Test d'attribut",
|
"BOL.ui.attributeCheck" : "Attribute Check",
|
||||||
"BOL.ui.aptitudeCheck" : "Test d'aptitude",
|
"BOL.ui.aptitudeCheck" : "Aptitude Check",
|
||||||
"BOL.ui.weaponCheck" : "Jet d'attaque",
|
"BOL.ui.weaponCheck" : "Weapon Check",
|
||||||
"BOL.ui.spellCheck" : "Jet de sort",
|
"BOL.ui.spellCheck" : "Spell Check",
|
||||||
"BOL.ui.careers" : "Carrières",
|
"BOL.ui.careers" : "Careers",
|
||||||
"BOL.ui.boons" : "Avantages",
|
"BOL.ui.boons" : "Boons",
|
||||||
"BOL.ui.flaws" : "Désavantages",
|
"BOL.ui.flaws" : "Flaws",
|
||||||
"BOL.ui.rank" : "Rang",
|
"BOL.ui.rank" : "Rank",
|
||||||
"BOL.ui.success" : "Succès",
|
"BOL.ui.success" : "Success",
|
||||||
"BOL.ui.failure" : "Échec",
|
"BOL.ui.failure" : "Failure",
|
||||||
"BOL.ui.fumble" : "Échec critique",
|
"BOL.ui.fumble" : "Fumble",
|
||||||
"BOL.ui.critical" : "Succès critique",
|
"BOL.ui.critical" : "Critical Success",
|
||||||
"BOL.ui.maneuvers" : "Actions de combat",
|
"BOL.ui.maneuvers" : "Maneuvers",
|
||||||
"BOL.ui.stacksize" : "Taille de pile (max)",
|
"BOL.ui.stacksize" : "Stack Size (max)",
|
||||||
"BOL.ui.weapons" : "Armes",
|
"BOL.ui.weapons" : "Weapons",
|
||||||
"BOL.ui.protections" : "Protections",
|
"BOL.ui.protections" : "Protection",
|
||||||
"BOL.ui.ammos" : "Munitions",
|
"BOL.ui.ammos" : "Ammo",
|
||||||
"BOL.ui.containers" : "Conteneurs",
|
"BOL.ui.containers" : "Container",
|
||||||
"BOL.ui.treasure" : "Trésor",
|
"BOL.ui.treasure" : "Treasure",
|
||||||
"BOL.ui.vehicles" : "Véhicules/Montures",
|
"BOL.ui.vehicles" : "Vehicles/Mounts",
|
||||||
"BOL.ui.misc" : "Divers",
|
"BOL.ui.misc" : "Misc",
|
||||||
"BOL.ui.vehicleProperties" : " Propriétés de véhicule",
|
"BOL.ui.vehicleProperties" : "Vehicle properties",
|
||||||
"BOL.ui.speed" : "Vitesse",
|
"BOL.ui.speed" : "Speed",
|
||||||
"BOL.ui.noWeaponName" : "Arme Inconnue",
|
"BOL.ui.noWeaponName" : "Weapon Name",
|
||||||
"BOL.ui.targetDefence": "Défense",
|
"BOL.ui.targetDefence": "Defense",
|
||||||
"BOL.ui.applyShieldMalus": "Appliquer le Malus de Petit Bouclier",
|
"BOL.ui.applyShieldMalus": "Apply Shield Modifier",
|
||||||
"BOL.ui.shieldMalus": "Malus de Bouclier",
|
"BOL.ui.shieldMalus": "Shield Modifier",
|
||||||
"BOL.ui.defenseScore": "Score de Defense",
|
"BOL.ui.defenseScore": "Defense Score",
|
||||||
"BOL.ui.defender": "Défenseur",
|
"BOL.ui.defender": "Defender",
|
||||||
"BOL.ui.difficulty": "Difficulty",
|
"BOL.ui.difficulty": "Difficulty",
|
||||||
"BOL.ui.spellProperties": "Spell Properties",
|
"BOL.ui.spellProperties": "Spell Properties",
|
||||||
"BOL.ui.duration": "Duration",
|
"BOL.ui.duration": "Duration",
|
||||||
@ -115,13 +127,14 @@
|
|||||||
"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",
|
||||||
"BOL.ui.sorcererRank" : "Sorcerer Rank",
|
"BOL.ui.sorcererRank" : "Sorcerer Rank",
|
||||||
"BOL.ui.alchemistRank": "Alchemist Rank",
|
"BOL.ui.alchemistRank": "Alchemist Rank",
|
||||||
"BOL.ui.mandatoryconditions": "Mandatory conditions",
|
"BOL.ui.mandatoryconditions": "Mandatory conditions",
|
||||||
"BOL.ui.optionnalconditions": "Optionnal conditions",
|
"BOL.ui.optionnalconditions": "Optional conditions",
|
||||||
"BOL.ui.ppcost": "Power Points cost",
|
"BOL.ui.ppcost": "Power Points cost",
|
||||||
"BOL.ui.ppAvailable": "Available Power Points",
|
"BOL.ui.ppAvailable": "Available Power Points",
|
||||||
"BOL.ui.pccost": "Creation Points cost",
|
"BOL.ui.pccost": "Creation Points cost",
|
||||||
@ -134,38 +147,42 @@
|
|||||||
"BOL.ui.alchemyCurrent": "Current Alchemy Points in Object",
|
"BOL.ui.alchemyCurrent": "Current Alchemy Points in Object",
|
||||||
"BOL.ui.advance": "Status",
|
"BOL.ui.advance": "Status",
|
||||||
"BOL.ui.isadvantage": "Provides a bonus dice?",
|
"BOL.ui.isadvantage": "Provides a bonus dice?",
|
||||||
"BOL.ui.bonusmalus": "Additionnal bonus/malus",
|
"BOL.ui.bonusmalus": "Additional bonus/penalty",
|
||||||
"BOL.ui.nbdices": "Number of Dices",
|
"BOL.ui.nbdices": "Number of Dice",
|
||||||
"BOL.ui.totalmod": "Total Mod.",
|
"BOL.ui.totalmod": "Total Mod.",
|
||||||
"BOL.ui.rangeModifiers": "Range modifier",
|
"BOL.ui.rangeModifiers": "Range modifier",
|
||||||
"BOL.ui.money": "Bougette",
|
"BOL.ui.money": "Money",
|
||||||
"BOL.ui.moneyTitle": "Gold & Treasure",
|
"BOL.ui.moneyTitle": "Gold & Treasure",
|
||||||
"BOL.ui.fightOption": "Fight Options",
|
"BOL.ui.fightOption": "Fight Options",
|
||||||
"BOL.ui.none": "None",
|
"BOL.ui.none": "None",
|
||||||
"BOL.ui.fightOptionType": "Fight Options types",
|
"BOL.ui.fightOptionType": "Fight Option types",
|
||||||
"BOL.ui.activated": "Activated",
|
"BOL.ui.activated": "Activated",
|
||||||
"BOL.ui.deactivated": "Deactivated",
|
"BOL.ui.deactivated": "Deactivated",
|
||||||
"BOL.ui.status": "Status",
|
"BOL.ui.status": "Status",
|
||||||
"BOL.ui.toactivated": "Active (>Désactiver)",
|
"BOL.ui.toactivated": "Active (>Deactivated)",
|
||||||
"BOL.ui.todeactivated": "Inactive (>Activer)",
|
"BOL.ui.todeactivated": "Inactive (>Active)",
|
||||||
"BOL.ui.armorAgiMalus": "Armor+Shield Malus (Agi)",
|
"BOL.ui.armorAgiMalus": "Armor+Shield Modifier (Agi)",
|
||||||
"BOL.ui.armorInitMalus": "Armor Malus (Init)",
|
"BOL.ui.armorInitMalus": "Armor Modifier (Init)",
|
||||||
"BOL.ui.attackValue": "Attack value",
|
"BOL.ui.attackValue": "Attack Value",
|
||||||
|
"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.isspecial": "Spécial ?",
|
||||||
|
"BOL.ui.createEquipment": "Create Equipment",
|
||||||
|
|
||||||
"BOL.featureCategory.origins": "Origines",
|
"BOL.featureCategory.origins": "Origins",
|
||||||
"BOL.featureCategory.races": "Races",
|
"BOL.featureCategory.races": "Races",
|
||||||
"BOL.featureCategory.careers": "Carrières",
|
"BOL.featureCategory.careers": "Careers",
|
||||||
"BOL.featureCategory.boons": "Avantages",
|
"BOL.featureCategory.boons": "Boons",
|
||||||
"BOL.featureCategory.flaws": "Désavantages",
|
"BOL.featureCategory.flaws": "Flaws",
|
||||||
"BOL.featureCategory.languages": "Langages",
|
"BOL.featureCategory.languages": "Languages",
|
||||||
"BOL.featureCategory.fightoptions": "Fight Options",
|
"BOL.featureCategory.fightoptions": "Fight Options",
|
||||||
|
|
||||||
"BOL.featureSubtypes.origin": "Origine",
|
"BOL.featureSubtypes.origin": "Origin",
|
||||||
"BOL.featureSubtypes.race": "Race",
|
"BOL.featureSubtypes.race": "Race",
|
||||||
"BOL.featureSubtypes.career": "Carrière",
|
"BOL.featureSubtypes.career": "Career",
|
||||||
"BOL.featureSubtypes.boon": "Avantage",
|
"BOL.featureSubtypes.boon": "Boon",
|
||||||
"BOL.featureSubtypes.flaw": "Désavantage",
|
"BOL.featureSubtypes.flaw": "Flaw",
|
||||||
"BOL.featureSubtypes.language": "Langage",
|
"BOL.featureSubtypes.language": "Language",
|
||||||
"BOL.featureSubtypes.gods": "Faith & Gods",
|
"BOL.featureSubtypes.gods": "Faith & Gods",
|
||||||
"BOL.featureSubtypes.fightOption": "Combat Option",
|
"BOL.featureSubtypes.fightOption": "Combat Option",
|
||||||
|
|
||||||
@ -175,46 +192,47 @@
|
|||||||
"BOL.bougette.luxury" : "Luxury life",
|
"BOL.bougette.luxury" : "Luxury life",
|
||||||
"BOL.bougette.rich": "Rich!",
|
"BOL.bougette.rich": "Rich!",
|
||||||
|
|
||||||
"BOL.fightOptionTypes.armor": "Attaque au défaut d'armure",
|
"BOL.fightOptionTypes.armor": "Armor Attack Option",
|
||||||
"BOL.fightOptionTypes.intrepid": "Attaque intrépide",
|
"BOL.fightOptionTypes.intrepid": "Fearless Attack",
|
||||||
"BOL.fightOptionTypes.twoweaponsdef": "Combat à 2 armes (Défense)",
|
"BOL.fightOptionTypes.twoweaponsdef": "Two Weapon (Defense)",
|
||||||
"BOL.fightOptionTypes.twoweaponsatt": "Combat à 2 armes (Attaque)",
|
"BOL.fightOptionTypes.twoweaponsatt": "Two Weapon (Attack)",
|
||||||
"BOL.fightOptionTypes.fulldefense": "Défense totale",
|
"BOL.fightOptionTypes.fulldefense": "Full Defense",
|
||||||
"BOL.fightOptionTypes.defense": "Posture défensive",
|
"BOL.fightOptionTypes.defense": "Defensive Posture",
|
||||||
"BOL.fightOptionTypes.attack": "Posture offensive",
|
"BOL.fightOptionTypes.attack": "Offensive Posture",
|
||||||
|
"BOL.fightOptionTypes.other": "Other",
|
||||||
|
|
||||||
"BOL.itemCategory.object": "Objet",
|
"BOL.itemCategory.object": "Object",
|
||||||
"BOL.itemCategory.equipment": "Équipement",
|
"BOL.itemCategory.equipment": "Equipment",
|
||||||
"BOL.itemCategory.consumable": "Consommable",
|
"BOL.itemCategory.consumable": "Consumable",
|
||||||
"BOL.itemCategory.spell": "Sort",
|
"BOL.itemCategory.spell": "Spell",
|
||||||
"BOL.itemCategory.vehicle": "Monture/Véhicule",
|
"BOL.itemCategory.vehicle": "Mount/Vehicle",
|
||||||
"BOL.itemCategory.other": "Autre",
|
"BOL.itemCategory.other": "Other",
|
||||||
"BOL.itemCategory.capacity" : "Capacité",
|
"BOL.itemCategory.capacity" : "Capacity",
|
||||||
"BOL.itemCategory.alchemy": "Alchemy",
|
"BOL.itemCategory.alchemy": "Alchemy",
|
||||||
|
|
||||||
"BOL.combatCategory.protections": "Protections",
|
"BOL.combatCategory.protections": "Protections",
|
||||||
"BOL.combatCategory.shields": "Boucliers",
|
"BOL.combatCategory.shields": "Shields",
|
||||||
"BOL.combatCategory.melee": "Armes de contact",
|
"BOL.combatCategory.melee": "Melee",
|
||||||
"BOL.combatCategory.ranged": "Armes à distance",
|
"BOL.combatCategory.ranged": "Ranged",
|
||||||
"BOL.combatCategory.fightOptions": "Fight options",
|
"BOL.combatCategory.fightOptions": "Fight options",
|
||||||
"BOL.combatCategory.natural": "Natural Weapons",
|
"BOL.combatCategory.natural": "Natural Weapons",
|
||||||
|
|
||||||
"BOL.equipmentCategory.weapon": "Arme",
|
"BOL.equipmentCategory.weapon": "Weapon",
|
||||||
"BOL.equipmentCategory.armor": "Armure",
|
"BOL.equipmentCategory.armor": "Armor",
|
||||||
"BOL.equipmentCategory.protection": "Protection",
|
"BOL.equipmentCategory.protection": "Protection",
|
||||||
"BOL.equipmentCategory.shield": "Bouclier",
|
"BOL.equipmentCategory.shield": "Shield",
|
||||||
"BOL.equipmentCategory.helm": "Casque",
|
"BOL.equipmentCategory.helm": "Helm",
|
||||||
"BOL.equipmentCategory.jewel": "Bijou",
|
"BOL.equipmentCategory.jewel": "Jewel",
|
||||||
"BOL.equipmentCategory.scroll": "Parchemin",
|
"BOL.equipmentCategory.scroll": "Scroll",
|
||||||
"BOL.equipmentCategory.ammunition": "Munition",
|
"BOL.equipmentCategory.ammunition": "Ammunition",
|
||||||
"BOL.equipmentCategory.container": "Conteneur",
|
"BOL.equipmentCategory.container": "Container",
|
||||||
"BOL.equipmentCategory.currency": "Monnaie",
|
"BOL.equipmentCategory.currency": "Money",
|
||||||
"BOL.equipmentCategory.other": "Autre",
|
"BOL.equipmentCategory.other": "Other",
|
||||||
|
|
||||||
"BOL.protectionCategory.armor": "Armure",
|
"BOL.protectionCategory.armor": "Armor",
|
||||||
"BOL.protectionCategory.shield": "Bouclier",
|
"BOL.protectionCategory.shield": "Shield",
|
||||||
"BOL.protectionCategory.helm": "Casque",
|
"BOL.protectionCategory.helm": "Helm",
|
||||||
"BOL.protectionCategory.other": "Autre",
|
"BOL.protectionCategory.other": "Other",
|
||||||
|
|
||||||
"BOL.spellItem.charm": "Charm",
|
"BOL.spellItem.charm": "Charm",
|
||||||
"BOL.spellItem.circle1": "First Circle",
|
"BOL.spellItem.circle1": "First Circle",
|
||||||
@ -226,140 +244,140 @@
|
|||||||
"BOL.alchemyItem.legend": "Legendary",
|
"BOL.alchemyItem.legend": "Legendary",
|
||||||
"BOL.alchemyItem.mythic": "Mythic",
|
"BOL.alchemyItem.mythic": "Mythic",
|
||||||
|
|
||||||
"BOL.weaponCategory.melee": "Arme de mêlée",
|
"BOL.weaponCategory.melee": "Melee",
|
||||||
"BOL.weaponCategory.ranged": "Arme de tir",
|
"BOL.weaponCategory.ranged": "Ranged",
|
||||||
"BOL.weaponCategory.other": "Autre",
|
"BOL.weaponCategory.other": "Other",
|
||||||
|
|
||||||
"BOL.itemProperty.damageMultiplier": "Damages Multiplier",
|
"BOL.itemProperty.damageMultiplier": "Damage Multiplier",
|
||||||
"BOL.itemProperty.attackBonusDice": "Attack Bonus Dice",
|
"BOL.itemProperty.attackBonusDice": "Attack Bonus Dice",
|
||||||
"BOL.itemProperty.equipable": "Équipable",
|
"BOL.itemProperty.equipable": "Equipable",
|
||||||
"BOL.itemProperty.protection": "Protection",
|
"BOL.itemProperty.protection": "Protection",
|
||||||
"BOL.itemProperty.blocking": "Blocage",
|
"BOL.itemProperty.blocking": "Blocking",
|
||||||
"BOL.itemProperty.magical": "Magique",
|
"BOL.itemProperty.magical": "Magical",
|
||||||
"BOL.itemProperty.concealable": "Dissimulable",
|
"BOL.itemProperty.concealable": "Concealable",
|
||||||
"BOL.itemProperty.2H": "Arme à 2 mains",
|
"BOL.itemProperty.2H": "2H Weapon",
|
||||||
"BOL.itemProperty.helm": "Casque",
|
"BOL.itemProperty.helm": "Helm",
|
||||||
"BOL.itemProperty.improvised": "Improvisée",
|
"BOL.itemProperty.improvised": "Improvised",
|
||||||
"BOL.itemProperty.shield": "Bouclier",
|
"BOL.itemProperty.shield": "Shield",
|
||||||
"BOL.itemProperty.melee": "Arme de contact",
|
"BOL.itemProperty.melee": "Melee",
|
||||||
"BOL.itemProperty.throwable": "Peut être lancée",
|
"BOL.itemProperty.throwable": "Throwable",
|
||||||
"BOL.itemProperty.ignoreshield": "Ignore les boucliers",
|
"BOL.itemProperty.ignoreshield": "Ignore Shield",
|
||||||
"BOL.itemProperty.bashing": "Dégâts non létaux",
|
"BOL.itemProperty.bashing": "Bashing",
|
||||||
"BOL.itemProperty.stackable": "Empilable",
|
"BOL.itemProperty.stackable": "Stackable",
|
||||||
"BOL.itemProperty.ranged": "A distance",
|
"BOL.itemProperty.ranged": "Ranged",
|
||||||
"BOL.itemProperty.weapon": "Offensive",
|
"BOL.itemProperty.weapon": "Weapon",
|
||||||
"BOL.itemProperty.reloadable": "Rechargeable",
|
"BOL.itemProperty.reloadable": "Reloadable",
|
||||||
"BOL.itemProperty.worn": "Équipé",
|
"BOL.itemProperty.worn": "Equipped",
|
||||||
"BOL.itemProperty.spell" : "Sort",
|
"BOL.itemProperty.spell" : "Spell",
|
||||||
"BOL.itemProperty.armor" : "Armure",
|
"BOL.itemProperty.armor" : "Armor",
|
||||||
"BOL.itemProperty.consumable" : "Consommable",
|
"BOL.itemProperty.consumable" : "Consumable",
|
||||||
"BOL.itemProperty.bow" : "Arc",
|
"BOL.itemProperty.bow" : "Bow",
|
||||||
"BOL.itemProperty.crossbow" : "Arbalète",
|
"BOL.itemProperty.crossbow" : "Crossbow",
|
||||||
"BOL.itemProperty.throwing" : "Arme de jet",
|
"BOL.itemProperty.throwing" : "Throwing",
|
||||||
"BOL.itemProperty.activable" : "Activable",
|
"BOL.itemProperty.activable" : "Activable",
|
||||||
"BOL.itemProperty.powder" : "Arme à poudre",
|
"BOL.itemProperty.powder" : "Powder",
|
||||||
"BOL.itemProperty.attackAttribute" : "Attaque (Attribut)",
|
"BOL.itemProperty.attackAttribute" : "Attack (Attribute)",
|
||||||
"BOL.itemProperty.attackAptitude" : "Attaque (Aptitude)",
|
"BOL.itemProperty.attackAptitude" : "Attack (Aptitude)",
|
||||||
"BOL.itemProperty.attackModifiers" : "Attaque (Modificateurs)",
|
"BOL.itemProperty.attackModifiers" : "Attack (Modifiers)",
|
||||||
"BOL.itemProperty.attackReroll1" : "Attaque (Relancer les 1)",
|
"BOL.itemProperty.attackReroll1" : "Attack (Reroll 1's)",
|
||||||
"BOL.itemProperty.damage" : "Dommages (Dés)",
|
"BOL.itemProperty.damage" : "Damage (Dmg)",
|
||||||
"BOL.itemProperty.damageModifiers" : "Dommages (Modificateurs)",
|
"BOL.itemProperty.damageModifiers" : "Damage (Modifiers)",
|
||||||
"BOL.itemProperty.damageAttribute" : "Dommages (Attribut)",
|
"BOL.itemProperty.damageAttribute" : "Damage (Attribute)",
|
||||||
"BOL.itemProperty.damageSpecial" : "Dommages (Spécial)",
|
"BOL.itemProperty.damageSpecial" : "Damage (Special)",
|
||||||
"BOL.itemProperty.damageReroll1" : "Relancer les 1",
|
"BOL.itemProperty.damageReroll1" : "Reroll 1's",
|
||||||
"BOL.itemProperty.range" : "Portée (en m)",
|
"BOL.itemProperty.range" : "Range (in m)",
|
||||||
"BOL.itemProperty.soakFormula": "Encaissement (Formule)",
|
"BOL.itemProperty.soakFormula": "Soak (Formula)",
|
||||||
"BOL.itemProperty.soakModifiers": "Encaissement (Modificateur)",
|
"BOL.itemProperty.soakModifiers": "Soak (Modifiers)",
|
||||||
"BOL.itemProperty.soakValue": "Encaissement (Valeur par défaut)",
|
"BOL.itemProperty.soakValue": "Soak (Default Value)",
|
||||||
"BOL.itemProperty.armorQuality": "Qualité d'armure",
|
"BOL.itemProperty.armorQuality": "Armor Quality",
|
||||||
"BOL.itemProperty.blockingMalus" : "Malus de blocage",
|
"BOL.itemProperty.blockingMalus" : "Blocking Modifier",
|
||||||
"BOL.itemProperty.blockingAttacksBlocked" : "Attaques bloquée",
|
"BOL.itemProperty.blockingAttacksBlocked" : "Attacks blocked",
|
||||||
"BOL.itemProperty.blocking1Attack" : "Bloque 1 attaque",
|
"BOL.itemProperty.blocking1Attack" : "Block 1 attack",
|
||||||
"BOL.itemProperty.blockingAllAttacks" : "Bloque toutes les attaques",
|
"BOL.itemProperty.blockingAllAttacks" : "Block all attacks",
|
||||||
"BOL.itemProperty.slot" : "Emplacement utilisé",
|
"BOL.itemProperty.slot" : "Slot",
|
||||||
"BOL.itemProperty.reload": "Rechargement (Actions)",
|
"BOL.itemProperty.reload": "Reload (Actions)",
|
||||||
"BOL.itemProperty.weaponSize" : "Classe d'arme",
|
"BOL.itemProperty.weaponSize" : "Weapon Size",
|
||||||
"BOL.itemProperty.difficulty": "Difficulty",
|
"BOL.itemProperty.difficulty": "Difficulty",
|
||||||
"BOL.itemProperty.natural": "Natural weapon",
|
"BOL.itemProperty.natural": "Natural weapon",
|
||||||
"BOL.itemProperty.onlymodifier": "Modifier only (ie creatures attacks)",
|
"BOL.itemProperty.onlymodifier": "Modifier only (ie creatures attacks)",
|
||||||
|
|
||||||
"BOL.itemStat.quantity": "Quantité",
|
"BOL.itemStat.quantity": "Quantity",
|
||||||
"BOL.itemStat.weight": "Poids",
|
"BOL.itemStat.weight": "Weight",
|
||||||
"BOL.itemStat.price": "Prix",
|
"BOL.itemStat.price": "Price",
|
||||||
"BOL.itemStat.range": "Portée",
|
"BOL.itemStat.range": "Range",
|
||||||
"BOL.itemStat.damage": "Dommages",
|
"BOL.itemStat.damage": "Damage",
|
||||||
"BOL.itemStat.reload": "Rechargement (Actions)",
|
"BOL.itemStat.reload": "Reload (Actions)",
|
||||||
"BOL.itemStat.soak": "Valeur de protection",
|
"BOL.itemStat.soak": "Soak",
|
||||||
"BOL.itemStat.blocking": "Bloquage",
|
"BOL.itemStat.blocking": "Blocking",
|
||||||
"BOL.itemStat.modifiers": "Modificateurs",
|
"BOL.itemStat.modifiers": "Modifiers",
|
||||||
|
|
||||||
"BOL.weaponSize.unarmed" : "Mains nues",
|
"BOL.weaponSize.unarmed" : "Unarmed",
|
||||||
"BOL.weaponSize.improvised" : "Arme improvisée",
|
"BOL.weaponSize.improvised" : "Improvised",
|
||||||
"BOL.weaponSize.light" : "Légère",
|
"BOL.weaponSize.light" : "Light",
|
||||||
"BOL.weaponSize.medium" : "Moyenne",
|
"BOL.weaponSize.medium" : "Medium",
|
||||||
"BOL.weaponSize.heavy" : "Lourde",
|
"BOL.weaponSize.heavy" : "heavy",
|
||||||
|
|
||||||
"BOL.itemModifiers.init": "Malus (Initiative)",
|
"BOL.itemModifiers.init": "Modifier (Initiative)",
|
||||||
"BOL.itemModifiers.social": "Malus (Social)",
|
"BOL.itemModifiers.social": "Modifier (Social)",
|
||||||
"BOL.itemModifiers.agility": "Malus (Agilité)",
|
"BOL.itemModifiers.agility": "Modifier (Agility)",
|
||||||
"BOL.itemModifiers.powercost": "Malus (Coût supplémentaire en PP)",
|
"BOL.itemModifiers.powercost": "Modifier (Additional Cost in PP)",
|
||||||
|
|
||||||
"BOL.itemBlocking.malus": "Social",
|
"BOL.itemBlocking.malus": "Modifier",
|
||||||
"BOL.itemBlocking.nbAttacksPerRound": "Agilité",
|
"BOL.itemBlocking.nbAttacksPerRound": "Agility",
|
||||||
|
|
||||||
"BOL.soakFormula.none" : "-",
|
"BOL.soakFormula.none" : "-",
|
||||||
"BOL.soakFormula.light" : "Légère (Annule d6-3 dégâts subis)",
|
"BOL.soakFormula.light" : "Light (Cancels d6-3 damage)",
|
||||||
"BOL.soakFormula.medium" : "Moyenne (Annule d6-2 dégâts subis)",
|
"BOL.soakFormula.medium" : "Medium (Cancels d6-2 damage)",
|
||||||
"BOL.soakFormula.heavy" : "Lourde (Annule d6-1 dégâts subis)",
|
"BOL.soakFormula.heavy" : "Heavy (Cancels d6-1 damage)",
|
||||||
|
|
||||||
"BOL.armorQuality.none" : "-",
|
"BOL.armorQuality.none" : "-",
|
||||||
"BOL.armorQuality.light" : "Légère",
|
"BOL.armorQuality.light" : "Light",
|
||||||
"BOL.armorQuality.lightQ" : "Légère de qualité",
|
"BOL.armorQuality.lightQ" : "Light Quality",
|
||||||
"BOL.armorQuality.lightSup" : "Légère Supérieure",
|
"BOL.armorQuality.lightSup" : "Light Superior",
|
||||||
"BOL.armorQuality.lightLeg" : "Légère Légendaire",
|
"BOL.armorQuality.lightLeg" : "Light Legendary",
|
||||||
"BOL.armorQuality.medium" : "Moyenne",
|
"BOL.armorQuality.medium" : "Medium",
|
||||||
"BOL.armorQuality.mediumQ" : "Moyenne de qualité",
|
"BOL.armorQuality.mediumQ" : "Medium Quality",
|
||||||
"BOL.armorQuality.mediumSup" : "Moyenne Supérieure",
|
"BOL.armorQuality.mediumSup" : "Medium Superior",
|
||||||
"BOL.armorQuality.mediumLeg" : "Moyenne Légendaire",
|
"BOL.armorQuality.mediumLeg" : "Medium Legendary",
|
||||||
"BOL.armorQuality.heavy" : "Lourde",
|
"BOL.armorQuality.heavy" : "Heavy",
|
||||||
"BOL.armorQuality.heavyQ" : "Lourde de qualité",
|
"BOL.armorQuality.heavyQ" : "Heavy Quality",
|
||||||
"BOL.armorQuality.heavySup" : "Lourde Supérieure",
|
"BOL.armorQuality.heavySup" : "Heavy Superior",
|
||||||
"BOL.armorQuality.heavyLeg" : "Lourde Légendaire",
|
"BOL.armorQuality.heavyLeg" : "Heavy Legendary",
|
||||||
|
|
||||||
"BOL.equipmentSlots.none" : "-",
|
"BOL.equipmentSlots.none" : "-",
|
||||||
"BOL.equipmentSlots.head" : "Tête",
|
"BOL.equipmentSlots.head" : "Head",
|
||||||
"BOL.equipmentSlots.neck" : "Cou",
|
"BOL.equipmentSlots.neck" : "Neck",
|
||||||
"BOL.equipmentSlots.shoulders" : "Épaules",
|
"BOL.equipmentSlots.shoulders" : "Shoulders",
|
||||||
"BOL.equipmentSlots.body" : "Corps",
|
"BOL.equipmentSlots.body" : "Body",
|
||||||
"BOL.equipmentSlots.rhand" : "Main droite",
|
"BOL.equipmentSlots.rhand" : "Right hand",
|
||||||
"BOL.equipmentSlots.lhand" : "Main gauche",
|
"BOL.equipmentSlots.lhand" : "Left hand",
|
||||||
"BOL.equipmentSlots.2hands" : "2 mains",
|
"BOL.equipmentSlots.2hands" : "2 hands",
|
||||||
"BOL.equipmentSlots.rarm" : "Bras droit",
|
"BOL.equipmentSlots.rarm" : "Right arm",
|
||||||
"BOL.equipmentSlots.larm" : "Bras gauche",
|
"BOL.equipmentSlots.larm" : "Left arm",
|
||||||
"BOL.equipmentSlots.chest" : "Torse",
|
"BOL.equipmentSlots.chest" : "Chest",
|
||||||
"BOL.equipmentSlots.belt" : "Ceinture",
|
"BOL.equipmentSlots.belt" : "Belt",
|
||||||
"BOL.equipmentSlots.legs" : "Jambes",
|
"BOL.equipmentSlots.legs" : "Legs",
|
||||||
"BOL.equipmentSlots.feet" : "Pieds",
|
"BOL.equipmentSlots.feet" : "Feet",
|
||||||
"BOL.equipmentSlots.finder" : "Doigt",
|
"BOL.equipmentSlots.finder" : "Finger",
|
||||||
"BOL.equipmentSlots.ear" : "Oreille",
|
"BOL.equipmentSlots.ear" : "Ear",
|
||||||
|
|
||||||
"BOL.vehicleCategory.mount" : "Monture terrestre",
|
"BOL.vehicleCategory.mount" : "Ground Mount",
|
||||||
"BOL.vehicleCategory.flying" : "Monture volante",
|
"BOL.vehicleCategory.flying" : "Flying Mount",
|
||||||
"BOL.vehicleCategory.boat" : "Bateau",
|
"BOL.vehicleCategory.boat" : "Boat",
|
||||||
"BOL.vehicleCategory.other" : "Autre",
|
"BOL.vehicleCategory.other" : "Other",
|
||||||
|
|
||||||
|
|
||||||
"BOL.range.PointBlank": "Bout portant",
|
"BOL.range.PointBlank": "Point Blank",
|
||||||
"BOL.range.Short": "Courte",
|
"BOL.range.Short": "Short",
|
||||||
"BOL.range.Medium": "Moyenne",
|
"BOL.range.Medium": "Medium",
|
||||||
"BOL.range.Long": "Long",
|
"BOL.range.Long": "Long",
|
||||||
"BOL.range.VeryLong": "Très longue",
|
"BOL.range.VeryLong": "Very Long",
|
||||||
"BOL.range.Extreme": "Extrême",
|
"BOL.range.Extreme": "Extreme",
|
||||||
"BOL.range.Maximum": "Maximale",
|
"BOL.range.Maximum": "Maximum",
|
||||||
|
|
||||||
"BOL.notification.MacroMultipleTokensSelected": "Vous avez sélectionné plusieurs tokens",
|
"BOL.notification.MacroMultipleTokensSelected": "You have selected several tokens!",
|
||||||
"BOL.notification.MacroNoActorAvailable": "Aucun acteur n'a pu être ciblé",
|
"BOL.notification.MacroNoActorAvailable": "No actor could be targeted!",
|
||||||
"BOL.notification.MacroNoTokenSelected": "Vous devez sélectionner un token",
|
"BOL.notification.MacroNoTokenSelected": "You must select a token!",
|
||||||
|
|
||||||
"BOL.size.tiny": "Tiny",
|
"BOL.size.tiny": "Tiny",
|
||||||
"BOL.size.verysmall": "Very Small",
|
"BOL.size.verysmall": "Very Small",
|
||||||
@ -372,6 +390,103 @@
|
|||||||
"BOL.size.enormous": "Enormous",
|
"BOL.size.enormous": "Enormous",
|
||||||
"BOL.size.gigantic": "Gigantic",
|
"BOL.size.gigantic": "Gigantic",
|
||||||
"BOL.size.immense": "Immense",
|
"BOL.size.immense": "Immense",
|
||||||
"BOL.size.colossal": "Colossal"
|
"BOL.size.colossal": "Colossal",
|
||||||
|
|
||||||
|
"BOL.chat.fightactive": "{name} activates the fight option {foName} for this round !",
|
||||||
|
"BOL.chat.fightunactive": "{name} deactivates the fight option {foName} for this round !",
|
||||||
|
"BOL.chat.isdead": "{name} is dead !",
|
||||||
|
"BOL.chat.epitaph": "Keep his name and memory in honor !",
|
||||||
|
"BOL.chat.vitalityzero": "Lifeblood of {name} is now {hp} : he is going to fall unconscious !",
|
||||||
|
"BOL.chat.vitalityheroism": "You can spent 1 Hero Point to raise up for 1 round.",
|
||||||
|
"BOL.chat.vitalityheroismhint": "In this case, your lifeblood raises up to its maximum divided by 2.",
|
||||||
|
"BOL.chat.vitalitydying": "Lifeblood of {name} is now {hp} ! He is dying ...",
|
||||||
|
"BOL.chat.vitalitydyingheroism": "You can spent 1 Hero Point to Defy Death.",
|
||||||
|
"BOL.chat.alchemytitle": "Alchemy recipe : {name}",
|
||||||
|
"BOL.chat.alchemypoints": "Craft Points cost : {pcCostCurrent}",
|
||||||
|
"BOL.chat.alchemysuccess": "The alchemy recipe is a success !<br>Create the relevant item/effect in your Inventory.<br>Stage counter has been resetted.",
|
||||||
|
"BOL.chat.alchemyfailure": "The alchemy recipe has failed !<br>Stage counter has been resetted.",
|
||||||
|
"BOL.chat.rolldamage": "Roll for damages",
|
||||||
|
"BOL.chat.rolldamage6": "Roll for damages +6",
|
||||||
|
"BOL.chat.rolldamage12": "Roll for damages +12 (1 HP)",
|
||||||
|
"BOL.chat.damageresult": "Damages of {name} : {total}",
|
||||||
|
"BOL.chat.damagetarget": "Target : {target}",
|
||||||
|
"BOL.chat.applydamagetotarget": "Apply damages to the target",
|
||||||
|
"BOL.chat.fightoption": "Combat options",
|
||||||
|
"BOL.chat.reroll": "Reroll (1 HP)",
|
||||||
|
"BOL.chat.toheroic": "Convert to Mighty success (1 HP)",
|
||||||
|
"BOL.chat.tolegend": "Convert to Legendary succes (1 HP)",
|
||||||
|
"BOL.chat.hurttitle": "{name} is going to receive {damageTotal} damages !",
|
||||||
|
"BOL.chat.armordefault": "This attack is bypassing armor : armor is not used to reduce damages !",
|
||||||
|
"BOL.chat.witharmor": "Hit with armor",
|
||||||
|
"BOL.chat.withoutarmor": "Hit without armor",
|
||||||
|
"BOL.chat.shakeoff": "Shake off Wounds (1 HP)",
|
||||||
|
"BOL.chat.splinteredshield": "Splintered Shield/Sword {name} (1 HP)",
|
||||||
|
"BOL.chat.damagesummary": "Damages received by {name}",
|
||||||
|
"BOL.chat.protectvalue": "Armor protect",
|
||||||
|
"BOL.chat.noprotectvalue": "No armor !",
|
||||||
|
"BOL.chat.heroreducedamage": "One Hero Point has been spent, for reducing damges by {total}.",
|
||||||
|
"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.spell": "Spell",
|
||||||
|
"BOL.chat.spellcost": "Power Points cost",
|
||||||
|
"BOL.chat.spellremaining": "Remaining Power Points",
|
||||||
|
|
||||||
|
"BOL.dialog.soeasy": "So easy (+4)",
|
||||||
|
"BOL.dialog.veryeasy": "Very easy (+2)",
|
||||||
|
"BOL.dialog.easy": "Easy (+1)",
|
||||||
|
"BOL.dialog.moderate": "Moderate (0)",
|
||||||
|
"BOL.dialog.hard": "Hard (-1)",
|
||||||
|
"BOL.dialog.tough": "Tough (-2)",
|
||||||
|
"BOL.dialog.demanding": "Demanding (-4)",
|
||||||
|
"BOL.dialog.formidable": "Formidable (-6)",
|
||||||
|
"BOL.dialog.heroic": "Heroic (-8)",
|
||||||
|
"BOL.dialog.mythic": "Mythic (-10)",
|
||||||
|
"BOL.dialog.divine": "Divine (-12)",
|
||||||
|
|
||||||
|
"BOL.dialog.pointblank": "Point blank (+1)",
|
||||||
|
"BOL.dialog.close": "Close (0)",
|
||||||
|
"BOL.dialog.medium": "Medium (-1))",
|
||||||
|
"BOL.dialog.long": "Long (-2)",
|
||||||
|
"BOL.dialog.distant": "Distant (-4)",
|
||||||
|
"BOL.dialog.extreme": "Extreme (-6)",
|
||||||
|
"BOL.dialog.utmost": "Utmost (-8)",
|
||||||
|
|
||||||
|
"BOL.ui.name": "Name",
|
||||||
|
"BOL.ui.xp": "Experience",
|
||||||
|
"BOL.ui.xpspent": "Spent",
|
||||||
|
"BOL.ui.xptotal": "Total",
|
||||||
|
"BOL.ui.biosize": "Size",
|
||||||
|
"BOL.ui.bioweight": "Weight",
|
||||||
|
"BOL.ui.bioage": "Age",
|
||||||
|
"BOL.ui.biohair": "Hair",
|
||||||
|
"BOL.ui.bioeyes": "Eyes",
|
||||||
|
"BOL.ui.biosigns": "Signs",
|
||||||
|
"BOL.ui.biodescription": "Description",
|
||||||
|
"BOL.ui.bionotes": "Notes",
|
||||||
|
|
||||||
|
"BOL.chat.welcome1": "Welcome to Barbarians of Lemuria (Ludospherik version)",
|
||||||
|
"BOL.chat.welcome2": "Books are necessary to play, and ca be found here : http://www.ludospherik.fr/content/14-barbarians-of-lemuria",
|
||||||
|
"BOL.chat.welcome3": "The integrated maps are authorized by Guillaume Tavernier and Ludospherik. Thanks to them !.",
|
||||||
|
"BOL.chat.welcome4": "All support for this system is available on this Discord server : https://discord.gg/pPSDNJk",
|
||||||
|
"BOL.chat.welcome5": "Good game in Lemuria !",
|
||||||
|
"BOL.chat.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)"
|
||||||
}
|
}
|
296
lang/fr.json
@ -1,15 +1,26 @@
|
|||||||
{
|
{
|
||||||
"ACTOR.TypeCharacter": "Personnage",
|
"TYPES": {
|
||||||
"ACTOR.TypeEncounter": "Rencontre",
|
"Actor": {
|
||||||
"ITEM.TypeItem": "Objet",
|
"character": "Personnage",
|
||||||
"ITEM.TypeFeature": "Trait",
|
"npc": "PNJ",
|
||||||
"ITEM.TypeWeapon": "Arme",
|
"vehicle": "Véhicule"
|
||||||
"ITEM.TypeArmor": "Armure",
|
},
|
||||||
|
"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 +33,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 +43,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,7 +111,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.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",
|
||||||
@ -107,12 +133,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",
|
||||||
@ -130,6 +167,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?",
|
||||||
@ -150,6 +202,36 @@
|
|||||||
"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.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": "Creature",
|
||||||
|
"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.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",
|
||||||
@ -162,6 +244,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",
|
||||||
@ -170,6 +253,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)",
|
||||||
@ -177,6 +266,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",
|
||||||
@ -185,12 +276,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",
|
||||||
@ -202,21 +296,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",
|
||||||
@ -269,6 +368,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",
|
||||||
@ -278,21 +389,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é",
|
||||||
@ -306,6 +422,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",
|
||||||
@ -322,10 +439,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",
|
||||||
@ -333,6 +452,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",
|
||||||
@ -348,5 +468,157 @@
|
|||||||
"BOL.size.enormous": "Colossale",
|
"BOL.size.enormous": "Colossale",
|
||||||
"BOL.size.gigantic": "Gigantesque",
|
"BOL.size.gigantic": "Gigantesque",
|
||||||
"BOL.size.immense": "Immense",
|
"BOL.size.immense": "Immense",
|
||||||
"BOL.size.colossal": "Monstrueuse"
|
"BOL.size.colossal": "Monstrueuse",
|
||||||
}
|
|
||||||
|
"BOL.chat.fightactive": "{name} active son option de combat {foName} pour ce round !",
|
||||||
|
"BOL.chat.fightunactive": "{name} désactive son option de combat {foName} pour ce round !",
|
||||||
|
"BOL.chat.isdead": "{name} est mort !",
|
||||||
|
"BOL.chat.epitaph": "Que son nom soit honoré sur les champs de batailles de Lémurie !",
|
||||||
|
"BOL.chat.vitalityzero": "La Vitalité de {name} est {hp} : il va s'écrouler au sol et sombrer dans l'inconscience !",
|
||||||
|
"BOL.chat.vitalityheroism": "Vous pouvez dépenser 1 Point d'Héroisme/Vilainie pour reprendre vos esprits pendant 1 round.",
|
||||||
|
"BOL.chat.vitalityheroismhint": "Dans ce cas votre vitalité remonte à son maximum divisé par 2 (arrondi au supérieur).",
|
||||||
|
"BOL.chat.vitalitydying": "La Vitalité de {name} est de {hp} ! Il est mourant ...",
|
||||||
|
"BOL.chat.vitalitydyingheroism": "Vous pouvez cependant dépenser 1 Point d'Héroisme/Vilainie pour Défier la Mort (cf. page 58).",
|
||||||
|
"BOL.chat.alchemytitle": "Préparation Alchimique : {name}",
|
||||||
|
"BOL.chat.alchemypoints": "Points de Création Investis : {pcCostCurrent}",
|
||||||
|
"BOL.chat.alchemysuccess": "La préparation alchimique a été réalisée avec succès !<br>Créez l'item ou l'effet correspondant dans votre Inventaire.<br>L'avancement dans la préparation a été remis à 0.",
|
||||||
|
"BOL.chat.alchemyfailure": "La préparation alchimique a échouée !<br>L'avancement dans la préparation a été remis à 0.",
|
||||||
|
"BOL.chat.rolldamage": "Lancer les dommages",
|
||||||
|
"BOL.chat.rolldamage6": "Lancer les dommages +6",
|
||||||
|
"BOL.chat.rolldamage12": "Dommages +12 (1 Pt. d'Heroisme)",
|
||||||
|
"BOL.chat.damageresult": "Dommages de {name} : {total}",
|
||||||
|
"BOL.chat.damagetarget": "Cible : {target}",
|
||||||
|
"BOL.chat.applydamagetotarget": "Appliquer les dommages à la cible",
|
||||||
|
"BOL.chat.fightoption": "Option de combat",
|
||||||
|
"BOL.chat.reroll": "Relancer (1 P. Heroisme)",
|
||||||
|
"BOL.chat.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.toheroic": "Transformer en succés Héroïque (1 P. Héroisme/Vilainie)",
|
||||||
|
"BOL.chat.tolegend": "Transformer en succes Légendaire (1 P. Heroisme/Vilainie)",
|
||||||
|
"BOL.chat.hurttitle": "{name} va encaisser {damageTotal} dégats !",
|
||||||
|
"BOL.chat.armordefault": "C'est une attaque au défaut de l'armure : vous devez encaisser SANS la protection de l'armure !",
|
||||||
|
"BOL.chat.witharmor": "Encaisser avec la protection de l'armure",
|
||||||
|
"BOL.chat.withoutarmor": "Encaisser sans la protection de l'armure",
|
||||||
|
"BOL.chat.shakeoff": "Juste une égratignure (1 Point d'Héroisme/Vilainie)",
|
||||||
|
"BOL.chat.splinteredshield": "Parade in Extremis avec {name} (1 Point d'Héroisme/Vilainie)",
|
||||||
|
"BOL.chat.damagesummary": "Dégats subis par {name}",
|
||||||
|
"BOL.chat.protectvalue": "Protection de l'armure",
|
||||||
|
"BOL.chat.noprotectvalue": "Aucune protection d'armure !",
|
||||||
|
"BOL.chat.heroreducedamage": "Un point d'héroisme/vilainie dépensé, pour une réduction des dommages supplémentaire de {total}.",
|
||||||
|
"BOL.chat.herosplintered": "Aucun dommage encaissé, grâce à la parade in-extremis avec {weaponHero.name}. L'arme a été détruite pendant cette parade ! Un point d'héroisme/vilainie a également été dépensé.",
|
||||||
|
"BOL.chat.finaldamage": "Encaissement final : {finalDamage} dégats !",
|
||||||
|
"BOL.chat.spell": "Sort",
|
||||||
|
"BOL.chat.spellcost": "Cout en Points de Pouvoir",
|
||||||
|
"BOL.chat.spellremaining": "Points de Pouvoir restants",
|
||||||
|
"BOL.chat.nodamagesummary": "Aucun dégats n'a été subi ....",
|
||||||
|
"BOL.chat.damageresume": "{name} a subi des blessures ...",
|
||||||
|
"BOL.chat.fumblemessage": "Si vous acceptez les conséquences d'un echec catastrophique (au choix du MJ), vous pourrez bénéficier d'1 point d'Héroïsme supplémentaire",
|
||||||
|
"BOL.chat.rangeinfo": "Tir/Lancer de {attackerName} vers {defenderName}",
|
||||||
|
"BOL.chat.rangeweaponinfo": "Arme : {weaponName} - Portée de base {weaponRange}",
|
||||||
|
"BOL.chat.rangeout": "Modificateur : Hors de portée",
|
||||||
|
"BOL.chat.range0": "Modificateur : Bout portant (+1)",
|
||||||
|
"BOL.chat.range1": "Modificateur : Portée courte (0)",
|
||||||
|
"BOL.chat.range2": "Modificateur : Portée moyenne (-1)",
|
||||||
|
"BOL.chat.range3": "Modificateur : Portée longue (-2)",
|
||||||
|
"BOL.chat.range4": "Modificateur : Portée très longue (-4)",
|
||||||
|
"BOL.chat.range5": "Modificateur : Portée extrême (-6)",
|
||||||
|
"BOL.chat.range6": "Modificateur : Portée maximale (-8)",
|
||||||
|
"BOL.chat.rangeprefix": "Distance évaluée : ",
|
||||||
|
"BOL.chat.rangevisible": "La ligne de vue est dégagée entre les protagonistes.",
|
||||||
|
"BOL.chat.rangenotvisible": "La ligne de vue est bloquée entre les protagonistes.",
|
||||||
|
"BOL.chat.rangetitle": "Information MJ",
|
||||||
|
"BOL.chat.weaponreroll1": "Pour information, cette arme relance les 1 sur ses dégâts.",
|
||||||
|
"BOL.chat.rollbougette": "Jet de Bougette",
|
||||||
|
"BOL.chat.bougettesuccess": "Votre bougette reste inchangée !",
|
||||||
|
"BOL.chat.bougettefailure": "Vous avez trop dépensé, votre bougette s'est réduite...",
|
||||||
|
"BOL.chat.initiative": "Rang d'intiative (10 à 1)",
|
||||||
|
"BOL.chat.horoscope": "Horoscope",
|
||||||
|
"BOL.chat.horoscopepoints": "Coût : {points} Points d'Astrologie",
|
||||||
|
"BOL.chat.horoscopeminorsuccess": "Votre horoscope mineur est un succès : éditez le nom de l'horoscope sur votre fiche. Vous bénéficiez d'1 dé Bonus pour cette situation.",
|
||||||
|
"BOL.chat.horoscopeminorfailure": "Votre horoscope mineur est un échec : éditez le nom de l'horoscope sur votre fiche. Vous souffrez d'1 dé Malus pour cette situation.",
|
||||||
|
"BOL.chat.horoscopemajorsuccess": "Votre horoscope majeur est un succès : {horoscopeName} bénéficie d'1 point d'Héroisme de plus pour cette aventure. Ce point a été ajouté automatiquement.",
|
||||||
|
"BOL.chat.horoscopemajorfailure": "Votre horoscope majeur est un échec : {horoscopeName} a perdu 1 point d'Héroisme pour cette aventure. Ce point a été enlevé automatiquement.",
|
||||||
|
"BOL.chat.horoscopemajorgroupsuccess": "Votre horoscope majeur de groupe est un succès. Vous et vos amis bénéficiez de {careerBonus} dés bonus pendant cette aventure.",
|
||||||
|
"BOL.chat.horoscopemajorgroupfailure": "Votre horoscope majeur de groupe est un échec. Vous et vos amis souffrez de {careerBonus} dés malus pendant cette aventure.",
|
||||||
|
"BOL.chat.usedhoroscope": "Horoscope utilisé",
|
||||||
|
"BOL.chat.horoscopedeleted": "Le(s) Horoscopes utilisé(s) a/ont été supprimé(s) automatiquement.",
|
||||||
|
"BOL.chat.criticaloptions": "Succès critique !! Vous pouvez faire (1 option au choix) :",
|
||||||
|
"BOL.chat.criticalcarnage": "Faire un Carnage : vous avez une attaque gratuite supplémentaire. Cette seconde attaque ne peut bénéficier d'un Point d'Héroisme/vilainie.",
|
||||||
|
"BOL.chat.criticalplus6": "Coup Dévastateur : +6 aux dommages (cf bouton ci-dessous).",
|
||||||
|
"BOL.chat.criticalprecise": "Coup Précis : Vous frappez pour diminuer les capacités de votre adversaire. Décrivez ce que vous faites, et si le MJ l'accepte, votre opposant subira un Dé de Malus pour les actions concernées.",
|
||||||
|
"BOL.chat.criticalunarm": "Désarmement : Si votre adversaire a une arme en main, vous le désarmez.",
|
||||||
|
"BOL.chat.criticalrabble": "Massacrer la piétaille : Si vous combattez de la Piétaille, les résultats des dommages indiquent le nombre d'adversaires mis hors de combat.",
|
||||||
|
"BOL.chat.criticalpush": "Renversement : Si la taille le permet, vous poussez votre adversaire au sol, il souffrira d'1 Dé de Malus pour toutes ses actions au round suivant.",
|
||||||
|
"BOL.chat.criticalup": "Transformer en Légendaire : En dépensant 1 point d'Héroisme/Vilainie, vous pouvez transformer ce Succès Héroïque en Légendaire, qui vous permet de prendre 2 options dans la liste ci-dessus (cf. bouton pour un +12 aux dommages par exemple).",
|
||||||
|
"BOL.chat.criticalinfo": "C'est un succès Héroïque ou Légendaire ! Choisissez vos options et effets !",
|
||||||
|
"BOL.chat.criticalbuttonjournal": "Succès Héroïque/Légendaire",
|
||||||
|
|
||||||
|
"BOL.chat.losshp": "{name} a perdu {lossHP} points de Vitalité. Si il se repose quelques minutes, il peut récupérer {recupHP} points de Vitalité.",
|
||||||
|
"BOL.chat.applyrecup": "Récupérer pendant quelques minutes (+{recupHP} Vitalité)",
|
||||||
|
"BOL.chat.inforecup": "{name} vient de récupérer {recupHP} points de Vitalité après quelques minutes de repos.",
|
||||||
|
|
||||||
|
"BOL.dialog.soeasy": "Inmanquable (+4)",
|
||||||
|
"BOL.dialog.veryeasy": "Trés Facile (+2)",
|
||||||
|
"BOL.dialog.easy": "Facile (+1)",
|
||||||
|
"BOL.dialog.moderate": "Moyenne (0)",
|
||||||
|
"BOL.dialog.hard": "Ardue (-1)",
|
||||||
|
"BOL.dialog.tough": "Difficile (-2)",
|
||||||
|
"BOL.dialog.demanding": "Très Difficile (-4)",
|
||||||
|
"BOL.dialog.formidable": "Impossible (-6)",
|
||||||
|
"BOL.dialog.heroic": "Héroïque (-8)",
|
||||||
|
"BOL.dialog.mythic": "Mythique (-10)",
|
||||||
|
"BOL.dialog.divine": "Divine (-12)",
|
||||||
|
|
||||||
|
"BOL.dialog.pointblank": "Bout portant (+1)",
|
||||||
|
"BOL.dialog.close": "Courte (0)",
|
||||||
|
"BOL.dialog.medium": "Moyenne (-1))",
|
||||||
|
"BOL.dialog.long": "Longue (-2)",
|
||||||
|
"BOL.dialog.distant": "Très longue (-4)",
|
||||||
|
"BOL.dialog.extreme": "Extrême (-6)",
|
||||||
|
"BOL.dialog.utmost": "Maximale (-8)",
|
||||||
|
|
||||||
|
"BOL.ui.name": "Nom",
|
||||||
|
"BOL.ui.xp": "Experience",
|
||||||
|
"BOL.ui.xpspent": "Dépensée",
|
||||||
|
"BOL.ui.xptotal": "Totale",
|
||||||
|
"BOL.ui.biosize": "Taille",
|
||||||
|
"BOL.ui.bioweight": "Poids",
|
||||||
|
"BOL.ui.bioage": "Age",
|
||||||
|
"BOL.ui.biohair": "Cheveux",
|
||||||
|
"BOL.ui.bioeyes": "Yeux",
|
||||||
|
"BOL.ui.biosigns": "Signes distinctifs",
|
||||||
|
"BOL.ui.biodescription": "Description",
|
||||||
|
"BOL.ui.bionotes": "Notes",
|
||||||
|
"BOL.ui.xplog":"Journal d'XP",
|
||||||
|
"BOL.ui.value":"Valeur",
|
||||||
|
|
||||||
|
"BOL.chat.welcome1": "Bienvenue dans Barbarians of Lemuria (Ludospherik version)",
|
||||||
|
"BOL.chat.welcome2": "Les livres nécessaires pour jouer sont disponibles sur le site de <a href='http://www.ludospherik.fr/content/14-barbarians-of-lemuria'>l'éditeur Ludospherik.</a>",
|
||||||
|
"BOL.chat.welcome3": "Les cartes intégrées au système le sont grace à l'aimable autorisation de leur auteur Guillaume Tavernier et des éditions Ludospherik. Merci à eux !.",
|
||||||
|
"BOL.chat.welcome4": "Tout le support et le suivi de ce système est disponible via le <a href='https://discord.gg/pPSDNJk'>Discord Foundry FR</a>.",
|
||||||
|
"BOL.chat.welcome5": "Consulter l'aide en ligne pour plus d'informations : @UUID[Compendium.bol.aides-de-jeu.97rugQOtiwt8zPfQ]{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.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)"
|
||||||
|
}
|
@ -12,7 +12,7 @@ export class BoLActorSheet extends ActorSheet {
|
|||||||
return mergeObject(super.defaultOptions, {
|
return 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" }]
|
||||||
@ -25,6 +25,13 @@ export class BoLActorSheet extends ActorSheet {
|
|||||||
activateListeners(html) {
|
activateListeners(html) {
|
||||||
super.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
|
// Everything below here is only needed if the sheet is editable
|
||||||
if (!this.options.editable) return;
|
if (!this.options.editable) return;
|
||||||
|
|
||||||
@ -53,6 +60,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) => {
|
||||||
@ -66,10 +79,9 @@ export class BoLActorSheet extends ActorSheet {
|
|||||||
const incr = parseInt(dataset.incr)
|
const incr = parseInt(dataset.incr)
|
||||||
const min = parseInt(dataset.min)
|
const min = parseInt(dataset.min)
|
||||||
const max = parseInt(dataset.max) || 10000
|
const max = parseInt(dataset.max) || 10000
|
||||||
const itemData = item.data;
|
let value = eval("item." + target)
|
||||||
let value = eval("itemData." + target)
|
|
||||||
value = value || 0
|
value = value || 0
|
||||||
console.log("IncDec", item, target, value, operator, min, max)
|
//console.log("IncDec", item, target, value, operator, min, max)
|
||||||
if (operator === "minus") {
|
if (operator === "minus") {
|
||||||
if (value >= min + incr) value -= incr;
|
if (value >= min + incr) value -= incr;
|
||||||
else value = min;
|
else value = min;
|
||||||
@ -88,8 +100,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")])
|
||||||
@ -108,17 +120,18 @@ 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.data);
|
const actorData = duplicate(data)
|
||||||
let formData = duplicate(data)
|
let formData = duplicate(data)
|
||||||
|
|
||||||
formData.config = game.bol.config
|
formData.config = game.bol.config
|
||||||
formData.data = actorData.data
|
formData.data = actorData
|
||||||
formData.details = this.actor.details
|
formData.details = this.actor.details
|
||||||
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
|
||||||
@ -127,23 +140,34 @@ 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.villainy = this.actor.getVillainy()
|
||||||
|
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
|
||||||
|
|
||||||
@ -226,7 +250,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;
|
||||||
|
229
module/actor/vehicle-sheet.js
Normal file
@ -0,0 +1,229 @@
|
|||||||
|
/**
|
||||||
|
* 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 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)
|
||||||
|
const actorData = duplicate(data)
|
||||||
|
let formData = duplicate(data)
|
||||||
|
|
||||||
|
formData.config = game.bol.config
|
||||||
|
formData.name = this.actor.name
|
||||||
|
formData.img = this.actor.img
|
||||||
|
formData.system = 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 = 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,7 @@
|
|||||||
// 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 { 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,6 +14,11 @@ 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 { BoLCharacterSummary } from "./system/bol-character-summary.js"
|
||||||
|
import { BoLRoll } from "./controllers/bol-rolls.js"
|
||||||
|
import { ClassCounter} from "https://www.uberwald.me/fvtt_appcount/count-class-ready.js"
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
Hooks.once('init', async function () {
|
Hooks.once('init', async function () {
|
||||||
@ -21,14 +27,15 @@ Hooks.once('init', async function () {
|
|||||||
BoLActor,
|
BoLActor,
|
||||||
BoLItem,
|
BoLItem,
|
||||||
BoLHotbar,
|
BoLHotbar,
|
||||||
|
BoLRoll,
|
||||||
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);
|
||||||
});
|
})
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -37,7 +44,7 @@ Hooks.once('init', async function () {
|
|||||||
*/
|
*/
|
||||||
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
|
||||||
@ -47,7 +54,9 @@ 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 })
|
||||||
|
|
||||||
Items.unregisterSheet("core", ItemSheet);
|
Items.unregisterSheet("core", ItemSheet);
|
||||||
Items.registerSheet("bol", BoLItemSheet, { makeDefault: true });
|
Items.registerSheet("bol", BoLItemSheet, { makeDefault: true });
|
||||||
|
|
||||||
@ -55,6 +64,8 @@ Hooks.once('init', async function () {
|
|||||||
BoLUtility.init()
|
BoLUtility.init()
|
||||||
BoLTokenHud.init()
|
BoLTokenHud.init()
|
||||||
BoLHotbar.init()
|
BoLHotbar.init()
|
||||||
|
BoLCommands.init()
|
||||||
|
BoLAdventureGenerator.init()
|
||||||
|
|
||||||
// Preload Handlebars Templates
|
// Preload Handlebars Templates
|
||||||
await preloadHandlebarsTemplates();
|
await preloadHandlebarsTemplates();
|
||||||
@ -67,27 +78,6 @@ Hooks.once('init', async function () {
|
|||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
|
||||||
// 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,
|
|
||||||
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.data.version}"`
|
|
||||||
$.ajax(regURL)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
function welcomeMessage() {
|
function welcomeMessage() {
|
||||||
@ -95,19 +85,41 @@ function welcomeMessage() {
|
|||||||
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-pegasus"><span class="rdd-roll-part">
|
||||||
<strong>Bienvenue dans Barbarians of Lemuria (Ludospherik version)</strong>
|
<strong>` + game.i18n.localize("BOL.chat.welcome1") + `</strong><p>` +
|
||||||
<p>Les livres nécessaires pour jouer sont disponibles sur le site de l'éditeur : http://www.ludospherik.fr/content/14-barbarians-of-lemuria</p>
|
game.i18n.localize("BOL.chat.welcome2") + "<p>" +
|
||||||
<p>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 !.
|
game.i18n.localize("BOL.chat.welcome3") + "<p>" +
|
||||||
<p>Tout le support et le suivi de ce système es disponible via le Discord Foundry FR : https://discord.gg/pPSDNJk </p>
|
game.i18n.localize("BOL.chat.welcome4") + "</p>" +
|
||||||
<p>Bon jeu en Lemurie !</p>
|
game.i18n.localize("BOL.chat.welcome5") + "<br>" +
|
||||||
` });
|
game.i18n.localize("BOL.chat.welcome6")
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
Hooks.once('ready', async function () {
|
Hooks.once('ready', async function () {
|
||||||
registerUsageCount('bol')
|
|
||||||
|
BoLUtility.ready()
|
||||||
|
BoLCharacterSummary.ready()
|
||||||
|
|
||||||
|
ClassCounter.registerUsageCount()
|
||||||
|
|
||||||
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,53 +16,131 @@ export class BoLRoll {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static attributeCheck(actor, key) {
|
static updateApplicableEffects(rollData) {
|
||||||
|
let appEffects = []
|
||||||
|
for (let effect of rollData.bolEffects) {
|
||||||
|
if (effect.system.properties.identifier == "always") {
|
||||||
|
appEffects.push(effect)
|
||||||
|
} else if (effect.system.properties.identifier.includes(rollData.attribute.key)) {
|
||||||
|
appEffects.push(effect)
|
||||||
|
} else if (rollData.aptitude && effect.system.properties.identifier.includes(rollData.aptitude.key)) {
|
||||||
|
appEffects.push(effect)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return appEffects
|
||||||
|
}
|
||||||
|
|
||||||
let attribute = eval(`actor.data.data.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,
|
||||||
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(),
|
||||||
|
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.data.data.aptitudes.${key}`)
|
let aptitude = eval(`actor.system.aptitudes.${key}`)
|
||||||
let attrKey = this.getDefaultAttribute(key)
|
let attrKey = this.getDefaultAttribute(key)
|
||||||
let attribute = eval(`actor.data.data.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,
|
|
||||||
attribute: attribute,
|
return this.displayRollDialog(rollData)
|
||||||
aptitude: aptitude,
|
}
|
||||||
attrValue: attribute.value,
|
|
||||||
aptValue: aptitude.value,
|
/* -------------------------------------------- */
|
||||||
armorAgiMalus: actor.getArmorAgiMalus(),
|
static async detectDistance(weapon, target) {
|
||||||
armorInitMalus: actor.getArmorInitMalus(),
|
let visible, dist
|
||||||
label: label,
|
if (target && (weapon.system.properties.ranged || weapon.system.properties.throwing)) {
|
||||||
careerBonus: 0,
|
console.log("target", target, weapon)
|
||||||
description: description,
|
visible = canvas.effects.visibility.testVisibility(target.center, { object: _token })
|
||||||
mod: 0
|
dist = Number(canvas.grid.measureDistances([{ ray: new Ray(_token.center, target.center) }], { gridSpaces: false })).toFixed(2)
|
||||||
|
let range = Number(weapon.system.properties.range)
|
||||||
|
let rangeMsg = "BOL.chat.rangeout"
|
||||||
|
if (dist <= range) {
|
||||||
|
rangeMsg = "BOL.chat.range0"
|
||||||
|
} else if (dist < range * 2) {
|
||||||
|
rangeMsg = "BOL.chat.range1"
|
||||||
|
} else if (dist < range * 3) {
|
||||||
|
rangeMsg = "BOL.chat.range2"
|
||||||
|
} else if (dist < range * 4) {
|
||||||
|
rangeMsg = "BOL.chat.range3"
|
||||||
|
} else if (dist < range * 5) {
|
||||||
|
rangeMsg = "BOL.chat.range4"
|
||||||
|
} else if (dist < range * 6) {
|
||||||
|
rangeMsg = "BOL.chat.range5"
|
||||||
|
} else if (dist < range * 7) {
|
||||||
|
rangeMsg = "BOL.chat.range6"
|
||||||
|
}
|
||||||
|
ChatMessage.create({
|
||||||
|
content: await renderTemplate('systems/bol/templates/chat/chat-info-range.hbs', {
|
||||||
|
weapon: weapon,
|
||||||
|
attackerName: _token.actor.name,
|
||||||
|
defenderName: target.actor.name,
|
||||||
|
weaponRange: weapon.system.properties.range,
|
||||||
|
visible: visible,
|
||||||
|
distance: dist,
|
||||||
|
rangeMsg: rangeMsg
|
||||||
|
})
|
||||||
})
|
})
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
@ -70,121 +148,130 @@ export class BoLRoll {
|
|||||||
|
|
||||||
let target = BoLUtility.getTarget()
|
let target = BoLUtility.getTarget()
|
||||||
|
|
||||||
let weaponData = weapon.data.data
|
let weaponData = weapon.system
|
||||||
let attribute = eval(`actor.data.data.attributes.${weaponData.properties.attackAttribute}`)
|
let attribute = eval(`actor.system.attributes.${weaponData.properties.attackAttribute}`)
|
||||||
let aptitude = eval(`actor.data.data.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.data.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
|
||||||
weapon: weapon,
|
rollData.targetId = target?.id
|
||||||
isRanged: weaponData.properties.ranged || weaponData.properties.throwing,
|
rollData.fightOption = fightOption
|
||||||
targetId: target?.id,
|
rollData.defenderId = target?.actor.id
|
||||||
fightOption: fightOption,
|
rollData.label = (weapon.name) ? weapon.name : game.i18n.localize('BOL.ui.noWeaponName')
|
||||||
careerBonus: 0,
|
rollData.description = game.i18n.localize('BOL.ui.weaponAttack') + " : " + weapon.name
|
||||||
defenderId: target?.data?.actorId,
|
|
||||||
attribute: attribute,
|
return this.displayRollDialog(rollData)
|
||||||
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")
|
||||||
const weapon = actor.items.get(li.data("item-id"))
|
let weapon = actor.items.get(li.data("item-id"))
|
||||||
if (!weapon) {
|
if (!weapon) {
|
||||||
ui.notifications.warn("Unable to find weapon !")
|
ui.notifications.warn("Unable to find weapon !")
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
weapon = duplicate(weapon)
|
||||||
return this.weaponCheckWithWeapon(actor, weapon)
|
return this.weaponCheckWithWeapon(actor, weapon)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static alchemyCheck(actor, event) {
|
static alchemyCheck(actor, event) {
|
||||||
const li = $(event.currentTarget).parents(".item");
|
const li = $(event.currentTarget).parents(".item");
|
||||||
const alchemy = actor.items.get(li.data("item-id"));
|
let alchemy = actor.items.get(li.data("item-id"));
|
||||||
if (!alchemy) {
|
if (!alchemy) {
|
||||||
ui.notifications.warn("Unable to find Alchemy !");
|
ui.notifications.warn("Unable to find Alchemy !");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
let alchemyData = alchemy.data.data
|
alchemy = duplicate(alchemy)
|
||||||
|
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
|
||||||
alchemy: alchemy,
|
rollData.careerBonus = actor.getAlchemistBonus()
|
||||||
attribute: actor.data.data.attributes.mind,
|
rollData.pcCost = Number(alchemyData.properties.pccost)
|
||||||
attrValue: actor.data.data.attributes.mind.value,
|
rollData.pcCostCurrent = Number(alchemyData.properties.pccurrent)
|
||||||
aptValue: 0,
|
rollData.mod = Number(alchemyData.properties.difficulty)
|
||||||
careerBonus: actor.getAlchemistBonus(),
|
rollData.label = alchemy.name
|
||||||
pcCost: Number(alchemyData.properties.pccost),
|
rollData.description = game.i18n.localize('BOL.ui.makeAlchemy') + "+" + alchemy.name
|
||||||
pcCostCurrent: Number(alchemyData.properties.pccurrent),
|
|
||||||
mod: Number(alchemyData.properties.difficulty),
|
console.log("ALCHEMY!", rollData);
|
||||||
armorAgiMalus: actor.getArmorAgiMalus(),
|
return this.displayRollDialog(rollData);
|
||||||
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 spellData = spell.data.data
|
|
||||||
let spellDef = {
|
let target = BoLUtility.getTarget()
|
||||||
mode: "spell",
|
|
||||||
actorId: actor.id,
|
let cost = (horoscopeType == "minor") ? 1 : 2
|
||||||
spell: spell,
|
if (cost > actor.getAstrologyPoints()) {
|
||||||
attribute: actor.data.data.attributes.mind,
|
ui.notifications.warn(game.i18n.localize("BOL.ui.astrologyNoPoints"))
|
||||||
attrValue: actor.data.data.attributes.mind.value,
|
return
|
||||||
aptValue: 0,
|
|
||||||
ppCurrent: Number(actor.data.data.resources.power.value),
|
|
||||||
careerBonus: actor.getSorcererBonus(),
|
|
||||||
ppCostArmor: actor.getPPCostArmor(),
|
|
||||||
ppCost: Number(spell.data.data.properties.ppcost),
|
|
||||||
mod: Number(spellData.properties.difficulty),
|
|
||||||
armorAgiMalus: actor.getArmorAgiMalus(),
|
|
||||||
armorInitMalus: actor.getArmorInitMalus(),
|
|
||||||
label: spell.name,
|
|
||||||
description: game.i18n.localize('BOL.ui.focusSpell') + " : " + spell.name,
|
|
||||||
}
|
}
|
||||||
console.log("SPELL!", spellDef)
|
let rollData = this.getCommonRollData(actor, "horoscope", actor.system.attributes.mind)
|
||||||
return this.displayRollDialog(spellDef)
|
|
||||||
|
rollData.careerBonus = actor.getAstrologerBonus()
|
||||||
|
rollData.horoscopeType = horoscopeType
|
||||||
|
rollData.horoscopeTypeLabel = "BOL.ui." + horoscopeType
|
||||||
|
rollData.astrologyPointsCost = cost
|
||||||
|
rollData.label = game.i18n.localize('BOL.ui.makeHoroscope')
|
||||||
|
rollData.description = game.i18n.localize('BOL.ui.makeHoroscope') + " " + game.i18n.localize(rollData.horoscopeTypeLabel)
|
||||||
|
rollData.targetId = target?.id
|
||||||
|
|
||||||
|
console.log("HOROSCOPE!", rollData);
|
||||||
|
return this.displayRollDialog(rollData);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* -------------------------------------------- */
|
||||||
|
static spellCheckWithSpell(actor, spell) {
|
||||||
|
let rollData = this.getCommonRollData(actor, "spell", actor.system.attributes.mind)
|
||||||
|
|
||||||
|
rollData.spell = spell
|
||||||
|
rollData.ppCurrent = Number(actor.system.resources.power.value),
|
||||||
|
rollData.careerBonus = actor.getSorcererBonus(),
|
||||||
|
rollData.ppCostArmor = actor.getPPCostArmor(),
|
||||||
|
rollData.ppCost = Number(spell.system.properties.ppcost),
|
||||||
|
rollData.mod = Number(spell.system.properties.difficulty),
|
||||||
|
rollData.label = spell.name,
|
||||||
|
rollData.description = game.i18n.localize('BOL.ui.focusSpell') + " : " + spell.name
|
||||||
|
|
||||||
|
//console.log("SPELL!", spellDef)
|
||||||
|
return this.displayRollDialog(rollData)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static spellCheck(actor, event) {
|
static spellCheck(actor, event) {
|
||||||
if (actor.data.data.resources.power.value <= 0) {
|
if (actor.system.resources.power.value <= 0) {
|
||||||
ui.notifications.warn("Plus assez de points de Pouvoir !")
|
ui.notifications.warn("Plus assez de points de Pouvoir !")
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
const li = $(event.currentTarget).parents(".item")
|
const li = $(event.currentTarget).parents(".item")
|
||||||
const spell = actor.items.get(li.data("item-id"))
|
let spell = actor.items.get(li.data("item-id"))
|
||||||
if (!spell) {
|
if (!spell) {
|
||||||
ui.notifications.warn("Impossible de trouver ce sort !")
|
ui.notifications.warn("Impossible de trouver ce sort !")
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
return this.spellCheckWithSpell( actor, spell)
|
spell = duplicate(spell)
|
||||||
|
return this.spellCheckWithSpell(actor, spell)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
@ -193,8 +280,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 {
|
||||||
@ -202,12 +316,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.data.data.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)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
@ -219,20 +340,20 @@ export class BoLRoll {
|
|||||||
let fgItem = rollData.fightOption
|
let fgItem = rollData.fightOption
|
||||||
if (fgItem) {
|
if (fgItem) {
|
||||||
console.log(fgItem)
|
console.log(fgItem)
|
||||||
if (fgItem.data.properties.fightoptiontype == "armordefault") {
|
if (fgItem.system.properties.fightoptiontype == "armordefault") {
|
||||||
rollData.modArmorMalus = rollData.armorMalus // Activate the armor malus
|
rollData.modArmorMalus = rollData.armorMalus // Activate the armor malus
|
||||||
rollData.damagesIgnoresArmor = true
|
rollData.damagesIgnoresArmor = true
|
||||||
}
|
}
|
||||||
if (fgItem.data.properties.fightoptiontype == "intrepid") {
|
if (fgItem.system.properties.fightoptiontype == "intrepid") {
|
||||||
rollData.attackModifier += 2
|
rollData.attackModifier += 2
|
||||||
}
|
}
|
||||||
if (fgItem.data.properties.fightoptiontype == "defense") {
|
if (fgItem.system.properties.fightoptiontype == "defense") {
|
||||||
rollData.attackModifier += -1
|
rollData.attackModifier += -1
|
||||||
}
|
}
|
||||||
if (fgItem.data.properties.fightoptiontype == "attack") {
|
if (fgItem.system.properties.fightoptiontype == "attack") {
|
||||||
rollData.attackModifier += 1
|
rollData.attackModifier += 1
|
||||||
}
|
}
|
||||||
if (fgItem.data.properties.fightoptiontype == "twoweaponsdef" || fgItem.data.properties.fightoptiontype == "twoweaponsatt") {
|
if (fgItem.system.properties.fightoptiontype == "twoweaponsdef" || fgItem.system.properties.fightoptiontype == "twoweaponsatt") {
|
||||||
rollData.attackModifier += -1
|
rollData.attackModifier += -1
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -267,7 +388,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) => {
|
||||||
@ -281,16 +402,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.data.data.attributes[attrKey])
|
this.rollData.attribute = duplicate(actor.system.attributes[attrKey])
|
||||||
this.rollData.attrValue = actor.data.data.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.data.data.aptitudes[aptKey])
|
this.rollData.aptitude = duplicate(actor.system.aptitudes[aptKey])
|
||||||
this.rollData.aptValue = actor.data.data.aptitudes[aptKey].value
|
this.rollData.aptValue = actor.system.aptitudes[aptKey].value
|
||||||
|
this.rollData.bolApplicableEffects = this.updateApplicableEffects(this.rollData)
|
||||||
this.updateTotalDice()
|
this.updateTotalDice()
|
||||||
})
|
})
|
||||||
|
|
||||||
@ -300,6 +423,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) => {
|
||||||
@ -309,12 +433,12 @@ export class BoLRoll {
|
|||||||
})
|
})
|
||||||
html.find('#boon').change((event) => {
|
html.find('#boon').change((event) => {
|
||||||
let boons = $('#boon').val()
|
let boons = $('#boon').val()
|
||||||
this.rollData.nbBoons = (!boons || boons.length == 0) ? 0 : Math.max(...boons.map(i => parseInt(i)))
|
this.rollData.nbBoons = (!boons || boons.length == 0) ? 0 : boons.length
|
||||||
this.updateTotalDice()
|
this.updateTotalDice()
|
||||||
})
|
})
|
||||||
html.find('#flaw').change((event) => {
|
html.find('#flaw').change((event) => {
|
||||||
let flaws = $('#flaw').val()
|
let flaws = $('#flaw').val()
|
||||||
this.rollData.nbFlaws = (!flaws || flaws.length == 0) ? 0 : Math.max(...flaws.map(i => parseInt(i)))
|
this.rollData.nbFlaws = (!flaws || flaws.length == 0) ? 0 : flaws.length
|
||||||
this.updateTotalDice()
|
this.updateTotalDice()
|
||||||
})
|
})
|
||||||
html.find('.bdice').click((event) => {
|
html.find('.bdice').click((event) => {
|
||||||
@ -327,22 +451,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(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(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) {
|
static preProcessWeapon(rollData, defender) {
|
||||||
if (rollData.mode == "weapon") {
|
if (rollData.mode == "weapon") {
|
||||||
rollData.weaponModifier = rollData.weapon.data.data.properties.attackModifiers ?? 0;
|
rollData.weaponModifier = rollData.weapon.system.properties.attackModifiers ?? 0
|
||||||
rollData.attackBonusDice = rollData.weapon.data.data.properties.attackBonusDice
|
rollData.attackBonusDice = rollData.weapon.system.properties.attackBonusDice
|
||||||
if (rollData.defender) { // If target is selected
|
if (rollData.attackBonusDice) {
|
||||||
rollData.defence = rollData.defender.defenseValue
|
rollData.adv = "1B"
|
||||||
rollData.armorMalus = rollData.defender.armorMalusValue
|
rollData.bDice = 1
|
||||||
|
}
|
||||||
|
if (defender) { // If target is selected
|
||||||
|
rollData.defence = defender.defenseValue
|
||||||
|
rollData.armorMalus = defender.armorMalusValue
|
||||||
|
rollData.defenderHeroPoints = defender.getHeroPoints()
|
||||||
rollData.shieldBlock = 'none'
|
rollData.shieldBlock = 'none'
|
||||||
let shields = rollData.defender.shields
|
let shields = defender.shields
|
||||||
|
//console.log("Defender stats", defender)
|
||||||
for (let shield of shields) {
|
for (let shield of shields) {
|
||||||
rollData.shieldBlock = (shield.data.properties.blocking.blockingAll) ? 'blockall' : 'blockone';
|
rollData.shieldBlock = (shield.system.properties.blocking.blockingAll) ? 'blockall' : 'blockone';
|
||||||
rollData.shieldAttackMalus = (shield.data.properties.blocking.malus) ? shield.data.properties.blocking.malus : 1;
|
rollData.shieldAttackMalus = (shield.system.properties.blocking.malus) ? shield.system.properties.blocking.malus : 1;
|
||||||
rollData.applyShieldMalus = false
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -355,7 +509,13 @@ 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
|
||||||
|
if (rollData.targetId) {
|
||||||
|
let token = game.scenes.current.tokens.get(rollData.targetId)
|
||||||
|
defender = token.actor
|
||||||
|
}
|
||||||
|
|
||||||
rollData.careers = actor.careers
|
rollData.careers = actor.careers
|
||||||
rollData.boons = actor.bonusBoons
|
rollData.boons = actor.bonusBoons
|
||||||
rollData.flaws = actor.malusFlaws
|
rollData.flaws = actor.malusFlaws
|
||||||
@ -368,11 +528,7 @@ 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
|
||||||
@ -381,10 +537,16 @@ export class BoLRoll {
|
|||||||
rollData.attackBonusDice = false
|
rollData.attackBonusDice = false
|
||||||
rollData.armorMalus = 0
|
rollData.armorMalus = 0
|
||||||
// Specific stuff
|
// Specific stuff
|
||||||
this.preProcessWeapon(rollData)
|
this.preProcessWeapon(rollData, defender)
|
||||||
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)
|
||||||
@ -411,20 +573,21 @@ export class BoLRoll {
|
|||||||
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.data.data.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();
|
||||||
@ -443,7 +606,6 @@ export class BoLRoll {
|
|||||||
export class BoLDefaultRoll {
|
export class BoLDefaultRoll {
|
||||||
|
|
||||||
constructor(rollData) {
|
constructor(rollData) {
|
||||||
BoLUtility.storeRoll(rollData)
|
|
||||||
this.rollData = rollData
|
this.rollData = rollData
|
||||||
if (this.rollData.isSuccess == undefined) { // First init
|
if (this.rollData.isSuccess == undefined) { // First init
|
||||||
this.rollData.isSuccess = false;
|
this.rollData.isSuccess = false;
|
||||||
@ -451,10 +613,10 @@ export class BoLDefaultRoll {
|
|||||||
this.rollData.isFumble = false;
|
this.rollData.isFumble = false;
|
||||||
}
|
}
|
||||||
if (this.rollData.optionsId) {
|
if (this.rollData.optionsId) {
|
||||||
$(`#${this.rollData.optionsId}`).hide() // Hide the options roll buttons
|
BoLUtility.cleanupButtons(this.rollData.optionsId)
|
||||||
}
|
}
|
||||||
if (this.rollData.applyId) {
|
if (this.rollData.applyId) {
|
||||||
$(`#${this.rollData.applyId}`).hide() // Hide the options roll buttons
|
BoLUtility.cleanupButtons(this.rollData.applyId)
|
||||||
}
|
}
|
||||||
this.rollData.optionsId = randomID(16)
|
this.rollData.optionsId = randomID(16)
|
||||||
this.rollData.applyId = randomID(16)
|
this.rollData.applyId = randomID(16)
|
||||||
@ -464,60 +626,87 @@ export class BoLDefaultRoll {
|
|||||||
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)
|
//console.log("Roll formula", this.rollData.formula)
|
||||||
await r.roll({ "async": false })
|
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.isSuccess = (r.total >= diceData.successValue)
|
||||||
this.rollData.isCritical = (diceTotal === 12)
|
this.rollData.isCritical = (diceTotal >= diceData.criticalSuccessValue)
|
||||||
this.rollData.isRealCritical = (diceTotal === 12)
|
this.rollData.isRealCritical = (diceTotal >= diceData.criticalSuccessValue)
|
||||||
this.rollData.isHeroic = (diceTotal === 12)
|
this.rollData.isHeroic = (diceTotal >= diceData.criticalSuccessValue)
|
||||||
this.rollData.isLegendary = false
|
this.rollData.isLegendary = false
|
||||||
this.rollData.isFumble = (diceTotal === 2)
|
this.rollData.isFumble = (diceTotal <= diceData.criticalFailureValue)
|
||||||
this.rollData.isFailure = !this.rollData.isSuccess
|
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
|
||||||
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(msgFlavor => {
|
this._buildChatMessage(this.rollData).then(async msgFlavor => {
|
||||||
this.rollData.roll.toMessage({
|
//console.log("MSG", msgFlavor )
|
||||||
|
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 = duplicate(this.rollData.roll) // Remove object, keep data (v111 ready)
|
||||||
|
msg.setFlag("world", "bol-roll-data", this.rollData)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
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()
|
||||||
}
|
}
|
||||||
@ -525,17 +714,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
|
||||||
@ -543,34 +735,30 @@ 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(msgFlavor => {
|
this._buildDamageChatMessage(this.rollData).then(async msgFlavor => {
|
||||||
this.rollData.damageRoll.toMessage({
|
let msg = await this.rollData.damageRoll.toMessage({
|
||||||
user: game.user.id,
|
user: game.user.id,
|
||||||
flavor: msgFlavor,
|
flavor: msgFlavor,
|
||||||
speaker: ChatMessage.getSpeaker({ actor: actor }),
|
speaker: ChatMessage.getSpeaker({ actor: actor }),
|
||||||
flags: { msgType: "default" }
|
flags: { msgType: "default" }
|
||||||
})
|
})
|
||||||
});
|
this.rollData.damageRoll = duplicate(this.rollData.damageRoll)
|
||||||
|
this.rollData.actor = undefined // Cleanup
|
||||||
|
msg.setFlag("world", "bol-roll-data", this.rollData)
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
getDamageAttributeValue(attrDamage) {
|
getDamageAttributeValue(attrDamage, actorId = undefined) {
|
||||||
let attrDamageValue = 0
|
let actor = BoLUtility.getActorFromRollData(this.rollData)
|
||||||
let actor = game.actors.get( this.rollData.actorId)
|
return actor.getDamageAttributeValue(attrDamage)
|
||||||
if (attrDamage.includes("vigor")) {
|
|
||||||
attrDamageValue = actor.data.data.attributes.vigor.value
|
|
||||||
if (attrDamage.includes("half")) {
|
|
||||||
attrDamageValue = Math.floor(attrDamageValue / 2)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return attrDamageValue
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
async rollDamage() {
|
async rollDamage() {
|
||||||
if (this.rollData.mode != "weapon") { // Only specific process in Weapon mode
|
if (this.rollData.mode != "weapon") { // Only specific process in Weapon mode
|
||||||
return;
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
if (this.rollData.isSuccess) {
|
if (this.rollData.isSuccess) {
|
||||||
@ -582,19 +770,19 @@ export class BoLDefaultRoll {
|
|||||||
if (this.rollData.damageMode == 'damage-plus-12') {
|
if (this.rollData.damageMode == 'damage-plus-12') {
|
||||||
bonusDmg = 12
|
bonusDmg = 12
|
||||||
}
|
}
|
||||||
let attrDamageValue = this.getDamageAttributeValue(this.rollData.weapon.data.data.properties.damageAttribute)
|
let attrDamageValue = this.getDamageAttributeValue(this.rollData.weapon.system.properties.damageAttribute)
|
||||||
let weaponFormula = BoLUtility.getDamageFormula(this.rollData.weapon.data.data, 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({ "async": false })
|
||||||
this.rollData.damageTotal = this.rollData.damageRoll.total
|
this.rollData.damageTotal = this.rollData.damageRoll.total
|
||||||
|
console.log("DAMAGE !!!", damageFormula, attrDamageValue, this.rollData)
|
||||||
}
|
}
|
||||||
$(`#${this.rollData.optionsId}`).hide() // Hide the options roll buttons
|
BoLUtility.cleanupButtons(this.rollData.optionsId)
|
||||||
this.sendDamageMessage()
|
this.sendDamageMessage()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -607,8 +795,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)
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -19,43 +19,45 @@ export class BoLItemSheet extends ItemSheet {
|
|||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
/** @override */
|
/** @override */
|
||||||
getData(options) {
|
async getData(options) {
|
||||||
const data = super.getData(options);
|
const data = super.getData(options)
|
||||||
const itemData = data.data;
|
let itemData = duplicate(data.document)
|
||||||
data.config = game.bol.config;
|
data.config = game.bol.config
|
||||||
data.item = itemData;
|
data.item = itemData
|
||||||
data.data = itemData.data;
|
data.category = itemData.system.category
|
||||||
data.category = itemData.category;
|
|
||||||
data.itemProperties = this.item.itemProperties;
|
|
||||||
data.isGM = game.user.isGM;
|
data.isGM = game.user.isGM;
|
||||||
|
data.itemProperties = this.item.itemProperties;
|
||||||
|
data.description = await TextEditor.enrichHTML(this.object.system.description, { async: true })
|
||||||
|
if (data.document.actor) {
|
||||||
|
data.careers = data.document.actor.careers
|
||||||
|
}
|
||||||
// Dynamic default data fix/adapt
|
// Dynamic default data fix/adapt
|
||||||
if (itemData.type == "item") {
|
if (itemData.type == "item") {
|
||||||
if (!itemData.data.category) {
|
if (!itemData.system.category) {
|
||||||
itemData.data.category = "equipment"
|
itemData.system.category = "equipment"
|
||||||
}
|
}
|
||||||
if ( itemData.data.category == "equipment" && itemData.data.properties.equipable) {
|
if (itemData.system.category == "equipment" && itemData.system.properties.equipable) {
|
||||||
if (!itemData.data.properties.slot) {
|
if (!itemData.system.properties.slot) {
|
||||||
itemData.data.properties.slot = "-"
|
itemData.system.properties.slot = "-"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (itemData.data.category == 'spell') {
|
if (itemData.system.category == 'spell') {
|
||||||
if(!itemData.data.properties.mandatoryconditions) {
|
if (!itemData.system.properties.mandatoryconditions) {
|
||||||
itemData.data.properties.mandatoryconditions = []
|
itemData.system.properties.mandatoryconditions = []
|
||||||
}
|
}
|
||||||
if(!itemData.data.properties.optionnalconditions) {
|
if (!itemData.system.properties.optionnalconditions) {
|
||||||
itemData.data.properties.optionnalconditions = []
|
itemData.system.properties.optionnalconditions = []
|
||||||
}
|
}
|
||||||
for (let i = 0; i < 4; i++) {
|
for (let i = 0; i < 4; i++) {
|
||||||
itemData.data.properties.mandatoryconditions[i] = itemData.data.properties.mandatoryconditions[i] ?? ""
|
itemData.system.properties.mandatoryconditions[i] = itemData.system.properties.mandatoryconditions[i] ?? ""
|
||||||
}
|
}
|
||||||
for (let i = 0; i < 8; i++) {
|
for (let i = 0; i < 8; i++) {
|
||||||
itemData.data.properties.optionnalconditions[i] = itemData.data.properties.optionnalconditions[i] ?? ""
|
itemData.system.properties.optionnalconditions[i] = itemData.system.properties.optionnalconditions[i] ?? ""
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (!itemData.data.subtype) {
|
if (!itemData.system.subtype) {
|
||||||
itemData.data.category = "origin"
|
itemData.system.category = "origin"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -64,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 = 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);
|
||||||
|
@ -7,21 +7,17 @@ export class BoLItem extends Item {
|
|||||||
* Augment the basic Item data model with additional dynamic data.
|
* Augment the basic Item data model with additional dynamic data.
|
||||||
*/
|
*/
|
||||||
prepareData() {
|
prepareData() {
|
||||||
super.prepareData();
|
super.prepareData()
|
||||||
// console.debug("Item prepareData");
|
|
||||||
// Get the Item's data
|
|
||||||
const itemData = this.data;
|
|
||||||
// console.log(itemData);
|
|
||||||
const actorData = this.actor ? this.actor.data : {};
|
|
||||||
const data = itemData.data;
|
|
||||||
}
|
|
||||||
|
|
||||||
get properties() {
|
const actorData = this.actor ? this.actor.system : {}
|
||||||
return this.data.properties;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
|
get properties() {
|
||||||
|
return this.system.properties
|
||||||
|
}
|
||||||
|
|
||||||
|
/* -------------------------------------------- */
|
||||||
/**
|
/**
|
||||||
* Get the Array of item properties which are used in the small sidebar of the description tab
|
* Get the Array of item properties which are used in the small sidebar of the description tab
|
||||||
* @return {Array}
|
* @return {Array}
|
||||||
@ -29,11 +25,11 @@ export class BoLItem extends Item {
|
|||||||
*/
|
*/
|
||||||
get itemProperties() {
|
get itemProperties() {
|
||||||
const props = [];
|
const props = [];
|
||||||
if ( this.data.type === "item" ) {
|
if ( this.type === "item" ) {
|
||||||
const entries = Object.entries(this.data.data.properties);
|
const entries = Object.entries(this.system.properties)
|
||||||
props.push(...entries.filter(e => e[1] === true).map(e => { return game.bol.config.itemProperties2[e[0]] }));
|
props.push(...entries.filter(e => e[1] === true).map(e => { return game.bol.config.itemProperties2[e[0]] }))
|
||||||
}
|
}
|
||||||
return props.filter(p => !!p);
|
return props.filter(p => !!p)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
620
module/system/adventure_data.json
Normal file
@ -0,0 +1,620 @@
|
|||||||
|
{
|
||||||
|
"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, weapon)
|
if (actionItem.system.subtype == "weapon") {
|
||||||
//console.log("Clicked", action)
|
BoLRoll.weaponCheckWithWeapon(hudData.actor, duplicate(actionItem))
|
||||||
} )
|
} else if (actionItem.system.subtype == "fightoption") {
|
||||||
|
let chatData = 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);
|
||||||
|
|
||||||
|
86
module/system/bol-adventure-generator.js
Normal file
@ -0,0 +1,86 @@
|
|||||||
|
/* -------------------------------------------- */
|
||||||
|
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,7 +40,7 @@ export class BoLCalendar extends Application {
|
|||||||
constructor() {
|
constructor() {
|
||||||
super();
|
super();
|
||||||
// position
|
// position
|
||||||
this.calendarPos = duplicate(game.settings.get(SYSTEM_RDD, "calendar-pos"));
|
this.calendarPos = 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)
|
||||||
|
162
module/system/bol-character-summary.js
Normal file
@ -0,0 +1,162 @@
|
|||||||
|
/* -------------------------------------------- */
|
||||||
|
import { BoLUtility } from "./bol-utility.js";
|
||||||
|
import { BoLRoll } from "../controllers/bol-rolls.js";
|
||||||
|
|
||||||
|
/* -------------------------------------------- */
|
||||||
|
export class BoLCharacterSummary extends Application {
|
||||||
|
|
||||||
|
/* -------------------------------------------- */
|
||||||
|
static displayPCSummary(){
|
||||||
|
game.bol.charSummary.render(true)
|
||||||
|
}
|
||||||
|
/* -------------------------------------------- */
|
||||||
|
updatePCSummary(){
|
||||||
|
if ( this.rendered) {
|
||||||
|
this.render(true)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* -------------------------------------------- */
|
||||||
|
static createSummaryPos() {
|
||||||
|
return { top: 200, left: 200 };
|
||||||
|
}
|
||||||
|
|
||||||
|
/* -------------------------------------------- */
|
||||||
|
static ready() {
|
||||||
|
if ( !game.user.isGM ) { // Uniquement si GM
|
||||||
|
return
|
||||||
|
}
|
||||||
|
let charSummary = new BoLCharacterSummary()
|
||||||
|
game.bol.charSummary = charSummary
|
||||||
|
}
|
||||||
|
|
||||||
|
/* -------------------------------------------- */
|
||||||
|
constructor() {
|
||||||
|
super();
|
||||||
|
//game.settings.set("world", "character-summary-data", {npcList: [], x:0, y:0})
|
||||||
|
this.settings = game.settings.get("world", "character-summary-data")
|
||||||
|
}
|
||||||
|
|
||||||
|
/* -------------------------------------------- */
|
||||||
|
static get defaultOptions() {
|
||||||
|
return mergeObject(super.defaultOptions, {
|
||||||
|
template: "systems/bol/templates/apps/character-summary-template.html",
|
||||||
|
popOut: true,
|
||||||
|
resizable: true,
|
||||||
|
dragDrop: [{ dragSelector: ".items-list .item", dropSelector: null }],
|
||||||
|
classes: ["bol", "dialog"], width: 820, height: 'fit-content'
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
/* -------------------------------------------- */
|
||||||
|
getData() {
|
||||||
|
let formData = super.getData();
|
||||||
|
|
||||||
|
formData.pcs = game.actors.filter( ac => ac.type == "character" && ac.hasPlayerOwner )
|
||||||
|
formData.npcs = []
|
||||||
|
let newList = []
|
||||||
|
let toUpdate = false
|
||||||
|
for( let actorId of this.settings.npcList ) {
|
||||||
|
let actor = game.actors.get(actorId)
|
||||||
|
if (actor) {
|
||||||
|
formData.npcs.push( actor )
|
||||||
|
newList.push(actorId)
|
||||||
|
} else {
|
||||||
|
toUpdate = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
formData.config = game.bol.config
|
||||||
|
formData.horoscopeGroupList = game.settings.get("bol", "horoscope-group")
|
||||||
|
|
||||||
|
if ( toUpdate ) {
|
||||||
|
this.settings.npcList = newList
|
||||||
|
//console.log("Going to update ...", this.settings)
|
||||||
|
game.settings.set("world", "character-summary-data", this.settings)
|
||||||
|
}
|
||||||
|
|
||||||
|
return formData
|
||||||
|
}
|
||||||
|
|
||||||
|
/* -------------------------------------------- */
|
||||||
|
updateNPC() {
|
||||||
|
game.settings.set("world", "character-summary-data", game.bol.charSummary.settings)
|
||||||
|
game.bol.charSummary.close()
|
||||||
|
setTimeout( function() { game.bol.charSummary.render(true)}, 500)
|
||||||
|
}
|
||||||
|
|
||||||
|
/* -------------------------------------------- */
|
||||||
|
async _onDrop(event) {
|
||||||
|
//console.log("Dragged data are : ", dragData)
|
||||||
|
let data = event.dataTransfer.getData('text/plain')
|
||||||
|
let dataItem = JSON.parse( data)
|
||||||
|
let actor = fromUuidSync(dataItem.uuid)
|
||||||
|
if (actor) {
|
||||||
|
game.bol.charSummary.settings.npcList.push( actor.id )
|
||||||
|
game.bol.charSummary.updateNPC()
|
||||||
|
|
||||||
|
} else {
|
||||||
|
ui.notifications.warn( game.i18n.localize("BOL.ui.noactorfound") )
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* -------------------------------------------- */
|
||||||
|
/** @override */
|
||||||
|
async activateListeners(html) {
|
||||||
|
super.activateListeners(html);
|
||||||
|
|
||||||
|
html.find('.actor-open').click((event) => {
|
||||||
|
const li = $(event.currentTarget).parents(".item")
|
||||||
|
const actor = game.actors.get(li.data("actor-id"))
|
||||||
|
actor.sheet.render(true)
|
||||||
|
})
|
||||||
|
|
||||||
|
html.find('.summary-roll').click((event) => {
|
||||||
|
const li = $(event.currentTarget).parents(".item")
|
||||||
|
const actor = game.actors.get(li.data("actor-id"))
|
||||||
|
let type = $(event.currentTarget).data("type")
|
||||||
|
let key = $(event.currentTarget).data("key")
|
||||||
|
if ( type == "attribute") {
|
||||||
|
BoLRoll.attributeCheck(actor, key, event)
|
||||||
|
} else if (type == "aptitude") {
|
||||||
|
BoLRoll.aptitudeCheck(actor, key, event)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
html.find('.actor-delete').click(event => {
|
||||||
|
const li = $(event.currentTarget).parents(".item");
|
||||||
|
let actorId = li.data("actor-id")
|
||||||
|
let newList = game.bol.charSummary.settings.npcList.filter(id => id != actorId)
|
||||||
|
game.bol.charSummary.settings.npcList = newList
|
||||||
|
game.bol.charSummary.updateNPC()
|
||||||
|
})
|
||||||
|
|
||||||
|
html.find('#horoscope-group-edit-available').change(event => {
|
||||||
|
const horoId = $(event.currentTarget).data("horo-id")
|
||||||
|
let newValue = event.currentTarget.value
|
||||||
|
let horoscopes = duplicate(game.settings.get("bol", "horoscope-group"))
|
||||||
|
if ( horoId && horoscopes[horoId]) {
|
||||||
|
horoscopes[horoId].availableDice = Number(newValue)
|
||||||
|
if (newValue <= 0) {
|
||||||
|
horoscopes[horoId] = undefined
|
||||||
|
}
|
||||||
|
game.settings.set("bol", "horoscope-group", horoscopes)
|
||||||
|
setTimeout(function() { BoLUtility.updateSheets()}, 800 )
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
html.find('#horoscope-group-edit-max').change(event => {
|
||||||
|
const horoId = $(event.currentTarget).data("horo-id")
|
||||||
|
let newValue = event.currentTarget.value
|
||||||
|
let horoscopes = duplicate(game.settings.get("bol", "horoscope-group"))
|
||||||
|
if ( horoId && horoscopes[horoId]) {
|
||||||
|
horoscopes[horoId].maxDice = Number(newValue)
|
||||||
|
if (newValue <= 0) {
|
||||||
|
horoscopes[horoId] = undefined
|
||||||
|
}
|
||||||
|
game.settings.set("bol", "horoscope-group", horoscopes)
|
||||||
|
setTimeout(function() { BoLUtility.updateSheets()}, 800 )
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -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,49 @@ 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()
|
for (let c of combatants) {
|
||||||
|
//let actor = game.actors.get(c.actorId)
|
||||||
|
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)
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
super.nextRound()
|
super.nextRound()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/************************************************************************************/
|
||||||
|
startCombat() {
|
||||||
|
if (game.user.isGM) {
|
||||||
|
let combatants = this.combatants.contents
|
||||||
|
for (let c of combatants) {
|
||||||
|
let actor = game.actors.get(c.actorId)
|
||||||
|
actor.storeVitaliteCombat()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
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()
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
110
module/system/bol-commands.js
Normal file
@ -0,0 +1,110 @@
|
|||||||
|
/* -------------------------------------------- */
|
||||||
|
import { BoLAdventureGenerator } from "./bol-adventure-generator.js"
|
||||||
|
import { BoLCharacterSummary } from "./bol-character-summary.js"
|
||||||
|
|
||||||
|
/* -------------------------------------------- */
|
||||||
|
export class BoLCommands {
|
||||||
|
|
||||||
|
static init() {
|
||||||
|
if (!game.bol.commands) {
|
||||||
|
const bolCommands = new BoLCommands()
|
||||||
|
bolCommands.registerCommand({ path: ["/adventure"], func: (content, msg, params) => BoLAdventureGenerator.createAdventure(), descr: "Nouvelle idée d'aventure!" });
|
||||||
|
bolCommands.registerCommand({ path: ["/pcview"], func: (content, msg, params) => BoLCharacterSummary.displayPCSummary(), descr: "Affiche la liste des PJs!" });
|
||||||
|
game.bol.commands = bolCommands
|
||||||
|
}
|
||||||
|
|
||||||
|
Hooks.on("chatMessage", (html, content, msg) => {
|
||||||
|
if (content[0] == '/') {
|
||||||
|
let regExp = /(\S+)/g;
|
||||||
|
let commands = content.match(regExp);
|
||||||
|
if (game.bol.commands.processChatCommand(commands, content, msg)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
})
|
||||||
|
|
||||||
|
}
|
||||||
|
constructor() {
|
||||||
|
this.commandsTable = {}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* -------------------------------------------- */
|
||||||
|
registerCommand(command) {
|
||||||
|
this._addCommand(this.commandsTable, command.path, '', command);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* -------------------------------------------- */
|
||||||
|
_addCommand(targetTable, path, fullPath, command) {
|
||||||
|
if (!this._validateCommand(targetTable, path, command)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
const term = path[0];
|
||||||
|
fullPath = fullPath + term + ' '
|
||||||
|
if (path.length == 1) {
|
||||||
|
command.descr = `<strong>${fullPath}</strong>: ${command.descr}`;
|
||||||
|
targetTable[term] = command;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if (!targetTable[term]) {
|
||||||
|
targetTable[term] = { subTable: {} };
|
||||||
|
}
|
||||||
|
this._addCommand(targetTable[term].subTable, path.slice(1), fullPath, command)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* -------------------------------------------- */
|
||||||
|
_validateCommand(targetTable, path, command) {
|
||||||
|
if (path.length > 0 && path[0] && command.descr && (path.length != 1 || targetTable[path[0]] == undefined)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
console.warn("bolCommands._validateCommand failed ", targetTable, path, command);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* -------------------------------------------- */
|
||||||
|
/* Manage chat commands */
|
||||||
|
processChatCommand(commandLine, content = '', msg = {}) {
|
||||||
|
// Setup new message's visibility
|
||||||
|
let rollMode = game.settings.get("core", "rollMode");
|
||||||
|
if (["gmroll", "blindroll"].includes(rollMode)) msg["whisper"] = ChatMessage.getWhisperRecipients("GM");
|
||||||
|
if (rollMode === "blindroll") msg["blind"] = true;
|
||||||
|
msg["type"] = 0;
|
||||||
|
|
||||||
|
let command = commandLine[0].toLowerCase();
|
||||||
|
let params = commandLine.slice(1);
|
||||||
|
|
||||||
|
return this.process(command, params, content, msg);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* -------------------------------------------- */
|
||||||
|
process(command, params, content, msg) {
|
||||||
|
return this._processCommand(this.commandsTable, command, params, content, msg);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* -------------------------------------------- */
|
||||||
|
_processCommand(commandsTable, name, params, content = '', msg = {}, path = "") {
|
||||||
|
console.log("===> Processing command")
|
||||||
|
let command = commandsTable[name];
|
||||||
|
path = path + name + " ";
|
||||||
|
if (command && command.subTable) {
|
||||||
|
if (params[0]) {
|
||||||
|
return this._processCommand(command.subTable, params[0], params.slice(1), content, msg, path)
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
this.help(msg, command.subTable);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (command && command.func) {
|
||||||
|
const result = command.func(content, msg, params);
|
||||||
|
if (result == false) {
|
||||||
|
BoLCommands._chatAnswer(msg, command.descr);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -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,40 +1,168 @@
|
|||||||
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,
|
||||||
type: Boolean,
|
type: Boolean,
|
||||||
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", {
|
||||||
|
name: game.i18n.localize("BOL.settings.defaultLogoActorSheetPath"),
|
||||||
|
hint: game.i18n.localize("BOL.settings.defaultLogoPathActorSheetTooltip"),
|
||||||
|
scope: "world",
|
||||||
|
config: true,
|
||||||
|
default: "/systems/bol/ui/logo.webp",
|
||||||
|
type: String,
|
||||||
|
onChange: lang => window.location.reload()
|
||||||
|
})
|
||||||
|
game.settings.register("bol", "logoTopLeft", {
|
||||||
|
name: game.i18n.localize("BOL.settings.defaultLogoTopLeftPath"),
|
||||||
|
hint: game.i18n.localize("BOL.settings.defaultLogoTopLeftPathTooltip"),
|
||||||
|
scope: "world",
|
||||||
|
config: true,
|
||||||
|
default: "/systems/bol/ui/logo2.webp",
|
||||||
|
type: String,
|
||||||
|
onChange: lang => window.location.reload()
|
||||||
|
})
|
||||||
|
game.settings.register("bol", "horoscope-group", {
|
||||||
|
name: "horoscope-group",
|
||||||
|
scope: "world",
|
||||||
|
config: false,
|
||||||
|
default: {},
|
||||||
|
type: Object
|
||||||
|
})
|
||||||
|
|
||||||
this.rollArmor = game.settings.get("bol", "rollArmor") // Roll armor or not
|
this.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.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"))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* -------------------------------------------- */
|
||||||
|
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
|
||||||
@ -43,34 +171,72 @@ export class BoLUtility {
|
|||||||
static getUseBougette() {
|
static getUseBougette() {
|
||||||
return this.useBougette
|
return this.useBougette
|
||||||
}
|
}
|
||||||
|
/* -------------------------------------------- */
|
||||||
|
static getLogoActorSheet() {
|
||||||
|
return this.actorSheetLogo
|
||||||
|
}
|
||||||
|
/* -------------------------------------------- */
|
||||||
|
static getLogoTopLeft() {
|
||||||
|
return this.logoTopLeft
|
||||||
|
}
|
||||||
|
/* -------------------------------------------- */
|
||||||
|
static getActorFromRollData(rollData) {
|
||||||
|
let actor = game.actors.get(rollData.actorId)
|
||||||
|
if (rollData.tokenId) {
|
||||||
|
let token = canvas.tokens.placeables.find(t => t.id == rollData.tokenId)
|
||||||
|
if (token) {
|
||||||
|
actor = token.actor
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return actor
|
||||||
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static async ready() {
|
static async ready() {
|
||||||
|
//$("#logo").attr("src", this.getLogoTopLeft() )
|
||||||
|
$("#logo").css("content", `url(${this.getLogoTopLeft()})`)
|
||||||
|
|
||||||
|
CONFIG.statusEffects = 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.lastRoll = 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 getLastRoll() {
|
let chatOptions = BoLUtility.chatDataSetup(html);
|
||||||
return this.lastRoll
|
ChatMessage.create(chatOptions, "selfroll")
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static createDirectOptionList(min, max) {
|
static createDirectOptionList(min, max) {
|
||||||
let options = {};
|
let options = {};
|
||||||
@ -115,7 +281,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) {
|
||||||
@ -127,16 +293,16 @@ export class BoLUtility {
|
|||||||
return undefined;
|
return undefined;
|
||||||
}
|
}
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static getOtherWhisperRecipients( name) {
|
static getOtherWhisperRecipients(name) {
|
||||||
let users = []
|
let users = []
|
||||||
for( let user of game.users) {
|
for (let user of game.users) {
|
||||||
if ( !user.isGM && user.name != name) {
|
if (!user.isGM && user.name != name) {
|
||||||
users.push( user.data._id)
|
users.push(user.id)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return users
|
return users
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static getWhisperRecipientsAndGMs(name) {
|
static getWhisperRecipientsAndGMs(name) {
|
||||||
let recep1 = ChatMessage.getWhisperRecipients(name) || [];
|
let recep1 = ChatMessage.getWhisperRecipients(name) || [];
|
||||||
@ -153,13 +319,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: duplicate(rollData) })
|
||||||
} else {
|
} else {
|
||||||
BoLUtility.processAttackSuccess(attackDef)
|
BoLUtility.processAttackSuccess(rollData)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -173,35 +339,55 @@ export class BoLUtility {
|
|||||||
//console.log("FOUND 1!!! ", actor)
|
//console.log("FOUND 1!!! ", actor)
|
||||||
if (actor && actor.isOwner) return
|
if (actor && 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')
|
||||||
console.log("FOUND 2!! ", divButtons)
|
|
||||||
divButtons.hide()
|
divButtons.hide()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* -------------------------------------------- */
|
||||||
|
static getRollDataFromMessage(event) {
|
||||||
|
let messageId = BoLUtility.findChatMessageId(event.currentTarget)
|
||||||
|
let message = game.messages.get(messageId)
|
||||||
|
return message.getFlag("world", "bol-roll-data")
|
||||||
|
}
|
||||||
|
/* -------------------------------------------- */
|
||||||
|
static requestInitRoll(actorId, combatData) {
|
||||||
|
let actor = game.actors.get(actorId)
|
||||||
|
if (actor && actor.isOwner) {
|
||||||
|
ui.notifications.info(game.i18n.localize("BOL.ui.warninitiative"))
|
||||||
|
BoLRoll.aptitudeCheck(actor, "init", undefined, combatData)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* -------------------------------------------- */
|
||||||
|
static cleanupButtons(id) {
|
||||||
|
$(`#${id}`).hide() // Hide the options roll buttons
|
||||||
|
game.socket.emit("system.bol", { name: "msg_cleanup_buttons", data: { id: id } })
|
||||||
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static async chatListeners(html) {
|
static async chatListeners(html) {
|
||||||
|
|
||||||
// Damage handling
|
// Damage handling
|
||||||
html.on("click", '.chat-damage-apply', event => {
|
html.on("click", '.chat-damage-apply', event => {
|
||||||
let rollData = BoLUtility.getLastRoll()
|
let rollData = BoLUtility.getRollDataFromMessage(event)
|
||||||
$(`#${rollData.applyId}`).hide()
|
BoLUtility.cleanupButtons(rollData.applyId)
|
||||||
BoLUtility.sendAttackSuccess(rollData)
|
BoLUtility.sendAttackSuccess(rollData)
|
||||||
});
|
});
|
||||||
|
|
||||||
html.on("click", '.chat-damage-roll', event => {
|
html.on("click", '.chat-damage-roll', event => {
|
||||||
event.preventDefault();
|
event.preventDefault()
|
||||||
let rollData = BoLUtility.getLastRoll()
|
let rollData = BoLUtility.getRollDataFromMessage(event)
|
||||||
rollData.damageMode = event.currentTarget.attributes['data-damage-mode'].value;
|
rollData.damageMode = event.currentTarget.attributes['data-damage-mode'].value
|
||||||
let bolRoll = new BoLDefaultRoll(rollData)
|
let bolRoll = new BoLDefaultRoll(rollData)
|
||||||
bolRoll.rollDamage()
|
bolRoll.rollDamage()
|
||||||
});
|
});
|
||||||
|
|
||||||
html.on("click", '.transform-legendary-roll', event => {
|
html.on("click", '.transform-legendary-roll', event => {
|
||||||
event.preventDefault();
|
event.preventDefault();
|
||||||
let rollData = BoLUtility.getLastRoll()
|
let rollData = BoLUtility.getRollDataFromMessage(event)
|
||||||
let actor = game.actors.get( rollData.actorId)
|
let actor = game.actors.get(rollData.actorId)
|
||||||
actor.subHeroPoints(1)
|
actor.subHeroPoints(1)
|
||||||
let r = new BoLDefaultRoll(rollData)
|
let r = new BoLDefaultRoll(rollData)
|
||||||
r.upgradeToLegendary()
|
r.upgradeToLegendary()
|
||||||
@ -209,8 +395,8 @@ export class BoLUtility {
|
|||||||
|
|
||||||
html.on("click", '.transform-heroic-roll', event => {
|
html.on("click", '.transform-heroic-roll', event => {
|
||||||
event.preventDefault();
|
event.preventDefault();
|
||||||
let rollData = BoLUtility.getLastRoll()
|
let rollData = BoLUtility.getRollDataFromMessage(event)
|
||||||
let actor = game.actors.get( rollData.actorId)
|
let actor = game.actors.get(rollData.actorId)
|
||||||
actor.subHeroPoints(1)
|
actor.subHeroPoints(1)
|
||||||
let r = new BoLDefaultRoll(rollData)
|
let r = new BoLDefaultRoll(rollData)
|
||||||
r.upgradeToHeroic()
|
r.upgradeToHeroic()
|
||||||
@ -218,8 +404,8 @@ export class BoLUtility {
|
|||||||
|
|
||||||
html.on("click", '.hero-reroll', event => {
|
html.on("click", '.hero-reroll', event => {
|
||||||
event.preventDefault();
|
event.preventDefault();
|
||||||
let rollData = BoLUtility.getLastRoll()
|
let rollData = BoLUtility.getRollDataFromMessage(event)
|
||||||
let actor = game.actors.get( rollData.actorId)
|
let actor = game.actors.get(rollData.actorId)
|
||||||
actor.subHeroPoints(1)
|
actor.subHeroPoints(1)
|
||||||
rollData.reroll = false // Disable reroll option for second roll
|
rollData.reroll = false // Disable reroll option for second roll
|
||||||
let r = new BoLDefaultRoll(rollData)
|
let r = new BoLDefaultRoll(rollData)
|
||||||
@ -228,82 +414,118 @@ 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
|
||||||
|
let msgId = BoLUtility.findChatMessageId(event.currentTarget)
|
||||||
if (game.user.isGM) {
|
if (game.user.isGM) {
|
||||||
console.log("Process handling !!! -> GM direct damage handling")
|
BoLUtility.processDamageHandling(attackId, defenseMode, weaponId, msgId)
|
||||||
BoLUtility.processDamageHandling(event, attackId, defenseMode, weaponId)
|
|
||||||
} else {
|
} else {
|
||||||
console.log("Process handling !!! -> socket emit")
|
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: { event: event, 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(event, attackId, defenseMode, weaponId = -1) {
|
static async processDamageHandling(attackId, defenseMode, weaponId = -1, msgId) {
|
||||||
if (!game.user.isGM) {
|
if (!game.user.isGM) {
|
||||||
return;
|
return
|
||||||
}
|
}
|
||||||
BoLUtility.removeChatMessageId(BoLUtility.findChatMessageId(event.currentTarget));
|
let message = game.messages.get(msgId)
|
||||||
|
let rollData = message.getFlag("world", "bol-roll-data")
|
||||||
|
BoLUtility.removeChatMessageId(msgId)
|
||||||
|
|
||||||
console.log("Damage Handling", event, 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 && 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 defender = game.actors.get(attackDef.defenderId)
|
let token = game.scenes.current.tokens.get(rollData.targetId)
|
||||||
|
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 } )
|
rollData.rollArmor.roll({ async: false })
|
||||||
console.log("Armor roll ", attackDef.rollArmor)
|
rollData.armorProtect = (rollData.rollArmor.total < 0) ? 0 : rollData.rollArmor.total
|
||||||
attackDef.armorProtect = (attackDef.rollArmor.total < 0) ? 0 : attackDef.rollArmor.total;
|
rollData.finalDamage = rollData.damageTotal - rollData.armorProtect
|
||||||
attackDef.finalDamage = attackDef.damageRoll.total - attackDef.armorProtect;
|
rollData.finalDamage = (rollData.finalDamage < 0) ? 0 : rollData.finalDamage
|
||||||
attackDef.finalDamage = (attackDef.finalDamage < 0) ? 0 : attackDef.finalDamage;
|
defender.sufferDamage(rollData.finalDamage)
|
||||||
defender.sufferDamage(attackDef.finalDamage);
|
console.log("Armor roll -> result ", rollData)
|
||||||
}
|
}
|
||||||
if (defenseMode == 'damage-without-armor') {
|
if (defenseMode == 'damage-without-armor') {
|
||||||
attackDef.finalDamage = attackDef.damageRoll.total;
|
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 });
|
rollData.rollArmor.roll({ async: false })
|
||||||
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 });
|
rollData.rollHero.roll({ async: false })
|
||||||
attackDef.finalDamage = attackDef.damageRoll.total - 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);
|
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]);
|
defender.deleteEmbeddedDocuments("Item", [weaponId]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let defenderUser
|
||||||
|
for (let user of game.users) {
|
||||||
|
if (user.character && user.character.id == defender.id) {
|
||||||
|
defenderUser = user
|
||||||
|
}
|
||||||
|
}
|
||||||
|
let damageResults = {
|
||||||
|
attackId: rollData.id,
|
||||||
|
attacker: rollData.attacker,
|
||||||
|
rollArmor: rollData.rollArmor,
|
||||||
|
rollHero: rollData.rollHero,
|
||||||
|
weaponHero: rollData.weaponHero,
|
||||||
|
armorProtect: rollData.armorProtect,
|
||||||
|
name: defender.name,
|
||||||
|
defender: defender,
|
||||||
|
defenseMode: rollData.defenseMode,
|
||||||
|
finalDamage: rollData.finalDamage
|
||||||
|
}
|
||||||
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-result-card.hbs', {
|
content: await renderTemplate('systems/bol/templates/chat/rolls/defense-result-card.hbs', damageResults)
|
||||||
attackId: attackDef.id,
|
})
|
||||||
attacker: attackDef.attacker,
|
console.log("Defender data : ", defenderUser)
|
||||||
rollArmor: attackDef.rollArmor,
|
ChatMessage.create({
|
||||||
rollHero: attackDef.rollHero,
|
alias: defender.name,
|
||||||
weaponHero: attackDef.weaponHero,
|
whisper: BoLUtility.getOtherWhisperRecipients(defenderUser?.name),
|
||||||
armorProtect: attackDef.armorProtect,
|
content: await renderTemplate('systems/bol/templates/chat/rolls/defense-summary-card.hbs', damageResults)
|
||||||
defender: defender,
|
|
||||||
defenseMode: attackDef.defenseMode,
|
|
||||||
finalDamage: attackDef.finalDamage
|
|
||||||
})
|
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -336,7 +558,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;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
@ -379,28 +601,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)
|
||||||
let defenderWeapons = defender.weapons
|
let defenderWeapons = defender.weapons || []
|
||||||
console.log("DEF WEP", attackDef)
|
let msg = await ChatMessage.create({
|
||||||
this.attackStore[attackDef.id] = attackDef // Store !
|
|
||||||
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)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
@ -408,22 +631,28 @@ export class BoLUtility {
|
|||||||
if (sockmsg.name == "msg_attack_success") {
|
if (sockmsg.name == "msg_attack_success") {
|
||||||
BoLUtility.processAttackSuccess(sockmsg.data)
|
BoLUtility.processAttackSuccess(sockmsg.data)
|
||||||
}
|
}
|
||||||
|
if (sockmsg.name == "msg_cleanup_buttons") {
|
||||||
|
$(`#${sockmsg.data.id}`).hide() // Hide the options roll buttons
|
||||||
|
}
|
||||||
|
if (sockmsg.name == "msg_request_init_roll") {
|
||||||
|
this.requestInitRoll(sockmsg.data.actorId, sockmsg.data.combatData)
|
||||||
|
}
|
||||||
if (sockmsg.name == "msg_damage_handling") {
|
if (sockmsg.name == "msg_damage_handling") {
|
||||||
BoLUtility.processDamageHandling(sockmsg.data.event, sockmsg.data.attackId, sockmsg.data.defenseMode)
|
BoLUtility.processDamageHandling(sockmsg.data.attackId, sockmsg.data.defenseMode, sockmsg.data.weaponId, sockmsg.data.msgId)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static computeSpellCost(spell, nbOptCond = 0) {
|
static computeSpellCost(spell, nbOptCond = 0) {
|
||||||
let pp = spell.data.data.properties.ppcost
|
let pp = spell.system.properties.ppcost
|
||||||
let minpp = __circle2minpp[spell.data.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
|
||||||
@ -435,17 +664,17 @@ 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
|
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
|
||||||
}
|
}
|
||||||
if (res[3]) {
|
if (res[3]) {
|
||||||
if ( upgradeDamage && res[3] == 'M') {
|
if (upgradeDamage && res[3] == 'M') {
|
||||||
res[3] = "" // Disable lamlus for upgradeDamage
|
res[3] = "" // Disable lamlus for upgradeDamage
|
||||||
}
|
}
|
||||||
if (res[3] == 'M') {
|
if (res[3] == 'M') {
|
||||||
@ -453,11 +682,21 @@ export class BoLUtility {
|
|||||||
nbDice++
|
nbDice++
|
||||||
modIndex = 4
|
modIndex = 4
|
||||||
}
|
}
|
||||||
|
if (res[3] == 'MM') {
|
||||||
|
postForm = 'kl' + nbDice
|
||||||
|
nbDice += 2
|
||||||
|
modIndex = 4
|
||||||
|
}
|
||||||
if (res[3] == 'B') {
|
if (res[3] == 'B') {
|
||||||
postForm = 'kh' + nbDice
|
postForm = 'kh' + nbDice
|
||||||
nbDice++
|
nbDice++
|
||||||
modIndex = 4
|
modIndex = 4
|
||||||
}
|
}
|
||||||
|
if (res[3] == 'BB') {
|
||||||
|
postForm = 'kh' + nbDice
|
||||||
|
nbDice += 2
|
||||||
|
modIndex = 4
|
||||||
|
}
|
||||||
}
|
}
|
||||||
formula = "(" + nbDice + "d" + res[2] + reroll + postForm + "+" + modifier + ") *" + multiplier
|
formula = "(" + nbDice + "d" + res[2] + reroll + postForm + "+" + modifier + ") *" + multiplier
|
||||||
}
|
}
|
||||||
@ -465,31 +704,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 = duplicate(game.settings.get("bol", "horoscope-group"))
|
||||||
|
let toChange = 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()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -25,6 +25,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 = {
|
||||||
@ -111,6 +124,14 @@ BOL.aptitudes = {
|
|||||||
"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",
|
||||||
@ -131,6 +152,7 @@ BOL.itemCategories = {
|
|||||||
"spell" : "BOL.itemCategory.spell",
|
"spell" : "BOL.itemCategory.spell",
|
||||||
"alchemy" : "BOL.itemCategory.alchemy",
|
"alchemy" : "BOL.itemCategory.alchemy",
|
||||||
"vehicle" : "BOL.itemCategory.vehicle",
|
"vehicle" : "BOL.itemCategory.vehicle",
|
||||||
|
"vehicleweapon": "BOL.itemCategory.vehicleweapon",
|
||||||
"other" : "BOL.itemCategory.other"
|
"other" : "BOL.itemCategory.other"
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -255,7 +277,10 @@ BOL.featureSubtypes = {
|
|||||||
"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,11 +291,12 @@ 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"
|
||||||
@ -283,26 +309,163 @@ BOL.actorIcons = {
|
|||||||
}
|
}
|
||||||
|
|
||||||
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.debug = false;
|
BOL.debug = false;
|
@ -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);
|
||||||
})
|
})
|
||||||
@ -103,12 +107,18 @@ 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);
|
// console.log(items);
|
||||||
return items.filter(i => i.type === type).map(i => i.data.key).includes(key);
|
return items.filter(i => i.type === type).map(i => i.system.key).includes(key);
|
||||||
})
|
})
|
||||||
Handlebars.registerHelper('includes', function (array, val) {
|
Handlebars.registerHelper('includes', function (array, val) {
|
||||||
return array.includes(val);
|
return array.includes(val);
|
||||||
@ -123,7 +133,14 @@ export const registerHandlebarsHelpers = function () {
|
|||||||
}
|
}
|
||||||
return false
|
return false
|
||||||
})
|
})
|
||||||
|
Handlebars.registerHelper('upperFirst', function (text) {
|
||||||
|
if (typeof text !== 'string') return text
|
||||||
|
return text.charAt(0).toUpperCase() + text.slice(1)
|
||||||
|
})
|
||||||
|
Handlebars.registerHelper('upperFirstOnly', function (text) {
|
||||||
|
if (typeof text !== 'string') return text
|
||||||
|
return text.charAt(0).toUpperCase()
|
||||||
|
})
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
@ -49,7 +49,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 +65,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 +75,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,12 @@ 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",
|
||||||
// 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 +37,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/000123.ldb
Normal file
0
packs/aides-de-jeu/000178.log
Normal file
1
packs/aides-de-jeu/CURRENT
Normal file
@ -0,0 +1 @@
|
|||||||
|
MANIFEST-000176
|
0
packs/aides-de-jeu/LOCK
Normal file
8
packs/aides-de-jeu/LOG
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
2024/02/07-19:56:06.693613 7fdbf74006c0 Recovering log #174
|
||||||
|
2024/02/07-19:56:06.751088 7fdbf74006c0 Delete type=3 #172
|
||||||
|
2024/02/07-19:56:06.751212 7fdbf74006c0 Delete type=0 #174
|
||||||
|
2024/02/07-21:59:09.854143 7fdbf4c006c0 Level-0 table #179: started
|
||||||
|
2024/02/07-21:59:09.854177 7fdbf4c006c0 Level-0 table #179: 0 bytes OK
|
||||||
|
2024/02/07-21:59:09.860969 7fdbf4c006c0 Delete type=0 #177
|
||||||
|
2024/02/07-21:59:09.880931 7fdbf4c006c0 Manual compaction at level-0 from '!journal!3xJg1rCxnWvEmoxS' @ 72057594037927935 : 1 .. '!journal.pages!veAAxCtCKcFIsnln.0kUgZspxXO7VS8bd' @ 0 : 0; will stop at (end)
|
||||||
|
2024/02/07-21:59:09.881016 7fdbf4c006c0 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/02/04-23:08:12.877361 7ff634c006c0 Recovering log #170
|
||||||
|
2024/02/04-23:08:12.887700 7ff634c006c0 Delete type=3 #168
|
||||||
|
2024/02/04-23:08:12.887788 7ff634c006c0 Delete type=0 #170
|
||||||
|
2024/02/05-07:38:07.233915 7ff62e6006c0 Level-0 table #175: started
|
||||||
|
2024/02/05-07:38:07.233990 7ff62e6006c0 Level-0 table #175: 0 bytes OK
|
||||||
|
2024/02/05-07:38:07.240361 7ff62e6006c0 Delete type=0 #173
|
||||||
|
2024/02/05-07:38:07.261065 7ff62e6006c0 Manual compaction at level-0 from '!journal!3xJg1rCxnWvEmoxS' @ 72057594037927935 : 1 .. '!journal.pages!veAAxCtCKcFIsnln.0kUgZspxXO7VS8bd' @ 0 : 0; will stop at (end)
|
||||||
|
2024/02/05-07:38:07.261109 7ff62e6006c0 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-000176
Normal file
BIN
packs/armors/000005.ldb
Normal file
0
packs/armors/000084.log
Normal file
1
packs/armors/CURRENT
Normal file
@ -0,0 +1 @@
|
|||||||
|
MANIFEST-000082
|
0
packs/armors/LOCK
Normal file
8
packs/armors/LOG
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
2024/02/07-19:56:06.556852 7fdbf56006c0 Recovering log #80
|
||||||
|
2024/02/07-19:56:06.618130 7fdbf56006c0 Delete type=3 #78
|
||||||
|
2024/02/07-19:56:06.618241 7fdbf56006c0 Delete type=0 #80
|
||||||
|
2024/02/07-21:59:09.861092 7fdbf4c006c0 Level-0 table #85: started
|
||||||
|
2024/02/07-21:59:09.861122 7fdbf4c006c0 Level-0 table #85: 0 bytes OK
|
||||||
|
2024/02/07-21:59:09.867886 7fdbf4c006c0 Delete type=0 #83
|
||||||
|
2024/02/07-21:59:09.880948 7fdbf4c006c0 Manual compaction at level-0 from '!items!G3dZTHIabA3LA1hY' @ 72057594037927935 : 1 .. '!items!xhEcsi3WHjbt2ro9' @ 0 : 0; will stop at (end)
|
||||||
|
2024/02/07-21:59:09.881007 7fdbf4c006c0 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/02/04-23:08:12.851523 7ff62fe006c0 Recovering log #76
|
||||||
|
2024/02/04-23:08:12.862496 7ff62fe006c0 Delete type=3 #74
|
||||||
|
2024/02/04-23:08:12.862563 7ff62fe006c0 Delete type=0 #76
|
||||||
|
2024/02/05-07:38:07.219273 7ff62e6006c0 Level-0 table #81: started
|
||||||
|
2024/02/05-07:38:07.219306 7ff62e6006c0 Level-0 table #81: 0 bytes OK
|
||||||
|
2024/02/05-07:38:07.225772 7ff62e6006c0 Delete type=0 #79
|
||||||
|
2024/02/05-07:38:07.233682 7ff62e6006c0 Manual compaction at level-0 from '!items!G3dZTHIabA3LA1hY' @ 72057594037927935 : 1 .. '!items!xhEcsi3WHjbt2ro9' @ 0 : 0; will stop at (end)
|
||||||
|
2024/02/05-07:38:07.233734 7ff62e6006c0 Manual compaction at level-1 from '!items!G3dZTHIabA3LA1hY' @ 72057594037927935 : 1 .. '!items!xhEcsi3WHjbt2ro9' @ 0 : 0; will stop at (end)
|
BIN
packs/armors/MANIFEST-000082
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/000122.ldb
Normal file
0
packs/boons/000177.log
Normal file
1
packs/boons/CURRENT
Normal file
@ -0,0 +1 @@
|
|||||||
|
MANIFEST-000175
|
0
packs/boons/LOCK
Normal file
8
packs/boons/LOG
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
2024/02/07-19:56:06.002947 7fdbf56006c0 Recovering log #173
|
||||||
|
2024/02/07-19:56:06.064045 7fdbf56006c0 Delete type=3 #171
|
||||||
|
2024/02/07-19:56:06.064169 7fdbf56006c0 Delete type=0 #173
|
||||||
|
2024/02/07-21:59:09.806013 7fdbf4c006c0 Level-0 table #178: started
|
||||||
|
2024/02/07-21:59:09.806054 7fdbf4c006c0 Level-0 table #178: 0 bytes OK
|
||||||
|
2024/02/07-21:59:09.812540 7fdbf4c006c0 Delete type=0 #176
|
||||||
|
2024/02/07-21:59:09.826360 7fdbf4c006c0 Manual compaction at level-0 from '!items!039ZF3E3MtAGwbiX' @ 72057594037927935 : 1 .. '!items!zgspy1QKaxdEetEw' @ 0 : 0; will stop at (end)
|
||||||
|
2024/02/07-21:59:09.826391 7fdbf4c006c0 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/02/04-23:08:12.748926 7ff62fe006c0 Recovering log #169
|
||||||
|
2024/02/04-23:08:12.759343 7ff62fe006c0 Delete type=3 #167
|
||||||
|
2024/02/04-23:08:12.759408 7ff62fe006c0 Delete type=0 #169
|
||||||
|
2024/02/05-07:38:07.153586 7ff62e6006c0 Level-0 table #174: started
|
||||||
|
2024/02/05-07:38:07.153624 7ff62e6006c0 Level-0 table #174: 0 bytes OK
|
||||||
|
2024/02/05-07:38:07.161240 7ff62e6006c0 Delete type=0 #172
|
||||||
|
2024/02/05-07:38:07.168014 7ff62e6006c0 Manual compaction at level-0 from '!items!039ZF3E3MtAGwbiX' @ 72057594037927935 : 1 .. '!items!zgspy1QKaxdEetEw' @ 0 : 0; will stop at (end)
|
||||||
|
2024/02/05-07:38:07.168060 7ff62e6006c0 Manual compaction at level-1 from '!items!039ZF3E3MtAGwbiX' @ 72057594037927935 : 1 .. '!items!zgspy1QKaxdEetEw' @ 0 : 0; will stop at (end)
|
BIN
packs/boons/MANIFEST-000175
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/000122.ldb
Normal file
0
packs/boonsflawscreatures/000177.log
Normal file
1
packs/boonsflawscreatures/CURRENT
Normal file
@ -0,0 +1 @@
|
|||||||
|
MANIFEST-000175
|
0
packs/boonsflawscreatures/LOCK
Normal file
8
packs/boonsflawscreatures/LOG
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
2024/02/07-19:56:06.072445 7fdbf6a006c0 Recovering log #173
|
||||||
|
2024/02/07-19:56:06.125880 7fdbf6a006c0 Delete type=3 #171
|
||||||
|
2024/02/07-19:56:06.126018 7fdbf6a006c0 Delete type=0 #173
|
||||||
|
2024/02/07-21:59:09.812699 7fdbf4c006c0 Level-0 table #178: started
|
||||||
|
2024/02/07-21:59:09.812748 7fdbf4c006c0 Level-0 table #178: 0 bytes OK
|
||||||
|
2024/02/07-21:59:09.819081 7fdbf4c006c0 Delete type=0 #176
|
||||||
|
2024/02/07-21:59:09.826371 7fdbf4c006c0 Manual compaction at level-0 from '!items!CoqlfsDV1gL5swbK' @ 72057594037927935 : 1 .. '!items!yofwG0YrsL902G77' @ 0 : 0; will stop at (end)
|
||||||
|
2024/02/07-21:59:09.826400 7fdbf4c006c0 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/02/04-23:08:12.762192 7ff62f4006c0 Recovering log #169
|
||||||
|
2024/02/04-23:08:12.772428 7ff62f4006c0 Delete type=3 #167
|
||||||
|
2024/02/04-23:08:12.772511 7ff62f4006c0 Delete type=0 #169
|
||||||
|
2024/02/05-07:38:07.161374 7ff62e6006c0 Level-0 table #174: started
|
||||||
|
2024/02/05-07:38:07.161410 7ff62e6006c0 Level-0 table #174: 0 bytes OK
|
||||||
|
2024/02/05-07:38:07.167670 7ff62e6006c0 Delete type=0 #172
|
||||||
|
2024/02/05-07:38:07.168027 7ff62e6006c0 Manual compaction at level-0 from '!items!CoqlfsDV1gL5swbK' @ 72057594037927935 : 1 .. '!items!yofwG0YrsL902G77' @ 0 : 0; will stop at (end)
|
||||||
|
2024/02/05-07:38:07.178641 7ff62e6006c0 Manual compaction at level-1 from '!items!CoqlfsDV1gL5swbK' @ 72057594037927935 : 1 .. '!items!yofwG0YrsL902G77' @ 0 : 0; will stop at (end)
|
BIN
packs/boonsflawscreatures/MANIFEST-000175
Normal file
BIN
packs/careers/000122.ldb
Normal file
0
packs/careers/000177.log
Normal file
1
packs/careers/CURRENT
Normal file
@ -0,0 +1 @@
|
|||||||
|
MANIFEST-000175
|
0
packs/careers/LOCK
Normal file
8
packs/careers/LOG
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
2024/02/07-19:56:06.194138 7fdbf60006c0 Recovering log #173
|
||||||
|
2024/02/07-19:56:06.250241 7fdbf60006c0 Delete type=3 #171
|
||||||
|
2024/02/07-19:56:06.250339 7fdbf60006c0 Delete type=0 #173
|
||||||
|
2024/02/07-21:59:09.833968 7fdbf4c006c0 Level-0 table #178: started
|
||||||
|
2024/02/07-21:59:09.834000 7fdbf4c006c0 Level-0 table #178: 0 bytes OK
|
||||||
|
2024/02/07-21:59:09.840070 7fdbf4c006c0 Delete type=0 #176
|
||||||
|
2024/02/07-21:59:09.853853 7fdbf4c006c0 Manual compaction at level-0 from '!items!4S4xAfMXGnuU0O1a' @ 72057594037927935 : 1 .. '!items!zxY3sW0iCJBvwjOS' @ 0 : 0; will stop at (end)
|
||||||
|
2024/02/07-21:59:09.853958 7fdbf4c006c0 Manual compaction at level-1 from '!items!4S4xAfMXGnuU0O1a' @ 72057594037927935 : 1 .. '!items!zxY3sW0iCJBvwjOS' @ 0 : 0; will stop at (end)
|
8
packs/careers/LOG.old
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
2024/02/04-23:08:12.787685 7ff6356006c0 Recovering log #169
|
||||||
|
2024/02/04-23:08:12.797161 7ff6356006c0 Delete type=3 #167
|
||||||
|
2024/02/04-23:08:12.797226 7ff6356006c0 Delete type=0 #169
|
||||||
|
2024/02/05-07:38:07.185466 7ff62e6006c0 Level-0 table #174: started
|
||||||
|
2024/02/05-07:38:07.185514 7ff62e6006c0 Level-0 table #174: 0 bytes OK
|
||||||
|
2024/02/05-07:38:07.192356 7ff62e6006c0 Delete type=0 #172
|
||||||
|
2024/02/05-07:38:07.199331 7ff62e6006c0 Manual compaction at level-0 from '!items!4S4xAfMXGnuU0O1a' @ 72057594037927935 : 1 .. '!items!zxY3sW0iCJBvwjOS' @ 0 : 0; will stop at (end)
|
||||||
|
2024/02/05-07:38:07.205700 7ff62e6006c0 Manual compaction at level-1 from '!items!4S4xAfMXGnuU0O1a' @ 72057594037927935 : 1 .. '!items!zxY3sW0iCJBvwjOS' @ 0 : 0; will stop at (end)
|
BIN
packs/careers/MANIFEST-000175
Normal file
BIN
packs/cartes/000122.ldb
Normal file
0
packs/cartes/000177.log
Normal file
1
packs/cartes/CURRENT
Normal file
@ -0,0 +1 @@
|
|||||||
|
MANIFEST-000175
|
0
packs/cartes/LOCK
Normal file
8
packs/cartes/LOG
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
2024/02/07-19:56:06.759932 7fdbf60006c0 Recovering log #173
|
||||||
|
2024/02/07-19:56:06.817453 7fdbf60006c0 Delete type=3 #171
|
||||||
|
2024/02/07-19:56:06.817555 7fdbf60006c0 Delete type=0 #173
|
||||||
|
2024/02/07-21:59:09.881125 7fdbf4c006c0 Level-0 table #178: started
|
||||||
|
2024/02/07-21:59:09.881171 7fdbf4c006c0 Level-0 table #178: 0 bytes OK
|
||||||
|
2024/02/07-21:59:09.887471 7fdbf4c006c0 Delete type=0 #176
|
||||||
|
2024/02/07-21:59:09.909277 7fdbf4c006c0 Manual compaction at level-0 from '!scenes!1ZDXKpKixS12xzW3' @ 72057594037927935 : 1 .. '!scenes.tiles!78gEyXvSfBJi9iL1.rJglQmZXB0eRIL8y' @ 0 : 0; will stop at (end)
|
||||||
|
2024/02/07-21:59:09.909331 7fdbf4c006c0 Manual compaction at level-1 from '!scenes!1ZDXKpKixS12xzW3' @ 72057594037927935 : 1 .. '!scenes.tiles!78gEyXvSfBJi9iL1.rJglQmZXB0eRIL8y' @ 0 : 0; will stop at (end)
|
8
packs/cartes/LOG.old
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
2024/02/04-23:08:12.891083 7ff6356006c0 Recovering log #169
|
||||||
|
2024/02/04-23:08:12.902039 7ff6356006c0 Delete type=3 #167
|
||||||
|
2024/02/04-23:08:12.902105 7ff6356006c0 Delete type=0 #169
|
||||||
|
2024/02/05-07:38:07.240480 7ff62e6006c0 Level-0 table #174: started
|
||||||
|
2024/02/05-07:38:07.240513 7ff62e6006c0 Level-0 table #174: 0 bytes OK
|
||||||
|
2024/02/05-07:38:07.247590 7ff62e6006c0 Delete type=0 #172
|
||||||
|
2024/02/05-07:38:07.261083 7ff62e6006c0 Manual compaction at level-0 from '!scenes!1ZDXKpKixS12xzW3' @ 72057594037927935 : 1 .. '!scenes.tiles!78gEyXvSfBJi9iL1.rJglQmZXB0eRIL8y' @ 0 : 0; will stop at (end)
|
||||||
|
2024/02/05-07:38:07.261132 7ff62e6006c0 Manual compaction at level-1 from '!scenes!1ZDXKpKixS12xzW3' @ 72057594037927935 : 1 .. '!scenes.tiles!78gEyXvSfBJi9iL1.rJglQmZXB0eRIL8y' @ 0 : 0; will stop at (end)
|
BIN
packs/cartes/MANIFEST-000175
Normal file
BIN
packs/creatures/000122.ldb
Normal file
0
packs/creatures/000177.log
Normal file
1
packs/creatures/CURRENT
Normal file
@ -0,0 +1 @@
|
|||||||
|
MANIFEST-000175
|
0
packs/creatures/LOCK
Normal file
8
packs/creatures/LOG
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
2024/02/07-19:56:07.294359 7fdbf6a006c0 Recovering log #173
|
||||||
|
2024/02/07-19:56:07.381216 7fdbf6a006c0 Delete type=3 #171
|
||||||
|
2024/02/07-19:56:07.381357 7fdbf6a006c0 Delete type=0 #173
|
||||||
|
2024/02/07-21:59:09.936176 7fdbf4c006c0 Level-0 table #178: started
|
||||||
|
2024/02/07-21:59:09.936206 7fdbf4c006c0 Level-0 table #178: 0 bytes OK
|
||||||
|
2024/02/07-21:59:09.943450 7fdbf4c006c0 Delete type=0 #176
|
||||||
|
2024/02/07-21:59:09.950178 7fdbf4c006c0 Manual compaction at level-0 from '!actors!1QGaindSWLCT4QXD' @ 72057594037927935 : 1 .. '!actors.items!yGlDTCiMiaH4vJTH.mvXGkWoCcRGjUpYV' @ 0 : 0; will stop at (end)
|
||||||
|
2024/02/07-21:59:09.950219 7fdbf4c006c0 Manual compaction at level-1 from '!actors!1QGaindSWLCT4QXD' @ 72057594037927935 : 1 .. '!actors.items!yGlDTCiMiaH4vJTH.mvXGkWoCcRGjUpYV' @ 0 : 0; will stop at (end)
|
8
packs/creatures/LOG.old
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
2024/02/04-23:08:12.998444 7ff6356006c0 Recovering log #169
|
||||||
|
2024/02/04-23:08:13.009585 7ff6356006c0 Delete type=3 #167
|
||||||
|
2024/02/04-23:08:13.009705 7ff6356006c0 Delete type=0 #169
|
||||||
|
2024/02/05-07:38:07.294572 7ff62e6006c0 Level-0 table #174: started
|
||||||
|
2024/02/05-07:38:07.294605 7ff62e6006c0 Level-0 table #174: 0 bytes OK
|
||||||
|
2024/02/05-07:38:07.301078 7ff62e6006c0 Delete type=0 #172
|
||||||
|
2024/02/05-07:38:07.307727 7ff62e6006c0 Manual compaction at level-0 from '!actors!1QGaindSWLCT4QXD' @ 72057594037927935 : 1 .. '!actors.items!yGlDTCiMiaH4vJTH.mvXGkWoCcRGjUpYV' @ 0 : 0; will stop at (end)
|
||||||
|
2024/02/05-07:38:07.307802 7ff62e6006c0 Manual compaction at level-1 from '!actors!1QGaindSWLCT4QXD' @ 72057594037927935 : 1 .. '!actors.items!yGlDTCiMiaH4vJTH.mvXGkWoCcRGjUpYV' @ 0 : 0; will stop at (end)
|