Files
heros/assets/script/game/common/config/Items.ts
2025-08-19 19:40:34 +08:00

218 lines
11 KiB
TypeScript

import * as exp from "constants";
import { QualitySet } from "./BoxSet";
export enum ItemType{
NORMAL=0,//普通
SPECIAL=1,//特殊 可双击打开
EQUIP=2,//装备
}
// 掉落物品接口
export interface DropItem {
item_uuid: number; // 物品ID
probability: number; // 掉落概率 (0-1之间)
minCount: number; // 最小掉落数量
maxCount: number; // 最大掉落数量
baseCount: number; // 基础掉落数量
growthRate: number; // 增长参数
}
// 怪物掉落配置接口
export interface MonsterDropConfig {
monsterId: number; // 怪物ID
quality: QualitySet; // 怪物品质
drops: DropItem[]; // 掉落物品列表
}
export const Items={
1001:{uuid: 1001,path: "1001",type:1,quality:QualitySet.GREEN,name: "绿色英雄石",info:"稀有英雄升星必须材料", },
1002:{uuid: 1002,path: "1002",type:1,quality:QualitySet.BLUE,name: "蓝色英雄石",info:"史诗英雄升星必须材料", },
1003:{uuid: 1003,path: "1003",type:1,quality:QualitySet.PURPLE,name: "紫色英雄石",info:"传说英雄升星必须材料", },
1004:{uuid: 1004,path: "1004",type:1,quality:QualitySet.ORANGE,name: "红色英雄石",info:"传说英雄升星必须材料", },
1005:{uuid: 1005,path: "1005",type:1,quality:QualitySet.ORANGE,name: "招募劵",info:"可以在英雄酒馆招募英雄", },
1006:{uuid: 1006,path: "1006",type:1,quality:QualitySet.BLUE,name: "铜钥匙",info:"解锁稀有英雄 也可以直接兑换金币", },
1007:{uuid: 1007,path: "1007",type:1,quality:QualitySet.PURPLE,name: "银钥匙",info:"解锁史诗英雄 也可以直接兑换金币", },
1008:{uuid: 1008,path: "1008",type:1,quality:QualitySet.ORANGE,name: "金钥匙",info:"解锁传说英雄 也可以直接兑换金币", },
}
export enum DropKey{
ItemUUId=0, // 物品ID
Pro=1, // 概率
Diff=2, // 上下限差值
Base=3, // 基础数量
GrowthRate=4, // 增长参数
}
// 怪物掉落配置表 - 按照DropKey顺序配置
export const MonsterDropTable: { [monsterId: number]: [number, number, number, number, number][] } = {
// 普通怪物 - 绿色品质
5201: [ // 兽人战士
[Items[1001].uuid, 1.0, 0, 1, 0.2], // [item_uuid, probability, diff, baseCount, growthRate] - 100%掉落1个绿色英雄石
[Items[1006].uuid, 0.3, 0, 1, 0.1] // [item_uuid, probability, diff, baseCount, growthRate] - 30%概率掉落铜钥匙
],
5202: [ // 兽人刺客
[Items[1001].uuid, 1.0, 0, 1, 0.2], // [item_uuid, probability, diff, baseCount, growthRate] - 100%掉落1个绿色英雄石
[Items[1006].uuid, 0.4, 0, 1, 0.1] // [item_uuid, probability, diff, baseCount, growthRate] - 40%概率掉落铜钥匙
],
5203: [ // 兽人护卫
[Items[1001].uuid, 1.0, 0, 1, 0.2], // [item_uuid, probability, diff, baseCount, growthRate] - 100%掉落1个绿色英雄石
[Items[1006].uuid, 0.3, 0, 1, 0.1] // [item_uuid, probability, diff, baseCount, growthRate] - 30%概率掉落铜钥匙
],
5204: [ // 石卫
[Items[1001].uuid, 1.0, 0, 1, 0.2], // [item_uuid, probability, diff, baseCount, growthRate] - 100%掉落1个绿色英雄石
[Items[1006].uuid, 0.35, 0, 1, 0.1] // [item_uuid, probability, diff, baseCount, growthRate] - 35%概率掉落铜钥匙
],
5205: [ // 土卫
[Items[1001].uuid, 1.0, 0, 1, 0.2], // [item_uuid, probability, diff, baseCount, growthRate] - 100%掉落1个绿色英雄石
[Items[1006].uuid, 0.35, 0, 1, 0.1] // [item_uuid, probability, diff, baseCount, growthRate] - 35%概率掉落铜钥匙
],
5206: [ // 树卫
[Items[1001].uuid, 1.0, 0, 1, 0.2], // [item_uuid, probability, diff, baseCount, growthRate] - 100%掉落1个绿色英雄石
[Items[1006].uuid, 0.35, 0, 1, 0.1] // [item_uuid, probability, diff, baseCount, growthRate] - 35%概率掉落铜钥匙
],
5219: [ // 牛头战士
[Items[1001].uuid, 1.0, 1, 1, 0.25], // [item_uuid, probability, diff, baseCount, growthRate] - 100%掉落1-2个绿色英雄石
[Items[1006].uuid, 0.4, 0, 1, 0.15] // [item_uuid, probability, diff, baseCount, growthRate] - 40%概率掉落铜钥匙
],
5220: [ // 牛头战士
[Items[1001].uuid, 1.0, 0, 1, 0.2], // [item_uuid, probability, diff, baseCount, growthRate] - 100%掉落1个绿色英雄石
[Items[1006].uuid, 0.3, 0, 1, 0.1] // [item_uuid, probability, diff, baseCount, growthRate] - 30%概率掉落铜钥匙
],
5221: [ // 牛头战士
[Items[1001].uuid, 1.0, 0, 1, 0.2], // [item_uuid, probability, diff, baseCount, growthRate] - 100%掉落1个绿色英雄石
[Items[1006].uuid, 0.4, 0, 1, 0.1] // [item_uuid, probability, diff, baseCount, growthRate] - 40%概率掉落铜钥匙
],
5222: [ // 独眼巨人
[Items[1001].uuid, 1.0, 0, 1, 0.2], // [item_uuid, probability, diff, baseCount, growthRate] - 100%掉落1个绿色英雄石
[Items[1006].uuid, 0.3, 0, 1, 0.1] // [item_uuid, probability, diff, baseCount, growthRate] - 30%概率掉落铜钥匙
],
5223: [ // 独眼巨人
[Items[1001].uuid, 1.0, 0, 1, 0.2], // [item_uuid, probability, diff, baseCount, growthRate] - 100%掉落1个绿色英雄石
[Items[1006].uuid, 0.3, 0, 1, 0.1] // [item_uuid, probability, diff, baseCount, growthRate] - 30%概率掉落铜钥匙
],
5224: [ // 独眼巨人
[Items[1001].uuid, 1.0, 0, 1, 0.2], // [item_uuid, probability, diff, baseCount, growthRate] - 100%掉落1个绿色英雄石
[Items[1006].uuid, 0.4, 0, 1, 0.1] // [item_uuid, probability, diff, baseCount, growthRate] - 40%概率掉落铜钥匙
],
// 精英怪物 - 蓝色品质
5225: [ // 精英独眼
[Items[1001].uuid, 1.0, 1, 2, 0.3], // [item_uuid, probability, diff, baseCount, growthRate] - 100%掉落2-3个绿色英雄石
[Items[1002].uuid, 1.0, 0, 1, 0.25], // [item_uuid, probability, diff, baseCount, growthRate] - 100%掉落1个蓝色英雄石
[Items[1006].uuid, 0.6, 1, 1, 0.2], // [item_uuid, probability, diff, baseCount, growthRate] - 60%概率掉落铜钥匙
[Items[1007].uuid, 0.2, 0, 1, 0.15] // [item_uuid, probability, diff, baseCount, growthRate] - 20%概率掉落银钥匙
],
5226: [ // 精英牛头
[Items[1001].uuid, 1.0, 1, 2, 0.3], // [item_uuid, probability, diff, baseCount, growthRate] - 100%掉落2-3个绿色英雄石
[Items[1002].uuid, 1.0, 0, 1, 0.25], // [item_uuid, probability, diff, baseCount, growthRate] - 100%掉落1个蓝色英雄石
[Items[1006].uuid, 0.6, 1, 1, 0.2], // [item_uuid, probability, diff, baseCount, growthRate] - 60%概率掉落铜钥匙
[Items[1007].uuid, 0.2, 0, 1, 0.15] // [item_uuid, probability, diff, baseCount, growthRate] - 20%概率掉落银钥匙
],
5227: [ // 精英兽人
[Items[1001].uuid, 1.0, 1, 2, 0.3], // [item_uuid, probability, diff, baseCount, growthRate] - 100%掉落2-3个绿色英雄石
[Items[1002].uuid, 1.0, 0, 1, 0.25], // [item_uuid, probability, diff, baseCount, growthRate] - 100%掉落1个蓝色英雄石
[Items[1006].uuid, 0.6, 1, 1, 0.2], // [item_uuid, probability, diff, baseCount, growthRate] - 60%概率掉落铜钥匙
[Items[1007].uuid, 0.2, 0, 1, 0.15] // [item_uuid, probability, diff, baseCount, growthRate] - 20%概率掉落银钥匙
]
};
// 怪物掉落管理器
export class MonsterDropManager {
/**
* 根据怪物ID获取掉落配置
* @param monsterId 怪物ID
* @returns 掉落配置
*/
static getDropConfig(monsterId: number): [number, number, number, number, number][] | null {
return MonsterDropTable[monsterId] || null;
}
/**
* 计算指定关卡数的掉落数量
* @param baseCount 基础数量
* @param growthRate 增长参数
* @param stageNumber 关卡数
* @param diff 上下限差值
* @returns 计算后的掉落数量
*/
static calculateDropCount(baseCount: number, growthRate: number, stageNumber: number, diff: number): number {
// 公式:基础数量 * 增长参数 * 关卡数 + (0-差值的随机数)
const calculatedCount = baseCount * growthRate * stageNumber;
const randomBonus = Math.floor(Math.random() * (diff + 1)); // 0到diff的随机数
const finalCount = calculatedCount + randomBonus;
// 允许掉落数量为0
return Math.max(0, Math.floor(finalCount));
}
/**
* 计算怪物掉落物品
* @param monsterId 怪物ID
* @param stageNumber 关卡数
* @param playerLuck 玩家幸运值加成
* @returns 掉落物品数组
*/
static calculateMonsterDrops(monsterId: number, stageNumber: number, playerLuck: number = 0): Array<{item_uuid: number, count: number}> {
const dropArray = this.getDropConfig(monsterId);
if (!dropArray) {
console.warn(`[MonsterDropManager]: No drop config found for monster ${monsterId}`);
return [];
}
const result: Array<{item_uuid: number, count: number}> = [];
const luckBonus = 1 + (playerLuck * 0.01); // 幸运值加成
// 处理所有掉落物品(统一按概率处理)
dropArray.forEach(dropData => {
const [item_uuid, probability, diff, baseCount, growthRate] = dropData;
if (Math.random() < probability) {
// 使用新的计算公式:基础值*关卡数*增长参数+(0-差值的随机数)
const finalCount = this.calculateDropCount(baseCount, growthRate, stageNumber, diff);
const countWithLuck = Math.floor(finalCount * luckBonus);
result.push({
item_uuid: item_uuid,
count: Math.max(1, countWithLuck) // 确保至少掉落1个
});
}
});
return result;
}
/**
* 预览指定关卡数的掉落数量(不包含随机因素)
* @param monsterId 怪物ID
* @param stageNumber 关卡数
* @returns 掉落物品预览数组
*/
static previewMonsterDrops(monsterId: number, stageNumber: number): Array<{item_uuid: number, baseCount: number, calculatedCount: number, maxCount: number}> {
const dropArray = this.getDropConfig(monsterId);
if (!dropArray) {
console.warn(`[MonsterDropManager]: No drop config found for monster ${monsterId}`);
return [];
}
const result: Array<{item_uuid: number, baseCount: number, calculatedCount: number, maxCount: number}> = [];
// 处理所有掉落物品
dropArray.forEach(dropData => {
const [item_uuid, probability, diff, baseCount, growthRate] = dropData;
const calculatedCount = baseCount * growthRate * stageNumber;
const maxCount = calculatedCount + diff;
result.push({
item_uuid: item_uuid,
baseCount: baseCount,
calculatedCount: Math.floor(calculatedCount),
maxCount: Math.floor(maxCount)
});
});
return result;
}
}