Compare commits

..

No commits in common. "a1032392887a40e3ac319519095a897cabc486de" and "db2ca2453e18bc607d4fa3d85cc816d81b729105" have entirely different histories.

34 changed files with 205 additions and 237 deletions

View File

@ -1,10 +1,4 @@
# 11.2 # 11.2
## 11.2.22 - Le futur d'Akarlikarlikar
- correction de la vente par le tchat: seul le premier acheteur pouvait acheter
### Support V12
- adaptation fenêtre de recherche
## 11.2.21 - Le questionnement d'Akarlikarlikar ## 11.2.21 - Le questionnement d'Akarlikarlikar
- Une confirmation spécifique est demandée pour monter dans les terres médianes en cas de rencontre en attente - Une confirmation spécifique est demandée pour monter dans les terres médianes en cas de rencontre en attente
- L'expérience en caractéristique sur les jets de chance et rêve actuels est mise dans la caractéristique correspondante - L'expérience en caractéristique sur les jets de chance et rêve actuels est mise dans la caractéristique correspondante

View File

@ -1,70 +0,0 @@
import { SYSTEM_RDD } from "../constants.js";
import { RdDUtility } from "../rdd-utility.js";
const DETAIL_VENTE = 'detailVente';
const NB_LOTS = 'nbLotss';
export class ChatVente {
static getDetailVente(chatMessageId) {
const chatMessage = game.messages.get(chatMessageId)
if (!chatMessage) {
return undefined;
}
const nbLots = chatMessage.getFlag(SYSTEM_RDD, NB_LOTS)
const detail = foundry.utils.duplicate(chatMessage.getFlag(SYSTEM_RDD, DETAIL_VENTE))
if (!detail.item) {
ui.notifications.warn("Impossible d'acheter: informations sur l'objet manquantes")
return undefined;
}
const vendeur = detail.vendeurId ? game.actors.get(detail.vendeurId) : undefined;
return foundry.utils.mergeObject(detail,
{
alias: vendeur?.name ?? game.user.name,
vendeur,
nbLots: nbLots,
chatMessageIdVente: chatMessageId
})
}
static getDetailAchatVente(chatMessageId) {
const acheteur = RdDUtility.getSelectedActor()
const detail = ChatVente.getDetailVente(chatMessageId)
if (!acheteur && !detail.vendeur) {
ui.notifications.info("Pas d'acheteur ni de vendeur, aucun changement");
return undefined;
}
return foundry.utils.mergeObject(detail, { acheteur })
}
static async setDetailAchatVente(chatMessage, vente) {
await chatMessage?.setFlag(SYSTEM_RDD, NB_LOTS, vente.nbLots)
await chatMessage?.setFlag(SYSTEM_RDD, DETAIL_VENTE, {
item: vente.item,
properties: vente.item.getProprietes(),
vendeurId: vente.vendeurId,
tailleLot: vente.tailleLot,
quantiteIllimite: vente.quantiteIllimite,
prixLot: vente.prixLot
})
}
static async diminuerQuantite(chatMessageId, quantite) {
const chatMessage = game.messages.get(chatMessageId)
const vente = ChatVente.getDetailVente(chatMessageId)
vente.nbLots = Math.max(0, vente.nbLots - quantite)
await chatMessage?.setFlag(SYSTEM_RDD, NB_LOTS, vente.nbLots)
const html = await renderTemplate('systems/foundryvtt-reve-de-dragon/templates/chat-vente-item.html', vente);
chatMessage.update({ content: html });
chatMessage.render(true);
}
static async displayAchatVente(venteData) {
const html = await renderTemplate('systems/foundryvtt-reve-de-dragon/templates/chat-vente-item.html', venteData);
const chatMessage = await ChatMessage.create(RdDUtility.chatDataSetup(html))
await ChatVente.setDetailAchatVente(chatMessage, venteData)
}
}

View File

