版本 1.0.411 开发日志

构建 1.0.411(code 411)· 2026-10-04 21:39:58 · sha256 176c290fa101f6ad…

下载:公网 · Tailscale · 局域网

开发日志(本轮摘要)

# 贵霜帝国 · 内网开发版 · 本轮开发记录

生成时间:2026-10-04 21:35:11 | 本包:kushan-1.0.411.apk(1.0.411 / code 411,sha256 176c290fa101f6ad…)

## 最近开发任务证据(evidence/*/readme.md,新→旧,取 10 份)

### TASK-ART-ROSTER  (2026-10-04 20:49:49)

# 口径说明 · 323 人 NPC 相片槽位排产表

生成时间:2026-10-04 20:49:49 | 仓库:`/mnt/data2/home_czdcc/kushan_main`

本目录交付件:

| 文件 | 用途 |
|---|---|
| `roster.md` | 人读排产表,按优先级分三节列出全部 323 人 |
| `roster.csv` | 机器可读版,UTF-8 带表头,一 NPC 一行 |
| `readme.md` | 本文件,口径说明 |
| `_roster_data.json` | 生成中间件(全量行 + 汇总),供下游程序消费 |

## 1. 任务口径

- 画风取 **甲案**:沿用犍陀罗写实油画(不换画风、不重炼风格)。
- 老图 **646 张不重出**;本表只排「缺失槽位」的新增出图。
- 覆盖全库 **323** 名 NPC(`characters.type='npc'`)。
- **甲案的代价**(须知悉):老图沿用,与「本作自定画风」新线**不同源**,将来短片/场景图接起来会有风格落差;好处是零重出成本、已认过的脸不变、老图整份留档可回退。

## 2. 数据真源(全部只读;生成脚本不含任何硬编码数值)

| 口径 | 真源 |
|---|---|
| 每人槽位/档位 | `data/npc_photo_slots.json`(`character_rank.tier` 落档结果,323 行) |
| 槽位与张数规则 | `data/npc_performance.json` → `photos.count_by_tier`(low/mid/high = 2/3/5) |
| 身份档位落档表 | `data/npc_rank_map.json`(title → tier 1–10) |
| 装扮档位映射 | `data/params.json` → 键 `dress.tier_from_status` / `dress.max_tier` |
| 归属房间/聚落、身份 | `kushan` 库:`characters` / `rooms` / `locations` |
| 剧情挂靠 | `kushan` 库:`quest_chains.entry_npc_id` / `quest_templates.giver_id`(`active=1`) |
| 现有老图 | `/srv/fileshare/kushan_photos/`(对外前缀 `/kushan_photos/`) |
| 逐人出图 prompt | `data/npc_prompts_full.json`(323 条;出图时拼 `[风格块] + [本人 prompt] + [负向禁性表]`) |

取库凭据一律走仓内唯一通道 `bash tools/query_kushan.sh "<SQL>"`——脚本**不连库、不内嵌口令**。

## 3. 槽位与张数规则(按身份档 → 2/3/5 张)

| 带 | 身份档位 | 每人槽位 | 张数 | 已有 | 缺口/人 |
|---|---|---|---|---|---|
| low | 1–3 | avatar, full | 2 | 2 | 0 |

### TASK-D13  (2026-10-04 20:39:58)

# TASK-D13 · 装扮规则链「随规则变」取证

判据(68 号 D-13):同一房间换主人规则后,立绘装扮随之改变 | 改前/改后两张并排截图。

## 复跑命令(原始命令,可重放)

渲染入口:`--render-panel npccard:<cid> --render-output <绝对路径>.png`。
坑一:`--headless` 直跑 `save_png` 返回 **err=-1**(不出图),必须 `xvfb-run`。
坑二:注入 JSON 的 mode 键必须是 `dress_tier.gd` 的 `MODE_INNER` 值 **`inner`**(不是 `interior`),否则静默回落世界默认。

```bash
export HOME=/home/czdcc
export KUSHAN_QA_CHAIN=l1          # 走 L1 主语链;改前留空
export KUSHAN_QA_OWNER_JSON='{"inner":{"xiangfei_tier":5}}'   # 改后;改前不设
export KUSHAN_DRESS_DUMP=1
G="/mnt/data2/home_czdcc/贵霜帝国/godot/Godot_v4.7.2-stable_linux.x86_64"
xvfb-run -a "$G" --path /home/czdcc/kushan_main -- \
  --render-panel npccard:10 --render-output /home/czdcc/kushan_main/evidence/TASK-D13/card_cid10_after.png
```

同 cid=10(房间 6,rtype=interior)、同一张卡、同一次渲染入口,只改「场所主人规矩」注入。

## 自报原文(主证)

改前(无注入):
```
KUSHAN_DRESS cid=10 rtype=interior tier=4 source=world by=世界默认 qa=l1
text=内室(家内/内院)(隐秘(深宫禁锢):蒙眼睛·勒嘴(封口)·双手在后(背缚 + 腕链)·双手合十被反绑)(依 世界默认)
```

改后(注入 L1 主人规矩 tier=5):
```
KUSHAN_DRESS cid=10 rtype=interior tier=5 source=owner by=本场所主人规矩 qa=l1
text=内室(家内/内院)(顶点(图腾):完全禁锢组合:蒙眼 + 勒嘴 + 反绑 · 完整徽章:乳环 + 肚脐红宝石 + 双金链 + 束腰带)(依 本场所主人规矩)
```

