2025-05-28 15:36:51 -07:00

94 lines
4.9 KiB
JavaScript

import { characterActions } from "../actions";
import { AbilityAccessors } from "../engine/Ability";
import { AbilityScoreStatTypeEnum } from "../engine/Core";
import { HelperUtils } from "../engine/Helper";
import { RuleDataAccessors } from "../engine/RuleData";
import { rulesEngineSelectors } from "../selectors";
import { FeaturesManager } from './FeaturesManager';
export const abilityDefinitionMap = new Map();
const abilityMangerMap = new Map();
export const getAbilityManager = (params) => {
const { ability } = params;
const abilityId = AbilityAccessors.getId(ability);
if (abilityMangerMap.has(abilityId)) {
const abilityManager = abilityMangerMap.get(abilityId);
if (!abilityManager) {
throw new Error(`AbilityManager for ability ${abilityId} is null`);
}
if (abilityManager.ability === ability) {
return abilityManager;
}
}
const newAbilityManager = new AbilityManager(params);
abilityMangerMap.set(abilityId, newAbilityManager);
return newAbilityManager;
};
export class AbilityManager extends FeaturesManager {
constructor(params) {
super(params);
//Accessors
this.getId = () => AbilityAccessors.getId(this.ability);
this.getEntityTypeId = () => AbilityAccessors.getEntityTypeId(this.ability);
this.getName = () => AbilityAccessors.getName(this.ability);
this.getLabel = () => AbilityAccessors.getLabel(this.ability);
this.getStatKey = () => AbilityAccessors.getStatKey(this.ability);
this.getBaseScore = () => AbilityAccessors.getBaseScore(this.ability);
this.getTotalScore = () => AbilityAccessors.getTotalScore(this.ability);
this.getModifier = () => AbilityAccessors.getModifier(this.ability);
this.getMaxStatScore = () => AbilityAccessors.getMaxStatScore(this.ability);
this.getProficiencyLevel = () => AbilityAccessors.getProficiencyLevel(this.ability);
this.getIsSaveProficiencyModified = () => AbilityAccessors.getIsSaveProficiencyModified(this.ability);
this.getSave = () => AbilityAccessors.getSave(this.ability);
this.getIsSaveModifierModified = () => AbilityAccessors.getIsSaveModifierModified(this.ability);
this.getOverrideScore = () => AbilityAccessors.getOverrideScore(this.ability);
this.getOtherBonus = () => AbilityAccessors.getOtherBonus(this.ability);
this.getRacialBonus = () => AbilityAccessors.getRacialBonus(this.ability);
this.getClassBonuses = () => AbilityAccessors.getClassBonuses(this.ability);
this.getMiscBonus = () => AbilityAccessors.getMiscBonus(this.ability);
this.getSetScore = () => AbilityAccessors.getSetScore(this.ability);
this.getStackingBonus = () => AbilityAccessors.getStackingBonus(this.ability);
this.getAllStatBonusSuppliers = () => AbilityAccessors.getAllStatBonusSuppliers(this.ability);
this.getStatSetScoreSuppliers = () => AbilityAccessors.getStatSetScoreSuppliers(this.ability);
this.getStatMaxBonusSuppliers = () => AbilityAccessors.getStatMaxBonusSuppliers(this.ability);
this.getStackingBonusSuppliers = () => AbilityAccessors.getStackingBonusSuppliers(this.ability);
//handlers
this.handleScoreChange = (value) => {
this.dispatch(characterActions.abilityScoreSet(this.getId(), AbilityScoreStatTypeEnum.BASE, value));
};
this.handleOverrideScoreChange = (value) => {
const ruleData = rulesEngineSelectors.getRuleData(this.state);
const minStatScore = RuleDataAccessors.getMinStatScore(ruleData);
const maxStatScore = RuleDataAccessors.getMaxStatScore(ruleData);
if (value !== null) {
value = HelperUtils.clampInt(value, minStatScore, maxStatScore);
}
this.dispatch(characterActions.abilityScoreSet(this.getId(), AbilityScoreStatTypeEnum.OVERRIDE, value));
return value;
};
this.handleOtherBonusChange = (value) => {
// TODO: lets get a why to this
const minBonusScore = -10;
const maxBonusScore = 10;
if (value !== null) {
value = HelperUtils.clampInt(value, minBonusScore, maxBonusScore);
}
this.dispatch(characterActions.abilityScoreSet(this.getId(), AbilityScoreStatTypeEnum.BONUS, value));
return value;
};
this.params = params;
this.ability = params.ability;
}
//Rule data accessors
getAbilityRuleData() {
const ruleData = rulesEngineSelectors.getRuleData(this.state);
const abilityDataLookup = RuleDataAccessors.getStatsLookup(ruleData);
return abilityDataLookup[this.getId()];
}
getCompendiumText() {
const abilityRuleData = this.getAbilityRuleData();
// TODO: we should accessor all the things?
// maybe gfs will be the time to do it?
return abilityRuleData.compendiumText;
}
}