diff --git a/activeGameState.cpp b/activeGameState.cpp index 2c2d400..1214e6c 100755 --- a/activeGameState.cpp +++ b/activeGameState.cpp @@ -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(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(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; diff --git a/binds.h b/binds.h index 023e989..233b6a5 100644 --- a/binds.h +++ b/binds.h @@ -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, diff --git a/defConfigs.h b/defConfigs.h index b83b872..06d17bb 100755 --- a/defConfigs.h +++ b/defConfigs.h @@ -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} }; } } diff --git a/guiAppState.cpp b/guiAppState.cpp index 9adf274..4be3632 100755 --- a/guiAppState.cpp +++ b/guiAppState.cpp @@ -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); diff --git a/options.cfg b/options.cfg index f28dd18..21a44b1 100644 --- a/options.cfg +++ b/options.cfg @@ -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 diff --git a/unit.cpp b/unit.cpp index dcbd06b..deb3b2c 100755 --- a/unit.cpp +++ b/unit.cpp @@ -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() { diff --git a/vessel.cpp b/vessel.cpp index c486dbe..9db558d 100755 --- a/vessel.cpp +++ b/vessel.cpp @@ -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; } } diff --git a/vessel.h b/vessel.h index 547ccfd..215c62f 100755 --- a/vessel.h +++ b/vessel.h @@ -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 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 mantlets; + float angle = 0., barrelAngle = 0., maxAngle, rotationSpeed, maxBarrelAngle; int rateOfFire, damage, unitId, turretId; s64 lastShotTime; sf::SoundBuffer *sfxBuffer;