diff --git a/Assets/Scripts/Core/options.lua b/Assets/Scripts/Core/options.lua index 1a072b1..ac32739 100644 --- a/Assets/Scripts/Core/options.lua +++ b/Assets/Scripts/Core/options.lua @@ -12,7 +12,7 @@ mappings = { {bind = 8, trigger = 313, action = false, bindType = 2, inOptions = false}, {bind = 9, trigger = 310, action = false, bindType = 2, inOptions = false}, {bind = 10, trigger = 311, action = false, bindType = 2, inOptions = false}, - {bind = 11, trigger = 1, action = true, bindType = 1, inOptions = false}, + {bind = 11, trigger = 2, action = true, bindType = 1, inOptions = false}, {bind = 12, trigger = 0, action = true, bindType = 1, inOptions = true}, {bind = 13, trigger = 1, action = true, bindType = 1, inOptions = true}, {bind = 14, trigger = 72, action = true, bindType = 0, inOptions = true}, diff --git a/activeGameState.cpp b/activeGameState.cpp index ec4c5f5..51cbfa5 100755 --- a/activeGameState.cpp +++ b/activeGameState.cpp @@ -149,7 +149,7 @@ namespace battleship{ float eps = .01; - if(!isSelectionBox && leftMouseClicked && (fabs(clickPoint.x - cursorPos.x) > eps || fabs(clickPoint.y - cursorPos.y) > eps) && getTime() - lastLeftMouseClicked > 10) + if(!isSelectionBox && selectMouseClicked && (fabs(clickPoint.x - cursorPos.x) > eps || fabs(clickPoint.y - cursorPos.y) > eps) && getTime() - lastSelectMouseClicked > 10) isSelectionBox = true; else if (isSelectionBox) updateDragBox(); @@ -161,7 +161,7 @@ namespace battleship{ vector selectedUnits = mainPlayer->getSelectedUnits(); GameObjectFrameController *fc = GameObjectFrameController::getSingleton(); - if(!selectingDestOrient && leftMouseClicked && !selectedUnits.empty() && getTime() - lastLeftMouseClicked > 100){ + if(!selectingDestOrient && orderMouseClicked && !selectedUnits.empty() && getTime() - lastOrderMouseClicked > 100){ selectingDestOrient = true; fc->setPlacingFrames(true); @@ -170,6 +170,13 @@ namespace battleship{ for(Unit *unit : selectedUnits) fc->addGameObjectFrame(GameObjectFrame(unit->getId(), GameObject::Type::UNIT)); } + else if(selectingDestOrient && !orderMouseClicked){ + selectingDestOrient = false; + + fc->setPlacingFrames(false); + fc->setRotatingFrames(false); + fc->removeGameObjectFrames(); + } renderUnits(); @@ -211,6 +218,7 @@ namespace battleship{ GameObjectFrameController *ufCtr = GameObjectFrameController::getSingleton(); ufCtr->removeGameObjectFrames(); ufCtr->setPlacingFrames(false); + ufCtr->setRotatingFrames(false); unitGuiScreen = ""; ConcreteGuiManager::getSingleton()->readLuaScreenScript("activeGameState.lua"); @@ -486,94 +494,27 @@ namespace battleship{ unit->setState(state); } - //TODO only allow appropriate orders for units void ActiveGameState::onAction(int bind, bool isPressed) { GameObjectFrameController *ufCtr = GameObjectFrameController::getSingleton(); if(!ConcreteGuiManager::getSingleton()->findClickedButtons().empty()) return; + vector selectedUnits = mainPlayer->getSelectedUnits(); + switch((Bind)bind){ case Bind::DRAG_BOX: - leftMouseClicked = isPressed; + selectMouseClicked = isPressed; if(isPressed){ clickPoint = getCursorPos(); - lastLeftMouseClicked = getTime(); + lastSelectMouseClicked = getTime(); } else{ - int numSelectedUnits = mainPlayer->getNumSelectedUnits(); - - if(numSelectedUnits > 0){ - if(selectingPatrolPoints){ - castRayToTerrain(); - - if(!(targets.empty() || selectingPatrolPoints)){ - Order::TYPE type = Order::TYPE::MOVE; - - if(controlPressed || (targets[0].unit && targets[0].unit->getPlayer()->getTeam() != mainPlayer->getTeam())) - type = Order::TYPE::ATTACK; - else if(ufCtr->isPlacingFrames() && !selectingDestOrient) - type = Order::TYPE::BUILD; - - issueOrder(type, targets, shiftPressed); - } - } - else if(!(selectingDestOrient || isSelectionBox)){ - bool canSelect = canSelectHoveredOnGameObj(); - bool ownGameObj = (gameObjHoveredOn && gameObjHoveredOn->getPlayer()->getTeam() == mainPlayer->getTeam()); - - if(gameObjHoveredOn && gameObjHoveredOn->getType() == GameObject::Type::UNIT && ownGameObj && ((Unit*)gameObjHoveredOn)->getNumGarrisonSlots() > 0){ - bool canGarrison = true; - - for(int i = 0; i < mainPlayer->getNumSelectedUnits(); i++) - if(!((Unit*)gameObjHoveredOn)->canGarrison((Vehicle*)mainPlayer->getSelectedUnit(i))){ - canGarrison = false; - break; - } - - if(canGarrison) - issueOrder(Order::TYPE::GARRISON, vector{Order::Target((Unit*)gameObjHoveredOn, gameObjHoveredOn->getPos())}, shiftPressed); - } - else if(gameObjHoveredOn && ownGameObj && ((Unit*)gameObjHoveredOn)->getUnitClass() == UnitClass::EXTRACTOR && !controlPressed){ - issueOrder(Order::TYPE::SUPPLY, vector{Order::Target((Unit*)gameObjHoveredOn)}, shiftPressed); - } - else if(gameObjHoveredOn && (controlPressed || (!ownGameObj && gameObjHoveredOn->getType() == GameObject::Type::UNIT))) - issueOrder(Order::TYPE::ATTACK, vector{Order::Target((Unit*)gameObjHoveredOn, gameObjHoveredOn->getPos())}, shiftPressed); - else if(controlPressed && !gameObjHoveredOn){ - castRayToTerrain(); - issueOrder(Order::TYPE::ATTACK, targets, shiftPressed); - } - else if(ufCtr->isPlacingFrames() && !selectingDestOrient){ - castRayToTerrain(); - GameObjectFrame gmObjFr = ufCtr->getGameObjectFrame(0); - - if(gmObjFr.status == GameObjectFrame::NOT_PLACEABLE) - return; - - Unit *buildStruct = GameObjectFactory::createUnit(mainPlayer, gmObjFr.getId(), gmObjFr.getPos(), gmObjFr.getRot()); - mainPlayer->addUnit(buildStruct); - targets[0].unit = buildStruct; - - issueOrder(Order::TYPE::BUILD, targets, shiftPressed); - } - else if(canSelect){ - if(!shiftPressed) - deselectUnits(); - - mainPlayer->selectUnit((Unit*)gameObjHoveredOn); - } - else if(!canSelect){ - castRayToTerrain(); - issueOrder(Order::TYPE::MOVE, targets, shiftPressed); - } - } - } - else if(numSelectedUnits == 0 && canSelectHoveredOnGameObj()){ - if(!shiftPressed) deselectUnits(); + if(!shiftPressed) deselectUnits(); + if(canSelectHoveredOnGameObj()) mainPlayer->selectUnit((Unit*)gameObjHoveredOn); - } selectingDestOrient = false; @@ -598,6 +539,74 @@ namespace battleship{ } break; + case Bind::ROTATE_OBJ_FRAME: + orderMouseClicked = isPressed; + + if(isPressed) + lastOrderMouseClicked = getTime(); + else if(!(isPressed || selectedUnits.empty())){ + if(selectingPatrolPoints){ + castRayToTerrain(); + + if(!(targets.empty() || selectingPatrolPoints)){ + Order::TYPE type = Order::TYPE::MOVE; + + if(controlPressed || (targets[0].unit && targets[0].unit->getPlayer()->getTeam() != mainPlayer->getTeam())) + type = Order::TYPE::ATTACK; + else if(ufCtr->isPlacingFrames() && !selectingDestOrient) + type = Order::TYPE::BUILD; + + issueOrder(type, targets, shiftPressed); + } + } + else if(!isSelectionBox){ + bool canSelect = canSelectHoveredOnGameObj(); + bool ownGameObj = (gameObjHoveredOn && gameObjHoveredOn->getPlayer()->getTeam() == mainPlayer->getTeam()); + + if(gameObjHoveredOn && gameObjHoveredOn->getType() == GameObject::Type::UNIT && ownGameObj && ((Unit*)gameObjHoveredOn)->getNumGarrisonSlots() > 0){ + bool canGarrison = true; + + for(int i = 0; i < mainPlayer->getNumSelectedUnits(); i++) + if(!((Unit*)gameObjHoveredOn)->canGarrison((Vehicle*)mainPlayer->getSelectedUnit(i))){ + canGarrison = false; + break; + } + + if(canGarrison) + issueOrder(Order::TYPE::GARRISON, vector{Order::Target((Unit*)gameObjHoveredOn, gameObjHoveredOn->getPos())}, shiftPressed); + } + else if(gameObjHoveredOn && ownGameObj && ((Unit*)gameObjHoveredOn)->getUnitClass() == UnitClass::EXTRACTOR && !controlPressed){ + issueOrder(Order::TYPE::SUPPLY, vector{Order::Target((Unit*)gameObjHoveredOn)}, shiftPressed); + } + else if(gameObjHoveredOn && (controlPressed || (!ownGameObj && gameObjHoveredOn->getType() == GameObject::Type::UNIT))) + issueOrder(Order::TYPE::ATTACK, vector{Order::Target((Unit*)gameObjHoveredOn, gameObjHoveredOn->getPos())}, shiftPressed); + else if(controlPressed && !gameObjHoveredOn){ + castRayToTerrain(); + issueOrder(Order::TYPE::ATTACK, targets, shiftPressed); + } + else if(selectedUnits[0]->getUnitClass() == UnitClass::ENGINEER && ufCtr->isPlacingFrames()){ + castRayToTerrain(); + GameObjectFrame gmObjFr = ufCtr->getGameObjectFrame(0); + + if(gmObjFr.status == GameObjectFrame::NOT_PLACEABLE) return; + + Unit *buildStruct = GameObjectFactory::createUnit(mainPlayer, gmObjFr.getId(), gmObjFr.getPos(), gmObjFr.getRot()); + mainPlayer->addUnit(buildStruct); + targets[0].unit = buildStruct; + + issueOrder(Order::TYPE::BUILD, targets, shiftPressed); + } + else if(!canSelect){ + castRayToTerrain(); + issueOrder(Order::TYPE::MOVE, targets, shiftPressed); + } + } + + } + + break; + case Bind::MOVE_CAMERA: + break; case Bind::ENABLE_CHASE_STATE: if(isPressed) enableUnitState(Unit::State::CHASE); break; @@ -607,10 +616,6 @@ namespace battleship{ case Bind::ENABLE_HOLD_FIRE_STATE: if(isPressed) enableUnitState(Unit::State::HOLD_FIRE); break; - case Bind::DESELECT: - if(ufCtr->isPlacingFrames()) ufCtr->setRotatingFrames(isPressed); - if (!isPressed) deselectUnits(); - break; case Bind::EJECT_GARRISON: if(isPressed) issueOrder(Order::TYPE::EJECT, vector{}, shiftPressed); break; @@ -640,7 +645,7 @@ namespace battleship{ case Bind::ZOOM_OUT: if (zooms < NUM_MAX_ZOOMS) { Camera *cam = Root::getSingleton()->getCamera(); - cam->setPosition(cam->getPosition() - (cam->getDirection().norm().norm() * .5f)); + cam->setPosition(cam->getPosition() - (cam->getDirection().norm() * .5f)); zooms++; } break; diff --git a/activeGameState.h b/activeGameState.h index b6dd726..dc55bbe 100755 --- a/activeGameState.h +++ b/activeGameState.h @@ -34,6 +34,8 @@ namespace battleship{ inline std::vector getButtons(){return buttons;} inline Player* getPlayer(){return mainPlayer;} inline std::vector& getUnitGroup(int i){return unitGroups[i];} + inline void setBuildableStructSelected(bool bss){this->buildableStructSelected = bss;} + inline bool isBuildableStructSelected(){return buildableStructSelected;} private: enum CursorState{ NORMAL, @@ -69,11 +71,18 @@ namespace battleship{ std::vector unitGroups[9]; std::vector targets; std::vector buttons; - bool isSelectionBox = false, shiftPressed = false, controlPressed = false, leftMouseClicked = false, selectingPatrolPoints = false, selectingDestOrient = false; + bool isSelectionBox = false; + bool shiftPressed = false; + bool controlPressed = false; + bool selectMouseClicked = false; + bool orderMouseClicked = false; + bool buildableStructSelected = false; + bool selectingPatrolPoints = false; + bool selectingDestOrient = false; int playerId, zooms = 0; const int NUM_MAX_ZOOMS = 10; float depth = 1; - vb01::s64 lastLeftMouseClicked = 0; + vb01::s64 lastSelectMouseClicked = 0, lastOrderMouseClicked = 0; vb01::Node *cursorNode = nullptr; vb01::Texture *pointerTex = nullptr, *attackTex = nullptr, *garrisonTex = nullptr; }; diff --git a/binds.h b/binds.h index 6e8f14b..a0d1205 100644 --- a/binds.h +++ b/binds.h @@ -16,7 +16,7 @@ namespace battleship{ LOOK_RIGHT, LOOK_AROUND, DRAG_BOX, - DESELECT, + ROTATE_OBJ_FRAME, HALT, ZOOM_IN, ZOOM_OUT, @@ -54,7 +54,8 @@ namespace battleship{ ENABLE_CHASE_STATE, ENABLE_STAND_GROUND_STATE, ENABLE_HOLD_FIRE_STATE, - HACK + HACK, + MOVE_CAMERA }; } diff --git a/defConfigs.h b/defConfigs.h index 2889214..ba81256 100755 --- a/defConfigs.h +++ b/defConfigs.h @@ -88,7 +88,8 @@ namespace battleship{ }, { Bind::DRAG_BOX, - Bind::DESELECT, + Bind::MOVE_CAMERA, + Bind::ROTATE_OBJ_FRAME, Bind::HALT, Bind::ZOOM_IN, Bind::ZOOM_OUT, diff --git a/mapEditorAppState.cpp b/mapEditorAppState.cpp index 15e9ce9..c31bab8 100644 --- a/mapEditorAppState.cpp +++ b/mapEditorAppState.cpp @@ -676,7 +676,7 @@ namespace battleship{ CameraController::getSingleton()->setLookingAround(isPressed); break; - case Bind::DESELECT_STRUCTURE: + case Bind::ROTATE_OBJ_FRAME: ufCtr->removeGameObjectFrames(); ufCtr->setPlacingFrames(false); break;