in procgen/src/games/heist.cpp [115:203]
void game_reset() override {
BasicAbstractGame::game_reset();
int min_maze_dim = 5;
int max_diff = (world_dim - min_maze_dim) / 2;
int difficulty = rand_gen.randn(max_diff + 1);
options.center_agent = options.distribution_mode == MemoryMode;
if (options.distribution_mode == MemoryMode) {
num_keys = rand_gen.randn(4);
} else {
num_keys = difficulty + rand_gen.randn(2);
}
if (num_keys > 3)
num_keys = 3;
has_keys.clear();
for (int i = 0; i < num_keys; i++) {
has_keys.push_back(false);
}
int maze_dim = difficulty * 2 + min_maze_dim;
float maze_scale = main_height / (world_dim * 1.0);
agent->rx = .375 * maze_scale;
agent->ry = .375 * maze_scale;
float r_ent = maze_scale / 2;
maze_gen = std::make_shared<MazeGen>(&rand_gen, maze_dim);
maze_gen->generate_maze_with_doors(num_keys);
// move agent out of the way for maze generation
agent->x = -1;
agent->y = -1;
int off_x = rand_gen.randn(world_dim - maze_dim + 1);
int off_y = rand_gen.randn(world_dim - maze_dim + 1);
for (int i = 0; i < grid_size; i++) {
set_obj(i, WALL_OBJ);
}
for (int i = 0; i < maze_dim; i++) {
for (int j = 0; j < maze_dim; j++) {
int x = off_x + i;
int y = off_y + j;
int obj = maze_gen->grid.get(i + MAZE_OFFSET, j + MAZE_OFFSET);
float obj_x = (x + .5) * maze_scale;
float obj_y = (y + .5) * maze_scale;
if (obj != WALL_OBJ) {
set_obj(x, y, SPACE);
}
if (obj >= KEY_OBJ) {
auto ent = spawn_entity(.375 * maze_scale, KEY, maze_scale * x, maze_scale * y, maze_scale, maze_scale);
ent->image_theme = obj - KEY_OBJ - 1;
match_aspect_ratio(ent);
} else if (obj >= DOOR_OBJ) {
auto ent = add_entity(obj_x, obj_y, 0, 0, r_ent, LOCKED_DOOR);
ent->image_theme = obj - DOOR_OBJ - 1;
} else if (obj == EXIT_OBJ) {
auto ent = spawn_entity(.375 * maze_scale, EXIT, maze_scale * x, maze_scale * y, maze_scale, maze_scale);
match_aspect_ratio(ent);
} else if (obj == AGENT_OBJ) {
agent->x = obj_x;
agent->y = obj_y;
}
}
}
float ring_key_r = 0.03f;
for (int i = 0; i < num_keys; i++) {
auto ent = add_entity(1 - ring_key_r * (2 * i + 1.25), ring_key_r * .75, 0, 0, ring_key_r, KEY_ON_RING);
ent->image_theme = i;
ent->image_type = KEY;
ent->rotation = PI / 2;
ent->render_z = 1;
ent->use_abs_coords = true;
match_aspect_ratio(ent);
}
}