我把基础的版本写完后(当时还是个巨大的python脚本)后面就用AI开发了,但是那个时候我刚开始用AI不太会用,AI膨胀了几千行上去,现在搞得乱七八糟,有点积重难返的味道,我最近事情比较多,我在有时间后会把整个项目梳理一遍
Dynamic Technology Tree MOD 的配套生成工具。扫描 Stellaris 本体及已启用 MOD 的科技定义与本地化,在游戏内为每个科技自动生成格式化的"科技树"描述。
⚠️ 破坏性变更:生成时现在必须选择一个 Stellaris 存档(.sav)。工具将根据存档中的帝国科技状态生成针对性的科技树描述。仅支持非铁人模式的文本存档。
- 自动扫描本体与已启用 MOD(Steam 创意工坊 + 本地 MOD)的科技数据
- 按 MOD 加载顺序合并科技定义与本地化,后加载覆盖先加载
- 可配置的显示参数(最大深度、每节点子项数、展示节点数)
- 输出 Stellaris 可直接读取的本地化
.yml文件 - 基于存档的科技树生成:读取
.sav文件,按帝国实际科技状态定制输出 - 提供 PyQt6 图形界面,选择存档后一键生成
环境要求:Python **3.10+**|目标 Stellaris 版本:v4.2.*
# 安装
python -m pip install -e .
# 启动 GUI
dtt-gui首次运行时在 GUI 中填写 Stellaris 安装路径与 MOD 目录。点击"生成"后,GUI 会弹出文件选择对话框要求选择一个 Stellaris 存档(.sav)。选择后自动开始生成,输出文件位于 ./localisation/。
注意:每次生成都需要重新选择存档。输出基于所选存档的帝国状态,重复运行会覆盖
./localisation/下的同名文件。如需保留多次生成结果,请在不同工作目录下运行。
- 仅支持非铁人模式的文本格式
.sav存档 - 铁人模式或二进制格式的存档会被拒绝,GUI 将显示错误提示
- 存档通常位于
Documents/Paradox Interactive/Stellaris/save games/
所有配置通过 JSON 格式的 settings.json 管理。不再支持 config.ini。
默认配置文件位于系统用户配置目录下:
| 平台 | 默认路径 |
|---|---|
| Linux | ~/.config/dynamic-technology-tree/settings.json |
| macOS | ~/Library/Application Support/dynamic-technology-tree/settings.json |
| Windows | %LOCALAPPDATA%\dynamic-technology-tree\settings.json |
首次启动时 GUI 会自动检测 Stellaris 路径并创建默认配置。也可以手动编辑 settings.json:
{
"schema_version": 2,
"paths": {
"base_game_path": "/path/to/Stellaris",
"mod_folder_path": "/path/to/Steam/steamapps/workshop/content/281990",
"launcher_db_path": "/path/to/launcher-v2.sqlite",
"local_mod_folder_path": ""
},
"localization": {
"target_language_code": "simp_chinese"
},
"display": {
"max_children_per_node": 12,
"max_tree_depth": 4,
"max_display_nodes": 128
}
}paths.base_game_path(必填):Stellaris 本体安装目录paths.mod_folder_path(必填):Steam 创意工坊 MOD 目录paths.launcher_db_path(必填):Paradox Launcher 数据库launcher-v2.sqlite(用于读取已启用 MOD 与加载顺序)paths.local_mod_folder_path(可选):本地 MOD 目录
提示:
launcher-v2.sqlite通常位于Documents/Paradox Interactive/Stellaris/launcher-v2.sqlite。
GUI 支持多配置文件(Profile)切换:
- 点击 Open Profile... 打开已有的
.json配置文件 - 点击 Save Profile As... 将当前配置另存为新文件
- 通过下拉框在已加载的配置文件之间切换
⚠️ 注意:.ini格式不再受支持。如果你从旧版本升级,请在 GUI 中重新配置路径并保存为settings.json。旧版配置项dlc_load_path/priority_mods已移除。
Windows .exe 必须在 Windows 上构建:
python -m venv .venv
.\.venv\Scripts\Activate.ps1
python -m pip install -e .
python -m pip install pyinstaller
pyinstaller packaging/pyinstaller/techtree_gui.spec# 安装开发依赖
python -m pip install -e ".[dev]"
# 运行测试
python -m pytest以下行为被视为稳定保证(兼容性契约),用于减少未来重构回归:
- 结果语义:生成结束会产生明确的 outcome:
success/incomplete/cancelled/error。GUI 的完成弹窗以该 outcome 为准,而不是仅凭进度条到 100%。 - 输出确定性:生成的
.yml(utf-8-sig)与dtt-save-report.txt使用 LF(\n)换行写入,确保跨平台字节一致(golden tests 依赖此行为)。 - 打包资源:wheel 安装与 Windows PyInstaller EXE 均应包含
gui/fonts/NotoSansSC-Regular.otf字体资源。
| 问题 | 解决方案 |
|---|---|
| "required configuration entries missing" | settings.json 缺少必填路径,至少需填写 paths.base_game_path、paths.mod_folder_path、paths.launcher_db_path |
| 选择存档后提示格式不支持 | 仅支持非铁人模式的文本 .sav;铁人存档或二进制格式无法解析 |
| GUI 启动但无输出文件 | 检查启动目录(或 EXE 所在目录)下是否有 localisation/ 文件夹 |
| 识别不到已启用 MOD | 检查 paths.launcher_db_path 是否指向 launcher-v2.sqlite;并确认 Paradox Launcher 中有已激活的 playset |
| "No module named 'PyQt6'" | 运行 python -m pip install -e . 安装依赖 |