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
RevLine 
[4982]1/*
[1850]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,
[4556]18   Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
[1850]19
[1855]20
21   ### File Specific:
22   main-programmer: Patrick Boenzli
[5303]23   co-programmer: Christian Meyer
[4054]24   co-programmer: Benjamin Grauer: injected ResourceManager/GraphicsEngine/GUI
[1850]25*/
26
[5303]27#define DEBUG_SPECIAL_MODULE DEBUG_MODULE_ORXONOX
[2190]28#include "orxonox.h"
[3610]29
[5819]30#include "globals.h"
31
[8145]32#include "gui/qt/qt_gui.h"
[8749]33#include "gui/qt/qt_gui_datadir_fallback.h"
[4054]34
[5944]35#include "parser/ini_parser/ini_parser.h"
[7193]36#include "util/loading/game_loader.h"
[7440]37#include "util/signal_handler.h"
[4786]38
39//ENGINES
[3610]40#include "graphics_engine.h"
[4504]41#include "sound_engine.h"
[7193]42#include "util/loading/resource_manager.h"
[9797]43
[4786]44#include "cd_engine.h"
45#include "event_handler.h"
46
[9709]47#include "loading/fast_factory.h"
[4980]48
[9817]49#include "subprojects/benchmark.h"
[3610]50
[5641]51#include "shell_command_class.h"
[5165]52#include "shell_command.h"
[5175]53#include "shell_buffer.h"
[4748]54
[5996]55#include "network_manager.h"
[9406]56#include "shared_network_data.h"
[5996]57
[6695]58#include "state.h"
[7256]59#include "lib/parser/preferences/cmd_line_prefs_reader.h"
60#include "lib/parser/preferences/ini_file_prefs_reader.h"
[2190]61#include <string.h>
[4032]62
[7711]63int verbose = 5;
[2036]64
[1803]65
[9406]66
[5207]67SHELL_COMMAND(restart, Orxonox, restart);
68
[7258]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" );
[9406]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" );
[7258]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");
[7256]76
[7258]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");
[9406]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" );
[7258]81
[7261]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
[7440]88#ifndef __WIN32__
89REGISTER_ARG_FLAG( _, write_bt_to_file, "misc", "bt-to-file", "Write backtrace to file", "1");
90#endif
91
[7954]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
[9715]95ObjectListDefinition(Orxonox);
[7954]96
[2190]97/**
[4836]98 *  create a new Orxonox
[4135]99
100   In this funcitons only global values are set. The game will not be started here.
[2190]101*/
102Orxonox::Orxonox ()
[1872]103{
[9709]104  this->registerObject(this, Orxonox::_objectList);
[4766]105  this->setName("orxonox-main");
[4059]106
[4135]107  this->argc = 0;
108  this->argv = NULL;
[4782]109
[5996]110  /* this way, there is no network enabled: */
[7256]111  this->serverName = "";
[5996]112  this->port = -1;
113
[7221]114  this->configFileName = "";
[1872]115}
[1803]116
[2190]117/**
[4836]118 *  remove Orxonox from memory
[2190]119*/
[4556]120Orxonox::~Orxonox ()
[2190]121{
[5285]122  // game-specific
[4815]123  delete GameLoader::getInstance();
[5285]124
125  // class-less services/factories
[4980]126  FastFactory::deleteAll();
[7374]127  OrxShell::ShellCommandClass::unregisterAllCommands();
[5332]128
[7427]129  // handlers
[9836]130  Resources::ResourceManager::deleteInstance(); // deletes the Resource Manager
[7427]131
[5285]132  // engines
133  delete CDEngine::getInstance();
[7460]134  delete OrxSound::SoundEngine::getInstance();
[5285]135  delete GraphicsEngine::getInstance(); // deleting the Graphics
[4817]136  delete EventHandler::getInstance();
[5285]137
138  // output-buffer
[7374]139  delete OrxShell::ShellBuffer::getInstance();
[5285]140
[5225]141  SDL_QuitSubSystem(SDL_INIT_TIMER);
[9406]142
[9709]143
[9715]144  ObjectListBase::debugAll(1);
[9709]145
[9235]146  Preferences::getInstance()->save();
[1850]147
[4833]148  PRINT(3)
[5996]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  );
[1872]156
[4766]157  Orxonox::singletonRef = NULL;
[1850]158}
159
[2190]160/**
[4836]161 *  this is a singleton class to prevent duplicates
[4766]162 */
163Orxonox* Orxonox::singletonRef = NULL;
[4556]164
[5207]165// DANGEROUS
166void Orxonox::restart()
167{
[5996]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();
[5207]185}
186
[4766]187/**
[7221]188 * @brief this finds the config file
[4766]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
[2190]193*/
[7221]194const std::string& Orxonox::getConfigFile ()
[1850]195{
[7661]196  File orxConfFile("orxonox.conf");
197  if (orxConfFile.isFile())
[5424]198  {
[7221]199    this->configFileName =  "orxonox.conf";
[5424]200  }
201  else
[7661]202    this->configFileName = File(DEFAULT_CONFIG_FILE).name();
[7256]203
[7677]204  PRINTF(3)("Parsed Config File: '%s'\n", this->configFileName.c_str());
[8316]205  return this->configFileName;
[1803]206}
207
[2190]208/**
[4833]209 * initialize Orxonox with command line
210 */
[7256]211int Orxonox::init (int argc, char** argv, const std::string & name, int port)
[1803]212{
[4135]213  this->argc = argc;
214  this->argv = argv;
[4556]215
[5996]216  this->serverName = name;
217  this->port = port;
218
[4766]219  // initialize the Config-file
[4830]220  this->getConfigFile();
[4766]221
[5788]222  // windows must not write into stdout.txt and stderr.txt
[6833]223  /*#ifdef __WIN32__
[5788]224  freopen( "CON", "w", stdout );
225  freopen( "CON", "w", stderr );
[6833]226  #endif*/
[5788]227
[5996]228  // initialize everything
[6079]229  SDL_Init(0);
[8749]230  if( initVideo() == -1)
231    return -1;
[5996]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;
[4556]242
[2636]243  return 0;
[1850]244}
[1849]245
[5996]246
[2190]247/**
[4833]248 * initializes SDL and OpenGL
[5996]249 */
[4556]250int Orxonox::initVideo()
[2190]251{
[3611]252  PRINTF(3)("> Initializing video\n");
[4556]253
[3610]254  GraphicsEngine::getInstance();
[4556]255
[7256]256  GraphicsEngine::getInstance()->initFromPreferences();
[4766]257
[9836]258  std::string iconName = Resources::ResourceManager::getInstance()->prependAbsoluteMainPath("pictures/fighter-top-32x32.bmp");
[7221]259  if (!iconName.empty())
[5225]260  {
261    GraphicsEngine::getInstance()->setWindowName(PACKAGE_NAME " " PACKAGE_VERSION, iconName);
262  }
[2190]263  return 0;
264}
[1850]265
[5996]266
[2190]267/**
[4833]268 * initializes the sound engine
269 */
[4556]270int Orxonox::initSound()
[2190]271{
[4504]272  PRINT(3)("> Initializing sound\n");
[5225]273  // SDL_InitSubSystem(SDL_INIT_AUDIO);
[7460]274  OrxSound::SoundEngine::getInstance();
[4985]275
[7460]276  OrxSound::SoundEngine::getInstance()->loadSettings();
277  OrxSound::SoundEngine::getInstance()->initAudio();
[2636]278  return 0;
[2190]279}
[1900]280
[3214]281
[2190]282/**
[4833]283 * initializes input functions
284 */
[4556]285int Orxonox::initInput()
[2190]286{
[4766]287  PRINT(3)("> Initializing input\n");
288
[7256]289  EventHandler::getInstance()->init();
[4833]290  EventHandler::getInstance()->subscribe(GraphicsEngine::getInstance(), ES_ALL, EV_VIDEO_RESIZE);
[4556]291
[2636]292  return 0;
[1803]293}
294
[3214]295
[2190]296/**
[4833]297 * initializes network system
298 */
[4556]299int Orxonox::initNetworking()
[1897]300{
[4766]301  PRINT(3)("> Initializing networking\n");
[9406]302  std::string gameType = Preferences::getInstance()->getString( "game", "gameType", "" );
[4766]303
[9406]304  if( gameType == "multiplayer_client")
305  {    // we are a client
[6695]306    State::setOnline(true);
[9406]307    SharedNetworkData::getInstance()->setNodeType(NET_CLIENT);
308    NetworkManager::getInstance()->createClient(this->serverName, port);
[6695]309  }
[9406]310  else if( gameType == "multiplayer_master_server")
311  {    // we are a master server
[6695]312    State::setOnline(true);
[9406]313    SharedNetworkData::getInstance()->setNodeType(NET_MASTER_SERVER);
314
315    NetworkManager::getInstance()->createMasterServer(port);
[6139]316  }
[9406]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
[2636]324  return 0;
[9406]325
[1897]326}
327
[7355]328//#include "util/loading/dynamic_loader.h"
[2190]329/**
[4833]330 * initializes and loads resource files
[4766]331 */
[4833]332int Orxonox::initResources()
[1858]333{
[4766]334  PRINTF(3)("> Initializing resources\n");
[4091]335
[4766]336  PRINT(3)("initializing ResourceManager\n");
337
[5488]338  // init the resource manager
[7221]339  std::string dataPath;
[7661]340  if ((dataPath = Preferences::getInstance()->getString(CONFIG_SECTION_GENERAL, CONFIG_NAME_DATADIR, ""))!= "")
[4766]341  {
[9836]342    Resources::ResourceManager::getInstance()->setMainGlobalPath(dataPath) ;
343    if(!Resources::ResourceManager::getInstance()->checkFileInMainPath(File(DEFAULT_DATA_DIR_CHECKFILE)))
[4766]344    {
[7221]345      PRINTF(1)("Data Could not be located in %s\n", dataPath.c_str());
[4766]346    }
347  }
[9836]348  while (!Resources::ResourceManager::getInstance()->checkFileInMainPath(File(DEFAULT_DATA_DIR_CHECKFILE)))
[4766]349  {
[8749]350
[5510]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",
[9836]353              Resources::ResourceManager::getInstance()->mainGlobalPath().name().c_str(),
[7714]354              this->configFileName.c_str(),
[7661]355              CONFIG_SECTION_GENERAL,
[5510]356              CONFIG_NAME_DATADIR );
[8749]357    OrxGui::Gui* gui = new OrxGui::QtGuiDataDirFallback(argc, argv);
[5479]358    gui->startGui();
[8750]359    if (gui->getState() == OrxGui::Gui::Quitting)
360      return(-1);
[5479]361    delete gui;
[9836]362    Resources::ResourceManager::getInstance()->setMainGlobalPath(Preferences::getInstance()->getString(CONFIG_SECTION_GENERAL, CONFIG_NAME_DATADIR, ""));
[4766]363  }
[8749]364
[5996]365  //! @todo this is a hack and should be loadable
[9836]366  Resources::ResourceManager::getInstance()->addResourceSubPath("Texture", "maps");
367  Resources::ResourceManager::getInstance()->addResourceSubPath("Texture", "pictures");
[4009]368
[9836]369  Resources::ResourceManager::getInstance()->addResourceSubPath("SoundBuffer", "sound");
370  Resources::ResourceManager::getInstance()->addResourceSubPath("SoundBuffer", "music");
[9806]371
[9845]372  Resources::ResourceManager::getInstance()->addResourceSubPath("Shader", "shaders");
373  Resources::ResourceManager::getInstance()->addResourceSubPath("OBJ", "models");
374
[9836]375  Resources::ResourceManager::getInstance()->addKeepLevelName("Imediately");
376  Resources::ResourceManager::getInstance()->addKeepLevelName("LevelEnd");
377  Resources::ResourceManager::getInstance()->addKeepLevelName("CampaignEnd");
378  Resources::ResourceManager::getInstance()->addKeepLevelName("GameEnd");
[9854]379  Resources::ResourceManager::getInstance()->setDefaultKeepLevel(std::string("GameEnd"));
[9798]380
[5074]381  return 0;
382}
383
384/**
385 * initializes miscelaneous features
386 * @return -1 on failure
387 */
388int Orxonox::initMisc()
389{
[7374]390  OrxShell::ShellBuffer::getInstance();
[8749]391
392  // start the collision detection engine
393  CDEngine::getInstance();
394
[4766]395  return 0;
[1858]396}
[1849]397
[2190]398/**
[4836]399 *  starts the orxonox game or menu
[4833]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.
[2190]404*/
[2636]405void Orxonox::start()
406{
[4556]407
[2636]408  this->gameLoader = GameLoader::getInstance();
[5996]409
[6139]410  if( this->port != -1)
411    this->gameLoader->loadNetworkCampaign("worlds/DefaultNetworkCampaign.oxc");
[5996]412  else
[6139]413    this->gameLoader->loadCampaign("worlds/DefaultCampaign.oxc");                       /* start orxonox in single player mode */
[5996]414
[4010]415  //  this->gameLoader->loadDebugCampaign(DEBUG_CAMPAIGN_0);
[2636]416  this->gameLoader->init();
417  this->gameLoader->start();
418}
419
[3214]420
[2636]421/**
[4833]422 * handles sprecial events from localinput
423 * @param event: an event not handled by the CommandNode
424 */
[4817]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// }
[1875]436
[4556]437
[4408]438
[1803]439
[3214]440
[4782]441
[4059]442bool showGui = false;
[3648]443
[4766]444/**********************************
445*** ORXONOX MAIN STARTING POINT ***
446**********************************/
[3449]447/**
[4833]448 *
[4836]449 *  main function
[4833]450 *
451 * here the journey begins
[3449]452*/
[4556]453int main(int argc, char** argv)
454{
[7256]455  CmdLinePrefsReader prefs;
[7374]456
[7661]457  IniFilePrefsReader ini(File(DEFAULT_CONFIG_FILE).name());
458  Preferences::getInstance()->setUserIni(File(DEFAULT_CONFIG_FILE).name());
[7374]459
[7256]460  prefs.parse(argc, argv);
[7374]461
[7256]462  if ( Preferences::getInstance()->getString("misc", "showLicenseAndExit", "") == "1" )
[5996]463  {
[7256]464    PRINT(0)(ORXONOX_LICENSE_SHORT);
465    return 0;
[5996]466  }
[7374]467
[9240]468  if ( Preferences::getInstance()->getString("misc", "bt-to-file", "1") == "1" )
[7440]469  {
[9406]470    SignalHandler::getInstance()->doCatch( argv[0], "orxonox.backtrace" );
471    SignalHandler::getInstance()->registerCallback( EventHandler::releaseMouse, NULL );
[7440]472  }
[7460]473
[7256]474  if( Preferences::getInstance()->getString("game", "showGui", "") == "1" )
475    showGui = true;
[9406]476  else if( Preferences::getInstance()->getString( "game", "gameType", "" ) == "multiplayer_master_server" ||
477           Preferences::getInstance()->getString( "game", "gameType", "" ) == "multiplayer_proxy_server" ||
[7256]478           Preferences::getInstance()->getString( "game", "gameType", "" ) == "multiplayer_client" )
479    return startNetworkOrxonox(argc, argv);
[7374]480
[7256]481  return startOrxonox(argc, argv, "", -1);
[3648]482}
483
484
485
[5996]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
[7256]494  std::string gameType = Preferences::getInstance()->getString( "game", "gameType", "" );
[7374]495
[7256]496  if ( gameType == "multiplayer_client" )
[4132]497  {
[7256]498    int port = Preferences::getInstance()->getInt( "game", "port", DEFAULT_ORXONOX_PORT );
499    std::string host = Preferences::getInstance()->getString( "game", "host", "" );
[7374]500
[7256]501    if ( host == "" )
[5996]502    {
[7256]503      printf("You need to specify a host to connect to ( -H <host> )\n");
504      return 1;
[5996]505    }
[7374]506
[7256]507    printf("Starting Orxonox as client: connecting to %s, on port %i\n", host.c_str(), port);
[7374]508
[7256]509    startOrxonox(argc, argv, host.c_str(), port);
[4132]510  }
[9406]511  else if ( gameType == "multiplayer_master_server" )
[7256]512  {
513    int port = Preferences::getInstance()->getInt( "game", "port", DEFAULT_ORXONOX_PORT );
[7374]514
[7256]515    printf("Starting Orxonox as server: listening on port %i\n", port);
[7374]516
[7256]517    startOrxonox(argc, argv, "", port);
518  }
[9406]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  }
[8316]527  return 1;
[3648]528}
529
[3649]530
[4766]531
532/**
533 * starts orxonox
534 * @param argc parameters count given to orxonox
535 * @param argv parameters given to orxonox
536 */
[7256]537int startOrxonox(int argc, char** argv, const std::string & name, int port)
[3648]538{
[4830]539  // checking for existence of the configuration-files, or if the lock file is still used
[7661]540  if (showGui || (!File("./orxonox.conf").isFile() &&
[7714]541                  !File(DEFAULT_CONFIG_FILE).isFile())
[7729]542#if DEBUG_LEVEL <= 3 // developers do not need to see the GUI, when orxonox fails
[5996]543      || ResourceManager::isFile(DEFAULT_LOCK_FILE)
[4981]544#endif
545     )
[5996]546  {
[7661]547    File lockFile(DEFAULT_LOCK_FILE);
548    if (lockFile.isFile())
549      lockFile.remove();
[4556]550
[5996]551    // starting the GUI
[7661]552    OrxGui::QtGui gui(argc, argv);
553    gui.startGui();
[4132]554
[7661]555    if (gui.getState() & OrxGui::Gui::Quitting)
[5996]556      return 0;
[4556]557
[5996]558  }
[4556]559
[4032]560  PRINT(0)(">>> Starting Orxonox <<<\n");
[4033]561
[7661]562  File(DEFAULT_LOCK_FILE).touch();
[4033]563
[1850]564  Orxonox *orx = Orxonox::getInstance();
[4556]565
[5996]566  if( orx->init(argc, argv, name, port) == -1)
567  {
568    PRINTF(1)("! Orxonox initialization failed\n");
569    return -1;
570  }
[4556]571
[5996]572  printf("finished inizialisation\n");
[2636]573  orx->start();
[4556]574
[3676]575  delete orx;
[7661]576  File("~/.orxonox/orxonox.lock").remove();
[8363]577  return 0;
[1803]578}
Note: See TracBrowser for help on using the repository browser.