first commit

This commit is contained in:
murdle
2026-03-01 02:38:58 +02:00
commit 19250b9db4
19111 changed files with 4358159 additions and 0 deletions

View File

@@ -0,0 +1,171 @@
<root>
<data name="IDS_NULL">
<value>Not Used</value>
</data>
<data name="IDS_OK">
<value>OK</value>
</data>
<data name="IDS_BACK">
<value>Back</value>
</data>
<data name="IDS_CANCEL">
<value>Cancel</value>
</data>
<data name="IDS_YES">
<value>Yes</value>
</data>
<data name="IDS_NO">
<value>No</value>
</data>
<data name="IDS_CORRUPTSAVE_TITLE">
<value>Corrupt Save</value>
</data>
<data name="IDS_CORRUPTSAVE_TEXT">
<value>Your save data appears to be corrupt. Create a new save and overwrite the corrupt one?</value>
</data>
<data name="IDS_NOFREESPACE_TITLE">
<value>No Free Space</value>
</data>
<data name="IDS_NOFREESPACE_TEXT">
<value>Your selected storage device doesn't have enough free space to create a game save.</value>
</data>
<data name="IDS_SELECTAGAIN">
<value>Select again</value>
</data>
<data name="IDS_PLAYWITHOUTSAVING">
<value>Play without saving</value>
</data>
<data name="IDS_CREATEANEWSAVE">
<value>Create a new save</value>
</data>
<data name="IDS_OVERWRITESAVE_TITLE">
<value>Overwrite save?</value>
</data>
<data name="IDS_OVERWRITESAVE_TEXT">
<value>Your selected storage device already contains this save. Is it OK to overwrite it?</value>
</data>
<data name="IDS_OVERWRITESAVE_NO">
<value>No - don't overwrite</value>
</data>
<data name="IDS_OVERWRITESAVE_YES">
<value>Overwrite and save</value>
</data>
<data name="IDS_FAILED_TO_SAVE_TITLE">
<value>Save failed</value>
</data>
<data name="IDS_STORAGEDEVICEPROBLEM_TITLE">
<value>Storage Device Problem</value>
</data>
<data name="IDS_FAILED_TO_SAVE_TEXT">
<value>Your storage device is unavailable or has an error</value>
</data>
<data name="IDS_FAILED_TO_LOADSAVE_TEXT">
<value>Your storage device is unavailable or has an error. Please select a new storage device.</value>
</data>
<data name="IDS_SELECTANEWDEVICE">
<value>Select a new storage device</value>
</data>
<data name="IDS_NODEVICE_TITLE">
<value>No storage device selected</value>
</data>
<data name="IDS_NODEVICE_TEXT">
<value>If you do not select a storage device, game saves will be disabled</value>
</data>
<data name="IDS_NODEVICE_ACCEPT">
<value>Select a storage device</value>
</data>
<data name="IDS_NODEVICE_DECLINE">
<value>Continue without saving</value>
</data>
<data name="IDS_DEVICEGONE_TEXT">
<value>Your storage device has been removed. Please select a new one.</value>
</data>
<data name="IDS_DEVICEGONE_TITLE">
<value>Loading failed</value>
</data>
<data name="IDS_KEYBOARDUI_SAVEGAME_TITLE">
<value>Name the save</value>
</data>
<data name="IDS_KEYBOARDUI_SAVEGAME_TEXT">
<value>Enter a name for your savegame</value>
</data>
<data name="IDS_WARNING_ARCADE_TITLE">
<value>Return to Xbox Dashboard</value>
</data>
<data name="IDS_WARNING_ARCADE_TEXT">
<value>Are you sure you want to exit the game?</value>
</data>
<data name="IDS_PRO_RETURNEDTOMENU_TITLE">
<value>Signed out</value>
</data>
<data name="IDS_PRO_RETURNEDTOTITLESCREEN_TEXT">
<value>You have been returned to the title screen because your gamer profile was signed out</value>
</data>
<data name="IDS_PRO_RETURNEDTOMENU_TEXT">
<value>The match has ended because a gamer profile was signed out</value>
</data>
<data name="IDS_PRO_RETURNEDTOMENU_ACCEPT">
<value>Continue playing</value>
</data>
<data name="IDS_PRO_NOTONLINE_TITLE">
<value>Gamer profile not online</value>
</data>
<data name="IDS_PRO_NOTONLINE_TEXT">
<value>This game has some features which require an Xbox LIVE enabled gamer profile, but you are currently offline.</value>
</data>
<data name="IDS_PRO_XBOXLIVE_NOTIFICATION">
<value>This feature requires a gamer profile which is signed into Xbox LIVE.</value>
</data>
<data name="IDS_PRO_NOTONLINE_ACCEPT">
<value>Connect to Xbox LIVE</value>
</data>
<data name="IDS_PRO_NOTONLINE_DECLINE">
<value>Continue playing offline</value>
</data>
<data name="IDS_PRO_ACHIEVEMENTPROBLEM_TITLE">
<value>Achievement Award Problem</value>
</data>
<data name="IDS_PRO_ACHIEVEMENTPROBLEM_TEXT">
<value> There was a problem accessing your gamer profile. Your achievement could not be awarded at this time.</value>
</data>
<data name="IDS_PRO_NOPROFILE_TITLE">
<value>Gamer profile problem</value>
</data>
<data name="IDS_PRO_NOPROFILEOPTIONS_TEXT">
<value>Saving of settings to gamer profile has failed.</value>
</data>
<data name="IDS_PRO_GUESTPROFILE_TITLE">
<value>Guest Gamer Profile</value>
</data>
<data name="IDS_PRO_GUESTPROFILE_TEXT">
<value>Guest gamer profile cannot access this feature. Please use a different gamer profile.</value>
</data>
<data name="IDS_STO_SAVING_SHORT">
<value>Saving…</value>
</data>
<data name="IDS_STO_SAVING_LONG">
<value>Saving content. Please don't turn off your console.</value>
</data>
<data name="IDS_PRO_UNLOCKGAME_TITLE">
<value>Unlock Full Game</value>
</data>
<data name="IDS_PRO_UNLOCKGAME_TEXT">
<value>This is the Minecraft trial game. If you had the full game, you would just have earned an achievement!
Unlock the full game to experience the joy of Minecraft and to play with your friends across the globe through Xbox LIVE.
Would you like to unlock the full game?</value>
</data>
<data name="IDS_PRO_PROFILEPROBLEM_TEXT">
<value>You are being returned to the main menu because of a problem reading your profile.</value>
</data>
</root>

View File

@@ -0,0 +1,210 @@
#include "stdafx.h"
#include <stdlib.h>
#include <string.h>
#include <cell/l10n.h>
#include <cell/pad.h>
#include <cell/cell_fs.h>
#include <sys/process.h>
#include <sys/ppu_thread.h>
#include <cell/sysmodule.h>
#include <cell/rtc.h>
#include <libsn.h>
#include <sysutil/sysutil_common.h>
#include <sysutil/sysutil_sysparam.h>
#include <sysutil/sysutil_savedata.h>
#include "STO_TitleSmallStorage.h"
#include "../Passphrase/ps3__np_conf.h"
#if 0
int32_t CTSS::TssSizeCheck(size_t size)
{
printf("=======Tss Data size = %d\n", size);
//E Recommendation: The data's size should be checked against for the server operation mistake.
//E If it is necessary, implement size check based on your data format, please.
if (size == 0)
{
printf("Tss File size is 0 byte. Maybe, data isn't set on the server.\n\n");
printf("\tThe data is set with scp. The account is generable in PS3 Developer Network.\n");
printf("\tThere are three server environments. for development, environment for test, and product.\n");
}
return 0;
}
int32_t CTSS::TssHashCheck(void *data, size_t size)
{
//E Recommendation: The data format should be include it's hash against for operation mistakes and crack.
//E If it is necessary, implement hash check based on your data format, please.
return 0;
}
int32_t CTSS::TssVersionCheck(void *data, size_t size)
{
//E Recommendation: The data format should be include it's version for changes of the format.
//E If it is necessary, implement version check based on your data format, please.
return 0;
}
int32_t CTSS::doLookupTitleSmallStorage(void)
{
int32_t ret = 0;
int32_t transId = 0;
void *data=NULL;
size_t dataSize=0;
SceNpId npId;
ret = sceNpManagerGetNpId(&npId);
if(ret < 0){
return ret;
}
ret = sceNpLookupInit();
if (ret < 0)
{
printf("sceNpLookupInit() failed. ret = 0x%x\n", ret);
goto error;
}
ret = sceNpTusInit(0);
if (ret < 0)
{
printf("sceNpTusInit() failed. ret = 0x%x\n", ret);
goto error;
}
ret = sceNpLookupCreateTitleCtx(&s_npCommunicationId, &npId);
if (ret < 0)
{
printf("sceNpLookupCreateTitleCtx() failed. ret = 0x%x\n", ret);
goto error;
}
m_lookupTitleCtxId = ret;
ret = sceNpTusCreateTitleCtx(&s_npCommunicationId, &s_npCommunicationPassphrase, &npId);
if (ret < 0)
{
printf("sceNpTusCreateTitleCtx() failed. ret = 0x%x\n", ret);
goto error;
}
printf("sceNpTusCreateTitleCtx() return %x\n", ret);
m_tusTitleCtxId = ret;
//memset(&npclient_info, 0x00, sizeof(npclient_info));
data = malloc(SCE_NET_NP_TSS_MAX_SIZE);
if (data == NULL)
{
printf("out of memory: can't allocate memory for titleSmallStorage\n");
ret = -1;
goto error;
}
memset(data, 0x00, SCE_NET_NP_TSS_MAX_SIZE);
ret = sceNpLookupCreateTransactionCtx(m_lookupTitleCtxId);
if (ret < 0)
{
printf("sceNpLookupCreateTransactionCtx() failed. ret = 0x%x\n", ret);
goto error;
}
transId = ret;
// ret = sceNpLookupTitleSmallStorage(transId,
// data,
// SCE_NET_NP_TSS_MAX_SIZE,
// &dataSize,
// NULL);
// if (ret < 0)
// {
// printf("sceNpLookupTitleSmallStorage() failed. ret = 0x%x\n", ret);
// goto error;
// }
//
// ret = TssSizeCheck(dataSize);
// if (ret < 0)
// {
// goto error;
// }
// ret = TssHashCheck(data, dataSize);
// if (ret < 0)
// {
// goto error;
// }
// ret = TssVersionCheck(data, dataSize);
// if (ret < 0)
// {
// goto error;
// }
/*
// Process communication
void *data;
size_t dataSize;
SceNpTssSlotId slotId=SLOTID;
SceNpTssDataStatus dataStatus;
const char *ptr =NULL;
size_t recvdSize=0;
size_t totalSize=0;
size_t recvSize=0;
do {
ret = sceNpTssGetData(
transId,
slotId,
&dataStatus,
sizeof(SceNpTssDataStatus),
ptr,
recvSize,
NULL);
if (ret < 0)
{
// Error handling
goto error;
}
if (dataStatus.contentLength == 0)
{
// Processing when there is no data
goto finish;
}
if (ptr == NULL)
{
ptr = malloc(dataStatus.contentLength);
if (ptr == NULL){
// Error handling
goto error;
}
recvSize = BLOCKSIZE;
}
recvedSize += ret;
ptr += ret;
} while (recvedSize < dataStatus.contentLength);
*/
error:
if (transId > 0)
{
ret = sceNpLookupDestroyTransactionCtx(transId);
printf("sceNpLookupDestroyTransactionCtx() done. ret = 0x%x\n", ret);
}
if (data != NULL)
{
free(data);
}
sceNpTusTerm();
return 0;
}
#endif

View File

@@ -0,0 +1,24 @@
#pragma once
#if 0
#include <np.h>
class CTSS
{
public:
CTSS(void);
~CTSS(void);
int32_t doLookupTitleSmallStorage(void);
private:
static int32_t TssVersionCheck(void *data, size_t size);
static int32_t TssHashCheck(void *data, size_t size);
static int32_t TssSizeCheck(size_t size);
int32_t m_lookupTitleCtxId;
int32_t m_tusTitleCtxId;
};
#endif

View File

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

View File

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

View File

@@ -0,0 +1,318 @@
#pragma once
#include <cell/gcm.h>
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;

View File

@@ -0,0 +1,434 @@
#pragma once
using namespace std;
#include <vector>
#include <sysutil\sysutil_savedata.h>
#include <cell/cell_fs.h>
#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<std::string>& 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;

View File

@@ -0,0 +1,17 @@
#pragma once
#include <stdio.h>
#include <libsn.h>
#ifdef _CONTENT_PACKAGE
#define PS3_ASSERT(val)
#define PS3_ASSERT_CELL_ERROR(errVal)
#elif defined(_RELEASE_FOR_ART)
#define PS3_ASSERT(val)
#define PS3_ASSERT_CELL_ERROR(errVal)
#else
#define PS3_ASSERT(val) if(!(val)) { printf("----------------------\n"); printf("Assert failed!!!\n"); printf(#val); printf("\n"); printf("%s failed.\nFile %s\nline %d \n----------------------\n", __FUNCTION__, __FILE__, __LINE__); snPause(); }
#define PS3_ASSERT_CELL_ERROR(errVal) if(errVal != CELL_OK) { printf("----------------------\n %s failed with error %d [0x%08x]\n----------------------\n", __FUNCTION__, errVal, errVal); PS3_ASSERT(0); }
#endif
#define assert PS3_ASSERT

View File

