Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: orxonox.OLD/orxonox/branches/ll2trunktemp/src/game_loader.cc @ 4003

Last change on this file since 4003 was 4003, checked in by bensch, 21 years ago

orxonox/branches/ll2trunktemp: some small modifications, testing, why 2 instances of fabricate are deleted, and not just the first one

File size: 6.4 KB
RevLine 
[2636]1
2
3/*
4   orxonox - the future of 3D-vertical-scrollers
5
6   Copyright (C) 2004 orx
7
8   This program is free software; you can redistribute it and/or modify
9   it under the terms of the GNU General Public License as published by
10   the Free Software Foundation; either version 2, or (at your option)
11   any later version.
12
13   ### File Specific:
14   main-programmer: Patrick Boenzli
15   co-programmer: ...
16*/
17
18
19#include "game_loader.h"
20#include "campaign.h"
21#include "world.h"
22#include "player.h"
23#include "orxonox.h"
24#include "camera.h"
25#include "command_node.h"
26#include "vector.h"
27
28#include <string.h>
29
30
31using namespace std;
32
33
34GameLoader* GameLoader::singletonRef = 0;
35
36
37GameLoader::GameLoader () {}
38
39
40GameLoader::~GameLoader () {}
41
42
[3225]43/**
44   \brief this class is a singleton class
45   \returns an instance of itself
46
47   if you are unsure about singleton classes, check the theory out on the internet :)
48*/
[2636]49GameLoader* GameLoader::getInstance()
50{
51  if(singletonRef == NULL)
52    singletonRef = new GameLoader();
53  return singletonRef;
54}
55
56
[3222]57ErrorMessage GameLoader::init()
[2636]58{
59  if(this->currentCampaign != NULL)
60    this->currentCampaign->init();
61}
62
63
[3225]64/**
65   \brief reads a campaign definition file into a campaign class
66   \param filename to be loaded
67   \returns the loaded campaign
68
69   this will interprete the map/campaign files and recursivly load a tree of worlds/campaigns
70*/
[3222]71ErrorMessage GameLoader::loadCampaign(char* name)
[2636]72{
[3222]73  ErrorMessage errorCode;
[2636]74 
75  this->currentCampaign = this->fileToCampaign(name);
76}
77
[3225]78
79/**
80   \brief loads a debug campaign for test purposes only.
81   \param the identifier of the campaign.
82   \returns error message if not able to do so.
83*/
[3222]84ErrorMessage GameLoader::loadDebugCampaign(Uint32 campaignID)
[2636]85{
86  switch(campaignID)
87    {
[3629]88      /*
89         Debug Level 0: Debug level used to test the base frame work.
90         As you can see, all storyentity data is allocated before game
91         start. the storyentity will load themselfs shortly before start
92         through the StoryEntity::init() funtion.
93      */
[2636]94    case DEBUG_CAMPAIGN_0:
95      {
96        Campaign* debugCampaign = new Campaign();
[3220]97
[2636]98        World* world0 = new World(DEBUG_WORLD_0);
[3220]99        world0->setNextStoryID(WORLD_ID_1);
[2636]100        debugCampaign->addEntity(world0, WORLD_ID_0);
[3220]101
[2636]102        World* world1 = new World(DEBUG_WORLD_1);
[3727]103        world1->setNextStoryID(WORLD_ID_2);
[2636]104        debugCampaign->addEntity(world1, WORLD_ID_1);
105
[3727]106        World* world2 = new World(DEBUG_WORLD_2);
107        world2->setNextStoryID(WORLD_ID_GAMEEND);
108        debugCampaign->addEntity(world2, WORLD_ID_2);
109
[2636]110        this->currentCampaign = debugCampaign;
111        break;
112      }
113    }
114}
115
[3222]116ErrorMessage GameLoader::start()
[2636]117{
118  if(this->currentCampaign != NULL)
119    this->currentCampaign->start();
120}
121
122
[3222]123ErrorMessage GameLoader::stop()
[2636]124{
125  if(this->currentCampaign != NULL)
126    this->currentCampaign->stop();
127  this->currentCampaign = NULL;
128}
129
130
[3222]131ErrorMessage GameLoader::pause()
[2636]132{
133  this->isPaused = true;
134  if(this->currentCampaign != NULL)
135    this->currentCampaign->pause();
136}
137
138
[3222]139ErrorMessage GameLoader::resume()
[2636]140{
141  this->isPaused = false;
142  if(this->currentCampaign != NULL)
143    this->currentCampaign->resume();
144}
145
[3225]146/**
147   \brief release the mem
148 */
149ErrorMessage GameLoader::destroy()
[2636]150{}
151
152
[3225]153/**
154   \brief reads a campaign definition file into a campaign class
155   \param filename to be loaded
156   \returns the loaded campaign
157
158   this will interprete the map/campaign files and recursivly load a tree of worlds/campaigns
159*/
[2636]160Campaign* GameLoader::fileToCampaign(char *name)
161{
162  /* do not entirely load the campaign. just the current world
163     before start of each world, it has to be initialized so it
164     can load everything it needs into memory then.
165  */
[3989]166 
167  if( name == NULL)
[4003]168    {
169      PRINTF0("No filename specified for loading");
170      return NULL;
171    }
[3989]172 
[4003]173  TiXmlDocument* XMLDoc = new TiXmlDocument( name);
174  // load the campaign document
175  if( !XMLDoc->LoadFile())
176    {
177      // report an error
178      PRINTF0("Error loading XML File: %s @ %d:%d\n", XMLDoc->ErrorDesc(), XMLDoc->ErrorRow(), XMLDoc->ErrorCol());
179      delete XMLDoc;
180      return NULL;
181    }
[3989]182       
[4003]183  // check basic validity
184  TiXmlElement* root = XMLDoc->RootElement();
185  assert( root != NULL);
[3989]186       
[4003]187  if( strcmp( root->Value(), "Campaign"))
188    {
189      // report an error
190      PRINTF0("Specified XML File is not an orxonox campaign file (Campaign element missing)\n");
191      delete XMLDoc;
192      return NULL;
193    }
[3989]194       
[4003]195  // construct campaign
196  Campaign* c = new Campaign( root);
[3989]197       
[4003]198  // free the XML data
199  delete XMLDoc;
[3989]200       
[4003]201  return c;
[2636]202}
203
204
205/**
206   \brief handle keyboard commands
207   \param cmd: the command to handle
[3225]208   \returns true if the command was handled by the system
[2636]209*/
210bool GameLoader::worldCommand (Command* cmd)
211{
212  if( !strcmp( cmd->cmd, "up_world"))
213    {
214      if( !cmd->bUp) 
215        {
216          this->nextLevel();
217        }
218      return true;
219    }
220  else if( !strcmp( cmd->cmd, "down_world"))
221    {
222      if( !cmd->bUp)
223        {
224          this->previousLevel();
225        }
226      return true;
227    }
228  else if( !strcmp( cmd->cmd, "pause"))
229    {
230      if( !cmd->bUp)
231        {
232          if(this->isPaused)
233            this->resume();
234          else
235            this->pause();
236        }
237      return true;
238    }
[3220]239  else if( !strcmp( cmd->cmd, "quit"))
240    {
241      if( !cmd->bUp) this->stop();
242      return true;
243    }
[2636]244  return false;
245}
246
[3225]247
248/*
249  \brief this changes to the next level
250*/
[2636]251void GameLoader::nextLevel()
252{
253  if(this->currentCampaign != NULL)
254    this->currentCampaign->nextLevel();
255}
256
[3225]257
258/*
259  \brief change to the previous level - not implemented
260
261  this propably useless
262*/
[2636]263void GameLoader::previousLevel()
264{
265  if(this->currentCampaign != NULL)
266    this->currentCampaign->previousLevel();
267}
[3940]268
269/**
270   \brief add a Factory to the Factory Q
271   \param factory a Factory to be registered
272*/
273void GameLoader::registerFactory( Factory* factory)
274{
275        assert( factory != NULL);
276       
277        PRINTF0("Registered factory for '%s'\n", factory->getClassname());
278       
279        if( first == NULL) first = factory;
280        else first->registerFactory( factory);
281}
282
283/**
284   \brief load a StoryEntity
285   \param element a XMLElement containing all the needed info
286*/
287BaseObject* GameLoader::fabricate( TiXmlElement* element)
288{
289        assert( element != NULL);
290       
291        if( first == NULL)
292        {
293                PRINTF0("GameLoader does not know any factories, fabricate() failed\n");
294                return NULL;
295        }
296       
297        if( element->Value() != NULL)
298        {
299                PRINTF0("Attempting fabrication of a '%s'\n", element->Value());
300                BaseObject* b = first->fabricate( element);
301                if( b == NULL) PRINTF0("Failed to fabricate a '%s'\n", element->Value());
302                else PRINTF0("Successfully fabricated a '%s'\n", element->Value());
303                return b;
304        }
305       
306        PRINTF0("Fabricate failed, TiXmlElement did not contain a value\n");
307       
308        return NULL;
309}
Note: See TracBrowser for help on using the repository browser.