Merge pull request #20 from gennariarmando/master

Update HUD stuff, bug and format fixes.
This commit is contained in:
aap 2019-06-17 07:29:52 +02:00 committed by GitHub
commit fcc6a8bc55
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
17 changed files with 291 additions and 190 deletions

View File

@ -177,3 +177,10 @@ but here are some observations:
* do *not* use `dw` for `DWORD` or so, we're not programming win32 * do *not* use `dw` for `DWORD` or so, we're not programming win32
* Generally, try to make the code look as if R* could have written it * Generally, try to make the code look as if R* could have written it
# Environment Variables
Here you can find a list of variables that you might need to set in windows:
```
"GTA_III_RE_DIR" * path to "gta3_re" game folder usually where this plugin run.
"GTA_III_DIR)" * path to "GTAIII" game folder.
```

View File

@ -42,9 +42,9 @@ project "re3"
defines { "DEBUG" } defines { "DEBUG" }
staticruntime "on" staticruntime "on"
symbols "On" symbols "On"
debugdir "C:/Users/aap/games/gta3_re" debugdir "$(GTA_III_RE_DIR)"
debugcommand "C:/Users/aap/games/gta3_re/gta3.exe" debugcommand "$(GTA_III_RE_DIR)/gta3.exe"
postbuildcommands "copy /y \"$(TargetPath)\" \"C:\\Users\\aap\\games\\gta3_re\\plugins\\re3.dll\"" postbuildcommands "copy /y \"$(TargetPath)\" \"$(GTA_III_RE_DIR)\\plugins\\re3.dll\""
filter "configurations:Release" filter "configurations:Release"
defines { "NDEBUG" } defines { "NDEBUG" }
@ -52,16 +52,16 @@ project "re3"
staticruntime "on" staticruntime "on"
debugdir "C:/Users/aap/games/gta3_re" debugdir "C:/Users/aap/games/gta3_re"
debugcommand "C:/Users/aap/games/gta3_re/gta3.exe" debugcommand "C:/Users/aap/games/gta3_re/gta3.exe"
postbuildcommands "copy /y \"$(TargetPath)\" \"C:\\Users\\aap\\games\\gta3_re\\plugins\\re3.dll\"" postbuildcommands "copy /y \"$(TargetPath)\" \"$(GTA_III_RE_DIR)\\plugins\\re3.dll\""
filter "configurations:ReleaseFH" filter "configurations:ReleaseFH"
defines { "NDEBUG" } defines { "NDEBUG" }
symbols "Full" symbols "Full"
optimize "off" optimize "off"
staticruntime "on" staticruntime "on"
debugdir "F:/Rockstar Games/GTAIII" debugdir "$(GTA_III_DIR)"
debugcommand "F:/Rockstar Games/GTAIII/gta3.exe" debugcommand "$(GTA_III_DIR)/gta3.exe"
targetextension ".asi" targetextension ".asi"
targetdir "F:/Rockstar Games/GTAIII/scripts" targetdir "$(GTA_III_DIR)/scripts"
filter "configurations:DebugCI" filter "configurations:DebugCI"
defines { "DEBUG" } defines { "DEBUG" }
symbols "On" symbols "On"

View File

