2020-05-21 21:48:20 +02:00
/ * *
* Extend the basic ActorSheet with some very simple modifications
* @ extends { ActorSheet }
* /
2020-05-22 22:37:02 +02:00
import { RdDUtility } from "./rdd-utility.js" ;
2020-11-10 13:53:51 +01:00
import { RdDEncaisser } from "./rdd-roll-encaisser.js" ;
2020-05-22 22:37:02 +02:00
2020-09-20 21:45:46 +02:00
/* -------------------------------------------- */
2020-05-22 00:48:43 +02:00
export class RdDActorSheet extends ActorSheet {
2020-05-21 21:48:20 +02:00
/** @override */
static get defaultOptions ( ) {
return mergeObject ( super . defaultOptions , {
2020-05-22 00:48:43 +02:00
classes : [ "rdd" , "sheet" , "actor" ] ,
template : "systems/foundryvtt-reve-de-dragon/templates/actor-sheet.html" ,
2020-07-27 16:27:41 +02:00
width : 640 ,
height : 720 ,
2020-08-14 22:24:35 +02:00
tabs : [ { navSelector : ".sheet-tabs" , contentSelector : ".sheet-body" , initial : "carac" } ] ,
2020-11-20 12:06:54 +01:00
dragDrop : [ { dragSelector : ".item-list .item" , dropSelector : null } ] ,
editCaracComp : false
2020-05-21 21:48:20 +02:00
} ) ;
}
/* -------------------------------------------- */
2020-05-22 19:28:01 +02:00
getData ( ) {
let data = super . getData ( ) ;
data . itemsByType = { } ;
for ( const item of data . items ) {
let list = data . itemsByType [ item . type ] ;
if ( ! list ) {
list = [ ] ;
data . itemsByType [ item . type ] = list ;
}
list . push ( item ) ;
}
2020-06-07 23:16:29 +02:00
// Competence per category
2020-05-22 19:28:01 +02:00
data . competenceByCategory = { } ;
2020-08-13 22:28:56 +02:00
let competenceXPTotal = 0 ;
2020-05-22 19:28:01 +02:00
if ( data . itemsByType . competence ) {
for ( const item of data . itemsByType . competence ) {
2020-06-07 23:16:29 +02:00
//console.log("Push...", item, item.data.categorie);
2020-05-22 19:28:01 +02:00
let list = data . competenceByCategory [ item . data . categorie ] ;
if ( ! list ) {
list = [ ] ;
data . competenceByCategory [ item . data . categorie ] = list ;
}
2020-08-14 22:24:35 +02:00
if ( ! RdDUtility . isTronc ( item . name ) ) // Ignorer les compétences 'troncs' à ce stade
competenceXPTotal += RdDUtility . computeCompetenceXPCost ( item )
2020-05-22 19:28:01 +02:00
list . push ( item ) ;
}
}
2020-08-14 22:24:35 +02:00
competenceXPTotal += RdDUtility . computeCompetenceTroncXP ( data . itemsByType . competence ) ;
2020-08-13 22:28:56 +02:00
data . data . competenceXPTotal = competenceXPTotal ;
//console.log("XP competence : ", competenceXPTotal);
// Compute current carac sum
let sum = 0 ;
Object . values ( data . data . carac ) . forEach ( carac => { if ( ! carac . derivee ) { sum += parseInt ( carac . value ) } } ) ;
data . data . caracSum = sum ;
2020-06-10 08:23:58 +02:00
// Force empty arme, at least for Esquive
if ( data . itemsByType . arme == undefined ) data . itemsByType . arme = [ ] ;
2020-11-23 20:40:56 +01:00
for ( const arme of data . itemsByType . arme ) {
2020-06-10 08:23:58 +02:00
arme . data . niveau = 0 ; // Per default, TODO to be fixed
for ( const melee of data . competenceByCategory . melee ) {
if ( melee . name == arme . data . competence )
arme . data . niveau = melee . data . niveau
}
2020-09-02 22:00:35 +02:00
for ( const tir of data . competenceByCategory . tir ) {
if ( tir . name == arme . data . competence )
arme . data . niveau = tir . data . niveau
}
for ( const lancer of data . competenceByCategory . lancer ) {
if ( lancer . name == arme . data . competence )
arme . data . niveau = lancer . data . niveau
}
2020-11-23 21:49:30 +01:00
}
// To avoid armour and so on...
data . data . combat = duplicate ( RdDUtility . checkNull ( data . itemsByType [ 'arme' ] ) ) ;
// Gestion des armes 1/2 mains
let arme2mains = [ ] ; // Tableau contenant la duplication des armes 1m/2m
for ( const arme of data . data . combat ) {
2020-11-23 20:40:56 +01:00
// Dupliquer les armes pouvant être à 1 main et 2 mains en patchant la compétence
if ( arme . data . unemain && arme . data . deuxmains ) {
let arme2main = duplicate ( arme ) ;
arme2main . data . competence = arme2main . data . competence . replace ( " 1 main" , " 2 mains" ) ; // Replace !
for ( const melee of data . competenceByCategory . melee ) {
if ( melee . name == arme2main . data . competence )
arme2main . data . niveau = melee . data . niveau
}
arme2mains . push ( arme2main ) ;
}
2020-09-02 22:00:35 +02:00
}
2020-11-23 21:49:30 +01:00
data . data . combat = data . data . combat . concat ( arme2mains ) ; // Merge all cases
data . data . combat = data . data . combat . sort ( ( a , b ) => { if ( a . name > b . name ) return 1 ; else return - 1 ; } ) ;
2020-06-10 08:23:58 +02:00
if ( data . competenceByCategory && data . competenceByCategory . melee ) {
//Specific case for Esquive and Corps à Corps
for ( const melee of data . competenceByCategory . melee ) {
if ( melee . name == "Esquive" )
2020-11-12 15:06:25 +01:00
data . data . combat . push ( { name : "Esquive" , data : { niveau : melee . data . niveau , description : "" , force : 6 , competence : "Esquive" , dommages : 0 } } ) ;
2020-06-10 08:23:58 +02:00
if ( melee . name == "Corps à corps" )
2020-11-12 15:06:25 +01:00
data . data . combat . push ( { name : "Corps à corps" , data : { niveau : melee . data . niveau , description : "" , force : 6 , competence : "Corps à corps" , dommages : data . data . attributs . plusdom . value } } ) ;
2020-06-07 23:16:29 +02:00
}
}
2020-06-12 22:46:04 +02:00
data . data . carac . taille . isTaille = true ; // To avoid button link;
2020-07-27 16:27:41 +02:00
data . data . nbLegeres = this . actor . GetNumberBlessures ( data . data . blessures . legeres . liste ) ;
data . data . nbGraves = this . actor . GetNumberBlessures ( data . data . blessures . graves . liste ) ;
data . data . nbCritiques = this . actor . GetNumberBlessures ( data . data . blessures . critiques . liste ) ;
2020-11-11 14:42:11 +01:00
// Mise à jour de l'encombrement total
this . actor . computeEncombrementTotal ( ) ;
2020-08-29 22:52:41 +02:00
2020-11-12 14:43:08 +01:00
// Common data
2020-05-22 19:28:01 +02:00
data . data . competenceByCategory = data . competenceByCategory ;
2020-11-11 14:42:11 +01:00
data . data . encombrementTotal = this . actor . encombrementTotal ;
2020-11-04 18:00:42 +01:00
data . data . isGM = game . user . isGM ;
2020-11-15 02:07:41 +01:00
data . ajustementsConditions = CONFIG . RDD . ajustementsConditions ;
data . difficultesLibres = CONFIG . RDD . difficultesLibres ;
2020-11-20 12:06:54 +01:00
// Gestion du lock/unlock des zones éditables (carac+compétences)
data . data . editCaracComp = this . options . editCaracComp ;
data . data . lockUnlockText = ( this . options . editCaracComp ) ? "Bloquer" : "Debloquer" ;
2020-11-11 11:43:13 +01:00
2020-11-12 14:43:08 +01:00
// low is normal, this the base used to compute the grid.
2020-11-18 20:16:59 +01:00
data . data . fatigue = {
malus : RdDUtility . calculMalusFatigue ( data . data . sante . fatigue . value , data . data . sante . endurance . max ) ,
html : "<table class='table-fatigue'>" + RdDUtility . makeHTMLfatigueMatrix ( data . data . sante . fatigue . value , data . data . sante . endurance . max ) . html ( ) + "</table>"
}
2020-11-18 16:57:58 +01:00
2020-11-20 12:06:54 +01:00
RdDUtility . filterItemsPerTypeForSheet ( data ) ;
data . data . sortReserve = data . data . reve . reserve . list ;
2020-11-18 16:57:58 +01:00
RdDUtility . buildArbreDeConteneur ( this , data ) ;
2020-11-12 14:43:08 +01:00
2020-05-22 19:28:01 +02:00
return data ;
}
/* -------------------------------------------- */
2020-11-10 13:53:51 +01:00
async displayDialogEncaisser ( ) {
2020-11-15 02:07:41 +01:00
let data = { ajustementsConditions : CONFIG . RDD . ajustementsConditions /* techniquement on peut encaisser à +20 */ } ;
2020-11-10 13:53:51 +01:00
let html = await renderTemplate ( 'systems/foundryvtt-reve-de-dragon/templates/dialog-roll-encaisser.html' , data ) ;
2020-11-14 20:18:06 +01:00
new RdDEncaisser ( html , this . actor ) . render ( true ) ;
2020-11-10 13:53:51 +01:00
}
2020-05-22 19:28:01 +02:00
2020-11-11 11:43:13 +01:00
/* -------------------------------------------- */
async _onDrop ( event ) {
2020-11-18 16:57:58 +01:00
RdDUtility . processItemDropEvent ( this , event ) ;
super . _onDrop ( event ) ;
2020-11-11 11:43:13 +01:00
}
2020-11-12 14:43:08 +01:00
2020-11-12 17:06:19 +01:00
/* -------------------------------------------- */
async confirmerSuppression ( li ) {
let itemId = li . data ( "item-id" ) ;
let d = new Dialog ( {
title : "Confirmer la suppression" ,
content : "<p>Etes vous certain de vouloir supprimer cet objet ?</p>" ,
buttons : {
delete : {
icon : '<i class="fas fa-check"></i>' ,
label : "Supprimer" ,
callback : ( ) => {
2020-11-16 09:41:46 +01:00
console . log ( "Delete : " , itemId ) ;
2020-11-12 17:06:19 +01:00
this . actor . deleteOwnedItem ( itemId ) ;
li . slideUp ( 200 , ( ) => this . render ( false ) ) ;
}
} ,
cancel : {
icon : '<i class="fas fa-times"></i>' ,
label : "Annuler"
}
} ,
default : "cancel" ,
} ) ;
d . render ( true ) ;
}
2020-11-10 13:53:51 +01:00
/* -------------------------------------------- */
2020-05-21 21:48:20 +02:00
/** @override */
activateListeners ( html ) {
super . activateListeners ( html ) ;
2020-06-12 11:47:41 +02:00
2020-05-21 21:48:20 +02:00
// Everything below here is only needed if the sheet is editable
if ( ! this . options . editable ) return ;
// Update Inventory Item
html . find ( '.item-edit' ) . click ( ev => {
const li = $ ( ev . currentTarget ) . parents ( ".item" ) ;
2020-11-05 20:23:16 +01:00
const item = this . actor . getOwnedItem ( li . data ( "item-id" ) ) ;
2020-05-21 21:48:20 +02:00
item . sheet . render ( true ) ;
} ) ;
2020-11-07 21:06:37 +01:00
2020-05-21 21:48:20 +02:00
// Delete Inventory Item
html . find ( '.item-delete' ) . click ( ev => {
const li = $ ( ev . currentTarget ) . parents ( ".item" ) ;
2020-11-12 17:06:19 +01:00
this . confirmerSuppression ( li ) ;
2020-05-21 21:48:20 +02:00
} ) ;
2020-11-07 21:06:37 +01:00
// Update Inventory Item
html . find ( '.encaisser-direct' ) . click ( ev => {
2020-11-10 13:53:51 +01:00
this . displayDialogEncaisser ( )
2020-11-07 21:06:37 +01:00
} ) ;
2020-07-27 16:27:41 +02:00
// Blessure control
html . find ( '.blessure-control' ) . click ( ev => {
const li = $ ( ev . currentTarget ) . parents ( ".item" ) ;
let btype = li . data ( "blessure-type" ) ;
let index = li . data ( 'blessure-index' ) ;
let active = $ ( ev . currentTarget ) . data ( 'blessure-active' ) ;
//console.log(btype, index, active);
this . actor . manageBlessureFromSheet ( btype , index , active ) . then ( this . render ( true ) ) ;
} ) ;
// Blessure data
html . find ( '.blessures-soins' ) . change ( ev => {
const li = $ ( ev . currentTarget ) . parents ( ".item" ) ;
let btype = li . data ( 'blessure-type' ) ;
let index = li . data ( 'blessure-index' ) ;
let psoins = li . find ( 'input[name=premiers_soins]' ) . val ( ) ;
let pcomplets = li . find ( 'input[name=soins_complets]' ) . val ( ) ;
let jours = li . find ( 'input[name=jours]' ) . val ( ) ;
let loc = li . find ( 'input[name=localisation]' ) . val ( ) ;
//console.log(btype, index, psoins, pcomplets, jours, loc);
this . actor . setDataBlessureFromSheet ( btype , index , psoins , pcomplets , jours , loc ) . then ( this . render ( true ) ) ;
2020-07-20 12:02:07 +02:00
} ) ;
2020-06-23 23:34:12 +02:00
// Equip Inventory Item
html . find ( '.item-equip' ) . click ( ev => {
const li = $ ( ev . currentTarget ) . parents ( ".item" ) ;
2020-11-05 20:23:16 +01:00
this . actor . equiperObjet ( li . data ( "item-id" ) ) ;
2020-06-23 23:34:12 +02:00
this . render ( true ) ;
} ) ;
2020-06-12 22:46:04 +02:00
// Roll Carac
html . find ( '.carac-label a' ) . click ( ( event ) => {
let caracName = event . currentTarget . attributes . name . value ;
this . actor . rollCarac ( caracName . toLowerCase ( ) ) ;
} ) ;
2020-05-22 22:37:02 +02:00
// Roll Skill
html . find ( '.competence-label a' ) . click ( ( event ) => {
let compName = event . currentTarget . text ;
this . actor . rollCompetence ( compName ) ;
} ) ;
2020-11-15 12:26:19 +01:00
// Points de reve actuel
html . find ( '.ptreve-actuel a' ) . click ( ( event ) => {
this . actor . rollCarac ( 'reveActuel' ) ;
} ) ;
// Roll Weapon1
2020-06-07 23:16:29 +02:00
html . find ( '.arme-label a' ) . click ( ( event ) => {
let armeName = event . currentTarget . text ;
2020-11-23 20:40:56 +01:00
let competenceName = event . currentTarget . attributes [ 'data-competence-name' ] . value ;
this . actor . rollArme ( armeName , competenceName ) ;
2020-06-07 23:16:29 +02:00
} ) ;
2020-11-14 20:46:39 +01:00
// Display TMR, normal
html . find ( '.visu-tmr a' ) . click ( ( event ) => {
this . actor . displayTMR ( "visu" ) ;
} ) ;
2020-07-25 10:29:28 +02:00
// Display TMR, normal
2020-07-24 10:51:11 +02:00
html . find ( '.monte-tmr a' ) . click ( ( event ) => {
2020-11-14 20:46:39 +01:00
this . actor . displayTMR ( "normal" ) ;
2020-07-25 10:29:28 +02:00
} ) ;
// Display TMR, fast
html . find ( '.monte-tmr-rapide a' ) . click ( ( event ) => {
2020-11-14 20:46:39 +01:00
this . actor . displayTMR ( "rapide" ) ;
2020-07-24 10:51:11 +02:00
} ) ;
2020-11-16 04:32:42 +01:00
html . find ( '.dormir-une-heure' ) . click ( ( event ) => {
this . actor . dormir ( 1 ) ;
} ) ;
2020-07-24 10:51:11 +02:00
// Display info about queue
html . find ( '.queuesouffle-label a' ) . click ( ( event ) => {
2020-07-27 16:27:41 +02:00
let myID = event . currentTarget . attributes [ 'data-item-id' ] . value ;
2020-07-24 10:51:11 +02:00
const item = this . actor . getOwnedItem ( myID ) ;
item . sheet . render ( true ) ;
} ) ;
// Display info about queue
2020-07-05 21:45:25 +02:00
html . find ( '.sort-label a' ) . click ( ( event ) => {
2020-07-24 10:51:11 +02:00
let myID = event . currentTarget . attributes [ 'data-id' ] . value ;
const item = this . actor . getOwnedItem ( myID ) ;
item . sheet . render ( true ) ;
2020-07-05 21:45:25 +02:00
} ) ;
2020-07-24 10:51:11 +02:00
2020-11-20 12:06:54 +01:00
if ( this . options . editCaracComp ) {
// On carac change
html . find ( '.carac-value' ) . change ( ( event ) => {
let caracName = event . currentTarget . name . replace ( ".value" , "" ) . replace ( "data.carac." , "" ) ;
//console.log("Value changed :", event, caracName);
this . actor . updateCarac ( caracName , parseInt ( event . target . value ) ) ;
} ) ;
// On competence change
html . find ( '.competence-value' ) . change ( ( event ) => {
let compName = event . currentTarget . attributes . compname . value ;
//console.log("Competence changed :", compName);
this . actor . updateCompetence ( compName , parseInt ( event . target . value ) ) ;
} ) ;
// On competence xp change
html . find ( '.competence-xp' ) . change ( ( event ) => {
let compName = event . currentTarget . attributes . compname . value ;
this . actor . updateCompetenceXP ( compName , parseInt ( event . target . value ) ) ;
} ) ;
}
// Gestion du bouton lock/unlock
html . find ( '.lock-unlock-sheet a' ) . click ( ( event ) => {
this . options . editCaracComp = ! this . options . editCaracComp ;
this . render ( true ) ;
} ) ;
2020-07-14 22:19:29 +02:00
// On pts de reve change
html . find ( '.pointsreve-value' ) . change ( ( event ) => {
let reveValue = event . currentTarget . value ;
let reve = duplicate ( this . actor . data . data . reve . reve ) ;
reve . value = reveValue ;
2020-07-28 09:20:01 +02:00
this . actor . update ( { "data.reve.reve" : reve } ) ;
2020-06-01 23:50:10 +02:00
} ) ;
2020-11-16 03:52:34 +01:00
// On seuil de reve change
html . find ( '.seuil-reve-value' ) . change ( ( event ) => {
console . log ( "seuil-reve-value" , event . currentTarget )
this . actor . setPointsDeSeuil ( event . currentTarget . value ) ;
} ) ;
2020-07-14 22:19:29 +02:00
2020-08-29 22:52:41 +02:00
// On stress change
html . find ( '.compteur-edit' ) . change ( ( event ) => {
let fieldName = event . currentTarget . attributes . name . value ;
this . actor . updateCompteurValue ( fieldName , parseInt ( event . target . value ) ) ;
} ) ;
html . find ( '#stress-test' ) . click ( ( event ) => {
this . actor . stressTest ( ) ;
this . render ( true ) ;
} ) ;
2020-05-28 23:36:09 +02:00
2020-06-23 23:34:12 +02:00
html . find ( '#vie-plus' ) . click ( ( event ) => {
2020-05-28 23:36:09 +02:00
this . actor . santeIncDec ( "vie" , 1 ) ;
this . render ( true ) ;
} ) ;
2020-06-23 23:34:12 +02:00
html . find ( '#vie-moins' ) . click ( ( event ) => {
2020-05-28 23:36:09 +02:00
this . actor . santeIncDec ( "vie" , - 1 ) ;
this . render ( true ) ;
} ) ;
2020-06-23 23:34:12 +02:00
html . find ( '#endurance-plus' ) . click ( ( event ) => {
2020-05-28 23:36:09 +02:00
this . actor . santeIncDec ( "endurance" , 1 ) ;
this . render ( true ) ;
} ) ;
2020-06-23 23:34:12 +02:00
html . find ( '#endurance-moins' ) . click ( ( event ) => {
2020-05-28 23:36:09 +02:00
this . actor . santeIncDec ( "endurance" , - 1 ) ;
this . render ( true ) ;
} ) ;
2020-11-18 18:37:15 +01:00
html . find ( '#ptreve-actuel-plus' ) . click ( ( event ) => {
this . actor . updatePointsDeReve ( 1 ) ;
this . render ( true ) ;
} ) ;
2020-11-17 19:29:18 +01:00
html . find ( '#ptreve-actuel-moins' ) . click ( ( event ) => {
this . actor . updatePointsDeReve ( - 1 ) ;
this . render ( true ) ;
} ) ;
2020-06-23 23:34:12 +02:00
html . find ( '#fatigue-plus' ) . click ( ( event ) => {
2020-05-28 23:36:09 +02:00
this . actor . santeIncDec ( "fatigue" , 1 ) ;
this . render ( true ) ;
} ) ;
2020-06-23 23:34:12 +02:00
html . find ( '#fatigue-moins' ) . click ( ( event ) => {
2020-05-28 23:36:09 +02:00
this . actor . santeIncDec ( "fatigue" , - 1 ) ;
this . render ( true ) ;
} ) ;
2020-05-21 21:48:20 +02:00
}
2020-05-28 23:36:09 +02:00
2020-05-21 21:48:20 +02:00
/* -------------------------------------------- */
/** @override */
setPosition ( options = { } ) {
const position = super . setPosition ( options ) ;
const sheetBody = this . element . find ( ".sheet-body" ) ;
const bodyHeight = position . height - 192 ;
sheetBody . css ( "height" , bodyHeight ) ;
return position ;
}
/* -------------------------------------------- */
/** @override */
_updateObject ( event , formData ) {
// Update the Actor
return this . object . update ( formData ) ;
}
}