diff options
author | krzys-h <krzys_h@interia.pl> | 2014-07-01 12:15:38 +0200 |
---|---|---|
committer | krzys-h <krzys_h@interia.pl> | 2014-07-01 12:16:32 +0200 |
commit | d9fee8b2adad613cf8c10d153cd5cd7b261b7863 (patch) | |
tree | f6b71cc2daa719c10c1ce31cf738e1c6ec934a73 /src | |
parent | 0f2adf05fd2b2b38c2b84aa8d72b3fd756dcfcd4 (diff) | |
parent | 1835d2ae580525603308206f7b8e6b4552b3ca0f (diff) | |
download | colobot-d9fee8b2adad613cf8c10d153cd5cd7b261b7863.tar.gz colobot-d9fee8b2adad613cf8c10d153cd5cd7b261b7863.tar.bz2 colobot-d9fee8b2adad613cf8c10d153cd5cd7b261b7863.zip |
Release 0.1.3-alpha
Diffstat (limited to 'src')
81 files changed, 2491 insertions, 2553 deletions
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index ef59973..12171f3 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -28,6 +28,8 @@ if(MXE) # MXE requires special treatment elseif(PLATFORM_WINDOWS) # because it isn't included in standard linking libraries set(PLATFORM_LIBS "-lintl") +elseif(PLATFORM_GNU) + set(PLATFORM_LIBS "-lX11") elseif(PLATFORM_LINUX) # for clock_gettime set(PLATFORM_LIBS "-lrt -lX11") @@ -59,7 +61,9 @@ endif() # Source files set(SOURCES app/app.cpp +app/gamedata.cpp app/main.cpp +app/pausemanager.cpp app/system.cpp app/${SYSTEM_CPP_MODULE} app/system_other.cpp diff --git a/src/app/app.cpp b/src/app/app.cpp index 4484e2a..8b310c9 100644 --- a/src/app/app.cpp +++ b/src/app/app.cpp @@ -19,6 +19,7 @@ #include "app/app.h" +#include "app/gamedata.h" #include "app/system.h" #include "common/logger.h" @@ -100,6 +101,7 @@ CApplication::CApplication() m_objMan = new CObjectManager(); m_eventQueue = new CEventQueue(); m_profile = new CProfile(); + m_gameData = new CGameData(); m_engine = nullptr; m_device = nullptr; @@ -112,7 +114,7 @@ CApplication::CApplication() m_debugModes = 0; m_customDataPath = false; - m_windowTitle = "COLOBOT"; + m_windowTitle = "COLOBOT GOLD"; m_simulationSuspended = false; @@ -149,29 +151,17 @@ CApplication::CApplication() m_dataPath = GetSystemUtils()->GetDataPath(); m_langPath = GetSystemUtils()->GetLangPath(); - m_texPackPath = ""; m_runSceneName = ""; m_runSceneRank = 0; + + m_sceneTest = false; m_language = LANGUAGE_ENV; m_lowCPU = true; m_protoMode = false; - - for (int i = 0; i < DIR_MAX; ++i) - m_standardDataDirs[i] = nullptr; - - m_standardDataDirs[DIR_AI] = "ai"; - m_standardDataDirs[DIR_FONT] = "fonts"; - m_standardDataDirs[DIR_HELP] = "help"; - m_standardDataDirs[DIR_ICON] = "icons"; - m_standardDataDirs[DIR_LEVEL] = "levels"; - m_standardDataDirs[DIR_MODEL] = "models"; - m_standardDataDirs[DIR_MUSIC] = "music"; - m_standardDataDirs[DIR_SOUND] = "sounds"; - m_standardDataDirs[DIR_TEXTURE] = "textures"; } CApplication::~CApplication() @@ -190,6 +180,9 @@ CApplication::~CApplication() delete m_iMan; m_iMan = nullptr; + + delete m_gameData; + m_gameData = nullptr; GetSystemUtils()->DestroyTimeStamp(m_baseTimeStamp); GetSystemUtils()->DestroyTimeStamp(m_curTimeStamp); @@ -210,12 +203,6 @@ CEventQueue* CApplication::GetEventQueue() CSoundInterface* CApplication::GetSound() { return m_sound; - - for (int i = 0; i < PCNT_MAX; ++i) - { - GetSystemUtils()->DestroyTimeStamp(m_performanceCounters[i][0]); - GetSystemUtils()->DestroyTimeStamp(m_performanceCounters[i][1]); - } } ParseArgsStatus CApplication::ParseArguments(int argc, char *argv[]) @@ -225,13 +212,13 @@ ParseArgsStatus CApplication::ParseArguments(int argc, char *argv[]) OPT_HELP = 1, OPT_DEBUG, OPT_RUNSCENE, + OPT_SCENETEST, OPT_LOGLEVEL, OPT_LANGUAGE, OPT_DATADIR, + OPT_MOD, OPT_LANGDIR, - OPT_TEXPACK, - OPT_VBO, - OPT_PROTO + OPT_VBO }; option options[] = @@ -239,13 +226,13 @@ ParseArgsStatus CApplication::ParseArguments(int argc, char *argv[]) { "help", no_argument, nullptr, OPT_HELP }, { "debug", required_argument, nullptr, OPT_DEBUG }, { "runscene", required_argument, nullptr, OPT_RUNSCENE }, + { "scenetest", no_argument, nullptr, OPT_SCENETEST }, { "loglevel", required_argument, nullptr, OPT_LOGLEVEL }, { "language", required_argument, nullptr, OPT_LANGUAGE }, { "datadir", required_argument, nullptr, OPT_DATADIR }, + { "mod", required_argument, nullptr, OPT_MOD }, { "langdir", required_argument, nullptr, OPT_LANGDIR }, - { "texpack", required_argument, nullptr, OPT_TEXPACK }, { "vbo", required_argument, nullptr, OPT_VBO }, - { "proto", no_argument, nullptr, OPT_PROTO }, { nullptr, 0, nullptr, 0} }; @@ -279,13 +266,13 @@ ParseArgsStatus CApplication::ParseArguments(int argc, char *argv[]) GetLogger()->Message(" -help this help\n"); GetLogger()->Message(" -debug modes enable debug modes (more info printed in logs; see code for reference of modes)\n"); GetLogger()->Message(" -runscene sceneNNN run given scene on start\n"); + GetLogger()->Message(" -scenetest win every mission right after it's loaded\n"); GetLogger()->Message(" -loglevel level set log level to level (one of: trace, debug, info, warn, error, none)\n"); GetLogger()->Message(" -language lang set language (one of: en, de, fr, pl, ru)\n"); GetLogger()->Message(" -datadir path set custom data directory path\n"); + GetLogger()->Message(" -mod path run mod\n"); GetLogger()->Message(" -langdir path set custom language directory path\n"); - GetLogger()->Message(" -texpack path set path to custom texture pack\n"); GetLogger()->Message(" -vbo mode set OpenGL VBO mode (one of: auto, enable, disable)\n"); - GetLogger()->Message(" -proto show prototype levels\n"); return PARSE_ARGS_HELP; } case OPT_DEBUG: @@ -316,6 +303,11 @@ ParseArgsStatus CApplication::ParseArguments(int argc, char *argv[]) GetLogger()->Info("Running scene '%s%d' on start\n", m_runSceneName.c_str(), m_runSceneRank); break; } + case OPT_SCENETEST: + { + m_sceneTest = true; + break; + } case OPT_LOGLEVEL: { LogLevel logLevel; @@ -346,19 +338,19 @@ ParseArgsStatus CApplication::ParseArguments(int argc, char *argv[]) { m_dataPath = optarg; m_customDataPath = true; - GetLogger()->Info("Using custom datadir or running mod: '%s'\n", m_dataPath.c_str()); + GetLogger()->Info("Using datadir: '%s'\n", optarg); break; } - case OPT_LANGDIR: + case OPT_MOD: { - m_langPath = optarg; - GetLogger()->Info("Using custom language dir: '%s'\n", m_langPath.c_str()); + m_gameData->AddMod(std::string(optarg)); + GetLogger()->Info("Running mod from path: '%s'\n", optarg); break; } - case OPT_TEXPACK: + case OPT_LANGDIR: { - m_texPackPath = optarg; - GetLogger()->Info("Using texturepack: '%s'\n", m_texPackPath.c_str()); + m_langPath = optarg; + GetLogger()->Info("Using language dir: '%s'\n", m_langPath.c_str()); break; } case OPT_VBO: @@ -379,11 +371,6 @@ ParseArgsStatus CApplication::ParseArguments(int argc, char *argv[]) break; } - case OPT_PROTO: - { - m_protoMode = true; - break; - } default: assert(false); // should never get here } @@ -420,11 +407,19 @@ bool CApplication::Create() m_exitCode = 1; return false; } - -#if !defined(PLATFORM_MACOSX) - // On Mac OSX, the bundle can potentially change place, it doesn't make sense to cache it to the configuration file - GetProfile().SetLocalProfileString("Resources", "Data", m_dataPath); -#endif + + m_gameData->SetDataDir(std::string(m_dataPath)); + m_gameData->Init(); + + if (GetProfile().GetLocalProfileString("Language", "Lang", path)) { + Language language; + if (ParseLanguage(path, language)) { + m_language = language; + GetLogger()->Info("Setting language '%s' from ini file\n", path.c_str()); + } else { + GetLogger()->Error("Invalid language '%s' in ini file\n", path.c_str()); + } + } SetLanguage(m_language); @@ -436,36 +431,9 @@ bool CApplication::Create() m_sound = new CSoundInterface(); #endif - m_sound->Create(true); - -#if !defined(PLATFORM_MACOSX) - // On Mac OSX, the bundle can potentially change place, it doesn't make sense to cache it to the configuration file - - // Cache sound files - if (defaultValues) - { - GetProfile().SetLocalProfileString("Resources", "Sound", GetDataSubdirPath(DIR_SOUND)); - GetProfile().SetLocalProfileString("Resources", "Music", GetDataSubdirPath(DIR_MUSIC)); - } -#endif - - if (!m_customDataPath && GetProfile().GetLocalProfileString("Resources", "Sound", path)) - { - m_sound->CacheAll(path); - } - else - { - m_sound->CacheAll(GetDataSubdirPath(DIR_SOUND)); - } - - if (!m_customDataPath && GetProfile().GetLocalProfileString("Resources", "Music", path)) - { - m_sound->AddMusicFiles(path); - } - else - { - m_sound->AddMusicFiles(GetDataSubdirPath(DIR_MUSIC)); - } + m_sound->Create(); + m_sound->CacheAll(); + m_sound->AddMusicFiles(); GetLogger()->Info("CApplication created successfully\n"); @@ -962,15 +930,15 @@ int CApplication::Run() { LogEvent(event); - StartPerformanceCounter(PCNT_UPDATE_ENGINE); - m_engine->FrameUpdate(); - StopPerformanceCounter(PCNT_UPDATE_ENGINE); - m_sound->FrameMove(m_relTime); StartPerformanceCounter(PCNT_UPDATE_GAME); m_robotMain->ProcessEvent(event); StopPerformanceCounter(PCNT_UPDATE_GAME); + + StartPerformanceCounter(PCNT_UPDATE_ENGINE); + m_engine->FrameUpdate(); + StopPerformanceCounter(PCNT_UPDATE_ENGINE); } StopPerformanceCounter(PCNT_UPDATE_ALL); @@ -1608,59 +1576,6 @@ bool CApplication::GetJoystickEnabled() const return m_joystickEnabled; } -std::string CApplication::GetDataDirPath() const -{ - return m_dataPath; -} - -std::string CApplication::GetDataSubdirPath(DataDir stdDir) const -{ - int index = static_cast<int>(stdDir); - assert(index >= 0 && index < DIR_MAX); - std::stringstream str; - str << m_dataPath; - str << "/"; - str << m_standardDataDirs[index]; - return str.str(); -} - -std::string CApplication::GetDataFilePath(DataDir stdDir, const std::string& subpath) const -{ - int index = static_cast<int>(stdDir); - assert(index >= 0 && index < DIR_MAX); - std::stringstream str; - str << m_dataPath; - str << "/"; - str << m_standardDataDirs[index]; - if (stdDir == DIR_HELP) - { - str << "/"; - str << GetLanguageChar(); - } - str << "/"; - str << subpath; - return str.str(); -} - -std::string CApplication::GetTexPackFilePath(const std::string& textureName) const -{ - std::stringstream str; - - if (! m_texPackPath.empty()) - { - str << m_texPackPath; - str << "/"; - str << textureName; - if (! boost::filesystem::exists(str.str())) - { - GetLogger()->Trace("Texture '%s' not in texpack\n", textureName.c_str()); - str.str(""); - } - } - - return str.str(); -} - Language CApplication::GetLanguage() const { return m_language; @@ -1868,8 +1783,7 @@ void CApplication::UpdatePerformanceCountersData() } } -bool CApplication::GetProtoMode() const +bool CApplication::GetSceneTestMode() { - return m_protoMode; + return m_sceneTest; } - diff --git a/src/app/app.h b/src/app/app.h index 6b02f67..86a757f 100644 --- a/src/app/app.h +++ b/src/app/app.h @@ -42,6 +42,7 @@ class CInstanceManager; class CEventQueue; class CRobotMain; class CSoundInterface; +class CGameData; namespace Gfx { class CModelManager; @@ -328,18 +329,6 @@ public: static bool ParseDebugModes(const std::string& str, int& debugModes); //@} - //! Returns the full path to data directory - std::string GetDataDirPath() const; - - //! Returns the full path to a standard dir in data directory - std::string GetDataSubdirPath(DataDir stdDir) const; - - //! Returns the full path to a file in data directory given standard dir and subpath - std::string GetDataFilePath(DataDir stdDir, const std::string &subpath) const; - - //! Returns the full path to a file in texture pack directory - std::string GetTexPackFilePath(const std::string& textureName) const; - //! Management of language //@{ Language GetLanguage() const; @@ -360,8 +349,8 @@ public: void StopPerformanceCounter(PerformanceCounter counter); float GetPerformanceCounterData(PerformanceCounter counter) const; //@} - - bool GetProtoMode() const; + + bool GetSceneTestMode(); protected: //! Creates the window's SDL_Surface @@ -413,6 +402,8 @@ protected: CRobotMain* m_robotMain; //! Profile (INI) reader/writer CProfile* m_profile; + //! Game data + CGameData* m_gameData; //! Code to return at exit int m_exitCode; @@ -485,17 +476,15 @@ protected: //! Path to directory with language files std::string m_langPath; - - //! Path to directory with user texture pack - std::string m_texPackPath; - + //@{ //! Scene to run on startup std::string m_runSceneName; int m_runSceneRank; //@} - - const char* m_standardDataDirs[DIR_MAX]; + + //! Scene test mode + bool m_sceneTest; //! Application language Language m_language; diff --git a/src/app/gamedata.cpp b/src/app/gamedata.cpp new file mode 100644 index 0000000..ceeb7b3 --- /dev/null +++ b/src/app/gamedata.cpp @@ -0,0 +1,136 @@ +// * This file is part of the COLOBOT source code +// * Copyright (C) 2014, Polish Portal of Colobot (PPC) +// * +// * 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://www.gnu.org/licenses/. + +#include "app/gamedata.h" + + +#include "app/app.h" + +#include <boost/filesystem.hpp> + +template<> CGameData* CSingleton<CGameData>::m_instance = nullptr; + +CGameData::CGameData() +{ + m_dataDirSet = false; + + for (int i = 0; i < DIR_MAX; ++i) + m_standardDataDirs[i] = nullptr; + + m_standardDataDirs[DIR_AI] = "ai"; + m_standardDataDirs[DIR_FONT] = "fonts"; + m_standardDataDirs[DIR_HELP] = "help"; + m_standardDataDirs[DIR_ICON] = "icons"; + m_standardDataDirs[DIR_LEVEL] = "levels"; + m_standardDataDirs[DIR_MODEL] = "models"; + m_standardDataDirs[DIR_MUSIC] = "music"; + m_standardDataDirs[DIR_SOUND] = "sounds"; + m_standardDataDirs[DIR_TEXTURE] = "textures"; +} + +CGameData::~CGameData() +{ +} + +void CGameData::SetDataDir(std::string path) +{ + assert(!m_dataDirSet); + m_dataDirSet = true; + + m_dataDirs.insert(m_dataDirs.begin(), path); +} + +void CGameData::AddMod(std::string path) +{ + m_dataDirs.push_back(path); +} + +void CGameData::Init() +{ + std::string out = "Using datadirs: "; + bool first = true; + for(std::vector<std::string>::reverse_iterator rit = m_dataDirs.rbegin(); rit != m_dataDirs.rend(); ++rit) { + if(!first) out += ", "; + first = false; + out += *rit; + } + out += "\n"; + CLogger::GetInstancePointer()->Info(out.c_str()); +} + +std::string CGameData::GetFilePath(DataDir dir, const std::string& subpath) +{ + int index = static_cast<int>(dir); + assert(index >= 0 && index < DIR_MAX); + + for(std::vector<std::string>::reverse_iterator rit = m_dataDirs.rbegin(); rit != m_dataDirs.rend(); ++rit) { + std::stringstream str; + + if ( subpath.find("save") == std::string::npos ){ // if its NOT a path to a savefile screenshot + str << *rit; + str << "/"; + str << m_standardDataDirs[index]; + + if (dir == DIR_HELP) + { + str << "/"; + str << CApplication::GetInstancePointer()->GetLanguageChar(); + } + str << "/"; + } + + str << subpath; + + boost::filesystem::path path(str.str()); + if(boost::filesystem::exists(path)) + { + return str.str(); + } + } + + if(m_dataDirs.size() > 0) { + std::stringstream str; + if ( subpath.find("save") == std::string::npos ){ // if its NOT a path to a savefile screenshot + str << m_dataDirs[0]; + str << "/"; + str << m_standardDataDirs[index]; + + if (dir == DIR_HELP) + { + str << "/"; + str << CApplication::GetInstancePointer()->GetLanguageChar(); + } + str << "/"; + } + str << subpath; + return str.str(); + } + + return subpath; +} + +std::string CGameData::GetDataPath(const std::string &subpath) +{ + for(std::vector<std::string>::reverse_iterator rit = m_dataDirs.rbegin(); rit != m_dataDirs.rend(); ++rit) { + std::string path = *rit + "/" + subpath; + boost::filesystem::path boostPath(path); + if(boost::filesystem::exists(boostPath)) + { + return path; + } + } + return m_dataDirs[0] + "/" + subpath; +} diff --git a/src/app/gamedata.h b/src/app/gamedata.h new file mode 100644 index 0000000..b7536a2 --- /dev/null +++ b/src/app/gamedata.h @@ -0,0 +1,66 @@ +// * This file is part of the COLOBOT source code +// * Copyright (C) 2014, Polish Portal of Colobot (PPC) +// * +// * 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://www.gnu.org/licenses/. + +/** + * \file app/gamedata.h + * \brief Game data + */ + +#pragma once + +#include "common/singleton.h" + +#include <string> +#include <vector> + +/** + * \enum DataDir + * \brief Directories in data directory + */ +enum DataDir +{ + DIR_AI, //! < ai scripts + DIR_FONT, //! < fonts + DIR_HELP, //! < help files + DIR_ICON, //! < icons & images + DIR_LEVEL, //! < levels + DIR_MODEL, //! < models + DIR_MUSIC, //! < music + DIR_SOUND, //! < sounds + DIR_TEXTURE, //! < textures + + DIR_MAX //! < number of dirs +}; + +class CGameData : public CSingleton<CGameData> +{ +public: + CGameData(); + ~CGameData(); + + void Init(); + void SetDataDir(std::string path); + void AddMod(std::string path); + + std::string GetFilePath(DataDir dir, const std::string &subpath); + std::string GetDataPath(const std::string &subpath); + +private: + bool m_dataDirSet; + std::vector<std::string> m_dataDirs; + const char* m_standardDataDirs[DIR_MAX]; +}; + diff --git a/src/app/pausemanager.cpp b/src/app/pausemanager.cpp new file mode 100644 index 0000000..d357bba --- /dev/null +++ b/src/app/pausemanager.cpp @@ -0,0 +1,94 @@ +// * This file is part of the COLOBOT source code +// * Copyright (C) 2001-2008, Daniel ROUX & EPSITEC SA, www.epsitec.ch +// * Copyright (C) 2012, Polish Portal of Colobot (PPC) +// * +// * 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://www.gnu.org/licenses/. + +#include "app/app.h" +#include "app/pausemanager.h" + +#include "common/logger.h" + +#include "object/robotmain.h" + + +template<> CPauseManager* CSingleton<CPauseManager>::m_instance = nullptr; + + +CPauseManager::CPauseManager() +{ + m_sound = CApplication::GetInstancePointer()->GetSound(); + + m_pause = PAUSE_NONE; +} + +CPauseManager::~CPauseManager() +{ + m_sound = nullptr; +} + +void CPauseManager::SetPause(PauseType pause) +{ + if(pause != PAUSE_NONE) { + if(m_pause != pause) { + CLogger::GetInstancePointer()->Info("Game paused - %s\n", GetPauseName(pause).c_str()); + CRobotMain::GetInstancePointer()->StartPauseMusic(pause); + } + + m_pause = pause; + } else + ClearPause(); +} + +void CPauseManager::ClearPause() +{ + if(m_pause != PAUSE_NONE) { + CLogger::GetInstancePointer()->Info("Game resumed\n"); + m_sound->StopPauseMusic(); + } + + m_pause = PAUSE_NONE; +} + +bool CPauseManager::GetPause() +{ + return m_pause != PAUSE_NONE; +} + +bool CPauseManager::GetPause(PauseType pause) +{ + return m_pause == pause; +} + +PauseType CPauseManager::GetPauseType() +{ + return m_pause; +} + +std::string CPauseManager::GetPauseName(PauseType pause) +{ + switch(pause) + { + case PAUSE_NONE: return "None"; + case PAUSE_USER: return "User"; + case PAUSE_SATCOM: return "SatCom"; + case PAUSE_SATCOMMOVIE: return "SatCom opening animation"; + case PAUSE_DIALOG: return "Dialog"; + case PAUSE_EDITOR: return "CBot editor"; + case PAUSE_VISIT: return "Visit"; + case PAUSE_CHEAT: return "Cheat console"; + case PAUSE_PHOTO: return "Photo mode"; + default: assert(false); // Should never happen + } +} diff --git a/src/app/pausemanager.h b/src/app/pausemanager.h new file mode 100644 index 0000000..fefc4a5 --- /dev/null +++ b/src/app/pausemanager.h @@ -0,0 +1,62 @@ +// * This file is part of the COLOBOT source code +// * Copyright (C) 2001-2008, Daniel ROUX & EPSITEC SA, www.epsitec.ch +// * Copyright (C) 2012, Polish Portal of Colobot (PPC) +// * +// * 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://www.gnu.org/licenses/. + +/** + * \file app/pausemanager.h + * \brief Management of pause modes + */ +#pragma once + +#include "common/singleton.h" +#include "sound/sound.h" + +#include <string> + + +enum PauseType { + PAUSE_NONE = 0, + PAUSE_USER, + PAUSE_SATCOM, + PAUSE_SATCOMMOVIE, + PAUSE_DIALOG, + PAUSE_EDITOR, + PAUSE_VISIT, + PAUSE_CHEAT, + PAUSE_PHOTO +}; + +class CPauseManager : public CSingleton<CPauseManager> +{ +public: + CPauseManager(); + ~CPauseManager(); + + void SetPause(PauseType pause); + void ClearPause(); + bool GetPause(); + bool GetPause(PauseType pause); + PauseType GetPauseType(); + +private: + std::string GetPauseName(PauseType pause); + +private: + CSoundInterface* m_sound; + + PauseType m_pause; +}; + diff --git a/src/common/config.h.cmake b/src/common/config.h.cmake index 63cd93b..98ccefe 100644 --- a/src/common/config.h.cmake +++ b/src/common/config.h.cmake @@ -3,6 +3,7 @@ // Macros set by CMake #cmakedefine PLATFORM_WINDOWS @PLATFORM_WINDOWS@ #cmakedefine PLATFORM_LINUX @PLATFORM_LINUX@ +#cmakedefine PLATFORM_GNU @PLATFORM_GNU@ #cmakedefine PLATFORM_MACOSX @PLATFORM_MACOSX@ #cmakedefine PLATFORM_OTHER @PLATFORM_OTHER@ @@ -26,6 +27,7 @@ #define COLOBOT_VERSION "@COLOBOT_VERSION_FULL@" #define COLOBOT_CODENAME "@COLOBOT_VERSION_CODENAME@" #define COLOBOT_FULLNAME "Colobot @COLOBOT_VERSION_CODENAME@" +#define COLOBOT_VERSION_DISPLAY "@COLOBOT_VERSION_DISPLAY@" #define COLOBOT_DEFAULT_DATADIR "@COLOBOT_INSTALL_DATA_DIR@" #define COLOBOT_I18N_DIR "@COLOBOT_INSTALL_I18N_DIR@" diff --git a/src/common/event.cpp b/src/common/event.cpp index 7acac77..9dc3943 100644 --- a/src/common/event.cpp +++ b/src/common/event.cpp @@ -161,7 +161,6 @@ void InitializeEventTypeTexts() EVENT_TYPE_TEXT[EVENT_INTERFACE_DEFI] = "EVENT_INTERFACE_DEFI"; EVENT_TYPE_TEXT[EVENT_INTERFACE_MISSION] = "EVENT_INTERFACE_MISSION"; EVENT_TYPE_TEXT[EVENT_INTERFACE_FREE] = "EVENT_INTERFACE_FREE"; - EVENT_TYPE_TEXT[EVENT_INTERFACE_PROTO] = "EVENT_INTERFACE_PROTO"; EVENT_TYPE_TEXT[EVENT_INTERFACE_NAME] = "EVENT_INTERFACE_NAME"; EVENT_TYPE_TEXT[EVENT_INTERFACE_SETUP] = "EVENT_INTERFACE_SETUP"; EVENT_TYPE_TEXT[EVENT_INTERFACE_QUIT] = "EVENT_INTERFACE_QUIT"; diff --git a/src/common/event.h b/src/common/event.h index 9405660..c5eb615 100644 --- a/src/common/event.h +++ b/src/common/event.h @@ -184,7 +184,6 @@ enum EventType EVENT_INTERFACE_DEFI = 401, EVENT_INTERFACE_MISSION = 402, EVENT_INTERFACE_FREE = 403, - EVENT_INTERFACE_PROTO = 404, EVENT_INTERFACE_NAME = 405, EVENT_INTERFACE_SETUP = 406, EVENT_INTERFACE_QUIT = 407, diff --git a/src/common/global.h b/src/common/global.h index da62bac..4049bdc 100644 --- a/src/common/global.h +++ b/src/common/global.h @@ -28,137 +28,138 @@ */ enum Error { - ERR_OK = 0, //! < ok - ERR_GENERIC = 1, //! < any error - ERR_CONTINUE = 2, //! < continues - ERR_STOP = 3, //! < stops - ERR_CMD = 4, //! < unknown command - ERR_MANIP_VEH = 100, //! < inappropriate vehicle - ERR_MANIP_FLY = 101, //! < impossible in flight - ERR_MANIP_BUSY = 102, //! < taking: hands already occupied - ERR_MANIP_NIL = 103, //! < taking: nothing has to take - ERR_MANIP_MOTOR = 105, //! < busy: impossible to move - ERR_MANIP_OCC = 106, //! < busy: location already occupied - ERR_MANIP_FRIEND = 107, //! < no other vehicle - ERR_MANIP_RADIO = 108, //! < impossible because radioactive - ERR_MANIP_WATER = 109, //! < not possible under water - ERR_MANIP_EMPTY = 110, //! < nothing to deposit - ERR_BUILD_FLY = 120, //! < not possible in flight - ERR_BUILD_WATER = 121, //! < not possible under water - ERR_BUILD_ENERGY = 122, //! < not enough energy - ERR_BUILD_METALAWAY = 123, //! < lack of metal (too far) - ERR_BUILD_METALNEAR = 124, //! < lack of metal (too close) - ERR_BUILD_METALINEX = 125, //! < lack of metal - ERR_BUILD_FLAT = 126, //! < not enough flat ground - ERR_BUILD_FLATLIT = 127, //! < not enough flat ground space - ERR_BUILD_BUSY = 128, //! < location occupied - ERR_BUILD_BASE = 129, //! < too close to the rocket - ERR_BUILD_NARROW = 130, //! < buildings too close - ERR_BUILD_MOTOR = 131, //! < built: not possible in movement - ERR_BUILD_DISABLED = 132, //! < built: can not produce this object in this mission - ERR_BUILD_RESEARCH = 133, //! < built: can not produce not researched object - ERR_SEARCH_FLY = 140, //! < not possible in flight - ERR_SEARCH_VEH = 141, //! < inappropriate vehicle - ERR_SEARCH_MOTOR = 142, //! < impossible in movement - ERR_TERRA_VEH = 150, //! < inappropriate vehicle - ERR_TERRA_ENERGY = 151, //! < not enough energy - ERR_TERRA_FLOOR = 152, //! < inappropriate ground - ERR_TERRA_BUILDING = 153, //! < building too close - ERR_TERRA_OBJECT = 154, //! < object too close - ERR_FIRE_VEH = 160, //! < inappropriate vehicle - ERR_FIRE_ENERGY = 161, //! < not enough energy - ERR_FIRE_FLY = 162, //! < not possible in flight - ERR_RECOVER_VEH = 170, //! < inappropriate vehicle - ERR_RECOVER_ENERGY = 171, //! < not enough energy - ERR_RECOVER_NULL = 172, //! < lack of ruin - ERR_CONVERT_EMPTY = 180, //! < no stone was transformed - ERR_SHIELD_VEH = 190, //! < inappropriate vehicle - ERR_SHIELD_ENERGY = 191, //! < not enough energy - ERR_MOVE_IMPOSSIBLE = 200, //! < move impossible - ERR_FIND_IMPOSSIBLE = 201, //! < find impossible - ERR_GOTO_IMPOSSIBLE = 210, //! < goto impossible - ERR_GOTO_ITER = 211, //! < goto too complicated - ERR_GOTO_BUSY = 212, //! < goto destination occupied - ERR_DERRICK_NULL = 300, //! < no ore underground - ERR_STATION_NULL = 301, //! < no energy underground - ERR_TOWER_POWER = 310, //! < no battery - ERR_TOWER_ENERGY = 311, //! < more energy - ERR_RESEARCH_POWER = 320, //! < no battery - ERR_RESEARCH_ENERGY = 321, //! < more energy - ERR_RESEARCH_TYPE = 322, //! < the wrong type of battery - ERR_RESEARCH_ALREADY = 323, //! < research already done - ERR_ENERGY_NULL = 330, //! < no energy underground - ERR_ENERGY_LOW = 331, //! < not enough energy - ERR_ENERGY_EMPTY = 332, //! < lack of metal - ERR_ENERGY_BAD = 333, //! < transforms only the metal - ERR_BASE_DLOCK = 340, //! < doors locked - ERR_BASE_DHUMAN = 341, //! < you must be on spaceship - ERR_LABO_NULL = 350, //! < nothing to analyze - ERR_LABO_BAD = 351, //! < analyzes only organic ball - ERR_LABO_ALREADY = 352, //! < analysis already made - ERR_NUCLEAR_NULL = 360, //! < no energy underground - ERR_NUCLEAR_LOW = 361, //! < not enough energy - ERR_NUCLEAR_EMPTY = 362, //! < lack of uranium - ERR_NUCLEAR_BAD = 363, //! < transforms only uranium - ERR_FACTORY_NULL = 370, //! < no metal - ERR_FACTORY_NEAR = 371, //! < vehicle too close - ERR_RESET_NEAR = 380, //! < vehicle too close - ERR_INFO_NULL = 390, //! < no information terminal - ERR_VEH_VIRUS = 400, //! < vehicle infected by a virus - ERR_BAT_VIRUS = 401, //! < building infected by a virus - ERR_DESTROY_NOTFOUND = 410, //! < not found anything to destroy - ERR_WRONG_OBJ = 420, //! < inappropriate vehicle - ERR_VEH_POWER = 500, //! < no battery - ERR_VEH_ENERGY = 501, //! < more energy - ERR_FLAG_FLY = 510, //! < impossible in flight - ERR_FLAG_WATER = 511, //! < impossible during swimming - ERR_FLAG_MOTOR = 512, //! < impossible in movement - ERR_FLAG_BUSY = 513, //! < taking: already creating flag - ERR_FLAG_CREATE = 514, //! < too many flags - ERR_FLAG_PROXY = 515, //! < too close - ERR_FLAG_DELETE = 516, //! < nothing to remove - ERR_MISSION_NOTERM = 600, //! < Mission not completed - ERR_DELETEMOBILE = 700, //! < vehicle destroyed - ERR_DELETEBUILDING = 701, //! < building destroyed - ERR_TOOMANY = 702, //! < too many objects - ERR_OBLIGATORYTOKEN = 800, //! < compulsory instruction missing - ERR_PROHIBITEDTOKEN = 801, //! < instruction prohibited + ERR_OK = 0, //! < ok + ERR_GENERIC = 1, //! < any error + ERR_CONTINUE = 2, //! < continues + ERR_STOP = 3, //! < stops + ERR_CMD = 4, //! < unknown command + ERR_MANIP_VEH = 100, //! < inappropriate vehicle + ERR_MANIP_FLY = 101, //! < impossible in flight + ERR_MANIP_BUSY = 102, //! < taking: hands already occupied + ERR_MANIP_NIL = 103, //! < taking: nothing has to take + ERR_MANIP_MOTOR = 105, //! < busy: impossible to move + ERR_MANIP_OCC = 106, //! < busy: location already occupied + ERR_MANIP_FRIEND = 107, //! < no other vehicle + ERR_MANIP_RADIO = 108, //! < impossible because radioactive + ERR_MANIP_WATER = 109, //! < not possible under water + ERR_MANIP_EMPTY = 110, //! < nothing to deposit + ERR_BUILD_FLY = 120, //! < not possible in flight + ERR_BUILD_WATER = 121, //! < not possible under water + ERR_BUILD_ENERGY = 122, //! < not enough energy + ERR_BUILD_METALAWAY = 123, //! < lack of metal (too far) + ERR_BUILD_METALNEAR = 124, //! < lack of metal (too close) + ERR_BUILD_METALINEX = 125, //! < lack of metal + ERR_BUILD_FLAT = 126, //! < not enough flat ground + ERR_BUILD_FLATLIT = 127, //! < not enough flat ground space + ERR_BUILD_BUSY = 128, //! < location occupied + ERR_BUILD_BASE = 129, //! < too close to the rocket + ERR_BUILD_NARROW = 130, //! < buildings too close + ERR_BUILD_MOTOR = 131, //! < built: not possible in movement + ERR_BUILD_DISABLED = 132, //! < built: can not produce this object in this mission + ERR_BUILD_RESEARCH = 133, //! < built: can not produce not researched object + ERR_SEARCH_FLY = 140, //! < not possible in flight + ERR_SEARCH_VEH = 141, //! < inappropriate vehicle + ERR_SEARCH_MOTOR = 142, //! < impossible in movement + ERR_TERRA_VEH = 150, //! < inappropriate vehicle + ERR_TERRA_ENERGY = 151, //! < not enough energy + ERR_TERRA_FLOOR = 152, //! < inappropriate ground + ERR_TERRA_BUILDING = 153, //! < building too close + ERR_TERRA_OBJECT = 154, //! < object too close + ERR_FIRE_VEH = 160, //! < inappropriate vehicle + ERR_FIRE_ENERGY = 161, //! < not enough energy + ERR_FIRE_FLY = 162, //! < not possible in flight + ERR_RECOVER_VEH = 170, //! < inappropriate vehicle + ERR_RECOVER_ENERGY = 171, //! < not enough energy + ERR_RECOVER_NULL = 172, //! < lack of ruin + ERR_CONVERT_EMPTY = 180, //! < no stone was transformed + ERR_SHIELD_VEH = 190, //! < inappropriate vehicle + ERR_SHIELD_ENERGY = 191, //! < not enough energy + ERR_MOVE_IMPOSSIBLE = 200, //! < move impossible + ERR_FIND_IMPOSSIBLE = 201, //! < find impossible + ERR_GOTO_IMPOSSIBLE = 210, //! < goto impossible + ERR_GOTO_ITER = 211, //! < goto too complicated + ERR_GOTO_BUSY = 212, //! < goto destination occupied + ERR_DERRICK_NULL = 300, //! < no ore underground + ERR_STATION_NULL = 301, //! < no energy underground + ERR_TOWER_POWER = 310, //! < no battery + ERR_TOWER_ENERGY = 311, //! < more energy + ERR_RESEARCH_POWER = 320, //! < no battery + ERR_RESEARCH_ENERGY = 321, //! < more energy + ERR_RESEARCH_TYPE = 322, //! < the wrong type of battery + ERR_RESEARCH_ALREADY = 323, //! < research already done + ERR_ENERGY_NULL = 330, //! < no energy underground + ERR_ENERGY_LOW = 331, //! < not enough energy + ERR_ENERGY_EMPTY = 332, //! < lack of metal + ERR_ENERGY_BAD = 333, //! < transforms only the metal + ERR_BASE_DLOCK = 340, //! < doors locked + ERR_BASE_DHUMAN = 341, //! < you must be on spaceship + ERR_LABO_NULL = 350, //! < nothing to analyze + ERR_LABO_BAD = 351, //! < analyzes only organic ball + ERR_LABO_ALREADY = 352, //! < analysis already made + ERR_NUCLEAR_NULL = 360, //! < no energy underground + ERR_NUCLEAR_LOW = 361, //! < not enough energy + ERR_NUCLEAR_EMPTY = 362, //! < lack of uranium + ERR_NUCLEAR_BAD = 363, //! < transforms only uranium + ERR_FACTORY_NULL = 370, //! < no metal + ERR_FACTORY_NEAR = 371, //! < vehicle too close + ERR_RESET_NEAR = 380, //! < vehicle too close + ERR_INFO_NULL = 390, //! < no information terminal + ERR_VEH_VIRUS = 400, //! < vehicle infected by a virus + ERR_BAT_VIRUS = 401, //! < building infected by a virus + ERR_DESTROY_NOTFOUND = 410, //! < not found anything to destroy + ERR_WRONG_OBJ = 420, //! < inappropriate vehicle + ERR_VEH_POWER = 500, //! < no battery + ERR_VEH_ENERGY = 501, //! < more energy + ERR_FLAG_FLY = 510, //! < impossible in flight + ERR_FLAG_WATER = 511, //! < impossible during swimming + ERR_FLAG_MOTOR = 512, //! < impossible in movement + ERR_FLAG_BUSY = 513, //! < taking: already creating flag + ERR_FLAG_CREATE = 514, //! < too many flags + ERR_FLAG_PROXY = 515, //! < too close + ERR_FLAG_DELETE = 516, //! < nothing to remove + ERR_MISSION_NOTERM = 600, //! < Mission not completed + ERR_DELETEMOBILE = 700, //! < vehicle destroyed + ERR_DELETEBUILDING = 701, //! < building destroyed + ERR_TOOMANY = 702, //! < too many objects + ERR_OBLIGATORYTOKEN = 800, //! < compulsory instruction missing + ERR_PROHIBITEDTOKEN = 801, //! < instruction prohibited + ERR_AIM_IMPOSSIBLE = 900, //! < cannot aim at specified angle(s) - INFO_FIRST = 10000, //! < first information - INFO_BUILD = 10001, //! < construction builded - INFO_CONVERT = 10002, //! < metal available - INFO_RESEARCH = 10003, //! < search ended - INFO_FACTORY = 10004, //! < vehicle manufactured - INFO_LABO = 10005, //! < analysis ended - INFO_ENERGY = 10006, //! < battery available - INFO_NUCLEAR = 10007, //! < nuclear battery available - INFO_FINDING = 10008, //! < nuclear battery available - INFO_MARKPOWER = 10020, //! < location for station found - INFO_MARKURANIUM = 10021, //! < location for derrick found - INFO_MARKSTONE = 10022, //! < location for derrick found - INFO_MARKKEYa = 10023, //! < location for derrick found - INFO_MARKKEYb = 10024, //! < location for derrick found - INFO_MARKKEYc = 10025, //! < location for derrick found - INFO_MARKKEYd = 10026, //! < location for derrick found - INFO_RESEARCHTANK = 10030, //! < research ended - INFO_RESEARCHFLY = 10031, //! < research ended - INFO_RESEARCHTHUMP = 10032, //! < research ended - INFO_RESEARCHCANON = 10033, //! < research ended - INFO_RESEARCHTOWER = 10034, //! < research ended - INFO_RESEARCHPHAZER = 10035, //! < research ended - INFO_RESEARCHSHIELD = 10036, //! < research ended - INFO_RESEARCHATOMIC = 10037, //! < research ended - INFO_WIN = 10040, //! < win - INFO_LOST = 10041, //! < lost - INFO_LOSTq = 10042, //! < lost immediately - INFO_WRITEOK = 10043, //! < record done - INFO_DELETEPATH = 10050, //! < way mark deleted - INFO_DELETEMOTHER = 10100, //! < insect killed - INFO_DELETEANT = 10101, //! < insect killed - INFO_DELETEBEE = 10102, //! < insect killed - INFO_DELETEWORM = 10103, //! < insect killed - INFO_DELETESPIDER = 10104, //! < insect killed - INFO_BEGINSATCOM = 10105, //! < use your SatCom + INFO_FIRST = 10000, //! < first information + INFO_BUILD = 10001, //! < construction builded + INFO_CONVERT = 10002, //! < metal available + INFO_RESEARCH = 10003, //! < search ended + INFO_FACTORY = 10004, //! < vehicle manufactured + INFO_LABO = 10005, //! < analysis ended + INFO_ENERGY = 10006, //! < battery available + INFO_NUCLEAR = 10007, //! < nuclear battery available + INFO_FINDING = 10008, //! < nuclear battery available + INFO_MARKPOWER = 10020, //! < location for station found + INFO_MARKURANIUM = 10021, //! < location for derrick found + INFO_MARKSTONE = 10022, //! < location for derrick found + INFO_MARKKEYa = 10023, //! < location for derrick found + INFO_MARKKEYb = 10024, //! < location for derrick found + INFO_MARKKEYc = 10025, //! < location for derrick found + INFO_MARKKEYd = 10026, //! < location for derrick found + INFO_RESEARCHTANK = 10030, //! < research ended + INFO_RESEARCHFLY = 10031, //! < research ended + INFO_RESEARCHTHUMP = 10032, //! < research ended + INFO_RESEARCHCANON = 10033, //! < research ended + INFO_RESEARCHTOWER = 10034, //! < research ended + INFO_RESEARCHPHAZER = 10035, //! < research ended + INFO_RESEARCHSHIELD = 10036, //! < research ended + INFO_RESEARCHATOMIC = 10037, //! < research ended + INFO_WIN = 10040, //! < win + INFO_LOST = 10041, //! < lost + INFO_LOSTq = 10042, //! < lost immediately + INFO_WRITEOK = 10043, //! < record done + INFO_DELETEPATH = 10050, //! < way mark deleted + INFO_DELETEMOTHER = 10100, //! < insect killed + INFO_DELETEANT = 10101, //! < insect killed + INFO_DELETEBEE = 10102, //! < insect killed + INFO_DELETEWORM = 10103, //! < insect killed + INFO_DELETESPIDER = 10104, //! < insect killed + INFO_BEGINSATCOM = 10105, //! < use your SatCom ERR_MAX //! < number of values }; @@ -177,25 +178,6 @@ enum Language LANGUAGE_RUSSIAN = 4 }; -/** - * \enum DataDir - * \brief Directories in data directory - */ -enum DataDir -{ - DIR_AI, //! < ai scripts - DIR_FONT, //! < fonts - DIR_HELP, //! < help files - DIR_ICON, //! < icons & images - DIR_LEVEL, //! < levels - DIR_MODEL, //! < models - DIR_MUSIC, //! < music - DIR_SOUND, //! < sounds - DIR_TEXTURE, //! < textures - - DIR_MAX //! < number of dirs -}; - /** * \enum BuildType diff --git a/src/common/image.cpp b/src/common/image.cpp index 8a876e3..e3d1ef7 100644 --- a/src/common/image.cpp +++ b/src/common/image.cpp @@ -418,3 +418,44 @@ bool CImage::SavePNG(const std::string& fileName) return true; } +void CImage::SetDataPixels(void *pixels){ + + Uint8* srcPixels = static_cast<Uint8*> (pixels); + Uint8* resultPixels = static_cast<Uint8*> (m_data->surface->pixels); + + Uint32 pitch = m_data->surface->pitch; + + for(int line = 0; line < m_data->surface->h; ++line) { + Uint32 pos = line * pitch; + memcpy(&resultPixels[pos], &srcPixels[pos], pitch); + } +} + +void CImage::flipVertically(){ + + SDL_Surface* result = SDL_CreateRGBSurface( m_data->surface->flags, + m_data->surface->w, + m_data->surface->h, + m_data->surface->format->BytesPerPixel * 8, + m_data->surface->format->Rmask, + m_data->surface->format->Gmask, + m_data->surface->format->Bmask, + m_data->surface->format->Amask); + + assert(result != nullptr); + + Uint8* srcPixels = static_cast<Uint8*> (m_data->surface->pixels); + Uint8* resultPixels = static_cast<Uint8*> (result->pixels); + + Uint32 pitch = m_data->surface->pitch; + Uint32 pxLength = pitch*m_data->surface->h; + + for(int line = 0; line < m_data->surface->h; ++line) { + Uint32 pos = line * pitch; + memcpy(&resultPixels[pos], &srcPixels[(pxLength-pos)-pitch], pitch); + } + + SDL_FreeSurface(m_data->surface); + + m_data->surface = result; +}
\ No newline at end of file diff --git a/src/common/image.h b/src/common/image.h index 31dab2d..b93f2f9 100644 --- a/src/common/image.h +++ b/src/common/image.h @@ -109,6 +109,12 @@ public: //! Returns the last error std::string GetError(); + //! Flips the image vertically + void flipVertically(); + + //! sets/replaces the pixels from the surface + void SetDataPixels(void *pixels); + private: //! Blit to new RGBA surface with given size void BlitToNewRGBASurface(int width, int height); diff --git a/src/common/logger.cpp b/src/common/logger.cpp index a02854d..7fc8fb0 100644 --- a/src/common/logger.cpp +++ b/src/common/logger.cpp @@ -26,7 +26,11 @@ template<> CLogger* CSingleton<CLogger>::m_instance = nullptr; CLogger::CLogger() { m_file = NULL; + #if DEV_BUILD + m_logLevel = LOG_DEBUG; + #else m_logLevel = LOG_INFO; + #endif } diff --git a/src/common/misc.cpp b/src/common/misc.cpp index b96abca..92c3e9a 100644 --- a/src/common/misc.cpp +++ b/src/common/misc.cpp @@ -192,18 +192,6 @@ void TimeToAscii(time_t time, char *buffer) year = when.tm_year+1900; if ( year < 2000 ) year -= 1900; else year -= 2000; -/* TODO -#if _FRENCH - sprintf(buffer, "%.2d.%.2d.%.2d %.2d:%.2d", - when.tm_mday, when.tm_mon+1, year, - when.tm_hour, when.tm_min); -#endif -#if _GERMAN | _WG - sprintf(buffer, "%.2d.%.2d.%.2d %.2d:%.2d", - when.tm_mday, when.tm_mon+1, year, - when.tm_hour, when.tm_min); -#endif -#if _ENGLISH*/ char format[10]; int hour; @@ -222,12 +210,23 @@ void TimeToAscii(time_t time, char *buffer) sprintf(buffer, "%.2d.%.2d.%.2d %.2d:%.2d %s", when.tm_mon+1, when.tm_mday, year, hour, when.tm_min, format); -/*#endif -#if _POLISH - sprintf(buffer, "%.2d.%.2d.%.2d %.2d:%.2d", - when.tm_mday, when.tm_mon+1, year, +} + +// Converting time to string. + +void TimeToAsciiClean(time_t time, char *buffer) +{ + struct tm when; + int year; + + when = *localtime(&time); + year = when.tm_year+1900; + if ( year < 2000 ) year -= 1900; + else year -= 2000; + + sprintf(buffer, "%.2d%.2d%.2d%.2d%.2d", + year, when.tm_mon+1, when.tm_mday, when.tm_hour, when.tm_min); -#endif*/ } // Copy a list of numbered files into the temporary folder. diff --git a/src/common/misc.h b/src/common/misc.h index bcebf76..3c147b1 100644 --- a/src/common/misc.h +++ b/src/common/misc.h @@ -28,6 +28,7 @@ extern char GetToUpper(char letter); extern char GetToLower(char letter); extern void TimeToAscii(time_t time, char *buffer); +extern void TimeToAsciiClean(time_t time, char *buffer); extern bool CopyFileListToTemp(char* filename, int* list, int total); extern void AddExt(char* filename, const char* ext); diff --git a/src/common/profile.cpp b/src/common/profile.cpp index 77c70c3..ee3e873 100644 --- a/src/common/profile.cpp +++ b/src/common/profile.cpp @@ -91,7 +91,7 @@ bool CProfile::SetLocalProfileString(std::string section, std::string key, std:: } catch (std::exception & e) { - GetLogger()->Error("Error on parsing profile: %s\n", e.what()); + GetLogger()->Info("Error on parsing profile: %s\n", e.what()); return false; } return true; @@ -106,7 +106,7 @@ bool CProfile::GetLocalProfileString(std::string section, std::string key, std:: } catch (std::exception & e) { - GetLogger()->Error("Error on parsing profile: %s\n", e.what()); + GetLogger()->Info("Error on parsing profile: %s\n", e.what()); return false; } return true; @@ -122,7 +122,7 @@ bool CProfile::SetLocalProfileInt(std::string section, std::string key, int valu } catch (std::exception & e) { - GetLogger()->Error("Error on parsing profile: %s\n", e.what()); + GetLogger()->Info("Error on parsing profile: %s\n", e.what()); return false; } return true; @@ -137,7 +137,7 @@ bool CProfile::GetLocalProfileInt(std::string section, std::string key, int &val } catch (std::exception & e) { - GetLogger()->Error("Error on parsing profile: %s\n", e.what()); + GetLogger()->Info("Error on parsing profile: %s\n", e.what()); return false; } return true; @@ -153,7 +153,7 @@ bool CProfile::SetLocalProfileFloat(std::string section, std::string key, float } catch (std::exception & e) { - GetLogger()->Error("Error on parsing profile: %s\n", e.what()); + GetLogger()->Info("Error on parsing profile: %s\n", e.what()); return false; } return true; @@ -168,7 +168,7 @@ bool CProfile::GetLocalProfileFloat(std::string section, std::string key, float } catch (std::exception & e) { - GetLogger()->Error("Error on parsing profile: %s\n", e.what()); + GetLogger()->Info("Error on parsing profile: %s\n", e.what()); return false; } return true; @@ -178,7 +178,7 @@ bool CProfile::GetLocalProfileFloat(std::string section, std::string key, float std::vector< std::string > CProfile::GetLocalProfileSection(std::string section, std::string key) { std::vector< std::string > ret_list; - boost::regex re(key + "[0-9]*"); //we want to match all key followed my any number + boost::regex re(key + "[0-9]*"); //we want to match all key followed by any number try { @@ -192,7 +192,7 @@ std::vector< std::string > CProfile::GetLocalProfileSection(std::string section, } catch (std::exception & e) { - GetLogger()->Error("Error on parsing profile: %s\n", e.what()); + GetLogger()->Info("Error on parsing profile: %s\n", e.what()); } return ret_list; diff --git a/src/common/restext.cpp b/src/common/restext.cpp index d61fa63..b63160d 100644 --- a/src/common/restext.cpp +++ b/src/common/restext.cpp @@ -56,14 +56,13 @@ void InitializeRestext() stringsText[RT_KEY_OR] = " or "; stringsText[RT_TITLE_BASE] = "COLOBOT"; - stringsText[RT_TITLE_INIT] = "COLOBOT"; + stringsText[RT_TITLE_INIT] = "COLOBOT: Gold Edition"; stringsText[RT_TITLE_TRAINER] = "Programming exercises"; stringsText[RT_TITLE_DEFI] = "Challenges"; stringsText[RT_TITLE_MISSION] = "Missions"; stringsText[RT_TITLE_FREE] = "Free game"; stringsText[RT_TITLE_TEEN] = "Free game"; stringsText[RT_TITLE_USER] = "User levels"; - stringsText[RT_TITLE_PROTO] = "Prototypes"; stringsText[RT_TITLE_SETUP] = "Options"; stringsText[RT_TITLE_NAME] = "Player's name"; stringsText[RT_TITLE_PERSO] = "Customize your appearance"; @@ -75,14 +74,12 @@ void InitializeRestext() stringsText[RT_PLAY_CHAPm] = " Planets:"; stringsText[RT_PLAY_CHAPf] = " Planets:"; stringsText[RT_PLAY_CHAPu] = " User levels:"; - stringsText[RT_PLAY_CHAPp] = " Planets:"; stringsText[RT_PLAY_CHAPte] = " Chapters:"; stringsText[RT_PLAY_LISTt] = " Exercises in the chapter:"; stringsText[RT_PLAY_LISTd] = " Challenges in the chapter:"; stringsText[RT_PLAY_LISTm] = " Missions on this planet:"; stringsText[RT_PLAY_LISTf] = " Free game on this planet:"; stringsText[RT_PLAY_LISTu] = " Missions on this level:"; - stringsText[RT_PLAY_LISTp] = " Prototypes on this planet:"; stringsText[RT_PLAY_LISTk] = " Free game on this chapter:"; stringsText[RT_PLAY_RESUME] = " Summary:"; @@ -155,8 +152,7 @@ void InitializeRestext() stringsEvent[EVENT_INTERFACE_FREE] = "Free game\\Free game without a specific goal"; stringsEvent[EVENT_INTERFACE_TEEN] = "Free game\\Free game without a specific goal"; stringsEvent[EVENT_INTERFACE_USER] = "User\\User levels"; - stringsEvent[EVENT_INTERFACE_PROTO] = "Proto\\Prototypes under development"; - stringsEvent[EVENT_INTERFACE_NAME] = "New player\\Choose player's name"; + stringsEvent[EVENT_INTERFACE_NAME] = "Change player\\Change player"; stringsEvent[EVENT_INTERFACE_SETUP] = "Options\\Preferences"; stringsEvent[EVENT_INTERFACE_AGAIN] = "Restart\\Restart the mission from the beginning"; stringsEvent[EVENT_INTERFACE_WRITE] = "Save\\Save the current mission "; @@ -776,9 +772,7 @@ static KeyDesc keyTable[22] = bool SearchKey(const char *cmd, InputSlot &key) { - int i; - - for ( i=0 ; i<22 ; i++ ) + for (int i = 0; i < 22 ;i++) { if ( strstr(cmd, keyTable[i].name) == cmd ) { @@ -791,14 +785,11 @@ bool SearchKey(const char *cmd, InputSlot &key) // Replaces the commands "\key name;" in a text. -static void PutKeyName(char* dst, const char* src) +static void PutKeyName(std::string& dst, const char* src) { - InputSlot key; - char name[50]; - int s, d, n; - unsigned int res; + dst.clear(); - s = d = 0; + int s = 0; while ( src[s] != 0 ) { if ( src[s+0] == '\\' && @@ -807,18 +798,16 @@ static void PutKeyName(char* dst, const char* src) src[s+3] == 'y' && src[s+4] == ' ' ) { + InputSlot key; if ( SearchKey(src+s+5, key) ) { - res = CRobotMain::GetInstancePointer()->GetInputBinding(key).primary; + unsigned int res = CRobotMain::GetInstancePointer()->GetInputBinding(key).primary; if (res != KEY_INVALID) { - if ( GetResource(RES_KEY, res, name) ) + std::string keyName; + if ( GetResource(RES_KEY, res, keyName) ) { - n = 0; - while ( name[n] != 0 ) - { - dst[d++] = name[n++]; - } + dst.append(keyName); while ( src[s++] != ';' ); continue; } @@ -826,9 +815,8 @@ static void PutKeyName(char* dst, const char* src) } } - dst[d++] = src[s++]; + dst.append(1, src[s++]); } - dst[d++] = 0; } // Returns the translated text of a resource that needs key substitution @@ -905,13 +893,13 @@ static const char* GetResourceBase(ResType type, int num) // Returns the text of a resource. -bool GetResource(ResType type, int num, char* text) +bool GetResource(ResType type, int num, std::string& text) { const char *tmpl = GetResourceBase(type, num); if (!tmpl) { - text[0] = 0; + text.clear(); return false; } diff --git a/src/common/restext.h b/src/common/restext.h index e4659e2..cde7203 100644 --- a/src/common/restext.h +++ b/src/common/restext.h @@ -66,7 +66,6 @@ enum ResTextType RT_TITLE_DEFI = 43, RT_TITLE_MISSION = 44, RT_TITLE_FREE = 45, - RT_TITLE_PROTO = 46, RT_TITLE_SETUP = 47, RT_TITLE_NAME = 48, RT_TITLE_PERSO = 49, @@ -79,12 +78,10 @@ enum ResTextType RT_PLAY_CHAPd = 61, RT_PLAY_CHAPm = 62, RT_PLAY_CHAPf = 63, - RT_PLAY_CHAPp = 64, RT_PLAY_LISTt = 65, RT_PLAY_LISTd = 66, RT_PLAY_LISTm = 67, RT_PLAY_LISTf = 68, - RT_PLAY_LISTp = 69, RT_PLAY_RESUME = 70, RT_PLAY_CHAPu = 71, RT_PLAY_LISTu = 72, @@ -157,5 +154,5 @@ void InitializeRestext(); void SetGlobalGamerName(std::string name); bool SearchKey(const char *cmd, InputSlot& slot); -bool GetResource(ResType type, int num, char* text); +bool GetResource(ResType type, int num, std::string& text); diff --git a/src/common/stringutils.cpp b/src/common/stringutils.cpp index 953abba..03a0f0b 100644 --- a/src/common/stringutils.cpp +++ b/src/common/stringutils.cpp @@ -17,6 +17,41 @@ #include "common/stringutils.h" +#include <cstdarg> +#include <cstdio> +#include <vector> + + +static std::string VFormat(const char *fmt, va_list ap) +{ + size_t size = 1024; + char stackbuf[1024]; + std::vector<char> dynamicbuf; + char *buf = &stackbuf[0]; + + while (1) + { + int needed = vsnprintf (buf, size, fmt, ap); + + if (needed <= static_cast<int>(size) && needed >= 0) + { + return std::string(buf, static_cast<size_t>(needed)); + } + + size = (needed > 0) ? (needed+1) : (size*2); + dynamicbuf.resize(size); + buf = &dynamicbuf[0]; + } +} + +std::string StrUtils::Format(const char *fmt, ...) +{ + va_list ap; + va_start(ap, fmt); + std::string buf = VFormat(fmt, ap); + va_end(ap); + return buf; +} std::string StrUtils::Replace(const std::string &str, const std::string &oldStr, const std::string &newStr) { diff --git a/src/common/stringutils.h b/src/common/stringutils.h index c60bfb0..e80163a 100644 --- a/src/common/stringutils.h +++ b/src/common/stringutils.h @@ -31,11 +31,11 @@ namespace StrUtils { /** If given, \a ok is set to true/false on success/failure. Warning: To avoid unnecessary problems, *always* give full template qualifier e.g. ToString\<int\> */ template<class T> -std::string ToString(T value, bool *ok = NULL) +std::string ToString(T value, bool *ok = nullptr) { std::ostringstream s; s << value; - if (ok != NULL) + if (ok != nullptr) *ok = !s.fail(); return s.str(); } @@ -44,17 +44,20 @@ std::string ToString(T value, bool *ok = NULL) /** If given, \a ok is set to true/false on success/failure. Warning: To avoid unnecessary problems, *always* give full template qualifier e.g. FromString\<int\> */ template<class T> -T FromString(const std::string &str, bool *ok = NULL) +T FromString(const std::string &str, bool *ok = nullptr) { std::istringstream s; s.str(str); T value; s >> value; - if (ok != NULL) + if (ok != nullptr) *ok = !s.fail(); return value; } +//! Replacement for sprintf() +std::string Format(const char *fmt, ...); + //! Returns a string with every occurence of \a oldStr in \a str replaced to \a newStr std::string Replace(const std::string &str, const std::string &oldStr, const std::string &newStr); diff --git a/src/graphics/core/device.h b/src/graphics/core/device.h index 4c1189c..a896104 100644 --- a/src/graphics/core/device.h +++ b/src/graphics/core/device.h @@ -400,6 +400,9 @@ public: virtual void SetFillMode(FillMode mode) = 0; //! Returns the current fill mode virtual FillMode GetFillMode() = 0; + + //! Returns the pixels of the entire screen + virtual void* GetFrameBufferPixels()const = 0; }; diff --git a/src/graphics/core/vertex.h b/src/graphics/core/vertex.h index c3a657a..ca68352 100644 --- a/src/graphics/core/vertex.h +++ b/src/graphics/core/vertex.h @@ -82,7 +82,9 @@ struct VertexCol Math::Vector coord; Color color; - explicit VertexCol(Math::Vector aCoord = Math::Vector(), + VertexCol() = default; + + explicit VertexCol(Math::Vector aCoord, Color aColor = Color()) : coord(aCoord), color(aColor) {} diff --git a/src/graphics/engine/camera.cpp b/src/graphics/engine/camera.cpp index f0c379c..fedc70a 100644 --- a/src/graphics/engine/camera.cpp +++ b/src/graphics/engine/camera.cpp @@ -593,9 +593,6 @@ void CCamera::EffectFrame(const Event &event) dist = Math::Norm((dist - 100.f) / 100.0f); force *= 1.0f-dist; -#if _TEEN - force *= 2.0f; -#endif m_effectOffset *= force; if (m_effectProgress >= 1.0f) diff --git a/src/graphics/engine/engine.cpp b/src/graphics/engine/engine.cpp index 5cf7b23..e0861d2 100644 --- a/src/graphics/engine/engine.cpp +++ b/src/graphics/engine/engine.cpp @@ -19,6 +19,7 @@ #include "graphics/engine/engine.h" #include "app/app.h" +#include "app/gamedata.h" #include "common/image.h" #include "common/key.h" @@ -63,6 +64,7 @@ CEngine::CEngine(CApplication *app) m_planet = nullptr; m_sound = nullptr; m_terrain = nullptr; + m_pause = nullptr; m_showStats = false; @@ -80,7 +82,6 @@ CEngine::CEngine(CApplication *app) m_fogStart[1] = 0.75f; m_waterAddColor = Color(0.0f, 0.0f, 0.0f, 0.0f); - m_pause = false; m_render = true; m_movieLock = false; m_shadowVisible = true; @@ -179,6 +180,7 @@ CEngine::~CEngine() m_lightning = nullptr; m_planet = nullptr; m_terrain = nullptr; + m_pause = nullptr; GetSystemUtils()->DestroyTimeStamp(m_lastFrameTime); m_lastFrameTime = nullptr; @@ -252,6 +254,7 @@ bool CEngine::Create() m_cloud = new CCloud(this); m_lightning = new CLightning(this); m_planet = new CPlanet(this); + m_pause = new CPauseManager(); m_lightMan->SetDevice(m_device); m_particle->SetDevice(m_device); @@ -421,19 +424,25 @@ void CEngine::FrameUpdate() bool CEngine::WriteScreenShot(const std::string& fileName, int width, int height) { - // TODO write screenshot: not very important for now - GetLogger()->Trace("CEngine::WriteSceenShot(): stub!\n"); - return true; -} + void *pixels = m_device->GetFrameBufferPixels(); + CImage img({width,height}); -void CEngine::SetPause(bool pause) -{ - m_pause = pause; + img.SetDataPixels(pixels); + img.flipVertically(); + + if ( img.SavePNG(fileName.c_str()) ){ + GetLogger()->Info("Save SceenShot Saved Successfully!\n"); + return true; + } + else{ + GetLogger()->Error("%s!\n",img.GetError().c_str()); + return false; + } } bool CEngine::GetPause() { - return m_pause; + return m_pause->GetPause(); } void CEngine::SetMovieLock(bool lock) @@ -2249,33 +2258,12 @@ Texture CEngine::CreateTexture(const std::string& texName, const TextureCreatePa if (image == nullptr) { - bool loadedFromTexPack = false; - - std::string texPackName = m_app->GetTexPackFilePath(texName); - if (! texPackName.empty()) - { - if (img.Load(texPackName)) - { - loadedFromTexPack = true; - } - else - { - std::string error = img.GetError(); - GetLogger()->Error("Couldn't load texture '%s' from texpack: %s, blacklisting the texpack path\n", - texName.c_str(), error.c_str()); - m_texBlacklist.insert(texPackName); - } - } - - if (!loadedFromTexPack) + if (! img.Load(CGameData::GetInstancePointer()->GetFilePath(DIR_TEXTURE, texName))) { - if (! img.Load(m_app->GetDataFilePath(DIR_TEXTURE, texName))) - { - std::string error = img.GetError(); - GetLogger()->Error("Couldn't load texture '%s': %s, blacklisting\n", texName.c_str(), error.c_str()); - m_texBlacklist.insert(texName); - return Texture(); // invalid texture - } + std::string error = img.GetError(); + GetLogger()->Error("Couldn't load texture '%s': %s, blacklisting\n", texName.c_str(), error.c_str()); + m_texBlacklist.insert(texName); + return Texture(); // invalid texture } image = &img; @@ -2438,7 +2426,7 @@ bool CEngine::ChangeTextureColor(const std::string& texName, CImage img; - if (! img.Load(m_app->GetDataFilePath(DIR_TEXTURE, texName))) + if (! img.Load(CGameData::GetInstancePointer()->GetFilePath(DIR_TEXTURE, texName))) { std::string error = img.GetError(); GetLogger()->Error("Couldn't load texture '%s': %s, blacklisting\n", texName.c_str(), error.c_str()); diff --git a/src/graphics/engine/engine.h b/src/graphics/engine/engine.h index 5ecde8f..d56bf38 100644 --- a/src/graphics/engine/engine.h +++ b/src/graphics/engine/engine.h @@ -24,6 +24,7 @@ #include "app/system.h" +#include "app/pausemanager.h" #include "common/event.h" #include "common/singleton.h" @@ -734,11 +735,8 @@ public: bool WriteScreenShot(const std::string& fileName, int width, int height); - //@{ - //! Management of game pause mode - void SetPause(bool pause); + //! Get pause mode TEST_VIRTUAL bool GetPause(); - //@} //@{ //! Management of lock for the duration of movie sequence @@ -1288,6 +1286,7 @@ protected: CLightning* m_lightning; CPlanet* m_planet; CTerrain* m_terrain; + CPauseManager* m_pause; //! Last encountered error std::string m_error; @@ -1300,9 +1299,6 @@ protected: //! Whether to show stats (FPS, etc) bool m_showStats; std::string m_fpsText; - - //! Pause mode - bool m_pause; //! Rendering enabled? bool m_render; //! Lock for duration of movie? diff --git a/src/graphics/engine/modelmanager.cpp b/src/graphics/engine/modelmanager.cpp index abc8c6c..0c0fb98 100644 --- a/src/graphics/engine/modelmanager.cpp +++ b/src/graphics/engine/modelmanager.cpp @@ -1,6 +1,24 @@ +// * This file is part of the COLOBOT source code +// * Copyright (C) 2001-2008, Daniel ROUX & EPSITEC SA, www.epsitec.ch +// * Copyright (C) 2012-2014, Polish Portal of Colobot (PPC) +// * +// * 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://www.gnu.org/licenses/. + #include "graphics/engine/modelmanager.h" #include "app/app.h" +#include "app/gamedata.h" #include "common/logger.h" @@ -30,7 +48,7 @@ bool CModelManager::LoadModel(const std::string& fileName, bool mirrored) if (CApplication::GetInstance().IsDebugModeActive(DEBUG_MODELS)) modelFile.SetPrintDebugInfo(true); - std::string filePath = CApplication::GetInstance().GetDataFilePath(DIR_MODEL, fileName); + std::string filePath = CGameData::GetInstancePointer()->GetFilePath(DIR_MODEL, fileName); if (!modelFile.ReadModel(filePath)) { diff --git a/src/graphics/engine/modelmanager.h b/src/graphics/engine/modelmanager.h index 9d50b97..ee5fc27 100644 --- a/src/graphics/engine/modelmanager.h +++ b/src/graphics/engine/modelmanager.h @@ -1,3 +1,20 @@ +// * This file is part of the COLOBOT source code +// * Copyright (C) 2001-2008, Daniel ROUX & EPSITEC SA, www.epsitec.ch +// * Copyright (C) 2012-2014, Polish Portal of Colobot (PPC) +// * +// * 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://www.gnu.org/licenses/. + #pragma once #include "common/singleton.h" diff --git a/src/graphics/engine/terrain.cpp b/src/graphics/engine/terrain.cpp index 4b5384e..5f37cd8 100644 --- a/src/graphics/engine/terrain.cpp +++ b/src/graphics/engine/terrain.cpp @@ -19,6 +19,7 @@ #include "graphics/engine/terrain.h" #include "app/app.h" +#include "app/gamedata.h" #include "common/image.h" #include "common/logger.h" @@ -189,7 +190,7 @@ void CTerrain::AddMaterial(int id, const std::string& texName, const Math::Point bool CTerrain::LoadResources(const std::string& fileName) { CImage img; - std::string path = CApplication::GetInstance().GetDataFilePath(DIR_TEXTURE, fileName); + std::string path = CGameData::GetInstancePointer()->GetFilePath(DIR_TEXTURE, fileName); if (! img.Load(path)) { GetLogger()->Error("Cannot load resource file: '%s'\n", path.c_str()); @@ -286,7 +287,7 @@ bool CTerrain::LoadRelief(const std::string &fileName, float scaleRelief, m_scaleRelief = scaleRelief; CImage img; - std::string path = CApplication::GetInstance().GetDataFilePath(DIR_TEXTURE, fileName); + std::string path = CGameData::GetInstancePointer()->GetFilePath(DIR_TEXTURE, fileName); if (! img.Load(path)) { GetLogger()->Error("Could not load relief file: '%s'!\n", path.c_str()); @@ -331,6 +332,66 @@ bool CTerrain::LoadRelief(const std::string &fileName, float scaleRelief, return true; } +bool CTerrain::RandomizeRelief() +{ + // Perlin noise + // Based on Python implementation by Marek Rogalski (mafik) + // http://amt2014.pl/archiwum/perlin.py + + int size = (m_mosaicCount*m_brickCount)+1; + const int ilosc_oktaw = 6; + + float* oktawy[ilosc_oktaw]; + for(int i=0; i<ilosc_oktaw; i++) + { + int pxCount = static_cast<int>(pow(2, (i+1)*2)); + oktawy[i] = new float[pxCount]; + for(int j=0; j<pxCount; j++) + { + oktawy[i][j] = Math::Rand(); + } + } + + for(int y2=0; y2 < size; y2++) + { + float y = static_cast<float>(y2) / size; + for(int x2=0; x2 < size; x2++) + { + float x = static_cast<float>(x2) / size; + + float wart = 0; + for(int i=0; i<ilosc_oktaw; i++) + { + int rozmiar_oktawy = sqrt(static_cast<int>(pow(2, (i+1)*2))); + double xi, yi, a, b; + a = modf(x * (rozmiar_oktawy-1), &xi); + b = modf(y * (rozmiar_oktawy-1), &yi); + /*int xi = floor(x * (rozmiar_oktawy-1)); + int yi = floor(y * (rozmiar_oktawy-1)); + float a = (x * (rozmiar_oktawy-1)) - xi; + float b = (y * (rozmiar_oktawy-1)) - yi;*/ + //CLogger::GetInstancePointer()->Error("%f %f %f %f\n", xi, yi, a, b); + + float lg = oktawy[i][static_cast<int>(yi * rozmiar_oktawy + xi)]; + float pg = oktawy[i][static_cast<int>(yi * rozmiar_oktawy + xi + 1)]; + float ld = oktawy[i][static_cast<int>((yi+1) * rozmiar_oktawy + xi)]; + float pd = oktawy[i][static_cast<int>((yi+1) * rozmiar_oktawy + xi + 1)]; + //CLogger::GetInstancePointer()->Error("%f %f %f %f\n", lg, pg, ld, pd); + + float g = pg * a + lg * (1-a); + float d = pd * a + ld * (1-a); + float res = d * b + g * (1-b); + wart += res; + } + + wart /= ilosc_oktaw; + + m_relief[x2+y2*size] = wart * 255.0f; + } + } + return true; +} + bool CTerrain::AddReliefPoint(Math::Vector pos, float scaleRelief) { float dim = (m_mosaicCount*m_brickCount*m_brickSize)/2.0f; diff --git a/src/graphics/engine/terrain.h b/src/graphics/engine/terrain.h index e618691..75a8975 100644 --- a/src/graphics/engine/terrain.h +++ b/src/graphics/engine/terrain.h @@ -212,7 +212,7 @@ struct FlyingLimit * where relief data is specifically adjusted to level space to allow * construction of buildings. * - * Undergound resources can be supplied by loading them from image like relief data. + * Underground resources can be supplied by loading them from image like relief data. * * Terrain also specifies flying limits for player: one global level and possible * additional spherical restrictions. @@ -243,6 +243,8 @@ public: void FlushRelief(); //! Load relief from image bool LoadRelief(const std::string& fileName, float scaleRelief, bool adjustBorder); + //! Load ramdomized relief + bool RandomizeRelief(); //! Load resources from image bool LoadResources(const std::string& fileName); diff --git a/src/graphics/engine/text.cpp b/src/graphics/engine/text.cpp index ffd2eb2..8fd01b7 100644 --- a/src/graphics/engine/text.cpp +++ b/src/graphics/engine/text.cpp @@ -19,6 +19,7 @@ #include "graphics/engine/text.h" #include "app/app.h" +#include "app/gamedata.h" #include "common/image.h" #include "common/logger.h" @@ -333,7 +334,7 @@ float CText::GetStringWidth(std::string text, FontType font, float size) // Skip special chars for (char& c : text) { - if (c < 32) + if (c < 32 && c >= 0) c = ':'; } @@ -351,7 +352,7 @@ float CText::GetCharWidth(UTF8Char ch, FontType font, float size, float offset) if (font == FONT_BUTTON) return 0.0f; int width = 1; - if (ch.c1 < 32) + if (ch.c1 < 32 && ch.c1 >= 0) { if (ch.c1 == '\t') width = m_tabSize; @@ -646,7 +647,13 @@ void CText::DrawString(const std::string &text, std::vector<FontMetaChar>::itera DrawCharAndAdjustPos(ch, font, size, pos, color); - fmtIndex++; + // increment fmtIndex for each byte in multibyte character + if ( ch.c1 != 0 ) + fmtIndex++; + if ( ch.c2 != 0 ) + fmtIndex++; + if ( ch.c3 != 0 ) + fmtIndex++; } if (eol != 0) @@ -859,7 +866,7 @@ CachedFont* CText::GetOrOpenFont(FontType font, float size) return m_lastCachedFont; } - std::string path = CApplication::GetInstance().GetDataFilePath(DIR_FONT, mf->fileName); + std::string path = CGameData::GetInstancePointer()->GetFilePath(DIR_FONT, mf->fileName); m_lastCachedFont = new CachedFont(); m_lastCachedFont->font = TTF_OpenFont(path.c_str(), pointSize); diff --git a/src/graphics/opengl/gldevice.cpp b/src/graphics/opengl/gldevice.cpp index 9f64fab..b42f29d 100644 --- a/src/graphics/opengl/gldevice.cpp +++ b/src/graphics/opengl/gldevice.cpp @@ -1791,6 +1791,19 @@ FillMode CGLDevice::GetFillMode() return FILL_POINT; } +void* CGLDevice::GetFrameBufferPixels()const{ + + GLubyte* pixels = new GLubyte [4 * m_config.size.x * m_config.size.y]; + + glReadPixels(0, 0, m_config.size.x, m_config.size.y, GL_RGBA, GL_UNSIGNED_BYTE, pixels); + + unsigned int* p = static_cast<unsigned int*> ( static_cast<void*>(pixels) ); + + for (int i = 0; i < m_config.size.x * m_config.size.y; ++i) + p[i] |= 0xFF000000; + + return static_cast<void*>(p); +} } // namespace Gfx diff --git a/src/graphics/opengl/gldevice.h b/src/graphics/opengl/gldevice.h index c648161..267ee73 100644 --- a/src/graphics/opengl/gldevice.h +++ b/src/graphics/opengl/gldevice.h @@ -188,6 +188,8 @@ public: virtual void SetFillMode(FillMode mode) ; virtual FillMode GetFillMode(); + virtual void* GetFrameBufferPixels()const; + private: //! Updates internal modelview matrix void UpdateModelviewMatrix(); diff --git a/src/object/auto/auto.cpp b/src/object/auto/auto.cpp index 0aeaa0a..9e593a9 100644 --- a/src/object/auto/auto.cpp +++ b/src/object/auto/auto.cpp @@ -175,7 +175,6 @@ bool CAuto::CreateInterface(bool bSelect) Ui::CWindow* pw; Math::Point pos, dim, ddim; float ox, oy, sx, sy; - char name[100]; pw = static_cast<Ui::CWindow*>(m_interface->SearchControl(EVENT_WINDOW0)); if ( pw != nullptr ) @@ -195,6 +194,7 @@ bool CAuto::CreateInterface(bool bSelect) pw = static_cast<Ui::CWindow*>(m_interface->SearchControl(EVENT_WINDOW0)); if ( pw == 0 ) return false; + std::string name; m_object->GetTooltipName(name); pos.x = 0.0f; pos.y = 64.0f/480.0f; diff --git a/src/object/auto/autobase.cpp b/src/object/auto/autobase.cpp index 6d61bc2..af6c6e0 100644 --- a/src/object/auto/autobase.cpp +++ b/src/object/auto/autobase.cpp @@ -121,7 +121,6 @@ bool CAutoBase::EventProcess(const Event &event) CObject* pObj; Math::Vector pos, speed, vibCir, iPos; Math::Point dim, p; - Error err; float angle, dist, time, h, len, vSpeed; int i, max; @@ -313,50 +312,7 @@ begin: if ( event.type == EVENT_OBJECT_BTAKEOFF ) { - err = CheckCloseDoor(); - if ( err != ERR_OK ) - { - m_main->DisplayError(err, m_object); - return false; - } - - err = m_main->CheckEndMission(false); - if ( err != ERR_OK ) - { - m_main->DisplayError(err, m_object); - return false; - } - - FreezeCargo(true); // freeze whole cargo - m_main->SetMovieLock(true); // blocks everything until the end - m_main->DeselectAll(); - - newEvent.type = EVENT_UPDINTERFACE; - m_eventQueue->AddEvent(newEvent); - - m_camera->SetType(Gfx::CAM_TYPE_SCRIPT); - - pos = m_pos; - pos.x -= 110.0f; - m_terrain->AdjustToFloor(pos); - pos.y += 10.0f; - m_camera->SetScriptEye(pos); - m_posSound = pos; - - pos = m_object->GetPosition(0); - pos.y += 50.0f; - m_camera->SetScriptLookat(pos); - - m_engine->SetFocus(1.0f); - - m_soundChannel = m_sound->Play(SOUND_MANIP, m_posSound, 0.3f, 1.5f, true); - m_sound->AddEnvelope(m_soundChannel, 0.3f, 1.5f, BASE_DOOR_TIME2, SOPER_CONTINUE); - m_sound->AddEnvelope(m_soundChannel, 0.0f, 1.5f, 0.5f, SOPER_STOP); - - m_phase = ABP_CLOSE2; - m_progress = 0.0f; - m_speed = 1.0f/BASE_DOOR_TIME2; - return true; + return TakeOff(true); } if ( event.type != EVENT_FRAME ) return true; @@ -1400,11 +1356,7 @@ void CAutoBase::BeginTransit() } else { -#if _DEMO - m_bgBack = "back46b.png"; // paintings -#else m_bgBack = "back46.png"; // paintings -#endif } m_engine->SetFogStart(0.9f); // hardly any fog @@ -1444,3 +1396,56 @@ void CAutoBase::EndTransit() m_main->StartMusic(); } +Error CAutoBase::TakeOff(bool printMsg) +{ + + Event newEvent; + Math::Vector pos; + Error err; + + err = CheckCloseDoor(); + if ( err != ERR_OK ) + { + if(printMsg) m_main->DisplayError(err, m_object); + return err; + } + + err = m_main->CheckEndMission(false); + if ( err != ERR_OK ) + { + if(printMsg) m_main->DisplayError(err, m_object); + return err; + } + + FreezeCargo(true); // freeze whole cargo + m_main->SetMovieLock(true); // blocks everything until the end + m_main->DeselectAll(); + + newEvent.type = EVENT_UPDINTERFACE; + m_eventQueue->AddEvent(newEvent); + + m_camera->SetType(Gfx::CAM_TYPE_SCRIPT); + + pos = m_pos; + pos.x -= 110.0f; + m_terrain->AdjustToFloor(pos); + pos.y += 10.0f; + m_camera->SetScriptEye(pos); + m_posSound = pos; + + pos = m_object->GetPosition(0); + pos.y += 50.0f; + m_camera->SetScriptLookat(pos); + + m_engine->SetFocus(1.0f); + + m_soundChannel = m_sound->Play(SOUND_MANIP, m_posSound, 0.3f, 1.5f, true); + m_sound->AddEnvelope(m_soundChannel, 0.3f, 1.5f, BASE_DOOR_TIME2, SOPER_CONTINUE); + m_sound->AddEnvelope(m_soundChannel, 0.0f, 1.5f, 0.5f, SOPER_STOP); + + m_phase = ABP_CLOSE2; + m_progress = 0.0f; + m_speed = 1.0f/BASE_DOOR_TIME2; + return ERR_OK; +} + diff --git a/src/object/auto/autobase.h b/src/object/auto/autobase.h index 422f340..967e43d 100644 --- a/src/object/auto/autobase.h +++ b/src/object/auto/autobase.h @@ -77,6 +77,8 @@ public: Error GetError(); bool CreateInterface(bool bSelect); + + Error TakeOff(bool printMsg); protected: void UpdateInterface(); diff --git a/src/object/brain.cpp b/src/object/brain.cpp index 1b1565a..4bd8742 100644 --- a/src/object/brain.cpp +++ b/src/object/brain.cpp @@ -1238,7 +1238,6 @@ bool CBrain::CreateInterface(bool bSelect) Ui::CLabel* pl; Math::Point pos, dim, ddim; float ox, oy, sx, sy; - char name[100]; pw = static_cast< Ui::CWindow* >(m_interface->SearchControl(EVENT_WINDOW0)); if ( pw != 0 ) @@ -1259,13 +1258,14 @@ bool CBrain::CreateInterface(bool bSelect) pw = static_cast< Ui::CWindow* >(m_interface->SearchControl(EVENT_WINDOW0)); if ( pw == 0 ) return false; - m_object->GetTooltipName(name); + std::string tooltipLabel; + m_object->GetTooltipName(tooltipLabel); pos.x = 0.0f; pos.y = 64.0f/480.0f; ddim.x = 540.0f/640.0f; if ( !m_main->GetShowMap() ) ddim.x = 640.0f/640.0f; ddim.y = 16.0f/480.0f; - pw->CreateLabel(pos, ddim, 0, EVENT_LABEL0, name); + pw->CreateLabel(pos, ddim, 0, EVENT_LABEL0, tooltipLabel); dim.x = 33.0f/640.0f; dim.y = 33.0f/480.0f; @@ -1674,8 +1674,10 @@ bool CBrain::CreateInterface(bool bSelect) pos.y = oy+sy*1.2f; ddim.x = dim.x*2.2f; ddim.y = dim.y*0.4f; - GetResource(RES_TEXT, RT_INTERFACE_REC, name); - pl = pw->CreateLabel(pos, ddim, 0, EVENT_LABEL1, name); + + std::string recordLabel; + GetResource(RES_TEXT, RT_INTERFACE_REC, recordLabel); + pl = pw->CreateLabel(pos, ddim, 0, EVENT_LABEL1, recordLabel); pl->SetFontSize(9.0f); pos.x = ox+sx*7.0f; @@ -1787,9 +1789,6 @@ bool CBrain::CreateInterface(bool bSelect) pos.x = ox+sx*13.4f; pos.y = oy+sy*0; -#if _TEEN - pw->CreateButton(pos, dim, 9, EVENT_OBJECT_RESET); -#else if ( m_object->GetTrainer() ) // Training? { pw->CreateButton(pos, dim, 9, EVENT_OBJECT_RESET); @@ -1798,7 +1797,6 @@ bool CBrain::CreateInterface(bool bSelect) { pw->CreateButton(pos, dim, 10, EVENT_OBJECT_DESELECT); } -#endif if ( type == OBJECT_MOBILEfa || type == OBJECT_MOBILEta || @@ -2457,17 +2455,10 @@ void CBrain::UpdateScript(Ui::CWindow *pw) char name[100]; char title[100]; int i; - bool bSoluce; pl = static_cast< Ui::CList* >(pw->SearchControl(EVENT_OBJECT_PROGLIST)); if ( pl == 0 ) return; -#if _SCHOOL - bSoluce = m_main->GetSoluce4(); -#else - bSoluce = true; -#endif - for ( i=0 ; i<BRAINMAXSCRIPT ; i++ ) { sprintf(name, "%d", i+1); @@ -2475,10 +2466,6 @@ void CBrain::UpdateScript(Ui::CWindow *pw) if ( m_script[i] != 0 ) { m_script[i]->GetTitle(title); - if ( !bSoluce && i == 3 ) - { - title[0] = 0; - } if ( title[0] != 0 ) { sprintf(name, "%d: %s", i+1, title); @@ -2488,11 +2475,6 @@ void CBrain::UpdateScript(Ui::CWindow *pw) pl->SetItemName(i, name); } - if ( !bSoluce ) - { - pl->SetEnable(3, false); - } - pl->SetSelect(m_selScript); pl->ShowSelect(true); } diff --git a/src/object/object.cpp b/src/object/object.cpp index 5a709e6..3c225d0 100644 --- a/src/object/object.cpp +++ b/src/object/object.cpp @@ -276,6 +276,7 @@ CObject::CObject() m_lastVirusParticle = 0.0f; m_totalDesectList = 0; m_bLock = false; + m_bIgnoreBuildCheck = false; m_bExplo = false; m_bCargo = false; m_bBurn = false; @@ -6781,7 +6782,7 @@ float CObject::GetParam() // Management of the mode "blocked" of an object. // For example, a cube of titanium is blocked while it is used to make something, -//or a vehicle is blocked as its construction is not finished. +// or a vehicle is blocked as its construction is not finished. void CObject::SetLock(bool bLock) { @@ -6793,6 +6794,18 @@ bool CObject::GetLock() return m_bLock; } +// Ignore checks in build() function + +void CObject::SetIgnoreBuildCheck(bool bIgnoreBuildCheck) +{ + m_bIgnoreBuildCheck = bIgnoreBuildCheck; +} + +bool CObject::GetIgnoreBuildCheck() +{ + return m_bIgnoreBuildCheck; +} + // Management of the mode "current explosion" of an object. // An object in this mode is not saving. @@ -7263,10 +7276,10 @@ int CObject::GetDefRank() // Getes the object name for the tooltip. -bool CObject::GetTooltipName(char* name) +bool CObject::GetTooltipName(std::string& name) { GetResource(RES_OBJECT, m_type, name); - return ( name[0] != 0 ); + return !name.empty(); } @@ -7390,3 +7403,70 @@ void CObject::SetTraceWidth(float width) mv->SetTraceWidth(width); } +DriveType CObject::GetDriveFromObject(ObjectType type) +{ + switch(type) { + case OBJECT_MOBILEwt: + case OBJECT_MOBILEwa: + case OBJECT_MOBILEwc: + case OBJECT_MOBILEwi: + case OBJECT_MOBILEws: + return DRIVE_WHEELED; + + case OBJECT_MOBILEtt: + case OBJECT_MOBILEta: + case OBJECT_MOBILEtc: + case OBJECT_MOBILEti: + case OBJECT_MOBILEts: + return DRIVE_TRACKED; + + case OBJECT_MOBILEft: + case OBJECT_MOBILEfa: + case OBJECT_MOBILEfc: + case OBJECT_MOBILEfi: + case OBJECT_MOBILEfs: + return DRIVE_WINGED; + + case OBJECT_MOBILEit: + case OBJECT_MOBILEia: + case OBJECT_MOBILEic: + case OBJECT_MOBILEii: + case OBJECT_MOBILEis: + return DRIVE_LEGGED; + + default: + return DRIVE_OTHER; + } +} + +ToolType CObject::GetToolFromObject(ObjectType type) +{ + switch(type) { + case OBJECT_MOBILEwa: + case OBJECT_MOBILEta: + case OBJECT_MOBILEfa: + case OBJECT_MOBILEia: + return TOOL_GRABBER; + + case OBJECT_MOBILEws: + case OBJECT_MOBILEts: + case OBJECT_MOBILEfs: + case OBJECT_MOBILEis: + return TOOL_SNIFFER; + + case OBJECT_MOBILEwc: + case OBJECT_MOBILEtc: + case OBJECT_MOBILEfc: + case OBJECT_MOBILEic: + return TOOL_SHOOTER; + + case OBJECT_MOBILEwi: + case OBJECT_MOBILEti: + case OBJECT_MOBILEfi: + case OBJECT_MOBILEii: + return TOOL_ORGASHOOTER; + + default: + return TOOL_OTHER; + } +} diff --git a/src/object/object.h b/src/object/object.h index e8b83d9..0e469f2 100644 --- a/src/object/object.h +++ b/src/object/object.h @@ -47,245 +47,207 @@ enum ObjectType { OBJECT_NULL = 0, //! < object destroyed OBJECT_FIX = 1, //! < stationary scenery - OBJECT_PORTICO = 2, //! < gantry - OBJECT_BASE = 3, //! < great main base - OBJECT_DERRICK = 4, //! < derrick set - OBJECT_FACTORY = 5, //! < factory set - OBJECT_STATION = 6, //! < recharging station - OBJECT_CONVERT = 7, //! < converter station - OBJECT_REPAIR = 8, //! < reparation - OBJECT_TOWER = 9, //! < defense tower - OBJECT_NEST = 10, //! < nest - OBJECT_RESEARCH = 11, //! < research center - OBJECT_RADAR = 12, //! < radar - OBJECT_ENERGY = 13, //! < energy factory - OBJECT_LABO = 14, //! < analytical laboratory for insect - OBJECT_NUCLEAR = 15, //! < nuclear power plant - OBJECT_START = 16, //! < starting - OBJECT_END = 17, //! < finish - OBJECT_INFO = 18, //! < information terminal - OBJECT_PARA = 19, //! < lightning conductor - OBJECT_TARGET1 = 20, //! < gate target - OBJECT_TARGET2 = 21, //! < center target - OBJECT_SAFE = 22, //! < safe - OBJECT_HUSTON = 23, //! < control centre - OBJECT_DESTROYER = 24, //! < destroyer - OBJECT_FRET = 30, //! < transportable - OBJECT_STONE = 31, //! < stone - OBJECT_URANIUM = 32, //! < uranium - OBJECT_METAL = 33, //! < metal - OBJECT_POWER = 34, //! < normal battery - OBJECT_ATOMIC = 35, //! < atomic battery - OBJECT_BULLET = 36, //! < bullet - OBJECT_BBOX = 37, //! < black-box - OBJECT_TNT = 38, //! < box of TNT - OBJECT_SCRAP1 = 40, //! < metal waste - OBJECT_SCRAP2 = 41, //! < metal waste - OBJECT_SCRAP3 = 42, //! < metal waste - OBJECT_SCRAP4 = 43, //! < plastic waste - OBJECT_SCRAP5 = 44, //! < plastic waste - OBJECT_MARKPOWER = 50, //! < mark underground energy source - OBJECT_MARKSTONE = 51, //! < mark underground ore - OBJECT_MARKURANIUM = 52, //! < mark underground uranium - OBJECT_MARKKEYa = 53, //! < mark underground key - OBJECT_MARKKEYb = 54, //! < mark underground key - OBJECT_MARKKEYc = 55, //! < mark underground key - OBJECT_MARKKEYd = 56, //! < mark underground key - OBJECT_BOMB = 60, //! < bomb - OBJECT_WINFIRE = 61, //! < fireworks - OBJECT_SHOW = 62, //! < shows a place - OBJECT_BAG = 63, //! < survival bag - OBJECT_PLANT0 = 70, //! < plant 0 - OBJECT_PLANT1 = 71, //! < plant 1 - OBJECT_PLANT2 = 72, //! < plant 2 - OBJECT_PLANT3 = 73, //! < plant 3 - OBJECT_PLANT4 = 74, //! < plant 4 - OBJECT_PLANT5 = 75, //! < plant 5 - OBJECT_PLANT6 = 76, //! < plant 6 - OBJECT_PLANT7 = 77, //! < plant 7 - OBJECT_PLANT8 = 78, //! < plant 8 - OBJECT_PLANT9 = 79, //! < plant 9 - OBJECT_PLANT10 = 80, //! < plant 10 - OBJECT_PLANT11 = 81, //! < plant 11 - OBJECT_PLANT12 = 82, //! < plant 12 - OBJECT_PLANT13 = 83, //! < plant 13 - OBJECT_PLANT14 = 84, //! < plant 14 - OBJECT_PLANT15 = 85, //! < plant 15 - OBJECT_PLANT16 = 86, //! < plant 16 - OBJECT_PLANT17 = 87, //! < plant 17 - OBJECT_PLANT18 = 88, //! < plant 18 - OBJECT_PLANT19 = 89, //! < plant 19 - OBJECT_TREE0 = 90, //! < tree 0 - OBJECT_TREE1 = 91, //! < tree 1 - OBJECT_TREE2 = 92, //! < tree 2 - OBJECT_TREE3 = 93, //! < tree 3 - OBJECT_TREE4 = 94, //! < tree 4 - OBJECT_TREE5 = 95, //! < tree 5 - OBJECT_TREE6 = 96, //! < tree 6 - OBJECT_TREE7 = 97, //! < tree 7 - OBJECT_TREE8 = 98, //! < tree 8 - OBJECT_TREE9 = 99, //! < tree 9 - OBJECT_MOBILEwt = 100, //! < wheel-trainer - OBJECT_MOBILEtt = 101, //! < track-trainer - OBJECT_MOBILEft = 102, //! < fly-trainer - OBJECT_MOBILEit = 103, //! < insect-trainer - OBJECT_MOBILEwa = 110, //! < wheel-arm - OBJECT_MOBILEta = 111, //! < track-arm - OBJECT_MOBILEfa = 112, //! < fly-arm - OBJECT_MOBILEia = 113, //! < insect-arm - OBJECT_MOBILEwc = 120, //! < wheel-cannon - OBJECT_MOBILEtc = 121, //! < track-cannon - OBJECT_MOBILEfc = 122, //! < fly-cannon - OBJECT_MOBILEic = 123, //! < insect-cannon - OBJECT_MOBILEwi = 130, //! < wheel-insect-cannon - OBJECT_MOBILEti = 131, //! < track-insect-cannon - OBJECT_MOBILEfi = 132, //! < fly-insect-cannon - OBJECT_MOBILEii = 133, //! < insect-insect-cannon - OBJECT_MOBILEws = 140, //! < wheel-search - OBJECT_MOBILEts = 141, //! < track-search - OBJECT_MOBILEfs = 142, //! < fly-search - OBJECT_MOBILEis = 143, //! < insect-search - OBJECT_MOBILErt = 200, //! < roller-terraform - OBJECT_MOBILErc = 201, //! < roller-canon - OBJECT_MOBILErr = 202, //! < roller-recover - OBJECT_MOBILErs = 203, //! < roller-shield - OBJECT_MOBILEsa = 210, //! < submarine - OBJECT_MOBILEtg = 211, //! < training target - OBJECT_MOBILEdr = 212, //! < robot drawing - OBJECT_CONTROLLER = 213, //! < mission controller - OBJECT_WAYPOINT = 250, //! < waypoint - OBJECT_FLAGb = 260, //! < blue flag - OBJECT_FLAGr = 261, //! < red flag - OBJECT_FLAGg = 262, //! < green flag - OBJECT_FLAGy = 263, //! < yellow flag - OBJECT_FLAGv = 264, //! < violet flag - OBJECT_KEYa = 270, //! < key a - OBJECT_KEYb = 271, //! < key b - OBJECT_KEYc = 272, //! < key c - OBJECT_KEYd = 273, //! < key d - OBJECT_HUMAN = 300, //! < human - OBJECT_TOTO = 301, //! < toto - OBJECT_TECH = 302, //! < technician - OBJECT_BARRIER0 = 400, //! < barrier - OBJECT_BARRIER1 = 401, //! < barrier - OBJECT_BARRIER2 = 402, //! < barrier - OBJECT_BARRIER3 = 403, //! < barrier - OBJECT_BARRIER4 = 404, //! < barrier - OBJECT_MOTHER = 500, //! < insect queen - OBJECT_EGG = 501, //! < egg - OBJECT_ANT = 502, //! < ant - OBJECT_SPIDER = 503, //! < spider - OBJECT_BEE = 504, //! < bee - OBJECT_WORM = 505, //! < worm - OBJECT_RUINmobilew1 = 600, //! < ruin 1 - OBJECT_RUINmobilew2 = 601, //! < ruin 1 - OBJECT_RUINmobilet1 = 602, //! < ruin 2 - OBJECT_RUINmobilet2 = 603, //! < ruin 2 - OBJECT_RUINmobiler1 = 604, //! < ruin 3 - OBJECT_RUINmobiler2 = 605, //! < ruin 3 - OBJECT_RUINfactory = 606, //! < ruin 4 - OBJECT_RUINdoor = 607, //! < ruin 5 - OBJECT_RUINsupport = 608, //! < ruin 6 - OBJECT_RUINradar = 609, //! < ruin 7 - OBJECT_RUINconvert = 610, //! < ruin 8 - OBJECT_RUINbase = 611, //! < ruin 9 - OBJECT_RUINhead = 612, //! < ruin 10 - OBJECT_TEEN0 = 620, //! < toy - OBJECT_TEEN1 = 621, //! < toy - OBJECT_TEEN2 = 622, //! < toy - OBJECT_TEEN3 = 623, //! < toy - OBJECT_TEEN4 = 624, //! < toy - OBJECT_TEEN5 = 625, //! < toy - OBJECT_TEEN6 = 626, //! < toy - OBJECT_TEEN7 = 627, //! < toy - OBJECT_TEEN8 = 628, //! < toy - OBJECT_TEEN9 = 629, //! < toy - OBJECT_TEEN10 = 630, //! < toy - OBJECT_TEEN11 = 631, //! < toy - OBJECT_TEEN12 = 632, //! < toy - OBJECT_TEEN13 = 633, //! < toy - OBJECT_TEEN14 = 634, //! < toy - OBJECT_TEEN15 = 635, //! < toy - OBJECT_TEEN16 = 636, //! < toy - OBJECT_TEEN17 = 637, //! < toy - OBJECT_TEEN18 = 638, //! < toy - OBJECT_TEEN19 = 639, //! < toy - OBJECT_TEEN20 = 640, //! < toy - OBJECT_TEEN21 = 641, //! < toy - OBJECT_TEEN22 = 642, //! < toy - OBJECT_TEEN23 = 643, //! < toy - OBJECT_TEEN24 = 644, //! < toy - OBJECT_TEEN25 = 645, //! < toy - OBJECT_TEEN26 = 646, //! < toy - OBJECT_TEEN27 = 647, //! < toy - OBJECT_TEEN28 = 648, //! < toy - OBJECT_TEEN29 = 649, //! < toy - OBJECT_TEEN30 = 650, //! < toy - OBJECT_TEEN31 = 651, //! < toy - OBJECT_TEEN32 = 652, //! < toy - OBJECT_TEEN33 = 653, //! < toy - OBJECT_TEEN34 = 654, //! < toy - OBJECT_TEEN35 = 655, //! < toy - OBJECT_TEEN36 = 656, //! < toy - OBJECT_TEEN37 = 657, //! < toy - OBJECT_TEEN38 = 658, //! < toy - OBJECT_TEEN39 = 659, //! < toy - OBJECT_TEEN40 = 660, //! < toy - OBJECT_TEEN41 = 661, //! < toy - OBJECT_TEEN42 = 662, //! < toy - OBJECT_TEEN43 = 663, //! < toy - OBJECT_TEEN44 = 664, //! < toy - OBJECT_TEEN45 = 665, //! < toy - OBJECT_TEEN46 = 666, //! < toy - OBJECT_TEEN47 = 667, //! < toy - OBJECT_TEEN48 = 668, //! < toy - OBJECT_TEEN49 = 669, //! < toy - OBJECT_QUARTZ0 = 700, //! < crystal 0 - OBJECT_QUARTZ1 = 701, //! < crystal 1 - OBJECT_QUARTZ2 = 702, //! < crystal 2 - OBJECT_QUARTZ3 = 703, //! < crystal 3 - OBJECT_QUARTZ4 = 704, //! < crystal 4 - OBJECT_QUARTZ5 = 705, //! < crystal 5 - OBJECT_QUARTZ6 = 706, //! < crystal 6 - OBJECT_QUARTZ7 = 707, //! < crystal 7 - OBJECT_QUARTZ8 = 708, //! < crystal 8 - OBJECT_QUARTZ9 = 709, //! < crystal 9 - OBJECT_ROOT0 = 710, //! < root 0 - OBJECT_ROOT1 = 711, //! < root 1 - OBJECT_ROOT2 = 712, //! < root 2 - OBJECT_ROOT3 = 713, //! < root 3 - OBJECT_ROOT4 = 714, //! < root 4 - OBJECT_ROOT5 = 715, //! < root 5 - OBJECT_ROOT6 = 716, //! < root 6 - OBJECT_ROOT7 = 717, //! < root 7 - OBJECT_ROOT8 = 718, //! < root 8 - OBJECT_ROOT9 = 719, //! < root 9 - OBJECT_SEAWEED0 = 720, //! < seaweed 0 - OBJECT_SEAWEED1 = 721, //! < seaweed 1 - OBJECT_SEAWEED2 = 722, //! < seaweed 2 - OBJECT_SEAWEED3 = 723, //! < seaweed 3 - OBJECT_SEAWEED4 = 724, //! < seaweed 4 - OBJECT_SEAWEED5 = 725, //! < seaweed 5 - OBJECT_SEAWEED6 = 726, //! < seaweed 6 - OBJECT_SEAWEED7 = 727, //! < seaweed 7 - OBJECT_SEAWEED8 = 728, //! < seaweed 8 - OBJECT_SEAWEED9 = 729, //! < seaweed 9 - OBJECT_MUSHROOM0 = 730, //! < mushroom 0 - OBJECT_MUSHROOM1 = 731, //! < mushroom 1 - OBJECT_MUSHROOM2 = 732, //! < mushroom 2 - OBJECT_MUSHROOM3 = 733, //! < mushroom 3 - OBJECT_MUSHROOM4 = 734, //! < mushroom 4 - OBJECT_MUSHROOM5 = 735, //! < mushroom 5 - OBJECT_MUSHROOM6 = 736, //! < mushroom 6 - OBJECT_MUSHROOM7 = 737, //! < mushroom 7 - OBJECT_MUSHROOM8 = 738, //! < mushroom 8 - OBJECT_MUSHROOM9 = 739, //! < mushroom 9 - OBJECT_APOLLO1 = 900, //! < apollo lem - OBJECT_APOLLO2 = 901, //! < apollo jeep - OBJECT_APOLLO3 = 902, //! < apollo flag - OBJECT_APOLLO4 = 903, //! < apollo module - OBJECT_APOLLO5 = 904, //! < apollo antenna - OBJECT_HOME1 = 910, //! < home 1 + OBJECT_PORTICO = 2, //! < Portico + OBJECT_BASE = 3, //! < SpaceShip + OBJECT_DERRICK = 4, //! < Derrick + OBJECT_FACTORY = 5, //! < BotFactory + OBJECT_STATION = 6, //! < PowerStation + OBJECT_CONVERT = 7, //! < Converter + OBJECT_REPAIR = 8, //! < RepairStation + OBJECT_TOWER = 9, //! < DefenseTower + OBJECT_NEST = 10, //! < AlienNest + OBJECT_RESEARCH = 11, //! < ResearchCenter + OBJECT_RADAR = 12, //! < RadarStation + OBJECT_ENERGY = 13, //! < PowerPlant + OBJECT_LABO = 14, //! < AutoLab + OBJECT_NUCLEAR = 15, //! < NuclearPlant + OBJECT_START = 16, //! < StartArea + OBJECT_END = 17, //! < EndArea + OBJECT_INFO = 18, //! < ExchangePost + OBJECT_PARA = 19, //! < PowerCaptor + OBJECT_TARGET1 = 20, //! < Target1 (gate) + OBJECT_TARGET2 = 21, //! < Target2 (center) + OBJECT_SAFE = 22, //! < Vault + OBJECT_HUSTON = 23, //! < Houston + OBJECT_DESTROYER = 24, //! < Destroyer + OBJECT_FRET = 30, //! < transportable (unused) + OBJECT_STONE = 31, //! < TitaniumOre + OBJECT_URANIUM = 32, //! < UraniumOre + OBJECT_METAL = 33, //! < Titanium + OBJECT_POWER = 34, //! < PowerCell + OBJECT_ATOMIC = 35, //! < NuclearCell + OBJECT_BULLET = 36, //! < OrgaMatter + OBJECT_BBOX = 37, //! < BlackBox + OBJECT_TNT = 38, //! < TNT + OBJECT_SCRAP1 = 40, //! < Scrap1 (metal) + OBJECT_SCRAP2 = 41, //! < Scrap2 (metal) + OBJECT_SCRAP3 = 42, //! < Scrap3 (metal) + OBJECT_SCRAP4 = 43, //! < Scrap4 (plastic) + OBJECT_SCRAP5 = 44, //! < Scrap5 (plastic) + OBJECT_MARKPOWER = 50, //! < PowerSpot + OBJECT_MARKSTONE = 51, //! < TitaniumSpot + OBJECT_MARKURANIUM = 52, //! < UraniumSpot + OBJECT_MARKKEYa = 53, //! < KeyASpot + OBJECT_MARKKEYb = 54, //! < KeyBSpot + OBJECT_MARKKEYc = 55, //! < KeyCSpot + OBJECT_MARKKEYd = 56, //! < KeyDSpot + OBJECT_BOMB = 60, //! < Mine + OBJECT_WINFIRE = 61, //! < Firework + OBJECT_SHOW = 62, //! < arrow above object (Visit) + OBJECT_BAG = 63, //! < Bag + OBJECT_PLANT0 = 70, //! < Greenery0 + OBJECT_PLANT1 = 71, //! < Greenery1 + OBJECT_PLANT2 = 72, //! < Greenery2 + OBJECT_PLANT3 = 73, //! < Greenery3 + OBJECT_PLANT4 = 74, //! < Greenery4 + OBJECT_PLANT5 = 75, //! < Greenery5 + OBJECT_PLANT6 = 76, //! < Greenery6 + OBJECT_PLANT7 = 77, //! < Greenery7 + OBJECT_PLANT8 = 78, //! < Greenery8 + OBJECT_PLANT9 = 79, //! < Greenery9 + OBJECT_PLANT10 = 80, //! < Greenery10 + OBJECT_PLANT11 = 81, //! < Greenery11 + OBJECT_PLANT12 = 82, //! < Greenery12 + OBJECT_PLANT13 = 83, //! < Greenery13 + OBJECT_PLANT14 = 84, //! < Greenery14 + OBJECT_PLANT15 = 85, //! < Greenery15 + OBJECT_PLANT16 = 86, //! < Greenery16 + OBJECT_PLANT17 = 87, //! < Greenery17 + OBJECT_PLANT18 = 88, //! < Greenery18 + OBJECT_PLANT19 = 89, //! < Greenery19 + OBJECT_TREE0 = 90, //! < Tree0 + OBJECT_TREE1 = 91, //! < Tree1 + OBJECT_TREE2 = 92, //! < Tree2 + OBJECT_TREE3 = 93, //! < Tree3 + OBJECT_TREE4 = 94, //! < Tree4 + OBJECT_TREE5 = 95, //! < Tree5 + OBJECT_MOBILEwt = 100, //! < PracticeBot + OBJECT_MOBILEtt = 101, //! < track-trainer (unused) + OBJECT_MOBILEft = 102, //! < fly-trainer (unused) + OBJECT_MOBILEit = 103, //! < insect-trainer (unused) + OBJECT_MOBILEwa = 110, //! < WheeledGrabber + OBJECT_MOBILEta = 111, //! < TrackedGrabber + OBJECT_MOBILEfa = 112, //! < WingedGrabber + OBJECT_MOBILEia = 113, //! < LeggedGrabber + OBJECT_MOBILEwc = 120, //! < WheeledShooter + OBJECT_MOBILEtc = 121, //! < TrackedShooter + OBJECT_MOBILEfc = 122, //! < WingedShooter + OBJECT_MOBILEic = 123, //! < LeggedShooter + OBJECT_MOBILEwi = 130, //! < WheeledOrgaShooter + OBJECT_MOBILEti = 131, //! < TrackedOrgaShooter + OBJECT_MOBILEfi = 132, //! < WingedOrgaShooter + OBJECT_MOBILEii = 133, //! < LeggedOrgaShooter + OBJECT_MOBILEws = 140, //! < WheeledSniffer + OBJECT_MOBILEts = 141, //! < TrackedSniffer + OBJECT_MOBILEfs = 142, //! < WingedSniffer + OBJECT_MOBILEis = 143, //! < LeggedSniffer + OBJECT_MOBILErt = 200, //! < Thumper + OBJECT_MOBILErc = 201, //! < PhazerShooter + OBJECT_MOBILErr = 202, //! < Recycler + OBJECT_MOBILErs = 203, //! < Shielder + OBJECT_MOBILEsa = 210, //! < Subber + OBJECT_MOBILEtg = 211, //! < TargetBot + OBJECT_MOBILEdr = 212, //! < Scribbler + OBJECT_CONTROLLER = 213, //! < MissionController + OBJECT_WAYPOINT = 250, //! < WayPoint + OBJECT_FLAGb = 260, //! < BlueFlag + OBJECT_FLAGr = 261, //! < RedFlag + OBJECT_FLAGg = 262, //! < GreenFlag + OBJECT_FLAGy = 263, //! < YellowFlag + OBJECT_FLAGv = 264, //! < VioletFlag + OBJECT_KEYa = 270, //! < KeyA + OBJECT_KEYb = 271, //! < KeyB + OBJECT_KEYc = 272, //! < KeyC + OBJECT_KEYd = 273, //! < KeyD + OBJECT_HUMAN = 300, //! < Me + OBJECT_TOTO = 301, //! < Robby (toto) + OBJECT_TECH = 302, //! < Tech + OBJECT_BARRIER0 = 400, //! < Barrier0 + OBJECT_BARRIER1 = 401, //! < Barrier1 + OBJECT_BARRIER2 = 402, //! < Barrier2 + OBJECT_BARRIER3 = 403, //! < Barrier3 + OBJECT_MOTHER = 500, //! < AlienQueen + OBJECT_EGG = 501, //! < AlienEgg + OBJECT_ANT = 502, //! < AlienAnt + OBJECT_SPIDER = 503, //! < AlienSpider + OBJECT_BEE = 504, //! < AlienWasp + OBJECT_WORM = 505, //! < AlienWorm + OBJECT_RUINmobilew1 = 600, //! < WreckBotw1 + OBJECT_RUINmobilew2 = 601, //! < WreckBotw2 + OBJECT_RUINmobilet1 = 602, //! < WreckBott1 + OBJECT_RUINmobilet2 = 603, //! < WreckBott2 + OBJECT_RUINmobiler1 = 604, //! < WreckBotr1 + OBJECT_RUINmobiler2 = 605, //! < WreckBotr2 + OBJECT_RUINfactory = 606, //! < RuinBotFactory + OBJECT_RUINdoor = 607, //! < RuinDoor + OBJECT_RUINsupport = 608, //! < RuinSupport + OBJECT_RUINradar = 609, //! < RuinRadar + OBJECT_RUINconvert = 610, //! < RuinConvert + OBJECT_RUINbase = 611, //! < RuinBaseCamp + OBJECT_RUINhead = 612, //! < RuinHeadCamp + OBJECT_TEEN0 = 620, //! < Teen0 + OBJECT_TEEN1 = 621, //! < Teen1 + OBJECT_TEEN2 = 622, //! < Teen2 + OBJECT_TEEN3 = 623, //! < Teen3 + OBJECT_TEEN4 = 624, //! < Teen4 + OBJECT_TEEN5 = 625, //! < Teen5 + OBJECT_TEEN6 = 626, //! < Teen6 + OBJECT_TEEN7 = 627, //! < Teen7 + OBJECT_TEEN8 = 628, //! < Teen8 + OBJECT_TEEN9 = 629, //! < Teen9 + OBJECT_TEEN10 = 630, //! < Teen10 + OBJECT_TEEN11 = 631, //! < Teen11 + OBJECT_TEEN12 = 632, //! < Teen12 + OBJECT_TEEN13 = 633, //! < Teen13 + OBJECT_TEEN14 = 634, //! < Teen14 + OBJECT_TEEN15 = 635, //! < Teen15 + OBJECT_TEEN16 = 636, //! < Teen16 + OBJECT_TEEN17 = 637, //! < Teen17 + OBJECT_TEEN18 = 638, //! < Teen18 + OBJECT_TEEN19 = 639, //! < Teen19 + OBJECT_TEEN20 = 640, //! < Teen20 + OBJECT_TEEN21 = 641, //! < Teen21 + OBJECT_TEEN22 = 642, //! < Teen22 + OBJECT_TEEN23 = 643, //! < Teen23 + OBJECT_TEEN24 = 644, //! < Teen24 + OBJECT_TEEN25 = 645, //! < Teen25 + OBJECT_TEEN26 = 646, //! < Teen26 + OBJECT_TEEN27 = 647, //! < Teen27 + OBJECT_TEEN28 = 648, //! < Teen28 + OBJECT_TEEN29 = 649, //! < Teen29 + OBJECT_TEEN30 = 650, //! < Teen30 + OBJECT_TEEN31 = 651, //! < Teen31 + OBJECT_TEEN32 = 652, //! < Teen32 + OBJECT_TEEN33 = 653, //! < Teen33 + OBJECT_TEEN34 = 654, //! < Stone (Teen34) + OBJECT_TEEN35 = 655, //! < Teen35 + OBJECT_TEEN36 = 656, //! < Teen36 + OBJECT_TEEN37 = 657, //! < Teen37 + OBJECT_TEEN38 = 658, //! < Teen38 + OBJECT_TEEN39 = 659, //! < Teen39 + OBJECT_TEEN40 = 660, //! < Teen40 + OBJECT_TEEN41 = 661, //! < Teen41 + OBJECT_TEEN42 = 662, //! < Teen42 + OBJECT_TEEN43 = 663, //! < Teen43 + OBJECT_TEEN44 = 664, //! < Teen44 + OBJECT_QUARTZ0 = 700, //! < Quartz0 + OBJECT_QUARTZ1 = 701, //! < Quartz1 + OBJECT_QUARTZ2 = 702, //! < Quartz2 + OBJECT_QUARTZ3 = 703, //! < Quartz3 + OBJECT_ROOT0 = 710, //! < MegaStalk0 + OBJECT_ROOT1 = 711, //! < MegaStalk1 + OBJECT_ROOT2 = 712, //! < MegaStalk2 + OBJECT_ROOT3 = 713, //! < MegaStalk3 + OBJECT_ROOT4 = 714, //! < MegaStalk4 + OBJECT_ROOT5 = 715, //! < MegaStalk5 + OBJECT_MUSHROOM1 = 731, //! < Mushroom1 + OBJECT_MUSHROOM2 = 732, //! < Mushroom2 + OBJECT_APOLLO1 = 900, //! < ApolloLEM + OBJECT_APOLLO2 = 901, //! < ApolloJeep + OBJECT_APOLLO3 = 902, //! < ApolloFlag + OBJECT_APOLLO4 = 903, //! < ApolloModule + OBJECT_APOLLO5 = 904, //! < ApolloAntenna + OBJECT_HOME1 = 910, //! < Home OBJECT_MAX = 1000 //! < number of values }; @@ -311,6 +273,24 @@ enum ObjectMaterial OM_MINERAL = 5, // stone }; +enum DriveType +{ + DRIVE_OTHER = 0, + DRIVE_WHEELED, + DRIVE_TRACKED, + DRIVE_WINGED, + DRIVE_LEGGED, +}; + +enum ToolType +{ + TOOL_OTHER = 0, + TOOL_GRABBER, + TOOL_SNIFFER, + TOOL_SHOOTER, + TOOL_ORGASHOOTER, +}; + struct ObjectPart { char bUsed; @@ -602,6 +582,9 @@ public: void SetParam(float value); float GetParam(); + + void SetIgnoreBuildCheck(bool bIgnoreBuildCheck); + bool GetIgnoreBuildCheck(); void SetExplo(bool bExplo); bool GetExplo(); @@ -639,7 +622,7 @@ public: void SetDefRank(int rank); int GetDefRank(); - bool GetTooltipName(char* name); + bool GetTooltipName(std::string& name); void AddDeselList(CObject* pObj); CObject* SubDeselList(); @@ -659,6 +642,9 @@ public: void SetTraceWidth(float width); std::string GetModelDirName(); + + static DriveType GetDriveFromObject(ObjectType type); + static ToolType GetToolFromObject(ObjectType type); protected: bool EventFrame(const Event &event); @@ -737,6 +723,7 @@ protected: bool m_bTrainer; // drive vehicle (without remote) bool m_bToy; // toy key bool m_bManual; // manual control (Scribbler) + bool m_bIgnoreBuildCheck; bool m_bFixed; bool m_bClip; bool m_bShowLimit; diff --git a/src/object/objman.cpp b/src/object/objman.cpp index e4102b8..b0bac1a 100644 --- a/src/object/objman.cpp +++ b/src/object/objman.cpp @@ -30,7 +30,7 @@ CObjectManager::CObjectManager() { m_table[i] = nullptr; } - usedCount = 0; + m_usedCount = 0; } CObjectManager::~CObjectManager() @@ -39,16 +39,16 @@ CObjectManager::~CObjectManager() bool CObjectManager::AddInstance(CObject* instance) { - if (usedCount >= MAX_OBJECTS) return false; + if (m_usedCount >= MAX_OBJECTS) return false; m_table[instance->GetID()] = instance; - usedCount++; + m_usedCount++; return true; } bool CObjectManager::DeleteInstance(CObject* instance) { - for (int i = 0; i < usedCount; i++) + for (int i = 0; i < m_usedCount; i++) { if (m_table[i] == instance) m_table[i] = nullptr; @@ -63,10 +63,9 @@ CObject* CObjectManager::SearchInstance(int id) return m_table[id]; } -CObject* CObjectManager::CreateObject(Math::Vector pos, float angle, float zoom, float height, - ObjectType type, float power, - bool trainer, bool toy, - int option) +CObject* CObjectManager::CreateObject(Math::Vector pos, float angle, ObjectType type, + float power, float zoom, float height, + bool trainer, bool toy, int option) { CObject* object = nullptr; @@ -161,8 +160,7 @@ CObject* CObjectManager::CreateObject(Math::Vector pos, float angle, float zoom, if ( type == OBJECT_BARRIER0 || type == OBJECT_BARRIER1 || type == OBJECT_BARRIER2 || - type == OBJECT_BARRIER3 || - type == OBJECT_BARRIER4 ) + type == OBJECT_BARRIER3 ) { object = new CObject(); object->CreateBarrier(pos, angle, height, type); @@ -193,26 +191,14 @@ CObject* CObjectManager::CreateObject(Math::Vector pos, float angle, float zoom, type == OBJECT_TREE2 || type == OBJECT_TREE3 || type == OBJECT_TREE4 || - type == OBJECT_TREE5 || - type == OBJECT_TREE6 || - type == OBJECT_TREE7 || - type == OBJECT_TREE8 || - type == OBJECT_TREE9 ) + type == OBJECT_TREE5 ) { object = new CObject(); object->CreatePlant(pos, angle, height, type); } else - if ( type == OBJECT_MUSHROOM0 || - type == OBJECT_MUSHROOM1 || - type == OBJECT_MUSHROOM2 || - type == OBJECT_MUSHROOM3 || - type == OBJECT_MUSHROOM4 || - type == OBJECT_MUSHROOM5 || - type == OBJECT_MUSHROOM6 || - type == OBJECT_MUSHROOM7 || - type == OBJECT_MUSHROOM8 || - type == OBJECT_MUSHROOM9 ) + if ( type == OBJECT_MUSHROOM1 || + type == OBJECT_MUSHROOM2 ) { object = new CObject(); object->CreateMushroom(pos, angle, height, type); @@ -262,12 +248,7 @@ CObject* CObjectManager::CreateObject(Math::Vector pos, float angle, float zoom, type == OBJECT_TEEN41 || type == OBJECT_TEEN42 || type == OBJECT_TEEN43 || - type == OBJECT_TEEN44 || - type == OBJECT_TEEN45 || - type == OBJECT_TEEN46 || - type == OBJECT_TEEN47 || - type == OBJECT_TEEN48 || - type == OBJECT_TEEN49 ) + type == OBJECT_TEEN44 ) { object = new CObject(); object->SetOption(option); @@ -277,13 +258,7 @@ CObject* CObjectManager::CreateObject(Math::Vector pos, float angle, float zoom, if ( type == OBJECT_QUARTZ0 || type == OBJECT_QUARTZ1 || type == OBJECT_QUARTZ2 || - type == OBJECT_QUARTZ3 || - type == OBJECT_QUARTZ4 || - type == OBJECT_QUARTZ5 || - type == OBJECT_QUARTZ6 || - type == OBJECT_QUARTZ7 || - type == OBJECT_QUARTZ8 || - type == OBJECT_QUARTZ9 ) + type == OBJECT_QUARTZ3 ) { object = new CObject(); object->CreateQuartz(pos, angle, height, type); @@ -294,11 +269,7 @@ CObject* CObjectManager::CreateObject(Math::Vector pos, float angle, float zoom, type == OBJECT_ROOT2 || type == OBJECT_ROOT3 || type == OBJECT_ROOT4 || - type == OBJECT_ROOT5 || - type == OBJECT_ROOT6 || - type == OBJECT_ROOT7 || - type == OBJECT_ROOT8 || - type == OBJECT_ROOT9 ) + type == OBJECT_ROOT5 ) { object = new CObject(); object->CreateRoot(pos, angle, height, type); @@ -387,3 +358,11 @@ CObject* CObjectManager::CreateObject(Math::Vector pos, float angle, float zoom, return object; } +void CObjectManager::Flush() +{ + for (int i = 0; i < MAX_OBJECTS; i++) + { + m_table[i] = nullptr; + } + m_usedCount = 0; +} diff --git a/src/object/objman.h b/src/object/objman.h index 3087383..390587b 100644 --- a/src/object/objman.h +++ b/src/object/objman.h @@ -44,10 +44,12 @@ public: //! Seeks for an object CObject* SearchInstance(int id); //! Creates an object - CObject* CreateObject(Math::Vector pos, float angle, float zoom, float height, ObjectType type, float power, bool trainer, bool toy, int option); + CObject* CreateObject(Math::Vector pos, float angle, ObjectType type, float power = -1.f, float zoom = 1.f, float height = 0.f, bool trainer = false, bool toy = false, int option = 0); + //! Removes all objects + void Flush(); protected: CObject* m_table[MAX_OBJECTS]; - int usedCount; + int m_usedCount; }; diff --git a/src/object/robotmain.cpp b/src/object/robotmain.cpp index 26fa827..76c234d 100644 --- a/src/object/robotmain.cpp +++ b/src/object/robotmain.cpp @@ -20,6 +20,7 @@ #include "CBot/CBotDll.h" #include "app/app.h" +#include "app/gamedata.h" #include "common/event.h" #include "common/global.h" @@ -81,6 +82,9 @@ #include <iomanip> +#include <boost/regex.hpp> + + template<> CRobotMain* CSingleton<CRobotMain>::m_instance = nullptr; @@ -618,6 +622,7 @@ CRobotMain::CRobotMain(CApplication* app, bool loadProfile) m_cloud = m_engine->GetCloud(); m_lightning = m_engine->GetLightning(); m_planet = m_engine->GetPlanet(); + m_pause = CPauseManager::GetInstancePointer(); m_interface = new Ui::CInterface(); m_terrain = new Gfx::CTerrain(); @@ -643,6 +648,10 @@ CRobotMain::CRobotMain(CApplication* app, bool loadProfile) m_visitArrow = 0; m_audioTrack = ""; m_audioRepeat = true; + m_satcomTrack = ""; + m_satcomRepeat = true; + m_editorTrack = ""; + m_editorRepeat = true; m_delayWriteMessage = 0; m_selectObject = 0; m_infoUsed = 0; @@ -663,7 +672,6 @@ CRobotMain::CRobotMain(CApplication* app, bool loadProfile) m_satComLock = false; m_editLock = false; m_editFull = false; - m_pause = false; m_hilite = false; m_freePhoto = false; m_showPos = false; @@ -690,12 +698,14 @@ CRobotMain::CRobotMain(CApplication* app, bool loadProfile) m_movieInfoIndex = -1; m_tooltipPos = Math::Point(0.0f, 0.0f); - m_tooltipName[0] = 0; + m_tooltipName.clear(); m_tooltipTime = 0.0f; m_endingWinRank = 0; m_endingLostRank = 0; m_winTerminate = false; + + m_exitAfterMission = false; m_joystickDeadzone = 0.2f; SetDefaultInputBindings(); @@ -881,6 +891,7 @@ CRobotMain::CRobotMain(CApplication* app, bool loadProfile) bc->AddFunction("busy", CScript::rBusy, CScript::cBusy); bc->AddFunction("factory", CScript::rFactory, CScript::cFactory); bc->AddFunction("research", CScript::rResearch, CScript::cClassOneFloat); + bc->AddFunction("takeoff", CScript::rTakeOff, CScript::cClassNull); bc->AddFunction("destroy", CScript::rDestroy, CScript::cClassNull); // Initializes the class FILE. @@ -944,6 +955,7 @@ Ui::CDisplayText* CRobotMain::GetDisplayText() void CRobotMain::LoadSceneOnStart(const std::string& name, int rank) { + m_exitAfterMission = true; // TODO: fix this ugly dependency :( m_dialog->SetSceneName(name.c_str()); m_dialog->SetSceneRank(rank); @@ -987,22 +999,27 @@ void CRobotMain::SetDefaultInputBindings() m_inputBindings[INPUT_SLOT_RIGHT ].primary = KEY(RIGHT); m_inputBindings[INPUT_SLOT_UP ].primary = KEY(UP); m_inputBindings[INPUT_SLOT_DOWN ].primary = KEY(DOWN); + m_inputBindings[INPUT_SLOT_LEFT ].secondary = KEY(a); + m_inputBindings[INPUT_SLOT_RIGHT ].secondary = KEY(d); + m_inputBindings[INPUT_SLOT_UP ].secondary = KEY(w); + m_inputBindings[INPUT_SLOT_DOWN ].secondary = KEY(s); m_inputBindings[INPUT_SLOT_GUP ].primary = VIRTUAL_KMOD(SHIFT); m_inputBindings[INPUT_SLOT_GDOWN ].primary = VIRTUAL_KMOD(CTRL); m_inputBindings[INPUT_SLOT_CAMERA ].primary = KEY(SPACE); - m_inputBindings[INPUT_SLOT_CAMERA ].secondary = VIRTUAL_JOY(2); +// m_inputBindings[INPUT_SLOT_CAMERA ].secondary = VIRTUAL_JOY(2); m_inputBindings[INPUT_SLOT_DESEL ].primary = KEY(KP0); - m_inputBindings[INPUT_SLOT_DESEL ].secondary = VIRTUAL_JOY(6); +// m_inputBindings[INPUT_SLOT_DESEL ].secondary = VIRTUAL_JOY(6); m_inputBindings[INPUT_SLOT_ACTION ].primary = KEY(RETURN); - m_inputBindings[INPUT_SLOT_ACTION ].secondary = VIRTUAL_JOY(1); +// m_inputBindings[INPUT_SLOT_ACTION ].secondary = VIRTUAL_JOY(1); + m_inputBindings[INPUT_SLOT_ACTION ].secondary = KEY(e); m_inputBindings[INPUT_SLOT_NEAR ].primary = KEY(KP_PLUS); - m_inputBindings[INPUT_SLOT_NEAR ].secondary = VIRTUAL_JOY(5); +// m_inputBindings[INPUT_SLOT_NEAR ].secondary = VIRTUAL_JOY(5); m_inputBindings[INPUT_SLOT_AWAY ].primary = KEY(KP_MINUS); - m_inputBindings[INPUT_SLOT_AWAY ].secondary = VIRTUAL_JOY(4); +// m_inputBindings[INPUT_SLOT_AWAY ].secondary = VIRTUAL_JOY(4); m_inputBindings[INPUT_SLOT_NEXT ].primary = KEY(TAB); - m_inputBindings[INPUT_SLOT_NEXT ].secondary = VIRTUAL_JOY(3); +// m_inputBindings[INPUT_SLOT_NEXT ].secondary = VIRTUAL_JOY(3); m_inputBindings[INPUT_SLOT_HUMAN ].primary = KEY(HOME); - m_inputBindings[INPUT_SLOT_HUMAN ].secondary = VIRTUAL_JOY(7); +// m_inputBindings[INPUT_SLOT_HUMAN ].secondary = VIRTUAL_JOY(7); m_inputBindings[INPUT_SLOT_QUIT ].primary = KEY(ESCAPE); m_inputBindings[INPUT_SLOT_HELP ].primary = KEY(F1); m_inputBindings[INPUT_SLOT_PROG ].primary = KEY(F2); @@ -1063,12 +1080,9 @@ void CRobotMain::ChangePhase(Phase phase) if (m_phase == PHASE_SIMUL) // ends a simulation? { SaveAllScript(); - m_sound->StopMusic(); + m_sound->StopMusic(0.0f); m_camera->SetControllingObject(0); -/* TODO: #if _SCHOOL - if ( true ) -#else*/ if (m_gameTime > 10.0f) // did you play at least 10 seconds? { int rank = m_dialog->GetSceneRank(); @@ -1101,7 +1115,7 @@ void CRobotMain::ChangePhase(Phase phase) m_resetCreate = false; m_engine->SetMovieLock(m_movieLock); - ChangePause(false); + ChangePause(PAUSE_NONE); FlushDisplayInfo(); m_engine->SetRankView(0); m_terrain->FlushRelief(); @@ -1139,6 +1153,8 @@ void CRobotMain::ChangePhase(Phase phase) iMan->Flush(CLASS_PHYSICS); iMan->Flush(CLASS_BRAIN); iMan->Flush(CLASS_PYRO); + + CObjectManager::GetInstancePointer()->Flush(); Math::Point dim, pos; @@ -1153,12 +1169,6 @@ void CRobotMain::ChangePhase(Phase phase) m_cmdEdit = false; // hidden for now // Creates the speedometer. -/* TODO: #if _TEEN - dim.x = 30.0f/640.0f; - dim.y = 20.0f/480.0f; - pos.x = 4.0f/640.0f; - pos.y = 454.0f/480.0f; -#else*/ dim.x = 30.0f/640.0f; dim.y = 20.0f/480.0f; pos.x = 4.0f/640.0f; @@ -1217,7 +1227,7 @@ void CRobotMain::ChangePhase(Phase phase) m_infoFilename[SATCOM_HUSTON][0] != 0) StartDisplayInfo(SATCOM_HUSTON, false); // shows the instructions - m_sound->StopMusic(); + m_sound->StopMusic(0.0f); if (!m_base || loading) StartMusic(); } @@ -1230,10 +1240,6 @@ void CRobotMain::ChangePhase(Phase phase) } else { -/* TODO: #if _TEEN - m_winTerminate = (m_endingWinRank == 900); - m_dialog->SetSceneName("teenw"); -#else*/ m_winTerminate = (m_endingWinRank == 904); m_dialog->SetSceneName("win"); @@ -1247,16 +1253,6 @@ void CRobotMain::ChangePhase(Phase phase) if (m_winTerminate) { -/* TODO: #if _TEEN - pos.x = ox+sx*3; pos.y = oy+sy*1; - ddim.x = dim.x*15; ddim.y = dim.y*2; - pe = m_interface->CreateEdit(pos, ddim, 0, EVENT_EDIT0); - pe->SetFontType(FONT_COLOBOT); - pe->SetEditCap(false); - pe->SetHiliteCap(false); - pe->ReadText("help/teenw.txt"); -#else*/ - pos.x = ox+sx*3; pos.y = oy+sy*0.2f; ddim.x = dim.x*15; ddim.y = dim.y*3.0f; pe = m_interface->CreateEdit(pos, ddim, 0, EVENT_EDIT0); @@ -1376,7 +1372,7 @@ bool CRobotMain::ProcessEvent(Event &event) MainMovieType type = m_movie->GetStopType(); if (type == MM_SATCOMopen) { - ChangePause(false); + ChangePause(PAUSE_NONE); SelectObject(m_infoObject, false); // hands over the command buttons m_map->ShowMap(m_mapShow); m_displayText->HideText(false); @@ -1408,7 +1404,7 @@ bool CRobotMain::ProcessEvent(Event &event) if (pe == nullptr) return false; pe->SetState(Ui::STATE_VISIBLE); pe->SetFocus(true); - if (m_phase == PHASE_SIMUL) ChangePause(true); + if (m_phase == PHASE_SIMUL) ChangePause(PAUSE_CHEAT); m_cmdEdit = true; return false; } @@ -1421,7 +1417,7 @@ bool CRobotMain::ProcessEvent(Event &event) pe->GetText(cmd, 50); pe->SetText(""); pe->ClearState(Ui::STATE_VISIBLE); - if (m_phase == PHASE_SIMUL) ChangePause(false); + if (m_phase == PHASE_SIMUL) ChangePause(PAUSE_NONE); ExecuteCmd(cmd); m_cmdEdit = false; return false; @@ -1551,7 +1547,7 @@ bool CRobotMain::ProcessEvent(Event &event) m_camera->GetType() != Gfx::CAM_TYPE_VISIT && !m_movie->IsExist()) { - ChangePause(!m_engine->GetPause()); + ChangePause(m_pause->GetPause(PAUSE_USER) ? PAUSE_NONE : PAUSE_USER); } } if (event.key.key == GetInputBinding(INPUT_SLOT_CAMERA).primary || @@ -1741,10 +1737,14 @@ bool CRobotMain::ProcessEvent(Event &event) case EVENT_WIN: ChangePhase(PHASE_WIN); + if(m_exitAfterMission) + m_eventQueue->AddEvent(Event(EVENT_QUIT)); break; case EVENT_LOST: ChangePhase(PHASE_LOST); + if(m_exitAfterMission) + m_eventQueue->AddEvent(Event(EVENT_QUIT)); break; default: @@ -1781,6 +1781,7 @@ bool CRobotMain::ProcessEvent(Event &event) ChangePhase(PHASE_INIT); else ChangePhase(PHASE_TERM); + break; default: @@ -1875,12 +1876,12 @@ void CRobotMain::ExecuteCmd(char *cmd) if (m_freePhoto) { m_camera->SetType(Gfx::CAM_TYPE_FREE); - ChangePause(true); + ChangePause(PAUSE_PHOTO); } else { m_camera->SetType(Gfx::CAM_TYPE_BACK); - ChangePause(false); + ChangePause(PAUSE_NONE); } return; } @@ -1891,7 +1892,7 @@ void CRobotMain::ExecuteCmd(char *cmd) if (m_freePhoto) { m_camera->SetType(Gfx::CAM_TYPE_FREE); - ChangePause(true); + ChangePause(PAUSE_PHOTO); DeselectAll(); // removes the control buttons m_map->ShowMap(false); m_displayText->HideText(true); @@ -1899,7 +1900,7 @@ void CRobotMain::ExecuteCmd(char *cmd) else { m_camera->SetType(Gfx::CAM_TYPE_BACK); - ChangePause(false); + ChangePause(PAUSE_NONE); m_map->ShowMap(m_mapShow); m_displayText->HideText(false); } @@ -2082,9 +2083,6 @@ void CRobotMain::ExecuteCmd(char *cmd) return; } -/* TODO: #if _TEEN - if (strcmp(cmd, "allteens") == 0) -#else*/ if (strcmp(cmd, "allmission") == 0) { m_showAll = !m_showAll; @@ -2158,7 +2156,7 @@ void CRobotMain::StartDisplayInfo(int index, bool movie) { m_movieInfoIndex = index; m_movie->Start(MM_SATCOMopen, 2.5f); - ChangePause(true); + ChangePause(PAUSE_SATCOMMOVIE); m_infoObject = DeselectAll(); // removes the control buttons m_displayText->HideText(true); return; @@ -2168,7 +2166,7 @@ void CRobotMain::StartDisplayInfo(int index, bool movie) if (m_movie->IsExist()) { m_movie->Stop(); - ChangePause(false); + ChangePause(PAUSE_NONE); SelectObject(m_infoObject, false); // hands over the command buttons m_displayText->HideText(false); } @@ -2445,7 +2443,7 @@ void CRobotMain::StartDisplayVisit(EventType event) } Math::Vector goal = m_displayText->GetVisitGoal(event); - m_visitArrow = CreateObject(goal, 0.0f, 1.0f, 10.0f, OBJECT_SHOW, false, false, 0); + m_visitArrow = CObjectManager::GetInstancePointer()->CreateObject(goal, 0.0f, OBJECT_SHOW, -1.0f, 1.0f, 10.0f); m_visitPos = m_visitArrow->GetPosition(0); m_visitPosArrow = m_visitPos; @@ -2460,7 +2458,7 @@ void CRobotMain::StartDisplayVisit(EventType event) m_camera->StartVisit(m_displayText->GetVisitGoal(event), m_displayText->GetVisitDist(event)); m_displayText->SetVisit(event); - ChangePause(true); + ChangePause(PAUSE_VISIT); } //! Move the arrow to visit @@ -2514,7 +2512,7 @@ void CRobotMain::StopDisplayVisit() m_camera->StopVisit(); m_displayText->ClearVisit(); - ChangePause(false); + ChangePause(PAUSE_NONE); if (m_visitObject != 0) { SelectObject(m_visitObject, false); // gives the command buttons @@ -2612,7 +2610,7 @@ bool CRobotMain::SelectObject(CObject* obj, bool displayError) if (m_camera->GetType() == Gfx::CAM_TYPE_VISIT) StopDisplayVisit(); - if (m_movieLock || m_editLock || m_pause) return false; + if (m_movieLock || m_editLock || m_pause->GetPause()) return false; if (m_movie->IsExist()) return false; if (obj == nullptr || !IsSelectable(obj)) return false; @@ -3025,7 +3023,7 @@ bool CRobotMain::DeleteObject() void CRobotMain::HiliteClear() { ClearTooltip(); - m_tooltipName[0] = 0; // really removes the tooltip + m_tooltipName.clear(); // really removes the tooltip if (!m_hilite) return; @@ -3059,11 +3057,11 @@ void CRobotMain::HiliteObject(Math::Point pos) CObject* obj = m_short->DetectShort(pos); - std::string nameStr; - if (m_dialog->GetTooltip() && m_interface->GetTooltip(pos, nameStr)) + std::string interfaceTooltipName; + if (m_dialog->GetTooltip() && m_interface->GetTooltip(pos, interfaceTooltipName)) { m_tooltipPos = pos; - strcpy(m_tooltipName, nameStr.c_str()); + m_tooltipName = interfaceTooltipName; m_tooltipTime = 0.0f; if (obj == nullptr) return; } @@ -3086,13 +3084,13 @@ void CRobotMain::HiliteObject(Math::Point pos) } } - char name[100]; if (obj != nullptr) { - if (m_dialog->GetTooltip() && obj->GetTooltipName(name)) + std::string objectTooltipName; + if (m_dialog->GetTooltip() && obj->GetTooltipName(objectTooltipName)) { m_tooltipPos = pos; - strcpy(m_tooltipName, name); + m_tooltipName = objectTooltipName; m_tooltipTime = 0.0f; } @@ -3117,15 +3115,14 @@ void CRobotMain::HiliteFrame(float rTime) ClearTooltip(); - if (m_tooltipTime >= 0.2f && - m_tooltipName[0] != 0) + if (m_tooltipTime >= 0.2f && !m_tooltipName.empty()) { CreateTooltip(m_tooltipPos, m_tooltipName); } } //! Creates a tooltip -void CRobotMain::CreateTooltip(Math::Point pos, const char* text) +void CRobotMain::CreateTooltip(Math::Point pos, const std::string& text) { Math::Point corner; corner.x = pos.x+0.022f; @@ -3515,7 +3512,7 @@ bool CRobotMain::EventFrame(const Event &event) } // Moves edition indicator. - if (m_editLock || m_pause) // edition in progress? + if (m_editLock || m_pause->GetPause()) // edition in progress? { Ui::CControl* pc = m_interface->SearchControl(EVENT_OBJECT_EDITLOCK); if (pc != nullptr) @@ -3856,6 +3853,8 @@ void CRobotMain::ScenePerso() iMan->Flush(CLASS_PHYSICS); iMan->Flush(CLASS_BRAIN); iMan->Flush(CLASS_PYRO); + + CObjectManager::GetInstancePointer()->Flush(); m_dialog->SetSceneName("perso"); m_dialog->SetSceneRank(0); @@ -3903,6 +3902,10 @@ void CRobotMain::CreateScene(bool soluce, bool fixScene, bool resetObject) m_terrain->FlushMaterials(); m_audioTrack = ""; m_audioRepeat = true; + m_satcomTrack = ""; + m_satcomRepeat = true; + m_editorTrack = ""; + m_editorRepeat = true; m_displayText->SetDelay(1.0f); m_displayText->SetEnable(true); m_immediatSatCom = false; @@ -3949,7 +3952,9 @@ void CRobotMain::CreateScene(bool soluce, bool fixScene, bool resetObject) m_dialog->BuildResumeName(m_title, base, rank); m_dialog->BuildResumeName(m_resume, base, rank); - GetResource(RES_TEXT, RT_SCRIPT_NEW, m_scriptName); + std::string scriptNameStr; + GetResource(RES_TEXT, RT_SCRIPT_NEW, scriptNameStr); + strcpy(m_scriptName, scriptNameStr.c_str()); m_scriptFile[0] = 0; m_beginObject = false; @@ -4006,8 +4011,10 @@ void CRobotMain::CreateScene(bool soluce, bool fixScene, bool resetObject) } } - if (Cmd(line, "MissionFile") && !resetObject) + if (Cmd(line, "MissionFile") && !resetObject) { m_version = OpInt(line, "version", 1); + continue; + } // TODO: Fallback to an non-localized entry sprintf(op, "Title.%c", m_app->GetLanguageChar()); @@ -4031,9 +4038,14 @@ void CRobotMain::CreateScene(bool soluce, bool fixScene, bool resetObject) continue; } - if (Cmd(line, "Title")) continue; // Ignore - if (Cmd(line, "Resume")) continue; // Ignore - if (Cmd(line, "ScriptName")) continue; // Ignore + static const boost::regex titleCmdRe("Title\\.[A-Z]"); + static const boost::regex resumeCmdRe("Resume\\.[A-Z]"); + static const boost::regex scriptNameCmdRe("ScriptName\\.[A-Z]"); + + if (boost::regex_match(GetCmd(line), titleCmdRe)) continue; // Ignore + if (boost::regex_match(GetCmd(line), resumeCmdRe)) continue; // Ignore + if (boost::regex_match(GetCmd(line), scriptNameCmdRe)) continue; // Ignore + if (Cmd(line, "ScriptFile") && !resetObject) { @@ -4044,18 +4056,19 @@ void CRobotMain::CreateScene(bool soluce, bool fixScene, bool resetObject) if (Cmd(line, "Instructions") && !resetObject) { OpString(line, "name", name); - std::string path = m_app->GetDataFilePath(DIR_HELP, name); + std::string path = CGameData::GetInstancePointer()->GetFilePath(DIR_HELP, name); strcpy(m_infoFilename[SATCOM_HUSTON], path.c_str()); m_immediatSatCom = OpInt(line, "immediat", 0); if (m_version >= 2) m_beginSatCom = m_lockedSatCom = OpInt(line, "lock", 0); + if (m_app->GetSceneTestMode()) m_immediatSatCom = false; continue; } if (Cmd(line, "Satellite") && !resetObject) { OpString(line, "name", name); - std::string path = m_app->GetDataFilePath(DIR_HELP, name); + std::string path = CGameData::GetInstancePointer()->GetFilePath(DIR_HELP, name); strcpy(m_infoFilename[SATCOM_SAT], path.c_str()); continue; } @@ -4063,7 +4076,7 @@ void CRobotMain::CreateScene(bool soluce, bool fixScene, bool resetObject) if (Cmd(line, "Loading") && !resetObject) { OpString(line, "name", name); - std::string path = m_app->GetDataFilePath(DIR_HELP, name); + std::string path = CGameData::GetInstancePointer()->GetFilePath(DIR_HELP, name); strcpy(m_infoFilename[SATCOM_LOADING], path.c_str()); continue; } @@ -4071,14 +4084,14 @@ void CRobotMain::CreateScene(bool soluce, bool fixScene, bool resetObject) if (Cmd(line, "HelpFile") && !resetObject) { OpString(line, "name", name); - std::string path = m_app->GetDataFilePath(DIR_HELP, name); + std::string path = CGameData::GetInstancePointer()->GetFilePath(DIR_HELP, name); strcpy(m_infoFilename[SATCOM_PROG], path.c_str()); continue; } if (Cmd(line, "SoluceFile") && !resetObject) { OpString(line, "name", name); - std::string path = m_app->GetDataFilePath(DIR_HELP, name); + std::string path = CGameData::GetInstancePointer()->GetFilePath(DIR_HELP, name); strcpy(m_infoFilename[SATCOM_SOLUCE], path.c_str()); continue; } @@ -4109,12 +4122,14 @@ void CRobotMain::CreateScene(bool soluce, bool fixScene, bool resetObject) if (i < 10) { m_audioChange[i].pos = OpPos(line, "pos")*g_unit; - m_audioChange[i].dist = OpFloat(line, "dist", 8.0f)*g_unit; + m_audioChange[i].dist = OpFloat(line, "dist", 1000.0f)*g_unit; m_audioChange[i].type = OpTypeObject(line, "type", OBJECT_NULL); m_audioChange[i].min = OpInt(line, "min", 1); m_audioChange[i].max = OpInt(line, "max", 9999); - m_audioChange[i].powermin = OpInt(line, "powermin", -1); - m_audioChange[i].powermax = OpInt(line, "powermax", 100); + m_audioChange[i].powermin = OpFloat(line, "powermin", -1); + m_audioChange[i].powermax = OpFloat(line, "powermax", 100); + m_audioChange[i].tool = OpTool(line, "tool"); + m_audioChange[i].drive = OpDrive(line, "drive"); OpString(line, "filename", m_audioChange[i].music); m_audioChange[i].repeat = OpInt(line, "repeat", 1); m_audioChange[i].changed = false; @@ -4135,15 +4150,27 @@ void CRobotMain::CreateScene(bool soluce, bool fixScene, bool resetObject) filenameStr << "music" << std::setfill('0') << std::setw(3) << trackid << ".ogg"; m_audioTrack = filenameStr.str(); } + m_audioRepeat = OpInt(line, "repeat", 1); } else { char trackname[100]; - OpString(line, "filename", trackname); + + OpString(line, "main", trackname); m_audioTrack = trackname; + m_audioRepeat = OpInt(line, "mainRepeat", 1); + + OpString(line, "satcom", trackname); + m_satcomTrack = trackname; + m_satcomRepeat = OpInt(line, "satcomRepeat", 1); + + OpString(line, "editor", trackname); + m_editorTrack = trackname; + m_editorRepeat = OpInt(line, "editorRepeat", 1); } - m_audioRepeat = OpInt(line, "repeat", 1); if (m_audioTrack != "") m_sound->CacheMusic(m_audioTrack); + if (m_satcomTrack != "") m_sound->CacheMusic(m_satcomTrack); + if (m_editorTrack != "") m_sound->CacheMusic(m_editorTrack); continue; } @@ -4325,6 +4352,12 @@ void CRobotMain::CreateScene(bool soluce, bool fixScene, bool resetObject) m_terrain->LoadRelief(name, OpFloat(line, "factor", 1.0f), OpInt(line, "border", 1)); continue; } + + if (Cmd(line, "TerrainRandomRelief") && !resetObject) + { + m_terrain->RandomizeRelief(); + continue; + } if (Cmd(line, "TerrainResource") && !resetObject) { @@ -4539,15 +4572,9 @@ void CRobotMain::CreateScene(bool soluce, bool fixScene, bool resetObject) if (Cmd(line, "MissionController") && read[0] == 0 && m_version >= 2) { - /* TODO: ??? - if (!m_beginObject) - { - GetLogger()->Error("Syntax error in file '%s' (line %d): MissionController before BeginObject\n", filename, lineNum); - continue; - }*/ - - m_controller = CreateObject(Math::Vector(0.0f, 0.0f, 0.0f), 0.0f, 1.0f, 0.0f, OBJECT_CONTROLLER, 100.0f, false, false, 0); + m_controller = CObjectManager::GetInstancePointer()->CreateObject(Math::Vector(0.0f, 0.0f, 0.0f), 0.0f, OBJECT_CONTROLLER, 100.0f); m_controller->SetMagnifyDamage(100.0f); + m_controller->SetIgnoreBuildCheck(true); CBrain* brain = m_controller->GetBrain(); if (brain != nullptr) { @@ -4577,11 +4604,11 @@ void CRobotMain::CreateScene(bool soluce, bool fixScene, bool resetObject) (type >= OBJECT_PLANT0 && type <= OBJECT_PLANT19 ) || (type >= OBJECT_TREE0 && - type <= OBJECT_TREE9 ) || + type <= OBJECT_TREE5 ) || (type >= OBJECT_TEEN0 && - type <= OBJECT_TEEN49 ) || + type <= OBJECT_TEEN44 ) || (type >= OBJECT_QUARTZ0 && - type <= OBJECT_QUARTZ9 ) || + type <= OBJECT_QUARTZ3 ) || (type >= OBJECT_ROOT0 && type <= OBJECT_ROOT4 ) ) // not ROOT5! { @@ -4605,15 +4632,23 @@ void CRobotMain::CreateScene(bool soluce, bool fixScene, bool resetObject) Math::Vector pos = OpPos(line, "pos")*g_unit; float dirAngle = OpFloat(line, "dir", 0.0f)*Math::PI; - bool trainer = OpInt(line, "trainer", 0); - CObject* obj = CreateObject(pos, dirAngle, - OpFloat(line, "z", 1.0f), - OpFloat(line, "h", 0.0f), + bool trainer; + CObject* obj = CObjectManager::GetInstancePointer()->CreateObject( + pos, dirAngle, type, OpFloat(line, "power", 1.0f), - trainer, + OpFloat(line, "z", 1.0f), + OpFloat(line, "h", 0.0f), + trainer = OpInt(line, "trainer", 0), OpInt(line, "toy", 0), OpInt(line, "option", 0)); + + if (m_fixScene && type == OBJECT_HUMAN) + { + CMotion* motion = obj->GetMotion(); + if (m_phase == PHASE_WIN ) motion->SetAction(MHS_WIN, 0.4f); + if (m_phase == PHASE_LOST) motion->SetAction(MHS_LOST, 0.5f); + } if (obj != nullptr) { @@ -4667,6 +4702,7 @@ void CRobotMain::CreateScene(bool soluce, bool fixScene, bool resetObject) bool selectable = OpInt(line, "selectable", 1); obj->SetSelectable(selectable); + obj->SetIgnoreBuildCheck(OpInt(line, "ignoreBuildCheck", 0)); obj->SetEnable(OpInt(line, "enable", 1)); obj->SetProxyActivate(OpInt(line, "proxyActivate", 0)); obj->SetProxyDistance(OpFloat(line, "proxyDistance", 15.0f)*g_unit); @@ -4709,9 +4745,6 @@ void CRobotMain::CreateScene(bool soluce, bool fixScene, bool resetObject) { sprintf(op, "script%d", i+1); // script1..script10 OpString(line, op, name); -/* TODO: #if _SCHOOL - if ( !m_dialog->GetSoluce4() && i == 3 ) continue; -#endif*/ if (name[0] != 0) brain->SetScriptName(i, name); @@ -4910,19 +4943,23 @@ void CRobotMain::CreateScene(bool soluce, bool fixScene, bool resetObject) if (i < 10) { m_endTake[i].pos = OpPos(line, "pos")*g_unit; - m_endTake[i].dist = OpFloat(line, "dist", 8.0f)*g_unit; + m_endTake[i].dist = OpFloat(line, "dist", (m_version < 2 ? 8.0f : 100.0f))*g_unit; m_endTake[i].type = OpTypeObject(line, "type", OBJECT_NULL); m_endTake[i].min = OpInt(line, "min", 1); m_endTake[i].max = OpInt(line, "max", 9999); if (m_version >= 2) { - m_endTake[i].powermin = OpInt(line, "powermin", -1); - m_endTake[i].powermax = OpInt(line, "powermax", 100); + m_endTake[i].powermin = OpFloat(line, "powermin", -1); + m_endTake[i].powermax = OpFloat(line, "powermax", 100); + m_endTake[i].tool = OpTool(line, "tool"); + m_endTake[i].drive = OpDrive(line, "drive"); } else { m_endTake[i].powermin = -1; m_endTake[i].powermax = 100; + m_endTake[i].tool = TOOL_OTHER; + m_endTake[i].drive = DRIVE_OTHER; } m_endTake[i].lost = OpInt(line, "lost", -1); m_endTake[i].immediat = OpInt(line, "immediat", 0); @@ -5074,339 +5111,9 @@ void CRobotMain::CreateScene(bool soluce, bool fixScene, bool resetObject) m_dialog->SetStackRead(""); RestoreNumericLocale(); -} - -//! Creates an object of decoration mobile or stationary -CObject* CRobotMain::CreateObject(Math::Vector pos, float angle, float zoom, float height, - ObjectType type, float power, - bool trainer, bool toy, - int option) -{ - CObject* object = nullptr; - - if ( type == OBJECT_NULL ) return nullptr; - - if ( type == OBJECT_HUMAN || - type == OBJECT_TECH ) - { - trainer = false; // necessarily - } - - if ( type == OBJECT_PORTICO || - type == OBJECT_BASE || - type == OBJECT_DERRICK || - type == OBJECT_FACTORY || - type == OBJECT_STATION || - type == OBJECT_CONVERT || - type == OBJECT_REPAIR || - type == OBJECT_DESTROYER|| - type == OBJECT_TOWER || - type == OBJECT_NEST || - type == OBJECT_RESEARCH || - type == OBJECT_RADAR || - type == OBJECT_INFO || - type == OBJECT_ENERGY || - type == OBJECT_LABO || - type == OBJECT_NUCLEAR || - type == OBJECT_PARA || - type == OBJECT_SAFE || - type == OBJECT_HUSTON || - type == OBJECT_TARGET1 || - type == OBJECT_TARGET2 || - type == OBJECT_START || - type == OBJECT_END ) - { - object = new CObject(); - object->CreateBuilding(pos, angle, height, type, power); - - CAuto* automat = object->GetAuto(); - if (automat != nullptr) - { - automat->Init(); - } - } - else - if ( type == OBJECT_FRET || - type == OBJECT_STONE || - type == OBJECT_URANIUM || - type == OBJECT_METAL || - type == OBJECT_POWER || - type == OBJECT_ATOMIC || - type == OBJECT_BULLET || - type == OBJECT_BBOX || - type == OBJECT_KEYa || - type == OBJECT_KEYb || - type == OBJECT_KEYc || - type == OBJECT_KEYd || - type == OBJECT_TNT || - type == OBJECT_SCRAP1 || - type == OBJECT_SCRAP2 || - type == OBJECT_SCRAP3 || - type == OBJECT_SCRAP4 || - type == OBJECT_SCRAP5 || - type == OBJECT_BOMB || - type == OBJECT_WAYPOINT || - type == OBJECT_SHOW || - type == OBJECT_WINFIRE || - type == OBJECT_BAG || - type == OBJECT_MARKPOWER || - type == OBJECT_MARKSTONE || - type == OBJECT_MARKURANIUM || - type == OBJECT_MARKKEYa || - type == OBJECT_MARKKEYb || - type == OBJECT_MARKKEYc || - type == OBJECT_MARKKEYd || - type == OBJECT_EGG ) - { - object = new CObject(); - object->CreateResource(pos, angle, type, power); - } - else - if ( type == OBJECT_FLAGb || - type == OBJECT_FLAGr || - type == OBJECT_FLAGg || - type == OBJECT_FLAGy || - type == OBJECT_FLAGv ) - { - object = new CObject(); - object->CreateFlag(pos, angle, type); - } - else - if ( type == OBJECT_BARRIER0 || - type == OBJECT_BARRIER1 || - type == OBJECT_BARRIER2 || - type == OBJECT_BARRIER3 || - type == OBJECT_BARRIER4 ) - { - object = new CObject(); - object->CreateBarrier(pos, angle, height, type); - } - else - if ( type == OBJECT_PLANT0 || - type == OBJECT_PLANT1 || - type == OBJECT_PLANT2 || - type == OBJECT_PLANT3 || - type == OBJECT_PLANT4 || - type == OBJECT_PLANT5 || - type == OBJECT_PLANT6 || - type == OBJECT_PLANT7 || - type == OBJECT_PLANT8 || - type == OBJECT_PLANT9 || - type == OBJECT_PLANT10 || - type == OBJECT_PLANT11 || - type == OBJECT_PLANT12 || - type == OBJECT_PLANT13 || - type == OBJECT_PLANT14 || - type == OBJECT_PLANT15 || - type == OBJECT_PLANT16 || - type == OBJECT_PLANT17 || - type == OBJECT_PLANT18 || - type == OBJECT_PLANT19 || - type == OBJECT_TREE0 || - type == OBJECT_TREE1 || - type == OBJECT_TREE2 || - type == OBJECT_TREE3 || - type == OBJECT_TREE4 || - type == OBJECT_TREE5 || - type == OBJECT_TREE6 || - type == OBJECT_TREE7 || - type == OBJECT_TREE8 || - type == OBJECT_TREE9 ) - { - object = new CObject(); - object->CreatePlant(pos, angle, height, type); - } - else - if ( type == OBJECT_MUSHROOM0 || - type == OBJECT_MUSHROOM1 || - type == OBJECT_MUSHROOM2 || - type == OBJECT_MUSHROOM3 || - type == OBJECT_MUSHROOM4 || - type == OBJECT_MUSHROOM5 || - type == OBJECT_MUSHROOM6 || - type == OBJECT_MUSHROOM7 || - type == OBJECT_MUSHROOM8 || - type == OBJECT_MUSHROOM9 ) - { - object = new CObject(); - object->CreateMushroom(pos, angle, height, type); - } - else - if ( type == OBJECT_TEEN0 || - type == OBJECT_TEEN1 || - type == OBJECT_TEEN2 || - type == OBJECT_TEEN3 || - type == OBJECT_TEEN4 || - type == OBJECT_TEEN5 || - type == OBJECT_TEEN6 || - type == OBJECT_TEEN7 || - type == OBJECT_TEEN8 || - type == OBJECT_TEEN9 || - type == OBJECT_TEEN10 || - type == OBJECT_TEEN11 || - type == OBJECT_TEEN12 || - type == OBJECT_TEEN13 || - type == OBJECT_TEEN14 || - type == OBJECT_TEEN15 || - type == OBJECT_TEEN16 || - type == OBJECT_TEEN17 || - type == OBJECT_TEEN18 || - type == OBJECT_TEEN19 || - type == OBJECT_TEEN20 || - type == OBJECT_TEEN21 || - type == OBJECT_TEEN22 || - type == OBJECT_TEEN23 || - type == OBJECT_TEEN24 || - type == OBJECT_TEEN25 || - type == OBJECT_TEEN26 || - type == OBJECT_TEEN27 || - type == OBJECT_TEEN28 || - type == OBJECT_TEEN29 || - type == OBJECT_TEEN30 || - type == OBJECT_TEEN31 || - type == OBJECT_TEEN32 || - type == OBJECT_TEEN33 || - type == OBJECT_TEEN34 || - type == OBJECT_TEEN35 || - type == OBJECT_TEEN36 || - type == OBJECT_TEEN37 || - type == OBJECT_TEEN38 || - type == OBJECT_TEEN39 || - type == OBJECT_TEEN40 || - type == OBJECT_TEEN41 || - type == OBJECT_TEEN42 || - type == OBJECT_TEEN43 || - type == OBJECT_TEEN44 || - type == OBJECT_TEEN45 || - type == OBJECT_TEEN46 || - type == OBJECT_TEEN47 || - type == OBJECT_TEEN48 || - type == OBJECT_TEEN49 ) - { - object = new CObject(); - object->SetOption(option); - object->CreateTeen(pos, angle, zoom, height, type); - } - else - if ( type == OBJECT_QUARTZ0 || - type == OBJECT_QUARTZ1 || - type == OBJECT_QUARTZ2 || - type == OBJECT_QUARTZ3 || - type == OBJECT_QUARTZ4 || - type == OBJECT_QUARTZ5 || - type == OBJECT_QUARTZ6 || - type == OBJECT_QUARTZ7 || - type == OBJECT_QUARTZ8 || - type == OBJECT_QUARTZ9 ) - { - object = new CObject(); - object->CreateQuartz(pos, angle, height, type); - } - else - if ( type == OBJECT_ROOT0 || - type == OBJECT_ROOT1 || - type == OBJECT_ROOT2 || - type == OBJECT_ROOT3 || - type == OBJECT_ROOT4 || - type == OBJECT_ROOT5 || - type == OBJECT_ROOT6 || - type == OBJECT_ROOT7 || - type == OBJECT_ROOT8 || - type == OBJECT_ROOT9 ) - { - object = new CObject(); - object->CreateRoot(pos, angle, height, type); - } - else - if ( type == OBJECT_HOME1 ) - { - object = new CObject(); - object->CreateHome(pos, angle, height, type); - } - else - if ( type == OBJECT_RUINmobilew1 || - type == OBJECT_RUINmobilew2 || - type == OBJECT_RUINmobilet1 || - type == OBJECT_RUINmobilet2 || - type == OBJECT_RUINmobiler1 || - type == OBJECT_RUINmobiler2 || - type == OBJECT_RUINfactory || - type == OBJECT_RUINdoor || - type == OBJECT_RUINsupport || - type == OBJECT_RUINradar || - type == OBJECT_RUINconvert || - type == OBJECT_RUINbase || - type == OBJECT_RUINhead ) - { - object = new CObject(); - object->CreateRuin(pos, angle, height, type); - } - else - if ( type == OBJECT_APOLLO1 || - type == OBJECT_APOLLO3 || - type == OBJECT_APOLLO4 || - type == OBJECT_APOLLO5 ) - { - object = new CObject(); - object->CreateApollo(pos, angle, type); - } - else - if ( type == OBJECT_MOTHER || - type == OBJECT_ANT || - type == OBJECT_SPIDER || - type == OBJECT_BEE || - type == OBJECT_WORM ) - { - object = new CObject(); - object->CreateInsect(pos, angle, type); // no eggs - } - else - if ( type == OBJECT_HUMAN || - type == OBJECT_TECH || - type == OBJECT_TOTO || - type == OBJECT_MOBILEfa || - type == OBJECT_MOBILEta || - type == OBJECT_MOBILEwa || - type == OBJECT_MOBILEia || - type == OBJECT_MOBILEfc || - type == OBJECT_MOBILEtc || - type == OBJECT_MOBILEwc || - type == OBJECT_MOBILEic || - type == OBJECT_MOBILEfi || - type == OBJECT_MOBILEti || - type == OBJECT_MOBILEwi || - type == OBJECT_MOBILEii || - type == OBJECT_MOBILEfs || - type == OBJECT_MOBILEts || - type == OBJECT_MOBILEws || - type == OBJECT_MOBILEis || - type == OBJECT_MOBILErt || - type == OBJECT_MOBILErc || - type == OBJECT_MOBILErr || - type == OBJECT_MOBILErs || - type == OBJECT_MOBILEsa || - type == OBJECT_MOBILEtg || - type == OBJECT_MOBILEft || - type == OBJECT_MOBILEtt || - type == OBJECT_MOBILEwt || - type == OBJECT_MOBILEit || - type == OBJECT_MOBILEdr || - type == OBJECT_APOLLO2 || - type == OBJECT_CONTROLLER ) - { - object = new CObject(); - object->SetOption(option); - object->CreateVehicle(pos, angle, type, power, trainer, toy); - } - - if (m_fixScene && type == OBJECT_HUMAN) - { - CMotion* motion = object->GetMotion(); - if (m_phase == PHASE_WIN ) motion->SetAction(MHS_WIN, 0.4f); - if (m_phase == PHASE_LOST) motion->SetAction(MHS_LOST, 0.5f); - } - - return object; + + if(m_app->GetSceneTestMode()) + m_eventQueue->AddEvent(Event(EVENT_WIN)); } //! Creates a directional light @@ -6014,7 +5721,9 @@ void CRobotMain::CompileScript(bool soluce) char* name = brain->GetScriptName(j); if (name[0] != 0) { - brain->ReadProgram(j, name); + if(! brain->ReadProgram(j, name)) { + CLogger::GetInstancePointer()->Error("Unable to read script from file \"%s\"\n", name); + } if (!brain->GetCompile(j)) nbError++; } } @@ -6339,6 +6048,9 @@ void CRobotMain::IOWriteObject(FILE *file, CObject* obj, const char *cmd) sprintf(name, " trainer=%d", obj->GetTrainer()); strcat(line, name); + + sprintf(name, " ignoreBuildCheck=%d", obj->GetIgnoreBuildCheck()); + strcat(line, name); sprintf(name, " option=%d", obj->GetOption()); strcat(line, name); @@ -6496,10 +6208,11 @@ CObject* CRobotMain::IOReadObject(char *line, const char* filename, int objRank) int toy = OpInt(line, "toy", 0); int option = OpInt(line, "option", 0); - CObject* obj = CreateObject(pos, dir.y, 1.0f, 0.0f, type, 0.0f, trainer, toy, option); + CObject* obj = CObjectManager::GetInstancePointer()->CreateObject(pos, dir.y, type, 0.0f, 1.0f, 0.0f, trainer, toy, option); obj->SetDefRank(objRank); obj->SetPosition(0, pos); obj->SetAngle(0, dir); + obj->SetIgnoreBuildCheck(OpInt(line, "ignoreBuildCheck", 0)); obj->SetID(id); if (g_id < id) g_id = id; @@ -6858,6 +6571,8 @@ void CRobotMain::ResetCreate() iMan->Flush(CLASS_PHYSICS); iMan->Flush(CLASS_BRAIN); iMan->Flush(CLASS_PYRO); + + CObjectManager::GetInstancePointer()->Flush(); m_camera->SetType(Gfx::CAM_TYPE_DIALOG); @@ -6912,8 +6627,13 @@ void CRobotMain::UpdateAudio(bool frame) { type = OBJECT_SCRAP1; } + + ToolType tool = CObject::GetToolFromObject(type); + DriveType drive = CObject::GetDriveFromObject(type); + if (m_audioChange[t].tool != TOOL_OTHER) if(tool != m_audioChange[t].tool) continue; + if (m_audioChange[t].drive != DRIVE_OTHER) if(drive != m_audioChange[t].drive) continue; - if (type != m_audioChange[t].type) continue; + if (m_audioChange[t].tool == TOOL_OTHER && m_audioChange[t].drive == DRIVE_OTHER) if (type != m_audioChange[t].type) continue; float energyLevel = -1; CObject* power = obj->GetPower(); @@ -6922,7 +6642,8 @@ void CRobotMain::UpdateAudio(bool frame) energyLevel = power->GetEnergy(); if (power->GetType() == OBJECT_ATOMIC) energyLevel *= 100; } - if (energyLevel < m_audioChange[t].powermin || energyLevel > m_audioChange[t].powermax) continue; + if (energyLevel < m_audioChange[t].powermin || energyLevel > m_audioChange[t].powermax) + continue; if (obj->GetTruck() == 0) oPos = obj->GetPosition(0); @@ -6938,8 +6659,7 @@ void CRobotMain::UpdateAudio(bool frame) if (nb >= m_audioChange[t].min && nb <= m_audioChange[t].max) { - CLogger::GetInstancePointer()->Debug("Changing music...\n"); - m_sound->StopMusic(); + CLogger::GetInstancePointer()->Info("Changing music to \"%s\"\n", m_audioChange[t].music); m_sound->PlayMusic(std::string(m_audioChange[t].music), m_audioChange[t].repeat); m_audioChange[t].changed = true; } @@ -7017,7 +6737,12 @@ Error CRobotMain::CheckEndMission(bool frame) type = OBJECT_SCRAP1; } - if (type != m_endTake[t].type) continue; + ToolType tool = CObject::GetToolFromObject(type); + DriveType drive = CObject::GetDriveFromObject(type); + if (m_endTake[t].tool != TOOL_OTHER) if(tool != m_endTake[t].tool) continue; + if (m_endTake[t].drive != DRIVE_OTHER) if(drive != m_endTake[t].drive) continue; + + if (m_endTake[t].tool == TOOL_OTHER && m_endTake[t].drive == DRIVE_OTHER) if (type != m_endTake[t].type) continue; float energyLevel = -1; CObject* power = obj->GetPower(); @@ -7318,14 +7043,16 @@ float CRobotMain::GetPersoAngle() //! Changes on the pause mode -void CRobotMain::ChangePause(bool pause) +void CRobotMain::ChangePause(PauseType pause) { - m_pause = pause; - m_engine->SetPause(m_pause); + if(pause != PAUSE_NONE) + m_pause->SetPause(pause); + else + m_pause->ClearPause(); - m_sound->MuteAll(m_pause); + m_sound->MuteAll(m_pause->GetPause()); CreateShortcuts(); - if (m_pause) HiliteClear(); + if (m_pause->GetPause()) HiliteClear(); } @@ -7495,8 +7222,27 @@ void CRobotMain::StartMusic() CLogger::GetInstancePointer()->Debug("Starting music...\n"); if (m_audioTrack != "") { - m_sound->StopMusic(); - m_sound->PlayMusic(m_audioTrack, m_audioRepeat); + m_sound->PlayMusic(m_audioTrack, m_audioRepeat, 0.0f); + } +} + +//! Starts pause music +void CRobotMain::StartPauseMusic(PauseType pause) +{ + switch(pause) { + case PAUSE_EDITOR: + if(m_editorTrack != "") + m_sound->PlayPauseMusic(m_editorTrack, m_editorRepeat); + break; + + case PAUSE_SATCOM: + if(m_satcomTrack != "") + m_sound->PlayPauseMusic(m_satcomTrack, m_satcomRepeat); + break; + + default: + // Don't change music + break; } } @@ -7504,7 +7250,7 @@ void CRobotMain::StartMusic() void CRobotMain::ClearInterface() { HiliteClear(); // removes setting evidence - m_tooltipName[0] = 0; // really removes the tooltip + m_tooltipName.clear(); // really removes the tooltip } void CRobotMain::SetNumericLocale() diff --git a/src/object/robotmain.h b/src/object/robotmain.h index 035698c..71ad455 100644 --- a/src/object/robotmain.h +++ b/src/object/robotmain.h @@ -30,6 +30,8 @@ #include "object/object.h" #include "object/mainmovie.h" +#include "app/pausemanager.h" + #include <stdio.h> enum Phase @@ -44,7 +46,6 @@ enum Phase PHASE_FREE, PHASE_TEEN, PHASE_USER, - PHASE_PROTO, PHASE_LOADING, PHASE_SIMUL, PHASE_MODEL, @@ -104,6 +105,8 @@ struct EndTake int lost; // lost if <= float powermin; // wins if energy cell >= float powermax; // wins if energy cell <= + ToolType tool; + DriveType drive; bool immediat; char message[100]; }; @@ -117,6 +120,8 @@ struct AudioChange int max; // change if < float powermin; // change if energy cell >= float powermax; // change if energy cell <= + ToolType tool; + DriveType drive; char music[100]; bool repeat; bool changed; @@ -250,7 +255,7 @@ public: void SetTracePrecision(float factor); float GetTracePrecision(); - void ChangePause(bool pause); + void ChangePause(PauseType pause); void SetSpeed(float speed); float GetSpeed(); @@ -335,6 +340,7 @@ public: float GetPersoAngle(); void StartMusic(); + void StartPauseMusic(PauseType pause); void ClearInterface(); void ChangeColor(); @@ -391,14 +397,11 @@ protected: void CreateScene(bool soluce, bool fixScene, bool resetObject); Math::Vector LookatPoint(Math::Vector eye, float angleH, float angleV, float length); - CObject* CreateObject(Math::Vector pos, float angle, float zoom, - float height, ObjectType type, float power=1.0f, - bool trainer=false, bool toy=false, int option=0); int CreateLight(Math::Vector direction, Gfx::Color color); void HiliteClear(); void HiliteObject(Math::Point pos); void HiliteFrame(float rTime); - void CreateTooltip(Math::Point pos, const char* text); + void CreateTooltip(Math::Point pos, const std::string& text); void ClearTooltip(); CObject* DetectObject(Math::Point pos); void ChangeCamera(); @@ -440,6 +443,7 @@ protected: Ui::CDisplayText* m_displayText; Ui::CDisplayInfo* m_displayInfo; CSoundInterface* m_sound; + CPauseManager* m_pause; //! Bindings for user inputs InputBinding m_inputBindings[INPUT_SLOT_MAX]; @@ -471,15 +475,19 @@ protected: bool m_showSoluce; bool m_showAll; bool m_cheatRadar; - bool m_audioRepeat; bool m_shortCut; std::string m_audioTrack; + bool m_audioRepeat; + std::string m_satcomTrack; + bool m_satcomRepeat; + std::string m_editorTrack; + bool m_editorRepeat; int m_delayWriteMessage; int m_movieInfoIndex; CObject* m_controller; - //Level Checker flags + // Level Checker flags bool m_beginObject; bool m_terrainGenerate; bool m_terrainInitTextures; @@ -495,7 +503,6 @@ protected: bool m_satComLock; // call of SatCom is possible? bool m_editLock; // edition in progress? bool m_editFull; // edition in full screen? - bool m_pause; // simulation paused bool m_hilite; bool m_trainerPilot; // remote trainer? bool m_suspend; @@ -506,7 +513,7 @@ protected: char m_mapFilename[100]; Math::Point m_tooltipPos; - char m_tooltipName[100]; + std::string m_tooltipName; float m_tooltipTime; char m_infoFilename[SATCOM_MAX][100]; // names of text files @@ -522,6 +529,8 @@ protected: int m_endingWinRank; int m_endingLostRank; bool m_winTerminate; + + bool m_exitAfterMission; float m_fontSize; Math::Point m_windowPos; diff --git a/src/object/task/taskbuild.cpp b/src/object/task/taskbuild.cpp index 4a62a4a..4dfd6fb 100644 --- a/src/object/task/taskbuild.cpp +++ b/src/object/task/taskbuild.cpp @@ -100,6 +100,7 @@ bool CTaskBuild::CreateBuilding(Math::Vector pos, float angle) if ( m_type == OBJECT_PARA ) m_buildingHeight = 68.0f; if ( m_type == OBJECT_INFO ) m_buildingHeight = 19.0f; if ( m_type == OBJECT_DESTROYER) m_buildingHeight = 35.0f; + if ( m_type == OBJECT_HUSTON ) m_buildingHeight = 45.0f; m_buildingHeight *= 0.25f; m_buildingPos = m_building->GetPosition(0); @@ -574,7 +575,7 @@ Error CTaskBuild::FlatFloor() if ( m_type == OBJECT_PARA ) radius = 20.0f; if ( m_type == OBJECT_INFO ) radius = 5.0f; if ( m_type == OBJECT_DESTROYER) radius = 20.0f; - if ( radius == 0.0f ) return ERR_GENERIC; + //if ( radius == 0.0f ) return ERR_GENERIC; center = m_metal->GetPosition(0); angle = m_terrain->GetFineSlope(center); diff --git a/src/object/task/taskgoto.cpp b/src/object/task/taskgoto.cpp index 01ff38b..8070d13 100644 --- a/src/object/task/taskgoto.cpp +++ b/src/object/task/taskgoto.cpp @@ -1559,8 +1559,8 @@ void CTaskGoto::ComputeRepulse(Math::Point &dir) oType == OBJECT_BOMB || (oType >= OBJECT_PLANT0 && oType <= OBJECT_PLANT19 ) || - (oType >= OBJECT_MUSHROOM0 && - oType <= OBJECT_MUSHROOM9 ) ) continue; + (oType >= OBJECT_MUSHROOM1 && + oType <= OBJECT_MUSHROOM2 ) ) continue; } addi = add; diff --git a/src/object/task/taskgungoal.cpp b/src/object/task/taskgungoal.cpp index 3373610..c9c8d30 100644 --- a/src/object/task/taskgungoal.cpp +++ b/src/object/task/taskgungoal.cpp @@ -26,6 +26,7 @@ CTaskGunGoal::CTaskGunGoal(CObject* object) : CTask(object) { + m_aimImpossible = false; } // Object's destructor. @@ -116,6 +117,12 @@ Error CTaskGunGoal::Start(float dirV, float dirH) m_progress = 0.0f; + // direction was constrainted, hence resulting in impossible move + if (dirV != m_finalDirV || dirH != m_finalDirH) + { + m_aimImpossible = true; + } + return ERR_OK; } @@ -126,12 +133,25 @@ Error CTaskGunGoal::IsEnded() if ( m_engine->GetPause() ) return ERR_CONTINUE; if ( m_initialDirV == m_finalDirV && - m_initialDirH == m_finalDirH ) return ERR_STOP; - if ( m_progress < 1.0f ) return ERR_CONTINUE; + m_initialDirH == m_finalDirH ) + { + if ( m_aimImpossible ) + return ERR_AIM_IMPOSSIBLE; + else + return ERR_STOP; + } + + if ( m_progress < 1.0f ) return ERR_CONTINUE; m_object->SetGunGoalV(m_finalDirV); m_object->SetGunGoalH(m_finalDirH); Abort(); + + if ( m_aimImpossible ) + { + return ERR_AIM_IMPOSSIBLE; + } + return ERR_STOP; } diff --git a/src/object/task/taskgungoal.h b/src/object/task/taskgungoal.h index c6f010b..9fc509d 100644 --- a/src/object/task/taskgungoal.h +++ b/src/object/task/taskgungoal.h @@ -44,5 +44,7 @@ protected: float m_finalDirV; // direction to reach float m_initialDirH; // initial direction float m_finalDirH; // direction to reach + + bool m_aimImpossible; // set to true if impossible aim was set }; diff --git a/src/object/task/taskrecover.cpp b/src/object/task/taskrecover.cpp index af84099..d8bbafd 100644 --- a/src/object/task/taskrecover.cpp +++ b/src/object/task/taskrecover.cpp @@ -105,9 +105,11 @@ bool CTaskRecover::EventProcess(const Event &event) if ( power != 0 ) { energy = power->GetEnergy(); - power->SetEnergy(energy-ENERGY_RECOVER*event.rTime*m_speed); + energy -= event.rTime * ENERGY_RECOVER / power->GetCapacity() * m_speed; + power->SetEnergy(energy); } + speed.x = (Math::Rand()-0.5f)*0.1f*m_progress; speed.y = (Math::Rand()-0.5f)*0.1f*m_progress; speed.z = (Math::Rand()-0.5f)*0.1f*m_progress; diff --git a/src/object/task/taskterraform.cpp b/src/object/task/taskterraform.cpp index 096e5de..61ff045 100644 --- a/src/object/task/taskterraform.cpp +++ b/src/object/task/taskterraform.cpp @@ -76,15 +76,9 @@ bool CTaskTerraform::EventProcess(const Event &event) { if ( m_soundChannel == -1 ) { -#if _TEEN - m_soundChannel = m_sound->Play(SOUND_GGG, m_object->GetPosition(0), 1.0f, 0.5f, true); - m_sound->AddEnvelope(m_soundChannel, 1.0f, 2.0f, 1.5f, SOPER_CONTINUE); - m_sound->AddEnvelope(m_soundChannel, 0.0f, 0.5f, 0.5f, SOPER_STOP); -#else m_soundChannel = m_sound->Play(SOUND_GGG, m_object->GetPosition(0), 1.0f, 0.5f, true); m_sound->AddEnvelope(m_soundChannel, 1.0f, 2.0f, 4.0f, SOPER_CONTINUE); m_sound->AddEnvelope(m_soundChannel, 0.0f, 0.5f, 0.5f, SOPER_STOP); -#endif } dir.x = 0.0f; @@ -109,11 +103,7 @@ bool CTaskTerraform::EventProcess(const Event &event) if ( m_phase == TTP_DOWN ) { pos.x = 9.0f; -#if _TEEN - pos.y = 4.0f-m_progress*4.0f; -#else pos.y = 4.0f-m_progress*5.8f; -#endif pos.z = 0.0f; m_object->SetPosition(2, pos); } @@ -121,11 +111,7 @@ bool CTaskTerraform::EventProcess(const Event &event) if ( m_phase == TTP_UP ) { pos.x = 9.0f; -#if _TEEN - pos.y = 4.0f-(1.0f-m_progress)*4.0f; -#else pos.y = 4.0f-(1.0f-m_progress)*5.8f; -#endif pos.z = 0.0f; m_object->SetPosition(2, pos); } @@ -230,11 +216,7 @@ Error CTaskTerraform::Start() m_phase = TTP_CHARGE; m_progress = 0.0f; -#if _TEEN - m_speed = 1.0f/1.5f; -#else m_speed = 1.0f/4.0f; -#endif m_time = 0.0f; m_bError = false; // ok @@ -261,9 +243,6 @@ Error CTaskTerraform::IsEnded() if ( m_phase == TTP_CHARGE ) { -#if _TEEN - Terraform(); // changes the terrain. -#endif m_phase = TTP_DOWN; m_speed = 1.0f/0.2f; @@ -272,9 +251,7 @@ Error CTaskTerraform::IsEnded() if ( m_phase == TTP_DOWN ) { -#if !_TEEN Terraform(); // changes the terrain. -#endif m_object->SetCirVibration(Math::Vector(0.0f, 0.0f, 0.0f)); m_object->SetZoom(0, 1.0f); diff --git a/src/physics/physics.cpp b/src/physics/physics.cpp index 2c5f95e..a3aaa28 100644 --- a/src/physics/physics.cpp +++ b/src/physics/physics.cpp @@ -107,6 +107,9 @@ CPhysics::CPhysics(CObject* object) m_bFreeze = false; m_bForceUpdate = true; m_bLowLevel = false; + m_fallingHeight = 0.0f; + m_minFallingHeight = 20.0f; + m_fallDamageFraction = 0.007f; memset(&m_linMotion, 0, sizeof(Motion)); memset(&m_cirMotion, 0,sizeof(Motion)); @@ -786,6 +789,10 @@ void CPhysics::MotorUpdate(float aTime, float rTime) type = m_object->GetType(); + if(std::isnan(m_motorSpeed.x)) m_motorSpeed.x = 0.f; + if(std::isnan(m_motorSpeed.y)) m_motorSpeed.y = 0.f; + if(std::isnan(m_motorSpeed.z)) m_motorSpeed.z = 0.f; + motorSpeed = m_motorSpeed; if ( type == OBJECT_MOTHER || @@ -847,6 +854,7 @@ void CPhysics::MotorUpdate(float aTime, float rTime) else { motorSpeed.y = -1.0f; // grave + SetFalling(); } SetMotor(false); } @@ -911,6 +919,7 @@ void CPhysics::MotorUpdate(float aTime, float rTime) if ( m_reactorRange == 0.0f ) // reactor tilt? { motorSpeed.y = -1.0f; // grave + SetFalling(); } } @@ -1509,6 +1518,7 @@ bool CPhysics::EventFrame(const Event &event) if ( pos.y < m_water->GetLevel(m_object) ) // underwater? { h *= 0.5f; + m_fallingHeight = 0.0f; // can't fall underwater } #endif //? m_linMotion.terrainSpeed.x = -tAngle.z*m_linMotion.terrainForce.x*h; @@ -1601,6 +1611,13 @@ bool CPhysics::EventFrame(const Event &event) MotorParticle(m_time, event.rTime); SoundMotor(event.rTime); + if ( m_bLand && m_fallingHeight != 0.0f ) // if fell + { + float force = (m_fallingHeight - m_object->GetPosition(0).y) * m_fallDamageFraction; + m_object->ExploObject(EXPLO_BOUM, force); + m_fallingHeight = 0.0f; + } + m_bForceUpdate = false; return true; @@ -2561,19 +2578,13 @@ int CPhysics::ObjectAdapt(const Math::Vector &pos, const Math::Vector &angle) oType == OBJECT_KEYd || oType == OBJECT_TNT || (oType >= OBJECT_PLANT0 && oType <= OBJECT_PLANT19 ) || - (oType >= OBJECT_MUSHROOM0 && oType <= OBJECT_MUSHROOM9) ) continue; + (oType >= OBJECT_MUSHROOM1 && oType <= OBJECT_MUSHROOM2) ) continue; } -#if _TEEN - if ( oType == OBJECT_WAYPOINT && - pObj->GetEnable() && - !m_object->GetResetBusy() ) // driving vehicle? -#else if ( oType == OBJECT_WAYPOINT && pObj->GetEnable() && !m_object->GetResetBusy() && m_object->GetTrainer() ) // driving vehicle? -#endif { oPos = pObj->GetPosition(0); distance = Math::DistanceProjected(oPos, iPos); @@ -2979,15 +2990,15 @@ void CPhysics::FrameParticle(float aTime, float rTime) { Math::Vector pos; CObject* power; - float energy, intensity; + float energy/*, intensity*/; int effectLight; - bool bFlash; + //bool bFlash; m_restBreakParticle -= rTime; if ( aTime-m_lastPowerParticle < m_engine->ParticleAdapt(0.05f) ) return; m_lastPowerParticle = aTime; - bFlash = false; + //bFlash = false; energy = 0.0f; power = m_object->GetPower(); @@ -3001,7 +3012,7 @@ void CPhysics::FrameParticle(float aTime, float rTime) if ( energy > m_lastEnergy ) // recharge? { PowerParticle(1.0f, false); - bFlash = true; + //bFlash = true; } if ( energy == 0.0f || m_lastEnergy == 0.0f ) @@ -3015,7 +3026,7 @@ void CPhysics::FrameParticle(float aTime, float rTime) if ( m_restBreakParticle > 0.0f ) { PowerParticle(m_restBreakParticle/2.5f, (energy == 0)); - bFlash = true; + //bFlash = true; } effectLight = m_object->GetEffectLight(); @@ -3881,3 +3892,36 @@ Error CPhysics::GetError() return ERR_OK; } +void CPhysics::SetFalling() +{ + if (m_fallingHeight == 0.0f && m_floorHeight >= m_minFallingHeight) + m_fallingHeight = m_object->GetPosition(0).y; +} + +float CPhysics::GetFallingHeight() +{ + return m_fallingHeight; +} + +void CPhysics::SetMinFallingHeight(float value) +{ + if (value < 0.0f) return; + m_minFallingHeight = value; +} + +float CPhysics::GetMinFallingHeight() +{ + return m_minFallingHeight; +} + +void CPhysics::SetFallDamageFraction(float value) +{ + if (value < 0.0f) return; + m_fallDamageFraction = value; +} + +float CPhysics::GetFallDamageFraction() +{ + return m_fallDamageFraction; +} + diff --git a/src/physics/physics.h b/src/physics/physics.h index 834d7b8..fea5601 100644 --- a/src/physics/physics.h +++ b/src/physics/physics.h @@ -165,6 +165,14 @@ public: void CreateInterface(bool bSelect); Error GetError(); + float GetFallingHeight(); + + void SetMinFallingHeight(float value); + float GetMinFallingHeight(); + + void SetFallDamageFraction(float value); + float GetFallDamageFraction(); + protected: bool EventFrame(const Event &event); void WaterFrame(float aTime, float rTime); @@ -191,6 +199,7 @@ protected: void MotorParticle(float aTime, float rTime); void WaterParticle(float aTime, Math::Vector pos, ObjectType type, float floor, float advance, float turn); void WheelParticle(int color, float width); + void SetFalling(); protected: Gfx::CEngine* m_engine; @@ -240,13 +249,16 @@ protected: float m_restBreakParticle; float m_floorLevel; // ground level float m_floorHeight; // height above the ground - int m_soundChannel; - int m_soundChannelSlide; + int m_soundChannel; + int m_soundChannelSlide; float m_soundTimePshhh; float m_soundTimeJostle; float m_soundTimeBoum; bool m_bSoundSlow; bool m_bForceUpdate; bool m_bLowLevel; + float m_fallingHeight; + float m_fallDamageFraction; + float m_minFallingHeight; }; diff --git a/src/script/cbottoken.cpp b/src/script/cbottoken.cpp index 505228e..81219df 100644 --- a/src/script/cbottoken.cpp +++ b/src/script/cbottoken.cpp @@ -253,10 +253,11 @@ std::string GetHelpFilename(const char *token) if ( strcmp(token, "getresearchenable" ) == 0 ) return std::string("help/") + CApplication::GetInstancePointer()->GetLanguageChar() + std::string("/cbot/getresen.txt"); if ( strcmp(token, "getresearchdone" ) == 0 ) return std::string("help/") + CApplication::GetInstancePointer()->GetLanguageChar() + std::string("/cbot/getresdo.txt"); if ( strcmp(token, "retobject" ) == 0 ) return std::string("help/") + CApplication::GetInstancePointer()->GetLanguageChar() + std::string("/cbot/retobj.txt"); - if ( strcmp(token, "progfunc" ) == 0 ) return std::string("help/") + CApplication::GetInstancePointer()->GetLanguageChar() + std::string("/cbot/factory.txt"); - if ( strcmp(token, "busy" ) == 0 ) return std::string("help/") + CApplication::GetInstancePointer()->GetLanguageChar() + std::string("/cbot/busy.txt"); - if ( strcmp(token, "factory" ) == 0 ) return std::string("help/") + CApplication::GetInstancePointer()->GetLanguageChar() + std::string("/cbot/factory.txt"); + if ( strcmp(token, "progfunc" ) == 0 ) return std::string("help/") + CApplication::GetInstancePointer()->GetLanguageChar() + std::string("/cbot/factory.txt"); + if ( strcmp(token, "busy" ) == 0 ) return std::string("help/") + CApplication::GetInstancePointer()->GetLanguageChar() + std::string("/cbot/busy.txt"); + if ( strcmp(token, "takeoff" ) == 0 ) return std::string("help/") + CApplication::GetInstancePointer()->GetLanguageChar() + std::string("/cbot/takeoff.txt"); if ( strcmp(token, "research" ) == 0 ) return std::string("help/") + CApplication::GetInstancePointer()->GetLanguageChar() + std::string("/cbot/research.txt"); + if ( strcmp(token, "factory" ) == 0 ) return std::string("help/") + CApplication::GetInstancePointer()->GetLanguageChar() + std::string("/cbot/factory.txt"); if ( strcmp(token, "destroy" ) == 0 ) return std::string("help/") + CApplication::GetInstancePointer()->GetLanguageChar() + std::string("/cbot/destroy.txt"); if ( strcmp(token, "search" ) == 0 ) return std::string("help/") + CApplication::GetInstancePointer()->GetLanguageChar() + std::string("/cbot/search.txt"); if ( strcmp(token, "radar" ) == 0 ) return std::string("help/") + CApplication::GetInstancePointer()->GetLanguageChar() + std::string("/cbot/radar.txt"); @@ -333,6 +334,7 @@ std::string GetHelpFilename(const char *token) if ( strcmp(token, "penup" ) == 0 ) return std::string("help/") + CApplication::GetInstancePointer()->GetLanguageChar() + std::string("/cbot/penup.txt"); if ( strcmp(token, "pencolor" ) == 0 ) return std::string("help/") + CApplication::GetInstancePointer()->GetLanguageChar() + std::string("/cbot/pencolor.txt"); if ( strcmp(token, "penwidth" ) == 0 ) return std::string("help/") + CApplication::GetInstancePointer()->GetLanguageChar() + std::string("/cbot/penwidth.txt"); + if ( strcmp(token, "camerafocus" ) == 0 ) return std::string("help/") + CApplication::GetInstancePointer()->GetLanguageChar() + std::string("/cbot/camerafocus.txt"); if ( strcmp(token, "extern" ) == 0 ) return std::string("help/") + CApplication::GetInstancePointer()->GetLanguageChar() + std::string("/cbot/extern.txt"); if ( strcmp(token, "class" ) == 0 ) return std::string("help/") + CApplication::GetInstancePointer()->GetLanguageChar() + std::string("/cbot/class.txt"); if ( strcmp(token, "static" ) == 0 ) return std::string("help/") + CApplication::GetInstancePointer()->GetLanguageChar() + std::string("/cbot/static.txt"); @@ -384,6 +386,7 @@ bool IsFunction(const char *token) if ( strcmp(token, "busy" ) == 0 ) return true; if ( strcmp(token, "factory" ) == 0 ) return true; if ( strcmp(token, "research" ) == 0 ) return true; + if ( strcmp(token, "takeoff" ) == 0 ) return true; if ( strcmp(token, "destroy" ) == 0 ) return true; if ( strcmp(token, "search" ) == 0 ) return true; if ( strcmp(token, "radar" ) == 0 ) return true; @@ -439,6 +442,7 @@ bool IsFunction(const char *token) if ( strcmp(token, "penup" ) == 0 ) return true; if ( strcmp(token, "pencolor" ) == 0 ) return true; if ( strcmp(token, "penwidth" ) == 0 ) return true; + if ( strcmp(token, "camerafocus" ) == 0 ) return true; if ( strcmp(token, "sizeof" ) == 0 ) return true; return false; } @@ -477,6 +481,7 @@ const char* GetHelpText(const char *token) if ( strcmp(token, "busy" ) == 0 ) return "object.busy ( );"; if ( strcmp(token, "factory" ) == 0 ) return "object.factory ( cat, program );"; if ( strcmp(token, "research" ) == 0 ) return "object.research ( type );"; + if ( strcmp(token, "takeoff" ) == 0 ) return "object.takeoff ( );"; if ( strcmp(token, "destroy" ) == 0 ) return "object.destroy ( );"; if ( strcmp(token, "search" ) == 0 ) return "search ( );"; if ( strcmp(token, "radar" ) == 0 ) return "radar ( cat, angle, focus, min, max, sens );"; @@ -532,6 +537,7 @@ const char* GetHelpText(const char *token) if ( strcmp(token, "penup" ) == 0 ) return "penup ( );"; if ( strcmp(token, "pencolor" ) == 0 ) return "pencolor ( color );"; if ( strcmp(token, "penwidth" ) == 0 ) return "penwidth ( width );"; + if ( strcmp(token, "camerafocus") == 0 ) return "camerafocus ( object );"; return ""; } diff --git a/src/script/cmdtoken.cpp b/src/script/cmdtoken.cpp index 69df68b..6393505 100644 --- a/src/script/cmdtoken.cpp +++ b/src/script/cmdtoken.cpp @@ -35,6 +35,16 @@ char* SkipSpace(char *line) return line; } +std::string GetCmd(char* line) +{ + line = SkipSpace(line); + + int len = 0; + for(char* x = line; *x != 0 && *x != ' ' && *x != '\t' && *x != '\n'; x++, len++); + + return std::string(line, len); +} + // Checks if a line contains a command. bool Cmd(char *line, const char *token) @@ -42,8 +52,15 @@ bool Cmd(char *line, const char *token) char* p; line = SkipSpace(line); + p = strstr(line, token); - return ( p == line ); // command at the beginning? + if(p != line) return false; // command at the beginning? + + unsigned int len = 0; + for(char* x = p; *x != 0 && *x != ' ' && *x != '\t' && *x != '\n'; x++, len++); + if(len != strlen(token)) return false; // ends with space? + + return true; } // Seeking an operator. @@ -238,16 +255,6 @@ ObjectType GetTypeObject(char *line, int rank, ObjectType def) if ( Cmd(p, "Mine" ) ) return OBJECT_BOMB; if ( Cmd(p, "Firework" ) ) return OBJECT_WINFIRE; if ( Cmd(p, "Bag" ) ) return OBJECT_BAG; - if ( Cmd(p, "Greenery10" ) ) return OBJECT_PLANT10; - if ( Cmd(p, "Greenery11" ) ) return OBJECT_PLANT11; - if ( Cmd(p, "Greenery12" ) ) return OBJECT_PLANT12; - if ( Cmd(p, "Greenery13" ) ) return OBJECT_PLANT13; - if ( Cmd(p, "Greenery14" ) ) return OBJECT_PLANT14; - if ( Cmd(p, "Greenery15" ) ) return OBJECT_PLANT15; - if ( Cmd(p, "Greenery16" ) ) return OBJECT_PLANT16; - if ( Cmd(p, "Greenery17" ) ) return OBJECT_PLANT17; - if ( Cmd(p, "Greenery18" ) ) return OBJECT_PLANT18; - if ( Cmd(p, "Greenery19" ) ) return OBJECT_PLANT19; if ( Cmd(p, "Greenery0" ) ) return OBJECT_PLANT0; if ( Cmd(p, "Greenery1" ) ) return OBJECT_PLANT1; if ( Cmd(p, "Greenery2" ) ) return OBJECT_PLANT2; @@ -258,26 +265,24 @@ ObjectType GetTypeObject(char *line, int rank, ObjectType def) if ( Cmd(p, "Greenery7" ) ) return OBJECT_PLANT7; if ( Cmd(p, "Greenery8" ) ) return OBJECT_PLANT8; if ( Cmd(p, "Greenery9" ) ) return OBJECT_PLANT9; + if ( Cmd(p, "Greenery10" ) ) return OBJECT_PLANT10; + if ( Cmd(p, "Greenery11" ) ) return OBJECT_PLANT11; + if ( Cmd(p, "Greenery12" ) ) return OBJECT_PLANT12; + if ( Cmd(p, "Greenery13" ) ) return OBJECT_PLANT13; + if ( Cmd(p, "Greenery14" ) ) return OBJECT_PLANT14; + if ( Cmd(p, "Greenery15" ) ) return OBJECT_PLANT15; + if ( Cmd(p, "Greenery16" ) ) return OBJECT_PLANT16; + if ( Cmd(p, "Greenery17" ) ) return OBJECT_PLANT17; + if ( Cmd(p, "Greenery18" ) ) return OBJECT_PLANT18; + if ( Cmd(p, "Greenery19" ) ) return OBJECT_PLANT19; if ( Cmd(p, "Tree0" ) ) return OBJECT_TREE0; if ( Cmd(p, "Tree1" ) ) return OBJECT_TREE1; if ( Cmd(p, "Tree2" ) ) return OBJECT_TREE2; if ( Cmd(p, "Tree3" ) ) return OBJECT_TREE3; if ( Cmd(p, "Tree4" ) ) return OBJECT_TREE4; if ( Cmd(p, "Tree5" ) ) return OBJECT_TREE5; - if ( Cmd(p, "Tree6" ) ) return OBJECT_TREE6; - if ( Cmd(p, "Tree7" ) ) return OBJECT_TREE7; - if ( Cmd(p, "Tree8" ) ) return OBJECT_TREE8; - if ( Cmd(p, "Tree9" ) ) return OBJECT_TREE9; - if ( Cmd(p, "Mushroom0" ) ) return OBJECT_MUSHROOM0; if ( Cmd(p, "Mushroom1" ) ) return OBJECT_MUSHROOM1; if ( Cmd(p, "Mushroom2" ) ) return OBJECT_MUSHROOM2; - if ( Cmd(p, "Mushroom3" ) ) return OBJECT_MUSHROOM3; - if ( Cmd(p, "Mushroom4" ) ) return OBJECT_MUSHROOM4; - if ( Cmd(p, "Mushroom5" ) ) return OBJECT_MUSHROOM5; - if ( Cmd(p, "Mushroom6" ) ) return OBJECT_MUSHROOM6; - if ( Cmd(p, "Mushroom7" ) ) return OBJECT_MUSHROOM7; - if ( Cmd(p, "Mushroom8" ) ) return OBJECT_MUSHROOM8; - if ( Cmd(p, "Mushroom9" ) ) return OBJECT_MUSHROOM9; if ( Cmd(p, "Home" ) ) return OBJECT_HOME1; if ( Cmd(p, "Derrick" ) ) return OBJECT_DERRICK; if ( Cmd(p, "BotFactory" ) ) return OBJECT_FACTORY; @@ -323,47 +328,6 @@ ObjectType GetTypeObject(char *line, int rank, ObjectType def) if ( Cmd(p, "Barrier1" ) ) return OBJECT_BARRIER1; if ( Cmd(p, "Barrier2" ) ) return OBJECT_BARRIER2; if ( Cmd(p, "Barrier3" ) ) return OBJECT_BARRIER3; - if ( Cmd(p, "Barrier4" ) ) return OBJECT_BARRIER4; - if ( Cmd(p, "Teen40" ) ) return OBJECT_TEEN40; - if ( Cmd(p, "Teen41" ) ) return OBJECT_TEEN41; - if ( Cmd(p, "Teen42" ) ) return OBJECT_TEEN42; - if ( Cmd(p, "Teen43" ) ) return OBJECT_TEEN43; - if ( Cmd(p, "Teen44" ) ) return OBJECT_TEEN44; - if ( Cmd(p, "Teen45" ) ) return OBJECT_TEEN45; - if ( Cmd(p, "Teen46" ) ) return OBJECT_TEEN46; - if ( Cmd(p, "Teen47" ) ) return OBJECT_TEEN47; - if ( Cmd(p, "Teen48" ) ) return OBJECT_TEEN48; - if ( Cmd(p, "Teen49" ) ) return OBJECT_TEEN49; - if ( Cmd(p, "Teen30" ) ) return OBJECT_TEEN30; - if ( Cmd(p, "Teen31" ) ) return OBJECT_TEEN31; - if ( Cmd(p, "Teen32" ) ) return OBJECT_TEEN32; - if ( Cmd(p, "Teen33" ) ) return OBJECT_TEEN33; - if ( Cmd(p, "Stone" ) ) return OBJECT_TEEN34; - if ( Cmd(p, "Teen35" ) ) return OBJECT_TEEN35; - if ( Cmd(p, "Teen36" ) ) return OBJECT_TEEN36; - if ( Cmd(p, "Teen37" ) ) return OBJECT_TEEN37; - if ( Cmd(p, "Teen38" ) ) return OBJECT_TEEN38; - if ( Cmd(p, "Teen39" ) ) return OBJECT_TEEN39; - if ( Cmd(p, "Teen20" ) ) return OBJECT_TEEN20; - if ( Cmd(p, "Teen21" ) ) return OBJECT_TEEN21; - if ( Cmd(p, "Teen22" ) ) return OBJECT_TEEN22; - if ( Cmd(p, "Teen23" ) ) return OBJECT_TEEN23; - if ( Cmd(p, "Teen24" ) ) return OBJECT_TEEN24; - if ( Cmd(p, "Teen25" ) ) return OBJECT_TEEN25; - if ( Cmd(p, "Teen26" ) ) return OBJECT_TEEN26; - if ( Cmd(p, "Teen27" ) ) return OBJECT_TEEN27; - if ( Cmd(p, "Teen28" ) ) return OBJECT_TEEN28; - if ( Cmd(p, "Teen29" ) ) return OBJECT_TEEN29; - if ( Cmd(p, "Teen10" ) ) return OBJECT_TEEN10; - if ( Cmd(p, "Teen11" ) ) return OBJECT_TEEN11; - if ( Cmd(p, "Teen12" ) ) return OBJECT_TEEN12; - if ( Cmd(p, "Teen13" ) ) return OBJECT_TEEN13; - if ( Cmd(p, "Teen14" ) ) return OBJECT_TEEN14; - if ( Cmd(p, "Teen15" ) ) return OBJECT_TEEN15; - if ( Cmd(p, "Teen16" ) ) return OBJECT_TEEN16; - if ( Cmd(p, "Teen17" ) ) return OBJECT_TEEN17; - if ( Cmd(p, "Teen18" ) ) return OBJECT_TEEN18; - if ( Cmd(p, "Teen19" ) ) return OBJECT_TEEN19; if ( Cmd(p, "Teen0" ) ) return OBJECT_TEEN0; if ( Cmd(p, "Teen1" ) ) return OBJECT_TEEN1; if ( Cmd(p, "Teen2" ) ) return OBJECT_TEEN2; @@ -374,26 +338,51 @@ ObjectType GetTypeObject(char *line, int rank, ObjectType def) if ( Cmd(p, "Teen7" ) ) return OBJECT_TEEN7; if ( Cmd(p, "Teen8" ) ) return OBJECT_TEEN8; if ( Cmd(p, "Teen9" ) ) return OBJECT_TEEN9; + if ( Cmd(p, "Teen10" ) ) return OBJECT_TEEN10; + if ( Cmd(p, "Teen11" ) ) return OBJECT_TEEN11; + if ( Cmd(p, "Teen12" ) ) return OBJECT_TEEN12; + if ( Cmd(p, "Teen13" ) ) return OBJECT_TEEN13; + if ( Cmd(p, "Teen14" ) ) return OBJECT_TEEN14; + if ( Cmd(p, "Teen15" ) ) return OBJECT_TEEN15; + if ( Cmd(p, "Teen16" ) ) return OBJECT_TEEN16; + if ( Cmd(p, "Teen17" ) ) return OBJECT_TEEN17; + if ( Cmd(p, "Teen18" ) ) return OBJECT_TEEN18; + if ( Cmd(p, "Teen19" ) ) return OBJECT_TEEN19; + if ( Cmd(p, "Teen20" ) ) return OBJECT_TEEN20; + if ( Cmd(p, "Teen21" ) ) return OBJECT_TEEN21; + if ( Cmd(p, "Teen22" ) ) return OBJECT_TEEN22; + if ( Cmd(p, "Teen23" ) ) return OBJECT_TEEN23; + if ( Cmd(p, "Teen24" ) ) return OBJECT_TEEN24; + if ( Cmd(p, "Teen25" ) ) return OBJECT_TEEN25; + if ( Cmd(p, "Teen26" ) ) return OBJECT_TEEN26; + if ( Cmd(p, "Teen27" ) ) return OBJECT_TEEN27; + if ( Cmd(p, "Teen28" ) ) return OBJECT_TEEN28; + if ( Cmd(p, "Teen29" ) ) return OBJECT_TEEN29; + if ( Cmd(p, "Teen30" ) ) return OBJECT_TEEN30; + if ( Cmd(p, "Teen31" ) ) return OBJECT_TEEN31; + if ( Cmd(p, "Teen32" ) ) return OBJECT_TEEN32; + if ( Cmd(p, "Teen33" ) ) return OBJECT_TEEN33; + if ( Cmd(p, "Stone" ) ) return OBJECT_TEEN34; + if ( Cmd(p, "Teen35" ) ) return OBJECT_TEEN35; + if ( Cmd(p, "Teen36" ) ) return OBJECT_TEEN36; + if ( Cmd(p, "Teen37" ) ) return OBJECT_TEEN37; + if ( Cmd(p, "Teen38" ) ) return OBJECT_TEEN38; + if ( Cmd(p, "Teen39" ) ) return OBJECT_TEEN39; + if ( Cmd(p, "Teen40" ) ) return OBJECT_TEEN40; + if ( Cmd(p, "Teen41" ) ) return OBJECT_TEEN41; + if ( Cmd(p, "Teen42" ) ) return OBJECT_TEEN42; + if ( Cmd(p, "Teen43" ) ) return OBJECT_TEEN43; + if ( Cmd(p, "Teen44" ) ) return OBJECT_TEEN44; if ( Cmd(p, "Quartz0" ) ) return OBJECT_QUARTZ0; if ( Cmd(p, "Quartz1" ) ) return OBJECT_QUARTZ1; if ( Cmd(p, "Quartz2" ) ) return OBJECT_QUARTZ2; if ( Cmd(p, "Quartz3" ) ) return OBJECT_QUARTZ3; - if ( Cmd(p, "Quartz4" ) ) return OBJECT_QUARTZ4; - if ( Cmd(p, "Quartz5" ) ) return OBJECT_QUARTZ5; - if ( Cmd(p, "Quartz6" ) ) return OBJECT_QUARTZ6; - if ( Cmd(p, "Quartz7" ) ) return OBJECT_QUARTZ7; - if ( Cmd(p, "Quartz8" ) ) return OBJECT_QUARTZ8; - if ( Cmd(p, "Quartz9" ) ) return OBJECT_QUARTZ9; if ( Cmd(p, "MegaStalk0" ) ) return OBJECT_ROOT0; if ( Cmd(p, "MegaStalk1" ) ) return OBJECT_ROOT1; if ( Cmd(p, "MegaStalk2" ) ) return OBJECT_ROOT2; if ( Cmd(p, "MegaStalk3" ) ) return OBJECT_ROOT3; if ( Cmd(p, "MegaStalk4" ) ) return OBJECT_ROOT4; if ( Cmd(p, "MegaStalk5" ) ) return OBJECT_ROOT5; - if ( Cmd(p, "MegaStalk6" ) ) return OBJECT_ROOT6; - if ( Cmd(p, "MegaStalk7" ) ) return OBJECT_ROOT7; - if ( Cmd(p, "MegaStalk8" ) ) return OBJECT_ROOT8; - if ( Cmd(p, "MegaStalk9" ) ) return OBJECT_ROOT9; if ( Cmd(p, "ApolloLEM" ) ) return OBJECT_APOLLO1; if ( Cmd(p, "ApolloJeep" ) ) return OBJECT_APOLLO2; if ( Cmd(p, "ApolloFlag" ) ) return OBJECT_APOLLO3; @@ -438,11 +427,7 @@ const char* GetTypeObject(ObjectType type) if ( type == OBJECT_MOBILEdr ) return "Scribbler"; if ( type == OBJECT_MARKPOWER ) return "PowerSpot"; if ( type == OBJECT_MARKSTONE ) return "TitaniumSpot"; -#if _GERMAN | _WG - if ( type == OBJECT_MARKURANIUM ) return "PlatinumSpot"; -#else if ( type == OBJECT_MARKURANIUM ) return "UraniumSpot"; -#endif if ( type == OBJECT_MARKKEYa ) return "KeyASpot"; if ( type == OBJECT_MARKKEYb ) return "KeyBSpot"; if ( type == OBJECT_MARKKEYc ) return "KeyCSpot"; @@ -454,17 +439,9 @@ const char* GetTypeObject(ObjectType type) if ( type == OBJECT_FLAGy ) return "YellowFlag"; if ( type == OBJECT_FLAGv ) return "VioletFlag"; if ( type == OBJECT_POWER ) return "PowerCell"; -#if _GERMAN | _WG - if ( type == OBJECT_ATOMIC ) return "FuelCell"; -#else if ( type == OBJECT_ATOMIC ) return "NuclearCell"; -#endif if ( type == OBJECT_STONE ) return "TitaniumOre"; -#if _GERMAN | _WG - if ( type == OBJECT_URANIUM ) return "PlatinumOre"; -#else if ( type == OBJECT_URANIUM ) return "UraniumOre"; -#endif if ( type == OBJECT_METAL ) return "Titanium"; if ( type == OBJECT_BULLET ) return "OrgaMatter"; if ( type == OBJECT_BBOX ) return "BlackBox"; @@ -507,20 +484,8 @@ const char* GetTypeObject(ObjectType type) if ( type == OBJECT_TREE3 ) return "Tree3"; if ( type == OBJECT_TREE4 ) return "Tree4"; if ( type == OBJECT_TREE5 ) return "Tree5"; - if ( type == OBJECT_TREE6 ) return "Tree6"; - if ( type == OBJECT_TREE7 ) return "Tree7"; - if ( type == OBJECT_TREE8 ) return "Tree8"; - if ( type == OBJECT_TREE9 ) return "Tree9"; - if ( type == OBJECT_MUSHROOM0 ) return "Mushroom0"; if ( type == OBJECT_MUSHROOM1 ) return "Mushroom1"; if ( type == OBJECT_MUSHROOM2 ) return "Mushroom2"; - if ( type == OBJECT_MUSHROOM3 ) return "Mushroom3"; - if ( type == OBJECT_MUSHROOM4 ) return "Mushroom4"; - if ( type == OBJECT_MUSHROOM5 ) return "Mushroom5"; - if ( type == OBJECT_MUSHROOM6 ) return "Mushroom6"; - if ( type == OBJECT_MUSHROOM7 ) return "Mushroom7"; - if ( type == OBJECT_MUSHROOM8 ) return "Mushroom8"; - if ( type == OBJECT_MUSHROOM9 ) return "Mushroom9"; if ( type == OBJECT_HOME1 ) return "Home"; if ( type == OBJECT_DERRICK ) return "Derrick"; if ( type == OBJECT_FACTORY ) return "BotFactory"; @@ -535,11 +500,7 @@ const char* GetTypeObject(ObjectType type) if ( type == OBJECT_INFO ) return "ExchangePost"; if ( type == OBJECT_ENERGY ) return "PowerPlant"; if ( type == OBJECT_LABO ) return "AutoLab"; -#if _GERMAN | _WG - if ( type == OBJECT_NUCLEAR ) return "FuelCellPlant"; -#else if ( type == OBJECT_NUCLEAR ) return "NuclearPlant"; -#endif if ( type == OBJECT_PARA ) return "PowerCaptor"; if ( type == OBJECT_SAFE ) return "Vault"; if ( type == OBJECT_HUSTON ) return "Houston"; @@ -570,7 +531,6 @@ const char* GetTypeObject(ObjectType type) if ( type == OBJECT_BARRIER1 ) return "Barrier1"; if ( type == OBJECT_BARRIER2 ) return "Barrier2"; if ( type == OBJECT_BARRIER3 ) return "Barrier3"; - if ( type == OBJECT_BARRIER4 ) return "Barrier4"; if ( type == OBJECT_TEEN0 ) return "Teen0"; if ( type == OBJECT_TEEN1 ) return "Teen1"; if ( type == OBJECT_TEEN2 ) return "Teen2"; @@ -616,31 +576,16 @@ const char* GetTypeObject(ObjectType type) if ( type == OBJECT_TEEN42 ) return "Teen42"; if ( type == OBJECT_TEEN43 ) return "Teen43"; if ( type == OBJECT_TEEN44 ) return "Teen44"; - if ( type == OBJECT_TEEN45 ) return "Teen45"; - if ( type == OBJECT_TEEN46 ) return "Teen46"; - if ( type == OBJECT_TEEN47 ) return "Teen47"; - if ( type == OBJECT_TEEN48 ) return "Teen48"; - if ( type == OBJECT_TEEN49 ) return "Teen49"; if ( type == OBJECT_QUARTZ0 ) return "Quartz0"; if ( type == OBJECT_QUARTZ1 ) return "Quartz1"; if ( type == OBJECT_QUARTZ2 ) return "Quartz2"; if ( type == OBJECT_QUARTZ3 ) return "Quartz3"; - if ( type == OBJECT_QUARTZ4 ) return "Quartz4"; - if ( type == OBJECT_QUARTZ5 ) return "Quartz5"; - if ( type == OBJECT_QUARTZ6 ) return "Quartz6"; - if ( type == OBJECT_QUARTZ7 ) return "Quartz7"; - if ( type == OBJECT_QUARTZ8 ) return "Quartz8"; - if ( type == OBJECT_QUARTZ9 ) return "Quartz9"; if ( type == OBJECT_ROOT0 ) return "MegaStalk0"; if ( type == OBJECT_ROOT1 ) return "MegaStalk1"; if ( type == OBJECT_ROOT2 ) return "MegaStalk2"; if ( type == OBJECT_ROOT3 ) return "MegaStalk3"; if ( type == OBJECT_ROOT4 ) return "MegaStalk4"; if ( type == OBJECT_ROOT5 ) return "MegaStalk5"; - if ( type == OBJECT_ROOT6 ) return "MegaStalk6"; - if ( type == OBJECT_ROOT7 ) return "MegaStalk7"; - if ( type == OBJECT_ROOT8 ) return "MegaStalk8"; - if ( type == OBJECT_ROOT9 ) return "MegaStalk9"; if ( type == OBJECT_APOLLO1 ) return "ApolloLEM"; if ( type == OBJECT_APOLLO2 ) return "ApolloJeep"; if ( type == OBJECT_APOLLO3 ) return "ApolloFlag"; @@ -800,6 +745,62 @@ const char* GetCamera(Gfx::CameraType type) return "BACK"; } +// Returns the type of drive. + +DriveType GetDrive(char *line, int rank) +{ + char* p; + + p = SearchArg(line, rank); + if ( *p == 0 ) return DRIVE_OTHER; + + if ( Cmd(p, "Wheeled" ) ) return DRIVE_WHEELED; + if ( Cmd(p, "Tracked" ) ) return DRIVE_TRACKED; + if ( Cmd(p, "Winged" ) ) return DRIVE_WINGED; + if ( Cmd(p, "Legged" ) ) return DRIVE_LEGGED; + + return DRIVE_OTHER; +} + +// Returns the name of a drive. + +const char* GetDrive(DriveType type) +{ + if ( type == DRIVE_WHEELED ) return "Wheeled"; + if ( type == DRIVE_TRACKED ) return "Tracked"; + if ( type == DRIVE_WINGED ) return "Winged"; + if ( type == DRIVE_LEGGED ) return "Legged"; + return "Other"; +} + +// Returns the type of tool. + +ToolType GetTool(char *line, int rank) +{ + char* p; + + p = SearchArg(line, rank); + if ( *p == 0 ) return TOOL_OTHER; + + if ( Cmd(p, "Grabber" ) ) return TOOL_GRABBER; + if ( Cmd(p, "Sniffer" ) ) return TOOL_SNIFFER; + if ( Cmd(p, "Shooter" ) ) return TOOL_SHOOTER; + if ( Cmd(p, "OrgaShooter" ) ) return TOOL_ORGASHOOTER; + + return TOOL_OTHER; +} + +// Returns the name of a tool. + +const char* GetTool(ToolType type) +{ + if ( type == TOOL_GRABBER ) return "Grabber"; + if ( type == TOOL_SNIFFER ) return "Sniffer"; + if ( type == TOOL_SHOOTER ) return "Shooter"; + if ( type == TOOL_ORGASHOOTER ) return "OrgaShooter"; + return "Other"; +} + // Returns an integer. int OpInt(char *line, const char *op, int def) @@ -887,6 +888,24 @@ Gfx::CameraType OpCamera(char *line, const char *op) return GetCamera(line, 0); } +// Returns the type of drive. + +DriveType OpDrive(char *line, const char *op) +{ + line = SearchOp(line, op); + if ( *line == 0 ) return DRIVE_OTHER; + return GetDrive(line, 0); +} + +// Returns the type of tool. + +ToolType OpTool(char *line, const char *op) +{ + line = SearchOp(line, op); + if ( *line == 0 ) return TOOL_OTHER; + return GetTool(line, 0); +} + // Returns the type of a building. int OpBuild(char *line, const char *op) diff --git a/src/script/cmdtoken.h b/src/script/cmdtoken.h index fe831f1..8a423c5 100644 --- a/src/script/cmdtoken.h +++ b/src/script/cmdtoken.h @@ -30,6 +30,7 @@ // Procedures. +extern std::string GetCmd(char* line); extern bool Cmd(char *line, const char *token); extern char* SearchOp(char *line, const char *op); @@ -45,6 +46,10 @@ extern int GetResearch(char *line, int rank); extern Gfx::PyroType GetPyro(char *line, int rank); extern Gfx::CameraType GetCamera(char *line, int rank); extern const char* GetCamera(Gfx::CameraType type); +extern DriveType GetDrive(char *line, int rank); +extern const char* GetDrive(DriveType type); +extern ToolType GetTool(char *line, int rank); +extern const char* GetTool(ToolType type); extern int OpInt(char *line, const char *op, int def); extern float OpFloat(char *line, const char *op, float def); @@ -55,6 +60,8 @@ extern Gfx::EngineObjectType OpTypeTerrain(char *line, const char *op, Gfx::Engi extern int OpResearch(char *line, const char *op); extern Gfx::PyroType OpPyro(char *line, const char *op); extern Gfx::CameraType OpCamera(char *line, const char *op); +extern DriveType OpDrive(char *line, const char *op); +extern ToolType OpTool(char *line, const char *op); extern int OpBuild(char *line, const char *op); extern Math::Vector OpPos(char *line, const char *op); extern Math::Vector OpDir(char *line, const char *op); diff --git a/src/script/script.cpp b/src/script/script.cpp index ca6ce25..2299fbf 100644 --- a/src/script/script.cpp +++ b/src/script/script.cpp @@ -18,10 +18,12 @@ #include "script/script.h" #include "app/app.h" +#include "app/gamedata.h" #include "common/global.h" #include "common/iman.h" #include "common/restext.h" +#include "common/stringutils.h" #include "graphics/engine/terrain.h" #include "graphics/engine/water.h" @@ -37,6 +39,7 @@ #include "object/auto/auto.h" #include "object/auto/autofactory.h" +#include "object/auto/autobase.h" #include "physics/physics.h" @@ -678,10 +681,23 @@ bool CScript::rFactory(CBotVar* thisclass, CBotVar* var, CBotVar* result, int& e classVars = classVars->GetNext(); // "id" int rank = classVars->GetValInt(); CObject* factory = CObjectManager::GetInstancePointer()->SearchInstance(rank); - CAutoFactory* automat = static_cast<CAutoFactory*>(factory->GetAuto()); + if (factory == nullptr) { + exception = ERR_GENERIC; + result->SetValInt(ERR_GENERIC); + CLogger::GetInstancePointer()->Error("in object.factory() - factory is nullptr"); + return false; + } if ( thisType == OBJECT_FACTORY ) { + CAutoFactory* automat = static_cast<CAutoFactory*>(factory->GetAuto()); + if(automat == nullptr) { + exception = ERR_GENERIC; + result->SetValInt(ERR_GENERIC); + CLogger::GetInstancePointer()->Error("in object.factory() - automat is nullptr"); + return false; + } + bool bEnable = false; if ( type == OBJECT_MOBILEwa ) @@ -900,6 +916,54 @@ bool CScript::rResearch(CBotVar* thisclass, CBotVar* var, CBotVar* result, int& return true; } +// Instruction "object.takeoff()" + +bool CScript::rTakeOff(CBotVar* thisclass, CBotVar* var, CBotVar* result, int& exception) +{ + Error err; + + exception = 0; + + CBotVar* classVars = thisclass->GetItemList(); // "category" + ObjectType thisType = static_cast<ObjectType>(classVars->GetValInt()); + classVars = classVars->GetNext(); // "position" + classVars = classVars->GetNext(); // "orientation" + classVars = classVars->GetNext(); // "pitch" + classVars = classVars->GetNext(); // "roll" + classVars = classVars->GetNext(); // "energyLevel" + classVars = classVars->GetNext(); // "shieldLevel" + classVars = classVars->GetNext(); // "temperature" + classVars = classVars->GetNext(); // "altitude" + classVars = classVars->GetNext(); // "lifeTime" + classVars = classVars->GetNext(); // "material" + classVars = classVars->GetNext(); // "energyCell" + classVars = classVars->GetNext(); // "load" + classVars = classVars->GetNext(); // "id" + int rank = classVars->GetValInt(); + CObject* center = CObjectManager::GetInstancePointer()->SearchInstance(rank); + CAuto* automat = center->GetAuto(); + + if ( thisType == OBJECT_BASE ) + { + err = (static_cast<CAutoBase*>(automat))->TakeOff(false); + } else + err = ERR_WRONG_OBJ; + + if ( err != ERR_OK ) + { + result->SetValInt(err); // return error +//TODO: if ( script->m_errMode == ERM_STOP ) + if( true ) + { + exception = err; + return false; + } + return true; + } + + return true; +} + // Compilation of the instruction "delete(rank[, exploType[, force]])". CBotTypResult CScript::cDelete(CBotVar* &var, void* user) @@ -1330,7 +1394,7 @@ bool CScript::Process(CScript* script, CBotVar* result, int &exception) if ( err == ERR_STOP ) err = ERR_OK; result->SetValInt(err); // indicates the error or ok - if ( err != ERR_OK && script->m_errMode == ERM_STOP ) + if ( ShouldProcessStop(err, script->m_errMode) ) { exception = err; return false; @@ -1344,6 +1408,21 @@ bool CScript::Process(CScript* script, CBotVar* result, int &exception) } +// Returns true if error code means real error and exception must be thrown + +bool CScript::ShouldProcessStop(Error err, int errMode) +{ + // aim impossible - not a real error + if ( err == ERR_AIM_IMPOSSIBLE ) + return false; + + if ( err != ERR_OK && errMode == ERM_STOP ) + return true; + + return false; +} + + // Compilation of the instruction "detect(type)". CBotTypResult CScript::cDetect(CBotVar* &var, void* user) @@ -1576,7 +1655,7 @@ CBotTypResult CScript::cCanBuild(CBotVar* &var, void* user) return CBotTypResult(CBotTypBoolean); } -// Instruction "canbuid ( category );" +// Instruction "canbuild ( category );" // returns true if this building can be built bool CScript::rCanBuild(CBotVar* var, CBotVar* result, int& exception, void* user) @@ -1602,7 +1681,7 @@ bool CScript::rCanBuild(CBotVar* var, CBotVar* result, int& exception, void* use (category == OBJECT_DESTROYER && (g_build & BUILD_DESTROYER))) { - //if we want to build not researched one + // if we want to build not researched one if ( (category == OBJECT_TOWER && !(g_researchDone & RESEARCH_TOWER)) || (category == OBJECT_NUCLEAR && !(g_researchDone & RESEARCH_ATOMIC)) ) @@ -1646,7 +1725,7 @@ bool CScript::rBuild(CBotVar* var, CBotVar* result, int& exception, void* user) } else { - category = static_cast<ObjectType>(var->GetValInt()); //get category parameter + category = static_cast<ObjectType>(var->GetValInt()); // get category parameter if ( (category == OBJECT_DERRICK && (g_build & BUILD_DERRICK)) || (category == OBJECT_FACTORY && (g_build & BUILD_FACTORY)) || (category == OBJECT_STATION && (g_build & BUILD_STATION)) || @@ -1663,7 +1742,7 @@ bool CScript::rBuild(CBotVar* var, CBotVar* result, int& exception, void* user) (category == OBJECT_DESTROYER && (g_build & BUILD_DESTROYER))) { - //if we want to build not researched one + // if we want to build not researched one if ( (category == OBJECT_TOWER && !(g_researchDone & RESEARCH_TOWER)) || (category == OBJECT_NUCLEAR && !(g_researchDone & RESEARCH_ATOMIC)) ) @@ -1676,8 +1755,11 @@ bool CScript::rBuild(CBotVar* var, CBotVar* result, int& exception, void* user) } } + + if (pThis->GetIgnoreBuildCheck()) + err = ERR_OK; - if (err == ERR_OK && script->m_primaryTask == 0) //if we can build and no task is present + if (err == ERR_OK && script->m_primaryTask == 0) // if we can build and no task is present { script->m_primaryTask = new CTaskManager(script->m_object); err = script->m_primaryTask->StartTaskBuild(category); @@ -1688,9 +1770,9 @@ bool CScript::rBuild(CBotVar* var, CBotVar* result, int& exception, void* user) script->m_primaryTask = 0; } } - //When script is waiting for finishing this task, it sets ERR_OK, and continues executing Process - //without creating new task. I think, there was a problem with previous version in release configuration - //It did not init error variable in this situation, and code tried to use variable with trash inside + // When script is waiting for finishing this task, it sets ERR_OK, and continues executing Process + // without creating new task. I think, there was a problem with previous version in release configuration + // It did not init error variable in this situation, and code tried to use variable with trash inside } if ( err != ERR_OK ) @@ -1820,52 +1902,10 @@ bool CScript::rProduce(CBotVar* var, CBotVar* result, int& exception, void* user } } - if ( type == OBJECT_FRET || - type == OBJECT_STONE || - type == OBJECT_URANIUM || - type == OBJECT_METAL || - type == OBJECT_POWER || - type == OBJECT_ATOMIC || - type == OBJECT_BULLET || - type == OBJECT_BBOX || - type == OBJECT_KEYa || - type == OBJECT_KEYb || - type == OBJECT_KEYc || - type == OBJECT_KEYd || - type == OBJECT_TNT || - type == OBJECT_SCRAP1 || - type == OBJECT_SCRAP2 || - type == OBJECT_SCRAP3 || - type == OBJECT_SCRAP4 || - type == OBJECT_SCRAP5 || - type == OBJECT_BOMB || - type == OBJECT_WAYPOINT || - type == OBJECT_SHOW || - type == OBJECT_WINFIRE || - type == OBJECT_BAG || - type == OBJECT_MARKPOWER || - type == OBJECT_MARKSTONE || - type == OBJECT_MARKURANIUM || - type == OBJECT_MARKKEYa || - type == OBJECT_MARKKEYb || - type == OBJECT_MARKKEYc || - type == OBJECT_MARKKEYd || - type == OBJECT_EGG ) - { - object = new CObject(); - if ( !object->CreateResource(pos, angle, type) ) - { - delete object; - result->SetValInt(1); // error - return true; - } - object->SetActivity(false); - } - else if ( type == OBJECT_MOTHER || - type == OBJECT_ANT || - type == OBJECT_SPIDER || - type == OBJECT_BEE || - type == OBJECT_WORM ) + if ( type == OBJECT_ANT || + type == OBJECT_SPIDER || + type == OBJECT_BEE || + type == OBJECT_WORM ) { CObject* egg; @@ -1883,117 +1923,16 @@ bool CScript::rProduce(CBotVar* var, CBotVar* result, int& exception, void* user delete egg; } object->SetActivity(false); - } - else if ( type == OBJECT_PORTICO || - type == OBJECT_BASE || - type == OBJECT_DERRICK || - type == OBJECT_FACTORY || - type == OBJECT_STATION || - type == OBJECT_CONVERT || - type == OBJECT_REPAIR || - type == OBJECT_DESTROYER|| - type == OBJECT_TOWER || - type == OBJECT_NEST || - type == OBJECT_RESEARCH || - type == OBJECT_RADAR || - type == OBJECT_INFO || - type == OBJECT_ENERGY || - type == OBJECT_LABO || - type == OBJECT_NUCLEAR || - type == OBJECT_PARA || - type == OBJECT_SAFE || - type == OBJECT_HUSTON || - type == OBJECT_TARGET1 || - type == OBJECT_TARGET2 || - type == OBJECT_START || - type == OBJECT_END ) - { - object = new CObject(); - if ( !object->CreateBuilding(pos, angle, 0, type) ) - { - delete object; - result->SetValInt(1); // error - return true; - } - object->SetActivity(false); - script->m_main->CreateShortcuts(); - } - else if ( type == OBJECT_FLAGb || - type == OBJECT_FLAGr || - type == OBJECT_FLAGg || - type == OBJECT_FLAGy || - type == OBJECT_FLAGv ) - { - object = new CObject(); - if ( !object->CreateFlag(pos, angle, type) ) + } else { + if ((type == OBJECT_POWER || type == OBJECT_ATOMIC) && power == -1.0f) power = 1.0f; + object = CObjectManager::GetInstancePointer()->CreateObject(pos, angle, type, power); + if ( object == nullptr ) { - delete object; result->SetValInt(1); // error return true; } - object->SetActivity(false); - } - else if ( type == OBJECT_HUMAN || - type == OBJECT_TECH || - type == OBJECT_TOTO || - type == OBJECT_MOBILEfa || - type == OBJECT_MOBILEta || - type == OBJECT_MOBILEwa || - type == OBJECT_MOBILEia || - type == OBJECT_MOBILEfc || - type == OBJECT_MOBILEtc || - type == OBJECT_MOBILEwc || - type == OBJECT_MOBILEic || - type == OBJECT_MOBILEfi || - type == OBJECT_MOBILEti || - type == OBJECT_MOBILEwi || - type == OBJECT_MOBILEii || - type == OBJECT_MOBILEfs || - type == OBJECT_MOBILEts || - type == OBJECT_MOBILEws || - type == OBJECT_MOBILEis || - type == OBJECT_MOBILErt || - type == OBJECT_MOBILErc || - type == OBJECT_MOBILErr || - type == OBJECT_MOBILErs || - type == OBJECT_MOBILEsa || - type == OBJECT_MOBILEtg || - type == OBJECT_MOBILEft || - type == OBJECT_MOBILEtt || - type == OBJECT_MOBILEwt || - type == OBJECT_MOBILEit || - type == OBJECT_MOBILEdr || - type == OBJECT_APOLLO2 ) - { - object = new CObject(); - if ( !object->CreateVehicle(pos, angle, type, power, false, false) ) - { - delete object; - result->SetValInt(1); // error - return true; - } - object->UpdateMapping(); - object->SetRange(30.0f); - object->SetZoom(0, 1.0f); - CPhysics* physics = object->GetPhysics(); - if ( physics != 0 ) - { - physics->SetFreeze(false); // can move - } - object->SetLock(false); // vehicle useable - // SetManual will affect bot speed - if (type == OBJECT_MOBILEdr) - { - object->SetManual(true); - } - object->SetActivity(true); script->m_main->CreateShortcuts(); } - else - { - result->SetValInt(1); // impossible - return true; - } if (name[0] != 0) { @@ -2923,7 +2862,6 @@ bool CScript::rShield(CBotVar* var, CBotVar* result, int& exception, void* user) CBotTypResult CScript::cFire(CBotVar* &var, void* user) { -#if 0 CObject* pThis = static_cast<CObject *>(user); ObjectType type; @@ -2931,23 +2869,25 @@ CBotTypResult CScript::cFire(CBotVar* &var, void* user) if ( type == OBJECT_ANT ) { - return cOnePoint(var, user); + if ( var == 0 ) return CBotTypResult(CBotErrLowParam); + CBotTypResult ret = cPoint(var, user); + if ( ret.GetType() != 0 ) return ret; + if ( var != 0 ) return CBotTypResult(CBotErrOverParam); } else if ( type == OBJECT_SPIDER ) { - return cNull(var, user); + if ( var != 0 ) return CBotTypResult(CBotErrOverParam); } else { - if ( var == 0 ) return CBotTypResult(CBotTypFloat); - if ( var->GetType() > CBotTypDouble ) return CBotTypResult(CBotErrBadNum); - var = var->GetNext(); - if ( var != 0 ) return CBotTypResult(CBotErrOverParam); - return CBotTypResult(CBotTypFloat); + if ( var != 0 ) + { + if ( var->GetType() > CBotTypDouble ) return CBotTypResult(CBotErrBadNum); + var = var->GetNext(); + if ( var != 0 ) return CBotTypResult(CBotErrOverParam); + } } -#else return CBotTypResult(CBotTypFloat); -#endif } // Instruction "fire(delay)". @@ -2983,6 +2923,7 @@ bool CScript::rFire(CBotVar* var, CBotVar* result, int& exception, void* user) { if ( var == 0 ) delay = 0.0f; else delay = var->GetValFloat(); + if ( delay < 0.0f ) delay = -delay; err = script->m_primaryTask->StartTaskFire(delay); } @@ -3031,7 +2972,11 @@ bool CScript::rAim(CBotVar* var, CBotVar* result, int& exception, void* user) var = var->GetNext(); var == 0 ? y=0.0f : y=var->GetValFloat(); err = script->m_primaryTask->StartTaskGunGoal(x*Math::PI/180.0f, y*Math::PI/180.0f); - if ( err != ERR_OK ) + if ( err == ERR_AIM_IMPOSSIBLE ) + { + result->SetValInt(err); // shows the error + } + else if ( err != ERR_OK ) { delete script->m_primaryTask; script->m_primaryTask = 0; @@ -3488,6 +3433,47 @@ bool CScript::rPenWidth(CBotVar* var, CBotVar* result, int& exception, void* use return true; } +// Compilation of the instruction with one object parameter + +CBotTypResult CScript::cOneObject(CBotVar* &var, void* user) +{ + if ( var == 0 ) return CBotTypResult(CBotErrLowParam); + var = var->GetNext(); + if ( var == 0 ) return CBotTypResult(CBotTypFloat); + + return CBotTypResult(CBotErrOverParam); +} + +// Instruction "camerafocus(object)". + +bool CScript::rCameraFocus(CBotVar* var, CBotVar* result, int& exception, void* user) +{ + CScript* script = (static_cast<CObject *>(user))->GetRunScript(); + + CBotVar* classVars = var->GetItemList(); // "category" + classVars = classVars->GetNext(); // "position" + classVars = classVars->GetNext(); // "orientation" + classVars = classVars->GetNext(); // "pitch" + classVars = classVars->GetNext(); // "roll" + classVars = classVars->GetNext(); // "energyLevel" + classVars = classVars->GetNext(); // "shieldLevel" + classVars = classVars->GetNext(); // "temperature" + classVars = classVars->GetNext(); // "altitude" + classVars = classVars->GetNext(); // "lifeTime" + classVars = classVars->GetNext(); // "material" + classVars = classVars->GetNext(); // "energyCell" + classVars = classVars->GetNext(); // "load" + classVars = classVars->GetNext(); // "id" + int rank = classVars->GetValInt(); + CObject* object = CObjectManager::GetInstancePointer()->SearchInstance(rank); + + script->m_main->SelectObject(object, false); + + result->SetValInt(ERR_OK); + exception = ERR_OK; + return true; +} + // Object's constructor. @@ -3504,6 +3490,7 @@ CScript::CScript(CObject* object, CTaskManager** secondaryTask) m_secondaryTask = secondaryTask; m_interface = m_main->GetInterface(); + m_pause = CPauseManager::GetInstancePointer(); m_ipf = CBOT_IPF; m_errMode = ERM_STOP; @@ -3587,6 +3574,8 @@ void CScript::InitFonctions() CBotProgram::AddFunction("penup", rPenUp, CScript::cNull); CBotProgram::AddFunction("pencolor", rPenColor, CScript::cOneFloat); CBotProgram::AddFunction("penwidth", rPenWidth, CScript::cOneFloat); + + CBotProgram::AddFunction("camerafocus", rCameraFocus, CScript::cOneObject); CBotProgram::AddFunction("canbuild", rCanBuild, CScript::cCanBuild); CBotProgram::AddFunction("build", rBuild, CScript::cOneFloat); @@ -3898,16 +3887,16 @@ bool CScript::Continue(const Event &event) if ( m_error != 0 && m_errMode == ERM_STOP ) { - char s[100]; + std::string s; GetError(s); - m_main->GetDisplayText()->DisplayText(s, m_object, 10.0f, Ui::TT_ERROR); + m_main->GetDisplayText()->DisplayText(s.c_str(), m_object, 10.0f, Ui::TT_ERROR); } - m_engine->SetPause(true); // gives pause + m_pause->SetPause(PAUSE_EDITOR); // gives pause return true; } if ( !m_bContinue ) { - m_engine->SetPause(true); // gives pause + m_pause->SetPause(PAUSE_EDITOR); // gives pause } } @@ -3931,9 +3920,9 @@ bool CScript::Continue(const Event &event) if ( m_error != 0 && m_errMode == ERM_STOP ) { - char s[100]; + std::string s; GetError(s); - m_main->GetDisplayText()->DisplayText(s, m_object, 10.0f, Ui::TT_ERROR); + m_main->GetDisplayText()->DisplayText(s.c_str(), m_object, 10.0f, Ui::TT_ERROR); } return true; } @@ -3950,9 +3939,9 @@ bool CScript::Step(const Event &event) if ( !m_bRun ) return true; if ( !m_bStepMode ) return false; - m_engine->SetPause(false); + // ??? m_engine->SetPause(false); // TODO: m_app StepSimulation??? m_engine->StepSimulation(0.01f); // advance of 10ms - m_engine->SetPause(true); + // ??? m_engine->SetPause(true); m_event = event; @@ -3973,16 +3962,16 @@ bool CScript::Step(const Event &event) if ( m_error != 0 && m_errMode == ERM_STOP ) { - char s[100]; + std::string s; GetError(s); - m_main->GetDisplayText()->DisplayText(s, m_object, 10.0f, Ui::TT_ERROR); + m_main->GetDisplayText()->DisplayText(s.c_str(), m_object, 10.0f, Ui::TT_ERROR); } return true; } if ( m_bContinue ) // instuction "move", "goto", etc. ? { - m_engine->SetPause(false); // removes the pause + m_pause->ClearPause(); // removes the pause } return false; } @@ -4347,27 +4336,27 @@ int CScript::GetError() // Returns the text of the error. -void CScript::GetError(char* buffer) +void CScript::GetError(std::string& error) { if ( m_error == 0 ) { - buffer[0] = 0; + error.clear(); } else { if ( m_error == ERR_OBLIGATORYTOKEN ) { - char s[100]; + std::string s; GetResource(RES_ERR, m_error, s); - sprintf(buffer, s, m_token); + error = StrUtils::Format(s.c_str(), m_token); } else if ( m_error < 1000 ) { - GetResource(RES_ERR, m_error, buffer); + GetResource(RES_ERR, m_error, error); } else { - GetResource(RES_CBOT, m_error, buffer); + GetResource(RES_CBOT, m_error, error); } } } @@ -4385,7 +4374,9 @@ void CScript::New(Ui::CEdit* edit, const char* name) char *sf; int cursor1, cursor2, len, i, j; - GetResource(RES_TEXT, RT_SCRIPT_NEW, res); + std::string resStr; + GetResource(RES_TEXT, RT_SCRIPT_NEW, resStr); + strcpy(res, resStr.c_str()); if ( name[0] == 0 ) strcpy(text, res); else strcpy(text, name); @@ -4418,7 +4409,7 @@ void CScript::New(Ui::CEdit* edit, const char* name) sf = m_main->GetScriptFile(); if ( sf[0] != 0 ) // Load an empty program specific? { - std::string filename = CApplication::GetInstancePointer()->GetDataFilePath(DIR_AI, sf); + std::string filename = CGameData::GetInstancePointer()->GetFilePath(DIR_AI, sf); file = fopen(filename.c_str(), "rb"); if ( file != NULL ) { @@ -4512,7 +4503,7 @@ bool CScript::ReadScript(const char* filename) if ( strchr(filename, '/') == 0 ) //we're reading non user script { - name = CApplication::GetInstancePointer()->GetDataFilePath(DIR_AI, filename); + name = CGameData::GetInstancePointer()->GetFilePath(DIR_AI, filename); } else { @@ -4546,7 +4537,7 @@ bool CScript::WriteScript(const char* filename) if ( strchr(filename, '/') == 0 ) //we're writing non user script { - name = CApplication::GetInstancePointer()->GetDataFilePath(DIR_AI, filename); + name = CGameData::GetInstancePointer()->GetFilePath(DIR_AI, filename); } else { diff --git a/src/script/script.h b/src/script/script.h index 7fd5555..fb44342 100644 --- a/src/script/script.h +++ b/src/script/script.h @@ -24,6 +24,10 @@ #include "common/event.h" +#include "common/global.h" + +#include "app/pausemanager.h" + #include "CBot/CBotDll.h" #include <stdio.h> @@ -74,7 +78,7 @@ public: bool IntroduceVirus(); int GetError(); - void GetError(char* buffer); + void GetError(std::string& error); void New(Ui::CEdit* edit, const char* name); bool SendScript(const char* text); @@ -126,6 +130,7 @@ private: static CBotTypResult cPenDown(CBotVar* &var, void* user); static CBotTypResult cOnePoint(CBotVar* &var, void* user); static CBotTypResult cPoint(CBotVar* &var, void* user); + static CBotTypResult cOneObject(CBotVar* &var, void* user); static bool rSin(CBotVar* var, CBotVar* result, int& exception, void* user); @@ -190,6 +195,7 @@ private: static bool rPenUp(CBotVar* var, CBotVar* result, int& exception, void* user); static bool rPenColor(CBotVar* var, CBotVar* result, int& exception, void* user); static bool rPenWidth(CBotVar* var, CBotVar* result, int& exception, void* user); + static bool rCameraFocus(CBotVar* var, CBotVar* result, int& exception, void* user); public: static CBotTypResult cBusy(CBotVar* thisclass, CBotVar* &var); @@ -200,10 +206,12 @@ public: static bool rBusy(CBotVar* thisclass, CBotVar* var, CBotVar* result, int& exception); static bool rFactory(CBotVar* thisclass, CBotVar* var, CBotVar* result, int& exception); static bool rResearch(CBotVar* thisclass, CBotVar* var, CBotVar* result, int& exception); + static bool rTakeOff(CBotVar* thisclass, CBotVar* var, CBotVar* result, int& exception); static bool rDestroy(CBotVar* thisclass, CBotVar* var, CBotVar* result, int& exception); private: static bool Process(CScript* script, CBotVar* result, int &exception); + static bool ShouldProcessStop(Error err, int errMode); static CObject* SearchInfo(CScript* script, CObject* object, float power); protected: @@ -216,6 +224,7 @@ protected: CTaskManager* m_primaryTask; CTaskManager** m_secondaryTask; CObject* m_object; + CPauseManager* m_pause; int m_ipf; // number of instructions/second int m_errMode; // what to do in case of error diff --git a/src/sound/oalsound/alsound.cpp b/src/sound/oalsound/alsound.cpp index 992b8b2..8afbdd2 100644 --- a/src/sound/oalsound/alsound.cpp +++ b/src/sound/oalsound/alsound.cpp @@ -18,6 +18,8 @@ #include "sound/oalsound/alsound.h" +#include "app/gamedata.h" + #include <algorithm> #include <iomanip> @@ -26,12 +28,14 @@ ALSound::ALSound() { m_enabled = false; - m_3D = false; m_audioVolume = 1.0f; m_musicVolume = 1.0f; m_currentMusic = nullptr; m_eye.LoadZero(); m_lookat.LoadZero(); + m_previousMusic.fadeTime = 0.0f; + m_previousMusic.music = nullptr; + m_channels_limit = 2048; } @@ -58,6 +62,16 @@ void ALSound::CleanUp() { delete m_currentMusic; } + + for (auto item : m_oldMusic) + { + delete item.music; + } + + if (m_previousMusic.music) + { + delete m_previousMusic.music; + } for (auto item : m_sounds) { @@ -77,7 +91,7 @@ void ALSound::CleanUp() } -bool ALSound::Create(bool b3D) +bool ALSound::Create() { CleanUp(); @@ -102,32 +116,12 @@ bool ALSound::Create(bool b3D) alListenerf(AL_GAIN, m_audioVolume); alDistanceModel(AL_LINEAR_DISTANCE_CLAMPED); - m_currentMusic = new Channel(); GetLogger()->Info("Done.\n"); m_enabled = true; return true; } -void ALSound::SetSound3D(bool bMode) -{ - m_3D = bMode; -} - - -bool ALSound::GetSound3D() -{ - return m_3D; -} - - -bool ALSound::GetSound3DCap() -{ - // TODO stub! need to be implemented - return true; -} - - bool ALSound::GetEnable() { return m_enabled; @@ -168,10 +162,10 @@ int ALSound::GetMusicVolume() } -bool ALSound::Cache(Sound sound, std::string filename) +bool ALSound::Cache(Sound sound, const std::string &filename) { Buffer *buffer = new Buffer(); - if (buffer->LoadFromFile(filename, sound)) + if (buffer->LoadFromFile(CGameData::GetInstancePointer()->GetFilePath(DIR_SOUND, filename), sound)) { m_sounds[sound] = buffer; return true; @@ -179,14 +173,12 @@ bool ALSound::Cache(Sound sound, std::string filename) return false; } -bool ALSound::CacheMusic(std::string filename) +bool ALSound::CacheMusic(const std::string &filename) { if (m_music.find(filename) == m_music.end()) { Buffer *buffer = new Buffer(); - std::stringstream file; - file << m_soundPath << "/" << filename; - if (buffer->LoadFromFile(file.str(), static_cast<Sound>(-1))) + if (buffer->LoadFromFile(CGameData::GetInstancePointer()->GetFilePath(DIR_MUSIC, filename), static_cast<Sound>(-1))) { m_music[filename] = buffer; return true; @@ -252,11 +244,16 @@ bool ALSound::SearchFreeBuffer(Sound sound, int &channel, bool &bAlreadyLoaded) for (auto it : m_channels) { if (it.second->IsPlaying()) + { continue; + } if (it.second->GetSoundType() != sound) + { continue; + } it.second->SetPriority(priority); + it.second->Reset(); channel = it.first; bAlreadyLoaded = it.second->IsLoaded(); return true; @@ -270,6 +267,7 @@ bool ALSound::SearchFreeBuffer(Sound sound, int &channel, bool &bAlreadyLoaded) if (chn->IsReady()) { chn->SetPriority(priority); + chn->Reset(); m_channels[1] = chn; channel = 1; bAlreadyLoaded = false; @@ -280,8 +278,8 @@ bool ALSound::SearchFreeBuffer(Sound sound, int &channel, bool &bAlreadyLoaded) return false; } - // Seeks a channel completely free. - if (m_channels.size() < 64) + // Assigns new channel within limit + if (m_channels.size() < m_channels_limit) { auto it = m_channels.end(); it--; @@ -295,13 +293,14 @@ bool ALSound::SearchFreeBuffer(Sound sound, int &channel, bool &bAlreadyLoaded) if (chn->IsReady()) { chn->SetPriority(priority); + chn->Reset(); m_channels[++i] = chn; channel = i; bAlreadyLoaded = false; return true; } delete chn; - GetLogger()->Warn("Could not open additional channel to play sound!\n"); + GetLogger()->Debug("Could not open additional channel to play sound!\n"); } } } @@ -313,6 +312,7 @@ bool ALSound::SearchFreeBuffer(Sound sound, int &channel, bool &bAlreadyLoaded) { GetLogger()->Debug("Sound channel with lower priority will be reused.\n"); channel = it.first; + it.second->Reset(); return true; } if (it.second->GetPriority() <= priority) @@ -322,11 +322,12 @@ bool ALSound::SearchFreeBuffer(Sound sound, int &channel, bool &bAlreadyLoaded) if (lowerOrEqual != -1) { channel = lowerOrEqual; + m_channels[channel]->Reset(); GetLogger()->Debug("Sound channel with lower or equal priority will be reused.\n"); return true; } - GetLogger()->Warn("Could not find free buffer to use.\n"); + GetLogger()->Debug("Could not find free buffer to use.\n"); return false; } @@ -337,7 +338,7 @@ int ALSound::Play(Sound sound, float amplitude, float frequency, bool bLoop) } -int ALSound::Play(Sound sound, Math::Vector pos, float amplitude, float frequency, bool bLoop) +int ALSound::Play(Sound sound, const Math::Vector &pos, float amplitude, float frequency, bool bLoop) { if (!m_enabled) { @@ -345,14 +346,16 @@ int ALSound::Play(Sound sound, Math::Vector pos, float amplitude, float frequenc } if (m_sounds.find(sound) == m_sounds.end()) { - GetLogger()->Warn("Sound %d was not loaded!\n", sound); + GetLogger()->Debug("Sound %d was not loaded!\n", sound); return -1; } int channel; bool bAlreadyLoaded = false; if (!SearchFreeBuffer(sound, channel, bAlreadyLoaded)) + { return -1; + } if (!bAlreadyLoaded) { @@ -363,15 +366,8 @@ int ALSound::Play(Sound sound, Math::Vector pos, float amplitude, float frequenc } } - Position(channel, pos); - if (!m_3D) - { - ComputeVolumePan2D(channel, pos); - } - else - { - m_channels[channel]->SetVolumeAtrib(1.0f); - } + m_channels[channel]->SetPosition(pos); + m_channels[channel]->SetVolumeAtrib(1.0f); // setting initial values m_channels[channel]->SetStartAmplitude(amplitude); @@ -381,15 +377,26 @@ int ALSound::Play(Sound sound, Math::Vector pos, float amplitude, float frequenc m_channels[channel]->SetFrequency(frequency); m_channels[channel]->SetVolume(powf(amplitude * m_channels[channel]->GetVolumeAtrib(), 0.2f) * m_audioVolume); m_channels[channel]->SetLoop(bLoop); - m_channels[channel]->Play(); - return channel; + if (!m_channels[channel]->Play()) + { + m_channels_limit = m_channels.size() - 1; + GetLogger()->Debug("Changing channel limit to %u.\n", m_channels_limit); + auto it = m_channels.find(channel); + Channel *ch = it->second; + m_channels.erase(it); + delete ch; + + return -1; + } + + return channel | ((m_channels[channel]->GetId() & 0xffff) << 16); } bool ALSound::FlushEnvelope(int channel) { - if (m_channels.find(channel) == m_channels.end()) + if (!CheckChannel(channel)) { return false; } @@ -401,10 +408,7 @@ bool ALSound::FlushEnvelope(int channel) bool ALSound::AddEnvelope(int channel, float amplitude, float frequency, float time, SoundNext oper) { - if (!m_enabled) - return false; - - if (m_channels.find(channel) == m_channels.end()) + if (!CheckChannel(channel)) { return false; } @@ -421,40 +425,21 @@ bool ALSound::AddEnvelope(int channel, float amplitude, float frequency, float t } -bool ALSound::Position(int channel, Math::Vector pos) +bool ALSound::Position(int channel, const Math::Vector &pos) { - if (!m_enabled) - return false; - - if (m_channels.find(channel) == m_channels.end()) + if (!CheckChannel(channel)) { return false; } - if (m_3D) - { - m_channels[channel]->SetPan(pos); - } - else - { - ComputeVolumePan2D(channel, pos); - - if (!m_channels[channel]->HasEnvelope()) - { - float volume = m_channels[channel]->GetStartAmplitude(); - m_channels[channel]->SetVolume(powf(volume * m_channels[channel]->GetVolumeAtrib(), 0.2f) * m_audioVolume); - } - } + m_channels[channel]->SetPosition(pos); return true; } bool ALSound::Frequency(int channel, float frequency) { - if (!m_enabled) - return false; - - if (m_channels.find(channel) == m_channels.end()) + if (!CheckChannel(channel)) { return false; } @@ -466,10 +451,7 @@ bool ALSound::Frequency(int channel, float frequency) bool ALSound::Stop(int channel) { - if (!m_enabled) - return false; - - if (m_channels.find(channel) == m_channels.end()) + if (!CheckChannel(channel)) { return false; } @@ -484,7 +466,9 @@ bool ALSound::Stop(int channel) bool ALSound::StopAll() { if (!m_enabled) + { return false; + } for (auto channel : m_channels) { @@ -499,7 +483,9 @@ bool ALSound::StopAll() bool ALSound::MuteAll(bool bMute) { if (!m_enabled) + { return false; + } for (auto it : m_channels) { @@ -509,14 +495,6 @@ bool ALSound::MuteAll(bool bMute) } } - if (bMute) - { - m_currentMusic->SetVolume(0.0f); - } - else - { - m_currentMusic->SetVolume(m_musicVolume); - } return true; } @@ -524,7 +502,9 @@ bool ALSound::MuteAll(bool bMute) void ALSound::FrameMove(float delta) { if (!m_enabled) + { return; + } float progress; float volume, frequency; @@ -534,7 +514,6 @@ void ALSound::FrameMove(float delta) { continue; } - if (it.second->IsMuted()) { it.second->SetVolume(0.0f); @@ -582,79 +561,117 @@ void ALSound::FrameMove(float delta) } } } + + std::list<OldMusic> toRemove; + + for (auto& it : m_oldMusic) + { + if (it.currentTime >= it.fadeTime) + { + delete it.music; + toRemove.push_back(it); + } + else + { + it.currentTime += delta; + it.music->SetVolume(((it.fadeTime-it.currentTime) / it.fadeTime) * m_musicVolume); + } + } + + if (m_previousMusic.fadeTime > 0.0f) { + if (m_previousMusic.currentTime >= m_previousMusic.fadeTime) + { + m_previousMusic.music->Pause(); + } + else + { + m_previousMusic.currentTime += delta; + m_previousMusic.music->SetVolume(((m_previousMusic.fadeTime-m_previousMusic.currentTime) / m_previousMusic.fadeTime) * m_musicVolume); + } + } + + for (auto it : toRemove) + m_oldMusic.remove(it); } -void ALSound::SetListener(Math::Vector eye, Math::Vector lookat) +void ALSound::SetListener(const Math::Vector &eye, const Math::Vector &lookat) { m_eye = eye; m_lookat = lookat; - if (m_3D) - { - float orientation[] = {lookat.x, lookat.y, lookat.z, 0.f, 1.f, 0.f}; - alListener3f(AL_POSITION, eye.x, eye.y, eye.z); - alListenerfv(AL_ORIENTATION, orientation); - } - else - { - float orientation[] = {0.0f, 0.0f, 0.0f, 0.f, 1.f, 0.f}; - alListener3f(AL_POSITION, 0.0f, 0.0f, 0.0f); - alListenerfv(AL_ORIENTATION, orientation); + Math::Vector forward = lookat - eye; + forward.Normalize(); + float orientation[] = {forward.x, forward.y, forward.z, 0.f, -1.0f, 0.0f}; - // recalculate sound position - for (auto it : m_channels) - { - if (it.second->IsPlaying()) - { - Math::Vector pos = it.second->GetPosition(); - ComputeVolumePan2D(it.first, pos); - - if (!it.second->HasEnvelope()) - { - float volume = it.second->GetStartAmplitude(); - it.second->SetVolume(powf(volume * it.second->GetVolumeAtrib(), 0.2f) * m_audioVolume); - } - } - } - } + alListener3f(AL_POSITION, eye.x, eye.y, eye.z); + alListenerfv(AL_ORIENTATION, orientation); } -bool ALSound::PlayMusic(int rank, bool bRepeat) + +bool ALSound::PlayMusic(int rank, bool bRepeat, float fadeTime) { std::stringstream filename; filename << "music" << std::setfill('0') << std::setw(3) << rank << ".ogg"; - return PlayMusic(filename.str(), bRepeat); + return PlayMusic(filename.str(), bRepeat, fadeTime); +} + + +bool operator<(const OldMusic & l, const OldMusic & r) +{ + return l.currentTime < r.currentTime; +} + + +bool operator==(const OldMusic & l, const OldMusic & r) +{ + return l.currentTime == r.currentTime; } -bool ALSound::PlayMusic(std::string filename, bool bRepeat) + +bool ALSound::PlayMusic(const std::string &filename, bool bRepeat, float fadeTime) { if (!m_enabled) { return false; } - std::stringstream file; - file << m_soundPath << "/" << filename; + std::string file = CGameData::GetInstancePointer()->GetFilePath(DIR_MUSIC, filename); + Buffer *buffer; // check if we have music in cache if (m_music.find(filename) == m_music.end()) { - GetLogger()->Warn("Music %s was not cached!\n", filename.c_str()); - if (!boost::filesystem::exists(file.str())) + GetLogger()->Debug("Music %s was not cached!\n", filename.c_str()); + if (!boost::filesystem::exists(file)) { - GetLogger()->Warn("Requested music %s was not found.\n", filename.c_str()); + GetLogger()->Debug("Requested music %s was not found.\n", filename.c_str()); return false; } - Buffer *buffer = new Buffer(); - buffer->LoadFromFile(file.str(), static_cast<Sound>(-1)); - m_currentMusic->SetBuffer(buffer); + + buffer = new Buffer(); + if (!buffer->LoadFromFile(file, static_cast<Sound>(-1))) + { + return false; + } + m_music[filename] = buffer; } else { GetLogger()->Debug("Music loaded from cache\n"); - m_currentMusic->SetBuffer(m_music[filename]); + buffer = m_music[filename]; + } + + if (m_currentMusic) + { + OldMusic old; + old.music = m_currentMusic; + old.fadeTime = fadeTime; + old.currentTime = 0.0f; + m_oldMusic.push_back(old); } + m_currentMusic = new Channel(); + m_currentMusic->SetBuffer(buffer); m_currentMusic->SetVolume(m_musicVolume); m_currentMusic->SetLoop(bRepeat); m_currentMusic->Play(); @@ -663,6 +680,55 @@ bool ALSound::PlayMusic(std::string filename, bool bRepeat) } +bool ALSound::PlayPauseMusic(const std::string &filename, bool repeat) +{ + if (m_previousMusic.fadeTime > 0.0f) + { + if(m_currentMusic) + { + OldMusic old; + old.music = m_currentMusic; + old.fadeTime = 2.0f; + old.currentTime = 0.0f; + m_oldMusic.push_back(old); + m_currentMusic = nullptr; + } + } + else + { + if (m_currentMusic) + { + m_previousMusic.music = m_currentMusic; + m_previousMusic.fadeTime = 2.0f; + m_previousMusic.currentTime = 0.0f; + m_currentMusic = nullptr; + } + } + return PlayMusic(filename, repeat); +} + + +void ALSound::StopPauseMusic() +{ + if (m_previousMusic.fadeTime > 0.0f) + { + StopMusic(); + + m_currentMusic = m_previousMusic.music; + m_previousMusic.music = nullptr; + if(m_currentMusic != nullptr) + { + m_currentMusic->SetVolume(m_musicVolume); + if(m_previousMusic.currentTime >= m_previousMusic.fadeTime) + { + m_currentMusic->Play(); + } + } + m_previousMusic.fadeTime = 0.0f; + } +} + + bool ALSound::RestartMusic() { if (!m_enabled || !m_currentMusic) @@ -675,14 +741,21 @@ bool ALSound::RestartMusic() return true; } -void ALSound::StopMusic() + +void ALSound::StopMusic(float fadeTime) { if (!m_enabled || !m_currentMusic) { return; } - SuspendMusic(); + OldMusic old; + old.music = m_currentMusic; + old.fadeTime = fadeTime; + old.currentTime = 0.0f; + m_oldMusic.push_back(old); + + m_currentMusic = nullptr; } @@ -708,64 +781,30 @@ void ALSound::SuspendMusic() } -void ALSound::ComputeVolumePan2D(int channel, Math::Vector &pos) +bool ALSound::CheckChannel(int &channel) { - float dist, a, g; - m_channels[channel]->SetPosition(pos); + int id = (channel >> 16) & 0xffff; + channel &= 0xffff; - if (VectorsEqual(pos, m_eye)) + if (!m_enabled) { - m_channels[channel]->SetVolumeAtrib(1.0f); // maximum volume - m_channels[channel]->SetPan(Math::Vector()); // at the center - return; + return false; } - dist = Distance(pos, m_eye); - if ( dist >= 110.0f ) // very far? - { - m_channels[channel]->SetVolumeAtrib(0.0f); // silence - m_channels[channel]->SetPan(Math::Vector()); // at the center - return; - } - else if ( dist <= 10.0f ) // very close? + if (m_channels.find(channel) == m_channels.end()) { - m_channels[channel]->SetVolumeAtrib(1.0f); // maximum volume - m_channels[channel]->SetPan(Math::Vector()); // at the center - return; + return false; } - m_channels[channel]->SetVolumeAtrib(1.0f - ((dist - 10.0f) / 100.0f)); - Math::Vector one = Math::Vector(1.0f, 0.0f, 0.0f); - float angle_a = Angle(Math::Vector(m_lookat.x - m_eye.x, m_lookat.z - m_eye.z, 0.0f), one); - float angle_g = Angle(Math::Vector(pos.x - m_eye.x, pos.z - m_eye.z, 0.0f), one); - - a = fmodf(angle_a, Math::PI * 2.0f); - g = fmodf(angle_g, Math::PI * 2.0f); - - if ( a < 0.0f ) + if (m_audioVolume == 0) { - a += Math::PI * 2.0f; - } - if ( g < 0.0f ) - { - g += Math::PI * 2.0f; + return false; } - if ( a < g ) + if (m_channels[channel]->GetId() != id) { - if (a + Math::PI * 2.0f - g < g - a ) - { - a += Math::PI * 2.0f; - } - } - else - { - if ( g + Math::PI * 2.0f - a < a - g ) - { - g += Math::PI * 2.0f; - } + return false; } - m_channels[channel]->SetPan( Math::Vector(0.0f, 0.0f, sinf(g - a)) ); + return true; } - diff --git a/src/sound/oalsound/alsound.h b/src/sound/oalsound/alsound.h index cd44ae9..bb9bf28 100644 --- a/src/sound/oalsound/alsound.h +++ b/src/sound/oalsound/alsound.h @@ -31,73 +31,75 @@ #include <map> #include <string> +#include <list> #include <al.h> +struct OldMusic { + Channel* music; + float fadeTime; + float currentTime; +}; + class ALSound : public CSoundInterface { public: ALSound(); ~ALSound(); - bool Create(bool b3D); - bool Cache(Sound, std::string); - bool CacheMusic(std::string); + bool Create(); + bool Cache(Sound, const std::string &); + bool CacheMusic(const std::string &); bool GetEnable(); - void SetSound3D(bool bMode); - bool GetSound3D(); - bool GetSound3DCap(); - void SetAudioVolume(int volume); int GetAudioVolume(); void SetMusicVolume(int volume); int GetMusicVolume(); - void SetListener(Math::Vector eye, Math::Vector lookat); + void SetListener(const Math::Vector &eye, const Math::Vector &lookat); void FrameMove(float rTime); int Play(Sound sound, float amplitude=1.0f, float frequency=1.0f, bool bLoop = false); - int Play(Sound sound, Math::Vector pos, float amplitude=1.0f, float frequency=1.0f, bool bLoop = false); + int Play(Sound sound, const Math::Vector &pos, float amplitude=1.0f, float frequency=1.0f, bool bLoop = false); bool FlushEnvelope(int channel); bool AddEnvelope(int channel, float amplitude, float frequency, float time, SoundNext oper); - bool Position(int channel, Math::Vector pos); + bool Position(int channel, const Math::Vector &pos); bool Frequency(int channel, float frequency); bool Stop(int channel); bool StopAll(); bool MuteAll(bool bMute); - bool PlayMusic(int rank, bool bRepeat); - bool PlayMusic(std::string filename, bool bRepeat); + bool PlayMusic(int rank, bool bRepeat, float fadeTime=2.0f); + bool PlayMusic(const std::string &filename, bool bRepeat, float fadeTime=2.0f); bool RestartMusic(); void SuspendMusic(); - void StopMusic(); + void StopMusic(float fadeTime=2.0f); bool IsPlayingMusic(); + bool PlayPauseMusic(const std::string &filename, bool repeat); + void StopPauseMusic(); - // plugin interface - std::string PluginName(); - int PluginVersion(); - void InstallPlugin(); - bool UninstallPlugin(std::string &); + bool CheckChannel(int &channel); private: void CleanUp(); int GetPriority(Sound); bool SearchFreeBuffer(Sound sound, int &channel, bool &bAlreadyLoaded); - void ComputeVolumePan2D(int channel, Math::Vector &pos); bool m_enabled; - bool m_3D; float m_audioVolume; float m_musicVolume; + unsigned int m_channels_limit; ALCdevice* m_device; ALCcontext* m_context; std::map<Sound, Buffer*> m_sounds; std::map<std::string, Buffer*> m_music; std::map<int, Channel*> m_channels; Channel *m_currentMusic; + std::list<OldMusic> m_oldMusic; + OldMusic m_previousMusic; Math::Vector m_eye; Math::Vector m_lookat; }; diff --git a/src/sound/oalsound/buffer.cpp b/src/sound/oalsound/buffer.cpp index 0047f91..b27029c 100644 --- a/src/sound/oalsound/buffer.cpp +++ b/src/sound/oalsound/buffer.cpp @@ -32,7 +32,7 @@ Buffer::~Buffer() { alDeleteBuffers(1, &m_buffer); if (alCheck()) - GetLogger()->Warn("Failed to unload buffer. Code %d\n", alGetCode()); + GetLogger()->Debug("Failed to unload buffer. Code %d\n", alGetCode()); } } diff --git a/src/sound/oalsound/channel.cpp b/src/sound/oalsound/channel.cpp index 4d89df5..7021c2f 100644 --- a/src/sound/oalsound/channel.cpp +++ b/src/sound/oalsound/channel.cpp @@ -23,7 +23,7 @@ Channel::Channel() if (alCheck()) { - GetLogger()->Warn("Failed to create sound source. Code: %d\n", alGetCode()); + GetLogger()->Debug("Failed to create sound source. Code: %d\n", alGetCode()); m_ready = false; } else @@ -40,6 +40,7 @@ Channel::Channel() m_startFrequency = 0.0f; m_changeFrequency = 0.0f; m_volume = 0.0f; + m_id = 0; } @@ -51,7 +52,7 @@ Channel::~Channel() alSourcei(m_source, AL_BUFFER, 0); alDeleteSources(1, &m_source); if (alCheck()) - GetLogger()->Warn("Failed to delete sound source. Code: %d\n", alGetCode()); + GetLogger()->Debug("Failed to delete sound source. Code: %d\n", alGetCode()); } } @@ -69,38 +70,41 @@ bool Channel::Play() alSourcePlay(m_source); if (alCheck()) { - GetLogger()->Warn("Could not play audio sound source. Code: %d\n", alGetCode()); + GetLogger()->Debug("Could not play audio sound source. Code: %d\n", alGetCode()); } return true; } - -bool Channel::SetPan(Math::Vector pos) +bool Channel::Pause() { - if (!m_ready || m_buffer == nullptr) + if(!m_ready || !IsPlaying()) { return false; } - - alSource3f(m_source, AL_POSITION, pos.x, pos.y, pos.z); + + alSourcePause(m_source); if (alCheck()) { - GetLogger()->Warn("Could not set sound position. Code: %d\n", alGetCode()); - return false; + GetLogger()->Debug("Could not pause audio sound source. Code: %d\n", alGetCode()); } return true; } -void Channel::SetPosition(Math::Vector pos) +bool Channel::SetPosition(const Math::Vector &pos) { - m_position = pos; -} - + if (!m_ready || m_buffer == nullptr) + { + return false; + } -Math::Vector Channel::GetPosition() -{ - return m_position; + alSource3f(m_source, AL_POSITION, pos.x, pos.y, pos.z); + if (alCheck()) + { + GetLogger()->Debug("Could not set sound position. Code: %d\n", alGetCode()); + return false; + } + return true; } @@ -114,7 +118,7 @@ bool Channel::SetFrequency(float freq) alSourcef(m_source, AL_PITCH, freq); if (alCheck()) { - GetLogger()->Warn("Could not set sound pitch to '%f'. Code: %d\n", freq, alGetCode()); + GetLogger()->Debug("Could not set sound pitch to '%f'. Code: %d\n", freq, alGetCode()); return false; } return true; @@ -132,7 +136,7 @@ float Channel::GetFrequency() alGetSourcef(m_source, AL_PITCH, &freq); if (alCheck()) { - GetLogger()->Warn("Could not get sound pitch. Code: %d\n", alGetCode()); + GetLogger()->Debug("Could not get sound pitch. Code: %d\n", alGetCode()); return 0; } @@ -150,7 +154,7 @@ bool Channel::SetVolume(float vol) alSourcef(m_source, AL_GAIN, vol); if (alCheck()) { - GetLogger()->Warn("Could not set sound volume to '%f'. Code: %d\n", vol, alGetCode()); + GetLogger()->Debug("Could not set sound volume to '%f'. Code: %d\n", vol, alGetCode()); return false; } return true; @@ -168,7 +172,7 @@ float Channel::GetVolume() alGetSourcef(m_source, AL_GAIN, &vol); if (alCheck()) { - GetLogger()->Warn("Could not get sound volume. Code: %d\n", alGetCode()); + GetLogger()->Debug("Could not get sound volume. Code: %d\n", alGetCode()); return 0; } @@ -431,3 +435,15 @@ bool Channel::IsMuted() return m_mute; } + +void Channel::Reset() +{ + m_id++; +} + + +int Channel::GetId() +{ + return m_id; +} + diff --git a/src/sound/oalsound/channel.h b/src/sound/oalsound/channel.h index 2930f26..1d988c9 100644 --- a/src/sound/oalsound/channel.h +++ b/src/sound/oalsound/channel.h @@ -50,11 +50,10 @@ public: ~Channel(); bool Play(); + bool Pause(); bool Stop(); - bool SetPan(Math::Vector); - void SetPosition(Math::Vector); - Math::Vector GetPosition(); + bool SetPosition(const Math::Vector &); bool SetFrequency(float); float GetFrequency(); @@ -98,11 +97,15 @@ public: void Mute(bool); bool IsMuted(); + void Reset(); + int GetId(); + private: Buffer *m_buffer; ALuint m_source; int m_priority; + int m_id; float m_startAmplitude; float m_startFrequency; float m_changeFrequency; diff --git a/src/sound/sound.cpp b/src/sound/sound.cpp index d392612..9cae1fd 100644 --- a/src/sound/sound.cpp +++ b/src/sound/sound.cpp @@ -36,37 +36,36 @@ CSoundInterface::~CSoundInterface() { } -bool CSoundInterface::Create(bool b3D) +bool CSoundInterface::Create() { return true; } -void CSoundInterface::CacheAll(std::string path) +void CSoundInterface::CacheAll() { for ( int i = 1; i < SOUND_MAX; i++ ) { std::stringstream filename; - filename << path << "/sound" << std::setfill('0') << std::setw(3) << i << ".wav"; + filename << "sound" << std::setfill('0') << std::setw(3) << i << ".wav"; if ( !Cache(static_cast<Sound>(i), filename.str()) ) GetLogger()->Warn("Unable to load audio: %s\n", filename.str().c_str()); } } -void CSoundInterface::AddMusicFiles(std::string path) +void CSoundInterface::AddMusicFiles() { - m_soundPath = path; CacheMusic("Intro1.ogg"); CacheMusic("Intro2.ogg"); CacheMusic("music010.ogg"); CacheMusic("music011.ogg"); } -bool CSoundInterface::Cache(Sound bSound, std::string bFile) +bool CSoundInterface::Cache(Sound bSound, const std::string &bFile) { return true; } -bool CSoundInterface::CacheMusic(std::string bFile) +bool CSoundInterface::CacheMusic(const std::string &bFile) { return true; } @@ -76,20 +75,6 @@ bool CSoundInterface::GetEnable() return true; } -void CSoundInterface::SetSound3D(bool bMode) -{ -} - -bool CSoundInterface::GetSound3D() -{ - return true; -} - -bool CSoundInterface::GetSound3DCap() -{ - return true; -} - void CSoundInterface::SetAudioVolume(int volume) { } @@ -108,7 +93,7 @@ int CSoundInterface::GetMusicVolume() return 0; } -void CSoundInterface::SetListener(Math::Vector eye, Math::Vector lookat) +void CSoundInterface::SetListener(const Math::Vector &eye, const Math::Vector &lookat) { } @@ -121,7 +106,7 @@ int CSoundInterface::Play(Sound sound, float amplitude, float frequency, bool bL return 0; } -int CSoundInterface::Play(Sound sound, Math::Vector pos, float amplitude, float frequency, bool bLoop) +int CSoundInterface::Play(Sound sound, const Math::Vector &pos, float amplitude, float frequency, bool bLoop) { return 0; } @@ -136,7 +121,7 @@ bool CSoundInterface::AddEnvelope(int channel, float amplitude, float frequency, return true; } -bool CSoundInterface::Position(int channel, Math::Vector pos) +bool CSoundInterface::Position(int channel, const Math::Vector &pos) { return true; } @@ -161,12 +146,12 @@ bool CSoundInterface::MuteAll(bool bMute) return true; } -bool CSoundInterface::PlayMusic(int rank, bool bRepeat) +bool CSoundInterface::PlayMusic(int rank, bool bRepeat, float fadeTime) { return true; } -bool CSoundInterface::PlayMusic(std::string filename, bool bRepeat) +bool CSoundInterface::PlayMusic(const std::string &filename, bool bRepeat, float fadeTime) { return true; } @@ -180,7 +165,7 @@ void CSoundInterface::SuspendMusic() { } -void CSoundInterface::StopMusic() +void CSoundInterface::StopMusic(float fadeTime) { } @@ -189,3 +174,11 @@ bool CSoundInterface::IsPlayingMusic() return true; } +bool CSoundInterface::PlayPauseMusic(const std::string &filename, bool repeat) +{ + return true; +} + +void CSoundInterface::StopPauseMusic() +{ +} diff --git a/src/sound/sound.h b/src/sound/sound.h index 9ccc1b6..22a5ee2 100644 --- a/src/sound/sound.h +++ b/src/sound/sound.h @@ -153,17 +153,16 @@ public: virtual ~CSoundInterface(); /** Function to initialize sound device - * \param b3D - enable support for 3D sound */ - virtual bool Create(bool b3D); + virtual bool Create(); /** Function called to cache all sound effect files. * Function calls \link CSoundInterface::Cache() \endlink for each file */ - void CacheAll(std::string path); + void CacheAll(); /** Function called to add all music files to list */ - void AddMusicFiles(std::string path); + void AddMusicFiles(); /** Function called to cache sound effect file. * This function is called by plugin interface for each file. @@ -171,35 +170,20 @@ public: * \param bFile - file to load * \return return true on success */ - virtual bool Cache(Sound bSound, std::string bFile); + virtual bool Cache(Sound bSound, const std::string &bFile); /** Function called to cache music file. * This function is called by CRobotMain for each file used in the mission. * \param bFile - file to load * \return return true on success */ - virtual bool CacheMusic(std::string bFile); + virtual bool CacheMusic(const std::string &bFile); /** Return if plugin is enabled * \return return true if plugin is enabled */ virtual bool GetEnable(); - /** Change sound mode to 2D/3D - * \param bMode - true to enable 3D sound - */ - virtual void SetSound3D(bool bMode); - - /** Return if we use 3D sound - * \return true if we have 3D sound enabled - */ - virtual bool GetSound3D(); - - /** Return if we have 3D sound capable card - * \return true for 3D sound support - */ - virtual bool GetSound3DCap(); - /** Change global sound volume * \param volume - range from 0 to MAXVOLUME */ @@ -224,7 +208,7 @@ public: * \param eye - position of listener * \param lookat - direction listener is looking at */ - virtual void SetListener(Math::Vector eye, Math::Vector lookat); + virtual void SetListener(const Math::Vector &eye, const Math::Vector &lookat); /** Update data each frame * \param rTime - time since last update @@ -248,7 +232,7 @@ public: * \param bLoop - loop sound * \return identifier of channel that sound will be played on */ - virtual int Play(Sound sound, Math::Vector pos, float amplitude=1.0f, float frequency=1.0f, bool bLoop = false); + virtual int Play(Sound sound, const Math::Vector &pos, float amplitude=1.0f, float frequency=1.0f, bool bLoop = false); /** Remove all operations that would be made on sound in channel. * \param channel - channel to work on @@ -271,7 +255,7 @@ public: * \param pos - new positino of a sound * \return return true on success */ - virtual bool Position(int channel, Math::Vector pos); + virtual bool Position(int channel, const Math::Vector &pos); /** Set sound frequency * \param channel - channel to work on @@ -300,38 +284,48 @@ public: /** Start playing music * \param rank - track number * \param bRepeat - repeat playing + * \param fadeTime - time of transition between music * \return return true on success */ - virtual bool PlayMusic(int rank, bool bRepeat); + virtual bool PlayMusic(int rank, bool bRepeat, float fadeTime=2.0f); /** Start playing music * \param filename - name of file to play * \param bRepeat - repeat playing + * \param fadeTime - time of transition between music * \return return true on success */ - virtual bool PlayMusic(std::string filename, bool bRepeat); + virtual bool PlayMusic(const std::string &filename, bool bRepeat, float fadeTime=2.0f); /** Restart music - * @return return true on success + * \return return true on success */ virtual bool RestartMusic(); - /** Susspend paying music - * \return return true on success + /** Susspend playing music + * \return nothing */ virtual void SuspendMusic(); /** Stop playing music - * \return return true on success + * \return nothing */ - virtual void StopMusic(); + virtual void StopMusic(float fadeTime=2.0f); /** Check if music if playing * \return return true if music is playing */ virtual bool IsPlayingMusic(); - -protected: - std::string m_soundPath; + + /** Start playing pause music + * \param filename - name of file to play + * \return return true on success + */ + virtual bool PlayPauseMusic(const std::string &filename, bool repeat); + + /** Stop playing pause music and return to the mission music + * \return nothing + */ + virtual void StopPauseMusic(); }; diff --git a/src/ui/button.cpp b/src/ui/button.cpp index 348382d..810d365 100644 --- a/src/ui/button.cpp +++ b/src/ui/button.cpp @@ -60,12 +60,7 @@ bool CButton::Create(Math::Point pos, Math::Point dim, int icon, EventType event if ( icon == -1 ) { - char name[100]; - char* p; - - GetResource(RES_EVENT, eventType, name); - p = strchr(name, '\\'); - if ( p != 0 ) *p = 0; + std::string name = GetResourceName(eventType); SetName(name); } diff --git a/src/ui/check.cpp b/src/ui/check.cpp index 362c930..6a92554 100644 --- a/src/ui/check.cpp +++ b/src/ui/check.cpp @@ -47,16 +47,11 @@ CCheck::~CCheck() bool CCheck::Create(Math::Point pos, Math::Point dim, int icon, EventType eventType) { - char name[100]; - char* p; - if ( eventType == EVENT_NULL ) eventType = GetUniqueEventType(); CControl::Create(pos, dim, icon, eventType); - GetResource(RES_EVENT, eventType, name); - p = strchr(name, '\\'); - if ( p != 0 ) *p = 0; + std::string name = GetResourceName(eventType); SetName(name); return true; diff --git a/src/ui/color.cpp b/src/ui/color.cpp index 623ff89..d1dc746 100644 --- a/src/ui/color.cpp +++ b/src/ui/color.cpp @@ -64,12 +64,7 @@ bool CColor::Create(Math::Point pos, Math::Point dim, int icon, EventType eventT if ( icon == -1 ) { - char name[100]; - char* p; - - GetResource(RES_EVENT, eventType, name); - p = strchr(name, '\\'); - if ( p != 0 ) *p = 0; + std::string name = GetResourceName(eventType); SetName(name); } @@ -146,38 +141,7 @@ void CColor::Draw() m_engine->SetTexture("button1.png"); m_engine->SetState(Gfx::ENG_RSTATE_NORMAL); CControl::Draw(); - -#if _TEEN -// color = GetColor(m_color); - color = GetColor(); - - m_engine->SetTexture(""); // no texture - m_engine->SetState(Gfx::ENG_RSTATE_NORMAL); - - device = m_engine->GetDevice(); - - p1.x = m_pos.x + (4.0f / 640.0f); - p1.y = m_pos.y + (4.0f / 480.0f); - p2.x = m_pos.x + m_dim.x - (4.0f / 640.0f); - p2.y = m_pos.y + m_dim.y - (4.0f / 480.0f); - vertex[0] = Gfx::Vertex(Math::Vector(p1.x, p1.y, 0.0f), 0x00000000,0x00000000, Math::Point( 0.0f, 0.0f)); - vertex[1] = Gfx::Vertex(Math::Vector(p1.x, p2.y, 0.0f), 0x00000000,0x00000000, Math::Point( 0.0f, 0.0f)); - vertex[2] = Gfx::Vertex(Math::Vector(p2.x, p1.y, 0.0f), 0x00000000,0x00000000, Math::Point( 0.0f, 0.0f)); - vertex[3] = Gfx::Vertex(Math::Vector(p2.x, p2.y, 0.0f), 0x00000000,0x00000000, Math::Point( 0.0f, 0.0f)); - device->DrawPrimitive(Gfx::PRIMITIVE_TRIANGLE_STRIP, vertex, 4); - - p1.x = m_pos.x + (5.0f / 640.0f); - p1.y = m_pos.y + (5.0f / 480.0f); - p2.x = m_pos.x + m_dim.x - (5.0f / 640.0f); - p2.y = m_pos.y + m_dim.y - (5.0f / 480.0f); - vertex[0] = Gfx::Vertex(Math::Vector(p1.x, p1.y, 0.0f), color,0x00000000, Math::Point( 0.0f, 0.0f)); - vertex[1] = Gfx::Vertex(Math::Vector(p1.x, p2.y, 0.0f), color,0x00000000, Math::Point( 0.0f, 0.0f)); - vertex[2] = Gfx::Vertex(Math::Vector(p2.x, p1.y, 0.0f), color,0x00000000, Math::Point( 0.0f, 0.0f)); - vertex[3] = Gfx::Vertex(Math::Vector(p2.x, p2.y, 0.0f), color,0x00000000, Math::Point( 0.0f, 0.0f)); - device->DrawPrimitive(Gfx::PRIMITIVE_TRIANGLE_STRIP, vertex, 4); - - m_engine->AddStatisticTriangle(4); -#else + p1.x = m_pos.x + (3.0f / 640.0f); p1.y = m_pos.y + (3.0f / 480.0f); p2.x = m_pos.x + m_dim.x - (3.0f / 640.0f); @@ -196,7 +160,6 @@ void CColor::Draw() device = m_engine->GetDevice(); device->DrawPrimitive(Gfx::PRIMITIVE_TRIANGLE_STRIP, vertex, 4); m_engine->AddStatisticTriangle(2); -#endif } diff --git a/src/ui/control.cpp b/src/ui/control.cpp index bed84dd..4e64ee9 100644 --- a/src/ui/control.cpp +++ b/src/ui/control.cpp @@ -57,9 +57,6 @@ CControl::~CControl() bool CControl::Create(Math::Point pos, Math::Point dim, int icon, EventType eventType) { - char text[200]; - std::string str_text; - if ( eventType == EVENT_NULL ) eventType = GetUniqueEventType(); @@ -72,17 +69,17 @@ bool CControl::Create(Math::Point pos, Math::Point dim, int icon, EventType even pos.y = m_pos.y + m_dim.y; GlintCreate(pos); + std::string text; GetResource(RES_EVENT, m_eventType, text); - str_text = std::string(text); - auto p = str_text.find("\\"); - if ( p == std::string::npos ) + auto p = text.find("\\"); + if (p == std::string::npos) { if ( icon != -1 ) - m_tooltip = str_text; + m_tooltip = text; } else { - m_tooltip = str_text.substr(p + 1); + m_tooltip = text.substr(p + 1); } return true; @@ -509,11 +506,7 @@ void CControl::Draw() if ( icon >= 192 ) { icon -= 192; -#if _POLISH - m_engine->SetTexture("textp.png"); -#else m_engine->SetTexture("text.png"); -#endif m_engine->SetState(Gfx::ENG_RSTATE_TTEXTURE_WHITE); } else if ( icon >= 128 ) @@ -837,5 +830,18 @@ bool CControl::Detect(Math::Point pos) pos.y <= m_pos.y + m_dim.y ); } +std::string CControl::GetResourceName(EventType eventType) +{ + std::string name; + GetResource(RES_EVENT, eventType, name); + auto index = name.find('\\'); + if (index != std::string::npos) + { + name = name.substr(0, index); + } + return name; +} + + } diff --git a/src/ui/control.h b/src/ui/control.h index aee7d1c..1ca07cf 100644 --- a/src/ui/control.h +++ b/src/ui/control.h @@ -112,6 +112,8 @@ protected: void DrawShadow(Math::Point pos, Math::Point dim, float deep=1.0f); virtual bool Detect(Math::Point pos); + std::string GetResourceName(EventType eventType); + protected: Gfx::CEngine* m_engine; Gfx::CParticle* m_particle; diff --git a/src/ui/displayinfo.cpp b/src/ui/displayinfo.cpp index 3aa3d73..e7748ae 100644 --- a/src/ui/displayinfo.cpp +++ b/src/ui/displayinfo.cpp @@ -23,6 +23,7 @@ #include "common/iman.h" #include "common/misc.h" #include "common/restext.h" +#include "common/stringutils.h" #include "graphics/core/light.h" #include "graphics/engine/engine.h" @@ -58,6 +59,7 @@ CDisplayInfo::CDisplayInfo() m_main = CRobotMain::GetInstancePointer(); m_interface = m_main->GetInterface(); m_camera = m_main->GetCamera(); + m_pause = CPauseManager::GetInstancePointer(); m_bInfoMaximized = true; m_bInfoMinimized = false; @@ -329,13 +331,13 @@ void CDisplayInfo::HyperUpdate() void CDisplayInfo::StartDisplayInfo(std::string filename, int index, bool bSoluce) { - Gfx::Light light; + Gfx::Light light; Math::Point pos, dim; Ui::CWindow* pw; Ui::CEdit* edit; Ui::CButton* button; Ui::CSlider* slider; - CMotionToto* toto; + CMotionToto* toto; m_index = index; m_bSoluce = bSoluce; @@ -354,8 +356,8 @@ void CDisplayInfo::StartDisplayInfo(std::string filename, int index, bool bSoluc m_main->SetEditLock(true, false); m_main->SetEditFull(false); - m_bInitPause = m_engine->GetPause(); - m_engine->SetPause(true); + m_bInitPause = m_pause->GetPauseType(); + m_pause->SetPause(PAUSE_SATCOM); m_infoCamera = m_camera->GetType(); m_camera->SetType(Gfx::CAM_TYPE_INFO); @@ -388,13 +390,7 @@ void CDisplayInfo::StartDisplayInfo(std::string filename, int index, bool bSoluc button = pw->CreateButton(pos, dim, 128+57, EVENT_SATCOM_HUSTON); button->SetState(STATE_SHADOW); -#if _TEEN -#if !_ENGLISH - button = pw->CreateButton(pos, dim, 46, EVENT_SATCOM_SAT); -#endif -#else button = pw->CreateButton(pos, dim, 128+58, EVENT_SATCOM_SAT); -#endif button->SetState(STATE_SHADOW); //? button = pw->CreateButton(pos, dim, 128+59, EVENT_SATCOM_OBJECT); //? button->SetState(STATE_SHADOW); @@ -838,7 +834,7 @@ void CDisplayInfo::StopDisplayInfo() } else { - if ( !m_bInitPause ) m_engine->SetPause(false); + m_pause->SetPause(m_bInitPause); m_main->SetEditLock(false, false); } m_camera->SetType(m_infoCamera); @@ -971,31 +967,41 @@ void ObjectAdd(ObjectList list[], ObjectType type) void ObjectWrite(FILE* file, ObjectList list[], int i) { - char line[100]; - char res[100]; - char* p; + std::string line; if ( list[i].total < 10 ) { - sprintf(line, "\\c; %dx \\n;\\l;", list[i].total); + line = StrUtils::Format("\\c; %dx \\n;\\l;", list[i].total); } else { - sprintf(line, "\\c;%dx \\n;\\l;", list[i].total); + line = StrUtils::Format("\\c;%dx \\n;\\l;", list[i].total); } + std::string res; GetResource(RES_OBJECT, list[i].type, res); - if ( res[0] == 0 ) return; - strcat(line, res); - - strcat(line, "\\u "); - p = const_cast<char*>(GetHelpFilename(list[i].type).c_str()); - if ( p[0] == 0 ) return; - strcat(line, p+7); // skip "help\?\" - p = strstr(line, ".txt"); - if ( p != 0 ) *p = 0; - strcat(line, ";\n"); - fputs(line, file); + if (res.empty()) + return; + + line += res; + + line += "\\u "; + + std::string helpFilename = GetHelpFilename(list[i].type); + if (helpFilename.empty()) + return; + + line += helpFilename.substr(7); // skip "help\?\" + + auto pos = line.find(".txt"); + if (pos != std::string::npos) + { + line = line.substr(0, pos); + } + + line += ";\n"; + + fputs(line.c_str(), file); } // Creates the file containing the list of objects. @@ -1006,7 +1012,7 @@ void CDisplayInfo::CreateObjectsFile() CObject* pObj; ObjectType type; ObjectList list[200]; - char line[100]; + std::string line; int i; bool bRadar, bAtLeast; @@ -1038,7 +1044,7 @@ void CDisplayInfo::CreateObjectsFile() if ( bRadar ) { GetResource(RES_TEXT, RT_SATCOM_LIST, line); - fputs(line, file); + fputs(line.c_str(), file); bAtLeast = false; for ( i=0 ; i<200 ; i++ ) { @@ -1054,13 +1060,12 @@ void CDisplayInfo::CreateObjectsFile() if ( !bAtLeast ) { GetResource(RES_TEXT, RT_SATCOM_NULL, line); - fputs(line, file); + fputs(line.c_str(), file); } - strcpy(line, "\n"); - fputs(line, file); + fputs("\n", file); GetResource(RES_TEXT, RT_SATCOM_BOT, line); - fputs(line, file); + fputs(line.c_str(), file); bAtLeast = false; for ( i=0 ; i<200 ; i++ ) { @@ -1101,13 +1106,12 @@ void CDisplayInfo::CreateObjectsFile() if ( !bAtLeast ) { GetResource(RES_TEXT, RT_SATCOM_NULL, line); - fputs(line, file); + fputs(line.c_str(), file); } - strcpy(line, "\n"); - fputs(line, file); + fputs("\n", file); GetResource(RES_TEXT, RT_SATCOM_BUILDING, line); - fputs(line, file); + fputs(line.c_str(), file); bAtLeast = false; for ( i=0 ; i<200 ; i++ ) { @@ -1142,13 +1146,12 @@ void CDisplayInfo::CreateObjectsFile() if ( !bAtLeast ) { GetResource(RES_TEXT, RT_SATCOM_NULL, line); - fputs(line, file); + fputs(line.c_str(), file); } - strcpy(line, "\n"); - fputs(line, file); + fputs("\n", file); GetResource(RES_TEXT, RT_SATCOM_FRET, line); - fputs(line, file); + fputs(line.c_str(), file); bAtLeast = false; for ( i=0 ; i<200 ; i++ ) { @@ -1170,13 +1173,12 @@ void CDisplayInfo::CreateObjectsFile() if ( !bAtLeast ) { GetResource(RES_TEXT, RT_SATCOM_NULL, line); - fputs(line, file); + fputs(line.c_str(), file); } - strcpy(line, "\n"); - fputs(line, file); + fputs("\n", file); GetResource(RES_TEXT, RT_SATCOM_ALIEN, line); - fputs(line, file); + fputs(line.c_str(), file); bAtLeast = false; for ( i=0 ; i<200 ; i++ ) { @@ -1195,19 +1197,18 @@ void CDisplayInfo::CreateObjectsFile() if ( !bAtLeast ) { GetResource(RES_TEXT, RT_SATCOM_NULL, line); - fputs(line, file); + fputs(line.c_str(), file); } } else { GetResource(RES_TEXT, RT_SATCOM_ERROR1, line); - fputs(line, file); + fputs(line.c_str(), file); GetResource(RES_TEXT, RT_SATCOM_ERROR2, line); - fputs(line, file); + fputs(line.c_str(), file); } - strcpy(line, "\n"); - fputs(line, file); + fputs("\n", file); fclose(file); } diff --git a/src/ui/displayinfo.h b/src/ui/displayinfo.h index eea50b7..891551b 100644 --- a/src/ui/displayinfo.h +++ b/src/ui/displayinfo.h @@ -25,6 +25,8 @@ #include "graphics/engine/camera.h" +#include "app/pausemanager.h" + class CRobotMain; class CObject; class CEventQueue; @@ -67,13 +69,14 @@ protected: void CreateObjectsFile(); protected: - Gfx::CEngine* m_engine; - CEventQueue* m_event; - CRobotMain* m_main; - Gfx::CCamera* m_camera; - CInterface* m_interface; - Gfx::CParticle* m_particle; - Gfx::CLightManager* m_light; + Gfx::CEngine* m_engine; + CEventQueue* m_event; + CRobotMain* m_main; + Gfx::CCamera* m_camera; + CInterface* m_interface; + Gfx::CParticle* m_particle; + Gfx::CLightManager* m_light; + CPauseManager* m_pause; bool m_bInfoMaximized; bool m_bInfoMinimized; @@ -88,7 +91,7 @@ protected: Math::Point m_infoFinalDim; int m_lightSuppl; bool m_bEditLock; - bool m_bInitPause; + PauseType m_bInitPause; bool m_bSoluce; CObject* m_toto; }; diff --git a/src/ui/displaytext.cpp b/src/ui/displaytext.cpp index d88674a..5b3144d 100644 --- a/src/ui/displaytext.cpp +++ b/src/ui/displaytext.cpp @@ -127,9 +127,6 @@ void CDisplayText::DisplayError(Error err, CObject* pObj, float time) void CDisplayText::DisplayError(Error err, Math::Vector goal, float height, float dist, float time) { - TextType type; - char text[100]; - if ( err == ERR_OK ) return; #if 0 @@ -148,7 +145,7 @@ void CDisplayText::DisplayError(Error err, Math::Vector goal, float height, type = TT_WARNING; } #else - type = TT_WARNING; + TextType type = TT_WARNING; if ( err >= INFO_FIRST ) { type = TT_INFO; @@ -164,8 +161,9 @@ void CDisplayText::DisplayError(Error err, Math::Vector goal, float height, } #endif + std::string text; GetResource(RES_ERR, err, text); - DisplayText(text, goal, height, dist, time, type); + DisplayText(text.c_str(), goal, height, dist, time, type); } // Displays text. diff --git a/src/ui/edit.cpp b/src/ui/edit.cpp index a187688..e2df62b 100644 --- a/src/ui/edit.cpp +++ b/src/ui/edit.cpp @@ -19,6 +19,7 @@ #include "ui/edit.h" #include "app/app.h" +#include "app/gamedata.h" #include "clipboard/clipboard.h" @@ -1224,11 +1225,7 @@ void CEdit::DrawPart(Math::Point pos, Math::Point dim, int icon) Math::Point uv1, uv2; float dp; -#if _POLISH - m_engine->SetTexture("textp.png"); -#else m_engine->SetTexture("text.png"); -#endif m_engine->SetState(Gfx::ENG_RSTATE_NORMAL); uv1.x = (16.0f/256.0f)*(icon%16); @@ -1462,11 +1459,14 @@ bool CEdit::ReadText(std::string filename, int addSize) std::string path = filename; if (!fs::exists(path)) { - path = CApplication::GetInstancePointer()->GetDataDirPath() + "/" + filename; + path = CGameData::GetInstancePointer()->GetDataPath(filename); } file = fopen(fs::path(path).make_preferred().string().c_str(), "rb"); - if ( file == NULL ) return false; + if ( file == NULL ) { + CLogger::GetInstancePointer()->Error("Unable to read text from file \"%s\"\n", path.c_str()); + return false; + } fseek(file, 0, SEEK_END); len = ftell(file); @@ -1669,12 +1669,14 @@ bool CEdit::ReadText(std::string filename, int addSize) buffer[i+6] == 'n' && buffer[i+7] == ' ' ) { + /* TODO: \button X; isn't working. Issue #232 if ( m_bSoluce || !bInSoluce ) { m_text[j] = GetValueParam(buffer+i+8, 0); m_format[j] = font|Gfx::FONT_BUTTON; j ++; } + */ i += strchr(buffer+i, ';')-(buffer+i)+1; } else if ( //m_format.size() > 0 && @@ -1798,8 +1800,10 @@ bool CEdit::ReadText(std::string filename, int addSize) res = main->GetInputBinding(slot).primary; if ( res != 0 ) { - if ( GetResource(RES_KEY, res, iName) ) + std::string iNameStr; + if ( GetResource(RES_KEY, res, iNameStr) ) { + strcpy(iName, iNameStr.c_str()); m_text[j] = ' '; m_format[j] = font; j ++; @@ -1817,9 +1821,13 @@ bool CEdit::ReadText(std::string filename, int addSize) res = main->GetInputBinding(slot).secondary; if ( res != 0 ) { - if ( GetResource(RES_KEY, res, iName) ) + if ( GetResource(RES_KEY, res, iNameStr) ) { - GetResource(RES_TEXT, RT_KEY_OR, text); + strcpy(iName, iNameStr.c_str()); + + std::string textStr; + GetResource(RES_TEXT, RT_KEY_OR, textStr); + strcpy(text, textStr.c_str()); n = 0; while ( text[n] != 0 ) { diff --git a/src/ui/group.cpp b/src/ui/group.cpp index 908ac19..64495e0 100644 --- a/src/ui/group.cpp +++ b/src/ui/group.cpp @@ -52,12 +52,7 @@ bool CGroup::Create(Math::Point pos, Math::Point dim, int icon, EventType eventT if ( icon == -1 ) { - char name[100]; - char* p; - - GetResource(RES_EVENT, eventType, name); - p = strchr(name, '\\'); - if ( p != 0 ) *p = 0; + std::string name = GetResourceName(eventType); SetName(name); } diff --git a/src/ui/image.cpp b/src/ui/image.cpp index 9a14789..8f9b5ca 100644 --- a/src/ui/image.cpp +++ b/src/ui/image.cpp @@ -58,12 +58,7 @@ bool CImage::Create(Math::Point pos, Math::Point dim, int icon, EventType eventT if ( icon == -1 ) { - char name[100]; - char* p; - - GetResource(RES_EVENT, eventType, name); - p = strchr(name, '\\'); - if ( p != 0 ) *p = 0; + std::string name = GetResourceName(eventType); SetName(name); } diff --git a/src/ui/key.cpp b/src/ui/key.cpp index 1f8cff5..aacc8d8 100644 --- a/src/ui/key.cpp +++ b/src/ui/key.cpp @@ -19,16 +19,19 @@ #include "ui/key.h" #include "common/global.h" +#include "common/stringutils.h" #include <cstring> namespace Ui { -void GetKeyName(char* name, unsigned int key) +static void GetKeyName(std::string& name, unsigned int key) { if (!GetResource(RES_KEY, key, name)) - sprintf(name, "Code %d", key); + { + name = StrUtils::Format("Code %d", key); + } } @@ -51,9 +54,9 @@ bool CKey::Create(Math::Point pos, Math::Point dim, int icon, EventType eventMsg CControl::Create(pos, dim, icon, eventMsg); - char name[100]; + std::string name; GetResource(RES_EVENT, eventMsg, name); - SetName(std::string(name)); + SetName(name); return true; } @@ -176,19 +179,24 @@ void CKey::Draw() float h = m_engine->GetText()->GetHeight(m_fontType, m_fontSize) / 2.0f; - char text[100]; - GetKeyName(text, m_binding.primary); + std::string keyName; + GetKeyName(keyName, m_binding.primary); if (m_binding.secondary != KEY_INVALID) { - GetResource(RES_TEXT, RT_KEY_OR, text+strlen(text)); - GetKeyName(text+strlen(text), m_binding.secondary); + std::string orText; + GetResource(RES_TEXT, RT_KEY_OR, orText); + keyName.append(orText); + + std::string secondaryKeyName; + GetKeyName(secondaryKeyName, m_binding.secondary); + keyName.append(secondaryKeyName); } Math::Point pos; pos.x = m_pos.x + m_dim.x * 0.5f; pos.y = m_pos.y + m_dim.y * 0.5f; pos.y -= h; - m_engine->GetText()->DrawText(std::string(text), m_fontType, m_fontSize, pos, m_dim.x, Gfx::TEXT_ALIGN_CENTER, 0); + m_engine->GetText()->DrawText(keyName, m_fontType, m_fontSize, pos, m_dim.x, Gfx::TEXT_ALIGN_CENTER, 0); m_dim = iDim; @@ -199,7 +207,7 @@ void CKey::Draw() pos.x = m_pos.x + (214.0f / 640.0f); pos.y = m_pos.y + m_dim.y * 0.5f; pos.y -= h; - m_engine->GetText()->DrawText(std::string(m_name), m_fontType, m_fontSize, pos, m_dim.x, Gfx::TEXT_ALIGN_LEFT, 0); + m_engine->GetText()->DrawText(m_name, m_fontType, m_fontSize, pos, m_dim.x, Gfx::TEXT_ALIGN_LEFT, 0); } void CKey::SetBinding(InputBinding b) diff --git a/src/ui/maindialog.cpp b/src/ui/maindialog.cpp index 407f8da..11f8f4a 100644 --- a/src/ui/maindialog.cpp +++ b/src/ui/maindialog.cpp @@ -18,15 +18,17 @@ #include "ui/maindialog.h" #include "app/app.h" +#include "app/gamedata.h" #include "app/system.h" +#include "common/config.h" #include "common/global.h" #include "common/event.h" #include "common/logger.h" #include "common/misc.h" #include "common/profile.h" #include "common/restext.h" -#include "common/logger.h" +#include "common/stringutils.h" #include "object/robotmain.h" @@ -52,6 +54,7 @@ #include <string.h> #include <sstream> #include <iomanip> +#include <vector> #include <boost/filesystem.hpp> #include <boost/foreach.hpp> @@ -118,6 +121,7 @@ CMainDialog::CMainDialog() m_camera = m_main->GetCamera(); m_engine = Gfx::CEngine::GetInstancePointer(); m_particle = m_engine->GetParticle(); + m_pause = CPauseManager::GetInstancePointer(); m_phase = PHASE_NAME; m_phaseSetup = PHASE_SETUPg; @@ -153,9 +157,6 @@ CMainDialog::CMainDialog() m_bMovies = true; m_bNiceReset = true; m_bHimselfDamage = true; -/* TODO: #if _TEEN - m_bCameraScroll = false; -#else*/ m_bCameraScroll = true; m_bCameraInvertX = false; @@ -215,7 +216,7 @@ void CMainDialog::ChangePhase(Phase phase) CImage* pi; Math::Point pos, dim, ddim; float ox, oy, sx, sy; - char name[100]; + std::string name; char* gamer; int res, i, j; @@ -243,9 +244,6 @@ void CMainDialog::ChangePhase(Phase phase) pos.y = 0.10f; ddim.x = 0.30f; ddim.y = 0.80f; - /* TODO: #if _TEEN - pw = m_interface->CreateWindows(pos, ddim, 12, EVENT_WINDOW5); -#else*/ pw = m_interface->CreateWindows(pos, ddim, 10, EVENT_WINDOW5); GetResource(RES_TEXT, RT_TITLE_INIT, name); @@ -261,22 +259,7 @@ void CMainDialog::ChangePhase(Phase phase) ddim.x = 0.30f; ddim.y = 0.30f; pw->CreateGroup(pos, ddim, 4, EVENT_INTERFACE_GLINTr); // blue corner - - /* TODO: #if _SCHOOL - ddim.x = 0.20f; - ddim.y = dim.y*2.4f; - pos.x = 0.40f; - pos.y = oy+sy*7.9f; - pg = pw->CreateGroup(pos, ddim, 24, EVENT_LABEL1); // orange - pg->SetState(STATE_SHADOW); - pos.y = oy+sy*3.9f; - pg = pw->CreateGroup(pos, ddim, 25, EVENT_LABEL1); // orange - pg->SetState(STATE_SHADOW); - ddim.y = dim.y*1.2f; - pos.y = oy+sy*1.9f; - pg = pw->CreateGroup(pos, ddim, 26, EVENT_LABEL1); // red - pg->SetState(STATE_SHADOW); -#else */ + ddim.x = 0.20f; ddim.y = dim.y*2.4f; pos.x = 0.40f; @@ -296,26 +279,7 @@ void CMainDialog::ChangePhase(Phase phase) pos.y = oy+sy*1.9f; pg = pw->CreateGroup(pos, ddim, 26, EVENT_LABEL1); // red pg->SetState(STATE_SHADOW); - - /* TODO: #if _SCHOOL - ddim.x = 0.18f; - ddim.y = dim.y*1; - pos.x = 0.41f; - pos.y = oy+sy*9.1f; - pb = pw->CreateButton(pos, ddim, -1, EVENT_INTERFACE_TRAINER); - pb->SetState(STATE_SHADOW); - - pos.y = oy+sy*8.0f; -#if _TEEN -pb = pw->CreateButton(pos, ddim, -1, EVENT_INTERFACE_TEEN); -#else -pb = pw->CreateButton(pos, ddim, -1, EVENT_INTERFACE_DEFI); -#endif -#if _CEEBOTDEMO -pb->ClearState(STATE_ENABLE); -#endif -pb->SetState(STATE_SHADOW); -#else */ + ddim.x = 0.18f; ddim.y = dim.y*1; pos.x = 0.41f; @@ -351,30 +315,22 @@ pb->SetState(STATE_SHADOW); pb = pw->CreateButton(pos, ddim, -1, EVENT_INTERFACE_QUIT); pb->SetState(STATE_SHADOW); - // TODO: #if !_DEMO & !_SCHOOL + #if DEV_BUILD if ( m_accessEnable && m_accessUser ) { pos.x = 447.0f/640.0f; pos.y = 313.0f/480.0f; ddim.x = 0.09f; - /*#if _POLISH - pos.x -= 5.0f/640.0f; - ddim.x += 10.0f/640.0f; -#endif*/ pb = pw->CreateButton(pos, ddim, -1, EVENT_INTERFACE_USER); pb->SetState(STATE_SHADOW); } - // #endif + #endif - // TODO: remove? - if (m_app->GetProtoMode()) - { - pos.x = 139.0f/640.0f; - pos.y = 313.0f/480.0f; - ddim.x = 0.09f; - pb = pw->CreateButton(pos, ddim, -1, EVENT_INTERFACE_PROTO); - pb->SetState(STATE_SHADOW); - } + /*pos.x = 139.0f/640.0f; + pos.y = 313.0f/480.0f; + ddim.x = 0.09f; + pb = pw->CreateButton(pos, ddim, -1, EVENT_INTERFACE_PROTO); + pb->SetState(STATE_SHADOW);*/ pos.x = 0.40f; ddim.x = 0.20f; @@ -406,19 +362,6 @@ pb->SetState(STATE_SHADOW); GetResource(RES_TEXT, RT_TITLE_NAME, name); pw->SetName(name); - /* TODO: #if _NEWLOOK - pos.x = 80.0f/640.0f; - pos.y = 93.0f/480.0f; - ddim.x = 285.0f/640.0f; - ddim.y = 266.0f/480.0f; - pg = pw->CreateGroup(pos, ddim, 23, EVENT_LABEL1); // blue - pg->SetState(STATE_SHADOW); - pos.x = 372.0f/640.0f; - ddim.x = 188.0f/640.0f; - pg = pw->CreateGroup(pos, ddim, 26, EVENT_LABEL1); // violet - pg->SetState(STATE_SHADOW); -#endif*/ - pos.x = 0.10f; pos.y = 0.40f; ddim.x = 0.50f; @@ -458,10 +401,10 @@ pb->SetState(STATE_SHADOW); } else { - strcpy(name, gamer); + name = gamer; } - pe->SetText(name); - pe->SetCursor(strlen(name), 0); + pe->SetText(name.c_str()); + pe->SetCursor(name.length(), 0); pe->SetFocus(true); pos.x = 380.0f/640.0f; @@ -526,15 +469,6 @@ pb->SetState(STATE_SHADOW); GetResource(RES_TEXT, RT_TITLE_PERSO, name); pw->SetName(name); - /* TODO: #if _NEWLOOK - pos.x = 95.0f/640.0f; - pos.y = 66.0f/480.0f; - ddim.x = 443.0f/640.0f; - ddim.y = 42.0f/480.0f; - pg = pw->CreateGroup(pos, ddim, 26, EVENT_LABEL1); // violet - pg->SetState(STATE_SHADOW); -#endif*/ - pos.x = 0.10f; pos.y = 0.40f; ddim.x = 0.50f; @@ -770,15 +704,13 @@ pb->SetState(STATE_SHADOW); m_phase == PHASE_MISSION || m_phase == PHASE_FREE || m_phase == PHASE_TEEN || - m_phase == PHASE_USER || - m_phase == PHASE_PROTO ) + m_phase == PHASE_USER ) { if ( m_phase == PHASE_TRAINER ) m_index = 0; if ( m_phase == PHASE_DEFI ) m_index = 1; if ( m_phase == PHASE_MISSION ) m_index = 2; if ( m_phase == PHASE_FREE ) m_index = 3; if ( m_phase == PHASE_USER ) m_index = 4; - if ( m_phase == PHASE_PROTO ) m_index = 5; if ( m_phase == PHASE_TEEN ) m_index = 6; if ( m_phase == PHASE_FREE ) @@ -794,7 +726,6 @@ pb->SetState(STATE_SHADOW); if ( m_phase == PHASE_FREE ) strcpy(m_sceneName, "free"); if ( m_phase == PHASE_TEEN ) strcpy(m_sceneName, "teen"); if ( m_phase == PHASE_USER ) strcpy(m_sceneName, "user"); - if ( m_phase == PHASE_PROTO ) strcpy(m_sceneName, "proto"); ReadGamerInfo(); @@ -810,33 +741,9 @@ pb->SetState(STATE_SHADOW); if ( m_phase == PHASE_FREE ) res = RT_TITLE_FREE; if ( m_phase == PHASE_TEEN ) res = RT_TITLE_TEEN; if ( m_phase == PHASE_USER ) res = RT_TITLE_USER; - if ( m_phase == PHASE_PROTO ) res = RT_TITLE_PROTO; GetResource(RES_TEXT, res, name); pw->SetName(name); - /* TODO: #if _NEWLOOK - pos.x = 100.0f/640.0f; - pos.y = 226.0f/480.0f; - ddim.x = 216.0f/640.0f; - ddim.y = 160.0f/480.0f; - pg = pw->CreateGroup(pos, ddim, 23, EVENT_LABEL1); // blue - pg->SetState(STATE_SHADOW); - pos.x = 322.0f/640.0f; - pg = pw->CreateGroup(pos, ddim, 24, EVENT_LABEL1); // cyan - pg->SetState(STATE_SHADOW); - - pos.x = 100.0f/640.0f; - pos.y = 122.0f/480.0f; - ddim.x = 438.0f/640.0f; - ddim.y = 98.0f/480.0f; - pg = pw->CreateGroup(pos, ddim, 25, EVENT_LABEL1); // green - pg->SetState(STATE_SHADOW); - pos.y = 66.0f/480.0f; - ddim.y = 42.0f/480.0f; - pg = pw->CreateGroup(pos, ddim, 26, EVENT_LABEL1); // violet - pg->SetState(STATE_SHADOW); -#endif */ - pos.x = 0.10f; pos.y = 0.40f; ddim.x = 0.50f; @@ -859,7 +766,6 @@ pb->SetState(STATE_SHADOW); if ( m_phase == PHASE_FREE ) res = RT_PLAY_CHAPf; if ( m_phase == PHASE_TEEN ) res = RT_PLAY_CHAPte; if ( m_phase == PHASE_USER ) res = RT_PLAY_CHAPu; - if ( m_phase == PHASE_PROTO ) res = RT_PLAY_CHAPp; GetResource(RES_TEXT, res, name); pl = pw->CreateLabel(pos, ddim, 0, EVENT_LABEL11, name); pl->SetTextAlign(Gfx::TEXT_ALIGN_LEFT); @@ -883,7 +789,6 @@ pb->SetState(STATE_SHADOW); if ( m_phase == PHASE_FREE ) res = RT_PLAY_LISTf; if ( m_phase == PHASE_TEEN ) res = RT_PLAY_LISTk; if ( m_phase == PHASE_USER ) res = RT_PLAY_LISTu; - if ( m_phase == PHASE_PROTO ) res = RT_PLAY_LISTp; GetResource(RES_TEXT, res, name); pl = pw->CreateLabel(pos, ddim, 0, EVENT_LABEL12, name); pl->SetTextAlign(Gfx::TEXT_ALIGN_LEFT); @@ -1049,80 +954,6 @@ pb->SetState(STATE_SHADOW); ddim.y = 0.05f; pw->CreateGroup(pos, ddim, 3, EVENT_NULL); // transparent -> gray - /* TODO: #if _NEWLOOK - if ( m_phase == PHASE_SETUPd || // setup/display ? - m_phase == PHASE_SETUPds ) - { - pos.x = 100.0f/640.0f; - pos.y = 130.0f/480.0f; - ddim.x = 216.0f/640.0f; - ddim.y = 212.0f/480.0f; - pg = pw->CreateGroup(pos, ddim, 23, EVENT_LABEL1); // blue - pg->SetState(STATE_SHADOW); - pos.x = 324.0f/640.0f; - pg = pw->CreateGroup(pos, ddim, 24, EVENT_LABEL1); // cyan - pg->SetState(STATE_SHADOW); - } - if ( m_phase == PHASE_SETUPg || // setup/graphic ? - m_phase == PHASE_SETUPgs ) - { - pos.x = 100.0f/640.0f; - pos.y = 130.0f/480.0f; - ddim.x = 174.0f/640.0f; - ddim.y = 212.0f/480.0f; - pg = pw->CreateGroup(pos, ddim, 23, EVENT_LABEL1); // blue - pg->SetState(STATE_SHADOW); - pos.x = 282.0f/640.0f; - ddim.x = 258.0f/640.0f; - pg = pw->CreateGroup(pos, ddim, 24, EVENT_LABEL1); // cyan - pg->SetState(STATE_SHADOW); - } - if ( m_phase == PHASE_SETUPp || // setup/game ? - m_phase == PHASE_SETUPps ) - { - pos.x = 100.0f/640.0f; - pos.y = 130.0f/480.0f; - ddim.x = 226.0f/640.0f; - ddim.y = 212.0f/480.0f; - pg = pw->CreateGroup(pos, ddim, 23, EVENT_LABEL1); // blue - pg->SetState(STATE_SHADOW); - pos.x = 334.0f/640.0f; - ddim.x = 206.0f/640.0f; - pg = pw->CreateGroup(pos, ddim, 24, EVENT_LABEL1); // cyan - pg->SetState(STATE_SHADOW); - } - if ( m_phase == PHASE_SETUPc || // setup/command ? - m_phase == PHASE_SETUPcs ) - { - pos.x = 100.0f/640.0f; - pos.y = 125.0f/480.0f; - ddim.x = 440.0f/640.0f; - ddim.y = 222.0f/480.0f; - pg = pw->CreateGroup(pos, ddim, 23, EVENT_LABEL1); // blue - pg->SetState(STATE_SHADOW); - } - if ( m_phase == PHASE_SETUPs || // setup/sound ? - m_phase == PHASE_SETUPss ) - { - pos.x = 100.0f/640.0f; - pos.y = 130.0f/480.0f; - ddim.x = 216.0f/640.0f; - ddim.y = 212.0f/480.0f; - pg = pw->CreateGroup(pos, ddim, 23, EVENT_LABEL1); // blue - pg->SetState(STATE_SHADOW); - pos.x = 324.0f/640.0f; - pg = pw->CreateGroup(pos, ddim, 24, EVENT_LABEL1); // cyan - pg->SetState(STATE_SHADOW); - } - - pos.x = 100.0f/640.0f; - pos.y = 66.0f/480.0f; - ddim.x = 440.0f/640.0f; - ddim.y = 42.0f/480.0f; - pg = pw->CreateGroup(pos, ddim, 26, EVENT_LABEL1); // violet - pg->SetState(STATE_SHADOW); -#endif */ - ddim.x = 0.78f/5-0.01f; ddim.y = 0.06f; pos.x = 0.115f; @@ -1353,10 +1184,7 @@ pb->SetState(STATE_SHADOW); ddim.y = dim.y*1; pos.x = ox+sx*10; pos.y = oy+sy*2; - /* TODO: #if _POLISH - ddim.x += 20.0f/640.0f; - pos.x -= 20.0f/640.0f*3.0f; -#endif*/ + pb = pw->CreateButton(pos, ddim, -1, EVENT_INTERFACE_MIN); pb->SetState(STATE_SHADOW); pos.x += ddim.x; @@ -1379,13 +1207,7 @@ pb->SetState(STATE_SHADOW); //? pc = pw->CreateCheck(pos, ddim, -1, EVENT_INTERFACE_TOTO); //? pc->SetState(STATE_SHADOW); //? pos.y -= 0.048f; - /*TODO: #if _SCHOOL -#if _EDU -pc = pw->CreateCheck(pos, ddim, -1, EVENT_INTERFACE_SOLUCE4); -pc->SetState(STATE_SHADOW); -pos.y -= 0.048f; -#endif -#else*/ + pc = pw->CreateCheck(pos, ddim, -1, EVENT_INTERFACE_MOVIES); pc->SetState(STATE_SHADOW); pos.y -= 0.048f; @@ -1507,7 +1329,6 @@ pos.y -= 0.048f; pl = pw->CreateLabel(pos, ddim, 0, EVENT_LABEL1, name); pl->SetTextAlign(Gfx::TEXT_ALIGN_LEFT); - // TODO: #if (_FULL | _NET) & _SOUNDTRACKS pos.x = ox+sx*3; pos.y = 0.40f; ddim.x = dim.x*4.0f; @@ -1520,14 +1341,6 @@ pos.y -= 0.048f; GetResource(RES_EVENT, EVENT_INTERFACE_VOLMUSIC, name); pl = pw->CreateLabel(pos, ddim, 0, EVENT_LABEL2, name); pl->SetTextAlign(Gfx::TEXT_ALIGN_LEFT); - // #endif - - ddim.x = dim.x*6; - ddim.y = dim.y*0.5f; - pos.x = ox+sx*10; - pos.y = 0.55f; - pc = pw->CreateCheck(pos, ddim, -1, EVENT_INTERFACE_SOUND3D); - pc->SetState(STATE_SHADOW); ddim.x = dim.x*3; ddim.y = dim.y*1; @@ -1565,15 +1378,6 @@ pos.y -= 0.048f; ddim.y = 0.50f; pw->CreateGroup(pos, ddim, 4, EVENT_INTERFACE_GLINTr); // blue corner - /* TODO: #if _NEWLOOK - pos.x = 100.0f/640.0f; - pos.y = 66.0f/480.0f; - ddim.x = 438.0f/640.0f; - ddim.y = 42.0f/480.0f; - pg = pw->CreateGroup(pos, ddim, 26, EVENT_LABEL1); // violet - pg->SetState(STATE_SHADOW); -#endif */ - pos.x = 290.0f/640.0f; ddim.x = 245.0f/640.0f; @@ -1649,15 +1453,6 @@ pos.y -= 0.048f; ddim.y = 0.50f; pw->CreateGroup(pos, ddim, 4, EVENT_INTERFACE_GLINTr); // blue corner - /* TODO: #if _NEWLOOK - pos.x = 100.0f/640.0f; - pos.y = 66.0f/480.0f; - ddim.x = 438.0f/640.0f; - ddim.y = 42.0f/480.0f; - pg = pw->CreateGroup(pos, ddim, 26, EVENT_LABEL1); // violet - pg->SetState(STATE_SHADOW); -#endif*/ - pos.x = 290.0f/640.0f; ddim.x = 245.0f/640.0f; @@ -1717,9 +1512,6 @@ pos.y -= 0.048f; pos.y = 0.10f; ddim.x = 0.30f; ddim.y = 0.80f; - /*TODO: #if _TEEN - pw = m_interface->CreateWindows(pos, ddim, 12, EVENT_WINDOW5); -#else*/ pw = m_interface->CreateWindows(pos, ddim, 10, EVENT_WINDOW5); pw->SetName(" "); @@ -1828,7 +1620,6 @@ pos.y -= 0.048f; ddim.y = 0.0f; pw = m_interface->CreateWindows(pos, ddim, -1, EVENT_WINDOW5); - // TODO: #if _FULL | _NET pos.x = 80.0f/640.0f; pos.y = 240.0f/480.0f; ddim.x = 490.0f/640.0f; @@ -1841,54 +1632,6 @@ pos.y -= 0.048f; pe->SetFontSize(Gfx::FONT_SIZE_SMALL); pe->ReadText(std::string("help/") + m_app->GetLanguageChar() + std::string("/authors.txt")); - // #endif - /* TODO: #if _SCHOOL - #if _CEEBOTDEMO - pos.x = 80.0f/640.0f; - pos.y = 210.0f/480.0f; - ddim.x = 490.0f/640.0f; - ddim.y = 150.0f/480.0f; - #else - pos.x = 80.0f/640.0f; - pos.y = 200.0f/480.0f; - ddim.x = 490.0f/640.0f; - ddim.y = 150.0f/480.0f; - #endif - pe = pw->CreateEdit(pos, ddim, 0, EVENT_EDIT1); - pe->SetGenericMode(true); - pe->SetEditCap(false); - pe->SetHighlightCap(false); - pe->SetFontType(Gfx::FONT_COURIER); - pe->SetFontSize(Gfx::FONT_SIZE_SMALL); - pe->ReadText("help/authors.txt");*/ - - /* #if _DEMO - //? pos.x = 80.0f/640.0f; - //? pos.y = 240.0f/480.0f; - //? ddim.x = 490.0f/640.0f; - //? ddim.y = 110.0f/480.0f; - //? pe = pw->CreateEdit(pos, ddim, 0, EVENT_EDIT1); - //? pe->SetGenericMode(true); - //? pe->SetEditCap(false); - //? pe->SetHiliteCap(false); - //? pe->SetFontType(Gfx::FONT_COURIER); - //? pe->SetFontSize(Gfx::FONT_SIZE_SMALL); - //? pe->ReadText("help/demo.txt"); - - //? pos.x = 80.0f/640.0f; - //? pos.y = 140.0f/480.0f; - //? ddim.x = 490.0f/640.0f; - //? ddim.y = 100.0f/480.0f; - //? pe = pw->CreateEdit(pos, ddim, 0, EVENT_EDIT2); - //? pe->SetGenericMode(true); - //? pe->SetEditCap(false); - //? pe->SetHiliteCap(false); - //? pe->SetFontType(Gfx::FONT_COURIER); - //? pe->SetFontSize(Gfx::FONT_SIZE_SMALL); - //? pe->ReadText("help/authors.txt"); -#endif */ - - // TODO: #if !_DEMO pos.x = 40.0f/640.0f; pos.y = 83.0f/480.0f; ddim.x = 246.0f/640.0f; @@ -1918,23 +1661,13 @@ pos.y -= 0.048f; pl = pw->CreateLabel(pos, ddim, 0, EVENT_LABEL4, name); pl->SetFontType(Gfx::FONT_COURIER); pl->SetFontSize(Gfx::FONT_SIZE_SMALL); - // #endif - - /* TODO: #if _DEMO - pos.x = 481.0f/640.0f; - pos.y = 51.0f/480.0f; - ddim.x = 30.0f/640.0f; - ddim.y = 30.0f/480.0f; - pb = pw->CreateButton(pos, ddim, 49, EVENT_INTERFACE_ABORT); - pb->SetState(STATE_SHADOW); -#else */ + pos.x = 306.0f/640.0f; pos.y = 17.0f/480.0f; ddim.x = 30.0f/640.0f; ddim.y = 30.0f/480.0f; pb = pw->CreateButton(pos, ddim, 49, EVENT_INTERFACE_ABORT); pb->SetState(STATE_SHADOW); - // #endif m_engine->SetBackground("generico.png", Gfx::Color(0.0f, 0.0f, 0.0f, 0.0f), @@ -1953,7 +1686,6 @@ pos.y -= 0.048f; m_phase == PHASE_FREE || m_phase == PHASE_TEEN || m_phase == PHASE_USER || - m_phase == PHASE_PROTO || m_phase == PHASE_SETUPd || m_phase == PHASE_SETUPg || m_phase == PHASE_SETUPp || @@ -1962,26 +1694,12 @@ pos.y -= 0.048f; m_phase == PHASE_READ || m_phase == PHASE_LOADING ) { - /*TODO: #if _SCHOOL -#if _TEEN -pos.x = 50.0f/640.0f; -pos.y = 430.0f/480.0f; -ddim.x = 200.0f/640.0f; -ddim.y = 10.0f/480.0f; -#else -pos.x = 450.0f/640.0f; -pos.y = 0.0f/480.0f; -ddim.x = 170.0f/640.0f; -ddim.y = 9.0f/480.0f; -#endif -#else */ pos.x = 540.0f/640.0f; pos.y = 9.0f/480.0f; ddim.x = 90.0f/640.0f; ddim.y = 10.0f/480.0f; - //#endif //GetResource(RES_TEXT, RT_VERSION_ID, name); - pl = pw->CreateLabel(pos, ddim, 0, EVENT_LABEL1, __DATE__); + pl = pw->CreateLabel(pos, ddim, 0, EVENT_LABEL1, COLOBOT_VERSION_DISPLAY); pl->SetFontType(Gfx::FONT_COURIER); pl->SetFontSize(9.0f); } @@ -2087,9 +1805,10 @@ bool CMainDialog::EventProcess(const Event &event) { m_shotDelay --; if ( m_shotDelay == 0 ) - { - m_engine->WriteScreenShot(m_shotName, 320, 240); - //? m_engine->WriteScreenShot(m_shotName, 160, 120); + { + Math::IntPoint windowSize = m_engine->GetWindowSize(); + + m_engine->WriteScreenShot(m_shotName, windowSize.x, windowSize.y); } } @@ -2237,10 +1956,6 @@ bool CMainDialog::EventProcess(const Event &event) m_main->ChangePhase(PHASE_USER); break; - case EVENT_INTERFACE_PROTO: - m_main->ChangePhase(PHASE_PROTO); - break; - case EVENT_INTERFACE_SETUP: m_main->ChangePhase(m_phaseSetup); break; @@ -2444,8 +2159,7 @@ bool CMainDialog::EventProcess(const Event &event) m_phase == PHASE_MISSION || m_phase == PHASE_FREE || m_phase == PHASE_TEEN || - m_phase == PHASE_USER || - m_phase == PHASE_PROTO ) + m_phase == PHASE_USER ) { pw = static_cast<CWindow*>(m_interface->SearchControl(EVENT_WINDOW5)); if ( pw == 0 ) return false; @@ -2464,8 +2178,7 @@ bool CMainDialog::EventProcess(const Event &event) m_phase == PHASE_MISSION || m_phase == PHASE_FREE || m_phase == PHASE_TEEN || - m_phase == PHASE_USER || - m_phase == PHASE_PROTO ) + m_phase == PHASE_USER ) { switch( event.type ) { @@ -2492,11 +2205,6 @@ bool CMainDialog::EventProcess(const Event &event) break; case EVENT_INTERFACE_PLAY: - if ( m_phase == PHASE_PROTO && m_chap[m_index] == 0 && m_sel[m_index] == 0 ) - { - m_main->ChangePhase(PHASE_MODEL); - break; - } m_sceneRank = (m_chap[m_index]+1)*100+(m_sel[m_index]+1); m_phaseTerm = m_phase; m_main->ChangePhase(PHASE_LOADING); @@ -2888,7 +2596,7 @@ bool CMainDialog::EventProcess(const Event &event) break; case EVENT_INTERFACE_KDEF: - m_app->ResetKeyStates(); + m_main->SetDefaultInputBindings(); UpdateKey(); break; @@ -2913,12 +2621,6 @@ bool CMainDialog::EventProcess(const Event &event) ChangeSetupButtons(); break; - case EVENT_INTERFACE_SOUND3D: - m_sound->SetSound3D(!m_sound->GetSound3D()); - ChangeSetupButtons(); - UpdateSetupButtons(); - break; - case EVENT_INTERFACE_SILENT: m_sound->SetAudioVolume(0); m_sound->SetMusicVolume(0); @@ -3119,8 +2821,7 @@ void CMainDialog::GlintMove() m_phase == PHASE_MISSION || m_phase == PHASE_FREE || m_phase == PHASE_TEEN || - m_phase == PHASE_USER || - m_phase == PHASE_PROTO ) + m_phase == PHASE_USER ) { pg = static_cast<CGroup*>(pw->SearchControl(EVENT_INTERFACE_GLINTl)); if ( pg != 0 ) @@ -3256,8 +2957,6 @@ Math::Vector SoundRand() void CMainDialog::FrameParticle(float rTime) { - /* TODO: #if _NEWLOOK -#else */ Math::Vector pos, speed; Math::Point dim; float *pParti, *pGlint; @@ -3348,7 +3047,6 @@ void CMainDialog::FrameParticle(float rTime) m_phase == PHASE_FREE || m_phase == PHASE_TEEN || m_phase == PHASE_USER || - m_phase == PHASE_PROTO || m_phase == PHASE_SETUPd || m_phase == PHASE_SETUPg || m_phase == PHASE_SETUPp || @@ -3620,7 +3318,7 @@ void CMainDialog::BuildSceneName(std::string &filename, char *base, int rank) { rankStream << std::setfill('0') << std::setw(3) << rank; filename = base + rankStream.str() + ".txt"; - filename = CApplication::GetInstance().GetDataFilePath(DIR_LEVEL, filename); + filename = CGameData::GetInstancePointer()->GetFilePath(DIR_LEVEL, filename); } } @@ -4019,7 +3717,7 @@ void CMainDialog::UpdatePerso() CColor* pc; CSlider* ps; Gfx::Color color; - char name[100]; + std::string name; int i; pw = static_cast<CWindow*>(m_interface->SearchControl(EVENT_WINDOW5)); @@ -4366,8 +4064,8 @@ void CMainDialog::IOReadName() } time(&now); - TimeToAscii(now, line); - sprintf(name, "%s %d - %s", resume, m_sel[m_index]+1, line); + TimeToAsciiClean(now, line); + sprintf(name, "%s - %s %d", line, resume, m_sel[m_index]+1); pe->SetText(name); pe->SetCursor(strlen(name), 0); pe->SetFocus(true); @@ -4383,7 +4081,7 @@ void CMainDialog::IOReadList() char line[500]; char name[100]; int i; - fs::directory_iterator end_iter; + std::vector<fs::path> v; pw = static_cast<CWindow*>(m_interface->SearchControl(EVENT_WINDOW5)); if ( pw == 0 ) return; @@ -4397,12 +4095,14 @@ void CMainDialog::IOReadList() if (fs::exists(saveDir) && fs::is_directory(saveDir)) { - for( fs::directory_iterator dir_iter(saveDir) ; dir_iter != end_iter ; ++dir_iter) + copy(fs::directory_iterator(saveDir), fs::directory_iterator(), back_inserter(v)); + std::sort(v.begin(), v.end()); + for( std::vector<fs::path>::iterator iter = v.begin(); iter != v.end(); ++iter) { - if ( fs::is_directory(dir_iter->status()) && fs::exists(dir_iter->path() / "data.sav") ) + if ( fs::is_directory(*iter) && fs::exists(*iter / "data.sav") ) { - file = fopen((dir_iter->path() / "data.sav").make_preferred().string().c_str(), "r"); + file = fopen((*iter / "data.sav").make_preferred().string().c_str(), "r"); if ( file == NULL ) continue; while ( fgets(line, 500, file) != NULL ) @@ -4426,7 +4126,7 @@ void CMainDialog::IOReadList() fclose(file); pl->SetItemName(m_saveList.size(), name); - m_saveList.push_back(dir_iter->path()); + m_saveList.push_back(*iter); } } } @@ -4434,8 +4134,9 @@ void CMainDialog::IOReadList() // invalid index if ( m_phase == PHASE_WRITE || m_phase == PHASE_WRITEs ) { - GetResource(RES_TEXT, RT_IO_NEW, name); - pl->SetItemName(m_saveList.size(), name); + std::string nameStr; + GetResource(RES_TEXT, RT_IO_NEW, nameStr); + pl->SetItemName(m_saveList.size(), nameStr.c_str()); } pl->SetSelect(m_saveList.size()); @@ -4694,8 +4395,7 @@ void CMainDialog::AllMissionUpdate() m_phase == PHASE_MISSION || m_phase == PHASE_FREE || m_phase == PHASE_TEEN || - m_phase == PHASE_USER || - m_phase == PHASE_PROTO ) + m_phase == PHASE_USER ) { UpdateSceneChap(m_chap[m_index]); UpdateSceneList(m_chap[m_index], m_sel[m_index]); @@ -4793,17 +4493,6 @@ void CMainDialog::UpdateSceneChap(int &chap) { for ( j=0 ; j<9 ; j++ ) { -/* TODO: #if _SCHOOL - if ( m_phase == PHASE_MISSION ) break; - if ( m_phase == PHASE_FREE ) break; -#if _CEEBOTDEMO - if ( m_phase == PHASE_TRAINER && j >= 2 ) break; -#endif -#endif -#if _DEMO - if ( m_phase == PHASE_MISSION && j >= 4 ) break; - if ( m_phase == PHASE_TRAINER && j >= 1 ) break; -#endif */ BuildSceneName(fileName, m_sceneName, (j+1)*100); file = fopen(fileName.c_str(), "r"); if ( file == NULL ) break; @@ -4848,14 +4537,6 @@ void CMainDialog::UpdateSceneChap(int &chap) break; } -/* TODO: #if _TEEN - if ( m_phase == PHASE_TRAINER && !m_main->GetShowAll() && !bPassed ) - { - j ++; - break; - } -#endif*/ - if ( m_phase == PHASE_FREE && j == m_accessChap ) { j ++; @@ -4899,21 +4580,6 @@ void CMainDialog::UpdateSceneList(int chap, int &sel) for ( j=0 ; j<99 ; j++ ) { -/* TODO: #if _SCHOOL - if ( m_phase == PHASE_MISSION ) break; - if ( m_phase == PHASE_FREE ) break; -#if _CEEBOTDEMO -#if _TEEN - if ( m_phase == PHASE_TRAINER && j >= 5 ) break; -#else - if ( m_phase == PHASE_TRAINER && j >= 3 ) break; -#endif -#endif -#endif -#if _DEMO - if ( m_phase == PHASE_MISSION && j >= 3 ) break; - if ( m_phase == PHASE_TRAINER && j >= 5 ) break; -#endif */ BuildSceneName(fileName, m_sceneName, (chap+1)*100+(j+1)); file = fopen(fileName.c_str(), "r"); if ( file == NULL ) break; @@ -4957,14 +4623,6 @@ void CMainDialog::UpdateSceneList(int chap, int &sel) j ++; break; } - -/* TODO: #if _TEEN - if ( m_phase == PHASE_TRAINER && !m_main->GetShowAll() && !bPassed ) - { - j ++; - break; - } -#endif*/ } BuildSceneName(fileName, m_sceneName, (chap+1)*100+(j+1)); @@ -4998,8 +4656,7 @@ void CMainDialog::ShowSoluceUpdate() m_phase == PHASE_MISSION || m_phase == PHASE_FREE || m_phase == PHASE_TEEN || - m_phase == PHASE_USER || - m_phase == PHASE_PROTO ) + m_phase == PHASE_USER ) { m_bSceneSoluce = false; @@ -5456,13 +5113,6 @@ void CMainDialog::UpdateSetupButtons() value = static_cast<float>(m_sound->GetMusicVolume()); ps->SetVisibleValue(value); } - - pc = static_cast<CCheck*>(pw->SearchControl(EVENT_INTERFACE_SOUND3D)); - if ( pc != 0 ) - { - pc->SetState(STATE_CHECK, m_sound->GetSound3D()); - pc->SetState(STATE_ENABLE, m_sound->GetSound3DCap()); - } } // Updates the engine function of the buttons after the setup phase. @@ -5564,7 +5214,6 @@ void CMainDialog::SetupMemorize() GetProfile().SetLocalProfileInt("Setup", "TotoMode", m_engine->GetTotoMode()); GetProfile().SetLocalProfileInt("Setup", "AudioVolume", m_sound->GetAudioVolume()); GetProfile().SetLocalProfileInt("Setup", "MusicVolume", m_sound->GetMusicVolume()); - GetProfile().SetLocalProfileInt("Setup", "Sound3D", m_sound->GetSound3D()); GetProfile().SetLocalProfileInt("Setup", "EditIndentMode", m_engine->GetEditIndentMode()); GetProfile().SetLocalProfileInt("Setup", "EditIndentValue", m_engine->GetEditIndentValue()); @@ -5601,21 +5250,7 @@ void CMainDialog::SetupMemorize() GetProfile().SetLocalProfileString("Setup", "KeyMap", key.str()); -#if _NET - if ( m_accessEnable ) - { - iValue = m_accessMission; - SetLocalProfileInt("Setup", "AccessMission", iValue); - - iValue = m_accessUser; - SetLocalProfileInt("Setup", "AccessUser", iValue); - } -#endif - GetProfile().SetLocalProfileInt("Setup", "DeleteGamer", m_bDeleteGamer); - - // TODO: write graphic engine profile - //m_engine->WriteProfile(); } // Remember all the settings. @@ -5802,11 +5437,6 @@ void CMainDialog::SetupRecall() m_sound->SetMusicVolume(iValue); } - if ( GetProfile().GetLocalProfileInt("Setup", "Sound3D", iValue) ) - { - m_sound->SetSound3D(iValue == 1); - } - if ( GetProfile().GetLocalProfileInt("Setup", "EditIndentMode", iValue) ) { m_engine->SetEditIndentMode(iValue); @@ -5830,21 +5460,6 @@ void CMainDialog::SetupRecall() } } -#if _NET - if ( m_accessEnable ) - { - if ( GetProfile().GetLocalProfileInt("Setup", "AccessMission", iValue) ) - { - m_accessMission = iValue; - } - - if ( GetProfile().GetLocalProfileInt("Setup", "AccessUser", iValue) ) - { - m_accessUser = iValue; - } - } -#endif - if ( GetProfile().GetLocalProfileInt("Setup", "DeleteGamer", iValue) ) { m_bDeleteGamer = iValue; @@ -6026,7 +5641,7 @@ void CMainDialog::StartAbort() CWindow* pw; CButton* pb; Math::Point pos, dim; - char name[100]; + std::string name; StartDialog(Math::Point(0.3f, 0.8f), true, false, false); m_bDialogDelete = false; @@ -6047,10 +5662,6 @@ void CMainDialog::StartAbort() pos.x = 0.40f; dim.x = 0.20f; -/* TODO: #if _POLISH - pos.x -= 7.0f/640.0f; - dim.x += 14.0f/640.0f; -#endif*/ dim.y = 32.0f/480.0f; pos.y = 0.74f; @@ -6105,7 +5716,7 @@ void CMainDialog::StartDeleteObject() CWindow* pw; CButton* pb; Math::Point pos, dim; - char name[100]; + std::string name; StartDialog(Math::Point(0.7f, 0.3f), false, true, true); m_bDialogDelete = true; @@ -6139,21 +5750,22 @@ void CMainDialog::StartDeleteGame(char *gamer) CWindow* pw; CButton* pb; Math::Point pos, dim; - char name[100]; - char text[100]; StartDialog(Math::Point(0.7f, 0.3f), false, true, true); m_bDialogDelete = true; pw = static_cast<CWindow*>(m_interface->SearchControl(EVENT_WINDOW9)); - if ( pw == 0 ) return; + if (pw == nullptr) + return; + + std::string name; pos.x = 0.00f; pos.y = 0.50f; dim.x = 1.00f; dim.y = 0.05f; GetResource(RES_TEXT, RT_DIALOG_DELGAME, name); - sprintf(text, name, gamer); + std::string text = StrUtils::Format(name.c_str(), gamer); pw->CreateLabel(pos, dim, -1, EVENT_DIALOG_LABEL, text); pb = static_cast<CButton*>(pw->SearchControl(EVENT_DIALOG_OK)); @@ -6175,12 +5787,14 @@ void CMainDialog::StartQuit() CWindow* pw; CButton* pb; Math::Point pos, dim; - char name[100]; StartDialog(Math::Point(0.6f, 0.3f), false, true, true); pw = static_cast<CWindow*>(m_interface->SearchControl(EVENT_WINDOW9)); - if ( pw == 0 ) return; + if (pw == nullptr) + return; + + std::string name; pos.x = 0.00f; pos.y = 0.50f; @@ -6208,7 +5822,6 @@ void CMainDialog::StartDialog(Math::Point dim, bool bFire, bool bOK, bool bCance CWindow* pw; CButton* pb; Math::Point pos, ddim; - char name[100]; StartSuspend(); @@ -6247,6 +5860,8 @@ void CMainDialog::StartDialog(Math::Point dim, bool bFire, bool bOK, bool bCance m_bDialogFire = bFire; + std::string name; + pos.x = (1.0f-dim.x)/2.0f; pos.y = (1.0f-dim.y)/2.0f; pw = m_interface->CreateWindows(pos, dim, bFire?12:8, EVENT_WINDOW9); @@ -6442,8 +6057,8 @@ void CMainDialog::StartSuspend() { m_sound->MuteAll(true); m_main->ClearInterface(); - m_bInitPause = m_engine->GetPause(); - m_engine->SetPause(true); + m_bInitPause = m_pause->GetPauseType(); + m_pause->SetPause(PAUSE_DIALOG); m_engine->SetOverFront(false); // over flat behind m_main->CreateShortcuts(); m_main->StartSuspend(); @@ -6457,7 +6072,7 @@ void CMainDialog::StopSuspend() { m_sound->MuteAll(false); m_main->ClearInterface(); - if ( !m_bInitPause ) m_engine->SetPause(false); + m_pause->SetPause(m_bInitPause); m_engine->SetOverFront(true); // over flat front m_main->CreateShortcuts(); m_main->StopSuspend(); diff --git a/src/ui/maindialog.h b/src/ui/maindialog.h index 96aff2a..444a568 100644 --- a/src/ui/maindialog.h +++ b/src/ui/maindialog.h @@ -23,6 +23,8 @@ #include "object/robotmain.h" +#include "app/pausemanager.h" + #include <boost/filesystem.hpp> #include <boost/algorithm/string.hpp> @@ -186,6 +188,7 @@ protected: Gfx::CParticle* m_particle; Gfx::CCamera* m_camera; CSoundInterface* m_sound; + CPauseManager* m_pause; Phase m_phase; // copy of CRobotMain Phase m_phaseSetup; // tab selected @@ -242,26 +245,26 @@ protected: bool m_bCameraInvertY; // for CCamera bool m_bEffect; // for CCamera - Math::Point m_glintMouse; - float m_glintTime; + Math::Point m_glintMouse; + float m_glintTime; - int m_loadingCounter; + int m_loadingCounter; - bool m_bDialog; // this dialogue? - bool m_bDialogFire; // setting on fire? - bool m_bDialogDelete; - Math::Point m_dialogPos; - Math::Point m_dialogDim; - float m_dialogParti; - float m_dialogTime; - bool m_bInitPause; + bool m_bDialog; // this dialogue? + bool m_bDialogFire; // setting on fire? + bool m_bDialogDelete; + Math::Point m_dialogPos; + Math::Point m_dialogDim; + float m_dialogParti; + float m_dialogTime; + PauseType m_bInitPause; Gfx::CameraType m_initCamera; - int m_partiPhase[10]; - float m_partiTime[10]; - Math::Point m_partiPos[10]; + int m_partiPhase[10]; + float m_partiTime[10]; + Math::Point m_partiPos[10]; - SceneInfo m_sceneInfo[MAXSCENE]; + SceneInfo m_sceneInfo[MAXSCENE]; std::vector<fs::path> m_saveList; }; diff --git a/src/ui/mainshort.cpp b/src/ui/mainshort.cpp index d33482c..f6dce4b 100644 --- a/src/ui/mainshort.cpp +++ b/src/ui/mainshort.cpp @@ -97,7 +97,6 @@ bool CMainShort::CreateShortcuts() ObjectType type; Math::Point pos, dim; int i, rank, icon; - char name[100]; if ( m_main->GetFixScene() ) return false; @@ -208,10 +207,11 @@ bool CMainShort::CreateShortcuts() m_shortcuts[rank] = pObj; pc = m_interface->SearchControl(table_sc_em[rank]); - if ( pc != 0 ) + if ( pc != nullptr ) { - pObj->GetTooltipName(name); - pc->SetTooltip(name); + std::string tooltipName; + pObj->GetTooltipName(tooltipName); + pc->SetTooltip(tooltipName); } rank ++; diff --git a/src/ui/studio.cpp b/src/ui/studio.cpp index e44a465..f83704e 100644 --- a/src/ui/studio.cpp +++ b/src/ui/studio.cpp @@ -71,6 +71,7 @@ CStudio::CStudio() m_main = CRobotMain::GetInstancePointer(); m_interface = m_main->GetInterface(); m_camera = m_main->GetCamera(); + m_pause = CPauseManager::GetInstancePointer(); m_bEditMaximized = false; m_bEditMinimized = false; @@ -97,7 +98,6 @@ bool CStudio::EventProcess(const Event &event) CWindow* pw; CEdit* edit; CSlider* slider; - char res[100]; if ( m_dialog != SD_NULL ) // dialogue exists? { @@ -184,17 +184,17 @@ bool CStudio::EventProcess(const Event &event) if ( event.type == EVENT_STUDIO_COMPILE ) // compile? { - char buffer[100]; - if ( m_script->GetScript(edit) ) // compile { + std::string res; GetResource(RES_TEXT, RT_STUDIO_COMPOK, res); SetInfoText(res, false); } else { - m_script->GetError(buffer); - SetInfoText(buffer, false); + std::string error; + m_script->GetError(error); + SetInfoText(error, false); } } @@ -218,9 +218,9 @@ bool CStudio::EventProcess(const Event &event) } else { - char buffer[100]; - m_script->GetError(buffer); - SetInfoText(buffer, false); + std::string error; + m_script->GetError(error); + SetInfoText(error, false); } } } @@ -344,7 +344,6 @@ bool CStudio::EventFrame(const Event &event) CList* list; float time; int cursor1, cursor2, iCursor1, iCursor2; - char res[100]; m_time += event.rTime; m_fixInfoTextTime -= event.rTime; @@ -363,6 +362,7 @@ bool CStudio::EventFrame(const Event &event) m_bRunning = false; UpdateFlux(); // stop AdjustEditScript(); + std::string res; GetResource(RES_TEXT, RT_STUDIO_PROGSTOP, res); SetInfoText(res, false); @@ -558,14 +558,13 @@ void CStudio::StartEditScript(CScript *script, std::string name, int rank) CButton* button; CSlider* slider; CList* list; - char res[100]; m_script = script; m_rank = rank; m_main->SetEditLock(true, true); m_main->SetEditFull(false); - m_bInitPause = m_engine->GetPause(); + m_bInitPause = m_pause->GetPauseType(); m_main->SetSpeed(1.0f); m_editCamera = m_camera->GetType(); m_camera->SetType(Gfx::CAM_TYPE_EDIT); @@ -575,28 +574,33 @@ void CStudio::StartEditScript(CScript *script, std::string name, int rank) m_script->SetStepMode(!m_bRealTime); button = static_cast< CButton* >(m_interface->SearchControl(EVENT_BUTTON_QUIT)); - if ( button != 0 ) - { + if (button != nullptr) button->ClearState(STATE_VISIBLE); - } pos = m_editFinalPos = m_editActualPos = m_main->GetWindowPos(); dim = m_editFinalDim = m_editActualDim = m_main->GetWindowDim(); pw = m_interface->CreateWindows(pos, dim, 8, EVENT_WINDOW3); - if ( pw == nullptr ) return; + if (pw == nullptr) + return; + pw->SetState(STATE_SHADOW); pw->SetRedim(true); // before SetName! pw->SetMovable(true); pw->SetClosable(true); + + std::string res; GetResource(RES_TEXT, RT_STUDIO_TITLE, res); pw->SetName(res); + pw->SetMinDim(Math::Point(0.49f, 0.50f)); pw->SetMaximized(m_bEditMaximized); pw->SetMinimized(m_bEditMinimized); m_main->SetEditFull(m_bEditMaximized); edit = pw->CreateEdit(pos, dim, 0, EVENT_STUDIO_EDIT); - if ( edit == 0 ) return; + if (edit == nullptr) + return; + edit->SetState(STATE_SHADOW); edit->SetInsideScroll(false); //? if ( m_bRunning ) edit->SetEdit(false); @@ -851,7 +855,6 @@ bool CStudio::StopEditScript(bool bCancel) CWindow* pw; CEdit* edit; CButton* button; - char buffer[100]; pw = static_cast< CWindow* >(m_interface->SearchControl(EVENT_WINDOW3)); if ( pw == nullptr ) return false; @@ -863,8 +866,9 @@ bool CStudio::StopEditScript(bool bCancel) { if ( !m_script->GetScript(edit) ) // compile { - m_script->GetError(buffer); - SetInfoText(buffer, false); + std::string error; + m_script->GetError(error); + SetInfoText(error, false); return false; } } @@ -879,7 +883,7 @@ bool CStudio::StopEditScript(bool bCancel) button->SetState(STATE_VISIBLE); } - if ( !m_bInitPause ) m_engine->SetPause(false); + m_pause->SetPause(m_bInitPause); m_sound->MuteAll(false); m_main->SetEditLock(false, true); m_camera->SetType(m_editCamera); @@ -892,8 +896,6 @@ bool CStudio::StopEditScript(bool bCancel) void CStudio::SetInfoText(std::string text, bool bClickable) { - char res[100]; - if ( bClickable && m_fixInfoTextTime > 0.0f ) return; if ( !bClickable ) m_fixInfoTextTime = 8.0f; @@ -911,6 +913,7 @@ void CStudio::SetInfoText(std::string text, bool bClickable) if ( bClickable ) { + std::string res; GetResource(RES_TEXT, RT_STUDIO_LISTTT, res); list->SetTooltip(res); list->SetState(STATE_ENABLE); @@ -952,22 +955,22 @@ void CStudio::UpdateFlux() #if 1 if ( m_bRealTime ) // run? { - m_engine->SetPause(false); + m_pause->ClearPause(); m_sound->MuteAll(false); } else // step by step? { - m_engine->SetPause(true); + m_pause->SetPause(PAUSE_EDITOR); m_sound->MuteAll(true); } #else - m_engine->SetPause(false); + m_pause->ClearPause(); m_sound->MuteAll(false); #endif } else // stop? { - m_engine->SetPause(true); + m_pause->SetPause(PAUSE_EDITOR); m_sound->MuteAll(true); } } @@ -1029,7 +1032,7 @@ void CStudio::StartDialog(StudioDialog type) CList* pli; CEdit* pe; Math::Point pos, dim; - char name[100]; + std::string name; m_dialog = type; @@ -1108,17 +1111,11 @@ void CStudio::StartDialog(StudioDialog type) GetResource(RES_TEXT, RT_IO_PRIVATE, name); pc->SetName(name); pc->SetState(STATE_SHADOW); -#if _POLISH - pc->SetFontSize(8.0f); -#endif pc = pw->CreateCheck(pos, dim, 0, EVENT_DIALOG_CHECK2); GetResource(RES_TEXT, RT_IO_PUBLIC, name); pc->SetName(name); pc->SetState(STATE_SHADOW); -#if _POLISH - pc->SetFontSize(8.0f); -#endif pb = pw->CreateButton(pos, dim, -1, EVENT_DIALOG_OK); pb->SetState(STATE_SHADOW); @@ -1476,8 +1473,6 @@ void CStudio::UpdateDialogPublic() CWindow* pw; CCheck* pc; CLabel* pl; - char name[100]; - //char text[MAX_FNAME+100]; pw = static_cast< CWindow* >(m_interface->SearchControl(EVENT_WINDOW9)); if ( pw == nullptr ) return; @@ -1497,7 +1492,7 @@ void CStudio::UpdateDialogPublic() pl = static_cast< CLabel* >(pw->SearchControl(EVENT_DIALOG_LABEL1)); if ( pl != 0 ) { - GetResource(RES_TEXT, RT_IO_LIST, name); + // GetResource(RES_TEXT, RT_IO_LIST, name); // TODO: unused? pl->SetName(SearchDirectory(false).c_str(), false); } } diff --git a/src/ui/studio.h b/src/ui/studio.h index 1c14124..d1c6a51 100644 --- a/src/ui/studio.h +++ b/src/ui/studio.h @@ -22,6 +22,8 @@ #include "graphics/engine/camera.h" +#include "app/pausemanager.h" + #include <boost/filesystem.hpp> namespace fs = boost::filesystem; @@ -96,6 +98,7 @@ protected: CSoundInterface* m_sound; CInterface* m_interface; CApplication* m_app; + CPauseManager* m_pause; int m_rank; CScript* m_script; @@ -109,11 +112,11 @@ protected: Math::Point m_editFinalPos; Math::Point m_editFinalDim; - float m_time; - float m_fixInfoTextTime; - bool m_bRunning; - bool m_bRealTime; - bool m_bInitPause; + float m_time; + float m_fixInfoTextTime; + bool m_bRunning; + bool m_bRealTime; + PauseType m_bInitPause; std::string m_helpFilename; StudioDialog m_dialog; diff --git a/src/ui/window.cpp b/src/ui/window.cpp index 6e082e6..98e1e6c 100644 --- a/src/ui/window.cpp +++ b/src/ui/window.cpp @@ -788,7 +788,7 @@ bool CWindow::GetFixed() void CWindow::AdjustButtons() { - char res[100]; + std::string res; if ( m_buttonFull != 0 ) { @@ -796,13 +796,13 @@ void CWindow::AdjustButtons() { m_buttonFull->SetIcon(54); GetResource(RES_TEXT, RT_WINDOW_STANDARD, res); - m_buttonFull->SetTooltip(std::string(res)); + m_buttonFull->SetTooltip(res); } else { m_buttonFull->SetIcon(52); GetResource(RES_TEXT, RT_WINDOW_MAXIMIZED, res); - m_buttonFull->SetTooltip(std::string(res)); + m_buttonFull->SetTooltip(res); } } @@ -812,13 +812,13 @@ void CWindow::AdjustButtons() { m_buttonReduce->SetIcon(54); GetResource(RES_TEXT, RT_WINDOW_STANDARD, res); - m_buttonReduce->SetTooltip(std::string(res)); + m_buttonReduce->SetTooltip(res); } else { m_buttonReduce->SetIcon(51); GetResource(RES_TEXT, RT_WINDOW_MINIMIZED, res); - m_buttonReduce->SetTooltip(std::string(res)); + m_buttonReduce->SetTooltip(res); } } @@ -826,7 +826,7 @@ void CWindow::AdjustButtons() { m_buttonClose->SetIcon(11); // x GetResource(RES_TEXT, RT_WINDOW_CLOSE, res); - m_buttonClose->SetTooltip(std::string(res)); + m_buttonClose->SetTooltip(res); } } @@ -1536,8 +1536,6 @@ void CWindow::DrawVertex(Math::Point pos, Math::Point dim, int icon) void CWindow::DrawHach(Math::Point pos, Math::Point dim) { -#if _NEWLOOK -#else Math::Point ppos, ddim, uv1, uv2; float dp, max, ndim; bool bStop; @@ -1575,7 +1573,6 @@ void CWindow::DrawHach(Math::Point pos, Math::Point dim) ppos.x += ddim.x; } while ( !bStop ); -#endif } } |