feat: start at Season 1, add menu/season_001 BGM tracks, settings build tag

- activeSeason now returns the first season (Season 1 'First Bloom') so a new
  player starts at spring instead of the newest season.
- Bundle the owner-picked CC0 tracks menu.mp3 + season_001.mp3 (BGM now audible).
- Settings footer shows 'v1.0.0 (build 3)' so test builds are identifiable.
180 tests green, analyze clean.
This commit is contained in:
2026-06-14 10:32:12 +09:00
parent 8947221b27
commit 1682578501
5 changed files with 18 additions and 5 deletions
Binary file not shown.
Binary file not shown.
+6 -3
View File
@@ -76,9 +76,12 @@ final seasonRefreshProvider = FutureProvider<bool>(
(ref) => ref.read(contentRepositoryProvider).refresh(),
);
/// The season players land in by default: the newest available.
/// (availableSeasons is sorted by seasonId ascending.)
SeasonPack activeSeason(List<SeasonPack> seasons) => seasons.last;
/// The season players land in by default: Season 1, the start of the journey,
/// so a new player experiences the content in order rather than being dropped
/// into the newest season. (availableSeasons is sorted by seasonId ascending,
/// so `.first` is Season 1.) A season selector to reach later seasons is a
/// planned follow-up.
SeasonPack activeSeason(List<SeasonPack> seasons) => seasons.first;
final streakProvider = NotifierProvider<StreakNotifier, StreakState>(
StreakNotifier.new,
+10
View File
@@ -76,6 +76,16 @@ class SettingsScreen extends ConsumerWidget {
title: Text(l10n.restorePurchases),
onTap: () => iap.restorePurchases(),
),
const SizedBox(height: 24),
Center(
child: Text(
'Block Seasons · v1.0.0 (build 3)',
style: TextStyle(
color: Colors.white.withValues(alpha: 0.4),
fontSize: 12,
),
),
),
],
),
),
+2 -2
View File
@@ -51,9 +51,9 @@ void main() {
expect(repo.calls, 1);
});
test('activeSeason picks the newest by id', () {
test('activeSeason starts at Season 1 (first by id)', () {
final p1 = _pack('season_001');
final p2 = _pack('season_002');
expect(activeSeason([p1, p2]).seasonId, 'season_002');
expect(activeSeason([p1, p2]).seasonId, 'season_001');
});
}