TOS 开发周记 27:给数据库种子流程收尾

本文根据 2026-04-13 至 2026-04-19 的 Git 提交补记。

补齐导入数据的时间字段

这周继续收尾数据库初始化流程。后端给怪物掉落、区域、道路和地图格等模型或生成结果补上缺失的 createdAtupdatedAt,同时调整城市与区域生成器,使导入后的基础数据保持一致的数据结构。仓库也加入了拆分后的内容种子与区域种子文件,替代上一阶段更笼统的种子包。

修正并发导入的次序

setupdb 的导入流程还有一个并发问题:原先多个 seed 导入可以同时启动,而它们之间并非完全独立。修正提交给这段流程补上等待,使前一个导入完成后再进入后续步骤。这里只记录代码层面的次序修正,不据此推断当时完整初始化已经跑通。

客户端本周没有继续加功能,只重新生成了 Godot 项目配置与翻译导入产物,让资源状态跟当前工程保持一致。整个星期更像是上一轮数据库工具改造后的整理:补字段、换种子、收紧导入顺序,再同步一次客户端生成文件。

提交记录

日期 仓库 提交 原始说明
2026-04-17 后端 5c56462 feat: add missing createdAt and updatedAt
2026-04-17 后端 e08af88 db: add new seeds
2026-04-17 后端 f3e891e fix: concurrence issue when importing
2026-04-17 客户端 87b6f40 chore: regenerate Godot project and translation imports

TOS 开发周记 26:背包拖放、快捷栏与数据库初始化

本文根据 2026-04-06 至 2026-04-12 的 Git 提交补记。

背包改成拖放交互

这周我重做了背包操作。原先“点来源、点目标、再确认”的流程被替换为拖放:按住有物品的格子,超过移动阈值后显示拖动影子,松开时判断落在另一个背包格还是快捷栏。背包内拖放仍然调用服务端的槽位交换接口;拖到快捷栏则保存物品绑定,并在栏位上显示对应图标。

同一轮改动还接入了使用消耗品和装备武器、护甲的 API,调整了背包在快捷栏上方的位置与弹窗布局。随后又补了遮罩、网格边距和 Esc 行为:背包打开时由自己的输入逻辑处理关闭,不再保留额外的 Esc 按钮。

清理旧入口

客户端删除了已经不再使用的开始菜单脚本和场景,并清理了几份过时的 WebSocket 迁移文档。这里没有新增玩法,主要是让当前的登录、详情模式、游戏内菜单和背包路径不再与旧入口并存。

后端把可重复工作写进工具

后端新增了大量单元测试文件,覆盖 handler 参数校验、service、路由、资源 CLI、i18n 检查和生成器等区域。这里能确认的是覆盖范围被扩展了;历史提交本身不足以说明当时整套测试的运行结果。

数据库初始化也从平台脚本逐步收敛为 Go 命令:setupdb 负责组织数据库准备、迁移、地理数据导入和种子流程,geojson 命令处理地理数据,仓库同时加入新的 GeoJSON 数据文件并移除旧 seed dump。由于大文件占了绝大多数行数,本周的变更规模看起来很夸张,但核心其实是把初始化步骤集中到一条明确的命令链中。

提交记录

日期 仓库 提交 原始说明
2026-04-06 客户端 0c1b0af tidy: remove start menu
2026-04-06 客户端 d50ed9e feat: support for swaping items
2026-04-07 后端 60e71c0 test: expand backend unit coverage across handlers, services, and CLI
2026-04-07 客户端 08fd2d1 feat(client): bag panel layout, modal backdrop, grid insets
2026-04-07 客户端 8d62e80 feat: remove esc button in bag
2026-04-08 后端 3e3b948 feat: add one-key script to setup db
2026-04-09 后端 9636cdd db: update one-key script for db
2026-04-10 后端 fb3cd38 tidy
2026-04-10 客户端 f333443 tidy

TOS 开发周记 25:补齐背包数据与游戏内菜单

本文根据 2026-03-30 至 2026-04-05 的 Git 提交补记。

先让交换动作更明确

