From 0c4f4daf70d0861d07c501c5df2275aad6efb7c6 Mon Sep 17 00:00:00 2001 From: Michael <13953785+Laserlicht@users.noreply.github.com> Date: Sat, 12 Aug 2023 15:05:26 +0200 Subject: [PATCH] base rendering --- client/lobby/OptionsTab.cpp | 143 +++++++++++++++++++++++++++--------- client/lobby/OptionsTab.h | 7 +- 2 files changed, 112 insertions(+), 38 deletions(-) diff --git a/client/lobby/OptionsTab.cpp b/client/lobby/OptionsTab.cpp index ff57477d9..fe8155395 100644 --- a/client/lobby/OptionsTab.cpp +++ b/client/lobby/OptionsTab.cpp @@ -422,13 +422,14 @@ OptionsTab::SelectionWindow::SelectionWindow(PlayerSettings settings, PlayerInfo OBJ_CONSTRUCTION_CAPTURING_ALL_NO_DISPOSE; - pos = Rect(0, 0, 700, 700); + pos = Rect(0, 0, (ELEMENTS_PER_LINE * 2 + 5) * 58, 700); backgroundTexture = std::make_shared<CFilledTexture>("DIBOXBCK", pos); updateShadow(); genContentCastles(settings, playerInfo); genContentHeroes(settings, playerInfo); + genContentBonus(settings, playerInfo); center(); } @@ -438,13 +439,13 @@ void OptionsTab::SelectionWindow::genContentCastles(PlayerSettings settings, Pla PlayerSettings set = PlayerSettings(); set.castle = set.RANDOM; CPlayerSettingsHelper helper = CPlayerSettingsHelper(set, SelType::TOWN); - components.push_back(std::make_shared<CAnimImage>(helper.getImageName(), helper.getImageIndex(), 0, (ELEMENTS_PER_LINE / 2) * 58 + (58 - 48) / 2, (64 - 32) / 2)); + components.push_back(std::make_shared<CAnimImage>(helper.getImageName(), helper.getImageIndex(), 0, (ELEMENTS_PER_LINE / 2) * 58 + 34, 32 / 2 + 64)); int i = 0; for(auto & elem : playerInfo.allowedFactions) { - int x = i % ELEMENTS_PER_LINE; - int y = i / ELEMENTS_PER_LINE + 1; + int x = i % ELEMENTS_PER_LINE + 1; + int y = i / ELEMENTS_PER_LINE + 2; PlayerSettings set = PlayerSettings(); set.castle = elem; @@ -460,6 +461,11 @@ void OptionsTab::SelectionWindow::genContentCastles(PlayerSettings settings, Pla void OptionsTab::SelectionWindow::genContentHeroes(PlayerSettings settings, PlayerInfo playerInfo) { + PlayerSettings set = PlayerSettings(); + set.castle = set.RANDOM; + CPlayerSettingsHelper helper = CPlayerSettingsHelper(set, SelType::HERO); + components.push_back(std::make_shared<CAnimImage>(helper.getImageName(), helper.getImageIndex(), 0, (ELEMENTS_PER_LINE / 2) * 58 + (ELEMENTS_PER_LINE + 1) * 58 + 34, 32 / 2 + 64)); + std::vector<bool> allowedHeroesFlag = SEL->getMapInfo()->mapHeader->allowedHeroes; std::set<HeroTypeID> allowedHeroes; @@ -470,16 +476,40 @@ void OptionsTab::SelectionWindow::genContentHeroes(PlayerSettings settings, Play int i = 0; for(auto & elem : allowedHeroes) { - int x = (i % ELEMENTS_PER_LINE) + (ELEMENTS_PER_LINE + 1); - int y = i / ELEMENTS_PER_LINE + 1; + CHero * type = VLC->heroh->objects[elem]; - PlayerSettings set = PlayerSettings(); - set.hero = elem; + if(type->heroClass->faction == settings.castle) + { - CPlayerSettingsHelper helper = CPlayerSettingsHelper(set, SelType::HERO); + int x = (i % ELEMENTS_PER_LINE) + ELEMENTS_PER_LINE + 2; + int y = i / ELEMENTS_PER_LINE + 2; - components.push_back(std::make_shared<CAnimImage>(helper.getImageName(true), helper.getImageIndex(true), 0, x * 58, y * 64)); - heroes.push_back(elem); + PlayerSettings set = PlayerSettings(); + set.hero = elem; + + CPlayerSettingsHelper helper = CPlayerSettingsHelper(set, SelType::HERO); + + components.push_back(std::make_shared<CAnimImage>(helper.getImageName(true), helper.getImageIndex(true), 0, x * 58, y * 64)); + heroes.push_back(elem); + + i++; + } + } +} + +void OptionsTab::SelectionWindow::genContentBonus(PlayerSettings settings, PlayerInfo playerInfo) +{ + PlayerSettings set = PlayerSettings(); + + int i = 0; + for(auto elem : {set.RANDOM, set.ARTIFACT, set.GOLD, set.RESOURCE}) + { + int x = ELEMENTS_PER_LINE * 2 + 3; + int y = i + 1; + + set.bonus = elem; + CPlayerSettingsHelper helper = CPlayerSettingsHelper(set, SelType::BONUS); + components.push_back(std::make_shared<CAnimImage>(helper.getImageName(), helper.getImageIndex(), 0, x * 58, y * 64 + 32 / 2)); i++; } @@ -495,11 +525,11 @@ void OptionsTab::SelectionWindow::apply() FactionID OptionsTab::SelectionWindow::getElementCastle(const Point & cursorPosition) { - Point loc = getElement(cursorPosition); + Point loc = getElement(cursorPosition, 0); FactionID faction; faction = PlayerSettings().NONE; - if (loc.x == ELEMENTS_PER_LINE / 2 && loc.y == 0) + if ((loc.x == ELEMENTS_PER_LINE / 2 || loc.x == ELEMENTS_PER_LINE / 2 - 1) && loc.y == 0) faction = PlayerSettings().RANDOM; else if(loc.y > 0 && loc.x < ELEMENTS_PER_LINE) { @@ -511,56 +541,99 @@ FactionID OptionsTab::SelectionWindow::getElementCastle(const Point & cursorPosi return faction; } -SHeroName OptionsTab::SelectionWindow::getElementHero(const Point & cursorPosition) +HeroTypeID OptionsTab::SelectionWindow::getElementHero(const Point & cursorPosition) { - return SHeroName(); //TODO + Point loc = getElement(cursorPosition, 1); + + HeroTypeID hero; + hero = PlayerSettings().NONE; + + if(loc.x < 0) + return hero; + + if ((loc.x == ELEMENTS_PER_LINE / 2 || loc.x == ELEMENTS_PER_LINE / 2 - 1) && loc.y == 0) + hero = PlayerSettings().RANDOM; + else if(loc.y > 0 && loc.x < ELEMENTS_PER_LINE) + { + int index = loc.x + (loc.y - 1) * ELEMENTS_PER_LINE; + if (index < heroes.size()) + hero = heroes[loc.x + (loc.y - 1) * ELEMENTS_PER_LINE]; + } + + return hero; } int OptionsTab::SelectionWindow::getElementBonus(const Point & cursorPosition) { - return PlayerSettings::Ebonus::NONE; //TODO + Point loc = getElement(cursorPosition, 2); + + if(loc.x != 0 || loc.y < 0 || loc.y > 3) + return -2; + + return loc.y - 1; } -Point OptionsTab::SelectionWindow::getElement(const Point & cursorPosition) +Point OptionsTab::SelectionWindow::getElement(const Point & cursorPosition, int area) { - int x = (cursorPosition.x - pos.x) / 58; + int x = (cursorPosition.x - pos.x - area * (ELEMENTS_PER_LINE + 1) * 58) / 58; int y = (cursorPosition.y - pos.y) / 64; - return Point(x, y); + return Point(x - 1, y - 1); } void OptionsTab::SelectionWindow::clickReleased(const Point & cursorPosition) { FactionID faction = getElementCastle(cursorPosition); + HeroTypeID hero = getElementHero(cursorPosition); + int bonus = getElementBonus(cursorPosition); PlayerSettings set = PlayerSettings(); set.castle = faction; - CPlayerSettingsHelper helper = CPlayerSettingsHelper(set, SelType::TOWN); + set.hero = hero; + set.bonus = static_cast<PlayerSettings::Ebonus>(bonus); - // cases when we do not need to display proceed - if(set.castle == -2 && helper.type == TOWN) - return; - if(set.hero == -2 && helper.type == HERO) - return; - - if(faction != PlayerSettings().NONE) + if(set.castle != -2) + { + //CPlayerSettingsHelper helper = CPlayerSettingsHelper(set, SelType::TOWN); apply(); + } + else if(set.hero != -2) + { + //CPlayerSettingsHelper helper = CPlayerSettingsHelper(set, SelType::HERO); + apply(); + } + else if(set.bonus != -2) + { + //CPlayerSettingsHelper helper = CPlayerSettingsHelper(set, SelType::BONUS); + apply(); + } } void OptionsTab::SelectionWindow::showPopupWindow(const Point & cursorPosition) { FactionID faction = getElementCastle(cursorPosition); + HeroTypeID hero = getElementHero(cursorPosition); + int bonus = getElementBonus(cursorPosition); PlayerSettings set = PlayerSettings(); set.castle = faction; - CPlayerSettingsHelper helper = CPlayerSettingsHelper(set, SelType::TOWN); + set.hero = hero; + set.bonus = static_cast<PlayerSettings::Ebonus>(bonus); - // cases when we do not need to display a message - if(set.castle == -2 && helper.type == TOWN) - return; - if(set.hero == -2 && helper.type == HERO) - return; - - GH.windows().createAndPushWindow<CPlayerOptionTooltipBox>(helper); + if(set.castle != -2) + { + CPlayerSettingsHelper helper = CPlayerSettingsHelper(set, SelType::TOWN); + GH.windows().createAndPushWindow<CPlayerOptionTooltipBox>(helper); + } + else if(set.hero != -2) + { + CPlayerSettingsHelper helper = CPlayerSettingsHelper(set, SelType::HERO); + GH.windows().createAndPushWindow<CPlayerOptionTooltipBox>(helper); + } + else if(set.bonus != -2) + { + CPlayerSettingsHelper helper = CPlayerSettingsHelper(set, SelType::BONUS); + GH.windows().createAndPushWindow<CPlayerOptionTooltipBox>(helper); + } } OptionsTab::SelectedBox::SelectedBox(Point position, PlayerSettings & settings, PlayerInfo & playerInfo, SelType type) diff --git a/client/lobby/OptionsTab.h b/client/lobby/OptionsTab.h index 0e8172791..7a62753c4 100644 --- a/client/lobby/OptionsTab.h +++ b/client/lobby/OptionsTab.h @@ -97,7 +97,7 @@ public: class SelectionWindow : public CWindowObject { - const int ELEMENTS_PER_LINE = 5; + const int ELEMENTS_PER_LINE = 4; std::shared_ptr<CFilledTexture> backgroundTexture; std::vector<std::shared_ptr<CIntObject>> components; @@ -107,12 +107,13 @@ public: void genContentCastles(PlayerSettings settings, PlayerInfo playerInfo); void genContentHeroes(PlayerSettings settings, PlayerInfo playerInfo); + void genContentBonus(PlayerSettings settings, PlayerInfo playerInfo); void apply(); FactionID getElementCastle(const Point & cursorPosition); - SHeroName getElementHero(const Point & cursorPosition); + HeroTypeID getElementHero(const Point & cursorPosition); int getElementBonus(const Point & cursorPosition); - Point getElement(const Point & cursorPosition); + Point getElement(const Point & cursorPosition, int area); void clickReleased(const Point & cursorPosition) override; void showPopupWindow(const Point & cursorPosition) override;