From f6799e024381c767a06146fd625009d62aaeaa6a Mon Sep 17 00:00:00 2001 From: JiWoong Sul Date: Mon, 9 Mar 2026 15:34:21 +0900 Subject: [PATCH] =?UTF-8?q?fix(monetization):=20=EA=B4=91=EA=B3=A0/?= =?UTF-8?q?=EB=B3=B4=EC=83=81=20=EB=A1=9C=EC=A7=81=20=EB=B2=84=EA=B7=B8=20?= =?UTF-8?q?=EC=88=98=EC=A0=95=20=EB=B0=8F=20=EC=98=A4=ED=94=84=EB=9D=BC?= =?UTF-8?q?=EC=9D=B8=202=EB=B0=B0=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 인터스티셜 광고 실패 시 onComplete 콜백 미호출 수정 - AdType.rewardReturn 추가, 복귀 보상에 올바른 타입 적용 - SpeedBoostButton 기본 배율 10→5로 수정 - 유료 유저 오프라인 시간 2배 인정 로직 구현 - IAP 상품 ID remove_ads → remove_ads_and 변경 --- lib/src/core/engine/ad_service.dart | 4 ++++ lib/src/core/engine/iap_service.dart | 3 +-- lib/src/core/engine/return_rewards_service.dart | 9 +++++++-- lib/src/features/game/widgets/speed_boost_button.dart | 2 +- 4 files changed, 13 insertions(+), 5 deletions(-) diff --git a/lib/src/core/engine/ad_service.dart b/lib/src/core/engine/ad_service.dart index 8058323..56f1ed5 100644 --- a/lib/src/core/engine/ad_service.dart +++ b/lib/src/core/engine/ad_service.dart @@ -20,6 +20,9 @@ enum AdType { /// 속도업용 인터스티셜 광고 (6초) interstitialSpeed, + + /// 복귀 보상용 리워드 광고 (30초) + rewardReturn, } /// 광고 결과 @@ -364,6 +367,7 @@ class AdService { overlays: SystemUiOverlay.values, ); ad.dispose(); + onComplete(); _loadInterstitialAd(); if (!completer.isCompleted) { completer.complete(AdResult.failed); diff --git a/lib/src/core/engine/iap_service.dart b/lib/src/core/engine/iap_service.dart index 4a9d519..61d6e4a 100644 --- a/lib/src/core/engine/iap_service.dart +++ b/lib/src/core/engine/iap_service.dart @@ -12,8 +12,7 @@ class IAPProductIds { IAPProductIds._(); /// 광고 제거 상품 ID (비소모성) - /// TODO: Google Play Console / App Store Connect에서 상품 생성 후 ID 교체 - static const String removeAds = 'remove_ads'; + static const String removeAds = 'remove_ads_and'; /// 모든 상품 ID 목록 static const Set all = {removeAds}; diff --git a/lib/src/core/engine/return_rewards_service.dart b/lib/src/core/engine/return_rewards_service.dart index 7e97f87..498ae62 100644 --- a/lib/src/core/engine/return_rewards_service.dart +++ b/lib/src/core/engine/return_rewards_service.dart @@ -83,8 +83,13 @@ class ReturnRewardsService { ); } + // 유료 유저: 오프라인 시간 2배 인정 + final creditedHours = isPaidUser ? hoursAway * 2 : hoursAway; + // 최대 시간 초과 시 최대로 제한 - final effectiveHours = hoursAway > maxHoursAway ? maxHoursAway : hoursAway; + final effectiveHours = creditedHours > maxHoursAway + ? maxHoursAway + : creditedHours; // 상자 개수 계산 final maxChests = isPaidUser ? maxChestsPaid : maxChestsFree; @@ -163,7 +168,7 @@ class ReturnRewardsService { // 무료 유저는 리워드 광고 필요 List bonusRewards = []; final adResult = await AdService.instance.showRewardedAd( - adType: AdType.rewardRevive, // 복귀 보상용 리워드 광고 + adType: AdType.rewardReturn, // 복귀 보상용 리워드 광고 onRewarded: () { bonusRewards = openChests(reward.bonusChestCount, playerLevel); }, diff --git a/lib/src/features/game/widgets/speed_boost_button.dart b/lib/src/features/game/widgets/speed_boost_button.dart index d200331..e870dd1 100644 --- a/lib/src/features/game/widgets/speed_boost_button.dart +++ b/lib/src/features/game/widgets/speed_boost_button.dart @@ -13,7 +13,7 @@ class SpeedBoostButton extends StatelessWidget { required this.isActive, required this.remainingSeconds, required this.onActivate, - this.boostMultiplier = 10, + this.boostMultiplier = 5, }); /// 부스트 활성화 여부