GlobalLobbyServerSetup.cpp 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. /*
  2. * GlobalLobbyServerSetup.cpp, part of VCMI engine
  3. *
  4. * Authors: listed in file AUTHORS in main folder
  5. *
  6. * License: GNU General Public License v2.0 or later
  7. * Full text of license available in license.txt file, in main folder
  8. *
  9. */
  10. #include "StdInc.h"
  11. #include "GlobalLobbyServerSetup.h"
  12. #include "../CGameInfo.h"
  13. #include "../CServerHandler.h"
  14. #include "../gui/CGuiHandler.h"
  15. #include "../mainmenu/CMainMenu.h"
  16. #include "../widgets/Buttons.h"
  17. #include "../widgets/Images.h"
  18. #include "../widgets/TextControls.h"
  19. #include "../../lib/CConfigHandler.h"
  20. #include "../../lib/CGeneralTextHandler.h"
  21. #include "../../lib/MetaString.h"
  22. GlobalLobbyServerSetup::GlobalLobbyServerSetup()
  23. : CWindowObject(BORDERED)
  24. {
  25. OBJ_CONSTRUCTION_CAPTURING_ALL_NO_DISPOSE;
  26. pos.w = 284;
  27. pos.h = 340;
  28. background = std::make_shared<FilledTexturePlayerColored>(ImagePath::builtin("DiBoxBck"), Rect(0, 0, pos.w, pos.h));
  29. labelTitle = std::make_shared<CLabel>( pos.w / 2, 20, FONT_BIG, ETextAlignment::CENTER, Colors::YELLOW, CGI->generaltexth->translate("vcmi.lobby.room.create"));
  30. labelPlayerLimit = std::make_shared<CLabel>( pos.w / 2, 48, FONT_MEDIUM, ETextAlignment::CENTER, Colors::YELLOW, CGI->generaltexth->translate("vcmi.lobby.room.players.limit"));
  31. labelRoomType = std::make_shared<CLabel>( pos.w / 2, 108, FONT_MEDIUM, ETextAlignment::CENTER, Colors::YELLOW, CGI->generaltexth->translate("vcmi.lobby.room.type"));
  32. labelGameMode = std::make_shared<CLabel>( pos.w / 2, 158, FONT_MEDIUM, ETextAlignment::CENTER, Colors::YELLOW, CGI->generaltexth->translate("vcmi.lobby.room.mode"));
  33. togglePlayerLimit = std::make_shared<CToggleGroup>(nullptr);
  34. togglePlayerLimit->addToggle(2, std::make_shared<CToggleButton>(Point(10 + 39*0, 60), AnimationPath::builtin("RanNum2"), CButton::tooltip(), 0));
  35. togglePlayerLimit->addToggle(3, std::make_shared<CToggleButton>(Point(10 + 39*1, 60), AnimationPath::builtin("RanNum3"), CButton::tooltip(), 0));
  36. togglePlayerLimit->addToggle(4, std::make_shared<CToggleButton>(Point(10 + 39*2, 60), AnimationPath::builtin("RanNum4"), CButton::tooltip(), 0));
  37. togglePlayerLimit->addToggle(5, std::make_shared<CToggleButton>(Point(10 + 39*3, 60), AnimationPath::builtin("RanNum5"), CButton::tooltip(), 0));
  38. togglePlayerLimit->addToggle(6, std::make_shared<CToggleButton>(Point(10 + 39*4, 60), AnimationPath::builtin("RanNum6"), CButton::tooltip(), 0));
  39. togglePlayerLimit->addToggle(7, std::make_shared<CToggleButton>(Point(10 + 39*5, 60), AnimationPath::builtin("RanNum7"), CButton::tooltip(), 0));
  40. togglePlayerLimit->addToggle(8, std::make_shared<CToggleButton>(Point(10 + 39*6, 60), AnimationPath::builtin("RanNum8"), CButton::tooltip(), 0));
  41. togglePlayerLimit->setSelected(settings["lobby"]["roomPlayerLimit"].Integer());
  42. togglePlayerLimit->addCallback([this](int index){onPlayerLimitChanged(index);});
  43. auto buttonPublic = std::make_shared<CToggleButton>(Point(10, 120), AnimationPath::builtin("GSPBUT2"), CButton::tooltip(), 0);
  44. auto buttonPrivate = std::make_shared<CToggleButton>(Point(146, 120), AnimationPath::builtin("GSPBUT2"), CButton::tooltip(), 0);
  45. buttonPublic->addTextOverlay(CGI->generaltexth->translate("vcmi.lobby.room.public"), EFonts::FONT_SMALL, Colors::YELLOW);
  46. buttonPrivate->addTextOverlay(CGI->generaltexth->translate("vcmi.lobby.room.private"), EFonts::FONT_SMALL, Colors::YELLOW);
  47. toggleRoomType = std::make_shared<CToggleGroup>(nullptr);
  48. toggleRoomType->addToggle(0, buttonPublic);
  49. toggleRoomType->addToggle(1, buttonPrivate);
  50. toggleRoomType->setSelected(settings["lobby"]["roomType"].Integer());
  51. toggleRoomType->addCallback([this](int index){onRoomTypeChanged(index);});
  52. auto buttonNewGame = std::make_shared<CToggleButton>(Point(10, 170), AnimationPath::builtin("GSPBUT2"), CButton::tooltip(), 0);
  53. auto buttonLoadGame = std::make_shared<CToggleButton>(Point(146, 170), AnimationPath::builtin("GSPBUT2"), CButton::tooltip(), 0);
  54. buttonNewGame->addTextOverlay(CGI->generaltexth->translate("vcmi.lobby.room.new"), EFonts::FONT_SMALL, Colors::YELLOW);
  55. buttonLoadGame->addTextOverlay(CGI->generaltexth->translate("vcmi.lobby.room.load"), EFonts::FONT_SMALL, Colors::YELLOW);
  56. toggleGameMode = std::make_shared<CToggleGroup>(nullptr);
  57. toggleGameMode->addToggle(0, buttonNewGame);
  58. toggleGameMode->addToggle(1, buttonLoadGame);
  59. toggleGameMode->setSelected(settings["lobby"]["roomMode"].Integer());
  60. toggleGameMode->addCallback([this](int index){onGameModeChanged(index);});
  61. labelDescription = std::make_shared<CTextBox>("", Rect(10, 195, pos.w - 20, 80), 1, FONT_SMALL, ETextAlignment::TOPLEFT, Colors::WHITE);
  62. buttonCreate = std::make_shared<CButton>(Point(10, 300), AnimationPath::builtin("MuBchck"), CButton::tooltip(), [this](){ onCreate(); });
  63. buttonClose = std::make_shared<CButton>(Point(210, 300), AnimationPath::builtin("MuBcanc"), CButton::tooltip(), [this](){ onClose(); });
  64. background->playerColored(PlayerColor(1));
  65. updateDescription();
  66. center();
  67. }
  68. void GlobalLobbyServerSetup::updateDescription()
  69. {
  70. MetaString description;
  71. description.appendRawString("%s %s %s");
  72. if(toggleRoomType->getSelected() == 0)
  73. description.replaceTextID("vcmi.lobby.room.description.public");
  74. else
  75. description.replaceTextID("vcmi.lobby.room.description.private");
  76. if(toggleGameMode->getSelected() == 0)
  77. description.replaceTextID("vcmi.lobby.room.description.new");
  78. else
  79. description.replaceTextID("vcmi.lobby.room.description.load");
  80. description.replaceTextID("vcmi.lobby.room.description.limit");
  81. description.replaceNumber(togglePlayerLimit->getSelected());
  82. labelDescription->setText(description.toString());
  83. }
  84. void GlobalLobbyServerSetup::onPlayerLimitChanged(int value)
  85. {
  86. Settings config = settings.write["lobby"]["roomPlayerLimit"];
  87. config->Integer() = value;
  88. updateDescription();
  89. }
  90. void GlobalLobbyServerSetup::onRoomTypeChanged(int value)
  91. {
  92. Settings config = settings.write["lobby"]["roomType"];
  93. config->Integer() = value;
  94. updateDescription();
  95. }
  96. void GlobalLobbyServerSetup::onGameModeChanged(int value)
  97. {
  98. Settings config = settings.write["lobby"]["roomMode"];
  99. config->Integer() = value;
  100. updateDescription();
  101. }
  102. void GlobalLobbyServerSetup::onCreate()
  103. {
  104. if(toggleGameMode->getSelected() == 0)
  105. CSH->resetStateForLobby(EStartMode::NEW_GAME, ESelectionScreen::newGame, {});
  106. else
  107. CSH->resetStateForLobby(EStartMode::LOAD_GAME, ESelectionScreen::loadGame, {});
  108. CSH->loadMode = ELoadMode::MULTI;
  109. CSH->startLocalServerAndConnect(true);
  110. buttonCreate->block(true);
  111. buttonClose->block(true);
  112. }
  113. void GlobalLobbyServerSetup::onClose()
  114. {
  115. close();
  116. }