69 lines
1.6 KiB
C++
69 lines
1.6 KiB
C++
#include <td/Maths.h>
|
|
#include <td/Types.h>
|
|
#include <td/game/WorldTypes.h>
|
|
#include <td/simulation/system/EntityMove.h>
|
|
|
|
#include <td/game/World.h>
|
|
|
|
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<std::int32_t>(mob->m_Position.x), static_cast<std::int32_t>(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
|