forked from public/foundryvtt-reve-de-dragon
Fin de gestion encaissement/recul V2
This commit is contained in:
@@ -37,10 +37,12 @@ export default class ChatRollResult {
|
||||
}
|
||||
|
||||
prepareDisplay(roll) {
|
||||
roll.done = roll.done || {}
|
||||
roll.show = roll.show || {}
|
||||
roll.show.chance = this.isAppelChancePossible(roll)
|
||||
roll.show.encaissement = this.isShowEncaissement(roll)
|
||||
roll.show.recul = this.isShowReculChoc(roll)
|
||||
roll.show.recul = this.getReculChoc(roll)
|
||||
|
||||
}
|
||||
|
||||
isAppelChancePossible(roll) {
|
||||
@@ -54,11 +56,22 @@ export default class ChatRollResult {
|
||||
roll.attackerRoll?.dmg.mortalite != 'empoignade'
|
||||
}
|
||||
|
||||
isShowReculChoc(roll) {
|
||||
getReculChoc(roll, defender = roll.active.actor, attacker = roll.opponent.actor) {
|
||||
const attaque = roll.attackerRoll
|
||||
return attaque &&
|
||||
if (attaque &&
|
||||
(roll.rolled.isEchec || !roll.current.defense.isEsquive) &&
|
||||
(attaque.particuliere == 'force' || 'charge' == attaque.tactique?.key)
|
||||
(attaque.particuliere == 'force' || 'charge' == attaque.tactique?.key)) {
|
||||
const taille = defender.system.carac.taille.value
|
||||
const impact = attacker.system.carac.force.value + roll.attackerRoll?.dmg.dmgArme
|
||||
return {
|
||||
raison: 'charge' == attaque.tactique?.key ? 'charge' : 'particulière en force',
|
||||
taille: taille,
|
||||
impact: impact,
|
||||
chances: RdDResolutionTable.computeChances(10, taille-impact).norm,
|
||||
diff: taille - impact
|
||||
}
|
||||
}
|
||||
return undefined
|
||||
}
|
||||
|
||||
async buildRollHtml(roll) {
|
||||
@@ -69,6 +82,28 @@ export default class ChatRollResult {
|
||||
async chatListeners(html) {
|
||||
$(html).on("click", '.appel-chance', event => this.onClickAppelChance(event))
|
||||
$(html).on("click", '.appel-destinee', event => this.onClickAppelDestinee(event))
|
||||
$(html).on("click", '.encaissement', event => this.onClickEncaissement(event))
|
||||
$(html).on("click", '.resister-recul', event => this.onClickRecul(event))
|
||||
|
||||
}
|
||||
|
||||
getCombat(roll) {
|
||||
switch (roll.type.current) {
|
||||
case ROLL_TYPE_DEFENSE:
|
||||
return RdDCombat.rddCombatForAttackerAndDefender(roll.ids.opponentId, roll.ids.opponentTokenId, roll.ids.actorTokenId)
|
||||
case ROLL_TYPE_ATTAQUE:
|
||||
return RdDCombat.rddCombatForAttackerAndDefender(roll.ids.actorId, roll.ids.actorTokenId, roll.ids.opponentId)
|
||||
}
|
||||
return undefined
|
||||
}
|
||||
|
||||
async updateChatMessage(chatMessage, savedRoll) {
|
||||
ChatUtility.setMessageData(chatMessage, 'rollData', savedRoll)
|
||||
const copy = foundry.utils.duplicate(savedRoll)
|
||||
RollDialog.loadRollData(copy)
|
||||
this.prepareDisplay(copy)
|
||||
chatMessage.update({ content: await this.buildRollHtml(copy) })
|
||||
chatMessage.render(true)
|
||||
}
|
||||
|
||||
onClickAppelChance(event) {
|
||||
@@ -81,32 +116,23 @@ export default class ChatRollResult {
|
||||
event.preventDefault()
|
||||
}
|
||||
|
||||
getCombat(roll) {
|
||||
switch (roll.type.current) {
|
||||
case ROLL_TYPE_DEFENSE:
|
||||
return RdDCombat.rddCombatForAttackerAndDefender(roll.ids.opponentId, roll.ids.opponentTokenId, roll.ids.actorId)
|
||||
case ROLL_TYPE_ATTAQUE:
|
||||
return RdDCombat.rddCombatForAttackerAndDefender(roll.ids.actorId, roll.ids.actorTokenId, roll.ids.opponentId)
|
||||
}
|
||||
return undefined
|
||||
}
|
||||
|
||||
onAppelChanceSuccess(savedRoll, chatMessage) {
|
||||
const reRoll = foundry.utils.duplicate(savedRoll)
|
||||
reRoll.type.retry = true
|
||||
const callbacks = [r => ChatUtility.removeChatMessageId(chatMessage.id)]
|
||||
// TODO: annuler les effets
|
||||
switch (reRoll.type.current) {
|
||||
case ROLL_TYPE_DEFENSE:
|
||||
this.getCombat(reRoll)?.doRollDefense(reRoll)
|
||||
this.getCombat(reRoll)?.doRollDefense(reRoll, callbacks)
|
||||
break
|
||||
case ROLL_TYPE_ATTAQUE:
|
||||
this.getCombat(reRoll)?.doRollAttaque(reRoll)
|
||||
// TODO
|
||||
this.getCombat(reRoll)?.doRollAttaque(reRoll, callbacks)
|
||||
break
|
||||
default: {
|
||||
RollDialog.create(reRoll)
|
||||
RollDialog.create(reRoll, { callbacks: callbacks })
|
||||
}
|
||||
}
|
||||
ChatUtility.removeChatMessageId(chatMessage.id)
|
||||
}
|
||||
|
||||
async onAppelChanceEchec(savedRoll, chatMessage) {
|
||||
@@ -114,15 +140,6 @@ export default class ChatRollResult {
|
||||
await this.updateChatMessage(chatMessage, savedRoll)
|
||||
}
|
||||
|
||||
async updateChatMessage(chatMessage, savedRoll) {
|
||||
ChatUtility.setMessageData(chatMessage, 'rollData', savedRoll)
|
||||
const copy = foundry.utils.duplicate(savedRoll)
|
||||
RollDialog.loadRollData(copy)
|
||||
this.prepareDisplay(copy)
|
||||
chatMessage.update({ content: await this.buildRollHtml(copy) })
|
||||
chatMessage.render(true)
|
||||
}
|
||||
|
||||
onClickAppelDestinee(event) {
|
||||
const chatMessage = ChatUtility.getChatMessage(event)
|
||||
const savedRoll = ChatUtility.getMessageData(chatMessage, 'rollData')
|
||||
@@ -132,10 +149,32 @@ export default class ChatRollResult {
|
||||
const reRoll = foundry.utils.duplicate(savedRoll)
|
||||
reRoll.type.retry = true
|
||||
RdDResolutionTable.significativeRequise(reRoll.rolled)
|
||||
await this.updateChatMessage(chatMessage, savedRoll)
|
||||
await this.updateChatMessage(chatMessage, reRoll)
|
||||
})
|
||||
event.preventDefault()
|
||||
}
|
||||
|
||||
async onClickEncaissement(event) {
|
||||
const chatMessage = ChatUtility.getChatMessage(event)
|
||||
const savedRoll = ChatUtility.getMessageData(chatMessage, 'rollData')
|
||||
const attaque = savedRoll.attackerRoll
|
||||
const defender = game.actors.get(savedRoll.ids.actorId)
|
||||
const attacker = game.actors.get(savedRoll.ids.opponentId)
|
||||
const defenderToken = savedRoll.ids.actorTokenId ? canvas.tokens.get(savedRoll.ids.actorTokenId) : undefined
|
||||
const attackerToken = savedRoll.ids.opponentTokenId ? canvas.tokens.get(savedRoll.ids.opponentTokenId) : undefined
|
||||
await defender?.encaisserDommages(attaque.dmg, attacker, undefined, attackerToken, defenderToken)
|
||||
|
||||
savedRoll.done.encaissement = true
|
||||
await this.updateChatMessage(chatMessage, savedRoll)
|
||||
}
|
||||
|
||||
async onClickRecul(event) {
|
||||
const chatMessage = ChatUtility.getChatMessage(event)
|
||||
const savedRoll = ChatUtility.getMessageData(chatMessage, 'rollData')
|
||||
const defender = game.actors.get(savedRoll.ids.actorId)
|
||||
const attacker = game.actors.get(savedRoll.ids.opponentId)
|
||||
savedRoll.done.recul = await defender.encaisserRecul(attacker.getForce(), savedRoll.attackerRoll.dmg.dmgArme)
|
||||
// const reculChoc = this.getReculChoc(savedRoll, defender, attacker)
|
||||
await this.updateChatMessage(chatMessage, savedRoll)
|
||||
}
|
||||
|
||||
}
|
@@ -288,6 +288,7 @@ export default class RollDialog extends HandlebarsApplicationMixin(ApplicationV2
|
||||
target.attackerRoll = rollData.attackerRoll
|
||||
target.rolled = rollData.rolled
|
||||
target.result = rollData.result
|
||||
target.done = target.done ?? {}
|
||||
return target
|
||||
}
|
||||
|
||||
|
@@ -1,4 +1,5 @@
|
||||
import { RdDBonus } from "../rdd-bonus.js"
|
||||
import { ReglesOptionnelles } from "../settings/regles-optionnelles.js"
|
||||
import { ROLL_TYPE_ATTAQUE } from "./roll-constants.mjs"
|
||||
import { PART_CARAC } from "./roll-part-carac.mjs"
|
||||
import { PART_COMP } from "./roll-part-comp.mjs"
|
||||
@@ -49,28 +50,7 @@ export class RollPartAttaque extends RollPartSelect {
|
||||
|
||||
prepareContext(rollData) {
|
||||
const current = this.getCurrent(rollData)
|
||||
current.dmg = this.$dmgRollV2(rollData, current)
|
||||
}
|
||||
|
||||
$dmgRollV2(rollData, current) {
|
||||
const actor = rollData.active.actor
|
||||
const attaque = current.attaque
|
||||
const arme = attaque.arme
|
||||
const dmgArme = RdDBonus.dmgArme(arme, attaque.dommagesArme)
|
||||
|
||||
const dmg = {
|
||||
total: 0,
|
||||
dmgArme: dmgArme,
|
||||
penetration: arme.penetration(),
|
||||
dmgTactique: current.tactique?.dmg ?? 0,
|
||||
dmgParticuliere: 0, // TODO RdDBonus._dmgParticuliere(rollData),
|
||||
dmgSurprise: rollData.opponent?.surprise?.dmg ?? 0,
|
||||
mortalite: RdDBonus.mortalite(current.dmg?.mortalite, arme.system.mortalite, rollData.opponent?.actor?.isEntite()),
|
||||
dmgActor: RdDBonus.bonusDmg(actor, attaque.carac.key, dmgArme, attaque.forceRequise),
|
||||
dmgForceInsuffisante: Math.min(0, actor.getForce() - attaque.forceRequise)
|
||||
}
|
||||
dmg.total = dmg.dmgSurprise + dmg.dmgTactique + dmg.dmgArme + dmg.dmgActor + dmg.dmgParticuliere + dmg.dmgForceInsuffisante
|
||||
return dmg
|
||||
current.dmg = RdDBonus.dmgRollV2(rollData, current)
|
||||
}
|
||||
|
||||
getAjustements(rollData) {
|
||||
|
Reference in New Issue
Block a user