CPU AI builds a refinery, land factory, an extractor and starts harvesting

corrected harvester unit type
This commit is contained in:
devZoGok
2024-02-04 15:18:06 +02:00
parent 7361fbcd6f
commit e6c250ed09
4 changed files with 204 additions and 4 deletions
+125
View File
@@ -1,5 +1,16 @@
Player.numStartEngis = 3
Player.dirToCenter = nil
Player.startedFort = false
Player.finishedFort = false
Player.startedRefinery = false
Player.finishedRefinery = false
Player.startedLandFactory = false
Player.finishedLandFactory = false
Player.startedNavalFactory = false
Player.finishedNavalFactory = false
Player.startedExtractor = false
Player.finishedExtractor = false
Player.startedHarvesting = false
function Player:buildFort()
if self.startedFort then
@@ -31,11 +42,120 @@ function Player:trainEngineers()
end
fort = forts[1]:toFactory()
dirToCenter = Vector3:new(0, 0, 0):subtr(fort:getPos()):norm()
while #fort:getQueue() + #self:getUnitsByClass(UnitClass.ENGINEER, -1) < self.numStartEngis do
fort:appendToQueue(UnitId.ENGINEER)
end
return #self:getUnitsByClass(UnitClass.ENGINEER, -1) == 3
end
function Player:buildExtractor()
if self.startedExtractor then
return true
end
engineer = self:getUnitsByClass(UnitClass.ENGINEER, -1)[1]
self:deselectUnits()
self:selectUnits({engineer})
deposits = self:getResourceDeposits()
depPos = nil
if #deposits > 0 then
depPos = deposits[1]:getPos()
end
if depPos == nil then
return false
end
extractor = GameObjectFactory.createUnit(self, UnitId.EXTRACTOR, depPos, Quaternion:new(1, 0, 0, 0), 0)
self:addUnit(extractor)
self:issueOrder(1, Vector3:new(0, 0, 0), {Target:new(extractor, Vector3:new(0, 0, 0))}, false)
self.startedExtractor = true
return true
end
function Player:startBuilding(buildingId, engiId, angle)
engineer = self:getUnitsByClass(UnitClass.ENGINEER, -1)[engiId]
self:deselectUnits()
self:selectUnits({engineer})
dirVec = Quaternion:new(angle, Vector3:new(0, 1, 0)):multVec(dirToCenter)
refPos = self:getSpawnPoint():add(dirVec:mult(20))
refinery = GameObjectFactory.createUnit(self, buildingId, refPos, Quaternion:new(1, 0, 0, 0), 0)
self:addUnit(refinery)
self:issueOrder(1, Vector3:new(0, 0, 0), {Target:new(refinery, Vector3:new(0, 0, 0))}, false)
end
function Player:buildRefinery()
if not self.startedRefinery then
self.startedRefinery = true
self:startBuilding(UnitId.REFINERY, 2, -.6)
end
if not self.finishedRefinery then
refTable = self:getUnitsByClass(UnitClass.REFINERY, 1)
if #refTable == 1 and refTable[1]:toFactory():getBuildStatus() == 100 then
self.finishedRefinery = true
end
end
return self.finishedRefinery
end
function Player:buildLandFactory()
if not self.startedLandFactory then
self.startedLandFactory = true
self:startBuilding(UnitId.LAND_FACTORY, 3, .6)
end
if not self.finishedLandFactory then
facTable = self:getUnitsByClass(UnitClass.LAND_FACTORY, 1)
if #facTable == 1 and facTable[1]:toFactory():getBuildStatus() == 100 then
self.finishedLandFactory = true
end
end
return self.finishedLandFactory
end
function Player:buildHarvester()
if #self:getUnitsByClass(UnitClass.RESOURCE_ROVER, 1) > 0 then
return true
end
landFactories = self:getUnitsByClass(UnitClass.LAND_FACTORY, 1)
if #landFactories == 0 then return false end
factory = landFactories[1]:toFactory()
if #factory:getQueue() == 0 then
factory:appendToQueue(UnitId.RESOURCE_ROVER)
end
return true
end
function Player:startHarvesting()
if self.startedHarvesting then return true end
harvs = self:getUnitsByClass(UnitClass.RESOURCE_ROVER, 1)
extrs = self:getUnitsByClass(UnitClass.EXTRACTOR, 1)
if #harvs == 0 or (#extrs == 0) then return false end
self:deselectUnits()
self:selectUnits({harvs[1]})
self:issueOrder(7, Vector3:new(0, 0, 0), {Target:new(extrs[1], Vector3:new(0, 0, 0))}, false)
self.startedHarvesting = true
return true
end
@@ -44,5 +164,10 @@ Player.behaviour = {
children = {
{type = BTNodeType.FUNCTION, func = 'buildFort'},
{type = BTNodeType.FUNCTION, func = 'trainEngineers'},
{type = BTNodeType.FUNCTION, func = 'buildExtractor'},
{type = BTNodeType.FUNCTION, func = 'buildRefinery'},
{type = BTNodeType.FUNCTION, func = 'buildLandFactory'},
{type = BTNodeType.FUNCTION, func = 'buildHarvester'},
{type = BTNodeType.FUNCTION, func = 'startHarvesting'},
}
}
@@ -194,7 +194,7 @@ units = {
{
weapons = {},
unitClass = UnitClass.RESOURCE_ROVER,
unitType = UnitType.SEA_LEVEL,
unitType = UnitType.HOVER,
armor = {ArmorType.CAST},
isVehicle = true,
health = 500,
+62
View File
@@ -0,0 +1,62 @@
Pos = {x = 110, y = 150}
Size = {x = 100, y = 20}
space = 60
gui = {
{
pos = Pos,
size = Size,
guiType = GuiType.LISTBOX,
numMaxDisplay = 3,
listboxType = ListboxType.FACTIONS
},
{
pos = {x = Pos.x, y = Pos.y + Size.y + space},
size = Size,
guiType = GuiType.LISTBOX,
numMaxDisplay = 3,
listboxType = ListboxType.FACTIONS
},
{
pos = {x = Pos.x, y = Pos.y + 2 * (Size.y + space)},
size = Size,
guiType = GuiType.LISTBOX,
numMaxDisplay = 3,
listboxType = ListboxType.FACTIONS
},
{
pos = {x = Pos.x, y = Pos.y + 3 * (Size.y + space)},
size = Size,
guiType = GuiType.LISTBOX,
numMaxDisplay = 3,
listboxType = ListboxType.FACTIONS
},
{
pos = {x = Pos.x, y = Pos.y + 4 * (Size.y + space)},
size = Size,
guiType = GuiType.LISTBOX,
numMaxDisplay = 3,
listboxType = ListboxType.FACTIONS
},
{
pos = {x = Pos.x, y = Pos.y + 5 * (Size.y + space)},
size = Size,
guiType = GuiType.LISTBOX,
numMaxDisplay = 3,
listboxType = ListboxType.FACTIONS
},
{
pos = {x = Pos.x, y = Pos.y + 6 * (Size.y + space)},
size = Size,
guiType = GuiType.LISTBOX,
numMaxDisplay = 3,
listboxType = ListboxType.FACTIONS
},
{
pos = {x = Pos.x, y = Pos.y + 7 * (Size.y + space)},
size = Size,
guiType = GuiType.LISTBOX,
numMaxDisplay = 3,
listboxType = ListboxType.FACTIONS
},
}
+16 -3
View File
@@ -63,6 +63,7 @@ namespace battleship{
SOL_LUA_STATE.new_usertype<Factory>(
"Factory", sol::constructors<Factory(Player*, int, Vector3, Quaternion, int)>(),
"getPos", &GameObject::getPos,
"appendToQueue", &Factory::appendToQueue,
"getBuildStatus", &Structure::getBuildStatus,
"getQueue", &Factory::getQueue
@@ -73,6 +74,7 @@ namespace battleship{
"addUnit", &Player::addUnit,
"getUnit", &Player::getUnit,
"getNumUnits", &Player::getNumUnits,
"getResourceDeposits", &Player::getResourceDeposits,
"issueOrder", &Player::issueOrder,
"selectUnits", &Player::selectUnits,
"deselectUnits", &Player::deselectUnits,
@@ -81,19 +83,30 @@ namespace battleship{
"getUnitsByClass", &Player::getUnitsByClass
);
SOL_LUA_STATE.new_usertype<ResourceDeposit>(
"ResourceDeposit", sol::constructors<ResourceDeposit(Player*, int, Vector3, Quaternion, int)>(),
"getPos", &GameObject::getPos
);
SOL_LUA_STATE.new_usertype<Vector3>(
"Vector3", sol::constructors<Vector3(), Vector3(float, float, float)>(),
"x", &Vector3::x,
"y", &Vector3::y,
"z", &Vector3::z
"z", &Vector3::z,
"norm", &Vector3::norm,
"add", [](Vector3 v1, Vector3 v2){return v1 + v2;},
"subtr", [](Vector3 v1, Vector3 v2){return v1 - v2;},
"mult", [](Vector3 v1, float s){return v1 * s;},
"div", [](Vector3 v1, float s){return v1 / s;}
);
SOL_LUA_STATE.new_usertype<Quaternion>(
"Quaternion", sol::constructors<Quaternion(), Quaternion(float, float, float, float)>(),
"Quaternion", sol::constructors<Quaternion(), Quaternion(float, float, float, float), Quaternion(float, Vector3)>(),
"w", &Quaternion::w,
"x", &Quaternion::x,
"y", &Quaternion::y,
"z", &Quaternion::z
"z", &Quaternion::z,
"multVec", [](Quaternion q, Vector3 v){return q * v;}
);
}