bool undo(void) { struct change *change = buffer->cur_change; view_reset_preferred_x(view); if (!change->next) return false; if (is_change_chain_barrier(change)) { int count = 0; while (1) { change = change->next; if (is_change_chain_barrier(change)) break; reverse_change(change); count++; } if (count > 1) info_msg("Undid %d changes.", count); } else { reverse_change(change); } buffer->cur_change = change->next; return true; }
bool redo(unsigned int change_id) { struct change *change = buffer->cur_change; view_reset_preferred_x(view); if (!change->prev) { /* don't complain if change_id is 0 */ if (change_id) error_msg("Nothing to redo."); return false; } if (change_id) { if (--change_id >= change->nr_prev) { error_msg("There are only %d possible changes to redo.", change->nr_prev); return false; } } else { /* default to newest change */ change_id = change->nr_prev - 1; if (change->nr_prev > 1) info_msg("Redoing newest (%d) of %d possible changes.", change_id + 1, change->nr_prev); } change = change->prev[change_id]; if (is_change_chain_barrier(change)) { int count = 0; while (1) { change = change->prev[change->nr_prev - 1]; if (is_change_chain_barrier(change)) break; reverse_change(change); count++; } if (count > 1) info_msg("Redid %d changes.", count); } else { reverse_change(change); } buffer->cur_change = change; return true; }
/** * いくつかの変換を組み合わせて盤面全体を変換する。 * このとき、X-Wing や Sword Fish などの解法はそのまま適用できるようにする。 * また、盤面の固定点の対称性は崩さないようにする。 * @param array ナンプレ盤面配列 * @return 常に 0 */ int random_convert(numpl_array * array) { random_symbol(array); int r = get_random(4); if (r != 3) { reverse_change(array, r); } r = get_random(3); if (r != 2) { block_reverse(array, r); } r = get_random(3); if (r != 2) { line_change(array, r); } return 0; }