From 3125f4e9ad35ffad80159dd78da030367f7d2605 Mon Sep 17 00:00:00 2001 From: str1k3r <115313679+S1l3ntStr1ke87@users.noreply.github.com> Date: Wed, 22 Jul 2026 20:03:36 -0400 Subject: [PATCH] chore: add platform headers --- Headers/Durango/4J_Input.h | 165 +++++++++ Headers/Durango/4J_Profile.h | 162 +++++++++ Headers/Durango/4J_Render.h | 302 ++++++++++++++++ Headers/Durango/4J_Storage.h | 492 +++++++++++++++++++++++++ Headers/Orbis/4J_Input.h | 225 ++++++++++++ Headers/Orbis/4J_Profile.h | 177 +++++++++ Headers/Orbis/4J_Render.h | 310 ++++++++++++++++ Headers/Orbis/4J_Storage.h | 411 +++++++++++++++++++++ Headers/PS3/4J_Input.h | 168 +++++++++ Headers/PS3/4J_Profile.h | 158 ++++++++ Headers/PS3/4J_Render.h | 318 ++++++++++++++++ Headers/PS3/4J_Storage.h | 434 ++++++++++++++++++++++ Headers/PSVita/4J_Input.h | 177 +++++++++ Headers/PSVita/4J_Profile.h | 264 ++++++++++++++ Headers/PSVita/4J_Render.h | 326 +++++++++++++++++ Headers/PSVita/4J_Storage.h | 389 ++++++++++++++++++++ Headers/Windows64/4J_Input.h | 168 +++++++++ Headers/Windows64/4J_Profile.h | 127 +++++++ Headers/Windows64/4J_Render.h | 316 ++++++++++++++++ Headers/Windows64/4J_Storage.h | 344 ++++++++++++++++++ Headers/Xbox/4J_Input.h | 127 +++++++ Headers/Xbox/4J_Profile.h | 124 +++++++ Headers/Xbox/4J_Render.h | 238 ++++++++++++ Headers/Xbox/4J_Storage.h | 314 ++++++++++++++++ Headers/Xbox/4J_xtms.h | 55 +++ Headers/extraX64.h | 639 +++++++++++++++++++++++++++++++++ 26 files changed, 6930 insertions(+) create mode 100644 Headers/Durango/4J_Input.h create mode 100644 Headers/Durango/4J_Profile.h create mode 100644 Headers/Durango/4J_Render.h create mode 100644 Headers/Durango/4J_Storage.h create mode 100644 Headers/Orbis/4J_Input.h create mode 100644 Headers/Orbis/4J_Profile.h create mode 100644 Headers/Orbis/4J_Render.h create mode 100644 Headers/Orbis/4J_Storage.h create mode 100644 Headers/PS3/4J_Input.h create mode 100644 Headers/PS3/4J_Profile.h create mode 100644 Headers/PS3/4J_Render.h create mode 100644 Headers/PS3/4J_Storage.h create mode 100644 Headers/PSVita/4J_Input.h create mode 100644 Headers/PSVita/4J_Profile.h create mode 100644 Headers/PSVita/4J_Render.h create mode 100644 Headers/PSVita/4J_Storage.h create mode 100644 Headers/Windows64/4J_Input.h create mode 100644 Headers/Windows64/4J_Profile.h create mode 100644 Headers/Windows64/4J_Render.h create mode 100644 Headers/Windows64/4J_Storage.h create mode 100644 Headers/Xbox/4J_Input.h create mode 100644 Headers/Xbox/4J_Profile.h create mode 100644 Headers/Xbox/4J_Render.h create mode 100644 Headers/Xbox/4J_Storage.h create mode 100644 Headers/Xbox/4J_xtms.h create mode 100644 Headers/extraX64.h diff --git a/Headers/Durango/4J_Input.h b/Headers/Durango/4J_Input.h new file mode 100644 index 0000000..884f281 --- /dev/null +++ b/Headers/Durango/4J_Input.h @@ -0,0 +1,165 @@ +#pragma once + +#define MAP_STYLE_0 0 +#define MAP_STYLE_1 1 +#define MAP_STYLE_2 2 + +#define _360_JOY_BUTTON_A 0x00000001 +#define _360_JOY_BUTTON_B 0x00000002 +#define _360_JOY_BUTTON_X 0x00000004 +#define _360_JOY_BUTTON_Y 0x00000008 + +#define _360_JOY_BUTTON_START 0x00000010 +#define _360_JOY_BUTTON_BACK 0x00000020 +#define _360_JOY_BUTTON_RB 0x00000040 +#define _360_JOY_BUTTON_LB 0x00000080 + +#define _360_JOY_BUTTON_RTHUMB 0x00000100 +#define _360_JOY_BUTTON_LTHUMB 0x00000200 +#define _360_JOY_BUTTON_DPAD_UP 0x00000400 +#define _360_JOY_BUTTON_DPAD_DOWN 0x00000800 + +#define _360_JOY_BUTTON_DPAD_LEFT 0x00001000 +#define _360_JOY_BUTTON_DPAD_RIGHT 0x00002000 +// fake digital versions of analog values +#define _360_JOY_BUTTON_LSTICK_RIGHT 0x00004000 +#define _360_JOY_BUTTON_LSTICK_LEFT 0x00008000 + +#define _360_JOY_BUTTON_RSTICK_DOWN 0x00010000 +#define _360_JOY_BUTTON_RSTICK_UP 0x00020000 +#define _360_JOY_BUTTON_RSTICK_RIGHT 0x00040000 +#define _360_JOY_BUTTON_RSTICK_LEFT 0x00080000 + +#define _360_JOY_BUTTON_LSTICK_DOWN 0x00100000 +#define _360_JOY_BUTTON_LSTICK_UP 0x00200000 +#define _360_JOY_BUTTON_RT 0x00400000 +#define _360_JOY_BUTTON_LT 0x00800000 + +#define _360_GTC_PLAY 0x01000000 +#define _360_GTC_PAUSE 0x02000000 +#define _360_GTC_MENU 0x04000000 +#define _360_GTC_VIEW 0x08000000 +#define _360_GTC_BACK 0x10000000 + +// Stick axis maps - to allow changes for SouthPaw in-game axis mapping +#define AXIS_MAP_LX 0 +#define AXIS_MAP_LY 1 +#define AXIS_MAP_RX 2 +#define AXIS_MAP_RY 3 + +// Trigger map - to allow for swap triggers in-game +#define TRIGGER_MAP_0 0 +#define TRIGGER_MAP_1 1 + +typedef struct _STRING_VERIFY_RESPONSE +{ + WORD wNumStrings; + HRESULT *pStringResult; +} +STRING_VERIFY_RESPONSE; + +class C4JStringTable +{ +public: + LPCWSTR Lookup(LPCWSTR szId) {return NULL;} + LPCWSTR Lookup(UINT nIndex) {return NULL;} + void Clear(); + HRESULT Load(LPCWSTR szId) {return S_OK;} +}; + +class C_4JInput +{ +public: + static const int MAX_GAMEPADS = 8; + enum EKeyboardResult + { + EKeyboard_Pending, + EKeyboard_Cancelled, + EKeyboard_ResultAccept, + EKeyboard_ResultDecline, + }; + + enum EKeyboardMode + { + EKeyboardMode_Default, + EKeyboardMode_Numeric, + EKeyboardMode_Password, + EKeyboardMode_Alphabet, + EKeyboardMode_Full, + EKeyboardMode_Alphabet_Extended, + EKeyboardMode_IP_Address, + EKeyboardMode_Phone, + EKeyboardMode_URL, + EKeyboardMode_Email + + }; + + void Initialise( int iInputStateC, unsigned char ucMapC,unsigned char ucActionC, unsigned char ucMenuActionC ); + void Tick(void); + void SetDeadzoneAndMovementRange(unsigned int uiDeadzoneAnalog, unsigned int uiDeadzoneDigital ,unsigned int uiAnalogMovementRangeMax ); + void SetGameJoypadMaps(unsigned char ucMap,unsigned char ucAction,unsigned int uiActionVal); + unsigned int GetGameJoypadMaps(unsigned char ucMap,unsigned char ucAction); + void SetJoypadMapVal(int iPad,unsigned char ucMap); + unsigned char GetJoypadMapVal(int iPad); + void SetJoypadSensitivity(int iPad, float fSensitivity); + unsigned int GetValue(int iPad,unsigned char ucAction, bool bRepeat=false); + bool ButtonPressed(int iPad,unsigned char ucAction=255); // toggled + bool ButtonReleased(int iPad,unsigned char ucAction); //toggled + bool ButtonDown(int iPad,unsigned char ucAction=255); // button held down + // Functions to remap the axis and triggers for in-game (not menus) - SouthPaw, etc + void SetJoypadStickAxisMap(int iPad,unsigned int uiFrom, unsigned int uiTo); + void SetJoypadStickTriggerMap(int iPad,unsigned int uiFrom, unsigned int uiTo); + void SetKeyRepeatRate(float fRepeatDelaySecs,float fRepeatRateSecs); + void SetDebugSequence( const char *chSequenceA,int( *Func)(LPVOID),LPVOID lpParam ); + FLOAT GetIdleSeconds(int iPad); + unsigned int GetConnectedGamepadCount(); + bool IsPadConnected(int iPad); + bool IsPadLocked(int iPad); + + // In-Game values which may have been remapped due to Southpaw, swap triggers, etc + float GetJoypadStick_LX(int iPad, bool bCheckMenuDisplay=true); + float GetJoypadStick_LY(int iPad, bool bCheckMenuDisplay=true); + float GetJoypadStick_RX(int iPad, bool bCheckMenuDisplay=true); + float GetJoypadStick_RY(int iPad, bool bCheckMenuDisplay=true); + unsigned char GetJoypadLTrigger(int iPad, bool bCheckMenuDisplay=true); + unsigned char GetJoypadRTrigger(int iPad, bool bCheckMenuDisplay=true); + + void SetMenuDisplayed(int iPad, bool bVal); + +// EKeyboardResult RequestKeyboard(UINT uiTitle, UINT uiText, UINT uiDesc, DWORD dwPad, WCHAR *pwchResult, UINT uiResultSize,int( *Func)(LPVOID,const bool),LPVOID lpParam,EKeyboardMode eMode,C4JStringTable *pStringTable=NULL); +// EKeyboardResult RequestKeyboard(UINT uiTitle, LPCWSTR pwchDefault, UINT uiDesc, DWORD dwPad, WCHAR *pwchResult, UINT uiResultSize,int( *Func)(LPVOID,const bool),LPVOID lpParam, EKeyboardMode eMode,C4JStringTable *pStringTable=NULL); + EKeyboardResult RequestKeyboard(LPCWSTR Title, LPCWSTR Text, DWORD dwPad, int iMaxChars, int( *Func)(LPVOID,const bool),LPVOID lpParam,C_4JInput::EKeyboardMode eMode); + void DestroyKeyboard(); + + bool IsCircleCrossSwapped(); + void GetText(uint16_t *UTF16String); + // Online check strings against offensive list - TCR 92 + // TCR # 092 CMTV Player Text String Verification + // Requirement Any player-entered text visible to another player on Xbox LIVE must be verified using the Xbox LIVE service before being transmitted. Text that is rejected by the Xbox LIVE service must not be displayed. + // + // Remarks + // This requirement applies to any player-entered string that can be exposed to other players on Xbox LIVE. It includes session names, content descriptions, text messages, tags, team names, mottos, comments, and so on. + // + // Games may decide to not send the text, blank it out, or use generic text if the text was rejected by the Xbox LIVE service. + // + // Games verify the text by calling the XStringVerify function. + // + // Exemption It is not required to use the Xbox LIVE service to verify real-time text communication. An example of real-time text communication is in-game text chat. + // + // Intent Protect players from inappropriate language. + bool VerifyStrings(WCHAR **pwStringA,int iStringC,int( *Func)(LPVOID,STRING_VERIFY_RESPONSE *),LPVOID lpParam); + void CancelQueuedVerifyStrings(int( *Func)(LPVOID,STRING_VERIFY_RESPONSE *),LPVOID lpParam); + void CancelAllVerifyInProgress(void); + + //bool InputDetected(DWORD dwUserIndex,WCHAR *pwchInput); + + void SetEnabledGtcButtons(long long llEnabledButtons); + + Windows::Xbox::System::User^ GetUserForGamepad(int iPad); + + // Handle PLM events + void Resume(); +}; + +// Singleton +extern C_4JInput InputManager; diff --git a/Headers/Durango/4J_Profile.h b/Headers/Durango/4J_Profile.h new file mode 100644 index 0000000..dab4641 --- /dev/null +++ b/Headers/Durango/4J_Profile.h @@ -0,0 +1,162 @@ +#pragma once + +namespace WXAMS = Windows::Xbox::ApplicationModel::Store; +namespace WXS = Windows::Xbox::System; +namespace MXS = Microsoft::Xbox::Services; + +enum eAwardType +{ + eAwardType_Achievement = 0, + eAwardType_GamerPic, + eAwardType_Theme, + eAwardType_AvatarItem, +}; + +enum eUpsellType +{ + eUpsellType_Custom = 0, // This is the default, and means that the upsell dialog was initiated in the app code + eUpsellType_Achievement, + eUpsellType_GamerPic, + eUpsellType_Theme, + eUpsellType_AvatarItem, +}; + +enum eUpsellResponse +{ + eUpsellResponse_Declined, + eUpsellResponse_Accepted_NoPurchase, + eUpsellResponse_Accepted_Purchase, +}; + +// Public version of PlayerUID that hides any C++/Cx functions +class PlayerUID +{ +protected: + std::wstring m_UID; + +public: + class Hash + { + public: + std::size_t operator()(PlayerUID const& k) const; + }; + + PlayerUID(); + PlayerUID(std::wstring fromString); + + bool operator==(const PlayerUID &rhs) const; + bool operator!=(const PlayerUID &rhs); + + std::wstring toString() const; +}; +typedef PlayerUID *PPlayerUID; + +class C_4JProfile +{ +public: + struct PROFILESETTINGS + { + int iYAxisInversion; + int iControllerSensitivity; + int iVibration; + bool bSwapSticks; + }; + + + // 4 players have game defined data, puiGameDefinedDataChangedBitmask needs to be checked by the game side to see if there's an update needed - it'll have the bits set for players to be updated + void Initialise( const std::wstring &serviceConfigId, const std::wstring &titleProductId ); + //void SetTrialTextStringTable(CXuiStringTable *pStringTable,int iAccept,int iReject); + void SetTrialAwardText(eAwardType AwardType,int iTitle,int iText); // achievement popup in the trial game + int GetLockedProfile(); + void SetLockedProfile(int iProf); + bool IsSignedIn(int iQuadrant); + bool IsSignedInLive(int iProf); + bool IsGuest(int iQuadrant); + UINT RequestSignInUI(bool bFromInvite,bool bLocalGame,bool bNoGuestsAllowed,bool bMultiplayerSignIn,bool bAddUser, int( *Func)(LPVOID,const bool, const int iPad),LPVOID lpParam,int iQuadrant=XUSER_INDEX_ANY); + UINT DisplayOfflineProfile(int( *Func)(LPVOID,const bool, const int iPad),LPVOID lpParam,int iQuadrant=XUSER_INDEX_ANY); + UINT RequestConvertOfflineToGuestUI(int( *Func)(LPVOID,const bool, const int iPad),LPVOID lpParam,int iQuadrant=XUSER_INDEX_ANY); + void SetPrimaryPlayerChanged(bool bVal); + bool QuerySigninStatus(void); + void GetXUID(int iPad, PlayerUID *pXuid,bool bOnlineXuid); + BOOL AreXUIDSEqual(PlayerUID xuid1,PlayerUID xuid2); + BOOL XUIDIsGuest(PlayerUID xuid); + bool AllowedToPlayMultiplayer(int iProf); + void StartTrialGame(); // disables saves and leaderboard, and change state to readyforgame from pregame + void AllowedPlayerCreatedContent(int iPad, bool thisQuadrantOnly, BOOL *allAllowed, BOOL *friendsAllowed); + BOOL CanViewPlayerCreatedContent(int iPad, bool thisQuadrantOnly, PPlayerUID pXuids, DWORD dwXuidCount ); + bool GetProfileAvatar(int iPad,int( *Func)(LPVOID lpParam,PBYTE pbThumbnail,DWORD dwThumbnailBytes), LPVOID lpParam); + void CancelProfileAvatarRequest(); + void ShowProfileCard(int iPad, PlayerUID targetUid); + void ShowAddFriend(int iPad, PlayerUID targetUid); + + void CheckPrivilege(int iPad, bool thisQuadrantOnly, WXAMS::KnownPrivileges privilege, void( *Func)(LPVOID, bool, int),LPVOID lpParam); + void CheckPrivileges(int iPad, bool thisQuadrantOnly, const std::vector &privileges, void( *Func)(LPVOID, bool, int),LPVOID lpParam); + + // Some helper functions to wrap common combinations of privileges + void CheckMultiplayerPrivileges(int iPad, bool thisQuadrantOnly, void( *Func)(LPVOID, bool, int),LPVOID lpParam); + + + // SYS + WXS::User^ GetUser(int iPad, bool incUsersSigningOut = false); + int GetPrimaryPad(); + void SetPrimaryPad(int iPad); + int AddGamepadToGame(int iPad); + void RemoveGamepadFromGame(int iPad); + void ClearGameUsers(); + char* GetGamertag(int iPad); + std::wstring GetDisplayName(int iPad); + bool IsFullVersion(); + void SetSignInChangeCallback(void ( *Func)(LPVOID, bool, unsigned int),LPVOID lpParam); + void SetNotificationsCallback(void ( *Func)(LPVOID, DWORD, unsigned int),LPVOID lpParam); + bool RegionIsNorthAmerica(void); + bool LocaleIsUSorCanada(void); + HRESULT GetLiveConnectionStatus(); + bool IsSystemUIDisplayed(); + void SetProfileReadErrorCallback(void ( *Func)(LPVOID), LPVOID lpParam); + void CompleteDeferredSignouts(); + void SetDeferredSignoutEnabled(bool enabled); + + // PROFILE DATA + //int SetDefaultOptionsCallback(int( *Func)(LPVOID,PROFILESETTINGS *, const int iPad),LPVOID lpParam); + //int SetOldProfileVersionCallback(int( *Func)(LPVOID,unsigned char *, const unsigned short,const int),LPVOID lpParam); + //PROFILESETTINGS * GetDashboardProfileSettings(int iPad); + //void WriteToProfile(int iQuadrant, bool bGameDefinedDataChanged=false, bool bOverride5MinuteLimitOnProfileWrites=false); + //void ForceQueuedProfileWrites(int iPad=XUSER_INDEX_ANY); + //void *GetGameDefinedProfileData(int iQuadrant); + void ResetProfileProcessState(); // after a sign out from the primary player, call this + void Tick( void ); + + void GetProfile(PlayerUID xuid, void (*func)(LPVOID, Microsoft::Xbox::Services::Social::XboxUserProfile^), LPVOID param); + void GetProfiles(std::vector xuids, void (*func)(LPVOID, std::vector), LPVOID param); + + // ACHIEVEMENTS & AWARDS + + //void RegisterAward(int iAwardNumber,int iGamerconfigID, eAwardType eType, bool bLeaderboardAffected=false, + // CXuiStringTable*pStringTable=NULL, int iTitleStr=-1, int iTextStr=-1, int iAcceptStr=-1, char *pszThemeName=NULL, unsigned int uiThemeSize=0L); + //int GetAwardId(int iAwardNumber); + eAwardType GetAwardType(int iAwardNumber); + bool CanBeAwarded(int iQuadrant, int iAwardNumber); + void Award(int iQuadrant, int iAwardNumber, bool bForce=false); + //bool IsAwardsFlagSet(int iQuadrant, int iAward); + + // RICH PRESENCE + + //void RichPresenceInit(int iPresenceCount, int iContextCount); + //void RegisterRichPresenceContext(int iGameConfigContextID); + //void SetRichPresenceContextValue(int iPad,int iContextID, int iVal); + void RegisterPresence(int presenceId, const std::wstring &presence); + void SetCurrentGameActivity(int iPad,int iNewPresence, bool bSetOthersToIdle=false); + void SetGameActivityForAllActiveUsers(int iNewPresence); + + // PURCHASE + void DisplayFullVersionPurchase(bool bRequired, int iQuadrant, int iUpsellParam = -1); + void SetUpsellCallback(void ( *Func)(LPVOID lpParam, eUpsellType type, eUpsellResponse response, int iUserData),LPVOID lpParam); + + // Debug + void SetDebugFullOverride(bool bVal); // To override the license version (trail/full). Only in debug/release, not ContentPackage + +}; + +// Singleton +extern C_4JProfile ProfileManager; + diff --git a/Headers/Durango/4J_Render.h b/Headers/Durango/4J_Render.h new file mode 100644 index 0000000..737caa9 --- /dev/null +++ b/Headers/Durango/4J_Render.h @@ -0,0 +1,302 @@ +#pragma once + +class ImageFileBuffer +{ +public: + enum EImageType + { + e_typePNG, + e_typeJPG + }; + + EImageType m_type; + void* m_pBuffer; + int m_bufferSize; + + int GetType() { return m_type; } + void *GetBufferPointer() { return m_pBuffer; } + int GetBufferSize() { return m_bufferSize; } + void Release() { free(m_pBuffer); m_pBuffer = NULL; } + bool Allocated() { return m_pBuffer != NULL; } +}; + +typedef struct +{ + int Width; + int Height; +}D3DXIMAGE_INFO; + +typedef struct _XSOCIAL_PREVIEWIMAGE { + BYTE *pBytes; + DWORD Pitch; + DWORD Width; + DWORD Height; +// D3DFORMAT Format; +} XSOCIAL_PREVIEWIMAGE, *PXSOCIAL_PREVIEWIMAGE; + +class C4JRender +{ +public: + void Tick(); + void UpdateGamma(unsigned short usGamma); + + // Matrix stack + void MatrixMode(int type); + void MatrixSetIdentity(); + void MatrixTranslate(float x,float y,float z); + void MatrixRotate(float angle, float x, float y, float z); + void MatrixScale(float x, float y, float z); + void MatrixPerspective(float fovy, float aspect, float zNear, float zFar); + void MatrixOrthogonal(float left,float right,float bottom,float top,float zNear,float zFar); + void MatrixPop(); + void MatrixPush(); + void MatrixMult(float *mat); + const float *MatrixGet(int type); + void Set_matrixDirty(); + + // Core + void Initialise(ID3D11Device *pDevice, IDXGISwapChain *pSwapChain); + void InitialiseContext(); + void StartFrame(); + void DoScreenGrabOnNextPresent(); + void Present(); + void Clear(int flags, D3D11_RECT *pRect = NULL); + void SetClearColour(const float colourRGBA[4]); + bool IsWidescreen(); + bool IsHiDef(); + void CaptureThumbnail(ImageFileBuffer *pngOut); + void CaptureScreen(ImageFileBuffer *jpgOut, XSOCIAL_PREVIEWIMAGE *previewOut); + void BeginConditionalSurvey(int identifier); + void EndConditionalSurvey(); + void BeginConditionalRendering(int identifier); + void EndConditionalRendering(); + + // Vertex data handling + typedef enum + { + VERTEX_TYPE_PF3_TF2_CB4_NB4_XW1, // Position 3 x float, texture 2 x float, colour 4 x byte, normal 4 x byte, padding 1 DWORD + VERTEX_TYPE_COMPRESSED, // Compressed format - see comment at top of VS_PS3_TS2_CS1.hlsl for description of layout + VERTEX_TYPE_PF3_TF2_CB4_NB4_XW1_LIT, // as VERTEX_TYPE_PF3_TF2_CB4_NB4_XW1 with lighting applied, + VERTEX_TYPE_PF3_TF2_CB4_NB4_XW1_TEXGEN, // as VERTEX_TYPE_PF3_TF2_CB4_NB4_XW1 with tex gen + VERTEX_TYPE_COUNT + } eVertexType; + + // Pixel shader + typedef enum + { + PIXEL_SHADER_TYPE_STANDARD, + PIXEL_SHADER_TYPE_PROJECTION, + PIXEL_SHADER_TYPE_FORCELOD, + PIXEL_SHADER_COUNT + } ePixelShaderType; + + typedef enum + { + VIEWPORT_TYPE_FULLSCREEN, + VIEWPORT_TYPE_SPLIT_TOP, + VIEWPORT_TYPE_SPLIT_BOTTOM, + VIEWPORT_TYPE_SPLIT_LEFT, + VIEWPORT_TYPE_SPLIT_RIGHT, + VIEWPORT_TYPE_QUADRANT_TOP_LEFT, + VIEWPORT_TYPE_QUADRANT_TOP_RIGHT, + VIEWPORT_TYPE_QUADRANT_BOTTOM_LEFT, + VIEWPORT_TYPE_QUADRANT_BOTTOM_RIGHT, + } eViewportType; + + typedef enum + { + PRIMITIVE_TYPE_TRIANGLE_LIST, + PRIMITIVE_TYPE_TRIANGLE_STRIP, + PRIMITIVE_TYPE_TRIANGLE_FAN, + PRIMITIVE_TYPE_QUAD_LIST, + PRIMITIVE_TYPE_LINE_LIST, + PRIMITIVE_TYPE_LINE_STRIP, + PRIMITIVE_TYPE_COUNT + } ePrimitiveType; + + void DrawVertices(ePrimitiveType PrimitiveType, int count, void *dataIn, eVertexType vType, C4JRender::ePixelShaderType psType); + void DrawVertexBuffer(ePrimitiveType PrimitiveType, int count, ID3D11Buffer *buffer, C4JRender::eVertexType vType, C4JRender::ePixelShaderType psType); + + // Command buffers + void CBuffLockStaticCreations(); + int CBuffCreate(int count); + void CBuffDelete(int first, int count); + void CBuffStart(int index, bool full = false); + void CBuffClear(int index); + int CBuffSize(int index); + void CBuffEnd(); + bool CBuffCall(int index, bool full = true); + void CBuffTick(); + void CBuffDeferredModeStart(); + void CBuffDeferredModeEnd(); + + typedef enum + { + TEXTURE_FORMAT_RxGyBzAw, // Normal 32-bit RGBA texture, 8 bits per component + /* Don't think these are all directly available on D3D 11 - leaving for now + TEXTURE_FORMAT_R0G0B0Ax, // One 8-bit component mapped to alpha channel, R=G=B=0 + TEXTURE_FORMAT_R1G1B1Ax, // One 8-bit component mapped to alpha channel, R=G=B=1 + TEXTURE_FORMAT_RxGxBxAx, // One 8-bit component mapped to all channels + */ + MAX_TEXTURE_FORMATS + } eTextureFormat; + + // Textures + int TextureCreate(); + void TextureFree(int idx); + void TextureBind(int idx); + void TextureBindVertex(int idx); + void TextureSetTextureLevels(int levels); + int TextureGetTextureLevels(); + void TextureData(int width, int height, void *data, int level, eTextureFormat format = TEXTURE_FORMAT_RxGyBzAw); + void TextureDataUpdate(int xoffset, int yoffset, int width, int height, void *data, int level); + void TextureSetParam(int param, int value); + void TextureDynamicUpdateStart(); + void TextureDynamicUpdateEnd(); + HRESULT LoadTextureData(const char *szFilename,D3DXIMAGE_INFO *pSrcInfo, int **ppDataOut); + HRESULT LoadTextureData(BYTE *pbData, DWORD dwBytes,D3DXIMAGE_INFO *pSrcInfo, int **ppDataOut); + HRESULT SaveTextureData(const char *szFilename, D3DXIMAGE_INFO *pSrcInfo, int *ppDataOut); + HRESULT SaveTextureDataToMemory(void *pOutput, int outputCapacity, int *outputLength, int width, int height, int *ppDataIn); + void TextureGetStats(); + ID3D11ShaderResourceView *TextureGetTexture(int idx); + + // State control + void StateSetColour(float r, float g, float b, float a); + void StateSetDepthMask(bool enable); + void StateSetBlendEnable(bool enable); + void StateSetBlendFunc(int src, int dst); + void StateSetBlendFactor(unsigned int colour); + void StateSetAlphaFunc(int func, float param); + void StateSetDepthFunc(int func); + void StateSetFaceCull(bool enable); + void StateSetFaceCullCW(bool enable); + void StateSetLineWidth(float width); + void StateSetWriteEnable(bool red, bool green, bool blue, bool alpha); + void StateSetDepthTestEnable(bool enable); + void StateSetAlphaTestEnable(bool enable); + void StateSetDepthSlopeAndBias(float slope, float bias); + void StateSetFogEnable(bool enable); + void StateSetFogMode(int mode); + void StateSetFogNearDistance(float dist); + void StateSetFogFarDistance(float dist); + void StateSetFogDensity(float density); + void StateSetFogColour(float red, float green, float blue); + void StateSetLightingEnable(bool enable); + void StateSetVertexTextureUV( float u, float v); + void StateSetLightColour(int light, float red, float green, float blue); + void StateSetLightAmbientColour(float red, float green, float blue); + void StateSetLightDirection(int light, float x, float y, float z); + void StateSetLightEnable(int light, bool enable); + void StateSetViewport(eViewportType viewportType); + void StateSetEnableViewportClipPlanes(bool enable); + void StateSetTexGenCol(int col, float x, float y, float z, float w, bool eyeSpace); + void StateSetStencil(int Function, uint8_t stencil_ref, uint8_t stencil_func_mask, uint8_t stencil_write_mask); + void StateSetForceLOD(int LOD); + + // Event tracking + void BeginEvent(LPCWSTR eventName); + void EndEvent(); + + // PLM event handling + void Suspend(); + bool Suspended(); + void Resume(); +}; + + +const int GL_MODELVIEW_MATRIX = 0; +const int GL_PROJECTION_MATRIX = 1; +const int GL_MODELVIEW = 0; +const int GL_PROJECTION = 1; +const int GL_TEXTURE = 2; + +// These things required for tex gen + +const int GL_S = 0; +const int GL_T = 1; +const int GL_R = 2; +const int GL_Q = 3; + +const int GL_TEXTURE_GEN_S = 0; +const int GL_TEXTURE_GEN_T = 1; +const int GL_TEXTURE_GEN_Q = 2; +const int GL_TEXTURE_GEN_R = 3; + +const int GL_TEXTURE_GEN_MODE = 0; +const int GL_OBJECT_LINEAR = 0; +const int GL_EYE_LINEAR = 1; +const int GL_OBJECT_PLANE = 0; +const int GL_EYE_PLANE = 1; + + +// These things are used by glEnable/glDisable so must be different and non-zero (zero is used by things we haven't assigned yet) +const int GL_TEXTURE_2D = 1; +const int GL_BLEND = 2; +const int GL_CULL_FACE = 3; +const int GL_ALPHA_TEST = 4; +const int GL_DEPTH_TEST = 5; +const int GL_FOG = 6; +const int GL_LIGHTING = 7; +const int GL_LIGHT0 = 8; +const int GL_LIGHT1 = 9; + +const int CLEAR_DEPTH_FLAG = 1; +const int CLEAR_COLOUR_FLAG = 2; + +const int GL_DEPTH_BUFFER_BIT = CLEAR_DEPTH_FLAG; +const int GL_COLOR_BUFFER_BIT = CLEAR_COLOUR_FLAG; + +const int GL_SRC_ALPHA = D3D11_BLEND_SRC_ALPHA; +const int GL_ONE_MINUS_SRC_ALPHA = D3D11_BLEND_INV_SRC_ALPHA; +const int GL_ONE = D3D11_BLEND_ONE; +const int GL_ZERO = D3D11_BLEND_ZERO; +const int GL_DST_ALPHA = D3D11_BLEND_DEST_ALPHA; +const int GL_SRC_COLOR = D3D11_BLEND_SRC_COLOR; +const int GL_DST_COLOR = D3D11_BLEND_DEST_COLOR; +const int GL_ONE_MINUS_DST_COLOR = D3D11_BLEND_INV_DEST_COLOR; +const int GL_ONE_MINUS_SRC_COLOR = D3D11_BLEND_INV_SRC_COLOR; +const int GL_CONSTANT_ALPHA = D3D11_BLEND_BLEND_FACTOR; +const int GL_ONE_MINUS_CONSTANT_ALPHA = D3D11_BLEND_INV_BLEND_FACTOR; + +const int GL_GREATER = D3D11_COMPARISON_GREATER; +const int GL_EQUAL = D3D11_COMPARISON_EQUAL; +const int GL_LEQUAL = D3D11_COMPARISON_LESS_EQUAL; +const int GL_GEQUAL = D3D11_COMPARISON_GREATER_EQUAL; +const int GL_ALWAYS = D3D11_COMPARISON_ALWAYS; + +const int GL_TEXTURE_MIN_FILTER = 1; +const int GL_TEXTURE_MAG_FILTER = 2; +const int GL_TEXTURE_WRAP_S = 3; +const int GL_TEXTURE_WRAP_T = 4; + +const int GL_NEAREST = 0; +const int GL_LINEAR = 1; +const int GL_EXP = 2; +const int GL_NEAREST_MIPMAP_LINEAR = 0; // TODO - mipmapping bit of this + +const int GL_CLAMP = 0; +const int GL_REPEAT = 1; + +const int GL_FOG_START = 1; +const int GL_FOG_END = 2; +const int GL_FOG_MODE = 3; +const int GL_FOG_DENSITY = 4; +const int GL_FOG_COLOR = 5; + +const int GL_POSITION = 1; +const int GL_AMBIENT = 2; +const int GL_DIFFUSE = 3; +const int GL_SPECULAR = 4; + +const int GL_LIGHT_MODEL_AMBIENT = 1; + +const int GL_LINES = C4JRender::PRIMITIVE_TYPE_LINE_LIST; +const int GL_LINE_STRIP = C4JRender::PRIMITIVE_TYPE_LINE_STRIP; +const int GL_QUADS = C4JRender::PRIMITIVE_TYPE_QUAD_LIST; +const int GL_TRIANGLE_FAN = C4JRender::PRIMITIVE_TYPE_TRIANGLE_FAN; +const int GL_TRIANGLE_STRIP = C4JRender::PRIMITIVE_TYPE_TRIANGLE_STRIP; + +// Singleton +extern C4JRender RenderManager; + + diff --git a/Headers/Durango/4J_Storage.h b/Headers/Durango/4J_Storage.h new file mode 100644 index 0000000..be5d57f --- /dev/null +++ b/Headers/Durango/4J_Storage.h @@ -0,0 +1,492 @@ +#pragma once +using namespace std; + +#define MAX_DISPLAYNAME_LENGTH 128 // SCE_SAVE_DATA_SUBTITLE_MAXSIZE on PS4 +#define MAX_SAVEFILENAME_LENGTH 32 // SCE_SAVE_DATA_DIRNAME_DATA_MAXSIZE +#define USER_INDEX_ANY 0x000000FF +#define RESULT LONG + +class StringTable; + +typedef struct +{ + time_t modifiedTime; + unsigned int dataSize; + unsigned int thumbnailSize; +} +CONTAINER_METADATA; + +typedef struct +{ + wchar_t UTF16SaveFilename[MAX_SAVEFILENAME_LENGTH]; + wchar_t UTF16SaveTitle[MAX_DISPLAYNAME_LENGTH]; + CONTAINER_METADATA metaData; + PBYTE thumbnailData; + uint64 totalSize; + bool needsSync; + //int sizeKB; +} +SAVE_INFO,*PSAVE_INFO; + +typedef struct +{ + int iSaveC; + int iThumbnailC; + PSAVE_INFO SaveInfoA; +} +SAVE_DETAILS,*PSAVE_DETAILS; + +class CONTENT_DATA +{ +public: + int DeviceID; + DWORD dwContentType; + WCHAR wszDisplayName[256]; + WCHAR wszProductID[64]; + bool bTrialLicense; + //WCHAR szFileName[MAX_SAVEFILENAME_LENGTH]; +}; + +typedef CONTENT_DATA XCONTENT_DATA, *PXCONTENT_DATA; + +typedef struct _MARKETPLACE_CONTENTOFFER_INFO +{ + WCHAR *wszProductID; + WCHAR *wszOfferName; + BOOL fUserHasPurchased; + WCHAR *wszSellText; + WCHAR *wszCurrencyPrice; + WCHAR *wszSignedOfferID; +} MARKETPLACE_CONTENTOFFER_INFO, *PMARKETPLACE_CONTENTOFFER_INFO; + +typedef enum +{ + XMARKETPLACE_OFFERING_TYPE_CONTENT = 0x00000002, + //XMARKETPLACE_OFFERING_TYPE_GAME_DEMO = 0x00000020, + //XMARKETPLACE_OFFERING_TYPE_GAME_TRAILER = 0x00000040, + XMARKETPLACE_OFFERING_TYPE_THEME = 0x00000080, + XMARKETPLACE_OFFERING_TYPE_TILE = 0x00000800, + //XMARKETPLACE_OFFERING_TYPE_ARCADE = 0x00002000, + //XMARKETPLACE_OFFERING_TYPE_VIDEO = 0x00004000, + //XMARKETPLACE_OFFERING_TYPE_CONSUMABLE = 0x00010000, + XMARKETPLACE_OFFERING_TYPE_AVATARITEM = 0x00100000 +} XMARKETPLACE_OFFERING_TYPE; + + + +enum eWebServiceState +{ + eWebService_idle, + eWebService_notsignedin, + eWebService_pending, + eWebService_error, + eWebService_busy +}; + +enum eTitleStorageState +{ + eTitleStorage_idle, + eTitleStorage_notsignedin, + eTitleStorage_pending, + eTitleStorage_complete, + eTitleStorage_readcomplete, + eTitleStorage_readfilelistcomplete, + eTitleStorage_writecomplete, + eTitleStorage_deletecomplete, + eTitleStorage_error, + eTitleStorage_readerror, + eTitleStorage_readfilelisterror, + eTitleStorage_writeerror, + eTitleStorage_deleteerror, + eTitleStorage_busy +}; + +// Current version of the dlc data creator +#define CURRENT_DLC_VERSION_NUM 3 + +class C4JStorage +{ +public: + + struct PROFILESETTINGS + { + int iYAxisInversion; + int iControllerSensitivity; + int iVibration; + bool bSwapSticks; + }; + + // Structs defined in the DLC_Creator, but added here to be used in the app + typedef struct + { + unsigned int uiFileSize; + DWORD dwType; + DWORD dwWchCount; // count of WCHAR in next array + WCHAR wchFile[1]; + } + DLC_FILE_DETAILS, *PDLC_FILE_DETAILS; + + typedef struct + { + DWORD dwType; + DWORD dwWchCount; // count of WCHAR in next array; + WCHAR wchData[1]; // will be an array of size dwBytes + } + DLC_FILE_PARAM, *PDLC_FILE_PARAM; + // End of DLC_Creator structs + + typedef struct + { + DWORD dwVersion; + DWORD dwNewOffers; + DWORD dwTotalOffers; + DWORD dwInstalledTotalOffers; + BYTE bPadding[1024-sizeof(DWORD)*4]; // future expansion + } + DLC_TMS_DETAILS; + + typedef struct + { + DWORD dwSize; + PBYTE pbData; + } + TMSPP_FILEDATA, *PTMSPP_FILEDATA; + + enum eTMS_FILETYPEVAL + { + TMS_FILETYPE_BINARY=0, + TMS_FILETYPE_CONFIG=1, + TMS_FILETYPE_JSON=2, + TMS_FILETYPE_MAX, + }; + + typedef struct + { + WCHAR wchFilename[64]; + unsigned long ulFileSize; + eTMS_FILETYPEVAL eFileTypeVal; + } + TMSPP_FILE_DETAILS, *PTMSPP_FILE_DETAILS; + + typedef struct + { + int iCount; + PTMSPP_FILE_DETAILS FileDetailsA; + } + TMSPP_FILE_LIST, *PTMSPP_FILE_LIST; + + typedef struct + { + PBYTE pbData; + unsigned long ulFileLen; + } + SAVETRANSFER_FILE_DETAILS; + + enum eGlobalStorage + { + //eGlobalStorage_GameClip=0, + eGlobalStorage_Title=0, + eGlobalStorage_TitleUser, + eGlobalStorage_Max + }; + + enum EMessageResult + { + EMessage_Undefined=0, + EMessage_Busy, + EMessage_Pending, + EMessage_Cancelled, + EMessage_ResultAccept, + EMessage_ResultDecline, + EMessage_ResultThirdOption, + EMessage_ResultFourthOption + }; + + enum ESaveGameState + { + ESaveGame_Idle=0, + + ESaveGame_Save, + ESaveGame_SaveCompleteSuccess, + ESaveGame_SaveCompleteFail, + ESaveGame_SaveIncomplete, + ESaveGame_SaveIncomplete_WaitingOnResponse, + + ESaveGame_SaveSubfiles, + ESaveGame_SaveSubfilesCompleteSuccess, + ESaveGame_SaveSubfilesCompleteFail, + ESaveGame_SaveSubfilesIncomplete, + ESaveGame_SaveSubfilesIncomplete_WaitingOnResponse, + + ESaveGame_Load, + ESaveGame_LoadComplete, + ESaveGame_EnumerateSubfiles, + ESaveGame_EnumerateSubfilesComplete, + ESaveGame_LoadSubfiles, + ESaveGame_LoadCompleteSuccess, + + ESaveGame_LoadCompleteFail, + + ESaveGame_Delete, + ESaveGame_DeleteSuccess, + ESaveGame_DeleteFail, + + ESaveGame_Rename, + ESaveGame_RenameSuccess, + ESaveGame_RenameFail, + + ESaveGame_GetSaveThumbnail, + ESaveGame_GetSaveThumbnailComplete, + + ESaveGame_Copy, + ESaveGame_CopyCompleteSuccess, + ESaveGame_CopyCompleteFail, + }; + + enum EOptionsState + { + EOptions_Idle=0, + EOptions_Save, + EOptions_Load, + EOptions_Delete, + EOptions_NoSpace, + EOptions_Corrupt, + }; + + enum ESaveGameStatus + { + EDeleteGame_Idle=0, + EDeleteGame_InProgress, + }; + + enum EDLCStatus + { + EDLC_Error=0, + EDLC_Idle, + EDLC_NoOffers, + EDLC_AlreadyEnumeratedAllOffers, + EDLC_NoInstalledDLC, + EDLC_Pending, + EDLC_LoadInProgress, + EDLC_Loaded, + EDLC_ChangedDevice + }; + + enum ESavingMessage + { + ESavingMessage_None=0, + ESavingMessage_Short, + ESavingMessage_Long + }; + + enum ESaveIncompleteType + { + ESaveIncomplete_None, + ESaveIncomplete_OutOfQuota, + ESaveIncomplete_OutOfLocalStorage, + ESaveIncomplete_Unknown + }; + + enum ETMSStatus + { + ETMSStatus_Idle=0, + ETMSStatus_Fail, + ETMSStatus_ReadInProgress, + ETMSStatus_ReadFileListInProgress, + ETMSStatus_WriteInProgress, + ETMSStatus_Fail_ReadInProgress, + ETMSStatus_Fail_ReadFileListInProgress, + ETMSStatus_Fail_ReadDetailsNotRetrieved, + ETMSStatus_Fail_WriteInProgress, + ETMSStatus_DeleteInProgress, + ETMSStatus_Pending, + }; + + enum eTMS_FileType + { + eTMS_FileType_Normal=0, + eTMS_FileType_Graphic, + }; + + enum ESGIStatus + { + ESGIStatus_Error=0, + ESGIStatus_Idle, + ESGIStatus_ReadInProgress, + ESGIStatus_NoSaves, + }; + + enum + { + PROFILE_READTYPE_ALL, + PROFILE_READTYPE_XBOXSETTINGS // just read the settings (after a notification of settings change) + }; + + enum eOptionsCallback + { + eOptions_Callback_Idle, + eOptions_Callback_Write, + eOptions_Callback_Write_Fail_NoSpace, + eOptions_Callback_Write_Fail, + eOptions_Callback_Read, + eOptions_Callback_Read_Fail, + eOptions_Callback_Read_FileNotFound, + eOptions_Callback_Read_Corrupt, + eOptions_Callback_Read_CorruptDeletePending, + eOptions_Callback_Read_CorruptDeleted + }; + + enum eSaveTransferState + { + eSaveTransfer_Idle, + eSaveTransfer_Busy, + eSaveTransfer_GettingFileSize, + eSaveTransfer_FileSizeRetrieved, + eSaveTransfer_GetFileData, + eSaveTransfer_GettingFileData, + eSaveTransfer_FileDataRetrieved, + eSaveTransfer_Converting, + eSaveTransfer_Saving, + }; + + ///////////////////////////////////////////////////////////////////////////// Global storage manager ////////////////////////////////////////////////////////////////////////////// + + C4JStorage(); + void Tick(void); // General storage manager tick to be called from game + + ///////////////////////////////////////////////////////////////////////////// Savegame data /////////////////////////////////////////////////////////////////////////////////////// + + // Initialisation + void Init(unsigned int uiSaveVersion,LPCWSTR pwchDefaultSaveName,char *pszSavePackName,int iMinimumSaveSize, // General manager initialisation + int( *Func)(LPVOID, const ESavingMessage, int),LPVOID lpParam, + bool(*SetRetrieveProductIDFn)(XCONTENT_DATA &Data),WCHAR *pwchSCID,WCHAR *pwchTitleId); + void SetGameSaveFolderTitle(WCHAR *wszGameSaveFolderTitle); // Sets the title to be set in the param.sfo of saves (this doesn't vary, the sub-title is used for the user cho + void SetSaveCacheFolderTitle(WCHAR *wszSaveCacheFolderTitle); // Sets the title to be set in the param.sfo of the save cache + void SetOptionsFolderTitle(WCHAR *wszOptionsFolderTitle); // Sets the title to be set in the param.sfo of the options file + void SetGameSaveFolderPrefix(char *szGameSaveFolderPrefix); // Sets the prefix to be added to the unique filename of each save to construct a final folder name + void SetMaxSaves(int iMaxC); // Sets the maximum number of saves to be evaluated by GetSavesInfo etc. + void SetDefaultImages(PBYTE pbSaveThumbnail,DWORD dwSaveThumbnailBytes); // Sets default save thumbnail, which can be used when saving a game that hasn't generated any yet + void SetIncompleteSaveCallback(void( *Func)(LPVOID, const ESaveIncompleteType), LPVOID param); // Sets callback to be used in the event of a save method not being able to complete + + // Miscellaneous control + void SetSaveDisabled(bool bDisable); // Sets saving disabled/enabled state + bool GetSaveDisabled(void); // Determines whether saving has been disabled + void ResetSaveData(); // Releases any internal storage being held for previously saved/loaded data + C4JStorage::ESaveGameState DoesSaveExist(bool *pbExists); // Determine if current savegame exists on storage device + bool EnoughSpaceForAMinSaveGame(); + C4JStorage::ESaveGameState GetSaveState(); + + // Get details of existing savedata + C4JStorage::ESaveGameState GetSavesInfo(int iPad,int ( *Func)(LPVOID lpParam,SAVE_DETAILS *pSaveDetails,const bool),LPVOID lpParam,char *pszSavePackName); // Start search + PSAVE_DETAILS ReturnSavesInfo(); // Returns result of search (or NULL if not yet received) + void ClearSavesInfo(); // Clears results + C4JStorage::ESaveGameState LoadSaveDataThumbnail(PSAVE_INFO pSaveInfo,int( *Func)(LPVOID lpParam,PBYTE pbThumbnail,DWORD dwThumbnailBytes), LPVOID lpParam, bool force=false); // Get the thumbnail for an individual save referenced by pSaveInfo + + // Loading savedata & obtaining information from just-loaded file + C4JStorage::ESaveGameState LoadSaveData(PSAVE_INFO pSaveInfo,int( *Func)(LPVOID lpParam,const bool, const bool), LPVOID lpParam); // Loads savedata referenced by pSaveInfo, calls callback once complete + unsigned int GetSaveSize(); // Obtains sizse of just-loaded save + void GetSaveData(void *pvData,unsigned int *puiBytes); // Obtains pointer to, and size, of just-loaded save + bool GetSaveUniqueNumber(INT *piVal); // Gets the unique numeric portion of the folder name used for the save (encodes m + bool GetSaveUniqueFilename(char *pszName); // Get the full unique "filename" used as part of the folder name for the save + + // Handling of sub-files (numerically indexed ) within the save + unsigned int GetSubfileCount(); // Get the number of sub-files in the just-loaded save + void ResetSubfiles(); // Reset storage manager's references to sub-files, to be called when we are finished with the save game + void GetSubfileDetails(int idx, unsigned int *subfileId, unsigned char **data, unsigned int *sizeOut); // Gets details for sub-file from 0 to GetSubfileCount() - 1. Caller is responsible for data allocation after this point. + void UpdateSubfile(int idx, unsigned char *data, unsigned int size); // Update internal details for a sub-file, from 0 to GetSubfileCount() - 1. + int AddSubfile(unsigned int subfileId); // Adds an additional sub-file with a given subfileId, returns index + C4JStorage::ESaveGameState SaveSubfiles(int( *Func)(LPVOID ,const bool),LPVOID lpParam); // Writes all modified sub-files, calling callback on completion + + // Saving savedata + void SetSaveTitle(const wchar_t *UTF16String); // Sets the name which is used as a sub-title in the savedata param.sfo + PVOID AllocateSaveData(unsigned int uiBytes); // Allocate storage manager owned memory to the data which is to be saved to + void SetSaveDataSize(unsigned int uiBytes); // Set the actual size of data to be saved + void GetDefaultSaveImage(PBYTE *ppbSaveImage,DWORD *pdwSaveImageBytes); // Get the default save thumbnail (as set by SetDefaultImages) for use on saving games t + void GetDefaultSaveThumbnail(PBYTE *ppbSaveThumbnail,DWORD *pdwSaveThumbnailBytes); // Get the default save image (as set by SetDefaultImages) for use on saving games that + void SetSaveImages( PBYTE pbThumbnail,DWORD dwThumbnailBytes,PBYTE pbImage,DWORD dwImageBytes, PBYTE pbTextData ,DWORD dwTextDataBytes); // Sets the thumbnail & image for the save, optionally setting the metadata in the png + C4JStorage::ESaveGameState SaveSaveData(int( *Func)(LPVOID ,const bool),LPVOID lpParam); // Save the actual data, calling callback on completion + + // Handling of incomplete saves (either sub-files or save data). To be used after game has had callback for an incomplete save event + void ContinueIncompleteOperation(); + void CancelIncompleteOperation(); + + // Other file operations + C4JStorage::ESaveGameState DeleteSaveData(PSAVE_INFO pSaveInfo,int( *Func)(LPVOID lpParam,const bool), LPVOID lpParam); // Deletes savedata referenced by pSaveInfo, calls callback when comple + C4JStorage::ESaveGameState CopySaveData(PSAVE_INFO pSaveInfo,int( *Func)(LPVOID ,const bool,C4JStorage::ESaveGameState state),bool( *FuncProg)(LPVOID ,const int),LPVOID lpParam); // Copies savedata referenced by pSaveInfo, calls callback when complete + C4JStorage::ESaveGameState RenameSaveData(int iRenameIndex,uint16_t*pui16NewName,int( *Func)(LPVOID lpParam,const bool), LPVOID lpParam); // Renamed savedata with index from last established ReturnSavesInfo. + + // Internal methods + void GetSaveImage(PBYTE *ppbSaveImage, int *puiSaveImageBytes); + void GetSaveThumbnail(PBYTE *ppbSaveThumbnail, int *puiSaveThumbnailBytes); + void SetSaveUniqueFilename(wchar_t *szFilename); + + ///////////////////////////////////////////////////////////////////////////// Profile data //////////////////////////////////////////////////////////////////////////////////////// + // Initialisation + void InitialiseProfileData(unsigned short usProfileVersion, UINT uiProfileValuesC, UINT uiProfileSettingsC, DWORD *pdwProfileSettingsA, int iGameDefinedDataSizeX4, unsigned int *puiGameDefinedDataChangedBitmask); // General initialisation + int SetDefaultOptionsCallback(int( *Func)(LPVOID,PROFILESETTINGS *, const int iPad),LPVOID lpParam); // Set a callback that can initialise a profile's storage to its default settings + void SetOptionsDataCallback(int( *Func)(LPVOID, int iPad, unsigned short usVersion, C4JStorage::eOptionsCallback),LPVOID lpParam); // Sets callback that is called when status of any options has changed + int SetOldProfileVersionCallback(int( *Func)(LPVOID,unsigned char *, const unsigned short,const int),LPVOID lpParam); + + // Getting and setting of profile data + PROFILESETTINGS * GetDashboardProfileSettings(int iPad); // Get pointer to the standard (originally xbox dashboard) profile data for one user + void *GetGameDefinedProfileData(int iQuadrant); // Get pointer to the game-defined profile data for one user + + // Reading and writing profiles + void ReadFromProfile(int iQuadrant, int iReadType=PROFILE_READTYPE_ALL); // Initiate read profile data for one user - read type is ignored on this platform + void WriteToProfile(int iQuadrant, bool bGameDefinedDataChanged=false, bool bOverride5MinuteLimitOnProfileWrites=false); // Initiate write profile for one user + void DeleteOptionsData(int iPad); // Delete profile data for one user + void ForceQueuedProfileWrites(int iPad=-1); // Force any queued profile writes to write now + + // DLC + C4JStorage::EDLCStatus GetInstalledDLC(int iPad,int( *Func)(LPVOID, int, int),LPVOID lpParam); + void SetLicenseChangeFn(void( *Func)(void)); + + XCONTENT_DATA& GetDLC(DWORD dw); + DWORD MountInstalledDLC(int iPad,DWORD dwDLC,int( *Func)(LPVOID, int, DWORD,DWORD),LPVOID lpParam,LPWSTR szMountDrive = NULL); + DWORD UnmountInstalledDLC(LPWSTR szMountDrive = NULL); + void GetMountedDLCFileList(const char* szMountDrive, std::vector& fileList); + std::wstring GetMountedPath(std::wstring szMount); + XCONTENT_DATA * GetInstalledDLC(WCHAR *wszProductID); + + C4JStorage::EDLCStatus GetDLCOffers(int iPad,int( *Func)(LPVOID, int, DWORD, int),LPVOID lpParam, DWORD dwOfferTypesBitmaskT); + MARKETPLACE_CONTENTOFFER_INFO& GetOffer(DWORD dw); + DWORD InstallOffer(int iOfferIDC,WCHAR *pwchProductId,int( *Func)(LPVOID, int, int),LPVOID lpParam, bool bTrial=false); + + void UpdateDLCProductIDs(); // once we have the dlc info, we can give local installed DLC their product ids + + //void SetRetrieveProductIDFn(int( *Func)(XCONTENT_DATA&)); // Retrieve a product id for the dlc from the game + + void Suspend(); + bool Suspended(); + + ///////////////////////////////////////////////////////////////////////////// Unimplemented stubs ///////////////////////////////////////////////////////////////////////////////// +#pragma warning(disable: 4100) + void SetSaveDeviceSelected(unsigned int uiPad,bool bSelected) {} + bool GetSaveDeviceSelected(unsigned int iPad) { return true; } + void ClearDLCOffers(); +// C4JStorage::ETMSStatus ReadTMSFile(int iQuadrant,eGlobalStorage eStorageFacility,C4JStorage::eTMS_FileType eFileType, WCHAR *pwchFilename,BYTE **ppBuffer,DWORD *pdwBufferSize,int( *Func)(LPVOID, WCHAR *,int, bool, int),LPVOID lpParam, int iAction);// { return C4JStorage::ETMSStatus_Idle; } +// bool WriteTMSFile(int iQuadrant,eGlobalStorage eStorageFacility,LPWSTR wszFilename,BYTE *pBuffer,DWORD dwBufferSize); + bool DeleteTMSFile(int iQuadrant,eGlobalStorage eStorageFacility,LPWSTR wszFilename); + + // TMS++ + C4JStorage::ETMSStatus TMSPP_GetUserQuotaInfo(C4JStorage::eGlobalStorage eStorageFacility,int iPad);//,TMSCLIENT_CALLBACK Func,LPVOID lpParam, int iUserData=0); + eTitleStorageState TMSPP_WriteFile(int iQuadrant,C4JStorage::eGlobalStorage eStorageFacility,C4JStorage::eTMS_FILETYPEVAL eFileTypeVal,LPWSTR wszFilename,BYTE *pbBuffer,DWORD dwBufferSize,int( *Func)(LPVOID,int,int)=NULL,LPVOID lpParam=NULL, int iUserData=0); + eTitleStorageState TMSPP_ReadFile(int iQuadrant,C4JStorage::eGlobalStorage eStorageFacility,C4JStorage::eTMS_FILETYPEVAL eFileTypeVal,LPWSTR wszFilename,int( *Func)(LPVOID,int,int,LPVOID, WCHAR *),LPVOID lpParam, int iUserData); + eTitleStorageState TMSPP_DeleteFile(int iQuadrant,C4JStorage::eGlobalStorage eStorageFacility,C4JStorage::eTMS_FILETYPEVAL eFileTypeVal,LPWSTR wszFilename,int( *Func)(LPVOID,int,int),LPVOID lpParam, int iUserData); + eTitleStorageState TMSPP_ReadFileList(int iPad,C4JStorage::eGlobalStorage eStorageFacility,int( *Func)(LPVOID,int,int,LPVOID,WCHAR *)=NULL,LPVOID lpParam=NULL, int iUserData=0); + bool TMSPP_InFileList(eGlobalStorage eStorageFacility, int iPad,const wstring &Filename); + + eTitleStorageState TMSPP_GetTitleStorageState(int iPad); + void TMSPP_ClearTitleStorageState(int iPad); + + + //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + + // SAVE TRANSFERS + C4JStorage::eSaveTransferState SaveTransferClearState(); + C4JStorage::eSaveTransferState SaveTransferGetDetails(int iPad, eGlobalStorage source, wchar_t *file, int ( *Func)(LPVOID lpParam,C4JStorage::SAVETRANSFER_FILE_DETAILS *pSaveTransferDetails),LPVOID lpParam); + C4JStorage::eSaveTransferState SaveTransferGetData(int iPad, eGlobalStorage source, wchar_t *file,int ( *Func)(LPVOID lpParam,C4JStorage::SAVETRANSFER_FILE_DETAILS *pSaveTransferDetails),int ( *ProgressFunc)(LPVOID lpParam,unsigned long),LPVOID lpParam,LPVOID lpProgressParam); + void CancelSaveTransfer(int ( *CancelCompleteFunc)(LPVOID lpParam),LPVOID lpParam); +}; + +extern C4JStorage StorageManager; diff --git a/Headers/Orbis/4J_Input.h b/Headers/Orbis/4J_Input.h new file mode 100644 index 0000000..75960c5 --- /dev/null +++ b/Headers/Orbis/4J_Input.h @@ -0,0 +1,225 @@ +#pragma once +#include + +#define MAP_STYLE_0 0 +#define MAP_STYLE_1 1 +#define MAP_STYLE_2 2 +#define MAP_STYLE_3 3 // Vita remote play map + +#define PARTIAL_MAP_1 4 // Vita TV additional controls + +#define _360_JOY_BUTTON_A 0x00000001 +#define _360_JOY_BUTTON_B 0x00000002 +#define _360_JOY_BUTTON_X 0x00000004 +#define _360_JOY_BUTTON_Y 0x00000008 + +#define _360_JOY_BUTTON_START 0x00000010 +#define _360_JOY_BUTTON_BACK 0x00000020 +#define _360_JOY_BUTTON_RB 0x00000040 +#define _360_JOY_BUTTON_LB 0x00000080 + +#define _360_JOY_BUTTON_RTHUMB 0x00000100 +#define _360_JOY_BUTTON_LTHUMB 0x00000200 +#define _360_JOY_BUTTON_DPAD_UP 0x00000400 +#define _360_JOY_BUTTON_DPAD_DOWN 0x00000800 + +#define _360_JOY_BUTTON_DPAD_LEFT 0x00001000 +#define _360_JOY_BUTTON_DPAD_RIGHT 0x00002000 +// fake digital versions of analog values +#define _360_JOY_BUTTON_LSTICK_RIGHT 0x00004000 +#define _360_JOY_BUTTON_LSTICK_LEFT 0x00008000 + +#define _360_JOY_BUTTON_RSTICK_DOWN 0x00010000 +#define _360_JOY_BUTTON_RSTICK_UP 0x00020000 +#define _360_JOY_BUTTON_RSTICK_RIGHT 0x00040000 +#define _360_JOY_BUTTON_RSTICK_LEFT 0x00080000 + +#define _360_JOY_BUTTON_LSTICK_DOWN 0x00100000 +#define _360_JOY_BUTTON_LSTICK_UP 0x00200000 +#define _360_JOY_BUTTON_RT 0x00400000 +#define _360_JOY_BUTTON_LT 0x00800000 + +// PS4 equivalents + +#define _PS4_JOY_BUTTON_X _360_JOY_BUTTON_A +#define _PS4_JOY_BUTTON_O _360_JOY_BUTTON_B +#define _PS4_JOY_BUTTON_SQUARE _360_JOY_BUTTON_X +#define _PS4_JOY_BUTTON_TRIANGLE _360_JOY_BUTTON_Y +#define _PS4_JOY_BUTTON_TOUCHPAD _360_JOY_BUTTON_BACK +#define _PS4_JOY_BUTTON_OPTIONS _360_JOY_BUTTON_START +#define _PS4_JOY_BUTTON_R1 _360_JOY_BUTTON_RB +#define _PS4_JOY_BUTTON_L1 _360_JOY_BUTTON_LB +#define _PS4_JOY_BUTTON_R3 _360_JOY_BUTTON_RTHUMB +#define _PS4_JOY_BUTTON_L3 _360_JOY_BUTTON_LTHUMB +#define _PS4_JOY_BUTTON_DPAD_UP _360_JOY_BUTTON_DPAD_UP +#define _PS4_JOY_BUTTON_DPAD_DOWN _360_JOY_BUTTON_DPAD_DOWN +#define _PS4_JOY_BUTTON_DPAD_LEFT _360_JOY_BUTTON_DPAD_LEFT +#define _PS4_JOY_BUTTON_DPAD_RIGHT _360_JOY_BUTTON_DPAD_RIGHT +#define _PS4_JOY_BUTTON_LSTICK_RIGHT _360_JOY_BUTTON_LSTICK_RIGHT +#define _PS4_JOY_BUTTON_LSTICK_LEFT _360_JOY_BUTTON_LSTICK_LEFT +#define _PS4_JOY_BUTTON_RSTICK_DOWN _360_JOY_BUTTON_RSTICK_DOWN +#define _PS4_JOY_BUTTON_RSTICK_UP _360_JOY_BUTTON_RSTICK_UP +#define _PS4_JOY_BUTTON_RSTICK_RIGHT _360_JOY_BUTTON_RSTICK_RIGHT +#define _PS4_JOY_BUTTON_RSTICK_LEFT _360_JOY_BUTTON_RSTICK_LEFT +#define _PS4_JOY_BUTTON_LSTICK_DOWN _360_JOY_BUTTON_LSTICK_DOWN +#define _PS4_JOY_BUTTON_LSTICK_UP _360_JOY_BUTTON_LSTICK_UP +#define _PS4_JOY_BUTTON_R2 _360_JOY_BUTTON_RT +#define _PS4_JOY_BUTTON_L2 _360_JOY_BUTTON_LT + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +// Stick axis maps - to allow changes for SouthPaw in-game axis mapping +#define AXIS_MAP_LX 0 +#define AXIS_MAP_LY 1 +#define AXIS_MAP_RX 2 +#define AXIS_MAP_RY 3 + +// Trigger map - to allow for swap triggers in-game +#define TRIGGER_MAP_0 0 +#define TRIGGER_MAP_1 1 + +class StringTable; +// class C4JStringTable +// { +// public: +// LPCWSTR Lookup(LPCWSTR szId); +// LPCWSTR Lookup(UINT nIndex); +// void Clear(); +// HRESULT Load(LPCWSTR szId); +// }; + +typedef struct _STRING_VERIFY_RESPONSE +{ + WORD wNumStrings; + HRESULT *pStringResult; +} +STRING_VERIFY_RESPONSE; + +enum EKeyboardResult +{ + EKeyboard_Pending, + EKeyboard_Cancelled, + EKeyboard_ResultAccept, + EKeyboard_ResultDecline, +}; + +class C_4JInput +{ +public: + enum EKeyboardResult + { + EKeyboard_Pending, + EKeyboard_Cancelled, + EKeyboard_ResultAccept, + EKeyboard_ResultDecline, + }; + + enum EKeyboardMode + { + EKeyboardMode_Default, + EKeyboardMode_Numeric, + EKeyboardMode_Password, + EKeyboardMode_Alphabet, + EKeyboardMode_Full, + EKeyboardMode_Alphabet_Extended, + EKeyboardMode_IP_Address, + EKeyboardMode_Phone + }; + + void Initialise( int iInputStateC, unsigned char ucMapC,unsigned char ucActionC, unsigned char ucMenuActionC ); + void Tick(void); + void SetDeadzoneAndMovementRange(unsigned int uiDeadzone, unsigned int uiDeadzoneDigital ,unsigned int uiAnalogMovementRangeMax ); + void SetGameJoypadMaps(unsigned char ucMap,unsigned char ucAction,unsigned int uiActionVal); + unsigned int GetGameJoypadMaps(unsigned char ucMap,unsigned char ucAction); + void SetJoypadMapVal(int iPad,unsigned char ucMap); + unsigned char GetJoypadMapVal(int iPad); + void SetJoypadSensitivity(int iPad, float fSensitivity); + unsigned int GetValue(int iPad,unsigned char ucAction, bool bRepeat=false); + bool ButtonPressed(int iPad,unsigned char ucAction=255); // toggled + bool ButtonReleased(int iPad,unsigned char ucAction); //toggled + bool ButtonDown(int iPad,unsigned char ucAction=255); // button held down + // Functions to remap the axis and triggers for in-game (not menus) - SouthPaw, etc + void SetJoypadStickAxisMap(int iPad,unsigned int uiFrom, unsigned int uiTo); + void SetJoypadStickTriggerMap(int iPad,unsigned int uiFrom, unsigned int uiTo); + void SetKeyRepeatRate(float fRepeatDelaySecs,float fRepeatRateSecs); + void SetDebugSequence( const char *chSequenceA,int( *Func)(LPVOID),LPVOID lpParam ); + FLOAT GetIdleSeconds(int iPad); + bool IsPadConnected(int iPad); + void SetCircleCrossSwapped(bool swapped); + bool IsCircleCrossSwapped(); + + // In-Game values which may have been remapped due to Southpaw, swap triggers, etc + float GetJoypadStick_LX(int iPad, bool bCheckMenuDisplay=true); + float GetJoypadStick_LY(int iPad, bool bCheckMenuDisplay=true); + float GetJoypadStick_RX(int iPad, bool bCheckMenuDisplay=true); + float GetJoypadStick_RY(int iPad, bool bCheckMenuDisplay=true); + unsigned char GetJoypadLTrigger(int iPad, bool bCheckMenuDisplay=true); + unsigned char GetJoypadRTrigger(int iPad, bool bCheckMenuDisplay=true); + + ScePadTouchData * GetTouchPadData(int iPad, bool bCheckMenuDisplay=true); + + void SetMenuDisplayed(int iPad, bool bVal); + + C_4JInput::EKeyboardResult RequestKeyboard(LPCWSTR Title, LPCWSTR Text, DWORD dwPad, UINT uiMaxChars, int( *Func)(LPVOID,const bool),LPVOID lpParam,C_4JInput::EKeyboardMode eMode); + void DestroyKeyboard(); + void GetText(uint16_t *UTF16String); + + // Remote play + void SetLocalMultiplayer(bool inProgress); + bool IsLocalMultiplayerAvailable(); + bool UsingRemoteVita(); + + // Online check strings against offensive list - TCR 92 + // TCR # 092 CMTV Player Text String Verification + // Requirement Any player-entered text visible to another player on Xbox LIVE must be verified using the Xbox LIVE service before being transmitted. Text that is rejected by the Xbox LIVE service must not be displayed. + // + // Remarks + // This requirement applies to any player-entered string that can be exposed to other players on Xbox LIVE. It includes session names, content descriptions, text messages, tags, team names, mottos, comments, and so on. + // + // Games may decide to not send the text, blank it out, or use generic text if the text was rejected by the Xbox LIVE service. + // + // Games verify the text by calling the XStringVerify function. + // + // Exemption It is not required to use the Xbox LIVE service to verify real-time text communication. An example of real-time text communication is in-game text chat. + // + // Intent Protect players from inappropriate language. + bool VerifyStrings(WCHAR **pwStringA,int iStringC,int( *Func)(LPVOID,STRING_VERIFY_RESPONSE *),LPVOID lpParam); + void CancelQueuedVerifyStrings(int( *Func)(LPVOID,STRING_VERIFY_RESPONSE *),LPVOID lpParam); + void CancelAllVerifyInProgress(void); + + //bool InputDetected(DWORD dwUserIndex,WCHAR *pwchInput); +}; + +// Singleton +extern C_4JInput InputManager; diff --git a/Headers/Orbis/4J_Profile.h b/Headers/Orbis/4J_Profile.h new file mode 100644 index 0000000..03651b8 --- /dev/null +++ b/Headers/Orbis/4J_Profile.h @@ -0,0 +1,177 @@ +#pragma once +#include +#include + +enum eAwardType +{ + eAwardType_Achievement = 0, + eAwardType_GamerPic, + eAwardType_Theme, + eAwardType_AvatarItem, +}; + +enum eUpsellType +{ + eUpsellType_Custom = 0, // This is the default, and means that the upsell dialog was initiated in the app code + eUpsellType_Achievement, + eUpsellType_GamerPic, + eUpsellType_Theme, + eUpsellType_AvatarItem, +}; + +enum eUpsellResponse +{ + eUpsellResponse_Declined, + eUpsellResponse_Accepted_NoPurchase, + eUpsellResponse_Accepted_Purchase, + eUpsellResponse_UserNotSignedInPSN +}; + + + +class C_4JProfile +{ +public: + + typedef struct + { + int iPad; + int ( *m_fnFunc)(LPVOID lpParam,PBYTE pbThumbnail,DWORD dwThumbnailBytes); + LPVOID m_fnFunc_Param; + } + FUNCPARAMS; + + // 4 players have game defined data, puiGameDefinedDataChangedBitmask needs to be checked by the game side to see if there's an update needed - it'll have the bits set for players to be updated + void Initialise( const SceNpCommunicationId* commsId, + const SceNpCommunicationSignature* commsSig, + unsigned short usProfileVersion, + UINT uiProfileValuesC, + UINT uiProfileSettingsC, + DWORD *pdwProfileSettingsA, + int iGameDefinedDataSizeX4, + unsigned int *puiGameDefinedDataChangedBitmask); + void InitialiseTrophies();//const SceNpCommunicationId* commsId, const SceNpCommunicationSignature* commsSig); + int WaitTrophyInitComplete(); + int tryWaitTrophyInitComplete(); + void trophySystemCallback(const sce::Toolkit::NP::Event& event); + void SetTrialTextStringTable(CXuiStringTable *pStringTable,int iAccept,int iReject); + void SetTrialAwardText(eAwardType AwardType,int iTitle,int iText); // achievement popup in the trial game + int GetLockedProfile(); + void SetLockedProfile(int iProf); + bool IsSignedIn(int iQuadrant); + bool IsSignedInLive(int iProf); + bool IsGuest(int iQuadrant); + UINT RequestSignInUI(bool bFromInvite,bool bLocalGame,bool bNoGuestsAllowed,bool bMultiplayerSignIn,bool bAddUser, int( *Func)(LPVOID,const bool, const int iPad),LPVOID lpParam,int iQuadrant=XUSER_INDEX_ANY); + UINT DisplayOfflineProfile(int( *Func)(LPVOID,const bool, const int iPad),LPVOID lpParam,int iQuadrant=XUSER_INDEX_ANY); + UINT RequestConvertOfflineToGuestUI(int( *Func)(LPVOID,const bool, const int iPad),LPVOID lpParam,int iQuadrant=XUSER_INDEX_ANY); + void SetPrimaryPlayerChanged(bool bVal); + bool QuerySigninStatus(void); + void GetSceNpId(int iPad, SceNpId *npId); + void GetXUID(int iPad, PlayerUID *pXuid,bool bOnlineXuid); + BOOL AreXUIDSEqual(PlayerUID xuid1,PlayerUID xuid2); + BOOL XUIDIsGuest(PlayerUID xuid); + bool AllowedToPlayMultiplayer(int iProf); + bool HasPlayStationPlus(int iProf); + void PsPlusUpdate(int iProf, SceNpCommerceDialogResult *dialogResult); + bool RequestingPlaystationPlus(int iPad); + void StartTrialGame(); // disables saves and leaderboard, and change state to readyforgame from pregame + void AllowedPlayerCreatedContent(int iPad, bool thisQuadrantOnly, BOOL *allAllowed, BOOL *friendsAllowed); + BOOL CanViewPlayerCreatedContent(int iPad, bool thisQuadrantOnly, PPlayerUID pXuids, DWORD dwXuidCount ); + bool GetProfileAvatar(int iPad,int( *Func)(LPVOID lpParam,PBYTE pbThumbnail,DWORD dwThumbnailBytes), LPVOID lpParam); + void CancelProfileAvatarRequest(); + + void SetGetStringFunc(LPCWSTR ( *Func)(int)); + void SetPlayerListTitleID(int id); + void SetFatalTrophyErrorID(int id); + + // SYS + int GetPrimaryPad(); + void SetPrimaryPad(int iPad); + char* GetGamertag(int iPad); + wstring GetDisplayName(int iPad); + bool IsFullVersion(); + void SetFullVersion(bool bFull); + void SetSignInChangeCallback(void ( *Func)(LPVOID, bool, unsigned int),LPVOID lpParam); + void SetNotificationsCallback(void ( *Func)(LPVOID, DWORD, unsigned int),LPVOID lpParam); + bool RegionIsNorthAmerica(void); + bool LocaleIsUSorCanada(void); + HRESULT GetLiveConnectionStatus(); + bool IsSystemUIDisplayed(); + void DisplaySystemMessage( SceMsgDialogSystemMessageType _type, int iQuadrant); + void SetProfileReadErrorCallback(void ( *Func)(LPVOID), LPVOID lpParam); + + void SetHDDFreeKB(int iHDDFreeKB); + void SetMinSaveKB(int iMinSaveKB); + int GetHDDFreeKB(void); + + + + // PROFILE DATA +// int SetDefaultOptionsCallback(int( *Func)(LPVOID,PROFILESETTINGS *, const int iPad),LPVOID lpParam); +// int SetOldProfileVersionCallback(int( *Func)(LPVOID,unsigned char *, const unsigned short,const int),LPVOID lpParam); +// PROFILESETTINGS * GetDashboardProfileSettings(int iPad); +// void WriteToProfile(int iQuadrant, bool bGameDefinedDataChanged=false, bool bOverride5MinuteLimitOnProfileWrites=false); +// void ForceQueuedProfileWrites(int iPad=XUSER_INDEX_ANY); +// void *GetGameDefinedProfileData(int iQuadrant); + + void ResetProfileProcessState(); // after a sign out from the primary player, call this + void Tick( void ); + + // ACHIEVEMENTS & AWARDS + + void RegisterAward(int iAwardNumber,int iGamerconfigID, eAwardType eType, bool bLeaderboardAffected=false, + CXuiStringTable*pStringTable=NULL, int iTitleStr=-1, int iTextStr=-1, int iAcceptStr=-1, char *pszThemeName=NULL, unsigned int uiThemeSize=0L); + int GetAwardId(int iAwardNumber); + eAwardType GetAwardType(int iAwardNumber); + bool CanBeAwarded(int iQuadrant, int iAwardNumber); + void Award(int iQuadrant, int iAwardNumber, bool bForce=false); + bool IsAwardsFlagSet(int iQuadrant, int iAward); + void Terminate(); + + // RICH PRESENCE + void RichPresenceRegisterPresenceString(int index, const char* str); + void RichPresenceRegisterContext(int ctxID, const char* token); + void RichPresenceRegisterContextString(int ctxID, int strIndex, const char* str); + + void RichPresenceInit(int iPresenceCount, int iContextCount); + void SetRichPresenceContextValue(int iPad,int iContextID, int iVal); + void SetCurrentGameActivity(int iPad,int iNewPresence, bool bSetOthersToIdle=false); + void SetRichPresenceSettingFn(int ( *SetPresenceInfoFn)(const void *data)); + + // PURCHASE + void DisplayFullVersionPurchase(bool bRequired, int iQuadrant, int iUpsellParam = -1); + void SetUpsellCallback(void ( *Func)(LPVOID lpParam, eUpsellType type, eUpsellResponse response, int iUserData),LPVOID lpParam); + + // Debug + void SetDebugFullOverride(bool bVal); // To override the license version (trail/full). Only in debug/release, not ContentPackage + + // Online status + void SetNetworkStatus(bool online); + + DWORD GetSignedInUsersMask(); + + // PS3 chat and content restrictions + void RefreshChatAndContentRestrictions(void( *Func)(void *pParam), void *pParam); + bool GetChatAndContentRestrictions(int iPad, bool thisQuadrantOnly,bool *pbChatRestricted,bool *pbContentRestricted,int *piAge); + void SetServiceID(char *pchServiceID); // needed for the ticket request for the chat restrictions of secondary PSN players + void HandleNetworkTicket(int result,void *arg); + void SetMinimumAge(int iAge); + + SceUserServiceUserId getUserID(int iQuadrant); // grab the PS4 userID for this quadrant (SCE_USER_SERVICE_USER_ID_INVALID if it's not signed in) + int getQuadrant(SceUserServiceUserId userId); + void SignedInPSNStateCallback(SceUserServiceUserId userId, SceNpState state, const SceNpId *npId); + + int getNPAvailability(int iQuadrant); + bool isSignedInPSN(int iQuadrant); + bool isConnectedToPSN(int iQuadrant); + + // Http calls + bool SonyHttp_init(); + void SonyHttp_shutdown(); + bool SonyHttp_getDataFromURL(const char* szURL, void** ppOutData, int* pDataSize); + +}; + +// Singleton +extern C_4JProfile ProfileManager; + diff --git a/Headers/Orbis/4J_Render.h b/Headers/Orbis/4J_Render.h new file mode 100644 index 0000000..6083654 --- /dev/null +++ b/Headers/Orbis/4J_Render.h @@ -0,0 +1,310 @@ +#pragma once + +using namespace sce; +#include + +class ImageFileBuffer +{ +public: + enum EImageType + { + e_typePNG, + e_typeJPG + }; + + EImageType m_type; + void* m_pBuffer; + int m_bufferSize; + + int GetType() { return m_type; } + void *GetBufferPointer() { return m_pBuffer; } + int GetBufferSize() { return m_bufferSize; } + void Release() { free(m_pBuffer); m_pBuffer = NULL; } + bool Allocated() { return m_pBuffer != NULL; } +}; + +typedef struct +{ + int Width; + int Height; +}D3DXIMAGE_INFO; + +typedef struct _XSOCIAL_PREVIEWIMAGE { + BYTE *pBytes; + DWORD Pitch; + DWORD Width; + DWORD Height; +// D3DFORMAT Format; +} XSOCIAL_PREVIEWIMAGE, *PXSOCIAL_PREVIEWIMAGE; + +class C4JRender +{ +public: + void Tick(); + void UpdateGamma(unsigned short usGamma); + + // Matrix stack + void MatrixMode(int type); + void MatrixSetIdentity(); + void MatrixTranslate(float x,float y,float z); + void MatrixRotate(float angle, float x, float y, float z); + void MatrixScale(float x, float y, float z); + void MatrixPerspective(float fovy, float aspect, float zNear, float zFar); + void MatrixOrthogonal(float left,float right,float bottom,float top,float zNear,float zFar); + void MatrixPop(); + void MatrixPush(); + void MatrixMult(float *mat); + const float *MatrixGet(int type); + void Set_matrixDirty(); + + // Core + void Initialise();//ID3D11Device *pDevice, IDXGISwapChain *pSwapChain); + void InitialiseContext(); + void StartFrame(bool actualFrameStart = true); + void Present(); + void Clear(int flags);//, D3D11_RECT *pRect = NULL); + void SetClearColour(const float colourRGBA[4]); + bool IsWidescreen(); + bool IsHiDef(); + void InternalScreenCapture(); + void CaptureThumbnail(ImageFileBuffer* pngOut, ImageFileBuffer* saveGamePngOut); + void CaptureScreen(ImageFileBuffer *jpgOut, XSOCIAL_PREVIEWIMAGE *previewOut); + void BeginConditionalSurvey(int identifier); + void EndConditionalSurvey(); + void BeginConditionalRendering(int identifier); + void EndConditionalRendering(); + + // Vertex data handling + typedef enum + { + VERTEX_TYPE_PF3_TF2_CB4_NB4_XW1, // Position 3 x float, texture 2 x float, colour 4 x byte, normal 4 x byte, padding 1 DWORD + VERTEX_TYPE_COMPRESSED, // Compressed format - see comment at top of VS_PS3_TS2_CS1.hlsl for description of layout + VERTEX_TYPE_PF3_TF2_CB4_NB4_XW1_LIT, // as VERTEX_TYPE_PF3_TF2_CB4_NB4_XW1 with lighting applied, + VERTEX_TYPE_PF3_TF2_CB4_NB4_XW1_TEXGEN, // as VERTEX_TYPE_PF3_TF2_CB4_NB4_XW1 with tex gen + VERTEX_TYPE_COUNT + } eVertexType; + + // Pixel shader + typedef enum + { + PIXEL_SHADER_TYPE_STANDARD, + PIXEL_SHADER_TYPE_PROJECTION, + PIXEL_SHADER_TYPE_FORCELOD, + PIXEL_SHADER_COUNT + } ePixelShaderType; + + typedef enum + { + VIEWPORT_TYPE_FULLSCREEN, + VIEWPORT_TYPE_SPLIT_TOP, + VIEWPORT_TYPE_SPLIT_BOTTOM, + VIEWPORT_TYPE_SPLIT_LEFT, + VIEWPORT_TYPE_SPLIT_RIGHT, + VIEWPORT_TYPE_QUADRANT_TOP_LEFT, + VIEWPORT_TYPE_QUADRANT_TOP_RIGHT, + VIEWPORT_TYPE_QUADRANT_BOTTOM_LEFT, + VIEWPORT_TYPE_QUADRANT_BOTTOM_RIGHT, + } eViewportType; + + typedef enum + { + PRIMITIVE_TYPE_TRIANGLE_LIST, + PRIMITIVE_TYPE_TRIANGLE_STRIP, + PRIMITIVE_TYPE_TRIANGLE_FAN, + PRIMITIVE_TYPE_QUAD_LIST, + PRIMITIVE_TYPE_LINE_LIST, + PRIMITIVE_TYPE_LINE_STRIP, + PRIMITIVE_TYPE_COUNT + } ePrimitiveType; + + void DrawVertices(ePrimitiveType PrimitiveType, int count, void *dataIn, eVertexType vType, C4JRender::ePixelShaderType psType); + + // Command buffers + void CBuffLockStaticCreations(); + int CBuffCreate(int count); + void CBuffDelete(int first, int count); + void CBuffStart(int index, bool full = false); + void CBuffClear(int index); + int CBuffSize(int index); + void CBuffEnd(); + bool CBuffCall(int index, bool full = true); + void CBuffTick(); + void CBuffDeferredModeStart(); + void CBuffDeferredModeEnd(); + + typedef enum + { + TEXTURE_FORMAT_RxGyBzAw, // Normal 32-bit RGBA texture, 8 bits per component + TEXTURE_FORMAT_RxGyBzAw5551, // Normal 16-bit RGBA texture, 5 bits per RGB component, 1 bit alpha + /* Don't think these are all directly available on D3D 11 - leaving for now + TEXTURE_FORMAT_R0G0B0Ax, // One 8-bit component mapped to alpha channel, R=G=B=0 + TEXTURE_FORMAT_R1G1B1Ax, // One 8-bit component mapped to alpha channel, R=G=B=1 + TEXTURE_FORMAT_RxGxBxAx, // One 8-bit component mapped to all channels + */ + MAX_TEXTURE_FORMATS + } eTextureFormat; + + // Textures + int TextureCreate(); + void TextureFree(int idx); + void TextureBind(int idx); + void TextureBindVertex(int idx); + void TextureSetTextureLevels(int levels); + int TextureGetTextureLevels(); + void TextureData(int width, int height, void *data, int level, eTextureFormat format = TEXTURE_FORMAT_RxGyBzAw); + void TextureDataUpdate(int xoffset, int yoffset, int width, int height, void *data, int level); + void TextureSetParam(int param, int value); + void TextureDynamicUpdateStart(); + void TextureDynamicUpdateEnd(); + HRESULT LoadTextureData(const char *szFilename,D3DXIMAGE_INFO *pSrcInfo, int **ppDataOut); + HRESULT LoadTextureData(BYTE *pbData, DWORD dwBytes,D3DXIMAGE_INFO *pSrcInfo, int **ppDataOut); + HRESULT SaveTextureData(const char *szFilename, D3DXIMAGE_INFO *pSrcInfo, int *ppDataOut); + void TextureGetStats(); + Gnm::Texture *TextureGetTexture(int idx); + + // State control + void StateSetColour(float r, float g, float b, float a); + void StateSetDepthMask(bool enable); + void StateSetBlendEnable(bool enable); + void StateSetBlendFunc(int src, int dst); + void StateSetBlendFactor(unsigned int colour); + void StateSetAlphaFunc(int func, float param); + void StateSetDepthFunc(int func); + void StateSetFaceCull(bool enable); + void StateSetFaceCullCW(bool enable); + void StateSetLineWidth(float width); + void StateSetWriteEnable(bool red, bool green, bool blue, bool alpha); + void StateSetDepthTestEnable(bool enable); + void StateSetAlphaTestEnable(bool enable); + void StateSetDepthSlopeAndBias(float slope, float bias); + void StateSetFogEnable(bool enable); + void StateSetFogMode(int mode); + void StateSetFogNearDistance(float dist); + void StateSetFogFarDistance(float dist); + void StateSetFogDensity(float density); + void StateSetFogColour(float red, float green, float blue); + void StateSetLightingEnable(bool enable); + void StateSetVertexTextureUV( float u, float v); + void StateSetLightColour(int light, float red, float green, float blue); + void StateSetLightAmbientColour(float red, float green, float blue); + void StateSetLightDirection(int light, float x, float y, float z); + void StateSetLightEnable(int light, bool enable); + void StateSetViewport(eViewportType viewportType); + void StateSetEnableViewportClipPlanes(bool enable); + void StateSetTexGenCol(int col, float x, float y, float z, float w, bool eyeSpace); + void StateSetStencil(int Function, uint8_t stencil_ref, uint8_t stencil_func_mask, uint8_t stencil_write_mask); + void StateSetForceLOD(int LOD); + + // Event tracking + void BeginEvent(LPCWSTR eventName); + void EndEvent(); + + // Memory + void *MemoryAllocateGPUMem(uint32_t alignment, uint32_t size); + void *MemoryAllocateCPUMem(uint32_t alignment, uint32_t size); + void MemoryFreeGPUMem(void *data); + void MemoryFreeCPUMem(void *data); + + + Gnmx::GfxContext *GetCurrentBackBufferContext(); + Gnm::RenderTarget *GetCurrentBackBufferTarget(); + Gnm::DepthRenderTarget *GetCurrentBackBufferDepthTarget(); +}; + + +const int GL_MODELVIEW_MATRIX = 0; +const int GL_PROJECTION_MATRIX = 1; +const int GL_MODELVIEW = 0; +const int GL_PROJECTION = 1; +const int GL_TEXTURE = 2; + +// These things required for tex gen + +const int GL_S = 0; +const int GL_T = 1; +const int GL_R = 2; +const int GL_Q = 3; + +const int GL_TEXTURE_GEN_S = 0; +const int GL_TEXTURE_GEN_T = 1; +const int GL_TEXTURE_GEN_Q = 2; +const int GL_TEXTURE_GEN_R = 3; + +const int GL_TEXTURE_GEN_MODE = 0; +const int GL_OBJECT_LINEAR = 0; +const int GL_EYE_LINEAR = 1; +const int GL_OBJECT_PLANE = 0; +const int GL_EYE_PLANE = 1; + + +// These things are used by glEnable/glDisable so must be different and non-zero (zero is used by things we haven't assigned yet) +const int GL_TEXTURE_2D = 1; +const int GL_BLEND = 2; +const int GL_CULL_FACE = 3; +const int GL_ALPHA_TEST = 4; +const int GL_DEPTH_TEST = 5; +const int GL_FOG = 6; +const int GL_LIGHTING = 7; +const int GL_LIGHT0 = 8; +const int GL_LIGHT1 = 9; + +const int CLEAR_DEPTH_FLAG = 1; +const int CLEAR_COLOUR_FLAG = 2; + +const int GL_DEPTH_BUFFER_BIT = CLEAR_DEPTH_FLAG; +const int GL_COLOR_BUFFER_BIT = CLEAR_COLOUR_FLAG; + +const int GL_SRC_ALPHA = Gnm::kBlendMultiplierSrcAlpha; +const int GL_ONE_MINUS_SRC_ALPHA = Gnm::kBlendMultiplierOneMinusSrcAlpha; +const int GL_ONE = Gnm::kBlendMultiplierOne; +const int GL_ZERO = Gnm::kBlendMultiplierZero; +const int GL_DST_ALPHA = Gnm::kBlendMultiplierDestAlpha; +const int GL_SRC_COLOR = Gnm::kBlendMultiplierSrcColor; +const int GL_DST_COLOR = Gnm::kBlendMultiplierDestColor; +const int GL_ONE_MINUS_DST_COLOR = Gnm::kBlendMultiplierOneMinusDestColor; +const int GL_ONE_MINUS_SRC_COLOR = Gnm::kBlendMultiplierOneMinusSrcColor; +const int GL_CONSTANT_ALPHA = Gnm::kBlendMultiplierConstantAlpha; +const int GL_ONE_MINUS_CONSTANT_ALPHA = Gnm::kBlendMultiplierOneMinusConstantAlpha; + +const int GL_GREATER = Gnm::kCompareFuncGreater; +const int GL_EQUAL = Gnm::kCompareFuncEqual; +const int GL_LEQUAL = Gnm::kCompareFuncLessEqual; +const int GL_GEQUAL = Gnm::kCompareFuncGreaterEqual; +const int GL_ALWAYS = Gnm::kCompareFuncAlways; + +const int GL_TEXTURE_MIN_FILTER = 1; +const int GL_TEXTURE_MAG_FILTER = 2; +const int GL_TEXTURE_WRAP_S = 3; +const int GL_TEXTURE_WRAP_T = 4; + +const int GL_NEAREST = 0; +const int GL_LINEAR = 1; +const int GL_EXP = 2; +const int GL_NEAREST_MIPMAP_LINEAR = 0; // TODO - mipmapping bit of this + +const int GL_CLAMP = 0; +const int GL_REPEAT = 1; + +const int GL_FOG_START = 1; +const int GL_FOG_END = 2; +const int GL_FOG_MODE = 3; +const int GL_FOG_DENSITY = 4; +const int GL_FOG_COLOR = 5; + +const int GL_POSITION = 1; +const int GL_AMBIENT = 2; +const int GL_DIFFUSE = 3; +const int GL_SPECULAR = 4; + +const int GL_LIGHT_MODEL_AMBIENT = 1; + +const int GL_LINES = C4JRender::PRIMITIVE_TYPE_LINE_LIST; +const int GL_LINE_STRIP = C4JRender::PRIMITIVE_TYPE_LINE_STRIP; +const int GL_QUADS = C4JRender::PRIMITIVE_TYPE_QUAD_LIST; +const int GL_TRIANGLE_FAN = C4JRender::PRIMITIVE_TYPE_TRIANGLE_FAN; +const int GL_TRIANGLE_STRIP = C4JRender::PRIMITIVE_TYPE_TRIANGLE_STRIP; + +// Singleton +extern C4JRender RenderManager; + + diff --git a/Headers/Orbis/4J_Storage.h b/Headers/Orbis/4J_Storage.h new file mode 100644 index 0000000..d4d845d --- /dev/null +++ b/Headers/Orbis/4J_Storage.h @@ -0,0 +1,411 @@ +#pragma once +using namespace std; + +#include + +#define MAX_DISPLAYNAME_LENGTH 128 // SCE_SAVE_DATA_SUBTITLE_MAXSIZE on PS4 +#define MAX_SAVEFILENAME_LENGTH 32 // SCE_SAVE_DATA_DIRNAME_DATA_MAXSIZE +#define USER_INDEX_ANY 0x000000FF +#define RESULT LONG + +class StringTable; + +typedef struct +{ + char UTF8SaveFilename[MAX_SAVEFILENAME_LENGTH]; + char UTF8SaveTitle[MAX_DISPLAYNAME_LENGTH]; + time_t modifiedTime; + PBYTE thumbnailData; + unsigned int thumbnailSize; + int blocksUsed; + //int sizeKB; +} +SAVE_INFO,*PSAVE_INFO; + +typedef struct +{ + int totalBlocksUsed; + int newSaveBlocksUsed; + int iSaveC; + PSAVE_INFO SaveInfoA; + PSAVE_INFO pCurrentSaveInfo; // Pointer to SAVE_INFO for the save that has just been loaded, or NULL if no save has been loaded (ie this is a newly created game) +} +SAVE_DETAILS,*PSAVE_DETAILS; + +class CONTENT_DATA +{ +public: + enum Type + { + e_contentLocked, + e_contentUnlocked + }; + int DeviceID; + DWORD dwContentType; + WCHAR wszDisplayName[256]; + CHAR szFileName[SCE_FIOS_PATH_MAX]; +}; + +typedef CONTENT_DATA XCONTENT_DATA, *PXCONTENT_DATA; // TODO - put back in when actually interfacing with game + +#define MARKETPLACE_CONTENTOFFER_INFO int + +// Current version of the dlc data creator +#define CURRENT_DLC_VERSION_NUM 3 + +// MGH - moved these here from Orbis_App.h +enum e_SONYDLCType +{ + eSONYDLCType_SkinPack=0, + eSONYDLCType_TexturePack, + eSONYDLCType_MashUpPack, + eSONYDLCType_All +}; + +typedef struct +{ + char chDLCKeyname[16+1]; // extra 1 for terminator + //char chDLCTitle[64]; + e_SONYDLCType eDLCType; + char chDLCPicname[16+1]; // extra 1 for terminator + int iFirstSkin; + int iConfig; // used for texture pack data files +#ifdef __ORBIS__ + PBYTE pbImageData; + DWORD dwImageBytes; +#endif +} +SONYDLC; + + +class C4JStorage +{ +public: + + struct PROFILESETTINGS + { + int iYAxisInversion; + int iControllerSensitivity; + int iVibration; + bool bSwapSticks; + }; + + // Structs defined in the DLC_Creator, but added here to be used in the app + typedef struct + { + unsigned int uiFileSize; + DWORD dwType; + DWORD dwWchCount; // count of WCHAR in next array + WCHAR wchFile[1]; + } + DLC_FILE_DETAILS, *PDLC_FILE_DETAILS; + + typedef struct + { + DWORD dwType; + DWORD dwWchCount; // count of WCHAR in next array; + WCHAR wchData[1]; // will be an array of size dwBytes + } + DLC_FILE_PARAM, *PDLC_FILE_PARAM; + // End of DLC_Creator structs + + typedef struct + { + DWORD dwVersion; + DWORD dwNewOffers; + DWORD dwTotalOffers; + DWORD dwInstalledTotalOffers; + BYTE bPadding[1024-sizeof(DWORD)*4]; // future expansion + } + DLC_TMS_DETAILS; + + typedef struct + { + DWORD dwSize; + PBYTE pbData; + } + TMSPP_FILEDATA, *PTMSPP_FILEDATA; + + enum eTMS_FILETYPEVAL + { + TMS_FILETYPE_BINARY=0, + TMS_FILETYPE_CONFIG=1, + TMS_FILETYPE_JSON=2, + TMS_FILETYPE_MAX, + }; + + enum eGlobalStorage + { + //eGlobalStorage_GameClip=0, + eGlobalStorage_Title=0, + eGlobalStorage_TitleUser, + eGlobalStorage_Max + }; + + enum EMessageResult + { + EMessage_Undefined=0, + EMessage_Busy, + EMessage_Pending, + EMessage_Cancelled, + EMessage_ResultAccept, + EMessage_ResultDecline, + EMessage_ResultThirdOption, + EMessage_ResultFourthOption + }; + + enum ESaveGameState + { + ESaveGame_Idle=0, + + ESaveGame_Save, + ESaveGame_SaveCompleteSuccess, + ESaveGame_SaveCompleteFail, + ESaveGame_SaveIncomplete, + ESaveGame_SaveIncomplete_WaitingOnResponse, + + ESaveGame_SaveSubfiles, + ESaveGame_SaveSubfilesCompleteSuccess, + ESaveGame_SaveSubfilesCompleteFail, + ESaveGame_SaveSubfilesIncomplete, + ESaveGame_SaveSubfilesIncomplete_WaitingOnResponse, + + ESaveGame_Load, + ESaveGame_LoadCompleteSuccess, + ESaveGame_LoadCompleteFail, + + ESaveGame_Delete, + ESaveGame_DeleteSuccess, + ESaveGame_DeleteFail, + + ESaveGame_Rename, + ESaveGame_RenameSuccess, + ESaveGame_RenameFail, + + ESaveGame_Copy, + ESaveGame_CopyCompleteSuccess, + ESaveGame_CopyCompleteFail, + ESaveGame_CopyCompleteFailQuota, + ESaveGame_CopyCompleteFailLocalStorage, + + ESaveGame_GetSaveThumbnail // Not used as an actual state in the PS4, but the game expects this to be returned to indicate success when getting a thumbnail + }; + + enum EOptionsState + { + EOptions_Idle=0, + EOptions_Save, + EOptions_Load, + EOptions_Delete, + EOptions_NoSpace, + EOptions_Corrupt, + }; + + enum ESaveGameStatus + { + EDeleteGame_Idle=0, + EDeleteGame_InProgress, + }; + + enum EDLCStatus + { + EDLC_Error=0, + EDLC_Idle, + EDLC_NoOffers, + EDLC_AlreadyEnumeratedAllOffers, + EDLC_NoInstalledDLC, + EDLC_Pending, + EDLC_LoadInProgress, + EDLC_Loaded, + EDLC_ChangedDevice + }; + + enum ESavingMessage + { + ESavingMessage_None=0, + ESavingMessage_Short, + ESavingMessage_Long + }; + + enum ESaveIncompleteType + { + ESaveIncomplete_None, + ESaveIncomplete_OutOfQuota, + ESaveIncomplete_OutOfLocalStorage, + ESaveIncomplete_Unknown + }; + + enum ETMSStatus + { + ETMSStatus_Idle=0, + ETMSStatus_Fail, + ETMSStatus_ReadInProgress, + ETMSStatus_ReadFileListInProgress, + ETMSStatus_WriteInProgress, + ETMSStatus_Fail_ReadInProgress, + ETMSStatus_Fail_ReadFileListInProgress, + ETMSStatus_Fail_ReadDetailsNotRetrieved, + ETMSStatus_Fail_WriteInProgress, + ETMSStatus_DeleteInProgress, + ETMSStatus_Pending, + }; + + enum eTMS_FileType + { + eTMS_FileType_Normal=0, + eTMS_FileType_Graphic, + }; + + enum ESGIStatus + { + ESGIStatus_Error=0, + ESGIStatus_Idle, + ESGIStatus_ReadInProgress, + ESGIStatus_NoSaves, + }; + + enum + { + PROFILE_READTYPE_ALL, + PROFILE_READTYPE_XBOXSETTINGS // just read the settings (after a notification of settings change) + }; + + enum eOptionsCallback + { + eOptions_Callback_Idle, + eOptions_Callback_Write, + eOptions_Callback_Write_Fail_NoSpace, + eOptions_Callback_Write_Fail, + eOptions_Callback_Read, + eOptions_Callback_Read_Fail, + eOptions_Callback_Read_FileNotFound, + eOptions_Callback_Read_Corrupt, + eOptions_Callback_Read_CorruptDeletePending, + eOptions_Callback_Read_CorruptDeleted + }; + + ///////////////////////////////////////////////////////////////////////////// Global storage manager ////////////////////////////////////////////////////////////////////////////// + + C4JStorage(); + void Tick(void); // General storage manager tick to be called from game + + ///////////////////////////////////////////////////////////////////////////// Savegame data /////////////////////////////////////////////////////////////////////////////////////// + + // Initialisation + void Init(unsigned int uiSaveVersion,LPCWSTR pwchDefaultSaveName,char *pszSavePackName,int iMinimumSaveSize, // General manager initialisation + int( *Func)(LPVOID, const ESavingMessage, int),LPVOID lpParam,LPCSTR szGroupID); + void SetGameSaveFolderTitle(WCHAR *wszGameSaveFolderTitle); // Sets the title to be set in the param.sfo of saves (this doesn't vary, the sub-title is used for the user cho + void SetSaveCacheFolderTitle(WCHAR *wszSaveCacheFolderTitle); // Sets the title to be set in the param.sfo of the save cache + void SetOptionsFolderTitle(WCHAR *wszOptionsFolderTitle); + void SetCorruptSaveName(WCHAR *wszCorruptSaveName); + // Sets the title to be set in the param.sfo of the options file + void SetGameSaveFolderPrefix(char *szGameSaveFolderPrefix); // Sets the prefix to be added to the unique filename of each save to construct a final folder name + void SetMaxSaves(int iMaxC); // Sets the maximum number of saves to be evaluated by GetSavesInfo etc. + void SetDefaultImages(PBYTE pbOptionsImage,DWORD dwOptionsImageBytes,PBYTE pbSaveImage,DWORD dwSaveImageBytes, // Sets default save image and thumbnail, which can be used when saving a game that hasn't generated any yet + PBYTE pbSaveThumbnail,DWORD dwSaveThumbnailBytes); + void SetIncompleteSaveCallback(void( *Func)(LPVOID, const ESaveIncompleteType, int blocksRequired), LPVOID param); // Sets callback to be used in the event of a save method not being able to complete + + // Miscellaneous control + void SetSaveDisabled(bool bDisable); // Sets saving disabled/enabled state + bool GetSaveDisabled(void); // Determines whether saving has been disabled + void ResetSaveData(); // Releases any internal storage being held for previously saved/loaded data + C4JStorage::ESaveGameState DoesSaveExist(bool *pbExists); // Determine if current savegame exists on storage device + bool EnoughSpaceForAMinSaveGame(); + C4JStorage::ESaveGameState GetSaveState(); + + // Get details of existing savedata + C4JStorage::ESaveGameState GetSavesInfo(int iPad,int ( *Func)(LPVOID lpParam,SAVE_DETAILS *pSaveDetails,const bool),LPVOID lpParam,char *pszSavePackName); // Start search + PSAVE_DETAILS ReturnSavesInfo(); // Returns result of search (or NULL if not yet received) + void ClearSavesInfo(); // Clears results + C4JStorage::ESaveGameState LoadSaveDataThumbnail(PSAVE_INFO pSaveInfo,int( *Func)(LPVOID lpParam,PBYTE pbThumbnail,DWORD dwThumbnailBytes), LPVOID lpParam); // Get the thumbnail for an individual save referenced by pSaveInfo + + // Loading savedata & obtaining information from just-loaded file + C4JStorage::ESaveGameState LoadSaveData(PSAVE_INFO pSaveInfo,int( *Func)(LPVOID lpParam,const bool, const bool), LPVOID lpParam); // Loads savedata referenced by pSaveInfo, calls callback once complete + unsigned int GetSaveSize(); // Obtains sizse of just-loaded save + void GetSaveData(void *pvData,unsigned int *puiBytes); // Obtains pointer to, and size, of just-loaded save + bool GetSaveUniqueNumber(INT *piVal); // Gets the unique numeric portion of the folder name used for the save (encodes m + bool GetSaveUniqueFilename(char *pszName); // Get the full unique "filename" used as part of the folder name for the savev + void SetSaveUniqueFilename(char *szFilename); + bool GetSaveUniqueFileDir(char *pszName); // Get the full unique "filename" used as part of the folder name for the save + + bool SaveGameDirMountExisting(char* pMountPoint); + bool SaveGameDirUnMount(const char* pMountPoint); + + + // Handling of sub-files (numerically indexed ) within the save + unsigned int GetSubfileCount(); // Get the number of sub-files in the just-loaded save + void ResetSubfiles(); // Reset storage manager's references to sub-files, to be called when we are finished with the save game + void GetSubfileDetails(int idx, unsigned int *subfileId, unsigned char **data, unsigned int *sizeOut); // Gets details for sub-file from 0 to GetSubfileCount() - 1. Caller is responsible for data allocation after this point. + void UpdateSubfile(int idx, unsigned char *data, unsigned int size); // Update internal details for a sub-file, from 0 to GetSubfileCount() - 1. + int AddSubfile(unsigned int subfileId); // Adds an additional sub-file with a given subfileId, returns index + C4JStorage::ESaveGameState SaveSubfiles(int( *Func)(LPVOID ,const bool),LPVOID lpParam); // Writes all modified sub-files, calling callback on completion + + // Saving savedata + void SetSaveTitle(const wchar_t *UTF16String); // Sets the name which is used as a sub-title in the savedata param.sfo + void SetSaveTitleExtraFileSuffix(const wchar_t *UTF16String); + PVOID AllocateSaveData(unsigned int uiBytes); // Allocate storage manager owned memory to the data which is to be saved to + void SetSaveDataSize(unsigned int uiBytes); // Set the actual size of data to be saved + void GetDefaultSaveImage(PBYTE *ppbSaveImage,DWORD *pdwSaveImageBytes); // Get the default save thumbnail (as set by SetDefaultImages) for use on saving games t + void GetDefaultSaveThumbnail(PBYTE *ppbSaveThumbnail,DWORD *pdwSaveThumbnailBytes); // Get the default save image (as set by SetDefaultImages) for use on saving games that + void SetSaveImages( PBYTE pbThumbnail,DWORD dwThumbnailBytes,PBYTE pbImage,DWORD dwImageBytes, PBYTE pbTextData ,DWORD dwTextDataBytes); // Sets the thumbnail & image for the save, optionally setting the metadata in the png + C4JStorage::ESaveGameState SaveSaveData(int( *Func)(LPVOID ,const bool),LPVOID lpParam); // Save the actual data, calling callback on completion + + // Handling of incomplete saves (either sub-files or save data). To be used after game has had callback for an incomplete save event + void ContinueIncompleteOperation(); + void CancelIncompleteOperation(); + + // Other file operations + C4JStorage::ESaveGameState DeleteSaveData(PSAVE_INFO pSaveInfo,int( *Func)(LPVOID lpParam,const bool), LPVOID lpParam); // Deletes savedata referenced by pSaveInfo, calls callback when comple + C4JStorage::ESaveGameState CopySaveData(PSAVE_INFO pSaveInfo,int( *Func)(LPVOID ,const bool,C4JStorage::ESaveGameState state),bool( *FuncProg)(LPVOID ,const int),LPVOID lpParam); // Copies savedata referenced by pSaveInfo, calls callback when complete, calls another callback for progress & handling cancellation + C4JStorage::ESaveGameState RenameSaveData(int iRenameIndex,uint16_t*pui16NewName,int( *Func)(LPVOID lpParam,const bool), LPVOID lpParam); // Renamed savedata with index from last established ReturnSavesInfo. + + // Internal methods +private: + void GetSaveImage(PBYTE *ppbSaveImage, int *puiSaveImageBytes); + void GetSaveThumbnail(PBYTE *ppbSaveThumbnail, int *puiSaveThumbnailBytes); + + ///////////////////////////////////////////////////////////////////////////// Profile data //////////////////////////////////////////////////////////////////////////////////////// +public: + // Initialisation + void InitialiseProfileData(unsigned short usProfileVersion, UINT uiProfileValuesC, UINT uiProfileSettingsC, DWORD *pdwProfileSettingsA, int iGameDefinedDataSizeX4, unsigned int *puiGameDefinedDataChangedBitmask); // General initialisation + int SetDefaultOptionsCallback(int( *Func)(LPVOID,PROFILESETTINGS *, const int iPad),LPVOID lpParam); // Set a callback that can initialise a profile's storage to its default settings + void SetOptionsDataCallback(int( *Func)(LPVOID, int iPad, unsigned short usVersion, C4JStorage::eOptionsCallback,int),LPVOID lpParam); // Sets callback that is called when status of any options has changed + void SetQuadrantUserIds(SceUserServiceUserId *aUserIds); // Set the user ids that we are referencing for each quadrant. Input is point to array of size MAX_SIGNED_IN_USERS. + int SetOldProfileVersionCallback(int( *Func)(LPVOID,unsigned char *, const unsigned short,const int),LPVOID lpParam); + + // Getting and setting of profile data + PROFILESETTINGS * GetDashboardProfileSettings(int iPad); // Get pointer to the standard (originally xbox dashboard) profile data for one user + void *GetGameDefinedProfileData(int iQuadrant); // Get pointer to the game-defined profile data for one user + + // Reading and writing profiles + void ReadFromProfile(int iQuadrant, int iReadType=PROFILE_READTYPE_ALL); // Initiate read profile data for one user - read type is ignored on this platform + void WriteToProfile(int iQuadrant, bool bGameDefinedDataChanged=false, bool bOverride5MinuteLimitOnProfileWrites=false); // Initiate write profile for one user + void DeleteOptionsData(int iPad); // Delete profile data for one user + void ForceQueuedProfileWrites(int iPad=XUSER_INDEX_ANY); // Force any queued profile writes to write now + + ///////////////////////////////////////////////////////////////////////////// Unimplemented stubs ///////////////////////////////////////////////////////////////////////////////// + void SetSaveDeviceSelected(unsigned int uiPad,bool bSelected) {} + bool GetSaveDeviceSelected(unsigned int iPad) { return true; } + void ClearDLCOffers() {} + C4JStorage::ETMSStatus ReadTMSFile(int iQuadrant,eGlobalStorage eStorageFacility,C4JStorage::eTMS_FileType eFileType, WCHAR *pwchFilename,BYTE **ppBuffer,DWORD *pdwBufferSize,int( *Func)(LPVOID, WCHAR *,int, bool, int),LPVOID lpParam, int iAction) { return C4JStorage::ETMSStatus_Idle; } + bool WriteTMSFile(int iQuadrant,eGlobalStorage eStorageFacility,WCHAR *pwchFilename,BYTE *pBuffer,DWORD dwBufferSize) { return true; } + bool DeleteTMSFile(int iQuadrant,eGlobalStorage eStorageFacility,WCHAR *pwchFilename) { return true; } + C4JStorage::EDLCStatus GetDLCOffers(int iPad,int( *Func)(LPVOID, int, DWORD, int),LPVOID lpParam, DWORD dwOfferTypesBitmaskT) { return C4JStorage::EDLC_Idle; } + + // DLC + // DLC + void SetDLCPackageRoot(char *pszDLCRoot); + EDLCStatus GetInstalledDLC(int iPad,int( *Func)(LPVOID, int, int),LPVOID lpParam); + CONTENT_DATA& GetDLC(DWORD dw); + DWORD GetAvailableDLCCount( int iPad ); + DWORD MountInstalledDLC(int iPad,DWORD dwDLC,int( *Func)(LPVOID, int, DWORD,DWORD),LPVOID lpParam,LPCSTR szMountDrive = NULL); + DWORD UnmountInstalledDLC(LPCSTR szMountDrive = NULL); + void GetMountedDLCFileList(const char* szMountDrive, std::vector& fileList); + std::string GetMountedPath(std::string szMount); + void SetDLCProductCode(const char* szProductCode); + void SetProductUpgradeKey(const char* szKey); + bool CheckForTrialUpgradeKey(void( *Func)(LPVOID, bool),LPVOID lpParam); + void SetDLCInfoMap(unordered_map* pSONYDLCMap); +}; + +extern C4JStorage StorageManager; diff --git a/Headers/PS3/4J_Input.h b/Headers/PS3/4J_Input.h new file mode 100644 index 0000000..6f51bba --- /dev/null +++ b/Headers/PS3/4J_Input.h @@ -0,0 +1,168 @@ +#pragma once + + +#define MAP_STYLE_0 0 +#define MAP_STYLE_1 1 +#define MAP_STYLE_2 2 + +#define _360_JOY_BUTTON_A 0x00000001 +#define _360_JOY_BUTTON_B 0x00000002 +#define _360_JOY_BUTTON_X 0x00000004 +#define _360_JOY_BUTTON_Y 0x00000008 + +#define _360_JOY_BUTTON_START 0x00000010 +#define _360_JOY_BUTTON_BACK 0x00000020 +#define _360_JOY_BUTTON_RB 0x00000040 +#define _360_JOY_BUTTON_LB 0x00000080 + +#define _360_JOY_BUTTON_RTHUMB 0x00000100 +#define _360_JOY_BUTTON_LTHUMB 0x00000200 +#define _360_JOY_BUTTON_DPAD_UP 0x00000400 +#define _360_JOY_BUTTON_DPAD_DOWN 0x00000800 + +#define _360_JOY_BUTTON_DPAD_LEFT 0x00001000 +#define _360_JOY_BUTTON_DPAD_RIGHT 0x00002000 +// fake digital versions of analog values +#define _360_JOY_BUTTON_LSTICK_RIGHT 0x00004000 +#define _360_JOY_BUTTON_LSTICK_LEFT 0x00008000 + +#define _360_JOY_BUTTON_RSTICK_DOWN 0x00010000 +#define _360_JOY_BUTTON_RSTICK_UP 0x00020000 +#define _360_JOY_BUTTON_RSTICK_RIGHT 0x00040000 +#define _360_JOY_BUTTON_RSTICK_LEFT 0x00080000 + +#define _360_JOY_BUTTON_LSTICK_DOWN 0x00100000 +#define _360_JOY_BUTTON_LSTICK_UP 0x00200000 +#define _360_JOY_BUTTON_RT 0x00400000 +#define _360_JOY_BUTTON_LT 0x00800000 + +// Stick axis maps - to allow changes for SouthPaw in-game axis mapping +#define AXIS_MAP_LX 0 +#define AXIS_MAP_LY 1 +#define AXIS_MAP_RX 2 +#define AXIS_MAP_RY 3 + +// Trigger map - to allow for swap triggers in-game +#define TRIGGER_MAP_0 0 +#define TRIGGER_MAP_1 1 + +class StringTable; + +typedef struct _STRING_VERIFY_RESPONSE +{ + WORD wNumStrings; + HRESULT *pStringResult; +} +STRING_VERIFY_RESPONSE; + +enum EKeyboardResult +{ + EKeyboard_Pending, + EKeyboard_Cancelled, + EKeyboard_ResultAccept, + EKeyboard_ResultDecline, +}; + +enum EMsgBoxResult +{ + EMsgBox_Undefined=0, + EMsgBox_Busy, + EMsgBox_Pending, + EMsgBox_Cancelled, + EMsgBox_ResultAccept, + EMsgBox_ResultDecline, + EMsgBox_ResultThirdOption, + EMsgBox_SysUtilBusy +}; + +enum EMSgBoxType +{ + EMSgBoxType_None, + EMSgBoxType_YesNo, + EMSgBoxType_OK, +}; + +class C_4JInput +{ +public: + + + enum EKeyboardMode + { + EKeyboardMode_Default, + EKeyboardMode_Numeric, + EKeyboardMode_Password, + EKeyboardMode_Alphabet, + EKeyboardMode_Full, + EKeyboardMode_Alphabet_Extended, + EKeyboardMode_IP_Address, + EKeyboardMode_Phone + }; + + void Initialise( int iInputStateC, unsigned char ucMapC,unsigned char ucActionC, unsigned char ucMenuActionC ); + void Tick(void); + void SetDeadzoneAndMovementRange(unsigned int uiDeadzone, unsigned int uiMovementRangeMax ); + void SetGameJoypadMaps(unsigned char ucMap,unsigned char ucAction,unsigned int uiActionVal); + unsigned int GetGameJoypadMaps(unsigned char ucMap,unsigned char ucAction); + void SetJoypadMapVal(int iPad,unsigned char ucMap); + unsigned char GetJoypadMapVal(int iPad); + void SetJoypadSensitivity(int iPad, float fSensitivity); + unsigned int GetValue(int iPad,unsigned char ucAction, bool bRepeat=false); + bool ButtonPressed(int iPad,unsigned char ucAction=255); // toggled + bool ButtonReleased(int iPad,unsigned char ucAction); //toggled + bool ButtonDown(int iPad,unsigned char ucAction=255); // button held down + // Functions to remap the axis and triggers for in-game (not menus) - SouthPaw, etc + void SetJoypadStickAxisMap(int iPad,unsigned int uiFrom, unsigned int uiTo); + void SetJoypadStickTriggerMap(int iPad,unsigned int uiFrom, unsigned int uiTo); + void SetKeyRepeatRate(float fRepeatDelaySecs,float fRepeatRateSecs); + void SetDebugSequence( const char *chSequenceA,int( *Func)(LPVOID),LPVOID lpParam ); + FLOAT GetIdleSeconds(int iPad); + bool IsPadConnected(int iPad); + bool IsCircleCrossSwapped(); + + // In-Game values which may have been remapped due to Southpaw, swap triggers, etc + float GetJoypadStick_LX(int iPad, bool bCheckMenuDisplay=true); + float GetJoypadStick_LY(int iPad, bool bCheckMenuDisplay=true); + float GetJoypadStick_RX(int iPad, bool bCheckMenuDisplay=true); + float GetJoypadStick_RY(int iPad, bool bCheckMenuDisplay=true); + unsigned char GetJoypadLTrigger(int iPad, bool bCheckMenuDisplay=true); + unsigned char GetJoypadRTrigger(int iPad, bool bCheckMenuDisplay=true); + + void SetMenuDisplayed(int iPad, bool bVal); + +// EKeyboardResult RequestKeyboard(UINT uiTitle, UINT uiText, UINT uiDesc, DWORD dwPad, WCHAR *pwchResult, UINT uiResultSize,int( *Func)(LPVOID,const bool),LPVOID lpParam,EKeyboardMode eMode,C4JStringTable *pStringTable=NULL); +// EKeyboardResult RequestKeyboard(UINT uiTitle, LPCWSTR pwchDefault, UINT uiDesc, DWORD dwPad, WCHAR *pwchResult, UINT uiResultSize,int( *Func)(LPVOID,const bool),LPVOID lpParam, EKeyboardMode eMode,C4JStringTable *pStringTable=NULL); + EKeyboardResult RequestKeyboard(LPCWSTR Title, LPCWSTR Text, DWORD dwPad, UINT uiMaxChars, int( *Func)(LPVOID,const bool),LPVOID lpParam,C_4JInput::EKeyboardMode eMode); + void DestroyKeyboard(); + void GetText(uint16_t *UTF16String); + + void SetLostInputControlCallback(void( *Func)(LPVOID, bool),LPVOID lpParam); + + + // Online check strings against offensive list - TCR 92 + // TCR # 092 CMTV Player Text String Verification + // Requirement Any player-entered text visible to another player on Xbox LIVE must be verified using the Xbox LIVE service before being transmitted. Text that is rejected by the Xbox LIVE service must not be displayed. + // + // Remarks + // This requirement applies to any player-entered string that can be exposed to other players on Xbox LIVE. It includes session names, content descriptions, text messages, tags, team names, mottos, comments, and so on. + // + // Games may decide to not send the text, blank it out, or use generic text if the text was rejected by the Xbox LIVE service. + // + // Games verify the text by calling the XStringVerify function. + // + // Exemption It is not required to use the Xbox LIVE service to verify real-time text communication. An example of real-time text communication is in-game text chat. + // + // Intent Protect players from inappropriate language. + bool VerifyStrings(WCHAR **pwStringA,int iStringC,int( *Func)(LPVOID,STRING_VERIFY_RESPONSE *),LPVOID lpParam); + void CancelQueuedVerifyStrings(int( *Func)(LPVOID,STRING_VERIFY_RESPONSE *),LPVOID lpParam); + void CancelAllVerifyInProgress(void); + + //bool InputDetected(DWORD dwUserIndex,WCHAR *pwchInput); + + // Messages box functions + EMsgBoxResult RequestMessageBox(EMSgBoxType eType, DWORD dwPad,void( *Func)(int iButtonType,void *pvUserData),LPVOID lpParam, const char *pchText ,unsigned int uiFocusButton ); + +}; + +// Singleton +extern C_4JInput InputManager; diff --git a/Headers/PS3/4J_Profile.h b/Headers/PS3/4J_Profile.h new file mode 100644 index 0000000..888c38c --- /dev/null +++ b/Headers/PS3/4J_Profile.h @@ -0,0 +1,158 @@ +#pragma once + +enum eAwardType +{ + eAwardType_Achievement = 0, + eAwardType_GamerPic, + eAwardType_Theme, + eAwardType_AvatarItem, +}; + +enum eUpsellType +{ + eUpsellType_Custom = 0, // This is the default, and means that the upsell dialog was initiated in the app code + eUpsellType_Achievement, + eUpsellType_GamerPic, + eUpsellType_Theme, + eUpsellType_AvatarItem, +}; + +enum eUpsellResponse +{ + eUpsellResponse_Declined, + eUpsellResponse_Accepted_NoPurchase, + eUpsellResponse_Accepted_Purchase, + eUpsellResponse_UserNotSignedInPSN, + eUpsellResponse_NotAllowedOnline +}; + + + +class C_4JProfile +{ +public: + + + + // 4 players have game defined data, puiGameDefinedDataChangedBitmask needs to be checked by the game side to see if there's an update needed - it'll have the bits set for players to be updated + void Initialise( const SceNpCommunicationId* commsId, + const SceNpCommunicationSignature* commsSig, + unsigned short usProfileVersion, + UINT uiProfileValuesC, + UINT uiProfileSettingsC, + DWORD *pdwProfileSettingsA, + int iGameDefinedDataSizeX4, + unsigned int *puiGameDefinedDataChangedBitmask); + void InitialiseTrophies(const SceNpCommunicationId* commsId, const SceNpCommunicationSignature* commsSig); + int WaitTrophyInitComplete(); + int tryWaitTrophyInitComplete(); + void SetTrialTextStringTable(CXuiStringTable *pStringTable,int iAccept,int iReject); + void SetTrialAwardText(eAwardType AwardType,int iTitle,int iText); // achievement popup in the trial game + int GetLockedProfile(); + void SetLockedProfile(int iProf); + bool IsSignedIn(int iQuadrant); + bool IsSignedInLive(int iProf); + bool IsGuest(int iQuadrant); + UINT RequestSignInUI(bool bFromInvite,bool bLocalGame,bool bNoGuestsAllowed,bool bMultiplayerSignIn,bool bAddUser, int( *Func)(LPVOID,const bool, const int iPad),LPVOID lpParam,int iQuadrant=XUSER_INDEX_ANY); + UINT DisplayOfflineProfile(int( *Func)(LPVOID,const bool, const int iPad),LPVOID lpParam,int iQuadrant=XUSER_INDEX_ANY); + UINT RequestConvertOfflineToGuestUI(int( *Func)(LPVOID,const bool, const int iPad),LPVOID lpParam,int iQuadrant=XUSER_INDEX_ANY); + void SetPrimaryPlayerChanged(bool bVal); + bool QuerySigninStatus(void); + void GetSceNpId(int iPad, SceNpId *npId); + void GetXUID(int iPad, PlayerUID *pXuid,bool bOnlineXuid); + BOOL AreXUIDSEqual(PlayerUID xuid1,PlayerUID xuid2); + BOOL XUIDIsGuest(PlayerUID xuid); + bool AllowedToPlayMultiplayer(int iProf); + void StartTrialGame(); // disables saves and leaderboard, and change state to readyforgame from pregame + void AllowedPlayerCreatedContent(int iPad, bool thisQuadrantOnly, BOOL *allAllowed, BOOL *friendsAllowed); + BOOL CanViewPlayerCreatedContent(int iPad, bool thisQuadrantOnly, PPlayerUID pXuids, DWORD dwXuidCount ); + bool GetProfileAvatar(int iPad,int( *Func)(LPVOID lpParam,PBYTE pbThumbnail,DWORD dwThumbnailBytes), LPVOID lpParam); + void CancelProfileAvatarRequest(); + + void SetGetStringFunc(LPCWSTR ( *Func)(int)); + void SetPlayerListTitleID(int id); + void SetFatalTrophyErrorID(int id); + void SetSignInQuestionID(int id); + + // SYS + int GetPrimaryPad(); + void SetPrimaryPad(int iPad); + char* GetGamertag(int iPad); + wstring GetDisplayName(int iPad); + bool IsFullVersion(); + void SetFullVersion(bool bFull); + void SetSignInChangeCallback(void ( *Func)(LPVOID, bool, unsigned int),LPVOID lpParam); + void SetNotificationsCallback(void ( *Func)(LPVOID, DWORD, unsigned int),LPVOID lpParam); + bool RegionIsNorthAmerica(void); + bool LocaleIsUSorCanada(void); + HRESULT GetLiveConnectionStatus(); + bool IsSystemUIDisplayed(); + void SetProfileReadErrorCallback(void ( *Func)(LPVOID), LPVOID lpParam); + + void SetHDDFreeKB(int iHDDFreeKB); + void SetMinSaveKB(int iMinSaveKB); + int GetHDDFreeKB(void); + + + + // PROFILE DATA +// int SetDefaultOptionsCallback(int( *Func)(LPVOID,PROFILESETTINGS *, const int iPad),LPVOID lpParam); +// int SetOldProfileVersionCallback(int( *Func)(LPVOID,unsigned char *, const unsigned short,const int),LPVOID lpParam); +// PROFILESETTINGS * GetDashboardProfileSettings(int iPad); +// void WriteToProfile(int iQuadrant, bool bGameDefinedDataChanged=false, bool bOverride5MinuteLimitOnProfileWrites=false); +// void ForceQueuedProfileWrites(int iPad=XUSER_INDEX_ANY); +// void *GetGameDefinedProfileData(int iQuadrant); + + void ResetProfileProcessState(); // after a sign out from the primary player, call this + void Tick( void ); + + // ACHIEVEMENTS & AWARDS + + void RegisterAward(int iAwardNumber,int iGamerconfigID, eAwardType eType, bool bLeaderboardAffected=false, + CXuiStringTable*pStringTable=NULL, int iTitleStr=-1, int iTextStr=-1, int iAcceptStr=-1, char *pszThemeName=NULL, unsigned int uiThemeSize=0L); + int GetAwardId(int iAwardNumber); + eAwardType GetAwardType(int iAwardNumber); + bool CanBeAwarded(int iQuadrant, int iAwardNumber); + void Award(int iQuadrant, int iAwardNumber, bool bForce=false); + bool IsAwardsFlagSet(int iQuadrant, int iAward); + void Terminate(); + + // RICH PRESENCE + void RichPresenceRegisterPresenceString(int index, const char* str); + void RichPresenceRegisterContext(int ctxID, const char* token); + void RichPresenceRegisterContextString(int ctxID, int strIndex, const char* str); + + void RichPresenceInit(int iPresenceCount, int iContextCount); + void SetRichPresenceContextValue(int iPad,int iContextID, int iVal); + void SetCurrentGameActivity(int iPad,int iNewPresence, bool bSetOthersToIdle=false); + void SetRichPresenceSettingFn(int ( *SetPresenceInfoFn)(const void *data, unsigned int options)); + + // PURCHASE + void DisplayFullVersionPurchase(bool bRequired, int iQuadrant, int iUpsellParam = -1); + void SetUpsellCallback(void ( *Func)(LPVOID lpParam, eUpsellType type, eUpsellResponse response, int iUserData),LPVOID lpParam); + + // Debug +// void SetDebugFullOverride(bool bVal); // To override the license version (trail/full). Only in debug/release, not ContentPackage + void SetNetworkStatus(int status); + + DWORD GetSignedInUsersMask(); + + // PS3 chat and content restrictions + bool GetChatAndContentRestrictions(int iPad, bool thisQuadrantOnly,bool *pbChatRestricted,bool *pbContentRestricted,int *piAge); + void SetServiceID(char *pchServiceID); // needed for the ticket request for the chat restrictions of secondary PSN players + void HandleNetworkTicket(int result,void *arg); + void SetMinimumAge(int iAge, int iRegion);// 0 - SCEE, 1- SCEA, 2 - SCEJ + + void SetGermanyMinimumAge(int iAge); + void SetRussiaMinimumAge(int iAge); + void SetAustraliaMinimumAge(int iAge); + + // Http calls + bool SonyHttp_init(); + void SonyHttp_shutdown(); + bool SonyHttp_getDataFromURL(const char* szURL, void** ppOutData, int* pDataSize); +}; + +// Singleton +extern C_4JProfile ProfileManager; + diff --git a/Headers/PS3/4J_Render.h b/Headers/PS3/4J_Render.h new file mode 100644 index 0000000..d55f440 --- /dev/null +++ b/Headers/PS3/4J_Render.h @@ -0,0 +1,318 @@ +#pragma once +#include + +class ImageFileBuffer +{ +public: + enum EImageType + { + e_typePNG, + e_typeJPG + }; + + EImageType m_type; + void* m_pBuffer; + int m_bufferSize; + + int GetType() { return m_type; } + void *GetBufferPointer() { return m_pBuffer; } + int GetBufferSize() { return m_bufferSize; } + void Release() { delete m_pBuffer; m_pBuffer = NULL; } + bool Allocated() { return m_pBuffer != NULL; } +}; + +typedef struct +{ + int Width; + int Height; +}D3DXIMAGE_INFO; + +typedef struct _XSOCIAL_PREVIEWIMAGE { + BYTE *pBytes; + DWORD Pitch; + DWORD Width; + DWORD Height; +// D3DFORMAT Format; +} XSOCIAL_PREVIEWIMAGE, *PXSOCIAL_PREVIEWIMAGE; + +class C4JRender +{ +public: + void Tick(); + void UpdateGamma(unsigned short usGamma); + + // Matrix stack + void MatrixMode(int type); + void MatrixSetIdentity(); + void MatrixTranslate(float x,float y,float z); + void MatrixRotate(float angle, float x, float y, float z); + void MatrixScale(float x, float y, float z); + void MatrixPerspective(float fovy, float aspect, float zNear, float zFar); + void MatrixOrthogonal(float left,float right,float bottom,float top,float zNear,float zFar); + void MatrixPop(); + void MatrixPush(); + void MatrixMult(float *mat); + const float *MatrixGet(int type); + void Set_matrixDirty(); + + // Core + void Initialise(); + void InitialiseContext(); + void StartFrame(); + void Present(); + void Clear(int flags, D3D11_RECT *pRect = NULL); + void SetClearColour(const float colourRGBA[4]); + bool IsWidescreen(); + bool IsHiDef(); + void CaptureThumbnail(ImageFileBuffer* pngOut, ImageFileBuffer* saveGamePngOut); + void CaptureSaveGameImage(ImageFileBuffer* pngOut); + void CaptureScreen(ImageFileBuffer* jpgOut, XSOCIAL_PREVIEWIMAGE *previewOut); + void BeginConditionalSurvey(int identifier); + void EndConditionalSurvey(); + void BeginConditionalRendering(int identifier); + void EndConditionalRendering(); + + // Vertex data handling + typedef enum + { + VERTEX_TYPE_PF3_TF2_CB4_NB4_XW1, // Position 3 x float, texture 2 x float, colour 4 x byte, normal 4 x byte, padding 1 DWORD + VERTEX_TYPE_COMPRESSED, // Compressed format - see comment at top of VS_PS3_TS2_CS1.hlsl for description of layout + VERTEX_TYPE_PF3_TF2_CB4_NB4_XW1_LIT, // as VERTEX_TYPE_PF3_TF2_CB4_NB4_XW1 with lighting applied, + VERTEX_TYPE_PF3_TF2_CB4_NB4_XW1_TEXGEN, // as VERTEX_TYPE_PF3_TF2_CB4_NB4_XW1 with tex gen + VERTEX_TYPE_Gamma, // as VERTEX_TYPE_PF3_TF2_CB4_NB4_XW1 with tex gen + VERTEX_TYPE_COUNT + } eVertexType; + + // Pixel shader + typedef enum + { + PIXEL_SHADER_TYPE_STANDARD, + PIXEL_SHADER_TYPE_PROJECTION, + PIXEL_SHADER_TYPE_STANDARD_COMPRESSED, + PIXEL_SHADER_TYPE_DEBUG, + PIXEL_SHADER_TYPE_Gamma, + PIXEL_SHADER_COUNT + } ePixelShaderType; + + typedef enum + { + VIEWPORT_TYPE_FULLSCREEN, + VIEWPORT_TYPE_SPLIT_TOP, + VIEWPORT_TYPE_SPLIT_BOTTOM, + VIEWPORT_TYPE_SPLIT_LEFT, + VIEWPORT_TYPE_SPLIT_RIGHT, + VIEWPORT_TYPE_QUADRANT_TOP_LEFT, + VIEWPORT_TYPE_QUADRANT_TOP_RIGHT, + VIEWPORT_TYPE_QUADRANT_BOTTOM_LEFT, + VIEWPORT_TYPE_QUADRANT_BOTTOM_RIGHT, + } eViewportType; + + typedef enum + { + PRIMITIVE_TYPE_TRIANGLE_LIST, + PRIMITIVE_TYPE_TRIANGLE_STRIP, + PRIMITIVE_TYPE_TRIANGLE_FAN, + PRIMITIVE_TYPE_QUAD_LIST, + PRIMITIVE_TYPE_LINE_LIST, + PRIMITIVE_TYPE_LINE_STRIP, + PRIMITIVE_TYPE_COUNT + } ePrimitiveType; + + void DrawVertices(ePrimitiveType PrimitiveType, int count, void *dataIn, eVertexType vType, C4JRender::ePixelShaderType psType); + void DrawVertexBuffer(ePrimitiveType PrimitiveType, int count, ID3D11Buffer *buffer, C4JRender::eVertexType vType, C4JRender::ePixelShaderType psType); + + // Command buffers + void CBuffLockStaticCreations(); + int CBuffCreate(int count); + void CBuffDelete(int first, int count); + void CBuffStart(int index); + void CBuffClear(int index); + int CBuffSize(int index); + void CBuffEnd(); + bool CBuffCall(int index, bool full = true); + void CBuffCallMultiple(int* indexArray, int numIndices); + void CBuffCallMultipleConditional(int* indexArray, int numIndices, int chunkLists, int condLists); + void CBuffCallMultipleConditionalAlpha(int* indexArray, int numIndices, int chunkLists, int condLists); + void CBuffTick(); + void CBuffDeferredModeStart(); + void CBuffDeferredModeEnd(); + + typedef enum + { + TEXTURE_FORMAT_RxGyBzAw, // Normal 32-bit RGBA texture, 8 bits per component + /* Don't think these are all directly available on D3D 11 - leaving for now + TEXTURE_FORMAT_R0G0B0Ax, // One 8-bit component mapped to alpha channel, R=G=B=0 + TEXTURE_FORMAT_R1G1B1Ax, // One 8-bit component mapped to alpha channel, R=G=B=1 + TEXTURE_FORMAT_RxGxBxAx, // One 8-bit component mapped to all channels + */ + MAX_TEXTURE_FORMATS + } eTextureFormat; + + // Textures + int TextureCreate(); + void TextureFree(int idx); + void TextureBind(int idx); + void TextureBindVertex(int idx); + void TextureSetTextureLevels(int levels); + int TextureGetTextureLevels(); + void TextureData(int width, int height, void *data, int level, eTextureFormat format = TEXTURE_FORMAT_RxGyBzAw); + void TextureDataUpdate(int xoffset, int yoffset, int width, int height, void *data, int level); + void TextureSetParam(int param, int value); + void TextureDynamicUpdateStart(); + void TextureDynamicUpdateEnd(); + HRESULT LoadTextureData(const char *szFilename,D3DXIMAGE_INFO *pSrcInfo, int **ppDataOut); + HRESULT LoadTextureData(BYTE *pbData, DWORD dwBytes,D3DXIMAGE_INFO *pSrcInfo, int **ppDataOut); + HRESULT LoadTextureDataJPG(BYTE *pbData, DWORD dwBytes,D3DXIMAGE_INFO *pSrcInfo, int **ppDataOut); + HRESULT SaveTextureData(const char *szFilename, D3DXIMAGE_INFO *pSrcInfo, int *ppDataOut); + void TextureGetStats(); + CellGcmTexture *TextureGetTexture(int idx); + + void* allocIOMem(const size_t size,const size_t alignment = 16); + void freeIOMem(void* mem); + + void* allocVRAM(const size_t size,const size_t alignment = 16); + void freeVRAM(void* mem); + CellGcmSurface* getCurrentBackBufferSurface(); + void setTileInfo(const void* mem, uint32_t pitch, uint8_t comp, uint8_t bank = 0); + + // State control + void StateSetColour(float r, float g, float b, float a); + void StateSetDepthMask(bool enable); + void StateSetBlendEnable(bool enable); + void StateSetBlendFunc(int src, int dst); + void StateSetBlendFactor(unsigned int colour); + void StateSetAlphaFunc(int func, float param); + void StateSetDepthFunc(int func); + void StateSetFaceCull(bool enable); + void StateSetFaceCullCW(bool cw); + void StateSetLineWidth(float width); + void StateSetWriteEnable(bool red, bool green, bool blue, bool alpha); + void StateSetDepthTestEnable(bool enable); + void StateSetAlphaTestEnable(bool enable); + void StateSetDepthSlopeAndBias(float slope, float bias); + void StateSetFogEnable(bool enable); + void StateSetFogMode(int mode); + void StateSetFogNearDistance(float dist); + void StateSetFogFarDistance(float dist); + void StateSetFogDensity(float density); + void StateSetFogColour(float red, float green, float blue); + void StateSetLightingEnable(bool enable); + void StateSetVertexTextureUV( float u, float v); + void StateSetLightColour(int light, float red, float green, float blue); + void StateSetLightAmbientColour(float red, float green, float blue); + void StateSetLightDirection(int light, float x, float y, float z); + void StateSetLightEnable(int light, bool enable); + void StateSetViewport(eViewportType viewportType); + void StateSetEnableViewportClipPlanes(bool enable); + void StateSetTexGenCol(int col, float x, float y, float z, float w, bool eyeSpace); + void StateSetForceLOD(int LOD); + void StateSetStencil(uint32_t func, uint32_t ref, uint32_t mask); + + // Event tracking + void BeginEvent(LPCWSTR eventName); + void EndEvent(); + + void SetupConditionalPass1(int lists); + void SetupConditionalPass2(int lists); + void EndConditional(); +}; + + +const int GL_MODELVIEW_MATRIX = 0; +const int GL_PROJECTION_MATRIX = 1; +const int GL_MODELVIEW = 0; +const int GL_PROJECTION = 1; +const int GL_TEXTURE = 2; + +// These things required for tex gen + +const int GL_S = 0; +const int GL_T = 1; +const int GL_R = 2; +const int GL_Q = 3; + +const int GL_TEXTURE_GEN_S = 0; +const int GL_TEXTURE_GEN_T = 1; +const int GL_TEXTURE_GEN_Q = 2; +const int GL_TEXTURE_GEN_R = 3; + +const int GL_TEXTURE_GEN_MODE = 0; +const int GL_OBJECT_LINEAR = 0; +const int GL_EYE_LINEAR = 1; +const int GL_OBJECT_PLANE = 0; +const int GL_EYE_PLANE = 1; + + +// These things are used by glEnable/glDisable so must be different and non-zero (zero is used by things we haven't assigned yet) +const int GL_TEXTURE_2D = 1; +const int GL_BLEND = 2; +const int GL_CULL_FACE = 3; +const int GL_ALPHA_TEST = 4; +const int GL_DEPTH_TEST = 5; +const int GL_FOG = 6; +const int GL_LIGHTING = 7; +const int GL_LIGHT0 = 8; +const int GL_LIGHT1 = 9; + +const int CLEAR_DEPTH_FLAG = 1; +const int CLEAR_COLOUR_FLAG = 2; +const int CLEAR_STENCIL_FLAG = 4; + + +const int GL_DEPTH_BUFFER_BIT = CLEAR_DEPTH_FLAG; +const int GL_COLOR_BUFFER_BIT = CLEAR_COLOUR_FLAG; + +const int GL_SRC_ALPHA = CELL_GCM_SRC_ALPHA; +const int GL_ONE_MINUS_SRC_ALPHA = CELL_GCM_ONE_MINUS_SRC_ALPHA; +const int GL_ONE = CELL_GCM_ONE; +const int GL_ZERO = CELL_GCM_ZERO; +const int GL_DST_ALPHA = CELL_GCM_DST_ALPHA; +const int GL_SRC_COLOR = CELL_GCM_SRC_COLOR; +const int GL_DST_COLOR = CELL_GCM_DST_COLOR; +const int GL_ONE_MINUS_DST_COLOR = CELL_GCM_ONE_MINUS_DST_COLOR; +const int GL_ONE_MINUS_SRC_COLOR = CELL_GCM_ONE_MINUS_SRC_COLOR; +const int GL_CONSTANT_ALPHA = CELL_GCM_CONSTANT_ALPHA; +const int GL_ONE_MINUS_CONSTANT_ALPHA = CELL_GCM_ONE_MINUS_CONSTANT_ALPHA; + +const int GL_GREATER = CELL_GCM_GREATER; +const int GL_EQUAL = CELL_GCM_EQUAL; +const int GL_LEQUAL = CELL_GCM_LEQUAL; +const int GL_GEQUAL = CELL_GCM_GEQUAL; +const int GL_ALWAYS = CELL_GCM_ALWAYS; + +const int GL_TEXTURE_MIN_FILTER = 1; +const int GL_TEXTURE_MAG_FILTER = 2; +const int GL_TEXTURE_WRAP_S = 3; +const int GL_TEXTURE_WRAP_T = 4; + +const int GL_NEAREST = 0; +const int GL_LINEAR = 1; +const int GL_EXP = 2; +const int GL_NEAREST_MIPMAP_LINEAR = 0; // TODO - mipmapping bit of this + +const int GL_CLAMP = 0; +const int GL_REPEAT = 1; + +const int GL_FOG_START = 1; +const int GL_FOG_END = 2; +const int GL_FOG_MODE = 3; +const int GL_FOG_DENSITY = 4; +const int GL_FOG_COLOR = 5; + +const int GL_POSITION = 1; +const int GL_AMBIENT = 2; +const int GL_DIFFUSE = 3; +const int GL_SPECULAR = 4; + +const int GL_LIGHT_MODEL_AMBIENT = 1; + +const int GL_LINES = C4JRender::PRIMITIVE_TYPE_LINE_LIST; +const int GL_LINE_STRIP = C4JRender::PRIMITIVE_TYPE_LINE_STRIP; +const int GL_QUADS = C4JRender::PRIMITIVE_TYPE_QUAD_LIST; +const int GL_TRIANGLE_FAN = C4JRender::PRIMITIVE_TYPE_TRIANGLE_FAN; +const int GL_TRIANGLE_STRIP = C4JRender::PRIMITIVE_TYPE_TRIANGLE_STRIP; + +// Singleton +extern C4JRender RenderManager; + + diff --git a/Headers/PS3/4J_Storage.h b/Headers/PS3/4J_Storage.h new file mode 100644 index 0000000..3950bba --- /dev/null +++ b/Headers/PS3/4J_Storage.h @@ -0,0 +1,434 @@ +#pragma once +using namespace std; +#include +#include +#include + + +#define MAX_DISPLAYNAME_LENGTH 128 // CELL_SAVEDATA_SYSP_SUBTITLE_SIZE on PS3 +#define MAX_DETAILS_LENGTH 128 // CELL_SAVEDATA_SYSP_SUBTITLE_SIZE on PS3 +#define MAX_SAVEFILENAME_LENGTH 32 // CELL_SAVEDATA_DIRNAME_SIZE +#define USER_INDEX_ANY 0x000000FF +#define RESULT LONG + +class StringTable; + +typedef struct +{ + char UTF8SaveFilename[MAX_SAVEFILENAME_LENGTH]; + char UTF8SaveTitle[MAX_DISPLAYNAME_LENGTH]; + time_t modifiedTime; + //int sizeKB; +} +SAVE_INFO,*PSAVE_INFO; + +typedef struct +{ + int iSaveC; + PSAVE_INFO SaveInfoA; +} +SAVE_DETAILS,*PSAVE_DETAILS; + +class CONTENT_DATA +{ +public: + int DeviceID; + DWORD dwContentType; + WCHAR szDisplayName[256]; + char d_name[CELL_FS_MAX_FS_FILE_NAME_LENGTH + 1]; + CHAR szFileName[CELL_FS_MAX_FS_PATH_LENGTH]; + //CHAR szHDDFileName[CELL_FS_MAX_FS_PATH_LENGTH]; // if we are running from bluray, the keys for DLC will be in the HDD path, but the DLC will be on the bluray +}; + +typedef CONTENT_DATA XCONTENT_DATA, *PXCONTENT_DATA; + +#define MARKETPLACE_CONTENTOFFER_INFO int + +// Current version of the dlc data creator +#define CURRENT_DLC_VERSION_NUM 3 + +class C4JStorage +{ + +public: + struct PROFILESETTINGS + { + int iYAxisInversion; + int iControllerSensitivity; + int iVibration; + bool bSwapSticks; + }; + + + // Structs defined in the DLC_Creator, but added here to be used in the app + typedef struct + { + unsigned int uiFileSize; + DWORD dwType; + DWORD dwWchCount; // count of WCHAR in next array + WCHAR wchFile[1]; + } + DLC_FILE_DETAILS, *PDLC_FILE_DETAILS; + + typedef struct + { + DWORD dwType; + DWORD dwWchCount; // count of WCHAR in next array; + WCHAR wchData[1]; // will be an array of size dwBytes + } + DLC_FILE_PARAM, *PDLC_FILE_PARAM; + // End of DLC_Creator structs + + + + // structure to hold DLC info in TMS + +typedef struct + { + DWORD dwVersion; + DWORD dwNewOffers; + DWORD dwTotalOffers; + DWORD dwInstalledTotalOffers; + BYTE bPadding[1024-sizeof(DWORD)*4]; // future expansion + } + DLC_TMS_DETAILS; + + enum eGTS_FileTypes + { + eGTS_Type_Skin=0, + eGTS_Type_Cape, + eGTS_Type_MAX + }; + + enum eGlobalStorage + { + //eGlobalStorage_GameClip=0, + eGlobalStorage_Title=0, + eGlobalStorage_TitleUser, + eGlobalStorage_Max + }; + + enum EMessageResult + { + EMessage_Undefined=0, + EMessage_Busy, + EMessage_Pending, + EMessage_Cancelled, + EMessage_ResultAccept, + EMessage_ResultDecline, + EMessage_ResultThirdOption, + EMessage_ResultFourthOption + }; + + enum ESaveGameState + { + ESaveGame_Idle=0, + ESaveGame_Save, + ESaveGame_InternalRequestingDevice, + ESaveGame_InternalGetSaveName, + ESaveGame_InternalSaving, + ESaveGame_CopySave, + ESaveGame_CopyingSave, + ESaveGame_Load, + ESaveGame_GetSavesInfo, + ESaveGame_GetSaveThumbnail, + ESaveGame_Rename, + ESaveGame_RenameComplete, + ESaveGame_Delete, + ESaveGame_DeleteComplete, + // Cache file + ESaveGame_ReadCacheFile, + ESaveGame_WriteCacheFile, + ESaveGame_NoSpace, + }; + + enum EOptionsState + { + EOptions_Idle=0, + EOptions_Save, + EOptions_Load, + EOptions_Delete, + EOptions_NoSpace, + EOptions_Corrupt, + }; + +/* enum ELoadGameStatus + { + ELoadGame_Idle=0, + ELoadGame_Loading, + ELoadGame_NoSaves, + ELoadGame_ChangedDevice, + ELoadGame_DeviceRemoved + };*/ + + enum ESaveGameStatus + { + EDeleteGame_Idle=0, + EDeleteGame_InProgress, + }; + + + enum ESGIStatus + { + ESGIStatus_Error=0, + ESGIStatus_Idle, + ESGIStatus_ReadInProgress, + ESGIStatus_NoSaves, + }; + + enum EDLCStatus + { + EDLC_Error=0, + EDLC_Idle, + EDLC_NoOffers, + EDLC_AlreadyEnumeratedAllOffers, + EDLC_NoInstalledDLC, + EDLC_Pending, + EDLC_LoadInProgress, + EDLC_Loaded, + EDLC_ChangedDevice + }; + + enum ESavingMessage + { + ESavingMessage_None=0, + ESavingMessage_Short, + ESavingMessage_Long + }; + + enum ETMSStatus + { + ETMSStatus_Idle=0, + ETMSStatus_Fail, + ETMSStatus_ReadInProgress, + ETMSStatus_ReadFileListInProgress, + ETMSStatus_WriteInProgress, + ETMSStatus_Fail_ReadInProgress, + ETMSStatus_Fail_ReadFileListInProgress, + ETMSStatus_Fail_ReadDetailsNotRetrieved, + ETMSStatus_Fail_WriteInProgress, + ETMSStatus_DeleteInProgress, + ETMSStatus_Pending, + }; + + enum eTMS_FileType + { + eTMS_FileType_Normal=0, + eTMS_FileType_Graphic, + }; + + enum eTMS_FILETYPEVAL + { + TMS_FILETYPE_BINARY=0, + TMS_FILETYPE_CONFIG=1, + TMS_FILETYPE_JSON=2, + TMS_FILETYPE_MAX, + }; + enum eTMS_UGCTYPE + { + TMS_UGCTYPE_NONE, + TMS_UGCTYPE_IMAGE, + TMS_UGCTYPE_MAX + }; + + enum + { + PROFILE_READTYPE_ALL, + PROFILE_READTYPE_XBOXSETTINGS // just read the settings (after a notification of settings change) + }; + + enum eOptionsCallback + { + eOptions_Callback_Idle, + eOptions_Callback_Write, + eOptions_Callback_Write_Fail_NoSpace, + eOptions_Callback_Write_Fail, + eOptions_Callback_Read, + eOptions_Callback_Read_Fail, + eOptions_Callback_Read_FileNotFound, + eOptions_Callback_Read_Corrupt, + eOptions_Callback_Read_CorruptDeletePending, + eOptions_Callback_Read_CorruptDeleted + }; + + typedef struct + { + CHAR szFilename[256]; + int iFileSize; + eTMS_FILETYPEVAL eFileTypeVal; + } + TMSPP_FILE_DETAILS, *PTMSPP_FILE_DETAILS; + + typedef struct + { + int iCount; + PTMSPP_FILE_DETAILS FileDetailsA; + } + TMSPP_FILE_LIST, *PTMSPP_FILE_LIST; + + typedef struct + { + DWORD dwSize; + PBYTE pbData; + } + TMSPP_FILEDATA, *PTMSPP_FILEDATA; + + typedef struct + { + WCHAR wchDisplayName[XCONTENT_MAX_DISPLAYNAME_LENGTH]; + CHAR szFileName[XCONTENT_MAX_FILENAME_LENGTH]; + DWORD dwImageOffset; + DWORD dwImageBytes; + } + CACHEINFOSTRUCT; + + + // On PS3 the user profile data is stored in a file, so moving this to the storage library rather than the profile library + C4JStorage( ); + + void ExitRequest(void (*ExitCompleteFn)() ); + + void SetSecureID(char *pchSecureID); + void Tick(void); + + // Messages + C4JStorage::EMessageResult RequestMessageBox(UINT uiTitle, UINT uiText, UINT *uiOptionA,UINT uiOptionC, DWORD dwPad=USER_INDEX_ANY, + int( *Func)(LPVOID,int,const C4JStorage::EMessageResult)=NULL,LPVOID lpParam=NULL, StringTable *pStringTable=NULL, WCHAR *pwchFormatString=NULL,DWORD dwFocusButton=0); + + + C4JStorage::EMessageResult GetMessageBoxResult(); + + // save device + bool SetSaveDevice(int( *Func)(LPVOID,const bool),LPVOID lpParam, bool bForceResetOfSaveDevice=false); + + // savegame + void Init(unsigned int uiSaveVersion,LPCWSTR pwchDefaultSaveName,char *pszSavePackName,int iMinimumSaveSize,int( *Func)(LPVOID, const ESavingMessage, int),LPVOID lpParam,LPCSTR szGroupID); + void InitialiseProfileData(unsigned short usProfileVersion, + UINT uiProfileValuesC, + UINT uiProfileSettingsC, + DWORD *pdwProfileSettingsA, + int iGameDefinedDataSizeX4, + unsigned int *puiGameDefinedDataChangedBitmask); + + void ResetSaveData(); // Call before a new save to clear out stored save file name + void SetDefaultSaveNameForKeyboardDisplay(LPCWSTR pwchDefaultSaveName); + void SetGameSaveFolderTitle(WCHAR *wszGameSaveFolderTitle); + void SetSaveCacheFolderTitle(WCHAR *wszSaveCacheFolderTitle); + void SetOptionsFolderTitle(WCHAR *wszOptionsFolderTitle); + void SetGameSaveFolderPrefix(char *szGameSaveFolderPrefix); + void SetMaxSaves(int iMaxC); + void SetSaveTitle(const wchar_t *UTF16String); + uint16_t * GetSaveTitle(); + bool GetSaveUniqueNumber(INT *piVal); + bool GetSaveUniqueFilename(char *pszName); + bool GetSaveUniqueFileDir(char *pszName); + void SetSaveUniqueFilename(char *szFilename); + void SetState(ESaveGameState eState,int( *Func)(LPVOID,const bool),LPVOID lpParam); + void SetSaveDisabled(bool bDisable); + bool GetSaveDisabled(void); + unsigned int GetSaveSize(); + void SetSaveImages( PBYTE pbThumbnail,DWORD dwThumbnailBytes,PBYTE pbImage,DWORD dwImageBytes, PBYTE pbTextData ,DWORD dwTextDataBytes); + void SetDefaultSaveImage(); // MGH - added for remote storage compress, we can't get the save image back to overwrite, so set it to the default + + void DeleteOptionsData(int iPad); + + C4JStorage::ESaveGameState GetSaveState(); + + // Get the info for the saves + C4JStorage::ESaveGameState GetSavesInfo(int iPad,int ( *Func)(LPVOID lpParam,SAVE_DETAILS *pSaveDetails,const bool),LPVOID lpParam,char *pszSavePackName); + PSAVE_DETAILS ReturnSavesInfo(); + void ClearSavesInfo(); + // Load the save. Need to call GetSaveData once the callback is called + C4JStorage::ESaveGameState LoadSaveData(PSAVE_INFO pSaveInfo,int( *Func)(LPVOID lpParam,const bool, const bool), LPVOID lpParam, bool bIgnoreCRC = false); // MGH - added bIgnoreCRC for remote save stuff + C4JStorage::ESaveGameState DeleteSaveData(PSAVE_INFO pSaveInfo,int( *Func)(LPVOID lpParam,const bool), LPVOID lpParam); + C4JStorage::ESaveGameState RenameSaveData(int iRenameIndex,uint16_t*pui16NewName,int( *Func)(LPVOID lpParam,const bool), LPVOID lpParam); + C4JStorage::ESaveGameState LoadSaveDataThumbnail(PSAVE_INFO pSaveInfo,int( *Func)(LPVOID lpParam,PBYTE pbThumbnail,DWORD dwThumbnailBytes), LPVOID lpParam); + + void GetSaveData(void *pvData,unsigned int *puiBytes); + PVOID AllocateSaveData(unsigned int uiBytes); + void SetSaveData(void *data, unsigned int uiBytes); + void FreeSaveData(); + void SetSaveDataSize(unsigned int uiBytes); // after a successful compression, update the size of the gamedata + + //void SaveSaveData(unsigned int uiBytes,PBYTE pbThumbnail=NULL,DWORD cbThumbnail=0,PBYTE pbTextData=NULL, DWORD dwTextLen=0); + C4JStorage::ESaveGameState SaveSaveData(int( *Func)(LPVOID ,const bool),LPVOID lpParam, bool bDataFileOnly = false); + void CopySaveDataToNewSave(PBYTE pbThumbnail,DWORD cbThumbnail,WCHAR *wchNewName,int ( *Func)(LPVOID lpParam, bool), LPVOID lpParam); + void SetSaveDeviceSelected(unsigned int uiPad,bool bSelected); + bool GetSaveDeviceSelected(unsigned int iPad); + C4JStorage::ESaveGameState DoesSaveExist(bool *pbExists); + bool EnoughSpaceForAMinSaveGame(); + + void GetSaveImage(PBYTE *ppbSaveImage, int *puiSaveImageBytes); + void GetSaveThumbnail(PBYTE *ppbSaveThumbnail, int *puiSaveThumbnailBytes); + + + + void SetSaveMessageVPosition(float fY); // The 'Saving' message will display at a default position unless changed + + void SetMessageBoxCallback( int (*Func)(UINT uiTitle, UINT uiText, UINT *uiOptionA, UINT uiOptionC, DWORD dwPad, int(*Func)(LPVOID,int,const C4JStorage::EMessageResult), LPVOID lpParam) ); + + // string table for all the Storage problems. Loaded by the application + StringTable *m_pStringTable; + + // TODO + + void RegisterMarketplaceCountsCallback(int ( *Func)(LPVOID lpParam, C4JStorage::DLC_TMS_DETAILS *, int), LPVOID lpParam ) {} + void SetDLCPackageRoot(char *pszDLCRoot); + C4JStorage::EDLCStatus GetDLCOffers(int iPad,int( *Func)(LPVOID, int, DWORD, int),LPVOID lpParam, DWORD dwOfferTypesBitmaskT) { return C4JStorage::EDLC_Idle; } + DWORD CancelGetDLCOffers() { return 0; } + void ClearDLCOffers() {} + MARKETPLACE_CONTENTOFFER_INFO& GetOffer(DWORD dw) { static MARKETPLACE_CONTENTOFFER_INFO retval = {0}; return retval; } + int GetOfferCount() { return 0; } + DWORD InstallOffer(int iOfferIDC,ULONGLONG *ullOfferIDA,int( *Func)(LPVOID, int, int),LPVOID lpParam, bool bTrial) { return 0; } + DWORD GetAvailableDLCCount( int iPad); + CONTENT_DATA& GetDLC(DWORD dw); + C4JStorage::EDLCStatus GetInstalledDLC(int iPad,int( *Func)(LPVOID, int, int),LPVOID lpParam); + DWORD MountInstalledDLC(int iPad,DWORD dwDLC,int( *Func)(LPVOID, int, DWORD,DWORD),LPVOID lpParam,LPCSTR szMountDrive = NULL); + DWORD UnmountInstalledDLC(LPCSTR szMountDrive = NULL); + void GetMountedDLCFileList(const char* szMountDrive, std::vector& fileList); + std::string GetMountedPath(std::string szMount); + C4JStorage::ETMSStatus ReadTMSFile(int iQuadrant,eGlobalStorage eStorageFacility,C4JStorage::eTMS_FileType eFileType, WCHAR *pwchFilename,BYTE **ppBuffer,DWORD *pdwBufferSize,int( *Func)(LPVOID, WCHAR *,int, bool, int),LPVOID lpParam, int iAction) { return C4JStorage::ETMSStatus_Idle; } + bool WriteTMSFile(int iQuadrant,eGlobalStorage eStorageFacility,WCHAR *pwchFilename,BYTE *pBuffer,DWORD dwBufferSize) { return true; } + bool DeleteTMSFile(int iQuadrant,eGlobalStorage eStorageFacility,WCHAR *pwchFilename) { return true; } + void StoreTMSPathName(WCHAR *pwchName) {} + unsigned int CRC(unsigned char *buf, int len) { return 0; } + void SetDLCProductCode(const char* szProductCode,const char* szDiscPatchProductCode); + void SetProductUpgradeKey(const char* szKey); + void SetBootTypeDisc(bool bDisc); // true if booting from disc, false if booting from HDD + bool GetBootTypeDisc(); + void SetBDPatchUsrDir(char *path); + + bool CheckForTrialUpgradeKey(void( *Func)(LPVOID, bool),LPVOID lpParam); + + C4JStorage::ETMSStatus TMSPP_ReadFile(int iPad,C4JStorage::eGlobalStorage eStorageFacility,C4JStorage::eTMS_FILETYPEVAL eFileTypeVal,LPCSTR szFilename,int( *Func)(LPVOID,int,int,PTMSPP_FILEDATA, LPCSTR)/*=NULL*/,LPVOID lpParam/*=NULL*/, int iUserData/*=0*/) {return C4JStorage::ETMSStatus_Idle;} + + // PROFILE DATA + int SetDefaultOptionsCallback(int( *Func)(LPVOID,PROFILESETTINGS *, const int iPad),LPVOID lpParam); + int SetOldProfileVersionCallback(int( *Func)(LPVOID,unsigned char *, const unsigned short,const int),LPVOID lpParam); + PROFILESETTINGS * GetDashboardProfileSettings(int iPad); + void WriteToProfile(int iQuadrant, bool bGameDefinedDataChanged=false, bool bOverride5MinuteLimitOnProfileWrites=false); + void ReadFromProfile(int iQuadrant, int iReadType=PROFILE_READTYPE_ALL); + void ForceQueuedProfileWrites(int iPad=XUSER_INDEX_ANY); + void *GetGameDefinedProfileData(int iQuadrant); + void SetContinueWithoutSavingMessage(char *szMessage); + void SetDefaultImages(PBYTE pbOptionsImage,DWORD dwOptionsImageBytes,PBYTE pbSaveImage,DWORD dwSaveImageBytes,PBYTE pbSaveThumbnail,DWORD dwSaveThumbnailBytes); + void GetDefaultSaveImage(PBYTE *ppbSaveImage,DWORD *pdwSaveImageBytes); + void GetDefaultSaveThumbnail(PBYTE *ppbSaveThumbnail,DWORD *pdwSaveThumbnailBytes); + void SetOptionsDataCallback(int( *Func)(LPVOID, int iPad, unsigned short usVersion, C4JStorage::eOptionsCallback),LPVOID lpParam); + + void SetTrialAwardsFlag(int iQuadrant,int iAward); + void ClearTrialAwardsFlag(int iQuadrant,int iAward); + bool IsTrialAwardsFlagSet(int iQuadrant, int iAward); + + + // Save icon + void SetSaveLoadIcon(PBYTE pbIcon,DWORD dwIconBytes); + + // system ui is up? - need to avoid displaying errors needing user input + void SetSystemUIDisplaying(bool bVal); + bool GetSystemUIDisplaying(void); + + +}; + +extern C4JStorage StorageManager; diff --git a/Headers/PSVita/4J_Input.h b/Headers/PSVita/4J_Input.h new file mode 100644 index 0000000..c0209eb --- /dev/null +++ b/Headers/PSVita/4J_Input.h @@ -0,0 +1,177 @@ +#pragma once + +#include +#include + +#define MAP_STYLE_0 0 +#define MAP_STYLE_1 1 +#define MAP_STYLE_2 2 + +#define _360_JOY_BUTTON_A 0x00000001 +#define _360_JOY_BUTTON_B 0x00000002 +#define _360_JOY_BUTTON_X 0x00000004 +#define _360_JOY_BUTTON_Y 0x00000008 + +#define _360_JOY_BUTTON_START 0x00000010 +#define _360_JOY_BUTTON_BACK 0x00000020 +#define _360_JOY_BUTTON_RB 0x00000040 +#define _360_JOY_BUTTON_LB 0x00000080 + +#define _360_JOY_BUTTON_RTHUMB 0x00000100 +#define _360_JOY_BUTTON_LTHUMB 0x00000200 +#define _360_JOY_BUTTON_DPAD_UP 0x00000400 +#define _360_JOY_BUTTON_DPAD_DOWN 0x00000800 + +#define _360_JOY_BUTTON_DPAD_LEFT 0x00001000 +#define _360_JOY_BUTTON_DPAD_RIGHT 0x00002000 +// fake digital versions of analog values +#define _360_JOY_BUTTON_LSTICK_RIGHT 0x00004000 +#define _360_JOY_BUTTON_LSTICK_LEFT 0x00008000 + +#define _360_JOY_BUTTON_RSTICK_DOWN 0x00010000 +#define _360_JOY_BUTTON_RSTICK_UP 0x00020000 +#define _360_JOY_BUTTON_RSTICK_RIGHT 0x00040000 +#define _360_JOY_BUTTON_RSTICK_LEFT 0x00080000 + +#define _360_JOY_BUTTON_LSTICK_DOWN 0x00100000 +#define _360_JOY_BUTTON_LSTICK_UP 0x00200000 +#define _360_JOY_BUTTON_RT 0x00400000 +#define _360_JOY_BUTTON_LT 0x00800000 + +// PSVita equivalents + +#define _PSV_JOY_BUTTON_X _360_JOY_BUTTON_A +#define _PSV_JOY_BUTTON_O _360_JOY_BUTTON_B +#define _PSV_JOY_BUTTON_SQUARE _360_JOY_BUTTON_X +#define _PSV_JOY_BUTTON_TRIANGLE _360_JOY_BUTTON_Y +#define _PSV_JOY_BUTTON_START _360_JOY_BUTTON_START +#define _PSV_JOY_BUTTON_SELECT _360_JOY_BUTTON_BACK +#define _PSV_JOY_BUTTON_R1 _360_JOY_BUTTON_RB +#define _PSV_JOY_BUTTON_L1 _360_JOY_BUTTON_LB +#define _PSV_JOY_BUTTON_R3 _360_JOY_BUTTON_RTHUMB +#define _PSV_JOY_BUTTON_L3 _360_JOY_BUTTON_LTHUMB +#define _PSV_JOY_BUTTON_DPAD_UP _360_JOY_BUTTON_DPAD_UP +#define _PSV_JOY_BUTTON_DPAD_DOWN _360_JOY_BUTTON_DPAD_DOWN +#define _PSV_JOY_BUTTON_DPAD_LEFT _360_JOY_BUTTON_DPAD_LEFT +#define _PSV_JOY_BUTTON_DPAD_RIGHT _360_JOY_BUTTON_DPAD_RIGHT +#define _PSV_JOY_BUTTON_LSTICK_RIGHT _360_JOY_BUTTON_LSTICK_RIGHT +#define _PSV_JOY_BUTTON_LSTICK_LEFT _360_JOY_BUTTON_LSTICK_LEFT +#define _PSV_JOY_BUTTON_RSTICK_DOWN _360_JOY_BUTTON_RSTICK_DOWN +#define _PSV_JOY_BUTTON_RSTICK_UP _360_JOY_BUTTON_RSTICK_UP +#define _PSV_JOY_BUTTON_RSTICK_RIGHT _360_JOY_BUTTON_RSTICK_RIGHT +#define _PSV_JOY_BUTTON_RSTICK_LEFT _360_JOY_BUTTON_RSTICK_LEFT +#define _PSV_JOY_BUTTON_LSTICK_DOWN _360_JOY_BUTTON_LSTICK_DOWN +#define _PSV_JOY_BUTTON_LSTICK_UP _360_JOY_BUTTON_LSTICK_UP +#define _PSV_JOY_BUTTON_R2 _360_JOY_BUTTON_RT +#define _PSV_JOY_BUTTON_L2 _360_JOY_BUTTON_LT + + +// Stick axis maps - to allow changes for SouthPaw in-game axis mapping +#define AXIS_MAP_LX 0 +#define AXIS_MAP_LY 1 +#define AXIS_MAP_RX 2 +#define AXIS_MAP_RY 3 + +// Trigger map - to allow for swap triggers in-game +#define TRIGGER_MAP_0 0 +#define TRIGGER_MAP_1 1 + +enum EKeyboardResult +{ + EKeyboard_Pending, + EKeyboard_Cancelled, + EKeyboard_ResultAccept, + EKeyboard_ResultDecline, +}; + +typedef struct _STRING_VERIFY_RESPONSE +{ + WORD wNumStrings; + HRESULT *pStringResult; +} +STRING_VERIFY_RESPONSE; + +class C_4JInput +{ +public: + + + enum EKeyboardMode + { + EKeyboardMode_Default, + EKeyboardMode_Numeric, + EKeyboardMode_Password, + EKeyboardMode_Alphabet, + EKeyboardMode_Full, + EKeyboardMode_Alphabet_Extended, + EKeyboardMode_IP_Address, + EKeyboardMode_Phone + }; + + void Initialise( int iInputStateC, unsigned char ucMapC,unsigned char ucActionC, unsigned char ucMenuActionC ); + void Tick(void); + void SetDeadzoneAndMovementRange(unsigned int uiDeadzone, unsigned int uiMovementRangeMax ); + void SetGameJoypadMaps(unsigned char ucMap,unsigned char ucAction,unsigned int uiActionVal); + unsigned int GetGameJoypadMaps(unsigned char ucMap,unsigned char ucAction); + void SetJoypadMapVal(int iPad,unsigned char ucMap); + unsigned char GetJoypadMapVal(int iPad); + void SetJoypadSensitivity(int iPad, float fSensitivity); + unsigned int GetValue(int iPad,unsigned char ucAction, bool bRepeat=false); + bool ButtonPressed(int iPad,unsigned char ucAction=255); // toggled + bool ButtonReleased(int iPad,unsigned char ucAction); //toggled + bool ButtonDown(int iPad,unsigned char ucAction=255); // button held down + // Functions to remap the axis and triggers for in-game (not menus) - SouthPaw, etc + void SetJoypadStickAxisMap(int iPad,unsigned int uiFrom, unsigned int uiTo); + void SetJoypadStickTriggerMap(int iPad,unsigned int uiFrom, unsigned int uiTo); + void SetKeyRepeatRate(float fRepeatDelaySecs,float fRepeatRateSecs); + void SetDebugSequence( const char *chSequenceA,int( *Func)(LPVOID),LPVOID lpParam ); + FLOAT GetIdleSeconds(int iPad); + bool IsPadConnected(int iPad); + void SetCircleCrossSwapped(bool swapped); + bool IsCircleCrossSwapped(); + + // Map touch input to buttons + void MapTouchInput(int iPad, unsigned int uiActionVal); + + // In-Game values which may have been remapped due to Southpaw, swap triggers, etc + float GetJoypadStick_LX(int iPad, bool bCheckMenuDisplay=true); + float GetJoypadStick_LY(int iPad, bool bCheckMenuDisplay=true); + float GetJoypadStick_RX(int iPad, bool bCheckMenuDisplay=true); + float GetJoypadStick_RY(int iPad, bool bCheckMenuDisplay=true); + unsigned char GetJoypadLTrigger(int iPad, bool bCheckMenuDisplay=true); + unsigned char GetJoypadRTrigger(int iPad, bool bCheckMenuDisplay=true); + + SceTouchData* GetTouchPadData(int iPad, bool bCheckMenuDisplay); + + void SetMenuDisplayed(int iPad, bool bVal); + +// EKeyboardResult RequestKeyboard(UINT uiTitle, UINT uiText, UINT uiDesc, DWORD dwPad, WCHAR *pwchResult, UINT uiResultSize,int( *Func)(LPVOID,const bool),LPVOID lpParam,EKeyboardMode eMode,C4JStringTable *pStringTable=NULL); +// EKeyboardResult RequestKeyboard(UINT uiTitle, LPCWSTR pwchDefault, UINT uiDesc, DWORD dwPad, WCHAR *pwchResult, UINT uiResultSize,int( *Func)(LPVOID,const bool),LPVOID lpParam, EKeyboardMode eMode,C4JStringTable *pStringTable=NULL); + EKeyboardResult RequestKeyboard(LPCWSTR Title, LPCWSTR Text, DWORD dwPad, UINT uiMaxChars, int( *Func)(LPVOID,const bool),LPVOID lpParam,C_4JInput::EKeyboardMode eMode); + void GetText(uint16_t *UTF16String); + + // Online check strings against offensive list - TCR 92 + // TCR # 092 CMTV Player Text String Verification + // Requirement Any player-entered text visible to another player on Xbox LIVE must be verified using the Xbox LIVE service before being transmitted. Text that is rejected by the Xbox LIVE service must not be displayed. + // + // Remarks + // This requirement applies to any player-entered string that can be exposed to other players on Xbox LIVE. It includes session names, content descriptions, text messages, tags, team names, mottos, comments, and so on. + // + // Games may decide to not send the text, blank it out, or use generic text if the text was rejected by the Xbox LIVE service. + // + // Games verify the text by calling the XStringVerify function. + // + // Exemption It is not required to use the Xbox LIVE service to verify real-time text communication. An example of real-time text communication is in-game text chat. + // + // Intent Protect players from inappropriate language. + bool VerifyStrings(WCHAR **pwStringA,int iStringC,int( *Func)(LPVOID,STRING_VERIFY_RESPONSE *),LPVOID lpParam); + void CancelQueuedVerifyStrings(int( *Func)(LPVOID,STRING_VERIFY_RESPONSE *),LPVOID lpParam); + void CancelAllVerifyInProgress(void); + + bool IsVitaTV(); + + //bool InputDetected(DWORD dwUserIndex,WCHAR *pwchInput); +}; + +// Singleton +extern C_4JInput InputManager; diff --git a/Headers/PSVita/4J_Profile.h b/Headers/PSVita/4J_Profile.h new file mode 100644 index 0000000..ab6b613 --- /dev/null +++ b/Headers/PSVita/4J_Profile.h @@ -0,0 +1,264 @@ +#pragma once +#include +#include +#include +#include + +using namespace sce::Toolkit::NP; +using namespace sce::Toolkit::NP::Utilities; + +class CXuiStringTable; + +// Note - there are now 3 types of PlayerUID +// (1) A full online ID - either the primary login, or a sub-signin through to PSN. This has m_onlineID set up as a normal SceNpOnlineId, with dummy[0] set to 0 +// (2) An offline ID, where there is also a primary login on the system. This has m_onlineID set up to copy the primary SceNpOnlineId, except with dummy[0] set to the controller ID of this other player +// (3) An offline ID, where there isn't a primary PSN login on the system. This has SceNpOnlineId fully zeroed. + +class PlayerUID +{ + char m_onlineID[SCE_NP_ONLINEID_MAX_LENGTH]; + char term; + bool m_bSignedIntoPSN : 1; + unsigned char m_quadrant : 2; + uint8_t m_macAddress[SCE_NET_ETHER_ADDR_LEN]; + int m_userID; // user logged on to the XMB + +public: + + class Hash + { + public: + std::size_t operator()(const PlayerUID& k) const; + }; + + PlayerUID(); + PlayerUID(int userID, SceNpOnlineId& onlineID, bool bSignedInPSN, int quadrant); + PlayerUID(std::wstring fromString); + + bool operator==(const PlayerUID& rhs) const; + bool operator!=(const PlayerUID& rhs); + void setCurrentMacAddress(); + std::wstring macAddressStr() const; + std::wstring userIDStr() const; + std::wstring toString() const; + void setOnlineID(SceNpOnlineId& id, bool bSignedIntoPSN); + void setUserID(unsigned int id); + + + const char* getOnlineID() const { return m_onlineID; } + int getUserID() const { return m_userID; } + int getQuadrant() const { return m_quadrant; } + bool isPrimaryUser() const; // only true if we're on the local machine and signed into the first quadrant; + bool isSignedIntoPSN() const { return m_bSignedIntoPSN; } + void setForAdhoc(); +private: +}; + +typedef PlayerUID *PPlayerUID; + +class GameSessionUID +{ + char m_onlineID[SCE_NP_ONLINEID_MAX_LENGTH]; + char term; + bool m_bSignedIntoPSN : 1; + unsigned char m_quadrant : 2; +public: + GameSessionUID(); + GameSessionUID(int nullVal); + + bool operator==(const GameSessionUID& rhs) const; + bool operator!=(const GameSessionUID& rhs); + GameSessionUID& operator=(const PlayerUID& rhs); + + const char* getOnlineID() const { return m_onlineID; } + int getQuadrant() const { return m_quadrant; } + bool isSignedIntoPSN() const { return m_bSignedIntoPSN; } + void setForAdhoc(); + +}; + +enum eAwardType +{ + eAwardType_Achievement = 0, + eAwardType_GamerPic, + eAwardType_Theme, + eAwardType_AvatarItem, +}; + +enum eUpsellType +{ + eUpsellType_Custom = 0, // This is the default, and means that the upsell dialog was initiated in the app code + eUpsellType_Achievement, + eUpsellType_GamerPic, + eUpsellType_Theme, + eUpsellType_AvatarItem, +}; + +enum eUpsellResponse +{ + eUpsellResponse_Declined, + eUpsellResponse_Accepted_NoPurchase, + eUpsellResponse_Accepted_Purchase, + eUpsellResponse_UserNotSignedInPSN +}; + +class C_4JProfile +{ +public: + + ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + // INIT + ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + // 4 players have game defined data, puiGameDefinedDataChangedBitmask needs to be checked by the game side to see if there's an update needed - it'll have the bits set for players to be updated + void Initialise( const SceNpCommunicationConfig _commsId, + const std::string _serviceID, + unsigned short usProfileVersion, + UINT uiProfileValuesC, + UINT uiProfileSettingsC, + DWORD *pdwProfileSettingsA, + int iGameDefinedDataSizeX4, + unsigned int *puiGameDefinedDataChangedBitmask); + + ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + // SIGN-IN/USERS + ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + bool IsSignedIn(int iQuadrant); + bool IsSignedInLive(int iProf); + bool IsSignedInPSN(int iProf); + bool IsGuest(int iQuadrant); + UINT RequestSignInUI(bool bFromInvite,bool bLocalGame,bool bNoGuestsAllowed,bool bMultiplayerSignIn,bool bAddUser, int( *Func)(LPVOID,const bool, const int iPad),LPVOID lpParam,int iQuadrant=XUSER_INDEX_ANY); + UINT DisplayOfflineProfile(int( *Func)(LPVOID,const bool, const int iPad),LPVOID lpParam,int iQuadrant=XUSER_INDEX_ANY); + UINT RequestConvertOfflineToGuestUI(int( *Func)(LPVOID,const bool, const int iPad),LPVOID lpParam,int iQuadrant=XUSER_INDEX_ANY); + void SetPrimaryPlayerChanged(bool bVal); + bool QuerySigninStatus(void); + void GetXUID(int iPad, PlayerUID *pXuid,bool bOnlineXuid); + BOOL AreXUIDSEqual(PlayerUID xuid1,PlayerUID xuid2); + void GetSceNpId(int iPad, SceNpId *npId); + DWORD GetSignedInUsersMask(); + void SetNetworkStatus(bool bOnlinePSN, bool bSignedInPSN); + + ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + // MISC + ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + int GetLockedProfile(); + void SetLockedProfile(int iProf); + void SetGetStringFunc(LPCWSTR ( *Func)(int)); + void SetPlayerListTitleID(int id); + bool AllowedToPlayMultiplayer(int iProf); + bool HasPlayStationPlus(int iProf); + void StartTrialGame(); // disables saves and leaderboard, and change state to readyforgame from pregame + void AllowedPlayerCreatedContent(int iPad, bool thisQuadrantOnly, BOOL *allAllowed, BOOL *friendsAllowed); + BOOL CanViewPlayerCreatedContent(int iPad, bool thisQuadrantOnly, PPlayerUID pXuids, DWORD dwXuidCount ); + void ResetProfileProcessState(); // after a sign out from the primary player, call this + void Tick( void ); + + ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + // AVATAR + ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + typedef struct + { + int iPad; + int ( *m_fnFunc)(LPVOID lpParam,PBYTE pbThumbnail,DWORD dwThumbnailBytes); + LPVOID m_fnFunc_Param; + } + FUNCPARAMS; + bool GetProfileAvatar(int iPad,int( *Func)(LPVOID lpParam,PBYTE pbThumbnail,DWORD dwThumbnailBytes), LPVOID lpParam); + void CancelProfileAvatarRequest(); + + ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + // SYS + ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + int GetPrimaryPad(); + void SetPrimaryPad(int iPad); + char* GetGamertag(int iPad); + std::wstring GetDisplayName(int iPad); + + bool IsFullVersion(); + void SetFullVersion(bool bFull); + void SetSignInChangeCallback(void ( *Func)(LPVOID, bool, unsigned int),LPVOID lpParam); + void SetNotificationsCallback(void ( *Func)(LPVOID, DWORD, unsigned int),LPVOID lpParam); + bool RegionIsNorthAmerica(void); + bool LocaleIsUSorCanada(void); + HRESULT GetLiveConnectionStatus(); + bool IsSystemUIDisplayed(); + void SetSysUIShowing( bool bUIDisplayed ); + void DisplaySystemMessage( SceMsgDialogSystemMessageType _type, int iQuadrant); + void SetProfileReadErrorCallback(void ( *Func)(LPVOID), LPVOID lpParam); + void ShowSystemMessage( int _type, int _val ); + + ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + // ACHIEVEMENTS & AWARDS + ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + void InitialiseTrophies(); //CD - Don't use this, auto setup after login + void RegisterAward(int iAwardNumber,int iGamerconfigID, eAwardType eType, bool bLeaderboardAffected=false, + CXuiStringTable*pStringTable=NULL, int iTitleStr=-1, int iTextStr=-1, int iAcceptStr=-1, char *pszThemeName=NULL, unsigned int uiThemeSize=0L); + int GetAwardId(int iAwardNumber); + eAwardType GetAwardType(int iAwardNumber); + bool CanBeAwarded(int iQuadrant, int iAwardNumber); + void Award(int iQuadrant, int iAwardNumber, bool bForce=false); + bool IsAwardsFlagSet(int iQuadrant, int iAward); + void Terminate(); + void SetFatalTrophyErrorID(int id); //CD - Deprecated + int WaitTrophyInitComplete(); //CD - Deprecated + int tryWaitTrophyInitComplete(); //CD - Deprecated + void SetTrialTextStringTable(CXuiStringTable *pStringTable,int iAccept,int iReject); + void SetTrialAwardText(eAwardType AwardType,int iTitle,int iText); // achievement popup in the trial game + void SetHDDFreeKB(int iHDDFreeKB); + void SetMinSaveKB(int iMinSaveKB); + int GetHDDFreeKB(void); + bool AreTrophiesInstalled(); + + ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + // RICH PRESENCE + ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + void RichPresenceRegisterPresenceString(int index, const char* str); + void RichPresenceRegisterContext(int ctxID, const char* token); + void RichPresenceRegisterContextString(int ctxID, int strIndex, const char* str); + void RichPresenceInit(int iPresenceCount, int iContextCount); + void SetRichPresenceContextValue(int iPad,int iContextID, int iVal); + void SetCurrentGameActivity(int iPad,int iNewPresence, bool bSetOthersToIdle=false); + void SetRichPresenceSettingFn(int ( *SetPresenceInfoFn)(const void *data)); + + ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + // PURCHASE + ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + void DisplayFullVersionPurchase(bool bRequired, int iQuadrant, int iUpsellParam = -1); + void SetUpsellCallback(void ( *Func)(LPVOID lpParam, eUpsellType type, eUpsellResponse response, int iUserData),LPVOID lpParam); + + ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + // Debug + ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + void SetDebugFullOverride(bool bVal); // To override the license version (trail/full). Only in debug/release, not ContentPackage + + ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + // Chat and content restrictions + ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + bool GetChatAndContentRestrictions(int iPad, bool thisQuadrantOnly,bool *pbChatRestricted,bool *pbContentRestricted,int *piAge); + void SetServiceID(char *pchServiceID); // needed for the ticket request for the chat restrictions of secondary PSN players + void HandleNetworkTicket(int result,void *arg); + void SetMinimumAge(int iAge, int iRegion);// 0 - SCEE, 1- SCEA, 2 - SCEJ + int GetMinimumAge(); + void SetGermanyMinimumAge(int iAge); + int GetGermanyMinimumAge(); + void SetRussiaMinimumAge(int iAge); + int GetRussiaMinimumAge(); + void SetAustraliaMinimumAge(int iAge); + int GetAustraliaMinimumAge(); + void SetJapanMinimumAge(int iAge); + int GetJapanMinimumAge(); + void SetKoreaMinimumAge(int iAge); + int GetKoreaMinimumAge(); + int getUserID(int iQuadrant); // grab the PS4 userID for this quadrant (SCE_USER_SERVICE_USER_ID_INVALID if it's not signed in) + + ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + // Http calls + ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + bool SonyHttp_init(); + void SonyHttp_shutdown(); + bool SonyHttp_getDataFromURL(const char* szURL, void** ppOutData, int* pDataSize); + +}; + +// Singleton +extern C_4JProfile ProfileManager; + diff --git a/Headers/PSVita/4J_Render.h b/Headers/PSVita/4J_Render.h new file mode 100644 index 0000000..b08c9fb --- /dev/null +++ b/Headers/PSVita/4J_Render.h @@ -0,0 +1,326 @@ +#pragma once + +#include + + + +class ImageFileBuffer +{ +public: + enum EImageType + { + e_typePNG, + e_typeJPG + }; + + EImageType m_type; + void* m_pBuffer; + int m_bufferSize; + + int GetType() { return m_type; } + void *GetBufferPointer() { return m_pBuffer; } + int GetBufferSize() { return m_bufferSize; } + void Release() { free(m_pBuffer); m_pBuffer = NULL; } + bool Allocated() { return m_pBuffer != NULL; } +}; + +typedef struct +{ + int Width; + int Height; +}D3DXIMAGE_INFO; + +typedef struct _XSOCIAL_PREVIEWIMAGE { + BYTE *pBytes; + DWORD Pitch; + DWORD Width; + DWORD Height; +// D3DFORMAT Format; +} XSOCIAL_PREVIEWIMAGE, *PXSOCIAL_PREVIEWIMAGE; + +class C4JRender +{ +public: + void Tick(); + void UpdateGamma(unsigned short usGamma); + + // Matrix stack + void MatrixMode(int type); + void MatrixSetIdentity(); + void MatrixTranslate(float x,float y,float z); + void MatrixRotate(float angle, float x, float y, float z); + void MatrixScale(float x, float y, float z); + void MatrixPerspective(float fovy, float aspect, float zNear, float zFar); + void MatrixOrthogonal(float left,float right,float bottom,float top,float zNear,float zFar); + void MatrixPop(); + void MatrixPush(); + void MatrixMult(float *mat); + const float *MatrixGet(int type); + void Set_matrixDirty(); + + // Core + void Initialise(); + void InitialiseContext(); + void StartFrame(); + void Present(); + void Clear(int flags, D3D11_RECT *pRect = NULL); + void SetClearColour(const float colourRGBA[4]); + bool IsWidescreen(); + bool IsHiDef(); + void CaptureThumbnail(ImageFileBuffer *pngOut); + void CaptureScreen(ImageFileBuffer *jpgOut, XSOCIAL_PREVIEWIMAGE *previewOut); + void BeginConditionalSurvey(int identifier); + void EndConditionalSurvey(); + void BeginConditionalRendering(int identifier); + void EndConditionalRendering(); + + // Vertex data handling + typedef enum + { + VERTEX_TYPE_PF3_TF2_CB4_NB4_XW1, // Position 3 x float, texture 2 x float, colour 4 x byte, normal 4 x byte, padding 1 DWORD + VERTEX_TYPE_COMPRESSED, // Compressed format - see comment at top of VS_PS3_TS2_CS1.hlsl for description of layout + VERTEX_TYPE_PF3_TF2_CB4_NB4_XW1_LIT, // as VERTEX_TYPE_PF3_TF2_CB4_NB4_XW1 with lighting applied, + VERTEX_TYPE_PF3_TF2_CB4_NB4_XW1_TEXGEN, // as VERTEX_TYPE_PF3_TF2_CB4_NB4_XW1 with tex gen + VERTEX_TYPE_COMPRESSED_FOG_1, + VERTEX_TYPE_COMPRESSED_FOG_2, + VERTEX_TYPE_COUNT + } eVertexType; + + // Pixel shader + typedef enum + { + PIXEL_SHADER_TYPE_STANDARD, + PIXEL_SHADER_TYPE_STANDARD2, + PIXEL_SHADER_TYPE_STANDARD3, + PIXEL_SHADER_TYPE_STANDARD4, + PIXEL_SHADER_TYPE_PROJECTION, + PIXEL_SHADER_COUNT + } ePixelShaderType; + + typedef enum + { + VIEWPORT_TYPE_FULLSCREEN, + VIEWPORT_TYPE_SPLIT_TOP, + VIEWPORT_TYPE_SPLIT_BOTTOM, + VIEWPORT_TYPE_SPLIT_LEFT, + VIEWPORT_TYPE_SPLIT_RIGHT, + VIEWPORT_TYPE_QUADRANT_TOP_LEFT, + VIEWPORT_TYPE_QUADRANT_TOP_RIGHT, + VIEWPORT_TYPE_QUADRANT_BOTTOM_LEFT, + VIEWPORT_TYPE_QUADRANT_BOTTOM_RIGHT, + } eViewportType; + + typedef enum + { + PRIMITIVE_TYPE_TRIANGLE_LIST, + PRIMITIVE_TYPE_TRIANGLE_STRIP, + PRIMITIVE_TYPE_TRIANGLE_FAN, + PRIMITIVE_TYPE_QUAD_LIST, + PRIMITIVE_TYPE_LINE_LIST, + PRIMITIVE_TYPE_LINE_STRIP, + PRIMITIVE_TYPE_COUNT + } ePrimitiveType; + + void DrawVertices(ePrimitiveType PrimitiveType, int count, void *dataIn, eVertexType vType, C4JRender::ePixelShaderType psType); +#ifdef __PSVITA__ + void DrawVerticesCutOut(ePrimitiveType PrimitiveType, int count, void *dataIn, eVertexType vType, C4JRender::ePixelShaderType psType); +#endif + void DrawVertexBuffer(ePrimitiveType PrimitiveType, int count, ID3D11Buffer *buffer, C4JRender::eVertexType vType, C4JRender::ePixelShaderType psType); + + // Command buffers + void CBuffLockStaticCreations(); + int CBuffCreate(int count); + void CBuffDelete(int first, int count); + void CBuffStart(int index); + void CBuffClear(int index); + int CBuffSize(int index); + void CBuffEnd(); + bool CBuffCall(int index, bool full = true); +#ifdef __PSVITA__ + bool CBuffCallCutOut(int index, bool full = true); +#endif + void CBuffTick(); + void CBuffDeferredModeStart(); + void CBuffDeferredModeEnd(); + + typedef enum + { + TEXTURE_FORMAT_RxGyBzAw, // Normal 32-bit RGBA texture, 8 bits per component + /* Don't think these are all directly available on D3D 11 - leaving for now + TEXTURE_FORMAT_R0G0B0Ax, // One 8-bit component mapped to alpha channel, R=G=B=0 + TEXTURE_FORMAT_R1G1B1Ax, // One 8-bit component mapped to alpha channel, R=G=B=1 + TEXTURE_FORMAT_RxGxBxAx, // One 8-bit component mapped to all channels + */ + MAX_TEXTURE_FORMATS + } eTextureFormat; + + // Textures + int TextureCreate(); + void TextureFree(int idx); + void TextureBind(int idx); + void TextureBind(int layer, int idx); + void TextureBindVertex(int idx); + void TextureSetTextureLevels(int levels); + int TextureGetTextureLevels(); + unsigned char * TextureData(int width, int height, void *data, int level, eTextureFormat format = TEXTURE_FORMAT_RxGyBzAw); + void TextureDataUpdate(int xoffset, int yoffset, int width, int height, void *data, int level); + void TextureSetParam(int param, int value); + void TextureDynamicUpdateStart(); + void TextureDynamicUpdateEnd(); + HRESULT LoadTextureData(const char *szFilename,D3DXIMAGE_INFO *pSrcInfo, int **ppDataOut); + HRESULT LoadTextureData(BYTE *pbData, DWORD dwBytes,D3DXIMAGE_INFO *pSrcInfo, int **ppDataOut); + HRESULT SaveTextureData(const char *szFilename, D3DXIMAGE_INFO *pSrcInfo, int *ppDataOut); + void TextureGetStats(); + SceGxmTexture *TextureGetTexture(int idx); + + // State control + void StateSetColour(float r, float g, float b, float a); + void StateSetDepthMask(bool enable); + void StateSetBlendEnable(bool enable); + void StateSetBlendFunc(int src, int dst); + void StateSetBlendFactor(unsigned int colour); + void StateSetAlphaFunc(int func, float param); + void StateSetDepthFunc(int func); + void StateSetFaceCull(bool enable); + void StateSetFaceCullCW(bool enable); + void StateSetLineWidth(float width); + void StateSetWriteEnable(bool red, bool green, bool blue, bool alpha); + void StateSetDepthTestEnable(bool enable); + void StateSetAlphaTestEnable(bool enable); + void StateSetDepthSlopeAndBias(float slope, float bias); + void StateSetFogEnable(bool enable); + void StateSetFogMode(int mode); + void StateSetFogNearDistance(float dist); + void StateSetFogFarDistance(float dist); + void StateSetFogDensity(float density); + void StateSetFogColour(float red, float green, float blue); + void StateSetLightingEnable(bool enable); + void StateSetVertexTextureUV( float u, float v); + void StateSetLightColour(int light, float red, float green, float blue); + void StateSetLightAmbientColour(float red, float green, float blue); + void StateSetLightDirection(int light, float x, float y, float z); + void StateSetLightEnable(int light, bool enable); + void StateSetViewport(eViewportType viewportType); + void StateSetEnableViewportClipPlanes(bool enable); + void StateSetTexGenCol(int col, float x, float y, float z, float w, bool eyeSpace); + void StateSetStencil(SceGxmStencilFunc Function, uint8_t stencil_func_mask, uint8_t stencil_write_mask); + void StateSetForceLOD(int LOD); + + // Event tracking + void BeginEvent(LPCWSTR eventName); + void EndEvent(); + + void* allocGPURWMem(const size_t size,const size_t alignment = 16); + void freeGPURWMem(void* mem); + void* allocGPUROMem(const size_t size,const size_t alignment = 16); + void freeGPUROMem(void* mem); + void* allocGPUCDMem(const size_t size,const size_t alignment = 16); + void freeGPUCDMem(void* mem); + int getDisplayBufferCount(); + volatile uint32_t *getNotificationRegion(); + SceGxmContext *getGXMContext(); + SceGxmColorSurface *getCurrentDisplaySurface(); + SceGxmDepthStencilSurface *getCurrentDepthSurface(); + SceGxmShaderPatcher *getGXMShaderPatcher(); + void setFragmentNotification(SceGxmNotification notification); + bool GetIsInScene(); + void SetCameraPosition(float x, float y, float z); +}; + + +const int GL_MODELVIEW_MATRIX = 0; +const int GL_PROJECTION_MATRIX = 1; +const int GL_MODELVIEW = 0; +const int GL_PROJECTION = 1; +const int GL_TEXTURE = 2; + +// These things required for tex gen + +const int GL_S = 0; +const int GL_T = 1; +const int GL_R = 2; +const int GL_Q = 3; + +const int GL_TEXTURE_GEN_S = 0; +const int GL_TEXTURE_GEN_T = 1; +const int GL_TEXTURE_GEN_Q = 2; +const int GL_TEXTURE_GEN_R = 3; + +const int GL_TEXTURE_GEN_MODE = 0; +const int GL_OBJECT_LINEAR = 0; +const int GL_EYE_LINEAR = 1; +const int GL_OBJECT_PLANE = 0; +const int GL_EYE_PLANE = 1; + + +// These things are used by glEnable/glDisable so must be different and non-zero (zero is used by things we haven't assigned yet) +const int GL_TEXTURE_2D = 1; +const int GL_BLEND = 2; +const int GL_CULL_FACE = 3; +const int GL_ALPHA_TEST = 4; +const int GL_DEPTH_TEST = 5; +const int GL_FOG = 6; +const int GL_LIGHTING = 7; +const int GL_LIGHT0 = 8; +const int GL_LIGHT1 = 9; + +const int CLEAR_DEPTH_FLAG = 1; +const int CLEAR_COLOUR_FLAG = 2; + +const int GL_DEPTH_BUFFER_BIT = CLEAR_DEPTH_FLAG; +const int GL_COLOR_BUFFER_BIT = CLEAR_COLOUR_FLAG; + +const int GL_SRC_ALPHA = D3D11_BLEND_SRC_ALPHA; +const int GL_ONE_MINUS_SRC_ALPHA = D3D11_BLEND_INV_SRC_ALPHA; +const int GL_ONE = D3D11_BLEND_ONE; +const int GL_ZERO = D3D11_BLEND_ZERO; +const int GL_DST_ALPHA = D3D11_BLEND_DEST_ALPHA; +const int GL_SRC_COLOR = D3D11_BLEND_SRC_COLOR; +const int GL_DST_COLOR = D3D11_BLEND_DEST_COLOR; +const int GL_ONE_MINUS_DST_COLOR = D3D11_BLEND_INV_DEST_COLOR; +const int GL_ONE_MINUS_SRC_COLOR = D3D11_BLEND_INV_SRC_COLOR; +const int GL_CONSTANT_ALPHA = D3D11_BLEND_BLEND_FACTOR; +const int GL_ONE_MINUS_CONSTANT_ALPHA = D3D11_BLEND_INV_BLEND_FACTOR; + +const int GL_GREATER = D3D11_COMPARISON_GREATER; +const int GL_EQUAL = D3D11_COMPARISON_EQUAL; +const int GL_LEQUAL = D3D11_COMPARISON_LESS_EQUAL; +const int GL_GEQUAL = D3D11_COMPARISON_GREATER_EQUAL; +const int GL_ALWAYS = D3D11_COMPARISON_ALWAYS; + +const int GL_TEXTURE_MIN_FILTER = 1; +const int GL_TEXTURE_MAG_FILTER = 2; +const int GL_TEXTURE_WRAP_S = 3; +const int GL_TEXTURE_WRAP_T = 4; + +const int GL_NEAREST = 0; +const int GL_LINEAR = 1; +const int GL_EXP = 2; +const int GL_NEAREST_MIPMAP_LINEAR = 0; // TODO - mipmapping bit of this + +const int GL_CLAMP = 0; +const int GL_REPEAT = 1; + +const int GL_FOG_START = 1; +const int GL_FOG_END = 2; +const int GL_FOG_MODE = 3; +const int GL_FOG_DENSITY = 4; +const int GL_FOG_COLOR = 5; + +const int GL_POSITION = 1; +const int GL_AMBIENT = 2; +const int GL_DIFFUSE = 3; +const int GL_SPECULAR = 4; + +const int GL_LIGHT_MODEL_AMBIENT = 1; + +const int GL_LINES = C4JRender::PRIMITIVE_TYPE_LINE_LIST; +const int GL_LINE_STRIP = C4JRender::PRIMITIVE_TYPE_LINE_STRIP; +const int GL_QUADS = C4JRender::PRIMITIVE_TYPE_QUAD_LIST; +const int GL_TRIANGLE_FAN = C4JRender::PRIMITIVE_TYPE_TRIANGLE_FAN; +const int GL_TRIANGLE_STRIP = C4JRender::PRIMITIVE_TYPE_TRIANGLE_STRIP; + +// Singleton +extern C4JRender RenderManager; + + diff --git a/Headers/PSVita/4J_Storage.h b/Headers/PSVita/4J_Storage.h new file mode 100644 index 0000000..552c247 --- /dev/null +++ b/Headers/PSVita/4J_Storage.h @@ -0,0 +1,389 @@ +#pragma once +using namespace std; + +#include + +//#define MAX_DISPLAYNAME_LENGTH 128 // SCE_SAVE_DATA_SUBTITLE_MAXSIZE on PS4 +#define MAX_DISPLAYNAME_LENGTH 128 // SCE_APPUTIL_SAVEDATA_SLOT_SUBTITLE_MAXSIZE on Vita + +//#define MAX_SAVEFILENAME_LENGTH 32 // SCE_SAVE_DATA_DIRNAME_DATA_MAXSIZE on PS4 +#define MAX_SAVEFILENAME_LENGTH 64//SCE_APPUTIL_SAVEDATA_SLOT_TITLE_MAXSIZE on Vita + +#define USER_INDEX_ANY 0x000000FF +#define RESULT LONG + +class StringTable; + +typedef struct +{ + char UTF8SaveFilename[MAX_SAVEFILENAME_LENGTH]; + char UTF8SaveTitle[MAX_DISPLAYNAME_LENGTH]; + time_t modifiedTime; + PBYTE thumbnailData; + unsigned int thumbnailSize; + //int sizeKB; +} +SAVE_INFO,*PSAVE_INFO; + +typedef struct +{ + int iSaveC; + PSAVE_INFO SaveInfoA; +} +SAVE_DETAILS,*PSAVE_DETAILS; + +class CONTENT_DATA +{ +public: + enum Type + { + e_contentLocked, + e_contentUnlocked + }; + int DeviceID; + DWORD dwContentType; + WCHAR wszDisplayName[256]; + CHAR szFileName[SCE_FIOS_PATH_MAX]; +}; +typedef CONTENT_DATA XCONTENT_DATA, *PXCONTENT_DATA; // TODO - put back in when actually interfacing with game + +#define MARKETPLACE_CONTENTOFFER_INFO int + +// Current version of the dlc data creator +#define CURRENT_DLC_VERSION_NUM 3 + +// MGH - moved these here from Orbis_App.h +enum e_SONYDLCType +{ + eSONYDLCType_SkinPack=0, + eSONYDLCType_TexturePack, + eSONYDLCType_MashUpPack, + eSONYDLCType_All +}; + +typedef struct +{ + char chDLCKeyname[16]; + //char chDLCTitle[64]; + e_SONYDLCType eDLCType; + int iFirstSkin; + int iConfig; // used for texture pack data files +} +SONYDLC; + +class C4JStorage +{ +public: + + struct PROFILESETTINGS + { + int iYAxisInversion; + int iControllerSensitivity; + int iVibration; + bool bSwapSticks; + }; + + // Structs defined in the DLC_Creator, but added here to be used in the app + typedef struct + { + unsigned int uiFileSize; + DWORD dwType; + DWORD dwWchCount; // count of WCHAR in next array + WCHAR wchFile[1]; + } + DLC_FILE_DETAILS, *PDLC_FILE_DETAILS; + + typedef struct + { + DWORD dwType; + DWORD dwWchCount; // count of WCHAR in next array; + WCHAR wchData[1]; // will be an array of size dwBytes + } + DLC_FILE_PARAM, *PDLC_FILE_PARAM; + // End of DLC_Creator structs + + typedef struct + { + DWORD dwVersion; + DWORD dwNewOffers; + DWORD dwTotalOffers; + DWORD dwInstalledTotalOffers; + BYTE bPadding[1024-sizeof(DWORD)*4]; // future expansion + } + DLC_TMS_DETAILS; + + typedef struct + { + DWORD dwSize; + PBYTE pbData; + } + TMSPP_FILEDATA, *PTMSPP_FILEDATA; + + enum eTMS_FILETYPEVAL + { + TMS_FILETYPE_BINARY=0, + TMS_FILETYPE_CONFIG=1, + TMS_FILETYPE_JSON=2, + TMS_FILETYPE_MAX, + }; + + enum eGlobalStorage + { + //eGlobalStorage_GameClip=0, + eGlobalStorage_Title=0, + eGlobalStorage_TitleUser, + eGlobalStorage_Max + }; + + enum EMessageResult + { + EMessage_Undefined=0, + EMessage_Busy, + EMessage_Pending, + EMessage_Cancelled, + EMessage_ResultAccept, + EMessage_ResultDecline, + EMessage_ResultThirdOption, + EMessage_ResultFourthOption + }; + + enum ESaveGameState + { + ESaveGame_Idle=0, + + ESaveGame_Save, + ESaveGame_SaveCompleteSuccess, + ESaveGame_SaveCompleteFail, + ESaveGame_SaveIncomplete, + ESaveGame_SaveIncomplete_WaitingOnResponse, + + ESaveGame_Load, + ESaveGame_LoadCompleteSuccess, + ESaveGame_LoadCompleteFail, + + ESaveGame_Delete, + ESaveGame_DeleteSuccess, + ESaveGame_DeleteFail, + + ESaveGame_Rename, + ESaveGame_RenameSuccess, + ESaveGame_RenameFail, + + ESaveGame_GetSaveThumbnail, // Not used as an actual state in the PS4, but the game expects this to be returned to indicate success when getting a thumbnail + ESaveGame_GetSaveInfo, + + ESaveGame_SaveCache, + ESaveGame_ReconstructCache + }; + + enum EOptionsState + { + EOptions_Idle=0, + EOptions_Save, + EOptions_Load, + EOptions_Delete, + EOptions_NoSpace, + EOptions_Corrupt, + }; + + enum ESaveGameStatus + { + EDeleteGame_Idle=0, + EDeleteGame_InProgress, + }; + + enum EDLCStatus + { + EDLC_Error=0, + EDLC_Idle, + EDLC_NoOffers, + EDLC_AlreadyEnumeratedAllOffers, + EDLC_NoInstalledDLC, + EDLC_Pending, + EDLC_LoadInProgress, + EDLC_Loaded, + EDLC_ChangedDevice + }; + + enum ESavingMessage + { + ESavingMessage_None=0, + ESavingMessage_Short, + ESavingMessage_Long + }; + + enum ESaveIncompleteType + { + ESaveIncomplete_None, + ESaveIncomplete_OutOfQuota, + ESaveIncomplete_OutOfLocalStorage, + ESaveIncomplete_Unknown + }; + + enum ETMSStatus + { + ETMSStatus_Idle=0, + ETMSStatus_Fail, + ETMSStatus_ReadInProgress, + ETMSStatus_ReadFileListInProgress, + ETMSStatus_WriteInProgress, + ETMSStatus_Fail_ReadInProgress, + ETMSStatus_Fail_ReadFileListInProgress, + ETMSStatus_Fail_ReadDetailsNotRetrieved, + ETMSStatus_Fail_WriteInProgress, + ETMSStatus_DeleteInProgress, + ETMSStatus_Pending, + }; + + enum eTMS_FileType + { + eTMS_FileType_Normal=0, + eTMS_FileType_Graphic, + }; + + enum ESGIStatus + { + ESGIStatus_Error=0, + ESGIStatus_Idle, + ESGIStatus_ReadInProgress, + ESGIStatus_NoSaves, + }; + + enum + { + PROFILE_READTYPE_ALL, + PROFILE_READTYPE_XBOXSETTINGS // just read the settings (after a notification of settings change) + }; + + enum eOptionsCallback + { + eOptions_Callback_Idle, + eOptions_Callback_Write, + eOptions_Callback_Write_Fail_NoSpace, + eOptions_Callback_Write_Fail, + eOptions_Callback_Read, + eOptions_Callback_Read_Fail, + eOptions_Callback_Read_FileNotFound, + eOptions_Callback_Read_Corrupt, + eOptions_Callback_Read_CorruptDeletePending, + eOptions_Callback_Read_CorruptDeleted + }; + + ///////////////////////////////////////////////////////////////////////////// Global storage manager ////////////////////////////////////////////////////////////////////////////// + + C4JStorage(); + void Tick(void); // General storage manager tick to be called from game + + ///////////////////////////////////////////////////////////////////////////// Savegame data /////////////////////////////////////////////////////////////////////////////////////// + + // Initialisation + void Init(unsigned int uiSaveVersion,LPCWSTR pwchDefaultSaveName,char *pszSavePackName,int iMinimumSaveSize, // General manager initialisation + int( *Func)(LPVOID, const ESavingMessage, int),LPVOID lpParam,LPCSTR szGroupID); + void SetGameSaveFolderTitle(WCHAR *wszGameSaveFolderTitle); // Sets the title to be set in the param.sfo of saves (this doesn't vary, the sub-title is used for the user cho + void SetSaveCacheFolderTitle(WCHAR *wszSaveCacheFolderTitle); // Sets the title to be set in the param.sfo of the save cache + void SetOptionsFolderTitle(WCHAR *wszOptionsFolderTitle); // Sets the title to be set in the param.sfo of the options file + void SetGameSaveFolderPrefix(char *szGameSaveFolderPrefix); // Sets the prefix to be added to the unique filename of each save to construct a final folder name + void SetMaxSaves(int iMaxC); // Sets the maximum number of saves to be evaluated by GetSavesInfo etc. + void SetDefaultImages(PBYTE pbOptionsImage,DWORD dwOptionsImageBytes,PBYTE pbSaveImage,DWORD dwSaveImageBytes, // Sets default save image and thumbnail, which can be used when saving a game that hasn't generated any yet + PBYTE pbSaveThumbnail,DWORD dwSaveThumbnailBytes); + + void SetIncompleteSaveCallback(void( *Func)(LPVOID, const ESaveIncompleteType, int blocksRequired), LPVOID param); // Sets callback to be used in the event of a save method not being able to complete + + // Miscellaneous control + void SetSaveDisabled(bool bDisable); // Sets saving disabled/enabled state + bool GetSaveDisabled(void); // Determines whether saving has been disabled + void ResetSaveData(); // Releases any internal storage being held for previously saved/loaded data + C4JStorage::ESaveGameState DoesSaveExist(bool *pbExists); // Determine if current savegame exists on storage device + bool EnoughSpaceForAMinSaveGame(); + + // Get details of existing savedata + C4JStorage::ESaveGameState GetSavesInfo(int iPad,int ( *Func)(LPVOID lpParam,SAVE_DETAILS *pSaveDetails,const bool),LPVOID lpParam,char *pszSavePackName); // Start search + PSAVE_DETAILS ReturnSavesInfo(); // Returns result of search (or NULL if not yet received) + void ClearSavesInfo(); // Clears results + C4JStorage::ESaveGameState LoadSaveDataThumbnail(PSAVE_INFO pSaveInfo,int( *Func)(LPVOID lpParam,PBYTE pbThumbnail,DWORD dwThumbnailBytes), LPVOID lpParam); // Get the thumbnail for an individual save referenced by pSaveInfo + + // Loading savedata & obtaining information from just-loaded file + C4JStorage::ESaveGameState LoadSaveData(PSAVE_INFO pSaveInfo,int( *Func)(LPVOID lpParam,const bool, const bool), LPVOID lpParam); // Loads savedata referenced by pSaveInfo, calls callback once complete + unsigned int GetSaveSize(); // Obtains sizse of just-loaded save + void GetSaveData(void *pvData,unsigned int *puiBytes); // Obtains pointer to, and size, of just-loaded save + bool GetSaveUniqueNumber(INT *piVal); // Gets the unique numeric portion of the folder name used for the save (encodes m + bool GetSaveUniqueFilename(char *pszName); // Get the full unique "filename" used as part of the folder name for the save + bool GetSaveUniqueFileDir(char *pszName); // Get the full unique "filename" used as part of the folder name for the save + + // Saving savedata + void SetSaveTitle(const wchar_t *UTF16String); // Sets the name which is used as a sub-title in the savedata param.sfo + PVOID AllocateSaveData(unsigned int uiBytes); // Allocate storage manager owned memory to the data which is to be saved to + void SetSaveDataSize(unsigned int uiBytes); // Set the actual size of data to be saved + void GetDefaultSaveImage(PBYTE *ppbSaveImage,DWORD *pdwSaveImageBytes); // Get the default save thumbnail (as set by SetDefaultImages) for use on saving games t + void GetDefaultSaveThumbnail(PBYTE *ppbSaveThumbnail,DWORD *pdwSaveThumbnailBytes); // Get the default save image (as set by SetDefaultImages) for use on saving games that + void SetSaveImages( PBYTE pbThumbnail,DWORD dwThumbnailBytes,PBYTE pbImage,DWORD dwImageBytes, PBYTE pbTextData ,DWORD dwTextDataBytes); // Sets the thumbnail & image for the save, optionally setting the metadata in the png + C4JStorage::ESaveGameState SaveSaveData(int( *Func)(LPVOID ,const bool),LPVOID lpParam); // Save the actual data, calling callback on completion + + // Handling of incomplete saves (either sub-files or save data). To be used after game has had callback for an incomplete save event + void ContinueIncompleteOperation(); + void CancelIncompleteOperation(); + + ESaveIncompleteType GetSaveError(); // Returns the save error [SaveData] + void ClearSaveError(); // Clears any save error + ESaveIncompleteType GetOptionsSaveError(); // Returns the save error [Options] + void ClearOptionsSaveError(); // Clears any save error + + // Other file operations + C4JStorage::ESaveGameState DeleteSaveData(PSAVE_INFO pSaveInfo,int( *Func)(LPVOID lpParam,const bool), LPVOID lpParam); // Deletes savedata referenced by pSaveInfo, calls callback when comple + C4JStorage::ESaveGameState RenameSaveData(int iRenameIndex, uint16_t*pui16NewName, int( *Func)(LPVOID lpParam,const bool), LPVOID lpParam); // Renamed savedata with index from last established ReturnSavesInfo. + + // Internal methods +private: + void GetSaveImage(PBYTE *ppbSaveImage, int *puiSaveImageBytes); + void GetSaveThumbnail(PBYTE *ppbSaveThumbnail, int *puiSaveThumbnailBytes); +public: + void SetSaveUniqueFilename(char *szFilename); // MGH - made this public, used for the cross save stuff + void EnableDownloadSave(); // CD - Used for cross/download-save, sets a flag for saving + + ///////////////////////////////////////////////////////////////////////////// Profile data //////////////////////////////////////////////////////////////////////////////////////// +public: + // Initialisation + void InitialiseProfileData(unsigned short usProfileVersion, UINT uiProfileValuesC, UINT uiProfileSettingsC, DWORD *pdwProfileSettingsA, int iGameDefinedDataSizeX4, unsigned int *puiGameDefinedDataChangedBitmask); // General initialisation + int SetDefaultOptionsCallback(int( *Func)(LPVOID,PROFILESETTINGS *, const int iPad),LPVOID lpParam); // Set a callback that can initialise a profile's storage to its default settings + void SetOptionsDataCallback(int( *Func)(LPVOID, int iPad, unsigned short usVersion, C4JStorage::eOptionsCallback),LPVOID lpParam); // Sets callback that is called when status of any options has changed + int SetOldProfileVersionCallback(int( *Func)(LPVOID,unsigned char *, const unsigned short,const int),LPVOID lpParam); + + // Getting and setting of profile data + PROFILESETTINGS * GetDashboardProfileSettings(int iPad); // Get pointer to the standard (originally xbox dashboard) profile data for one user + void *GetGameDefinedProfileData(int iQuadrant); // Get pointer to the game-defined profile data for one user + + // Reading and writing profiles + void ReadFromProfile(int iQuadrant, int iReadType=PROFILE_READTYPE_ALL); // Initiate read profile data for one user - read type is ignored on this platform + void WriteToProfile(int iQuadrant, bool bGameDefinedDataChanged=false, bool bOverride5MinuteLimitOnProfileWrites=false); // Initiate write profile for one user + void DeleteOptionsData(int iPad); // Delete profile data for one user + void ForceQueuedProfileWrites(int iPad=XUSER_INDEX_ANY); // Force any queued profile writes to write now + C4JStorage::ESaveGameState GetSaveState(); + + + ///////////////////////////////////////////////////////////////////////////// Unimplemented stubs ///////////////////////////////////////////////////////////////////////////////// + void SetSaveDeviceSelected(unsigned int uiPad,bool bSelected) {} + bool GetSaveDeviceSelected(unsigned int iPad) { return true; } + void ClearDLCOffers() {} + C4JStorage::ETMSStatus ReadTMSFile(int iQuadrant,eGlobalStorage eStorageFacility,C4JStorage::eTMS_FileType eFileType, WCHAR *pwchFilename,BYTE **ppBuffer,DWORD *pdwBufferSize,int( *Func)(LPVOID, WCHAR *,int, bool, int),LPVOID lpParam, int iAction) { return C4JStorage::ETMSStatus_Idle; } + bool WriteTMSFile(int iQuadrant,eGlobalStorage eStorageFacility,WCHAR *pwchFilename,BYTE *pBuffer,DWORD dwBufferSize) { return true; } + bool DeleteTMSFile(int iQuadrant,eGlobalStorage eStorageFacility,WCHAR *pwchFilename) { return true; } + C4JStorage::EDLCStatus GetDLCOffers(int iPad,int( *Func)(LPVOID, int, DWORD, int),LPVOID lpParam, DWORD dwOfferTypesBitmaskT) { return C4JStorage::EDLC_Idle; } + + // DLC + void SetDLCPackageRoot(char *pszDLCRoot); + EDLCStatus GetInstalledDLC(int iPad,int( *Func)(LPVOID, int, int),LPVOID lpParam); + CONTENT_DATA& GetDLC(DWORD dw); + DWORD GetAvailableDLCCount( int iPad ); + DWORD MountInstalledDLC(int iPad,DWORD dwDLC,int( *Func)(LPVOID, int, DWORD,DWORD),LPVOID lpParam,LPCSTR szMountDrive = NULL); + DWORD UnmountInstalledDLC(LPCSTR szMountDrive = NULL); + void GetMountedDLCFileList(const char* szMountDrive, std::vector& fileList); + std::string GetMountedPath(std::string szMount); + void SetDLCProductCode(const char* szProductCode); + void SetProductUpgradeKey(const char* szKey); + bool CheckForTrialUpgradeKey(void( *Func)(LPVOID, bool),LPVOID lpParam); + void SetDLCInfoMap(std::unordered_map* pSONYDLCMap); + void EntitlementsCallback(bool bFoundEntitlements); + +}; + +extern C4JStorage StorageManager; diff --git a/Headers/Windows64/4J_Input.h b/Headers/Windows64/4J_Input.h new file mode 100644 index 0000000..900c43b --- /dev/null +++ b/Headers/Windows64/4J_Input.h @@ -0,0 +1,168 @@ +#pragma once + + +#define MAP_STYLE_0 0 +#define MAP_STYLE_1 1 +#define MAP_STYLE_2 2 + +#define _360_JOY_BUTTON_A 0x00000001 +#define _360_JOY_BUTTON_B 0x00000002 +#define _360_JOY_BUTTON_X 0x00000004 +#define _360_JOY_BUTTON_Y 0x00000008 + +#define _360_JOY_BUTTON_START 0x00000010 +#define _360_JOY_BUTTON_BACK 0x00000020 +#define _360_JOY_BUTTON_RB 0x00000040 +#define _360_JOY_BUTTON_LB 0x00000080 + +#define _360_JOY_BUTTON_RTHUMB 0x00000100 +#define _360_JOY_BUTTON_LTHUMB 0x00000200 +#define _360_JOY_BUTTON_DPAD_UP 0x00000400 +#define _360_JOY_BUTTON_DPAD_DOWN 0x00000800 + +#define _360_JOY_BUTTON_DPAD_LEFT 0x00001000 +#define _360_JOY_BUTTON_DPAD_RIGHT 0x00002000 +// fake digital versions of analog values +#define _360_JOY_BUTTON_LSTICK_RIGHT 0x00004000 +#define _360_JOY_BUTTON_LSTICK_LEFT 0x00008000 + +#define _360_JOY_BUTTON_RSTICK_DOWN 0x00010000 +#define _360_JOY_BUTTON_RSTICK_UP 0x00020000 +#define _360_JOY_BUTTON_RSTICK_RIGHT 0x00040000 +#define _360_JOY_BUTTON_RSTICK_LEFT 0x00080000 + +#define _360_JOY_BUTTON_LSTICK_DOWN 0x00100000 +#define _360_JOY_BUTTON_LSTICK_UP 0x00200000 +#define _360_JOY_BUTTON_RT 0x00400000 +#define _360_JOY_BUTTON_LT 0x00800000 + +// Stick axis maps - to allow changes for SouthPaw in-game axis mapping +#define AXIS_MAP_LX 0 +#define AXIS_MAP_LY 1 +#define AXIS_MAP_RX 2 +#define AXIS_MAP_RY 3 + +// Trigger map - to allow for swap triggers in-game +#define TRIGGER_MAP_0 0 +#define TRIGGER_MAP_1 1 + +class StringTable; + +typedef struct _STRING_VERIFY_RESPONSE +{ + WORD wNumStrings; + HRESULT *pStringResult; +} +STRING_VERIFY_RESPONSE; + +enum EKeyboardResult +{ + EKeyboard_Pending, + EKeyboard_Cancelled, + EKeyboard_ResultAccept, + EKeyboard_ResultDecline, +}; + +enum EMsgBoxResult +{ + EMsgBox_Undefined=0, + EMsgBox_Busy, + EMsgBox_Pending, + EMsgBox_Cancelled, + EMsgBox_ResultAccept, + EMsgBox_ResultDecline, + EMsgBox_ResultThirdOption, + EMsgBox_SysUtilBusy +}; + +enum EMSgBoxType +{ + EMSgBoxType_None, + EMSgBoxType_YesNo, + EMSgBoxType_OK, +}; + +class C_4JInput +{ +public: + + + enum EKeyboardMode + { + EKeyboardMode_Default, + EKeyboardMode_Numeric, + EKeyboardMode_Password, + EKeyboardMode_Alphabet, + EKeyboardMode_Full, + EKeyboardMode_Alphabet_Extended, + EKeyboardMode_IP_Address, + EKeyboardMode_Phone + }; + + void Initialise( int iInputStateC, unsigned char ucMapC,unsigned char ucActionC, unsigned char ucMenuActionC ); + void Tick(void); + void SetDeadzoneAndMovementRange(unsigned int uiDeadzone, unsigned int uiMovementRangeMax ); + void SetGameJoypadMaps(unsigned char ucMap,unsigned char ucAction,unsigned int uiActionVal); + unsigned int GetGameJoypadMaps(unsigned char ucMap,unsigned char ucAction); + void SetJoypadMapVal(int iPad,unsigned char ucMap); + unsigned char GetJoypadMapVal(int iPad); + void SetJoypadSensitivity(int iPad, float fSensitivity); + unsigned int GetValue(int iPad,unsigned char ucAction, bool bRepeat=false); + bool ButtonPressed(int iPad,unsigned char ucAction=255); // toggled + bool ButtonReleased(int iPad,unsigned char ucAction); //toggled + bool ButtonDown(int iPad,unsigned char ucAction=255); // button held down + // Functions to remap the axis and triggers for in-game (not menus) - SouthPaw, etc + void SetJoypadStickAxisMap(int iPad,unsigned int uiFrom, unsigned int uiTo); + void SetJoypadStickTriggerMap(int iPad,unsigned int uiFrom, unsigned int uiTo); + void SetKeyRepeatRate(float fRepeatDelaySecs,float fRepeatRateSecs); + void SetDebugSequence( const char *chSequenceA,int( *Func)(LPVOID),LPVOID lpParam ); + FLOAT GetIdleSeconds(int iPad); + bool IsPadConnected(int iPad); + bool IsCircleCrossSwapped(); + + // In-Game values which may have been remapped due to Southpaw, swap triggers, etc + float GetJoypadStick_LX(int iPad, bool bCheckMenuDisplay=true); + float GetJoypadStick_LY(int iPad, bool bCheckMenuDisplay=true); + float GetJoypadStick_RX(int iPad, bool bCheckMenuDisplay=true); + float GetJoypadStick_RY(int iPad, bool bCheckMenuDisplay=true); + unsigned char GetJoypadLTrigger(int iPad, bool bCheckMenuDisplay=true); + unsigned char GetJoypadRTrigger(int iPad, bool bCheckMenuDisplay=true); + + void SetMenuDisplayed(int iPad, bool bVal); + +// EKeyboardResult RequestKeyboard(UINT uiTitle, UINT uiText, UINT uiDesc, DWORD dwPad, WCHAR *pwchResult, UINT uiResultSize,int( *Func)(LPVOID,const bool),LPVOID lpParam,EKeyboardMode eMode,C4JStringTable *pStringTable=NULL); +// EKeyboardResult RequestKeyboard(UINT uiTitle, LPCWSTR pwchDefault, UINT uiDesc, DWORD dwPad, WCHAR *pwchResult, UINT uiResultSize,int( *Func)(LPVOID,const bool),LPVOID lpParam, EKeyboardMode eMode,C4JStringTable *pStringTable=NULL); + EKeyboardResult RequestKeyboard(LPCWSTR Title, LPCWSTR Text, DWORD dwPad, UINT uiMaxChars, int( *Func)(LPVOID,const bool),LPVOID lpParam,C_4JInput::EKeyboardMode eMode); + void DestroyKeyboard(); + void GetText(uint16_t *UTF16String); + + void SetLostInputControlCallback(void( *Func)(LPVOID, bool),LPVOID lpParam); + + + // Online check strings against offensive list - TCR 92 + // TCR # 092 CMTV Player Text String Verification + // Requirement Any player-entered text visible to another player on Xbox LIVE must be verified using the Xbox LIVE service before being transmitted. Text that is rejected by the Xbox LIVE service must not be displayed. + // + // Remarks + // This requirement applies to any player-entered string that can be exposed to other players on Xbox LIVE. It includes session names, content descriptions, text messages, tags, team names, mottos, comments, and so on. + // + // Games may decide to not send the text, blank it out, or use generic text if the text was rejected by the Xbox LIVE service. + // + // Games verify the text by calling the XStringVerify function. + // + // Exemption It is not required to use the Xbox LIVE service to verify real-time text communication. An example of real-time text communication is in-game text chat. + // + // Intent Protect players from inappropriate language. + bool VerifyStrings(WCHAR **pwStringA,int iStringC,int( *Func)(LPVOID,STRING_VERIFY_RESPONSE *),LPVOID lpParam); + void CancelQueuedVerifyStrings(int( *Func)(LPVOID,STRING_VERIFY_RESPONSE *),LPVOID lpParam); + void CancelAllVerifyInProgress(void); + + //bool InputDetected(DWORD dwUserIndex,WCHAR *pwchInput); + + // Messages box functions + EMsgBoxResult RequestMessageBox(EMSgBoxType eType, DWORD dwPad,void( *Func)(int iButtonType,void *pvUserData),LPVOID lpParam, const char *pchText ,unsigned int uiFocusButton ); + +}; + +// Singleton +extern C_4JInput InputManager; \ No newline at end of file diff --git a/Headers/Windows64/4J_Profile.h b/Headers/Windows64/4J_Profile.h new file mode 100644 index 0000000..c8d41f6 --- /dev/null +++ b/Headers/Windows64/4J_Profile.h @@ -0,0 +1,127 @@ +#pragma once + +enum eAwardType +{ + eAwardType_Achievement = 0, + eAwardType_GamerPic, + eAwardType_Theme, + eAwardType_AvatarItem, +}; + +enum eUpsellType +{ + eUpsellType_Custom = 0, // This is the default, and means that the upsell dialog was initiated in the app code + eUpsellType_Achievement, + eUpsellType_GamerPic, + eUpsellType_Theme, + eUpsellType_AvatarItem, +}; + +enum eUpsellResponse +{ + eUpsellResponse_Declined, + eUpsellResponse_Accepted_NoPurchase, + eUpsellResponse_Accepted_Purchase, +}; + + + +class C_4JProfile +{ +public: + struct PROFILESETTINGS + { + int iYAxisInversion; + int iControllerSensitivity; + int iVibration; + bool bSwapSticks; + }; + + + // 4 players have game defined data, puiGameDefinedDataChangedBitmask needs to be checked by the game side to see if there's an update needed - it'll have the bits set for players to be updated + void Initialise( DWORD dwTitleID, + DWORD dwOfferID, + unsigned short usProfileVersion, + UINT uiProfileValuesC, + UINT uiProfileSettingsC, + DWORD *pdwProfileSettingsA, + int iGameDefinedDataSizeX4, + unsigned int *puiGameDefinedDataChangedBitmask); + void SetTrialTextStringTable(CXuiStringTable *pStringTable,int iAccept,int iReject); + void SetTrialAwardText(eAwardType AwardType,int iTitle,int iText); // achievement popup in the trial game + int GetLockedProfile(); + void SetLockedProfile(int iProf); + bool IsSignedIn(int iQuadrant); + bool IsSignedInLive(int iProf); + bool IsGuest(int iQuadrant); + UINT RequestSignInUI(bool bFromInvite,bool bLocalGame,bool bNoGuestsAllowed,bool bMultiplayerSignIn,bool bAddUser, int( *Func)(LPVOID,const bool, const int iPad),LPVOID lpParam,int iQuadrant=XUSER_INDEX_ANY); + UINT DisplayOfflineProfile(int( *Func)(LPVOID,const bool, const int iPad),LPVOID lpParam,int iQuadrant=XUSER_INDEX_ANY); + UINT RequestConvertOfflineToGuestUI(int( *Func)(LPVOID,const bool, const int iPad),LPVOID lpParam,int iQuadrant=XUSER_INDEX_ANY); + void SetPrimaryPlayerChanged(bool bVal); + bool QuerySigninStatus(void); + void GetXUID(int iPad, PlayerUID *pXuid,bool bOnlineXuid); + BOOL AreXUIDSEqual(PlayerUID xuid1,PlayerUID xuid2); + BOOL XUIDIsGuest(PlayerUID xuid); + bool AllowedToPlayMultiplayer(int iProf); + bool GetChatAndContentRestrictions(int iPad,bool *pbChatRestricted,bool *pbContentRestricted,int *piAge); + void StartTrialGame(); // disables saves and leaderboard, and change state to readyforgame from pregame + void AllowedPlayerCreatedContent(int iPad, bool thisQuadrantOnly, BOOL *allAllowed, BOOL *friendsAllowed); + BOOL CanViewPlayerCreatedContent(int iPad, bool thisQuadrantOnly, PPlayerUID pXuids, DWORD dwXuidCount ); + void ShowProfileCard(int iPad, PlayerUID targetUid); + bool GetProfileAvatar(int iPad,int( *Func)(LPVOID lpParam,PBYTE pbThumbnail,DWORD dwThumbnailBytes), LPVOID lpParam); + void CancelProfileAvatarRequest(); + + + // SYS + int GetPrimaryPad(); + void SetPrimaryPad(int iPad); + char* GetGamertag(int iPad); + wstring GetDisplayName(int iPad); + bool IsFullVersion(); + void SetSignInChangeCallback(void ( *Func)(LPVOID, bool, unsigned int),LPVOID lpParam); + void SetNotificationsCallback(void ( *Func)(LPVOID, DWORD, unsigned int),LPVOID lpParam); + bool RegionIsNorthAmerica(void); + bool LocaleIsUSorCanada(void); + HRESULT GetLiveConnectionStatus(); + bool IsSystemUIDisplayed(); + void SetProfileReadErrorCallback(void ( *Func)(LPVOID), LPVOID lpParam); + + + // PROFILE DATA + int SetDefaultOptionsCallback(int( *Func)(LPVOID,PROFILESETTINGS *, const int iPad),LPVOID lpParam); + int SetOldProfileVersionCallback(int( *Func)(LPVOID,unsigned char *, const unsigned short,const int),LPVOID lpParam); + PROFILESETTINGS * GetDashboardProfileSettings(int iPad); + void WriteToProfile(int iQuadrant, bool bGameDefinedDataChanged=false, bool bOverride5MinuteLimitOnProfileWrites=false); + void ForceQueuedProfileWrites(int iPad=XUSER_INDEX_ANY); + void *GetGameDefinedProfileData(int iQuadrant); + void ResetProfileProcessState(); // after a sign out from the primary player, call this + void Tick( void ); + + // ACHIEVEMENTS & AWARDS + + void RegisterAward(int iAwardNumber,int iGamerconfigID, eAwardType eType, bool bLeaderboardAffected=false, + CXuiStringTable*pStringTable=NULL, int iTitleStr=-1, int iTextStr=-1, int iAcceptStr=-1, char *pszThemeName=NULL, unsigned int uiThemeSize=0L); + int GetAwardId(int iAwardNumber); + eAwardType GetAwardType(int iAwardNumber); + bool CanBeAwarded(int iQuadrant, int iAwardNumber); + void Award(int iQuadrant, int iAwardNumber, bool bForce=false); + bool IsAwardsFlagSet(int iQuadrant, int iAward); + + // RICH PRESENCE + + void RichPresenceInit(int iPresenceCount, int iContextCount); + void RegisterRichPresenceContext(int iGameConfigContextID); + void SetRichPresenceContextValue(int iPad,int iContextID, int iVal); + void SetCurrentGameActivity(int iPad,int iNewPresence, bool bSetOthersToIdle=false); + + // PURCHASE + void DisplayFullVersionPurchase(bool bRequired, int iQuadrant, int iUpsellParam = -1); + void SetUpsellCallback(void ( *Func)(LPVOID lpParam, eUpsellType type, eUpsellResponse response, int iUserData),LPVOID lpParam); + + // Debug + void SetDebugFullOverride(bool bVal); // To override the license version (trail/full). Only in debug/release, not ContentPackage + +}; + +// Singleton +extern C_4JProfile ProfileManager; \ No newline at end of file diff --git a/Headers/Windows64/4J_Render.h b/Headers/Windows64/4J_Render.h new file mode 100644 index 0000000..c8fe48b --- /dev/null +++ b/Headers/Windows64/4J_Render.h @@ -0,0 +1,316 @@ +#pragma once + +class ImageFileBuffer +{ +public: + enum EImageType + { + e_typePNG, + e_typeJPG + }; + + EImageType m_type; + void *m_pBuffer; + int m_bufferSize; + + int GetType() + { + return m_type; + } + void *GetBufferPointer() + { + return m_pBuffer; + } + int GetBufferSize() + { + return m_bufferSize; + } + void Release() + { + free(m_pBuffer); + m_pBuffer = NULL; + } + bool Allocated() + { + return m_pBuffer != NULL; + } +}; + +typedef struct +{ + int Width; + int Height; +} D3DXIMAGE_INFO; + +typedef struct _XSOCIAL_PREVIEWIMAGE +{ + BYTE *pBytes; + DWORD Pitch; + DWORD Width; + DWORD Height; + // D3DFORMAT Format; +} XSOCIAL_PREVIEWIMAGE, *PXSOCIAL_PREVIEWIMAGE; + +class C4JRender +{ +public: + void Tick(); + void UpdateGamma(unsigned short usGamma); + + // Matrix stack + void MatrixMode(int type); + void MatrixSetIdentity(); + void MatrixTranslate(float x, float y, float z); + void MatrixRotate(float angle, float x, float y, float z); + void MatrixScale(float x, float y, float z); + void MatrixPerspective(float fovy, float aspect, float zNear, float zFar); + void MatrixOrthogonal(float left, float right, float bottom, float top, float zNear, float zFar); + void MatrixPop(); + void MatrixPush(); + void MatrixMult(float *mat); + const float *MatrixGet(int type); + void Set_matrixDirty(); + + // Core + void Initialise(ID3D11Device *pDevice, IDXGISwapChain *pSwapChain); + void InitialiseContext(); + void StartFrame(); + void DoScreenGrabOnNextPresent(); + void Present(); + void Clear(int flags, D3D11_RECT *pRect = NULL); + void SetClearColour(const float colourRGBA[4]); + bool IsWidescreen(); + bool IsHiDef(); + void CaptureThumbnail(ImageFileBuffer *pngOut); + void CaptureScreen(ImageFileBuffer *jpgOut, XSOCIAL_PREVIEWIMAGE *previewOut); + void BeginConditionalSurvey(int identifier); + void EndConditionalSurvey(); + void BeginConditionalRendering(int identifier); + void EndConditionalRendering(); + + // Vertex data handling + typedef enum + { + VERTEX_TYPE_PF3_TF2_CB4_NB4_XW1, // Position 3 x float, texture 2 x float, colour 4 x byte, normal 4 x byte, padding 1 DWORD + VERTEX_TYPE_COMPRESSED, // Compressed format - see comment at top of VS_PS3_TS2_CS1.hlsl for description of layout + VERTEX_TYPE_PF3_TF2_CB4_NB4_XW1_LIT, // as VERTEX_TYPE_PF3_TF2_CB4_NB4_XW1 with lighting applied, + VERTEX_TYPE_PF3_TF2_CB4_NB4_XW1_TEXGEN, // as VERTEX_TYPE_PF3_TF2_CB4_NB4_XW1 with tex gen + VERTEX_TYPE_COUNT + } eVertexType; + + // Pixel shader + typedef enum + { + PIXEL_SHADER_TYPE_STANDARD, + PIXEL_SHADER_TYPE_PROJECTION, + PIXEL_SHADER_TYPE_FORCELOD, + PIXEL_SHADER_COUNT + } ePixelShaderType; + + typedef enum + { + VIEWPORT_TYPE_FULLSCREEN, + VIEWPORT_TYPE_SPLIT_TOP, + VIEWPORT_TYPE_SPLIT_BOTTOM, + VIEWPORT_TYPE_SPLIT_LEFT, + VIEWPORT_TYPE_SPLIT_RIGHT, + VIEWPORT_TYPE_QUADRANT_TOP_LEFT, + VIEWPORT_TYPE_QUADRANT_TOP_RIGHT, + VIEWPORT_TYPE_QUADRANT_BOTTOM_LEFT, + VIEWPORT_TYPE_QUADRANT_BOTTOM_RIGHT, + } eViewportType; + + typedef enum + { + PRIMITIVE_TYPE_TRIANGLE_LIST, + PRIMITIVE_TYPE_TRIANGLE_STRIP, + PRIMITIVE_TYPE_TRIANGLE_FAN, + PRIMITIVE_TYPE_QUAD_LIST, + PRIMITIVE_TYPE_LINE_LIST, + PRIMITIVE_TYPE_LINE_STRIP, + PRIMITIVE_TYPE_COUNT + } ePrimitiveType; + + void DrawVertices(ePrimitiveType PrimitiveType, int count, void *dataIn, eVertexType vType, C4JRender::ePixelShaderType psType); + void DrawVertexBuffer(ePrimitiveType PrimitiveType, int count, ID3D11Buffer *buffer, C4JRender::eVertexType vType, + C4JRender::ePixelShaderType psType); + + // Command buffers + void CBuffLockStaticCreations(); + int CBuffCreate(int count); + void CBuffDelete(int first, int count); + void CBuffStart(int index, bool full = false); + void CBuffClear(int index); + int CBuffSize(int index); + void CBuffEnd(); + bool CBuffCall(int index, bool full = true); + void CBuffTick(); + void CBuffDeferredModeStart(); + void CBuffDeferredModeEnd(); + + typedef enum + { + TEXTURE_FORMAT_RxGyBzAw, // Normal 32-bit RGBA texture, 8 bits per component + /* Don't think these are all directly available on D3D 11 - leaving for now + TEXTURE_FORMAT_R0G0B0Ax, // One 8-bit component mapped to alpha channel, R=G=B=0 + TEXTURE_FORMAT_R1G1B1Ax, // One 8-bit component mapped to alpha channel, R=G=B=1 + TEXTURE_FORMAT_RxGxBxAx, // One 8-bit component mapped to all channels + */ + MAX_TEXTURE_FORMATS + } eTextureFormat; + + // Textures + int TextureCreate(); + void TextureFree(int idx); + void TextureBind(int idx); + void TextureBindVertex(int idx); + void TextureSetTextureLevels(int levels); + int TextureGetTextureLevels(); + void TextureData(int width, int height, void *data, int level, eTextureFormat format = TEXTURE_FORMAT_RxGyBzAw); + void TextureDataUpdate(int xoffset, int yoffset, int width, int height, void *data, int level); + void TextureSetParam(int param, int value); + void TextureDynamicUpdateStart(); + void TextureDynamicUpdateEnd(); + HRESULT LoadTextureData(const char *szFilename, D3DXIMAGE_INFO *pSrcInfo, int **ppDataOut); + HRESULT LoadTextureData(BYTE *pbData, DWORD dwBytes, D3DXIMAGE_INFO *pSrcInfo, int **ppDataOut); + HRESULT SaveTextureData(const char *szFilename, D3DXIMAGE_INFO *pSrcInfo, int *ppDataOut); + HRESULT SaveTextureDataToMemory(void *pOutput, int outputCapacity, int *outputLength, int width, int height, int *ppDataIn); + void TextureGetStats(); + ID3D11ShaderResourceView *TextureGetTexture(int idx); + + // State control + void StateSetColour(float r, float g, float b, float a); + void StateSetDepthMask(bool enable); + void StateSetBlendEnable(bool enable); + void StateSetBlendFunc(int src, int dst); + void StateSetBlendFactor(unsigned int colour); + void StateSetAlphaFunc(int func, float param); + void StateSetDepthFunc(int func); + void StateSetFaceCull(bool enable); + void StateSetFaceCullCW(bool enable); + void StateSetLineWidth(float width); + void StateSetWriteEnable(bool red, bool green, bool blue, bool alpha); + void StateSetDepthTestEnable(bool enable); + void StateSetAlphaTestEnable(bool enable); + void StateSetDepthSlopeAndBias(float slope, float bias); + void StateSetFogEnable(bool enable); + void StateSetFogMode(int mode); + void StateSetFogNearDistance(float dist); + void StateSetFogFarDistance(float dist); + void StateSetFogDensity(float density); + void StateSetFogColour(float red, float green, float blue); + void StateSetLightingEnable(bool enable); + void StateSetVertexTextureUV(float u, float v); + void StateSetLightColour(int light, float red, float green, float blue); + void StateSetLightAmbientColour(float red, float green, float blue); + void StateSetLightDirection(int light, float x, float y, float z); + void StateSetLightEnable(int light, bool enable); + void StateSetViewport(eViewportType viewportType); + void StateSetEnableViewportClipPlanes(bool enable); + void StateSetTexGenCol(int col, float x, float y, float z, float w, bool eyeSpace); + void StateSetStencil(int Function, uint8_t stencil_ref, uint8_t stencil_func_mask, uint8_t stencil_write_mask); + void StateSetForceLOD(int LOD); + + // Event tracking + void BeginEvent(LPCWSTR eventName); + void EndEvent(); + + // PLM event handling + void Suspend(); + bool Suspended(); + void Resume(); +}; + +const int GL_MODELVIEW_MATRIX = 0; +const int GL_PROJECTION_MATRIX = 1; +const int GL_MODELVIEW = 0; +const int GL_PROJECTION = 1; +const int GL_TEXTURE = 2; + +// These things required for tex gen + +const int GL_S = 0; +const int GL_T = 1; +const int GL_R = 2; +const int GL_Q = 3; + +const int GL_TEXTURE_GEN_S = 0; +const int GL_TEXTURE_GEN_T = 1; +const int GL_TEXTURE_GEN_Q = 2; +const int GL_TEXTURE_GEN_R = 3; + +const int GL_TEXTURE_GEN_MODE = 0; +const int GL_OBJECT_LINEAR = 0; +const int GL_EYE_LINEAR = 1; +const int GL_OBJECT_PLANE = 0; +const int GL_EYE_PLANE = 1; + +// These things are used by glEnable/glDisable so must be different and non-zero (zero is used by things we haven't assigned yet) +const int GL_TEXTURE_2D = 1; +const int GL_BLEND = 2; +const int GL_CULL_FACE = 3; +const int GL_ALPHA_TEST = 4; +const int GL_DEPTH_TEST = 5; +const int GL_FOG = 6; +const int GL_LIGHTING = 7; +const int GL_LIGHT0 = 8; +const int GL_LIGHT1 = 9; + +const int CLEAR_DEPTH_FLAG = 1; +const int CLEAR_COLOUR_FLAG = 2; + +const int GL_DEPTH_BUFFER_BIT = CLEAR_DEPTH_FLAG; +const int GL_COLOR_BUFFER_BIT = CLEAR_COLOUR_FLAG; + +const int GL_SRC_ALPHA = D3D11_BLEND_SRC_ALPHA; +const int GL_ONE_MINUS_SRC_ALPHA = D3D11_BLEND_INV_SRC_ALPHA; +const int GL_ONE = D3D11_BLEND_ONE; +const int GL_ZERO = D3D11_BLEND_ZERO; +const int GL_DST_ALPHA = D3D11_BLEND_DEST_ALPHA; +const int GL_SRC_COLOR = D3D11_BLEND_SRC_COLOR; +const int GL_DST_COLOR = D3D11_BLEND_DEST_COLOR; +const int GL_ONE_MINUS_DST_COLOR = D3D11_BLEND_INV_DEST_COLOR; +const int GL_ONE_MINUS_SRC_COLOR = D3D11_BLEND_INV_SRC_COLOR; +const int GL_CONSTANT_ALPHA = D3D11_BLEND_BLEND_FACTOR; +const int GL_ONE_MINUS_CONSTANT_ALPHA = D3D11_BLEND_INV_BLEND_FACTOR; + +const int GL_GREATER = D3D11_COMPARISON_GREATER; +const int GL_EQUAL = D3D11_COMPARISON_EQUAL; +const int GL_LEQUAL = D3D11_COMPARISON_LESS_EQUAL; +const int GL_GEQUAL = D3D11_COMPARISON_GREATER_EQUAL; +const int GL_ALWAYS = D3D11_COMPARISON_ALWAYS; + +const int GL_TEXTURE_MIN_FILTER = 1; +const int GL_TEXTURE_MAG_FILTER = 2; +const int GL_TEXTURE_WRAP_S = 3; +const int GL_TEXTURE_WRAP_T = 4; + +const int GL_NEAREST = 0; +const int GL_LINEAR = 1; +const int GL_EXP = 2; +const int GL_NEAREST_MIPMAP_LINEAR = 0; // TODO - mipmapping bit of this + +const int GL_CLAMP = 0; +const int GL_REPEAT = 1; + +const int GL_FOG_START = 1; +const int GL_FOG_END = 2; +const int GL_FOG_MODE = 3; +const int GL_FOG_DENSITY = 4; +const int GL_FOG_COLOR = 5; + +const int GL_POSITION = 1; +const int GL_AMBIENT = 2; +const int GL_DIFFUSE = 3; +const int GL_SPECULAR = 4; + +const int GL_LIGHT_MODEL_AMBIENT = 1; + +const int GL_LINES = C4JRender::PRIMITIVE_TYPE_LINE_LIST; +const int GL_LINE_STRIP = C4JRender::PRIMITIVE_TYPE_LINE_STRIP; +const int GL_QUADS = C4JRender::PRIMITIVE_TYPE_QUAD_LIST; +const int GL_TRIANGLE_FAN = C4JRender::PRIMITIVE_TYPE_TRIANGLE_FAN; +const int GL_TRIANGLE_STRIP = C4JRender::PRIMITIVE_TYPE_TRIANGLE_STRIP; + +// Singleton +extern C4JRender RenderManager; \ No newline at end of file diff --git a/Headers/Windows64/4J_Storage.h b/Headers/Windows64/4J_Storage.h new file mode 100644 index 0000000..cc23cd4 --- /dev/null +++ b/Headers/Windows64/4J_Storage.h @@ -0,0 +1,344 @@ +#pragma once +#include +//#include +class C4JStringTable; + +#define MAX_DISPLAYNAME_LENGTH 128 // CELL_SAVEDATA_SYSP_SUBTITLE_SIZE on PS3 +#define MAX_DETAILS_LENGTH 128 // CELL_SAVEDATA_SYSP_SUBTITLE_SIZE on PS3 +#define MAX_SAVEFILENAME_LENGTH 32 // CELL_SAVEDATA_DIRNAME_SIZE + +typedef struct +{ + time_t modifiedTime; + unsigned int dataSize; + unsigned int thumbnailSize; +} +CONTAINER_METADATA; + +typedef struct +{ + char UTF8SaveFilename[MAX_SAVEFILENAME_LENGTH]; + char UTF8SaveTitle[MAX_DISPLAYNAME_LENGTH]; + CONTAINER_METADATA metaData; + PBYTE thumbnailData; +} +SAVE_INFO, * PSAVE_INFO; + +typedef struct +{ + int iSaveC; + PSAVE_INFO SaveInfoA; +} +SAVE_DETAILS, * PSAVE_DETAILS; + +typedef std::vector OfferDataArray; +typedef std::vector XContentDataArray; +//typedef std::vector SaveDetailsArray; + +// Current version of the dlc data creator +#define CURRENT_DLC_VERSION_NUM 3 + +class C4JStorage +{ + +public: + // Structs defined in the DLC_Creator, but added here to be used in the app + typedef struct + { + unsigned int uiFileSize; + DWORD dwType; + DWORD dwWchCount; // count of WCHAR in next array + WCHAR wchFile[1]; + } + DLC_FILE_DETAILS, * PDLC_FILE_DETAILS; + + typedef struct + { + DWORD dwType; + DWORD dwWchCount; // count of WCHAR in next array; + WCHAR wchData[1]; // will be an array of size dwBytes + } + DLC_FILE_PARAM, * PDLC_FILE_PARAM; + // End of DLC_Creator structs + + typedef struct + { + WCHAR wchDisplayName[XCONTENT_MAX_DISPLAYNAME_LENGTH]; + CHAR szFileName[XCONTENT_MAX_FILENAME_LENGTH]; + DWORD dwImageOffset; + DWORD dwImageBytes; + } + CACHEINFOSTRUCT; + + // structure to hold DLC info in TMS + typedef struct + { + DWORD dwVersion; + DWORD dwNewOffers; + DWORD dwTotalOffers; + DWORD dwInstalledTotalOffers; + BYTE bPadding[1024 - sizeof(DWORD) * 4]; // future expansion + } + DLC_TMS_DETAILS; + + enum eGTS_FileTypes + { + eGTS_Type_Skin = 0, + eGTS_Type_Cape, + eGTS_Type_MAX + }; + + enum eGlobalStorage + { + //eGlobalStorage_GameClip=0, + eGlobalStorage_Title = 0, + eGlobalStorage_TitleUser, + eGlobalStorage_Max + }; + + enum EMessageResult + { + EMessage_Undefined = 0, + EMessage_Busy, + EMessage_Pending, + EMessage_Cancelled, + EMessage_ResultAccept, + EMessage_ResultDecline, + EMessage_ResultThirdOption, + EMessage_ResultFourthOption + }; + + enum ESaveGameControlState + { + ESaveGameControl_Idle = 0, + ESaveGameControl_Save, + ESaveGameControl_InternalRequestingDevice, + ESaveGameControl_InternalGetSaveName, + ESaveGameControl_InternalSaving, + ESaveGameControl_CopySave, + ESaveGameControl_CopyingSave, + }; + + enum ESaveGameState + { + ESaveGame_Idle = 0, + ESaveGame_Save, + ESaveGame_InternalRequestingDevice, + ESaveGame_InternalGetSaveName, + ESaveGame_InternalSaving, + ESaveGame_CopySave, + ESaveGame_CopyingSave, + ESaveGame_Load, + ESaveGame_GetSavesInfo, + ESaveGame_Rename, + ESaveGame_Delete, + + ESaveGame_GetSaveThumbnail // Not used as an actual state in the PS4, but the game expects this to be returned to indicate success when getting a thumbnail + + }; + enum ELoadGameStatus + { + ELoadGame_Idle = 0, + ELoadGame_InProgress, + ELoadGame_NoSaves, + ELoadGame_ChangedDevice, + ELoadGame_DeviceRemoved + }; + + enum EDeleteGameStatus + { + EDeleteGame_Idle = 0, + EDeleteGame_InProgress, + }; + + + enum ESGIStatus + { + ESGIStatus_Error = 0, + ESGIStatus_Idle, + ESGIStatus_ReadInProgress, + ESGIStatus_NoSaves, + }; + + enum EDLCStatus + { + EDLC_Error = 0, + EDLC_Idle, + EDLC_NoOffers, + EDLC_AlreadyEnumeratedAllOffers, + EDLC_NoInstalledDLC, + EDLC_Pending, + EDLC_LoadInProgress, + EDLC_Loaded, + EDLC_ChangedDevice + }; + + enum ESavingMessage + { + ESavingMessage_None = 0, + ESavingMessage_Short, + ESavingMessage_Long + }; + + enum ETMSStatus + { + ETMSStatus_Idle = 0, + ETMSStatus_Fail, + ETMSStatus_Fail_ReadInProgress, + ETMSStatus_Fail_WriteInProgress, + ETMSStatus_Pending, + }; + + enum eTMS_FileType + { + eTMS_FileType_Normal = 0, + eTMS_FileType_Graphic, + }; + + enum eTMS_FILETYPEVAL + { + TMS_FILETYPE_BINARY, + TMS_FILETYPE_CONFIG, + TMS_FILETYPE_JSON, + TMS_FILETYPE_MAX + }; + enum eTMS_UGCTYPE + { + TMS_UGCTYPE_NONE, + TMS_UGCTYPE_IMAGE, + TMS_UGCTYPE_MAX + }; + + + typedef struct + { + CHAR szFilename[256]; + int iFileSize; + eTMS_FILETYPEVAL eFileTypeVal; + } + TMSPP_FILE_DETAILS, * PTMSPP_FILE_DETAILS; + + typedef struct + { + int iCount; + PTMSPP_FILE_DETAILS FileDetailsA; + } + TMSPP_FILE_LIST, * PTMSPP_FILE_LIST; + + typedef struct + { + DWORD dwSize; + PBYTE pbData; + } + TMSPP_FILEDATA, * PTMSPP_FILEDATA; + + + C4JStorage(); + + void Tick(void); + + // Messages + C4JStorage::EMessageResult RequestMessageBox(UINT uiTitle, UINT uiText, UINT* uiOptionA, UINT uiOptionC, DWORD dwPad = XUSER_INDEX_ANY, + int(*Func)(LPVOID, int, const C4JStorage::EMessageResult) = NULL, LPVOID lpParam = NULL, C4JStringTable* pStringTable = NULL, WCHAR* pwchFormatString = NULL, DWORD dwFocusButton = 0); + + + C4JStorage::EMessageResult GetMessageBoxResult(); + + // save device + bool SetSaveDevice(int(*Func)(LPVOID, const bool), LPVOID lpParam, bool bForceResetOfSaveDevice = false); + + // savegame + void Init(unsigned int uiSaveVersion, LPCWSTR pwchDefaultSaveName, char* pszSavePackName, int iMinimumSaveSize, int(*Func)(LPVOID, const ESavingMessage, int), LPVOID lpParam, LPCSTR szGroupID); + void ResetSaveData(); // Call before a new save to clear out stored save file name + void SetDefaultSaveNameForKeyboardDisplay(LPCWSTR pwchDefaultSaveName); + void SetSaveTitle(LPCWSTR pwchDefaultSaveName); + bool GetSaveUniqueNumber(INT* piVal); + bool GetSaveUniqueFilename(char* pszName); + void SetSaveUniqueFilename(char* szFilename); + void SetState(ESaveGameControlState eControlState, int(*Func)(LPVOID, const bool), LPVOID lpParam); + void SetSaveDisabled(bool bDisable); + bool GetSaveDisabled(void); + unsigned int GetSaveSize(); + void GetSaveData(void* pvData, unsigned int* puiBytes); + PVOID AllocateSaveData(unsigned int uiBytes); + void SetSaveImages(PBYTE pbThumbnail, DWORD dwThumbnailBytes, PBYTE pbImage, DWORD dwImageBytes, PBYTE pbTextData, DWORD dwTextDataBytes); // Sets the thumbnail & image for the save, optionally setting the metadata in the png + C4JStorage::ESaveGameState SaveSaveData(int(*Func)(LPVOID, const bool), LPVOID lpParam); + void CopySaveDataToNewSave(PBYTE pbThumbnail, DWORD cbThumbnail, WCHAR* wchNewName, int (*Func)(LPVOID lpParam, bool), LPVOID lpParam); + void SetSaveDeviceSelected(unsigned int uiPad, bool bSelected); + bool GetSaveDeviceSelected(unsigned int iPad); + C4JStorage::ESaveGameState DoesSaveExist(bool* pbExists); + bool EnoughSpaceForAMinSaveGame(); + + void SetSaveMessageVPosition(float fY); // The 'Saving' message will display at a default position unless changed + // Get the info for the saves + C4JStorage::ESaveGameState GetSavesInfo(int iPad, int (*Func)(LPVOID lpParam, SAVE_DETAILS* pSaveDetails, const bool), LPVOID lpParam, char* pszSavePackName); + PSAVE_DETAILS ReturnSavesInfo(); + void ClearSavesInfo(); // Clears results + C4JStorage::ESaveGameState LoadSaveDataThumbnail(PSAVE_INFO pSaveInfo, int(*Func)(LPVOID lpParam, PBYTE pbThumbnail, DWORD dwThumbnailBytes), LPVOID lpParam); // Get the thumbnail for an individual save referenced by pSaveInfo + + void GetSaveCacheFileInfo(DWORD dwFile, XCONTENT_DATA& xContentData); + void GetSaveCacheFileInfo(DWORD dwFile, PBYTE* ppbImageData, DWORD* pdwImageBytes); + + // Load the save. Need to call GetSaveData once the callback is called + C4JStorage::ESaveGameState LoadSaveData(PSAVE_INFO pSaveInfo, int(*Func)(LPVOID lpParam, const bool, const bool), LPVOID lpParam); + C4JStorage::ESaveGameState DeleteSaveData(PSAVE_INFO pSaveInfo, int(*Func)(LPVOID lpParam, const bool), LPVOID lpParam); + + // DLC + void RegisterMarketplaceCountsCallback(int (*Func)(LPVOID lpParam, C4JStorage::DLC_TMS_DETAILS*, int), LPVOID lpParam); + void SetDLCPackageRoot(char* pszDLCRoot); + C4JStorage::EDLCStatus GetDLCOffers(int iPad, int(*Func)(LPVOID, int, DWORD, int), LPVOID lpParam, DWORD dwOfferTypesBitmask = XMARKETPLACE_OFFERING_TYPE_CONTENT); + DWORD CancelGetDLCOffers(); + void ClearDLCOffers(); + XMARKETPLACE_CONTENTOFFER_INFO& GetOffer(DWORD dw); + int GetOfferCount(); + DWORD InstallOffer(int iOfferIDC, unsigned __int64* ullOfferIDA, int(*Func)(LPVOID, int, int), LPVOID lpParam, bool bTrial = false); + DWORD GetAvailableDLCCount(int iPad); + + C4JStorage::EDLCStatus GetInstalledDLC(int iPad, int(*Func)(LPVOID, int, int), LPVOID lpParam); + XCONTENT_DATA& GetDLC(DWORD dw); + DWORD MountInstalledDLC(int iPad, DWORD dwDLC, int(*Func)(LPVOID, int, DWORD, DWORD), LPVOID lpParam, LPCSTR szMountDrive = NULL); + DWORD UnmountInstalledDLC(LPCSTR szMountDrive = NULL); + void GetMountedDLCFileList(const char* szMountDrive, std::vector& fileList); + std::string GetMountedPath(std::string szMount); + + // Global title storage + C4JStorage::ETMSStatus ReadTMSFile(int iQuadrant, eGlobalStorage eStorageFacility, C4JStorage::eTMS_FileType eFileType, + WCHAR* pwchFilename, BYTE** ppBuffer, DWORD* pdwBufferSize, int(*Func)(LPVOID, WCHAR*, int, bool, int) = NULL, LPVOID lpParam = NULL, int iAction = 0); + bool WriteTMSFile(int iQuadrant, eGlobalStorage eStorageFacility, WCHAR* pwchFilename, BYTE* pBuffer, DWORD dwBufferSize); + bool DeleteTMSFile(int iQuadrant, eGlobalStorage eStorageFacility, WCHAR* pwchFilename); + void StoreTMSPathName(WCHAR* pwchName = NULL); + + // TMS++ +#ifdef _XBOX + C4JStorage::ETMSStatus WriteTMSFile(int iPad, C4JStorage::eGlobalStorage eStorageFacility, C4JStorage::eTMS_FileType eFileType, CHAR* pchFilePath, CHAR* pchBuffer, DWORD dwBufferSize, TMSCLIENT_CALLBACK Func, LPVOID lpParam); + HRESULT GetUserQuotaInfo(int iPad, TMSCLIENT_CALLBACK Func, LPVOID lpParam); +#endif + + // C4JStorage::ETMSStatus TMSPP_WriteFile(int iPad,C4JStorage::eGlobalStorage eStorageFacility,C4JStorage::eTMS_FILETYPEVAL eFileTypeVal,C4JStorage::eTMS_UGCTYPE eUGCType,CHAR *pchFilePath,CHAR *pchBuffer,DWORD dwBufferSize,int( *Func)(LPVOID,int,int)=NULL,LPVOID lpParam=NULL, int iUserData=0); + // C4JStorage::ETMSStatus TMSPP_GetUserQuotaInfo(int iPad,TMSCLIENT_CALLBACK Func,LPVOID lpParam, int iUserData=0); + C4JStorage::ETMSStatus TMSPP_ReadFile(int iPad, C4JStorage::eGlobalStorage eStorageFacility, C4JStorage::eTMS_FILETYPEVAL eFileTypeVal, LPCSTR szFilename, int(*Func)(LPVOID, int, int, PTMSPP_FILEDATA, LPCSTR) = NULL, LPVOID lpParam = NULL, int iUserData = 0); + // C4JStorage::ETMSStatus TMSPP_ReadFileList(int iPad,C4JStorage::eGlobalStorage eStorageFacility,CHAR *pchFilePath,int( *Func)(LPVOID,int,int,PTMSPP_FILE_LIST)=NULL,LPVOID lpParam=NULL, int iUserData=0); + // C4JStorage::ETMSStatus TMSPP_DeleteFile(int iPad,LPCSTR szFilePath,C4JStorage::eTMS_FILETYPEVAL eFileTypeVal,int( *Func)(LPVOID,int,int),LPVOID lpParam=NULL, int iUserData=0); + // bool TMSPP_InFileList(eGlobalStorage eStorageFacility, int iPad,const wstring &Filename); + // unsigned int CRC(unsigned char *buf, int len); + +// enum eXBLWS +// { +// eXBLWS_GET, +// eXBLWS_POST, +// eXBLWS_PUT, +// eXBLWS_DELETE, +// }; + //bool XBLWS_Command(eXBLWS eCommand); + + + unsigned int CRC(unsigned char* buf, int len); + + // #ifdef _DEBUG + // void SetSaveName(int i); + // #endif + // string table for all the Storage problems. Loaded by the application + C4JStringTable* m_pStringTable; +}; + +extern C4JStorage StorageManager; \ No newline at end of file diff --git a/Headers/Xbox/4J_Input.h b/Headers/Xbox/4J_Input.h new file mode 100644 index 0000000..120e9c7 --- /dev/null +++ b/Headers/Xbox/4J_Input.h @@ -0,0 +1,127 @@ +#pragma once + +#define MAP_STYLE_0 0 +#define MAP_STYLE_1 1 +#define MAP_STYLE_2 2 + +#define _360_JOY_BUTTON_A 0x00000001 +#define _360_JOY_BUTTON_B 0x00000002 +#define _360_JOY_BUTTON_X 0x00000004 +#define _360_JOY_BUTTON_Y 0x00000008 + +#define _360_JOY_BUTTON_START 0x00000010 +#define _360_JOY_BUTTON_BACK 0x00000020 +#define _360_JOY_BUTTON_RB 0x00000040 +#define _360_JOY_BUTTON_LB 0x00000080 + +#define _360_JOY_BUTTON_RTHUMB 0x00000100 +#define _360_JOY_BUTTON_LTHUMB 0x00000200 +#define _360_JOY_BUTTON_DPAD_UP 0x00000400 +#define _360_JOY_BUTTON_DPAD_DOWN 0x00000800 + +#define _360_JOY_BUTTON_DPAD_LEFT 0x00001000 +#define _360_JOY_BUTTON_DPAD_RIGHT 0x00002000 +// fake digital versions of analog values +#define _360_JOY_BUTTON_LSTICK_RIGHT 0x00004000 +#define _360_JOY_BUTTON_LSTICK_LEFT 0x00008000 + +#define _360_JOY_BUTTON_RSTICK_DOWN 0x00010000 +#define _360_JOY_BUTTON_RSTICK_UP 0x00020000 +#define _360_JOY_BUTTON_RSTICK_RIGHT 0x00040000 +#define _360_JOY_BUTTON_RSTICK_LEFT 0x00080000 + +#define _360_JOY_BUTTON_LSTICK_DOWN 0x00100000 +#define _360_JOY_BUTTON_LSTICK_UP 0x00200000 +#define _360_JOY_BUTTON_RT 0x00400000 +#define _360_JOY_BUTTON_LT 0x00800000 + +// Stick axis maps - to allow changes for SouthPaw in-game axis mapping +#define AXIS_MAP_LX 0 +#define AXIS_MAP_LY 1 +#define AXIS_MAP_RX 2 +#define AXIS_MAP_RY 3 + +// Trigger map - to allow for swap triggers in-game +#define TRIGGER_MAP_0 0 +#define TRIGGER_MAP_1 1 + +class C_4JInput +{ +public: + enum EKeyboardResult + { + EKeyboard_Pending, + EKeyboard_Cancelled, + EKeyboard_ResultAccept, + EKeyboard_ResultDecline, + }; + + enum EKeyboardMode + { + EKeyboardMode_Default, + EKeyboardMode_Numeric, + EKeyboardMode_Password, + EKeyboardMode_Alphabet, + EKeyboardMode_Full, + EKeyboardMode_Alphabet_Extended, + EKeyboardMode_IP_Address, + EKeyboardMode_Phone + }; + + void Initialise( int iInputStateC, unsigned char ucMapC,unsigned char ucActionC, unsigned char ucMenuActionC ); + void Tick(void); + void SetDeadzoneAndMovementRange(unsigned int uiDeadzone, unsigned int uiMovementRangeMax ); + void SetGameJoypadMaps(unsigned char ucMap,unsigned char ucAction,unsigned int uiActionVal); + unsigned int GetGameJoypadMaps(unsigned char ucMap,unsigned char ucAction); + void SetJoypadMapVal(int iPad,unsigned char ucMap); + unsigned char GetJoypadMapVal(int iPad); + void SetJoypadSensitivity(int iPad, float fSensitivity); + unsigned int GetValue(int iPad,unsigned char ucAction, bool bRepeat=false); + bool ButtonPressed(int iPad,unsigned char ucAction=255); // toggled + bool ButtonReleased(int iPad,unsigned char ucAction); //toggled + bool ButtonDown(int iPad,unsigned char ucAction=255); // button held down + // Functions to remap the axis and triggers for in-game (not menus) - SouthPaw, etc + void SetJoypadStickAxisMap(int iPad,unsigned int uiFrom, unsigned int uiTo); + void SetJoypadStickTriggerMap(int iPad,unsigned int uiFrom, unsigned int uiTo); + void SetKeyRepeatRate(float fRepeatDelaySecs,float fRepeatRateSecs); + void SetDebugSequence( const char *chSequenceA,int( *Func)(LPVOID),LPVOID lpParam ); + FLOAT GetIdleSeconds(int iPad); + bool IsPadConnected(int iPad); + + // In-Game values which may have been remapped due to Southpaw, swap triggers, etc + float GetJoypadStick_LX(int iPad, bool bCheckMenuDisplay=true); + float GetJoypadStick_LY(int iPad, bool bCheckMenuDisplay=true); + float GetJoypadStick_RX(int iPad, bool bCheckMenuDisplay=true); + float GetJoypadStick_RY(int iPad, bool bCheckMenuDisplay=true); + unsigned char GetJoypadLTrigger(int iPad, bool bCheckMenuDisplay=true); + unsigned char GetJoypadRTrigger(int iPad, bool bCheckMenuDisplay=true); + + void SetMenuDisplayed(int iPad, bool bVal); + + EKeyboardResult RequestKeyboard(UINT uiTitle, UINT uiText, UINT uiDesc, DWORD dwPad, WCHAR *pwchResult, UINT uiResultSize,int( *Func)(LPVOID,const bool),LPVOID lpParam,EKeyboardMode eMode,CXuiStringTable *pStringTable=NULL); + EKeyboardResult RequestKeyboard(UINT uiTitle, LPCWSTR pwchDefault, UINT uiDesc, DWORD dwPad, WCHAR *pwchResult, UINT uiResultSize,int( *Func)(LPVOID,const bool),LPVOID lpParam, EKeyboardMode eMode,CXuiStringTable *pStringTable=NULL); + + // Online check strings against offensive list - TCR 92 + // TCR # 092 CMTV Player Text String Verification + // Requirement Any player-entered text visible to another player on Xbox LIVE must be verified using the Xbox LIVE service before being transmitted. Text that is rejected by the Xbox LIVE service must not be displayed. + // + // Remarks + // This requirement applies to any player-entered string that can be exposed to other players on Xbox LIVE. It includes session names, content descriptions, text messages, tags, team names, mottos, comments, and so on. + // + // Games may decide to not send the text, blank it out, or use generic text if the text was rejected by the Xbox LIVE service. + // + // Games verify the text by calling the XStringVerify function. + // + // Exemption It is not required to use the Xbox LIVE service to verify real-time text communication. An example of real-time text communication is in-game text chat. + // + // Intent Protect players from inappropriate language. +/* +bool VerifyStrings(WCHAR **pwStringA,int iStringC,int( *Func)(LPVOID,STRING_VERIFY_RESPONSE *),LPVOID lpParam); + void CancelQueuedVerifyStrings(int( *Func)(LPVOID,STRING_VERIFY_RESPONSE *),LPVOID lpParam); + void CancelAllVerifyInProgress(void); +*/ + //bool InputDetected(DWORD dwUserIndex,WCHAR *pwchInput); +}; + +// Singleton +extern C_4JInput InputManager; diff --git a/Headers/Xbox/4J_Profile.h b/Headers/Xbox/4J_Profile.h new file mode 100644 index 0000000..28e717e --- /dev/null +++ b/Headers/Xbox/4J_Profile.h @@ -0,0 +1,124 @@ +#pragma once + +enum eAwardType +{ + eAwardType_Achievement = 0, + eAwardType_GamerPic, + eAwardType_Theme, + eAwardType_AvatarItem, +}; + +enum eUpsellType +{ + eUpsellType_Custom = 0, // This is the default, and means that the upsell dialog was initiated in the app code + eUpsellType_Achievement, + eUpsellType_GamerPic, + eUpsellType_Theme, + eUpsellType_AvatarItem, +}; + +enum eUpsellResponse +{ + eUpsellResponse_Declined, + eUpsellResponse_Accepted_NoPurchase, + eUpsellResponse_Accepted_Purchase, +}; + + + +class C_4JProfile +{ +public: + struct PROFILESETTINGS + { + int iYAxisInversion; + int iControllerSensitivity; + int iVibration; + bool bSwapSticks; + }; + + + // 4 players have game defined data, puiGameDefinedDataChangedBitmask needs to be checked by the game side to see if there's an update needed - it'll have the bits set for players to be updated + void Initialise( DWORD dwTitleID, + DWORD dwOfferID, + unsigned short usProfileVersion, + UINT uiProfileValuesC, + UINT uiProfileSettingsC, + DWORD *pdwProfileSettingsA, + int iGameDefinedDataSizeX4, + unsigned int *puiGameDefinedDataChangedBitmask); + void SetTrialTextStringTable(CXuiStringTable *pStringTable,int iAccept,int iReject); + void SetTrialAwardText(eAwardType AwardType,int iTitle,int iText); // achievement popup in the trial game + int GetLockedProfile(); + void SetLockedProfile(int iProf); + bool IsSignedIn(int iQuadrant); + bool IsSignedInLive(int iProf); + bool IsGuest(int iQuadrant); + UINT RequestSignInUI(bool bFromInvite,bool bLocalGame,bool bNoGuestsAllowed,bool bMultiplayerSignIn,bool bAddUser, int( *Func)(LPVOID,const bool, const int iPad),LPVOID lpParam,int iQuadrant=XUSER_INDEX_ANY); + UINT DisplayOfflineProfile(int( *Func)(LPVOID,const bool, const int iPad),LPVOID lpParam,int iQuadrant=XUSER_INDEX_ANY); + UINT RequestConvertOfflineToGuestUI(int( *Func)(LPVOID,const bool, const int iPad),LPVOID lpParam,int iQuadrant=XUSER_INDEX_ANY); + void SetPrimaryPlayerChanged(bool bVal); + bool QuerySigninStatus(void); + void GetXUID(int iPad, XUID *pXuid,bool bOnlineXuid); + BOOL AreXUIDSEqual(XUID xuid1,XUID xuid2); + BOOL XUIDIsGuest(XUID xuid); + bool AllowedToPlayMultiplayer(int iProf); + void StartTrialGame(); // disables saves and leaderboard, and change state to readyforgame from pregame + void AllowedPlayerCreatedContent(int iPad, bool thisQuadrantOnly, BOOL *allAllowed, BOOL *friendsAllowed); + BOOL CanViewPlayerCreatedContent(int iPad, bool thisQuadrantOnly, PXUID pXuids, DWORD dwXuidCount ); + + + // SYS + int GetPrimaryPad(); + void SetPrimaryPad(int iPad); + char* GetGamertag(int iPad); + wchar_t* GetDisplayName(int iPad); + bool IsFullVersion(); + void SetSignInChangeCallback(void ( *Func)(LPVOID, bool, unsigned int),LPVOID lpParam); + void SetNotificationsCallback(void ( *Func)(LPVOID, DWORD, unsigned int),LPVOID lpParam); + bool RegionIsNorthAmerica(void); + bool LocaleIsUSorCanada(void); + HRESULT GetLiveConnectionStatus(); + bool IsSystemUIDisplayed(); + void SetProfileReadErrorCallback(void ( *Func)(LPVOID), LPVOID lpParam); + + + // PROFILE DATA + int SetDefaultOptionsCallback(int( *Func)(LPVOID,PROFILESETTINGS *, const int iPad),LPVOID lpParam); + int SetOldProfileVersionCallback(int( *Func)(LPVOID,unsigned char *, const unsigned short,const int),LPVOID lpParam); + PROFILESETTINGS * GetDashboardProfileSettings(int iPad); + void WriteToProfile(int iQuadrant, bool bGameDefinedDataChanged=false, bool bOverride5MinuteLimitOnProfileWrites=false); + void ForceQueuedProfileWrites(int iPad=XUSER_INDEX_ANY); + void *GetGameDefinedProfileData(int iQuadrant); + void ResetProfileProcessState(); // after a sign out from the primary player, call this + void Tick( void ); + + // ACHIEVEMENTS & AWARDS + + void RegisterAward(int iAwardNumber,int iGamerconfigID, eAwardType eType, bool bLeaderboardAffected=false, + CXuiStringTable*pStringTable=NULL, int iTitleStr=-1, int iTextStr=-1, int iAcceptStr=-1, char *pszThemeName=NULL, unsigned int uiThemeSize=0L); + int GetAwardId(int iAwardNumber); + eAwardType GetAwardType(int iAwardNumber); + bool CanBeAwarded(int iQuadrant, int iAwardNumber); + void Award(int iQuadrant, int iAwardNumber, bool bForce=false); + bool IsAwardsFlagSet(int iQuadrant, int iAward); + + // RICH PRESENCE + + void RichPresenceInit(int iPresenceCount, int iContextCount); + void RegisterRichPresenceContext(int iGameConfigContextID); + void SetRichPresenceContextValue(int iPad,int iContextID, int iVal); + void SetCurrentGameActivity(int iPad,int iNewPresence, bool bSetOthersToIdle=false); + + // PURCHASE + void DisplayFullVersionPurchase(bool bRequired, int iQuadrant, int iUpsellParam = -1); + void SetUpsellCallback(void ( *Func)(LPVOID lpParam, eUpsellType type, eUpsellResponse response, int iUserData),LPVOID lpParam); + + // Debug + void SetDebugFullOverride(bool bVal); // To override the license version (trail/full). Only in debug/release, not ContentPackage + +}; + +// Singleton +extern C_4JProfile ProfileManager; + diff --git a/Headers/Xbox/4J_Render.h b/Headers/Xbox/4J_Render.h new file mode 100644 index 0000000..5f113d5 --- /dev/null +++ b/Headers/Xbox/4J_Render.h @@ -0,0 +1,238 @@ +#pragma once +#include + +const int GL_MODELVIEW_MATRIX = 0; +const int GL_PROJECTION_MATRIX = 1; +const int GL_MODELVIEW = 0; +const int GL_PROJECTION = 1; +const int GL_TEXTURE = 2; + +// These things required for tex gen + +const int GL_S = 0; +const int GL_T = 1; +const int GL_R = 2; +const int GL_Q = 3; + +const int GL_TEXTURE_GEN_S = 0; +const int GL_TEXTURE_GEN_T = 1; +const int GL_TEXTURE_GEN_Q = 2; +const int GL_TEXTURE_GEN_R = 3; + +const int GL_TEXTURE_GEN_MODE = 0; +const int GL_OBJECT_LINEAR = 0; +const int GL_EYE_LINEAR = 1; +const int GL_OBJECT_PLANE = 0; +const int GL_EYE_PLANE = 1; + + +// These things are used by glEnable/glDisable so must be different and non-zero (zero is used by things we haven't assigned yet) +const int GL_TEXTURE_2D = 1; +const int GL_BLEND = 2; +const int GL_CULL_FACE = 3; +const int GL_ALPHA_TEST = 4; +const int GL_DEPTH_TEST = 5; +const int GL_FOG = 6; +const int GL_LIGHTING = 7; +const int GL_LIGHT0 = 8; +const int GL_LIGHT1 = 9; + + +const int GL_DEPTH_BUFFER_BIT = D3DCLEAR_ZBUFFER; +const int GL_COLOR_BUFFER_BIT = D3DCLEAR_TARGET; + +const int GL_QUADS = D3DPT_QUADLIST; +const int GL_TRIANGLES = D3DPT_TRIANGLELIST; +const int GL_LINE_STRIP = D3DPT_LINESTRIP; +const int GL_TRIANGLE_STRIP = D3DPT_TRIANGLESTRIP; +const int GL_TRIANGLE_FAN = D3DPT_TRIANGLEFAN; +const int GL_LINES=D3DPT_LINELIST; +const int GL_SRC_ALPHA = D3DBLEND_SRCALPHA; +const int GL_ONE_MINUS_SRC_ALPHA = D3DBLEND_INVSRCALPHA; +const int GL_ONE = D3DBLEND_ONE; +const int GL_ZERO = D3DBLEND_ZERO; +const int GL_DST_ALPHA = D3DBLEND_DESTALPHA; +const int GL_SRC_COLOR = D3DBLEND_SRCCOLOR; +const int GL_DST_COLOR = D3DBLEND_DESTCOLOR; +const int GL_ONE_MINUS_DST_COLOR = D3DBLEND_INVDESTCOLOR; +const int GL_ONE_MINUS_SRC_COLOR = D3DBLEND_INVSRCCOLOR; +const int GL_CONSTANT_ALPHA = D3DBLEND_CONSTANTALPHA; +const int GL_ONE_MINUS_CONSTANT_ALPHA = D3DBLEND_INVCONSTANTALPHA; + +const int GL_GREATER = D3DCMP_GREATER; +const int GL_EQUAL = D3DCMP_EQUAL; +const int GL_LEQUAL = D3DCMP_LESSEQUAL; +const int GL_GEQUAL = D3DCMP_GREATEREQUAL; +const int GL_ALWAYS = D3DCMP_ALWAYS; + +const int GL_TEXTURE_MIN_FILTER = 1; +const int GL_TEXTURE_MAG_FILTER = 2; +const int GL_TEXTURE_WRAP_S = 3; +const int GL_TEXTURE_WRAP_T = 4; + +const int GL_NEAREST = 0; +const int GL_LINEAR = 1; +const int GL_EXP = 2; +const int GL_NEAREST_MIPMAP_LINEAR = 0; // TODO - mipmapping bit of this + +const int GL_CLAMP = 0; +const int GL_REPEAT = 1; + +const int GL_FOG_START = 1; +const int GL_FOG_END = 2; +const int GL_FOG_MODE = 3; +const int GL_FOG_DENSITY = 4; +const int GL_FOG_COLOR = 5; + +const int GL_POSITION = 1; +const int GL_AMBIENT = 2; +const int GL_DIFFUSE = 3; +const int GL_SPECULAR = 4; + +const int GL_LIGHT_MODEL_AMBIENT = 1; + + +class C4JRender +{ +public: + void Tick(); + void UpdateGamma(unsigned short usGamma); + + // Matrix stack + void MatrixMode(int type); + void MatrixSetIdentity(); + void MatrixTranslate(float x,float y,float z); + void MatrixRotate(float angle, float x, float y, float z); + void MatrixScale(float x, float y, float z); + void MatrixPerspective(float fovy, float aspect, float zNear, float zFar); + void MatrixOrthogonal(float left,float right,float bottom,float top,float zNear,float zFar); + void MatrixPop(); + void MatrixPush(); + void MatrixMult(float *mat); + const float *MatrixGet(int type); + void Set_matrixDirty(); + + // Core + void Initialise(IDirect3DDevice9 *pDevice); + void InitialiseContext(); + void Present(); + void Clear(int flags, D3DRECT *pRect = NULL); + void SetClearColour(D3DCOLOR colour); + bool IsWidescreen(); + bool IsHiDef(); + void CaptureThumbnail(LPD3DXBUFFER *pngOut); + void CaptureScreen(LPD3DXBUFFER *jpgOut, XSOCIAL_PREVIEWIMAGE *previewOut); + void BeginConditionalSurvey(int identifier); + void EndConditionalSurvey(); + void BeginConditionalRendering(int identifier); + void EndConditionalRendering(); + + // Vertex data handling + typedef enum + { + VERTEX_TYPE_PF3_TF2_CB4_NB4_XW1, // Position 3 x float, texture 2 x float, colour 4 x byte, normal 4 x byte, padding 1 DWORD + VERTEX_TYPE_PS3_TS2_CS1, // Position 3 x short, texture 2 x short, colour 4 x byte, padding 1 DWORD + VERTEX_TYPE_PF3_TF2_CB4_NB4_XW1_LIT, // as VERTEX_TYPE_PF3_TF2_CB4_NB4_XW1 with lighting applied, + VERTEX_TYPE_PF3_TF2_CB4_NB4_XW1_TEXGEN, // as VERTEX_TYPE_PF3_TF2_CB4_NB4_XW1 with tex gen + VERTEX_TYPE_COUNT + } eVertexType; + + // Pixel shader + typedef enum + { + PIXEL_SHADER_TYPE_STANDARD, + PIXEL_SHADER_TYPE_PROJECTION, + PIXEL_SHADER_TYPE_LOD_FORCE, + PIXEL_SHADER_COUNT + } ePixelShaderType; + + typedef enum + { + VIEWPORT_TYPE_FULLSCREEN, + VIEWPORT_TYPE_SPLIT_TOP, + VIEWPORT_TYPE_SPLIT_BOTTOM, + VIEWPORT_TYPE_SPLIT_LEFT, + VIEWPORT_TYPE_SPLIT_RIGHT, + VIEWPORT_TYPE_QUADRANT_TOP_LEFT, + VIEWPORT_TYPE_QUADRANT_TOP_RIGHT, + VIEWPORT_TYPE_QUADRANT_BOTTOM_LEFT, + VIEWPORT_TYPE_QUADRANT_BOTTOM_RIGHT, + } eViewportType; + + void DrawVertices(D3DPRIMITIVETYPE PrimitiveType, int count, void *dataIn, eVertexType vType, C4JRender::ePixelShaderType psType); + void DrawVertexBuffer(D3DPRIMITIVETYPE PrimitiveType, int count, IDirect3DVertexBuffer9 *buffer, C4JRender::eVertexType vType, C4JRender::ePixelShaderType psType); + + // Command buffers + void CBuffLockStaticCreations(); + int CBuffCreate(int count); + void CBuffDelete(int first, int count); + void CBuffStart(int index); + void CBuffClear(int index); + int CBuffSize(int index); + void CBuffEnd(int vertexCount); + bool CBuffCall(int index, bool full = true); + void CBuffTick(); + void CBuffDeferredModeStart(); + void CBuffDeferredModeEnd(); + + typedef enum + { + TEXTURE_FORMAT_RxGyBzAw, // Normal 32-bit RGBA texture, 8 bits per component + TEXTURE_FORMAT_R0G0B0Ax, // One 8-bit component mapped to alpha channel, R=G=B=0 + TEXTURE_FORMAT_R1G1B1Ax, // One 8-bit component mapped to alpha channel, R=G=B=1 + TEXTURE_FORMAT_RxGxBxAx, // One 8-bit component mapped to all channels + MAX_TEXTURE_FORMATS + } eTextureFormat; + + // Textures + int TextureCreate(); + void TextureFree(int idx); + void TextureBind(int idx); + void TextureBindVertex(int idx); + void TextureSetTextureLevels(int levels); + int TextureGetTextureLevels(); + void TextureData(int width, int height, void *data, int level, eTextureFormat format = TEXTURE_FORMAT_RxGyBzAw); + void TextureDataUpdate(void *data, int level); + void TextureSetParam(int param, int value); + HRESULT LoadTextureData(const char *szFilename,D3DXIMAGE_INFO *pSrcInfo, int **ppDataOut); + HRESULT LoadTextureData(BYTE *pbData, DWORD dwBytes,D3DXIMAGE_INFO *pSrcInfo, int **ppDataOut); + HRESULT SaveTextureData(const char *szFilename, D3DXIMAGE_INFO *pSrcInfo, int *ppDataOut); + void TextureGetStats(); + + // State control + void StateSetColour(float r, float g, float b, float a); + void StateSetDepthMask(bool enable); + void StateSetBlendEnable(bool enable); + void StateSetBlendFunc(int src, int dst); + void StateSetBlendFactor(unsigned int colour); + void StateSetAlphaFunc(int func, float param); + void StateSetDepthFunc(int func); + void StateSetFaceCull(bool enable); + void StateSetFaceCullCW(bool cw); + void StateSetLineWidth(float width); + void StateSetWriteEnable(bool red, bool green, bool blue, bool alpha); + void StateSetDepthTestEnable(bool enable); + void StateSetAlphaTestEnable(bool enable); + void StateSetDepthSlopeAndBias(float slope, float bias); + void StateSetFogEnable(bool enable); + void StateSetFogMode(int mode); + void StateSetFogNearDistance(float dist); + void StateSetFogFarDistance(float dist); + void StateSetFogDensity(float density); + void StateSetFogColour(float red, float green, float blue); + void StateSetLightingEnable(bool enable); + void StateSetVertexTextureUV( float u, float v); + void StateSetLightColour(int light, float red, float green, float blue); + void StateSetLightAmbientColour(float red, float green, float blue); + void StateSetLightDirection(int light, float x, float y, float z); + void StateSetLightEnable(int light, bool enable); + void StateSetViewport(eViewportType viewportType); + void StateSetEnableViewportClipPlanes(bool enable); + void StateSetTexGenCol(int col, float x, float y, float z, float w, bool eyeSpace); + void StateSetForceLOD(int LOD); +}; + + +// Singleton +extern C4JRender RenderManager; + diff --git a/Headers/Xbox/4J_Storage.h b/Headers/Xbox/4J_Storage.h new file mode 100644 index 0000000..453ee81 --- /dev/null +++ b/Headers/Xbox/4J_Storage.h @@ -0,0 +1,314 @@ +#pragma once +using namespace std; +#include + + +class CXuiStringTable; + +typedef struct +{ + FILETIME fTime; + XCONTENT_DATA Content; + bool bSaveIsDamaged; +} +SAVE_DETAILS,*PSAVE_DETAILS; + + +typedef + VOID + (CALLBACK * TMSCLIENT_PROG_CALLBACK)( + __in float progress, + __in_opt void* userCallbackData + ); + +//typedef std::vector OfferDataArray; +typedef std::vector OfferDataArray; +typedef std::vector XContentDataArray; +//typedef std::vector SaveDetailsArray; + +// Current version of the dlc data creator +#define CURRENT_DLC_VERSION_NUM 3 + +class C4JStorage +{ + +public: + // Structs defined in the DLC_Creator, but added here to be used in the app + typedef struct + { + unsigned int uiFileSize; + DWORD dwType; + DWORD dwWchCount; // count of WCHAR in next array + WCHAR wchFile[1]; + } + DLC_FILE_DETAILS, *PDLC_FILE_DETAILS; + + typedef struct + { + DWORD dwType; + DWORD dwWchCount; // count of WCHAR in next array; + WCHAR wchData[1]; // will be an array of size dwBytes + } + DLC_FILE_PARAM, *PDLC_FILE_PARAM; + // End of DLC_Creator structs + + typedef struct + { + WCHAR wchDisplayName[XCONTENT_MAX_DISPLAYNAME_LENGTH]; + CHAR szFileName[XCONTENT_MAX_FILENAME_LENGTH]; + DWORD dwImageOffset; + DWORD dwImageBytes; + } + CACHEINFOSTRUCT; + + // structure to hold DLC info in TMS + typedef struct + { + DWORD dwVersion; + DWORD dwNewOffers; + DWORD dwTotalOffers; + DWORD dwInstalledTotalOffers; + BYTE bPadding[1024-sizeof(DWORD)*4]; // future expansion + } + DLC_TMS_DETAILS; + + enum eGTS_FileTypes + { + eGTS_Type_Skin=0, + eGTS_Type_Cape, + eGTS_Type_MAX + }; + + enum eGlobalStorage + { + //eGlobalStorage_GameClip=0, + eGlobalStorage_Title=0, + eGlobalStorage_TitleUser, + eGlobalStorage_Max + }; + + enum EMessageResult + { + EMessage_Undefined=0, + EMessage_Busy, + EMessage_Pending, + EMessage_Cancelled, + EMessage_ResultAccept, + EMessage_ResultDecline, + EMessage_ResultThirdOption, + EMessage_ResultFourthOption + }; + + enum ESaveGameControlState + { + ESaveGameControl_Idle=0, + ESaveGameControl_Save, + ESaveGameControl_InternalRequestingDevice, + ESaveGameControl_InternalGetSaveName, + ESaveGameControl_InternalSaving, + ESaveGameControl_CopySave, + ESaveGameControl_CopyingSave, +#ifndef _WINDOWS64 + ESaveGame_Load, + ESaveGame_GetSavesInfo, + ESaveGame_Rename, + ESaveGame_Delete, + + ESaveGame_GetSaveThumbnail // Not used as an actual state in the PS4, but the game expects this to be returned to indicate success when getting a thumbnail +#endif + }; + + enum ELoadGameStatus + { + ELoadGame_Idle=0, + ELoadGame_InProgress, + ELoadGame_NoSaves, + ELoadGame_ChangedDevice, + ELoadGame_DeviceRemoved + }; + + enum EDeleteGameStatus + { + EDeleteGame_Idle=0, + EDeleteGame_InProgress, + }; + + + enum ESGIStatus + { + ESGIStatus_Error=0, + ESGIStatus_Idle, + ESGIStatus_ReadInProgress, + ESGIStatus_NoSaves, + }; + + enum EDLCStatus + { + EDLC_Error=0, + EDLC_Idle, + EDLC_NoOffers, + EDLC_AlreadyEnumeratedAllOffers, + EDLC_NoInstalledDLC, + EDLC_Pending, + EDLC_LoadInProgress, + EDLC_Loaded, + EDLC_ChangedDevice + }; + + enum ESavingMessage + { + ESavingMessage_None=0, + ESavingMessage_Short, + ESavingMessage_Long + }; + + enum ETMSStatus + { + ETMSStatus_Idle=0, + ETMSStatus_Fail, + ETMSStatus_ReadInProgress, + ETMSStatus_ReadFileListInProgress, + ETMSStatus_WriteInProgress, + ETMSStatus_Fail_ReadInProgress, + ETMSStatus_Fail_ReadFileListInProgress, + ETMSStatus_Fail_ReadDetailsNotRetrieved, + ETMSStatus_Fail_WriteInProgress, + ETMSStatus_DeleteInProgress, + ETMSStatus_Pending, + }; + + enum eTMS_FileType + { + eTMS_FileType_Normal=0, + eTMS_FileType_Graphic, + }; + + enum eTMS_FILETYPEVAL + { + TMS_FILETYPE_BINARY=0, + TMS_FILETYPE_CONFIG=1, + TMS_FILETYPE_JSON=2, + TMS_FILETYPE_MAX, + }; + enum eTMS_UGCTYPE + { + TMS_UGCTYPE_NONE, + TMS_UGCTYPE_IMAGE, + TMS_UGCTYPE_MAX + }; + + typedef struct + { + CHAR szFilename[256]; + int iFileSize; + eTMS_FILETYPEVAL eFileTypeVal; + } + TMSPP_FILE_DETAILS, *PTMSPP_FILE_DETAILS; + + typedef struct + { + int iCount; + PTMSPP_FILE_DETAILS FileDetailsA; + } + TMSPP_FILE_LIST, *PTMSPP_FILE_LIST; + + typedef struct + { + DWORD dwSize; + PBYTE pbData; + } + TMSPP_FILEDATA, *PTMSPP_FILEDATA; + + C4JStorage(); + + void Tick(void); + + // Messages + C4JStorage::EMessageResult RequestMessageBox(UINT uiTitle, UINT uiText, UINT *uiOptionA,UINT uiOptionC, DWORD dwPad=XUSER_INDEX_ANY, + int( *Func)(LPVOID,int,const C4JStorage::EMessageResult)=NULL,LPVOID lpParam=NULL, CXuiStringTable *pStringTable=NULL, WCHAR *pwchFormatString=NULL,DWORD dwFocusButton=0); + void CancelMessageBoxRequest(); + + C4JStorage::EMessageResult GetMessageBoxResult(); + + // save device + bool SetSaveDevice(int( *Func)(LPVOID,const bool),LPVOID lpParam, bool bForceResetOfSaveDevice=false); + + // savegame + void Init(LPCWSTR pwchDefaultSaveName,char *pszSavePackName,int iMinimumSaveSize, int( *Func)(LPVOID, const ESavingMessage, int),LPVOID lpParam,LPCSTR szGroupID); + void ResetSaveData(); // Call before a new save to clear out stored save file name + void SetDefaultSaveNameForKeyboardDisplay(LPCWSTR pwchDefaultSaveName); + void SetSaveTitle(LPCWSTR pwchDefaultSaveName); + LPCWSTR GetSaveTitle(); + bool GetSaveUniqueNumber(INT *piVal); + bool GetSaveUniqueFilename(char *pszName); + void SetState(ESaveGameControlState eControlState,int( *Func)(LPVOID,const bool),LPVOID lpParam); + void SetSaveDisabled(bool bDisable); + bool GetSaveDisabled(void); + unsigned int GetSaveSize(); + void GetSaveData(void *pvData,unsigned int *puiBytes); + PVOID AllocateSaveData(unsigned int uiBytes); + void SaveSaveData(unsigned int uiBytes,PBYTE pbThumbnail=NULL,DWORD cbThumbnail=0,PBYTE pbTextData=NULL, DWORD dwTextLen=0); + void CopySaveDataToNewSave(PBYTE pbThumbnail,DWORD cbThumbnail,WCHAR *wchNewName,int ( *Func)(LPVOID lpParam, bool), LPVOID lpParam); + void SetSaveDeviceSelected(unsigned int uiPad,bool bSelected); + bool GetSaveDeviceSelected(unsigned int iPad); + C4JStorage::ELoadGameStatus DoesSaveExist(bool *pbExists); + bool EnoughSpaceForAMinSaveGame(); + + void SetSaveMessageVPosition(float fY); // The 'Saving' message will display at a default position unless changed + // Get the info for the saves + C4JStorage::ESGIStatus GetSavesInfo(int iPad,bool ( *Func)(LPVOID, int, CACHEINFOSTRUCT *, int, HRESULT),LPVOID lpParam,char *pszSavePackName); + + void GetSaveCacheFileInfo(DWORD dwFile,XCONTENT_DATA &xContentData); + void GetSaveCacheFileInfo(DWORD dwFile, PBYTE *ppbImageData, DWORD *pdwImageBytes); + + // Load the save. Need to call GetSaveData once the callback is called + C4JStorage::ELoadGameStatus LoadSaveData(XCONTENT_DATA *pContentData,int( *Func)(LPVOID lpParam,const bool), LPVOID lpParam); + C4JStorage::EDeleteGameStatus DeleteSaveData(XCONTENT_DATA *pContentData,int( *Func)(LPVOID lpParam,const bool), LPVOID lpParam); + + // DLC + void RegisterMarketplaceCountsCallback(int ( *Func)(LPVOID lpParam, C4JStorage::DLC_TMS_DETAILS *, int), LPVOID lpParam ); + void SetDLCPackageRoot(char *pszDLCRoot); + C4JStorage::EDLCStatus GetDLCOffers(int iPad,int( *Func)(LPVOID, int, DWORD, int),LPVOID lpParam, DWORD dwOfferTypesBitmask=XMARKETPLACE_OFFERING_TYPE_CONTENT); + DWORD CancelGetDLCOffers(); + void ClearDLCOffers(); + //XMARKETPLACE_CONTENTOFFER_INFO& GetOffer(DWORD dw); + XMARKETPLACE_CURRENCY_CONTENTOFFER_INFO& GetOffer(DWORD dw); + int GetOfferCount(); + DWORD InstallOffer(int iOfferIDC,unsigned __int64 *ullOfferIDA,int( *Func)(LPVOID, int, int),LPVOID lpParam, bool bTrial=false); + DWORD GetAvailableDLCCount( int iPad); + + C4JStorage::EDLCStatus GetInstalledDLC(int iPad,int( *Func)(LPVOID, int, int),LPVOID lpParam); + XCONTENT_DATA& GetDLC(DWORD dw); + DWORD MountInstalledDLC(int iPad,DWORD dwDLC,int( *Func)(LPVOID, int, DWORD,DWORD),LPVOID lpParam,LPCSTR szMountDrive=NULL); + DWORD UnmountInstalledDLC(LPCSTR szMountDrive=NULL); + + // Global title storage + C4JStorage::ETMSStatus ReadTMSFile(int iQuadrant,eGlobalStorage eStorageFacility,C4JStorage::eTMS_FileType eFileType, + WCHAR *pwchFilename,BYTE **ppBuffer,DWORD *pdwBufferSize,int( *Func)(LPVOID, WCHAR *,int, bool, int)=NULL,LPVOID lpParam=NULL, int iAction=0); + bool WriteTMSFile(int iQuadrant,eGlobalStorage eStorageFacility,WCHAR *pwchFilename,BYTE *pBuffer,DWORD dwBufferSize); + bool DeleteTMSFile(int iQuadrant,eGlobalStorage eStorageFacility,WCHAR *pwchFilename); + void StoreTMSPathName(WCHAR *pwchName=NULL); + + // TMS++ + C4JStorage::ETMSStatus TMSPP_WriteFile(int iPad,C4JStorage::eGlobalStorage eStorageFacility,C4JStorage::eTMS_FILETYPEVAL eFileTypeVal,C4JStorage::eTMS_UGCTYPE eUGCType,CHAR *pchFilePath,CHAR *pchBuffer,DWORD dwBufferSize,int( *Func)(LPVOID,int,int)=NULL,LPVOID lpParam=NULL, int iUserData=0); + C4JStorage::ETMSStatus TMSPP_GetUserQuotaInfo(int iPad,TMSCLIENT_CALLBACK Func,LPVOID lpParam, int iUserData=0); + C4JStorage::ETMSStatus TMSPP_ReadFile(int iPad,C4JStorage::eGlobalStorage eStorageFacility,C4JStorage::eTMS_FILETYPEVAL eFileTypeVal,LPCSTR szFilename,int( *Func)(LPVOID,int,int,PTMSPP_FILEDATA, LPCSTR)=NULL,LPVOID lpParam=NULL, int iUserData=0); + C4JStorage::ETMSStatus TMSPP_ReadFileList(int iPad,C4JStorage::eGlobalStorage eStorageFacility,CHAR *pchFilePath,int( *Func)(LPVOID,int,int,PTMSPP_FILE_LIST)=NULL,LPVOID lpParam=NULL, int iUserData=0); + C4JStorage::ETMSStatus TMSPP_DeleteFile(int iPad,LPCSTR szFilePath,C4JStorage::eTMS_FILETYPEVAL eFileTypeVal,int( *Func)(LPVOID,int,int),LPVOID lpParam=NULL, int iUserData=0); + bool TMSPP_InFileList(eGlobalStorage eStorageFacility, int iPad,const wstring &Filename); + unsigned int CRC(unsigned char *buf, int len); + + C4JStorage::ETMSStatus TMSPP_WriteFileWithProgress(int iPad,C4JStorage::eGlobalStorage eStorageFacility,C4JStorage::eTMS_FILETYPEVAL eFileTypeVal,C4JStorage::eTMS_UGCTYPE eUGCType,CHAR *pchFilePath,CHAR *pchBuffer,DWORD dwBufferSize,int( *Func)(LPVOID,int,int)=NULL,LPVOID lpParam=NULL, int iUserData=0, + int( *CompletionFunc)(LPVOID,float fComplete)=NULL,LPVOID lpCompletionParam=NULL); + void TMSPP_CancelWriteFileWithProgress(int iPad); + + HRESULT TMSPP_SetTitleGroupID(LPCSTR szGroupID); + +// #ifdef _DEBUG +// void SetSaveName(int i); +// #endif + // string table for all the Storage problems. Loaded by the application + CXuiStringTable *m_pStringTable; +}; + +extern C4JStorage StorageManager; diff --git a/Headers/Xbox/4J_xtms.h b/Headers/Xbox/4J_xtms.h new file mode 100644 index 0000000..ea35da4 --- /dev/null +++ b/Headers/Xbox/4J_xtms.h @@ -0,0 +1,55 @@ +/*++ + +Copyright (c) Microsoft Corporation. All rights reserved. + +Module Name: + + xsgx_xtms.h + +--*/ +#include "xtms.h" + +#pragma once + +#if defined(__cplusplus) +extern "C" { +#endif + +#ifndef XSGX_MOD1 + +typedef +VOID +(CALLBACK * TMSCLIENT_PROG_CALLBACK)( + __in float progress, + __in_opt void* userCallbackData + ); + + +XBOXAPI +HRESULT +WINAPI +XSGX_XTmsPutUserFile( + __in HTMSCLIENT tmsClient, + __in XUID xuid, + __in_z LPCSTR filePath, + __in_z LPCSTR fileType, + __in_z LPCSTR displayName, + __in_z LPCSTR ugcContentType, + __in_bcount(fileSize) CONST CHAR* fileBuffer, + __in DWORD fileSize, + __in_opt DWORD bufferSize, + __in_z_opt LPCSTR etag, + __in ETAGFLAG etagFlag, + __in TMSCLIENT_CALLBACK clientCallback, + __in_opt PVOID userCallbackData, + __in TMSCLIENT_PROG_CALLBACK clientProgCallback, + __in_opt PVOID progCallbackData + ); + +void XSGX_XTmsCancelPutUserFile(__in HTMSCLIENT tmsClient); + +#endif + +#if defined(__cplusplus) +} +#endif diff --git a/Headers/extraX64.h b/Headers/extraX64.h new file mode 100644 index 0000000..c5a63aa --- /dev/null +++ b/Headers/extraX64.h @@ -0,0 +1,639 @@ +#pragma once +#include +#include +#include +#include + +#include + +#define MULTITHREAD_ENABLE + +//const int XUSER_INDEX_ANY = 255; +const int XUSER_INDEX_FOCUS = 254; + +#ifdef __PSVITA__ +const int XUSER_MAX_COUNT = 1; +const int MINECRAFT_NET_MAX_PLAYERS = 4; +#else +//const int XUSER_MAX_COUNT = 4; +const int MINECRAFT_NET_MAX_PLAYERS = 8; +#endif + +// @Patoke: i'm sorry i had to do this for compat +namespace sigma +{ + enum class byte : unsigned char {}; +} + +#ifdef __ORBIS__ +#include +#include +#include +#include "..\..\Minecraft.Client\Orbis\Orbis_PlayerUID.h" +#include "..\..\Minecraft.Client\Orbis\Network\SQRNetworkManager_Orbis.h" +typedef SQRNetworkManager_Orbis::SessionID SessionID; +typedef SQRNetworkManager_Orbis::PresenceSyncInfo INVITE_INFO; + +#elif defined __PS3__ // defined in the profile lib +#include +#include +#include +#include +#include +#include "..\..\Minecraft.Client\PS3\PS3_PlayerUID.h" +#include "..\..\Minecraft.Client\PS3\Network\SQRNetworkManager_PS3.h" +typedef SQRNetworkManager::SessionID SessionID; +typedef SQRNetworkManager::PresenceSyncInfo INVITE_INFO; + +#elif defined __PSVITA__ +#include +#include +#include +#include "..\..\Minecraft.Client\PSVita\PSVita_PlayerUID.h" +#include "..\..\Minecraft.Client\PSVita\Network\SQRNetworkManager_Vita.h" +#include "..\..\Minecraft.Client\PSVita\Network\SQRNetworkManager_AdHoc_Vita.h" +typedef SQRNetworkManager_Vita::SessionID SessionID; +typedef SQRNetworkManager_Vita::PresenceSyncInfo INVITE_INFO; + +#elif defined _DURANGO +#include "..\..\Minecraft.Client\Durango\4JLibs\inc\4J_Profile.h" +#include "..\..\Minecraft.Client\Durango\Network\DQRNetworkManager.h" +typedef ULONGLONG SessionID; +typedef ULONGLONG GameSessionUID; +typedef DQRNetworkManager::SessionInfo INVITE_INFO; +#else +typedef ULONGLONG PlayerUID; +typedef ULONGLONG SessionID; +typedef PlayerUID GameSessionUID; +class INVITE_INFO; + +#endif // __PS3__ + +#ifndef _DURANGO +typedef PlayerUID *PPlayerUID; +#endif +typedef struct _XUIOBJ* HXUIOBJ; +typedef struct _XUICLASS* HXUICLASS; +typedef struct _XUIBRUSH* HXUIBRUSH; +typedef struct _XUIDC* HXUIDC; + + + +// #ifdef _DURANGO +// void GetLocalTime(SYSTEMTIME *time); +// #endif + +bool IsEqualXUID(PlayerUID a, PlayerUID b); + +using namespace std; + +// Temporary implementation of lock free stack with quite a bit more locking than you might expect +template class XLockFreeStack +{ + std::vector intStack; +public: + XLockFreeStack() { +#ifdef __ORBIS__ + OrbisInit(); // For PS4, we need to make sure Ult is set up for the critical sections to be able to initialise +#endif + InitializeCriticalSectionAndSpinCount(&m_cs,5120); + } + ~XLockFreeStack() { DeleteCriticalSection( &m_cs ); } + void Initialize() {} + void Push(T *data) + { + EnterCriticalSection(&m_cs); + intStack.push_back(data); + LeaveCriticalSection(&m_cs); + } + T *Pop() + { + EnterCriticalSection(&m_cs); + if( intStack.size() ) + { + T* ret = intStack.back(); + intStack.pop_back(); + LeaveCriticalSection(&m_cs); + return ret; + } + else + { + LeaveCriticalSection(&m_cs); + return NULL; + } + } +private: + CRITICAL_SECTION m_cs; +}; + +void XMemCpy(void *a, const void *b, size_t s); +void XMemSet(void *a, int t, size_t s); +void XMemSet128(void *a, int t, size_t s); +void *XPhysicalAlloc(SIZE_T a, ULONG_PTR b, ULONG_PTR c, DWORD d); +void XPhysicalFree(void *a); + +class DLCManager; + +//class LevelGenerationOptions; +class LevelRuleset; +class ModelPart; +class LevelChunk; +class IXACT3Engine; +class XACT_NOTIFICATION; +class ConsoleSchematicFile; + +const int XZP_ICON_SHANK_01 = 1; +const int XZP_ICON_SHANK_02 = 2; +const int XZP_ICON_SHANK_03 = 3; + +const int XN_SYS_SIGNINCHANGED = 0; +const int XN_SYS_INPUTDEVICESCHANGED = 1; +const int XN_LIVE_CONTENT_INSTALLED = 2; +const int XN_SYS_STORAGEDEVICESCHANGED = 3; + +// +// Codes returned for the gamepad input +// + +#define VK_PAD_A 0x5800 +#define VK_PAD_B 0x5801 +#define VK_PAD_X 0x5802 +#define VK_PAD_Y 0x5803 +#define VK_PAD_RSHOULDER 0x5804 +#define VK_PAD_LSHOULDER 0x5805 +#define VK_PAD_LTRIGGER 0x5806 +#define VK_PAD_RTRIGGER 0x5807 + +#define VK_PAD_DPAD_UP 0x5810 +#define VK_PAD_DPAD_DOWN 0x5811 +#define VK_PAD_DPAD_LEFT 0x5812 +#define VK_PAD_DPAD_RIGHT 0x5813 +#define VK_PAD_START 0x5814 +#define VK_PAD_BACK 0x5815 +#define VK_PAD_LTHUMB_PRESS 0x5816 +#define VK_PAD_RTHUMB_PRESS 0x5817 + +#define VK_PAD_LTHUMB_UP 0x5820 +#define VK_PAD_LTHUMB_DOWN 0x5821 +#define VK_PAD_LTHUMB_RIGHT 0x5822 +#define VK_PAD_LTHUMB_LEFT 0x5823 +#define VK_PAD_LTHUMB_UPLEFT 0x5824 +#define VK_PAD_LTHUMB_UPRIGHT 0x5825 +#define VK_PAD_LTHUMB_DOWNRIGHT 0x5826 +#define VK_PAD_LTHUMB_DOWNLEFT 0x5827 + +#define VK_PAD_RTHUMB_UP 0x5830 +#define VK_PAD_RTHUMB_DOWN 0x5831 +#define VK_PAD_RTHUMB_RIGHT 0x5832 +#define VK_PAD_RTHUMB_LEFT 0x5833 +#define VK_PAD_RTHUMB_UPLEFT 0x5834 +#define VK_PAD_RTHUMB_UPRIGHT 0x5835 +#define VK_PAD_RTHUMB_DOWNRIGHT 0x5836 +#define VK_PAD_RTHUMB_DOWNLEFT 0x5837 + +const int XUSER_NAME_SIZE = 32; + +class IQNetPlayer +{ +public: + BYTE GetSmallId(); + void SendData(IQNetPlayer *player, const void *pvData, DWORD dwDataSize, DWORD dwFlags); + bool IsSameSystem(IQNetPlayer *player); + DWORD GetSendQueueSize( IQNetPlayer *player, DWORD dwFlags ); + DWORD GetCurrentRtt(); + bool IsHost(); + bool IsGuest(); + bool IsLocal(); + PlayerUID GetXuid(); + LPCWSTR GetGamertag(); + int GetSessionIndex(); + bool IsTalking(); + bool IsMutedByLocalUser(DWORD dwUserIndex); + bool HasVoice(); + bool HasCamera(); + int GetUserIndex(); + void SetCustomDataValue(ULONG_PTR ulpCustomDataValue); + ULONG_PTR GetCustomDataValue(); +private: + ULONG_PTR m_customData; +}; + +const int QNET_GETSENDQUEUESIZE_SECONDARY_TYPE = 0; +const int QNET_GETSENDQUEUESIZE_MESSAGES = 0; +const int QNET_GETSENDQUEUESIZE_BYTES = 0; + + +typedef struct { + BYTE bFlags; + BYTE bReserved; + WORD cProbesXmit; + WORD cProbesRecv; + WORD cbData; + BYTE *pbData; + WORD wRttMinInMsecs; + WORD wRttMedInMsecs; + DWORD dwUpBitsPerSec; + DWORD dwDnBitsPerSec; +} XNQOSINFO; + +typedef struct { + UINT cxnqos; + UINT cxnqosPending; + XNQOSINFO axnqosinfo[1]; +} XNQOS; + +typedef struct _XOVERLAPPED { +} XOVERLAPPED, *PXOVERLAPPED; + +typedef struct _XSESSION_SEARCHRESULT { +} XSESSION_SEARCHRESULT, *PXSESSION_SEARCHRESULT; + +typedef struct { + DWORD dwContextId; + DWORD dwValue; +} XUSER_CONTEXT, *PXUSER_CONTEXT; + +typedef struct _XSESSION_SEARCHRESULT_HEADER { + DWORD dwSearchResults; + XSESSION_SEARCHRESULT *pResults; +} XSESSION_SEARCHRESULT_HEADER, *PXSESSION_SEARCHRESULT_HEADER; + +typedef struct _XONLINE_FRIEND { + PlayerUID xuid; + CHAR szGamertag[XUSER_NAME_SIZE]; + DWORD dwFriendState; + SessionID sessionID; + DWORD dwTitleID; + FILETIME ftUserTime; + SessionID xnkidInvite; + FILETIME gameinviteTime; + DWORD cchRichPresence; +// WCHAR wszRichPresence[MAX_RICHPRESENCE_SIZE]; +} XONLINE_FRIEND, *PXONLINE_FRIEND; + +class IQNetCallbacks +{ +}; + +class IQNetGameSearch +{ +}; + + +typedef enum _QNET_STATE +{ + QNET_STATE_IDLE, + QNET_STATE_SESSION_HOSTING, + QNET_STATE_SESSION_JOINING, + QNET_STATE_GAME_LOBBY, + QNET_STATE_SESSION_REGISTERING, + QNET_STATE_SESSION_STARTING, + QNET_STATE_GAME_PLAY, + QNET_STATE_SESSION_ENDING, + QNET_STATE_SESSION_LEAVING, + QNET_STATE_SESSION_DELETING +} QNET_STATE, * PQNET_STATE; + +class IQNet +{ +public: + HRESULT AddLocalPlayerByUserIndex(DWORD dwUserIndex); + IQNetPlayer *GetHostPlayer(); + IQNetPlayer *GetLocalPlayerByUserIndex(DWORD dwUserIndex); + IQNetPlayer *GetPlayerByIndex(DWORD dwPlayerIndex); + IQNetPlayer *GetPlayerBySmallId(BYTE SmallId); + IQNetPlayer *GetPlayerByXuid(PlayerUID xuid); + DWORD GetPlayerCount(); + QNET_STATE GetState(); + bool IsHost(); + HRESULT JoinGameFromInviteInfo(DWORD dwUserIndex, DWORD dwUserMask, const INVITE_INFO *pInviteInfo); + void HostGame(); + void EndGame(); + + static IQNetPlayer m_player[4]; +}; + +#ifdef _DURANGO +// 4J Stu - We don't want to be doing string conversions at runtime for timing instrumentation, so do this instead +#define PIXBeginNamedEvent(a, b, ...) PIXBeginEvent(a,L ## b, __VA_ARGS__) +#define PIXEndNamedEvent() PIXEndEvent() +#define PIXSetMarkerDeprecated(a, b, ...) PIXSetMarker(a, L ## b, __VA_ARGS__) +#define PIXAddNamedCounter(a, b) PIXReportCounter( L ## b, a) +#else +void PIXAddNamedCounter(int a, char *b, ...); +void PIXBeginNamedEvent(int a, char *b, ...); +void PIXEndNamedEvent(); +void PIXSetMarkerDeprecated(int a, char *b, ...); +#endif + +void XSetThreadProcessor(HANDLE a, int b); +//BOOL XCloseHandle(HANDLE a); + +const int QNET_SENDDATA_LOW_PRIORITY = 0; +const int QNET_SENDDATA_SECONDARY = 0; +#if defined(__PS3__) || defined(__ORBIS__) || defined(_DURANGO) || defined(__PSVITA__) +#define INVALID_XUID PlayerUID() +#else +const int INVALID_XUID = 0; +#endif +// const int MOJANG_DATA = 0; + +// typedef struct _STRING_VERIFY_RESPONSE +// { +// WORD wNumStrings; +// HRESULT *pStringResult; +// } STRING_VERIFY_RESPONSE; + +const int XCONTENT_MAX_DISPLAYNAME_LENGTH = 256; +const int XCONTENT_MAX_FILENAME_LENGTH = 256; +typedef int XCONTENTDEVICEID; + +#if !defined( __PS3__) && !defined(__ORBIS__) && !defined(_DURANGO) && !defined(__PSVITA__) +typedef struct _XCONTENT_DATA +{ + XCONTENTDEVICEID DeviceID; + DWORD dwContentType; + WCHAR szDisplayName[XCONTENT_MAX_DISPLAYNAME_LENGTH]; + CHAR szFileName[XCONTENT_MAX_FILENAME_LENGTH]; +} XCONTENT_DATA, *PXCONTENT_DATA; +#endif //__PS3__ + +static const int XMARKETPLACE_CONTENT_ID_LEN = 4; + +#ifndef _DURANGO +typedef struct _XMARKETPLACE_CONTENTOFFER_INFO +{ + ULONGLONG qwOfferID; + ULONGLONG qwPreviewOfferID; + DWORD dwOfferNameLength; + WCHAR *wszOfferName; + DWORD dwOfferType; + BYTE contentId[XMARKETPLACE_CONTENT_ID_LEN]; + BOOL fIsUnrestrictedLicense; + DWORD dwLicenseMask; + DWORD dwTitleID; + DWORD dwContentCategory; + DWORD dwTitleNameLength; + WCHAR *wszTitleName; + BOOL fUserHasPurchased; + DWORD dwPackageSize; + DWORD dwInstallSize; + DWORD dwSellTextLength; + WCHAR *wszSellText; + DWORD dwAssetID; + DWORD dwPurchaseQuantity; + DWORD dwPointsPrice; +} XMARKETPLACE_CONTENTOFFER_INFO, *PXMARKETPLACE_CONTENTOFFER_INFO; + +typedef enum +{ + XMARKETPLACE_OFFERING_TYPE_CONTENT = 0x00000002, + XMARKETPLACE_OFFERING_TYPE_GAME_DEMO = 0x00000020, + XMARKETPLACE_OFFERING_TYPE_GAME_TRAILER = 0x00000040, + XMARKETPLACE_OFFERING_TYPE_THEME = 0x00000080, + XMARKETPLACE_OFFERING_TYPE_TILE = 0x00000800, + XMARKETPLACE_OFFERING_TYPE_ARCADE = 0x00002000, + XMARKETPLACE_OFFERING_TYPE_VIDEO = 0x00004000, + XMARKETPLACE_OFFERING_TYPE_CONSUMABLE = 0x00010000, + XMARKETPLACE_OFFERING_TYPE_AVATARITEM = 0x00100000 +} XMARKETPLACE_OFFERING_TYPE; +#endif // _DURANGO + +const int QNET_SENDDATA_RELIABLE = 0; +const int QNET_SENDDATA_SEQUENTIAL = 0; + +struct XRNM_SEND_BUFFER +{ + DWORD dwDataSize; + sigma::byte *pbyData; +}; + +const int D3DBLEND_CONSTANTALPHA = 0; +const int D3DBLEND_INVCONSTANTALPHA = 0; +const int D3DPT_QUADLIST = 0; + + +typedef struct _XUSER_SIGNIN_INFO { + PlayerUID xuid; + DWORD dwGuestNumber; +} XUSER_SIGNIN_INFO, *PXUSER_SIGNIN_INFO; + +#define XUSER_GET_SIGNIN_INFO_ONLINE_XUID_ONLY 0x00000001 +#define XUSER_GET_SIGNIN_INFO_OFFLINE_XUID_ONLY 0x00000002 + +DWORD XUserGetSigninInfo( + DWORD dwUserIndex, + DWORD dwFlags, + PXUSER_SIGNIN_INFO pSigninInfo +); + +class CXuiStringTable +{ +public: + LPCWSTR Lookup(LPCWSTR szId); + LPCWSTR Lookup(UINT nIndex); + void Clear(); + HRESULT Load(LPCWSTR szId); +}; + +#if !defined(__ORBIS__) && !defined(_XBOX_ONE) +typedef VOID * XMEMDECOMPRESSION_CONTEXT; +typedef VOID * XMEMCOMPRESSION_CONTEXT; + +typedef enum _XMEMCODEC_TYPE +{ + XMEMCODEC_DEFAULT = 0, + XMEMCODEC_LZX = 1 +} XMEMCODEC_TYPE; + +HRESULT XMemDecompress( + XMEMDECOMPRESSION_CONTEXT Context, + VOID *pDestination, + SIZE_T *pDestSize, + CONST VOID *pSource, + SIZE_T SrcSize +); + + +HRESULT XMemCompress( + XMEMCOMPRESSION_CONTEXT Context, + VOID *pDestination, + SIZE_T *pDestSize, + CONST VOID *pSource, + SIZE_T SrcSize +); + +HRESULT XMemCreateCompressionContext( + XMEMCODEC_TYPE CodecType, + CONST VOID *pCodecParams, + DWORD Flags, + XMEMCOMPRESSION_CONTEXT *pContext +); + +HRESULT XMemCreateDecompressionContext( + XMEMCODEC_TYPE CodecType, + CONST VOID *pCodecParams, + DWORD Flags, + XMEMDECOMPRESSION_CONTEXT *pContext +); + +typedef struct _XMEMCODEC_PARAMETERS_LZX { + DWORD Flags; + DWORD WindowSize; + DWORD CompressionPartitionSize; +} XMEMCODEC_PARAMETERS_LZX; + +void XMemDestroyCompressionContext(XMEMCOMPRESSION_CONTEXT Context); +void XMemDestroyDecompressionContext(XMEMDECOMPRESSION_CONTEXT Context); +#endif + +typedef struct { + BYTE type; + union { + LONG nData; + LONGLONG i64Data; + double dblData; + struct { + DWORD cbData; + LPWSTR pwszData; + }string; + float fData; + struct { + DWORD cbData; + PBYTE pbData; + }binary; + FILETIME ftData; + }; +} XUSER_DATA, *PXUSER_DATA; + +typedef struct { + DWORD dwPropertyId; + XUSER_DATA value; +} XUSER_PROPERTY, *PXUSER_PROPERTY; + +// these need to match apwstrLocaleCode +// const int XC_LANGUAGE_ENGLISH =1; +// const int XC_LANGUAGE_JAPANESE =2; +// const int XC_LANGUAGE_GERMAN =3; +// const int XC_LANGUAGE_FRENCH =4; +// const int XC_LANGUAGE_SPANISH =5; +// const int XC_LANGUAGE_ITALIAN =6; +// const int XC_LANGUAGE_KOREAN =7; +// const int XC_LANGUAGE_TCHINESE =8; +// const int XC_LANGUAGE_PORTUGUESE =9; +// const int XC_LANGUAGE_BRAZILIAN =10; +// #if defined __PS3__ || defined __PSVITA__ || defined __ORBIS__ +// const int XC_LANGUAGE_RUSSIAN =11; +// // more PS3 +// const int XC_LANGUAGE_DUTCH =12; +// const int XC_LANGUAGE_FINISH =13; +// const int XC_LANGUAGE_SWEDISH =14; +// const int XC_LANGUAGE_DANISH =15; +// const int XC_LANGUAGE_NORWEGIAN =16; +// const int XC_LANGUAGE_POLISH =17; +// const int XC_LANGUAGE_TURKISH =18; +// const int XC_LANGUAGE_LATINAMERICANSPANISH =19; +// +// const int XC_LANGUAGE_GREEK =20; +// #else +// const int XC_LANGUAGE_UKENGLISH =11; +// const int XC_LANGUAGE_MEXICANSPANISH=12; +// #endif + +// matching Xbox 360 +const int XC_LANGUAGE_ENGLISH =0x01; +const int XC_LANGUAGE_JAPANESE =0x02; +const int XC_LANGUAGE_GERMAN =0x03; +const int XC_LANGUAGE_FRENCH =0x04; +const int XC_LANGUAGE_SPANISH =0x05; +const int XC_LANGUAGE_ITALIAN =0x06; +const int XC_LANGUAGE_KOREAN =0x07; +const int XC_LANGUAGE_TCHINESE =0x08; +const int XC_LANGUAGE_PORTUGUESE =0x09; +const int XC_LANGUAGE_POLISH =0x0B; +const int XC_LANGUAGE_RUSSIAN =0x0C; +const int XC_LANGUAGE_SWEDISH =0x0D; +const int XC_LANGUAGE_TURKISH =0x0E; +const int XC_LANGUAGE_BNORWEGIAN =0x0F; +const int XC_LANGUAGE_DUTCH =0x10; +const int XC_LANGUAGE_SCHINESE =0x11; + +// for Sony +const int XC_LANGUAGE_LATINAMERICANSPANISH =0xF0; +const int XC_LANGUAGE_FINISH =0xF1; +const int XC_LANGUAGE_GREEK =0xF2; +const int XC_LANGUAGE_DANISH =0xF3; + +// for Xbox One +const int XC_LANGUAGE_CZECH =0xF4; +const int XC_LANGUAGE_SLOVAK =0xF5; + +const int XC_LOCALE_AUSTRALIA =1; +const int XC_LOCALE_AUSTRIA =2; +const int XC_LOCALE_BELGIUM =3; +const int XC_LOCALE_BRAZIL =4; +const int XC_LOCALE_CANADA =5; +const int XC_LOCALE_CHILE =6; +const int XC_LOCALE_CHINA =7; +const int XC_LOCALE_COLOMBIA =8; +const int XC_LOCALE_CZECH_REPUBLIC =9; +const int XC_LOCALE_DENMARK =10; +const int XC_LOCALE_FINLAND =11; +const int XC_LOCALE_FRANCE =12; +const int XC_LOCALE_GERMANY =13; +const int XC_LOCALE_GREECE =14; +const int XC_LOCALE_HONG_KONG =15; +const int XC_LOCALE_HUNGARY =16; +const int XC_LOCALE_INDIA =17; +const int XC_LOCALE_IRELAND =18; +const int XC_LOCALE_ITALY =19; +const int XC_LOCALE_JAPAN =20; +const int XC_LOCALE_KOREA =21; +const int XC_LOCALE_MEXICO =22; +const int XC_LOCALE_NETHERLANDS =23; +const int XC_LOCALE_NEW_ZEALAND =24; +const int XC_LOCALE_NORWAY =25; +const int XC_LOCALE_POLAND =26; +const int XC_LOCALE_PORTUGAL =27; +const int XC_LOCALE_SINGAPORE =28; +const int XC_LOCALE_SLOVAK_REPUBLIC =29; +const int XC_LOCALE_SOUTH_AFRICA =30; +const int XC_LOCALE_SPAIN =31; +const int XC_LOCALE_SWEDEN =32; +const int XC_LOCALE_SWITZERLAND =33; +const int XC_LOCALE_TAIWAN =34; +const int XC_LOCALE_GREAT_BRITAIN =35; +const int XC_LOCALE_UNITED_STATES =36; +const int XC_LOCALE_RUSSIAN_FEDERATION =37; +const int XC_LOCALE_WORLD_WIDE =38; +const int XC_LOCALE_TURKEY =39; +const int XC_LOCALE_ARGENTINA =40; +const int XC_LOCALE_SAUDI_ARABIA =41; +const int XC_LOCALE_ISRAEL =42; +const int XC_LOCALE_UNITED_ARAB_EMIRATES =43; + +// for Sony +const int XC_LOCALE_LATIN_AMERICA =240; + + + +#if !(defined _DURANGO || defined __PS3__ || defined __ORBIS__ || defined __PSVITA__) +DWORD XGetLanguage(); +DWORD XGetLocale(); +DWORD XEnableGuestSignin(BOOL fEnable); +#endif + +class D3DXVECTOR3 +{ +public: + D3DXVECTOR3(); + D3DXVECTOR3(float,float,float); + float x,y,z,pad; + D3DXVECTOR3& operator += ( CONST D3DXVECTOR3& add ); +}; + +#define QNET_E_SESSION_FULL 0 +#define QNET_USER_MASK_USER0 1 +#define QNET_USER_MASK_USER1 2 +#define QNET_USER_MASK_USER2 4 +#define QNET_USER_MASK_USER3 8