后端先为区块、战斗、经验、坐标与区域等内部工具补了一组单元测试。客户端则延续上周的背包工作:给槽位交换加上确认弹窗,并抽出纯数组交换函数,覆盖“两个物品互换”“物品移到空格”“同格不动”和非法索引等情况。这个提交保留了当时的两段式点击交互,也给后面继续改成交互更直接的拖放打下了基础。

背包条目带回完整物品信息

后端这周修正了背包数据的装载方式:查询用户物品时会一并带回对应的 DropItem,同时增加孤立背包记录的检查逻辑。地图工具也扩展了地面掉落物的生成与查询入口,资源 CLI 则继续整理掉落数据。客户端据此统一处理嵌套的物品数据,补上钻石、铁剑图标和翻译,并加入一份无界面测试脚本,用来核对 ITEM_* 翻译键、描述键与图标文件之间的对应关系。

Esc 开始有游戏内含义

另一项独立改动是游戏内菜单。客户端新增暂停菜单、设置页和按键绑定页面,详情模式下的 Esc 会在没有其他弹窗占用时打开菜单;背包、地面物品调试和攻击等动作也有了集中保存的键位配置。

这周一边补数据完整性,一边整理玩家能直接触碰的入口。背包从“有格子”继续走向“每个格子都能说明自己是什么”,游戏内菜单也开始承担统一的交互出口。

提交记录

日期 仓库 提交 原始说明
2026-03-30 后端 295dfe1 test: add internal utils coverage
2026-03-30 客户端 5d696df feat: confirm bag slot swaps
2026-04-04 后端 99696ba Inventory: hydrate DropItem, orphan listing, drops and map tooling
2026-04-04 客户端 54cff88 Bag: item icons, translations, and headless i18n icon test
2026-04-04 客户端 824a67f feat: add ingame_menu_modal

TOS 开发周记 24:背包槽位由服务端说了算

本文根据 2026-03-23 至 2026-03-29 的 Git 提交补记。

交换背包,不只交换画面

这周的主题很单一:让背包槽位真正成为持久数据。后端给用户物品加入槽位索引,并新增 /bag/swap 接口。交换过程由服务端校验槽位、在事务中更新记录,再返回按槽位排列的最新背包内容;掉落物进入背包时也会寻找可用槽位,而不是只追加一条没有位置的数据。

客户端相应地把固定的 36 个格子映射到 slotIndex。玩家先选中来源格,再选择目标格,客户端把两个索引提交给后端;成功后直接采用响应中的物品列表,失败时则重新拉取背包。这意味着画面不再先自行交换、稍后才期待数据库跟上,最终状态以服务端返回为准。

迁移中的小修正

周初两个 tmp 提交分别调整了怪物掉落模型和详情地图中的掉落显示,为后面的槽位持久化清理了数据形态。提交不多,但这一周把一个容易停留在 UI 层的小功能,接成了完整的客户端—接口—数据库流程。

提交记录

日期 仓库 提交 原始说明
2026-03-23 后端 6735a4c tmp
2026-03-23 客户端 bff7645 tmp
2026-03-26 后端 400b6e0 feat: persist bag slot swaps with server authority
2026-03-26 客户端 2b26bec feat: apply server-authoritative bag swap updates

TOS 开发周记 23:让地图资源形成闭环

本文根据 2026-03-16 至 2026-03-22 的 Git 提交补记。

从数据库定义到画面图标

这周围绕怪物、掉落物和场景物件做了一轮集中补全。后端给掉落物生成器增加图标映射,并陆续加入金币、更多怪物及其掉落配置;客户端则让背包和详情地图按后端返回的掉落物信息加载图标。怪物与物品素材也统一整理为 SVG,并补充了一批新的动物素材。

这里最重要的不是素材数量,而是链路开始连起来:后端种子数据保存名称 key 和图标标识,客户端用同一标识寻找资源,再用翻译表决定展示文字。详情地图、背包和信息弹窗因此不必各自维护一套名称与图片映射。

给资源数据加一道检查

资源变多以后,手工确认很快就不可靠了。后端把分散的 monsters、props 命令逐步合并进 assets CLI,并加入怪物、掉落物、地形类型、素材文件存在性以及 i18n key 的检查;同时保留列表与生成入口,方便直接查看数据库里的内容。几次新增、合并、再清理的提交,记录了这个 CLI 从分散命令收拢为统一工具的过程。

