From 580659aad580d973ce57c285e20d2430778dca0f Mon Sep 17 00:00:00 2001 From: devZoGok Date: Mon, 16 Feb 2026 16:38:04 +0200 Subject: [PATCH] refactored visible game object detection checking whether the game object frame is on the right type of a cell --- activeGameState.cpp | 72 +++++------------------------------ activeGameState.h | 1 - gameObjectFrameController.cpp | 21 +++++++++- player.cpp | 33 ++++++++++++++++ player.h | 2 + 5 files changed, 63 insertions(+), 66 deletions(-) diff --git a/activeGameState.cpp b/activeGameState.cpp index 21b569e..d58c76d 100755 --- a/activeGameState.cpp +++ b/activeGameState.cpp @@ -476,73 +476,19 @@ namespace battleship{ return (numAboveEdges > 0 && numBelowEdges > 0); } - //TODO fix fog of war for hostile units void ActiveGameState::renderUnits() { - ConcreteGuiManager *guiManager = ConcreteGuiManager::getSingleton(); - vector listboxes{}; - vector checkboxes{}; - vector sliders{}; - vector textboxes{}; - vector guiRects = guiManager->getGuiRectangles(); - vector texts{ - guiManager->getText("depth"), - guiManager->getText("refineds"), - guiManager->getText("wealth"), - guiManager->getText("research") - }; + vector friendlyUnits = mainPlayer->getFriendlyUnits(); - vector units; + for (Player *p : Game::getSingleton()->getPlayers(true)){ + vector units = p->getUnits(); - for (Player *p : Game::getSingleton()->getPlayers(true)) - for (Unit *u : p->getUnits()) - units.push_back(u); - - vector selUnits = mainPlayer->getSelectedUnits(); - - for (Unit *u : units) { - if(u->isVehicle() && ((Vehicle*)u)->getGarrisonable()) continue; - - Node *model = u->getModel(); - - if (u->getPlayer()->getTeam() == mainPlayer->getTeam()){ - if(!u->getLosLightNode()) u->initLosLight(); - - model->setVisible(true); - } - else{ - if(u->getLosLightNode()) u->destroyLosLight(); - - model->setVisible(false); - - for (int i = 0; i < units.size(); i++) - if(units[i]->getPlayer() == mainPlayer){ - Vector3 obsUnitPos = units[i]->getPos(); - obsUnitPos.y = 0; - - Vector3 compUnitPos = u->getPos(); - compUnitPos.y = 0; - float dist = compUnitPos.getDistanceFrom(obsUnitPos); - - if(dist <= units[i]->getLineOfSight()){ - model->setVisible(true); - break; - } - } + for (Unit *u : units) { + if(u->isVehicle() && ((Vehicle*)u)->getGarrisonable()) continue; + + bool unitVisible = mainPlayer->isObjectVisible((GameObject*)u, friendlyUnits); + u->getModel()->setVisible(unitVisible); } - } - } - - //TODO improve this for greater accuracy - bool ActiveGameState::isInLineOfSight(Vector3 center, float radius, Unit *u) { - bool inside = false; - - for (int i = 0; i < 4 && !inside; i++) - if (center.getDistanceFrom(u->getCorner(i)) <= radius){ - inside = true; - break; - } - - return inside; + } } void ActiveGameState::updateDragBox() { diff --git a/activeGameState.h b/activeGameState.h index 0778be1..fef0dcb 100755 --- a/activeGameState.h +++ b/activeGameState.h @@ -73,7 +73,6 @@ namespace battleship{ void updateStructureFrames(); void castRayToTerrain(); void issueOrder(Order::TYPE, std::vector, bool); - bool isInLineOfSight(vb01::Vector3, float, Unit*); void enableUnitState(Unit::State); void addUnitGui(); inline bool canSelectHoveredOnGameObj(){return gameObjHoveredOn && gameObjHoveredOn->isSelectable() && gameObjHoveredOn->getPlayer() == mainPlayer;} diff --git a/gameObjectFrameController.cpp b/gameObjectFrameController.cpp index 5fa6490..3bc5060 100644 --- a/gameObjectFrameController.cpp +++ b/gameObjectFrameController.cpp @@ -73,18 +73,35 @@ namespace battleship{ } } - //TODO fix which unit frames light green or red + //TODO include checking if frame is outside of line of sight void GameObjectFrameController::checkPlacement(GameObjectFrame &s){ s.status = GameObjectFrame::PLACEABLE; Map *map = Map::getSingleton(); Vector3 mapSize = map->getMapSize(); + Vector3 cellSize = map->getCellSize(); int dirMult[][2]{{1, 1}, {1, -1}, {-1, 1}, {-1, -1}}; + vector &cells = map->getCells(); + + sol::table tbl = generateView()["units"][s.getId() + 1]; + UnitType ut = (UnitType)tbl["unitType"]; + + //vector friendlyUnits = s.getPlayer()->getFriendlyUnits(); for(int i = 0; i < 4; i++){ Vector3 cornerPos = (s.getPos() + s.getDirVec() * .5 * dirMult[i][0] * s.getLength() + s.getLeftVec() * .5 * dirMult[i][1] * s.getWidth()); - if(!(fabs(cornerPos.x) <= .5 * mapSize.x && fabs(cornerPos.z) <=.5 * mapSize.z)){ + if(!(fabs(cornerPos.x) <= .5 * mapSize.x && fabs(cornerPos.z) <= .5 * mapSize.z)){ + s.status = GameObjectFrame::NOT_PLACEABLE; + return; + } + + Map::Cell cell = cells[map->getCellId(cornerPos, false)]; + bool landUnitOnWater = (ut == UnitType::LAND && cell.type == Map::Cell::Type::WATER); + bool waterUnitOnLand = ((ut == UnitType::SEA_LEVEL || ut == UnitType::UNDERWATER) && cell.type == Map::Cell::Type::LAND); + bool withinCell = (fabs(cell.pos.x - cornerPos.x) < .5 * cellSize.x && fabs(cell.pos.z - cornerPos.z) < .5 * cellSize.z); + + if((landUnitOnWater || waterUnitOnLand) && withinCell){ s.status = GameObjectFrame::NOT_PLACEABLE; return; } diff --git a/player.cpp b/player.cpp index 466de8c..b705407 100755 --- a/player.cpp +++ b/player.cpp @@ -286,4 +286,37 @@ namespace battleship{ } } } + + vector Player::getFriendlyUnits(bool includeOwn){ + vector friendlyUnits; + + for (Player *pl : Game::getSingleton()->getPlayers(true)) + for (Unit *u : pl->getUnits()) + if((includeOwn && pl == this) || pl->getTeam() == getTeam()) + friendlyUnits.push_back(u); + + return friendlyUnits; + } + + //TODO improve this for greater accuracy + bool Player::isObjectVisible(GameObject *object, std::vector friendlyUnits) { + Player *objPlayer = object->getPlayer(); + + for(Unit *friendlyUnit : friendlyUnits){ + if(objPlayer == this || objPlayer->getTeam() == getTeam()) + return true; + + Vector3 obsUnitPos = object->getPos(); + obsUnitPos.y = 0; + + Vector3 compUnitPos = friendlyUnit->getPos(); + compUnitPos.y = 0; + float dist = compUnitPos.getDistanceFrom(obsUnitPos); + + if(dist <= friendlyUnit->getLineOfSight()) + return true; + } + + return false; + } } diff --git a/player.h b/player.h index d2f68b8..1ccce17 100755 --- a/player.h +++ b/player.h @@ -39,6 +39,8 @@ namespace battleship{ void deselectUnit(Unit*); std::vector getDestructables(); void updateGameStats(Unit*); + std::vector getFriendlyUnits(bool = true); + bool isObjectVisible(GameObject*, std::vector); inline int getResource(ResourceType rt){return resources[(int)rt];} inline void updateResource(ResourceType rt, int amount, bool add){resources[(int)rt] = (add ? resources[(int)rt] + amount : amount);} inline Trader* getTrader(){return trader;}