Compare commits

..

13 Commits

Author SHA1 Message Date
461a398965 Police homogène pour la navigation 2025-11-27 02:08:25 +01:00
eef0893d1a Version 13.0.20 2025-11-27 01:55:19 +01:00
c50f1287b5 Ajustement astrologique rituels 2025-11-27 01:14:46 +01:00
acd40f3154 Fix dépense rêve sort
La dépense de rêve de sort se faisait en parallèle de la fermeture
de fenêtre des TMRs, qui modifiait la fatigue. Du coup, l'update de
la dépense de rêve ne se faisait pas
2025-11-27 01:02:09 +01:00
764f9f81c8 Centrage logo pause 2025-11-26 23:39:15 +01:00
70e8cd74a2 Correction feuille méditation joueur 2025-11-26 21:27:39 +01:00
e96f4e01bd Majuscule Survie en désert 2025-11-24 18:04:43 +01:00
c44c2d7c96 Ajout d'un statut "malade/empoisonné" 2025-11-24 18:04:43 +01:00
e2ee73bc4e Empoignade V2
Correction, de l'empoignade en mode jet V2

- le défenseur diminue le nombre de points d'empoignade
- amélioration des messages liés à l'empoignade
- ajout de choix de pertes d'endurance à infliger
2025-11-24 18:04:43 +01:00
3f19886342 Fix affichage sur perte d'endurance
décaller l'ajout d'effets après l'update permet
d'éviter les résultats "invisibles"
2025-11-24 18:04:43 +01:00
9a5afc918e Fix suppression effets 2025-11-24 18:04:43 +01:00
2ac35ef5d1 Corrections de styles incorrects
- combo de sélection des dommages d'empoignade
- boutons de navigation dans les journaux
- boutons de blessures dans la feuille de personnage
2025-11-24 18:04:42 +01:00
33c6b35601 Merge pull request '## 13.0.19 - L'introspection d'Illysis' (#784) from feature/v13-combats-v2 into v13
All checks were successful
Release Creation / build (release) Successful in 2m10s
Reviewed-on: https, #784
2025-11-14 17:46:26 +01:00
78 changed files with 430 additions and 323 deletions

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" style="height: 256px; width: 256px;"><g class="" transform="translate(0,0)" style=""><path d="M256.25 20.313c-108.64 0-196.78 90.592-196.78 202.937 0 84.615 49.994 156.904 121.093 187.438v-16.375c0-25.638-6.2-40.132-13.875-48.47-7.675-8.336-17.567-11.4-27.72-11.937-18.252-.97-32.4-12.266-40.905-27-6.47-11.205-5.975-24.767-.532-36.97 5.444-12.2 15.49-23.71 29.19-33.905 27.394-20.39 69.79-35.56 122.436-35.56 52.702 0 98.475 15.648 129.344 36.218 15.435 10.284 27.24 21.746 34.22 33.968 6.976 12.222 8.93 26.41 2.186 38.094-4.19 7.257-11.026 11.988-18.687 15.938-7.663 3.95-16.085 6.78-24.595 6.78-11.865 0-20.63 2.214-27.438 10.157s-12.437 23.63-12.437 52.688v16.437c71.195-30.488 121.28-102.814 121.28-187.5 0-112.347-88.14-202.938-196.78-202.938zm-76.656 86.718c1.53.02 3.05.078 4.562.157 14.525.766 28.29 4.3 41.063 9.97l17.31 7.687-16.624 9.062-84.062 45.875-8.938-16.405 65.156-35.563c-24.195-5.513-50.92-1.877-82.062 17.532l-9.875-15.844c25.778-16.066 50.528-22.75 73.47-22.47zm150.312 0c22.944-.28 47.722 6.404 73.5 22.47l-9.875 15.844c-31.14-19.41-57.865-23.045-82.06-17.53l65.155 35.56-8.938 16.407-84.062-45.874L267 124.844l17.313-7.688c12.772-5.67 26.506-9.203 41.03-9.97 1.514-.078 3.034-.136 4.563-.155zm-73.594 170.282c-68.947 0-113.104 15.367-116.843 37.907l.5.03c13.487.714 28.843 5.31 40.468 17.938 11.624 12.627 18.812 32.418 18.812 61.125v100.312h113.813V394.312c0-31.4 5.766-51.81 16.937-64.843 11.17-13.034 27.003-16.69 41.625-16.69.352 0 .76-.03 1.156-.06-6.417-22.614-49.872-35.408-116.467-35.408z" fill="#fff" fill-opacity="1"></path></g></svg>

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.0 KiB

After

Width:  |  Height:  |  Size: 7.2 KiB

View File

@@ -1,5 +1,17 @@
# 13.0
## 13.0.20 - L'immobilisme d'Illysis
- Centrage du logo de pause
- Ajout d'un statut malade/empoisonné
- Fenêtre de jet v2
- correction du compteur empoignade
- amélioration des messages liés à l'empoignade
- amélioration des choix de perte d'endurance
- correction de la dépense de rêve sur lancement de sort
- ajustement astrologique sur rituels
## 13.0.19 - L'introspection d'Illysis
- Ajout d'un bouton pour les jets de résistance sous rêve actuel

View File

@@ -60,8 +60,7 @@
/* Fonts */
.sheet header.sheet-header h1 input,
.window-app .window-header,
#actors .directory-list,
#navigation #scene-list .scene.nav-item {
#sidebar {
font-family: "GoudyAcc";
}
/* For title, sidebar character and scene */
@@ -71,9 +70,7 @@
.sheet header.sheet-header .flex-group-center.flex-fatigue,
select,
.item-checkbox,
#sidebar,
#players,
#navigation #nav-toggle {
#players {
font-family: "CaslonAntique";
/* For sheet parts; For nav and title */
}
@@ -99,7 +96,9 @@ select,
--gradient-warning: linear-gradient(150deg, hsla(32, 100%, 50%, 0.3), hsla(52, 60%, 50%, 0.1), hsla(32, 60%, 50%, 0.1), hsla(32, 100%, 50%, 0.3));
--gradient-silver-light: linear-gradient(30deg, rgba(61, 55, 93, 0.2), rgba(178, 179, 196, 0.1), rgba(59, 62, 63, 0.2), rgba(206, 204, 199, 0.1), rgba(61, 46, 49, 0.2));
--gradient-daylight: conic-gradient(from 0deg, hsla(50, 100%, 80%, 0.7), hsla(30, 30%, 40%, 0.1) 25%, hsla(250, 50%, 40%, 0.1) 25%, hsla(250, 30%, 30%, 0.7) 50%, hsla(250, 50%, 40%, 0.1) 75%, hsla(30, 30%, 40%, 0.1) 75%, hsla(50, 100%, 80%, 0.7));
--background-custom-button: linear-gradient(to bottom, hsla(208, 38%, 21%, 0.988) 5%, hsla(202, 42%, 14%, 0.671) 100%);
--background-color-button: hsl(25, 5%, 60%);
--background-color-custom-button: hsla(208, 38%, 21%, 0.988);
--background-custom-button: linear-gradient(to bottom, var(--background-color-custom-button) 5%, hsla(202, 42%, 14%, 0.671) 100%);
--background-custom-button-hover: linear-gradient(to bottom, hsl(0, 100%, 25%) 5%, hsl(0, 97%, 12%) 100%);
--background-control-selected: linear-gradient(to bottom, hsla(0, 100%, 25%, 0.5) 5%, hsla(0, 100%, 12%, 0.5) 100%);
--background-tooltip: hsla(60, 12%, 85%, 0.95);
@@ -947,6 +946,13 @@ select,
flex-basis: inherit;
flex: "flex-shrink";
}
.system-foundryvtt-reve-de-dragon :is(section.scenes-sidebar, section.compendium-sidebar) li.directory-item.folder a {
text-shadow: 1px 1px 2px var(--rdd-color-text-primary);
color: var(--color-background-chat-message);
}
.system-foundryvtt-reve-de-dragon :is(section.scenes-sidebar, section.compendium-sidebar) li.directory-item.folder a:hover {
text-shadow: 1px 0px 0px #ff6600;
}
.system-foundryvtt-reve-de-dragon .tabs .item.active,
.system-foundryvtt-reve-de-dragon .blessures-list li ul li:first-child:hover,
.system-foundryvtt-reve-de-dragon i.moral-radio-checkmark-off:hover,
@@ -1607,28 +1613,18 @@ select,
.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 .journal-entry .journal-sidebar nav.tabs {
color: var(--rdd-color-text-primary);
}
.system-foundryvtt-reve-de-dragon .window-app.sheet .window-content .sheet-body button .count,
.system-foundryvtt-reve-de-dragon .application .window-content button .count,
.system-foundryvtt-reve-de-dragon .journal-entry .journal-sidebar 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 {
background-color: var(--background-color-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);
@@ -2200,7 +2196,7 @@ select,
.system-foundryvtt-reve-de-dragon #sidebar-tabs > .collapsed,
.system-foundryvtt-reve-de-dragon #chat-controls .chat-control-icon {
color: rgba(220, 220, 220, 0.75);
text-shadow: 1px 1px 0 rgba(0, 0, 0, 0.75);
text-shadow: 1px 1px 1px rgba(0, 0, 0, 0.75);
}
.system-foundryvtt-reve-de-dragon .sidebar-tab .directory-list .entity {
border-top: 1px dashed rgba(0, 0, 0, 0.25);
@@ -2809,24 +2805,6 @@ select,
.system-foundryvtt-reve-de-dragon aside#tooltip .toolclip p.faint {
color: var(--color-tooltip-faint);
}
.system-foundryvtt-reve-de-dragon .chat-card-button,
.system-foundryvtt-reve-de-dragon .chat-card-button-pushed {
border-radius: 0.2rem;
cursor: pointer;
font-family: CaslonPro;
font-size: 0.9rem;
padding: 0.2rem 0.4rem 0rem 0.4rem;
text-decoration: none;
position: relative;
margin: 0.3rem;
border: 2px ridge #846109;
display: inline-block;
}
.system-foundryvtt-reve-de-dragon .chat-card-button img,
.system-foundryvtt-reve-de-dragon .chat-card-button-pushed img {
max-width: 1rem;
max-height: 1rem;
}
.system-foundryvtt-reve-de-dragon .chat-card-info {
font-size: 1.1rem;
display: flex;
@@ -2841,14 +2819,42 @@ select,
.system-foundryvtt-reve-de-dragon .jet-astrologie {
color: var(--major-button-color) !important;
}
.system-foundryvtt-reve-de-dragon .chat-card-button,
.system-foundryvtt-reve-de-dragon .chat-card-button-checked,
.system-foundryvtt-reve-de-dragon select.chat-card-select {
border-radius: 0.2rem;
cursor: pointer;
font-family: CaslonPro;
font-size: 0.9rem;
padding: 0.2rem 0.4rem 0rem 0.4rem;
text-decoration: none;
position: relative;
margin: 0.3rem;
border: 2px ridge #846109;
display: inline-block;
}
.system-foundryvtt-reve-de-dragon .chat-card-button img,
.system-foundryvtt-reve-de-dragon .chat-card-button-checked img,
.system-foundryvtt-reve-de-dragon select.chat-card-select img {
max-width: 1rem;
max-height: 1rem;
}
.system-foundryvtt-reve-de-dragon select.chat-card-select {
width: calc(100% - 0.6rem);
color: var(--major-button-color);
background-color: var(--background-color-custom-button);
}
.system-foundryvtt-reve-de-dragon select.chat-card-select option {
background-color: var(--background-color-custom-button);
}
.system-foundryvtt-reve-de-dragon .chat-card-button {
text-shadow: 1px 1px #4d3534;
box-shadow: inset 1x 1px #a6827e;
color: var(--major-button-color) !important;
color: var(--major-button-color);
background: var(--background-custom-button);
background-color: #7d5d3b00;
background-color: var(--background-color-custom-button);
}
.system-foundryvtt-reve-de-dragon .chat-card-button-pushed {
.system-foundryvtt-reve-de-dragon .chat-card-button-checked {
text-shadow: 1px 1px hsla(202, 30%, 70%, 0.5);
box-shadow: inset -1px -1px #a6827e;
color: hsla(202, 42%, 14%, 0.7);
@@ -2858,11 +2864,11 @@ select,
.system-foundryvtt-reve-de-dragon .chat-card-button:hover {
background: var(--background-custom-button-hover);
}
.system-foundryvtt-reve-de-dragon .chat-card-button-pushed:hover {
.system-foundryvtt-reve-de-dragon .chat-card-button-checked:hover {
background: var(--background-custom-button-hover);
}
.system-foundryvtt-reve-de-dragon .chat-card-button:active,
.system-foundryvtt-reve-de-dragon .chat-card-button-pushed:active {
.system-foundryvtt-reve-de-dragon .chat-card-button-checked:active {
position: relative;
top: 1px;
}

View File

@@ -63,6 +63,7 @@
"StatusUnarmed": "Désarmé",
"StatusGrappling": "Empoignade",
"StatusGrappled": "Empoigné",
"StatusMalade": "Malade",
"StatusRestrained": "Immobilisé",
"StatusComma": "Comma",
"StatusDead": "Mort",

View File

@@ -44,7 +44,9 @@
hsla(50, 100%, 80%, 0.7)
);
--background-custom-button: linear-gradient(to bottom, hsla(208, 38%, 21%, 0.988) 5%, hsla(202, 42%, 14%, 0.671) 100%);
--background-color-button: hsl(25, 5%, 60%);
--background-color-custom-button: hsla(208, 38%, 21%, 0.988);
--background-custom-button: linear-gradient(to bottom, var(--background-color-custom-button) 5%, hsla(202, 42%, 14%, 0.671) 100%);
--background-custom-button-hover: linear-gradient(to bottom, hsla(0, 100%, 25%, 1) 5%, hsla(0, 97%, 12%, 1) 100%);
--background-control-selected: linear-gradient(to bottom, hsla(0, 100%, 25%, 0.5) 5%, hsla(0, 100%, 12%, 0.5) 100%);
--background-tooltip: hsla(60, 12%, 85%, 0.95);

View File

@@ -70,8 +70,7 @@
/* Fonts */
.sheet header.sheet-header h1 input,
.window-app .window-header,
#actors .directory-list,
#navigation #scene-list .scene.nav-item {
#sidebar {
font-family: "GoudyAcc"
}
@@ -80,6 +79,6 @@
.window-app input,
.sheet header.sheet-header .header-compteurs,
.sheet header.sheet-header .flex-group-center.flex-fatigue,
select, .item-checkbox, #sidebar, #players, #navigation #nav-toggle {
select, .item-checkbox, #players {
font-family: "CaslonAntique"; /* For sheet parts; For nav and title */
}

View File

@@ -216,7 +216,15 @@
}
/* =================== Autres ============ */
:is(section.scenes-sidebar, section.compendium-sidebar) li.directory-item.folder {
a {
text-shadow: 1px 1px 2px var(--rdd-color-text-primary);
color: var( --color-background-chat-message);
}
a:hover {
text-shadow: 1px 0px 0px #ff6600;
}
}
.tabs .item.active,
.blessures-list li ul li:first-child:hover,
i.moral-radio-checkmark-off:hover,
@@ -934,20 +942,14 @@
.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 {
label, .hint, .permissions-list, nav.tabs {
color: var(--rdd-color-text-primary);
}
a {
color: var(--color-dark-3);
}
a.filter.active {
color: var(--color-dark-1);
button .count,
button {
background-color: var(--background-color-button);
color: var(--rdd-color-text-primary);
}
}
@@ -1590,7 +1592,7 @@
#sidebar-tabs > .collapsed,
#chat-controls .chat-control-icon {
color: rgba(220, 220, 220, 0.75);
text-shadow: 1px 1px 0 rgba(0, 0, 0, 0.75);
text-shadow: 1px 1px 1px rgba(0, 0, 0, 0.75);
}
.sidebar-tab .directory-list .entity {
@@ -2264,24 +2266,6 @@
color: var(--color-tooltip-faint);
}
.chat-card-button,
.chat-card-button-pushed {
border-radius: 0.2rem;
cursor: pointer;
font-family: CaslonPro;
font-size: 0.9rem;
padding: 0.2rem 0.4rem 0rem 0.4rem;
text-decoration: none;
position: relative;
margin: 0.3rem;
border: 2px ridge #846109;
display: inline-block;
img {
max-width: 1rem;
max-height: 1rem;
}
}
.chat-card-info {
font-size: 1.1rem;
display: flex;
@@ -2298,16 +2282,47 @@
.jet-astrologie {
color: var(--major-button-color) !important;
}
.chat-card-button,
.chat-card-button-checked,
select.chat-card-select {
border-radius: 0.2rem;
cursor: pointer;
font-family: CaslonPro;
font-size: 0.9rem;
padding: 0.2rem 0.4rem 0rem 0.4rem;
text-decoration: none;
position: relative;
margin: 0.3rem;
border: 2px ridge #846109;
display: inline-block;
img {
max-width: 1rem;
max-height: 1rem;
}
}
select.chat-card-select {
width: calc(100% - 0.6rem);
color: var(--major-button-color);
background-color: var(--background-color-custom-button);
option {
background-color: var(--background-color-custom-button);
}
}
.chat-card-button {
text-shadow: 1px 1px #4d3534;
box-shadow: inset 1x 1px #a6827e;
color: var(--major-button-color) !important;
color: var(--major-button-color);
background: var(--background-custom-button);
background-color: #7d5d3b00;
background-color: var(--background-color-custom-button);
}
.chat-card-button-pushed {
.chat-card-button-checked {
text-shadow: 1px 1px hsla(202, 30%, 70%, 0.5);
box-shadow: inset -1px -1px #a6827e;
color: hsla(202, 42%, 14%, 0.7);
@@ -2319,12 +2334,12 @@
background: var(--background-custom-button-hover);
}
.chat-card-button-pushed:hover {
.chat-card-button-checked:hover {
background: var(--background-custom-button-hover);
}
.chat-card-button:active,
.chat-card-button-pushed:active {
.chat-card-button-checked:active {
position: relative;
top: 1px;
}

View File

@@ -130,11 +130,6 @@ export class RdDActor extends RdDBaseActorSang {
return etatGeneral
}
/* -------------------------------------------- */
getActivePoisons() {
return foundry.utils.duplicate(this.items.filter(item => item.type == 'poison' && item.system.active))
}
/* -------------------------------------------- */
getMalusArmure() {
return this.itemTypes[ITEM_TYPES.armure].filter(it => it.system.equipe)
@@ -332,10 +327,6 @@ export class RdDActor extends RdDBaseActorSang {
await this._recupererVie(message, isMaladeEmpoisonne);
}
getMaladiesPoisons() {
return this.items.filter(item => item.type == 'maladie' || (item.type == 'poison' && item.system.active));
}
_messageRecuperationMaladiePoisons(maladiesPoisons, message) {
if (maladiesPoisons.length > 0) {
const identifies = maladiesPoisons.filter(it => it.system.identifie);
@@ -1735,16 +1726,16 @@ export class RdDActor extends RdDBaseActorSang {
type: { allowed: [ROLL_TYPE_SORT], current: ROLL_TYPE_SORT }
};
const dialog = await RollDialog.create(rollData, {
callbacks: [roll => {
this.tmrApp?.restoreTMRAfterAction();
callbacks: [async roll => {
await this.tmrApp?.restoreTMRAfterAction();
if (roll.closeTMR) {
this.tmrApp?.close();
await this.tmrApp?.close();
this.tmrApp = undefined;
}
}],
onRollDone: RollDialog.onRollDoneClose,
onClose: () => {
this.tmrApp?.restoreTMRAfterAction();
onClose: async () => {
await this.tmrApp?.restoreTMRAfterAction();
}
});
this.tmrApp?.setTMRPendingAction(dialog);

View File

@@ -157,11 +157,9 @@ export class RdDBaseActorReve extends RdDBaseActor {
}
async $finDeRoundEmpoignade() {
const immobilisations = this.itemTypes[ITEM_TYPES.empoignade].filter(it => it.system.pointsemp >= 2 && it.system.empoigneurid == this.id);
immobilisations.forEach(emp => RdDEmpoignade.onImmobilisation(this,
game.actors.get(emp.system.empoigneid),
emp
))
await Promise.all(this.itemTypes[ITEM_TYPES.empoignade]
.filter(it => it.system.pointsemp >= 2 && it.system.empoigneurid == this.id)
.map(async it => await RdDEmpoignade.onImmobilisation(this, it)))
}
async setSonne(sonne = true) { }

View File

@@ -130,7 +130,7 @@ export class RdDBaseActorSang extends RdDBaseActorReve {
let result = {
sonne: false,
};
let perteEndurance = 0
let minValue = name == "vie" ? -this.getSConst() - 1 : 0;
result.newValue = Math.max(minValue, Math.min(compteur.value + inc, compteur.max));
@@ -145,16 +145,10 @@ export class RdDBaseActorSang extends RdDBaseActorReve {
if (inc > 0) { // le max d'endurance s'applique seulement à la récupération
result.newValue = Math.min(result.newValue, this._computeEnduranceMax())
}
const perte = compteur.value - result.newValue;
result.perte = perte;
if (perte > 1) {
// Peut-être sonné si 2 points d'endurance perdus d'un coup
foundry.utils.mergeObject(result, await this.jetEndurance(result.newValue));
} else if (inc > 0) {
await this.setSonne(false);
}
perteEndurance = compteur.value - result.newValue;
result.perte = perteEndurance
if (sante.fatigue && inc < 0) { // Each endurance lost -> fatigue lost
fatigue = perte;
fatigue = perteEndurance;
}
}
compteur.value = result.newValue;
@@ -163,6 +157,14 @@ export class RdDBaseActorSang extends RdDBaseActorReve {
sante.fatigue.value = Math.max(sante.fatigue.value + fatigue, this.getFatigueMin());
}
await this.update({ "system.sante": sante }, { render: true })
if (perteEndurance > 1) {
// Peut-être sonné si 2 points d'endurance perdus d'un coup
foundry.utils.mergeObject(result, await this.jetEndurance(result.newValue));
} else if (name == "endurance" && inc > 0) {
await this.setSonne(false);
}
if (this.isDead()) {
await this.setEffect(STATUSES.StatusComma, true);
}
@@ -181,28 +183,46 @@ export class RdDBaseActorSang extends RdDBaseActorReve {
}
async onCreateItem(item, options, id) {
switch (item.type) {
case ITEM_TYPES.blessure:
await this.changeBleedingState()
break
}
await this.changeItemEffects(item)
await super.onCreateItem(item, options, id)
}
async onUpdateItem(item, options, id) {
switch (item.type) {
case ITEM_TYPES.blessure:
await this.changeBleedingState()
break
}
await this.changeItemEffects(item);
await super.onUpdateItem(item, options, id)
}
async changeBleedingState() {
async onDeleteItem(item, options, id) {
await this.changeItemEffects(item);
await super.onDeleteItem(item, options, id)
}
async changeItemEffects(item) {
switch (item.type) {
case ITEM_TYPES.blessure:
await this.changeStateBleeding();
break;
case ITEM_TYPES.maladie:
case ITEM_TYPES.poison:
await this.changeStateMalade();
break;
}
}
async changeStateBleeding() {
const bleeding = this.itemTypes[ITEM_TYPES.blessure].find(it => it.isBleeding())
await this.setEffect(STATUSES.StatusBleeding, bleeding ? true : false)
}
async changeStateMalade() {
const maladiePoisons = this.getMaladiesPoisons()
await this.setEffect(STATUSES.StatusMalade, maladiePoisons.length > 0)
}
getMaladiesPoisons() {
return this.items.filter(it => [ITEM_TYPES.maladie, ITEM_TYPES.poison].includes(it.type))
}
/* -------------------------------------------- */
async ajouterBlessure(encaissement, attackerToken = undefined) {
if (encaissement.gravite < 0) return;

View File

@@ -279,14 +279,16 @@ export class RdDBaseActor extends Actor {
async removeEffects(filter = e => true) {
if (game.user.isGM) {
const effectsToRemove = this.getEffects(filter)
if (this.canRemoveEffect(effectsToRemove)) {
const ids = effectsToRemove.map(it => it.id)
const ids = this.getEffects(filter)
.filter(it => this.canRemoveEffects(it))
.map(it => it.id)
if (ids.length > 0) {
await this.deleteEmbeddedDocuments('ActiveEffect', ids)
}
}
}
canRemoveEffect(effect) {
canRemoveEffects(effect) {
if (effect.statuses.has(STATUSES.StatusSurEnc)) {
return !this.isSurenc()
}

View File

@@ -65,6 +65,7 @@ export const RDD_CONFIG = {
surenc: 'systems/foundryvtt-reve-de-dragon/assets/actions/surenc.svg',
magique: 'systems/foundryvtt-reve-de-dragon/assets/actions/magique.svg',
armebrisee: 'systems/foundryvtt-reve-de-dragon/assets/actions/arme-brisee.svg',
malade: 'systems/foundryvtt-reve-de-dragon/assets/actions/malade.svg',
},
encaissement: {
mortel: 'mortel',

View File

@@ -68,7 +68,7 @@ export class RdDRencontre extends RdDItem {
}
static async appliquer(codes, tmrDialog, rencData) {
for(const effet of RdDRencontre.mapEffets(codes)){
for(let effet of RdDRencontre.mapEffets(codes)){
await effet.method(tmrDialog, rencData);
}
}

View File

@@ -105,7 +105,7 @@ export class RdDCombatManager extends Combat {
}
else if (!combatant.actor.isActorCombat()) {
if (options.warning) {
ui.notifications.warn(`${combatant.name} ne peut pas combattre!`)
ui.notifications.warn(`L'acteur ${combatant.name} ne peut pas combattre!`)
}
return undefined
}

View File

@@ -127,7 +127,7 @@ export class RdDCommands {
<br><strong>/rdd 15 -2</strong> effectue un jet 15 à -2
<br><strong>/rdd 15 0 s</strong> effectue un jet 15 à 0, avec significative requise
<br><strong>/rdd Vue Vigilance -2</strong> effectue un jet de Vue/Vigilance à -2 pour les tokens sélectionnés
<br><strong>/rdd vol déser +2</strong> effectue un jet de Volonté/Survie en désert à +2 pour les tokens sélectionnés
<br><strong>/rdd vol déser +2</strong> effectue un jet de Volonté/Survie en Désert à +2 pour les tokens sélectionnés
`
});
this.registerCommand({
@@ -137,7 +137,7 @@ export class RdDCommands {
<br><strong>/jet Vue</strong> poste une demande de jet de VUE à 0
<br><strong>/jet Vue -2</strong> poste une demande de jet de VUE à -2
<br><strong>/jet Vue Vigilance -2</strong> poste une demande de jet de VUE / Vigilance à -2
<br><strong>/jet vol déser +2</strong> poste une demande de jet de VOLONTÉ / Survie en désert à +2
<br><strong>/jet vol déser +2</strong> poste une demande de jet de VOLONTÉ / Survie en Désert à +2
`
});
this.registerCommand({ path: ["/ddr"], func: (content, msg, params) => this.rollDeDraconique(msg), descr: "Lance un Dé Draconique" });

View File

@@ -21,14 +21,21 @@ export class RdDEmpoignade {
}
static async ajustementEmpoignade(attacker, defender, adjust = 1) {
const empoignade = RdDEmpoignade.getEmpoignade(attacker, defender)
const empId = empoignade?.system.empoignadeid ?? foundry.utils.randomID(16)
let empoignade = RdDEmpoignade.getEmpoignade(attacker, defender)
if (empoignade?.system.empoigneurid == defender.id) {
let empoignade = RdDEmpoignade.getEmpoignade(defender, attacker)
return await RdDEmpoignade.$ajustementEmpoignade(empoignade, defender, attacker, - adjust);
}
return await RdDEmpoignade.$ajustementEmpoignade(empoignade, attacker, defender, adjust);
}
static async $ajustementEmpoignade(empoignade, attacker, defender, adjust) {
const empId = empoignade?.system.empoignadeid ?? foundry.utils.randomID(16);
const empFin = (empoignade?.system.pointsemp ?? 0) + adjust
if (empoignade) {
if (empoignade.system.empoigneurid == defender.id) {
adjust = - adjust
}
empoignade.system.pointsemp += adjust
await RdDEmpoignade.$updateEtatEmpoignade(empoignade, attacker, defender)
empoignade.system.pointsemp = empFin;
await RdDEmpoignade.$updateEtatEmpoignade(empoignade, attacker, defender);
}
else {
await RdDEmpoignade.$createEtatEmpoignade({
@@ -39,24 +46,26 @@ export class RdDEmpoignade {
empoignadeid: empId,
empoigneurid: attacker.id,
empoigneid: defender.id,
pointsemp: adjust,
pointsemp: empFin,
empoigneurname: attacker.name,
empoignename: defender.name
}
}, attacker, defender)
}, attacker, defender);
}
if (adjust != 0 && empFin == 2) {
await RdDEmpoignade.proposerEntrainerAuSol(attacker, defender, empoignade);
}
const result = RdDEmpoignade.getEmpoignadeById(defender, empId);
const defGrappled = result.system.pointsemp == (result.system.empoigneid == defender.id ? 2 : -2)
const attGrappled = result.system.pointsemp == (result.system.empoigneurid == attacker.id ? -2 : 2)
const grappling = Math.abs(result.system.pointsemp) > 0
await defender.setEffect(STATUSES.StatusGrappling, grappling && !defGrappled)
await attacker.setEffect(STATUSES.StatusGrappling, grappling && !attGrappled)
await defender.setEffect(STATUSES.StatusGrappled, defGrappled)
await attacker.setEffect(STATUSES.StatusGrappled, attGrappled)
const defGrappled = result.system.pointsemp == (result.system.empoigneid == defender.id ? 2 : -2);
const attGrappled = result.system.pointsemp == (result.system.empoigneurid == attacker.id ? -2 : 2);
const grappling = Math.abs(result.system.pointsemp) > 0;
await defender.setEffect(STATUSES.StatusGrappling, grappling && !defGrappled);
await attacker.setEffect(STATUSES.StatusGrappling, grappling && !attGrappled);
await defender.setEffect(STATUSES.StatusGrappled, defGrappled);
await attacker.setEffect(STATUSES.StatusGrappled, attGrappled);
return result
}
/* -------------------------------------------- */
static registerChatCallbacks(html) {
$(html).on("click", '.defense-empoignade-cac', event => {
@@ -93,7 +102,7 @@ export class RdDEmpoignade {
const rollData = RdDEmpoignade.$readRollEmpoignade(chatMessage);
if (event.currentTarget.value && event.currentTarget.value != "none") {
RdDEmpoignade.perteEndurance(rollData, event.currentTarget.value)
ChatUtility.removeChatMessageId(chatMessage.id)
//ChatUtility.removeChatMessageId(chatMessage.id)
}
});
}
@@ -138,8 +147,7 @@ export class RdDEmpoignade {
/* -------------------------------------------- */
static getEmpoignadeById(actor, id) {
let emp = actor.itemTypes[ITEM_TYPES.empoignade].find(it => it.system.empoignadeid == id)
return emp && foundry.utils.duplicate(emp) || undefined;
return actor.itemTypes[ITEM_TYPES.empoignade].find(it => it.system.empoignadeid == id)
}
/* -------------------------------------------- */
@@ -233,12 +241,24 @@ export class RdDEmpoignade {
MappingCreatureArme.setRollDataCreature(rollData)
}
if (empoignade.system.pointsemp >= 2) {
if (!empoignade.system.ausol) {
let msg = await RdDRollResult.displayRollData(rollData, attacker, 'chat-empoignade-entrainer.hbs');
RdDEmpoignade.$storeRollEmpoignade(msg, rollData);
}
await RdDEmpoignade.proposerEntrainerAuSol(attacker, defender, empoignade)
} else {
await RdDEmpoignade.$rollAttaqueEmpoignade(attacker, rollData, isNouvelle);
await RdDEmpoignade.$rollAttaqueEmpoignade(attacker, rollData, isNouvelle)
}
}
static async proposerEntrainerAuSol(attacker, defender, empoignade) {
if (!empoignade.system.ausol) {
const mode = (empoignade && empoignade.system.empoigneurid == attacker.id) ? "empoigner" : "liberer"
const rollData = {
mode, empoignade, attacker, defender,
isEmpoignade: true,
competence: attacker.getCompetenceCorpsACorps(),
selectedCarac: attacker.system.carac.melee,
malusTaille: RdDEmpoignade.getMalusTaille(empoignade, attacker, defender)
}
const msg = await RdDRollResult.displayRollData(rollData, attacker, 'chat-empoignade-entrainer.hbs');
RdDEmpoignade.$storeRollEmpoignade(msg, rollData);
}
}
@@ -249,7 +269,14 @@ export class RdDEmpoignade {
await this.onAttaqueEmpoignadeValidee(attacker, defender)
}
static async onImmobilisation(attacker, defender, empoignade) {
static async onImmobilisation(attacker, empoignade) {
const defender = game.actors.get(empoignade.system.empoigneid)
const empDefenseur = defender.itemTypes[ITEM_TYPES.empoignade]
.find(it => it.system.empoignadeid == empoignade.system.empoignadeid);
await defender.updateEmbeddedDocuments('Item', [{
_id: empDefenseur.id,
'system.immobilise': true
}])
const rollData = {
mode: "immobilise",
empoignade, attacker, defender,
@@ -372,29 +399,35 @@ export class RdDEmpoignade {
/* -------------------------------------------- */
static async $updateEtatEmpoignade(empoignade, attacker, defender) {
console.log("UPDATE Empoignade", empoignade)
const belligerants = [
attacker ?? game.actors.get(empoignade.system.empoigneurid),
defender ?? game.actors.get(empoignade.system.empoigneid)]
const removeEmp = empoignade.system.pointsemp == 0
await Promise.all(
belligerants.map(async belligerant => {
const emp = RdDEmpoignade.getEmpoignadeById(belligerant, empoignade.system.empoignadeid)
return await belligerant.updateEmbeddedDocuments('Item', [{
_id: emp._id,
"system.pointsemp": empoignade.system.pointsemp,
"system.ausol": empoignade.system.ausol
}])
}))
if (removeEmp) {
const emp = RdDEmpoignade.getEmpoignadeById(attacker, empoignade.system.empoignadeid)
return await attacker.deleteEmbeddedDocuments('Item', [emp.id])
}
else {
await Promise.all(
belligerants.map(async belligerant => {
const emp = RdDEmpoignade.getEmpoignadeById(belligerant, empoignade.system.empoignadeid)
return await belligerant.updateEmbeddedDocuments('Item', [{
_id: emp.id,
"system.pointsemp": empoignade.system.pointsemp,
"system.ausol": empoignade.system.ausol
}])
}))
}
}
/* -------------------------------------------- */
static async $deleteEmpoignade(empoignade) {
console.log("DELETE Empoignade", empoignade)
let defender = game.actors.get(empoignade.system.empoigneid)
let emp = RdDEmpoignade.getEmpoignadeById(defender, empoignade.system.empoignadeid)
await defender.deleteEmbeddedDocuments('Item', [emp._id])
const defender = game.actors.get(empoignade.system.empoigneid)
const emp = RdDEmpoignade.getEmpoignadeById(defender, empoignade.system.empoignadeid)
await defender.deleteEmbeddedDocuments('Item', [emp.id])
}
/* -------------------------------------------- */
@@ -436,29 +469,28 @@ export class RdDEmpoignade {
static async perteEndurance(rollData, perteMode) {
let attacker = game.actors.get(rollData.attacker.id)
let defender = game.actors.get(rollData.defender.id)
if (!RdDEmpoignade.isActionAutorisee("immobilise", attacker, defender)) {
if (perteMode == "none" || !RdDEmpoignade.isActionAutorisee("immobilise", attacker, defender)) {
return
}
let empoignade = RdDEmpoignade.getEmpoignade(attacker, defender)
//console.log("Perte d'endurance :!!!", perteMode)
let endValue = defender.system.sante.endurance.value
if (perteMode == "end0") {
await defender.santeIncDec("endurance", -endValue);
}
if (perteMode == "end1") {
await defender.santeIncDec("endurance", -(endValue - 1));
}
if (perteMode == "endmoitie") {
await defender.santeIncDec("endurance", -Math.floor(endValue / 2));
}
if (perteMode == "endquart") {
await defender.santeIncDec("endurance", -(3 * Math.floor(endValue / 4)));
}
let msg = await RdDRollResult.displayRollData(rollData, attacker, 'chat-empoignade-perte-endurance.hbs');
RdDEmpoignade.$storeRollEmpoignade(msg, rollData);
const perteEndurance = await RdDEmpoignade.$calcPerteEnd(perteMode, defender.system.sante.endurance.value)
await defender.santeIncDec("endurance", -perteEndurance)
await RdDRollResult.displayRollData({ attacker, defender, perteEndurance },
attacker,
'chat-empoignade-perte-endurance.hbs')
}
static async $calcPerteEnd(perteMode, endValue) {
switch (perteMode) {
case "none": return 0
case "end0": return endValue
case "end1": return (endValue - 1)
case "3/4": return Math.floor(3 * endValue / 4)
case "1/2": return Math.floor(endValue / 2)
case "1/4": return Math.floor(endValue / 4)
}
const rolled = await (new Roll(perteMode).evaluate())
return rolled.total
}
/* -------------------------------------------- */
static async deleteAllEmpoignades() {
for (let actor of game.actors) {
@@ -473,7 +505,7 @@ export class RdDEmpoignade {
let actor = game.actors.get(actorDeleteId)
let emp = this.getEmpoignadeById(actor, empoignade.system.empoignadeid)
if (emp) {
await actor.deleteEmbeddedDocuments('Item', [emp._id])
await actor.deleteEmbeddedDocuments('Item', [emp.id])
}
}

View File

@@ -1,5 +1,6 @@
import { Grammar } from "../grammar.js"
import { ReglesOptionnelles } from "../settings/regles-optionnelles.js"
import { ROLL_TYPE_SORT } from "./roll-constants.mjs"
import { RollPartCheckbox } from "./roll-part-checkbox.mjs"
export const PART_ASTROLOGIQUE = "astrologique"
@@ -15,7 +16,7 @@ export class RollPartAstrologique extends RollPartCheckbox {
}
isLancementRituel(rollData) {
return false
return rollData.type.current == ROLL_TYPE_SORT && rollData.current.sort?.sort?.system.isrituel
}
isJetChance(rollData) {

View File

@@ -16,6 +16,7 @@ export const STATUSES = {
StatusDemiReve: 'demi-reve',
StatusSurEnc: 'sur-encombrement',
StatusForceWeak: 'force insuffisante',
StatusMalade: 'malade',
}
export const forceWeakStatusEffect = { rdd: true, id: STATUSES.StatusForceWeak, name: 'EFFECT.StatusForceWeak', img: RDD_CONFIG.icons.forceWeak };
@@ -35,11 +36,12 @@ const rddStatusEffects = [
{ rdd: true, id: STATUSES.StatusComma, name: 'EFFECT.StatusComma', img: 'icons/svg/skull.svg' },
{ rdd: true, id: STATUSES.StatusBleeding, name: 'EFFECT.StatusBleeding', img: 'icons/svg/blood.svg' },
{ rdd: true, id: STATUSES.StatusMalade, name: 'EFFECT.StatusMalade', img: RDD_CONFIG.icons.malade },
{ rdd: true, id: STATUSES.StatusDead, name: 'EFFECT.StatusDead', img: 'icons/svg/skull.svg' },
surEncEffect,
demiReveStatusEffect,
forceWeakStatusEffect,
surEncEffect,
];
]
const statusDemiSurprise = new Set([STATUSES.StatusStunned, STATUSES.StatusProne, STATUSES.StatusRestrained, STATUSES.StatusForceWeak])
const statusSurpriseTotale = new Set([STATUSES.StatusUnconscious, STATUSES.StatusBlind, STATUSES.StatusComma])
@@ -73,7 +75,6 @@ export class StatusEffects extends FormApplication {
CONFIG.RDD.allEffects = rddStatusEffects.concat(CONFIG.statusEffects.filter(it => !rddEffectIds.includes(it.id)))
StatusEffects._setUseStatusEffects(StatusEffects._getUseStatusEffects());
console.log('statusEffects', CONFIG.statusEffects);
}
static isSurprise(effect) {

View File

@@ -1,3 +1,4 @@
import { RollBasicParts } from "../roll/roll-basic-parts.mjs"
const ACTOR_EMBEDDED_DOCTYPES = ['Item', 'ActiveEffect']
/**
@@ -62,14 +63,16 @@ export class ActorImpacts {
addDelta(document, path, value) {
ActorImpacts.$checkDocType(document)
const intValue = Number.parseInt(value)
if (Number.isInteger(intValue) && intValue != 0) {
const delta = [path, intValue]
const existing = this[docType].updates.find(it => it.id == document.id)
if (existing) {
existing.deltas.push(delta)
}
else {
this[docType].updates.push({ id: document.id, updates: [], deltas: [delta] })
if (Number.isInteger(intValue)) {
if (intValue != 0){
const delta = [path, intValue]
const existing = this[docType].updates.find(it => it.id == document.id)
if (existing) {
existing.deltas.push(delta)
}
else {
this[docType].updates.push({ id: document.id, updates: [], deltas: [delta] })
}
}
}
else {
@@ -96,7 +99,9 @@ export class ActorImpacts {
async applyImpacts() {
const actor = this.actorToken.actor
await Promise.all(ACTOR_EMBEDDED_DOCTYPES.map(async docType => await this.$applyDocumentsImpacts(actor, docType)))
for (let docType of ACTOR_EMBEDDED_DOCTYPES) {
await this.$applyDocumentsImpacts(actor, docType)
}
const updates = ActorImpacts.$computeUpdates(this, id => actor)
await actor.update(updates, { render: true })
}
@@ -122,8 +127,8 @@ export class ActorImpacts {
}
}
findCreatedId(docType, origId){
return this[docType].creates.find(it => it.id = origId)?.createdId
findCreatedId(docType, origId) {
return this[docType].creates.find(it => it.id = origId)?.createdId
}
$getEmbeddedDocument(docType, id) {

View File

@@ -1604,7 +1604,7 @@ items:
coreVersion: '12.331'
_key: '!actors.items!ryUZTa17LzNv25UY.oHnSnCw1RAW5t15S'
- _id: vDOAyWc2YnuhNnFF
name: Survie en désert
name: Survie en Désert
type: competence
sort: 5400000
flags: {}

View File

@@ -1604,7 +1604,7 @@ items:
coreVersion: '12.331'
_key: '!actors.items!ohmz9Jn4jxD88Kll.oHnSnCw1RAW5t15S'
- _id: vDOAyWc2YnuhNnFF
name: Survie en désert
name: Survie en Désert
type: competence
sort: 5400000
flags: {}

View File

@@ -1604,7 +1604,7 @@ items:
coreVersion: '12.331'
_key: '!actors.items!JARnWt2MQWDyRwQt.oHnSnCw1RAW5t15S'
- _id: vDOAyWc2YnuhNnFF
name: Survie en désert
name: Survie en Désert
type: competence
sort: 5400000
flags: {}

View File

@@ -1551,7 +1551,7 @@ items:
coreVersion: '12.331'
_key: '!actors.items!SJb0c8FDcYdd41rB.oHnSnCw1RAW5t15S'
- _id: vDOAyWc2YnuhNnFF
name: Survie en désert
name: Survie en Désert
type: competence
sort: 5400000
img: systems/foundryvtt-reve-de-dragon/icons/competence_survie_desert.webp

View File

@@ -1604,7 +1604,7 @@ items:
coreVersion: '12.331'
_key: '!actors.items!JQCwAOK64Yijwtch.oHnSnCw1RAW5t15S'
- _id: vDOAyWc2YnuhNnFF
name: Survie en désert
name: Survie en Désert
type: competence
sort: 5400000
flags: {}

View File

@@ -1604,7 +1604,7 @@ items:
coreVersion: '12.331'
_key: '!actors.items!CRRP8ucJpljX6tq8.oHnSnCw1RAW5t15S'
- _id: vDOAyWc2YnuhNnFF
name: Survie en désert
name: Survie en Désert
type: competence
sort: 5400000
flags: {}

View File

@@ -1604,7 +1604,7 @@ items:
coreVersion: '12.331'
_key: '!actors.items!51vL4MhEE0asjgF2.oHnSnCw1RAW5t15S'
- _id: vDOAyWc2YnuhNnFF
name: Survie en désert
name: Survie en Désert
type: competence
sort: 5400000
flags: {}

View File

@@ -1604,7 +1604,7 @@ items:
coreVersion: '12.331'
_key: '!actors.items!NX1nAqKKIcQlyGua.oHnSnCw1RAW5t15S'
- _id: vDOAyWc2YnuhNnFF
name: Survie en désert
name: Survie en Désert
type: competence
sort: 5400000
flags: {}

View File

@@ -1604,7 +1604,7 @@ items:
coreVersion: '12.331'
_key: '!actors.items!2bRaEDuwZezKAyEq.oHnSnCw1RAW5t15S'
- _id: vDOAyWc2YnuhNnFF
name: Survie en désert
name: Survie en Désert
type: competence
sort: 5400000
flags: {}

View File

@@ -1604,7 +1604,7 @@ items:
coreVersion: '12.331'
_key: '!actors.items!IeKSXignUpfUTU4m.oHnSnCw1RAW5t15S'
- _id: vDOAyWc2YnuhNnFF
name: Survie en désert
name: Survie en Désert
type: competence
sort: 5400000
flags: {}

View File

@@ -1552,7 +1552,7 @@ items:
coreVersion: '12.331'
_key: '!actors.items!pSM0ku0RJNLvHSvF.oHnSnCw1RAW5t15S'
- _id: vDOAyWc2YnuhNnFF
name: Survie en désert
name: Survie en Désert
type: competence
sort: 5400000
img: systems/foundryvtt-reve-de-dragon/icons/competence_survie_desert.webp

View File

@@ -1552,7 +1552,7 @@ items:
coreVersion: '12.331'
_key: '!actors.items!5xPFHgrY5AIP9Mnb.oHnSnCw1RAW5t15S'
- _id: vDOAyWc2YnuhNnFF
name: Survie en désert
name: Survie en Désert
type: competence
sort: 5400000
img: systems/foundryvtt-reve-de-dragon/icons/competence_survie_desert.webp

View File

@@ -1604,7 +1604,7 @@ items:
coreVersion: '12.331'
_key: '!actors.items!U9NNcXQBJmsI9Ttk.oHnSnCw1RAW5t15S'
- _id: vDOAyWc2YnuhNnFF
name: Survie en désert
name: Survie en Désert
type: competence
sort: 5400000
flags: {}

View File

@@ -1551,7 +1551,7 @@ items:
coreVersion: '12.331'
_key: '!actors.items!oLDROOdwfctyRusH.oHnSnCw1RAW5t15S'
- _id: vDOAyWc2YnuhNnFF
name: Survie en désert
name: Survie en Désert
type: competence
sort: 5400000
img: systems/foundryvtt-reve-de-dragon/icons/competence_survie_desert.webp

View File

@@ -1551,7 +1551,7 @@ items:
coreVersion: '12.331'
_key: '!actors.items!2KN3nKGZ36Qkn7Mf.oHnSnCw1RAW5t15S'
- _id: vDOAyWc2YnuhNnFF
name: Survie en désert
name: Survie en Désert
type: competence
sort: 5400000
img: systems/foundryvtt-reve-de-dragon/icons/competence_survie_desert.webp

View File

@@ -1605,7 +1605,7 @@ items:
coreVersion: '12.331'
_key: '!actors.items!V2WOs8deCYdBT2Jo.oHnSnCw1RAW5t15S'
- _id: vDOAyWc2YnuhNnFF
name: Survie en désert
name: Survie en Désert
type: competence
sort: 5400000
flags: {}

View File

@@ -1605,7 +1605,7 @@ items:
coreVersion: '12.331'
_key: '!actors.items!UNs4RBLYiGbfxd1c.oHnSnCw1RAW5t15S'
- _id: vDOAyWc2YnuhNnFF
name: Survie en désert
name: Survie en Désert
type: competence
sort: 5400000
flags: {}

View File

@@ -1605,7 +1605,7 @@ items:
coreVersion: '12.331'
_key: '!actors.items!jfXs7qaHEWQpIHud.oHnSnCw1RAW5t15S'
- _id: vDOAyWc2YnuhNnFF
name: Survie en désert
name: Survie en Désert
type: competence
sort: 5400000
flags: {}

View File

@@ -1604,7 +1604,7 @@ items:
coreVersion: '12.331'
_key: '!actors.items!awZg7bGbTjEGRMiw.oHnSnCw1RAW5t15S'
- _id: vDOAyWc2YnuhNnFF
name: Survie en désert
name: Survie en Désert
type: competence
sort: 5400000
flags: {}

View File

@@ -1604,7 +1604,7 @@ items:
coreVersion: '12.331'
_key: '!actors.items!dMdBctaRRdGJgced.oHnSnCw1RAW5t15S'
- _id: vDOAyWc2YnuhNnFF
name: Survie en désert
name: Survie en Désert
type: competence
sort: 5400000
flags: {}

View File

@@ -1,4 +1,4 @@
name: Survie en désert
name: Survie en Désert
type: competence
img: systems/foundryvtt-reve-de-dragon/icons/competence_survie_desert.webp
_id: vDOAyWc2YnuhNnFF

View File

@@ -1551,7 +1551,7 @@ items:
coreVersion: '12.331'
_key: '!actors.items!qscItDC5z6Hr2Lrh.oHnSnCw1RAW5t15S'
- _id: vDOAyWc2YnuhNnFF
name: Survie en désert
name: Survie en Désert
type: competence
sort: 5400000
img: systems/foundryvtt-reve-de-dragon/icons/competence_survie_desert.webp

View File

@@ -1550,7 +1550,7 @@ items:
coreVersion: '12.331'
_key: '!actors.items!zACge7QxwyJkC6nD.oHnSnCw1RAW5t15S'
- _id: vDOAyWc2YnuhNnFF
name: Survie en désert
name: Survie en Désert
type: competence
sort: 5500000
img: systems/foundryvtt-reve-de-dragon/icons/competence_survie_desert.webp

View File

@@ -1551,7 +1551,7 @@ items:
coreVersion: '12.331'
_key: '!actors.items!esJWonwDGLFaMRK3.oHnSnCw1RAW5t15S'
- _id: vDOAyWc2YnuhNnFF
name: Survie en désert
name: Survie en Désert
type: competence
sort: 5400000
img: systems/foundryvtt-reve-de-dragon/icons/competence_survie_desert.webp

View File

@@ -1551,7 +1551,7 @@ items:
coreVersion: '12.331'
_key: '!actors.items!gscYFtwk73WrGvA5.oHnSnCw1RAW5t15S'
- _id: vDOAyWc2YnuhNnFF
name: Survie en désert
name: Survie en Désert
type: competence
sort: 5400000
img: systems/foundryvtt-reve-de-dragon/icons/competence_survie_desert.webp

View File

@@ -1551,7 +1551,7 @@ items:
coreVersion: '12.331'
_key: '!actors.items!dW4RMKpz2WaXbW3h.oHnSnCw1RAW5t15S'
- _id: vDOAyWc2YnuhNnFF
name: Survie en désert
name: Survie en Désert
type: competence
sort: 5400000
img: systems/foundryvtt-reve-de-dragon/icons/competence_survie_desert.webp

View File

@@ -1551,7 +1551,7 @@ items:
coreVersion: '12.331'
_key: '!actors.items!ncXFs8oaZWG68Tzn.oHnSnCw1RAW5t15S'
- _id: vDOAyWc2YnuhNnFF
name: Survie en désert
name: Survie en Désert
type: competence
sort: 5400000
img: systems/foundryvtt-reve-de-dragon/icons/competence_survie_desert.webp

View File

@@ -1551,7 +1551,7 @@ items:
coreVersion: '12.331'
_key: '!actors.items!OKMXH6YpPXUyvqzN.oHnSnCw1RAW5t15S'
- _id: vDOAyWc2YnuhNnFF
name: Survie en désert
name: Survie en Désert
type: competence
sort: 5400000
img: systems/foundryvtt-reve-de-dragon/icons/competence_survie_desert.webp

View File

@@ -1551,7 +1551,7 @@ items:
coreVersion: '12.331'
_key: '!actors.items!EzV1Zxuwi7jwa6bj.oHnSnCw1RAW5t15S'
- _id: vDOAyWc2YnuhNnFF
name: Survie en désert
name: Survie en Désert
type: competence
sort: 5400000
img: systems/foundryvtt-reve-de-dragon/icons/competence_survie_desert.webp

View File

@@ -1551,7 +1551,7 @@ items:
coreVersion: '12.331'
_key: '!actors.items!YQ6vavAVyZecPvGQ.oHnSnCw1RAW5t15S'
- _id: vDOAyWc2YnuhNnFF
name: Survie en désert
name: Survie en Désert
type: competence
sort: 5400000
img: systems/foundryvtt-reve-de-dragon/icons/competence_survie_desert.webp

View File

@@ -1551,7 +1551,7 @@ items:
coreVersion: '12.331'
_key: '!actors.items!b7ThiitioBVXxU7D.oHnSnCw1RAW5t15S'
- _id: vDOAyWc2YnuhNnFF
name: Survie en désert
name: Survie en Désert
type: competence
sort: 5400000
img: systems/foundryvtt-reve-de-dragon/icons/competence_survie_desert.webp

View File

@@ -1551,7 +1551,7 @@ items:
coreVersion: '12.331'
_key: '!actors.items!XnBXyRyE2BUVVT1k.oHnSnCw1RAW5t15S'
- _id: vDOAyWc2YnuhNnFF
name: Survie en désert
name: Survie en Désert
type: competence
sort: 5400000
img: systems/foundryvtt-reve-de-dragon/icons/competence_survie_desert.webp

View File

@@ -1551,7 +1551,7 @@ items:
coreVersion: '12.331'
_key: '!actors.items!kKI9izKrKftYVnvs.oHnSnCw1RAW5t15S'
- _id: vDOAyWc2YnuhNnFF
name: Survie en désert
name: Survie en Désert
type: competence
sort: 5400000
img: systems/foundryvtt-reve-de-dragon/icons/competence_survie_desert.webp

View File

@@ -1551,7 +1551,7 @@ items:
coreVersion: '12.331'
_key: '!actors.items!nzw2q9BHSDN6TIQQ.oHnSnCw1RAW5t15S'
- _id: vDOAyWc2YnuhNnFF
name: Survie en désert
name: Survie en Désert
type: competence
sort: 5400000
img: systems/foundryvtt-reve-de-dragon/icons/competence_survie_desert.webp

View File

@@ -1551,7 +1551,7 @@ items:
coreVersion: '12.331'
_key: '!actors.items!Pf4cLn0kandYzviD.oHnSnCw1RAW5t15S'
- _id: vDOAyWc2YnuhNnFF
name: Survie en désert
name: Survie en Désert
type: competence
sort: 5400000
img: systems/foundryvtt-reve-de-dragon/icons/competence_survie_desert.webp

View File

@@ -668,7 +668,7 @@ results:
- _id: ZhPRAyUuEYcG9X5z
flags: {}
type: pack
text: Survie en désert
text: Survie en Désert
img: systems/foundryvtt-reve-de-dragon/icons/competence_survie_desert.webp
weight: 1
range:

View File

@@ -1552,7 +1552,7 @@ items:
coreVersion: '12.331'
_key: '!actors.items!GJWEoGXy5kSd4sT8.oHnSnCw1RAW5t15S'
- _id: vDOAyWc2YnuhNnFF
name: Survie en désert
name: Survie en Désert
type: competence
sort: 5400000
img: systems/foundryvtt-reve-de-dragon/icons/competence_survie_desert.webp

View File

@@ -1552,7 +1552,7 @@ items:
coreVersion: '12.331'
_key: '!actors.items!m63oPEPvCrds4akp.oHnSnCw1RAW5t15S'
- _id: vDOAyWc2YnuhNnFF
name: Survie en désert
name: Survie en Désert
type: competence
sort: 5400000
img: systems/foundryvtt-reve-de-dragon/icons/competence_survie_desert.webp

View File

@@ -1552,7 +1552,7 @@ items:
coreVersion: '12.331'
_key: '!actors.items!jtJqqegMrF3fuND3.oHnSnCw1RAW5t15S'
- _id: vDOAyWc2YnuhNnFF
name: Survie en désert
name: Survie en Désert
type: competence
sort: 5400000
img: systems/foundryvtt-reve-de-dragon/icons/competence_survie_desert.webp

View File

@@ -1552,7 +1552,7 @@ items:
coreVersion: '12.331'
_key: '!actors.items!8Jeas59CdpnnYabL.oHnSnCw1RAW5t15S'
- _id: vDOAyWc2YnuhNnFF
name: Survie en désert
name: Survie en Désert
type: competence
sort: 5400000
img: systems/foundryvtt-reve-de-dragon/icons/competence_survie_desert.webp

View File

@@ -1552,7 +1552,7 @@ items:
coreVersion: '12.331'
_key: '!actors.items!7WgNJwO7p5QNraXA.oHnSnCw1RAW5t15S'
- _id: vDOAyWc2YnuhNnFF
name: Survie en désert
name: Survie en Désert
type: competence
sort: 5400000
img: systems/foundryvtt-reve-de-dragon/icons/competence_survie_desert.webp

View File

@@ -1551,7 +1551,7 @@ items:
coreVersion: '12.331'
_key: '!actors.items!N5ybrpVwbpL8aPG0.oHnSnCw1RAW5t15S'
- _id: vDOAyWc2YnuhNnFF
name: Survie en désert
name: Survie en Désert
type: competence
img: systems/foundryvtt-reve-de-dragon/icons/competence_survie_desert.webp
effects: []

View File

@@ -1551,7 +1551,7 @@ items:
coreVersion: '12.331'
_key: '!actors.items!X9d5McdSAT1Ivp39.oHnSnCw1RAW5t15S'
- _id: vDOAyWc2YnuhNnFF
name: Survie en désert
name: Survie en Désert
type: competence
img: systems/foundryvtt-reve-de-dragon/icons/competence_survie_desert.webp
effects: []

View File

@@ -1552,7 +1552,7 @@ items:
coreVersion: '12.331'
_key: '!actors.items!hvNej1XRliayVZu1.oHnSnCw1RAW5t15S'
- _id: vDOAyWc2YnuhNnFF
name: Survie en désert
name: Survie en Désert
type: competence
sort: 5400000
img: systems/foundryvtt-reve-de-dragon/icons/competence_survie_desert.webp

View File

@@ -1552,7 +1552,7 @@ items:
coreVersion: '12.331'
_key: '!actors.items!4bI9HX4oomMEXrOT.oHnSnCw1RAW5t15S'
- _id: vDOAyWc2YnuhNnFF
name: Survie en désert
name: Survie en Désert
type: competence
sort: 5400000
img: systems/foundryvtt-reve-de-dragon/icons/competence_survie_desert.webp

View File

@@ -1552,7 +1552,7 @@ items:
coreVersion: '12.331'
_key: '!actors.items!AZBxORb7IYgXaOfb.oHnSnCw1RAW5t15S'
- _id: vDOAyWc2YnuhNnFF
name: Survie en désert
name: Survie en Désert
type: competence
sort: 5400000
img: systems/foundryvtt-reve-de-dragon/icons/competence_survie_desert.webp

View File

@@ -1552,7 +1552,7 @@ items:
coreVersion: '12.331'
_key: '!actors.items!OOIjBdFjCKdgJKff.oHnSnCw1RAW5t15S'
- _id: vDOAyWc2YnuhNnFF
name: Survie en désert
name: Survie en Désert
type: competence
sort: 5400000
img: systems/foundryvtt-reve-de-dragon/icons/competence_survie_desert.webp

View File

@@ -1552,7 +1552,7 @@ items:
coreVersion: '12.331'
_key: '!actors.items!Jas7Wr22jSllfkin.oHnSnCw1RAW5t15S'
- _id: vDOAyWc2YnuhNnFF
name: Survie en désert
name: Survie en Désert
type: competence
sort: 5400000
img: systems/foundryvtt-reve-de-dragon/icons/competence_survie_desert.webp

View File

@@ -644,7 +644,8 @@
"pointsemp": 0,
"empoigneurname": "",
"empoignename": "",
"ausol": false
"ausol": false,
"immobilise": false
},
"possession": {
"templates": ["description"],
@@ -703,8 +704,7 @@
},
"remedesconnus": false,
"remedes": "",
"dommages": "",
"active": false
"dommages": ""
},
"arme": {
"templates": ["description", "equipement", "inventaire"],

View File

@@ -72,7 +72,7 @@
{{#if options.vueDetaillee}}
&nbsp;&nbsp;
{{#if @root.options.vueArchetype}}
<a class="competence-archetype toggle-archetype chat-card-button-pushed" data-tooltip="Retour à la vue détaillée des compétences">
<a class="competence-archetype toggle-archetype chat-card-button-checked" data-tooltip="Retour à la vue détaillée des compétences">
<i class="fa-solid fa-up-right-from-square"></i>Incarnation
</a>
{{else}}

View File

@@ -1,15 +1,18 @@
<h4><img class="chat-icon" src="{{competence.img}}" />
{{attacker.name}} a empoigné {{defender.name}}
</h4>
<hr>
<p>
<span class='chat-card-button-area'>
{{attacker.name}} vient d'obtenir 2 points d'Emp, et peut
entraîner {{defender.name}} au sol. Les deux protagonistes
restent empoignés.
<br>
<a class='empoignade-entrainer-sol chat-card-button'>
Entraîner au sol
</a>
</span>
</p>
<div class="roll-chat" data-passearme="{{passeArme}}">
<div class="chat-img">
<img src="{{active.img}}" data-tooltip="{{active.name}}" />
<img src="{{competence.img}}" data-tooltip="Empoignade" />
</div>
<div class="chat-header">
<h4>{{attacker.name}} a empoigné {{defender.name}}</h4>
</div>
<div class="chat-resume">
{{attacker.name}} vient d'obtenir 2 points d'empoignade contre {{defender.name}}, et
peut l'<strong>entraîner au sol</strong>. Les deux protagonistes resteront empoignés.
</div>
<div class="chat-actions">
<a class='chat-card-button empoignade-entrainer-sol'>Entraîner au sol</a>
</div>
</div>

View File

@@ -1,31 +1,44 @@
<h4><img class="chat-icon" src="{{competence.img}}" />
{{attacker.name}} a empoigné {{defender.name}}
</h4>
<hr>
<p>
<span class='chat-card-button-area'>
{{attacker.name}} a obtenu 2 points d'Emp à la fin du round précédent, et peut:
<ul><li>
faire perdre des points d'Endurance à {{defender.name}}
<br>
<a class='empoignade-perte-endurance chat-card-button'>
<select class='empoignade-perte-endurance'>
<option value="none">Faire perdre de l'endurance (selectionnez)</option>
<option value="end0">Endurance à 0</option>
<option value="end1">Endurance à 1</option>
<option value="endmoitie">La moitié de l'endurance</option>
<option value="endquart">Le quart de l'endurance</option>
</select>
</a>
{{#if empoignade.system.ausol}}
{{else}}
</li><li>
projeter {{defender.name}} au sol. Les deux protagonistes ne sont plus empoignés.
<br>
<a class='empoignade-projeter-sol chat-card-button'>
Projeter au sol
</a>
{{/if}}
</li></ul>
</span>
<div class="roll-chat" data-passearme="{{passeArme}}">
<div class="chat-img">
<img src="{{attacker.img}}" data-tooltip="{{attacker.name}}" />
<img src="{{competence.img}}" data-tooltip="Empoignade" />
</div>
<div class="chat-header">
<h4>{{attacker.name}} a empoigné {{defender.name}}</h4>
</div>
<div class="chat-resume">
{{attacker.name}} a 2 points d'empoignade contre {{defender.name}} à la fin du round,
et peut lui faire <strong>perdre des points d'endurance</strong>
{{#unless empoignade.system.ausol}}
ou le <strong>projeter au sol</strong>. Les deux protagonistes ne sont plus empoignés
{{/unless}}.
</div>
<div class="chat-details">
</div>
<div class="chat-actions">
<select class='chat-card-select empoignade-perte-endurance'>
<option value="none">Choisir la perte d'endurance:</option>
<option value="end0">Endurance à 0</option>
<option value="end1">Endurance à 1</option>
<option value="3/4">&frac34; de l'endurance</option>
<option value="1/2">&frac12; de l'endurance</option>
<option value="1/4">&frac14; de l'endurance</option>
<option value="1d4">1d4 d'endurance</option>
<option value="1d6">1d6 d'endurance</option>
<option value="2d6">2d6 d'endurance</option>
<option value="1">1 point d'endurance</option>
<option value="2">2 point d'endurance</option>
</select>
{{!-- <a class='chat-card-button empoignade-perte-endurance'>
</a> --}}
{{#unless empoignade.system.ausol}}
<a class='chat-card-button empoignade-projeter-sol'>
Projeter au sol
</a>
{{/unless}}
</div>
</p>

View File

@@ -1,7 +1,13 @@
<h4><img class="chat-icon" src="{{competence.img}}" />
{{attacker.name}} a fait perdre de l'endurance à {{defender.name}}
</h4>
<hr>
<p>
{{defender.name}} reste immobilisé. L'empoignade peut continuer.
</p>
<div class="roll-chat" >
<div class="chat-img">
<img src="{{attacker.img}}" data-tooltip="{{attacker.name}}" />
</div>
<div class="chat-header">
<h4>{{attacker.name}} a fait perdre {{perteEndurance}} points d'endurance à {{defender.name}}</h4>
</div>
<div class="chat-resume">
{{defender.name}} reste immobilisé. L'empoignade peut continuer.
</div>
</div>

View File

@@ -6,6 +6,10 @@
<label for="system.pointsemp">Points d'Empoignade </label>
<input class="attribute-value" type="text" name="system.pointsemp" value="{{system.pointsemp}}" data-dtype="Number"/>
</div>
<div class="form-group">
<label for="system.immobilise">Immobilisé </label>
<input type="checkbox" name="system.immobilise" {{#if system.immobilise}}checked{{/if}}/>
</div>
{{>"systems/foundryvtt-reve-de-dragon/templates/partial-item-description.hbs"}}
</section>
</form>

View File

@@ -65,7 +65,7 @@
{{/select}}
</select>
{{else}}
<label>>{{system.malus}}</label>
<label>{{system.malus}}</label>
{{/if}}
</div>

View File

@@ -12,14 +12,10 @@
{{!-- Sheet Body --}}
<section class="sheet-body">
<div class="form-group">
<label for="system.active">Actif ? </label>
<input class="attribute-value" type="checkbox" name="system.active" {{#if system.active}}checked{{/if}} {{#unless options.isGM}}disabled{{/unless}}/>
</div>
{{#if (or options.isGM system.identifie)}}
<div class="form-group">
<label for="system.identifie">Identifiée ? </label>
<input class="attribute-value" type="checkbox" name="system.identifie" {{#if system.identifie}}checked{{/if}}/>
<input class="attribute-value" type="checkbox" name="system.identifie" {{#if system.identifie}}checked{{/if}}/>
</div>
<div class="form-group">
<label for="system.malignite">Malignité </label>
@@ -47,7 +43,7 @@
</div>
{{/if}}
{{/if}}
{{#if (and options.isGM options.isOwned system.active)}}
{{#if (and options.isGM options.isOwned)}}
{{>"systems/foundryvtt-reve-de-dragon/templates/item/temporel.hbs" this labeldebut="Contracté" labelfin="Prochain jet"}}
{{/if}}

View File

@@ -61,7 +61,6 @@
<div class="chat-actions">
{{> 'partial-choix-maladresse'}}
{{> 'partial-attaque-particuliere'}}
{{!-- TODO: maladresses --}}
</div>
<div class="chat-buttons">

View File

@@ -1,4 +1,3 @@
{{log 'partial-encaissement' this}}
{{#if show.encaissement}}
{{#if done.encaissement}}
<span class='chat-card-info'>