Files

40 KiB
Raw Permalink Blame History

敌人系统

一句话:敌人数据、技能池出招、意图呈现 状态:已定稿;现行为 v1.8

设计目的

敌人系统回答战斗里四个问题:对面是谁、有多强、接下来要干什么、怎么被打死。它同时管主角和敌人的数据面——双方共用同一套受伤与死亡的接口,所以它也是踩雷代价的收件人:惊动危险格喂给怪物的每一分优势,最终都落在它管的血量上。没有它,惩罚没有落点、胜负没有主体、难度曲线没有施加对象。

它向玩家兑现三条承诺。威胁可推测:特殊技有一次开轮类型级预告、结算明细具名到技能,普攻之外的行动都读得懂来龙去脉。强弱有来处:它强是我踩雷喂的,它弱是我封印拆的。越下越险:深层敌人更凶,是下探氛围的可见刻度。反向护栏只有一条——威胁绝不能是无源暗账,玩家说不出"它为什么变强、这一拳为什么这么重",就是本系统失职。

出招的质感目标是动作游戏怪物 AI:以普通攻击为基底,随机时机出特殊技——出招序列不可背诵,但每一次出手都离散、具名、可归因。

系统范围

边界这样划:本系统是战斗单位的"数据与语义层"——单位有哪些数值、技能池的构成纪律(一张池怎么配才合法)、摇定之后状态怎么变,都归这里;每个敌种的池实际由哪些技能构成、各占多大权重,是行数据,逐行读敌人表(enemy.tres),调参所有权归难度曲线与Boss;什么时候结算、一笔伤害最终算多少、摇号怎么摇,归战斗结算编排;增益层数存放在哪,归增益状态;画成什么样,归 HUD 框架与战斗表现。本系统编排被动:自己从不主动做事,零随机、不碰界面、不订阅事件,一切等战斗结算来调。

负责:

负责 说明
单位数据与接口 主角与敌人共用的血量、存活;对外的"查状态"与"受动作"两组能力
两张单位表与技能表的定义与回填 敌人表(含池模板)、主角表、技能表的字段、取值域、表值回填(表本体的承载与读取归数据配置)
技能池语义 池构成纪律、技能行词汇表、实例池与冷却状态、死亡作废规则
目标顺位规则 敌方打谁、玩家与道具默认打谁的固定顺位

不负责:

不负责 归谁
摇号执行与结算编排(何时摇、伤害合成、死亡判定时机、护甲克制矩阵) 战斗结算
状态层数的存放与衰减(削弱层池、蓄力/硬化/警觉增益) 增益状态
奖励内容与掉落 地图战斗资源
棋盘规则(挖格、封印、惊动危险格等事实的发生) 排雷玩法
遭遇构成(何时开战、坐标与数量怎么定) 关卡节点地图;跨战斗血量保留归冒险结构(生命账本)
单位数值曲线、池权重/冷却/保底投值与难度修饰 难度曲线与Boss
呈现(线索映射清单、顺位与血条、摇定动画、受击与死亡演出) HUD 框架 与 战斗表现
配置表的 schema 与读取机制 数据配置

在核心循环中的位置

战斗开始:战斗结算按遭遇坐标调本系统生成单位(池快照成实例池)──▶ 每轮开轮摇号定拍 → 轮末结算按技能行兑现 ──▶ 敌全灭 / 主角归零,回流战斗结算判胜负

敌人系统站在"战斗兑现"这一段的单位层。上游是战斗结算的编排调用,以及经它转化而来的棋盘事实(踩了雷、落了封印);下游回给战斗结算两样东西——胜负判定素材和带来源的伤害分量。

核心规则

主角与敌人共用同一套受伤与死亡规则

战斗场上恰有两类单位:主角一个,敌人一至四个(数量随遭遇行集骰定,见「开战生成」节)。它们共用同一套"身体语义"——每个单位有当前血量与血量上限,挨打血量往下减,减到 0 即死亡。本系统只如实记账并提供查询;"这一下最终算多少伤害、何时算死"的裁决归战斗结算。主角血量归零是失败判定素材,敌人全部归零是胜利判定素材,判定本身同样归战斗结算。

单位的一生只有四态:

状态 怎么进入 此时会发生什么
未上场 单位刚创建、还没开战 无任何作用,唯一出口是开战时被实例化
存活 开战时按表值(敌人)或血量入参(主角)生成 可被指定目标、按摇定技能行动、计入全灭判定
已死亡 血量归 0(判定时机归战斗结算) 移出顺位、不再出招;不可逆(MVP 无复活);死亡记录保留只读可查
已消亡 战斗结束统一清场 逻辑失效:查询返回空、作用接口拒绝;唯一出口是下一场重新生成

两条不变式贯穿始终:血量恒在 0 与上限之间;战斗内敌人只减不增。举证:本节为状态语义,无计算。

