#88 Gestion argent

This commit is contained in:
sladecraven 2020-12-31 00:55:02 +01:00
parent fcd4d615dd
commit 5175be2801
7 changed files with 198 additions and 17 deletions

View File

@ -478,6 +478,17 @@ export class RdDActorSheet extends ActorSheet {
this.actor.jetVie(); this.actor.jetVie();
this.render(true); this.render(true);
}); });
html.find('.monnaie-plus').click((event) => {
const li = $(event.currentTarget).parents(".item");
this.actor.monnaieIncDec( li.data("item-id"), 1 );
this.render(true);
});
html.find('.monnaie-moins').click((event) => {
const li = $(event.currentTarget).parents(".item");
this.actor.monnaieIncDec( li.data("item-id"), -1 );
this.render(true);
});
html.find('#vie-plus').click((event) => { html.find('#vie-plus').click((event) => {
this.actor.santeIncDec("vie", 1); this.actor.santeIncDec("vie", 1);

View File

@ -14,6 +14,7 @@ import { Grammar } from "./grammar.js";
import { RdDEncaisser } from "./rdd-roll-encaisser.js"; import { RdDEncaisser } from "./rdd-roll-encaisser.js";
import { RdDCombat } from "./rdd-combat.js"; import { RdDCombat } from "./rdd-combat.js";
/* -------------------------------------------- */
/** /**
* Extend the base Actor entity by defining a custom roll data structure which is ideal for the Simple system. * Extend the base Actor entity by defining a custom roll data structure which is ideal for the Simple system.
* @extends {Actor} * @extends {Actor}
@ -47,8 +48,6 @@ export class RdDActor extends Actor {
let compendiumName = ""; let compendiumName = "";
if (data.type == "personnage") { if (data.type == "personnage") {
compendiumName = "foundryvtt-reve-de-dragon.competences"; compendiumName = "foundryvtt-reve-de-dragon.competences";
} else if (data.type == "humanoide") {
compendiumName = "foundryvtt-reve-de-dragon.competences-humanoides";
} else if (data.type == "creature") { } else if (data.type == "creature") {
compendiumName = "foundryvtt-reve-de-dragon.competences-creatures"; compendiumName = "foundryvtt-reve-de-dragon.competences-creatures";
} else if (data.type == "entite") { } else if (data.type == "entite") {
@ -64,12 +63,14 @@ export class RdDActor extends Actor {
data.items.push(compItem); data.items.push(compItem);
} }
// Ajout monnaie
if (data.type == "personnage" ) {
await RdDActor.ajouterMonnaie( data.items );
}
return super.create(data, options); return super.create(data, options);
} }
/* -------------------------------------------- */
/* -------------------------------------------- */ /* -------------------------------------------- */
prepareData() { prepareData() {
super.prepareData(); super.prepareData();
@ -103,6 +104,37 @@ export class RdDActor extends Actor {
this.computeEncombrementTotalEtMalusArmure(); this.computeEncombrementTotalEtMalusArmure();
this.computeEtatGeneral(); this.computeEtatGeneral();
} }
/* -------------------------------------------- */
static async ajouterMonnaie( items ) {
let etain = { name: "Etain (1 denier)", type: 'monnaie', _id: randomID(),
data: {
quantite: 0,
valeur_deniers: 1,
encombrement: 0.01,
description: ""
}
}
items.push(etain);
let bronze = duplicate(etain);
bronze.id = randomID();
bronze.name = "Bronze (10 deniers)";
bronze.data.valeur_deniers = 10;
items.push(bronze);
let argent = duplicate(etain);
argent.id = randomID();
argent.name = "Argent (1 sol)";
argent.data.valeur_deniers = 100;
items.push(argent);
let or = duplicate(argent);
or.id = randomID();
or.name = "Or (10 sols)";
or.data.valeur_deniers = 1000;
items.push(or);
}
/* -------------------------------------------- */ /* -------------------------------------------- */
isCreature() { isCreature() {
@ -1355,7 +1387,7 @@ export class RdDActor extends Actor {
isConnaissanceFleuve( ) { isConnaissanceFleuve( ) {
return this.data.items.find( item => item.type == 'tete' && item.name.toLowerCase().includes( 'connaissance du fleuve' ) ); return this.data.items.find( item => item.type == 'tete' && item.name.toLowerCase().includes( 'connaissance du fleuve' ) );
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
isReserveEnSecurite() { isReserveEnSecurite() {
let reserveSecurite = this.data.items.find( item => item.type == 'tete' && item.name.toLowerCase().includes( ' en sécurité' ) ); let reserveSecurite = this.data.items.find( item => item.type == 'tete' && item.name.toLowerCase().includes( ' en sécurité' ) );
@ -1996,7 +2028,6 @@ export class RdDActor extends Actor {
this.sheet.render(true); this.sheet.render(true);
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
/** @override */ /** @override */
getRollData() { getRollData() {
@ -2004,7 +2035,6 @@ export class RdDActor extends Actor {
return data; return data;
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
/* -- entites -- */ /* -- entites -- */
/* retourne true si on peut continuer, false si on ne peut pas continuer */ /* retourne true si on peut continuer, false si on ne peut pas continuer */
@ -2075,6 +2105,73 @@ export class RdDActor extends Actor {
await this.update( {"data.sante.resonnance": resonnance}); await this.update( {"data.sante.resonnance": resonnance});
return; return;
} }
/* -------------------------------------------- */
async optimizeArgent( sumDenier ) {
let sols = Math.floor(sumDenier / 100);
let deniers = sumDenier - (sols*100);
let nbOr = Math.floor(sols / 10);
let nbArgent = sols - (nbOr*10);
let nbBronze = Math.floor(deniers / 10 );
let nbEtain = deniers - (nbBronze*10);
// console.log("ARGENT", nbOr, nbArgent, nbBronze, nbEtain);
let piece = this.data.items.find( item => item.type =='monnaie' && item.data.valeur_deniers == 1000);
if (piece ) {
let update = { _id: piece._id, 'data.quantite': nbOr};
const updated = await this.updateEmbeddedEntity("OwnedItem", update);
}
piece = this.data.items.find( item => item.type =='monnaie' && item.data.valeur_deniers == 100);
if (piece ) {
let update = { _id: piece._id, 'data.quantite': nbArgent};
const updated = await this.updateEmbeddedEntity("OwnedItem", update);
}
piece = this.data.items.find( item => item.type =='monnaie' && item.data.valeur_deniers == 10);
if (piece ) {
let update = { _id: piece._id, 'data.quantite': nbBronze};
const updated = await this.updateEmbeddedEntity("OwnedItem", update);
}
piece = this.data.items.find( item => item.type =='monnaie' && item.data.valeur_deniers == 1);
if (piece ) {
let update = { _id: piece._id, 'data.quantite': nbEtain};
const updated = await this.updateEmbeddedEntity("OwnedItem", update);
}
}
/* -------------------------------------------- */
payerDenier( sumDenier ) {
sumDenier = Number(sumDenier);
let denierDisponible = 0;
let monnaie = this.data.items.filter( item => item.type =='monnaie');
for ( let piece of monnaie ) {
denierDisponible += piece.data.valeur_deniers * Number(piece.data.quantite);
}
console.log("DENIER", game.user.character, sumDenier, denierDisponible);
if ( denierDisponible >= sumDenier) {
denierDisponible -= sumDenier;
this.optimizeArgent(denierDisponible);
} else {
let message = {
whisper: ChatUtility.getWhisperRecipientsAndGMs( this.name ),
content : "Vous n'avez pas assez d'argent pour paye cette somme !"
};
ChatMessage.create( message );
}
}
/* -------------------------------------------- */
async monnaieIncDec( id, value) {
let monnaie = this.data.items.find( item => item.type =='monnaie' && item._id == id );
if (monnaie ) {
monnaie.data.quantite += value;
if ( monnaie.data.quantite < 0 ) monnaie.data.quantite = 0; // Sanity check
const update = {_id: monnaie._id, 'data.quantite': monnaie.data.quantite };
const updated = await this.updateEmbeddedEntity("OwnedItem", update);
}
}
} }

View File

@ -271,8 +271,7 @@ Hooks.on("preCreateToken", (scene, tokenData, options) => {
/* Foundry VTT Initialization */ /* Foundry VTT Initialization */
/* -------------------------------------------- */ /* -------------------------------------------- */
Hooks.on("chatMessage", (html, content, msg) => { Hooks.on("chatMessage", (html, content, msg) => {
let regExp; let regExp = /(\S+)/g;
regExp = /(\S+)/g;
let commands = content.match(regExp); let commands = content.match(regExp);
return RdDUtility.processChatCommand( commands, content, msg ); return RdDUtility.processChatCommand( commands, content, msg );

View File

@ -164,6 +164,7 @@ export class RdDUtility {
'systems/foundryvtt-reve-de-dragon/templates/item-tarot-sheet.html', 'systems/foundryvtt-reve-de-dragon/templates/item-tarot-sheet.html',
'systems/foundryvtt-reve-de-dragon/templates/item-tete-sheet.html', 'systems/foundryvtt-reve-de-dragon/templates/item-tete-sheet.html',
'systems/foundryvtt-reve-de-dragon/templates/item-ombre-sheet.html', 'systems/foundryvtt-reve-de-dragon/templates/item-ombre-sheet.html',
'systems/foundryvtt-reve-de-dragon/templates/item-monnaie-sheet.html',
'systems/foundryvtt-reve-de-dragon/templates/competence-categorie.html', 'systems/foundryvtt-reve-de-dragon/templates/competence-categorie.html',
'systems/foundryvtt-reve-de-dragon/templates/competence-carac-defaut.html', 'systems/foundryvtt-reve-de-dragon/templates/competence-carac-defaut.html',
'systems/foundryvtt-reve-de-dragon/templates/competence-base.html', 'systems/foundryvtt-reve-de-dragon/templates/competence-base.html',
@ -245,6 +246,7 @@ export class RdDUtility {
data.data.ombres = this.checkNull(data.itemsByType['ombre']); data.data.ombres = this.checkNull(data.itemsByType['ombre']);
data.data.tetes = this.checkNull(data.itemsByType['tete']); data.data.tetes = this.checkNull(data.itemsByType['tete']);
data.data.taches = this.checkNull(data.itemsByType['tache']); data.data.taches = this.checkNull(data.itemsByType['tache']);
data.data.monnaie = this.checkNull(data.itemsByType['monnaie']);
data.data.objets = data.data.conteneurs.concat(data.data.materiel).concat(data.data.armes).concat(data.data.armures).concat(data.data.munitions).concat(data.data.livres).concat(data.data.potions).concat(data.data.herbes).concat(data.data.ingredients); data.data.objets = data.data.conteneurs.concat(data.data.materiel).concat(data.data.armes).concat(data.data.armures).concat(data.data.munitions).concat(data.data.livres).concat(data.data.potions).concat(data.data.herbes).concat(data.data.ingredients);
} }
@ -743,7 +745,7 @@ export class RdDUtility {
return; return;
} }
if ((game.user.isGM && !defenderToken.actor.hasPlayerOwner) || (defenderToken.actor.hasPlayerOwner && (game.user.character.id == defenderToken.actor.data._id))) { if ((game.user.isGM && !defenderToken.actor.hasPlayerOwner) || (defenderToken.actor.hasPlayerOwner && (game.user.character.id == defenderToken.actor.data._id))) {
console.log("User is pushing message...", game.user.name); //console.log("User is pushing message...", game.user.name);
game.system.rdd.rollDataHandler[data.attackerId] = duplicate(data.rollData); game.system.rdd.rollDataHandler[data.attackerId] = duplicate(data.rollData);
data.whisper = [game.user]; data.whisper = [game.user];
data.blind = true; data.blind = true;
@ -873,7 +875,7 @@ export class RdDUtility {
let actor = game.actors.get( actorId ); let actor = game.actors.get( actorId );
actor.tmrApp.forceDemiRevePosition(coord); actor.tmrApp.forceDemiRevePosition(coord);
}); });
// Gestio spécifique des sorts en réserve multiples (ie têtes) // Gestion spécifique des sorts en réserve multiples (ie têtes)
html.on("click", '#sort-reserve', event => { html.on("click", '#sort-reserve', event => {
let coord = event.currentTarget.attributes['data-tmr-coord'].value; let coord = event.currentTarget.attributes['data-tmr-coord'].value;
let sortId = event.currentTarget.attributes['data-sort-id'].value; let sortId = event.currentTarget.attributes['data-sort-id'].value;
@ -881,6 +883,12 @@ export class RdDUtility {
let actor = game.actors.get( actorId ); let actor = game.actors.get( actorId );
actor.tmrApp.lancerSortEnReserve(coord, sortId); actor.tmrApp.lancerSortEnReserve(coord, sortId);
}); });
// Gestion du bouton payer
html.on("click", '#payer-button', event => {
let sumdenier = event.currentTarget.attributes['data-somme-denier'].value;
if (game.user.character )
game.user.character.payerDenier(sumdenier);
});
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
@ -893,6 +901,27 @@ export class RdDUtility {
} }
ChatMessage.create( msg ); ChatMessage.create( msg );
} }
/* -------------------------------------------- */
static afficherDemandePayer(som1, som2) {
som1 = (som1) ? som1.toLowerCase() : "0d";
som2 = (som2) ? som2.toLowerCase() : "0d";
let regExp = /(\d+)(\w+)/g;
let p1 = regExp.exec( som1);
regExp = /(\d+)(\w+)/g;
let p2 = regExp.exec( som2);
let sumd = 0;
let sums = 0;
if (p1[2] == 'd') sumd += Number(p1[1]);
if (p1[2] == 's') sums += Number(p1[1]);
if (p2[2] == 'd') sumd += Number(p2[1]);
if (p2[2] == 's') sums += Number(p2[1]);
let sumtotald = sumd + (sums*100);
let msgPayer = "La somme de "+sums+" Sols et "+sumd+" Deniers est à payer, cliquer sur le lien ci-dessous si besoin.<br>";
msgPayer += "<a id='payer-button' data-somme-denier='"+sumtotald+"'>Payer</a>"
ChatMessage.create( { content: msgPayer } );
}
/* -------------------------------------------- */ /* -------------------------------------------- */
/* Manage chat commands */ /* Manage chat commands */
@ -915,11 +944,14 @@ export class RdDUtility {
} }
return false return false
} else if (command === "/tmrr") { } else if (command === "/tmrr") {
TMRUtility.getRencontre(commands[1], commands[2] ) TMRUtility.getRencontre(commands[1], commands[2] )
return false return false
} else if (command === "/tmra") { } else if (command === "/tmra") {
TMRUtility.getTMRAleatoire( ) TMRUtility.getTMRAleatoire( )
return false return false
} else if (command === "/payer") {
RdDUtility.afficherDemandePayer( commands[1], commands[2] )
return false
} }
return true; return true;

View File

@ -451,7 +451,7 @@ section.sheet-body:after {
width: 2rem; width: 2rem;
} }
#vie-plus, #vie-moins, #endurance-plus, #endurance-moins, #fatigue-plus, #fatigue-moins, #ptreve-actuel-plus, #ptreve-actuel-moins { #vie-plus, #vie-moins, #endurance-plus, #endurance-moins, #fatigue-plus, #fatigue-moins, #ptreve-actuel-plus, #ptreve-actuel-moins, .monnaie-plus, .monnaie-moins {
display: inline-block; display: inline-block;
width: 1.25rem; width: 1.25rem;
background: rgba(30, 25, 20, 1); background: rgba(30, 25, 20, 1);

View File

@ -614,6 +614,19 @@
{{!-- Equipment Tab --}} {{!-- Equipment Tab --}}
<div class="tab items" data-group="primary" data-tab="items"> <div class="tab items" data-group="primary" data-tab="items">
<ul class="item-list alterne-list">
{{#each data.monnaie as |piece id|}}
<li class="item flexrow list-item" data-item-id="{{piece._id}}">
<span class="competence-title competence-label">{{piece.name}}</span>
<span class="competence-title competence-label">{{piece.data.quantite}}</span>
<span class="competence-title"><a class="monnaie-plus">+</a><a class="monnaie-moins">-</a></span>
<div class="item-controls">
<a class="item-control item-edit" title="Editer"><i class="fas fa-edit"></i></a>
<a class="item-control item-delete" title="Supprimer"><i class="fas fa-trash"></i></a>
</div>
</li>
{{/each}}
</ul>
<span class="item-name">Encombrement total/max : {{numberFormat data.encTotal decimals=1}} / {{data.attributs.encombrement.value}} <b>{{data.surEncombrementMessage}}</b></span> - <span class="item-name">Encombrement total/max : {{numberFormat data.encTotal decimals=1}} / {{data.attributs.encombrement.value}} <b>{{data.surEncombrementMessage}}</b></span> -
<span class="item-name"><a id="creer-un-objet">Créer un objet</a></span> <span class="item-name"><a id="creer-un-objet">Créer un objet</a></span>
<ul class="item-list alterne-list"> <ul class="item-list alterne-list">

View File

@ -0,0 +1,29 @@
<form class="{{cssClass}}" autocomplete="off">
<header class="sheet-header">
<img class="profile-img" src="{{item.img}}" data-edit="img" title="{{item.name}}"/>
<div class="header-fields">
<h1 class="charname"><input name="name" type="text" value="{{item.name}}" placeholder="Name"/></h1>
</div>
</header>
{{!-- Sheet Body --}}
<section class="sheet-body">
<div class="form-group">
<label for="xp">Quantité</label>
<input class="attribute-value" type="text" name="data.quantite" value="{{data.quantite}}" data-dtype="Number"/>
</div>
<div class="form-group">
<label for="xp">Valeur en Deniers</label>
<input class="attribute-value" type="text" name="data.valeur_deniers" value="{{data.valeur_deniers}}" data-dtype="Number"/>
</div>
<div class="form-group">
<label for="xp">Encombrement</label>
<input class="attribute-value" type="text" name="data.encombrement" value="{{data.encombrement}}" data-dtype="Number"/>
</div>
<span><label>Description : </label></span>
<div class="form-group editor" style="min-height: 400px !important;">
{{editor content=data.description target="data.description" button=true owner=owner editable=editable}}
</div>
</section>
</form>