这个项目能做什么
Sprawl//Run 是一款基于 Flutter 的 Android 应用,将跑步包装成赛博朋克快递员故事。它面向想要叙事激励而非配速表格的人,并且设计为完全离线运行。
故事与结构
两个战役包含二十个 GPS 追踪任务。Sprawl Prime 是起始战役;完成后解锁 Null Tide。每个任务前你选择目标——时间或距离——故事会按你选择的目标调整节奏。达到目标即完成任务;提前停止则失败,任务保持开放,你可以随时重试。超过目标仍然有效,并会触发额外的调度员对话。
追逐是核心机制:在某些任务中,有东西在追你,你只有有限的时间窗口逃脱。所需努力根据你过去三分钟的配速调整,而非设计师固定的数值,因此无论跑步速度如何都是真实努力,且永远不会不可能。追逐可以完全关闭,同时保留故事。
九名角色由设备端语音合成配音,README 称战役包含 492 行对话。四十条目的法典只有在角色实际提及某条目后才会解锁,因此它记录的是你被告知的内容,而非可提前阅读的 wiki。可选的调度员提醒和可选的跑间“信号噪声”消息可以启用,后者绝不会在夜间触发。
追踪与指标
GPS 追踪在屏幕关闭时继续,并包含自动暂停。实时 HUD 显示距离、配速、已用时间、目标环和追逐条。卡路里根据 ACSM 代谢方程和你的体重计算。路线从存储的 GPS 数据绘制为霓虹轨迹,并可按你实际跑过的配速回放。应用刻意省略地图,因为地图瓦片需要网络。
进度
每周和每月摘要可以回退到你的第一次跑步。长期历史显示每月距离,以及点阵日历,其中每个月的亮度由你跑了多远决定。六十项成就跨越六个类别和四个层级,进度从跑步日志重新计算,而非存储为计数器。连续记录使用你自定义的每周承诺(分钟、公里或任务),仍在进行中的一周永远不会中断连续记录。
数据所有权
设置 → 数据将个人资料、战役进度、成就、法典以及每次跑步及其 GPS 轨迹导出为单个纯 JSON 文件,交给系统分享面板。导入可以替换设备(干净恢复)或合并,只添加缺失的内容,因此旧备份无法重新锁定任务。两个方向都不使用存储权限。单次跑步可以导出为 GPX 1.1 轨迹,供 OsmAnd、Strava 或 Komoot 等应用使用。
音频
来自其他播放器的音乐会在传输时降低音量,如果播放器行为异常则恢复。当你没有带音乐时,可选的环境合成音床可用。语速和效果音量可调,故事语音可以静音。
隐私与权限
README 在此异常明确。没有 INTERNET 权限,没有账户,没有广告,没有分析,也没有 Google Play Services;应用模块排除了 com.google.android.gms 组,并强制使用 AOSP LocationManager。屏幕关闭时追踪使用前台服务而非 ACCESS_BACKGROUND_LOCATION,持续通知是应用显示的唯一通知。README 还指出 android:allowBackup 保持 Android 默认值 true,因此如果启用设备备份,操作系统备份代理可能会将跑步日志复制到用户的 Google 账户——应用本身从不这样做。两个权限间接引入:通过 ExoPlayer/just_audio 的 ACCESS_NETWORK_STATE,以及来自 share_plus 的自定义动态接收器权限。
技术说明
使用 Flutter 3.44.8 / Dart 3.12 构建,Android 优先,iOS 脚手架已存在。构建需要 JDK 17。需要 NDK,因为 path_provider_android 拉入 package:jni。跑步引擎通过注入获取位置源、叙述者和时钟,这允许在毫秒内针对合成 GPS 测试整个任务;README 报告 228 项测试和干净的 flutter analyze。音效、启动器图标和 README 截图均由 tool/ 中的脚本生成,截图工具使用种子数据驱动真实小部件。
任务包是单个 JSON 文件,放入应用文档目录下的 sprawlrun/mission_packs/,并从设置中重新加载,无需重新构建。应用代码为 MIT;捆绑字体(Orbitron、Rajdhani、Share Tech Mono)为 SIL OFL 1.1。
评论
0 人表达喜爱 · 满10人后显示 Deer Point
登录后参与讨论。