开战生成:主角数据行与一场 1–4 个敌人(行集可混编多种敌种)

战斗开始时,编排方给出遭遇坐标(关卡序号 + 深度带——节点深度所在的区间),本系统据此在敌人表里取出该坐标的整个行集(一行或多行),把本战实际数量的敌人逐行生成出来——每行各按自己的数量行值实例化(单行 1 到 3 个),行集实例总数(各行开战骰后数量求和)不超过 4。同带键多行即混编遭遇:各敌种同场上阵,生成序 = 表文件行序(行序即契约——目标顺位、摇号子流派生、开战叙述取首行都按它,加载期校验兜底:同带键多行必须文件内相邻)。单行行集 = 既有形态:一场 1 到 3 个同种同属性敌人,来自同一行表值。战斗中敌人只减不增,不做召唤、增援、分裂。主角同时以当前血量入参生成,血量越界(高于上限或不超过 0)整单拒绝、不留半实例。

生成拿到的是当时的表值快照:开战那一刻把每行的数值和池模板各抄一份,之后改表不影响已生成的单位。池模板快照成每实例自己的实例池(各技能冷却清零),此后各自独立摇号、互不干涉。某行的数量或攻击基线若配成了区间,由战斗结算用封闭随机流在开战时按行各掷定一次(每行掷自己的区间;掷定次数随行数——单行行集的掷定次数与既有口径逐位一致,混编不新增随机源形态)后传入确定值——本系统自身始终零随机;掷定后整场持久,攻击基线不逐拍重掷(数字要可读)。

规则 含义
敌方效果对全体生效 范围效果作用于所有存活敌人——场上可多种敌种共存,结算语义按存活单位逐一生效、不依赖"场上全同种"前提;"只打某一个"的单体寻址接口已在增益状态〈单体寻址扩展位〉节定稿,随首个单体效果的内容批开放(见 P1)
行集构成纪律 敌人表按(关卡序号 × 深度带)存放;深度带=节点深度的区间——逐局生成使单点深度不再固定,配池按带不按点,难度坡随带递增。同一带键行集允许多行、允许不同敌种混编;Boss 行按终点配置,多终点各配一行(走哪条路决定打谁)。纪律三条,违规加载期返回错误并止动:①行集内 enemy_id 唯一(同一敌种在同行集仍只许一行);②同带键多行必须表文件内相邻,行序 = 声明序 = 生成序(行序即契约);③行集实例总数(各行骰后数量求和)≤ 4,单行数量域 [1,3] 不变(单行数量上限语义 = 单种数)。行数不设上限;同关随深度换敌种合法
主角数据行 主角战斗数值单独放一张全局单行表:生命上限、基础攻击力、护甲等级三字段(见调参表)
基础攻击恒存在 基础攻击不许配 0(配置为 0 加载期拒绝)——零基线乘任何百分比增益恒为零,"胜利路径恒有"的保障从数据层杜绝死锁
先手攻击不是敌方技能拍 每次结算战斗段主角先手攻击顺位最前的存活敌人,这是固定动作;奖励侧的道具与增益是基础攻击之外的规划面伤害,归地图战斗资源

名字是玩家可见专名。各敌种的行数据——名字、数量、生命、攻击、技能池、护甲两轴——逐行读敌人表(enemy.tres),本文不设敌种名录抄本;需要人读的敌种总览时,走外置图鉴工具(随工程批落地:从敌人表导出数据,渲染成独立打开即可阅读的静态总览页)。

护甲类型(轻甲 / 魔法护甲 / 重甲)与攻击类型的克制结算矩阵归战斗结算,本系统只提供每个敌种的护甲类型数据——各敌种的甲型行值逐行读敌人表(enemy.tres)。护甲等级是另一条数值轴(防守方字段,基础攻击掷点的折扣判定读数):敌人表与主角表各增 armor_class 一列(域 [0, 999]),掷点与折扣的结算归战斗结算,行值投值归难度曲线与Boss——主角与敌方的护甲等级行值读配置表(正式行值待怪物设定投值,登记待办清单),两条轴的概念与字段禁止混用。举证:生成与护甲为数据面规则,无计算。

技能池:每敌种一张带权技能池,每拍开轮摇号出招

每种敌人有一张技能池——一组带出招权重的技能行。敌人每拍做什么由一次摇号决定:把它实例池里冷却中的技能排除,剩下的按权重份额归一摇一个。中签率 = 该技能权重 ÷ 当前可摇技能权重合计——权重是份额不是固定百分比,排除谁,谁的份额按比例摊给其余技能。出招序列不可背诵,但摇号只决定"做什么";伤害多少由三乘法链在结算段算(见战斗结算)。

三层对象,模板与实例分离:

