CPU AI orients fort towards the closest spawnpoint

This commit is contained in:
devZoGok
2025-03-08 12:14:31 +02:00
parent 31aa7c44a6
commit 2e9873cb30
4 changed files with 54 additions and 17 deletions
+28 -10
View File
@@ -1,9 +1,9 @@
Player.numStartEngis = 3
Player.dirToCenter = nil
Player.numDefWarMechs = 5
Player.baseDir = nil
Player.numDefWarMechs = 1
Player.numTaskForceWarMechs = 5
Player.numTaskForceTanks = 5
Player.numTaskForceArtillery = 5
Player.numTaskForceTanks = 1
Player.numTaskForceArtillery = 1
Player.givenOrder = false
--TODO use enum-like values instead of literals for order types
@@ -20,7 +20,24 @@ function Player:buildFort()
self:deselectUnits()
self:selectUnits({engineer})
fort = GameObjectFactory.createUnit(self, UnitId.FORT, self:getSpawnPoint(), Quaternion:new(1, 0, 0, 0), 0)
map = Map.getSingleton()
sp = map:getSpawnPoint(self:getSpawnPointId())
minDistId = nil
for i = 0, map:getNumSpawnPoints() do
if i ~= self:getSpawnPointId() then
if minDistId == nil then minDistId = i end
if map:getSpawnPoint(i):getDistanceFrom(sp) < map:getSpawnPoint(minDistId):getDistanceFrom(sp) then
minDistId = i
end
end
end
self.baseDir = map:getSpawnPoint(minDistId):subtr(sp):norm()
right = (self.baseDir:getAngleBetween(Vector3:new(1, 0, 0)) > 1.57)
angle = self.baseDir:getAngleBetween(Vector3:new(0, 0, 1)) * (right and -1 or 1)
fort = GameObjectFactory.createUnit(self, UnitId.FORT, sp, Quaternion:new(angle, Vector3:new(0, 1, 0)), 0)
self:addUnit(fort)
self:issueOrder(1, Vector3:new(0, 0, 0), {Target:new(fort, Vector3:new(0, 0, 0))}, false)
@@ -35,7 +52,7 @@ function Player:trainEngineers()
end
fort = forts[1]:toFactory()
dirToCenter = Vector3:new(0, 0, 0):subtr(fort:getPos()):norm()
baseDir = Vector3:new(0, 0, 0):subtr(fort:getPos()):norm()
while #fort:getQueue() + #self:getUnitsByClass(UnitClass.ENGINEER, -1) < self.numStartEngis do
fort:appendToQueue(0)
@@ -58,7 +75,7 @@ function Player:buildExtractor()
if #deposits == 0 then return false end
depPos = deposits[1]:getPos()
spawnPoint = self:getSpawnPoint()
spawnPoint = Map.getSingleton():getSpawnPoint(self:getSpawnPointId())
for i = 1, #deposits do
if deposits[i]:getPos():getDistanceFrom(spawnPoint) < depPos:getDistanceFrom(spawnPoint) then
@@ -78,8 +95,8 @@ function Player:startBuilding(buildingId, engiId, angle)
self:deselectUnits()
self:selectUnits({engineer})
dirVec = Quaternion:new(angle, Vector3:new(0, 1, 0)):multVec(dirToCenter)
refPos = self:getSpawnPoint():add(dirVec:mult(20))
dirVec = Quaternion:new(angle, Vector3:new(0, 1, 0)):multVec(baseDir)
refPos = Map.getSingleton():getSpawnPoint(self:getSpawnPointId()):add(dirVec:mult(20))
building = GameObjectFactory.createUnit(self, buildingId, refPos, Quaternion:new(1, 0, 0, 0), 0)
self:addUnit(building)
self:issueOrder(1, Vector3:new(0, 0, 0), {Target:new(building, Vector3:new(0, 0, 0))}, false)
@@ -218,11 +235,12 @@ function Player:sendTaskforce()
end
players = Game.getSingleton():getPlayers()
map = Map.getSingleton()
enemySpawnPoint = nil
for i = 1, #players do
if players[i] ~= self then
enemySpawnPoint = players[i]:getSpawnPoint()
enemySpawnPoint = map:getSpawnPoint(players[i]:getSpawnPointId())
break
end
end
+11 -2
View File
@@ -8,6 +8,7 @@
#include "gameManager.h"
#include "gameObjectFactory.h"
#include "map.h"
#include "game.h"
#include "guiAppState.h"
#include "defConfigs.h"
@@ -82,7 +83,7 @@ namespace battleship{
);
SOL_LUA_STATE.new_usertype<Player>(
"Player", sol::constructors<Player(int, int, int, Vector3, bool, Vector3, string)>(),
"Player", sol::constructors<Player(int, int, int, Vector3, bool, int, string)>(),
"getSelectedUnits", &Player::getSelectedUnits,
"addUnit", &Player::addUnit,
"getUnit", &Player::getUnit,
@@ -91,7 +92,7 @@ namespace battleship{
"issueOrder", &Player::issueOrder,
"selectUnits", &Player::selectUnits,
"deselectUnits", &Player::deselectUnits,
"getSpawnPoint", &Player::getSpawnPoint,
"getSpawnPointId", &Player::getSpawnPointId,
"getUnitsById", &Player::getUnitsById,
"getUnitsByClass", &Player::getUnitsByClass
);
@@ -113,6 +114,7 @@ namespace battleship{
"y", &Vector3::y,
"z", &Vector3::z,
"norm", &Vector3::norm,
"getAngleBetween", &Vector3::getAngleBetween,
"getDistanceFrom", &Vector3::getDistanceFrom,
"add", [](Vector3 v1, Vector3 v2){return v1 + v2;},
"subtr", [](Vector3 v1, Vector3 v2){return v1 - v2;},
@@ -128,6 +130,13 @@ namespace battleship{
"z", &Quaternion::z,
"multVec", [](Quaternion q, Vector3 v){return q * v;}
);
SOL_LUA_STATE.new_usertype<Map>(
"Map",
"getSingleton", &Map::getSingleton,
"getSpawnPoint", &Map::getSpawnPoint,
"getNumSpawnPoints", &Map::getNumSpawnPoints
);
}
void GameManager::initLua(string gameDir){
+10 -2
View File
@@ -12,13 +12,13 @@ namespace battleship{
using namespace gameBase;
using namespace std;
Player::Player(int diff, int fac, int t, Vector3 col, bool cpuPl, Vector3 sp, string n) :
Player::Player(int diff, int fac, int t, Vector3 col, bool cpuPl, int sp, string n) :
difficulty(diff),
faction(fac),
team(t),
color(col),
cpuPlayer(cpuPl),
spawnPoint(sp),
spawnPointId(sp),
name("pl"),
refineds(30000),
trader(new Trader())
@@ -212,4 +212,12 @@ namespace battleship{
break;
}
}
void Player::build(int id, Vector3 pos, Quaternion rot, bool additionalOrder){
/*
Unit *buildStruct = GameObjectFactory::createUnit(this, id, pos, rot);
addUnit(buildStruct);
issueOrder(Order::TYPE::BUILD, vector<Order::Target>{Order::Target(buildStruct)}, additionalOrder);
*/
}
}
+5 -3
View File
@@ -16,7 +16,7 @@ namespace battleship{
class Player {
public:
Player(int, int, int, vb01::Vector3, bool = true, vb01::Vector3 = vb01::Vector3::VEC_ZERO, std::string = "");
Player(int, int, int, vb01::Vector3, bool = true, int = -1, std::string = "");
~Player();
void update();
void issueOrder(Order::TYPE, vb01::Vector3, std::vector<Order::Target>, bool);
@@ -32,6 +32,7 @@ namespace battleship{
void addTechnology(int);
int getResource(ResourceType);
void updateResource(ResourceType, int, bool);
void build(int, vb01::Vector3, vb01::Quaternion, bool);
inline Trader* getTrader(){return trader;}
inline void deselectUnits(){selectedUnits.clear();}
inline Unit* getSelectedUnit(int id){return selectedUnits[id];}
@@ -52,7 +53,7 @@ namespace battleship{
inline int getTeam(){return team;}
inline int getNumUnits(){return units.size();}
inline int getFaction(){return faction;}
inline vb01::Vector3 getSpawnPoint(){return spawnPoint;}
inline int getSpawnPointId(){return spawnPointId;}
inline bool isCpuPlayer(){return cpuPlayer;}
inline int getNumVehiclesBuilt(){return vehiclesBuilt;}
inline int getNumVehiclesDestroyed(){return vehiclesDestroyed;}
@@ -78,12 +79,13 @@ namespace battleship{
int faction, difficulty, team;
int vehiclesBuilt = 0, vehiclesDestroyed = 0, vehiclesLost = 0;
int structuresBuilt = 0, structuresDestroyed = 0, structuresLost = 0;
int spawnPointId = -1;
Trader *trader = nullptr;
std::string name;
std::vector<Unit*> units, selectedUnits;
std::vector<Projectile*> projectiles;
std::vector<ResourceDeposit*> resourceDeposits;
vb01::Vector3 spawnPoint, color;
vb01::Vector3 color;
vb01::Material *colorMaterial = nullptr;
int getOrderLineId(Order::TYPE, vb01::Vector3, vb01::Vector3);