home · contact · privacy
Server: Remove unneeded library includes.
[plomrogue] / src / server / yx_uint8.c
index 06fa81db7707cf9240280d328a3a4afc4317d684..18355a21af5bb3cfdad4c3be432179c11e1461fa 100644 (file)
@@ -1,59 +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)
-{
-    if (a->y == b->y && a->x == b->x)
-    {
-        return 1;
-    }
-    return 0;
-}
+/* Move "yx" into hex direction "d". */
+static void mv_yx_in_hex_dir(char d, struct yx_uint8 * yx);
 
 
 
-extern struct yx_uint8 mv_yx_in_dir(char d, struct yx_uint8 yx)
+static void mv_yx_in_hex_dir(char d, struct yx_uint8 * yx)
 {
-    if      (d == '8' && yx.y > 0)
+    if     (d == 'e')
+    {
+        yx->x = yx->x + (yx->y % 2);
+        yx->y--;
+    }
+    else if (d == 'd')
+    {
+        yx->x++;
+    }
+    else if (d == 'c')
     {
-        yx.y--;
+        yx->x = yx->x + (yx->y % 2);
+        yx->y++;
     }
-    else if (d == '9' && yx.y > 0 && yx.x < UINT8_MAX)
+    else if (d == 'x')
     {
-        yx.y--;
-        yx.x++;
+        yx->x = yx->x - !(yx->y % 2);
+        yx->y++;
     }
-    else if (d == '6' && yx.x < UINT8_MAX)
+    else if (d == 's')
     {
-        yx.x++;
+        yx->x--;
     }
-    else if (d == '3' && yx.x < UINT8_MAX && yx.y < UINT8_MAX)
+    else if (d == 'w')
+    {
+        yx->x = yx->x - !(yx->y % 2);
+        yx->y--;
+    }
+}
+
+
+
+extern uint8_t mv_yx_in_dir_wrap(char d, struct yx_uint8 * yx, uint8_t unwrap)
+{
+    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);
 }