Skip to content

1.4.0#5

Merged
yet300 merged 9 commits into
mainfrom
1.4.0
May 14, 2026
Merged

1.4.0#5
yet300 merged 9 commits into
mainfrom
1.4.0

Conversation

@yet300
Copy link
Copy Markdown
Owner

@yet300 yet300 commented May 14, 2026

Summary

  • Rotates background music across multiple tracks for more variety during play
  • Adopts the Android Core SplashScreen API for a modern startup experience
  • Internal polish: feature components reorganized into sub-packages, GameComponent state unified into a single UI model, GameStoreFactory business logic extracted into helpers, analytics payloads unified behind per-feature loggers, review-prompt suppression centralized in one repository call, and write-mutex race conditions in SettingsBackedSettingsRepository covered by tests
  • Bumps app version to 1.4.0 (versionCode 9) on Android and iOS, with matching Play Store changelog

yet3a and others added 9 commits May 14, 2026 11:41
- Add `androidx.core:core-splashscreen` dependency to `libs.versions.toml` and `androidApp` build configuration.
- Define `Theme.BlockBlast.Starter` in `themes.xml` inheriting from `Theme.SplashScreen` to configure background and icon properties.
- Update `AndroidManifest.xml` to use the new splash screen starter theme as the default application theme.
- Invoke `installSplashScreen()` in `MainActivity` to manage the splash screen transition before setting the content.
…ed helper classes

- Implement `GameAnalyticsLogger` to centralize and standardize game event logging with consistent parameters.
- Implement `GameInitializer` to manage game bootstrap logic, including session restoration and score seeding.
- Implement `ReviveCountdownManager` to encapsulate the revive timer lifecycle and tick logic.
- Simplify the `GameStoreFactory` executor by delegating initialization, logging, and countdown concerns to the new components.
- Extract review qualification logic into a private helper function within `GameStoreFactory`.
- Remove the unused `StoreReviewRepository` dependency from the store factory and updated relevant tests.
Replace the increment-in-a-loop hack in DefaultGameComponent with
`SettingsRepository.suppressReviewPrompts(max)`, so the cap happens in
one disk write under the existing write mutex. Also drop the redundant
`best > settings.bestScore.value` guard in GameStoreFactory — setBestScore
is already monotonic at the repository level — and correct the now-stale
doc on setBestScore.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
DefaultGameComponent now goes through GameAnalyticsLogger, eliminating
its private gameParams() copy that drifted from the one in the executor.
HomeStoreFactory and DefaultHomeComponent share a new HomeAnalyticsLogger
so the (best_score, has_saved_game) payload is built in one place.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Adds concurrent-writer tests for setBestScore (monotonic under shuffled
parallel writes), suppressReviewPrompts (idempotent, no-op above max),
and the mixed increment + suppress case (floor must hold under races).
Catches any future regression that removes withLock from one of the
read-modify-write paths.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Replace the single looped music_ambient track with a shuffled playlist
(block, feltwood, mossy) that picks a new track on each completion and
never repeats the previous one back-to-back. Avoids ear fatigue from a
single short loop during long sessions.

One AVAudioPlayer/MediaPlayer at a time — no crossfade, no second
decoder in memory. iOS advances via a coroutine that delays for the
track duration; Android advances via OnCompletionListener.

Also re-encodes audio assets to mono mp3 (80k for music, 96k for voice
lines), strips embedded cover art, and drops dead preload entries for
files that never existed on disk. Total audio assets: ~10.9 MB → 8.2 MB.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
- Update `GameComponent` interface to expose a single `Value<Model>` instead of separate properties for game state and countdown.
- Define `GameComponent.Model` data class to encapsulate both `GameState` and the game-over `continueCountdown` value.
- Implement `stateToModel` mapper in the integration layer to transform `GameStoreState` into the component's UI model.
- Update `GameContent` Composable to subscribe to the unified UI model and extract game data and countdown values accordingly.
- Refactor `DefaultGameComponent` and unit test mocks to align with the updated component interface.
- Move `ReviewPromptComponent` and its associated tests to the `ge.yet.blockblast.feature.game.reviewprompt` package.
- Reorganize the `settings` feature by grouping components, stores, and integration mappers into dedicated `main`, `libraries`, and `more` sub-packages.
- Update package declarations and imports across the `composeApp` and feature modules to reflect the new project structure.
- Ensure consistency in test source sets by mirroring the package changes for unit tests.
Adds release changelog highlighting rotating background music and the
Android SplashScreen API refresh shipped in this version.
@yet300 yet300 merged commit 354af01 into main May 14, 2026
3 checks passed
@yet300 yet300 deleted the 1.4.0 branch May 14, 2026 13:16
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants