Fix Vehicle Speeds (#740)

* Init

* Update vehicle tick

* fix tick

* Update BombKart.cpp

* Update BombKart.h

* Update World.h
This commit is contained in:
MegaMech
2026-08-11 21:09:26 -06:00
committed by GitHub
parent cf3bcb52f8
commit 03f0792356
27 changed files with 46 additions and 28 deletions
+2 -3
View File
@@ -118,7 +118,6 @@ u16 D_8016334C[8]; // Increased from 2 to 8 to prevent array overflow.
u16 gSpeedCPUBehaviour[12];
s32 D_80163368[4];
s32 gIncrementUpdatePlayer;
s32 D_8016337C;
s16 gCurrentPlayerLookAhead[12];
s16 D_80163398[12];
s16 D_801633B0[12];
@@ -1556,7 +1555,7 @@ void update_player_path_completion(s32 playerId, Player* player) {
void update_vehicles(void) {
s32 i;
generate_player_smoke();
D_8016337C++;
// D_8016337C++;
// CM_TickBombKarts();
// CM_VehiclesTick();
@@ -3623,7 +3622,7 @@ void init_players(void) {
D_8016435C = 1;
gBestRankedHumanPlayer = 0;
gIncrementUpdatePlayer = 0;
D_8016337C = 0;
gTickCounter = 0; // Originally D_8016337C = 0;
gPathStartZ = (f32) gTrackPaths[0][0].z; // [i][2]
D_801634F0 = 0;
D_801634F4 = 0;
-1
View File
@@ -349,7 +349,6 @@ extern u16 gSpeedCPUBehaviour[];
enum { SPEED_CPU_BEHAVIOUR_NORMAL, SPEED_CPU_BEHAVIOUR_FAST, SPEED_CPU_BEHAVIOUR_SLOW, SPEED_CPU_BEHAVIOUR_MAX };
extern s32 gIncrementUpdatePlayer;
extern s32 D_8016337C;
extern s16 gCurrentPlayerLookAhead[];
extern s16 D_80163398[];
extern s16 D_801633B0[];
+1
View File
@@ -33,6 +33,7 @@ void AActor::BeginPlay() {
// Virtual functions to be overridden by derived classes
void AActor::Tick() { }
void AActor::Tick60fps() { }
void AActor::Draw(Camera *camera) {
if (Model) {
Mat4 mtx;
+2 -1
View File
@@ -52,7 +52,8 @@ public:
*/
virtual void SetSpawnParams(SpawnParams& params);
virtual void BeginPlay();
virtual void Tick();
virtual void Tick(); // Ticks twice per frame (faster simulation speed)
virtual void Tick60fps(); // Ticks once per frame
virtual void Draw(Camera* camera);
virtual void Collision(Player* player, AActor* actor);
virtual void VehicleCollision(s32 playerId, Player* player);
+9 -1
View File
@@ -160,12 +160,20 @@ AActor* World::GetActor(size_t index) {
void World::TickActors() {
// This only ticks modded actors
for (auto& actor : Actors) {
if (actor->IsMod()) {
if (actor->IsMod()) { // Do not tick unported C actors
actor->Tick();
}
}
}
void World::TickActors60fps() {
for (auto& actor: Actors) {
if (actor->IsMod()) {
actor->Tick60fps();
}
}
}
StaticMeshActor* World::AddStaticMeshActor(const std::string& name, FVector pos, IRotator rot, FVector scale, const std::string& model, int32_t* collision) {
StaticMeshActors.push_back(std::make_unique<StaticMeshActor>(name, pos, rot, scale, model, collision));
auto* actor = StaticMeshActors.back().get();
+2 -1
View File
@@ -72,6 +72,7 @@ public:
AActor* GetActor(size_t index);
void TickActors();
void TickActors60fps();
AActor* ConvertActorToAActor(Actor* actor);
Actor* ConvertAActorToActor(AActor* actor);
@@ -120,7 +121,7 @@ public:
std::vector<std::unique_ptr<GameCamera>> Cameras;
std::vector<std::unique_ptr<StaticMeshActor>> StaticMeshActors;
std::vector<std::unique_ptr<AActor>> Actors;
std::deque<std::unique_ptr<AActor>> Actors;
std::deque<std::unique_ptr<OObject>> Objects;
std::vector<std::unique_ptr<ParticleEmitter>> Emitters;
+1 -1
View File
@@ -55,7 +55,7 @@ OBombKart::OBombKart(const SpawnParams& params) : OObject(params) {
}
Behaviour = static_cast<OBombKart::States>(params.Behaviour.value_or(OBombKart::States::COUNTERCLOCKWISE));
SpeedB = params.SpeedB.value_or(2.7f); // Chase speed
SpeedB = params.SpeedB.value_or(7.0f); // Chase speed
WaypointIndex = params.PathPoint.value_or(0);
Unk_3C = params.Speed.value_or(0);
+1 -1
View File
@@ -52,7 +52,7 @@ class OBombKart : public OObject {
.Behaviour = behaviour,
.Location = pos,
.Speed = unk_3C, // Only used for podium ceremony. Arbitrarily chose Speed for this
.SpeedB = 2.7f, // Chase speed
.SpeedB = 7.0f, // Chase speed
};
return dynamic_cast<OBombKart*>(AddObjectToWorld<OBombKart>(params));
}
+1 -3
View File
@@ -174,9 +174,7 @@ void DKJungle::BeginPlay() {
generate_ferry_path();
// The original game only ran vehicle logic every second frame.
// Thus the speed gets divided by two to set speed to match properly
SpawnActor<ABoat>((0.6666666f)/4, 0, 0, ABoat::SpawnMode::POINT);
SpawnActor<ABoat>(1.6666666f, 0, 0, ABoat::SpawnMode::POINT);
if (gModeSelection == VERSUS) {
SpawnActor<OBombKart>(0, 50, 3, 0.8333333f);
+1 -1
View File
@@ -199,7 +199,7 @@ void KalimariDesert::BeginPlay() {
}
}
SpawnActor<ATrain>(_tender, _numCarriages, 2.5f, 0, waypoint, ATrain::SpawnMode::POINT);
SpawnActor<ATrain>(_tender, _numCarriages, 5.0f, 0, waypoint, ATrain::SpawnMode::POINT);
}
if (gModeSelection == VERSUS) {
-2
View File
@@ -152,8 +152,6 @@ void ToadsTurnpike::BeginPlay() {
uint32_t pathPoint;
f32 a = ((gCCSelection * 90.0) / 216.0f) + 4.583333333333333;
f32 b = ((gCCSelection * 90.0) / 216.0f) + 2.9166666666666665;
a /= 2; // Normally vehicle logic is only ran every 2 frames. This slows the vehicles down to match.
b /= 2;
_numTrucks = CVarGetInteger("gNumTrucks", 7);
_numBuses = CVarGetInteger("gNumBuses", 7);
+1 -1
View File
@@ -87,7 +87,7 @@ bool ABoat::IsMod() {
return true;
}
void ABoat::Tick() {
void ABoat::Tick60fps() {
TrackPathPoint* waypoint;
struct Actor* paddleBoatActor;
f32 temp_f26;
+1 -1
View File
@@ -64,7 +64,7 @@ class ABoat : public AActor {
uint32_t PathPoint = 0;
virtual void SetSpawnParams(SpawnParams& params) override;
virtual void Tick() override;
virtual void Tick60fps() override;
virtual void Draw(Camera* camera) override;
virtual void VehicleCollision(s32 playerId, Player* player) override;
virtual s32 AddSmoke(size_t, Vec3f, f32);
+1 -1
View File
@@ -115,7 +115,7 @@ void ABus::Draw(Camera* camera) {
}
}
void ABus::Tick() {
void ABus::Tick60fps() {
f32 temp_f0_2;
f32 temp_f0_3;
f32 sp5C;
+1 -1
View File
@@ -63,7 +63,7 @@ class ABus : public AActor {
uint32_t PathPoint = 0;
virtual void SetSpawnParams(SpawnParams& params) override;
virtual void Tick() override;
virtual void Tick60fps() override;
virtual void Draw(Camera* camera) override;
virtual void VehicleCollision(s32 playerId, Player* player) override;
virtual bool IsMod() override;
+1 -1
View File
@@ -97,7 +97,7 @@ bool ACar::IsMod() {
return true;
}
void ACar::Tick() {
void ACar::Tick60fps() {
f32 temp_f0_2;
f32 temp_f0_3;
f32 sp5C;
+1 -1
View File
@@ -63,7 +63,7 @@ class ACar : public AActor {
uint32_t PathPoint = 0;
virtual void SetSpawnParams(SpawnParams& params) override;
virtual void Tick() override;
virtual void Tick60fps() override;
virtual void Draw(Camera*) override;
virtual void VehicleCollision(s32 playerId, Player* player) override;
virtual bool IsMod() override;
+1 -1
View File
@@ -115,7 +115,7 @@ void ATankerTruck::Draw(Camera* camera) {
}
}
void ATankerTruck::Tick() {
void ATankerTruck::Tick60fps() {
f32 temp_f0_2;
f32 temp_f0_3;
f32 sp5C;
+1 -1
View File
@@ -63,7 +63,7 @@ class ATankerTruck : public AActor {
uint32_t PathPoint = 0;
virtual void SetSpawnParams(SpawnParams& params) override;
virtual void Tick() override;
virtual void Tick60fps() override;
virtual void Draw(Camera* camera) override;
virtual void VehicleCollision(s32 playerId, Player* player) override;
virtual bool IsMod() override;
+1 -1
View File
@@ -182,7 +182,7 @@ void ATrain::SyncComponents(TrainCarStuff* trainCar, s16 orientationY) {
trainCarActor->velocity[2] = trainCar->velocity[2];
}
void ATrain::Tick() {
void ATrain::Tick60fps() {
TrainCarStuff* car;
u16 oldWaypointIndex;
s16 orientationYUpdate;
+1 -1
View File
@@ -74,7 +74,7 @@ class ATrain : public AActor {
}
virtual void SetSpawnParams(SpawnParams& params);
virtual void Tick() override;
virtual void Tick60fps() override;
virtual void Draw(Camera* camera) override;
virtual void VehicleCollision(s32 playerId, Player* player) override;
virtual bool IsMod() override;
+1 -1
View File
@@ -115,7 +115,7 @@ void ATruck::Draw(Camera* camera) {
}
}
void ATruck::Tick() {
void ATruck::Tick60fps() {
f32 temp_f0_2;
f32 temp_f0_3;
f32 sp5C;
+1 -1
View File
@@ -63,7 +63,7 @@ class ATruck : public AActor {
}
virtual void SetSpawnParams(SpawnParams& params) override;
virtual void Tick() override;
virtual void Tick60fps() override;
virtual void Draw(Camera* camera) override;
virtual void VehicleCollision(s32 playerId, Player* player) override;
virtual bool IsMod() override;
+5
View File
@@ -194,6 +194,7 @@ s16 sNumVBlanks = 0;
UNUSED s16 D_800DC590 = 0;
f32 gVBlankTimer = 0.0f;
f32 gCourseTimer = 0.0f;
uint64_t gTickCounter;
void create_thread(OSThread* thread, OSId id, void (*entry)(void*), void* arg, void* sp, OSPri pri) {
thread->next = NULL;
@@ -663,6 +664,7 @@ void display_debug_info(void) {
}
void process_game_tick(void) {
gTickCounter += 1;
if (Editor_IsPaused() == false) {
if (D_8015011E) {
@@ -686,6 +688,9 @@ void process_game_tick(void) {
func_80059AC8();
update_course_actors();
CM_TickActors();
if (gTickCounter & 1) { // Only run once per game loop
CM_TickActors60fps();
}
CM_TickTrack();
if (CM_IsTourEnabled() == false) {
func_8028FCBC();
+1
View File
@@ -225,6 +225,7 @@ extern s32 D_800DC56C[];
extern s16 sNumVBlanks;
extern f32 gVBlankTimer;
extern f32 gCourseTimer;
extern uint64_t gTickCounter;
// end of definition of main.c variables
+6 -1
View File
@@ -95,7 +95,6 @@ void CustomEngineInit() {
// This also turns off freecam
gEditor.Disable();
gSky = std::make_unique<Sky>();
RegisterTracks(gTrackRegistry);
gTrackBrowser = std::make_unique<TrackBrowser>(gTrackRegistry);
@@ -344,6 +343,12 @@ void CM_TickActors() {
}
}
void CM_TickActors60fps() {
if (GetWorld()->GetTrack()) {
GetWorld()->TickActors60fps();
}
}
void CM_DrawActors(Camera* camera) {
//AActor* a = GetWorld()->ConvertActorToAActor(actor);
for (const auto& actor : GetWorld()->Actors) {
+2
View File
@@ -145,6 +145,8 @@ void CM_VehicleCollision(s32 playerId, Player* player);
void CM_TickActors();
void CM_TickActors60fps();
void CM_DrawBombKarts(s32 cameraId);
void SetMarioRaceway(void);