From 22c4146ffe76768d2bad0d588ed64973bc89f263 Mon Sep 17 00:00:00 2001 From: devZoGok Date: Mon, 21 Apr 2025 15:55:45 +0300 Subject: [PATCH] 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();