From 46c004476704c2e0ef380873b0eec419ac4ade1e Mon Sep 17 00:00:00 2001 From: devZoGok Date: Thu, 17 Apr 2025 20:15:26 +0300 Subject: [PATCH] accessible trading screen --- Assets/Scripts/Gui/main.lua | 2 +- Assets/Scripts/Gui/tradingHub.lua | 3 +- CMakeLists.txt | 2 +- activeGameState.cpp | 12 ++++--- activeGameState.h | 18 ++++++++--- activeStateBackButton.cpp | 21 ++++++++++++ activeStateBackButton.h | 15 +++++++++ activeStateButton.cpp | 25 +++++++++++---- concreteGuiManager.cpp | 6 ++-- concreteGuiManager.h | 4 +-- game.cpp | 4 +-- playerTradeButton.cpp | 53 +++++++++++++++---------------- tradingScreenButton.cpp | 6 ++-- 13 files changed, 116 insertions(+), 55 deletions(-) create mode 100644 activeStateBackButton.cpp create mode 100644 activeStateBackButton.h diff --git a/Assets/Scripts/Gui/main.lua b/Assets/Scripts/Gui/main.lua index 5664fdb..828c015 100644 --- a/Assets/Scripts/Gui/main.lua +++ b/Assets/Scripts/Gui/main.lua @@ -31,7 +31,7 @@ ButtonType = { SELL_REFINEDS = 27, BUY_RESEARCH = 28, SELL_RESEARCH = 29, - ACTIVE_GAME_STATE = 30, + ACTIVE_STATE_BACK = 30, PLAYER_TRADE = 31, TRADING_SCREEN = 32, TRADE_OFFER = 33, diff --git a/Assets/Scripts/Gui/tradingHub.lua b/Assets/Scripts/Gui/tradingHub.lua index 065387a..945dfba 100644 --- a/Assets/Scripts/Gui/tradingHub.lua +++ b/Assets/Scripts/Gui/tradingHub.lua @@ -16,9 +16,8 @@ gui = { }, { guiType = GuiType.BUTTON, - buttonType = ButtonType.ACTIVE_GAME_STATE, + buttonType = ButtonType.ACTIVE_STATE_BACK, name = 'Back', - guiScreen = 'activeGameState.lua', pos = {x = HubPos.x + HubSize.x - buttonSize.x - HubMargin.right, y = HubPos.y + HubSize.y - buttonSize.y - HubMargin.bottom, z = .11}, size = buttonSize, trigger = 10 diff --git a/CMakeLists.txt b/CMakeLists.txt index 4c6d671..f8c479b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -17,7 +17,7 @@ cmake_policy(SET CMP0015 NEW) set(UNIT_BUTTONS unitButton.cpp tradeButton.cpp buildButton.cpp trainButton.cpp researchButton.cpp orderButton.cpp stateToggleButton.cpp) set(OPTIONS_BUTTONS optionsButton.cpp tabButton.cpp okButton.cpp defaultsButton.cpp) -set(TRADING_BUTTONS playerTradeButton.cpp tradingScreenButton.cpp offerButton.cpp resourceAmmountButton.cpp) +set(TRADING_BUTTONS activeStateBackButton.cpp playerTradeButton.cpp tradingScreenButton.cpp offerButton.cpp resourceAmmountButton.cpp) set(MENU_BUTTONS mainMenuButton.cpp singlePlayerButton.cpp exitButton.cpp backButton.cpp playButton.cpp) set(MAP_EDITOR_BUTTONS mapEditorButton.cpp newMapButton.cpp loadMapButton.cpp exportButton.cpp) set(BUTTONS statsButton.cpp activeStateButton.cpp minimapButton.cpp ${TRADING_BUTTONS} ${OPTIONS_BUTTONS} ${MENU_BUTTONS} ${MAP_EDITOR_BUTTONS} ${UNIT_BUTTONS}) diff --git a/activeGameState.cpp b/activeGameState.cpp index efdf7f4..3546dc8 100755 --- a/activeGameState.cpp +++ b/activeGameState.cpp @@ -243,6 +243,12 @@ namespace battleship{ fc->removeGameObjectFrames(); } + if(!tradingScreen){ + guiTexts = guiManager->getTexts(); + guiRects = guiManager->getGuiRectangles(); + guiButtons = guiManager->getButtons(); + } + renderUnits(); vector currSelectedUnits = mainPlayer->getSelectedUnits(); @@ -540,11 +546,9 @@ namespace battleship{ } void ActiveGameState::onAction(int bind, bool isPressed) { + if(tradingScreen || !ConcreteGuiManager::getSingleton()->findClickedButtons().empty()) return; + GameObjectFrameController *ufCtr = GameObjectFrameController::getSingleton(); - - if(!ConcreteGuiManager::getSingleton()->findClickedButtons().empty()) - return; - vector selectedUnits = mainPlayer->getSelectedUnits(); switch((Bind)bind){ diff --git a/activeGameState.h b/activeGameState.h index 579e50e..7d81569 100755 --- a/activeGameState.h +++ b/activeGameState.h @@ -42,8 +42,10 @@ namespace battleship{ void onRawMouseWheelScroll(bool); inline CursorState getCursorState(){return cursorState;} inline void setCursorState(CursorState cs){this->cursorState = cs;} - inline void addButton(vb01Gui::Button *b){buttons.push_back(b);} - inline std::vector getButtons(){return buttons;} + inline void addButton(vb01Gui::Button *b){guiButtons.push_back(b);} + inline std::vector getGuiButtons(){return guiButtons;} + inline std::vector getGuiRects(){return guiRects;} + inline std::vector getGuiTexts(){return guiTexts;} inline Player* getPlayer(){return mainPlayer;} inline std::vector& getUnitGroup(int i){return unitGroups[i];} inline void setBuildableStructSelected(bool bss){this->buildableStructSelected = bss;} @@ -51,6 +53,10 @@ namespace battleship{ inline float getDepth(){return depth;} inline void setForceCursorState(bool force){this->forceCursorState = force;} inline bool isForceCursorState(){return forceCursorState;} + inline void setTradingScreen(bool ts){this->tradingScreen = ts;} + inline bool isTradingScreen(){return tradingScreen;} + inline void setOfferScreen(bool os){this->offerScreen = os;} + inline bool isOfferScreen(){return offerScreen;} private: bool selectedUnitsAmongst(std::vector); void updateGameObjHoveredOn(); @@ -75,11 +81,13 @@ namespace battleship{ GuiAppState *guiState; std::string unitGuiScreen = ""; GameObject *gameObjHoveredOn = nullptr; - vb01::Node *dragboxNode = nullptr; vb01::Vector2 clickPoint; std::vector unitGroups[9], prevSelectedUnits; std::vector targets; - std::vector buttons, unitButtons; + vb01::Node *dragboxNode = nullptr; + std::vector guiRects; + std::vector guiTexts; + std::vector guiButtons, unitButtons; bool isSelectionBox = false; bool shiftPressed = false; bool controlPressed = false; @@ -90,6 +98,8 @@ namespace battleship{ bool selectingDestOrient = false; bool forceCursorState = false; bool orderPossible = false; + bool tradingScreen = false; + bool offerScreen = false; int playerId, zooms = 0; const int NUM_MAX_ZOOMS = 10; float depth = 1; diff --git a/activeStateBackButton.cpp b/activeStateBackButton.cpp new file mode 100644 index 0000000..5610986 --- /dev/null +++ b/activeStateBackButton.cpp @@ -0,0 +1,21 @@ +#include "activeStateBackButton.h" +#include "activeGameState.h" +#include "gameManager.h" + +#include + +namespace battleship{ + using namespace std; + using namespace vb01; + using namespace gameBase; + + ActiveStateBackButton::ActiveStateBackButton(Vector3 pos, Vector2 size, string name) : BackButton(pos, size, name, "activeGameState.lua"){} + + void ActiveStateBackButton::onClick(){ + StateManager *stateManager = GameManager::getSingleton()->getStateManager(); + ActiveGameState *activeState = (ActiveGameState*)stateManager->getAppStateByType((int)AppStateType::ACTIVE_STATE); + activeState->setTradingScreen(false); + + BackButton::onClick(); + } +} diff --git a/activeStateBackButton.h b/activeStateBackButton.h new file mode 100644 index 0000000..ad57879 --- /dev/null +++ b/activeStateBackButton.h @@ -0,0 +1,15 @@ +#ifndef ACTIVE_STATE_BACK_BUTTON_H +#define ACTIVE_STATE_BACK_BUTTON_H + +#include "backButton.h" + +namespace battleship{ + class ActiveStateBackButton : public BackButton{ + public: + ActiveStateBackButton(vb01::Vector3, vb01::Vector2, std::string); + void onClick(); + private: + }; +} + +#endif diff --git a/activeStateButton.cpp b/activeStateButton.cpp index 529495d..703b6f7 100644 --- a/activeStateButton.cpp +++ b/activeStateButton.cpp @@ -18,15 +18,28 @@ namespace battleship{ using namespace vb01Gui; using namespace gameBase; - ActiveStateButton::ActiveStateButton(Vector3 pos, Vector2 size, string gs, string name, string fontPath, int trigger, string imagePath) : Button(pos, size, name, fontPath, trigger, true, imagePath), guiScreen(gs){ + ActiveStateButton::ActiveStateButton(Vector3 pos, Vector2 size, string gs, string name, string fontPath, int trigger, string imagePath) : + Button(pos, size, name, fontPath, trigger, true, imagePath), guiScreen(gs){} + + void ActiveStateButton::onClick(){ StateManager *stateManager = GameManager::getSingleton()->getStateManager(); ActiveGameState *activeState = (ActiveGameState*)stateManager->getAppStateByType((int)AppStateType::ACTIVE_STATE); - if(activeState) - activeState->addButton(this); - } + vector buttons = activeState->getGuiButtons(); + buttons.push_back(this); - void ActiveStateButton::onClick(){ - ConcreteGuiManager::getSingleton()->parseLuaScript(guiScreen); + vector rects = activeState->getGuiRects(); + vector texts = activeState->getGuiTexts(); + + ConcreteGuiManager::getSingleton()->readLuaScreenScript( + guiScreen, + buttons, + vector{}, + vector{}, + vector{}, + vector{}, + rects, + texts + ); } } diff --git a/concreteGuiManager.cpp b/concreteGuiManager.cpp index 3ef3762..0d12268 100644 --- a/concreteGuiManager.cpp +++ b/concreteGuiManager.cpp @@ -36,6 +36,7 @@ #include "orderButton.h" #include "stateToggleButton.h" #include "minimapButton.h" +#include "activeStateBackButton.h" namespace battleship{ using namespace std; @@ -207,9 +208,8 @@ namespace battleship{ case SELL_RESEARCH: button = new TradeButton(pos, size, name, (int)guiTable["trigger"], imagePath, (int)SOL_LUA_STATE["UnitId"]["TRADE_CENTER"], TradeButton::Type::SELL_RESEARCH); break; - case ACTIVE_GAME_STATE: - guiScreen = guiTable["guiScreen"]; - button = new ActiveStateButton(pos, size, guiScreen, name, fontBasePath + "batang.ttf", (int)guiTable["trigger"], imagePath); + case ACTIVE_STATE_BACK: + button = new ActiveStateBackButton(pos, size, name); break; case PLAYER_TRADE: guiScreen = guiTable["guiScreen"]; diff --git a/concreteGuiManager.h b/concreteGuiManager.h index 8eaf240..326e1d3 100644 --- a/concreteGuiManager.h +++ b/concreteGuiManager.h @@ -45,14 +45,14 @@ namespace battleship{ SELL_REFINEDS, BUY_RESEARCH, SELL_RESEARCH, - ACTIVE_GAME_STATE, + ACTIVE_STATE_BACK, PLAYER_TRADE, TRADING_SCREEN, TRADE_OFFER, RESOURCE_AMMOUNT, UNIT_STATE, ORDER, - MINIMAP + MINIMAP, }; enum ListboxType { CONTROLS, diff --git a/game.cpp b/game.cpp index b1926f9..f37340a 100644 --- a/game.cpp +++ b/game.cpp @@ -101,13 +101,13 @@ namespace battleship{ if (!paused) { gm->getStateManager()->dettachAppState(activeState); - guiManager->readLuaScreenScript("gamePaused.lua", activeState->getButtons()); + guiManager->readLuaScreenScript("gamePaused.lua", activeState->getGuiButtons()); } else { for(string f : configData::scripts) generateView().script_file(gm->getPath() + f); - guiManager->readLuaScreenScript("inGame.lua", activeState->getButtons()); + guiManager->readLuaScreenScript("inGame.lua", activeState->getGuiButtons()); sol::state_view SOL_LUA_VIEW = generateView(); string gop = SOL_LUA_VIEW["gameObjPrefix"], vfxp = SOL_LUA_VIEW["vfxPrefix"]; AssetManager::getSingleton()->load(gm->getPath() + gop, true); diff --git a/playerTradeButton.cpp b/playerTradeButton.cpp index 2b6ce8b..c5a16dd 100644 --- a/playerTradeButton.cpp +++ b/playerTradeButton.cpp @@ -16,10 +16,15 @@ namespace battleship{ PlayerTradeButton::PlayerTradeButton(Vector3 pos, Vector2 size, string gs, string name, int trigger, string imagePath) : ActiveStateButton(pos, size, gs, name, GameManager::getSingleton()->getPath() + "Fonts/batang.ttf", trigger, imagePath){} void PlayerTradeButton::onClick(){ - ActiveStateButton::onClick(); - StateManager *stateManager = GameManager::getSingleton()->getStateManager(); ActiveGameState *activeState = (ActiveGameState*)stateManager->getAppStateByType((int)AppStateType::ACTIVE_STATE); + + if(activeState->isTradingScreen() && !activeState->isOfferScreen()) return; + else if(!activeState->isTradingScreen()) activeState->setTradingScreen(true); + else if(activeState->isOfferScreen()) activeState->setOfferScreen(false); + + ActiveStateButton::onClick(); + Player *mainPlayer = activeState->getPlayer(); Game *game = Game::getSingleton(); @@ -28,40 +33,32 @@ namespace battleship{ sol::state_view SOL_LUA_VIEW = generateView(); for(int i = 0, lineId = 0; i < players.size(); i++){ - if(players[i] != mainPlayer){ - vector buttons = guiManager->getButtons(); - vector listboxes = guiManager->getListboxes(); - vector checkboxes = guiManager->getCheckboxes(); - vector sliders = guiManager->getSliders(); - vector textboxes = guiManager->getTextboxes(); - vector guiRects = guiManager->getGuiRectangles(); - vector texts = guiManager->getTexts(); + if(players[i] == mainPlayer) continue; - SOL_LUA_VIEW.script("lineId = " + to_string(lineId)); - SOL_LUA_VIEW.script("playerId = " + to_string(i)); - guiManager->readLuaScreenScript("tradingPlayerGuiTray.lua", buttons, listboxes, checkboxes, sliders, textboxes, guiRects, texts); + SOL_LUA_VIEW.script("lineId = " + to_string(lineId)); + SOL_LUA_VIEW.script("playerId = " + to_string(i)); + guiManager->parseLuaScript("tradingPlayerGuiTray.lua"); - vector guiButtons = guiManager->getButtons(); + vector guiButtons = guiManager->getButtons(); - for(int j = guiButtons.size() - 1; j > 0; j--) - if(guiButtons[j]->getName() == "Offer") - ((OfferButton*)guiButtons[j])->setPlayerId(i); + for(int j = guiButtons.size() - 1; j > 0; j--) + if(guiButtons[j]->getName() == "Offer") + ((OfferButton*)guiButtons[j])->setPlayerId(i); - int numListboxes = guiManager->getListboxes().size(); - Listbox *listbox = guiManager->getListboxes()[numListboxes - 1]; - int numOffers = game->findTradeOffers(mainPlayer, players[i]).size(); + int numListboxes = guiManager->getListboxes().size(); + Listbox *listbox = guiManager->getListboxes()[numListboxes - 1]; + int numOffers = game->findTradeOffers(mainPlayer, players[i]).size(); - for(int j = 0; j < numOffers; j++) - listbox->addLine(L"TRADE_OFFER_" + to_wstring(j)); + for(int j = 0; j < numOffers; j++) + listbox->addLine(L"TRADE_OFFER_" + to_wstring(j)); - if(listbox->getNumLines() < listbox->getMaxDisplay()) - listbox->setMaxDisplay(listbox->getNumLines()); + if(listbox->getNumLines() < listbox->getMaxDisplay()) + listbox->setMaxDisplay(listbox->getNumLines()); - int numTexts = guiManager->getTexts().size(); - guiManager->getTexts()[numTexts - 1]->setText(stringToWstring(players[i]->getName())); + int numTexts = guiManager->getTexts().size(); + guiManager->getTexts()[numTexts - 1]->setText(stringToWstring(players[i]->getName())); - lineId++; - } + lineId++; } } } diff --git a/tradingScreenButton.cpp b/tradingScreenButton.cpp index 09059f8..906204a 100644 --- a/tradingScreenButton.cpp +++ b/tradingScreenButton.cpp @@ -27,9 +27,11 @@ namespace battleship{ ConcreteGuiManager *guiManager = ConcreteGuiManager::getSingleton(); Game *game = Game::getSingleton(); + StateManager *stateManager = GameManager::getSingleton()->getStateManager(); + ActiveGameState *activeState = (ActiveGameState*)stateManager->getAppStateByType((int)AppStateType::ACTIVE_STATE); + activeState->setOfferScreen(true); + if(listbox->getNumLines() > 0){ - StateManager *stateManager = GameManager::getSingleton()->getStateManager(); - ActiveGameState *activeState = (ActiveGameState*)stateManager->getAppStateByType((int)AppStateType::ACTIVE_STATE); Player *mainPlayer = activeState->getPlayer(); TradeOffer *tradeOffer = game->findTradeOffers(mainPlayer, game->getPlayer(playerId))[listbox->getSelectedOption()];