122 lines
2.9 KiB
JavaScript
122 lines
2.9 KiB
JavaScript
|
|
// 商店商品配置(資料驅動 - 隨機刷新機制)
|
||
|
|
|
||
|
|
// 商品池 - 所有可能出現的商品及其出現機率
|
||
|
|
export const SHOP_POOL = [
|
||
|
|
// 食物類 - 高機率
|
||
|
|
{
|
||
|
|
itemId: 'cookie',
|
||
|
|
category: 'food',
|
||
|
|
price: 10,
|
||
|
|
appearChance: 0.8, // 80% 機率出現
|
||
|
|
sellPrice: 5 // 賣出價格為購買價一半
|
||
|
|
},
|
||
|
|
{
|
||
|
|
itemId: 'tuna_can',
|
||
|
|
category: 'food',
|
||
|
|
price: 30,
|
||
|
|
appearChance: 0.6,
|
||
|
|
sellPrice: 15
|
||
|
|
},
|
||
|
|
{
|
||
|
|
itemId: 'premium_food',
|
||
|
|
category: 'food',
|
||
|
|
price: 50,
|
||
|
|
appearChance: 0.3, // 30% 機率
|
||
|
|
sellPrice: 25
|
||
|
|
},
|
||
|
|
|
||
|
|
// 藥品類 - 中機率
|
||
|
|
{
|
||
|
|
itemId: 'vitality_potion',
|
||
|
|
category: 'medicine',
|
||
|
|
price: 40,
|
||
|
|
appearChance: 0.5,
|
||
|
|
sellPrice: 20
|
||
|
|
},
|
||
|
|
|
||
|
|
// 裝備類 - 低機率
|
||
|
|
{
|
||
|
|
itemId: 'wooden_sword',
|
||
|
|
category: 'equipment',
|
||
|
|
price: 80,
|
||
|
|
appearChance: 0.3,
|
||
|
|
sellPrice: 40
|
||
|
|
},
|
||
|
|
{
|
||
|
|
itemId: 'leather_armor',
|
||
|
|
category: 'equipment',
|
||
|
|
price: 100,
|
||
|
|
appearChance: 0.25,
|
||
|
|
sellPrice: 50
|
||
|
|
},
|
||
|
|
{
|
||
|
|
itemId: 'magic_wand',
|
||
|
|
category: 'equipment',
|
||
|
|
price: 150,
|
||
|
|
appearChance: 0.15, // 稀有
|
||
|
|
sellPrice: 75
|
||
|
|
},
|
||
|
|
{
|
||
|
|
itemId: 'hero_sword',
|
||
|
|
category: 'equipment',
|
||
|
|
price: 300,
|
||
|
|
appearChance: 0.05, // 極稀有
|
||
|
|
sellPrice: 150
|
||
|
|
},
|
||
|
|
|
||
|
|
// 玩具類
|
||
|
|
{
|
||
|
|
itemId: 'ball',
|
||
|
|
category: 'toy',
|
||
|
|
price: 20,
|
||
|
|
appearChance: 0.6,
|
||
|
|
sellPrice: 10
|
||
|
|
},
|
||
|
|
|
||
|
|
// 飾品類 - 稀有
|
||
|
|
{
|
||
|
|
itemId: 'lucky_charm',
|
||
|
|
category: 'accessory',
|
||
|
|
price: 150,
|
||
|
|
appearChance: 0.2,
|
||
|
|
sellPrice: 75
|
||
|
|
}
|
||
|
|
]
|
||
|
|
|
||
|
|
// 商品分類
|
||
|
|
export const SHOP_CATEGORIES = {
|
||
|
|
food: { name: '食物', icon: '🍖' },
|
||
|
|
medicine: { name: '藥品', icon: '💊' },
|
||
|
|
equipment: { name: '裝備', icon: '⚔️' },
|
||
|
|
toy: { name: '玩具', icon: '🎾' },
|
||
|
|
accessory: { name: '飾品', icon: '✨' }
|
||
|
|
}
|
||
|
|
|
||
|
|
// 生成隨機商店商品列表
|
||
|
|
export function generateShopItems() {
|
||
|
|
const items = []
|
||
|
|
for (const poolItem of SHOP_POOL) {
|
||
|
|
// 按機率決定是否出現
|
||
|
|
if (Math.random() < poolItem.appearChance) {
|
||
|
|
items.push({
|
||
|
|
...poolItem,
|
||
|
|
stock: -1 // 無限庫存
|
||
|
|
})
|
||
|
|
}
|
||
|
|
}
|
||
|
|
// 確保至少有3個商品
|
||
|
|
if (items.length < 3) {
|
||
|
|
// 隨機補充商品
|
||
|
|
const remaining = SHOP_POOL.filter(p => !items.find(i => i.itemId === p.itemId))
|
||
|
|
while (items.length < 3 && remaining.length > 0) {
|
||
|
|
const randomIndex = Math.floor(Math.random() * remaining.length)
|
||
|
|
items.push({
|
||
|
|
...remaining[randomIndex],
|
||
|
|
stock: -1
|
||
|
|
})
|
||
|
|
remaining.splice(randomIndex, 1)
|
||
|
|
}
|
||
|
|
}
|
||
|
|
return items
|
||
|
|
}
|