Files
roll20-character-sheets/5eShaped/precompiled/scripts/Abilities.js
T

129 lines
6.2 KiB
JavaScript

/* global on:false */
import { AbilityChecks } from './AbilityChecks';
const abilityChecks = new AbilityChecks();
import { Actions } from './Actions';
const actions = new Actions();
import { Attacks } from './Attacks';
const attacks = new Attacks();
import { Spells } from './Spells';
const spells = new Spells();
import { getSetItems, getIntValue, getFloatValue, getAbilityMod, addArithmeticOperator, showSign, firstThree } from './utilities';
export class Abilities {
updateModifier(ability) {
const collectionArray = [ability, `${ability}_bonus`, `${ability}_mod`, `${ability}_mod_with_sign`, `${ability}_check_mod`, `${ability}_check_mod_formula`, `${ability}_check_bonus`, 'global_ability_bonus', 'strength_mod', 'dexterity_mod', 'jack_of_all_trades_toggle', 'jack_of_all_trades', 'remarkable_athlete_toggle', 'remarkable_athlete', 'global_check_bonus'];
if (ability === 'strength' || ability === 'dexterity') {
collectionArray.push('finesse_mod');
}
if (ability === 'strength') {
collectionArray.push('weight_multiplier');
collectionArray.push('carrying_capacity');
collectionArray.push('max_push_drag_lift');
collectionArray.push('encumbered');
collectionArray.push('heavily_encumbered');
}
getSetItems('abilities.updateModifier', {
collectionArray,
callback: (v, finalSetAttrs) => {
const abilityScore = getIntValue(v[ability]);
const abilityBonus = getIntValue(v[`${ability}_bonus`]);
const globalAbilityBonus = v.global_ability_bonus;
let abilityScoreCalc = abilityScore + abilityBonus;
if (!isNaN(globalAbilityBonus)) {
abilityScoreCalc += getIntValue(globalAbilityBonus);
}
const abilityCheckBonus = getIntValue(v[`${ability}_check_bonus`]);
const abilityMod = getAbilityMod(abilityScoreCalc);
let abilityCheck = abilityMod;
let abilityCheckFormula = '';
if (abilityMod !== 0) {
abilityCheckFormula = `${abilityMod}[${firstThree(ability)} mod with bonus]`;
}
if ((ability === 'strength' || ability === 'dexterity' || ability === 'constitution') && v.remarkable_athlete_toggle === '@{remarkable_athlete}') {
const remarkableAthlete = getIntValue(v.remarkable_athlete);
abilityCheck += remarkableAthlete;
abilityCheckFormula += `${addArithmeticOperator(abilityCheckFormula, remarkableAthlete)}[remarkable athlete]`;
} else if (v.jack_of_all_trades_toggle === '@{jack_of_all_trades}') {
const jackOfAllTrades = getIntValue(v.jack_of_all_trades);
abilityCheck += jackOfAllTrades;
abilityCheckFormula += `${addArithmeticOperator(abilityCheckFormula, jackOfAllTrades)}[jack of all trades]`;
}
if (abilityCheckBonus) {
abilityCheck += abilityCheckBonus;
abilityCheckFormula += `${addArithmeticOperator(abilityCheckFormula, abilityCheckBonus)}[${ability} check bonus]`;
}
if (v.global_check_bonus) {
if (!isNaN(v.global_check_bonus)) {
abilityCheck += getIntValue(v.global_check_bonus);
}
if (abilityCheckFormula) {
abilityCheckFormula += ' + ';
}
abilityCheckFormula += '(@{global_check_bonus})[global check bonus]';
}
finalSetAttrs[`${ability}_calculated`] = abilityScoreCalc;
finalSetAttrs[`${ability}_mod`] = abilityMod;
finalSetAttrs[`${ability}_mod_with_sign`] = showSign(abilityMod);
finalSetAttrs[`${ability}_check_mod`] = abilityCheck;
finalSetAttrs[`${ability}_check_mod_with_sign`] = showSign(abilityCheck);
finalSetAttrs[`${ability}_check_mod_formula`] = abilityCheckFormula;
if (ability === 'strength') {
finalSetAttrs.finesse_mod = Math.max(abilityMod, getIntValue(v.dexterity_mod));
const weightMultiplier = getFloatValue(v.weight_multiplier, 1);
finalSetAttrs.carrying_capacity = abilityScore * 15 * weightMultiplier;
finalSetAttrs.max_push_drag_lift = abilityScore * 30 * weightMultiplier;
finalSetAttrs.encumbered = abilityScore * 5 * weightMultiplier;
finalSetAttrs.heavily_encumbered = abilityScore * 10 * weightMultiplier;
} else if (ability === 'dexterity') {
finalSetAttrs.finesse_mod = Math.max(abilityMod, getIntValue(v.strength_mod));
}
},
});
}
updateModifiers() {
this.updateModifier('strength');
this.updateModifier('dexterity');
this.updateModifier('constitution');
this.updateModifier('intelligence');
this.updateModifier('wisdom');
this.updateModifier('charisma');
}
setup() {
on('change:jack_of_all_trades_toggle change:jack_of_all_trades change:global_ability_bonus change:global_check_bonus', () => {
this.updateModifiers();
});
on('change:strength change:strength_bonus change:strength_check_mod change:strength_check_bonus change:remarkable_athlete_toggle change:remarkable_athlete change:weight_multiplier', () => {
this.updateModifier('strength');
});
on('change:dexterity change:dexterity_bonus change:dexterity_check_mod change:dexterity_check_bonus change:remarkable_athlete_toggle change:remarkable_athlete', () => {
this.updateModifier('dexterity');
});
on('change:constitution change:constitution_bonus change:constitution_check_mod change:constitution_check_bonus change:remarkable_athlete_toggle change:remarkable_athlete', () => {
this.updateModifier('constitution');
});
on('change:intelligence change:intelligence_bonus change:intelligence_check_mod change:intelligence_check_bonus', () => {
this.updateModifier('intelligence');
});
on('change:wisdom change:wisdom_bonus change:wisdom_check_mod change:wisdom_check_bonus', () => {
this.updateModifier('wisdom');
});
on('change:charisma change:charisma_bonus change:charisma_check_mod change:charisma_check_bonus', () => {
this.updateModifier('charisma');
});
on('change:strength_mod change:dexterity_mod change:constitution_mod change:intelligence_mod change:wisdom_mod change:charisma_mod', () => {
abilityChecks.updateSkill();
attacks.update();
spells.update();
actions.updateAll();
});
}
}