1 #include "xr_ai_version.h" 2 #include "xr_game_graph.h" 3 #include "xr_file_system.h" 4 #include "xr_utils.h" 5 6 using namespace xray_re; 7 ~xr_game_graph()8xr_game_graph::~xr_game_graph() 9 { 10 delete_elements(m_cross_tables); 11 } 12 load(xr_reader & r)13void xr_game_graph::load(xr_reader& r) 14 { 15 xr_level_graph::load(r); 16 if (m_version == AI_VERSION_8) { 17 xr_assert(m_num_death_points); 18 xr_assert(r.elapsed() == 4*m_num_levels); 19 r.advance(r.elapsed()); 20 } else if (m_version == AI_VERSION_9 || m_version == AI_VERSION_10) { 21 m_cross_tables.reserve(m_num_levels); 22 for (gg_level *it = m_levels, *end = it + m_num_levels; it != end; ++it) { 23 xr_level_gct* gct = new xr_level_gct; 24 gct->load_v9(r); 25 xr_assert(gct->version() == m_version); 26 xr_assert(gct->level_guid() == it->guid); 27 xr_assert(gct->game_guid() == m_guid); 28 m_cross_tables.push_back(gct); 29 } 30 xr_assert(r.elapsed() == 0); 31 } 32 } 33 save(xr_writer & w) const34void xr_game_graph::save(xr_writer& w) const 35 { 36 xr_level_graph::save(w); 37 if (m_version == AI_VERSION_8) { 38 xr_assert(m_num_death_points); 39 for (uint_fast32_t i = m_num_levels; i != 0; --i) 40 w.w_u32(sizeof(uint32_t)); 41 } else if (m_version == AI_VERSION_9 || m_version == AI_VERSION_10) { 42 for (xr_level_gct_vec_cit it = m_cross_tables.begin(), 43 end = m_cross_tables.end(); it != end; ++it) { 44 if (const xr_level_gct* gct = *it) 45 gct->save_v9(w); 46 else 47 w.w_u32(sizeof(uint32_t)); 48 } 49 } 50 } 51 load(const char * path,const char * name)52bool xr_game_graph::load(const char* path, const char* name) 53 { 54 xr_file_system& fs = xr_file_system::instance(); 55 xr_reader* r = fs.r_open(path, name); 56 if (r == 0) 57 return false; 58 load(*r); 59 fs.r_close(r); 60 return true; 61 } 62 save(const char * path,const char * name) const63bool xr_game_graph::save(const char* path, const char* name) const 64 { 65 xr_file_system& fs = xr_file_system::instance(); 66 xr_writer* w = fs.w_open(path, name); 67 if (w == 0) 68 return false; 69 save(*w); 70 fs.w_close(w); 71 return true; 72 } 73