in procgen/src/games/miner.cpp [132:200]
void game_reset() override {
BasicAbstractGame::game_reset();
agent->rx = .5;
agent->ry = .5;
int main_area = main_height * main_width;
options.center_agent = options.distribution_mode == MemoryMode;
grid_step = true;
float diamond_pct = 12 / 400.0f;
float boulder_pct = 80 / 400.0f;
int num_diamonds = (int)(diamond_pct * grid_size);
int num_boulders = (int)(boulder_pct * grid_size);
std::vector<int> obj_idxs = rand_gen.simple_choose(main_area, num_diamonds + num_boulders + 1);
int agent_x = obj_idxs[0] % main_width;
int agent_y = obj_idxs[0] / main_width;
agent->x = agent_x + .5;
agent->y = agent_y + .5;
for (int i = 0; i < main_area; i++) {
set_obj(i, DIRT);
}
for (int i = 0; i < num_diamonds; i++) {
int cell = obj_idxs[i + 1];
set_obj(cell, DIAMOND);
}
for (int i = 0; i < num_boulders; i++) {
int cell = obj_idxs[i + 1 + num_diamonds];
set_obj(cell, BOULDER);
}
std::vector<int> dirt_cells = get_cells_with_type(DIRT);
set_obj(int(agent->x), int(agent->y), SPACE);
for (int i = -1; i <= 1; i++) {
for (int j = -1; j <= 1; j++) {
int ox = agent_x + i;
int oy = agent_y + j;
if (get_obj(ox, oy) == BOULDER) {
set_obj(ox, oy, DIRT);
}
}
}
std::vector<int> exit_candidates;
for (int cell : dirt_cells) {
int above_obj = get_obj(cell + main_width);
if (above_obj == DIRT || above_obj == out_of_bounds_object) {
exit_candidates.push_back(cell);
}
}
fassert(exit_candidates.size() > 0);
int exit_cell = exit_candidates[rand_gen.randn((int)(exit_candidates.size()))];
set_obj(exit_cell, SPACE);
auto exit = add_entity((exit_cell % main_width) + .5, (exit_cell / main_width) + .5, 0, 0, .5, EXIT);
exit->render_z = -1;
}