Compare commits
10 Commits
alpha-0.0.
...
alpha-0.0.
| Author | SHA1 | Date | |
|---|---|---|---|
| 7e91b863da | |||
| 129bb47286 | |||
| e4a9c5f763 | |||
| 78cf2d0f18 | |||
| 00d2b5394f | |||
| 00414abe61 | |||
| cb847d0edd | |||
| 2da0bd9b79 | |||
| cf9633c061 | |||
| 7a6fdc30b6 |
@@ -164,6 +164,7 @@ public:
|
|||||||
ArcherTower(TowerID id, std::uint16_t x, std::uint16_t y, PlayerID builder) : LittleTower(id, getType(), x, y, builder) {}
|
ArcherTower(TowerID id, std::uint16_t x, std::uint16_t y, PlayerID builder) : LittleTower(id, getType(), x, y, builder) {}
|
||||||
|
|
||||||
constexpr static float ExplosionRadius = 1.5f;
|
constexpr static float ExplosionRadius = 1.5f;
|
||||||
|
constexpr static float FireDurationSec = 10.0f;
|
||||||
|
|
||||||
virtual TowerType getType() const { return TowerType::Archer; }
|
virtual TowerType getType() const { return TowerType::Archer; }
|
||||||
virtual void tick(std::uint64_t delta, World* world);
|
virtual void tick(std::uint64_t delta, World* world);
|
||||||
|
|||||||
@@ -120,9 +120,12 @@ class WorldListener {
|
|||||||
public:
|
public:
|
||||||
WorldListener() {}
|
WorldListener() {}
|
||||||
|
|
||||||
|
virtual void OnTowerAdd(TowerPtr tower) {}
|
||||||
|
virtual void OnTowerRemove(TowerPtr tower) {}
|
||||||
|
|
||||||
virtual void OnArcherTowerShot(MobPtr target, ArcherTower* shooter) {}
|
virtual void OnArcherTowerShot(MobPtr target, ArcherTower* shooter) {}
|
||||||
|
|
||||||
virtual void OnArrowShot(MobPtr target, Tower* shooter){}
|
virtual void OnArrowShot(MobPtr target, bool fire, Tower* shooter) {}
|
||||||
virtual void OnExplosion(utils::shape::Circle explosion, float centerDamage, Tower* shooter) {}
|
virtual void OnExplosion(utils::shape::Circle explosion, float centerDamage, Tower* shooter) {}
|
||||||
|
|
||||||
virtual void OnMobDamage(MobPtr target, float damage, Tower* damager) {}
|
virtual void OnMobDamage(MobPtr target, float damage, Tower* damager) {}
|
||||||
@@ -165,6 +168,7 @@ public:
|
|||||||
void spawnMobAt(MobID id, MobType type, std::uint8_t level, PlayerID sender, float x, float y, Direction dir);
|
void spawnMobAt(MobID id, MobType type, std::uint8_t level, PlayerID sender, float x, float y, Direction dir);
|
||||||
|
|
||||||
TowerPtr placeTowerAt(TowerID id, TowerType type, std::int32_t x, std::int32_t y, PlayerID builder);
|
TowerPtr placeTowerAt(TowerID id, TowerType type, std::int32_t x, std::int32_t y, PlayerID builder);
|
||||||
|
TowerPtr removeTower(TowerID id);
|
||||||
|
|
||||||
TilePtr getTile(std::int32_t x, std::int32_t y) const;
|
TilePtr getTile(std::int32_t x, std::int32_t y) const;
|
||||||
|
|
||||||
@@ -211,7 +215,7 @@ public:
|
|||||||
|
|
||||||
virtual void OnArcherTowerShot(MobPtr target, ArcherTower* shooter);
|
virtual void OnArcherTowerShot(MobPtr target, ArcherTower* shooter);
|
||||||
|
|
||||||
virtual void OnArrowShot(MobPtr target, Tower* shooter);
|
virtual void OnArrowShot(MobPtr target, bool fire, Tower* shooter);
|
||||||
virtual void OnExplosion(utils::shape::Circle explosion, float centerDamage, Tower* shooter);
|
virtual void OnExplosion(utils::shape::Circle explosion, float centerDamage, Tower* shooter);
|
||||||
|
|
||||||
virtual void OnMobDamage(MobPtr target, float damage, Tower* source);
|
virtual void OnMobDamage(MobPtr target, float damage, Tower* source);
|
||||||
|
|||||||
@@ -44,6 +44,7 @@ public:
|
|||||||
void sendMobs(const std::vector<protocol::MobSend>& mobSends);
|
void sendMobs(const std::vector<protocol::MobSend>& mobSends);
|
||||||
void placeTower(game::TowerType type, const glm::vec2& position);
|
void placeTower(game::TowerType type, const glm::vec2& position);
|
||||||
void upgradeTower(game::TowerID tower, game::TowerLevel level);
|
void upgradeTower(game::TowerID tower, game::TowerLevel level);
|
||||||
|
void removeTower(game::TowerID tower);
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace client
|
} // namespace client
|
||||||
|
|||||||
@@ -37,6 +37,7 @@ public:
|
|||||||
Client* getClient() const { return m_Client; }
|
Client* getClient() const { return m_Client; }
|
||||||
|
|
||||||
render::Renderer* getRenderer() const { return m_Renderer; }
|
render::Renderer* getRenderer() const { return m_Renderer; }
|
||||||
|
WorldClient& getWorld() { return m_WorldClient; }
|
||||||
|
|
||||||
virtual void HandlePacket(const protocol::ConnexionInfoPacket* packet);
|
virtual void HandlePacket(const protocol::ConnexionInfoPacket* packet);
|
||||||
virtual void HandlePacket(const protocol::PlayerJoinPacket* packet);
|
virtual void HandlePacket(const protocol::PlayerJoinPacket* packet);
|
||||||
@@ -48,7 +49,7 @@ public:
|
|||||||
virtual void HandlePacket(const protocol::UpdateMoneyPacket* packet);
|
virtual void HandlePacket(const protocol::UpdateMoneyPacket* packet);
|
||||||
virtual void HandlePacket(const protocol::DisconnectPacket* packet);
|
virtual void HandlePacket(const protocol::DisconnectPacket* packet);
|
||||||
virtual void HandlePacket(const protocol::WorldDataPacket* packet);
|
virtual void HandlePacket(const protocol::WorldDataPacket* packet);
|
||||||
virtual void HandlePacket(const protocol::WorldAddTowerPacket* packet);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace client
|
} // namespace client
|
||||||
|
|||||||
@@ -14,12 +14,13 @@ private:
|
|||||||
public:
|
public:
|
||||||
WorldClient(ClientGame* game);
|
WorldClient(ClientGame* game);
|
||||||
|
|
||||||
virtual void HandlePacket(const protocol::WorldBeginDataPacket* packet) override;
|
virtual void HandlePacket(const protocol::WorldBeginDataPacket* packet);
|
||||||
virtual void HandlePacket(const protocol::WorldDataPacket* packet) override;
|
virtual void HandlePacket(const protocol::WorldDataPacket* packet);
|
||||||
virtual void HandlePacket(const protocol::SpawnMobPacket* packet) override;
|
virtual void HandlePacket(const protocol::SpawnMobPacket* packet);
|
||||||
virtual void HandlePacket(const protocol::UpgradeTowerPacket* packet) override;
|
virtual void HandlePacket(const protocol::UpgradeTowerPacket* packet);
|
||||||
|
virtual void HandlePacket(const protocol::WorldAddTowerPacket* packet);
|
||||||
|
virtual void HandlePacket(const protocol::RemoveTowerPacket* packet);
|
||||||
|
|
||||||
virtual void OnArrowShot(game::MobPtr target, game::Tower* shooter) override;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace client
|
} // namespace client
|
||||||
|
|||||||
@@ -40,6 +40,7 @@ public:
|
|||||||
virtual void HandlePacket(const protocol::PlaceTowerPacket* packet);
|
virtual void HandlePacket(const protocol::PlaceTowerPacket* packet);
|
||||||
virtual void HandlePacket(const protocol::SendMobsPacket* packet);
|
virtual void HandlePacket(const protocol::SendMobsPacket* packet);
|
||||||
virtual void HandlePacket(const protocol::UpgradeTowerPacket* packet);
|
virtual void HandlePacket(const protocol::UpgradeTowerPacket* packet);
|
||||||
|
virtual void HandlePacket(const protocol::RemoveTowerPacket* packet);
|
||||||
|
|
||||||
std::uint8_t getID() const { return m_ID; }
|
std::uint8_t getID() const { return m_ID; }
|
||||||
const game::Player* getPlayer() const { return m_Player; }
|
const game::Player* getPlayer() const { return m_Player; }
|
||||||
|
|||||||
@@ -19,7 +19,6 @@ public:
|
|||||||
void spawnMobs(game::MobType type, std::uint8_t level, game::PlayerID sender, std::uint8_t count);
|
void spawnMobs(game::MobType type, std::uint8_t level, game::PlayerID sender, std::uint8_t count);
|
||||||
game::TowerPtr placeTowerAt(game::TowerType type, std::int32_t x, std::int32_t y, game::PlayerID builder);
|
game::TowerPtr placeTowerAt(game::TowerType type, std::int32_t x, std::int32_t y, game::PlayerID builder);
|
||||||
|
|
||||||
virtual void OnArrowShot(game::MobPtr target, game::Tower* shooter) override;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace server
|
} // namespace server
|
||||||
|
|||||||
4465
include/misc/Backward.hpp
Normal file
4465
include/misc/Backward.hpp
Normal file
File diff suppressed because it is too large
Load Diff
@@ -35,7 +35,7 @@ public:
|
|||||||
virtual void HandlePacket(const SpawnMobPacket* packet) {}
|
virtual void HandlePacket(const SpawnMobPacket* packet) {}
|
||||||
virtual void HandlePacket(const PlaceTowerPacket* packet) {}
|
virtual void HandlePacket(const PlaceTowerPacket* packet) {}
|
||||||
virtual void HandlePacket(const WorldAddTowerPacket* packet) {}
|
virtual void HandlePacket(const WorldAddTowerPacket* packet) {}
|
||||||
virtual void HandlePacket(const WorldRemoveTowerPacket* packet) {}
|
virtual void HandlePacket(const RemoveTowerPacket* packet) {}
|
||||||
virtual void HandlePacket(const SendMobsPacket* packet) {}
|
virtual void HandlePacket(const SendMobsPacket* packet) {}
|
||||||
virtual void HandlePacket(const UpgradeTowerPacket* packet) {}
|
virtual void HandlePacket(const UpgradeTowerPacket* packet) {}
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -33,12 +33,12 @@ enum class PacketType : std::uint8_t {
|
|||||||
UpdatePlayerTeam,
|
UpdatePlayerTeam,
|
||||||
ServerTps,
|
ServerTps,
|
||||||
WorldAddTower,
|
WorldAddTower,
|
||||||
WorldRemoveTower,
|
|
||||||
|
|
||||||
// client <--> server
|
// client <--> server
|
||||||
KeepAlive,
|
KeepAlive,
|
||||||
Disconnect,
|
Disconnect,
|
||||||
UpgradeTower,
|
UpgradeTower,
|
||||||
|
RemoveTower,
|
||||||
};
|
};
|
||||||
|
|
||||||
struct WorldHeader {
|
struct WorldHeader {
|
||||||
@@ -477,13 +477,13 @@ public:
|
|||||||
virtual PacketType getType() const { return PacketType::WorldAddTower; }
|
virtual PacketType getType() const { return PacketType::WorldAddTower; }
|
||||||
};
|
};
|
||||||
|
|
||||||
class WorldRemoveTowerPacket : public Packet {
|
class RemoveTowerPacket : public Packet {
|
||||||
private:
|
private:
|
||||||
game::TowerID m_TowerID;
|
game::TowerID m_TowerID;
|
||||||
public:
|
public:
|
||||||
WorldRemoveTowerPacket() {}
|
RemoveTowerPacket() {}
|
||||||
WorldRemoveTowerPacket(game::TowerID id) : m_TowerID(id) {}
|
RemoveTowerPacket(game::TowerID id) : m_TowerID(id) {}
|
||||||
virtual ~WorldRemoveTowerPacket() {}
|
virtual ~RemoveTowerPacket() {}
|
||||||
|
|
||||||
virtual DataBuffer Serialize() const;
|
virtual DataBuffer Serialize() const;
|
||||||
virtual void Deserialize(DataBuffer& data);
|
virtual void Deserialize(DataBuffer& data);
|
||||||
@@ -491,7 +491,7 @@ public:
|
|||||||
|
|
||||||
game::TowerID getTowerID() const { return m_TowerID; }
|
game::TowerID getTowerID() const { return m_TowerID; }
|
||||||
|
|
||||||
virtual PacketType getType() const { return PacketType::WorldRemoveTower; }
|
virtual PacketType getType() const { return PacketType::RemoveTower; }
|
||||||
};
|
};
|
||||||
|
|
||||||
class UpgradeTowerPacket : public Packet {
|
class UpgradeTowerPacket : public Packet {
|
||||||
|
|||||||
@@ -12,15 +12,19 @@ namespace render {
|
|||||||
class VertexCache {
|
class VertexCache {
|
||||||
|
|
||||||
typedef std::vector<float> Vector;
|
typedef std::vector<float> Vector;
|
||||||
typedef std::pair<Vector::iterator, Vector::iterator> ElementsIndex;
|
|
||||||
typedef std::pair<ElementsIndex, ElementsIndex> DataIndex;
|
struct DataIndex {
|
||||||
|
Vector position;
|
||||||
|
Vector color;
|
||||||
|
};
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Vector m_Positions;
|
std::size_t m_VertexCount;
|
||||||
Vector m_Colors;
|
|
||||||
std::unordered_map<std::uint64_t, DataIndex> m_Indexes;
|
std::unordered_map<std::uint64_t, DataIndex> m_Indexes;
|
||||||
std::unique_ptr<GL::VertexArray> m_VertexArray;
|
std::unique_ptr<GL::VertexArray> m_VertexArray;
|
||||||
public:
|
public:
|
||||||
|
VertexCache() : m_VertexCount(0) {}
|
||||||
|
|
||||||
void addData(std::uint64_t index, std::vector<float> positions, std::vector<float> colors);
|
void addData(std::uint64_t index, std::vector<float> positions, std::vector<float> colors);
|
||||||
void removeData(std::uint64_t index);
|
void removeData(std::uint64_t index);
|
||||||
void clear();
|
void clear();
|
||||||
|
|||||||
@@ -23,7 +23,7 @@ class ClientGame;
|
|||||||
|
|
||||||
namespace render {
|
namespace render {
|
||||||
|
|
||||||
class WorldRenderer {
|
class WorldRenderer : public game::WorldListener {
|
||||||
private:
|
private:
|
||||||
client::ClientGame* m_Client;
|
client::ClientGame* m_Client;
|
||||||
Renderer* m_Renderer;
|
Renderer* m_Renderer;
|
||||||
@@ -46,9 +46,6 @@ public:
|
|||||||
|
|
||||||
void loadModels();
|
void loadModels();
|
||||||
|
|
||||||
void addTower(game::TowerPtr tower);
|
|
||||||
void removeTower(game::TowerPtr tower);
|
|
||||||
|
|
||||||
static ImVec4 getImGuiTeamColor(game::TeamColor color);
|
static ImVec4 getImGuiTeamColor(game::TeamColor color);
|
||||||
|
|
||||||
void update();
|
void update();
|
||||||
@@ -58,6 +55,11 @@ public:
|
|||||||
|
|
||||||
void moveCam(float relativeX, float relativeY, float aspectRatio);
|
void moveCam(float relativeX, float relativeY, float aspectRatio);
|
||||||
void changeZoom(float zoom);
|
void changeZoom(float zoom);
|
||||||
|
|
||||||
|
// WorldListener
|
||||||
|
|
||||||
|
virtual void OnTowerAdd(game::TowerPtr tower);
|
||||||
|
virtual void OnTowerRemove(game::TowerPtr tower);
|
||||||
private:
|
private:
|
||||||
void click();
|
void click();
|
||||||
void renderWorld() const;
|
void renderWorld() const;
|
||||||
@@ -69,6 +71,7 @@ private:
|
|||||||
void renderMobTooltip() const;
|
void renderMobTooltip() const;
|
||||||
void detectClick();
|
void detectClick();
|
||||||
void detectMobHovering() const;
|
void detectMobHovering() const;
|
||||||
|
void removeTower();
|
||||||
glm::vec2 getCursorWorldPos() const;
|
glm::vec2 getCursorWorldPos() const;
|
||||||
glm::vec2 getClickWorldPos() const;
|
glm::vec2 getClickWorldPos() const;
|
||||||
|
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
|
|
||||||
#include <ctime>
|
#include <ctime>
|
||||||
|
|
||||||
#define TD_VERSION "alpha-0.0.3"
|
#define TD_VERSION "alpha-0.0.4"
|
||||||
|
|
||||||
namespace td {
|
namespace td {
|
||||||
namespace utils {
|
namespace utils {
|
||||||
|
|||||||
@@ -6,14 +6,24 @@
|
|||||||
// Description : Hello World in C++, Ansi-style
|
// Description : Hello World in C++, Ansi-style
|
||||||
//============================================================================
|
//============================================================================
|
||||||
|
|
||||||
|
#if !defined(NDEBUG) && !defined(_WIN32)
|
||||||
|
#define BACKWARD_HAS_UNWIND 1
|
||||||
|
#define BACKWARD_HAS_DW 1
|
||||||
|
#endif
|
||||||
|
|
||||||
#include "window/Display.h"
|
#include "window/Display.h"
|
||||||
#include "updater/Updater.h"
|
#include "updater/Updater.h"
|
||||||
|
#include "misc/Backward.hpp"
|
||||||
|
|
||||||
#ifdef __ANDROID__
|
#ifdef __ANDROID__
|
||||||
extern "C"
|
extern "C"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
int main(int argc, const char* args[]) {
|
int main(int argc, const char* args[]) {
|
||||||
|
// setup signal handling
|
||||||
|
backward::SignalHandling sh;
|
||||||
|
|
||||||
|
// remove the outdated binary
|
||||||
td::utils::Updater::removeOldFile();
|
td::utils::Updater::removeOldFile();
|
||||||
|
|
||||||
Display::create();
|
Display::create();
|
||||||
|
|||||||
@@ -122,6 +122,17 @@ TowerPtr World::placeTowerAt(TowerID id, TowerType type, std::int32_t x, std::in
|
|||||||
return tower;
|
return tower;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TowerPtr World::removeTower(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;
|
||||||
|
|
||||||
|
TowerPtr tower = *it;
|
||||||
|
|
||||||
|
m_Towers.erase(it);
|
||||||
|
|
||||||
|
return tower;
|
||||||
|
}
|
||||||
|
|
||||||
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);
|
||||||
@@ -399,15 +410,20 @@ TowerPtr World::getTowerById(TowerID towerID) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void World::OnArcherTowerShot(MobPtr target, ArcherTower* shooter) {
|
void World::OnArcherTowerShot(MobPtr target, ArcherTower* shooter) {
|
||||||
bool explosiveArrows = shooter->getLevel().getPath() == TowerPath::Bottom;
|
bool fireArrows = shooter->getLevel().getPath() == TowerPath::Bottom;
|
||||||
notifyListeners(&WorldListener::OnArrowShot, target, shooter);
|
bool explosiveArrows = shooter->getLevel().getLevel() == 4 && fireArrows;
|
||||||
|
|
||||||
|
notifyListeners(&WorldListener::OnArrowShot, target, fireArrows, shooter);
|
||||||
if (explosiveArrows) {
|
if (explosiveArrows) {
|
||||||
notifyListeners(&WorldListener::OnExplosion, utils::shape::Circle{ target->getCenterX(), target->getCenterY(), ArcherTower::ExplosionRadius }, shooter->getStats()->getDamage(), shooter);
|
notifyListeners(&WorldListener::OnExplosion, utils::shape::Circle{ target->getCenterX(), target->getCenterY(), ArcherTower::ExplosionRadius }, shooter->getStats()->getDamage(), shooter);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void World::OnArrowShot(MobPtr target, Tower* shooter) {
|
void World::OnArrowShot(MobPtr target, bool fireArrow, Tower* shooter) {
|
||||||
notifyListeners(&WorldListener::OnMobDamage, target, shooter->getStats()->getDamage(), shooter);
|
notifyListeners(&WorldListener::OnMobDamage, target, shooter->getStats()->getDamage(), shooter);
|
||||||
|
if (fireArrow) {
|
||||||
|
target->addEffect(EffectType::Fire, ArcherTower::FireDurationSec, shooter);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void World::OnExplosion(utils::shape::Circle explosion, float centerDamage, Tower* shooter) {
|
void World::OnExplosion(utils::shape::Circle explosion, float centerDamage, Tower* shooter) {
|
||||||
|
|||||||
@@ -64,5 +64,10 @@ void Client::upgradeTower(game::TowerID tower, game::TowerLevel level) {
|
|||||||
m_Connexion.sendPacket(&packet);
|
m_Connexion.sendPacket(&packet);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Client::removeTower(game::TowerID tower) {
|
||||||
|
protocol::RemoveTowerPacket packet(tower);
|
||||||
|
m_Connexion.sendPacket(&packet);
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace client
|
} // namespace client
|
||||||
} // namespace td
|
} // namespace td
|
||||||
|
|||||||
@@ -1,10 +1,7 @@
|
|||||||
#include "game/client/ClientGame.h"
|
#include "game/client/ClientGame.h"
|
||||||
#include "protocol/PacketDispatcher.h"
|
#include "protocol/PacketDispatcher.h"
|
||||||
//#include "game/Team.h"
|
|
||||||
#include "game/client/Client.h"
|
#include "game/client/Client.h"
|
||||||
|
|
||||||
#include <iostream>
|
|
||||||
|
|
||||||
namespace td {
|
namespace td {
|
||||||
namespace client {
|
namespace client {
|
||||||
|
|
||||||
@@ -21,7 +18,6 @@ m_WorldRenderer(&m_WorldClient, this) {
|
|||||||
GetDispatcher()->RegisterHandler(protocol::PacketType::UpdateMoney, this);
|
GetDispatcher()->RegisterHandler(protocol::PacketType::UpdateMoney, this);
|
||||||
GetDispatcher()->RegisterHandler(protocol::PacketType::Disconnect, this);
|
GetDispatcher()->RegisterHandler(protocol::PacketType::Disconnect, this);
|
||||||
GetDispatcher()->RegisterHandler(protocol::PacketType::WorldData, this);
|
GetDispatcher()->RegisterHandler(protocol::PacketType::WorldData, this);
|
||||||
GetDispatcher()->RegisterHandler(protocol::PacketType::WorldAddTower, this);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ClientGame::~ClientGame() {
|
ClientGame::~ClientGame() {
|
||||||
@@ -112,9 +108,5 @@ void ClientGame::renderWorld() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void ClientGame::HandlePacket(const protocol::WorldAddTowerPacket* packet) {
|
|
||||||
m_WorldRenderer.addTower(m_WorldClient.placeTowerAt(packet->getTowerID(), packet->getTowerType(), packet->getTowerX(), packet->getTowerY(), packet->getBuilder()));
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace client
|
} // namespace client
|
||||||
} // namespace td
|
} // namespace td
|
||||||
|
|||||||
@@ -7,10 +7,12 @@ namespace td {
|
|||||||
namespace client {
|
namespace client {
|
||||||
|
|
||||||
WorldClient::WorldClient(ClientGame* game) : game::World(game), protocol::PacketHandler(game->GetDispatcher()), m_Game(game) {
|
WorldClient::WorldClient(ClientGame* game) : game::World(game), protocol::PacketHandler(game->GetDispatcher()), m_Game(game) {
|
||||||
|
GetDispatcher()->RegisterHandler(protocol::PacketType::WorldAddTower, this);
|
||||||
GetDispatcher()->RegisterHandler(protocol::PacketType::WorldBeginData, this);
|
GetDispatcher()->RegisterHandler(protocol::PacketType::WorldBeginData, this);
|
||||||
GetDispatcher()->RegisterHandler(protocol::PacketType::WorldData, this);
|
GetDispatcher()->RegisterHandler(protocol::PacketType::WorldData, this);
|
||||||
GetDispatcher()->RegisterHandler(protocol::PacketType::SpawnMob, this);
|
GetDispatcher()->RegisterHandler(protocol::PacketType::SpawnMob, this);
|
||||||
GetDispatcher()->RegisterHandler(protocol::PacketType::UpgradeTower, this);
|
GetDispatcher()->RegisterHandler(protocol::PacketType::UpgradeTower, this);
|
||||||
|
GetDispatcher()->RegisterHandler(protocol::PacketType::RemoveTower, this);
|
||||||
}
|
}
|
||||||
|
|
||||||
void WorldClient::HandlePacket(const protocol::WorldBeginDataPacket* packet) {
|
void WorldClient::HandlePacket(const protocol::WorldBeginDataPacket* packet) {
|
||||||
@@ -32,8 +34,18 @@ void WorldClient::HandlePacket(const protocol::UpgradeTowerPacket* packet) {
|
|||||||
tower->upgrade(packet->getTowerLevel().getLevel(), packet->getTowerLevel().getPath());
|
tower->upgrade(packet->getTowerLevel().getLevel(), packet->getTowerLevel().getPath());
|
||||||
}
|
}
|
||||||
|
|
||||||
void WorldClient::OnArrowShot(game::MobPtr target, game::Tower* tower) {
|
void WorldClient::HandlePacket(const protocol::WorldAddTowerPacket* packet) {
|
||||||
World::OnArrowShot(target, tower);
|
game::TowerPtr newTower = placeTowerAt(packet->getTowerID(), packet->getTowerType(), packet->getTowerX(), packet->getTowerY(), packet->getBuilder());
|
||||||
|
|
||||||
|
notifyListeners(&WorldListener::OnTowerAdd, newTower);
|
||||||
|
}
|
||||||
|
|
||||||
|
void WorldClient::HandlePacket(const protocol::RemoveTowerPacket* packet) {
|
||||||
|
game::TowerPtr tower = removeTower(packet->getTowerID());
|
||||||
|
|
||||||
|
if (tower != nullptr) {
|
||||||
|
notifyListeners(&WorldListener::OnTowerRemove, tower);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace client
|
} // namespace client
|
||||||
|
|||||||
@@ -41,6 +41,7 @@ void ServerConnexion::registerHandlers() {
|
|||||||
GetDispatcher()->RegisterHandler(protocol::PacketType::PlaceTower, this);
|
GetDispatcher()->RegisterHandler(protocol::PacketType::PlaceTower, this);
|
||||||
GetDispatcher()->RegisterHandler(protocol::PacketType::SendMobs, this);
|
GetDispatcher()->RegisterHandler(protocol::PacketType::SendMobs, this);
|
||||||
GetDispatcher()->RegisterHandler(protocol::PacketType::UpgradeTower, this);
|
GetDispatcher()->RegisterHandler(protocol::PacketType::UpgradeTower, this);
|
||||||
|
GetDispatcher()->RegisterHandler(protocol::PacketType::RemoveTower, this);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool ServerConnexion::updateSocket() {
|
bool ServerConnexion::updateSocket() {
|
||||||
@@ -159,6 +160,8 @@ void ServerConnexion::HandlePacket(const protocol::PlaceTowerPacket* packet) {
|
|||||||
|
|
||||||
game::TowerPtr tower = world->placeTowerAt(towerType, packet->getTowerX(), packet->getTowerY(), m_ID);
|
game::TowerPtr tower = world->placeTowerAt(towerType, packet->getTowerX(), packet->getTowerY(), m_ID);
|
||||||
|
|
||||||
|
world->notifyListeners(&game::WorldListener::OnTowerAdd, tower);
|
||||||
|
|
||||||
protocol::WorldAddTowerPacket addTowerPacket(tower->getID(), packet->getTowerX(), packet->getTowerY(), packet->getTowerType(), m_ID);
|
protocol::WorldAddTowerPacket addTowerPacket(tower->getID(), packet->getTowerX(), packet->getTowerY(), packet->getTowerType(), m_ID);
|
||||||
m_Server->broadcastPacket(&addTowerPacket);
|
m_Server->broadcastPacket(&addTowerPacket);
|
||||||
}
|
}
|
||||||
@@ -179,6 +182,12 @@ void ServerConnexion::HandlePacket(const protocol::UpgradeTowerPacket* packet) {
|
|||||||
m_Server->broadcastPacket(packet);
|
m_Server->broadcastPacket(packet);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ServerConnexion::HandlePacket(const protocol::RemoveTowerPacket* packet) {
|
||||||
|
//TODO: verify the packet
|
||||||
|
|
||||||
|
m_Server->broadcastPacket(packet);
|
||||||
|
}
|
||||||
|
|
||||||
ServerConnexion::~ServerConnexion() {
|
ServerConnexion::~ServerConnexion() {
|
||||||
if (GetDispatcher() != nullptr)
|
if (GetDispatcher() != nullptr)
|
||||||
GetDispatcher()->UnregisterHandler(this);
|
GetDispatcher()->UnregisterHandler(this);
|
||||||
|
|||||||
@@ -22,14 +22,20 @@ void ServerWorld::spawnMobs(game::MobType type, std::uint8_t level, game::Player
|
|||||||
enemyMobSpawn = &getTeam(game::TeamColor::Red).getSpawn();
|
enemyMobSpawn = &getTeam(game::TeamColor::Red).getSpawn();
|
||||||
}
|
}
|
||||||
|
|
||||||
std::int32_t spawnCenterX = enemyMobSpawn->getCenterX();
|
float spawnWidth = enemyMobSpawn->getWidth();
|
||||||
std::int32_t spawnCenterY = enemyMobSpawn->getCenterY();
|
float spawnHeight = enemyMobSpawn->getHeight();
|
||||||
|
|
||||||
std::int32_t minSpawnY = spawnCenterY - 2;
|
float spawnCenterX = enemyMobSpawn->getCenterX();
|
||||||
std::int32_t maxSpawnY = spawnCenterY + 2;
|
float spawnCenterY = enemyMobSpawn->getCenterY();
|
||||||
|
|
||||||
std::int32_t minSpawnX = spawnCenterX - 2;
|
auto mobStats = getMobStats(type, level);
|
||||||
std::int32_t maxSpawnX = spawnCenterX + 2;
|
auto mobSize = mobStats->getSize();
|
||||||
|
|
||||||
|
float minSpawnX = spawnCenterX - spawnWidth / 2.0f + mobSize.x / 2.0f;
|
||||||
|
float maxSpawnX = spawnCenterX + spawnWidth / 2.0f - mobSize.x / 2.0f;
|
||||||
|
|
||||||
|
float minSpawnY = spawnCenterY - spawnHeight / 2.0f + mobSize.y / 2.0f;
|
||||||
|
float maxSpawnY = spawnCenterY + spawnHeight / 2.0f - mobSize.y / 2.0f;
|
||||||
|
|
||||||
float mobX = utils::getRandomReal<float>(minSpawnX, maxSpawnX);
|
float mobX = utils::getRandomReal<float>(minSpawnX, maxSpawnX);
|
||||||
float mobY = utils::getRandomReal<float>(minSpawnY, maxSpawnY);
|
float mobY = utils::getRandomReal<float>(minSpawnY, maxSpawnY);
|
||||||
@@ -49,9 +55,5 @@ game::TowerPtr ServerWorld::placeTowerAt(game::TowerType type, std::int32_t x, s
|
|||||||
return tower;
|
return tower;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ServerWorld::OnArrowShot(game::MobPtr target, game::Tower* shooter) {
|
|
||||||
World::OnArrowShot(target, shooter);
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace server
|
} // namespace server
|
||||||
} // namespace td
|
} // namespace td
|
||||||
|
|||||||
@@ -28,7 +28,7 @@ static std::map<PacketType, PacketCreator> packets = {
|
|||||||
{PacketType::SpawnMob, []() -> PacketPtr {return std::make_unique<SpawnMobPacket>(); } },
|
{PacketType::SpawnMob, []() -> PacketPtr {return std::make_unique<SpawnMobPacket>(); } },
|
||||||
{PacketType::PlaceTower, []() -> PacketPtr {return std::make_unique<PlaceTowerPacket>(); } },
|
{PacketType::PlaceTower, []() -> PacketPtr {return std::make_unique<PlaceTowerPacket>(); } },
|
||||||
{PacketType::WorldAddTower, []() -> PacketPtr {return std::make_unique<WorldAddTowerPacket>(); } },
|
{PacketType::WorldAddTower, []() -> PacketPtr {return std::make_unique<WorldAddTowerPacket>(); } },
|
||||||
{PacketType::WorldRemoveTower, []() -> PacketPtr {return std::make_unique<WorldRemoveTowerPacket>(); } },
|
{PacketType::RemoveTower, []() -> PacketPtr {return std::make_unique<RemoveTowerPacket>(); } },
|
||||||
{PacketType::SendMobs, []() -> PacketPtr {return std::make_unique<SendMobsPacket>(); } },
|
{PacketType::SendMobs, []() -> PacketPtr {return std::make_unique<SendMobsPacket>(); } },
|
||||||
{PacketType::UpgradeTower, []() -> PacketPtr {return std::make_unique<UpgradeTowerPacket>(); } },
|
{PacketType::UpgradeTower, []() -> PacketPtr {return std::make_unique<UpgradeTowerPacket>(); } },
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -485,13 +485,13 @@ void WorldAddTowerPacket::Deserialize(DataBuffer& data) {
|
|||||||
data >> m_TowerID >> m_TowerX >> m_TowerY >> m_TowerType >> m_Builder;
|
data >> m_TowerID >> m_TowerX >> m_TowerY >> m_TowerType >> m_Builder;
|
||||||
}
|
}
|
||||||
|
|
||||||
DataBuffer WorldRemoveTowerPacket::Serialize() const {
|
DataBuffer RemoveTowerPacket::Serialize() const {
|
||||||
DataBuffer data;
|
DataBuffer data;
|
||||||
data << getID() << m_TowerID;
|
data << getID() << m_TowerID;
|
||||||
return data;
|
return data;
|
||||||
}
|
}
|
||||||
|
|
||||||
void WorldRemoveTowerPacket::Deserialize(DataBuffer& data) {
|
void RemoveTowerPacket::Deserialize(DataBuffer& data) {
|
||||||
data >> m_TowerID;
|
data >> m_TowerID;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -543,7 +543,7 @@ REGISTER_DISPATCH_CLASS(ServerTpsPacket);
|
|||||||
REGISTER_DISPATCH_CLASS(SpawnMobPacket);
|
REGISTER_DISPATCH_CLASS(SpawnMobPacket);
|
||||||
REGISTER_DISPATCH_CLASS(PlaceTowerPacket);
|
REGISTER_DISPATCH_CLASS(PlaceTowerPacket);
|
||||||
REGISTER_DISPATCH_CLASS(WorldAddTowerPacket);
|
REGISTER_DISPATCH_CLASS(WorldAddTowerPacket);
|
||||||
REGISTER_DISPATCH_CLASS(WorldRemoveTowerPacket);
|
REGISTER_DISPATCH_CLASS(RemoveTowerPacket);
|
||||||
REGISTER_DISPATCH_CLASS(SendMobsPacket);
|
REGISTER_DISPATCH_CLASS(SendMobsPacket);
|
||||||
REGISTER_DISPATCH_CLASS(UpgradeTowerPacket);
|
REGISTER_DISPATCH_CLASS(UpgradeTowerPacket);
|
||||||
|
|
||||||
|
|||||||
@@ -5,46 +5,43 @@ namespace td {
|
|||||||
namespace render {
|
namespace render {
|
||||||
|
|
||||||
void VertexCache::addData(std::uint64_t index, std::vector<float> positions, std::vector<float> colors) {
|
void VertexCache::addData(std::uint64_t index, std::vector<float> positions, std::vector<float> colors) {
|
||||||
ElementsIndex positionsIndexes;
|
m_Indexes.insert({ index, {positions, colors} });
|
||||||
positionsIndexes.first = m_Positions.end();
|
m_VertexCount += colors.size(); // one color per vertex
|
||||||
m_Positions.insert(m_Positions.end(), positions.begin(), positions.end());
|
|
||||||
positionsIndexes.second = m_Positions.end() - 1;
|
|
||||||
|
|
||||||
ElementsIndex colorsIndexes;
|
|
||||||
colorsIndexes.first = m_Colors.end();
|
|
||||||
m_Colors.insert(m_Colors.end(), colors.begin(), colors.end());
|
|
||||||
colorsIndexes.second = m_Colors.end() - 1;
|
|
||||||
|
|
||||||
m_Indexes.insert({ index, {positionsIndexes, colorsIndexes} });
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void VertexCache::removeData(std::uint64_t index) {
|
void VertexCache::removeData(std::uint64_t index) {
|
||||||
auto it = m_Indexes.find(index);
|
auto it = m_Indexes.find(index);
|
||||||
if (it != m_Indexes.end()) {
|
if (it != m_Indexes.end()) {
|
||||||
DataIndex indexes = it->second;
|
|
||||||
ElementsIndex positionsIndexes = indexes.first;
|
|
||||||
ElementsIndex colorsIndexes = indexes.second;
|
|
||||||
|
|
||||||
m_Positions.erase(positionsIndexes.first, positionsIndexes.second);
|
|
||||||
m_Colors.erase(colorsIndexes.first, colorsIndexes.second);
|
|
||||||
|
|
||||||
m_Indexes.erase(it);
|
m_Indexes.erase(it);
|
||||||
|
m_VertexCount -= it->second.color.size(); // one color per vertex
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void VertexCache::clear() {
|
void VertexCache::clear() {
|
||||||
m_Positions.clear();
|
|
||||||
m_Colors.clear();
|
|
||||||
m_Indexes.clear();
|
m_Indexes.clear();
|
||||||
|
m_VertexCount = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void VertexCache::updateVertexArray() {
|
void VertexCache::updateVertexArray() {
|
||||||
m_VertexArray = std::make_unique<GL::VertexArray>(m_Colors.size()); // one color per vertex
|
m_VertexArray = std::make_unique<GL::VertexArray>(m_VertexCount); // one color per vertex
|
||||||
|
|
||||||
GL::VertexBuffer positionsBuffer(m_Positions, 2);
|
Vector positions;
|
||||||
|
positions.reserve(m_VertexCount * 2);
|
||||||
|
|
||||||
|
Vector colors;
|
||||||
|
colors.reserve(m_VertexCount);
|
||||||
|
|
||||||
|
for (auto it = m_Indexes.begin(); it != m_Indexes.end(); it++) {
|
||||||
|
const DataIndex& data = it->second;
|
||||||
|
|
||||||
|
positions.insert(positions.end(), data.position.begin(), data.position.end());
|
||||||
|
colors.insert(colors.end(), data.color.begin(), data.color.end());
|
||||||
|
}
|
||||||
|
|
||||||
|
GL::VertexBuffer positionsBuffer(positions, 2);
|
||||||
positionsBuffer.addVertexAttribPointer(0, 2, 0);
|
positionsBuffer.addVertexAttribPointer(0, 2, 0);
|
||||||
|
|
||||||
GL::VertexBuffer colorsBuffer(m_Colors, 1);
|
GL::VertexBuffer colorsBuffer(colors, 1);
|
||||||
colorsBuffer.addVertexAttribPointer(1, 1, 0);
|
colorsBuffer.addVertexAttribPointer(1, 1, 0);
|
||||||
|
|
||||||
m_VertexArray->bind();
|
m_VertexArray->bind();
|
||||||
|
|||||||
@@ -37,6 +37,7 @@ WorldRenderer::WorldRenderer(game::World* world, client::ClientGame* client) : m
|
|||||||
m_Renderer->setCamMovement({});
|
m_Renderer->setCamMovement({});
|
||||||
m_TowerPlacePopup = std::make_unique<gui::TowerPlacePopup>(m_Client->getClient());
|
m_TowerPlacePopup = std::make_unique<gui::TowerPlacePopup>(m_Client->getClient());
|
||||||
m_MobTooltip = std::make_unique<gui::MobTooltip>(m_Client->getClient());
|
m_MobTooltip = std::make_unique<gui::MobTooltip>(m_Client->getClient());
|
||||||
|
m_Client->getWorld().bindListener(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
void WorldRenderer::updateCursorPos() {
|
void WorldRenderer::updateCursorPos() {
|
||||||
@@ -64,6 +65,18 @@ void WorldRenderer::update() {
|
|||||||
m_PopupOpened = false;
|
m_PopupOpened = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (ImGui::IsMouseDoubleClicked(1)) removeTower();
|
||||||
|
}
|
||||||
|
|
||||||
|
void WorldRenderer::removeTower() {
|
||||||
|
glm::vec2 cursorPos = getCursorWorldPos();
|
||||||
|
|
||||||
|
game::TowerPtr clickedTower = m_World->getTower(cursorPos);
|
||||||
|
|
||||||
|
if (clickedTower != nullptr) {
|
||||||
|
m_Client->getClient()->removeTower(clickedTower->getID());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void WorldRenderer::renderWorld() const {
|
void WorldRenderer::renderWorld() const {
|
||||||
@@ -243,13 +256,13 @@ void WorldRenderer::detectMobHovering() const {
|
|||||||
m_MobTooltip->setMob(nullptr);
|
m_MobTooltip->setMob(nullptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
void WorldRenderer::addTower(game::TowerPtr tower) {
|
void WorldRenderer::OnTowerAdd(game::TowerPtr tower) {
|
||||||
const WorldLoader::RenderData& renderData = WorldLoader::loadTowerModel(tower);
|
WorldLoader::RenderData renderData = WorldLoader::loadTowerModel(tower);
|
||||||
m_TowersCache.addData(tower->getID(), renderData.positions, renderData.colors);
|
m_TowersCache.addData(tower->getID(), renderData.positions, renderData.colors);
|
||||||
m_TowersCache.updateVertexArray();
|
m_TowersCache.updateVertexArray();
|
||||||
}
|
}
|
||||||
|
|
||||||
void WorldRenderer::removeTower(game::TowerPtr tower) {
|
void WorldRenderer::OnTowerRemove(game::TowerPtr tower) {
|
||||||
m_TowersCache.removeData(tower->getID());
|
m_TowersCache.removeData(tower->getID());
|
||||||
m_TowersCache.updateVertexArray();
|
m_TowersCache.updateVertexArray();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -35,6 +35,9 @@ target("TowerDefense")
|
|||||||
end
|
end
|
||||||
|
|
||||||
else
|
else
|
||||||
|
if is_os("linux") then
|
||||||
|
add_links("dw")
|
||||||
|
end
|
||||||
add_cxflags("-pedantic -Wall -Wextra -Wcast-align -Wcast-qual -Wctor-dtor-privacy -Wdisabled-optimization -Wformat=2 -Winit-self -Wlogical-op -Wmissing-declarations -Wmissing-include-dirs -Wnoexcept -Wold-style-cast -Woverloaded-virtual -Wredundant-decls -Wshadow -Wsign-conversion -Wsign-promo -Wstrict-null-sentinel -Wstrict-overflow=5 -Wswitch-default -Wundef -Wno-unused")
|
add_cxflags("-pedantic -Wall -Wextra -Wcast-align -Wcast-qual -Wctor-dtor-privacy -Wdisabled-optimization -Wformat=2 -Winit-self -Wlogical-op -Wmissing-declarations -Wmissing-include-dirs -Wnoexcept -Wold-style-cast -Woverloaded-virtual -Wredundant-decls -Wshadow -Wsign-conversion -Wsign-promo -Wstrict-null-sentinel -Wstrict-overflow=5 -Wswitch-default -Wundef -Wno-unused")
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user