# Demo开发需求文档 V2.2

日期：2026-09-23。第一实现目标：纯前端网页版。规则依据：最新《Demo配置表.xlsx》及截至本版的对话确认；本版替代V1.0的6层、5事件、三合一及回合战斗规则。

## 1. 验证范围与完整循环

开局30金币、免费R坦克拉伐索尔及R射手沙雷各一、模拟0次 → 10个探索层 → 每层结束的固定商店 → 第3/6/9层商店后的可选精英 → 第10层最终商店 → 独立Boss层 → 成功或失败 → 主动重开。

不做实际战斗、正式美术、非必要动画、玩家经验升级、局外收益及存档。刷新页面会重开；页面重开沿用当前配置。角色使用配置表59条真实名称数据，事件格使用两个中文字。金币结算价值为0。

## 2. 探索与出口

- 每层16格，初始全部未知。普通格为空白，无任何效果。每层3个特殊事件，同层事件编号不重复。不同编号的金币/陷阱/商店可同层出现。
- 每3层一个周期：1～3、4～6、7～9、10～12。固定配额先分配到周期三层，各层3事件，不重复；未翻、未执行的事件也消耗本周期配额。周期第一个楼层生成完整三层计划，进入每层时取该层计划。
- 第10层仅取第4周期第一个楼层，不补齐第11/12层事件。剩余两层不进入游戏。
- 格子位置不预放；事件类型已确定，但点击未知格时才决定该格为空白、特殊或出口。特殊格从本层剩余计划中随机抽取一个；所有剩余特殊必须能在16格内揭示。
- 出口不计特殊格。第6次揭示起才可能出现，第12次揭示保底；揭示出口当次沿用揭示前价格，因此免费。
- 出口前免费。出口后第n次付费翻格成本按层分组：1～3层为1、1、2、2…（封顶2）；4～6层1、2、3…（封顶3）；7～10层1、2、3、4…（封顶4），每层重置。金币不足不能翻，仍可从出口免费进入整备。
- 幸运的免费揭示不增加付费次数，但增加已探索格数、特殊格数及出口进度。

## 3. 事件处理与弹窗

事件信息、操作按钮置于小弹窗。主页只显示格子、状态、概览和事件说明入口。

|编号|名称|处理|效果|每3层分配|
|---|---|---|---|---|
|1|金币1|自动|整数随机10～16金币|固定2次|
|2|商店1|手动|3个角色，当前层+1卡池，最高10，不刷新|固定1次|
|3|宝箱|自动|50%获得12金币；否则永久攻击+8%|补足空缺|
|4|投资|手动|floor(当前金币×20%)，最小1最大8|固定2次|
|5|陷阱1|自动|整数随机损失2～4/3～6/4～8金币（按三个阶段），不低于0|固定1次|
|6|陷阱2|自动|50%损失2金币；否则永久攻击-5%|固定1次|
|7|金币2|自动|整数随机4～7金币|补足空缺|
|8|商店2|手动|回能+50%、伤害+20%、免伤+20%；每项8金币，每项限购一次|固定1次|
|9|赌博|手动|投入全部金币，每1金币独立50%返还2金币|最多1次|
|10|幸运|自动|随机免费揭示一个未翻格|补足空缺|

固定事件共8个，周期9个特殊格中的最后一个以50%概率分配赌博，否则在宝箱/金币2/幸运中等概率补足；此概率为Demo初始值。随机分配须满足同层不重复。

自动事件翻出后立即结算，自动打开结果弹窗；关闭不会撤回。幸运若触发另一个自动事件，两项结果合并显示，顺序为幸运及其引发结果。若触发手动事件，只揭示该格，仍需后续主动点击操作。没有未知格时幸运显示无可翻格并完成。

手动事件翻出时不弹窗、不结算。点击已翻格打开；关闭后保留，进入下一层前可重开。完成过的事件可查看结果，不可重复领取。特殊商店商品及购买状态固定，关闭或进出基础商店不重抽。进入下一层丢弃未处理事件及商店。事件不跨层存放。

## 4. 商店、阵容和成本

基础商店固定出现在每层探索后，包括第10层。可不消费直接继续，可返回本层地图；再次进入保留商品。刷新费用与次数按各层配置，默认4个商品。模拟仅限基础商店。

