diff options
| author | MegaMech <MegaMech@users.noreply.github.com> | 2024-10-05 15:31:31 -0600 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-10-05 15:31:31 -0600 |
| commit | 75297759ee906b103ff9714dad17e683f1757b7f (patch) | |
| tree | 2a81aff6c8e1d2be2806f34f8850c74499980479 /src/engine/World.cpp | |
| parent | 447fd8b29057e8dcc223507e6b7d6bc448c6f7d8 (diff) | |
[modding] Course Mod Support (#104)
* Course Manager
* Course
* Test
* Render
* That escalated quickly
* update
* properties
* Properties
* test
* Fix compile
* Add World
* skycolours
* Skybox Colours done
* Cleanup
* test
* Game runs again
* update
* Game run again
* Cup Works
* continue
* Add Courses
* clouds
* changes
* fixes
* update
* Fix compile
* update
* A few changes
* More Updates
* More refactors
* Fixes
* Fix ai behaviour
* Changes
* Fix courses
* test course test not working
* CUSTOM
* TestCourse works kinda
* fixes
* test course works
* cleanup
---------
Co-authored-by: MegaMech <7255464+MegaMech@users.noreply.github.com>
Diffstat (limited to 'src/engine/World.cpp')
| -rw-r--r-- | src/engine/World.cpp | 152 |
1 files changed, 152 insertions, 0 deletions
diff --git a/src/engine/World.cpp b/src/engine/World.cpp new file mode 100644 index 000000000..05a725aff --- /dev/null +++ b/src/engine/World.cpp @@ -0,0 +1,152 @@ +#include <libultraship.h> +#include "World.h" +#include "Cup.h" +#include "courses/Course.h" + +extern "C" { + #include "camera.h" + #include "objects.h" + #include "main.h" + #include "engine/Engine.h" + #include "defines.h" +} + +World::World() {} + +Course* CurrentCourse; +Cup* CurrentCup; + +Cup* World::AddCup(const char* name, std::vector<Course*> courses) { + // Create a new unique_ptr for Cup + auto cup = std::make_shared<Cup>(name, courses); + + // Get raw pointer before moving the ownership + Cup* tmp = cup.get(); + + // Add the Cup to the container + Cups.push_back(std::move(cup)); + + // Return the raw pointer to the Cup + return tmp; +} + +Cup* World::GetCup() { + return Cups[CupIndex].get(); +} + +void World::SetCourseFromCup() { + CurrentCourse = CurrentCup->GetCourse(); +} + +//const char* World::GetCupName() { +// //return this->Cups[CupIndex].Name; +//} + +void World::SetCupIndex(int16_t courseId) { + + this->CupIndex = courseId; +} + +u32 World::GetCupIndex() { + return this->CupIndex; +} + +u32 World::NextCup() { + s32 hack = 1; + + // Prevent battle mode + if (gModeSelection == GRAND_PRIX) { + hack = 2; + } + + if (this->CupIndex < Cups.size() - 2) { + CupIndex++; + CurrentCup = Cups[CupIndex].get(); + return CupIndex; + } +} + +u32 World::PreviousCup() { + if (CupIndex > 0) { + CupIndex--; + CurrentCup = Cups[CupIndex].get(); + return CupIndex; + } +} + +void World::SetCup() { + CurrentCup = Cups[CupIndex].get(); + CurrentCup->CursorPosition = 0; +} + +CProperties* World::GetCourseProps() { + if (Courses[CourseIndex]) { + return (CProperties*) &Courses[CourseIndex]->Props; + } + return nullptr; +} + +void World::SetCourse(const char*name) { + for (size_t i = 0; i < Courses.size(); i++) { + if (Courses[i]->Props.Name == name) { + CurrentCourse = Courses[i]; + break; + } + } + std::runtime_error("SetCourse() Course name not found in Courses list"); +} + +void World::NextCourse() { + if (CourseIndex < Courses.size() - 1) { + CourseIndex++; + } else { + CourseIndex = 0; + } + gWorldInstance.CurrentCourse = Courses[CourseIndex]; +} + +void World::PreviousCourse() { + if (CourseIndex > 0) { + CourseIndex--; + } else { + CourseIndex = Courses.size() - 1; + } + gWorldInstance.CurrentCourse = Courses[CourseIndex]; +} + +Object* World::SpawnObject(std::unique_ptr<GameObject> object) { + GameObject* rawPtr = object.get(); + this->GameObjects.push_back(std::move(object)); + return &rawPtr->o; +} + +void World::UpdateObjects() { + for (const auto& object : this->GameObjects) { + object->Update(); + } +} + +void World::RenderObjects(Camera *camera) { + for (const auto& object : this->GameObjects) { + object->Render(camera); + } +} + +void World::ExpiredObjects() { + this->GameObjects.erase( + std::remove_if(this->GameObjects.begin(), this->GameObjects.end(), + [](const std::unique_ptr<GameObject>& object) { return object->uuid == 0; }), // Example condition + this->GameObjects.end()); +} + +void World::DestroyObjects() { + +} + +Object* World::GetObjectByIndex(size_t index) { + if (index < this->GameObjects.size()) { + // Assuming GameActor::a is accessible, use reinterpret_cast if needed + return reinterpret_cast<Object*>(&this->GameObjects[index]->o); + } + return nullptr; // Or handle the error as needed +} |
