Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: orxonox.OLD/branches/new_class_id/src/story_entities/game_world_data.cc @ 9727

Last change on this file since 9727 was 9727, checked in by bensch, 18 years ago

orxonox/new_class_id: new Executor construct, that is much more typesafe, faster, and easier to extend…

Also changed the LoadParam process, and adapted ScriptEngine calls

Then at the end, some missing headers appeared, and appended them to all the cc-files again.

File size: 10.1 KB
Line 
1/*
2   orxonox - the future of 3D-vertical-scrollers
3
4   Copyright (C) 2004 orx
5
6   This program is free software; you can redistribute it and/or modify
7   it under the terms of the GNU General Public License as published by
8   the Free Software Foundation; either version 2, or (at your option)
9   any later version.
10
11### File Specific:
12   main-programmer: Patrick Boenzli
13*/
14
15
16#define DEBUG_SPECIAL_MODULE DEBUG_MODULE_WORLD
17
18#include <fstream>
19#include <iostream>
20
21#include "game_world_data.h"
22
23#include "util/loading/resource_manager.h"
24#include "state.h"
25#include "substring.h"
26
27#include "util/loading/game_loader.h"
28
29#include "world_entity.h"
30#include "player.h"
31#include "camera.h"
32#include "terrain.h"
33#include "skybox.h"
34#include "md2/md2Model.h"
35#include "world_entities/projectiles/projectile.h"
36#include "npcs/npc_test1.h"
37#include "playable.h"
38
39#include "light.h"
40
41#include "util/loading/factory.h"
42#include "loading/fast_factory.h"
43#include "util/loading/load_param_xml.h"
44
45#include "graphics_engine.h"
46#include "effects/graphics_effect.h"
47#include "effects/atmospheric_engine.h"
48#include "event_handler.h"
49#include "sound_engine.h"
50#include "cd_engine.h"
51#include "network_manager.h"
52#include "physics_engine.h"
53#include "fields.h"
54
55#include "glmenu_imagescreen.h"
56
57#include "game_rules.h"
58
59#include "ogg_player.h"
60#include "shader.h"
61
62
63ObjectListDefinition(GameWorldData);
64/**
65 * constructor of the GameWorldData
66 */
67GameWorldData::GameWorldData()
68{
69  this->registerObject(this, GameWorldData::_objectList);
70
71  this->glmis = NULL;
72
73  this->localCamera = NULL;
74  this->localPlayer = NULL;
75  this->sky = NULL;
76  this->terrain = NULL;
77
78  this->music = NULL;
79  this->objectManager = NULL;
80  this->gameRule = NULL;
81}
82
83
84/**
85 * destructor for the GameWorldData
86 */
87GameWorldData::~GameWorldData()
88{}
89
90
91
92/**
93 *  initialize the GameWorldData
94 */
95ErrorMessage GameWorldData::init()
96{
97  this->objectManager = new ObjectManager();
98  State::setObjectManager(this->objectManager);
99
100  PNode::getNullParent();
101  this->localCamera = new Camera();
102  this->localCamera->setName ("GameWorld-Camera");
103  State::setCamera(this->localCamera, this->localCamera->getTarget());
104
105  LightManager::getInstance();
106
107//  GraphicsEngine::getInstance()->displayFPS(true);
108
109  return ErrorMessage();
110}
111
112
113/**
114 *  loads the data from the xml file
115 * @param root reference to the xml root element
116 */
117ErrorMessage GameWorldData::loadData(const TiXmlElement* root)
118{
119  assert (root != NULL);
120  // load the parameters
121  // name
122  std::string string = grabParameter( root, "name");
123  if( string.empty() )
124  {
125    PRINTF(2)("GameWorld is missing a proper 'name'\n");
126    this->setName("Unknown");
127  }
128  else
129    this->setName(string.c_str());
130
131  this->loadGUI(root);
132  this->loadWorldEntities(root);
133  this->loadScene(root);
134
135  return ErrorMessage();
136}
137
138
139/**
140 *  unloads the data from the xml file
141 */
142ErrorMessage GameWorldData::unloadData()
143{
144  this->unloadGUI();
145  this->unloadWorldEntities();
146  this->unloadScene();
147
148  return ErrorMessage();
149}
150
151
152/**
153 * @brief loads the GUI data
154 * @param root reference to the xml root element
155 */
156ErrorMessage GameWorldData::loadGUI(const TiXmlElement* root)
157{
158  const TiXmlElement* element = root->FirstChildElement("LoadScreen");
159  if( element == NULL)
160  {
161    PRINTF(2)("no LoadScreen specified, loading default\n");
162
163    glmis->setBackgroundImage("pictures/load_screen.jpg");
164    this->glmis->setMaximum(8);
165    //     this->glmis->draw();
166  }
167  else
168  {
169    this->glmis->loadParams(element);
170    //     this->glmis->draw();
171  }
172  this->glmis->draw();
173
174  return ErrorMessage();
175}
176
177
178/**
179 * @brief unloads the GUI data
180 */
181ErrorMessage GameWorldData::unloadGUI()
182{
183  delete this->glmis;
184
185  return ErrorMessage();
186}
187
188
189/**
190 * @brief loads the world entities from the xml file
191 * @param root reference to the xml root parameter
192 */
193ErrorMessage GameWorldData::loadWorldEntities(const TiXmlElement* root)
194{
195  const TiXmlElement* element = root->FirstChildElement("WorldEntities");
196  bool mouseCaptured = EventHandler::getInstance()->grabbedEvents();
197  EventHandler::getInstance()->grabEvents(false);
198
199  if( element == NULL)
200  {
201    PRINTF(1)("GameWorld is missing 'WorldEntities'\n");
202  }
203  else
204  {
205    element = element->FirstChildElement();
206    // load Players/Objects/Whatever
207    PRINTF(4)("Loading WorldEntities\n");
208    while( element != NULL)
209    {
210      BaseObject* created = Factory::fabricate(element);
211      if( created != NULL )
212        PRINTF(4)("Created a %s: %s\n", created->getClassCName(), created->getCName());
213
214      //todo do this more elegant
215      if( element->Value() == "SkyBox" && created->isA(SkyBox::classID()))
216      {
217        this->sky = dynamic_cast<WorldEntity*>(created);
218        State::setSkyBox(dynamic_cast<SkyBox*>(this->sky));
219      }
220      if( element->Value() == "Terrain" && created->isA(Terrain::classID()))
221      {
222        this->terrain = dynamic_cast<Terrain*>(created);
223        CDEngine::getInstance()->setTerrain(terrain);
224      }
225      element = element->NextSiblingElement();
226      this->glmis->step(); //! @todo temporary
227    }
228    PRINTF(4)("Done loading WorldEntities\n");
229  }
230
231  // Create a Player
232  this->localPlayer = new Player();
233  State::setPlayer(this->localPlayer);
234
235  Playable* playable;
236  if (!Playable::objectList().empty())
237  {
238    /// TODO Make this also loadable
239    this->localPlayer->setPlayable(Playable::objectList().front());
240  }
241
242  // Fill the EntityLists. Tick then Draw:
243  this->tickLists.push_back(OM_DEAD_TICK);
244  this->tickLists.push_back(OM_ENVIRON);
245  this->tickLists.push_back(OM_COMMON);
246  this->tickLists.push_back(OM_GROUP_00);
247  this->tickLists.push_back(OM_GROUP_00_PROJ);
248  this->tickLists.push_back(OM_GROUP_01);
249  this->tickLists.push_back(OM_GROUP_01_PROJ);
250  this->tickLists.push_back(OM_GROUP_02);
251
252  this->drawLists.push_back(OM_ENVIRON_NOTICK);
253  this->drawLists.push_back(OM_ENVIRON);
254  this->drawLists.push_back(OM_GROUP_00);
255  this->drawLists.push_back(OM_GROUP_00_PROJ);
256  this->drawLists.push_back(OM_GROUP_01);
257  this->drawLists.push_back(OM_GROUP_01_PROJ);
258  this->drawLists.push_back(OM_GROUP_02);
259  this->drawLists.push_back(OM_COMMON);
260
261  /* init the pnode tree */
262  PNode::getNullParent()->init();
263
264  EventHandler::getInstance()->grabEvents(mouseCaptured);
265
266  return ErrorMessage();
267}
268
269
270/**
271 *  unloads the world entities
272 */
273ErrorMessage GameWorldData::unloadWorldEntities()
274{
275  FastFactory::flushAll(true);
276  GraphicsEngine::getInstance()->displayFPS(false);
277  // erease everything that is left.
278  //secondary cleanup of PNodes;
279  while (!PNode::objectList().empty())
280    delete PNode::objectList().front();
281
282  /* remove the player object */
283  if( this->localPlayer)
284    delete this->localPlayer;
285  State::setPlayer(NULL);
286  this->localPlayer = NULL;
287  this->localCamera = NULL;
288  State::setCamera(NULL, NULL);
289  this->sky = NULL;
290  this->terrain = NULL;
291
292  while (!GraphicsEffect::objectList().empty())
293    delete GraphicsEffect::objectList().front();
294
295
296  while (!Element2D::objectList().empty())
297    delete Element2D::objectList().front();
298
299  // At this Point all the WorldEntites should be unloaded.
300  this->tickLists.clear();
301  this->drawLists.clear();
302
303  // unload the resources loaded in this Level !!
304  ResourceManager::getInstance()->unloadAllByPriority(RP_LEVEL);
305
306  if (State::getObjectManager() == this->objectManager)
307  {
308    State::setObjectManager(NULL);
309    delete this->objectManager;
310  }
311  this->objectManager = NULL;
312
313  if(State::getSkyBox())
314    State::setSkyBox(NULL);
315
316  this->glmis = NULL;
317
318  return ErrorMessage();
319}
320
321
322/**
323 * @brief loads the scene data
324 * @param root reference to the xml root element
325 */
326ErrorMessage GameWorldData::loadScene(const TiXmlElement* root)
327{
328  LoadParamXML(root, "LightManager", LightManager::getInstance(), LightManager, loadParams);
329  LoadParamXML(root, "GraphicsEngine", GraphicsEngine::getInstance(), GraphicsEngine, loadParams);
330  LoadParamXML(root, "AtmosphericEngine", AtmosphericEngine::getInstance(), AtmosphericEngine, loadParams);
331
332  LoadParam(root, "Music", this, GameWorldData, setSoundTrack);
333
334  LoadParamXML(root, "GameRule", this, GameWorldData, loadGameRule);
335
336  LoadParam(root, "clip-region", this->localCamera, Camera, setClipRegion);
337
338
339  //LoadParamXML(root, "ParticleEngine", ParticleEngine::getInstance(), ParticleEngine, loadParams);
340  //LoadParamXML(root, "PhysicsEngine", PhysicsEngine::getInstance(), PhysicsEngine, loadParams);
341
342  if( this->sky != NULL)
343    this->localCamera->addChild(this->sky);
344  OrxSound::SoundEngine::getInstance()->setListener(this->localCamera);
345
346  return ErrorMessage();
347}
348
349
350
351/**
352 *  unloads the scene data
353 */
354ErrorMessage GameWorldData::unloadScene()
355{
356  /* delete some garphics and scene eingines */
357  delete LightManager::getInstance();
358  delete AtmosphericEngine::getInstance();
359
360  if (this->music != NULL)
361    this->setSoundTrack("");
362
363  /* unload the shaders */
364  Shader::suspendShader();
365
366  State::setGameRules(NULL);
367
368  return ErrorMessage();
369}
370
371
372void GameWorldData::setSoundTrack(const std::string& name)
373{
374  if (this->music != NULL)
375    delete this->music;
376  this->music = NULL;
377
378  if (!name.empty())
379  {
380    PRINTF(3)("Setting Sound Track to %s\n", name.c_str());
381    std::string oggFile = ResourceManager::getFullName(name);
382    this->music = new OrxSound::OggPlayer(oggFile);
383    if (this->localPlayer != NULL)
384      this->localPlayer->hud().notifyUser(std::string("Playing SoundTrack: ") + this->music->artist() + " - " + this->music->title());
385
386    //(OggPlayer*)ResourceManager::getInstance()->load(name, OGG, RP_LEVEL);
387    //assert(this->music->isA(CL_SOUND_OGG_PLAYER));
388  }
389}
390
391
392void GameWorldData::loadGameRule(const TiXmlElement* root)
393{
394  const TiXmlElement* element = root->FirstChildElement();
395  while( element != NULL)
396  {
397    PRINTF(2)("============ GameRules ==\n");
398    PRINTF(2)("creating %s\n", element->Value());
399    BaseObject* created = Factory::fabricate(element);
400    if (created != NULL && created->isA(GameRules::classID()))
401    {
402      this->gameRule = dynamic_cast<GameRules*>(created);
403      State::setGameRules(this->gameRule);
404      // if there is a valid game rule loaded, return because it is not thought to load multiple game rules
405      return;
406    }
407    else
408    {
409      PRINTF(1)("Could not create a %s\n", element->Value());
410      delete created;
411    }
412    element = element->NextSiblingElement();
413  }
414}
415
416
417
Note: See TracBrowser for help on using the repository browser.