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

1323 lines
59 KiB
JavaScript

import * as actionTypes from '../actions/character/actionTypes';
import * as serviceDataActionTypes from '../actions/serviceData/actionTypes';
import { ActionAccessors } from '../engine/Action';
import { CreatureAccessors } from '../engine/Creature';
import { DataOriginTypeEnum } from '../engine/DataOrigin';
import { DefinitionHacks } from '../engine/Definition';
import { LimitedUseResetTypeEnum } from '../engine/LimitedUse';
import { SpellAccessors } from '../engine/Spell';
import { initialChoiceComponentState, } from '../generated';
import { updateSpellSlots } from './utils';
export const initialCoinState = {
cp: 0,
ep: 0,
gp: 0,
pp: 0,
sp: 0,
};
export function currencies(state = initialCoinState, action) {
let newCurrencies = state;
if (newCurrencies === null) {
newCurrencies = {
cp: 0,
ep: 0,
gp: 0,
pp: 0,
sp: 0,
};
}
switch (action.type) {
case actionTypes.CURRENCIES_SET_COMMIT:
case serviceDataActionTypes.PARTY_CURRENCIES_SET_COMMIT:
return Object.assign({}, action.payload);
case actionTypes.CURRENCY_COPPER_SET_COMMIT:
case actionTypes.ITEM_CURRENCY_COPPER_SET_COMMIT:
case serviceDataActionTypes.PARTY_ITEM_CURRENCY_COPPER_SET_COMMIT:
case serviceDataActionTypes.PARTY_CURRENCY_COPPER_SET_COMMIT:
return Object.assign(Object.assign({}, newCurrencies), { cp: action.payload.amount });
case actionTypes.CURRENCY_ELECTRUM_SET_COMMIT:
case actionTypes.ITEM_CURRENCY_ELECTRUM_SET_COMMIT:
case serviceDataActionTypes.PARTY_ITEM_CURRENCY_ELECTRUM_SET_COMMIT:
case serviceDataActionTypes.PARTY_CURRENCY_ELECTRUM_SET_COMMIT:
return Object.assign(Object.assign({}, newCurrencies), { ep: action.payload.amount });
case actionTypes.CURRENCY_GOLD_SET_COMMIT:
case actionTypes.ITEM_CURRENCY_GOLD_SET_COMMIT:
case serviceDataActionTypes.PARTY_ITEM_CURRENCY_GOLD_SET_COMMIT:
case serviceDataActionTypes.PARTY_CURRENCY_GOLD_SET_COMMIT:
return Object.assign(Object.assign({}, newCurrencies), { gp: action.payload.amount });
case actionTypes.CURRENCY_PLATINUM_SET_COMMIT:
case actionTypes.ITEM_CURRENCY_PLATINUM_SET_COMMIT:
case serviceDataActionTypes.PARTY_ITEM_CURRENCY_PLATINUM_SET_COMMIT:
case serviceDataActionTypes.PARTY_CURRENCY_PLATINUM_SET_COMMIT:
return Object.assign(Object.assign({}, newCurrencies), { pp: action.payload.amount });
case actionTypes.CURRENCY_SILVER_SET_COMMIT:
case actionTypes.ITEM_CURRENCY_SILVER_SET_COMMIT:
case serviceDataActionTypes.PARTY_ITEM_CURRENCY_SILVER_SET_COMMIT:
case serviceDataActionTypes.PARTY_CURRENCY_SILVER_SET_COMMIT:
return Object.assign(Object.assign({}, newCurrencies), { sp: action.payload.amount });
case actionTypes.ITEM_CURRENCY_SET_COMMIT:
case serviceDataActionTypes.PARTY_ITEM_CURRENCY_SET_COMMIT:
return state
? Object.assign(Object.assign({}, state), action.payload.currency) : Object.assign({}, action.payload.currency);
default:
//not implemented
}
return newCurrencies;
}
const initialLimitedUseState = {
maxNumberConsumed: 0,
maxUses: 0,
minNumberConsumed: 0,
name: '',
numberUsed: 0,
operator: null,
resetDice: null,
resetType: LimitedUseResetTypeEnum.SHORT_REST,
statModifierUsesId: null,
proficiencyBonusOperator: null,
useProficiencyBonus: false,
};
function limitedUse(state = initialLimitedUseState, action) {
switch (action.type) {
case actionTypes.ACTION_USE_SET_COMMIT:
case actionTypes.SPELL_USE_SET_COMMIT:
return Object.assign(Object.assign({}, state), { numberUsed: action.payload.uses });
default:
// not implemented
}
return state;
}
const initialItemLimitedUseState = {
maxUses: 0,
numberUsed: 0,
resetType: null,
resetTypeDescription: null,
};
function itemLimitedUse(state = initialItemLimitedUseState, action) {
switch (action.type) {
case actionTypes.ITEM_CHARGES_SET_COMMIT:
case serviceDataActionTypes.PARTY_ITEM_CHARGES_SET_COMMIT:
return Object.assign(Object.assign({}, state), { numberUsed: action.payload.uses });
default:
// not implemented
}
return state;
}
const initialStatEntityState = {
id: -1,
value: null,
name: '',
};
function statEntity(state = initialStatEntityState, action) {
switch (action.type) {
case actionTypes.ABILITY_SCORE_BASE_SET_COMMIT:
case actionTypes.ABILITY_SCORE_OVERRIDE_SET_COMMIT:
case actionTypes.ABILITY_SCORE_BONUS_SET_COMMIT:
return Object.assign(Object.assign({}, state), { value: action.payload.value });
default:
// not implemented
}
return state;
}
function getKeyedComponentData(state, action, actionKey, key) {
if (action.payload[actionKey].hasOwnProperty(key)) {
return action.payload[actionKey][key];
}
return state[key];
}
const initialActionComponentState = {
background: [],
class: [],
feat: [],
item: [],
race: [],
};
function actionComponents(state = initialActionComponentState, action) {
if (!action.payload.hasOwnProperty('actions')) {
return state;
}
switch (action.type) {
case actionTypes.ACTIONS_SET_COMMIT:
case actionTypes.CHARACTER_COMPONENTS_SET_COMMIT:
return {
background: getKeyedComponentData(state, action, 'actions', 'background'),
class: getKeyedComponentData(state, action, 'actions', 'class'),
feat: getKeyedComponentData(state, action, 'actions', 'feat'),
item: getKeyedComponentData(state, action, 'actions', 'item'),
race: getKeyedComponentData(state, action, 'actions', 'race'),
};
default:
// not implemented
}
return state;
}
function choiceComponents(state = initialChoiceComponentState, action) {
if (!action.payload.hasOwnProperty('choices')) {
return state;
}
switch (action.type) {
case actionTypes.CHOICES_SET_COMMIT:
case actionTypes.CHARACTER_COMPONENTS_SET_COMMIT:
return {
background: getKeyedComponentData(state, action, 'choices', 'background'),
class: getKeyedComponentData(state, action, 'choices', 'class'),
feat: getKeyedComponentData(state, action, 'choices', 'feat'),
item: getKeyedComponentData(state, action, 'choices', 'item'),
race: getKeyedComponentData(state, action, 'choices', 'race'),
choiceDefinitions: getKeyedComponentData(state, action, 'choices', 'choiceDefinitions'),
definitionKeyNameMap: getKeyedComponentData(state, action, 'choices', 'definitionKeyNameMap'),
};
default:
// not implemented
}
return state;
}
const initialModifierComponentState = {
background: [],
class: [],
condition: [],
feat: [],
item: [],
race: [],
};
function modifierComponents(state = initialModifierComponentState, action) {
if (!action.payload.hasOwnProperty('modifiers')) {
return state;
}
switch (action.type) {
case actionTypes.MODIFIERS_SET_COMMIT:
case actionTypes.CHARACTER_COMPONENTS_SET_COMMIT:
return {
background: getKeyedComponentData(state, action, 'modifiers', 'background'),
class: getKeyedComponentData(state, action, 'modifiers', 'class'),
condition: getKeyedComponentData(state, action, 'modifiers', 'condition'),
feat: getKeyedComponentData(state, action, 'modifiers', 'feat'),
item: getKeyedComponentData(state, action, 'modifiers', 'item'),
race: getKeyedComponentData(state, action, 'modifiers', 'race'),
};
default:
// not implemented
}
return state;
}
const initialOptionComponentState = {
background: [],
class: [],
feat: [],
item: [],
race: [],
};
function optionComponents(state = initialOptionComponentState, action) {
if (!action.payload.hasOwnProperty('options')) {
return state;
}
switch (action.type) {
case actionTypes.OPTIONS_SET_COMMIT:
case actionTypes.CHARACTER_COMPONENTS_SET_COMMIT:
return {
background: getKeyedComponentData(state, action, 'options', 'background'),
class: getKeyedComponentData(state, action, 'options', 'class'),
feat: getKeyedComponentData(state, action, 'options', 'feat'),
item: getKeyedComponentData(state, action, 'options', 'item'),
race: getKeyedComponentData(state, action, 'options', 'race'),
};
default:
// not implemented
}
return state;
}
const initialSpellComponentState = {
background: [],
class: [],
feat: [],
item: [],
race: [],
};
function spellComponents(state = initialSpellComponentState, action) {
if (!action.payload.hasOwnProperty('spells')) {
return state;
}
switch (action.type) {
case actionTypes.CHARACTER_SPELLS_SET_COMMIT:
case actionTypes.CHARACTER_COMPONENTS_SET_COMMIT:
return {
background: getKeyedComponentData(state, action, 'spells', 'background'),
class: getKeyedComponentData(state, action, 'spells', 'class'),
feat: getKeyedComponentData(state, action, 'spells', 'feat'),
item: getKeyedComponentData(state, action, 'spells', 'item'),
race: getKeyedComponentData(state, action, 'spells', 'race'),
};
default:
// not implemented
}
return state;
}
const initialItemState = {
chargesUsed: 0,
containerEntityId: -1,
containerEntityTypeId: -1,
containerDefinitionKey: '-1:-1',
currency: null,
definition: null,
definitionId: -1,
definitionTypeId: -1,
displayAsAttack: null,
entityTypeId: -1,
equipped: null,
equippedEntityId: null,
equippedEntityTypeId: null,
id: -1,
isAttuned: null,
limitedUse: null,
quantity: -1,
};
export function itemReducer(state = initialItemState, action) {
switch (action.type) {
case actionTypes.ITEM_EQUIPPED_SET_COMMIT:
case serviceDataActionTypes.PARTY_ITEM_EQUIPPED_SET_COMMIT:
return Object.assign(Object.assign({}, state), { equipped: action.payload.value, equippedEntityId: action.payload.equippedEntityId, equippedEntityTypeId: action.payload.equippedEntityTypeId });
case actionTypes.ITEM_ATTUNE_SET_COMMIT:
case serviceDataActionTypes.PARTY_ITEM_ATTUNE_SET_COMMIT:
return Object.assign(Object.assign({}, state), { isAttuned: action.payload.value });
case actionTypes.ITEM_QUANTITY_SET_COMMIT:
case serviceDataActionTypes.PARTY_ITEM_QUANTITY_SET_COMMIT:
return Object.assign(Object.assign({}, state), { quantity: action.payload.quantity });
case actionTypes.ITEM_CHARGES_SET_COMMIT:
case serviceDataActionTypes.PARTY_ITEM_CHARGES_SET_COMMIT:
return Object.assign(Object.assign({}, state), { limitedUse: itemLimitedUse(state.limitedUse === null ? undefined : state.limitedUse, action) });
case actionTypes.ITEM_MOVE_SET_COMMIT:
case serviceDataActionTypes.PARTY_ITEM_MOVE_SET_COMMIT:
return Object.assign(Object.assign({}, state), { containerEntityId: action.payload.containerEntityId, containerEntityTypeId: action.payload.containerEntityTypeId, containerDefinitionKey: DefinitionHacks.hack__generateDefinitionKey(action.payload.containerEntityTypeId, action.payload.containerEntityId) });
case actionTypes.ITEM_CURRENCY_SET_COMMIT:
case actionTypes.ITEM_CURRENCY_COPPER_SET_COMMIT:
case actionTypes.ITEM_CURRENCY_ELECTRUM_SET_COMMIT:
case actionTypes.ITEM_CURRENCY_GOLD_SET_COMMIT:
case actionTypes.ITEM_CURRENCY_PLATINUM_SET_COMMIT:
case actionTypes.ITEM_CURRENCY_SILVER_SET_COMMIT:
case serviceDataActionTypes.PARTY_ITEM_CURRENCY_SET_COMMIT:
case serviceDataActionTypes.PARTY_ITEM_CURRENCY_COPPER_SET_COMMIT:
case serviceDataActionTypes.PARTY_ITEM_CURRENCY_ELECTRUM_SET_COMMIT:
case serviceDataActionTypes.PARTY_ITEM_CURRENCY_GOLD_SET_COMMIT:
case serviceDataActionTypes.PARTY_ITEM_CURRENCY_PLATINUM_SET_COMMIT:
case serviceDataActionTypes.PARTY_ITEM_CURRENCY_SILVER_SET_COMMIT:
return Object.assign(Object.assign({}, state), { currency: currencies(state.currency, action) });
default:
// not implemented
}
return state;
}
const initialInventoryState = [];
export function inventory(state = initialInventoryState, action) {
switch (action.type) {
case serviceDataActionTypes.PARTY_ITEM_EQUIPPED_SET_COMMIT:
case serviceDataActionTypes.PARTY_ITEM_ATTUNE_SET_COMMIT:
case serviceDataActionTypes.PARTY_ITEM_QUANTITY_SET_COMMIT:
case serviceDataActionTypes.PARTY_ITEM_CHARGES_SET_COMMIT:
case serviceDataActionTypes.PARTY_ITEM_MOVE_SET_COMMIT:
case actionTypes.ITEM_EQUIPPED_SET_COMMIT:
case actionTypes.ITEM_ATTUNE_SET_COMMIT:
case actionTypes.ITEM_QUANTITY_SET_COMMIT:
case actionTypes.ITEM_CHARGES_SET_COMMIT:
case actionTypes.ITEM_MOVE_SET_COMMIT:
case actionTypes.ITEM_CURRENCY_SET_COMMIT:
case serviceDataActionTypes.PARTY_ITEM_CURRENCY_SET_COMMIT: {
const itemIdx = state.findIndex((item) => item.id === action.payload.id);
return itemIdx > -1
? [...state.slice(0, itemIdx), itemReducer(state[itemIdx], action), ...state.slice(itemIdx + 1)]
: [...state];
}
case serviceDataActionTypes.PARTY_ITEM_REMOVE_COMMIT:
case actionTypes.ITEM_REMOVE_COMMIT:
return state.filter((entity) => entity.id !== action.payload.id);
case serviceDataActionTypes.PARTY_ITEM_ADD_COMMIT:
case actionTypes.ITEM_ADD_COMMIT: {
const itemIdx = state.findIndex((item) => item.id === action.payload.item.id);
if (itemIdx > -1) {
return [...state.slice(0, itemIdx), action.payload.item, ...state.slice(itemIdx + 1)];
}
return [...state, action.payload.item];
}
case actionTypes.ITEM_CURRENCY_COPPER_SET_COMMIT:
case actionTypes.ITEM_CURRENCY_SILVER_SET_COMMIT:
case actionTypes.ITEM_CURRENCY_ELECTRUM_SET_COMMIT:
case actionTypes.ITEM_CURRENCY_GOLD_SET_COMMIT:
case actionTypes.ITEM_CURRENCY_PLATINUM_SET_COMMIT:
case serviceDataActionTypes.PARTY_ITEM_CURRENCY_COPPER_SET_COMMIT:
case serviceDataActionTypes.PARTY_ITEM_CURRENCY_SILVER_SET_COMMIT:
case serviceDataActionTypes.PARTY_ITEM_CURRENCY_ELECTRUM_SET_COMMIT:
case serviceDataActionTypes.PARTY_ITEM_CURRENCY_GOLD_SET_COMMIT:
case serviceDataActionTypes.PARTY_ITEM_CURRENCY_PLATINUM_SET_COMMIT: {
const itemIdx = state.findIndex((item) => item.id === action.payload.destinationEntityId);
return itemIdx > -1
? [...state.slice(0, itemIdx), itemReducer(state[itemIdx], action), ...state.slice(itemIdx + 1)]
: [...state];
}
default:
// not implemented
}
return state;
}
const initialSpellState = {
activation: null,
additionalDescription: null,
alwaysPrepared: false,
atWillLimitedUseLevel: null,
baseLevelAtWill: false,
castAtLevel: null,
castOnlyAsRitual: false,
componentId: -1,
componentTypeId: -1,
countsAsKnownSpell: false,
definition: null,
definitionId: -1,
displayAsAttack: null,
entityTypeId: -1,
id: -1,
isSignatureSpell: false,
limitedUse: null,
overrideSaveDc: null,
prepared: false,
range: null,
restriction: null,
ritualCastingType: null,
spellCastingAbilityId: null,
spellListId: null,
usesSpellSlot: false,
};
function spellEntity(state = initialSpellState, action) {
switch (action.type) {
case actionTypes.SPELL_PREPARED_SET_COMMIT:
return Object.assign(Object.assign({}, state), { prepared: action.payload.prepared });
case actionTypes.SPELL_USE_SET_COMMIT:
if (!state.limitedUse) {
return state;
}
return Object.assign(Object.assign({}, state), { limitedUse: limitedUse(state.limitedUse, action) });
default:
// not implemented
}
return state;
}
const initialSlotEntitiesState = [];
function slotEntities(state = initialSlotEntitiesState, action) {
switch (action.type) {
case actionTypes.SPELL_LEVEL_SPELL_SLOTS_SET_COMMIT: {
let newSpellSlots = [...state];
Object.keys(action.payload).forEach((key) => {
let spellLevel = null;
switch (key) {
case 'level1':
spellLevel = 1;
break;
case 'level2':
spellLevel = 2;
break;
case 'level3':
spellLevel = 3;
break;
case 'level4':
spellLevel = 4;
break;
case 'level5':
spellLevel = 5;
break;
case 'level6':
spellLevel = 6;
break;
case 'level7':
spellLevel = 7;
break;
case 'level8':
spellLevel = 8;
break;
case 'level9':
spellLevel = 9;
break;
}
const payloadLevelValue = action.payload[key];
const slotsUsed = payloadLevelValue === undefined ? null : payloadLevelValue;
newSpellSlots = updateSpellSlots(newSpellSlots, spellLevel, slotsUsed);
});
return newSpellSlots;
}
case actionTypes.SPELL_LEVEL_PACT_MAGIC_SLOTS_SET_COMMIT: {
let newSpellSlots = [...state];
Object.keys(action.payload).forEach((key) => {
let spellLevel = null;
switch (key) {
case 'level1':
spellLevel = 1;
break;
case 'level2':
spellLevel = 2;
break;
case 'level3':
spellLevel = 3;
break;
case 'level4':
spellLevel = 4;
break;
case 'level5':
spellLevel = 5;
break;
}
const payloadLevelValue = action.payload[key];
const slotsUsed = payloadLevelValue === undefined ? null : payloadLevelValue;
newSpellSlots = updateSpellSlots(newSpellSlots, spellLevel, slotsUsed);
});
return newSpellSlots;
}
default:
// not implemented
}
return state;
}
const initialClassState = {
definition: null,
definitionId: -1,
entityTypeId: -1,
id: -1,
isStartingClass: false,
level: -1,
subclassDefinition: null,
subclassDefinitionId: -1,
classFeatures: [],
hitDiceUsed: 0,
};
function classEntity(state = initialClassState, action) {
switch (action.type) {
case actionTypes.CLASS_SET:
return Object.assign({}, action.payload);
default:
// not implemented
}
return state;
}
const initialOptionalClassFeatureState = {
affectedClassFeatureId: null,
affectedClassFeatureDefinitionKey: null,
classFeatureDefinitionKey: null,
classFeatureId: -1,
};
function optionalClassFeature(state = initialOptionalClassFeatureState, action) {
switch (action.type) {
case actionTypes.OPTIONAL_CLASS_FEATURE_SET_COMMIT: {
return Object.assign(Object.assign({}, state), action.payload);
}
default:
//not implemented
}
return state;
}
const initialOptionalClassFeaturesState = [];
function optionalClassFeatures(state = initialOptionalClassFeaturesState, action) {
switch (action.type) {
case actionTypes.OPTIONAL_CLASS_FEATURE_ADD_COMMIT: {
return [...state, action.payload.optionalClassFeature];
}
case actionTypes.OPTIONAL_CLASS_FEATURE_REMOVE_COMMIT: {
return state.filter((featureMapping) => featureMapping.classFeatureId !== action.payload.classFeatureId);
}
case actionTypes.OPTIONAL_CLASS_FEATURE_SET_COMMIT: {
const optionalFeatureIndex = state.findIndex((featureMapping) => featureMapping.classFeatureId === action.payload.classFeatureId);
return [
...state.slice(0, optionalFeatureIndex),
optionalClassFeature(state[optionalFeatureIndex], action),
...state.slice(optionalFeatureIndex + 1),
];
}
default:
//not implemented
}
return state;
}
const initialOptionalOriginState = {
affectedRacialTraitId: null,
affectedRacialTraitDefinitionKey: null,
racialTraitDefinitionKey: null,
racialTraitId: -1,
};
function optionalOrigin(state = initialOptionalOriginState, action) {
switch (action.type) {
case actionTypes.OPTIONAL_ORIGIN_SET_COMMIT: {
return Object.assign(Object.assign({}, state), action.payload);
}
default:
//not implemented
}
return state;
}
const initialOptionalOriginsState = [];
function optionalOrigins(state = initialOptionalOriginsState, action) {
switch (action.type) {
case actionTypes.OPTIONAL_ORIGIN_ADD_COMMIT: {
return [...state, action.payload.optionalOrigin];
}
case actionTypes.OPTIONAL_ORIGIN_REMOVE_COMMIT: {
return state.filter((featureMapping) => featureMapping.racialTraitId !== action.payload.racialTraitId);
}
case actionTypes.OPTIONAL_ORIGIN_SET_COMMIT: {
const optionalFeatureIndex = state.findIndex((featureMapping) => featureMapping.racialTraitId === action.payload.racialTraitId);
return [
...state.slice(0, optionalFeatureIndex),
optionalOrigin(state[optionalFeatureIndex], action),
...state.slice(optionalFeatureIndex + 1),
];
}
default:
//not implemented
}
return state;
}
const initialCampaignSettingState = {
campaignSettingId: 1,
enabledSourceIds: [],
};
function campaignSetting(state = initialCampaignSettingState, action) {
switch (action.type) {
case actionTypes.CAMPAIGN_SETTING_SET_COMMIT: {
return Object.assign(Object.assign({}, state), action.payload);
}
default:
//not implemented
}
return state;
}
const initialActionState = {
abilityModifierStatId: null,
actionType: null,
activation: null,
ammunition: null,
attackSubtype: null,
attackTypeRange: null,
componentId: -1,
componentTypeId: -1,
damageTypeId: null,
description: '',
dice: null,
displayAsAttack: null,
entityTypeId: null,
fixedSaveDc: null,
fixedToHit: null,
id: null,
isMartialArts: false,
isProficient: false,
limitedUse: null,
name: '',
numberOfTargets: null,
onMissDescription: '',
range: null,
saveFailDescription: '',
saveStatId: null,
saveSuccessDescription: '',
snippet: '',
spellRangeType: null,
value: null,
};
function characterAction(state = initialActionState, action) {
switch (action.type) {
case actionTypes.ACTION_USE_SET_COMMIT:
if (!state.limitedUse) {
return state;
}
return Object.assign(Object.assign({}, state), { limitedUse: limitedUse(state.limitedUse, action) });
default:
// not implemented
}
return state;
}
const initialCreatureEntityState = {
definition: null,
description: null,
entityTypeId: -1,
groupId: -1,
id: -1,
isActive: false,
name: '',
removedHitPoints: 0,
temporaryHitPoints: null,
};
function creatureEntity(state = initialCreatureEntityState, action) {
switch (action.type) {
case actionTypes.CREATURE_ACTIVE_SET_COMMIT:
return Object.assign(Object.assign({}, state), { isActive: action.payload.isActive });
case actionTypes.CREATURE_HIT_POINTS_SET_COMMIT:
return Object.assign(Object.assign({}, state), { removedHitPoints: action.payload.removedHitPoints, temporaryHitPoints: action.payload.temporaryHitPoints });
case actionTypes.CREATURE_DATA_SET_COMMIT:
return Object.assign(Object.assign({}, state), action.payload.properties);
default:
// not implemented
}
return state;
}
const initialClassSpellsEntityState = {
characterClassId: 0,
spells: [],
entityTypeId: -1,
};
function classSpellsEntity(state = initialClassSpellsEntityState, action) {
switch (action.type) {
case actionTypes.SPELL_ADD_COMMIT:
if (state.spells === null) {
return state;
}
return Object.assign(Object.assign({}, state), { spells: [...state.spells, action.payload.spell] });
case actionTypes.SPELL_REMOVE_COMMIT:
if (state.spells === null) {
return state;
}
return Object.assign(Object.assign({}, state), { spells: state.spells.filter((spell) => !(SpellAccessors.getMappingEntityTypeId(spell) === action.payload.entityTypeId &&
SpellAccessors.getMappingId(spell) === action.payload.id)) });
case actionTypes.SPELL_PREPARED_SET_COMMIT: {
if (state.spells === null) {
return state;
}
const spellIdx = state.spells.findIndex((spell) => SpellAccessors.getMappingEntityTypeId(spell) === action.payload.entityTypeId &&
SpellAccessors.getMappingId(spell) === action.payload.id);
if (spellIdx < 0) {
return state;
}
return Object.assign(Object.assign({}, state), { spells: [
...state.spells.slice(0, spellIdx),
spellEntity(state.spells[spellIdx], action),
...state.spells.slice(spellIdx + 1),
] });
}
default:
// not implemented
}
return state;
}
function getComponentDataOriginKey(dataOriginType) {
switch (dataOriginType) {
case DataOriginTypeEnum.BACKGROUND:
return 'background';
case DataOriginTypeEnum.CLASS_FEATURE:
return 'class';
case DataOriginTypeEnum.FEAT:
return 'feat';
case DataOriginTypeEnum.ITEM:
return 'item';
case DataOriginTypeEnum.RACE:
return 'race';
default:
// not implemented
}
return '';
}
const characterConfigInitialState = {
abilityScoreType: null,
showHelpText: false,
startingEquipmentType: null,
};
function characterConfiguration(state = characterConfigInitialState, action) {
switch (action.type) {
case actionTypes.SHOW_HELP_TEXT_SET:
return Object.assign(Object.assign({}, state), { showHelpText: action.payload.showHelpText });
case actionTypes.ABILITY_SCORE_TYPE_SET_COMMIT:
return Object.assign(Object.assign({}, state), { abilityScoreType: action.payload.abilityScoreType });
case actionTypes.STARTING_EQUIPMENT_TYPE_SET_COMMIT:
return Object.assign(Object.assign({}, state), { startingEquipmentType: action.payload.startingEquipmentType });
default:
// not implemented
}
return state;
}
export const initialState = {
actions: null,
activeSourceCategories: [],
adjustmentXp: null,
age: null,
alignmentId: null,
background: null,
baseHitPoints: 0,
bonusHitPoints: null,
bonusStats: [],
campaign: null,
campaignSetting: null,
canEdit: true,
characterValues: [],
choices: null,
classSpells: [],
classes: [],
conditions: [],
configuration: null,
creatures: [],
currencies: null,
currentXp: 0,
customActions: [],
customDefenseAdjustments: [],
customItems: [],
customProficiencies: [],
customSenses: [],
customSpeeds: [],
deathSaves: null,
decorations: null,
eyes: null,
faith: '',
feats: [],
gender: null,
hair: null,
height: null,
id: 0,
inspiration: false,
inventory: [],
lifestyle: null,
lifestyleId: null,
modifiers: null,
name: null,
notes: null,
optionalClassFeatures: [],
optionalOrigins: [],
options: null,
overrideHitPoints: null,
overrideStats: [],
pactMagic: [],
preferences: null,
race: null,
raceDefinitionId: null,
raceDefinitionTypeId: null,
readonlyUrl: '',
removedHitPoints: 0,
skin: null,
socialName: '',
spellSlots: [],
spells: null,
stats: [],
temporaryHitPoints: 0,
traits: null,
userId: -1,
username: '',
weight: null,
isAssignedToPlayer: false,
premadeInfo: null,
status: null,
statusSlug: null,
};
function character(state = initialState, action) {
switch (action.type) {
case actionTypes.CHARACTER_SET:
return Object.assign(Object.assign({}, state), action.payload);
case actionTypes.ALIGNMENT_SET_COMMIT:
return Object.assign(Object.assign({}, state), { alignmentId: action.payload.alignmentId });
case actionTypes.LIFESTYLE_SET_COMMIT:
return Object.assign(Object.assign({}, state), { lifestyleId: action.payload.lifestyleId });
case actionTypes.FAITH_SET_COMMIT:
return Object.assign(Object.assign({}, state), { faith: action.payload.faith });
case actionTypes.NAME_SET_COMMIT:
return Object.assign(Object.assign({}, state), { name: action.payload.name });
case actionTypes.HAIR_SET_COMMIT:
return Object.assign(Object.assign({}, state), { hair: action.payload.hair });
case actionTypes.SKIN_SET_COMMIT:
return Object.assign(Object.assign({}, state), { skin: action.payload.skin });
case actionTypes.EYES_SET_COMMIT:
return Object.assign(Object.assign({}, state), { eyes: action.payload.eyes });
case actionTypes.HEIGHT_SET_COMMIT:
return Object.assign(Object.assign({}, state), { height: action.payload.height });
case actionTypes.WEIGHT_SET_COMMIT:
return Object.assign(Object.assign({}, state), { weight: action.payload.weight });
case actionTypes.AGE_SET_COMMIT:
return Object.assign(Object.assign({}, state), { age: action.payload.age });
case actionTypes.GENDER_SET_COMMIT:
return Object.assign(Object.assign({}, state), { gender: action.payload.gender });
case actionTypes.RACE_SET_COMMIT:
return Object.assign(Object.assign({}, state), { race: action.payload.race });
case actionTypes.CLASS_ADD:
if (state.classes === null) {
return state;
}
return Object.assign(Object.assign({}, state), { classes: [...state.classes, action.payload.charClass] });
case actionTypes.CLASSES_SET_COMMIT:
return Object.assign(Object.assign({}, state), { classes: action.payload.classes });
case actionTypes.CLASS_SET: {
if (state.classes === null) {
return state;
}
const classIdx = state.classes.findIndex((charClass) => charClass.id === action.payload.id);
return Object.assign(Object.assign({}, state), { classes: [
...state.classes.slice(0, classIdx),
classEntity(state.classes[classIdx], action),
...state.classes.slice(classIdx + 1),
] });
}
case actionTypes.OPTIONAL_CLASS_FEATURE_ADD_COMMIT:
case actionTypes.OPTIONAL_CLASS_FEATURE_SET_COMMIT:
case actionTypes.OPTIONAL_CLASS_FEATURE_REMOVE_COMMIT: {
if (state.optionalClassFeatures === null) {
return state;
}
return Object.assign(Object.assign({}, state), { optionalClassFeatures: optionalClassFeatures(state.optionalClassFeatures, action) });
}
case actionTypes.OPTIONAL_ORIGIN_ADD_COMMIT:
case actionTypes.OPTIONAL_ORIGIN_SET_COMMIT:
case actionTypes.OPTIONAL_ORIGIN_REMOVE_COMMIT: {
if (state.optionalOrigins === null) {
return state;
}
return Object.assign(Object.assign({}, state), { optionalOrigins: optionalOrigins(state.optionalOrigins, action) });
}
case actionTypes.CAMPAIGN_SETTING_SET_COMMIT:
if (state.campaignSetting === null) {
return state;
}
return Object.assign(Object.assign({}, state), { campaignSetting: campaignSetting(state.campaignSetting, action) });
case actionTypes.NOTE_SET_COMMIT:
if (state.notes === null) {
return state;
}
return Object.assign(Object.assign({}, state), { notes: Object.assign(Object.assign({}, state.notes), { [action.payload.noteType]: action.payload.content }) });
case actionTypes.TRAIT_SET_COMMIT:
if (state.traits === null) {
return state;
}
return Object.assign(Object.assign({}, state), { traits: Object.assign(Object.assign({}, state.traits), { [action.payload.traitType]: action.payload.content }) });
case actionTypes.ITEM_REMOVE_COMMIT:
case actionTypes.ITEM_ADD_COMMIT:
case actionTypes.ITEM_EQUIPPED_SET_COMMIT:
case actionTypes.ITEM_ATTUNE_SET_COMMIT:
case actionTypes.ITEM_QUANTITY_SET_COMMIT:
case actionTypes.ITEM_CHARGES_SET_COMMIT:
case actionTypes.ITEM_MOVE_SET_COMMIT:
case actionTypes.ITEM_CURRENCY_SET_COMMIT:
case actionTypes.ITEM_CURRENCY_COPPER_SET_COMMIT:
case actionTypes.ITEM_CURRENCY_SILVER_SET_COMMIT:
case actionTypes.ITEM_CURRENCY_ELECTRUM_SET_COMMIT:
case actionTypes.ITEM_CURRENCY_GOLD_SET_COMMIT:
case actionTypes.ITEM_CURRENCY_PLATINUM_SET_COMMIT:
if (state.inventory === null) {
return state;
}
return Object.assign(Object.assign({}, state), { inventory: inventory(state.inventory, action) });
case actionTypes.CUSTOM_ITEM_ADD_COMMIT:
if (state.customItems === null) {
return state;
}
return Object.assign(Object.assign({}, state), { customItems: [...state.customItems, action.payload.item] });
case actionTypes.CUSTOM_ITEM_SET_COMMIT: {
if (state.customItems === null) {
return state;
}
const itemIdx = state.customItems.findIndex((item) => item.id === action.payload.id);
const item = Object.assign(Object.assign({}, state.customItems[itemIdx]), action.payload.properties);
return Object.assign(Object.assign({}, state), { customItems: [...state.customItems.slice(0, itemIdx), item, ...state.customItems.slice(itemIdx + 1)] });
}
case actionTypes.CUSTOM_ITEM_REMOVE_COMMIT:
if (state.customItems === null) {
return state;
}
return Object.assign(Object.assign({}, state), { customItems: state.customItems.filter((item) => item.id !== action.payload.id) });
case actionTypes.XP_SET:
return Object.assign(Object.assign({}, state), { currentXp: action.payload.currentXp });
case actionTypes.BASE_HIT_POINTS_SET_COMMIT:
return Object.assign(Object.assign({}, state), { baseHitPoints: action.payload.baseHitPoints });
case actionTypes.BONUS_HIT_POINTS_SET_COMMIT:
return Object.assign(Object.assign({}, state), { bonusHitPoints: action.payload.bonusHitPoints });
case actionTypes.OVERRIDE_HIT_POINTS_SET_COMMIT:
return Object.assign(Object.assign({}, state), { overrideHitPoints: action.payload.overrideHitPoints });
case actionTypes.ABILITY_SCORE_BASE_SET_COMMIT: {
if (state.stats === null) {
return state;
}
const statIdx = state.stats.findIndex((stat) => stat.id === action.payload.statId);
return Object.assign(Object.assign({}, state), { stats: [
...state.stats.slice(0, statIdx),
statEntity(state.stats[statIdx], action),
...state.stats.slice(statIdx + 1),
] });
}
case actionTypes.ABILITY_SCORE_OVERRIDE_SET_COMMIT: {
if (state.overrideStats === null) {
return state;
}
const statIdx = state.overrideStats.findIndex((stat) => stat.id === action.payload.statId);
return Object.assign(Object.assign({}, state), { overrideStats: [
...state.overrideStats.slice(0, statIdx),
statEntity(state.overrideStats[statIdx], action),
...state.overrideStats.slice(statIdx + 1),
] });
}
case actionTypes.ABILITY_SCORE_BONUS_SET_COMMIT: {
if (state.bonusStats === null) {
return state;
}
const statIdx = state.bonusStats.findIndex((stat) => stat.id === action.payload.statId);
return Object.assign(Object.assign({}, state), { bonusStats: [
...state.bonusStats.slice(0, statIdx),
statEntity(state.bonusStats[statIdx], action),
...state.bonusStats.slice(statIdx + 1),
] });
}
case actionTypes.CURRENCIES_SET_COMMIT:
case actionTypes.CURRENCY_COPPER_SET_COMMIT:
case actionTypes.CURRENCY_ELECTRUM_SET_COMMIT:
case actionTypes.CURRENCY_GOLD_SET_COMMIT:
case actionTypes.CURRENCY_PLATINUM_SET_COMMIT:
case actionTypes.CURRENCY_SILVER_SET_COMMIT:
return Object.assign(Object.assign({}, state), { currencies: currencies(state.currencies, action) });
case actionTypes.SPELL_PREPARED_SET_COMMIT:
case actionTypes.SPELL_ADD_COMMIT:
case actionTypes.SPELL_REMOVE_COMMIT: {
if (state.classSpells === null) {
return state;
}
const classSpellIdx = state.classSpells.findIndex((classSpell) => classSpell.characterClassId === action.payload.characterClassId);
if (classSpellIdx < 0) {
return state;
}
return Object.assign(Object.assign({}, state), { classSpells: [
...state.classSpells.slice(0, classSpellIdx),
classSpellsEntity(state.classSpells[classSpellIdx], action),
...state.classSpells.slice(classSpellIdx + 1),
] });
}
case actionTypes.BACKGROUND_SET_COMMIT:
return Object.assign(Object.assign({}, state), { background: action.payload.background });
case actionTypes.BACKGROUND_HAS_CUSTOM_SET_COMMIT:
if (state.background === null) {
return state;
}
return Object.assign(Object.assign({}, state), { background: Object.assign(Object.assign({}, state.background), { hasCustomBackground: action.payload.hasCustomBackground }) });
case actionTypes.FEATS_SET_COMMIT:
return Object.assign(Object.assign({}, state), { feats: [...action.payload.feats] });
case actionTypes.PREFERENCE_SET_COMMIT:
if (state.preferences === null) {
return state;
}
return Object.assign(Object.assign({}, state), { preferences: Object.assign(Object.assign({}, state.preferences), action.payload) });
case actionTypes.ACTIVE_SOURCE_CATEGORIES_SET_COMMIT:
return Object.assign(Object.assign({}, state), { activeSourceCategories: action.payload.activeSourceCategories });
case actionTypes.PORTRAIT_SET_COMMIT:
if (state.decorations === null) {
return state;
}
return Object.assign(Object.assign({}, state), { decorations: Object.assign(Object.assign({}, state.decorations), { avatarId: action.payload.avatarId, avatarUrl: action.payload.avatarUrl }) });
case actionTypes.HIT_POINTS_SET_COMMIT:
return Object.assign(Object.assign({}, state), { removedHitPoints: action.payload.removedHitPoints, temporaryHitPoints: action.payload.temporaryHitPoints });
case actionTypes.CONDITIONS_SET_COMMIT:
return Object.assign(Object.assign({}, state), { conditions: [...action.payload.conditions] });
case actionTypes.XP_SET_COMMIT:
return Object.assign(Object.assign({}, state), { currentXp: action.payload.currentXp });
case actionTypes.INSPIRATION_SET_COMMIT:
return Object.assign(Object.assign({}, state), { inspiration: action.payload.inspiration });
case actionTypes.DEATHSAVES_SET_COMMIT:
if (state.deathSaves === null) {
return state;
}
return Object.assign(Object.assign({}, state), { deathSaves: Object.assign(Object.assign({}, state.deathSaves), { failCount: action.payload.fails, successCount: action.payload.successes }) });
case actionTypes.MOVEMENT_ADD_COMMIT:
if (state.customSpeeds === null) {
return state;
}
return Object.assign(Object.assign({}, state), { customSpeeds: [...state.customSpeeds, action.payload] });
case actionTypes.MOVEMENT_SET_COMMIT:
if (state.customSpeeds === null) {
return state;
}
const customSpeedIdx = state.customSpeeds.findIndex((speed) => speed.movementId === action.payload.movementId);
return Object.assign(Object.assign({}, state), { customSpeeds: [
...state.customSpeeds.slice(0, customSpeedIdx),
Object.assign({}, action.payload),
...state.customSpeeds.slice(customSpeedIdx + 1),
] });
case actionTypes.MOVEMENT_REMOVE_COMMIT:
if (state.customSpeeds === null) {
return state;
}
return Object.assign(Object.assign({}, state), { customSpeeds: state.customSpeeds.filter((movement) => movement.movementId !== action.payload.movementId) });
case actionTypes.SENSE_ADD_COMMIT:
if (state.customSenses === null) {
return state;
}
return Object.assign(Object.assign({}, state), { customSenses: [...state.customSenses, action.payload] });
case actionTypes.SENSE_SET_COMMIT:
if (state.customSenses === null) {
return state;
}
const customSenseIdx = state.customSenses.findIndex((sense) => sense.senseId === action.payload.senseId);
return Object.assign(Object.assign({}, state), { customSenses: [
...state.customSenses.slice(0, customSenseIdx),
Object.assign({}, action.payload),
...state.customSenses.slice(customSenseIdx + 1),
] });
case actionTypes.SENSE_REMOVE_COMMIT:
if (state.customSenses === null) {
return state;
}
return Object.assign(Object.assign({}, state), { customSenses: state.customSenses.filter((sense) => sense.senseId !== action.payload.senseId) });
case actionTypes.CUSTOM_ACTION_ADD_COMMIT:
if (state.customActions === null) {
return state;
}
return Object.assign(Object.assign({}, state), { customActions: [...state.customActions, action.payload.action] });
case actionTypes.CUSTOM_ACTION_REMOVE_COMMIT:
if (state.customActions === null) {
return state;
}
return Object.assign(Object.assign({}, state), { customActions: state.customActions.filter((attack) => attack.id !== action.payload.id) });
case actionTypes.CUSTOM_ACTION_SET_COMMIT: {
if (state.customActions === null) {
return state;
}
const customActionIdx = state.customActions.findIndex((attack) => attack.id === action.payload.id);
return Object.assign(Object.assign({}, state), { customActions: [
...state.customActions.slice(0, customActionIdx),
Object.assign(Object.assign({}, state.customActions[customActionIdx]), action.payload.properties),
...state.customActions.slice(customActionIdx + 1),
] });
}
// TODO this needs data update
case actionTypes.CUSTOM_PROFICIENCY_ADD_COMMIT:
if (state.customProficiencies === null) {
return state;
}
return Object.assign(Object.assign({}, state), { customProficiencies: [...state.customProficiencies, action.payload.proficiency] });
case actionTypes.CUSTOM_PROFICIENCY_REMOVE_COMMIT:
if (state.customProficiencies === null) {
return state;
}
return Object.assign(Object.assign({}, state), { customProficiencies: state.customProficiencies.filter((proficiency) => proficiency.id !== action.payload.id) });
case actionTypes.CUSTOM_PROFICIENCY_SET_COMMIT: {
if (state.customProficiencies === null) {
return state;
}
const customProfIdx = state.customProficiencies.findIndex((proficiency) => proficiency.id === action.payload.id);
return Object.assign(Object.assign({}, state), { customProficiencies: [
...state.customProficiencies.slice(0, customProfIdx),
Object.assign(Object.assign({}, state.customProficiencies[customProfIdx]), action.payload.properties),
...state.customProficiencies.slice(customProfIdx + 1),
] });
}
case actionTypes.CUSTOM_DEFENSE_ADJUSTMENT_ADD_COMMIT:
if (state.customDefenseAdjustments === null) {
return state;
}
return Object.assign(Object.assign({}, state), { customDefenseAdjustments: [...state.customDefenseAdjustments, action.payload] });
case actionTypes.CUSTOM_DEFENSE_ADJUSTMENT_SET_COMMIT:
if (state.customDefenseAdjustments === null) {
return state;
}
const customDefenseIdx = state.customDefenseAdjustments.findIndex((adjustment) => adjustment.adjustmentId === action.payload.adjustmentId && adjustment.type === action.payload.type);
return Object.assign(Object.assign({}, state), { customDefenseAdjustments: [
...state.customDefenseAdjustments.slice(0, customDefenseIdx),
Object.assign({}, action.payload),
...state.customDefenseAdjustments.slice(customDefenseIdx + 1),
] });
case actionTypes.CUSTOM_DEFENSE_ADJUSTMENT_REMOVE_COMMIT:
if (state.customDefenseAdjustments === null) {
return state;
}
return Object.assign(Object.assign({}, state), { customDefenseAdjustments: state.customDefenseAdjustments.filter((adjustment) => !(adjustment.type === action.payload.type &&
adjustment.adjustmentId === action.payload.adjustmentId)) });
case actionTypes.FRAME_SET_COMMIT:
if (state.decorations === null) {
return state;
}
return Object.assign(Object.assign({}, state), { decorations: Object.assign(Object.assign({}, state.decorations), { frameAvatarId: action.payload.frame.frameAvatarId, frameAvatarUrl: action.payload.frame.frameAvatarUrl, frameAvatarDecorationKey: action.payload.frame.decorationKey }) });
case actionTypes.THEME_SET_COMMIT:
if (state.decorations === null) {
return state;
}
return Object.assign(Object.assign({}, state), { decorations: Object.assign(Object.assign({}, state.decorations), { themeColor: action.payload.themeColor }) });
case actionTypes.BACKDROP_SET_COMMIT: {
const { backdropAvatarId, backdropAvatarUrl, largeBackdropAvatarId, largeBackdropAvatarUrl, smallBackdropAvatarId, smallBackdropAvatarUrl, thumbnailBackdropAvatarId, thumbnailBackdropAvatarUrl, } = action.payload.backdrop;
if (state.decorations === null) {
return state;
}
return Object.assign(Object.assign({}, state), { decorations: Object.assign(Object.assign({}, state.decorations), { backdropAvatarId,
backdropAvatarUrl,
largeBackdropAvatarId,
largeBackdropAvatarUrl,
smallBackdropAvatarId,
smallBackdropAvatarUrl,
thumbnailBackdropAvatarId,
thumbnailBackdropAvatarUrl }) });
}
case actionTypes.SPELL_LEVEL_PACT_MAGIC_SLOTS_SET_COMMIT:
if (state.pactMagic === null) {
return state;
}
return Object.assign(Object.assign({}, state), { pactMagic: slotEntities(state.pactMagic, action) });
case actionTypes.SPELL_LEVEL_SPELL_SLOTS_SET_COMMIT:
if (state.spellSlots === null) {
return state;
}
return Object.assign(Object.assign({}, state), { spellSlots: slotEntities(state.spellSlots, action) });
case actionTypes.ACTION_USE_SET_COMMIT: {
if (state.actions === null) {
return state;
}
const componentDataOriginKey = getComponentDataOriginKey(action.payload.dataOriginType);
const actionIdx = state.actions[componentDataOriginKey].findIndex((charAction) => ActionAccessors.getId(charAction) === action.payload.id &&
ActionAccessors.getEntityTypeId(charAction) === action.payload.entityTypeId);
return Object.assign(Object.assign({}, state), { actions: Object.assign(Object.assign({}, state.actions), { [componentDataOriginKey]: [
...state.actions[componentDataOriginKey].slice(0, actionIdx),
characterAction(state.actions[componentDataOriginKey][actionIdx], action),
...state.actions[componentDataOriginKey].slice(actionIdx + 1),
] }) });
}
case actionTypes.SPELL_USE_SET_COMMIT: {
if (state.spells === null) {
return state;
}
const componentDataOriginKey = getComponentDataOriginKey(action.payload.dataOriginType);
const spellIdx = state.spells[componentDataOriginKey].findIndex((spell) => SpellAccessors.getMappingId(spell) === action.payload.id &&
SpellAccessors.getMappingEntityTypeId(spell) === action.payload.entityTypeId);
return Object.assign(Object.assign({}, state), { spells: Object.assign(Object.assign({}, state.spells), { [componentDataOriginKey]: [
...state.spells[componentDataOriginKey].slice(0, spellIdx),
spellEntity(state.spells[componentDataOriginKey][spellIdx], action),
...state.spells[componentDataOriginKey].slice(spellIdx + 1),
] }) });
}
case actionTypes.CHOICES_SET_COMMIT:
if (state.choices === null) {
return state;
}
return Object.assign(Object.assign({}, state), { choices: choiceComponents(state.choices, action) });
case actionTypes.MODIFIERS_SET_COMMIT:
if (state.modifiers === null) {
return state;
}
return Object.assign(Object.assign({}, state), { modifiers: modifierComponents(state.modifiers, action) });
case actionTypes.ACTIONS_SET_COMMIT:
if (state.actions === null) {
return state;
}
return Object.assign(Object.assign({}, state), { actions: actionComponents(state.actions, action) });
case actionTypes.PACT_MAGIC_SET_COMMIT:
return Object.assign(Object.assign({}, state), { pactMagic: action.payload.pactMagic });
case actionTypes.SPELLS_SLOTS_SET_COMMIT:
return Object.assign(Object.assign({}, state), { spellSlots: action.payload.spellSlots });
case actionTypes.CHARACTER_SPELLS_SET_COMMIT:
if (state.spells === null) {
return state;
}
return Object.assign(Object.assign({}, state), { spells: spellComponents(state.spells, action) });
case actionTypes.OPTIONS_SET_COMMIT:
if (state.options === null) {
return state;
}
return Object.assign(Object.assign({}, state), { options: optionComponents(state.options, action) });
case actionTypes.CHARACTER_COMPONENTS_SET_COMMIT: {
let updatedState = Object.assign({}, state);
if (state.actions !== null) {
updatedState = Object.assign(Object.assign({}, updatedState), { actions: actionComponents(state.actions, action) });
}
if (state.choices !== null) {
updatedState = Object.assign(Object.assign({}, updatedState), { choices: choiceComponents(state.choices, action) });
}
if (state.modifiers !== null) {
updatedState = Object.assign(Object.assign({}, updatedState), { modifiers: modifierComponents(state.modifiers, action) });
}
if (state.options !== null) {
updatedState = Object.assign(Object.assign({}, updatedState), { options: optionComponents(state.options, action) });
}
if (state.spells !== null) {
updatedState = Object.assign(Object.assign({}, updatedState), { spells: spellComponents(state.spells, action) });
}
if (state.classSpells !== null && action.payload.classSpells) {
updatedState = Object.assign(Object.assign({}, updatedState), { classSpells: [...action.payload.classSpells] });
}
return updatedState;
}
case actionTypes.VALUE_SET_COMMIT: {
if (state.characterValues === null) {
return state;
}
// TODO move this to a saga handler that uses an existing lookup to test for presence
const { typeId, value, notes, valueId, valueTypeId, contextId, contextTypeId } = action.payload;
const valueInfo = {
typeId,
value,
notes,
valueId,
valueTypeId,
contextId,
contextTypeId,
};
const idx = state.characterValues.findIndex((charValue) => charValue.typeId === typeId &&
charValue.valueId === valueId &&
charValue.valueTypeId === valueTypeId &&
charValue.contextId === contextId &&
charValue.contextTypeId === contextTypeId);
if (idx > -1 && value === null && notes === null) {
return Object.assign(Object.assign({}, state), { characterValues: state.characterValues.filter((charValue, valueIdx) => valueIdx !== idx) });
}
let newCharacterValues;
if (idx > -1) {
newCharacterValues = [
...state.characterValues.slice(0, idx),
valueInfo,
...state.characterValues.slice(idx + 1),
];
}
else {
newCharacterValues = [...state.characterValues, valueInfo];
}
return Object.assign(Object.assign({}, state), { characterValues: newCharacterValues });
}
case actionTypes.VALUE_REMOVE_COMMIT: {
if (state.characterValues === null) {
return state;
}
return Object.assign(Object.assign({}, state), { characterValues: state.characterValues.filter((charValue) => !(charValue.typeId === action.payload.typeId &&
charValue.valueId === action.payload.valueId &&
charValue.valueTypeId === action.payload.valueTypeId &&
charValue.contextId === action.payload.contextId &&
charValue.contextTypeId === action.payload.contextTypeId)) });
}
case actionTypes.ENTITY_VALUES_REMOVE_COMMIT: {
if (state.characterValues === null) {
return state;
}
return Object.assign(Object.assign({}, state), { characterValues: state.characterValues.filter((charValue) => !(charValue.valueId === action.payload.valueId &&
charValue.valueTypeId === action.payload.valueTypeId &&
charValue.contextId === action.payload.contextId &&
charValue.contextTypeId === action.payload.contextTypeId)) });
}
case actionTypes.CREATURE_ADD_COMMIT:
if (state.creatures === null) {
return state;
}
return Object.assign(Object.assign({}, state), { creatures: [...state.creatures, action.payload.creature] });
case actionTypes.CREATURE_REMOVE_COMMIT:
if (state.creatures === null) {
return state;
}
return Object.assign(Object.assign({}, state), { creatures: state.creatures.filter((creature) => action.payload.id !== CreatureAccessors.getMappingId(creature)) });
case actionTypes.CREATURE_DATA_SET_COMMIT:
case actionTypes.CREATURE_ACTIVE_SET_COMMIT:
case actionTypes.CREATURE_HIT_POINTS_SET_COMMIT: {
if (state.creatures === null) {
return state;
}
const idx = state.creatures.findIndex((creature) => action.payload.id === CreatureAccessors.getMappingId(creature));
return Object.assign(Object.assign({}, state), { creatures: [
...state.creatures.slice(0, idx),
creatureEntity(state.creatures[idx], action),
...state.creatures.slice(idx + 1),
] });
}
case actionTypes.ABILITY_SCORE_TYPE_SET_COMMIT:
case actionTypes.SHOW_HELP_TEXT_SET:
case actionTypes.STARTING_EQUIPMENT_TYPE_SET_COMMIT:
if (state.configuration === null) {
return state;
}
return Object.assign(Object.assign({}, state), { configuration: characterConfiguration(state.configuration, action) });
case actionTypes.ACTIVE_SOURCES_SET_COMMIT:
return Object.assign(Object.assign({}, state), { campaignSetting: action.payload });
case actionTypes.PREMADE_INFO_SET_COMMIT:
return Object.assign(Object.assign({}, state), { premadeInfo: action.payload });
case actionTypes.PREMADE_INFO_REMOVE_COMMIT:
return Object.assign(Object.assign({}, state), { premadeInfo: null });
case actionTypes.STATUS_SET_COMMIT:
return Object.assign(Object.assign({}, state), { status: action.payload.status });
case actionTypes.STATUS_SLUG_SET_COMMIT:
return Object.assign(Object.assign({}, state), { statusSlug: action.payload.statusSlug });
default:
// not implemented
}
return state;
}
export default character;