2014-10-14 13:11:37 +00:00
|
|
|
|
/*
|
|
|
|
|
* This file is part of the Colobot: Gold Edition source code
|
|
|
|
|
* Copyright (C) 2001-2014, Daniel Roux, EPSITEC SA & TerranovaTeam
|
|
|
|
|
* http://epsiteс.ch; http://colobot.info; http://github.com/colobot
|
|
|
|
|
*
|
|
|
|
|
* This program is free software: you can redistribute it and/or modify
|
|
|
|
|
* it under the terms of the GNU General Public License as published by
|
|
|
|
|
* the Free Software Foundation, either version 3 of the License, or
|
|
|
|
|
* (at your option) any later version.
|
|
|
|
|
*
|
|
|
|
|
* This program is distributed in the hope that it will be useful,
|
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
|
|
|
|
* See the GNU General Public License for more details.
|
|
|
|
|
*
|
|
|
|
|
* You should have received a copy of the GNU General Public License
|
|
|
|
|
* along with this program. If not, see http://gnu.org/licenses
|
|
|
|
|
*/
|
2012-06-25 17:59:17 +00:00
|
|
|
|
|
2012-08-11 16:39:16 +00:00
|
|
|
|
/**
|
|
|
|
|
* \file app/main.cpp
|
|
|
|
|
* \brief Entry point of application - main() function
|
|
|
|
|
*/
|
2012-06-25 17:59:17 +00:00
|
|
|
|
|
2015-08-02 11:09:48 +00:00
|
|
|
|
#include "common/config.h"
|
|
|
|
|
|
2012-06-25 17:59:17 +00:00
|
|
|
|
#include "app/app.h"
|
|
|
|
|
#include "app/system.h"
|
2015-08-02 11:09:48 +00:00
|
|
|
|
#if PLATFORM_WINDOWS
|
|
|
|
|
#include "app/system_windows.h"
|
|
|
|
|
#endif
|
2012-10-17 19:55:45 +00:00
|
|
|
|
|
2012-07-04 17:56:22 +00:00
|
|
|
|
#include "common/logger.h"
|
2012-06-25 17:59:17 +00:00
|
|
|
|
#include "common/misc.h"
|
|
|
|
|
#include "common/restext.h"
|
2015-08-02 11:09:48 +00:00
|
|
|
|
|
2015-03-22 12:10:38 +00:00
|
|
|
|
#include "common/resources/resourcemanager.h"
|
|
|
|
|
|
|
|
|
|
#if PLATFORM_WINDOWS
|
|
|
|
|
#include <windows.h>
|
|
|
|
|
#endif
|
2012-06-25 17:59:17 +00:00
|
|
|
|
|
|
|
|
|
|
2012-07-11 18:56:09 +00:00
|
|
|
|
/* Doxygen main page */
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
|
|
\mainpage
|
|
|
|
|
|
|
|
|
|
Doxygen documentation of Colobot project
|
|
|
|
|
|
|
|
|
|
\section Intro Introduction
|
|
|
|
|
|
|
|
|
|
The source code released by Epitec was sparsely documented. This documentation, written from scratch,
|
|
|
|
|
will aim to describe the various components of the code.
|
|
|
|
|
|
2012-07-27 16:50:29 +00:00
|
|
|
|
Currently, the only documented classes are the ones written from scratch or the old ones rewritten
|
|
|
|
|
to match the new code.
|
2012-07-11 18:56:09 +00:00
|
|
|
|
In time, the documentation will be extended to cover every major part of the code.
|
|
|
|
|
|
|
|
|
|
\section Structure Code structure
|
|
|
|
|
|
2012-07-27 16:50:29 +00:00
|
|
|
|
The source code was split from the original all-in-one directory to subdirectories,
|
|
|
|
|
each containing one major part of the project.
|
|
|
|
|
The current layout is the following:
|
2012-07-11 18:56:09 +00:00
|
|
|
|
- src/CBot - separate library with CBot language
|
2012-07-27 16:50:29 +00:00
|
|
|
|
- src/app - class CApplication and everything concerned with SDL plus other system-dependent
|
|
|
|
|
code such as displaying a message box, finding files, etc.
|
2012-07-11 18:56:09 +00:00
|
|
|
|
- src/common - shared structs, enums, defines, etc.; should not have any external dependencies
|
2012-07-27 16:50:29 +00:00
|
|
|
|
- src/graphics/core - abstract interface of graphics device (abstract CDevice class)
|
|
|
|
|
(split from old src/graphics/common)
|
|
|
|
|
- src/graphics/engine - main graphics engine based on abstract graphics device; is composed
|
|
|
|
|
of CEngine class and associated classes implementing the 3D engine (split from old src/graphics/common)
|
|
|
|
|
- src/graphics/opengl - concrete implementation of CDevice class in OpenGL: CGLDevice
|
2012-07-11 18:56:09 +00:00
|
|
|
|
- src/graphics/d3d - in (far) future - perhaps a newer implementation in DirectX (9? 10?)
|
|
|
|
|
- src/math - mathematical structures and functions
|
2012-07-27 16:50:29 +00:00
|
|
|
|
- src/object - non-graphical game engine, that is robots, buildings, etc.
|
|
|
|
|
- src/ui - 2D user interface (menu, buttons, check boxes, etc.)
|
2012-07-11 18:56:09 +00:00
|
|
|
|
- src/sound - sound and music engine written using fmod library
|
|
|
|
|
- src/physics - physics engine
|
|
|
|
|
- src/script - link with the CBot library
|
|
|
|
|
*/
|
|
|
|
|
|
2012-06-25 17:59:17 +00:00
|
|
|
|
//! Entry point to the program
|
2013-03-22 17:19:53 +00:00
|
|
|
|
extern "C"
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
int SDL_MAIN_FUNC(int argc, char *argv[])
|
2012-06-25 17:59:17 +00:00
|
|
|
|
{
|
2013-03-23 23:03:37 +00:00
|
|
|
|
CLogger logger; // single istance of logger
|
2015-03-22 12:10:38 +00:00
|
|
|
|
|
|
|
|
|
// Workaround for character encoding in argv on Windows
|
|
|
|
|
#if PLATFORM_WINDOWS
|
|
|
|
|
int wargc;
|
|
|
|
|
wchar_t** wargv = CommandLineToArgvW(GetCommandLineW(), &wargc);
|
|
|
|
|
if(wargv == nullptr)
|
|
|
|
|
{
|
|
|
|
|
logger.Error("CommandLineToArgvW failed\n");
|
|
|
|
|
return 1;
|
|
|
|
|
}
|
|
|
|
|
argv = new char*[wargc];
|
|
|
|
|
for(int i = 0; i < wargc; i++) {
|
|
|
|
|
std::wstring warg = wargv[i];
|
|
|
|
|
std::string arg = CSystemUtilsWindows::UTF8_Encode(warg);
|
|
|
|
|
argv[i] = new char[arg.length()+1];
|
|
|
|
|
strcpy(argv[i], arg.c_str());
|
|
|
|
|
}
|
|
|
|
|
LocalFree(wargv);
|
|
|
|
|
#endif
|
|
|
|
|
|
2014-06-20 21:41:38 +00:00
|
|
|
|
CResourceManager manager(argv[0]);
|
2012-07-04 17:56:22 +00:00
|
|
|
|
|
2013-06-16 19:39:21 +00:00
|
|
|
|
// Initialize static string arrays
|
|
|
|
|
InitializeRestext();
|
|
|
|
|
InitializeEventTypeTexts();
|
2013-03-23 23:03:37 +00:00
|
|
|
|
|
2014-12-11 18:59:24 +00:00
|
|
|
|
logger.Info("%s starting\n", COLOBOT_FULLNAME);
|
2015-08-02 06:45:02 +00:00
|
|
|
|
|
2012-07-04 17:56:22 +00:00
|
|
|
|
int code = 0;
|
2015-08-02 09:40:47 +00:00
|
|
|
|
while (true)
|
|
|
|
|
{
|
2014-10-25 16:34:29 +00:00
|
|
|
|
CSystemUtils* systemUtils = CSystemUtils::Create(); // platform-specific utils
|
|
|
|
|
systemUtils->Init();
|
2015-08-02 06:45:02 +00:00
|
|
|
|
|
2014-10-25 16:34:29 +00:00
|
|
|
|
CApplication* app = new CApplication(); // single instance of the application
|
|
|
|
|
|
|
|
|
|
ParseArgsStatus status = app->ParseArguments(argc, argv);
|
|
|
|
|
if (status == PARSE_ARGS_FAIL)
|
|
|
|
|
{
|
|
|
|
|
systemUtils->SystemDialog(SDT_ERROR, "COLOBOT - Fatal Error", "Invalid commandline arguments!\n");
|
|
|
|
|
return app->GetExitCode();
|
|
|
|
|
}
|
|
|
|
|
else if (status == PARSE_ARGS_HELP)
|
|
|
|
|
{
|
|
|
|
|
return app->GetExitCode();
|
|
|
|
|
}
|
2012-07-04 17:56:22 +00:00
|
|
|
|
|
2014-10-25 16:34:29 +00:00
|
|
|
|
|
|
|
|
|
if (! app->Create())
|
2012-08-13 21:09:30 +00:00
|
|
|
|
{
|
2014-10-25 16:34:29 +00:00
|
|
|
|
app->Destroy(); // ensure a clean exit
|
|
|
|
|
code = app->GetExitCode();
|
|
|
|
|
if ( code != 0 && !app->GetErrorMessage().empty() )
|
|
|
|
|
{
|
|
|
|
|
systemUtils->SystemDialog(SDT_ERROR, "COLOBOT - Fatal Error", app->GetErrorMessage());
|
|
|
|
|
}
|
|
|
|
|
logger.Info("Didn't run main loop. Exiting with code %d\n", code);
|
|
|
|
|
return code;
|
2012-08-13 21:09:30 +00:00
|
|
|
|
}
|
2012-06-25 17:59:17 +00:00
|
|
|
|
|
2014-10-25 16:34:29 +00:00
|
|
|
|
code = app->Run();
|
|
|
|
|
bool restarting = app->IsRestarting();
|
2013-03-23 23:03:37 +00:00
|
|
|
|
|
2014-10-25 16:34:29 +00:00
|
|
|
|
delete app;
|
|
|
|
|
delete systemUtils;
|
|
|
|
|
if(!restarting) break;
|
|
|
|
|
}
|
2012-07-04 17:56:22 +00:00
|
|
|
|
|
|
|
|
|
logger.Info("Exiting with code %d\n", code);
|
2015-03-22 12:10:38 +00:00
|
|
|
|
|
|
|
|
|
#if PLATFORM_WINDOWS
|
|
|
|
|
// See the workaround above
|
|
|
|
|
delete[] argv;
|
|
|
|
|
#endif
|
|
|
|
|
|
2012-07-04 17:56:22 +00:00
|
|
|
|
return code;
|
2012-06-25 17:59:17 +00:00
|
|
|
|
}
|
2012-07-04 17:56:22 +00:00
|
|
|
|
|
2013-03-22 17:19:53 +00:00
|
|
|
|
} // extern "C"
|
2013-05-26 15:47:54 +00:00
|
|
|
|
|