地形与背包继续收尾

客户端移除了详情地图的地形兜底分支,遇到空格时改为明确断言;随后增加程序化生成 4×4 草地区域的测试场景,并修正详情模式的 TerrainSet 绘制。背包这边调整了图标尺寸、tooltip 和版面,也把 prop 与掉落物渲染接入现有界面。

这周改动很多,但主题其实很集中:让一份资源数据能被生成、检查、传输并最终显示,而不是只在某一端“看起来已经有了”。

提交记录

日期 仓库 提交 原始说明
2026-03-16 后端 a2f783d feat: add icon mapping to drop generator
2026-03-16 后端 e2c12bb fix: monster density
2026-03-16 客户端 b3b97fe feat: render bag items with DropItem icons
2026-03-16 客户端 f89e7e9 fix: i18n in tile info modal
2026-03-17 客户端 2d1dd95 fix: i18n in bag
2026-03-18 后端 21bf1c5 feat: unify assets CLI
2026-03-18 后端 610d712 feat: list monsters in cli
2026-03-18 后端 7a80dc4 feat: add props CLI and asset existence checks
2026-03-18 后端 9607166 feat: add verify CLI, dirt terrain, and terrain-types
2026-03-18 客户端 807e379 feat: render props from asset files
2026-03-18 客户端 e26544d refactor: remove terrain fallback, assert on empty cells
2026-03-19 后端 1153d63 tidy: clean assets cli
2026-03-19 后端 ddc6234 feat: cli for drop items
2026-03-19 后端 e7399e9 feat: add gold
2026-03-19 客户端 7b474bf feat: render drops in detail mode
2026-03-19 客户端 905641e doc: update image
2026-03-20 后端 0ecefb1 feat: more monsters
2026-03-20 客户端 817a13c art
2026-03-20 客户端 f4f1c4b fix: bag icon size
2026-03-21 后端 7ffdb7c feat: update cli
2026-03-21 客户端 c9fb8c5 feat: updatet bag
2026-03-22 客户端 5c5be07 feat: add grass_4x4 programmtically
2026-03-22 客户端 a1e7fd1 fix: terrain in detail mode

TOS 开发周记 22:把场景物件与多语言接起来

本文根据 2026-03-09 至 2026-03-15 的 Git 提交补记。

地图不再只有地表

上周后端已经能生成树、岩石和灌木,这周继续把 prop 的传输链路补齐。Tile 模型明确区分 terrainprop,prop 自己带有状态字段;玩家进入区块时,后端会把该区块的物件通过地图消息发给客户端。客户端增加相应的事件处理,在详情地图上创建并显示这些物件。

这次改动让我把“地形是什么”和“地形上放着什么”分成了两层。前者由 TerrainSet 绘制,后者来自服务端数据,之后扩展场景内容时不必继续把所有东西塞进地表格子。

名称交给翻译表

另一条线是背包和怪物名称的本地化。后端生成掉落物和怪物时,不再保存直接展示的英文名,而是保存 ITEM_*MONSTER_* 这类 i18n key;客户端收到数据后,再通过翻译表显示名称与描述。背包面板、目标信息和相关翻译条目一起完成了调整。

其余提交主要是 README 与初始化文档整理。整体上,这周提交量不大,但客户端与后端对“展示名称只是 key”的约定已经形成,后续新增内容可以沿用同一条数据链。

提交记录

日期 仓库 提交 原始说明
2026-03-11 后端 813e2bf feat: add props
2026-03-11 后端 bd7870d doc: update readme
2026-03-11 客户端 41b767e feat: show props
2026-03-11 客户端 60996a2 doc: update readme
2026-03-12 后端 5ac83bc doc
2026-03-12 后端 629d877 chore: store i18n keys for drops and monsters
2026-03-12 客户端 7f77cf2 feat: localize inventory and monster names

TOS 开发周记 21:地图从六边形转向方格

本文根据 2026-03-02 至 2026-03-08 的 Git 提交补记。

坐标系一起换掉