@@ -0,0 +1,117 @@
#include "..\stdafx.h"
#include <sysutil/sysutil_sysparam.h>
#include <cell/sysmodule.h>
#include <sys/spu_initialize.h>
#include <fcntl.h>
#include <unistd.h>
#include <cell/audio.h>
#include "..\..\Common\Audio\SoundEngine.h"
#include "..\..\Common\Consoles_App.h"
#include "..\..\PS3\Miles\include\mss.h"
// This file has the platform specific functions required for PS3 audio
//
// this function configures the audio hardware.
// you specify the minimum number of channels that you need, and it
// returns the number of output channels that will be used (which will
// be at least your minimum count, but possibly more). it will return 0
// for any failure cases.
int SoundEngine::initAudioHardware( int minimum_chans )
{
int ret;
int ch_pcm;
int ch_bit;
CellAudioOutConfiguration a_config;
memset( &a_config, 0, sizeof( CellAudioOutConfiguration ) );
// first lets see how many pcm output channels we have
ch_pcm = cellAudioOutGetSoundAvailability( CELL_AUDIO_OUT_PRIMARY,
CELL_AUDIO_OUT_CODING_TYPE_LPCM,
CELL_AUDIO_OUT_FS_48KHZ, 0 );
if ( ch_pcm >= minimum_chans )
{
a_config.channel = ch_pcm;
a_config.encoder = CELL_AUDIO_OUT_CODING_TYPE_LPCM;
a_config.downMixer = CELL_AUDIO_OUT_DOWNMIXER_NONE; /* No downmixer is used */
cellAudioOutConfigure( CELL_AUDIO_OUT_PRIMARY, &a_config, NULL, 0 );
ret = ch_pcm;
}
else
{
switch ( ch_pcm )
{
case 6:
// this means we asked for 8 channels, but only 6 are available
// so, we'll turn on the 7.1 to 5.1 downmixer.
a_config.channel = 6;
a_config.encoder = CELL_AUDIO_OUT_CODING_TYPE_LPCM;
a_config.downMixer = CELL_AUDIO_OUT_DOWNMIXER_TYPE_B;
if ( cellAudioOutConfigure( CELL_AUDIO_OUT_PRIMARY, &a_config, NULL, 0 ) != CELL_OK )
{
return 0; // error - the downmixer didn't init
}
ret = 8;
break;
case 2:
// ok, this means they asked for multi-channel out, but only stereo
// is supported. we'll try dolby digital first and then the downmixer
ch_bit = cellAudioOutGetSoundAvailability( CELL_AUDIO_OUT_PRIMARY,
CELL_AUDIO_OUT_CODING_TYPE_AC3,
CELL_AUDIO_OUT_FS_48KHZ, 0 );
if ( ch_bit > 0 )
{
a_config.channel = ch_bit;
a_config.encoder = CELL_AUDIO_OUT_CODING_TYPE_AC3;
if ( ch_bit >= minimum_chans )
{
// we have enough channels to support their minimum
a_config.downMixer = CELL_AUDIO_OUT_DOWNMIXER_NONE;
ret = ch_bit;
}
else
{
// we don't have enough channels to support their minimum, so use the downmixer
a_config.downMixer = CELL_AUDIO_OUT_DOWNMIXER_TYPE_B;
ret = 8;
}
if ( cellAudioOutConfigure( CELL_AUDIO_OUT_PRIMARY, &a_config, NULL, 0 ) == CELL_OK )
{
break;
}
// if we got here the dolby encoder, didn't init, so fall through to downmixing to stereo
}
a_config.channel = 2;
a_config.encoder = CELL_AUDIO_OUT_CODING_TYPE_LPCM;
a_config.downMixer = CELL_AUDIO_OUT_DOWNMIXER_TYPE_A;
if ( cellAudioOutConfigure( CELL_AUDIO_OUT_PRIMARY, &a_config, NULL, 0 ) != CELL_OK )
{
return 0; // error - downmixer didn't work
}
ret = 2; // downmixer does 7.0 to 2.0 downmixing...
break;
default:
// some other weird case that we don't understand
return 0;
}
}
// turn off copy protection stupidness
cellAudioOutSetCopyControl( CELL_AUDIO_OUT_PRIMARY,
CELL_AUDIO_OUT_COPY_CONTROL_COPY_FREE );
return( ret );
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 63 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 64 KiB

View File

@@ -0,0 +1 @@
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>

Binary file not shown.

After

Width:  |  Height:  |  Size: 87 KiB

View File

@@ -0,0 +1 @@
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>

View File

@@ -0,0 +1,675 @@
////////////////////////////////////////////////////////////////////
//
// C:\Work\4J\Mojang\Minecraft\Minecraft360-dev\Minecraft.Client\Xbox\GameConfig\Minecraft.spa.h
//
// Auto-generated on Thursday, 10 May 2012 at 21:23:22
// Xbox LIVE Game Config project version 1.0.173.0
// SPA Compiler version 1.0.0.0
//
////////////////////////////////////////////////////////////////////
#ifndef __MINECRAFT_SPA_H__
#define __MINECRAFT_SPA_H__
#ifdef __cplusplus
extern "C" {
#endif
//
// Title info
//
#define TITLEID_MINECRAFT 0x584111F7
//
// Context ids
//
// These values are passed as the dwContextId to XUserSetContext.
//
#define CONTEXT_GAME_STATE 0
//
// Context values
//
// These values are passed as the dwContextValue to XUserSetContext.
//
// Values for CONTEXT_GAME_STATE
#define CONTEXT_GAME_STATE_BLANK 0
#define CONTEXT_GAME_STATE_RIDING_PIG 1
#define CONTEXT_GAME_STATE_RIDING_MINECART 2
#define CONTEXT_GAME_STATE_BOATING 3
#define CONTEXT_GAME_STATE_FISHING 4
#define CONTEXT_GAME_STATE_CRAFTING 5
#define CONTEXT_GAME_STATE_FORGING 6
#define CONTEXT_GAME_STATE_NETHER 7
#define CONTEXT_GAME_STATE_CD 8
#define CONTEXT_GAME_STATE_MAP 9
#define CONTEXT_GAME_STATE_ENCHANTING 10
#define CONTEXT_GAME_STATE_BREWING 11
#define CONTEXT_GAME_STATE_ANVIL 12
#define CONTEXT_GAME_STATE_TRADING 13
// Values for X_CONTEXT_PRESENCE
#define CONTEXT_PRESENCE_IDLE 0
#define CONTEXT_PRESENCE_MENUS 1
#define CONTEXT_PRESENCE_MULTIPLAYER 2
#define CONTEXT_PRESENCE_MULTIPLAYEROFFLINE 3
#define CONTEXT_PRESENCE_MULTIPLAYER_1P 4
#define CONTEXT_PRESENCE_MULTIPLAYER_1POFFLINE 5
// Values for X_CONTEXT_GAME_MODE
#define CONTEXT_GAME_MODE_GAMEMODE 0
#define CONTEXT_GAME_MODE_MULTIPLAYER 1
//
// Property ids
//
// These values are passed as the dwPropertyId value to XUserSetProperty
// and as the dwPropertyId value in the XUSER_PROPERTY structure.
//
#define PROPERTY_LOCALE 0x10000008
#define PROPERTY_KILLS_ZOMBIE 0x1000000A
#define PROPERTY_KILLS_SKELETON 0x1000000B
#define PROPERTY_KILLS_CREEPER 0x1000000C
#define PROPERTY_KILLS_SPIDER 0x1000000D
#define PROPERTY_KILLS_SPIDERJOCKEY 0x1000000E
#define PROPERTY_KILLS_ZOMBIEPIGMAN 0x1000000F
#define PROPERTY_KILLS_SLIME 0x10000010
#define PROPERTY_KILLS_GHAST 0x10000011
#define PROPERTY_MINED_DIRT 0x10000012
#define PROPERTY_MINED_STONE 0x10000013
#define PROPERTY_MINED_SAND 0x10000014
#define PROPERTY_MINED_COBBLESTONE 0x10000015
#define PROPERTY_MINED_GRAVEL 0x10000016
#define PROPERTY_MINED_CLAY 0x10000017
#define PROPERTY_MINED_OBSIDIAN 0x10000018
#define PROPERTY_MINED_COAL 0x10000019
#define PROPERTY_MINED_IRON 0x1000001A
#define PROPERTY_MINED_GOLD 0x1000001B
#define PROPERTY_MINED_DIAMOND 0x1000001C
#define PROPERTY_MINED_REDSTONE 0x1000001D
#define PROPERTY_MINED_LAPISLAZULI 0x1000001E
#define PROPERTY_MINED_NETHERRACK 0x1000001F
#define PROPERTY_MINED_SOULSAND 0x10000020
#define PROPERTY_MINED_GLOWSTONE 0x10000021
#define PROPERTY_COLLECTED_EGG 0x10000022
#define PROPERTY_COLLECTED_WHEAT 0x10000023
#define PROPERTY_COLLECTED_MUSHROOM 0x10000024
#define PROPERTY_COLLECTED_SUGARCANE 0x10000025
#define PROPERTY_COLLECTED_MILK 0x10000026
#define PROPERTY_COLLECTED_PUMPKIN 0x10000027
#define PROPERTY_TRAVEL_WALK 0x10000028
#define PROPERTY_TRAVEL_SWIM 0x10000029
#define PROPERTY_TRAVEL_FALL 0x1000002A
#define PROPERTY_TRAVEL_CLIMB 0x1000002B
#define PROPERTY_TRAVEL_MINECART 0x1000002C
#define PROPERTY_TRAVEL_BOAT 0x1000002D
#define PROPERTY_PORTALS_CREATED 0x1000002F
#define PROPERTY_COLLECTED_NETHERLAVA 0x10000030
#define PROPERTY_RATING 0x20000009
//
// Achievement ids
//
// These values are used in the dwAchievementId member of the
// XUSER_ACHIEVEMENT structure that is used with
// XUserWriteAchievements and XUserCreateAchievementEnumerator.
//
#define ACHIEVEMENT_01 1
#define ACHIEVEMENT_02 2
#define ACHIEVEMENT_03 3
#define ACHIEVEMENT_04 4
#define ACHIEVEMENT_05 5
#define ACHIEVEMENT_06 6
#define ACHIEVEMENT_07 7
#define ACHIEVEMENT_08 8
#define ACHIEVEMENT_09 9
#define ACHIEVEMENT_10 10
#define ACHIEVEMENT_11 11
#define ACHIEVEMENT_12 12
#define ACHIEVEMENT_13 13
#define ACHIEVEMENT_14 14
#define ACHIEVEMENT_15 15
#define ACHIEVEMENT_16 16
#define ACHIEVEMENT_17 17
#define ACHIEVEMENT_18 18
#define ACHIEVEMENT_19 19
#define ACHIEVEMENT_20 20
#define ACHIEVEMENT_21 21
#define ACHIEVEMENT_22 22
#define ACHIEVEMENT_23 23
#define ACHIEVEMENT_24 24
#define ACHIEVEMENT_25 25
#define ACHIEVEMENT_26 26
#define ACHIEVEMENT_27 27
#define ACHIEVEMENT_28 28
//
// AvatarAssetAward ids
//
#define AVATARASSETAWARD_PORKCHOP_TSHIRT 1
#define AVATARASSETAWARD_WATCH 2
#define AVATARASSETAWARD_CAP 5
//
// Stats view ids
//
// These are used in the dwViewId member of the XUSER_STATS_SPEC structure
// passed to the XUserReadStats* and XUserCreateStatsEnumerator* functions.
//
// Skill leaderboards for ranked game modes
#define STATS_VIEW_SKILL_RANKED_GAMEMODE 0xFFFF0000
#define STATS_VIEW_SKILL_RANKED_MULTIPLAYER 0xFFFF0001
// Skill leaderboards for unranked (standard) game modes
#define STATS_VIEW_SKILL_STANDARD_GAMEMODE 0xFFFE0000
#define STATS_VIEW_SKILL_STANDARD_MULTIPLAYER 0xFFFE0001
// Title defined leaderboards
#define STATS_VIEW_KILLS_EASY 4
#define STATS_VIEW_KILLS_NORMAL 5
#define STATS_VIEW_KILLS_HARD 6
#define STATS_VIEW_MINING_BLOCKS_PEACEFUL 7
#define STATS_VIEW_MINING_BLOCKS_EASY 8
#define STATS_VIEW_MINING_BLOCKS_NORMAL 9
#define STATS_VIEW_MINING_BLOCKS_HARD 10
#define STATS_VIEW_FARMING_PEACEFUL 15
#define STATS_VIEW_FARMING_EASY 16
#define STATS_VIEW_FARMING_NORMAL 17
#define STATS_VIEW_FARMING_HARD 18
#define STATS_VIEW_TRAVELLING_PEACEFUL 19
#define STATS_VIEW_TRAVELLING_EASY 20
#define STATS_VIEW_TRAVELLING_NORMAL 21
#define STATS_VIEW_TRAVELLING_HARD 22
#define STATS_VIEW_TRAVELLING_TOTAL 27
//
// Stats view column ids
//
// These ids are used to read columns of stats views. They are specified in
// the rgwColumnIds array of the XUSER_STATS_SPEC structure. Rank, rating
// and gamertag are not retrieved as custom columns and so are not included
// in the following definitions. They can be retrieved from each row's
// header (e.g., pStatsResults->pViews[x].pRows[y].dwRank, etc.).
//
// Column ids for KILLS_EASY
#define STATS_COLUMN_KILLS_EASY_LOCALE 9
#define STATS_COLUMN_KILLS_EASY_ZOMBIES 1
#define STATS_COLUMN_KILLS_EASY_SKELETONS 2
#define STATS_COLUMN_KILLS_EASY_CREEPERS 3
#define STATS_COLUMN_KILLS_EASY_SPIDERS 4
#define STATS_COLUMN_KILLS_EASY_SPIDERJOCKEYS 5
#define STATS_COLUMN_KILLS_EASY_ZOMBIEPIGMEN 6
#define STATS_COLUMN_KILLS_EASY_SLIME 7
// Column ids for KILLS_NORMAL
#define STATS_COLUMN_KILLS_NORMAL_LOCALE 9
#define STATS_COLUMN_KILLS_NORMAL_ZOMBIES 1
#define STATS_COLUMN_KILLS_NORMAL_SKELETONS 2
#define STATS_COLUMN_KILLS_NORMAL_CREEPERS 3
#define STATS_COLUMN_KILLS_NORMAL_SPIDERS 4
#define STATS_COLUMN_KILLS_NORMAL_SPIDERJOCKEYS 5
#define STATS_COLUMN_KILLS_NORMAL_ZOMBIEPIGMEN 6
#define STATS_COLUMN_KILLS_NORMAL_SLIME 7
// Column ids for KILLS_HARD
#define STATS_COLUMN_KILLS_HARD_LOCALE 9
#define STATS_COLUMN_KILLS_HARD_ZOMBIES 1
#define STATS_COLUMN_KILLS_HARD_SKELETONS 2
#define STATS_COLUMN_KILLS_HARD_CREEPERS 3
#define STATS_COLUMN_KILLS_HARD_SPIDERS 4
#define STATS_COLUMN_KILLS_HARD_SPIDERJOCKEYS 5
#define STATS_COLUMN_KILLS_HARD_ZOMBIEPIGMEN 6
#define STATS_COLUMN_KILLS_HARD_SLIME 7
// Column ids for MINING_BLOCKS_PEACEFUL
#define STATS_COLUMN_MINING_BLOCKS_PEACEFUL_LOCALE 1
#define STATS_COLUMN_MINING_BLOCKS_PEACEFUL_DIRT 2
#define STATS_COLUMN_MINING_BLOCKS_PEACEFUL_STONE 3
#define STATS_COLUMN_MINING_BLOCKS_PEACEFUL_SAND 4
#define STATS_COLUMN_MINING_BLOCKS_PEACEFUL_COBBLESTONE 5
#define STATS_COLUMN_MINING_BLOCKS_PEACEFUL_GRAVEL 6
#define STATS_COLUMN_MINING_BLOCKS_PEACEFUL_CLAY 7
#define STATS_COLUMN_MINING_BLOCKS_PEACEFUL_OBSIDIAN 8
// Column ids for MINING_BLOCKS_EASY
#define STATS_COLUMN_MINING_BLOCKS_EASY_LOCALE 1
#define STATS_COLUMN_MINING_BLOCKS_EASY_DIRT 2
#define STATS_COLUMN_MINING_BLOCKS_EASY_STONE 3
#define STATS_COLUMN_MINING_BLOCKS_EASY_SAND 4
#define STATS_COLUMN_MINING_BLOCKS_EASY_COBBLESTONE 5
#define STATS_COLUMN_MINING_BLOCKS_EASY_GRAVEL 6
#define STATS_COLUMN_MINING_BLOCKS_EASY_CLAY 7
#define STATS_COLUMN_MINING_BLOCKS_EASY_OBSIDIAN 8
// Column ids for MINING_BLOCKS_NORMAL
#define STATS_COLUMN_MINING_BLOCKS_NORMAL_LOCALE 1
#define STATS_COLUMN_MINING_BLOCKS_NORMAL_DIRT 2
#define STATS_COLUMN_MINING_BLOCKS_NORMAL_STONE 3
#define STATS_COLUMN_MINING_BLOCKS_NORMAL_SAND 4
#define STATS_COLUMN_MINING_BLOCKS_NORMAL_COBBLESTONE 5
#define STATS_COLUMN_MINING_BLOCKS_NORMAL_GRAVEL 6
#define STATS_COLUMN_MINING_BLOCKS_NORMAL_CLAY 7
#define STATS_COLUMN_MINING_BLOCKS_NORMAL_OBSIDIAN 8
// Column ids for MINING_BLOCKS_HARD
#define STATS_COLUMN_MINING_BLOCKS_HARD_LOCALE 1
#define STATS_COLUMN_MINING_BLOCKS_HARD_DIRT 2
#define STATS_COLUMN_MINING_BLOCKS_HARD_STONE 3
#define STATS_COLUMN_MINING_BLOCKS_HARD_SAND 4
#define STATS_COLUMN_MINING_BLOCKS_HARD_COBBLESTONE 5
#define STATS_COLUMN_MINING_BLOCKS_HARD_GRAVEL 6
#define STATS_COLUMN_MINING_BLOCKS_HARD_CLAY 7
#define STATS_COLUMN_MINING_BLOCKS_HARD_OBSIDIAN 8
// Column ids for FARMING_PEACEFUL
#define STATS_COLUMN_FARMING_PEACEFUL_LOCALE 1
#define STATS_COLUMN_FARMING_PEACEFUL_EGGS 2
#define STATS_COLUMN_FARMING_PEACEFUL_WHEAT 3
#define STATS_COLUMN_FARMING_PEACEFUL_MUSHROOMS 4
#define STATS_COLUMN_FARMING_PEACEFUL_SUGARCANE 5
#define STATS_COLUMN_FARMING_PEACEFUL_MILK 6
#define STATS_COLUMN_FARMING_PEACEFUL_PUMPKINS 7
// Column ids for FARMING_EASY
#define STATS_COLUMN_FARMING_EASY_LOCALE 1
#define STATS_COLUMN_FARMING_EASY_EGGS 2
#define STATS_COLUMN_FARMING_EASY_WHEAT 3
#define STATS_COLUMN_FARMING_EASY_MUSHROOMS 4
#define STATS_COLUMN_FARMING_EASY_SUGARCANE 5
#define STATS_COLUMN_FARMING_EASY_MILK 6
#define STATS_COLUMN_FARMING_EASY_PUMPKINS 7
// Column ids for FARMING_NORMAL
#define STATS_COLUMN_FARMING_NORMAL_LOCALE 1
#define STATS_COLUMN_FARMING_NORMAL_EGGS 2
#define STATS_COLUMN_FARMING_NORMAL_WHEAT 3
#define STATS_COLUMN_FARMING_NORMAL_MUSHROOMS 4
#define STATS_COLUMN_FARMING_NORMAL_SUGARCANE 5
#define STATS_COLUMN_FARMING_NORMAL_MILK 6
#define STATS_COLUMN_FARMING_NORMAL_PUMPKINS 7
// Column ids for FARMING_HARD
#define STATS_COLUMN_FARMING_HARD_LOCALE 1
#define STATS_COLUMN_FARMING_HARD_EGGS 2
#define STATS_COLUMN_FARMING_HARD_WHEAT 3
#define STATS_COLUMN_FARMING_HARD_MUSHROOMS 4
#define STATS_COLUMN_FARMING_HARD_SUGARCANE 5
#define STATS_COLUMN_FARMING_HARD_MILK 6
#define STATS_COLUMN_FARMING_HARD_PUMPKINS 7
// Column ids for TRAVELLING_PEACEFUL
#define STATS_COLUMN_TRAVELLING_PEACEFUL_LOCALE 1
#define STATS_COLUMN_TRAVELLING_PEACEFUL_WALKED 2
#define STATS_COLUMN_TRAVELLING_PEACEFUL_SWAM 3
#define STATS_COLUMN_TRAVELLING_PEACEFUL_FALLEN 4
#define STATS_COLUMN_TRAVELLING_PEACEFUL_CLIMBED 5
#define STATS_COLUMN_TRAVELLING_PEACEFUL_MINECART 6
#define STATS_COLUMN_TRAVELLING_PEACEFUL_BOAT 7
// Column ids for TRAVELLING_EASY
#define STATS_COLUMN_TRAVELLING_EASY_LOCALE 1
#define STATS_COLUMN_TRAVELLING_EASY_WALKED 2
#define STATS_COLUMN_TRAVELLING_EASY_SWAM 3
#define STATS_COLUMN_TRAVELLING_EASY_FALLEN 4
#define STATS_COLUMN_TRAVELLING_EASY_CLIMBED 5
#define STATS_COLUMN_TRAVELLING_EASY_MINECART 6
#define STATS_COLUMN_TRAVELLING_EASY_BOAT 7
// Column ids for TRAVELLING_NORMAL
#define STATS_COLUMN_TRAVELLING_NORMAL_LOCALE 1
#define STATS_COLUMN_TRAVELLING_NORMAL_WALKED 2
#define STATS_COLUMN_TRAVELLING_NORMAL_SWAM 3
#define STATS_COLUMN_TRAVELLING_NORMAL_FALLEN 4
#define STATS_COLUMN_TRAVELLING_NORMAL_CLIMBED 5
#define STATS_COLUMN_TRAVELLING_NORMAL_MINECART 6
#define STATS_COLUMN_TRAVELLING_NORMAL_BOAT 7
// Column ids for TRAVELLING_HARD
#define STATS_COLUMN_TRAVELLING_HARD_LOCALE 1
#define STATS_COLUMN_TRAVELLING_HARD_WALKED 2
#define STATS_COLUMN_TRAVELLING_HARD_SWAM 3
#define STATS_COLUMN_TRAVELLING_HARD_FALLEN 4
#define STATS_COLUMN_TRAVELLING_HARD_CLIMBED 5
#define STATS_COLUMN_TRAVELLING_HARD_MINECART 6
#define STATS_COLUMN_TRAVELLING_HARD_BOAT 7
// Column ids for TRAVELLING_TOTAL
//
// Matchmaking queries
//
// These values are passed as the dwProcedureIndex parameter to
// XSessionSearch to indicate which matchmaking query to run.
//
#define SESSION_MATCH_QUERY_FRIENDS 0
//
// Gamer pictures
//
// These ids are passed as the dwPictureId parameter to XUserAwardGamerTile.
//
#define GAMER_PICTURE_GAMERPIC1 12
#define GAMER_PICTURE_GAMERPIC2 13
//
// Strings
//
// These ids are passed as the dwStringId parameter to XReadStringsFromSpaFile.
//
#define SPASTRING_PRESENCE_IDLE_NAME 4
#define SPASTRING_PRESENCE_MENUS_NAME 10
#define SPASTRING_ACH_01_NAME 376
#define SPASTRING_ACH_02_NAME 377
#define SPASTRING_ACH_03_NAME 378
#define SPASTRING_ACH_07_NAME 379
#define SPASTRING_ACH_08_NAME 380
#define SPASTRING_ACH_09_NAME 381
#define SPASTRING_ACH_13_NAME 382
#define SPASTRING_ACH_14_NAME 383
#define SPASTRING_ACH_15_NAME 384
#define SPASTRING_ACH_16_NAME 385
#define SPASTRING_ACH_04_NAME 386
#define SPASTRING_ACH_10_NAME 387
#define SPASTRING_ACH_01_DESC 388
#define SPASTRING_ACH_02_DESC 389
#define SPASTRING_ACH_03_DESC 390
#define SPASTRING_ACH_07_DESC 391
#define SPASTRING_ACH_08_DESC 392
#define SPASTRING_ACH_09_DESC 393
#define SPASTRING_ACH_13_DESC 394
#define SPASTRING_ACH_14_DESC 395
#define SPASTRING_ACH_15_DESC 396
#define SPASTRING_ACH_16_DESC 397
#define SPASTRING_ACH_04_DESC 398
#define SPASTRING_ACH_10_DESC 399
#define SPASTRING_ACH_01_HOWTO 400
#define SPASTRING_ACH_02_HOWTO 401
#define SPASTRING_ACH_03_HOWTO 402
#define SPASTRING_ACH_07_HOWTO 403
#define SPASTRING_ACH_08_HOWTO 404
#define SPASTRING_ACH_09_HOWTO 405
#define SPASTRING_ACH_13_HOWTO 406
#define SPASTRING_ACH_14_HOWTO 407
#define SPASTRING_ACH_15_HOWTO 408
#define SPASTRING_ACH_16_HOWTO 409
#define SPASTRING_ACH_04_HOWTO 410
#define SPASTRING_ACH_10_HOWTO 411
#define SPASTRING_STR_GAMEMODE_SINGLEPLAYER 420
#define SPASTRING_ACH_05_HOWTO 429
#define SPASTRING_ACH_05_NAME 430
#define SPASTRING_ACH_05_DESC 431
#define SPASTRING_ACH_11_HOWTO 432
#define SPASTRING_ACH_11_NAME 433
#define SPASTRING_ACH_11_DESC 434
#define SPASTRING_ACH_06_HOWTO 435
#define SPASTRING_ACH_06_NAME 436
#define SPASTRING_ACH_06_DESC 437
#define SPASTRING_ACH_12_HOWTO 438
#define SPASTRING_ACH_12_NAME 439
#define SPASTRING_ACH_12_DESC 440
#define SPASTRING_ACH_17_HOWTO 441
#define SPASTRING_ACH_17_NAME 442
#define SPASTRING_ACH_17_DESC 443
#define SPASTRING_ACH_18_HOWTO 444
#define SPASTRING_ACH_18_NAME 445
#define SPASTRING_ACH_18_DESC 446
#define SPASTRING_ACH_19_HOWTO 447
#define SPASTRING_ACH_19_NAME 448
#define SPASTRING_ACH_19_DESC 449
#define SPASTRING_ACH_20_HOWTO 450
#define SPASTRING_ACH_20_NAME 451
#define SPASTRING_ACH_20_DESC 452
#define SPASTRING_AV_PORKCHOP_TSHIRT_HOWTO 473
#define SPASTRING_AV_PORKCHOP_TSHIRT_TITLE1 474
#define SPASTRING_AV_PORKCHOP_TSHIRT_TITLE2 475
#define SPASTRING_AV_PORKCHOP_TSHIRT_DESC 476
#define SPASTRING_AV_WATCH_HOWTO 477
#define SPASTRING_AV_WATCH_TITLE1 478
#define SPASTRING_AV_WATCH_TITLE2 479
#define SPASTRING_AV_WATCH_DESC 480
#define SPASTRING_PRESENCE_MULTIPLAYER_NAME 490
#define SPASTRING_CT_GAME_STATE_NAME 492
#define SPASTRING_CV_GAME_STATE_BLANK_NAME 496
#define SPASTRING_CV_GAME_STATE_RIDING_PIG_NAME 497
#define SPASTRING_CV_GAME_STATE_RIDING_MINECART_NAME 498
#define SPASTRING_CV_GAME_STATE_BOATING_NAME 499
#define SPASTRING_CV_GAME_STATE_FISHING_NAME 500
#define SPASTRING_CV_GAME_STATE_CRAFTING_NAME 501
#define SPASTRING_CV_GAME_STATE_FORGING_NAME 502
#define SPASTRING_CV_GAME_STATE_NETHER_NAME 503
#define SPASTRING_CV_GAME_STATE_CD_NAME 504
#define SPASTRING_CV_GAME_STATE_MAP_NAME 505
#define SPASTRING_AV_CAP_HOWTO 506
#define SPASTRING_AV_CAP_TITLE1 507
#define SPASTRING_AV_CAP_TITLE2 508
#define SPASTRING_AV_CAP_DESC 509
#define SPASTRING_GM_MULTIPLAYER_NAME 517
#define SPASTRING_PROPERTY_LOCALE_NAME 520
#define SPASTRING_LB_KILLS_EASY_NAME 523
#define SPASTRING_LB_KILLS_EASY_ZOMBIES_NAME 524
#define SPASTRING_LB_KILLS_EASY_SKELETONS_NAME 525
#define SPASTRING_LB_KILLS_EASY_CREEPERS_NAME 526
#define SPASTRING_LB_KILLS_EASY_SPIDERS_NAME 527
#define SPASTRING_LB_KILLS_EASY_SPIDERJOCKEYS_NAME 528
#define SPASTRING_LB_KILLS_EASY_ZOMBIEPIGMEN_NAME 529
#define SPASTRING_LB_KILLS_EASY_SLIME_NAME 530
#define SPASTRING_LB_KILLS_EASY_RATING_NAME 531
#define SPASTRING_PROPERTY_RATING_NAME 532
#define SPASTRING_LB_KILLS_EASY_LOCALE_NAME 533
#define SPASTRING_PROPERTY_KILLS_ZOMBIE_NAME 534
#define SPASTRING_PROPERTY_KILLS_SKELETON_NAME 535
#define SPASTRING_PROPERTY_KILLS_CREEPER_NAME 536
#define SPASTRING_PROPERTY_KILLS_SPIDER_NAME 537
#define SPASTRING_PROPERTY_KILLS_SPIDERJOCKEY_NAME 538
#define SPASTRING_PROPERTY_KILLS_ZOMBIEPIGMAN_NAME 539
#define SPASTRING_PROPERTY_KILLS_SLIME_NAME 540
#define SPASTRING_PROPERTY_KILLS_GHAST_NAME 541
#define SPASTRING_LB_KILLS_NORMAL_NAME 543
#define SPASTRING_LB_KILLS_NORMAL_LOCALE_NAME 544
#define SPASTRING_LB_KILLS_NORMAL_ZOMBIES_NAME 545
#define SPASTRING_LB_KILLS_NORMAL_SKELETONS_NAME 546
#define SPASTRING_LB_KILLS_NORMAL_CREEPERS_NAME 547
#define SPASTRING_LB_KILLS_NORMAL_SPIDERS_NAME 548
#define SPASTRING_LB_KILLS_NORMAL_SPIDERJOCKEYS_NAME 549
#define SPASTRING_LB_KILLS_NORMAL_ZOMBIEPIGMEN_NAME 550
#define SPASTRING_LB_KILLS_NORMAL_SLIME_NAME 551
#define SPASTRING_LB_KILLS_NORMAL_RATING_NAME 552
#define SPASTRING_LB_KILLS_HARD_NAME 554
#define SPASTRING_LB_KILLS_HARD_LOCALE_NAME 555
#define SPASTRING_LB_KILLS_HARD_ZOMBIES_NAME 556
#define SPASTRING_LB_KILLS_HARD_SKELETONS_NAME 557
#define SPASTRING_LB_KILLS_HARD_CREEPERS_NAME 558
#define SPASTRING_LB_KILLS_HARD_SPIDERS_NAME 559
#define SPASTRING_LB_KILLS_HARD_SPIDERJOCKEYS_NAME 560
#define SPASTRING_LB_KILLS_HARD_ZOMBIEPIGMEN_NAME 561
#define SPASTRING_LB_KILLS_HARD_SLIME_NAME 562
#define SPASTRING_LB_KILLS_HARD_RATING_NAME 563
#define SPASTRING_LB_MINING_BLOCKS_PEACEFUL_NAME 564
#define SPASTRING_LB_MINING_BLOCKS_PEACEFUL_LOCALE_NAME 565
#define SPASTRING_LB_MINING_BLOCKS_PEACEFUL_DIRT_NAME 566
#define SPASTRING_LB_MINING_BLOCKS_PEACEFUL_STONE_NAME 567
#define SPASTRING_LB_MINING_BLOCKS_PEACEFUL_SAND_NAME 568
#define SPASTRING_LB_MINING_BLOCKS_PEACEFUL_COBBLESTONE_NAME 569
#define SPASTRING_LB_MINING_BLOCKS_PEACEFUL_GRAVEL_NAME 570
#define SPASTRING_LB_MINING_BLOCKS_PEACEFUL_CLAY_NAME 571
#define SPASTRING_LB_MINING_BLOCKS_PEACEFUL_OBSIDIAN_NAME 572
#define SPASTRING_LB_MINING_BLOCKS_PEACEFUL_RATING_NAME 573
#define SPASTRING_PROPERTY_MINED_DIRT_NAME 574
#define SPASTRING_PROPERTY_MINED_STONE_NAME 575
#define SPASTRING_PROPERTY_MINED_SAND_NAME 576
#define SPASTRING_PROPERTY_MINED_COBBLESTONE_NAME 577
#define SPASTRING_PROPERTY_MINED_GRAVEL_NAME 578
#define SPASTRING_PROPERTY_MINED_CLAY_NAME 579
#define SPASTRING_PROPERTY_MINED_OBSIDIAN_NAME 580
#define SPASTRING_PROPERTY_MINED_COAL_NAME 581
#define SPASTRING_PROPERTY_MINED_IRON_NAME 582
#define SPASTRING_PROPERTY_MINED_GOLD_NAME 583
#define SPASTRING_PROPERTY_MINED_DIAMOND_NAME 584
#define SPASTRING_PROPERTY_MINED_REDSTONE_NAME 585
#define SPASTRING_PROPERTY_MINED_LAPISLAZULI_NAME 586
#define SPASTRING_PROPERTY_MINED_NETHERRACK_NAME 587
#define SPASTRING_PROPERTY_MINED_SOULSAND_NAME 588
#define SPASTRING_PROPERTY_MINED_GLOWSTONE_NAME 589
#define SPASTRING_PROPERTY_COLLECTED_EGG_NAME 590
#define SPASTRING_PROPERTY_COLLECTED_WHEAT_NAME 591
#define SPASTRING_PROPERTY_COLLECTED_MUSHROOM_NAME 592
#define SPASTRING_PROPERTY_COLLECTED_SUGARCANE_NAME 593
#define SPASTRING_PROPERTY_COLLECTED_MILK_NAME 594
#define SPASTRING_PROPERTY_COLLECTED_PUMPKIN_NAME 595
#define SPASTRING_PROPERTY_TRAVEL_WALK_NAME 596
#define SPASTRING_PROPERTY_TRAVEL_SWIM_NAME 597
#define SPASTRING_PROPERTY_TRAVEL_FALL_NAME 598
#define SPASTRING_PROPERTY_TRAVEL_CLIMB_NAME 599
#define SPASTRING_PROPERTY_TRAVEL_MINECART_NAME 600
#define SPASTRING_PROPERTY_TRAVEL_BOAT_NAME 601
#define SPASTRING_PROPERTY_PORTALS_CREATED_NAME 603
#define SPASTRING_LB_MINING_BLOCKS_EASY_NAME 605
#define SPASTRING_LB_MINING_BLOCKS_EASY_LOCALE_NAME 606
#define SPASTRING_LB_MINING_BLOCKS_EASY_DIRT_NAME 607
#define SPASTRING_LB_MINING_BLOCKS_EASY_STONE_NAME 608
#define SPASTRING_LB_MINING_BLOCKS_EASY_SAND_NAME 609
#define SPASTRING_LB_MINING_BLOCKS_EASY_COBBLESTONE_NAME 610
#define SPASTRING_LB_MINING_BLOCKS_EASY_GRAVEL_NAME 611
#define SPASTRING_LB_MINING_BLOCKS_EASY_CLAY_NAME 612
#define SPASTRING_LB_MINING_BLOCKS_EASY_OBSIDIAN_NAME 613
#define SPASTRING_LB_MINING_BLOCKS_EASY_RATING_NAME 614
#define SPASTRING_LB_MINING_BLOCKS_NORMAL_NAME 616
#define SPASTRING_LB_MINING_BLOCKS_NORMAL_LOCALE_NAME 617
#define SPASTRING_LB_MINING_BLOCKS_NORMAL_DIRT_NAME 618
#define SPASTRING_LB_MINING_BLOCKS_NORMAL_STONE_NAME 619
#define SPASTRING_LB_MINING_BLOCKS_NORMAL_SAND_NAME 620
#define SPASTRING_LB_MINING_BLOCKS_NORMAL_COBBLESTONE_NAME 621
#define SPASTRING_LB_MINING_BLOCKS_NORMAL_GRAVEL_NAME 622
#define SPASTRING_LB_MINING_BLOCKS_NORMAL_CLAY_NAME 623
#define SPASTRING_LB_MINING_BLOCKS_NORMAL_OBSIDIAN_NAME 624
#define SPASTRING_LB_MINING_BLOCKS_NORMAL_RATING_NAME 625
#define SPASTRING_LB_MINING_BLOCKS_HARD_NAME 627
#define SPASTRING_LB_MINING_BLOCKS_HARD_LOCALE_NAME 628
#define SPASTRING_LB_MINING_BLOCKS_HARD_DIRT_NAME 629
#define SPASTRING_LB_MINING_BLOCKS_HARD_STONE_NAME 630
#define SPASTRING_LB_MINING_BLOCKS_HARD_SAND_NAME 631
#define SPASTRING_LB_MINING_BLOCKS_HARD_COBBLESTONE_NAME 632
#define SPASTRING_LB_MINING_BLOCKS_HARD_GRAVEL_NAME 633
#define SPASTRING_LB_MINING_BLOCKS_HARD_CLAY_NAME 634
#define SPASTRING_LB_MINING_BLOCKS_HARD_OBSIDIAN_NAME 635
#define SPASTRING_LB_MINING_BLOCKS_HARD_RATING_NAME 636
#define SPASTRING_LB_FARMING_PEACEFUL_NAME 676
#define SPASTRING_LB_FARMING_PEACEFUL_LOCALE_NAME 677
#define SPASTRING_LB_FARMING_PEACEFUL_EGGS_NAME 678
#define SPASTRING_LB_FARMING_PEACEFUL_WHEAT_NAME 679
#define SPASTRING_LB_FARMING_PEACEFUL_MUSHROOMS_NAME 680
#define SPASTRING_LB_FARMING_PEACEFUL_SUGARCANE_NAME 681
#define SPASTRING_LB_FARMING_PEACEFUL_MILK_NAME 682
#define SPASTRING_LB_FARMING_PEACEFUL_PUMPKINS_NAME 683
#define SPASTRING_LB_FARMING_PEACEFUL_RATING_NAME 684
#define SPASTRING_LB_FARMING_EASY_NAME 686
#define SPASTRING_LB_FARMING_EASY_LOCALE_NAME 687
#define SPASTRING_LB_FARMING_EASY_EGGS_NAME 688
#define SPASTRING_LB_FARMING_EASY_WHEAT_NAME 689
#define SPASTRING_LB_FARMING_EASY_MUSHROOMS_NAME 690
#define SPASTRING_LB_FARMING_EASY_SUGARCANE_NAME 691
#define SPASTRING_LB_FARMING_EASY_MILK_NAME 692
#define SPASTRING_LB_FARMING_EASY_PUMPKINS_NAME 693
#define SPASTRING_LB_FARMING_EASY_RATING_NAME 694
#define SPASTRING_LB_FARMING_NORMAL_NAME 696
#define SPASTRING_LB_FARMING_NORMAL_LOCALE_NAME 697
#define SPASTRING_LB_FARMING_NORMAL_EGGS_NAME 698
#define SPASTRING_LB_FARMING_NORMAL_WHEAT_NAME 699
#define SPASTRING_LB_FARMING_NORMAL_MUSHROOMS_NAME 700
#define SPASTRING_LB_FARMING_NORMAL_SUGARCANE_NAME 701
#define SPASTRING_LB_FARMING_NORMAL_MILK_NAME 702
#define SPASTRING_LB_FARMING_NORMAL_PUMPKINS_NAME 703
#define SPASTRING_LB_FARMING_NORMAL_RATING_NAME 704
#define SPASTRING_LB_FARMING_HARD_NAME 706
#define SPASTRING_LB_FARMING_HARD_LOCALE_NAME 707
#define SPASTRING_LB_FARMING_HARD_EGGS_NAME 708
#define SPASTRING_LB_FARMING_HARD_WHEAT_NAME 709
#define SPASTRING_LB_FARMING_HARD_MUSHROOMS_NAME 710
#define SPASTRING_LB_FARMING_HARD_SUGARCANE_NAME 711
#define SPASTRING_LB_FARMING_HARD_MILK_NAME 712
#define SPASTRING_LB_FARMING_HARD_PUMPKINS_NAME 713
#define SPASTRING_LB_FARMING_HARD_RATING_NAME 714
#define SPASTRING_LB_TRAVELLING_PEACEFUL_NAME 715
#define SPASTRING_LB_TRAVELLING_PEACEFUL_LOCALE_NAME 716
#define SPASTRING_LB_TRAVELLING_PEACEFUL_WALKED_NAME 717
#define SPASTRING_LB_TRAVELLING_PEACEFUL_SWAM_NAME 718
#define SPASTRING_LB_TRAVELLING_PEACEFUL_FALLEN_NAME 719
#define SPASTRING_LB_TRAVELLING_PEACEFUL_CLIMBED_NAME 720
#define SPASTRING_LB_TRAVELLING_PEACEFUL_MINECART_NAME 721
#define SPASTRING_LB_TRAVELLING_PEACEFUL_BOAT_NAME 722
#define SPASTRING_LB_TRAVELLING_PEACEFUL_RATING_NAME 724
#define SPASTRING_LB_TRAVELLING_EASY_NAME 726
#define SPASTRING_LB_TRAVELLING_EASY_LOCALE_NAME 727
#define SPASTRING_LB_TRAVELLING_EASY_WALKED_NAME 728
#define SPASTRING_LB_TRAVELLING_EASY_SWAM_NAME 729
#define SPASTRING_LB_TRAVELLING_EASY_FALLEN_NAME 730
#define SPASTRING_LB_TRAVELLING_EASY_CLIMBED_NAME 731
#define SPASTRING_LB_TRAVELLING_EASY_MINECART_NAME 732
#define SPASTRING_LB_TRAVELLING_EASY_BOAT_NAME 733
#define SPASTRING_LB_TRAVELLING_EASY_RATING_NAME 735
#define SPASTRING_LB_TRAVELLING_NORMAL_NAME 737
#define SPASTRING_LB_TRAVELLING_NORMAL_LOCALE_NAME 738
#define SPASTRING_LB_TRAVELLING_NORMAL_WALKED_NAME 739
#define SPASTRING_LB_TRAVELLING_NORMAL_SWAM_NAME 740
#define SPASTRING_LB_TRAVELLING_NORMAL_FALLEN_NAME 741
#define SPASTRING_LB_TRAVELLING_NORMAL_CLIMBED_NAME 742
#define SPASTRING_LB_TRAVELLING_NORMAL_MINECART_NAME 743
#define SPASTRING_LB_TRAVELLING_NORMAL_BOAT_NAME 744
#define SPASTRING_LB_TRAVELLING_NORMAL_RATING_NAME 746
#define SPASTRING_LB_TRAVELLING_HARD_NAME 748
#define SPASTRING_LB_TRAVELLING_HARD_LOCALE_NAME 749
#define SPASTRING_LB_TRAVELLING_HARD_WALKED_NAME 750
#define SPASTRING_LB_TRAVELLING_HARD_SWAM_NAME 751
#define SPASTRING_LB_TRAVELLING_HARD_FALLEN_NAME 752
#define SPASTRING_LB_TRAVELLING_HARD_CLIMBED_NAME 753
#define SPASTRING_LB_TRAVELLING_HARD_MINECART_NAME 754
#define SPASTRING_LB_TRAVELLING_HARD_BOAT_NAME 755
#define SPASTRING_LB_TRAVELLING_HARD_RATING_NAME 757
#define SPASTRING_LB_TRAVELLING_TOTAL_NAME 795
#define SPASTRING_LB_TRAVELLING_TOTAL_RATING_NAME 796
#define SPASTRING_LB_ARCADE_TRAVELLING_TOTAL_RATING_NAME 797
#define SPASTRING_PROPERTY_COLLECTED_NETHERLAVA_NAME 799
#define SPASTRING_PRESENCE_MULTIPLAYEROFFLINE_NAME 803
#define SPASTRING_PRESENCE_MULTIPLAYER_1P_NAME 804
#define SPASTRING_PRESENCE_MULTIPLAYER_1POFFLINE_NAME 805
#ifdef __cplusplus
}
#endif
#endif // __MINECRAFT_SPA_H__

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.0 KiB

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,159 @@
#pragma once
// gdraw_ps3gcm.h - copyright 2010-2011 RAD Game Tools
//
// Interface for creating a GCM GDraw driver.
#include "gdraw.h"
#define IDOC
//idoc(parent, GDraw_ps3gcm)
typedef enum gdraw_gcm_resourcetype
{
GDRAW_GCM_RESOURCE_texture,
GDRAW_GCM_RESOURCE_vertexbuffer,
GDRAW_GCM_RESOURCE_dyn_vertexbuffer,
GDRAW_GCM_RESOURCE__count,
} gdraw_gcm_resourcetype;
IDOC extern int gdraw_GCM_SetResourceMemory(gdraw_gcm_resourcetype type, S32 num_handles, void *ptr, S32 num_bytes);
/* This sets up the resource pools that GDraw uses for its video memory management.
It sets both the number of handles and the address and size of memory to use.
GDraw keeps track of allocations in each pool, and will free old resources in
a LRU manner to make space if one of the limits is about to be exceeded. It will
also automatically defragment memory if necessary to fulfill an allocation
request. The pointer should be either to RSX local memory or to RSX-mapped
main memory. It also needs to be aligned to a cache line boundary (128 bytes).
You need to set up all of the resource pools before you can start rendering.
If you modify this at runtime, you need to call IggyPlayerFlushAll on all
active Iggys (if any) since this call invalidates all resource handles they
currently hold.
If any Iggy draw calls are in flight, this call will block waiting for
those calls to finish (i.e. for the resource memory to become
unused).
*/
IDOC extern int gdraw_GCM_SetRendertargetMemory(void *ptr, S32 num_bytes, S32 width, S32 height, S32 pitch);
/* Specifies the start address, size and physical dimensions of the region used to allocate render targets from.
All render targets allocated by GDraw have the same size (width x height pixels) and will use the same pitch;
thus you can pack them all into one tile region, which is recommended from a performance perspective.
Pitch must allow for 4-byte-per-pixel rendertargets (so pitch must be at least width*4).
On other platforms, Iggy does not require you to correctly specify the width and height of the
rendertargets; the size you specify is a hint, and GDraw will detect the actual
needed size and reallocate the rendertargets to be large enough as needed.
Because of the need to set pitch accurately, this is not true on the PS3; instead,
the width and height you specify here _must_ be sufficiently large. To be explicit,
each of width and height be as large as the largest Iggy you will render in that
dimension, or if you're rendering with tiles, the largest tile you'll render,
including padding (possibly on both sides).
For example, if all you ever render is a 400x300 Iggy, you could call this
with width,height=300. If all you render is a 1920x1080 Iggy split into two
horizontal tiles with 8 pixels of padding, you could call this with
width=960+8*2, height=1080+8*2. (This is assuming there is padding on all
sides of the tile; in practice, with this particular arrangement, there is
only ever one column of horizontal padding, so technically it is large
enough to use <960+8,1080>. I prefer to just always pad all sides so that
I don't have to worry about how things change depending on 3-tiles-in-a-row
versus 4-quadrant-tiles, but this does waste some memory.)
If you render multiple Iggys in one frame (or, generally, during a single "major mode",
since you don't want to reallocate rendertargets on the fly), you must take the max
of each dimension. For example, if you were to render:
$* A 500x200 Iggy
$* An 800x100 Iggy
$* One Iggy using two 400x300 tiles, each with 8 pixels of padding
Then the necessary width would be max(500,800,300+8*2) and the necessary height
would be max(200,100,400+8*2); in other words, you would need to call this
function with width and height no smaller than <800,416>.
You can use this memory for your own purposes as well. IggyPlayerDraw* calls will write to it,
and you should not touch it _during_ IggyDraw calls. GDraw only touches this memory from
the GPU, so you must only access it from the GPU.
Calling this function causes GDraw to wait for all outstanding GDraw operations
to drain from the GPU pipeline.
*/
IDOC extern void gdraw_GCM_ResetAllResourceMemory();
/* Frees all resource pools managed by GDraw. (This includes rendertargets)
Use this as a quick way of freeing (nearly) all memory allocated by GDraw
without shutting it down completely. For example, you might want to use this
to quickly flush all memory allocated by GDraw when transitioning between the
main menu and the game proper. Like with SetResourceMemory, you need to call
IggyPlayerFlushAll on all currently active Iggy players if you do this - although
we recommend that you only use this function when there aren't any. */
#define GDRAW_GCM_LOCAL_WORKMEM_SIZE (64*1024)
// GDraw needs some amount of RSX local memory for itself, to allocate fragment programs and other system resources in.
IDOC extern GDrawFunctions * gdraw_GCM_CreateContext(CellGcmContextData *gcm, void *local_workmem, U8 rsx_label_index);
/* Creates a GDraw context for rendering using GCM. You need to pass in the GcmContextData
(this needs to be your main command buffer; GDraw does its own resource management,
inserts sync commands, and expects them to be executed at some point!).
You also need to pass a pointer to GDRAW_GCM_LOCAL_WORKMEM_SIZE bytes of RSX
local memory; GDraw stores its fragment programs and some other small resources
there. Finally, you need to pass in the number of a free RSX label index to be
used by GDraw.
There can only be one GCM GDraw context active at any one time.
If initialization fails for some reason (the main reason would be an out of memory condition),
NULL is returned. Otherwise, you can pass the return value to IggySetGDraw. */
IDOC extern void gdraw_GCM_DestroyContext(void);
/* Destroys the current GDraw context, if any. */
IDOC extern void gdraw_GCM_SetTileOrigin(CellGcmSurface *rt, S32 x, S32 y);
/* This sets the surface that GDraw should render to and the x/y position of the
output location of the top-left pixel of the current tile (to be used for tiled rendering).
The main rendertarget needs to be non-multisampled ARGB with 32 bits/pixel;
multisampling is not currently supported (nor is it necessary, as Iggy does its
own antialiasing). The Z-buffer needs to be 24-bit depth with 8 bits of stencil.
Rendertargets 1-3 should be disabled (i.e. no MRT).
You need to call this before Iggy calls any rendering functions. */
IDOC extern void gdraw_GCM_NoMoreGDrawThisFrame(void);
/* Tells GDraw that no more rendering operations will occur this frame. This triggers
some end-of-frame processing, which is important for GDraws resource management to
work, so please do not forget to call this every frame! (As long as Iggy does any
rendering, that is) */
IDOC extern void RADLINK gdraw_GCM_CalculateCustomDraw_4J(IggyCustomDrawCallbackRegion *Region, F32 mat[16]);
IDOC extern void RADLINK gdraw_GCM_BeginCustomDraw(IggyCustomDrawCallbackRegion *Region, float *mat);
/* Call at the beginning of Iggy custom draw callback to clear any odd render states GDraw has
set on the RSX, and to get the current 2D object-to-world transformation. */
IDOC extern void RADLINK gdraw_GCM_EndCustomDraw(IggyCustomDrawCallbackRegion *Region);
/* Call at the end of Iggy custom draw callback so GDraw can restore its render states. */
IDOC extern GDrawTexture *gdraw_GCM_WrappedTextureCreate(CellGcmTexture *gcm_tex);
/* Create a wrapped texture from a CellGcmTexture.
A wrapped texture can be used to let Iggy draw using the contents of a texture
you create and manage on your own. For example, you might render to this texture,
or stream video into it. Wrapped textures take up a handle. They will never be
freed or otherwise modified by GDraw; object lifetime management is up to you. */
IDOC extern void gdraw_GCM_WrappedTextureChange(GDrawTexture *tex, CellGcmTexture *gcm_tex);
/* Switch an existing GDrawTexture * that represents a wrapped texture to use
a new underlying GCM texture. For example, you might internally double-buffer
a dynamically updated texture. As above, GDraw will leave this texture alone
and not do any lifetime management. */
IDOC extern void gdraw_GCM_WrappedTextureDestroy(GDrawTexture *tex);
/* Destroys the GDraw wrapper for a wrapped texture object. This will free up
a GDraw texture handle, nothing else. */
extern GDrawTexture * RADLINK gdraw_GCM_MakeTextureFromResource(U8 *resource_file, S32 length, IggyFileTexturePS3 *texture);
extern void RADLINK gdraw_GCM_DestroyTextureFromResource(GDrawTexture *tex);

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,726 @@
// gdraw.h - author: Sean Barrett - copyright 2009 RAD Game Tools
//
// This is the graphics rendering abstraction that Iggy is implemented
// on top of.
#ifndef __RAD_INCLUDE_GDRAW_H__
#define __RAD_INCLUDE_GDRAW_H__
#include "rrcore.h"
#define IDOC
RADDEFSTART
//idoc(parent,GDrawAPI_Buffers)
#ifndef IGGY_GDRAW_SHARED_TYPEDEF
#define IGGY_GDRAW_SHARED_TYPEDEF
typedef struct GDrawFunctions GDrawFunctions;
typedef struct GDrawTexture GDrawTexture;
#endif//IGGY_GDRAW_SHARED_TYPEDEF
IDOC typedef struct GDrawVertexBuffer GDrawVertexBuffer;
/* An opaque handle to an internal GDraw vertex buffer. */
//idoc(parent,GDrawAPI_Base)
IDOC typedef struct gswf_recti
{
S32 x0,y0; // Minimum corner of the rectangle
S32 x1,y1; // Maximum corner of the rectangle
} gswf_recti;
/* A 2D rectangle with integer coordinates specifying its minimum and maximum corners. */
IDOC typedef struct gswf_rectf
{
F32 x0,y0; // Minimum corner of the rectangle
F32 x1,y1; // Maximum corner of the rectangle
} gswf_rectf;
/* A 2D rectangle with floating-point coordinates specifying its minimum and maximum corners. */
IDOC typedef struct gswf_matrix
{
union {
F32 m[2][2]; // 2x2 transform matrix
struct {
F32 m00; // Alternate name for m[0][0], for coding convenience
F32 m01; // Alternate name for m[0][1], for coding convenience
F32 m10; // Alternate name for m[1][0], for coding convenience
F32 m11; // Alternate name for m[1][1], for coding convenience
};
};
F32 trans[2]; // 2D translation vector (the affine component of the matrix)
} gswf_matrix;
/* A 2D transform matrix plus a translation offset. */
#define GDRAW_STATS_batches 1
#define GDRAW_STATS_blits 2
#define GDRAW_STATS_alloc_tex 4
#define GDRAW_STATS_frees 8
#define GDRAW_STATS_defrag 16
#define GDRAW_STATS_rendtarg 32
#define GDRAW_STATS_clears 64
IDOC typedef struct GDrawStats
{
S16 nonzero_flags; // which of the fields below are non-zero
U16 num_batches; // number of batches, e.g. DrawPrim, DrawPrimUP
U16 num_blits; // number of blit operations (resolve, msaa resolve, blend readback)
U16 freed_objects; // number of cached objects freed
U16 defrag_objects; // number of cached objects defragmented
U16 alloc_tex; // number of textures/buffers allocated
U16 rendertarget_changes; // number of rendertarget changes
U16 num_clears;
//0 mod 8
U32 drawn_indices; // number of indices drawn (3 times number of triangles)
U32 drawn_vertices; // number of unique vertices referenced
U32 num_blit_pixels;// number of pixels in blit operations
U32 alloc_tex_bytes;// number of bytes in textures/buffers allocated
U32 freed_bytes; // number of bytes in freed cached objects
U32 defrag_bytes; // number of bytes in defragmented cached objects
U32 cleared_pixels; // number of pixels cleared by clear operation
U32 reserved;
//0 mod 8
} GDrawStats;
/* A structure with statistics information to show in resource browser/Telemetry */
////////////////////////////////////////////////////////////
//
// Queries
//
//idoc(parent,GDrawAPI_Queries)
IDOC typedef enum gdraw_bformat
{
GDRAW_BFORMAT_vbib, // Platform uses vertex and index buffers
GDRAW_BFORMAT_wii_dlist, // Platform uses Wii-style display lists
GDRAW_BFORMAT_vbib_single_format, // Platform uses vertex and index buffers, but doesn't support multiple vertex formats in a single VB
GDRAW_BFORMAT__count,
} gdraw_bformat;
/* Specifies what data format GDraw expects in MakeVertexBuffer_* and DrawIndexedTriangles.
Most supported platforms prefer Vertex and Index buffers so that's what we use,
but this format turns out to be somewhat awkward for Wii, so we use the native
graphics processor display list format on that platform. */
IDOC typedef struct GDrawInfo
{
S32 num_stencil_bits; // number of (possibly emulated) stencil buffer bits
U32 max_id; // number of unique values that can be easily encoded in zbuffer
U32 max_texture_size; // edge length of largest square texture supported by hardware
U32 buffer_format; // one of $gdraw_bformat
rrbool shared_depth_stencil; // does 0'th framebuffer share depth & stencil with others? (on GL it can't?)
rrbool always_mipmap; // if GDraw can generate mipmaps nearly for free, then set this flag
rrbool conditional_nonpow2; // non-pow2 textures supported, but only using clamp and without mipmaps
rrbool has_rendertargets; // if true, then there is no rendertarget stack support
rrbool no_nonpow2; // non-pow2 textures aren't supported at all
} GDrawInfo; // must be a multiple of 8
/* $GDrawInfo contains the information that Iggy needs to know about
what a GDraw implementation supports and what limits it places on
certain important values. */
IDOC typedef void RADLINK gdraw_get_info(GDrawInfo *d);
/* Iggy queries this at the beginning of rendering to get information
about the viewport and the device capabilities. */
////////////////////////////////////////////////////////////
//
// Drawing State
//
//idoc(parent,GDrawAPI_DrawingState)
IDOC typedef enum gdraw_blend
{
GDRAW_BLEND_none, // Directly copy
GDRAW_BLEND_alpha, // Use the source alpha channel to modulate its contribution
GDRAW_BLEND_multiply, // Multiply colors componentwise
GDRAW_BLEND_add, // Add the source and destination together
GDRAW_BLEND_filter, // Uses a secondary $gdraw_filter specification to determine how to blend
GDRAW_BLEND_special, // Uses a secondary $gdraw_blendspecial specification to determine how to blend
GDRAW_BLEND__count,
} gdraw_blend;
/* Identifier indicating the type of blending operation to use when rendering.*/
IDOC typedef enum gdraw_blendspecial
{
GDRAW_BLENDSPECIAL_layer, // s
GDRAW_BLENDSPECIAL_multiply, // s*d
GDRAW_BLENDSPECIAL_screen, // sa*da - (da-d)*(sa-s)
GDRAW_BLENDSPECIAL_lighten, // max(sa*d,s*da)
GDRAW_BLENDSPECIAL_darken, // min(sa*d,s*da)
GDRAW_BLENDSPECIAL_add, // min(d+s,1.0)
GDRAW_BLENDSPECIAL_subtract, // max(d-s,0.0)
GDRAW_BLENDSPECIAL_difference, // abs(sa*d-s*da)
GDRAW_BLENDSPECIAL_invert, // sa*(da-d)
GDRAW_BLENDSPECIAL_overlay, // d < da/2.0 ? (2.0*s*d) : (sa*da - 2.0*(da-d)*(sa-s))
GDRAW_BLENDSPECIAL_hardlight, // s < sa/2.0 ? (2.0*s*d) : (sa*da - 2.0*(da-d)*(sa-s))
// these do extra-special math on the output alpha
GDRAW_BLENDSPECIAL_erase, // d*(1.0-sa)
GDRAW_BLENDSPECIAL_alpha_special, // d*sa
GDRAW_BLENDSPECIAL__count,
} gdraw_blendspecial;
/* Specifies a type of "special" blend mode, which is defined as one
that has to read from the framebuffer to compute its effect.
These modes are only used with a 1-to-1 textured quad containing
the exact output data in premultiplied alpha. They all need to
read from the framebuffer to compute their effect, so a GDraw
implementation will usually need a custom path to handle that.
Users will not warn in advance whether you're going to need this
operation, so implementations either need to always render to a
texture in case it happens, or copy the framebuffer to a texture
when it does.
Note that $(gdraw_blendspecial::GDRAW_BLENDSPECIAL_erase) and
$(gdraw_blendspecial::GDRAW_BLENDSPECIAL_alpha_special) are unique
among $gdraw_blendspecial modes in that they may not actually need
to be implemented with the destination input as a texture if
the destination buffer doesn't have an alpha channel. */
// (@OPTIMIZE: the last filter in each chain could be combined with
// the final blend, although only worth doing if the final blend is
// ALPHA/ADD/MULTIPLY--it's usually ALPHA though so worth doing!)
IDOC typedef enum gdraw_filter
{
GDRAW_FILTER_blur, // Blurs the source image
GDRAW_FILTER_colormatrix, // Transform RGB pixel values by a matrix
GDRAW_FILTER_bevel, // Bevels the source image
GDRAW_FILTER_dropshadow, // Adds a dropshadow underneath the source image
GDRAW_FILTER__count,
} gdraw_filter;
/* Specifies a type of post-processing graphics filter.
These modes are only used to implement filter effects, and will
always be blending from a temporary buffer to another temporary
buffer with no blending, so in general they should not require
any additional input.
*/
IDOC typedef enum gdraw_texture
{
GDRAW_TEXTURE_none, // No texture applied
GDRAW_TEXTURE_normal, // Texture is bitmap or linear gradient
GDRAW_TEXTURE_alpha, // Texture is an alpha-only font bitmap
GDRAW_TEXTURE_radial, // Texture is a radial gradient
GDRAW_TEXTURE_focal_gradient, // Texture is a "focal" radial gradient
GDRAW_TEXTURE_alpha_test, // Texture is an alpha-only font bitmap, alpha test for alpha >= 0.5
GDRAW_TEXTURE__count,
} gdraw_texture;
/* Specifies how to apply a texture while rendering. */
IDOC typedef enum gdraw_wrap
{
GDRAW_WRAP_clamp, // Texture coordinates clamped to edges
GDRAW_WRAP_repeat, // Texture repeats periodically
GDRAW_WRAP_mirror, // Repeat periodically, mirror on odd repetititions
GDRAW_WRAP_clamp_to_border, // only used internally by some GDraws
GDRAW_WRAP__count,
} gdraw_wrap;
/* Specifies what to do with texture coordinates outside [0,1]. */
typedef struct GDrawRenderState
{
S32 id; // Object "identifier" used for high-quality AA mode
U32 test_id:1; // Whether to test zbuffer == id
U32 set_id:1; // Whether to set zbuffer == id
U32 use_world_space:1; // Whether primitive is defined in object space or world space
U32 scissor:1; // Whether rendering will be clipped to $(GDrawRenderState::scissor_rect)
U32 identical_state:1; // Whether state is identical to the one used for the previous draw call
U32 unused:27;
//aligned 0 mod 8
U8 texgen0_enabled; // Whether to use texgen for tex0
U8 tex0_mode; // One of $gdraw_texture
U8 wrap0; // One of $gdraw_wrap
U8 nearest0; // Whether to sample texture 0 nearest neighbor
U8 blend_mode; // One of $gdraw_blend
U8 special_blend; // One of $gdraw_blendspecial (used only if $(GDrawRenderState::blend_mode) == $(gdraw_blend::GDRAW_BLEND_special)
U8 filter; // One of $gdraw_filter (used only if $(GDrawRenderState::blend_mode) == $(gdraw_blend::GDRAW_BLEND_filter)
U8 filter_mode; // Used to select the right compositing operation for the $(gdraw_filter::GDRAW_FILTER_bevel) and $(gdraw_filter::GDRAW_FILTER_dropshadow) modes
//aligned 0 mod 8
U8 stencil_test; // Only draw if these stencil bits are "set"
U8 stencil_set; // "Set" these stencil bits (note that actual implementation initializes stencil to 1, and "set" makes them 0)
U8 reserved[2]; // Currently unused (used to make padding to 4/8-byte boundary for following pointer explicit)
S32 blur_passes; // For filters that include blurring, this is the number of box filter passes to run
//align 0 mod 8
S16 *cxf_add; // Color transform addition (discourage additive alpha!)
GDrawTexture *tex[3]; // One or more textures to apply -- need 3 for gradient dropshadow.
//0 mod 8
F32 *edge_matrix; // Screen to object space matrix (for edge antialiasing)
gswf_matrix *o2w; // Object-to-world matrix
// --- Everything below this point must be manually initialized
//0 mod 8
F32 color[4]; // Color of the object
//0 mod 8
gswf_recti scissor_rect; // The rectangle to which rendering will be clipped if $(GDrawRenderState::scissor) is set
//0 mod 8
// --- Everything below this point might be uninitialized if it's not used for this particular render state
F32 s0_texgen[4]; // "s" (x) row of texgen matrix
F32 t0_texgen[4]; // "t" (y) row of texgen matrix
//0 mod 8
F32 focal_point[4]; // Data used for $(gdraw_texgen_mode::GDRAW_TEXTURE_focal_gradient)
//0 mod 8
F32 blur_x,blur_y; // The size of the box filter, where '1' is the identity and 2 adds half a pixel on each side
//0 mod 8
F32 shader_data[20]; // Various data that depends on filter (e.g. drop shadow direction, color)
} GDrawRenderState;
/* Encapsulation of the entire drawing state that affects a rendering command. */
IDOC typedef void RADLINK gdraw_set_view_size_and_world_scale(S32 w, S32 h, F32 x_world_to_pixel, F32 y_world_to_pixel);
/* Sets the size of the rendering viewport and the world to pixel scaling.
Iggy calls this function with the full size that the viewport would
be if it were rendered untiled, even if it will eventually be
rendered as a collection of smaller tiles.
The world scale is used to compensate non-square pixel aspect ratios
when rendering wide lines. Both scale factors are 1 unless Iggy is
running on a display with non-square pixels. */
typedef void RADLINK gdraw_set_3d_transform(F32 *mat); /* mat[3][4] */
IDOC typedef void RADLINK gdraw_render_tile_begin(S32 tx0, S32 ty0, S32 tx1, S32 ty1, S32 pad, GDrawStats *stats);
/* Begins rendering of a sub-region of the rendered image. */
IDOC typedef void RADLINK gdraw_render_tile_end(GDrawStats *stats);
/* Ends rendering of a sub-region of the rendered image. */
IDOC typedef void RADLINK gdraw_rendering_begin(void);
/* Begins rendering; takes control of the graphics API. */
IDOC typedef void RADLINK gdraw_rendering_end(void);
/* Ends rendering; gives up control of the graphics API. */
////////////////////////////////////////////////////////////
//
// Drawing
//
//idoc(parent,GDrawAPI_Drawing)
IDOC typedef void RADLINK gdraw_clear_stencil_bits(U32 bits);
/* Clears the 'bits' parts of the stencil value in the entire framebuffer to the default value. */
IDOC typedef void RADLINK gdraw_clear_id(void);
/* Clears the 'id' buffer, which is typically the z-buffer but can also be the stencil buffer. */
IDOC typedef void RADLINK gdraw_filter_quad(GDrawRenderState *r, S32 x0, S32 y0, S32 x1, S32 y1, GDrawStats *stats);
/* Draws a special quad in viewport-relative pixel space.
May be normal, may be displaced by filters, etc. and require multiple passes,
may apply special blending (and require extra resolves/rendertargets)
for filter/blend.,
The x0,y0,x1,y1 always describes the "input" box. */
IDOC typedef struct GDrawPrimitive
{
F32 *vertices; // Pointer to an array of $gswf_vertex_xy, $gswf_vertex_xyst, or $gswf_vertex_xyoffs
U16 *indices; // Pointer to an array of 16-bit indices into $(GDrawPrimitive::vertices)
S32 num_vertices; // Count of elements in $(GDrawPrimitive::vertices)
S32 num_indices; // Count of elements in $(GDrawPrimitive::indices)
S32 vertex_format; // One of $gdraw_vformat, specifying the type of element in $(GDrawPrimitive::vertices)
U32 uniform_count;
F32 *uniforms;
U8 drawprim_mode;
} GDrawPrimitive;
/* Specifies the vertex and index data necessary to draw a batch of graphics primitives. */
IDOC typedef void RADLINK gdraw_draw_indexed_triangles(GDrawRenderState *r, GDrawPrimitive *prim, GDrawVertexBuffer *buf, GDrawStats *stats);
/* Draws a collection of indexed triangles, ignoring special filters or blend modes.
If buf is NULL, then the pointers in 'prim' are machine pointers, and
you need to make a copy of the data (note currently all triangles
implementing strokes (wide lines) go this path).
If buf is non-NULL, then use the appropriate vertex buffer, and the
pointers in prim are actually offsets from the beginning of the
vertex buffer -- i.e. offset = (char*) prim->whatever - (char*) NULL;
(note there are separate spaces for vertices and indices; e.g. the
first mesh in a given vertex buffer will normally have a 0 offset
for the vertices and a 0 offset for the indices)
*/
IDOC typedef void RADLINK gdraw_set_antialias_texture(S32 width, U8 *rgba);
/* Specifies the 1D texture data to be used for the antialiasing gradients.
'rgba' specifies the pixel values in rgba byte order. This will only be called
once during initialization. */
////////////////////////////////////////////////////////////
//
// Texture and Vertex Buffers
//
//idoc(parent,GDrawAPI_Buffers)
IDOC typedef enum gdraw_texture_format
{
// Platform-independent formats
GDRAW_TEXTURE_FORMAT_rgba32, // 32bpp RGBA data in platform-preferred byte order (returned by $gdraw_make_texture_begin as $gdraw_texture_type)
GDRAW_TEXTURE_FORMAT_font, // Alpha-only data with at least 4 bits/pixel. Data is submitted as 8 bits/pixel, conversion (if necessary) done by GDraw.
// First platform-specific format index (for reference)
GDRAW_TEXTURE_FORMAT__platform = 16,
// In the future, we will support platform-specific formats and add them to this list.
} gdraw_texture_format;
/* Describes the format of a texture submitted to GDraw. */
IDOC typedef enum gdraw_texture_type
{
GDRAW_TEXTURE_TYPE_rgba, // Raw 4-channel packed texels, in OpenGL-standard order
GDRAW_TEXTURE_TYPE_bgra, // Raw 4-channel packed texels, in Direct3D-standard order
GDRAW_TEXTURE_TYPE_argb, // Raw 4-channel packed texels, in Flash native order
GDRAW_TEXTURE_TYPE__count,
} gdraw_texture_type;
/* Describes the channel layout of a RGBA texture submitted to GDraw. */
IDOC typedef struct GDraw_MakeTexture_ProcessingInfo
{
U8 *texture_data; // Pointer to the texture image bits
S32 num_rows; // Number of rows to upload in the current chunk
S32 stride_in_bytes; // Distance between a given pixel and the first pixel in the next row
S32 texture_type; // One of $gdraw_texture_type
U32 temp_buffer_bytes; // Size of temp buffer in bytes
U8 *temp_buffer; // Temp buffer for GDraw to work in (used during mipmap creation)
void *p0,*p1,*p2,*p3,*p4,*p5,*p6,*p7; // Pointers for GDraw to store data across "passes" (never touched by Iggy)
U32 i0, i1, i2, i3, i4, i5, i6, i7; // Integers for GDraw to store data across "passes" (never touched by Iggy)
} GDraw_MakeTexture_ProcessingInfo;
/* $GDraw_MakeTexture_ProcessingInfo is used when building a texture. */
IDOC typedef struct GDraw_Texture_Description {
S32 width; // Width of the texture in pixels
S32 height; // Height of the texture in pixels
U32 size_in_bytes; // Size of the texture in bytes
} GDraw_Texture_Description;
/* $GDraw_Texture_Description contains information about a texture. */
IDOC typedef U32 gdraw_maketexture_flags;
#define GDRAW_MAKETEXTURE_FLAGS_mipmap 1 IDOC // Generates mip-maps for the texture
#define GDRAW_MAKETEXTURE_FLAGS_updatable 2 IDOC // Set if the texture might be updated subsequent to its initial submission
#define GDRAW_MAKETEXTURE_FLAGS_never_flush 4 IDOC // Set to request that the texture never be flushed from the GDraw cache
/* Flags that control the submission and management of GDraw textures. */
IDOC typedef void RADLINK gdraw_set_texture_unique_id(GDrawTexture *tex, void *old_unique_id, void *new_unique_id);
/* Changes unique id of a texture, only used for TextureSubstitution */
IDOC typedef rrbool RADLINK gdraw_make_texture_begin(void *unique_id,
S32 width, S32 height, gdraw_texture_format format, gdraw_maketexture_flags flags,
GDraw_MakeTexture_ProcessingInfo *output_info, GDrawStats *stats);
/* Begins specifying a new texture.
$:unique_id Unique value specified by Iggy that you can use to identify a reference to the same texture even if its handle has been discarded
$:return Error code if there was a problem, IGGY_RESULT_OK otherwise
*/
IDOC typedef rrbool RADLINK gdraw_make_texture_more(GDraw_MakeTexture_ProcessingInfo *info);
/* Continues specifying a new texture.
$:info The same handle initially passed to $gdraw_make_texture_begin
$:return True if specification can continue, false if specification must be aborted
*/
IDOC typedef GDrawTexture * RADLINK gdraw_make_texture_end(GDraw_MakeTexture_ProcessingInfo *info, GDrawStats *stats);
/* Ends specification of a new texture.
$:info The same handle initially passed to $gdraw_make_texture_begin
$:return Handle for the newly created texture, or NULL if an error occured
*/
IDOC typedef rrbool RADLINK gdraw_update_texture_begin(GDrawTexture *tex, void *unique_id, GDrawStats *stats);
/* Begins updating a previously submitted texture.
$:unique_id Must be the same value initially passed to $gdraw_make_texture_begin
$:return True on success, false otherwise and the texture must be recreated
*/
IDOC typedef void RADLINK gdraw_update_texture_rect(GDrawTexture *tex, void *unique_id, S32 x, S32 y, S32 stride, S32 w, S32 h, U8 *data, gdraw_texture_format format);
/* Updates a rectangle in a previously submitted texture.
$:format Must be the $gdraw_texture_format that was originally passed to $gdraw_make_texture_begin for this texture.
*/
IDOC typedef void RADLINK gdraw_update_texture_end(GDrawTexture *tex, void *unique_id, GDrawStats *stats);
/* Ends an update to a previously submitted texture.
$:unique_id Must be the same value initially passed to $gdraw_make_texture_begin (and hence $gdraw_update_texture_begin)
*/
IDOC typedef void RADLINK gdraw_describe_texture(GDrawTexture *tex, GDraw_Texture_Description *desc);
/* Returns a texture description for a given GDraw texture. */
IDOC typedef GDrawTexture * RADLINK gdraw_make_texture_from_resource(U8 *resource_file, S32 file_len, void *texture);
/* Loads a texture from a resource file and returns a wrapped pointer. */
IDOC typedef void RADLINK gdraw_free_texture_from_resource(GDrawTexture *tex);
/* Frees a texture created with gdraw_make_texture_from_resource. */
IDOC typedef struct gswf_vertex_xy
{
F32 x,y; // Position of the vertex
} gswf_vertex_xy;
/* A 2D point with floating-point position. */
IDOC typedef struct gswf_vertex_xyoffs
{
F32 x,y; // Position of the vertex
S16 aa; // Stroke/aa texcoord
S16 dx, dy; // Vector offset from the position, used for anti-aliasing (signed 11.5 fixed point)
S16 unused;
} gswf_vertex_xyoffs;
/* A 2D point with floating-point position, additional integer parameter, and integer anti-aliasing offset vector. */
IDOC typedef struct gswf_vertex_xyst
{
F32 x,y; // Position of the vertex
F32 s,t; // Explicit texture coordinates for rectangles
} gswf_vertex_xyst;
/* A 2D point with floating-point position and texture coordinates. */
typedef int gdraw_verify_size_xy [sizeof(gswf_vertex_xy ) == 8 ? 1 : -1];
typedef int gdraw_verify_size_xyoffs[sizeof(gswf_vertex_xyoffs) == 16 ? 1 : -1];
typedef int gdraw_verify_size_xyst [sizeof(gswf_vertex_xyst ) == 16 ? 1 : -1];
IDOC typedef enum gdraw_vformat
{
GDRAW_vformat_v2, // Indicates vertices of type $gswf_vertex_xy (8 bytes per vertex)
GDRAW_vformat_v2aa, // Indicates vertices of type $gswf_vertex_xyoffs (16 bytes per vertex)
GDRAW_vformat_v2tc2, // Indicates vertices of type $gswf_vertex_xyst (16 bytes per vertex)
GDRAW_vformat__basic_count,
GDRAW_vformat_ihud1 = GDRAW_vformat__basic_count, // primary format for ihud, currently v2tc2mat4 (20 bytes per vertex)
GDRAW_vformat__count,
GDRAW_vformat_mixed, // Special value that denotes a VB containing data in multiple vertex formats. Never used when drawing!
} gdraw_vformat;
/* Identifies one of the vertex data types. */
IDOC typedef struct GDraw_MakeVertexBuffer_ProcessingInfo
{
U8 *vertex_data; // location to write vertex data
U8 *index_data; // location to write index data
S32 vertex_data_length; // size of buffer to write vertex data
S32 index_data_length; // size of buffer to write index data
void *p0,*p1,*p2,*p3,*p4,*p5,*p6,*p7; // Pointers for GDraw to store data across "passes" (never touched by Iggy)
U32 i0, i1, i2, i3, i4, i5, i6, i7; // Integers for GDraw to store data across "passes" (never touched by Iggy)
} GDraw_MakeVertexBuffer_ProcessingInfo;
/* $GDraw_MakeVertexBuffer_ProcessingInfo is used when building a vertex buffer. */
IDOC typedef struct GDraw_VertexBuffer_Description {
S32 size_in_bytes; // Size of the vertex buffer in bytes
} GDraw_VertexBuffer_Description;
/* $GDraw_VertexBuffer_Description contains information about a vertex buffer. */
IDOC typedef rrbool RADLINK gdraw_make_vertex_buffer_begin(void *unique_id, gdraw_vformat vformat, S32 vdata_len_in_bytes, S32 idata_len_in_bytes, GDraw_MakeVertexBuffer_ProcessingInfo *info, GDrawStats *stats);
/* Begins specifying a new vertex buffer.
$:unique_id Unique value that identifies this texture, across potentially multiple flushes and re-creations of its $GDrawTexture handle in GDraw
$:vformat One of $gdraw_vformat, denoting the format of the vertex data submitted
$:return false if there was a problem, true if ok
*/
IDOC typedef rrbool RADLINK gdraw_make_vertex_buffer_more(GDraw_MakeVertexBuffer_ProcessingInfo *info);
/* Continues specifying a new vertex buffer.
$:info The same handle initially passed to $gdraw_make_vertex_buffer_begin
$:return True if specification can continue, false if specification must be aborted
*/
IDOC typedef GDrawVertexBuffer * RADLINK gdraw_make_vertex_buffer_end(GDraw_MakeVertexBuffer_ProcessingInfo *info, GDrawStats *stats);
/* Ends specification of a new vertex buffer.
$:info The same handle initially passed to $gdraw_make_texture_begin
$:return Handle for the newly created vertex buffer
*/
IDOC typedef void RADLINK gdraw_describe_vertex_buffer(GDrawVertexBuffer *buffer, GDraw_VertexBuffer_Description *desc);
/* Returns a description for a given GDrawVertexBuffer */
IDOC typedef rrbool RADLINK gdraw_try_to_lock_texture(GDrawTexture *tex, void *unique_id, GDrawStats *stats);
/* Tells GDraw that a $GDrawTexture is going to be referenced.
$:unique_id Must be the same value initially passed to $gdraw_make_texture_begin
*/
IDOC typedef rrbool RADLINK gdraw_try_to_lock_vertex_buffer(GDrawVertexBuffer *vb, void *unique_id, GDrawStats *stats);
/* Tells GDraw that a $GDrawVertexBuffer is going to be referenced.
$:unique_id Must be the same value initially passed to $gdraw_make_vertex_buffer_begin
*/
IDOC typedef void RADLINK gdraw_unlock_handles(GDrawStats *stats);
/* Indicates that the user of GDraw will not try to reference anything without locking it again.
Note that although a call to $gdraw_unlock_handles indicates that
all $GDrawTexture and $GDrawVertexBuffer handles that have had a
"unique_id" specified will no longer be referenced by the user of
GDraw, it does not affect those $GDrawTexture handles that were
created by $gdraw_start_texture_draw_buffer with a unique_id of 0.
*/
IDOC typedef void RADLINK gdraw_free_vertex_buffer(GDrawVertexBuffer *vb, void *unique_id, GDrawStats *stats);
/* Free a vertex buffer and invalidate the handle
$:unique_id Must be the same value initially passed to $gdraw_make_vertex_buffer_begin
*/
IDOC typedef void RADLINK gdraw_free_texture(GDrawTexture *t, void *unique_id, GDrawStats *stats);
/* Free a texture and invalidate the handle.
$:unique_id Must be the same value initially passed to $gdraw_make_texture_begin, or 0 for a texture created by $gdraw_end_texture_draw_buffer
*/
////////////////////////////////////////////////////////////
//
// Render targets
//
//idoc(parent,GDrawAPI_Targets)
IDOC typedef U32 gdraw_texturedrawbuffer_flags;
#define GDRAW_TEXTUREDRAWBUFFER_FLAGS_needs_color 1 IDOC // Tells GDraw that you will need the color channel when rendering a texture
#define GDRAW_TEXTUREDRAWBUFFER_FLAGS_needs_alpha 2 IDOC // Tells GDraw that you will need the alpha channel when rendering a texture
#define GDRAW_TEXTUREDRAWBUFFER_FLAGS_needs_stencil 4 IDOC // Tells GDraw that you will need the stencil channel when rendering a texture
#define GDRAW_TEXTUREDRAWBUFFER_FLAGS_needs_id 8 IDOC // Tells GDraw that you will need the id channel when rendering a texture
/* Flags that control rendering to a texture. */
IDOC typedef rrbool RADLINK gdraw_texture_draw_buffer_begin(gswf_recti *region, gdraw_texture_format format, gdraw_texturedrawbuffer_flags flags, void *unique_id, GDrawStats *stats);
/* Starts rendering all GDraw commands to a new texture.
Creates a rendertarget with destination alpha, initializes to all 0s and prepares to render into it
*/
IDOC typedef GDrawTexture * RADLINK gdraw_texture_draw_buffer_end(GDrawStats *stats);
/* Ends rendering GDraw commands to a texture, and returns the texture created.
You can get the size of the resulting texture with $gdraw_query_texture_size.
*/
////////////////////////////////////////////////////////////
//
// Masking
//
//idoc(parent,GDrawAPI_Masking)
IDOC typedef void RADLINK gdraw_draw_mask_begin(gswf_recti *region, S32 mask_bit, GDrawStats *stats);
/* Start a masking operation on the given region for the specified mask bit.
For most drivers, no special preparation is necessary to start masking, so this is a no-op.
*/
IDOC typedef void RADLINK gdraw_draw_mask_end(gswf_recti *region, S32 mask_bit, GDrawStats *stats);
/* End a masking operation on the given region for the specified mask bit.
For most drivers, no special preparation is necessary to end masking, so this is a no-op.
*/
////////////////////////////////////////////////////////////
//
// GDraw API Function table
//
//idoc(parent,GDrawAPI_Base)
IDOC struct GDrawFunctions
{
// queries
gdraw_get_info *GetInfo;
// drawing state
gdraw_set_view_size_and_world_scale * SetViewSizeAndWorldScale;
gdraw_render_tile_begin * RenderTileBegin;
gdraw_render_tile_end * RenderTileEnd;
gdraw_set_antialias_texture * SetAntialiasTexture;
// drawing
gdraw_clear_stencil_bits * ClearStencilBits;
gdraw_clear_id * ClearID;
gdraw_filter_quad * FilterQuad;
gdraw_draw_indexed_triangles * DrawIndexedTriangles;
gdraw_make_texture_begin * MakeTextureBegin;
gdraw_make_texture_more * MakeTextureMore;
gdraw_make_texture_end * MakeTextureEnd;
gdraw_make_vertex_buffer_begin * MakeVertexBufferBegin;
gdraw_make_vertex_buffer_more * MakeVertexBufferMore;
gdraw_make_vertex_buffer_end * MakeVertexBufferEnd;
gdraw_try_to_lock_texture * TryToLockTexture;
gdraw_try_to_lock_vertex_buffer * TryToLockVertexBuffer;
gdraw_unlock_handles * UnlockHandles;
gdraw_free_texture * FreeTexture;
gdraw_free_vertex_buffer * FreeVertexBuffer;
gdraw_update_texture_begin * UpdateTextureBegin;
gdraw_update_texture_rect * UpdateTextureRect;
gdraw_update_texture_end * UpdateTextureEnd;
// rendertargets
gdraw_texture_draw_buffer_begin * TextureDrawBufferBegin;
gdraw_texture_draw_buffer_end * TextureDrawBufferEnd;
gdraw_describe_texture * DescribeTexture;
gdraw_describe_vertex_buffer * DescribeVertexBuffer;
// new functions are always added at the end, so these have no structure
gdraw_set_texture_unique_id * SetTextureUniqueID;
gdraw_draw_mask_begin * DrawMaskBegin;
gdraw_draw_mask_end * DrawMaskEnd;
gdraw_rendering_begin * RenderingBegin;
gdraw_rendering_end * RenderingEnd;
gdraw_make_texture_from_resource * MakeTextureFromResource;
gdraw_free_texture_from_resource * FreeTextureFromResource;
gdraw_set_3d_transform * Set3DTransform;
};
/* The function interface called by Iggy to render graphics on all
platforms.
So that Iggy can integrate with the widest possible variety of
rendering scenarios, all of its renderer-specific drawing calls
go through this table of function pointers. This allows you
to dynamically configure which of RAD's supplied drawing layers
you wish to use, or to integrate it directly into your own
renderer by implementing your own versions of the drawing
functions Iggy requires.
*/
RADDEFEND
#endif

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,49 @@
#ifndef __RAD_INCLUDE_IGGYEXPRUNTIME_H__
#define __RAD_INCLUDE_IGGYEXPRUNTIME_H__
#include "rrCore.h"
#define IDOC
RADDEFSTART
#ifndef __RAD_HIGGYEXP_
#define __RAD_HIGGYEXP_
typedef void * HIGGYEXP;
#endif
//idoc(parent,IggyExpRuntime_API)
#define IGGYEXP_MIN_STORAGE 1024 IDOC
/* The minimum-sized block you must provide to $IggyExpCreate */
IDOC RADEXPFUNC HIGGYEXP RADEXPLINK IggyExpCreate(char *ip_address, S32 port, void *storage, S32 storage_size_in_bytes);
/* Opens a connection to $IggyExplorer and returns an $HIGGYEXP wrapping the connection.
$:ip_address The address of the machine running Iggy Explorer (can be numeric with dots, or textual, including "localhost")
$:port The port number on which Iggy Explorer is listening for a network connection (the default is 9190)
$:storage A small block of storage that needed to store the $HIGGYEXP, must be at least $IGGYEXP_MIN_STORAGE
$:storage_size_in_bytes The size of the block pointer to by <tt>storage</tt>
Returns a NULL HIGGYEXP if the IP address/hostname can't be resolved, or no Iggy Explorer
can be contacted at the specified address/port. Otherwise returns a non-NULL $HIGGYEXP
which you can pass to $IggyUseExplorer. */
IDOC RADEXPFUNC void RADEXPLINK IggyExpDestroy(HIGGYEXP p);
/* Closes and destroys a connection to $IggyExplorer */
IDOC RADEXPFUNC rrbool RADEXPLINK IggyExpCheckValidity(HIGGYEXP p);
/* Checks if the connection represented by an $HIGGYEXP is still valid, i.e.
still connected to $IggyExplorer.
Returns true if the connection is still valid; returns false if it is not valid.
This might happen if someone closes Iggy Explorer, Iggy Explorer crashes, or
the network fails. You can this to poll and detect these conditions and do
something in response, such as trying to open a new connection.
An invalid $HIGGYEXP must still be shutdown with $IggyExpDestroy. */
RADDEFEND
#endif//__RAD_INCLUDE_IGGYEXPRUNTIME_H__

View File

@@ -0,0 +1,89 @@
// $$COPYRIGHT$$
#ifndef __RAD_INCLUDE_IGGYPERFMON_H__
#define __RAD_INCLUDE_IGGYPERFMON_H__
#include "rrCore.h"
#define IDOC
RADDEFSTART
#ifndef __RAD_HIGGYPERFMON_
#define __RAD_HIGGYPERFMON_
typedef void * HIGGYPERFMON;
#endif
//idoc(parent,IggyPerfmon_API)
typedef void * RADLINK iggyperfmon_malloc(void *handle, U32 size);
typedef void RADLINK iggyperfmon_free(void *handle, void *ptr);
IDOC RADEXPFUNC HIGGYPERFMON RADEXPLINK IggyPerfmonCreate(iggyperfmon_malloc *perf_malloc, iggyperfmon_free *perf_free, void *callback_handle);
/* Creates an IggyPerfmon.
You must supply allocator functions. The amount allocated depends on the complexity
of the Iggys being profiled. */
typedef struct Iggy Iggy;
typedef struct GDrawFunctions GDrawFunctions;
IDOC typedef union {
U32 bits;
struct {
U32 dpad_up :1;
U32 dpad_down :1;
U32 dpad_left :1;
U32 dpad_right :1;
U32 button_up :1; // XBox Y, PS3 tri
U32 button_down :1; // XBox A, PS3 X
U32 button_left :1; // XBox X, PS3 square
U32 button_right :1; // XBox B, PS3 circle
U32 shoulder_left_hi :1; // LB/L1
U32 shoulder_right_hi :1; // RB/R1
U32 trigger_left_low :1;
U32 trigger_right_low :1;
} field;
} IggyPerfmonPad;
#define IggyPerfmonPadFromXInputStatePointer(pad, xis) \
(pad).bits = 0, \
(pad).field.dpad_up = 0 != ((xis)->Gamepad.wButtons & XINPUT_GAMEPAD_DPAD_UP), \
(pad).field.dpad_down = 0 != ((xis)->Gamepad.wButtons & XINPUT_GAMEPAD_DPAD_DOWN), \
(pad).field.dpad_left = 0 != ((xis)->Gamepad.wButtons & XINPUT_GAMEPAD_DPAD_LEFT), \
(pad).field.dpad_right = 0 != ((xis)->Gamepad.wButtons & XINPUT_GAMEPAD_DPAD_RIGHT), \
(pad).field.button_up = 0 != ((xis)->Gamepad.wButtons & XINPUT_GAMEPAD_Y), \
(pad).field.button_down = 0 != ((xis)->Gamepad.wButtons & XINPUT_GAMEPAD_A), \
(pad).field.button_left = 0 != ((xis)->Gamepad.wButtons & XINPUT_GAMEPAD_X), \
(pad).field.button_right = 0 != ((xis)->Gamepad.wButtons & XINPUT_GAMEPAD_B), \
(pad).field.shoulder_left_hi = 0 != ((xis)->Gamepad.wButtons & XINPUT_GAMEPAD_LEFT_SHOULDER), \
(pad).field.shoulder_right_hi = 0 != ((xis)->Gamepad.wButtons & XINPUT_GAMEPAD_RIGHT_SHOULDER), \
(pad).field.trigger_left_low = 0 != ((xis)->Gamepad.bLeftTrigger >= XINPUT_GAMEPAD_TRIGGER_THRESHOLD), \
(pad).field.trigger_right_low = 0 != ((xis)->Gamepad.bRightTrigger >= XINPUT_GAMEPAD_TRIGGER_THRESHOLD)
// All positions in window coords
IDOC RADEXPFUNC void RADEXPLINK IggyPerfmonTickAndDraw(HIGGYPERFMON p, GDrawFunctions* gdraw_funcs,
const IggyPerfmonPad* pad,
int pm_tile_ul_x, int pm_tile_ul_y, int pm_tile_lr_x, int pm_tile_lr_y);
/* Draw and tick an IggyPerfmon.
$:p A perfmon context previously created with IggyPerfmonCreate
$:gdraw_functions The same GDraw handle used for rendering Iggy
$:pad An abstracted gamepad state structure. iggyperfmon.h
includes an example that initializes the abstract gamepad from a 360 controller
as defined by XInput; this will work on both Windows and the Xbox 360.
$:pm_tile_ul_x The left coordinate of the rectangle where the perfmon display should be drawn
$:pm_tile_ul_y The top coordinate of the rectangle where the perfmon display should be drawn
$:pm_tile_lr_x The right coordinate of the rectangle where the perfmon display should be drawn
$:pm_tile_lr_y The bottom coordinate of the rectangle where the perfmon display should be drawn
You should only call this function when you want Iggy Perfmon to be visible.
See $IggyPerfmon for more information. */
IDOC RADEXPFUNC void RADEXPLINK IggyPerfmonDestroy(HIGGYPERFMON p, GDrawFunctions* iggy_draw);
/* Closes and destroys an IggyPerfmon */
RADDEFEND
#endif//__RAD_INCLUDE_IGGYPERFMON_H__

View File

@@ -0,0 +1,21 @@
#ifndef __RAD_INCLUDE_IGGYPERFMON_PS3_H__
#define __RAD_INCLUDE_IGGYPERFMON_PS3_H__
// You still need to include regular iggyperfmon.h first. This is just for convenience.
#define IggyPerfmonPadFromCellPadData(pad, paddata) \
(pad).bits = 0, \
(pad).field.dpad_up = 0 != ((paddata).button[CELL_PAD_BTN_OFFSET_DIGITAL1] & CELL_PAD_CTRL_UP), \
(pad).field.dpad_down = 0 != ((paddata).button[CELL_PAD_BTN_OFFSET_DIGITAL1] & CELL_PAD_CTRL_DOWN), \
(pad).field.dpad_left = 0 != ((paddata).button[CELL_PAD_BTN_OFFSET_DIGITAL1] & CELL_PAD_CTRL_LEFT), \
(pad).field.dpad_right = 0 != ((paddata).button[CELL_PAD_BTN_OFFSET_DIGITAL1] & CELL_PAD_CTRL_RIGHT), \
(pad).field.button_up = 0 != ((paddata).button[CELL_PAD_BTN_OFFSET_DIGITAL2] & CELL_PAD_CTRL_TRIANGLE), \
(pad).field.button_down = 0 != ((paddata).button[CELL_PAD_BTN_OFFSET_DIGITAL2] & CELL_PAD_CTRL_CROSS), \
(pad).field.button_left = 0 != ((paddata).button[CELL_PAD_BTN_OFFSET_DIGITAL2] & CELL_PAD_CTRL_SQUARE), \
(pad).field.button_right = 0 != ((paddata).button[CELL_PAD_BTN_OFFSET_DIGITAL2] & CELL_PAD_CTRL_CIRCLE), \
(pad).field.shoulder_left_hi = 0 != ((paddata).button[CELL_PAD_BTN_OFFSET_DIGITAL2] & CELL_PAD_CTRL_L1), \
(pad).field.shoulder_right_hi = 0 != ((paddata).button[CELL_PAD_BTN_OFFSET_DIGITAL2] & CELL_PAD_CTRL_R1), \
(pad).field.trigger_left_low = 0 != ((paddata).button[CELL_PAD_BTN_OFFSET_DIGITAL2] & CELL_PAD_CTRL_L2), \
(pad).field.trigger_right_low = 0 != ((paddata).button[CELL_PAD_BTN_OFFSET_DIGITAL2] & CELL_PAD_CTRL_R2)
#endif//__RAD_INCLUDE_IGGYPERFMON_PS3_H__

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,110 @@
#pragma once
#include "..\..\Common\Leaderboards\LeaderboardManager.h"
#include "..\..\..\Minecraft.World\x64headers\extraX64.h"
#include "PS3\Passphrase\ps3__np_conf.h"
using namespace std;
class PS3LeaderboardManager : public LeaderboardManager
{
protected:
enum EStatsState
{
eStatsState_Idle,
eStatsState_Getting,
eStatsState_Failed,
eStatsState_Ready,
eStatsState_Canceled,
//eStatsState_Writing,
eStatsState_Max
};
public:
PS3LeaderboardManager();
virtual ~PS3LeaderboardManager();
private:
unsigned short m_openSessions;
C4JThread *m_threadScoreboard;
bool m_running;
int32_t m_titleContext;
int m_transactionCtx;
//SceNpId m_myNpId;
static int scoreboardThreadEntry(LPVOID lpParam);
void scoreboardThreadInternal();
bool getScoreByIds();
bool getScoreByRange();
bool setScore();
queue<RegisterScore> m_views;
CRITICAL_SECTION m_csViewsLock;
EStatsState m_eStatsState; //State of the stats read
// EFilterMode m_eFilterMode;
ReadScore *m_scores;
unsigned int m_maxRank;
//SceNpScoreRankData *m_stats;
public:
virtual void Tick();
//Open a session
virtual bool OpenSession();
//Close a session
virtual void CloseSession();
//Delete a session
virtual void DeleteSession();
//Write the given stats
//This is called synchronously and will not free any memory allocated for views when it is done
virtual bool WriteStats(unsigned int viewCount, ViewIn views);
virtual bool ReadStats_Friends(LeaderboardReadListener *listener, int difficulty, EStatsType type, PlayerUID myUID, unsigned int startIndex, unsigned int readCount);
virtual bool ReadStats_MyScore(LeaderboardReadListener *listener, int difficulty, EStatsType type, PlayerUID myUID, unsigned int readCount);
virtual bool ReadStats_TopRank(LeaderboardReadListener *listener, int difficulty, EStatsType type, unsigned int startIndex, unsigned int readCount);
//Perform a flush of the stats
virtual void FlushStats();
//Cancel the current operation
virtual void CancelOperation();
//Is the leaderboard manager idle.
virtual bool isIdle();
private:
int getBoardId(int difficulty, EStatsType);
//LeaderboardManager::ReadScore *filterJustScorers(unsigned int &num, LeaderboardManager::ReadScore *friendsData);
SceNpScorePlayerRankData *addPadding(unsigned int num, SceNpScoreRankData *rankData);
void convertToOutput(unsigned int &num, ReadScore *out, SceNpScorePlayerRankData *rankData, SceNpScoreComment *comm);
void toBinary(void *out, SceNpScoreComment *in);
void fromBinary(SceNpScoreComment **out, void *in);
void toBase32(SceNpScoreComment *out, void *in);
void fromBase32(void *out, SceNpScoreComment *in);
void toSymbols(char *);
void fromSymbols(char *);
bool test_string(string);
void initReadScoreStruct(ReadScore &out, SceNpScoreRankData &);
void fillReadScoreStruct(ReadScore &out, SceNpScoreComment &comment);
static bool SortByRank(const ReadScore &lhs, const ReadScore &rhs);
};

View File

@@ -0,0 +1,131 @@
/*
base64.cpp and base64.h
Copyright (C) 2004-2008 Ren<65> Nyffenegger
This source code is provided 'as-is', without any express or implied
warranty. In no event will the author be held liable for any damages
arising from the use of this software.
Permission is granted to anyone to use this software for any purpose,
including commercial applications, and to alter it and redistribute it
freely, subject to the following restrictions:
1. The origin of this source code must not be misrepresented; you must not
claim that you wrote the original source code. If you use this source code
in a product, an acknowledgment in the product documentation would be
appreciated but is not required.
2. Altered source versions must be plainly marked as such, and must not be
misrepresented as being the original source code.
3. This notice may not be removed or altered from any source distribution.
Ren<65> Nyffenegger rene.nyffenegger@adp-gmbh.ch
*/
#include "stdafx.h"
#include "base64.h"
#include <iostream>
static const std::string base64_chars =
"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
"abcdefghijklmnopqrstuvwxyz"
"0123456789+/";
static inline bool is_base64(unsigned char c) {
return (isalnum(c) || (c == '+') || (c == '/'));
}
// 4J ADDED,
std::string base64_encode(std::string str)
{
return base64_encode( reinterpret_cast<const unsigned char*>(str.c_str()), str.length() );
}
std::string base64_encode(unsigned char const* bytes_to_encode, unsigned int in_len) {
std::string ret;
int i = 0;
int j = 0;
unsigned char char_array_3[3];
unsigned char char_array_4[4];
while (in_len--) {
char_array_3[i++] = *(bytes_to_encode++);
if (i == 3) {
char_array_4[0] = (char_array_3[0] & 0xfc) >> 2;
char_array_4[1] = ((char_array_3[0] & 0x03) << 4) + ((char_array_3[1] & 0xf0) >> 4);
char_array_4[2] = ((char_array_3[1] & 0x0f) << 2) + ((char_array_3[2] & 0xc0) >> 6);
char_array_4[3] = char_array_3[2] & 0x3f;
for(int ii = 0; (ii <4) ; ii++)
ret += base64_chars[char_array_4[ii]];
i = 0;
}
}
if (i)
{
for(j = i; j < 3; j++)
char_array_3[j] = '\0';
char_array_4[0] = (char_array_3[0] & 0xfc) >> 2;
char_array_4[1] = ((char_array_3[0] & 0x03) << 4) + ((char_array_3[1] & 0xf0) >> 4);
char_array_4[2] = ((char_array_3[1] & 0x0f) << 2) + ((char_array_3[2] & 0xc0) >> 6);
char_array_4[3] = char_array_3[2] & 0x3f;
for (j = 0; (j < i + 1); j++)
ret += base64_chars[char_array_4[j]];
while((i++ < 3))
ret += '=';
}
return ret;
}
std::string base64_decode(std::string const& encoded_string) {
int in_len = encoded_string.size();
int i = 0;
int j = 0;
int in_ = 0;
unsigned char char_array_4[4], char_array_3[3];
std::string ret;
while (in_len-- && ( encoded_string[in_] != '=') && is_base64(encoded_string[in_])) {
char_array_4[i++] = encoded_string[in_]; in_++;
if (i ==4) {
for (i = 0; i <4; i++)
char_array_4[i] = base64_chars.find(char_array_4[i]);
char_array_3[0] = (char_array_4[0] << 2) + ((char_array_4[1] & 0x30) >> 4);
char_array_3[1] = ((char_array_4[1] & 0xf) << 4) + ((char_array_4[2] & 0x3c) >> 2);
char_array_3[2] = ((char_array_4[2] & 0x3) << 6) + char_array_4[3];
for (i = 0; (i < 3); i++)
ret += char_array_3[i];
i = 0;
}
}
if (i) {
for (j = i; j <4; j++)
char_array_4[j] = 0;
for (j = 0; j <4; j++)
char_array_4[j] = base64_chars.find(char_array_4[j]);
char_array_3[0] = (char_array_4[0] << 2) + ((char_array_4[1] & 0x30) >> 4);
char_array_3[1] = ((char_array_4[1] & 0xf) << 4) + ((char_array_4[2] & 0x3c) >> 2);
char_array_3[2] = ((char_array_4[2] & 0x3) << 6) + char_array_4[3];
for (j = 0; (j < i - 1); j++) ret += char_array_3[j];
}
return ret;
}

View File

@@ -0,0 +1,7 @@
#pragma once
#include <string>
std::string base64_encode(std::string str);
std::string base64_encode(unsigned char const* , unsigned int len);
std::string base64_decode(std::string const& s);

Binary file not shown.

After

Width:  |  Height:  |  Size: 811 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 892 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 282 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 386 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 684 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 313 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 807 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 313 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 223 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 200 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 313 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 600 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 275 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 240 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 255 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 217 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 287 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 295 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 249 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 262 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 210 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 199 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 536 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 174 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 308 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 325 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 267 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 276 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 841 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 622 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 607 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 604 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 689 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 633 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 668 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 800 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 649 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 632 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 621 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 752 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 619 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 660 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 671 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 692 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 760 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 581 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 605 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 837 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 617 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 611 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 244 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 192 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 372 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 460 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 324 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 194 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 194 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Some files were not shown because too many files have changed in this diff Show More