feat: add tower detection
This commit is contained in:
@@ -32,9 +32,9 @@ enum class TowerType : std::uint8_t {
|
|||||||
TowerCount
|
TowerCount
|
||||||
};
|
};
|
||||||
|
|
||||||
enum class TowerSize : bool {
|
enum class TowerSize : std::uint8_t {
|
||||||
Little = 0, // 3x3
|
Little = 3, // 3x3
|
||||||
Big, // 5x5
|
Big = 5, // 5x5
|
||||||
};
|
};
|
||||||
|
|
||||||
enum class TowerPath : std::uint8_t {
|
enum class TowerPath : std::uint8_t {
|
||||||
|
|||||||
@@ -162,6 +162,8 @@ public:
|
|||||||
bool CanPlaceLittleTower(const glm::vec2& worldPos, PlayerID player) const;
|
bool CanPlaceLittleTower(const glm::vec2& worldPos, PlayerID player) const;
|
||||||
bool CanPlaceBigTower(const glm::vec2& worldPos, PlayerID player) const;
|
bool CanPlaceBigTower(const glm::vec2& worldPos, PlayerID player) const;
|
||||||
|
|
||||||
|
TowerPtr GetTower(const glm::vec2& position); // returns null if no tower is here
|
||||||
|
|
||||||
const std::unordered_map<ChunkCoord, ChunkPtr>& getChunks() const { return m_Chunks; }
|
const std::unordered_map<ChunkCoord, ChunkPtr>& getChunks() const { return m_Chunks; }
|
||||||
|
|
||||||
const Color& getSpawnColor(TeamColor color) const { return m_SpawnColorPalette[(std::size_t)color]; }
|
const Color& getSpawnColor(TeamColor color) const { return m_SpawnColorPalette[(std::size_t)color]; }
|
||||||
|
|||||||
@@ -322,7 +322,7 @@ bool World::saveMap(const std::string& fileName) const {
|
|||||||
void World::tick(std::uint64_t delta) {
|
void World::tick(std::uint64_t delta) {
|
||||||
moveMobs(delta);
|
moveMobs(delta);
|
||||||
tickMobs(delta);
|
tickMobs(delta);
|
||||||
for(TowerPtr tower : m_Towers){
|
for (TowerPtr tower : m_Towers) {
|
||||||
tower->tick(delta, this);
|
tower->tick(delta, this);
|
||||||
}
|
}
|
||||||
cleanDeadMobs();
|
cleanDeadMobs();
|
||||||
@@ -343,7 +343,7 @@ TowerPtr World::placeTowerAt(TowerID id, TowerType type, std::int32_t x, std::in
|
|||||||
}
|
}
|
||||||
|
|
||||||
void World::tickMobs(std::uint64_t delta) {
|
void World::tickMobs(std::uint64_t delta) {
|
||||||
for(MobPtr mob : m_Mobs) {
|
for (MobPtr mob : m_Mobs) {
|
||||||
mob->tick(delta);
|
mob->tick(delta);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -361,7 +361,7 @@ void World::moveMobs(std::uint64_t delta) {
|
|||||||
|
|
||||||
float walkAmount = mobWalkSpeed * ((float)delta / 1000.0f);
|
float walkAmount = mobWalkSpeed * ((float)delta / 1000.0f);
|
||||||
|
|
||||||
if(mob->hasEffect(EffectType::Slowness))
|
if (mob->hasEffect(EffectType::Slowness))
|
||||||
walkAmount *= 0.70;
|
walkAmount *= 0.70;
|
||||||
|
|
||||||
switch (mob->getDirection()) {
|
switch (mob->getDirection()) {
|
||||||
@@ -415,8 +415,8 @@ bool World::CanPlaceLittleTower(const glm::vec2& worldPos, PlayerID playerID) co
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (tile->getType() == game::TileType::Tower) {
|
if (tile->getType() == game::TileType::Tower) {
|
||||||
const TowerTile* towerTile = (const TowerTile*) tile.get();
|
const TowerTile* towerTile = (const TowerTile*)tile.get();
|
||||||
if(towerTile->team_owner != player.getTeamColor())
|
if (towerTile->team_owner != player.getTeamColor())
|
||||||
return false;
|
return false;
|
||||||
for (int x = -1; x < 2; x++) {
|
for (int x = -1; x < 2; x++) {
|
||||||
for (int y = -1; y < 2; y++) {
|
for (int y = -1; y < 2; y++) {
|
||||||
@@ -441,8 +441,8 @@ bool World::CanPlaceBigTower(const glm::vec2& worldPos, PlayerID playerID) const
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (tile->getType() == game::TileType::Tower) {
|
if (tile->getType() == game::TileType::Tower) {
|
||||||
const TowerTile* towerTile = (const TowerTile*) tile.get();
|
const TowerTile* towerTile = (const TowerTile*)tile.get();
|
||||||
if(towerTile->team_owner != player.getTeamColor())
|
if (towerTile->team_owner != player.getTeamColor())
|
||||||
return false;
|
return false;
|
||||||
for (int x = -2; x < 3; x++) {
|
for (int x = -2; x < 3; x++) {
|
||||||
for (int y = -2; y < 3; y++) {
|
for (int y = -2; y < 3; y++) {
|
||||||
@@ -458,20 +458,37 @@ bool World::CanPlaceBigTower(const glm::vec2& worldPos, PlayerID playerID) const
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void World::cleanDeadMobs(){
|
void World::cleanDeadMobs() {
|
||||||
for(std::size_t i = 0; i < m_Mobs.size(); i++){
|
for (std::size_t i = 0; i < m_Mobs.size(); i++) {
|
||||||
MobPtr mob = m_Mobs[i];
|
MobPtr mob = m_Mobs[i];
|
||||||
if(!mob->isAlive()){
|
if (!mob->isAlive()) {
|
||||||
m_Mobs.erase(m_Mobs.begin() + i);
|
m_Mobs.erase(m_Mobs.begin() + i);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void World::OnArrowShot(MobPtr target, Tower* shooter){
|
TowerPtr World::GetTower(const glm::vec2& position) {
|
||||||
|
for (TowerPtr tower : m_Towers) {
|
||||||
|
if (tower->getSize() == TowerSize::Big) {
|
||||||
|
if (tower->getX() - 2 <= position.x && tower->getX() + 3 >= position.x &&
|
||||||
|
tower->getY() - 2 <= position.y && tower->getY() + 3 >= position.y) {
|
||||||
|
return tower;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (tower->getX() - 1 <= position.x && tower->getX() + 2 >= position.x &&
|
||||||
|
tower->getY() - 1 <= position.y && tower->getY() + 2 >= position.y) {
|
||||||
|
return tower;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
void World::OnArrowShot(MobPtr target, Tower* shooter) {
|
||||||
bool explosiveArrows = shooter->getLevel().getPath() == TowerPath::Bottom;
|
bool explosiveArrows = shooter->getLevel().getPath() == TowerPath::Bottom;
|
||||||
if(explosiveArrows){
|
if (explosiveArrows) {
|
||||||
// aoe damage
|
// aoe damage
|
||||||
}else{
|
} else {
|
||||||
target->damage(shooter->getStats()->getDamage());
|
target->damage(shooter->getStats()->getDamage());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user