Fix move validation in Netslide

The maximum length of a column move in Netslide is the height of the
puzzle, and the maximum length of a row move is the width, not the
other way around.

Moves of absolute length more than 1 can't be generated by
interpret_move(), but they can come from save files.  On non-square
grids, the incorrect check led to assertion failures: "0 <= tx && tx <
w" and "0 <= ty && ty < h".  This save file demonstrates the problem:

SAVEFILE:41:Simon Tatham's Portable Puzzle Collection
GAME    :8:Netslide
PARAMS  :3:4x9
CPARAMS :3:4x9
DESC    :39:0000000000000h0h0000000000000000000000v
NSTATES :1:2
STATEPOS:1:2
MOVE    :4:R0,5
This commit is contained in:
Ben Harris
2023-02-01 23:00:14 +00:00
parent 875f0af21f
commit ed0e4c304b

View File

@ -1137,8 +1137,8 @@ static game_state *execute_move(const game_state *from, const char *move)
if ((move[0] == 'C' || move[0] == 'R') && if ((move[0] == 'C' || move[0] == 'R') &&
sscanf(move+1, "%d,%d", &c, &d) == 2 && sscanf(move+1, "%d,%d", &c, &d) == 2 &&
c >= 0 && c < (move[0] == 'C' ? from->width : from->height) && c >= 0 && c < (move[0] == 'C' ? from->width : from->height) &&
d <= (move[0] == 'C' ? from->width : from->height) && d <= (move[0] == 'C' ? from->height : from->width) &&
d >= -(move[0] == 'C' ? from->width : from->height) && d != 0) { d >= -(move[0] == 'C' ? from->height : from->width) && d != 0) {
col = (move[0] == 'C'); col = (move[0] == 'C');
} else if (move[0] == 'S' && } else if (move[0] == 'S' &&
strlen(move) == from->width * from->height + 1) { strlen(move) == from->width * from->height + 1) {