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