in procgen/src/game.cpp [170:229]
void Game::serialize(WriteBuffer *b) {
b->write_int(SERIALIZE_VERSION);
b->write_string(game_name);
b->write_int(options.paint_vel_info);
b->write_int(options.use_generated_assets);
b->write_int(options.use_monochrome_assets);
b->write_int(options.restrict_themes);
b->write_int(options.use_backgrounds);
b->write_int(options.center_agent);
b->write_int(options.debug_mode);
b->write_int(options.distribution_mode);
b->write_int(options.use_sequential_levels);
b->write_int(options.use_easy_jump);
b->write_int(options.plain_assets);
b->write_int(options.physics_mode);
b->write_int(grid_step);
b->write_int(level_seed_low);
b->write_int(level_seed_high);
b->write_int(game_type);
b->write_int(game_n);
level_seed_rand_gen.serialize(b);
rand_gen.serialize(b);
b->write_float(step_data.reward);
b->write_int(step_data.done);
b->write_int(step_data.level_complete);
b->write_int(action);
b->write_int(timeout);
b->write_int(current_level_seed);
b->write_int(prev_level_seed);
b->write_int(episodes_remaining);
b->write_int(episode_done);
b->write_int(last_reward_timer);
b->write_float(last_reward);
b->write_int(default_action);
b->write_int(fixed_asset_seed);
// don't save render buf as we will just re-write it on next observation
// uint32_t render_buf[RES_W * RES_H];
b->write_int(cur_time);
b->write_int(is_waiting_for_step);
// don't serialize these, since they are pointers, and will likely have incorrect values
// if deserialized into another game object
// int32_t *action_ptr;
// std::vector<void *> obs_bufs;
// std::vector<void *> info_bufs;
// float *reward_ptr = nullptr;
// uint8_t *first_ptr = nullptr;
}