Merge pull request #87 from devZoGok/ft-82-unit-states

Ft 82 unit states
This commit is contained in:
devZoGok
2024-02-17 09:27:58 +00:00
committed by GitHub
28 changed files with 117 additions and 40 deletions
+3
View File
@@ -36,6 +36,9 @@ mappings = {
{bind = 32, trigger = 66, action = true, bindType = 0, inOptions = true},
{bind = 33, trigger = 256, action = true, bindType = 0, inOptions = true},
{bind = 47, trigger = 69, action = true, bindType = 0, inOptions = false},
{bind = 48, trigger = 84, action = true, bindType = 0, inOptions = false},
{bind = 49, trigger = 89, action = true, bindType = 0, inOptions = false},
{bind = 50, trigger = 85, action = true, bindType = 0, inOptions = false},
{bind = 7, trigger = 312, action = false, bindType = 2, inOptions = false},
{bind = 8, trigger = 313, action = false, bindType = 2, inOptions = false},
+6
View File
@@ -211,6 +211,12 @@ function Player:sendTaskforce()
self:selectUnits(taskForceTanks)
self:selectUnits(taskForceArtillery)
taskForce = self:getSelectedUnits()
for i = 1, #taskForce do
taskForce[i]:setState(0)
end
players = Game.getSingleton():getPlayers()
enemySpawnPoint = nil
@@ -63,7 +63,7 @@ units = {
cost = 500,
size = {x = 2.9, y = 8.22, z = 2.42},
hitboxOffset = {x = 0, y = 0, z = 0},
lineOfSight = 5,
lineOfSight = 20,
name = 'War mech',
basePath = PATH .. vehiclePrefix .. 'WarMechs/',
meshPath = 'warMech.xml',
@@ -76,7 +76,7 @@ units = {
garrisonCategory = 1
},
{
weapons = {{type = WeaponClass.HITSCAN, rateOfFire = 500, fireSfx = PATH .. 'Sounds/Units/Tanks/attack.ogg', damage = 200, maxRange = 20}},
weapons = {{type = WeaponClass.HITSCAN, rateOfFire = 500, fireSfx = PATH .. 'Sounds/Units/Tanks/attack.ogg', damage = 200, maxRange = 25}},
unitClass = UnitClass.TANK,
unitType = UnitType.LAND,
armor = {ArmorType.STEEL},
@@ -86,7 +86,7 @@ units = {
cost = 500,
size = {x = 2.9, y = 8.22, z = 2.42},
hitboxOffset = {x = 0, y = 0, z = 0},
lineOfSight = 5,
lineOfSight = 25,
name = 'Tank',
basePath = PATH .. vehiclePrefix .. 'Tanks/',
meshPath = 'tank.xml',
@@ -99,7 +99,7 @@ units = {
garrisonCategory = 2
},
{
weapons = {{type = WeaponClass.HITSCAN, rateOfFire = 2000, fireSfx = PATH .. 'Sounds/Units/Tanks/attack.ogg', damage = 5000, maxRange = 45}},
weapons = {{type = WeaponClass.HITSCAN, rateOfFire = 2000, fireSfx = PATH .. 'Sounds/Units/Tanks/attack.ogg', damage = 5000, maxRange = 30}},
unitClass = UnitClass.ARTILLERY,
unitType = UnitType.LAND,
armor = {ArmorType.MECHANIC},
@@ -109,7 +109,7 @@ units = {
cost = 500,
size = {x = 2.9, y = 8.22, z = 2.42},
hitboxOffset = {x = 0, y = 0, z = 0},
lineOfSight = 5,
lineOfSight = 30,
name = 'Artillery',
basePath = PATH .. vehiclePrefix .. 'Artillery/',
meshPath = 'artillery.xml',
@@ -506,7 +506,7 @@ units = {
cost = 500,
size = {x = 2, y = 10, z = 2},
hitboxOffset = {x = 0, y = 0, z = 0},
lineOfSight = 5,
lineOfSight = 55,
name = 'Point defense',
basePath = PATH .. structurePrefix .. 'PointDefenses/',
meshPath = 'pointDefense.xml',
+15
View File
@@ -323,6 +323,12 @@ namespace battleship{
}
}
void ActiveGameState::enableUnitState(Unit::State state){
vector<Unit*> selectedUnits = mainPlayer->getSelectedUnits();
for(Unit *unit : selectedUnits)
unit->setState(state);
}
void ActiveGameState::onAction(int bind, bool isPressed) {
GameObjectFrameController *ufCtr = GameObjectFrameController::getSingleton();
@@ -415,6 +421,15 @@ namespace battleship{
ufCtr->removeGameObjectFrames();
}
break;
case Bind::ENABLE_CHASE_STATE:
if(isPressed) enableUnitState(Unit::State::CHASE);
break;
case Bind::ENABLE_STAND_GROUND_STATE:
if(isPressed) enableUnitState(Unit::State::STAND_GROUND);
break;
case Bind::ENABLE_HOLD_FIRE_STATE:
if(isPressed) enableUnitState(Unit::State::HOLD_FIRE);
break;
case Bind::DESELECT:
if(ufCtr->isPlacingFrames()) ufCtr->setRotatingFrames(isPressed);
+1
View File
@@ -42,6 +42,7 @@ namespace battleship{
void castRayToTerrain();
void issueOrder(Order::TYPE, std::vector<Order::Target>, bool);
bool isInLineOfSight(vb01::Vector3, float, Unit*);
void enableUnitState(Unit::State);
inline bool canSelectHoveredOnGameObj(){return gameObjHoveredOn && gameObjHoveredOn->isSelectable() && gameObjHoveredOn->getPlayer() == mainPlayer;}
GuiAppState *guiState;
+4 -1
View File
@@ -50,7 +50,10 @@ namespace battleship{
CREATE_WATERBODY,
GENERATE_WEIGHTS,
TOGGLE_CELL_MARKERS,
EJECT_GARRISON
EJECT_GARRISON,
ENABLE_CHASE_STATE,
ENABLE_STAND_GROUND_STATE,
ENABLE_HOLD_FIRE_STATE
};
}
+1 -1
View File
@@ -26,7 +26,7 @@ namespace battleship{
const static int numAppStates = 4;
const static int numStaticBinds[numAppStates]{6, 0, 5, 19};
const static int numConfBinds[numAppStates]{0, 1, 23, 0};
const static int numConfBinds[numAppStates]{0, 1, 26, 0};
const static int maxStaticBinds = 19;
const static int maxConfBinds = 23;
const static int numScripts = 5;
+1 -1
View File
@@ -9,7 +9,7 @@ namespace battleship{
using namespace vb01;
using namespace gameBase;
Engineer::Engineer(Player *player, int id, Vector3 pos, Quaternion rot) : Vehicle(player, id, pos, rot){}
Engineer::Engineer(Player *player, int id, Vector3 pos, Quaternion rot, Unit::State state) : Vehicle(player, id, pos, rot, state){}
void Engineer::build(Order order){
if(pathPoints.empty()){
+1 -1
View File
@@ -10,7 +10,7 @@ namespace battleship{
class Engineer : public Vehicle{
public:
Engineer(Player*, int, vb01::Vector3, vb01::Quaternion);
Engineer(Player*, int, vb01::Vector3, vb01::Quaternion, Unit::State);
void build(Order);
private:
vb01::s64 lastIncrementTime = 0;
+1 -1
View File
@@ -11,7 +11,7 @@ namespace battleship{
using namespace vb01;
using namespace gameBase;
Extractor::Extractor(Player *player, int id, Vector3 pos, Quaternion rot, int buildStatus, ResourceDeposit *rd) : Structure(player, id, pos, rot, buildStatus){
Extractor::Extractor(Player *player, int id, Vector3 pos, Quaternion rot, int buildStatus, ResourceDeposit *rd, Unit::State state) : Structure(player, id, pos, rot, buildStatus, state){
if(!rd){
vector<ResourceDeposit*> deposits;
+1 -1
View File
@@ -10,7 +10,7 @@ namespace battleship{
class Extractor : public Structure{
public:
Extractor(Player*, int, vb01::Vector3, vb01::Quaternion, int, ResourceDeposit *rd = nullptr);
Extractor(Player*, int, vb01::Vector3, vb01::Quaternion, int, ResourceDeposit *rd = nullptr, Unit::State = Unit::State::STAND_GROUND);
~Extractor();
void update();
void draw();
+1 -1
View File
@@ -13,7 +13,7 @@ namespace battleship{
using namespace std;
using namespace gameBase;
Factory::Factory(Player *player, int id, Vector3 pos, Quaternion rot, int buildStatus) : Structure(player, id, pos, rot, buildStatus){}
Factory::Factory(Player *player, int id, Vector3 pos, Quaternion rot, int buildStatus, Unit::State state) : Structure(player, id, pos, rot, buildStatus, state){}
void Factory::update(){
Structure::update();
+1 -1
View File
@@ -15,7 +15,7 @@ namespace battleship{
class Factory : public Structure{
public:
Factory(Player*, int, vb01::Vector3, vb01::Quaternion, int = 0);
Factory(Player*, int, vb01::Vector3, vb01::Quaternion, int = 0, Unit::State = Unit::State::STAND_GROUND);
~Factory(){}
void update();
int getNumQueueUnitsById(int);
+2
View File
@@ -55,6 +55,7 @@ namespace battleship{
SOL_LUA_STATE.new_usertype<Unit>(
"Unit", sol::constructors<Unit(Player*, int, Vector3, Quaternion)>(),
"setState", &Unit::setState,
"getOrder", &Unit::getOrder,
"getNumOrders", &Unit::getNumOrders,
"getPos", &GameObject::getPos,
@@ -82,6 +83,7 @@ namespace battleship{
SOL_LUA_STATE.new_usertype<Player>(
"Player", sol::constructors<Player(int, int, int, Vector3, bool, Vector3, string)>(),
"getSelectedUnits", &Player::getSelectedUnits,
"addUnit", &Player::addUnit,
"getUnit", &Player::getUnit,
"getNumUnits", &Player::getNumUnits,
+2
View File
@@ -19,6 +19,8 @@ namespace battleship{
using namespace gameBase;
using namespace configData;
GameObject::GameObject(Type t, int i, Player *pl, vb01::Vector3 vec, vb01::Quaternion quat) : type(t), id(i), player(pl), pos(vec), rot(quat){}
void GameObject::reinit(){
placeAt(pos);
orientAt(rot);
+1 -1
View File
@@ -18,7 +18,7 @@ namespace battleship{
public:
enum class Type{UNIT, PROJECTILE, RESOURCE_DEPOSIT};
GameObject(Type t, int i, Player *pl, vb01::Vector3 vec, vb01::Quaternion quat) : type(t), id(i), player(pl), pos(vec), rot(quat){}
GameObject(Type, int, Player*, vb01::Vector3, vb01::Quaternion);
~GameObject(){}
virtual void reinit();
virtual void update();
+6 -6
View File
@@ -27,21 +27,21 @@ namespace battleship{
case UnitClass::FORT:
case UnitClass::LAND_FACTORY:
case UnitClass::NAVAL_FACTORY:
return new Factory(player, id, pos, rot, buildStatus);
return new Factory(player, id, pos, rot, buildStatus, Unit::State::STAND_GROUND);
case UnitClass::POINT_DEFENSE:
return new PointDefense(player, id, pos, rot, buildStatus);
return new PointDefense(player, id, pos, rot, buildStatus, Unit::State::STAND_GROUND);
case UnitClass::EXTRACTOR:
return new Extractor(player, id, pos, rot, buildStatus);
case UnitClass::MARKET:
case UnitClass::LAB:
case UnitClass::REFINERY:
return new Structure(player, id, pos, rot, buildStatus);
return new Structure(player, id, pos, rot, buildStatus, Unit::State::STAND_GROUND);
case UnitClass::ENGINEER:
return new Engineer(player, id, pos, rot);
return new Engineer(player, id, pos, rot, Unit::State::STAND_GROUND);
case UnitClass::RESOURCE_ROVER:
return new ResourceRover(player, id, pos, rot);
return new ResourceRover(player, id, pos, rot, Unit::State::STAND_GROUND);
default:
return new Vehicle(player, id, pos, rot);
return new Vehicle(player, id, pos, rot, Unit::State::STAND_GROUND);
}
}
+15
View File
@@ -0,0 +1,15 @@
#ifndef MAP_LISTBOX_H
#define MAP_LISTBOX_H
#include <listbox.h>
namespace battleship{
class MapListbox : public vb01Gui::Listbox{
public:
MapListbox(vb01::Vector2, vb01::Vector2, std::vector<std::string>&, int, std::string, bool);
private:
void onClose();
};
}
#endif
+1 -1
View File
@@ -3,7 +3,7 @@
namespace battleship{
using namespace vb01;
PointDefense::PointDefense(Player *player, int id, Vector3 pos, Quaternion rot, int buildStatus) : Structure(player, id, pos, rot, buildStatus){
PointDefense::PointDefense(Player *player, int id, Vector3 pos, Quaternion rot, int buildStatus, Unit::State state) : Structure(player, id, pos, rot, buildStatus, state){
turretDir = dirVec;
}
+1 -1
View File
@@ -6,7 +6,7 @@
namespace battleship{
class PointDefense : public Structure{
public:
PointDefense(Player*, int, vb01::Vector3, vb01::Quaternion, int);
PointDefense(Player*, int, vb01::Vector3, vb01::Quaternion, int, Unit::State);
private:
vb01::Vector3 turretDir;
+1 -1
View File
@@ -13,7 +13,7 @@ namespace battleship{
using namespace vb01;
using namespace gameBase;
ResourceRover::ResourceRover(Player *player, int id, Vector3 pos, Quaternion rot) : Vehicle(player, id, pos, rot) {
ResourceRover::ResourceRover(Player *player, int id, Vector3 pos, Quaternion rot, Unit::State state) : Vehicle(player, id, pos, rot, state) {
sol::table unitTable = generateView()["units"][id + 1];
capacity = unitTable["capacity"];
loadSpeed = unitTable["loadSpeed"];
+1 -1
View File
@@ -11,7 +11,7 @@ namespace battleship{
class ResourceRover : public Vehicle{
public:
ResourceRover(Player*, int, vb01::Vector3, vb01::Quaternion);
ResourceRover(Player*, int, vb01::Vector3, vb01::Quaternion, Unit::State = Unit::State::STAND_GROUND);
~ResourceRover();
void update();
private:
+1 -1
View File
@@ -10,7 +10,7 @@ using namespace vb01;
using namespace std;
namespace battleship{
Structure::Structure(Player *player, int id, Vector3 pos, Quaternion rot, int bldSt) : buildStatus(bldSt), Unit(player, id, pos, rot){
Structure::Structure(Player *player, int id, Vector3 pos, Quaternion rot, int bldSt, Unit::State state) : Unit(player, id, pos, rot, state), buildStatus(bldSt){
Vector2 size = Vector2(lenHpBar, 10);
buildStatusBackground = Unit::createBar(Vector2::VEC_ZERO, size, Vector4(0, 0, 0, 1));
buildStatusForeground = Unit::createBar(Vector2::VEC_ZERO, size, Vector4(0, 0, 1, 1));
+1 -1
View File
@@ -10,7 +10,7 @@ namespace vb01{
namespace battleship{
class Structure : public Unit{
public:
Structure(Player*, int, vb01::Vector3, vb01::Quaternion, int = 0);
Structure(Player*, int, vb01::Vector3, vb01::Quaternion, int = 0, Unit::State = Unit::State::STAND_GROUND);
~Structure();
virtual void update();
inline int getBuildStatus(){return buildStatus;}
+22 -3
View File
@@ -95,9 +95,7 @@ namespace battleship{
lastFireTime = getTime();
}
Unit::Unit(Player *player, int id, Vector3 pos, Quaternion rot) : GameObject(GameObject::Type::UNIT, id, player, pos, rot){
this->id = id;
this->player = player;
Unit::Unit(Player *player, int id, Vector3 pos, Quaternion rot, State st) : GameObject(GameObject::Type::UNIT, id, player, pos, rot), state(st){
selectable = true;
initProperties();
@@ -295,12 +293,33 @@ namespace battleship{
}
}
void Unit::targetUnitsAutomatically(){
vector<Player*> players = Game::getSingleton()->getPlayers();
vector<Unit*> units;
for(Player *pl : players)
if(!(pl == player || pl->getTeam() == player->getTeam())){
vector<Unit*> un = pl->getUnits();
units.insert(units.end(), un.begin(), un.end());
}
if(orders.empty())
for(Unit *unit : units)
if(unit->getPos().getDistanceFrom(pos) < lineOfSight){
setOrder(Order(Order::TYPE::ATTACK, vector<Order::Target>{Order::Target(unit)}, Vector3::VEC_ZERO, -1, false));
break;
}
}
void Unit::update() {
GameObject::update();
ActiveGameState *activeState = (ActiveGameState*)GameManager::getSingleton()->getStateManager()->getAppStateByType(AppStateType::ACTIVE_STATE);
Player *mainPlayer = (activeState ? activeState->getPlayer() : nullptr);
if(state != State::HOLD_FIRE)
targetUnitsAutomatically();
vector<Player*> selectingPlayers = getSelectingPlayers();
bool mainPlayerSelecting = (find(selectingPlayers.begin(), selectingPlayers.end(), mainPlayer) != selectingPlayers.end());
bool mainPlayerOwner = (player == mainPlayer);
+8 -3
View File
@@ -46,11 +46,12 @@ namespace battleship{
TYPE type;
int lineId = -1;
bool playerAssigned = true;
vb01::Vector3 direction;
std::vector<Target> targets;
Order(){}
Order(TYPE t, std::vector<Target> targ, vb01::Vector3 dir, int lid = -1) : type(t), lineId(lid), targets(targ), direction(dir){}
Order(TYPE t, std::vector<Target> targ, vb01::Vector3 dir, int lid = -1, bool pa = true) : type(t), playerAssigned(pa), lineId(lid), targets(targ), direction(dir){}
};
enum class MoveDir {LEFT, UP, FORW};
@@ -116,8 +117,9 @@ namespace battleship{
};
enum class Armor {CAST, COMBINED, MECHANIC, SHELL, STEEL};
enum class State {CHASE, STAND_GROUND, HOLD_FIRE};
Unit(Player*, int, vb01::Vector3, vb01::Quaternion);
Unit(Player*, int, vb01::Vector3, vb01::Quaternion, State = State::STAND_GROUND);
virtual ~Unit();
virtual void update();
virtual void halt();
@@ -127,6 +129,7 @@ namespace battleship{
std::vector<Projectile*> getProjectiles();
virtual void addOrder(Order);
bool canGarrison(Vehicle*);
inline void setState(State s){state = s;}
inline Engineer* toEngineer(){return (Engineer*)this;}
inline Structure* toStructure(){return (Structure*)this;}
inline Factory* toFactory(){return (Factory*)this;}
@@ -162,15 +165,17 @@ namespace battleship{
UnitClass unitClass;
UnitType type;
std::vector<Order> orders;
int health, maxHealth, id, playerId, lenHpBar = 200;
int health, maxHealth, playerId, lenHpBar = 200;
s64 orderLineDispTime = 0, lastFireTime = 0;
float lineOfSight;
std::vector<GarrisonSlot> garrisonSlots;
std::vector<Armor> armorTypes;
std::vector<Weapon*> weapons;
State state = State::STAND_GROUND;
std::vector<Player*> getSelectingPlayers();
void removeOrder(int);
virtual void targetUnitsAutomatically();
virtual void reinit();
virtual void initProperties();
virtual void destroySound();
+8 -2
View File
@@ -17,7 +17,7 @@ using namespace vb01;
using namespace std;
namespace battleship{
Vehicle::Vehicle(Player *player, int id, Vector3 pos, Quaternion rot) : Unit(player, id, pos, rot){
Vehicle::Vehicle(Player *player, int id, Vector3 pos, Quaternion rot, Unit::State state) : Unit(player, id, pos, rot, state){
initProperties();
debugMat = new Material(Root::getSingleton()->getLibPath() + "texture");
@@ -290,7 +290,7 @@ namespace battleship{
Unit::attack(order);
int currNumOrders = orders.size();
if(prevNumOrders != currNumOrders) return;
if(weapons.empty() || prevNumOrders != currNumOrders) return;
Order::Target target = order.targets[0];
Vector3 targVec = (target.unit ? target.unit->getPos() : target.pos) - pos;
@@ -298,10 +298,16 @@ namespace battleship{
Weapon *weapon = weapons[0];
float minDist = weapon->getMaxRange();
if(order.playerAssigned || (!order.playerAssigned && state == Unit::State::CHASE)){
if(distToTarg > minDist)
navigateToTarget(.5 * Map::getSingleton()->getCellSize().x);
else
pursuingTarget = false;
}
else if(!order.playerAssigned && state == Unit::State::STAND_GROUND && distToTarg > minDist){
removeOrder(0);
return;
}
float angleToTarg = targVec.norm().getAngleBetween(dirVec);
+1 -1
View File
@@ -10,7 +10,7 @@ namespace vb01{
namespace battleship{
class Vehicle : public Unit{
public:
Vehicle(Player*, int, vb01::Vector3, vb01::Quaternion);
Vehicle(Player*, int, vb01::Vector3, vb01::Quaternion, Unit::State);
~Vehicle();
virtual void update();
void move(Order);