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