Grabbed dndbeyond's source code
``` ~/go/bin/sourcemapper -output ddb -jsurl https://media.dndbeyond.com/character-app/static/js/main.90aa78c5.js ```
This commit is contained in:
@@ -0,0 +1,337 @@
|
||||
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;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user