diff --git a/include/td/game/Mobs.h b/include/td/game/Mobs.h index 43ad263..ace8d0d 100644 --- a/include/td/game/Mobs.h +++ b/include/td/game/Mobs.h @@ -18,9 +18,6 @@ using Vec2fp = Vec2; namespace game { - -struct WalkableTile; - enum class EffectType : std::uint8_t { Slowness = 0, Stun, @@ -127,6 +124,8 @@ class MobListener { virtual void OnMobCastleDamage(Mob* damager, TeamCastle* enemyCastle, float damage) {} }; +using MobList = std::vector; + // typedef utils::ObjectNotifier MobNotifier; } // namespace game diff --git a/include/td/game/WorldTypes.h b/include/td/game/WorldTypes.h index 1d872ec..745aa0b 100644 --- a/include/td/game/WorldTypes.h +++ b/include/td/game/WorldTypes.h @@ -1,10 +1,11 @@ #pragma once #include -#include #include #include +#include + namespace td { namespace game { @@ -31,37 +32,44 @@ static constexpr Color RED{255, 0, 0}; static constexpr Color GREEN{0, 255, 0}; static constexpr Color BLUE{0, 0, 255}; -struct Tile { - virtual TileType GetType() const = 0; - virtual ~Tile() = default; +class TileHandler; + +using Tile = sp::MessageBase; + +template +using ConcreteTile = sp::ConcreteMessage; + +namespace data { +struct EmptyData {}; + +struct TowerTileData { + std::uint8_t m_ColorPaletteRef; + TeamColor m_TeamOwner; }; -struct TowerTile : Tile { - std::uint8_t color_palette_ref; - TeamColor team_owner; - - virtual TileType GetType() const { - return TileType::Tower; - } +struct WalkableTileData { + Direction m_Direction; }; -struct WalkableTile : Tile { - Direction direction; - - virtual TileType GetType() const { - return TileType::Walk; - } +struct DecorationTileData { + std::uint16_t m_ColorPaletteRef; }; +} // namespace data -struct DecorationTile : Tile { - std::uint16_t color_palette_ref; +using EmptyTile = ConcreteTile; +using TowerTile = ConcreteTile; +using WalkableTile = ConcreteTile; +using DecorationTile = ConcreteTile; - virtual TileType GetType() const { - return TileType::Decoration; - } -}; +using AllTiles = std::tuple; -typedef std::shared_ptr TilePtr; +using TileFactory = sp::MessageFactory; + +class TileHandler : public sp::GenericHandler{}; + +using TilePtr = std::shared_ptr>; + +// typedef std::shared_ptr TilePtr; typedef std::vector ChunkPalette; typedef std::shared_ptr WalkableTilePtr; @@ -85,6 +93,21 @@ struct Chunk { } // TODO: keep data packed + /* + std::size_t startLong = static_cast((tileNumber * bitsPerTile) / BITS_IN_LONG); + std::size_t startOffset = static_cast((tileNumber * bitsPerTile) % BITS_IN_LONG); + std::size_t endLong = static_cast(((tileNumber + 1) * bitsPerTile - 1) / BITS_IN_LONG); + + std::uint64_t value = static_cast(a_Chunk->m_Tiles[tileNumber]); + + value &= individualValueMask; + + chunkData[startLong] |= (value << startOffset); + + if (startLong != endLong) { + chunkData[endLong] = (value >> (BITS_IN_LONG - startOffset)); + } + */ }; typedef std::shared_ptr ChunkPtr; @@ -93,17 +116,12 @@ typedef std::array TowerTileColorPalette; typedef std::vector TilePalette; -typedef std::vector MobList; - typedef std::array SpawnColorPalette; typedef std::vector TowerList; using ChunkList = std::unordered_map; -sp::DataBuffer& operator>>(sp::DataBuffer& buffer, TilePtr& tile); - - } // namespace game } // namespace td diff --git a/include/td/protocol/command/Commands.h b/include/td/protocol/command/Commands.h index 93cc112..b55102b 100644 --- a/include/td/protocol/command/Commands.h +++ b/include/td/protocol/command/Commands.h @@ -13,6 +13,7 @@ #include #include #include +#include namespace td { namespace protocol { @@ -32,8 +33,6 @@ class CommandHandler; using CommandBase = sp::MessageBase; -using CommandPtr = std::unique_ptr; - template using CommandMessage = sp::ConcreteMessage; @@ -61,5 +60,7 @@ using CommandFactory = sp::MessageFactory; using LockStep = std::vector>; +using CommandPtr = std::unique_ptr>; + } // namespace protocol } // namespace td diff --git a/include/td/protocol/packet/PacketSerialize.h b/include/td/protocol/packet/PacketSerialize.h index 83a32cb..0f0b127 100644 --- a/include/td/protocol/packet/PacketSerialize.h +++ b/include/td/protocol/packet/PacketSerialize.h @@ -43,8 +43,5 @@ sp::DataBuffer& operator>>(sp::DataBuffer& a_Buffer, TeamCastle& a_Castle); sp::DataBuffer& operator<<(sp::DataBuffer& a_Buffer, const ChunkPtr& a_Chunk); sp::DataBuffer& operator>>(sp::DataBuffer& a_Buffer, ChunkPtr& a_Chunk); -sp::DataBuffer& operator<<(sp::DataBuffer& buffer, const TilePtr& tile); -sp::DataBuffer& operator>>(sp::DataBuffer& buffer, TilePtr& tile); - } // namespace game } // namespace td diff --git a/include/td/simulation/WorldSnapshot.h b/include/td/simulation/WorldSnapshot.h index 2081289..3f20b64 100644 --- a/include/td/simulation/WorldSnapshot.h +++ b/include/td/simulation/WorldSnapshot.h @@ -1,6 +1,7 @@ #pragma once #include +#include namespace td { namespace sim { diff --git a/src/main.cpp b/src/main.cpp index 4e05e79..6de07e6 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -13,7 +13,6 @@ #include #include #include -#include #include class WorldApply : public td::protocol::PacketHandler { diff --git a/src/td/game/World.cpp b/src/td/game/World.cpp index 894cdaa..ba9be9a 100644 --- a/src/td/game/World.cpp +++ b/src/td/game/World.cpp @@ -5,27 +5,39 @@ namespace td { namespace game { +class ColorTileVisitor : public TileHandler { + private: + const World& m_World; + const Color* m_Result; + + public: + ColorTileVisitor(const World& a_World) : m_World(a_World), m_Result(nullptr) {} + + virtual void Handle(const EmptyTile& a_Tile) override {} + + virtual void Handle(const TowerTile& a_Tile) override { + m_Result = &m_World.GetTowerTileColorPalette()[a_Tile->m_ColorPaletteRef]; + } + + virtual void Handle(const WalkableTile& a_Tile) override { + m_Result = &m_World.GetWalkableTileColor(); + } + + virtual void Handle(const DecorationTile& a_Tile) override { + m_Result = &m_World.GetDecorationPalette()[a_Tile->m_ColorPaletteRef]; + } + + const Color* GetResult() { + return m_Result; + } +}; + World::World() : m_CurrentState(std::make_shared()), m_NextState(m_CurrentState) {} const Color* World::GetTileColor(const TilePtr& tile) const { - switch (tile->GetType()) { - case TileType::Tower: { - TowerTile* towerTile = dynamic_cast(tile.get()); - return &m_TowerPlacePalette[towerTile->color_palette_ref]; - } - case TileType::Walk: { - return &m_WalkablePalette; - } - case TileType::Decoration: { - DecorationTile* towerTile = dynamic_cast(tile.get()); - return &m_DecorationPalette[towerTile->color_palette_ref]; - break; - } - default: { - return nullptr; - } - } - return nullptr; + ColorTileVisitor visitor(*this); + tile->Dispatch(visitor); + return visitor.GetResult(); } bool World::LoadMap(const protocol::pdata::WorldHeader& a_WorldHeader) { diff --git a/src/td/game/WorldTypes.cpp b/src/td/game/WorldTypes.cpp index 09afe11..25d25f6 100644 --- a/src/td/game/WorldTypes.cpp +++ b/src/td/game/WorldTypes.cpp @@ -1,7 +1,5 @@ #include -#include - namespace td { namespace game { diff --git a/src/td/protocol/packet/PacketSerialize.cpp b/src/td/protocol/packet/PacketSerialize.cpp index 426b65b..2ba507e 100644 --- a/src/td/protocol/packet/PacketSerialize.cpp +++ b/src/td/protocol/packet/PacketSerialize.cpp @@ -15,63 +15,5 @@ sp::DataBuffer& operator>>(sp::DataBuffer& a_Buffer, TeamCastle& a_Castle) { return a_Buffer; } -sp::DataBuffer& operator<<(sp::DataBuffer& buffer, const TilePtr& tile) { - buffer << tile->GetType(); - - switch (tile->GetType()) { - - case game::TileType::Tower: { - const game::TowerTile* towerTile = dynamic_cast(tile.get()); - buffer << towerTile->color_palette_ref << towerTile->team_owner; - break; - } - - case game::TileType::Walk: { - const game::WalkableTile* walkTile = dynamic_cast(tile.get()); - buffer << walkTile->direction; - break; - } - - case game::TileType::Decoration: { - const game::DecorationTile* decoTile = dynamic_cast(tile.get()); - buffer << decoTile->color_palette_ref; - break; - } - - default: - break; - } - - return buffer; -} - -sp::DataBuffer& operator>>(sp::DataBuffer& buffer, TilePtr& tile) { - game::TileType tileType; - buffer >> tileType; - switch (tileType) { - case game::TileType::Tower: { - auto tilePtr = std::make_shared(); - buffer >> tilePtr->color_palette_ref >> tilePtr->team_owner; - tile = tilePtr; - break; - } - case game::TileType::Walk: { - auto tilePtr = std::make_shared(); - buffer >> tilePtr->direction; - tile = tilePtr; - break; - } - case game::TileType::Decoration: { - auto tilePtr = std::make_shared(); - buffer >> tilePtr->color_palette_ref; - tile = tilePtr; - break; - } - default: - break; - } - return buffer; -} - } // namespace game } // namespace td diff --git a/xmake.lua b/xmake.lua index 813cf64..959efb7 100644 --- a/xmake.lua +++ b/xmake.lua @@ -3,7 +3,7 @@ add_rules("mode.debug", "mode.release") add_repositories("persson-repo https://git.ale-pri.com/Persson-dev/xmake-repo.git") add_requires("imgui 1.92.0", {configs = {sdl3 = true, opengl3 = true}}) -add_requires("splib 2.0.2", "zlib") +add_requires("splib 2.1.0", "zlib") add_requires("libsdl3 3.2.16", "glew", "fpm", "enet6") set_languages("c++17")