void generate_coin_maze()

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;
  }