218 lines
11 KiB
TypeScript
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;
|
|
}
|
|
}
|
|
|