프로젝트 소개

Sprawl//Run은 달리기를 사이버펑크 택배원 스토리로 구성하는 Flutter 기반 Android 앱입니다. 구간 기록표보다 서사적 동기를 원하는 사람들을 위해 만들어졌으며 완전히 오프라인으로 작동하도록 설계되었습니다. 스토리 및 구조 두 개의 캠페인에는 20개의 GPS 추적 미션이 포함되어 있습니다. Sprawl Prime이 시작 캠페인이며, 완료하면 Null Tide가 열립니다. 각 미션 전에 시간 또는 거리 목표를 선택하며, 스토리는 선택한 목표에 맞춰 진행됩니다. 목표를 달성하면 작전이 완료되고, 미달하면 실패하여 미션이 열린 상태로 남아 언제든지 재시도할 수 있습니다. 목표를 초과해 달려도 인정되며 추가 핸들러 대사가 트리거됩니다. 추격전은 핵심 메커니즘입니다. 특정 미션 중 무언가가 당신을 쫓으며 제한된 시간 안에 탈출해야 합니다. 필요한 노력은 고정된 설계 값이 아닌 지난 3분간의 자신의 페이스에 맞춰 조정되므로, 어떤 속도로 달려도 실제 노력이 필요하며 불가능하지 않습니다. 추격전은 스토리를 유지한 채 완전히 끌 수 있습니다. 9명의 캐릭터는 기기 내 음성 합성으로 목소리가 제공되며, README에는 캠페인에 492줄의 대사가 포함되어 있다고 명시되어 있습니다. 40개 항목의 코덱스는 캐릭터가 실제로 언급한 후에만 잠금 해제되므로, 미리 읽는 위키가 아닌 들은 내용을 기록합니다. 선택적 핸들러 알림과 선택적 러닝 사이 '신호 잡음' 메시지를 활성화할 수 있으며, 후자는 밤새 절대 발생하지 않습니다. 추적 및 지표 GPS 추적은 화면이 꺼진 상태에서도 계속되며 자동 일시정지를 포함합니다. 실시간 HUD에는 거리, 페이스, 경과 시간, 목표 링 및 추격 막대가 표시됩니다. 칼로리는 ACSM 대사 방정식과 체중을 기반으로 계산됩니다. 경로는 저장된 GPS 데이터에서 네온 트레이스로 그려지며 실제 달린 페이스로 재생할 수 있습니다. 지도 타일은 네트워크가 필요하므로 앱은 의도적으로 지도를 생략합니다. 진행 상황 주간 및 월간 요약은 첫 달리기까지 거슬러 볼 수 있습니다. 장기 기록에는 월별 거리와 각 월의 달린 거리에 따라 밝아지는 점 달력이 표시됩니다. 60개의 업적은 6개 카테고리와 4개 티어에 걸쳐 있으며, 진행 상황은 카운터로 저장되지 않고 러닝 로그에서 재계산됩니다. 스트릭은 직접 정의한 주간 약속(분, 킬로미터 또는 미션)을 사용하며, 진행 중인 주는 스트릭을 끊지 않습니다. 데이터 소유권 설정 → 데이터는 프로필, 캠페인 진행 상황, 업적, 코덱스 및 GPS 추적이 포함된 모든 러닝을 단일 일반 JSON 파일로 내보내 시스템 공유 시트에 전달합니다. 가져오기는 기기 데이터를 대체(완전 복원)하거나 병합하여 누락된 항목만 추가하므로 오래된 백업이 미션을 다시 잠글 수 없습니다. 두 경우 모두 저장소 권한을 사용하지 않습니다. 개별 러닝은 OsmAnd, Strava 또는 Komoot 같은 앱용 GPX 1.1 트랙으로 내보낼 수 있습니다. 오디오 다른 플레이어의 음악은 전송 중에 볼륨이 낮아지고, 플레이어가 오작동하면 다시 재개됩니다. 음악을 가져오지 않을 때 선택적 앰비언트 신스 배경음이 제공됩니다. 음성 속도와 효과음 볼륨을 조정할 수 있으며 스토리 음성을 끌 수 있습니다. 개인정보 및 권한 README는 여기서 매우 명확합니다. INTERNET 권한, 계정, 광고, 분석 또는 Google Play 서비스가 없습니다. 앱 모듈은 com.google.android.gms 그룹을 제외하고 AOSP LocationManager를 강제합니다. 화면이 꺼진 상태의 추적은 ACCESS_BACKGROUND_LOCATION 대신 포그라운드 서비스를 사용하며, 지속 알림이 앱이 표시하는 유일한 알림입니다. README는 또한 android:allowBackup이 Android 기본값인 true로 남아 있어 기기 백업이 활성화된 경우 OS 백업 에이전트가 러닝 로그를 사용자의 Google 계정에 복사할 수 있지만 앱 자체는 이를 수행하지 않는다고 명시합니다. 두 권한이 간접적으로 포함됩니다. ExoPlayer/just_audio를 통한 ACCESS_NETWORK_STATE와 share_plus의 자체 정의 동적 수신자 권한입니다. 기술 참고 사항 Flutter 3.44.8 / Dart 3.12로 빌드되었으며 Android 우선, iOS 스캐폴딩이 포함되어 있습니다. 빌드에는 JDK 17이 필요합니다. path_provider_android가 package:jni를 포함하므로 NDK가 필요합니다. 러닝 엔진은 위치 소스, 내레이터 및 시계를 주입받아 합성 GPS로 전체 미션을 밀리초 단위로 테스트할 수 있습니다. README는 228개 테스트와 깨끗한 flutter analyze를 보고합니다. 효과음, 런처 아이콘 및 README 스크린샷은 모두 tool/의 스크립트로 생성되며, 스크린샷 도구는 시드 데이터로 실제 위젯을 구동합니다. 미션 팩은 sprawlrun/mission_packs/ 아래 앱 문서 디렉토리에 넣는 단일 JSON 파일이며 설정에서 다시 로드되며 재빌드가 필요 없습니다. 앱 코드는 MIT이며, 번들 글꼴(Orbitron, Rajdhani, Share Tech Mono)은 SIL OFL 1.1입니다.