diff --git a/Common/Log.h b/Common/Log.h index 1e672cec60..268bfc35fb 100644 --- a/Common/Log.h +++ b/Common/Log.h @@ -57,6 +57,7 @@ enum class Log { GeDebugger, UI, IAP, + CwCheats, sceAudio, sceCtrl, diff --git a/Common/Log/LogManager.cpp b/Common/Log/LogManager.cpp index 3c1a4b3bb6..dff5ecba86 100644 --- a/Common/Log/LogManager.cpp +++ b/Common/Log/LogManager.cpp @@ -96,6 +96,7 @@ static const char * const g_logTypeNames[] = { "GEDEBUGGER", "UI", "IAP", + "CWCHEATS", "SCEAUDIO", "SCECTRL", "SCEDISP", diff --git a/Common/UI/Notice.h b/Common/UI/Notice.h index e35710ae76..5962e77502 100644 --- a/Common/UI/Notice.h +++ b/Common/UI/Notice.h @@ -34,9 +34,6 @@ public: level_ = level; text_ = text; } - void SetSquishy(bool squishy) { - squishy_ = squishy; - } void SetWrapText(bool wrapText) { wrapText_ = wrapText; } @@ -53,8 +50,7 @@ private: std::string iconName_; NoticeLevel level_; mutable float height1_ = 0.0f; - bool squishy_ = false; - bool wrapText_ = false; + bool wrapText_ = true; }; ImageID GetOSDIcon(NoticeLevel level); diff --git a/Common/UI/PopupScreens.cpp b/Common/UI/PopupScreens.cpp index 325677df6b..b78dc024df 100644 --- a/Common/UI/PopupScreens.cpp +++ b/Common/UI/PopupScreens.cpp @@ -816,6 +816,7 @@ void AskForInput(ScreenManager *screenManager, RequesterToken token, UI::View *s PopupTextInputChoice::PopupTextInputChoice(RequesterToken token, std::string *value, std::string_view title, std::string_view placeholder, int maxLen, ScreenManager *screenManager, LayoutParams *layoutParams) : AbstractChoiceWithValueDisplay(title, layoutParams), screenManager_(screenManager), value_(value), placeHolder_(placeholder), maxLen_(maxLen), token_(token), restriction_(StringRestriction::None) { + _dbg_assert_(value); OnClick.Handle(this, &PopupTextInputChoice::HandleClick); } diff --git a/UI/CwCheatScreen.cpp b/UI/CwCheatScreen.cpp index 216c70d01e..73d83e1841 100644 --- a/UI/CwCheatScreen.cpp +++ b/UI/CwCheatScreen.cpp @@ -18,29 +18,132 @@ #include "ppsspp_config.h" #include "ext/xxhash.h" #include "Common/UI/UI.h" +#include "Common/UI/PopupScreens.h" #include "Common/Data/Text/I18n.h" #include "Common/Data/Encoding/Utf8.h" #include "Common/File/FileUtil.h" +#include "Common/Net/HTTPClient.h" #include "Common/StringUtils.h" #include "Common/System/System.h" #include "Common/System/Request.h" -#include "Common/UI/PopupScreens.h" #include "Core/System.h" #include "Core/Config.h" #include "Core/CwCheat.h" #include "Core/MIPS/JitCommon/JitCommon.h" - +#undef new +#ifdef SYSTEM_RAPIDJSON +#include +#else +#include "ext/rapidjson/include/rapidjson/document.h" +#endif +#include "Common/DbgNew.h" #include "UI/GameInfoCache.h" #include "UI/CwCheatScreen.h" #include "UI/MiscViews.h" static const int FILE_CHECK_FRAME_INTERVAL = 53; +constexpr char g_cheatDBListUrl[] = "https://metadata.ppsspp.org/cheats.json"; + static Path GetGlobalCheatFilePath() { return GetSysDirectory(DIRECTORY_CHEATS) / "cheat.db"; } +struct CheatDatabaseDownloadInfo { + std::string name; + std::string maintainer; + std::string url; +}; + +// Use rapidjson to parse the cheat database list. +std::vector ParseJson(std::string_view json) { + rapidjson::Document d; + d.Parse(json.data(), json.size()); + + std::vector downloads; + + if (d.HasParseError()) { + ERROR_LOG(Log::CwCheats, "Failed to parse cheat database list: %.*s", STR_VIEW(json)); + return downloads; + } + if (!d.IsObject()) { + ERROR_LOG(Log::CwCheats, "1"); + return downloads; + } + if (!d.HasMember("databases") || !d["databases"].IsArray()) { + ERROR_LOG(Log::CwCheats, "databases is not an array"); + return downloads; + } + + const auto& dbs = d["databases"]; + for (auto& db : dbs.GetArray()) { + if (!db.IsObject()) + continue; + CheatDatabaseDownloadInfo info; + if (!db.HasMember("name") || !db["name"].IsString()) + continue; + info.name = db["name"].GetString(); + if (!db.HasMember("maintainer") || !db["maintainer"].IsString()) + continue; + info.maintainer = db["maintainer"].GetString(); + if (!db.HasMember("url") || !db["url"].IsString()) + continue; + info.url = db["url"].GetString(); + downloads.push_back(info); + } + return downloads; +} + +class CwCheatDownloadPopupScreen : public UI::PopupScreen { +public: + CwCheatDownloadPopupScreen(); + + void CreatePopupContents(UI::ViewGroup *parent) override; + void update() override; + + const char *tag() const override { return "CwCheatDownloadScreen"; } + + const std::string &ChosenUrl() const { return chosenUrl_; } + +private: + std::shared_ptr cheatsRequest_; + std::string chosenUrl_; + std::vector cheatDbs_; +}; + +CwCheatDownloadPopupScreen::CwCheatDownloadPopupScreen() : PopupScreen(T(I18NCat::DIALOG, "Back")) { + cheatsRequest_ = g_DownloadManager.StartDownload(g_cheatDBListUrl, Path(), http::RequestFlags::KeepInMemory, nullptr, "cheatdblist"); +} + +void CwCheatDownloadPopupScreen::update() { + UI::PopupScreen::update(); + if (cheatsRequest_ && cheatsRequest_->Done()) { + std::string data; + cheatsRequest_->buffer().TakeAll(&data); + cheatDbs_ = ParseJson(data); + cheatsRequest_.reset(); + RecreateViews(); + } +} + +void CwCheatDownloadPopupScreen::CreatePopupContents(UI::ViewGroup *parent) { + using namespace UI; + auto cw = GetI18NCategory(I18NCat::CWCHEATS); + + if (File::Exists(GetGlobalCheatFilePath())) { + parent->Add(new NoticeView(NoticeLevel::WARN, cw->T("A cheat database already exists. Downloading a new one will overwrite it."), "")); + } + + for (auto &db : cheatDbs_) { + parent->Add(new Choice(db.name + " - " + db.maintainer, ImageID("I_DOWNLOAD")))->OnClick.Add([this, url = db.url](UI::EventParams &) { + INFO_LOG(Log::CwCheats, "Chosen cheat database URL: %s", url.c_str()); + chosenUrl_ = url; + TriggerFinish(DialogResult::DR_OK); + }); + } +} + CwCheatScreen::CwCheatScreen(const Path &gamePath) : UITwoPaneBaseDialogScreen(gamePath, TwoPaneFlags::Default) { } @@ -61,8 +164,7 @@ bool CwCheatScreen::TryLoadCheatInfo() { return false; } gameID = info->GetParamSFO().GetValueString("DISC_ID"); - if ((info->id.empty() || !info->disc_total) - && gamePath_.FilePathContainsNoCase("PSP/GAME/")) { + if ((info->id.empty() || !info->disc_total) && gamePath_.FilePathContainsNoCase("PSP/GAME/")) { gameID = g_paramSFO.GenerateFakeID(gamePath_); } @@ -100,6 +202,19 @@ bool CwCheatScreen::key(const KeyInput &input) { return UITwoPaneBaseDialogScreen::key(input); } +void CwCheatScreen::dialogFinished(const Screen *dialog, DialogResult result) { + if (auto downloadScreen = dynamic_cast(dialog)) { + if (downloadRequest_) { + ERROR_LOG(Log::CwCheats, "Download already in progress, ignoring new download request."); + return; + } + INFO_LOG(Log::CwCheats, "Starting download of cheat database from %s", downloadScreen->ChosenUrl().c_str()); + downloadRequest_ = g_DownloadManager.StartDownload(downloadScreen->ChosenUrl(), GetGlobalCheatFilePath(), http::RequestFlags::ProgressBar, nullptr, "cheatdbdownload"); + } else { + UITwoPaneBaseDialogScreen::dialogFinished(dialog, result); + } +} + void CwCheatScreen::CreateSettingsViews(UI::ViewGroup *leftColumn) { using namespace UI; auto cw = GetI18NCategory(I18NCat::CWCHEATS); @@ -109,6 +224,10 @@ void CwCheatScreen::CreateSettingsViews(UI::ViewGroup *leftColumn) { //leftColumn->Add(new Choice(cw->T("Add Cheat")))->OnClick.Handle(this, &CwCheatScreen::OnAddCheat); leftColumn->Add(new ItemHeader(cw->T("Import Cheats"))); + leftColumn->Add(new Choice(cw->T("Download cheat database")))->OnClick.Add([this](UI::EventParams &) { + screenManager()->push(new CwCheatDownloadPopupScreen()); + }); + Path cheatPath = GetGlobalCheatFilePath(); std::string root = GetSysDirectory(DIRECTORY_MEMSTICK_ROOT).ToString(); @@ -222,6 +341,16 @@ void CwCheatScreen::update() { fileCheckCounter_ = 0; } + if (downloadRequest_ && downloadRequest_->Done()) { + if (!downloadRequest_->Failed()) { + INFO_LOG(Log::CwCheats, "Cheat database downloaded successfully to %s.", GetGlobalCheatFilePath().ToVisualString().c_str()); + RecreateViews(); + } else { + ERROR_LOG(Log::CwCheats, "Failed to download cheat database"); + } + downloadRequest_.reset(); + } + UIBaseDialogScreen::update(); } @@ -313,7 +442,7 @@ void CwCheatScreen::OnImportBrowse(UI::EventParams ¶ms) { return; } Path path(value); - INFO_LOG(Log::System, "Attempting to load cheats from: '%s'", path.ToVisualString().c_str()); + INFO_LOG(Log::CwCheats, "Attempting to load cheats from: '%s'", path.ToVisualString().c_str()); int cheatsFound = 0; ImportAndReport(path); }); @@ -327,12 +456,12 @@ void CwCheatScreen::OnImportCheat(UI::EventParams ¶ms) { bool CwCheatScreen::ImportCheats(const Path &cheatFile, int *cheatsFound) { FILE *in = File::OpenCFile(cheatFile, "rt"); if (!in) { - WARN_LOG(Log::Common, "Unable to open %s\n", cheatFile.c_str()); + WARN_LOG(Log::CwCheats, "Unable to open %s\n", cheatFile.c_str()); return false; } if (gameID_.length() != 9 || !engine_) { - WARN_LOG(Log::Common, "CWCHEAT: Incorrect ID(%s) - can't import cheats.", gameID_.c_str()); + WARN_LOG(Log::CwCheats, "CWCHEAT: Incorrect ID(%s) - can't import cheats.", gameID_.c_str()); return false; } diff --git a/UI/CwCheatScreen.h b/UI/CwCheatScreen.h index 6922aa26b6..84e2525bdc 100644 --- a/UI/CwCheatScreen.h +++ b/UI/CwCheatScreen.h @@ -26,6 +26,7 @@ #include "UI/BaseScreens.h" #include "UI/SimpleDialogScreen.h" #include "UI/MiscViews.h" +#include "Common/Net/HTTPClient.h" struct CheatFileInfo; class CWCheatEngine; @@ -58,6 +59,8 @@ protected: void CreateContentViews(UI::ViewGroup *) override; std::string_view GetTitle() const override; + void dialogFinished(const Screen *dialog, DialogResult result) override; + private: void OnCheckBox(int index); bool ImportCheats(const Path &cheatFile, int *cheatsFound); @@ -80,4 +83,6 @@ private: UI::ViewGroup *cheatList_ = nullptr; ViewSearch search_; + + std::shared_ptr downloadRequest_; }; diff --git a/UI/OnScreenDisplay.cpp b/UI/OnScreenDisplay.cpp index 1cc1923eca..271855fd7a 100644 --- a/UI/OnScreenDisplay.cpp +++ b/UI/OnScreenDisplay.cpp @@ -439,10 +439,6 @@ void NoticeView::GetContentDimensionsBySpec(const UIContext &dc, UI::MeasureSpec ApplyBoundBySpec(layoutWidth, horiz); const int align = wrapText_ ? FLAG_WRAP_TEXT : 0; MeasureNotice(dc, level_, text_, detailsText_, iconName_, align, layoutWidth, &w, &h, &height1_); - // Layout hack! Some weird problems with the layout that I can't figure out right now.. - if (squishy_) { - w = 50.0; - } } void NoticeView::Draw(UIContext &dc) { diff --git a/UI/UIAtlas.cpp b/UI/UIAtlas.cpp index 791c1d8fa6..c2ca1142d5 100644 --- a/UI/UIAtlas.cpp +++ b/UI/UIAtlas.cpp @@ -197,6 +197,7 @@ static const ImageMeta g_uiImageIDs[] = { {"I_ARCHIVE_ZIP", false}, {"I_ARCHIVE_7Z", false}, {"I_ARCHIVE_RAR", false}, + {"I_DOWNLOAD", false}, }; static std::string PNGNameFromID(std::string_view id) { diff --git a/Windows/PPSSPP.vcxproj b/Windows/PPSSPP.vcxproj index ed8a0029ef..3f62b6e383 100644 --- a/Windows/PPSSPP.vcxproj +++ b/Windows/PPSSPP.vcxproj @@ -1185,6 +1185,7 @@ true true + diff --git a/Windows/PPSSPP.vcxproj.filters b/Windows/PPSSPP.vcxproj.filters index 4bc460a744..40ca4d9637 100644 --- a/Windows/PPSSPP.vcxproj.filters +++ b/Windows/PPSSPP.vcxproj.filters @@ -845,6 +845,9 @@ assets + + assets + diff --git a/assets/cheats.json b/assets/cheats.json new file mode 100644 index 0000000000..39711f8053 --- /dev/null +++ b/assets/cheats.json @@ -0,0 +1,9 @@ +{ + "databases": [ + { + "name": "CWCheat-Database-Plus", + "maintainer": "Saramagrean", + "url": "https://raw.githubusercontent.com/Saramagrean/CWCheat-Database-Plus-/refs/heads/master/cheat.db" + } + ] +} diff --git a/assets/lang/ar_AE.ini b/assets/lang/ar_AE.ini index 07f5df38f5..2b8f3bc24b 100644 --- a/assets/lang/ar_AE.ini +++ b/assets/lang/ar_AE.ini @@ -203,8 +203,10 @@ X = X Y = Y [CwCheats] +A cheat database already exists. Downloading a new one will overwrite it. = قاعدة بيانات الغش موجودة بالفعل. تنزيل جديدة سيؤدي إلى استبدالها. # AI translated Added %1 cheats for this game = تمت إضافة %1 غش لهذه اللعبة # AI translated Cheats = ‎الغش +Download cheat database = قم بتنزيل قاعدة بيانات الغش # AI translated Edit Cheat File = ‎عدل ملف الغش Import Cheats = ‎إستورد من cheat.db Import from %s = ‎إستورد من %s diff --git a/assets/lang/az_AZ.ini b/assets/lang/az_AZ.ini index 85224b8cda..e922ae9ea3 100644 --- a/assets/lang/az_AZ.ini +++ b/assets/lang/az_AZ.ini @@ -195,8 +195,10 @@ X = X Y = Y [CwCheats] +A cheat database already exists. Downloading a new one will overwrite it. = Artıq bir fırıldaq verilənlər bazası mövcuddur. Yeni birini yükləmək onu əvəz edəcək. # AI translated Added %1 cheats for this game = %1 kod oyuna əlavə edildi # AI translated Cheats = Hiylələr +Download cheat database = Davam et edin cheat verilənlər bazası # AI translated Edit Cheat File = Hiylə faylını düzəlt Import Cheats = Cheat.db'dən götür Import from %s = %s yerindən götür diff --git a/assets/lang/be_BY.ini b/assets/lang/be_BY.ini index 370764210f..b050790e7b 100644 --- a/assets/lang/be_BY.ini +++ b/assets/lang/be_BY.ini @@ -195,8 +195,10 @@ X = X Y = Y [CwCheats] +A cheat database already exists. Downloading a new one will overwrite it. = База дадзеных чыт-кода ўжо існуе. Спампоўка новай зьменіць яе. # AI translated Added %1 cheats for this game = Дададзена %1 чыт для гэтай гульні # AI translated Cheats = Чыты +Download cheat database = Скачайце базу даных чыт # AI translated Edit Cheat File = Рэдагаваць файл чытаў Import Cheats = Імпарт з cheat.db Import from %s = Імпарт з %s diff --git a/assets/lang/bg_BG.ini b/assets/lang/bg_BG.ini index 069dc6c1b4..1cbbe17765 100644 --- a/assets/lang/bg_BG.ini +++ b/assets/lang/bg_BG.ini @@ -195,8 +195,10 @@ X = X Y = Y [CwCheats] +A cheat database already exists. Downloading a new one will overwrite it. = Базата с кодове вече съществува. Изтеглянето на нова ще я замени. # AI translated Added %1 cheats for this game = Добавени са %1 чийтове за тази игра # AI translated Cheats = Чийтове +Download cheat database = Изтеглете базата данни с трикове # AI translated Edit Cheat File = Редактиране на чийтове файл Import Cheats = Внеси от cheat.db Import from %s = Внеси от %s diff --git a/assets/lang/ca_ES.ini b/assets/lang/ca_ES.ini index 893748f4c5..1daf258d4b 100644 --- a/assets/lang/ca_ES.ini +++ b/assets/lang/ca_ES.ini @@ -195,8 +195,10 @@ X = X Y = Y [CwCheats] +A cheat database already exists. Downloading a new one will overwrite it. = Ja existeix una base de dades de trucs. Descarregar-ne una nova la sobrescriurà. # AI translated Added %1 cheats for this game = S'han afegit %1 trucs per a aquest joc # AI translated Cheats = Trucs +Download cheat database = Descarrega la base de dades de trics # AI translated Edit Cheat File = Editar el fitxer de trucs Import Cheats = Importar «cheat.db» Import from %s = Importar %s diff --git a/assets/lang/cz_CZ.ini b/assets/lang/cz_CZ.ini index 4ab3502913..2d137701cd 100644 --- a/assets/lang/cz_CZ.ini +++ b/assets/lang/cz_CZ.ini @@ -195,8 +195,10 @@ X = X Y = Y [CwCheats] +A cheat database already exists. Downloading a new one will overwrite it. = Databáze cheatů již existuje. Stáhnutí nové ji přepíše. # AI translated Added %1 cheats for this game = Přidáno %1 cheatů pro tuto hru # AI translated Cheats = Cheaty +Download cheat database = Stáhnout databázi cheatů # AI translated Edit Cheat File = Upravit soubor s cheaty Import Cheats = Importovat z cheat.db Import from %s = Importovat z %s diff --git a/assets/lang/da_DK.ini b/assets/lang/da_DK.ini index dd3d9b99ec..1297c309b5 100644 --- a/assets/lang/da_DK.ini +++ b/assets/lang/da_DK.ini @@ -195,8 +195,10 @@ X = X Y = Y [CwCheats] +A cheat database already exists. Downloading a new one will overwrite it. = En snyde-database eksisterer allerede. Download af en ny vil overskrive den. # AI translated Added %1 cheats for this game = Tilføjet %1 snyd til dette spil # AI translated Cheats = Snyd +Download cheat database = Download cheat-database # AI translated Edit Cheat File = Editer snydefil Import Cheats = Import from cheat.db Import from %s = Importer fra %s diff --git a/assets/lang/de_DE.ini b/assets/lang/de_DE.ini index ef3f035b67..9d3c519753 100644 --- a/assets/lang/de_DE.ini +++ b/assets/lang/de_DE.ini @@ -195,8 +195,10 @@ X = X Y = Y [CwCheats] +A cheat database already exists. Downloading a new one will overwrite it. = Eine Cheat-Datenbank existiert bereits. Das Herunterladen einer neuen wird sie überschreiben. # AI translated Added %1 cheats for this game = Es wurden %1 Cheats für dieses Spiel hinzugefügt # AI translated Cheats = Cheats +Download cheat database = Cheat-Datenbank herunterladen # AI translated Edit Cheat File = Cheat-Datei ändern Import Cheats = Cheats importieren (aus cheat.db) Import from %s = Importieren von %s diff --git a/assets/lang/dr_ID.ini b/assets/lang/dr_ID.ini index a2de31394e..c0290b7928 100644 --- a/assets/lang/dr_ID.ini +++ b/assets/lang/dr_ID.ini @@ -195,8 +195,10 @@ X = X Y = Y [CwCheats] +A cheat database already exists. Downloading a new one will overwrite it. = Database cheat sudah ada. Mengunduh yang baru akan menimpanya. # AI translated Added %1 cheats for this game = Ditambahkan %1 cheat untuk game ini # AI translated Cheats = Cheat +Download cheat database = Unduh database cheat # AI translated Edit Cheat File = Edit cheat file Import Cheats = Patamanni cheat.db Import from %s = Patamanni %s diff --git a/assets/lang/en_US.ini b/assets/lang/en_US.ini index e7f6e6f172..f60c941f47 100644 --- a/assets/lang/en_US.ini +++ b/assets/lang/en_US.ini @@ -219,8 +219,10 @@ X = X Y = Y [CwCheats] +A cheat database already exists. Downloading a new one will overwrite it. = A cheat database already exists. Downloading a new one will overwrite it. Added %1 cheats for this game = Added %1 cheats for this game Cheats = Cheats +Download cheat database = Download cheat database Edit Cheat File = Edit cheat file Import Cheats = Import from cheat.db Import from %s = Import from %s diff --git a/assets/lang/es_ES.ini b/assets/lang/es_ES.ini index 7d6d38d95d..e983e385c3 100644 --- a/assets/lang/es_ES.ini +++ b/assets/lang/es_ES.ini @@ -196,8 +196,10 @@ X = X Y = Y [CwCheats] +A cheat database already exists. Downloading a new one will overwrite it. = Ya existe una base de datos de trucos. Descargar una nueva la sobrescribirá. # AI translated Added %1 cheats for this game = Añadidos %1 trucos para este juego # AI translated Cheats = Trucos +Download cheat database = Descargar base de datos de trampas # AI translated Edit Cheat File = Editar archivo de trucos Import Cheats = Importar archivo cheat.db Import from %s = Importar desde %s diff --git a/assets/lang/es_LA.ini b/assets/lang/es_LA.ini index 20c8717f47..dbf3cb3152 100644 --- a/assets/lang/es_LA.ini +++ b/assets/lang/es_LA.ini @@ -195,8 +195,10 @@ X = X Y = Y [CwCheats] +A cheat database already exists. Downloading a new one will overwrite it. = Ya existe una base de datos de trucos. Descargar una nueva la sobrescribirá. # AI translated Added %1 cheats for this game = Se añadieron %1 trucos para este juego # AI translated Cheats = Trucos +Download cheat database = Descargar base de datos de trucos # AI translated Edit Cheat File = Editar archivo de trucos Import Cheats = Importar archivo cheat.db Import from %s = Importar desde %s diff --git a/assets/lang/fa_IR.ini b/assets/lang/fa_IR.ini index 85438f61e1..5c8373f8e7 100644 --- a/assets/lang/fa_IR.ini +++ b/assets/lang/fa_IR.ini @@ -195,8 +195,10 @@ X = X Y = Y [CwCheats] +A cheat database already exists. Downloading a new one will overwrite it. = یک پایگاه داده تقلب already موجود است. دانلود یک پایگاه داده جدید آن را جایگزین خواهد کرد. # AI translated Added %1 cheats for this game = به این بازی %1 تقلب اضافه شد # AI translated Cheats = ‎کد‌های تقلب +Download cheat database = دانلود پایگاه داده تقلب # AI translated Edit Cheat File = ‎ویرایش فایل کد‌ها Import Cheats = ‎cheat.db وارد کردن از Import from %s = وارد کردن از %s diff --git a/assets/lang/fi_FI.ini b/assets/lang/fi_FI.ini index ade2033d8d..0241885b07 100644 --- a/assets/lang/fi_FI.ini +++ b/assets/lang/fi_FI.ini @@ -195,8 +195,10 @@ X = X Y = Y [CwCheats] +A cheat database already exists. Downloading a new one will overwrite it. = Huijaustietokanta on jo olemassa. Uuden lataaminen korvasi sen. # AI translated Added %1 cheats for this game = Lisätty %1 koodia tälle pelille # AI translated Cheats = Huijaukset +Download cheat database = Lataa huijaustietokanta # AI translated Edit Cheat File = Muokkaa huijaustiedostoa Import Cheats = Tuo huijauksia Import from %s = %s diff --git a/assets/lang/fr_FR.ini b/assets/lang/fr_FR.ini index 00aa139db1..8efc6ec288 100644 --- a/assets/lang/fr_FR.ini +++ b/assets/lang/fr_FR.ini @@ -219,8 +219,10 @@ X = Axe X Y = Axe Y [CwCheats] +A cheat database already exists. Downloading a new one will overwrite it. = Une base de données de triches existe déjà. Télécharger une nouvelle l'écrasera. # AI translated Added %1 cheats for this game = Ajout de %1 astuces pour ce jeu # AI translated Cheats = Codes de triche +Download cheat database = Télécharger la base de données de triche # AI translated Edit Cheat File = Modifier le fichier de triche Import Cheats = Importer des codes de triche Import from %s = Importer de %s diff --git a/assets/lang/gl_ES.ini b/assets/lang/gl_ES.ini index 61cc2cede2..2b3f1e598a 100644 --- a/assets/lang/gl_ES.ini +++ b/assets/lang/gl_ES.ini @@ -195,8 +195,10 @@ X = X Y = Y [CwCheats] +A cheat database already exists. Downloading a new one will overwrite it. = Xa existe unha base de datos de trampas. Descargar unha nova sobrescribirá a existente. # AI translated Added %1 cheats for this game = Engadidos %1 trucos para este xogo # AI translated Cheats = Trucos +Download cheat database = Descarga a base de datos de trucos # AI translated Edit Cheat File = Editar arquivo de trucos Import Cheats = Importar cheat.db Import from %s = Importar %s diff --git a/assets/lang/gr_EL.ini b/assets/lang/gr_EL.ini index aa6f325617..d3ddeba23f 100644 --- a/assets/lang/gr_EL.ini +++ b/assets/lang/gr_EL.ini @@ -195,8 +195,10 @@ X = X Y = Y [CwCheats] +A cheat database already exists. Downloading a new one will overwrite it. = Μια βάση δεδομένων cheat υπάρχει ήδη. Η λήψη μιας νέας θα την αντικαταστήσει. # AI translated Added %1 cheats for this game = Προστέθηκαν %1 cheats για αυτό το παιχνίδι # AI translated Cheats = Κωδικοί +Download cheat database = Κατεβάστε τη βάση δεδομένων cheat # AI translated Edit Cheat File = Επεξεργασία αρχείου κωδικών Import Cheats = Εισαγωγή από cheat.db Import from %s = Εισαγωγή από %s diff --git a/assets/lang/he_IL.ini b/assets/lang/he_IL.ini index 1dea18bfc6..3ade3a70b2 100644 --- a/assets/lang/he_IL.ini +++ b/assets/lang/he_IL.ini @@ -195,8 +195,10 @@ X = X Y = Y [CwCheats] +A cheat database already exists. Downloading a new one will overwrite it. = מאגר נתוני רמאות קיים כבר. הורדת אחד חדש תחליף אותו. # AI translated Added %1 cheats for this game = הוספו %1 קודי רמאות למשחק הזה # AI translated Cheats = Cheats +Download cheat database = הורד את מסד הנתונים של ההונאות # AI translated Edit Cheat File = Edit cheat file Import Cheats = Import from cheat.db Import from %s = Import from %s diff --git a/assets/lang/he_IL_invert.ini b/assets/lang/he_IL_invert.ini index 54d2e46d14..16a70df8f2 100644 --- a/assets/lang/he_IL_invert.ini +++ b/assets/lang/he_IL_invert.ini @@ -195,8 +195,10 @@ X = X Y = Y [CwCheats] +A cheat database already exists. Downloading a new one will overwrite it. = מאגר נתוני רמאות קיים כבר. הורדת אחד חדש תחליף אותו. # AI translated Added %1 cheats for this game = המשחק הזה קיבל %1 קודי רמאות # AI translated Cheats = Cheats +Download cheat database = שדר מסד הנתונים של ההונאות # AI translated Edit Cheat File = Edit cheat file Import Cheats = Import from cheat.db Import from %s = Import from %s diff --git a/assets/lang/hr_HR.ini b/assets/lang/hr_HR.ini index af9f61ce50..ff5f455142 100644 --- a/assets/lang/hr_HR.ini +++ b/assets/lang/hr_HR.ini @@ -195,8 +195,10 @@ X = X Y = Y [CwCheats] +A cheat database already exists. Downloading a new one will overwrite it. = Baza podataka o prevarama već postoji. Preuzimanje nove će je prebrisati. # AI translated Added %1 cheats for this game = Dodano %1 varanja za ovu igru # AI translated Cheats = Šifre +Download cheat database = Preuzmi bazu podataka s podvalama # AI translated Edit Cheat File = Izmijeni cheat datoteku Import Cheats = Uvezi iz cheat.db Import from %s = Uvezi iz %s diff --git a/assets/lang/hu_HU.ini b/assets/lang/hu_HU.ini index 7bb97b7c21..6384a42a1e 100644 --- a/assets/lang/hu_HU.ini +++ b/assets/lang/hu_HU.ini @@ -195,8 +195,10 @@ X = X Y = Y [CwCheats] +A cheat database already exists. Downloading a new one will overwrite it. = A csalás adatbázis már létezik. Egy új letöltése felülírja ezt. # AI translated Added %1 cheats for this game = %1 csalást adtunk hozzá ehhez a játékhoz # AI translated Cheats = Csalások +Download cheat database = Töltse le a csalás adatbázist # AI translated Edit Cheat File = Csalás fájl szerkesztése Import Cheats = Importálás cheat.db-ből Import from %s = Importálás innen: %s diff --git a/assets/lang/id_ID.ini b/assets/lang/id_ID.ini index 8d79c1950a..50aea553e7 100644 --- a/assets/lang/id_ID.ini +++ b/assets/lang/id_ID.ini @@ -195,8 +195,10 @@ X = X Y = Y [CwCheats] +A cheat database already exists. Downloading a new one will overwrite it. = Database kecurangan sudah ada. Mengunduh yang baru akan menimpanya. # AI translated Added %1 cheats for this game = Ditambahkan %1 cheat untuk permainan ini # AI translated Cheats = Cheat +Download cheat database = Unduh basis data cheat # AI translated Edit Cheat File = Edit berkas cheat Import Cheats = Impor dari cheat.db Import from %s = Impor dari %s diff --git a/assets/lang/it_IT.ini b/assets/lang/it_IT.ini index 1737c8e2d5..93acd4f292 100644 --- a/assets/lang/it_IT.ini +++ b/assets/lang/it_IT.ini @@ -195,8 +195,10 @@ X = X Y = Y [CwCheats] +A cheat database already exists. Downloading a new one will overwrite it. = Esiste già un database di trucchi. Scaricare uno nuovo lo sovrascriverà. # AI translated Added %1 cheats for this game = Aggiunti %1 trucchi per questo gioco # AI translated Cheats = Trucchi +Download cheat database = Scarica il database dei cheat # AI translated Edit Cheat File = Modifica file Trucchi Import Cheats = Importa da cheat.db Import from %s = Importa da %s diff --git a/assets/lang/ja_JP.ini b/assets/lang/ja_JP.ini index 0e14c66305..668ede3198 100644 --- a/assets/lang/ja_JP.ini +++ b/assets/lang/ja_JP.ini @@ -195,8 +195,10 @@ X = X Y = Y [CwCheats] +A cheat database already exists. Downloading a new one will overwrite it. = チートデータベースはすでに存在します。新しいものをダウンロードすると上書きされます。 # AI translated Added %1 cheats for this game = このゲームに%1 チートが追加されました # AI translated Cheats = チート +Download cheat database = チートデータベースをダウンロード # AI translated Edit Cheat File = チートファイルを編集する Import Cheats = cheat.dbからインポートする Import from %s = %sからインポートする diff --git a/assets/lang/jv_ID.ini b/assets/lang/jv_ID.ini index cc255e4d6c..f9bce51608 100644 --- a/assets/lang/jv_ID.ini +++ b/assets/lang/jv_ID.ini @@ -195,8 +195,10 @@ X = X Y = Y [CwCheats] +A cheat database already exists. Downloading a new one will overwrite it. = Database curang wis ana. Ngundhuh anyar bakal ngowahi. # AI translated Added %1 cheats for this game = Dianyari %1 curang kanggo game iki # AI translated Cheats = Mbeling +Download cheat database = Download database cheat # AI translated Edit Cheat File = Sunting berkas mbeling Import Cheats = Import from cheat.db Import from %s = Njokot soko %s diff --git a/assets/lang/ko_KR.ini b/assets/lang/ko_KR.ini index 2c321d9d0b..ca855d8a9f 100644 --- a/assets/lang/ko_KR.ini +++ b/assets/lang/ko_KR.ini @@ -195,8 +195,10 @@ X = X Y = Y [CwCheats] +A cheat database already exists. Downloading a new one will overwrite it. = 치트 데이터베이스가 이미 존재합니다. 새로 다운로드하면 덮어쓰게 됩니다. # AI translated Added %1 cheats for this game = 이 게임에 %1 치트가 추가되었습니다 # AI translated Cheats = 치트 +Download cheat database = 치트 데이터베이스 다운로드 # AI translated Edit Cheat File = 치트 파일 수정 Import Cheats = cheat.db에서 가져오기 Import from %s = %s에서 가져오기 diff --git a/assets/lang/ku_SO.ini b/assets/lang/ku_SO.ini index e1542ef704..13fdb8d9b0 100644 --- a/assets/lang/ku_SO.ini +++ b/assets/lang/ku_SO.ini @@ -208,8 +208,10 @@ X = X Y = Y [CwCheats] +A cheat database already exists. Downloading a new one will overwrite it. = Danezana cheat heye. Daneyek nû dakêşan wê ew lê bigire. # AI translated Added %1 cheats for this game = Lihevhatin %1 tîkîne ji bo vê lîstikê # AI translated Cheats = Cheats +Download cheat database = Download cheat database # AI translated Edit Cheat File = Edit cheat file Import Cheats = Import from cheat.db Import from %s = Import from %s diff --git a/assets/lang/lo_LA.ini b/assets/lang/lo_LA.ini index 4669cf22cb..7977e1426e 100644 --- a/assets/lang/lo_LA.ini +++ b/assets/lang/lo_LA.ini @@ -195,8 +195,10 @@ X = X Y = Y [CwCheats] +A cheat database already exists. Downloading a new one will overwrite it. = ລົບລູກວິທີບໍ່ມີໃບອະທິບາຍແລ້ວ. ການດາວໂອນໃໝ່ຈະປ່ອນໃຫມ່. # AI translated Added %1 cheats for this game = ເພີ່ມເຂົ້າແບບ %1 ສໍາລັບເກมນີ້ # AI translated Cheats = ການໃຊ້ສູດໂກງ +Download cheat database = ດາວ໌ໍ່ສູງປະເພດຂອງຄອບຂໍ້ມູນ # AI translated Edit Cheat File = ປັບແຕ່ງໄຟລ໌ສູດໂກງ Import Cheats = Import from cheat.db Import from %s = ນຳເຂົ້າຈາກໄຟລ໌ສູດໂກງ %s diff --git a/assets/lang/lt-LT.ini b/assets/lang/lt-LT.ini index 48627630d9..80c955f756 100644 --- a/assets/lang/lt-LT.ini +++ b/assets/lang/lt-LT.ini @@ -195,8 +195,10 @@ X = X Y = Y [CwCheats] +A cheat database already exists. Downloading a new one will overwrite it. = Apgaulės duomenų bazė jau egzistuoja. Atsisiųsti naują ją perrašys. # AI translated Added %1 cheats for this game = Pridėta %1 sukčiavimų šiai žaidimui # AI translated Cheats = Kodai +Download cheat database = Atsisiųsti apgaulės duomenų bazę # AI translated Edit Cheat File = Redaguoti kodų failą Import Cheats = Importuoti iš cheat.db Import from %s = Importuoti iš %s diff --git a/assets/lang/ms_MY.ini b/assets/lang/ms_MY.ini index 41fccf97e7..3e679dc319 100644 --- a/assets/lang/ms_MY.ini +++ b/assets/lang/ms_MY.ini @@ -195,8 +195,10 @@ X = X Y = Y [CwCheats] +A cheat database already exists. Downloading a new one will overwrite it. = Pangkalan data penipuan sudah ada. Memuat turun yang baru akan menimpanya. # AI translated Added %1 cheats for this game = Ditambahkan %1 helah untuk permainan ini # AI translated Cheats = Cheat +Download cheat database = Muat turun pangkalan data cheat # AI translated Edit Cheat File = Ubah cheat file Import Cheats = Import dari cheat.db Import from %s = Import dari %s diff --git a/assets/lang/nl_NL.ini b/assets/lang/nl_NL.ini index 88bcc8d34c..aa0f2a678d 100644 --- a/assets/lang/nl_NL.ini +++ b/assets/lang/nl_NL.ini @@ -195,8 +195,10 @@ X = X Y = Y [CwCheats] +A cheat database already exists. Downloading a new one will overwrite it. = Een cheat-database bestaat al. Het downloaden van een nieuwe zal deze overschrijven. # AI translated Added %1 cheats for this game = Toegevoegd %1 cheats voor dit spel # AI translated Cheats = Cheats +Download cheat database = Download cheat-database # AI translated Edit Cheat File = Cheatbestand bewerken Import Cheats = Importeren van cheat.db Import from %s = Importeren van %s diff --git a/assets/lang/no_NO.ini b/assets/lang/no_NO.ini index e8027f7bed..7406157769 100644 --- a/assets/lang/no_NO.ini +++ b/assets/lang/no_NO.ini @@ -195,8 +195,10 @@ X = X Y = Y [CwCheats] +A cheat database already exists. Downloading a new one will overwrite it. = En juksedatabase finnes allerede. Nedlasting av en ny vil overskrive den. # AI translated Added %1 cheats for this game = Lagt til %1 jukse for dette spillet # AI translated Cheats = Cheats +Download cheat database = Last ned juksedatabase # AI translated Edit Cheat File = Edit cheat file Import Cheats = Import from cheat.db Import from %s = Import from %s diff --git a/assets/lang/pl_PL.ini b/assets/lang/pl_PL.ini index e73a4fc161..bde823aae0 100644 --- a/assets/lang/pl_PL.ini +++ b/assets/lang/pl_PL.ini @@ -195,8 +195,10 @@ X = X Y = Y [CwCheats] +A cheat database already exists. Downloading a new one will overwrite it. = Baza danych cheatu już istnieje. Pobranie nowej ją nadpisze. # AI translated Added %1 cheats for this game = Dodano %1 cheatów do tej gry # AI translated Cheats = Kody +Download cheat database = Pobierz bazę danych oszustw # AI translated Edit Cheat File = Edytuj plik kodów Import Cheats = Importuj z pliku cheat.db Import from %s = Importuj z pliku %s diff --git a/assets/lang/pt_BR.ini b/assets/lang/pt_BR.ini index 6828b263e7..ac7bf38811 100644 --- a/assets/lang/pt_BR.ini +++ b/assets/lang/pt_BR.ini @@ -219,8 +219,10 @@ X = X Y = Y [CwCheats] +A cheat database already exists. Downloading a new one will overwrite it. = Uma base de dados de cheats já existe. Baixar uma nova a substituirá. # AI translated Added %1 cheats for this game = Adicionou %1 trapaças pra este jogo Cheats = Trapaças +Download cheat database = Baixar banco de dados de trapaças # AI translated Edit Cheat File = Editar arquivo de trapaças Import Cheats = Importar do cheat.db Import from %s = Importar do %s diff --git a/assets/lang/pt_PT.ini b/assets/lang/pt_PT.ini index eccab803cb..27aa60d51a 100644 --- a/assets/lang/pt_PT.ini +++ b/assets/lang/pt_PT.ini @@ -219,8 +219,10 @@ X = X Y = Y [CwCheats] +A cheat database already exists. Downloading a new one will overwrite it. = Uma base de dados de cheats já existe. Baixar uma nova sobrescrevê-la-á. # AI translated Added %1 cheats for this game = Adicionados %1 cheats para este jogo # AI translated Cheats = Cheats +Download cheat database = Descarregar base de dados de truques # AI translated Edit Cheat File = Editar ficheiro de Cheats Import Cheats = Importar de cheat.db Import from %s = Importar de %s diff --git a/assets/lang/ro_RO.ini b/assets/lang/ro_RO.ini index eab7551128..7765f0686b 100644 --- a/assets/lang/ro_RO.ini +++ b/assets/lang/ro_RO.ini @@ -195,8 +195,10 @@ X = X Y = Y [CwCheats] +A cheat database already exists. Downloading a new one will overwrite it. = O bază de date cu cheats există deja. Descărcarea uneia noi o va suprascrie. # AI translated Added %1 cheats for this game = Adăugate %1 cheats pentru acest joc # AI translated Cheats = Trișare +Download cheat database = Descărcați baza de date pentru cheat-uri # AI translated Edit Cheat File = Editare fișier trișare Import Cheats = Importă din cheat.db #Import %s = Importă din %s diff --git a/assets/lang/ru_RU.ini b/assets/lang/ru_RU.ini index 71cd838971..54a78243be 100644 --- a/assets/lang/ru_RU.ini +++ b/assets/lang/ru_RU.ini @@ -195,8 +195,10 @@ X = X Y = Y [CwCheats] +A cheat database already exists. Downloading a new one will overwrite it. = База данных чит-кодов уже существует. Загрузка новой перезапишет её. # AI translated Added %1 cheats for this game = Добавлено %1 читов для этой игры Cheats = Читы +Download cheat database = Скачать базу данных читов # AI translated Edit Cheat File = Изменить файл чита Import Cheats = Импортировать из cheat.db Import from %s = Импортировать из %s diff --git a/assets/lang/sv_SE.ini b/assets/lang/sv_SE.ini index 9c037023f3..e1d6f67122 100644 --- a/assets/lang/sv_SE.ini +++ b/assets/lang/sv_SE.ini @@ -195,8 +195,10 @@ X = X Y = Y [CwCheats] +A cheat database already exists. Downloading a new one will overwrite it. = En fus database finns redan. Nedladdning av en ny kommer att skriva över den. # AI translated Added %1 cheats for this game = Lade till %1 fusk för det här spelet Cheats = Fusk +Download cheat database = Ladda ner fuskdatabas # AI translated Edit Cheat File = Redigera fuskfil Import Cheats = Importera från cheat.db Import from %s = Importera från %s diff --git a/assets/lang/tg_PH.ini b/assets/lang/tg_PH.ini index d767e717ab..ebc8fc4ad6 100644 --- a/assets/lang/tg_PH.ini +++ b/assets/lang/tg_PH.ini @@ -195,8 +195,10 @@ X = X Y = Y [CwCheats] +A cheat database already exists. Downloading a new one will overwrite it. = Маъхазаи хидоят аллакай мавҷуд аст. Иқтибос кардани нав онро иваз мекунад. # AI translated Added %1 cheats for this game = Эҳтимолҳои %1 барои ин бозӣ илова карда шуданд # AI translated Cheats = Mga Daya +Download cheat database = Загрузить базу данных для обмана # AI translated Edit Cheat File = I-edit ang Cheat File Import Cheats = I-import ang mga daya mula sa cheat.db Import from %s = I-Import ang mga daya mula sa %s diff --git a/assets/lang/th_TH.ini b/assets/lang/th_TH.ini index 2b2cacc97e..c421c06019 100644 --- a/assets/lang/th_TH.ini +++ b/assets/lang/th_TH.ini @@ -195,8 +195,10 @@ X = แกน X Y = แกน Y [CwCheats] +A cheat database already exists. Downloading a new one will overwrite it. = ฐานข้อมูลการโกงมีอยู่แล้ว การดาวน์โหลดใหม่จะเขียนทับมัน. # AI translated Added %1 cheats for this game = เพิ่ม %1 สูตรโกงสำหรับเกมนี้ Cheats = การใช้สูตรโกง +Download cheat database = ดาวน์โหลดฐานข้อมูลโกง # AI translated Edit Cheat File = ปรับแต่งไฟล์สูตรโกง Import Cheats = นำเข้าจากไฟล์สูตรโกง Import from %s = นำเข้าจาก %s diff --git a/assets/lang/tr_TR.ini b/assets/lang/tr_TR.ini index 5ccc123f34..66a379b7ee 100644 --- a/assets/lang/tr_TR.ini +++ b/assets/lang/tr_TR.ini @@ -195,8 +195,10 @@ X = X Y = Y [CwCheats] +A cheat database already exists. Downloading a new one will overwrite it. = Bir hile veritabanı zaten var. Yeni bir indirmek onu üzerine yazacaktır. # AI translated Added %1 cheats for this game = Bu oyun için %1 hile eklendi # AI translated Cheats = Hileler +Download cheat database = Hile veritabanını indir # AI translated Edit Cheat File = Hile Dosyası Düzenle Import Cheats = Hileleri İçe Aktar Import from %s = Şuradan Aktar %s diff --git a/assets/lang/uk_UA.ini b/assets/lang/uk_UA.ini index bb0a2a2c17..eda0d05ed8 100644 --- a/assets/lang/uk_UA.ini +++ b/assets/lang/uk_UA.ini @@ -195,8 +195,10 @@ X = X Y = Y [CwCheats] +A cheat database already exists. Downloading a new one will overwrite it. = База даних читів вже існує. Завантаження нової перепише її. # AI translated Added %1 cheats for this game = Додано %1 читів для цієї гри # AI translated Cheats = Чіт-коди +Download cheat database = Скачати базу даних чітів # AI translated Edit Cheat File = Змінити файл чіт-коду Import Cheats = Імпортувати з cheat.db Import from %s = Імпортувати з %s diff --git a/assets/lang/vi_VN.ini b/assets/lang/vi_VN.ini index 78df78aee9..11873c79bd 100644 --- a/assets/lang/vi_VN.ini +++ b/assets/lang/vi_VN.ini @@ -195,8 +195,10 @@ X = X Y = Y [CwCheats] +A cheat database already exists. Downloading a new one will overwrite it. = Một cơ sở dữ liệu gian lận đã tồn tại. Tải xuống một cái mới sẽ ghi đè nó. # AI translated Added %1 cheats for this game = Đã thêm %1 mã gian lận cho trò chơi này # AI translated Cheats = Cheats +Download cheat database = Tải về cơ sở dữ liệu cheat # AI translated Edit Cheat File = Sửa mục cheat Import Cheats = Nhập mã từ cheat.db Import from %s = Nhập mã từ %s diff --git a/assets/lang/zh_CN.ini b/assets/lang/zh_CN.ini index 5498eb00cf..efed768b1f 100644 --- a/assets/lang/zh_CN.ini +++ b/assets/lang/zh_CN.ini @@ -195,8 +195,10 @@ X = X Y = Y [CwCheats] +A cheat database already exists. Downloading a new one will overwrite it. = 作弊数据库已经存在。下载新版本将覆盖它。 # AI translated Added %1 cheats for this game = 为此游戏添加了 %1 作弊码 # AI translated Cheats = 金手指 +Download cheat database = 下载作弊数据库 # AI translated Edit Cheat File = 编辑金手指文件 Import Cheats = 从cheat.db导入 Import from %s = 从%s导入 diff --git a/assets/lang/zh_TW.ini b/assets/lang/zh_TW.ini index 937b29b3ed..46c4c1d391 100644 --- a/assets/lang/zh_TW.ini +++ b/assets/lang/zh_TW.ini @@ -195,8 +195,10 @@ X = X Y = Y [CwCheats] +A cheat database already exists. Downloading a new one will overwrite it. = 作弊數據庫已經存在。下載新的將覆蓋它。 # AI translated Added %1 cheats for this game = 為此遊戲添加了 %1 作弊碼 # AI translated Cheats = 密技 +Download cheat database = 下載作弊資料庫 # AI translated Edit Cheat File = 編輯密技檔案 Import Cheats = 從 cheat.db 匯入 Import from %s = 從 %s 匯入 diff --git a/assets/ui_images/images.svg b/assets/ui_images/images.svg index 8b1ecbdcb3..13b8100a8d 100644 --- a/assets/ui_images/images.svg +++ b/assets/ui_images/images.svg @@ -23,9 +23,9 @@ inkscape:pagecheckerboard="true" inkscape:deskcolor="#d1d1d1" inkscape:document-units="px" - inkscape:zoom="4" - inkscape:cx="361.75" - inkscape:cy="499.625" + inkscape:zoom="5.6568542" + inkscape:cx="331.63308" + inkscape:cy="448.74764" inkscape:window-width="3840" inkscape:window-height="2071" inkscape:window-x="-9" @@ -125,7 +125,7 @@ transform="matrix(0.51483133,0,0,0.48865723,85.611849,129.89633)" aria-label="SD" />