mirror of
https://github.com/devZoGok/PlanetFleet.git
synced 2026-08-26 19:43:29 +00:00
refactored attacking for vessels, some bugfixes
This commit is contained in:
+10
-26
@@ -147,7 +147,7 @@ namespace battleship{
|
||||
}
|
||||
|
||||
void ActiveGameState::onAttached() {
|
||||
readFile(PATH + "../options.cfg", bindingsLines, configData::numBinds[AppStateType::IN_GAME_STATE]);
|
||||
readFile(PATH + "../options.cfg", bindingsLines, configData::numConfBinds[AppStateType::IN_GAME_STATE], configData::numConfBinds[AppStateType::ACTIVE_STATE]);
|
||||
|
||||
AbstractAppState::onAttached();
|
||||
|
||||
@@ -184,28 +184,6 @@ namespace battleship{
|
||||
|
||||
mappings.push_back(m);
|
||||
}
|
||||
|
||||
Mapping *rightClick = new Mapping;
|
||||
rightClick->bind = Bind::LOOK_AROUND;
|
||||
rightClick->type = Mapping::MOUSE_KEY;
|
||||
rightClick->trigger = 1;
|
||||
rightClick->action = true;
|
||||
|
||||
Mapping *deselect = new Mapping;
|
||||
deselect->bind = Bind::DESELECT;
|
||||
deselect->type = Mapping::MOUSE_KEY;
|
||||
deselect->trigger = 1;
|
||||
deselect->action = true;
|
||||
|
||||
Mapping *leftClick = new Mapping;
|
||||
leftClick->bind = Bind::DRAG_BOX;
|
||||
leftClick->type = Mapping::MOUSE_KEY;
|
||||
leftClick->trigger = 0;
|
||||
leftClick->action = true;
|
||||
|
||||
mappings.push_back(rightClick);
|
||||
mappings.push_back(leftClick);
|
||||
mappings.push_back(deselect);
|
||||
}
|
||||
|
||||
void ActiveGameState::onDettached() {
|
||||
@@ -485,8 +463,14 @@ namespace battleship{
|
||||
Ray::retrieveCollisions(camPos, (endPos - camPos).norm(), map->getWaterNode(), results);
|
||||
Ray::sortResults(results);
|
||||
|
||||
if(!results.empty())
|
||||
issueOrder(Order::TYPE::MOVE, vector<Order::Target>{Order::Target(false, new Vector3(results[0].pos))}, false);
|
||||
if(!results.empty()){
|
||||
Order::TYPE type = Order::TYPE::MOVE;
|
||||
|
||||
if(controlPressed)
|
||||
type = type = Order::TYPE::ATTACK;
|
||||
|
||||
issueOrder(type, vector<Order::Target>{Order::Target(false, new Vector3(results[0].pos))}, false);
|
||||
}
|
||||
}
|
||||
|
||||
void ActiveGameState::onAction(int bind, bool isPressed) {
|
||||
@@ -549,7 +533,7 @@ namespace battleship{
|
||||
controlPressed = isPressed;
|
||||
break;
|
||||
case Bind::LEFT_SHIFT:
|
||||
shiftPressed=isPressed;
|
||||
shiftPressed = isPressed;
|
||||
break;
|
||||
case Bind::SELECT_PATROL_POINTS:
|
||||
selectingPatrolPoints = isPressed;
|
||||
|
||||
@@ -9,24 +9,18 @@ namespace battleship{
|
||||
LEFT,
|
||||
RIGHT,
|
||||
DELETE_CHAR,
|
||||
CAPS_LOCK,
|
||||
SHIFT_CAPS,
|
||||
SPACE,
|
||||
PLUS,
|
||||
MINUS,
|
||||
DEVSTERISK,
|
||||
TOGGLE_MAIN_MENU,
|
||||
LOOK_AROUND,
|
||||
DRAG_BOX,
|
||||
DESELECT,
|
||||
LEFT_CONTROL,
|
||||
HALT,
|
||||
ZOOM_IN,
|
||||
ZOOM_OUT,
|
||||
LOOK_AROUND,
|
||||
LOOK_UP,
|
||||
LOOK_DOWN,
|
||||
LOOK_LEFT,
|
||||
LOOK_RIGHT,
|
||||
DRAG_BOX,
|
||||
DESELECT,
|
||||
LEFT_CONTROL,
|
||||
LEFT_SHIFT,
|
||||
SELECT_PATROL_POINTS,
|
||||
LAUNCH,
|
||||
|
||||
+8
-14
@@ -28,23 +28,17 @@ namespace battleship{
|
||||
Bind::LEFT,
|
||||
Bind::RIGHT,
|
||||
Bind::DELETE_CHAR,
|
||||
Bind::CAPS_LOCK,
|
||||
Bind::SHIFT_CAPS,
|
||||
Bind::SPACE,
|
||||
Bind::PLUS,
|
||||
Bind::MINUS,
|
||||
Bind::DEVSTERISK
|
||||
},
|
||||
{
|
||||
Bind::TOGGLE_MAIN_MENU
|
||||
},
|
||||
{
|
||||
Bind::HALT,
|
||||
Bind::ZOOM_IN,
|
||||
Bind::ZOOM_OUT,
|
||||
Bind::LOOK_AROUND,
|
||||
Bind::DRAG_BOX,
|
||||
Bind::DESELECT,
|
||||
Bind::HALT,
|
||||
Bind::ZOOM_IN,
|
||||
Bind::ZOOM_OUT,
|
||||
Bind::LEFT_CONTROL,
|
||||
Bind::LEFT_SHIFT,
|
||||
Bind::SELECT_PATROL_POINTS,
|
||||
@@ -83,12 +77,12 @@ namespace battleship{
|
||||
GLFW_KEY_ESCAPE
|
||||
},
|
||||
{
|
||||
1,
|
||||
0,
|
||||
1,
|
||||
GLFW_KEY_H,
|
||||
3,
|
||||
4,
|
||||
1,
|
||||
0,
|
||||
2,
|
||||
GLFW_KEY_LEFT_CONTROL,
|
||||
GLFW_KEY_LEFT_SHIFT,
|
||||
GLFW_KEY_P,
|
||||
@@ -111,12 +105,12 @@ namespace battleship{
|
||||
const static bool isKey[numAppStates][numMaxBinds]{
|
||||
{0,0,0,1,1,1,1,1,1,1,1,1},
|
||||
{1},
|
||||
{1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1,1,1,1,1,1,1,1,1,1,1,1}
|
||||
{0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1,1,1,1,1,1,1,1,1,1,1,1}
|
||||
};
|
||||
const static bool isAnalog[numAppStates][numMaxBinds]{
|
||||
{0,0,0,0,0,0,0,0,0,0,0,0},
|
||||
{0},
|
||||
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,0,0,0,0,0,0,0,0,0,0,0}
|
||||
{1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,0,0,0,0,0,0,0,0,0,0,0}
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
@@ -77,12 +77,6 @@ namespace battleship{
|
||||
leftClick->trigger = 0;
|
||||
leftClick->action = true;
|
||||
|
||||
Mapping *leftShift = new Mapping;
|
||||
leftShift->bind = Bind::SHIFT_CAPS;
|
||||
leftShift->type = Mapping::KEYBOARD;
|
||||
leftShift->trigger = GLFW_KEY_LEFT_SHIFT;
|
||||
leftShift->action = true;
|
||||
|
||||
Mapping *deleteCharacter = new Mapping;
|
||||
deleteCharacter->bind = Bind::DELETE_CHAR;
|
||||
deleteCharacter->type = Mapping::KEYBOARD;
|
||||
@@ -102,7 +96,6 @@ namespace battleship{
|
||||
down->action = true;
|
||||
|
||||
mappings.push_back(leftClick);
|
||||
mappings.push_back(leftShift);
|
||||
mappings.push_back(deleteCharacter);
|
||||
mappings.push_back(up);
|
||||
mappings.push_back(down);
|
||||
|
||||
+5
-23
@@ -1,23 +1,5 @@
|
||||
mainMenu:12,0,1,256
|
||||
pitchJetUp:12,0,1,3
|
||||
pitchJetUp:12,0,1,3
|
||||
pitchJetUp:12,0,1,3
|
||||
pitchJetUp:12,0,1,3
|
||||
pitchJetUp:12,0,1,3
|
||||
pitchJetUp:12,0,1,3
|
||||
pitchJetUp:12,0,1,3
|
||||
pitchJetUp:12,0,1,3
|
||||
pitchJetUp:12,0,1,3
|
||||
pitchJetUp:12,0,1,3
|
||||
pitchJetUp:12,0,1,3
|
||||
pitchJetUp:12,0,1,3
|
||||
pitchJetUp:12,0,1,3
|
||||
pitchJetUp:12,0,1,3
|
||||
pitchJetUp:12,0,1,3
|
||||
pitchJetUp:12,0,1,3
|
||||
pitchJetUp:12,0,1,3
|
||||
pitchJetUp:12,0,1,3
|
||||
pitchJetUp:12,0,1,3
|
||||
pitchJetUp:12,0,1,3
|
||||
pitchJetUp:12,0,1,3
|
||||
pitchJetUp:12,0,1,3
|
||||
mainMenu:6,0,1,256
|
||||
lookAround:7,1,1,1
|
||||
dragbox:8,1,1,0
|
||||
deselect:9,1,1,1
|
||||
leftControl:10,0,1,341
|
||||
|
||||
@@ -92,6 +92,10 @@ namespace battleship{
|
||||
}
|
||||
|
||||
void Unit::update() {
|
||||
leftVec = model->getGlobalAxis(0);
|
||||
upVec = model->getGlobalAxis(1);
|
||||
dirVec = model->getGlobalAxis(2);
|
||||
|
||||
if (!orders.empty()){
|
||||
LineRenderer *lineRenderer = LineRenderer::getSingleton();
|
||||
lineRenderer->toggleVisibility(orders[0].line.id, selected && canDisplayOrderLine());
|
||||
@@ -195,15 +199,6 @@ namespace battleship{
|
||||
}
|
||||
|
||||
void Unit::attack(Order order) {
|
||||
Vector3 target = *order.targets[0].pos;
|
||||
|
||||
if (pos.getDistanceFrom(target) >= range)
|
||||
move(order, range);
|
||||
InGameAppState *inGameState=((InGameAppState*)GameManager::getSingleton()->getStateManager()->getAppStateByType((int)AppStateType::IN_GAME_STATE));
|
||||
|
||||
for(Player *p : inGameState->getPlayers())
|
||||
for(Unit *u : p->getUnits())
|
||||
if(u->getPosPtr() == order.targets[0].pos){}
|
||||
}
|
||||
|
||||
void Unit::move(Order order, float destOffset) {
|
||||
@@ -233,7 +228,7 @@ namespace battleship{
|
||||
if (angle > anglePrecision[id]) {
|
||||
float rotAngle = maxTurnAngle > angle ? angle : maxTurnAngle;
|
||||
angle -= rotAngle;
|
||||
turn(moveDir == MoveDir::RIGHT ? rotAngle : -rotAngle);
|
||||
turn(moveDir == MoveDir::RIGHT ? -rotAngle : rotAngle);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -269,7 +264,6 @@ namespace battleship{
|
||||
void Unit::turn(float angle) {
|
||||
Quaternion rotQuat = Quaternion(PI / 180 * angle, Vector3(0, 1, 0));
|
||||
model->setOrientation(rotQuat * model->getOrientation());
|
||||
dirVec = rotQuat * dirVec, leftVec = rotQuat * leftVec;
|
||||
}
|
||||
|
||||
void Unit::halt() {
|
||||
|
||||
+46
-40
@@ -20,7 +20,6 @@ namespace battleship{
|
||||
|
||||
Vessel::Turret::Turret(Unit *vessel, int unitId, int turretId) {
|
||||
this->vessel = vessel;
|
||||
hull = vessel->getNode()->getChild(0);
|
||||
this->unitId = unitId;
|
||||
this->turretId = turretId;
|
||||
|
||||
@@ -35,12 +34,14 @@ namespace battleship{
|
||||
turretMat->addBoolUniform("lightingEnabled", false);
|
||||
turretMat->addTexUniform("textures[0]", turretDiffTex, true);
|
||||
|
||||
turret = hull->getChild(turretId);
|
||||
turret->getMesh(0)->setMaterial(turretMat);
|
||||
Node *hull = vessel->getNode()->getChild(0);
|
||||
node = hull->getChild(turretId);
|
||||
node->getMesh(0)->setMaterial(turretMat);
|
||||
initNodeRot = node->getOrientation();
|
||||
|
||||
for(int i = 0; i < numberOfMantlets[unitId][turretId]; i++){
|
||||
Mantlet mantlet;
|
||||
mantlet.mantletNode = turret->getChild(i);
|
||||
mantlet.mantletNode = node->getChild(i);
|
||||
mantlet.mantletNode->getMesh(0)->setMaterial(turretMat);
|
||||
mantlet.barrelNode = mantlet.mantletNode->getChild(0);
|
||||
mantlet.barrelNode->getMesh(0)->setMaterial(turretMat);
|
||||
@@ -68,6 +69,9 @@ namespace battleship{
|
||||
fxNode->setMaterialType(EMT_TRANSPARENT_ADD_COLOR);
|
||||
fxNode->setVisible(false);
|
||||
*/
|
||||
|
||||
maxAngle = unitData::turretMaxAngle[unitId][turretId] / 180 * PI;
|
||||
rotationSpeed = unitData::turretRotationSpeed[unitId][turretId] / 180 * PI;
|
||||
|
||||
sfxBuffer = new sf::SoundBuffer();
|
||||
|
||||
@@ -76,25 +80,23 @@ namespace battleship{
|
||||
}
|
||||
|
||||
void Vessel::Turret::rotate(double angle) {
|
||||
Quaternion rotQuat = Quaternion(PI / 180 * angle, Vector3(0, 1, 0));
|
||||
//turret->setOrientation(vector3df(0, turret->getRotation().Y + angle, 0));
|
||||
dirVec = rotQuat * dirVec, leftVec = rotQuat * leftVec;
|
||||
this->angle += angle;
|
||||
node->setOrientation(Quaternion(this->angle, Vector3::VEC_J) * initNodeRot);
|
||||
}
|
||||
|
||||
void Vessel::Turret::update() {
|
||||
/*
|
||||
Node *rootNode = Root::getSingleton()->getRootNode();
|
||||
Vector3 turretPosition = turret->localToGlobalPosition(Vector3::VEC_ZERO);
|
||||
float hullAngle = PI / 180 /* hullNode->getRotation().Y*/;
|
||||
float hullAngle = PI / 180;
|
||||
float turretAngle = PI / 180 * angle;
|
||||
/*
|
||||
quaternion rotQuat = rotQuat.fromAngleAxis(hullAngle + turretAngle, vector3df(0, 1, 0));
|
||||
quaternion offsetQuat = offsetQuat.fromAngleAxis(PI / 180 * unitData::turretAngleOffset[unitId][turretId], vector3df(0, 1, 0));
|
||||
dirVec = rotQuat * (offsetQuat * vector3df(0, 0, -1)), leftVec = rotQuat * (offsetQuat * vector3df(1, 0, 0));
|
||||
emitter->setDirection(dirVec);
|
||||
if(getTime()-lastShotTime>30&&fxNode->isVisible())
|
||||
fxNode->setVisible(false);
|
||||
*/
|
||||
dirVec = node->getGlobalAxis(2), leftVec = node->getGlobalAxis(0);
|
||||
}
|
||||
|
||||
void Vessel::Turret::debug() {
|
||||
@@ -109,32 +111,38 @@ namespace battleship{
|
||||
*/
|
||||
}
|
||||
|
||||
Vector3* Vessel::Turret::getInitDirs(){
|
||||
Vector3 *initDirs = new Vector3[2];
|
||||
Vector3 Vessel::Turret::getInitDir(int dirType){
|
||||
Vector3 initDirs[3];
|
||||
|
||||
switch(unitData::initDirs[unitId][turretId]){
|
||||
case unitData::FORWARD:
|
||||
initDirs[0] = vessel->getDirVec();
|
||||
initDirs[1] = vessel->getLeftVec();
|
||||
initDirs[0] = vessel->getLeftVec();
|
||||
initDirs[1] = vessel->getUpVec();
|
||||
initDirs[2] = vessel->getDirVec();
|
||||
break;
|
||||
case unitData::BACKWARD:
|
||||
initDirs[0] = -vessel->getDirVec();
|
||||
initDirs[1] = -vessel->getLeftVec();
|
||||
initDirs[0] = -vessel->getLeftVec();
|
||||
initDirs[1] = vessel->getUpVec();
|
||||
initDirs[2] = -vessel->getDirVec();
|
||||
break;
|
||||
case unitData::LEFT:
|
||||
initDirs[0] = vessel->getLeftVec();
|
||||
initDirs[1] = -vessel->getDirVec();
|
||||
initDirs[0] = -vessel->getDirVec();
|
||||
initDirs[1] = vessel->getUpVec();
|
||||
initDirs[2] = vessel->getLeftVec();
|
||||
break;
|
||||
case unitData::RIGHT:
|
||||
initDirs[0] = -vessel->getLeftVec();
|
||||
initDirs[1] = vessel->getDirVec();
|
||||
initDirs[0] = vessel->getDirVec();
|
||||
initDirs[1] = vessel->getUpVec();
|
||||
initDirs[2] = -vessel->getLeftVec();
|
||||
break;
|
||||
}
|
||||
return initDirs;
|
||||
|
||||
return initDirs[dirType];
|
||||
}
|
||||
|
||||
void Vessel::Turret::fire() {
|
||||
/*
|
||||
fxNode->setVisible(true);
|
||||
quaternion rotQuat = rotQuat.fromAngleAxis(barrelAngle / 180 * PI, leftVec);
|
||||
int barId = 0;
|
||||
vector3df startPos = vessel->getPos() + vessel->getLeftVec() * turretNode->getPosition().X + vessel->getUpVec() * turretNode->getPosition().Y - vessel->getDirVec() * turretNode->getPosition().Z;
|
||||
@@ -142,16 +150,17 @@ namespace battleship{
|
||||
startPos += rotQuat * (leftVec * turretBarrelNodes[barId]->getPosition().X + upVec * turretBarrelNodes[barId]->getPosition().Y + dirVec * turretBarrelNodes[barId]->getPosition().Z);
|
||||
startPos += rotQuat * (leftVec * projectileData::pos[unitId][0][turretId].X + upVec * projectileData::pos[unitId][0][turretId].Y + dirVec * projectileData::pos[unitId][0][turretId].Z);
|
||||
vessel->addProjectile(new Shell(vessel, startPos, rotQuat*dirVec, rotQuat*leftVec, rotQuat*upVec, unitId, 0, turretId));
|
||||
fxNode->setVisible(true);
|
||||
if(sfx) sfx->play();
|
||||
lastShotTime = getTime();
|
||||
*/
|
||||
|
||||
if(sfx)
|
||||
sfx->play();
|
||||
|
||||
lastShotTime = getTime();
|
||||
}
|
||||
|
||||
Vessel::Vessel(Player *player, Vector3 pos, int id) : Unit(player, pos, id) {
|
||||
if (numberOfTurrets[id] > 0)
|
||||
for (int i = 0; i < numberOfTurrets[id]; i++)
|
||||
turrets.push_back(new Turret(this, id, i));
|
||||
for (int i = 0; i < numberOfTurrets[id]; i++)
|
||||
turrets.push_back(new Turret(this, id, i));
|
||||
}
|
||||
|
||||
void Vessel::update() {
|
||||
@@ -160,7 +169,7 @@ namespace battleship{
|
||||
for (Turret *t : turrets) {
|
||||
t->update();
|
||||
|
||||
if ((orders.size() > 0 && orders[0].type != Order::TYPE::ATTACK) || orders.size() == 0) {
|
||||
if ((!orders.empty() && orders[0].type != Order::TYPE::ATTACK) || orders.empty()) {
|
||||
float rotAngle = abs(t->getAngle()) < t->getRotationSpeed() ? abs(t->getAngle()) : t->getRotationSpeed();
|
||||
t->rotate(t->getAngle() > 0 ? -rotAngle : rotAngle);
|
||||
}
|
||||
@@ -169,25 +178,22 @@ namespace battleship{
|
||||
|
||||
void Vessel::attack(Order order) {
|
||||
Vector3 target = *order.targets[0].pos;
|
||||
Unit::attack(order);
|
||||
|
||||
for (Turret *t : turrets) {
|
||||
Vector3 *initDirs = t->getInitDirs();
|
||||
Node *rootNode = Root::getSingleton()->getRootNode();
|
||||
Vector3 turrPos = t->getNode()->localToGlobalPosition(Vector3::VEC_ZERO);
|
||||
Vector3 targDir = (target - turrPos);
|
||||
targDir.y = 0;
|
||||
targDir = targDir.norm();
|
||||
bool right = (t->getLeftVec().getAngleBetween(targDir) > PI / 2);
|
||||
float angle = t->getInitDir(0).getAngleBetween(targDir);
|
||||
float rotAngle = (t->getRotationSpeed() > angle ? angle : t->getRotationSpeed() * (right ? -1 : 1));
|
||||
|
||||
bool right = t->getLeftVec().getAngleBetween(target - turrPos) > PI / 2;
|
||||
float angle = initDirs[0].getAngleBetween(target - turrPos) / PI * 180;
|
||||
float rotAngle = t->getRotationSpeed() > angle ? angle : t->getRotationSpeed()*(right?1:-1);
|
||||
|
||||
if (-t->getMaxAngle() <= t->getAngle() + rotAngle
|
||||
&& t->getAngle() + rotAngle <= t->getMaxAngle()) {
|
||||
if (fabs(t->getAngle() + rotAngle) <= fabs(t->getMaxAngle())) {
|
||||
t->rotate(rotAngle);
|
||||
|
||||
if (t->canFire()) t->fire();
|
||||
if (t->canFire())
|
||||
t->fire();
|
||||
}
|
||||
|
||||
delete[] initDirs;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -34,25 +34,26 @@ namespace battleship {
|
||||
void fire();
|
||||
void rotate(double);
|
||||
void debug();
|
||||
vb01::Vector3* getInitDirs();
|
||||
vb01::Vector3 getInitDir(int);
|
||||
inline vb01::Vector3 getDirVec(){return dirVec;}
|
||||
inline vb01::Vector3 getLeftVec(){return leftVec;}
|
||||
inline vb01::Vector3 getUpVec(){return upVec;}
|
||||
inline vb01::Node* getNode(){return turret;}
|
||||
inline float getMaxAngle(){return maxAngle;}
|
||||
inline float getRotationSpeed(){return rotationSpeed;}
|
||||
inline float getAngle(){return angle;}
|
||||
inline bool canFire(){return vb01::getTime() - lastShotTime > rateOfFire;}
|
||||
inline vb01::Node* getNode(){return node;}
|
||||
private:
|
||||
inline std::string getExplosionSfxPath(){return configData::PATH + "Sounds/Explosions/explosion0" + std::to_string(rand() % 4) + ".ogg";}
|
||||
|
||||
vb01::Node *fxNode;
|
||||
vb01::ParticleEmitter *emitter;
|
||||
Unit *vessel;
|
||||
vb01::Node *turret = nullptr, *hull = nullptr;
|
||||
std::vector<Mantlet> mantlets;
|
||||
vb01::Node *node;
|
||||
vb01::Vector3 upVec = vb01::Vector3(0, 1, 0), dirVec = vb01::Vector3(0, 0, -1), initDir, leftVec = vb01::Vector3(1, 0, 0);
|
||||
float angle = 0., barrelAngle = 0., maxAngle, rotationSpeed,maxBarrelAngle;
|
||||
vb01::Quaternion initNodeRot;
|
||||
Unit *vessel;
|
||||
std::vector<Mantlet> mantlets;
|
||||
float angle = 0., barrelAngle = 0., maxAngle, rotationSpeed, maxBarrelAngle;
|
||||
int rateOfFire, damage, unitId, turretId;
|
||||
s64 lastShotTime;
|
||||
sf::SoundBuffer *sfxBuffer;
|
||||
|
||||
Reference in New Issue
Block a user