home · contact · privacy
Server: Remove unneeded library includes.
[plomrogue] / src / server / yx_uint8.c
index 626f9b4c6672044b6214bd8d2822c2a4bcd07bd6..18355a21af5bb3cfdad4c3be432179c11e1461fa 100644 (file)
@@ -1,51 +1,79 @@
 /* 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 */
 
 
 
-extern uint8_t yx_uint8_cmp(struct yx_uint8 * a, struct yx_uint8 * b)
+/* 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 (a->y == b->y && a->x == b->x)
+    if     (d == 'e')
+    {
+        yx->x = yx->x + (yx->y % 2);
+        yx->y--;
+    }
+    else if (d == 'd')
+    {
+        yx->x++;
+    }
+    else if (d == 'c')
     {
-        return 1;
+        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--;
     }
-    return 0;
 }
 
 
 
-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 == 'e' && yx.y > 0        && (yx.x < UINT8_MAX || !(yx.y % 2)))
-    {
-        yx.x = yx.x + (yx.y % 2);
-        yx.y--;
-    }
-    else if (d == 'd' && yx.x < UINT8_MAX)
+    static int8_t wrap_west_east   = 0;
+    static int8_t wrap_north_south = 0;
+    if (unwrap)
     {
-        yx.x++;
+        wrap_west_east = wrap_north_south = 0;
+        return 0;
     }
-    else if (d == 'c' && yx.y < UINT8_MAX && (yx.x < UINT8_MAX || !(yx.y % 2)))
+    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.x = yx.x + (yx.y % 2);
-        yx.y++;
+        wrap_west_east++;
     }
-    else if (d == 'x' && yx.y < UINT8_MAX && (yx.x > 0 || yx.y % 2))
+    else if (strchr("xsw", d) && yx->x > original.x)
     {
-        yx.x = yx.x - !(yx.y % 2);
-        yx.y++;
+        wrap_west_east--;
     }
-    else if (d == 's' && yx.x > 0)
+    if      (strchr("we", d) && yx->y > original.y)
     {
-        yx.x--;
+        wrap_north_south--;
     }
-    else if (d == 'w' && yx.y > 0         && (yx.x > 0 || yx.y % 2))
+    else if (strchr("xc", d) && yx->y < original.y)
     {
-        yx.x = yx.x - !(yx.y % 2);
-        yx.y--;
+        wrap_north_south++;
     }
-    return yx;
+    return (wrap_west_east != 0) + (wrap_north_south != 0);
 }