#pragma once #include #include "GameObject.h" #include "Cup.h" #include "vehicles/Vehicle.h" #include "vehicles/Train.h" #include "vehicles/Car.h" #include "vehicles/OBombKart.h" #include "vehicles/Train.h" #include "TrainCrossing.h" #include "vehicles/OThwomp.h" #include "vehicles/OPenguin.h" #include #include "Actor.h" extern "C" { #include "camera.h" #include "objects.h" #include "engine/Engine.h" }; class Cup; // <-- Forward declaration class Course; class AVehicle; class ATrain; class ACar; class TrainCrossing; class OThwomp; 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 Hud; std::vector Objects; std::vector Shadows; std::vector Karts; std::vector Effects; } Matrix; public: explicit World(); void AddCourse(Course* course); AActor* AddActor(AActor* actor); struct Actor* AddBaseActor(); AActor* GetActor(size_t index); void TickActors(); void RemoveExpiredActors(); AActor* ConvertActorToAActor(Actor* actor); Actor* ConvertAActorToActor(AActor* actor); Object* AddObject(std::unique_ptr object); CProperties* GetCourseProps(); void TickObjects(); void DrawObjects(Camera *camera); void ExpiredObjects(); void DestroyObjects(); Object *GetObjectByIndex(size_t); void AddCup(Cup*); void SetCup(Cup* cup); const char* GetCupName(); u32 GetCupIndex(); u32 NextCup(); u32 PreviousCup(); void SetCourseFromCup(); World* GetWorld(void); // These are only for browsing through the course list void SetCourse(const char*); void NextCourse(void); void PreviousCourse(void); Matrix Mtx; // Holds all available courses Course* CurrentCourse; Cup* CurrentCup; std::vector Cups; size_t CupIndex = 1; std::vector Actors; std::vector> GameObjects; /** Actors */ void AddBoat(f32 speed, uint32_t waypoint); void AddTrain(ATrain::TenderStatus tender, size_t numCarriages, f32 speed, uint32_t waypoint); void AddTruck(f32 speedA, f32 speedB, TrackWaypoint* path, uint32_t waypoint); void AddBus(f32 speedA, f32 speedB, TrackWaypoint* path, uint32_t waypoint); void AddTankerTruck(f32 speedA, f32 speedB, TrackWaypoint* path, uint32_t waypoint); void AddCar(f32 speedA, f32 speedB, TrackWaypoint* path, uint32_t waypoint); std::vector> Vehicles; void ClearVehicles(void); /** Objects **/ std::vector> BombKarts; void AddBombKart(Vec3f pos, TrackWaypoint* waypoint, uint16_t waypointIndex, uint16_t state, f32 unk_3C); std::vector> Thwomps; void AddThwomp(s16 x, s16 z, s16 direction, f32 scale, s16 behaviour, s16 primAlpha, u16 boundingBoxSize = 7); std::vector> Penguins; std::shared_ptr AddPenguin(Vec3f pos, u16 direction, OPenguin::PenguinType type, OPenguin::Behaviour behaviour); TrainCrossing* AddCrossing(Vec3f position, u32 waypointMin, u32 waypointMax, f32 approachRadius, f32 exitRadius); std::vector> Crossings; std::vector Courses; size_t CourseIndex = 0; // For browsing courses. private: }; extern World gWorldInstance;