构建 1.0.360(code 360)· 2026-10-02 02:46:34 · sha256 7cc2e55da8f166f7…
开发日志(本轮摘要)
# 贵霜帝国 · 内网开发版 · 本轮开发记录
生成时间:2026-10-02 02:46:02 | 本包:kushan-1.0.360.apk(1.0.360 / code 360,sha256 7cc2e55da8f166f7…)
## 最近开发任务证据(evidence/*/readme.md,新→旧,取 10 份)
### TASK-B037-RECUR (2026-10-02 02:30:59)
# TASK-B037-RECUR · B-037 结案 + 同类复发(**已收口**)
**日期**:2026-10-02 02:40 | **包**:1.0.358(真机 `R3CR704Q72V`)
## 一、B-037 原判据的处置:**对象已不存在**
`scripts/room/shop_panel.gd` 已随 41 号 §九十四 S3(b) 退场(文件实测不存在;`room_view.gd` 已不再引用)⇒ 「商店面板点不动」在当前代码里**无法复现**(面板本身没了)。**不因此只写「消解」就完事** —— 该缺陷的机制是**复发类**:
`room_layout.gd` 内已有 4 处带「真机实测」注释的 `mouse_filter = MOUSE_FILTER_IGNORE` 处置(全屏底色/场景图/描述层…),说明「装饰层默认 STOP 把点击吃掉」在这个仓反复出现过。
## 二、复发网(新工具,**故意不叫 `verify_`**)
`tools/scan_click_eaters.py` —— 扫房间界面里 `TextureRect/RichTextLabel/ColorRect/Panel/Label.new()` 的**非按钮变量**,看其后 40 行内是否显式 `MOUSE_FILTER_IGNORE`,列出候选。
按仓库纪律(假阳性未清零前不得带 `verify_` 前缀、不进全量闸门),它是**给人看的候选清单**,输出落 `scan_click_eaters.txt`。
**扫描结果与逐条裁决**(29 个文件,3 处已显式 IGNORE):
```
① scripts/room/map_screen.gd:120 bg = ColorRect.new() → 不修:全屏地图遮罩,**应该**吃掉点击(挡住下层房间)
② scripts/room/room_person.gd:55 tr = TextureRect.new() → ★修:立绘是装饰,父面板 p 才接交谈
③ scripts/room/room_refresh.gd:260 rt = RichTextLabel.new() → 不修:出口「点文字走过去」的点击目标
```
## 三、本轮实修(②)+顺手收拾(遗留探针)
1. `scripts/room/room_person.gd`:立绘 `TextureRect` 补 `mouse_filter = Control.MOUSE_FILTER_IGNORE`
—— 父面板 `p` 已是 `STOP` 且 `gui_input` 接交谈;子层吃点击 ⇒ 表现就是「点立绘/名字(立绘范围内)没反应」,与 B-037 同机制。
2. `scripts/room/room_refresh.gd:82`:**遗留探针**原先「每进一间房无条件扫屏打日志」(其上游注释写「验完即删」却一直在)⇒ 改 cfg 门控(`HIT_X/HIT_Y` 或 `MENU_DUMP=1` 才跑),生产零影响。
## 四、真机取证(1.0.358)
```
(a) cfg 带 HIT_X/HIT_Y=470,760 ⇒ 探针行数=7 ← 探针功能保留,可继续做命中排查
(b) cfg 不带 ⇒ 探针行数=0 ← 门控生效,生产不再白扫屏/刷日志
KUSHAN_HIT 点(470.0, 760.0) 命中 4 层,最上层=/root/Main/RoomView/@MarginContainer@105/@VB…(面板在顶层,正常)
候选含 /root/Main/RoomView/@TextureRect@113(场景图层的 TextureRect **确实参与命中** ⇒ 该机制在真机确实存在)
```
截图:`room358.png`(同包同 cfg,房间正常渲染)。
## 五、未验(如实记)
- 「点立绘/名字」的**手指点击**未在本机取证(该机折叠屏外侧触控注入不可用,历史 E-010/B-061 同因);本轮以**代码判据+命中层证据**收口。
- ①③ 两处按裁决**不改**(理由见上),若日后真机发现同点位点不动,按本卡口径复跑 `scan_click_eaters.py` 复核。
### TASK-MAP-MODULE-DEPS (2026-10-02 02:24:20)
# TASK-MAP-MODULE-DEPS · MAP-08 单向依赖(**已收口**)
**日期**:2026-10-02 02:20 | **口径**:68 号 MAP-08(行数项 2026-09-26 已作废 ⇒ 见 G-010「只查职责不查行数」)
## 新护栏 `tools/verify_map_module_deps.py`(已自动纳入全量)
判据:四模块内部引用**只能是** `map_screen → {map_nav, map_data, map_render}`;基础件不得反向引用 `map_screen`、彼此不得互引、不得成环。
**正测(现仓)**:
```
map_nav → (无)
map_data → (无)
map_render → (无)
map_screen → map_data、map_nav、map_render
✔ 单向成立:3 条边全部向下,无反向边、无环 / RESULT=PASS
```
**反测(临时往 `map_nav.gd` 注入 `preload("res://scripts/room/map_screen.gd")`,跑完 `git checkout` 还原)**:
```
✗ map_nav ↔ map_screen(成环)/ ✗ map_screen ↔ map_nav(成环)/ RESULT=FAIL(2 处)
```
护栏**非空过**(正反两测均如预期)。**职责项**(一功能一文件)由既有 `tools/verify_one_job_per_file.py` 把关,本件不重复。
**行数(仅记录,不作判据)**:`map_nav` 97/`map_data` 167/`map_render` 62/`map_screen` 267 行。
### TASK-MAP-WALK (2026-10-02 02:15:43)
# TASK-MAP-WALK · 四层地图真机验收(MAP-01/02/03/04/07 · **已收口**)
**日期**:2026-10-02 01:20-02:05 | **包**:1.0.356(真机 `R3CR704Q72V`,真屏 display 3 `4630947232161729155`)
**工具**:`tools/qa_map_walk.sh`(三层取图 + 切换)、`tools/qa_map_back_ab.sh`(退层 + 开关 A/B)、`tools/map_shot_metrics.py`(量图)
**驱动**:cfg 通道 `MAP_QA_LAYER` / `MAP_QA_STEPS`(`jump|back|down|layer:N`)——**不用 Params**:安卓上 `user://` 是应用私有目录,推参数够不着(技能 §8 实测),故把自检接到**外部 kushan.cfg**(与 `AUTO_ENTER`/`TRADE_QA_SAY` 同一条)。
## 关键读数(原始输出)
**MAP-01 全屏不裁切**(`tools/map_shot_metrics.py`,基准 `map.safe_px=24`):
```
L1.png (960,2616) 四边留白={'左':32,'右':33,'上':32,'下':1457} 内容带=7 均亮=22.7 ⇒ 四边留白达标
L2.png (960,2616) 四边留白={'左':32,'右':33,'上':32,'下':1721} 内容带=8 均亮=22.2 ⇒ 四边留白达标
L3.png (960,2616) 四边留白={'左':32,'右':33,'上':32,'下':1997} 内容带=6 均亮=20.6 ⇒ 四边留白达标
```
机身实测:`mDisplayCutout insets=Rect(0,0-960,93)`(顶部挖孔带 93px)、`navigationBars mFrame=[0,2490][960,2616]`;**两条系统栏在本 App 内 `mVisible=false`**(沉浸)⇒ 地图内容(上边距 32px、底边距 ≥1457px)既不压系统栏也不进挖孔带。
**MAP-02 四层可进可退**(同一跑内,层号 1→2→3;`back` 两步 3→2→1):
```
KUSHAN_MAP_LAYER 落层 want=1(回总图) KUSHAN_MAP_QA 落层 want=1 now=1
KUSHAN_MAP_LAYER 落层 want=2 lid=2 rid=0 ok=true KUSHAN_MAP_QA 落层 want=2 now=2
KUSHAN_MAP_LAYER 落层 want=3 lid=2 rid=100 ok=true KUSHAN_MAP_QA 落层 want=3 now=3
KUSHAN_MAP_BLOCKS L1 rooms=287 locs=10 blocks=10 key0_type=4
KUSHAN_MAP_BLOCKS L2 lid=2
KUSHAN_MAP_QA step=1 cmd=back 前层=3 / KUSHAN_MAP_BACK ok=true 层后=2
KUSHAN_MAP_QA step=2 cmd=back 前层=2 / KUSHAN_MAP_BACK ok=true 层后=1
```
三层截图 **md5 互不相同**(`b20e4c78` / `ac64a08a` / `6aa265f1`)= 视图真的随层变了。
**MAP-03 总图⇄场景切换**(点两次「切换」= 调按钮同一函数 `_on_jump`):
```
step=1 cmd=jump 前层=2 / KUSHAN_MAP_JUMP 层前=2 / step=1 cmd=jump 后层=1
step=2 cmd=jump 前层=1 / KUSHAN_MAP_JUMP 层前=1 / step=2 cmd=jump 后层=1 ← 第二次无效(见 B-072)
```
帧序列 `J2=b20e4c78(L1) / J3=ac64a08a(L2) / J4..J6=b20e4c78(L1)` = 同一次运行里两种视图都拍到。
**MAP-04 三层画法一致**:三层内容带 7/8/6、均由同一 `map_render` 模块出图(`show_tiles`/`show_rows` 同一套块状画法,代码同一处),三层截图各具(见上 md5)。
**MAP-07 可回退**(同一包,只改 cfg):
```
abA_开关关.png md5=bb8fc1b6 四边留白={'左':0,'右':1,'上':0,'下':1} 均亮=25.0(世界视图)
### TASK-MAP-05-06 (2026-10-02 00:06:35)
# TASK-MAP-05-06 · 地图线两项评测(**已收口**)
**日期**:2026-10-02 00:05-00:15 | 来源:68 号 §补录十九(四层地图)
## MAP-05 · 客户端 L3 楼栋房间集合 == `tools/map_building.py` 同栋集合
**口径**:抽样 10 栋**比集合**(脚本),不看截图。**本脚本比全部 67 栋**(比抽样更强),抽样 10 栋逐条打印。
**新护栏** `tools/verify_map_building_rooms.py`(自动纳入全量):
- **从客户端源码真读**判据:正则取 `scripts/room/map_data.gd` 的 `const STREET_TYPES := [...]`
(不另抄一份,否则护栏自己就是一个新的漂移源);
- 字尾表从 **params** 读:`map.tail_street`/`map.tail_inner`(`data/params.json` 的 `params` 袋内,点号键);
- 按**客户端判据**重算(街面=type ∈ 表 或 名字 `·` 后段以字尾结尾;楼内=type==interior 且名字不以街面字结尾,
无 type 时客户端另有 `tail_inner` 兜底——本脚本照抄);再与工具 `map_building.buildings()` 比集合。