From 4e59cdcd75929c7585d5c7928449b62003b26e89 Mon Sep 17 00:00:00 2001 From: devZoGok Date: Sat, 16 Dec 2023 17:26:12 +0200 Subject: [PATCH] implemented CPU player building a land factory --- Assets/Models/Maps/222/222.lua | 7 +- Assets/Scripts/Abilities/abilityData.lua | 5 ++ Assets/Scripts/Core/player.lua | 70 +++++++++++++++---- Assets/Scripts/GameObjects/Units/unitData.lua | 1 + .../Scripts/Technologies/technologyData.lua | 10 +++ Assets/Scripts/aiAgent.lua | 7 +- Assets/Scripts/structure.lua | 8 ++- Assets/Scripts/unit.lua | 13 ++-- Assets/Scripts/vehicle.lua | 8 ++- game.cpp | 8 ++- gameManager.cpp | 57 +++++++++++++++ gameManager.h | 5 ++ playButton.cpp | 5 +- 13 files changed, 167 insertions(+), 37 deletions(-) create mode 100644 Assets/Scripts/Abilities/abilityData.lua create mode 100644 Assets/Scripts/Technologies/technologyData.lua diff --git a/Assets/Models/Maps/222/222.lua b/Assets/Models/Maps/222/222.lua index 351443e..ee2914e 100644 --- a/Assets/Models/Maps/222/222.lua +++ b/Assets/Models/Maps/222/222.lua @@ -24,7 +24,10 @@ resourceDeposits = { {id = 0, pos = {x = -5.240124, y = 0.000004, z = 11.061106}, rot = {w = 1.000000, x = 0.000000, y = 0.000000, z = 0.000000}}, {id = 0, pos = {x = -5.381660, y = 0.000004, z = 11.083004}, rot = {w = 1.000000, x = 0.000000, y = 0.000000, z = 0.000000}}, }, -numUnits = 0, +numUnits = 1, +units = { + {id = 3, pos = {x = -50.000000, y = 0.000000, z = -50.000000}, rot = {w = 1.000000, x = 0.000000, y = 0.000000, z = 0.000000}}, +} } }, numCells = 289, @@ -323,4 +326,4 @@ skybox = "Skybox1", terrain = {model = "222.xml", albedo = "222.jpg"}, waterbodies = { } -} \ No newline at end of file +} diff --git a/Assets/Scripts/Abilities/abilityData.lua b/Assets/Scripts/Abilities/abilityData.lua new file mode 100644 index 0000000..0bef041 --- /dev/null +++ b/Assets/Scripts/Abilities/abilityData.lua @@ -0,0 +1,5 @@ +AbilityType = {SPEED = 0} + +ablilities = { + {type = AbilityType.SPEED, ammount = .2, units = {UnitClass.WAR_MECH}} +} diff --git a/Assets/Scripts/Core/player.lua b/Assets/Scripts/Core/player.lua index 9275736..73e386b 100644 --- a/Assets/Scripts/Core/player.lua +++ b/Assets/Scripts/Core/player.lua @@ -1,26 +1,70 @@ -function Player:foo1() - print('foo 1') +function Player:selectTaskForce() + taskForce = self:getSelectedUnitsByClass(UnitClass.TANK) + return #taskForce > 5 +end + +function Player:issueMoveOrder() + return false +end + +function Player:selectLandFactory() + return false +end + +function Player:trainTaskForce() + return false +end + +function Player:selectLandCell() return true end -function Player:foo2() - print('foo 2') - return true +function Player:selectEngi() + taskForce = self:getSelectedUnitsByClass(UnitClass.ENGINEER) + + if #taskForce == 0 then + self:selectUnits({self:getUnit(0)}) + end + + taskForce = self:getSelectedUnitsByClass(UnitClass.ENGINEER) + return #taskForce > 0 end -function Player:foo3() - print('foo 3') - return true -end +function Player:issueBuildOrder() + for i = 1, self:getNumUnits() do + if self:getUnit(i - 1):getUnitClass() == UnitClass.LAND_FACTORY then + return true + end + end -function Player:foo4() - print('foo 4') + spawnPoint = self:getSpawnPoint() + structure = GameObjectFactory.createUnit(self, 8, spawnPoint, Quaternion:new(1, 0, 0, 0), 0) + self:addUnit(structure) + + targets = {Target:new(structure, Vector3:new(0, 0, 0))} + self:issueOrder(1, Vector3:new(0, 0, 0), targets, false) return true end Player.behaviour = { - type = BTNodeType.SEQUENCE, + type = BTNodeType.SELECTOR, children = { - {type = BTNodeType.FUNCTION, func = Player.foo3} + { + type = BTNodeType.SEQUENCE, children = { + {type = BTNodeType.FUNCTION, func = 'selectTaskForce'}, + {type = BTNodeType.FUNCTION, func = 'issueMoveOrder'}, + }, + type = BTNodeType.SEQUENCE, children = { + {type = BTNodeType.FUNCTION, func = 'selectLandFactory'}, + {type = BTNodeType.FUNCTION, func = 'trainTaskForce'} + }, + type = BTNodeType.SEQUENCE, children = { + {type = BTNodeType.FUNCTION, func = 'selectLandCell'}, + {type = BTNodeType.FUNCTION, func = 'selectEngi'}, + {type = BTNodeType.FUNCTION, func = 'issueBuildOrder'} + } + } + --[[ + ]]-- } } diff --git a/Assets/Scripts/GameObjects/Units/unitData.lua b/Assets/Scripts/GameObjects/Units/unitData.lua index c6244f9..bfe2f63 100644 --- a/Assets/Scripts/GameObjects/Units/unitData.lua +++ b/Assets/Scripts/GameObjects/Units/unitData.lua @@ -1,3 +1,4 @@ +--TYPE = {ATTACK = 0, BUILD = 1, MOVE = 2, GARRISON = 3, EJECT = 4, PATROL = 5, LAUNCH = 6}; UnitClass = {WAR_MECH = 0, TANK = 1, ARTILLERY = 2, ENGINEER = 3, TRANSPORT = 4, CARGO_SHIP = 5, CARRIER = 6, SUBMARINE = 7, LAND_FACTORY = 8, NAVAL_FACTORY = 9, MARKET = 10, LAB = 11, POINT_DEFENSE = 12} UnitType = {UNDERWATER = 0, SEA_LEVEL = 1, HOVER = 2, LAND = 3, AIR = 4} diff --git a/Assets/Scripts/Technologies/technologyData.lua b/Assets/Scripts/Technologies/technologyData.lua new file mode 100644 index 0000000..57d097e --- /dev/null +++ b/Assets/Scripts/Technologies/technologyData.lua @@ -0,0 +1,10 @@ +technologies = { + { + name = '', + cost = 10, + icon = '', + description = '', + abilities = {0}, + units = {} + } +} diff --git a/Assets/Scripts/aiAgent.lua b/Assets/Scripts/aiAgent.lua index 2ca355b..29f2f0c 100644 --- a/Assets/Scripts/aiAgent.lua +++ b/Assets/Scripts/aiAgent.lua @@ -1,11 +1,12 @@ BTNodeType = {SELECTOR = 0, SEQUENCE = 1, FUNCTION = 2} -function executeBtNode(btNode) +function executeBtNode(agent, btNode) for i = 1, #btNode.children do if btNode.children[i].type == BTNodeType.FUNCTION then - res = btNode.children[i].func() + func = btNode.children[i].func + res = agent[func](agent) else - res = executeBtNode(btNode.children[i]) + res = executeBtNode(agent, btNode.children[i]) end if btNode.type == BTNodeType.SELECTOR then diff --git a/Assets/Scripts/structure.lua b/Assets/Scripts/structure.lua index 812a9ae..9a35fa1 100644 --- a/Assets/Scripts/structure.lua +++ b/Assets/Scripts/structure.lua @@ -1,3 +1,5 @@ -Structure = {} - -function Structure:new{Unit:new()} +Structure.behaviour = { + type = BTNodeType.SEQUENCE, + children = { + } +} diff --git a/Assets/Scripts/unit.lua b/Assets/Scripts/unit.lua index c9d22f6..6aeab4d 100644 --- a/Assets/Scripts/unit.lua +++ b/Assets/Scripts/unit.lua @@ -1,8 +1,5 @@ -Unit = {} - -function Unit:new(un) - unit = un or {} - self.__index = index - setmetatable(unit, self) - return unit -end +Unit.behaviour = { + type = BTNodeType.SEQUENCE, + children = { + } +} diff --git a/Assets/Scripts/vehicle.lua b/Assets/Scripts/vehicle.lua index c969f97..c9108e5 100644 --- a/Assets/Scripts/vehicle.lua +++ b/Assets/Scripts/vehicle.lua @@ -1,3 +1,5 @@ -Vehicle = {} - -function Vehicle:new{Unit:new()} +Vehicle.behaviour = { + type = BTNodeType.SEQUENCE, + children = { + } +} diff --git a/game.cpp b/game.cpp index cc6dfac..069521d 100644 --- a/game.cpp +++ b/game.cpp @@ -34,11 +34,13 @@ namespace battleship{ SOL_LUA_VIEW.script("game.players = {}"); for(int i = 0; i < players.size(); i++) - SOL_LUA_VIEW["game"]["players"][i + 1] = *players[i]; + SOL_LUA_VIEW["game"]["players"][i + 1] = players[i]; for(int i = 0; i < players.size(); i++) - if(players[i]->isCpuPlayer()) - SOL_LUA_VIEW.script("executeBtNode(game.players[" + to_string(i + 1) + "].behaviour)"); + if(players[i]->isCpuPlayer()){ + string plStr = "game.players[" + to_string(i + 1) + "]"; + SOL_LUA_VIEW.script("executeBtNode(" + plStr + ", " + plStr + ".behaviour)"); + } } void Game::update(){ diff --git a/gameManager.cpp b/gameManager.cpp index 773b438..afc7572 100755 --- a/gameManager.cpp +++ b/gameManager.cpp @@ -7,9 +7,11 @@ #include #include "gameManager.h" +#include "gameObjectFactory.h" #include "guiAppState.h" #include "defConfigs.h" #include "player.h" +#include "resourceDeposit.h" using namespace std; using namespace vb01; @@ -25,9 +27,59 @@ namespace battleship{ return gameManager; } + void GameManager::registerOrderMembers(){ + sol::state_view SOL_LUA_STATE = generateView(); + sol::usertype orderType = SOL_LUA_STATE.new_usertype("Order", sol::constructors, Vector3, int)>()); + orderType["type"] = &Order::type; + orderType["direction"] = &Order::direction; + orderType["targets"] = &Order::targets; + + sol::usertype targetType = SOL_LUA_STATE.new_usertype("Target", sol::constructors()); + targetType["unit"] = &Order::Target::unit; + targetType["pos"] = &Order::Target::pos; + } + + void GameManager::registerGameObjectFactoryMembers(){ + sol::state_view SOL_LUA_STATE = generateView(); + sol::usertype gmObjFacType = SOL_LUA_STATE.new_usertype("GameObjectFactory"); + gmObjFacType["createUnit"] = &GameObjectFactory::createUnit; + gmObjFacType["createResourceDeposit"] = &GameObjectFactory::createResourceDeposit; + } + + void GameManager::registerUnitMembers(){ + sol::state_view SOL_LUA_STATE = generateView(); + sol::usertype unitType = SOL_LUA_STATE.new_usertype("Unit", sol::constructors()); + unitType["getUnitClass"] = &Unit::getUnitClass; + } + void GameManager::registerPlayerMembers(){ sol::state_view SOL_LUA_STATE = generateView(); sol::usertype playerType = SOL_LUA_STATE.new_usertype("Player", sol::constructors()); + playerType["addUnit"] = &Player::addUnit; + playerType["getUnit"] = &Player::getUnit; + playerType["getNumUnits"] = &Player::getNumberOfUnits; + playerType["issueOrder"] = &Player::issueOrder; + playerType["selectUnits"] = &Player::selectUnits; + playerType["deselectUnits"] = &Player::deselectUnits; + playerType["getSpawnPoint"] = &Player::getSpawnPoint; + playerType["getSelectedUnitsByClass"] = &Player::getSelectedUnitsByClass; + } + + void GameManager::registerVectorMembers(){ + sol::state_view SOL_LUA_STATE = generateView(); + sol::usertype vec3Type = SOL_LUA_STATE.new_usertype("Vector3", sol::constructors()); + vec3Type["x"] = &Vector3::x; + vec3Type["y"] = &Vector3::y; + vec3Type["z"] = &Vector3::z; + } + + void GameManager::registerQuaternionMembers(){ + sol::state_view SOL_LUA_STATE = generateView(); + sol::usertype quatType = SOL_LUA_STATE.new_usertype("Quaternion", sol::constructors()); + quatType["w"] = &Quaternion::w; + quatType["x"] = &Quaternion::x; + quatType["y"] = &Quaternion::y; + quatType["z"] = &Quaternion::z; } void GameManager::initLua(string gameDir){ @@ -45,6 +97,11 @@ namespace battleship{ } void GameManager::start(string gameDir) { + registerVectorMembers(); + registerQuaternionMembers(); + registerOrderMembers(); + registerGameObjectFactoryMembers(); + registerUnitMembers(); registerPlayerMembers(); initLua(gameDir); diff --git a/gameManager.h b/gameManager.h index f676994..10df4f1 100755 --- a/gameManager.h +++ b/gameManager.h @@ -29,6 +29,11 @@ namespace battleship{ private: GameManager(){} ~GameManager(){} + void registerOrderMembers(); + void registerVectorMembers(); + void registerQuaternionMembers(); + void registerGameObjectFactoryMembers(); + void registerUnitMembers(); void registerPlayerMembers(); void initLua(std::string); diff --git a/playButton.cpp b/playButton.cpp index 71a57dc..f871d28 100644 --- a/playButton.cpp +++ b/playButton.cpp @@ -33,16 +33,17 @@ namespace battleship{ string mapName = wstringToString(mapListbox->getContents()[selectedMap]); Map *map = Map::getSingleton(); map->load(mapName); - Game::getSingleton()->addPlayer(new Player(0, 0, 0)); int numPlayers = map->getNumSpawnPoints(); for(int i = 0; i < numPlayers; i++){ - Player *player = new Player(0, 0, i + 1, false); + Player *player = new Player(0, 0, i); map->loadPlayerGameObjects(player); Game::getSingleton()->addPlayer(player); } + Game::getSingleton()->addPlayer(new Player(0, 0, 0, false)); + StateManager *stateManager = GameManager::getSingleton()->getStateManager(); stateManager->attachAppState(new InGameAppState(difficulties, factions));