|
|
|
@@ -13,7 +13,7 @@ import { keyBy, orderBy } from 'lodash';
|
|
|
|
|
import { TypeScriptUtils } from '../../utils';
|
|
|
|
|
import { CharacterDerivers } from '../Character';
|
|
|
|
|
import { ContainerTypeEnum } from '../Container';
|
|
|
|
|
import { StealthCheckTypeEnum } from '../Core';
|
|
|
|
|
import { STAT_REPLACEMENT_TYPE_LOOKUP, StealthCheckTypeEnum } from '../Core';
|
|
|
|
|
import { DataOriginDataInfoKeyEnum, DataOriginTypeEnum } from '../DataOrigin';
|
|
|
|
|
import { DefinitionHacks } from '../Definition';
|
|
|
|
|
import { DiceAccessors, DiceDerivers, DiceUtils } from '../Dice';
|
|
|
|
@@ -67,7 +67,7 @@ export function generateCustomItem(customItem, ruleData, characterId) {
|
|
|
|
|
limitedUse: null,
|
|
|
|
|
quantity: quantity !== null && quantity !== void 0 ? quantity : 1,
|
|
|
|
|
};
|
|
|
|
|
return Object.assign(Object.assign({}, simulatedContract), { avatarUrl: (_a = definition.avatarUrl) !== null && _a !== void 0 ? _a : '', armorClass: null, baseItemType: ItemBaseTypeEnum.GEAR, additionalDamages: [], versatileDamage: null, reach: null, canAttune: false, canBeDedicatedWeapon: false, canEquip: false, canHexWeapon: false, canOffhand: false, canPactWeapon: false, categoryInfo: null, definitionKey: '', hexWeaponEnabled: false, isDedicatedWeapon: false, isHexWeapon: false, isPactWeapon: false, metaItems: [], pactWeaponEnabled: false, toHit: null, damage: null, infusion: null, infusionActions: [], isOffhand: false, isAdamantine: false, isMagic: false, isSilvered: false, damageType: definition.damageType, displayAsAttack: false, isCustom: true, isCustomized: false, isDisplayAsAttack: false, proficiency: false, modifiers: [], originalContract: customItem, spells: [], type: null, name: (_b = definition.name) !== null && _b !== void 0 ? _b : 'Unidentified Item', cost: deriveCost(simulatedContract, {}), weight: deriveWeight(simulatedContract, {}), capacityWeight: deriveCapacityWeight(simulatedContract, {}), notes, properties: [], stealthCheck: StealthCheckTypeEnum.NONE, masteryName: null, primarySourceCategoryId: -1, secondarySourceCategoryIds: [] });
|
|
|
|
|
return Object.assign(Object.assign({}, simulatedContract), { avatarUrl: (_a = definition.avatarUrl) !== null && _a !== void 0 ? _a : '', armorClass: null, baseItemType: ItemBaseTypeEnum.GEAR, additionalDamages: [], versatileDamage: null, reach: null, canAttune: false, canBeDedicatedWeapon: false, canEquip: false, canHexWeapon: false, canOffhand: false, canPactWeapon: false, categoryInfo: null, definitionKey: '', hexWeaponEnabled: false, isDedicatedWeapon: false, isHexWeapon: false, isPactWeapon: false, metaItems: [], pactWeaponEnabled: false, toHit: null, damage: null, infusion: null, infusionActions: [], isOffhand: false, isAdamantine: false, isMagic: false, isSilvered: false, damageType: definition.damageType, displayAsAttack: false, isCustom: true, isCustomized: false, isDisplayAsAttack: false, proficiency: false, modifiers: [], originalContract: customItem, spells: [], type: null, name: (_b = definition.name) !== null && _b !== void 0 ? _b : 'Unidentified Item', cost: deriveCost(simulatedContract, {}), weight: deriveWeight(simulatedContract, {}), capacityWeight: deriveCapacityWeight(simulatedContract, {}), notes, properties: [], stealthCheck: StealthCheckTypeEnum.NONE, masteryName: null, primarySourceCategoryId: -1, secondarySourceCategoryIds: [], replacementWeaponStats: [], appliedWeaponReplacementStats: [] });
|
|
|
|
|
}
|
|
|
|
|
/**
|
|
|
|
|
*
|
|
|
|
@@ -97,8 +97,8 @@ export function generateWeaponBehaviorBaseItem(baseWeapon, parentItem, valueLook
|
|
|
|
|
* @param hack__characterSpecialWeaponPropertiesEnabled
|
|
|
|
|
*/
|
|
|
|
|
export function generateItems(items, abilityLookup, proficiencyBonus, modifiers, entityValueLookup, typeValueLookup, valueLookup, martialArtsLevelScale, ruleData, hack__characterSpecialWeaponPropertiesEnabled) {
|
|
|
|
|
const { hexWeaponEnabled, pactWeaponEnabled, improvedPactWeaponEnabled, dedicatedWeaponEnabled } = hack__characterSpecialWeaponPropertiesEnabled;
|
|
|
|
|
return items.map((item) => generateItem(item, abilityLookup, proficiencyBonus, modifiers, entityValueLookup, typeValueLookup, valueLookup, martialArtsLevelScale, hexWeaponEnabled, pactWeaponEnabled, improvedPactWeaponEnabled, ruleData, dedicatedWeaponEnabled));
|
|
|
|
|
const { hexWeaponEnabled, pactWeaponEnabled, improvedPactWeaponEnabled, dedicatedWeaponEnabled, replacementWeaponStats, } = hack__characterSpecialWeaponPropertiesEnabled;
|
|
|
|
|
return items.map((item) => generateItem(item, abilityLookup, proficiencyBonus, modifiers, entityValueLookup, typeValueLookup, valueLookup, martialArtsLevelScale, hexWeaponEnabled, pactWeaponEnabled, improvedPactWeaponEnabled, ruleData, dedicatedWeaponEnabled, replacementWeaponStats));
|
|
|
|
|
}
|
|
|
|
|
/**
|
|
|
|
|
*
|
|
|
|
@@ -116,7 +116,7 @@ export function generateItems(items, abilityLookup, proficiencyBonus, modifiers,
|
|
|
|
|
* @param ruleData
|
|
|
|
|
* @param dedicatedWeaponEnabled
|
|
|
|
|
*/
|
|
|
|
|
export function generateItem(item, abilityLookup, proficiencyBonus, modifiers, entityValueLookup, typeValueLookup, valueLookup, martialArtsLevelScale, hexWeaponEnabled, pactWeaponEnabled, improvedPactWeaponEnabled, ruleData, dedicatedWeaponEnabled) {
|
|
|
|
|
export function generateItem(item, abilityLookup, proficiencyBonus, modifiers, entityValueLookup, typeValueLookup, valueLookup, martialArtsLevelScale, hexWeaponEnabled, pactWeaponEnabled, improvedPactWeaponEnabled, ruleData, dedicatedWeaponEnabled, replacementWeaponStats) {
|
|
|
|
|
const mappingId = getMappingId(item);
|
|
|
|
|
const mappingIdString = ValueHacks.hack__toString(mappingId);
|
|
|
|
|
const mappingEntityTypeId = getMappingEntityTypeId(item);
|
|
|
|
@@ -139,6 +139,22 @@ export function generateItem(item, abilityLookup, proficiencyBonus, modifiers, e
|
|
|
|
|
!!ValueAccessors.getValue(dataLookup[AdjustmentTypeEnum.IS_PACT_WEAPON]);
|
|
|
|
|
}
|
|
|
|
|
const proficiency = deriveIsProficient(item, modifiers, isPactWeapon, typeValueLookup, ruleData);
|
|
|
|
|
//handle any replacement stats granted by modifiers from class features
|
|
|
|
|
const appliedWeaponReplacementStats = [];
|
|
|
|
|
let canUseWeaponReplacementStats = false;
|
|
|
|
|
if (replacementWeaponStats.length > 0 &&
|
|
|
|
|
(isBaseWeapon(item) || validateIsWeaponLike(item)) &&
|
|
|
|
|
!isAmmunition(item)) {
|
|
|
|
|
canUseWeaponReplacementStats = true;
|
|
|
|
|
// check if any of the replacement stats are being used
|
|
|
|
|
Object.keys(STAT_REPLACEMENT_TYPE_LOOKUP).forEach((adjustmentType) => {
|
|
|
|
|
const isUsingAdjustmentType = dataLookup.hasOwnProperty(adjustmentType) && !!ValueAccessors.getValue(dataLookup[adjustmentType]);
|
|
|
|
|
// if the adjustment type is being used, add it to the applied weapon replacement stats
|
|
|
|
|
if (isUsingAdjustmentType) {
|
|
|
|
|
appliedWeaponReplacementStats.push(STAT_REPLACEMENT_TYPE_LOOKUP[adjustmentType]);
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
let canHexWeapon = false;
|
|
|
|
|
let isHexWeapon = false;
|
|
|
|
|
if (hexWeaponEnabled && (isBaseWeapon(item) || validateIsWeaponLike(item)) && !isAmmunition(item)) {
|
|
|
|
@@ -185,7 +201,7 @@ export function generateItem(item, abilityLookup, proficiencyBonus, modifiers, e
|
|
|
|
|
const bonusToHitModifiers = modifiers.filter((modifier) => ModifierValidators.isValidBonusWeaponToHitModifier(modifier, item, ruleData));
|
|
|
|
|
const bonusToHitModifierTotal = ModifierDerivers.sumModifiers(bonusToHitModifiers, abilityLookup);
|
|
|
|
|
//get all the available ability stats for the weapon
|
|
|
|
|
const availableAbilities = deriveAvailableWeaponAbilities(item, modifiers, martialArtsLevelScale, isDedicatedWeapon, isPactWeapon, isHexWeapon);
|
|
|
|
|
const availableAbilities = deriveAvailableWeaponAbilities(item, modifiers, martialArtsLevelScale, isDedicatedWeapon, isPactWeapon, isHexWeapon, appliedWeaponReplacementStats);
|
|
|
|
|
// transform the available ability stats to have toHit and damage bonuses
|
|
|
|
|
const abilityPossibilities = CharacterDerivers.deriveAttackAbilityPossibilities(availableAbilities, modifiers, weaponProficiencyBonus, abilityLookup);
|
|
|
|
|
const bestAbility = HelperUtils.getLast(abilityPossibilities, ['toHit', 'modifier']);
|
|
|
|
@@ -267,7 +283,7 @@ export function generateItem(item, abilityLookup, proficiencyBonus, modifiers, e
|
|
|
|
|
hexWeaponEnabled,
|
|
|
|
|
pactWeaponEnabled, damage: newDamage, versatileDamage,
|
|
|
|
|
additionalDamages,
|
|
|
|
|
reach, masteryName: deriveMasteryName(item, modifiers), primarySourceCategoryId: derivePrimarySourceCategoryId(item, ruleData), secondarySourceCategoryIds: deriveSecondarySourceCategoryIds(item, ruleData) });
|
|
|
|
|
reach, masteryName: deriveMasteryName(item, modifiers), primarySourceCategoryId: derivePrimarySourceCategoryId(item, ruleData), secondarySourceCategoryIds: deriveSecondarySourceCategoryIds(item, ruleData), replacementWeaponStats: canUseWeaponReplacementStats ? replacementWeaponStats : [], appliedWeaponReplacementStats: canUseWeaponReplacementStats ? appliedWeaponReplacementStats : [] });
|
|
|
|
|
}
|
|
|
|
|
/**
|
|
|
|
|
*
|
|
|
|
@@ -341,7 +357,7 @@ function updateBaseItemSpells(item, spell) {
|
|
|
|
|
* @param characterId
|
|
|
|
|
*/
|
|
|
|
|
export function generateGearWeaponItems(items, abilityLookup, proficiencyBonus, modifiers, entityValueLookup, typeValueLookup, valueLookup, martialArtsLevelScale, ruleData, hack__characterSpecialWeaponPropertiesEnabled, characterId) {
|
|
|
|
|
const { hexWeaponEnabled, pactWeaponEnabled, improvedPactWeaponEnabled, dedicatedWeaponEnabled } = hack__characterSpecialWeaponPropertiesEnabled;
|
|
|
|
|
const { hexWeaponEnabled, pactWeaponEnabled, improvedPactWeaponEnabled, dedicatedWeaponEnabled, replacementWeaponStats, } = hack__characterSpecialWeaponPropertiesEnabled;
|
|
|
|
|
return items
|
|
|
|
|
.filter(isGearContract)
|
|
|
|
|
.filter((item) => hasItemWeaponBehaviors(item))
|
|
|
|
@@ -352,7 +368,7 @@ export function generateGearWeaponItems(items, abilityLookup, proficiencyBonus,
|
|
|
|
|
if (simulatedBaseItem === null) {
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
return generateItem(simulatedBaseItem, abilityLookup, proficiencyBonus, modifiers, entityValueLookup, typeValueLookup, valueLookup, martialArtsLevelScale, hexWeaponEnabled, pactWeaponEnabled, improvedPactWeaponEnabled, ruleData, dedicatedWeaponEnabled);
|
|
|
|
|
return generateItem(simulatedBaseItem, abilityLookup, proficiencyBonus, modifiers, entityValueLookup, typeValueLookup, valueLookup, martialArtsLevelScale, hexWeaponEnabled, pactWeaponEnabled, improvedPactWeaponEnabled, ruleData, dedicatedWeaponEnabled, replacementWeaponStats);
|
|
|
|
|
})
|
|
|
|
|
.filter(TypeScriptUtils.isNotNullOrUndefined))
|
|
|
|
|
.reduce((acc, itemBehaviors) => {
|
|
|
|
|