Files
front-hokm/lib/feature/game/presentation/widgets/flame/cut_fx.dart
T

46 lines
2.2 KiB
Dart

import '../../../domain/entities/game_entities.dart';
/// وضعیتِ افکتِ «بریدن با حکم»: بالاترین حکمِ دستِ جاری، کمبوِ روبُریدن‌های سریع،
/// و «مکثِ آتش» (فریزِ کوتاهِ صحنه پس از آتشِ کمبو). فقط وضعیت و تصمیم را نگه
/// می‌دارد؛ افزودنِ کامپوننت‌های افکت و بافرِ وضعیت بر عهده‌ی خودِ صحنه است.
class CutFx {
static const double comboWindowSec = 6.0; // پنجره‌ی شمارشِ بریدنِ پیاپی
static const double holdSec = 1.0; // مدتِ مکثِ آتش
int _bestTrumpRank = 0; // بالاترین حکمِ بازی‌شده در دستِ جاری
int combo = 0; // شمارِ بریدنِ پیاپیِ سریع (برای شدتِ آتش)
double _lastCutAt = -999;
bool holding = false; // آیا در «مکثِ آتش» هستیم
double _holdUntil = 0;
GameState? pending; // آخرین وضعیتِ بافرشده در حینِ مکث
/// دستِ جدید (زمین خالی/تک‌کارت) ⇒ بالاترین حکم ریست می‌شود.
void resetTrick() => _bestTrumpRank = 0;
/// ثبتِ یک بریدن؛ true اگر این حکم «دست را می‌بَرد» (اولین بریدن یا روبُریدنِ
/// بالاتر) — در این صورت کمبو هم به‌روزرسانی می‌شود. حکمِ بازنده false می‌دهد.
bool registerWinningCut(int rank, double now) {
if (rank <= _bestTrumpRank) return false;
_bestTrumpRank = rank;
combo = (now - _lastCutAt < comboWindowSec) ? combo + 1 : 1;
_lastCutAt = now;
return true;
}
/// شروعِ مکثِ آتش (پس از آتشِ کمبو).
void startHold(double now) {
holding = true;
_holdUntil = now + holdSec;
}
/// آیا مکث به پایان رسیده و باید وضعیتِ بافرشده اعمال شود.
bool holdExpired(double now) => holding && now >= _holdUntil;
/// لغوِ مکث و پاک‌کردنِ بافر (هنگام خروج از میز).
void clearHold() {
holding = false;
pending = null;
}
}