diff --git a/src/enums/held-item-id.ts b/src/enums/held-item-id.ts index 7da668d21b2..f6d223fc855 100644 --- a/src/enums/held-item-id.ts +++ b/src/enums/held-item-id.ts @@ -127,6 +127,10 @@ function getHeldItemCategory(itemId: HeldItemId): HeldItemCategoryId { return itemId & ITEM_CATEGORY_MASK; } +export function isCategoryId(categoryId: HeldItemCategoryId): boolean { + return (categoryId & ITEM_CATEGORY_MASK) === categoryId; +} + export function isItemInCategory(itemId: HeldItemId, category: HeldItemCategoryId): boolean { return getHeldItemCategory(itemId) === category; } diff --git a/src/enums/reward-tier.ts b/src/enums/reward-tier.ts new file mode 100644 index 00000000000..e7ccc1d9166 --- /dev/null +++ b/src/enums/reward-tier.ts @@ -0,0 +1,8 @@ +export enum RewardTier { + COMMON, + GREAT, + ULTRA, + ROGUE, + MASTER, + LUXURY, +} diff --git a/src/field/pokemon-held-item-manager.ts b/src/field/pokemon-held-item-manager.ts index a9d1aba417c..bd6133551bf 100644 --- a/src/field/pokemon-held-item-manager.ts +++ b/src/field/pokemon-held-item-manager.ts @@ -9,6 +9,7 @@ type HELD_ITEM_DATA = BASE_STAT_TOTAL_DATA | BASE_STAT_FLAT_DATA; interface HeldItemProperties { stack: number; disabled?: boolean; + unstealable?: boolean; //TODO: ensure this is taken into account by stealing effects cooldown?: number; data?: HELD_ITEM_DATA; } diff --git a/src/items/held-item-pool.ts b/src/items/held-item-pool.ts new file mode 100644 index 00000000000..196f2121325 --- /dev/null +++ b/src/items/held-item-pool.ts @@ -0,0 +1,110 @@ +/* +import type { PlayerPokemon } from "#app/field/pokemon"; +import { randSeedInt } from "#app/utils/common"; +import { HeldItemCategoryId, HeldItemId, isCategoryId } from "#enums/held-item-id"; +import { RewardTier } from "#enums/reward-tier"; + +interface HeldItemPoolEntry { + weight: number; + item: HeldItemId | HeldItemCategoryId; +} + +export type HeldItemPool = { + [key in RewardTier]?: HeldItemPoolEntry[]; +}; + +const dailyStarterHeldItemPool: HeldItemPool = { + [RewardTier.COMMON]: [ + { item: HeldItemCategoryId.BASE_STAT_BOOST, weight: 1 }, + { item: HeldItemCategoryId.BERRY, weight: 3 }, + ], + [RewardTier.GREAT]: [{ item: HeldItemCategoryId.TYPE_ATTACK_BOOSTER, weight: 5 }], + [RewardTier.ULTRA]: [ + { item: HeldItemId.REVIVER_SEED, weight: 4 }, + { item: HeldItemId.SOOTHE_BELL, weight: 1 }, + { item: HeldItemId.SOUL_DEW, weight: 1 }, + { item: HeldItemId.GOLDEN_PUNCH, weight: 1 }, + ], + [RewardTier.ROGUE]: [ + { item: HeldItemId.GRIP_CLAW, weight: 5 }, + { item: HeldItemId.BATON, weight: 2 }, + { item: HeldItemId.FOCUS_BAND, weight: 5 }, + { item: HeldItemId.QUICK_CLAW, weight: 3 }, + { item: HeldItemId.KINGS_ROCK, weight: 3 }, + ], + [RewardTier.MASTER]: [ + { item: HeldItemId.LEFTOVERS, weight: 1 }, + { item: HeldItemId.SHELL_BELL, weight: 1 }, + ], +}; + +export function getDailyRunStarterHeldItems(party: PlayerPokemon[]): PokemonHeldItemModifier[] { + const ret: HeldItemId[] = []; + for (const p of party) { + for (let m = 0; m < 3; m++) { + const tierValue = randSeedInt(64); + + let tier: RewardTier; + if (tierValue > 25) { + tier = RewardTier.COMMON; + } else if (tierValue > 12) { + tier = RewardTier.GREAT; + } else if (tierValue > 4) { + tier = RewardTier.ULTRA; + } else if (tierValue) { + tier = RewardTier.ROGUE; + } else { + tier = RewardTier.MASTER; + } + + const item = getNewHeldItemFromPool(party, dailyStarterHeldItemPool, tier); + ret.push(item); + } + } + + return ret; +} + +function getNewModifierTypeOption( + party: Pokemon[], + poolType: ModifierPoolType, + baseTier?: ModifierTier, + upgradeCount?: number, + retryCount = 0, + allowLuckUpgrades = true, +): ModifierTypeOption | null { + const player = !poolType; + const pool = getModifierPoolForType(poolType); + const thresholds = getPoolThresholds(poolType); + + const tier = determineTier(party, player, baseTier, upgradeCount, retryCount, allowLuckUpgrades); + + const tierThresholds = Object.keys(thresholds[tier]); + const totalWeight = Number.parseInt(tierThresholds[tierThresholds.length - 1]); + const value = randSeedInt(totalWeight); + let index: number | undefined; + for (const t of tierThresholds) { + const threshold = Number.parseInt(t); + if (value < threshold) { + index = thresholds[tier][threshold]; + break; + } + } + + if (index === undefined) { + return null; + } + + if (player) { + console.log(index, ignoredPoolIndexes[tier].filter(i => i <= index).length, ignoredPoolIndexes[tier]); + } + + const item = pool[tier][index].item; + if (isCategoryId(item)) { + return getNewHeldItemCategoryOption(item); + } + return item; + + // console.log(modifierType, !player ? "(enemy)" : ""); +} +*/