in coinrun/coinrun.cpp [362:436]
void generate_coin_maze() {
dif = choose_difficulty(MAX_MAZE_DIFFICULTY);
maze_dim = 2 * (randn(3) + 3 * (dif - 1) + 1) + 1;
maze->fill_elem(0, 0, maze_dim + 2, maze_dim + 2, WALL_MIDDLE);
maze->fill_elem(MAZE_OFFSET, MAZE_OFFSET, 1, 1, SPACE);
std::vector<Wall> walls;
num_free_cells = 0;
std::set<int> s0;
s0.insert(0);
cell_sets[0] = s0;
for (int i = 1; i < maze_dim * maze_dim; i++) {
std::set<int> s1;
s1.insert(i);
cell_sets[i] = s1;
}
for (int i = 1; i < maze_dim; i += 2) {
for (int j = 0; j < maze_dim; j += 2) {
if (i > 0 && i < maze_dim - 1) {
walls.push_back(Wall({i-1,j,i+1,j}));
}
}
}
for (int i = 0; i < maze_dim; i += 2) {
for (int j = 1; j < maze_dim; j += 2) {
if (j > 0 && j < maze_dim - 1) {
walls.push_back(Wall({i,j-1,i,j+1}));
}
}
}
while (walls.size() > 0) {
int n = randn(walls.size());
Wall wall = walls[n];
s0 = lookup(cell_sets, wall.x1, wall.y1);
std::set<int> s1 = lookup(cell_sets, wall.x2, wall.y2);
int x0 = (wall.x1 + wall.x2) / 2;
int y0 = (wall.y1 + wall.y2) / 2;
int center = maze_dim*y0 + x0;
int p1 = maze_dim*wall.y1 + wall.x1;
bool can_remove = is_maze_wall(x0, y0) && (s0 != s1);
if (can_remove) {
set_free_cell(wall.x1, wall.y1);
set_free_cell(x0, y0);
set_free_cell(wall.x2, wall.y2);
s1.insert(s0.begin(), s0.end());
s1.insert(center);
for (int child : s1) {
cell_sets[child] = s1;
}
}
walls.erase(walls.begin() + n);
}
int m = randn(num_free_cells);
int coin_cell = free_cells[m];
maze->set_elem(coin_cell % maze_dim + MAZE_OFFSET, coin_cell / maze_dim + MAZE_OFFSET, COIN_OBJ1);
maze->spawnpos[0] = MAZE_OFFSET;
maze->spawnpos[1] = MAZE_OFFSET;
maze->coins = 1;
}