mirror of
https://github.com/devZoGok/PlanetFleet.git
synced 2026-08-26 19:43:29 +00:00
refactored order addition
This commit is contained in:
+5
-6
@@ -33,13 +33,12 @@ namespace battleship{
|
||||
|
||||
const int size = 50;
|
||||
|
||||
ActiveGameState::ActiveGameState(GuiAppState *guiState, Map *map, vector<Player*> players, int playerId) : AbstractAppState(
|
||||
ActiveGameState::ActiveGameState(GuiAppState *guiState, vector<Player*> players, int playerId) : AbstractAppState(
|
||||
AppStateType::ACTIVE_STATE,
|
||||
configData::calcSumBinds(AppStateType::ACTIVE_STATE, true),
|
||||
configData::calcSumBinds(AppStateType::ACTIVE_STATE, false),
|
||||
GameManager::getSingleton()->getPath() + "Scripts/options.lua"){
|
||||
this->guiState = guiState;
|
||||
this->map = map;
|
||||
this->players = players;
|
||||
|
||||
GameManager *gm = GameManager::getSingleton();
|
||||
@@ -226,7 +225,7 @@ namespace battleship{
|
||||
|
||||
for (int i = 0; i < selectedUnits.size(); ++i) {
|
||||
Unit *u = selectedUnits[i];
|
||||
lineRenderer->addLine(u->getPos(), *targets[i].pos, color);
|
||||
lineRenderer->addLine(u->getPos(), targets[i].pos, color);
|
||||
vector<LineRenderer::Line> lines = lineRenderer->getLines();
|
||||
o.line = lines[lines.size() - 1];
|
||||
|
||||
@@ -234,7 +233,7 @@ namespace battleship{
|
||||
if (type != Order::TYPE::LAUNCH || (u->getId() == 4 || u->getId() == 5)) {
|
||||
if(type == Order::TYPE::PATROL){
|
||||
Vector3 p = u->getPos();
|
||||
targets[0] = Order::Target(nullptr, new Vector3(p));
|
||||
targets[0] = Order::Target(nullptr, p);
|
||||
}
|
||||
|
||||
if (addOrder)
|
||||
@@ -254,7 +253,7 @@ namespace battleship{
|
||||
|
||||
vector<Ray::CollisionResult> results;
|
||||
Vector3 rayDir = (endPos - camPos).norm();
|
||||
Ray::retrieveCollisions(camPos, rayDir, map->getNodeParent(), results);
|
||||
Ray::retrieveCollisions(camPos, rayDir, Map::getSingleton()->getNodeParent(), results);
|
||||
std::map<Node*, Unit*> unitData;
|
||||
|
||||
Ray::sortResults(results);
|
||||
@@ -263,7 +262,7 @@ namespace battleship{
|
||||
vector<Node*> ancestors = results[0].mesh->getNode()->getAncestors();
|
||||
Node *node = ancestors[ancestors.size() - 2];
|
||||
std::map<Node*, Unit*>::iterator it = unitData.find(node);
|
||||
targets.push_back(Order::Target((it != unitData.end() ? unitData[node] : nullptr), new Vector3(results[0].pos)));
|
||||
targets.push_back(Order::Target((it != unitData.end() ? unitData[node] : nullptr), results[0].pos));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+1
-2
@@ -13,7 +13,7 @@ namespace vb01{
|
||||
namespace battleship{
|
||||
class ActiveGameState : public gameBase::AbstractAppState {
|
||||
public:
|
||||
ActiveGameState(GuiAppState*, Map*, std::vector<Player*> players, int);
|
||||
ActiveGameState(GuiAppState*, std::vector<Player*> players, int);
|
||||
~ActiveGameState();
|
||||
void onAttached();
|
||||
void onDettached();
|
||||
@@ -35,7 +35,6 @@ namespace battleship{
|
||||
void orientCamera(vb01::Vector3, double);
|
||||
|
||||
GuiAppState *guiState;
|
||||
Map *map;
|
||||
std::vector<Player*> players;
|
||||
Player *mainPlayer;
|
||||
vb01::Quad *dragbox = nullptr;
|
||||
|
||||
+2
-2
@@ -15,10 +15,10 @@ namespace battleship{
|
||||
|
||||
void Cruiser::launch(Order order) {
|
||||
if (guidedMissiles > 0) {
|
||||
float angle = order.targets[0].pos->getAngleBetween(dirVec);
|
||||
float angle = order.targets[0].pos.getAngleBetween(dirVec);
|
||||
Quaternion rotQuat = Quaternion(dirVec.x < 0 ? angle : -angle, Vector3(0, 1, 0));
|
||||
Vector3 basePos = leftVec * projectileData::pos[getId()][1][guidedMissiles - 1].x + upVec * projectileData::pos[getId()][1][guidedMissiles - 1].y - dirVec * projectileData::pos[getId()][1][guidedMissiles - 1].z;
|
||||
addProjectile(new GuidedMissile(this, pos + basePos, *order.targets[0].pos, rotQuat * Vector3(0, 1, 0), rotQuat * Vector3(1, 0, 0), rotQuat * Vector3(0, 0, -1), getId(), 1, 0));
|
||||
addProjectile(new GuidedMissile(this, pos + basePos, order.targets[0].pos, rotQuat * Vector3(0, 1, 0), rotQuat * Vector3(1, 0, 0), rotQuat * Vector3(0, 0, -1), getId(), 1, 0));
|
||||
removeOrder(0);
|
||||
guidedMissiles--;
|
||||
}
|
||||
|
||||
+1
-1
@@ -14,7 +14,7 @@ namespace battleship{
|
||||
void DemoJet::attack(Order order){
|
||||
if(!onBoard){
|
||||
Unit::attack(order);
|
||||
Vector3 target = *order.targets[0].pos;
|
||||
Vector3 target = order.targets[0].pos;
|
||||
float angle = dirVec.getAngleBetween(target - pos);
|
||||
Vector3 axis = dirVec.cross(target - pos);
|
||||
|
||||
|
||||
+2
-2
@@ -30,13 +30,13 @@ namespace battleship{
|
||||
}
|
||||
|
||||
void Destroyer::attack(Order order){
|
||||
Vector3 t = *order.targets[0].pos;
|
||||
Vector3 t = order.targets[0].pos;
|
||||
bool sub=false;
|
||||
InGameAppState *inGameState=((InGameAppState*)GameManager::getSingleton()->getStateManager()->getAppStateByType((int)AppStateType::IN_GAME_STATE));
|
||||
|
||||
for(Player *p : inGameState->getPlayers())
|
||||
for(Unit *u : p->getUnits())
|
||||
if(u->getType() == UNIT_TYPE::SUBMARINE&&order.targets[0].pos == u->getPosPtr())
|
||||
if(u->getType() == UNIT_TYPE::SUBMARINE && order.targets[0].pos == u->getPos())
|
||||
sub = true;
|
||||
|
||||
if(sub)
|
||||
|
||||
+3
-7
@@ -183,8 +183,7 @@ namespace battleship{
|
||||
this->playerId = 0;
|
||||
this->difficultyLevels = difficultyLevels;
|
||||
this->factions = factions;
|
||||
|
||||
map = new Map(mapName);
|
||||
this->mapName = mapName;
|
||||
}
|
||||
|
||||
InGameAppState::~InGameAppState() {
|
||||
@@ -193,7 +192,7 @@ namespace battleship{
|
||||
void InGameAppState::onAttached() {
|
||||
AbstractAppState::onAttached();
|
||||
|
||||
map->load();
|
||||
Map::getSingleton()->load(mapName);
|
||||
|
||||
for (int i = 0; i < factions.size(); i++) {
|
||||
int faction;
|
||||
@@ -219,7 +218,7 @@ namespace battleship{
|
||||
mainPlayer = players[playerId];
|
||||
StateManager *stateManager = GameManager::getSingleton()->getStateManager();
|
||||
guiState = ((GuiAppState*)stateManager->getAppStateByType((int)AppStateType::GUI_STATE));
|
||||
activeState = new ActiveGameState(guiState, map, players, playerId);
|
||||
activeState = new ActiveGameState(guiState, players, playerId);
|
||||
stateManager->attachAppState(activeState);
|
||||
|
||||
UnitDataManager *unitDataManager = UnitDataManager::getSingleton();
|
||||
@@ -238,9 +237,6 @@ namespace battleship{
|
||||
}
|
||||
|
||||
void InGameAppState::update() {
|
||||
if (map)
|
||||
map->update();
|
||||
|
||||
for (Player *p : players)
|
||||
if (p) {
|
||||
p->update();
|
||||
|
||||
+1
-1
@@ -135,8 +135,8 @@ namespace battleship{
|
||||
std::vector<std::string> difficultyLevels, factions;
|
||||
std::vector<Projectile*> projectiles;
|
||||
std::vector<Fx> fx;
|
||||
std::string mapName;
|
||||
Player *mainPlayer;
|
||||
Map *map;
|
||||
int playerId;
|
||||
ActiveGameState* activeState;
|
||||
GuiAppState* guiState;
|
||||
|
||||
@@ -24,14 +24,14 @@ namespace battleship{
|
||||
if (orders.size() == 0) {
|
||||
Order o;
|
||||
o.type = Order::TYPE::MOVE;
|
||||
o.targets.push_back(Order::Target(nullptr, new Vector3(lp)));
|
||||
o.targets.push_back(Order::Target(nullptr, lp));
|
||||
setOrder(o);
|
||||
}
|
||||
|
||||
if (!landing
|
||||
&& aircraftCarrier
|
||||
&& pos.getDistanceFrom(lp) <= unitData::destinationOffset[id]
|
||||
&&*orders[0].targets[0].pos == lp){
|
||||
&& orders[0].targets[0].pos == lp){
|
||||
float angle = dirVec.getAngleBetween(aircraftCarrier->getDirVec()), maxAngle = PI - anglePrecision[id] / 180 * PI;
|
||||
|
||||
if(!toTurnPoint && anglePrecision[id] / 180 * PI < angle && angle < maxAngle){
|
||||
@@ -84,7 +84,7 @@ namespace battleship{
|
||||
Vector3 offsetDir = Quaternion(PI / 2, upVec) * destDir;
|
||||
Vector3 destDirPos = Quaternion(angle, upVec) * dirVec;
|
||||
Vector3 offsetDirPos = Quaternion(angle + PI / 2, upVec) * dirVec;
|
||||
Vector3 hypVec = *orders[0].targets[0].pos - destDirPos;
|
||||
Vector3 hypVec = orders[0].targets[0].pos - destDirPos;
|
||||
float triAngle = hypVec.getAngleBetween(offsetDir);
|
||||
float distance = cos(triAngle) * hypVec.getLength();
|
||||
Vector3 destPoint = offsetDirPos + offsetDirPos.norm() * distance;
|
||||
|
||||
@@ -17,14 +17,13 @@ using namespace gameBase;
|
||||
namespace battleship{
|
||||
using namespace configData;
|
||||
|
||||
Map::Map(string mapName) {
|
||||
this->mapName = mapName;
|
||||
}
|
||||
Map *map = nullptr;
|
||||
|
||||
Map::~Map() {
|
||||
}
|
||||
Map* Map::getSingleton(){
|
||||
if(!map)
|
||||
map = new Map;
|
||||
|
||||
void Map::update() {
|
||||
return map;
|
||||
}
|
||||
|
||||
void Map::loadSkybox(LuaManager *luaManager){
|
||||
@@ -102,7 +101,8 @@ namespace battleship{
|
||||
}
|
||||
}
|
||||
|
||||
void Map::load() {
|
||||
void Map::load(string mapName) {
|
||||
this->mapName = mapName;
|
||||
LuaManager *luaManager = LuaManager::getSingleton();
|
||||
luaManager->buildScript(vector<string>{GameManager::getSingleton()->getPath() + "Models/Maps/" + mapName + "/" + mapName + ".lua"});
|
||||
|
||||
@@ -174,4 +174,12 @@ namespace battleship{
|
||||
}
|
||||
|
||||
void Map::unload() {}
|
||||
|
||||
Vector3 Map::getCellPos(){
|
||||
return Vector3::VEC_ZERO;
|
||||
}
|
||||
|
||||
int Map::getCellId(){
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -20,19 +20,24 @@ namespace battleship{
|
||||
|
||||
class Map {
|
||||
public:
|
||||
Map(std::string);
|
||||
~Map();
|
||||
void update();
|
||||
void load();
|
||||
static Map* getSingleton();
|
||||
~Map(){}
|
||||
void update(){}
|
||||
void load(std::string);
|
||||
void unload();
|
||||
vb01::Vector3 getCellPos();
|
||||
int getCellId();
|
||||
inline vb01::Node* getNodeParent(){return nodeParent;}
|
||||
inline vb01::Vector2 getSize(){return size;}
|
||||
private:
|
||||
vb01::Node *nodeParent = nullptr;
|
||||
std::string mapName;
|
||||
float cellSize = 1;
|
||||
GraphNode*** cells = nullptr;
|
||||
int **weights = nullptr;
|
||||
vb01::Vector2 size;
|
||||
|
||||
Map(){}
|
||||
void loadSkybox(gameBase::LuaManager*);
|
||||
void loadTerrain(gameBase::LuaManager*);
|
||||
void loadWaterbodies(gameBase::LuaManager*);
|
||||
|
||||
+3
-3
@@ -6,7 +6,7 @@
|
||||
using namespace vb01;
|
||||
|
||||
namespace battleship{
|
||||
Missile::Missile(Unit *unit, Node *node, Vector3 *target, Vector3 pos, Vector3 dir, Vector3 left, Vector3 up, int id, int weaponTypeId, int weaponId) :
|
||||
Missile::Missile(Unit *unit, Node *node, Vector3 target, Vector3 pos, Vector3 dir, Vector3 left, Vector3 up, int id, int weaponTypeId, int weaponId) :
|
||||
Projectile(unit, node, pos, dir, left, up, id, weaponTypeId, weaponId) {
|
||||
this->target = target;
|
||||
this->type = (MissileType)weaponId;
|
||||
@@ -17,8 +17,8 @@ namespace battleship{
|
||||
Projectile::update();
|
||||
pos = pos + dirVec * speed;
|
||||
node->setPosition(pos);
|
||||
float angle = dirVec.getAngleBetween(*target - pos);
|
||||
Vector3 axis = dirVec.cross(*target - pos).norm();
|
||||
float angle = dirVec.getAngleBetween(target - pos);
|
||||
Vector3 axis = dirVec.cross(target - pos).norm();
|
||||
|
||||
if(rotationSpeed / 180 * PI < angle){
|
||||
Quaternion rotQuat = Quaternion(rotationSpeed / 180 * PI, axis);
|
||||
|
||||
@@ -9,13 +9,13 @@ namespace battleship{
|
||||
|
||||
class Missile : public Projectile {
|
||||
public:
|
||||
Missile(Unit*, vb01::Node*, vb01::Vector3*, vb01::Vector3, vb01::Vector3, vb01::Vector3, vb01::Vector3, int, int, int);
|
||||
Missile(Unit*, vb01::Node*, vb01::Vector3, vb01::Vector3, vb01::Vector3, vb01::Vector3, vb01::Vector3, int, int, int);
|
||||
~Missile(){}
|
||||
void update();
|
||||
private:
|
||||
s64 initTime;
|
||||
int selfDistructTime = 10000;
|
||||
vb01::Vector3 *target;
|
||||
vb01::Vector3 target;
|
||||
float rotationSpeed = 5;
|
||||
MissileType type;
|
||||
};
|
||||
|
||||
+8
-9
@@ -15,24 +15,23 @@ namespace battleship{
|
||||
|
||||
void MissileJet::attack(Order order) {
|
||||
if(!onBoard && canFire() && missilesInstalled){
|
||||
Vector3 target = *order.targets[0].pos;
|
||||
Vector3 target = order.targets[0].pos;
|
||||
float distance=pos.getDistanceFrom(target);
|
||||
|
||||
if(distance <= range){
|
||||
Vector3 *targetPtr = nullptr;
|
||||
Vector3 targetPtr = Vector3::VEC_ZERO;
|
||||
InGameAppState *inGameState = ((InGameAppState*)GameManager::getSingleton()->getStateManager()->getAppStateByType((int)AppStateType::IN_GAME_STATE));
|
||||
|
||||
for(Player *p : inGameState->getPlayers())
|
||||
for(Unit *u : p->getUnits()){
|
||||
bool jet = (u->getType() == UNIT_TYPE::MISSILE_JET || u->getType() == UNIT_TYPE::DEMO_JET);
|
||||
if((jet && type == AAM) && (!jet && type == AWM) && u->getPosPtr() == order.targets[0].pos)
|
||||
targetPtr = u->getPosPtr();
|
||||
|
||||
if((jet && type == AAM) && (!jet && type == AWM) && u->getPos() == order.targets[0].pos)
|
||||
targetPtr = u->getPos();
|
||||
}
|
||||
|
||||
if(!targetPtr){
|
||||
targetPtr = new Vector3();
|
||||
*targetPtr = target;
|
||||
}
|
||||
if(targetPtr != Vector3::VEC_ZERO)
|
||||
targetPtr = target;
|
||||
|
||||
fireMissile(targetPtr);
|
||||
}
|
||||
@@ -45,7 +44,7 @@ namespace battleship{
|
||||
removeOrder(0);
|
||||
}
|
||||
|
||||
void MissileJet::fireMissile(Vector3 *t) {
|
||||
void MissileJet::fireMissile(Vector3 t) {
|
||||
Vector3 p = pos + leftVec * projectileData::pos[id][0][missiles - 1].x + upVec * projectileData::pos[id][0][missiles - 1].y - dirVec * projectileData::pos[id][0][missiles - 1].z;
|
||||
addProjectile(new Missile(this, missileNodes[missiles-1], t, p, dirVec, leftVec, upVec, id, 0, 0));
|
||||
missileNodes[missiles-1]->setParent(Root::getSingleton()->getRootNode());
|
||||
|
||||
+1
-1
@@ -15,7 +15,7 @@ namespace battleship {
|
||||
void installMissiles(bool);
|
||||
private:
|
||||
void attack(Order);
|
||||
void fireMissile(vb01::Vector3*);
|
||||
void fireMissile(vb01::Vector3);
|
||||
inline bool canFire() {return missiles > 0 && vb01::getTime() - lastFireTime > rateOfFire;}
|
||||
MissileType type;
|
||||
vb01::Node *missileNodes[2]{nullptr,nullptr};
|
||||
|
||||
+1
-1
@@ -12,7 +12,7 @@ namespace battleship{
|
||||
Submarine::Submarine(Player *player, Vector3 pos, int id) : Unit(player, pos, id) {}
|
||||
|
||||
void Submarine::attack(Order order) {
|
||||
float angle = dirVec.getAngleBetween(*(order.targets[0].pos) - pos);
|
||||
float angle = dirVec.getAngleBetween(order.targets[0].pos - pos);
|
||||
|
||||
if(angle / PI * 180 > 50)
|
||||
Unit::move(order, range);
|
||||
|
||||
@@ -11,6 +11,7 @@
|
||||
#include "unit.h"
|
||||
#include "util.h"
|
||||
#include "inGameAppState.h"
|
||||
#include "pathfinder.h"
|
||||
#include "unitData.h"
|
||||
|
||||
using namespace glm;
|
||||
@@ -152,7 +153,7 @@ namespace battleship{
|
||||
void Unit::move(Order order, float destOffset) {
|
||||
float movementAmmount, radius = getCircleRadius(), angle = 0.;
|
||||
int targetId = (order.type == Order::TYPE::PATROL ? getNextPatrolPointId(order.targets.size()) : 0);
|
||||
Vector3 dest = *order.targets[targetId].pos;
|
||||
Vector3 dest = order.targets[targetId].pos;
|
||||
dest.y = pos.y;
|
||||
Vector3 center;
|
||||
|
||||
@@ -271,13 +272,28 @@ namespace battleship{
|
||||
return projectiles;
|
||||
}
|
||||
|
||||
void Unit::addOrder(Order order){
|
||||
u32 **weights = new u32*;
|
||||
float eps = getCircleRadius();
|
||||
Map *map = Map::getSingleton();
|
||||
Vector2 mapSize = map->getSize();
|
||||
int numCells = int(mapSize.x / eps) * int(mapSize.y / eps);
|
||||
|
||||
Pathfinder *pathfinder = Pathfinder::getSingleton();
|
||||
Vector3 **verts = nullptr;
|
||||
pathfinder->generateWeights(weights, numCells, verts, mapSize);
|
||||
|
||||
vector<int> path = pathfinder->findPath(weights, numCells, map->getCellId(), map->getCellId());
|
||||
pathPoints.clear();
|
||||
|
||||
for(int p : path)
|
||||
pathPoints.push_back(map->getCellPos());
|
||||
|
||||
orders.push_back(order);
|
||||
}
|
||||
|
||||
void Unit::removeOrder(int id) {
|
||||
LineRenderer::getSingleton()->removeLine(orders[id].line.id);
|
||||
|
||||
for(Order::Target t : orders[id].targets)
|
||||
if(t.unit)
|
||||
delete t.pos;
|
||||
|
||||
orders.erase(orders.begin() + id);
|
||||
}
|
||||
|
||||
|
||||
@@ -28,11 +28,11 @@ namespace battleship{
|
||||
enum class TYPE {ATTACK, MOVE, PATROL, LAUNCH};
|
||||
struct Target{
|
||||
Unit *unit = nullptr;
|
||||
vb01::Vector3 *pos = nullptr;
|
||||
vb01::Vector3 pos;
|
||||
|
||||
Target(){}
|
||||
|
||||
Target(Unit *unit, vb01::Vector3 *pos){
|
||||
Target(Unit *unit, vb01::Vector3 pos){
|
||||
this->unit = unit;
|
||||
this->pos = pos;
|
||||
}
|
||||
@@ -62,7 +62,7 @@ namespace battleship{
|
||||
float getCircleRadius();
|
||||
vb01::Vector3 getCorner(int);
|
||||
std::vector<Projectile*> getProjectiles();
|
||||
inline void addOrder(Order o){orders.push_back(o);}
|
||||
void addOrder(Order);
|
||||
inline bool isSelected(){return selected;}
|
||||
inline bool isSelectable(){return selectable;}
|
||||
inline bool isDebuggable(){return debugging;}
|
||||
@@ -96,6 +96,7 @@ namespace battleship{
|
||||
vb01::Quad *hpBackground = nullptr, *hpForeground = nullptr;
|
||||
vb01::Node *hpBackgroundNode = nullptr, *hpForegroundNode = nullptr;
|
||||
int lenHpBar = 200;
|
||||
std::vector<vb01::Vector3> pathPoints;
|
||||
protected:
|
||||
Player *player;
|
||||
MoveDir moveDir = MoveDir::FORWARD;
|
||||
|
||||
+1
-1
@@ -121,7 +121,7 @@ namespace battleship{
|
||||
}
|
||||
|
||||
void Vessel::attack(Order order) {
|
||||
Vector3 target = *order.targets[0].pos;
|
||||
Vector3 target = order.targets[0].pos;
|
||||
|
||||
for (Turret *t : turrets) {
|
||||
Vector3 turrPos = t->getNode()->localToGlobalPosition(Vector3::VEC_ZERO);
|
||||
|
||||
Reference in New Issue
Block a user