/* Do not remove the headers from this file! see /USAGE for more info. */

#define SIZE 10

string array data;

int is_valid(int x, int y) {
    if (x < 0 || x >= SIZE) return 0;
    if (y < 0 || y >= SIZE) return 0;
    return 1;
}

int value(int x, int y) {
    if (!is_valid(x, y)) return '#';
    return data[x][y];
}

int dx(int i) {
    if (i == 1) return 1;
    if (i == 3) return -1;
    return 0;
}

int dy(int i) {
    if (i == 0) return -1;
    if (i == 2) return 1;
    return 0;
}

void create() {
    array valid = allocate(4);
    int x, y;
    
    data = allocate(SIZE);
    for (int i = 0; i < SIZE; i++) {
        data[i] = repeat_string(".", SIZE);
    }

    data[0][0] = '@';
    while (1) {
	int num_valid = 0;

	for (int i = 0; i < 4; i++) {
	    if (value(x + 2*dx(i), y + 2 * dy(i)) == '.')
		valid[num_valid++] = i;
	}
	if (num_valid) {
	    int d = valid[random(num_valid)];
	    
	    data[x+dx(d)][y+dy(d)] = ' ';
	    x += 2*dx(d);
	    y += 2*dy(d);
	    data[x][y] = (' ' + d);
	} else {
	    int last = data[x][y] - ' ';
	    if (last == ('@' - ' ')) {
		data[0][0] = ' ';
		break;
	    }
	    data[x][y] = ' ';
	    x -= 2*dx(last);
	    y -= 2*dy(last);
	}
    }
    foreach (string str in data) {
	write(str + "\n");
    }
}

object virtual_create(string arg) {
    int x, y;

    if (sscanf(arg, "%d,%d", x, y) != 2)
	return 0;
    return new(__DIR__ "Labroom", x, y, value(x,y-1), value(x+1,y), value(x,y+1), value(x-1,y));
}

int entrance_has_east() {
    return data[1][0] == ' ';
}

int entrance_has_south() {
    return data[0][1] == ' ';
}
