feat: add upgrade tower (non gui)

This commit is contained in:
2021-11-05 18:54:21 +01:00
parent 42f599c800
commit 56ec9e7fe2
13 changed files with 73 additions and 7 deletions

View File

@@ -109,7 +109,9 @@ const std::map<std::pair<TowerType, TowerLevel>, TowerStats> TowerConstants = {
};
const TowerStats* getTowerStats(TowerType type, TowerLevel level) {
return &TowerConstants.at({ type, level });
auto it = TowerConstants.find({type, level});
if(it == TowerConstants.end()) return nullptr;
return &it->second;
}
@@ -238,7 +240,7 @@ void MageTower::tick(std::uint64_t delta, World* world) {
bool wasTowerActive = false;
for (MobPtr mob : world->getMobList()) {
if (isMobInRange(mob)) {
mob->addEffect(EffectType::Fire, getLevel().getLevel() * 5, this);
mob->addEffect(EffectType::Fire, getLevel().getLevel() * 3, this);
wasTowerActive = true;
}
}

View File

@@ -202,7 +202,7 @@ bool World::CanPlaceLittleTower(const glm::vec2& worldPos, PlayerID playerID) co
for (int x = -1; x < 2; x++) {
for (int y = -1; y < 2; y++) {
game::TilePtr adjacentTile = getTile(worldPos.x + x, worldPos.y + y);
if (adjacentTile == nullptr || adjacentTile->getType() != game::TileType::Tower || getTower({worldPos.x + x, worldPos.y + y}) != nullptr) {
if (adjacentTile == nullptr || adjacentTile->getType() != game::TileType::Tower || getTower({ worldPos.x + x, worldPos.y + y }) != nullptr) {
return false;
}
}
@@ -214,7 +214,7 @@ bool World::CanPlaceLittleTower(const glm::vec2& worldPos, PlayerID playerID) co
}
bool World::CanPlaceBigTower(const glm::vec2& worldPos, PlayerID playerID) const {
if(!CanPlaceLittleTower(worldPos, playerID)) return false;
if (!CanPlaceLittleTower(worldPos, playerID)) return false;
TilePtr tile = getTile(worldPos.x, worldPos.y);
const Player& player = m_Game->getPlayers()[playerID];
@@ -230,7 +230,7 @@ bool World::CanPlaceBigTower(const glm::vec2& worldPos, PlayerID playerID) const
for (int x = -2; x < 3; x++) {
for (int y = -2; y < 3; y++) {
game::TilePtr adjacentTile = getTile(worldPos.x + x, worldPos.y + y);
if (adjacentTile == nullptr || adjacentTile->getType() != game::TileType::Tower || getTower({worldPos.x + x, worldPos.y + y}) != nullptr) {
if (adjacentTile == nullptr || adjacentTile->getType() != game::TileType::Tower || getTower({ worldPos.x + x, worldPos.y + y }) != nullptr) {
return false;
}
}
@@ -259,7 +259,7 @@ void World::cleanDeadMobs() {
}
}
TowerPtr World::getTower(const glm::vec2& position) const{
TowerPtr World::getTower(const glm::vec2& position) const {
for (TowerPtr tower : m_Towers) {
if (tower->getSize() == TowerSize::Big) {
if (tower->getX() - 2 <= position.x && tower->getX() + 3 >= position.x &&
@@ -276,13 +276,19 @@ TowerPtr World::getTower(const glm::vec2& position) const{
return nullptr;
}
TowerPtr World::getTowerById(TowerID towerID) {
auto it = std::find_if(m_Towers.begin(), m_Towers.end(), [towerID](TowerPtr tower) { return tower->getID() == towerID;});
if(it == m_Towers.end()) return nullptr;
return *it;
}
void World::OnArrowShot(MobPtr target, Tower* shooter) {
bool explosiveArrows = shooter->getLevel().getPath() == TowerPath::Bottom;
if (explosiveArrows) {
// aoe damage
} else {
target->damage(shooter->getStats()->getDamage());
if(target->isDead())
if (target->isDead())
target->setKillTower(shooter);
}
}

View File

@@ -54,5 +54,10 @@ void Client::sendMobs(const std::vector<protocol::MobSend>& mobSends){
m_Connexion.sendPacket(&packet);
}
void Client::upgradeTower(game::TowerID tower, game::TowerLevel level){
protocol::UpgradeTowerPacket packet(tower, level);
m_Connexion.sendPacket(&packet);
}
} // namespace client
} // namespace td

View File

@@ -25,6 +25,12 @@ void WorldClient::HandlePacket(protocol::SpawnMobPacket* packet) {
packet->getMobX(), packet->getMobY(), packet->getMobDirection());
}
void WorldClient::HandlePacket(protocol::UpgradeTowerPacket* packet) {
game::TowerPtr tower = getTowerById(packet->getTowerID());
if(tower == nullptr) return; // this should not happen but who knows ?
tower->upgrade(packet->getTowerLevel().getLevel(), packet->getTowerLevel().getPath());
}
void WorldClient::OnArrowShot(game::MobPtr target, game::Tower* tower) {
World::OnArrowShot(target, tower);
}

View File

@@ -40,6 +40,7 @@ void ServerConnexion::registerHandlers() {
GetDispatcher()->RegisterHandler(protocol::PacketType::Disconnect, this);
GetDispatcher()->RegisterHandler(protocol::PacketType::PlaceTower, this);
GetDispatcher()->RegisterHandler(protocol::PacketType::SendMobs, this);
GetDispatcher()->RegisterHandler(protocol::PacketType::UpgradeTower, this);
}
bool ServerConnexion::updateSocket() {
@@ -173,6 +174,12 @@ void ServerConnexion::HandlePacket(protocol::SendMobsPacket* packet) {
}
}
void ServerConnexion::HandlePacket(protocol::UpgradeTowerPacket* packet){
//TODO: verify the packet
m_Server->broadcastPacket(packet);
}
ServerConnexion::~ServerConnexion() {
if (GetDispatcher() != nullptr)
GetDispatcher()->UnregisterHandler(this);