@ -32,13 +32,14 @@ export class RdDActorSheet extends RdDBaseActorSangSheet {
width: 550, width: 550,
showCompNiveauBase: false, showCompNiveauBase: false,
vueArchetype: false, vueArchetype: false,
}, { inplace: false }); });
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
async getData() { async getData() {
let formData = await super.getData(); let formData = await super.getData();
foundry.utils.mergeObject(formData, { foundry.utils.mergeObject(formData,
{
editable: this.isEditable, editable: this.isEditable,
cssClass: this.isEditable ? "editable" : "locked", cssClass: this.isEditable ? "editable" : "locked",
limited: this.actor.limited, limited: this.actor.limited,

View File

@ -2346,7 +2346,7 @@ export class RdDActor extends RdDBaseActorSang {
async _xpCaracDerivee(xpData) { async _xpCaracDerivee(xpData) {
const caracs = RdDActor._getComposantsCaracDerivee(xpData.caracName) const caracs = RdDActor._getComposantsCaracDerivee(xpData.caracName)
.map(c => foundry.utils.mergeObject(this.system.carac[c], { isMax: this.isCaracMax(c) }, { inplace: false })) .map(c => foundry.utils.mergeObject(this.system.carac[c], { isMax: this.isCaracMax(c) }))
switch (caracs.filter(it => !it.isMax).length) { switch (caracs.filter(it => !it.isMax).length) {
case 0: case 0:
xpData.caracRepartitionManuelle = true; xpData.caracRepartitionManuelle = true;

View File

@ -286,12 +286,12 @@ export class RdDBaseActorReve extends RdDBaseActor {
getCarac() { getCarac() {
// TODO: le niveau d'une entité de cauchemar devrait être exclu... // TODO: le niveau d'une entité de cauchemar devrait être exclu...
return foundry.utils.mergeObject(this.system.carac, const carac = foundry.utils.mergeObject(foundry.utils.duplicate(this.system.carac),
{ {
'reve-actuel': this.getCaracReveActuel(), 'reve-actuel': this.getCaracReveActuel(),
'chance-actuelle': this.getCaracChanceActuelle() 'chance-actuelle': this.getCaracChanceActuelle()
}, });
{ inplace: false }) return carac;
} }
/* -------------------------------------------- */ /* -------------------------------------------- */

View File

@ -20,7 +20,7 @@ export class RdDBaseActorSheet extends ActorSheet {
tabs: [{ navSelector: ".sheet-tabs", contentSelector: ".sheet-body", initial: "carac" }], tabs: [{ navSelector: ".sheet-tabs", contentSelector: ".sheet-body", initial: "carac" }],
dragDrop: [{ dragSelector: ".item-list .item", dropSelector: undefined }], dragDrop: [{ dragSelector: ".item-list .item", dropSelector: undefined }],
vueDetaillee: false vueDetaillee: false
}, { inplace: false }) });
} }
/* -------------------------------------------- */ /* -------------------------------------------- */

View File

@ -1,4 +1,3 @@
import { ChatVente } from "../achat-vente/chat-vente.js";
import { ChatUtility } from "../chat-utility.js"; import { ChatUtility } from "../chat-utility.js";
import { SYSTEM_SOCKET_ID } from "../constants.js"; import { SYSTEM_SOCKET_ID } from "../constants.js";
import { Grammar } from "../grammar.js"; import { Grammar } from "../grammar.js";
@ -361,9 +360,12 @@ export class RdDBaseActor extends Actor {
ChatUtility.notifyUser(achat.userId, 'warn', `Vous n'avez pas assez d'argent pour payer ${Math.ceil(cout / 100)} sols !`); ChatUtility.notifyUser(achat.userId, 'warn', `Vous n'avez pas assez d'argent pour payer ${Math.ceil(cout / 100)} sols !`);
return; return;
} }
await vendeur?.vendre(itemVendu, quantite, cout); await this.decrementerVente(vendeur, itemVendu, quantite, cout);
await acheteur?.acheter(itemVendu, quantite, cout, achat) if (acheteur) {
await acheteur.depenserSols(cout);
const createdItemId = await acheteur.creerQuantiteItem(itemVendu, quantite);
await acheteur.consommerNourritureAchetee(achat, achat.vente, createdItemId);
}
if (cout > 0) { if (cout > 0) {
RdDAudio.PlayContextAudio("argent"); RdDAudio.PlayContextAudio("argent");
} }
@ -377,26 +379,24 @@ export class RdDBaseActor extends Actor {
}); });
if (!achat.vente.quantiteIllimite) { if (!achat.vente.quantiteIllimite) {
if (achat.vente.nbLots <= achat.choix.nombreLots) { if (achat.vente.quantiteNbLots <= achat.choix.nombreLots) {
ChatUtility.removeChatMessageId(achat.chatMessageIdVente); ChatUtility.removeChatMessageId(achat.chatMessageIdVente);
} }
else if (achat.chatMessageIdVente) { else if (achat.chatMessageIdVente) {
await ChatVente.diminuerQuantite(achat.chatMessageIdVente, achat.choix.nombreLots) achat.vente.properties = itemVendu.getProprietes();
achat.vente.quantiteNbLots -= achat.choix.nombreLots;
achat.vente.jsondata = JSON.stringify(achat.vente.item);
const messageVente = game.messages.get(achat.chatMessageIdVente);
messageVente.update({ content: await renderTemplate('systems/foundryvtt-reve-de-dragon/templates/chat-vente-item.html', achat.vente) });
messageVente.render(true);
} }
} }
} }
async vendre(item, quantite, cout) { async decrementerVente(vendeur, itemVendu, quantite, cout) {
await this.ajouterSols(cout); if (vendeur) {
await this.decrementerQuantiteItem(item, quantite); await vendeur.ajouterSols(cout);
} await vendeur.decrementerQuantiteItem(itemVendu, quantite);
async acheter(item, quantite, cout, achat) {
await this.depenserSols(cout)
const createdItemId = await this.creerQuantiteItem(item, quantite)
if (achat.choix.consommer && item.type == 'nourritureboisson' && createdItemId != undefined) {
achat.choix.doses = achat.choix.nombreLots;
await this.consommerNourritureboisson(createdItemId, achat.choix, achat.vente.actingUserId);
} }
} }
@ -409,28 +409,31 @@ export class RdDBaseActor extends Actor {
return disponible == undefined || disponible >= quantiteDemande; return disponible == undefined || disponible >= quantiteDemande;
} }
async consommerNourritureboisson(itemId, choix, userId) { } async consommerNourritureAchetee(achat, vente, createdItemId) {
if (achat.choix.consommer && vente.item.type == 'nourritureboisson' && createdItemId != undefined) {
achat.choix.doses = achat.choix.nombreLots;
await this.consommerNourritureboisson(createdItemId, achat.choix, vente.actingUserId);
}
}
async decrementerQuantiteItem(item, quantite, options = { supprimerSiZero: true }) { async decrementerQuantiteItem(item, quantite, options = { supprimerSiZero: true }) {
if (item.isService()) { if (item.isService()) {
return; return;
} }
const itemId = item.id;
let resteQuantite = (item.system.quantite ?? 1) - quantite; let resteQuantite = (item.system.quantite ?? 1) - quantite;
if (resteQuantite <= 0) { if (resteQuantite <= 0) {
if (options.supprimerSiZero) { if (options.supprimerSiZero) {
await this.deleteEmbeddedDocuments("Item", [item.id]); await this.deleteEmbeddedDocuments("Item", [item.id]);
} }
else { else {
await this.updateEmbeddedDocuments("Item", [{ _id: itemId, 'system.quantite': 0 }]); await this.updateEmbeddedDocuments("Item", [{ _id: item.id, 'system.quantite': 0 }]);
} }
if (resteQuantite < 0) { if (resteQuantite < 0) {
ui.notifications.warn(`La quantité de ${item.name} était insuffisante, l'objet a donc été supprimé`) ui.notifications.warn(`La quantité de ${item.name} était insuffisante, l'objet a donc été supprimé`)
} }
} }
else if (resteQuantite > 0) { else if (resteQuantite > 0) {
const realItem = this.getItem(item.id)
realItem.update({ 'system.quantite': resteQuantite });
await this.updateEmbeddedDocuments("Item", [{ _id: item.id, 'system.quantite': resteQuantite }]); await this.updateEmbeddedDocuments("Item", [{ _id: item.id, 'system.quantite': resteQuantite }]);
} }
} }
@ -442,7 +445,7 @@ export class RdDBaseActor extends Actor {
type: item.type, type: item.type,
img: item.img, img: item.img,
name: item.name, name: item.name,
system: foundry.utils.mergeObject(item.system, { quantite: isItemEmpilable ? quantite : undefined }, { inplace: false }) system: foundry.utils.mergeObject(item.system, { quantite: isItemEmpilable ? quantite : undefined })
}; };
const newItems = isItemEmpilable ? [baseItem] : Array.from({ length: quantite }, (_, i) => baseItem); const newItems = isItemEmpilable ? [baseItem] : Array.from({ length: quantite }, (_, i) => baseItem);
const items = await this.createEmbeddedDocuments("Item", newItems); const items = await this.createEmbeddedDocuments("Item", newItems);

