Files
Ascent-of-Man/unit.h
T
2026-11-08 17:06:47 +01:00

69 lines
1.7 KiB
C++

#ifndef UNIT_H
#define UNIT_H
#include <QString>
#include <QVector3D>
#include <vector>
#include <utility>
#include "unitconfig.h"
#include "terrain.h"
#include "matrix2d.h"
enum class UnitState {
Idle,
Moving,
Attacking,
Building
};
class Unit {
public:
Unit(int uId, int pId, const UnitConfig &cfg, int startX, int startY, float groundZ);
int id;
int playerId;
UnitConfig config;
int tileX;
int tileY;
QVector3D worldPos;
float health;
float maxHealth;
int buildCharges;
UnitState state;
// Movement Path
std::vector<std::pair<int, int>> path;
size_t pathIndex;
float moveProgress; // 0.0 to 1.0 between hexes
int targetTileX;
int targetTileY;
// Attack cooldown / flash
float attackFlashTimer;
// Building State
float buildProgress; // 0.0 to 1.0
float buildDuration;
QString buildingImprovementId;
void update(float deltaTime, float tickDuration, float simSpeedMultiplier,
Matrix2D<TerrainPoint> *mapPoints, int numPoints05);
void setPath(const std::vector<std::pair<int, int>> &newPath);
void stopMovement();
void startBuilding(const QString &impId, float duration);
void cancelBuilding();
bool isBuilding() const { return state == UnitState::Building; }
bool canAttack(const Unit &other) const;
void performAttack(Unit &target);
void takeDamage(float damage);
bool isDead() const { return health <= 0.001f; }
bool isNaval() const { return config.isNaval(); }
bool isLand() const { return config.isLand(); }
static float getTerrainHeight(float worldX, float worldY, Matrix2D<TerrainPoint> *mapPoints, int numPoints05);
};
#endif // UNIT_H