Compare commits
11 Commits
02cea84ebb
...
13.0.16
| Author | SHA1 | Date | |
|---|---|---|---|
| 0d62b60e38 | |||
| 9b91850731 | |||
| 05c7a91f93 | |||
| f83fdb3b8f | |||
| 020ff4b014 | |||
| b3c7453823 | |||
| 18d003aa5d | |||
| 0b90badb5e | |||
| 290b5029d1 | |||
| a7e4aea52d | |||
| 755d15509e |
@@ -26,3 +26,6 @@ Merci à eux !!
|
|||||||
Toute la propriété intellectuelle leur appartient, ce système est une adaptation destinée à fonctionner sous FoundryVTT.
|
Toute la propriété intellectuelle leur appartient, ce système est une adaptation destinée à fonctionner sous FoundryVTT.
|
||||||
|
|
||||||
L'ensemble du code est sous licence Creative Commons.
|
L'ensemble du code est sous licence Creative Commons.
|
||||||
|
|
||||||
|
# Licences
|
||||||
|
- L'export pdf utilise la librairie [pdf-lib](https://pdf-lib.js.org/) sous licence [MIT](pdf-lib-LICENSE.md)
|
||||||
65
assets/actions/surenc.svg
Normal file
65
assets/actions/surenc.svg
Normal file
@@ -0,0 +1,65 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<svg
|
||||||
|
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||||
|
xmlns:cc="http://creativecommons.org/ns#"
|
||||||
|
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||||
|
xmlns:svg="http://www.w3.org/2000/svg"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||||
|
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||||
|
viewBox="0 0 448 434"
|
||||||
|
version="1.1"
|
||||||
|
id="svg6"
|
||||||
|
sodipodi:docname="surenc.svg"
|
||||||
|
width="448"
|
||||||
|
height="434"
|
||||||
|
inkscape:version="1.0.1 (3bc2e813f5, 2020-09-07)">
|
||||||
|
<metadata
|
||||||
|
id="metadata12">
|
||||||
|
<rdf:RDF>
|
||||||
|
<cc:Work
|
||||||
|
rdf:about="">
|
||||||
|
<dc:format>image/svg+xml</dc:format>
|
||||||
|
<dc:type
|
||||||
|
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||||
|
<dc:title></dc:title>
|
||||||
|
</cc:Work>
|
||||||
|
</rdf:RDF>
|
||||||
|
</metadata>
|
||||||
|
<defs
|
||||||
|
id="defs10" />
|
||||||
|
<sodipodi:namedview
|
||||||
|
pagecolor="#ffffff"
|
||||||
|
bordercolor="#666666"
|
||||||
|
borderopacity="1"
|
||||||
|
objecttolerance="10"
|
||||||
|
gridtolerance="10"
|
||||||
|
guidetolerance="10"
|
||||||
|
inkscape:pageopacity="0"
|
||||||
|
inkscape:pageshadow="2"
|
||||||
|
inkscape:window-width="3840"
|
||||||
|
inkscape:window-height="2054"
|
||||||
|
id="namedview8"
|
||||||
|
showgrid="false"
|
||||||
|
fit-margin-top="0"
|
||||||
|
fit-margin-left="0"
|
||||||
|
fit-margin-right="0"
|
||||||
|
fit-margin-bottom="0"
|
||||||
|
inkscape:zoom="1.4355469"
|
||||||
|
inkscape:cx="224"
|
||||||
|
inkscape:cy="210"
|
||||||
|
inkscape:window-x="-11"
|
||||||
|
inkscape:window-y="-11"
|
||||||
|
inkscape:window-maximized="1"
|
||||||
|
inkscape:current-layer="svg6" />
|
||||||
|
<g
|
||||||
|
class=""
|
||||||
|
id="g4"
|
||||||
|
transform="translate(-32,-46)">
|
||||||
|
<path
|
||||||
|
d="m 256,46 c -45.074,0 -82,36.926 -82,82 0,25.812 12.123,48.936 30.938,64 H 128 L 32,480 H 480 L 384,192 H 307.062 C 325.877,176.936 338,153.812 338,128 338,82.926 301.074,46 256,46 Z m 0,36 c 25.618,0 46,20.382 46,46 0,25.618 -20.382,46 -46,46 -25.618,0 -46,-20.382 -46,-46 0,-25.618 20.382,-46 46,-46 z m -82.215,202.95 h 23.5 v 33.263 l 33.873,-33.264 h 27.283 l -43.883,43.15 48.4,47.974 H 233.54 l -36.255,-35.888 v 35.888 h -23.5 z m 119.934,21.24 c 4.76,0 8.952,0.934 12.573,2.806 3.62,1.872 6.938,4.82 9.95,8.85 v -10.13 h 21.972 v 61.462 c 0,10.986 -3.48,19.368 -10.438,25.146 -6.917,5.82 -16.968,8.727 -30.152,8.727 -4.272,0 -8.4,-0.325 -12.39,-0.976 a 77.367,77.367 0 0 1 -12.024,-2.99 v -17.03 c 3.826,2.198 7.57,3.826 11.23,4.884 3.664,1.098 7.347,1.648 11.05,1.648 7.162,0 12.41,-1.566 15.746,-4.7 3.337,-3.132 5.006,-8.035 5.006,-14.708 v -4.7 c -3.01,3.986 -6.328,6.916 -9.95,8.788 -3.62,1.87 -7.813,2.808 -12.573,2.808 -8.343,0 -15.238,-3.275 -20.69,-9.826 -5.453,-6.592 -8.18,-14.974 -8.18,-25.146 0,-10.214 2.727,-18.576 8.18,-25.086 5.452,-6.55 12.347,-9.827 20.69,-9.827 z m 8.118,15.746 c -4.517,0 -8.038,1.67 -10.56,5.005 -2.523,3.338 -3.784,8.058 -3.784,14.162 0,6.266 1.22,11.026 3.662,14.28 2.442,3.215 6.003,4.823 10.682,4.823 4.557,0 8.096,-1.67 10.62,-5.006 2.522,-3.337 3.784,-8.036 3.784,-14.098 0,-6.104 -1.262,-10.824 -3.785,-14.16 -2.523,-3.337 -6.062,-5.006 -10.62,-5.006 z"
|
||||||
|
fill="#ffffff"
|
||||||
|
fill-opacity="1"
|
||||||
|
id="path2" />
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 3.1 KiB |
BIN
assets/feuille-personnage.pdf
Normal file
BIN
assets/feuille-personnage.pdf
Normal file
Binary file not shown.
16
changelog.md
16
changelog.md
@@ -1,8 +1,24 @@
|
|||||||
# 13.0
|
# 13.0
|
||||||
|
## 13.0.16 - La paix d'Illysis
|
||||||
|
|
||||||
|
- Export de personnages sous forme de feuille de personnage pdf
|
||||||
|
- Correction d'un problème à l'ouverture de personnages saisis dans d'anciennes versions
|
||||||
|
- Fenêtre de jet v2
|
||||||
|
- on peut faire des jets en dehors des combats
|
||||||
|
|
||||||
|
## 13.0.15 - Les pièces d'Illysis
|
||||||
|
|
||||||
|
- On peut de nouveau acheter dans les commerces
|
||||||
|
- Corrections V13
|
||||||
|
- Les textes sur fond "parchemin" ne sont plus affichés en blanc
|
||||||
|
|
||||||
## 13.0.14 - Le familier d'Illysis
|
## 13.0.14 - Le familier d'Illysis
|
||||||
|
|
||||||
- Les réussites particulières en demi-surprise sont de simples réussites
|
- Les réussites particulières en demi-surprise sont de simples réussites
|
||||||
- Les images des scènes par défaut sont corrigées
|
- Les images des scènes par défaut sont corrigées
|
||||||
|
- Ajout d'une image de status "sur-encombré"
|
||||||
|
- Correction V13
|
||||||
|
- couleur lisible dans les sommaires des journaux et des compendiums
|
||||||
- Amélioration des entités:
|
- Amélioration des entités:
|
||||||
- l'attaquant ne sait plus que c'est une entité de cauchemar (surprise!)
|
- l'attaquant ne sait plus que c'est une entité de cauchemar (surprise!)
|
||||||
- l'encaissement indique une blessure dans le tchat... même si ce n'est que de l'endurance
|
- l'encaissement indique une blessure dans le tchat... même si ce n'est que de l'endurance
|
||||||
|
|||||||
@@ -1378,6 +1378,9 @@ select,
|
|||||||
margin: 0.1rem 0;
|
margin: 0.1rem 0;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
}
|
}
|
||||||
|
.system-foundryvtt-reve-de-dragon .prosemirror menu {
|
||||||
|
background-color: var(--color-background-chat-message);
|
||||||
|
}
|
||||||
.system-foundryvtt-reve-de-dragon .app.sheet .editor.prosemirror {
|
.system-foundryvtt-reve-de-dragon .app.sheet .editor.prosemirror {
|
||||||
height: fit-content;
|
height: fit-content;
|
||||||
min-height: 5rem;
|
min-height: 5rem;
|
||||||
@@ -1569,22 +1572,70 @@ select,
|
|||||||
.system-foundryvtt-reve-de-dragon .type-compendium {
|
.system-foundryvtt-reve-de-dragon .type-compendium {
|
||||||
font-size: 0.6rem;
|
font-size: 0.6rem;
|
||||||
}
|
}
|
||||||
.system-foundryvtt-reve-de-dragon .window-app.sheet .window-content .sheet-header {
|
.system-foundryvtt-reve-de-dragon .window-app.sheet .window-content .sheet-body,
|
||||||
background: #011d33 url(../assets/ui/bg_header.webp) no-repeat left top;
|
.system-foundryvtt-reve-de-dragon .application .window-content,
|
||||||
color: #ffffff;
|
.system-foundryvtt-reve-de-dragon .journal-entry .journal-sidebar {
|
||||||
|
background: url(../assets/ui/bg_left.webp) no-repeat left top;
|
||||||
|
color: var(--rdd-color-text-primary);
|
||||||
}
|
}
|
||||||
.system-foundryvtt-reve-de-dragon .window-app.sheet .window-content .sheet-header :is(
|
.system-foundryvtt-reve-de-dragon .window-app.sheet .window-content .sheet-body label,
|
||||||
input[type="text"],
|
.system-foundryvtt-reve-de-dragon .application .window-content label,
|
||||||
input[type="number"],
|
.system-foundryvtt-reve-de-dragon .journal-entry .journal-sidebar label,
|
||||||
input[type="password"],
|
.system-foundryvtt-reve-de-dragon .window-app.sheet .window-content .sheet-body .hint,
|
||||||
input[type="datetime-local"],
|
.system-foundryvtt-reve-de-dragon .application .window-content .hint,
|
||||||
input[type="date"],
|
.system-foundryvtt-reve-de-dragon .journal-entry .journal-sidebar .hint,
|
||||||
input[type="time"]) {
|
.system-foundryvtt-reve-de-dragon .window-app.sheet .window-content .sheet-body .permissions-list,
|
||||||
color: rgba(255, 255, 255, 0.75);
|
.system-foundryvtt-reve-de-dragon .application .window-content .permissions-list,
|
||||||
background: rgba(255, 255, 255, 0.1);
|
.system-foundryvtt-reve-de-dragon .journal-entry .journal-sidebar .permissions-list,
|
||||||
|
.system-foundryvtt-reve-de-dragon .window-app.sheet .window-content .sheet-body nav.tabs,
|
||||||
|
.system-foundryvtt-reve-de-dragon .application .window-content nav.tabs,
|
||||||
|
.system-foundryvtt-reve-de-dragon .journal-entry .journal-sidebar nav.tabs,
|
||||||
|
.system-foundryvtt-reve-de-dragon .window-app.sheet .window-content .sheet-body nav.tabs button,
|
||||||
|
.system-foundryvtt-reve-de-dragon .application .window-content nav.tabs button,
|
||||||
|
.system-foundryvtt-reve-de-dragon .journal-entry .journal-sidebar nav.tabs button,
|
||||||
|
.system-foundryvtt-reve-de-dragon .window-app.sheet .window-content .sheet-body nav.tabs button .count,
|
||||||
|
.system-foundryvtt-reve-de-dragon .application .window-content nav.tabs button .count,
|
||||||
|
.system-foundryvtt-reve-de-dragon .journal-entry .journal-sidebar nav.tabs button .count,
|
||||||
|
.system-foundryvtt-reve-de-dragon .window-app.sheet .window-content .sheet-body button,
|
||||||
|
.system-foundryvtt-reve-de-dragon .application .window-content button,
|
||||||
|
.system-foundryvtt-reve-de-dragon .journal-entry .journal-sidebar button {
|
||||||
|
color: var(--rdd-color-text-primary);
|
||||||
|
}
|
||||||
|
.system-foundryvtt-reve-de-dragon .window-app.sheet .window-content .sheet-body a,
|
||||||
|
.system-foundryvtt-reve-de-dragon .application .window-content a,
|
||||||
|
.system-foundryvtt-reve-de-dragon .journal-entry .journal-sidebar a {
|
||||||
|
color: var(--color-dark-3);
|
||||||
|
}
|
||||||
|
.system-foundryvtt-reve-de-dragon .window-app.sheet .window-content .sheet-body a.filter.active,
|
||||||
|
.system-foundryvtt-reve-de-dragon .application .window-content a.filter.active,
|
||||||
|
.system-foundryvtt-reve-de-dragon .journal-entry .journal-sidebar a.filter.active {
|
||||||
|
color: var(--color-dark-1);
|
||||||
|
}
|
||||||
|
.system-foundryvtt-reve-de-dragon .window-app .window-content {
|
||||||
|
background: url(../assets/ui/bg_left.webp) no-repeat left top;
|
||||||
|
color: var(--rdd-color-text-primary);
|
||||||
|
}
|
||||||
|
.system-foundryvtt-reve-de-dragon .window-app .window-content .sheet-header {
|
||||||
|
background: #011d33 url(../assets/ui/bg_header.webp) no-repeat left top;
|
||||||
|
}
|
||||||
|
.system-foundryvtt-reve-de-dragon .window-app .window-content .sheet-header label,
|
||||||
|
.system-foundryvtt-reve-de-dragon .window-app .window-content .sheet-header .hint,
|
||||||
|
.system-foundryvtt-reve-de-dragon .window-app .window-content .sheet-header .permissions-list,
|
||||||
|
.system-foundryvtt-reve-de-dragon .window-app .window-content .sheet-header nav.tabs,
|
||||||
|
.system-foundryvtt-reve-de-dragon .window-app .window-content .sheet-header nav.tabs button,
|
||||||
|
.system-foundryvtt-reve-de-dragon .window-app .window-content .sheet-header nav.tabs button .count,
|
||||||
|
.system-foundryvtt-reve-de-dragon .window-app .window-content .sheet-header div,
|
||||||
|
.system-foundryvtt-reve-de-dragon .window-app .window-content .sheet-header button {
|
||||||
|
color: rgba(255, 255, 255, 0.9);
|
||||||
|
}
|
||||||
|
.system-foundryvtt-reve-de-dragon .window-app .window-content .sheet-header input {
|
||||||
|
color: rgba(255, 255, 255, 0.9);
|
||||||
border: 0 none;
|
border: 0 none;
|
||||||
margin-bottom: 0.2rem;
|
margin-bottom: 0.2rem;
|
||||||
}
|
}
|
||||||
|
.system-foundryvtt-reve-de-dragon .window-app .window-content .sheet-header input[type="checkbox"] {
|
||||||
|
color: rgba(255, 255, 255, 0.75);
|
||||||
|
}
|
||||||
.system-foundryvtt-reve-de-dragon input[type="number"] {
|
.system-foundryvtt-reve-de-dragon input[type="number"] {
|
||||||
text-align: right;
|
text-align: right;
|
||||||
padding-right: 0.5rem;
|
padding-right: 0.5rem;
|
||||||
@@ -1625,7 +1676,7 @@ select,
|
|||||||
width: calc(100% - 2px);
|
width: calc(100% - 2px);
|
||||||
height: var(--form-field-height);
|
height: var(--form-field-height);
|
||||||
margin: 0;
|
margin: 0;
|
||||||
color: var(--color-text-dark-primary);
|
color: var(--rdd-color-text-primary);
|
||||||
border-radius: 0.2rem;
|
border-radius: 0.2rem;
|
||||||
}
|
}
|
||||||
.system-foundryvtt-reve-de-dragon form.app-personnage-aleatoire h2 {
|
.system-foundryvtt-reve-de-dragon form.app-personnage-aleatoire h2 {
|
||||||
|
|||||||
@@ -67,6 +67,7 @@
|
|||||||
"StatusComma": "Comma",
|
"StatusComma": "Comma",
|
||||||
"StatusDead": "Mort",
|
"StatusDead": "Mort",
|
||||||
"StatusDemiReve": "Demi-rêve",
|
"StatusDemiReve": "Demi-rêve",
|
||||||
|
"StatusSurEnc": "Sur-encombrement",
|
||||||
"StatusForceWeak": "Force insuffisante"
|
"StatusForceWeak": "Force insuffisante"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -656,9 +656,15 @@
|
|||||||
margin: 0.1rem 0;
|
margin: 0.1rem 0;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
}
|
}
|
||||||
|
.prosemirror {
|
||||||
|
menu{
|
||||||
|
background-color: var(--color-background-chat-message);
|
||||||
|
}
|
||||||
|
}
|
||||||
.app.sheet .editor.prosemirror {
|
.app.sheet .editor.prosemirror {
|
||||||
height: fit-content;
|
height: fit-content;
|
||||||
min-height: 5rem;
|
min-height: 5rem;
|
||||||
|
|
||||||
}
|
}
|
||||||
.app.sheet .editor.prosemirror .editor-container {
|
.app.sheet .editor.prosemirror .editor-container {
|
||||||
min-height: 5rem;
|
min-height: 5rem;
|
||||||
@@ -865,26 +871,60 @@
|
|||||||
.type-compendium {
|
.type-compendium {
|
||||||
font-size: 0.6rem;
|
font-size: 0.6rem;
|
||||||
}
|
}
|
||||||
|
.window-app.sheet .window-content .sheet-body,
|
||||||
|
.application .window-content,
|
||||||
|
.journal-entry .journal-sidebar {
|
||||||
|
background: url(../assets/ui/bg_left.webp) no-repeat left top;
|
||||||
|
color: var(--rdd-color-text-primary);
|
||||||
|
label ,
|
||||||
|
.hint ,
|
||||||
|
.permissions-list ,
|
||||||
|
nav.tabs,
|
||||||
|
nav.tabs button,
|
||||||
|
nav.tabs button .count,
|
||||||
|
button {
|
||||||
|
color: var(--rdd-color-text-primary);
|
||||||
|
}
|
||||||
|
a {
|
||||||
|
color: var(--color-dark-3);
|
||||||
|
}
|
||||||
|
a.filter.active {
|
||||||
|
color: var(--color-dark-1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* ======================================== */
|
/* ======================================== */
|
||||||
/* Sheet */
|
/* Sheet */
|
||||||
.window-app.sheet .window-content .sheet-header{
|
.window-app .window-content{
|
||||||
background: #011d33 url(../assets/ui/bg_header.webp) no-repeat left top;
|
background: url(../assets/ui/bg_left.webp) no-repeat left top;
|
||||||
color: rgba(255, 255, 255, 1);
|
color: var(--rdd-color-text-primary);
|
||||||
}
|
|
||||||
|
|
||||||
.window-app.sheet .window-content .sheet-header :is(
|
.sheet-header {
|
||||||
input[type="text"],
|
background: #011d33 url(../assets/ui/bg_header.webp) no-repeat left top;
|
||||||
input[type="number"],
|
|
||||||
input[type="password"],
|
label ,
|
||||||
input[type="datetime-local"],
|
.hint ,
|
||||||
input[type="date"],
|
.permissions-list ,
|
||||||
input[type="time"]) {
|
nav.tabs,
|
||||||
color: rgba(255, 255, 255, 0.75);
|
nav.tabs button,
|
||||||
background: rgba(255, 255, 255, 0.1);
|
nav.tabs button .count,
|
||||||
|
div,
|
||||||
|
button {
|
||||||
|
color: rgba(255, 255, 255, 0.9);
|
||||||
|
}
|
||||||
|
input {
|
||||||
|
//color: rgba(255, 255, 255, 0);
|
||||||
|
color: rgba(255, 255, 255, 0.9);
|
||||||
border: 0 none;
|
border: 0 none;
|
||||||
margin-bottom: 0.2rem;
|
margin-bottom: 0.2rem;
|
||||||
}
|
}
|
||||||
|
input[type="checkbox"] {
|
||||||
|
// background-color: hsla(268, 41%, 56%, 0.9);
|
||||||
|
color: rgba(255, 255, 255, 0.75);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
input[type="number"] {
|
input[type="number"] {
|
||||||
text-align: right;
|
text-align: right;
|
||||||
@@ -928,7 +968,7 @@
|
|||||||
width: calc(100% - 2px);
|
width: calc(100% - 2px);
|
||||||
height: var(--form-field-height);
|
height: var(--form-field-height);
|
||||||
margin: 0;
|
margin: 0;
|
||||||
color: var(--color-text-dark-primary);
|
color: var(--rdd-color-text-primary);
|
||||||
border-radius: 0.2rem;
|
border-radius: 0.2rem;
|
||||||
}
|
}
|
||||||
form.app-personnage-aleatoire {
|
form.app-personnage-aleatoire {
|
||||||
|
|||||||
@@ -375,14 +375,6 @@ export class RdDActorSheet extends RdDBaseActorSangSheet {
|
|||||||
return position;
|
return position;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
|
||||||
/** @override */
|
|
||||||
_updateObject(event, formData) {
|
|
||||||
// Update the Actor
|
|
||||||
return this.actor.update(formData);
|
|
||||||
}
|
|
||||||
|
|
||||||
async splitItem(item) {
|
async splitItem(item) {
|
||||||
const dialog = await DialogSplitItem.create(item, (item, split) => this._onSplitItem(item, split));
|
const dialog = await DialogSplitItem.create(item, (item, split) => this._onSplitItem(item, split));
|
||||||
dialog.render(true);
|
dialog.render(true);
|
||||||
|
|||||||
@@ -190,7 +190,7 @@ export class RdDActor extends RdDBaseActorSang {
|
|||||||
const forceRequise = RdDItemArme.valeurMain(arme.system.force ?? 0, main)
|
const forceRequise = RdDItemArme.valeurMain(arme.system.force ?? 0, main)
|
||||||
const ecaillesEfficacite = arme.system.magique ? arme.system.ecaille_efficacite : 0;
|
const ecaillesEfficacite = arme.system.magique ? arme.system.ecaille_efficacite : 0;
|
||||||
|
|
||||||
const comp = this.getCompetence(RdDActor.$getCompetenceAction(arme, main))
|
const comp = this.getCompetence(arme.getCompetenceAction(main))
|
||||||
const unique = [comp.id, arme.name, dommages, forceRequise, ecaillesEfficacite].join('|');
|
const unique = [comp.id, arme.name, dommages, forceRequise, ecaillesEfficacite].join('|');
|
||||||
if (uniques.includes(unique)) {
|
if (uniques.includes(unique)) {
|
||||||
return
|
return
|
||||||
@@ -219,15 +219,12 @@ export class RdDActor extends RdDBaseActorSang {
|
|||||||
}
|
}
|
||||||
|
|
||||||
addAttaque(RdDItemArme.empoignade(this), ATTAQUE_TYPE.CORPS_A_CORPS)
|
addAttaque(RdDItemArme.empoignade(this), ATTAQUE_TYPE.CORPS_A_CORPS)
|
||||||
|
|
||||||
this.itemTypes[ITEM_TYPES.arme]
|
this.itemTypes[ITEM_TYPES.arme]
|
||||||
.filter(it => it.isAttaque())
|
.filter(it => it.isAttaque())
|
||||||
.sort(Misc.ascending(it => it.name))
|
.sort(Misc.ascending(it => it.name))
|
||||||
.forEach(arme => {
|
.forEach(arme => arme.getTypeAttaques().forEach(t => addAttaque(arme, t)))
|
||||||
if (arme.system.unemain && arme.system.competence && arme.system.resistance > 0) { addAttaque(arme, ATTAQUE_TYPE.UNE_MAIN) }
|
|
||||||
if (arme.system.deuxmains && arme.system.competence && arme.system.resistance > 0) { addAttaque(arme, ATTAQUE_TYPE.DEUX_MAINS) }
|
|
||||||
if (arme.system.lancer && arme.system.resistance > 0) { addAttaque(arme, ATTAQUE_TYPE.LANCER) }
|
|
||||||
if (arme.system.tir) { addAttaque(arme, ATTAQUE_TYPE.TIR) }
|
|
||||||
})
|
|
||||||
addAttaque(RdDItemArme.pugilat(this), ATTAQUE_TYPE.CORPS_A_CORPS)
|
addAttaque(RdDItemArme.pugilat(this), ATTAQUE_TYPE.CORPS_A_CORPS)
|
||||||
|
|
||||||
return actions
|
return actions
|
||||||
@@ -244,16 +241,6 @@ export class RdDActor extends RdDBaseActorSang {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static $getCompetenceAction(arme, main) {
|
|
||||||
switch (main) {
|
|
||||||
case ATTAQUE_TYPE.UNE_MAIN: return arme.competence1Mains()
|
|
||||||
case ATTAQUE_TYPE.DEUX_MAINS: return arme.competence2Mains()
|
|
||||||
case ATTAQUE_TYPE.LANCER: return arme.system.lancer
|
|
||||||
case ATTAQUE_TYPE.TIR: return arme.system.tir
|
|
||||||
default: return arme.system.competence
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
async $perteReveEnchantementsChateauDormants() {
|
async $perteReveEnchantementsChateauDormants() {
|
||||||
const toUpdate = this.items.filter(it => [ITEM_TYPES.potion, ITEM_TYPES.gemme].includes(it.type))
|
const toUpdate = this.items.filter(it => [ITEM_TYPES.potion, ITEM_TYPES.gemme].includes(it.type))
|
||||||
@@ -755,20 +742,18 @@ export class RdDActor extends RdDBaseActorSang {
|
|||||||
let updates = {};
|
let updates = {};
|
||||||
if (caracName == LIST_CARAC_PERSONNAGE.reve.code) {
|
if (caracName == LIST_CARAC_PERSONNAGE.reve.code) {
|
||||||
if (to > Misc.toInt(this.system.reve.seuil.value)) {
|
if (to > Misc.toInt(this.system.reve.seuil.value)) {
|
||||||
updates[`system.reve.seuil.value`] = to; // SFA : Direct and packed changes
|
updates[`system.reve.seuil.value`] = to
|
||||||
//this.setPointsDeSeuil(to);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (caracName == LIST_CARAC_PERSONNAGE.chance.code) {
|
if (caracName == LIST_CARAC_PERSONNAGE.chance.code) {
|
||||||
if (to > Misc.toInt(this.system.compteurs.chance.value)) {
|
if (to > Misc.toInt(this.system.compteurs.chance.value)) {
|
||||||
updates[`system.compteurs.chance.value`] = to; // SFA : Direct and packed changes
|
updates[`system.compteurs.chance.value`] = to
|
||||||
//this.setPointsDeChance(to);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
let selectedCarac = this.findCaracByName(caracName);
|
let selectedCarac = this.findCaracByName(caracName);
|
||||||
const from = selectedCarac.value
|
const from = selectedCarac.value
|
||||||
updates[`system.carac.${caracName}.value`] = to;
|
updates[`system.carac.${caracName}.value`] = to;
|
||||||
await this.update(updates);
|
await this.update(updates, { noHook: true });
|
||||||
await ExperienceLog.add(this, XP_TOPIC.CARAC, from, to, caracName);
|
await ExperienceLog.add(this, XP_TOPIC.CARAC, from, to, caracName);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1753,7 +1738,7 @@ export class RdDActor extends RdDBaseActorSang {
|
|||||||
this.tmrApp?.close();
|
this.tmrApp?.close();
|
||||||
this.tmrApp = undefined;
|
this.tmrApp = undefined;
|
||||||
}
|
}
|
||||||
} ],
|
}],
|
||||||
onRollDone: RollDialog.onRollDoneClose,
|
onRollDone: RollDialog.onRollDoneClose,
|
||||||
onClose: () => {
|
onClose: () => {
|
||||||
this.tmrApp?.restoreTMRAfterAction();
|
this.tmrApp?.restoreTMRAfterAction();
|
||||||
@@ -2607,7 +2592,7 @@ export class RdDActor extends RdDBaseActorSang {
|
|||||||
if (item?.isEquipable()) {
|
if (item?.isEquipable()) {
|
||||||
const isEquipe = !item.system.equipe;
|
const isEquipe = !item.system.equipe;
|
||||||
await item.update({ "system.equipe": isEquipe });
|
await item.update({ "system.equipe": isEquipe });
|
||||||
this.computeEncTotal();
|
this.computeEncTotal()
|
||||||
if (isEquipe)
|
if (isEquipe)
|
||||||
this.verifierForceMin(item);
|
this.verifierForceMin(item);
|
||||||
}
|
}
|
||||||
@@ -2998,6 +2983,7 @@ export class RdDActor extends RdDBaseActorSang {
|
|||||||
if (updatedEndurance && options.diff) {
|
if (updatedEndurance && options.diff) {
|
||||||
await this.setEffect(STATUSES.StatusUnconscious, updatedEndurance.value == 0)
|
await this.setEffect(STATUSES.StatusUnconscious, updatedEndurance.value == 0)
|
||||||
}
|
}
|
||||||
|
await super.onUpdateActor(update, options, actorId)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
@@ -3039,12 +3025,13 @@ export class RdDActor extends RdDBaseActorSang {
|
|||||||
await this.onDeleteOwnedCaseTmr(item, options, id)
|
await this.onDeleteOwnedCaseTmr(item, options, id)
|
||||||
break
|
break
|
||||||
case ITEM_TYPES.empoignade:
|
case ITEM_TYPES.empoignade:
|
||||||
|
await RdDEmpoignade.deleteLinkedEmpoignade(this.id, item)
|
||||||
|
// TODO: check remaining emp.
|
||||||
await this.setEffect(STATUSES.StatusGrappled, false)
|
await this.setEffect(STATUSES.StatusGrappled, false)
|
||||||
await this.setEffect(STATUSES.StatusGrappling, false)
|
await this.setEffect(STATUSES.StatusGrappling, false)
|
||||||
await RdDEmpoignade.deleteLinkedEmpoignade(this.id, item)
|
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
super.onDeleteItem(item, options, id)
|
await super.onDeleteItem(item, options, id)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
|
|||||||
@@ -56,13 +56,15 @@ export class RdDBaseActorReveSheet extends RdDBaseActorSheet {
|
|||||||
if (this.options.vueDetaillee) {
|
if (this.options.vueDetaillee) {
|
||||||
// On carac change
|
// On carac change
|
||||||
this.html.find('.carac-value').change(async event => {
|
this.html.find('.carac-value').change(async event => {
|
||||||
let caracName = event.currentTarget.name.replace(".value", "").replace("system.carac.", "")
|
if (event.currentTarget.name.includes("carac.")) {
|
||||||
await this.actor.updateCarac(caracName, parseInt(event.target.value))
|
let caracName = event.currentTarget.name.replace("carac.", "")
|
||||||
});
|
await this.actor.updateCarac(caracName, parseInt(event.currentTarget.value))
|
||||||
|
}
|
||||||
|
})
|
||||||
// On competence change
|
// On competence change
|
||||||
this.html.find('.competence-value').change(async event => {
|
this.html.find('.competence-value').change(async event => {
|
||||||
let compName = event.currentTarget.attributes.compname.value
|
let compName = event.currentTarget.attributes.compname.value
|
||||||
await this.actor.updateCompetence(compName, parseInt(event.target.value))
|
await this.actor.updateCompetence(compName, parseInt(event.currentTarget.value))
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -89,7 +89,6 @@ export class RdDBaseActorReve extends RdDBaseActor {
|
|||||||
getSConst() { return 0 }
|
getSConst() { return 0 }
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
isSurenc() { return false }
|
|
||||||
computeMalusSurEncombrement() { return 0 }
|
computeMalusSurEncombrement() { return 0 }
|
||||||
|
|
||||||
ajustementAstrologique() { return 0 }
|
ajustementAstrologique() { return 0 }
|
||||||
@@ -126,7 +125,7 @@ export class RdDBaseActorReve extends RdDBaseActor {
|
|||||||
async remiseANeuf() { }
|
async remiseANeuf() { }
|
||||||
async appliquerAjoutExperience(rollData, hideChatMessage = 'show') { }
|
async appliquerAjoutExperience(rollData, hideChatMessage = 'show') { }
|
||||||
|
|
||||||
computeResumeBlessure() {}
|
computeResumeBlessure() { }
|
||||||
countBlessures(filter = it => !it.isContusion()) { return 0 }
|
countBlessures(filter = it => !it.isContusion()) { return 0 }
|
||||||
async santeIncDec(name, inc, isCritique = false) { }
|
async santeIncDec(name, inc, isCritique = false) { }
|
||||||
|
|
||||||
@@ -230,49 +229,9 @@ export class RdDBaseActorReve extends RdDBaseActor {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
|
||||||
isEffectAllowed(effectId) { return false }
|
|
||||||
|
|
||||||
getEffects(filter = e => true, forceRequise = undefined) {
|
|
||||||
const effects = this.getEmbeddedCollection("ActiveEffect")
|
|
||||||
const selected = effects.filter(filter)
|
|
||||||
if (forceRequise && this.isForceInsuffisante(forceRequise)) {
|
|
||||||
selected.push(StatusEffects.prepareActiveEffect(STATUSES.StatusForceWeak))
|
|
||||||
}
|
|
||||||
return selected
|
|
||||||
}
|
|
||||||
|
|
||||||
getEffectByStatus(statusId) {
|
|
||||||
return this.getEffects().find(it => it.statuses.has(statusId));
|
|
||||||
}
|
|
||||||
|
|
||||||
async setEffect(statusId, status) {
|
|
||||||
if (this.isEffectAllowed(statusId)) {
|
|
||||||
const effect = this.getEffectByStatus(statusId)
|
|
||||||
if (!status && effect) {
|
|
||||||
await this.deleteEmbeddedDocuments('ActiveEffect', [effect.id], { render: true })
|
|
||||||
}
|
|
||||||
if (status && !effect) {
|
|
||||||
await this.createEmbeddedDocuments("ActiveEffect", [StatusEffects.prepareActiveEffect(statusId)], { render: true })
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
async removeEffect(id) {
|
|
||||||
this.removeEffects(it => it.id == id)
|
|
||||||
}
|
|
||||||
|
|
||||||
async removeEffects(filter = e => true) {
|
|
||||||
if (game.user.isGM) {
|
|
||||||
const effectsToRemove = this.getEffects(filter);
|
|
||||||
const ids = effectsToRemove.map(it => it.id);
|
|
||||||
await this.deleteEmbeddedDocuments('ActiveEffect', ids);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
isDemiReve() {
|
isDemiReve() {
|
||||||
return this.getEffectByStatus(STATUSES.StatusDemiReve) != undefined
|
return this.getEffectsByStatus(STATUSES.StatusDemiReve).length > 0
|
||||||
}
|
}
|
||||||
|
|
||||||
getSurprise(isCombat = undefined, forceRequise = undefined) {
|
getSurprise(isCombat = undefined, forceRequise = undefined) {
|
||||||
|
|||||||
@@ -186,6 +186,7 @@ export class RdDBaseActorSang extends RdDBaseActorReve {
|
|||||||
await this.changeBleedingState()
|
await this.changeBleedingState()
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
|
await super.onCreateItem(item, options, id)
|
||||||
}
|
}
|
||||||
|
|
||||||
async onUpdateItem(item, options, id) {
|
async onUpdateItem(item, options, id) {
|
||||||
@@ -194,6 +195,7 @@ export class RdDBaseActorSang extends RdDBaseActorReve {
|
|||||||
await this.changeBleedingState()
|
await this.changeBleedingState()
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
|
await super.onUpdateItem(item, options, id)
|
||||||
}
|
}
|
||||||
|
|
||||||
async changeBleedingState() {
|
async changeBleedingState() {
|
||||||
@@ -313,7 +315,7 @@ export class RdDBaseActorSang extends RdDBaseActorReve {
|
|||||||
}
|
}
|
||||||
|
|
||||||
isSonne() {
|
isSonne() {
|
||||||
return this.getEffectByStatus(STATUSES.StatusStunned)
|
return this.getEffectsByStatus(STATUSES.StatusStunned).length > 0
|
||||||
}
|
}
|
||||||
|
|
||||||
isEffectAllowed(effectId) { return true }
|
isEffectAllowed(effectId) { return true }
|
||||||
|
|||||||
@@ -49,7 +49,7 @@ export class RdDBaseActorSheet extends foundry.appv1.sheets.ActorSheet {
|
|||||||
formData.calc = {
|
formData.calc = {
|
||||||
fortune: Monnaie.toSolsDeniers(this.actor.getFortune()),
|
fortune: Monnaie.toSolsDeniers(this.actor.getFortune()),
|
||||||
prixTotalEquipement: this.actor.computePrixTotalEquipement(),
|
prixTotalEquipement: this.actor.computePrixTotalEquipement(),
|
||||||
encTotal: await this.actor.computeEncTotal(),
|
encTotal: this.actor.getEncTotal(),
|
||||||
}
|
}
|
||||||
|
|
||||||
this.objetVersConteneur = RdDUtility.buildArbreDeConteneurs(formData.conteneurs, formData.inventaires);
|
this.objetVersConteneur = RdDUtility.buildArbreDeConteneurs(formData.conteneurs, formData.inventaires);
|
||||||
@@ -229,14 +229,6 @@ export class RdDBaseActorSheet extends foundry.appv1.sheets.ActorSheet {
|
|||||||
return position;
|
return position;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
|
||||||
/** @override */
|
|
||||||
_updateObject(event, formData) {
|
|
||||||
// Update the Actor
|
|
||||||
return this.actor.update(formData);
|
|
||||||
}
|
|
||||||
|
|
||||||
async splitItem(item) {
|
async splitItem(item) {
|
||||||
const dialog = await DialogSplitItem.create(item, (item, split) => this._onSplitItem(item, split));
|
const dialog = await DialogSplitItem.create(item, (item, split) => this._onSplitItem(item, split));
|
||||||
dialog.render(true);
|
dialog.render(true);
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ import { RdDConfirm } from "../rdd-confirm.js";
|
|||||||
import { RdDUtility } from "../rdd-utility.js";
|
import { RdDUtility } from "../rdd-utility.js";
|
||||||
import { SystemCompendiums } from "../settings/system-compendiums.js";
|
import { SystemCompendiums } from "../settings/system-compendiums.js";
|
||||||
import { RdDItem } from "../item.js";
|
import { RdDItem } from "../item.js";
|
||||||
import { STATUSES } from "../settings/status-effects.js";
|
import { StatusEffects, STATUSES } from "../settings/status-effects.js";
|
||||||
|
|
||||||
export class RdDBaseActor extends Actor {
|
export class RdDBaseActor extends Actor {
|
||||||
|
|
||||||
@@ -243,18 +243,68 @@ export class RdDBaseActor extends Actor {
|
|||||||
|
|
||||||
getMonnaie(id) { return this.findItemLike(id, 'monnaie'); }
|
getMonnaie(id) { return this.findItemLike(id, 'monnaie'); }
|
||||||
getEncombrementMax() { return 0 }
|
getEncombrementMax() { return 0 }
|
||||||
|
isSurenc() { return false }
|
||||||
|
|
||||||
|
/* -------------------------------------------- */
|
||||||
|
isEffectAllowed(effectId) { return false }
|
||||||
|
|
||||||
|
getEffects(filter = e => true, forceRequise = undefined) {
|
||||||
|
const effects = this.getEmbeddedCollection("ActiveEffect")
|
||||||
|
const selected = effects.filter(filter)
|
||||||
|
if (forceRequise && this.isForceInsuffisante(forceRequise)) {
|
||||||
|
selected.push(StatusEffects.prepareActiveEffect(STATUSES.StatusForceWeak))
|
||||||
|
}
|
||||||
|
return selected
|
||||||
|
}
|
||||||
|
|
||||||
|
getEffectsByStatus(effectId) {
|
||||||
|
return this.getEffects().filter(it => it.statuses.has(effectId))
|
||||||
|
}
|
||||||
|
|
||||||
|
async setEffect(effectId, status) {
|
||||||
|
if (this.isEffectAllowed(effectId)) {
|
||||||
|
const effects = this.getEffectsByStatus(effectId)
|
||||||
|
if (!status && effects.length > 0) {
|
||||||
|
await this.deleteEmbeddedDocuments('ActiveEffect', effects.map(it => it.id), { render: true })
|
||||||
|
}
|
||||||
|
if (status && effects.length == 0) {
|
||||||
|
await this.createEmbeddedDocuments("ActiveEffect", [StatusEffects.prepareActiveEffect(effectId)], { render: true })
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async removeEffect(id) {
|
||||||
|
this.removeEffects(it => it.id == id)
|
||||||
|
}
|
||||||
|
|
||||||
|
async removeEffects(filter = e => true) {
|
||||||
|
if (game.user.isGM) {
|
||||||
|
const effectsToRemove = this.getEffects(filter);
|
||||||
|
const ids = effectsToRemove.map(it => it.id);
|
||||||
|
await this.deleteEmbeddedDocuments('ActiveEffect', ids);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
async updateCarac(caracName, to) {
|
async updateCarac(caracName, to) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async onUpdateActor(change, options, actorId) {
|
||||||
|
const updatedCarac = change?.system?.carac
|
||||||
|
if (updatedCarac && (updatedCarac.force || updatedCarac.reve || updatedCarac.taille)) {
|
||||||
|
console.log(' onUpdateActor', change, options, actorId)
|
||||||
|
await this.setEffect(STATUSES.StatusSurEnc, this.isSurenc())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
async onPreUpdateItem(item, change, options, id) { }
|
async onPreUpdateItem(item, change, options, id) { }
|
||||||
|
|
||||||
async onCreateItem(item, options, id) { }
|
async onCreateItem(item, options, id) {
|
||||||
|
}
|
||||||
|
|
||||||
async onUpdateItem(item, options, id) { }
|
async onUpdateItem(item, options, id) {
|
||||||
|
}
|
||||||
async onUpdateActor(update, options, actorId) { }
|
|
||||||
|
|
||||||
async onDeleteItem(item, options, id) {
|
async onDeleteItem(item, options, id) {
|
||||||
if (item.isInventaire()) {
|
if (item.isInventaire()) {
|
||||||
@@ -262,6 +312,7 @@ export class RdDBaseActor extends Actor {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
async _removeItemFromConteneur(item) {
|
async _removeItemFromConteneur(item) {
|
||||||
const updates = this.items.filter(it => it.isConteneur() && it.system.contenu.includes(item.id))
|
const updates = this.items.filter(it => it.isConteneur() && it.system.contenu.includes(item.id))
|
||||||
.map(conteneur => {
|
.map(conteneur => {
|
||||||
@@ -510,16 +561,22 @@ export class RdDBaseActor extends Actor {
|
|||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
async computeEncTotal() {
|
async computeEncTotal() {
|
||||||
if (!this.pack) {
|
if (this.pack) {
|
||||||
|
this.encTotal = 0
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
const wasSurenc = this.isSurenc()
|
||||||
this.encTotal = this.items.filter(it => RdDItem.getItemTypesInventaire().includes(it.type))
|
this.encTotal = this.items.filter(it => RdDItem.getItemTypesInventaire().includes(it.type))
|
||||||
.map(it => it.getEncTotal()).reduce(Misc.sum(), 0)
|
.map(it => it.getEncTotal()).reduce(Misc.sum(), 0)
|
||||||
return this.encTotal;
|
const isSurenc = this.isSurenc()
|
||||||
|
if (isSurenc != wasSurenc) {
|
||||||
|
await this.setEffect(STATUSES.StatusSurEnc, isSurenc)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
getEncTotal() {
|
getEncTotal() {
|
||||||
return Math.floor(this.encTotal ?? 0);
|
return Math.floor(this.encTotal ?? 0)
|
||||||
}
|
}
|
||||||
|
|
||||||
async createItem(type, name = undefined) {
|
async createItem(type, name = undefined) {
|
||||||
@@ -570,7 +627,7 @@ export class RdDBaseActor extends Actor {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
await this.computeEncTotal();
|
await this.computeEncTotal()
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -29,7 +29,7 @@ export class ExperienceLog {
|
|||||||
};
|
};
|
||||||
console.log('ExperienceLog.add', newXpLog)
|
console.log('ExperienceLog.add', newXpLog)
|
||||||
const newExperienceLog = (actor.system.experiencelog ?? []).concat([newXpLog]);
|
const newExperienceLog = (actor.system.experiencelog ?? []).concat([newXpLog]);
|
||||||
await actor.update({ [`system.experiencelog`]: newExperienceLog });
|
await actor.update({ [`system.experiencelog`]: newExperienceLog }, { noHook: true });
|
||||||
}
|
}
|
||||||
|
|
||||||
static labelTopic(topic) {
|
static labelTopic(topic) {
|
||||||
|
|||||||
288
module/actor/export-pdf/export-pdf.mjs
Normal file
288
module/actor/export-pdf/export-pdf.mjs
Normal file
@@ -0,0 +1,288 @@
|
|||||||
|
import { ACTOR_TYPES, ITEM_TYPES } from "../../constants.js"
|
||||||
|
import { Grammar } from "../../grammar.js"
|
||||||
|
import { RdDItemArme } from "../../item/arme.js"
|
||||||
|
import { CATEGORIES_COMPETENCE_COMBAT } from "../../item/base-items.js"
|
||||||
|
import { Misc } from "../../misc.js"
|
||||||
|
import { RdDTimestamp } from "../../time/rdd-timestamp.js"
|
||||||
|
import { PDFDocument } from "./pdf-lib/pdf-lib.esm.js"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
const copyProperty = (actor, path) => foundry.utils.getProperty(actor, path)
|
||||||
|
|
||||||
|
// const findItem = (actor, itemType, itemName) => actor.itemTypes[itemType].find(it => Grammar.equalsInsensitive(formCompName(it.name), formCompName(itemName)))
|
||||||
|
// const findItemPos = (actor, itemType, pos) => actor.itemTypes[itemType].length <= pos ? actor.itemTypes[itemType][pos] : length
|
||||||
|
// const findProperty = (it, path) => it ? foundry.utils.getProperty(it, path) : undefined
|
||||||
|
|
||||||
|
// const findItemProperty = (actor, itemType, itemName, path) => findProperty(findItem(actor, itemType, itemName), path)
|
||||||
|
// const findItemPosProperty = (actor, itemType, pos, path) => findProperty(findItemPos(actor, itemType, pos), path)
|
||||||
|
|
||||||
|
// const findArmeProperty = (actor, pos, path) => findProperty(findItemPos(actor, ITEM_TYPES.arme, pos), path)
|
||||||
|
// const findSortProperty = (actor, pos, path) => findProperty(findItemPos(actor, ITEM_TYPES.sort, pos), path)
|
||||||
|
|
||||||
|
// const itemFormPath = (type, pos, property) => `${type}s.${pos}.${property}`
|
||||||
|
|
||||||
|
|
||||||
|
const ACTOR_TO_FORM_MAPPING = [
|
||||||
|
{ path: 'name' },
|
||||||
|
{ path: 'system.carac.taille.value' },
|
||||||
|
{ path: 'system.carac.apparence.value' },
|
||||||
|
{ path: 'system.carac.apparence.xp' },
|
||||||
|
{ path: 'system.carac.constitution.value' },
|
||||||
|
{ path: 'system.carac.constitution.xp' },
|
||||||
|
{ path: 'system.carac.force.value' },
|
||||||
|
{ path: 'system.carac.force.value' },
|
||||||
|
{ path: 'system.carac.force.xp' },
|
||||||
|
{ path: 'system.carac.agilite.value' },
|
||||||
|
{ path: 'system.carac.agilite.xp' },
|
||||||
|
{ path: 'system.carac.dexterite.value' },
|
||||||
|
{ path: 'system.carac.dexterite.xp' },
|
||||||
|
{ path: 'system.carac.vue.value' },
|
||||||
|
{ path: 'system.carac.vue.xp' },
|
||||||
|
{ path: 'system.carac.ouie.value' },
|
||||||
|
{ path: 'system.carac.ouie.xp' },
|
||||||
|
{ path: 'system.carac.odoratgout.value' },
|
||||||
|
{ path: 'system.carac.odoratgout.xp' },
|
||||||
|
{ path: 'system.carac.volonte.value' },
|
||||||
|
{ path: 'system.carac.volonte.xp' },
|
||||||
|
{ path: 'system.carac.empathie.value' },
|
||||||
|
{ path: 'system.carac.empathie.xp' },
|
||||||
|
{ path: 'system.carac.intellect.value' },
|
||||||
|
{ path: 'system.carac.intellect.xp' },
|
||||||
|
{ path: 'system.carac.reve.value' },
|
||||||
|
{ path: 'system.carac.reve.xp' },
|
||||||
|
{ path: 'system.carac.chance.value' },
|
||||||
|
{ path: 'system.carac.chance.xp' },
|
||||||
|
|
||||||
|
{ path: 'system.age' },
|
||||||
|
{ path: 'system.sexe' },
|
||||||
|
{ path: 'system.taille' },
|
||||||
|
{ path: 'system.poids' },
|
||||||
|
{ path: 'system.cheveux' },
|
||||||
|
{ path: 'system.yeux' },
|
||||||
|
{ path: 'system.beaute' },
|
||||||
|
{ path: 'system.main' },
|
||||||
|
{ path: 'system.heure' },
|
||||||
|
{ path: 'computed.hn.heure', getter: actor => (RdDTimestamp.definition(actor.system.heure)?.heure ?? 0) + 1 },
|
||||||
|
{ path: 'computed.hn.label', getter: actor => RdDTimestamp.definition(actor.system.heure)?.avecArticle },
|
||||||
|
|
||||||
|
{ path: 'system.carac.melee.value' },
|
||||||
|
{ path: 'system.carac.tir.value' },
|
||||||
|
{ path: 'system.carac.lancer.value' },
|
||||||
|
{ path: 'system.carac.derobee.value' },
|
||||||
|
{ path: 'system.sante.vie.value' },
|
||||||
|
{ path: 'system.sante.endurance.value' },
|
||||||
|
|
||||||
|
{ path: 'system.attributs.sust.value' },
|
||||||
|
{ path: 'system.attributs.sconst.value' },
|
||||||
|
{ path: 'system.attributs.encombrement.value' },
|
||||||
|
{ path: 'system.attributs.plusdom.value', getter: actor => Misc.toSignedString(actor.system.attributs.plusdom.value) },
|
||||||
|
|
||||||
|
// , getter: actor => actor.get
|
||||||
|
]
|
||||||
|
|
||||||
|
export default class ExportPdf {
|
||||||
|
|
||||||
|
static init() {
|
||||||
|
Hooks.on("getActorContextOptions", (actorDirectory, menus) => { ExportPdf.onActorDirectoryMenu(actorDirectory, menus) })
|
||||||
|
}
|
||||||
|
|
||||||
|
static onActorDirectoryMenu(actorDirectory, menus) {
|
||||||
|
menus.push({
|
||||||
|
name: 'Export PDF',
|
||||||
|
icon: '<i class="fa-regular fa-file-pdf"></i>',
|
||||||
|
condition: target => actorDirectory.id == 'actors' && ExportPdf.$isActorPersonnage(this.$getActor(target)),
|
||||||
|
callback: async target => await ExportPdf.exportActor(target)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
static $getActor(target) {
|
||||||
|
const entryId = $(target).closest(".directory-item")?.data("entryId")
|
||||||
|
return game.actors.get(entryId)
|
||||||
|
}
|
||||||
|
|
||||||
|
static $isActorPersonnage(actor) {
|
||||||
|
return actor?.type == ACTOR_TYPES.personnage
|
||||||
|
}
|
||||||
|
|
||||||
|
static async exportActor(target) {
|
||||||
|
const actor = ExportPdf.$getActor(target)
|
||||||
|
if (!ExportPdf.$isActorPersonnage(actor)) {
|
||||||
|
ui.notifications.error("Pas de personnage sélectionné")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
const templatePdf = '/systems/foundryvtt-reve-de-dragon/assets/feuille-personnage.pdf';
|
||||||
|
|
||||||
|
const pdfBytes = await fetch(templatePdf).then(res => res.arrayBuffer())
|
||||||
|
const pdfDoc = await PDFDocument.load(pdfBytes)
|
||||||
|
|
||||||
|
const exporter = new ExportPdf(actor, pdfDoc)
|
||||||
|
exporter.generateFeuillePersonnage()
|
||||||
|
}
|
||||||
|
|
||||||
|
constructor(actor, pdfDoc) {
|
||||||
|
this.pdfDoc = pdfDoc
|
||||||
|
this.form = this.pdfDoc.getForm()
|
||||||
|
this.actor = actor
|
||||||
|
this.allComps = this.actor.itemTypes[ITEM_TYPES.competence]
|
||||||
|
this.comps = this.allComps
|
||||||
|
.filter(it => !it.isNiveauBase())
|
||||||
|
.sort(Misc.ascending(it => it.name))
|
||||||
|
|
||||||
|
this.compsNonArmes = this.comps.filter(it => !ExportPdf.isCompCombat(it))
|
||||||
|
this.compsArmes = this.comps.filter(it => ExportPdf.isCompCombat(it))
|
||||||
|
this.addedComps = new Set([])
|
||||||
|
}
|
||||||
|
|
||||||
|
static isCompCombat(comp) {
|
||||||
|
return CATEGORIES_COMPETENCE_COMBAT.includes(comp.system.categorie) && !Grammar.includesLowerCaseNoAccent(comp.name, "corps à corps") && !Grammar.includesLowerCaseNoAccent(comp.name, "esquive")
|
||||||
|
}
|
||||||
|
|
||||||
|
async generateFeuillePersonnage() {
|
||||||
|
|
||||||
|
this.$exportActorFields()
|
||||||
|
this.$exportCompetences()
|
||||||
|
this.$exportArchetype()
|
||||||
|
this.$exportArmes()
|
||||||
|
this.$exportSorts()
|
||||||
|
|
||||||
|
const pdfBytes = await this.pdfDoc.save();
|
||||||
|
const filename = `rdd-${this.actor.name.slugify()}.pdf`;
|
||||||
|
foundry.utils.saveDataToFile(pdfBytes, "application/pdf", filename);
|
||||||
|
}
|
||||||
|
|
||||||
|
$exportActorFields() {
|
||||||
|
ACTOR_TO_FORM_MAPPING.forEach(async (mapping) => {
|
||||||
|
const path = mapping.path
|
||||||
|
const value = mapping.getter ? mapping.getter(this.actor) : copyProperty(this.actor, path)
|
||||||
|
this.$setFormValue(path, value)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
$exportCompetences() {
|
||||||
|
this.compsNonArmes
|
||||||
|
.filter(it => !this.addedComps.has(it.id))
|
||||||
|
.forEach(comp => {
|
||||||
|
const formCompName = Grammar.toLowerCaseNoAccent(comp.name.replaceAll(/(\s|-|\')/g, '_'))
|
||||||
|
this.$setFormCompetence(formCompName, comp)
|
||||||
|
})
|
||||||
|
const musique = this.compsNonArmes.filter(it => Grammar.includesLowerCaseNoAccent(it.name, 'musique'))
|
||||||
|
.sort(Misc.descending(it => it.system.niveau))
|
||||||
|
.filter(it => !this.addedComps.has(it.id))
|
||||||
|
.find(it => true)
|
||||||
|
if (musique) {
|
||||||
|
this.$setFormCompetence('musique', musique)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$exportArchetype() {
|
||||||
|
this.allComps.sort(Misc.ascending(it => it.system.niveau_archetype))
|
||||||
|
.forEach(comp => {
|
||||||
|
let formCompName = Grammar.toLowerCaseNoAccent(comp.name.replaceAll(/(\s|-|\')/g, '_'))
|
||||||
|
if (formCompName.includes('musique')) {
|
||||||
|
formCompName = 'musique'
|
||||||
|
}
|
||||||
|
this.$setFormValue(`competences.${formCompName}.niveau_archetype`, comp.system.niveau_archetype)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
$setFormCompetenceArchetype(formCompName, comp, baseFormName = 'competences') {
|
||||||
|
}
|
||||||
|
|
||||||
|
$exportArmes() {
|
||||||
|
const uniques = new Set([])
|
||||||
|
const armes = this.actor.itemTypes[ITEM_TYPES.arme].map(arme => arme.getTypeAttaques()
|
||||||
|
.map(main => {
|
||||||
|
const compName = arme.getCompetenceAction(main)
|
||||||
|
const dommages = RdDItemArme.valeurMain(arme.system.dommages, main)
|
||||||
|
const forceRequise = RdDItemArme.valeurMain(arme.system.force ?? 0, main)
|
||||||
|
const comp = this.compsArmes.find(it => Grammar.equalsInsensitive(it.name, compName)) ?? this.actor.findItemLike(compName, ITEM_TYPES.competence)
|
||||||
|
const unique = [comp.id, arme.name, dommages, forceRequise].join('|');
|
||||||
|
if (uniques.has(unique)) {
|
||||||
|
return undefined
|
||||||
|
}
|
||||||
|
uniques.add(unique)
|
||||||
|
return { arme: arme, comp: comp, main: main }
|
||||||
|
}))
|
||||||
|
.reduce((a, b) => a.concat(b))
|
||||||
|
.filter(it => it != undefined && !it.comp.isNiveauBase())
|
||||||
|
.sort(Misc.descending(it => it.comp.niveau))
|
||||||
|
|
||||||
|
for (let pos = 0; pos < armes.length; pos++) {
|
||||||
|
const it = armes[pos]
|
||||||
|
this.$setFormArmeCompetence(pos, it.comp, it.arme, it.main, it.main)
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO: list comps without weapons
|
||||||
|
// TODO: list other comps not in the standard list -- use an instance of ExportPdf to hold state/built list
|
||||||
|
const otherComps = this.comps.filter(it => !this.addedComps.has(it.id))
|
||||||
|
for (let pos = 0; pos < otherComps.length; pos++) {
|
||||||
|
const comp = otherComps[pos]
|
||||||
|
this.$setFormCompetence(pos, comp, 'competences')
|
||||||
|
this.$setFormValue(`competences.${pos}.name`, comp.name)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$setFormCompetence(formCompName, comp, baseFormName = 'competences') {
|
||||||
|
|
||||||
|
if (this.form.getFieldMaybe(`${baseFormName}.${formCompName}.niveau`)) {
|
||||||
|
this.addedComps.add(comp.id)
|
||||||
|
}
|
||||||
|
if (comp.system.niveau != comp.system.base) {
|
||||||
|
this.$setFormValue(`${baseFormName}.${formCompName}.niveau`, comp.system.niveau)
|
||||||
|
}
|
||||||
|
if (comp.system.xp > 0) {
|
||||||
|
this.$setFormValue(`${baseFormName}.${formCompName}.xp`, comp.system.xp)
|
||||||
|
}
|
||||||
|
if (comp.system.xp_sort > 0) {
|
||||||
|
this.$setFormValue(`${baseFormName}.${formCompName}.xp_sort`, comp.system.xp_sort)
|
||||||
|
}
|
||||||
|
if (CATEGORIES_COMPETENCE_COMBAT.includes(comp.system.categorie)) {
|
||||||
|
this.$setFormValue(`${baseFormName}.${formCompName}.init`, comp.getBaseInit())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$setFormArmeCompetence(pos, comp, arme, main) {
|
||||||
|
this.$setFormCompetence(pos, comp, 'armes')
|
||||||
|
this.$setFormValue(`armes.${pos}.name`, arme.name)
|
||||||
|
this.$setFormValue(`armes.${pos}.main`, main)
|
||||||
|
this.$setFormValue(`armes.${pos}.plusdom`, RdDItemArme.valeurMain(arme.system.dommages, main))
|
||||||
|
}
|
||||||
|
|
||||||
|
$exportSorts() {
|
||||||
|
const sorts = this.actor.itemTypes[ITEM_TYPES.sort].sort(Misc.ascending(s => ExportPdf.$orderDraconic(s) + s.name))
|
||||||
|
|
||||||
|
for (let pos = 0; pos < sorts.length; pos++) {
|
||||||
|
const sort = sorts[pos]
|
||||||
|
this.$setFormSort(pos, sort)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$setFormSort(pos, sort) {
|
||||||
|
this.$setFormValue(`sorts.${pos}.name`, sort.name)
|
||||||
|
this.$setFormValue(`sorts.${pos}.voie`, sort.system.draconic)
|
||||||
|
this.$setFormValue(`sorts.${pos}.tmr`, sort.system.caseTMRSpeciale ?? sort.system.caseTMR)
|
||||||
|
this.$setFormValue(`sorts.${pos}.diff`, sort.system.difficulte)
|
||||||
|
this.$setFormValue(`sorts.${pos}.reve`, sort.system.ptreve)
|
||||||
|
this.$setFormValue(`sorts.${pos}.bonuscase`, sort.system.bonuscase)
|
||||||
|
}
|
||||||
|
|
||||||
|
static $orderDraconic(s) {
|
||||||
|
switch (s.system.draconic.substring(0, 1)) {
|
||||||
|
case 'O': return 1
|
||||||
|
case 'H': return 2
|
||||||
|
case 'N': return 3
|
||||||
|
case 'T': return 4
|
||||||
|
}
|
||||||
|
return 5
|
||||||
|
}
|
||||||
|
|
||||||
|
$setFormValue(path, value) {
|
||||||
|
const hasField = this.form.getFieldMaybe(path)
|
||||||
|
if (hasField && value != undefined) {
|
||||||
|
const field = this.form.getTextField(path)
|
||||||
|
field.setText(value.toString())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
39404
module/actor/export-pdf/pdf-lib/pdf-lib.esm.js
Normal file
39404
module/actor/export-pdf/pdf-lib/pdf-lib.esm.js
Normal file
File diff suppressed because one or more lines are too long
1
module/actor/export-pdf/pdf-lib/pdf-lib.esm.js.map
Normal file
1
module/actor/export-pdf/pdf-lib/pdf-lib.esm.js.map
Normal file
File diff suppressed because one or more lines are too long
16
module/actor/export-pdf/pdf-lib/pdf-lib.esm.min.js
vendored
Normal file
16
module/actor/export-pdf/pdf-lib/pdf-lib.esm.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
1
module/actor/export-pdf/pdf-lib/pdf-lib.esm.min.js.map
Normal file
1
module/actor/export-pdf/pdf-lib/pdf-lib.esm.min.js.map
Normal file
File diff suppressed because one or more lines are too long
39674
module/actor/export-pdf/pdf-lib/pdf-lib.js
Normal file
39674
module/actor/export-pdf/pdf-lib/pdf-lib.js
Normal file
File diff suppressed because one or more lines are too long
1
module/actor/export-pdf/pdf-lib/pdf-lib.js.map
Normal file
1
module/actor/export-pdf/pdf-lib/pdf-lib.js.map
Normal file
File diff suppressed because one or more lines are too long
16
module/actor/export-pdf/pdf-lib/pdf-lib.min.js
vendored
Normal file
16
module/actor/export-pdf/pdf-lib/pdf-lib.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
1
module/actor/export-pdf/pdf-lib/pdf-lib.min.js.map
Normal file
1
module/actor/export-pdf/pdf-lib/pdf-lib.min.js.map
Normal file
File diff suppressed because one or more lines are too long
@@ -62,6 +62,7 @@ export const RDD_CONFIG = {
|
|||||||
demiReve: 'systems/foundryvtt-reve-de-dragon/assets/actions/sort.svg',
|
demiReve: 'systems/foundryvtt-reve-de-dragon/assets/actions/sort.svg',
|
||||||
empoignade: 'systems/foundryvtt-reve-de-dragon/assets/actions/empoignade.svg',
|
empoignade: 'systems/foundryvtt-reve-de-dragon/assets/actions/empoignade.svg',
|
||||||
forceWeak: 'systems/foundryvtt-reve-de-dragon/assets/actions/weak.svg',
|
forceWeak: 'systems/foundryvtt-reve-de-dragon/assets/actions/weak.svg',
|
||||||
|
surenc: 'systems/foundryvtt-reve-de-dragon/assets/actions/surenc.svg',
|
||||||
},
|
},
|
||||||
encaissement: {
|
encaissement: {
|
||||||
mortel: 'mortel',
|
mortel: 'mortel',
|
||||||
|
|||||||
@@ -20,11 +20,11 @@ export class RdDInitiative {
|
|||||||
return "1d6" + (base >= 0 ? "+" : "") + base
|
return "1d6" + (base >= 0 ? "+" : "") + base
|
||||||
}
|
}
|
||||||
|
|
||||||
static ajustementInitiative(caracValue, niveau, bonus) {
|
static ajustementInitiative(caracValue, niveau, bonus = 0) {
|
||||||
return niveau + Math.floor(caracValue / 2) + bonus
|
return niveau + Math.floor(caracValue / 2) + bonus
|
||||||
}
|
}
|
||||||
|
|
||||||
static formule(phase, carac, niveau, bonusMalus) {
|
static formule(phase, carac, niveau, bonusMalus = 0) {
|
||||||
const ajustement = RdDInitiative.ajustementInitiative(carac, niveau, bonusMalus)
|
const ajustement = RdDInitiative.ajustementInitiative(carac, niveau, bonusMalus)
|
||||||
return { phase, ajustement }
|
return { phase, ajustement }
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,7 +1,8 @@
|
|||||||
|
|
||||||
import { Grammar } from "./grammar.js";
|
import { Grammar } from "./grammar.js";
|
||||||
|
import { RdDInitiative } from "./initiative.mjs";
|
||||||
import { RdDItem } from "./item.js";
|
import { RdDItem } from "./item.js";
|
||||||
import { CATEGORIES_COMPETENCES, SANS_COMPETENCE } from "./item/base-items.js";
|
import { CATEGORIES_COMPETENCE_COMBAT, CATEGORIES_COMPETENCES, SANS_COMPETENCE } from "./item/base-items.js";
|
||||||
import { Misc } from "./misc.js";
|
import { Misc } from "./misc.js";
|
||||||
|
|
||||||
const competenceTroncs = [["Esquive", "Dague", "Corps à corps"],
|
const competenceTroncs = [["Esquive", "Dague", "Corps à corps"],
|
||||||
@@ -46,6 +47,30 @@ export class RdDItemCompetence extends RdDItem {
|
|||||||
|
|
||||||
static get defaultIcon() { return "systems/foundryvtt-reve-de-dragon/icons/competence_defaut.webp" }
|
static get defaultIcon() { return "systems/foundryvtt-reve-de-dragon/icons/competence_defaut.webp" }
|
||||||
|
|
||||||
|
isNiveauBase() {
|
||||||
|
return this.system.niveau == this.system.base && this.system.xp == 0
|
||||||
|
}
|
||||||
|
|
||||||
|
getBaseInit() {
|
||||||
|
const carac = this.getInitCarac()
|
||||||
|
if (carac == undefined) {
|
||||||
|
return undefined
|
||||||
|
}
|
||||||
|
return RdDInitiative.ajustementInitiative(carac.value, this.system.niveau)
|
||||||
|
}
|
||||||
|
|
||||||
|
getInitCarac() {
|
||||||
|
if (!this.actor) {
|
||||||
|
return undefined
|
||||||
|
}
|
||||||
|
switch (this.system.categorie) {
|
||||||
|
case CATEGORIES_COMPETENCES.melee.key: return this.actor.system.carac.melee
|
||||||
|
case CATEGORIES_COMPETENCES.tir.key: return this.actor.system.carac.tir
|
||||||
|
case CATEGORIES_COMPETENCES.lancer.key: return this.actor.system.carac.lancer
|
||||||
|
case CATEGORIES_COMPETENCES.draconic.key: return this.actor.system.carac.reve
|
||||||
|
}
|
||||||
|
return undefined
|
||||||
|
}
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static getLabelCategorie(category) {
|
static getLabelCategorie(category) {
|
||||||
return CATEGORIES_COMPETENCES[category].label;
|
return CATEGORIES_COMPETENCES[category].label;
|
||||||
|
|||||||
@@ -260,7 +260,7 @@ export class RdDItemSheetV1 extends foundry.appv1.sheets.ItemSheet {
|
|||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
/** @override */
|
/** @override */
|
||||||
_updateObject(event, formData) {
|
async _updateObject(event, formData) {
|
||||||
switch (this.item.type) {
|
switch (this.item.type) {
|
||||||
case ITEM_TYPES.sort:
|
case ITEM_TYPES.sort:
|
||||||
formData['system.bonuscase'] = RdDItemSort.bonuscasesToString(RdDItemSheetV1._listCaseTmr(
|
formData['system.bonuscase'] = RdDItemSort.bonuscasesToString(RdDItemSheetV1._listCaseTmr(
|
||||||
@@ -273,8 +273,7 @@ export class RdDItemSheetV1 extends foundry.appv1.sheets.ItemSheet {
|
|||||||
formData['system.niveau'] = formData['system.niveau'] ?? formData['system.base']
|
formData['system.niveau'] = formData['system.niveau'] ?? formData['system.base']
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
|
return await super._updateObject(event, formData)
|
||||||
return this.item.update(formData)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
|
|||||||
@@ -62,7 +62,7 @@ export class RdDItemSort extends Item {
|
|||||||
|
|
||||||
|
|
||||||
static diffReve(sort) { return RdDItemSort.toVar((sort.system.difficulte.match(/\-?(\d)+/) ? 'R' : 'R ') + sort.system.difficulte) }
|
static diffReve(sort) { return RdDItemSort.toVar((sort.system.difficulte.match(/\-?(\d)+/) ? 'R' : 'R ') + sort.system.difficulte) }
|
||||||
static coutReve(sort) { return RdDItemSort.toVar((sort.system.ptreve.match(/(\d)+\+?/) ? 'r' : 'r ') + sort.system.ptreve) }
|
static coutReve(sort) { return RdDItemSort.toVar((Number.isInteger(sort.system.ptreve || sort.system.ptreve.match(/(\d)+\+?/)) ? 'r' : 'r ') + sort.system.ptreve) }
|
||||||
static getDraconicsSort(competencesDraconic, sort) {
|
static getDraconicsSort(competencesDraconic, sort) {
|
||||||
// se baser sur la voie du sort?
|
// se baser sur la voie du sort?
|
||||||
switch (Grammar.toLowerCaseNoAccent(sort.name)) {
|
switch (Grammar.toLowerCaseNoAccent(sort.name)) {
|
||||||
|
|||||||
@@ -45,6 +45,16 @@ export class RdDItemArme extends RdDItem {
|
|||||||
isParade() { return this.system.resistance > 0 && this.system.categorie_parade }
|
isParade() { return this.system.resistance > 0 && this.system.categorie_parade }
|
||||||
isBouclier() { return RdDItemArme.getCategorieParade(this).includes('bouclier') }
|
isBouclier() { return RdDItemArme.getCategorieParade(this).includes('bouclier') }
|
||||||
|
|
||||||
|
|
||||||
|
getCompetenceAction(main) {
|
||||||
|
switch (main) {
|
||||||
|
case ATTAQUE_TYPE.UNE_MAIN: return this.competence1Mains()
|
||||||
|
case ATTAQUE_TYPE.DEUX_MAINS: return this.competence2Mains()
|
||||||
|
case ATTAQUE_TYPE.LANCER: return this.system.lancer
|
||||||
|
case ATTAQUE_TYPE.TIR: return this.system.tir
|
||||||
|
default: return this.system.competence
|
||||||
|
}
|
||||||
|
}
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static valeurMain(valeurs, main) {
|
static valeurMain(valeurs, main) {
|
||||||
valeurs = valeurs?.toString() ?? ""
|
valeurs = valeurs?.toString() ?? ""
|
||||||
@@ -78,17 +88,26 @@ export class RdDItemArme extends RdDItem {
|
|||||||
return arme.name
|
return arme.name
|
||||||
case ITEM_TYPES.arme:
|
case ITEM_TYPES.arme:
|
||||||
switch (maniement) {
|
switch (maniement) {
|
||||||
case ATTAQUE_TYPE.COMPETENCE: return arme.system.competence;
|
case ATTAQUE_TYPE.COMPETENCE: return arme.system.competence
|
||||||
case ATTAQUE_TYPE.UNE_MAIN: return arme.competence1Mains()
|
case ATTAQUE_TYPE.UNE_MAIN: return arme.competence1Mains()
|
||||||
case ATTAQUE_TYPE.DEUX_MAINS: return arme.competence2Mains()
|
case ATTAQUE_TYPE.DEUX_MAINS: return arme.competence2Mains()
|
||||||
case ATTAQUE_TYPE.TIR: case 'tir': return arme.system.tir
|
case ATTAQUE_TYPE.TIR: case 'tir': return arme.system.tir
|
||||||
case ATTAQUE_TYPE.LANCER: case 'lancer': return arme.system.lancer;
|
case ATTAQUE_TYPE.LANCER: case 'lancer': return arme.system.lancer
|
||||||
case ATTAQUE_TYPE.CORPS_A_CORPS: return CORPS_A_CORPS
|
case ATTAQUE_TYPE.CORPS_A_CORPS: return CORPS_A_CORPS
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return undefined
|
return undefined
|
||||||
}
|
}
|
||||||
|
|
||||||
|
getTypeAttaques() {
|
||||||
|
return [
|
||||||
|
...(this.system.unemain && this.system.competence && this.system.resistance > 0) ? [ATTAQUE_TYPE.UNE_MAIN] : [],
|
||||||
|
...(this.system.deuxmains && this.system.competence && this.system.resistance > 0) ? [ATTAQUE_TYPE.DEUX_MAINS] : [],
|
||||||
|
...(this.system.lancer && this.system.resistance > 0) ? [ATTAQUE_TYPE.LANCER] : [],
|
||||||
|
...(this.system.tir) ? [ATTAQUE_TYPE.TIR] : [],
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
static computeNiveauArmes(armes, competences) {
|
static computeNiveauArmes(armes, competences) {
|
||||||
for (const arme of armes) {
|
for (const arme of armes) {
|
||||||
arme.system.niveau = RdDItemArme.niveauCompetenceArme(arme, competences);
|
arme.system.niveau = RdDItemArme.niveauCompetenceArme(arme, competences);
|
||||||
|
|||||||
@@ -19,22 +19,23 @@ export const SANS_COMPETENCE = {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export const CATEGORIES_COMPETENCES = {
|
export const CATEGORIES_COMPETENCES = {
|
||||||
"generale": { base: -4, label: "Générales" },
|
generale: { key: 'generale', base: -4, label: "Générales" },
|
||||||
"particuliere": { base: -8, label: "Particulières" },
|
particuliere: { key: 'particuliere', base: -8, label: "Particulières" },
|
||||||
"specialisee": { base: -11, label: "Spécialisées" },
|
specialisee: { key: 'specialisee', base: -11, label: "Spécialisées" },
|
||||||
"connaissance": { base: -11, label: "Connaissances" },
|
connaissance: { key: 'connaissance', base: -11, label: "Connaissances" },
|
||||||
"draconic": { base: -11, label: "Draconic" },
|
draconic: { key: 'draconic', base: -11, label: "Draconic" },
|
||||||
"melee": { base: -6, label: "Mêlée" },
|
melee: { key: 'melee', base: -6, label: "Mêlée" },
|
||||||
"tir": { base: -8, label: "Tir" },
|
tir: { key: 'tir', base: -8, label: "Tir" },
|
||||||
"lancer": { base: -8, label: "Lancer" }
|
lancer: { key: 'lancer', base: -8, label: "Lancer" }
|
||||||
}
|
}
|
||||||
|
export const CATEGORIES_COMPETENCE_COMBAT = [CATEGORIES_COMPETENCES.melee, CATEGORIES_COMPETENCES.tir, CATEGORIES_COMPETENCES.lancer].map(it => it.key)
|
||||||
|
|
||||||
export const CATEGORIES_COMPETENCES_CREATURES = {
|
export const CATEGORIES_COMPETENCES_CREATURES = {
|
||||||
"generale": { base: 0, label: "Générale" },
|
generale: { key: 'generale', base: 0, label: "Générale" },
|
||||||
"naturelle": { base: 0, label: "Arme naturelle" },
|
naturelle: { key: 'naturelle', base: 0, label: "Arme naturelle" },
|
||||||
"melee": { base: 0, label: "Mêlée" },
|
melee: { key: 'melee', base: 0, label: "Mêlée" },
|
||||||
"parade": { base: 0, label: "Parade" },
|
parade: { key: 'parade', base: 0, label: "Parade" },
|
||||||
"tir": { base: 0, label: "Tir" },
|
tir: { key: 'tir', base: 0, label: "Tir" },
|
||||||
"lancer": { base: 0, label: "Lancer" },
|
lancer: { key: 'lancer', base: 0, label: "Lancer" },
|
||||||
"possession": { base: 0, label: "Possession" },
|
possession: { key: 'possession', base: 0, label: "Possession" },
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -12,12 +12,13 @@ const _SPACEHOLDER = { placeholder: true }
|
|||||||
|
|
||||||
const _VENDRE = {
|
const _VENDRE = {
|
||||||
code: 'item-vendre', label: 'Vendre ou donner', icon: it => 'fa-solid fa-comments-dollar',
|
code: 'item-vendre', label: 'Vendre ou donner', icon: it => 'fa-solid fa-comments-dollar',
|
||||||
filter: it => Misc.toInt(it.system.quantite) > 0,
|
filter: it => Misc.toInt(it.system.quantite) > 0 || it.parent?.type == ACTOR_TYPES.commerce,
|
||||||
action: (item, actor) => item.proposerVente()
|
action: (item, actor) => item.proposerVente()
|
||||||
}
|
}
|
||||||
const _ACHETER = {
|
const _ACHETER = {
|
||||||
code: 'item-acheter', label: 'Acheter', icon: it => 'fa-regular fa-coins',
|
code: 'item-acheter', label: 'Acheter', icon: it => 'fa-regular fa-coins',
|
||||||
filter: it => Misc.toInt(it.system.quantite) > 0 && it.parent?.type == ACTOR_TYPES.commerce,
|
filter: it => it.parent?.type == ACTOR_TYPES.commerce,
|
||||||
|
allowLimited: true,
|
||||||
action: (item, actor) => actor.vente(item)
|
action: (item, actor) => actor.vente(item)
|
||||||
}
|
}
|
||||||
const _MONTRER = {
|
const _MONTRER = {
|
||||||
|
|||||||
@@ -58,9 +58,9 @@ export class RdDCombatManager extends Combat {
|
|||||||
|
|
||||||
|
|
||||||
static getCombatant(actorId, tokenId) {
|
static getCombatant(actorId, tokenId) {
|
||||||
return game.combat.combatants.find(it => it.actor.id == actorId &&
|
return game.combat?.combatants.find(it => it.actor.id == actorId &&
|
||||||
it.token.id == tokenId
|
it.token.id == tokenId
|
||||||
);
|
)
|
||||||
}
|
}
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
async nextRound() {
|
async nextRound() {
|
||||||
|
|||||||
@@ -89,6 +89,7 @@ import { Migrations } from './migrations.js'
|
|||||||
|
|
||||||
import RollDialog from "./roll/roll-dialog.mjs"
|
import RollDialog from "./roll/roll-dialog.mjs"
|
||||||
import ChatRollResult from "./roll/chat-roll-result.mjs"
|
import ChatRollResult from "./roll/chat-roll-result.mjs"
|
||||||
|
import ExportPdf from "./actor/export-pdf/export-pdf.mjs"
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* RdD system
|
* RdD system
|
||||||
@@ -296,6 +297,7 @@ export class SystemReveDeDragon {
|
|||||||
RdDPossession.init()
|
RdDPossession.init()
|
||||||
TMRRencontres.init()
|
TMRRencontres.init()
|
||||||
ExportScriptarium.init()
|
ExportScriptarium.init()
|
||||||
|
ExportPdf.init()
|
||||||
RollDialog.init()
|
RollDialog.init()
|
||||||
ChatRollResult.init()
|
ChatRollResult.init()
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
|
import { RDD_CONFIG } from "../constants.js"
|
||||||
import { RdDItemCompetence } from "../item-competence.js"
|
import { RdDItemCompetence } from "../item-competence.js"
|
||||||
import { RdDCarac } from "../rdd-carac.js"
|
import { RdDCarac } from "../rdd-carac.js"
|
||||||
import { RollPartCheckbox } from "./roll-part-checkbox.mjs"
|
import { RollPartCheckbox } from "./roll-part-checkbox.mjs"
|
||||||
@@ -25,7 +26,7 @@ export class RollPartEncTotal extends RollPartCheckbox {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
getCheckboxIcon(rollData) { return '<i class="fa-solid fa-weight-hanging"></i>' }
|
getCheckboxIcon(rollData) { return `<img src="${RDD_CONFIG.icons.surenc}">` }
|
||||||
getCheckboxLabel(rollData) { return "Enc. total" }
|
getCheckboxLabel(rollData) { return "Enc. total" }
|
||||||
getCheckboxValue(rollData) { return - rollData.active.actor.getEncTotal() }
|
getCheckboxValue(rollData) { return - rollData.active.actor.getEncTotal() }
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -74,7 +74,7 @@ export class RollPartMeditation extends RollPartSelect {
|
|||||||
|
|
||||||
getAjustements(rollData) {
|
getAjustements(rollData) {
|
||||||
const malus = this.getMalusEchecs(rollData)
|
const malus = this.getMalusEchecs(rollData)
|
||||||
const malusEchecs = malusEchecs == 0 ? [] : [{ label: "Méditation", value: malus }]
|
const malusEchecs = malus == 0 ? [] : [{ label: "Méditation", value: malus }]
|
||||||
const malusConditions = { label: "Conditions", value: this.getMalusConditions(rollData) }
|
const malusConditions = { label: "Conditions", value: this.getMalusConditions(rollData) }
|
||||||
return [malusConditions, ...malusEchecs]
|
return [malusConditions, ...malusEchecs]
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
|
import { RDD_CONFIG } from "../constants.js"
|
||||||
import { RdDCarac } from "../rdd-carac.js"
|
import { RdDCarac } from "../rdd-carac.js"
|
||||||
import { RollPartCheckbox } from "./roll-part-checkbox.mjs"
|
import { RollPartCheckbox } from "./roll-part-checkbox.mjs"
|
||||||
|
|
||||||
@@ -10,7 +11,7 @@ export class RollPartSurEnc extends RollPartCheckbox {
|
|||||||
visible(rollData) {
|
visible(rollData) {
|
||||||
return RdDCarac.isActionPhysique(rollData.current.carac.key) && rollData.active.actor.isSurenc()
|
return RdDCarac.isActionPhysique(rollData.current.carac.key) && rollData.active.actor.isSurenc()
|
||||||
}
|
}
|
||||||
getCheckboxIcon(rollData) { return '<i class="fa-solid fa-weight-hanging"></i>' }
|
getCheckboxIcon(rollData) { return `<img src="${RDD_CONFIG.icons.surenc}">` }
|
||||||
getCheckboxLabel(rollData) { return "Sur-enc." }
|
getCheckboxLabel(rollData) { return "Sur-enc." }
|
||||||
getCheckboxValue(rollData) { return rollData.active.actor.computeMalusSurEncombrement() }
|
getCheckboxValue(rollData) { return rollData.active.actor.computeMalusSurEncombrement() }
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -14,13 +14,14 @@ export const STATUSES = {
|
|||||||
StatusBleeding: 'bleeding',
|
StatusBleeding: 'bleeding',
|
||||||
StatusDead: 'dead',
|
StatusDead: 'dead',
|
||||||
StatusDemiReve: 'demi-reve',
|
StatusDemiReve: 'demi-reve',
|
||||||
|
StatusSurEnc: 'sur-encombrement',
|
||||||
StatusForceWeak: 'force insuffisante',
|
StatusForceWeak: 'force insuffisante',
|
||||||
}
|
}
|
||||||
|
|
||||||
export const forceWeakStatusEffect = { rdd: true, id: STATUSES.StatusForceWeak, name: 'EFFECT.StatusForceWeak', img: RDD_CONFIG.icons.forceWeak };
|
export const forceWeakStatusEffect = { rdd: true, id: STATUSES.StatusForceWeak, name: 'EFFECT.StatusForceWeak', img: RDD_CONFIG.icons.forceWeak };
|
||||||
export const demiReveStatusEffect = {
|
export const surEncEffect = { rdd: true, id: STATUSES.StatusSurEnc, name: 'EFFECT.StatusSurEnc', img: RDD_CONFIG.icons.surenc };
|
||||||
rdd: true, id: STATUSES.StatusDemiReve, name: 'EFFECT.StatusDemiReve', img: RDD_CONFIG.icons.demiReve
|
export const demiReveStatusEffect = { rdd: true, id: STATUSES.StatusDemiReve, name: 'EFFECT.StatusDemiReve', img: RDD_CONFIG.icons.demiReve };
|
||||||
};
|
|
||||||
const rddStatusEffects = [
|
const rddStatusEffects = [
|
||||||
{ rdd: true, id: STATUSES.StatusGrappling, name: 'EFFECT.StatusGrappling', img: RDD_CONFIG.icons.empoignade },
|
{ rdd: true, id: STATUSES.StatusGrappling, name: 'EFFECT.StatusGrappling', img: RDD_CONFIG.icons.empoignade },
|
||||||
{ rdd: true, id: STATUSES.StatusGrappled, tint: '#d5633d', name: 'EFFECT.StatusGrappled', img: RDD_CONFIG.icons.empoignade },
|
{ rdd: true, id: STATUSES.StatusGrappled, tint: '#d5633d', name: 'EFFECT.StatusGrappled', img: RDD_CONFIG.icons.empoignade },
|
||||||
@@ -36,7 +37,8 @@ const rddStatusEffects = [
|
|||||||
{ rdd: true, id: STATUSES.StatusBleeding, name: 'EFFECT.StatusBleeding', img: 'icons/svg/blood.svg' },
|
{ rdd: true, id: STATUSES.StatusBleeding, name: 'EFFECT.StatusBleeding', img: 'icons/svg/blood.svg' },
|
||||||
{ rdd: true, id: STATUSES.StatusDead, name: 'EFFECT.StatusDead', img: 'icons/svg/skull.svg' },
|
{ rdd: true, id: STATUSES.StatusDead, name: 'EFFECT.StatusDead', img: 'icons/svg/skull.svg' },
|
||||||
demiReveStatusEffect,
|
demiReveStatusEffect,
|
||||||
forceWeakStatusEffect
|
forceWeakStatusEffect,
|
||||||
|
surEncEffect,
|
||||||
];
|
];
|
||||||
|
|
||||||
const statusDemiSurprise = new Set([STATUSES.StatusStunned, STATUSES.StatusProne, STATUSES.StatusRestrained, STATUSES.StatusForceWeak])
|
const statusDemiSurprise = new Set([STATUSES.StatusStunned, STATUSES.StatusProne, STATUSES.StatusRestrained, STATUSES.StatusForceWeak])
|
||||||
@@ -136,7 +138,7 @@ export class StatusEffects extends FormApplication {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static prepareActiveEffect(effectId) {
|
static prepareActiveEffect(effectId) {
|
||||||
let status = rddStatusEffects.find(it => it.id == effectId)
|
let status = rddStatusEffects.find(it => it.statuses? it.statuses.has(effectId) : it.id == effectId)
|
||||||
if (status) {
|
if (status) {
|
||||||
status = foundry.utils.duplicate(status)
|
status = foundry.utils.duplicate(status)
|
||||||
status.statuses = new Set([effectId])
|
status.statuses = new Set([effectId])
|
||||||
|
|||||||
@@ -27,6 +27,7 @@
|
|||||||
"dependencies": {
|
"dependencies": {
|
||||||
"gulp": "^5.0.0",
|
"gulp": "^5.0.0",
|
||||||
"gulp-less": "^5.0.0",
|
"gulp-less": "^5.0.0",
|
||||||
|
"pdf-lib": "^1.17.1",
|
||||||
"rollup-plugin-visualizer": "^5.12.0"
|
"rollup-plugin-visualizer": "^5.12.0"
|
||||||
},
|
},
|
||||||
"repository": {
|
"repository": {
|
||||||
|
|||||||
21
pdf-lib-LICENSE.md
Normal file
21
pdf-lib-LICENSE.md
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
MIT License
|
||||||
|
|
||||||
|
Copyright (c) 2019 Andrew Dillon
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
||||||
@@ -4,7 +4,7 @@
|
|||||||
<li class="caracteristique flexrow list-item {{#if carac.isLevelUp}}xp-level-up{{/if}}" data-attribute="{{key}}">
|
<li class="caracteristique flexrow list-item {{#if carac.isLevelUp}}xp-level-up{{/if}}" data-attribute="{{key}}">
|
||||||
{{#if (eq key 'taille')}}
|
{{#if (eq key 'taille')}}
|
||||||
<span class="carac-label" name="system.carac.{{key}}.label">{{carac.label}}</span>
|
<span class="carac-label" name="system.carac.{{key}}.label">{{carac.label}}</span>
|
||||||
<input class="carac-value" type="number" name="system.carac.{{key}}.value" value="{{carac.value}}" data-dtype="number" {{#unless @root.options.vueDetaillee}}disabled{{/unless}} />
|
<input class="carac-value" type="number" name="carac.{{key}}" value="{{carac.value}}" data-dtype="number" {{#unless @root.options.vueDetaillee}}disabled{{/unless}} />
|
||||||
<label class="carac-xp"/>
|
<label class="carac-xp"/>
|
||||||
{{else}}
|
{{else}}
|
||||||
{{#if (actor-default @root.type 'carac' key 'derivee')}}
|
{{#if (actor-default @root.type 'carac' key 'derivee')}}
|
||||||
@@ -23,7 +23,7 @@
|
|||||||
{{else}}
|
{{else}}
|
||||||
<span class="carac-label" name="system.carac.{{key}}.label"><a class="roll-carac" data-carac-name={{key}}>{{carac.label}}</a></span>
|
<span class="carac-label" name="system.carac.{{key}}.label"><a class="roll-carac" data-carac-name={{key}}>{{carac.label}}</a></span>
|
||||||
{{/if}}
|
{{/if}}
|
||||||
<input class="carac-value" type="number" name="system.carac.{{key}}.value" value="{{carac.value}}" data-dtype="number" {{#unless @root.options.vueDetaillee}}disabled{{/unless}} />
|
<input class="carac-value" type="number" name="carac.{{key}}" value="{{carac.value}}" data-dtype="number" {{#unless @root.options.vueDetaillee}}disabled{{/unless}} />
|
||||||
<span class="carac-xp">
|
<span class="carac-xp">
|
||||||
<input class="carac-xp" type="number" name="system.carac.{{key}}.xp" value="{{carac.xp}}" data-dtype="number"
|
<input class="carac-xp" type="number" name="system.carac.{{key}}.xp" value="{{carac.xp}}" data-dtype="number"
|
||||||
data-tooltip="Vous devez acquérir {{carac.xpNext}} points d'Experience pour augmenter votre {{carac.label}}"
|
data-tooltip="Vous devez acquérir {{carac.xpNext}} points d'Experience pour augmenter votre {{carac.label}}"
|
||||||
|
|||||||
@@ -40,6 +40,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<hr>
|
<hr>
|
||||||
{{> "systems/foundryvtt-reve-de-dragon/templates/actor/commerce-inventaire.hbs"}}
|
{{> "systems/foundryvtt-reve-de-dragon/templates/actor/commerce-inventaire.hbs"}}
|
||||||
|
{{log @root.options}}
|
||||||
{{#unless system.illimite}}
|
{{#unless system.illimite}}
|
||||||
{{#if @root.options.isObserver}}
|
{{#if @root.options.isObserver}}
|
||||||
<hr>
|
<hr>
|
||||||
|
|||||||
Reference in New Issue
Block a user