fix(buff): 배속 상태에서 버프 시간이 배속을 따라가는 버그 수정
Some checks failed
CI / analyze-and-test (push) Has been cancelled

- speedBoostEndMs: elapsedMs(게임 시간) → DateTime.now()(실제 시간)
- autoReviveEndMs: elapsedMs → DateTime.now()
- MonetizationState: isAutoReviveActive/isSpeedBoostActive 실제 시간 기준
- 5배속에서 5분 버프가 1분에 만료되던 문제 해결
- bossLevelingEndTime은 이미 DateTime.now() 기준 (변경 불필요)
This commit is contained in:
JiWoong Sul
2026-03-30 22:55:24 +09:00
parent b1de31fc12
commit eee32c94b8
5 changed files with 45 additions and 42 deletions

View File

@@ -69,18 +69,18 @@ class MonetizationState with _$MonetizationState {
/// 무료 사용자 여부
bool get isFreeUser => !adRemovalPurchased;
/// 자동부활 버프 활성 여부 (elapsedMs 기준)
bool isAutoReviveActive(int elapsedMs) {
/// 자동부활 버프 활성 여부 (실제 시간 기준)
bool isAutoReviveActive([int? _]) {
if (autoReviveEndMs == null) return false;
return elapsedMs < autoReviveEndMs!;
return DateTime.now().millisecondsSinceEpoch < autoReviveEndMs!;
}
/// 5배속 버프 활성 여부 (elapsedMs 기준)
/// 5배속 버프 활성 여부 (실제 시간 기준)
/// 유료 사용자는 항상 활성
bool isSpeedBoostActive(int elapsedMs) {
bool isSpeedBoostActive([int? _]) {
if (isPaidUser) return true;
if (speedBoostEndMs == null) return false;
return elapsedMs < speedBoostEndMs!;
return DateTime.now().millisecondsSinceEpoch < speedBoostEndMs!;
}
/// 행운의 부적 버프 활성 여부 (elapsedMs 기준)

View File

@@ -136,10 +136,8 @@ class GameSessionController extends ChangeNotifier {
int get speedBoostMultiplier => _speedBoostManager.speedBoostMultiplier;
int get speedBoostDuration => _speedBoostManager.speedBoostDuration;
int get speedBoostRemainingSeconds => _speedBoostManager.getRemainingSeconds(
_monetization,
_state?.skillSystem.elapsedMs ?? 0,
);
int get speedBoostRemainingSeconds =>
_speedBoostManager.getRemainingSeconds(_monetization);
int get currentSpeedMultiplier =>
_speedBoostManager.getCurrentSpeedMultiplier(_loop);
@@ -242,7 +240,6 @@ class GameSessionController extends ChangeNotifier {
void _checkBuffExpiries(int elapsedMs) {
// 속도 부스트 만료 체크
final boostEnded = _speedBoostManager.checkExpiry(
elapsedMs: elapsedMs,
monetization: _monetization,
loop: _loop,
);

View File

@@ -101,9 +101,9 @@ class ResurrectionManager {
void processRevive() {
revivedState = resurrectionService.processAdRevive(state);
// 10분 자동부활 버프 활성화 (elapsedMs 기준)
// 10분 자동부활 버프 활성화 (실제 시간 기준, 배속 영향 받지 않음)
final buffEndMs =
revivedState!.skillSystem.elapsedMs + 600000; // 10분 = 600,000ms
DateTime.now().millisecondsSinceEpoch + 600000; // 10분 = 600,000ms
updatedMonetization = monetization.copyWith(autoReviveEndMs: buffEndMs);
debugPrint(

View File

@@ -51,15 +51,12 @@ class SpeedBoostManager {
/// 속도 부스트 지속 시간 (초)
int get speedBoostDuration => _speedBoostDuration;
/// 속도 부스트 남은 시간 (초) - 게임 시간(elapsedMs) 기준 계산
int getRemainingSeconds(
MonetizationState monetization,
int currentElapsedMs,
) {
/// 속도 부스트 남은 시간 (초) - 실제 시간(wall clock) 기준 계산
int getRemainingSeconds(MonetizationState monetization) {
if (!_isSpeedBoostActive) return 0;
final endMs = monetization.speedBoostEndMs;
if (endMs == null) return 0;
final remainingMs = endMs - currentElapsedMs;
final remainingMs = endMs - DateTime.now().millisecondsSinceEpoch;
return remainingMs > 0 ? (remainingMs / 1000).ceil() : 0;
}
@@ -136,8 +133,9 @@ class SpeedBoostManager {
loop.updateAvailableSpeeds([speedBoostMultiplier]);
}
// 종료 시점 저장 (게임 시간 기준)
final endMs = currentElapsedMs + (_speedBoostDuration * 1000);
// 종료 시점 저장 (실제 시간 기준, 배속 영향 받지 않음)
final endMs =
DateTime.now().millisecondsSinceEpoch + (_speedBoostDuration * 1000);
final updatedMonetization = monetization.copyWith(speedBoostEndMs: endMs);
debugPrint('[SpeedBoost] Started, ends at $endMs ms');
@@ -150,14 +148,14 @@ class SpeedBoostManager {
///
/// Returns: 부스트가 종료되었으면 true
bool checkExpiry({
required int elapsedMs,
required MonetizationState monetization,
required ProgressLoop? loop,
}) {
if (!_isSpeedBoostActive) return false;
final endMs = monetization.speedBoostEndMs;
if (endMs != null && elapsedMs >= endMs) {
final now = DateTime.now().millisecondsSinceEpoch;
if (endMs != null && now >= endMs) {
endSpeedBoost(loop: loop);
return true;
}