priority of cards fixed

This commit is contained in:
2026-06-19 21:35:23 +03:30
parent c4c1453f7e
commit 04b97ca163
3 changed files with 106 additions and 29 deletions
@@ -97,12 +97,21 @@ class _GameScreenState extends State<GameScreen> {
_backButton(context),
if (state.connection == WsStatus.disconnected) _connBanner(),
if (_showSearch(state)) _searchPanel(state),
if (!_showSearch(state) && _showTrumpPicker(state))
_trumpPicker(context),
// دیالوگِ انتخابِ حکم و بنرِ نوبت فقط پس از پایانِ انیمیشنِ
// پخشِ کارت نمایش داده می‌شوند (نه وسطِ بُر زدن/پخش).
if (!_showSearch(state))
ValueListenableBuilder<bool>(
valueListenable: _game.animating,
builder: (context, animating, _) {
if (animating) return const SizedBox.shrink();
return Stack(children: [
if (_showTrumpPicker(state)) _trumpPicker(context),
if (_isMyPlayTurn(state)) _turnBanner(),
]);
},
),
if (state.handResult != null && state.gameOver == null)
_handResult(state),
if (!_showSearch(state) && _isMyPlayTurn(state))
_turnBanner(),
if (state.gameOver != null) _gameOver(context, state),
],
);
@@ -258,7 +267,7 @@ class _GameScreenState extends State<GameScreen> {
mainAxisAlignment: MainAxisAlignment.center,
children: [
for (var seat = 0; seat < 4; seat++)
_searchSlot(at(seat), seat == mySeat),
_searchSlot(at(seat), seat == mySeat, seat),
],
),
if (searching) ...[
@@ -274,7 +283,7 @@ class _GameScreenState extends State<GameScreen> {
);
}
Widget _searchSlot(GamePlayer? p, bool isYou) {
Widget _searchSlot(GamePlayer? p, bool isYou, int seat) {
final found = p != null;
return Padding(
padding: const EdgeInsets.symmetric(horizontal: 6),
@@ -305,7 +314,7 @@ class _GameScreenState extends State<GameScreen> {
),
child:
!found
? const _SearchingAvatar() // آواتارهای متغیر تا یافتنِ حریف
? _SearchingAvatar(slot: seat) // آواتارهای متغیر و متفاوت
: p.bot
? const Icon(
Icons.smart_toy,
@@ -471,7 +480,8 @@ class _GameScreenState extends State<GameScreen> {
/// آواتارِ در حالِ تغییر برای جایگاه‌های خالیِ پنل جستجو (حسِ «در حال یافتن»).
class _SearchingAvatar extends StatefulWidget {
const _SearchingAvatar();
final int slot; // هر جایگاه دامنه‌ی seedِ متفاوت دارد تا یکسان نباشند
const _SearchingAvatar({required this.slot});
@override
State<_SearchingAvatar> createState() => _SearchingAvatarState();
@@ -484,7 +494,8 @@ class _SearchingAvatarState extends State<_SearchingAvatar> {
@override
void initState() {
super.initState();
_timer = Timer.periodic(const Duration(milliseconds: 220), (_) {
_i = widget.slot * 13; // شروعِ متفاوت برای هر جایگاه
_timer = Timer.periodic(const Duration(milliseconds: 240), (_) {
if (mounted) setState(() => _i++);
});
}
@@ -497,9 +508,10 @@ class _SearchingAvatarState extends State<_SearchingAvatar> {
@override
Widget build(BuildContext context) {
// پیشوندِ مخصوصِ جایگاه ⇒ آواتارِ هر جایگاه با بقیه فرق دارد.
return ClipRRect(
borderRadius: BorderRadius.circular(8),
child: RandomAvatar('seek-${_i % 24}'),
child: RandomAvatar('s${widget.slot}-$_i'),
);
}
}