diff --git a/activeGameState.cpp b/activeGameState.cpp index 8a0e8c9..b025cb6 100755 --- a/activeGameState.cpp +++ b/activeGameState.cpp @@ -110,6 +110,19 @@ namespace battleship{ if (isSelectionBox) updateSelectionBox(); + vector selectedUnits = mainPlayer->getSelectedUnits(); + + if(!selectingDestOrient && leftMouseClicked && !selectedUnits.empty() && getTime() - lastLeftMouseClicked > 100){ + selectingDestOrient = true; + + GameObjectFrameController *fc = GameObjectFrameController::getSingleton(); + fc->setPlacingFrames(true); + fc->setRotatingFrames(true); + + for(Unit *unit : selectedUnits) + fc->addGameObjectFrame(GameObjectFrame(unit->getId(), GameObject::Type::UNIT)); + } + dragboxNode->setVisible(isSelectionBox); renderUnits(); @@ -259,14 +272,14 @@ namespace battleship{ targets.push_back(Order::Target()); LineRenderer *lineRenderer = LineRenderer::getSingleton(); - Order order; for (int i = 0; i < mainPlayer->getNumSelectedUnits(); ++i) { Unit *u = mainPlayer->getSelectedUnit(i); lineRenderer->addLine(u->getPos(), targets[i].pos, color); vector lines = lineRenderer->getLines(); LineRenderer::Line line = lines[lines.size() - 1]; - order = Order(type, line, targets); + Vector3 destDir = (selectingDestOrient ? GameObjectFrameController::getSingleton()->getGameObjectFrame(0).getDirVec() : Vector3::VEC_ZERO); + Order order(type, line, targets, destDir); if (type != Order::TYPE::LAUNCH) { if (addOrder) @@ -352,10 +365,12 @@ namespace battleship{ switch((Bind)bind){ case Bind::DRAG_BOX: isSelectionBox = isPressed; + leftMouseClicked = isPressed; + clickPoint = getCursorPos(); - if (isPressed) { - clickPoint = getCursorPos(); - + if(isPressed) + lastLeftMouseClicked = getTime(); + else{ if (mainPlayer->getNumSelectedUnits() > 0){ addTarget(); @@ -364,12 +379,8 @@ namespace battleship{ if(controlPressed || (targets[0].unit && targets[0].unit->getPlayer()->getSide() != mainPlayer->getSide())) type = Order::TYPE::ATTACK; - else if(ufCtr->isPlacingFrames()){ + else if(ufCtr->isPlacingFrames() && !selectingDestOrient) type = Order::TYPE::BUILD; - ufCtr->setPlacingFrames(false); - ufCtr->setRotatingFrames(false); - ufCtr->removeGameObjectFrames(); - } issueOrder(type, shiftPressed); } @@ -378,6 +389,11 @@ namespace battleship{ selectingPatrolPoints = false; } } + + selectingDestOrient = false; + ufCtr->setPlacingFrames(false); + ufCtr->setRotatingFrames(false); + ufCtr->removeGameObjectFrames(); } break; @@ -442,15 +458,6 @@ namespace battleship{ } break; - case Bind::LAUNCH:{ - if(isPressed){ - Node *node = Map::getSingleton()->getNodeParent()->getChild(1); - node->setVisible(!node->isVisible()); - } - - selectingGuidedMissileTarget = isPressed; - break; - } case Bind::GROUP_0: case Bind::GROUP_1: case Bind::GROUP_2: @@ -501,7 +508,7 @@ namespace battleship{ case Bind::LOOK_RIGHT: if(camCtr->isLookingAround()) CameraController::getSingleton()->orientCamera(Vector3(0, 1, 0), strength); - else if(ufCtr->isPlacingFrames() && ufCtr->isRotatingFrames()) + else if(ufCtr->isRotatingFrames()) ufCtr->rotateGameObjectFrames(100 * strength); break; diff --git a/activeGameState.h b/activeGameState.h index 447dc69..c0f1c36 100755 --- a/activeGameState.h +++ b/activeGameState.h @@ -1,4 +1,3 @@ -#pragma once #ifndef ACTIVE_GAME_STATE_H #define ACTIVE_GAME_STATE_H @@ -50,10 +49,11 @@ namespace battleship{ std::vector unitGroups[9]; std::vector targets; std::vector buttons; - bool isSelectionBox = false, shiftPressed = false, controlPressed = false, selectingPatrolPoints = false, selectingGuidedMissileTarget = false; + bool isSelectionBox = false, shiftPressed = false, controlPressed = false, leftMouseClicked = false, selectingPatrolPoints = false, selectingDestOrient = false; int playerId, zooms = 0; const int NUM_MAX_ZOOMS = 10; float depth = 1; + vb01::s64 lastLeftMouseClicked = 0; }; } diff --git a/gameObject.cpp b/gameObject.cpp index f93a555..c879d62 100644 --- a/gameObject.cpp +++ b/gameObject.cpp @@ -17,6 +17,9 @@ namespace battleship{ using namespace configData; void GameObject::update(){ + leftVec = model->getGlobalAxis(0); + upVec = model->getGlobalAxis(1); + dirVec = model->getGlobalAxis(2); } void GameObject::placeAt(Vector3 p) { diff --git a/gameObjectFrame.h b/gameObjectFrame.h index 5140920..8c17d03 100644 --- a/gameObjectFrame.h +++ b/gameObjectFrame.h @@ -14,6 +14,7 @@ namespace battleship{ initModel(false); } ~GameObjectFrame(){} + void update(){GameObject::update();} Status status; }; diff --git a/gameObjectFrameController.cpp b/gameObjectFrameController.cpp index 90de7f0..f86f2e9 100644 --- a/gameObjectFrameController.cpp +++ b/gameObjectFrameController.cpp @@ -93,6 +93,9 @@ namespace battleship{ } void GameObjectFrameController::update(){ + for(GameObjectFrame &frame : gameObjectFrames) + frame.update(); + Vector3 startPos = Root::getSingleton()->getCamera()->getPosition(); vector results; Ray::retrieveCollisions(startPos, (screenToSpace(getCursorPos()) - startPos).norm(), Map::getSingleton()->getNodeParent()->getChild(0), results); diff --git a/unit.cpp b/unit.cpp index d79f38c..dc69a12 100755 --- a/unit.cpp +++ b/unit.cpp @@ -142,9 +142,7 @@ namespace battleship{ } void Unit::update() { - leftVec = model->getGlobalAxis(0); - upVec = model->getGlobalAxis(1); - dirVec = model->getGlobalAxis(2); + GameObject::update(); if (!orders.empty()){ LineRenderer *lineRenderer = LineRenderer::getSingleton(); diff --git a/unit.h b/unit.h index ba89a46..c6a58ce 100755 --- a/unit.h +++ b/unit.h @@ -39,10 +39,11 @@ namespace battleship{ TYPE type; vb01::LineRenderer::Line line; + vb01::Vector3 direction; std::vector targets; Order(){} - Order(TYPE t, vb01::LineRenderer::Line l, std::vector targ) : type(t), line(l), targets(targ){} + Order(TYPE t, vb01::LineRenderer::Line l, std::vector targ, vb01::Vector3 dir) : type(t), line(l), targets(targ), direction(dir){} }; enum class MoveDir {LEFT, UP, FORW}; diff --git a/vehicle.cpp b/vehicle.cpp index 4420b2e..22d7b47 100644 --- a/vehicle.cpp +++ b/vehicle.cpp @@ -89,23 +89,27 @@ namespace battleship{ anglePrecision = SOL_LUA_STATE["anglePrecision"][id + 1]; } + float Vehicle::calculateRotation(Vector3 dir, float angle){ + float rotSpeed = (maxTurnAngle > angle ? angle : maxTurnAngle); + + if(leftVec.getAngleBetween(dir) > PI / 2) + rotSpeed *= -1; + + return rotSpeed; + } + void Vehicle::navigate(float destOffset){ Vector3 hypVec = (pathPoints[0] - pos); float hypAngle = hypVec.norm().getAngleBetween(upVec) - PI / 2; float offset = hypVec.getLength() * sin(hypAngle); Vector3 linDest = pathPoints[0] + upVec * offset; + float vertDist = fabs(pos.y - pathPoints[0].y); Vector3 destDir = (linDest - pos).norm(); float angle = (destDir != Vector3::VEC_ZERO ? dirVec.getAngleBetween(destDir) : -1); - if(angle > anglePrecision){ - float rotSpeed = (maxTurnAngle > angle ? angle : maxTurnAngle); - - if(leftVec.getAngleBetween(destDir) > PI / 2) - rotSpeed *= -1; - - turn(rotSpeed); - } + if(angle > anglePrecision && pos.getDistanceFrom(linDest) > destOffset) + turn(calculateRotation(destDir, angle)); else{ if(pos.getDistanceFrom(linDest) > destOffset){ float dist = pos.getDistanceFrom(linDest); @@ -113,7 +117,7 @@ namespace battleship{ advance(movementAmmount); } - if(fabs(pos.y - pathPoints[0].y) > 0.5 * height){ + if(vertDist > 0.5 * height){ float dist = pos.y - pathPoints[0].y; float movementAmmount = (speed > fabs(dist) ? dist : speed); @@ -123,10 +127,21 @@ namespace battleship{ advance(movementAmmount, MoveDir::UP); } - if(type != UnitType::UNDERWATER && pos.getDistanceFrom(linDest) <= destOffset) - removePathpoint(); - else if(type == UnitType::UNDERWATER && fabs(pos.y - pathPoints[0].y) < 0.5 * height && pos.getDistanceFrom(linDest) <= destOffset) - removePathpoint(); + if(pos.getDistanceFrom(linDest) <= destOffset){ + bool orderHasDir = (orders[0].direction != Vector3::VEC_ZERO); + float angleToOrderDir = dirVec.getAngleBetween(orders[0].direction); + bool destDirWithin = (!orderHasDir || (orderHasDir && angleToOrderDir <= anglePrecision)); + + if(pathPoints.size() == 1 && !destDirWithin) + turn(calculateRotation(orders[0].direction, angleToOrderDir)); + + if(pathPoints.size() > 1 || (pathPoints.size() == 1 && destDirWithin)){ + if(type == UnitType::UNDERWATER && vertDist < 0.5 * height) + removePathpoint(); + else if(type != UnitType::UNDERWATER) + removePathpoint(); + } + } } } diff --git a/vehicle.h b/vehicle.h index 0651f5b..ac217f4 100644 --- a/vehicle.h +++ b/vehicle.h @@ -28,6 +28,7 @@ namespace battleship{ inline int getNextPatrolPointId(int numPoints) {return patrolPointId == numPoints - 1 ? 0 : patrolPointId + 1;} void enterGarrisonable(); + float calculateRotation(vb01::Vector3, float); void navigateToMovingTarget(float); void halt(); void turn(float);