diff --git a/lib/src/features/front/front_screen.dart b/lib/src/features/front/front_screen.dart index c43bfc4..76848d4 100644 --- a/lib/src/features/front/front_screen.dart +++ b/lib/src/features/front/front_screen.dart @@ -321,8 +321,8 @@ class _ActionButtons extends StatelessWidget { onPressed: onSettings, isPrimary: false, ), - // IAP 구매 (광고 제거) - 스토어 사용 가능하고 미구매 상태일 때만 표시 - if (removeAdsPrice != null && !isAdRemovalPurchased) ...[ + // IAP 구매 (광고 제거) - 스토어 사용 가능할 때 표시 (구매 완료 시 비활성화) + if (removeAdsPrice != null) ...[ const SizedBox(height: 20), const Divider(color: RetroColors.panelBorderInner, height: 1), const SizedBox(height: 12), @@ -330,13 +330,12 @@ class _ActionButtons extends StatelessWidget { price: removeAdsPrice!, onPurchase: onPurchaseRemoveAds, onRestore: onRestorePurchase, + enabled: !isAdRemovalPurchased, ), ], - // 이미 구매된 경우 표시 + // 이미 구매된 경우 배지 표시 if (isAdRemovalPurchased) ...[ - const SizedBox(height: 20), - const Divider(color: RetroColors.panelBorderInner, height: 1), - const SizedBox(height: 12), + const SizedBox(height: 8), _PurchasedBadge(), ], ], @@ -412,11 +411,13 @@ class _IapPurchaseButton extends StatelessWidget { required this.price, this.onPurchase, this.onRestore, + this.enabled = true, }); final String price; final VoidCallback? onPurchase; final VoidCallback? onRestore; + final bool enabled; void _showPurchaseDialog(BuildContext context) { showDialog( @@ -433,23 +434,33 @@ class _IapPurchaseButton extends StatelessWidget { @override Widget build(BuildContext context) { + // 비활성화 상태의 색상 + final buttonColor = enabled ? RetroColors.gold : RetroColors.textDisabled; + final bgGradient = enabled + ? const LinearGradient( + colors: [Color(0xFF4A3B2A), Color(0xFF3D2E1F)], + begin: Alignment.topCenter, + end: Alignment.bottomCenter, + ) + : const LinearGradient( + colors: [Color(0xFF3A3A3A), Color(0xFF2A2A2A)], + begin: Alignment.topCenter, + end: Alignment.bottomCenter, + ); + return Column( crossAxisAlignment: CrossAxisAlignment.stretch, children: [ // 구매 버튼 (클릭 시 팝업) Container( decoration: BoxDecoration( - gradient: const LinearGradient( - colors: [Color(0xFF4A3B2A), Color(0xFF3D2E1F)], - begin: Alignment.topCenter, - end: Alignment.bottomCenter, - ), - border: Border.all(color: RetroColors.gold, width: 2), + gradient: bgGradient, + border: Border.all(color: buttonColor, width: 2), ), child: Material( color: Colors.transparent, child: InkWell( - onTap: () => _showPurchaseDialog(context), + onTap: enabled ? () => _showPurchaseDialog(context) : null, child: Padding( padding: const EdgeInsets.symmetric( horizontal: 16, @@ -457,7 +468,7 @@ class _IapPurchaseButton extends StatelessWidget { ), child: Row( children: [ - const Icon(Icons.block, color: RetroColors.gold, size: 24), + Icon(Icons.block, color: buttonColor, size: 24), const SizedBox(width: 12), Expanded( child: Column( @@ -465,10 +476,10 @@ class _IapPurchaseButton extends StatelessWidget { children: [ Text( game_l10n.iapRemoveAds, - style: const TextStyle( + style: TextStyle( fontFamily: 'PressStart2P', fontSize: 12, - color: RetroColors.gold, + color: buttonColor, ), ), const SizedBox(height: 4), @@ -484,11 +495,7 @@ class _IapPurchaseButton extends StatelessWidget { ), ), // 화살표 아이콘 (상세 보기) - const Icon( - Icons.arrow_forward_ios, - color: RetroColors.gold, - size: 16, - ), + Icon(Icons.arrow_forward_ios, color: buttonColor, size: 16), ], ), ), @@ -499,7 +506,7 @@ class _IapPurchaseButton extends StatelessWidget { // 복원 버튼 Center( child: TextButton( - onPressed: onRestore, + onPressed: enabled ? onRestore : null, child: Text( game_l10n.iapRestorePurchase, style: const TextStyle( @@ -569,7 +576,10 @@ class _IapPurchaseDialog extends StatelessWidget { const SizedBox(height: 8), _BenefitItem(icon: Icons.speed, text: game_l10n.iapBenefit5), const SizedBox(height: 8), - _BenefitItem(icon: Icons.inventory_2, text: game_l10n.iapBenefit6), + _BenefitItem( + icon: Icons.inventory_2, + text: game_l10n.iapBenefit6, + ), const SizedBox(height: 20), // 가격 + 구매 버튼 Container( diff --git a/lib/src/features/new_character/new_character_screen.dart b/lib/src/features/new_character/new_character_screen.dart index ad0763f..117a202 100644 --- a/lib/src/features/new_character/new_character_screen.dart +++ b/lib/src/features/new_character/new_character_screen.dart @@ -803,7 +803,6 @@ class _NewCharacterScreenState extends State { PassiveType.magicDamageBonus => game_l10n.passiveMagicBonus(percent), PassiveType.criticalBonus => game_l10n.passiveCritBonus(percent), PassiveType.expBonus => passive.description, - PassiveType.deathEquipmentPreserve => passive.description, }; } diff --git a/lib/src/features/settings/settings_screen.dart b/lib/src/features/settings/settings_screen.dart index 6ae8d8b..2f033d4 100644 --- a/lib/src/features/settings/settings_screen.dart +++ b/lib/src/features/settings/settings_screen.dart @@ -64,7 +64,6 @@ class _SettingsScreenState extends State { bool _isLoading = true; // 디버그 설정 상태 (Phase 8) - bool _debugAdEnabled = true; bool _debugIapSimulated = false; int _debugOfflineHours = 0; @@ -80,7 +79,6 @@ class _SettingsScreenState extends State { // 디버그 설정 로드 (Phase 8) final debugSettings = DebugSettingsService.instance; - final adEnabled = debugSettings.adEnabled; final iapSimulated = debugSettings.iapSimulated; final offlineHours = debugSettings.offlineHours; @@ -88,7 +86,6 @@ class _SettingsScreenState extends State { setState(() { _bgmVolume = bgm; _sfxVolume = sfx; - _debugAdEnabled = adEnabled; _debugIapSimulated = iapSimulated; _debugOfflineHours = offlineHours; _isLoading = false; @@ -304,7 +301,11 @@ class _SettingsScreenState extends State { // 헤더 Row( children: [ - Icon(Icons.bug_report, color: RetroColors.hpOf(context), size: 16), + Icon( + Icons.bug_report, + color: RetroColors.hpOf(context), + size: 16, + ), const SizedBox(width: 8), Text( 'DEVELOPER TOOLS', @@ -318,19 +319,6 @@ class _SettingsScreenState extends State { ), const SizedBox(height: 16), - // 광고 ON/OFF 토글 - _RetroDebugToggle( - icon: Icons.ad_units, - label: 'ADS ENABLED', - description: 'OFF: 광고 버튼 클릭 시 바로 보상', - value: _debugAdEnabled, - onChanged: (value) async { - await DebugSettingsService.instance.setAdEnabled(value); - setState(() => _debugAdEnabled = value); - }, - ), - const SizedBox(height: 12), - // IAP 시뮬레이션 토글 _RetroDebugToggle( icon: Icons.shopping_cart, @@ -448,7 +436,8 @@ class _SettingsScreenState extends State { context: context, builder: (context) => _RetroConfirmDialog( title: 'CREATE TEST CHARACTER?', - message: '현재 캐릭터가 레벨 100으로 변환되어\n' + message: + '현재 캐릭터가 레벨 100으로 변환되어\n' '명예의 전당에 등록됩니다.\n\n' '⚠️ 현재 세이브 파일이 삭제됩니다.\n' '이 작업은 되돌릴 수 없습니다.', @@ -480,11 +469,7 @@ class _RetroSectionTitle extends StatelessWidget { Widget build(BuildContext context) { return Row( children: [ - Container( - width: 4, - height: 14, - color: RetroColors.goldOf(context), - ), + Container(width: 4, height: 14, color: RetroColors.goldOf(context)), const SizedBox(width: 8), Text( title.toUpperCase(),