refactored order addition

This commit is contained in:
devZoGok
2022-08-13 17:11:27 +03:00
parent f5a3b162f3
commit 72cbdd1ad8
18 changed files with 92 additions and 69 deletions
+5 -6
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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;
+6 -6
View File
@@ -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){
&& aircraftCarrier
&& pos.getDistanceFrom(lp) <= unitData::destinationOffset[id]
&& 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){
@@ -47,7 +47,7 @@ namespace battleship{
Vector3 tanPoint = pos + (jetSideVec + carrierSideVec) * radius;
float ang1 = (tanPoint - lp).getAngleBetween(carrierSideVec);
float ang2 = dirVec.getAngleBetween(-carrierSideVec);
float base = (tanPoint-lp).getLength() * cos(ang1);
float base = (tanPoint - lp).getLength() * cos(ang1);
float hyp = base / cos(ang2);
landingPos = (pos + dirVec * hyp);
toTurnPoint = true;
@@ -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;
+16 -8
View File
@@ -17,15 +17,14 @@ 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){
int numPaths = 6;
@@ -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;
}
}
+9 -4
View File
@@ -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
View File
@@ -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);
+2 -2
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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);
+23 -7
View File
@@ -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;
LineRenderer::getSingleton()->removeLine(orders[id].line.id);
orders.erase(orders.begin() + id);
}
+7 -6
View File
@@ -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;}
@@ -93,9 +93,10 @@ namespace battleship{
const int orderVecDispLength = 2000;
sf::SoundBuffer *selectionSfxBuffer;
sf::Sound *selectionSfx = nullptr;
vb01::Quad *hpBackground = nullptr, *hpForeground = nullptr;
vb01::Node *hpBackgroundNode = nullptr, *hpForegroundNode = nullptr;
int lenHpBar = 200;
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
View File
@@ -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);