Merge pull request 'Refouler des queues et supprimer des sorts en réserve' (#553) from VincentVk/foundryvtt-reve-de-dragon:v10 into v10

Reviewed-on: #553
This commit is contained in:
uberwald 2022-09-17 09:04:19 +02:00
commit 838d4381a4
11 changed files with 132 additions and 81 deletions

View File

@ -15,6 +15,7 @@ import { DialogSplitItem } from "./dialog-split-item.js";
import { ReglesOptionelles } from "./regles-optionelles.js";
import { DialogRepos } from "./dialog-repos.js";
import { RdDSheetUtility } from "./rdd-sheet-utility.js";
import { TMRUtility } from "./tmr-utility.js";
/* -------------------------------------------- */
export class RdDActorSheet extends ActorSheet {
@ -180,7 +181,21 @@ export class RdDActorSheet extends ActorSheet {
});
html.find('.item-delete').click(async event => {
const li = RdDSheetUtility.getEventElement(event);
RdDUtility.confirmerSuppression(this, li);
const item = this.actor.getObjet(li.data("item-id"));
RdDUtility.confirmerSuppressionItem(this, item, li);
});
html.find('.sort-reserve-delete').click(async event => {
const li = RdDSheetUtility.getEventElement(event);
const index = li.data('index');
const sortReserve = this.actor.system.reve.reserve.list[index];
RdDUtility.confirmerSuppression(this, li, {
supprimer: `le sort en réserve ${sortReserve.sort.name} en ${TMRUtility.getTMR(sortReserve.coord).label}`,
deleteLabel: "Supprimer le sort en réserve",
onDelete: () => {
console.log("Delete : ", sortReserve.name);
this.actor.deleteSortReserveKey(index);
}
});
});
html.find('.item-vendre').click(async event => {
const item = RdDSheetUtility.getItem(event, this.actor);
@ -197,7 +212,11 @@ export class RdDActorSheet extends ActorSheet {
});
html.find('.subacteur-delete').click(async event => {
const li = RdDSheetUtility.getEventElement(event);
RdDUtility.confirmerSuppressionSubacteur(this, li);
const actorId = li.data("actor-id");
if (actorId) {
const subActor = game.actors.get(actorId);
RdDUtility.confirmerSuppressionSubacteur(this, subActor, li);
}
});
html.find('.encaisser-direct').click(async event => {

View File

@ -104,7 +104,8 @@ export class RdDActorVehiculeSheet extends ActorSheet {
// Delete Inventory Item
html.find('.item-delete').click(async event => {
const li = RdDSheetUtility.getEventElement(event);
RdDUtility.confirmerSuppression(this, li);
const item = this.actor.getObjet(li.data("item-id"));
RdDUtility.confirmerSuppressionItem(this, item, li);
});
html.find('.item-vendre').click(async event => {
const item = RdDSheetUtility.getItem(event, this.actor);

View File

@ -432,6 +432,14 @@ export class RdDActor extends Actor {
}
}
async deleteSortReserveKey(index) {
let reserve = duplicate(this.system.reve.reserve);
if (index >= 0) {
reserve.list.splice(index, 1);
await this.update({ "system.reve.reserve": reserve }, { renderSheet: false });
}
}
/* -------------------------------------------- */
getSurprise(isCombat = undefined) {
let niveauSurprise = this.getActiveEffects()
@ -1424,6 +1432,15 @@ export class RdDActor extends Actor {
}
}
/* -------------------------------------------- */
async actionRefoulement(item) {
const refoulement = item?.system.refoulement ?? 0;
if (refoulement>0){
await this.ajouterRefoulement(refoulement);
await item.delete();
}
}
/* -------------------------------------------- */
async ajouterRefoulement(value = 1) {
let refoulement = this.system.reve.refoulement.value + value;
@ -1924,6 +1941,7 @@ export class RdDActor extends Actor {
}
return;
}
case 'queue': case 'ombre': return await this.actionRefoulement(item);
}
}
@ -3916,9 +3934,9 @@ export class RdDActor extends Actor {
let newVehicules = this.system.subacteurs.vehicules.filter(function (obj, index, arr) { return obj.id != actorId });
let newSuivants = this.system.subacteurs.suivants.filter(function (obj, index, arr) { return obj.id != actorId });
let newMontures = this.system.subacteurs.montures.filter(function (obj, index, arr) { return obj.id != actorId });
await this.update({ 'system.subacteurs.vehicules': newVehicules });
await this.update({ 'system.subacteurs.suivants': newSuivants });
await this.update({ 'system.subacteurs.montures': newMontures });
await this.update({ 'system.subacteurs.vehicules': newVehicules }, { renderSheet: false });
await this.update({ 'system.subacteurs.suivants': newSuivants }, { renderSheet: false });
await this.update({ 'system.subacteurs.montures': newMontures }, { renderSheet: false });
}
/* -------------------------------------------- */

View File

@ -197,7 +197,8 @@ export class RdDItemSheet extends ItemSheet {
});
html.find('.item-delete').click(async event => {
const li = RdDSheetUtility.getEventElement(event);
RdDUtility.confirmerSuppression(this, li);
const item = this.actor.getObjet(li.data("item-id"));
RdDUtility.confirmerSuppressionItem(this, item, li);
});
html.find('.item-vendre').click(async event => {
const item = RdDSheetUtility.getItem(event, this.actor);

View File

@ -145,24 +145,28 @@ export class RdDItem extends Item {
}
getActionPrincipale(options = { warnIfNot: true }) {
if (!this.isConteneur() && (this.system.quantite ?? 0) <= 0) {
if (options.warnIfNot) {
const warn = options.warnIfNot;
switch (this.type) {
case 'nourritureboisson': return this._actionOrWarnQuantiteZero(this.boisson ? 'Boire' : 'Manger', warn);
case 'potion': return this._actionOrWarnQuantiteZero('Boire', warn);
case 'livre': return this._actionOrWarnQuantiteZero('Lire', warn);
case 'conteneur': return this._actionOrWarnQuantiteZero('Ouvrir', warn);
case 'herbe': return this.isHerbeAPotion() ? this._actionOrWarnQuantiteZero('Décoction', warn) : undefined;
case 'queue': case 'ombre': return this.system.refoulement>0 ? 'Refouler' : undefined;
}
return undefined;
}
_actionOrWarnQuantiteZero(actionName, warn){
if ((this.system.quantite ?? 0) <= 0) {
if (warn) {
ui.notifications.warn(`Vous n'avez plus de ${this.name}.`);
}
return undefined;
}
switch (this.type) {
case 'nourritureboisson': return this.boisson ? 'Boire' : 'Manger';
case 'potion': return 'Boire';
case 'livre': return 'Lire';
case 'conteneur': return 'Ouvrir';
else {
return actionName;
}
if (this.isHerbeAPotion()) { return 'Décoction'; }
if (options.warnIfNot) {
ui.notifications.warn(`Impossible d'utiliser un ${this.name}, aucune action associée définie.`);
}
return undefined;
}
async diminuerQuantite(nombre, options = { diminuerQuantite: true, supprimerSiZero: false }) {

View File

@ -121,8 +121,10 @@ export class RdDUtility {
'systems/foundryvtt-reve-de-dragon/templates/actor-sheet-oeuvre-partial.html',
'systems/foundryvtt-reve-de-dragon/templates/actor-liste-blessures-partial.html',
'systems/foundryvtt-reve-de-dragon/templates/actor-blessure-partial.html',
'systems/foundryvtt-reve-de-dragon/templates/actor-sheet-queues.html',
// Conteneur/item in Actor sheet
'systems/foundryvtt-reve-de-dragon/templates/actor-sheet-inventaire.html',
'systems/foundryvtt-reve-de-dragon/templates/actor-sheet-item-queue.html',
'systems/foundryvtt-reve-de-dragon/templates/actor-sheet-inventaire-item.html',
"systems/foundryvtt-reve-de-dragon/templates/actor-sheet-inventaire-monnaie.html",
'systems/foundryvtt-reve-de-dragon/templates/actor-sheet-liens-animaux.html',
@ -829,21 +831,17 @@ export class RdDUtility {
}
/* -------------------------------------------- */
static confirmerSuppressionSubacteur(actorSheet, li) {
let actorId = li.data("actor-id");
let actor = game.actors.get(actorId);
let msgTxt = "<p>Etes vous certain de vouloir supprimer le lien vers ce véhicule/monture/suivant : " + actor.name + " ?</p>";
let d = new Dialog({
title: "Confirmer la suppression du lien",
content: msgTxt,
static confirmerSuppression(sheet, htmlToDelete, options) {
const d = new Dialog({
title: options.title ?? 'Confirmer la suppression',
content: `<p>Etes vous certain de vouloir supprimer ${options.supprimer ?? 'cet objet'} ?</p>`,
buttons: {
delete: {
icon: '<i class="fas fa-check"></i>',
label: "Supprimer le lien",
label: options.deleteLabel ?? 'Supprimer',
callback: () => {
console.log("Delete : ", actorId);
actorSheet.actor.removeSubacteur(actorId);
li.slideUp(200, () => actorSheet.render(false));
options.onDelete();
RdDUtility.slideOnDelete(sheet, htmlToDelete);
}
},
cancel: {
@ -857,11 +855,21 @@ export class RdDUtility {
}
/* -------------------------------------------- */
static async confirmerSuppression(actorSheet, li) {
let itemId = li.data("item-id");
let objet = actorSheet.actor.getObjet(itemId);
static confirmerSuppressionSubacteur(sheet, subActor, htmlToDelete) {
RdDUtility.confirmerSuppression(sheet, htmlToDelete,{
supprimer: "le lien vers le véhicule/monture/suivant : " + subActor.name,
deleteLabel: "Supprimer le lien",
onDelete: () => {
console.log("Delete : ", subActor.id);
sheet.actor.removeSubacteur(subActor.id);
}
})
}
if (Monnaie.isSystemMonnaie(objet, actorSheet.actor.items)) {
/* -------------------------------------------- */
static async confirmerSuppressionItem(sheet, item, htmlToDelete) {
const itemId = item.id;
if (Monnaie.isSystemMonnaie(item, sheet.actor.items)) {
ui.notifications.warn("Suppression des monnaies de base impossible");
return;
}
@ -873,8 +881,8 @@ export class RdDUtility {
label: "Supprimer l'objet",
callback: () => {
console.log("Delete : ", itemId);
actorSheet.actor.deleteEmbeddedDocuments('Item', [itemId]);
li.slideUp(200, () => actorSheet.render(false));
sheet.actor.deleteEmbeddedDocuments('Item', [itemId]);
RdDUtility.slideOnDelete(sheet, htmlToDelete);
}
},
cancel: {
@ -882,15 +890,15 @@ export class RdDUtility {
label: "Annuler"
}
}
if (objet.type == 'conteneur' && objet.system.contenu.length > 0) {
if (item.type == 'conteneur' && item.system.contenu.length > 0) {
msgTxt += "<br>Ce conteneur n'est pas vide. Choisissez l'option de suppression";
buttons['deleteall'] = {
icon: '<i class="fas fa-check"></i>',
label: "Supprimer le conteneur et tout son contenu",
callback: () => {
console.log("Delete : ", itemId);
actorSheet.actor.deleteAllConteneur(itemId);
li.slideUp(200, () => actorSheet.render(false));
sheet.actor.deleteAllConteneur(itemId);
RdDUtility.slideOnDelete(sheet, htmlToDelete);
}
}
}
@ -904,6 +912,10 @@ export class RdDUtility {
d.render(true);
}
static slideOnDelete(sheet, htmlToDelete) {
return htmlToDelete.slideUp(200, () => sheet.render(false));
}
/* -------------------------------------------- */
static afficherHeuresChanceMalchance(heureNaissance) {
if (game.user.isGM) {

View File

@ -0,0 +1,9 @@
<li class="item flexrow" data-attribute={{key}} data-item-id="{{queue._id}}">
<span class="display-label flex-grow"><a>{{queue.name}}</a></span>
<div class="item-controls">
<a class="item-delete" title="Delete Item"><i class="fas fa-trash"></i></a>
{{#if queue.system.refoulement}}
<a class="item-action">Refouler</a>
{{/if}}
</div>
</li>

View File

@ -0,0 +1,15 @@
{{#if (or queues.length ombres.length)}}
<h3>
{{#if queues.length}}Queues de Dragon{{/if}}
{{#if (and queues.length ombres.length)}} et {{/if}}
{{#if ombres.length}}Ombres de Thanatos{{/if}}
:</h3>
<ul class="flex-group-left">
{{#each queues as |queue key|}}
{{> "systems/foundryvtt-reve-de-dragon/templates/actor-sheet-item-queue.html" queue=queue key=key}}
{{/each}}
{{#each ombres as |ombre key|}}
{{> "systems/foundryvtt-reve-de-dragon/templates/actor-sheet-item-queue.html" queue=ombre key=key}}
{{/each}}
</ul>
{{/if}}

View File

@ -510,32 +510,7 @@
</div>
<hr>
{{!-- Queues, Souffles, Tetes, Ombre --}}
{{#if queues.length}}
<h3>Queues:</h3>
<ul class="flex-group-left">
{{#each queues as |queue key|}}
<li class="item flexrow" data-attribute={{key}} data-item-id="{{queue._id}}">
<span class="display-label flex-grow"><a data-item-id="{{queue._id}}">{{queue.name}}</a></span>
<div class="item-controls flex-shrink">
<a class="item-delete" title="Delete Item"><i class="fas fa-trash"></i></a>
</div>
</li>
{{/each}}
</ul>
{{/if}}
{{#if ombres.length}}
<h3>Ombres de Thanatos:</h3>
<ul class="item-list">
{{#each ombres as |ombre key|}}
<li class="item flexrow" data-attribute={{key}} data-item-id="{{ombre._id}}">
<span class="display-label flex-grow"><a data-item-id="{{ombre._id}}">{{ombre.name}}</a></span>
<div class="item-controls flex-shrink">
<a class="item-delete" title="Delete Item"><i class="fas fa-trash"></i></a>
</div>
</li>
{{/each}}
</ul>
{{/if}}
{{> "systems/foundryvtt-reve-de-dragon/templates/actor-sheet-queues.html"}}
{{#if souffles.length}}
<h3>Souffles:</h3>
<ul class="item-list">
@ -599,12 +574,12 @@
<h3>Sorts en Réserve:</h3>
<ul class="item-list alterne-list">
{{#each hautreve.sortsReserve as |reserve key|}}
<li class="item list-item flexrow" data-item-id="{{reserve._id}}" data-attribute="{{key}}">
<li class="item list-item flexrow" data-index="{{key}}">
<img class="sheet-competence-img" src="{{reserve.sort.img}}" />
<span class="display-label">{{reserve.sort.name}} r{{reserve.sort.system.ptreve_reel}}</span>
<span>{{reserve.coord}} - {{caseTmr-label reserve.coord}}</span>
<div class="item-controls flex-shrink">
<a class="item-delete flex-shrink" title="Supprimer"><i class="fas fa-trash"></i></a>
<a class="sort-reserve-delete flex-shrink" title="Supprimer"><i class="fas fa-trash"></i></a>
</div>
</li>
{{/each}}

View File

@ -1,12 +1 @@
<form class="{{cssClass}}" autocomplete="off">
{{>"systems/foundryvtt-reve-de-dragon/templates/header-item.html"}}
{{!-- Sheet Body --}}
<section class="sheet-body">
<div class="form-group">
<label for="xp">Refoulement</label>
<input class="attribute-value" type="text" name="system.refoulement" value="{{system.refoulement}}" data-dtype="Number"/>
</div>
{{>"systems/foundryvtt-reve-de-dragon/templates/partial-item-description.html"}}
</section>
</form>
{{>"systems/foundryvtt-reve-de-dragon/templates/item-queue-sheet.html"}}

View File

@ -3,7 +3,15 @@
{{!-- Sheet Body --}}
<section class="sheet-body">
<div class="form-group">
<label for="xp">Refoulement</label>
<label></label>
<label class="attribute-value">{{#if (eq type 'ombre')}}Ombre de thanatos
{{else if (eq type 'queue')}}Queue de Dragon
{{/if}}
</label>
</div>
<div class="form-group">
<label for="system.refoulement">Refoulement</label>
<input class="attribute-value" type="text" name="system.refoulement" value="{{system.refoulement}}" data-dtype="Number"/>
</div>