refactor(controller): GameSessionController 분할 (920→526 LOC)
- GameStatisticsManager: 세션/누적 통계 추적 - SpeedBoostManager: 광고 배속 부스트 기능 - ReturnRewardsManager: 복귀 보상 기능 - ResurrectionManager: 사망/부활 처리 - HallOfFameManager: 명예의 전당 관리
This commit is contained in:
156
lib/src/features/game/managers/resurrection_manager.dart
Normal file
156
lib/src/features/game/managers/resurrection_manager.dart
Normal file
@@ -0,0 +1,156 @@
|
||||
import 'package:asciineverdie/src/core/engine/ad_service.dart';
|
||||
import 'package:asciineverdie/src/core/engine/iap_service.dart';
|
||||
import 'package:asciineverdie/src/core/engine/resurrection_service.dart';
|
||||
import 'package:asciineverdie/src/core/engine/shop_service.dart';
|
||||
import 'package:asciineverdie/src/core/model/game_state.dart';
|
||||
import 'package:asciineverdie/src/core/model/monetization_state.dart';
|
||||
import 'package:asciineverdie/src/core/storage/save_manager.dart';
|
||||
import 'package:flutter/foundation.dart';
|
||||
|
||||
/// 부활 결과
|
||||
class ResurrectionResult {
|
||||
const ResurrectionResult({
|
||||
required this.state,
|
||||
required this.monetization,
|
||||
required this.success,
|
||||
});
|
||||
|
||||
final GameState state;
|
||||
final MonetizationState monetization;
|
||||
final bool success;
|
||||
}
|
||||
|
||||
/// 사망 및 부활 처리를 담당하는 매니저
|
||||
///
|
||||
/// 일반 부활, 광고 부활, 자동 부활 등 모든 부활 관련 로직을 담당합니다.
|
||||
class ResurrectionManager {
|
||||
ResurrectionManager();
|
||||
|
||||
/// 자동 부활 활성화 여부
|
||||
bool autoResurrect = false;
|
||||
|
||||
/// 자동 부활 조건 확인
|
||||
///
|
||||
/// 다음 조건 중 하나라도 만족하면 자동 부활:
|
||||
/// 1. 수동 토글 자동부활 (autoResurrect)
|
||||
/// 2. 유료 유저 (IAP 광고 제거 구매)
|
||||
/// 3. 광고 부활 버프 활성 (10분간)
|
||||
bool shouldAutoResurrect({
|
||||
required MonetizationState monetization,
|
||||
required int elapsedMs,
|
||||
}) {
|
||||
return autoResurrect ||
|
||||
IAPService.instance.isAdRemovalPurchased ||
|
||||
monetization.isAutoReviveActive(elapsedMs);
|
||||
}
|
||||
|
||||
/// 일반 부활 처리 (HP 50% 회복)
|
||||
///
|
||||
/// Returns: 부활된 GameState (부활 불가 시 null)
|
||||
Future<GameState?> processResurrection({
|
||||
required GameState state,
|
||||
required SaveManager saveManager,
|
||||
required bool cheatsEnabled,
|
||||
required MonetizationState monetization,
|
||||
}) async {
|
||||
if (!state.isDead) return null;
|
||||
|
||||
final shopService = ShopService(rng: state.rng);
|
||||
final resurrectionService = ResurrectionService(shopService: shopService);
|
||||
|
||||
final resurrectedState = resurrectionService.processResurrection(state);
|
||||
|
||||
// 저장
|
||||
await saveManager.saveState(
|
||||
resurrectedState,
|
||||
cheatsEnabled: cheatsEnabled,
|
||||
monetization: monetization,
|
||||
);
|
||||
|
||||
debugPrint('[Resurrection] Normal resurrection complete');
|
||||
return resurrectedState;
|
||||
}
|
||||
|
||||
/// 광고 부활 처리 (HP 100% + 아이템 복구 + 10분 자동부활 버프)
|
||||
///
|
||||
/// 유료 유저: 광고 없이 부활
|
||||
/// 무료 유저: 리워드 광고 시청 후 부활
|
||||
///
|
||||
/// Returns: ResurrectionResult (부활 불가/실패 시 success=false)
|
||||
Future<ResurrectionResult> processAdRevive({
|
||||
required GameState state,
|
||||
required SaveManager saveManager,
|
||||
required bool cheatsEnabled,
|
||||
required MonetizationState monetization,
|
||||
}) async {
|
||||
if (!state.isDead) {
|
||||
return ResurrectionResult(
|
||||
state: state,
|
||||
monetization: monetization,
|
||||
success: false,
|
||||
);
|
||||
}
|
||||
|
||||
final shopService = ShopService(rng: state.rng);
|
||||
final resurrectionService = ResurrectionService(shopService: shopService);
|
||||
|
||||
// 부활 처리 결과 저장용
|
||||
GameState? revivedState;
|
||||
MonetizationState updatedMonetization = monetization;
|
||||
|
||||
void processRevive() {
|
||||
revivedState = resurrectionService.processAdRevive(state);
|
||||
|
||||
// 10분 자동부활 버프 활성화 (elapsedMs 기준)
|
||||
final buffEndMs =
|
||||
revivedState!.skillSystem.elapsedMs + 600000; // 10분 = 600,000ms
|
||||
updatedMonetization = monetization.copyWith(autoReviveEndMs: buffEndMs);
|
||||
|
||||
debugPrint(
|
||||
'[Resurrection] Ad revive complete, auto-revive buff until $buffEndMs ms');
|
||||
}
|
||||
|
||||
// 유료 유저는 광고 없이 부활
|
||||
if (IAPService.instance.isAdRemovalPurchased) {
|
||||
processRevive();
|
||||
await saveManager.saveState(
|
||||
revivedState!,
|
||||
cheatsEnabled: cheatsEnabled,
|
||||
monetization: updatedMonetization,
|
||||
);
|
||||
debugPrint('[Resurrection] Ad revive (paid user)');
|
||||
return ResurrectionResult(
|
||||
state: revivedState!,
|
||||
monetization: updatedMonetization,
|
||||
success: true,
|
||||
);
|
||||
}
|
||||
|
||||
// 무료 유저는 리워드 광고 필요
|
||||
final adResult = await AdService.instance.showRewardedAd(
|
||||
adType: AdType.rewardRevive,
|
||||
onRewarded: processRevive,
|
||||
);
|
||||
|
||||
if (adResult == AdResult.completed || adResult == AdResult.debugSkipped) {
|
||||
await saveManager.saveState(
|
||||
revivedState!,
|
||||
cheatsEnabled: cheatsEnabled,
|
||||
monetization: updatedMonetization,
|
||||
);
|
||||
debugPrint('[Resurrection] Ad revive (free user with ad)');
|
||||
return ResurrectionResult(
|
||||
state: revivedState!,
|
||||
monetization: updatedMonetization,
|
||||
success: true,
|
||||
);
|
||||
}
|
||||
|
||||
debugPrint('[Resurrection] Ad revive failed: $adResult');
|
||||
return ResurrectionResult(
|
||||
state: state,
|
||||
monetization: monetization,
|
||||
success: false,
|
||||
);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user