This commit is contained in:
CoffeeBrewer64 2023-04-06 22:04:05 +01:00 committed by GitHub
parent e395624811
commit 75a6bf0d86
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
16 changed files with 39 additions and 48 deletions

View file

@ -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)<sup><small>AUR</small></sup>
* 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.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 140 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 659 KiB

View file

@ -57,7 +57,7 @@
<history_version>Version {}</history_version>
<information>Information</information>
<app_delete>This application and all related data, including saved data, will be deleted.</app_delete>
<app_delete_note>Deleting a application may take a while
<app_delete_note>Deleting an application may take a while
depending on its size and your hardware.</app_delete_note>
<addcont_delete>Do you want to delete this add-on data?</addcont_delete>
<license_delete>Do you want to delete this license?</license_delete>

View file

@ -57,7 +57,7 @@
<history_version>Version {}</history_version>
<information>Information</information>
<app_delete>This application and all related data, including saved data, will be deleted.</app_delete>
<app_delete_note>Deleting a application may take a while
<app_delete_note>Deleting an application may take a while
depending on its size and your hardware.</app_delete_note>
<addcont_delete>Do you want to delete this add-on data?</addcont_delete>
<license_delete>Do you want to delete this license?</license_delete>

View file

@ -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)) {

View file

@ -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<int>(result));
LOG_ERROR("Error updating Discord Rich Presence, err_code: {}", static_cast<int>(result));
}
});
}

View file

@ -105,7 +105,7 @@ void AudioState::set_backend(const std::string &adapter_name) {
} else if (adapter_name == "Cubeb") {
adapter = std::make_unique<CubebAudioAdapter>(*this);
} else {
LOG_ERROR("Unkown audio adapter {}", adapter_name);
LOG_ERROR("Unknown audio adapter {}", adapter_name);
return;
}
this->audio_backend = adapter_name;

View file

@ -72,7 +72,7 @@ bool Atrac9DecoderState::send(const uint8_t *data, uint32_t size) {
const int res = Atrac9Decode(decoder_handle, data, reinterpret_cast<short *>(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<uint8_t *>(&config_data));
if (err != At9Status::ERR_SUCCESS) {
LOG_ERROR("Error initializing decoder!");
LOG_ERROR("Error initializing decoder");
}
Atrac9CodecInfo *info = new Atrac9CodecInfo;

View file

@ -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;
}

View file

@ -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;
}

View file

@ -101,7 +101,7 @@ public:
std::optional<std::uint32_t> 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<size_t>(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));
}
}

View file

@ -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();
}
}

View file

@ -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());

View file

@ -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)) {

View file

@ -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?" },