游戏库是 SlimeWorks 的 Galgame / PC 游戏管理模块,从 LunaBox 项目迁移而来。支持:
lib/
pages/game_library/
home/ - 首页(最近游玩、统计卡)
library/ - 游戏列表(网格视图)
detail/ - 游戏详情(统计、编辑、启动、分类、进度 5 个 Tab)
categories/ - 分类管理
settings/ - 设置页
stats/ - 统计页
models/ - 数据模型(GameItem、PlaySession 等)
core/services/
game_library_service.dart - 业务逻辑(SharedPreferences 持久化)
game_library_metadata_api.dart - 元数据 API(Steam、VNDB、Bangumi)
game_process_tracker.dart - 游戏进程生命周期追踪 ← 新增
view_models/game_library/
game_library_library_viewmodel.dart - 游戏列表 VM
game_library_detail_viewmodel.dart - 游戏详情 VM
game_library_home_viewmodel.dart - 首页 VM
game_library_categories_viewmodel.dart
game_library_stats_viewmodel.dart
game_library_settings_viewmodel.dart
| 字段 | 类型 | 说明 |
|---|---|---|
id |
String | UUID |
name |
String | 游戏名 |
coverPath |
String | 封面路径(本地文件 or HTTP URL) |
company |
String | 开发商 |
summary |
String | 简介 |
rating |
double | 评分 (0–10) |
releaseDate |
String | 发售日期 |
path |
String | 默认启动 exe 路径 |
exePaths |
List<String> | 游戏目录下的所有顶层 exe(批量导入时填写) |
gameDir |
String | 游戏根目录(用于设置工作目录,批量导入时填写) |
status |
GameStatus | 游玩状态(未开始/游玩中/已通关/搁置/弃坑) |
totalPlayTimeSec |
int | 累计游玩秒数 |
lastPlayedAt |
DateTime? | 最近游玩时间 |
tags |
List<String> | 标签 |
批量导入 按钮选择「包含多个游戏的父目录」(如 D:\Games\),逻辑如下:
exePathspath 字段自动选当前最合适的默认 exe(优先与文件夹同名,其次文件名最短)拖拽导入同样支持此逻辑(拖入父目录时扫描子目录)。
旧逻辑直接 Process.start(path, []) 不设置工作目录,导致游戏找不到相对路径资源,报错退出。
新逻辑:
gameDir 作为工作目录File(path).parent.path(exe 所在目录)详情页「启动」Tab 展示 exePaths 列表:
path,后续一键启动使用该 exe由 GameProcessTracker(GetIt 单例)负责:
launchAndTrack() → 启动进程,记录 startTime,将 gameId 加入 runningGameIdsprocess.exitCode Future(进程退出时自动触发)GameLibraryService.addPlaySession(startTime, endTime),更新 totalPlayTimeSec 并改状态至「游玩中」状态通过 GetX RxSet<String> runningGameIds 响应式驱动,所有 Obx() 自动更新,无需手动 setState。
SharedPreferences(JSON 序列化)addPlaySession、getPlaySessionsByGameId、addGame、updateGame 等接口runningGameIds: RxSet<String> — 当前运行游戏集合(响应式)sessionSavedCount: RxInt — 每保存一次 session 自增,VM 通过 ever() 订阅触发刷新