From a572102fa0bf9f45020a84fdf9c94ee9ca2be7e7 Mon Sep 17 00:00:00 2001 From: devZoGok Date: Sat, 11 Nov 2023 14:44:12 +0200 Subject: [PATCH] factored out majority of ActiveGameState::issueOrder into Player::issueOrder --- activeGameState.cpp | 62 ++------------------------------------ player.cpp | 73 +++++++++++++++++++++++++++++++++++++++------ player.h | 4 ++- unit.cpp | 16 +++++++--- unit.h | 4 +-- 5 files changed, 83 insertions(+), 76 deletions(-) diff --git a/activeGameState.cpp b/activeGameState.cpp index efdc591..a6de60e 100755 --- a/activeGameState.cpp +++ b/activeGameState.cpp @@ -266,66 +266,8 @@ namespace battleship{ //TODO fix ejectable unit selection with multiple transports selected void ActiveGameState::issueOrder(Order::TYPE type, vector targets, bool addOrder) { - Vector3 color; - - switch(type){ - case Order::TYPE::MOVE: - color = Vector3::VEC_J; - break; - case Order::TYPE::ATTACK: - color = Vector3::VEC_I; - break; - case Order::TYPE::PATROL: - case Order::TYPE::GARRISON: - case Order::TYPE::EJECT: - color = Vector3::VEC_K; - break; - case Order::TYPE::BUILD: - color = Vector3(1, 1, 0); - break; - } - - if(type == Order::TYPE::EJECT){ - vector units = mainPlayer->getSelectedUnits(); - - for(Unit *u : units){ - const vector &garrisonSlots = u->getGarrisonSlots(); - - for(Unit::GarrisonSlot slot : garrisonSlots) - if(slot.vehicle) - targets.push_back(Order::Target((Unit*)slot.vehicle)); - } - } - else if(type != Order::TYPE::PATROL) - targets.push_back(Order::Target()); - - LineRenderer *lineRenderer = LineRenderer::getSingleton(); - - for (int i = 0; i < mainPlayer->getNumSelectedUnits(); ++i) { - Unit *u = mainPlayer->getSelectedUnit(i); - bool targetingSelf = false; - - for(Order::Target &targ : targets) - if(targ.unit && targ.unit == u){ - targetingSelf = true; - break; - } - - if(targetingSelf) continue; - - lineRenderer->addLine(u->getPos(), targets[i].pos, color); - vector lines = lineRenderer->getLines(); - - LineRenderer::Line line = lines[lines.size() - 1]; - Vector3 destDir = (selectingDestOrient ? GameObjectFrameController::getSingleton()->getGameObjectFrame(0).getDirVec() : Vector3::VEC_ZERO); - Order order(type, line, targets, destDir); - - if (addOrder) - u->addOrder(order); - else - u->setOrder(order); - } - + Vector3 destDir = (selectingDestOrient ? GameObjectFrameController::getSingleton()->getGameObjectFrame(0).getDirVec() : Vector3::VEC_ZERO); + mainPlayer->issueOrder(type, destDir, targets, addOrder); this->targets.clear(); } diff --git a/player.cpp b/player.cpp index 6fb5d72..61f4e71 100755 --- a/player.cpp +++ b/player.cpp @@ -1,6 +1,8 @@ #include #include "player.h" +#include "stateManager.h" +#include "activeGameState.h" #include "resourceDeposit.h" namespace battleship{ @@ -25,19 +27,72 @@ namespace battleship{ rd->update(); } - void Player::issueOrder(Order::TYPE type, vector targets, bool append){ - Order order; - order.type = type; - order.targets = targets; + int Player::getOrderLineId(Order::TYPE type, Vector3 startPos, Vector3 endPos){ + Vector3 color; + switch(type){ + case Order::TYPE::MOVE: + color = Vector3::VEC_J; + break; + case Order::TYPE::ATTACK: + color = Vector3::VEC_I; + break; + case Order::TYPE::PATROL: + case Order::TYPE::GARRISON: + case Order::TYPE::EJECT: + color = Vector3::VEC_K; + break; + case Order::TYPE::BUILD: + color = Vector3(1, 1, 0); + break; + } + + LineRenderer *lineRenderer = LineRenderer::getSingleton(); + lineRenderer->addLine(startPos, endPos, color); + vector lines = lineRenderer->getLines(); + + return lines[lines.size() - 1].id; + } + + void Player::issueOrder(Order::TYPE type, Vector3 destDir, vector targets, bool append){ vector selectedUnits = getSelectedUnits(); - for(Unit *u : selectedUnits){ - if(append) - u->addOrder(order); - else - u->setOrder(order); + if(type == Order::TYPE::EJECT){ + for(Unit *u : selectedUnits){ + const vector &garrisonSlots = u->getGarrisonSlots(); + + for(Unit::GarrisonSlot slot : garrisonSlots) + if(slot.vehicle) + targets.push_back(Order::Target((Unit*)slot.vehicle)); + } } + else if(type != Order::TYPE::PATROL) + targets.push_back(Order::Target()); + + for (Unit *u : selectedUnits) { + bool targetingSelf = false; + + for(Order::Target &targ : targets) + if(targ.unit && targ.unit == u){ + targetingSelf = true; + break; + } + + if(targetingSelf) continue; + + int lineId = -1; + ActiveGameState *activeState = ((ActiveGameState*)GameManager::getSingleton()->getStateManager()->getAppStateByType(AppStateType::ACTIVE_STATE)); + + if(activeState && activeState->getPlayer() == this) + lineId = getOrderLineId(type, u->getPos(), targets[0].pos); + + Order order(type, targets, destDir, lineId); + + if (append) + u->addOrder(order); + else + u->setOrder(order); + } } bool Player::isThisPlayersUnit(GameObject *u) { diff --git a/player.h b/player.h index 51fee4c..b8e5072 100755 --- a/player.h +++ b/player.h @@ -15,7 +15,7 @@ namespace battleship{ Player(int, int, int, vb01::Vector3 = vb01::Vector3::VEC_ZERO); ~Player(); void update(); - void issueOrder(Order::TYPE, std::vector, bool); + void issueOrder(Order::TYPE, vb01::Vector3, std::vector, bool); void deselectUnits(); void removeUnit(Unit*); void removeUnit(int); @@ -52,6 +52,8 @@ namespace battleship{ std::vector projectiles; std::vector resourceDeposits; vb01::Vector3 spawnPoint; + + int getOrderLineId(Order::TYPE, vb01::Vector3, vb01::Vector3); }; } diff --git a/unit.cpp b/unit.cpp index 147d253..f06665a 100755 --- a/unit.cpp +++ b/unit.cpp @@ -136,10 +136,16 @@ namespace battleship{ void Unit::update() { GameObject::update(); - if (!orders.empty()){ + if (!orders.empty() && orders[0].lineId != -1){ + bool display = (selected && canDisplayOrderLine()); LineRenderer *lineRenderer = LineRenderer::getSingleton(); - lineRenderer->toggleVisibility(orders[0].line.id, selected && canDisplayOrderLine()); - lineRenderer->changeLineField(orders[0].line.id, pos, LineRenderer::START); + lineRenderer->toggleVisibility(orders[0].lineId, display); + + if(display){ + lineRenderer->changeLineField(orders[0].lineId, pos, LineRenderer::START); + Vector3 targPos = (orders[0].targets[0].unit ? orders[0].targets[0].unit->getPos() : orders[0].targets[0].pos); + lineRenderer->changeLineField(orders[0].lineId, targPos, LineRenderer::END); + } } executeOrders(); @@ -297,7 +303,9 @@ namespace battleship{ } void Unit::removeOrder(int id) { - LineRenderer::getSingleton()->removeLine(orders[id].line.id); + if(orders[id].lineId != -1) + LineRenderer::getSingleton()->removeLine(orders[id].lineId); + orders.erase(orders.begin() + id); } diff --git a/unit.h b/unit.h index 894e464..f84f5d1 100755 --- a/unit.h +++ b/unit.h @@ -38,12 +38,12 @@ namespace battleship{ }; TYPE type; - vb01::LineRenderer::Line line; + int lineId = -1; vb01::Vector3 direction; std::vector targets; Order(){} - Order(TYPE t, vb01::LineRenderer::Line l, std::vector targ, vb01::Vector3 dir) : type(t), line(l), targets(targ), direction(dir){} + Order(TYPE t, std::vector targ, vb01::Vector3 dir, int lid = -1) : type(t), lineId(lid), targets(targ), direction(dir){} }; enum class MoveDir {LEFT, UP, FORW};