From aa657e34af14cc17e724780be408d1cd9751994c Mon Sep 17 00:00:00 2001 From: devZoGok Date: Wed, 29 May 2024 20:00:49 +0300 Subject: [PATCH] snapping extractor frames to resource deposits --- Assets/Scripts/GameObjects/Units/unitData.lua | 3 +- Assets/Scripts/Gui/engineerCommands.lua | 7 +++ activeGameState.cpp | 5 +- gameObjectFrameController.cpp | 55 +++++++++++++------ gameObjectFrameController.h | 1 + 5 files changed, 52 insertions(+), 19 deletions(-) diff --git a/Assets/Scripts/GameObjects/Units/unitData.lua b/Assets/Scripts/GameObjects/Units/unitData.lua index c413d57..1193310 100644 --- a/Assets/Scripts/GameObjects/Units/unitData.lua +++ b/Assets/Scripts/GameObjects/Units/unitData.lua @@ -131,7 +131,8 @@ units = { {id = UnitId.TRADE_CENTER, buildable = true}, {id = UnitId.LAB, buildable = true}, {id = UnitId.POINT_DEFENSE, buildable = true}, - {id = UnitId.FORT, buildable = false}, + {id = UnitId.FORT, buildable = true}, + {id = UnitId.EXTRACTOR, buildable = true}, }, unitClass = UnitClass.ENGINEER, unitType = UnitType.HOVER, diff --git a/Assets/Scripts/Gui/engineerCommands.lua b/Assets/Scripts/Gui/engineerCommands.lua index c8093f2..5771408 100644 --- a/Assets/Scripts/Gui/engineerCommands.lua +++ b/Assets/Scripts/Gui/engineerCommands.lua @@ -46,4 +46,11 @@ gui = { buttonType = ButtonType.BUILD, trigger = 70, }, + { + pos = {x = res.x - 3 * Size.x, y = res.y - 1 * Size.y, z = 0}, + size = sz, + guiType = GuiType.BUTTON, + buttonType = ButtonType.BUILD, + trigger = 76, + }, } diff --git a/activeGameState.cpp b/activeGameState.cpp index d386d50..58d515d 100755 --- a/activeGameState.cpp +++ b/activeGameState.cpp @@ -435,8 +435,11 @@ namespace battleship{ } 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; diff --git a/gameObjectFrameController.cpp b/gameObjectFrameController.cpp index ca48228..ae2d361 100644 --- a/gameObjectFrameController.cpp +++ b/gameObjectFrameController.cpp @@ -1,6 +1,9 @@ #include #include "gameObjectFrameController.h" +#include "resourceDeposit.h" +#include "player.h" +#include "game.h" #include "unit.h" #include "util.h" #include "map.h" @@ -49,13 +52,33 @@ namespace battleship{ } } + void GameObjectFrameController::snapToObj(GameObjectFrame &s, GameObject::Type type, int unitId, float maxDist){ + if(s.getType() == GameObject::Type::UNIT && s.getId() == unitId){ + s.status = GameObjectFrame::NOT_PLACEABLE; + vector players = Game::getSingleton()->getPlayers(); + vector deposits; + + for(Player *pl : players){ + vector deps = pl->getResourceDeposits(); + + for(ResourceDeposit *dep : deps) + deposits.push_back(dep); + } + + for(ResourceDeposit *dep : deposits){ + Vector3 depPos = dep->getPos(); + + if(s.getPos().getDistanceFrom(depPos) < maxDist){ + s.status = GameObjectFrame::PLACEABLE; + s.placeAt(depPos); + break; + } + } + } + } + //TODO implement terrain evenness check void GameObjectFrameController::placeGameObjectFrame(int id, Vector3 newPos, float width, float length){ - GameObjectFrame &s = gameObjectFrames[id]; - - if(!rotatingStructure) - s.placeAt(newPos); - Map *map = Map::getSingleton(); MeshData meshData = map->getNodeParent()->getChild(0)->getMesh(0)->getMeshBase(); MeshData::Vertex *verts = meshData.vertices; @@ -64,9 +87,9 @@ namespace battleship{ float maxUnevenness = .5, unevenness = 0; for(int i = 0; i < numVerts; i++){ - float diffX = fabs(s.getPos().x - verts[i].pos.x); - float diffY = fabs(s.getPos().y - verts[i].pos.y); - float diffZ = fabs(s.getPos().z - verts[i].pos.z); + float diffX = fabs(newPos.x - verts[i].pos.x); + float diffY = fabs(newPos.y - verts[i].pos.y); + float diffZ = fabs(newPos.z - verts[i].pos.z); if(diffX < 0.5 * width && diffZ < 0.5 * length && diffY > unevenness){ unevenness = diffY; @@ -76,18 +99,16 @@ namespace battleship{ } } - Vector4 color; + GameObjectFrame &s = gameObjectFrames[id]; - if(unevenness > maxUnevenness){ - color = Vector4(1, 0, 0, 1); - s.status = GameObjectFrame::NOT_PLACEABLE; - } - else{ - color = Vector4(0, 1, 0, 1); - s.status = GameObjectFrame::PLACEABLE; - } + if(!rotatingStructure) + s.placeAt(newPos); + + s.status = (unevenness > maxUnevenness ? GameObjectFrame::PLACEABLE : GameObjectFrame::NOT_PLACEABLE); + snapToObj(s, GameObject::Type::UNIT, 20, 3); Material *mat = s.getModel()->getMaterial(); + Vector4 color = (s.status == GameObjectFrame::NOT_PLACEABLE ? Vector4(1, 0, 0, 1) : Vector4(0, 1, 0, 1)); mat->setVec4Uniform("diffuseColor", color); } diff --git a/gameObjectFrameController.h b/gameObjectFrameController.h index 799d692..a431c68 100644 --- a/gameObjectFrameController.h +++ b/gameObjectFrameController.h @@ -35,6 +35,7 @@ namespace battleship{ GameObjectFrameController(){} void paintSelect(vb01::Vector3, float, float); void placeGameObjectFrame(int, vb01::Vector3, float, float); + void snapToObj(GameObjectFrame&, GameObject::Type, int, float); std::vector gameObjectFrames; vb01::Vector3 paintSelectRowStart, rowDir;