Example #1
0
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;
}
Example #2
0
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;
}
Example #3
0
/**
 * いくつかの変換を組み合わせて盤面全体を変換する。
 * このとき、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;
}