X-Git-Url: https://plomlompom.com/repos/?a=blobdiff_plain;f=src%2Fserver%2Fyx_uint8.c;h=18355a21af5bb3cfdad4c3be432179c11e1461fa;hb=f6615d3be438bbca4997c38c546c0d8724da80d4;hp=626f9b4c6672044b6214bd8d2822c2a4bcd07bd6;hpb=bc117a9e8e2d69fcad8c8955ae8237b3476bf67b;p=plomrogue diff --git a/src/server/yx_uint8.c b/src/server/yx_uint8.c index 626f9b4..18355a2 100644 --- a/src/server/yx_uint8.c +++ b/src/server/yx_uint8.c @@ -1,51 +1,79 @@ /* 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 */ -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); }