#include #include #include #include #include namespace td { namespace sim { static Vec2i GetUnitDirection(Direction a_Direction) { switch (a_Direction) { case Direction::PositiveX: return {1, 0}; case Direction::NegativeX: return {-1, 0}; case Direction::PositiveY: return {0, 1}; case Direction::NegativeY: return {0, -1}; } return {0, 0}; } class DirectionTileVisitor : public game::TileHandler { private: Direction m_Direction; public: DirectionTileVisitor() {} virtual void Handle(const game::EmptyTile& a_Tile) override {} virtual void Handle(const game::TowerTile& a_Tile) override {} virtual void Handle(const game::DecorationTile& a_Tile) override {} virtual void Handle(const game::WalkableTile& a_Tile) override { m_Direction = a_Tile->m_Direction; } const Direction GetDirection() { return m_Direction; } }; void EntityMove::Tick(const game::World& a_World, WorldSnapshot& a_State, FpFloat a_Delta) { for (auto& mob : a_State.m_Mobs) { if (mob->m_HasReachedCastle) continue; auto tile = a_World.GetTile(static_cast(mob->m_Position.x), static_cast(mob->m_Position.y)); Direction direction = mob->m_Direction; if (tile) { DirectionTileVisitor visitor; tile->Dispatch(visitor); direction = visitor.GetDirection(); } auto directVector = GetUnitDirection(direction); mob->m_Position.x += directVector.x * a_Delta; mob->m_Position.y += directVector.y * a_Delta; } } } // namespace sim } // namespace td