+/* reset the player data, from the new file */
+void reset_player_data (MainPlayerData *app_data, const char *filename)
+{
+ app_data->puzzle = load_puzzle (filename);
+
+ app_data->is_loaded = app_data->puzzle.grid_frozen;
+ app_data->cur_col = -1;
+ app_data->cur_row = -1;
+ strcpy (app_data->filename, filename);
+ /* reset the answer keys */
+ for (int i = 0; i < app_data->puzzle.grid_size; i ++)
+ for (int j = 0; j < app_data->puzzle.grid_size; j ++)
+ app_data->char_ans[i][j] = ' ';
+
+}
+
+/* in the player app, move the current selection index left or right */
+void move_current_col (MainPlayerData *app_data, enum DIRECTION dir)
+{
+ int r = app_data->cur_row;
+ int c = app_data->cur_col;
+ if (dir == DIR_FORWARD)
+ {
+ c ++;
+ while (c < app_data->puzzle.grid_size)
+ {
+ if (app_data->puzzle.chars[r][c] == '#')
+ c ++;
+ else
+ break;
+ }
+ if (c < app_data->puzzle.grid_size)
+ app_data->cur_col = c;
+ }
+ else
+ {
+ c --;
+ while (c >= 0)
+ {
+ if (app_data->puzzle.chars[r][c] == '#')
+ c --;
+ else
+ break;
+ }
+ if (c >= 0)
+ app_data->cur_col = c;
+ }
+}
+
+/* in the player app move the current selection index up or down */
+void move_current_row (MainPlayerData *app_data, enum DIRECTION dir)
+{
+ int r = app_data->cur_row;
+ int c = app_data->cur_col;
+ if (dir == DIR_FORWARD)
+ {
+ r ++;
+ while (r < app_data->puzzle.grid_size)
+ {
+ if (app_data->puzzle.chars[r][c] == '#')
+ r ++;
+ else
+ break;
+ }
+ if (r < app_data->puzzle.grid_size)
+ app_data->cur_row = r;
+ }
+ else
+ {
+ r --;
+ while (r >= 0)
+ {
+ if (app_data->puzzle.chars[r][c] == '#')
+ r --;
+ else
+ break;
+ }
+ if (r >= 0)
+ app_data->cur_row = r;
+ }
+}
+