snapping extractor frames to resource deposits

This commit is contained in:
devZoGok
2024-05-29 20:00:49 +03:00
parent 1a5fbccc5b
commit aa657e34af
5 changed files with 52 additions and 19 deletions
@@ -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,
+7
View File
@@ -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,
},
}
+4 -1
View File
@@ -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;
+38 -17
View File
@@ -1,6 +1,9 @@
#include <solUtil.h>
#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<Player*> players = Game::getSingleton()->getPlayers();
vector<ResourceDeposit*> deposits;
for(Player *pl : players){
vector<ResourceDeposit*> 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);
}
+1
View File
@@ -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<GameObjectFrame> gameObjectFrames;
vb01::Vector3 paintSelectRowStart, rowDir;