⇒ **规则链层「随规则变」成立**:tier 4→5、source world→owner、by 与依据行、装束文本全部随注入改变。

## 未达部分(如实记,不遮掩)


### TASK-CINE-PACK  (2026-10-03 01:39:43)

# B-078 资源包化:过场片移出 APK、按需下载(用户令 2026-10-02「视频丢到资源包」)

## 现状摸底(本轮实测)
- 包内片源:`assets/cine/*.ogv`(15 个文件,仓内 41MB;APK 内约 **20MB**:`21_first.ogv` 4.5MB、`25_first` 4.4MB、`23_first` 3.7MB、`1_first` 3.1MB、`37_first` 2.8MB…)。
- 取件机制**已具备一半**:`scripts/cine_lib.gd` 与立绘同款 —— `user://cine/` 缓存 + 在线清单 `user://cine/index.json` + **包内目录兜底**(`resolve()`:本地缓存 → 包内;网络归 net 层,本模块不碰网络)。
- 导出排除表**已有先例**:`export_presets.cfg` 的 `exclude_filter` 里已排除 `assets/portraits/*`,**但没排 `assets/cine/*`** ⇒ 这是「移出 APK」那一步的落点。
- **缺的那一半**:立绘有下载器(`scripts/room/portrait_fetch.gd`、`profile_view.gd`、`npc_panel.gd` 调 `PL.save_disk`),**过场片没有下载器**(`cine_player.gd` 只调 `CL.resolve()`)。
- 托管落点现成:nw 站的 `/files/`(203 站点目录 `/mnt/data2/www/wwwroot/kushan-nw/files/` → 公网 `https://nw.tripee.cn/files/`、Tailscale `http://100.127.177.38:8088/files/`、局域网 `http://192.168.50.203:8088/files/`),镜像到云机 `/srv/kushan-files/`。
- 相关参数:`cine.online_base`(**当前为空**)、`cine.ext=.ogv`、`cine.cache_max_mb=64`。

## 实施方案(按 107 号 S0→S8,一功能一文件)
1. 新增 `scripts/room/cine_fetch.gd`(对照 `room/portrait_fetch.gd`):按 `cine.online_base` 拉 `index.json` → 按名拉 `.ogv` → `CL.save_index()`/`CL.save_disk()`;三基址候选(公网/Tailscale/局域网)照 `net_endpoints` 口径。
2. `cine_player.gd` 在 `CL.resolve()` 返空且 `CL.index_has()` 为真时调取件(**只补取件调用,不改播放逻辑**)。
3. 上传:`assets/cine/*.ogv` → `/files/cine/`(203 本地 + 云机镜像),并生成 `/files/cine/index.json`(名→大小/sha256)。
4. `data/params.json` 置 `cine.online_base`(三链取一,仍受「外网口径待人拍板」约束 ⇒ 先写内网基址,公网基址随更新通道一并拍板)。
5. `export_presets.cfg` 在 `exclude_filter` 追加 `assets/cine/*`。
6. 出包(预期 APK ≈131.8MB → **≈112MB**,即减掉片源那约 20MB)+真机验:**无缓存时能下载并播放**、**断网时优雅降级**(不卡死、不报脚本错)、再次进入离线可播。
7. 护栏:新增 `tools/verify_cine_pack.py` —— ① 排除表必须含 `assets/cine/*`;② 仓内片源与远端清单逐条对齐(数量/大小);③ `cine.online_base` 非空且与 `tools/hosts.sh` 口径一致。

## 本轮边界
- **未动任何片源与排除表**:在「下载器」落地前把包内兜底删掉=过场直接失播 ⇒ 先补取件、再拆包,顺序不能反(本轮只立项+摸底,未见红)。

## 1.0.389 重出(排除表改走参数)

## 1.0.389 出包与真机(本轮收尾)
- APK:**112721647 字节**(改前 1.0.388=131846522);包内 `\.ogv` 条目=**0**、`assets/cine/` 条目=0
- 资源包:203 站点 5 片+index.json(18.6MB),云机镜像 6 文件;三链回读 200(公网/Tailscale/局域网)
- 真机 `[Cine] got` 命中=0(清端上 `files/cine` 缓存后跑)
- 护栏:`python3 tools/verify_cine_pack.py` ⇒ PASS 4 FAIL 0;全量 `run_verify_all.sh` ⇒ PASS 96 FAIL 0
- **真因**:[1/6] 备份 preset+params、把签名库路径替换成本机路径、注入排除过滤表(版本=standard)
  已把 pack.edition 设为 standard,排除表 assets/portraits/*,evidence/*,docs/*,tasks/*,tools/*,data/private/*,edition/*,dist/*,addons/gut/*,kushan_db/*,backup_archive/*,tests/*,release/*,instances/*,_cl_/*,.venv/*,*.md,*.py,*.sh,*.sql,*.log,assets/cine/*
  已替换 keystore/release 与 keystore/debug
  exclude_filter=assets/portraits/*,evidence/*,docs/*,tasks/*,tools/*,data/private/*,edition/*,dist/*,addons/gut/*,kushan_db/*,backup_archive/*,tests/*,release/*,instances/*,_cl_/*,.venv/*,*.md,*.py,*.sh,*.sql,*.log,assets/cine/*(22 条)
  package/unique_name=com.kushan.dynasty
  应用名=贵霜帝国(出包后还原 project.godot)
[2/6] 装配原生插件(真源 android_plugins/ → 构建模板 android/build/;幂等)