diff options
author | Andrei Karas <akaras@inbox.ru> | 2017-10-10 22:14:45 +0300 |
---|---|---|
committer | Andrei Karas <akaras@inbox.ru> | 2017-10-10 22:15:57 +0300 |
commit | aa3f63fd497558a02feb3ddbc44f31eac091f39b (patch) | |
tree | 0e28b9b1f0501dd8be9e1a38db4ec1777fa3fbfa /src/game.cpp | |
parent | 7c10a6b61e9d06a4ae9cc9f942dfacb6fcfd9d3d (diff) | |
download | manaverse-aa3f63fd497558a02feb3ddbc44f31eac091f39b.tar.gz manaverse-aa3f63fd497558a02feb3ddbc44f31eac091f39b.tar.bz2 manaverse-aa3f63fd497558a02feb3ddbc44f31eac091f39b.tar.xz manaverse-aa3f63fd497558a02feb3ddbc44f31eac091f39b.zip |
Remove most unused files.
Diffstat (limited to 'src/game.cpp')
-rw-r--r-- | src/game.cpp | 1260 |
1 files changed, 0 insertions, 1260 deletions
diff --git a/src/game.cpp b/src/game.cpp deleted file mode 100644 index e09e6c92f..000000000 --- a/src/game.cpp +++ /dev/null @@ -1,1260 +0,0 @@ -/* - * The ManaPlus Client - * Copyright (C) 2004-2009 The Mana World Development Team - * Copyright (C) 2009-2010 The Mana Developers - * Copyright (C) 2011-2017 The ManaPlus Developers - * - * This file is part of The ManaPlus Client. - * - * 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 2 of the License, or - * 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 "game.h" - -#include "actormanager.h" -#include "client.h" -#include "configuration.h" -#include "effectmanager.h" -#include "eventsmanager.h" -#include "gamemodifiers.h" -#include "soundmanager.h" -#include "settings.h" - -#include "being/crazymoves.h" -#include "being/localplayer.h" -#include "being/playerinfo.h" - -#include "const/itemshortcut.h" -#include "const/spells.h" - -#include "const/gui/chat.h" - -#include "enums/being/beingdirection.h" - -#include "fs/mkdir.h" - -#include "fs/virtfs/fs.h" - -#include "gui/dialogsmanager.h" -#include "gui/gui.h" -#include "gui/popupmanager.h" -#include "gui/viewport.h" -#include "gui/windowmanager.h" -#include "gui/windowmenu.h" - -#include "gui/fonts/font.h" - -#include "gui/shortcut/dropshortcut.h" -#include "gui/shortcut/emoteshortcut.h" - -#include "gui/popups/popupmenu.h" - -#include "gui/windows/bankwindow.h" -#include "gui/windows/cutinwindow.h" -#include "gui/windows/mailwindow.h" -#include "gui/windows/chatwindow.h" -#include "gui/windows/debugwindow.h" -#include "gui/windows/didyouknowwindow.h" -#include "gui/windows/emotewindow.h" -#include "gui/windows/equipmentwindow.h" -#include "gui/windows/inventorywindow.h" -#include "gui/windows/killstats.h" -#include "gui/windows/minimap.h" -#include "gui/windows/ministatuswindow.h" -#include "gui/windows/npcdialog.h" -#include "gui/windows/outfitwindow.h" -#include "gui/windows/setupwindow.h" -#include "gui/windows/shopwindow.h" -#include "gui/windows/shortcutwindow.h" -#include "gui/windows/skilldialog.h" -#include "gui/windows/socialwindow.h" -#include "gui/windows/statuswindow.h" -#include "gui/windows/tradewindow.h" -#include "gui/windows/questswindow.h" -#include "gui/windows/whoisonline.h" - -#include "gui/widgets/tabs/chat/battletab.h" - -#include "gui/widgets/createwidget.h" -#include "gui/widgets/emoteshortcutcontainer.h" -#include "gui/widgets/itemshortcutcontainer.h" -#include "gui/widgets/spellshortcutcontainer.h" -#include "gui/widgets/virtshortcutcontainer.h" - -#include "gui/widgets/tabs/chat/gmtab.h" -#include "gui/widgets/tabs/chat/langtab.h" -#include "gui/widgets/tabs/chat/tradetab.h" - -#include "input/inputmanager.h" -#include "input/joystick.h" -#include "input/keyboardconfig.h" - -#include "input/touch/touchmanager.h" - -#include "net/generalhandler.h" -#include "net/gamehandler.h" -#include "net/net.h" -#include "net/packetcounters.h" - -#include "particle/particleengine.h" - -#include "resources/delayedmanager.h" -#include "resources/mapreader.h" -#include "resources/screenshothelper.h" - -#include "resources/db/mapdb.h" - -#include "resources/map/map.h" - -#include "resources/resourcemanager/resourcemanager.h" - -#include "resources/sprite/animatedsprite.h" - -#include "utils/delete2.h" -#include "utils/foreach.h" -#include "utils/gettext.h" -#include "utils/pnglib.h" -#include "utils/sdlcheckutils.h" -#include "utils/timer.h" - -#ifdef __native_client__ -#include "utils/naclmessages.h" -#endif // __native_client__ - -#include "listeners/assertlistener.h" -#include "listeners/errorlistener.h" - -#ifdef TMWA_SUPPORT -#include "net/tmwa/guildmanager.h" -#endif // TMWA_SUPPORT - -#ifdef USE_MUMBLE -#include "mumblemanager.h" -#endif // USE_MUMBLE - -#ifdef WIN32 -#include <sys/time.h> -#undef ERROR -#endif // WIN32 - -#include "debug.h" - -QuitDialog *quitDialog = nullptr; -Window *disconnectedDialog = nullptr; - -bool mStatsReUpdated = false; -const time_t adjustDelay = 10; - -/** - * Initialize every game sub-engines in the right order - */ -static void initEngines() -{ - actorManager = new ActorManager; - effectManager = new EffectManager; -#ifdef TMWA_SUPPORT - GuildManager::init(); -#endif // TMWA_SUPPORT - - crazyMoves = new CrazyMoves; - - particleEngine = new ParticleEngine; - particleEngine->setMap(nullptr); - particleEngine->setupEngine(); - BeingInfo::init(); - - if (gameHandler != nullptr) - gameHandler->initEngines(); - - keyboard.update(); - if (joystick != nullptr) - joystick->update(); - - UpdateStatusListener::distributeEvent(); -} - -/** - * Create all the various globally accessible gui windows - */ -static void createGuiWindows() -{ - if (setupWindow != nullptr) - setupWindow->clearWindowsForReset(); - - if (emoteShortcut != nullptr) - emoteShortcut->load(); - - GameModifiers::init(); - - // Create dialogs - CREATEWIDGETV0(emoteWindow, EmoteWindow); - delete2(debugChatTab) - if (chatWindow != nullptr) - { - chatWindow->scheduleDelete(); - chatWindow = nullptr; - } - CREATEWIDGETV(chatWindow, ChatWindow, - "Chat"); - CREATEWIDGETV0(tradeWindow, TradeWindow); - CREATEWIDGETV(equipmentWindow, EquipmentWindow, - PlayerInfo::getEquipment(), - localPlayer); - CREATEWIDGETV(beingEquipmentWindow, EquipmentWindow, - nullptr, nullptr, true); - beingEquipmentWindow->setVisible(Visible_false); - CREATEWIDGETV0(statusWindow, StatusWindow); - CREATEWIDGETV0(miniStatusWindow, MiniStatusWindow); - CREATEWIDGETV(inventoryWindow, InventoryWindow, - PlayerInfo::getInventory()); - if (Net::getNetworkType() != ServerType::TMWATHENA) - { - CREATEWIDGETV(cartWindow, InventoryWindow, - PlayerInfo::getCartInventory()); - } - CREATEWIDGETV0(cutInWindow, CutInWindow); - CREATEWIDGETV0(shopWindow, ShopWindow); - CREATEWIDGETV0(skillDialog, SkillDialog); - CREATEWIDGETV0(minimap, Minimap); - if (debugWindow != nullptr) - { - debugWindow->scheduleDelete(); - debugWindow = nullptr; - } - CREATEWIDGETV(debugWindow, DebugWindow, - "Debug"); - CREATEWIDGETV(itemShortcutWindow, ShortcutWindow, - "ItemShortcut", "items.xml", 83, 460); - - for (unsigned f = 0; f < SHORTCUT_TABS - 1; f ++) - { - itemShortcutWindow->addTab(toString(f + 1), - new ItemShortcutContainer(nullptr, f)); - } - if (Net::getNetworkType() != ServerType::TMWATHENA) - { - itemShortcutWindow->addTab("A", - new ItemShortcutContainer(nullptr, SHORTCUT_TABS - 1)); - } - if (config.getBoolValue("showDidYouKnow")) - { - didYouKnowWindow->setVisible(Visible_true); - didYouKnowWindow->loadData(); - } - - CREATEWIDGETV(emoteShortcutWindow, ShortcutWindow, - "EmoteShortcut", - new EmoteShortcutContainer(nullptr), - "emotes.xml", - 130, 480); - CREATEWIDGETV0(outfitWindow, OutfitWindow); - CREATEWIDGETV(dropShortcutWindow, ShortcutWindow, - "DropShortcut", - new VirtShortcutContainer(nullptr, dropShortcut), - "drops.xml"); - CREATEWIDGETV(spellShortcutWindow, ShortcutWindow, - "SpellShortcut", - "spells.xml", - 265, 328); - for (unsigned f = 0; f < SPELL_SHORTCUT_TABS; f ++) - { - spellShortcutWindow->addTab(toString(f + 1), - new SpellShortcutContainer(nullptr, f)); - } - - CREATEWIDGETV0(bankWindow, BankWindow); - CREATEWIDGETV0(mailWindow, MailWindow); - CREATEWIDGETV0(whoIsOnline, WhoIsOnline); - CREATEWIDGETV0(killStats, KillStats); - CREATEWIDGETV0(socialWindow, SocialWindow); - CREATEWIDGETV0(questsWindow, QuestsWindow); - - // TRANSLATORS: chat tab header - localChatTab = new ChatTab(chatWindow, _("General"), - GENERAL_CHANNEL, "#General", ChatTabType::INPUT); - localChatTab->setAllowHighlight(false); - if (config.getBoolValue("showChatHistory")) - localChatTab->loadFromLogFile("#General"); - - // TRANSLATORS: chat tab header - debugChatTab = new ChatTab(chatWindow, _("Debug"), "", - "#Debug", ChatTabType::DEBUG); - debugChatTab->setAllowHighlight(false); - - if (assertListener != nullptr) - { - const StringVect &messages = assertListener->getMessages(); - FOR_EACH (StringVectCIter, it, messages) - debugChatTab->chatLog(*it, ChatMsgType::BY_SERVER); - delete2(assertListener); - } - if (config.getBoolValue("enableTradeTab")) - chatWindow->addSpecialChannelTab(TRADE_CHANNEL, false); - else - tradeChatTab = nullptr; - - if (config.getBoolValue("enableBattleTab")) - { - battleChatTab = new BattleTab(chatWindow); - battleChatTab->setAllowHighlight(false); - } - else - { - battleChatTab = nullptr; - } - - chatWindow->showGMTab(); - if (!isSafeMode) - chatWindow->loadState(); - - if (setupWindow != nullptr) - setupWindow->externalUpdate(); - - if (localPlayer != nullptr) - localPlayer->updateStatus(); - - if (generalHandler != nullptr) - generalHandler->gameStarted(); -} - -/** - * Destroy all the globally accessible gui windows - */ -static void destroyGuiWindows() -{ - if (generalHandler != nullptr) - generalHandler->gameEnded(); - - if (whoIsOnline != nullptr) - whoIsOnline->setAllowUpdate(false); - -#ifdef TMWA_SUPPORT - GuildManager::clear(); -#endif // TMWA_SUPPORT - - delete2(windowMenu); - delete2(localChatTab) // Need to do this first, so it can remove itself - delete2(debugChatTab) - delete2(tradeChatTab) - delete2(battleChatTab) - delete2(langChatTab) - delete2(gmChatTab); -#ifdef TMWA_SUPPORT - if (guildManager != nullptr && GuildManager::getEnableGuildBot()) - guildManager->reload(); -#endif // TMWA_SUPPORT - - logger->log("start deleting"); - delete2(emoteWindow); - delete2(chatWindow) - logger->log("end deleting"); - delete2(statusWindow) - delete2(miniStatusWindow) - delete2(inventoryWindow) - delete2(cartWindow) - delete2(shopWindow) - delete2(skillDialog) - delete2(minimap) - delete2(equipmentWindow) - delete2(beingEquipmentWindow) - delete2(tradeWindow) - delete2(debugWindow) - delete2(itemShortcutWindow) - delete2(emoteShortcutWindow) - delete2(outfitWindow) - delete2(socialWindow) - delete2(dropShortcutWindow); - delete2(spellShortcutWindow); - delete2(bankWindow); - delete2(cutInWindow); - delete2(mailWindow); - delete2(questsWindow); - delete2(whoIsOnline); - delete2(killStats); -} - -Game *Game::mInstance = nullptr; - -Game::Game() : - mCurrentMap(nullptr), - mMapName(""), - mValidSpeed(true), - mNextAdjustTime(cur_time + adjustDelay), - mAdjustLevel(0), - mAdjustPerfomance(config.getBoolValue("adjustPerfomance")), - mLowerCounter(0), - mPing(0), - mTime(cur_time + 1), - mTime2(cur_time + 10) -{ - touchManager.setInGame(true); - -// assert(!mInstance); - if (mInstance != nullptr) - logger->log("error: double game creation"); - mInstance = this; - - config.incValue("gamecount"); - - disconnectedDialog = nullptr; - - // Create the viewport - viewport = new Viewport; - viewport->setSize(mainGraphics->mWidth, mainGraphics->mHeight); - PlayerInfo::clear(); - - emptyBeingSlot = new BeingSlot; - - BasicContainer2 *const top = static_cast<BasicContainer2*>(gui->getTop()); - if (top != nullptr) - top->add(viewport); - viewport->requestMoveToBottom(); - - AnimatedSprite::setEnableCache( - mainGraphics->getOpenGL() != RENDER_SOFTWARE && - config.getBoolValue("enableDelayedAnimations")); - - CompoundSprite::setEnableDelay( - config.getBoolValue("enableCompoundSpriteDelay")); - - createGuiWindows(); - windowMenu = new WindowMenu(nullptr); - - if (windowContainer != nullptr) - windowContainer->add(windowMenu); - -#ifdef USE_OPENGL - MapReader::loadEmptyAtlas(); -#endif // USE_OPENGL - - initEngines(); - - chatWindow->postConnection(); - mailWindow->postConnection(); - - // Initialize beings - if (actorManager != nullptr) - actorManager->setPlayer(localPlayer); - - gameHandler->ping(tick_time); - - if (setupWindow != nullptr) - setupWindow->setInGame(true); - clearKeysArray(); - -#ifdef TMWA_SUPPORT - if (guildManager != nullptr && GuildManager::getEnableGuildBot()) - guildManager->requestGuildInfo(); -#endif // TMWA_SUPPORT - - settings.disableLoggingInGame = config.getBoolValue( - "disableLoggingInGame"); -} - -Game::~Game() -{ -#ifdef USE_OPENGL - MapReader::unloadEmptyAtlas(); -#endif // USE_OPENGL - - settings.disableLoggingInGame = false; - touchManager.setInGame(false); - config.write(); - serverConfig.write(); - resetAdjustLevel(); - destroyGuiWindows(); - - AnimatedSprite::setEnableCache(false); - - delete2(actorManager) - if (client->getState() != State::CHANGE_MAP) - delete2(localPlayer) - if (effectManager != nullptr) - effectManager->clear(); - delete2(effectManager) - delete2(particleEngine) - delete2(viewport) - delete2(mCurrentMap) -#ifdef TMWA_SUPPORT - delete2(guildManager) -#endif // TMWA_SUPPORT -#ifdef USE_MUMBLE - delete2(mumbleManager) -#endif // USE_MUMBLE - - delete2(crazyMoves); - delete2(emptyBeingSlot); - - Being::clearCache(); - mInstance = nullptr; - PlayerInfo::gameDestroyed(); -} - -void Game::addWatermark() -{ - if ((boldFont == nullptr) || !config.getBoolValue("addwatermark")) - return; - - const Color &color1 = theme->getColor(ThemeColorId::TEXT, 255); - const Color &color2 = theme->getColor(ThemeColorId::TEXT_OUTLINE, 255); - - boldFont->drawString(mainGraphics, - color1, - color2, - settings.serverName, - 100, 50); -} - -bool Game::createScreenshot(const std::string &prefix) -{ - if ((mainGraphics == nullptr) || (screenshortHelper == nullptr)) - return false; - - SDL_Surface *screenshot = nullptr; - - if (!config.getBoolValue("showip") && (gui != nullptr)) - { - mainGraphics->setSecure(true); - screenshortHelper->prepare(); - gui->draw(); - addWatermark(); - screenshot = screenshortHelper->getScreenshot(); - mainGraphics->setSecure(false); - } - else - { - addWatermark(); - screenshot = screenshortHelper->getScreenshot(); - } - - if (screenshot == nullptr) - return false; - - return saveScreenshot(screenshot, prefix); -} - -bool Game::saveScreenshot(SDL_Surface *const screenshot, - const std::string &prefix) -{ - std::string screenshotDirectory = settings.screenshotDir; - if (mkdir_r(screenshotDirectory.c_str()) != 0) - { - logger->log("Directory %s doesn't exist and can't be created! " - "Setting screenshot directory to home.", - screenshotDirectory.c_str()); - screenshotDirectory = std::string(VirtFs::getUserDir()); - } - - // Search for an unused screenshot name - std::stringstream filename; - std::fstream testExists; - - time_t rawtime; - char buffer [100]; - time(&rawtime); - struct tm *const timeinfo = localtime(&rawtime); - strftime(buffer, 99, "%Y-%m-%d_%H-%M-%S", timeinfo); - - const std::string serverName = settings.serverName; - std::string screenShortStr; - if (prefix.empty()) - { - if (serverName.empty()) - { - screenShortStr = strprintf("%s_Screenshot_%s_", - branding.getValue("appName", "ManaPlus").c_str(), - buffer); - } - else - { - screenShortStr = strprintf("%s_Screenshot_%s_%s_", - branding.getValue("appName", "ManaPlus").c_str(), - serverName.c_str(), buffer); - } - - bool found = false; - static unsigned int screenshotCount = 0; - do - { - screenshotCount++; - filename.str(""); - filename << screenshotDirectory << "/"; - filename << screenShortStr << screenshotCount << ".png"; - testExists.open(filename.str().c_str(), std::ios::in); - found = !testExists.is_open(); - testExists.close(); - } - while (!found); - } - else - { - screenShortStr = prefix; - filename.str(""); - filename << screenshotDirectory << "/"; - filename << screenShortStr; - } - - const std::string fileNameStr = filename.str(); - const bool success = PngLib::writePNG(screenshot, fileNameStr); -#ifdef __native_client__ - std::string nacScreenshotlDir = fileNameStr; - cutFirst(nacScreenshotlDir, "/persistent"); - naclPostMessage("copy-from-persistent", nacScreenshotlDir); - logger->log("nacl screenshot path: " + nacScreenshotlDir); -#endif // __native_client__ - - if (success) - { - if (localChatTab != nullptr) - { - // TRANSLATORS: save file message - std::string str = strprintf(_("Screenshot saved as %s"), - fileNameStr.c_str()); - localChatTab->chatLog(str, ChatMsgType::BY_SERVER); - } - } - else - { - if (localChatTab != nullptr) - { - // TRANSLATORS: save file message - localChatTab->chatLog(_("Saving screenshot failed!"), - ChatMsgType::BY_SERVER); - } - logger->log1("Error: could not save screenshot."); - } - - MSDL_FreeSurface(screenshot); - return success; -} - -void Game::logic() -{ - BLOCK_START("Game::logic") - handleInput(); - - // Handle all necessary game logic - if (actorManager != nullptr) - actorManager->logic(); - if (particleEngine != nullptr) - particleEngine->update(); - if (mCurrentMap != nullptr) - mCurrentMap->update(); - - BLOCK_END("Game::logic") -} - -void Game::slowLogic() -{ - BLOCK_START("Game::slowLogic") - if (localPlayer != nullptr) - localPlayer->slowLogic(); - const time_t time = cur_time; - if (mTime != time) - { - if (valTest(Updated)) - mValidSpeed = false; - - mTime = time + 1; - if (debugWindow != nullptr) - debugWindow->slowLogic(); - if (killStats != nullptr) - killStats->update(); - if (socialWindow != nullptr) - socialWindow->slowLogic(); - if (whoIsOnline != nullptr) - whoIsOnline->slowLogic(); - Being::reReadConfig(); - if (killStats != nullptr) - cilk_spawn killStats->recalcStats(); - - if (time > mTime2 || mTime2 - time > 10) - { - mTime2 = time + 10; - config.writeUpdated(); - serverConfig.writeUpdated(); - } - if (effectManager != nullptr) - effectManager->logic(); - } - - if (mainGraphics->getOpenGL() != RENDER_SOFTWARE) - DelayedManager::delayedLoad(); - -#ifdef TMWA_SUPPORT - if (shopWindow != nullptr) - cilk_spawn shopWindow->updateTimes(); - if (guildManager != nullptr) - guildManager->slowLogic(); -#endif // TMWA_SUPPORT - - if (skillDialog != nullptr) - cilk_spawn skillDialog->slowLogic(); - - cilk_spawn PacketCounters::update(); - - // Handle network stuff - if (!gameHandler->isConnected()) - { - if (client->getState() == State::CHANGE_MAP) - return; // Not a problem here - - if (client->getState() != State::ERROR) - { - if (disconnectedDialog == nullptr) - { - // TRANSLATORS: error message text - errorMessage = _("The connection to the server was lost."); - disconnectedDialog = DialogsManager::openErrorDialog( - // TRANSLATORS: error message header - _("Network Error"), - errorMessage, - Modal_false); - disconnectedDialog->addActionListener(&errorListener); - disconnectedDialog->requestMoveToTop(); - } - } - - if ((viewport != nullptr) && !errorMessage.empty()) - { - const Map *const map = viewport->getMap(); - if (map != nullptr) - map->saveExtraLayer(); - } - DialogsManager::closeDialogs(); - WindowManager::setFramerate(config.getIntValue("fpslimit")); - mNextAdjustTime = cur_time + adjustDelay; - if (client->getState() != State::ERROR) - errorMessage.clear(); - } - else - { - if (gameHandler->mustPing() - && get_elapsed_time1(mPing) > 3000) - { - mPing = tick_time; - gameHandler->ping(tick_time); - } - - if (mAdjustPerfomance) - adjustPerfomance(); - if (disconnectedDialog != nullptr) - { - disconnectedDialog->scheduleDelete(); - disconnectedDialog = nullptr; - } - } - BLOCK_END("Game::slowLogic") -} - -void Game::adjustPerfomance() -{ - FUNC_BLOCK("Game::adjustPerfomance", 1) - const time_t time = cur_time; - if (mNextAdjustTime <= adjustDelay) - { - mNextAdjustTime = time + adjustDelay; - } - else if (mNextAdjustTime < time) - { - mNextAdjustTime = time + adjustDelay; - - if (mAdjustLevel > 3 || - localPlayer == nullptr || - localPlayer->getHalfAway() || - settings.awayMode) - { - return; - } - - int maxFps = WindowManager::getFramerate(); - if (maxFps != config.getIntValue("fpslimit")) - return; - - if (maxFps == 0) - maxFps = 30; - else if (maxFps < 10) - return; - - if (fps < maxFps - 10) - { - if (mLowerCounter < 2) - { - mLowerCounter ++; - mNextAdjustTime = cur_time + 1; - return; - } - mLowerCounter = 0; - mAdjustLevel ++; - switch (mAdjustLevel) - { - case 1: - { - if (config.getBoolValue("beingopacity")) - { - config.setValue("beingopacity", false); - config.setSilent("beingopacity", true); - if (localChatTab != nullptr) - { - localChatTab->chatLog("Auto disable Show " - "beings transparency", ChatMsgType::BY_SERVER); - } - } - else - { - mNextAdjustTime = time + 1; - mLowerCounter = 2; - } - break; - } - case 2: - if (ParticleEngine::emitterSkip < 4) - { - ParticleEngine::emitterSkip = 4; - if (localChatTab != nullptr) - { - localChatTab->chatLog("Auto lower Particle " - "effects", ChatMsgType::BY_SERVER); - } - } - else - { - mNextAdjustTime = time + 1; - mLowerCounter = 2; - } - break; - case 3: - if (!config.getBoolValue("alphaCache")) - { - config.setValue("alphaCache", true); - config.setSilent("alphaCache", false); - if (localChatTab != nullptr) - { - localChatTab->chatLog("Auto enable opacity cache", - ChatMsgType::BY_SERVER); - } - } - break; - default: - break; - } - } - } -} - -void Game::resetAdjustLevel() -{ - if (!mAdjustPerfomance) - return; - - mNextAdjustTime = cur_time + adjustDelay; - switch (mAdjustLevel) - { - case 1: - config.setValue("beingopacity", - config.getBoolValue("beingopacity")); - break; - case 2: - config.setValue("beingopacity", - config.getBoolValue("beingopacity")); - ParticleEngine::emitterSkip = config.getIntValue( - "particleEmitterSkip") + 1; - break; - default: - case 3: - config.setValue("beingopacity", - config.getBoolValue("beingopacity")); - ParticleEngine::emitterSkip = config.getIntValue( - "particleEmitterSkip") + 1; - config.setValue("alphaCache", - config.getBoolValue("alphaCache")); - break; - } - mAdjustLevel = 0; -} - -void Game::handleMove() -{ - BLOCK_START("Game::handleMove") - if (localPlayer == nullptr) - { - BLOCK_END("Game::handleMove") - return; - } - - // Moving player around - if ((chatWindow != nullptr) && - (quitDialog == nullptr) && - localPlayer->canMove() && - !chatWindow->isInputFocused() && - !InventoryWindow::isAnyInputFocused() && - !popupMenu->isPopupVisible()) - { - NpcDialog *const dialog = NpcDialog::getActive(); - if (dialog != nullptr) - { - BLOCK_END("Game::handleMove") - return; - } - - // Ignore input if either "ignore" key is pressed - // Stops the character moving about if the user's window manager - // uses "ignore+arrow key" to switch virtual desktops. - if (inputManager.isActionActive(InputAction::IGNORE_INPUT_1) || - inputManager.isActionActive(InputAction::IGNORE_INPUT_2)) - { - BLOCK_END("Game::handleMove") - return; - } - - unsigned char direction = 0; - - // Translate pressed keys to movement and direction - if (inputManager.isActionActive(InputAction::MOVE_UP) || - ((joystick != nullptr) && joystick->isUp())) - { - direction |= BeingDirection::UP; - setValidSpeed(); - localPlayer->cancelFollow(); - } - else if (inputManager.isActionActive(InputAction::MOVE_DOWN) || - ((joystick != nullptr) && joystick->isDown())) - { - direction |= BeingDirection::DOWN; - setValidSpeed(); - localPlayer->cancelFollow(); - } - - if (inputManager.isActionActive(InputAction::MOVE_LEFT) || - ((joystick != nullptr) && joystick->isLeft())) - { - direction |= BeingDirection::LEFT; - setValidSpeed(); - localPlayer->cancelFollow(); - } - else if (inputManager.isActionActive(InputAction::MOVE_RIGHT) || - ((joystick != nullptr) && joystick->isRight())) - { - direction |= BeingDirection::RIGHT; - setValidSpeed(); - localPlayer->cancelFollow(); - } - else if (inputManager.isActionActive(InputAction::MOVE_FORWARD)) - { - direction = localPlayer->getDirection(); - setValidSpeed(); - localPlayer->cancelFollow(); - } - - if ((!inputManager.isActionActive(InputAction::EMOTE) - && !inputManager.isActionActive(InputAction::PET_EMOTE) - && !inputManager.isActionActive(InputAction::HOMUN_EMOTE) - && !inputManager.isActionActive(InputAction::STOP_ATTACK)) - || direction == 0) - { - moveInDirection(direction); - } - } - BLOCK_END("Game::handleMove") -} - -void Game::moveInDirection(const unsigned char direction) -{ - if (viewport == nullptr) - return; - - if (settings.cameraMode == 0u) - { - if (localPlayer != nullptr) - localPlayer->specialMove(direction); - } - else - { - int dx = 0; - int dy = 0; - if ((direction & BeingDirection::LEFT) != 0) - dx = -5; - else if ((direction & BeingDirection::RIGHT) != 0) - dx = 5; - - if ((direction & BeingDirection::UP) != 0) - dy = -5; - else if ((direction & BeingDirection::DOWN) != 0) - dy = 5; - viewport->moveCamera(dx, dy); - } -} - -void Game::updateFrameRate(int fpsLimit) -{ - if (fpsLimit == 0) - { - if (settings.awayMode) - { - if (settings.inputFocused != KeyboardFocus::Unfocused || - settings.mouseFocused) - { - fpsLimit = config.getIntValue("fpslimit"); - } - else - { - fpsLimit = config.getIntValue("altfpslimit"); - } - } - else - { - fpsLimit = config.getIntValue("fpslimit"); - } - } - WindowManager::setFramerate(fpsLimit); - mNextAdjustTime = cur_time + adjustDelay; -} - -/** - * The huge input handling method. - */ -void Game::handleInput() -{ - BLOCK_START("Game::handleInput 1") - if (joystick != nullptr) - joystick->logic(); - - eventsManager.handleGameEvents(); - - // If the user is configuring the keys then don't respond. - if (!keyboard.isEnabled() || settings.awayMode) - { - BLOCK_END("Game::handleInput 1") - return; - } - - // If pressed outfits keys, stop processing keys. - if (inputManager.isActionActive(InputAction::WEAR_OUTFIT) - || inputManager.isActionActive(InputAction::COPY_OUTFIT) - || ((setupWindow != nullptr) && setupWindow->isWindowVisible())) - { - BLOCK_END("Game::handleInput 1") - return; - } - - handleMove(); - InputManager::handleRepeat(); - BLOCK_END("Game::handleInput 1") -} - -/** - * Changes the currently active map. Should only be called while the game is - * running. - */ -void Game::changeMap(const std::string &mapPath) -{ - BLOCK_START("Game::changeMap") - - resetAdjustLevel(); - ResourceManager::cleanProtected(); - - PopupManager::clearPopup(); - PopupManager::closePopupMenu(); - - // Clean up floor items, beings and particles - if (actorManager != nullptr) - actorManager->clear(); - - // Close the popup menu on map change so that invalid options can't be - // executed. - if (viewport != nullptr) - viewport->cleanHoverItems(); - - // Unset the map of the player so that its particles are cleared before - // being deleted in the next step - if (localPlayer != nullptr) - localPlayer->setMap(nullptr); - - if (particleEngine != nullptr) - particleEngine->clear(); - - mMapName = mapPath; - - std::string fullMap = pathJoin(paths.getValue("maps", "maps/"), - mMapName).append(".tmx"); - std::string realFullMap = pathJoin(paths.getValue("maps", "maps/"), - MapDB::getMapName(mMapName)).append(".tmx"); - - if (!VirtFs::exists(realFullMap)) - realFullMap.append(".gz"); - - // Attempt to load the new map - Map *const newMap = MapReader::readMap(fullMap, realFullMap); - - if (mCurrentMap != nullptr) - mCurrentMap->saveExtraLayer(); - - if (newMap != nullptr) - newMap->addExtraLayer(); - - if (socialWindow != nullptr) - socialWindow->setMap(newMap); - - // Notify the minimap and actorManager about the map change - if (minimap != nullptr) - minimap->setMap(newMap); - if (actorManager != nullptr) - actorManager->setMap(newMap); - if (particleEngine != nullptr) - particleEngine->setMap(newMap); - if (viewport != nullptr) - viewport->setMap(newMap); - - // Initialize map-based particle effects - if (newMap != nullptr) - newMap->initializeParticleEffects(); - - // Start playing new music file when necessary - const std::string oldMusic = mCurrentMap != nullptr - ? mCurrentMap->getMusicFile() : ""; - const std::string newMusic = newMap != nullptr ? - newMap->getMusicFile() : ""; - if (newMusic != oldMusic) - { - if (newMusic.empty()) - soundManager.fadeOutMusic(); - else - soundManager.fadeOutAndPlayMusic(newMusic); - } - - if (mCurrentMap != nullptr) - mCurrentMap->saveExtraLayer(); - - delete mCurrentMap; - mCurrentMap = newMap; - - if (questsWindow != nullptr) - questsWindow->setMap(mCurrentMap); - -#ifdef USE_MUMBLE - if (mumbleManager) - mumbleManager->setMap(mapPath); -#endif // USE_MUMBLE - - if (localPlayer != nullptr) - localPlayer->recreateItemParticles(); - - gameHandler->mapLoadedEvent(); - BLOCK_END("Game::changeMap") -} - -void Game::updateHistory(const SDL_Event &event) -{ - if ((localPlayer == nullptr) || (settings.attackType == 0u)) - return; - - if (CAST_S32(event.key.keysym.sym) != -1) - { - bool old = false; - - const InputActionT key = KeyboardConfig::getKeyIndex(event); - const time_t time = cur_time; - int idx = -1; - for (int f = 0; f < MAX_LASTKEYS; f ++) - { - LastKey &lastKey = mLastKeys[f]; - if (lastKey.key == key) - { - idx = f; - old = true; - break; - } - else if (idx >= 0 && lastKey.time < mLastKeys[idx].time) - { - idx = f; - } - } - if (idx < 0) - { - idx = 0; - for (int f = 0; f < MAX_LASTKEYS; f ++) - { - LastKey &lastKey = mLastKeys[f]; - if (lastKey.key == InputAction::NO_VALUE || - lastKey.time < mLastKeys[idx].time) - { - idx = f; - } - } - } - - if (idx < 0) - idx = 0; - - LastKey &keyIdx = mLastKeys[idx]; - if (!old) - { - keyIdx.time = time; - keyIdx.key = key; - keyIdx.cnt = 0; - } - else - { - keyIdx.cnt++; - } - } -} - -void Game::checkKeys() -{ - const int timeRange = 120; - const int cntInTime = 130; - - if ((localPlayer == nullptr) || (settings.attackType == 0u)) - return; - - const time_t time = cur_time; - for (int f = 0; f < MAX_LASTKEYS; f ++) - { - LastKey &lastKey = mLastKeys[f]; - if (lastKey.key != InputAction::NO_VALUE) - { - if (lastKey.time + timeRange < time) - { - if (lastKey.cnt > cntInTime) - mValidSpeed = false; - lastKey.key = InputAction::NO_VALUE; - } - } - } -} - -void Game::setValidSpeed() -{ - clearKeysArray(); - mValidSpeed = true; -} - -void Game::clearKeysArray() -{ - for (int f = 0; f < MAX_LASTKEYS; f ++) - { - mLastKeys[f].time = 0; - mLastKeys[f].key = InputAction::NO_VALUE; - mLastKeys[f].cnt = 0; - } -} - -void Game::videoResized(const int width, const int height) -{ - if (viewport != nullptr) - viewport->setSize(width, height); - if (windowMenu != nullptr) - windowMenu->setPosition(width - windowMenu->getWidth(), 0); -} |