home · contact · privacy
Server: Refactor yx_uint8 moving; handle actors hitting the map edge.
[plomrogue] / src / server / yx_uint8.c
index 626f9b4c6672044b6214bd8d2822c2a4bcd07bd6..c6a816dbc31ed355c4dc4906b4752c52ed6a6b72 100644 (file)
@@ -1,8 +1,48 @@
 /* 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--;
+    }
+}
 
 
 
@@ -17,35 +57,34 @@ extern uint8_t yx_uint8_cmp(struct yx_uint8 * a, struct yx_uint8 * b)
 
 
 
-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);
 }