- uint8_t wraptest = mv_yx_in_dir_wrap(dir, yx);
- if (yx && !wraptest && yx->x < world.map.length && yx->y < world.map.length)
+ static int8_t wrap_west_east = 0;
+ static int8_t wrap_north_south = 0;
+ if (!yx)
+ {
+ wrap_west_east = wrap_north_south = 0;
+ return 0;
+ }
+ char * err = "Too much wrapping in mv_yx_in_dir_legal().";
+ exit_err( INT8_MIN == wrap_west_east || INT8_MIN == wrap_north_south
+ || INT8_MAX == wrap_west_east || INT8_MAX == wrap_north_south,err);
+ struct yx_uint8 original = *yx;
+ mv_yx_in_dir(dir, yx);
+ if (('e' == dir || 'd' == dir || 'c' == dir) && yx->x < original.x)
+ {
+ wrap_west_east++;
+ }
+ else if (('x' == dir || 's' == dir || 'w' == dir) && yx->x > original.x)
+ {
+ wrap_west_east--;
+ }
+ if (('w' == dir || 'e' == dir) && yx->y > original.y)
+ {
+ wrap_north_south--;
+ }
+ else if (('x' == dir || 'c' == dir) && yx->y < original.y)
+ {
+ wrap_north_south++;
+ }
+ if ( !wrap_west_east && !wrap_north_south
+ && yx->x < world.map.length && yx->y < world.map.length)