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