1 #include "xr_level_version.h"
2 #include "xr_level_sectors.h"
3 #include "xr_reader.h"
4 #include "xr_writer.h"
5 #include "xr_utils.h"
6 
7 using namespace xray_re;
8 
~xr_level_sectors()9 xr_level_sectors::~xr_level_sectors()
10 {
11 	delete_elements(m_sectors);
12 }
13 
operator ()read_sector_v514 struct read_sector_v5 { void operator()(sector_data*& _sector, xr_reader& r) const {
15 	sector_data* sector = new sector_data;
16 	_sector = sector;
17 	if (!r.r_chunk(FSP_ROOT, sector->root))
18 		xr_not_expected();
19 	size_t size = r.find_chunk(FSP_PORTALS);
20 	xr_assert(size == 0 || (size % sizeof(uint16_t) == 0));
21 	r.r_seq(size/sizeof(uint16_t), sector->portals);
22 }};
23 
load_v5(xr_reader & r)24 void xr_level_sectors::load_v5(xr_reader& r)
25 {
26 	// FIXME: not all fields handled.
27 	r.r_chunks(m_sectors, read_sector_v5());
28 }
29 
operator ()read_sector_v1330 struct read_sector_v13 { void operator()(sector_data*& _sector, xr_reader& r) const {
31 	sector_data* sector = new sector_data;
32 	_sector = sector;
33 	if (!r.r_chunk(FSP_ROOT, sector->root))
34 		xr_not_expected();
35 	size_t size = r.find_chunk(FSP_PORTALS);
36 	xr_assert(size == 0 || (size % sizeof(uint16_t) == 0));
37 	r.r_seq(size/sizeof(uint16_t), sector->portals);
38 }};
39 
load_v13(xr_reader & r)40 void xr_level_sectors::load_v13(xr_reader& r)
41 {
42 	r.r_chunks(m_sectors, read_sector_v13());
43 }
44 
load(uint32_t xrlc_version,xr_reader & r)45 void xr_level_sectors::load(uint32_t xrlc_version, xr_reader& r)
46 {
47 	xr_reader* s = 0;
48 	if (xrlc_version <= XRLC_VERSION_9) {
49 		if (xrlc_version == XRLC_VERSION_5)
50 			s = r.open_chunk(FSL5_SECTORS);
51 		else
52 			s = r.open_chunk(FSL8_SECTORS);
53 		xr_assert(s);
54 		load_v5(*s);
55 	} else {
56 		xr_reader* s = r.open_chunk(FSL13_SECTORS);
57 		xr_assert(s);
58 		load_v13(*s);
59 	}
60 	r.close_chunk(s);
61 }
62 
save(xr_writer & w) const63 void xr_level_sectors::save(xr_writer& w) const
64 {
65 }
66