层 对象 载体 职责
定义层 技能行 独立技能表(数据配置承载、本系统回填) 技能是什么:类型、倍率、冷却、效果引用——多敌种共享
定义层 池模板 内嵌敌行 pool 数组:{skill_id, weight} 敌种用什么、多常用——难度曲线的调参单点
实例层 实例池 单位实例(开战把模板快照一份) 这一只在什么状态:各技能冷却剩余、摇定动作、保底计数

技能行字段词汇表:

字段 适用类型 说明
skill_id 全部 主键,池条目引用键
display_name 全部 玩家可见名(明细行与动画共用)
type 全部 封闭枚举 {普通攻击, 伤害, 增益, 妨害}(现行事实源=敌人系统.md 词汇表/增益状态.md;多段命中经用户拍板退役不入枚举);新类型走本文修订
damage_mult 仅伤害 伤害倍率;域 [1.1, 16] provisional。普通攻击恒 1、不可配
rider_mult 仅伤害、可省 必中附加分量:域 (0, 1],缺省无字段 = 无附加;分量值 = max(伤害下限, floor(攻击基线 × rider_mult))——随施放者攻击基线缩放,后置加法、必中全额、不进乘区、不出暴击(后置加法同族);价位锚 0.75 = AC 折扣档最轻档"不掉档的稳定伤害"
cooldown_beats 全部 施放后连续 N 拍不可摇中;普通攻击恒 0、不可配
buff_ref / buff_duration 仅增益与妨害 效果引用(指向状态效果行)与持续回合数;落点:增益技归施放者自己(每只敌是独立个体,一只施放只强化自己——2026-11-02 用户裁),妨害技归主角;施放类 side 守卫加载拒绝——妨害技零新授予通道
trigger(触发条件) 全部,可省 {fact, op, value, latch} 四键——fact 与 op 取「触发条件」节封闭词表,value 类型与域随 fact,出域加载期拒绝;缺省无字段=无条件技
P1 字段位 — 命中段数、目标数——随对应后置批加列(触发条件位已由 trigger 立列收编;"固定值分量"位已由 rider_mult 收编;多段命中「命中段数」保留以防复活)

普通攻击也是一行技能行,两条域校验锁死它的特殊性:倍率恒 1、冷却恒 0——想配倍率或冷却的就不是普攻,是伤害技。技能伤害存倍率、不存固定值:伤害 = 施放者攻击基线 × 技能倍率——同一行"重击",不同敌种按各自攻击基线缩放 = 基线 A × 技能倍率 M(行值读 enemy.tres / skills.tres),深层强化行自动缩放,这是共享技能表成立的前提;固定的绝对值伤害不满足该前提(不随基线缩放、跨关稀释——Brotato 教训),"固定值伤害"的合法形态是必中附加分量 rider_mult(×攻击基线的必中小倍率)。增益技带效果引用与持续回合,百分比天然按施放者同池生效,无缩放问题;妨害技同构,落点由状态行 target_side 路由到主角。技能伤害基线的取整:攻击基线 × 倍率按四舍五入、正好半格时一律向上取——全伤害管线唯一不用向下取整的点(半点上取保住低攻击档特殊技的辨识度:攻击 1 配 ×1.5 的突刺落到 2 而不是 1)。

池构成纪律(加载校验,违规拒绝入表):每池恰一行普通攻击(普攻冷却恒 0 → 可摇集合恒非空,"空池不可能"由结构保证,最坏情况怪物平砍等待——那是玩家的反打窗口而非死拍);每池增益类技能 ≤1(非 RPG,怪物连出不同增益显得呆);每池妨害类技能 ≤1;每池至少一行不带触发条件的特殊技(普攻不算——保底特殊技集合恒非空的结构保证);池条目 skill_id 悬空致命;权重 > 0、冷却 ≥ 0。

两道闸(表值 provisional,投值归难度曲线与Boss,行值读技能表):

闸 语义
技能冷却 每技能行带冷却拍数;施放后连续 N 拍不可摇中——普攻恒 0 不可配,其余行值读技能表
保底 连续 M 拍执行的都是普通攻击 → 下一拍必出特殊技(特殊技内按权重,不受冷却限制);M 读技能表 pity_threshold

结构红利:增益存续期内下一拍必是伤害技(池里其余全是伤害技、增益自身还在冷却)——增益不可能白白过期,"连出不同增益"被池构成纪律结构性消除。同一技能连发不可能(自身冷却杜绝);异名特殊技背靠背概率低(是变化不是失控,全局特殊间隔闸登记 P1 备用旋钮)。

开轮摇号时序(随机消费全部在战斗结算换算层):

开轮(轮次开始):排除冷却中与触发条件不满足的技能 → 按行序逐敌摇定本拍行动(behavior_roll 封闭流,每敌独立子流)→ 冷却递减
挖掘期:按摇定结果播类型级动画(特殊技)/ 零表示(普通攻击)
结算段:按技能行兑现——掷点、乘区、增益挂接、明细落行
判定段之后进入下一轮开轮……

