diff --git a/README.md b/README.md index 712f8b248..2f263fb19 100755 --- a/README.md +++ b/README.md @@ -5,23 +5,21 @@ ## Introduction -Vita3K is an experimental PlayStation Vita emulator for Windows, Linux, macOS and [Android](https://github.com/Vita3K/Vita3K-Android). +Vita3K is an experimental PlayStation Vita emulator for Windows, Linux, macOS and Android. * [Website](https://vita3k.org/) (information for users) * [Wiki](https://github.com/Vita3K/Vita3K/wiki) (information for developers) -* [**Discord**](https://discord.gg/MaWhJVH) (recommended) -* IRC `#vita3k` on **freenode** ([Web-based IRC client](https://webchat.freenode.net/?channels=%23vita3k)) -* [Patreon](https://www.patreon.com/Vita3K) (support the project) - -You can view the Android version [here](https://github.com/Vita3K/Vita3K-Android). +* [Discord server](https://discord.gg/MaWhJVH) (recommended) ## Compatibility -The emulator currently runs most homebrew programs. It is also able to load some decrypted commercial games. +The emulator currently runs most homebrew programs. It is also able to load some commercial games. - [Homebrew compatibility page](https://vita3k.org/compatibility-homebrew.html) - [Commercial compatibility page](https://vita3k.org/compatibility.html) +## Gallery + | **Persona 4 Golden** by Atlus | **A Rose in the Twilight** by Nippon Ichi Software | | :-----------------------------------------------------------: | :--------------------------------------------------------------------------------------------: | | ![Persona 4 Golden screenshot](./_readme/screenshots/P4G.png) | ![A Rose in the Twilight screenshot](./_readme/screenshots/A%20Rose%20in%20the%20Twilight.png) | @@ -34,7 +32,7 @@ The emulator currently runs most homebrew programs. It is also able to load some | :----------------------------------------------------------------: | :------------------------------------------------------------------------: | | ![Fruit Ninja Screenshot](./_readme/screenshots/Fruit%20Ninja.png) | ![Jetpack Joyride Screenshot](./_readme/screenshots/Jetpack%20Joyride.png) | -## Licence +## License Vita3K is licensed under the **GPLv2** license. This is largely dictated by external dependencies, most notably Unicorn. @@ -49,6 +47,8 @@ Vita3K is licensed under the **GPLv2** license. This is largely dictated by exte * [vita3k-git](https://aur.archlinux.org/packages/vita3k-git)AUR * Requirements: * xdg-desktop-portal +* [Android](https://github.com/Vita3K/Vita3K-Android/releases/) + * [Adreno drivers](https://github.com/K11MCH1/AdrenoToolsDrivers/releases/) * Others * [Download Artifact](https://github.com/Vita3K/Vita3K/actions?query=event%3Apush+is%3Asuccess+branch%3Amaster) @@ -57,26 +57,17 @@ Vita3K is licensed under the **GPLv2** license. This is largely dictated by exte Please see [`building.md`](./building.md). ## Running -Specify the path to a .vpk file as the first command line argument, or run `Vita3K --help` from the command-line for a full list of options. -For more detailed instructions on running/installing games on all platforms, please read the **#info-faq** channel on our [Discord Server](https://discord.gg/MaWhJVH). +Look through the app list and click on the app you would like to run and click the start button. + +For more detailed instructions on running/installing apps on Vita3K, please read the **#info-faq** channel on our [Discord Server](https://discord.gg/MaWhJVH). ## Bugs and issues -The project is in an early stage, so please be sensitive to that when opening new issues. Expect crashes, glitches, low compatibility and poor performance. +The project is in an early stage, so please be mindful when opening new issues. Expect crashes, glitches, low compatibility and poor performance. ## Thanks -Thanks go out to people who offered advice or otherwise made this project possible, such as Davee, korruptor, Rinnegatamante, ScHlAuChi, Simon Kilroy, TheFlow, xerpi, xyz, Yifan Lu and many others. - -## Donations -If you would like to show your appreciation or help fund development, the project has a [Patreon](https://www.patreon.com/Vita3K) page. - -## Supporters -Thank you to the following supporters: -* Mored1984 -* soiaf - -If you support us on Patreon and would like your name added, please get in touch or open a Pull Request. +Thanks go out to the developer team and [everyone who has contributed](https://github.com/Vita3K/Vita3K/graphs/contributors). These are people like petmac, frangarcj, VelocityRa, 1whatleytay, EXtremeExploit, HolyMcDiver, HorrorTroll, IllusionMan1212, KorewaWatchful, scribam, sunho, wfscans, Macdu, bookmist and pent0. ## Note -The purpose of this emulator is not to enable illegal activity. You can dump games by using [NoNpDrm](https://github.com/TheOfficialFloW/NoNpDrm)/[FAGDec](https://github.com/CelesteBlue-dev/PSVita-RE-tools/tree/master/FAGDec/build). You can get homebrew programs from [VitaDB](https://vitadb.rinnegatamante.it/). +The purpose of this emulator is not to enable illegal activity. You can dump games from a Vita by using [NoNpDrm](https://github.com/TheOfficialFloW/NoNpDrm) or [FAGDec](https://github.com/CelesteBlue-dev/PSVita-RE-tools/tree/master/FAGDec/build). You can get homebrew programs from [VitaDB](https://vitadb.rinnegatamante.it/). -PlayStation and PlayStation Vita are trademarks of Sony Interactive Entertainment Inc. This emulator is not related to or endorsed by Sony, or derived from confidential materials belonging to Sony. +PlayStation, PlayStation Vita and PlayStation Network are all registered trademarks of Sony Interactive Entertainment Inc. This emulator is not related to or endorsed by Sony, or derived from confidential materials belonging to Sony. diff --git a/_readme/screenshots/VitaTester.png b/_readme/screenshots/VitaTester.png deleted file mode 100644 index 42d16067e..000000000 Binary files a/_readme/screenshots/VitaTester.png and /dev/null differ diff --git a/_readme/screenshots/vitaQuake.png b/_readme/screenshots/vitaQuake.png deleted file mode 100644 index 38fcb4bce..000000000 Binary files a/_readme/screenshots/vitaQuake.png and /dev/null differ diff --git a/lang/en-gb.xml b/lang/en-gb.xml index 50f9ec830..d30c6ccb5 100644 --- a/lang/en-gb.xml +++ b/lang/en-gb.xml @@ -57,7 +57,7 @@ Version {} Information This application and all related data, including saved data, will be deleted. - Deleting a application may take a while + Deleting an application may take a while depending on its size and your hardware. Do you want to delete this add-on data? Do you want to delete this license? diff --git a/lang/en.xml b/lang/en.xml index 50f9ec830..d30c6ccb5 100644 --- a/lang/en.xml +++ b/lang/en.xml @@ -57,7 +57,7 @@ Version {} Information This application and all related data, including saved data, will be deleted. - Deleting a application may take a while + Deleting an application may take a while depending on its size and your hardware. Do you want to delete this add-on data? Do you want to delete this license? diff --git a/vita3k/app/src/app_init.cpp b/vita3k/app/src/app_init.cpp index 8fd998770..b23f4aae9 100644 --- a/vita3k/app/src/app_init.cpp +++ b/vita3k/app/src/app_init.cpp @@ -190,7 +190,7 @@ bool init(EmuEnvState &state, Config &cfg, const Root &root_paths) { break; case renderer::Backend::Vulkan: - error_dialog("Could not create Vulkan context!"); + error_dialog("Could not create Vulkan context!\nDoes your device support Vulkan?"); break; default: @@ -210,7 +210,7 @@ bool init(EmuEnvState &state, Config &cfg, const Root &root_paths) { LOG_CRITICAL("Unicorn backend is not supported with a page table"); if (!state.audio.init(resume_thread, state.cfg.audio_backend)) { - LOG_WARN("Failed to init audio! Audio will not work."); + LOG_WARN("Failed to initialize audio! Audio will not work."); } if (!init(state.io, state.base_path, state.pref_path, state.cfg.console)) { diff --git a/vita3k/app/src/discord.cpp b/vita3k/app/src/discord.cpp index b212a3f29..0bb8f78e7 100644 --- a/vita3k/app/src/discord.cpp +++ b/vita3k/app/src/discord.cpp @@ -78,7 +78,7 @@ void update_presence(const std::string &state, const std::string &details, bool } discord_state.core->ActivityManager().UpdateActivity(activity, [](discord::Result result) { if (result != discord::Result::Ok) { - LOG_ERROR("Error updating discord rich presence, err_code: {}", static_cast(result)); + LOG_ERROR("Error updating Discord Rich Presence, err_code: {}", static_cast(result)); } }); } diff --git a/vita3k/audio/src/audio.cpp b/vita3k/audio/src/audio.cpp index 5f32e3022..609d31751 100644 --- a/vita3k/audio/src/audio.cpp +++ b/vita3k/audio/src/audio.cpp @@ -105,7 +105,7 @@ void AudioState::set_backend(const std::string &adapter_name) { } else if (adapter_name == "Cubeb") { adapter = std::make_unique(*this); } else { - LOG_ERROR("Unkown audio adapter {}", adapter_name); + LOG_ERROR("Unknown audio adapter {}", adapter_name); return; } this->audio_backend = adapter_name; diff --git a/vita3k/codec/src/atrac9.cpp b/vita3k/codec/src/atrac9.cpp index 3c63e68c8..fc1cc1204 100644 --- a/vita3k/codec/src/atrac9.cpp +++ b/vita3k/codec/src/atrac9.cpp @@ -72,7 +72,7 @@ bool Atrac9DecoderState::send(const uint8_t *data, uint32_t size) { const int res = Atrac9Decode(decoder_handle, data, reinterpret_cast(result.data()), &decode_used); if (res != At9Status::ERR_SUCCESS) { - LOG_ERROR("Decode failure with code {}!", res); + LOG_ERROR("Decode failure with code {}", res); return false; } @@ -109,7 +109,7 @@ Atrac9DecoderState::Atrac9DecoderState(uint32_t config_data) const int err = Atrac9InitDecoder(decoder_handle, reinterpret_cast(&config_data)); if (err != At9Status::ERR_SUCCESS) { - LOG_ERROR("Error initializing decoder!"); + LOG_ERROR("Error initializing decoder"); } Atrac9CodecInfo *info = new Atrac9CodecInfo; diff --git a/vita3k/compat/src/compat.cpp b/vita3k/compat/src/compat.cpp index d024eb3f5..19e96a289 100644 --- a/vita3k/compat/src/compat.cpp +++ b/vita3k/compat/src/compat.cpp @@ -76,7 +76,7 @@ bool load_compat_app_db(GuiState &gui, EmuEnvState &emuenv) { // Check if title ID is valid if ((title_id.find("PCS") == std::string::npos) && (title_id != "NPXS10007")) { - LOG_WARN("title ID {} is invalid. Please check GitHub issue {} and verify it!", title_id, issue_id); + LOG_WARN("Title ID {} is invalid. Please check GitHub issue {} and verify it!", title_id, issue_id); continue; } @@ -101,7 +101,7 @@ bool load_compat_app_db(GuiState &gui, EmuEnvState &emuenv) { // Check if app missing a status label if (state == UNKNOWN) - LOG_WARN("App with title ID {} has an issue but no status label. Please check GitHub issue {} and request a status label to be added.", title_id, issue_id); + LOG_WARN("App with Title ID {} has an issue but no status label. Please check GitHub issue {} and request a status label be added.", title_id, issue_id); // Check if app already exists in compatibility database if (gui.compat.app_compat_db.contains(title_id)) @@ -129,7 +129,7 @@ bool update_compat_app_db(GuiState &gui, EmuEnvState &emuenv) { const auto updated_at = https::get_web_regex_result(latest_link, std::regex("Updated at: (\\d{2}-\\d{2}-\\d{4} \\d{2}:\\d{2}:\\d{2})")); if (updated_at.empty()) { gui.info_message.level = spdlog::level::err; - gui.info_message.msg = "Failed to get current compatibility database updated at, check firewall/internet access, try again later."; + gui.info_message.msg = "Failed to get current compatibility database, check firewall/internet access, try again later."; return false; } diff --git a/vita3k/config/src/config.cpp b/vita3k/config/src/config.cpp index b4a7f3e10..8a2cf88e9 100644 --- a/vita3k/config/src/config.cpp +++ b/vita3k/config/src/config.cpp @@ -67,7 +67,7 @@ static fs::path check_path(const fs::path &output_path) { static ExitCode parse(Config &cfg, const fs::path &load_path, const fs::path &root_pref_path) { const auto loaded_path = check_path(load_path); if (loaded_path.empty() || !fs::exists(loaded_path)) { - LOG_ERROR("Config file input path invalid (did you make sure to name the extension \".yml\"?)"); + LOG_ERROR("Config file input path invalid (did you name the extension \".yml\"?)"); return FileNotFound; } @@ -232,7 +232,7 @@ ExitCode init_config(Config &cfg, int argc, char **argv, const Root &root_paths) } if (cfg.console && (cfg.run_app_path || !cfg.content_path)) { - LOG_ERROR("Console mode only supports vpk for now"); + LOG_ERROR("Command line version only supports .vpk for now."); return InitConfigFailed; } diff --git a/vita3k/cpu/src/dynarmic_cpu.cpp b/vita3k/cpu/src/dynarmic_cpu.cpp index d22b2d254..1a29aa3e0 100644 --- a/vita3k/cpu/src/dynarmic_cpu.cpp +++ b/vita3k/cpu/src/dynarmic_cpu.cpp @@ -101,7 +101,7 @@ public: std::optional MemoryReadCode(Dynarmic::A32::VAddr addr) override { if (cpu->log_mem) - LOG_TRACE("Instruction fetch at addr 0x{:X}", addr); + LOG_TRACE("Instruction fetch at address 0x{:X}", addr); return MemoryRead32(addr); } @@ -273,21 +273,21 @@ public: case Dynarmic::A32::Exception::Yield: break; case Dynarmic::A32::Exception::UndefinedInstruction: - LOG_WARN("Undefined instruction at addr 0x{:X}, inst 0x{:X} ({})", pc, MemoryReadCode(pc).value(), disassemble(*parent, pc, nullptr)); + LOG_WARN("Undefined instruction at address 0x{:X}, instruction 0x{:X} ({})", pc, MemoryReadCode(pc).value(), disassemble(*parent, pc, nullptr)); InterpreterFallback(pc, 1); break; case Dynarmic::A32::Exception::UnpredictableInstruction: - LOG_WARN("Unpredictable instruction at addr 0x{:X}, inst 0x{:X} ({})", pc, MemoryReadCode(pc).value(), disassemble(*parent, pc, nullptr)); + LOG_WARN("Unpredictable instruction at address 0x{:X}, instruction 0x{:X} ({})", pc, MemoryReadCode(pc).value(), disassemble(*parent, pc, nullptr)); InterpreterFallback(pc, 1); break; case Dynarmic::A32::Exception::DecodeError: { - LOG_WARN("Decode error at addr 0x{:X}, inst 0x{:X} ({})", pc, MemoryReadCode(pc).value(), disassemble(*parent, pc, nullptr)); + LOG_WARN("Decode error at address 0x{:X}, instruction 0x{:X} ({})", pc, MemoryReadCode(pc).value(), disassemble(*parent, pc, nullptr)); InterpreterFallback(pc, 1); break; } default: LOG_WARN("Unknown exception {} Raised at pc = 0x{:x}", static_cast(exception), pc); - LOG_TRACE("at addr 0x{:X}, inst 0x{:X} ({})", pc, MemoryReadCode(pc).value(), disassemble(*parent, pc, nullptr)); + LOG_TRACE("at address 0x{:X}, instruction 0x{:X} ({})", pc, MemoryReadCode(pc).value(), disassemble(*parent, pc, nullptr)); } } diff --git a/vita3k/gdbstub/src/gdb.cpp b/vita3k/gdbstub/src/gdb.cpp index 62b8891a6..ab03d82df 100644 --- a/vita3k/gdbstub/src/gdb.cpp +++ b/vita3k/gdbstub/src/gdb.cpp @@ -453,7 +453,7 @@ static std::string cmd_continue(EmuEnvState &state, PacketCommand &command) { } if (!step) { - // resume the worlld + // resume the world { auto lock = std::unique_lock(state.kernel.mutex); for (const auto &pair : state.kernel.threads) { @@ -489,7 +489,7 @@ static std::string cmd_continue(EmuEnvState &state, PacketCommand &command) { } auto thread = state.kernel.get_thread(state.gdb.inferior_thread); - LOG_INFO("GDB Breakpoint triger (thread name: {}, thread_id: {})", thread->name, thread->id); + LOG_INFO("GDB Breakpoint trigger (thread name: {}, thread_id: {})", thread->name, thread->id); LOG_INFO("PC: {} LR: {}", read_pc(*thread->cpu), read_lr(*thread->cpu)); LOG_INFO("{}", thread->log_stack_traceback(state.kernel)); @@ -840,4 +840,4 @@ void server_close(EmuEnvState &state) { state.gdb.server_die = true; if (state.gdb.server_thread && state.gdb.server_thread->get_id() != std::this_thread::get_id()) state.gdb.server_thread->join(); -} \ No newline at end of file +} diff --git a/vita3k/gui/src/about_dialog.cpp b/vita3k/gui/src/about_dialog.cpp index 09380287a..cf3899ee9 100644 --- a/vita3k/gui/src/about_dialog.cpp +++ b/vita3k/gui/src/about_dialog.cpp @@ -72,7 +72,7 @@ void draw_about_dialog(GuiState &gui, EmuEnvState &emuenv) { ImGui::Text("%s", lang["github_website"].c_str()); if (ImGui::Button("GitHub")) - open_path("https://github.com/vita3k/vita3k"); + open_path("https://github.com/Vita3K/Vita3K"); ImGui::Spacing(); ImGui::Text("%s", lang["vita3k_website"].c_str()); diff --git a/vita3k/gui/src/app_context_menu.cpp b/vita3k/gui/src/app_context_menu.cpp index 3c950d6fb..8575eefa6 100644 --- a/vita3k/gui/src/app_context_menu.cpp +++ b/vita3k/gui/src/app_context_menu.cpp @@ -483,7 +483,7 @@ void draw_app_context_menu(GuiState &gui, EmuEnvState &emuenv, const std::string if (get_update_history(gui, emuenv, app_path)) context_dialog = "history"; else - LOG_WARN("Patch note Error for title id: {} in path: {}", title_id, app_path); + LOG_WARN("Patch note Error for Title ID {} in path {}", title_id, app_path); } } if (ImGui::MenuItem(lang["information"].c_str(), nullptr, &gui.vita_area.app_information)) { diff --git a/vita3k/lang/include/lang/state.h b/vita3k/lang/include/lang/state.h index 5f6a378d6..8ea19d7fd 100644 --- a/vita3k/lang/include/lang/state.h +++ b/vita3k/lang/include/lang/state.h @@ -154,7 +154,7 @@ struct LangState { { "history_version", "Version {}" }, { "information", "Information" }, { "app_delete", "This application and all related data, including saved data, will be deleted." }, - { "app_delete_note", "Deleting a application may take a while\ndepending on its size and your hardware." }, + { "app_delete_note", "Deleting an application may take a while\ndepending on its size and your hardware." }, { "addcont_delete", "Do you want to delete this add-on data?" }, { "license_delete", "Do you want to delete this license?" }, { "save_delete", "Do you want to delete this saved data?" },