View File

@ -1,4 +1,4 @@
import { DialogItemAchat } from "../achat-vente/dialog-item-achat.js"; import { DialogItemAchat } from "../dialog-item-achat.js";
import { RdDItem } from "../item.js"; import { RdDItem } from "../item.js";
import { RdDUtility } from "../rdd-utility.js"; import { RdDUtility } from "../rdd-utility.js";
import { RdDBaseActorSheet } from "./base-actor-sheet.js"; import { RdDBaseActorSheet } from "./base-actor-sheet.js";
@ -15,7 +15,7 @@ export class RdDCommerceSheet extends RdDBaseActorSheet {
template: "systems/foundryvtt-reve-de-dragon/templates/actor/commerce-actor-sheet.html", template: "systems/foundryvtt-reve-de-dragon/templates/actor/commerce-actor-sheet.html",
width: 600, height: 720, width: 600, height: 720,
tabs: [] tabs: []
}, { inplace: false }) });
} }
get title() { get title() {
if (this.actor.token && this.actor.token != this.actor.prototypeToken) { if (this.actor.token && this.actor.token != this.actor.prototypeToken) {

View File

@ -25,7 +25,8 @@ export class RdDCommerce extends RdDBaseActor {
} }
await super.depenserSols(cout) await super.depenserSols(cout)
} }
async consommerNourritureboisson(itemId, choix, userId) {
async consommerNourritureAchetee(achat, vente, createdItemId) {
// ne pas consommer pour un commerce // ne pas consommer pour un commerce
} }

View File

@ -12,7 +12,7 @@ export class RdDCreatureSheet extends RdDBaseActorSangSheet {
return foundry.utils.mergeObject(RdDBaseActorSangSheet.defaultOptions, { return foundry.utils.mergeObject(RdDBaseActorSangSheet.defaultOptions, {
template: "systems/foundryvtt-reve-de-dragon/templates/actor-creature-sheet.html", template: "systems/foundryvtt-reve-de-dragon/templates/actor-creature-sheet.html",
width: 640, height: 720 width: 640, height: 720
}, { inplace: false }) });
} }
/* -------------------------------------------- */ /* -------------------------------------------- */

View File

