Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: orxonox.OLD/orxonox/branches/md2_loader/src/orxonox.cc @ 4148

Last change on this file since 4148 was 4139, checked in by patrick, 19 years ago

orxonox/branches/md2_loader: merged trunk into branche using: svn merge ../trunk/ md2_loader -r 4063:HEAD

File size: 9.5 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   This program is distributed in the hope that it will be useful,
12   but WITHOUT ANY WARRANTY; without even the implied warranty of
13   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14   GNU General Public License for more details.
15
16   You should have received a copy of the GNU General Public License
17   along with this program; if not, write to the Free Software Foundation,
18   Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 
19
20
21   ### File Specific:
22   main-programmer: Patrick Boenzli
23   co-programmer: Christian Meyer
24   co-programmer: Benjamin Grauer: injected ResourceManager/GraphicsEngine/GUI
25*/
26
27#include "orxonox.h"
28
29#include "gui.h"
30
31#include "world.h"
32#include "data_tank.h"
33#include "command_node.h"
34#include "ini_parser.h"
35#include "game_loader.h"
36#include "graphics_engine.h"
37#include "resource_manager.h"
38#include "text_engine.h"
39#include "factory.h"
40#include "benchmark.h"
41
42#include <string.h>
43
44int verbose = 4;
45
46using namespace std;
47
48/**
49   \brief create a new Orxonox
50
51   In this funcitons only global values are set. The game will not be started here.
52*/
53Orxonox::Orxonox ()
54{
55  this->pause = false;
56
57  this->world = NULL;
58  this->resources = NULL;
59  this->localinput = NULL;
60
61  this->argc = 0;
62  this->argv = NULL;
63}
64
65/**
66   \brief remove Orxonox from memory
67*/
68Orxonox::~Orxonox () 
69{
70  int i =0;
71  Orxonox::singletonRef = NULL;
72  if( world != NULL) delete world;
73  if( localinput != NULL) delete localinput;
74  if( resources != NULL) delete resources;
75  delete GraphicsEngine::getInstance(); // deleting the Graphics
76  delete ResourceManager::getInstance(); // deletes the Resource Manager
77  delete TextEngine::getInstance();
78}
79
80/** \brief this is a singleton class to prevent duplicates */
81Orxonox* Orxonox::singletonRef = 0;
82
83/**
84   \returns reference or new Object of Orxonox if not existent.
85*/
86Orxonox* Orxonox::getInstance (void)
87{
88  if (singletonRef == NULL)
89    singletonRef = new Orxonox();
90  return singletonRef;
91}
92
93/**
94   \brief this finds the config file
95   
96   Since the config file varies from user to user and since one may want to specify different config files
97   for certain occasions or platforms this function finds the right config file for every occasion and stores
98   it's path and name into configfilename
99*/
100void Orxonox::getConfigFile (int argc, char** argv)
101{
102  strcpy (configfilename, "~/.orxonox/orxonox.conf");
103}
104
105/**
106   \brief initialize Orxonox with command line
107*/
108int Orxonox::init (int argc, char** argv)
109{
110  this->argc = argc;
111  this->argv = argv;
112  // parse command line
113  // config file
114 
115  getConfigFile (argc, argv);
116  SDL_Init (SDL_INIT_TIMER);
117  // initialize everything
118  printf("> Initializing resources\n");
119  if( initResources () == -1) return -1;
120
121  if( initVideo() == -1) return -1;
122  if( initSound() == -1) return -1;
123  printf("> Initializing input\n");
124  if( initInput() == -1) return -1;
125  printf("> Initializing networking\n");
126  if( initNetworking () == -1) return -1;
127  //printf("> Initializing world\n");
128  //if( init_world () == -1) return -1; PB: world will be initialized when started
129 
130  return 0;
131}
132
133/**
134   \brief initializes SDL and OpenGL
135*/
136int Orxonox::initVideo() 
137{
138  PRINTF(3)("> Initializing video\n");
139 
140  GraphicsEngine::getInstance();
141   
142  return 0;
143}
144
145
146/**
147   \brief initializes the sound engine
148*/
149int Orxonox::initSound() 
150{
151  printf("> Initializing sound\n");
152  // SDL_Init(SDL_INIT_AUDIO);
153  printf("Not yet implemented\n");
154  return 0;
155}
156
157
158/**
159   \brief initializes input functions
160*/
161int Orxonox::initInput() 
162{
163  // create localinput
164  localinput = new CommandNode(configfilename);
165 
166  return 0;
167}
168
169
170/**
171   \brief initializes network system
172*/
173int Orxonox::initNetworking() 
174{
175  printf("Not yet implemented\n");
176  return 0;
177}
178
179
180/**
181   \brief initializes and loads resource files
182*/
183int Orxonox::initResources() 
184{
185  PRINT(3)("initializing ResourceManager\n");
186  resourceManager = ResourceManager::getInstance();
187
188  // create parser
189  IniParser parser (DEFAULT_CONFIG_FILE);
190  if( parser.getSection (CONFIG_SECTION_DATA) == -1)
191    {
192      PRINTF(1)("Could not find Section %s in %s\n", CONFIG_SECTION_DATA, DEFAULT_CONFIG_FILE);
193      return -1;
194    }
195  char namebuf[256];
196  char valuebuf[256];
197  memset (namebuf, 0, 256);
198  memset (valuebuf, 0, 256);
199 
200  while( parser.nextVar (namebuf, valuebuf) != -1)
201    {
202      if (!strcmp(namebuf, CONFIG_NAME_DATADIR))
203        {
204          //  printf("Not yet implemented\n");
205          if (!resourceManager->setDataDir(valuebuf))
206            {
207              PRINTF(1)("Data Could not be located\n");
208              exit(-1);
209            }
210        }
211     
212      memset (namebuf, 0, 256);
213      memset (valuebuf, 0, 256);
214    }
215 
216  if (!resourceManager->checkDataDir(DEFAULT_DATA_DIR_CHECKFILE))
217    {
218      PRINTF(1)("The DataDirectory %s could not be verified\nPlease Change in File %s Section %s Entry %s to a suitable value\n",
219                resourceManager->getDataDir(),
220                DEFAULT_CONFIG_FILE,
221                CONFIG_SECTION_DATA,
222                CONFIG_NAME_DATADIR);
223      exit(-1);
224    }
225
226
227  PRINT(3)("initializing TextEngine\n");
228  TextEngine::getInstance();
229
230  return 0;
231}
232
233
234/**
235   \brief initializes the world
236*/
237int Orxonox::initWorld() 
238{
239  //world = new World();
240 
241  // TO DO: replace this with a menu/intro
242  //world->load_debug_level();
243 
244  return 0;
245}
246
247
248/**
249   \brief starts the orxonox game or menu
250
251   here is the central orxonox state manager. There are currently two states
252   - menu
253   - game-play
254   both states manage their states themselfs again.
255*/
256void Orxonox::start()
257{
258 
259  this->gameLoader = GameLoader::getInstance();
260  this->gameLoader->loadCampaign("worlds/DefaultCampaign.oxc");
261  //  this->gameLoader->loadDebugCampaign(DEBUG_CAMPAIGN_0);
262  this->gameLoader->init();
263  this->gameLoader->start();
264}
265
266
267/**
268   \brief exits Orxonox
269*/
270void Orxonox::quitGame() 
271{
272  bQuitOrxonox = true;
273}
274
275
276
277/**
278   \brief handles sprecial events from localinput
279   \param event: an event not handled by the CommandNode
280*/
281void Orxonox::eventHandler(SDL_Event* event)
282{
283  // Handle special events such as reshape, quit, focus changes
284  switch (event->type)
285    {
286    case SDL_VIDEORESIZE:
287      GraphicsEngine* tmpGEngine = GraphicsEngine::getInstance();
288      tmpGEngine->resolutionChanged(&event->resize);
289      break;
290    }
291}
292 
293
294/**
295   \brief handle keyboard commands that are not meant for WorldEntities
296   \param cmd: the command to handle
297   \return true if the command was handled by the system or false if it may be passed to the WorldEntities
298*/
299bool Orxonox::systemCommand(Command* cmd)
300{
301  /*
302  if( !strcmp( cmd->cmd, "quit"))
303    {
304      if( !cmd->bUp) this->gameLoader->stop();
305      return true;
306    }
307  return false;
308  */
309  return false;
310}
311
312/**
313   \brief retrieve a pointer to the local CommandNode
314   \return a pointer to localinput
315*/
316CommandNode* Orxonox::getLocalInput()
317{
318  return localinput;
319}
320
321
322/**
323   \brief retrieve a pointer to the local World
324   \return a pointer to world
325*/
326World* Orxonox::getWorld()
327{
328  return world;
329}
330
331/**
332   \return The reference of the SDL-screen of orxonox
333*/
334SDL_Surface* Orxonox::getScreen ()
335{
336  return this->screen;
337}
338
339
340bool showGui = false;
341
342/**
343   \brief main function
344
345   here the journey begins
346*/
347int main(int argc, char** argv) 
348{ 
349
350  printf("+ This version of orxonox is for testing purposes    +\n");
351  printf("+ In order to run it, you will need some files for   +\n");
352  printf("+ the data/fonts and data/models repository.         +\n");
353  printf("+ If you don't have them, the app will terminate     +\n");
354  printf("+ with a segfault...                                 +\n");
355  printf("+                    ...bzzzzz... paede out...       +\n");
356  printf("++++++++++++++++++++++++++++++++++++++++++++++++++++++\n");
357
358
359  int i;
360  for(i = 1; i < argc; ++i)
361    {
362      if(! strcmp( "--help", argv[i]) || !strcmp("-h", argv[i])) return startHelp(argc, argv);
363      else if(!strcmp( "--benchmark", argv[i]) || !strcmp("-b", argv[i])) return startBenchmarks();
364      else if(!strcmp( "--gui", argv[i]) || !strcmp("-g", argv[i])) showGui = true;
365      //      else PRINTF(2)("Orxonox does not understand the arguments %s\n", argv[i]);
366    }
367
368  return startOrxonox(argc, argv);
369}
370
371
372
373int startHelp(int argc, char** argv)
374{
375  PRINT(0)("orxonox: starts the orxonox game - rules\n");
376  PRINT(0)("usage: orxonox [arg [arg...]]\n\n");
377  PRINT(0)("valid options:\n");
378  {
379    Gui* gui = new Gui(argc, argv);
380    gui->printHelp();
381    delete gui;
382  }
383  PRINT(0)(" -b|--benchmark:\t\tstarts the orxonox benchmark\n");
384  PRINT(0)(" -h|--help:\t\t\tshows this help\n");
385}
386
387
388int startOrxonox(int argc, char** argv)
389{
390  // checking for existence of the configuration-files
391  if (showGui ||
392      !ResourceManager::isFile("~/.orxonox/orxonox.conf") ||
393      ResourceManager::isFile("~/.orxonox/orxonox.lock"))
394    {
395      if (ResourceManager::isFile("~/.orxonox/orxonox.lock"))
396        ResourceManager::deleteFile("~/.orxonox/orxonox.lock");
397     
398      // starting the GUI
399      Gui* gui = new Gui(argc, argv);
400      gui->startGui();
401
402      if (! gui->startOrxonox)
403        return 0;
404     
405      delete gui;
406    }
407 
408  PRINT(0)(">>> Starting Orxonox <<<\n");
409
410  ResourceManager::touchFile("~/.orxonox/orxonox.lock");
411
412  Orxonox *orx = Orxonox::getInstance();
413 
414  if((*orx).init(argc, argv) == -1)
415    {
416      PRINTF(1)("! Orxonox initialization failed\n");
417      return -1;
418    }
419 
420  orx->start();
421 
422  delete orx;
423  ResourceManager::deleteFile("~/.orxonox/orxonox.lock");
424 
425}
Note: See TracBrowser for help on using the repository browser.