#include "prx/libc/include/general/VabiMacros.hpp" #include #include #include #include "prx/libSceCommonDialog/CommonDialog.hpp" #include "prx/libSceUserService/UserService.hpp" extern "C" { int APS5_VABI sceUserServiceInitialize(const UserServiceInitParam* param); int APS5_VABI sceUserServiceTerminate(); int APS5_VABI scePlayerSelectionDialogInitialize(void); int APS5_VABI scePlayerSelectionDialogOpen(const PlayerSelectionDialogParam* param); int APS5_VABI scePlayerSelectionDialogUpdateStatus(void); int APS5_VABI scePlayerSelectionDialogGetStatus(void); int APS5_VABI scePlayerSelectionDialogGetResult(PlayerSelectionDialogResult* result); int APS5_VABI scePlayerSelectionDialogParamInitialize(void* param); int APS5_VABI scePlayerSelectionDialogClose(void); int APS5_VABI scePlayerSelectionDialogTerminate(void); } namespace { void Require(bool value) { if (!value) std::abort(); } constexpr int kStatusFinished = 3; constexpr int kErrNotInitialized = static_cast(0x80B80003); constexpr int kErrAlreadyInitialized = static_cast(0x80B80004); constexpr int kErrNotFinished = static_cast(0x80B80005); constexpr int kErrArgNull = static_cast(0x80B8000D); constexpr int kResultUserCanceled = 1; } int main() { Require(sceUserServiceInitialize(nullptr) == 0); PlayerSelectionDialogParam param{}; param.base.size = sizeof(param.base); param.base.magic = static_cast(reinterpret_cast(¶m)) - 1060003575u; param.size = sizeof(param); param.userId = USER_SERVICE_INITIAL_USER_ID; PlayerSelectionDialogResult result{-1, 99, nullptr, 77, 55}; Require(scePlayerSelectionDialogTerminate() == kErrNotInitialized); Require(scePlayerSelectionDialogOpen(¶m) == kErrNotInitialized); Require(scePlayerSelectionDialogClose() == kErrNotInitialized); Require(scePlayerSelectionDialogParamInitialize(nullptr) == kErrArgNull); bool threw = false; try { scePlayerSelectionDialogParamInitialize(¶m); } catch (const std::runtime_error&) { threw = true; } Require(threw); Require(param.size == sizeof(param)); Require(scePlayerSelectionDialogGetResult(&result) == kErrNotInitialized); Require(scePlayerSelectionDialogGetStatus() == 0); Require(scePlayerSelectionDialogUpdateStatus() == 0); Require(scePlayerSelectionDialogInitialize() == 0); Require(scePlayerSelectionDialogInitialize() == kErrAlreadyInitialized); Require(scePlayerSelectionDialogGetStatus() == 1); Require(scePlayerSelectionDialogUpdateStatus() == 1); Require(scePlayerSelectionDialogOpen(nullptr) == kErrArgNull); Require(scePlayerSelectionDialogGetResult(&result) == kErrNotFinished); param.size = 0; Require(scePlayerSelectionDialogOpen(¶m) == static_cast(0x80B8000Au)); param.size = sizeof(param); param.maxPlayers = 257; Require(scePlayerSelectionDialogOpen(¶m) == static_cast(0x80B8000Au)); param.maxPlayers = 1; param.mode = 4; Require(scePlayerSelectionDialogOpen(¶m) == static_cast(0x80B8000Au)); param.mode = 0; param.playerCount = 1; Require(scePlayerSelectionDialogOpen(¶m) == static_cast(0x80B8000Au)); PlayerSelectionDialogPlayer player{}; param.players = &player; Require(scePlayerSelectionDialogOpen(¶m) == static_cast(0x80B8000Au)); player.accountId = 1; player.option0 = 1; Require(scePlayerSelectionDialogOpen(¶m) == static_cast(0x80B8000Au)); param.maxPlayers = 2; player.option1 = 2; Require(scePlayerSelectionDialogOpen(¶m) == static_cast(0x80B8000Au)); player.option1 = 1; player.mode = 3; Require(scePlayerSelectionDialogOpen(¶m) == static_cast(0x80B8000Au)); player.mode = 2; player.reserved[63] = 1; Require(scePlayerSelectionDialogOpen(¶m) == static_cast(0x80B8000Au)); player.reserved[63] = 0; param.reserved[63] = 1; Require(scePlayerSelectionDialogOpen(¶m) == static_cast(0x80B8000Au)); param.reserved[63] = 0; Require(scePlayerSelectionDialogOpen(¶m) == 0); Require(scePlayerSelectionDialogGetStatus() == kStatusFinished); Require(scePlayerSelectionDialogUpdateStatus() == kStatusFinished); Require(scePlayerSelectionDialogGetResult(nullptr) == kErrArgNull); Require(scePlayerSelectionDialogGetResult(&result) == kResultUserCanceled); Require(result.result == kResultUserCanceled); Require(result.option == 99 && result.accountIds == nullptr && result.count == 77 && result.padding == 55); Require(scePlayerSelectionDialogClose() == static_cast(0x80B8000Bu)); Require(scePlayerSelectionDialogTerminate() == 0); Require(scePlayerSelectionDialogTerminate() == kErrNotInitialized); Require(scePlayerSelectionDialogGetStatus() == 0); Require(scePlayerSelectionDialogClose() == kErrNotInitialized); Require(sceUserServiceTerminate() == 0); }