mirror of
https://github.com/HarbourMasters/SpaghettiKart
synced 2026-08-25 08:14:47 -04:00
Fix Vehicle Speeds (#740)
* Init * Update vehicle tick * fix tick * Update BombKart.cpp * Update BombKart.h * Update World.h
This commit is contained in:
+2
-3
@@ -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;
|
||||
|
||||
@@ -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[];
|
||||
|
||||
@@ -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
@@ -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);
|
||||
|
||||
@@ -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
@@ -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;
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -87,7 +87,7 @@ bool ABoat::IsMod() {
|
||||
return true;
|
||||
}
|
||||
|
||||
void ABoat::Tick() {
|
||||
void ABoat::Tick60fps() {
|
||||
TrackPathPoint* waypoint;
|
||||
struct Actor* paddleBoatActor;
|
||||
f32 temp_f26;
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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
@@ -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) {
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user