这是一次跨客户端和后端的地图改造。后端先把 Tile、玩家、怪物和据点等位置字段从六边形轴坐标 q/r 改为方格坐标 x/y,邻接关系改为上下左右四个方向,距离计算也改为方格使用的方式。客户端随后加入 SquareTileMapLayer,并把详情地图、事件数据和坐标转换逐步切到方格实现。

这类修改不能只换渲染。地图接口也同步调整:后端增加区域概览接口,返回区块边界、格子尺度等信息;区块查询最终改为直接接收 chunkX/chunkY。客户端的详情模式则开始读取概览和分块数据,用前两周生成的 TerrainSet 绘制方格地形。中间几个 tmp 提交保留了迁移过程,说明这一周并不是一次性替换,而是在接口与画面之间来回对齐。

收拢客户端请求方式

地图迁移也暴露出 API 调用代码过于依赖信号连接的问题。我先把多处 connect 改成 await request_completed,随后继续精简 api_client.gd:请求节点由统一入口创建,各个接口直接等待并解析自己的响应。地图、登录、好友、据点和背包调用因此采用了更一致的写法。

世界里开始有静态物件

周末后端加入了树、岩石和灌木等 prop 的生成逻辑,把它们放在独立的数据类型中,并准备通过地图 WebSocket 消息发送给客户端。这一部分本周主要完成了数据生成和服务端通路,客户端显示会在下一周继续接上。

提交记录

