diff --git a/src/game/Level.cpp b/src/game/Level.cpp index 33be3b3161d869f23acd4eff881714984cb82fc5..b235b10c670bd24ecc2e54b170a1db44a55e70b5 100644 --- a/src/game/Level.cpp +++ b/src/game/Level.cpp @@ -450,7 +450,18 @@ void Level::handleMenuActiveEvents(Engine& engine, SDL_Event& event) m_recruitingMenu.update( (tilePos.first * 16 + 15) * RENDERING_SCALE, (tilePos.second * 16 + 15) * RENDERING_SCALE); - m_recruitingMenu.setOptions(); + m_recruitingMenu.setOptions({ + UnitId::INFANTERY, + UnitId::MECHANIZED_INFANTERY, + UnitId::RECON, + UnitId::APC, + UnitId::ARTILLERY, + UnitId::ANTI_AIR_TANK, + UnitId::ANTI_AIR_MISSILE_LAUNCHER, + UnitId::ROCKET_ARTILLERY, + UnitId::MEDIUM_TANK, + UnitId::NEO_TANK, + UnitId::HEAVY_TANK}); std::cout << "no training here" << std::endl; } } diff --git a/src/game/ui/Recruitingmenu.cpp b/src/game/ui/Recruitingmenu.cpp index 098c229613e7a47c677bf1f9fd2781e796cf2f45..fee0fc106b14857f9079c48b2594836bdf4e42b7 100644 --- a/src/game/ui/Recruitingmenu.cpp +++ b/src/game/ui/Recruitingmenu.cpp @@ -1,50 +1,47 @@ #include "Recruitingmenu.hpp" #include <iostream> #include <SDL_ttf.h> -#include "../Unit.hpp" namespace advanced_wars { - RecruitingMenu::RecruitingMenu() : m_selectedOption(0) { + RecruitingMenu::RecruitingMenu() : m_selectedOption(0), unitNames({ + {UnitId::INFANTERY, {"Infantry", 100}}, + {UnitId::MECHANIZED_INFANTERY, {"Bazooka", 200}}, + {UnitId::RECON, {"Recon", 300}}, + {UnitId::APC, {"APC", 400}}, + {UnitId::ARTILLERY, {"Artillery", 500}}, + {UnitId::ANTI_AIR_TANK, {"AA Tank", 600}}, + {UnitId::ANTI_AIR_MISSILE_LAUNCHER, {"Rocket AA", 700}}, + {UnitId::ROCKET_ARTILLERY, {"MLRS", 800}}, + {UnitId::MEDIUM_TANK, {"Medium Tank", 900}}, + {UnitId::NEO_TANK, {"Neo Tank", 1000}}, + {UnitId::HEAVY_TANK, {"Heavy Tank", 1100}}, + {UnitId::LANDER, {"Lander", 1200}}, + {UnitId::CRUISER, {"Cruiser", 1300}}, + {UnitId::SUBMARINE, {"Submarine", 1400}}, + {UnitId::BATTLESHIP, {"Battleship", 1500}}, + {UnitId::TRANSPORT_HELICOPTER, {"Chinook", 1600}}, + {UnitId::BATTLE_HELICOPTER, {"Helicopter", 1700}}, + {UnitId::FIGHTER, {"Fighter", 1800}}, + {UnitId::BOMBER, {"Bomber", 1900}} + }) { } void RecruitingMenu::setOptions(const std::vector<UnitId> recruitableUnits) { - std::vector<std::string> options; + std::vector<std::pair<std::string, int>> options; + for (UnitId id : recruitableUnits) { - options.push_back(unitIdToString(id)); + options.push_back(unitNames.at(id)); + cost2UnitId.insert(std::make_pair(unitNames.at(id).second, id)); + } m_options = options; m_selectedOption = 0; } - std::string RecruitingMenu::unitIdToString(UnitId id) { - static const std::unordered_map<UnitId, std::string> unitNames = { - {UnitId::INFANTERY, "Infantry"}, - {UnitId::MECHANIZED_INFANTERY, "Mechanized Infantry"}, - {UnitId::RECON, "Recon"}, - {UnitId::APC, "APC"}, - {UnitId::ARTILLERY, "Artillery"}, - {UnitId::ANTI_AIR_TANK, "Anti-Air Tank"}, - {UnitId::ANTI_AIR_MISSILE_LAUNCHER, "Missile Launcher"}, - {UnitId::ROCKET_ARTILLERY, "Rocket Artillery"}, - {UnitId::MEDIUM_TANK, "Medium Tank"}, - {UnitId::NEO_TANK, "Neo Tank"}, - {UnitId::HEAVY_TANK, "Heavy Tank"}, - {UnitId::LANDER, "Lander"}, - {UnitId::CRUISER, "Cruiser"}, - {UnitId::SUBMARINE, "Submarine"}, - {UnitId::BATTLESHIP, "Battleship"}, - {UnitId::TRANSPORT_HELICOPTER, "Transport Helicopter"}, - {UnitId::BATTLE_HELICOPTER, "Battle Helicopter"}, - {UnitId::FIGHTER, "Fighter"}, - {UnitId::BOMBER, "Bomber"} - }; - - } - void RecruitingMenu::render(Engine& engine) { @@ -78,15 +75,18 @@ namespace advanced_wars int spacing = 20; // Abstand zwischen den Optionen // box around options SDL_SetRenderDrawColor(engine.renderer(), 0, 0, 255, 255); - SDL_Rect box = {m_x, m_y - 3, 125, static_cast<int>(m_options.size() * spacing)}; + SDL_Rect box = {m_x, m_y - 3, 150, static_cast<int>(m_options.size() * spacing)}; SDL_RenderFillRect(engine.renderer(), &box); SDL_SetRenderDrawColor(engine.renderer(), 0, 0, 0, 255); + int i = 0; - for (size_t i = 0; i < m_options.size(); ++i) + for (auto& [render_name, cost] : m_options) { + //std::pair<std::string, int> unit_option = unitNames.at(cost2UnitId.at(cost)); + SDL_Surface* textSurface = TTF_RenderText_Solid( - font, m_options[i].c_str(), (i == m_selectedOption) ? yellow : white); + font, render_name.c_str(), (i == m_selectedOption) ? yellow : white); if (!textSurface) { continue; @@ -100,7 +100,7 @@ namespace advanced_wars SDL_Texture* unit_texture = spritesheet->getUnitTextures() .at(static_cast<int>(UnitFaction::URED)) - .at(static_cast<int>(UnitId::INFANTERY)) + .at(static_cast<int>(cost2UnitId.at(cost))) .at(static_cast<int>(UnitState::IDLE)) .first; @@ -119,9 +119,29 @@ namespace advanced_wars }; SDL_RenderCopy(engine.renderer(), unit_texture, &src_rect, &trgt_rect); - + + SDL_Surface* costSurface = TTF_RenderText_Solid( + font, std::to_string(cost).c_str(), (i == m_selectedOption) ? yellow : white); + if (!textSurface) + { + continue; + } + + SDL_Texture* costTexture = SDL_CreateTextureFromSurface(engine.renderer(), costSurface); + + SDL_Rect cost_rect { + m_x + 120 , + m_y + static_cast<int>(i * spacing), + costSurface->w, + costSurface->h + }; + SDL_RenderCopy(engine.renderer(), costTexture, nullptr, &cost_rect); + + SDL_DestroyTexture(costTexture); + SDL_FreeSurface(costSurface); SDL_DestroyTexture(textTexture); SDL_FreeSurface(textSurface); + i++; } TTF_CloseFont(font); @@ -143,11 +163,6 @@ void RecruitingMenu::handleEvent(Engine& engine, SDL_Event& event) } } -std::string RecruitingMenu::getSelectedOption() -{ - return m_options[m_selectedOption]; -} - void RecruitingMenu::update(int x, int y) { this->m_x = x; diff --git a/src/game/ui/Recruitingmenu.hpp b/src/game/ui/Recruitingmenu.hpp index 7577ca6de0597fd1ca880f8ec8e5477af261afbf..a2bfdcb546ddea2841e6a4983b11576ee158e1b4 100644 --- a/src/game/ui/Recruitingmenu.hpp +++ b/src/game/ui/Recruitingmenu.hpp @@ -1,6 +1,7 @@ #pragma once #include "../Scene.hpp" +#include "../Unit.hpp" namespace advanced_wars { @@ -10,10 +11,12 @@ namespace advanced_wars private: size_t m_selectedOption; - std::vector<std::string> m_options; + std::vector<std::pair<std::string, int>> m_options; int m_x; int m_y; - + const std::unordered_map <UnitId ,std::pair <std::string, int>> unitNames; + std::unordered_map<int, UnitId> cost2UnitId; + void handleEvent(Engine& engine, SDL_Event& event); @@ -22,8 +25,6 @@ namespace advanced_wars std::string getSelectedOption(); - std::string unitIdToString(UnitId id); - public: void update(int x, int y);