Added function to assign items from a given configuration

This commit is contained in:
Wlowscha 2025-06-16 00:12:11 +02:00
parent 694e82f280
commit aa84d03773
No known key found for this signature in database
GPG Key ID: 3C8F1AD330565D04
2 changed files with 41 additions and 2 deletions

View File

@ -56,6 +56,10 @@ type HeldItemPoolEntry = {
export type HeldItemPool = HeldItemPoolEntry[]; export type HeldItemPool = HeldItemPoolEntry[];
export function isHeldItemPool(value: any): value is HeldItemPool {
return Array.isArray(value) && value.every(entry => "entry" in entry && "weight" in entry);
}
export type HeldItemTieredPool = { export type HeldItemTieredPool = {
[key in RewardTier]?: HeldItemPool; [key in RewardTier]?: HeldItemPool;
}; };
@ -63,7 +67,6 @@ export type HeldItemTieredPool = {
type HeldItemConfigurationEntry = { type HeldItemConfigurationEntry = {
entry: HeldItemId | HeldItemCategoryEntry | HeldItemSpecs | HeldItemPool; entry: HeldItemId | HeldItemCategoryEntry | HeldItemSpecs | HeldItemPool;
count?: number | (() => number); count?: number | (() => number);
excluded?: HeldItemId[];
}; };
export type HeldItemConfiguration = HeldItemConfigurationEntry[]; export type HeldItemConfiguration = HeldItemConfigurationEntry[];

View File

@ -7,11 +7,14 @@ import type { PokemonType } from "#enums/pokemon-type";
import { RewardTier } from "#enums/reward-tier"; import { RewardTier } from "#enums/reward-tier";
import { PERMANENT_STATS } from "#enums/stat"; import { PERMANENT_STATS } from "#enums/stat";
import { import {
type HeldItemConfiguration,
type HeldItemPool, type HeldItemPool,
type HeldItemSpecs, type HeldItemSpecs,
type HeldItemTieredPool, type HeldItemTieredPool,
type HeldItemWeights, type HeldItemWeights,
isHeldItemCategoryEntry, isHeldItemCategoryEntry,
isHeldItemPool,
isHeldItemSpecs,
} from "./held-item-data-types"; } from "./held-item-data-types";
import { attackTypeToHeldItem } from "./held-items/attack-type-booster"; import { attackTypeToHeldItem } from "./held-items/attack-type-booster";
import { permanentStatToHeldItem } from "./held-items/base-stat-booster"; import { permanentStatToHeldItem } from "./held-items/base-stat-booster";
@ -140,7 +143,7 @@ export function getNewHeldItemFromCategory(
return null; return null;
} }
function getNewHeldItemFromPool(pool: HeldItemPool, pokemon: Pokemon): HeldItemId | HeldItemSpecs { function getNewHeldItemFromPool(pool: HeldItemPool, pokemon: Pokemon | Pokemon[]): HeldItemId | HeldItemSpecs {
const weights = pool.map(p => (typeof p.weight === "function" ? p.weight(coerceArray(pokemon)) : p.weight)); const weights = pool.map(p => (typeof p.weight === "function" ? p.weight(coerceArray(pokemon)) : p.weight));
const entry = pool[pickWeightedIndex(weights)].entry; const entry = pool[pickWeightedIndex(weights)].entry;
@ -155,3 +158,36 @@ function getNewHeldItemFromPool(pool: HeldItemPool, pokemon: Pokemon): HeldItemI
return entry as HeldItemSpecs; return entry as HeldItemSpecs;
} }
export function assignItemsFromConfiguration(config: HeldItemConfiguration, pokemon: Pokemon) {
config.forEach(item => {
const { entry, count } = item;
const actualCount = typeof count === "function" ? count() : (count ?? 1);
if (typeof entry === "number") {
pokemon.heldItemManager.add(entry, actualCount);
}
if (isHeldItemSpecs(entry)) {
pokemon.heldItemManager.add(entry);
}
if (isHeldItemCategoryEntry(entry)) {
for (let i = 1; i <= actualCount; i++) {
const newItem = getNewHeldItemFromCategory(entry.id, pokemon, entry?.customWeights);
if (newItem) {
pokemon.heldItemManager.add(newItem);
}
}
}
if (isHeldItemPool(entry)) {
for (let i = 1; i <= actualCount; i++) {
const newItem = getNewHeldItemFromPool(entry, pokemon);
if (newItem) {
pokemon.heldItemManager.add(newItem);
}
}
}
});
}