#include "stdafx.h" #include "MessageManager.h" std::unordered_map MessageManager::_enResources = { { "Cheats", u8"Cheats" }, { "Debug", u8"Debug" }, { "EmulationSpeed", u8"Emulation Speed" }, { "ClockRate", u8"Clock Rate" }, { "Error", u8"Error" }, { "GameInfo", u8"Game Info" }, { "GameLoaded", u8"Game loaded" }, { "Input", u8"Input" }, { "Patch", u8"Patch" }, { "Movies", u8"Movies" }, { "NetPlay", u8"Net Play" }, { "Overclock", u8"Overclock" }, { "Region", u8"Region" }, { "SaveStates", u8"Save States" }, { "ScreenshotSaved", u8"Screenshot Saved" }, { "SoundRecorder", u8"Sound Recorder" }, { "Test", u8"Test" }, { "VideoRecorder", u8"Video Recorder" }, { "ApplyingPatch", u8"Applying patch: %1" }, { "CheatApplied", u8"1 cheat applied." }, { "CheatsApplied", u8"%1 cheats applied." }, { "CheatsDisabled", u8"All cheats disabled." }, { "CoinInsertedSlot", u8"Coin inserted (slot %1)" }, { "ConnectedToServer", u8"Connected to server." }, { "ConnectedAsPlayer", u8"Connected as player %1" }, { "ConnectedAsSpectator", u8"Connected as spectator." }, { "ConnectionLost", u8"Connection to server lost." }, { "CouldNotConnect", u8"Could not connect to the server." }, { "CouldNotInitializeAudioSystem", u8"Could not initialize audio system" }, { "CouldNotFindRom", u8"Could not find matching game ROM. (%1)" }, { "CouldNotWriteToFile", u8"Could not write to file: %1" }, { "CouldNotLoadFile", u8"Could not load file: %1" }, { "EmulationMaximumSpeed", u8"Maximum speed" }, { "EmulationSpeedPercent", u8"%1%" }, { "FdsDiskInserted", u8"Disk %1 Side %2 inserted." }, { "Frame", u8"Frame" }, { "GameCrash", u8"Game has crashed (%1)" }, { "KeyboardModeDisabled", u8"Keyboard mode disabled." }, { "KeyboardModeEnabled", u8"Keyboard mode enabled." }, { "Lag", u8"Lag" }, { "Mapper", u8"Mapper: %1, SubMapper: %2" }, { "MovieEnded", u8"Movie ended." }, { "MovieInvalid", u8"Invalid movie file." }, { "MovieMissingRom", u8"Missing ROM required (%1) to play movie." }, { "MovieNewerVersion", u8"Cannot load movies created by a more recent version of Mesen-S. Please download the latest version." }, { "MovieIncompatibleVersion", u8"This movie is incompatible with this version of Mesen-S." }, { "MoviePlaying", u8"Playing movie: %1" }, { "MovieRecordingTo", u8"Recording to: %1" }, { "MovieSaved", u8"Movie saved to file: %1" }, { "NetplayVersionMismatch", u8"%1 is not running the same version of Mesen-S and has been disconnected." }, { "NetplayNotAllowed", u8"This action is not allowed while connected to a server." }, { "OverclockEnabled", u8"Overclocking enabled." }, { "OverclockDisabled", u8"Overclocking disabled." }, { "PrgSizeWarning", u8"PRG size is smaller than 32kb" }, { "SaveStateEmpty", u8"Slot is empty." }, { "SaveStateIncompatibleVersion", u8"Save state is incompatible with this version of Mesen-S." }, { "SaveStateInvalidFile", u8"Invalid save state file." }, { "SaveStateWrongSystemSnes", u8"Error: State cannot be loaded (wrong console type: SNES)" }, { "SaveStateWrongSystemGb", u8"Error: State cannot be loaded (wrong console type: Game Boy)" }, { "SaveStateLoaded", u8"State #%1 loaded." }, { "SaveStateMissingRom", u8"Missing ROM required (%1) to load save state." }, { "SaveStateNewerVersion", u8"Cannot load save states created by a more recent version of Mesen-S. Please download the latest version." }, { "SaveStateSaved", u8"State #%1 saved." }, { "SaveStateSlotSelected", u8"Slot #%1 selected." }, { "ScanlineTimingWarning", u8"PPU timing has been changed." }, { "ServerStarted", u8"Server started (Port: %1)" }, { "ServerStopped", u8"Server stopped" }, { "SoundRecorderStarted", u8"Recording to: %1" }, { "SoundRecorderStopped", u8"Recording saved to: %1" }, { "TestFileSavedTo", u8"Test file saved to: %1" }, { "UnsupportedMapper", u8"Unsupported mapper (%1), cannot load game." }, { "VideoRecorderStarted", u8"Recording to: %1" }, { "VideoRecorderStopped", u8"Recording saved to: %1" }, }; std::list MessageManager::_log; SimpleLock MessageManager::_logLock; SimpleLock MessageManager::_messageLock; bool MessageManager::_osdEnabled = true; IMessageManager* MessageManager::_messageManager = nullptr; void MessageManager::RegisterMessageManager(IMessageManager* messageManager) { auto lock = _messageLock.AcquireSafe(); MessageManager::_messageManager = messageManager; } void MessageManager::UnregisterMessageManager(IMessageManager* messageManager) { auto lock = _messageLock.AcquireSafe(); if(MessageManager::_messageManager == messageManager) { MessageManager::_messageManager = nullptr; } } void MessageManager::SetOsdState(bool enabled) { _osdEnabled = enabled; } string MessageManager::Localize(string key) { std::unordered_map *resources = &_enResources; /*switch(EmulationSettings::GetDisplayLanguage()) { case Language::English: resources = &_enResources; break; case Language::French: resources = &_frResources; break; case Language::Japanese: resources = &_jaResources; break; case Language::Russian: resources = &_ruResources; break; case Language::Spanish: resources = &_esResources; break; case Language::Ukrainian: resources = &_ukResources; break; case Language::Portuguese: resources = &_ptResources; break; case Language::Catalan: resources = &_caResources; break; case Language::Chinese: resources = &_zhResources; break; }*/ if(resources) { if(resources->find(key) != resources->end()) { return (*resources)[key]; }/* else if(EmulationSettings::GetDisplayLanguage() != Language::English) { //Fallback on English if resource key is missing another language resources = &_enResources; if(resources->find(key) != resources->end()) { return (*resources)[key]; } }*/ } return key; } void MessageManager::DisplayMessage(string title, string message, string param1, string param2) { if(MessageManager::_messageManager) { auto lock = _messageLock.AcquireSafe(); if(!MessageManager::_messageManager) { return; } title = Localize(title); message = Localize(message); size_t startPos = message.find(u8"%1"); if(startPos != std::string::npos) { message.replace(startPos, 2, param1); } startPos = message.find(u8"%2"); if(startPos != std::string::npos) { message.replace(startPos, 2, param2); } if(_osdEnabled) { MessageManager::_messageManager->DisplayMessage(title, message); } else { MessageManager::Log("[" + title + "] " + message); } } } void MessageManager::Log(string message) { #ifndef LIBRETRO auto lock = _logLock.AcquireSafe(); if(message.empty()) { message = "------------------------------------------------------"; } if(_log.size() >= 1000) { _log.pop_front(); } _log.push_back(message); #else if(MessageManager::_messageManager) { MessageManager::_messageManager->DisplayMessage("", message + "\n"); } #endif } void MessageManager::ClearLog() { auto lock = _logLock.AcquireSafe(); _log.clear(); } string MessageManager::GetLog() { auto lock = _logLock.AcquireSafe(); stringstream ss; for(string &msg : _log) { ss << msg << "\n"; } return ss.str(); }