2014-10-14 13:11:37 +00:00
|
|
|
/*
|
|
|
|
* This file is part of the Colobot: Gold Edition source code
|
2016-02-13 13:11:30 +00:00
|
|
|
* Copyright (C) 2001-2016, Daniel Roux, EPSITEC SA & TerranovaTeam
|
2015-08-22 14:40:02 +00:00
|
|
|
* http://epsitec.ch; http://colobot.info; http://github.com/colobot
|
2014-10-14 13:11:37 +00:00
|
|
|
*
|
|
|
|
* 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"
|
2015-08-15 15:07:21 +00:00
|
|
|
#include "app/signal_handlers.h"
|
2012-06-25 17:59:17 +00:00
|
|
|
#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"
|
2015-08-07 06:31:34 +00:00
|
|
|
#include "common/make_unique.h"
|
2012-06-25 17:59:17 +00:00
|
|
|
#include "common/restext.h"
|
2015-10-03 20:05:14 +00:00
|
|
|
#include "common/version.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
|
|
|
|
2015-08-07 06:31:34 +00:00
|
|
|
#include <memory>
|
|
|
|
#include <vector>
|
2016-04-02 12:18:34 +00:00
|
|
|
#include <boost/filesystem.hpp>
|
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"
|
|
|
|
{
|
|
|
|
|
2015-09-29 20:39:08 +00:00
|
|
|
int main(int argc, char *argv[])
|
2012-06-25 17:59:17 +00:00
|
|
|
{
|
2015-08-15 15:07:21 +00:00
|
|
|
CLogger logger; // single instance of logger
|
2016-02-13 19:32:26 +00:00
|
|
|
logger.AddOutput(stderr);
|
2015-03-22 12:10:38 +00:00
|
|
|
|
2016-01-24 20:31:45 +00:00
|
|
|
auto systemUtils = CSystemUtils::Create(); // platform-specific utils
|
|
|
|
systemUtils->Init();
|
|
|
|
|
2016-02-13 19:32:26 +00:00
|
|
|
// Add file output to the logger
|
2016-04-02 12:18:34 +00:00
|
|
|
std::string logFileName;
|
2016-02-13 19:32:26 +00:00
|
|
|
#if DEV_BUILD
|
2016-04-02 12:18:34 +00:00
|
|
|
logFileName = "log.txt";
|
2016-02-13 19:32:26 +00:00
|
|
|
#else
|
2016-04-02 12:18:34 +00:00
|
|
|
boost::filesystem::create_directories(systemUtils->GetSaveDir());
|
|
|
|
logFileName = systemUtils->GetSaveDir() + "/log.txt";
|
2016-02-13 19:32:26 +00:00
|
|
|
#endif
|
2016-04-02 12:18:34 +00:00
|
|
|
FILE* logFile = fopen(logFileName.c_str(), "w");
|
|
|
|
if (logFile)
|
|
|
|
logger.AddOutput(logFile);
|
|
|
|
else
|
|
|
|
logger.Error("Failed to create log file, writing log to file disabled\n");
|
|
|
|
|
2016-01-24 20:31:45 +00:00
|
|
|
|
2015-03-22 12:10:38 +00:00
|
|
|
// Workaround for character encoding in argv on Windows
|
|
|
|
#if PLATFORM_WINDOWS
|
2015-08-07 06:31:34 +00:00
|
|
|
int wargc = 0;
|
2015-03-22 12:10:38 +00:00
|
|
|
wchar_t** wargv = CommandLineToArgvW(GetCommandLineW(), &wargc);
|
2015-08-07 06:31:34 +00:00
|
|
|
if (wargv == nullptr)
|
2015-03-22 12:10:38 +00:00
|
|
|
{
|
|
|
|
logger.Error("CommandLineToArgvW failed\n");
|
|
|
|
return 1;
|
|
|
|
}
|
2015-08-07 06:31:34 +00:00
|
|
|
|
|
|
|
std::vector<std::vector<char>> windowsArgs;
|
|
|
|
for (int i = 0; i < wargc; i++)
|
|
|
|
{
|
2015-03-22 12:10:38 +00:00
|
|
|
std::wstring warg = wargv[i];
|
|
|
|
std::string arg = CSystemUtilsWindows::UTF8_Encode(warg);
|
2015-08-07 06:31:34 +00:00
|
|
|
std::vector<char> argVec(arg.begin(), arg.end());
|
|
|
|
argVec.push_back('\0');
|
|
|
|
windowsArgs.push_back(std::move(argVec));
|
2015-03-22 12:10:38 +00:00
|
|
|
}
|
2015-08-07 06:31:34 +00:00
|
|
|
|
|
|
|
auto windowsArgvPtrs = MakeUniqueArray<char*>(wargc);
|
|
|
|
for (int i = 0; i < wargc; i++)
|
|
|
|
windowsArgvPtrs[i] = windowsArgs[i].data();
|
|
|
|
|
|
|
|
argv = windowsArgvPtrs.get();
|
|
|
|
|
2015-03-22 12:10:38 +00:00
|
|
|
LocalFree(wargv);
|
|
|
|
#endif
|
|
|
|
|
2015-08-15 15:07:21 +00:00
|
|
|
logger.Info("%s starting\n", COLOBOT_FULLNAME);
|
|
|
|
|
|
|
|
CSignalHandlers::Init(systemUtils.get());
|
|
|
|
|
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
|
|
|
|
2012-07-04 17:56:22 +00:00
|
|
|
int code = 0;
|
2015-08-25 11:32:58 +00:00
|
|
|
CApplication app(systemUtils.get()); // single instance of the application
|
2015-08-24 17:28:49 +00:00
|
|
|
|
2015-08-25 11:32:58 +00:00
|
|
|
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();
|
2015-08-15 22:06:27 +00:00
|
|
|
}
|
2015-08-25 11:32:58 +00:00
|
|
|
else if (status == PARSE_ARGS_HELP)
|
2015-08-15 22:06:27 +00:00
|
|
|
{
|
2015-08-25 11:32:58 +00:00
|
|
|
return app.GetExitCode();
|
2015-08-15 22:06:27 +00:00
|
|
|
}
|
2015-08-25 11:32:58 +00:00
|
|
|
|
|
|
|
if (! app.Create())
|
2015-08-15 22:06:27 +00:00
|
|
|
{
|
2015-08-25 11:32:58 +00:00
|
|
|
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;
|
2014-10-25 16:34:29 +00:00
|
|
|
}
|
2012-07-04 17:56:22 +00:00
|
|
|
|
2015-08-25 11:32:58 +00:00
|
|
|
code = app.Run();
|
|
|
|
|
2012-07-04 17:56:22 +00:00
|
|
|
logger.Info("Exiting with code %d\n", code);
|
2015-08-25 11:32:58 +00:00
|
|
|
|
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"
|