首轮同样摇号;每轮恰摇一次,轮内刷新换图不重摇。摇号随机走封闭随机流、每敌按生成序派生独立子流——单敌出招轨迹可独立复放、互不穿插;本系统自身语义零随机不变,单位容器收到的是确定结果(armor_roll 先例同构)。

死亡即不动手(保留):摇定后、兑现前死亡(主角先手 / 更早兑现的敌方伤害技),本拍技能作废——不动手、不进冷却、不进保底计数;其余存活敌人照常。拍结构保留:每结算每存活敌恰行动一次、按行序、先作用后推进——变的只是"轮到什么",由固定剧本改为摇号。同种敌人不再锁步:各自实例池独立摇号、独立冷却,怪物 1 的重击在冷却里不影响怪物 2,轨迹分歧是涌现,不设开战分配机制。

蓄力语义:蓄力不是重击前奏——它是一行增益技:0 伤害动作,施加 empower 状态(幅度读 status_effects.tres),持续 1 个有效结算(provisional)。蓄力与重击之间没有任何组合语义——增益与技能倍率恰好同拍只是增益倍率 × 技能倍率的两层乘法共存(增益幅度 × 增益幅度 = 两层乘法读表可得),蓄力后摇中普通攻击则是增益倍率的加成平砍,两者同为平常事,不是设计的连招。技能冷却(几拍内不能再摇中,技能行属性)与增益持续(状态挂几回合,状态行属性)是两个计时器,互不相干。施放行 = 0 伤害动作,不掷不折。

Boss 专属身份 = 专属池承载:独占技能 + 权重轮廓(技能错峰两轨口径:Boss 轨 = L1 酋长池含独占增益技"硬化"〔敌方防御池词汇载体〕+ 半血解锁伤害技"震地怒击";L2 卓尔池独占妨害技"蛛网束缚"+伤害技"毒爆"+ 半血解锁"遏毒";L3 石君王池独占妨害技"大地脉动"+ 半血解锁"岩崩"——独占技随关错峰投放,三行解锁技=每 Boss 一行新独占伤害技〔用户裁案甲,2026-10-04〕;普通敌轨 = L2/L3 普通敌种技能随关错峰投放(巨蜘蛛族+毒吐〔(2,5)/(2,6)/(2,7),首遇教学位 (2,4) 不投〕、灰矮人族+盾击〔(3,0)/(3,5)/(3,7)〕)——第一关不见的招式第二/三关普通战可见;增益 ≤1 纪律下蓄力拍不进 Boss 池)。

举证:**摇定结果 = 可摇集合按权重份额归一的一次抽签;当前可摇集合 = 实例池排除冷却中与触发条件不满足的技能(保底命中时 = 条件满足的全部特殊技)。**连带可判别:把权重当固定百分比、把冷却当只锁高伤技、把蓄力当重击前奏,都是与本规约相悖的旧口径。

触发条件:情境技与闩型解锁共用一套门槛

技能行可以带一个触发条件:条件不满足的拍,这行技能不进可摇集合——与冷却中的排除同一待遇;条件满足时,按正常权重照摇。它服务两类出招:情境技(自身低血才用的防御、上轮玩家停手才会出的偷袭等)让怪物像在"看情况出招",停手与压血因此有了代价;闩型解锁(半血解锁)让大招只在血量跌破阈值后才可被摇出。两类用例、一套机制——条件只管"现在能不能被摇到",不改权重、不强制出手。

规则(人话阶段):求值发生在每轮开轮摇号前——对实例池逐行求值,读当时战斗快照;逐敌自身的事实(self 类)各自求值,全局事实全场一份。本系统零随机纪律不变:条件只是可摇集合的又一排除项,摇号公式(权重份额归一)与随机流消费序都不动,同种子回放逐位复现。字段是技能行 trigger 四键 {fact, op, value, latch}:fact 与 op 各取下方封闭词表,value 类型与域随 fact——出域加载期拒绝止动;缺省无字段=无条件技。latch(单向闩)为真时,条件首次求值为真后整场保持为真(治疗抬血不回锁);缺省为假=每轮开轮重新求值(瞬态条件,如"上轮停手"过了就过)。

事实词表(首批六词,求值面=开轮快照):

fact 读数 求值归属
self_hp_pct 自身血量的阈值比较:先把 value 折算为绝对阈值 round(自身 max_hp × value/100),再与当前 hp 比较 逐敌各自
hero_hp_pct 主角血量的阈值比较:先把 value 折算为绝对阈值 round(主角 max_hp × value/100),再与当前 hp 比较 全局
round_index 当前轮次(1 基) 全局
last_round_end 上轮结束方式:无(首轮)/清图/停手/耗尽——取行动经济轮次结束仲裁出的唯一赢家 全局
mines_hit_last 上轮踩雷数 全局
mines_hit_total 本场累计踩雷数 全局

