diff --git a/Assets/Scripts/Core/player.lua b/Assets/Scripts/Core/player.lua index 6e5a1ce..f8fdb2c 100644 --- a/Assets/Scripts/Core/player.lua +++ b/Assets/Scripts/Core/player.lua @@ -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'}, } } diff --git a/Assets/Scripts/GameObjects/Units/unitData.lua b/Assets/Scripts/GameObjects/Units/unitData.lua index 68af32a..da3696f 100644 --- a/Assets/Scripts/GameObjects/Units/unitData.lua +++ b/Assets/Scripts/GameObjects/Units/unitData.lua @@ -194,7 +194,7 @@ units = { { weapons = {}, unitClass = UnitClass.RESOURCE_ROVER, - unitType = UnitType.SEA_LEVEL, + unitType = UnitType.HOVER, armor = {ArmorType.CAST}, isVehicle = true, health = 500, diff --git a/Assets/Scripts/Gui/playerSelection.lua b/Assets/Scripts/Gui/playerSelection.lua new file mode 100644 index 0000000..3857ed9 --- /dev/null +++ b/Assets/Scripts/Gui/playerSelection.lua @@ -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 + }, +} diff --git a/gameManager.cpp b/gameManager.cpp index af5cc8b..e985fac 100755 --- a/gameManager.cpp +++ b/gameManager.cpp @@ -63,6 +63,7 @@ namespace battleship{ SOL_LUA_STATE.new_usertype( "Factory", sol::constructors(), + "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", sol::constructors(), + "getPos", &GameObject::getPos + ); + SOL_LUA_STATE.new_usertype( "Vector3", sol::constructors(), "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", sol::constructors(), + "Quaternion", sol::constructors(), "w", &Quaternion::w, "x", &Quaternion::x, "y", &Quaternion::y, - "z", &Quaternion::z + "z", &Quaternion::z, + "multVec", [](Quaternion q, Vector3 v){return q * v;} ); }