@ -9,7 +9,7 @@ export class RdDActorEntiteSheet extends RdDBaseActorReveSheet {
return foundry.utils.mergeObject(RdDBaseActorReveSheet.defaultOptions, { return foundry.utils.mergeObject(RdDBaseActorReveSheet.defaultOptions, {
template: "systems/foundryvtt-reve-de-dragon/templates/actor-entite-sheet.html", template: "systems/foundryvtt-reve-de-dragon/templates/actor-entite-sheet.html",
width: 640, height: 720, width: 640, height: 720,
}, { inplace: false }) });
} }
async getData() { async getData() {

View File

@ -9,7 +9,7 @@ export class RdDActorVehiculeSheet extends RdDBaseActorSheet {
return foundry.utils.mergeObject(RdDBaseActorSheet.defaultOptions, { return foundry.utils.mergeObject(RdDBaseActorSheet.defaultOptions, {
template: "systems/foundryvtt-reve-de-dragon/templates/actor-vehicule-sheet.html", template: "systems/foundryvtt-reve-de-dragon/templates/actor-vehicule-sheet.html",
width: 640, height: 720, width: 640, height: 720,
}, { inplace: false }) });
} }
/* -------------------------------------------- */ /* -------------------------------------------- */

View File

@ -1,12 +1,34 @@
import { Misc } from "../misc.js"; import { Misc } from "./misc.js";
import { RdDUtility } from "../rdd-utility.js"; import { RdDUtility } from "./rdd-utility.js";
import { ChatVente } from "./chat-vente.js";
export class DialogItemAchat extends Dialog { export class DialogItemAchat extends Dialog {
static preparerAchat(chatButton) { static preparerAchat(chatButton) {
return ChatVente.getDetailAchatVente(RdDUtility.findChatMessageId(chatButton)) const vendeurId = chatButton.attributes['data-vendeurId']?.value;
const vendeur = vendeurId ? game.actors.get(vendeurId) : undefined;
const acheteur = RdDUtility.getSelectedActor();
const json = chatButton.attributes['data-jsondata']?.value;
if (!acheteur && !vendeur) {
ui.notifications.info("Pas d'acheteur ni de vendeur, aucun changement");
return undefined;
} }
if (!json) {
ui.notifications.warn("Impossible d'acheter: informations sur l'objet manquantes")
return undefined;
}
return {
item: JSON.parse(json),
vendeur,
acheteur,
nbLots: parseInt(chatButton.attributes['data-quantiteNbLots']?.value),
tailleLot: parseInt(chatButton.attributes['data-tailleLot']?.value ?? 1),
prixLot: Number(chatButton.attributes['data-prixLot']?.value ?? 0),
quantiteIllimite: chatButton.attributes['data-quantiteIllimite']?.value == 'true',
chatMessageIdVente: RdDUtility.findChatMessageId(chatButton),
};
}
static async onAcheter({ item, vendeur, acheteur, tailleLot, prixLot, nbLots, quantiteIllimite, chatMessageIdVente }) { static async onAcheter({ item, vendeur, acheteur, tailleLot, prixLot, nbLots, quantiteIllimite, chatMessageIdVente }) {
const venteData = { const venteData = {
@ -16,21 +38,17 @@ export class DialogItemAchat extends Dialog {
acheteur, acheteur,
tailleLot, tailleLot,
quantiteIllimite, quantiteIllimite,
nbLots, quantiteNbLots: nbLots,
choix: { seForcer: false, supprimerSiZero: true }, choix: { seForcer: false, supprimerSiZero: true },
prixLot, prixLot,
isVente: prixLot > 0, isVente: prixLot > 0,
isConsommable: item.type == 'nourritureboisson' && acheteur?.isPersonnage(), isConsommable: item.type == 'nourritureboisson' && acheteur?.isPersonnage(),
chatMessageIdVente chatMessageIdVente
} };
if (venteData.vendeur?.id == venteData.acheteur?.id) {
ui.notifications.info("Inutile de se vendre à soi-même")
return
}
DialogItemAchat.changeNombreLots(venteData, 1) DialogItemAchat.changeNombreLots(venteData, 1);
const html = await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/dialog-item-achat.html`, venteData) const html = await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/dialog-item-achat.html`, venteData);
new DialogItemAchat(html, venteData).render(true) new DialogItemAchat(html, venteData).render(true);
} }
static changeNombreLots(venteData, nombreLots) { static changeNombreLots(venteData, nombreLots) {
@ -98,18 +116,18 @@ export class DialogItemAchat extends Dialog {
this.venteData.choix.seForcer = event.currentTarget.checked; this.venteData.choix.seForcer = event.currentTarget.checked;
} }
setNombreLots(nbLots) { setNombreLots(nombreLots) {
if (!this.venteData.quantiteIllimite) { if (!this.venteData.quantiteIllimite) {
if (!this.venteData.quantiteIllimite && nbLots > this.venteData.nbLots) { if (!this.venteData.quantiteIllimite && nombreLots > this.venteData.quantiteNbLots) {
ui.notifications.warn(`Seulement ${this.venteData.nbLots} lots disponibles, vous ne pouvez pas en prendre ${nbLots}`) ui.notifications.warn(`Seulement ${this.venteData.quantiteNbLots} lots disponibles, vous ne pouvez pas en prendre ${nombreLots}`)
} }
nbLots = Math.min(nbLots, this.venteData.nbLots); nombreLots = Math.min(nombreLots, this.venteData.quantiteNbLots);
} }
DialogItemAchat.changeNombreLots(this.venteData, nbLots); DialogItemAchat.changeNombreLots(this.venteData, nombreLots);
this.html.find(".nombreLots").val(nbLots); this.html.find(".nombreLots").val(nombreLots);
this.html.find(".prixTotal").text(this.venteData.prixTotal); this.html.find(".prixTotal").text(this.venteData.prixTotal);
this.html.find("span.total-sust").text(this.venteData.totalSust); this.html.find("span.total-sust").text(this.venteData.totalSust);
this.html.find("span.total-desaltere").text(this.venteData.totalDesaltere); this.html.find("span.total-desaltere").text(this.venteData.totalDesaltere);

View File

@ -1,30 +1,29 @@
import { HtmlUtility } from "../html-utility.js"; import { HtmlUtility } from "./html-utility.js";
import { RdDUtility } from "../rdd-utility.js";
import { ChatVente } from "./chat-vente.js";
export class DialogItemVente extends Dialog { export class DialogItemVente extends Dialog {
static async display({ item, quantiteMax = undefined }) { static async display({ item, callback, quantiteMax = undefined }) {
const quantite = quantiteMax ?? item.getQuantite() ?? 1; const quantite = quantiteMax ?? item.getQuantite() ?? 1;
const isOwned = item.parent;
const venteData = { const venteData = {
item: item, item: item,
alias: item.actor?.name ?? game.user.name, alias: item.actor?.name ?? game.user.name,
vendeurId: item.actor.id, vendeurId: item.actor?.id,
prixOrigine: item.calculerPrixCommercant(), prixOrigine: item.calculerPrixCommercant(),
prixUnitaire: item.calculerPrixCommercant(), prixUnitaire: item.calculerPrixCommercant(),
prixLot: item.calculerPrixCommercant(), prixLot: item.calculerPrixCommercant(),
tailleLot: 1, tailleLot: 1,
nbLots: quantite, quantiteNbLots: quantite,
maxLots: quantite, quantiteMaxLots: quantite,
quantiteMax: quantite, quantiteMax: quantite,
quantiteIllimite: item.isItemCommerce() ? quantiteMax == undefined : !item.parent, quantiteIllimite: item.isItemCommerce() ? quantiteMax == undefined : !isOwned,
isOwned: item.parent, isOwned: isOwned,
} };
const html = await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/dialog-item-vente.html`, venteData); const html = await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/dialog-item-vente.html`, venteData);
return new DialogItemVente(venteData, html).render(true); return new DialogItemVente(venteData, html, callback).render(true);
} }
constructor(venteData, html) { constructor(venteData, html, callback) {
let options = { classes: ["dialogvente"], width: 400, height: 'fit-content', 'z-index': 99999 }; let options = { classes: ["dialogvente"], width: 400, height: 'fit-content', 'z-index': 99999 };
let conf = { let conf = {
@ -35,6 +34,7 @@ export class DialogItemVente extends Dialog {
}; };
super(conf, options); super(conf, options);
this.callback = callback;
this.venteData = venteData; this.venteData = venteData;
} }
@ -43,7 +43,7 @@ export class DialogItemVente extends Dialog {
this.html = html; this.html = html;
this.html.find(".tailleLot").change(event => this.setTailleLot(Number(event.currentTarget.value))); this.html.find(".tailleLot").change(event => this.setTailleLot(Number(event.currentTarget.value)));
this.html.find(".nbLots").change(event => this.setNbLots(Number(event.currentTarget.value))); this.html.find(".quantiteNbLots").change(event => this.setNbLots(Number(event.currentTarget.value)));
this.html.find(".quantiteIllimite").change(event => this.setQuantiteIllimite(event.currentTarget.checked)); this.html.find(".quantiteIllimite").change(event => this.setQuantiteIllimite(event.currentTarget.checked));
this.html.find(".prixLot").change(event => this.setPrixLot(Number(event.currentTarget.value))); this.html.find(".prixLot").change(event => this.setPrixLot(Number(event.currentTarget.value)));
@ -52,15 +52,7 @@ export class DialogItemVente extends Dialog {
async onProposer(it) { async onProposer(it) {
this.updateVente(this.getChoixVente()); this.updateVente(this.getChoixVente());
this.callback(this.venteData);
this.venteData["properties"] = this.venteData.item.getProprietes();
if (this.venteData.isOwned) {
if (this.venteData.nbLots * this.venteData.tailleLot > this.venteData.quantiteMax) {
ui.notifications.warn(`Vous avez ${this.venteData.quantiteMax} ${this.venteData.item.name}, ce n'est pas suffisant pour vendre ${this.venteData.nbLots} de ${this.venteData.tailleLot}`)
return;
}
}
await ChatVente.displayAchatVente(this.venteData)
} }
updateVente(update) { updateVente(update) {
@ -69,7 +61,7 @@ export class DialogItemVente extends Dialog {
getChoixVente() { getChoixVente() {
return { return {
nbLots: Number(this.html.find(".nbLots").val()), quantiteNbLots: Number(this.html.find(".quantiteNbLots").val()),
tailleLot: Number(this.html.find(".tailleLot").val()), tailleLot: Number(this.html.find(".tailleLot").val()),
quantiteIllimite: this.html.find(".quantiteIllimite").is(':checked'), quantiteIllimite: this.html.find(".quantiteIllimite").is(':checked'),
prixLot: Number(this.html.find(".prixLot").val()) prixLot: Number(this.html.find(".prixLot").val())
@ -85,26 +77,26 @@ export class DialogItemVente extends Dialog {
const maxLots = Math.floor(this.venteData.quantiteMax / tailleLot); const maxLots = Math.floor(this.venteData.quantiteMax / tailleLot);
this.updateVente({ this.updateVente({
tailleLot, tailleLot,
nbLots: Math.min(maxLots, this.venteData.nbLots), quantiteNbLots: Math.min(maxLots, this.venteData.quantiteNbLots),
maxLots: maxLots, quantiteMaxLots: maxLots,
prixLot: (tailleLot * this.venteData.prixOrigine).toFixed(2) prixLot: (tailleLot * this.venteData.prixOrigine).toFixed(2)
}); });
this.html.find(".prixLot").val(this.venteData.prixLot); this.html.find(".prixLot").val(this.venteData.prixLot);
this.html.find(".nbLots").val(this.venteData.nbLots); this.html.find(".quantiteNbLots").val(this.venteData.quantiteNbLots);
this.html.find(".nbLots").attr("max", this.venteData.maxLots) this.html.find(".quantiteNbLots").attr("max", this.venteData.quantiteMaxLots)
} }
setNbLots(nbLots) { setNbLots(nbLots) {
this.updateVente({ this.updateVente({
nbLots: this.venteData.isOwned ? Math.max(0, Math.min(nbLots, this.venteData.maxLots)) : nbLots quantiteNbLots: this.venteData.isOwned ? Math.max(0, Math.min(nbLots, this.venteData.quantiteMaxLots)) : nbLots
}) })
this.html.find(".nbLots").val(this.venteData.nbLots); this.html.find(".quantiteNbLots").val(this.venteData.quantiteNbLots);
} }
setQuantiteIllimite(checked) { setQuantiteIllimite(checked) {
this.updateVente({ quantiteIllimite: checked }) this.updateVente({ quantiteIllimite: checked })
this.html.find(".label-quantiteIllimite").text(this.venteData.quantiteIllimite ? "Illimités" : "disponibles"); this.html.find(".label-quantiteIllimite").text(this.venteData.quantiteIllimite ? "Illimités" : "disponibles");
HtmlUtility.showControlWhen(this.html.find(".nbLots"), !this.venteData.quantiteIllimite) HtmlUtility.showControlWhen(this.html.find(".quantiteNbLots"), !this.venteData.quantiteIllimite)
} }
} }

View File

@ -199,7 +199,7 @@ export class RdDItemCompetence extends Item {
if (idOrName == undefined || idOrName == "") { if (idOrName == undefined || idOrName == "") {
return RdDItemCompetence.sansCompetence(); return RdDItemCompetence.sansCompetence();
} }
options = foundry.utils.mergeObject(options, { preFilter: it => it.isCompetence(), description: 'compétence' }, { overwrite: false, inplace: false }); options = foundry.utils.mergeObject(options, { preFilter: it => it.isCompetence(), description: 'compétence' }, { overwrite: false });
return RdDItemCompetence.findFirstItem(list, idOrName, options); return RdDItemCompetence.findFirstItem(list, idOrName, options);
} }

View File

@ -33,7 +33,8 @@ export class RdDItemCompetenceCreature extends Item {
if (categorieAttaque != undefined) { if (categorieAttaque != undefined) {
// si c'est un Item compétence: cloner pour ne pas modifier la compétence // si c'est un Item compétence: cloner pour ne pas modifier la compétence
let arme = item.clone(); let arme = item.clone();
return foundry.utils.mergeObject(arme, { foundry.utils.mergeObject(arme,
{
action: item.isCompetencePossession() ? 'possession' : 'attaque', action: item.isCompetencePossession() ? 'possession' : 'attaque',
system: { system: {
competence: arme.name, competence: arme.name,
@ -47,7 +48,8 @@ export class RdDItemCompetenceCreature extends Item {
force: 0, force: 0,
rapide: true, rapide: true,
} }
}, { inplace: false }); });
return arme;
} }
return undefined; return undefined;
} }

View File

@ -44,7 +44,7 @@ export class RdDItemSheet extends ItemSheet {
template: RdDItemSheet.defaultTemplate(RdDItemSheet.ITEM_TYPE), template: RdDItemSheet.defaultTemplate(RdDItemSheet.ITEM_TYPE),
width: 550, width: 550,
height: 550 height: 550
}, { inplace: false }); });
} }
/* -------------------------------------------- */ /* -------------------------------------------- */

View File

@ -1,4 +1,4 @@
import { DialogItemVente } from "./achat-vente/dialog-item-vente.js"; import { DialogItemVente } from "./dialog-item-vente.js";
import { Grammar } from "./grammar.js"; import { Grammar } from "./grammar.js";
import { Misc } from "./misc.js"; import { Misc } from "./misc.js";
import { RdDHerbes } from "./rdd-herbes.js"; import { RdDHerbes } from "./rdd-herbes.js";
@ -538,7 +538,7 @@ export class RdDItem extends Item {
_id: this.id, _id: this.id,
'system.quantite': this.system.quantite * sust, 'system.quantite': this.system.quantite * sust,
'system.encombrement': Misc.keepDecimals(this.system.encombrement / sust, 2), 'system.encombrement': Misc.keepDecimals(this.system.encombrement / sust, 2),
'system.cout': Math.max(0, Misc.keepDecimals(this.system.cout / sust, 2)), 'system.cout': Misc.keepDecimals(this.system.cout / sust, 2),
'system.sust': 1 'system.sust': 1
}]) }])
} }
@ -621,7 +621,23 @@ export class RdDItem extends Item {
ui.notifications.warn(`Votre ${this.name} n'est pas vide, pas possible de le proposer`); ui.notifications.warn(`Votre ${this.name} n'est pas vide, pas possible de le proposer`);
return; return;
} }
await DialogItemVente.display({ item: this, quantiteMax }) await DialogItemVente.display({
item: this,
quantiteMax,
callback: async (vente) => {
vente["properties"] = this.getProprietes();
if (vente.isOwned) {
if (vente.quantiteNbLots * vente.tailleLot > vente.quantiteMax) {
ui.notifications.warn(`Vous avez ${vente.quantiteMax} ${vente.item.name}, ce n'est pas suffisant pour vendre ${vente.quantiteNbLots} de ${vente.tailleLot}`)
return;
}
}
vente.jsondata = JSON.stringify(vente.item);
let html = await renderTemplate('systems/foundryvtt-reve-de-dragon/templates/chat-vente-item.html', vente);
ChatMessage.create(RdDUtility.chatDataSetup(html));
}
});
} }
/* -------------------------------------------- */ /* -------------------------------------------- */

