mirror of
https://github.com/devZoGok/PlanetFleet.git
synced 2026-08-26 19:43:29 +00:00
CPU AI builds a refinery, land factory, an extractor and starts harvesting
corrected harvester unit type
This commit is contained in:
@@ -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,
|
||||
|
||||
@@ -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
@@ -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;}
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user