feat: rotate table players

This commit is contained in:
2026-06-19 23:18:51 +03:30
parent 04b97ca163
commit 0c8fd22264
5 changed files with 540 additions and 297 deletions
@@ -45,7 +45,10 @@ class GameBloc extends Bloc<GameEvent, GameUiState> {
on<PlayCardEvent>(
(event, emit) => repository.send({'type': 'play_card', 'card': event.card}));
on<LeaveGameEvent>((event, emit) => repository.send({'type': 'leave'}));
on<StartTableEvent>((event, emit) => repository.send({'type': 'start_table'}));
on<StartTableEvent>((event, emit) =>
repository.send({'type': 'start_table', 'hands': event.hands}));
on<RotateTableEvent>((event, emit) =>
repository.send({'type': 'rotate_table', 'dir': event.dir}));
on<LeaveTableEvent>((event, emit) => repository.send({'type': 'leave_table'}));
on<ClearNoticeEvent>((event, emit) => emit(state.copyWith(clearNotice: true)));
}
@@ -82,7 +85,8 @@ class GameBloc extends Bloc<GameEvent, GameUiState> {
void chooseTrump(String suit) => add(ChooseTrumpEvent(suit));
void playCard(String card) => add(PlayCardEvent(card));
void leave() => add(LeaveGameEvent());
void startTable() => add(StartTableEvent());
void startTable(int hands) => add(StartTableEvent(hands));
void rotateTable(int dir) => add(RotateTableEvent(dir));
void leaveTable() => add(LeaveTableEvent());
void clearNotice() => add(ClearNoticeEvent());
@@ -32,7 +32,15 @@ class PlayCardEvent extends GameEvent {
class LeaveGameEvent extends GameEvent {}
class StartTableEvent extends GameEvent {}
class StartTableEvent extends GameEvent {
final int hands; // تعداد دستِ انتخابی (۳/۵/۷)
StartTableEvent(this.hands);
}
class RotateTableEvent extends GameEvent {
final int dir; // +۱/−۱ جهتِ چرخشِ جایگاه‌ها
RotateTableEvent(this.dir);
}
class LeaveTableEvent extends GameEvent {}
@@ -7,7 +7,8 @@ import '../../domain/entities/game_entities.dart';
class LobbyPlayer {
final String name;
final bool host;
const LobbyPlayer(this.name, this.host);
final int seat; // جایگاهِ مطلق (۰..۳)
const LobbyPlayer(this.name, this.host, this.seat);
}
/// وضعیت اتاق انتظارِ میز خصوصی (دورهمی).
@@ -15,12 +16,14 @@ class TableLobby {
final String code;
final List<LobbyPlayer> players;
final bool isHost;
final int youSeat; // جایگاهِ مطلقِ خودِ کاربر (برای چیدمانِ صحنه)
final int remaining;
final bool unlimited;
const TableLobby({
required this.code,
required this.players,
required this.isHost,
required this.youSeat,
required this.remaining,
required this.unlimited,
});
@@ -29,15 +32,19 @@ class TableLobby {
code: (j['code'] ?? '') as String,
players: ((j['players'] as List?) ?? [])
.map((e) => LobbyPlayer(
(e['name'] ?? '') as String, (e['host'] ?? false) as bool))
(e['name'] ?? '') as String,
(e['host'] ?? false) as bool,
(e['seat'] ?? 0) as int,
))
.toList(),
isHost: (j['host'] ?? false) as bool,
youSeat: (j['you_seat'] ?? 0) as int,
remaining: (j['remaining'] ?? 0) as int,
unlimited: (j['unlimited'] ?? false) as bool,
);
String get sig => '$code|$isHost|$remaining|$unlimited|'
'${players.map((p) => '${p.name}${p.host ? '*' : ''}').join(',')}';
String get sig => '$code|$isHost|$youSeat|$remaining|$unlimited|'
'${players.map((p) => '${p.name}${p.host ? '*' : ''}@${p.seat}').join(',')}';
}
class GameUiState extends Equatable {