1
0
Fork 0
mirror of https://git.rip/DMCA_FUCKER/re3.git synced 2024-12-23 23:20:01 +00:00

fixes from master, menu helper text

This commit is contained in:
eray orçunus 2020-07-04 23:50:43 +03:00
parent 2c50cf8ac6
commit ceb1defc4e
10 changed files with 142 additions and 165 deletions

View file

@ -400,7 +400,7 @@ void CGarage::Update()
FindPlayerPed()->m_pWanted->Suspend(); FindPlayerPed()->m_pWanted->Suspend();
} }
CPad::GetPad(0)->SetEnablePlayerControls(PLAYERCONTROL_GARAGE); CPad::GetPad(0)->SetEnablePlayerControls(PLAYERCONTROL_GARAGE);
FindPlayerPed()->m_pWanted->m_bIgnoredByCops = true; FindPlayerPed()->m_pWanted->m_bIgnoredByCops = false;
#ifdef FIX_BUGS #ifdef FIX_BUGS
bool bChangedColour = false; bool bChangedColour = false;
#else #else

View file

@ -38,6 +38,9 @@
#include "Messages.h" #include "Messages.h"
#include "FileLoader.h" #include "FileLoader.h"
// TODO(Miami): Remove that!! That was my map implementation for III, instead use MAP_ENHACEMENTS on some places
#define CUSTOM_MAP
// TODO(Miami): This is -3 on VC but still -1 on AudioManager?!? What the hell? // TODO(Miami): This is -3 on VC but still -1 on AudioManager?!? What the hell?
#define INVALID_AUDIO_PROVIDER -1 #define INVALID_AUDIO_PROVIDER -1
@ -52,7 +55,6 @@ CRGBA HEADER_COLOR(255, 150, 255, 255);
CRGBA DARKMENUOPTION_COLOR(195, 90, 165, 255); CRGBA DARKMENUOPTION_COLOR(195, 90, 165, 255);
CRGBA SLIDERON_COLOR(97, 194, 247, 255); CRGBA SLIDERON_COLOR(97, 194, 247, 255);
CRGBA SLIDEROFF_COLOR(27, 89, 130, 255); CRGBA SLIDEROFF_COLOR(27, 89, 130, 255);
CRGBA MAPINFOBOX_COLOR(255, 150, 225, 150);
#define TIDY_UP_PBP // ProcessButtonPresses #define TIDY_UP_PBP // ProcessButtonPresses
#define MAX_VISIBLE_LIST_ROW 30 #define MAX_VISIBLE_LIST_ROW 30
@ -117,9 +119,10 @@ MenuTrapezoid menuBg(CGeneral::GetRandomNumber() % 40 + 65, CGeneral::GetRandomN
MenuTrapezoid menuOptionHighlight(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f); MenuTrapezoid menuOptionHighlight(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f);
// TODO(Miami): TEMPORARY #ifdef CUSTOM_MAP
bool bMapLoaded = false; bool bMapLoaded = false;
bool bMapMouseShownOnce = false; bool bMapMouseShownOnce = false;
#endif
#ifndef MASTER #ifndef MASTER
bool CMenuManager::m_PrefsMarketing = false; bool CMenuManager::m_PrefsMarketing = false;
@ -664,11 +667,25 @@ CMenuManager::CheckSliderMovement(int value)
} }
void void
CMenuManager::DisplayHelperText() CMenuManager::DisplayHelperText(char *text)
{ {
if (m_nMenuFadeAlpha != 255)
return;
// there was a unused static bool // there was a unused static bool
static PauseModeTime LastFlash = 0; static PauseModeTime LastFlash = 0;
int32 alpha; int32 alpha = 255;
CFont::SetRightJustifyOn();
CFont::SetScale(SCREEN_SCALE_X(SMALLESTTEXT_X_SCALE), SCREEN_SCALE_Y(SMALLESTTEXT_Y_SCALE));
CFont::SetFontStyle(FONT_LOCALE(FONT_STANDARD));
CFont::SetDropShadowPosition(0);
if (text) {
CFont::SetColor(CRGBA(255, 255, 255, 255));
CFont::PrintString(SCREEN_STRETCH_FROM_RIGHT(10.f), SCREEN_SCALE_FROM_BOTTOM(18.f), TheText.Get(text));
return;
}
if (m_nHelperTextMsgId != 0 && m_nHelperTextMsgId != 1) { if (m_nHelperTextMsgId != 0 && m_nHelperTextMsgId != 1) {
if (CTimer::GetTimeInMillisecondsPauseMode() - LastFlash > 10) { if (CTimer::GetTimeInMillisecondsPauseMode() - LastFlash > 10) {
@ -682,41 +699,67 @@ CMenuManager::DisplayHelperText()
alpha = m_nHelperTextAlpha > 255 ? 255 : m_nHelperTextAlpha; alpha = m_nHelperTextAlpha > 255 ? 255 : m_nHelperTextAlpha;
} }
CFont::SetCentreOn(); CFont::SetColor(CRGBA(255, 255, 255, alpha));
CFont::SetScale(SCREEN_SCALE_X(SMALLESTTEXT_X_SCALE), SCREEN_SCALE_Y(SMALLESTTEXT_Y_SCALE));
CFont::SetFontStyle(FONT_LOCALE(FONT_HEADING));
// TODO: name this cases? // TODO: name this cases?
switch (m_nHelperTextMsgId) { switch (m_nHelperTextMsgId) {
case 0:
{
int action = aScreens[m_nCurrScreen].m_aEntries[m_nCurrOption].m_Action;
if (action != MENUACTION_CHANGEMENU && action != MENUACTION_KEYBOARDCTRLS && action != MENUACTION_RESTOREDEF) {
CFont::SetColor(CRGBA(255, 255, 255, 255));
CFont::PrintString(MENU_X_LEFT_ALIGNED(320.0f), SCREEN_SCALE_FROM_BOTTOM(120.0f), TheText.Get("FET_MIG"));
}
break;
}
case 1: case 1:
CFont::SetColor(CRGBA(255, 255, 255, 255)); CFont::PrintString(SCREEN_STRETCH_FROM_RIGHT(10.f), SCREEN_SCALE_FROM_BOTTOM(18.f), TheText.Get("FET_APP"));
CFont::PrintString(MENU_X_LEFT_ALIGNED(320.0f), SCREEN_SCALE_FROM_BOTTOM(120.0f), TheText.Get("FET_APP"));
break; break;
case 2: case 2:
CFont::SetColor(CRGBA(255, 255, 255, alpha)); CFont::PrintString(SCREEN_STRETCH_FROM_RIGHT(10.f), SCREEN_SCALE_FROM_BOTTOM(18.f), TheText.Get("FET_HRD"));
CFont::PrintString(MENU_X_LEFT_ALIGNED(320.0f), SCREEN_SCALE_FROM_BOTTOM(120.0f), TheText.Get("FET_HRD"));
break; break;
case 3: case 3:
CFont::SetColor(CRGBA(255, 255, 255, alpha)); CFont::PrintString(SCREEN_STRETCH_FROM_RIGHT(10.f), SCREEN_SCALE_FROM_BOTTOM(18.f), TheText.Get("FET_RSO"));
CFont::PrintString(MENU_X_LEFT_ALIGNED(320.0f), SCREEN_SCALE_FROM_BOTTOM(120.0f), TheText.Get("FET_RSO"));
break; break;
case 4: case 4:
CFont::SetColor(CRGBA(255, 255, 255, alpha)); CFont::PrintString(SCREEN_STRETCH_FROM_RIGHT(10.f), SCREEN_SCALE_FROM_BOTTOM(18.f), TheText.Get("FET_STS"));
CFont::PrintString(MENU_X_LEFT_ALIGNED(320.0f), SCREEN_SCALE_FROM_BOTTOM(120.0f), TheText.Get("FET_RSC")); break;
case 5:
CFont::PrintString(SCREEN_STRETCH_FROM_RIGHT(10.f), SCREEN_SCALE_FROM_BOTTOM(18.f), TheText.Get("FET_RSC"));
break; break;
default: default:
if (aScreens[m_nCurrScreen].m_aEntries[m_nCurrOption].m_Action == MENUACTION_NO)
return;
if (aScreens[m_nCurrScreen].m_aEntries[m_nCurrOption].m_Action == MENUACTION_MUSICVOLUME ||
aScreens[m_nCurrScreen].m_aEntries[m_nCurrOption].m_Action == MENUACTION_SFXVOLUME) {
CFont::PrintString(SCREEN_STRETCH_FROM_RIGHT(10.f), SCREEN_SCALE_FROM_BOTTOM(18.f),
m_nPrefsAudio3DProviderIndex == INVALID_AUDIO_PROVIDER ? TheText.Get("FEH_NA") : TheText.Get("FET_MIG"));
return;
}
if (aScreens[m_nCurrScreen].m_aEntries[m_nCurrOption].m_Action == MENUACTION_KEYBOARDCTRLS)
return;
if (aScreens[m_nCurrScreen].m_aEntries[m_nCurrOption].m_Action == MENUACTION_SCREENRES) {
CFont::PrintString(SCREEN_STRETCH_FROM_RIGHT(10.f), SCREEN_SCALE_FROM_BOTTOM(18.f),
m_bGameNotLoaded ? TheText.Get("FET_MIG") : TheText.Get("FEH_NA"));
return;
}
if (aScreens[m_nCurrScreen].m_aEntries[m_nCurrOption].m_Action == MENUACTION_AUDIOHW ||
aScreens[m_nCurrScreen].m_aEntries[m_nCurrOption].m_Action == MENUACTION_SPEAKERCONF) {
CFont::PrintString(SCREEN_STRETCH_FROM_RIGHT(10.f), SCREEN_SCALE_FROM_BOTTOM(18.f),
m_nPrefsAudio3DProviderIndex == INVALID_AUDIO_PROVIDER ? TheText.Get("FEH_NA") : TheText.Get("FET_MIG"));
return;
}
if (aScreens[m_nCurrScreen].m_aEntries[m_nCurrOption].m_Action == MENUACTION_RESTOREDEF)
return;
if (aScreens[m_nCurrScreen].m_aEntries[m_nCurrOption].m_Action == MENUACTION_MP3VOLUMEBOOST) {
CFont::PrintString(SCREEN_STRETCH_FROM_RIGHT(10.f), SCREEN_SCALE_FROM_BOTTOM(18.f),
m_nPrefsAudio3DProviderIndex == INVALID_AUDIO_PROVIDER ? TheText.Get("FEH_NA") : TheText.Get("FET_MIG"));
return;
}
CFont::PrintString(SCREEN_STRETCH_FROM_RIGHT(10.f), SCREEN_SCALE_FROM_BOTTOM(18.f),
m_nCurrScreen != MENUPAGE_STATS ? TheText.Get("FET_MIG") : TheText.Get("FEH_SSA"));
break; break;
} }
CFont::SetRightJustifyOff();
} }
// --MIAMI: Done // --MIAMI: Done
@ -880,28 +923,6 @@ CMenuManager::DrawStandardMenus(bool drawCurrScreen)
wchar unicodeTemp[64]; wchar unicodeTemp[64];
char asciiTemp[32]; char asciiTemp[32];
#ifdef MENU_MAP
if (m_nCurrScreen == MENUPAGE_MAP) {
// Back button
wchar *backTx = TheText.Get("FEDS_TB");
CFont::SetDropShadowPosition(1);
CFont::SetDropColor(CRGBA(0, 0, 0, 255));
CFont::SetScale(MENU_X(BIGTEXT_X_SCALE), MENU_Y(BIGTEXT_Y_SCALE));
CFont::SetRightJustifyOff();
CFont::SetCentreOn();
CFont::PrintString(MENU_X(60.0f), SCREEN_SCALE_FROM_BOTTOM(120.0f), backTx);
CFont::SetDropShadowPosition(0);
if (!CheckHover(MENU_X(30.0f), MENU_X(30.0f) + CFont::GetStringWidth(backTx), SCREEN_SCALE_FROM_BOTTOM(125.0f), SCREEN_SCALE_FROM_BOTTOM(105.0f))) {
m_nHoverOption = HOVEROPTION_NOT_HOVERING;
m_nCurrOption = m_nPrevOption = 0;
} else {
m_nHoverOption = HOVEROPTION_RANDOM_ITEM;
m_nCurrOption = m_nPrevOption = 1;
}
return;
}
#endif
bool weHaveLabel = aScreens[m_nCurrScreen].m_aEntries[0].m_Action == MENUACTION_LABEL; bool weHaveLabel = aScreens[m_nCurrScreen].m_aEntries[0].m_Action == MENUACTION_LABEL;
uint8 section = 0; // 0: highlight trapezoid 1: texts uint8 section = 0; // 0: highlight trapezoid 1: texts
@ -1356,8 +1377,6 @@ CMenuManager::DrawStandardMenus(bool drawCurrScreen)
section++; section++;
} }
// TODO(Miami)
/*
switch (m_nCurrScreen) { switch (m_nCurrScreen) {
case MENUPAGE_STATS: case MENUPAGE_STATS:
case MENUPAGE_CONTROLLER_PC: case MENUPAGE_CONTROLLER_PC:
@ -1371,7 +1390,6 @@ CMenuManager::DrawStandardMenus(bool drawCurrScreen)
DisplayHelperText("FEA_NAH"); DisplayHelperText("FEA_NAH");
break; break;
} }
*/
if (m_nCurrScreen == MENUPAGE_DELETING_IN_PROGRESS) { if (m_nCurrScreen == MENUPAGE_DELETING_IN_PROGRESS) {
SmallMessageScreen("FEDL_WR"); SmallMessageScreen("FEDL_WR");
@ -4344,8 +4362,7 @@ CMenuManager::ProcessButtonPresses(void)
case MENUACTION_YES: case MENUACTION_YES:
case MENUACTION_NO: case MENUACTION_NO:
{ {
// TODO(Miami): TEMP #ifdef CUSTOM_MAP
#ifdef MENU_MAP
if (aScreens[m_nCurrScreen].m_aEntries[m_nCurrOption].m_TargetMenu == MENUPAGE_MAP) { if (aScreens[m_nCurrScreen].m_aEntries[m_nCurrOption].m_TargetMenu == MENUPAGE_MAP) {
bMapLoaded = false; bMapLoaded = false;
} }
@ -4411,12 +4428,11 @@ CMenuManager::ProcessButtonPresses(void)
if (m_nDisplayVideoMode != m_nPrefsVideoMode) { if (m_nDisplayVideoMode != m_nPrefsVideoMode) {
m_nPrefsVideoMode = m_nDisplayVideoMode; m_nPrefsVideoMode = m_nDisplayVideoMode;
_psSelectScreenVM(m_nPrefsVideoMode); _psSelectScreenVM(m_nPrefsVideoMode);
SetHelperText(0); // TODO(Miami): Remove that
DMAudio.ChangeMusicMode(MUSICMODE_FRONTEND); DMAudio.ChangeMusicMode(MUSICMODE_FRONTEND);
DMAudio.Service(); DMAudio.Service();
CentreMousePointer(); CentreMousePointer();
m_bShowMouse = true; m_bShowMouse = true;
// m_nCurrOption = 5; // Why? // m_nCurrOption = 5; // Why? TODO(Miami)
m_nOptionHighlightTransitionBlend = 0; m_nOptionHighlightTransitionBlend = 0;
SaveSettings(); SaveSettings();
} }
@ -4426,7 +4442,6 @@ CMenuManager::ProcessButtonPresses(void)
if (m_nSelectedScreenMode != m_nPrefsWindowed) { if (m_nSelectedScreenMode != m_nPrefsWindowed) {
m_nPrefsWindowed = m_nSelectedScreenMode; m_nPrefsWindowed = m_nSelectedScreenMode;
_psSelectScreenVM(m_nPrefsVideoMode); // apply same resolution _psSelectScreenVM(m_nPrefsVideoMode); // apply same resolution
SetHelperText(0);
SaveSettings(); SaveSettings();
} }
break; break;
@ -4435,13 +4450,11 @@ CMenuManager::ProcessButtonPresses(void)
{ {
int selectedProvider = m_nPrefsAudio3DProviderIndex; int selectedProvider = m_nPrefsAudio3DProviderIndex;
if (selectedProvider != INVALID_AUDIO_PROVIDER) { if (selectedProvider != INVALID_AUDIO_PROVIDER) {
if (selectedProvider == -1)
selectedProvider = m_nPrefsAudio3DProviderIndex = DMAudio.AutoDetect3DProviders();
m_nPrefsAudio3DProviderIndex = DMAudio.SetCurrent3DProvider(m_nPrefsAudio3DProviderIndex); m_nPrefsAudio3DProviderIndex = DMAudio.SetCurrent3DProvider(m_nPrefsAudio3DProviderIndex);
if (selectedProvider == m_nPrefsAudio3DProviderIndex) { if (selectedProvider != m_nPrefsAudio3DProviderIndex) {
DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_SETTING_CHANGE, 0); SetHelperText(5);
SetHelperText(0);
} else {
DMAudio.PlayFrontEndSound(SOUND_FRONTEND_FAIL, 0);
SetHelperText(4);
} }
SaveSettings(); SaveSettings();
} }
@ -5163,7 +5176,7 @@ CMenuManager::DrawQuitGameScreen(void)
m_AllowNavigation = false; m_AllowNavigation = false;
} }
#ifdef MENU_MAP #ifdef CUSTOM_MAP
#define ZOOM(x, y, in) \ #define ZOOM(x, y, in) \
do { \ do { \
@ -5177,15 +5190,17 @@ CMenuManager::DrawQuitGameScreen(void)
break; \ break; \
\ \
m_fMapSize *= z2; \ m_fMapSize *= z2; \
} while(0) \ } while(0)
#endif
void void
CMenuManager::PrintMap(void) CMenuManager::PrintMap(void)
{ {
CFont::SetJustifyOn();
m_bMenuMapActive = true; m_bMenuMapActive = true;
CRadar::InitFrontEndMap(); CRadar::InitFrontEndMap();
#ifdef CUSTOM_MAP
// Just entered to map // Just entered to map
if (!bMapLoaded) { if (!bMapLoaded) {
m_fMapSize = SCREEN_HEIGHT * 2.0f; m_fMapSize = SCREEN_HEIGHT * 2.0f;
@ -5207,15 +5222,11 @@ CMenuManager::PrintMap(void)
return; return;
} }
} }
#endif
// Because m_fMapSize is half of the map length, and map consists of 3x3 tiles. // Because m_fMapSize is half of the map length, and map consists of 3x3 tiles.
float halfTile = m_fMapSize / 3.0f; float halfTile = m_fMapSize / 3.0f;
// Darken background a bit
CSprite2d::DrawRect(CRect(0, 0,
SCREEN_WIDTH, SCREEN_HEIGHT),
CRGBA(0, 0, 0, FadeIn(128)));
RwRenderStateSet(rwRENDERSTATETEXTUREFILTER, (void*)rwFILTERLINEAR); RwRenderStateSet(rwRENDERSTATETEXTUREFILTER, (void*)rwFILTERLINEAR);
if (SCREEN_WIDTH >= m_fMapCenterX - m_fMapSize || SCREEN_HEIGHT >= m_fMapCenterY - m_fMapSize) { if (SCREEN_WIDTH >= m_fMapCenterX - m_fMapSize || SCREEN_HEIGHT >= m_fMapCenterY - m_fMapSize) {
@ -5265,6 +5276,7 @@ CMenuManager::PrintMap(void)
CRadar::DrawBlips(); CRadar::DrawBlips();
#ifdef CUSTOM_MAP
CVector2D mapPoint; CVector2D mapPoint;
mapPoint.x = m_nMousePosX; mapPoint.x = m_nMousePosX;
mapPoint.y = m_nMousePosY; mapPoint.y = m_nMousePosY;
@ -5338,56 +5350,15 @@ CMenuManager::PrintMap(void)
if (m_fMapCenterY - m_fMapSize > SCREEN_HEIGHT / 2) if (m_fMapCenterY - m_fMapSize > SCREEN_HEIGHT / 2)
m_fMapCenterY = SCREEN_HEIGHT / 2 + m_fMapSize; m_fMapCenterY = SCREEN_HEIGHT / 2 + m_fMapSize;
#endif
m_bMenuMapActive = false; m_bMenuMapActive = false;
// CFont::SetWrapx(MENU_X_RIGHT_ALIGNED(5.0f)); // From VC CFont::SetWrapx(MENU_X_RIGHT_ALIGNED(5.0f));
// CFont::SetRightJustifyWrap(10.0f); CFont::SetRightJustifyWrap(SCREEN_SCALE_X(10.0f));
DisplayHelperText("FEH_MPH");
CSprite2d::DrawRect(CRect(MENU_X(14.0f), SCREEN_STRETCH_FROM_BOTTOM(95.0f),
SCREEN_STRETCH_FROM_RIGHT(11.0f), SCREEN_STRETCH_FROM_BOTTOM(59.0f)),
CRGBA(MAPINFOBOX_COLOR.r, MAPINFOBOX_COLOR.g, MAPINFOBOX_COLOR.b, MAPINFOBOX_COLOR.a));
CFont::SetScale(MENU_X(0.4f), MENU_Y(0.7f));
CFont::SetFontStyle(FONT_LOCALE(FONT_STANDARD));
CFont::SetColor(CRGBA(0, 0, 0, FadeIn(255)));
float nextX = MENU_X(30.0f), nextY = 95.0f;
wchar *text;
#ifdef MORE_LANGUAGES
#define TEXT_PIECE(key,extraSpace) \
text = TheText.Get(key);\
CFont::PrintString(nextX, SCREEN_SCALE_FROM_BOTTOM(nextY), text);\
if (CFont::IsJapanese())\
nextX += CFont::GetStringWidth_Jap(text) + MENU_X(extraSpace);\
else\
nextX += CFont::GetStringWidth(text, true) + MENU_X(extraSpace);
#else
#define TEXT_PIECE(key,extraSpace) \
text = TheText.Get(key); CFont::PrintString(nextX, SCREEN_SCALE_FROM_BOTTOM(nextY), text); nextX += CFont::GetStringWidth(text, true) + MENU_X(extraSpace);
#endif
TEXT_PIECE("FEC_MWF", 3.0f);
TEXT_PIECE("FEC_PGU", 1.0f);
TEXT_PIECE("FEC_IBT", 1.0f);
TEXT_PIECE("FEC_ZIN", 20.0f);
TEXT_PIECE("FEC_MWB", 3.0f);
TEXT_PIECE("FEC_PGD", 1.0f);
TEXT_PIECE("FEC_IBT", 1.0f);
CFont::PrintString(nextX, SCREEN_SCALE_FROM_BOTTOM(nextY), TheText.Get("FEC_ZOT")); nextX = MENU_X(30.0f); nextY -= 11.0f;
TEXT_PIECE("FEC_UPA", 2.0f);
TEXT_PIECE("FEC_DWA", 2.0f);
TEXT_PIECE("FEC_LFA", 2.0f);
TEXT_PIECE("FEC_RFA", 2.0f);
TEXT_PIECE("FEC_MSL", 1.0f);
TEXT_PIECE("FEC_IBT", 1.0f);
CFont::PrintString(nextX, SCREEN_SCALE_FROM_BOTTOM(nextY), TheText.Get("FEC_MOV")); nextX = MENU_X(30.0f); nextY -= 11.0f;
TEXT_PIECE("FEC_MSR", 2.0f);
TEXT_PIECE("FEC_IBT", 1.0f);
CFont::PrintString(nextX, SCREEN_SCALE_FROM_BOTTOM(nextY), TheText.Get("FEC_TAR"));
#undef TEXT_PIECE
} }
#ifdef CUSTOM_MAP
#undef ZOOM #undef ZOOM
#endif #endif

View file

@ -613,7 +613,7 @@ public:
void CheckCodesForControls(int); void CheckCodesForControls(int);
bool CheckHover(int x1, int x2, int y1, int y2); bool CheckHover(int x1, int x2, int y1, int y2);
void CheckSliderMovement(int); void CheckSliderMovement(int);
void DisplayHelperText(); void DisplayHelperText(char*);
int DisplaySlider(float, float, float, float, float, float, float); int DisplaySlider(float, float, float, float, float, float, float);
void DoSettingsBeforeStartingAGame(); void DoSettingsBeforeStartingAGame();
void DrawStandardMenus(bool); void DrawStandardMenus(bool);

View file

@ -79,11 +79,9 @@ CMenuScreen aScreens[] = {
MENUACTION_GOBACK, "FEDS_TB", SAVESLOT_NONE, MENUPAGE_NONE, 0, 0, MENUALIGN_CENTER, MENUACTION_GOBACK, "FEDS_TB", SAVESLOT_NONE, MENUPAGE_NONE, 0, 0, MENUALIGN_CENTER,
}, },
// TODO(Miami): This is still my implementation
// MENUPAGE_MAP = 6 // MENUPAGE_MAP = 6
{ "FEH_MAP", MENUPAGE_NONE, 2, { "FEH_MAP", MENUPAGE_NONE, 2,
MENUACTION_UNK110, "", SAVESLOT_NONE, 0, 0, 0, 0, // to prevent cross/enter to go back MENUACTION_GOBACK, "FEDS_TB", SAVESLOT_NONE, MENUPAGE_NONE, 70, 380, MENUALIGN_CENTER,
MENUACTION_GOBACK, "FEDS_TB", SAVESLOT_NONE, MENUPAGE_NONE, 0, 0, 0,
}, },
// MENUPAGE_NEW_GAME_RELOAD = 7 // MENUPAGE_NEW_GAME_RELOAD = 7

View file

@ -121,11 +121,11 @@ static_assert(RADAR_TILE_SIZE == (RADAR_SIZE_Y / RADAR_NUM_TILES), "CRadar: not
#define RADAR_MIN_SPEED (0.3f) #define RADAR_MIN_SPEED (0.3f)
#define RADAR_MAX_SPEED (0.9f) #define RADAR_MAX_SPEED (0.9f)
#ifdef MENU_MAP
CRGBA CRadar::ArrowBlipColour1; CRGBA CRadar::ArrowBlipColour1;
CRGBA CRadar::ArrowBlipColour2; CRGBA CRadar::ArrowBlipColour2;
uint16 CRadar::MapLegendCounter; uint16 CRadar::MapLegendCounter;
int16 CRadar::MapLegendList[NUM_MAP_LEGENDS]; int16 CRadar::MapLegendList[NUM_MAP_LEGENDS];
#ifdef MAP_ENHANCEMENTS
int CRadar::TargetMarkerId = -1; int CRadar::TargetMarkerId = -1;
CVector CRadar::TargetMarkerPos; CVector CRadar::TargetMarkerPos;
#endif #endif
@ -263,10 +263,9 @@ int LineRadarBoxCollision(CVector2D &out, const CVector2D &p1, const CVector2D &
uint8 CRadar::CalculateBlipAlpha(float dist) uint8 CRadar::CalculateBlipAlpha(float dist)
{ {
#ifdef MENU_MAP
if (FrontEndMenuManager.m_bMenuMapActive) if (FrontEndMenuManager.m_bMenuMapActive)
return 255; return 255;
#endif
if (dist <= 1.0f) if (dist <= 1.0f)
return 255; return 255;
@ -486,9 +485,7 @@ void CRadar::DrawBlips()
CVector2D in = CVector2D(0.0f, 0.0f); CVector2D in = CVector2D(0.0f, 0.0f);
TransformRadarPointToScreenSpace(out, in); TransformRadarPointToScreenSpace(out, in);
#ifdef MENU_MAP
if (!FrontEndMenuManager.m_bMenuMapActive) { if (!FrontEndMenuManager.m_bMenuMapActive) {
#endif
float angle; float angle;
if (TheCamera.Cams[TheCamera.ActiveCam].Mode == CCam::MODE_TOPDOWN) if (TheCamera.Cams[TheCamera.ActiveCam].Mode == CCam::MODE_TOPDOWN)
angle = PI + FindPlayerHeading(); angle = PI + FindPlayerHeading();
@ -508,9 +505,7 @@ void CRadar::DrawBlips()
LimitRadarPoint(in); LimitRadarPoint(in);
TransformRadarPointToScreenSpace(out, in); TransformRadarPointToScreenSpace(out, in);
DrawRadarSprite(RADAR_SPRITE_NORTH, out.x, out.y, 255); DrawRadarSprite(RADAR_SPRITE_NORTH, out.x, out.y, 255);
#ifdef MENU_MAP
} }
#endif
CEntity *blipEntity = nil; CEntity *blipEntity = nil;
for(int blipId = 0; blipId < NUMRADARBLIPS; blipId++) { for(int blipId = 0; blipId < NUMRADARBLIPS; blipId++) {
@ -743,14 +738,12 @@ void CRadar::DrawBlips()
break; break;
} }
} }
#ifdef MENU_MAP
if (FrontEndMenuManager.m_bMenuMapActive) { if (FrontEndMenuManager.m_bMenuMapActive) {
CVector2D in, out; CVector2D in, out;
TransformRealWorldPointToRadarSpace(in, FindPlayerCentreOfWorld_NoSniperShift()); TransformRealWorldPointToRadarSpace(in, FindPlayerCentreOfWorld_NoSniperShift());
TransformRadarPointToScreenSpace(out, in); TransformRadarPointToScreenSpace(out, in);
DrawYouAreHereSprite(out.x, out.y); DrawYouAreHereSprite(out.x, out.y);
} }
#endif
} }
} }
@ -898,7 +891,7 @@ void CRadar::DrawRadarSection(int32 x, int32 y)
void CRadar::DrawRadarSprite(uint16 sprite, float x, float y, uint8 alpha) void CRadar::DrawRadarSprite(uint16 sprite, float x, float y, uint8 alpha)
{ {
RadarSprites[sprite]->Draw(CRect(x - SCREEN_SCALE_X(8.0f), y - SCREEN_SCALE_Y(8.0f), x + SCREEN_SCALE_X(8.0f), y + SCREEN_SCALE_Y(8.0f)), CRGBA(255, 255, 255, alpha)); RadarSprites[sprite]->Draw(CRect(x - SCREEN_SCALE_X(8.0f), y - SCREEN_SCALE_Y(8.0f), x + SCREEN_SCALE_X(8.0f), y + SCREEN_SCALE_Y(8.0f)), CRGBA(255, 255, 255, alpha));
#ifdef MENU_MAP
if (FrontEndMenuManager.m_bMenuMapActive) { if (FrontEndMenuManager.m_bMenuMapActive) {
bool alreadyThere = false; bool alreadyThere = false;
for (int i = 0; i < NUM_MAP_LEGENDS; i++) { for (int i = 0; i < NUM_MAP_LEGENDS; i++) {
@ -910,7 +903,6 @@ void CRadar::DrawRadarSprite(uint16 sprite, float x, float y, uint8 alpha)
MapLegendCounter++; MapLegendCounter++;
} }
} }
#endif
} }
void CRadar::DrawRotatingRadarSprite(CSprite2d* sprite, float x, float y, float angle, int32 alpha) void CRadar::DrawRotatingRadarSprite(CSprite2d* sprite, float x, float y, float angle, int32 alpha)
@ -1046,10 +1038,10 @@ float CRadar::LimitRadarPoint(CVector2D &point)
float dist, invdist; float dist, invdist;
dist = point.Magnitude(); dist = point.Magnitude();
#ifdef MENU_MAP
if (FrontEndMenuManager.m_bMenuMapActive) if (FrontEndMenuManager.m_bMenuMapActive)
return dist; return dist;
#endif
if (dist > 1.0f) { if (dist > 1.0f) {
invdist = 1.0f / dist; invdist = 1.0f / dist;
point.x *= invdist; point.x *= invdist;
@ -1130,7 +1122,7 @@ void CRadar::SaveAllRadarBlips(uint8 *buf, uint32 *size)
INITSAVEBUF INITSAVEBUF
WriteSaveHeader(buf, 'R', 'D', 'R', '\0', *size - SAVE_HEADER_SIZE); WriteSaveHeader(buf, 'R', 'D', 'R', '\0', *size - SAVE_HEADER_SIZE);
#ifdef MENU_MAP #ifdef MAP_ENHANCEMENTS
if (TargetMarkerId != -1) { if (TargetMarkerId != -1) {
ClearBlip(TargetMarkerId); ClearBlip(TargetMarkerId);
TargetMarkerId = -1; TargetMarkerId = -1;
@ -1276,7 +1268,8 @@ void CRadar::ShowRadarTraceWithHeight(float x, float y, uint32 size, uint8 red,
CSprite2d::DrawRect(CRect(x - SCREEN_SCALE_X(size), y - SCREEN_SCALE_Y(size), SCREEN_SCALE_X(size) + x, SCREEN_SCALE_Y(size) + y), CRGBA(red, green, blue, alpha)); CSprite2d::DrawRect(CRect(x - SCREEN_SCALE_X(size), y - SCREEN_SCALE_Y(size), SCREEN_SCALE_X(size) + x, SCREEN_SCALE_Y(size) + y), CRGBA(red, green, blue, alpha));
break; break;
} }
#ifdef MENU_MAP
// TODO(Miami): Map
// VC uses -1 for coords and -2 for entities but meh, I don't want to edit DrawBlips // VC uses -1 for coords and -2 for entities but meh, I don't want to edit DrawBlips
if (FrontEndMenuManager.m_bMenuMapActive) { if (FrontEndMenuManager.m_bMenuMapActive) {
bool alreadyThere = false; bool alreadyThere = false;
@ -1290,7 +1283,6 @@ void CRadar::ShowRadarTraceWithHeight(float x, float y, uint32 size, uint8 red,
ArrowBlipColour1 = CRGBA(red, green, blue, alpha); ArrowBlipColour1 = CRGBA(red, green, blue, alpha);
} }
} }
#endif
} }
void CRadar::Shutdown() void CRadar::Shutdown()
@ -1402,13 +1394,10 @@ void CRadar::TransformRadarPointToRealWorldSpace(CVector2D &out, const CVector2D
// Radar space goes from -1.0 to 1.0 in x and y, top right is (1.0, 1.0) // Radar space goes from -1.0 to 1.0 in x and y, top right is (1.0, 1.0)
void CRadar::TransformRadarPointToScreenSpace(CVector2D &out, const CVector2D &in) void CRadar::TransformRadarPointToScreenSpace(CVector2D &out, const CVector2D &in)
{ {
#ifdef MENU_MAP
if (FrontEndMenuManager.m_bMenuMapActive) { if (FrontEndMenuManager.m_bMenuMapActive) {
out.x = (FrontEndMenuManager.m_fMapCenterX - FrontEndMenuManager.m_fMapSize) + (MENU_MAP_LENGTH / 2 + MENU_MAP_LEFT_OFFSET + in.x) * FrontEndMenuManager.m_fMapSize * MENU_MAP_WIDTH_SCALE * 2.0f / MENU_MAP_LENGTH; out.x = (FrontEndMenuManager.m_fMapCenterX - FrontEndMenuManager.m_fMapSize) + (MENU_MAP_LENGTH / 2 + MENU_MAP_LEFT_OFFSET + in.x) * FrontEndMenuManager.m_fMapSize * MENU_MAP_WIDTH_SCALE * 2.0f / MENU_MAP_LENGTH;
out.y = (FrontEndMenuManager.m_fMapCenterY - FrontEndMenuManager.m_fMapSize) + (MENU_MAP_LENGTH / 2 - MENU_MAP_TOP_OFFSET - in.y) * FrontEndMenuManager.m_fMapSize * MENU_MAP_HEIGHT_SCALE * 2.0f / MENU_MAP_LENGTH; out.y = (FrontEndMenuManager.m_fMapCenterY - FrontEndMenuManager.m_fMapSize) + (MENU_MAP_LENGTH / 2 - MENU_MAP_TOP_OFFSET - in.y) * FrontEndMenuManager.m_fMapSize * MENU_MAP_HEIGHT_SCALE * 2.0f / MENU_MAP_LENGTH;
} else } else {
#endif
{
#ifdef FIX_BUGS #ifdef FIX_BUGS
out.x = (in.x + 1.0f) * 0.5f * SCREEN_SCALE_X(RADAR_WIDTH) + SCREEN_SCALE_X(RADAR_LEFT); out.x = (in.x + 1.0f) * 0.5f * SCREEN_SCALE_X(RADAR_WIDTH) + SCREEN_SCALE_X(RADAR_LEFT);
#else #else
@ -1462,10 +1451,7 @@ void
CRadar::CalculateCachedSinCos() CRadar::CalculateCachedSinCos()
{ {
if (TheCamera.Cams[TheCamera.ActiveCam].Mode == CCam::MODE_TOPDOWN || TheCamera.Cams[TheCamera.ActiveCam].Mode == CCam::MODE_TOP_DOWN_PED if (TheCamera.Cams[TheCamera.ActiveCam].Mode == CCam::MODE_TOPDOWN || TheCamera.Cams[TheCamera.ActiveCam].Mode == CCam::MODE_TOP_DOWN_PED
#ifdef MENU_MAP || FrontEndMenuManager.m_bMenuMapActive ) {
|| FrontEndMenuManager.m_bMenuMapActive
#endif
) {
cachedSin = 0.0f; cachedSin = 0.0f;
cachedCos = 1.0f; cachedCos = 1.0f;
} else if (TheCamera.GetLookDirection() == LOOKING_FORWARD) { } else if (TheCamera.GetLookDirection() == LOOKING_FORWARD) {
@ -1486,7 +1472,6 @@ CRadar::CalculateCachedSinCos()
} }
} }
#ifdef MENU_MAP
void void
CRadar::InitFrontEndMap() CRadar::InitFrontEndMap()
{ {
@ -1530,6 +1515,7 @@ CRadar::DrawYouAreHereSprite(float x, float y)
MapLegendList[MapLegendCounter++] = RADAR_SPRITE_CENTRE; MapLegendList[MapLegendCounter++] = RADAR_SPRITE_CENTRE;
} }
#ifdef MAP_ENHANCEMENTS
void void
CRadar::ToggleTargetMarker(float x, float y) CRadar::ToggleTargetMarker(float x, float y)
{ {

View file

@ -21,6 +21,8 @@
#define COORDBLIP_MARKER_COLOR_B 242 #define COORDBLIP_MARKER_COLOR_B 242
#define COORDBLIP_MARKER_COLOR_A 255 #define COORDBLIP_MARKER_COLOR_A 255
#define NUM_MAP_LEGENDS 75
#define MENU_MAP_LENGTH_UNIT 1190.0f // in game unit #define MENU_MAP_LENGTH_UNIT 1190.0f // in game unit
#define MENU_MAP_WIDTH_SCALE 1.112f // in game unit (originally 1.112494151260504f) #define MENU_MAP_WIDTH_SCALE 1.112f // in game unit (originally 1.112494151260504f)
#define MENU_MAP_HEIGHT_SCALE 1.119f // in game unit (originally 1.118714268907563f) #define MENU_MAP_HEIGHT_SCALE 1.119f // in game unit (originally 1.118714268907563f)
@ -48,10 +50,8 @@ enum eBlipDisplay
enum eRadarSprite enum eRadarSprite
{ {
#ifdef MENU_MAP
RADAR_SPRITE_ENTITY_BLIP = -2, RADAR_SPRITE_ENTITY_BLIP = -2,
RADAR_SPRITE_COORD_BLIP = -1, RADAR_SPRITE_COORD_BLIP = -1,
#endif
RADAR_SPRITE_NONE = 0, RADAR_SPRITE_NONE = 0,
RADAR_SPRITE_CENTRE, RADAR_SPRITE_CENTRE,
RADAR_SPRITE_MAP_HERE, RADAR_SPRITE_MAP_HERE,
@ -173,17 +173,19 @@ public:
static CSprite2d *RadarSprites[RADAR_SPRITE_COUNT]; static CSprite2d *RadarSprites[RADAR_SPRITE_COUNT];
static float cachedCos; static float cachedCos;
static float cachedSin; static float cachedSin;
#ifdef MENU_MAP
#define NUM_MAP_LEGENDS 75
static CRGBA ArrowBlipColour1; static CRGBA ArrowBlipColour1;
static CRGBA ArrowBlipColour2; static CRGBA ArrowBlipColour2;
static int16 MapLegendList[NUM_MAP_LEGENDS]; static int16 MapLegendList[NUM_MAP_LEGENDS];
static uint16 MapLegendCounter; static uint16 MapLegendCounter;
#ifdef MAP_ENHANCEMENTS
static int TargetMarkerId; static int TargetMarkerId;
static CVector TargetMarkerPos; static CVector TargetMarkerPos;
#endif
static void InitFrontEndMap(); static void InitFrontEndMap();
static void DrawYouAreHereSprite(float, float); static void DrawYouAreHereSprite(float, float);
#ifdef MAP_ENHANCEMENTS
static void ToggleTargetMarker(float, float); static void ToggleTargetMarker(float, float);
#endif #endif
static uint8 CalculateBlipAlpha(float dist); static uint8 CalculateBlipAlpha(float dist);

View file

@ -182,7 +182,7 @@ CWanted::RegisterCrime(eCrimeType type, const CVector &coors, uint32 id, bool po
void void
CWanted::RegisterCrime_Immediately(eCrimeType type, const CVector &coors, uint32 id, bool policeDoesntCare) CWanted::RegisterCrime_Immediately(eCrimeType type, const CVector &coors, uint32 id, bool policeDoesntCare)
{ {
#ifdef FIX_BUGS #ifdef FIX_SIGNIFICANT_BUGS
if(!AddCrimeToQ(type, id, coors, true, policeDoesntCare)) if(!AddCrimeToQ(type, id, coors, true, policeDoesntCare))
#else #else
if(!AddCrimeToQ(type, id, coors, false, policeDoesntCare)) if(!AddCrimeToQ(type, id, coors, false, policeDoesntCare))

View file

@ -242,7 +242,7 @@ enum Config {
//# define PS2_MENU_USEALLPAGEICONS //# define PS2_MENU_USEALLPAGEICONS
#else #else
//# define PS2_LIKE_MENU // An effort to recreate PS2 menu, cycling through tabs, different bg etc. //# 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 MAP_ENHANCEMENTS // Adding waypoint etc.
# define SCROLLABLE_STATS_PAGE // only draggable by mouse atm # define SCROLLABLE_STATS_PAGE // only draggable by mouse atm
# define TRIANGLE_BACK_BUTTON # define TRIANGLE_BACK_BUTTON
//# define CIRCLE_BACK_BUTTON //# define CIRCLE_BACK_BUTTON

View file

@ -77,7 +77,6 @@ mysrand(unsigned int seed)
void ReloadFrontendOptions(void) void ReloadFrontendOptions(void)
{ {
RemoveCustomFrontendOptions();
CustomFrontendOptionsPopulate(); CustomFrontendOptionsPopulate();
} }
@ -139,6 +138,8 @@ void ToggleFreeCam(int8 action)
void void
CustomFrontendOptionsPopulate(void) CustomFrontendOptionsPopulate(void)
{ {
RemoveCustomFrontendOptions(); // if exist
#ifdef MORE_LANGUAGES #ifdef MORE_LANGUAGES
FrontendOptionSetPosition(MENUPAGE_LANGUAGE_SETTINGS); FrontendOptionSetPosition(MENUPAGE_LANGUAGE_SETTINGS);
FrontendOptionAddDynamic(TheText.Get("FEL_POL"), nil, LangPolSelect, nil); FrontendOptionAddDynamic(TheText.Get("FEL_POL"), nil, LangPolSelect, nil);
@ -152,11 +153,6 @@ CustomFrontendOptionsPopulate(void)
FrontendOptionAddSelect(TheText.Get("SCRFOR"), screenModes, 2, (int8*)&FrontEndMenuManager.m_nPrefsWindowed, true, ScreenModeChange, nil); FrontendOptionAddSelect(TheText.Get("SCRFOR"), screenModes, 2, (int8*)&FrontEndMenuManager.m_nPrefsWindowed, true, ScreenModeChange, nil);
#endif #endif
#ifdef MENU_MAP
FrontendOptionSetPosition(MENUPAGE_PAUSE_MENU, 2);
FrontendOptionAddRedirect(TheText.Get("FEG_MAP"), MENUPAGE_MAP);
#endif
#ifdef FREE_CAM #ifdef FREE_CAM
static const wchar *text = (wchar*)L"TOGGLE FREE CAM"; static const wchar *text = (wchar*)L"TOGGLE FREE CAM";
FrontendOptionSetPosition(MENUPAGE_CONTROLLER_PC, 1); FrontendOptionSetPosition(MENUPAGE_CONTROLLER_PC, 1);
@ -252,7 +248,7 @@ FixCar(void)
} }
} }
#ifdef MENU_MAP #ifdef MAP_ENHANCEMENTS
static void static void
TeleportToWaypoint(void) TeleportToWaypoint(void)
{ {
@ -499,7 +495,7 @@ DebugMenuPopulate(void)
DebugMenuAddVarBool8("Debug", "pad 1 -> pad 2", &CPad::m_bMapPadOneToPadTwo, nil); DebugMenuAddVarBool8("Debug", "pad 1 -> pad 2", &CPad::m_bMapPadOneToPadTwo, nil);
DebugMenuAddVarBool8("Debug", "Edit on", &CSceneEdit::m_bEditOn, nil); DebugMenuAddVarBool8("Debug", "Edit on", &CSceneEdit::m_bEditOn, nil);
#ifdef MENU_MAP #ifdef MAP_ENHANCEMENTS
DebugMenuAddCmd("Debug", "Teleport to map waypoint", TeleportToWaypoint); DebugMenuAddCmd("Debug", "Teleport to map waypoint", TeleportToWaypoint);
#endif #endif
DebugMenuAddCmd("Debug", "Switch car collision", SwitchCarCollision); DebugMenuAddCmd("Debug", "Switch car collision", SwitchCarCollision);

View file

@ -11356,18 +11356,33 @@ CPed::ProcessControl(void)
int vehAnim = m_pVehicleAnim->animId; int vehAnim = m_pVehicleAnim->animId;
static bool cancelJack = false;
int16 padWalkX = pad->GetPedWalkLeftRight(); int16 padWalkX = pad->GetPedWalkLeftRight();
int16 padWalkY = pad->GetPedWalkUpDown(); int16 padWalkY = pad->GetPedWalkUpDown();
if (Abs(padWalkX) > 0.0f || Abs(padWalkY) > 0.0f) { if (Abs(padWalkX) > 0.0f || Abs(padWalkY) > 0.0f) {
if (vehAnim == ANIM_CAR_OPEN_LHS || vehAnim == ANIM_CAR_OPEN_RHS || vehAnim == ANIM_COACH_OPEN_L || vehAnim == ANIM_COACH_OPEN_R || if (vehAnim == ANIM_CAR_OPEN_LHS || vehAnim == ANIM_CAR_OPEN_RHS || vehAnim == ANIM_COACH_OPEN_L || vehAnim == ANIM_COACH_OPEN_R ||
vehAnim == ANIM_VAN_OPEN_L || vehAnim == ANIM_VAN_OPEN) { vehAnim == ANIM_VAN_OPEN_L || vehAnim == ANIM_VAN_OPEN) {
if (!m_pMyVehicle->pDriver) {
cancelJack = false;
bCancelEnteringCar = true; bCancelEnteringCar = true;
} else if (vehAnim == ANIM_CAR_QJACK) { } else
if (m_pVehicleAnim->GetTimeLeft() > 0.69f && m_pVehicleAnim->GetTimeLeft() < 0.72f) { cancelJack = true;
} else if (vehAnim == ANIM_CAR_QJACK && m_pVehicleAnim->GetTimeLeft() > 0.75f) {
cancelJack = true;
} else if (vehAnim == ANIM_CAR_PULLOUT_LHS || vehAnim == ANIM_CAR_PULLOUT_LOW_LHS || vehAnim == ANIM_CAR_PULLOUT_LOW_RHS || vehAnim == ANIM_CAR_PULLOUT_RHS) {
bCancelEnteringCar = true;
cancelJack = false;
}
}
if (cancelJack && vehAnim == ANIM_CAR_QJACK && m_pVehicleAnim->GetTimeLeft() > 0.75f && m_pVehicleAnim->GetTimeLeft() < 0.78f) {
cancelJack = false;
QuitEnteringCar(); QuitEnteringCar();
RestorePreviousObjective(); RestorePreviousObjective();
} }
} if (cancelJack && (vehAnim == ANIM_CAR_PULLOUT_LHS || vehAnim == ANIM_CAR_PULLOUT_LOW_LHS || vehAnim == ANIM_CAR_PULLOUT_LOW_RHS || vehAnim == ANIM_CAR_PULLOUT_RHS)) {
cancelJack = false;
bCancelEnteringCar = true;
} }
#endif #endif
break; break;
@ -12163,6 +12178,15 @@ CPed::PedAnimPullPedOutCB(CAnimBlendAssociation* animAssoc, void* arg)
if (!ped->IsNotInWreckedVehicle()) if (!ped->IsNotInWreckedVehicle())
return; return;
#ifdef CANCELLABLE_CAR_ENTER
if (ped->bCancelEnteringCar) {
ped->QuitEnteringCar();
ped->RestorePreviousObjective();
ped->bCancelEnteringCar = false;
return;
}
#endif
bool isLow = !!veh->bLowVehicle; bool isLow = !!veh->bLowVehicle;
int padNo; int padNo;