diff --git a/fpPS4.lpi b/fpPS4.lpi
index df663402..23cfa5f3 100644
--- a/fpPS4.lpi
+++ b/fpPS4.lpi
@@ -1575,6 +1575,11 @@
+
+
+
+
+
diff --git a/gui/game_run.pas b/gui/game_run.pas
index f4c23993..71eba170 100644
--- a/gui/game_run.pas
+++ b/gui/game_run.pas
@@ -83,6 +83,7 @@ uses
ps4_libSceNpGameIntent,
ps4_libSceNpWebApi,
ps4_libSceNpWebApi2,
+ ps4_libSceNpSns,
ps4_libSceRemoteplay,
ps4_libSceScreenShot,
ps4_libSceSaveData,
diff --git a/src/np/ps4_libscenpgameintent.pas b/src/np/ps4_libscenpgameintent.pas
index ced7eb96..c8e0dc20 100644
--- a/src/np/ps4_libscenpgameintent.pas
+++ b/src/np/ps4_libscenpgameintent.pas
@@ -10,6 +10,9 @@ uses
implementation
+uses
+ ps4_libSceUserService;
+
const
SCE_NP_GAME_INTENT_TYPE_MAX_SIZE=(32+1);
SCE_NP_GAME_INTENT_DATA_MAX_SIZE=(16*1024+1);
@@ -30,7 +33,7 @@ type
pSceNpGameIntentInfo=^SceNpGameIntentInfo;
SceNpGameIntentInfo=packed record
size :QWORD;
- userId :Integer;
+ userId :SceUserServiceUserId;
intentType:array[0..SCE_NP_GAME_INTENT_TYPE_MAX_SIZE-1] of AnsiChar;
padding :array[0..6] of Byte;
reserved :array[0..255] of Byte;
diff --git a/src/np/ps4_libscenpsns.pas b/src/np/ps4_libscenpsns.pas
new file mode 100644
index 00000000..f9ff6dcf
--- /dev/null
+++ b/src/np/ps4_libscenpsns.pas
@@ -0,0 +1,103 @@
+unit ps4_libSceNpSns;
+
+{$mode ObjFPC}{$H+}
+{$CALLING SysV_ABI_CDecl}
+
+interface
+
+uses
+ subr_dynlib;
+
+implementation
+
+uses
+ ps4_libSceUserService;
+
+const
+ SCE_NP_SNS_FACEBOOK_ERROR_UNKNOWN =-2141903359; // 0x80552601
+ SCE_NP_SNS_FACEBOOK_ERROR_INVALID_ARGUMENT =-2141903358; // 0x80552602
+ SCE_NP_SNS_FACEBOOK_ERROR_OUT_OF_MEMORY =-2141903357; // 0x80552603
+ SCE_NP_SNS_FACEBOOK_ERROR_EXCEEDS_MAX =-2141903356; // 0x80552604
+ SCE_NP_SNS_FACEBOOK_ERROR_UGM_RESTRICTION =-2141903355; // 0x80552605
+ SCE_NP_SNS_FACEBOOK_ERROR_ABORTED =-2141903354; // 0x80552606
+ SCE_NP_SNS_FACEBOOK_ERROR_ACCOUNT_NOT_BOUND =-2141903353; // 0x80552607
+ SCE_NP_SNS_FACEBOOK_ERROR_CANCELED_BY_SYSTEM=-2141903352; // 0x80552608
+ SCE_NP_SNS_FACEBOOK_ERROR_SUB_ACCOUNT =-2141903351; // 0x80552609
+
+const
+ SCE_NP_SNS_FACEBOOK_MAX_REQUEST_NUM =16;
+ SCE_NP_SNS_FACEBOOK_PERMISSIONS_LENGTH_MAX =1023;
+ SCE_NP_SNS_FACEBOOK_ACCESS_TOKEN_LENGTH_MAX=4096;
+
+type
+ pSceNpSnsFacebookAccessTokenParam=^SceNpSnsFacebookAccessTokenParam;
+ SceNpSnsFacebookAccessTokenParam=packed record
+ size :QWORD; //sizeof(SceNpSnsFacebookAccessTokenParam)
+ userId :SceUserServiceUserId;
+ _align :Integer;
+ fbAppId :QWORD;
+ permissions:array[0..SCE_NP_SNS_FACEBOOK_PERMISSIONS_LENGTH_MAX] of AnsiChar;
+ reserved :array[0..31] of Byte;
+ end;
+
+ pSceNpSnsFacebookAccessTokenResult=^SceNpSnsFacebookAccessTokenResult;
+ SceNpSnsFacebookAccessTokenResult=packed record
+ expiration :QWORD; //(sec)
+ accessToken:array[0..SCE_NP_SNS_FACEBOOK_ACCESS_TOKEN_LENGTH_MAX] of AnsiChar;
+ reserved :array[0..38] of Byte;
+ end;
+
+function ps4_sceNpSnsFacebookCreateRequest():Integer;
+begin
+ Result:=1;
+end;
+
+function ps4_sceNpSnsFacebookDeleteRequest(reqId:Integer):Integer;
+begin
+ Result:=0;
+end;
+
+function ps4_sceNpSnsFacebookAbortRequest(reqId:Integer):Integer;
+begin
+ Result:=0;
+end;
+
+function ps4_sceNpSnsFacebookGetAccessToken(
+ reqId :Integer;
+ param :pSceNpSnsFacebookAccessTokenParam;
+ pres :pSceNpSnsFacebookAccessTokenResult
+ ):Integer;
+begin
+ if (param=nil) or (pres=nil) then
+ begin
+ Exit(SCE_NP_SNS_FACEBOOK_ERROR_INVALID_ARGUMENT);
+ end;
+
+ pres^:=Default(SceNpSnsFacebookAccessTokenResult);
+ pres^.accessToken[0]:='0';
+
+ Result:=0;
+end;
+
+function Load_libSceNpSns(name:pchar):p_lib_info;
+var
+ lib:TLIBRARY;
+begin
+ Result:=obj_new_int('libSceNpSns');
+
+ lib:=Result^.add_lib('libSceNpSns');
+
+ lib.set_proc($3A84E37F197CFF02,@ps4_sceNpSnsFacebookCreateRequest);
+ lib.set_proc($A53BC0295D624241,@ps4_sceNpSnsFacebookDeleteRequest);
+ lib.set_proc($FCB25B17D6FF5A1A,@ps4_sceNpSnsFacebookAbortRequest);
+ lib.set_proc($56DC92F172C1A8D1,@ps4_sceNpSnsFacebookGetAccessToken);
+end;
+
+var
+ stub:t_int_file;
+
+initialization
+ RegisteredInternalFile(stub,'libSceNpSns.prx',@Load_libSceNpSns);
+
+end.
+
diff --git a/src/ps4_libscegamelivestreaming.pas b/src/ps4_libscegamelivestreaming.pas
index 305a4ef2..3f89804a 100644
--- a/src/ps4_libscegamelivestreaming.pas
+++ b/src/ps4_libscegamelivestreaming.pas
@@ -6,7 +6,8 @@ unit ps4_libSceGameLiveStreaming;
interface
uses
- subr_dynlib;
+ subr_dynlib,
+ ps4_libSceUserService;
const
SCE_GAME_LIVE_STREAMING_MAX_SOCIAL_FEEDBACK_PRESET_TEXT_LENGTH=32;
@@ -49,13 +50,13 @@ type
isOnAir :Boolean;
_align :array[0..2] of Byte;
spectatorCounts:DWORD;
- userId :Integer;
+ userId :SceUserServiceUserId;
reserved :array[0..59] of Byte;
end;
pSceGameLiveStreamingStatus2=^SceGameLiveStreamingStatus2;
SceGameLiveStreamingStatus2=packed record
- userId :Integer;
+ userId :SceUserServiceUserId;
isOnAir :Boolean;
_align :array[0..2] of Byte;
spectatorCounts :DWORD;
diff --git a/src/ps4_libsceime.pas b/src/ps4_libsceime.pas
index 5892f039..1dbfcab9 100644
--- a/src/ps4_libsceime.pas
+++ b/src/ps4_libsceime.pas
@@ -16,7 +16,8 @@ uses
atomic,
mpmc_queue,
Classes,
- SysUtils;
+ SysUtils,
+ ps4_libSceUserService;
const
SCE_IME_ERROR_BUSY =-2135162879; // 0x80BC0001
@@ -634,7 +635,7 @@ type
pSceImeKeyboardInfo=^SceImeKeyboardInfo;
SceImeKeyboardInfo=packed record
- userId :Integer;
+ userId :SceUserServiceUserId;
device :Integer; //SceImeKeyboardDeviceType
_type :Integer; //SceImeKeyboardType
repeatDelay:DWORD;
@@ -645,7 +646,7 @@ type
pSceImeKeyboardResourceIdArray=^SceImeKeyboardResourceIdArray;
SceImeKeyboardResourceIdArray=packed record
- userId :Integer;
+ userId :SceUserServiceUserId;
resourceId:array[0..SCE_IME_KEYBOARD_MAX_NUMBER-1] of DWORD;
end;
@@ -654,7 +655,7 @@ type
character :WideChar;
status :DWORD;
_type :Integer; //SceImeKeyboardType
- userId :Integer;
+ userId :SceUserServiceUserId;
resourceId:DWORD;
_align :Integer;
timestamp :QWORD; //SceRtcTick
@@ -1134,7 +1135,7 @@ begin
end;
function ps4_sceImeKeyboardOpen(
- userId:Integer;
+ userId:SceUserServiceUserId;
param:pSceImeKeyboardParam
):Integer;
begin
@@ -1207,7 +1208,7 @@ begin
Result:=0;
end;
-function ps4_sceImeKeyboardGetResourceId(userId:Integer;resourceIdArray:pSceImeKeyboardResourceIdArray):Integer;
+function ps4_sceImeKeyboardGetResourceId(userId:SceUserServiceUserId;resourceIdArray:pSceImeKeyboardResourceIdArray):Integer;
begin
if (keyboard_init=0) then Exit(SCE_IME_ERROR_NOT_OPENED);
if (resourceIdArray=nil) then Exit(SCE_IME_ERROR_INVALID_ADDRESS);
diff --git a/src/ps4_libsceremoteplay.pas b/src/ps4_libsceremoteplay.pas
index 40cfe1f4..eff11390 100644
--- a/src/ps4_libsceremoteplay.pas
+++ b/src/ps4_libsceremoteplay.pas
@@ -10,6 +10,9 @@ uses
implementation
+uses
+ ps4_libSceUserService;
+
const
SCE_REMOTEPLAY_HEAP_SIZE=6*1024;
@@ -33,7 +36,7 @@ const
SCE_REMOTEPLAY_CONNECTION_STATUS_DISCONNECT=0;
SCE_REMOTEPLAY_CONNECTION_STATUS_CONNECT =1;
-function ps4_sceRemoteplayGetConnectionStatus(userId:Integer;pStatus:PInteger):Integer;
+function ps4_sceRemoteplayGetConnectionStatus(userId:SceUserServiceUserId;pStatus:PInteger):Integer;
begin
if (pStatus<>nil) then
begin