using a generic number of resource types

ability to order to collect resources from buyers
This commit is contained in:
devZoGok
2025-04-21 15:55:45 +03:00
parent 13d1e8fcbd
commit 22c4146ffe
6 changed files with 97 additions and 68 deletions
+33 -14
View File
@@ -148,14 +148,16 @@ namespace battleship{
}
vector<TradeOffer*> offers = (gameObjHoveredOn && alliedGameObj ? mainPlayer->getTradeOffers(gameObjHoveredOn->getPlayer()) : vector<TradeOffer*>{});
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);
@@ -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));
}
+1 -1
View File
@@ -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));
}
}
+23 -27
View File
@@ -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,6 +57,12 @@ namespace battleship{
for(ResourceDeposit *rd : resourceDeposits)
rd->update();
updateTradeOffers();
}
void Player::updateTradeOffers(){
}
int Player::getOrderLineId(Order::TYPE type, Vector3 startPos, Vector3 endPos){
@@ -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<Player*, vector<TradedResource>> 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<Player*> 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<TradeOffer*>{}));
tradedResources.push_back(make_pair(pl, vector<TradedResource>{
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<Player*, vector<TradeOffer*>> &offers : tradeOffers)
if(offers.first == player)
+16 -5
View File
@@ -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<Unit*>);
std::vector<Unit*> getUnitsById(int, int = -1);
std::vector<Unit*> 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<TradeOffer*> 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<int> 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<int> 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<std::pair<Player*, std::vector<TradeOffer*>>> tradeOffers;
std::vector<std::pair<Player*, std::vector<TradedResource>>> tradedResources;
int getOrderLineId(Order::TYPE, vb01::Vector3, vb01::Vector3);
void initTradeOffersVec();
void initTradingVecs();
void updateTradeOffers();
};
}
+15 -12
View File
@@ -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;
}
}
};
}
+6 -6
View File
@@ -41,12 +41,12 @@ namespace battleship{
ActiveStateButton::onClick();
vector<Textbox*> 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();