summaryrefslogtreecommitdiffstats
path: root/src/core
diff options
context:
space:
mode:
Diffstat (limited to 'src/core')
-rw-r--r--src/core/Cam.cpp31
-rw-r--r--src/core/Camera.cpp18
-rw-r--r--src/core/Camera.h28
-rw-r--r--src/core/FileMgr.h1
-rw-r--r--src/core/FrontEndControls.cpp82
-rw-r--r--src/core/FrontEndControls.h44
-rw-r--r--src/core/Frontend.cpp3
-rw-r--r--src/core/Frontend.h33
-rw-r--r--src/core/FrontendTriggers.h1393
-rw-r--r--src/core/Frontend_PS2.cpp3034
-rw-r--r--src/core/Frontend_PS2.h244
-rw-r--r--src/core/Game.cpp82
-rw-r--r--src/core/Pad.cpp880
-rw-r--r--src/core/Pad.h23
-rw-r--r--src/core/PlayerInfo.cpp4
-rw-r--r--src/core/Timer.h1
-rw-r--r--src/core/common.h12
-rw-r--r--src/core/config.h26
-rw-r--r--src/core/main.cpp65
-rw-r--r--src/core/re3.cpp6
20 files changed, 5589 insertions, 421 deletions
diff --git a/src/core/Cam.cpp b/src/core/Cam.cpp
index 6f1ad310..df36270a 100644
--- a/src/core/Cam.cpp
+++ b/src/core/Cam.cpp
@@ -1366,7 +1366,7 @@ CCam::Process_FollowPedWithMouse(const CVector &CameraTarget, float TargetOrient
TargetCoors.z += fTranslateCamUp;
float AlphaOffset, BetaOffset;
- if(CPad::GetPad(0)->IsPlayerControlsDisabledBy(PLAYERCONTROL_DISABLED_20)){
+ if(CPad::GetPad(0)->IsPlayerControlsDisabledBy(PLAYERCONTROL_PLAYERINFO)){
CVector ToCam = Source - TargetCoors;
ToCam.Normalise();
if(ToCam.z < -0.9f)
@@ -1400,7 +1400,7 @@ CCam::Process_FollowPedWithMouse(const CVector &CameraTarget, float TargetOrient
if(TheCamera.GetFading() && TheCamera.GetFadingDirection() == FADE_IN && nFadeControlThreshhold < CDraw::FadeValue ||
CDraw::FadeValue > 200 ||
- CPad::GetPad(0)->IsPlayerControlsDisabledBy(PLAYERCONTROL_DISABLED_20)){
+ CPad::GetPad(0)->IsPlayerControlsDisabledBy(PLAYERCONTROL_PLAYERINFO)){
if(Alpha < fDefaultAlphaOrient-0.05f)
AlphaOffset = 0.05f;
else if(Alpha < fDefaultAlphaOrient)
@@ -1525,7 +1525,7 @@ CCam::Process_FollowPedWithMouse(const CVector &CameraTarget, float TargetOrient
if(((CPed*)CamTargetEntity)->CanStrafeOrMouseControl() && CDraw::FadeValue < 250 &&
(TheCamera.GetFadingDirection() != FADE_OUT || CDraw::FadeValue <= 100) &&
- !CPad::GetPad(0)->IsPlayerControlsDisabledBy(PLAYERCONTROL_DISABLED_20)){
+ !CPad::GetPad(0)->IsPlayerControlsDisabledBy(PLAYERCONTROL_PLAYERINFO)){
float Heading = Front.Heading();
((CPed*)TheCamera.pTargetEntity)->m_fRotationCur = Heading;
((CPed*)TheCamera.pTargetEntity)->m_fRotationDest = Heading;
@@ -1534,6 +1534,8 @@ CCam::Process_FollowPedWithMouse(const CVector &CameraTarget, float TargetOrient
}
}
+float fBillsBetaOffset; // made up name, actually in CCam
+
void
CCam::Process_BehindCar(const CVector &CameraTarget, float TargetOrientation, float, float)
{
@@ -1553,6 +1555,15 @@ CCam::Process_BehindCar(const CVector &CameraTarget, float TargetOrientation, fl
if(Length < 0.002f)
Length = 0.002f;
Beta = CGeneral::GetATanOfXY(TargetCoors.x - Source.x, TargetCoors.y - Source.y);
+#ifdef TOGGLEABLE_BETA_FEATURES
+ // This is completely made up but Bill's cam manipulates an angle before calling this
+ // and otherwise calculating Beta doesn't make much sense.
+ Beta += fBillsBetaOffset;
+ fBillsBetaOffset = 0.0f;
+ Dist.x = -Length*Cos(Beta);
+ Dist.y = -Length*Sin(Beta);
+ Source = TargetCoors + Dist;
+#endif
if(Length > CA_MAX_DISTANCE){
Source.x = TargetCoors.x + Dist.x/Length * CA_MAX_DISTANCE;
Source.y = TargetCoors.y + Dist.y/Length * CA_MAX_DISTANCE;
@@ -2815,7 +2826,7 @@ CCam::Process_1rstPersonPedOnPC(const CVector&, float TargetOrientation, float,
FOV /= (255.0f*CTimer::GetTimeStep() + 10000.0f) / 10000.0f;
}
- TheCamera.SetMotionBlur(180, 255, 180, 120, MBLUR_SNIPER);
+ TheCamera.SetMotionBlur(180, 255, 180, 120, MOTION_BLUR_SNIPER);
if(FOV > DefaultFOV)
FOV = DefaultFOV;
@@ -2939,7 +2950,7 @@ CCam::Process_Sniper(const CVector &CameraTarget, float TargetOrientation, float
FOVSpeed = 0.0f;
}
- TheCamera.SetMotionBlur(180, 255, 180, 120, MBLUR_SNIPER);
+ TheCamera.SetMotionBlur(180, 255, 180, 120, MOTION_BLUR_SNIPER);
if(FOV > DefaultFOV)
FOV = DefaultFOV;
@@ -3715,11 +3726,11 @@ CCam::Process_Fixed(const CVector &CameraTarget, float, float, float)
float f = BOAT_UNDERWATER_CAM_COLORMAG_LIMIT/WaterLum;
TheCamera.SetMotionBlur(CTimeCycle::GetWaterRed()*f,
CTimeCycle::GetWaterGreen()*f,
- CTimeCycle::GetWaterBlue()*f, BOAT_UNDERWATER_CAM_BLUR, MBLUR_NORMAL);
+ CTimeCycle::GetWaterBlue()*f, BOAT_UNDERWATER_CAM_BLUR, MOTION_BLUR_LIGHT_SCENE);
}else{
TheCamera.SetMotionBlur(CTimeCycle::GetWaterRed(),
CTimeCycle::GetWaterGreen(),
- CTimeCycle::GetWaterBlue(), BOAT_UNDERWATER_CAM_BLUR, MBLUR_NORMAL);
+ CTimeCycle::GetWaterBlue(), BOAT_UNDERWATER_CAM_BLUR, MOTION_BLUR_LIGHT_SCENE);
}
}
@@ -3938,7 +3949,11 @@ CCam::Process_Debug(const CVector&, float, float, float)
Source.y += 1.0f;
GetVectorsReadyForRW();
- CPad::GetPad(0)->DisablePlayerControls = PLAYERCONTROL_DISABLED_1;
+#ifdef FIX_BUGS
+ CPad::GetPad(0)->SetDisablePlayerControls(PLAYERCONTROL_CAMERA);
+#else
+ CPad::GetPad(0)->DisablePlayerControls = PLAYERCONTROL_CAMERA;
+#endif
if(CPad::GetPad(1)->GetLeftShockJustDown() && gbBigWhiteDebugLightSwitchedOn)
CShadows::StoreShadowToBeRendered(SHADOWTYPE_ADDITIVE, gpShadowExplosionTex, &Source,
diff --git a/src/core/Camera.cpp b/src/core/Camera.cpp
index e67c68d2..d558e3ad 100644
--- a/src/core/Camera.cpp
+++ b/src/core/Camera.cpp
@@ -549,15 +549,15 @@ CCamera::Process(void)
GetMatrix().GetPosition().y += shakeOffset * (((shakeRand & 0xF0) >> 4) - 7);
GetMatrix().GetPosition().z += shakeOffset * (((shakeRand & 0xF00) >> 8) - 7);
- if(shakeOffset > 0.0f && m_BlurType != MBLUR_SNIPER)
+ if(shakeOffset > 0.0f && m_BlurType != MOTION_BLUR_SNIPER)
SetMotionBlurAlpha(Min((int)(shakeStrength*255.0f) + 25, 150));
static bool bExtra1stPrsBlur = false;
if(Cams[ActiveCam].Mode == CCam::MODE_1STPERSON && FindPlayerVehicle() && FindPlayerVehicle()->GetUp().z < 0.2f){
- SetMotionBlur(230, 230, 230, 215, MBLUR_NORMAL);
+ SetMotionBlur(230, 230, 230, 215, MOTION_BLUR_LIGHT_SCENE);
bExtra1stPrsBlur = true;
}else if(bExtra1stPrsBlur){
- SetMotionBlur(CTimeCycle::GetBlurRed(), CTimeCycle::GetBlurGreen(), CTimeCycle::GetBlurBlue(), m_motionBlur, MBLUR_NORMAL);
+ SetMotionBlur(CTimeCycle::GetBlurRed(), CTimeCycle::GetBlurGreen(), CTimeCycle::GetBlurBlue(), m_motionBlur, MOTION_BLUR_LIGHT_SCENE);
bExtra1stPrsBlur = false;
}
@@ -694,7 +694,7 @@ CCamera::CamControl(void)
m_bFailedCullZoneTestPreviously = CCullZones::CamCloseInForPlayer();
if(m_bLookingAtPlayer){
- CPad::GetPad(0)->DisablePlayerControls &= ~PLAYERCONTROL_DISABLED_1;
+ CPad::GetPad(0)->DisablePlayerControls &= ~PLAYERCONTROL_CAMERA;
FindPlayerPed()->bIsVisible = true;
}
@@ -1029,7 +1029,7 @@ CCamera::CamControl(void)
m_bFirstPersonBeingUsed = false;
if(m_bFirstPersonBeingUsed){
ReqMode = CCam::MODE_1STPERSON;
- CPad::GetPad(0)->DisablePlayerControls |= PLAYERCONTROL_DISABLED_1;
+ CPad::GetPad(0)->DisablePlayerControls |= PLAYERCONTROL_CAMERA;
}
// Zoom value
@@ -1679,7 +1679,7 @@ CCamera::CamControl(void)
}else if(Cams[ActiveCam].Mode != m_iModeToGoTo){
m_bStartInterScript = true;
m_iTypeOfSwitch = JUMP_CUT;
- CPad::GetPad(0)->DisablePlayerControls &= ~PLAYERCONTROL_DISABLED_1;
+ CPad::GetPad(0)->DisablePlayerControls &= ~PLAYERCONTROL_CAMERA;
}
}
@@ -2548,7 +2548,7 @@ CCamera::DrawBordersForWideScreen(void)
bottom = SCREEN_HEIGHT;
}
- if(m_BlurType == MBLUR_NONE || m_BlurType == MBLUR_NORMAL)
+ if(m_BlurType == MOTION_BLUR_NONE || m_BlurType == MOTION_BLUR_LIGHT_SCENE)
SetMotionBlurAlpha(80);
// top border
@@ -3913,7 +3913,7 @@ CCamera::SetCameraDirectlyInFrontForFollowPed_CamOnAString(void)
void
CCamera::SetNewPlayerWeaponMode(int16 mode, int16 minZoom, int16 maxZoom)
{
- SetMotionBlur(CTimeCycle::GetBlurRed(), CTimeCycle::GetBlurGreen(), CTimeCycle::GetBlurBlue(), m_motionBlur, MBLUR_NORMAL);
+ SetMotionBlur(CTimeCycle::GetBlurRed(), CTimeCycle::GetBlurGreen(), CTimeCycle::GetBlurBlue(), m_motionBlur, MOTION_BLUR_LIGHT_SCENE);
PlayerWeaponMode.Mode = mode;
PlayerWeaponMode.MaxZoom = maxZoom;
PlayerWeaponMode.MinZoom = minZoom;
@@ -3923,7 +3923,7 @@ CCamera::SetNewPlayerWeaponMode(int16 mode, int16 minZoom, int16 maxZoom)
void
CCamera::ClearPlayerWeaponMode(void)
{
- SetMotionBlur(CTimeCycle::GetBlurRed(), CTimeCycle::GetBlurGreen(), CTimeCycle::GetBlurBlue(), m_motionBlur, MBLUR_NORMAL);
+ SetMotionBlur(CTimeCycle::GetBlurRed(), CTimeCycle::GetBlurGreen(), CTimeCycle::GetBlurBlue(), m_motionBlur, MOTION_BLUR_LIGHT_SCENE);
PlayerWeaponMode.Mode = 0;
PlayerWeaponMode.MaxZoom = 1;
PlayerWeaponMode.MinZoom = -1;
diff --git a/src/core/Camera.h b/src/core/Camera.h
index e0c11981..f9a138b9 100644
--- a/src/core/Camera.h
+++ b/src/core/Camera.h
@@ -186,7 +186,6 @@ public:
CPed *m_pLastPedLookedAt;// So interpolation works
bool m_bFirstPersonRunAboutActive;
-
CCam(void) { Init(); }
void Init(void);
void Process(void);
@@ -295,16 +294,16 @@ enum
enum
{
- MBLUR_NONE,
- MBLUR_SNIPER,
- MBLUR_NORMAL,
- MBLUR_INTRO1, // green camera
- MBLUR_INTRO2, // unused
- MBLUR_INTRO3, // bank scene
- MBLUR_INTRO4, // jail break scene
- MBLUR_INTRO5, // explosion
- MBLUR_INTRO6, // player shot
- MBLUR_UNUSED, // pinkish
+ MOTION_BLUR_NONE = 0,
+ MOTION_BLUR_SNIPER,
+ MOTION_BLUR_LIGHT_SCENE,
+ MOTION_BLUR_SECURITY_CAM,
+ MOTION_BLUR_CUT_SCENE,
+ MOTION_BLUR_INTRO,
+ MOTION_BLUR_INTRO2,
+ MOTION_BLUR_SNIPER_ZOOM,
+ MOTION_BLUR_INTRO3,
+ MOTION_BLUR_INTRO4,
};
enum
@@ -414,9 +413,12 @@ public:
float CarZoomValueSmooth;
float DistanceToWater;
+#ifndef PS2_CAM_TRANSITION
float FOVDuringInter;
+#endif
float LODDistMultiplier;
float GenerationDistMultiplier;
+#ifndef PS2_CAM_TRANSITION
float m_fAlphaSpeedAtStartInter;
float m_fAlphaWhenInterPol;
float m_fAlphaDuringInterPol;
@@ -427,6 +429,7 @@ public:
float m_fFOVSpeedAtStartInter;
float m_fStartingBetaForInterPol;
float m_fStartingAlphaForInterPol;
+#endif
float m_PedOrientForBehindOrInFront;
float m_CameraAverageSpeed;
float m_CameraSpeedSoFar;
@@ -489,9 +492,11 @@ public:
CVector m_vecUpWhenInterPol;
CVector m_vecClearGeometryVec;
CVector m_vecGameCamPos;
+#ifndef PS2_CAM_TRANSITION
CVector SourceDuringInter;
CVector TargetDuringInter;
CVector UpDuringInter;
+#endif
RwCamera *m_pRwCamera;
CEntity *pTargetEntity;
CCamPathSplines m_arrPathArray[MAX_NUM_OF_SPLINETYPES];
@@ -509,7 +514,6 @@ public:
CVector m_vecOldSourceForInter;
CVector m_vecOldFrontForInter;
CVector m_vecOldUpForInter;
-
float m_vecOldFOVForInter;
float m_fFLOATingFade;
float m_fFLOATingFadeMusic;
diff --git a/src/core/FileMgr.h b/src/core/FileMgr.h
index a6e4b6e5..1d0faf50 100644
--- a/src/core/FileMgr.h
+++ b/src/core/FileMgr.h
@@ -11,6 +11,7 @@ public:
static void SetDirMyDocuments(void);
static int LoadFile(const char *file, uint8 *buf, int unused, const char *mode);
static int OpenFile(const char *file, const char *mode);
+ static int OpenFile(const char *file) { return OpenFile(file, "rb"); }
static int OpenFileForWriting(const char *file);
static int Read(int fd, const char *buf, int len);
static int Write(int fd, const char *buf, int len);
diff --git a/src/core/FrontEndControls.cpp b/src/core/FrontEndControls.cpp
index 866be42f..68992e16 100644
--- a/src/core/FrontEndControls.cpp
+++ b/src/core/FrontEndControls.cpp
@@ -1,15 +1,13 @@
#include "common.h"
#include "main.h"
#include "Timer.h"
-#include "Pad.h"
-#include "ControllerConfig.h"
-#include "VisibilityPlugins.h"
#include "Sprite2d.h"
#include "Text.h"
#include "Font.h"
-#include "Frontend.h"
#include "FrontEndControls.h"
+#define X SCREEN_SCALE_X
+#define Y(x) SCREEN_SCALE_Y(float(x)*(float(DEFAULT_SCREEN_HEIGHT)/float(DEFAULT_SCREEN_HEIGHT_PAL)))
void
CPlaceableShText::Draw(float x, float y)
@@ -490,7 +488,7 @@ void
CMenuMultiChoiceTriggered::SelectCurrentOptionUnderCursor(void)
{
CMenuMultiChoice::SelectCurrentOptionUnderCursor();
- if(m_cursor != -1)
+ if(m_cursor != -1 && m_triggers[m_cursor] != nil )
m_triggers[m_cursor](this);
}
@@ -581,7 +579,10 @@ CMenuMultiChoicePictured::Draw(const CRGBA &optionHighlight, const CRGBA &titleH
for(i = 0; i < m_numOptions; i++)
if(i == m_cursor){
if(m_bHasSprite[i])
- m_sprites[i].Draw(CRGBA(255, 255, 255, 255), m_position.x+x, m_position.y+y);
+ {
+ uint8 color = Max(Max(optionHighlight.r, optionHighlight.g), optionHighlight.b);
+ m_sprites[i].Draw(CRGBA(color, color, color, optionHighlight.a), m_position.x+x, m_position.y+y);
+ }
}else{
if(m_bHasSprite[i]){
if(m_options[i].m_bSelected)
@@ -1210,10 +1211,10 @@ CMenuSlider::Draw(const CRGBA &optionHighlight, const CRGBA &titleHighlight, flo
{
if(m_bActive){
CRGBA selectionCol = m_colors[0];
- if(selectionCol.red == SELECTED_TEXT_COLOR_0.red &&
- selectionCol.green == SELECTED_TEXT_COLOR_0.green &&
- selectionCol.blue == SELECTED_TEXT_COLOR_0.blue &&
- selectionCol.alpha == SELECTED_TEXT_COLOR_0.alpha)
+ if(optionHighlight.red == SELECTED_TEXT_COLOR_0.red &&
+ optionHighlight.green == SELECTED_TEXT_COLOR_0.green &&
+ optionHighlight.blue == SELECTED_TEXT_COLOR_0.blue &&
+ optionHighlight.alpha == SELECTED_TEXT_COLOR_0.alpha)
selectionCol = m_colors[1];
if(m_style == 1){
@@ -1223,10 +1224,10 @@ CMenuSlider::Draw(const CRGBA &optionHighlight, const CRGBA &titleHighlight, flo
CVector2D boxPos = m_box.m_position + m_position + CVector2D(x,y);
if(m_box.m_bDropShadow)
CSprite2d::DrawRect(
- CRect(boxPos.x + m_box.m_shadowOffset.x,
- boxPos.y + m_box.m_shadowOffset.y,
- boxPos.x + m_box.m_shadowOffset.x + m_size[0].x,
- boxPos.y + m_box.m_shadowOffset.y + m_size[0].y),
+ CRect(boxPos.x + X(m_box.m_shadowOffset.x),
+ boxPos.y + Y(m_box.m_shadowOffset.y),
+ boxPos.x + X(m_box.m_shadowOffset.x) + m_size[0].x,
+ boxPos.y + Y(m_box.m_shadowOffset.y) + m_size[0].y),
shadowCol);
CSprite2d::DrawRect(
CRect(boxPos.x, boxPos.y,
@@ -1266,10 +1267,10 @@ CMenuSlider::DrawNormal(float x, float y)
CVector2D boxPos = m_box.m_position + m_position + CVector2D(x,y);
if(m_box.m_bDropShadow)
CSprite2d::DrawRect(
- CRect(boxPos.x + m_box.m_shadowOffset.x,
- boxPos.y + m_box.m_shadowOffset.y,
- boxPos.x + m_box.m_shadowOffset.x + m_size[0].x,
- boxPos.y + m_box.m_shadowOffset.y + m_size[0].y),
+ CRect(boxPos.x + X(m_box.m_shadowOffset.x),
+ boxPos.y + Y(m_box.m_shadowOffset.y),
+ boxPos.x + X(m_box.m_shadowOffset.x) + m_size[0].x,
+ boxPos.y + Y(m_box.m_shadowOffset.y) + m_size[0].y),
shadowCol);
CSprite2d::DrawRect(
CRect(boxPos.x, boxPos.y,
@@ -1312,10 +1313,10 @@ CMenuSlider::DrawHighlighted(const CRGBA &titleHighlight, float x, float y)
CVector2D boxPos = m_box.m_position + m_position + CVector2D(x,y);
if(m_box.m_bDropShadow)
CSprite2d::DrawRect(
- CRect(boxPos.x + m_box.m_shadowOffset.x,
- boxPos.y + m_box.m_shadowOffset.y,
- boxPos.x + m_box.m_shadowOffset.x + m_size[0].x,
- boxPos.y + m_box.m_shadowOffset.y + m_size[0].y),
+ CRect(boxPos.x + X(m_box.m_shadowOffset.x),
+ boxPos.y + Y(m_box.m_shadowOffset.y),
+ boxPos.x + X(m_box.m_shadowOffset.x) + m_size[0].x,
+ boxPos.y + Y(m_box.m_shadowOffset.y) + m_size[0].y),
shadowCol);
CSprite2d::DrawRect(
CRect(boxPos.x, boxPos.y,
@@ -1345,20 +1346,20 @@ void
CMenuSlider::DrawTicks(const CVector2D &position, const CVector2D &size, float heightRight, float level, const CRGBA &leftCol, const CRGBA &selCol, const CRGBA &rightCol, bool bShadow, const CVector2D &shadowOffset, const CRGBA &shadowColor)
{
int i;
- int numTicks = size.x / 8.0f;
+ int numTicks = size.x / X(8.0f);
float dy = heightRight - size.y;
float stepy = dy / numTicks;
int left = level*numTicks;
int drewSelection = 0;
for(i = 0; i < numTicks; i++){
- CRect rect(position.x + 8.0f*i, position.y + dy - stepy*i,
- position.x + 8.0f*i + 4.0f, position.y + dy + size.y);
+ CRect rect(position.x + X(8.0f)*i, position.y + dy - stepy*i,
+ position.x + X(8.0f)*i + X(4.0f), position.y + dy + size.y);
if(bShadow){
CRect shadowRect = rect;
- shadowRect.left += shadowOffset.x;
- shadowRect.right += shadowOffset.x;
- shadowRect.top += shadowOffset.y;
- shadowRect.bottom += shadowOffset.y;
+ shadowRect.left += X(shadowOffset.x);
+ shadowRect.right += X(shadowOffset.x);
+ shadowRect.top += Y(shadowOffset.y);
+ shadowRect.bottom += Y(shadowOffset.y);
CSprite2d::DrawRect(shadowRect, shadowColor);
}
if(i < left)
@@ -1375,19 +1376,19 @@ void
CMenuSlider::DrawTicks(const CVector2D &position, const CVector2D &size, float heightRight, float level, const CRGBA &leftCol, const CRGBA &rightCol, bool bShadow, const CVector2D &shadowOffset, const CRGBA &shadowColor)
{
int i;
- int numTicks = size.x / 8.0f;
+ int numTicks = size.x / X(8.0f);
float dy = heightRight - size.y;
float stepy = dy / numTicks;
int left = level*numTicks;
for(i = 0; i < numTicks; i++){
- CRect rect(position.x + 8.0f*i, position.y + dy - stepy*i,
- position.x + 8.0f*i + 4.0f, position.y + dy + size.y);
+ CRect rect(position.x + X(8.0f)*i, position.y + dy - stepy*i,
+ position.x + X(8.0f)*i + X(4.0f), position.y + dy + size.y);
if(bShadow){
CRect shadowRect = rect;
- shadowRect.left += shadowOffset.x;
- shadowRect.right += shadowOffset.x;
- shadowRect.top += shadowOffset.y;
- shadowRect.bottom += shadowOffset.y;
+ shadowRect.left += X(shadowOffset.x);
+ shadowRect.right += X(shadowOffset.x);
+ shadowRect.top += Y(shadowOffset.y);
+ shadowRect.bottom += Y(shadowOffset.y);
CSprite2d::DrawRect(shadowRect, shadowColor);
}
if(i < left)
@@ -1553,7 +1554,7 @@ CMenuLineLister::Draw(const CRGBA &optionHighlight, const CRGBA &titleHighlight,
for(; i < n; i++){
CVector2D linePos = m_linesLeft[i].m_position;
- if(linePos.y+m_position.y - (m_scrollPosition+m_position.y) < 64.0f)
+ if(linePos.y+m_position.y - (m_scrollPosition+m_position.y) < Y(64.0f))
m_lineFade[i] = -4.0f*Abs(m_scrollSpeed);
else
m_lineFade[i] = 4.0f*Abs(m_scrollSpeed);
@@ -1652,7 +1653,12 @@ CMenuPage::ActiveMenuTwoState_SelectNextPosition(void)
if(sel == 1)
m_pCurrentControl->SelectCurrentOptionUnderCursor();
else if(sel == 0){
- m_pCurrentControl->GoNext();
+ if ( m_pCurrentControl )
+ {
+ if ( !m_pCurrentControl->GoNext() )
+ m_pCurrentControl->GoFirst();
+ }
+
m_pCurrentControl->SelectCurrentOptionUnderCursor();
}
}
diff --git a/src/core/FrontEndControls.h b/src/core/FrontEndControls.h
index 5b6f95bb..68dab90b 100644
--- a/src/core/FrontEndControls.h
+++ b/src/core/FrontEndControls.h
@@ -8,6 +8,41 @@ enum {
NUM_PAGE_WIDGETS = 10,
};
+class CTriggerCaller
+{
+ bool bHasTrigger;
+ void *pTrigger;
+ void (*pFunc)(void *);
+ int field_C;
+public:
+
+ CTriggerCaller() : bHasTrigger(false), pFunc(nil)
+ {}
+
+ void SetTrigger(void *func, void *trigger)
+ {
+ if ( !bHasTrigger )
+ {
+ pFunc = (void (*)(void *))func;
+ pTrigger = trigger;
+ bHasTrigger = true;
+ }
+ }
+
+ void CallTrigger(void)
+ {
+ if ( bHasTrigger && pFunc != nil )
+ pFunc(pTrigger);
+
+ bHasTrigger = false;
+ pFunc = nil;
+ }
+
+ bool CanCall()
+ {
+ return bHasTrigger;
+ }
+};
class CPlaceableText
{
@@ -17,7 +52,7 @@ public:
wchar *m_text;
CPlaceableText(void)
- : m_position(0.0f, 0.0f), m_color(255, 255, 255, 255) {}
+ : m_position(0.0f, 0.0f), m_color(255, 255, 255, 255), m_text(nil) {}
void SetPosition(float x, float y) { m_position.x = x; m_position.y = y; }
void SetColor(const CRGBA &color) { m_color = color; }
CRGBA GetColor(void) { return m_color; }
@@ -553,11 +588,14 @@ public:
static wchar Buf16[8];
CMenuSlider(void)
- : m_value(0), m_bDrawPercentage(false), m_bActive(false), m_style(0) {}
+ : m_value(0), m_bDrawPercentage(false), m_bActive(false), m_style(0)
+ {
+ AddTickBox(0.0f, 0.0f, 100.0f, 10.0f, 10.0f); //todo
+ }
void SetColors(const CRGBA &title, const CRGBA &percentage, const CRGBA &left, const CRGBA &right);
void DrawTicks(const CVector2D &position, const CVector2D &size, float heightRight, float level, const CRGBA &leftCol, const CRGBA &selCol, const CRGBA &rightCol, bool bShadow, const CVector2D &shadowOffset, const CRGBA &shadowColor);
- void DrawTicks(const CVector2D &position, const CVector2D &size, float heightRight, float level, const CRGBA &leftCol, const CRGBA &rightCol, bool bShadow, const CVector2D &shadowOffset, const CRGBA &shadowColor);
+ void DrawTicks(const CVector2D &position, const CVector2D &size, float heightRight, float level, const CRGBA &leftCol, const CRGBA &rightCol, bool bShadow, const CVector2D &shadowOffset, const CRGBA &shadowColor);
void AddTickBox(float positionX, float positionY, float width, float heigthLeft, float heightRight);
void AddTitle(wchar *text, float positionX, float positionY);
diff --git a/src/core/Frontend.cpp b/src/core/Frontend.cpp
index d6411c77..19e8e8f3 100644
--- a/src/core/Frontend.cpp
+++ b/src/core/Frontend.cpp
@@ -5,6 +5,7 @@
#define WITHWINDOWS
#include "common.h"
+#ifndef PS2_MENU
#include "crossplatform.h"
#include "platform.h"
#include "Frontend.h"
@@ -5580,3 +5581,5 @@ uint8 CMenuManager::GetNumberOfMenuOptions()
#undef GetBackJustUp
#undef GetBackJustDown
+
+#endif \ No newline at end of file
diff --git a/src/core/Frontend.h b/src/core/Frontend.h
index afce0acd..4655c971 100644
--- a/src/core/Frontend.h
+++ b/src/core/Frontend.h
@@ -1,4 +1,7 @@
#pragma once
+#ifdef PS2_MENU
+#include "Frontend_PS2.h"
+#else
#include "Sprite2d.h"
@@ -94,20 +97,6 @@
#define CONTSETUP_BACK_BOTTOM 122.0f
#define CONTSETUP_BACK_HEIGHT 25.0f
-enum eLanguages
-{
- LANGUAGE_AMERICAN,
- LANGUAGE_FRENCH,
- LANGUAGE_GERMAN,
- LANGUAGE_ITALIAN,
- LANGUAGE_SPANISH,
-#ifdef MORE_LANGUAGES
- LANGUAGE_POLISH,
- LANGUAGE_RUSSIAN,
- LANGUAGE_JAPANESE,
-#endif
-};
-
enum
{
MENUALIGN_LEFT = 1,
@@ -591,6 +580,19 @@ public:
int32 m_nSelectedScreenMode;
#endif
+ enum LANGUAGE
+ {
+ LANGUAGE_AMERICAN,
+ LANGUAGE_FRENCH,
+ LANGUAGE_GERMAN,
+ LANGUAGE_ITALIAN,
+ LANGUAGE_SPANISH,
+#ifdef MORE_LANGUAGES
+ LANGUAGE_POLISH,
+ LANGUAGE_RUSSIAN,
+ LANGUAGE_JAPANESE,
+#endif
+ };
bool GetIsMenuActive() {return !!m_bMenuActive;}
static uint8 m_PrefsStereoMono;
@@ -666,3 +668,6 @@ VALIDATE_SIZE(CMenuManager, 0x688);
#endif
extern CMenuManager FrontEndMenuManager;
+
+
+#endif \ No newline at end of file
diff --git a/src/core/FrontendTriggers.h b/src/core/FrontendTriggers.h
new file mode 100644
index 00000000..b2bde09c
--- /dev/null
+++ b/src/core/FrontendTriggers.h
@@ -0,0 +1,1393 @@
+CTriggerCaller MemCardAccessTriggerCaller;
+
+void InitialiseTextsInMenuControllerInCar(CMenuPictureAndText *widget, CMenuManager::CONTRCONFIG cont);
+void InitialiseTextsInMenuControllerOnFoot(CMenuPictureAndText *widget, CMenuManager::CONTRCONFIG cont);
+void TriggerSave_BackToMainMenu(CMenuMultiChoiceTriggered *widget);
+void TriggerSave_BackToMainMenuTwoLines(CMenuMultiChoiceTwoLinesTriggered *widget);
+void TriggerSave_LoadGameLoadGameSelect(CMenuMultiChoiceTwoLinesTriggered *widget);
+void TriggerSave_DeleteGameDeleteGameSelect(CMenuMultiChoiceTwoLinesTriggered *widget);
+void TriggerSaveZone_BackToMainMenuTwoLines(CMenuMultiChoiceTwoLinesTriggered *widget);
+void TriggerSaveZone_BackToMainMenuTwoLines(CMenuMultiChoiceTwoLinesTriggered *widget);
+void TriggerSaveZone_SaveSlots(CMenuMultiChoiceTwoLinesTriggered *widget);
+
+void
+DisplayWarningControllerMsg()
+{
+ if ( CPad::bDisplayNoControllerMessage )
+ {
+ CSprite2d::DrawRect(CRect(X(20.0f), Y(140.0f), X(620.0f), Y(328.0)), CRGBA(64, 16, 16, 224)); // CRect(20.0f, 160.0f, 620.0f, 374.857117f)
+
+ CFont::SetFontStyle(FONT_BANK);
+ CFont::SetBackgroundOff();
+ CFont::SetScale(X(0.84f), Y(1.26f)); // 1.440000
+ CFont::SetPropOn();
+ CFont::SetCentreOff();
+ CFont::SetJustifyOn();
+ CFont::SetRightJustifyOff();
+ CFont::SetBackGroundOnlyTextOn();
+ CFont::SetWrapx(SCRW-X(40.0f)); // 600.0f
+
+ CPlaceableShText text;
+ text.SetPosition(X(60.0f), Y(180.0f), false); // 205.714294
+ text.SetColor(CRGBA(152, 152, 152, 255));
+ text.m_text = TheText.Get("NOCONTE"); // Please re-insert the analog controller (DUALSHOCK@) or analog controller (DUALSHOCK@2) in controller port 1 to continue
+ text.SetShadows(true, TEXT_SHADOW_COLOR, SHADOW_VECTOR*2.0f);
+ text.SetAlpha(255);
+ text.DrawShWrap(0.0f, 0.0f, X(600.0f+SHADOW_VECTOR.x), YF(600.0f)); //TODO check
+
+ CFont::DrawFonts();
+ }
+ else if ( CPad::bObsoleteControllerMessage )
+ {
+ CSprite2d::DrawRect(CRect(X(20.0f), Y(140.0f), X(620.0f), Y(328.0)), CRGBA(64, 16, 16, 224)); // CRect(20.0f, 160.0f, 620.0f, 374.857117f)
+ CFont::SetFontStyle(FONT_BANK);
+ CFont::SetBackgroundOff();
+ CFont::SetScale(X(0.84f), Y(1.26f)); // 1.440000
+ CFont::SetPropOn();
+ CFont::SetCentreOff();
+ CFont::SetJustifyOn();
+ CFont::SetRightJustifyOff();
+ CFont::SetBackGroundOnlyTextOn();
+ CFont::SetWrapx(SCRW-X(40.0f)); // 600.0f
+
+ CPlaceableShText text;
+ text.SetPosition(X(60.0f), Y(180.0f), false); // 205.714294
+ text.SetColor(CRGBA(152, 152, 152, 255));
+ text.m_text = TheText.Get("WRCONTE"); // Please re-insert the analog controller (DUALSHOCK@) or analog controller (DUALSHOCK@2) in controller port 1 to continue
+ text.SetShadows(true, TEXT_SHADOW_COLOR, SHADOW_VECTOR*2.0f);
+ text.SetAlpha(255);
+ text.DrawShWrap(0.0f, 0.0f, X(600.0f+SHADOW_VECTOR.x), YF(600.0f)); //TODO check
+
+ CFont::DrawFonts();
+ }
+
+}
+
+void
+TriggerMCSUM_Yes(CMenuMultiChoiceTriggered *widget)
+{
+ if ( widget )
+ bMemoryCardStartUpMenus_ExitNow = true;
+}
+
+int32 nStatLinesIndex;
+wchar aStatLines[50+1][50];
+wchar *PrintStatLine(char const *text, void *stat, unsigned char itsFloat, void *stat2)
+{
+ if (text && stat && nStatLinesIndex < 50)
+ {
+ char line [64];
+ wchar uline[64];
+
+ memset(line, 0, sizeof(line));
+ memset(uline, 0, sizeof(uline));
+
+ if (stat2)
+ {
+ if ( itsFloat )
+ sprintf(line, " %.2f %s %.2f", *(float*)stat, UnicodeToAscii(TheText.Get("FEST_OO")), *(float*)stat2);
+ else
+ sprintf(line, " %d %s %d", *(int32*)stat, UnicodeToAscii(TheText.Get("FEST_OO")), *(int32*)stat2);
+ }
+ else
+ {
+ if (itsFloat)
+ sprintf(line, " %.2f", *(float*)stat);
+ else
+ sprintf(line, " %d", *(int32*)stat);
+ }
+
+ wchar *pStatLine = aStatLines[nStatLinesIndex++];
+
+ AsciiToUnicode(line, uline);
+ UnicodeStrcpy(pStatLine, uline);
+
+ return pStatLine;
+ }
+
+ return nil;
+}
+
+void
+DisplayMemoryCardAccessMsg(wchar *msg, CRGBA const &color)
+{
+ CSprite2d::DrawRect(CRect(X(70.0f), Y(100.0f), X(570.0f), Y(270.0f)), color);
+
+ CFont::SetFontStyle(FONT_BANK);
+ CFont::SetBackgroundOff();
+ CFont::SetScale(X(MEMCARD_ACCESS_MSG_SIZE_X), Y(MEMCARD_ACCESS_MSG_SIZE_Y));
+ CFont::SetPropOn();
+ CFont::SetJustifyOn();
+ CFont::SetRightJustifyOff();
+ CFont::SetBackGroundOnlyTextOn();
+ CFont::SetWrapx(SCRW-X(90.0f)); // 550.0f
+ CFont::SetCentreOn();
+ CFont::SetCentreSize(SCRW-X(180.0f)); // 460.0f
+
+ CPlaceableShText text;
+
+ text.SetPosition(X(320.0f), Y(120.0f), false); // 137.142868
+ text.SetColor(CRGBA(200, 200, 200, 255));
+ text.m_text = msg;
+
+ text.SetShadows(true, TEXT_SHADOW_COLOR, SHADOW_VECTOR);
+ text.SetAlpha(255);
+ text.Draw(0.0f, 0.0f);
+
+ CFont::DrawFonts();
+ DoRWStuffEndOfFrame();
+}
+
+void
+FillMenuWithMemCardFileListing(CMenuMultiChoiceTwoLinesTriggered *widget, void (*cancelTrigger)(CMenuMultiChoiceTwoLinesTriggered *), void (*selectTrigger)(CMenuMultiChoiceTwoLinesTriggered *), wchar *text, int32 y, int32 height, int32 offset)
+{
+ if ( widget )
+ {
+ int32 selected = 0;
+ if ( bMemoryCardSpecialZone )
+ selected = widget->m_cursor != -1 ? widget->m_cursor : 0;
+
+ widget->DeactivateMenu(); // TODO check
+ widget->m_numOptions = 0;
+ widget->AddTitle(nil, 0.0f, 0.0f, 0);
+
+ TheMemoryCard.PopulateSlotInfo(CARD_ONE);
+
+ if ( TheMemoryCard.GetError() == CMemoryCard::NO_ERR_SUCCESS)
+ {
+ widget->AddOption(TheText.Get("FES_CAN"), 0.0f, YF(y), cancelTrigger, 0, 0);
+
+ FrontEndMenuManager.field_3C = 0;
+
+ y += offset;
+
+ char buff[100];
+
+ for ( int32 i = 0; i < CMemoryCard::MAX_SLOTS; i++ )
+ {
+ // SAVE FILE
+ sprintf(buff, "%s %d ", UnicodeToAscii(TheText.Get("FES_SLO")), i+1);
+ AsciiToUnicode(buff, MemoryCard_FileNames[i]);
+
+ wchar *datetime = nil;
+
+ switch ( TheMemoryCard.GetInfoOnSpecificSlot(i) )
+ {
+ case CMemoryCard::SLOT_CORRUPTED:
+ {
+ UnicodeStrcat(MemoryCard_FileNames[i], TheText.Get("FES_ISC")); // IS CORRUPTED
+ datetime = TheMemoryCard.GetDateAndTimeOfSavedGame(i);
+ break;
+ }
+ case CMemoryCard::SLOT_PRESENT:
+ {
+ if ( TheMemoryCard.GetNameOfSavedGame(i) != nil )
+ {
+ UnicodeStrcpy(MemoryCard_FileNames[i], TheMemoryCard.GetNameOfSavedGame(i));
+ datetime = TheMemoryCard.GetDateAndTimeOfSavedGame(i);
+ }
+ else
+ {
+ UnicodeStrcpy(MemoryCard_FileNames[i], TheText.Get("FES_SAG")); // PRESENT
+ datetime = TheMemoryCard.GetDateAndTimeOfSavedGame(i);
+ }
+ break;
+ }
+ case CMemoryCard::SLOT_NOTPRESENT:
+ {
+ UnicodeStrcat(MemoryCard_FileNames[i], TheText.Get("FES_ISF"));
+ datetime = TheMemoryCard.GetDateAndTimeOfSavedGame(i);
+ break;
+ }
+ }
+
+ widget->AddOption(MemoryCard_FileNames[i], 0.0f, YF(y), datetime, 0.0f, YF(float(y)+(0.44f*height)), selectTrigger, 0, 0);
+ y += height;
+ }
+ }
+ else
+ {
+ if ( !gErrorSampleTriggered )
+ {
+ DMAudio.PlayFrontEndSound(SOUND_FRONTEND_FAIL, 0);
+ gErrorSampleTriggered = true;
+ }
+
+ // Cancel
+ widget->AddOption(TheText.Get("FES_CAN"), 0.0f, YF(y+(height*2)), cancelTrigger, 0, 0);
+
+ FrontEndMenuManager.field_3C = 1;
+
+ y += height;
+
+ TheMemoryCard.PopulateErrorMessage();
+
+ // Error Reading Memory Card (PS2) in MEMORY CARD slot 1 please check and try again.
+ if ( TheMemoryCard.GetErrorMessage())
+ widget->AddTitle(TheMemoryCard.GetErrorMessage(), 0.0f, YF(y), 0);
+ else
+ widget->AddTitle(TheText.Get("FES_GME"), 0.0f, YF(y), 0);
+ }
+
+ widget->SetMenuSelection(0);
+ widget->ActivateMenu(1);
+
+ if ( bMemoryCardSpecialZone )
+ {
+ widget->GoFirst();
+
+ for ( int32 i = 0; i < selected; i++ )
+ widget->GoNext();
+ }
+ }
+}
+
+void
+TriggerSaveZone_FormatFailedOK(CMenuMultiChoiceTriggered *widget)
+{
+ if ( widget )
+ pActiveMenuPage = &MenuPageSaveZone_SaveGame;
+}
+
+void
+TriggerSaveZone_BackToMainMenu(CMenuMultiChoiceTriggered *widget)
+{
+ bMemoryCardSpecialZone = false;
+ bIgnoreTriangleButton = false;
+ pActiveMenuPage = &MenuPageSaveZone_SaveGame;
+}
+
+void
+TriggerSaveZone_QuitMenu(CMenuMultiChoiceTriggered *widget)
+{
+ if ( widget )
+ {
+ FrontEndMenuManager.m_bMenuActive = false;
+ FrontEndMenuManager.m_bInSaveZone = false;
+ CTimer::EndUserPause();
+ }
+}
+
+void
+TriggerSaveZone_FormatCard(CMenuMultiChoiceTriggered *widget)
+{
+ if ( widget )
+ {
+ FillMenuWithMemCardFileListing(&MenuSaveZoneSSL_1, TriggerSaveZone_BackToMainMenuTwoLines, TriggerSaveZone_SaveSlots, nil, 0, 34, 22);
+
+ if ( TheMemoryCard.GetError() == CMemoryCard::NO_ERR_SUCCESS)
+ {
+ MenuSaveZoneMSG_1.m_numTexts = 0;
+ MenuSaveZoneMSG_1.AddText(TheText.Get("FES_AFO"), X(-80.0f), 0.0f, TEXT_COLOR, 0);
+
+ MenuSaveZoneMSG_2.m_numOptions = 0;
+ MenuSaveZoneMSG_2.AddOption(TheText.Get("FESZ_OK"), X(100.0f), YF(5.0f), TriggerSaveZone_BackToMainMenu, 0, 0);
+
+ MenuPageSaveZone_Message.ActivatePage();
+ pActiveMenuPage = &MenuPageSaveZone_Message;
+ }
+ else if ( TheMemoryCard.GetError() != CMemoryCard::ERR_NOFORMAT)
+ {
+ MenuSaveZoneMSG_1.m_numTexts = 0;
+ MenuSaveZoneMSG_1.AddText(TheMemoryCard.GetErrorMessage(), X(-80.0f), 0.0f, TEXT_COLOR, 0);
+
+ MenuSaveZoneMSG_2.m_numOptions = 0;
+ MenuSaveZoneMSG_2.AddOption(TheText.Get("FESZ_OK"), X(100.0f), YF(15.0f), TriggerSaveZone_BackToMainMenu, 0, 0);
+
+ MenuPageSaveZone_Message.ActivatePage();
+ pActiveMenuPage = &MenuPageSaveZone_Message;
+ }
+ else
+ {
+ if ( !MemCardAccessTriggerCaller.CanCall() )
+ MemCardAccessTriggerCaller.SetTrigger(TriggerSaveZone_FormatCard, widget);
+ else
+ {
+ // Formatting Memory Card (PS2) in MEMORY CARD slot 1. Please do not remove the Memory Card (PS2), reset or switch off the console.
+ DisplayMemoryCardAccessMsg(TheText.Get("FEFD_WR"), CRGBA(200, 50, 50, 192));
+ TheMemoryCard.FormatCard(CARD_ONE);
+
+ if ( TheMemoryCard.GetError() == CMemoryCard::NO_ERR_SUCCESS )
+ pActiveMenuPage = &MenuPageSaveZone_SaveGame;
+ else
+ {
+ TheMemoryCard.PopulateErrorMessage();
+
+ wchar *error = TheText.Get("FESZ_FF"); // Format Failed! Check Memory Card (PS2) in MEMORY CARD slot 1 and please try again.
+
+ // missing switch
+
+ if ( !error ) error = TheText.Get("FES_GME"); // Error Reading Memory Card (PS2) in MEMORY CARD slot 1 please check and try again.
+
+ MenuSaveZoneMSG_1.m_numTexts = 0;
+ MenuSaveZoneMSG_1.AddText(error, X(-80.0f), 0.0f, TEXT_COLOR, 0);
+
+ MenuSaveZoneMSG_2.m_numOptions = 0;
+ MenuSaveZoneMSG_2.AddOption(TheText.Get("FESZ_OK"), X(100.0f), YF(20.0f), TriggerSaveZone_BackToMainMenu, 0, 0);
+
+ MenuPageSaveZone_Message.ActivatePage();
+ pActiveMenuPage = &MenuPageSaveZone_Message;
+ }
+
+ if ( TheMemoryCard.GetError() == CMemoryCard::NO_ERR_SUCCESS )
+ {
+ FillMenuWithMemCardFileListing(&MenuSaveZoneSSL_1, TriggerSaveZone_BackToMainMenuTwoLines, TriggerSaveZone_SaveSlots, nil, 0, 34, 22);
+ pActiveMenuPage = &MenuPageSaveZone_SaveSlots;
+ bMemoryCardSpecialZone = true;
+ bIgnoreTriangleButton = true;
+ pActiveMenuPage->ActivatePage();
+ }
+ else
+ {
+ TheMemoryCard.PopulateErrorMessage();
+
+ // Format Failed! Check Memory Card (PS2) in MEMORY CARD slot 1 and please try again.
+ wchar *error = TheText.Get("FESZ_FF");
+
+ switch ( TheMemoryCard.GetError() )
+ {
+ case CMemoryCard::ERR_WRITEFULLDEVICE:
+ case CMemoryCard::ERR_DIRFULLDEVICE:
+ case CMemoryCard::ERR_SAVEFAILED:
+ {
+ error = TheMemoryCard.GetErrorMessage();
+ break;
+ }
+ }
+
+ // Error Reading Memory Card (PS2) in MEMORY CARD slot 1 please check and try again.
+ if ( !error ) error = TheText.Get("FES_GME");
+
+ MenuSaveZoneMSG_1.m_numTexts = 0;
+ MenuSaveZoneMSG_1.AddText(error, X(-80.0f), 0.0f, TEXT_COLOR, 0);
+
+ MenuSaveZoneMSG_2.m_numOptions = 0;
+ MenuSaveZoneMSG_2.AddOption(TheText.Get("FESZ_OK"), X(100.0f), YF(20.0f), TriggerSaveZone_BackToMainMenu, 0, 0);
+
+ MenuPageSaveZone_Message.ActivatePage();
+ pActiveMenuPage = &MenuPageSaveZone_Message;
+ }
+ }
+ }
+ }
+}
+
+void
+TriggerSaveZone_FormatCardSelect(CMenuMultiChoiceTriggered *widget)
+{
+ if ( widget )
+ {
+ FillMenuWithMemCardFileListing(&MenuSaveZoneSSL_1, TriggerSaveZone_BackToMainMenuTwoLines, TriggerSaveZone_SaveSlots, nil, 0, 34, 22);
+
+ if ( TheMemoryCard.GetError() == CMemoryCard::NO_ERR_SUCCESS )
+ {
+ // This Memory Card (PS2) is already formatted.
+ MenuSaveZoneMSG_1.m_numTexts = 0;
+ MenuSaveZoneMSG_1.AddText(TheText.Get("FES_AFO"), X(-80.0f), 0.0f, TEXT_COLOR, 0);
+
+ MenuSaveZoneMSG_2.m_numOptions = 0;
+ MenuSaveZoneMSG_2.AddOption(TheText.Get("FESZ_OK"), X(100.0f), YF(5.0f), TriggerSaveZone_BackToMainMenu, 0, 0);
+
+ MenuPageSaveZone_Message.ActivatePage();
+ pActiveMenuPage = &MenuPageSaveZone_Message;
+ }
+ else if ( TheMemoryCard.GetError() != CMemoryCard::ERR_NOFORMAT )
+ {
+ MenuSaveZoneMSG_1.m_numTexts = 0;
+ MenuSaveZoneMSG_1.AddText(TheMemoryCard.GetErrorMessage(), X(-80.0f), 0.0f, TEXT_COLOR, 0);
+
+ MenuSaveZoneMSG_2.m_numOptions = 0;
+ MenuSaveZoneMSG_2.AddOption(TheText.Get("FESZ_OK"), X(100.0f), YF(15.0f), TriggerSaveZone_BackToMainMenu, 0, 0);
+
+ MenuPageSaveZone_Message.ActivatePage();
+ pActiveMenuPage = &MenuPageSaveZone_Message;
+ }
+ else
+ {
+ // Are you sure you wish to format the Memory Card (PS2) in MEMORY CARD slot 1?
+ MenuSaveZoneQYN_1.m_numTexts = 0;
+ MenuSaveZoneQYN_1.AddText(TheText.Get("FESZ_QF"), X(-40.0f), 0.0f, TEXT_COLOR, 0);
+
+ MenuSaveZoneQYN_2.m_numOptions = 0;
+ MenuSaveZoneQYN_2.AddOption(TheText.Get("FEM_NO"), X(80.0f), YF(20.0f), TriggerSaveZone_BackToMainMenu, 0, 0);
+ MenuSaveZoneQYN_2.AddOption(TheText.Get("FEM_YES"), X(80.0f), 0.0f, TriggerSaveZone_FormatCard, 0, 0);
+
+ MenuPageSaveZone_QuestionYesNo.ActivatePage();
+ pActiveMenuPage = &MenuPageSaveZone_QuestionYesNo;
+ }
+ }
+}
+
+void
+TriggerSaveZone_DeleteSaveGame(CMenuMultiChoiceTriggered *widget)
+{
+ if ( widget )
+ {
+ bMemoryCardSpecialZone = false;
+ bIgnoreTriangleButton = false;
+
+ if ( !MemCardAccessTriggerCaller.CanCall() )
+ MemCardAccessTriggerCaller.SetTrigger(TriggerSaveZone_DeleteSaveGame, widget);
+ else
+ {
+ // Overwriting data. Please do not remove the Memory Card (PS2) in MEMORY CARD slot 1, reset or switch off the console.
+ DisplayMemoryCardAccessMsg(TheText.Get("FESZ_OW"), CRGBA(200, 50, 50, 192));
+
+ TheMemoryCard.DeleteSlot(MemoryCardSlotSelected);
+
+ if ( TheMemoryCard.GetError() != CMemoryCard::NO_ERR_SUCCESS )
+ {
+ TheMemoryCard.PopulateErrorMessage();
+
+ wchar *error = TheText.Get("FES_DEE"); // Deleting Failed! Check Memory Card (PS2) in MEMORY CARD slot 1 and please try again.
+
+ // switch missing
+
+ if ( !error ) error = TheText.Get("FES_GME"); // Error Reading Memory Card (PS2) in MEMORY CARD slot 1 please check and try again.
+
+ MenuSaveZoneMSG_1.m_numTexts = 0;
+ MenuSaveZoneMSG_1.AddText(error, X(-80.0f), 0.0f, TEXT_COLOR, 0);
+
+ MenuSaveZoneMSG_2.m_numOptions = 0;
+ MenuSaveZoneMSG_2.AddOption(TheText.Get("FESZ_OK"), X(100.0f), YF(20.0f), TriggerSaveZone_BackToMainMenu, 0, 0);
+
+ MenuPageSaveZone_Message.ActivatePage();
+ pActiveMenuPage = &MenuPageSaveZone_Message;
+ }
+ else
+ {
+ TheMemoryCard.SaveSlot(MemoryCardSlotSelected);
+
+ if ( TheMemoryCard.GetError() == CMemoryCard::NO_ERR_SUCCESS )
+ {
+ // Game saved successfully!
+ MenuSaveZoneMSG_1.m_numTexts = 0;
+ MenuSaveZoneMSG_1.AddText(TheText.Get("FESZ_L1"), X(-20.0f), YF(10.0f), TEXT_COLOR, 0);
+
+ MenuSaveZoneMSG_2.m_numOptions = 0;
+ MenuSaveZoneMSG_2.AddOption(TheText.Get("FESZ_OK"), X(110.0f), 0.0f, TriggerSaveZone_QuitMenu, 0, 0);
+
+ MenuPageSaveZone_Message.ActivatePage();
+ pActiveMenuPage = &MenuPageSaveZone_Message;
+ }
+ else
+ {
+ TheMemoryCard.PopulateErrorMessage();
+
+ wchar *error = TheText.Get("FESZ_SR"); // Save Failed! Check Memory Card (PS2) in MEMORY CARD slot 1 and please try again.
+
+ switch ( TheMemoryCard.GetError() )
+ {
+ case CMemoryCard::ERR_WRITEFULLDEVICE:
+ case CMemoryCard::ERR_DIRFULLDEVICE:
+ case CMemoryCard::ERR_SAVEFAILED:
+ {
+ error = TheMemoryCard.GetErrorMessage();
+ break;
+ }
+ }
+
+ if ( !error ) error = TheText.Get("FES_GME"); // Error Reading Memory Card (PS2) in MEMORY CARD slot 1 please check and try again.
+
+ MenuSaveZoneMSG_1.m_numTexts = 0;
+ MenuSaveZoneMSG_1.AddText(error, X(-80.0f), 0.0f, TEXT_COLOR, 0);
+
+ MenuSaveZoneMSG_2.m_numOptions = 0;
+ MenuSaveZoneMSG_2.AddOption(TheText.Get("FESZ_OK"), X(120.0f), YF(30.0f), TriggerSaveZone_BackToMainMenu, 0, 0);
+
+ MenuPageSaveZone_Message.ActivatePage();
+ pActiveMenuPage = &MenuPageSaveZone_Message;
+ }
+ }
+ }
+ }
+}
+
+void
+TriggerSaveZone_SaveGame(CMenuMultiChoiceTriggered *widget)
+{
+ if ( widget )
+ {
+ bMemoryCardSpecialZone = false;
+ bIgnoreTriangleButton = false;
+ if ( !MemCardAccessTriggerCaller.CanCall() )
+ MemCardAccessTriggerCaller.SetTrigger(TriggerSaveZone_SaveGame, widget);
+ else
+ {
+ DisplayMemoryCardAccessMsg(TheText.Get("FESZ_WR"), CRGBA(200, 50, 50, 192));
+
+ TheMemoryCard.SaveSlot(MemoryCardSlotSelected);
+
+ if ( TheMemoryCard.GetError() == CMemoryCard::NO_ERR_SUCCESS )
+ {
+ // Game saved successfully!
+ MenuSaveZoneMSG_1.m_numTexts = 0;
+ MenuSaveZoneMSG_1.AddText(TheText.Get("FESZ_L1"), X(-20.0f), YF(10.0f), TEXT_COLOR, 0);
+
+ MenuSaveZoneMSG_2.m_numOptions = 0;
+ MenuSaveZoneMSG_2.AddOption(TheText.Get("FESZ_OK"), X(110.0f), 0.0f, TriggerSaveZone_QuitMenu, 0, 0);
+
+ MenuPageSaveZone_Message.ActivatePage();
+ pActiveMenuPage = &MenuPageSaveZone_Message;
+ }
+ else
+ {
+ TheMemoryCard.PopulateErrorMessage();
+
+ wchar *error = TheText.Get("FESZ_SR"); // Save Failed! Check Memory Card (PS2) in MEMORY CARD slot 1 and please try again.
+
+ switch ( TheMemoryCard.GetError() )
+ {
+ case CMemoryCard::ERR_WRITEFULLDEVICE:
+ case CMemoryCard::ERR_DIRFULLDEVICE:
+ case CMemoryCard::ERR_SAVEFAILED:
+ {
+ error = TheMemoryCard.GetErrorMessage();
+ break;
+ }
+ }
+
+ if ( !error ) error = TheText.Get("FES_GME"); // Error Reading Memory Card (PS2) in MEMORY CARD slot 1 please check and try again.
+
+ MenuSaveZoneMSG_1.m_numTexts = 0;
+ MenuSaveZoneMSG_1.AddText(error, X(-80.0f), 0.0f, TEXT_COLOR, 0);
+
+ MenuSaveZoneMSG_2.m_numOptions = 0;
+ MenuSaveZoneMSG_2.AddOption(TheText.Get("FESZ_OK"), X(120.0f), YF(30.0f), TriggerSaveZone_BackToMainMenu, 0, 0);
+
+ MenuPageSaveZone_Message.ActivatePage();
+ pActiveMenuPage = &MenuPageSaveZone_Message;
+ }
+ }
+ }
+}
+
+void
+TriggerSaveZone_SaveSlots(CMenuMultiChoiceTwoLinesTriggered *widget)
+{
+ if ( widget )
+ {
+ if ( widget->GetMenuSelection() > 0 )
+ {
+ MemoryCardSlotSelected = widget->GetMenuSelection() - 1;
+
+ switch ( TheMemoryCard.GetInfoOnSpecificSlot(MemoryCardSlotSelected) )
+ {
+ case CMemoryCard::SLOT_PRESENT:
+ case CMemoryCard::SLOT_CORRUPTED:
+ {
+ // Proceed with overwriting this saved game?
+ MenuSaveZoneQYN_1.m_numTexts = 0;
+ MenuSaveZoneQYN_1.AddText(TheText.Get("FESZ_QO"), X(-40.0f), 0.0f, TEXT_COLOR, 0);
+
+ MenuSaveZoneQYN_2.m_numOptions = 0;
+ MenuSaveZoneQYN_2.AddOption(TheText.Get("FEM_NO"), X(80.0f), YF(20.0f), TriggerSaveZone_BackToMainMenu, 0, 0);
+ MenuSaveZoneQYN_2.AddOption(TheText.Get("FEM_YES"), X(80.0f), 0.0f, TriggerSaveZone_DeleteSaveGame, 0, 0);
+
+ MenuPageSaveZone_QuestionYesNo.ActivatePage();
+ bMemoryCardSpecialZone = false;
+ pActiveMenuPage = &MenuPageSaveZone_QuestionYesNo;
+ break;
+ }
+
+ case CMemoryCard::SLOT_NOTPRESENT:
+ {
+ // PROCEED WITH SAVE ?
+ MenuSaveZoneQYN_1.m_numTexts = 0;
+ MenuSaveZoneQYN_1.AddText(TheText.Get("FESZ_QS"), X(-40.0f), 0.0f, TEXT_COLOR, 0);
+
+ MenuSaveZoneQYN_2.m_numOptions = 0;
+ MenuSaveZoneQYN_2.AddOption(TheText.Get("FEM_NO"), X(80.0f), YF(20.0f), TriggerSaveZone_BackToMainMenu, 0, 0);
+ MenuSaveZoneQYN_2.AddOption(TheText.Get("FEM_YES"), X(80.0f), 0.0f, TriggerSaveZone_SaveGame, 0, 0);
+
+ MenuPageSaveZone_QuestionYesNo.ActivatePage();
+ bMemoryCardSpecialZone = false;
+ pActiveMenuPage = &MenuPageSaveZone_QuestionYesNo;
+ break;
+ }
+ }
+ }
+ }
+}
+
+void
+TriggerSaveZone_SaveGameSelect(CMenuMultiChoiceTriggered *widget)
+{
+ if ( widget )
+ {
+ FillMenuWithMemCardFileListing(&MenuSaveZoneSSL_1, TriggerSaveZone_BackToMainMenuTwoLines, TriggerSaveZone_SaveSlots, nil, 0, 34, 22);
+
+ if ( TheMemoryCard.GetError() == CMemoryCard::ERR_NOFORMAT)
+ {
+ gErrorSampleTriggered = false;
+ pActiveMenuPage = &MenuPageSaveZone_FormatCard;
+ }
+ else
+ {
+ bMemoryCardSpecialZone = true;
+ bIgnoreTriangleButton = true;
+ pActiveMenuPage = &MenuPageSaveZone_SaveSlots;
+ }
+
+ pActiveMenuPage->ActivatePage();
+ }
+}
+
+void
+TriggerControls_Vibrations(CMenuOnOffTriggered *widget)
+{
+ if ( widget )
+ {
+ CMenuManager::m_PrefsUseVibration = widget->GetMenuSelection();
+ if ( CMenuManager::m_PrefsUseVibration )
+ {
+ CPad::GetPad(0)->StartShake(300, 150);
+ TimeToStopPadShaking = CTimer::GetTimeInMillisecondsPauseMode() + 500;
+ }
+ }
+}
+
+void
+TriggerControls_ContrDisplay(CMenuMultiChoiceTriggeredAlways *widget)
+{
+ if ( widget )
+ {
+ int32 conf = MenuControls_1.GetMenuSelection();
+ int32 i = MenuControls_2.GetMenuSelection();
+ if ( i == 1 )
+ {
+ if ( conf == CMenuManager::CONFIG_2 )
+ MenuPage_Controls.m_controls[0] = &MenuControls_7;
+ else
+ MenuPage_Controls.m_controls[0] = &MenuControls_4;
+ }
+ else if ( i == 0 )
+ {
+ if ( conf == CMenuManager::CONFIG_2 )
+ MenuPage_Controls.m_controls[0] = &MenuControls_6;
+ else
+ MenuPage_Controls.m_controls[0] = &MenuControls_3;
+ }
+ }
+}
+
+void
+TriggerControls_DrawHNContrConfig(CMenuMultiChoiceTriggeredAlways *widget)
+{
+ if ( widget )
+ {
+ int32 conf = widget->GetMenuSelection();
+
+ InitialiseTextsInMenuControllerOnFoot(&MenuControls_3, (CMenuManager::CONTRCONFIG)conf);
+ InitialiseTextsInMenuControllerInCar (&MenuControls_4, (CMenuManager::CONTRCONFIG)conf);
+
+ int32 i = MenuControls_2.GetMenuSelection();
+ if ( i == 1 )
+ {
+ if ( conf == CMenuManager::CONFIG_2 )
+ MenuPage_Controls.m_controls[0] = &MenuControls_7;
+ else
+ MenuPage_Controls.m_controls[0] = &MenuControls_4;
+ }
+ else if ( i == 0 )
+ {
+ if ( conf == CMenuManager::CONFIG_2 )
+ MenuPage_Controls.m_controls[0] = &MenuControls_6;
+ else
+ MenuPage_Controls.m_controls[0] = &MenuControls_3;
+ }
+ }
+}
+
+void
+TriggerControls_DrawContrConfig(CMenuMultiChoiceTriggeredAlways *widget)
+{
+ if ( widget )
+ {
+ int32 conf = widget->GetMenuSelection();
+ if ( widget->m_cursor != -1 )
+ conf = widget->m_cursor;
+
+ InitialiseTextsInMenuControllerOnFoot(&MenuControls_3, (CMenuManager::CONTRCONFIG)conf);
+ InitialiseTextsInMenuControllerInCar(&MenuControls_4, (CMenuManager::CONTRCONFIG)conf);
+
+ int32 i = MenuControls_2.GetMenuSelection();
+ if ( i == 1 )
+ {
+ if ( conf == CMenuManager::CONFIG_2 )
+ MenuPage_Controls.m_controls[0] = &MenuControls_7;
+ else
+ MenuPage_Controls.m_controls[0] = &MenuControls_4;
+ }
+ else if ( i == 0 )
+ {
+ if ( conf == CMenuManager::CONFIG_2 )
+ MenuPage_Controls.m_controls[0] = &MenuControls_6;
+ else
+ MenuPage_Controls.m_controls[0] = &MenuControls_3;
+ }
+ }
+}
+
+void
+TriggerControls_ContrConfig(CMenuMultiChoiceTriggered *widget)
+{
+ if ( widget )
+ {
+ int32 conf = widget->GetMenuSelection();
+
+ InitialiseTextsInMenuControllerOnFoot(&MenuControls_3, (CMenuManager::CONTRCONFIG)conf);
+ InitialiseTextsInMenuControllerInCar(&MenuControls_4, (CMenuManager::CONTRCONFIG)conf);
+
+ int32 i = MenuControls_2.GetMenuSelection();
+ if ( i == 1 )
+ {
+ if ( conf == CMenuManager::CONFIG_2 )
+ MenuPage_Controls.m_controls[0] = &MenuControls_7;
+ else
+ MenuPage_Controls.m_controls[0] = &MenuControls_4;
+ }
+ else if ( i == 0 )
+ {
+ if ( conf == CMenuManager::CONFIG_2 )
+ MenuPage_Controls.m_controls[0] = &MenuControls_6;
+ else
+ MenuPage_Controls.m_controls[0] = &MenuControls_3;
+ }
+ }
+}
+
+void
+TriggerLanguage_Language(CMenuMultiChoiceTriggered *widget)
+{
+ if ( widget )
+ {
+ if ( CMenuManager::m_PrefsLanguage != widget->GetMenuSelection() )
+ {
+ CMenuManager::m_PrefsLanguage = widget->GetMenuSelection();
+ FrontEndMenuManager.m_bInitialised = false;
+ bFrontEnd_ReloadObrTxtGxt = true;
+ }
+ }
+}
+
+void
+TriggerAudio_RadioStation(CMenuMultiChoicePicturedTriggered *widget)
+{
+ if ( widget )
+ {
+ if ( CMenuManager::m_PrefsRadioStation != widget->GetMenuSelection() )
+ {
+ CMenuManager::m_PrefsRadioStation = widget->GetMenuSelection();
+ DMAudio.PlayFrontEndTrack(CMenuManager::m_PrefsRadioStation, 1);
+ DMAudio.SetRadioInCar(CMenuManager::m_PrefsRadioStation);
+ }
+ }
+}
+
+void
+TriggerAudio_StereoMono(CMenuMultiChoiceTriggered *widget)
+{
+ if ( widget )
+ {
+ if (widget->GetMenuSelection() == 1)
+ {
+ DMAudio.SetMonoMode(true);
+ DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MONO, 0);
+ }
+ else
+ {
+ DMAudio.SetMonoMode(false);
+ DMAudio.PlayFrontEndSound(SOUND_FRONTEND_STEREO, 0);
+ }
+ }
+}
+
+void
+TriggerAudio_MusicVolumeAlways(CMenuSliderTriggered *widget)
+{
+ ;
+}
+
+void
+TriggerAudio_SfxVolumeAlways(CMenuSliderTriggered *widget)
+{
+ if ( widget )
+ {
+ static bool bTriggerTest = false;
+
+ CMenuManager::m_PrefsSfxVolume = float(widget->GetMenuSelection()) / 100.0f * 127.0f + 0.5f;
+
+ if ( CMenuManager::m_PrefsSfxVolume == 102 && !CPad::GetPad(0)->GetDPadLeft()&& !CPad::GetPad(0)->GetDPadRight() )
+ {
+ if ( bTriggerTest )
+ {
+ DMAudio.PlayFrontEndSound(SOUND_FRONTEND_AUDIO_TEST, 0);
+ bTriggerTest = false;
+ }
+ }
+ else
+ bTriggerTest = true;
+
+ FrontEndMenuManager.SetSoundLevelsForMusicMenu();
+ }
+}
+
+void
+TriggerAudio_MusicVolume(CMenuSliderTriggered *widget)
+{
+ if ( widget )
+ {
+ CMenuManager::m_PrefsMusicVolume = float(widget->GetMenuSelection()) / 100.0f * 127.0f + 0.5f;
+ FrontEndMenuManager.SetSoundLevelsForMusicMenu();
+ }
+}
+
+void
+TriggerAudio_SfxVolume(CMenuSliderTriggered *widget)
+{
+ ;
+}
+
+void
+TriggerSave_NewGameNewGame(CMenuMultiChoiceTriggered *widget)
+{
+ FrontEndMenuManager.m_bWantToRestart = true;
+ FrontEndMenuManager.m_bMenuActive = false;
+ FrontEndMenuManager.m_bInSaveZone = false;
+ bIgnoreTriangleButton = false;
+
+ CTimer::EndUserPause();
+
+ FrontEndMenuManager.AnaliseMenuContents();
+
+ DMAudio.SetEffectsFadeVol(0);
+ DMAudio.SetMusicFadeVol(0);
+ DMAudio.ResetTimers(CTimer::GetTimeInMilliseconds());
+}
+
+void
+TriggerSave_NewGameSelectYes(CMenuMultiChoiceTriggered *widget)
+{
+ // Are you sure you want to start a new game? All progress since the last save game will be lost. Proceed?
+ MenuSaveZoneQYN_1.m_numTexts = 0;
+ MenuSaveZoneQYN_1.AddText(TheText.Get("FESZ_QR"), X(-100.0f), 0.0f, TEXT_COLOR, 0);
+
+ MenuSaveZoneQYN_2.m_numOptions = 0;
+ MenuSaveZoneQYN_2.AddOption(TheText.Get("FEM_NO"), X(80.0f), YF(30.0f), TriggerSave_BackToMainMenu, 0, 0);
+ MenuSaveZoneQYN_2.AddOption(TheText.Get("FEM_YES"), X(80.0f), YF(10.0f), TriggerSave_NewGameNewGame, 0, 0);
+
+ MenuPageSaveZone_QuestionYesNo.ActivatePage();
+ pMenuSave = &MenuPageSaveZone_QuestionYesNo;
+ bIgnoreTriangleButton = true;
+}
+
+void
+TriggerSave_DeleteGameDeleteGame(CMenuMultiChoiceTriggered *widget)
+{
+ if ( widget )
+ {
+ bMemoryCardSpecialZone = false;
+ bIgnoreTriangleButton = false;
+
+ if ( !MemCardAccessTriggerCaller.CanCall() )
+ MemCardAccessTriggerCaller.SetTrigger(TriggerSave_DeleteGameDeleteGame, widget);
+ else
+ {
+ // Deleting data. Please do not remove the Memory Card (PS2) in MEMORY CARD slot 1, reset or switch off the console.
+ DisplayMemoryCardAccessMsg(TheText.Get("FEDL_WR"), CRGBA(200, 50, 50, 192));
+
+ TheMemoryCard.DeleteSlot(MemoryCardSlotSelected);
+
+ if ( TheMemoryCard.GetError() != CMemoryCard::NO_ERR_SUCCESS)
+ {
+ // Deleting Failed! Check Memory Card (PS2) in MEMORY CARD slot 1 and please try again.
+ MenuSaveZoneMSG_1.m_numTexts = 0;
+ MenuSaveZoneMSG_1.AddText(TheText.Get("FES_DEE"), X(-80.0f), YF(20.0f), TEXT_COLOR, 0);
+
+ MenuSaveZoneMSG_2.m_numOptions = 0;
+ MenuSaveZoneMSG_2.AddOption(TheText.Get("FESZ_OK"), X(100.0f), YF(15.0f), TriggerSave_BackToMainMenu, 0, 0);
+
+ MenuPageSaveZone_Message.ActivatePage();
+ pMenuSave = &MenuPageSaveZone_Message;
+
+ bMemoryCardSpecialZone = false;
+ bIgnoreTriangleButton = true;
+ }
+ else
+ {
+ FillMenuWithMemCardFileListing(&MenuSaveLG_2, TriggerSave_BackToMainMenuTwoLines, TriggerSave_LoadGameLoadGameSelect, nil, 0, 34, 22);
+ FillMenuWithMemCardFileListing(&MenuSaveDG_2, TriggerSave_BackToMainMenuTwoLines, TriggerSave_DeleteGameDeleteGameSelect, nil, 0, 34, 22);
+
+ pMenuSave = &MenuPage_SaveBasic;
+ pMenuSave->ActivatePage();
+ }
+ }
+ }
+}
+
+void
+TriggerSave_DeleteGameDeleteGameSelect(CMenuMultiChoiceTwoLinesTriggered *widget)
+{
+ if ( widget )
+ {
+ if ( widget->GetMenuSelection() > 0 )
+ {
+ MemoryCardSlotSelected = widget->GetMenuSelection() - 1;
+
+ switch ( TheMemoryCard.GetInfoOnSpecificSlot(MemoryCardSlotSelected) )
+ {
+ case CMemoryCard::SLOT_NOTPRESENT:
+ {
+ break;
+ }
+ case CMemoryCard::SLOT_CORRUPTED:
+ case CMemoryCard::SLOT_PRESENT:
+ {
+ // Proceed with deleting this saved game?
+ MenuSaveZoneQYN_1.m_numTexts = 0;
+ MenuSaveZoneQYN_1.AddText(TheText.Get("FESZ_QD"), X(-40.0f), 0.0f, TEXT_COLOR, 0);
+
+ MenuSaveZoneQYN_2.m_numOptions = 0;
+ MenuSaveZoneQYN_2.AddOption(TheText.Get("FEM_NO"), X(80.0f), YF(20.0f), TriggerSave_BackToMainMenu, 0, 0);
+ MenuSaveZoneQYN_2.AddOption(TheText.Get("FEM_YES"), X(80.0f), 0.0f, TriggerSave_DeleteGameDeleteGame, 0, 0);
+
+ MenuPageSaveZone_QuestionYesNo.ActivatePage();
+ pMenuSave = &MenuPageSaveZone_QuestionYesNo;
+ bMemoryCardSpecialZone = false;
+ break;
+ }
+ }
+ }
+ }
+}
+
+void
+TriggerSave_DeleteGameSelect(CMenuMultiChoiceTriggered *widget)
+{
+ FillMenuWithMemCardFileListing(&MenuSaveDG_2, TriggerSave_BackToMainMenuTwoLines, TriggerSave_DeleteGameDeleteGameSelect, nil, 0, 34, 22);
+ FillMenuWithMemCardFileListing(&MenuSaveLG_2, TriggerSave_BackToMainMenuTwoLines, TriggerSave_LoadGameLoadGameSelect, nil, 0, 34, 22);
+
+ pMenuSave = &MenuPage_SaveDeleteGame;
+ pMenuSave->ActivatePage();
+
+ gErrorSampleTriggered = false;
+ bMemoryCardSpecialZone = true;
+ bIgnoreTriangleButton = true;
+}
+
+void
+TriggerSave_LoadGameLoadGame(CMenuMultiChoiceTriggered *widget)
+{
+ if ( widget )
+ {
+ bMemoryCardSpecialZone = false;
+ bIgnoreTriangleButton = false;
+
+ if ( !MemCardAccessTriggerCaller.CanCall() )
+ MemCardAccessTriggerCaller.SetTrigger(TriggerSave_LoadGameLoadGame, widget);
+ else
+ {
+ // Loading data. Please do not remove the Memory Card (PS2) in MEMORY CARD slot 1, reset or switch off the console.
+ DisplayMemoryCardAccessMsg(TheText.Get("FELD_WR"), CRGBA(200, 50, 50, 192));
+ TheMemoryCard.LoadSlotToBuffer(MemoryCardSlotSelected);
+
+ if ( TheMemoryCard.GetError() == CMemoryCard::NO_ERR_SUCCESS)
+ {
+ FrontEndMenuManager.m_bWantToRestart = true;
+ FrontEndMenuManager.AnaliseMenuContents();
+ FrontEndMenuManager.m_bMenuActive = false;
+ FrontEndMenuManager.m_bInSaveZone = false;
+
+ CTimer::EndUserPause();
+
+ TheMemoryCard.m_bWantToLoad = true;
+
+ DMAudio.SetEffectsFadeVol(0);
+ DMAudio.SetMusicFadeVol(0);
+ DMAudio.ResetTimers(CTimer::GetTimeInMilliseconds());
+ }
+ else
+ {
+ // Load Failed! Check Memory Card (PS2) in MEMORY CARD slot 1 and please try again.
+ MenuSaveZoneMSG_1.m_numTexts = 0;
+ MenuSaveZoneMSG_1.AddText(TheText.Get("FES_LOE"), X(-80.0f), YF(20.0f), TEXT_COLOR, 0);
+
+ MenuSaveZoneMSG_2.m_numOptions = 0;
+ MenuSaveZoneMSG_2.AddOption(TheText.Get("FESZ_OK"), X(100.0f), YF(25.0f), TriggerSave_BackToMainMenu, 0, 0);
+
+ pMenuSave = &MenuPageSaveZone_Message;
+ pMenuSave->ActivatePage();
+
+ bMemoryCardSpecialZone = false;
+ bIgnoreTriangleButton = true;
+ }
+ }
+ }
+}
+
+void
+TriggerSave_LoadGameLoadGameSelect(CMenuMultiChoiceTwoLinesTriggered *widget)
+{
+ if ( widget )
+ {
+ if ( widget->GetMenuSelection() > 0 )
+ {
+ MemoryCardSlotSelected = widget->GetMenuSelection() - 1;
+
+ switch ( TheMemoryCard.GetInfoOnSpecificSlot(MemoryCardSlotSelected) )
+ {
+ case CMemoryCard::SLOT_NOTPRESENT:
+ {
+ break;
+ }
+ case CMemoryCard::SLOT_CORRUPTED:
+ {
+ // Load Failed.
+ MenuSaveZoneMSG_1.m_numTexts = 0;
+ MenuSaveZoneMSG_1.AddText(TheText.Get("FES_LOF"), X(50.0f), YF(20.0f), TEXT_COLOR, 0);
+
+ MenuSaveZoneMSG_2.m_numOptions = 0;
+ MenuSaveZoneMSG_2.AddOption(TheText.Get("FESZ_OK"), X(100.0f), 0.0f, TriggerSave_BackToMainMenu, 0, 0);
+
+ MenuPageSaveZone_Message.ActivatePage();
+ pMenuSave = &MenuPageSaveZone_Message;
+ bMemoryCardSpecialZone = false;
+ break;
+ }
+ case CMemoryCard::SLOT_PRESENT:
+ {
+ // All unsaved progress in your current game will be lost. Proceed with loading?
+ MenuSaveZoneQYN_1.m_numTexts = 0;
+ MenuSaveZoneQYN_1.AddText(TheText.Get("FESZ_QL"), X(-40.0f), 0.0f, TEXT_COLOR, 0);
+
+ MenuSaveZoneQYN_2.m_numOptions = 0;
+ MenuSaveZoneQYN_2.AddOption(TheText.Get("FEM_NO"), X(80.0f), YF(20.0f), TriggerSave_BackToMainMenu, 0, 0);
+ MenuSaveZoneQYN_2.AddOption(TheText.Get("FEM_YES"), X(80.0f), 0.0f, TriggerSave_LoadGameLoadGame, 0, 0);
+
+ MenuPageSaveZone_QuestionYesNo.ActivatePage();
+ pMenuSave = &MenuPageSaveZone_QuestionYesNo;
+ bMemoryCardSpecialZone = false;
+ break;
+ }
+ }
+ }
+ }
+}
+
+void
+TriggerSave_LoadGameSelect(CMenuMultiChoiceTriggered *widget)
+{
+ FillMenuWithMemCardFileListing(&MenuSaveLG_2, TriggerSave_BackToMainMenuTwoLines, TriggerSave_LoadGameLoadGameSelect, nil, 0, 34, 22);
+ FillMenuWithMemCardFileListing(&MenuSaveDG_2, TriggerSave_BackToMainMenuTwoLines, TriggerSave_DeleteGameDeleteGameSelect, nil, 0, 34, 22);
+
+ pMenuSave = &MenuPage_SaveLoadGame;
+ pMenuSave->ActivatePage();
+
+ gErrorSampleTriggered = false;
+ bMemoryCardSpecialZone = true;
+ bIgnoreTriangleButton = true;
+}
+
+void
+TriggerSave_BackToMainMenu(CMenuMultiChoiceTriggered *widget)
+{
+ pMenuSave = &MenuPage_SaveBasic;
+ pMenuSave->ActivatePage();
+ bMemoryCardSpecialZone = false;
+ bIgnoreTriangleButton = false;
+}
+
+void InitialiseTextsInMenuControllerInCar(CMenuPictureAndText *widget, CMenuManager::CONTRCONFIG cont)
+{
+ if ( widget )
+ {
+ widget->m_numTexts = 0;
+
+ switch ( cont )
+ {
+ case CMenuManager::CONFIG_1:
+ {
+ widget->AddText(TheText.Get("FEC_LL"), X(50.0f), Y(-14.0f), PAD_TEXT_COLOR, true); // -16.0f
+ widget->AddText(TheText.Get("FEC_RSC"), X(-4.0f), Y(29.0f), PAD_TEXT_COLOR, true); // 33.142860f
+ widget->AddText(TheText.Get("FEC_VES"), X(-4.0f), Y(65.0f), PAD_TEXT_COLOR, true); // 74.285721f
+ widget->AddText(TheText.Get("FEC_VES"), X(-4.0f), Y(97.0f), PAD_TEXT_COLOR, true); // 110.857147f
+ widget->AddText(TheText.Get("FEC_HO3"), X(84.0f), Y(162.0f), PAD_TEXT_COLOR, false); // 185.142868f
+ widget->AddText(TheText.Get("FEC_CAM"), X(103.0f), Y(141.0f), PAD_TEXT_COLOR, false); // 161.142868f
+ widget->AddText(TheText.Get("FEC_PAU"), X(130.0f), Y(128.0f), PAD_TEXT_COLOR, false); // 146.285721f
+ widget->AddText(TheText.Get("FEC_LB"), X(68.0f), Y(-6.0f), PAD_TEXT_COLOR, false); // -6.857143f
+ widget->AddText(TheText.Get("FEC_LR"), X(184.0f), Y(-14.0f), PAD_TEXT_COLOR, false); // -16.0f
+ widget->AddText(TheText.Get("FEC_HAB"), X(238.0f), Y(25.0f), PAD_TEXT_COLOR, false); // 28.571430f
+ widget->AddText(TheText.Get("FEC_BRA"), X(155.0f), Y(18.0f), PAD_TEXT_COLOR, true); // 20.571430f
+ widget->AddText(TheText.Get("FEC_EXV"), X(238.0f), Y(52.0f), PAD_TEXT_COLOR, false); // 59.428574f
+ widget->AddText(TheText.Get("FEC_CAW"), X(238.0f), Y(65.0f), PAD_TEXT_COLOR, false); // 74.285721f
+ widget->AddText(TheText.Get("FEC_ACC"), X(238.0f), Y(78.0f), PAD_TEXT_COLOR, false); // 89.142860f
+ widget->AddText(TheText.Get("FEC_TUC"), X(238.0f), Y(94.0f), PAD_TEXT_COLOR, false); // 107.428574f
+ widget->AddText(TheText.Get("FEC_SM3"), X(238.0f), Y(109.0f), PAD_TEXT_COLOR, false); // 124.571434f
+
+ break;
+ }
+
+ case CMenuManager::CONFIG_2:
+ {
+ widget->AddText(TheText.Get("FEC_LL"), X(50.0f), Y(-14.0f), PAD_TEXT_COLOR, true); // -16.0f
+ widget->AddText(TheText.Get("FEC_HOR"), X(-4.0f), Y(29.0f), PAD_TEXT_COLOR, true); // 33.142860f
+ widget->AddText(TheText.Get("FEC_CAM"), X(-4.0f), Y(65.0f), PAD_TEXT_COLOR, true); // 74.285721f
+ widget->AddText(TheText.Get("FEC_VES"), X(-4.0f), Y(97.0f), PAD_TEXT_COLOR, true); // 110.857147f
+ widget->AddText(TheText.Get("FEC_NA"), X(84.0f), Y(162.0f), PAD_TEXT_COLOR, false); // 185.142868f
+ widget->AddText(TheText.Get("FEC_RSC"), X(103.0f), Y(141.0f), PAD_TEXT_COLOR, false); // 161.142868f
+ widget->AddText(TheText.Get("FEC_PAU"), X(130.0f), Y(128.0f), PAD_TEXT_COLOR, false); // 146.285721f
+ widget->AddText(TheText.Get("FEC_LB"), X(68.0f), Y(-6.0f), PAD_TEXT_COLOR, false); // -6.857143f
+ widget->AddText(TheText.Get("FEC_LR"), X(184.0f), Y(-14.0f), PAD_TEXT_COLOR, false); // -16.0f
+ widget->AddText(TheText.Get("FEC_HAB"), X(238.0f), Y(25.0f), PAD_TEXT_COLOR, false); // 28.571430f
+ widget->AddText(TheText.Get("FEC_BRA"), X(155.0f), Y(18.0f), PAD_TEXT_COLOR, true); // 20.571430f
+ widget->AddText(TheText.Get("FEC_EXV"), X(238.0f), Y(52.0f), PAD_TEXT_COLOR, false); // 59.428574f
+ widget->AddText(TheText.Get("FEC_CAW"), X(238.0f), Y(65.0f), PAD_TEXT_COLOR, false); // 74.285721f
+ widget->AddText(TheText.Get("FEC_ACC"), X(238.0f), Y(78.0f), PAD_TEXT_COLOR, false); // 89.142860f
+ widget->AddText(TheText.Get("FEC_TUC"), X(238.0f), Y(94.0f), PAD_TEXT_COLOR, false); // 107.428574f
+ widget->AddText(TheText.Get("FEC_SM3"), X(238.0f), Y(109.0f), PAD_TEXT_COLOR, false); // 124.571434f
+
+ break;
+ }
+
+ case CMenuManager::CONFIG_3:
+ {
+ widget->AddText(TheText.Get("FEC_LL"), X(50.0f), Y(-14.0f), PAD_TEXT_COLOR, true); // -16.0f
+ widget->AddText(TheText.Get("FEC_EXV"), X(-4.0f), Y(29.0f), PAD_TEXT_COLOR, true); // 33.142860f
+ widget->AddText(TheText.Get("FEC_VES"), X(-4.0f), Y(65.0f), PAD_TEXT_COLOR, true); // 74.285721f
+ widget->AddText(TheText.Get("FEC_VES"), X(-4.0f), Y(97.0f), PAD_TEXT_COLOR, true); // 110.857147f
+ widget->AddText(TheText.Get("FEC_RS3"), X(84.0f), Y(162.0f), PAD_TEXT_COLOR, false); // 185.142868f
+ widget->AddText(TheText.Get("FEC_CAM"), X(103.0f), Y(141.0f), PAD_TEXT_COLOR, false); // 161.142868f
+ widget->AddText(TheText.Get("FEC_PAU"), X(130.0f), Y(128.0f), PAD_TEXT_COLOR, false); // 146.285721f
+ widget->AddText(TheText.Get("FEC_LB"), X(68.0f), Y(-6.0f), PAD_TEXT_COLOR, false); // -6.857143f
+ widget->AddText(TheText.Get("FEC_LR"), X(184.0f), Y(-14.0f), PAD_TEXT_COLOR, false); // -16.0f
+ widget->AddText(TheText.Get("FEC_HOR"), X(238.0f), Y(25.0f), PAD_TEXT_COLOR, false); // 28.571430f
+ widget->AddText(TheText.Get("FEC_BRA"), X(155.0f), Y(18.0f), PAD_TEXT_COLOR, true); // 20.571430f
+ widget->AddText(TheText.Get("FEC_HAB"), X(238.0f), Y(52.0f), PAD_TEXT_COLOR, false); // 59.428574f
+ widget->AddText(TheText.Get("FEC_CAW"), X(238.0f), Y(65.0f), PAD_TEXT_COLOR, false); // 74.285721f
+ widget->AddText(TheText.Get("FEC_ACC"), X(238.0f), Y(78.0f), PAD_TEXT_COLOR, false); // 89.142860f
+ widget->AddText(TheText.Get("FEC_TUC"), X(238.0f), Y(94.0f), PAD_TEXT_COLOR, false); // 107.428574f
+ widget->AddText(TheText.Get("FEC_SM3"), X(238.0f), Y(109.0f), PAD_TEXT_COLOR, false); // 124.571434f
+
+ break;
+ }
+
+ case CMenuManager::CONFIG_4:
+ {
+ widget->AddText(TheText.Get("FEC_LL"), X(50.0f), Y(-14.0f), PAD_TEXT_COLOR, true); // -16.0f
+ widget->AddText(TheText.Get("FEC_HAB"), X(-4.0f), Y(29.0f), PAD_TEXT_COLOR, true); // 33.142860f
+ widget->AddText(TheText.Get("FEC_TUC"), X(-4.0f), Y(65.0f), PAD_TEXT_COLOR, true); // 74.285721f
+ widget->AddText(TheText.Get("FEC_VES"), X(-4.0f), Y(97.0f), PAD_TEXT_COLOR, true); // 110.857147f
+ widget->AddText(TheText.Get("FEC_HO3"), X(84.0f), Y(162.0f), PAD_TEXT_COLOR, false); // 185.142868f
+ widget->AddText(TheText.Get("FEC_CAM"), X(103.0f), Y(141.0f), PAD_TEXT_COLOR, false); // 161.142868f
+ widget->AddText(TheText.Get("FEC_PAU"), X(130.0f), Y(128.0f), PAD_TEXT_COLOR, false); // 146.285721f
+ widget->AddText(TheText.Get("FEC_LB"), X(68.0f), Y(-6.0f), PAD_TEXT_COLOR, false); // -6.857143f
+ widget->AddText(TheText.Get("FEC_LR"), X(184.0f), Y(-14.0f), PAD_TEXT_COLOR, false); // -16.0f
+ widget->AddText(TheText.Get("FEC_CAW"), X(238.0f), Y(25.0f), PAD_TEXT_COLOR, false); // 28.571430f
+ widget->AddText(TheText.Get("FEC_SMT"), X(155.0f), Y(18.0f), PAD_TEXT_COLOR, true); // 20.571430f
+ widget->AddText(TheText.Get("FEC_EXV"), X(238.0f), Y(52.0f), PAD_TEXT_COLOR, false); // 59.428574f
+ widget->AddText(TheText.Get("FEC_RSC"), X(238.0f), Y(65.0f), PAD_TEXT_COLOR, false); // 74.285721f
+ widget->AddText(TheText.Get("FEC_NA"), X(238.0f), Y(78.0f), PAD_TEXT_COLOR, false); // 89.142860f
+ widget->AddText(TheText.Get("FEC_ACC"), X(238.0f), Y(94.0f), PAD_TEXT_COLOR, false); // 107.428574f
+ widget->AddText(TheText.Get("FEC_BRA"), X(238.0f), Y(109.0f), PAD_TEXT_COLOR, false); // 124.571434f
+
+ break;
+ }
+ }
+ }
+}
+
+void InitialiseTextsInMenuControllerOnFoot(CMenuPictureAndText *widget, CMenuManager::CONTRCONFIG cont)
+{
+ if ( widget )
+ {
+ widget->m_numTexts = 0;
+
+
+ switch ( cont )
+ {
+ case CMenuManager::CONFIG_1:
+ {
+ widget->AddText(TheText.Get("FEC_CWL"), X(50.0f), Y(-14.0f), PAD_TEXT_COLOR, true); // -16.0f
+ widget->AddText(TheText.Get("FEC_LOF"), X(-4.0f), Y(25.0f), PAD_TEXT_COLOR, true); // 28.571430f
+ widget->AddText(TheText.Get("FEC_MOV"), X(-4.0f), Y(65.0f), PAD_TEXT_COLOR, true); // 74.285721f
+ widget->AddText(TheText.Get("FEC_MOV"), X(-4.0f), Y(97.0f), PAD_TEXT_COLOR, true); // 110.857147f
+ widget->AddText(TheText.Get("FEC_CAM"), X(103.0f), Y(141.0f), PAD_TEXT_COLOR, false); // 161.142868f
+ widget->AddText(TheText.Get("FEC_PAU"), X(130.0f), Y(128.0f), PAD_TEXT_COLOR, false); // 146.285721f
+ widget->AddText(TheText.Get("FEC_CWR"), X(184.0f), Y(-14.0f), PAD_TEXT_COLOR, false); // -16.0f
+ widget->AddText(TheText.Get("FEC_TAR"), X(238.0f), Y(25.0f), PAD_TEXT_COLOR, false); // 28.571430f
+ widget->AddText(TheText.Get("FEC_JUM"), X(144.0f), Y(18.0f), PAD_TEXT_COLOR, true); // 20.571430f
+ widget->AddText(TheText.Get("FEC_ENV"), X(238.0f), Y(52.0f), PAD_TEXT_COLOR, false); // 59.428574f
+ widget->AddText(TheText.Get("FEC_ATT"), X(238.0f), Y(65.0f), PAD_TEXT_COLOR, false); // 74.285721f
+ widget->AddText(TheText.Get("FEC_RUN"), X(238.0f), Y(78.0f), PAD_TEXT_COLOR, false); // 89.142860f
+ widget->AddText(TheText.Get("FEC_FPC"), X(238.0f), Y(94.0f), PAD_TEXT_COLOR, false); // 107.428574f
+ widget->AddText(TheText.Get("FEC_LB3"), X(238.0f), Y(109.0f), PAD_TEXT_COLOR, false); // 124.571434f
+ widget->AddText(TheText.Get("FEC_R3"), X(238.0f), Y(122.0f), PAD_TEXT_COLOR, false); // 139.428574f
+
+ break;
+ }
+
+ case CMenuManager::CONFIG_2:
+ {
+ widget->AddText(TheText.Get("FEC_CWL"), X(50.0f), Y(-14.0f), PAD_TEXT_COLOR, true); // -16.0f
+ widget->AddText(TheText.Get("FEC_LOF"), X(-4.0f), Y(25.0f), PAD_TEXT_COLOR, true); // 28.571430f
+ widget->AddText(TheText.Get("FEC_CAM"), X(-4.0f), Y(65.0f), PAD_TEXT_COLOR, true); // 74.285721f
+ widget->AddText(TheText.Get("FEC_MOV"), X(-4.0f), Y(97.0f), PAD_TEXT_COLOR, true); // 110.857147f
+ widget->AddText(TheText.Get("FEC_NA"), X(103.0f), Y(141.0f), PAD_TEXT_COLOR, false); // 161.142868f
+ widget->AddText(TheText.Get("FEC_PAU"), X(130.0f), Y(128.0f), PAD_TEXT_COLOR, false); // 146.285721f
+ widget->AddText(TheText.Get("FEC_CWR"), X(184.0f), Y(-14.0f), PAD_TEXT_COLOR, false); // -16.0f
+ widget->AddText(TheText.Get("FEC_TAR"), X(238.0f), Y(25.0f), PAD_TEXT_COLOR, false); // 28.571430f
+ widget->AddText(TheText.Get("FEC_JUM"), X(144.0f), Y(18.0f), PAD_TEXT_COLOR, true); // 20.571430f
+ widget->AddText(TheText.Get("FEC_ENV"), X(238.0f), Y(52.0f), PAD_TEXT_COLOR, false); // 59.428574f
+ widget->AddText(TheText.Get("FEC_ATT"), X(238.0f), Y(65.0f), PAD_TEXT_COLOR, false); // 74.285721f
+ widget->AddText(TheText.Get("FEC_RUN"), X(238.0f), Y(78.0f), PAD_TEXT_COLOR, false); // 89.142860f
+ widget->AddText(TheText.Get("FEC_FPC"), X(238.0f), Y(94.0f), PAD_TEXT_COLOR, false); // 107.428574f
+ widget->AddText(TheText.Get("FEC_LB3"), X(238.0f), Y(109.0f), PAD_TEXT_COLOR, false); // 124.571434f
+ widget->AddText(TheText.Get("FEC_R3"), X(238.0f), Y(122.0f), PAD_TEXT_COLOR, false); // 139.428574f
+
+ break;
+ }
+
+ case CMenuManager::CONFIG_3:
+ {
+ widget->AddText(TheText.Get("FEC_CWL"), X(50.0f), Y(-14.0f), PAD_TEXT_COLOR, true); // -16.0f
+ widget->AddText(TheText.Get("FEC_ENV"), X(-4.0f), Y(25.0f), PAD_TEXT_COLOR, true); // 28.571430f
+ widget->AddText(TheText.Get("FEC_MOV"), X(-4.0f), Y(65.0f), PAD_TEXT_COLOR, true); // 74.285721f
+ widget->AddText(TheText.Get("FEC_MOV"), X(-4.0f), Y(97.0f), PAD_TEXT_COLOR, true); // 110.857147f
+ widget->AddText(TheText.Get("FEC_CAM"), X(103.0f), Y(141.0f), PAD_TEXT_COLOR, false); // 161.142868f
+ widget->AddText(TheText.Get("FEC_PAU"), X(130.0f), Y(128.0f), PAD_TEXT_COLOR, false); // 146.285721f
+ widget->AddText(TheText.Get("FEC_CWR"), X(184.0f), Y(-14.0f), PAD_TEXT_COLOR, false); // -16.0f
+ widget->AddText(TheText.Get("FEC_TAR"), X(238.0f), Y(25.0f), PAD_TEXT_COLOR, false); // 28.571430f
+ widget->AddText(TheText.Get("FEC_JUM"), X(144.0f), Y(18.0f), PAD_TEXT_COLOR, true); // 20.571430f
+ widget->AddText(TheText.Get("FEC_LOF"), X(238.0f), Y(52.0f), PAD_TEXT_COLOR, false); // 59.428574f
+ widget->AddText(TheText.Get("FEC_RUN"), X(238.0f), Y(65.0f), PAD_TEXT_COLOR, false); // 74.285721f
+ widget->AddText(TheText.Get("FEC_ATT"), X(238.0f), Y(78.0f), PAD_TEXT_COLOR, false); // 89.142860f
+ widget->AddText(TheText.Get("FEC_FPC"), X(238.0f), Y(94.0f), PAD_TEXT_COLOR, false); // 107.428574f
+ widget->AddText(TheText.Get("FEC_LB3"), X(238.0f), Y(109.0f), PAD_TEXT_COLOR, false); // 124.571434f
+ widget->AddText(TheText.Get("FEC_R3"), X(238.0f), Y(122.0f), PAD_TEXT_COLOR, false); // 139.428574f
+
+ break;
+ }
+
+ case CMenuManager::CONFIG_4:
+ {
+ widget->AddText(TheText.Get("FEC_CWL"), X(50.0f), Y(-14.0f), PAD_TEXT_COLOR, true); // -16.0f
+ widget->AddText(TheText.Get("FEC_TAR"), X(-4.0f), Y(25.0f), PAD_TEXT_COLOR, true); // 28.571430f
+ widget->AddText(TheText.Get("FEC_NA"), X(-4.0f), Y(65.0f), PAD_TEXT_COLOR, true); // 74.285721f
+ widget->AddText(TheText.Get("FEC_MOV"), X(-4.0f), Y(97.0f), PAD_TEXT_COLOR, true); // 110.857147f
+ widget->AddText(TheText.Get("FEC_CAM"), X(103.0f), Y(141.0f), PAD_TEXT_COLOR, false); // 161.142868f
+ widget->AddText(TheText.Get("FEC_PAU"), X(130.0f), Y(128.0f), PAD_TEXT_COLOR, false); // 146.285721f
+ widget->AddText(TheText.Get("FEC_CWR"), X(184.0f), Y(-14.0f), PAD_TEXT_COLOR, false); // -16.0f
+ widget->AddText(TheText.Get("FEC_ATT"), X(238.0f), Y(25.0f), PAD_TEXT_COLOR, false); // 28.571430f
+ widget->AddText(TheText.Get("FEC_JUM"), X(144.0f), Y(18.0f), PAD_TEXT_COLOR, true); // 20.571430f
+ widget->AddText(TheText.Get("FEC_ENV"), X(238.0f), Y(52.0f), PAD_TEXT_COLOR, false); // 59.428574f
+ widget->AddText(TheText.Get("FEC_LOF"), X(238.0f), Y(65.0f), PAD_TEXT_COLOR, false); // 74.285721f
+ widget->AddText(TheText.Get("FEC_RUN"), X(238.0f), Y(78.0f), PAD_TEXT_COLOR, false); // 89.142860f
+ widget->AddText(TheText.Get("FEC_FPC"), X(238.0f), Y(94.0f), PAD_TEXT_COLOR, false); // 107.428574f
+ widget->AddText(TheText.Get("FEC_LB3"), X(238.0f), Y(109.0f), PAD_TEXT_COLOR, false); // 124.571434f
+ widget->AddText(TheText.Get("FEC_R3"), X(238.0f), Y(122.0f), PAD_TEXT_COLOR, false); // 139.428574f
+
+ break;
+ }
+ }
+ }
+}
+
+void
+TriggerSaveZone_BackToMainMenuTwoLines(CMenuMultiChoiceTwoLinesTriggered *widget)
+{
+ bMemoryCardSpecialZone = false;
+ bIgnoreTriangleButton = false;
+ pActiveMenuPage = &MenuPageSaveZone_SaveGame;
+}
+
+void
+TriggerSave_BackToMainMenuTwoLines(CMenuMultiChoiceTwoLinesTriggered *widget)
+{
+ pMenuSave = &MenuPage_SaveBasic;
+ pMenuSave->ActivatePage();
+ bMemoryCardSpecialZone = false;
+ bIgnoreTriangleButton = false;
+}
+
+void
+SetRandomActiveTextlineColor(uint8 bText)
+{
+ if ( bMemoryCardSpecialZone )
+ rgbaATC = SELECTED_TEXT_COLOR;
+ else
+ {
+ bool bSelected = false;
+ bool bHighlignted = false;
+
+ switch ( FrontEndMenuManager.m_pageState )
+ {
+ case PAGESTATE_NORMAL:
+ break;
+ case PAGESTATE_HIGHLIGHTED:
+ bHighlignted = true;
+ break;
+ case PAGESTATE_SELECTED:
+ bSelected = true;
+ break;
+ }
+
+ if ( FrontEndMenuManager.m_bInSaveZone )
+ bSelected = true;
+
+ if ( bSelected || bText )
+ {
+ static uint32 delayTime = 0;
+ static bool bAddVal = true;
+
+ if ( delayTime < CTimer::GetTimeInMillisecondsPauseMode() )
+ {
+ delayTime = CTimer::GetTimeInMillisecondsPauseMode() + 200;
+
+ if ( bAddVal )
+ rgbaATC = TEXT_COLOR;
+ else
+ rgbaATC = SELECTED_TEXT_COLOR;
+
+ bAddVal = !bAddVal;
+ }
+ }
+
+ if ( bHighlignted )
+ {
+ static uint32 delayTime = 0;
+ static bool bAddVal = true;
+
+ if ( delayTime < CTimer::GetTimeInMillisecondsPauseMode() )
+ {
+ delayTime = CTimer::GetTimeInMillisecondsPauseMode() + 200;
+
+ if ( bAddVal )
+ rgbaATC = TITLE_TEXT_COLOR;
+ else
+ rgbaATC = MENU_SELECTED_COLOR;
+
+ bAddVal = !bAddVal;
+ }
+ }
+ }
+}
+
+#ifdef GTA_PC
+
+void
+TriggerDisplay_Trails(CMenuOnOffTriggered *widget)
+{
+ if ( widget )
+ {
+ CMenuManager::m_PrefsShowTrails = widget->GetMenuSelection();
+ CMBlur::BlurOn = CMenuManager::m_PrefsShowTrails;
+
+ if ( CMBlur::BlurOn )
+ CMBlur::MotionBlurOpen(Scene.camera);
+ else
+ CMBlur::MotionBlurClose();
+ }
+}
+
+#endif \ No newline at end of file
diff --git a/src/core/Frontend_PS2.cpp b/src/core/Frontend_PS2.cpp
new file mode 100644
index 00000000..8e604978
--- /dev/null
+++ b/src/core/Frontend_PS2.cpp
@@ -0,0 +1,3034 @@
+#include "common.h"
+#ifdef PS2_MENU
+#include "platform.h"
+#include "main.h"
+#include "Timer.h"
+#include "Pad.h"
+#include "Sprite2d.h"
+#include "Text.h"
+#include "Font.h"
+#include "Hud.h"
+#include "MBlur.h"
+#include "DMAudio.h"
+#include "Streaming.h"
+#include "Camera.h"
+#include "Credits.h"
+#include "General.h"
+#include "TxdStore.h"
+#include "FileMgr.h"
+#include "Messages.h"
+#include "Frontend_PS2.h"
+#include "Stats.h"
+#include "Game.h"
+#include "World.h"
+#include "PlayerInfo.h"
+#include "FrontendControls.h"
+#include "MemoryCard.h"
+
+#define CRect_SZ(x, y, w, h) CRect(x, y, x+w, y+h)
+
+wchar MemoryCard_FileNames[8][100+1];
+CMenuManager FrontEndMenuManager;
+
+// TEMP: put into header
+bool DoRWStuffStartOfFrame_Horizon(int16 TopRed, int16 TopGreen, int16 TopBlue, int16 BottomRed, int16 BottomGreen, int16 BottomBlue, int16 Alpha);
+bool DoRWStuffStartOfFrame(int16 TopRed, int16 TopGreen, int16 TopBlue, int16 BottomRed, int16 BottomGreen, int16 BottomBlue, int16 Alpha);
+void DoRWStuffEndOfFrame(void);
+
+
+#define SCRW SCREEN_WIDTH
+#define SCRH SCREEN_HEIGHT
+//#define X SCREEN_STRETCH_X
+//#define Y SCREEN_STRETCH_Y
+#define X SCREEN_SCALE_X
+#define Y SCREEN_SCALE_Y
+
+#define YF(x) Y(float(x)*(float(DEFAULT_SCREEN_HEIGHT)/float(DEFAULT_SCREEN_HEIGHT_PAL)))
+//#define X(x) ((x)/640.0f*SCRW)
+//#define Y(y) ((y)/448.0f*SCRH)
+
+
+static float MENU_TEXT_SIZE_X = 0.644f;
+static float MENU_TEXT_SIZE_Y = 0.84f; //0.96f;
+float BUTTONTAB_TEXT_SIZE_X = 0.35f;
+float BUTTONTAB_TEXT_SIZE_Y = 0.7f; //0.8f;
+float PANEL_TEXT_SIZE_X = 0.8f;
+float PANEL_TEXT_SIZE_Y = 1.2f; //0.96f/0.7f; //??
+float MEMCARD_ACCESS_MSG_SIZE_X = 0.84f;
+float MEMCARD_ACCESS_MSG_SIZE_Y = 1.12f; //1.28f;
+
+CRGBA SELECTED_TEXT_COLOR(255, 182, 48, 255);
+CRGBA BACKGROUND_SPLASH_COLOR(48, 48, 48, 255);
+
+CVector2D CONTR_DESCR_NEW_TEXTSCALE(0.4564f, 0.63f); // 0.72
+CVector2D CONFIGS_NEW_TEXTSCALE(0.49f, 0.7f); // 0.8
+CVector2D AUDIO_OUTPUT_POS(0.0f, 0.0f);
+CVector2D AUDIO_RSTATION_POS(154.0f, 0.0f);
+CVector2D DISPLAY_BRIGHTNESS_POS(0.0f, 0.0f);
+
+CRGBA TEXT_COLOR(150, 110, 30, 255);
+CRGBA PAD_TEXT_COLOR(200, 200, 200, 255);
+CRGBA CRIM_RATING_TEXT_COLOR(255, 182, 48, 255);
+CRGBA SCROLL_TEXT_COLOR(150, 110, 30, 255);
+CRGBA TITLE_TEXT_COLOR(170, 130, 50, 255);
+CRGBA TEXT_SHADOW_COLOR(0, 0, 0, 255);
+CVector2D SHADOW_VECTOR(1.0f, 1.0f);
+CRGBA SLIDER_RIGHT_COLOR(20, 94, 136, 255);
+CRGBA SLIDER_LEFT_COLOR(86, 196, 255, 255);
+CRGBA MENU_SELECTED_COLOR(255, 212, 88, 255);
+CRGBA rgbaATC(96, 96, 96, 255); // active text color. not constant
+
+float BUTTONTAB_TEXT_X_SCALES[NUM_PAGES] = { 1.0f };
+float PANEL_TEXT_X_SCALES[NUM_PAGES] = { 1.0f };
+
+int32 MemoryCardSlotSelected;
+uint32 TimeToStopPadShaking;
+bool bFrontEnd_ReloadObrTxtGxt;
+
+bool bMemoryCardStartUpMenus_ExitNow;
+
+extern CMenuPage MenuPage_SaveBasic;
+CMenuPage *pActiveMenuPage;
+CMenuPage *pMenuSave = &MenuPage_SaveBasic;
+bool bMemoryCardSpecialZone;
+bool bIgnoreTriangleButton;
+bool gErrorSampleTriggered;
+
+bool gMusicPlaying;
+
+CMenuPage MenuPage_Stats;
+ CMenuLineLister MenuStats_1;
+ CMenuPictureAndText MenuStats_2; // criminal rating
+CMenuPage MenuPage_Briefs;
+ CMenuPictureAndText MenuBriefs_1;
+ CMenuDummy MenuBriefs_2;
+CMenuPage MenuPage_SaveBasic;
+ CMenuMultiChoiceTriggered MenuSaveB_1; // "Load Game", "Delete Game", "New Game"
+CMenuPage MenuPage_SaveNewGame;
+ CMenuPictureAndText MenuSaveNG_1; // "Load Game", "Delete Game", "New Game"
+ CMenuMultiChoiceTriggered MenuSaveNG_2; // "No", "Yes"
+CMenuPage MenuPage_SaveLoadGame;
+ CMenuPictureAndText MenuSaveLG_1; // "Load Game", "Delete Game", "New Game"
+ CMenuMultiChoiceTwoLinesTriggered MenuSaveLG_2; // save games
+CMenuPage MenuPage_SaveDeleteGame;
+ CMenuPictureAndText MenuSaveDG_1; // "Load Game", "Delete Game", "New Game"
+ CMenuMultiChoiceTwoLinesTriggered MenuSaveDG_2; // save games
+CMenuPage MenuPage_Controls;
+ CMenuPictureAndText MenuControls_3; // controller images
+ CMenuPictureAndText MenuControls_6;
+ CMenuPictureAndText MenuControls_4;
+ CMenuPictureAndText MenuControls_7;
+ CMenuMultiChoiceTriggeredAlways MenuControls_1; // "Configuration:" "Setup1", "Setup2", "Setup3", "Setup4"
+ CMenuMultiChoiceTriggered MenuControls_2; // "Controller Display:" "On Foot", "In Car"
+ CMenuOnOffTriggered MenuControls_5; // "Vibration:"
+CMenuPageAnyMove MenuPage_Audio;
+ CMenuSliderTriggered MenuAudio_1; // "Music Volume"
+ CMenuMultiChoiceTriggered MenuAudio_4; // "Output:" "Stereo", "Mono"
+ CMenuSliderTriggered MenuAudio_2; // "SFX Volume"
+ CMenuMultiChoicePicturedTriggeredAnyMove MenuAudio_3; // "Radio station select:"
+CMenuPage MenuPage_Display;
+ CMenuSlider MenuDisplay_1; // "Brightness"
+#ifdef GTA_PC
+ CMenuOnOffTriggered MenuDisplay_2; // "Trails:"
+#else
+ CMenuOnOff MenuDisplay_2; // "Trails:"
+#endif
+ CMenuOnOff MenuDisplay_3; // "Subtitles:"
+ CMenuOnOff MenuDisplay_4; // "Wide Screen:"
+CMenuPage MenuPage_Language;
+ CMenuMultiChoiceTriggered MenuLanguage_1; // "English", "French", "German", "Italian", "Spanish"
+
+CMenuPage MenuPageSaveZone_SaveGame;
+ CMenuMultiChoiceTriggered MenuSaveZoneSG_1; // "Save game", "Cancel"
+CMenuPage MenuPageSaveZone_SaveSlots;
+ CMenuMultiChoiceTwoLinesTriggered MenuSaveZoneSSL_1; // "Cancel"
+CMenuPage MenuPageSaveZone_SavedSuccessfully;
+ CMenuPictureAndText MenuSaveZoneSS_1; // "Game saved successfully!" "Your saved filename is:"
+ CMenuMultiChoiceTriggered MenuSaveZoneSS_2; // "Quit"
+CMenuPage MenuPageSaveZone_Message;
+ CMenuPictureAndText MenuSaveZoneMSG_1; // "Save Failed! Check memory card (PS2) in MEMORY CARD slot 1 and please try again."
+ CMenuMultiChoiceTriggered MenuSaveZoneMSG_2; // "OK"
+CMenuPage MenuPageSaveZone_QuestionYesNo;
+ CMenuPictureAndText MenuSaveZoneQYN_1; // "Save Failed! Check memory card (PS2) in MEMORY CARD slot 1 and please try again."
+ CMenuMultiChoiceTriggered MenuSaveZoneQYN_2; // "Yes", "No"
+CMenuPage MenuPageSaveZone_FormatCard;
+ CMenuMultiChoiceTriggered MenuSaveZoneFC_1; // "Memory card (PS2) in MEMORY CARD slot 1 is unformatted. Would you like to format memory card (PS2) in MEMORY CARD slot 1?" "No" "Yes"
+CMenuPage MenuPageSaveZone_ErrorFormat;
+ CMenuMultiChoiceTriggered MenuSaveZoneEF_1; // "Format Failed! Check memory card (PS2) in MEMORY CARD slot 1 and please try again." "OK"
+
+
+VALIDATE_SIZE(CPlaceableText, 0x10);
+VALIDATE_SIZE(CPlaceableShText, 0x20);
+VALIDATE_SIZE(CPlaceableShTextTwoLines, 0x30);
+VALIDATE_SIZE(CPlaceableShOption, 0x28);
+VALIDATE_SIZE(CPlaceableShOptionTwoLines, 0x38);
+VALIDATE_SIZE(CPlaceableSprite, 0x18);
+VALIDATE_SIZE(CPlaceableShSprite, 0x34);
+VALIDATE_SIZE(CMenuMultiChoice, 0x2CC);
+VALIDATE_SIZE(CMenuMultiChoiceTriggered, 0x310);
+VALIDATE_SIZE(CMenuMultiChoiceTwoLines, 0x3CC);
+VALIDATE_SIZE(CMenuOnOff, 0x90);
+
+#include "FrontendTriggers.h"
+
+static const char* FrontendFilenames[][2] =
+{
+ {"fe2_mainpanel_ul", "" },
+ {"fe2_mainpanel_ur", "" },
+ {"fe2_mainpanel_dl", "" },
+ {"fe2_mainpanel_dr", "" },
+ {"fe2_mainpanel_dr2", "" },
+ {"fe2_tabactive", "" },
+ {"fe_iconbrief", "" },
+ {"fe_iconstats", "" },
+ {"fe_iconcontrols", "" },
+ {"fe_iconsave", "" },
+ {"fe_iconaudio", "" },
+ {"fe_icondisplay", "" },
+ {"fe_iconlanguage", "" },
+ {"fe_controller", "" },
+ {"fe_controllersh", "" },
+ {"fe_arrows1", "" },
+ {"fe_arrows2", "" },
+ {"fe_arrows3", "" },
+ {"fe_arrows4", "" },
+ {"fe_radio1", "" },
+ {"fe_radio2", "" },
+ {"fe_radio3", "" },
+ {"fe_radio4", "" },
+ {"fe_radio5", "" },
+ {"fe_radio6", "" },
+ {"fe_radio7", "" },
+ {"fe_radio8", "" },
+ {"fe_radio9", "" },
+};
+
+
+int32 CMenuManager::m_PrefsSfxVolume = 102;
+int32 CMenuManager::m_PrefsMusicVolume = 102;
+int32 CMenuManager::m_PrefsBrightness = 256;
+bool CMenuManager::m_PrefsShowTrails = true;
+bool CMenuManager::m_PrefsShowSubtitles = true;
+bool CMenuManager::m_PrefsAllowNastyGame = true;
+
+int32 CMenuManager::m_PrefsRadioStation = 0;
+int32 CMenuManager::m_PrefsStereoMono = 0;
+int8 CMenuManager::m_PrefsUseWideScreen = 0;
+int32 CMenuManager::m_PrefsLanguage = 0;
+CMenuManager::CONTRCONFIG CMenuManager::m_PrefsControllerConfig = CONFIG_1;
+bool CMenuManager::m_PrefsUseVibration = false;
+
+
+#ifdef GTA_PC
+#include "PlayerSkin.h"
+int32 CMenuManager::OS_Language = 0;
+int8 CMenuManager::m_PrefsVsync = 1;
+int8 CMenuManager::m_PrefsVsyncDisp = 1;
+int8 CMenuManager::m_PrefsFrameLimiter = 1;
+int8 CMenuManager::m_PrefsSpeakers;
+int32 CMenuManager::m_ControlMethod = CONTROL_CLASSIC;
+int8 CMenuManager::m_PrefsDMA = 1;
+float CMenuManager::m_PrefsLOD = 1.0f;
+char CMenuManager::m_PrefsSkinFile[256] = DEFAULT_SKIN_NAME;
+
+#ifndef MASTER
+bool CMenuManager::m_PrefsMarketing;
+bool CMenuManager::m_PrefsDisableTutorials;
+#endif // !MASTER
+
+#ifdef MENU_MAP
+bool CMenuManager::bMenuMapActive;
+float CMenuManager::fMapSize;
+float CMenuManager::fMapCenterY;
+float CMenuManager::fMapCenterX;
+#endif
+
+#endif
+
+
+CMenuManager::CMenuManager(void)
+{
+ int32 i;
+
+ SetSoundLevelsForMusicMenu();
+
+ m_pageState = PAGESTATE_NORMAL;
+ m_currentPage = PAGE_FIRST;
+ m_newPage = PAGE_FIRST;
+ m_bMenuActive = false;
+ m_bSaveMenuActive = false;
+ m_bRenderGameInMenu = false;
+ m_bTexturesLoaded = false;
+ m_nPageLeftTimer = 0;
+ m_nPageRightTimer = 0;
+ m_nChangePageTimer = 0;
+ field_18 = 0;
+ m_fade = 255;
+ m_someAlpha = 255;
+ m_position.x = 0.0f;
+ m_position.y = 0.0f;
+ m_nSlidingDir = SLIDE_TO_BOTTOM;
+ m_nStartPauseTimer = 0;
+ m_nEndPauseTimer = 0;
+ m_bInitialised = false;
+ m_bWantToUpdateContent = false;
+ field_3C = 0;
+ m_bInSaveZone = false;
+
+ for(i = 0; i < NUM_PAGES; i++){
+ BUTTONTAB_TEXT_X_SCALES[i] = 1.0f;
+ PANEL_TEXT_X_SCALES[i] = 1.0f;
+ }
+
+#ifdef GTA_PC
+ TheCamera.m_bUseMouse3rdPerson = m_ControlMethod == CONTROL_STANDARD;
+ CMBlur::BlurOn = m_PrefsShowTrails;
+#endif
+}
+
+void
+CMenuManager::LoadAllTextures(void)
+{
+ int32 i;
+
+ if(m_bTexturesLoaded)
+ return;
+
+ DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_STARTING, 0);
+ DMAudio.Service();
+ DoRWStuffStartOfFrame(0, 0, 0, 0, 0, 0, 255);
+ RwRenderStateSet(rwRENDERSTATETEXTUREFILTER, (void*)rwFILTERLINEAR);
+ CSprite2d *splash = LoadSplash(nil);
+ if(splash)
+ splash->Draw(CRect(0.0f, 0.0f, SCRW, SCRH), BACKGROUND_SPLASH_COLOR);
+ else // doesn't exist!!
+ CHud::Sprites[19].Draw(CRect(0.0f, 0.0f, SCRW, SCRH), BACKGROUND_SPLASH_COLOR);
+ RwRenderStateSet(rwRENDERSTATETEXTUREFILTER, (void*)rwFILTERMIPNEAREST);
+ DoRWStuffEndOfFrame();
+
+ CFileMgr::SetDir("");
+ CFileMgr::SetDir("");
+
+ CTimer::Stop();
+ CStreaming::MakeSpaceFor(60*1024);
+ CStreaming::ImGonnaUseStreamingMemory();
+ CGame::TidyUpMemory(false, true);
+ int32 slot = CTxdStore::FindTxdSlot("frontend");
+ if(slot == -1)
+ slot = CTxdStore::AddTxdSlot("frontend");
+ printf("LOAD frontend\n");
+ CTxdStore::LoadTxd(slot, "MODELS/FRONTEND.TXD");
+ CTxdStore::SetCurrentTxd(slot);
+ CStreaming::IHaveUsedStreamingMemory();
+ CTimer::Update();
+
+ for(i = 0; i < NUM_SPRIRES; i++)
+ {
+ m_sprites[i].SetTexture(FrontendFilenames[i][0], FrontendFilenames[i][1]);
+ m_sprites[i].SetAddressing(rwTEXTUREADDRESSBORDER);
+ }
+
+ m_bTexturesLoaded = true;
+}
+
+void
+CMenuManager::UnloadTextures(void)
+{
+ int32 slot;
+ int32 i;
+
+ if ( !m_bTexturesLoaded )
+ return;
+
+ slot = CTxdStore::FindTxdSlot("frontend");
+#ifdef FIX_BUGS
+ for(i = 0; i < NUM_SPRIRES; i++)
+ m_sprites[i].Delete();
+#endif
+
+ printf("REMOVE frontend\n");
+ CTxdStore::RemoveTxd(slot);
+ m_bTexturesLoaded = false;
+}
+
+void
+CMenuManager::InitialiseMenusOnce(void)
+{
+ if(m_bInitialised)
+ return;
+ m_bInitialised = true;
+
+ InitialiseChangedLanguageSettings();
+
+ // Normal menu
+ MenuPage_Stats.Initialise();
+ MenuPage_Briefs.Initialise();
+ MenuPage_SaveBasic.Initialise();
+ MenuPage_SaveNewGame.Initialise();
+ MenuPage_SaveLoadGame.Initialise();
+ MenuPage_SaveDeleteGame.Initialise();
+ MenuPage_Controls.Initialise();
+ MenuPage_Audio.Initialise();
+ MenuPage_Display.Initialise();
+ MenuPage_Language.Initialise();
+
+ // Save menu
+ MenuPageSaveZone_SaveGame.Initialise();
+ MenuPageSaveZone_SaveSlots.Initialise();
+ MenuPageSaveZone_SavedSuccessfully.Initialise();
+ MenuPageSaveZone_Message.Initialise();
+ MenuPageSaveZone_QuestionYesNo.Initialise();
+ MenuPageSaveZone_FormatCard.Initialise();
+ MenuPageSaveZone_ErrorFormat.Initialise();
+
+ /* Stats */
+
+ MenuStats_1.ResetNumberOfTextLines();
+ MenuStats_1.SetPosition(X(75.0f), Y(70.0f));
+ MenuStats_1.m_width = X(480.0f);
+ MenuStats_1.m_height = Y(274.0f);
+ MenuStats_1.field_10E8 = 0; // unknown
+ MenuStats_1.m_lineSpacing = Y(20.0f);
+ MenuStats_1.m_scrollSpeed = 1.0f;
+ MenuStats_1.SetLinesColor(SCROLL_TEXT_COLOR);
+ MenuStats_1.ResetNumberOfTextLines();
+ MenuPage_Stats.AddMenu(&MenuStats_1);
+ MenuStats_2.SetPosition(X(75.0f), Y(50.0f));
+ MenuStats_2.SetTextsColor(CRIM_RATING_TEXT_COLOR);
+ MenuPage_Stats.AddMenu(&MenuStats_2);
+ MenuPage_Stats.SetShadows(true, TEXT_SHADOW_COLOR, SHADOW_VECTOR);
+ MenuPage_Stats.ActivatePage();
+
+
+ CVector2D saveGameTextScale(X(0.49f), Y(0.7f));
+ CVector2D defaultTextScale(X(MENU_TEXT_SIZE_X), Y(MENU_TEXT_SIZE_Y));
+
+ /* Basic Load/Delete/New Game */
+
+ MenuSaveB_1.m_numOptions = 0;
+ MenuSaveB_1.SetPosition(X(220.0f), Y(110.0f));
+ MenuSaveB_1.AddOption(TheText.Get("FES_LGA"), 0.0f, Y(20.0f), TriggerSave_LoadGameSelect, false, true);
+ MenuSaveB_1.AddOption(TheText.Get("FES_DGA"), 0.0f, Y(40.0f), TriggerSave_DeleteGameSelect, false, true);
+ MenuSaveB_1.AddOption(TheText.Get("FES_NGA"), 0.0f, Y(60.0f), TriggerSave_NewGameSelectYes, false, true);
+ MenuSaveB_1.SetColors(TITLE_TEXT_COLOR, TEXT_COLOR, TEXT_COLOR);
+ MenuPage_SaveBasic.AddMenu(&MenuSaveB_1);
+ MenuPage_SaveBasic.SetShadows(true, TEXT_SHADOW_COLOR, SHADOW_VECTOR);
+ MenuPage_SaveBasic.ActivatePage();
+
+ /* New Game - but unused */
+
+ MenuSaveNG_1.m_numTexts = 0;
+ MenuSaveNG_1.SetPosition(X(220.0f), Y(110.0f));
+ MenuSaveNG_1.AddText(TheText.Get("FES_LGA"), 0.0f, Y(20.0f), TEXT_COLOR, true);
+ MenuSaveNG_1.AddText(TheText.Get("FES_DGA"), 0.0f, Y(40.0f), TEXT_COLOR, true);
+ MenuSaveNG_1.AddText(TheText.Get("FES_NGA"), 0.0f, Y(60.0f), SELECTED_TEXT_COLOR, true);
+ MenuPage_SaveNewGame.AddMenu(&MenuSaveNG_1);
+ MenuSaveNG_2.m_numOptions = 0;
+ MenuSaveNG_2.SetPosition(X(250.0f), Y(170.0f));
+ MenuSaveNG_2.AddOption(TheText.Get("FEM_NO"), 0.0f, 0.0f, TriggerSave_BackToMainMenu, false, false);
+ MenuSaveNG_2.AddOption(TheText.Get("FEM_YES"), 0.0f, Y(20.0f), TriggerSave_NewGameSelectYes, false, false);
+ MenuSaveNG_2.SetColors(TITLE_TEXT_COLOR, TEXT_COLOR, TEXT_COLOR);
+ MenuSaveNG_2.m_defaultCancel = TriggerSave_BackToMainMenu;
+ MenuPage_SaveNewGame.AddMenu(&MenuSaveNG_2);
+ MenuPage_SaveNewGame.SetShadows(true, TEXT_SHADOW_COLOR, SHADOW_VECTOR);
+ MenuPage_SaveNewGame.ActivatePage();
+
+ /* Load Game */
+
+ MenuSaveLG_1.m_numTexts = 0;
+ MenuSaveLG_1.SetPosition(X(220.0f), Y(110.0f));
+ MenuSaveLG_1.AddText(TheText.Get("FES_LGA"), 0.0f, Y(20.0f), SELECTED_TEXT_COLOR, true);
+ MenuSaveLG_1.AddText(TheText.Get("FES_DGA"), 0.0f, Y(40.0f), TEXT_COLOR, true);
+ MenuSaveLG_1.AddText(TheText.Get("FES_NGA"), 0.0f, Y(60.0f), TEXT_COLOR, true);
+ MenuPage_SaveLoadGame.AddMenu(&MenuSaveLG_1);
+ MenuSaveLG_2.m_numOptions = 0;
+ MenuSaveLG_2.SetPosition(X(250.0f), Y(60.0f));
+ MenuSaveLG_2.SetColors(TITLE_TEXT_COLOR, TEXT_COLOR, TEXT_COLOR);
+ MenuSaveLG_2.m_defaultCancel = TriggerSave_BackToMainMenuTwoLines;
+ MenuSaveLG_2.SetNewOldTextScale(true, saveGameTextScale, defaultTextScale, false);
+ MenuPage_SaveLoadGame.AddMenu(&MenuSaveLG_2);
+ MenuPage_SaveLoadGame.SetShadows(true, TEXT_SHADOW_COLOR, SHADOW_VECTOR);
+ MenuPage_SaveLoadGame.ActivatePage();
+
+ /* Delete Game */
+
+ MenuSaveDG_1.m_numTexts = 0;
+ MenuSaveDG_1.SetPosition(X(220.0f), Y(110.0f));
+ MenuSaveDG_1.AddText(TheText.Get("FES_LGA"), 0.0f, Y(20.0f), TEXT_COLOR, true);
+ MenuSaveDG_1.AddText(TheText.Get("FES_DGA"), 0.0f, Y(40.0f), SELECTED_TEXT_COLOR, true);
+ MenuSaveDG_1.AddText(TheText.Get("FES_NGA"), 0.0f, Y(60.0f), TEXT_COLOR, true);
+ MenuPage_SaveDeleteGame.AddMenu(&MenuSaveDG_1);
+ MenuSaveDG_2.m_numOptions = 0;
+ MenuSaveDG_2.SetPosition(X(250.0f), Y(60.0f));
+ MenuSaveDG_2.SetColors(TITLE_TEXT_COLOR, TEXT_COLOR, TEXT_COLOR);
+ MenuSaveDG_2.m_defaultCancel = TriggerSave_BackToMainMenuTwoLines;
+ MenuSaveDG_2.SetNewOldTextScale(true, saveGameTextScale, defaultTextScale, false);
+ MenuPage_SaveDeleteGame.AddMenu(&MenuSaveDG_2);
+ MenuPage_SaveDeleteGame.SetShadows(true, TEXT_SHADOW_COLOR, SHADOW_VECTOR);
+ MenuPage_SaveDeleteGame.ActivatePage();
+
+
+ CVector2D briefsTextScale(X(0.525f), Y(0.7f));
+ CVector2D defaultTextScale1(X(MENU_TEXT_SIZE_X), Y(MENU_TEXT_SIZE_Y));
+
+ /* Briefs */
+
+ MenuBriefs_1.m_numTexts = 0;
+ MenuBriefs_1.SetPosition(X(60.0f), Y(60.0f));
+ MenuBriefs_1.SetTextsColor(TEXT_COLOR);
+ MenuBriefs_1.SetNewOldTextScale(true, briefsTextScale, defaultTextScale1);
+ MenuBriefs_1.SetNewOldShadowWrapX(true, X(600.0f+SHADOW_VECTOR.x), X(600.0f));
+ MenuPage_Briefs.AddMenu(&MenuBriefs_1);
+ MenuPage_Briefs.AddMenu(&MenuBriefs_2);
+ MenuPage_Briefs.SetShadows(true, TEXT_SHADOW_COLOR, SHADOW_VECTOR);
+ MenuPage_Briefs.ActivatePage();
+
+
+ CVector2D defaultTextScale2(X(MENU_TEXT_SIZE_X), Y(MENU_TEXT_SIZE_Y));
+ CVector2D defaultTextScale3(X(MENU_TEXT_SIZE_X), Y(MENU_TEXT_SIZE_Y));
+ CVector2D CONTR_DESCR_NEW_TEXTSCALE_scaled(X(CONTR_DESCR_NEW_TEXTSCALE.x), Y(CONTR_DESCR_NEW_TEXTSCALE.y));
+ CVector2D CONFIGS_NEW_TEXTSCALE_scaled(X(CONFIGS_NEW_TEXTSCALE.x), Y(CONFIGS_NEW_TEXTSCALE.y));
+
+ /* Controls */
+
+ MenuControls_3.m_numTexts = 0;
+ MenuControls_3.m_numSprites = 0;
+ MenuControls_3.SetPosition(X(170.0f), Y(88.0f));
+ MenuControls_3.AddPicture(&m_sprites[FE_CONTROLLER],
+ &m_sprites[FE_CONTROLLERSH],
+ 0.0f, 0.0f, X(235.2f), Y(175.2), CRGBA(255, 255, 255, 255));
+ MenuControls_3.AddPicture(&m_sprites[FE_ARROWS1],
+ 0.0f, 0.0f, X(235.2f), Y(175.2), CRGBA(255, 255, 255, 255));
+ MenuControls_3.SetNewOldTextScale(true, CONTR_DESCR_NEW_TEXTSCALE_scaled, defaultTextScale2);
+ InitialiseTextsInMenuControllerOnFoot(&MenuControls_3, CMenuManager::m_PrefsControllerConfig);
+ MenuControls_3.SetShadows(true, TEXT_SHADOW_COLOR, SHADOW_VECTOR);
+ MenuControls_3.SetNewOldShadowWrapX(true, X(600.0f+SHADOW_VECTOR.x), X(600.0f));
+ MenuPage_Controls.AddMenu(&MenuControls_3);
+
+ MenuControls_6.m_numTexts = 0;
+ MenuControls_6.m_numSprites = 0;
+ MenuControls_6.SetPosition(X(170.0f), Y(88.0f));
+ MenuControls_6.AddPicture(&m_sprites[FE_CONTROLLER],
+ &m_sprites[FE_CONTROLLERSH],
+ 0.0f, 0.0f, X(235.2f), Y(175.2), CRGBA(255, 255, 255, 255));
+ MenuControls_6.AddPicture(&m_sprites[FE_ARROWS3],
+ 0.0f, 0.0f, X(235.2f), Y(175.2), CRGBA(255, 255, 255, 255));
+ MenuControls_6.SetNewOldTextScale(true, CONTR_DESCR_NEW_TEXTSCALE_scaled, defaultTextScale2);
+ InitialiseTextsInMenuControllerOnFoot(&MenuControls_6, CMenuManager::CONFIG_2);
+ MenuControls_6.SetShadows(true, TEXT_SHADOW_COLOR, SHADOW_VECTOR);
+ MenuControls_6.SetNewOldShadowWrapX(true, X(600.0f+SHADOW_VECTOR.x), X(600.0f));
+
+ MenuControls_4.m_numTexts = 0;
+ MenuControls_4.m_numSprites = 0;
+ MenuControls_4.SetPosition(X(170.0f), Y(88.0f));
+ MenuControls_4.AddPicture(&m_sprites[FE_CONTROLLER],
+ &m_sprites[FE_CONTROLLERSH],
+ 0.0f, 0.0f, X(235.2f), Y(175.2), CRGBA(255, 255, 255, 255));
+ MenuControls_4.AddPicture(&m_sprites[FE_ARROWS2],
+ 0.0f, 0.0f, X(235.2f), Y(175.2), CRGBA(255, 255, 255, 255));
+ MenuControls_4.SetNewOldTextScale(true, CONTR_DESCR_NEW_TEXTSCALE_scaled, defaultTextScale2);
+ InitialiseTextsInMenuControllerInCar(&MenuControls_4, CMenuManager::m_PrefsControllerConfig);
+ MenuControls_4.SetShadows(true, TEXT_SHADOW_COLOR, SHADOW_VECTOR);
+ MenuControls_4.SetNewOldShadowWrapX(true, X(600.0f+SHADOW_VECTOR.x), X(600.0f));
+
+ MenuControls_7.m_numTexts = 0;
+ MenuControls_7.m_numSprites = 0;
+ MenuControls_7.SetPosition(X(170.0f), Y(88.0f));
+ MenuControls_7.AddPicture(&m_sprites[FE_CONTROLLER],
+ &m_sprites[FE_CONTROLLERSH],
+ 0.0f, 0.0f, X(235.2f), Y(175.2), CRGBA(255, 255, 255, 255));
+ MenuControls_7.AddPicture(&m_sprites[FE_ARROWS4],
+ 0.0f, 0.0f, X(235.2f), Y(175.2), CRGBA(255, 255, 255, 255));
+ MenuControls_7.SetNewOldTextScale(true, CONTR_DESCR_NEW_TEXTSCALE_scaled, defaultTextScale2);
+ InitialiseTextsInMenuControllerInCar(&MenuControls_7, CMenuManager::CONFIG_2);
+ MenuControls_7.SetShadows(true, TEXT_SHADOW_COLOR, SHADOW_VECTOR);
+ MenuControls_7.SetNewOldShadowWrapX(true, X(600.0f+SHADOW_VECTOR.x), X(600.0f));
+
+ MenuControls_1.m_numOptions = 0;
+ MenuControls_1.SetPosition(X(284.0f), Y(290.0f));
+ MenuControls_1.SetColors(TITLE_TEXT_COLOR, TEXT_COLOR, SELECTED_TEXT_COLOR);
+ MenuControls_1.SetNewOldTextScale(true, CONFIGS_NEW_TEXTSCALE_scaled, defaultTextScale3, false);
+ MenuControls_1.AddTitle(TheText.Get("FEC_CCF"), 0.0f, 0.0f, true);
+ MenuControls_1.AddOption(TheText.Get("FEC_CF1"), X(15.0f), Y(2.0f), TriggerControls_ContrConfig, false, false);
+ MenuControls_1.AddOption(TheText.Get("FEC_CF2"), X(85.0f), Y(2.0f), TriggerControls_ContrConfig, false, false);
+ MenuControls_1.AddOption(TheText.Get("FEC_CF3"), X(155.0f), Y(2.0f), TriggerControls_ContrConfig, false, false);
+ MenuControls_1.AddOption(TheText.Get("FEC_CF4"), X(225.0f), Y(2.0f), TriggerControls_ContrConfig, false, false);
+ MenuPage_Controls.AddMenu(&MenuControls_1);
+ MenuControls_1.m_alwaysTrigger = (CMenuMultiChoiceTriggered::Trigger)TriggerControls_DrawContrConfig;
+ MenuControls_1.m_alwaysHighlightTrigger = (CMenuMultiChoiceTriggered::Trigger)TriggerControls_DrawHNContrConfig;
+ MenuControls_1.m_alwaysNormalTrigger = (CMenuMultiChoiceTriggered::Trigger)TriggerControls_DrawHNContrConfig;
+
+ MenuControls_2.m_numOptions = 0;
+ MenuControls_2.SetPosition(X(284.0f), Y(310.0f));
+ MenuControls_2.SetColors(TITLE_TEXT_COLOR, TEXT_COLOR, SELECTED_TEXT_COLOR);
+ MenuControls_2.SetNewOldTextScale(true, CONFIGS_NEW_TEXTSCALE_scaled, defaultTextScale3, false);
+ MenuControls_2.AddTitle(TheText.Get("FEC_CDP"), 0.0f, 0.0f, true);
+ MenuControls_2.AddOption(TheText.Get("FEC_ONF"), X(15.0f), Y(2.0f), (CMenuMultiChoiceTriggered::Trigger)TriggerControls_ContrDisplay, false, false);
+ MenuControls_2.AddOption(TheText.Get("FEC_INC"), X(105.0f), Y(2.0f), (CMenuMultiChoiceTriggered::Trigger)TriggerControls_ContrDisplay, false, false);
+ MenuPage_Controls.AddMenu(&MenuControls_2);
+ MenuControls_2.m_bTwoState = true;
+ MenuControls_2.SetMenuSelection(0);
+
+ MenuControls_5.SetPosition(X(284.0f), Y(330.0f));
+ MenuControls_5.SetColors(TITLE_TEXT_COLOR, TEXT_COLOR);
+ MenuControls_5.SetNewOldTextScale(true, CONFIGS_NEW_TEXTSCALE_scaled, defaultTextScale3, false);
+ MenuControls_5.AddTitle(TheText.Get("FEC_VIB"), false, 0.0f, 0.0f, true);
+ MenuControls_5.SetOptionPosition(X(15.0f), Y(2.0f), TriggerControls_Vibrations, false);
+ MenuPage_Controls.AddMenu(&MenuControls_5);
+ MenuPage_Controls.SetShadows(true, TEXT_SHADOW_COLOR, SHADOW_VECTOR);
+ MenuPage_Controls.ActivatePage();
+
+
+ /* Audio */
+
+ CVector2D audioOutputScale(X(0.49f), Y(0.63f));
+ CVector2D defaultTextScale4(X(MENU_TEXT_SIZE_X), Y(MENU_TEXT_SIZE_Y));
+
+ FEC_MOVETAB movetab;
+ MenuAudio_1.SetPosition(X(70.0f), Y(80.0f));
+ MenuAudio_1.SetColors(TEXT_COLOR, TEXT_COLOR, SLIDER_LEFT_COLOR, SLIDER_RIGHT_COLOR);
+ MenuAudio_1.AddTitle(TheText.Get("FEA_MUS"), 0.0f, 0.0f);
+ MenuAudio_1.AddTickBox(X(15.0f), Y(20.0f), X(150.0f), Y(5.0f), Y(45.0f), TriggerAudio_MusicVolume, TriggerAudio_MusicVolumeAlways);
+ movetab.right = 1;
+ movetab.left = 2;
+ movetab.down = 3;
+ movetab.up = 3;
+ MenuPage_Audio.AddMenu(&MenuAudio_1, &movetab);
+
+ MenuAudio_4.m_numOptions = 0;
+ MenuAudio_4.SetPosition(X(280.0f), Y(80.0f));
+ MenuAudio_4.SetColors(TITLE_TEXT_COLOR, TEXT_COLOR, SELECTED_TEXT_COLOR);
+ MenuAudio_4.SetNewOldTextScale(true, audioOutputScale, defaultTextScale4, false);
+ MenuAudio_4.AddTitle(TheText.Get("FEA_OUT"), X(AUDIO_OUTPUT_POS.x), Y(AUDIO_OUTPUT_POS.y), false);
+ MenuAudio_4.AddOption(TheText.Get("FEA_ST"), X(-15.0f), Y(30.0f), TriggerAudio_StereoMono, false, false);
+ MenuAudio_4.AddOption(TheText.Get("FEA_MNO"), X(55.0f), Y(30.0f), TriggerAudio_StereoMono, false, false);
+ movetab.right = 2;
+ movetab.left = 0;
+ movetab.down = 3;
+ movetab.up = 3;
+ MenuPage_Audio.AddMenu(&MenuAudio_4, &movetab);
+ MenuAudio_4.m_bTwoState = true;
+
+ MenuAudio_2.SetPosition(X(410.0f), Y(80.0f));
+ MenuAudio_2.SetColors(TEXT_COLOR, TEXT_COLOR, SLIDER_LEFT_COLOR, SLIDER_RIGHT_COLOR);
+ MenuAudio_2.AddTitle(TheText.Get("FEA_SFX"), 0.0f, 0.0f);
+ MenuAudio_2.AddTickBox(X(5.0f), Y(20.0f), X(150.0f), Y(5.0f), Y(45.0f), TriggerAudio_SfxVolume, TriggerAudio_SfxVolumeAlways);
+ movetab.right = 0;
+ movetab.left = 1;
+ movetab.down = 3;
+ movetab.up = 3;
+ MenuPage_Audio.AddMenu(&MenuAudio_2, &movetab);
+
+ MenuAudio_3.m_numOptions = 0;
+ MenuAudio_3.SetPosition(X(50.0f), Y(170.0f));
+ MenuAudio_3.SetColors(TITLE_TEXT_COLOR, CRGBA(64, 64, 64, 255), CRGBA(250, 250, 250, 255));
+ MenuAudio_3.AddTitle(TheText.Get("FEA_RSS"), X(AUDIO_RSTATION_POS.x), Y(AUDIO_RSTATION_POS.y), false);
+ // first row
+ movetab.right = 1;
+ movetab.left = 4;
+ movetab.down = 5;
+ movetab.up = 5;
+ MenuAudio_3.AddOption(&m_sprites[FE_RADIO1], &movetab, 0.0f, Y(18.0f),
+ CVector2D(X(96.0f), YF(72.0f)), TriggerAudio_RadioStation, false);
+ movetab.right = 2;
+ movetab.left = 0;
+ movetab.down = 6;
+ movetab.up = 6;
+ MenuAudio_3.AddOption(&m_sprites[FE_RADIO2], &movetab, X(106.0f), Y(20.0f),
+ CVector2D(X(79.2f), YF(81.0f)), TriggerAudio_RadioStation, false);
+ movetab.right = 3;
+ movetab.left = 1;
+ movetab.down = 7;
+ movetab.up = 7;
+ MenuAudio_3.AddOption(&m_sprites[FE_RADIO5], &movetab, X(210.0f), Y(20.0f),
+ CVector2D(X(86.4f), YF(72.0f)), TriggerAudio_RadioStation, false);
+ movetab.right = 4;
+ movetab.left = 2;
+ movetab.down = 8;
+ movetab.up = 8;
+ MenuAudio_3.AddOption(&m_sprites[FE_RADIO7], &movetab, X(324.0f), Y(5.0f),
+ CVector2D(X(115.2f), YF(102.0f)), TriggerAudio_RadioStation, false);
+ movetab.right = 0;
+ movetab.left = 3;
+ movetab.down = 8;
+ movetab.up = 8;
+ MenuAudio_3.AddOption(&m_sprites[FE_RADIO8], &movetab, X(446.0f), Y(5.0f),
+ CVector2D(X(102.96f), YF(101.4f)), TriggerAudio_RadioStation, false);
+ // second row
+ movetab.right = 6;
+ movetab.left = 8;
+ movetab.down = 0;
+ movetab.up = 0;
+ MenuAudio_3.AddOption(&m_sprites[FE_RADIO3], &movetab, X(60.0f), Y(96.0f),
+ CVector2D(X(87.36f), YF(85.8f)), TriggerAudio_RadioStation, false);
+ movetab.right = 7;
+ movetab.left = 5;
+ movetab.down = 1;
+ movetab.up = 1;
+ MenuAudio_3.AddOption(&m_sprites[FE_RADIO4], &movetab, X(130.0f), Y(72.0f),
+ CVector2D(X(129.6f), YF(129.0f)), TriggerAudio_RadioStation, false);
+ movetab.right = 8;
+ movetab.left = 6;
+ movetab.down = 2;
+ movetab.up = 2;
+ MenuAudio_3.AddOption(&m_sprites[FE_RADIO6], &movetab, X(284.0f), Y(108.0f),
+ CVector2D(X(60.0f), YF(60.0f)), TriggerAudio_RadioStation, false);
+ movetab.right = 5;
+ movetab.left = 7;
+ movetab.down = 3;
+ movetab.up = 3;
+ MenuAudio_3.AddOption(&m_sprites[FE_RADIO9], &movetab, X(404.0f), Y(85.0f),
+ CVector2D(X(81.12f), YF(101.4f)), TriggerAudio_RadioStation, false);
+ movetab.right = 2;
+ movetab.left = 0;
+ movetab.down = 1;
+ movetab.up = 1;
+ MenuPage_Audio.AddMenu(&MenuAudio_3, &movetab);
+ MenuPage_Audio.SetShadows(true, TEXT_SHADOW_COLOR, SHADOW_VECTOR);
+ MenuPage_Audio.ActivatePage();
+
+
+ /* Display */
+
+ MenuDisplay_1.SetPosition(X(240.0f), Y(140.0f));
+ MenuDisplay_1.SetColors(TEXT_COLOR, TEXT_COLOR, SLIDER_LEFT_COLOR, SLIDER_RIGHT_COLOR);
+ MenuDisplay_1.m_style = 0; // ticks
+ MenuDisplay_1.AddTitle(TheText.Get("FED_BRI"), X(DISPLAY_BRIGHTNESS_POS.x), Y(DISPLAY_BRIGHTNESS_POS.y));
+ MenuDisplay_1.AddTickBox(X(-30.0f), Y(20.0f), X(200.0f), Y(40.0f), Y(40.0f));
+ MenuPage_Display.AddMenu(&MenuDisplay_1);
+ MenuDisplay_2.SetPosition(X(290.0f), Y(240.0f));
+ MenuDisplay_2.SetColors(TITLE_TEXT_COLOR, TEXT_COLOR);
+ MenuDisplay_2.AddTitle(TheText.Get("FED_TRA"), false, 0.0f, 0.0f, true);
+#ifdef GTA_PC
+ MenuDisplay_2.SetOptionPosition(X(40.0f), 0.0f, TriggerDisplay_Trails, false);
+#else
+ MenuDisplay_2.SetOptionPosition(X(40.0f), 0.0f, false);
+#endif
+ MenuDisplay_2.m_bTwoState = true;
+ MenuPage_Display.AddMenu(&MenuDisplay_2);
+ MenuDisplay_3.SetPosition(X(290.0f), Y(260.0f));
+ MenuDisplay_3.SetColors(TITLE_TEXT_COLOR, TEXT_COLOR);
+ MenuDisplay_3.AddTitle(TheText.Get("FED_SUB"), false, 0.0f, 0.0f, true);
+ MenuDisplay_3.SetOptionPosition(X(40.0f), 0.0f, false);
+ MenuDisplay_3.m_bTwoState = true;
+ MenuPage_Display.AddMenu(&MenuDisplay_3);
+ MenuDisplay_4.SetPosition(X(290.0f), Y(280.0f));
+ MenuDisplay_4.SetColors(TITLE_TEXT_COLOR, TEXT_COLOR);
+ MenuDisplay_4.AddTitle(TheText.Get("FED_WIS"), false, 0.0f, 0.0f, true);
+ MenuDisplay_4.SetOptionPosition(X(40.0f), 0.0f, false);
+ MenuDisplay_4.m_bTwoState = true;
+ MenuPage_Display.AddMenu(&MenuDisplay_4);
+ MenuPage_Display.SetShadows(true, TEXT_SHADOW_COLOR, SHADOW_VECTOR);
+ MenuPage_Display.ActivatePage();
+
+
+ /* Language */
+ MenuLanguage_1.m_numOptions = 0;
+ MenuLanguage_1.SetPosition(X(288.0f), Y(160.0f));
+ MenuLanguage_1.SetColors(TITLE_TEXT_COLOR, TEXT_COLOR, SELECTED_TEXT_COLOR);
+ MenuLanguage_1.AddOption(TheText.Get("FEL_ENG"), 0.0f, 0.0f, TriggerLanguage_Language, false, false);
+ MenuLanguage_1.AddOption(TheText.Get("FEL_FRE"), 0.0f, Y(20.0f), TriggerLanguage_Language, false, false);
+ MenuLanguage_1.AddOption(TheText.Get("FEL_GER"), 0.0f, Y(40.0f), TriggerLanguage_Language, false, false);
+ MenuLanguage_1.AddOption(TheText.Get("FEL_ITA"), 0.0f, Y(60.0f), TriggerLanguage_Language, false, false);
+ MenuLanguage_1.AddOption(TheText.Get("FEL_SPA"), 0.0f, Y(80.0f), TriggerLanguage_Language, false, false);
+ MenuPage_Language.AddMenu(&MenuLanguage_1);
+ MenuPage_Language.SetShadows(true, TEXT_SHADOW_COLOR, SHADOW_VECTOR);
+ MenuPage_Language.ActivatePage();
+
+
+ /*
+ * Save zone menu
+ */
+
+ CVector2D saveGameTextScale2(X(0.49f), Y(0.7f));
+ CVector2D defaultTextScale5(X(MENU_TEXT_SIZE_X), Y(MENU_TEXT_SIZE_Y));
+
+ /* Save game */
+
+ MenuSaveZoneSG_1.m_numOptions = 0;
+ MenuSaveZoneSG_1.SetPosition(X(200.0f), Y(100.0f));
+ MenuSaveZoneSG_1.SetColors(TITLE_TEXT_COLOR, TEXT_COLOR, TEXT_COLOR);
+ MenuSaveZoneSG_1.AddOption(TheText.Get("FESZ_SA"), 0.0f, Y(20.0f), TriggerSaveZone_SaveGameSelect, false, false);
+ MenuSaveZoneSG_1.AddOption(TheText.Get("FESZ_CA"), 0.0f, Y(40.0f), TriggerSaveZone_QuitMenu, false, false);
+ MenuSaveZoneSG_1.m_defaultCancel = TriggerSaveZone_QuitMenu;
+ MenuPageSaveZone_SaveGame.AddMenu(&MenuSaveZoneSG_1);
+ MenuSaveZoneSG_1.SetMenuSelection(1);
+ MenuPageSaveZone_SaveGame.SetShadows(true, TEXT_SHADOW_COLOR, SHADOW_VECTOR);
+ MenuPageSaveZone_SaveGame.ActivatePage();
+
+ /* Select slot */
+
+ MenuSaveZoneSSL_1.m_numOptions = 0;
+ MenuSaveZoneSSL_1.SetPosition(X(160.0f), Y(100.0f));
+ MenuSaveZoneSSL_1.SetColors(TITLE_TEXT_COLOR, TEXT_COLOR, TEXT_COLOR);
+ MenuSaveZoneSSL_1.AddOption(TheText.Get("FESZ_CA"), 0.0f, 0.0f, TriggerSaveZone_BackToMainMenuTwoLines, false, false);
+ MenuSaveZoneSSL_1.SetNewOldTextScale(true, saveGameTextScale2, defaultTextScale5, true);
+ MenuPageSaveZone_SaveSlots.AddMenu(&MenuSaveZoneSSL_1);
+ MenuSaveZoneSSL_1.SetMenuSelection(0);
+ MenuPageSaveZone_SaveSlots.SetShadows(true, TEXT_SHADOW_COLOR, SHADOW_VECTOR);
+ MenuPageSaveZone_SaveSlots.ActivatePage();
+
+ /* Save successful */
+
+ MenuSaveZoneSS_1.m_numTexts = 0;
+ MenuSaveZoneSS_1.SetPosition(X(200.0f), Y(100.0f));
+ MenuSaveZoneSS_1.AddText(TheText.Get("FESZ_L1"), X(-40.0f), 0.0f, TITLE_TEXT_COLOR, false);
+ MenuSaveZoneSS_1.AddText(TheText.Get("FESZ_L2"), X(-40.0f), Y(20.0f), TITLE_TEXT_COLOR, false);
+ // twice this line?
+ MenuSaveZoneSS_1.AddText(TheText.Get("FESZ_L2"), X(-40.0f), Y(40.0f), TEXT_COLOR, false);
+ MenuPageSaveZone_SavedSuccessfully.AddMenu(&MenuSaveZoneSS_1);
+ MenuSaveZoneSS_2.m_numOptions = 0;
+ MenuSaveZoneSS_2.SetPosition(X(200.0f), Y(170.0f));
+ MenuSaveZoneSS_2.SetColors(TITLE_TEXT_COLOR, TEXT_COLOR, TEXT_COLOR);
+ MenuSaveZoneSS_2.AddOption(TheText.Get("FESZ_QU"), X(60.0f), 0.0f, TriggerSaveZone_QuitMenu, false, false);
+ MenuPageSaveZone_SavedSuccessfully.AddMenu(&MenuSaveZoneSS_2);
+ MenuPageSaveZone_SavedSuccessfully.SetShadows(true, TEXT_SHADOW_COLOR, SHADOW_VECTOR);
+ MenuPageSaveZone_SavedSuccessfully.ActivatePage();
+
+
+ MenuSaveZoneMSG_1.m_numTexts = 0;
+ MenuSaveZoneMSG_1.SetPosition(X(170.0f), Y(130.0f));
+ MenuSaveZoneMSG_1.AddText(TheText.Get("FESZ_SR"), X(-40.0f), 0.0f, TEXT_COLOR, false);
+ MenuSaveZoneMSG_1.SetTextsColor(TEXT_COLOR);
+ MenuSaveZoneMSG_1.SetNewOldShadowWrapX(true, X(600.0f+SHADOW_VECTOR.x-20.0f), X(580.0f));
+ MenuPageSaveZone_Message.AddMenu(&MenuSaveZoneMSG_1);
+ MenuSaveZoneMSG_2.m_numOptions = 0;
+ MenuSaveZoneMSG_2.SetPosition(X(170.0f), Y(180.0f));
+ MenuSaveZoneMSG_2.SetColors(TITLE_TEXT_COLOR, TEXT_COLOR, TEXT_COLOR);
+ MenuSaveZoneMSG_2.AddOption(TheText.Get("FESZ_OK"), X(40.0f), 0.0f, TriggerSaveZone_QuitMenu, false, false);
+ MenuPageSaveZone_Message.AddMenu(&MenuSaveZoneMSG_2);
+ MenuPageSaveZone_Message.SetShadows(true, TEXT_SHADOW_COLOR, SHADOW_VECTOR);
+ MenuPageSaveZone_Message.ActivatePage();
+
+
+ MenuSaveZoneQYN_1.m_numTexts = 0;
+ MenuSaveZoneQYN_1.SetPosition(X(170.0f), Y(130.0f));
+ MenuSaveZoneQYN_1.AddText(TheText.Get("FESZ_SR"), X(-40.0f), 0.0f, TEXT_COLOR, false);
+ MenuSaveZoneQYN_1.SetTextsColor(TEXT_COLOR);
+ MenuSaveZoneQYN_1.SetNewOldShadowWrapX(true, X(600.0f+SHADOW_VECTOR.x-20.0f), X(580.0f));
+ MenuPageSaveZone_QuestionYesNo.AddMenu(&MenuSaveZoneQYN_1);
+ MenuSaveZoneQYN_2.m_numOptions = 0;
+ MenuSaveZoneQYN_2.SetPosition(X(170.0f), Y(180.0f));
+ MenuSaveZoneQYN_2.SetColors(TITLE_TEXT_COLOR, TEXT_COLOR, TEXT_COLOR);
+ MenuSaveZoneQYN_2.AddOption(TheText.Get("FEM_YES"), X(80.0f), 0.0f, TriggerSaveZone_QuitMenu, false, false);
+ MenuSaveZoneQYN_2.AddOption(TheText.Get("FEM_NO"), X(80.0f), Y(20.0f), TriggerSaveZone_QuitMenu, false, false);
+ MenuPageSaveZone_QuestionYesNo.AddMenu(&MenuSaveZoneQYN_2);
+ MenuPageSaveZone_QuestionYesNo.SetShadows(true, TEXT_SHADOW_COLOR, SHADOW_VECTOR);
+ MenuPageSaveZone_QuestionYesNo.ActivatePage();
+
+ /* Format card */
+
+ MenuSaveZoneFC_1.m_numOptions = 0;
+ MenuSaveZoneFC_1.SetPosition(X(200.0f), Y(100.0f));
+ MenuSaveZoneFC_1.SetColors(TITLE_TEXT_COLOR, TEXT_COLOR, TEXT_COLOR);
+ MenuSaveZoneFC_1.AddTitle(TheText.Get("FESZ_FM"), X(-100.0f), 0.0f, false);
+ MenuSaveZoneFC_1.AddOption(TheText.Get("FEM_NO"), X(40.0f), Y(95.0f), TriggerSaveZone_BackToMainMenu, false, false);
+ MenuSaveZoneFC_1.AddOption(TheText.Get("FEM_YES"), X(40.0f), Y(75.0f), TriggerSaveZone_FormatCardSelect, false, false);
+ MenuSaveZoneFC_1.m_defaultCancel = TriggerSaveZone_FormatCardSelect;
+ MenuPageSaveZone_FormatCard.AddMenu(&MenuSaveZoneFC_1);
+ MenuPageSaveZone_FormatCard.SetShadows(true, TEXT_SHADOW_COLOR, SHADOW_VECTOR);
+ MenuPageSaveZone_FormatCard.ActivatePage();
+
+ /* Format error */
+
+ MenuSaveZoneEF_1.m_numOptions = 0;
+ MenuSaveZoneEF_1.SetPosition(X(200.0f), Y(100.0f));
+ MenuSaveZoneEF_1.SetColors(TITLE_TEXT_COLOR, TEXT_COLOR, TEXT_COLOR);
+ MenuSaveZoneEF_1.AddTitle(TheText.Get("FESZ_FF"), X(-40.0f), 0.0f, false);
+ MenuSaveZoneEF_1.AddOption(TheText.Get("FESZ_OK"), X(70.0f), Y(20.0f), TriggerSaveZone_FormatFailedOK, false, false);
+ MenuPageSaveZone_ErrorFormat.AddMenu(&MenuSaveZoneEF_1);
+ MenuPageSaveZone_ErrorFormat.SetShadows(true, TEXT_SHADOW_COLOR, SHADOW_VECTOR);
+ MenuPageSaveZone_ErrorFormat.ActivatePage();
+
+ pActiveMenuPage = &MenuPage_Stats;
+ pActiveMenuPage->ActivatePage();
+
+ InitialiseMenuContents();
+
+ m_bWantToUpdateContent = false;
+}
+
+void
+CMenuManager::InitialiseChangedLanguageSettings(void)
+{
+ if ( bFrontEnd_ReloadObrTxtGxt )
+ {
+ bFrontEnd_ReloadObrTxtGxt = false;
+
+ CTimer::Stop();
+ TheText.Unload();
+ TheText.Load();
+ CTimer::Update();
+
+ FrontEndMenuManager.AnaliseMenuContents();
+ CGame::frenchGame = false;
+ CGame::germanGame = false;
+ if ( m_PrefsAllowNastyGame )
+ CGame::nastyGame = true;
+
+ for ( int32 i = 0; i < NUM_PAGES; i++ )
+ {
+ BUTTONTAB_TEXT_X_SCALES[i] = 1.0f;
+ PANEL_TEXT_X_SCALES[i] = 1.0f;
+ }
+
+ switch ( m_PrefsLanguage )
+ {
+ case LANGUAGE_AMERICAN:
+ {
+ MENU_TEXT_SIZE_X = 0.644f;
+ MENU_TEXT_SIZE_Y = 0.84f;//0.96f;
+
+ BUTTONTAB_TEXT_SIZE_X = 0.35f;
+ BUTTONTAB_TEXT_SIZE_Y = 0.7f;//0.8f;
+
+ BUTTONTAB_TEXT_X_SCALES[6] = 0.94f;
+
+ CONTR_DESCR_NEW_TEXTSCALE.x = 0.4564f;
+ CONTR_DESCR_NEW_TEXTSCALE.y = 0.63f;//0.72f;
+
+ CONFIGS_NEW_TEXTSCALE.x = 0.49f;
+ CONFIGS_NEW_TEXTSCALE.y = 0.7f;//0.8f;
+
+ AUDIO_OUTPUT_POS.x = 0.0f;
+ AUDIO_OUTPUT_POS.y = 0.0f;
+
+ AUDIO_RSTATION_POS.x = 154.0f;
+ AUDIO_RSTATION_POS.y = 0.0f;
+
+ DISPLAY_BRIGHTNESS_POS.x = 0.0f;
+ DISPLAY_BRIGHTNESS_POS.y = 0.0f;
+
+ MEMCARD_ACCESS_MSG_SIZE_X = 0.84f;
+ MEMCARD_ACCESS_MSG_SIZE_Y = 1.12f;//1.28f;
+
+ break;
+ }
+
+ case LANGUAGE_FRENCH:
+ {
+ CGame::frenchGame = true;
+ if ( m_PrefsAllowNastyGame )
+ CGame::nastyGame = false;
+
+ MENU_TEXT_SIZE_X = 0.504f;
+ MENU_TEXT_SIZE_Y = 0.84f;//0.96f;
+
+ BUTTONTAB_TEXT_SIZE_X = 0.32f;
+ BUTTONTAB_TEXT_SIZE_Y = 0.7f;//0.8f;
+
+ BUTTONTAB_TEXT_X_SCALES[0] = 0.84f;
+ BUTTONTAB_TEXT_X_SCALES[3] = 0.84f;
+ PANEL_TEXT_X_SCALES[1] = 0.8f;
+
+ CONTR_DESCR_NEW_TEXTSCALE.x = 0.385f;
+ CONTR_DESCR_NEW_TEXTSCALE.y = 0.63f;//0.72f;
+
+ CONFIGS_NEW_TEXTSCALE.x = 0.455f;
+ CONFIGS_NEW_TEXTSCALE.y = 0.7f;//0.8f;
+
+ AUDIO_OUTPUT_POS.x = -15.0f;
+ AUDIO_OUTPUT_POS.y = 0.0f;
+
+ AUDIO_RSTATION_POS.x = 184.0f;
+ AUDIO_RSTATION_POS.y = 0.0f;
+
+ DISPLAY_BRIGHTNESS_POS.x = 20.0f;
+ DISPLAY_BRIGHTNESS_POS.y = 0.0f;
+
+ MEMCARD_ACCESS_MSG_SIZE_X = 0.84f;
+ MEMCARD_ACCESS_MSG_SIZE_Y = 1.12f;//1.28f;
+
+ break;
+ }
+
+ case LANGUAGE_GERMAN:
+ {
+ CGame::germanGame = true;
+ if ( m_PrefsAllowNastyGame )
+ CGame::nastyGame = false;
+
+ MENU_TEXT_SIZE_X = 0.546f;
+ MENU_TEXT_SIZE_Y = 0.84f;//0.96f;
+
+ BUTTONTAB_TEXT_SIZE_X = 0.32f;
+ BUTTONTAB_TEXT_SIZE_Y = 0.7f;//0.8f;
+
+ CONTR_DESCR_NEW_TEXTSCALE.x = 0.35f;
+ CONTR_DESCR_NEW_TEXTSCALE.y = 0.63f;//0.72f;
+
+ CONFIGS_NEW_TEXTSCALE.x = 0.434f;
+ CONFIGS_NEW_TEXTSCALE.y = 0.7f;//0.8f;
+
+ AUDIO_OUTPUT_POS.x = -15.0f;
+ AUDIO_OUTPUT_POS.y = 0.0f;
+
+ AUDIO_RSTATION_POS.x = 154.0f;
+ AUDIO_RSTATION_POS.y = 0.0f;
+
+ DISPLAY_BRIGHTNESS_POS.x = 20.0f;
+ DISPLAY_BRIGHTNESS_POS.y = 0.0f;
+
+ MEMCARD_ACCESS_MSG_SIZE_X = 0.7f;
+ MEMCARD_ACCESS_MSG_SIZE_Y = 1.12f;//1.28f;
+
+ break;
+ }
+
+ case LANGUAGE_ITALIAN:
+ {
+ MENU_TEXT_SIZE_X = 0.574f;
+ MENU_TEXT_SIZE_Y = 0.84f;//0.96f;
+
+ BUTTONTAB_TEXT_SIZE_X = 0.32f;
+ BUTTONTAB_TEXT_SIZE_Y = 0.7f;//0.8f;
+
+ BUTTONTAB_TEXT_X_SCALES[0] = 0.86f;
+ PANEL_TEXT_X_SCALES[1] = 0.9f;
+
+ CONTR_DESCR_NEW_TEXTSCALE.x = 0.385f;
+ CONTR_DESCR_NEW_TEXTSCALE.y = 0.63f;//0.72f;
+
+ CONFIGS_NEW_TEXTSCALE.x = 0.42f;
+ CONFIGS_NEW_TEXTSCALE.y = 0.7f;//0.8f;
+
+ AUDIO_OUTPUT_POS.x = 10.0f;
+ AUDIO_OUTPUT_POS.y = 0.0f;
+
+ AUDIO_RSTATION_POS.x = 194.0f;
+ AUDIO_RSTATION_POS.y = 0.0f;
+
+ DISPLAY_BRIGHTNESS_POS.x = 10.0f;
+ DISPLAY_BRIGHTNESS_POS.y = 0.0f;
+
+ MEMCARD_ACCESS_MSG_SIZE_X = 0.84f;
+ MEMCARD_ACCESS_MSG_SIZE_Y = 1.12f;//1.28f;
+
+ break;
+ }
+
+ case LANGUAGE_SPANISH:
+ {
+ MENU_TEXT_SIZE_X = 0.546f;
+ MENU_TEXT_SIZE_Y = 0.84f;//0.96f;
+
+ BUTTONTAB_TEXT_SIZE_X = 0.35f;
+ BUTTONTAB_TEXT_SIZE_Y = 0.7f;//0.8f;
+
+ BUTTONTAB_TEXT_X_SCALES[0] = 0.78f;
+ PANEL_TEXT_X_SCALES[1] = 0.95f;
+
+ CONTR_DESCR_NEW_TEXTSCALE.x = 0.364f;
+ CONTR_DESCR_NEW_TEXTSCALE.y = 0.63f;//0.72f;
+
+ CONFIGS_NEW_TEXTSCALE.x = 0.455f;
+ CONFIGS_NEW_TEXTSCALE.y = 0.7f;//0.8f;
+
+ AUDIO_OUTPUT_POS.x = 10.0f;
+ AUDIO_OUTPUT_POS.y = 0.0f;
+
+ AUDIO_RSTATION_POS.x = 124.0f;
+ AUDIO_RSTATION_POS.y = 0.0f;
+
+ DISPLAY_BRIGHTNESS_POS.x = 30.0f;
+ DISPLAY_BRIGHTNESS_POS.y = 0.0f;
+
+ MEMCARD_ACCESS_MSG_SIZE_X = 0.84f;
+ MEMCARD_ACCESS_MSG_SIZE_Y = 1.12f;//1.28f;
+
+ break;
+ }
+ }
+ }
+}
+
+void
+CMenuManager::InitialiseMenuContents(void)
+{
+ if ( m_bWantToUpdateContent == false )
+ {
+ m_bWantToUpdateContent = true;
+
+ m_pageState = PAGESTATE_NORMAL;
+
+ switch ( CPad::GetPad(0)->GetMode() )
+ {
+ case 3: m_PrefsControllerConfig = CONFIG_4; break;
+ case 2: m_PrefsControllerConfig = CONFIG_3; break;
+ case 1: m_PrefsControllerConfig = CONFIG_2; break;
+ case 0: m_PrefsControllerConfig = CONFIG_1; break;
+ }
+
+ MenuControls_1.SetMenuSelection(m_PrefsControllerConfig);
+ MenuControls_5.SetMenuSelection(m_PrefsUseVibration);
+
+ MenuAudio_1.SetMenuSelection(m_PrefsMusicVolume / 127.0f * 100.0f + 0.5f);
+ MenuAudio_2.SetMenuSelection(m_PrefsSfxVolume / 127.0f * 100.0f + 0.5f);
+ MenuAudio_3.SetMenuSelection(m_PrefsRadioStation);
+ MenuAudio_4.SetMenuSelection(m_PrefsStereoMono);
+
+ MenuDisplay_1.SetMenuSelection(m_PrefsBrightness / 512.0f * 100.0f + 0.5f);
+#ifdef PS2
+ m_PrefsShowTrails = BlurOn;
+#else
+ m_PrefsShowTrails = CMBlur::BlurOn;
+#endif
+ MenuDisplay_2.SetMenuSelection(m_PrefsShowTrails);
+ MenuDisplay_3.SetMenuSelection(m_PrefsShowSubtitles);
+ MenuDisplay_4.SetMenuSelection(m_PrefsUseWideScreen);
+
+ MenuLanguage_1.SetMenuSelection(m_PrefsLanguage);
+
+ FillMenuWithMemCardFileListing(&MenuSaveLG_2, TriggerSave_BackToMainMenuTwoLines, TriggerSave_LoadGameLoadGameSelect, nil, 0, 34, 22);
+ FillMenuWithMemCardFileListing(&MenuSaveDG_2, TriggerSave_BackToMainMenuTwoLines, TriggerSave_DeleteGameDeleteGameSelect, nil, 0, 34, 22);
+
+ MenuBriefs_1.m_numTexts = 0;
+ MenuBriefs_1.AddText(TheText.Get("FEB_PMB"), 0.0f, 0.0f, TITLE_TEXT_COLOR, 0); // Previous Mission Briefs:
+
+ static wchar StringsToDisplay[NUMPREVIOUSBRIEFS][256];
+
+ CRGBA newColor;
+ int32 brierY = 36;
+
+ for ( int32 i = NUMPREVIOUSBRIEFS-1; i >= 0; i-- )
+ {
+ tPreviousBrief &brief = CMessages::PreviousBriefs[i];
+ if (brief.m_pText)
+ {
+ CMessages::InsertNumberInString(brief.m_pText,
+ brief.m_nNumber[0], brief.m_nNumber[1],
+ brief.m_nNumber[2], brief.m_nNumber[3],
+ brief.m_nNumber[4], brief.m_nNumber[5], StringsToDisplay[i]);
+ CMessages::InsertStringInString(StringsToDisplay[i], brief.m_pString);
+
+ newColor = TEXT_COLOR;
+ FilterOutColorMarkersFromString(StringsToDisplay[i], newColor);
+
+ if (newColor != TEXT_COLOR)
+ {
+ newColor.r /= 2;
+ newColor.g /= 2;
+ newColor.b /= 2;
+ }
+ MenuBriefs_1.AddText(StringsToDisplay[i], 0.0f, YF((float)brierY), newColor, 0);
+ brierY += 54;
+ }
+ }
+
+ MenuStats_1.m_scrollPosition = 0.0f;
+ MenuStats_1.ResetNumberOfTextLines();
+
+ nStatLinesIndex = 0;
+
+ #define STAT_HEADER(str) do { MenuStats_1.AddTextLine(TheText.Get(str), nil); } while(0)
+ #define STAT_PARAM(str) do { MenuStats_1.AddTextLine(nil, TheText.Get(str)); } while(0)
+ #define STAT_LINE(str, left, isFloat, right) do { MenuStats_1.AddTextLine(TheText.Get(str), PrintStatLine(str, left, isFloat, right)); } while(0)
+
+ int32 nTemp;
+
+ STAT_HEADER("PL_STAT");
+
+ int32 percentCompleted = (CStats::TotalProgressInGame == 0 ? 0 : CStats::ProgressMade * 100.0f / (CGame::nastyGame ? CStats::TotalProgressInGame : CStats::TotalProgressInGame - 1));
+ percentCompleted = Min(percentCompleted, 100);
+
+ STAT_LINE("PER_COM", &percentCompleted, 0, nil);
+
+ STAT_LINE("NMISON", &CStats::MissionsGiven, 0, nil);
+
+ STAT_LINE("FEST_MP", &CStats::MissionsPassed, 0, &CStats::TotalNumberMissions);
+
+ if ( CGame::nastyGame )
+ STAT_LINE("FEST_RP", &CStats::NumberKillFrenziesPassed, 0, &CStats::TotalNumberKillFrenzies);
+
+ CPlayerInfo &player = CWorld::Players[CWorld::PlayerInFocus];
+ float packagesPercent = 0.0f;
+ if (player.m_nTotalPackages != 0)
+ packagesPercent = player.m_nCollectedPackages * 100.0f / player.m_nTotalPackages;
+ int32 nPackagesPercent = packagesPercent;
+ nTemp = 100;
+
+ STAT_LINE("PERPIC", &nPackagesPercent, 0, &nTemp);
+
+ STAT_LINE("NOUNIF", &CStats::NumberOfUniqueJumpsFound, 0, &CStats::TotalNumberOfUniqueJumps);
+
+ STAT_LINE("DAYSPS", &CStats::DaysPassed, 0, nil);
+
+ if ( CGame::nastyGame )
+ {
+ STAT_LINE("PE_WAST", &CStats::PeopleKilledByPlayer, 0, nil);
+ STAT_LINE("PE_WSOT", &CStats::PeopleKilledByOthers, 0, nil);
+ }
+
+ STAT_LINE("CAR_EXP", &CStats::CarsExploded, 0, nil);
+
+ STAT_LINE("TM_BUST", &CStats::TimesArrested, 0, nil);
+
+ STAT_LINE("TM_DED", &CStats::TimesDied, 0, nil);
+
+ nTemp = CStats::PedsKilledOfThisType[PEDTYPE_GANG9] + CStats::PedsKilledOfThisType[PEDTYPE_GANG8]
+ + CStats::PedsKilledOfThisType[PEDTYPE_GANG7] + CStats::PedsKilledOfThisType[PEDTYPE_GANG6]
+ + CStats::PedsKilledOfThisType[PEDTYPE_GANG5] + CStats::PedsKilledOfThisType[PEDTYPE_GANG4]
+ + CStats::PedsKilledOfThisType[PEDTYPE_GANG3] + CStats::PedsKilledOfThisType[PEDTYPE_GANG2]
+ + CStats::PedsKilledOfThisType[PEDTYPE_GANG1];
+ STAT_LINE("GNG_WST", &nTemp, 0, nil);
+
+ nTemp = CStats::PedsKilledOfThisType[PEDTYPE_CRIMINAL];
+ STAT_LINE("DED_CRI", &nTemp, 0, nil);
+
+ STAT_LINE("HEL_DST", &CStats::HelisDestroyed, 0, nil);
+
+ STAT_LINE("KGS_EXP", &CStats::KgsOfExplosivesUsed, 0, nil);
+
+ nTemp = (CStats::InstantHitsFiredByPlayer == 0 ? 0 : CStats::InstantHitsHitByPlayer * 100.0f / CStats::InstantHitsFiredByPlayer);
+ STAT_LINE("ACCURA", &nTemp, 0, nil);
+
+ if (CStats::ElBurroTime > 0)
+ STAT_LINE("ELBURRO", &CStats::ElBurroTime, 0, nil);
+
+ if (CStats::Record4x4One > 0)
+ STAT_LINE("FEST_R1", &CStats::Record4x4One, 0, nil);
+
+ if (CStats::Record4x4Two > 0)
+ STAT_LINE("FEST_R2", &CStats::Record4x4Two, 0, nil);
+
+ if (CStats::Record4x4Three > 0)
+ STAT_LINE("FEST_R3", &CStats::Record4x4Three, 0, nil);
+
+ if (CStats::Record4x4Mayhem > 0)
+ STAT_LINE("FEST_RM", &CStats::Record4x4Mayhem, 0, nil);
+
+ if (CStats::LongestFlightInDodo > 0)
+ STAT_LINE("FEST_LF", &CStats::LongestFlightInDodo, 0, nil);
+
+ if (CStats::TimeTakenDefuseMission > 0)
+ STAT_LINE("FEST_BD", &CStats::TimeTakenDefuseMission, 0, nil);
+
+ STAT_LINE("CAR_CRU", &CStats::CarsCrushed, 0, nil);
+
+ if (CStats::HighestScores[0] > 0)
+ {
+ STAT_HEADER("FEST_BB");
+ STAT_LINE("FEST_H0", &CStats::HighestScores[0], 0, nil);
+ }
+
+ int32 hs = 0;
+ for ( int32 i = 1; i < 5; i++ )
+ hs += CStats::HighestScores[i];
+
+ if (hs > 0)
+ STAT_HEADER("FEST_GC");
+
+ if (CStats::HighestScores[1] > 0)
+ STAT_LINE("FEST_H1", &CStats::HighestScores[1], 0, nil);
+
+ if (CStats::HighestScores[2] > 0)
+ STAT_LINE("FEST_H2", &CStats::HighestScores[2], 0, nil);
+
+ if (CStats::HighestScores[3] > 0)
+ STAT_LINE("FEST_H3", &CStats::HighestScores[3], 0, nil);
+
+ if (CStats::HighestScores[4] > 0)
+ STAT_LINE("FEST_H4", &CStats::HighestScores[4], 0, nil);
+
+ STAT_LINE("FESTDFM", &CStats::DistanceTravelledOnFoot, 0, nil);
+ STAT_LINE("FESTDCM", &CStats::DistanceTravelledInVehicle, 0, nil);
+ STAT_LINE("MMRAIN", &CStats::mmRain, 0, nil);
+ nTemp = (int32)CStats::MaximumJumpDistance;
+ STAT_LINE("MXCARDM", &nTemp, 0, nil);
+ nTemp = (int32)CStats::MaximumJumpHeight;
+ STAT_LINE("MXCARJM", &nTemp, 0, nil);
+
+ STAT_LINE("MXFLIP", &CStats::MaximumJumpFlips, 0, nil);
+ STAT_LINE("MXJUMP", &CStats::MaximumJumpSpins, 0, nil);
+
+ STAT_HEADER("BSTSTU");
+
+ switch (CStats::BestStuntJump)
+ {
+ case 1: STAT_PARAM("INSTUN"); break;
+ case 2: STAT_PARAM("PRINST"); break;
+ case 3: STAT_PARAM("DBINST"); break;
+ case 4: STAT_PARAM("DBPINS"); break;
+ case 5: STAT_PARAM("TRINST"); break;
+ case 6: STAT_PARAM("PRTRST"); break;
+ case 7: STAT_PARAM("QUINST"); break;
+ case 8: STAT_PARAM("PQUINS"); break;
+ default: STAT_PARAM("NOSTUC"); break;
+ }
+
+ STAT_LINE("PASDRO", &CStats::PassengersDroppedOffWithTaxi, 0, nil);
+ STAT_LINE("MONTAX", &CStats::MoneyMadeWithTaxi, 0, nil);
+ STAT_LINE("FEST_LS", &CStats::LivesSavedWithAmbulance, 0, nil);
+ STAT_LINE("FEST_HA", &CStats::HighestLevelAmbulanceMission, 0, nil);
+ STAT_LINE("FEST_CC", &CStats::CriminalsCaught, 0, nil);
+ STAT_LINE("FEST_FE", &CStats::FiresExtinguished, 0, nil);
+ int32 rnd = ((CGeneral::GetRandomNumber() & 255) + 100) * 2384;
+ STAT_LINE("DAYPLC", &rnd, 0, nil);
+
+ #undef STAT_LINE
+
+ MenuStats_2.m_numTexts = 0;
+ MenuStats_2.AddText(TheText.Get("CRIMRA"), 0.0f, 0.0f, CRIM_RATING_TEXT_COLOR, 0);
+
+ char rating[16];
+ wchar urating[16];
+ sprintf(rating, " %d", CStats::FindCriminalRatingNumber());
+ AsciiToUnicode(rating, urating);
+
+ wchar *pStatLine = aStatLines[nStatLinesIndex++];
+ UnicodeStrcpy(pStatLine, CStats::FindCriminalRatingString());
+ UnicodeStrcat(pStatLine, urating);
+
+ MenuStats_2.AddText(pStatLine, X(MenuStats_1.m_width), 0.0f, CRIM_RATING_TEXT_COLOR, 1);
+
+ MenuSaveZoneSG_1.SetMenuSelection(1);
+ MenuSaveZoneFC_1.SetMenuSelection(1);
+ }
+}
+
+
+void
+CMenuManager::AnaliseMenuContents(void)
+{
+ if ( m_bWantToUpdateContent )
+ {
+ m_bWantToUpdateContent = false;
+
+ m_PrefsControllerConfig = (CONTRCONFIG)MenuControls_1.GetMenuSelection();
+ switch ( m_PrefsControllerConfig )
+ {
+ case CONFIG_4: CPad::GetPad(0)->SetMode(3); break;
+ case CONFIG_3: CPad::GetPad(0)->SetMode(2); break;
+ case CONFIG_2: CPad::GetPad(0)->SetMode(1); break;
+ case CONFIG_1: CPad::GetPad(0)->SetMode(0); break;
+ }
+
+ m_PrefsUseVibration = MenuControls_5.m_title.m_bSelected;
+
+ m_PrefsMusicVolume = float(MenuAudio_1.GetMenuSelection())/100.0f*127.0f+0.5f;
+ m_PrefsSfxVolume = float(MenuAudio_2.GetMenuSelection())/100.0f*127.0f+0.5f;
+ m_PrefsRadioStation = MenuAudio_3.GetMenuSelection();
+ m_PrefsStereoMono = MenuAudio_4.GetMenuSelection();
+ m_PrefsBrightness = float(MenuDisplay_1.GetMenuSelection()) / 100.0f*512.0f + 0.5f;
+ m_PrefsShowTrails = MenuDisplay_2.GetMenuSelection();
+ m_PrefsShowSubtitles = MenuDisplay_3.GetMenuSelection();
+ m_PrefsUseWideScreen = MenuDisplay_4.GetMenuSelection();
+#ifdef PS2
+ BlurOn = m_PrefsShowTrails;
+#else
+ CMBlur::BlurOn = m_PrefsShowTrails;
+#endif
+
+ if ( m_PrefsLanguage != MenuLanguage_1.GetMenuSelection() )
+ {
+ m_PrefsLanguage = MenuLanguage_1.GetMenuSelection();
+ m_bInitialised = false;
+ bFrontEnd_ReloadObrTxtGxt = true;
+ }
+ }
+}
+
+void
+CMenuManager::InitialiseMenuContentsAfterLoadingGame(void)
+{
+ if ( MenuLanguage_1.GetMenuSelection() != m_PrefsLanguage )
+ {
+ m_bInitialised = false;
+ bFrontEnd_ReloadObrTxtGxt = true;
+ }
+}
+
+void
+CMenuManager::DrawFrontEnd(void)
+{
+ CFont::SetAlphaFade(255.0f);
+ if(m_bInSaveZone)
+ DrawFrontEndSaveZone();
+ else
+ DrawFrontEndNormal();
+
+ if ( MemCardAccessTriggerCaller.CanCall() )
+ MemCardAccessTriggerCaller.CallTrigger();
+
+ DisplayWarningControllerMsg();
+}
+
+void
+CMenuManager::DrawFrontEndNormal(void)
+{
+ CSprite2d::InitPerFrame();
+ CFont::InitPerFrame();
+
+ if ( bMemoryCardSpecialZone )
+ {
+ static uint8 counter = 0;
+
+ counter++;
+
+ if ( (counter & 63 ) == 0 )
+ {
+ FillMenuWithMemCardFileListing(&MenuSaveLG_2, TriggerSave_BackToMainMenuTwoLines, TriggerSave_LoadGameLoadGameSelect, nil, 0, 34, 22);
+ FillMenuWithMemCardFileListing(&MenuSaveDG_2, TriggerSave_BackToMainMenuTwoLines, TriggerSave_DeleteGameDeleteGameSelect, nil, 0, 34, 22);
+ }
+ }
+
+ m_fade = 255;
+ if ( m_nChangePageTimer != 0 && m_nChangePageTimer >= CTimer::GetTimeInMillisecondsPauseMode() )
+ m_fade = uint32(float(m_nChangePageTimer - CTimer::GetTimeInMillisecondsPauseMode()) / 250.0f * 255.0f);
+
+ m_someAlpha = 255;
+
+ m_position.x = 0.0f;
+ m_position.y = 0.0f;
+
+ if ( m_nStartPauseTimer != 0 && m_nStartPauseTimer >= CTimer::GetTimeInMillisecondsPauseMode() )
+ {
+ float slide = float(m_nStartPauseTimer - CTimer::GetTimeInMillisecondsPauseMode()) / 800.0f;
+ float alpha = 1.0f;
+
+ if ((m_nStartPauseTimer - CTimer::GetTimeInMillisecondsPauseMode()) <= 1600)
+ alpha = float(m_nStartPauseTimer - CTimer::GetTimeInMillisecondsPauseMode()) / 400.0f;
+
+ m_someAlpha = 255 - clamp(alpha, 0.0f, 1.0f) * 255.0f;
+
+ switch ( m_nSlidingDir )
+ {
+ case SLIDE_TO_RIGHT: m_position.x = slide * X(700.0f); break;
+ case SLIDE_TO_TOP: m_position.y = -(slide * Y(500.0f)); break;
+ case SLIDE_TO_LEFT: m_position.x = -(slide * X(700.0f)); break;
+ case SLIDE_TO_BOTTOM: m_position.y = slide * Y(500.0f); break;
+ default: m_position.y = slide * Y(500.0f); break;
+ }
+ }
+
+ if ( m_nEndPauseTimer != 0 && m_nEndPauseTimer >= CTimer::GetTimeInMillisecondsPauseMode() )
+ {
+ float slide = float(m_nEndPauseTimer - CTimer::GetTimeInMillisecondsPauseMode()) / 800.0f;
+ float alpha = float((int32)(m_nEndPauseTimer - CTimer::GetTimeInMillisecondsPauseMode()) + -266) / 533.0f;
+
+ m_someAlpha = clamp(alpha, 0.0f, 1.0f) * 255.0f;
+
+ switch ( m_nSlidingDir )
+ {
+ case SLIDE_TO_TOP: m_position.y = (1.0f - slide) * Y(500.0f); break;
+ case SLIDE_TO_RIGHT: m_position.x = (1.0f - slide) * X(700.0f); break;
+ case SLIDE_TO_LEFT: m_position.x = (1.0f - slide) * X(700.0f); break;
+ case SLIDE_TO_BOTTOM: m_position.y = -((1.0f - slide) * Y(500.0f)); break;
+ default: m_position.y = -((1.0f - slide) * Y(500.0f)); break;
+ }
+ }
+
+ if ( m_someAlpha < 255 )
+ m_fade = m_someAlpha;
+
+ float posX, posY;
+
+ /* Draw splash */
+ RwRenderStateSet(rwRENDERSTATETEXTUREFILTER, (void*)rwFILTERLINEAR);
+ CSprite2d *splash = LoadSplash(nil);
+ if(splash)
+ splash->Draw(CRect(0.0f, 0.0f, SCRW, SCRH), BACKGROUND_SPLASH_COLOR);
+ else
+ // doesn't exist!!
+ CHud::Sprites[19].Draw(CRect(0.0f, 0.0f, SCRW, SCRH), BACKGROUND_SPLASH_COLOR);
+ RwRenderStateSet(rwRENDERSTATETEXTUREFILTER, (void*)rwFILTERMIPNEAREST);
+
+ /* Draw main panel */
+ RwRenderStateSet(rwRENDERSTATETEXTUREADDRESS, (void*)rwTEXTUREADDRESSCLAMP);
+ CRGBA panelColor(255, 255, 255, m_someAlpha);
+ m_sprites[FE2_MAINPANEL_UL].Draw(
+ CRect(m_position.x, m_position.y, m_position.x+SCRW/2.0f, m_position.y+SCRH/2.0f),
+ panelColor);
+ m_sprites[FE2_MAINPANEL_UR].Draw(
+ CRect(m_position.x+SCRW/2.0f, m_position.y, m_position.x+SCRW, m_position.y+SCRH/2.0f),
+ panelColor);
+ m_sprites[FE2_MAINPANEL_DL].Draw(
+ CRect(m_position.x, m_position.y+SCRH/2.0f, m_position.x+SCRW/2.0f, m_position.y+SCRH),
+ panelColor);
+ m_sprites[FE2_MAINPANEL_DR].Draw(
+ CRect(m_position.x+SCRW/2.0f, m_position.y+SCRH/2.0f, m_position.x+SCRW, m_position.y+SCRH),
+ panelColor);
+
+ /* Draw icon backdrop */
+ CRGBA iconColor(255, 255, 255, m_fade*0.75f);
+ float iconX = 48.0f;
+ float iconY = 54.0f;
+ float iconWidth = 540.0f;
+ float iconHeight = 296.0f;
+ int32 sprite = FE_ICONBRIEF;
+
+#ifdef PS2_MENU_USEALLPAGEICONS
+ switch(m_currentPage)
+ {
+ case PAGE_STATS:
+ sprite = FE_ICONSTATS;
+ break;
+ case PAGE_LOAD:
+ sprite = FE_ICONSAVE;
+ break;
+ case PAGE_CONTROLS:
+ sprite = FE_ICONCONTROLS;
+ break;
+ case PAGE_BRIEFS:
+ sprite = FE_ICONBRIEF;
+ break;
+ case PAGE_AUDIO:
+ sprite = FE_ICONAUDIO;
+ break;
+ case PAGE_DISPLAY:
+ sprite = FE_ICONDISPLAY;
+ break;
+ case PAGE_LANGUAGE:
+ sprite = FE_ICONLANGUAGE;
+ break;
+ }
+#else
+ switch(m_currentPage)
+ {
+ case PAGE_STATS:
+ case PAGE_LOAD:
+ case PAGE_CONTROLS:
+ sprite = FE_ICONSTATS; // PS2 has the same texture for stats and brief
+ //sprite = FE_ICONBRIEF;
+ break;
+ case PAGE_BRIEFS:
+ sprite = FE_ICONBRIEF;
+ break;
+ case PAGE_AUDIO:
+ sprite = FE_ICONAUDIO;
+ break;
+ case PAGE_DISPLAY:
+ sprite = FE_ICONDISPLAY;
+ break;
+ case PAGE_LANGUAGE:
+ sprite = FE_ICONLANGUAGE;
+ break;
+ }
+#endif
+ m_sprites[sprite].Draw(
+ CRect_SZ(m_position.x+X(iconX), m_position.y+Y(iconY), X(iconWidth), Y(iconHeight)),
+ iconColor);
+
+ /* Overwrite tab buttons if entered page */
+ bool bOverwriteTab = false;
+
+ switch ( m_pageState )
+ {
+ case PAGESTATE_NORMAL:
+ case PAGESTATE_HIGHLIGHTED:
+ break;
+
+ case PAGESTATE_SELECTED:
+ bOverwriteTab = true;
+ break;
+ }
+
+ if( bOverwriteTab )
+ {
+ CRGBA shadow(41, 101, 102, m_someAlpha);
+ CRGBA green(40, 48, 57, m_someAlpha);
+ CSprite2d::DrawRect(
+ CRect_SZ(m_position.x+X(82.0f), m_position.y+Y(408.0f), X(476.0f), Y(18.0f)),
+ shadow);
+ CSprite2d::DrawRect(
+ CRect_SZ(m_position.x+X(82.0f), m_position.y+Y(408.0f), X(476.0f), Y(5.0f)),
+ green);
+ }
+// stats, load, briefs, controls, audio, display, language
+
+ /* Shadow of panel on top of tab buttons */
+ CRGBA panelShadow(96, 96, 96, m_someAlpha*0.375f);
+ CSprite2d::DrawRect(CRect_SZ(m_position.x+X(87.0f), m_position.y+Y(408.0f), X(464.0f), Y(3.0f)), panelShadow);
+ /* Draw second shadow - seems unused */
+ if ( m_nChangePageTimer != 0 && CTimer::GetTimeInMillisecondsPauseMode() < m_nChangePageTimer )
+ {
+ posX = 0.0f;
+ switch(field_18)
+ {
+ case PAGE_STATS: posX = 88.0f; break;
+ case PAGE_LOAD: posX = 286.0f; break; // actually controls
+ case PAGE_BRIEFS: posX = 154.0f; break; // actually load
+ case PAGE_CONTROLS: posX = 220.0f; break; // actually briefs
+ case PAGE_AUDIO: posX = 352.0f; break;
+ case PAGE_DISPLAY: posX = 418.0f; break;
+ case PAGE_LANGUAGE: posX = 484.0f; break;
+ }
+ CSprite2d::DrawRect(CRect_SZ(m_position.x+X(posX), m_position.y+Y(411.0f), X(65.0f), Y(3.0f)), panelShadow);
+ }
+
+ /* Active tab */
+ posX = 0.0f;
+ switch(m_currentPage)
+ {
+ case PAGE_STATS: posX = 88.0f; break;
+ case PAGE_LOAD: posX = 154.0f; break;
+ case PAGE_BRIEFS: posX = 220.0f; break;
+ case PAGE_CONTROLS: posX = 286.0f; break;
+ case PAGE_AUDIO: posX = 352.0f; break;
+ case PAGE_DISPLAY: posX = 418.0f; break;
+ case PAGE_LANGUAGE: posX = 484.0f; break;
+ }
+ // PAL has 465 for 407 here - and actually 406 seems right
+ m_sprites[FE2_TABACTIVE].Draw(CRect_SZ(m_position.x+X(posX), m_position.y+YF(465.0f), X(128.0f), Y(32.0f)), CRGBA(255, 255, 255, m_someAlpha));
+
+ /* Draw page title */
+ posX = m_position.x + X(592.0f);
+ posY = m_position.y + Y(376.0f);
+ CRGBA fontCol1(255, 193, 71, m_someAlpha);
+ CRGBA fontCol2(0, 0, 0, m_someAlpha);
+ CFont::SetFontStyle(FONT_HEADING);
+ CFont::SetBackgroundOff();
+ CFont::SetScale(X(PANEL_TEXT_SIZE_X), Y(PANEL_TEXT_SIZE_Y));
+ CFont::SetPropOn();
+ CFont::SetCentreOff();
+ CFont::SetJustifyOn();
+ CFont::SetRightJustifyWrap(0.0f);
+ CFont::SetRightJustifyOn();
+ CFont::SetBackGroundOnlyTextOn();
+ CFont::SetWrapx(SCRW-X(40.0f)); // 600.0f
+ const char *key = nil;
+ switch(m_currentPage)
+ {
+ case PAGE_STATS: key = "FEP_STA"; break;
+ case PAGE_LOAD: key = "FEP_SAV"; break;
+ case PAGE_BRIEFS: key = "FEP_BRI"; break;
+ case PAGE_CONTROLS: key = "FEP_CON"; break;
+ case PAGE_AUDIO: key = "FEP_AUD"; break;
+ case PAGE_DISPLAY: key = "FEP_DIS"; break;
+ case PAGE_LANGUAGE: key = "FEP_LAN"; break;
+ }
+ CFont::SetScale(X(PANEL_TEXT_SIZE_X*PANEL_TEXT_X_SCALES[m_currentPage]), Y(PANEL_TEXT_SIZE_Y));
+ CFont::SetColor(fontCol1);
+ CFont::PrintString(posX, posY, TheText.Get(key));
+ CFont::SetColor(fontCol2);
+ CFont::PrintString(posX-X(1.0f), posY-Y(1.0f), TheText.Get(key));
+ CFont::DrawFonts();
+
+ /* Draw controller buttons */
+ CFont::SetFontStyle(FONT_BANK);
+ CFont::SetBackgroundOff();
+ CFont::SetScale(X(0.35f), Y(0.64f));
+ CFont::SetPropOn();
+ CFont::SetCentreOff();
+ CFont::SetJustifyOn();
+ CFont::SetRightJustifyOff();
+ CFont::SetBackGroundOnlyTextOn();
+ CFont::SetWrapx(SCRW-X(40.0f)); // 600.0f
+ CFont::SetColor(CRGBA(16, 16, 16, m_someAlpha));
+ switch(m_currentPage)
+ {
+ case PAGE_STATS:
+ CFont::PrintString(m_position.x+X(52.0f), m_position.y+Y(360.0f), TheText.Get("FEDS_ST"));
+ CFont::PrintString(m_position.x+X(52.0f), m_position.y+Y(372.0f), TheText.Get("FEDS_AM"));
+ CFont::PrintString(m_position.x+X(242.0f), m_position.y+Y(360.0f), TheText.Get("FEDSSC1"));
+ CFont::PrintString(m_position.x+X(242.0f), m_position.y+Y(372.0f), TheText.Get("FEDSSC2"));
+ break;
+
+ case PAGE_BRIEFS:
+ CFont::PrintString(m_position.x+X(52.0f), m_position.y+Y(360.0f), TheText.Get("FEDS_ST"));
+ CFont::PrintString(m_position.x+X(52.0f), m_position.y+Y(372.0f), TheText.Get("FEDS_AM"));
+ break;
+
+ case PAGE_LOAD:
+ case PAGE_CONTROLS:
+ case PAGE_AUDIO:
+ case PAGE_DISPLAY:
+ case PAGE_LANGUAGE:
+ {
+ CFont::PrintString(m_position.x+X(52.0f), m_position.y+Y(360.0f), TheText.Get("FEDS_SE"));
+ CFont::PrintString(m_position.x+X(52.0f), m_position.y+Y(372.0f), TheText.Get("FEDS_BA"));
+ CFont::PrintString(m_position.x+X(52.0f), m_position.y+Y(384.0f), TheText.Get("FEDS_ST"));
+
+ switch ( m_pageState )
+ {
+ case PAGESTATE_NORMAL:
+ CFont::PrintString(m_position.x+X(242.0f), m_position.y+Y(372.0f), TheText.Get("FEDS_AM")); // <>-CHANGE MENU
+ break;
+
+ case PAGESTATE_HIGHLIGHTED:
+ case PAGESTATE_SELECTED:
+ {
+ CFont::PrintString(m_position.x+X(242.0f), m_position.y+Y(360.0f+3.5f), TheText.Get("FEA_UP")); // ;
+ CFont::PrintString(m_position.x+X(242.0f), m_position.y+Y(384.0f-3.5f), TheText.Get("FEA_DO")); // =
+ CFont::PrintString(m_position.x+X(242.0f-10.0f), m_position.y+Y(372.0f), TheText.Get("FEA_LE")); // <
+ CFont::PrintString(m_position.x+X(242.0f+11.0f), m_position.y+Y(372.0f), TheText.Get("FEA_RI")); // >
+ CFont::PrintString(m_position.x+X(242.0f+20.0f), m_position.y+Y(372.0f), TheText.Get("FEDSAS3")); // - CHANGE SELECTION
+
+ break;
+ }
+ }
+
+ break;
+ }
+ }
+
+ CFont::DrawFonts();
+
+ /* Draw tab button texts */
+ CFont::SetFontStyle(FONT_BANK);
+ CFont::SetBackgroundOff();
+ CFont::SetScale(X(BUTTONTAB_TEXT_SIZE_X), Y(BUTTONTAB_TEXT_SIZE_Y));
+ CFont::SetPropOn();
+ CFont::SetCentreOn();
+ CFont::SetRightJustifyOff();
+ CFont::SetBackGroundOnlyTextOn();
+ CFont::SetWrapx(SCRW-X(40.0f)); // 600.0f
+
+ switch ( m_pageState )
+ {
+ case PAGESTATE_NORMAL:
+ {
+ CFont::SetColor(CRGBA(16, 16, 16, m_someAlpha));
+ CFont::SetScale(X(BUTTONTAB_TEXT_SIZE_X*BUTTONTAB_TEXT_X_SCALES[PAGE_STATS]), Y(BUTTONTAB_TEXT_SIZE_Y));
+ CFont::PrintString(m_position.x+X(92.0f), m_position.y+Y(408.0f), TheText.Get("FEB_STA"));
+ CFont::SetScale(X(BUTTONTAB_TEXT_SIZE_X*BUTTONTAB_TEXT_X_SCALES[PAGE_LOAD]), Y(BUTTONTAB_TEXT_SIZE_Y));
+ CFont::PrintString(m_position.x+X(158.0f), m_position.y+Y(408.0f), TheText.Get("FEB_SAV"));
+ CFont::SetScale(X(BUTTONTAB_TEXT_SIZE_X*BUTTONTAB_TEXT_X_SCALES[PAGE_BRIEFS]), Y(BUTTONTAB_TEXT_SIZE_Y));
+ CFont::PrintString(m_position.x+X(224.0f), m_position.y+Y(408.0f), TheText.Get("FEB_BRI"));
+ CFont::SetScale(X(BUTTONTAB_TEXT_SIZE_X*BUTTONTAB_TEXT_X_SCALES[PAGE_CONTROLS]), Y(BUTTONTAB_TEXT_SIZE_Y));
+ CFont::PrintString(m_position.x+X(290.0f), m_position.y+Y(408.0f), TheText.Get("FEB_CON"));
+ CFont::SetScale(X(BUTTONTAB_TEXT_SIZE_X*BUTTONTAB_TEXT_X_SCALES[PAGE_AUDIO]), Y(BUTTONTAB_TEXT_SIZE_Y));
+ CFont::PrintString(m_position.x+X(356.0f), m_position.y+Y(408.0f), TheText.Get("FEB_AUD"));
+ CFont::SetScale(X(BUTTONTAB_TEXT_SIZE_X*BUTTONTAB_TEXT_X_SCALES[PAGE_DISPLAY]), Y(BUTTONTAB_TEXT_SIZE_Y));
+ CFont::PrintString(m_position.x+X(422.0f), m_position.y+Y(408.0f), TheText.Get("FEB_DIS"));
+ CFont::SetScale(X(BUTTONTAB_TEXT_SIZE_X*BUTTONTAB_TEXT_X_SCALES[PAGE_LANGUAGE]), Y(BUTTONTAB_TEXT_SIZE_Y));
+ CFont::PrintString(m_position.x+X(488.0f), m_position.y+Y(408.0f), TheText.Get("FEB_LAN"));
+
+ break;
+ }
+
+ case PAGESTATE_HIGHLIGHTED:
+ case PAGESTATE_SELECTED:
+ {
+ CFont::SetColor(CRGBA(16, 16, 16, m_someAlpha));
+ switch(m_currentPage)
+ {
+ // PAL has 466 for 408...probably rounded?
+ case PAGE_STATS:
+ CFont::SetScale(X(BUTTONTAB_TEXT_SIZE_X*BUTTONTAB_TEXT_X_SCALES[PAGE_STATS]), Y(BUTTONTAB_TEXT_SIZE_Y));
+ CFont::PrintString(m_position.x+X(92.0f), m_position.y+Y(408.0f), TheText.Get("FEB_STA"));
+ break;
+ case PAGE_LOAD:
+ CFont::SetScale(X(BUTTONTAB_TEXT_SIZE_X*BUTTONTAB_TEXT_X_SCALES[PAGE_LOAD]), Y(BUTTONTAB_TEXT_SIZE_Y));
+ CFont::PrintString(m_position.x+X(158.0f), m_position.y+Y(408.0f), TheText.Get("FEB_SAV"));
+ break;
+ case PAGE_BRIEFS:
+ CFont::SetScale(X(BUTTONTAB_TEXT_SIZE_X*BUTTONTAB_TEXT_X_SCALES[PAGE_BRIEFS]), Y(BUTTONTAB_TEXT_SIZE_Y));
+ CFont::PrintString(m_position.x+X(224.0f), m_position.y+Y(408.0f), TheText.Get("FEB_BRI"));
+ break;
+ case PAGE_CONTROLS:
+ CFont::SetScale(X(BUTTONTAB_TEXT_SIZE_X*BUTTONTAB_TEXT_X_SCALES[PAGE_CONTROLS]), Y(BUTTONTAB_TEXT_SIZE_Y));
+ CFont::PrintString(m_position.x+X(290.0f), m_position.y+Y(408.0f), TheText.Get("FEB_CON"));
+ break;
+ case PAGE_AUDIO:
+ CFont::SetScale(X(BUTTONTAB_TEXT_SIZE_X*BUTTONTAB_TEXT_X_SCALES[PAGE_AUDIO]), Y(BUTTONTAB_TEXT_SIZE_Y));
+ CFont::PrintString(m_position.x+X(356.0f), m_position.y+Y(408.0f), TheText.Get("FEB_AUD"));
+ break;
+ case PAGE_DISPLAY:
+ CFont::SetScale(X(BUTTONTAB_TEXT_SIZE_X*BUTTONTAB_TEXT_X_SCALES[PAGE_DISPLAY]), Y(BUTTONTAB_TEXT_SIZE_Y));
+ CFont::PrintString(m_position.x+X(422.0f), m_position.y+Y(408.0f), TheText.Get("FEB_DIS"));
+ break;
+ case PAGE_LANGUAGE:
+ CFont::SetScale(X(BUTTONTAB_TEXT_SIZE_X*BUTTONTAB_TEXT_X_SCALES[PAGE_LANGUAGE]), Y(BUTTONTAB_TEXT_SIZE_Y));
+ CFont::PrintString(m_position.x+X(488.0f), m_position.y+Y(408.0f), TheText.Get("FEB_LAN"));
+ break;
+ }
+
+ break;
+ }
+ }
+
+ CFont::DrawFonts();
+
+ pActiveMenuPage = nil;
+ switch(m_currentPage)
+ {
+ case PAGE_STATS: pActiveMenuPage = &MenuPage_Stats; break;
+ case PAGE_LOAD: pActiveMenuPage = pMenuSave; break;
+ case PAGE_BRIEFS: pActiveMenuPage = &MenuPage_Briefs; break;
+ case PAGE_CONTROLS: pActiveMenuPage = &MenuPage_Controls; break;
+ case PAGE_AUDIO: pActiveMenuPage = &MenuPage_Audio; break;
+ case PAGE_DISPLAY: pActiveMenuPage = &MenuPage_Display; break;
+ case PAGE_LANGUAGE: pActiveMenuPage = &MenuPage_Language; break;
+ }
+
+ CFont::SetFontStyle(FONT_BANK);
+ CFont::SetBackgroundOff();
+ CFont::SetScale(X(MENU_TEXT_SIZE_X), Y(MENU_TEXT_SIZE_Y));
+ CFont::SetPropOn();
+ CFont::SetCentreOff();
+ CFont::SetJustifyOn();
+ CFont::SetRightJustifyOff();
+ CFont::SetBackGroundOnlyTextOn();
+ CFont::SetWrapx(SCRW-X(40.0f)); // 600.0f
+ CFont::SetRightJustifyWrap(X(38.0f));
+
+ if(m_currentPage == PAGE_LANGUAGE)
+ {
+ CFont::SetCentreOn();
+ CFont::SetCentreSize(SCRW-X(40.0f)); // 600.0f
+ }
+
+ if ( m_nEndPauseTimer != 0 )
+ {
+ switch ( m_currentPage )
+ {
+ case PAGE_LOAD:
+ case PAGE_BRIEFS:
+ case PAGE_CONTROLS:
+ break;
+
+ default:
+ CFont::SetWrapx(X(1200.0f));
+ break;
+ }
+ }
+
+ if(pActiveMenuPage)
+ {
+ pActiveMenuPage->SetAlpha(m_fade);
+
+ switch ( m_pageState )
+ {
+ case PAGESTATE_NORMAL:
+ pActiveMenuPage->DrawNormal(m_position.x, m_position.y);
+ break;
+
+ case PAGESTATE_HIGHLIGHTED:
+ pActiveMenuPage->DrawHighlighted(CRGBA(rgbaATC.r, rgbaATC.g, rgbaATC.b, m_fade), m_position.x, m_position.y);
+ break;
+
+ case PAGESTATE_SELECTED:
+ pActiveMenuPage->Draw(CRGBA(rgbaATC.r, rgbaATC.g, rgbaATC.b, m_fade), CRGBA(MENU_SELECTED_COLOR.r, MENU_SELECTED_COLOR.g, MENU_SELECTED_COLOR.b, m_fade), m_position.x, m_position.y);
+ break;
+ }
+ }
+
+ CFont::DrawFonts();
+ CFont::DrawFonts();
+ RwRenderStateSet(rwRENDERSTATETEXTUREFILTER, (void*)rwFILTERLINEAR);
+ RwRenderStateSet(rwRENDERSTATETEXTUREADDRESS, (void*)rwTEXTUREADDRESSWRAP);
+}
+
+void
+CMenuManager::DrawFrontEndSaveZone(void)
+{
+ if ( bMemoryCardSpecialZone )
+ {
+ static uint8 counter = 0;
+ counter++;
+ if ( counter & 63 )
+ {
+ FillMenuWithMemCardFileListing(&MenuSaveZoneSSL_1, TriggerSaveZone_BackToMainMenuTwoLines, TriggerSaveZone_SaveSlots, nil, 0, 34, 22);
+
+ if ( TheMemoryCard.GetError() == CMemoryCard::ERR_NOFORMAT )
+ {
+ pActiveMenuPage = &MenuPageSaveZone_FormatCard;
+ pActiveMenuPage->ActivatePage();
+ bMemoryCardSpecialZone = false;
+ }
+ }
+ }
+
+ CSprite2d::InitPerFrame();
+ CFont::InitPerFrame();
+
+ RwRenderStateSet(rwRENDERSTATETEXTUREFILTER, (void*)rwFILTERNEAREST);
+
+ m_fade = 255;
+
+ CSprite2d::DrawRect(CRect(X(50.0f), Y(50.0f), X(590.0f), Y(398.0f)), CRGBA(0, 0, 0, 175)); //CRect(50.0f, 57.142f, 590.0f, 454.857147f)
+
+ CFont::SetFontStyle(FONT_BANK);
+ CFont::SetBackgroundOff();
+ CFont::SetScale(X(MENU_TEXT_SIZE_X), Y(MENU_TEXT_SIZE_Y));
+ CFont::SetPropOn();
+ CFont::SetCentreOff();
+ CFont::SetJustifyOn();
+ CFont::SetRightJustifyOff();
+ CFont::SetBackGroundOnlyTextOn();
+ CFont::SetRightJustifyWrap(X(70.0f));
+ CFont::SetWrapx(SCRW-X(70.0f)); // 570.0f
+
+ if ( pActiveMenuPage )
+ {
+ pActiveMenuPage->SetAlpha(m_fade);
+ pActiveMenuPage->Draw(CRGBA(rgbaATC.r, rgbaATC.g, rgbaATC.b, m_fade), TITLE_TEXT_COLOR, 0.0f, 0.0f);
+ }
+
+
+ CFont::DrawFonts();
+ CFont::SetFontStyle(FONT_BANK);
+ CFont::SetBackgroundOff();
+ CFont::SetScale(X(0.44f), Y(0.68f)); // 0.44f, 0.777143f
+ CFont::SetPropOn();
+ CFont::SetCentreOff();
+ CFont::SetJustifyOn();
+ CFont::SetRightJustifyOff();
+ CFont::SetBackGroundOnlyTextOn();
+ CFont::SetWrapx(SCRW-X(40.0f)); //600.0f
+ CFont::SetColor(TEXT_COLOR);
+
+ wchar *text;
+ if ( pActiveMenuPage == &MenuPageSaveZone_FormatCard
+ || pActiveMenuPage == &MenuPageSaveZone_SaveSlots
+ || pActiveMenuPage == &MenuPageSaveZone_SaveGame )
+ {
+ text = TheText.Get("FEDS_SB"); // / button - SELECT " button - BACK
+ }
+ else
+ {
+ text = TheText.Get("FEDS_SE"); // / button - SELECT
+ }
+
+ CFont::PrintString(X(180.0f), Y(376.0f), text); // 180.0f, 429.714294f
+ CFont::DrawFonts();
+
+ RwRenderStateSet(rwRENDERSTATETEXTUREFILTER, (void*)rwFILTERLINEAR);
+}
+
+void
+CMenuManager::DrawMemoryCardStartUpMenus()
+{
+ CFont::SetAlphaFade(255.0f);
+ bMemoryCardStartUpMenus_ExitNow = false;
+
+ CMenuPage page; // + 0x40 data
+ CMenuMultiChoiceTriggered MCMenu;
+ MCMenu.SetPosition(X(320.0f), Y(150.0f)); //171.428574f
+
+ switch ( TheMemoryCard.CheckCardStateAtGameStartUp(CARD_ONE) )
+ {
+ case CMemoryCard::MCSTATE_NEED_200KB: // 200KB
+ {
+ // There is insufficient space on the Memory Card (PS2) in MEMORY CARD slot 1. At least 200KB is needed to save this application data. Do you wish to start? (YES or NO)
+ MCMenu.AddTitle(TheText.Get("MCGNSP"), 0.0f, 0.0f, 0);
+ break;
+ }
+
+ case CMemoryCard::MCSTATE_NEED_500KB: // 500KB
+ {
+ // There is insufficient space on the Memory Card (PS2) in MEMORY CARD slot 1. At least 500KB is needed to save this application data. Do you wish to start? (YES or NO)
+ MCMenu.AddTitle(TheText.Get("MCDNSP"), 0.0f, 0.0f, 0);
+ break;
+ }
+
+ case CMemoryCard::MCSTATE_OK:
+ case CMemoryCard::MCSTATE_NOCARD:
+ {
+ return;
+ break;
+ }
+ }
+
+ MCMenu.AddOption(TheText.Get("FEM_NO"), X(30.0f), Y(110.0f), nil, 0, 0);// 125.714294f
+ MCMenu.AddOption(TheText.Get("FEM_YES"), X(-30.0f), Y(110.0f), TriggerMCSUM_Yes, 0, 0);// 125.714294f
+ MCMenu.SetColors(TITLE_TEXT_COLOR, TEXT_COLOR, TEXT_COLOR);
+ page.AddMenu(&MCMenu);
+
+ MCMenu.GoFirst();
+
+ page.SetShadows(true, TEXT_SHADOW_COLOR, SHADOW_VECTOR);
+
+ CTimer::Initialise();
+ CTimer::StartUserPause();
+
+ while ( !bMemoryCardStartUpMenus_ExitNow )
+ {
+#ifdef GTA_PC
+ HandleExit();
+
+ if(RsGlobal.quit)
+ return;
+#endif
+
+#ifdef GTA_PC
+ if ( CPad::GetPad(0)->GetDPadLeftJustDown() )
+ page.GoLeft();
+ if ( CPad::GetPad(0)->GetDPadRightJustDown() )
+ page.GoRight();
+ if ( CPad::GetPad(0)->GetDPadUpJustDown() )
+ page.GoDown();
+ if ( CPad::GetPad(0)->GetDPadDownJustDown() )
+ page.GoUp();
+ if ( CPad::GetPad(0)->GetCrossJustDown() || CPad::GetPad(0)->GetEnterJustDown() || CPad::GetPad(0)->GetRightMouseJustDown() )
+ page.SelectCurrentOptionUnderCursor();
+
+ if ( CPad::GetPad(0)->GetCircleJustDown() || CPad::GetPad(0)->GetEscapeJustDown() )
+ ;
+#else
+ if ( CPad::GetPad(0)->GetDPadLeftJustDown() )
+ page.GoLeft();
+ if ( CPad::GetPad(0)->GetDPadRightJustDown() )
+ page.GoRight();
+ if ( CPad::GetPad(0)->GetDPadUpJustDown() )
+ page.GoDown();
+ if ( CPad::GetPad(0)->GetDPadDownJustDown() )
+ page.GoUp();
+ if ( CPad::GetPad(0)->GetCrossJustDown() )
+ page.SelectCurrentOptionUnderCursor();
+ if ( CPad::GetPad(0)->GetCircleJustDown() )
+ ;
+#endif
+
+ static int32 MemCardStatusWaiter = 0;
+
+ MemCardStatusWaiter++;
+
+ if ( MemCardStatusWaiter > 120 )
+ {
+ MemCardStatusWaiter = 0;
+
+ switch ( TheMemoryCard.CheckCardStateAtGameStartUp(CARD_ONE) )
+ {
+ case CMemoryCard::MCSTATE_NEED_200KB:
+ {
+ // There is insufficient space on the Memory Card (PS2) in MEMORY CARD slot 1. At least 200KB is needed to save this application data. Do you wish to start? (YES or NO)
+ MCMenu.AddTitle(TheText.Get("MCGNSP"), 0.0f, 0.0f, 0);
+ break;
+ }
+
+ case CMemoryCard::MCSTATE_NEED_500KB:
+ {
+ // There is insufficient space on the Memory Card (PS2) in MEMORY CARD slot 1. At least 500KB is needed to save this application data. Do you wish to start? (YES or NO)
+ MCMenu.AddTitle(TheText.Get("MCDNSP"), 0.0f, 0.0f, 0);
+ break;
+ }
+
+ case CMemoryCard::MCSTATE_NOCARD:
+ {
+ // There is no Memory Card (PS2) in MEMORY CARD slot 1. Do you wish to start? (YES or NO)
+ MCMenu.AddTitle(TheText.Get("MCSTNS"), 0.0f, 0.0f, 0);
+ break;
+ }
+
+ case CMemoryCard::MCSTATE_OK:
+ {
+ bMemoryCardStartUpMenus_ExitNow = true;
+ break;
+ }
+ }
+ }
+
+ DoRWStuffStartOfFrame(0, 0, 0, 0, 0, 0, 255);
+ CFont::InitPerFrame();
+
+ RwRenderStateSet(rwRENDERSTATETEXTUREFILTER, (void*)rwFILTERLINEAR);
+ CSprite2d *splash = LoadSplash("splash1");
+ splash->Draw(CRect(0.0f, 0.0f, SCRW, SCRH), BACKGROUND_SPLASH_COLOR);
+ RwRenderStateSet(rwRENDERSTATETEXTUREFILTER, (void*)rwFILTERNEAREST);
+
+ SetRandomActiveTextlineColor(1);
+
+ CRGBA col(rgbaATC.r, rgbaATC.g, rgbaATC.b, 255);
+ CFont::SetFontStyle(FONT_BANK);
+ CFont::SetBackgroundOff();
+ CFont::SetScale(X(MENU_TEXT_SIZE_X), Y(MENU_TEXT_SIZE_Y));
+ CFont::SetPropOn();
+ CFont::SetJustifyOn();
+ CFont::SetRightJustifyOff();
+ CFont::SetBackGroundOnlyTextOn();
+ CFont::SetWrapx(SCRW-X(60.0f)); // 580.0f
+ CFont::SetCentreOn();
+ CFont::SetCentreSize(SCRW-X(120.0f)); // 520.0f
+
+ MCMenu.Draw(col, TITLE_TEXT_COLOR, 0.0f, 0.0f);
+ CFont::DrawFonts();
+
+ CFont::SetFontStyle(FONT_BANK);
+ CFont::SetScale(X(0.4f), Y(0.64f)); // 0.731429
+ CFont::SetPropOn();
+ CFont::SetCentreOff();
+ CFont::SetJustifyOn();
+ CFont::SetRightJustifyOff();
+ CFont::SetBackGroundOnlyTextOn();
+ CFont::SetWrapx(SCRW-X(60.0f)); // 580.0f
+ CFont::SetColor(TEXT_COLOR);
+
+
+ CPlaceableShText text;
+ text.SetPosition(X(240.0f), Y(378.0f), false); // 432.000000
+ text.SetColor(TEXT_COLOR);
+ text.m_text = TheText.Get("FEDS_SE"); // / button - SELECT
+ text.SetShadows(true, TEXT_SHADOW_COLOR, SHADOW_VECTOR);
+ text.Draw(0.0f, 0.0f);
+
+ CFont::DrawFonts();
+ DisplayWarningControllerMsg();
+ DoRWStuffEndOfFrame();
+ CPad::UpdatePads();
+ CTimer::Update();
+ }
+
+ CTimer::EndUserPause();
+ CTimer::Stop();
+
+ for ( int32 i = 0; i < 100; i++ )
+ {
+#ifdef GTA_PC
+ HandleExit();
+#endif
+ DoRWStuffStartOfFrame(0, 0, 0, 0, 0, 0, 255);
+
+ RwRenderStateSet(rwRENDERSTATETEXTUREFILTER, (void*)rwFILTERLINEAR);
+ CSprite2d *splash = LoadSplash("splash1");
+ splash->Draw(CRect(0.0f, 0.0f, SCRW, SCRH), BACKGROUND_SPLASH_COLOR);
+ RwRenderStateSet(rwRENDERSTATETEXTUREFILTER, (void*)rwFILTERNEAREST);
+
+ DoRWStuffEndOfFrame();
+ }
+}
+
+void
+CMenuManager::Process(void)
+{
+ if ( m_bSaveMenuActive || m_bInSaveZone || TheCamera.GetScreenFadeStatus() == FADE_0 )
+ {
+ InitialiseMenusOnce();
+ m_bWantToRestart = false;
+ WorkOutMenuState(false);
+
+ if ( m_bMenuActive )
+ {
+ if ( !m_bInSaveZone )
+ LoadAllTextures();
+ InitialiseMenuContents();
+ SetRandomActiveTextlineColor(0);
+ ProcessControllerInput();
+ }
+ else
+ {
+ AnaliseMenuContents();
+ pMenuSave = &MenuPage_SaveBasic;
+ m_pageState = PAGESTATE_NORMAL;
+ bMemoryCardSpecialZone = false;
+ bIgnoreTriangleButton = false;
+ UnloadTextures();
+ m_bInSaveZone = false;
+ m_bRenderGameInMenu = false;
+ gErrorSampleTriggered = true;
+ }
+ }
+}
+
+void
+CMenuManager::WorkOutMenuState(uint8 bExit)
+{
+#ifdef GTA_PC
+ bool bIsStartPressed = CPad::GetPad(0)->GetStartJustDown() || (m_pageState == PAGESTATE_NORMAL && CPad::GetPad(0)->GetEscapeJustDown());
+#else
+ bool bIsStartPressed = CPad::GetPad(0)->GetStartJustDown();
+#endif
+ bool bIsCreditsOrDraw = CCredits::AreCreditsDone() || m_bMenuActive;
+ bool bIsDemoOrDraw = m_bMenuActive || CGame::bDemoMode;
+
+ if ( (bIsStartPressed && bIsCreditsOrDraw) || bExit || (!bIsDemoOrDraw && CPad::IsNoOrObsolete()) )
+ {
+ if ( m_nStartPauseTimer == 0 && m_nEndPauseTimer == 0 )
+ {
+ m_bMenuActive = !m_bMenuActive;
+
+ if ( !m_bMenuActive )
+ {
+ DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_STARTING, 0);
+ DMAudio.ChangeMusicMode(MUSICMODE_GAME);
+ gMusicPlaying = false;
+ bMemoryCardSpecialZone = false;
+ bIgnoreTriangleButton = false;
+
+ m_bMenuActive = true;
+
+ m_nEndPauseTimer = CTimer::GetTimeInMillisecondsPauseMode() + 800;
+
+ if ( m_currentPage == PAGE_CONTROLS || m_currentPage == PAGE_BRIEFS || m_currentPage == PAGE_LOAD )
+ {
+ m_nSlidingDir = CGeneral::GetRandomNumber() & (SLIDE_MAX-1);
+
+ switch ( m_nSlidingDir ) //m_nSlidingDir &= ~1;
+ {
+ case SLIDE_TO_LEFT: m_nSlidingDir = SLIDE_TO_TOP; break;
+ case SLIDE_TO_RIGHT: m_nSlidingDir = SLIDE_TO_BOTTOM; break;
+ }
+
+ m_position.y = Y(500.0f); // 571.428589f;
+ }
+ }
+ else
+ {
+ DMAudio.ChangeMusicMode(MUSICMODE_FRONTEND);
+
+ if ( DMAudio.GetRadioInCar() < 9 )
+ m_PrefsRadioStation = DMAudio.GetRadioInCar();
+ else
+ m_PrefsRadioStation = CGeneral::GetRandomNumber() % 9;
+
+ CTimer::StartUserPause();
+ CPad::StopPadsShaking();
+ m_nStartPauseTimer = CTimer::GetTimeInMillisecondsPauseMode() + 800;
+ m_nSlidingDir = CGeneral::GetRandomNumber() & (SLIDE_MAX-1);
+
+ switch ( m_nSlidingDir )
+ {
+ case SLIDE_TO_RIGHT: m_position.y = Y(612.5f); break;
+ case SLIDE_TO_LEFT: m_position.y = Y(612.5f); break;
+ case SLIDE_TO_BOTTOM: m_position.y = Y(500.0f); break;
+ case SLIDE_TO_TOP: m_position.y = Y(500.0f); break;
+ default: m_position.y = Y(500.0f); break;
+ }
+
+ if ( m_currentPage == PAGE_CONTROLS || m_currentPage == PAGE_BRIEFS )
+ {
+ m_nSlidingDir = CGeneral::GetRandomNumber() & (SLIDE_MAX-1);
+
+ switch ( m_nSlidingDir ) //m_nSlidingDir &= ~1;
+ {
+ case SLIDE_TO_LEFT: m_nSlidingDir = SLIDE_TO_TOP; break;
+ case SLIDE_TO_RIGHT: m_nSlidingDir = SLIDE_TO_BOTTOM; break;
+ }
+
+ m_position.y = Y(500.0f); //571.428589f
+ }
+ }
+ }
+ }
+
+ if ( m_bSaveMenuActive && !m_bInSaveZone && !TheMemoryCard._bunk2)
+ {
+ m_bSaveMenuActive = false;
+ m_bInSaveZone = true;
+ m_bRenderGameInMenu = true;
+ m_bMenuActive = true;
+ CTimer::StartUserPause();
+ pActiveMenuPage = &MenuPageSaveZone_SaveGame;
+ }
+
+ if ( m_pageState == PAGESTATE_NORMAL && gMusicPlaying )
+ {
+ DMAudio.StopFrontEndTrack();
+ gMusicPlaying = false;
+ }
+
+ if ( m_nChangePageTimer != 0 && CTimer::GetTimeInMillisecondsPauseMode() >= m_nChangePageTimer )
+ {
+ m_nChangePageTimer = 0;
+ pMenuSave = &MenuPage_SaveBasic;
+ m_currentPage = m_newPage;
+ }
+
+ if ( m_nPageLeftTimer != 0 && CTimer::GetTimeInMillisecondsPauseMode() >= m_nPageLeftTimer )
+ m_nPageLeftTimer = 0;
+
+ if ( m_nPageRightTimer != 0 && CTimer::GetTimeInMillisecondsPauseMode() >= m_nPageRightTimer )
+ m_nPageRightTimer = 0;
+
+ if ( m_nStartPauseTimer != 0 && CTimer::GetTimeInMillisecondsPauseMode() >= m_nStartPauseTimer )
+ m_nStartPauseTimer = 0;
+
+ if ( m_nEndPauseTimer != 0 && CTimer::GetTimeInMillisecondsPauseMode() >= m_nEndPauseTimer )
+ {
+ m_nEndPauseTimer = 0;
+ m_bMenuActive = false;
+ m_bMenuActive = false;
+ m_bInSaveZone = false;
+ CTimer::EndUserPause();
+ }
+}
+
+void
+CMenuManager::ProcessControllerInput(void)
+{
+ if ( TimeToStopPadShaking != 0 && TimeToStopPadShaking < CTimer::GetTimeInMillisecondsPauseMode() )
+ {
+ CPad::StopPadsShaking();
+ TimeToStopPadShaking = 0;
+ }
+
+#ifdef GTA_PC
+ if ( CPad::GetPad(0)->GetDPadLeft() || CPad::GetPad(0)->GetLeft() )
+#else
+ if ( CPad::GetPad(0)->GetDPadLeft() )
+#endif
+ {
+ switch ( m_pageState )
+ {
+ case PAGESTATE_NORMAL:
+ case PAGESTATE_HIGHLIGHTED:
+ break;
+
+ case PAGESTATE_SELECTED:
+ {
+ if ( pActiveMenuPage )
+ pActiveMenuPage->GoLeftStill();
+ break;
+ }
+ }
+ }
+
+#ifdef GTA_PC
+ if ( CPad::GetPad(0)->GetDPadRight() || CPad::GetPad(0)->GetRight() )
+#else
+ if ( CPad::GetPad(0)->GetDPadRight() )
+#endif
+ {
+ switch ( m_pageState )
+ {
+ case PAGESTATE_NORMAL:
+ case PAGESTATE_HIGHLIGHTED:
+ break;
+
+ case PAGESTATE_SELECTED:
+ {
+ if ( pActiveMenuPage )
+ pActiveMenuPage->GoRightStill();
+ break;
+ }
+ }
+ }
+
+#ifdef GTA_PC
+ if ( CPad::GetPad(0)->GetDPadLeftJustDown() || CPad::GetPad(0)->GetLeftJustDown() )
+#else
+ if ( CPad::GetPad(0)->GetDPadLeftJustDown() )
+#endif
+ ProcessDPadLeftJustDown();
+
+#ifdef GTA_PC
+ if ( CPad::GetPad(0)->GetDPadRightJustDown() || CPad::GetPad(0)->GetRightJustDown() )
+#else
+ if ( CPad::GetPad(0)->GetDPadRightJustDown() )
+#endif
+ ProcessDPadRightJustDown();
+
+#ifdef GTA_PC
+ if ( CPad::GetPad(0)->GetDPadUp() || CPad::GetPad(0)->GetUp() )
+#else
+ if ( CPad::GetPad(0)->GetDPadUp() )
+#endif
+ {
+ switch ( m_pageState )
+ {
+ case PAGESTATE_NORMAL:
+ {
+ if ( m_currentPage == PAGE_STATS )
+ {
+ if ( pActiveMenuPage )
+ pActiveMenuPage->GoUpStill();
+ }
+ break;
+ }
+
+ case PAGESTATE_HIGHLIGHTED:
+ break;
+
+ case PAGESTATE_SELECTED:
+ {
+ if ( pActiveMenuPage )
+ pActiveMenuPage->GoUpStill();
+ break;
+ }
+ }
+ }
+
+#ifdef GTA_PC
+ if ( CPad::GetPad(0)->GetDPadDown() || CPad::GetPad(0)->GetDown() )
+#else
+ if ( CPad::GetPad(0)->GetDPadDown() )
+#endif
+ {
+ switch ( m_pageState )
+ {
+ case PAGESTATE_NORMAL:
+ {
+ if ( m_currentPage == PAGE_STATS )
+ {
+ if ( pActiveMenuPage )
+ pActiveMenuPage->GoDownStill();
+ }
+
+ break;
+ }
+ case PAGESTATE_HIGHLIGHTED:
+ break;
+
+ case PAGESTATE_SELECTED:
+ {
+ if ( pActiveMenuPage )
+ pActiveMenuPage->GoDownStill();
+ break;
+ }
+ }
+ }
+
+#ifdef GTA_PC
+ if ( CPad::GetPad(0)->GetDPadUpJustDown() || CPad::GetPad(0)->GetUpJustDown() )
+#else
+ if ( CPad::GetPad(0)->GetDPadUpJustDown() )
+#endif
+ ProcessDPadUpJustDown();
+
+#ifdef GTA_PC
+ if ( CPad::GetPad(0)->GetDPadDownJustDown() || CPad::GetPad(0)->GetDownJustDown() )
+#else
+ if ( CPad::GetPad(0)->GetDPadDownJustDown() )
+#endif
+ ProcessDPadDownJustDown();
+
+ if ( CPad::GetPad(0)->GetLeftShoulder1JustDown() )
+ {
+ switch ( m_pageState )
+ {
+ case PAGESTATE_NORMAL:
+ ProcessDPadLeftJustDown();
+ break;
+
+ case PAGESTATE_HIGHLIGHTED:
+ case PAGESTATE_SELECTED:
+ break;
+ }
+ }
+
+ if ( CPad::GetPad(0)->GetRightShoulder1JustDown() )
+ {
+ switch ( m_pageState )
+ {
+ case PAGESTATE_NORMAL:
+ ProcessDPadRightJustDown();
+ break;
+
+ case PAGESTATE_HIGHLIGHTED:
+ case PAGESTATE_SELECTED:
+ break;
+ }
+ }
+
+#ifdef GTA_PC
+ if ( CPad::GetPad(0)->GetCrossJustDown() || CPad::GetPad(0)->GetEnterJustDown() || CPad::GetPad(0)->GetRightMouseJustDown() )
+#else
+ if ( CPad::GetPad(0)->GetCrossJustDown() )
+#endif
+ ProcessDPadCrossJustDown();
+
+#ifdef GTA_PC
+ if ( CPad::GetPad(0)->GetTriangleJustDown() || CPad::GetPad(0)->GetBackspaceJustDown() || (m_pageState != PAGESTATE_NORMAL && CPad::GetPad(0)->GetEscapeJustDown()) )
+#else
+ if ( CPad::GetPad(0)->GetTriangleJustDown() )
+#endif
+ ProcessDPadTriangleJustDown();
+}
+
+
+void
+CMenuManager::ProcessDPadLeftJustDown(void)
+{
+ if ( m_bInSaveZone )
+ {
+ if ( pActiveMenuPage )
+ {
+ pActiveMenuPage->GoLeft();
+
+ if ( pActiveMenuPage->m_pCurrentControl == &MenuSaveZoneSSL_1 )
+ {
+ if ( MenuSaveZoneSSL_1.m_numOptions < 2 )
+ ;
+ else
+ DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_NAVIGATION, 0);
+ }
+ else
+ DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_NAVIGATION, 0);
+ }
+ }
+ else
+ {
+ switch ( m_pageState )
+ {
+ case PAGESTATE_NORMAL:
+ {
+ if ( !bMemoryCardSpecialZone && !m_bInSaveZone )
+ {
+ if ( m_nChangePageTimer == 0 )
+ {
+ if ( --m_newPage < PAGE_FIRST ) m_newPage = PAGE_LAST;
+
+ m_nPageLeftTimer = CTimer::GetTimeInMillisecondsPauseMode() + 300;
+ m_nPageRightTimer = 0;
+ m_nChangePageTimer = CTimer::GetTimeInMillisecondsPauseMode() + 250;
+ field_18 = m_newPage;
+ DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_NEW_PAGE, 0);
+ }
+ }
+
+ break;
+ }
+
+ case PAGESTATE_HIGHLIGHTED:
+ {
+ if ( pActiveMenuPage )
+ pActiveMenuPage->GoLeftMenuOnPage();
+
+ DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_NAVIGATION, 0);
+
+ break;
+ }
+
+ case PAGESTATE_SELECTED:
+ {
+ if ( pActiveMenuPage )
+ {
+ pActiveMenuPage->GoLeft();
+
+ if ( m_currentPage == PAGE_AUDIO)
+ {
+ if ( pActiveMenuPage->m_pCurrentControl == &MenuAudio_1 )
+ ;
+ else if ( pActiveMenuPage->m_pCurrentControl == &MenuAudio_2 )
+ ;
+ else
+ DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_NAVIGATION, 0);
+ }
+ else if ( m_currentPage == PAGE_DISPLAY)
+ {
+ if ( pActiveMenuPage->m_pCurrentControl == &MenuDisplay_1 )
+ ;
+ else
+ DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_NAVIGATION, 0);
+ }
+ else
+ {
+ if ( pActiveMenuPage->m_pCurrentControl == &MenuSaveDG_2 )
+ {
+ if ( MenuSaveDG_2.m_numOptions < 2 )
+ ;
+ else
+ DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_NAVIGATION, 0);
+ }
+ else if ( pActiveMenuPage->m_pCurrentControl == &MenuSaveLG_2 )
+ {
+ if ( MenuSaveLG_2.m_numOptions < 2 )
+ ;
+ else
+ DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_NAVIGATION, 0);
+ }
+ else
+ DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_NAVIGATION, 0);
+ }
+ }
+
+ break;
+ }
+ }
+ }
+}
+
+void
+CMenuManager::ProcessDPadRightJustDown(void)
+{
+ if ( m_bInSaveZone )
+ {
+ if ( pActiveMenuPage )
+ {
+ pActiveMenuPage->GoRight();
+
+ if ( pActiveMenuPage->m_pCurrentControl == &MenuSaveZoneSSL_1 )
+ {
+ if ( MenuSaveZoneSSL_1.m_numOptions < 2 )
+ ;
+ else
+ DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_NAVIGATION, 0);
+ }
+ else
+ DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_NAVIGATION, 0);
+ }
+ }
+ else
+ {
+ switch ( m_pageState )
+ {
+ case PAGESTATE_NORMAL:
+ {
+ if ( !bMemoryCardSpecialZone && !m_bInSaveZone )
+ {
+ if ( m_nChangePageTimer == 0 )
+ {
+ if ( ++m_newPage > PAGE_LAST ) m_newPage = PAGE_FIRST;
+
+ m_nPageLeftTimer = 0;
+ m_nPageRightTimer = CTimer::GetTimeInMillisecondsPauseMode() + 300;
+ m_nChangePageTimer = CTimer::GetTimeInMillisecondsPauseMode() + 250;
+ field_18 = m_newPage;
+ DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_NEW_PAGE, 0);
+ }
+ }
+
+ break;
+ }
+
+ case PAGESTATE_HIGHLIGHTED:
+ {
+ if ( pActiveMenuPage )
+ pActiveMenuPage->GoRightMenuOnPage();
+
+ DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_NAVIGATION, 0);
+
+ break;
+ }
+
+ case PAGESTATE_SELECTED:
+ {
+ if ( pActiveMenuPage )
+ {
+ pActiveMenuPage->GoRight();
+
+ if ( m_currentPage == PAGE_AUDIO)
+ {
+ if ( pActiveMenuPage->m_pCurrentControl == &MenuAudio_1 )
+ ;
+ else if ( pActiveMenuPage->m_pCurrentControl == &MenuAudio_2 )
+ ;
+ else
+ DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_NAVIGATION, 0);
+ }
+ else if ( m_currentPage == PAGE_DISPLAY)
+ {
+ if ( pActiveMenuPage->m_pCurrentControl == &MenuDisplay_1 )
+ ;
+ else
+ DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_NAVIGATION, 0);
+ }
+ else
+ {
+ if ( pActiveMenuPage->m_pCurrentControl == &MenuSaveDG_2 )
+ {
+ if ( MenuSaveDG_2.m_numOptions < 2 )
+ ;
+ else
+ DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_NAVIGATION, 0);
+ }
+ else if ( pActiveMenuPage->m_pCurrentControl == &MenuSaveLG_2 )
+ {
+ if ( MenuSaveLG_2.m_numOptions < 2 )
+ ;
+ else
+ DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_NAVIGATION, 0);
+ }
+ else
+ DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_NAVIGATION, 0);
+ }
+ }
+
+ break;
+ }
+ }
+ }
+}
+
+void
+CMenuManager::ProcessDPadUpJustDown(void)
+{
+ if ( m_bInSaveZone )
+ {
+ if ( pActiveMenuPage )
+ {
+ pActiveMenuPage->GoUp();
+
+ if ( pActiveMenuPage->m_pCurrentControl == &MenuSaveZoneSSL_1 )
+ {
+ if ( MenuSaveZoneSSL_1.m_numOptions < 2 )
+ ;
+ else
+ DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_NAVIGATION, 0);
+ }
+ else
+ DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_NAVIGATION, 0);
+ }
+ }
+ else
+ {
+ switch ( m_pageState )
+ {
+ case PAGESTATE_NORMAL:
+ break;
+
+ case PAGESTATE_HIGHLIGHTED:
+ {
+ if ( pActiveMenuPage )
+ pActiveMenuPage->GoUpMenuOnPage();
+
+ DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_NAVIGATION, 0);
+ break;
+ }
+
+ case PAGESTATE_SELECTED:
+ {
+ if ( pActiveMenuPage )
+ {
+ pActiveMenuPage->GoUp();
+
+ if ( pActiveMenuPage->m_pCurrentControl == &MenuSaveDG_2 )
+ {
+ if ( MenuSaveDG_2.m_numOptions < 2 )
+ ;
+ else
+ DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_NAVIGATION, 0);
+ }
+ else if ( pActiveMenuPage->m_pCurrentControl == &MenuSaveLG_2 )
+ {
+ if ( MenuSaveLG_2.m_numOptions < 2 )
+ ;
+ else
+ DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_NAVIGATION, 0);
+ }
+ else
+ DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_NAVIGATION, 0);
+ }
+
+ break;
+ }
+ }
+ }
+}
+
+void
+CMenuManager::ProcessDPadDownJustDown(void)
+{
+ if ( m_bInSaveZone )
+ {
+ if ( pActiveMenuPage )
+ {
+ pActiveMenuPage->GoDown();
+
+ if ( pActiveMenuPage->m_pCurrentControl == &MenuSaveZoneSSL_1 )
+ {
+ if ( MenuSaveZoneSSL_1.m_numOptions < 2 )
+ ;
+ else
+ DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_NAVIGATION, 0);
+ }
+ else
+ DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_NAVIGATION, 0);
+ }
+ }
+ else
+ {
+ switch ( m_pageState )
+ {
+ case PAGESTATE_NORMAL:
+ break;
+
+ case PAGESTATE_HIGHLIGHTED:
+ {
+ if ( pActiveMenuPage )
+ pActiveMenuPage->GoDownMenuOnPage();
+
+ DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_NAVIGATION, 0);
+
+ break;
+ }
+
+ case PAGESTATE_SELECTED:
+ {
+ if ( pActiveMenuPage )
+ {
+ pActiveMenuPage->GoDown();
+
+ if ( pActiveMenuPage->m_pCurrentControl == &MenuSaveDG_2 )
+ {
+ if ( MenuSaveDG_2.m_numOptions < 2 )
+ ;
+ else
+ DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_NAVIGATION, 0);
+ }
+ else if ( pActiveMenuPage->m_pCurrentControl == &MenuSaveLG_2 )
+ {
+ if ( MenuSaveLG_2.m_numOptions < 2 )
+ ;
+ else
+ DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_NAVIGATION, 0);
+ }
+ else
+ DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_NAVIGATION, 0);
+ }
+ break;
+ }
+ }
+ }
+}
+
+void
+CMenuManager::ProcessDPadTriangleJustDown(void)
+{
+ if ( pActiveMenuPage )
+ {
+ pActiveMenuPage->SelectDefaultCancelAction();
+
+ if ( m_bMenuActive || m_bInSaveZone )
+ {
+ if ( bIgnoreTriangleButton )
+ {
+ if ( m_bInSaveZone )
+ DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_BACK, 0);
+ else if ( pActiveMenuPage->m_pCurrentControl == &MenuSaveDG_2 || pActiveMenuPage->m_pCurrentControl == &MenuSaveLG_2 )
+ DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_BACK, 0);
+ }
+ else if ( !bIgnoreTriangleButton )
+ {
+ switch ( m_pageState )
+ {
+ case PAGESTATE_NORMAL:
+ WorkOutMenuState(true);
+ break;
+
+ case PAGESTATE_HIGHLIGHTED:
+ m_pageState = PAGESTATE_NORMAL;
+ DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_NEW_PAGE, 0);
+ break;
+
+ case PAGESTATE_SELECTED:
+ {
+ m_pageState = PAGESTATE_HIGHLIGHTED;
+ if ( pActiveMenuPage )
+ {
+ if ( pActiveMenuPage->m_numControls == 1 )
+ {
+ m_pageState = PAGESTATE_NORMAL;
+ DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_NEW_PAGE, 0);
+ }
+ else
+ DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_BACK, 0);
+ }
+ break;
+ }
+ }
+ }
+ }
+ }
+ else
+ {
+ if ( !bIgnoreTriangleButton )
+ {
+ switch ( m_pageState )
+ {
+ case PAGESTATE_NORMAL:
+ WorkOutMenuState(false);
+ break;
+
+ case PAGESTATE_HIGHLIGHTED:
+ m_pageState = PAGESTATE_NORMAL;
+ DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_NEW_PAGE, 0);
+ break;
+
+ case PAGESTATE_SELECTED:
+ {
+ m_pageState = PAGESTATE_HIGHLIGHTED;
+ if ( pActiveMenuPage )
+ {
+ if ( pActiveMenuPage->m_numControls == 1 )
+ {
+ m_pageState = PAGESTATE_NORMAL;
+ DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_NEW_PAGE, 0);
+ }
+ else
+ DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_BACK, 0);
+ }
+ break;
+ }
+ }
+ }
+ }
+}
+
+void
+CMenuManager::ProcessDPadCrossJustDown(void)
+{
+ if ( m_bInSaveZone )
+ {
+ if ( pActiveMenuPage )
+ pActiveMenuPage->SelectCurrentOptionUnderCursor();
+
+ DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_SETTING_CHANGE, 0);
+ }
+ else
+ {
+ if ( m_currentPage != PAGE_STATS && m_currentPage != PAGE_BRIEFS)
+ {
+ switch ( m_pageState )
+ {
+ case PAGESTATE_NORMAL:
+ {
+ m_pageState = PAGESTATE_HIGHLIGHTED;
+ if ( pActiveMenuPage )
+ {
+ if ( pActiveMenuPage->m_numControls == 1 )
+ m_pageState = PAGESTATE_SELECTED;
+ }
+
+ switch ( m_currentPage )
+ {
+ case PAGE_AUDIO:
+ {
+ if ( pActiveMenuPage->m_pCurrentControl == &MenuAudio_1
+ || pActiveMenuPage->m_pCurrentControl == &MenuAudio_2
+ || pActiveMenuPage->m_pCurrentControl == &MenuAudio_3
+ || pActiveMenuPage->m_pCurrentControl == &MenuAudio_4 )
+ {
+ if ( !gMusicPlaying )
+ {
+ DMAudio.PlayFrontEndTrack(m_PrefsRadioStation, 1);
+ gMusicPlaying = true;
+ }
+ }
+ else
+ {
+ DMAudio.StopFrontEndTrack();
+ gMusicPlaying = false;
+ }
+ break;
+ }
+ }
+
+ DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_SETTING_CHANGE, 0);
+ break;
+ }
+
+ case PAGESTATE_HIGHLIGHTED:
+ {
+ m_pageState = PAGESTATE_SELECTED;
+ DoHackingMenusAtPageBrowse();
+ if ( pActiveMenuPage )
+ {
+ if ( pActiveMenuPage->IsActiveMenuTwoState())
+ {
+ m_pageState = PAGESTATE_HIGHLIGHTED;
+ pActiveMenuPage->ActiveMenuTwoState_SelectNextPosition();
+ }
+ }
+
+ switch ( m_currentPage )
+ {
+ case PAGE_AUDIO:
+ {
+ if ( pActiveMenuPage->m_pCurrentControl != &MenuAudio_4 )
+ DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_SETTING_CHANGE, 0);
+
+ break;
+ }
+
+ default:
+ {
+ DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_SETTING_CHANGE, 0);
+ DMAudio.StopFrontEndTrack();
+ gMusicPlaying = false;
+ break;
+ }
+ }
+ break;
+ }
+
+ case PAGESTATE_SELECTED:
+ {
+ if ( pActiveMenuPage )
+ {
+ pActiveMenuPage->SelectCurrentOptionUnderCursor();
+
+ switch ( m_currentPage )
+ {
+ case PAGE_AUDIO:
+ {
+ if ( pActiveMenuPage->m_pCurrentControl != &MenuAudio_3 )
+ m_pageState = PAGESTATE_HIGHLIGHTED;
+ break;
+ }
+
+ case PAGE_LOAD:
+ case PAGE_LANGUAGE:
+ break;
+
+ default:
+ m_pageState = PAGESTATE_HIGHLIGHTED;
+ break;
+ }
+ }
+
+ DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_SETTING_CHANGE, 0);
+ break;
+ }
+ }
+ }
+ }
+}
+
+void
+CMenuManager::DoHackingMenusAtPageBrowse(void)
+{
+ if ( pActiveMenuPage )
+ {
+ switch ( m_currentPage )
+ {
+ case PAGE_CONTROLS:
+ {
+ if ( pActiveMenuPage->m_pCurrentControl == &MenuControls_1 )
+ {
+ int32 sel = MenuControls_1.GetMenuSelection();
+ MenuControls_1.GoFirst();
+
+ for ( int32 i = 0; i < sel; i++ )
+ MenuControls_1.GoNext();
+ }
+ break;
+ }
+
+ case PAGE_AUDIO:
+ {
+ if ( pActiveMenuPage->m_pCurrentControl == &MenuAudio_3 )
+ {
+ int32 sel = MenuAudio_3.GetMenuSelection();
+ MenuAudio_3.GoFirst();
+
+ for ( int32 i = 0; i < sel; i++ )
+ MenuAudio_3.GoNext();
+ }
+ break;
+ }
+ }
+ }
+}
+
+void
+CMenuManager::SetSoundLevelsForMusicMenu(void)
+{
+ DMAudio.SetMusicMasterVolume(m_PrefsMusicVolume);
+ DMAudio.SetEffectsMasterVolume(m_PrefsSfxVolume);
+}
+
+void
+CMenuManager::FilterOutColorMarkersFromString(wchar *string, CRGBA &color)
+{
+ wchar buf[300];
+ UnicodeStrcpy(buf, string);
+
+ wchar *src = buf;
+ wchar *dst = string;
+ while ( *src != '\0' )
+ {
+ if ( *src == '~' )
+ {
+ src++;
+
+ if ( *src == 'l' ) color = CRGBA(0, 0, 0, 255);
+ else if ( *src == 'p' ) color = CRGBA(255, 0, 255, 255);
+ else if ( *src == 'y' ) color = CRGBA(255, 255, 0, 255);
+ else if ( *src == 'w' ) color = CRGBA(255, 255, 255, 255);
+ else if ( *src == 'b' ) color = CRGBA(40, 40, 255, 255);
+ else if ( *src == 'g' ) color = CRGBA(40, 235, 40, 255);
+ else if ( *src == 'r' ) color = CRGBA(255, 0, 0, 255);
+
+ while ( *src++ != '~' )
+ ;
+ }
+ else
+ *dst++ = *src++;
+ }
+
+ *dst = '\0';
+}
+
+#endif \ No newline at end of file
diff --git a/src/core/Frontend_PS2.h b/src/core/Frontend_PS2.h
new file mode 100644
index 00000000..2f226dc3
--- /dev/null
+++ b/src/core/Frontend_PS2.h
@@ -0,0 +1,244 @@
+#pragma once
+#include "Sprite2d.h"
+
+enum
+{
+ PAGE_STATS,
+ PAGE_LOAD,
+ PAGE_BRIEFS,
+ PAGE_CONTROLS,
+ PAGE_AUDIO,
+ PAGE_DISPLAY,
+ PAGE_LANGUAGE,
+
+ NUM_PAGES,
+ PAGE_FIRST = PAGE_STATS,
+ PAGE_LAST = PAGE_LANGUAGE,
+};
+
+enum
+{
+ PAGESTATE_NORMAL = 0,
+ PAGESTATE_HIGHLIGHTED,
+ PAGESTATE_SELECTED
+};
+
+
+enum eFrontendSprites
+{
+ FE2_MAINPANEL_UL,
+ FE2_MAINPANEL_UR,
+ FE2_MAINPANEL_DL,
+ FE2_MAINPANEL_DR,
+ FE2_MAINPANEL_DR2,
+ FE2_TABACTIVE,
+ FE_ICONBRIEF,
+ FE_ICONSTATS,
+ FE_ICONCONTROLS,
+ FE_ICONSAVE,
+ FE_ICONAUDIO,
+ FE_ICONDISPLAY,
+ FE_ICONLANGUAGE,
+ FE_CONTROLLER,
+ FE_CONTROLLERSH,
+ FE_ARROWS1,
+ FE_ARROWS2,
+ FE_ARROWS3,
+ FE_ARROWS4,
+ FE_RADIO1,
+ FE_RADIO2,
+ FE_RADIO3,
+ FE_RADIO4,
+ FE_RADIO5,
+ FE_RADIO6,
+ FE_RADIO7,
+ FE_RADIO8,
+ FE_RADIO9,
+
+ NUM_FE_SPRITES
+};
+
+
+class CSprite2d;
+class CVector2D;
+
+#ifdef GTA_PC
+enum eControlMethod
+{
+ CONTROL_STANDARD = 0,
+ CONTROL_CLASSIC,
+};
+#endif
+
+class CMenuManager
+{
+public:
+ enum LANGUAGE
+ {
+ LANGUAGE_AMERICAN,
+ LANGUAGE_FRENCH,
+ LANGUAGE_GERMAN,
+ LANGUAGE_ITALIAN,
+ LANGUAGE_SPANISH,
+#ifdef MORE_LANGUAGES
+ LANGUAGE_POLISH,
+ LANGUAGE_RUSSIAN,
+ LANGUAGE_JAPANESE,
+#endif
+ };
+
+ enum CONTRCONFIG
+ {
+ CONFIG_1 = 0,
+ CONFIG_2,
+ CONFIG_3,
+ CONFIG_4,
+ };
+
+ enum
+ {
+ NUM_SPRIRES = 28,
+ };
+
+ enum
+ {
+ PAGESTATE_NORMAL = 0,
+ PAGESTATE_HIGHLIGHTED = 1,
+ PAGESTATE_SELELECTED = 2,
+ };
+
+ enum
+ {
+ SLIDE_TO_BOTTOM = 0,
+ SLIDE_TO_RIGHT,
+ SLIDE_TO_TOP,
+ SLIDE_TO_LEFT,
+ SLIDE_MAX
+ };
+
+ int32 m_currentPage;
+ int32 m_newPage;
+ int32 m_pageState;
+ uint32 m_nPageLeftTimer;
+ uint32 m_nPageRightTimer;
+ uint32 m_nChangePageTimer;
+ int field_18;
+ uint8 m_fade;
+ uint8 m_someAlpha;
+ //char field_1E; // unused ?
+ //char field_1F; // unused ?
+ uint32 m_nStartPauseTimer;
+ uint32 m_nEndPauseTimer;
+ CVector2D m_position;
+ uint8 m_nSlidingDir;
+ //char field_31; // unused ?
+ //char field_32; // unused ?
+ //char field_33; // unused ?
+ bool m_bInitialised;
+ bool m_bWantToUpdateContent;
+ bool m_bMenuActive;
+ bool m_bWantToRestart;
+ //char field_38; //unused ?
+ bool m_bRenderGameInMenu;
+ bool m_bSaveMenuActive;
+ bool m_bInSaveZone;
+ char field_3C;
+ bool m_bTexturesLoaded;
+ //char field_3E; //unused ?
+ //char field_3F; //unused ?
+ CSprite2d m_sprites[NUM_SPRIRES];
+
+ static int32 m_PrefsSfxVolume;
+ static int32 m_PrefsMusicVolume;
+ static int32 m_PrefsBrightness;
+ static bool m_PrefsShowTrails;
+ static bool m_PrefsShowSubtitles;
+ static bool m_PrefsAllowNastyGame;
+ static int32 m_PrefsRadioStation;
+ static int32 m_PrefsStereoMono;
+ static int8 m_PrefsUseWideScreen;
+ static int32 m_PrefsLanguage;
+ static CONTRCONFIG m_PrefsControllerConfig;
+ static bool m_PrefsUseVibration;
+
+
+#ifdef GTA_PC
+ bool m_bQuitGameNoCD;
+
+ int32 m_nMouseTempPosX;
+ int32 m_nMouseTempPosY;
+ int32 m_nPrefsVideoMode;
+ int32 m_nDisplayVideoMode;
+ int8 m_nPrefsAudio3DProviderIndex;
+
+ static int32 OS_Language;
+ static int8 m_PrefsVsync;
+ static int8 m_PrefsVsyncDisp;
+ static int8 m_PrefsFrameLimiter;
+ static int8 m_PrefsSpeakers;
+ static int32 m_ControlMethod;
+ static int8 m_PrefsDMA;
+ static float m_PrefsLOD;
+ static char m_PrefsSkinFile[256];
+
+#ifndef MASTER
+ static bool m_PrefsMarketing;
+ static bool m_PrefsDisableTutorials;
+#endif // !MASTER
+
+#ifdef MENU_MAP
+ static bool bMenuMapActive;
+ static float fMapSize;
+ static float fMapCenterY;
+ static float fMapCenterX;
+#endif
+
+#ifdef IMPROVED_VIDEOMODE
+ int32 m_nPrefsWidth = 640;
+ int32 m_nPrefsHeight = 480;
+ int32 m_nPrefsDepth = 32;
+ int32 m_nPrefsWindowed = 1;
+ int32 m_nPrefsSubsystem;
+ int32 m_nSelectedScreenMode;
+#endif
+
+ void WaitForUserCD() { }
+#endif
+
+ bool GetIsMenuActive() {return !!m_bMenuActive;}
+
+ CMenuManager(void);
+#ifdef FIX_BUGS
+ ~CMenuManager(void)
+ {
+ UnloadTextures();
+ }
+#endif
+
+ void LoadAllTextures(void);
+ void UnloadTextures(void);
+
+ void InitialiseMenusOnce(void);
+ void InitialiseChangedLanguageSettings(void);
+ void InitialiseMenuContents(void);
+ void AnaliseMenuContents(void);
+ void InitialiseMenuContentsAfterLoadingGame(void);
+ void DrawFrontEnd(void);
+ void DrawFrontEndNormal(void);
+ void DrawFrontEndSaveZone(void);
+ void DrawMemoryCardStartUpMenus(void);
+ void Process(void);
+ void WorkOutMenuState(uint8 bExit);
+ void ProcessControllerInput(void);
+ void ProcessDPadLeftJustDown(void);
+ void ProcessDPadRightJustDown(void);
+ void ProcessDPadUpJustDown(void);
+ void ProcessDPadDownJustDown(void);
+ void ProcessDPadTriangleJustDown(void);
+ void ProcessDPadCrossJustDown(void);
+ void DoHackingMenusAtPageBrowse(void);
+ void SetSoundLevelsForMusicMenu(void);
+ void FilterOutColorMarkersFromString(wchar *string, CRGBA &color);
+};
+
+extern CMenuManager FrontEndMenuManager; \ No newline at end of file
diff --git a/src/core/Game.cpp b/src/core/Game.cpp
index 3f75b46b..e3ef8aed 100644
--- a/src/core/Game.cpp
+++ b/src/core/Game.cpp
@@ -43,6 +43,7 @@
#include "Lights.h"
#include "MBlur.h"
#include "Messages.h"
+#include "MemoryCard.h"
#include "Pad.h"
#include "Particle.h"
#include "ParticleObject.h"
@@ -104,6 +105,43 @@ bool CGame::japaneseGame = false;
int gameTxdSlot;
+
+bool DoRWStuffStartOfFrame(int16 TopRed, int16 TopGreen, int16 TopBlue, int16 BottomRed, int16 BottomGreen, int16 BottomBlue, int16 Alpha);
+void DoRWStuffEndOfFrame(void);
+void MessageScreen(char *msg)
+{
+ //TODO: stretch_screen
+
+ CRect rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT);
+ CRGBA color(255, 255, 255, 255);
+
+ DoRWStuffStartOfFrame(50, 50, 50, 0, 0, 0, 255);
+
+ CSprite2d::InitPerFrame();
+ CFont::InitPerFrame();
+ DefinedState();
+
+ CSprite2d *splash = LoadSplash(NULL);
+ splash->Draw(rect, color, color, color, color);
+ splash->DrawRect(CRect(SCREEN_SCALE_X(20.0f), SCREEN_SCALE_Y(110.0f), SCREEN_SCALE_X(620.0f), SCREEN_SCALE_Y(300.0f)), CRGBA(50, 50, 50, 192));
+
+ CFont::SetFontStyle(FONT_BANK);
+ CFont::SetBackgroundOff();
+ CFont::SetWrapx(SCREEN_SCALE_FROM_RIGHT(190.0f)); // 450.0f
+ CFont::SetScale(SCREEN_SCALE_X(1.0f), SCREEN_SCALE_Y(1.0f));
+ CFont::SetCentreOn();
+ CFont::SetCentreSize(SCREEN_SCALE_FROM_RIGHT(190.0f)); // 450.0f
+ CFont::SetJustifyOff();
+ CFont::SetColor(CRGBA(255, 255, 255, 255));
+ CFont::SetDropColor(CRGBA(32, 32, 32, 255));
+ CFont::SetDropShadowPosition(3);
+ CFont::SetPropOn();
+ CFont::PrintString(SCREEN_SCALE_X(320.0f), SCREEN_SCALE_Y(130.0f), TheText.Get(msg));
+ CFont::DrawFonts();
+
+ DoRWStuffEndOfFrame();
+}
+
bool
CGame::InitialiseOnceBeforeRW(void)
{
@@ -278,6 +316,7 @@ bool CGame::Initialise(const char* datFile)
COcclusion::Init();
CCollision::Init();
CSetPieces::Init();
+ TheText.Load();
CTheZones::Init();
CUserDisplay::Init();
CMessages::Init();
@@ -286,6 +325,11 @@ bool CGame::Initialise(const char* datFile)
CRestart::Initialise();
CWorld::Initialise();
CParticle::Initialise();
+#ifdef PS2
+ gStartX = -180.0f;
+ gStartY = 180.0f;
+ gStartZ = 14.0f;
+#endif
CAnimManager::Initialise();
CCutsceneMgr::Initialise();
CCarCtrl::Init();
@@ -366,10 +410,16 @@ bool CGame::Initialise(const char* datFile)
CCredits::Init();
CRecordDataForChase::Init();
CReplay::Init();
- LoadingScreen("Loading the Game", "Start script", nil);
+#ifdef PS2_MENU
+ if ( !TheMemoryCard.m_bWantToLoad )
+ {
+#endif
CTheScripts::StartTestScript();
CTheScripts::Process();
TheCamera.Process();
+#ifdef PS2_MENU
+ }
+#endif
LoadingScreen("Loading the Game", "Load scene", nil);
CCollision::ms_collisionInMemory = currLevel;
for (int i = 0; i < MAX_PADS; i++)
@@ -433,8 +483,15 @@ bool CGame::ShutDown(void)
void CGame::ReInitGameObjectVariables(void)
{
CGameLogic::InitAtStartOfGame();
- TheCamera.CCamera::Init();
+#ifdef PS2_MENU
+ if ( !TheMemoryCard.m_bWantToLoad )
+ {
+#endif
+ TheCamera.Init();
TheCamera.SetRwCamera(Scene.camera);
+#ifdef PS2_MENU
+ }
+#endif
CDebug::DebugInitTextBuffer();
CWeather::Init();
CUserDisplay::Init();
@@ -443,6 +500,11 @@ void CGame::ReInitGameObjectVariables(void)
CWorld::bDoingCarCollisions = false;
CHud::ReInitialise();
CRadar::Initialise();
+#ifdef PS2
+ gStartX = -180.0f;
+ gStartY = 180.0f;
+ gStartZ = 14.0f;
+#endif
CCarCtrl::ReInit();
CTimeCycle::Initialise();
CDraw::SetFOV(120.0f);
@@ -458,6 +520,10 @@ void CGame::ReInitGameObjectVariables(void)
CWorld::Players[i].Clear();
CWorld::PlayerInFocus = 0;
+#ifdef PS2
+ CWeaponEffects::Init();
+ CSkidmarks::Init();
+#endif
CAntennas::Init();
CGlass::Init();
gPhoneInfo.Initialise();
@@ -473,11 +539,19 @@ void CGame::ReInitGameObjectVariables(void)
CPickups::Init();
CPacManPickups::Init();
CGarages::Init();
+#ifdef PS2
+ CClouds::Init();
+ CRemote::Init();
+#endif
CSpecialFX::Init();
CWaterCannons::Init();
CParticle::ReloadConfig();
+#ifdef PS2_MENU
+ if ( !TheMemoryCard.m_bWantToLoad )
+#else
if ( !FrontEndMenuManager.m_bWantToLoad )
+#endif
{
CCranes::InitCranes();
CTheScripts::StartTestScript();
@@ -589,8 +663,8 @@ void CGame::Process(void)
ProcessTidyUpMemory();
#endif
TheCamera.SetMotionBlurAlpha(0);
- if (TheCamera.m_BlurType == MBLUR_NONE || TheCamera.m_BlurType == MBLUR_SNIPER || TheCamera.m_BlurType == MBLUR_NORMAL)
- TheCamera.SetMotionBlur(0, 0, 0, 0, MBLUR_NONE);
+ if (TheCamera.m_BlurType == MOTION_BLUR_NONE || TheCamera.m_BlurType == MOTION_BLUR_SNIPER || TheCamera.m_BlurType == MOTION_BLUR_LIGHT_SCENE)
+ TheCamera.SetMotionBlur(0, 0, 0, 0, MOTION_BLUR_NONE);
#ifdef DEBUGMENU
DebugMenuProcess();
#endif
diff --git a/src/core/Pad.cpp b/src/core/Pad.cpp
index 56c05c71..99b9c8a8 100644
--- a/src/core/Pad.cpp
+++ b/src/core/Pad.cpp
@@ -40,13 +40,27 @@
#include "Fluff.h"
#include "Gangs.h"
+#ifdef GTA_PS2
+#include "eetypes.h"
+#include "libpad.h"
+#endif
+
CPad Pads[MAX_PADS];
+#ifdef GTA_PS2
+u_long128 pad_dma_buf[scePadDmaBufferMax] __attribute__((aligned(64)));
+u_long128 pad2_dma_buf[scePadDmaBufferMax] __attribute__((aligned(64)));
+#endif
+
CMousePointerStateHelper MousePointerStateHelper;
bool CPad::bDisplayNoControllerMessage;
bool CPad::bObsoleteControllerMessage;
bool CPad::bOldDisplayNoControllerMessage;
bool CPad::m_bMapPadOneToPadTwo;
+#ifdef GTA_PS2
+unsigned char act_direct[6];
+unsigned char act_align[6];
+#endif
CKeyboardState CPad::OldKeyState;
CKeyboardState CPad::NewKeyState;
@@ -523,24 +537,24 @@ CControllerState::Clear(void)
void CKeyboardState::Clear()
{
- for ( int32 i = 0; i < 12; i++ )
+ for ( int32 i = 0; i < ARRAY_SIZE(F); i++ )
F[i] = 0;
-
- for ( int32 i = 0; i < 256; i++ )
+
+ for ( int32 i = 0; i < ARRAY_SIZE(VK_KEYS); i++ )
VK_KEYS[i] = 0;
ESC = INS = DEL = HOME = END = PGUP = PGDN = 0;
-
+
UP = DOWN = LEFT = RIGHT = 0;
-
+
NUMLOCK = 0;
-
+
DIV = MUL = SUB = ADD = 0;
-
+
DECIMAL = NUM1 = NUM2 = NUM3 = NUM4 = 0;
-
+
NUM5 = NUM6 = NUM7 = NUM8 = 0;
-
+
NUM9 = NUM0 = SCROLLLOCK = PAUSE = 0;
BACKSP = TAB = CAPSLOCK = EXTENTER = 0;
@@ -553,15 +567,21 @@ void CKeyboardState::Clear()
#ifdef GTA_PS2_STUFF
void CPad::Initialise(void)
{
+#ifdef GTA_PS2
+ scePadInit(0);
+
+ scePadPortOpen(0, 0, pad_dma_buf );
+ scePadPortOpen(1, 0, pad2_dma_buf );
+#endif
for (int i = 0; i < MAX_PADS; i++)
{
CPad::GetPad(i)->Clear(true);
CPad::GetPad(i)->Mode = 0;
}
-
- bObsoleteControllerMessage = false;
+
+ bObsoleteControllerMessage = false;
bOldDisplayNoControllerMessage = false;
- bDisplayNoControllerMessage = false;
+ bDisplayNoControllerMessage = false;
}
#endif
@@ -569,37 +589,37 @@ void CPad::Clear(bool bResetPlayerControls)
{
NewState.Clear();
OldState.Clear();
-
+
PCTempKeyState.Clear();
PCTempJoyState.Clear();
PCTempMouseState.Clear();
-
+
NewKeyState.Clear();
OldKeyState.Clear();
TempKeyState.Clear();
-
+
NewMouseControllerState.Clear();
OldMouseControllerState.Clear();
PCTempMouseControllerState.Clear();
-
+
Phase = 0;
ShakeFreq = 0;
ShakeDur = 0;
-
+
if ( bResetPlayerControls )
DisablePlayerControls = PLAYERCONTROL_ENABLED;
-
+
bApplyBrakes = false;
-
-
+
+
for ( int32 i = 0; i < HORNHISTORY_SIZE; i++ )
bHornHistory[i] = false;
-
+
iCurrHornHistory = 0;
-
+
for ( int32 i = 0; i < ARRAY_SIZE(CheatString); i++ )
CheatString[i] = ' ';
-
+
LastTimeTouched = CTimer::GetTimeInMilliseconds();
AverageWeapon = 0;
AverageEntries = 0;
@@ -626,7 +646,7 @@ CMouseControllerState::CMouseControllerState()
WHEELDN = 0;
MXB1 = 0;
MXB2 = 0;
-
+
x = 0.0f;
y = 0.0f;
}
@@ -645,16 +665,16 @@ void CMouseControllerState::Clear()
CMouseControllerState CMousePointerStateHelper::GetMouseSetUp()
{
CMouseControllerState state;
-
+
#if defined RW_D3D9 || defined RWLIBS
if ( PSGLOBAL(mouse) == nil )
_InputInitialiseMouse();
-
+
if ( PSGLOBAL(mouse) != nil )
{
DIDEVCAPS devCaps;
devCaps.dwSize = sizeof(DIDEVCAPS);
-
+
PSGLOBAL(mouse)->GetCapabilities(&devCaps);
switch ( devCaps.dwButtons )
{
@@ -665,14 +685,14 @@ CMouseControllerState CMousePointerStateHelper::GetMouseSetUp()
case 7:
case 8:
state.MMB = true;
-
+
case 2:
state.RMB = true;
-
+
case 1:
state.LMB = true;
}
-
+
if ( devCaps.dwAxes == 3 )
{
state.WHEELDN = true;
@@ -703,9 +723,9 @@ void CPad::UpdateMouse()
#if defined RW_D3D9 || defined RWLIBS
if ( PSGLOBAL(mouse) == nil )
_InputInitialiseMouse();
-
+
DIMOUSESTATE2 state;
-
+
if ( PSGLOBAL(mouse) != nil && SUCCEEDED(_InputGetMouseState(&state)) )
{
int32 signX = 1;
@@ -718,9 +738,9 @@ void CPad::UpdateMouse()
if ( MousePointerStateHelper.bInvertHorizontally )
signX = -1;
}
-
+
PCTempMouseControllerState.Clear();
-
+
PCTempMouseControllerState.x = (float)(signX * state.lX);
PCTempMouseControllerState.y = (float)(signy * state.lY);
PCTempMouseControllerState.LMB = state.rgbButtons[0] & 128;
@@ -728,12 +748,12 @@ void CPad::UpdateMouse()
PCTempMouseControllerState.MMB = state.rgbButtons[2] & 128;
PCTempMouseControllerState.MXB1 = state.rgbButtons[3] & 128;
PCTempMouseControllerState.MXB2 = state.rgbButtons[4] & 128;
-
+
if ( state.lZ > 0 )
PCTempMouseControllerState.WHEELUP = 1;
else if ( state.lZ < 0 )
PCTempMouseControllerState.WHEELDN = 1;
-
+
OldMouseControllerState = NewMouseControllerState;
NewMouseControllerState = PCTempMouseControllerState;
}
@@ -782,12 +802,12 @@ void CPad::UpdateMouse()
CControllerState CPad::ReconcileTwoControllersInput(CControllerState const &State1, CControllerState const &State2)
{
static CControllerState ReconState;
-
+
ReconState.Clear();
#define _RECONCILE_BUTTON(button) \
{ if ( State1.button || State2.button ) ReconState.button = 255; }
-
+
#define _RECONCILE_AXIS_POSITIVE(axis) \
{ if ( State1.axis >= 0 && State2.axis >= 0 ) ReconState.axis = Max(State1.axis, State2.axis); }
@@ -796,10 +816,10 @@ CControllerState CPad::ReconcileTwoControllersInput(CControllerState const &Stat
#define _RECONCILE_AXIS(axis) \
{ _RECONCILE_AXIS_POSITIVE(axis); _RECONCILE_AXIS_NEGATIVE(axis); }
-
+
#define _FIX_AXIS_DIR(axis) \
{ if ( State1.axis > 0 && State2.axis < 0 || State1.axis < 0 && State2.axis > 0 ) ReconState.axis = 0; }
-
+
#define _FIX_RECON_DIR(pos, neg, axis) \
{ if ( (ReconState.pos || ReconState.axis < 0) && (ReconState.neg || ReconState.axis > 0) ) { ReconState.pos = 0; ReconState.neg = 0; ReconState.axis = 0; } }
@@ -832,7 +852,7 @@ CControllerState CPad::ReconcileTwoControllersInput(CControllerState const &Stat
_FIX_RECON_DIR(DPadLeft, DPadRight, LeftStickX);
return ReconState;
-
+
#undef _RECONCILE_BUTTON
#undef _RECONCILE_AXIS_POSITIVE
#undef _RECONCILE_AXIS_NEGATIVE
@@ -845,17 +865,17 @@ void CPad::StartShake(int16 nDur, uint8 nFreq)
{
if ( !FrontEndMenuManager.m_PrefsUseVibration )
return;
-
+
if ( CCutsceneMgr::IsRunning() || CGame::playingIntro )
return;
-
+
if ( nFreq == 0 )
{
ShakeDur = 0;
ShakeFreq = 0;
return;
}
-
+
if ( nDur > ShakeDur )
{
ShakeDur = nDur;
@@ -867,12 +887,12 @@ void CPad::StartShake_Distance(int16 nDur, uint8 nFreq, float fX, float fY, floa
{
if ( !FrontEndMenuManager.m_PrefsUseVibration )
return;
-
+
if ( CCutsceneMgr::IsRunning() || CGame::playingIntro )
return;
-
+
float fDist = ( TheCamera.GetPosition() - CVector(fX, fY, fZ) ).Magnitude();
-
+
if ( fDist < 70.0f )
{
if ( nFreq == 0 )
@@ -881,7 +901,7 @@ void CPad::StartShake_Distance(int16 nDur, uint8 nFreq, float fX, float fY, floa
ShakeFreq = 0;
return;
}
-
+
if ( nDur > ShakeDur )
{
ShakeDur = nDur;
@@ -894,15 +914,15 @@ void CPad::StartShake_Train(float fX, float fY)
{
if ( !FrontEndMenuManager.m_PrefsUseVibration )
return;
-
+
if ( CCutsceneMgr::IsRunning() || CGame::playingIntro )
return;
-
+
if (FindPlayerVehicle() != nil && FindPlayerVehicle()->IsTrain() )
return;
-
+
float fDist = ( TheCamera.GetPosition() - CVector(fX, fY, 0.0f) ).Magnitude2D();
-
+
if ( fDist < 70.0f )
{
int32 freq = (int32)((70.0f - fDist) * 70.0f / 70.0f + 30.0f);
@@ -920,10 +940,10 @@ void CPad::AddToCheatString(char c)
{
for ( int32 i = ARRAY_SIZE(CheatString) - 2; i >= 0; i-- )
CheatString[i + 1] = CheatString[i];
-
+
CheatString[0] = c;
-#define _CHEATCMP(str) strncmp(str, CheatString, sizeof(str)-1)
+#define _CHEATCMP(str) strncmp(str, CheatString, sizeof(str)-1)
// "4414LDRULDRU" - R2 R2 L1 R2 LEFT DOWN RIGHT UP LEFT DOWN RIGHT UP
if ( !_CHEATCMP("URDLURDL4144") )
WeaponCheat1();
@@ -931,11 +951,11 @@ void CPad::AddToCheatString(char c)
// "4411LDRULDRU" - R2 R2 L1 L1 LEFT DOWN RIGHT UP LEFT DOWN RIGHT UP
else if ( !_CHEATCMP("URDLURDL1144") )
MoneyCheat();
-
+
// "4412LDRULDRU" - R2 R2 L1 L2 LEFT DOWN RIGHT UP LEFT DOWN RIGHT UP
else if ( !_CHEATCMP("URDLURDL2144") )
ArmourCheat();
-
+
// "4413LDRULDRU" - R2 R2 L1 R1 LEFT DOWN RIGHT UP LEFT DOWN RIGHT UP
else if ( !_CHEATCMP("URDLURDL3144") )
HealthCheat();
@@ -943,59 +963,59 @@ void CPad::AddToCheatString(char c)
// "4414LRLRLR" - R2 R2 L1 R2 LEFT RIGHT LEFT RIGHT LEFT RIGHT
else if ( !_CHEATCMP("RLRLRL4144") )
WantedLevelUpCheat();
-
+
// "4414UDUDUD" - R2 R2 L1 R2 UP DOWN UP DOWN UP DOWN
else if ( !_CHEATCMP("DUDUDU4144") )
WantedLevelDownCheat();
-
+
// "1234432T" - L1 L2 R1 R2 R2 R1 L2 TRIANGLE
else if ( !_CHEATCMP("T2344321") )
SunnyWeatherCheat();
-
+
// "1234432S" - L1 L2 R1 R2 R2 R1 L2 SQUARE
else if ( !_CHEATCMP("S2344321") )
CloudyWeatherCheat();
-
+
// "1234432C" - L1 L2 R1 R2 R2 R1 L2 CIRCLE
else if ( !_CHEATCMP("C2344321") )
RainyWeatherCheat();
-
+
// "1234432X" - L1 L2 R1 R2 R2 R1 L2 CROSS
else if ( !_CHEATCMP("X2344321") )
FoggyWeatherCheat();
-
+
// "CCCCCC321TCT" - CIRCLE CIRCLE CIRCLE CIRCLE CIRCLE CIRCLE R1 L2 L1 TRIANGLE CIRCLE TRIANGLE
else if ( !_CHEATCMP("TCT123CCCCCC") )
VehicleCheat(true, MI_RHINO);
-
+
// "CCCSSSSS1TCT" - CIRCLE CIRCLE CIRCLE SQUARE SQUARE SQUARE SQUARE SQUARE L1 TRIANGLE CIRCLE TRIANGLE
else if ( !_CHEATCMP("TCT1SSSSSCCC") )
FastWeatherCheat();
-
+
// "241324TSCT21" - L2 R2 L1 R1 L2 R2 TRIANGLE SQUARE CIRCLE TRIANGLE L2 L1
else if ( !_CHEATCMP("12TCST423142") )
BlowUpCarsCheat();
-
+
// "RDLU12ULDR" - RIGHT DOWN LEFT UP L1 L2 UP LEFT DOWN RIGHT
else if ( !_CHEATCMP("RDLU21ULDR") )
ChangePlayerCheat();
-
+
// "DULUX3421" - DOWN UP LEFT UP CROSS R1 R2 L2 L1
else if ( !_CHEATCMP("1243XULUD") )
MayhemCheat();
-
+
// "DULUX3412" - DOWN UP LEFT UP CROSS R1 R2 L1 L2
else if ( !_CHEATCMP("2143XULUD") )
EverybodyAttacksPlayerCheat();
-
+
// "43TX21UD" - R2 R1 TRIANGLE CROSS L2 L1 UP DOWN
else if ( !_CHEATCMP("DU12XT34") )
WeaponsForAllCheat();
-
+
// "TURDS12" - TRIANGLE UP RIGHT DOWN SQUARE L1 L2
else if ( !_CHEATCMP("21SDRUT") )
FastTimeCheat();
-
+
// "TURDS34" - TRIANGLE UP RIGHT DOWN SQUARE R1 R2
else if ( !_CHEATCMP("43SDRUT") )
SlowTimeCheat();
@@ -1003,15 +1023,15 @@ void CPad::AddToCheatString(char c)
// "11S4T1T" - L1 L1 SQUARE R2 TRIANGLE L1 TRIANGLE
else if ( !_CHEATCMP("T1T4S11") )
OnlyRenderWheelsCheat();
-
+
// "R4C32D13" - RIGHT R2 CIRCLE R1 L2 DOWN L1 R1
else if ( !_CHEATCMP("31D23C4R") )
ChittyChittyBangBangCheat();
-
+
// "3141L33T" - R1 L1 R2 L1 LEFT R1 R1 TRIANGLE
else if ( !_CHEATCMP("T33L1413") )
StrongGripCheat();
-
+
// "S1CD13TR1X" - SQUARE L1 CIRCLE DOWN L1 R1 TRIANGLE RIGHT L1 CROSS
else if ( !_CHEATCMP("X1RT31DC1S") )
NastyLimbsCheat();
@@ -1401,7 +1421,7 @@ void CPad::AffectFromXinput(uint32 pad)
uint16 iLeftMotor = (uint16)((float)ShakeFreq / 255.0f * (float)0xffff);
uint16 iRightMotor = (uint16)((float)ShakeFreq / 255.0f * (float)0xffff);
-
+
if (ShakeDur < CTimer::GetTimeStepInMilliseconds())
ShakeDur = 0;
else
@@ -1416,10 +1436,10 @@ void CPad::AffectFromXinput(uint32 pad)
}
#endif
-void CPad::UpdatePads(void)
+void CPad::UpdatePads(void)
{
bool bUpdate = true;
-
+
GetPad(0)->UpdateMouse();
#ifdef XINPUT
GetPad(0)->AffectFromXinput(m_bMapPadOneToPadTwo ? 1 : 0);
@@ -1441,10 +1461,10 @@ void CPad::UpdatePads(void)
if (IsAffectedByController && (GetPad(0)->PCTempKeyState.CheckForInput() || GetPad(0)->PCTempMouseState.CheckForInput()))
IsAffectedByController = false;
#endif
-
+
if ( CReplay::IsPlayingBackFromFile() && !FrontEndMenuManager.m_bMenuActive )
bUpdate = false;
-
+
if ( bUpdate )
{
GetPad(0)->Update(0);
@@ -1455,7 +1475,7 @@ void CPad::UpdatePads(void)
GetPad(1)->NewState.Clear();
GetPad(1)->OldState.Clear();
#endif
-
+
OldKeyState = NewKeyState;
NewKeyState = TempKeyState;
}
@@ -1465,12 +1485,269 @@ void CPad::ProcessPCSpecificStuff(void)
;
}
-void CPad::Update(int16 unk)
+void CPad::Update(int16 pad)
{
OldState = NewState;
-
+
+#ifdef GTA_PS2
+ bObsoleteControllerMessage = false;
+
+ //int iPressureBtn;
+ int id;
+ int ext_id=0;
+ int state;
+ int rterm_id = 0;
+ unsigned short paddata, tpad;
+ unsigned char rdata[32];
+
+ state = scePadGetState(pad, 0);
+
+ switch(Phase)
+ {
+ case 0:
+ if (state != scePadStateStable && state != scePadStateFindCTP1)
+ break;
+ id = scePadInfoMode(pad, 0, InfoModeCurID, 0);
+ if (id==0) break;
+
+ ext_id = scePadInfoMode(pad, 0, InfoModeCurExID, 0);
+ if (ext_id>0) id = ext_id;
+
+ switch(id)
+ {
+ case 4: // Digital controller
+ Phase = 40; // Try for analog(dualshock)
+ break;
+ case 7: // Dualshock2 controller
+ Phase = 50;
+ break;
+ default:
+ Phase = 99;
+ break;
+ }
+ break;
+
+ // Analog Controller (old dualshock)
+ case 40: // Analog Contoller check valid (otherwise fail phase)
+ if (scePadInfoMode(pad, 0, InfoModeIdTable, -1)==0)
+ {
+ Phase = 99;
+ break;
+ }
+ Phase++;
+
+ case 41: // Analog controller: Request Lock analog mode (asynchronous)
+ if (scePadSetMainMode(pad, 0, 1, 3)==1) Phase++;
+ break;
+
+ case 42: // Analog controller: Check state of previous request
+ if (scePadGetReqState(pad, 0)==scePadReqStateFaild)
+ {
+ Phase--;
+ }
+
+ if (scePadGetReqState(pad, 0)==scePadReqStateComplete)
+ {
+ // Lock mode complete
+ Phase=0; // Accept normal dualshock
+ }
+ break;
+
+ // DualShock 2 Controller
+ case 50: // Analog Contoller check valid (otherwise fail phase)
+ if (scePadInfoMode(pad, 0, InfoModeIdTable, -1)==0)
+ {
+ Phase = 99;
+ break;
+ }
+ Phase++;
+
+ case 51: // Analog controller: Request Lock analog mode (asynchronous)
+ if (scePadSetMainMode(pad, 0, 1, 3)==1) Phase++;
+ break;
+
+ case 52: // Analog controller: Check state of previous request
+ if (scePadGetReqState(pad, 0)==scePadReqStateFaild)
+ {
+ Phase--;
+ }
+
+ if (scePadGetReqState(pad, 0)==scePadReqStateComplete)
+ {
+ // Lock mode complete
+ Phase=0; // Accept normal dualshock
+ }
+ break;
+
+ case 70: // DualShock 2 check pressure sensitive possible
+ if (scePadInfoPressMode(pad, 0)==1)
+ {
+ Phase = 76;
+ break;
+ }
+ Phase = 99;
+ break;
+
+ case 76: // DualShock2 enable pressure sensitive mode (asynchronous function)
+ if (scePadEnterPressMode(pad, 0)==1) Phase++;
+ break;
+
+ case 77: // Dualshock2 check status of request pressure sensitive mode
+ if (scePadGetReqState(pad, 0)==scePadReqStateFaild) Phase--;
+ if (scePadGetReqState(pad, 0)==scePadReqStateComplete)
+ {
+ Phase=80;
+ }
+ break;
+
+ // DualShock 2 Controller
+ case 80: // Set motors
+ if (scePadInfoAct(pad, 0, -1, 0)==0)
+ {
+ Phase = 99;
+ }
+
+ act_align[0] = 0; // Offset 0 for motor0
+ act_align[1] = 1; // Offset 1 for motor1
+
+ act_align[2] = 0xff;
+ act_align[3] = 0xff;
+ act_align[4] = 0xff;
+ act_align[5] = 0xff;
+
+ // Asynchronous function
+ if (scePadSetActAlign(pad, 0, act_align)==0) break;
+ Phase++;
+ break;
+
+
+ case 81:
+ if ( scePadGetState(pad, 0) != scePadStateExecCmd )
+ {
+ Phase = 99;
+ }
+
+ break;
+
+ default:
+ if ( state == scePadStateError ) break;
+
+ if ( state == scePadStateStable || state == scePadStateFindCTP1 )
+ {
+ if ( ShakeDur )
+ {
+ ShakeDur = Max(ShakeDur - CTimer::GetTimeStepInMilliseconds(), 0);
+
+ if ( ShakeDur == 0 )
+ {
+ act_direct[0] = 0;
+ act_direct[1] = 0;
+ scePadSetActDirect(pad, 0, act_direct);
+ }
+ else
+ {
+ act_direct[0] = 0;
+ act_direct[1] = (unsigned char) ShakeFreq;
+ scePadSetActDirect(pad, 0, act_direct);
+ }
+ }
+
+ if (scePadRead( pad, 0, rdata )==0)
+ {
+ NewState.Clear();
+ break;
+ }
+
+ if ((rdata[0] == 0))
+ {
+ paddata = (unsigned short) ( 0xffff ^ ((rdata[2]<<8)|rdata[3]) );
+ rterm_id = (rdata[1]);
+
+ if ( (rterm_id>>4) == 7 ) // DUALSHOCK
+ {
+ if (!CRecordDataForGame::IsPlayingBack() && !CRecordDataForChase::ShouldThisPadBeLeftAlone(pad))
+ {
+ tpad = paddata;
+
+ NewState.DPadUp = ( tpad & SCE_PADLup ) ? 255 : 0;
+ NewState.DPadDown = ( tpad & SCE_PADLdown ) ? 255 : 0;
+ NewState.DPadLeft = ( tpad & SCE_PADLleft ) ? 255 : 0;
+ NewState.DPadRight = ( tpad & SCE_PADLright ) ? 255 : 0;
+ NewState.Triangle = ( tpad & SCE_PADRup ) ? 255 : 0;
+ NewState.Cross = ( tpad & SCE_PADRdown ) ? 255 : 0;
+ NewState.Square = ( tpad & SCE_PADRleft ) ? 255 : 0;
+ NewState.Circle = ( tpad & SCE_PADRright ) ? 255 : 0;
+ NewState.Start = ( tpad & SCE_PADstart ) ? 255 : 0;
+ NewState.Select = ( tpad & SCE_PADselect ) ? 255 : 0;
+ NewState.LeftShoulder1 = ( tpad & SCE_PADL1 ) ? 255 : 0;
+ NewState.LeftShoulder2 = ( tpad & SCE_PADL2 ) ? 255 : 0;
+ NewState.RightShoulder1 = ( tpad & SCE_PADR1 ) ? 255 : 0;
+ NewState.RightShoulder2 = ( tpad & SCE_PADR2 ) ? 255 : 0;
+ NewState.LeftShock = ( tpad & SCE_PADi ) ? 255 : 0;
+ NewState.RightShock = ( tpad & SCE_PADj ) ? 255 : 0;
+ NewState.RightStickX = (short)rdata[4];
+ NewState.RightStickY = (short)rdata[5];
+ NewState.LeftStickX = (short)rdata[6];
+ NewState.LeftStickY = (short)rdata[7];
+
+ #define CLAMP_AXIS(x) (((x) < 43 && (x) >= -42) ? 0 : (((x) > 0) ? (Max((x)-42, 0)*127/85) : Min((x)+42, 0)*127/85))
+ #define FIX_AXIS(x) CLAMP_AXIS((x)-128)
+
+ NewState.RightStickX = FIX_AXIS(NewState.RightStickX);
+ NewState.RightStickY = FIX_AXIS(NewState.RightStickY);
+ NewState.LeftStickX = FIX_AXIS(NewState.LeftStickX);
+ NewState.LeftStickY = FIX_AXIS(NewState.LeftStickY);
+
+ #undef FIX_AXIS
+ #undef CLAMP_AXIS
+ }
+ }
+ else if ( (rterm_id>>4) == 4 ) // Controller (digital)
+ {
+ if ( pad == 0 )
+ bObsoleteControllerMessage = true;
+ NewState.Clear();
+ }
+
+ if ( NewState.IsAnyButtonPressed() )
+ LastTimeTouched = CTimer::GetTimeInMilliseconds();
+
+ break;
+ }
+
+ if ( ++iCurrHornHistory >= HORNHISTORY_SIZE )
+ iCurrHornHistory = 0;
+
+ bHornHistory[iCurrHornHistory] = GetHorn();
+ NewState.Clear();
+ return;
+ }
+ break;
+ }
+
+ if ( pad == 0 )
+ {
+ bOldDisplayNoControllerMessage = bDisplayNoControllerMessage;
+ if ( state == scePadStateDiscon )
+ {
+ bDisplayNoControllerMessage = true;
+ Phase = 0;
+ }
+ else
+ bDisplayNoControllerMessage = false;
+ }
+
+ if ( ++iCurrHornHistory >= HORNHISTORY_SIZE )
+ iCurrHornHistory = 0;
+
+ bHornHistory[iCurrHornHistory] = GetHorn();
+
+ if ( !bDisplayNoControllerMessage )
+ CGame::bDemoMode = false;
+#endif
+
#if (defined GTA_PS2 || defined FIX_BUGS)
- if (!CRecordDataForGame::IsPlayingBack() && !CRecordDataForChase::ShouldThisPadBeLeftAlone(unk))
+ if (!CRecordDataForGame::IsPlayingBack() && !CRecordDataForChase::ShouldThisPadBeLeftAlone(pad))
#endif
{
NewState = ReconcileTwoControllersInput(PCTempKeyState, PCTempJoyState);
@@ -1480,7 +1757,7 @@ void CPad::Update(int16 unk)
PCTempJoyState.Clear();
PCTempKeyState.Clear();
PCTempMouseState.Clear();
-
+
ProcessPCSpecificStuff();
if (NewState.CheckForInput())
@@ -1509,37 +1786,37 @@ void CPad::DoCheats(int16 unk)
#ifdef GTA_PS2_STUFF
if ( GetTriangleJustDown() )
AddToCheatString('T');
-
+
if ( GetCircleJustDown() )
AddToCheatString('C');
-
+
if ( GetCrossJustDown() )
AddToCheatString('X');
-
+
if ( GetSquareJustDown() )
AddToCheatString('S');
-
+
if ( GetDPadUpJustDown() )
AddToCheatString('U');
-
+
if ( GetDPadDownJustDown() )
AddToCheatString('D');
-
+
if ( GetDPadLeftJustDown() )
AddToCheatString('L');
-
+
if ( GetDPadRightJustDown() )
AddToCheatString('R');
-
+
if ( GetLeftShoulder1JustDown() )
AddToCheatString('1');
-
+
if ( GetLeftShoulder2JustDown() )
AddToCheatString('2');
-
+
if ( GetRightShoulder1JustDown() )
AddToCheatString('3');
-
+
if ( GetRightShoulder2JustDown() )
AddToCheatString('4');
#endif
@@ -1550,9 +1827,22 @@ void CPad::StopPadsShaking(void)
GetPad(0)->StopShaking(0);
}
-void CPad::StopShaking(int16 unk)
+void CPad::StopShaking(int16 pad)
{
- ;
+#ifdef GTA_PS2_STUFF
+ ShakeFreq = 0;
+ ShakeDur = 0;
+
+#ifdef GTA_PS2
+ if ( Phase == 99 )
+ {
+ act_direct[0] = 0;
+ act_direct[1] = 0;
+ scePadSetActDirect(pad, 0, act_direct);
+ }
+#endif
+
+#endif
}
CPad *CPad::GetPad(int32 pad)
@@ -1578,15 +1868,15 @@ int16 CPad::GetSteeringLeftRight(void)
{
int16 axis = NewState.LeftStickX;
int16 dpad = (NewState.DPadRight - NewState.DPadLeft) / 2;
-
+
if ( Abs(axis) > Abs(dpad) )
return axis;
else
return dpad;
-
+
break;
}
-
+
case 1:
case 3:
{
@@ -1595,7 +1885,7 @@ int16 CPad::GetSteeringLeftRight(void)
break;
}
}
-
+
return 0;
}
@@ -1611,15 +1901,15 @@ int16 CPad::GetSteeringUpDown(void)
{
int16 axis = NewState.LeftStickY;
int16 dpad = (NewState.DPadDown - NewState.DPadUp) / 2;
-
+
if ( Abs(axis) > Abs(dpad) )
return axis;
else
return dpad;
-
+
break;
}
-
+
case 1:
case 3:
{
@@ -1628,7 +1918,7 @@ int16 CPad::GetSteeringUpDown(void)
break;
}
}
-
+
return 0;
}
@@ -1644,18 +1934,18 @@ int16 CPad::GetCarGunUpDown(void)
case 2:
{
return NewState.RightStickY;
-
+
break;
}
-
+
case 3:
{
return (NewState.DPadUp - NewState.DPadDown) / 2;
-
+
break;
}
}
-
+
return 0;
}
@@ -1671,18 +1961,18 @@ int16 CPad::GetCarGunLeftRight(void)
case 2:
{
return NewState.RightStickX;
-
+
break;
}
-
+
case 3:
{
return (NewState.DPadRight - NewState.DPadLeft) / 2;
-
+
break;
}
}
-
+
return 0;
}
@@ -1698,15 +1988,15 @@ int16 CPad::GetPedWalkLeftRight(void)
{
int16 axis = NewState.LeftStickX;
int16 dpad = (NewState.DPadRight - NewState.DPadLeft) / 2;
-
+
if ( Abs(axis) > Abs(dpad) )
return axis;
else
return dpad;
-
+
break;
}
-
+
case 1:
case 3:
{
@@ -1715,7 +2005,7 @@ int16 CPad::GetPedWalkLeftRight(void)
break;
}
}
-
+
return 0;
}
@@ -1732,15 +2022,15 @@ int16 CPad::GetPedWalkUpDown(void)
{
int16 axis = NewState.LeftStickY;
int16 dpad = (NewState.DPadDown - NewState.DPadUp) / 2;
-
+
if ( Abs(axis) > Abs(dpad) )
return axis;
else
return dpad;
-
+
break;
}
-
+
case 1:
case 3:
{
@@ -1749,7 +2039,7 @@ int16 CPad::GetPedWalkUpDown(void)
break;
}
}
-
+
return 0;
}
@@ -1762,15 +2052,15 @@ int16 CPad::GetAnalogueUpDown(void)
{
int16 axis = NewState.LeftStickY;
int16 dpad = (NewState.DPadDown - NewState.DPadUp) / 2;
-
+
if ( Abs(axis) > Abs(dpad) )
return axis;
else
return dpad;
-
+
break;
}
-
+
case 1:
case 3:
{
@@ -1779,7 +2069,7 @@ int16 CPad::GetAnalogueUpDown(void)
break;
}
}
-
+
return 0;
}
@@ -1787,7 +2077,7 @@ bool CPad::GetLookLeft(void)
{
if ( ArePlayerControlsDisabled() )
return false;
-
+
return !!(NewState.LeftShoulder2 && !NewState.RightShoulder2);
}
@@ -1829,21 +2119,21 @@ bool CPad::GetHorn(void)
break;
}
-
+
case 1:
{
return !!NewState.LeftShoulder1;
break;
}
-
+
case 2:
{
return !!NewState.RightShoulder1;
break;
}
-
+
case 3:
{
return !!NewState.LeftShock;
@@ -1851,7 +2141,7 @@ bool CPad::GetHorn(void)
break;
}
}
-
+
return false;
}
@@ -1868,21 +2158,21 @@ bool CPad::HornJustDown(void)
break;
}
-
+
case 1:
{
return !!(NewState.LeftShoulder1 && !OldState.LeftShoulder1);
break;
}
-
+
case 2:
{
return !!(NewState.RightShoulder1 && !OldState.RightShoulder1);
break;
}
-
+
case 3:
{
return !!(NewState.LeftShock && !OldState.LeftShock);
@@ -1890,7 +2180,7 @@ bool CPad::HornJustDown(void)
break;
}
}
-
+
return false;
}
@@ -1910,7 +2200,7 @@ bool CPad::GetCarGunFired(void)
break;
}
-
+
case 3:
{
return !!NewState.RightShoulder1;
@@ -1918,7 +2208,7 @@ bool CPad::GetCarGunFired(void)
break;
}
}
-
+
return false;
}
@@ -1937,7 +2227,7 @@ bool CPad::CarGunJustDown(void)
break;
}
-
+
case 3:
{
return !!(NewState.RightShoulder1 && !OldState.RightShoulder1);
@@ -1945,7 +2235,7 @@ bool CPad::CarGunJustDown(void)
break;
}
}
-
+
return false;
}
@@ -1960,25 +2250,25 @@ int16 CPad::GetHandBrake(void)
case 1:
{
return NewState.RightShoulder1;
-
+
break;
}
-
+
case 2:
{
return NewState.Triangle;
-
+
break;
}
-
+
case 3:
{
return NewState.LeftShoulder1;
-
+
break;
}
}
-
+
return 0;
}
@@ -1993,30 +2283,30 @@ int16 CPad::GetBrake(void)
case 2:
{
return NewState.Square;
-
+
break;
}
-
+
case 1:
{
return NewState.Square;
break;
}
-
+
case 3:
{
int16 axis = 2 * NewState.RightStickY;
-
+
if ( axis < 0 )
return 0;
else
return axis;
-
+
break;
}
}
-
+
return 0;
}
@@ -2032,18 +2322,18 @@ bool CPad::GetExitVehicle(void)
case 3:
{
return !!NewState.Triangle;
-
+
break;
}
-
+
case 2:
{
return !!NewState.LeftShoulder1;
-
+
break;
}
}
-
+
return false;
}
@@ -2059,18 +2349,18 @@ bool CPad::ExitVehicleJustDown(void)
case 3:
{
return !!(NewState.Triangle && !OldState.Triangle);
-
+
break;
}
-
+
case 2:
{
return !!(NewState.LeftShoulder1 && !OldState.LeftShoulder1);
-
+
break;
}
}
-
+
return false;
}
@@ -2085,25 +2375,25 @@ int32 CPad::GetWeapon(void)
case 1:
{
return NewState.Circle;
-
+
break;
}
-
+
case 2:
{
return NewState.Cross;
-
+
break;
}
-
+
case 3:
{
return NewState.RightShoulder1;
-
+
break;
}
}
-
+
return false;
}
@@ -2118,25 +2408,25 @@ bool CPad::WeaponJustDown(void)
case 1:
{
return !!(NewState.Circle && !OldState.Circle);
-
+
break;
}
-
+
case 2:
{
return !!(NewState.Cross && !OldState.Cross);
-
+
break;
}
-
+
case 3:
{
return !!(NewState.RightShoulder1 && !OldState.RightShoulder1);
-
+
break;
}
}
-
+
return false;
}
@@ -2151,30 +2441,30 @@ int16 CPad::GetAccelerate(void)
case 2:
{
return NewState.Cross;
-
+
break;
}
-
+
case 1:
{
return NewState.Cross;
-
+
break;
}
-
+
case 3:
{
int16 axis = -2 * NewState.RightStickY;
-
+
if ( axis < 0 )
return 0;
- else
+ else
return axis;
-
+
break;
}
}
-
+
return 0;
}
@@ -2187,18 +2477,18 @@ bool CPad::CycleCameraModeUpJustDown(void)
case 3:
{
return !!(NewState.Select && !OldState.Select);
-
+
break;
}
-
+
case 1:
{
return !!(NewState.DPadUp && !OldState.DPadUp);
-
+
break;
}
}
-
+
return false;
}
@@ -2211,18 +2501,18 @@ bool CPad::CycleCameraModeDownJustDown(void)
case 3:
{
return false;
-
+
break;
}
-
+
case 1:
{
return !!(NewState.DPadDown && !OldState.DPadDown);
-
+
break;
}
}
-
+
return false;
}
@@ -2236,32 +2526,32 @@ bool CPad::ChangeStationJustDown(void)
case 0:
{
return !!(NewState.LeftShoulder1 && !OldState.LeftShoulder1);
-
+
break;
}
-
+
case 1:
{
return !!(NewState.Select && !OldState.Select);
-
+
break;
}
-
+
case 2:
{
return !!(NewState.LeftShock && !OldState.LeftShock);
-
+
break;
}
-
+
case 3:
{
return !!(NewState.Circle && !OldState.Circle);
-
+
break;
}
}
-
+
return false;
}
@@ -2270,7 +2560,7 @@ bool CPad::CycleWeaponLeftJustDown(void)
{
if ( ArePlayerControlsDisabled() )
return false;
-
+
return !!(NewState.LeftShoulder2 && !OldState.LeftShoulder2);
}
@@ -2294,18 +2584,18 @@ bool CPad::GetTarget(void)
case 2:
{
return !!NewState.RightShoulder1;
-
+
break;
}
-
+
case 3:
{
return !!NewState.LeftShoulder1;
-
+
break;
}
}
-
+
return false;
}
@@ -2321,18 +2611,18 @@ bool CPad::TargetJustDown(void)
case 2:
{
return !!(NewState.RightShoulder1 && !OldState.RightShoulder1);
-
+
break;
}
-
+
case 3:
{
return !!(NewState.LeftShoulder1 && !OldState.LeftShoulder1);
-
+
break;
}
}
-
+
return false;
}
@@ -2348,7 +2638,7 @@ bool CPad::JumpJustDown(void)
{
if ( ArePlayerControlsDisabled() )
return false;
-
+
return !!(NewState.Square && !OldState.Square);
}
@@ -2364,18 +2654,18 @@ bool CPad::GetSprint(void)
case 3:
{
return !!NewState.Cross;
-
+
break;
}
-
+
case 2:
{
return !!NewState.Circle;
-
+
break;
}
}
-
+
return false;
}
@@ -2398,9 +2688,9 @@ bool CPad::ShiftTargetRightJustDown(void)
bool CPad::GetAnaloguePadUp(void)
{
static int16 oldfStickY = 0;
-
+
int16 Y = CPad::GetPad(0)->GetAnalogueUpDown();
-
+
if ( Y < 0 && oldfStickY >= 0 )
{
oldfStickY = Y;
@@ -2416,9 +2706,9 @@ bool CPad::GetAnaloguePadUp(void)
bool CPad::GetAnaloguePadDown(void)
{
static int16 oldfStickY = 0;
-
+
int16 Y = CPad::GetPad(0)->GetAnalogueUpDown();
-
+
if ( Y > 0 && oldfStickY <= 0 )
{
oldfStickY = Y;
@@ -2434,9 +2724,9 @@ bool CPad::GetAnaloguePadDown(void)
bool CPad::GetAnaloguePadLeft(void)
{
static int16 oldfStickX = 0;
-
+
int16 X = CPad::GetPad(0)->GetPedWalkLeftRight();
-
+
if ( X < 0 && oldfStickX >= 0 )
{
oldfStickX = X;
@@ -2452,9 +2742,9 @@ bool CPad::GetAnaloguePadLeft(void)
bool CPad::GetAnaloguePadRight(void)
{
static int16 oldfStickX = 0;
-
+
int16 X = CPad::GetPad(0)->GetPedWalkLeftRight();
-
+
if ( X > 0 && oldfStickX <= 0 )
{
oldfStickX = X;
@@ -2470,19 +2760,19 @@ bool CPad::GetAnaloguePadRight(void)
bool CPad::GetAnaloguePadLeftJustUp(void)
{
static int16 oldfStickX = 0;
-
+
int16 X = GetPad(0)->GetPedWalkLeftRight();
-
+
if ( X == 0 && oldfStickX < 0 )
{
oldfStickX = X;
-
+
return true;
}
else
{
oldfStickX = X;
-
+
return false;
}
}
@@ -2490,19 +2780,19 @@ bool CPad::GetAnaloguePadLeftJustUp(void)
bool CPad::GetAnaloguePadRightJustUp(void)
{
static int16 oldfStickX = 0;
-
+
int16 X = GetPad(0)->GetPedWalkLeftRight();
-
+
if ( X == 0 && oldfStickX > 0 )
{
oldfStickX = X;
-
+
return true;
}
else
{
oldfStickX = X;
-
+
return false;
}
}
@@ -2518,25 +2808,25 @@ bool CPad::ForceCameraBehindPlayer(void)
case 1:
{
return !!NewState.LeftShoulder1;
-
+
break;
}
-
+
case 2:
{
return !!NewState.Triangle;
-
+
break;
}
-
+
case 3:
{
return !!NewState.Circle;
-
+
break;
}
}
-
+
return false;
}
@@ -2555,15 +2845,15 @@ bool CPad::SniperZoomIn(void)
break;
}
-
+
case 2:
{
return !!NewState.Triangle;
-
+
break;
}
}
-
+
return false;
}
@@ -2582,15 +2872,15 @@ bool CPad::SniperZoomOut(void)
break;
}
-
+
case 2:
{
return !!NewState.Square;
-
+
break;
}
}
-
+
return false;
}
@@ -2600,7 +2890,7 @@ int16 CPad::SniperModeLookLeftRight(void)
{
int16 axis = NewState.LeftStickX;
int16 dpad = (NewState.DPadRight - NewState.DPadLeft) / 2;
-
+
if ( Abs(axis) > Abs(dpad) )
return axis;
else
@@ -2614,7 +2904,7 @@ int16 CPad::SniperModeLookUpDown(void)
axis = -axis;
#endif
int16 dpad = (NewState.DPadUp - NewState.DPadDown) / 2;
-
+
if ( Abs(axis) > Abs(dpad) )
return axis;
else
@@ -2624,7 +2914,7 @@ int16 CPad::SniperModeLookUpDown(void)
int16 CPad::LookAroundLeftRight(void)
{
float axis = GetPad(0)->NewState.RightStickX;
-
+
if ( Abs(axis) > 85 && !GetLookBehindForPed() )
return (int16) ( (axis + ( ( axis > 0 ) ? -85 : 85) )
* (127.0f / 32.0f) ); // 3.96875f
@@ -2632,7 +2922,7 @@ int16 CPad::LookAroundLeftRight(void)
else if ( TheCamera.Cams[0].Using3rdPersonMouseCam() && Abs(axis) > 10 )
return (int16) ( (axis + ( ( axis > 0 ) ? -10 : 10) )
* (127.0f / 64.0f) ); // 1.984375f
-
+
return 0;
}
@@ -2698,27 +2988,27 @@ void CPad::PrintErrorMessage(void)
TheText.Get("WRCONT") // The controller connected to controller port 1 is an unsupported controller. Grand Theft Auto III requires an analog controller (DUALSHOCK@) or analog controller (DUALSHOCK@2).
);
}
-
+
}
void LittleTest(void)
{
static int32 Cunt = 0;
-
+
Cunt++; // ???
}
void CPad::ResetCheats(void)
{
CWeather::ReleaseWeather();
-
+
CPopulation::ms_bGivePedsWeapons = false;
-
+
CPed::bNastyLimbsCheat = false;
CPed::bFannyMagnetCheat = false;
CPed::bPedCheat2 = false;
CPed::bPedCheat3 = false;
-
+
CVehicle::bWheelsOnlyCheat = false;
CVehicle::bAllDodosCheat = false;
CVehicle::bCheat3 = false;
@@ -2727,7 +3017,7 @@ void CPad::ResetCheats(void)
CVehicle::bCheat8 = false;
gbBlackCars = false;
gbPinkCars = false;
-
+
gbFastTime = false;
CTimer::SetTimeScale(1.0f);
}
@@ -2735,7 +3025,7 @@ void CPad::ResetCheats(void)
char *CPad::EditString(char *pStr, int32 nSize)
{
int32 pos = strlen(pStr);
-
+
// letters
for ( int32 i = 0; i < ('Z' - 'A' + 1); i++ )
{
@@ -2744,15 +3034,15 @@ char *CPad::EditString(char *pStr, int32 nSize)
pStr[pos++] = i + 'A';
pStr[pos] = '\0';
}
-
+
if ( GetPad(0)->GetCharJustDown(i + 'a') && pos < nSize - 1 )
{
pStr[pos++] = i + 'a';
pStr[pos] = '\0';
}
}
-
- // numbers
+
+ // numbers
for ( int32 i = 0; i < ('9' - '0' + 1); i++ )
{
if ( GetPad(0)->GetCharJustDown(i + '0') && pos < nSize - 1 )
@@ -2761,15 +3051,15 @@ char *CPad::EditString(char *pStr, int32 nSize)
pStr[pos] = '\0';
}
}
-
+
// space
if ( GetPad(0)->GetCharJustDown(' ') && pos < nSize - 1 )
{
pStr[pos++] = ' ';
pStr[pos] = '\0';
}
-
-
+
+
// del
if ( GetPad(0)->GetDeleteJustDown() || GetPad(0)->GetBackspaceJustDown() )
{
@@ -2780,7 +3070,7 @@ char *CPad::EditString(char *pStr, int32 nSize)
// extenter/up/down
if ( GetPad(0)->GetReturnJustDown() || GetPad(0)->GetUpJustDown() || GetPad(0)->GetDownJustDown() )
return nil;
-
+
return pStr;
}
@@ -2793,64 +3083,64 @@ int32 *CPad::EditCodesForControls(int32 *pRsKeys, int32 nSize)
if ( GetPad(0)->GetCharJustDown(i) )
*pRsKeys = i;
}
-
+
for ( int32 i = 0; i < 12; i++ )
{
if ( GetPad(0)->GetFJustDown(i) )
*pRsKeys = i + rsF1;
}
-
+
if ( GetPad(0)->GetEscapeJustDown() )
*pRsKeys = rsESC;
-
+
if ( GetPad(0)->GetInsertJustDown() )
*pRsKeys = rsINS;
-
+
if ( GetPad(0)->GetDeleteJustDown() )
*pRsKeys = rsDEL;
-
+
if ( GetPad(0)->GetHomeJustDown() )
*pRsKeys = rsHOME;
-
+
if ( GetPad(0)->GetEndJustDown() )
*pRsKeys = rsEND;
-
+
if ( GetPad(0)->GetPageUpJustDown() )
*pRsKeys = rsPGUP;
-
+
if ( GetPad(0)->GetPageDownJustDown() )
*pRsKeys = rsPGDN;
-
+
if ( GetPad(0)->GetUpJustDown() )
*pRsKeys = rsUP;
-
+
if ( GetPad(0)->GetDownJustDown() )
*pRsKeys = rsDOWN;
-
+
if ( GetPad(0)->GetLeftJustDown() )
*pRsKeys = rsLEFT;
-
+
if ( GetPad(0)->GetRightJustDown() )
*pRsKeys = rsRIGHT;
-
+
if ( GetPad(0)->GetScrollLockJustDown() )
*pRsKeys = rsSCROLL;
-
+
if ( GetPad(0)->GetPauseJustDown() )
*pRsKeys = rsPAUSE;
-
+
if ( GetPad(0)->GetNumLockJustDown() )
*pRsKeys = rsNUMLOCK;
-
+
if ( GetPad(0)->GetDivideJustDown() )
*pRsKeys = rsDIVIDE;
-
+
if ( GetPad(0)->GetTimesJustDown() )
*pRsKeys = rsTIMES;
-
+
if ( GetPad(0)->GetMinusJustDown() )
*pRsKeys = rsMINUS;
-
+
if ( GetPad(0)->GetPlusJustDown() )
*pRsKeys = rsPLUS;
@@ -2862,75 +3152,75 @@ int32 *CPad::EditCodesForControls(int32 *pRsKeys, int32 nSize)
if ( GetPad(0)->GetPad1JustDown() )
*pRsKeys = rsPADEND;
-
+
if ( GetPad(0)->GetPad2JustDown() )
*pRsKeys = rsPADDOWN;
-
+
if ( GetPad(0)->GetPad3JustDown() )
*pRsKeys = rsPADPGDN;
-
+
if ( GetPad(0)->GetPad4JustDown() )
*pRsKeys = rsPADLEFT;
-
+
if ( GetPad(0)->GetPad5JustDown() )
*pRsKeys = rsPAD5;
-
+
if ( GetPad(0)->GetPad6JustDown() )
*pRsKeys = rsPADRIGHT;
-
+
if ( GetPad(0)->GetPad7JustDown() )
*pRsKeys = rsPADHOME;
-
+
if ( GetPad(0)->GetPad8JustDown() )
*pRsKeys = rsPADUP;
-
+
if ( GetPad(0)->GetPad9JustDown() )
*pRsKeys = rsPADPGUP;
-
+
if ( GetPad(0)->GetPad0JustDown() )
*pRsKeys = rsPADINS;
if ( GetPad(0)->GetBackspaceJustDown() )
*pRsKeys = rsBACKSP;
-
+
if ( GetPad(0)->GetTabJustDown() )
*pRsKeys = rsTAB;
-
+
if ( GetPad(0)->GetCapsLockJustDown() )
*pRsKeys = rsCAPSLK;
-
+
if ( GetPad(0)->GetReturnJustDown() )
*pRsKeys = rsENTER;
-
+
if ( GetPad(0)->GetLeftShiftJustDown() )
*pRsKeys = rsLSHIFT;
-
+
if ( GetPad(0)->GetShiftJustDown() )
*pRsKeys = rsSHIFT;
-
+
if ( GetPad(0)->GetRightShiftJustDown() )
*pRsKeys = rsRSHIFT;
-
+
if ( GetPad(0)->GetLeftCtrlJustDown() )
*pRsKeys = rsLCTRL;
-
+
if ( GetPad(0)->GetRightCtrlJustDown() )
*pRsKeys = rsRCTRL;
-
+
if ( GetPad(0)->GetLeftAltJustDown() )
*pRsKeys = rsLALT;
-
+
if ( GetPad(0)->GetRightAltJustDown() )
*pRsKeys = rsRALT;
-
+
if ( GetPad(0)->GetLeftWinJustDown() )
*pRsKeys = rsLWIN;
-
+
if ( GetPad(0)->GetRightWinJustDown() )
*pRsKeys = rsRWIN;
-
+
if ( GetPad(0)->GetAppsJustDown() )
*pRsKeys = rsAPPS;
-
+
return pRsKeys;
}
diff --git a/src/core/Pad.h b/src/core/Pad.h
index 2f50a164..f76d7b5d 100644
--- a/src/core/Pad.h
+++ b/src/core/Pad.h
@@ -2,14 +2,14 @@
enum {
PLAYERCONTROL_ENABLED = 0,
- PLAYERCONTROL_DISABLED_1 = 1, // used by first person camera
- PLAYERCONTROL_DISABLED_2 = 2,
+ PLAYERCONTROL_CAMERA = 1,
+ PLAYERCONTROL_UNK2 = 2,
PLAYERCONTROL_GARAGE = 4,
- PLAYERCONTROL_DISABLED_8 = 8,
- PLAYERCONTROL_DISABLED_10 = 16,
- PLAYERCONTROL_DISABLED_20 = 32, // used on CPlayerInfo::MakePlayerSafe
- PLAYERCONTROL_DISABLED_40 = 64, // used on phone calls
- PLAYERCONTROL_DISABLED_80 = 128,// used on cutscenes
+ PLAYERCONTROL_UNK8 = 8,
+ PLAYERCONTROL_UNK10 = 16,
+ PLAYERCONTROL_PLAYERINFO = 32,
+ PLAYERCONTROL_PHONE = 64,
+ PLAYERCONTROL_CUTSCENE = 128,
PLAYERCONTROL_SHORTCUT_TAXI = 256,
};
@@ -198,13 +198,13 @@ public:
static void UpdatePads(void);
void ProcessPCSpecificStuff(void);
- void Update(int16 unk);
+ void Update(int16 pad);
static void DoCheats(void);
void DoCheats(int16 unk);
static void StopPadsShaking(void);
- void StopShaking(int16 unk);
+ void StopShaking(int16 pad);
static CPad *GetPad(int32 pad);
@@ -455,6 +455,11 @@ public:
void SetDisablePlayerControls(uint16 who) { DisablePlayerControls |= who; }
void SetEnablePlayerControls(uint16 who) { DisablePlayerControls &= ~who; }
bool IsPlayerControlsDisabledBy(uint16 who) { return DisablePlayerControls & who; }
+
+ int16 GetMode() { return Mode; }
+ void SetMode(int16 mode) { Mode = mode; }
+
+ static bool IsNoOrObsolete() { return bDisplayNoControllerMessage || bObsoleteControllerMessage; }
};
VALIDATE_SIZE(CPad, 0xFC);
diff --git a/src/core/PlayerInfo.cpp b/src/core/PlayerInfo.cpp
index cc6b1304..2511ce9a 100644
--- a/src/core/PlayerInfo.cpp
+++ b/src/core/PlayerInfo.cpp
@@ -180,7 +180,7 @@ CPlayerInfo::MakePlayerSafe(bool toggle)
if (toggle) {
m_pPed->m_pWanted->m_bIgnoredByEveryone = true;
CWorld::StopAllLawEnforcersInTheirTracks();
- CPad::GetPad(0)->DisablePlayerControls |= PLAYERCONTROL_DISABLED_20;
+ CPad::GetPad(0)->SetDisablePlayerControls(PLAYERCONTROL_PLAYERINFO);
CPad::StopPadsShaking();
m_pPed->bBulletProof = true;
m_pPed->bFireProof = true;
@@ -201,7 +201,7 @@ CPlayerInfo::MakePlayerSafe(bool toggle)
}
else {
m_pPed->m_pWanted->m_bIgnoredByEveryone = false;
- CPad::GetPad(0)->DisablePlayerControls &= ~PLAYERCONTROL_DISABLED_20;
+ CPad::GetPad(0)->SetEnablePlayerControls(PLAYERCONTROL_PLAYERINFO);
m_pPed->bBulletProof = false;
m_pPed->bFireProof = false;
m_pPed->bCollisionProof = false;
diff --git a/src/core/Timer.h b/src/core/Timer.h
index cbfe5794..53591c4f 100644
--- a/src/core/Timer.h
+++ b/src/core/Timer.h
@@ -62,6 +62,7 @@ public:
friend bool GenericLoad(void);
friend bool GenericSave(int file);
+ friend class CMemoryCard;
#ifdef FIX_BUGS
static float GetDefaultTimeStep(void) { return 50.0f / 30.0f; }
diff --git a/src/core/common.h b/src/core/common.h
index d7c9a1f7..3ead4f1d 100644
--- a/src/core/common.h
+++ b/src/core/common.h
@@ -103,6 +103,8 @@ inline uint32 ldb(uint32 p, uint32 s, uint32 w)
#define DEFAULT_SCREEN_WIDTH (640)
#define DEFAULT_SCREEN_HEIGHT (448)
+#define DEFAULT_SCREEN_HEIGHT_PAL (512)
+#define DEFAULT_SCREEN_HEIGHT_NTSC (448)
#define DEFAULT_ASPECT_RATIO (4.0f/3.0f)
#define DEFAULT_VIEWWINDOW (0.7f)
@@ -153,6 +155,16 @@ public:
CRGBA(void) { }
CRGBA(uint8 r, uint8 g, uint8 b, uint8 a) : r(r), g(g), b(b), a(a) { }
+ bool operator ==(const CRGBA &right)
+ {
+ return this->r == right.r && this->g == right.g && this->b == right.b && this->a == right.a;
+ }
+
+ bool operator !=(const CRGBA &right)
+ {
+ return !(*this == right);
+ }
+
CRGBA &operator =(const CRGBA &right)
{
this->r = right.r;
diff --git a/src/core/config.h b/src/core/config.h
index ba51fb19..9bac9cdb 100644
--- a/src/core/config.h
+++ b/src/core/config.h
@@ -232,14 +232,20 @@ enum Config {
#define REGISTER_START_BUTTON
// Hud, frontend and radar
-#define TRIANGULAR_BLIPS // height indicating triangular radar blips, as in VC
-// #define PS2_LIKE_MENU // An effort to recreate PS2 menu, cycling through tabs, different bg etc.
-#define MENU_MAP // VC-like menu map. Make sure you have new menu.txd
-#define SCROLLABLE_STATS_PAGE // only draggable by mouse atm
-#define TRIANGLE_BACK_BUTTON
-// #define CIRCLE_BACK_BUTTON
#define HUD_ENHANCEMENTS // Adjusts some aspects to make the HUD look/behave a little bit better.
#define BETA_SLIDING_TEXT
+#define TRIANGULAR_BLIPS // height indicating triangular radar blips, as in VC
+#define PC_MENU
+
+#ifndef PC_MENU
+# define PS2_MENU
+//# define PS2_MENU_USEALLPAGEICONS
+#else
+//# define PS2_LIKE_MENU // An effort to recreate PS2 menu, cycling through tabs, different bg etc.
+# define MENU_MAP // VC-like menu map. Make sure you have new menu.txd
+# define SCROLLABLE_STATS_PAGE // only draggable by mouse atm
+# define TRIANGLE_BACK_BUTTON
+//# define CIRCLE_BACK_BUTTON
//#define CUSTOM_FRONTEND_OPTIONS
#define LEGACY_MENU_OPTIONS
#define MUCH_SHORTER_OUTRO_SCREEN
@@ -249,7 +255,14 @@ enum Config {
#define USE_MEASUREMENTS_IN_METERS // makes game use meters instead of feet in script
#define USE_PRECISE_MEASUREMENT_CONVERTION // makes game convert feet to meeters more precisely
//#define MISSION_REPLAY // mobile feature
+#endif
//#define SIMPLIER_MISSIONS // apply simplifications from mobile
+//#define USE_ADVANCED_SCRIPT_DEBUG_OUTPUT
+#define SCRIPT_LOG_FILE_LEVEL 1 // 0 == no log, 1 == overwrite every frame, 2 == full log
+
+#ifndef USE_ADVANCED_SCRIPT_DEBUG_OUTPUT
+#define USE_BASIC_SCRIPT_DEBUG_OUTPUT
+#endif
// Replay
//#define DONT_FIX_REPLAY_BUGS // keeps various bugs in CReplay, some of which are fairly cool!
@@ -271,5 +284,6 @@ enum Config {
#define CANCELLABLE_CAR_ENTER
// Camera
+//#define PS2_CAM_TRANSITION // old way of transitioning between cam modes
#define IMPROVED_CAMERA // Better Debug cam, and maybe more in the future
#define FREE_CAM // Rotating cam
diff --git a/src/core/main.cpp b/src/core/main.cpp
index d6837ba9..6e6092f3 100644
--- a/src/core/main.cpp
+++ b/src/core/main.cpp
@@ -58,6 +58,7 @@
#include "Console.h"
#include "timebars.h"
#include "GenericGameStorage.h"
+#include "MemoryCard.h"
#include "SceneEdit.h"
#include "debugmenu.h"
@@ -185,14 +186,27 @@ DoFade(void)
if(CTimer::GetIsPaused())
return;
+#ifdef PS2_MENU
+ if(TheMemoryCard.JustLoadedDontFadeInYet){
+ TheMemoryCard.JustLoadedDontFadeInYet = false;
+ TheMemoryCard.TimeStartedCountingForFade = CTimer::GetTimeInMilliseconds();
+ }
+#else
if(JustLoadedDontFadeInYet){
JustLoadedDontFadeInYet = false;
TimeStartedCountingForFade = CTimer::GetTimeInMilliseconds();
}
+#endif
+#ifdef PS2_MENU
+ if(TheMemoryCard.StillToFadeOut){
+ if(CTimer::GetTimeInMilliseconds() - TheMemoryCard.TimeStartedCountingForFade > TheMemoryCard.TimeToStayFadedBeforeFadeOut){
+ TheMemoryCard.StillToFadeOut = false;
+#else
if(StillToFadeOut){
if(CTimer::GetTimeInMilliseconds() - TimeStartedCountingForFade > TimeToStayFadedBeforeFadeOut){
StillToFadeOut = false;
+#endif
TheCamera.Fade(3.0f, FADE_IN);
TheCamera.ProcessFade();
TheCamera.ProcessMusicFade();
@@ -925,17 +939,16 @@ Render2dStuff(void)
void
RenderMenus(void)
{
-#ifdef PS2
- if (FrontEndMenuManager.m_bWantToDraw)
+ if (FrontEndMenuManager.m_bMenuActive)
{
+#ifdef PS2
gMainHeap.PushMemId(_TODOCONST(17));
+#endif
FrontEndMenuManager.DrawFrontEnd();
+#ifdef PS2
gMainHeap.PopMemId();
- }
-#else
- if(FrontEndMenuManager.m_bMenuActive)
- FrontEndMenuManager.DrawFrontEnd();
#endif
+ }
}
void
@@ -979,14 +992,25 @@ Idle(void *arg)
#endif
if(CGame::bDemoMode && CTimer::GetTimeInMilliseconds() > (3*60 + 30)*1000 && !CCutsceneMgr::IsCutsceneProcessing()){
+#ifdef PS2_MENU
+ TheMemoryCard.m_bWantToLoad = false;
+ FrontEndMenuManager.m_bWantToRestart = true;
+#else
FrontEndMenuManager.m_bWantToRestart = true;
FrontEndMenuManager.m_bWantToLoad = false;
+#endif
return;
}
+#ifdef PS2_MENU
+ if ( FrontEndMenuManager.m_bWantToRestart || TheMemoryCard.b_FoundRecentSavedGameWantToLoad )
+#else
if(FrontEndMenuManager.m_bWantToRestart || b_FoundRecentSavedGameWantToLoad)
+#endif
+ {
return;
-
+ }
+
SetLightsWithTimeOfDayColour(Scene.world);
if(arg == nil)
@@ -1048,7 +1072,7 @@ Idle(void *arg)
#ifdef TIMEBARS
tbStartTimer(0, "RenderMotionBlur");
#endif
- if((TheCamera.m_BlurType == MBLUR_NONE || TheCamera.m_BlurType == MBLUR_NORMAL) &&
+ if((TheCamera.m_BlurType == MOTION_BLUR_NONE || TheCamera.m_BlurType == MOTION_BLUR_LIGHT_SCENE) &&
TheCamera.m_ScreenReductionPercentage > 0.0f)
TheCamera.SetMotionBlurAlpha(150);
TheCamera.RenderMotionBlur();
@@ -1081,6 +1105,11 @@ Idle(void *arg)
tbEndTimer("RenderMenus");
tbStartTimer(0, "DoFade");
#endif
+
+#ifdef PS2_MENU
+ if ( TheMemoryCard.m_bWantToLoad )
+ return;
+#endif
DoFade();
#ifdef TIMEBARS
tbEndTimer("DoFade");
@@ -1255,6 +1284,7 @@ TheModelViewer(void)
}
#endif
+#ifdef PS2
void TheGame(void)
{
printf("Into TheGame!!!\n");
@@ -1276,12 +1306,12 @@ void TheGame(void)
LoadingScreen("Starting Game", NULL, splash);
#ifdef GTA_PS2
- if ( TheMemoryCard.CheckCardInserted(_TODOCONST(0)) == _TODOCONST(26)
- && TheMemoryCard.ChangeDirectory(_TODOCONST(0), TheMemoryCard.field154)
- && TheMemoryCard.FindMostRecentFileName(_TODOCONST(0), TheMemoryCard.field37) == 1
- && TheMemoryCard.CheckDataNotCorrupt(TheMemoryCard.field37))
+ if ( TheMemoryCard.CheckCardInserted(CARD_ONE) == CMemoryCard::NO_ERR_SUCCESS
+ && TheMemoryCard.ChangeDirectory(CARD_ONE, TheMemoryCard.Cards[CARD_ONE].dir)
+ && TheMemoryCard.FindMostRecentFileName(CARD_ONE, TheMemoryCard.MostRecentFile) == true
+ && TheMemoryCard.CheckDataNotCorrupt(TheMemoryCard.MostRecentFile))
{
- strcpy(TheMemoryCard.LoadFileName, TheMemoryCard.field37);
+ strcpy(TheMemoryCard.LoadFileName, TheMemoryCard.MostRecentFile);
TheMemoryCard.b_FoundRecentSavedGameWantToLoad = true;
if (FrontEndMenuManager.m_PrefsLanguage != TheMemoryCard.GetLanguageToLoad())
@@ -1385,7 +1415,7 @@ void TheGame(void)
RenderDebugShit();
RenderEffects();
- if ((TheCamera.m_BlurType == MBLUR_NONE || TheCamera.m_BlurType == MBLUR_NORMAL) && TheCamera.m_ScreenReductionPercentage > 0.0f)
+ if ((TheCamera.m_BlurType == MOTION_BLUR_NONE || TheCamera.m_BlurType == MOTION_BLUR_LIGHT_SCENE) && TheCamera.m_ScreenReductionPercentage > 0.0f)
TheCamera.SetMotionBlurAlpha(150);
TheCamera.RenderMotionBlur();
@@ -1767,8 +1797,6 @@ void GameInit()
}
}
-// Not used anyway. PS2 main() port
-#ifdef _WIN32
int
main(int argc, char *argv[])
{
@@ -1779,9 +1807,10 @@ main(int argc, char *argv[])
SystemInit();
#ifdef PS2
- int32 state = TheMemoryCard.CheckCardStateAtGameStartUp(_TODOCONST(0));
+ int32 r = TheMemoryCard.CheckCardStateAtGameStartUp(CARD_ONE);
- if ( state == _TODOCONST(2) || state == _TODOCONST(1) && state != _TODOCONST(3) && state != _TODOCONST(0) )
+ if ( r == CMemoryCard::ERR_DIRNOENTRY || r == CMemoryCard::ERR_NOFORMAT
+ && r != CMemoryCard::ERR_OPENNOENTRY && r != CMemoryCard::ERR_NONE )
{
GameInit();
diff --git a/src/core/re3.cpp b/src/core/re3.cpp
index c845533e..6032fc4a 100644
--- a/src/core/re3.cpp
+++ b/src/core/re3.cpp
@@ -85,7 +85,7 @@ void ReloadFrontendOptions(void)
void LangPolSelect(int8 action)
{
if (action == FEOPTION_ACTION_SELECT) {
- FrontEndMenuManager.m_PrefsLanguage = LANGUAGE_POLISH;
+ FrontEndMenuManager.m_PrefsLanguage = CMenuManager::LANGUAGE_POLISH;
FrontEndMenuManager.m_bFrontEnd_ReloadObrTxtGxt = true;
FrontEndMenuManager.InitialiseChangedLanguageSettings();
FrontEndMenuManager.SaveSettings();
@@ -95,7 +95,7 @@ void LangPolSelect(int8 action)
void LangRusSelect(int8 action)
{
if (action == FEOPTION_ACTION_SELECT) {
- FrontEndMenuManager.m_PrefsLanguage = LANGUAGE_RUSSIAN;
+ FrontEndMenuManager.m_PrefsLanguage = CMenuManager::LANGUAGE_RUSSIAN;
FrontEndMenuManager.m_bFrontEnd_ReloadObrTxtGxt = true;
FrontEndMenuManager.InitialiseChangedLanguageSettings();
FrontEndMenuManager.SaveSettings();
@@ -105,7 +105,7 @@ void LangRusSelect(int8 action)
void LangJapSelect(int8 action)
{
if (action == FEOPTION_ACTION_SELECT) {
- FrontEndMenuManager.m_PrefsLanguage = LANGUAGE_JAPANESE;
+ FrontEndMenuManager.m_PrefsLanguage = CMenuManager::LANGUAGE_JAPANESE;
FrontEndMenuManager.m_bFrontEnd_ReloadObrTxtGxt = true;
FrontEndMenuManager.InitialiseChangedLanguageSettings();
FrontEndMenuManager.SaveSettings();