2019-05-28 08:39:36 +02:00
|
|
|
#include "common.h"
|
|
|
|
#include "patcher.h"
|
2019-06-17 10:30:02 +02:00
|
|
|
#include "main.h"
|
2019-05-28 08:39:36 +02:00
|
|
|
#include "ModelIndices.h"
|
|
|
|
#include "Garages.h"
|
2019-06-17 02:10:55 +02:00
|
|
|
#include "Timer.h"
|
|
|
|
#include "Font.h"
|
|
|
|
#include "Messages.h"
|
2020-01-03 17:48:13 +01:00
|
|
|
#include "PlayerPed.h"
|
2019-06-17 02:10:55 +02:00
|
|
|
#include "Text.h"
|
2020-01-03 17:48:13 +01:00
|
|
|
#include "World.h"
|
2019-05-28 08:39:36 +02:00
|
|
|
|
2019-06-17 02:10:55 +02:00
|
|
|
int32 &CGarages::BankVansCollected = *(int32 *)0x8F1B34;
|
|
|
|
bool &CGarages::BombsAreFree = *(bool *)0x95CD7A;
|
|
|
|
bool &CGarages::RespraysAreFree = *(bool *)0x95CD1D;
|
|
|
|
int32 &CGarages::CarsCollected = *(int32 *)0x880E18;
|
2020-02-15 12:53:42 +01:00
|
|
|
int32 (&CGarages::CarTypesCollected)[TOTAL_COLLECTCARS_GARAGES] = *(int32 (*)[TOTAL_COLLECTCARS_GARAGES])(uintptr*)0x8E286C;
|
2019-06-17 02:10:55 +02:00
|
|
|
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;
|
2019-05-30 21:24:47 +02:00
|
|
|
|
2020-01-03 17:48:13 +01:00
|
|
|
CGarage(&CGarages::Garages)[NUM_GARAGES] = *(CGarage(*)[NUM_GARAGES])(uintptr*)0x72BCD0;
|
|
|
|
|
2019-10-19 00:23:40 +02:00
|
|
|
WRAPPER void CGarages::Init(void) { EAXJMP(0x421C60); }
|
|
|
|
WRAPPER void CGarages::Update(void) { EAXJMP(0x421E40); }
|
2020-03-11 04:25:50 +01:00
|
|
|
WRAPPER void CGarages::Load(uint8* buf, uint32 size) { EAXJMP(0x428940); }
|
|
|
|
WRAPPER void CGarages::Save(uint8* buf, uint32 *size) { EAXJMP(0x4284e0); }
|
2019-10-19 00:23:40 +02:00
|
|
|
|
2019-05-28 08:39:36 +02:00
|
|
|
bool
|
|
|
|
CGarages::IsModelIndexADoor(uint32 id)
|
|
|
|
{
|
|
|
|
return id == MI_GARAGEDOOR1 ||
|
|
|
|
id == MI_GARAGEDOOR2 ||
|
|
|
|
id == MI_GARAGEDOOR3 ||
|
|
|
|
id == MI_GARAGEDOOR4 ||
|
|
|
|
id == MI_GARAGEDOOR5 ||
|
|
|
|
id == MI_GARAGEDOOR6 ||
|
|
|
|
id == MI_GARAGEDOOR7 ||
|
|
|
|
id == MI_GARAGEDOOR9 ||
|
|
|
|
id == MI_GARAGEDOOR10 ||
|
|
|
|
id == MI_GARAGEDOOR11 ||
|
|
|
|
id == MI_GARAGEDOOR12 ||
|
|
|
|
id == MI_GARAGEDOOR13 ||
|
|
|
|
id == MI_GARAGEDOOR14 ||
|
|
|
|
id == MI_GARAGEDOOR15 ||
|
|
|
|
id == MI_GARAGEDOOR16 ||
|
|
|
|
id == MI_GARAGEDOOR17 ||
|
|
|
|
id == MI_GARAGEDOOR18 ||
|
|
|
|
id == MI_GARAGEDOOR19 ||
|
|
|
|
id == MI_GARAGEDOOR20 ||
|
|
|
|
id == MI_GARAGEDOOR21 ||
|
|
|
|
id == MI_GARAGEDOOR22 ||
|
|
|
|
id == MI_GARAGEDOOR23 ||
|
|
|
|
id == MI_GARAGEDOOR24 ||
|
|
|
|
id == MI_GARAGEDOOR25 ||
|
|
|
|
id == MI_GARAGEDOOR26 ||
|
|
|
|
id == MI_GARAGEDOOR27 ||
|
|
|
|
id == MI_GARAGEDOOR28 ||
|
|
|
|
id == MI_GARAGEDOOR29 ||
|
|
|
|
id == MI_GARAGEDOOR30 ||
|
|
|
|
id == MI_GARAGEDOOR31 ||
|
|
|
|
id == MI_GARAGEDOOR32 ||
|
|
|
|
id == MI_CRUSHERBODY ||
|
|
|
|
id == MI_CRUSHERLID;
|
|
|
|
}
|
2019-06-17 02:10:55 +02:00
|
|
|
|
2019-07-27 20:28:18 +02:00
|
|
|
bool CGarages::HasCarBeenCrushed(int32 handle)
|
|
|
|
{
|
|
|
|
return CrushedCarId == handle;
|
|
|
|
}
|
|
|
|
|
2019-08-16 20:17:15 +02:00
|
|
|
WRAPPER void CGarages::TriggerMessage(const char *text, int16, uint16 time, int16) { EAXJMP(0x426B20); }
|
2019-09-16 19:32:58 +02:00
|
|
|
WRAPPER bool CGarages::IsPointWithinHideOutGarage(CVector&) { EAXJMP(0x428260); }
|
|
|
|
WRAPPER bool CGarages::IsPointWithinAnyGarage(CVector&) { EAXJMP(0x428320); }
|
2019-10-07 23:29:30 +02:00
|
|
|
WRAPPER void CGarages::PlayerArrestedOrDied() { EAXJMP(0x427F60); }
|
2019-10-21 23:39:59 +02:00
|
|
|
WRAPPER int16 CGarages::AddOne(float, float, float, float, float, float, uint8, uint32) { EAXJMP(0x421FA0); }
|
|
|
|
WRAPPER void CGarages::SetTargetCarForMissonGarage(int16, CVehicle*) { EAXJMP(0x426BD0); }
|
|
|
|
WRAPPER bool CGarages::HasCarBeenDroppedOffYet(int16) { EAXJMP(0x426C20); }
|
2019-10-27 10:51:09 +01:00
|
|
|
WRAPPER void CGarages::DeActivateGarage(int16) { EAXJMP(0x426C40); }
|
|
|
|
WRAPPER void CGarages::ActivateGarage(int16) { EAXJMP(0x426C60); }
|
|
|
|
|
|
|
|
int32 CGarages::QueryCarsCollected(int16 garage)
|
|
|
|
{
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2020-01-03 17:48:13 +01:00
|
|
|
void CGarages::GivePlayerDetonator()
|
|
|
|
{
|
|
|
|
FindPlayerPed()->GiveWeapon(WEAPONTYPE_DETONATOR, 1);
|
2020-02-02 14:51:33 +01:00
|
|
|
FindPlayerPed()->GetWeapon(FindPlayerPed()->GetWeaponSlot(WEAPONTYPE_DETONATOR)).m_eWeaponState = WEAPONSTATE_READY;
|
2020-01-03 17:48:13 +01:00
|
|
|
}
|
|
|
|
|
2019-10-27 10:51:09 +01:00
|
|
|
WRAPPER bool CGarages::HasThisCarBeenCollected(int16 garage, uint8 id) { EAXJMP(0x426D50); }
|
2020-02-15 12:53:42 +01:00
|
|
|
WRAPPER void CGarages::ChangeGarageType(int16 garage, eGarageType type, int32 mi) { EAXJMP(0x4222A0); }
|
2020-01-03 17:48:13 +01:00
|
|
|
WRAPPER bool CGarages::HasResprayHappened(int16 garage) { EAXJMP(0x4274F0); }
|
2020-02-16 21:08:54 +01:00
|
|
|
WRAPPER bool CGarages::IsThisCarWithinGarageArea(int16 garage, CEntity* pCar) { EAXJMP(0x427570); }
|
2020-01-03 17:48:13 +01:00
|
|
|
|
|
|
|
void CGarage::OpenThisGarage()
|
|
|
|
{
|
|
|
|
if (m_eGarageState == GS_FULLYCLOSED || m_eGarageState == GS_CLOSING || m_eGarageState == GS_CLOSEDCONTAINSCAR)
|
|
|
|
m_eGarageState = GS_OPENING;
|
|
|
|
}
|
|
|
|
|
2020-02-15 12:53:42 +01:00
|
|
|
bool CGarages::IsGarageOpen(int16 garage)
|
|
|
|
{
|
|
|
|
return Garages[garage].IsOpen();
|
|
|
|
}
|
|
|
|
|
|
|
|
bool CGarages::IsGarageClosed(int16 garage)
|
|
|
|
{
|
|
|
|
return Garages[garage].IsClosed();
|
|
|
|
}
|
|
|
|
|
2020-01-03 17:48:13 +01:00
|
|
|
void CGarage::CloseThisGarage()
|
|
|
|
{
|
|
|
|
if (m_eGarageState == GS_OPENED || m_eGarageState == GS_OPENING)
|
|
|
|
m_eGarageState = GS_CLOSING;
|
|
|
|
}
|
2019-07-17 13:19:20 +02:00
|
|
|
|
2020-02-15 12:53:42 +01:00
|
|
|
void CGarages::SetGarageDoorToRotate(int16 garage)
|
|
|
|
{
|
|
|
|
if (Garages[garage].m_bRotatedDoor)
|
|
|
|
return;
|
|
|
|
Garages[garage].m_bRotatedDoor = true;
|
|
|
|
Garages[garage].m_fDoorHeight /= 2.0f;
|
|
|
|
Garages[garage].m_fDoorHeight -= 0.1f;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool CGarages::HasImportExportGarageCollectedThisCar(int16 garage, int8 car)
|
|
|
|
{
|
|
|
|
return CarTypesCollected[GetCarsCollectedIndexForGarageType(Garages[garage].m_eGarageType)] & (1 << car);
|
|
|
|
}
|
|
|
|
|
|
|
|
void CGarages::SetLeaveCameraForThisGarage(int16 garage)
|
|
|
|
{
|
|
|
|
Garages[garage].m_bCameraFollowsPlayer = true;
|
|
|
|
}
|
|
|
|
|
2019-06-20 15:18:15 +02:00
|
|
|
#if 0
|
|
|
|
WRAPPER void CGarages::PrintMessages(void) { EAXJMP(0x426310); }
|
|
|
|
#else
|
2019-06-17 02:10:55 +02:00
|
|
|
void CGarages::PrintMessages()
|
|
|
|
{
|
2019-06-25 02:34:29 +02:00
|
|
|
if (CTimer::GetTimeInMilliseconds() > MessageStartTime && CTimer::GetTimeInMilliseconds() < MessageEndTime) {
|
2019-10-06 16:33:07 +02:00
|
|
|
CFont::SetScale(SCREEN_SCALE_X(1.2f), SCREEN_SCALE_Y(1.5f)); // BUG: game doesn't use macro here.
|
2019-06-17 02:10:55 +02:00
|
|
|
CFont::SetPropOn();
|
|
|
|
CFont::SetJustifyOff();
|
|
|
|
CFont::SetBackgroundOff();
|
2019-06-20 02:31:03 +02:00
|
|
|
CFont::SetCentreSize(SCREEN_SCALE_FROM_RIGHT(50.0f));
|
2019-06-17 02:10:55 +02:00
|
|
|
CFont::SetCentreOn();
|
|
|
|
CFont::SetFontStyle(FONT_BANK);
|
2019-10-06 16:33:07 +02:00
|
|
|
CFont::SetColor(CRGBA(0, 0, 0, 255));
|
|
|
|
|
|
|
|
float y_offset = SCREEN_HEIGHT / 3; // THIS is PS2 calculation
|
|
|
|
// y_offset = SCREEN_HEIGHT / 2 - SCREEN_SCALE_Y(84.0f); // This is PC and results in text being written over some HUD elements
|
2019-06-17 02:10:55 +02:00
|
|
|
|
2019-06-25 02:34:29 +02:00
|
|
|
if (MessageNumberInString2 < 0) {
|
|
|
|
if (MessageNumberInString < 0) {
|
2019-10-06 16:33:07 +02:00
|
|
|
CFont::PrintString(SCREEN_WIDTH / 2 - SCREEN_SCALE_X(2.0f), y_offset - SCREEN_SCALE_Y(2.0f), TheText.Get(MessageIDString));
|
2019-06-17 02:10:55 +02:00
|
|
|
|
|
|
|
CFont::SetColor(CRGBA(89, 115, 150, 255));
|
2019-10-06 16:33:07 +02:00
|
|
|
CFont::PrintString(SCREEN_WIDTH / 2, y_offset, TheText.Get(MessageIDString));
|
2019-06-17 02:10:55 +02:00
|
|
|
}
|
|
|
|
else {
|
2019-06-25 02:34:29 +02:00
|
|
|
CMessages::InsertNumberInString(TheText.Get(MessageIDString), MessageNumberInString, -1, -1, -1, -1, -1, gUString);
|
2019-06-17 02:10:55 +02:00
|
|
|
|
2019-10-06 16:33:07 +02:00
|
|
|
CFont::PrintString(SCREEN_WIDTH / 2 + SCREEN_SCALE_X(2.0f), y_offset - SCREEN_SCALE_Y(40.0f) + SCREEN_SCALE_Y(2.0f), gUString);
|
2019-06-17 02:10:55 +02:00
|
|
|
|
|
|
|
CFont::SetColor(CRGBA(89, 115, 150, 255));
|
2019-10-06 16:33:07 +02:00
|
|
|
CFont::PrintString(SCREEN_WIDTH / 2, y_offset - SCREEN_SCALE_Y(40.0f), gUString);
|
2019-06-17 02:10:55 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
else {
|
2019-06-25 02:34:29 +02:00
|
|
|
CMessages::InsertNumberInString(TheText.Get(MessageIDString), MessageNumberInString, MessageNumberInString2, -1, -1, -1, -1, gUString);
|
2019-10-06 16:33:07 +02:00
|
|
|
CFont::PrintString(SCREEN_WIDTH / 2 + SCREEN_SCALE_X(2.0f), y_offset - SCREEN_SCALE_Y(40.0f) + SCREEN_SCALE_Y(2.0f), gUString);
|
2019-06-17 02:10:55 +02:00
|
|
|
|
|
|
|
CFont::SetColor(CRGBA(89, 115, 150, 255));
|
2019-10-06 16:33:07 +02:00
|
|
|
CFont::PrintString(SCREEN_WIDTH / 2, y_offset - SCREEN_SCALE_Y(40.0f), gUString);
|
2019-06-17 02:10:55 +02:00
|
|
|
}
|
|
|
|
}
|
2019-06-20 15:18:15 +02:00
|
|
|
}
|
2019-10-19 00:23:40 +02:00
|
|
|
#endif
|