金币经验掉落

This commit is contained in:
2025-08-19 22:30:59 +08:00
parent 854affeaae
commit c47ecc21e6
12 changed files with 1809 additions and 462 deletions

View File

@@ -116,6 +116,93 @@ export const MonsterDropTable: { [monsterId: number]: [number, number, number, n
]
};
// 基础资源掉落配置表 - 以普通怪为基础值
export const BaseResourceDropConfig = {
// 经验值配置
exp: {
baseValue: 100, // 普通怪基础经验值
stageMultiplier: 1.15, // 关卡倍数 (降低增长)
randomRange: 0.2, // 随机范围 (±20%)
baseProbability: 1.0 // 基础掉落概率 (100%)
},
// 金币配置
gold: {
baseValue: 50, // 普通怪基础金币值
stageMultiplier: 1.12, // 关卡倍数 (降低增长)
randomRange: 0.25, // 随机范围 (±25%)
baseProbability: 0.7 // 基础掉落概率 (70%)
},
// 钻石配置
diamond: {
baseValue: 2, // 基础钻石值
stageMultiplier: 1.05, // 关卡倍数 (大幅降低增长)
randomRange: 0.2, // 随机范围 (±20%)
baseProbability: 0.0 // 基础掉落概率 (0%,需要品质加成)
}
};
// 怪物品质加成配置表 - 使用加法权重
export const QualityBonusConfig = {
[QualitySet.GREEN]: {
// 绿色品质:基础值 + 加成
expBonus: 0, // 经验值加成
goldBonus: 0, // 金币加成
diamondBonus: 0, // 钻石加成
expProbabilityBonus: 0, // 经验掉落概率加成
goldProbabilityBonus: 0, // 金币掉落概率加成
diamondProbabilityBonus: 0 // 钻石掉落概率加成
},
[QualitySet.BLUE]: {
// 蓝色品质:基础值 + 加成
expBonus: 50, // 经验值 +50
goldBonus: 25, // 金币 +25
diamondBonus: 0, // 钻石加成 0
expProbabilityBonus: 0, // 经验掉落概率加成
goldProbabilityBonus: 0.1, // 金币掉落概率 +10%
diamondProbabilityBonus: 0.2 // 钻石掉落概率 +20%
},
[QualitySet.PURPLE]: {
// 紫色品质:基础值 + 加成
expBonus: 100, // 经验值 +100
goldBonus: 50, // 金币 +50
diamondBonus: 1, // 钻石 +1
expProbabilityBonus: 0, // 经验掉落概率加成
goldProbabilityBonus: 0.2, // 金币掉落概率 +20%
diamondProbabilityBonus: 0.1 // 钻石掉落概率 +10%精英10%
},
[QualitySet.ORANGE]: {
// 橙色品质:基础值 + 加成
expBonus: 200, // 经验值 +200
goldBonus: 100, // 金币 +100
diamondBonus: 3, // 钻石 +3
expProbabilityBonus: 0, // 经验掉落概率加成
goldProbabilityBonus: 0.3, // 金币掉落概率 +30%
diamondProbabilityBonus: 1.0 // 钻石掉落概率 +100%BOSS必掉
}
};
// 关卡和buff加成配置表 - 使用加法权重
export const StageBuffBonusConfig = {
// 关卡加成配置
stage: {
expBonusPerStage: 5, // 每关经验值加成
goldBonusPerStage: 2, // 每关金币加成
diamondBonusPerStage: 0.1, // 每关钻石加成
expProbabilityBonusPerStage: 0, // 每关经验掉落概率加成
goldProbabilityBonusPerStage: 0, // 每关金币掉落概率加成
diamondProbabilityBonusPerStage: 0 // 每关钻石掉落概率加成
},
// buff数量加成配置
buff: {
expBonusPerBuff: 10, // 每个buff经验值加成
goldBonusPerBuff: 5, // 每个buff金币加成
diamondBonusPerBuff: 0.5, // 每个buff钻石加成
expProbabilityBonusPerBuff: 0, // 每个buff经验掉落概率加成
goldProbabilityBonusPerBuff: 0.01, // 每个buff金币掉落概率加成
diamondProbabilityBonusPerBuff: 0.005 // 每个buff钻石掉落概率加成
}
};
// 怪物掉落管理器
export class MonsterDropManager {
@@ -213,5 +300,68 @@ export class MonsterDropManager {
return result;
}
/**
* 计算怪物基础资源掉落(经验、金币、钻石)
* @param monsterQuality 怪物品质
* @param stageNumber 关卡数
* @param buffCount buff数量
* @returns 基础资源掉落结果
*/
static calculateBaseResourceDrops(monsterQuality: QualitySet, stageNumber: number, buffCount: number = 0): {exp: number, gold?: number, diamond?: number} {
const result: {exp: number, gold?: number, diamond?: number} = {exp: 0};
// 获取品质加成
const qualityBonus = QualityBonusConfig[monsterQuality];
// 计算经验值(必出)
const expConfig = BaseResourceDropConfig.exp;
const expValue = (expConfig.baseValue +
qualityBonus.expBonus +
StageBuffBonusConfig.stage.expBonusPerStage * stageNumber +
StageBuffBonusConfig.buff.expBonusPerBuff * buffCount) *
Math.pow(expConfig.stageMultiplier, stageNumber - 1);
// 添加随机范围
const expRandomFactor = 1 + (Math.random() - 0.5) * 2 * expConfig.randomRange;
result.exp = Math.floor(expValue * expRandomFactor);
// 金币与钻石独立判定,可同时掉落:
// 使用加法权重系统:基础值 + 品质加成 + 关卡加成 + buff加成 + 关卡增长
// 金币判定
const goldProbability = BaseResourceDropConfig.gold.baseProbability +
qualityBonus.goldProbabilityBonus +
StageBuffBonusConfig.stage.goldProbabilityBonusPerStage * stageNumber +
StageBuffBonusConfig.buff.goldProbabilityBonusPerBuff * buffCount;
if (Math.random() < goldProbability) {
const goldConfig = BaseResourceDropConfig.gold;
const goldValue = (goldConfig.baseValue +
qualityBonus.goldBonus +
StageBuffBonusConfig.stage.goldBonusPerStage * stageNumber +
StageBuffBonusConfig.buff.goldBonusPerBuff * buffCount) *
Math.pow(goldConfig.stageMultiplier, stageNumber - 1);
const goldRandomFactor = 1 + (Math.random() - 0.5) * 2 * goldConfig.randomRange;
result.gold = Math.floor(goldValue * goldRandomFactor);
}
// 钻石判定
const diamondProbability = BaseResourceDropConfig.diamond.baseProbability +
qualityBonus.diamondProbabilityBonus +
StageBuffBonusConfig.stage.diamondProbabilityBonusPerStage * stageNumber +
StageBuffBonusConfig.buff.diamondProbabilityBonusPerBuff * buffCount;
if (Math.random() < diamondProbability) {
const diamondConfig = BaseResourceDropConfig.diamond;
const diamondValue = (diamondConfig.baseValue +
qualityBonus.diamondBonus +
StageBuffBonusConfig.stage.diamondBonusPerStage * stageNumber +
StageBuffBonusConfig.buff.diamondBonusPerBuff * buffCount) *
Math.pow(diamondConfig.stageMultiplier, stageNumber - 1);
const diamondRandomFactor = 1 + (Math.random() - 0.5) * 2 * diamondConfig.randomRange;
result.diamond = Math.floor(diamondValue * diamondRandomFactor);
}
return result;
}
}