Skip to main content
Glama
loot.ts2.87 kB
import type { Equipment, Enemy } from '../types.js'; export interface LootResult { gold: number; equipment: Equipment[]; } export function rollLoot(enemy: Enemy, luckStat: number, rewardPool: Equipment[]): LootResult { const result: LootResult = { gold: 0, equipment: [] }; // Calculate gold drop const [minGold, maxGold] = enemy.goldDrop; result.gold = Math.floor(Math.random() * (maxGold - minGold + 1)) + minGold; // Roll for equipment drop const dropChance = enemy.equipmentDropRate * (1 + luckStat / 100); if (Math.random() < dropChance) { // 優先的に敵固有ドロップをチェック(低確率) if (enemy.exclusiveDrops && enemy.exclusiveDrops.length > 0) { const exclusiveDropChance = 0.15; // 15%の確率で専用装備 if (Math.random() < exclusiveDropChance) { const randomExclusive = enemy.exclusiveDrops[Math.floor(Math.random() * enemy.exclusiveDrops.length)]; result.equipment.push(randomExclusive); return result; } } // 専用装備がドロップしなかった場合、通常のダンジョンプールから if (rewardPool.length > 0) { // Determine rarity based on luck const rarityRoll = Math.random() * 100; const luckBonus = luckStat / 2; let targetRarity: string; if (rarityRoll + luckBonus > 98) { targetRarity = 'legendary'; } else if (rarityRoll + luckBonus > 90) { targetRarity = 'epic'; } else if (rarityRoll + luckBonus > 70) { targetRarity = 'rare'; } else { targetRarity = 'common'; } // Filter pool by rarity let eligibleItems = rewardPool.filter(item => item.rarity === targetRarity); // Fallback to all items if no items of target rarity if (eligibleItems.length === 0) { eligibleItems = rewardPool; } // Pick random item const randomItem = eligibleItems[Math.floor(Math.random() * eligibleItems.length)]; result.equipment.push(randomItem); } } return result; } export function rollMultipleLoot( enemies: Enemy[], luckStat: number, rewardPool: Equipment[], count: number ): LootResult { const totalResult: LootResult = { gold: 0, equipment: [] }; for (let i = 0; i < count; i++) { const enemy = enemies[Math.floor(Math.random() * enemies.length)]; const loot = rollLoot(enemy, luckStat, rewardPool); totalResult.gold += loot.gold; totalResult.equipment.push(...loot.equipment); } return totalResult; } export function generateUniqueId(): string { return `${Date.now()}-${Math.random().toString(36).substr(2, 9)}`; } export function cloneEquipment(equipment: Equipment): Equipment { return { ...equipment, id: generateUniqueId(), // Generate unique ID for inventory items stats: { ...equipment.stats } }; }

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/bellsanct/mcp-dungeon-game'

If you have feedback or need assistance with the MCP directory API, please join our Discord server