1 #include "xr_ai_version.h"
2 #include "xr_ai_cross_table.h"
3 #include "xr_level_gct.h"
4 #include "xr_file_system.h"
5
6 using namespace xray_re;
7
xr_level_gct()8 xr_level_gct::xr_level_gct(): m_version(AI_VERSION_8),
9 m_num_nodes(0), m_num_graph_points(0), m_cells(0)
10 {
11 m_level_guid.reset();
12 m_game_guid.reset();
13 }
14
xr_level_gct(const xr_level_gct & that)15 xr_level_gct::xr_level_gct(const xr_level_gct& that)
16 {
17 m_version = that.m_version;
18 m_num_graph_points = that.m_num_graph_points;
19 m_level_guid = that.m_level_guid;
20 m_game_guid = that.m_game_guid;
21 if (that.m_cells) {
22 m_cells = new gct_cell[m_num_nodes = that.m_num_nodes];
23 #if defined(_MSC_VER) && _MSC_VER >= 1400 && _MSC_VER < 1600
24 stdext::unchecked_uninitialized_copy(that.m_cells, that.m_cells + that.m_num_nodes, m_cells);
25 #else
26 std::uninitialized_copy(that.m_cells, that.m_cells + that.m_num_nodes, m_cells);
27 #endif
28 } else {
29 m_num_nodes = 0;
30 m_cells = 0;
31 }
32 }
33
~xr_level_gct()34 xr_level_gct::~xr_level_gct()
35 {
36 delete[] m_cells;
37 }
38
load(xr_reader & r)39 void xr_level_gct::load(xr_reader& r)
40 {
41 if (!r.find_chunk(GCT_CHUNK_HEADER))
42 xr_not_expected();
43 m_version = r.r_u32();
44 // v9 is always embedded into game graph and handled there
45 xr_assert(m_version == AI_VERSION_8);
46 m_num_nodes = r.r_u32();
47 m_num_graph_points = r.r_u32();
48 m_level_guid.load(r);
49 m_game_guid.load(r);
50 r.debug_find_chunk();
51
52 if (!r.find_chunk(GCT_CHUNK_CELLS))
53 xr_not_expected();
54 r.r_cseq(m_num_nodes, m_cells = new gct_cell[m_num_nodes], gct_cell_io());
55 r.debug_find_chunk();
56 }
57
save(xr_writer & w) const58 void xr_level_gct::save(xr_writer& w) const
59 {
60 w.open_chunk(GCT_CHUNK_HEADER);
61 w.w_u32(m_version);
62 w.w_u32(m_num_nodes);
63 w.w_u32(m_num_graph_points);
64 m_level_guid.save(w);
65 m_game_guid.save(w);
66 w.close_chunk();
67
68 w.open_chunk(GCT_CHUNK_CELLS);
69 w.w_cseq(m_num_nodes, m_cells, gct_cell_io());
70 w.close_chunk();
71 }
72
load(const char * path,const char * name)73 bool xr_level_gct::load(const char* path, const char* name)
74 {
75 xr_file_system& fs = xr_file_system::instance();
76 xr_reader* r = fs.r_open(path, name);
77 if (r == 0)
78 return false;
79 load(*r);
80 fs.r_close(r);
81 return true;
82 }
83
save(const char * path,const char * name) const84 bool xr_level_gct::save(const char* path, const char* name) const
85 {
86 xr_file_system& fs = xr_file_system::instance();
87 xr_writer* w = fs.w_open(path, name);
88 if (w == 0)
89 return false;
90 save(*w);
91 fs.w_close(w);
92 return true;
93 }
94