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