Skip to content

Commit

Permalink
Feature: Random map rotation (#27)
Browse files Browse the repository at this point in the history
  • Loading branch information
nerudaj authored Oct 29, 2024
1 parent 4f94912 commit 82e8ae1
Show file tree
Hide file tree
Showing 6 changed files with 60 additions and 3 deletions.
5 changes: 5 additions & 0 deletions changelog.txt
Original file line number Diff line number Diff line change
@@ -1,3 +1,8 @@
Rend 0.10.0 changelog:

UX:
* Random map rotation can be chosen in game setup lobby

Rend 0.9.0 changelog:

Gameplay:
Expand Down
4 changes: 4 additions & 0 deletions src/lib-app/include/app/AppStateGameSetup.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,10 @@ class [[nodiscard]] AppStateGameSetup final : public AppStateLobbyBase

void selectMapPackAndSendUpdate(const std::string& packname);

void adjustMapOrderAndSendUpdate();

void shuffleMapOrder();

void openMapPicker();

void handleMapRotationUpdate();
Expand Down
35 changes: 33 additions & 2 deletions src/lib-app/src/app/AppStateGameSetup.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
#include <app/AppStateMapRotationWrapper.hpp>
#include <atomic>
#include <expected>
#include <random>

AppStateGameSetup::AppStateGameSetup(
dgm::App& app, mem::Rc<DependencyContainer> dic) noexcept
Expand Down Expand Up @@ -74,8 +75,6 @@ void AppStateGameSetup::buildLayoutGameSetupImpl(tgui::Panel::Ptr target)
lobbySettings.gameMode =
static_cast<GameMode>(optionIdx);
sendLobbyUpdate();
// TODO: recompute available mappacks
// and maps within
}))
.addOption(
Strings::AppState::GameSetup::POINTLIMIT,
Expand All @@ -97,6 +96,15 @@ void AppStateGameSetup::buildLayoutGameSetupImpl(tgui::Panel::Ptr target)
lobbySettings.packname,
[this](std::size_t idx)
{ selectMapPackAndSendUpdate(mapPackNames.at(idx)); }))
.addOption(
Strings::AppState::GameSetup::RANDOM_ROTATION,
WidgetBuilder::createCheckbox(
lobbySettings.useRandomMapRotation,
[&](bool value)
{
lobbySettings.useRandomMapRotation = value;
adjustMapOrderAndSendUpdate();
}))
.addOption(
Strings::AppState::GameSetup::SELECT_MAPS,
WidgetBuilder::createButton(
Expand All @@ -122,6 +130,7 @@ void AppStateGameSetup::selectMapPack(const std::string& packname)
[](const std::string& name)
{ return MapSettings { .name = name, .enabled = true }; })
| std::ranges::to<std::vector>();

lobbySettings.mapOrder =
std::views::iota(size_t { 0 }, lobbySettings.mapSettings.size())
| std::ranges::to<std::vector>();
Expand All @@ -130,9 +139,31 @@ void AppStateGameSetup::selectMapPack(const std::string& packname)
void AppStateGameSetup::selectMapPackAndSendUpdate(const std::string& packname)
{
selectMapPack(packname);

if (lobbySettings.useRandomMapRotation) shuffleMapOrder();

sendLobbyUpdate();
}

void AppStateGameSetup::adjustMapOrderAndSendUpdate()
{
if (lobbySettings.useRandomMapRotation)
shuffleMapOrder();
else
std::ranges::sort(lobbySettings.mapOrder);

sendLobbyUpdate();
}

void AppStateGameSetup::shuffleMapOrder()
{
auto&& generator = std::mt19937(std::random_device()());
std::shuffle(
lobbySettings.mapOrder.begin(),
lobbySettings.mapOrder.end(),
generator);
}

void AppStateGameSetup::openMapPicker()
{
mapPickerDialog = mem::Box<MapPickerDialog>(
Expand Down
17 changes: 16 additions & 1 deletion src/lib-app/src/app/AppStateLobbyBase.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -77,10 +77,25 @@ void AppStateLobbyBase::handleMapDownload(const MapDownloadResponse& data)
dic->logger->log(0, "Map downloaded and saved to {}", mapPath.string());
}

std::vector<MapSettings> getOrderedMapList(const LobbySettings& lobbySettings)
{
auto orderedMaplist =
std::views::zip(lobbySettings.mapOrder, lobbySettings.mapSettings)
| std::ranges::to<std::vector>();

std::ranges::sort(
orderedMaplist,
[](auto& a, auto& b) { return std::get<0>(a) < std::get<0>(b); });

return orderedMaplist
| std::views::transform([](const auto& t) { return std::get<1>(t); })
| std::ranges::to<std::vector>();
}

void AppStateLobbyBase::startGame()
{
auto&& maplist =
lobbySettings.mapSettings
getOrderedMapList(lobbySettings)
| std::views::filter([](const MapSettings& ms) { return ms.enabled; })
| std::views::transform([](const MapSettings& ms) { return ms.name; })
| std::ranges::to<std::vector>();
Expand Down
1 change: 1 addition & 0 deletions src/lib-defines/include/Configs/Strings.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,7 @@ namespace Strings
RAWSTRING SERVER_IP = "server ip";
RAWSTRING MAX_NPCS = "maximum number of bots";
RAWSTRING SELECT_PACK = "select map pack";
RAWSTRING RANDOM_ROTATION = "random map rotation";
RAWSTRING SELECT_MAPS = "configure map rotation";
RAWSTRING SELECT_GAMEMODE = "choose game mode";
RAWSTRING GAMEMODE_DM = "deathmatch";
Expand Down
1 change: 1 addition & 0 deletions src/lib-network/include/LobbySettings.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ struct [[nodiscard]] LobbySettings final
std::string packname = "";
std::vector<MapSettings> mapSettings = {};
std::vector<size_t> mapOrder = {};
bool useRandomMapRotation = true;
GameMode gameMode = GameMode::Deathmatch;
int pointlimit = 0;
size_t maxNpcs = 0;
Expand Down

0 comments on commit 82e8ae1

Please sign in to comment.