46 lines
2.2 KiB
Dart
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;
|
|
}
|
|
}
|