算子词表(首批六比较算子):eq/neq/gt/gte/lt/lte——last_round_end 以枚举值配 eq/neq(value 取枚举串),数值事实配全六算子;value 类型随 fact(数值事实整数、百分比事实域 [1,99]、枚举事实枚举串)。百分比事实的算子统一按阈值式求值:折算出的绝对阈值与当前 hp 作比较——lte 形态与半血解锁原式逐位一致(收编行为零变化的结构保证),六算子都在该阈值上定义,不做百分比读数取整。

与既有机制的互作用(全部按半血解锁先例顺延,无新增裁决面):

机制 规则
冷却 照常——条件与冷却各自独立排除,同一拍可叠加
保底 保底特殊技集合同样排除条件不满足的技能(保底禁止逼出条件不满足的技);池构成纪律"每池至少一行无条件特殊技"保证该集合恒非空
死亡作废 照常——摇定后兑现前死亡,本拍作废、不进冷却不进保底计数
意图呈现 三档规格不变——情境技属特殊技,走类型级预告+结算明细具名,因果由技能名承载(如"趁隙偷袭");闩型保留解锁弹出规格(见"目标顺位与意图线索"节)

半血解锁:Boss 解锁技=trigger {fact: self_hp_pct, op: lte, value: 行值, latch: 真}——解锁弹出规格(归因明细行+一次性技能名 toast)、单向闩语义、双面过滤。

首批落地(已实装):①三 Boss 解锁技为闩型条件;②两个示范投放——地精池+低血防御增益「孤注守势」(self_hp_pct lte 35,纯增益)、L2/L3 群行位+停手偷袭伤害技「趁隙偷袭」(last_round_end eq 停手)。投放敌种、权重与阈值投值归难度曲线与Boss;"每池增益≤1"纪律不动,条件技照常计入预算。

举证:触发条件为门槛过滤规则,无计算——可摇集合 = 实例池排除冷却中与触发条件不满足的技能(保底命中时 = 条件满足的全部特殊技)。

伏击(已退役)与群伤负向现况

伏击词条(敌方每刀附加固定点数伤害)已整体退役:奖励/惩罚镜像对账发现其"层数 × 出手敌数"的复利全部集中在主角单血条,与群伤奖励"摊到 N 条敌方血条"构成双重不对称;单轮授予上限护栏已先行退役。blast 型负向现况 = 警觉(敌方全体护甲等级 +1/层,持续 1 结算,逐颗叠加无上限)——状态行定义与承载归增益状态,掷点消费归战斗结算的护甲等级判定;本系统不再承载敌方侧受击语义。

目标顺位与意图线索:打谁不用选,特殊技开轮有一次类型级预告

敌方一侧没有选择可言:所有存活敌人各自按摇定技能作用于主角,主角是敌方唯一目标。玩家与道具一侧用固定顺位:单体效果默认打生成序最前的存活敌人,它死了顺延到下一个;范围效果打全体存活敌人,同样无需选择。场上只有一个敌人时,顺位与范围自然重合,是合法退化不是错误。顺位必须对玩家可读——"下一个被打的是谁"要能推测出来。

意图呈现走"摇定动画 + 具名明细"的组合,池与权重不公开、不做技能池界面。摇定结果的信息面分三档:

摇中 挖掘期呈现 结算揭示
普通攻击 零表示——完全不可预测 明细行"普通攻击(暴击/被压制)"
特殊技 技能动画占位(攻击系 / 增益系 / 妨害系三族)——纯类型级提醒,不预告技能名与数值 明细行具名技能 + 数值
nat20 暴击 无前置表示(掷点层,与技能重击严格区分) 明细行"(暴击)"标注

即:普攻完全不可预测;特殊技有一次类型级预告,不可撤销,但给"继续挖还是停手"的决策依据。

半血解锁弹出规格(解锁判定点=通用事件「血量阈值 enemy_hp_threshold」的发射点,对所有带闩型血量触发条件的敌人逐个发射、非 Boss 专属——Boss 语义留给订阅条件判定;条件载体=技能行 trigger 闩型,见「触发条件」节):Boss 血量降至解锁阈值(trigger 行值,域 [1,99],缺省无字段=无门槛)时,下一个开轮摇号前出一次归因明细行「XX 解锁了 YY」(高光键为技能解锁,行型复用高光行零新增);呈现层对该行弹一次性技能名 toast(轻量提示,非演出——零动画资产、不改演出规格),只报技能名不报数值,池与权重不公开纪律不变。解锁=单向闩(治疗抬血不解锁);锁定条目双面过滤(不进可摇集合与保底特殊技集合——保底禁止逼出未解锁技);解锁后冷却初值 0 即可摇。投放纪律=机制通用、闩型解锁用例仅 Boss 专属技投放(enemy 表无 boss 编码位,硬闸须跨表查节点类型——不做硬闸,本句即文档纪律登记)。技能动画的攻/防系映射归战斗表现,敌人侧摇定动画位归HUD 框架(呈现载体 = 站桩立绘,2026-09-20 全站桩拍板),本系统只锁上面这张三档规格。

