428 lines
8.8 KiB
Markdown
428 lines
8.8 KiB
Markdown
|
|
# 游戏数值模型文档
|
|||
|
|
|
|||
|
|
本文档详细描述了游戏中所有数值计算的核心公式和设计理念。
|
|||
|
|
|
|||
|
|
## 目录
|
|||
|
|
|
|||
|
|
1. [设计原则](#设计原则)
|
|||
|
|
2. [角色属性系统](#角色属性系统)
|
|||
|
|
3. [装备属性系统](#装备属性系统)
|
|||
|
|
4. [词缀系统](#词缀系统)
|
|||
|
|
5. [怪物属性系统](#怪物属性系统)
|
|||
|
|
6. [经验与升级系统](#经验与升级系统)
|
|||
|
|
7. [战斗伤害计算](#战斗伤害计算)
|
|||
|
|
8. [经济系统](#经济系统)
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 设计原则
|
|||
|
|
|
|||
|
|
### 1. 线性与指数平衡
|
|||
|
|
|
|||
|
|
- **低等级(1-20)**:使用线性增长,确保新手体验平滑
|
|||
|
|
- **中等级(21-50)**:引入指数增长,增加挑战
|
|||
|
|
- **高等级(51+)**:指数加速,突出后期成就
|
|||
|
|
|
|||
|
|
### 2. 边际收益递减
|
|||
|
|
|
|||
|
|
- 属性越高,继续提升的成本越大
|
|||
|
|
- 防止某一项属性无限堆叠
|
|||
|
|
|
|||
|
|
### 3. 有意义的多样性
|
|||
|
|
|
|||
|
|
- 不同属性有不同用途,避免单一最优解
|
|||
|
|
- 词缀系统提供随机性和惊喜
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 角色属性系统
|
|||
|
|
|
|||
|
|
### 基础属性
|
|||
|
|
|
|||
|
|
| 属性 | 符号 | 默认值 | 说明 |
|
|||
|
|
|------|------|--------|------|
|
|||
|
|
| 力量 | STR | 10 | 影响攻击力 |
|
|||
|
|
| 敏捷 | AGI | 8 | 影响闪避、防御 |
|
|||
|
|
| 灵巧 | DEX | 8 | 影响暴击 |
|
|||
|
|
| 智力 | INT | 10 | 影响品质、魔法 |
|
|||
|
|
| 体质 | VIT | 10 | 影响生命、回复 |
|
|||
|
|
|
|||
|
|
### 派生属性计算
|
|||
|
|
|
|||
|
|
```javascript
|
|||
|
|
// 基础生命值
|
|||
|
|
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 | 橙色 |
|
|||
|
|
|
|||
|
|
### 装备最终属性计算
|
|||
|
|
|
|||
|
|
```javascript
|
|||
|
|
// 品质倍率
|
|||
|
|
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 | 传说 |
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 怪物属性系统
|
|||
|
|
|
|||
|
|
### 怪物等级缩放
|
|||
|
|
|
|||
|
|
```javascript
|
|||
|
|
// 生命值缩放(每级 +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% 范围内浮动:
|
|||
|
|
```javascript
|
|||
|
|
LevelVariance = BaseLevel × 0.2
|
|||
|
|
MinLevel = Max(1, BaseLevel - LevelVariance)
|
|||
|
|
MaxLevel = BaseLevel + LevelVariance
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 难度系数
|
|||
|
|
|
|||
|
|
```javascript
|
|||
|
|
// 基础难度
|
|||
|
|
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 |
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 经验与升级系统
|
|||
|
|
|
|||
|
|
### 角色升级经验
|
|||
|
|
|
|||
|
|
```javascript
|
|||
|
|
// 所需经验 = 基础值 × 增长系数^(等级-1)
|
|||
|
|
ExpNeeded = 100 × 1.15^(Level - 1)
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
| 等级 | 所需经验 | 累计经验 |
|
|||
|
|
|------|----------|----------|
|
|||
|
|
| 1 | 100 | 0 |
|
|||
|
|
| 5 | 174 | 674 |
|
|||
|
|
| 10 | 352 | 2261 |
|
|||
|
|
| 20 | 1458 | 12674 |
|
|||
|
|
| 50 | 84049 | 424058 |
|
|||
|
|
|
|||
|
|
### 战斗经验计算
|
|||
|
|
|
|||
|
|
```javascript
|
|||
|
|
// 等级差调整
|
|||
|
|
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% |
|
|||
|
|
|
|||
|
|
### 技能经验
|
|||
|
|
|
|||
|
|
```javascript
|
|||
|
|
// 技能经验衰减(等级越高越难升级)
|
|||
|
|
Decay = 0.95^(SkillLevel - 1)
|
|||
|
|
ActualExp = ActionExp × Decay
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
| 技能等级 | 经验衰减 | 获得100经验实际得到 |
|
|||
|
|
|----------|----------|-------------------|
|
|||
|
|
| 1 | 100% | 100 |
|
|||
|
|
| 5 | 81% | 81 |
|
|||
|
|
| 10 | 63% | 63 |
|
|||
|
|
| 20 | 36% | 36 |
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 战斗伤害计算
|
|||
|
|
|
|||
|
|
### 普通伤害
|
|||
|
|
|
|||
|
|
```javascript
|
|||
|
|
// 基础伤害
|
|||
|
|
BaseDamage = Attack - Defense × 0.5
|
|||
|
|
|
|||
|
|
// 最小伤害保证(攻击力的20%)
|
|||
|
|
MinDamage = Attack × 0.2
|
|||
|
|
|
|||
|
|
// 实际伤害
|
|||
|
|
ActualDamage = Max(MinDamage, BaseDamage)
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 暴击系统
|
|||
|
|
|
|||
|
|
```javascript
|
|||
|
|
// 暴击判定
|
|||
|
|
IsCrit = Random(0, 100) < CritRate
|
|||
|
|
|
|||
|
|
// 暴击伤害
|
|||
|
|
if (IsCrit) {
|
|||
|
|
CritDamage = BaseDamage × 1.5 // 基础暴击倍率
|
|||
|
|
// 可通过装备/技能提升
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 命中系统
|
|||
|
|
|
|||
|
|
```javascript
|
|||
|
|
// 实际命中率
|
|||
|
|
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 |
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 经济系统
|
|||
|
|
|
|||
|
|
### 物品价值
|
|||
|
|
|
|||
|
|
```javascript
|
|||
|
|
// 出售价格
|
|||
|
|
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(每回合伤害)
|
|||
|
|
|
|||
|
|
```javascript
|
|||
|
|
PlayerDPT = PlayerAttack × PlayerHitRate
|
|||
|
|
MonsterDPT = MonsterAttack × (1 - PlayerDodgeRate)
|
|||
|
|
|
|||
|
|
// 生存回合
|
|||
|
|
SurvivalTurns = PlayerHP / MonsterDPT
|
|||
|
|
|
|||
|
|
// 击杀回合
|
|||
|
|
KillTurns = MonsterHP / PlayerDPT
|
|||
|
|
|
|||
|
|
// 战斗评价
|
|||
|
|
if (KillTurns < SurvivalTurns) {
|
|||
|
|
// 玩家优势
|
|||
|
|
} else {
|
|||
|
|
// 怪物优势
|
|||
|
|
}
|
|||
|
|
```
|