Enhance armes+armures

This commit is contained in:
2024-09-13 22:14:21 +02:00
parent 9c93134d1c
commit 029ad04e26
28 changed files with 423 additions and 108 deletions

View File

@ -48,6 +48,9 @@ export class TeDeumActorPJSheet extends ActorSheet {
maladies: this.actor.getMaladies(),
poisons: this.actor.getPoisons(),
combat: this.actor.prepareCombat(),
bonusDegats: this.actor.getBonusDegats(),
pointsArmuresLourdes: this.actor.getNbArmures(),
nbArmuresLourdes: this.actor.getNbArmuresLourdesActuel(),
santeModifier: this.actor.getSanteModifier(),
description: await TextEditor.enrichHTML(this.object.system.description, { async: true }),
notes: await TextEditor.enrichHTML(this.object.system.notes, { async: true }),

View File

@ -86,7 +86,16 @@ export class TeDeumActor extends Actor {
getNbActions() {
return game.system.tedeum.config.ACTIONS_PAR_TOUR[this.system.caracteristiques.adresse.value]
}
getNbArmuresLourdesActuel() {
let armures = this.getArmures()
let nb = 0
for (let armure of armures) {
if (armure.system.equipe) {
nb += armure.system.coutArmureLourde
}
}
return nb
}
/* -------------------------------------------- */
getCompetences() {
let comp = foundry.utils.duplicate(this.items.filter(item => item.type == 'competence') || [])
@ -156,7 +165,7 @@ export class TeDeumActor extends Actor {
modTotal += maladieDef.modifier
}
}
let simples= foundry.utils.duplicate(this.items.filter(item => item.type == 'simple') || [])
let simples = foundry.utils.duplicate(this.items.filter(item => item.type == 'simple') || [])
for (let c of simples) {
if (c.system.appliquee) {
let simpleDef = game.system.tedeum.config.virulencePoison[c.system.virulence]
@ -170,11 +179,43 @@ export class TeDeumActor extends Actor {
}
// Si le nombre de blessures est supérieur au score d'endurance, alors malus supplémentaire
let endurance = this.items.find(item => item.type == "competence" && item.name.toLowerCase() == "endurance")
if ( blessures.length > endurance.system.score) {
if (blessures.length > endurance.system.score) {
modTotal += -1
}
}
return modTotal
}
/* -------------------------------------------- */
async appliquerDegats(rollData) {
let combat = this.prepareCombat()
rollData.defenderName = this.name
let touche = combat[rollData.loc.id].touche
if (rollData.degats > 0 && rollData.degats > touche) {
let diff = rollData.degats - touche
for (let bId in game.system.tedeum.config.blessures) {
let blessure = game.system.tedeum.config.blessures[bId]
if (diff >= blessure.degatsMin && diff <= blessure.degatsMax) {
// Create a new blessure object
let blessureObj = {
name: blessure.label,
type: "blessure",
system: {
typeBlessure: bId,
localisation: rollData.loc.id,
appliquee: true,
description: "Blessure infligée par un coup de " + rollData.arme.name + " de " + rollData.alias,
}
}
rollData.blessure = blessureObj
this.createEmbeddedDocuments('Item', [blessureObj]);
}
}
}
// Display the relevant chat message
let msg = await TeDeumUtility.createChatWithRollMode(rollData.alias, {
content: await renderTemplate(`systems/fvtt-te-deum/templates/chat/chat-blessure-result.hbs`, rollData)
})
await msg.setFlag("world", "te-deum-rolldata", rollData)
}
/* -------------------------------------------- */
updateCarac(c, key) {
@ -188,7 +229,7 @@ export class TeDeumActor extends Actor {
/* -------------------------------------------- */
prepareCaracteristiques() {
let carac = foundry.utils.deepClone(this.system.caracteristiques)
let carac = foundry.utils.deepClone(this.system.caracteristiques)
for (let key in carac) {
let c = carac[key]
this.updateCarac(c, key)
@ -199,7 +240,7 @@ export class TeDeumActor extends Actor {
prepareProvidence() {
let providence = foundry.utils.deepClone(this.system.providence)
providence.name = "Providence"
providence.qualite = game.system.tedeum.config.providence[providence.value].labelM
providence.qualite = game.system.tedeum.config.providence[providence.value].labelM
providence.dice = game.system.tedeum.config.providence[providence.value].diceValue
return providence
}
@ -234,13 +275,13 @@ export class TeDeumActor extends Actor {
modifyProvidence(value) {
let providence = foundry.utils.duplicate(this.system.providence)
providence.value = Math.min(Math.max(providence.value + value, 0), 6)
this.update( { "system.providence": providence } )
this.update({ "system.providence": providence })
}
/* -------------------------------------------- */
modifyXP(key, value) {
let xp = this.system.caracteristiques[key].experience
xp = Math.max(xp + value, 0)
this.update( { [`system.caracteristiques.${key}.experience`]: xp } )
this.update({ [`system.caracteristiques.${key}.experience`]: xp })
}
/* -------------------------------------------- */
@ -253,7 +294,7 @@ export class TeDeumActor extends Actor {
let caracDice = game.system.tedeum.config.descriptionValeur[this.system.caracteristiques[c.system.caracteristique].value].dice
c.system.formula = caracDice + "+" + c.system.score
})
return foundry.utils.deepClone( comp || {} )
return foundry.utils.deepClone(comp || {})
}
/* -------------------------------------------- */
@ -279,10 +320,55 @@ export class TeDeumActor extends Actor {
/* -------------------------------------------- */
async equipItem(itemId) {
let item = this.items.find(item => item.id == itemId)
if (!this.checkArmure(item)) {
return
}
let update = { _id: item.id, "system.equipe": !item.system.equipe };
await this.updateEmbeddedDocuments('Item', [update]); // Updates one EmbeddedEntity
}
/* ------------------------------------------- */
checkArmure(item) {
if (item.type != "armure") {
return true
}
if (item.system.equipe) {
return true
}
let nbArmuresLourdes = this.getNbArmuresLourdesActuel()
if (nbArmuresLourdes + item.system.coutArmureLourde > this.getNbArmures().value) {
ui.notifications.warn("Impossible d'équiper cette armure, nombre d'armures lourdes maximum atteint")
return false
}
// Loop thru localisation
let armures = this.getArmures()
for (let loc in item.system.localisation) {
if (item.system.localisation[loc].protege) {
for (let armure of armures) {
if (armure.system.equipe && armure.system.localisation[loc].protege) {
let flag = true
//console.log("Check armure", armure, item)=
if (item.system.typeArmure == "cuir") {
flag = armure.system.superposableCuir
}
if (item.system.typeArmure == "maille") {
flag = armure.system.superposableMaille
}
if (item.system.typeArmure == "plate") {
flag = armure.system.superposablePlate
}
if (!flag) {
ui.notifications.warn("Impossible d'équiper cette armure, non superposable")
return flag
}
}
}
}
return true
}
}
/* ------------------------------------------- */
async buildContainerTree() {
let equipments = foundry.utils.duplicate(this.items.filter(item => item.type == "equipment") || [])
@ -342,8 +428,8 @@ export class TeDeumActor extends Actor {
/* -------------------------------------------- */
getInitiativeScore() {
let initiative = this.items.find(it=>it.type == "competence" && it.name.toLowerCase() == "initiative")
if ( initiative ) {
let initiative = this.items.find(it => it.type == "competence" && it.name.toLowerCase() == "initiative")
if (initiative) {
return initiative.system.score
}
ui.notifications.warn("Impossible de trouver la compétence Initiative pour l'acteur " + this.name)
@ -374,7 +460,7 @@ export class TeDeumActor extends Actor {
}
}
}
/* -------------------------------------------- */
getCommonRollData() {
let rollData = TeDeumUtility.getBasicRollData()
@ -384,19 +470,19 @@ export class TeDeumActor extends Actor {
rollData.img = this.img
rollData.providence = this.prepareProvidence()
rollData.santeModifier = this.getSanteModifier()
return rollData
}
/* -------------------------------------------- */
getCommonCompetence(compId) {
let rollData = this.getCommonRollData()
let competence = foundry.utils.duplicate(this.items.find(it => it.type =="competence" && it.id == compId))
let competence = foundry.utils.duplicate(this.items.find(it => it.type == "competence" && it.id == compId))
rollData.competence = competence
let c = foundry.utils.duplicate(this.system.caracteristiques[competence.system.caracteristique])
this.updateCarac( c, competence.system.caracteristique)
this.updateCarac(c, competence.system.caracteristique)
rollData.carac = c
rollData.img = competence.img
@ -419,22 +505,32 @@ export class TeDeumActor extends Actor {
weapon = foundry.utils.duplicate(weapon)
let rollData = this.getCommonRollData()
rollData.mode = "arme"
rollData.isTir = weapon.system.typeArme == "tir"
rollData.arme = weapon
rollData.img = weapon.img
rollData.title = weapon.name
rollData.porteeTir = "courte"
rollData.porteeLabel = game.system.tedeum.config.ARME_PORTEES.courte.label
rollData.isViser = false
rollData.isMouvement = false
// Display warning if not target defined
if (!rollData.defenderTokenId) {
ui.notifications.warn("Vous attaquez avec une arme : afin de bénéficier des automatisations, il est conseillé de selectionner une cible")
}
// Setup competence + carac
if (!compName) {
compName = weapon.system.competence
}
let competence = this.items.find(item => item.type == "competence" && item.name.toLowerCase() == compName.toLowerCase())
if ( competence) {
}
let competence = this.items.find(item => item.type == "competence" && item.name.toLowerCase() == compName.toLowerCase())
if (competence) {
rollData.competence = competence
let c = foundry.utils.duplicate(this.system.caracteristiques[competence.system.caracteristique])
this.updateCarac( c, competence.system.caracteristique)
this.updateCarac(c, competence.system.caracteristique)
rollData.carac = c
} else {
ui.notifications.warn("Impossible de trouver la compétence " + compName)
ui.notifications.warn("Impossible de trouver la compétence " + compName)
return
}
this.startRoll(rollData).catch("Error on startRoll")