规格 含义
池与权重不公开 无技能池界面、无权重数值露出;实例池的可见面 = 摇定结果本身
类型级预告 特殊技只预告攻击/增益/妨害系类型,不预告技能名与数值
映射每局恒定 动画映射以技能类型为键,跨局不重掷
数字只在明细 预告面是类型级动画,数字面是结算明细(具名技能 + 数值)
预告时序锁定 开轮摇定即可见,挖掘期全程;轮内刷新换图不重摇

举证:本节为顺位与呈现数据面规则,无计算。

依赖与输出

本系统编排被动:全部调用集中在战斗结算,棋盘事实(踩雷、封印)经它转化后才作用于单位;本系统零随机、零界面、零事件订阅。下表就是删除任何一方时的影响面清单。

方向 系统 接口要点
上游 战斗结算 唯一编排调用方:开战生成、开轮摇号(随机消费)、结算内兑现/受击/执行上报的次序由它钉死;踩雷到警觉施加的转化(每颗雷恰一次)也由它编排
上游 数据配置 敌人表、主角表、技能表的 schema 承载与类型化读取;本系统是三表的回填责任方
相邻 增益状态 敌方侧增益状态(警觉)随八型批改由它承载与登记;层数登记与轮末衰减归它,层数由战斗结算读出后作参数传入——运行时零直接调用
下游 战斗结算 胜负判定素材(敌全灭 / 主角归零)与伤害分量(基线 × 技能倍率)的供给方;护甲克制矩阵归它
下游 地图战斗资源 固定顺位是道具伤害的默认目标规则;基础攻击恒在,奖励侧是基础攻击之外的规划面伤害
下游 关卡节点地图 遭遇构成(何时开战、坐标与数量怎么定)归它;跨战斗血量是否保留归冒险循环裁决
下游 难度曲线与Boss 曲线数值与池权重/冷却/保底投值的调参所有权归它;难度修饰施加点在行值快照之前(MVP 零修饰)
下游 HUD 框架 线索映射清单、单位顺位与血条、摇定动画位、敌方增益显示的呈现归它(引用不转述)
下游 战斗表现 技能动画(攻/防系映射)、受击与死亡表现的呈现归它(引用不转述)

对外接口只有两组能力:查状态(血量 / 摇定动作 / 顺位 / 存活)与受动作(受击 / 摇定写入 / 执行上报 / 消亡)。什么时候调、按什么顺序调,全归战斗结算。

P0 最小闭环

  1. 战斗开始:战斗结算按遭遇坐标调本系统生成单位——读表快照实例化本战数量的敌人(池模板快照成实例池、冷却全零),主角以血量入参生成。
  2. 开轮摇号:战斗结算换算层排除冷却中技能、按行序逐敌摇定本拍动作写入实例池,随后冷却递减(首轮同样摇;轮内刷新换图不重摇)。
  3. 挖掘期踩雷:事实经战斗结算转化为警觉施加——每颗雷恰一次、逐层记账(无上限)。
  4. 每轮结算战斗段:主角先基础攻击顺位最前的存活敌人,随后每个存活敌人按摇定技能行兑付(伤害技 = 基线 × 倍率,增益技 = 施放行 + 状态授予);地图奖励与惩罚的伤害兑付殿后到战斗段末统一落地(案C 2026-10-06 用户裁,见战斗结算)。
  5. 受击上报、血量递减;归 0 即移出顺位(摇定后兑现前死亡 → 本拍作废不进账)。
  6. 执行上报:已兑现的技能进冷却、保底计数更新(普攻 +1 / 特殊技归零)。
  7. 敌全灭或主角归零,回流战斗结算作胜负判定素材。
  8. 战斗结束:全部单位消亡、不跨战斗,下一场重新生成。

P1 / P2 后置

