summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorNikolay Korolev <nickvnuk@gmail.com>2020-06-08 00:01:39 +0200
committerNikolay Korolev <nickvnuk@gmail.com>2020-06-08 00:01:39 +0200
commit5ec46bcdfb06cdb6a2db2ae1f7c588a41d60d675 (patch)
treee9e741ec4753a91e62dccc136213f32b32ac15ec /src
parentmore accurate code (diff)
parentCarCtrl fixes (diff)
downloadre3-5ec46bcdfb06cdb6a2db2ae1f7c588a41d60d675.tar
re3-5ec46bcdfb06cdb6a2db2ae1f7c588a41d60d675.tar.gz
re3-5ec46bcdfb06cdb6a2db2ae1f7c588a41d60d675.tar.bz2
re3-5ec46bcdfb06cdb6a2db2ae1f7c588a41d60d675.tar.lz
re3-5ec46bcdfb06cdb6a2db2ae1f7c588a41d60d675.tar.xz
re3-5ec46bcdfb06cdb6a2db2ae1f7c588a41d60d675.tar.zst
re3-5ec46bcdfb06cdb6a2db2ae1f7c588a41d60d675.zip
Diffstat (limited to 'src')
-rw-r--r--src/control/CarCtrl.cpp14
-rw-r--r--src/control/Script.cpp2
-rw-r--r--src/core/Camera.cpp30
-rw-r--r--src/core/Frontend.cpp16
-rw-r--r--src/core/World.cpp4
-rw-r--r--src/core/main.cpp11
-rw-r--r--src/peds/Ped.cpp54
-rw-r--r--src/peds/Ped.h3
-rw-r--r--src/render/Hud.cpp2
9 files changed, 97 insertions, 39 deletions
diff --git a/src/control/CarCtrl.cpp b/src/control/CarCtrl.cpp
index ae57e030..59f49a41 100644
--- a/src/control/CarCtrl.cpp
+++ b/src/control/CarCtrl.cpp
@@ -1127,7 +1127,7 @@ CCarCtrl::FindMaximumSpeedForThisCarInTraffic(CVehicle* pVehicle)
}
}
pVehicle->bWarnedPeds = true;
- if (pVehicle->AutoPilot.m_nDrivingStyle == DRIVINGSTYLE_STOP_FOR_CARS)
+ if (pVehicle->AutoPilot.m_nDrivingStyle == DRIVINGSTYLE_STOP_FOR_CARS || pVehicle->AutoPilot.m_nDrivingStyle == DRIVINGSTYLE_STOP_FOR_CARS_IGNORE_LIGHTS)
return maxSpeed;
return (maxSpeed + pVehicle->AutoPilot.GetCruiseSpeed()) / 2;
}
@@ -1226,13 +1226,13 @@ void CCarCtrl::SlowCarDownForPedsSectorList(CPtrList& lst, CVehicle* pVehicle, f
if (pVehicle->GetModelIndex() == MI_RCBANDIT){
if (dotVelocity * GAME_SPEED_TO_METERS_PER_SECOND / 2 > distanceUntilHit)
pPed->SetEvasiveStep(pVehicle, 0);
- }else if (dotVelocity > 0.3f){
- if (sideLength - 0.5f < sidewaysDistance)
+ }else if (dotVelocity > 0.3f) {
+ if (sideLength + 0.1f < sidewaysDistance)
pPed->SetEvasiveStep(pVehicle, 0);
else
pPed->SetEvasiveDive(pVehicle, 0);
- }else{
- if (sideLength + 0.1f < sidewaysDistance)
+ }else if (dotVelocity > 0.1f) {
+ if (sideLength - 0.5f < sidewaysDistance)
pPed->SetEvasiveStep(pVehicle, 0);
else
pPed->SetEvasiveDive(pVehicle, 0);
@@ -1261,7 +1261,7 @@ void CCarCtrl::SlowCarDownForPedsSectorList(CPtrList& lst, CVehicle* pVehicle, f
CPlayerPed* pPlayerPed = (CPlayerPed*)pPed;
if (pPlayerPed->IsPlayer() && dotDirection < frontSafe &&
pPlayerPed->IsPedInControl() &&
- pPlayerPed->m_fMoveSpeed < 0.1f && pPlayerPed->bIsLooking &&
+ pPlayerPed->m_fMoveSpeed < 1.0f && !pPlayerPed->bIsLooking &&
CTimer::GetTimeInMilliseconds() > pPlayerPed->m_lookTimer) {
pPlayerPed->AnnoyPlayerPed(false);
pPlayerPed->SetLookFlag(pVehicle, true);
@@ -2751,10 +2751,12 @@ void CCarCtrl::SteerAICarWithPhysicsFollowPath(CVehicle* pVehicle, float* pSwerv
if (PickNextNodeAccordingStrategy(pVehicle)) {
switch (pVehicle->AutoPilot.m_nCarMission){
case MISSION_GOTOCOORDS:
+ pVehicle->AutoPilot.m_nCarMission = MISSION_GOTOCOORDS_STRAIGHT;
SteerAICarWithPhysicsHeadingForTarget(pVehicle, nil, pVehicle->AutoPilot.m_vecDestinationCoors.x,
pVehicle->AutoPilot.m_vecDestinationCoors.y, pSwerve, pAccel, pBrake, pHandbrake);
return;
case MISSION_GOTOCOORDS_ACCURATE:
+ pVehicle->AutoPilot.m_nCarMission = MISSION_GOTO_COORDS_STRAIGHT_ACCURATE;
SteerAICarWithPhysicsHeadingForTarget(pVehicle, nil, pVehicle->AutoPilot.m_vecDestinationCoors.x,
pVehicle->AutoPilot.m_vecDestinationCoors.y, pSwerve, pAccel, pBrake, pHandbrake);
return;
diff --git a/src/control/Script.cpp b/src/control/Script.cpp
index 5a1da380..4d784e4a 100644
--- a/src/control/Script.cpp
+++ b/src/control/Script.cpp
@@ -2268,7 +2268,7 @@ int8 CRunningScript::ProcessCommands100To199(int32 command)
car->AutoPilot.m_nCarMission = MISSION_GOTOCOORDS;
car->SetStatus(STATUS_PHYSICS);
car->bEngineOn = true;
- car->AutoPilot.m_nCruiseSpeed = Max(car->AutoPilot.m_nCruiseSpeed, 6);
+ car->AutoPilot.m_nCruiseSpeed = Max(1, car->AutoPilot.m_nCruiseSpeed);
car->AutoPilot.m_nAntiReverseTimer = CTimer::GetTimeInMilliseconds();
return 0;
}
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 <animation\CutsceneMgr.h>
+#include "CutsceneMgr.h"
// Game has colors inlined in code.
// For easier modification we collect them here: