diff --git a/Assets/Scripts/Core/player.lua b/Assets/Scripts/Core/player.lua index 748e28e..b82e107 100644 --- a/Assets/Scripts/Core/player.lua +++ b/Assets/Scripts/Core/player.lua @@ -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 diff --git a/gameManager.cpp b/gameManager.cpp index 74fcb1e..4b05794 100755 --- a/gameManager.cpp +++ b/gameManager.cpp @@ -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", sol::constructors(), + "Player", sol::constructors(), "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", + "getSingleton", &Map::getSingleton, + "getSpawnPoint", &Map::getSpawnPoint, + "getNumSpawnPoints", &Map::getNumSpawnPoints + ); } void GameManager::initLua(string gameDir){ diff --git a/player.cpp b/player.cpp index 2dbbc5f..95d51ad 100755 --- a/player.cpp +++ b/player.cpp @@ -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(buildStruct)}, additionalOrder); + */ + } } diff --git a/player.h b/player.h index e64b3db..c33b0c4 100755 --- a/player.h +++ b/player.h @@ -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, 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 units, selectedUnits; std::vector projectiles; std::vector resourceDeposits; - vb01::Vector3 spawnPoint, color; + vb01::Vector3 color; vb01::Material *colorMaterial = nullptr; int getOrderLineId(Order::TYPE, vb01::Vector3, vb01::Vector3);