diff --git a/src/core/Camera.cpp b/src/core/Camera.cpp index d9cc5c32..9ebec1a6 100644 --- a/src/core/Camera.cpp +++ b/src/core/Camera.cpp @@ -2198,26 +2198,24 @@ CCamera::ProcessWideScreenOn(void) void CCamera::DrawBordersForWideScreen(void) { + float bottomBorderTopY, topBorderBottomY; + if (m_WideScreenOn) { + float centerY = (SCREEN_HEIGHT / 2) * (m_ScreenReductionPercentage / 100.f); + topBorderBottomY = centerY - SCREEN_SCALE_Y(22.f); + bottomBorderTopY = SCREEN_HEIGHT - centerY - SCREEN_SCALE_Y(14.f); + } else { + topBorderBottomY = 0.f; + bottomBorderTopY = SCREEN_HEIGHT; + } + if(m_BlurType == MBLUR_NONE || m_BlurType == MBLUR_NORMAL) SetMotionBlurAlpha(80); - CSprite2d::DrawRect( -#ifdef FIX_BUGS - CRect(0.0f, (SCREEN_HEIGHT/2) * m_ScreenReductionPercentage/100.0f - SCREEN_SCALE_Y(8.0f), -#else - CRect(0.0f, (SCREEN_HEIGHT/2) * m_ScreenReductionPercentage/100.0f - 8.0f, -#endif - SCREEN_WIDTH, 0.0f), - CRGBA(0, 0, 0, 255)); + // top border + CSprite2d::DrawRect(CRect(0.0f, 0.0f, SCREEN_WIDTH, topBorderBottomY), CRGBA(0, 0, 0, 255)); - CSprite2d::DrawRect( - CRect(0.0f, SCREEN_HEIGHT, -#ifdef FIX_BUGS - SCREEN_WIDTH, SCREEN_HEIGHT - (SCREEN_HEIGHT/2) * m_ScreenReductionPercentage/100.0f - SCREEN_SCALE_Y(8.0f)), -#else - SCREEN_WIDTH, SCREEN_HEIGHT - (SCREEN_HEIGHT/2) * m_ScreenReductionPercentage/100.0f - 8.0f), -#endif - CRGBA(0, 0, 0, 255)); + // bottom border + CSprite2d::DrawRect(CRect(0.0f, bottomBorderTopY, SCREEN_WIDTH, SCREEN_HEIGHT), CRGBA(0, 0, 0, 255)); } diff --git a/src/core/Frontend.cpp b/src/core/Frontend.cpp index c4af9ce6..d6411c77 100644 --- a/src/core/Frontend.cpp +++ b/src/core/Frontend.cpp @@ -3272,7 +3272,7 @@ CMenuManager::MessageScreen(const char *text, bool blackBg) DoRWStuffEndOfFrame(); } -// TODO(Miami) +// --MIAMI: Done void CMenuManager::SmallMessageScreen(const char* text) { @@ -3284,9 +3284,19 @@ CMenuManager::SmallMessageScreen(const char* text) CFont::SetFontStyle(FONT_LOCALE(FONT_STANDARD)); CFont::SetCentreSize(SCREEN_SCALE_X(430.0f)); CFont::SetCentreOn(); - CFont::SetColor(CRGBA(255, 217, 106, FadeIn(255))); + CFont::SetColor(CRGBA(LABEL_COLOR.r, LABEL_COLOR.g, LABEL_COLOR.b, FadeIn(255))); + CFont::SetDropShadowPosition(2); + CFont::SetDropColor(CRGBA(0, 0, 0, 255)); CFont::SetScale(SCREEN_SCALE_X(SMALLTEXT_X_SCALE), SCREEN_SCALE_Y(SMALLTEXT_Y_SCALE)); - CFont::PrintString(SCREEN_SCALE_X(320.0f), SCREEN_SCALE_Y(170.0f), TheText.Get(text)); + + int numOfLines = CFont::GetNumberLines(SCREEN_WIDTH / 2.f, SCREEN_SCALE_Y(135.f), TheText.Get(text)); + float y; + if (numOfLines > 1) + y = SCREEN_SCALE_Y(192.f) - numOfLines * SCREEN_SCALE_Y(8.f); + else + y = SCREEN_SCALE_Y(182.f); + + CFont::PrintString(SCREEN_WIDTH / 2.f, y, TheText.Get(text)); } void diff --git a/src/core/World.cpp b/src/core/World.cpp index 53d36854..ecf17575 100644 --- a/src/core/World.cpp +++ b/src/core/World.cpp @@ -2064,6 +2064,10 @@ CWorld::Process(void) movingPed->bInVehicle = false; movingPed->QuitEnteringCar(); } + } else if (movingPed->m_attachedTo) { + movingPed->PositionAttachedPed(); + movingPed->GetMatrix().UpdateRW(); + movingPed->UpdateRwFrame(); } } } diff --git a/src/core/main.cpp b/src/core/main.cpp index 6ffaabf6..2ea15589 100644 --- a/src/core/main.cpp +++ b/src/core/main.cpp @@ -234,18 +234,13 @@ DoFade(void) fadeColor.a = alpha; } + // This is CCamera::GetScreenRect in VC if(TheCamera.m_WideScreenOn){ - // what's this? float y = SCREEN_HEIGHT/2 * TheCamera.m_ScreenReductionPercentage/100.0f; rect.left = 0.0f; rect.right = SCREEN_WIDTH; -#ifdef FIX_BUGS - rect.top = y - SCREEN_SCALE_Y(8.0f); - rect.bottom = SCREEN_HEIGHT - y - SCREEN_SCALE_Y(8.0f); -#else - rect.top = y - 8.0f; - rect.bottom = SCREEN_HEIGHT - y - 8.0f; -#endif // FIX_BUGS + rect.top = y - SCREEN_SCALE_Y(22.0f); + rect.bottom = SCREEN_HEIGHT - y - SCREEN_SCALE_Y(14.0f); }else{ rect.left = 0.0f; rect.right = SCREEN_WIDTH; diff --git a/src/peds/Ped.cpp b/src/peds/Ped.cpp index 56d7556b..f940ca5d 100644 --- a/src/peds/Ped.cpp +++ b/src/peds/Ped.cpp @@ -18809,7 +18809,7 @@ CPed::AttachPedToEntity(CEntity *ent, CVector offset, uint16 type, float rot, eW m_attachedTo->RegisterReference(&m_attachedTo); m_vecAttachOffset = offset; m_attachType = type; - m_attachRot = rot; + m_attachRotStep = rot; if (IsPlayer()) { bUsesCollision = false; } else if (ent->IsVehicle()) { @@ -18843,8 +18843,7 @@ CPed::AttachPedToEntity(CEntity *ent, CVector offset, uint16 type, float rot, eW SetCurrentWeapon(weapon); } - // TODO(Miami) - // PositionAttachedPed(); + PositionAttachedPed(); } // --MIAMI: Done @@ -19198,6 +19197,55 @@ CPed::DriveVehicle(void) } } +// --MIAMI: Done +void +CPed::PositionAttachedPed() +{ + CMatrix rotMatrix, targetMat; + targetMat = m_attachedTo->GetMatrix(); + targetMat.GetPosition() += Multiply3x3(m_attachedTo->GetMatrix(), m_vecAttachOffset); + float objAngle = m_attachedTo->GetForward().Heading(); + + if (!IsPlayer()) { + float targetAngle = objAngle; + switch (m_attachType) { + case 1: + targetAngle += HALFPI; + break; + case 2: + targetAngle += PI; + break; + case 3: + targetAngle -= HALFPI; + break; + default: + break; + } + targetAngle = CGeneral::LimitRadianAngle(targetAngle); + m_fRotationCur = CGeneral::LimitRadianAngle(m_fRotationCur); + float neededTurn = m_fRotationCur - targetAngle; + + if (neededTurn > PI) + neededTurn -= TWOPI; + else if (neededTurn < -PI) + neededTurn += TWOPI; + + if (neededTurn > m_attachRotStep) + m_fRotationCur = CGeneral::LimitRadianAngle(targetAngle + m_attachRotStep); + else if (-m_attachRotStep > neededTurn) + m_fRotationCur = CGeneral::LimitRadianAngle(targetAngle - m_attachRotStep); + else + m_fRotationCur = CGeneral::LimitRadianAngle(m_fRotationCur); + } + rotMatrix.SetRotateZ(m_fRotationCur - objAngle); + targetMat = targetMat * rotMatrix; + GetMatrix() = targetMat; + if (m_attachedTo->IsVehicle() || m_attachedTo->IsObject()) { + m_vecMoveSpeed = ((CPhysical*)m_attachedTo)->m_vecMoveSpeed; + m_vecTurnSpeed = ((CPhysical*)m_attachedTo)->m_vecTurnSpeed; + } +} + void PlayRandomAnimationsFromAnimBlock(CPed* ped, AssocGroupId animGroup, uint32 first, uint32 amount) { diff --git a/src/peds/Ped.h b/src/peds/Ped.h index 673c70b0..681fc033 100644 --- a/src/peds/Ped.h +++ b/src/peds/Ped.h @@ -616,7 +616,7 @@ public: CEntity *m_attachedTo; CVector m_vecAttachOffset; uint16 m_attachType; - float m_attachRot; + float m_attachRotStep; uint32 m_attachWepAmmo; uint32 m_threatFlags; uint32 m_threatCheck; @@ -841,6 +841,7 @@ public: void DettachPedFromEntity(); void PedShuffle(); void DriveVehicle(); + void PositionAttachedPed(); // Static methods static CVector GetLocalPositionToOpenCarDoor(CVehicle *veh, uint32 component, float offset); diff --git a/src/render/Hud.cpp b/src/render/Hud.cpp index 98982d18..6df670a9 100644 --- a/src/render/Hud.cpp +++ b/src/render/Hud.cpp @@ -20,7 +20,7 @@ #include "TxdStore.h" #include "User.h" #include "World.h" -#include +#include "CutsceneMgr.h" // Game has colors inlined in code. // For easier modification we collect them here: