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

338 lines
16 KiB
JavaScript

var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
import { groupBy } from 'lodash';
import * as ApiAdapterUtils from "../apiAdapter/utils";
import { CreatureRuleUtils } from "../engine/CreatureRule";
import { DefinitionTypeEnum } from "../engine/Definition";
import { DefinitionPoolUtils } from "../engine/DefinitionPool";
import { TypeScriptUtils } from "../utils";
import { characterActions, serviceDataActions } from '../actions';
import { CreatureAccessors, CreatureGroupFlagEnum, CreatureSimulators, DB_STRING_GROUP_SIDEKICK, DB_STRING_TAG_SIDEKICK, } from '../engine/Creature';
import { ExtraAccessors, ExtraGenerators, ExtraUtils, HACK_VEHICLE_GROUP_ID, } from '../engine/Extra';
import { RuleDataGenerators, RuleDataUtils } from '../engine/RuleData';
import { VehicleSimulators } from '../engine/Vehicle';
import { apiCreatorSelectors, rulesEngineSelectors, serviceDataSelectors } from '../selectors';
import { getExtraManager } from './ExtraManager';
import { MessageManager } from './MessageManager';
export class ExtrasManager extends MessageManager {
constructor(params) {
super(params);
//Shoppe
//TODO optimize to not make api calls when updates are called (see FeatShoppe)
this.getExtrasShoppe = ({ groupId, onSuccess, additionalConfig, }) => __awaiter(this, void 0, void 0, function* () {
var _a;
const loadAvailableMonsters = apiCreatorSelectors.makeLoadAvailableMonsters(this.state);
const loadAvailableVehicles = apiCreatorSelectors.makeLoadAvailableVehicles(this.state);
const monsterResponse = (yield loadAvailableMonsters(additionalConfig));
const vehicleResponse = yield loadAvailableVehicles(additionalConfig);
// forced to do any because of stupid typings - pulled from ExtraManagePane - fix it eventually?
const monsterResponseDefinitions = (_a = ApiAdapterUtils.getResponseData(monsterResponse)) !== null && _a !== void 0 ? _a : [];
const vehicleResponseDefinitions = ApiAdapterUtils.getResponseData(vehicleResponse);
const transformedCreatures = groupId !== null ? this.transformLoadedCreatures(monsterResponseDefinitions, groupId) : [];
if (vehicleResponseDefinitions !== null && vehicleResponseDefinitions.definitionData.length > 0) {
this.dispatch(serviceDataActions.definitionPoolAdd(vehicleResponseDefinitions.definitionData, vehicleResponseDefinitions.accessTypes));
}
const ruleData = rulesEngineSelectors.getRuleData(this.state);
const definitionPool = serviceDataSelectors.getDefinitionPool(this.state);
const vehicleDefinitions = DefinitionPoolUtils.getTypedDefinitionList(DefinitionTypeEnum.VEHICLE, definitionPool);
let vehicles = vehicleDefinitions
.map((vehicleDef) => VehicleSimulators.simulateVehicle(vehicleDef, definitionPool, ruleData))
.filter(TypeScriptUtils.isNotNullOrUndefined)
.map((vehicle) => this.generateVehicleExtraManager(vehicle));
//TODO should this be something we store somehwere other than the shoppe?
const creatureDefinitionLookup = monsterResponseDefinitions.reduce((lookup, definition) => {
const id = definition.id;
lookup[id] = definition;
return lookup;
}, {});
const shoppeState = {
creatureDefinitionLookup,
creatureDefinitions: monsterResponseDefinitions,
creatures: transformedCreatures.map((creature) => this.generateCreatureExtraManager(creature)),
vehicles,
};
onSuccess(shoppeState);
return shoppeState;
});
//Update Shoppe with a selected group
this.updateExtrasShoppe = ({ currentShoppe, groupId, onSuccess, }) => {
const transformedCreatures = groupId !== null ? this.transformLoadedCreatures(currentShoppe.creatureDefinitions, groupId) : [];
const newShoppeState = Object.assign(Object.assign({}, currentShoppe), { creatures: transformedCreatures.map((creature) => this.generateCreatureExtraManager(creature)) });
onSuccess(newShoppeState);
return newShoppeState;
};
this.transformLoadedCreatures = (creatureDefinitions, groupId) => {
const ruleData = rulesEngineSelectors.getRuleData(this.state);
if (groupId === null) {
return [];
}
return creatureDefinitions.map((definition) => CreatureSimulators.simulateCreature(definition, groupId, ruleData));
};
//TODO this could use some cleanup?
this.getCreaturesFilteredByRules = (creatures, creatureDefinitionLookup, groupId) => {
const creatureRules = rulesEngineSelectors.getCreatureRules(this.state);
const creatureDatas = creatures.map((manager) => manager.simulateExtraData(groupId, creatureDefinitionLookup));
let groupCreatures = this.getCreaturesFilteredByGroupFlags(creatureDatas, groupId);
let filteredCreatures = [];
let unmatchedCreatures = [...groupCreatures];
let hasRules = false;
creatureRules.forEach((rule) => {
if (groupId === null || !CreatureRuleUtils.isRuleGroup(rule, groupId)) {
return;
}
let testableCreatures = [...unmatchedCreatures];
unmatchedCreatures = [];
testableCreatures.forEach((creature) => {
if (CreatureRuleUtils.isValidCreature(creature, rule)) {
filteredCreatures.push(creature);
}
else {
unmatchedCreatures.push(creature);
}
});
hasRules = true;
});
return hasRules
? filteredCreatures.map((creature) => this.generateCreatureExtraManager(creature))
: groupCreatures.map((creature) => this.generateCreatureExtraManager(creature));
};
//Handlers
this.handleAcceptOnSuccess = (onSuccess) => {
return () => {
typeof onSuccess === 'function' && onSuccess();
};
};
this.handleRejectOnError = (onError) => {
return () => {
typeof onError === 'function' && onError();
};
};
/**
* @deprecated
* should use ExtraManager
*/
this.handleAdd = ({ extra, quantity, selectedGroup }, onSuccess, onError) => {
var _a;
const extraId = ExtraAccessors.getId(extra);
if (ExtraUtils.isCreature(extra)) {
if (selectedGroup && typeof extraId === 'number') {
let names = [];
if (quantity > 1) {
for (let i = 1; i <= quantity; i++) {
names.push(`${ExtraAccessors.getName(extra)} ${i}`);
}
}
else {
names.push(null);
}
this.dispatch(characterActions.creatureCreate(selectedGroup, extraId, names, this.handleAcceptOnSuccess(onSuccess)));
}
}
else if (ExtraUtils.isVehicle(extra)) {
if (typeof extraId === 'string') {
this.dispatch(serviceDataActions.vehicleMappingCreate(extraId, (_a = ExtraAccessors.getName(extra)) !== null && _a !== void 0 ? _a : 'Vehicle', this.handleAcceptOnSuccess(onSuccess)));
}
}
};
/**
* @deprecated
* should use ExtraManager
*/
this.handleRemove = ({ extra }, onSuccess, onError) => {
const mappingId = ExtraAccessors.getMappingId(extra);
if (ExtraUtils.isCreature(extra)) {
this.dispatch(characterActions.creatureRemove(mappingId));
}
else if (ExtraUtils.isVehicle(extra)) {
this.dispatch(serviceDataActions.vehicleMappingRemove(mappingId));
}
};
/**
* @deprecated
* should use ExtraManager
*/
this.handleSetActive = ({ extra, isActive }, onSuccess, onError) => {
this.dispatch(characterActions.creatureActiveSet(ExtraAccessors.getMappingId(extra), isActive));
};
//Getters?
this.getCharacterExtras = () => {
return rulesEngineSelectors.getExtras(this.state);
};
this.getCharacterExtraManagers = () => {
return this.getCharacterExtras().map((extra) => getExtraManager(Object.assign(Object.assign({}, this.params), { extra })));
};
//START HERE!!!!!!!!!!!! Extras.tsx - manager :)
// getCharacterVehicles = () => {
// }
// getAllVehicles = () => {
// }
/**
* @deprecated
* should use ExtraManager
*/
this.getExtraData = (extra) => {
if (ExtraUtils.isCreature(extra)) {
const creatureLookup = rulesEngineSelectors.getCreatureLookup(this.state);
return ExtraUtils.getTypedExtra(extra, creatureLookup);
}
else if (ExtraUtils.isVehicle(extra)) {
const vehicleLookup = rulesEngineSelectors.getVehicleLookup(this.state);
return ExtraUtils.getTypedExtra(extra, vehicleLookup);
}
else {
return null;
}
};
//UTILS
//should this be in generators?
this.generateExtrasGroupsManagers = (extraManagers) => {
return groupBy(extraManagers, (extra) => extra.getGroupId());
};
//TODO these are probably managers - or use other filter utils
this.getExtrasGroups = (filteredExtras) => {
const extras = filteredExtras !== null && filteredExtras !== void 0 ? filteredExtras : this.getCharacterExtraManagers();
return this.generateExtrasGroupsManagers(extras);
};
this.getGroupInfosForExtras = (filteredExtras) => {
const ruleData = rulesEngineSelectors.getRuleData(this.state);
const extraManagers = filteredExtras !== null && filteredExtras !== void 0 ? filteredExtras : this.getCharacterExtraManagers();
const extras = extraManagers.map((manager) => manager.extra);
return ExtraGenerators.generateCurrentExtraGroupInfos(extras, ruleData);
};
/**
*
* @deprecated for getGroupInfosForExtras
*/
this.getCurrentGroupInfos = (filteredExtras) => {
const ruleData = rulesEngineSelectors.getRuleData(this.state);
const extras = filteredExtras !== null && filteredExtras !== void 0 ? filteredExtras : this.getCharacterExtras();
return ExtraGenerators.generateCurrentExtraGroupInfos(extras, ruleData);
};
this.getGroupOptions = () => {
const ruleData = rulesEngineSelectors.getRuleData(this.state);
let creatureGroupOptions = RuleDataGenerators.getCreatureGroupGroupedOptions(ruleData);
return [
{
optGroupLabel: 'Creature',
options: creatureGroupOptions,
},
{
optGroupLabel: 'Object',
options: [
{
label: 'Vehicle',
value: HACK_VEHICLE_GROUP_ID,
},
],
},
];
};
this.hack__isSidekickGroup = (groupId) => {
const creatureGroupInfo = this.getCreatureGroupInfo(groupId);
return !!creatureGroupInfo && creatureGroupInfo.name === DB_STRING_GROUP_SIDEKICK;
};
//TODO move to CreatureManager or ExtraManager
this.getCreatureGroupInfo = (groupId) => {
if (groupId === null) {
return null;
}
const ruleData = rulesEngineSelectors.getRuleData(this.state);
return RuleDataUtils.getCreatureGroupInfo(groupId, ruleData);
};
//TODO move to CreatureManager or ExtraManager
this.getCreaturesFilteredByGroupFlags = (creatures, groupId) => {
if (groupId === null) {
return creatures;
}
let groupInfo = this.getCreatureGroupInfo(groupId);
if (groupInfo && groupInfo.flagInfoLookup[CreatureGroupFlagEnum.CANNOT_BE_SWARM]) {
creatures = creatures.filter((creature) => !CreatureAccessors.isSwarm(creature));
}
if (this.hack__isSidekickGroup(groupId)) {
creatures = creatures.filter((creature) => CreatureAccessors.getTags(creature).includes(DB_STRING_TAG_SIDEKICK));
}
return creatures;
};
this.getChallengeOptions = () => {
const ruleData = rulesEngineSelectors.getRuleData(this.state);
return RuleDataGenerators.getChallengeOptions(ruleData);
};
this.generateVehicleExtraManager = (vehicle) => {
const ruleData = rulesEngineSelectors.getRuleData(this.state);
return getExtraManager(Object.assign(Object.assign({}, this.params), { extra: ExtraGenerators.generateVehicleExtra(vehicle, ruleData) }));
};
this.generateCreatureExtraManager = (creature) => {
const ruleData = rulesEngineSelectors.getRuleData(this.state);
return getExtraManager(Object.assign(Object.assign({}, this.params), { extra: ExtraGenerators.generateCreatureExtra(creature, ruleData) }));
};
/**
* @deprecated - for VehicleManager
*/
this.generateVehicleMeta = (vehicle) => {
const ruleData = rulesEngineSelectors.getRuleData(this.state);
return ExtraGenerators.generateVehicleMeta(vehicle, ruleData);
};
this.generateCreatureMeta = (creature) => {
const ruleData = rulesEngineSelectors.getRuleData(this.state);
return ExtraGenerators.generateCreatureMeta(creature, ruleData);
};
/**
* @deprecated
* should use ExtraManager
*/
this.getSourceNames = (extra) => {
const ruleData = rulesEngineSelectors.getRuleData(this.state);
const sources = this.getSources(extra);
return sources
.map((sourceMapping) => RuleDataUtils.getSourceDataInfo(sourceMapping.sourceId, ruleData))
.filter(TypeScriptUtils.isNotNullOrUndefined)
.map((sourceDataInfo) => sourceDataInfo.description)
.filter(TypeScriptUtils.isNotNullOrUndefined);
};
//Accessors
/**
* @deprecated
* should use ExtraManager
*/
this.isCreature = (extra) => ExtraUtils.isCreature(extra);
/**
* @deprecated
* should use ExtraManager
*/
this.isVehicle = (extra) => ExtraUtils.isVehicle(extra);
/**
* @deprecated
* should use ExtraManager
*/
this.getName = (extra) => ExtraAccessors.getName(extra);
/**
* @deprecated
* should use ExtraManager
*/
this.getSources = (extra) => ExtraAccessors.getSources(extra);
/**
* @deprecated
* should use ExtraManager
*/
this.isHomebrew = (extra) => ExtraAccessors.isHomebrew(extra);
/**
* @deprecated
* should use ExtraManager
*/
this.getMetaText = (extra) => ExtraAccessors.getMetaText(extra);
/**
* @deprecated
* should use ExtraManager
*/
this.getUniqueKey = (extra) => ExtraAccessors.getUniqueKey(extra);
this.params = params;
}
}