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/external/vb01 b/external/vb01 index 0460303..bd54163 160000 --- a/external/vb01 +++ b/external/vb01 @@ -1 +1 @@ -Subproject commit 04603036101feeaf5a73e37b40ea462aafc0d859 +Subproject commit bd5416328ab10f3cd17b9f0d2def6ae3b7ae8b3e diff --git a/extractor.cpp b/extractor.cpp index 23fcb6a..412d4f8 100644 --- a/extractor.cpp +++ b/extractor.cpp @@ -23,6 +23,7 @@ namespace battleship{ for(ResourceDeposit *dep : deposits) if(dep->getPos().getDistanceFrom(pos) < .001){ deposit = dep; + deposit->setExtractor(this); break; } } @@ -33,6 +34,9 @@ namespace battleship{ } Extractor::~Extractor(){ + if(deposit) + deposit->setExtractor(nullptr); + removeBar(ammountForeground); removeBar(ammountBackground); } diff --git a/gameObjectFrameController.cpp b/gameObjectFrameController.cpp index ca48228..04c593e 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,34 @@ 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(!dep->getExtractor() && s.getPos().getDistanceFrom(depPos) < maxDist){ + s.status = GameObjectFrame::PLACEABLE; + s.placeAt(depPos); + break; + } + } + } + } + //TODO implement terrain evenness check + //TODO factor out literal values 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 +88,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 +100,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; diff --git a/resourceDeposit.h b/resourceDeposit.h index ff6e425..2d8527e 100644 --- a/resourceDeposit.h +++ b/resourceDeposit.h @@ -4,6 +4,8 @@ #include "gameObject.h" namespace battleship{ + class Extractor; + class ResourceDeposit : public GameObject{ public: ResourceDeposit(Player*, int, vb01::Vector3, vb01::Quaternion, int); @@ -11,8 +13,11 @@ namespace battleship{ inline int getAmmount(){return ammount;} inline int getInitAmmount(){return initAmmount;} inline void decreaseAmmount(int amnt){ammount -= amnt;} + inline Extractor* getExtractor(){return extractor;} + inline void setExtractor(Extractor *e){this->extractor = e;} private: int ammount, initAmmount; + Extractor *extractor = nullptr; void reinit(); };