From a83005994b15db58392ab550413f6d67cea105a9 Mon Sep 17 00:00:00 2001 From: DawnFire42 Date: Thu, 5 Mar 2026 23:23:08 -0500 Subject: [PATCH] integrate local game options into main window. Replaces QInputDialog with DlgLocalGameOptions in actSinglePlayer(). The startLocalGame() function now accepts LocalGameOptions, enabling configuration of starting life total and spectator visibility in addition to player count. Also adds user documentation for the local game options flow. --- cockatrice/src/interface/window_main.cpp | 23 ++++++----- cockatrice/src/interface/window_main.h | 4 +- .../extra-pages/user_documentation/index.md | 6 ++- .../local_game/starting_a_local_game.md | 38 +++++++++++++++++++ 4 files changed, 59 insertions(+), 12 deletions(-) create mode 100644 doc/doxygen/extra-pages/user_documentation/local_game/starting_a_local_game.md diff --git a/cockatrice/src/interface/window_main.cpp b/cockatrice/src/interface/window_main.cpp index 3724ff29d..4cc4050d6 100644 --- a/cockatrice/src/interface/window_main.cpp +++ b/cockatrice/src/interface/window_main.cpp @@ -27,6 +27,7 @@ #include "../interface/widgets/dialogs/dlg_forgot_password_challenge.h" #include "../interface/widgets/dialogs/dlg_forgot_password_request.h" #include "../interface/widgets/dialogs/dlg_forgot_password_reset.h" +#include "../interface/widgets/dialogs/dlg_local_game_options.h" #include "../interface/widgets/dialogs/dlg_manage_sets.h" #include "../interface/widgets/dialogs/dlg_register.h" #include "../interface/widgets/dialogs/dlg_settings.h" @@ -49,7 +50,6 @@ #include #include #include -#include #include #include #include @@ -225,16 +225,15 @@ void MainWindow::actDisconnect() void MainWindow::actSinglePlayer() { - bool ok; - int numberPlayers = - QInputDialog::getInt(this, tr("Number of players"), tr("Please enter the number of players."), 1, 1, 8, 1, &ok); - if (!ok) + DlgLocalGameOptions dlg(this); + if (dlg.exec() != QDialog::Accepted) { return; + } - startLocalGame(numberPlayers); + startLocalGame(dlg.getOptions()); } -void MainWindow::startLocalGame(int numberPlayers) +void MainWindow::startLocalGame(const LocalGameOptions &options) { aConnect->setEnabled(false); aRegister->setEnabled(false); @@ -248,7 +247,7 @@ void MainWindow::startLocalGame(int numberPlayers) QList localClients; localClients.append(mainClient); - for (int i = 0; i < numberPlayers - 1; ++i) { + for (int i = 0; i < options.numberPlayers - 1; ++i) { LocalServerInterface *slaveLsi = localServer->newConnection(); LocalClient *slaveClient = new LocalClient(slaveLsi, tr("Player %1").arg(i + 2), SettingsCache::instance().getClientID(), this); @@ -257,7 +256,9 @@ void MainWindow::startLocalGame(int numberPlayers) tabSupervisor->startLocal(localClients); Command_CreateGame createCommand; - createCommand.set_max_players(static_cast(numberPlayers)); + createCommand.set_max_players(static_cast(options.numberPlayers)); + createCommand.set_starting_life_total(options.startingLifeTotal); + createCommand.set_spectators_see_everything(options.spectatorsSeeEverything); mainClient->sendCommand(LocalClient::prepareRoomCommand(createCommand, 0)); } @@ -913,7 +914,9 @@ MainWindow::MainWindow(QWidget *parent) void MainWindow::startupConfigCheck() { if (SettingsCache::instance().debug().getLocalGameOnStartup()) { - startLocalGame(SettingsCache::instance().debug().getLocalGamePlayerCount()); + LocalGameOptions options; + options.numberPlayers = SettingsCache::instance().debug().getLocalGamePlayerCount(); + startLocalGame(options); } if (SettingsCache::instance().getCheckUpdatesOnStartup()) { diff --git a/cockatrice/src/interface/window_main.h b/cockatrice/src/interface/window_main.h index 75b0f5062..0b565c66c 100644 --- a/cockatrice/src/interface/window_main.h +++ b/cockatrice/src/interface/window_main.h @@ -25,6 +25,8 @@ #ifndef WINDOW_H #define WINDOW_H +#include "../game/local_game_options.h" + #include #include #include @@ -137,7 +139,7 @@ private: void createCardUpdateProcess(bool background = false); void exitCardDatabaseUpdate(); - void startLocalGame(int numberPlayers); + void startLocalGame(const LocalGameOptions &options); QList tabMenus; QMenu *cockatriceMenu, *dbMenu, *tabsMenu, *helpMenu, *trayIconMenu; diff --git a/doc/doxygen/extra-pages/user_documentation/index.md b/doc/doxygen/extra-pages/user_documentation/index.md index 3f10a0ac6..387d4241f 100644 --- a/doc/doxygen/extra-pages/user_documentation/index.md +++ b/doc/doxygen/extra-pages/user_documentation/index.md @@ -1,5 +1,9 @@ @page user_reference User Reference - + +## Local Games + +- @subpage starting_local_game + ## Deck Management - @subpage creating_decks diff --git a/doc/doxygen/extra-pages/user_documentation/local_game/starting_a_local_game.md b/doc/doxygen/extra-pages/user_documentation/local_game/starting_a_local_game.md new file mode 100644 index 000000000..8ce696f7d --- /dev/null +++ b/doc/doxygen/extra-pages/user_documentation/local_game/starting_a_local_game.md @@ -0,0 +1,38 @@ +@page starting_local_game Starting a Local Game + +## Overview + +Local games allow you to play Cockatrice offline without connecting to a server. This is useful for testing decks, playing against yourself, or practicing game mechanics. + +## Starting a Local Game + +1. From the main menu, select **Cockatrice** > **Start local game** (or use the keyboard shortcut) +2. The **Local game options** dialog will appear + +## Configuration Options + +### Number of Players + +Set the number of players in the game (1-8). Each player will be assigned a name like "Player 1", "Player 2", etc. + +### Starting Life Total + +Set the starting life total for all players. The default is 20, which is standard for most Magic: The Gathering formats. You can set this to any value from 1 to 99999 to accommodate different formats: +- **20** - Standard, Modern, Legacy, Vintage, Limited +- **40** - Commander/EDH +- **30** - Two-Headed Giant (per team) + +### Spectators Can See Everything + +When enabled, spectators can see all hidden information (hands, face-down cards, etc.). This is useful when streaming or recording gameplay where viewers should see the full game state. + +### Remember Settings + +When checked, your current settings will be saved and automatically loaded the next time you start a local game. This saves time if you frequently use the same configuration. + +## After Starting + +Once you click **OK**, the game will start and you can: +- Load a deck for each player +- Play the game as you would in a multiplayer match +- Switch between players using the player tabs