From 410cdeaa0f08b08d45095751954cf9a43f750067 Mon Sep 17 00:00:00 2001 From: devZoGok Date: Thu, 17 Apr 2025 20:08:55 +0300 Subject: [PATCH 01/12] simplified back button --- backButton.cpp | 17 ++++------------- 1 file changed, 4 insertions(+), 13 deletions(-) diff --git a/backButton.cpp b/backButton.cpp index eb40f90..e221666 100644 --- a/backButton.cpp +++ b/backButton.cpp @@ -7,20 +7,11 @@ namespace battleship{ using namespace vb01; using namespace vb01Gui; - BackButton::BackButton(Vector3 pos, Vector2 size, string name, string screen) : Button(pos, size, name, GameManager::getSingleton()->getPath() + "Fonts/batang.ttf", -1, true) { - this->screen = screen; - } + BackButton::BackButton(Vector3 pos, Vector2 size, string name, string scr) : + Button(pos, size, name, GameManager::getSingleton()->getPath() + "Fonts/batang.ttf", -1, true), + screen(scr){} void BackButton::onClick() { - ConcreteGuiManager *guiManager = ConcreteGuiManager::getSingleton(); - guiManager->removeAllButtons(vector{this}); - guiManager->removeAllListboxes(); - guiManager->removeAllCheckboxes(); - guiManager->removeAllSliders(); - guiManager->removeAllTextboxes(); - - guiManager->readLuaScreenScript(screen); - - guiManager->removeButton(this); + ConcreteGuiManager::getSingleton()->readLuaScreenScript(screen); } } From 46c004476704c2e0ef380873b0eec419ac4ade1e Mon Sep 17 00:00:00 2001 From: devZoGok Date: Thu, 17 Apr 2025 20:15:26 +0300 Subject: [PATCH 02/12] 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()]; From 45abdefc1e4a6291ec0b114b974ca1cef3cbf04e Mon Sep 17 00:00:00 2001 From: devZoGok Date: Thu, 17 Apr 2025 20:36:56 +0300 Subject: [PATCH 03/12] clearing GUI elements after parsing --- concreteGuiManager.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/concreteGuiManager.cpp b/concreteGuiManager.cpp index 0d12268..a5a05bb 100644 --- a/concreteGuiManager.cpp +++ b/concreteGuiManager.cpp @@ -534,7 +534,6 @@ namespace battleship{ vector textExceptions ){ removeAllGuiElements(buttonExceptions, listboxExceptions, checkboxExceptions, sliderExceptions, textboxExceptions, guiRectboxExceptions, textExceptions); - guiElements.clear(); parseLuaScript(script); } @@ -556,11 +555,12 @@ namespace battleship{ for(Node *r : guiRectboxs) removeGuiRectangle(r); for(Text *t : texts) removeText(t); - guiElements.clear(); parseLuaScript(script); } void ConcreteGuiManager::parseLuaScript(string script){ + guiElements.clear(); + string basePath = GameManager::getSingleton()->getPath() + "Scripts/Gui/"; sol::state_view SOL_LUA_VIEW = generateView(); SOL_LUA_VIEW.script_file(basePath + script); From abb5e91292a42c76adb7377e6a8e1a6494306fc1 Mon Sep 17 00:00:00 2001 From: devZoGok Date: Sat, 19 Apr 2025 11:10:10 +0300 Subject: [PATCH 04/12] refactored trade offers --- Assets/Scripts/Gui/tradingHub.lua | 3 ++ Assets/Scripts/Gui/tradingPlayerGuiTray.lua | 4 +-- Assets/Scripts/Gui/tradingScreen.lua | 10 +----- game.cpp | 10 ------ game.h | 3 -- offerButton.cpp | 19 +++++------ player.cpp | 35 ++++++++++++++++----- player.h | 7 ++++- playerTradeButton.cpp | 3 +- tradeOffer.h | 23 +++++++------- tradingScreenButton.cpp | 16 +++++----- 11 files changed, 71 insertions(+), 62 deletions(-) diff --git a/Assets/Scripts/Gui/tradingHub.lua b/Assets/Scripts/Gui/tradingHub.lua index 945dfba..552020e 100644 --- a/Assets/Scripts/Gui/tradingHub.lua +++ b/Assets/Scripts/Gui/tradingHub.lua @@ -7,6 +7,9 @@ HubMargin = {top = 10, left = 10, right = 10, bottom = 10} buttonSize = {x = 100, y = 20} textboxSize = {x = 200, y = 25} +warIcon = 'Icons/PlayerStates/war.png' +allianceIcon = 'Icons/PlayerStates/alliance.png' + gui = { { guiType = GuiType.GUI_RECTANGLE, diff --git a/Assets/Scripts/Gui/tradingPlayerGuiTray.lua b/Assets/Scripts/Gui/tradingPlayerGuiTray.lua index dccc609..79098c5 100644 --- a/Assets/Scripts/Gui/tradingPlayerGuiTray.lua +++ b/Assets/Scripts/Gui/tradingPlayerGuiTray.lua @@ -4,8 +4,6 @@ buttonSize = {x = 100, y = 20} textboxSize = {x = 200, y = 20} height = HubPos.y + HubMargin.top + lineId * 30 -warIcon = 'Icons/PlayerStates/war.png' -allianceIcon = 'Icons/PlayerStates/alliance.png' gui = { { @@ -23,7 +21,7 @@ gui = { guiType = GuiType.GUI_RECTANGLE, pos = {x = HubPos.x + HubMargin.left + 100, y = height, z = .11}, size = {x = 50, y = 50}, - imagePath = warIcon + imagePath = relationsIcon }, { pos = {x = HubPos.x + HubMargin.left + 200, y = height + 25, z = .11}, diff --git a/Assets/Scripts/Gui/tradingScreen.lua b/Assets/Scripts/Gui/tradingScreen.lua index 90aa351..2fab363 100644 --- a/Assets/Scripts/Gui/tradingScreen.lua +++ b/Assets/Scripts/Gui/tradingScreen.lua @@ -111,21 +111,13 @@ gui = { createResourceTrayGui(false, 2, ResourceTrayGuiId.TEXTBOX), createResourceTrayGui(false, 2, ResourceTrayGuiId.INCREMENT), createResourceTrayGui(false, 2, ResourceTrayGuiId.DECREMENT), - createResourceTrayGui(true, 3, ResourceTrayGuiId.ICON, IconPath.TIME), - createResourceTrayGui(true, 3, ResourceTrayGuiId.TEXTBOX), - createResourceTrayGui(true, 3, ResourceTrayGuiId.INCREMENT), - createResourceTrayGui(true, 3, ResourceTrayGuiId.DECREMENT), - createResourceTrayGui(false, 3, ResourceTrayGuiId.ICON, IconPath.TIME), - createResourceTrayGui(false, 3, ResourceTrayGuiId.TEXTBOX), - createResourceTrayGui(false, 3, ResourceTrayGuiId.INCREMENT), - createResourceTrayGui(false, 3, ResourceTrayGuiId.DECREMENT), { guiType = GuiType.BUTTON, buttonType = ButtonType.PLAYER_TRADE, name = 'Back', guiScreen = 'tradingHub.lua', - pos = {x = HubPos.x + HubSize.x - 2 * buttonSize.x - HubMargin.right, y = HubPos.y + HubSize.y - buttonSize.y - HubMargin.bottom, z = .2}, + pos = {x = HubPos.x + HubSize.x - 3 * buttonSize.x - HubMargin.right, y = HubPos.y + HubSize.y - buttonSize.y - HubMargin.bottom, z = .2}, size = buttonSize, trigger = 10 }, diff --git a/game.cpp b/game.cpp index f37340a..127d761 100644 --- a/game.cpp +++ b/game.cpp @@ -276,14 +276,4 @@ namespace battleship{ return false; } - - vector Game::findTradeOffers(Player *pl1, Player *pl2){ - vector offers; - - for(TradeOffer *to : tradeOffers) - if((to->initPlayer == pl1 || to->recPlayer == pl1) && (to->initPlayer == pl2 || to->recPlayer == pl2)) - offers.push_back(to); - - return offers; - } } diff --git a/game.h b/game.h index fb34af6..38d077b 100644 --- a/game.h +++ b/game.h @@ -27,9 +27,7 @@ namespace battleship{ void initTechnologies(); float calcAbilFromTech(Ability::Type, std::vector, int, int); bool isUnitUnlocked(std::vector, int); - std::vector findTradeOffers(Player*, Player*); inline void setDebug(bool d){this->debug = d;} - inline void addTradeOffer(TradeOffer *to){tradeOffers.push_back(to);} inline void addPlayer(Player *pl){players.push_back(pl);} inline bool isDebug(){return debug;} inline std::vector& getPlayers(){return players;} @@ -46,7 +44,6 @@ namespace battleship{ std::vector technologies; std::vector abilities; std::vector players; - std::vector tradeOffers; }; } diff --git a/offerButton.cpp b/offerButton.cpp index 7fae80f..1b764ac 100644 --- a/offerButton.cpp +++ b/offerButton.cpp @@ -16,24 +16,25 @@ namespace battleship{ using namespace vb01Gui; using namespace gameBase; - OfferButton::OfferButton(Vector3 pos, Vector2 size, int plId, string name, int trigger, string imagePath) : Button(pos, size, name, GameManager::getSingleton()->getPath() + "Fonts/batang.ttf", trigger, true, imagePath), playerId(plId){} + OfferButton::OfferButton(Vector3 pos, Vector2 size, int plId, string name, int trigger, string imagePath) : + Button(pos, size, name, GameManager::getSingleton()->getPath() + "Fonts/batang.ttf", trigger, true, imagePath), + playerId(plId){} void OfferButton::onClick(){ ConcreteGuiManager *guiManager = ConcreteGuiManager::getSingleton(); vector textboxes = guiManager->getTextboxes(); - int recRef = (textboxes[0]->getText() == L"" ? 0 : stoi(textboxes[0]->getText())); - int initRef = (textboxes[1]->getText() == L"" ? 0 : stoi(textboxes[1]->getText())); - int recWealth = (textboxes[2]->getText() == L"" ? 0 : stoi(textboxes[2]->getText())); - int initWealth = (textboxes[3]->getText() == L"" ? 0 : stoi(textboxes[3]->getText())); - int recRes = (textboxes[4]->getText() == L"" ? 0 : stoi(textboxes[4]->getText())); - int initRes = (textboxes[5]->getText() == L"" ? 0 : stoi(textboxes[5]->getText())); + int buyRef = (textboxes[0]->getText() == L"" ? 0 : stoi(textboxes[0]->getText())); + int sellRef = (textboxes[1]->getText() == L"" ? 0 : stoi(textboxes[1]->getText())); + int buyWealth = (textboxes[2]->getText() == L"" ? 0 : stoi(textboxes[2]->getText())); + int sellWealth = (textboxes[3]->getText() == L"" ? 0 : stoi(textboxes[3]->getText())); + int buyRes = (textboxes[4]->getText() == L"" ? 0 : stoi(textboxes[4]->getText())); + int sellRes = (textboxes[5]->getText() == L"" ? 0 : stoi(textboxes[5]->getText())); StateManager *stateManager = GameManager::getSingleton()->getStateManager(); ActiveGameState *activeState = (ActiveGameState*)stateManager->getAppStateByType((int)AppStateType::ACTIVE_STATE); Player *mainPlayer = activeState->getPlayer(); - Game *game = Game::getSingleton(); - game->addTradeOffer(new TradeOffer(mainPlayer, game->getPlayer(playerId), initRef, recRef, initWealth, recWealth, initRes, recRes)); + mainPlayer->addTradeOffer(Game::getSingleton()->getPlayer(playerId), new TradeOffer(true, true, buyRef, sellRef, buyWealth, sellWealth, buyRes, sellRes)); } } diff --git a/player.cpp b/player.cpp index 95d51ad..968ac45 100755 --- a/player.cpp +++ b/player.cpp @@ -1,9 +1,11 @@ #include +#include #include "player.h" +#include "game.h" #include "structure.h" #include "projectile.h" -#include "stateManager.h" +#include "tradeOffer.h" #include "activeGameState.h" #include "resourceDeposit.h" @@ -213,11 +215,30 @@ namespace battleship{ } } - void Player::build(int id, Vector3 pos, Quaternion rot, bool additionalOrder){ - /* - Unit *buildStruct = GameObjectFactory::createUnit(this, id, pos, rot); - addUnit(buildStruct); - issueOrder(Order::TYPE::BUILD, vector{Order::Target(buildStruct)}, additionalOrder); - */ + void Player::initTradeOffersVec(){ + vector players = Game::getSingleton()->getPlayers(); + + for(Player *pl : players){ + if(this == pl) continue; + + if(team == pl->getTeam()) + tradeOffers.push_back(make_pair(pl, vector{})); + } + } + + void Player::addTradeOffer(Player *player, TradeOffer *offer){ + if(tradeOffers.empty()) initTradeOffersVec(); + + for(pair> &offers : tradeOffers) + if(offers.first == player) + offers.second.push_back(offer); + } + + vector Player::getTradeOffers(Player *player){ + for(pair> offers : tradeOffers) + if(offers.first == player) + return offers.second; + + return vector{}; } } diff --git a/player.h b/player.h index c33b0c4..26791bc 100755 --- a/player.h +++ b/player.h @@ -2,6 +2,7 @@ #define PLAYER_H #include +#include #include "gameManager.h" #include "trader.h" @@ -11,6 +12,7 @@ namespace battleship{ class ResourceDeposit; class Projectile; class Unit; + struct TradeOffer; enum class ResourceType{REFINEDS, WEALTH, RESEARCH}; @@ -32,7 +34,8 @@ namespace battleship{ void addTechnology(int); int getResource(ResourceType); void updateResource(ResourceType, int, bool); - void build(int, vb01::Vector3, vb01::Quaternion, bool); + void addTradeOffer(Player*, TradeOffer*); + std::vector getTradeOffers(Player*); inline Trader* getTrader(){return trader;} inline void deselectUnits(){selectedUnits.clear();} inline Unit* getSelectedUnit(int id){return selectedUnits[id];} @@ -87,8 +90,10 @@ namespace battleship{ std::vector resourceDeposits; vb01::Vector3 color; vb01::Material *colorMaterial = nullptr; + std::vector>> tradeOffers; int getOrderLineId(Order::TYPE, vb01::Vector3, vb01::Vector3); + void initTradeOffersVec(); }; } diff --git a/playerTradeButton.cpp b/playerTradeButton.cpp index c5a16dd..547a15a 100644 --- a/playerTradeButton.cpp +++ b/playerTradeButton.cpp @@ -37,6 +37,7 @@ namespace battleship{ SOL_LUA_VIEW.script("lineId = " + to_string(lineId)); SOL_LUA_VIEW.script("playerId = " + to_string(i)); + SOL_LUA_VIEW.script(string("relationsIcon = ") + (players[i]->getTeam() == mainPlayer->getTeam() ? "allianceIcon" : "warIcon")); guiManager->parseLuaScript("tradingPlayerGuiTray.lua"); vector guiButtons = guiManager->getButtons(); @@ -47,7 +48,7 @@ namespace battleship{ int numListboxes = guiManager->getListboxes().size(); Listbox *listbox = guiManager->getListboxes()[numListboxes - 1]; - int numOffers = game->findTradeOffers(mainPlayer, players[i]).size(); + int numOffers = mainPlayer->getTradeOffers(players[i]).size(); for(int j = 0; j < numOffers; j++) listbox->addLine(L"TRADE_OFFER_" + to_wstring(j)); diff --git a/tradeOffer.h b/tradeOffer.h index a0797d2..f593db3 100644 --- a/tradeOffer.h +++ b/tradeOffer.h @@ -5,19 +5,18 @@ namespace battleship{ struct TradeOffer{ - Player *initPlayer = nullptr, *recPlayer = nullptr; - int initRefineds = 0, recRefineds = 0, initWealth = 0, recWealth = 0, initResearch = 0, recResearch = 0; - bool initPlAgreed = true, recPlAgreed = false; + bool sellerAggrees = true, sellerDelivers = true, buyerAggrees = false, buyerDelivers = false; + int sellRefineds = 0, buyRefineds = 0, sellWealth = 0, buyWealth = 0, sellResearch = 0, buyResearch = 0; - TradeOffer(Player *ip, Player *rp, int ir, int rr, int iw, int rw, int it, int rt) : - initPlayer(ip), - recPlayer(rp), - initRefineds(ir), - recRefineds(rr), - initWealth(iw), - recWealth(rw), - initResearch(it), - recResearch(rr) + TradeOffer(bool bd, bool sd, int br, int sr, int bw, int sw, int bt, int st) : + buyerDelivers(bd), + sellerDelivers(sd), + buyRefineds(br), + buyWealth(bw), + buyResearch(bt), + sellRefineds(sr), + sellWealth(sw), + sellResearch(st) {} }; } diff --git a/tradingScreenButton.cpp b/tradingScreenButton.cpp index 906204a..68714ec 100644 --- a/tradingScreenButton.cpp +++ b/tradingScreenButton.cpp @@ -24,6 +24,8 @@ namespace battleship{ {} void TradingScreenButton::onClick(){ + generateView().script("playerId = " + to_string(playerId)); + ConcreteGuiManager *guiManager = ConcreteGuiManager::getSingleton(); Game *game = Game::getSingleton(); @@ -34,17 +36,17 @@ namespace battleship{ if(listbox->getNumLines() > 0){ Player *mainPlayer = activeState->getPlayer(); - TradeOffer *tradeOffer = game->findTradeOffers(mainPlayer, game->getPlayer(playerId))[listbox->getSelectedOption()]; + TradeOffer *tradeOffer = mainPlayer->getTradeOffers(game->getPlayer(playerId))[listbox->getSelectedOption()]; ActiveStateButton::onClick(); vector textboxes = guiManager->getTextboxes(); - textboxes[0]->setEntry(to_wstring(tradeOffer->recRefineds)); - textboxes[1]->setEntry(to_wstring(tradeOffer->initRefineds)); - textboxes[2]->setEntry(to_wstring(tradeOffer->recWealth)); - textboxes[3]->setEntry(to_wstring(tradeOffer->initWealth)); - textboxes[4]->setEntry(to_wstring(tradeOffer->recResearch)); - textboxes[5]->setEntry(to_wstring(tradeOffer->initResearch)); + textboxes[0]->setEntry(to_wstring(tradeOffer->buyRefineds)); + textboxes[1]->setEntry(to_wstring(tradeOffer->sellRefineds)); + textboxes[2]->setEntry(to_wstring(tradeOffer->buyWealth)); + textboxes[3]->setEntry(to_wstring(tradeOffer->sellWealth)); + textboxes[4]->setEntry(to_wstring(tradeOffer->buyResearch)); + textboxes[5]->setEntry(to_wstring(tradeOffer->sellResearch)); } else ActiveStateButton::onClick(); From 759bdeea794fa9d704252d079f2dfc6b8fb7e45c Mon Sep 17 00:00:00 2001 From: devZoGok Date: Sat, 19 Apr 2025 12:20:50 +0300 Subject: [PATCH 05/12] subtracting research cost --- researchStruct.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/researchStruct.cpp b/researchStruct.cpp index aa57156..b31c89f 100644 --- a/researchStruct.cpp +++ b/researchStruct.cpp @@ -40,7 +40,7 @@ namespace battleship{ if(researchQueue.empty()){ if(health > .3 * maxHealth && player->getResource(ResourceType::REFINEDS) >= researchCost && canUpdateResearch()){ player->updateResource(ResourceType::RESEARCH, generationSpeed, true); - player->updateResource(ResourceType::REFINEDS, researchCost, true); + player->updateResource(ResourceType::REFINEDS, -researchCost, true); lastUpdateTime = getTime(); } From d29d5fdfa57bfa82e0ac6850d54b9016f9c92b59 Mon Sep 17 00:00:00 2001 From: devZoGok Date: Sat, 19 Apr 2025 12:37:50 +0300 Subject: [PATCH 06/12] rovers can transfer different resources --- activeGameState.cpp | 14 +++-- resourceRover.cpp | 128 +++++++++++++++++++++++++++++--------------- resourceRover.h | 9 ++-- 3 files changed, 101 insertions(+), 50 deletions(-) diff --git a/activeGameState.cpp b/activeGameState.cpp index 3546dc8..5f22c2e 100755 --- a/activeGameState.cpp +++ b/activeGameState.cpp @@ -147,7 +147,15 @@ namespace battleship{ bool supply = ( gameObjUnit && - ((Unit*)gameObjHoveredOn)->getUnitClass() == UnitClass::EXTRACTOR && + ( + ( + ((Unit*)gameObjHoveredOn)->getUnitClass() == UnitClass::EXTRACTOR && + ((Extractor*)gameObjHoveredOn)->getDeposit()->getAmmount() + ) | + ((Unit*)gameObjHoveredOn)->getUnitClass() == UnitClass::TRADE_CENTER | + ((Unit*)gameObjHoveredOn)->getUnitClass() == UnitClass::REFINERY | + ((Unit*)gameObjHoveredOn)->getUnitClass() == UnitClass::LAB + ) && mainPlayer->getSelectedUnit(0)->getUnitClass() == UnitClass::RESOURCE_ROVER ); @@ -157,7 +165,7 @@ namespace battleship{ cursorState = CursorState::GARRISON; } else if(supply){ - orderPossible = (ownGameObj && ((Extractor*)gameObjHoveredOn)->getDeposit()->getAmmount()); + orderPossible = ownGameObj; cursorState = CursorState::SUPPLY; } else if(gameObjUnit && !ownGameObj) @@ -169,7 +177,7 @@ namespace battleship{ if(cursorState == CursorState::GARRISON) orderPossible = (ownGameObj && gameObjTransport && canGarrison); else if(cursorState == CursorState::SUPPLY) - orderPossible = (ownGameObj && supply && ((Extractor*)gameObjHoveredOn)->getDeposit()->getAmmount()); + orderPossible = (ownGameObj && supply); else if(cursorState == CursorState::HACK) orderPossible = (!ownGameObj && gameObjUnit && mainPlayer->getSelectedUnit(0)->getUnitClass() == UnitClass::ENGINEER); else if(gameObjUnit) diff --git a/resourceRover.cpp b/resourceRover.cpp index 469bfe9..dbc2ac1 100644 --- a/resourceRover.cpp +++ b/resourceRover.cpp @@ -18,6 +18,8 @@ namespace battleship{ Vector2 size = Vector2(lenHpBar, 10); loadBackground = Unit::createBar(Vector2::VEC_ZERO, size, Vector4(0, 0, 0, 1)); loadForeground = Unit::createBar(Vector2::VEC_ZERO, size, Vector4(1, 1, 0, 1)); + + initProperties(); } ResourceRover::~ResourceRover(){ @@ -26,7 +28,6 @@ namespace battleship{ } void ResourceRover::initProperties(){ - Vehicle::initProperties(); Game *game = Game::getSingleton(); vector currTechs = player->getTechnologies(); @@ -36,54 +37,93 @@ namespace battleship{ loadRate = unitTable["loadRate"]; loadRate += game->calcAbilFromTech(Ability::Type::LOAD_RATE, currTechs, (int)GameObject::type, id); } + //TODO equate rover load and extractor draw rates + void ResourceRover::collectRefineds(Order order, float minDist){ + vector units = player->getUnits(); + vector extractors, refineries; + + for(Unit *unit : units){ + if(unit->getUnitClass() == UnitClass::EXTRACTOR && ((Extractor*)unit)->getDeposit()->getAmmount() > 0) + extractors.push_back((Structure*)unit); + else if(unit->getUnitClass() == UnitClass::REFINERY) + refineries.push_back((Structure*)unit); + } + + nearestExtractor = (Extractor*)getClosestUnit(extractors); + nearestRefinery = getClosestUnit(refineries); + + if(nearestExtractor && nearestExtractor->getPos().getDistanceFrom(pos) <= minDist){ + ResourceDeposit *deposit = nearestExtractor->getDeposit(); + + if(canLoad() && deposit->getAmmount() > 0){ + if(nearestExtractor->canDraw()){ + nearestExtractor->draw(); + load[(int)ResourceType::REFINEDS] += loadSpeed; + lastLoadTime = getTime(); + } + } + else if(calcTotalLoad() == capacity && nearestRefinery) + preparePathpoints(order, nearestRefinery->getPos(), true); + } + else if(!nearestExtractor){ + if(nearestRefinery && load[(int)ResourceType::REFINEDS] > 0) + preparePathpoints(order, nearestRefinery->getPos(), true); + else + removeOrder(0); + } + + if(nearestRefinery && nearestRefinery->getPos().getDistanceFrom(pos) <= minDist){ + if(canUnload((int)ResourceType::REFINEDS)){ + load[(int)ResourceType::REFINEDS] -= loadSpeed; + player->updateResource(ResourceType::REFINEDS, loadSpeed, true); + lastLoadTime = getTime(); + } + else if(load[(int)ResourceType::REFINEDS] == 0 && nearestExtractor) + preparePathpoints(order, nearestExtractor->getPos()); + } + } + + void ResourceRover::transferResource(Structure *targStruct, float minDist){ + bool closeEnough = (pos.getDistanceFrom(targStruct->getPos()) <= minDist); + ResourceType resType; + + switch(targStruct->getUnitClass()){ + case UnitClass::TRADE_CENTER: + resType = ResourceType::WEALTH; + break; + case UnitClass::REFINERY: + resType = ResourceType::REFINEDS; + break; + case UnitClass::LAB: + resType = ResourceType::RESEARCH; + break; + } + + if(closeEnough){ + if(player == targStruct->getPlayer() && canLoad() && player->getResource(resType) > 0){ + player->updateResource(resType, -loadSpeed, true); + load[(int)resType] += loadSpeed; + lastLoadTime = getTime(); + } + else if(player != targStruct->getPlayer() && canUnload((int)resType)){ + targStruct->getPlayer()->updateResource(resType, loadSpeed, true); + load[(int)resType] -= loadSpeed; + lastLoadTime = getTime(); + } + } + } + void ResourceRover::supply(Order order){ float minDist = .5 * Map::getSingleton()->getCellSize().x; - + if(!pathPoints.empty()) navigate(minDist); else{ - vector units = player->getUnits(); - vector extractors, refineries; + Unit *targUnit = order.targets[0].unit; - for(Unit *unit : units){ - if(unit->getUnitClass() == UnitClass::EXTRACTOR && ((Extractor*)unit)->getDeposit()->getAmmount() > 0) - extractors.push_back((Structure*)unit); - else if(unit->getUnitClass() == UnitClass::REFINERY) - refineries.push_back((Structure*)unit); - } - - nearestExtractor = (Extractor*)getClosestUnit(extractors); - nearestRefinery = getClosestUnit(refineries); - - if(nearestExtractor && nearestExtractor->getPos().getDistanceFrom(pos) <= minDist){ - ResourceDeposit *deposit = nearestExtractor->getDeposit(); - - if(canLoad() && deposit->getAmmount() > 0){ - if(nearestExtractor->canDraw()){ - nearestExtractor->draw(); - load += loadSpeed; - lastLoadTime = getTime(); - } - } - else if(load == capacity && nearestRefinery) - preparePathpoints(order, nearestRefinery->getPos(), true); - } - else if(!nearestExtractor){ - if(nearestRefinery && load > 0) - preparePathpoints(order, nearestRefinery->getPos(), true); - else - removeOrder(0); - } - - if(nearestRefinery && nearestRefinery->getPos().getDistanceFrom(pos) <= minDist){ - if(canUnload()){ - load -= loadSpeed; - player->updateResource(ResourceType::REFINEDS, 1, true); - lastLoadTime = getTime(); - } - else if(load == 0 && nearestExtractor) - preparePathpoints(order, nearestExtractor->getPos()); - } + if(targUnit->getUnitClass() == UnitClass::EXTRACTOR) + collectRefineds(order, minDist); + else transferResource((Structure*)targUnit, minDist); } } @@ -100,7 +140,7 @@ namespace battleship{ vector selectingPlayers = getSelectingPlayers(); bool mainPlayerSelecting = (activeState && find(selectingPlayers.begin(), selectingPlayers.end(), mainPlayer) != selectingPlayers.end()); - Unit::displayUnitStats(loadForeground, loadBackground, load, capacity, mainPlayer == player && mainPlayerSelecting, Vector2(0, -10)); + Unit::displayUnitStats(loadForeground, loadBackground, calcTotalLoad(), capacity, mainPlayer == player && mainPlayerSelecting, Vector2(0, -10)); } Unit* ResourceRover::getClosestUnit(vector structs){ diff --git a/resourceRover.h b/resourceRover.h index bd1c637..a518592 100644 --- a/resourceRover.h +++ b/resourceRover.h @@ -17,12 +17,15 @@ namespace battleship{ private: void initProperties(); void supply(Order); + void collectRefineds(Order, float); + void transferResource(Structure*, float); Unit* getClosestUnit(std::vector); - inline bool canLoad(){return vb01::getTime() - lastLoadTime > loadRate && load < capacity;} - inline bool canUnload(){return vb01::getTime() - lastLoadTime > loadRate && load > 0;} + inline bool canLoad(){return vb01::getTime() - lastLoadTime > loadRate && calcTotalLoad() < capacity;} + inline bool canUnload(int id){return vb01::getTime() - lastLoadTime > loadRate && load[id] > 0;} + inline int calcTotalLoad(){return load[0] + load[1] + load[2];} vb01::s64 lastLoadTime = 0; - int load = 0, capacity, loadRate, loadSpeed; + int load[3]{0, 0, 0}, capacity, loadRate, loadSpeed; Extractor *nearestExtractor = nullptr; Unit *nearestRefinery = nullptr; vb01::Node *loadBackground = nullptr, *loadForeground = nullptr; From 50c5f7842d89d992e5b3ba069ee2b5d470bfa6d1 Mon Sep 17 00:00:00 2001 From: devZoGok Date: Sat, 19 Apr 2025 15:53:27 +0300 Subject: [PATCH 07/12] using supply icon when hovering over to buildings to transfer resources to/from --- activeGameState.cpp | 59 ++++++++++++++++++++++++++++++++------------- resourceRover.h | 4 ++- 2 files changed, 45 insertions(+), 18 deletions(-) diff --git a/activeGameState.cpp b/activeGameState.cpp index 5f22c2e..5ef0a32 100755 --- a/activeGameState.cpp +++ b/activeGameState.cpp @@ -30,6 +30,7 @@ #include "unitButton.h" #include "extractor.h" #include "resourceDeposit.h" +#include "resourceRover.h" #include "concreteGuiManager.h" using namespace vb01; @@ -133,7 +134,8 @@ namespace battleship{ cursorNode->setPosition(Vector3(cursorPos.x, cursorPos.y, .8)); if(mainPlayer->getNumSelectedUnits() > 0){ - bool ownGameObj = (gameObjHoveredOn && gameObjHoveredOn->getPlayer()->getTeam() == mainPlayer->getTeam()); + bool ownGameObj = (gameObjHoveredOn && gameObjHoveredOn->getPlayer() == mainPlayer); + bool alliedGameObj = (gameObjHoveredOn && !ownGameObj && gameObjHoveredOn->getPlayer()->getTeam() == mainPlayer->getTeam()); bool gameObjUnit = (gameObjHoveredOn && gameObjHoveredOn->getType() == GameObject::Type::UNIT); bool gameObjTransport = (gameObjUnit && ((Unit*)gameObjHoveredOn)->getNumGarrisonSlots() > 0); bool canGarrison = true; @@ -145,27 +147,50 @@ namespace battleship{ break; } - bool supply = ( - gameObjUnit && - ( - ( - ((Unit*)gameObjHoveredOn)->getUnitClass() == UnitClass::EXTRACTOR && - ((Extractor*)gameObjHoveredOn)->getDeposit()->getAmmount() - ) | - ((Unit*)gameObjHoveredOn)->getUnitClass() == UnitClass::TRADE_CENTER | - ((Unit*)gameObjHoveredOn)->getUnitClass() == UnitClass::REFINERY | - ((Unit*)gameObjHoveredOn)->getUnitClass() == UnitClass::LAB - ) && - mainPlayer->getSelectedUnit(0)->getUnitClass() == UnitClass::RESOURCE_ROVER - ); + vector offers = (gameObjHoveredOn && alliedGameObj ? mainPlayer->getTradeOffers(gameObjHoveredOn->getPlayer()) : vector{}); + bool sellRefs = false, sellWealth = false, sellTech = false; + + for(TradeOffer *offer : offers){ + if(!sellRefs && offer->sellRefineds > 0) sellRefs = true; + if(!sellWealth && offer->sellWealth > 0) sellWealth = true; + if(!sellTech && offer->sellResearch > 0) sellTech = true; + + if(sellRefs && sellWealth && sellTech) break; + } + + int objClass = (gameObjUnit ? int(((Unit*)gameObjHoveredOn)->getUnitClass()) : -1); + bool tradeCenter = ((UnitClass)objClass == UnitClass::TRADE_CENTER); + bool refinery = ((UnitClass)objClass == UnitClass::REFINERY); + bool lab = ((UnitClass)objClass == UnitClass::LAB); + bool ownExtractor = (ownGameObj && (UnitClass)objClass == UnitClass::EXTRACTOR); + + bool roverSelected = (mainPlayer->getSelectedUnit(0)->getUnitClass() == UnitClass::RESOURCE_ROVER); + ResourceRover *rover = (roverSelected ? (ResourceRover*)mainPlayer->getSelectedUnit(0) : nullptr); if(!forceCursorState){ if(gameObjUnit && gameObjTransport){ orderPossible = (ownGameObj && canGarrison); cursorState = CursorState::GARRISON; } - else if(supply){ - orderPossible = ownGameObj; + else if(roverSelected && ownExtractor){ + orderPossible = (((Extractor*)gameObjHoveredOn)->getDeposit()->getAmmount() > 0); + cursorState = CursorState::SUPPLY; + } + else if(roverSelected && (tradeCenter || refinery || lab) && (ownGameObj || (alliedGameObj && (sellRefs || sellWealth || sellTech)))){ + bool canLoad = (rover && rover->calcTotalLoad() < rover->getCapacity()); + + switch((UnitClass)objClass){ + case UnitClass::TRADE_CENTER: + orderPossible = ((ownGameObj && canLoad) || (alliedGameObj && sellWealth && rover->getLoad((int)ResourceType::WEALTH) > 0)); + break; + case UnitClass::REFINERY: + orderPossible = ((ownGameObj && canLoad) || (alliedGameObj && sellRefs && rover->getLoad((int)ResourceType::REFINEDS) > 0)); + break; + case UnitClass::LAB: + orderPossible = ((ownGameObj && canLoad) || (alliedGameObj && sellTech && rover->getLoad((int)ResourceType::RESEARCH) > 0)); + break; + } + cursorState = CursorState::SUPPLY; } else if(gameObjUnit && !ownGameObj) @@ -177,7 +202,7 @@ namespace battleship{ if(cursorState == CursorState::GARRISON) orderPossible = (ownGameObj && gameObjTransport && canGarrison); else if(cursorState == CursorState::SUPPLY) - orderPossible = (ownGameObj && supply); + orderPossible = (roverSelected && (ownExtractor)); else if(cursorState == CursorState::HACK) orderPossible = (!ownGameObj && gameObjUnit && mainPlayer->getSelectedUnit(0)->getUnitClass() == UnitClass::ENGINEER); else if(gameObjUnit) diff --git a/resourceRover.h b/resourceRover.h index a518592..22eaaa6 100644 --- a/resourceRover.h +++ b/resourceRover.h @@ -14,6 +14,9 @@ namespace battleship{ ResourceRover(Player*, int, vb01::Vector3, vb01::Quaternion, Unit::State = Unit::State::STAND_GROUND); ~ResourceRover(); void update(); + inline int getLoad(int id){return load[id];} + inline int calcTotalLoad(){return load[0] + load[1] + load[2];} + inline int getCapacity(){return capacity;} private: void initProperties(); void supply(Order); @@ -22,7 +25,6 @@ namespace battleship{ Unit* getClosestUnit(std::vector); inline bool canLoad(){return vb01::getTime() - lastLoadTime > loadRate && calcTotalLoad() < capacity;} inline bool canUnload(int id){return vb01::getTime() - lastLoadTime > loadRate && load[id] > 0;} - inline int calcTotalLoad(){return load[0] + load[1] + load[2];} vb01::s64 lastLoadTime = 0; int load[3]{0, 0, 0}, capacity, loadRate, loadSpeed; From 13d1e8fcbd13fcbec0721242998ca4f2f45a4325 Mon Sep 17 00:00:00 2001 From: devZoGok Date: Sat, 19 Apr 2025 16:18:07 +0300 Subject: [PATCH 08/12] corrected supply icon rendering when using the supply button --- activeGameState.cpp | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/activeGameState.cpp b/activeGameState.cpp index 5ef0a32..5b211a7 100755 --- a/activeGameState.cpp +++ b/activeGameState.cpp @@ -193,7 +193,7 @@ namespace battleship{ cursorState = CursorState::SUPPLY; } - else if(gameObjUnit && !ownGameObj) + else if(gameObjUnit && !(ownGameObj || alliedGameObj)) cursorState = CursorState::ATTACK; else cursorState = CursorState::NORMAL; @@ -201,8 +201,15 @@ namespace battleship{ else{ if(cursorState == CursorState::GARRISON) orderPossible = (ownGameObj && gameObjTransport && canGarrison); - else if(cursorState == CursorState::SUPPLY) - orderPossible = (roverSelected && (ownExtractor)); + else if(cursorState == CursorState::SUPPLY){ + bool canLoad = (rover->calcTotalLoad() < rover->getCapacity()); + bool transfer = ( + (refinery && ((ownGameObj && canLoad) || (alliedGameObj && sellRefs && rover->getLoad((int)ResourceType::REFINEDS) > 0))) || + (tradeCenter && ((ownGameObj && canLoad) || (alliedGameObj && sellWealth && rover->getLoad((int)ResourceType::WEALTH) > 0))) || + (lab && ((ownGameObj && canLoad) || (alliedGameObj && sellTech && rover->getLoad((int)ResourceType::RESEARCH) > 0))) + ); + orderPossible = (roverSelected && (ownExtractor || transfer)); + } else if(cursorState == CursorState::HACK) orderPossible = (!ownGameObj && gameObjUnit && mainPlayer->getSelectedUnit(0)->getUnitClass() == UnitClass::ENGINEER); else if(gameObjUnit) From 22c4146ffe76768d2bad0d588ed64973bc89f263 Mon Sep 17 00:00:00 2001 From: devZoGok Date: Mon, 21 Apr 2025 15:55:45 +0300 Subject: [PATCH 09/12] using a generic number of resource types ability to order to collect resources from buyers --- activeGameState.cpp | 49 +++++++++++++++++++++++++------------ offerButton.cpp | 2 +- player.cpp | 54 +++++++++++++++++++---------------------- player.h | 21 ++++++++++++---- tradeOffer.h | 27 ++++++++++++--------- tradingScreenButton.cpp | 12 ++++----- 6 files changed, 97 insertions(+), 68 deletions(-) diff --git a/activeGameState.cpp b/activeGameState.cpp index 5b211a7..937cfa4 100755 --- a/activeGameState.cpp +++ b/activeGameState.cpp @@ -148,15 +148,17 @@ namespace battleship{ } vector offers = (gameObjHoveredOn && alliedGameObj ? mainPlayer->getTradeOffers(gameObjHoveredOn->getPlayer()) : vector{}); - bool sellRefs = false, sellWealth = false, sellTech = false; + bool tradeResource[NUM_RESOURCES][2], trade = false; - for(TradeOffer *offer : offers){ - if(!sellRefs && offer->sellRefineds > 0) sellRefs = true; - if(!sellWealth && offer->sellWealth > 0) sellWealth = true; - if(!sellTech && offer->sellResearch > 0) sellTech = true; - - if(sellRefs && sellWealth && sellTech) break; - } + for(TradeOffer *offer : offers) + for(int i = 0; i < NUM_RESOURCES; i++) + for(int j = 0; j < 2; j++){ + if(!tradeResource[i][j] && offer->tradeResources[i][j] > 0){ + tradeResource[i][j] = true; + trade = true; + } + else tradeResource[i][j] = false; + } int objClass = (gameObjUnit ? int(((Unit*)gameObjHoveredOn)->getUnitClass()) : -1); bool tradeCenter = ((UnitClass)objClass == UnitClass::TRADE_CENTER); @@ -176,21 +178,34 @@ namespace battleship{ orderPossible = (((Extractor*)gameObjHoveredOn)->getDeposit()->getAmmount() > 0); cursorState = CursorState::SUPPLY; } - else if(roverSelected && (tradeCenter || refinery || lab) && (ownGameObj || (alliedGameObj && (sellRefs || sellWealth || sellTech)))){ + else if(roverSelected && (tradeCenter || refinery || lab) && (ownGameObj || (alliedGameObj && trade))){ bool canLoad = (rover && rover->calcTotalLoad() < rover->getCapacity()); + bool tradeRes; + int resId; switch((UnitClass)objClass){ case UnitClass::TRADE_CENTER: - orderPossible = ((ownGameObj && canLoad) || (alliedGameObj && sellWealth && rover->getLoad((int)ResourceType::WEALTH) > 0)); + tradeRes = (tradeResource[(int)ResourceType::WEALTH][0] || tradeResource[(int)ResourceType::WEALTH][1]); + resId = (int)ResourceType::WEALTH; break; case UnitClass::REFINERY: - orderPossible = ((ownGameObj && canLoad) || (alliedGameObj && sellRefs && rover->getLoad((int)ResourceType::REFINEDS) > 0)); + tradeRes = (tradeResource[(int)ResourceType::REFINEDS][0] || tradeResource[(int)ResourceType::REFINEDS][1]); + resId = (int)ResourceType::REFINEDS; break; case UnitClass::LAB: - orderPossible = ((ownGameObj && canLoad) || (alliedGameObj && sellTech && rover->getLoad((int)ResourceType::RESEARCH) > 0)); + tradeRes = (tradeResource[(int)ResourceType::RESEARCH][0] || tradeResource[(int)ResourceType::RESEARCH][1]); + resId = (int)ResourceType::RESEARCH; break; } + orderPossible = ( + (ownGameObj && canLoad) || + ( + alliedGameObj && + tradeRes && + (rover->calcTotalLoad() < rover->getCapacity() || rover->getLoad(resId) > 0) + ) + ); cursorState = CursorState::SUPPLY; } else if(gameObjUnit && !(ownGameObj || alliedGameObj)) @@ -202,11 +217,15 @@ namespace battleship{ if(cursorState == CursorState::GARRISON) orderPossible = (ownGameObj && gameObjTransport && canGarrison); else if(cursorState == CursorState::SUPPLY){ + bool tradeRefs = (tradeResource[(int)ResourceType::REFINEDS][0] || tradeResource[(int)ResourceType::REFINEDS][1]); + bool tradeWealth = (tradeResource[(int)ResourceType::WEALTH][0] || tradeResource[(int)ResourceType::WEALTH][1]); + bool tradeTech = (tradeResource[(int)ResourceType::RESEARCH][0] || tradeResource[(int)ResourceType::RESEARCH][1]); + bool canLoad = (rover->calcTotalLoad() < rover->getCapacity()); bool transfer = ( - (refinery && ((ownGameObj && canLoad) || (alliedGameObj && sellRefs && rover->getLoad((int)ResourceType::REFINEDS) > 0))) || - (tradeCenter && ((ownGameObj && canLoad) || (alliedGameObj && sellWealth && rover->getLoad((int)ResourceType::WEALTH) > 0))) || - (lab && ((ownGameObj && canLoad) || (alliedGameObj && sellTech && rover->getLoad((int)ResourceType::RESEARCH) > 0))) + (refinery && ((ownGameObj && canLoad) || (alliedGameObj && tradeRefs && rover->getLoad((int)ResourceType::REFINEDS) > 0))) || + (tradeCenter && ((ownGameObj && canLoad) || (alliedGameObj && tradeWealth && rover->getLoad((int)ResourceType::WEALTH) > 0))) || + (lab && ((ownGameObj && canLoad) || (alliedGameObj && tradeTech && rover->getLoad((int)ResourceType::RESEARCH) > 0))) ); orderPossible = (roverSelected && (ownExtractor || transfer)); } diff --git a/offerButton.cpp b/offerButton.cpp index 1b764ac..c9bf9f7 100644 --- a/offerButton.cpp +++ b/offerButton.cpp @@ -35,6 +35,6 @@ namespace battleship{ ActiveGameState *activeState = (ActiveGameState*)stateManager->getAppStateByType((int)AppStateType::ACTIVE_STATE); Player *mainPlayer = activeState->getPlayer(); - mainPlayer->addTradeOffer(Game::getSingleton()->getPlayer(playerId), new TradeOffer(true, true, buyRef, sellRef, buyWealth, sellWealth, buyRes, sellRes)); + mainPlayer->addTradeOffer(Game::getSingleton()->getPlayer(playerId), new TradeOffer(buyRef, sellRef, buyWealth, sellWealth, buyRes, sellRes)); } } diff --git a/player.cpp b/player.cpp index 968ac45..fa13b79 100755 --- a/player.cpp +++ b/player.cpp @@ -22,9 +22,10 @@ namespace battleship{ cpuPlayer(cpuPl), spawnPointId(sp), name("pl"), - refineds(30000), trader(new Trader()) { + resources[0] = 30000; + colorMaterial = new Material(Root::getSingleton()->getLibPath() + "texture"); colorMaterial->addBoolUniform("lightingEnabled", true); colorMaterial->addBoolUniform("texturingEnabled", false); @@ -56,8 +57,14 @@ namespace battleship{ for(ResourceDeposit *rd : resourceDeposits) rd->update(); + + updateTradeOffers(); } + void Player::updateTradeOffers(){ + + } + int Player::getOrderLineId(Order::TYPE type, Vector3 startPos, Vector3 endPos){ Vector3 color; @@ -186,48 +193,37 @@ namespace battleship{ return ucUnits; } - void Player::addTechnology(int techId){ - technologies.push_back(techId); - } + void Player::updateTradedResource(Player *player, ResourceType type, int amount, bool selfDistributed, bool increased){ + for(pair> pair : tradedResources) + if(pair.first == player){ + TradedResource &tr = pair.second[(int)type]; - int Player::getResource(ResourceType type){ - switch(type){ - case ResourceType::REFINEDS: - return refineds; - case ResourceType::WEALTH: - return wealth; - case ResourceType::RESEARCH: - return research; - } - } + if(selfDistributed) (increased ? tr.taken : tr.given) += amount; + else (increased ? tr.received : tr.hadTaken) += amount; - void Player::updateResource(ResourceType type, int ammount, bool add){ - switch(type){ - case ResourceType::REFINEDS: - refineds = (add ? refineds + ammount : ammount); break; - case ResourceType::WEALTH: - wealth = (add ? wealth + ammount : ammount); - break; - case ResourceType::RESEARCH: - research = (add ? research + ammount : ammount); - break; - } - } + } + } - void Player::initTradeOffersVec(){ + void Player::initTradingVecs(){ vector players = Game::getSingleton()->getPlayers(); for(Player *pl : players){ if(this == pl) continue; - if(team == pl->getTeam()) + if(team == pl->getTeam()){ tradeOffers.push_back(make_pair(pl, vector{})); + tradedResources.push_back(make_pair(pl, vector{ + TradedResource(ResourceType::REFINEDS), + TradedResource(ResourceType::WEALTH), + TradedResource(ResourceType::RESEARCH) + })); + } } } void Player::addTradeOffer(Player *player, TradeOffer *offer){ - if(tradeOffers.empty()) initTradeOffersVec(); + if(tradeOffers.empty()) initTradingVecs(); for(pair> &offers : tradeOffers) if(offers.first == player) diff --git a/player.h b/player.h index 26791bc..1a97c78 100755 --- a/player.h +++ b/player.h @@ -14,6 +14,7 @@ namespace battleship{ class Unit; struct TradeOffer; + const int NUM_RESOURCES = 3; enum class ResourceType{REFINEDS, WEALTH, RESEARCH}; class Player { @@ -31,11 +32,12 @@ namespace battleship{ void selectUnits(std::vector); std::vector getUnitsById(int, int = -1); std::vector getUnitsByClass(UnitClass, int = -1); - void addTechnology(int); - int getResource(ResourceType); - void updateResource(ResourceType, int, bool); + void addTechnology(int id){technologies.push_back(id);} + void updateTradedResource(Player*, ResourceType, int, bool, bool); void addTradeOffer(Player*, TradeOffer*); std::vector getTradeOffers(Player*); + inline int getResource(ResourceType rt){return resources[(int)rt];} + inline void updateResource(ResourceType rt, int amount, bool add){resources[(int)rt] = (add ? resources[(int)rt] + amount : amount);} inline Trader* getTrader(){return trader;} inline void deselectUnits(){selectedUnits.clear();} inline Unit* getSelectedUnit(int id){return selectedUnits[id];} @@ -75,10 +77,17 @@ namespace battleship{ inline vb01::Material* getColorMaterial(){return colorMaterial;} inline std::vector getTechnologies(){return technologies;} private: + struct TradedResource{ + ResourceType type; + int taken = 0, given = 0, received = 0, hadTaken = 0; + + TradedResource(ResourceType t) : type(t){} + }; + bool cpuPlayer = false; std::vector technologies; int luaPlayerId; - int refineds = 0, wealth = 0, research = 0; + int resources[3]{0, 0, 0}; int faction, difficulty, team; int vehiclesBuilt = 0, vehiclesDestroyed = 0, vehiclesLost = 0; int structuresBuilt = 0, structuresDestroyed = 0, structuresLost = 0; @@ -91,9 +100,11 @@ namespace battleship{ vb01::Vector3 color; vb01::Material *colorMaterial = nullptr; std::vector>> tradeOffers; + std::vector>> tradedResources; int getOrderLineId(Order::TYPE, vb01::Vector3, vb01::Vector3); - void initTradeOffersVec(); + void initTradingVecs(); + void updateTradeOffers(); }; } diff --git a/tradeOffer.h b/tradeOffer.h index f593db3..bc59b5a 100644 --- a/tradeOffer.h +++ b/tradeOffer.h @@ -5,19 +5,22 @@ namespace battleship{ struct TradeOffer{ - bool sellerAggrees = true, sellerDelivers = true, buyerAggrees = false, buyerDelivers = false; - int sellRefineds = 0, buyRefineds = 0, sellWealth = 0, buyWealth = 0, sellResearch = 0, buyResearch = 0; + bool sellerAggrees = true, sellerDelivers = true, buyerAggrees = true, buyerDelivers = false; + int tradeResources[NUM_RESOURCES][2], deliveredResources[NUM_RESOURCES][2]; - TradeOffer(bool bd, bool sd, int br, int sr, int bw, int sw, int bt, int st) : - buyerDelivers(bd), - sellerDelivers(sd), - buyRefineds(br), - buyWealth(bw), - buyResearch(bt), - sellRefineds(sr), - sellWealth(sw), - sellResearch(st) - {} + TradeOffer(int br, int sr, int bw, int sw, int bt, int st){ + tradeResources[(int)ResourceType::REFINEDS][0] = br; + tradeResources[(int)ResourceType::REFINEDS][1] = sr; + tradeResources[(int)ResourceType::WEALTH][0] = bw; + tradeResources[(int)ResourceType::WEALTH][1] = sw; + tradeResources[(int)ResourceType::RESEARCH][0] = bt; + tradeResources[(int)ResourceType::RESEARCH][1] = st; + + for(int i = 0; i < NUM_RESOURCES; i++){ + deliveredResources[i][0] = 0; + deliveredResources[i][1] = 0; + } + } }; } diff --git a/tradingScreenButton.cpp b/tradingScreenButton.cpp index 68714ec..ef5d591 100644 --- a/tradingScreenButton.cpp +++ b/tradingScreenButton.cpp @@ -41,12 +41,12 @@ namespace battleship{ ActiveStateButton::onClick(); vector textboxes = guiManager->getTextboxes(); - textboxes[0]->setEntry(to_wstring(tradeOffer->buyRefineds)); - textboxes[1]->setEntry(to_wstring(tradeOffer->sellRefineds)); - textboxes[2]->setEntry(to_wstring(tradeOffer->buyWealth)); - textboxes[3]->setEntry(to_wstring(tradeOffer->sellWealth)); - textboxes[4]->setEntry(to_wstring(tradeOffer->buyResearch)); - textboxes[5]->setEntry(to_wstring(tradeOffer->sellResearch)); + textboxes[0]->setEntry(to_wstring(tradeOffer->tradeResources[0][0])); + textboxes[1]->setEntry(to_wstring(tradeOffer->tradeResources[0][1])); + textboxes[2]->setEntry(to_wstring(tradeOffer->tradeResources[1][0])); + textboxes[3]->setEntry(to_wstring(tradeOffer->tradeResources[1][1])); + textboxes[4]->setEntry(to_wstring(tradeOffer->tradeResources[2][0])); + textboxes[5]->setEntry(to_wstring(tradeOffer->tradeResources[2][1])); } else ActiveStateButton::onClick(); From 421efaf360c9f9b1fed1816fa2e509e3f1346c0d Mon Sep 17 00:00:00 2001 From: devZoGok Date: Sat, 26 Apr 2025 12:11:53 +0300 Subject: [PATCH 10/12] separate resource loading and unloading orders removing fulfiled orders --- activeGameState.cpp | 71 +++++++++++++++------------ activeGameState.h | 2 + orderButton.cpp | 6 +++ player.cpp | 37 ++++++++------ player.h | 1 - resourceRover.cpp | 117 ++++++++++++++++++++++++++++---------------- resourceRover.h | 17 ++++--- unit.cpp | 8 +++ unit.h | 13 +++-- 9 files changed, 173 insertions(+), 99 deletions(-) diff --git a/activeGameState.cpp b/activeGameState.cpp index 937cfa4..db68e41 100755 --- a/activeGameState.cpp +++ b/activeGameState.cpp @@ -148,17 +148,17 @@ namespace battleship{ } vector offers = (gameObjHoveredOn && alliedGameObj ? mainPlayer->getTradeOffers(gameObjHoveredOn->getPlayer()) : vector{}); - bool tradeResource[NUM_RESOURCES][2], trade = false; + bool tradeResource[NUM_RESOURCES], trade = false; + int unloadFlag = (int)shiftPressed; - for(TradeOffer *offer : offers) - for(int i = 0; i < NUM_RESOURCES; i++) - for(int j = 0; j < 2; j++){ - if(!tradeResource[i][j] && offer->tradeResources[i][j] > 0){ - tradeResource[i][j] = true; - trade = true; - } - else tradeResource[i][j] = false; - } + for(int i = 0; i < NUM_RESOURCES && !offers.empty(); i++){ + if(offers[0]->tradeResources[i][unloadFlag] > 0){ + tradeResource[i] = true; + trade = true; + } + else + tradeResource[i] = false; + } int objClass = (gameObjUnit ? int(((Unit*)gameObjHoveredOn)->getUnitClass()) : -1); bool tradeCenter = ((UnitClass)objClass == UnitClass::TRADE_CENTER); @@ -179,34 +179,30 @@ namespace battleship{ cursorState = CursorState::SUPPLY; } else if(roverSelected && (tradeCenter || refinery || lab) && (ownGameObj || (alliedGameObj && trade))){ - bool canLoad = (rover && rover->calcTotalLoad() < rover->getCapacity()); - bool tradeRes; + bool tradeRes = false; int resId; - + switch((UnitClass)objClass){ case UnitClass::TRADE_CENTER: - tradeRes = (tradeResource[(int)ResourceType::WEALTH][0] || tradeResource[(int)ResourceType::WEALTH][1]); + tradeRes = tradeResource[(int)ResourceType::WEALTH]; resId = (int)ResourceType::WEALTH; break; case UnitClass::REFINERY: - tradeRes = (tradeResource[(int)ResourceType::REFINEDS][0] || tradeResource[(int)ResourceType::REFINEDS][1]); + tradeRes = tradeResource[(int)ResourceType::REFINEDS]; resId = (int)ResourceType::REFINEDS; break; case UnitClass::LAB: - tradeRes = (tradeResource[(int)ResourceType::RESEARCH][0] || tradeResource[(int)ResourceType::RESEARCH][1]); + tradeRes = tradeResource[(int)ResourceType::RESEARCH]; resId = (int)ResourceType::RESEARCH; break; } + + bool canLoad = (rover && rover->calcTotalLoad() < rover->getCapacity()); + orderPossible = (unloadFlag ? rover->getLoad(resId) > 0 : canLoad); - orderPossible = ( - (ownGameObj && canLoad) || - ( - alliedGameObj && - tradeRes && - (rover->calcTotalLoad() < rover->getCapacity() || rover->getLoad(resId) > 0) - ) - ); - cursorState = CursorState::SUPPLY; + if(alliedGameObj) orderPossible = tradeRes && orderPossible; + + cursorState = (unloadFlag ? CursorState::UNLOAD : CursorState::LOAD); } else if(gameObjUnit && !(ownGameObj || alliedGameObj)) cursorState = CursorState::ATTACK; @@ -216,18 +212,20 @@ namespace battleship{ else{ if(cursorState == CursorState::GARRISON) orderPossible = (ownGameObj && gameObjTransport && canGarrison); - else if(cursorState == CursorState::SUPPLY){ - bool tradeRefs = (tradeResource[(int)ResourceType::REFINEDS][0] || tradeResource[(int)ResourceType::REFINEDS][1]); - bool tradeWealth = (tradeResource[(int)ResourceType::WEALTH][0] || tradeResource[(int)ResourceType::WEALTH][1]); - bool tradeTech = (tradeResource[(int)ResourceType::RESEARCH][0] || tradeResource[(int)ResourceType::RESEARCH][1]); - + else if(cursorState == CursorState::SUPPLY) + orderPossible = (roverSelected && ownExtractor); + else if(cursorState == CursorState::LOAD || cursorState == CursorState::UNLOAD){ + bool tradeRefs = tradeResource[(int)ResourceType::REFINEDS]; + bool tradeWealth = tradeResource[(int)ResourceType::WEALTH]; + bool tradeTech = tradeResource[(int)ResourceType::RESEARCH]; + bool canLoad = (rover->calcTotalLoad() < rover->getCapacity()); - bool transfer = ( + bool loadResource = ( (refinery && ((ownGameObj && canLoad) || (alliedGameObj && tradeRefs && rover->getLoad((int)ResourceType::REFINEDS) > 0))) || (tradeCenter && ((ownGameObj && canLoad) || (alliedGameObj && tradeWealth && rover->getLoad((int)ResourceType::WEALTH) > 0))) || (lab && ((ownGameObj && canLoad) || (alliedGameObj && tradeTech && rover->getLoad((int)ResourceType::RESEARCH) > 0))) ); - orderPossible = (roverSelected && (ownExtractor || transfer)); + orderPossible = (roverSelected && loadResource); } else if(cursorState == CursorState::HACK) orderPossible = (!ownGameObj && gameObjUnit && mainPlayer->getSelectedUnit(0)->getUnitClass() == UnitClass::ENGINEER); @@ -249,6 +247,8 @@ namespace battleship{ tex = (orderPossible ? garrisonTex : noGarrisonTex); break; case CursorState::SUPPLY: + case CursorState::LOAD: + case CursorState::UNLOAD: tex = (orderPossible ? supplyTex : noSupplyTex); break; case CursorState::HACK: @@ -551,6 +551,7 @@ namespace battleship{ } //TODO fix ejectable unit selection with multiple transports selected + //TODO replace shiftPressed with a dedicated buy flag void ActiveGameState::issueOrder(Order::TYPE type, vector targets, bool addOrder) { depth = 1; Vector3 destDir = Vector3::VEC_ZERO; @@ -675,6 +676,12 @@ namespace battleship{ else if(cursorState == CursorState::SUPPLY){ if(orderPossible) issueOrder(Order::TYPE::SUPPLY, vector{Order::Target((Unit*)gameObjHoveredOn)}, shiftPressed); } + else if(cursorState == CursorState::LOAD){ + if(orderPossible) issueOrder(Order::TYPE::LOAD, vector{Order::Target((Unit*)gameObjHoveredOn)}, shiftPressed); + } + else if(cursorState == CursorState::UNLOAD){ + if(orderPossible) issueOrder(Order::TYPE::UNLOAD, vector{Order::Target((Unit*)gameObjHoveredOn)}, shiftPressed); + } else if(cursorState == CursorState::ATTACK){ if(controlPressed && !gameObjHoveredOn){ castRayToTerrain(); diff --git a/activeGameState.h b/activeGameState.h index 7d81569..63740c7 100755 --- a/activeGameState.h +++ b/activeGameState.h @@ -29,6 +29,8 @@ namespace battleship{ ATTACK, GARRISON, SUPPLY, + LOAD, + UNLOAD, HACK }; diff --git a/orderButton.cpp b/orderButton.cpp index fe92653..0251c06 100644 --- a/orderButton.cpp +++ b/orderButton.cpp @@ -45,6 +45,12 @@ namespace battleship{ case Order::TYPE::SUPPLY: cs = ActiveGameState::CursorState::SUPPLY; break; + case Order::TYPE::LOAD: + cs = ActiveGameState::CursorState::LOAD; + break; + case Order::TYPE::UNLOAD: + cs = ActiveGameState::CursorState::UNLOAD; + break; case Order::TYPE::HACK: cs = ActiveGameState::CursorState::HACK; break; diff --git a/player.cpp b/player.cpp index fa13b79..c63adb8 100755 --- a/player.cpp +++ b/player.cpp @@ -41,30 +41,35 @@ namespace battleship{ vector units = this->units; for(Unit *u : units){ - if(!u->isRemove()) - u->update(); - else - removeUnit(u); + if(!u->isRemove()) u->update(); + else removeUnit(u); } vector projectiles = this->projectiles; for(Projectile *proj : projectiles){ - if(!proj->isRemove()) - proj->update(); - else - removeProjectile(proj); + if(!proj->isRemove()) proj->update(); + else removeProjectile(proj); } - for(ResourceDeposit *rd : resourceDeposits) - rd->update(); + for(ResourceDeposit *rd : resourceDeposits) rd->update(); - updateTradeOffers(); + for(pair> &pair : tradeOffers){ + if(pair.second.empty()) continue; + + bool fulfiled = true; + + for(int i = 0; i < NUM_RESOURCES && fulfiled; i++){ + bool b = (pair.second[0]->tradeResources[i][0] == pair.second[0]->deliveredResources[i][0]); + bool s = (pair.second[0]->tradeResources[i][1] == pair.second[0]->deliveredResources[i][1]); + + if(!(b && s)) fulfiled = false; + } + + if(fulfiled) + pair.second.erase(pair.second.begin()); + } } - void Player::updateTradeOffers(){ - - } - int Player::getOrderLineId(Order::TYPE type, Vector3 startPos, Vector3 endPos){ Vector3 color; @@ -82,6 +87,8 @@ namespace battleship{ break; case Order::TYPE::BUILD: case Order::TYPE::SUPPLY: + case Order::TYPE::LOAD: + case Order::TYPE::UNLOAD: color = Vector3(1, 1, 0); break; case Order::TYPE::HACK: diff --git a/player.h b/player.h index 1a97c78..7aafdb3 100755 --- a/player.h +++ b/player.h @@ -104,7 +104,6 @@ namespace battleship{ int getOrderLineId(Order::TYPE, vb01::Vector3, vb01::Vector3); void initTradingVecs(); - void updateTradeOffers(); }; } diff --git a/resourceRover.cpp b/resourceRover.cpp index dbc2ac1..7ea60d5 100644 --- a/resourceRover.cpp +++ b/resourceRover.cpp @@ -37,6 +37,76 @@ namespace battleship{ loadRate = unitTable["loadRate"]; loadRate += game->calcAbilFromTech(Ability::Type::LOAD_RATE, currTechs, (int)GameObject::type, id); } + void ResourceRover::handleTransfer(Structure *targStruct, float minDist, bool loadResource){ + bool closeEnough = (pos.getDistanceFrom(targStruct->getPos()) <= minDist); + if(!closeEnough) return; + + ResourceType resType; + + switch(targStruct->getUnitClass()){ + case UnitClass::TRADE_CENTER: + resType = ResourceType::WEALTH; + break; + case UnitClass::REFINERY: + resType = ResourceType::REFINEDS; + break; + case UnitClass::LAB: + resType = ResourceType::RESEARCH; + break; + } + + if(player == targStruct->getPlayer()){ + if(!loadResource && canUnload((int)resType)){ + player->updateResource(resType, loadSpeed, true); + cargo[(int)resType] -= loadSpeed; + lastLoadTime = getTime(); + } + else if(loadResource && canLoad() && player->getResource(resType) > 0){ + player->updateResource(resType, -loadSpeed, true); + cargo[(int)resType] += loadSpeed; + lastLoadTime = getTime(); + } + } + else{ + vector offers = player->getTradeOffers(targStruct->getPlayer()); + if(offers.empty()) return; + + TradeOffer *offer = offers[0]; + + if(!loadResource && offer->tradeResources[(int)resType][1] > offer->deliveredResources[(int)resType][1] && canUnload((int)resType)){ + targStruct->getPlayer()->updateResource(resType, loadSpeed, true); + offer->deliveredResources[(int)resType][1]++; + cargo[(int)resType] -= loadSpeed; + lastLoadTime = getTime(); + } + else if( + loadResource && + offer->tradeResources[(int)resType][0] > offer->deliveredResources[(int)resType][0] && + targStruct->getPlayer()->getResource(resType) > 0 && + canLoad() + ) + { + targStruct->getPlayer()->updateResource(resType, -loadSpeed, true); + offer->deliveredResources[(int)resType][0]++; + cargo[(int)resType] += loadSpeed; + lastLoadTime = getTime(); + } + } + } + + void ResourceRover::transfer(Order order, bool loadResource){ + float minDist = .5 * Map::getSingleton()->getCellSize().x; + + if(!pathPoints.empty()) + navigate(minDist); + else + handleTransfer((Structure*)order.targets[0].unit, minDist, loadResource); + } + + void ResourceRover::load(Order order){transfer(order, true);} + + void ResourceRover::unload(Order order){transfer(order, false);} + //TODO equate rover load and extractor draw rates void ResourceRover::collectRefineds(Order order, float minDist){ vector units = player->getUnits(); @@ -58,7 +128,7 @@ namespace battleship{ if(canLoad() && deposit->getAmmount() > 0){ if(nearestExtractor->canDraw()){ nearestExtractor->draw(); - load[(int)ResourceType::REFINEDS] += loadSpeed; + cargo[(int)ResourceType::REFINEDS] += loadSpeed; lastLoadTime = getTime(); } } @@ -66,7 +136,7 @@ namespace battleship{ preparePathpoints(order, nearestRefinery->getPos(), true); } else if(!nearestExtractor){ - if(nearestRefinery && load[(int)ResourceType::REFINEDS] > 0) + if(nearestRefinery && cargo[(int)ResourceType::REFINEDS] > 0) preparePathpoints(order, nearestRefinery->getPos(), true); else removeOrder(0); @@ -74,57 +144,22 @@ namespace battleship{ if(nearestRefinery && nearestRefinery->getPos().getDistanceFrom(pos) <= minDist){ if(canUnload((int)ResourceType::REFINEDS)){ - load[(int)ResourceType::REFINEDS] -= loadSpeed; + cargo[(int)ResourceType::REFINEDS] -= loadSpeed; player->updateResource(ResourceType::REFINEDS, loadSpeed, true); lastLoadTime = getTime(); } - else if(load[(int)ResourceType::REFINEDS] == 0 && nearestExtractor) + else if(cargo[(int)ResourceType::REFINEDS] == 0 && nearestExtractor) preparePathpoints(order, nearestExtractor->getPos()); } } - void ResourceRover::transferResource(Structure *targStruct, float minDist){ - bool closeEnough = (pos.getDistanceFrom(targStruct->getPos()) <= minDist); - ResourceType resType; - - switch(targStruct->getUnitClass()){ - case UnitClass::TRADE_CENTER: - resType = ResourceType::WEALTH; - break; - case UnitClass::REFINERY: - resType = ResourceType::REFINEDS; - break; - case UnitClass::LAB: - resType = ResourceType::RESEARCH; - break; - } - - if(closeEnough){ - if(player == targStruct->getPlayer() && canLoad() && player->getResource(resType) > 0){ - player->updateResource(resType, -loadSpeed, true); - load[(int)resType] += loadSpeed; - lastLoadTime = getTime(); - } - else if(player != targStruct->getPlayer() && canUnload((int)resType)){ - targStruct->getPlayer()->updateResource(resType, loadSpeed, true); - load[(int)resType] -= loadSpeed; - lastLoadTime = getTime(); - } - } - } - void ResourceRover::supply(Order order){ float minDist = .5 * Map::getSingleton()->getCellSize().x; if(!pathPoints.empty()) navigate(minDist); - else{ - Unit *targUnit = order.targets[0].unit; - - if(targUnit->getUnitClass() == UnitClass::EXTRACTOR) - collectRefineds(order, minDist); - else transferResource((Structure*)targUnit, minDist); - } + else + collectRefineds(order, minDist); } void ResourceRover::update(){ diff --git a/resourceRover.h b/resourceRover.h index 22eaaa6..cfa6197 100644 --- a/resourceRover.h +++ b/resourceRover.h @@ -14,20 +14,23 @@ namespace battleship{ ResourceRover(Player*, int, vb01::Vector3, vb01::Quaternion, Unit::State = Unit::State::STAND_GROUND); ~ResourceRover(); void update(); - inline int getLoad(int id){return load[id];} - inline int calcTotalLoad(){return load[0] + load[1] + load[2];} + inline int getLoad(int id){return cargo[id];} + inline int calcTotalLoad(){return cargo[0] + cargo[1] + cargo[2];} inline int getCapacity(){return capacity;} + inline bool canLoad(){return vb01::getTime() - lastLoadTime > loadRate && calcTotalLoad() < capacity;} + inline bool canUnload(int id){return vb01::getTime() - lastLoadTime > loadRate && cargo[id] > 0;} private: void initProperties(); - void supply(Order); void collectRefineds(Order, float); - void transferResource(Structure*, float); + void supply(Order); + void handleTransfer(Structure*, float, bool); + void transfer(Order, bool); + void load(Order); + void unload(Order); Unit* getClosestUnit(std::vector); - inline bool canLoad(){return vb01::getTime() - lastLoadTime > loadRate && calcTotalLoad() < capacity;} - inline bool canUnload(int id){return vb01::getTime() - lastLoadTime > loadRate && load[id] > 0;} vb01::s64 lastLoadTime = 0; - int load[3]{0, 0, 0}, capacity, loadRate, loadSpeed; + int cargo[3]{0, 0, 0}, capacity, loadRate, loadSpeed; Extractor *nearestExtractor = nullptr; Unit *nearestRefinery = nullptr; vb01::Node *loadBackground = nullptr, *loadForeground = nullptr; diff --git a/unit.cpp b/unit.cpp index 4affd74..c6fdd59 100755 --- a/unit.cpp +++ b/unit.cpp @@ -629,6 +629,12 @@ namespace battleship{ case Order::TYPE::SUPPLY: supply(order); break; + case Order::TYPE::LOAD: + load(order); + break; + case Order::TYPE::UNLOAD: + unload(order); + break; case Order::TYPE::HACK: hack(order); break; @@ -702,6 +708,8 @@ namespace battleship{ return false; } case Order::TYPE::SUPPLY: + case Order::TYPE::LOAD: + case Order::TYPE::UNLOAD: return unitClass == UnitClass::RESOURCE_ROVER; case Order::TYPE::HACK: { diff --git a/unit.h b/unit.h index ecd2ea5..0b0ba46 100755 --- a/unit.h +++ b/unit.h @@ -37,7 +37,7 @@ namespace battleship{ class Projectile; struct Order { - enum class TYPE {ATTACK, BUILD, MOVE, GARRISON, EJECT, PATROL, LAUNCH, SUPPLY, HACK}; + enum class TYPE {ATTACK, BUILD, MOVE, GARRISON, EJECT, PATROL, LAUNCH, SUPPLY, LOAD, UNLOAD, HACK}; struct Target{ Unit *unit = nullptr; vb01::Vector3 pos; @@ -53,9 +53,14 @@ namespace battleship{ std::vector targets; Order(){} - Order(TYPE t, std::vector targ, vb01::Vector3 dir = vb01::Vector3::VEC_ZERO, int lid = -1, bool pa = true) : type(t), playerAssigned(pa), lineId(lid), targets(targ), direction(dir){} + Order(TYPE t, std::vector targ, vb01::Vector3 dir = vb01::Vector3::VEC_ZERO, int lid = -1, bool pa = true) : + type(t), + playerAssigned(pa), + lineId(lid), + targets(targ), + direction(dir){} }; - + enum class MoveDir {LEFT, UP, FORW}; enum class Corner {FRONT_LEFT, FRONT_RIGHT, REAR_LEFT, REAR_RIGHT}; enum class UnitType {UNDERWATER, SEA_LEVEL, HOVER, LAND, AIR, NONE = -1}; @@ -205,6 +210,8 @@ namespace battleship{ virtual void patrol(Order){} virtual void launch(Order); virtual void supply(Order){} + virtual void load(Order){} + virtual void unload(Order){} virtual void hack(Order){} float calculateRotation(vb01::Vector3, float, float); void removeBar(vb01::Node*); From 6c77b20306c8b0787571e3969a137950910cb7b4 Mon Sep 17 00:00:00 2001 From: devZoGok Date: Sat, 26 Apr 2025 12:49:02 +0300 Subject: [PATCH 11/12] corrected functionality for resource (un)loading buttons --- Assets/Scripts/GameObjects/Units/unitData.lua | 28 ++++++----- activeGameState.cpp | 47 +++++++++++-------- 2 files changed, 45 insertions(+), 30 deletions(-) diff --git a/Assets/Scripts/GameObjects/Units/unitData.lua b/Assets/Scripts/GameObjects/Units/unitData.lua index e2c7d88..fe09445 100644 --- a/Assets/Scripts/GameObjects/Units/unitData.lua +++ b/Assets/Scripts/GameObjects/Units/unitData.lua @@ -1,14 +1,16 @@ OrderType = { - HALT = -1, - ATTACK = 0, - BUILD = 1, - MOVE = 2, - GARRISON = 3, - EJECT = 4, - PATROL = 5, - LAUNCH = 6, - SUPPLY = 7, - HACK = 8 + HALT = -1, + ATTACK = 0, + BUILD = 1, + MOVE = 2, + GARRISON = 3, + EJECT = 4, + PATROL = 5, + LAUNCH = 6, + SUPPLY = 7, + LOAD = 8, + UNLOAD = 9, + HACK = 10 } UnitId = { WAR_MECH = 0, @@ -353,7 +355,11 @@ units = { }, { weapons = {}, - abilityButtons = {{buttonType = ButtonType.ORDER, name = 'Supply', orderType = OrderType.SUPPLY}}, + abilityButtons = { + {buttonType = ButtonType.ORDER, name = 'Supply', orderType = OrderType.SUPPLY}, + {buttonType = ButtonType.ORDER, name = 'Load', orderType = OrderType.LOAD}, + {buttonType = ButtonType.ORDER, name = 'Unload', orderType = OrderType.UNLOAD}, + }, unitClass = UnitClass.RESOURCE_ROVER, unitType = UnitType.HOVER, armor = {ArmorType.CAST}, diff --git a/activeGameState.cpp b/activeGameState.cpp index db68e41..397a4e0 100755 --- a/activeGameState.cpp +++ b/activeGameState.cpp @@ -148,17 +148,16 @@ namespace battleship{ } vector offers = (gameObjHoveredOn && alliedGameObj ? mainPlayer->getTradeOffers(gameObjHoveredOn->getPlayer()) : vector{}); - bool tradeResource[NUM_RESOURCES], trade = false; - int unloadFlag = (int)shiftPressed; + bool tradeResource[NUM_RESOURCES][2], trade = false; - for(int i = 0; i < NUM_RESOURCES && !offers.empty(); i++){ - if(offers[0]->tradeResources[i][unloadFlag] > 0){ - tradeResource[i] = true; - trade = true; + for(int i = 0; i < NUM_RESOURCES; i++) + for(int j = 0; j < 2; j++){ + if(!offers.empty() && offers[0]->tradeResources[i][j] > 0){ + tradeResource[i][j] = true; + trade = true; + } + else tradeResource[i][j] = false; } - else - tradeResource[i] = false; - } int objClass = (gameObjUnit ? int(((Unit*)gameObjHoveredOn)->getUnitClass()) : -1); bool tradeCenter = ((UnitClass)objClass == UnitClass::TRADE_CENTER); @@ -168,6 +167,7 @@ namespace battleship{ bool roverSelected = (mainPlayer->getSelectedUnit(0)->getUnitClass() == UnitClass::RESOURCE_ROVER); ResourceRover *rover = (roverSelected ? (ResourceRover*)mainPlayer->getSelectedUnit(0) : nullptr); + int unloadFlag = (int)shiftPressed; if(!forceCursorState){ if(gameObjUnit && gameObjTransport){ @@ -184,15 +184,15 @@ namespace battleship{ switch((UnitClass)objClass){ case UnitClass::TRADE_CENTER: - tradeRes = tradeResource[(int)ResourceType::WEALTH]; + tradeRes = tradeResource[(int)ResourceType::WEALTH][unloadFlag]; resId = (int)ResourceType::WEALTH; break; case UnitClass::REFINERY: - tradeRes = tradeResource[(int)ResourceType::REFINEDS]; + tradeRes = tradeResource[(int)ResourceType::REFINEDS][unloadFlag]; resId = (int)ResourceType::REFINEDS; break; case UnitClass::LAB: - tradeRes = tradeResource[(int)ResourceType::RESEARCH]; + tradeRes = tradeResource[(int)ResourceType::RESEARCH][unloadFlag]; resId = (int)ResourceType::RESEARCH; break; } @@ -215,17 +215,26 @@ namespace battleship{ else if(cursorState == CursorState::SUPPLY) orderPossible = (roverSelected && ownExtractor); else if(cursorState == CursorState::LOAD || cursorState == CursorState::UNLOAD){ - bool tradeRefs = tradeResource[(int)ResourceType::REFINEDS]; - bool tradeWealth = tradeResource[(int)ResourceType::WEALTH]; - bool tradeTech = tradeResource[(int)ResourceType::RESEARCH]; + int ulf = int(cursorState == CursorState::UNLOAD); + bool tradeRefs = tradeResource[(int)ResourceType::REFINEDS][ulf]; + bool tradeWealth = tradeResource[(int)ResourceType::WEALTH][ulf]; + bool tradeTech = tradeResource[(int)ResourceType::RESEARCH][ulf]; bool canLoad = (rover->calcTotalLoad() < rover->getCapacity()); bool loadResource = ( - (refinery && ((ownGameObj && canLoad) || (alliedGameObj && tradeRefs && rover->getLoad((int)ResourceType::REFINEDS) > 0))) || - (tradeCenter && ((ownGameObj && canLoad) || (alliedGameObj && tradeWealth && rover->getLoad((int)ResourceType::WEALTH) > 0))) || - (lab && ((ownGameObj && canLoad) || (alliedGameObj && tradeTech && rover->getLoad((int)ResourceType::RESEARCH) > 0))) + cursorState == CursorState::LOAD ? canLoad : ( + rover->getLoad((int)ResourceType::REFINEDS) > 0 || + rover->getLoad((int)ResourceType::WEALTH) > 0 || + rover->getLoad((int)ResourceType::RESEARCH) > 0 + ) ); - orderPossible = (roverSelected && loadResource); + + bool transferResource = ( + (refinery && loadResource && (ownGameObj || (alliedGameObj && tradeRefs))) || + (tradeCenter && loadResource && (ownGameObj || (alliedGameObj && tradeWealth))) || + (lab && loadResource && (ownGameObj || (alliedGameObj && tradeTech))) + ); + orderPossible = (roverSelected && transferResource); } else if(cursorState == CursorState::HACK) orderPossible = (!ownGameObj && gameObjUnit && mainPlayer->getSelectedUnit(0)->getUnitClass() == UnitClass::ENGINEER); From 8a5dac18a952d72bb2249e7683a1984733feb912 Mon Sep 17 00:00:00 2001 From: devZoGok Date: Sat, 26 Apr 2025 14:32:02 +0300 Subject: [PATCH 12/12] code refactoring + test map --- Assets/Models/Maps/aaa/aaa.lua | 43 +++++++++++++++++++++++----------- resourceRover.cpp | 21 ++++------------- resourceRover.h | 7 ++---- unit.cpp | 7 ++---- unit.h | 4 +--- 5 files changed, 39 insertions(+), 43 deletions(-) diff --git a/Assets/Models/Maps/aaa/aaa.lua b/Assets/Models/Maps/aaa/aaa.lua index 8c36520..6bdb5b2 100644 --- a/Assets/Models/Maps/aaa/aaa.lua +++ b/Assets/Models/Maps/aaa/aaa.lua @@ -9,23 +9,38 @@ numPlayers = 1, numSpawnPoints = 1, spawnPoints = { {x = 0.000000, y = 0.000000, z = 0.000000}, +{x = 170.000000, y = 0.000000, z = -170.000000}, {x = -170.000000, y = 0.000000, z = 170.000000}, }, players = { -{ -resourceDeposits = { - {id = 0, pos = {x = -150.000000, y = 0.000000, z = 150.000000}, rot = {w = 1.000000, x = 0.000000, y = 0.000000, z = 0.000000}, initAmmount = 1000}, -}, -units = { - {id = UnitId.WAR_MECH, pos = {x = 100.000000, y = 0.000000, z = 10.000000}, rot = {w = 1.000000, x = 0.000000, y = 0.000000, z = 0.000000}, buildStatus = 100}, -} -}, -{ - resourceDeposits = {}, - units = { - {id = UnitId.ENGINEER, pos = {x = -170.000000, y = 0.000000, z = 150.000000}, rot = {w = 1.000000, x = 0.000000, y = 0.000000, z = 0.000000}}, - } -} + { + resourceDeposits = { + {id = 0, pos = {x = -150.000000, y = 0.000000, z = 150.000000}, rot = {w = 1.000000, x = 0.000000, y = 0.000000, z = 0.000000}, initAmmount = 1000}, + }, + units = { + {id = UnitId.WAR_MECH, pos = {x = -170.000000, y = 0.000000, z = 150.000000}, rot = {w = 1.000000, x = 0.000000, y = 0.000000, z = 0.000000}}, + {id = UnitId.RESOURCE_ROVER, pos = {x = -170.000000, y = 0.000000, z = 180.000000}, rot = {w = 1.000000, x = 0.000000, y = 0.000000, z = 0.000000}}, + {id = UnitId.TRADE_CENTER, pos = {x = -180.000000, y = 0.000000, z = 150.000000}, rot = {w = 1.000000, x = 0.000000, y = 0.000000, z = 0.000000}, buildStatus = 100}, + {id = UnitId.LAB, pos = {x = -200.000000, y = 0.000000, z = 140.000000}, rot = {w = 1.000000, x = 0.000000, y = 0.000000, z = 0.000000}, buildStatus = 100}, + {id = UnitId.REFINERY, pos = {x = -170.000000, y = 0.000000, z = 120.000000}, rot = {w = 1.000000, x = 0.000000, y = 0.000000, z = 0.000000}, buildStatus = 100}, + } + }, + { + resourceDeposits = {}, + units = { + {id = UnitId.POINT_DEFENSE, pos = {x = 100.000000, y = 0.000000, z = 10.000000}, rot = {w = 1.000000, x = 0.000000, y = 0.000000, z = 0.000000}, buildStatus = 100}, + {id = UnitId.RESOURCE_ROVER, pos = {x = 100.000000, y = 0.000000, z = -10.000000}, rot = {w = 1.000000, x = 0.000000, y = 0.000000, z = 0.000000}}, + {id = UnitId.TRADE_CENTER, pos = {x = 130.000000, y = 0.000000, z = 10.000000}, rot = {w = 1.000000, x = 0.000000, y = 0.000000, z = 0.000000}, buildStatus = 100}, + {id = UnitId.LAB, pos = {x = 100.000000, y = 0.000000, z = 20.000000}, rot = {w = 1.000000, x = 0.000000, y = 0.000000, z = 0.000000}, buildStatus = 100}, + {id = UnitId.REFINERY, pos = {x = 100.000000, y = 0.000000, z = 50.000000}, rot = {w = 1.000000, x = 0.000000, y = 0.000000, z = 0.000000}, buildStatus = 100}, + } + }, + { + resourceDeposits = {}, + units = { + {id = UnitId.LAND_FACTORY, pos = {x = 170.000000, y = 0.000000, z = -170.000000}, rot = {w = 1.000000, x = 0.000000, y = 0.000000, z = 0.000000}, buildStatus = 100}, + } + }, }, numCells = 3969, cells = { diff --git a/resourceRover.cpp b/resourceRover.cpp index 7ea60d5..7133fd4 100644 --- a/resourceRover.cpp +++ b/resourceRover.cpp @@ -37,7 +37,7 @@ namespace battleship{ loadRate = unitTable["loadRate"]; loadRate += game->calcAbilFromTech(Ability::Type::LOAD_RATE, currTechs, (int)GameObject::type, id); } - void ResourceRover::handleTransfer(Structure *targStruct, float minDist, bool loadResource){ + void ResourceRover::loadResources(Structure *targStruct, float minDist, bool loadResource){ bool closeEnough = (pos.getDistanceFrom(targStruct->getPos()) <= minDist); if(!closeEnough) return; @@ -94,19 +94,6 @@ namespace battleship{ } } - void ResourceRover::transfer(Order order, bool loadResource){ - float minDist = .5 * Map::getSingleton()->getCellSize().x; - - if(!pathPoints.empty()) - navigate(minDist); - else - handleTransfer((Structure*)order.targets[0].unit, minDist, loadResource); - } - - void ResourceRover::load(Order order){transfer(order, true);} - - void ResourceRover::unload(Order order){transfer(order, false);} - //TODO equate rover load and extractor draw rates void ResourceRover::collectRefineds(Order order, float minDist){ vector units = player->getUnits(); @@ -153,13 +140,15 @@ namespace battleship{ } } - void ResourceRover::supply(Order order){ + void ResourceRover::handleResources(Order order){ float minDist = .5 * Map::getSingleton()->getCellSize().x; if(!pathPoints.empty()) navigate(minDist); - else + else if(order.type == Order::TYPE::SUPPLY) collectRefineds(order, minDist); + else + loadResources((Structure*)order.targets[0].unit, minDist, order.type == Order::TYPE::LOAD); } void ResourceRover::update(){ diff --git a/resourceRover.h b/resourceRover.h index cfa6197..c8faf5c 100644 --- a/resourceRover.h +++ b/resourceRover.h @@ -22,11 +22,8 @@ namespace battleship{ private: void initProperties(); void collectRefineds(Order, float); - void supply(Order); - void handleTransfer(Structure*, float, bool); - void transfer(Order, bool); - void load(Order); - void unload(Order); + void loadResources(Structure*, float, bool); + void handleResources(Order); Unit* getClosestUnit(std::vector); vb01::s64 lastLoadTime = 0; diff --git a/unit.cpp b/unit.cpp index c6fdd59..587c0cd 100755 --- a/unit.cpp +++ b/unit.cpp @@ -626,14 +626,11 @@ namespace battleship{ case Order::TYPE::LAUNCH: launch(order); break; - case Order::TYPE::SUPPLY: - supply(order); break; case Order::TYPE::LOAD: - load(order); - break; + case Order::TYPE::SUPPLY: case Order::TYPE::UNLOAD: - unload(order); + handleResources(order); break; case Order::TYPE::HACK: hack(order); diff --git a/unit.h b/unit.h index 0b0ba46..118cd69 100755 --- a/unit.h +++ b/unit.h @@ -209,9 +209,7 @@ namespace battleship{ virtual void move(Order){} virtual void patrol(Order){} virtual void launch(Order); - virtual void supply(Order){} - virtual void load(Order){} - virtual void unload(Order){} + virtual void handleResources(Order){} virtual void hack(Order){} float calculateRotation(vb01::Vector3, float, float); void removeBar(vb01::Node*);