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

358 lines
22 KiB
JavaScript

import { characterActions, serviceDataActions } from '../actions';
import { ConfigUtils } from '../config';
import { rulesEngineConfig } from '../config/utils';
import { ContainerAccessors } from '../engine/Container';
import { CoreUtils, CURRENCY_VALUE } from '../engine/Core';
import { DefinitionHacks } from '../engine/Definition';
import { FormatUtils } from '../engine/Format';
import { HelperUtils } from '../engine/Helper';
import { NotificationTypeEnum } from '../notification';
import { rulesEngineSelectors } from '../selectors';
import { InventoryManager } from './InventoryManager';
export class CoinManager extends InventoryManager {
constructor(params) {
super(params);
//Coin Action Handlers
this.handleTransaction = ({ coin, containerDefinitionKey, multiplier }, onSuccess, onError) => {
var _a, _b;
const adjustedCurrency = CoreUtils.getCurrencyTransactionAdjustment(multiplier, coin);
const containerLookup = rulesEngineSelectors.getContainerLookup(this.state);
const container = HelperUtils.lookupDataOrFallback(containerLookup, containerDefinitionKey);
const isEmpty = Object.keys(coin).length === 0;
if (!isEmpty && container) {
const destinationEntityTypeId = ContainerAccessors.getContainerType(container);
const destinationEntityId = ContainerAccessors.getMappingId(container);
const currentCoins = this.getContainerCoin(containerDefinitionKey);
if (multiplier === 1) {
const validAddCoin = this.calculateAddCoinPayload(currentCoins, coin.cp || 0, coin.ep || 0, coin.gp || 0, coin.pp || 0, coin.sp || 0);
if (!validAddCoin) {
(_a = rulesEngineConfig === null || rulesEngineConfig === void 0 ? void 0 : rulesEngineConfig.onNotification) === null || _a === void 0 ? void 0 : _a.call(rulesEngineConfig, 'Failed to add coins', `The max amount allowed for each currency type is ${FormatUtils.renderLocaleNumber(CURRENCY_VALUE.MAX)}`, NotificationTypeEnum.ERROR);
return;
}
}
else {
const validRemoveCoin = this.calculateRemoveCoinPayload(currentCoins, coin.cp || 0, coin.ep || 0, coin.gp || 0, coin.pp || 0, coin.sp || 0);
if (!validRemoveCoin) {
(_b = rulesEngineConfig === null || rulesEngineConfig === void 0 ? void 0 : rulesEngineConfig.onNotification) === null || _b === void 0 ? void 0 : _b.call(rulesEngineConfig, 'Failed to remove coins', `The min amount allowed for each currency type is ${FormatUtils.renderLocaleNumber(CURRENCY_VALUE.MIN)}`, NotificationTypeEnum.ERROR);
return;
}
}
this.dispatch(characterActions.currencyTransactionSet(Object.assign(Object.assign({}, adjustedCurrency), { destinationEntityId: destinationEntityId, destinationEntityTypeId: destinationEntityTypeId }), () => {
typeof onSuccess === 'function' && onSuccess();
}, () => {
typeof onError === 'function' && onError();
}));
}
};
this.handleCoinSet = ({ coin, containerDefinitionKey }, onSuccess, onError) => {
const destinationEntityId = DefinitionHacks.hack__getDefinitionKeyId(containerDefinitionKey);
const destinationEntityTypeId = DefinitionHacks.hack__getDefinitionKeyType(containerDefinitionKey);
if (destinationEntityId && destinationEntityTypeId) {
if (containerDefinitionKey === this.getCharacterContainerDefinitionKey()) {
this.dispatch(characterActions.currenciesSet(coin, destinationEntityTypeId, destinationEntityId));
}
else if (containerDefinitionKey === this.getPartyEquipmentContainerDefinitionKey()) {
this.dispatch(serviceDataActions.partyCurrenciesSet(coin, destinationEntityTypeId, destinationEntityId, () => {
typeof onSuccess === 'function' && onSuccess();
const data = {};
const eventType = this.EVENT_TYPES.ITEM_SHARED_FULFILLED;
this.sendMessage({ data, eventType });
}));
}
}
};
this.handleAmountSet = ({ key, amount, containerDefinitionKey }, onSuccess, onError) => {
switch (key) {
case 'pp':
this.handlePlatinumSet({ amount, containerDefinitionKey }, onSuccess, onError);
break;
case 'gp':
this.handleGoldSet({ amount, containerDefinitionKey }, onSuccess, onError);
break;
case 'sp':
this.handleSilverSet({ amount, containerDefinitionKey }, onSuccess, onError);
break;
case 'ep':
this.handleElectrumSet({ amount, containerDefinitionKey }, onSuccess, onError);
break;
case 'cp':
this.handleCopperSet({ amount, containerDefinitionKey }, onSuccess, onError);
break;
default:
//not implemented
}
};
this.handlePlatinumSet = ({ amount, containerDefinitionKey }, onSuccess, onError) => {
const destinationEntityId = DefinitionHacks.hack__getDefinitionKeyId(containerDefinitionKey);
const destinationEntityTypeId = DefinitionHacks.hack__getDefinitionKeyType(containerDefinitionKey);
if (destinationEntityId && destinationEntityTypeId) {
if (containerDefinitionKey === this.getCharacterContainerDefinitionKey()) {
this.dispatch(characterActions.currencyPlatinumSet(amount, destinationEntityTypeId, destinationEntityId));
}
else if (containerDefinitionKey === this.getPartyEquipmentContainerDefinitionKey()) {
this.dispatch(serviceDataActions.partyCurrencyPlatinumSet(amount, destinationEntityTypeId, destinationEntityId, () => {
typeof onSuccess === 'function' && onSuccess();
const data = {};
const eventType = this.EVENT_TYPES.ITEM_SHARED_FULFILLED;
this.sendMessage({ data, eventType });
}));
}
else {
const isShared = this.isSharedContainerDefinitionKey(containerDefinitionKey);
if (isShared) {
this.dispatch(serviceDataActions.partyItemCurrencyPlatinumSet(amount, destinationEntityTypeId, destinationEntityId, () => {
typeof onSuccess === 'function' && onSuccess();
const data = {};
const eventType = this.EVENT_TYPES.ITEM_SHARED_FULFILLED;
this.sendMessage({ data, eventType });
}));
}
else {
this.dispatch(characterActions.itemCurrencyPlatinumSet(amount, destinationEntityTypeId, destinationEntityId));
}
}
}
};
this.handleGoldSet = ({ amount, containerDefinitionKey }, onSuccess, onError) => {
const destinationEntityId = DefinitionHacks.hack__getDefinitionKeyId(containerDefinitionKey);
const destinationEntityTypeId = DefinitionHacks.hack__getDefinitionKeyType(containerDefinitionKey);
if (destinationEntityId && destinationEntityTypeId) {
if (containerDefinitionKey === this.getCharacterContainerDefinitionKey()) {
this.dispatch(characterActions.currencyGoldSet(amount, destinationEntityTypeId, destinationEntityId));
}
else if (containerDefinitionKey === this.getPartyEquipmentContainerDefinitionKey()) {
this.dispatch(serviceDataActions.partyCurrencyGoldSet(amount, destinationEntityTypeId, destinationEntityId, () => {
typeof onSuccess === 'function' && onSuccess();
const data = {};
const eventType = this.EVENT_TYPES.ITEM_SHARED_FULFILLED;
this.sendMessage({ data, eventType });
}));
}
else {
const isShared = this.isSharedContainerDefinitionKey(containerDefinitionKey);
if (isShared) {
this.dispatch(serviceDataActions.partyItemCurrencyGoldSet(amount, destinationEntityTypeId, destinationEntityId, () => {
typeof onSuccess === 'function' && onSuccess();
const data = {};
const eventType = this.EVENT_TYPES.ITEM_SHARED_FULFILLED;
this.sendMessage({ data, eventType });
}));
}
else {
this.dispatch(characterActions.itemCurrencyGoldSet(amount, destinationEntityTypeId, destinationEntityId));
}
}
}
};
this.handleElectrumSet = ({ amount, containerDefinitionKey }, onSuccess, onError) => {
const destinationEntityId = DefinitionHacks.hack__getDefinitionKeyId(containerDefinitionKey);
const destinationEntityTypeId = DefinitionHacks.hack__getDefinitionKeyType(containerDefinitionKey);
if (destinationEntityId && destinationEntityTypeId) {
if (containerDefinitionKey === this.getCharacterContainerDefinitionKey()) {
this.dispatch(characterActions.currencyElectrumSet(amount, destinationEntityTypeId, destinationEntityId));
}
else if (containerDefinitionKey === this.getPartyEquipmentContainerDefinitionKey()) {
this.dispatch(serviceDataActions.partyCurrencyElectrumSet(amount, destinationEntityTypeId, destinationEntityId, () => {
typeof onSuccess === 'function' && onSuccess();
const data = {};
const eventType = this.EVENT_TYPES.ITEM_SHARED_FULFILLED;
this.sendMessage({ data, eventType });
}));
}
else {
const isShared = this.isSharedContainerDefinitionKey(containerDefinitionKey);
if (isShared) {
this.dispatch(serviceDataActions.partyItemCurrencyElectrumSet(amount, destinationEntityTypeId, destinationEntityId, () => {
typeof onSuccess === 'function' && onSuccess();
const data = {};
const eventType = this.EVENT_TYPES.ITEM_SHARED_FULFILLED;
this.sendMessage({ data, eventType });
}));
}
else {
this.dispatch(characterActions.itemCurrencyElectrumSet(amount, destinationEntityTypeId, destinationEntityId));
}
}
}
};
this.handleSilverSet = ({ amount, containerDefinitionKey }, onSuccess, onError) => {
const destinationEntityId = DefinitionHacks.hack__getDefinitionKeyId(containerDefinitionKey);
const destinationEntityTypeId = DefinitionHacks.hack__getDefinitionKeyType(containerDefinitionKey);
if (destinationEntityId && destinationEntityTypeId) {
if (containerDefinitionKey === this.getCharacterContainerDefinitionKey()) {
this.dispatch(characterActions.currencySilverSet(amount, destinationEntityTypeId, destinationEntityId));
}
else if (containerDefinitionKey === this.getPartyEquipmentContainerDefinitionKey()) {
this.dispatch(serviceDataActions.partyCurrencySilverSet(amount, destinationEntityTypeId, destinationEntityId, () => {
typeof onSuccess === 'function' && onSuccess();
const data = {};
const eventType = this.EVENT_TYPES.ITEM_SHARED_FULFILLED;
this.sendMessage({ data, eventType });
}));
}
else {
const isShared = this.isSharedContainerDefinitionKey(containerDefinitionKey);
if (isShared) {
this.dispatch(serviceDataActions.partyItemCurrencySilverSet(amount, destinationEntityTypeId, destinationEntityId, () => {
typeof onSuccess === 'function' && onSuccess();
const data = {};
const eventType = this.EVENT_TYPES.ITEM_SHARED_FULFILLED;
this.sendMessage({ data, eventType });
}));
}
else {
this.dispatch(characterActions.itemCurrencySilverSet(amount, destinationEntityTypeId, destinationEntityId));
}
}
}
};
this.handleCopperSet = ({ amount, containerDefinitionKey }, onSuccess, onError) => {
const destinationEntityId = DefinitionHacks.hack__getDefinitionKeyId(containerDefinitionKey);
const destinationEntityTypeId = DefinitionHacks.hack__getDefinitionKeyType(containerDefinitionKey);
if (destinationEntityId && destinationEntityTypeId) {
if (containerDefinitionKey === this.getCharacterContainerDefinitionKey()) {
this.dispatch(characterActions.currencyCopperSet(amount, destinationEntityTypeId, destinationEntityId));
}
else if (containerDefinitionKey === this.getPartyEquipmentContainerDefinitionKey()) {
this.dispatch(serviceDataActions.partyCurrencyCopperSet(amount, destinationEntityTypeId, destinationEntityId, () => {
typeof onSuccess === 'function' && onSuccess();
const data = {};
const eventType = this.EVENT_TYPES.ITEM_SHARED_FULFILLED;
this.sendMessage({ data, eventType });
}));
}
else {
const isShared = this.isSharedContainerDefinitionKey(containerDefinitionKey);
if (isShared) {
this.dispatch(serviceDataActions.partyItemCurrencyCopperSet(amount, destinationEntityTypeId, destinationEntityId, () => {
typeof onSuccess === 'function' && onSuccess();
const data = {};
const eventType = this.EVENT_TYPES.ITEM_SHARED_FULFILLED;
this.sendMessage({ data, eventType });
}));
}
else {
this.dispatch(characterActions.itemCurrencyCopperSet(amount, destinationEntityTypeId, destinationEntityId));
}
}
}
};
// Validators
this.canAddCoin = (coin, containerDefinitionKey) => {
const containerLookup = rulesEngineSelectors.getContainerLookup(this.state);
const container = HelperUtils.lookupDataOrFallback(containerLookup, containerDefinitionKey);
const isShared = container ? ContainerAccessors.isShared(container) : false;
if (isShared && this.isSharingTurnedDeleteOnly()) {
return false;
}
return true;
};
this.canRemoveCoin = (coin, containerDefinitionKey) => {
const containerLookup = rulesEngineSelectors.getContainerLookup(this.state);
const container = HelperUtils.lookupDataOrFallback(containerLookup, containerDefinitionKey);
const isShared = container ? ContainerAccessors.isShared(container) : false;
if (isShared && this.isSharingTurnedDeleteOnly()) {
let hasNegatives = Object.values(coin).some((value) => value < 0);
return !hasNegatives;
}
return true;
};
this.canUseCointainers = () => {
const rulesEngineConfig = ConfigUtils.getCurrentRulesEngineConfig();
const preferences = rulesEngineSelectors.getPreferences(this.state);
return !!((preferences === null || preferences === void 0 ? void 0 : preferences.enableContainerCurrency) && (rulesEngineConfig === null || rulesEngineConfig === void 0 ? void 0 : rulesEngineConfig.canUseCurrencyContainers));
};
//Utils
this.getTotalContainerCoinInGold = (containerDefinitionKey) => {
const ruleData = rulesEngineSelectors.getRuleData(this.state);
const coin = this.getContainerCoin(containerDefinitionKey);
return coin ? CoreUtils.convertTotalCoinToGold(coin, ruleData) : 0;
};
this.getContainerCoin = (containerDefinitionKey) => {
const containerLookup = rulesEngineSelectors.getContainerLookup(this.state);
const container = HelperUtils.lookupDataOrFallback(containerLookup, containerDefinitionKey);
return container ? ContainerAccessors.getCoin(container) : null;
};
this.getAllPartyCoin = () => {
const partyContainers = rulesEngineSelectors.getPartyInventoryContainers(this.state);
return partyContainers.reduce((acc, container) => {
const containerCoin = ContainerAccessors.getCoin(container);
return containerCoin
? {
cp: containerCoin.cp ? acc.cp + containerCoin.cp : acc.cp,
sp: containerCoin.sp ? acc.sp + containerCoin.sp : acc.sp,
ep: containerCoin.ep ? acc.ep + containerCoin.ep : acc.ep,
gp: containerCoin.gp ? acc.gp + containerCoin.gp : acc.gp,
pp: containerCoin.pp ? acc.pp + containerCoin.pp : acc.pp,
}
: acc;
}, { cp: 0, sp: 0, ep: 0, gp: 0, pp: 0 });
};
this.getAllCharacterCoin = () => {
const characterContainers = rulesEngineSelectors.getCharacterInventoryContainers(this.state);
return characterContainers.reduce((acc, container) => {
const containerCoin = ContainerAccessors.getCoin(container);
return containerCoin
? {
cp: containerCoin.cp ? acc.cp + containerCoin.cp : acc.cp,
sp: containerCoin.sp ? acc.sp + containerCoin.sp : acc.sp,
ep: containerCoin.ep ? acc.ep + containerCoin.ep : acc.ep,
gp: containerCoin.gp ? acc.gp + containerCoin.gp : acc.gp,
pp: containerCoin.pp ? acc.pp + containerCoin.pp : acc.pp,
}
: acc;
}, { cp: 0, sp: 0, ep: 0, gp: 0, pp: 0 });
};
}
calculateAddCoinPayload(currentCoins, copper, electrum, gold, platinum, silver) {
const cp = copper !== 0 ? this.calculateModifiedMaxValue(currentCoins === null || currentCoins === void 0 ? void 0 : currentCoins.cp, copper) : 0;
const ep = electrum !== 0 ? this.calculateModifiedMaxValue(currentCoins === null || currentCoins === void 0 ? void 0 : currentCoins.ep, electrum) : 0;
const gp = gold !== 0 ? this.calculateModifiedMaxValue(currentCoins === null || currentCoins === void 0 ? void 0 : currentCoins.gp, gold) : 0;
const pp = platinum !== 0 ? this.calculateModifiedMaxValue(currentCoins === null || currentCoins === void 0 ? void 0 : currentCoins.pp, platinum) : 0;
const sp = silver !== 0 ? this.calculateModifiedMaxValue(currentCoins === null || currentCoins === void 0 ? void 0 : currentCoins.sp, silver) : 0;
return this.calculateCoinPayload(cp, ep, gp, pp, sp);
}
calculateRemoveCoinPayload(currentCoins, copper, electrum, gold, platinum, silver) {
const cp = copper !== 0 ? this.calculateModifiedMinValue(currentCoins === null || currentCoins === void 0 ? void 0 : currentCoins.cp, copper) : 0;
const ep = electrum !== 0 ? this.calculateModifiedMinValue(currentCoins === null || currentCoins === void 0 ? void 0 : currentCoins.ep, electrum) : 0;
const gp = gold !== 0 ? this.calculateModifiedMinValue(currentCoins === null || currentCoins === void 0 ? void 0 : currentCoins.gp, gold) : 0;
const pp = platinum !== 0 ? this.calculateModifiedMinValue(currentCoins === null || currentCoins === void 0 ? void 0 : currentCoins.pp, platinum) : 0;
const sp = silver !== 0 ? this.calculateModifiedMinValue(currentCoins === null || currentCoins === void 0 ? void 0 : currentCoins.sp, silver) : 0;
return this.calculateCoinPayload(cp, ep, gp, pp, sp);
}
calculateCoinPayload(cp, ep, gp, pp, sp) {
const coinPayload = {};
if (cp === null || ep === null || gp === null || pp === null || sp === null)
return null;
if (cp !== 0)
coinPayload.cp = cp;
if (ep !== 0)
coinPayload.ep = ep;
if (gp !== 0)
coinPayload.gp = gp;
if (pp !== 0)
coinPayload.pp = pp;
if (sp !== 0)
coinPayload.sp = sp;
return coinPayload;
}
calculateModifiedMinValue(baseValue, value) {
const result = (baseValue || 0) - value;
if (result >= CURRENCY_VALUE.MIN) {
return value;
}
else {
return null;
}
}
calculateModifiedMaxValue(baseValue, value) {
const result = (baseValue || 0) + value;
if (result <= CURRENCY_VALUE.MAX) {
return value;
}
else {
return null;
}
}
}