diff --git a/include/game/World.h b/include/game/World.h index a4be7d0..3be569d 100644 --- a/include/game/World.h +++ b/include/game/World.h @@ -195,6 +195,7 @@ private: void moveMobs(std::uint64_t delta); void moveMob(MobPtr mob, std::uint64_t delta); void moveBackMob(MobPtr mob, const TeamCastle& castle); + void changeMobDirection(MobPtr mob, WalkableTilePtr tile); bool isMobTouchingCastle(MobPtr mob, const TeamCastle& castle) const; void tickMobs(std::uint64_t delta); void cleanDeadMobs(); diff --git a/src/game/World.cpp b/src/game/World.cpp index e4caabe..d67c628 100644 --- a/src/game/World.cpp +++ b/src/game/World.cpp @@ -128,13 +128,84 @@ void World::tickMobs(std::uint64_t delta) { } } +void World::changeMobDirection(MobPtr mob, WalkableTilePtr tile) { + if (mob->getDirection() == tile->direction) return; + + float tileX = static_cast(static_cast(mob->getCenterX())); + float tileY = static_cast(static_cast(mob->getCenterY())); + + switch (mob->getDirection()) { + + case Direction::PositiveY: { + if (tile->direction == Direction::NegativeX) { + if (mob->getTileY() > mob->getTileX()) { + mob->setCenterY(tileY + mob->getTileX()); + mob->setDirection(tile->direction); + } + } else { // tile->direction = Direction::PositiveX + if (mob->getTileY() > 1 - mob->getTileX()) { + mob->setCenterY(tileY + (1 - mob->getTileX())); + mob->setDirection(tile->direction); + } + } + return; + } + + case Direction::NegativeY: { + if (tile->direction == Direction::PositiveX) { + if (mob->getTileY() < mob->getTileX()) { + mob->setCenterY(tileY + mob->getTileX()); + mob->setDirection(tile->direction); + } + } else { // tile->direction = Direction::NegativeX + if (mob->getTileY() < 1 - mob->getTileX()) { + mob->setCenterY(tileY + (1 - mob->getTileX())); + mob->setDirection(tile->direction); + } + } + return; + } + + case Direction::PositiveX: { + if (tile->direction == Direction::NegativeY) { + if (mob->getTileX() > mob->getTileY()) { + mob->setCenterX(tileX + mob->getTileY()); + mob->setDirection(tile->direction); + } + } else { // tile->direction = Direction::PositiveY + if (mob->getTileX() > 1 - mob->getTileY()) { + mob->setCenterX(tileX + (1 - mob->getTileY())); + mob->setDirection(tile->direction); + } + } + return; + } + + case Direction::NegativeX: { + if (tile->direction == Direction::PositiveY) { + if (mob->getTileX() < mob->getTileY()) { + mob->setCenterX(tileX + mob->getTileY()); + mob->setDirection(tile->direction); + } + } else { // tile->direction = Direction::NegativeY + if (mob->getTileX() < 1 - mob->getTileY()) { + mob->setCenterX(tileX + (1 - mob->getTileY())); + mob->setDirection(tile->direction); + } + } + return; + } + + } +} + void World::moveMobs(std::uint64_t delta) { for (MobPtr mob : m_Mobs) { TilePtr tile = getTile(mob->getCenter().getX(), mob->getCenter().getY()); if (tile != nullptr && tile->getType() == TileType::Walk) { - WalkableTile* walkTile = dynamic_cast(tile.get()); - mob->setDirection(walkTile->direction); + WalkableTilePtr walkTile = std::static_pointer_cast(tile); + changeMobDirection(mob, walkTile); } if (mob->hasReachedEnemyCastle()) continue;