#ifndef DIRECTION_H_AB66A90E #define DIRECTION_H_AB66A90E #include #include #include "vector.h" enum class Direction { up, up_right, right, down_right, down, down_left, left, up_left }; inline Direction directionFromString(std::string_view str) { if (str == "up") return Direction::up; if (str == "up_right") return Direction::up_right; if (str == "right") return Direction::right; if (str == "down_right") return Direction::down_right; if (str == "down") return Direction::down; if (str == "down_left") return Direction::down_left; if (str == "left") return Direction::left; if (str == "up_left") return Direction::up_left; throw std::invalid_argument("Invalid direction: " + std::string(str)); } inline vec2i unitVecInDirection(Direction dir) { switch (dir) { case Direction::up: return { 0, -1 }; case Direction::up_right: return { 1, -1 }; case Direction::right: return { 1, 0 }; case Direction::down_right: return { 1, 1 }; case Direction::down: return { 0, 1 }; case Direction::down_left: return { -1, 1 }; case Direction::left: return { -1, 0 }; case Direction::up_left: return { -1, -1 }; } } inline bool dirHasDir(Direction value, Direction inner) { switch (inner) { case Direction::up: return value == Direction::up_left || value == Direction::up || value == Direction::up_right; case Direction::down: return value == Direction::down_left || value == Direction::down || value == Direction::down_right; case Direction::left: return value == Direction::up_left || value == Direction::left || value == Direction::down_left; case Direction::right: return value == Direction::up_right || value == Direction::right || value == Direction::down_right; default: return value == inner; } } #endif /* end of include guard: DIRECTION_H_AB66A90E */