选一个游戏(彩虹六号 / 英雄联盟 / 塔科夫),开始专注计时。计时器会把你实际 专注的时长按该游戏"一局"的平均时长换算成"打了几局",每打完一局,日志里就 会出现一条你在那一局里遇到并忍住没有爆发的红温事件——你既完成了手头的 正事,又在叙事里"全须全尾"地打完了一局游戏。
本项目基于开源项目 recoskyler/pomo (MIT License)二次开发,保留了原有的计时器内核(Flutter + bloc),在此之上 叠加了游戏选择、局数换算和红温事件日志。跨平台支持沿用原项目:iOS / Android / macOS / Windows / Linux / Web。
lib/pages/game/ 游戏选择、局数换算、事件日志(新增模块)
data/game_info.dart 三个游戏的配置(局名、平均时长、素材路径)
data/game_event_repository.dart 从 assets/game_events/*.json 读取事件池
cubit/game_cubit.dart 核心状态机:累计专注时长 → 局数 → 抽取事件
view/ 游戏选择页 / 组合后的计时器主页 / 事件日志列表
assets/game_events/ 每个游戏的红温事件文案库(JSON,随时可扩充)
r6.json / lol.json / tarkov.json
lib/pages/timer/ 原 pomo 项目的计时器内核,未改动,被 game 模块复用
lib/pages/settings/ 原 pomo 项目的设置页(音效/主题/webhook),未改动
scripts/generate_events.py 仅供你本地开发时使用的内容生成脚本(见下)
这台机器上还没有装 Flutter SDK,所以我没法在这里直接编译/跑起来验证 UI, 请你本地装好 Flutter 后自行验证:
flutter pub get
flutter run -d windows # 或 -d chrome / -d macosiOS 需要在 Mac 上用 Xcode 打开 ios/Runner.xcworkspace 构建(Windows 上
无法构建 iOS,这是 Apple 的限制,不是本项目的限制)。
首次运行如果 flutter analyze 报错,大概率是我手写的 lib/pages/game/
下的代码有细节没对齐这台机器上没装的 Flutter 版本的 API,把报错贴给我,我
可以照着修。
scripts/generate_events.py 是给你自己写内容用的命令行工具:你随手输入一段
真实/虚构的"红温事件"描述,它调用 Claude API 把这段描述改写成符合目标游戏
黑话和场景的一句话文案,并直接写回 assets/game_events/<game>.json,下次
打包 App 时这些新事件就会随 App 一起发布。
pip install -r scripts/requirements.txt
export ANTHROPIC_API_KEY=sk-... # Windows PowerShell: $env:ANTHROPIC_API_KEY="sk-..."
python scripts/generate_events.py \
"在OW里打了排位,遇到了非常喜欢压力人的C,他的数据最差但是开始喷奶和喷T,
引发了对队大吵架,而你在下一局遇到了他在对面" \
--games r6 lol tarkov
python scripts/generate_events.py --list # 查看每个游戏当前有多少条
python scripts/generate_events.py "..." --dry-run # 只预览,不写入文件每条写入的事件除了 text(AI 改写后的正式文案),还会原样存一份你写的
original(你的原话)在同一条记录里,方便你以后回头对比"我当时怎么说
的" vs "AI 改成了什么样",从而校准自己的语气。手动改 JSON 时也建议照这个
习惯来:
{"id": "ow_001", "severity": 1, "original": "你原话怎么说的", "text": "AI/你自己改写后的正式文案"}original 是可选字段,App 运行时不会读取或展示它,纯粹是给你自己留档用的。
- 目前只支持三个游戏,
GameInfo.all(lib/pages/game/data/game_info.dart) 里加一条配置 + 一个assets/game_events/<id>.json就能加新游戏。 - 局数换算是纯除法(专注秒数 ÷ 平均一局秒数),没有考虑"半局"之类的过渡态。
- 事件抽取目前是简单的不放回抽样+打乱重抽,没有做"最近抽过的不再抽"之外 更复杂的权重逻辑。