summaryrefslogtreecommitdiff
path: root/src/engine
diff options
context:
space:
mode:
authorMegaMech <MegaMech@users.noreply.github.com>2025-07-20 17:13:35 -0600
committerGitHub <noreply@github.com>2025-07-20 17:13:35 -0600
commitadc7dd050f3a2fd13b85b2d799154061d196ef09 (patch)
treea29def388d8045fa491de1c6f6ff42c1f5bfe8c9 /src/engine
parentd62d4bb90050ee195ef10996bd702b770c519eb1 (diff)
Add Rulesets (#494)
Diffstat (limited to 'src/engine')
-rw-r--r--src/engine/Rulesets.cpp48
-rw-r--r--src/engine/Rulesets.h11
-rw-r--r--src/engine/courses/KalimariDesert.cpp4
-rw-r--r--src/engine/courses/ToadsTurnpike.cpp5
-rw-r--r--src/engine/objects/BombKart.cpp5
5 files changed, 73 insertions, 0 deletions
diff --git a/src/engine/Rulesets.cpp b/src/engine/Rulesets.cpp
new file mode 100644
index 000000000..acdbfde2a
--- /dev/null
+++ b/src/engine/Rulesets.cpp
@@ -0,0 +1,48 @@
+#include "Rulesets.h"
+#include "objects/Thwomp.h"
+#include "objects/Trophy.h"
+
+extern "C" {
+#include "code_800029B0.h"
+#include "memory.h"
+}
+
+// Before the game is loaded, and before vertices and displaylists are unpacked.
+// Only runs a single time at the beginning of a track.
+void Rulesets::PreLoad() {
+}
+
+// Just before BeginPlay() (used to spawn actors) is ran.
+// Only runs a single time at the beginning of a track.
+void Rulesets::PreInit() {
+ if (CVarGetInteger("gDisableItemboxes", false) == true) {
+ gPlaceItemBoxes = false;
+ } else {
+ gPlaceItemBoxes = true;
+ }
+}
+
+// Just after BeginPlay() is ran.
+// Only runs a single time at the beginning of a track.
+void Rulesets::PostInit() {
+ if (CVarGetInteger("gAllThwompsAreMarty", false) == true) {
+ for (auto object : gWorldInstance.Objects) {
+ if (OThwomp* thwomp = dynamic_cast<OThwomp*>(object)) {
+ gObjectList[thwomp->_objectIndex].unk_0D5 = OThwomp::States::JAILED; // Sets all the thwomp behaviour flags to marty
+ thwomp->State = OThwomp::States::JAILED;
+ }
+ }
+ }
+
+ if (CVarGetInteger("gAllBombKartsChase", false) == true) {
+ for (auto object : gWorldInstance.Objects) {
+ if (OBombKart* kart = dynamic_cast<OBombKart*>(object)) {
+ kart->State = OBombKart::States::CHASE;
+ }
+ }
+ }
+
+ if (CVarGetInteger("gGoFish", false) == true) {
+ gWorldInstance.AddObject(new OTrophy(FVector(0,0,0), OTrophy::TrophyType::GOLD, OTrophy::Behaviour::GO_FISH));
+ }
+}
diff --git a/src/engine/Rulesets.h b/src/engine/Rulesets.h
new file mode 100644
index 000000000..26e67b594
--- /dev/null
+++ b/src/engine/Rulesets.h
@@ -0,0 +1,11 @@
+#pragma once
+
+#include <libultraship.h>
+#include "World.h"
+
+class Rulesets {
+public:
+ virtual void PreLoad();
+ virtual void PreInit();
+ virtual void PostInit();
+};
diff --git a/src/engine/courses/KalimariDesert.cpp b/src/engine/courses/KalimariDesert.cpp
index 369828581..3ecb3f03d 100644
--- a/src/engine/courses/KalimariDesert.cpp
+++ b/src/engine/courses/KalimariDesert.cpp
@@ -192,6 +192,10 @@ void KalimariDesert::BeginPlay() {
s32 centerWaypoint = 160;
+ _numTrains = CVarGetInteger("gNumTrains", 2);
+ _numCarriages = CVarGetInteger("gNumCarriages", 5);
+ _tender = (ATrain::TenderStatus)CVarGetInteger("gHasTender", 1);
+
// Spawn two trains
for (size_t i = 0; i < _numTrains; ++i) {
uint32_t waypoint = CalculateWaypointDistribution(i, _numTrains, gVehicle2DPathLength, centerWaypoint);
diff --git a/src/engine/courses/ToadsTurnpike.cpp b/src/engine/courses/ToadsTurnpike.cpp
index 0d79cd942..c9f8b9918 100644
--- a/src/engine/courses/ToadsTurnpike.cpp
+++ b/src/engine/courses/ToadsTurnpike.cpp
@@ -176,6 +176,11 @@ void ToadsTurnpike::BeginPlay() {
a /= 2; // Normally vehicle logic is only ran every 2 frames. This slows the vehicles down to match.
b /= 2;
+ _numTrucks = CVarGetInteger("gNumTrucks", 7);
+ _numBuses = CVarGetInteger("gNumBuses", 7);
+ _numTankerTrucks = CVarGetInteger("gNumTankerTrucks", 7);
+ _numCars = CVarGetInteger("gNumCars", 7);
+
// Other game modes spawn seven of each vehicle
if (gModeSelection == TIME_TRIALS) {
_numTrucks = 8;
diff --git a/src/engine/objects/BombKart.cpp b/src/engine/objects/BombKart.cpp
index a9dd3a22e..78d4762a9 100644
--- a/src/engine/objects/BombKart.cpp
+++ b/src/engine/objects/BombKart.cpp
@@ -253,6 +253,11 @@ void OBombKart::Tick() {
}
break;
case States::CHASE:
+ // Prevents chasing during race staging
+ if (gRaceState != RACE_IN_PROGRESS) {
+ return;
+ }
+
if (!_target) {
_target = OBombKart::FindTarget();
} else {