@ -1249,7 +1249,8 @@ CCam::FixCamWhenObscuredByVehicle(const CVector &TargetCoors)
Source.z += HeightFixerCarsObscuring; Source.z += HeightFixerCarsObscuring;
} }
bool CCam::Using3rdPersonMouseCam() { bool CCam::Using3rdPersonMouseCam()
{
return CCamera::m_bUseMouse3rdPerson && return CCamera::m_bUseMouse3rdPerson &&
(Mode == MODE_FOLLOWPED || (Mode == MODE_FOLLOWPED ||
TheCamera.m_bPlayerIsInGarage && TheCamera.m_bPlayerIsInGarage &&

View File

@ -37,15 +37,15 @@ WRAPPER void CMenuManager::LoadSettings(void) { EAXJMP(0x488EE0); }
WRAPPER void CMenuManager::WaitForUserCD(void) { EAXJMP(0x48ADD0); } WRAPPER void CMenuManager::WaitForUserCD(void) { EAXJMP(0x48ADD0); }
int CMenuManager::FadeIn(int alpha) { int CMenuManager::FadeIn(int alpha) {
if (FrontEndMenuManager.m_nCurrScreen == MENU_LOADING_IN_PROGRESS || if (m_nCurrScreen == MENU_LOADING_IN_PROGRESS ||
FrontEndMenuManager.m_nCurrScreen == MENU_SAVING_IN_PROGRESS || m_nCurrScreen == MENU_SAVING_IN_PROGRESS ||
FrontEndMenuManager.m_nCurrScreen == MENU_DELETING) m_nCurrScreen == MENU_DELETING)
return alpha; return alpha;
if (FrontEndMenuManager.m_nMenuFadeAlpha >= alpha) if (m_nMenuFadeAlpha >= alpha)
return alpha; return alpha;
return FrontEndMenuManager.m_nMenuFadeAlpha; return m_nMenuFadeAlpha;
} }
STARTPATCHES STARTPATCHES

View File

@ -15,7 +15,8 @@ WRAPPER void CRadar::DrawRadarMap() { EAXJMP(0x4A6C20); }
float &CRadar::m_RadarRange = *(float*)0x8E281C; float &CRadar::m_RadarRange = *(float*)0x8E281C;
CVector2D &CRadar::vec2DRadarOrigin = *(CVector2D*)0x6299B8; CVector2D &CRadar::vec2DRadarOrigin = *(CVector2D*)0x6299B8;
void CRadar::DrawMap() { void CRadar::DrawMap()
{
if (!TheCamera.m_WideScreenOn && CHud::m_Wants_To_Draw_Hud) { if (!TheCamera.m_WideScreenOn && CHud::m_Wants_To_Draw_Hud) {
if (FindPlayerVehicle()) { if (FindPlayerVehicle()) {
if (FindPlayerVehicle()->GetSpeed().Magnitude() > 0.3f) { if (FindPlayerVehicle()->GetSpeed().Magnitude() > 0.3f) {
@ -24,20 +25,20 @@ void CRadar::DrawMap() {
else else
CRadar::m_RadarRange = (FindPlayerVehicle()->GetSpeed().Magnitude() + 0.3f) * 200.0f; CRadar::m_RadarRange = (FindPlayerVehicle()->GetSpeed().Magnitude() + 0.3f) * 200.0f;
} }
else { else
CRadar::m_RadarRange = 120.0f; CRadar::m_RadarRange = 120.0f;
} }
} else
else {
CRadar::m_RadarRange = 120.0f; CRadar::m_RadarRange = 120.0f;
}
vec2DRadarOrigin.x = FindPlayerCentreOfWorld_NoSniperShift().x; vec2DRadarOrigin.x = FindPlayerCentreOfWorld_NoSniperShift().x;
vec2DRadarOrigin.y = FindPlayerCentreOfWorld_NoSniperShift().y; vec2DRadarOrigin.y = FindPlayerCentreOfWorld_NoSniperShift().y;
CRadar::DrawRadarMap(); CRadar::DrawRadarMap();
} }
} }
void CRadar::TransformRadarPointToScreenSpace(CVector2D *out, CVector2D *in) { void CRadar::TransformRadarPointToScreenSpace(CVector2D *out, CVector2D *in)
{
out->x = in->x * HUD_STRETCH_X(47.0f) + HUD_STRETCH_X(47.0f + 20.0f); out->x = in->x * HUD_STRETCH_X(47.0f) + HUD_STRETCH_X(47.0f + 20.0f);
out->y = (HUD_STRETCH_Y(76.0f)) * 0.5f + SCREEN_HEIGHT - (HUD_STRETCH_Y(123.0f)) - in->y * (HUD_STRETCH_Y(76.0f)) * 0.5f; out->y = (HUD_STRETCH_Y(76.0f)) * 0.5f + SCREEN_HEIGHT - (HUD_STRETCH_Y(123.0f)) - in->y * (HUD_STRETCH_Y(76.0f)) * 0.5f;
} }

View File

@ -2,7 +2,8 @@
#include "Entity.h" #include "Entity.h"
#include "math/Vector.h" #include "math/Vector.h"
enum eCrimeType { enum eCrimeType
{
CRIME_NONE, CRIME_NONE,
CRIME_SHOT_FIRED, CRIME_SHOT_FIRED,
CRIME_PED_FIGHT, CRIME_PED_FIGHT,
@ -22,7 +23,8 @@ enum eCrimeType {
CRIME_DESTROYED_CESSNA, CRIME_DESTROYED_CESSNA,
}; };
enum eCopType { enum eCopType
{
COP_STREET = 0, COP_STREET = 0,
COP_FBI = 1, COP_FBI = 1,
COP_SWAT = 2, COP_SWAT = 2,

View File

@ -16,7 +16,8 @@ int &gRetuneCounter = *(int*)0x650B84;
//WRAPPER void cMusicManager::DisplayRadioStationName(void) { EAXJMP(0x57E6D0); } //WRAPPER void cMusicManager::DisplayRadioStationName(void) { EAXJMP(0x57E6D0); }
bool cMusicManager::PlayerInCar() { bool cMusicManager::PlayerInCar()
{
if (!FindPlayerVehicle()) if (!FindPlayerVehicle())
return false; return false;
else { else {
@ -25,7 +26,6 @@ bool cMusicManager::PlayerInCar() {
if (State == PED_DRAG_FROM_CAR || State == PED_EXIT_CAR || State == PED_ARRESTED) if (State == PED_DRAG_FROM_CAR || State == PED_EXIT_CAR || State == PED_ARRESTED)
return false; return false;
int16 Model = FindPlayerVehicle()->m_modelIndex;
switch (FindPlayerVehicle()->m_modelIndex) { switch (FindPlayerVehicle()->m_modelIndex) {
case MI_FIRETRUCK: case MI_FIRETRUCK:
case MI_AMBULAN: case MI_AMBULAN:
@ -42,7 +42,8 @@ bool cMusicManager::PlayerInCar() {
} }
} }
void cMusicManager::DisplayRadioStationName() { void cMusicManager::DisplayRadioStationName()
{
wchar *RadioName = nullptr; wchar *RadioName = nullptr;
uint32 RadioStation = gNumRetunePresses + MusicManager.m_nCurrentStreamedSound; uint32 RadioStation = gNumRetunePresses + MusicManager.m_nCurrentStreamedSound;
@ -84,11 +85,11 @@ void cMusicManager::DisplayRadioStationName() {
CFont::SetJustifyOff(); CFont::SetJustifyOff();
CFont::SetBackgroundOff(); CFont::SetBackgroundOff();
CFont::SetScale(SCREEN_STRETCH_X(0.8f), SCREEN_STRETCH_Y(1.35f)); CFont::SetScale(HUD_STRETCH_X(0.8f), HUD_STRETCH_Y(1.35f));
CFont::SetPropOn(); CFont::SetPropOn();
CFont::SetFontStyle(FONT_HEADING); CFont::SetFontStyle(FONT_HEADING);
CFont::SetCentreOn(); CFont::SetCentreOn();
CFont::SetCentreSize(SCREEN_STRETCH_X(640.0f));; CFont::SetCentreSize(HUD_STRETCH_X(640.0f));;
static int32 nTime = 0; static int32 nTime = 0;
if (!CTimer::GetIsPaused() && !TheCamera.m_WideScreenOn && MusicManager.PlayerInCar()) { if (!CTimer::GetIsPaused() && !TheCamera.m_WideScreenOn && MusicManager.PlayerInCar()) {
@ -105,31 +106,34 @@ void cMusicManager::DisplayRadioStationName() {
else { else {
if (RadioStation > HEAD_RADIO) { if (RadioStation > HEAD_RADIO) {
if (cSampleManager.IsMP3RadioChannelAvailable()) { if (cSampleManager.IsMP3RadioChannelAvailable()) {
if (RadioStation > USERTRACK) if (RadioStation > USERTRACK) {
RadioStation = RADIO_OFF;
}
else {
if (RadioStation > CHATTERBOX)
RadioStation = RADIO_OFF; RadioStation = RADIO_OFF;
return;
} }
} }
else { else {
if (RadioStation > CHATTERBOX) {
RadioStation = RADIO_OFF; RadioStation = RADIO_OFF;
return;
} }
} }
} }
else
RadioStation = RADIO_OFF;
}
}
if (RadioName) { if (RadioName) {
CFont::SetColor(CRGBA(0, 0, 0, 255)); CFont::SetColor(CRGBA(0, 0, 0, 255));
CFont::PrintString(SCREEN_WIDTH / 2, SCREEN_STRETCH_Y(23.0f), RadioName); CFont::PrintString(SCREEN_WIDTH / 2, HUD_STRETCH_Y(23.0f), RadioName);
if (gNumRetunePresses) if (gNumRetunePresses)
CFont::SetColor(CRGBA(102, 133, 143, 255)); CFont::SetColor(CRGBA(102, 133, 143, 255));
else else
CFont::SetColor(CRGBA(147, 196, 211, 255)); CFont::SetColor(CRGBA(147, 196, 211, 255));
CFont::PrintString(SCREEN_WIDTH / 2, SCREEN_STRETCH_Y(22.0f), RadioName); CFont::PrintString(SCREEN_WIDTH / 2, HUD_STRETCH_Y(22.0f), RadioName);
CFont::DrawFonts(); CFont::DrawFonts();
} }
} }

View File

@ -1,6 +1,7 @@
#pragma once #pragma once
enum eRadioStation { enum eRadioStation
{
HEAD_RADIO, HEAD_RADIO,
DOUBLE_CLEF, DOUBLE_CLEF,
JAH_RADIO, JAH_RADIO,
@ -15,7 +16,8 @@ enum eRadioStation {
RADIO_OFF, RADIO_OFF,
}; };
enum eStreamedSounds { enum eStreamedSounds
{
STREAMED_SOUND_RADIO_HEAD = 0, STREAMED_SOUND_RADIO_HEAD = 0,
STREAMED_SOUND_RADIO_CLASSIC = 1, STREAMED_SOUND_RADIO_CLASSIC = 1,
STREAMED_SOUND_RADIO_KJAH = 2, STREAMED_SOUND_RADIO_KJAH = 2,
@ -216,7 +218,8 @@ enum eStreamedSounds {
NO_STREAMED_SOUND = 197, NO_STREAMED_SOUND = 197,
}; };
class tMP3Sample { class tMP3Sample
{
public: public:
uint32 m_nLength; uint32 m_nLength;
uint32 m_nPosition; uint32 m_nPosition;

View File

@ -138,6 +138,7 @@ void mysrand(unsigned int seed);
extern uint8 work_buff[55000]; extern uint8 work_buff[55000];
extern char gString[256]; extern char gString[256];
extern wchar *gUString;
void re3_debug(char *format, ...); void re3_debug(char *format, ...);
void re3_trace(const char *filename, unsigned int lineno, const char *func, char *format, ...); void re3_trace(const char *filename, unsigned int lineno, const char *func, char *format, ...);

View File

@ -6,6 +6,7 @@ WRAPPER void CDarkel::DrawMessages(void) { EAXJMP(0x420920); }
bool CDarkel::Status = *(bool*)0x95CCB4; bool CDarkel::Status = *(bool*)0x95CCB4;
bool CDarkel::FrenzyOnGoing() { bool CDarkel::FrenzyOnGoing()
{
return Status; return Status;
} }

View File

@ -2,8 +2,29 @@
#include "patcher.h" #include "patcher.h"
#include "ModelIndices.h" #include "ModelIndices.h"
#include "Garages.h" #include "Garages.h"
#include "Timer.h"
#include "Font.h"
#include "Messages.h"
#include "Text.h"
WRAPPER void CGarages::PrintMessages(void) { EAXJMP(0x426310); } //WRAPPER void CGarages::PrintMessages(void) { EAXJMP(0x426310); }
int32 &CGarages::BankVansCollected = *(int32 *)0x8F1B34;
bool &CGarages::BombsAreFree = *(bool *)0x95CD7A;
bool &CGarages::RespraysAreFree = *(bool *)0x95CD1D;
int32 &CGarages::CarsCollected = *(int32 *)0x880E18;
int32 &CGarages::CarTypesCollected = *(int32 *)0x8E286C;
int32 &CGarages::CrushedCarId = *(int32 *)0x943060;
uint32 &CGarages::LastTimeHelpMessage = *(uint32 *)0x8F1B58;
int32 &CGarages::MessageNumberInString = *(int32 *)0x885BA8;
const char *CGarages::MessageIDString = (const char *)0x878358;
int32 &CGarages::MessageNumberInString2 = *(int32 *)0x8E2C14;
uint32 &CGarages::MessageStartTime = *(uint32 *)0x8F2530;
uint32 &CGarages::MessageEndTime = *(uint32 *)0x8F597C;
uint32 &CGarages::NumGarages = *(uint32 *)0x8F29F4;
bool &CGarages::PlayerInGarage = *(bool *)0x95CD83;
int32 &CGarages::PoliceCarsCollected = *(int32 *)0x941444;
uint32 &CGarages::GarageToBeTidied = *(uint32 *)0x623570;
bool bool
CGarages::IsModelIndexADoor(uint32 id) CGarages::IsModelIndexADoor(uint32 id)
@ -42,3 +63,44 @@ CGarages::IsModelIndexADoor(uint32 id)
id == MI_CRUSHERBODY || id == MI_CRUSHERBODY ||
id == MI_CRUSHERLID; id == MI_CRUSHERLID;
} }
void CGarages::PrintMessages()
{
if (CTimer::GetTimeInMilliseconds() > CGarages::MessageStartTime && CTimer::GetTimeInMilliseconds() < CGarages::MessageEndTime) {
CFont::SetScale(HUD_STRETCH_X(1.2f / 2), HUD_STRETCH_Y(1.5f / 2)); // BUG: game doesn't use macro here.
CFont::SetPropOn();
CFont::SetJustifyOff();
CFont::SetBackgroundOff();
CFont::SetCentreSize(HUD_FROM_RIGHT(50.0f));
CFont::SetCentreOn();
CFont::SetFontStyle(FONT_BANK);
if (CGarages::MessageNumberInString2 < 0) {
if (CGarages::MessageNumberInString < 0) {
CFont::SetColor(CRGBA(0, 0, 0, 255));
CFont::PrintString((SCREEN_WIDTH/ 2) + HUD_STRETCH_X(2.0f), (SCREEN_HEIGHT / 2) + HUD_STRETCH_Y(-84.0f), TheText.Get(CGarages::MessageIDString));
CFont::SetColor(CRGBA(89, 115, 150, 255));
CFont::PrintString((SCREEN_WIDTH / 2), (SCREEN_HEIGHT / 2) + HUD_STRETCH_Y(-84.0f), TheText.Get(CGarages::MessageIDString));
}
else {
CMessages::InsertNumberInString(TheText.Get(CGarages::MessageIDString), CGarages::MessageNumberInString, -1, -1, -1, -1, -1, gUString);
CFont::SetColor(CRGBA(0, 0, 0, 255));
CFont::PrintString((SCREEN_WIDTH / 2) + HUD_STRETCH_X(2.0f), (SCREEN_HEIGHT / 2) + HUD_STRETCH_Y(-84.0f + 2.0 - 40.0f), gUString);
CFont::SetColor(CRGBA(89, 115, 150, 255));
CFont::PrintString((SCREEN_WIDTH / 2), (SCREEN_HEIGHT / 2) + HUD_STRETCH_Y(-84.0f - 40.0f), gUString);
}
}
else {
CMessages::InsertNumberInString(TheText.Get(CGarages::MessageIDString), CGarages::MessageNumberInString2, -1, -1, -1, -1, -1, gUString);
CFont::SetColor(CRGBA(0, 0, 0, 255));
CFont::PrintString((SCREEN_WIDTH / 2) + HUD_STRETCH_X(2.0f), (SCREEN_HEIGHT / 2) + HUD_STRETCH_Y(-84.0f + 2.0 - 40.0f), gUString);
CFont::SetColor(CRGBA(89, 115, 150, 255));
CFont::PrintString((SCREEN_WIDTH / 2), (SCREEN_HEIGHT / 2) + HUD_STRETCH_Y(-84.0f - 40.0f), gUString);
}
}
}

View File

@ -2,6 +2,24 @@
class CGarages class CGarages
{ {
public:
static int32 &BankVansCollected;
static bool &BombsAreFree;
static bool &RespraysAreFree;
static int32 &CarsCollected;
static int32 &CarTypesCollected;
static int32 &CrushedCarId;
static uint32 &LastTimeHelpMessage;
static int32 &MessageNumberInString;
static const char *MessageIDString;
static int32 &MessageNumberInString2;
static uint32 &MessageStartTime;
static uint32 &MessageEndTime;
static uint32 &NumGarages;
static bool &PlayerInGarage;
static int32 &PoliceCarsCollected;
static uint32 &GarageToBeTidied;
public: public:
static bool IsModelIndexADoor(uint32 id); static bool IsModelIndexADoor(uint32 id);
static void PrintMessages(void); static void PrintMessages(void);

View File

@ -2,18 +2,21 @@
#include "Automobile.h" #include "Automobile.h"
#include "PlayerPed.h" #include "PlayerPed.h"
enum eWastedBustedState { enum eWastedBustedState
WBSTATE_PLAYING = 0x0, {
WBSTATE_WASTED = 0x1, WBSTATE_PLAYING,
WBSTATE_BUSTED = 0x2, WBSTATE_WASTED,
WBSTATE_FAILED_CRITICAL_MISSION = 0x3, WBSTATE_BUSTED,
WBSTATE_FAILED_CRITICAL_MISSION,
}; };
struct CCivilianPed { struct CCivilianPed
{
}; };
class CPlayerInfo { class CPlayerInfo
{
public: public:
CPlayerPed *m_pPed; CPlayerPed *m_pPed;
CVehicle *m_pRemoteVehicle; CVehicle *m_pRemoteVehicle;

View File

@ -3,7 +3,8 @@
#include "Ped.h" #include "Ped.h"
#include "Wanted.h" #include "Wanted.h"
class CPlayerPed : public CPed { class CPlayerPed : public CPed
{
public: public:
CWanted *m_pWanted; CWanted *m_pWanted;
CCopPed *m_pArrestingCop; CCopPed *m_pArrestingCop;

View File

@ -57,6 +57,7 @@
uint8 work_buff[55000]; uint8 work_buff[55000];
char gString[256]; char gString[256];
wchar *gUString = (wchar*)0x74B018;
bool &b_FoundRecentSavedGameWantToLoad = *(bool*)0x95CDA8; bool &b_FoundRecentSavedGameWantToLoad = *(bool*)0x95CDA8;
@ -323,14 +324,15 @@ Render2dStuff(void)
// top and bottom strips // top and bottom strips
if (weaponType == WEAPONTYPE_ROCKETLAUNCHER) { if (weaponType == WEAPONTYPE_ROCKETLAUNCHER) {
CSprite2d::DrawRect(CRect(0.0f, 0.0f, SCREENW, SCREENH/2 - SCREEN_STRETCH_Y(180)), black); CSprite2d::DrawRect(CRect(0.0f, 0.0f, SCREENW, SCREENH / 2 - HUD_STRETCH_Y(180)), black);
CSprite2d::DrawRect(CRect(0.0f, SCREENH/2 + SCREEN_STRETCH_Y(170), SCREENW, SCREENH), black); CSprite2d::DrawRect(CRect(0.0f, SCREENH / 2 + HUD_STRETCH_Y(170), SCREENW, SCREENH), black);
}else{
CSprite2d::DrawRect(CRect(0.0f, 0.0f, SCREENW, SCREENH/2 - SCREEN_STRETCH_Y(210)), black);
CSprite2d::DrawRect(CRect(0.0f, SCREENH/2 + SCREEN_STRETCH_Y(210), SCREENW, SCREENH), black);
} }
CSprite2d::DrawRect(CRect(0.0f, 0.0f, SCREENW/2 - SCREEN_STRETCH_X(210), SCREENH), black); else {
CSprite2d::DrawRect(CRect(SCREENW/2 + SCREEN_STRETCH_X(210), 0.0f, SCREENW, SCREENH), black); CSprite2d::DrawRect(CRect(0.0f, 0.0f, SCREENW, SCREENH / 2 - HUD_STRETCH_Y(210)), black);
CSprite2d::DrawRect(CRect(0.0f, SCREENH / 2 + HUD_STRETCH_Y(210), SCREENW, SCREENH), black);
}
CSprite2d::DrawRect(CRect(0.0f, 0.0f, SCREENW / 2 - HUD_STRETCH_X(210), SCREENH), black);
CSprite2d::DrawRect(CRect(SCREENW / 2 + HUD_STRETCH_X(210), 0.0f, SCREENW, SCREENH), black);
} }
MusicManager.DisplayRadioStationName(); MusicManager.DisplayRadioStationName();

View File

@ -125,10 +125,11 @@ char *WeaponFilenames[] = {
"siterocketm" "siterocketm"
}; };
RwTexture* gpSniperSightTex = (RwTexture*)0x8F5834; RwTexture *&gpSniperSightTex = *(RwTexture**)0x8F5834;
RwTexture* gpRocketSightTex = (RwTexture*)0x8E2C20; RwTexture *&gpRocketSightTex = *(RwTexture**)0x8E2C20;
void CHud::Initialise() { void CHud::Initialise()
{
ReInitialise(); ReInitialise();
int HudTXD = CTxdStore::AddTxdSlot("hud"); int HudTXD = CTxdStore::AddTxdSlot("hud");
@ -147,8 +148,9 @@ void CHud::Initialise() {
CTxdStore::PopCurrentTxd(); CTxdStore::PopCurrentTxd();
} }
void CHud::Shutdown() { void CHud::Shutdown()
for (int i = 0; i < 23; ++i) { {
for (int i = 0; i < ARRAY_SIZE(WeaponFilenames) / 2; ++i) {
Sprites[i].Delete(); Sprites[i].Delete();
} }
@ -162,15 +164,18 @@ void CHud::Shutdown() {
CTxdStore::RemoveTxdSlot(HudTXD); CTxdStore::RemoveTxdSlot(HudTXD);
} }
void CHud::SetVehicleName(wchar* name) { void CHud::SetVehicleName(wchar *name)
{
m_pVehicleName = name; m_pVehicleName = name;
} }
void CHud::SetZoneName(wchar* name) { void CHud::SetZoneName(wchar *name)
{
m_pZoneName = name; m_pZoneName = name;
} }
void CHud::Draw() { void CHud::Draw()
{
RwRenderStateSet(rwRENDERSTATEFOGENABLE, (void*)TRUE); RwRenderStateSet(rwRENDERSTATEFOGENABLE, (void*)TRUE);
RwRenderStateSet(rwRENDERSTATESRCBLEND, (void*)rwBLENDSRCALPHA); RwRenderStateSet(rwRENDERSTATESRCBLEND, (void*)rwBLENDSRCALPHA);
RwRenderStateSet(rwRENDERSTATEDESTBLEND, (void*)rwBLENDINVSRCALPHA); RwRenderStateSet(rwRENDERSTATEDESTBLEND, (void*)rwBLENDINVSRCALPHA);
@ -218,7 +223,7 @@ void CHud::Draw() {
RwRenderStateSet(rwRENDERSTATEZWRITEENABLE, (void*)FALSE); RwRenderStateSet(rwRENDERSTATEZWRITEENABLE, (void*)FALSE);
float fStep = sin((CTimer::GetTimeInMilliseconds() & 1023) * 0.0061328127); float fStep = sin((CTimer::GetTimeInMilliseconds() & 1023) * 0.0061328127);
float fMultBright = CHud::SpriteBrightness * 0.033333335f * (0.25f * fStep + 0.75f); float fMultBright = CHud::SpriteBrightness * 0.03f * (0.25f * fStep + 0.75f);
CRect rect; CRect rect;
float fWidescreenOffset[2] = { 0.0f, 0.0f }; float fWidescreenOffset[2] = { 0.0f, 0.0f };
@ -420,8 +425,8 @@ void CHud::Draw() {
CFont::SetPropOff(); CFont::SetPropOff();
CFont::SetFontStyle(FONT_HEADING); CFont::SetFontStyle(FONT_HEADING);
if (CHud::m_ItemToFlash == 4 && CTimer::GetFrameCounter() & 8 if (CHud::m_ItemToFlash == ITEM_HEALTH && CTimer::GetFrameCounter() & 8
|| CHud::m_ItemToFlash != 4 || CHud::m_ItemToFlash != ITEM_HEALTH
|| CWorld::Players[CWorld::PlayerInFocus].m_pPed->m_fHealth < 10 || CWorld::Players[CWorld::PlayerInFocus].m_pPed->m_fHealth < 10
&& CTimer::GetFrameCounter() & 8) { && CTimer::GetFrameCounter() & 8) {
if (CWorld::Players[CWorld::PlayerInFocus].m_pPed->m_fHealth >= 10 if (CWorld::Players[CWorld::PlayerInFocus].m_pPed->m_fHealth >= 10
@ -450,7 +455,7 @@ void CHud::Draw() {
/* /*
DrawArmour DrawArmour
*/ */
if (CHud::m_ItemToFlash == 3 && CTimer::GetFrameCounter() & 8 || CHud::m_ItemToFlash != 3) { if (CHud::m_ItemToFlash == ITEM_ARMOUR && CTimer::GetFrameCounter() & 8 || CHud::m_ItemToFlash != ITEM_ARMOUR) {
CFont::SetScale(HUD_STRETCH_X(0.8f), HUD_STRETCH_Y(1.35f)); CFont::SetScale(HUD_STRETCH_X(0.8f), HUD_STRETCH_Y(1.35f));
if (CWorld::Players[CWorld::PlayerInFocus].m_pPed->m_fArmour > 1.0f) { if (CWorld::Players[CWorld::PlayerInFocus].m_pPed->m_fArmour > 1.0f) {
AsciiToUnicode("[", sPrintIcon); AsciiToUnicode("[", sPrintIcon);
@ -845,7 +850,7 @@ void CHud::Draw() {
/* /*
DrawRadar DrawRadar
*/ */
if (CHud::m_ItemToFlash == 8 && CTimer::GetFrameCounter() & 8 || CHud::m_ItemToFlash != 8) { if (CHud::m_ItemToFlash == ITEM_RADAR && CTimer::GetFrameCounter() & 8 || CHud::m_ItemToFlash != ITEM_RADAR) {
CRadar::DrawMap(); CRadar::DrawMap();
CHud::Sprites[HUD_RADARDISC].Draw(CRect(HUD_STRETCH_X(16.0f), HUD_FROM_BOTTOM(123.0f + 4.0f), HUD_STRETCH_X(94.0f + 20.0f + 5.0f), HUD_FROM_BOTTOM(-76.0f + 123.0f - 6.0f)), CRGBA(0, 0, 0, 255)); CHud::Sprites[HUD_RADARDISC].Draw(CRect(HUD_STRETCH_X(16.0f), HUD_FROM_BOTTOM(123.0f + 4.0f), HUD_STRETCH_X(94.0f + 20.0f + 5.0f), HUD_FROM_BOTTOM(-76.0f + 123.0f - 6.0f)), CRGBA(0, 0, 0, 255));
CRadar::DrawBlips(); CRadar::DrawBlips();
@ -863,87 +868,77 @@ void CHud::Draw() {
DrawScriptText DrawScriptText
*/ */
if (!CTimer::GetIsUserPaused()) { if (!CTimer::GetIsUserPaused()) {
uint16 CounterA = 0;
uint16 CounterB = 0;
CTextLine* IntroText = CTheScripts::IntroTextLines; CTextLine* IntroText = CTheScripts::IntroTextLines;
do { for (int i = 0; i < 2; i++) {
if (CTheScripts::IntroTextLines[CounterB].m_awText[0] && CTheScripts::IntroTextLines[CounterB].field_29) { if (CTheScripts::IntroTextLines[i].m_awText[0] && CTheScripts::IntroTextLines[i].field_29) {
CFont::SetScale(HUD_STRETCH_X(CTheScripts::IntroTextLines[CounterB].m_fScaleX), HUD_STRETCH_Y(CTheScripts::IntroTextLines[CounterB].m_fScaleY * 0.5f)); CFont::SetScale(HUD_STRETCH_X(CTheScripts::IntroTextLines[i].m_fScaleX), HUD_STRETCH_Y(CTheScripts::IntroTextLines[i].m_fScaleY * 0.5f));
CFont::SetColor(CTheScripts::IntroTextLines[CounterB].m_sColor); CFont::SetColor(CTheScripts::IntroTextLines[i].m_sColor);
if (CTheScripts::IntroTextLines[CounterB].m_bJustify) if (CTheScripts::IntroTextLines[i].m_bJustify)
CFont::SetJustifyOn(); CFont::SetJustifyOn();
else else
CFont::SetJustifyOff(); CFont::SetJustifyOff();
if (CTheScripts::IntroTextLines[CounterB].m_bRightJustify) if (CTheScripts::IntroTextLines[i].m_bRightJustify)
CFont::SetRightJustifyOn(); CFont::SetRightJustifyOn();
else else
CFont::SetRightJustifyOff(); CFont::SetRightJustifyOff();
if (CTheScripts::IntroTextLines[CounterB].m_bCentered) if (CTheScripts::IntroTextLines[i].m_bCentered)
CFont::SetCentreOn(); CFont::SetCentreOn();
else else
CFont::SetCentreOff(); CFont::SetCentreOff();
CFont::SetWrapx(HUD_STRETCH_X(CTheScripts::IntroTextLines[CounterB].m_fWrapX)); CFont::SetWrapx(HUD_STRETCH_X(CTheScripts::IntroTextLines[i].m_fWrapX));
CFont::SetCentreSize(HUD_STRETCH_X(CTheScripts::IntroTextLines[CounterB].m_fCenterSize)); CFont::SetCentreSize(HUD_STRETCH_X(CTheScripts::IntroTextLines[i].m_fCenterSize));
if (CTheScripts::IntroTextLines[CounterB].m_bBackground) if (CTheScripts::IntroTextLines[i].m_bBackground)
CFont::SetBackgroundOn(); CFont::SetBackgroundOn();
else else
CFont::SetBackgroundOff(); CFont::SetBackgroundOff();
CFont::SetBackgroundColor(CTheScripts::IntroTextLines[CounterB].m_sBackgroundColor); CFont::SetBackgroundColor(CTheScripts::IntroTextLines[i].m_sBackgroundColor);
if (CTheScripts::IntroTextLines[CounterB].m_bBackgroundOnly) if (CTheScripts::IntroTextLines[i].m_bBackgroundOnly)
CFont::SetBackGroundOnlyTextOn(); CFont::SetBackGroundOnlyTextOn();
else else
CFont::SetBackGroundOnlyTextOff(); CFont::SetBackGroundOnlyTextOff();
if (CTheScripts::IntroTextLines[CounterB].m_bTextProportional) if (CTheScripts::IntroTextLines[i].m_bTextProportional)
CFont::SetPropOn(); CFont::SetPropOn();
else else
CFont::SetPropOff(); CFont::SetPropOff();
CFont::SetFontStyle(CTheScripts::IntroTextLines[CounterB].m_nFont); CFont::SetFontStyle(CTheScripts::IntroTextLines[i].m_nFont);
CFont::PrintString(HUD_STRETCH_X(640.0f - CTheScripts::IntroTextLines[CounterB].field_36), HUD_STRETCH_Y(448.0f - CTheScripts::IntroTextLines[CounterB].field_40), IntroText->m_awText); CFont::PrintString(HUD_STRETCH_X(640.0f - CTheScripts::IntroTextLines[i].field_36), HUD_STRETCH_Y(448.0f - CTheScripts::IntroTextLines[i].field_40), IntroText->m_awText);
}
} }
++CounterA;
++CounterB;
++IntroText;
} while (CounterA < 2);
uint16 CounterC = 0;
uint16 CounterD = 0;
CScriptRectangle* IntroRect = CTheScripts::IntroRectangles; CScriptRectangle* IntroRect = CTheScripts::IntroRectangles;
do { for (int i = 0; i < 16; i++) {
if (CTheScripts::IntroRectangles[CounterD].m_bIsUsed && CTheScripts::IntroRectangles[CounterD].m_bIsAntialiased) { if (CTheScripts::IntroRectangles[i].m_bIsUsed && CTheScripts::IntroRectangles[i].m_bIsAntialiased) {
if (CTheScripts::IntroRectangles[CounterD].m_wTextureId >= 0) { if (CTheScripts::IntroRectangles[i].m_wTextureId >= 0) {
CRect rect = { CRect rect = {
CTheScripts::IntroRectangles[CounterD].m_sRect.left, CTheScripts::IntroRectangles[i].m_sRect.left,
CTheScripts::IntroRectangles[CounterD].m_sRect.bottom, CTheScripts::IntroRectangles[i].m_sRect.bottom,
CTheScripts::IntroRectangles[CounterD].m_sRect.right, CTheScripts::IntroRectangles[i].m_sRect.right,
CTheScripts::IntroRectangles[CounterD].m_sRect.bottom }; CTheScripts::IntroRectangles[i].m_sRect.bottom };
CTheScripts::ScriptSprites[CTheScripts::IntroRectangles[CounterD].m_wTextureId].Draw(rect, IntroRect->m_sColor); CTheScripts::ScriptSprites[CTheScripts::IntroRectangles[i].m_wTextureId].Draw(rect, IntroRect->m_sColor);
} }
else { else {
CRect rect = { CRect rect = {
CTheScripts::IntroRectangles[CounterD].m_sRect.left, CTheScripts::IntroRectangles[i].m_sRect.left,
CTheScripts::IntroRectangles[CounterD].m_sRect.bottom, CTheScripts::IntroRectangles[i].m_sRect.bottom,
CTheScripts::IntroRectangles[CounterD].m_sRect.right, CTheScripts::IntroRectangles[i].m_sRect.right,
CTheScripts::IntroRectangles[CounterD].m_sRect.bottom }; CTheScripts::IntroRectangles[i].m_sRect.bottom };
CSprite2d::DrawRect(rect, IntroRect->m_sColor); CSprite2d::DrawRect(rect, IntroRect->m_sColor);
} }
} }
++CounterC; }
++CounterD;
++IntroRect;
} while (CounterC < 16);
/* /*
DrawSubtitles DrawSubtitles
@ -972,8 +967,9 @@ void CHud::Draw() {
/* /*
DrawBigMessage DrawBigMessage
*/ */
// MissionCompleteFailedText
if (CHud::m_BigMessage[0][0]) { if (CHud::m_BigMessage[0][0]) {
if (0.0f == BigMessageInUse[0]) { if (BigMessageInUse[0] == 0.0f) {
CFont::SetJustifyOff(); CFont::SetJustifyOff();
CFont::SetBackgroundOff(); CFont::SetBackgroundOff();
CFont::SetBackGroundOnlyTextOff(); CFont::SetBackGroundOnlyTextOff();
@ -983,28 +979,23 @@ void CHud::Draw() {
CFont::SetCentreSize(HUD_STRETCH_X(615.0f)); CFont::SetCentreSize(HUD_STRETCH_X(615.0f));
CFont::SetColor(CRGBA(255, 255, 0, 255)); CFont::SetColor(CRGBA(255, 255, 0, 255));
CFont::SetFontStyle(FONT_HEADING); CFont::SetFontStyle(FONT_HEADING);
if ((SCREENW - 20) <= BigMessageX[0]) {
BigMessageInUse[0] = BigMessageInUse[0] + CTimer::GetTimeStep(); if (BigMessageX[0] >= (SCREENW - 20)) {
if (BigMessageInUse[0] >= 120.0f) { BigMessageAlpha[0] += (CTimer::GetTimeStep() * 0.02f * -255.0f);
BigMessageInUse[0] = 120.0;
BigMessageAlpha[0] = BigMessageAlpha[0] - (CTimer::GetTimeStep() * 0.02f * 1000.0f) * 0.30000001f;
}
if (BigMessageAlpha[0] <= 0.0f) { if (BigMessageAlpha[0] <= 0.0f) {
CHud::m_BigMessage[0][0] = 0; BigMessageAlpha[0] = 0.0f;
BigMessageAlpha[0] = 0.0; BigMessageInUse[0] = 1.0f;
} }
} }
else { else {
float fStep = (CTimer::GetTimeStep() BigMessageX[0] += (CTimer::GetTimeStep() * 0.02f * 255.0f);
* 0.02f BigMessageAlpha[0] += (CTimer::GetTimeStep() * 0.02f * 255.0f);
* 1000.0f)
* 0.30000001f;
BigMessageX[0] = BigMessageX[0] + fStep;
BigMessageAlpha[0] = BigMessageAlpha[0] + fStep;
if (BigMessageAlpha[0] > 255.0f) if (BigMessageAlpha[0] >= 255.0f)
BigMessageAlpha[0] = 255.0; BigMessageAlpha[0] = 255.0f;
} }
CFont::SetColor(CRGBA(0, 0, 0, BigMessageAlpha[0])); CFont::SetColor(CRGBA(0, 0, 0, BigMessageAlpha[0]));
CFont::PrintString(SCREEN_WIDTH / 2, (SCREEN_HEIGHT / 2) - HUD_STRETCH_Y(20.0f - 2.0f), m_BigMessage[0]); CFont::PrintString(SCREEN_WIDTH / 2, (SCREEN_HEIGHT / 2) - HUD_STRETCH_Y(20.0f - 2.0f), m_BigMessage[0]);
@ -1023,14 +1014,12 @@ void CHud::Draw() {
// WastedBustedText // WastedBustedText
if (CHud::m_BigMessage[2][0]) { if (CHud::m_BigMessage[2][0]) {
if (0 == BigMessageInUse[2]) { if (BigMessageInUse[2] == 0.0f) {
BigMessageAlpha[2] = (CTimer::GetTimeStep() BigMessageAlpha[2] += (CTimer::GetTimeStep() * 0.02f * 1000.0f) * 0.4f;
* 0.02f
* 1000.0f)
* 0.40000001
+ BigMessageAlpha[2];
if (BigMessageAlpha[2] > 255.0f) if (BigMessageAlpha[2] > 255.0f)
BigMessageAlpha[2] = 255.0; BigMessageAlpha[2] = 255.0;
CFont::SetBackgroundOff(); CFont::SetBackgroundOff();
if (CGame::frenchGame || CGame::germanGame) if (CGame::frenchGame || CGame::germanGame)
@ -1060,7 +1049,8 @@ void CHud::Draw() {
} }
} }
void CHud::DrawAfterFade() { void CHud::DrawAfterFade()
{
if (CTimer::GetIsUserPaused() || CReplay::Mode == 1) if (CTimer::GetIsUserPaused() || CReplay::Mode == 1)
return; return;
@ -1179,7 +1169,6 @@ void CHud::DrawAfterFade() {
CFont::PrintString((SCREEN_WIDTH / 2), (SCREEN_HEIGHT / 2) - HUD_STRETCH_Y(84.0f), m_BigMessage[4]); CFont::PrintString((SCREEN_WIDTH / 2), (SCREEN_HEIGHT / 2) - HUD_STRETCH_Y(84.0f), m_BigMessage[4]);
} }
// Oddjob result // Oddjob result
if (OddJob2OffTimer > 0) if (OddJob2OffTimer > 0)
OddJob2OffTimer = OddJob2OffTimer - (CTimer::GetTimeStep() * 0.02f * 1000.0f); OddJob2OffTimer = OddJob2OffTimer - (CTimer::GetTimeStep() * 0.02f * 1000.0f);
@ -1256,23 +1245,20 @@ void CHud::DrawAfterFade() {
CFont::SetRightJustifyWrap(-500); CFont::SetRightJustifyWrap(-500);
CFont::SetRightJustifyOn(); CFont::SetRightJustifyOn();
CFont::SetFontStyle(FONT_HEADING); CFont::SetFontStyle(FONT_HEADING);
if ((SCREENW - 20) <= BigMessageX[1]) { if (BigMessageX[1] >= (SCREENW - 20)) {
BigMessageInUse[1] = BigMessageInUse[1] + CTimer::GetTimeStep(); BigMessageAlpha[1] += (CTimer::GetTimeStep() * 0.02f * -255.0f);
if (BigMessageInUse[1] >= 120.0f) {
BigMessageInUse[1] = 120.0; if (BigMessageAlpha[1] <= 0.0f) {
BigMessageAlpha[1] = BigMessageAlpha[1] - (CTimer::GetTimeStep() * 0.02f * 1000.0f) * 0.3f; BigMessageAlpha[1] = 0.0f;
} BigMessageInUse[1] = 1.0f;
if (BigMessageAlpha[1] <= 0) {
m_BigMessage[1][0] = 0;
BigMessageAlpha[1] = 0.0;
} }
} }
else { else {
float fStep = (CTimer::GetTimeStep() * 0.02f * 1000.0f) * 0.3f; BigMessageX[1] += (CTimer::GetTimeStep() * 0.02f * 255.0f);
BigMessageX[1] = BigMessageX[1] + fStep; BigMessageAlpha[1] += (CTimer::GetTimeStep() * 0.02f * 255.0f);
BigMessageAlpha[1] = BigMessageAlpha[1] + fStep;
if (BigMessageAlpha[1] > 255.0f) if (BigMessageAlpha[1] >= 255.0f)
BigMessageAlpha[1] = 255.0; BigMessageAlpha[1] = 255.0f;
} }
CFont::SetColor(CRGBA(40, 40, 40, BigMessageAlpha[1])); CFont::SetColor(CRGBA(40, 40, 40, BigMessageAlpha[1]));
CFont::PrintString(HUD_FROM_RIGHT(20.0f - 2.0f), HUD_FROM_BOTTOM(120.0f), m_BigMessage[1]); CFont::PrintString(HUD_FROM_RIGHT(20.0f - 2.0f), HUD_FROM_BOTTOM(120.0f), m_BigMessage[1]);
@ -1281,13 +1267,13 @@ void CHud::DrawAfterFade() {
CFont::PrintString(HUD_FROM_RIGHT(20.0f), HUD_FROM_BOTTOM(120.0f), m_BigMessage[1]); CFont::PrintString(HUD_FROM_RIGHT(20.0f), HUD_FROM_BOTTOM(120.0f), m_BigMessage[1]);
} }
else { else {
BigMessageAlpha[1] = 0.0; BigMessageAlpha[1] = 0.0f;
BigMessageX[1] = -60.0; BigMessageX[1] = -60.0f;
BigMessageInUse[1] = 1.0; BigMessageInUse[1] = 1.0f;
} }
} }
else { else {
BigMessageInUse[1] = 0.0; BigMessageInUse[1] = 0.0f;
} }
} }

View File

@ -1,7 +1,15 @@
#pragma once #pragma once
#include "Sprite2d.h" #include "Sprite2d.h"
enum eSprites { enum eItems
{
ITEM_ARMOUR = 3,
ITEM_HEALTH = 4,
ITEM_RADAR = 8
};
enum eSprites
{
HUD_FIST, HUD_FIST,
HUD_BAT, HUD_BAT,
HUD_PISTOL, HUD_PISTOL,
@ -21,7 +29,8 @@ enum eSprites {
HUD_SITEM16 = 21 HUD_SITEM16 = 21
}; };
class CHud { class CHud
{
public: public:
static CSprite2d *Sprites; static CSprite2d *Sprites;