From 3943653a23cea92a2ee79a1fa47d491b084d2dda Mon Sep 17 00:00:00 2001 From: airkjw Date: Sat, 13 Jun 2026 14:02:31 +0900 Subject: [PATCH] feat(ads): rewarded ad gates the continue/extra-moves rescue --- lib/ui/screens/game_screen.dart | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/lib/ui/screens/game_screen.dart b/lib/ui/screens/game_screen.dart index 8c58745..e8da014 100644 --- a/lib/ui/screens/game_screen.dart +++ b/lib/ui/screens/game_screen.dart @@ -117,6 +117,7 @@ class _GameScreenState extends ConsumerState void _onSessionChange(GameViewState? prev, GameViewState? next) { if (next == null) return; + if (prev == null) ref.read(adServiceProvider).onRoundStart(); final audio = ref.read(audioServiceProvider); if (prev?.fxTick != next.fxTick && next.lastPlacement != null) { final placement = next.lastPlacement!; @@ -153,6 +154,9 @@ class _GameScreenState extends ConsumerState if (next.phase != GamePhase.playing) { ref.read(tutorialProvider.notifier).skip(); } + if (next.phase == GamePhase.won || next.phase == GamePhase.lost) { + ref.read(adServiceProvider).onStageCompleted(); + } if (next.phase == GamePhase.won) { audio.play(Sfx.win); // recordResult keeps the best run, so re-entry is harmless. @@ -393,7 +397,10 @@ class _GameScreenState extends ConsumerState [ if (!view.rescueUsed) FilledButton( - onPressed: () { + onPressed: () async { + final earned = + await ref.read(adServiceProvider).showRewarded(); + if (!earned) return; ref.read(analyticsProvider).rescueUsed(type: 'extra_moves'); notifier.addExtraMoves(); }, @@ -416,7 +423,10 @@ class _GameScreenState extends ConsumerState [ if (!view.rescueUsed) FilledButton( - onPressed: () { + onPressed: () async { + final earned = + await ref.read(adServiceProvider).showRewarded(); + if (!earned) return; ref.read(analyticsProvider).rescueUsed(type: 'continue'); notifier.useContinue(); },