X-Git-Url: https://plomlompom.com/repos/foo.html?a=blobdiff_plain;ds=inline;f=src%2Fserver%2Fyx_uint8.c;h=c6a816dbc31ed355c4dc4906b4752c52ed6a6b72;hb=58486c337a7b1f04311801d902fed41ed3f67315;hp=8d47c82e505d85ec275bfaf98b1bf3dfc2a4e760;hpb=6b1d36c9e673fd8f8595119080dca63a39ba483b;p=plomrogue
diff --git a/src/server/yx_uint8.c b/src/server/yx_uint8.c
index 8d47c82..c6a816d 100644
--- a/src/server/yx_uint8.c
+++ b/src/server/yx_uint8.c
@@ -1,8 +1,48 @@
/* src/server/yx_uint8.c */
#include "yx_uint8.h"
-#include /* uint8_t, UINT8_MAX */
-#include "../common/yx_uint8.h" /* yx_uint8 struct */
+#include /* uint8_t, int8_t */
+#include /* 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);
}