Ajout: Information de distance
This commit is contained in:
63
module/combat/distance.mjs
Normal file
63
module/combat/distance.mjs
Normal file
@@ -0,0 +1,63 @@
|
||||
import { Misc } from "../misc.js"
|
||||
|
||||
export class Distance {
|
||||
|
||||
static ajustements(token, defenderToken, arme){
|
||||
const distance = Distance.distance(token, defenderToken)
|
||||
const isVisible = Distance.isVisible(token, defenderToken)
|
||||
const portee = Distance.ajustementPortee(distance, arme)
|
||||
const taille = Distance.ajustementTaille(defenderToken.actor)
|
||||
const activite = Distance.ajustementMouvement(defenderToken)
|
||||
const total = Distance.diff(portee, taille, activite)
|
||||
return {
|
||||
isVisible: isVisible,
|
||||
distance: distance,
|
||||
portee: portee,
|
||||
taille: taille,
|
||||
activite: activite,
|
||||
total: total
|
||||
}
|
||||
}
|
||||
|
||||
static distance(token, defenderToken) {
|
||||
const ray = new foundry.canvas.geometry.Ray(
|
||||
token.getCenterPoint(),
|
||||
defenderToken.getCenterPoint()
|
||||
)
|
||||
return Number(canvas.grid.measureDistances([{ ray }], { gridSpaces: false }))
|
||||
}
|
||||
|
||||
static isVisible(token, defenderToken) {
|
||||
// TODO: regarder les StatusEffect aveuglé?
|
||||
return canvas.effects.visibility.testVisibility(defenderToken.getCenterPoint(), { object: token })
|
||||
}
|
||||
|
||||
static ajustementPortee(distance, arme) {
|
||||
if (arme.system.portee_courte && distance <= arme.system.portee_courte) return { msg: "courte", diff: 0 };
|
||||
if (arme.system.portee_moyenne && distance <= arme.system.portee_moyenne) return { msg: "moyenne", diff: -3 };
|
||||
if (arme.system.portee_extreme && distance <= arme.system.portee_extreme) return { msg: "extrême", diff: -5 };
|
||||
return { msg: "inatteignable", diff: -10 };
|
||||
}
|
||||
|
||||
static ajustementTaille(actor) {
|
||||
if (actor.isVehicule()) return { msg: "véhicule", diff: 0 }
|
||||
const taille = actor.getCaracByName('TAILLE')?.value ?? 1;
|
||||
if (taille <= 1) return { msg: "souris", diff: -8 };
|
||||
if (taille <= 3) return { msg: "chat", diff: -4 };
|
||||
if (taille <= 5) return { msg: "chien", diff: -2 };
|
||||
if (taille <= 15) return { msg: "humanoïde", diff: 0 };
|
||||
if (taille <= 20) return { msg: "ogre", diff: 2 };
|
||||
return { msg: "gigantesque", diff: 4 };
|
||||
}
|
||||
|
||||
static ajustementMouvement(defenderToken) {
|
||||
if (defenderToken.actor?.getSurprise(true) != '') return { msg: "immobile (surprise)", diff: 0 };
|
||||
if (defenderToken.inCombat) return { msg: "en mouvement (combat)", diff: -4 };
|
||||
return { msg: "à déterminer (0 immobile, -3 actif, -4 en mouvement, -5 en zig-zag)", diff: -3 };
|
||||
}
|
||||
|
||||
static diff(...ajustements){
|
||||
return ajustements.map(it => it.diff).filter(d => !Number.isNaN(d)).reduce(Misc.sum(), 0)
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user