diff --git a/src/code_80005FD0.c b/src/code_80005FD0.c index e0b162a1b..21e0a25bb 100644 --- a/src/code_80005FD0.c +++ b/src/code_80005FD0.c @@ -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; diff --git a/src/code_80005FD0.h b/src/code_80005FD0.h index 905381065..68deca13f 100644 --- a/src/code_80005FD0.h +++ b/src/code_80005FD0.h @@ -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[]; diff --git a/src/engine/Actor.cpp b/src/engine/Actor.cpp index a9572611f..f81f86e87 100644 --- a/src/engine/Actor.cpp +++ b/src/engine/Actor.cpp @@ -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; diff --git a/src/engine/Actor.h b/src/engine/Actor.h index 9d2e8b119..605c5e9db 100644 --- a/src/engine/Actor.h +++ b/src/engine/Actor.h @@ -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); diff --git a/src/engine/World.cpp b/src/engine/World.cpp index b35a39d91..ad693b351 100644 --- a/src/engine/World.cpp +++ b/src/engine/World.cpp @@ -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(name, pos, rot, scale, model, collision)); auto* actor = StaticMeshActors.back().get(); diff --git a/src/engine/World.h b/src/engine/World.h index e65c69539..68240dd8c 100644 --- a/src/engine/World.h +++ b/src/engine/World.h @@ -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> Cameras; std::vector> StaticMeshActors; - std::vector> Actors; + std::deque> Actors; std::deque> Objects; std::vector> Emitters; diff --git a/src/engine/objects/BombKart.cpp b/src/engine/objects/BombKart.cpp index 9e7d7469e..cb4768bb9 100644 --- a/src/engine/objects/BombKart.cpp +++ b/src/engine/objects/BombKart.cpp @@ -55,7 +55,7 @@ OBombKart::OBombKart(const SpawnParams& params) : OObject(params) { } Behaviour = static_cast(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); diff --git a/src/engine/objects/BombKart.h b/src/engine/objects/BombKart.h index 14962c405..5fe905429 100644 --- a/src/engine/objects/BombKart.h +++ b/src/engine/objects/BombKart.h @@ -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(AddObjectToWorld(params)); } diff --git a/src/engine/tracks/DKJungle.cpp b/src/engine/tracks/DKJungle.cpp index 2cf83332b..f9efd49fc 100644 --- a/src/engine/tracks/DKJungle.cpp +++ b/src/engine/tracks/DKJungle.cpp @@ -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((0.6666666f)/4, 0, 0, ABoat::SpawnMode::POINT); + SpawnActor(1.6666666f, 0, 0, ABoat::SpawnMode::POINT); if (gModeSelection == VERSUS) { SpawnActor(0, 50, 3, 0.8333333f); diff --git a/src/engine/tracks/KalimariDesert.cpp b/src/engine/tracks/KalimariDesert.cpp index 2d226636c..6ccfa1645 100644 --- a/src/engine/tracks/KalimariDesert.cpp +++ b/src/engine/tracks/KalimariDesert.cpp @@ -199,7 +199,7 @@ void KalimariDesert::BeginPlay() { } } - SpawnActor(_tender, _numCarriages, 2.5f, 0, waypoint, ATrain::SpawnMode::POINT); + SpawnActor(_tender, _numCarriages, 5.0f, 0, waypoint, ATrain::SpawnMode::POINT); } if (gModeSelection == VERSUS) { diff --git a/src/engine/tracks/ToadsTurnpike.cpp b/src/engine/tracks/ToadsTurnpike.cpp index c64eacb0f..395292741 100644 --- a/src/engine/tracks/ToadsTurnpike.cpp +++ b/src/engine/tracks/ToadsTurnpike.cpp @@ -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); diff --git a/src/engine/vehicles/Boat.cpp b/src/engine/vehicles/Boat.cpp index b0507c8c6..91c8bfce3 100644 --- a/src/engine/vehicles/Boat.cpp +++ b/src/engine/vehicles/Boat.cpp @@ -87,7 +87,7 @@ bool ABoat::IsMod() { return true; } -void ABoat::Tick() { +void ABoat::Tick60fps() { TrackPathPoint* waypoint; struct Actor* paddleBoatActor; f32 temp_f26; diff --git a/src/engine/vehicles/Boat.h b/src/engine/vehicles/Boat.h index f660e8f77..bd2e90632 100644 --- a/src/engine/vehicles/Boat.h +++ b/src/engine/vehicles/Boat.h @@ -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); diff --git a/src/engine/vehicles/Bus.cpp b/src/engine/vehicles/Bus.cpp index 4c4d07cd9..1d993d2cb 100644 --- a/src/engine/vehicles/Bus.cpp +++ b/src/engine/vehicles/Bus.cpp @@ -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; diff --git a/src/engine/vehicles/Bus.h b/src/engine/vehicles/Bus.h index 7645b8a43..4d746ad47 100644 --- a/src/engine/vehicles/Bus.h +++ b/src/engine/vehicles/Bus.h @@ -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; diff --git a/src/engine/vehicles/Car.cpp b/src/engine/vehicles/Car.cpp index 7d6fbd136..29623fe72 100644 --- a/src/engine/vehicles/Car.cpp +++ b/src/engine/vehicles/Car.cpp @@ -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; diff --git a/src/engine/vehicles/Car.h b/src/engine/vehicles/Car.h index 57a8dc999..1f3d9583f 100644 --- a/src/engine/vehicles/Car.h +++ b/src/engine/vehicles/Car.h @@ -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; diff --git a/src/engine/vehicles/TankerTruck.cpp b/src/engine/vehicles/TankerTruck.cpp index 8fefdcc77..812989e12 100644 --- a/src/engine/vehicles/TankerTruck.cpp +++ b/src/engine/vehicles/TankerTruck.cpp @@ -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; diff --git a/src/engine/vehicles/TankerTruck.h b/src/engine/vehicles/TankerTruck.h index 711ca89a5..bb86f37f9 100644 --- a/src/engine/vehicles/TankerTruck.h +++ b/src/engine/vehicles/TankerTruck.h @@ -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; diff --git a/src/engine/vehicles/Train.cpp b/src/engine/vehicles/Train.cpp index 8d985dd8e..97d173646 100644 --- a/src/engine/vehicles/Train.cpp +++ b/src/engine/vehicles/Train.cpp @@ -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; diff --git a/src/engine/vehicles/Train.h b/src/engine/vehicles/Train.h index 487d294c4..30f545fc3 100644 --- a/src/engine/vehicles/Train.h +++ b/src/engine/vehicles/Train.h @@ -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; diff --git a/src/engine/vehicles/Truck.cpp b/src/engine/vehicles/Truck.cpp index f3d9712d2..a08865332 100644 --- a/src/engine/vehicles/Truck.cpp +++ b/src/engine/vehicles/Truck.cpp @@ -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; diff --git a/src/engine/vehicles/Truck.h b/src/engine/vehicles/Truck.h index 0529a87e8..e5aa3bd87 100644 --- a/src/engine/vehicles/Truck.h +++ b/src/engine/vehicles/Truck.h @@ -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; diff --git a/src/main.c b/src/main.c index c21e8cfcd..8d477e4f9 100644 --- a/src/main.c +++ b/src/main.c @@ -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(); diff --git a/src/main.h b/src/main.h index 7bbfbfed1..c3a0a1236 100644 --- a/src/main.h +++ b/src/main.h @@ -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 diff --git a/src/port/Game.cpp b/src/port/Game.cpp index 375bca787..19a41f631 100644 --- a/src/port/Game.cpp +++ b/src/port/Game.cpp @@ -95,7 +95,6 @@ void CustomEngineInit() { // This also turns off freecam gEditor.Disable(); - gSky = std::make_unique(); RegisterTracks(gTrackRegistry); gTrackBrowser = std::make_unique(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) { diff --git a/src/port/Game.h b/src/port/Game.h index edd1902d8..8aa8d47c1 100644 --- a/src/port/Game.h +++ b/src/port/Game.h @@ -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);