Cockatrice/tests
BruebachL 5ea16c805f
[Server/Client/Protocol] Shuffle or reorder player seats before a game starts (#7398)
* [Protocol] Add shuffle players option and player order command/event

Adds a 'Shuffle players at start' option to game creation plus a local
player id on the game state so clients can reconcile seat changes, and a
SET_PLAYER_ORDER command (1206) with a PLAYER_ORDER_CHANGED event (2023)
so the game host can set or randomize the seating order.

Took 6 minutes

* [Server] Shuffle and reorder player seats before a game starts

Auto-shuffles the seats at game start when enabled (now for games with
two or more players instead of three or more) and handles the new
SET_PLAYER_ORDER command so the game host or a moderator can reorder or
randomize the seats before the game starts. Re-seating re-keys the
player ids while keeping the per-user game/seat routing and persistent
player records in sync, then broadcasts the new order to everyone.

* [Client] Add shuffle players option and turn order dialog

Adds the 'Shuffle players at start' checkbox to game creation and a
host-only 'Set turn order...' action that opens a dialog to reorder or
randomize the seats before the game starts. Seating changes are shown in
the game's message log.

* [Client] Move the turn order dialog strings into retranslateUi

Follows the DlgInviteToGame convention so the dialog can be retranslated
instead of freezing its strings at construction time.

* [Server] Keep player ids stable across seat shuffles

* [Client] Lay out table and turn order dialog in seat order

* [Server] Send game-joined player list in seat order

* [Client] Reword the shuffle option to match its behaviour

* [Client] Address the seat-order review comments

- Give the game setup checkboxes a row of their own so they no longer
  collide in the create-game dialog
- Rename DlgTurnOrder::randomize() to isRandomizeRequested()
- Document what the ids in GameState::seatOrder mean
- Keep "Set turn order..." in sync with the game: hidden for non-hosts
  and once the game has started, re-shown when the game ends or hosting
  moves to the local player (new GameState::hostChanged signal)

* [Client] Do not preview a randomized turn order

Randomizing is a request to the server, not a local shuffle. Shuffling the
list locally meant the dialog showed an order the server then discarded, and
let the host re-open it until a favourable order appeared. The dialog now
switches to a mode that says the server will randomize and toggles back to the
manual list on request.

* [Client] Let moderators set the turn order

The server accepts SET_PLAYER_ORDER from the host or a moderator, but the
client hid the action from everyone except the host, making the moderator
branch unreachable. Visibility and the handler now share canSetTurnOrder().

* [Server] Rely on the player order event instead of a full state resend

cmdSetPlayerOrder re-sent the whole game state after reseating, so every
client reloaded its deck view mid-lobby for no reason. The new seating reaches
clients through the Event_PlayerOrderChanged that reseatPlayers broadcasts.

* [Client] Show random turn order in the game selector

The restrictions column listed "open decklists" but not the new seating
option, so a joining player had no way to see that seats will be randomized
each game. Game info already shows the disabled checkbox.

---------

Co-authored-by: Lukas Brübach <Bruebach.Lukas@bdosecurity.de>
2026-11-04 15:44:50 +01:00
..
card_zone_algorithms [Refactor] Move game logic into libcockatrice_game (#7437) 2026-10-31 18:44:15 +01:00
carddatabase [VisualDatabase] Draw the card grid with a model/view (#7701) 2026-11-02 08:35:58 +01:00
deck_list_model Fix deck export and mana group ordering (#7729) 2026-11-04 15:43:38 +01:00
deck_list_zones Fix deck export and mana group ordering (#7729) 2026-11-04 15:43:38 +01:00
game [Tests] Add a headless game logic regression suite (#7702) 2026-11-02 07:35:41 +01:00
loading_from_clipboard Support tab-separated deck imports (#4222) (#7267) 2026-10-11 21:19:10 +02:00
model_contract [Tests] Use QtTest for model contracts and signal spies (#7630) 2026-11-02 07:27:43 +01:00
movecard_tests [Server/Client/Protocol] Shuffle or reorder player seats before a game starts (#7398) 2026-11-04 15:44:50 +01:00
oracle [CI] Publish a gcovr line-coverage report from the test run (#7404) 2026-10-11 15:05:28 +02:00
picture_loader_benchmark [Network] Add a configured QNetworkAccessManager factory (#7628) 2026-10-25 00:33:43 +02:00
settings [Settings] Store server profiles with QSettings arrays (#7629) 2026-11-02 07:30:29 +01:00
support [Tests] Use QtTest for model contracts and signal spies (#7630) 2026-11-02 07:27:43 +01:00
theme_migration [Tests] Register each test case with CTest instead of each test binary (#7399) 2026-10-11 14:50:09 +02:00
card_update_progress_test.cpp [Client] Improve card database update visibility (#7458) 2026-10-09 11:07:48 +02:00
clamped_arithmetic_test.cpp [Tooling] Apply include-what-you-use across the tree (#7396) 2026-10-08 11:13:50 +02:00
client_login_status_test.cpp [Server/Client] Enforce and complete the forced password change at login (#7680) 2026-11-02 07:01:29 +01:00
CMakeLists.txt [Fonts] Add AppFont roles and FontConfig fonts.toml round-trip (#7534) 2026-11-04 07:57:52 +01:00
crash_reporter_test.cpp [CrashReporting] Breakpad capture, session detection and symbol upload (#7523) 2026-10-19 14:57:04 +02:00
deck_hash_performance_test.cpp [Tooling] Apply include-what-you-use across the tree (#7396) 2026-10-08 11:13:50 +02:00
deck_state_manager_test.cpp [Client] Make DeckStateManager::decrementCard remove tokens from the token zone if the token is not in the given zone (#7588) 2026-11-03 10:37:17 +01:00
expression_test.cpp [Tooling] Apply include-what-you-use across the tree (#7396) 2026-10-08 11:13:50 +02:00
font_config_test.cpp [Fonts] Add AppFont roles and FontConfig fonts.toml round-trip (#7534) 2026-11-04 07:57:52 +01:00
forwarded_address_test.cpp [Server] Parse the rightmost address from forwarded header lists (#7586) 2026-10-18 16:53:55 -04:00
holder_line_test.cpp [CrashReporting] Name the files and processes behind a failed installer purge (#7590) 2026-10-24 00:46:54 +02:00
installer_close_server_test.cpp [Installer] Graceful close and a way out of a stuck update (#7687) 2026-10-31 15:32:59 +01:00
lag_monitor_test.cpp [Tooling] Apply include-what-you-use across the tree (#7396) 2026-10-08 11:13:50 +02:00
latency_tracker_test.cpp [Tooling] Apply include-what-you-use across the tree (#7396) 2026-10-08 11:13:50 +02:00
loader_local_matching_test.cpp [Tests] Scope loader matcher settings to the process to fix parallel-run flakes (#7504) 2026-10-15 12:21:40 +02:00
local_client_lifetime_test.cpp [Client] Fix crash when local game commands are sent after shutdown (#7714) 2026-11-02 13:28:23 +01:00
metrics_registry_test.cpp [Tooling] Apply include-what-you-use across the tree (#7396) 2026-10-08 11:13:50 +02:00
moxfield_signature_spells_test.cpp Import Moxfield signature spells into the deck [skip ci] (#7751) 2026-11-03 10:40:28 +01:00
password_hash_test.cpp [Utility] Budget scrypt's XY array in the derivation memory limit (#7712) 2026-11-02 07:29:15 +01:00
payload_paths_test.cpp [Installer] Name only the payload programs installed in the directory (#7684) 2026-10-30 13:16:50 +01:00
playmat_resolver_test.cpp [Tooling] Apply include-what-you-use across the tree (#7396) 2026-10-08 11:13:50 +02:00
rate_limiter_test.cpp [Server] Inform client of login/registration rate limit timeout (#7468) 2026-10-16 05:47:43 +02:00
report_categories_test.cpp [Tooling] Apply include-what-you-use across the tree (#7396) 2026-10-08 11:13:50 +02:00
server_card_counter_test.cpp [Build] Let AUTOMOC process library headers (#7638) 2026-10-31 18:49:05 +01:00
server_counter_test.cpp [Tooling] Apply include-what-you-use across the tree (#7396) 2026-10-08 11:13:50 +02:00
server_developer_role_test.cpp [Tooling] Apply include-what-you-use across the tree (#7396) 2026-10-08 11:13:50 +02:00
server_dump_zone_test.cpp [Server] Resolve a zone dump request to an in-range index span (#7401) 2026-10-13 11:23:13 +02:00
server_forced_password_change_test.cpp [Server/Client] Enforce and complete the forced password change at login (#7680) 2026-11-02 07:01:29 +01:00
server_game_join_test.cpp [ServerGame] Refactor out spectator/judge bools into RoleInfo (#7761) 2026-11-02 00:37:05 -07:00
server_logger_test.cpp [CardDB] Break the CardInfo <-> CardSet cycle on reload (#7645) 2026-10-31 19:37:15 +01:00
server_moderator_role_test.cpp [Report] Add report reopen action for closed reports (#7442) 2026-10-11 15:28:45 +02:00
server_rate_limiter_test.cpp [Tooling] Apply include-what-you-use across the tree (#7396) 2026-10-08 11:13:50 +02:00
server_room_channels_test.cpp [Servatrice] Log room channel messages in audit log (#7479) 2026-10-16 22:46:39 +02:00
single_instance_manager_test.cpp [Tooling] Apply include-what-you-use across the tree (#7396) 2026-10-08 11:13:50 +02:00
test_age_formatting.cpp [Tooling] Apply include-what-you-use across the tree (#7396) 2026-10-08 11:13:50 +02:00
translation_loader_test.cpp [Translation] Name languages without reading the translation files (#7662) 2026-10-26 02:39:26 +01:00
translation_loader_test.ts [Translations] Load Qt's own translations and build ours with the binary (#7384) 2026-10-03 15:04:30 +02:00
trusted_sources_test.cpp [Servatrice] Match trusted_sources by address, not substring (#7582) 2026-10-18 16:50:04 -04:00
user_data_backup_test.cpp [Installer][Client] Back up user data before old uninstallers can delete it (#7503) 2026-10-16 22:05:42 +02:00
user_games_model_test.cpp Fix user card games for offline users and stale requests (#7738) 2026-11-04 05:29:51 +01:00
warning_categories_test.cpp [Tooling] Apply include-what-you-use across the tree (#7396) 2026-10-08 11:13:50 +02:00