1 #ifndef __GNUC__
2 #pragma once
3 #endif
4 #ifndef __SYNCER_H__
5 #define __SYNCER_H__
6
7 #include "xr_ini_file.h"
8
9 enum {
10 SYNC_BUILD_AIMAP = 0x00000001,
11 SYNC_BUILD_CFORM = 0x00000002,
12 SYNC_BUILD_PRJ = 0x00000004,
13 SYNC_LEVEL_AI = 0x00000008,
14 SYNC_LEVEL_GCT = 0x00000010,
15 SYNC_LEVEL_GCT_RAW = 0x00000020,
16 SYNC_LEVEL_GRAPH = 0x00000040,
17 SYNC_LEVEL_SPAWN = 0x00000080,
18 SYNC_LEVEL_SECTORS_AI = 0x00000100,
19
20 SYNC_GAME_LTX = 0x00000200,
21 SYNC_GAME_GRAPH = 0x00000400,
22 SYNC_GAME_SPAWN = 0x00000800,
23
24 SYNC_LEVEL = 0x000001ff,
25 SYNC_GAME = 0x00000e00,
26 SYNC_ALL = SYNC_LEVEL|SYNC_GAME,
27
28 SYNC_FORCE = 0x80000000,
29 };
30
31 const char PA2215_FS_ROOT[] = "$2215_fs_root$";
32 const char PA2215_GAME_DATA[] = "$2215_game_data$";
33 const char PA2215_GAME_CONFIG[] = "$2215_game_config$";
34 const char PA2215_GAME_SPAWN[] = "$2215_game_spawn$";
35 const char PA2215_GAME_LEVELS[] = "$2215_game_levels$";
36 const char PA2215_LEVEL[] = "$2215_level$";
37
38 const char PA9_FS_ROOT[] = "$cs_fs_root$";
39 const char PA9_GAME_DATA[] = "$cs_game_data$";
40 const char PA9_GAME_CONFIG[] = "$cs_game_config$";
41 const char PA9_GAME_SPAWN[] = "$cs_game_spawn$";
42 const char PA9_GAME_LEVELS[] = "$cs_game_levels$";
43 const char PA9_LEVEL[] = "$cs_level$";
44
45 const char PA10_FS_ROOT[] = "$cop_fs_root$";
46 const char PA10_GAME_DATA[] = "$cop_game_data$";
47 const char PA10_GAME_CONFIG[] = "$cop_game_config$";
48 const char PA10_GAME_SPAWN[] = "$cop_game_spawn$";
49 const char PA10_GAME_LEVELS[] = "$cop_game_levels$";
50 const char PA10_LEVEL[] = "$cop_level$";
51
52 namespace xray_re {
53 class cse_abstract;
54 class xr_writer;
55 class xr_level_ai;
56 class xr_level_gct;
57 class xr_level_game;
58 class xr_level_spawn;
59 class xr_game_spawn;
60 };
61
62 class syncer {
63 public:
64 syncer();
65
66 void check_fs_paths() const;
67
68 void load_ini(const char* path);
69 void load_links_ini(const char* path);
70
71 void split_spawns(bool use_orig_gp) const;
72 void split_paths() const;
73 void check_paths() const;
74 void split_graphs();
75 void dump_links(const char* path);
76 void upgrade(int bld_ver);
77
78 void to_xrai(unsigned flags);
79 void to_xrai(const char* name, unsigned flags);
80 void from_xrai(unsigned flags);
81 void from_xrai(const char* name, unsigned flags);
82
83 class sync_error {};
84
85 private:
86 enum sync_target {
87 SYNC_TARGET_XRAI = 0,
88 SYNC_TARGET_FINAL = 1,
89 };
90
91 void scan_levels();
92
93 void sync_build_aimap();
94 void sync_build_cform();
95 void sync_build_prj();
96 void sync_level_ai();
97 void sync_level_gct();
98 void sync_level_gct_raw();
99 void sync_level_graph();
100 void sync_level_spawn(const char* name);
101 void sync_level_sectors_ai();
102 void sync_game_ltx(const char* name);
103 void sync_game_graph();
104 void sync_game_spawn();
105
106 void set_target(sync_target target, unsigned flags);
107
108 void do_sync(const char* name);
109 void do_sync();
110
111 bool up_to_date(const char* src_path, const char* src_name,
112 const char* tgt_path, const char* tgt_name = 0);
113
114 const char* level_name(size_t level_idx) const;
115
116 void update_tgt_level_path(const char* name);
117
118 // level.game utils
119 bool load_mp_rpoints(xray_re::xr_level_game& game,
120 const char* path, const char* name) const;
121
122 // graph cross table utils
123 void to_raw(xray_re::xr_level_gct& gct) const;
124
125 // level spawn utils
126 void to_xrai_compat(xray_re::xr_level_spawn& spawn,
127 const xray_re::xr_ini_file& ini, const char* section);
128 void edit_links(xray_re::xr_level_spawn& spawn,
129 const xray_re::xr_ini_file& ini, const char* section);
130 void dump_links(xray_re::xr_level_spawn& spawn,
131 xray_re::xr_writer& w, const char* section);
132 bool load_graph_points(xray_re::xr_level_spawn& spawn,
133 const char* path, const char* name) const;
134
135 // game spawn/game graph utils
136 bool add_level(xray_re::xr_game_spawn& gspawn, const char* name,
137 xray_re::xr_level_spawn& spawn,
138 const xray_re::xr_level_game& game,
139 const xray_re::xr_level_ai& ai,
140 const xray_re::xr_level_gct& gct);
141 void merge_spawns(std::vector<xray_re::cse_abstract*>& spawns,
142 xray_re::xr_reader& r) const;
143 bool merge_xrai_compat(xray_re::xr_game_spawn& gspawn,
144 const char* path, const char* name) const;
145 bool split_spawns(xray_re::xr_game_spawn& gspawn,
146 xray_re::xr_level_spawn* by_level_id[]) const;
147 bool split_paths(xray_re::xr_game_spawn& gspawn,
148 xray_re::xr_level_game* by_level_id[],
149 const xray_re::xr_ini_file& ini) const;
150 void check_paths(xray_re::xr_game_spawn& gspawn) const;
151 bool import_cross_table(xray_re::xr_game_spawn& gspawn,
152 const xray_re::xr_level_gct& gct) const;
153
154 bool move_actor(std::vector<xray_re::cse_abstract*>& spawns,
155 float x, float y, float z,
156 uint32_t node_id, uint16_t graph_id) const;
157
158 private:
159 bool m_scan_done;
160 bool m_xrai_compat;
161 unsigned m_flags;
162
163 size_t m_num_levels;
164 xray_re::xr_ini_file m_levels_ini; // game_levels.ltx
165
166 xray_re::xr_ini_file m_ini; // aiwrapper.ini
167 xray_re::xr_ini_file m_links_ini;
168
169 const char* m_actor_level;
170
171 const char* m_src_game_data; // source path alias
172 const char* m_src_game_spawn;
173 const char* m_src_game_levels;
174 const char* m_src_level;
175 const char* m_tgt_game_data; // target path alias
176 const char* m_tgt_game_spawn;
177 const char* m_tgt_game_levels;
178 const char* m_tgt_level;
179
180 // just for printing, no real use
181 char m_src_level_path[256];
182 char m_tgt_level_path[256];
183 };
184
syncer()185 inline syncer::syncer(): m_scan_done(false), m_xrai_compat(true), m_flags(0),
186 m_num_levels(0), m_actor_level(0) {}
187
188 #endif
189