按当前层直接取商店概率，不存在玩家等级。商品先按R/SR/SSR概率抽品质，再等概率抽同品质角色，可重复。R/SR/SSR初始价格2/4/6。特殊商店为3商品、min(当前层+1,10)档、不刷新。

|层数|上阵区容量|替补区容量|
|---|---:|---:|
|1～3|5|3|
|4～6|8|4|
|7～10及Boss层|10|5|

购买优先上阵，满则替补。新层生效新容量，不自动将已有替补搬上阵。支持上下阵和跨区互换，两个区域都满仍可互换。空阵容允许探索，但挑战及最终Boss入口要求至少一名上阵角色。

两区共同检查同名同星两张自动升星，递归，最高5星。合成目标优先保留参与材料的上阵位置；否则留在替补区。2星+1星+新1星会先合2星再合3星。5星不合6星，有容量仍可购同名低星。上阵两个2星合3星时总特性可能下降，这是当前规则的明确结果。

满员购买先预演合成，合成后两区均不超容量才完成交易；失败回滚金币、角色、UID、随机状态及商品状态，不能先扣钱再报错。

单角色记录实际购入成本invested，免费初始角色为0；合成相加所有材料累计成本。售价=max(1,floor(invested×0.5))。例如四张各3金币合成3星，成本12，售价6。只在出售时取整；不计翻格/刷新成本。出售按钮展示返还金额，确认后移除角色、加钱、释放原区域槽位；不自动补位，不可重复出售。探索、基础商店、特殊商店、精英选择阶段可调整及出售；战报、Boss层及结束锁定。

## 5. 职业、精英、模拟与最终Boss

六职业各对应一个特性：坦克守护/射手破盾/法师群伤/辅助治疗/刺客暴击/战士破防。单角色贡献=星级×品质系数，R1、SR2、SSR3。只统计上阵角色，替补完全不计入。

每局开局从六种Boss机制中不重复随机三项，公开展示：高攻→守护、护盾→破盾、群怪→群伤、群伤→治疗、抗暴→暴击、高防→破防。

精英固定在第3/6/9层商店结束之后，可跳过。点击挑战立即判断上阵角色全部特性等级之和是否达到10/18/25。胜利默认12金币；配置可切为随机一次金币1/宝箱正面事件，不影响地图配额。失败记录全体永久最大生命减20个百分点，100→80→60→40→20→0，0死亡并结束。正常10层流程只有3次精英，最低40%。

最终Boss及模拟要求本局三项指定特性分别≥12，三项全部满足才胜利。失败逐项列出当前值、要求值、差值，不执行战斗动画。攻击增减益、回能、伤害、免伤及生命百分比记录和展示，暂不改变条件结果。

模拟开局0，通关第2/4层各获得1次，累积，授予每层仅一次。消耗1次立即给同一Boss的条件报告；不改金币、阵容、伤势或商店。第10层整备后模拟余额失效，进入独立Boss挑战。正式挑战失败整局结束，可重开。

## 6. 页面与状态机

页面：顶部进度/金币/模拟/生命；左侧Boss目标和日志；中间紧凑4×4地图或当前阶段；右侧两区阵容与特性；事件弹窗、事件说明、规则说明、配置编辑、确认、互换选择弹窗。

|状态|入口|可操作|后续|
|---|---|---|---|
|EXPLORE|开局/新层/关闭事件/返回地图|翻格、事件、阵容、离开|EVENT或SHOP|
|EVENT|自动结果/点击手动或已完成事件|查看、领取、购买、关闭；商店可调整阵容|EXPLORE|
|SHOP|发现出口后离开|购买、刷新、阵容、模拟、返回地图、继续|REPORT/EXPLORE/ELITE/BOSS_READY|
|ELITE|第3/6/9层NEXT|阵容、挑战、跳过|REPORT或新层|
|REPORT|条件判定完成|查看成功/失败与差值、确认|模拟回SHOP；精英进下一层；Boss进RESULT|
|BOSS_READY|第10层最终商店NEXT|正式挑战|REPORT|
|RESULT|Boss报告确认或全体死亡|重开|EXPLORE|

所有阶段可主动重开并确认清空。事件关闭按钮及Escape都统一关闭，不丢失手动事件状态。

## 7. 数据与接口

纯本地模块：config.js默认配置；engine.js规则；app.js渲染/动作绑定；style.css；index.html。无后端、账号、外部请求和付费服务。