日期 仓库 提交 原始说明
2026-03-02 后端 552ad98 feat: change q and r to x and y
2026-03-02 客户端 0999b43 feat: use terrain
2026-03-02 客户端 5e2bcae chore: update test
2026-03-02 客户端 85dc6c8 feat: add texture
2026-03-02 客户端 9705818 tmp: show square tile
2026-03-02 客户端 c1990d4 Add AGENTS.md with Cursor Cloud development environment instructions (#1)
2026-03-02 客户端 fff21e9 refactor: use square tile instead of hex one
2026-03-03 后端 f0258c8 feat: add /:regionId/overview
2026-03-04 后端 ddab6dd tmp
2026-03-04 后端 f5760b3 fix: /region/x endpoint
2026-03-04 客户端 d9f719a tmp
2026-03-05 客户端 d839f52 refactor: use await to replace the connect
2026-03-07 客户端 0d51b5a refactor: api_client usage
2026-03-08 后端 1d76763 feat: add props

TOS 开发周记 20:让 Wang 图块按规则生成

本文根据 2026-02-23 至 2026-03-01 的 Git 提交补记。

从“能生成”走向“能理解”

上一轮留下了 Wang 图块生成器,这周我继续把它往可维护的方向推。最先完成的是一组基础地形输出:草地、泥土、水面、海面和雪地都有各自的图块,并附带用法说明。之后生成器开始支持两种地形的组合,例如草地覆盖泥土、水面覆盖草地,而不再只处理单一材质。

更关键的调整是重新定义图块的排列顺序。自动生成的图集如果只是“机器知道第几格是什么”,后续排查会很痛苦;因此我给遮罩和图块建立了更有语义的次序,同时补了一份生成规则说明。图集资源和 Godot 的 TileSet 配置也随之重新生成,旧的临时脚本与参考图则被清理掉。

小结

这周没有碰玩法,成果主要在工具链:地形组合可以由脚本统一产出,图块顺序也不再是一串难以辨认的编号。它仍然只是客户端侧的生成与验证工作,但已经为后面把地图真正换成方格 TerrainSet 做好了准备。

提交记录

日期 仓库 提交 原始说明
2026-02-27 客户端 dcd2103 mark: seem to work properly with wang.py
2026-02-28 客户端 f549adc feat: support generate combos
2026-03-01 客户端 10fc981 feat: order tiles with meanging order

TOS 开发周记 19:从 47 格实验到 Wang 地形

本文根据 2026-02-09 至 2026-02-15 的 Git 提交补记。

先把地形拼接看清楚

这周我暂时没有继续扩展游戏流程,而是把注意力放在地形素材如何自动衔接上。第一步是在 Godot 测试场景里并排接入两套 TileSet,同时写了一个 Python 脚本生成 47 格地形图集和对应的遮罩示意图。这个版本仍然很实验性:脚本里的形状定义、生成图片和 .tres 都是为了尽快把问题摊开来看。

随后两次修正主要集中在生成器和测试场景。我增加了针对 gen-47.py 的检查,又引入 generate_wang_tiles.py,并把一部分原先塞在场景脚本里的地形修正逻辑整理到独立工具中。提交名虽然只有简单的 fix,但从改动内容看,这一轮是在反复校对图块排列、邻接遮罩与 Godot TerrainSet 配置之间的对应关系。

这一周留下的东西

这不是一个可以直接宣布“地形系统完成”的节点,更像是一次必要的制图实验。到周末,仓库里已经有可重复生成的图集、遮罩参考图、测试场景和配套脚本;下一步可以在这些基础上继续收敛规则,而不是手工猜每个边角该放哪一块。

提交记录

日期 仓库 提交 原始说明
2026-02-09 客户端 be1796d feat: add terrainset test
2026-02-10 客户端 54dbca6 fix
2026-02-10 客户端 88c815d fix: gen-47

TOS 开发周记 18:拆分界面组件,也做了一次地图原型

本文根据 2026-02-02 至 2026-02-08 的 Git 提交回补。

这周一边修实时联机事件,一边拆分客户端界面,周末还加入了一个独立的 DST 风格地图 demo。后端则继续清理迁移遗留:移除 Redis,并大幅删去旧 TypeScript 实现。

联机事件与用户接口收尾

后端修正用户加入、用户离开事件和好友 API。客户端的小修复则处理角色素材文件名中的多余点号。虽然这些提交分散,但都与上一周的角色、读档和多人地图衔接有关:角色进入或离开地图时,其他客户端依赖服务端事件更新对应玩家。

后端还修正了升级接口,改动集中在堡垒 handler、service 与路由。提交能确认的是接口逻辑被调整,无法仅据此说明具体等级规则。

把主场景里的 UI 拆出来

Godot 端新增 player_info_container,把玩家信息相关场景与脚本集中起来;tile 信息弹窗也从主场景分离。目标信息随后通过 EventBus 解耦,聊天容器则修正焦点问题。

这些改动没有增加新的战斗规则,但把玩家、地块、目标和聊天四类界面的职责分开。主场景不必再直接承载所有 UI 状态,后续调整单个面板时也更容易看清事件入口。

一个独立的 DST 地图 demo

周末新增 scenes/demo_dst,包含地图生成、玩家、UI 与独立场景,并修正角色旋转表现。从目录与 README 来看,它是一套单独运行的原型,不应写成主地图系统已经切换。更准确地说,这是在现有项目旁边试验另一种地图生成与交互方式。

后端清理旧栈

Go 后端移除了 Redis 相关配置和依赖。CLI 更新则加入 Go 侧工具,并删除大批旧 TypeScript 的实体、路由、服务、worker 与生成脚本;另有一份 seed 数据文档提交。删除量主要来自旧实现退场,不代表本周新增了同等规模的功能。

小结

这一周同时做了三类事情:修联机接缝、拆客户端界面、清后端旧代码,再额外留出一个地图原型空间。它不像前几周那样围绕单一玩法推进,却让主线代码与实验代码的边界变得更清楚。

提交记录

日期 仓库 提交 原始说明
2026-02-02 后端 3fe7b99 fix: s_user_left
2026-02-02 后端 55a4ef8 fix: EventUserJoined
2026-02-02 客户端 84fc821 fix: extra dot
2026-02-03 后端 85dece1 fix: friend api
2026-02-03 客户端 206ac3a feat: add player_info_container
2026-02-03 客户端 da758e5 feat: split off the tile_info_modal
2026-02-04 后端 d4090ac fix: level up
2026-02-04 客户端 70fffad feat: decouple target_info
2026-02-04 客户端 c7c583f fix: focus issue in chat container
2026-02-07 客户端 87b37b8 feat: add dst demo
2026-02-08 后端 0238e8c feat: remove redis
2026-02-08 后端 48edfcd cli: update cli
2026-02-08 后端 80d59e8 doc: add seed
2026-02-08 客户端 9a713ee fix: ratation in dst