Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: orxonox.OLD/branches/new_class_id/src/orxonox.cc @ 9854

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

more nice comments, and also updated the KeepLevel loading (if you want to load a Resource to a KeepLevel just append it at loadtime:
eg.:
Texture tex = ResourceTexture(orxonox.png, GL_TEXTURE_2D, GameEnd);
where GameEnd is the KeepLevel as defined in orxonox.cc→initResources()

File size: 16.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#define DEBUG_SPECIAL_MODULE DEBUG_MODULE_ORXONOX
28#include "orxonox.h"
29
30#include "globals.h"
31
32#include "gui/qt/qt_gui.h"
33#include "gui/qt/qt_gui_datadir_fallback.h"
34
35#include "parser/ini_parser/ini_parser.h"
36#include "util/loading/game_loader.h"
37#include "util/signal_handler.h"
38
39//ENGINES
40#include "graphics_engine.h"
41#include "sound_engine.h"
42#include "util/loading/resource_manager.h"
43
44#include "cd_engine.h"
45#include "event_handler.h"
46
47#include "loading/fast_factory.h"
48
49#include "subprojects/benchmark.h"
50
51#include "shell_command_class.h"
52#include "shell_command.h"
53#include "shell_buffer.h"
54
55#include "network_manager.h"
56#include "shared_network_data.h"
57
58#include "state.h"
59#include "lib/parser/preferences/cmd_line_prefs_reader.h"
60#include "lib/parser/preferences/ini_file_prefs_reader.h"
61#include <string.h>
62
63int verbose = 5;
64
65
66
67SHELL_COMMAND(restart, Orxonox, restart);
68
69REGISTER_ARG_FLAG( l, license,    "misc",  "showLicenseAndExit", "Prints the license and exit",      "1" );
70REGISTER_ARG_FLAG( c, client,     "game",  "gameType",           "Connect to Server (-H)",           "multiplayer_client" );
71REGISTER_ARG_FLAG( s, server,     "game",  "gameType",           "Start Orxonox as Game Server",     "multiplayer_master_server" );
72REGISTER_ARG_FLAG( x, proxy,      "game",  "gameType",           "Start Orxonox as Proxy Server",    "multiplayer_proxy_server" );
73REGISTER_ARG_ARG(  H, host,       "game",  "host",               "Host to connect to",               "host");
74REGISTER_ARG_ARG(  p, port,       "game",  "port",               "Port to use",                      "port" );
75REGISTER_ARG_FLAG( g, gui,        "game",  "showGui",            "starts the orxonox with the configuration GUI", "1");
76
77REGISTER_ARG_FLAG( f, fullscreen, "video", "Fullscreen-mode",    "start Orxonox in fullscreen mode", "1");
78REGISTER_ARG_FLAG( w, windowed,   "video", "Fullscreen-mode",    "start Orxonox in windowed mode",   "0");
79REGISTER_ARG_ARG(  r, resolution, "video", "Resolution",         "sets resolution / window size",    "res");
80REGISTER_ARG_FLAG( d, dedicated,  "video", "Norender-mode",      "the scene is not rendered",        "1" );
81
82REGISTER_ARG_FLAG( a, audio,      "audio", "Disable-Audio",      "Enable audio",                     "0" );
83REGISTER_ARG_FLAG( m, mute ,      "audio", "Disable-Audio",      "Disable audio",                    "1" );
84REGISTER_ARG_ARG(  _, audio_channels, "audio", "Audio-Channels", "Sets # audio channels", "num" );
85REGISTER_ARG_ARG(  _, music_volume, "audio", "Music-Volume", "Sets music volume", "vol" );
86REGISTER_ARG_ARG(  _, effects_volume, "audio", "Effects-Volume", "Sets effects volume", "vol" );
87
88#ifndef __WIN32__
89REGISTER_ARG_FLAG( _, write_bt_to_file, "misc", "bt-to-file", "Write backtrace to file", "1");
90#endif
91
92REGISTER_ARG_ARG(  t, telnetport,  "network","telnetport",        "Port to use for network debug output",               "port" );
93REGISTER_ARG_ARG(  _, write_dict,  "compression", "writedict",    "write packets to DATA/dicts/newdict",               "numBytes" );
94
95ObjectListDefinition(Orxonox);
96
97/**
98 *  create a new Orxonox
99
100   In this funcitons only global values are set. The game will not be started here.
101*/
102Orxonox::Orxonox ()
103{
104  this->registerObject(this, Orxonox::_objectList);
105  this->setName("orxonox-main");
106
107  this->argc = 0;
108  this->argv = NULL;
109
110  /* this way, there is no network enabled: */
111  this->serverName = "";
112  this->port = -1;
113
114  this->configFileName = "";
115}
116
117/**
118 *  remove Orxonox from memory
119*/
120Orxonox::~Orxonox ()
121{
122  // game-specific
123  delete GameLoader::getInstance();
124
125  // class-less services/factories
126  FastFactory::deleteAll();
127  OrxShell::ShellCommandClass::unregisterAllCommands();
128
129  // handlers
130  Resources::ResourceManager::deleteInstance(); // deletes the Resource Manager
131
132  // engines
133  delete CDEngine::getInstance();
134  delete OrxSound::SoundEngine::getInstance();
135  delete GraphicsEngine::getInstance(); // deleting the Graphics
136  delete EventHandler::getInstance();
137
138  // output-buffer
139  delete OrxShell::ShellBuffer::getInstance();
140
141  SDL_QuitSubSystem(SDL_INIT_TIMER);
142
143
144  ObjectListBase::debugAll(1);
145
146  Preferences::getInstance()->save();
147
148  PRINT(3)
149  (
150    "===================================================\n" \
151    "Thanks for playing orxonox.\n" \
152    "visit: http://www.orxonox.net for new versions.\n" \
153    "===================================================\n" \
154    ORXONOX_LICENSE_SHORT
155  );
156
157  Orxonox::singletonRef = NULL;
158}
159
160/**
161 *  this is a singleton class to prevent duplicates
162 */
163Orxonox* Orxonox::singletonRef = NULL;
164
165// DANGEROUS
166void Orxonox::restart()
167{
168  //   int argc = this->argc;
169  //   char** argv = this->argv;
170  //
171  //   Orxonox *orx = Orxonox::getInstance();
172  //
173  //   delete orx;
174  //
175  //   orx = Orxonox::getInstance();
176  //
177  //   if((*orx).init(argc, argv) == -1)
178  //   {
179  //     PRINTF(1)("! Orxonox initialization failed\n");
180  //     return;
181  //   }
182  //
183  //   printf("finished inizialisation\n");
184  //   orx->start();
185}
186
187/**
188 * @brief this finds the config file
189 * @returns the new config-fileName
190 * Since the config file varies from user to user and since one may want to specify different config files
191 * for certain occasions or platforms this function finds the right config file for every occasion and stores
192 * it's path and name into configfilename
193*/
194const std::string& Orxonox::getConfigFile ()
195{
196  File orxConfFile("orxonox.conf");
197  if (orxConfFile.isFile())
198  {
199    this->configFileName =  "orxonox.conf";
200  }
201  else
202    this->configFileName = File(DEFAULT_CONFIG_FILE).name();
203
204  PRINTF(3)("Parsed Config File: '%s'\n", this->configFileName.c_str());
205  return this->configFileName;
206}
207
208/**
209 * initialize Orxonox with command line
210 */
211int Orxonox::init (int argc, char** argv, const std::string & name, int port)
212{
213  this->argc = argc;
214  this->argv = argv;
215
216  this->serverName = name;
217  this->port = port;
218
219  // initialize the Config-file
220  this->getConfigFile();
221
222  // windows must not write into stdout.txt and stderr.txt
223  /*#ifdef __WIN32__
224  freopen( "CON", "w", stdout );
225  freopen( "CON", "w", stderr );
226  #endif*/
227
228  // initialize everything
229  SDL_Init(0);
230  if( initVideo() == -1)
231    return -1;
232  if( initResources () == -1)
233    return -1;
234  if( initSound() == -1)
235    return -1;
236  if( initInput() == -1)
237    return -1;
238  if( initNetworking () == -1)
239    return -1;
240  if( initMisc () == -1)
241    return -1;
242
243  return 0;
244}
245
246
247/**
248 * initializes SDL and OpenGL
249 */
250int Orxonox::initVideo()
251{
252  PRINTF(3)("> Initializing video\n");
253
254  GraphicsEngine::getInstance();
255
256  GraphicsEngine::getInstance()->initFromPreferences();
257
258  std::string iconName = Resources::ResourceManager::getInstance()->prependAbsoluteMainPath("pictures/fighter-top-32x32.bmp");
259  if (!iconName.empty())
260  {
261    GraphicsEngine::getInstance()->setWindowName(PACKAGE_NAME " " PACKAGE_VERSION, iconName);
262  }
263  return 0;
264}
265
266
267/**
268 * initializes the sound engine
269 */
270int Orxonox::initSound()
271{
272  PRINT(3)("> Initializing sound\n");
273  // SDL_InitSubSystem(SDL_INIT_AUDIO);
274  OrxSound::SoundEngine::getInstance();
275
276  OrxSound::SoundEngine::getInstance()->loadSettings();
277  OrxSound::SoundEngine::getInstance()->initAudio();
278  return 0;
279}
280
281
282/**
283 * initializes input functions
284 */
285int Orxonox::initInput()
286{
287  PRINT(3)("> Initializing input\n");
288
289  EventHandler::getInstance()->init();
290  EventHandler::getInstance()->subscribe(GraphicsEngine::getInstance(), ES_ALL, EV_VIDEO_RESIZE);
291
292  return 0;
293}
294
295
296/**
297 * initializes network system
298 */
299int Orxonox::initNetworking()
300{
301  PRINT(3)("> Initializing networking\n");
302  std::string gameType = Preferences::getInstance()->getString( "game", "gameType", "" );
303
304  if( gameType == "multiplayer_client")
305  {    // we are a client
306    State::setOnline(true);
307    SharedNetworkData::getInstance()->setNodeType(NET_CLIENT);
308    NetworkManager::getInstance()->createClient(this->serverName, port);
309  }
310  else if( gameType == "multiplayer_master_server")
311  {    // we are a master server
312    State::setOnline(true);
313    SharedNetworkData::getInstance()->setNodeType(NET_MASTER_SERVER);
314
315    NetworkManager::getInstance()->createMasterServer(port);
316  }
317  else if( gameType == "multiplayer_proxy_server")
318  {    // we are a proxy server
319    State::setOnline(true);
320    SharedNetworkData::getInstance()->setNodeType(NET_PROXY_SERVER_ACTIVE);
321    NetworkManager::getInstance()->createProxyServer(port);
322  }
323
324  return 0;
325
326}
327
328//#include "util/loading/dynamic_loader.h"
329/**
330 * initializes and loads resource files
331 */
332int Orxonox::initResources()
333{
334  PRINTF(3)("> Initializing resources\n");
335
336  PRINT(3)("initializing ResourceManager\n");
337
338  // init the resource manager
339  std::string dataPath;
340  if ((dataPath = Preferences::getInstance()->getString(CONFIG_SECTION_GENERAL, CONFIG_NAME_DATADIR, ""))!= "")
341  {
342    Resources::ResourceManager::getInstance()->setMainGlobalPath(dataPath) ;
343    if(!Resources::ResourceManager::getInstance()->checkFileInMainPath(File(DEFAULT_DATA_DIR_CHECKFILE)))
344    {
345      PRINTF(1)("Data Could not be located in %s\n", dataPath.c_str());
346    }
347  }
348  while (!Resources::ResourceManager::getInstance()->checkFileInMainPath(File(DEFAULT_DATA_DIR_CHECKFILE)))
349  {
350
351    PRINTF(1)("The DataDirectory %s could not be verified\n\nh" \
352              "!!!  Please Change in File %s Section %s Entry %s to a suitable value !!!\n",
353              Resources::ResourceManager::getInstance()->mainGlobalPath().name().c_str(),
354              this->configFileName.c_str(),
355              CONFIG_SECTION_GENERAL,
356              CONFIG_NAME_DATADIR );
357    OrxGui::Gui* gui = new OrxGui::QtGuiDataDirFallback(argc, argv);
358    gui->startGui();
359    if (gui->getState() == OrxGui::Gui::Quitting)
360      return(-1);
361    delete gui;
362    Resources::ResourceManager::getInstance()->setMainGlobalPath(Preferences::getInstance()->getString(CONFIG_SECTION_GENERAL, CONFIG_NAME_DATADIR, ""));
363  }
364
365  //! @todo this is a hack and should be loadable
366  Resources::ResourceManager::getInstance()->addResourceSubPath("Texture", "maps");
367  Resources::ResourceManager::getInstance()->addResourceSubPath("Texture", "pictures");
368
369  Resources::ResourceManager::getInstance()->addResourceSubPath("SoundBuffer", "sound");
370  Resources::ResourceManager::getInstance()->addResourceSubPath("SoundBuffer", "music");
371
372  Resources::ResourceManager::getInstance()->addResourceSubPath("Shader", "shaders");
373  Resources::ResourceManager::getInstance()->addResourceSubPath("OBJ", "models");
374
375  Resources::ResourceManager::getInstance()->addKeepLevelName("Imediately");
376  Resources::ResourceManager::getInstance()->addKeepLevelName("LevelEnd");
377  Resources::ResourceManager::getInstance()->addKeepLevelName("CampaignEnd");
378  Resources::ResourceManager::getInstance()->addKeepLevelName("GameEnd");
379  Resources::ResourceManager::getInstance()->setDefaultKeepLevel(std::string("GameEnd"));
380
381  return 0;
382}
383
384/**
385 * initializes miscelaneous features
386 * @return -1 on failure
387 */
388int Orxonox::initMisc()
389{
390  OrxShell::ShellBuffer::getInstance();
391
392  // start the collision detection engine
393  CDEngine::getInstance();
394
395  return 0;
396}
397
398/**
399 *  starts the orxonox game or menu
400 * here is the central orxonox state manager. There are currently two states
401 * - menu
402 * - game-play
403 * both states manage their states themselfs again.
404*/
405void Orxonox::start()
406{
407
408  this->gameLoader = GameLoader::getInstance();
409
410  if( this->port != -1)
411    this->gameLoader->loadNetworkCampaign("worlds/DefaultNetworkCampaign.oxc");
412  else
413    this->gameLoader->loadCampaign("worlds/DefaultCampaign.oxc");                       /* start orxonox in single player mode */
414
415  //  this->gameLoader->loadDebugCampaign(DEBUG_CAMPAIGN_0);
416  this->gameLoader->init();
417  this->gameLoader->start();
418}
419
420
421/**
422 * handles sprecial events from localinput
423 * @param event: an event not handled by the CommandNode
424 */
425// void Orxonox::graphicsHandler(SDL_Event* event)
426// {
427//   // Handle special events such as reshape, quit, focus changes
428//   switch (event->type)
429//     {
430//     case SDL_VIDEORESIZE:
431//       GraphicsEngine* tmpGEngine = GraphicsEngine::getInstance();
432//       tmpGEngine->resolutionChanged(event->resize);
433//       break;
434//     }
435// }
436
437
438
439
440
441
442bool showGui = false;
443
444/**********************************
445*** ORXONOX MAIN STARTING POINT ***
446**********************************/
447/**
448 *
449 *  main function
450 *
451 * here the journey begins
452*/
453int main(int argc, char** argv)
454{
455  CmdLinePrefsReader prefs;
456
457  IniFilePrefsReader ini(File(DEFAULT_CONFIG_FILE).name());
458  Preferences::getInstance()->setUserIni(File(DEFAULT_CONFIG_FILE).name());
459
460  prefs.parse(argc, argv);
461
462  if ( Preferences::getInstance()->getString("misc", "showLicenseAndExit", "") == "1" )
463  {
464    PRINT(0)(ORXONOX_LICENSE_SHORT);
465    return 0;
466  }
467
468  if ( Preferences::getInstance()->getString("misc", "bt-to-file", "1") == "1" )
469  {
470    SignalHandler::getInstance()->doCatch( argv[0], "orxonox.backtrace" );
471    SignalHandler::getInstance()->registerCallback( EventHandler::releaseMouse, NULL );
472  }
473
474  if( Preferences::getInstance()->getString("game", "showGui", "") == "1" )
475    showGui = true;
476  else if( Preferences::getInstance()->getString( "game", "gameType", "" ) == "multiplayer_master_server" ||
477           Preferences::getInstance()->getString( "game", "gameType", "" ) == "multiplayer_proxy_server" ||
478           Preferences::getInstance()->getString( "game", "gameType", "" ) == "multiplayer_client" )
479    return startNetworkOrxonox(argc, argv);
480
481  return startOrxonox(argc, argv, "", -1);
482}
483
484
485
486/**
487 * starts orxonox in network mode
488 * @param argc parameters count given to orxonox
489 * @param argv parameters given to orxonox
490 */
491int startNetworkOrxonox(int argc, char** argv)
492{
493
494  std::string gameType = Preferences::getInstance()->getString( "game", "gameType", "" );
495
496  if ( gameType == "multiplayer_client" )
497  {
498    int port = Preferences::getInstance()->getInt( "game", "port", DEFAULT_ORXONOX_PORT );
499    std::string host = Preferences::getInstance()->getString( "game", "host", "" );
500
501    if ( host == "" )
502    {
503      printf("You need to specify a host to connect to ( -H <host> )\n");
504      return 1;
505    }
506
507    printf("Starting Orxonox as client: connecting to %s, on port %i\n", host.c_str(), port);
508
509    startOrxonox(argc, argv, host.c_str(), port);
510  }
511  else if ( gameType == "multiplayer_master_server" )
512  {
513    int port = Preferences::getInstance()->getInt( "game", "port", DEFAULT_ORXONOX_PORT );
514
515    printf("Starting Orxonox as server: listening on port %i\n", port);
516
517    startOrxonox(argc, argv, "", port);
518  }
519  else if ( gameType == "multiplayer_proxy_server" )
520  {
521    int port = Preferences::getInstance()->getInt( "game", "port", DEFAULT_ORXONOX_PORT );
522
523    printf("Starting Orxonox as proxy server: listening on port %i\n", port);
524
525    startOrxonox(argc, argv, "", port);
526  }
527  return 1;
528}
529
530
531
532/**
533 * starts orxonox
534 * @param argc parameters count given to orxonox
535 * @param argv parameters given to orxonox
536 */
537int startOrxonox(int argc, char** argv, const std::string & name, int port)
538{
539  // checking for existence of the configuration-files, or if the lock file is still used
540  if (showGui || (!File("./orxonox.conf").isFile() &&
541                  !File(DEFAULT_CONFIG_FILE).isFile())
542#if DEBUG_LEVEL <= 3 // developers do not need to see the GUI, when orxonox fails
543      || ResourceManager::isFile(DEFAULT_LOCK_FILE)
544#endif
545     )
546  {
547    File lockFile(DEFAULT_LOCK_FILE);
548    if (lockFile.isFile())
549      lockFile.remove();
550
551    // starting the GUI
552    OrxGui::QtGui gui(argc, argv);
553    gui.startGui();
554
555    if (gui.getState() & OrxGui::Gui::Quitting)
556      return 0;
557
558  }
559
560  PRINT(0)(">>> Starting Orxonox <<<\n");
561
562  File(DEFAULT_LOCK_FILE).touch();
563
564  Orxonox *orx = Orxonox::getInstance();
565
566  if( orx->init(argc, argv, name, port) == -1)
567  {
568    PRINTF(1)("! Orxonox initialization failed\n");
569    return -1;
570  }
571
572  printf("finished inizialisation\n");
573  orx->start();
574
575  delete orx;
576  File("~/.orxonox/orxonox.lock").remove();
577  return 0;
578}
Note: See TracBrowser for help on using the repository browser.