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

108 lines
4.5 KiB
JavaScript

import { ActionAccessors } from "../engine/Action";
import { ItemAccessors, WeaponTypeEnum } from "../engine/Item";
import { RuleDataUtils } from "../engine/RuleData";
import { ActionManager, Constants, rulesEngineSelectors, } from "../index";
import { BaseManager } from './BaseManager';
export const attackManagerMap = new Map();
export const getAttackManager = (params) => {
const { attack } = params;
const key = attack.key;
if (attackManagerMap.has(key)) {
const attackManager = attackManagerMap.get(key);
if (!attackManager) {
throw new Error(`AttackManager for attack ${key} is null`);
}
if (attackManager.attack === attack) {
return attackManager;
}
}
const newAttackManager = new AttackManager(params);
attackManagerMap.set(key, newAttackManager);
return newAttackManager;
};
export class AttackManager extends BaseManager {
constructor(params) {
super(params);
// Accessors
this.getType = () => this.attack.type;
this.getActivation = () => this.attack.activation;
this.getData = () => this.attack.data;
this.getKey = () => this.attack.key;
// Utils
this.isActionGroup = () => this.getActivation() === Constants.ActivationTypeEnum.ACTION;
this.isBonusActionGroup = () => this.getActivation() === Constants.ActivationTypeEnum.BONUS_ACTION;
this.isReactionGroup = () => this.getActivation() === Constants.ActivationTypeEnum.REACTION;
this.isOtherGroup = () => {
const activationType = this.getActivation();
return (activationType !== Constants.ActivationTypeEnum.ACTION &&
activationType !== Constants.ActivationTypeEnum.BONUS_ACTION &&
activationType !== Constants.ActivationTypeEnum.REACTION);
};
this.getActionManager = () => {
const action = this.getData();
return ActionManager.getActionManager(ActionAccessors.getUniqueKey(action));
};
this.getLeveledSpellManager = (spellsManager) => {
const spell = this.getData();
return spellsManager.getLeveledSpellManagerBySpell(spell);
};
this.getItem = () => {
return this.getData();
};
this.getItemActionMeta = () => {
const item = this.getItem();
const combinedMetaItems = [];
const type = ItemAccessors.getType(item);
if (type === WeaponTypeEnum.AMMUNITION) {
combinedMetaItems.push('Ammunition');
}
else {
const isHexWeapon = ItemAccessors.isHexWeapon(item);
const isPactWeapon = ItemAccessors.isPactWeapon(item);
const isDedicatedWeapon = ItemAccessors.isDedicatedWeapon(item);
if (isHexWeapon || isPactWeapon || isDedicatedWeapon) {
if (isHexWeapon) {
combinedMetaItems.push('Hex Weapon');
}
if (isPactWeapon) {
combinedMetaItems.push('Pact Weapon');
}
if (isDedicatedWeapon) {
combinedMetaItems.push('Dedicated Weapon');
}
}
else {
const attackType = ItemAccessors.getAttackType(item);
let attackTypeName = '';
if (attackType) {
attackTypeName = RuleDataUtils.getAttackTypeRangeName(attackType);
}
combinedMetaItems.push(`${attackTypeName} Weapon`);
}
}
if (ItemAccessors.isOffhand(item)) {
combinedMetaItems.push('Dual Wield');
}
if (ItemAccessors.isAdamantine(item)) {
combinedMetaItems.push('Adamantine');
}
if (ItemAccessors.isSilvered(item)) {
combinedMetaItems.push('Silvered');
}
if (ItemAccessors.isCustomized(item)) {
combinedMetaItems.push('Customized');
}
if (ItemAccessors.getMasteryName(item)) {
combinedMetaItems.push('Mastery');
}
const metaItems = ItemAccessors.getMetaItems(item);
return [...combinedMetaItems, ...metaItems];
};
this.getWeaponSpellDamageGroups = () => {
return rulesEngineSelectors.getWeaponSpellDamageGroups(this.state);
};
this.params = params;
this.attack = params.attack;
}
}