Files
PlanetFleet/researchStruct.cpp
devZoGok 1d0bf8d349 using GameObject class as an order target
Destructable made a member of GameObject
cruise missiles can be shot down
2025-12-04 15:03:35 +02:00

69 lines
2.6 KiB
C++

#include "researchStruct.h"
#include "activeGameState.h"
#include "destructable.h"
#include "player.h"
#include "game.h"
#include <stateManager.h>
namespace battleship{
using namespace std;
using namespace vb01;
using namespace gameBase;
ResearchStruct::ResearchStruct(Player *player, int id, Vector3 pos, Quaternion rot, int buildStatus, Unit::State state) : Structure(player, id, pos, rot, buildStatus, state){
sol::table unitTable = generateView()["units"][id + 1];
generationRate = unitTable["generationRate"];
generationSpeed = unitTable["generationSpeed"];
researchCost = unitTable["researchCost"];
Vector2 size = Vector2(lenHpBar, 10);
researchStatusBackground = destructable->createBar(Vector2::VEC_ZERO, size, Vector4(0, 0, 0, 1));
researchStatusForeground = destructable->createBar(Vector2::VEC_ZERO, size, Vector4(1, 0, 1, 1));
}
ResearchStruct::~ResearchStruct(){
destructable->removeBar(researchStatusBackground);
destructable->removeBar(researchStatusForeground);
}
void ResearchStruct::update(){
Structure::update();
if(!isComplete()) return;
ActiveGameState *activeState = (ActiveGameState*)GameManager::getSingleton()->getStateManager()->getAppStateByType(AppStateType::ACTIVE_STATE);
Player *mainPlayer = (activeState ? activeState->getPlayer() : nullptr);
vector<Player*> selectingPlayers = Unit::getSelectingPlayers();
bool mainPlayerSelecting = (activeState && find(selectingPlayers.begin(), selectingPlayers.end(), mainPlayer) != selectingPlayers.end());
if(researchQueue.empty()){
if(destructable->getHealth() > .3 * destructable->getMaxHealth() && player->getResource(ResourceType::REFINEDS) >= researchCost && canUpdateResearch()){
player->updateResource(ResourceType::RESEARCH, generationSpeed, true);
player->updateResource(ResourceType::REFINEDS, -researchCost, true);
lastUpdateTime = getTime();
}
researchStatusBackground->setVisible(false);
researchStatusForeground->setVisible(false);
}
else if(!researchQueue.empty()){
destructable->displayStats(researchStatusForeground, researchStatusBackground, researchStatus, 100, mainPlayer == player && mainPlayerSelecting, Vector2(0, -10));
int techCost = Game::getSingleton()->getTechnology(researchQueue[0]).cost;
int playerResearch = player->getResource(ResourceType::RESEARCH);
if(techCost > playerResearch && canUpdateResearch()){
researchStatus += int(100 * ((float)playerResearch / techCost));
lastUpdateTime = getTime();
}
else if(researchStatus >= 100 || techCost <= playerResearch){
player->addTechnology(researchQueue[0]);
researchQueue.erase(researchQueue.begin());
researchStatus = 0;
}
}
}
}