外观
破界深渊 · 技术实现
「玩家设定 →」
1. 代码位置
| 层 | 类 | 职责 |
|---|---|---|
| Controller | controller/RealmAbyssController(/api/dungeon/realm-abyss) | overview / battle:start / battle:fight / battle:abandon(choice/auto 已随单场化下线) |
| Service | service/RealmAbyssService | 层校验(层数 ∈ [1, 已通+1]、解锁双门槛)、单场劫云结算、扣次与发奖(原子)、练习场(ABP- 前缀)、旧进度迁移 |
| domain | domain/AbyssBattle | 战斗状态(record,序列化存 formation_json;FORMAT = ABYSS_SINGLE_V1,旧 JSON 自愈丢弃) |
| domain | domain/RealmAbyssRules | 20 层三段(凡境/灵境/仙灵兽)、法则总等级门槛 G(N)、三色石头掉落表、段末首通真伤灵砂、first_clear mask |
| domain | domain/AbyssBattleRules | 评级(S≥60% / A≥35%)与评分、S/A 评级溢价 ×1.3 / ×1.15 |
| domain | domain/AbyssMarkRules | 烙印(首破 mask)成长:全伤/压制减免/世界BOSS |
| domain | domain/TribulationCloudRules | 单场口径:ABYSS_CLOUD_COUNT=1、abyssCloudRealm(ceil(层/2))、abyssCloudProgress(奇数层 0.5 / 偶数层 1.0);玩家相对承压:abyssTargetSurvivalSeconds(L) = max(90, 270 − 9×(L−1))、playerRelativeAttack(防御, 生命, 秒)、netDpsFloor(生命, 秒);高层法则加成:abyssMonsterDodge/Block/DamageBonus(L)(11 层起至 30% / 16 层起至 25% / 11 层起至 +30%)、ABYSS_BLOCK_DAMAGE_TAKEN=0.5;CloudSpec 携带三项加成并由 cloudMonster 写入 MonsterCombatProfile |
| domain | domain/LawInstanceProfile | 真伤副本六法则百分比聚合(空间放大 / 混沌免伤 / 生命转血 / 因果破甲)+ 玩家命中(时空法则每级 +1%) |
2. 数据表
| 表 | 关键列 | 说明 |
|---|---|---|
player_realm_abyss_state | player_id(唯一)、current_layer、highest_cleared_layer、first_clear_mask、current_layout_version、formation_json、last_settlement_id/json | 单行状态机;formation_json 持久化战斗(开战覆盖、终态保留供回显) |
player_realm_abyss_settlement | settlement_id、layer | 胜利结算账本(RA-B-<battleId>,幂等锚点) |
player_realm_abyss_progress | 旧 300 层进度 | 只读迁移源(legacyAbyssHighestClearedLayer → 层数折算 + 灵砂缺口补发,migration_log 幂等) |
player_forge_migration_log | player_id、source | 迁移一次性标记(REALM_ABYSS / REALM_ABYSS_CAP_MATERIAL) |
3. 结算与次数
- 每日次数:
DungeonType.REALM_ABYSS,固定 1/日(baseLimit=1,无月卡/VIP/冠名加成);settleVictory内consumeDailyLimit原子扣次——破界成功才扣,失败/放弃不消耗。 - 奖励:
calculateRewardAmounts纯函数(石头 = 层掉落基数 × 评级溢价;神石仅首通 ×2 + 段末 ×3;灵砂仅段末首通);精粹 roll 用战斗种子(结算幂等重放不重 roll)。
4. 数据流简述
GET /overview 读状态行 + 次数快照 + 法则列表 + 烙印(formation_json 里的 OPEN/终态战斗一并回显);POST /battle/start 幂等开战(FOR UPDATE 锁行,已有 OPEN 战斗直接返回)→ generateCloudTable(layer, 玩家面板) 生成单场劫云:血量 = max(通道基准 DPS × 30, 玩家真伤通道 DPS × T_kill(层))(T_kill = 30 + 2×(层−1))、攻击 = max(静态锚点项, 0.5 × 玩家防御 + 玩家生命 / T_survive(层)),并写入该层的怪物闪避/格挡/伤害加成 → POST /battle/fight 一次请求确定性结算(击杀耗时 = 劫云血量 / 真伤通道 DPS;承伤 = 净 DPS × 耗时,仅真伤通道 expectedTrueDpsOnly;净承伤带 netDpsFloor 地板、破界内固伤吸血归零、怪物伤害加成与格挡按离散事件生效)→ 胜利进入 settleVictory(扣次 → 发奖 → 推进层位/烙印 → 写账本,同事务原子)。
2026-09 承压重标定:此前怪物攻击由静态月卡锚点反推,CombatService.monsterDamageToPlayer 的 max(1, 攻击 − 0.5×玩家防御) 会在玩家防御越过阈值后把每击夹成 1 点,再被吸血抵成 0 净承伤(「怪物打不动人」)。改为玩家相对口径后,承伤比例 ≈ 击杀耗时 / T_survive(层),与玩家面板解耦;静态项保留为下限以维持「法则不达标就打不动」的墙。
5. 已知差异
- 练习模式门槛后门(2026-09-22 已修):
startBattle旧写法if (!practice && layer > highestCleared)让练习模式整段跳过verifyLayerUnlocked,未达G(N)的下一层可练习进图;现练习与正式同门槛,已通关层仍可自由练习/farm。前端RealmAbyssPanel.vue同步按门槛置灰按钮。
6. 相关代码
- 炼体秘境(
BodyTemperingService:同构劫云体系,9 道连战 + 天劫二选一) - 天道法则(
LawType:真伤来源;法则总等级 = 开战门槛 G(N)) - 次数中枢(
DungeonLimitService/GameRepository.consumeDailyLimit)