foundryacks/src/module/actor/entity.js

142 lines
3.5 KiB
JavaScript

import { OseDice } from '../dice.js';
export class OseActor extends Actor {
/**
* Extends data from base Actor class
*/
/* -------------------------------------------- */
/* Socket Listeners and Handlers
/* -------------------------------------------- */
/* -------------------------------------------- */
/* Rolls */
/* -------------------------------------------- */
rollSave(save, options = {}) {
const label = game.i18n.localize(`OSE.saves.${save}.long`);
const rollParts = ['1d20'];
const data = {...this.data, ...{
rollData : {
type: 'Save',
stat: save
}
}};
// Roll and return
return OseDice.Roll({
event: options.event,
parts: rollParts,
data: data,
speaker: ChatMessage.getSpeaker({ actor: this }),
flavor: `${label} ${game.i18n.localize('OSE.SavingThrow')}`,
title: `${label} ${game.i18n.localize('OSE.SavingThrow')}`,
});
}
rollCheck(score, options = {}) {
const label = game.i18n.localize(`OSE.scores.${score}.long`);
const rollParts = ['1d20'];
const data = {...this.data, ...{
rollData : {
type: 'Check',
stat: score
}
}};
// Roll and return
return OseDice.Roll({
event: options.event,
parts: rollParts,
data: data,
speaker: ChatMessage.getSpeaker({ actor: this }),
flavor: `${label} ${game.i18n.localize('OSE.AbilityCheck')}`,
title: `${label} ${game.i18n.localize('OSE.AbilityCheck')}`,
});
}
rollAttack(attack, options={}) {
const label = game.i18n.localize(`OSE.${attack}`);
const rollParts = ['1d20',];
const mods = this.computeModifiers();
if (attack == 'Missile') {
rollParts.push(
'+',
mods.dex.toString(),
'+',
this.data.data.thac0.mod.missile.toString()
);
} else if (attack == 'Melee') {
rollParts.push(
'+',
mods.str.toString(),
'+',
this.data.data.thac0.mod.melee.toString()
);
}
if (game.settings.get('ose', 'ascendingAC')) {
rollParts.push('+', this.data.data.thac0.bba.toString());
}
const data = {...this.data, ...{
rollData : {
type: 'Attack',
stat: attack,
mods: mods
}
}};
// Roll and return
return OseDice.Roll({
event: options.event,
parts: rollParts,
data: data,
speaker: ChatMessage.getSpeaker({ actor: this }),
flavor: `${label} ${game.i18n.localize('OSE.Attack')}`,
title: `${label} ${game.i18n.localize('OSE.Attack')}`,
});
}
computeModifiers() {
let _valueToMod = (val) => {
switch (val) {
case 3:
return -3;
case 4:
case 5:
return -2;
case 6:
case 7:
case 8:
return -1;
case 9:
case 10:
case 11:
case 12:
return 0;
case 13:
case 14:
case 15:
return 1;
case 16:
case 17:
return 2;
case 18:
return 3;
default:
return 0;
}
};
return {
str: _valueToMod(this.data.data.scores.str.value),
int: _valueToMod(this.data.data.scores.int.value),
dex: _valueToMod(this.data.data.scores.dex.value),
cha: _valueToMod(this.data.data.scores.cha.value),
wis: _valueToMod(this.data.data.scores.wis.value),
con: _valueToMod(this.data.data.scores.con.value),
}
}
}