优先级 内容 后置原因
P1 情境条件触发器(低血触发防御、玩家停手时偷袭技等) 已实装(三 Boss 闩型+两示范投放,见「触发条件」节与「首批落地」段)
P1 个体化变体池(A 型好斗 / B 型守势、精英专属池) 共识点 A 的 A2 案;登记待办清单
P1 全局特殊间隔旋钮 特殊技背靠背实测仍嫌时的备用闸;登记待办清单
P1 新效应词汇(妨害技 + 必中附加分量已实装——实装面 = L2 Boss 卓尔;多段命中经用户拍板退役) 妨害类型 + rider_mult 字段已落地;登记待办清单(已解决移除,去向见状态记录)
P1 敌种扩容与投放节奏(含第二关池与投放) 投放节奏是关卡命脉,归难度曲线与Boss
P1 单体寻址("只打某一个敌人"的目标指定) 归集语义与呈现已裁定(语义归增益状态〈单体寻址扩展位〉节);实现随首个单体效果的内容批落地
P2 敌方技能图鉴 / 学习呈现(玩家侧技能知识系统) 池不公开口径下的进阶信息面;登记待办清单
P2 精英 / Boss 遭遇编码位(已完成——不设编码位:同层多遭遇由节点编号消解,关卡节点地图 v1.0⑥ 用户裁决) —

调参表

配置表共三张。数值纪律:本文只锁字段、取值域与规则,行值一律读配置表(切片 game/data/tables/ 的 enemy / skills / hero 表),不在本文登记具体数值——防双写失同步;曲线调参所有权归难度曲线与Boss。

敌人表(按深度带坐标存放,每坐标行集一行或多行——多行即混编遭遇,构成纪律见核心规则「行集构成纪律」;单行行集 = 既有形态):

参数 取值域 说明
level_index(关卡序号) int ≥ 1 行集坐标第一维:第几关;每关必有战斗类、深度带 0 的一行(锚行)与至少一行 Boss 类行——加载校验强制;关间台阶的坐标轴,行值投值归难度曲线与Boss
row_kind {battle, boss} 行类:battle = 战斗节点配池(非 Boss 的战斗节点一律取此类),boss = 终点行集——Boss 战按终点配置,多终点各配一行(走哪条路决定打谁);开战按节点类型取对应类的行集
depth_band int ≥ 0 深度带 = 节点深度所在的区间(定义见核心规则「行集构成纪律」):配池按带不按点,难度坡随带递增;节点深度落在带与带之间时取首个 ≥ 深度的带键(偏难一侧);越顶带加载校验判为调参事故;带键投放归难度曲线与Boss
unit_count [1, 3] 遭遇数量区间下界;有上界的行开战时在区间内掷定,教学位节点同样掷骰
unit_count_max [unit_count, 3],可省略 数量区间上界;开战时在区间内掷定本战实际数量;缺省 = 定值
atk_min / atk_max [0, 999] 可选配对 攻击基线区间:开战掷定一次、整战持久;缺省 = 定值行
armor_type {轻甲, 魔法护甲, 重甲},缺省轻甲 克制结算归战斗结算
attack_type {普通, 穿刺, 魔法},缺省普通 敌方攻击类型轴(20 行全填 normal,攻击类型闭集枚举+缺省回退向后兼容,与 armor_type 同位同款);消费面 = 战斗结算敌方技兑付路径的护甲克制矩阵查表(敌方开单第 9 参传值+克制消费点,见战斗结算);行值投值归难度曲线与Boss
armor_class(护甲等级) int [0, 999],缺省 0 防守方护甲等级——基础攻击掷点的折扣判定读数,掷点结算归战斗结算;与 armor_type(克制属性轴)两概念禁止混用;行值投值归难度曲线与Boss
hp [1, 999] 单位生命基线(难度修饰前)
atk [0, 999] 攻击基线
pool(池模板) {skill_id, weight} 数组,weight ∈ (0, 9999] 技能行引用在技能表;池构成纪律与悬空引用加载期拒绝(校验在数据配置跨表通道)

技能表(全局单表,技能行主键 skill_id):

参数 取值域 说明
type {普通攻击, 伤害, 增益, 妨害} 封闭枚举;新类型走本文修订;技能行名录读表
damage_mult [1.1, 16] 仅伤害技;普通攻击恒 1 不可配(域校验锁死)
cooldown_beats [0, 99] 施放后连续 N 拍不可摇中;普通攻击恒 0 不可配(域校验锁死——空池不可能的结构前提)
buff_ref / buff_duration 效果引用 / [1, 99] 仅增益与妨害技(target_side 路由);悬空引用加载期拒绝
pity_threshold(保底 M) [1, 99] 全局单旋钮:连续 M 拍执行普攻 → 下拍必出特殊技
trigger {fact, op, value, latch},词表见核心规则「触发条件」节;value 类型随 fact(数值事实整数、百分比事实域 [1,99]、枚举事实枚举串) 全部可省,缺省=无条件技;出域加载期拒绝;情境技与解锁阈值的行值投值归难度曲线与Boss

主角表(单行全局):

