fix: some problems are fixed
This commit is contained in:
@@ -68,6 +68,7 @@ class HokmGame extends FlameGame {
|
||||
bool _beatPlayed = false; // اولین ضربان در پنجرهی پایانیِ نوبت پخش شد
|
||||
double _hbAccum = 0; // انباشتِ زمان برای تکرارِ منظمِ ضربان تا پایانِ نوبت
|
||||
bool _wasMyTurn = false;
|
||||
String _turnSig = ''; // امضای نوبت (نوبت|تعدادِ کارتِ زمین|فاز) — همگام با HUD
|
||||
|
||||
/// فرشِ انتخابی؛ 'classic' یعنی سطحِ میزِ ترسیمی. فرشِ تصویری بهعنوانِ سطحِ
|
||||
/// میز (بریده در شکلِ میز) روی زمینِ لاجوردی کشیده میشود.
|
||||
@@ -271,34 +272,47 @@ class HokmGame extends FlameGame {
|
||||
|
||||
// ضربانِ قلب فقط در ثانیههای پایانیِ نوبتِ خودِ کاربر؛ هنگامِ پایانِ نوبت
|
||||
// (بازیشدنِ کارت توسط کاربر یا سیستم) بلافاصله قطع میشود.
|
||||
//
|
||||
// زمانسنجِ نوبت باید دقیقاً همزمان با «حلقهی زمانِ نوبت» در HUD شروع شود؛
|
||||
// آن حلقه با تغییرِ امضای نوبت (نوبت|تعدادِ کارتِ زمین|فاز) ریست میشود و به
|
||||
// انیمیشنِ بُر/پخش کاری ندارد. پس اینجا هم شمارش را به همان امضا میبندیم و
|
||||
// فقط «پخشِ صدا» را در حینِ انیمیشن/اینترو خاموش میکنیم تا صدا و تصویر یکی شوند.
|
||||
void _updateHeartBeat(double dt) {
|
||||
final s = _s;
|
||||
final myTurn = !_silent &&
|
||||
!_introActive &&
|
||||
!_shuffling &&
|
||||
s != null &&
|
||||
final isMyTurn = s != null &&
|
||||
((s.phase == 'playing' && s.turn == s.yourSeat) ||
|
||||
(s.phase == 'choose_trump' && s.hakem == s.yourSeat));
|
||||
|
||||
if (!myTurn) {
|
||||
if (!isMyTurn || _silent) {
|
||||
if (_wasMyTurn) {
|
||||
AppSounds.stopHeartBeat(); // نوبت تمام شد ⇒ توقفِ فوریِ صدا
|
||||
_wasMyTurn = false;
|
||||
}
|
||||
_turnSig = s == null ? '' : '${s.turn}|${s.trick.length}|${s.phase}';
|
||||
return;
|
||||
}
|
||||
|
||||
if (!_wasMyTurn) {
|
||||
// شروعِ نوبتِ من ⇒ شمارش از صفر.
|
||||
// امضای نوبت — همانی که حلقهی HUD استفاده میکند.
|
||||
final sig = '${s.turn}|${s.trick.length}|${s.phase}';
|
||||
if (!_wasMyTurn || sig != _turnSig) {
|
||||
// شروعِ نوبتِ من (یا نوبتِ جدید) ⇒ شمارش از صفر، همزمان با حلقهی HUD.
|
||||
_wasMyTurn = true;
|
||||
_turnSig = sig;
|
||||
_turnElapsed = 0;
|
||||
_beatPlayed = false;
|
||||
_hbAccum = 0;
|
||||
// صدای «نوبتِ شما» فقط هنگامِ بازیِ کارت (نه پخش/انتخابِ حکم).
|
||||
if (s.phase == 'playing' && !_dealing) AppSounds.turn();
|
||||
// صدای «نوبتِ شما» فقط هنگامِ بازیِ کارت و بیرون از انیمیشنها.
|
||||
if (s.phase == 'playing' && !_introActive && !_shuffling && !_dealing) {
|
||||
AppSounds.turn();
|
||||
}
|
||||
}
|
||||
_turnElapsed += dt;
|
||||
|
||||
// در حینِ اینترو/بُر/پخش صدایی پخش نمیکنیم (اما شمارش ادامه دارد تا با
|
||||
// حلقهی HUD همگام بماند). این انیمیشنها در ابتدای نوبتاند و با پنجرهی
|
||||
// پایانیِ ضربان همپوشانی ندارند.
|
||||
if (_introActive || _shuffling || _dealing) return;
|
||||
|
||||
final dur = (s.turnTimeoutMs > 0 ? s.turnTimeoutMs / 1000.0 : 30.0);
|
||||
final remaining = dur - _turnElapsed;
|
||||
final warn = math.min(7.0, dur * 0.4);
|
||||
|
||||
@@ -297,7 +297,8 @@ class _PlayerSeat extends StatelessWidget {
|
||||
color: Colors.white70,
|
||||
size: diameter * 0.5,
|
||||
)
|
||||
: RandomAvatar(player.name.isEmpty ? '?' : player.name),
|
||||
: RandomAvatar(
|
||||
player.avatarSeed.isEmpty ? '?' : player.avatarSeed),
|
||||
),
|
||||
),
|
||||
),
|
||||
|
||||
Reference in New Issue
Block a user