1 #include <algorithm>
2 #include "xr_entity_factory.h"
3 #include "xr_entity_script.h"
4 #include "xr_entity_zenobian.h"
5 #include "xr_file_system.h"
6 #include "xr_ini_file.h"
7 #include "xr_utils.h"
8 #include "xr_entity_la.h"
9 
10 using namespace xray_re;
11 
12 class factory_item_base {
13 public:
14 				factory_item_base(const char* clsid);
15 	virtual			~factory_item_base();
16 	virtual cse_abstract*	create() = 0;
17 	const xr_clsid&		clsid() const;
18 protected:
19 	xr_clsid		m_clsid;
20 };
21 
factory_item_base(const char * clsid)22 inline factory_item_base::factory_item_base(const char* clsid): m_clsid(clsid) {}
~factory_item_base()23 inline factory_item_base::~factory_item_base() {}
24 
clsid() const25 inline const xr_clsid& factory_item_base::clsid() const { return m_clsid; }
26 
27 template<class T> class factory_item: public factory_item_base {
28 public:
29 				factory_item(const char* clsid);
30 	virtual cse_abstract*	create();
31 };
32 
factory_item(const char * clsid)33 template<class T> inline factory_item<T>::factory_item(const char* clsid):
34 	factory_item_base(clsid) {}
35 
create()36 template<class T> cse_abstract* factory_item<T>::create()
37 {
38 	T* p = new T;
39 	p->clsid() = clsid();
40 	return p;
41 }
42 
43 class xr_entity_factory {
44 public:
45 			xr_entity_factory();
46 			~xr_entity_factory();
47 	cse_abstract*	create(const char* name);
48 	xr_clsid*		get_entity_clsid(const char* name);
49 	void		load_system_ini(const char* game_config);
50 private:
51 	void		init();
52 
53 private:
54 	const char*			m_game_config;
55 	xr_ini_file*			m_system_ini;
56 	std::vector<factory_item_base*>	m_clsids;
57 };
58 
xr_entity_factory()59 xr_entity_factory::xr_entity_factory(): m_system_ini(0)
60 {
61 	init();
62 }
63 
~xr_entity_factory()64 xr_entity_factory::~xr_entity_factory()
65 {
66 	delete m_system_ini;
67 	delete_elements(m_clsids);
68 }
69 
70 static xr_entity_factory g_entity_factory;
71 
operator ()clsid_pred72 struct clsid_pred { bool operator()(const factory_item_base* l, const factory_item_base* r) const {
73 	return l->clsid() < r->clsid();
74 }};
75 
init()76 void xr_entity_factory::init()
77 {
78 	// engine classes
79 	m_clsids.push_back(new factory_item<cse_alife_graph_point>("AI_GRAPH"));
80 	m_clsids.push_back(new factory_item<cse_alife_online_offline_group>("ON_OFF_G"));
81 	m_clsids.push_back(new factory_item<se_actor>("O_ACTOR"));	// was cse_alife_creature_actor in SoC
82 //	m_clsids.push_back(new factory_item<cse_spectator>("SPECT"));
83 	m_clsids.push_back(new factory_item<cse_alife_monster_base>("AI_FLESH"));
84 	m_clsids.push_back(new factory_item<cse_alife_monster_base>("AI_HIMER"));
85 	m_clsids.push_back(new factory_item<cse_alife_monster_base>("AI_DOG_R"));
86 	m_clsids.push_back(new factory_item<cse_alife_human_stalker>("AI_STL"));
87 	m_clsids.push_back(new factory_item<cse_alife_monster_base>("AI_BLOOD"));
88 	m_clsids.push_back(new factory_item<cse_alife_monster_base>("AI_BOAR"));
89 	m_clsids.push_back(new factory_item<cse_alife_monster_base>("AI_DOG_B"));
90 	m_clsids.push_back(new factory_item<cse_alife_monster_base>("AI_DOG_P"));
91 	m_clsids.push_back(new factory_item<cse_alife_psy_dog_phantom>("AI_DOG_F"));
92 	m_clsids.push_back(new factory_item<cse_alife_monster_base>("AI_BURER"));
93 	m_clsids.push_back(new factory_item<cse_alife_monster_base>("AI_GIANT"));
94 	m_clsids.push_back(new factory_item<cse_alife_monster_base>("AI_CONTR"));
95 	m_clsids.push_back(new factory_item<cse_alife_monster_base>("AI_POLTR"));
96 	m_clsids.push_back(new factory_item<cse_alife_monster_base>("AI_ZOM"));
97 	m_clsids.push_back(new factory_item<cse_alife_monster_base>("AI_FRACT"));
98 	m_clsids.push_back(new factory_item<cse_alife_monster_base>("AI_SNORK"));
99 	m_clsids.push_back(new factory_item<cse_alife_monster_base>("AI_CAT"));
100 	m_clsids.push_back(new factory_item<cse_alife_monster_base>("AI_TUSH"));
101 	m_clsids.push_back(new factory_item<cse_alife_creature_phantom>("AI_PHANT"));
102 	m_clsids.push_back(new factory_item<cse_alife_trader>("AI_TRADE"));
103 	m_clsids.push_back(new factory_item<cse_alife_creature_crow>("AI_CROW"));
104 	m_clsids.push_back(new factory_item<cse_alife_car>("C_NIVA"));
105 	m_clsids.push_back(new factory_item<cse_alife_helicopter>("C_HLCPTR"));
106 	m_clsids.push_back(new factory_item<cse_alife_item_artefact>("AF_MBALL"));
107 	m_clsids.push_back(new factory_item<cse_alife_item_artefact>("AF_BDROP"));
108 	m_clsids.push_back(new factory_item<cse_alife_item_artefact>("AF_NEEDL"));
109 	m_clsids.push_back(new factory_item<cse_alife_item_artefact>("AF_BAST"));
110 	m_clsids.push_back(new factory_item<cse_alife_item_artefact>("AF_BGRAV"));
111 	m_clsids.push_back(new factory_item<cse_alife_item_artefact>("AF_DUMMY"));
112 	m_clsids.push_back(new factory_item<cse_alife_item_artefact>("AF_ZUDA"));
113 	m_clsids.push_back(new factory_item<cse_alife_item_artefact>("AF_THORN"));
114 	m_clsids.push_back(new factory_item<cse_alife_item_artefact>("AF_FBALL"));
115 	m_clsids.push_back(new factory_item<cse_alife_item_artefact>("AF_EBALL"));
116 	m_clsids.push_back(new factory_item<cse_alife_item_artefact>("AF_RHAIR"));
117 	m_clsids.push_back(new factory_item<cse_alife_item_artefact>("AF_GALAN"));
118 	m_clsids.push_back(new factory_item<cse_alife_item_artefact>("ARTEFACT"));
119 	m_clsids.push_back(new factory_item<cse_alife_item_weapon_magazined>("W_WMAGAZ"));
120 	m_clsids.push_back(new factory_item<cse_alife_item_weapon_magazined_w_gl>("W_WMAGGL"));
121 	m_clsids.push_back(new factory_item<cse_alife_item_weapon_magazined_w_gl>("W_FN2000"));
122 	m_clsids.push_back(new factory_item<cse_alife_item_weapon_magazined_w_gl>("W_AK74"));
123 	m_clsids.push_back(new factory_item<cse_alife_item_weapon_magazined>("W_LR300"));
124 	m_clsids.push_back(new factory_item<cse_alife_item_weapon_magazined>("W_HPSA"));
125 	m_clsids.push_back(new factory_item<cse_alife_item_weapon_magazined>("W_PM"));
126 	m_clsids.push_back(new factory_item<cse_alife_item_weapon_magazined>("W_FORT"));
127 	m_clsids.push_back(new factory_item<cse_alife_item_weapon_magazined>("W_BINOC"));
128 	m_clsids.push_back(new factory_item<cse_alife_item_weapon_shotgun>("W_SHOTGN"));
129 	m_clsids.push_back(new factory_item<cse_alife_item_weapon_magazined>("W_SVD"));
130 	m_clsids.push_back(new factory_item<cse_alife_item_weapon_magazined>("W_SVU"));
131 	m_clsids.push_back(new factory_item<cse_alife_item_weapon_magazined>("W_RPG7"));
132 	m_clsids.push_back(new factory_item<cse_alife_item_weapon_magazined>("W_VAL"));
133 	m_clsids.push_back(new factory_item<cse_alife_item_weapon_magazined>("W_VINT"));
134 	m_clsids.push_back(new factory_item<cse_alife_item_weapon_magazined>("W_WALTHR"));
135 	m_clsids.push_back(new factory_item<cse_alife_item_weapon_magazined>("W_USP45"));
136 	m_clsids.push_back(new factory_item<cse_alife_item_weapon_magazined_w_gl>("W_GROZA"));
137 	m_clsids.push_back(new factory_item<cse_alife_item_weapon>("W_KNIFE"));
138 	m_clsids.push_back(new factory_item<cse_alife_item_weapon_shotgun>("W_BM16"));
139 	m_clsids.push_back(new factory_item<cse_alife_item_weapon_shotgun>("W_RG6"));
140 	m_clsids.push_back(new factory_item<cse_alife_item_ammo>("AMMO"));
141 	m_clsids.push_back(new factory_item<cse_alife_item_ammo>("A_VOG25"));
142 	m_clsids.push_back(new factory_item<cse_alife_item_ammo>("A_OG7B"));
143 	m_clsids.push_back(new factory_item<cse_alife_item_ammo>("A_M209"));
144 	m_clsids.push_back(new factory_item<cse_alife_item>("W_SCOPE"));
145 	m_clsids.push_back(new factory_item<cse_alife_item>("W_SILENC"));
146 	m_clsids.push_back(new factory_item<cse_alife_item>("W_GLAUNC"));
147 	m_clsids.push_back(new factory_item<cse_alife_item_bolt>("II_BOLT"));
148 	m_clsids.push_back(new factory_item<cse_alife_item>("II_MEDKI"));
149 	m_clsids.push_back(new factory_item<cse_alife_item>("II_BANDG"));
150 	m_clsids.push_back(new factory_item<cse_alife_item>("II_ANTIR"));
151 	m_clsids.push_back(new factory_item<cse_alife_item>("II_FOOD"));
152 	m_clsids.push_back(new factory_item<cse_alife_item>("II_BOTTL"));
153 	m_clsids.push_back(new factory_item<cse_alife_item_explosive>("II_EXPLO"));
154 	m_clsids.push_back(new factory_item<cse_alife_item_document>("II_DOC"));
155 	m_clsids.push_back(new factory_item<cse_alife_item>("II_ATTCH"));
156 	m_clsids.push_back(new factory_item<cse_alife_item_custom_outfit>("EQU_SCIE"));
157 	m_clsids.push_back(new factory_item<cse_alife_item_custom_outfit>("EQU_STLK"));
158 	m_clsids.push_back(new factory_item<cse_alife_item_custom_outfit>("EQU_MLTR"));
159 	m_clsids.push_back(new factory_item<cse_alife_item_custom_outfit>("EQU_EXO"));
160 	m_clsids.push_back(new factory_item<cse_alife_item_grenade>("G_F1"));
161 	m_clsids.push_back(new factory_item<cse_alife_item_grenade>("G_RGD5"));
162 //	m_clsids.push_back(new factory_item<cse_temporary>("G_RPG7"));
163 //	m_clsids.push_back(new factory_item<cse_temporary>("G_FAKE"));
164 	m_clsids.push_back(new factory_item<cse_alife_item>("MP_PLBAG"));
165 	m_clsids.push_back(new factory_item<cse_alife_custom_zone>("Z_ZONE"));
166 	m_clsids.push_back(new factory_item<cse_alife_anomalous_zone>("Z_MBALD"));
167 	m_clsids.push_back(new factory_item<cse_alife_anomalous_zone>("Z_MINCER"));
168 	m_clsids.push_back(new factory_item<cse_alife_anomalous_zone>("Z_ACIDF"));
169 	m_clsids.push_back(new factory_item<cse_alife_anomalous_zone>("Z_GALANT"));
170 	m_clsids.push_back(new factory_item<cse_alife_anomalous_zone>("Z_RADIO"));
171 	m_clsids.push_back(new factory_item<cse_alife_zone_visual>("Z_BFUZZ"));
172 	m_clsids.push_back(new factory_item<cse_alife_zone_visual>("Z_RUSTYH"));
173 	m_clsids.push_back(new factory_item<cse_alife_anomalous_zone>("Z_DEAD"));
174 	m_clsids.push_back(new factory_item<cse_alife_space_restrictor>("SCRIPTZN"));
175 	m_clsids.push_back(new factory_item<cse_alife_smart_zone>("SMRTZONE"));
176 	m_clsids.push_back(new factory_item<cse_alife_team_base_zone>("Z_TEAMBS"));
177 	m_clsids.push_back(new factory_item<cse_alife_torrid_zone>("Z_TORRID"));
178 	m_clsids.push_back(new factory_item<cse_alife_space_restrictor>("SPACE_RS"));
179 	m_clsids.push_back(new factory_item<cse_alife_zone_visual>("Z_AMEBA"));
180 	m_clsids.push_back(new factory_item<cse_alife_anomalous_zone>("Z_NOGRAV"));
181 	m_clsids.push_back(new factory_item<cse_alife_item_detector>("D_SIMDET"));
182 	m_clsids.push_back(new factory_item<cse_alife_item_torch>("D_TORCH"));
183 	m_clsids.push_back(new factory_item<cse_alife_item_pda>("D_PDA"));
184 	m_clsids.push_back(new factory_item<cse_alife_object_projector>("O_SEARCH"));
185 	m_clsids.push_back(new factory_item<cse_alife_mounted_weapon>("W_MOUNTD"));
186 	m_clsids.push_back(new factory_item<cse_alife_stationary_mgun>("W_STMGUN"));
187 	m_clsids.push_back(new factory_item<cse_alife_object_hanging_lamp>("O_HLAMP"));
188 	m_clsids.push_back(new factory_item<cse_alife_object_physic>("O_PHYSIC"));
189 	m_clsids.push_back(new factory_item<cse_alife_dynamic_object_visual>("SCRPTOBJ"));
190 	m_clsids.push_back(new factory_item<cse_alife_object_breakable>("O_BRKBL"));
191 	m_clsids.push_back(new factory_item<cse_alife_object_climable>("O_CLMBL"));
192 	m_clsids.push_back(new factory_item<cse_alife_ph_skeleton_object>("P_SKELET"));
193 	m_clsids.push_back(new factory_item<cse_alife_object_physic>("P_DSTRBL"));
194 	m_clsids.push_back(new factory_item<cse_inventory_box>("O_INVBOX"));
195 	// Clear Sky (including build 3120) engine classes
196 	m_clsids.push_back(new factory_item<cse_alife_item_detector>("D_ELITE"));
197 	m_clsids.push_back(new factory_item<cse_alife_item_detector>("D_ADVANC"));
198 	m_clsids.push_back(new factory_item<cse_alife_item>("D_FLARE"));
199 	m_clsids.push_back(new factory_item<cse_alife_item>("II_BTTCH"));
200 	m_clsids.push_back(new factory_item<cse_alife_item>("NW_ATTCH"));
201 	m_clsids.push_back(new factory_item<cse_alife_anomalous_zone>("Z_CFIRE"));
202 	m_clsids.push_back(new factory_item<cse_alife_item_artefact>("AF_CTA"));
203 
204 	// CoP new engine classes
205 	m_clsids.push_back(new factory_item<cse_alife_object_physic>("O_DSTR_S"));
206 	m_clsids.push_back(new factory_item<cse_alife_object_hanging_lamp>("SO_HLAMP"));
207 	m_clsids.push_back(new factory_item<cse_alife_item_grenade>("G_F1_S"));
208 	m_clsids.push_back(new factory_item<cse_alife_item_grenade>("G_RGD5_S"));
209 	m_clsids.push_back(new factory_item<cse_alife_item_pda>("S_PDA"));
210 	m_clsids.push_back(new factory_item<cse_alife_item>("S_FOOD"));
211 	m_clsids.push_back(new factory_item<cse_alife_item>("WP_GLAUN"));
212 	m_clsids.push_back(new factory_item<cse_alife_item>("WP_SILEN"));
213 	m_clsids.push_back(new factory_item<cse_alife_item_ammo>("AMMO_S"));
214 	m_clsids.push_back(new factory_item<cse_alife_item_ammo>("S_VOG25"));
215 	m_clsids.push_back(new factory_item<cse_alife_item_ammo>("S_M209"));
216 	m_clsids.push_back(new factory_item<cse_alife_item_ammo>("S_OG7B"));
217 	m_clsids.push_back(new factory_item<cse_alife_item_helmet>("E_HLMET"));
218 	m_clsids.push_back(new factory_item<cse_alife_item_explosive>("S_EXPLO"));
219 	m_clsids.push_back(new factory_item<cse_alife_item_detector>("DET_ELIT"));
220 
221 	// script classes
222 	m_clsids.push_back(new factory_item<se_level_changer>("LVL_CHNG"));	// was cse_alife_level_changer in pre-3502 builds
223 	m_clsids.push_back(new factory_item<se_smart_terrain>("SMRTTRRN"));
224 	m_clsids.push_back(new factory_item<se_respawn>("RE_SPAWN"));
225 //	m_clsids.push_back(new factory_item<cse_switcher>("O_SWITCH"));
226 	m_clsids.push_back(new factory_item<se_stalker>("AI_STL_S"));
227 	m_clsids.push_back(new factory_item<se_trader>("AI_TRD_S"));
228 	m_clsids.push_back(new factory_item<se_heli>("C_HLCP_S"));
229 	m_clsids.push_back(new factory_item<se_restrictor>("SPC_RS_S"));
230 	m_clsids.push_back(new factory_item<se_physic>("O_PHYS_S"));
231 	m_clsids.push_back(new factory_item<se_artefact>("SCRPTART"));
232 	m_clsids.push_back(new factory_item<se_car>("SCRPTCAR"));
233 	m_clsids.push_back(new factory_item<se_monster>("SM_BLOOD"));
234 	m_clsids.push_back(new factory_item<se_monster>("SM_BOARW"));
235 	m_clsids.push_back(new factory_item<se_monster>("SM_DOG_S"));
236 	m_clsids.push_back(new factory_item<se_monster>("SM_FLESH"));
237 	m_clsids.push_back(new factory_item<se_monster>("SM_P_DOG"));
238 	m_clsids.push_back(new factory_item<se_monster>("SM_BURER"));
239 	m_clsids.push_back(new factory_item<se_monster>("SM_CAT_S"));
240 	m_clsids.push_back(new factory_item<se_monster>("SM_CHIMS"));
241 	m_clsids.push_back(new factory_item<se_monster>("SM_CONTR"));
242 	m_clsids.push_back(new factory_item<se_monster>("SM_IZLOM"));
243 	m_clsids.push_back(new factory_item<se_monster>("SM_POLTR"));
244 	m_clsids.push_back(new factory_item<se_monster>("SM_GIANT"));
245 	m_clsids.push_back(new factory_item<se_monster>("SM_ZOMBI"));
246 	m_clsids.push_back(new factory_item<se_monster>("SM_SNORK"));
247 	m_clsids.push_back(new factory_item<se_monster>("SM_TUSHK"));
248 	m_clsids.push_back(new factory_item<se_monster>("SM_DOG_P"));
249 	m_clsids.push_back(new factory_item<se_monster>("SM_DOG_F"));
250 	m_clsids.push_back(new factory_item<se_item_torch>("TORCH_S"));
251 	m_clsids.push_back(new factory_item<se_outfit>("E_STLK"));
252 	m_clsids.push_back(new factory_item<se_item>("WP_SCOPE"));
253 	m_clsids.push_back(new factory_item<se_weapon_magazined_w_gl>("WP_AK74"));
254 	m_clsids.push_back(new factory_item<se_weapon_magazined>("WP_LR300"));
255 	m_clsids.push_back(new factory_item<se_weapon_magazined>("WP_BINOC"));
256 	m_clsids.push_back(new factory_item<se_weapon_shotgun>("WP_BM16"));
257 	m_clsids.push_back(new factory_item<se_weapon_magazined_w_gl>("WP_GROZA"));
258 	m_clsids.push_back(new factory_item<se_weapon_magazined>("WP_SVD"));
259 	m_clsids.push_back(new factory_item<se_weapon_magazined>("WP_HPSA"));
260 	m_clsids.push_back(new factory_item<se_weapon>("WP_KNIFE"));
261 	m_clsids.push_back(new factory_item<se_weapon_magazined>("WP_PM"));
262 	m_clsids.push_back(new factory_item<se_weapon_shotgun>("WP_RG6"));
263 	m_clsids.push_back(new factory_item<se_weapon_magazined>("WP_RPG7"));
264 	m_clsids.push_back(new factory_item<se_weapon_shotgun>("WP_SHOTG"));
265 	m_clsids.push_back(new factory_item<se_weapon_magazined>("WP_MAGAZ"));
266 	m_clsids.push_back(new factory_item<se_weapon_magazined>("WP_SVU"));
267 	m_clsids.push_back(new factory_item<se_weapon_magazined>("WP_USP45"));
268 	m_clsids.push_back(new factory_item<se_weapon_magazined>("WP_VAL"));
269 	m_clsids.push_back(new factory_item<se_weapon_magazined>("WP_VINT"));
270 	m_clsids.push_back(new factory_item<se_weapon_magazined>("WP_WALTH"));
271 	m_clsids.push_back(new factory_item<se_zone_visual>("ZS_BFUZZ"));
272 	m_clsids.push_back(new factory_item<se_zone_anom>("ZS_MBALD"));
273 	m_clsids.push_back(new factory_item<se_zone_anom>("ZS_GALAN"));
274 	m_clsids.push_back(new factory_item<se_zone_anom>("ZS_MINCE"));
275 	// clear sky script classes
276 	m_clsids.push_back(new factory_item<se_actor>("S_ACTOR"));			// + CoP
277 	m_clsids.push_back(new factory_item<se_sim_faction>("SFACTION"));
278 	m_clsids.push_back(new factory_item<se_smart_cover>("SMRT_C_S"));	// + CoP
279 
280 	// ZENOBIAN mod script classes
281 	m_clsids.push_back(new factory_item<se_anomaly_field>("ANOMFLD1"));
282 	m_clsids.push_back(new factory_item<se_turret_mgun>("TURRETMG"));
283 	m_clsids.push_back(new factory_item<se_zone_anom>("Z_MINES"));
284 
285 	// CoP new script classes
286 	m_clsids.push_back(new factory_item<se_invbox>("S_INVBOX"));
287 	m_clsids.push_back(new factory_item<se_zone_anom>("ZS_RADIO"));
288 	m_clsids.push_back(new factory_item<se_zone_torrid>("ZS_TORRD"));
289 	m_clsids.push_back(new factory_item<se_weapon_shotgun>("WP_ASHTG"));
290 
291 	//LA new script classes
292 	m_clsids.push_back(new factory_item<se_monster>("SM_KARLO"));
293 	m_clsids.push_back(new factory_item<se_monster>("SM_RAT"));
294 	m_clsids.push_back(new factory_item<se_shelter>("LA_SHELT"));
295 	m_clsids.push_back(new factory_item<se_item>("IS_ATTCH"));
296 	m_clsids.push_back(new factory_item<se_zone_anom>("ZS_NOGRA"));
297 	m_clsids.push_back(new factory_item<se_zone_visual>("ZS_RUSTY"));
298 	m_clsids.push_back(new factory_item<se_safe>("LA_PHSAF"));
299 	m_clsids.push_back(new factory_item<se_safe>("LA_SAFE"));
300 	m_clsids.push_back(new factory_item<cse_turret_mgun>("W_TURRET"));
301 
302 	// prepare for bisection
303 	std::sort(m_clsids.begin(), m_clsids.end(), clsid_pred());
304 }
305 
306 struct clsid_pred2 {
307 	const xr_clsid clsid;
clsid_pred2clsid_pred2308 	explicit clsid_pred2(const xr_clsid& _clsid): clsid(_clsid) {}
operator ()clsid_pred2309 	bool operator()(const factory_item_base* p) const {
310 		return p->clsid() < clsid;
311 	}
312 };
313 
create(const char * name)314 cse_abstract* xr_entity_factory::create(const char* name)
315 {
316 	if (m_system_ini == 0)
317 		m_system_ini = new xr_ini_file(PA_GAME_CONFIG, "system.ltx");
318 
319 	if (!m_system_ini->section_exist(name)) {
320 		msg("can't find entity %s", name);
321 		return 0;
322 	}
323 
324 	xr_clsid clsid(m_system_ini->r_clsid(name, "class"));
325 	std::vector<factory_item_base*>::iterator it = lower_bound_if(
326 			m_clsids.begin(), m_clsids.end(), clsid_pred2(clsid));
327 	if (it != m_clsids.end() && (*it)->clsid() == clsid)
328 		return (*it)->create();
329 
330 	char clsid_name[9] = {};
331 	clsid.get(clsid_name);
332 	msg("can't create entity %s, %s", name, clsid_name);
333 	return 0;
334 }
335 
get_entity_clsid(const char * name)336 xr_clsid* xr_entity_factory::get_entity_clsid(const char* name)
337 {
338 	if (m_system_ini == 0)
339 		m_system_ini = new xr_ini_file(PA_GAME_CONFIG, "system.ltx");
340 
341 	if (m_system_ini->section_exist(name)) {
342 		xr_clsid clsid(m_system_ini->r_clsid(name, "class"));
343 		std::vector<factory_item_base*>::iterator it = lower_bound_if(
344 				m_clsids.begin(), m_clsids.end(), clsid_pred2(clsid));
345 		if (it != m_clsids.end() && (*it)->clsid() == clsid)
346 		{
347 			xr_clsid* temp = &clsid;
348 			return temp;
349 		}
350 	}
351 
352 	return NULL;
353 }
354 
load_system_ini(const char * game_config)355 void xr_entity_factory::load_system_ini(const char* game_config)
356 {
357 	delete m_system_ini;
358 	m_system_ini = new xr_ini_file(game_config, "system.ltx");
359 }
360 
create_entity(const char * name)361 cse_abstract* xray_re::create_entity(const char* name)
362 {
363 	return g_entity_factory.create(name);
364 }
365 
load_system_ini(const char * game_config)366 void xray_re::load_system_ini(const char* game_config)
367 {
368 	g_entity_factory.load_system_ini(game_config);
369 }
370 
get_entity_clsid(const char * name)371 xr_clsid* xray_re::get_entity_clsid(const char *name)
372 {
373 	return g_entity_factory.get_entity_clsid(name);
374 }
375