Add grotty casts to prevent negative -> large positive conversion of cursor
[sgt/puzzles] / sixteen.c
index 5b7b98e..f6215bd 100644 (file)
--- a/sixteen.c
+++ b/sixteen.c
@@ -14,6 +14,7 @@
 #include "puzzles.h"
 
 const char *const game_name = "Sixteen";
+const char *const game_winhelp_topic = "games.sixteen";
 const int game_can_configure = TRUE;
 
 #define TILE_SIZE 48
@@ -397,7 +398,7 @@ game_state *make_move(game_state *from, game_ui *ui, int x, int y, int button)
     int dx, dy, tx, ty, n;
     game_state *ret;
 
-    if (button != LEFT_BUTTON)
+    if (button != LEFT_BUTTON && button != RIGHT_BUTTON)
         return NULL;
 
     cx = FROMCOORD(x);
@@ -413,6 +414,13 @@ game_state *make_move(game_state *from, game_ui *ui, int x, int y, int button)
     else
         return NULL;                   /* invalid click location */
 
+    /* reverse direction if right hand button is pressed */
+    if (button == RIGHT_BUTTON)
+    {
+        dx = -dx; if (dx) cx = from->w - 1 - cx;
+        dy = -dy; if (dy) cy = from->h - 1 - cy;
+    }
+
     ret = dup_game(from);
 
     do {
@@ -567,7 +575,7 @@ static void draw_arrow(frontend *fe, int x, int y, int xdx, int xdy)
 }
 
 void game_redraw(frontend *fe, game_drawstate *ds, game_state *oldstate,
-                 game_state *state, game_ui *ui,
+                 game_state *state, int dir, game_ui *ui,
                  float animtime, float flashtime)
 {
     int i, bgcolour;
@@ -656,10 +664,12 @@ void game_redraw(frontend *fe, game_drawstate *ds, game_state *oldstate,
                float c;
                int sense;
 
-               if (oldstate && state->movecount < oldstate->movecount)
+               if (dir < 0) {
+                   assert(oldstate);
                    sense = -oldstate->last_movement_sense;
-               else
+               } else {
                    sense = state->last_movement_sense;
+               }
 
                t = state->tiles[i];
 
@@ -742,12 +752,12 @@ void game_redraw(frontend *fe, game_drawstate *ds, game_state *oldstate,
     }
 }
 
-float game_anim_length(game_state *oldstate, game_state *newstate)
+float game_anim_length(game_state *oldstate, game_state *newstate, int dir)
 {
     return ANIM_TIME;
 }
 
-float game_flash_length(game_state *oldstate, game_state *newstate)
+float game_flash_length(game_state *oldstate, game_state *newstate, int dir)
 {
     if (!oldstate->completed && newstate->completed)
         return 2 * FLASH_FRAME;