/* src/server/yx_uint8.c */
#include "yx_uint8.h"
-#include <stdint.h> /* uint8_t, UINT8_MAX */
-#include "../common/yx_uint8.h" /* yx_uint8 struct */
+#include <stdint.h> /* uint8_t, int8_t */
+#include <string.h> /* strchr() */
+#include "../common/yx_uint8.h" /* yx_uint8 */
+
+
+
+/* Move "yx" into hex direction "d". */
+static void mv_yx_in_hex_dir(char d, struct yx_uint8 * yx);
+
+
+
+static void mv_yx_in_hex_dir(char d, struct yx_uint8 * yx)
+{
+ if (d == 'e')
+ {
+ yx->x = yx->x + (yx->y % 2);
+ yx->y--;
+ }
+ else if (d == 'd')
+ {
+ yx->x++;
+ }
+ else if (d == 'c')
+ {
+ yx->x = yx->x + (yx->y % 2);
+ yx->y++;
+ }
+ else if (d == 'x')
+ {
+ yx->x = yx->x - !(yx->y % 2);
+ yx->y++;
+ }
+ else if (d == 's')
+ {
+ yx->x--;
+ }
+ else if (d == 'w')
+ {
+ yx->x = yx->x - !(yx->y % 2);
+ yx->y--;
+ }
+}
-extern struct yx_uint8 mv_yx_in_dir(char d, struct yx_uint8 yx)
+extern uint8_t mv_yx_in_dir_wrap(char d, struct yx_uint8 * yx, uint8_t unwrap)
{
- if (d == '8' && yx.y > 0)
- {
- yx.y--;
- }
- else if (d == '9' && yx.y > 0 && yx.x < UINT8_MAX)
- {
- yx.y--;
- yx.x++;
- }
- else if (d == '6' && yx.x < UINT8_MAX)
- {
- yx.x++;
- }
- else if (d == '3' && yx.x < UINT8_MAX && yx.y < UINT8_MAX)
+ static int8_t wrap_west_east = 0;
+ static int8_t wrap_north_south = 0;
+ if (unwrap)
{
- yx.y++;
- yx.x++;
+ wrap_west_east = wrap_north_south = 0;
+ return 0;
}
- else if (d == '2' && yx.y < UINT8_MAX)
+ struct yx_uint8 original;
+ original.y = yx->y;
+ original.x = yx->x;
+ mv_yx_in_hex_dir(d, yx);
+ if (strchr("edc", d) && yx->x < original.x)
{
- yx.y++;
+ wrap_west_east++;
}
- else if (d == '1' && yx.y < UINT8_MAX && yx.x > 0)
+ else if (strchr("xsw", d) && yx->x > original.x)
{
- yx.y++;
- yx.x--;
+ wrap_west_east--;
}
- else if (d == '4' && yx.x > 0)
+ if (strchr("we", d) && yx->y > original.y)
{
- yx.x--;
+ wrap_north_south--;
}
- else if (d == '7' && yx.x > 0 && yx.y > 0)
+ else if (strchr("xc", d) && yx->y < original.y)
{
- yx.y--;
- yx.x--;
+ wrap_north_south++;
}
- return yx;
+ return (wrap_west_east != 0) + (wrap_north_south != 0);
}