参数 取值域 说明
max_hp [1, 999] 主角生命上限
atk [1, 999] 基础攻击;配 0 加载期拒绝——基础攻击恒在
armor_class(护甲等级) int [0, 999] 主角作为防守方的护甲等级基准,ac_up(盾牌加护)在其上加算;掷点结算归战斗结算
armor_type {轻甲, 魔法护甲, 重甲},缺省轻甲 主角护甲类型轴(可配置可修改);克制结算归战斗结算——矩阵消费面双向在役(现役敌方全 normal 档,主角三甲型对敌方的读数差 = 穿重甲 −1 / 穿魔法护甲 +1 / 轻甲 0,同种子配对实测在案,数值终值归 M4)
attack_type {普通, 穿刺, 魔法},缺省普通 主角基础攻击类型轴(基础攻击量与攻击类型抽象分离——营地永久强化换型 = 改此字段,atk 量轴不动);消费面 = 战斗结算·战斗段基础分量

各敌种行值、池权重与池 EV 读数(含闸长期速率实测)一律读配置表与调参日志,本文不登记具体数值;EV 重锚与权重投值归难度曲线与Boss。

结构冻结(非调参项,修订走本文流程):技能类型枚举封闭、每池恰一普攻、每池增益 ≤1、死亡即不动手(摇定后兑现前死亡作废不进账)、每结算每存活敌恰行动一次、行序、先作用后推进、固定顺位、行集构成纪律(行集内 enemy_id 唯一 + 同带键多行文件内相邻且行序 = 声明序 = 生成序 + 行集实例总数 ≤ 4)、零随机(本系统自身语义零随机不变——摇号与掷点随机一律在战斗结算结算换算层按封闭随机流掷定,可回放契约 = 同种子同输入逐位复现,单敌出招轨迹可独立复放)。联动纪律:技能倍率 × 攻击(伤害拍支配)、权重 × 冷却 × 保底(池节奏三联动)禁止独立调参,联调须重跑方向性预检并同步登记册(登记 待办清单)。

验收标准

  • 开战生成:按遭遇坐标取出该坐标行集(一行或多行,逐行实例化——行序 = 文件序),实例化数量与数值投影同行值快照;行集实例总数(各行骰后)≤ 4;池模板快照成实例池且冷却全零;主角以血量入参,越界(高于上限或不超过 0)拒绝且不留半实例。
  • 摇号确定性:同种子回放逐位复现(步骤流与各实例摇定动作序列逐位相同);单敌轨迹独立复放——只喂该敌子流(scope = 生成序 × 派生向量 + 摇号序)即可逐位重建其出招序列、互不穿插。
  • 池节奏:中签率 = 权重 ÷ 可摇权重合计(排除冷却中与触发条件不满足的技能后归一);施放后连续 N 拍不可摇中;连续 M 拍执行普攻 → 下拍必出特殊技(条件满足的特殊技内按权重、不受冷却限制);同技能连发不可能;首轮摇号、每轮恰摇一次、轮内刷新不重摇。
  • 触发条件:条件不满足的技能不进可摇集合与保底集合(保底禁止逼出条件不满足的技);条件求值零随机、同种子回放逐位复现;闩型条件首次为真后整场保持(治疗抬血不回锁);每池至少一行无条件特殊技(加载校验);缺省无 trigger 字段=无条件技,旧表零变化。
  • 死亡即不动手:摇定后、兑现前被杀——本拍技能作废(零行动明细行),不进冷却、不进保底计数;行动完成后才死——已兑付已进账;对已死亡单位上报受击被拒绝且状态不变。
  • 空池不可能:每池恰一行普通攻击(域校验),普攻冷却恒 0 → 任意实例任意拍可摇集合恒非空。
  • 伤害拍读值:读值 = 基线 × 倍率;普攻 = 倍率 1 特例;施放拍恒为 0。
  • 警觉授予:踩 N 颗雷叠 N 层、逐层直授无上限;按个体归属——每个存活敌各发一条自己的实例(全体存活敌规则,见增益状态〈目标规则与个体归属〉节)。
  • 目标顺位:多敌时单体目标恒为生成序最前存活者,杀最前后顺延;杀至空返回空;单敌时顺位与范围效果重合。
  • 快照抗改表:实例化后修改敌人表,已生成单位的数值投影与实例池逐字不变;新实例才用新表值。
  • 表校验:越域值、池权重 ≤ 0、空池、普攻配倍率/冷却、池增益 > 1、skill_id 悬空、行集构成违例(行集内同敌种第二行 / 同带键多行不相邻)均在加载期返回错误并止动;域内合法极端(攻击基线 0)不拒;主角表恰一行、攻击配 0 拒绝。
  • 零随机回放:同一动作与受击序列驱动两个独立实例,存活投影、逐实例摇定轨迹、顺位返回序列逐项相同。
  • 表实一致:敌人表、主角表、技能表三张配置表的字段与各自字段定义逐字段一致。

待办

本系统待办条目已统一收编至 待办清单,本节不再逐条登记。