Monthly Development Report: BeatShift
1. Executive Summary
May was the kickoff month for Project BeatShift — the start of Phase 1: Technical POC & Foundation on the road to a Unity 6 mobile relaunch. The team stood up the project from a fresh architecture, validated the core rhythm gameplay through a working Proof of Concept, and built out nearly the full note-type vocabulary (Tap, Hold, BeatUp, Duo, Drag, Swipe). The month was defined by core gameplay validation, a major note-spawner refactor for maintainability, FMOD audio foundation, and the first iOS/Android CI pipelines.
Key Achievements:
- Architecture Kickoff: Project bootstrap, Dev/Prod environment switcher, Remote Config support, an APIResponseWrapper, and the Ichigames → Adisoft bundle migration.
- Note Systems: Implemented BeatUp, Duo (timestamp-matched, funnel-curve), Drag, and Swipe notes, plus a unified “any tap” input system and an early-Miss window.
- Refactor: Extracted a shared NoteSpawnerBase from five lane spawners, centralized input parsing (fixing double-hit race conditions), and added a difficulty table + isOnTopLane field.
- Scoring: Correct, branch-aware accuracy — SS rank (100%), Hold notes in the denominator, and 100% achievable on the Normal path.
- Audio & CI: FMOD project + BeatUp/Note-Result SFX (with a “no sound” fix), and Android/iOS build scripts plus Jenkins pipelines.
2. Note Systems & Gameplay
- BeatUp Notes: Fixed BeatUp mechanics audio streaming and spawner bugs, a BeatUp note not moving (breaking the object pool), and NullReferenceExceptions parsing MIDI into inactive BeatUp lanes; tuned the Top-Lane hold pitch (41 → 46) for the Test difficulty.
- Duo Notes: Refactored Duo-Note pairing to use timestamp matching instead of raycasting, implemented a funnel curve exclusively for Duo Notes, and fixed the Duo-Note curve timing and spawn offsets.
- Drag Notes: Added the Drag/DragNote note system.
- Swipe Notes: Built centered Swipe notes with PC testing, made swipes omnidirectional (any direction hits), simplified swipe to a dual-finger single-MIDI gesture, and isolated swipe notes from tap evaluation to fix the simultaneous tap/swipe bug.
- Unified Input: Added a unified “any tap” input system, prevented wrong swipe directions from triggering Bad hits, handled simultaneous swipes, and prevented double inputs on mobile caused by Unity mouse simulation; added an early-Miss window for pressing notes too early.
3. Refactor & Architecture
- NoteSpawner Base: Extracted NoteSpawnerBase from the five lane spawners and moved BaseNoteSpawner component fetching to Awake.
- Difficulty & Lanes: Added a difficulty table and a BaseNote.isOnTopLane field, with dynamic lane detection for the BeatUp phase.
- Input & Timing: Centralized input parsing to fix double-hit race conditions, and applied a timing-correctness / performance / dead-input cleanup pass.
- Death Handling: Disabled the collider on death to prevent physics bugs.
4. Scoring & Accuracy
- Accuracy Math: Correctly counted Hold notes in the accuracy-percentage denominator, allowed 100% accuracy on the Normal path by excluding BeatUp notes from the total, and correctly calculated the final-score percentage for branching BeatUp paths.
- SS Rank: Aligned the API SS-rank logic with the UI (requiring exactly 100%).
- Fixes: Resolved a syntax error in AddNormalNoteToNoteCounter and a NullReferenceException parsing MIDI into inactive lanes.
5. Audio (FMOD) & Song System
- FMOD Foundation: Initialized the FMOD project, updated FMOD Core, added BeatUp SFX and Note-Result SFX, and fixed “FMOD No sound.”
- Feel / Juice: Imported the Feel framework and added a juice system for gameplay feedback.
- Song System: Reworked the song-folder structure, fixed song-path/file-name issues and a missing beatup note, and fixed the play button not showing.
6. CI/CD, Build & Platform
- Build Scripts: Added build scripts for iOS and Android with pre-build and post-build processing.
- Jenkins Pipelines: Added Jenkins pipeline configuration for Android and iOS builds, a Gemfile for Ruby dependencies, Vault secret retrieval, and Android version-code retrieval refinements.
- Android Config: Managed URP COMPATIBILITY_MODE scripting-define symbols, keystore path/key-alias, and Firebase app-bundle config (with .bak renames to avoid duplicate-plist warnings).
- Migration & Login: Completed the Ichigames → Adisoft bundle migration and fixed the Google-login crash.
7. API / Backend (BeatShift API)
- Environments & Scoring: Implemented Dev/Prod environments, an osu!-style scoring system, and Remote Config support.
- Auth & Responses: Restored the ApiResponse wrapper, updated the Node.js engine, and linked guest login to device.
- App Store Readiness: Added a Remote Config workflow document for App Store Review.
- Config & Docs: Updated Node.js to v22, ignored .env files in Git, and added AGENTS.md (AI context) and a CHANGELOG for the architecture update.
8. Documentation
- AI Context: Added CLAUDE.md pointing to AGENTS.md, a folder-scoped AGENTS.md for the gameplay subsystem, and documented the unified input mechanics.
- Changelog: Added a CHANGELOG for the architecture update.