Skip to content

Commit 979005c

Browse files
committed
more refactoring
1 parent 174e26a commit 979005c

18 files changed

Lines changed: 181 additions & 149 deletions

src/AiCharacterController.cpp

Lines changed: 12 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -97,17 +97,11 @@ inline const glm::ivec3& GetVectorFromMapDirection(eMapDirection direction)
9797
//////////////////////////////////////////////////////////////////////////
9898

9999
AiCharacterController::AiCharacterController(Pedestrian* character)
100+
: CharacterController(character)
100101
{
101-
mCharacter = character;
102102
mFollowNearDistance = gGameParams.mPedestrianBoundsSphereRadius * 2.0f;
103103
mFollowFarDistance = Convert::MapUnitsToMeters(0.5f);
104104
mDefaultNearDistance = gGameParams.mPedestrianBoundsSphereRadius;
105-
106-
if (mCharacter)
107-
{
108-
debug_assert(mCharacter->mController == nullptr);
109-
mCharacter->mController = this;
110-
}
111105
}
112106

113107
void AiCharacterController::DebugDraw(DebugRenderer& debugRender)
@@ -167,7 +161,7 @@ bool AiCharacterController::ScanForGunshots()
167161
return false;
168162
}
169163

170-
void AiCharacterController::UpdateFrame()
164+
void AiCharacterController::OnCharacterUpdateFrame()
171165
{
172166
// choose current activity
173167
if (mAiMode == ePedestrianAiMode_None)
@@ -271,7 +265,7 @@ void AiCharacterController::StartPanic()
271265

272266
mRunToTarget = true;
273267

274-
mCharacter->mCtlState.Clear();
268+
mCtlState.Clear();
275269
if (!ChooseWalkWaypoint(true) || !ContinueWalkToWaypoint(mDefaultNearDistance))
276270
{
277271
mAiMode = ePedestrianAiMode_Disabled; // disable ai
@@ -283,7 +277,7 @@ void AiCharacterController::StartWandering()
283277
mAiMode = ePedestrianAiMode_Wandering;
284278
mFollowPedestrian.reset();
285279

286-
mCharacter->mCtlState.Clear();
280+
mCtlState.Clear();
287281
if (!ChooseWalkWaypoint(false) || !ContinueWalkToWaypoint(mDefaultNearDistance))
288282
{
289283
StartPanic();
@@ -357,7 +351,7 @@ bool AiCharacterController::ContinueWalkToWaypoint(float distance)
357351
glm::vec2 currentPos2 = mCharacter->mTransform.GetPosition2();
358352
if (glm::distance2(currentPos2, mDestinationPoint) <= tolerance2)
359353
{
360-
mCharacter->mCtlState.Clear();
354+
mCtlState.Clear();
361355
return false;
362356
}
363357

@@ -366,8 +360,8 @@ bool AiCharacterController::ContinueWalkToWaypoint(float distance)
366360
mCharacter->SetOrientation(toTarget);
367361

368362
// set control
369-
mCharacter->mCtlState.mWalkForward = true;
370-
mCharacter->mCtlState.mRun = mRunToTarget;
363+
mCtlState.mWalkForward = true;
364+
mCtlState.mRun = mRunToTarget;
371365
return true;
372366
}
373367

@@ -376,7 +370,7 @@ void AiCharacterController::StartDrivingCar()
376370
mAiMode = ePedestrianAiMode_DrivingCar;
377371
mFollowPedestrian.reset();
378372

379-
mCharacter->mCtlState.Clear();
373+
mCtlState.Clear();
380374
if (!ChooseDriveWaypoint() || !ContinueDriveToWaypoint())
381375
{
382376
StopDriving();
@@ -388,12 +382,12 @@ void AiCharacterController::StopDriving()
388382
if (!mCharacter->IsCarDriver())
389383
return;
390384

391-
mCharacter->mCtlState.Clear();
385+
mCtlState.Clear();
392386

393387
float currentSpeed = mCharacter->mCurrentCar->GetCurrentSpeed();
394388
if (currentSpeed > gGameParams.mCarSpeedPassengerCanEnter)
395389
{
396-
mCharacter->mCtlState.mAcceleration = -1.0f;
390+
mCtlState.mAcceleration = -1.0f;
397391
}
398392
else
399393
{
@@ -458,7 +452,7 @@ void AiCharacterController::StartFollowTarget()
458452
return;
459453
}
460454

461-
mCharacter->mCtlState.Clear();
455+
mCtlState.Clear();
462456
mAiMode = ePedestrianAiMode_FollowTarget;
463457

464458
mDestinationPoint = mFollowPedestrian->mTransform.GetPosition2();
@@ -487,7 +481,7 @@ void AiCharacterController::UpdateFollowTarget()
487481
float distanceToTarget2 = glm::distance2(characterPosition2, targetPosition2);
488482
if (distanceToTarget2 < glm::pow(mFollowNearDistance, 2.0f))
489483
{
490-
mCharacter->mCtlState.Clear();
484+
mCtlState.Clear();
491485
return;
492486
}
493487

src/AiCharacterController.h

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
#include "CharacterController.h"
44
#include "Pedestrian.h"
55

6+
//////////////////////////////////////////////////////////////////////////
7+
68
enum ePedestrianAiMode
79
{
810
ePedestrianAiMode_None,
@@ -27,17 +29,20 @@ enum PedestrianAiFlags
2729
PedestrianAiFlags_LemmingBehavior = BIT(0), // can suicide
2830
PedestrianAiFlags_FollowHumanCharacter = BIT(1),
2931
};
32+
3033
decl_enum_as_flags(PedestrianAiFlags);
3134

35+
//////////////////////////////////////////////////////////////////////////
36+
3237
// defines ai character controller
3338
class AiCharacterController final: public CharacterController
3439
{
3540
public:
3641
AiCharacterController(Pedestrian* character);
3742

3843
// process controller logic
39-
void UpdateFrame() override;
4044
void DebugDraw(DebugRenderer& debugRender) override;
45+
void OnCharacterUpdateFrame() override;
4146

4247
void EnableAiFlags(PedestrianAiFlags aiFlags);
4348
void DisableAiFlags(PedestrianAiFlags aiFlags);

src/AiManager.cpp

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,7 @@ void AiManager::UpdateFrame()
1616
for (size_t iController = 0, Count = mCharacterControllers.size(); iController < Count; ++iController)
1717
{
1818
AiCharacterController* currController = mCharacterControllers[iController];
19-
if (currController->IsControllerActive())
20-
{
21-
currController->UpdateFrame();
22-
}
23-
else
19+
if (!currController->IsControllerActive())
2420
{
2521
SafeDelete(mCharacterControllers[iController]);
2622
hasInactiveControllers = true;

src/AudioManager.cpp

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,14 @@ AudioManager gAudioManager;
1212

1313
CvarEnum<eGameMusicMode> gCvarGameMusicMode("g_musicMode", eGameMusicMode_Radio, "Game music mode", CvarFlags_Archive);
1414

15+
CvarInt gCvarMusicVolume("g_musicVolume", 3, "Game music volume in range 0-7", CvarFlags_Archive | CvarFlags_RequiresAppRestart);
16+
CvarInt gCvarSoundsVolume("g_soundsVolume", 3, "Audio effects volume in range 0-7", CvarFlags_Archive | CvarFlags_RequiresAppRestart);
17+
1518
//////////////////////////////////////////////////////////////////////////
1619

1720
bool AudioManager::Initialize()
1821
{
22+
InitSoundsAndMusicGainValue();
1923
if (!PrepareAudioResources())
2024
{
2125
gConsole.LogMessage(eLogMessage_Warning, "Cannot allocate audio resources");
@@ -141,8 +145,7 @@ bool AudioManager::PrepareAudioResources()
141145

142146
if (mMusicAudioSource)
143147
{
144-
// todo: move to settings
145-
mMusicAudioSource->SetGain(0.3f);
148+
mMusicAudioSource->SetGain(mMusicGain);
146149
}
147150

148151
// allocate music sample buffers
@@ -477,3 +480,25 @@ bool AudioManager::QueueMusicSampleBuffers()
477480

478481
return totalSamplesProcessed > 0;
479482
}
483+
484+
void AudioManager::InitSoundsAndMusicGainValue()
485+
{
486+
int musicVolume = glm::clamp(gCvarMusicVolume.mValue, AudioMinVolume, AudioMaxVolume);
487+
if (gCvarMusicVolume.mValue != musicVolume)
488+
{
489+
gConsole.LogMessage(eLogMessage_Warning, "Music volume is '%d', must be in range [%d-%d]", gCvarMusicVolume.mValue, AudioMinVolume, AudioMaxVolume);
490+
gCvarMusicVolume.mValue = musicVolume;
491+
gCvarMusicVolume.ClearModified();
492+
}
493+
494+
int soundsVolume = glm::clamp(gCvarSoundsVolume.mValue, AudioMinVolume, AudioMaxVolume);
495+
if (gCvarSoundsVolume.mValue != soundsVolume)
496+
{
497+
gConsole.LogMessage(eLogMessage_Warning, "Sounds volume is '%d', must be in range [%d-%d]", gCvarSoundsVolume.mValue, AudioMinVolume, AudioMaxVolume);
498+
gCvarSoundsVolume.mValue = soundsVolume;
499+
gCvarSoundsVolume.ClearModified();
500+
}
501+
502+
mMusicGain = (1.0f * musicVolume) / (1.0f * AudioMaxVolume);
503+
mSoundsGain = (1.0f * soundsVolume) / (1.0f * AudioMaxVolume);
504+
}

src/AudioManager.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ class AudioManager final: public cxx::noncopyable
4444
private:
4545
AudioSource* GetFreeAudioSource() const;
4646

47+
void InitSoundsAndMusicGainValue();
4748
bool PrepareAudioResources();
4849
void ShutdownAudioResources();
4950

@@ -90,6 +91,9 @@ class AudioManager final: public cxx::noncopyable
9091

9192
unsigned char mMusicSampleData[MusicSampleBufferSize];
9293

94+
float mMusicGain = 1.0f;
95+
float mSoundsGain = 1.0f;
96+
9397
// object pools
9498
cxx::object_pool<SfxEmitter> mEmittersPool;
9599
};

src/CarnageGame.cpp

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -142,15 +142,6 @@ void CarnageGame::UpdateFrame()
142142
gGameObjectsManager.UpdateFrame();
143143
gWeatherManager.UpdateFrame();
144144
gParticleManager.UpdateFrame();
145-
146-
for (int ihuman = 0; ihuman < GAME_MAX_PLAYERS; ++ihuman)
147-
{
148-
if (mHumanPlayers[ihuman] == nullptr)
149-
continue;
150-
151-
mHumanPlayers[ihuman]->UpdateFrame();
152-
}
153-
154145
gTrafficManager.UpdateFrame();
155146
gAiManager.UpdateFrame();
156147
gBroadcastEvents.UpdateFrame();

src/CharacterController.cpp

Lines changed: 28 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,36 @@
44
#include "Vehicle.h"
55
#include "DebugRenderer.h"
66

7+
CharacterController::CharacterController(Pedestrian* character)
8+
{
9+
AssignCharacter(character);
10+
}
11+
712
CharacterController::~CharacterController()
813
{
9-
DeactivateController();
14+
AssignCharacter(nullptr);
1015
}
1116

12-
void CharacterController::UpdateFrame()
17+
void CharacterController::AssignCharacter(Pedestrian* character)
18+
{
19+
if (mCharacter == character)
20+
return;
21+
22+
if (mCharacter)
23+
{
24+
debug_assert(mCharacter->mController == this);
25+
mCharacter->mController = nullptr;
26+
}
27+
mCharacter = character;
28+
if (mCharacter)
29+
{
30+
debug_assert(mCharacter->mController == nullptr);
31+
mCharacter->mController = this;
32+
}
33+
mCtlState.Clear();
34+
}
35+
36+
void CharacterController::OnCharacterUpdateFrame()
1337
{
1438
// do nothing
1539
}
@@ -24,26 +48,12 @@ bool CharacterController::IsHumanPlayer() const
2448
return false;
2549
}
2650

27-
void CharacterController::DeactivateController()
51+
void CharacterController::OnCharacterChangeState(ePedestrianState prevState, ePedestrianState newState)
2852
{
29-
if (mCharacter)
30-
{
31-
debug_assert(mCharacter->mController == this);
32-
mCharacter->mController = nullptr;
33-
mCharacter->mCtlState.Clear();
34-
mCharacter = nullptr;
35-
}
53+
// do nothing
3654
}
3755

3856
bool CharacterController::IsControllerActive() const
3957
{
4058
return mCharacter != nullptr;
41-
}
42-
43-
void CharacterController::OnCharacterStartCarDrive()
44-
{
45-
}
46-
47-
void CharacterController::OnCharacterStopCarDrive()
48-
{
4959
}

src/CharacterController.h

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -11,24 +11,22 @@ class CharacterController: public cxx::noncopyable
1111
public:
1212
// readonly
1313
Pedestrian* mCharacter = nullptr; // controllable character
14+
PedestrianCtlState mCtlState;
1415

1516
public:
16-
CharacterController() = default;
17+
CharacterController(Pedestrian* character);
1718
virtual ~CharacterController();
1819

20+
void AssignCharacter(Pedestrian* character);
21+
bool IsControllerActive() const;
22+
1923
// Process controller logic
20-
virtual void UpdateFrame();
2124
virtual void DebugDraw(DebugRenderer& debugRender);
2225

2326
// Whether character is under human player control
2427
virtual bool IsHumanPlayer() const;
2528

26-
// Inactive ai controllers will be automatically destroyed on next frame
27-
virtual void DeactivateController();
28-
29-
bool IsControllerActive() const;
30-
31-
// Process character events
32-
virtual void OnCharacterStartCarDrive();
33-
virtual void OnCharacterStopCarDrive();
29+
// Events
30+
virtual void OnCharacterUpdateFrame();
31+
virtual void OnCharacterChangeState(ePedestrianState prevState, ePedestrianState newState);
3432
};

src/GameCheatsWindow.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -62,9 +62,10 @@ void GameCheatsWindow::DoUI(ImGuiIO& imguiContext)
6262
{
6363
Pedestrian* character = gTrafficManager.GenerateRandomTrafficPedestrian(characterLogPos.x, characterLogPos.y, characterLogPos.z);
6464
debug_assert(character);
65-
if (character)
65+
if (character && character->mController)
6666
{
67-
character->mController->DeactivateController();
67+
// disable controller
68+
character->mController->AssignCharacter(nullptr);
6869
}
6970
}
7071
if (ImGui::MenuItem("Wandering"))

0 commit comments

Comments
 (0)