Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: orxonox.OLD/trunk/src/orxonox.cc @ 7123

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

orxonox/trunk: some cleanup before the new tag

  1. BaseObject isA was wrong… every subclass was detected as any other subclass
  2. Classes get unloaded again as they should
  3. some minor fixes (Material* → Material) and some other cleanups
File size: 13.2 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#define DEBUG_SPECIAL_MODULE DEBUG_MODULE_ORXONOX
28#include "orxonox.h"
29
30#include "globals.h"
31
32#include "gui.h"
33
34#include "parser/ini_parser/ini_parser.h"
35#include "game_loader.h"
36
37//ENGINES
38#include "graphics_engine.h"
39#include "sound_engine.h"
40#include "resource_manager.h"
41#include "cd_engine.h"
42#include "text_engine.h"
43#include "event_handler.h"
44
45#include "factory.h"
46#include "fast_factory.h"
47
48#include "benchmark.h"
49
50#include "class_list.h"
51#include "shell_command_class.h"
52#include "shell_command.h"
53#include "shell_buffer.h"
54
55#include "load_param_description.h"
56
57#include "network_manager.h"
58
59#include "state.h"
60
61#include <string.h>
62
63int verbose = 4;
64
65using namespace std;
66
67SHELL_COMMAND(restart, Orxonox, restart);
68
69/**
70 *  create a new Orxonox
71
72   In this funcitons only global values are set. The game will not be started here.
73*/
74Orxonox::Orxonox ()
75{
76  this->setClassID(CL_ORXONOX, "Orxonox");
77  this->setName("orxonox-main");
78
79  this->iniParser = NULL;
80
81  this->argc = 0;
82  this->argv = NULL;
83
84  /* this way, there is no network enabled: */
85  this->serverName = NULL;
86  this->port = -1;
87
88  this->configFileName = NULL;
89}
90
91/**
92 *  remove Orxonox from memory
93*/
94Orxonox::~Orxonox ()
95{
96  // game-specific
97  delete GameLoader::getInstance();
98
99  // class-less services/factories
100  Factory::deleteFactories();
101  FastFactory::deleteAll();
102  ShellCommandClass::unregisterAllCommands();
103
104  LoadClassDescription::deleteAllDescriptions();
105
106  // engines
107  delete CDEngine::getInstance();
108  delete SoundEngine::getInstance();
109  delete GraphicsEngine::getInstance(); // deleting the Graphics
110  delete EventHandler::getInstance();
111
112  // handlers
113  delete ResourceManager::getInstance(); // deletes the Resource Manager
114  // output-buffer
115  delete ShellBuffer::getInstance();
116
117  // orxonox class-stuff
118  delete this->iniParser;
119  delete[] this->configFileName;
120
121  SDL_QuitSubSystem(SDL_INIT_TIMER);
122  ClassList::debug(3);
123
124  PRINT(3)
125  (
126    "===================================================\n" \
127    "Thanks for playing orxonox.\n" \
128    "visit: http://www.orxonox.net for new versions.\n" \
129    "===================================================\n" \
130    ORXONOX_LICENSE_SHORT
131  );
132
133  Orxonox::singletonRef = NULL;
134}
135
136/**
137 *  this is a singleton class to prevent duplicates
138 */
139Orxonox* Orxonox::singletonRef = NULL;
140
141// DANGEROUS
142void Orxonox::restart()
143{
144  //   int argc = this->argc;
145  //   char** argv = this->argv;
146  //
147  //   Orxonox *orx = Orxonox::getInstance();
148  //
149  //   delete orx;
150  //
151  //   orx = Orxonox::getInstance();
152  //
153  //   if((*orx).init(argc, argv) == -1)
154  //   {
155  //     PRINTF(1)("! Orxonox initialization failed\n");
156  //     return;
157  //   }
158  //
159  //   printf("finished inizialisation\n");
160  //   orx->start();
161}
162
163/**
164 *  this finds the config file
165 * @returns the new config-fileName
166 * Since the config file varies from user to user and since one may want to specify different config files
167 * for certain occasions or platforms this function finds the right config file for every occasion and stores
168 * it's path and name into configfilename
169*/
170const char* Orxonox::getConfigFile ()
171{
172  if (ResourceManager::isFile("orxonox.conf"))
173  {
174    this->configFileName = new char[strlen("orxonox.conf")+1];
175    strcpy(this->configFileName, "orxonox.conf");
176  }
177  else
178    this->configFileName = ResourceManager::homeDirCheck(DEFAULT_CONFIG_FILE);
179  this->iniParser = new IniParser(this->configFileName);
180  PRINTF(3)("Parsed Config File: '%s'\n", this->configFileName);
181}
182
183/**
184 * initialize Orxonox with command line
185 */
186int Orxonox::init (int argc, char** argv, const char* name, int port)
187{
188  this->argc = argc;
189  this->argv = argv;
190
191  this->serverName = name;
192  this->port = port;
193
194  // initialize the Config-file
195  this->getConfigFile();
196
197  // windows must not write into stdout.txt and stderr.txt
198  /*#ifdef __WIN32__
199  freopen( "CON", "w", stdout );
200  freopen( "CON", "w", stderr );
201  #endif*/
202
203  // initialize everything
204  SDL_Init(0);
205  if( initResources () == -1)
206    return -1;
207  if( initVideo() == -1)
208    return -1;
209  if( initSound() == -1)
210    return -1;
211  if( initInput() == -1)
212    return -1;
213  if( initNetworking () == -1)
214    return -1;
215  if( initMisc () == -1)
216    return -1;
217
218  return 0;
219}
220
221
222/**
223 * initializes SDL and OpenGL
224 */
225int Orxonox::initVideo()
226{
227  PRINTF(3)("> Initializing video\n");
228
229  GraphicsEngine::getInstance();
230
231  GraphicsEngine::getInstance()->initFromIniFile(this->iniParser);
232
233  char* iconName = ResourceManager::getFullName("pictures/fighter-top-32x32.bmp");
234  if (iconName != NULL)
235  {
236    GraphicsEngine::getInstance()->setWindowName(PACKAGE_NAME " " PACKAGE_VERSION, iconName);
237    delete[] iconName;
238  }
239  return 0;
240}
241
242
243/**
244 * initializes the sound engine
245 */
246int Orxonox::initSound()
247{
248  PRINT(3)("> Initializing sound\n");
249  // SDL_InitSubSystem(SDL_INIT_AUDIO);
250  SoundEngine::getInstance();
251
252  SoundEngine::getInstance()->loadSettings(this->iniParser);
253  SoundEngine::getInstance()->initAudio();
254  return 0;
255}
256
257
258/**
259 * initializes input functions
260 */
261int Orxonox::initInput()
262{
263  PRINT(3)("> Initializing input\n");
264
265  EventHandler::getInstance()->init(this->iniParser);
266  EventHandler::getInstance()->subscribe(GraphicsEngine::getInstance(), ES_ALL, EV_VIDEO_RESIZE);
267
268  return 0;
269}
270
271
272/**
273 * initializes network system
274 */
275int Orxonox::initNetworking()
276{
277  PRINT(3)("> Initializing networking\n");
278
279  if( this->serverName != NULL) // we are a client
280  {
281    State::setOnline(true);
282    NetworkManager::getInstance()->establishConnection(this->serverName, port);
283  }
284  else if( this->port > 0) {    // we are a server
285    State::setOnline(true);
286    NetworkManager::getInstance()->createServer(port);
287  }
288  return 0;
289}
290
291
292/**
293 * initializes and loads resource files
294 */
295int Orxonox::initResources()
296{
297  PRINTF(3)("> Initializing resources\n");
298
299  PRINT(3)("initializing ResourceManager\n");
300
301  // init the resource manager
302  const char* dataPath;
303  if ((dataPath = this->iniParser->getVar(CONFIG_NAME_DATADIR, CONFIG_SECTION_DATA))!= NULL)
304  {
305    if (!ResourceManager::getInstance()->setDataDir(dataPath) &&
306        !ResourceManager::getInstance()->verifyDataDir(DEFAULT_DATA_DIR_CHECKFILE))
307    {
308      PRINTF(1)("Data Could not be located in %s\n", dataPath);
309    }
310  }
311
312  if (!ResourceManager::getInstance()->verifyDataDir(DEFAULT_DATA_DIR_CHECKFILE))
313  {
314    PRINTF(1)("The DataDirectory %s could not be verified\n\nh" \
315              "!!!  Please Change in File %s Section %s Entry %s to a suitable value !!!\n",
316              ResourceManager::getInstance()->getDataDir(),
317              this->configFileName,
318              CONFIG_SECTION_DATA,
319              CONFIG_NAME_DATADIR );
320    Gui* gui = new Gui(argc, argv);
321    gui->startGui();
322    delete gui;
323    exit(-1);
324  }
325  //! @todo this is a hack and should be loadable
326  char* imageDir = ResourceManager::getInstance()->getFullName("maps");
327  ResourceManager::getInstance()->addImageDir(imageDir);
328  delete[] imageDir;
329  imageDir = ResourceManager::getInstance()->getFullName("pictures");
330  ResourceManager::getInstance()->addImageDir(imageDir);
331  delete[] imageDir;
332
333  // start the collision detection engine
334  CDEngine::getInstance();
335  return 0;
336}
337
338/**
339 * initializes miscelaneous features
340 * @return -1 on failure
341 */
342int Orxonox::initMisc()
343{
344  ShellBuffer::getInstance();
345  return 0;
346}
347
348/**
349 *  starts the orxonox game or menu
350 * here is the central orxonox state manager. There are currently two states
351 * - menu
352 * - game-play
353 * both states manage their states themselfs again.
354*/
355void Orxonox::start()
356{
357
358  this->gameLoader = GameLoader::getInstance();
359
360  if( this->port != -1)
361    this->gameLoader->loadNetworkCampaign("worlds/DefaultNetworkCampaign.oxc");
362  else
363    this->gameLoader->loadCampaign("worlds/DefaultCampaign.oxc");                       /* start orxonox in single player mode */
364
365  //  this->gameLoader->loadDebugCampaign(DEBUG_CAMPAIGN_0);
366  this->gameLoader->init();
367  this->gameLoader->start();
368}
369
370
371/**
372 * handles sprecial events from localinput
373 * @param event: an event not handled by the CommandNode
374 */
375// void Orxonox::graphicsHandler(SDL_Event* event)
376// {
377//   // Handle special events such as reshape, quit, focus changes
378//   switch (event->type)
379//     {
380//     case SDL_VIDEORESIZE:
381//       GraphicsEngine* tmpGEngine = GraphicsEngine::getInstance();
382//       tmpGEngine->resolutionChanged(event->resize);
383//       break;
384//     }
385// }
386
387
388
389
390
391
392bool showGui = false;
393
394
395
396/**********************************
397*** ORXONOX MAIN STARTING POINT ***
398**********************************/
399/**
400 *
401 *  main function
402 *
403 * here the journey begins
404*/
405int main(int argc, char** argv)
406{
407  int i;
408  for(i = 1; i < argc; ++i)
409  {
410    if(     !strcmp( "--help", argv[i])     || !strcmp("-h", argv[i]))
411      return showHelp(argc, argv);
412    else if(!strcmp( "--gui", argv[i])      || !strcmp("-g", argv[i]))
413      showGui = true;
414    else if(!strcmp( "--client", argv[i])   || !strcmp("-c", argv[i]))
415      return startNetworkOrxonox(argc, argv);
416    else if(!strcmp( "--server", argv[i])   || !strcmp("-s", argv[i]))
417      return startNetworkOrxonox(argc, argv);
418    else if(!strcmp( "--license", argv[i])  || !strcmp("-l", argv[i]))
419      return PRINT(0)(ORXONOX_LICENSE_SHORT);
420  }
421
422  return startOrxonox(argc, argv, NULL, -1);
423}
424
425
426
427int showHelp(int argc, char** argv)
428{
429  PRINT(0)("Orxonox Version %s\n", PACKAGE_VERSION);
430  PRINT(0)(" Starts Orxonox - The most furious 3D Action Game :)\n");
431  PRINT(0)("\n");
432  PRINT(0)("Common options:\n");
433  PRINT(0)(" -g, --gui                        starts the orxonox with the configuration GUI \n");
434  PRINT(0)(" -h, --help                       shows this help\n");
435  PRINT(0)("\n");
436  PRINT(0)("Network options:\n");
437  PRINT(0)(" -s, --server [port]              starts Orxonox and listens on the [port] for players\n");
438  PRINT(0)(" -c, --client [hostname] [port]   starts Orxonox as a Client\n");
439  PRINT(0)(" -c, --client [ip address] [port] starts Orxonox as a Client\n");
440  PRINT(0)("\n");
441  PRINT(0)("Other options:\n");
442  PRINT(0)("     --license     prints the licence and exit\n\n");
443  PRINT(0)("\n");
444
445  //   {
446  //     Gui* gui = new Gui(argc, argv);
447  //     gui->printHelp();
448  //     delete gui;
449  //   }
450}
451
452
453
454
455/**
456 * starts orxonox in network mode
457 * @param argc parameters count given to orxonox
458 * @param argv parameters given to orxonox
459 */
460int startNetworkOrxonox(int argc, char** argv)
461{
462
463  int i;
464  for(i = 0; i < argc; ++i )
465  {
466    if( !strcmp( "--client", argv[i]) || !strcmp("-c", argv[i]))
467    {
468      if( argc <= (i+2))
469      {
470        printf(" Wrong arguments try following notations:\n");
471        printf("   --client [server ip address] [port number]\n");
472        printf("   --client [dns name] [port number]\n");
473        return 0;
474      }
475
476      const char* name = argv[i+1];
477      int port = atoi(argv[i+2]);
478      printf("Starting Orxonox as client: connecting to %s, on port %i\n", name, port);
479
480      startOrxonox(argc, argv, name, port);
481    }
482    else if( !strcmp( "--server", argv[i]) || !strcmp("-s", argv[i]))
483    {
484      if( argc <= (i+1))
485      {
486        printf(" Wrong arguments try following notations:\n");
487        printf("   --server [port number]\n");
488        return 0;
489      }
490
491      int port = atoi(argv[i+1]);
492      printf("Starting Orxonox as server, listening on port %i\n", port);
493
494      startOrxonox(argc, argv, NULL, port);
495    }
496  }
497}
498
499
500
501/**
502 * starts orxonox
503 * @param argc parameters count given to orxonox
504 * @param argv parameters given to orxonox
505 */
506int startOrxonox(int argc, char** argv, const char* name, int port)
507{
508  // checking for existence of the configuration-files, or if the lock file is still used
509  if (showGui || (!ResourceManager::isFile("./orxonox.conf") &&
510                  !ResourceManager::isFile(DEFAULT_CONFIG_FILE))
511#if DEBUG < 3 // developers do not need to see the GUI, when orxonox fails
512      || ResourceManager::isFile(DEFAULT_LOCK_FILE)
513#endif
514     )
515  {
516    if (ResourceManager::isFile(DEFAULT_LOCK_FILE))
517      ResourceManager::deleteFile(DEFAULT_LOCK_FILE);
518
519    // starting the GUI
520    Gui* gui = new Gui(argc, argv);
521    gui->startGui();
522
523    if (! gui->startOrxonox)
524      return 0;
525
526    delete gui;
527  }
528
529  PRINT(0)(">>> Starting Orxonox <<<\n");
530
531  ResourceManager::touchFile(DEFAULT_LOCK_FILE);
532
533  Orxonox *orx = Orxonox::getInstance();
534
535  if( orx->init(argc, argv, name, port) == -1)
536  {
537    PRINTF(1)("! Orxonox initialization failed\n");
538    return -1;
539  }
540
541  printf("finished inizialisation\n");
542  orx->start();
543
544  delete orx;
545  ResourceManager::deleteFile("~/.orxonox/orxonox.lock");
546}
Note: See TracBrowser for help on using the repository browser.