- 修复品质等级范围重叠问题(优秀/稀有无重叠) - 统一 formulas.js 与 constants.js 的品质判定 - 修复经验公式与游戏实际逻辑不一致 - 调整品质生成概率: 传说0.1%, 史诗1%, 稀有4%, 优秀10% - 添加数学模型文档和README - 添加数值验证脚本 Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
8.8 KiB
8.8 KiB
游戏数值模型文档
本文档详细描述了游戏中所有数值计算的核心公式和设计理念。
目录
设计原则
1. 线性与指数平衡
- 低等级(1-20):使用线性增长,确保新手体验平滑
- 中等级(21-50):引入指数增长,增加挑战
- 高等级(51+):指数加速,突出后期成就
2. 边际收益递减
- 属性越高,继续提升的成本越大
- 防止某一项属性无限堆叠
3. 有意义的多样性
- 不同属性有不同用途,避免单一最优解
- 词缀系统提供随机性和惊喜
角色属性系统
基础属性
| 属性 | 符号 | 默认值 | 说明 |
|---|---|---|---|
| 力量 | STR | 10 | 影响攻击力 |
| 敏捷 | AGI | 8 | 影响闪避、防御 |
| 灵巧 | DEX | 8 | 影响暴击 |
| 智力 | INT | 10 | 影响品质、魔法 |
| 体质 | VIT | 10 | 影响生命、回复 |
派生属性计算
// 基础生命值
HP = 100 + VIT × 10 + Level × 5
// 基础耐力
Stamina = 80 + VIT × 5 + Level × 3
// 基础精神
Sanity = 100 + INT × 3
// 基础攻击力
Attack = STR × 1.0 + Level × 2
// 基础防御力
Defense = AGI × 0.3 + VIT × 0.2 + Level
// 基础暴击率 (%)
CritRate = 5 + DEX × 0.3
// 基础闪避率 (%)
DodgeRate = AGI × 0.5
属性效果示例
| 属性值 | 效果 |
|---|---|
| STR 10 → 20 | 攻击力 +10 |
| AGI 10 → 20 | 闪避 +5%,防御 +3 |
| DEX 10 → 20 | 暴击 +3% |
| VIT 10 → 20 | HP +100,回复 +0.5/秒 |
| INT 10 → 20 | 装备品质期望 +5 |
装备属性系统
装备品质
品质范围:0-250,影响装备属性的百分比加成。
| 品质范围 | 名称 | 倍率 | 颜色 |
|---|---|---|---|
| 0-49 | 垃圾 | 0.5x | 灰色 |
| 50-89 | 普通 | 1.0x | 白色 |
| 90-129 | 优秀 | 1.2x | 绿色 |
| 130-159 | 稀有 | 1.5x | 蓝色 |
| 160-199 | 史诗 | 2.0x | 紫色 |
| 200-250 | 传说 | 3.0x | 橙色 |
装备最终属性计算
// 品质倍率
QualityMultiplier = 1 + (Quality - 100) × 0.01
// 等级倍率(每级 +2%)
LevelMultiplier = 1 + (ItemLevel - 1) × 0.02
// 综合倍率
TotalMultiplier = QualityMultiplier × LevelMultiplier
// 最终伤害
FinalDamage = BaseDamage × TotalMultiplier
// 最终防御
FinalDefense = BaseDefense × TotalMultiplier
装备品质示例
以攻击力20的基础武器为例:
| 品质 | 等级 | 最终攻击力 |
|---|---|---|
| 100 (普通) | 1 | 20 |
| 150 (优秀) | 1 | 30 |
| 200 (史诗) | 1 | 40 |
| 100 (普通) | 10 | 24 |
| 150 (优秀) | 10 | 36 |
| 200 (史诗) | 10 | 48 |
词缀系统
词缀稀有度
每件装备最多3个词缀,词缀数量和稀有度受品质影响。
| 品质范围 | 最大词缀数 | 词缀稀有度倾向 |
|---|---|---|
| 0-89 | 0 | 无 |
| 90-129 | 1 | 普通60%,稀有30% |
| 130-159 | 2 | 稀有为主 |
| 160-199 | 3 | 史诗为主 |
| 200-250 | 3 | 传说9% |
词缀属性
词缀属性随物品等级缩放:
词缀最终值 = 词缀基础值 × (1 + (物品等级 - 1) × 0.1)
武器词缀示例
| 名称 | 类型 | 基础值 | 稀有度 |
|---|---|---|---|
| 锋利 | 攻击+5% | 5 | 普通 |
| 残暴 | 攻击+12% | 12 | 稀有 |
| 弑神 | 攻击+25% | 25 | 传说 |
| 锐利 | 暴击+3% | 3 | 普通 |
| 致命 | 暴击+8% | 8 | 稀有 |
| 烈焰 | 火伤+10 | 10 | 史诗 |
防具词缀示例
| 名称 | 类型 | 基础值 | 稀有度 |
|---|---|---|---|
| 坚固 | 防御+5% | 5 | 普通 |
| 强化 | 防御+12% | 12 | 稀有 |
| 铁壁 | 防御+25% | 25 | 史诗 |
| 灵活 | 闪避+3% | 3 | 普通 |
| 耐久 | 耐力+15 | 15 | 稀有 |
| 不朽 | 生命+100 | 100 | 传说 |
怪物属性系统
怪物等级缩放
// 生命值缩放(每级 +12%)
MonsterHP = BaseHP × 1.12^(Level - 1)
// 攻击力缩放(每级 +8%)
MonsterAttack = BaseAttack × 1.08^(Level - 1)
// 防御力缩放(每级 +6%)
MonsterDefense = BaseDefense × 1.06^(Level - 1)
// 经验奖励缩放(每级 +10%)
MonsterEXP = BaseEXP × 1.10^(Level - 1)
怪物等级范围
怪物实际等级在基础等级 ±20% 范围内浮动:
LevelVariance = BaseLevel × 0.2
MinLevel = Max(1, BaseLevel - LevelVariance)
MaxLevel = BaseLevel + LevelVariance
难度系数
// 基础难度
Difficulty = 1.0
// 精英怪
Elite: Difficulty = 1.5
// Boss
Boss: Difficulty = 2.0
// 弱小怪
Weak: Difficulty = 0.7
怪物属性示例
以基础攻击10的怪物为例:
| 等级 | HP | 攻击 | 防御 | 经验 |
|---|---|---|---|---|
| 1 | 100 | 10 | 5 | 20 |
| 5 | 157 | 14 | 7 | 29 |
| 10 | 278 | 20 | 10 | 47 |
| 20 | 872 | 43 | 17 | 122 |
| 50 | 18403 | 184 | 74 | 5851 |
经验与升级系统
角色升级经验
// 所需经验 = 基础值 × 增长系数^(等级-1)
ExpNeeded = 100 × 1.15^(Level - 1)
| 等级 | 所需经验 | 累计经验 |
|---|---|---|
| 1 | 100 | 0 |
| 5 | 174 | 674 |
| 10 | 352 | 2261 |
| 20 | 1458 | 12674 |
| 50 | 84049 | 424058 |
战斗经验计算
// 等级差调整
LevelDiff = MonsterLevel - PlayerLevel
if (LevelDiff > 5) {
// 怪物高5级以上,额外奖励
ExpMultiplier = 1 + (LevelDiff - 5) × 0.1
} else if (LevelDiff < -5) {
// 怪物低5级以上,大幅衰减
ExpMultiplier = Max(0.1, 0.5 + (LevelDiff + 5) × 0.1)
} else {
// 等级相近,正常或小幅衰减
ExpMultiplier = 1 + LevelDiff × 0.05
}
// 实际经验
ActualExp = BaseExp × ExpMultiplier
经验衰减表
| 玩家等级 vs 怪物等级 | 经验倍率 |
|---|---|
| +5级或更高 | 100%+ |
| 相同等级 | 100% |
| -3级 | 85% |
| -5级 | 50% |
| -10级 | 10% |
技能经验
// 技能经验衰减(等级越高越难升级)
Decay = 0.95^(SkillLevel - 1)
ActualExp = ActionExp × Decay
| 技能等级 | 经验衰减 | 获得100经验实际得到 |
|---|---|---|
| 1 | 100% | 100 |
| 5 | 81% | 81 |
| 10 | 63% | 63 |
| 20 | 36% | 36 |
战斗伤害计算
普通伤害
// 基础伤害
BaseDamage = Attack - Defense × 0.5
// 最小伤害保证(攻击力的20%)
MinDamage = Attack × 0.2
// 实际伤害
ActualDamage = Max(MinDamage, BaseDamage)
暴击系统
// 暴击判定
IsCrit = Random(0, 100) < CritRate
// 暴击伤害
if (IsCrit) {
CritDamage = BaseDamage × 1.5 // 基础暴击倍率
// 可通过装备/技能提升
}
命中系统
// 实际命中率
ActualHitRate = Clamp(5, 95, HitRate - DodgeRate)
// 命中判定
IsHit = Random(0, 100) < ActualHitRate
伤害示例
| 攻击 | 防御 | 基础伤害 | 最小伤害 | 实际伤害 |
|---|---|---|---|---|
| 20 | 5 | 17.5 | 4 | 17-18 |
| 50 | 10 | 45 | 10 | 45 |
| 50 | 30 | 35 | 10 | 35 |
| 100 | 50 | 75 | 20 | 75 |
| 30 | 40 | 10 | 6 | 10 |
经济系统
物品价值
// 出售价格
SellPrice = BaseValue × QualityMultiplier × (1 + AffixCount × 0.15)
// 购买价格(商人倍率)
BuyPrice = SellPrice × MerchantRate
// 商人收购价
BuybackPrice = SellPrice × 0.3
商人类型
| 商人 | 出售倍率 | 收购倍率 |
|---|---|---|
| 普通商人 | 200% | 30% |
| 黑市商人 | 250% | 50% |
| 特殊商人 | 150% | 40% |
价值示例
以基础价值100的物品为例:
| 品质 | 词缀 | 出售价 | 购买价(普通) | 购买价(黑市) |
|---|---|---|---|---|
| 100 | 0 | 100 | 200 | 250 |
| 150 | 1 | 145 | 290 | 362 |
| 200 | 2 | 250 | 500 | 625 |
| 200 | 3 | 287 | 574 | 717 |
平衡性检查
攻击期望
玩家攻击期望 = 基础攻击 × (1 + 暴击率 × 暴击倍率)
例如:攻击100,暴击率20%,暴击倍率1.5
期望伤害 = 100 × (1 + 0.2 × 0.5) = 100 × 1.1 = 110
生存期望
玩家有效生命 = HP × (1 + 闪避率 / (1 - 闪避率))
例如:HP 1000,闪避30%
有效生命 = 1000 × (1 + 0.3 / 0.7) = 1000 × 1.43 = 1430
DPT(每回合伤害)
PlayerDPT = PlayerAttack × PlayerHitRate
MonsterDPT = MonsterAttack × (1 - PlayerDodgeRate)
// 生存回合
SurvivalTurns = PlayerHP / MonsterDPT
// 击杀回合
KillTurns = MonsterHP / PlayerDPT
// 战斗评价
if (KillTurns < SurvivalTurns) {
// 玩家优势
} else {
// 怪物优势
}