View File

@ -39,7 +39,7 @@ export class RdDItemBlessure extends RdDItem {
ui.notifications.warn(`Pas de tâche de soins pour une blessure ${gravite}`) ui.notifications.warn(`Pas de tâche de soins pour une blessure ${gravite}`)
return undefined; return undefined;
} }
return foundry.utils.mergeObject(BASE_TACHE_SOIN_BLESSURE, tache, { inplace: false }) return foundry.utils.mergeObject(foundry.utils.duplicate(BASE_TACHE_SOIN_BLESSURE), tache)
} }
static async applyFullBlessure(actor, gravite) { static async applyFullBlessure(actor, gravite) {
@ -106,12 +106,12 @@ export class RdDItemBlessure extends RdDItem {
} }
async setSoinsBlessure(systemUpdate = {}) { async setSoinsBlessure(systemUpdate = {}) {
systemUpdate = foundry.utils.mergeObject(systemUpdate, this.system, { overwrite: false }) systemUpdate = foundry.utils.mergeObject(systemUpdate, this.system, { overwrite: false }),
systemUpdate.soinscomplets.done = systemUpdate.premierssoins.done && systemUpdate.soinscomplets.done systemUpdate.soinscomplets.done = systemUpdate.premierssoins.done && systemUpdate.soinscomplets.done
await this.update({ await this.update({
img: this.getImgSoins(systemUpdate.gravite, systemUpdate.soinscomplets.done), img: this.getImgSoins(systemUpdate.gravite, systemUpdate.soinscomplets.done),
system: systemUpdate system: systemUpdate
}) });
} }
async recuperationBlessure({ actor, timestamp, message, isMaladeEmpoisonne, blessures }) { async recuperationBlessure({ actor, timestamp, message, isMaladeEmpoisonne, blessures }) {

View File

@ -10,7 +10,7 @@ export class RdDItemInventaireSheet extends RdDItemSheet {
static get defaultOptions() { static get defaultOptions() {
return foundry.utils.mergeObject(RdDItemSheet.defaultOptions, { return foundry.utils.mergeObject(RdDItemSheet.defaultOptions, {
tabs: [{ navSelector: ".sheet-tabs", contentSelector: ".sheet-body", initial: "informations" }] tabs: [{ navSelector: ".sheet-tabs", contentSelector: ".sheet-body", initial: "informations" }]
}, { inplace: false }) });
} }
setPosition(options = {}) { setPosition(options = {}) {
@ -23,10 +23,9 @@ export class RdDItemInventaireSheet extends RdDItemSheet {
async getData() { async getData() {
const formData = await super.getData(); const formData = await super.getData();
foundry.utils.mergeObject(formData, { return foundry.utils.mergeObject(formData, {
milieux: await game.system.rdd.environnement.autresMilieux(this.item) milieux: await game.system.rdd.environnement.autresMilieux(this.item)
}) });
return formData
} }
activateListeners(html) { activateListeners(html) {

View File

@ -8,7 +8,7 @@ export class RdDRencontreItemSheet extends RdDItemSheet {
static get defaultOptions() { static get defaultOptions() {
return foundry.utils.mergeObject(super.defaultOptions, { return foundry.utils.mergeObject(super.defaultOptions, {
tabs: [{ navSelector: ".sheet-tabs", contentSelector: ".sheet-body", initial: "carac" }] tabs: [{ navSelector: ".sheet-tabs", contentSelector: ".sheet-body", initial: "carac" }]
}, { inplace: false }) });
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
@ -35,7 +35,7 @@ export class RdDRencontreItemSheet extends RdDItemSheet {
select: RdDRencontre.mapEffets(this.item.system.echec.effets) select: RdDRencontre.mapEffets(this.item.system.echec.effets)
} }
} }
}) });
return formData; return formData;
} }

View File

@ -128,7 +128,8 @@ export class RdDCombatManager extends Combat {
// Send a chat message // Send a chat message
let rollMode = messageOptions.rollMode || game.settings.get("core", "rollMode"); let rollMode = messageOptions.rollMode || game.settings.get("core", "rollMode");
let messageData = foundry.utils.mergeObject({ let messageData = foundry.utils.mergeObject(
{
speaker: { speaker: {
scene: canvas.scene._id, scene: canvas.scene._id,
actor: combatant.actor?._id, actor: combatant.actor?._id,
@ -136,9 +137,12 @@ export class RdDCombatManager extends Combat {
alias: combatant.token.name, alias: combatant.token.name,
sound: CONFIG.sounds.dice, sound: CONFIG.sounds.dice,
}, },
flavor: `${combatant.token.name} a fait son jet d'Initiative (${messageOptions.initInfo})<br>`, flavor: `${combatant.token.name} a fait son jet d'Initiative (${messageOptions.initInfo})
<br>
`,
}, },
messageOptions); messageOptions
);
roll.toMessage(messageData, { rollMode, create: true }); roll.toMessage(messageData, { rollMode, create: true });
RdDCombatManager.processPremierRoundInit(); RdDCombatManager.processPremierRoundInit();

View File

@ -12,7 +12,7 @@ export class RdDConfirm {
buttons = foundry.utils.mergeObject(RdDConfirm._createButtonActionSave(options), buttons); buttons = foundry.utils.mergeObject(RdDConfirm._createButtonActionSave(options), buttons);
} }
if (autresActions) { if (autresActions) {
buttons = foundry.utils.mergeObject(autresActions, buttons, { inplace: false }); buttons = foundry.utils.mergeObject(autresActions, buttons);
} }
const dialogDetails = { const dialogDetails = {
title: options.title, title: options.title,

View File

@ -4,7 +4,7 @@ import { RdDCombat } from "./rdd-combat.js";
import { Misc } from "./misc.js"; import { Misc } from "./misc.js";
import { Grammar } from "./grammar.js"; import { Grammar } from "./grammar.js";
import { TMRUtility } from "./tmr-utility.js"; import { TMRUtility } from "./tmr-utility.js";
import { DialogItemAchat } from "./achat-vente/dialog-item-achat.js"; import { DialogItemAchat } from "./dialog-item-achat.js";
import { ReglesOptionnelles } from "./settings/regles-optionnelles.js"; import { ReglesOptionnelles } from "./settings/regles-optionnelles.js";
import { RdDDice } from "./rdd-dice.js"; import { RdDDice } from "./rdd-dice.js";
import { RdDItem } from "./item.js"; import { RdDItem } from "./item.js";

View File

@ -71,7 +71,8 @@ export class ReglesOptionnelles extends FormApplication {
} }
static get defaultOptions() { static get defaultOptions() {
return foundry.utils.mergeObject(super.defaultOptions, { const options = super.defaultOptions;
foundry.utils.mergeObject(options, {
id: "regles-optionnelles", id: "regles-optionnelles",
template: "systems/foundryvtt-reve-de-dragon/templates/settings/regles-optionnelles.html", template: "systems/foundryvtt-reve-de-dragon/templates/settings/regles-optionnelles.html",
height: 650, height: 650,
@ -79,7 +80,8 @@ export class ReglesOptionnelles extends FormApplication {
minimizable: false, minimizable: false,
closeOnSubmit: true, closeOnSubmit: true,
title: "Règles optionnelles" title: "Règles optionnelles"
}, { inplace: false }) });
return options;
} }
getData() { getData() {

View File

@ -152,7 +152,7 @@ export class SystemCompendiums extends FormApplication {
getData() { getData() {
const systemCompendiums = Object.values(CONFIGURABLE_COMPENDIUMS) const systemCompendiums = Object.values(CONFIGURABLE_COMPENDIUMS)
.map(it => foundry.utils.mergeObject(it, { value: SystemCompendiums.getCompendium(it.compendium) }, { inplace: false })) .map(it => foundry.utils.mergeObject(it, { value: SystemCompendiums.getCompendium(it.compendium) }));
const availableCompendiums = game.packs.map(pack => { const availableCompendiums = game.packs.map(pack => {
return { return {
name: pack.collection, name: pack.collection,
@ -163,7 +163,7 @@ export class SystemCompendiums extends FormApplication {
return foundry.utils.mergeObject(super.getData(), { return foundry.utils.mergeObject(super.getData(), {
systemCompendiums: systemCompendiums, systemCompendiums: systemCompendiums,
availableCompendiums: availableCompendiums availableCompendiums: availableCompendiums
}, { inplace: false }) });
} }
activateListeners(html) { activateListeners(html) {

View File

@ -25,7 +25,7 @@ export class AppAstrologie extends Application {
classes: ['calendar-astrologie'], classes: ['calendar-astrologie'],
popOut: true, popOut: true,
resizable: false resizable: false
}, { inplace: false }) });
} }
constructor(actor, options = {}) { constructor(actor, options = {}) {
@ -49,7 +49,7 @@ export class AppAstrologie extends Application {
signeNaissance: RdDTimestamp.definition(0) signeNaissance: RdDTimestamp.definition(0)
} }
}) })
return this.appData return this.appData;
} }
getActorAstrologie() { getActorAstrologie() {

View File

@ -43,7 +43,7 @@ export class RdDCalendrier extends Application {
resizable: false, resizable: false,
width: 'fit-content', width: 'fit-content',
height: 'fit-content', height: 'fit-content',
}, { inplace: false }) });
} }
constructor() { constructor() {

View File

@ -125,7 +125,7 @@ export class FenetreRechercheTirage extends Application {
popOut: true, popOut: true,
dragDrop: [{ dragSelector: "a.content-link" }], dragDrop: [{ dragSelector: "a.content-link" }],
resizable: true resizable: true
}, { inplace: false }) });
} }
static async create() { static async create() {

View File

@ -147,14 +147,13 @@ export class DialogFatigueVoyage extends Dialog {
ChatMessage.create({ ChatMessage.create({
whisper: ChatUtility.getWhisperRecipientsAndGMs(it.actor.name), whisper: ChatUtility.getWhisperRecipientsAndGMs(it.actor.name),
content: await renderTemplate( content: await renderTemplate(
'systems/foundryvtt-reve-de-dragon/templates/voyage/chat-fatigue_voyage.hbs', 'systems/foundryvtt-reve-de-dragon/templates/voyage/chat-fatigue_voyage.hbs', foundry.utils.mergeObject(it,
foundry.utils.mergeObject(it,
{ {
parameters: this.parameters, parameters: this.parameters,
fatigueBase: fatigueBase, fatigueBase: fatigueBase,
perteFatigue: perteFatigue, perteFatigue: perteFatigue,
isVoyage: fatigueBase == this.parameters.nombreHeures * this.parameters.fatigueHoraire isVoyage: fatigueBase == this.parameters.nombreHeures * this.parameters.fatigueHoraire
}, { inplace: false }) })
), ),
}) })
await it.actor.santeIncDec("fatigue", perteFatigue) await it.actor.santeIncDec("fatigue", perteFatigue)

View File

@ -1,4 +1,3 @@
{{log 'chat-vente-item' this}}
<div class="post-item" data-transfer="{{transfer}}"> <div class="post-item" data-transfer="{{transfer}}">
<h3>{{#if alias}}{{alias}} propose: {{else}}Acheter {{/if}}{{item.name}}</h3> <h3>{{#if alias}}{{alias}} propose: {{else}}Acheter {{/if}}{{item.name}}</h3>
{{#if item.img}} {{#if item.img}}
@ -13,7 +12,7 @@
<hr> <hr>
<p> <p>
{{#unless quantiteIllimite}} {{#unless quantiteIllimite}}
<span>Lots disponibles: {{nbLots}}</span><br> <span>Lots disponibles: <span class="quantiteNbLots">{{quantiteNbLots}}</span></span><br>
{{/unless}} {{/unless}}
{{#if (gt tailleLot 1)}} {{#if (gt tailleLot 1)}}
<span>Lots de: <span class="tailleLot">{{tailleLot}}</span></span><br> <span>Lots de: <span class="tailleLot">{{tailleLot}}</span></span><br>
@ -23,9 +22,15 @@
<span class="prixLot">{{numberFormat prixLot decimals=2 sign=false}}</span> Sols</strong></span><br> <span class="prixLot">{{numberFormat prixLot decimals=2 sign=false}}</span> Sols</strong></span><br>
{{/if}} {{/if}}
</p> </p>
{{#if (or (gt nbLots 0) quantiteIllimite)}} {{#if (or (gt quantiteNbLots 0) quantiteIllimite)}}
<span class="chat-card-button-area"> <span class="chat-card-button-area">
<a class="button-acheter chat-card-button"> <a class="button-acheter chat-card-button"
data-jsondata='{{jsondata}}'
{{#if vendeurId}}data-vendeurId='{{vendeurId}}'{{/if}}
data-tailleLot="{{tailleLot}}"
data-quantiteNbLots="{{quantiteNbLots}}"
data-quantiteIllimite="{{#if quantiteIllimite}}true{{else}}false{{/if}}"
data-prixLot="{{prixLot}}">
{{#if (eq prixLot 0)}}Prendre{{else}}Acheter{{/if}}</a> {{#if (eq prixLot 0)}}Prendre{{else}}Acheter{{/if}}</a>
</span> </span>
{{/if}} {{/if}}

View File

@ -1,20 +1,22 @@
<span draggable="true"> <span draggable="true">
<a class="{{#if pack}}content-link{{else}}rdd-world-content-link{{/if}}"
data-id="{{id}}"
data-link=""
{{#if doctype}}
data-doctype="{{doctype}}"
data-type="{{doctype}}"
{{/if}}
{{#if pack}} {{#if pack}}
data-pack="{{pack}}" {{!-- draggable="true" --}}
<a class="content-link"
data-uuid="Compendium.{{pack}}.{{id}}" data-uuid="Compendium.{{pack}}.{{id}}"
{{/if}} > data-pack="{{pack}}"
{{#if doctype}}data-doctype="{{doctype}}"{{/if}}
data-id="{{id}}"
>
{{else}}
<a class="rdd-world-content-link"
{{#if doctype}}data-doctype="{{doctype}}"{{/if}}
data-id="{{id}}"
>
{{/if}}
{{#if img}} {{#if img}}
<img class="in-text-img" src="{{img}}" data-tooltip="{{name}}" /> <img class="in-text-img" src="{{img}}" data-tooltip="{{name}}" />
{{else}} {{else}}
<i class="fas fa-suitcase"></i> <i class="fas fa-suitcase"></i>
{{/if}} {{/if}}
{{name}} {{name}}</a>
</a>
</span> </span>

View File

@ -31,7 +31,7 @@
<label>{{#if quantiteIllimite}} <label>{{#if quantiteIllimite}}
pas de limite pas de limite
{{else}} {{else}}
{{nbLots}} {{quantiteNbLots}}
{{/if}}</label> {{/if}}</label>
</div> </div>
<div class="flexrow flex-group-left"> <div class="flexrow flex-group-left">
@ -41,7 +41,7 @@
</label> </label>
<div class="flexrow"> <div class="flexrow">
<input name="nombreLots" class="nombreLots flex-shrink number-x2" type="number" min="1" <input name="nombreLots" class="nombreLots flex-shrink number-x2" type="number" min="1"
{{#unless quantiteIllimite}} max="{{nbLots}}" {{/unless}} {{#unless quantiteIllimite}} max="{{quantiteNbLots}}" {{/unless}}
value="{{choix.nombreLots}}" value="{{choix.nombreLots}}"
data-dtype="Number" /> data-dtype="Number" />
</div> </div>

View File

@ -18,8 +18,8 @@
quantiteIllimite}}checked{{/if}} /> quantiteIllimite}}checked{{/if}} />
<label class="label-quantiteIllimite flex-shrink">disponibles</label> <label class="label-quantiteIllimite flex-shrink">disponibles</label>
{{/unless}} {{/unless}}
<input name="nbLots" class="nbLots flex-shrink number-x2" type="number" min="1" <input name="quantiteNbLots" class="quantiteNbLots flex-shrink number-x2" type="number" min="1"
max="{{maxLots}}" value="{{nbLots}}" data-dtype="Number" /> max="{{quantiteMaxLots}}" value="{{quantiteNbLots}}" data-dtype="Number" />
</div> </div>
</div> </div>
<div class="flexrow flex-group-left"> <div class="flexrow flex-group-left">