diff options
Diffstat (limited to 'src/engine')
78 files changed, 620 insertions, 798 deletions
diff --git a/src/engine/Actor.cpp b/src/engine/Actor.cpp index 8bd472b08..be86d2a5f 100644 --- a/src/engine/Actor.cpp +++ b/src/engine/Actor.cpp @@ -8,6 +8,7 @@ AActor::AActor() {} void AActor::Tick() { } void AActor::Draw(Camera *camera) { } void AActor::Collision(Player* player, AActor* actor) {} +void AActor::VehicleCollision(s32 playerId, Player* player){} void AActor::Destroy() { // Set uuid to zero. memset(uuid, 0, sizeof(uuid)); diff --git a/src/engine/Actor.h b/src/engine/Actor.h index 88f5b34a0..a74ed74e0 100644 --- a/src/engine/Actor.h +++ b/src/engine/Actor.h @@ -32,6 +32,8 @@ public: virtual void Tick(); virtual void Draw(Camera*); virtual void Collision(Player* player, AActor* actor); + virtual void VehicleCollision(s32 playerId, Player* player); + virtual void Destroy(); virtual bool IsMod(); }; diff --git a/src/engine/CoreMath.h b/src/engine/CoreMath.h index c5f3211f4..ea74dd9a4 100644 --- a/src/engine/CoreMath.h +++ b/src/engine/CoreMath.h @@ -1,4 +1,5 @@ -#pragma once +#ifndef CORE_MATH_H +#define CORE_MATH_H #include <libultraship.h> @@ -13,6 +14,7 @@ struct FVector { float x, y, z; +#ifdef __cplusplus FVector& operator=(const FVector& other) { x = other.x; y = other.y; @@ -22,6 +24,7 @@ struct FVector { FVector() : x(0), y(0), z(0) {} FVector(float x, float y, float z) : x(x), y(y), z(z) {} +#endif // __cplusplus }; /** @@ -33,6 +36,7 @@ struct FVector { struct FVector2D { float x, z; +#ifdef __cplusplus FVector2D& operator=(const FVector2D& other) { x = other.x; z = other.z; @@ -41,12 +45,14 @@ struct FVector2D { FVector2D() : x(0), z(0) {} FVector2D(float x, float z) : x(x), z(z) {} +#endif // __cplusplus }; // Sets integer X Z coordinates -struct IVector2D { +typedef struct IVector2D { int32_t X, Z; +#ifdef __cplusplus IVector2D() : X(0), Z(0) {} // Default constructor IVector2D(int32_t x, int32_t z) : X(x), Z(z) {} // Constructor to initialize with values @@ -57,11 +63,13 @@ struct IVector2D { Z = other.Z; return *this; } -}; +#endif // __cplusplus +} IVector2D; struct FRotation { float pitch, yaw, roll; +#ifdef __cplusplus FRotation& operator=(const FRotation& other) { pitch = other.pitch; yaw = other.yaw; @@ -71,6 +79,7 @@ struct FRotation { FRotation() : pitch(0), yaw(0), roll(0) {} FRotation(float p, float y, float r) : pitch(p), yaw(y), roll(r) {} +#endif // __cplusplus }; /** @@ -80,6 +89,7 @@ struct FRotation { struct IPathSpan { int Start, End; +#ifdef __cplusplus // Default Constructor IPathSpan() : Start(0), End(0) {} @@ -105,4 +115,7 @@ struct IPathSpan { bool operator!=(const IPathSpan& Other) const { return !(*this == Other); } +#endif // __cplusplus }; + +#endif // CORE_MATH_H
\ No newline at end of file diff --git a/src/engine/Engine.h b/src/engine/Engine.h deleted file mode 100644 index 98e9a99fc..000000000 --- a/src/engine/Engine.h +++ /dev/null @@ -1,59 +0,0 @@ -#ifndef __ENGINE_H__ -#define __ENGINE_H__ - -#include "common_structs.h" -#include "bomb_kart.h" -#include "objects.h" -#include "path_spawn_metadata.h" -#include "waypoints.h" -#include "sounds.h" -#include "course_offsets.h" - -typedef struct { - RGB8 TopRight; - RGB8 BottomRight; - RGB8 BottomLeft; - RGB8 TopLeft; - RGB8 FloorTopRight; - RGB8 FloorBottomRight; - RGB8 FloorBottomLeft; - RGB8 FloorTopLeft; -} SkyboxColours; - -typedef struct { - int32_t X; - int32_t Z; -} IVector2D_C; - -typedef struct { - const char* Id; - const char* Name; - const char* DebugName; - const char* CourseLength; - const char* AIBehaviour; - const char* MinimapTexture; - s32 LakituTowType; - IVector2D_C MinimapDimensions; - float AIMaximumSeparation; - float AIMinimumSeparation; - float NearPersp; - float FarPersp; - s16 *SomePtr; - u32 AISteeringSensitivity; - _struct_gCoursePathSizes_0x10 PathSizes; - Vec4f D_0D009418; - Vec4f D_0D009568; - Vec4f D_0D0096B8; - Vec4f D_0D009808; - TrackWaypoint* PathTable[4]; - TrackWaypoint* PathTable2[4]; - CloudData *Clouds; - CloudData *CloudList; - s32 MinimapFinishlineX; - s32 MinimapFinishlineY; - SkyboxColours Skybox; - const course_texture *textures; - enum MusicSeq Sequence; -} CProperties; - -#endif // __ENGINE_H__
\ No newline at end of file diff --git a/src/engine/PlayerBombKart.cpp b/src/engine/PlayerBombKart.cpp new file mode 100644 index 000000000..9ab3b74e1 --- /dev/null +++ b/src/engine/PlayerBombKart.cpp @@ -0,0 +1,95 @@ +#include "PlayerBombKart.h" +#include "Matrix.h" + +extern "C" { +#include "common_structs.h" +#include "assets/common_data.h" +#include "camera.h" +#include "render_objects.h" +#include "math_util_2.h" +#include "code_80057C60.h" +#include "menus.h" +} + +void PlayerBombKart::Draw(size_t playerId, s32 cameraId) { // render_player_bomb_kart + Player* player = &gPlayerOne[playerId]; + if (state != PlayerBombKartState::DISABLED) { + pos.x = player->pos[0]; + pos.y = player->pos[1] - 2.0; + pos.z = player->pos[2]; + surfaceHeight = player->unk_074; + PlayerBombKart::func_800563DC(cameraId, _primAlpha); + PlayerBombKart::func_8005669C(_primAlpha); + PlayerBombKart::func_800568A0(cameraId); + } +} + +void PlayerBombKart::func_800563DC(s32 cameraId, s32 arg2) { + s32 temp_s0; + s32 temp_v0; + s32 residue; + Camera* camera = &camera1[cameraId]; + + residue = D_801655CC % 4U; + D_80183E40[0] = pos.x; + D_80183E40[1] = pos.y + 1.0; + D_80183E40[2] = pos.z; + D_80183E80[0] = 0; + D_80183E80[1] = func_800418AC(pos.x, pos.z, camera->pos); + D_80183E80[2] = 0x8000; + rsp_set_matrix_transformation(D_80183E40, D_80183E80, 0.2f); + gSPDisplayList(gDisplayListHead++, (Gfx*)D_0D007E98); + func_8004B310(arg2); + draw_rectangle_texture_overlap((u8*) common_tlut_bomb, (u8*)common_texture_bomb[residue], (Vtx*)D_0D005AE0, 0x00000020, + 0x00000020, 0x00000020, 0x00000020); + temp_s0 = D_8018D400; + gSPDisplayList(gDisplayListHead++, (Gfx*)D_0D007B00); + func_8004B414(0, 0, 0, arg2); + D_80183E40[1] = D_80183E40[1] + 4.0; + D_80183E80[2] = 0; + func_800562E4(temp_s0 % 3, temp_s0 % 4, arg2); + temp_v0 = temp_s0 + 1; + D_80183E80[2] = 0x6000; + func_800562E4(temp_v0 % 3, temp_v0 % 4, arg2); + temp_v0 = temp_s0 + 2; + D_80183E80[2] = 0xA000; + func_800562E4(temp_v0 % 3, temp_v0 % 4, arg2); + gSPTexture(gDisplayListHead++, 1, 1, 0, G_TX_RENDERTILE, G_OFF); +} + +void PlayerBombKart::func_8005669C(s32 arg2) { + gSPDisplayList(gDisplayListHead++, (Gfx*)D_0D0079E8); + func_8004B310(arg2); + load_texture_block_rgba16_mirror((u8*) D_0D02AA58, 0x00000010, 0x00000010); + D_80183E40[1] = pos.y - 2.0; + D_80183E40[0] = pos.x + 2.0; + D_80183E40[2] = pos.z + 2.0; + func_800431B0(D_80183E40, D_80183E80, 0.15f, (Vtx*)common_vtx_rectangle); + D_80183E40[0] = pos.x + 2.0; + D_80183E40[2] = pos.z - 2.0; + func_800431B0(D_80183E40, D_80183E80, 0.15f, (Vtx*)common_vtx_rectangle); + D_80183E40[0] = pos.x - 2.0; + D_80183E40[2] = pos.z - 2.0; + func_800431B0(D_80183E40, D_80183E80, 0.15f, (Vtx*)common_vtx_rectangle); + D_80183E40[0] = pos.x - 2.0; + D_80183E40[2] = pos.z + 2.0; + func_800431B0(D_80183E40, D_80183E80, 0.15f, (Vtx*)common_vtx_rectangle); + gSPTexture(gDisplayListHead++, 1, 1, 0, G_TX_RENDERTILE, G_OFF); +} + +void PlayerBombKart::func_800568A0(s32 cameraId) { + Mat4 mtx; + Player* player; + + player = &gPlayerOne[cameraId]; + D_80183E50[0] = pos.x; + D_80183E50[1] = surfaceHeight + 0.8; + D_80183E50[2] = pos.z; + set_transform_matrix(mtx, player->collision.orientationVector, D_80183E50, 0U, 0.5f); + // convert_to_fixed_point_matrix(&gGfxPool->mtxHud[gMatrixHudCount], mtx); + // gSPMatrix(gDisplayListHead++, VIRTUAL_TO_PHYSICAL(&gGfxPool->mtxHud[gMatrixHudCount++]), + // G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + + AddHudMatrix(mtx, G_MTX_LOAD | G_MTX_NOPUSH | G_MTX_MODELVIEW); + gSPDisplayList(gDisplayListHead++, (Gfx*)D_0D007B98); +}
\ No newline at end of file diff --git a/src/engine/PlayerBombKart.h b/src/engine/PlayerBombKart.h new file mode 100644 index 000000000..c1e58d815 --- /dev/null +++ b/src/engine/PlayerBombKart.h @@ -0,0 +1,23 @@ +#pragma once + +#include <libultraship.h> +#include "CoreMath.h" + +class PlayerBombKart { +public: + + enum PlayerBombKartState { + DISABLED, + ACTIVE, + }; + + s16 state = PlayerBombKartState::DISABLED; + FVector pos = {0, 0, 0}; + f32 surfaceHeight = 0; + s32 _primAlpha = 0; + + void Draw(size_t playerId, s32 cameraId); + void func_800563DC(s32 cameraId, s32 arg2); + void func_8005669C(s32 arg2); + void func_800568A0(s32 cameraId); +}; diff --git a/src/engine/Smoke.cpp b/src/engine/Smoke.cpp index 9841bfffb..5fb0c0c39 100644 --- a/src/engine/Smoke.cpp +++ b/src/engine/Smoke.cpp @@ -3,7 +3,6 @@ #include "Smoke.h" #include "World.h" -#include "vehicles/Vehicle.h" #include "vehicles/Train.h" #include "vehicles/Boat.h" @@ -23,8 +22,8 @@ void TrainSmokeTick() { s32 temp_a0; Object* object; - for (auto& vehicle : gWorldInstance.Vehicles) { - if (auto train = dynamic_cast<ATrain*>(vehicle)) { + for (auto& actor : gWorldInstance.Actors) { + if (auto train = dynamic_cast<ATrain*>(actor)) { if (train->SmokeTimer != 0) { train->SmokeTimer -= 1; } @@ -48,7 +47,7 @@ void TrainSmokeTick() { train->SmokeTimer = 100; } } - } else if (auto boat = dynamic_cast<ABoat*>(vehicle)) { + } else if (auto boat = dynamic_cast<ABoat*>(actor)) { if (boat->SmokeTimer != 0) { boat->SmokeTimer -= 1; } @@ -78,8 +77,9 @@ void TrainSmokeTick() { void TrainSmokeDraw(s32 cameraId) { Camera* camera = &camera1[cameraId]; - for (auto& vehicle : gWorldInstance.Vehicles) { - if (auto train = dynamic_cast<ATrain*>(vehicle)) { + + for (auto& actor : gWorldInstance.Actors) { + if (auto train = dynamic_cast<ATrain*>(actor)) { gSPDisplayList(gDisplayListHead++, (Gfx*)D_0D007AE0); load_texture_block_i8_nomirror((uint8_t*)D_0D029458, 32, 32); func_8004B72C(255, 255, 255, 255, 255, 255, 255); @@ -92,7 +92,7 @@ void TrainSmokeDraw(s32 cameraId) { render_object_train_smoke_particle(train->SmokeParticles[i], cameraId); } } - } else if (auto boat = dynamic_cast<ABoat*>(vehicle)) { + } else if (auto boat = dynamic_cast<ABoat*>(actor)) { gSPDisplayList(gDisplayListHead++, (Gfx*)D_0D007AE0); load_texture_block_i8_nomirror((uint8_t*)D_0D029458, 32, 32); diff --git a/src/engine/TrainCrossing.cpp b/src/engine/TrainCrossing.cpp index 98c7c766b..2d4442a30 100644 --- a/src/engine/TrainCrossing.cpp +++ b/src/engine/TrainCrossing.cpp @@ -1,7 +1,7 @@ #include <libultraship.h> #include "TrainCrossing.h" #include "World.h" -#include "vehicles/Vehicle.h" +#include "engine/Actor.h" #include "vehicles/Train.h" #include <memory> @@ -29,8 +29,8 @@ void TrainCrossing::CrossingTrigger() { OnTriggered = 0; - for (const auto& vehicle : gWorldInstance.Vehicles) { - if (auto train = dynamic_cast<ATrain*>(vehicle)) {; + for (const auto& actor : gWorldInstance.Actors) { + if (auto train = dynamic_cast<ATrain*>(actor)) {; f32 radius = DynamicRadius(train->Locomotive.position, train->Locomotive.velocity, Position); if (Distance(train->Locomotive.position, Position) < radius) { diff --git a/src/engine/World.cpp b/src/engine/World.cpp index 5617efd39..d67a2577c 100644 --- a/src/engine/World.cpp +++ b/src/engine/World.cpp @@ -2,7 +2,6 @@ #include "World.h" #include "Cup.h" #include "courses/Course.h" -#include "vehicles/Vehicle.h" #include "objects/BombKart.h" #include "TrainCrossing.h" #include <memory> @@ -12,7 +11,6 @@ extern "C" { #include "camera.h" #include "objects.h" #include "main.h" - #include "engine/Engine.h" #include "defines.h" #include "audio/external.h" #include "menus.h" @@ -35,26 +33,12 @@ void World::SetCourseFromCup() { CurrentCourse = CurrentCup->GetCourse(); } - -AVehicle* World::AddVehicle(AVehicle* vehicle) { - Vehicles.push_back(vehicle); - return Vehicles.back(); -} - -void World::ClearVehicles(void) { - Vehicles.clear(); -} - TrainCrossing* World::AddCrossing(Vec3f position, u32 waypointMin, u32 waypointMax, f32 approachRadius, f32 exitRadius) { auto crossing = std::make_shared<TrainCrossing>(position, waypointMin, waypointMax, approachRadius, exitRadius); Crossings.push_back(crossing); return crossing.get(); } -void World::AddBombKart(Vec3f pos, TrackWaypoint* waypoint, uint16_t waypointIndex, uint16_t state, f32 unk_3C) { - BombKarts.push_back(new OBombKart(pos, waypoint, waypointIndex, state, unk_3C)); -} - u32 World::GetCupIndex() { return this->CupIndex; } @@ -97,13 +81,6 @@ void World::SetCup(Cup* cup) { } } -CProperties* World::GetCourseProps() { - if (Courses[CourseIndex]) { - return (CProperties*) &Courses[CourseIndex]->Props; - } - return nullptr; -} - void World::SetCourse(const char* name) { //! @todo Use content dictionary instead for (size_t i = 0; i < Courses.size(); i++) { @@ -168,6 +145,7 @@ AActor* World::GetActor(size_t index) { } void World::TickActors() { + // This only ticks modded actors for (AActor* actor : Actors) { if (actor->IsMod()) { actor->Tick(); diff --git a/src/engine/World.h b/src/engine/World.h index a8e9932f5..3ba6e0437 100644 --- a/src/engine/World.h +++ b/src/engine/World.h @@ -2,12 +2,13 @@ #include <libultraship.h> #include "CoreMath.h" +#include "engine/courses/Course.h" #include "objects/Object.h" #include "Cup.h" -#include "vehicles/Vehicle.h" #include "vehicles/Train.h" #include "vehicles/Car.h" #include "objects/BombKart.h" +#include "PlayerBombKart.h" #include "vehicles/Train.h" #include "TrainCrossing.h" #include "objects/Thwomp.h" @@ -22,7 +23,6 @@ extern "C" { #include "camera.h" #include "objects.h" -#include "engine/Engine.h" }; class OObject; @@ -34,47 +34,6 @@ class TrainCrossing; class OLakitu; class World { - - typedef struct { - uint8_t r, g, b; - } RGB8; - - typedef struct { - RGB8 TopRight; - RGB8 BottomRight; - RGB8 BottomLeft; - RGB8 TopLeft; - RGB8 FloorTopRight; - RGB8 FloorBottomRight; - RGB8 FloorBottomLeft; - RGB8 FloorTopLeft; - } SkyboxColours; - - - typedef struct { - const char* Name; - const char* DebugName; - const char* CourseLength; - const char* AIBehaviour; - float AIMaximumSeparation; - float AIMinimumSeparation; - int16_t *SomePtr; - uint32_t AISteeringSensitivity; - _struct_gCoursePathSizes_0x10 PathSizes; - Vec4f D_0D009418; - Vec4f D_0D009568; - Vec4f D_0D0096B8; - Vec4f D_0D009808; - const char* PathTable[4]; - const char* PathTable2[4]; - CloudData *Clouds; - CloudData *CloudList; - int32_t MinimapFinishlineX; - int32_t MinimapFinishlineY; - SkyboxColours Skybox; - MusicSeq Sequence; - } Properties; - typedef struct { std::vector<Mtx> Hud; std::vector<Mtx> Objects; @@ -98,7 +57,6 @@ public: OObject* AddObject(OObject* object); - CProperties* GetCourseProps(); void TickObjects(); void TickObjects60fps(); void DrawObjects(s32 cameraId); @@ -136,18 +94,12 @@ public: std::vector<AActor*> Actors; std::vector<OObject*> Objects; - std::vector<AVehicle*> Vehicles; - std::vector<OBombKart*> BombKarts; std::vector<ParticleEmitter*> Emitters; std::unordered_map<s32, OLakitu*> Lakitus; - AVehicle* AddVehicle(AVehicle* vehicle); - - void ClearVehicles(void); - /** Objects **/ - void AddBombKart(Vec3f pos, TrackWaypoint* waypoint, uint16_t waypointIndex, uint16_t state, f32 unk_3C); + PlayerBombKart playerBombKart[4]; // Used in battle mode TrainCrossing* AddCrossing(Vec3f position, u32 waypointMin, u32 waypointMax, f32 approachRadius, f32 exitRadius); std::vector<std::shared_ptr<TrainCrossing>> Crossings; diff --git a/src/engine/courses/BansheeBoardwalk.cpp b/src/engine/courses/BansheeBoardwalk.cpp index 03b4a9bd2..4ff92d107 100644 --- a/src/engine/courses/BansheeBoardwalk.cpp +++ b/src/engine/courses/BansheeBoardwalk.cpp @@ -149,7 +149,7 @@ void BansheeBoardwalk::Load() { void BansheeBoardwalk::LoadTextures() { } -void BansheeBoardwalk::SpawnActors() { +void BansheeBoardwalk::BeginPlay() { gWorldInstance.AddActor(new AFinishline()); spawn_all_item_boxes((struct ActorSpawnData*)LOAD_ASSET_RAW(d_course_banshee_boardwalk_item_box_spawns)); @@ -175,19 +175,17 @@ void BansheeBoardwalk::SpawnActors() { gWorldInstance.AddObject(new OBoos(5, IPathSpan(180, 190), IPathSpan(200, 210), IPathSpan(280, 290))); gWorldInstance.AddObject(new OBoos(5, IPathSpan(490, 500), IPathSpan(510, 520), IPathSpan(620, 630))); } -} -void BansheeBoardwalk::SpawnVehicles() { if (gModeSelection == VERSUS) { Vec3f pos = {0, 0, 0}; - gWorldInstance.AddBombKart(pos, &D_80164550[0][110], 110, 3, 0.8333333f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][190], 190, 1, 0.8333333f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][250], 250, 3, 0.8333333f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][475], 475, 1, 0.8333333f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][610], 610, 3, 0.8333333f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][0], 0, 0, 0.8333333f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][0], 0, 0, 0.8333333f); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][110], 110, 3, 0.8333333f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][190], 190, 1, 0.8333333f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][250], 250, 3, 0.8333333f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][475], 475, 1, 0.8333333f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][610], 610, 3, 0.8333333f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][0], 0, 0, 0.8333333f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][0], 0, 0, 0.8333333f)); } } diff --git a/src/engine/courses/BansheeBoardwalk.h b/src/engine/courses/BansheeBoardwalk.h index 612597578..f1b98538d 100644 --- a/src/engine/courses/BansheeBoardwalk.h +++ b/src/engine/courses/BansheeBoardwalk.h @@ -26,8 +26,7 @@ public: // course_texture* textures, const char* displaylists, size_t dlSize); virtual void Load() override; virtual void LoadTextures() override; - virtual void SpawnActors() override; - virtual void SpawnVehicles() override; + virtual void BeginPlay() override; //virtual void InitClouds() override; virtual void MinimapSettings() override; virtual void InitCourseObjects() override; diff --git a/src/engine/courses/BigDonut.cpp b/src/engine/courses/BigDonut.cpp index c0d4b1f7f..5bdf76a23 100644 --- a/src/engine/courses/BigDonut.cpp +++ b/src/engine/courses/BigDonut.cpp @@ -123,19 +123,19 @@ void BigDonut::Load() { void BigDonut::LoadTextures() { } -void BigDonut::SpawnActors() {} +void BigDonut::BeginPlay() { + spawn_all_item_boxes((ActorSpawnData*)LOAD_ASSET_RAW(d_course_big_donut_item_box_spawns)); -void BigDonut::SpawnVehicles() { if (gModeSelection == VERSUS) { Vec3f pos = {0, 0, 0}; - gWorldInstance.AddBombKart(pos, &D_80164550[0][20], 20, 0, 1.0f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][40], 40, 0, 1.0f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][60], 60, 0, 1.0f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][80], 80, 0, 1.0f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][100], 100, 0, 1.0f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][120], 120, 0, 1.0f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][140], 140, 0, 1.0f); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][20], 20, 0, 1.0f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][40], 40, 0, 1.0f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][60], 60, 0, 1.0f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][80], 80, 0, 1.0f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][100], 100, 0, 1.0f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][120], 120, 0, 1.0f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][140], 140, 0, 1.0f)); } } diff --git a/src/engine/courses/BigDonut.h b/src/engine/courses/BigDonut.h index 732a9a568..bc076ecf2 100644 --- a/src/engine/courses/BigDonut.h +++ b/src/engine/courses/BigDonut.h @@ -26,8 +26,7 @@ public: // course_texture* textures, const char* displaylists, size_t dlSize); virtual void Load() override; virtual void LoadTextures() override; - virtual void SpawnActors() override; - virtual void SpawnVehicles() override; + virtual void BeginPlay() override; //virtual void InitClouds() override; virtual void MinimapSettings() override; virtual void InitCourseObjects() override; diff --git a/src/engine/courses/BlockFort.cpp b/src/engine/courses/BlockFort.cpp index 61eb3c0b1..136ffeef5 100644 --- a/src/engine/courses/BlockFort.cpp +++ b/src/engine/courses/BlockFort.cpp @@ -120,21 +120,19 @@ void BlockFort::Load() { void BlockFort::LoadTextures() { } -void BlockFort::SpawnActors() { +void BlockFort::BeginPlay() { spawn_all_item_boxes((ActorSpawnData*)LOAD_ASSET_RAW(d_course_block_fort_item_box_spawns)); -} -void BlockFort::SpawnVehicles() { if (gModeSelection == VERSUS) { Vec3f pos = {0, 0, 0}; - gWorldInstance.AddBombKart(pos, &D_80164550[0][20], 20, 0, 1.0f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][40], 40, 0, 1.0f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][60], 60, 0, 1.0f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][80], 80, 0, 1.0f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][100], 100, 0, 1.0f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][120], 120, 0, 1.0f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][140], 140, 0, 1.0f); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][20], 20, 0, 1.0f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][40], 40, 0, 1.0f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][60], 60, 0, 1.0f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][80], 80, 0, 1.0f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][100], 100, 0, 1.0f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][120], 120, 0, 1.0f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][140], 140, 0, 1.0f)); } } diff --git a/src/engine/courses/BlockFort.h b/src/engine/courses/BlockFort.h index b3d2fdc3c..c985b9546 100644 --- a/src/engine/courses/BlockFort.h +++ b/src/engine/courses/BlockFort.h @@ -26,8 +26,7 @@ public: // course_texture* textures, const char* displaylists, size_t dlSize); virtual void Load() override; virtual void LoadTextures() override; - virtual void SpawnActors() override; - virtual void SpawnVehicles() override; + virtual void BeginPlay() override; //virtual void InitClouds() override; virtual void MinimapSettings() override; virtual void InitCourseObjects() override; diff --git a/src/engine/courses/BowsersCastle.cpp b/src/engine/courses/BowsersCastle.cpp index 5174c5ea1..6f4ecccc5 100644 --- a/src/engine/courses/BowsersCastle.cpp +++ b/src/engine/courses/BowsersCastle.cpp @@ -148,7 +148,7 @@ void BowsersCastle::LoadTextures() { dma_textures(gTextureShrub, 0x000003FFU, 0x00000800U); } -void BowsersCastle::SpawnActors() { +void BowsersCastle::BeginPlay() { gWorldInstance.AddActor(new AFinishline()); spawn_foliage((struct ActorSpawnData*)LOAD_ASSET_RAW(d_course_bowsers_castle_tree_spawn)); @@ -194,19 +194,17 @@ void BowsersCastle::SpawnActors() { gWorldInstance.AddObject(new OThwomp(0x073a, 0xf9f2, 0x4000, 1.0f, 5, 1)); break; } -} -void BowsersCastle::SpawnVehicles() { if (gModeSelection == VERSUS) { Vec3f pos = {0, 0, 0}; - gWorldInstance.AddBombKart(pos, &D_80164550[0][50], 50, 3, 0.8333333f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][150], 150, 1, 0.8333333f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][200], 200, 3, 0.8333333f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][260], 260, 1, 0.8333333f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][435], 435, 3, 0.8333333f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][0], 0, 0, 0.8333333f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][0], 0, 0, 0.8333333f); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][50], 50, 3, 0.8333333f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][150], 150, 1, 0.8333333f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][200], 200, 3, 0.8333333f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][260], 260, 1, 0.8333333f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][435], 435, 3, 0.8333333f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][0], 0, 0, 0.8333333f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][0], 0, 0, 0.8333333f)); } } diff --git a/src/engine/courses/BowsersCastle.h b/src/engine/courses/BowsersCastle.h index bbbd4c75e..767bbdb8c 100644 --- a/src/engine/courses/BowsersCastle.h +++ b/src/engine/courses/BowsersCastle.h @@ -26,8 +26,7 @@ public: // course_texture* textures, const char* displaylists, size_t dlSize); virtual void Load() override; virtual void LoadTextures() override; - virtual void SpawnActors() override; - virtual void SpawnVehicles() override; + virtual void BeginPlay() override; //virtual void InitClouds() override; virtual void MinimapSettings() override; virtual void InitCourseObjects() override; diff --git a/src/engine/courses/ChocoMountain.cpp b/src/engine/courses/ChocoMountain.cpp index 04065dff5..4406159e9 100644 --- a/src/engine/courses/ChocoMountain.cpp +++ b/src/engine/courses/ChocoMountain.cpp @@ -163,23 +163,21 @@ void ChocoMountain::Load() { void ChocoMountain::LoadTextures() { } -void ChocoMountain::SpawnActors() { +void ChocoMountain::BeginPlay() { gWorldInstance.AddActor(new AFinishline()); spawn_all_item_boxes((struct ActorSpawnData*)LOAD_ASSET_RAW(d_course_choco_mountain_item_box_spawns)); spawn_falling_rocks((struct ActorSpawnData*)LOAD_ASSET_RAW((const char*)d_course_choco_mountain_falling_rock_spawns)); -} -void ChocoMountain::SpawnVehicles() { if (gModeSelection == VERSUS) { Vec3f pos = {0, 0, 0}; - gWorldInstance.AddBombKart(pos, &D_80164550[0][140], 140, 3, 0.8333333f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][165], 165, 1, 0.8333333f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][330], 330, 3, 0.8333333f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][550], 550, 1, 0.8333333f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][595], 595, 3, 0.8333333f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][0], 0, 0, 0.8333333f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][0], 0, 0, 0.8333333f); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][140], 140, 3, 0.8333333f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][165], 165, 1, 0.8333333f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][330], 330, 3, 0.8333333f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][550], 550, 1, 0.8333333f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][595], 595, 3, 0.8333333f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][0], 0, 0, 0.8333333f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][0], 0, 0, 0.8333333f)); } } diff --git a/src/engine/courses/ChocoMountain.h b/src/engine/courses/ChocoMountain.h index 718b40202..45926ed61 100644 --- a/src/engine/courses/ChocoMountain.h +++ b/src/engine/courses/ChocoMountain.h @@ -26,8 +26,7 @@ public: // course_texture* textures, const char* displaylists, size_t dlSize); virtual void Load() override; virtual void LoadTextures() override; - virtual void SpawnActors() override; - virtual void SpawnVehicles() override; + virtual void BeginPlay() override; virtual void MinimapSettings() override; virtual void InitCourseObjects() override; virtual void SomeSounds() override; diff --git a/src/engine/courses/Course.cpp b/src/engine/courses/Course.cpp index 0dd1ba33a..3b2ac641d 100644 --- a/src/engine/courses/Course.cpp +++ b/src/engine/courses/Course.cpp @@ -16,7 +16,6 @@ extern "C" { #include "render_objects.h" #include "save.h" #include "staff_ghosts.h" -#include "Engine.h" #include "code_800029B0.h" #include "render_courses.h" extern StaffGhost* d_mario_raceway_staff_ghost; @@ -153,7 +152,7 @@ void Course::Init() { void Course::LoadTextures() { } -void Course::SpawnActors() { +void Course::BeginPlay() { } void Course::InitClouds() { diff --git a/src/engine/courses/Course.h b/src/engine/courses/Course.h index f7bca6809..d4f637073 100644 --- a/src/engine/courses/Course.h +++ b/src/engine/courses/Course.h @@ -1,85 +1,77 @@ -#ifndef COURSE_H -#define COURSE_H +#ifndef ENGINE_COURSE_H +#define ENGINE_COURSE_H #include <libultraship.h> +#include "CoreMath.h" -// C-compatible function declaration #ifdef __cplusplus -#include "CoreMath.h" #include "engine/objects/Lakitu.h" extern "C" { #endif - #include "camera.h" - #include "course_offsets.h" - #include "data/some_data.h" - #include "defines.h" - #include "bomb_kart.h" - #include "path_spawn_metadata.h" - #include "Engine.h" - #include "waypoints.h" - -CProperties *CourseManager_GetProps(); +#include "camera.h" +#include "course_offsets.h" +#include "data/some_data.h" +#include "defines.h" +#include "bomb_kart.h" +#include "path_spawn_metadata.h" +#include "waypoints.h" +#include "sounds.h" +#include "common_structs.h" #ifdef __cplusplus } #endif +typedef struct SkyboxColours { + RGB8 TopRight; + RGB8 BottomRight; + RGB8 BottomLeft; + RGB8 TopLeft; + RGB8 FloorTopRight; + RGB8 FloorBottomRight; + RGB8 FloorBottomLeft; + RGB8 FloorTopLeft; +} SkyboxColours; + +typedef struct Properties { + const char* Id; + const char* Name; + const char* DebugName; + const char* CourseLength; + const char* AIBehaviour; + const char* MinimapTexture; + s32 LakituTowType; + IVector2D MinimapDimensions; + float AIMaximumSeparation; + float AIMinimumSeparation; + float NearPersp; + float FarPersp; + int16_t *SomePtr; + uint32_t AISteeringSensitivity; + _struct_gCoursePathSizes_0x10 PathSizes; + Vec4f D_0D009418; + Vec4f D_0D009568; + Vec4f D_0D0096B8; + Vec4f D_0D009808; + TrackWaypoint* PathTable[4]; + TrackWaypoint* PathTable2[4]; + CloudData *Clouds; + CloudData *CloudList; + int32_t MinimapFinishlineX; + int32_t MinimapFinishlineY; + SkyboxColours Skybox; + const course_texture *textures; + enum MusicSeq Sequence; +} Properties; + #ifdef __cplusplus class World; // <-- Forward declare - class Course { public: - typedef struct { - uint8_t r, g, b; - } RGB8; - - typedef struct { - RGB8 TopRight; - RGB8 BottomRight; - RGB8 BottomLeft; - RGB8 TopLeft; - RGB8 FloorTopRight; - RGB8 FloorBottomRight; - RGB8 FloorBottomLeft; - RGB8 FloorTopLeft; - } SkyboxColours; - - - typedef struct { - const char* Id; - const char* Name; - const char* DebugName; - const char* CourseLength; - const char* AIBehaviour; - const char* MinimapTexture; - s32 LakituTowType; - IVector2D MinimapDimensions; - float AIMaximumSeparation; - float AIMinimumSeparation; - float NearPersp; - float FarPersp; - int16_t *SomePtr; - uint32_t AISteeringSensitivity; - _struct_gCoursePathSizes_0x10 PathSizes; - Vec4f D_0D009418; - Vec4f D_0D009568; - Vec4f D_0D0096B8; - Vec4f D_0D009808; - TrackWaypoint* PathTable[4]; - TrackWaypoint* PathTable2[4]; - CloudData *Clouds; - CloudData *CloudList; - int32_t MinimapFinishlineX; - int32_t MinimapFinishlineY; - SkyboxColours Skybox; - const course_texture *textures; - MusicSeq Sequence; - } Properties; - Properties Props; const char* vtx = nullptr; @@ -94,7 +86,12 @@ public: virtual void Load(); // Decompress and load stock courses. Must be overridden for custom courses virtual void Load(Vtx* vtx, Gfx *gfx); // Load custom course virtual void LoadTextures(); - virtual void SpawnActors(); + + /** + * @brief BeginPlay This function is called once at the start of gameplay. + * Actor spawning should go here. + */ + virtual void BeginPlay(); virtual void InitClouds(); virtual void UpdateClouds(s32, Camera*); virtual void SomeCollisionThing(Player *player, Vec3f arg1, Vec3f arg2, Vec3f arg3, f32* arg4, f32* arg5, f32* arg6, f32* arg7); @@ -124,4 +121,4 @@ private: #endif -#endif // COURSE_H
\ No newline at end of file +#endif // ENGINE_COURSE_H diff --git a/src/engine/courses/DKJungle.cpp b/src/engine/courses/DKJungle.cpp index e3e7bf3f5..a49a029c3 100644 --- a/src/engine/courses/DKJungle.cpp +++ b/src/engine/courses/DKJungle.cpp @@ -150,12 +150,31 @@ void DKJungle::LoadTextures() { dma_textures(gTextureDksJungleParkwayKiwanoFruit3, 0x00000364U, 0x00000400U); } -void DKJungle::SpawnActors() { +void DKJungle::BeginPlay() { gWorldInstance.AddActor(new AFinishline()); spawn_all_item_boxes((struct ActorSpawnData*)LOAD_ASSET_RAW(d_course_dks_jungle_parkway_item_box_spawns)); init_kiwano_fruit(); func_80298D10(); + + + generate_ferry_waypoints(); + + // The original game only ran vehicle logic every second frame. + // Thus the speed gets divided by two to set speed to match properly + gWorldInstance.AddActor(new ABoat((0.6666666f)/4, 0)); + + if (gModeSelection == VERSUS) { + Vec3f pos = {0, 0, 0}; + + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][50], 50, 3, 0.8333333f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][100], 100, 1, 0.8333333f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][150], 150, 3, 0.8333333f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][190], 190, 1, 0.8333333f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][250], 250, 3, 0.8333333f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][0], 0, 0, 0.8333333f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][0], 0, 0, 0.8333333f)); + } } // Likely sets minimap boundaries @@ -273,26 +292,6 @@ void DKJungle::SomeCollisionThing(Player *player, Vec3f arg1, Vec3f arg2, Vec3f func_8003F138(player, arg1, arg2, arg3, arg4, arg5, arg6, arg7); } -void DKJungle::SpawnVehicles() { - generate_ferry_waypoints(); - - // The original game only ran vehicle logic every second frame. - // Thus the speed gets divided by two to set speed to match properly - gWorldInstance.AddVehicle(new ABoat((0.6666666f)/4, 0)); - - if (gModeSelection == VERSUS) { - Vec3f pos = {0, 0, 0}; - - gWorldInstance.AddBombKart(pos, &D_80164550[0][50], 50, 3, 0.8333333f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][100], 100, 1, 0.8333333f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][150], 150, 3, 0.8333333f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][190], 190, 1, 0.8333333f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][250], 250, 3, 0.8333333f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][0], 0, 0, 0.8333333f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][0], 0, 0, 0.8333333f); - } -} - void DKJungle::Waypoints(Player* player, int8_t playerId) { s16 waypoint = gNearestWaypointByPlayerId[playerId]; if ((waypoint >= 0xB9) && (waypoint < 0x119)) { diff --git a/src/engine/courses/DKJungle.h b/src/engine/courses/DKJungle.h index 389213c1f..71cc1e582 100644 --- a/src/engine/courses/DKJungle.h +++ b/src/engine/courses/DKJungle.h @@ -26,7 +26,7 @@ public: // course_texture* textures, const char* displaylists, size_t dlSize); virtual void Load() override; virtual void LoadTextures() override; - virtual void SpawnActors() override; + virtual void BeginPlay() override; //virtual void InitClouds() override; virtual void MinimapSettings() override; virtual void InitCourseObjects() override; @@ -38,7 +38,6 @@ public: virtual void MinimapFinishlinePosition() override; virtual void Render(struct UnkStruct_800DC5EC*) override; virtual void RenderCredits() override; - virtual void SpawnVehicles() override; virtual void Collision() override; virtual void SomeCollisionThing(Player *player, Vec3f arg1, Vec3f arg2, Vec3f arg3, f32* arg4, f32* arg5, f32* arg6, f32* arg7) override; virtual void Waypoints(Player* player, int8_t playerId) override; diff --git a/src/engine/courses/DoubleDeck.cpp b/src/engine/courses/DoubleDeck.cpp index 1d5e16c60..fea83005d 100644 --- a/src/engine/courses/DoubleDeck.cpp +++ b/src/engine/courses/DoubleDeck.cpp @@ -117,21 +117,19 @@ void DoubleDeck::Load() { void DoubleDeck::LoadTextures() { } -void DoubleDeck::SpawnActors() { +void DoubleDeck::BeginPlay() { spawn_all_item_boxes((ActorSpawnData*)LOAD_ASSET_RAW(d_course_double_deck_item_box_spawns)); -} -void DoubleDeck::SpawnVehicles() { if (gModeSelection == VERSUS) { Vec3f pos = {0, 0, 0}; - gWorldInstance.AddBombKart(pos, &D_80164550[0][20], 20, 0, 1.0f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][40], 40, 0, 1.0f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][60], 60, 0, 1.0f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][80], 80, 0, 1.0f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][100], 100, 0, 1.0f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][120], 120, 0, 1.0f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][140], 140, 0, 1.0f); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][20], 20, 0, 1.0f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][40], 40, 0, 1.0f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][60], 60, 0, 1.0f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][80], 80, 0, 1.0f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][100], 100, 0, 1.0f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][120], 120, 0, 1.0f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][140], 140, 0, 1.0f)); } } diff --git a/src/engine/courses/DoubleDeck.h b/src/engine/courses/DoubleDeck.h index bb1a8f98c..d821187c8 100644 --- a/src/engine/courses/DoubleDeck.h +++ b/src/engine/courses/DoubleDeck.h @@ -26,8 +26,7 @@ public: // course_texture* textures, const char* displaylists, size_t dlSize); virtual void Load() override; virtual void LoadTextures() override; - virtual void SpawnActors() override; - virtual void SpawnVehicles() override; + virtual void BeginPlay() override; //virtual void InitClouds() override; virtual void MinimapSettings() override; virtual void InitCourseObjects() override; diff --git a/src/engine/courses/FrappeSnowland.cpp b/src/engine/courses/FrappeSnowland.cpp index 5c0b4df43..61527d685 100644 --- a/src/engine/courses/FrappeSnowland.cpp +++ b/src/engine/courses/FrappeSnowland.cpp @@ -127,7 +127,7 @@ void FrappeSnowland::LoadTextures() { dma_textures(gTextureFrappeSnowlandTreeRight, 0x00000432U, 0x00000800U); } -void FrappeSnowland::SpawnActors() { +void FrappeSnowland::BeginPlay() { gWorldInstance.AddActor(new AFinishline()); spawn_foliage((struct ActorSpawnData*)LOAD_ASSET_RAW(d_course_frappe_snowland_tree_spawns)); @@ -154,19 +154,17 @@ void FrappeSnowland::SpawnActors() { gWorldInstance.AddObject(new OSnowman(FVector(-701, 3, 853))); gWorldInstance.AddObject(new OSnowman(FVector(-602, 0, 929))); } -} -void FrappeSnowland::SpawnVehicles() { if (gModeSelection == VERSUS) { Vec3f pos = {0, 0, 0}; - gWorldInstance.AddBombKart(pos, &D_80164550[0][50], 50, 3, 0.8333333f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][100], 100, 1, 0.8333333f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][150], 150, 3, 0.8333333f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][290], 290, 1, 0.8333333f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][350], 350, 3, 0.8333333f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][0], 0, 0, 0.8333333f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][0], 0, 0, 0.8333333f); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][50], 50, 3, 0.8333333f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][100], 100, 1, 0.8333333f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][150], 150, 3, 0.8333333f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][290], 290, 1, 0.8333333f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][350], 350, 3, 0.8333333f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][0], 0, 0, 0.8333333f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][0], 0, 0, 0.8333333f)); } } diff --git a/src/engine/courses/FrappeSnowland.h b/src/engine/courses/FrappeSnowland.h index 5c53dafae..8ecbdbf46 100644 --- a/src/engine/courses/FrappeSnowland.h +++ b/src/engine/courses/FrappeSnowland.h @@ -26,8 +26,7 @@ public: // course_texture* textures, const char* displaylists, size_t dlSize); virtual void Load() override; virtual void LoadTextures() override; - virtual void SpawnActors() override; - virtual void SpawnVehicles() override; + virtual void BeginPlay() override; virtual void InitClouds() override; virtual void UpdateClouds(s32 sp1C, Camera* camera) override; virtual void MinimapSettings() override; diff --git a/src/engine/courses/KalimariDesert.cpp b/src/engine/courses/KalimariDesert.cpp index ffd19a86e..e783d4e0f 100644 --- a/src/engine/courses/KalimariDesert.cpp +++ b/src/engine/courses/KalimariDesert.cpp @@ -11,7 +11,6 @@ #include "engine/vehicles/Utils.h" #include "engine/vehicles/Train.h" -#include "engine/vehicles/Vehicle.h" extern "C" { #include "main.h" @@ -136,7 +135,7 @@ void KalimariDesert::LoadTextures() { dma_textures(gTextureCactus3, 0x000003AFU, 0x00000800U); } -void KalimariDesert::SpawnActors() { +void KalimariDesert::BeginPlay() { struct RailroadCrossing* rrxing; Vec3f position; Vec3f velocity = { 0.0f, 0.0f, 0.0f }; @@ -173,6 +172,45 @@ void KalimariDesert::SpawnActors() { rrxing = (struct RailroadCrossing*) GET_ACTOR(add_actor_to_empty_slot(position, rotation, velocity, ACTOR_RAILROAD_CROSSING)); rrxing->crossingTrigger = crossing1; + + + + generate_train_waypoints(); + + s32 centerWaypoint = 160; + + // Spawn two trains + for (size_t i = 0; i < _numTrains; ++i) { + uint32_t waypoint = CalculateWaypointDistribution(i, _numTrains, gVehicle2DWaypointLength, centerWaypoint); + + if (CVarGetInteger("gMultiplayerNoFeatureCuts", 0) == false) { + // Multiplayer modes have no tender and no carriages + if (gActiveScreenMode != SCREEN_MODE_1P) { + _tender = ATrain::TenderStatus::NO_TENDER; + _numCarriages = 0; + } + + // 2 player versus mode has a tender and a carriage + if ((gModeSelection == VERSUS) && (gPlayerCountSelection1 == 2)) { + _tender = ATrain::TenderStatus::HAS_TENDER; + _numCarriages = 1; + } + } + + gWorldInstance.AddActor(new ATrain(_tender, _numCarriages, 2.5f, waypoint)); + } + + if (gModeSelection == VERSUS) { + Vec3f pos = {0, 0, 0}; + + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][50], 50, 3, 0.8333333f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][138], 138, 1, 0.8333333f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][280], 280, 3, 0.8333333f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][404], 404, 1, 0.8333333f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][510], 510, 3, 0.8333333f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][0], 0, 0, 0.8333333f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][0], 0, 0, 0.8333333f)); + } } // Likely sets minimap boundaries @@ -214,45 +252,6 @@ void KalimariDesert::MinimapFinishlinePosition() { draw_hud_2d_texture_8x8(this->Props.MinimapFinishlineX, this->Props.MinimapFinishlineY, (u8*) common_texture_minimap_finish_line); } -void KalimariDesert::SpawnVehicles() { - generate_train_waypoints(); - - s32 centerWaypoint = 160; - - // Spawn two trains - for (size_t i = 0; i < _numTrains; ++i) { - uint32_t waypoint = CalculateWaypointDistribution(i, _numTrains, gVehicle2DWaypointLength, centerWaypoint); - - if (CVarGetInteger("gMultiplayerNoFeatureCuts", 0) == false) { - // Multiplayer modes have no tender and no carriages - if (gActiveScreenMode != SCREEN_MODE_1P) { - _tender = ATrain::TenderStatus::NO_TENDER; - _numCarriages = 0; - } - - // 2 player versus mode has a tender and a carriage - if ((gModeSelection == VERSUS) && (gPlayerCountSelection1 == 2)) { - _tender = ATrain::TenderStatus::HAS_TENDER; - _numCarriages = 1; - } - } - - gWorldInstance.AddVehicle(new ATrain(_tender, _numCarriages, 2.5f, waypoint)); - } - - if (gModeSelection == VERSUS) { - Vec3f pos = {0, 0, 0}; - - gWorldInstance.AddBombKart(pos, &D_80164550[0][50], 50, 3, 0.8333333f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][138], 138, 1, 0.8333333f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][280], 280, 3, 0.8333333f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][404], 404, 1, 0.8333333f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][510], 510, 3, 0.8333333f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][0], 0, 0, 0.8333333f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][0], 0, 0, 0.8333333f); - } -} - void KalimariDesert::Render(struct UnkStruct_800DC5EC* arg0) { func_802B5D64(D_800DC610, D_802B87D4, 0, 1); diff --git a/src/engine/courses/KalimariDesert.h b/src/engine/courses/KalimariDesert.h index c4fed1d8f..0a07fcbb3 100644 --- a/src/engine/courses/KalimariDesert.h +++ b/src/engine/courses/KalimariDesert.h @@ -28,7 +28,7 @@ public: // course_texture* textures, const char* displaylists, size_t dlSize); virtual void Load() override; virtual void LoadTextures() override; - virtual void SpawnActors() override; + virtual void BeginPlay() override; virtual void MinimapSettings() override; virtual void InitCourseObjects() override; virtual void SomeSounds() override; @@ -37,7 +37,6 @@ public: virtual void MinimapFinishlinePosition() override; virtual void Render(struct UnkStruct_800DC5EC*) override; virtual void RenderCredits() override; - virtual void SpawnVehicles() override; virtual void Collision() override; virtual void Destroy() override; diff --git a/src/engine/courses/KoopaTroopaBeach.cpp b/src/engine/courses/KoopaTroopaBeach.cpp index 6beca16b6..4e017912e 100644 --- a/src/engine/courses/KoopaTroopaBeach.cpp +++ b/src/engine/courses/KoopaTroopaBeach.cpp @@ -139,7 +139,7 @@ void KoopaTroopaBeach::Load() { void KoopaTroopaBeach::LoadTextures() { } -void KoopaTroopaBeach::SpawnActors() { +void KoopaTroopaBeach::BeginPlay() { gWorldInstance.AddActor(new AFinishline()); init_actor_hot_air_balloon_item_box(328.0f * gCourseDirection, 70.0f, 2541.0f); @@ -178,19 +178,17 @@ void KoopaTroopaBeach::SpawnActors() { gWorldInstance.AddObject(new OSeagull(pos2)); } } -} -void KoopaTroopaBeach::SpawnVehicles() { if (gModeSelection == VERSUS) { Vec3f pos = {0, 0, 0}; - gWorldInstance.AddBombKart(pos, &D_80164550[0][60], 60, 1, 0.8333333f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][120], 120, 1, 0.8333333f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][200], 200, 3, 0.8333333f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][280], 280, 1, 0.8333333f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][435], 435, 3, 0.8333333f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][0], 0, 0, 0.8333333f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][0], 0, 0, 0.8333333f); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][60], 60, 1, 0.8333333f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][120], 120, 1, 0.8333333f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][200], 200, 3, 0.8333333f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][280], 280, 1, 0.8333333f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][435], 435, 3, 0.8333333f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][0], 0, 0, 0.8333333f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][0], 0, 0, 0.8333333f)); } } diff --git a/src/engine/courses/KoopaTroopaBeach.h b/src/engine/courses/KoopaTroopaBeach.h index c10b5cede..490dfe8ab 100644 --- a/src/engine/courses/KoopaTroopaBeach.h +++ b/src/engine/courses/KoopaTroopaBeach.h @@ -29,8 +29,7 @@ public: // course_texture* textures, const char* displaylists, size_t dlSize); virtual void Load() override; virtual void LoadTextures() override; - virtual void SpawnActors() override; - virtual void SpawnVehicles() override; + virtual void BeginPlay() override; virtual void MinimapSettings() override; virtual void InitCourseObjects() override; virtual void UpdateCourseObjects() override; diff --git a/src/engine/courses/LuigiRaceway.cpp b/src/engine/courses/LuigiRaceway.cpp index 78522df74..a821ec2d9 100644 --- a/src/engine/courses/LuigiRaceway.cpp +++ b/src/engine/courses/LuigiRaceway.cpp @@ -164,7 +164,7 @@ void LuigiRaceway::LoadTextures() { dma_textures(gTextureTrees5Right, 0x000003E8U, 0x00000800U); } -void LuigiRaceway::SpawnActors() { +void LuigiRaceway::BeginPlay() { gWorldInstance.AddActor(new AFinishline()); spawn_foliage((struct ActorSpawnData*) LOAD_ASSET_RAW(d_course_luigi_raceway_tree_spawn)); spawn_all_item_boxes((struct ActorSpawnData*) LOAD_ASSET_RAW(d_course_luigi_raceway_item_box_spawns)); @@ -174,19 +174,17 @@ void LuigiRaceway::SpawnActors() { } else { // Normal gameplay gWorldInstance.AddObject(new OHotAirBalloon(FVector(-176.0, 0.0f, -2323.0f))); } -} -void LuigiRaceway::SpawnVehicles() { if (gModeSelection == VERSUS) { Vec3f pos = { 0, 0, 0 }; - gWorldInstance.AddBombKart(pos, &D_80164550[0][50], 50, 1, 0.8333333f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][200], 200, 3, 0.8333333f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][305], 305, 1, 0.8333333f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][440], 440, 3, 0.8333333f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][515], 515, 3, 0.8333333f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][0], 0, 0, 0.8333333f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][0], 0, 0, 0.8333333f); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][50], 50, 1, 0.8333333f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][200], 200, 3, 0.8333333f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][305], 305, 1, 0.8333333f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][440], 440, 3, 0.8333333f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][515], 515, 3, 0.8333333f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][0], 0, 0, 0.8333333f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][0], 0, 0, 0.8333333f)); } } diff --git a/src/engine/courses/LuigiRaceway.h b/src/engine/courses/LuigiRaceway.h index 7166278c3..c5e089d81 100644 --- a/src/engine/courses/LuigiRaceway.h +++ b/src/engine/courses/LuigiRaceway.h @@ -28,8 +28,7 @@ class LuigiRaceway : public Course { // course_texture* textures, const char* displaylists, size_t dlSize); virtual void Load() override; virtual void LoadTextures() override; - virtual void SpawnActors() override; - virtual void SpawnVehicles() override; + virtual void BeginPlay() override; virtual void MinimapSettings() override; virtual void InitCourseObjects() override; virtual void UpdateCourseObjects() override; diff --git a/src/engine/courses/MarioRaceway.cpp b/src/engine/courses/MarioRaceway.cpp index d98065ed8..a2cc96525 100644 --- a/src/engine/courses/MarioRaceway.cpp +++ b/src/engine/courses/MarioRaceway.cpp @@ -6,6 +6,7 @@ #include "MarioRaceway.h" #include "World.h" #include "engine/actors/AFinishline.h" +#include "engine/objects/Object.h" #include "engine/objects/BombKart.h" extern "C" { @@ -173,7 +174,7 @@ void MarioRaceway::LoadTextures() { dma_textures(gTexturePiranhaPlant9, 0x000003E8U, 0x00000800U); } -void MarioRaceway::SpawnActors() { +void MarioRaceway::BeginPlay() { struct Actor* actor; Vec3f position; Vec3f velocity = { 0.0f, 0.0f, 0.0f }; @@ -190,22 +191,23 @@ void MarioRaceway::SpawnActors() { vec3f_set(position, 2520.0f, 0.0f, 1240.0f); position[0] *= gCourseDirection; add_actor_to_empty_slot(position, rotation, velocity, ACTOR_MARIO_SIGN); -} -void MarioRaceway::SpawnVehicles() { if (gModeSelection == VERSUS) { Vec3f pos = {0, 0, 0}; - - gWorldInstance.AddBombKart(pos, &D_80164550[0][40], 40, 3, 0.8333333f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][100], 100, 3, 0.8333333f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][265], 265, 3, 0.8333333f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][285], 285, 1, 0.8333333f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][420], 420, 1, 0.8333333f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][0], 0, 0, 0.8333333f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][0], 0, 0, 0.8333333f); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][40], 40, 3, 0.8333333f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][100], 100, 3, 0.8333333f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][265], 265, 3, 0.8333333f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][285], 285, 1, 0.8333333f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][420], 420, 1, 0.8333333f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][0], 0, 0, 0.8333333f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][0], 0, 0, 0.8333333f)); } } +void MarioRaceway::SpawnVehicles() { + +} + // Likely sets minimap boundaries void MarioRaceway::MinimapSettings() { D_8018D220 = reinterpret_cast<uint8_t (*)[1024]>(dma_textures(gTextureExhaust5, 0x443, 0x1000)); diff --git a/src/engine/courses/MarioRaceway.h b/src/engine/courses/MarioRaceway.h index ef0fb904b..9714fd0f5 100644 --- a/src/engine/courses/MarioRaceway.h +++ b/src/engine/courses/MarioRaceway.h @@ -26,7 +26,7 @@ public: // course_texture* textures, const char* displaylists, size_t dlSize); virtual void Load() override; virtual void LoadTextures() override; - virtual void SpawnActors() override; + virtual void BeginPlay() override; virtual void SpawnVehicles() override; virtual void MinimapSettings() override; virtual void InitCourseObjects() override; diff --git a/src/engine/courses/MooMooFarm.cpp b/src/engine/courses/MooMooFarm.cpp index 109857353..5adaeb2a6 100644 --- a/src/engine/courses/MooMooFarm.cpp +++ b/src/engine/courses/MooMooFarm.cpp @@ -159,26 +159,24 @@ void MooMooFarm::LoadTextures() { dma_textures(gTextureCow05Right, 0x00000400U, 0x00000800U); } -void MooMooFarm::SpawnActors() { +void MooMooFarm::BeginPlay() { gWorldInstance.AddActor(new AFinishline()); if (gPlayerCountSelection1 != 4) { spawn_foliage((struct ActorSpawnData*)LOAD_ASSET_RAW(d_course_moo_moo_farm_tree_spawn)); } spawn_all_item_boxes((struct ActorSpawnData*)LOAD_ASSET_RAW(d_course_moo_moo_farm_item_box_spawns)); -} -void MooMooFarm::SpawnVehicles() { if (gModeSelection == VERSUS) { Vec3f pos = {0, 0, 0}; - gWorldInstance.AddBombKart(pos, &D_80164550[0][50], 50, 3, 0.8333333f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][140], 140, 3, 0.8333333f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][225], 225, 3, 0.8333333f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][316], 316, 3, 0.8333333f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][434], 434, 3, 0.8333333f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][0], 0, 0, 0.8333333f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][0], 0, 0, 0.8333333f); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][50], 50, 3, 0.8333333f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][140], 140, 3, 0.8333333f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][225], 225, 3, 0.8333333f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][316], 316, 3, 0.8333333f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][434], 434, 3, 0.8333333f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][0], 0, 0, 0.8333333f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][0], 0, 0, 0.8333333f)); } } diff --git a/src/engine/courses/MooMooFarm.h b/src/engine/courses/MooMooFarm.h index 5815db8c7..0293b1b04 100644 --- a/src/engine/courses/MooMooFarm.h +++ b/src/engine/courses/MooMooFarm.h @@ -29,8 +29,7 @@ public: // course_texture* textures, const char* displaylists, size_t dlSize); virtual void Load() override; virtual void LoadTextures() override; - virtual void SpawnActors() override; - virtual void SpawnVehicles() override; + virtual void BeginPlay() override; virtual void MinimapSettings() override; virtual void InitCourseObjects() override; virtual void UpdateCourseObjects() override; diff --git a/src/engine/courses/PodiumCeremony.cpp b/src/engine/courses/PodiumCeremony.cpp index 631a187dc..736a3ed9f 100644 --- a/src/engine/courses/PodiumCeremony.cpp +++ b/src/engine/courses/PodiumCeremony.cpp @@ -159,7 +159,7 @@ void PodiumCeremony::Load() { void PodiumCeremony::LoadTextures() { } -void PodiumCeremony::SpawnActors() { +void PodiumCeremony::BeginPlay() { spawn_foliage((struct ActorSpawnData*)LOAD_ASSET_RAW(d_course_royal_raceway_tree_spawn)); spawn_all_item_boxes((struct ActorSpawnData*)LOAD_ASSET_RAW(d_course_royal_raceway_item_box_spawns)); spawn_piranha_plants((struct ActorSpawnData*)LOAD_ASSET_RAW(d_course_royal_raceway_piranha_plant_spawn)); @@ -187,18 +187,15 @@ void PodiumCeremony::SpawnActors() { } gWorldInstance.AddObject(new OTrophy(pos, type, OTrophy::Behaviour::PODIUM_CEREMONY)); -} - -void PodiumCeremony::SpawnVehicles() { - Vec3f pos = {0, 0, 0}; - gWorldInstance.AddBombKart(pos, &D_80164550[3][3], 3, 5, 1.25f); - gWorldInstance.AddBombKart(pos, &D_80164550[3][40], 40, 0, 1.0f); - gWorldInstance.AddBombKart(pos, &D_80164550[3][60], 60, 0, 1.0f); - gWorldInstance.AddBombKart(pos, &D_80164550[3][80], 80, 0, 1.0f); - gWorldInstance.AddBombKart(pos, &D_80164550[3][100], 100, 0, 1.0f); - gWorldInstance.AddBombKart(pos, &D_80164550[3][120], 120, 0, 1.0f); - gWorldInstance.AddBombKart(pos, &D_80164550[3][140], 140, 0, 1.0f); + Vec3f kart = {0, 0, 0}; + gWorldInstance.AddObject(new OBombKart(kart, &D_80164550[3][3], 3, 5, 1.25f)); + gWorldInstance.AddObject(new OBombKart(kart, &D_80164550[3][40], 40, 0, 1.0f)); + gWorldInstance.AddObject(new OBombKart(kart, &D_80164550[3][60], 60, 0, 1.0f)); + gWorldInstance.AddObject(new OBombKart(kart, &D_80164550[3][80], 80, 0, 1.0f)); + gWorldInstance.AddObject(new OBombKart(kart, &D_80164550[3][100], 100, 0, 1.0f)); + gWorldInstance.AddObject(new OBombKart(kart, &D_80164550[3][120], 120, 0, 1.0f)); + gWorldInstance.AddObject(new OBombKart(kart, &D_80164550[3][140], 140, 0, 1.0f)); } // Likely sets minimap boundaries diff --git a/src/engine/courses/PodiumCeremony.h b/src/engine/courses/PodiumCeremony.h index bb17e8f8d..140d95889 100644 --- a/src/engine/courses/PodiumCeremony.h +++ b/src/engine/courses/PodiumCeremony.h @@ -27,8 +27,7 @@ public: // course_texture* textures, const char* displaylists, size_t dlSize); virtual void Load() override; virtual void LoadTextures() override; - virtual void SpawnActors() override; - virtual void SpawnVehicles() override; + virtual void BeginPlay() override; //virtual void InitClouds() override; virtual void MinimapSettings() override; virtual void InitCourseObjects() override; diff --git a/src/engine/courses/RainbowRoad.cpp b/src/engine/courses/RainbowRoad.cpp index 7dd4bcdf7..b878eebfb 100644 --- a/src/engine/courses/RainbowRoad.cpp +++ b/src/engine/courses/RainbowRoad.cpp @@ -133,7 +133,7 @@ void RainbowRoad::Load() { void RainbowRoad::LoadTextures() { } -void RainbowRoad::SpawnActors() { +void RainbowRoad::BeginPlay() { gWorldInstance.AddActor(new AFinishline()); spawn_all_item_boxes((struct ActorSpawnData*)LOAD_ASSET_RAW(d_course_rainbow_road_item_box_spawns)); @@ -147,19 +147,17 @@ void RainbowRoad::SpawnActors() { gWorldInstance.AddObject(new OChainChomp()); gWorldInstance.AddObject(new OChainChomp()); } -} -void RainbowRoad::SpawnVehicles() { if (gModeSelection == VERSUS) { Vec3f pos = {0, 0, 0}; - gWorldInstance.AddBombKart(pos, &D_80164550[0][50], 50, 3, 0.8333333f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][100], 100, 1, 0.8333333f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][150], 150, 3, 0.8333333f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][200], 200, 1, 0.8333333f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][250], 250, 3, 0.8333333f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][0], 0, 0, 0.8333333f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][0], 0, 0, 0.8333333f); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][50], 50, 3, 0.8333333f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][100], 100, 1, 0.8333333f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][150], 150, 3, 0.8333333f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][200], 200, 1, 0.8333333f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][250], 250, 3, 0.8333333f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][0], 0, 0, 0.8333333f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][0], 0, 0, 0.8333333f)); } } diff --git a/src/engine/courses/RainbowRoad.h b/src/engine/courses/RainbowRoad.h index 5f6b0e5e7..e5262f170 100644 --- a/src/engine/courses/RainbowRoad.h +++ b/src/engine/courses/RainbowRoad.h @@ -26,8 +26,7 @@ public: // course_texture* textures, const char* displaylists, size_t dlSize); virtual void Load() override; virtual void LoadTextures() override; - virtual void SpawnActors() override; - virtual void SpawnVehicles() override; + virtual void BeginPlay() override; virtual void InitClouds() override; virtual void UpdateClouds(s32, Camera*) override; virtual void MinimapSettings() override; diff --git a/src/engine/courses/RoyalRaceway.cpp b/src/engine/courses/RoyalRaceway.cpp index 2ea0022ca..de1ab164b 100644 --- a/src/engine/courses/RoyalRaceway.cpp +++ b/src/engine/courses/RoyalRaceway.cpp @@ -170,25 +170,23 @@ void RoyalRaceway::LoadTextures() { dma_textures(gTexturePiranhaPlant9, 0x000003E8U, 0x00000800U); } -void RoyalRaceway::SpawnActors() { +void RoyalRaceway::BeginPlay() { gWorldInstance.AddActor(new AFinishline()); spawn_foliage((struct ActorSpawnData*)LOAD_ASSET_RAW(d_course_royal_raceway_tree_spawn)); spawn_all_item_boxes((struct ActorSpawnData*)LOAD_ASSET_RAW(d_course_royal_raceway_item_box_spawns)); spawn_piranha_plants((struct ActorSpawnData*)LOAD_ASSET_RAW(d_course_royal_raceway_piranha_plant_spawn)); -} -void RoyalRaceway::SpawnVehicles() { if (gModeSelection == VERSUS) { Vec3f pos = {0, 0, 0}; - gWorldInstance.AddBombKart(pos, &D_80164550[0][50], 50, 3, 0.8333333f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][100], 100, 3, 0.8333333f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][296], 296, 3, 0.8333333f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][400], 400, 1, 0.8333333f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][746], 746, 3, 0.8333333f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][0], 0, 0, 0.8333333f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][0], 0, 0, 0.8333333f); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][50], 50, 3, 0.8333333f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][100], 100, 3, 0.8333333f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][296], 296, 3, 0.8333333f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][400], 400, 1, 0.8333333f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][746], 746, 3, 0.8333333f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][0], 0, 0, 0.8333333f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][0], 0, 0, 0.8333333f)); } } diff --git a/src/engine/courses/RoyalRaceway.h b/src/engine/courses/RoyalRaceway.h index 0a7cd3e6a..2a3095bc8 100644 --- a/src/engine/courses/RoyalRaceway.h +++ b/src/engine/courses/RoyalRaceway.h @@ -26,8 +26,7 @@ public: // course_texture* textures, const char* displaylists, size_t dlSize); virtual void Load() override; virtual void LoadTextures() override; - virtual void SpawnActors() override; - virtual void SpawnVehicles() override; + virtual void BeginPlay() override; virtual void MinimapSettings() override; virtual void InitCourseObjects() override; virtual void SomeSounds() override; diff --git a/src/engine/courses/SherbetLand.cpp b/src/engine/courses/SherbetLand.cpp index bfcacca4a..7e77ecdbb 100644 --- a/src/engine/courses/SherbetLand.cpp +++ b/src/engine/courses/SherbetLand.cpp @@ -129,7 +129,7 @@ void SherbetLand::Load() { void SherbetLand::LoadTextures() { } -void SherbetLand::SpawnActors() { +void SherbetLand::BeginPlay() { gWorldInstance.AddActor(new AFinishline()); spawn_all_item_boxes((struct ActorSpawnData*)LOAD_ASSET_RAW(d_course_sherbet_land_item_box_spawns)); @@ -199,19 +199,15 @@ void SherbetLand::SpawnActors() { auto penguin14 = reinterpret_cast<OPenguin*>(gWorldInstance.AddObject(new OPenguin(pos11, 0x9000, OPenguin::PenguinType::CHICK, OPenguin::Behaviour::SLIDE6))); penguin14->MirrorModeAngleOffset = -0x4000; -} - -void SherbetLand::SpawnVehicles() { if (gModeSelection == VERSUS) { - Vec3f pos = {0, 0, 0}; - - gWorldInstance.AddBombKart(pos, &D_80164550[0][50], 50, 3, 0.8333333f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][100], 100, 1, 0.8333333f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][150], 150, 3, 0.8333333f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][200], 200, 1, 0.8333333f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][250], 250, 3, 0.8333333f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][0], 0, 0, 0.8333333f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][0], 0, 0, 0.8333333f); + Vec3f kart = {0, 0, 0}; + gWorldInstance.AddObject(new OBombKart(kart, &D_80164550[0][50], 50, 3, 0.8333333f)); + gWorldInstance.AddObject(new OBombKart(kart, &D_80164550[0][100], 100, 1, 0.8333333f)); + gWorldInstance.AddObject(new OBombKart(kart, &D_80164550[0][150], 150, 3, 0.8333333f)); + gWorldInstance.AddObject(new OBombKart(kart, &D_80164550[0][200], 200, 1, 0.8333333f)); + gWorldInstance.AddObject(new OBombKart(kart, &D_80164550[0][250], 250, 3, 0.8333333f)); + gWorldInstance.AddObject(new OBombKart(kart, &D_80164550[0][0], 0, 0, 0.8333333f)); + gWorldInstance.AddObject(new OBombKart(kart, &D_80164550[0][0], 0, 0, 0.8333333f)); } } diff --git a/src/engine/courses/SherbetLand.h b/src/engine/courses/SherbetLand.h index 177410ca7..13e41e592 100644 --- a/src/engine/courses/SherbetLand.h +++ b/src/engine/courses/SherbetLand.h @@ -26,8 +26,7 @@ public: // course_texture* textures, const char* displaylists, size_t dlSize); virtual void Load() override; virtual void LoadTextures() override; - virtual void SpawnActors() override; - virtual void SpawnVehicles() override; + virtual void BeginPlay() override; virtual void MinimapSettings() override; virtual void InitCourseObjects() override; virtual void UpdateCourseObjects() override; diff --git a/src/engine/courses/Skyscraper.cpp b/src/engine/courses/Skyscraper.cpp index f7c092bee..abf622ae2 100644 --- a/src/engine/courses/Skyscraper.cpp +++ b/src/engine/courses/Skyscraper.cpp @@ -142,21 +142,19 @@ void Skyscraper::Load() { void Skyscraper::LoadTextures() { } -void Skyscraper::SpawnActors() { +void Skyscraper::BeginPlay() { spawn_all_item_boxes((ActorSpawnData*)LOAD_ASSET_RAW(d_course_skyscraper_item_box_spawns)); -} -void Skyscraper::SpawnVehicles() { if (gModeSelection == VERSUS) { Vec3f pos = {0, 0, 0}; - gWorldInstance.AddBombKart(pos, &D_80164550[0][20], 20, 0, 1.0f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][40], 40, 0, 1.0f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][60], 60, 0, 1.0f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][80], 80, 0, 1.0f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][100], 100, 0, 1.0f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][120], 120, 0, 1.0f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][140], 140, 0, 1.0f); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][20], 20, 0, 1.0f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][40], 40, 0, 1.0f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][60], 60, 0, 1.0f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][80], 80, 0, 1.0f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][100], 100, 0, 1.0f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][120], 120, 0, 1.0f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][140], 140, 0, 1.0f)); } } diff --git a/src/engine/courses/Skyscraper.h b/src/engine/courses/Skyscraper.h index 6658b43e6..b9b998f73 100644 --- a/src/engine/courses/Skyscraper.h +++ b/src/engine/courses/Skyscraper.h @@ -26,8 +26,7 @@ public: // course_texture* textures, const char* displaylists, size_t dlSize); virtual void Load() override; virtual void LoadTextures() override; - virtual void SpawnActors() override; - virtual void SpawnVehicles() override; + virtual void BeginPlay() override; //virtual void InitClouds() override; virtual void MinimapSettings() override; virtual void InitCourseObjects() override; diff --git a/src/engine/courses/TestCourse.cpp b/src/engine/courses/TestCourse.cpp index cf35a062b..30a925d80 100644 --- a/src/engine/courses/TestCourse.cpp +++ b/src/engine/courses/TestCourse.cpp @@ -151,7 +151,7 @@ void TestCourse::LoadTextures() { dma_textures(gTexturePiranhaPlant9, 0x000003E8U, 0x00000800U); } -void TestCourse::SpawnActors() { +void TestCourse::BeginPlay() { struct ActorSpawnData itemboxes[] = { { 200, 1500, 200 , 0}, { 350, 2500, 300 , 1}, @@ -304,9 +304,8 @@ void TestCourse::SpawnVehicles() { Vec3f pos = {0, 0, 0}; - gWorldInstance.AddBombKart(pos, &D_80164550[0][25], 25, 4, 0.8333333f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][45], 45, 4, 0.8333333f); - + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][25], 25, 4, 0.8333333f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][45], 45, 4, 0.8333333f)); } void TestCourse::UpdateVehicles() { diff --git a/src/engine/courses/TestCourse.h b/src/engine/courses/TestCourse.h index 8bcffb131..2ba8a9f49 100644 --- a/src/engine/courses/TestCourse.h +++ b/src/engine/courses/TestCourse.h @@ -26,7 +26,7 @@ public: // course_texture* textures, const char* displaylists, size_t dlSize); virtual void Load() override; virtual void LoadTextures() override; - virtual void SpawnActors() override; + virtual void BeginPlay() override; virtual void MinimapSettings() override; virtual void InitCourseObjects() override; virtual void SomeSounds() override; diff --git a/src/engine/courses/ToadsTurnpike.cpp b/src/engine/courses/ToadsTurnpike.cpp index 88371411f..f6aa3f738 100644 --- a/src/engine/courses/ToadsTurnpike.cpp +++ b/src/engine/courses/ToadsTurnpike.cpp @@ -148,7 +148,7 @@ void ToadsTurnpike::Load() { void ToadsTurnpike::LoadTextures() { } -void ToadsTurnpike::SpawnActors() { +void ToadsTurnpike::BeginPlay() { Vec3f pos; pos[0] = (gIsMirrorMode != 0) ? D_80164490->posX + 138.0f : D_80164490->posX - 138.0f; pos[1] = (f32) (D_80164490->posY - 15); @@ -157,6 +157,51 @@ void ToadsTurnpike::SpawnActors() { gWorldInstance.AddActor(new AFinishline(pos)); spawn_all_item_boxes((struct ActorSpawnData*)LOAD_ASSET_RAW(d_course_toads_turnpike_item_box_spawns)); + + uint32_t waypoint; + 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; + + // Other game modes spawn seven of each vehicle + if (gModeSelection == TIME_TRIALS) { + _numTrucks = 8; + _numBuses = 8; + _numTankerTrucks = 8; + _numCars = 8; + } + + for (size_t i = 0; i < _numTrucks; i++) { + waypoint = CalculateWaypointDistribution(i, _numTrucks, gWaypointCountByPathIndex[0], 0); + gWorldInstance.AddActor(new ATruck(a, b, &D_80164550[0][0], waypoint)); + } + + for (size_t i = 0; i < _numBuses; i++) { + waypoint = CalculateWaypointDistribution(i, _numBuses, gWaypointCountByPathIndex[0], 75); + gWorldInstance.AddActor(new ABus(a, b, &D_80164550[0][0], waypoint)); + } + + for (size_t i = 0; i < _numTankerTrucks; i++) { + waypoint = CalculateWaypointDistribution(i, _numTankerTrucks, gWaypointCountByPathIndex[0], 50); + gWorldInstance.AddActor(new ATankerTruck(a, b, &D_80164550[0][0], waypoint)); + } + + for (size_t i = 0; i < _numCars; i++) { + waypoint = CalculateWaypointDistribution(i, _numCars, gWaypointCountByPathIndex[0], 25); + gWorldInstance.AddActor(new ACar(a, b, &D_80164550[0][0], waypoint)); + } + + if (gModeSelection == VERSUS) { + Vec3f pos = {0, 0, 0}; + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][50], 50, 3, 0.8333333f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][100], 100, 1, 0.8333333f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][150], 150, 3, 0.8333333f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][200], 200, 1, 0.8333333f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][250], 250, 3, 0.8333333f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][0], 0, 0, 0.8333333f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][0], 0, 0, 0.8333333f)); + } } void ToadsTurnpike::InitClouds() { @@ -243,52 +288,4 @@ void ToadsTurnpike::RenderCredits() { void ToadsTurnpike::Collision() {} -void ToadsTurnpike::SpawnVehicles() { - uint32_t waypoint; - 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; - - // Other game modes spawn seven of each vehicle - if (gModeSelection == TIME_TRIALS) { - _numTrucks = 8; - _numBuses = 8; - _numTankerTrucks = 8; - _numCars = 8; - } - - for (size_t i = 0; i < _numTrucks; i++) { - waypoint = CalculateWaypointDistribution(i, _numTrucks, gWaypointCountByPathIndex[0], 0); - gWorldInstance.AddVehicle(new ATruck(a, b, &D_80164550[0][0], waypoint)); - } - - for (size_t i = 0; i < _numBuses; i++) { - waypoint = CalculateWaypointDistribution(i, _numBuses, gWaypointCountByPathIndex[0], 75); - gWorldInstance.AddVehicle(new ABus(a, b,&D_80164550[0][0], waypoint)); - } - - for (size_t i = 0; i < _numTankerTrucks; i++) { - waypoint = CalculateWaypointDistribution(i, _numTankerTrucks, gWaypointCountByPathIndex[0], 50); - gWorldInstance.AddVehicle(new ATankerTruck(a, b, &D_80164550[0][0], waypoint)); - } - - for (size_t i = 0; i < _numCars; i++) { - waypoint = CalculateWaypointDistribution(i, _numCars, gWaypointCountByPathIndex[0], 25); - gWorldInstance.AddVehicle(new ACar(a, b, &D_80164550[0][0], waypoint)); - } - - if (gModeSelection == VERSUS) { - Vec3f pos = {0, 0, 0}; - - gWorldInstance.AddBombKart(pos, &D_80164550[0][50], 50, 3, 0.8333333f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][100], 100, 1, 0.8333333f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][150], 150, 3, 0.8333333f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][200], 200, 1, 0.8333333f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][250], 250, 3, 0.8333333f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][0], 0, 0, 0.8333333f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][0], 0, 0, 0.8333333f); - } -} - void ToadsTurnpike::Destroy() { } diff --git a/src/engine/courses/ToadsTurnpike.h b/src/engine/courses/ToadsTurnpike.h index bbb2df9c3..a73e3829f 100644 --- a/src/engine/courses/ToadsTurnpike.h +++ b/src/engine/courses/ToadsTurnpike.h @@ -26,7 +26,7 @@ public: // course_texture* textures, const char* displaylists, size_t dlSize); virtual void Load() override; virtual void LoadTextures() override; - virtual void SpawnActors() override; + virtual void BeginPlay() override; virtual void InitClouds() override; virtual void UpdateClouds(s32, Camera*) override; virtual void MinimapSettings() override; @@ -37,7 +37,6 @@ public: virtual void Render(struct UnkStruct_800DC5EC*) override; virtual void RenderCredits() override; virtual void Collision() override; - virtual void SpawnVehicles() override; virtual void Destroy() override; private: size_t _numTrucks = 7; diff --git a/src/engine/courses/WarioStadium.cpp b/src/engine/courses/WarioStadium.cpp index 522a6509d..44a8d5d1a 100644 --- a/src/engine/courses/WarioStadium.cpp +++ b/src/engine/courses/WarioStadium.cpp @@ -155,7 +155,7 @@ void WarioStadium::Load() { void WarioStadium::LoadTextures() { } -void WarioStadium::SpawnActors() { +void WarioStadium::BeginPlay() { Vec3f finish; finish[0] = (gIsMirrorMode != 0) ? D_80164490->posX + 12.0f : D_80164490->posX - 12.0f; (gIsMirrorMode != 0) ? D_80164490->posX + 12.0f : D_80164490->posX - 12.0f; @@ -177,19 +177,17 @@ void WarioStadium::SpawnActors() { Vec3f pos3 = { -2622.0f, 79.0f, 739.0f }; pos3[0] *= gCourseDirection; gWorldInstance.AddActor(new AWarioSign(pos3)); -} -void WarioStadium::SpawnVehicles() { if (gModeSelection == VERSUS) { Vec3f pos = { 0, 0, 0 }; - gWorldInstance.AddBombKart(pos, &D_80164550[0][50], 50, 3, 0.8333333f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][100], 100, 1, 0.8333333f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][150], 150, 3, 0.8333333f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][200], 200, 1, 0.8333333f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][250], 250, 3, 0.8333333f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][0], 0, 0, 0.8333333f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][0], 0, 0, 0.8333333f); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][50], 50, 3, 0.8333333f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][100], 100, 1, 0.8333333f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][150], 150, 3, 0.8333333f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][200], 200, 1, 0.8333333f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][250], 250, 3, 0.8333333f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][0], 0, 0, 0.8333333f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][0], 0, 0, 0.8333333f)); } } diff --git a/src/engine/courses/WarioStadium.h b/src/engine/courses/WarioStadium.h index 088e81b72..72f796cc7 100644 --- a/src/engine/courses/WarioStadium.h +++ b/src/engine/courses/WarioStadium.h @@ -28,8 +28,7 @@ class WarioStadium : public Course { // course_texture* textures, const char* displaylists, size_t dlSize); virtual void Load() override; virtual void LoadTextures() override; - virtual void SpawnActors() override; - virtual void SpawnVehicles() override; + virtual void BeginPlay() override; virtual void InitClouds() override; virtual void UpdateClouds(s32, Camera*) override; virtual void MinimapSettings() override; diff --git a/src/engine/courses/YoshiValley.cpp b/src/engine/courses/YoshiValley.cpp index f7f3d1871..9366f45ea 100644 --- a/src/engine/courses/YoshiValley.cpp +++ b/src/engine/courses/YoshiValley.cpp @@ -137,7 +137,7 @@ void YoshiValley::LoadTextures() { dma_textures(gTextureTrees2, 0x000003E8U, 0x00000800U); } -void YoshiValley::SpawnActors() { +void YoshiValley::BeginPlay() { Vec3f position; Vec3f velocity = { 0.0f, 0.0f, 0.0f }; Vec3s rotation = { 0, 0, 0 }; @@ -173,43 +173,40 @@ void YoshiValley::SpawnActors() { gWorldInstance.AddObject(new OHedgehog(FVector(-2493, 94, -454), FVector2D(-2505, -397), 28)); gWorldInstance.AddObject(new OHedgehog(FVector(-2477, 3, -57), FVector2D(-2539, -66), 28)); } -} - -// Likely sets minimap boundaries -void YoshiValley::MinimapSettings() { - D_8018D220 = reinterpret_cast<uint8_t (*)[1024]>(dma_textures(gTextureExhaust0, 0x479, 0xC00)); - D_8018D2A0 = 0.018f; - D_8018D2E0 = 61; - D_8018D2E8 = 38; -} - -void YoshiValley::InitCourseObjects() { -} -void YoshiValley::SpawnVehicles() { if (gModeSelection == VERSUS) { - // Note that the waypoint values might be unused for Yoshi's Valley. Entered them because // the original data has values here. // Note that the Y height is calculated automatically to place the kart on the surface Vec3f pos = {-1533, 0, -682}; - gWorldInstance.AddBombKart(pos, NULL, 0, 0, 0.8333333f); + gWorldInstance.AddObject(new OBombKart(pos, NULL, 0, 0, 0.8333333f)); Vec3f pos2 = {-1565, 0, -619}; - gWorldInstance.AddBombKart(pos2, NULL, 10, 0, 0.8333333f); + gWorldInstance.AddObject(new OBombKart(pos2, NULL, 10, 0, 0.8333333f)); Vec3f pos3 = {-1529, 0, -579}; - gWorldInstance.AddBombKart(pos3, NULL, 20, 0, 0.8333333f); + gWorldInstance.AddObject(new OBombKart(pos3, NULL, 20, 0, 0.8333333f)); Vec3f pos4 = {-1588, 0, -534}; - gWorldInstance.AddBombKart(pos4, NULL, 30, 0, 0.8333333f); + gWorldInstance.AddObject(new OBombKart(pos4, NULL, 30, 0, 0.8333333f)); Vec3f pos5 = {-1598, 0, -207}; - gWorldInstance.AddBombKart(pos5, NULL, 40, 0, 0.8333333f); + gWorldInstance.AddObject(new OBombKart(pos5, NULL, 40, 0, 0.8333333f)); Vec3f pos6 = {-1646, 0, -147}; - gWorldInstance.AddBombKart(pos6, NULL, 50, 0, 0.8333333f); + gWorldInstance.AddObject(new OBombKart(pos6, NULL, 50, 0, 0.8333333f)); Vec3f pos7 = {-2532, 0, -445}; - gWorldInstance.AddBombKart(pos7, NULL, 60, 0, 0.8333333f); + gWorldInstance.AddObject(new OBombKart(pos7, NULL, 60, 0, 0.8333333f)); } } +// Likely sets minimap boundaries +void YoshiValley::MinimapSettings() { + D_8018D220 = reinterpret_cast<uint8_t (*)[1024]>(dma_textures(gTextureExhaust0, 0x479, 0xC00)); + D_8018D2A0 = 0.018f; + D_8018D2E0 = 61; + D_8018D2E8 = 38; +} + +void YoshiValley::InitCourseObjects() { +} + void YoshiValley::UpdateCourseObjects() { } diff --git a/src/engine/courses/YoshiValley.h b/src/engine/courses/YoshiValley.h index d0de64752..a986cd902 100644 --- a/src/engine/courses/YoshiValley.h +++ b/src/engine/courses/YoshiValley.h @@ -26,8 +26,7 @@ public: // course_texture* textures, const char* displaylists, size_t dlSize); virtual void Load() override; virtual void LoadTextures() override; - virtual void SpawnActors() override; - virtual void SpawnVehicles() override; + virtual void BeginPlay() override; virtual void MinimapSettings() override; virtual void InitCourseObjects() override; virtual void UpdateCourseObjects() override; diff --git a/src/engine/items/Items.cpp b/src/engine/items/Items.cpp new file mode 100644 index 000000000..e69de29bb --- /dev/null +++ b/src/engine/items/Items.cpp diff --git a/src/engine/items/Items.h b/src/engine/items/Items.h new file mode 100644 index 000000000..e69de29bb --- /dev/null +++ b/src/engine/items/Items.h diff --git a/src/engine/objects/BombKart.cpp b/src/engine/objects/BombKart.cpp index c33b4b107..fc27103ed 100644 --- a/src/engine/objects/BombKart.cpp +++ b/src/engine/objects/BombKart.cpp @@ -1,4 +1,5 @@ #include <libultraship.h> +#include "engine/objects/Object.h" #include "BombKart.h" #include <vector> @@ -71,15 +72,9 @@ OBombKart::OBombKart(Vec3f pos, TrackWaypoint* waypoint, uint16_t waypointIndex, WheelPos[3][2] = _pos[2]; check_bounding_collision(&_Collision, 2.0f, _pos[0], _pos[1], _pos[2]); - _count++; -} - -void OBombKart::Spawn() { find_unused_obj_index(&ObjectIndex); -} - -void OBombKart::BeginPlay() { + _count++; } void OBombKart::Tick() { @@ -332,8 +327,21 @@ void OBombKart::Tick() { } void OBombKart::Draw(s32 cameraId) { - if (gModeSelection == BATTLE) { + for (size_t playerId = 0; playerId < NUM_BOMB_KARTS_BATTLE; playerId++) { + Object* object = &gObjectList[ObjectIndex]; + if (object->state != 0) { + s32 primAlpha = object->primAlpha; + Player* player = &gPlayerOne[playerId]; + object->pos[0] = player->pos[0]; + object->pos[1] = player->pos[1] - 2.0; + object->pos[2] = player->pos[2]; + object->surfaceHeight = player->unk_074; + func_800563DC(ObjectIndex, cameraId, primAlpha); + func_8005669C(ObjectIndex, cameraId, primAlpha); + func_800568A0(ObjectIndex, cameraId); + } + } return; } @@ -345,15 +353,10 @@ void OBombKart::Draw(s32 cameraId) { } } - Camera* camera; - s32 temp_s4; - s32 i; - s32 state; - if (gGamestate == ENDING) { cameraId = 0; } - camera = &camera1[cameraId]; + Camera* camera = &camera1[cameraId]; if (cameraId == PLAYER_ONE) { if (is_obj_flag_status_active(ObjectIndex, 0x00200000) != 0) { Unk_4A = 0; @@ -364,12 +367,12 @@ void OBombKart::Draw(s32 cameraId) { } // huh??? - state = State; + s32 state = State; if (State != States::DISABLED) { gObjectList[ObjectIndex].pos[0] = Pos[0]; gObjectList[ObjectIndex].pos[1] = Pos[1]; gObjectList[ObjectIndex].pos[2] = Pos[2]; - temp_s4 = func_8008A364(ObjectIndex, cameraId, 0x31C4U, 0x000001F4); + s32 temp_s4 = func_8008A364(ObjectIndex, cameraId, 0x31C4U, 0x000001F4); if (is_obj_flag_status_active(ObjectIndex, VISIBLE) != 0) { set_object_flag(ObjectIndex, 0x00200000); D_80183E80[0] = 0; @@ -385,28 +388,7 @@ void OBombKart::Draw(s32 cameraId) { } void OBombKart::DrawBattle(s32 cameraId) { - if (gModeSelection != BATTLE) { - return; - } - Player* temp_v0; - s32 temp_s1; - s32 playerId; - Object* object; - - for (playerId = 0; playerId < gPlayerCount; playerId++) { - object = &gObjectList[ObjectIndex]; - if (object->state != 0) { - temp_s1 = object->primAlpha; - temp_v0 = &gPlayerOne[playerId]; - object->pos[0] = temp_v0->pos[0]; - object->pos[1] = temp_v0->pos[1] - 2.0; - object->pos[2] = temp_v0->pos[2]; - object->surfaceHeight = temp_v0->unk_074; - func_800563DC(ObjectIndex, cameraId, temp_s1); - func_8005669C(ObjectIndex, cameraId, temp_s1); - func_800568A0(ObjectIndex, cameraId); - } - } + } void OBombKart::SomeRender(Vec3f arg1) { @@ -455,10 +437,6 @@ void OBombKart::Waypoint(s32 screenId) { playerHUD[screenId].unk_74 = 1; } -void OBombKart::Collision(s32 playerId, Player* player) { - -} - Player* OBombKart::FindTarget() { for (size_t i = 0; i < NUM_PLAYERS; i++) { if (gPlayers[i].type & PLAYER_HUMAN) { diff --git a/src/engine/objects/BombKart.h b/src/engine/objects/BombKart.h index 7ceba7ecb..3663ee664 100644 --- a/src/engine/objects/BombKart.h +++ b/src/engine/objects/BombKart.h @@ -1,7 +1,7 @@ #pragma once #include <libultraship.h> -#include "src/engine/vehicles/Vehicle.h" +#include "engine/objects/Object.h" #include <vector> #include "engine/Matrix.h" @@ -22,8 +22,8 @@ extern "C" { * This differs from the other vehicle classes in that it does not get added to the standard actor list * So this is sort of its own thing. Draw call in different place too. */ -class OBombKart { -private: +class OBombKart : public OObject { +public: enum States : uint16_t { // 0,1,3,5 DISABLED, CCW, @@ -34,8 +34,6 @@ private: PODIUM_CEREMONY, }; -public: - const char* Type; Vec3f Pos; @@ -63,12 +61,9 @@ public: return _count; } - void Spawn(); - void BeginPlay(); - void Tick(); - void Draw(s32 cameraId); + virtual void Tick() override; + virtual void Draw(s32 cameraId) override; void DrawBattle(s32 cameraId); - void Collision(s32 playerId, Player* player); void SomeRender(Vec3f arg1); void LoadMtx(); void Waypoint(s32 screenId); diff --git a/src/engine/objects/Boos.cpp b/src/engine/objects/Boos.cpp index 0e64c673e..f06abc8f7 100644 --- a/src/engine/objects/Boos.cpp +++ b/src/engine/objects/Boos.cpp @@ -115,7 +115,6 @@ void OBoos::func_8007CA70(void) { if (_isActive == false) { _playerId = OBoos::func_8007C9F8(); point = &gNearestWaypointByPlayerId[_playerId]; - printf("point %d\n", *point); if ((*point > _active.Start) && (*point < _active.End)) { // First group entrance OBoos::BooStart(0, _playerId); @@ -123,7 +122,6 @@ void OBoos::func_8007CA70(void) { } if (_isActive == true) { point = &gNearestWaypointByPlayerId[_playerId]; - printf("point %d\n", *point); if ((*point > _leftBoundary.Start) && (*point < _leftBoundary.End)) { // First group exit reverse direction @@ -240,7 +238,6 @@ void OBoos::BooStart(s32 group, s32 playerId) { s16 temp_s4; s16 temp_s5; SplineData* spline; -printf("Boo Start\n"); for (size_t i = 0; i < _numBoos; i++) { objectIndex = _indices[i]; // indexObjectList3[group + i]; init_object(objectIndex, 1); @@ -262,7 +259,6 @@ printf("Boo Start\n"); void OBoos::BooExit(s32 group) { s32 objectIndex; -printf("Boo Exit\n"); for (size_t i = 0; i < _numBoos; i++) { objectIndex = _indices[i]; //indexObjectList3[group + temp_a0]; gObjectList[objectIndex].unk_0DC += 1; diff --git a/src/engine/objects/Lakitu.cpp b/src/engine/objects/Lakitu.cpp index 1c8547bc8..93a87f5e1 100644 --- a/src/engine/objects/Lakitu.cpp +++ b/src/engine/objects/Lakitu.cpp @@ -160,12 +160,12 @@ void OLakitu::func_800791F0(s32 objectIndex, s32 playerId) { if ((gObjectList[objectIndex].unk_0D8 != 3) && (gObjectList[objectIndex].unk_0D8 != 7)) { func_800722CC(objectIndex, 1); - if (CourseManager_GetProps()->LakituTowType == LakituTowType::ICE) { + if (CM_GetProps()->LakituTowType == LakituTowType::ICE) { player->unk_0CA &= 0xFFEF; } } - if (CourseManager_GetProps()->LakituTowType == LakituTowType::ICE) { + if (CM_GetProps()->LakituTowType == LakituTowType::ICE) { func_800722CC(objectIndex, 0x00000010); player->unk_0CA &= 0xFFDF; } @@ -362,7 +362,7 @@ void OLakitu::func_800797AC(s32 playerId) { objectIndex = gIndexLakituList[playerId]; player = &gPlayerOne[playerId]; //if ((GetCourse() == GetSherbetLand()) && (player->unk_0CA & 1)) { - if ((CourseManager_GetProps()->LakituTowType == LakituTowType::ICE) && (player->unk_0CA & 1)) { + if ((CM_GetProps()->LakituTowType == LakituTowType::ICE) && (player->unk_0CA & 1)) { init_object(objectIndex, 7); player->unk_0CA |= 0x10; } else { diff --git a/src/engine/objects/Object.cpp b/src/engine/objects/Object.cpp index eab390aa1..eb23b853e 100644 --- a/src/engine/objects/Object.cpp +++ b/src/engine/objects/Object.cpp @@ -16,7 +16,6 @@ OObject::OObject() {} void OObject::Tick() { } void OObject::Tick60fps() {} void OObject::Draw(s32 cameraId) { } -void OObject::Collision() {} void OObject::Expire() { } void OObject::Destroy() { PendingDestroy = true; diff --git a/src/engine/objects/Object.h b/src/engine/objects/Object.h index af2df81b5..c02deda23 100644 --- a/src/engine/objects/Object.h +++ b/src/engine/objects/Object.h @@ -20,7 +20,6 @@ public: virtual void Tick(); virtual void Tick60fps(); virtual void Draw(s32 cameraId); - virtual void Collision(); virtual void Expire(); virtual void Destroy(); // Mark object for deletion at the start of the next frame }; diff --git a/src/engine/vehicles/Boat.cpp b/src/engine/vehicles/Boat.cpp index 6a3c2beb1..460331f97 100644 --- a/src/engine/vehicles/Boat.cpp +++ b/src/engine/vehicles/Boat.cpp @@ -39,10 +39,6 @@ ABoat::ABoat(f32 speed, u32 waypoint) { Velocity[1] = 0.0f; Velocity[2] = 0.0f; - _count++; -} - -void ABoat::Spawn() { Vec3s paddleWheelBoatRot; if (IsActive == 1) { f32 origXPos = Position[0]; @@ -56,10 +52,18 @@ void ABoat::Spawn() { ActorIndex = add_actor_to_empty_slot(Position, paddleWheelBoatRot, Velocity, ACTOR_PADDLE_BOAT); } + + _count++; +} + +void ABoat::Draw(Camera* camera) { + +} + +bool ABoat::IsMod() { + return true; } -void ABoat::BeginPlay() {} -void ABoat::Draw(s32 playerId) {} void ABoat::Tick() { Path2D* waypoint; struct Actor* paddleBoatActor; @@ -159,7 +163,7 @@ void ABoat::Tick() { } } -void ABoat::Collision(s32 playerId, Player* player) { +void ABoat::VehicleCollision(s32 playerId, Player* player) { f32 x_diff; f32 y_diff; f32 z_diff; diff --git a/src/engine/vehicles/Boat.h b/src/engine/vehicles/Boat.h index 4a1e2d124..dcdd89977 100644 --- a/src/engine/vehicles/Boat.h +++ b/src/engine/vehicles/Boat.h @@ -1,7 +1,7 @@ #pragma once #include <libultraship.h> -#include "Vehicle.h" +#include "Actor.h" #include <vector> extern "C" { @@ -9,9 +9,7 @@ extern "C" { #include "vehicles.h" } -class AVehicle; // Forward declare - -class ABoat : public AVehicle { +class ABoat : public AActor { public: const char* Type = "mk:boat"; @@ -40,12 +38,11 @@ class ABoat : public AVehicle { return _count; } - virtual void Spawn() override; - virtual void BeginPlay() override; virtual void Tick() override; - virtual void Draw(s32 playerId) override; - virtual void Collision(s32 playerId, Player* player) override; + virtual void Draw(Camera* camera) override; + virtual void VehicleCollision(s32 playerId, Player* player) override; virtual s32 AddSmoke(size_t, Vec3f, f32); + virtual bool IsMod() override; private: static size_t _count; diff --git a/src/engine/vehicles/Bus.cpp b/src/engine/vehicles/Bus.cpp index c8b81b4c5..43b6e7406 100644 --- a/src/engine/vehicles/Bus.cpp +++ b/src/engine/vehicles/Bus.cpp @@ -57,31 +57,29 @@ ABus::ABus(f32 speedA, f32 speedB, TrackWaypoint* path, uint32_t waypoint) { } D_801631C8 = 10; - _count++; -} + spawn_vehicle_on_road(Position, Rotation, Velocity, WaypointIndex, SomeMultiplierTheSequel, + Speed); + ActorIndex = add_actor_to_empty_slot(Position, Rotation, Velocity, ACTOR_SCHOOL_BUS); -void ABus::Spawn() { - spawn_vehicle_on_road(Position, Rotation, Velocity, WaypointIndex, SomeMultiplierTheSequel, - Speed); - ActorIndex = add_actor_to_empty_slot(Position, Rotation, Velocity, ACTOR_SCHOOL_BUS); + _count++; } -void ABus::BeginPlay() { - +bool ABus::IsMod() { + return true; } -void ABus::Draw(s32 playerId) { +void ABus::Draw(Camera* camera) { s32 var_v0; s32 var_s2; s32 waypointCount; u16 temp_a1; waypointCount = gWaypointCountByPathIndex[0]; - if (!(gPlayers[playerId].unk_094 < 1.6666666666666667)) { + if (!(gPlayers[camera->playerId].unk_094 < 1.6666666666666667)) { temp_a1 = WaypointIndex; for (var_v0 = 0; var_v0 < 0x18; var_v0 += 3) { if (((sSomeNearestWaypoint + var_v0) % waypointCount) == temp_a1) { - D_801634F8[playerId].unk4 = func_800145A8(SomeType, D_80163068[playerId], temp_a1); + D_801634F8[camera->playerId].unk4 = func_800145A8(SomeType, D_80163068[camera->playerId], temp_a1); return; } } @@ -153,7 +151,7 @@ void ABus::Tick() { vehicleActor->velocity[2] = Velocity[2]; } -void ABus::Collision(s32 playerId, Player* player) { +void ABus::VehicleCollision(s32 playerId, Player* player) { f32 temp_f12; f32 temp_f14; f32 temp_f22; diff --git a/src/engine/vehicles/Bus.h b/src/engine/vehicles/Bus.h index a7ba3d3e5..c7f3f475e 100644 --- a/src/engine/vehicles/Bus.h +++ b/src/engine/vehicles/Bus.h @@ -1,7 +1,7 @@ #pragma once #include <libultraship.h> -#include "Vehicle.h" +#include "Actor.h" #include <vector> extern "C" { @@ -11,9 +11,7 @@ extern "C" { #include "sounds.h" } -class AVehicle; // Forward declare - -class ABus : public AVehicle { +class ABus : public AActor { public: const char* Type; @@ -43,11 +41,10 @@ class ABus : public AVehicle { return _count; } - virtual void Spawn() override; - virtual void BeginPlay() override; virtual void Tick() override; - virtual void Draw(s32 playerId) override; - virtual void Collision(s32 playerId, Player* player) override; + virtual void Draw(Camera* camera) override; + virtual void VehicleCollision(s32 playerId, Player* player) override; + virtual bool IsMod() override; private: static size_t _count; diff --git a/src/engine/vehicles/Car.cpp b/src/engine/vehicles/Car.cpp index 8f8d24d1f..a5dd49007 100644 --- a/src/engine/vehicles/Car.cpp +++ b/src/engine/vehicles/Car.cpp @@ -57,17 +57,15 @@ ACar::ACar(f32 speedA, f32 speedB, TrackWaypoint* path, uint32_t waypoint) { } D_801631C8 = 10; - _count++; -} - -void ACar::Spawn() { spawn_vehicle_on_road(Position, Rotation, Velocity, WaypointIndex, SomeMultiplierTheSequel, Speed); ActorIndex = add_actor_to_empty_slot(Position, Rotation, Velocity, ACTOR_CAR); -} -void ACar::BeginPlay() { + _count++; +} +bool ACar::IsMod() { + return true; } void ACar::Tick() { @@ -135,25 +133,25 @@ void ACar::Tick() { vehicleActor->velocity[2] = Velocity[2]; } -void ACar::Draw(s32 playerId) { +void ACar::Draw(Camera* camera) { s32 var_v0; s32 var_s2; s32 waypointCount; u16 temp_a1; waypointCount = gWaypointCountByPathIndex[0]; - if (!(gPlayers[playerId].unk_094 < 1.6666666666666667)) { + if (!(gPlayers[camera->playerId].unk_094 < 1.6666666666666667)) { temp_a1 = WaypointIndex; for (var_v0 = 0; var_v0 < 0x18; var_v0 += 3) { if (((sSomeNearestWaypoint + var_v0) % waypointCount) == temp_a1) { - D_801634F8[playerId].unk4 = func_800145A8(SomeType, D_80163068[playerId], temp_a1); + D_801634F8[camera->playerId].unk4 = func_800145A8(SomeType, D_80163068[camera->playerId], temp_a1); return; } } } } -void ACar::Collision(s32 playerId, Player* player) { +void ACar::VehicleCollision(s32 playerId, Player* player) { f32 temp_f12; f32 temp_f14; f32 temp_f22; diff --git a/src/engine/vehicles/Car.h b/src/engine/vehicles/Car.h index 6613e4c56..97bd47e2e 100644 --- a/src/engine/vehicles/Car.h +++ b/src/engine/vehicles/Car.h @@ -1,7 +1,7 @@ #pragma once #include <libultraship.h> -#include "Vehicle.h" +#include "Actor.h" #include <vector> extern "C" { @@ -11,9 +11,7 @@ extern "C" { #include "sounds.h" } -class AVehicle; // Forward declare - -class ACar : public AVehicle { +class ACar : public AActor { public: explicit ACar(f32 speedA, f32 speedB, TrackWaypoint* path, uint32_t waypoint); @@ -43,11 +41,10 @@ class ACar : public AVehicle { f32 SomeArg4 = 8.5f; u32 SoundBits = SOUND_ARG_LOAD(0x51, 0x01, 0x80, 0x05); - virtual void Spawn() override; - virtual void BeginPlay() override; virtual void Tick() override; - virtual void Draw(s32 playerId) override; - virtual void Collision(s32 playerId, Player* player) override; + virtual void Draw(Camera*) override; + virtual void VehicleCollision(s32 playerId, Player* player) override; + virtual bool IsMod() override; private: static size_t _count; };
\ No newline at end of file diff --git a/src/engine/vehicles/TankerTruck.cpp b/src/engine/vehicles/TankerTruck.cpp index 2c32d5bd6..a6b94429f 100644 --- a/src/engine/vehicles/TankerTruck.cpp +++ b/src/engine/vehicles/TankerTruck.cpp @@ -57,31 +57,29 @@ ATankerTruck::ATankerTruck(f32 speedA, f32 speedB, TrackWaypoint* path, uint32_t } D_801631C8 = 10; - _count++; -} + spawn_vehicle_on_road(Position, Rotation, Velocity, WaypointIndex, SomeMultiplierTheSequel, + Speed); + ActorIndex = add_actor_to_empty_slot(Position, Rotation, Velocity, ACTOR_TANKER_TRUCK); -void ATankerTruck::Spawn() { - spawn_vehicle_on_road(Position, Rotation, Velocity, WaypointIndex, SomeMultiplierTheSequel, - Speed); - ActorIndex = add_actor_to_empty_slot(Position, Rotation, Velocity, ACTOR_TANKER_TRUCK); + _count++; } -void ATankerTruck::BeginPlay() { - +bool ATankerTruck::IsMod() { + return true; } -void ATankerTruck::Draw(s32 playerId) { +void ATankerTruck::Draw(Camera* camera) { s32 var_v0; s32 var_s2; s32 waypointCount; u16 temp_a1; waypointCount = gWaypointCountByPathIndex[0]; - if (!(gPlayers[playerId].unk_094 < 1.6666666666666667)) { + if (!(gPlayers[camera->playerId].unk_094 < 1.6666666666666667)) { temp_a1 = WaypointIndex; for (var_v0 = 0; var_v0 < 0x18; var_v0 += 3) { if (((sSomeNearestWaypoint + var_v0) % waypointCount) == temp_a1) { - D_801634F8[playerId].unk4 = func_800145A8(SomeType, D_80163068[playerId], temp_a1); + D_801634F8[camera->playerId].unk4 = func_800145A8(SomeType, D_80163068[camera->playerId], temp_a1); return; } } @@ -153,7 +151,7 @@ void ATankerTruck::Tick() { vehicleActor->velocity[2] = Velocity[2]; } -void ATankerTruck::Collision(s32 playerId, Player* player) { +void ATankerTruck::VehicleCollision(s32 playerId, Player* player) { f32 temp_f12; f32 temp_f14; f32 temp_f22; diff --git a/src/engine/vehicles/TankerTruck.h b/src/engine/vehicles/TankerTruck.h index fdf838d99..e109115a9 100644 --- a/src/engine/vehicles/TankerTruck.h +++ b/src/engine/vehicles/TankerTruck.h @@ -1,7 +1,7 @@ #pragma once #include <libultraship.h> -#include "Vehicle.h" +#include "Actor.h" #include <vector> extern "C" { @@ -11,9 +11,7 @@ extern "C" { #include "sounds.h" } -class AVehicle; // Forward declare - -class ATankerTruck : public AVehicle { +class ATankerTruck : public AActor { public: const char* Type; @@ -43,11 +41,10 @@ class ATankerTruck : public AVehicle { return _count; } - virtual void Spawn() override; - virtual void BeginPlay() override; virtual void Tick() override; - virtual void Draw(s32 playerId) override; - virtual void Collision(s32 playerId, Player* player) override; + virtual void Draw(Camera* camera) override; + virtual void VehicleCollision(s32 playerId, Player* player) override; + virtual bool IsMod() override; private: static size_t _count; diff --git a/src/engine/vehicles/Train.cpp b/src/engine/vehicles/Train.cpp index 0e9af21ed..14d9c9763 100644 --- a/src/engine/vehicles/Train.cpp +++ b/src/engine/vehicles/Train.cpp @@ -76,10 +76,6 @@ ATrain::ATrain(ATrain::TenderStatus tender, size_t numCarriages, f32 speed, uint AnotherSmokeTimer = 0; - _count++; -} - -void ATrain::Spawn() { TrainCarStuff* tempLocomotive; TrainCarStuff* tempTender; TrainCarStuff* tempPassengerCar; @@ -128,9 +124,12 @@ void ATrain::Spawn() { ACTOR_TRAIN_PASSENGER_CAR); } } + + _count++; } -void ATrain::BeginPlay() { +bool ATrain::IsMod() { + return true; } void ATrain::SyncComponents(TrainCarStuff* trainCar, s16 orientationY) { @@ -223,7 +222,7 @@ void ATrain::Tick() { } } -void ATrain::Collision(s32 playerId, Player* player) { +void ATrain::VehicleCollision(s32 playerId, Player* player) { TrainCarStuff* trainCar; f32 playerPosX; f32 playerPosZ; @@ -274,7 +273,7 @@ void ATrain::Collision(s32 playerId, Player* player) { } -void ATrain::Draw(s32 playerId) { +void ATrain::Draw(Camera* camera) { } s32 ATrain::AddSmoke(s32 trainIndex, Vec3f pos, f32 velocity) { diff --git a/src/engine/vehicles/Train.h b/src/engine/vehicles/Train.h index e2c1d89f4..b5100586e 100644 --- a/src/engine/vehicles/Train.h +++ b/src/engine/vehicles/Train.h @@ -1,7 +1,7 @@ #pragma once #include <libultraship.h> -#include "Vehicle.h" +#include "Actor.h" #include <vector> extern "C" { @@ -9,13 +9,11 @@ extern "C" { #include "vehicles.h" } -class AVehicle; // Forward declare - /** * Note that you can only remove the tender if there are no carriages * @arg waypoint initial waypoint to spawn at. */ -class ATrain : public AVehicle { +class ATrain : public AActor { public: enum TenderStatus { @@ -49,11 +47,10 @@ class ATrain : public AVehicle { return _count; } - virtual void Spawn() override; - virtual void BeginPlay() override; virtual void Tick() override; - virtual void Draw(s32 playerId) override; - virtual void Collision(s32 playerId, Player* player) override; + virtual void Draw(Camera* camera) override; + virtual void VehicleCollision(s32 playerId, Player* player) override; + virtual bool IsMod() override; s32 AddSmoke(s32 trainIndex, Vec3f pos, f32 velocity); void SyncComponents(TrainCarStuff* trainCar, s16 orientationY); diff --git a/src/engine/vehicles/Truck.cpp b/src/engine/vehicles/Truck.cpp index c865fed70..68ef87353 100644 --- a/src/engine/vehicles/Truck.cpp +++ b/src/engine/vehicles/Truck.cpp @@ -57,48 +57,29 @@ ATruck::ATruck(f32 speedA, f32 speedB, TrackWaypoint* path, uint32_t waypoint) { } D_801631C8 = 10; - _count++; -} + spawn_vehicle_on_road(Position, Rotation, Velocity, WaypointIndex, SomeMultiplierTheSequel, + Speed); + ActorIndex = add_actor_to_empty_slot(Position, Rotation, Velocity, ACTOR_BOX_TRUCK); -void ATruck::Spawn() { - spawn_vehicle_on_road(Position, Rotation, Velocity, WaypointIndex, SomeMultiplierTheSequel, - Speed); - ActorIndex = add_actor_to_empty_slot(Position, Rotation, Velocity, ACTOR_BOX_TRUCK); - //if (Compare(Dict[Type], "mk:bus")) { - // spawn_vehicle_on_road(Position, Rotation, Velocity, WaypointIndex, SomeMultiplierTheSequel, Speed); - // ActorIndex = add_actor_to_empty_slot(Position, Rotation, - // Velocity, ACTOR_SCHOOL_BUS); - //} - // if (Compare(Dict[Type], "mk:tanker")) { - // spawn_vehicle_on_road(tempTankerTruck); - // tempTankerTruck->actorIndex = - // add_actor_to_empty_slot(tempTankerTruck->position, tempTankerTruck->rotation, - // tempTankerTruck->velocity, ACTOR_TANKER_TRUCK); - // } - // if (Compare(Dict[Type], "mk:car")) { - // tempCar = &gCarList[loopIndex]; - // spawn_vehicle_on_road(tempCar); - // tempCar->actorIndex = - // add_actor_to_empty_slot(tempCar->position, tempCar->rotation, tempCar->velocity, ACTOR_CAR); - // } + _count++; } -void ATruck::BeginPlay() { - +bool ATruck::IsMod() { + return true; } -void ATruck::Draw(s32 playerId) { +void ATruck::Draw(Camera* camera) { s32 var_v0; s32 var_s2; s32 waypointCount; u16 temp_a1; waypointCount = gWaypointCountByPathIndex[0]; - if (!(gPlayers[playerId].unk_094 < 1.6666666666666667)) { + if (!(gPlayers[camera->playerId].unk_094 < 1.6666666666666667)) { temp_a1 = WaypointIndex; for (var_v0 = 0; var_v0 < 0x18; var_v0 += 3) { if (((sSomeNearestWaypoint + var_v0) % waypointCount) == temp_a1) { - D_801634F8[playerId].unk4 = func_800145A8(SomeType, D_80163068[playerId], temp_a1); + D_801634F8[camera->playerId].unk4 = func_800145A8(SomeType, D_80163068[camera->playerId], temp_a1); return; } } @@ -170,7 +151,7 @@ void ATruck::Tick() { vehicleActor->velocity[2] = Velocity[2]; } -void ATruck::Collision(s32 playerId, Player* player) { +void ATruck::VehicleCollision(s32 playerId, Player* player) { f32 temp_f12; f32 temp_f14; f32 temp_f22; diff --git a/src/engine/vehicles/Truck.h b/src/engine/vehicles/Truck.h index f9f65b2fc..c18ce86a5 100644 --- a/src/engine/vehicles/Truck.h +++ b/src/engine/vehicles/Truck.h @@ -1,7 +1,7 @@ #pragma once #include <libultraship.h> -#include "Vehicle.h" +#include "Actor.h" #include <vector> extern "C" { @@ -11,9 +11,7 @@ extern "C" { #include "sounds.h" } -class AVehicle; // Forward declare - -class ATruck : public AVehicle { +class ATruck : public AActor { public: const char* Type; @@ -43,11 +41,10 @@ class ATruck : public AVehicle { return _count; } - virtual void Spawn() override; - virtual void BeginPlay() override; virtual void Tick() override; - virtual void Draw(s32 playerId) override; - virtual void Collision(s32 playerId, Player* player) override; + virtual void Draw(Camera* camera) override; + virtual void VehicleCollision(s32 playerId, Player* player) override; + virtual bool IsMod() override; private: static size_t _count; diff --git a/src/engine/vehicles/Vehicle.cpp b/src/engine/vehicles/Vehicle.cpp deleted file mode 100644 index 6c0890511..000000000 --- a/src/engine/vehicles/Vehicle.cpp +++ /dev/null @@ -1,19 +0,0 @@ -#include "Vehicle.h" - - -AVehicle::AVehicle() {} - -void AVehicle::Spawn() { -} - -void AVehicle::BeginPlay() { -} - -void AVehicle::Tick() { -} - -void AVehicle::Draw(s32 playerId) { -} - -void AVehicle::Collision(s32 playerId, Player* player) { -} diff --git a/src/engine/vehicles/Vehicle.h b/src/engine/vehicles/Vehicle.h deleted file mode 100644 index 0b79d06aa..000000000 --- a/src/engine/vehicles/Vehicle.h +++ /dev/null @@ -1,27 +0,0 @@ -#ifndef VEHICLE_H -#define VEHICLE_H - -#include <libultraship.h> - -extern "C" { -#include "common_structs.h" -} - -// Base class -class AVehicle { -public: - virtual ~AVehicle() = default; // Virtual destructor for proper cleanup in derived classes - - explicit AVehicle(); - - const char* Type; - uint8_t uuid[16]; - - virtual void Spawn(); - virtual void BeginPlay(); - virtual void Tick(); - virtual void Draw(s32 playerId); - virtual void Collision(s32 playerId, Player* player); -}; - -#endif // VEHICLE_H
\ No newline at end of file |
