Affichage du contenu d'un conteneur

Les actions qui modifient le contenu doivent forcer un render
This commit is contained in:
Vincent Vandemeulebrouck
2021-12-05 01:50:09 +01:00
parent ef56b58d72
commit db0f8e50d2
5 changed files with 185 additions and 118 deletions

View File

@ -289,10 +289,10 @@ export class RdDActor extends Actor {
return etatGeneral;
}
/* -------------------------------------------- */
getActivePoisons( ) {
return duplicate( this.data.items.filter( item => item.type == 'poison' && item.data.data.active) );
getActivePoisons() {
return duplicate(this.data.items.filter(item => item.type == 'poison' && item.data.data.active));
}
/* -------------------------------------------- */
getMalusArmure() {
return Misc.toInt(Misc.templateData(this).attributs?.malusarmure?.value);
@ -313,7 +313,7 @@ export class RdDActor extends Actor {
return Misc.templateData(this).compteurs.surenc?.value ?? 0;
}
/* -------------------------------------------- */
getCompetence(idOrName, options={}) {
getCompetence(idOrName, options = {}) {
return RdDItemCompetence.findCompetence(this.data.items, idOrName, options);
}
@ -338,7 +338,7 @@ export class RdDActor extends Actor {
getItemOfType(idOrName, type) {
return this.data.items.find(it => it.id == idOrName && it.type == type)
?? Misc.findFirstLike(idOrName, this.data.items,{filter: it => it.type == type, description: type});
?? Misc.findFirstLike(idOrName, this.data.items, { filter: it => it.type == type, description: type });
}
getMonnaie(id) {
@ -931,7 +931,7 @@ export class RdDActor extends Actor {
const niveau = Number(compData.data.niveau);
const stressTransforme = Misc.data(this).data.compteurs.experience.value;
const xpRequis = RdDItemCompetence.getCompetenceNextXp(niveau) - compData.data.xp;
if (stressTransforme <= 0 || niveau >= compData.data.niveau_archetype || xpRequis <=0) {
if (stressTransforme <= 0 || niveau >= compData.data.niveau_archetype || xpRequis <= 0) {
ui.notifications.info(`La compétence ne peut pas augmenter!
stress disponible: ${stressTransforme}
expérience requise: ${xpRequis}
@ -941,7 +941,7 @@ export class RdDActor extends Actor {
}
const xpUtilise = Math.min(stressTransforme, xpRequis);
const stressTransformeRestant = Math.max(0, stressTransforme - xpUtilise);
const gainNiveau = xpUtilise>=xpRequis ? 1 : 0;
const gainNiveau = xpUtilise >= xpRequis ? 1 : 0;
await this.update({ "data.compteurs.experience.value": stressTransformeRestant });
const nouveauNiveau = niveau + gainNiveau;
@ -949,7 +949,7 @@ export class RdDActor extends Actor {
"data.xp": Math.max(compData.data.xp - xpRequis, 0),
"data.niveau": nouveauNiveau,
});
this.updateExperienceLog('Dépense stress', xpUtilise, `Stress en ${competence.name} ${gainNiveau? "pour passer à "+nouveauNiveau : ""}`);
this.updateExperienceLog('Dépense stress', xpUtilise, `Stress en ${competence.name} ${gainNiveau ? "pour passer à " + nouveauNiveau : ""}`);
}
/* -------------------------------------------- */
@ -1046,7 +1046,7 @@ export class RdDActor extends Actor {
/* -------------------------------------------- */
async updateCompteurValue(fieldName, fieldValue, raison = 'Inconnue') {
await this.update({ [`data.compteurs.${fieldName}.value`]: fieldValue });
await this.addStressExperienceLog(fieldName, fieldValue, 'forcé: '+raison);
await this.addStressExperienceLog(fieldName, fieldValue, 'forcé: ' + raison);
}
/* -------------------------------------------- */
@ -1067,11 +1067,11 @@ export class RdDActor extends Actor {
distribuerStress(compteur, stress, motif) {
if (game.user.isGM && this.hasPlayerOwner && this.isPersonnage()) {
switch (compteur) {
case 'stress': case 'experience':
const message = `${this.name} a reçu ${stress} points ${compteur == 'stress' ? "de stress" : "d'expérience"} (raison : ${motif})`;
this.addCompteurValue(compteur, stress, motif);
ui.notifications.info(message);
game.users.players.filter(player => player.active && player.character?.id == this.id)
case 'stress': case 'experience':
const message = `${this.name} a reçu ${stress} points ${compteur == 'stress' ? "de stress" : "d'expérience"} (raison : ${motif})`;
this.addCompteurValue(compteur, stress, motif);
ui.notifications.info(message);
game.users.players.filter(player => player.active && player.character?.id == this.id)
.forEach(player => ChatUtility.notifyUser(player.id, 'info', message));
}
}
@ -1139,7 +1139,7 @@ export class RdDActor extends Actor {
/* -------------------------------------------- */
/** Supprime un item d'un conteneur, sur la base
* de leurs ID */
async enleverDeConteneur(item, conteneur, objetVersConteneur) {
async enleverDeConteneur(item, conteneur, onEnleverDeConteneur) {
if (conteneur?.isConteneur()) {
let data2use = duplicate(Misc.data(conteneur));
let contenu = data2use.data.contenu;
@ -1150,20 +1150,20 @@ export class RdDActor extends Actor {
}
item.data.estContenu = false;
await this.updateEmbeddedDocuments('Item', [data2use]);
delete objetVersConteneur[item.id];
onEnleverDeConteneur();
}
}
/* -------------------------------------------- */
/** Ajoute un item dans un conteneur, sur la base
* de leurs ID */
async ajouterDansConteneur(item, conteneur, objetVersConteneur) {
async ajouterDansConteneur(item, conteneur, onAjouterDansConteneur) {
if (conteneur?.isConteneur()) {
let data2use = duplicate(Misc.data(conteneur));
data2use.data.contenu.push(item.id);
item.data.estContenu = true;
await this.updateEmbeddedDocuments('Item', [data2use]);
objetVersConteneur[item.id] = conteneur.id;
onAjouterDansConteneur(conteneur.id);
}
}
@ -1185,27 +1185,28 @@ export class RdDActor extends Actor {
}
}
async processDropItem(event, dragData, objetVersConteneur) {
console.log("DRAG", this.id, dragData);
const itemId = dragData.id || dragData.data._id;
if (dragData.actorId && dragData.actorId != this.id) {
console.log("Moving objects", dragData);
this.moveItemsBetweenActors(itemId, dragData.actorId);
async processDropItem(params, onEnleverConteneur, onAjouterDansConteneur) {
const targetActorId = this.id;
const sourceActorId = params.sourceActorId;
const itemId = params.itemId;
const destId = params.destId;
const srcId = params.srcId;
if (sourceActorId && sourceActorId != targetActorId) {
console.log("Moving objects", sourceActorId, targetActorId, itemId);
this.moveItemsBetweenActors(itemId, sourceActorId);
return false;
}
let result = true;
const destId = $(event.target).parents(".item").attr("data-item-id");
const item = this.getObjet(itemId);
if (item?.isEquipement() && dragData.actorId == this.id) {
if (item?.isEquipement() && sourceActorId == targetActorId) {
// rangement
const srcId = objetVersConteneur[itemId];
if (srcId != destId && itemId != destId) { // déplacement de l'objet
const dest = this.getObjet(destId);
const src = this.getObjet(srcId);
// changer de conteneur
if (this.conteneurPeutContenir(dest, item)) {
await this.enleverDeConteneur(item, src, objetVersConteneur);
await this.ajouterDansConteneur(item, dest, objetVersConteneur);
await this.enleverDeConteneur(item, src, params.onEnleverConteneur);
await this.ajouterDansConteneur(item, dest, params.onAjouterDansConteneur);
}
else if (dest?.isEquipementSimilaire(item)) {
await this.regrouperEquipementsSimilaires(item, dest);
@ -1572,7 +1573,7 @@ export class RdDActor extends Actor {
}
/* -------------------------------------------- */
async finDeRound(options = {terminer:false}) {
async finDeRound(options = { terminer: false }) {
for (let effect of this.getActiveEffects()) {
if (effect.duration.type !== 'none' && (effect.duration.remaining <= 0 || options.terminer)) {
if (effect.data.origin) {
@ -1584,11 +1585,11 @@ export class RdDActor extends Actor {
ChatMessage.create({ content: `${this.name} n'est plus ${Misc.lowerFirst(game.i18n.localize(effect.data.label))} !` });
}
}
if ( this.type == 'personnage') {
if (this.type == 'personnage') {
// Gestion blessure graves : -1 pt endurance
let nbGraves = this.countBlessuresNonSoigneeByName( 'graves');
if ( nbGraves > 0) {
await this.santeIncDec("endurance", -1 );
let nbGraves = this.countBlessuresNonSoigneeByName('graves');
if (nbGraves > 0) {
await this.santeIncDec("endurance", -1);
}
}
}
@ -1598,7 +1599,7 @@ export class RdDActor extends Actor {
if (this.isEntiteCauchemar()) {
return;
}
if (!game.combat && sonne){
if (!game.combat && sonne) {
ui.notifications.info("Le personnage est hors combat, il ne reste donc pas sonné");
return;
}
@ -1629,7 +1630,7 @@ export class RdDActor extends Actor {
countBlessuresNonSoigneeByName(name) {
let blessures = Misc.templateData(this).blessures[name].liste;
return blessures.filter( b => b.active && !b.psdone).length;
return blessures.filter(b => b.active && !b.psdone).length;
}
/* -------------------------------------------- */
@ -1809,7 +1810,7 @@ export class RdDActor extends Actor {
/* -------------------------------------------- */
async jetDeMoral(situation, messageReussi = undefined, messageManque = undefined) {
const jetMoral = await this._jetDeMoral(situation);
const finMessage = (jetMoral.succes ? messageReussi : messageManque) ?? (jetMoral.ajustement == 0 ? "Vous gardez votre moral": jetMoral.ajustement > 0 ? "Vous gagnez du moral" : "Vous perdez du moral");
const finMessage = (jetMoral.succes ? messageReussi : messageManque) ?? (jetMoral.ajustement == 0 ? "Vous gardez votre moral" : jetMoral.ajustement > 0 ? "Vous gagnez du moral" : "Vous perdez du moral");
ChatMessage.create({
whisper: ChatUtility.getWhisperRecipientsAndGMs(game.user.name),
content: `${finMessage} - jet ${jetMoral.succes ? "réussi" : "manqué"} en situation ${situation} (${jetMoral.jet}/${jetMoral.difficulte}).`
@ -1893,23 +1894,20 @@ export class RdDActor extends Actor {
}
/* -------------------------------------------- */
async actionItem(item) {
async actionItem(item, onActionItem = async ()=>{}) {
if (!item.getActionPrincipale()) return;
switch (Misc.data(item).type) {
case 'nourritureboisson': return await this.actionNourritureboisson(item);
case 'potion': return await this.actionPotion(item);
case 'nourritureboisson': return await this.actionNourritureboisson(item, onActionItem);
case 'potion': return await this.consommerPotion(item, onActionItem);
case 'livre': return await this.actionLire(item);
}
}
async actionNourritureboisson(item) {
const dialog = await DialogConsommer.create(this, item);
async actionNourritureboisson(item, onActionItem) {
const dialog = await DialogConsommer.create(this, item, onActionItem);
dialog.render(true);
}
async actionPotion(item) {
return await this.consommerPotion(item)
}
async actionLire(item) {
const tache = await this.creerTacheDepuisLivre(item, { renderSheet: false });
if (tache) {
@ -1979,7 +1977,7 @@ export class RdDActor extends Actor {
}
/* -------------------------------------------- */
async manger(item, doses, options = { diminuerQuantite: true}) {
async manger(item, doses, options = { diminuerQuantite: true }) {
const sust = Misc.templateData(item).sust;
if (sust > 0) {
await this.updateCompteurValue('sust', Misc.keepDecimals(Misc.templateData(this).compteurs.sust.value + sust * doses, 1));
@ -2478,14 +2476,14 @@ export class RdDActor extends Actor {
RdDResolutionTable.displayRollData(rollData, this, 'chat-resultat-general.html');
}
async rollCaracCompetence(caracName, compName, diff, options = { title: "", apprecier: false}) {
async rollCaracCompetence(caracName, compName, diff, options = { title: "", apprecier: false }) {
const carac = this.getCaracByName(caracName);
if (!carac) {
ui.notifications.warn(`${this.name} n'a pas de caractéristique correspondant à ${caracName}`)
return;
}
const competence = Misc.data(this.getCompetence(compName));
if (options.apprecier && competence){
if (options.apprecier && competence) {
const minQualite = Math.max(0, competence.data.niveau);
if (diff <= minQualite) {
ui.notifications.info(`${this.name} a un niveau ${competence.data.niveau} en ${competence.name}, trop élevé pour apprécier la qualité de ${diff}`)
@ -2623,7 +2621,7 @@ export class RdDActor extends Actor {
} else {
rollData.tache.data.nb_jet_echec++;
}
rollData.tache.data.tentatives = rollData.tache.data.nb_jet_succes+rollData.tache.data.nb_jet_echec;
rollData.tache.data.tentatives = rollData.tache.data.nb_jet_succes + rollData.tache.data.nb_jet_echec;
this.updateEmbeddedDocuments('Item', [rollData.tache]);
this.santeIncDec("fatigue", rollData.tache.data.fatigue);
@ -3107,8 +3105,8 @@ export class RdDActor extends Actor {
case 'chance-actuelle': case 'chance actuelle':
return carac.chance;
}
let entry = Misc.findFirstLike(name, Object.entries(carac), {mapper:it => it[1].label, description: 'caractéristique'});
return entry.length>0 ? carac[entry[0]] : undefined;
let entry = Misc.findFirstLike(name, Object.entries(carac), { mapper: it => it[1].label, description: 'caractéristique' });
return entry.length > 0 ? carac[entry[0]] : undefined;
}
/* -------------------------------------------- */
@ -3183,7 +3181,7 @@ export class RdDActor extends Actor {
rollArme(arme) {
let competence = Misc.data(this.getCompetence(arme.data.competence));
if (arme || (competence.type == 'competencecreature' && competence.data.iscombat)) {
if ( competence.data.ispossession ) {
if (competence.data.ispossession) {
RdDPossession.managePosession(this, competence);
} else {
RdDCombat.createUsingTarget(this)?.attaque(competence, arme);
@ -3347,16 +3345,16 @@ export class RdDActor extends Actor {
// Chaque dé fait au minmum la difficulté libre
if (ReglesOptionelles.isUsing('degat-minimum-malus-libre')) {
if ( rollData.diffLibre < 0 ) {
if (rollData.diffLibre < 0) {
let valeurMin = Math.abs(rollData.diffLibre);
formula += "min"+valeurMin;
formula += "min" + valeurMin;
}
}
// Chaque dé fait au minmum la difficulté libre
if (ReglesOptionelles.isUsing('degat-ajout-malus-libre')) {
if ( rollData.diffLibre < 0 ) {
if (rollData.diffLibre < 0) {
let valeurMin = Math.abs(rollData.diffLibre);
formula += "+"+valeurMin;
formula += "+" + valeurMin;
}
}
@ -3364,17 +3362,17 @@ export class RdDActor extends Actor {
// 1 dé fait au minmum la difficulté libre
if (ReglesOptionelles.isUsing('degat-minimum-malus-libre-simple')) {
if ( rollData.diffLibre < 0 ) {
if (rollData.diffLibre < 0) {
let valeurMin = Math.abs(rollData.diffLibre);
if ( roll.terms[0].results[0].result < valeurMin) {
if (roll.terms[0].results[0].result < valeurMin) {
roll.terms[0].results[0].result = valeurMin;
} else if (roll.terms[0].results[1].result < valeurMin) {
roll.terms[0].results[1].result = valeurMin;
}
roll._total = roll.terms[0].results[0].result + roll.terms[0].results[1].result;
}
}
}
const armure = await this.computeArmure(rollData);
const jetTotal = roll.total + rollData.dmg.total - armure;
@ -3683,7 +3681,7 @@ export class RdDActor extends Actor {
return;
}
if (!Misc.isUniqueConnectedGM()) {
RdDActor.remoteActorCall({actorId: achat.vendeurId ?? achat.acheteurId, method: 'achatVente', args: [achat]});
RdDActor.remoteActorCall({ actorId: achat.vendeurId ?? achat.acheteurId, method: 'achatVente', args: [achat] });
return;
}
@ -3701,7 +3699,7 @@ export class RdDActor extends Actor {
if (acheteur) {
let resteAcheteur = await acheteur.depenser(coutDeniers);
if (resteAcheteur < 0) {
ChatUtility.notifyUser(achat.userId, 'warn', `Vous n'avez pas assez d'argent pour payer ${Math.ceil(coutDeniers/100)} sols !`);
ChatUtility.notifyUser(achat.userId, 'warn', `Vous n'avez pas assez d'argent pour payer ${Math.ceil(coutDeniers / 100)} sols !`);
return;
}
}
@ -3726,9 +3724,9 @@ export class RdDActor extends Actor {
type: vente.item.type,
img: vente.item.img,
name: vente.item.name,
data: mergeObject(vente.item.data, {quantite: isItemEmpilable ? achat.quantiteTotal : undefined}),
data: mergeObject(vente.item.data, { quantite: isItemEmpilable ? achat.quantiteTotal : undefined }),
}
let listeAchat = isItemEmpilable ? [achatData] : Array.from({length: achat.quantiteTotal}, (_, i) => achatData)
let listeAchat = isItemEmpilable ? [achatData] : Array.from({ length: achat.quantiteTotal }, (_, i) => achatData)
let items = await acheteur.createEmbeddedDocuments("Item", listeAchat)
if (achat.choix.consommer && vente.item.type == 'nourritureboisson') {
achat.choix.doses = achat.choix.nombreLots;
@ -3742,7 +3740,7 @@ export class RdDActor extends Actor {
chatAchatItem.quantiteTotal = achat.quantiteTotal;
ChatMessage.create({
user: achat.userId,
speaker: {alias: (acheteur ?? vendeur).name} ,
speaker: { alias: (acheteur ?? vendeur).name },
whisper: ChatUtility.getWhisperRecipientsAndGMs(this.name),
content: await renderTemplate('systems/foundryvtt-reve-de-dragon/templates/chat-achat-item.html', chatAchatItem)
});
@ -3953,7 +3951,7 @@ export class RdDActor extends Actor {
potionData.guerisonMinutes = potionData.guerisonData.pointsConsommes * 5;
}
}
if (!potionData.data.magique || potionData.rolled.isSuccess) {
if (!potionData.data.magique || potionData.rolled.isSuccess) {
this.bonusRecuperationPotion = potionData.data.herbeBonus;
}
ChatMessage.create({
@ -4058,7 +4056,7 @@ export class RdDActor extends Actor {
}
/* -------------------------------------------- */
async consommerPotion(potion) {
async consommerPotion(potion, onActionItem = async () => {}) {
const potionData = Misc.data(potion);
if (potionData.data.categorie.includes('Soin')) {
@ -4068,7 +4066,8 @@ export class RdDActor extends Actor {
} else {
this.consommerPotionGenerique(potionData);
}
this.diminuerQuantiteObjet(potion.id, 1, { supprimerSiZero: potionData.supprimer });
await this.diminuerQuantiteObjet(potion.id, 1, { supprimerSiZero: potionData.supprimer });
await onActionItem()
}
/* -------------------------------------------- */
@ -4119,7 +4118,7 @@ export class RdDActor extends Actor {
}
enleverActiveEffectById(id) {
if (game.user.isGM){
if (game.user.isGM) {
const existing = this.getEffectById(id);
if (existing) {
existing.delete();
@ -4128,7 +4127,7 @@ export class RdDActor extends Actor {
}
/* -------------------------------------------- */
enleverTousLesEffets() {
if (game.user.isGM){
if (game.user.isGM) {
this.deleteEmbeddedDocuments('ActiveEffect', this.getActiveEffects().map(it => it.id));
}
}