fix(libSceNpCommerce): open sceNpCommerceDialogOpen2 as prosper does

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
NikoandClaude Opus 5.5 authored and Dean Galvin committed 2026-10-15 07:39:34 +13:00
1 parent 2b4cb387aa
commit 68bddf8083
3 files changed
+34 -51

No files matched your search

+1 -3
View File
@@ -79,9 +79,7 @@ int APS5_VABI sceNpCommerceSetPsStoreIconLayout(int layout) {
return 0;
}
int APS5_VABI sceNpCommerceDialogOpen2(const void* param) {
(void)param;
if (g_status == COMMON_DIALOG_STATUS_NONE) return COMMON_DIALOG_ERROR_NOT_INITIALIZED;
int APS5_VABI sceNpCommerceDialogOpen2(void) {
g_status = COMMON_DIALOG_STATUS_FINISHED;
return 0;
}
+32 -47
View File
@@ -2,78 +2,63 @@
#include <cstdint>
#include <cstdlib>
#include <cstring>
extern "C" {
int APS5_VABI sceNpCommerceDialogInitialize();
int APS5_VABI sceNpCommerceDialogOpen(const void* param);
int APS5_VABI sceNpCommerceDialogOpen2(void);
int APS5_VABI sceNpCommerceDialogUpdateStatus(void);
int APS5_VABI sceNpCommerceDialogGetStatus(void);
int APS5_VABI sceNpCommerceDialogGetResult(void* result);
int APS5_VABI sceNpCommerceDialogClose(void);
int APS5_VABI sceNpCommerceDialogTerminate();
int APS5_VABI sceNpCommerceHidePsStoreIcon(void);
int APS5_VABI sceNpCommerceShowPsStoreIcon(int pos);
int APS5_VABI sceNpCommerceSetPsStoreIconLayout(int layout);
int APS5_VABI sceNpCommerceDialogOpen2(const void* param);
}
static void Require(bool condition) {
if (!condition) {
std::abort();
}
namespace {
void Require(bool value) { if (!value) std::abort(); }
constexpr int statusNone = 0;
constexpr int statusInitialized = 1;
constexpr int statusFinished = 3;
constexpr std::int32_t resultUserCanceled = 1;
void RequireCanceledResult() {
std::uint8_t result[0x20];
std::memset(result, 0x33, sizeof(result));
Require(sceNpCommerceDialogGetResult(result) == 0);
std::int32_t value = 0;
std::memcpy(&value, result, sizeof(value));
Require(value == resultUserCanceled);
Require(result[4] == 0);
Require(result[5] == 0x33);
}
}
int main() {
constexpr int statusNone = 0;
constexpr int statusInitialized = 1;
constexpr int statusFinished = 3;
constexpr int resultUserCanceled = 1;
constexpr int errorNotInitialized = static_cast<int>(0x80B80003u);
constexpr int errorAlreadyInitialized = static_cast<int>(0x80B80004u);
constexpr int errorNotFinished = static_cast<int>(0x80B80006u);
constexpr int errorArgNull = static_cast<int>(0x80B80009u);
struct DialogResult {
std::int32_t result;
std::uint8_t authorized;
};
Require(sceNpCommerceDialogGetStatus() == statusNone);
Require(sceNpCommerceDialogUpdateStatus() == statusNone);
Require(sceNpCommerceDialogOpen(nullptr) == errorNotInitialized);
Require(sceNpCommerceDialogOpen2(nullptr) == errorNotInitialized);
Require(sceNpCommerceDialogClose() == errorNotInitialized);
DialogResult dialogResult{};
Require(sceNpCommerceDialogGetResult(&dialogResult) == errorNotFinished);
Require(sceNpCommerceDialogInitialize() == 0);
Require(sceNpCommerceDialogInitialize() == errorAlreadyInitialized);
Require(sceNpCommerceDialogGetStatus() == statusInitialized);
Require(sceNpCommerceDialogOpen(nullptr) == errorArgNull);
Require(sceNpCommerceDialogOpen2(nullptr) == 0);
Require(sceNpCommerceDialogGetStatus() == statusFinished);
Require(sceNpCommerceDialogOpen2() == 0);
Require(sceNpCommerceDialogUpdateStatus() == statusFinished);
Require(sceNpCommerceDialogGetResult(nullptr) == errorArgNull);
Require(sceNpCommerceDialogGetResult(&dialogResult) == 0);
Require(dialogResult.result == resultUserCanceled);
Require(dialogResult.authorized == 0);
Require(sceNpCommerceDialogGetStatus() == statusFinished);
RequireCanceledResult();
Require(sceNpCommerceDialogClose() == 0);
Require(sceNpCommerceDialogGetStatus() == statusFinished);
Require(sceNpCommerceDialogTerminate() == 0);
Require(sceNpCommerceDialogGetStatus() == statusNone);
alignas(8) char param[16] = {};
alignas(8) std::uint8_t param[0x40] = {};
Require(sceNpCommerceDialogInitialize() == 0);
Require(sceNpCommerceDialogOpen2(param) == 0);
Require(sceNpCommerceDialogGetStatus() == statusFinished);
Require(sceNpCommerceDialogOpen(param) == 0);
Require(sceNpCommerceDialogOpen2() == 0);
Require(sceNpCommerceDialogUpdateStatus() == statusFinished);
RequireCanceledResult();
Require(sceNpCommerceDialogTerminate() == 0);
Require(sceNpCommerceHidePsStoreIcon() == 0);
Require(sceNpCommerceShowPsStoreIcon(0) == 0);
Require(sceNpCommerceSetPsStoreIconLayout(0) == 0);
Require(sceNpCommerceDialogGetStatus() == statusNone);
return 0;
}
+1 -1
View File
@@ -6,4 +6,4 @@
### Unknown function info
- [sceNpCommerceDialogOpen2](../../../core/libs/prx/libSceNpCommerce/Export.cpp) (libSceNpCommerce) - inferred signature follows `sceNpCommerceDialogOpen(const void*)`; accepts null or zero parameters and finishes as cancelled like the sibling call
- [sceNpCommerceDialogOpen2](../../../core/libs/prx/libSceNpCommerce/Export.cpp) (libSceNpCommerce) - declared without parameters; follows [prosper](https://github.com/mattias800/prosper/blob/73413cb445b0364bb49c4d2478e9ee1614b9f7d9/prosper/src/hle/np/np.cpp#L500-L504), which serves it with its `sceNpCommerceDialogOpen` handler: every argument is ignored, nothing is validated, it returns 0 and the dialog finishes at once, so `sceNpCommerceDialogGetResult` reports it cancelled. The parameters and the console's error results are unknown. Call of Duty: Black Ops (PPSA34501) calls it at Zombies > Online