Implement MI_BEACHBALL behaviours

This commit is contained in:
Walied K. Yassen 2020-11-29 09:14:15 +02:00
parent afe70003f4
commit a1ab82b188
No account linked to committer's email address
2 changed files with 54 additions and 4 deletions

View file

@ -159,6 +159,11 @@ public:
static int32 GetRandomNumberInRange(int32 low, int32 high)
{ return low + (high - low)*(GetRandomNumber()/float(MYRAND_MAX + 1)); }
// Returns inclusive value in the specified range
static int32 GetRandomNumberInRangeInc(int32 low, int32 high)
{ return GetRandomNumberInRange(low - 1, high + 1); }
static void SetRandomSeed(int32 seed)
{ mysrand(seed); }
};

View file

@ -14,6 +14,8 @@
#include "soundlist.h"
#include "WaterLevel.h"
#include "Timecycle.h"
#include "Stats.h"
#include "SpecialFX.h"
int16 CObject::nNoTempObjects;
//int16 CObject::nBodyCastHealth = 1000;
@ -123,6 +125,49 @@ CObject::ProcessControl(void)
float fScalarTimed = Pow(fScalar, CTimer::GetTimeStep());
m_vecMoveSpeed *= fScalarTimed;
}
if (mi == MI_BEACHBALL) {
constexpr uint8 BEACHBALL_MAX_SCORE = 250;
constexpr float BEACHBALL_DEACCELERATION = 2.5f;
float fMoveSpeedMag = m_vecMoveSpeed.Magnitude2D();
float fTimeScale = powf(0.95, CTimer::GetTimeStep());
m_vecMoveSpeed.x *= fTimeScale;
m_vecMoveSpeed.y *= fTimeScale;
m_vecMoveSpeed.z += fMoveSpeedMag - m_vecMoveSpeed.Magnitude2D();
if (!FindPlayerVehicle()) {
CVector distance = FindPlayerCoors() - GetPosition();
float distanceMagnitude = distance.Magnitude2D();
if (distance.z > 0.0 && distance.z < 1.5f && distanceMagnitude < 1.0) {
CVector playerSpeed = FindPlayerSpeed();
if (fMoveSpeedMag < 0.05 && playerSpeed.Magnitude() > 0.1) {
playerSpeed.z = 0.0f;
playerSpeed.Normalise();
playerSpeed.z = 0.3;
m_vecMoveSpeed = CVector(playerSpeed.x / BEACHBALL_DEACCELERATION, playerSpeed.y / BEACHBALL_DEACCELERATION, 1.0f / BEACHBALL_DEACCELERATION * 0.3);
PlayOneShotScriptObject(SCRIPT_SOUND_HIT_BALL, GetPosition());
if (m_nBeachballBounces > 0) {
m_nBeachballBounces++;
sprintf(gString, "%d", m_nBeachballBounces);
CMoneyMessages::RegisterOne(GetPosition(), gString, 255, 50, 0, 0.6f, 0.5f);
CStats::RegisterHighestScore(3, m_nBeachballBounces);
}
}
}
if (distance.z > -1.05 && distance.z < -0.6 && distanceMagnitude < 0.9 && m_vecMoveSpeed.z < 0.0f) {
m_vecMoveSpeed.x += CGeneral::GetRandomNumberInRangeInc(-3, 4) / 100.0;
m_vecMoveSpeed.y += CGeneral::GetRandomNumberInRangeInc(-3, 4) / 100.0;
m_vecMoveSpeed.z = Max(m_vecMoveSpeed.z + 0.3f, 0.2f);
PlayOneShotScriptObject(SCRIPT_SOUND_HIT_BALL, GetPosition());
m_vecTurnSpeed.x += CGeneral::GetRandomNumberInRangeInc(-7, 8) / 10.0f;
m_vecTurnSpeed.y += CGeneral::GetRandomNumberInRangeInc(-7, 8) / 10.0f;
if (++m_nBeachballBounces >= BEACHBALL_MAX_SCORE) {
m_nBeachballBounces = BEACHBALL_MAX_SCORE;
}
sprintf(gString, "%d", m_nBeachballBounces);
CMoneyMessages::RegisterOne(GetPosition(), gString, 255, 50, 0, 0.6f, 0.5f);
CStats::RegisterHighestScore(3, m_nBeachballBounces);
}
}
}
}
void