Engine(config,seed)创建新局；validateConfig(config)校验返回深拷贝。统一dispatch({type,...payload})返回{ok,state,error?}。操作先克隆状态，失败恢复操作前所有状态。界面不能直接修改领域状态。

state核心字段：version/seed/rngState/phase/floor/gold/simulations/grantedFloors/injuryStacks/attackBonus/buffs/roster/nextUnitId/boss/cycles/map/baseShop/event/report/stats/log。

角色实例：{uid,cardId,star,invested,deployed}。卡定义：{id,name,job,rarity}。商店：{tier,offers:[{cardId,price,sold}]}。map：{tiles,planned,remaining,opened,found,exitFound,paidFlips,events}；tiles取null/empty/exit/事件数字ID。events按格索引存{id,status,result,shop,bought}。report：{kind,checks:[{name,actual,required}],win,message}。

动作：FLIP/OPEN_EVENT(index)、CLOSE_EVENT、RESOLVE_EVENT、BUY_BUFF(index)、LEAVE、RETURN_TO_MAP、BUY(index)、REFRESH、DEPLOY(uid)、SWAP(uid,target)、SELL(uid)、SIMULATE、NEXT、ELITE_START、ELITE_SKIP、BOSS_START、REPORT_CLOSE。重开与应用配置由界面创建新Engine。禁止不匹配阶段的动作。

## 8. 异常边界与验收

必须拒绝配置缺字段/非法数值、重复角色ID、概率和不为1、缺品质池、无效职业、容量递减、初始角色超容、出口保底超空间、非本版锁定规则。错误配置保留现有局。

必须拒绝重复翻格/购买/领奖/出售、金币不足、越界商品/角色、不匹配阶段、模拟次数不足及空阵容挑战。确认取消不影响游戏。陷阱最低扣到0，赌博0金币不可操作，投资0金币仍得1。特殊商店第10层封顶10档。

验收：连续1000个种子走满10层，验证每层16格/3特殊/唯一出口、周期配额和同层去重；验证提前离层不补发；自动弹窗与手动关闭重开；幸运免费与保底；精英固定流程/跳过/失败伤势；模拟隔离；三条Boss条件分别判断；两区满员互换和合成买入；连锁升星最高5星及成本守恒；出售最低1及重复操作；最终商店后Boss和主动重开。浏览器验证真实按钮和弹窗交互。

## 9. 开发任务完成项

1. 配置接入：5张工作表映射为可调JSON，保留59角色和所有表内概率。
2. 规则引擎：周期计划、动态揭示、出口收费、自动与手动事件。
3. 构筑：分区容量、购买/互换、递归两合一、累计成本出售。
4. 条件挑战：特性汇总、固定精英、模拟、最终Boss。
5. 界面：两字格子、事件小窗、事件说明、失败原因、状态提示。
6. 验证与交付：规则回归、浏览器交互验证、单文件离线HTML、源码包、文档、公开发布尝试。


## V2.2 经济曲线调整

新增floorEconomy按楼层设置整备收入、付费递增间隔、封顶及陷阱范围。1～3层首次整备奖励6金币，4～6层3金币，7～10层1金币；返回地图再进商店不重复授予。未知格直接显示本次金币价格，免费时显示“免费”，金币不足仍显示价格但禁用。初始金币30，角色价格2/4/6、刷新1；金币1为10～16、金币2为4～7、宝箱金币12；精英门槛10/18/25，胜利奖励12；Boss维持三项各12。所有本次调参均为Demo初始值/待实测调整。原始Excel不修改，以此版JSON为当前实现参数。


## V2.2 刷新规则（最新表覆盖）

首次进店生成商品不计刷新。每层刷新次数独立：3/3/3/4/4/4/5/5/5/10；每次费用1/1/2/2/3/3/3/3/4/5金币。baseShop.refreshesUsed记录已用次数，返回地图或Boss模拟后保持，下一层从0开始，不累积剩余次数。刷新前同时检查次数和金币；失败不扣金币、次数、不改商品或随机状态。特殊商店仍不可刷新。按钮显示本次费用及剩余次数，用尽禁用。品质概率同步最新商店等级表；其他经济、事件、角色、容量、伤势和出售规则保持V2.1值。旧全局refreshCost仅保留作兼容字段，实际收费由shops[].refreshCost决定。
