factored out majority of ActiveGameState::issueOrder into Player::issueOrder

This commit is contained in:
devZoGok
2023-11-11 14:44:12 +02:00
parent be8c6f534f
commit a572102fa0
5 changed files with 83 additions and 76 deletions
+2 -60
View File
@@ -266,66 +266,8 @@ namespace battleship{
//TODO fix ejectable unit selection with multiple transports selected
void ActiveGameState::issueOrder(Order::TYPE type, vector<Order::Target> 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<Unit*> units = mainPlayer->getSelectedUnits();
for(Unit *u : units){
const vector<Unit::GarrisonSlot> &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<LineRenderer::Line> 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();
}
+64 -9
View File
@@ -1,6 +1,8 @@
#include <solUtil.h>
#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<Order::Target> 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<LineRenderer::Line> lines = lineRenderer->getLines();
return lines[lines.size() - 1].id;
}
void Player::issueOrder(Order::TYPE type, Vector3 destDir, vector<Order::Target> targets, bool append){
vector<Unit*> 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<Unit::GarrisonSlot> &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) {
+3 -1
View File
@@ -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<Order::Target>, bool);
void issueOrder(Order::TYPE, vb01::Vector3, std::vector<Order::Target>, bool);
void deselectUnits();
void removeUnit(Unit*);
void removeUnit(int);
@@ -52,6 +52,8 @@ namespace battleship{
std::vector<Projectile*> projectiles;
std::vector<ResourceDeposit*> resourceDeposits;
vb01::Vector3 spawnPoint;
int getOrderLineId(Order::TYPE, vb01::Vector3, vb01::Vector3);
};
}
+12 -4
View File
@@ -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);
}
+2 -2
View File
@@ -38,12 +38,12 @@ namespace battleship{
};
TYPE type;
vb01::LineRenderer::Line line;
int lineId = -1;
vb01::Vector3 direction;
std::vector<Target> targets;
Order(){}
Order(TYPE t, vb01::LineRenderer::Line l, std::vector<Target> targ, vb01::Vector3 dir) : type(t), line(l), targets(targ), direction(dir){}
Order(TYPE t, std::vector<Target> targ, vb01::Vector3 dir, int lid = -1) : type(t), lineId(lid), targets(targ), direction(dir){}
};
enum class MoveDir {LEFT, UP, FORW};