Merge branch 'trackref' of https://github.com/megamech/SpaghettiKart into trackref

This commit is contained in:
MegaMech 2025-12-12 17:00:01 -07:00
commit 96d5a5cdbd
78 changed files with 664 additions and 995 deletions

View File

@ -5,7 +5,6 @@ Checks: '
performance-*,
bugprone-*,
cppcoreguidelines-*,
llvm-include-order,
-readability-magic-numbers,
-readability-identifier-length,
@ -54,13 +53,6 @@ CheckOptions:
- key: readability-identifier-naming.NamespaceCase
value: CamelCase
# Functions: PascalCase (C++ style)
- key: readability-identifier-naming.FunctionCase
value: lower_case
# Allow legacy decompilation function names (func_XXXXXXXX)
- key: readability-identifier-naming.FunctionIgnoredRegexp
value: '^func_[0-9A-Fa-f]+$'
# Methods: PascalCase
- key: readability-identifier-naming.MethodCase
value: CamelCase

View File

@ -16,6 +16,7 @@
#include <stdbool.h>
#include "port/Game.h"
#include "port/audio/HMAS.h"
#include "engine/TrackBrowser.h"
s8 D_8018EF10;
UnkStruct8018EF18 D_8018EF18[16];

View File

@ -4,6 +4,7 @@
#include <stubs.h>
#include "code_800029B0.h"
#include "TrackBrowser.h"
#include "memory.h"
#include "waypoints.h"
#include "actors.h"

View File

@ -24,6 +24,7 @@
#include "render_courses.h"
#include "main.h"
#include "render_player.h"
#include "engine/TrackBrowser.h"
#include "engine/tracks/Track.h"
#include "engine/Matrix.h"

View File

@ -21,7 +21,7 @@ AActor::AActor(SpawnParams params) {
void AActor::BeginPlay() {
// This makes actors clickable in the editor
if (Editor_IsEnabled() == true) {
if (Editor_IsEnabled()) {
if ((nullptr != Model) && (Model[0] != '\0')) {
// Prevent collision mesh from being generated extra times.
if (Triangles.size() == 0) {

View File

@ -12,10 +12,9 @@ void RunGarbageCollector() {
void CleanActors() {
for (auto actor = GetWorld()->Actors.begin(); actor != GetWorld()->Actors.end();) {
AActor* act = *actor; // Get a mutable copy
auto* act = actor->get(); // Get a mutable copy
if (act->bPendingDestroy) {
if (act->IsMod()) { // C++ actor
delete act;
actor = GetWorld()->Actors.erase(actor); // Remove from container
} else { // Old C actor
act->Flags = 0;
@ -33,9 +32,8 @@ void CleanActors() {
void CleanStaticMeshActors() {
for (auto actor = GetWorld()->StaticMeshActors.begin(); actor != GetWorld()->StaticMeshActors.end();) {
StaticMeshActor* act = *actor; // Get a mutable copy
StaticMeshActor* act = actor->get(); // Get a mutable copy
if (act->bPendingDestroy) {
delete act;
actor = GetWorld()->StaticMeshActors.erase(actor); // Remove from container
continue;
} else {
@ -46,9 +44,8 @@ void CleanStaticMeshActors() {
void CleanObjects() {
for (auto object = GetWorld()->Objects.begin(); object != GetWorld()->Objects.end();) {
OObject* obj = *object; // Get a mutable copy
OObject* obj = object->get(); // Get a mutable copy
if (obj->bPendingDestroy) {
delete obj;
object = GetWorld()->Objects.erase(object); // Remove from container
continue;
}

View File

@ -93,8 +93,8 @@ void RaceManager::BeginPlay() {
void RaceManager::PostInit() {
// Ruleset options
if (CVarGetInteger("gAllThwompsAreMarty", false) == true) {
for (auto object : GetWorld()->Objects) {
if (OThwomp* thwomp = dynamic_cast<OThwomp*>(object)) {
for (auto& object : GetWorld()->Objects) {
if (OThwomp* thwomp = dynamic_cast<OThwomp*>(object.get())) {
gObjectList[thwomp->_objectIndex].unk_0D5 = OThwomp::States::JAILED; // Sets all the thwomp behaviour flags to marty
thwomp->Behaviour = OThwomp::States::JAILED;
}
@ -102,8 +102,8 @@ void RaceManager::PostInit() {
}
if (CVarGetInteger("gAllBombKartsChase", false) == true) {
for (auto object : GetWorld()->Objects) {
if (OBombKart* kart = dynamic_cast<OBombKart*>(object)) {
for (auto& object : GetWorld()->Objects) {
if (OBombKart* kart = dynamic_cast<OBombKart*>(object.get())) {
kart->Behaviour = OBombKart::States::CHASE;
}
}

View File

@ -2,6 +2,7 @@
#include "engine/CoreMath.h"
#include "Registry.h"
#include "engine/World.h"
#include "RegisterContent.h"
#include "AllTracks.h"
#include "AllActors.h"
@ -23,425 +24,261 @@ void RegisterActors(Registry<ActorInfo, const SpawnParams&>& r) {
info = { .ResourceName = "mk:item_box", .Name = "Item Box" };
r.Add(info,
[](const SpawnParams& params) {
FVector loc = params.Location.value_or(FVector{0, 0, 0});
Vec3f pos = { loc.x, loc.y, loc.z };
spawn_item_box(pos);
}
);
r.Add(info, [](const SpawnParams& params) {
FVector loc = params.Location.value_or(FVector{ 0, 0, 0 });
Vec3f pos = { loc.x, loc.y, loc.z };
spawn_item_box(pos);
});
info = { .ResourceName = "mk:fake_item_box", .Name = "Fake Item Box" };
r.Add(info,
[](const SpawnParams& params) {
FVector loc = params.Location.value_or(FVector{0, 0, 0});
Vec3f pos = { loc.x, loc.y, loc.z };
spawn_fake_item_box(pos);
}
);
r.Add(info, [](const SpawnParams& params) {
FVector loc = params.Location.value_or(FVector{ 0, 0, 0 });
Vec3f pos = { loc.x, loc.y, loc.z };
spawn_fake_item_box(pos);
});
info = { .ResourceName = "mk:thwomp", .Name = "Thwomp" };
r.Add(info,
[](const SpawnParams& params) {
GetWorld()->AddObject(new OThwomp(params));
}
);
r.Add(info, AddObjectToWorld<OThwomp>);
info = { .ResourceName = "mk:snowman", .Name = "Snowman" };
r.Add(info,
[](const SpawnParams& params) {
GetWorld()->AddObject(new OSnowman(params));
}
);
r.Add(info, AddObjectToWorld<OSnowman>);
info = { .ResourceName = "mk:hot_air_balloon", .Name = "Hot Air Balloon" };
r.Add(info,
[](const SpawnParams& params) {
GetWorld()->AddObject(new OHotAirBalloon(params));
}
);
r.Add(info, AddObjectToWorld<OHotAirBalloon>);
info = { .ResourceName = "mk:hedgehog", .Name = "Hedgehog" };
r.Add(info,
[](const SpawnParams& params) {
GetWorld()->AddObject(new OHedgehog(params));
}
);
r.Add(info, AddObjectToWorld<OHedgehog>);
info = { .ResourceName = "mk:grand_prix_balloons", .Name = "Grand Prix Balloons" };
r.Add(info,
[](const SpawnParams& params) {
GetWorld()->AddObject(new OGrandPrixBalloons(params));
}
);
r.Add(info, AddObjectToWorld<OGrandPrixBalloons>);
info = { .ResourceName = "mk:flagpole", .Name = "Flagpole", .Tags = {"sign"}};
r.Add(info,
[](const SpawnParams& params) {
GetWorld()->AddObject(new OFlagpole(params));
}
);
info = { .ResourceName = "mk:flagpole", .Name = "Flagpole", .Tags = { "sign" } };
r.Add(info, AddObjectToWorld<OFlagpole>);
info = { .ResourceName = "mk:crab", .Name = "Crab" };
r.Add(info,
[](const SpawnParams& params) {
GetWorld()->AddObject(new OCrab(params));
}
);
r.Add(info, AddObjectToWorld<OCrab>);
info = { .ResourceName = "mk:cheep_cheep", .Name = "Cheep Cheep", .Tags = {"passive"}};
r.Add(info,
[](const SpawnParams& params) {
GetWorld()->AddObject(new OCheepCheep(params));
}
);
info = { .ResourceName = "mk:cheep_cheep", .Name = "Cheep Cheep", .Tags = { "passive" } };
r.Add(info, AddObjectToWorld<OCheepCheep>);
info = { .ResourceName = "mk:bomb_kart", .Name = "Bomb Kart", .Tags = { "vehicle" } };
r.Add(info,
[](const SpawnParams& params) {
GetWorld()->AddObject(new OBombKart(params));
}
);
r.Add(info, AddObjectToWorld<OBombKart>);
info = { .ResourceName = "mk:bat", .Name = "Bat" };
r.Add(info,
[](const SpawnParams& params) {
GetWorld()->AddObject(new OBat(params));
}
);
r.Add(info, AddObjectToWorld<OBat>);
info = { .ResourceName = "mk:boos", .Name = "Boos" };
r.Add(info,
[](const SpawnParams& params) {
GetWorld()->AddObject(new OBoos(params));
}
);
r.Add(info, AddObjectToWorld<OBoos>);
info = { .ResourceName = "mk:trophy", .Name = "Trophy" };
r.Add(info,
[](const SpawnParams& params) {
GetWorld()->AddObject(new OTrophy(params));
}
);
r.Add(info, AddObjectToWorld<OTrophy>);
info = { .ResourceName = "mk:trash_bin", .Name = "Trash Bin" };
r.Add(info,
[](const SpawnParams& params) {
GetWorld()->AddObject(new OTrashBin(params));
}
);
r.Add(info, AddObjectToWorld<OTrashBin>);
info = { .ResourceName = "mk:seagull", .Name = "Seagull", .Tags = { "passive" } };
r.Add(info,
[](const SpawnParams& params) {
GetWorld()->AddObject(new OSeagull(params));
}
);
r.Add(info, AddObjectToWorld<OSeagull>);
info = { .ResourceName = "mk:chain_chomp", .Name = "Chain Chomp", .Tags = { "vehicle" } };
r.Add(info,
[](const SpawnParams& params) {
GetWorld()->AddObject(new OChainChomp());
}
);
r.Add(info, AddObjectToWorld<OChainChomp>);
info = { .ResourceName = "mk:podium", .Name = "Podium" };
r.Add(info,
[](const SpawnParams& params) {
GetWorld()->AddObject(new OPodium(params));
}
);
r.Add(info, AddObjectToWorld<OPodium>);
info = { .ResourceName = "mk:penguin", .Name = "Penguin" };
r.Add(info,
[](const SpawnParams& params) {
GetWorld()->AddObject(new OPenguin(params));
}
);
r.Add(info, AddObjectToWorld<OPenguin>);
info = { .ResourceName = "mk:banana", .Name = "Banana" };
r.Add(info,
[](const SpawnParams& params) {
GetWorld()->AddActor(new ABanana(params));
}
);
r.Add(info, AddActorToWorld<ABanana>);
info = { .ResourceName = "mk:mario_sign", .Name = "Mario Sign", .Tags = { "sign" } };
r.Add(info,
[](const SpawnParams& params) {
GetWorld()->AddActor(new AMarioSign(params));
}
);
r.Add(info, AddActorToWorld<AMarioSign>);
info = { .ResourceName = "mk:wario_sign", .Name = "Wario Sign", .Tags = { "sign" } };
r.Add(info,
[](const SpawnParams& params) {
GetWorld()->AddActor(new AWarioSign(params));
}
);
r.Add(info, AddActorToWorld<AWarioSign>);
info = { .ResourceName = "mk:falling_rock", .Name = "Falling Rock", .Tags = { "obstacle" } };
r.Add(info,
[](const SpawnParams& params) {
GetWorld()->AddActor(new AFallingRock(params));
}
);
r.Add(info, AddActorToWorld<AFallingRock>);
info = { .ResourceName = "mk:yoshi_egg", .Name = "Yoshi Egg", .Tags = { "obstacle" } };
r.Add(info,
[](const SpawnParams& params) {
FVector loc = params.Location.value_or(FVector{0, 0, 0});
Vec3f pos = { loc.x, loc.y, loc.z };
Vec3s rot = {0, 0, 0};
Vec3f vel = {0, 0, 0};
add_actor_to_empty_slot(pos, rot, vel, ACTOR_YOSHI_EGG);
}
);
r.Add(info, [](const SpawnParams& params) {
FVector loc = params.Location.value_or(FVector{ 0, 0, 0 });
Vec3f pos = { loc.x, loc.y, loc.z };
Vec3s rot = { 0, 0, 0 };
Vec3f vel = { 0, 0, 0 };
add_actor_to_empty_slot(pos, rot, vel, ACTOR_YOSHI_EGG);
});
info = { .ResourceName = "mk:piranha_plant", .Name = "Piranha Plant", .Tags = { "foliage", "obstacle" } };
r.Add(info,
[](const SpawnParams& params) {
FVector loc = params.Location.value_or(FVector{0, 0, 0});
Vec3f pos = { loc.x, loc.y, loc.z };
Vec3s rot = {0, 0, 0};
Vec3f vel = {0, 0, 0};
add_actor_to_empty_slot(pos, rot, vel, ACTOR_PIRANHA_PLANT);
}
);
r.Add(info, [](const SpawnParams& params) {
FVector loc = params.Location.value_or(FVector{ 0, 0, 0 });
Vec3f pos = { loc.x, loc.y, loc.z };
Vec3s rot = { 0, 0, 0 };
Vec3f vel = { 0, 0, 0 };
add_actor_to_empty_slot(pos, rot, vel, ACTOR_PIRANHA_PLANT);
});
info = { .ResourceName = "mk:tree_mario_raceway", .Name = "Tree (Mario Raceway)", .Tags = { "foliage" } };
r.Add(info,
[](const SpawnParams& params) {
FVector loc = params.Location.value_or(FVector{0, 0, 0});
Vec3f pos = { loc.x, loc.y, loc.z };
Vec3s rot = {0, 0, 0};
Vec3f vel = {0, 0, 0};
add_actor_to_empty_slot(pos, rot, vel, ACTOR_TREE_MARIO_RACEWAY);
}
);
r.Add(info, [](const SpawnParams& params) {
FVector loc = params.Location.value_or(FVector{ 0, 0, 0 });
Vec3f pos = { loc.x, loc.y, loc.z };
Vec3s rot = { 0, 0, 0 };
Vec3f vel = { 0, 0, 0 };
add_actor_to_empty_slot(pos, rot, vel, ACTOR_TREE_MARIO_RACEWAY);
});
info = { .ResourceName = "mk:tree_yoshi_valley", .Name = "Tree (Yoshi Valley)", .Tags = { "foliage" } };
r.Add(info,
[](const SpawnParams& params) {
FVector loc = params.Location.value_or(FVector{0, 0, 0});
Vec3f pos = { loc.x, loc.y, loc.z };
Vec3s rot = {0, 0, 0};
Vec3f vel = {0, 0, 0};
add_actor_to_empty_slot(pos, rot, vel, ACTOR_TREE_YOSHI_VALLEY);
}
);
r.Add(info, [](const SpawnParams& params) {
FVector loc = params.Location.value_or(FVector{ 0, 0, 0 });
Vec3f pos = { loc.x, loc.y, loc.z };
Vec3s rot = { 0, 0, 0 };
Vec3f vel = { 0, 0, 0 };
add_actor_to_empty_slot(pos, rot, vel, ACTOR_TREE_YOSHI_VALLEY);
});
info = { .ResourceName = "mk:tree_royal_raceway", .Name = "Tree (Royal Raceway)", .Tags = { "foliage" } };
r.Add(info,
[](const SpawnParams& params) {
FVector loc = params.Location.value_or(FVector{0, 0, 0});
Vec3f pos = { loc.x, loc.y, loc.z };
Vec3s rot = {0, 0, 0};
Vec3f vel = {0, 0, 0};
add_actor_to_empty_slot(pos, rot, vel, ACTOR_TREE_ROYAL_RACEWAY);
}
);
r.Add(info, [](const SpawnParams& params) {
FVector loc = params.Location.value_or(FVector{ 0, 0, 0 });
Vec3f pos = { loc.x, loc.y, loc.z };
Vec3s rot = { 0, 0, 0 };
Vec3f vel = { 0, 0, 0 };
add_actor_to_empty_slot(pos, rot, vel, ACTOR_TREE_ROYAL_RACEWAY);
});
info = { .ResourceName = "mk:tree_moo_moo_farm", .Name = "Tree (Moo Moo Farm)", .Tags = { "foliage" } };
r.Add(info,
[](const SpawnParams& params) {
FVector loc = params.Location.value_or(FVector{0, 0, 0});
Vec3f pos = { loc.x, loc.y, loc.z };
Vec3s rot = {0, 0, 0};
Vec3f vel = {0, 0, 0};
add_actor_to_empty_slot(pos, rot, vel, ACTOR_TREE_MOO_MOO_FARM);
}
);
r.Add(info, [](const SpawnParams& params) {
FVector loc = params.Location.value_or(FVector{ 0, 0, 0 });
Vec3f pos = { loc.x, loc.y, loc.z };
Vec3s rot = { 0, 0, 0 };
Vec3f vel = { 0, 0, 0 };
add_actor_to_empty_slot(pos, rot, vel, ACTOR_TREE_MOO_MOO_FARM);
});
info = { .ResourceName = "mk:palm_tree", .Name = "Palm Tree", .Tags = { "foliage" } };
r.Add(info,
[](const SpawnParams& params) {
FVector loc = params.Location.value_or(FVector{0, 0, 0});
Vec3f pos = { loc.x, loc.y, loc.z };
Vec3s rot = {0, 0, 0};
Vec3f vel = {0, 0, 0};
add_actor_to_empty_slot(pos, rot, vel, ACTOR_PALM_TREE);
}
);
r.Add(info, [](const SpawnParams& params) {
FVector loc = params.Location.value_or(FVector{ 0, 0, 0 });
Vec3f pos = { loc.x, loc.y, loc.z };
Vec3s rot = { 0, 0, 0 };
Vec3f vel = { 0, 0, 0 };
add_actor_to_empty_slot(pos, rot, vel, ACTOR_PALM_TREE);
});
info = { .ResourceName = "mk:tree_luigi_raceway", .Name = "Tree (Luigi Raceway)", .Tags = { "foliage" } };
r.Add(info,
[](const SpawnParams& params) {
FVector loc = params.Location.value_or(FVector{0, 0, 0});
Vec3f pos = { loc.x, loc.y, loc.z };
Vec3s rot = {0, 0, 0};
Vec3f vel = {0, 0, 0};
add_actor_to_empty_slot(pos, rot, vel, ACTOR_TREE_LUIGI_RACEWAY);
}
);
r.Add(info, [](const SpawnParams& params) {
FVector loc = params.Location.value_or(FVector{ 0, 0, 0 });
Vec3f pos = { loc.x, loc.y, loc.z };
Vec3s rot = { 0, 0, 0 };
Vec3f vel = { 0, 0, 0 };
add_actor_to_empty_slot(pos, rot, vel, ACTOR_TREE_LUIGI_RACEWAY);
});
info = { .ResourceName = "mk:unknown_0x1b", .Name = "Unknown Plant (0x1B)", .Tags = { "foliage" } };
r.Add(info,
[](const SpawnParams& params) {
FVector loc = params.Location.value_or(FVector{0, 0, 0});
Vec3f pos = { loc.x, loc.y, loc.z };
Vec3s rot = {0, 0, 0};
Vec3f vel = {0, 0, 0};
add_actor_to_empty_slot(pos, rot, vel, ACTOR_UNKNOWN_0x1B);
}
);
r.Add(info, [](const SpawnParams& params) {
FVector loc = params.Location.value_or(FVector{ 0, 0, 0 });
Vec3f pos = { loc.x, loc.y, loc.z };
Vec3s rot = { 0, 0, 0 };
Vec3f vel = { 0, 0, 0 };
add_actor_to_empty_slot(pos, rot, vel, ACTOR_UNKNOWN_0x1B);
});
info = { .ResourceName = "mk:tree_peach_castle", .Name = "Tree (Peach Castle)", .Tags = { "foliage" } };
r.Add(info,
[](const SpawnParams& params) {
FVector loc = params.Location.value_or(FVector{0, 0, 0});
Vec3f pos = { loc.x, loc.y, loc.z };
Vec3s rot = {0, 0, 0};
Vec3f vel = {0, 0, 0};
add_actor_to_empty_slot(pos, rot, vel, ACTOR_TREE_PEACH_CASTLE);
}
);
r.Add(info, [](const SpawnParams& params) {
FVector loc = params.Location.value_or(FVector{ 0, 0, 0 });
Vec3f pos = { loc.x, loc.y, loc.z };
Vec3s rot = { 0, 0, 0 };
Vec3f vel = { 0, 0, 0 };
add_actor_to_empty_slot(pos, rot, vel, ACTOR_TREE_PEACH_CASTLE);
});
info = { .ResourceName = "mk:tree_frappe_snowland", .Name = "Tree (Frappe Snowland)", .Tags = { "foliage" } };
r.Add(info,
[](const SpawnParams& params) {
FVector loc = params.Location.value_or(FVector{0, 0, 0});
Vec3f pos = { loc.x, loc.y, loc.z };
Vec3s rot = {0, 0, 0};
Vec3f vel = {0, 0, 0};
add_actor_to_empty_slot(pos, rot, vel, ACTOR_TREE_FRAPPE_SNOWLAND);
}
);
r.Add(info, [](const SpawnParams& params) {
FVector loc = params.Location.value_or(FVector{ 0, 0, 0 });
Vec3f pos = { loc.x, loc.y, loc.z };
Vec3s rot = { 0, 0, 0 };
Vec3f vel = { 0, 0, 0 };
add_actor_to_empty_slot(pos, rot, vel, ACTOR_TREE_FRAPPE_SNOWLAND);
});
info = { .ResourceName = "mk:cactus1_kalamari_desert", .Name = "Cactus 1 (Kalamari Desert)", .Tags = {"foliage"}};
r.Add(info,
[](const SpawnParams& params) {
FVector loc = params.Location.value_or(FVector{0, 0, 0});
Vec3f pos = { loc.x, loc.y, loc.z };
Vec3s rot = {0, 0, 0};
Vec3f vel = {0, 0, 0};
add_actor_to_empty_slot(pos, rot, vel, ACTOR_CACTUS1_KALAMARI_DESERT);
}
);
info = { .ResourceName = "mk:cactus1_kalamari_desert",
.Name = "Cactus 1 (Kalamari Desert)",
.Tags = { "foliage" } };
r.Add(info, [](const SpawnParams& params) {
FVector loc = params.Location.value_or(FVector{ 0, 0, 0 });
Vec3f pos = { loc.x, loc.y, loc.z };
Vec3s rot = { 0, 0, 0 };
Vec3f vel = { 0, 0, 0 };
add_actor_to_empty_slot(pos, rot, vel, ACTOR_CACTUS1_KALAMARI_DESERT);
});
info = { .ResourceName = "mk:cactus2_kalamari_desert", .Name = "Cactus 2 (Kalamari Desert)", .Tags = {"foliage"}};
r.Add(info,
[](const SpawnParams& params) {
FVector loc = params.Location.value_or(FVector{0, 0, 0});
Vec3f pos = { loc.x, loc.y, loc.z };
Vec3s rot = {0, 0, 0};
Vec3f vel = {0, 0, 0};
add_actor_to_empty_slot(pos, rot, vel, ACTOR_CACTUS2_KALAMARI_DESERT);
}
);
info = { .ResourceName = "mk:cactus2_kalamari_desert",
.Name = "Cactus 2 (Kalamari Desert)",
.Tags = { "foliage" } };
r.Add(info, [](const SpawnParams& params) {
FVector loc = params.Location.value_or(FVector{ 0, 0, 0 });
Vec3f pos = { loc.x, loc.y, loc.z };
Vec3s rot = { 0, 0, 0 };
Vec3f vel = { 0, 0, 0 };
add_actor_to_empty_slot(pos, rot, vel, ACTOR_CACTUS2_KALAMARI_DESERT);
});
info = { .ResourceName = "mk:cactus3_kalamari_desert", .Name = "Cactus 3 (Kalamari Desert)", .Tags = {"foliage"}};
r.Add(info,
[](const SpawnParams& params) {
FVector loc = params.Location.value_or(FVector{0, 0, 0});
Vec3f pos = { loc.x, loc.y, loc.z };
Vec3s rot = {0, 0, 0};
Vec3f vel = {0, 0, 0};
add_actor_to_empty_slot(pos, rot, vel, ACTOR_CACTUS3_KALAMARI_DESERT);
}
);
info = { .ResourceName = "mk:cactus3_kalamari_desert",
.Name = "Cactus 3 (Kalamari Desert)",
.Tags = { "foliage" } };
r.Add(info, [](const SpawnParams& params) {
FVector loc = params.Location.value_or(FVector{ 0, 0, 0 });
Vec3f pos = { loc.x, loc.y, loc.z };
Vec3s rot = { 0, 0, 0 };
Vec3f vel = { 0, 0, 0 };
add_actor_to_empty_slot(pos, rot, vel, ACTOR_CACTUS3_KALAMARI_DESERT);
});
info = { .ResourceName = "mk:bush_bowsers_castle", .Name = "Bush (Bowser's Castle)" };
r.Add(info,
[](const SpawnParams& params) {
FVector loc = params.Location.value_or(FVector{0, 0, 0});
Vec3f pos = { loc.x, loc.y, loc.z };
Vec3s rot = {0, 0, 0};
Vec3f vel = {0, 0, 0};
add_actor_to_empty_slot(pos, rot, vel, ACTOR_BUSH_BOWSERS_CASTLE);
}
);
r.Add(info, [](const SpawnParams& params) {
FVector loc = params.Location.value_or(FVector{ 0, 0, 0 });
Vec3f pos = { loc.x, loc.y, loc.z };
Vec3s rot = { 0, 0, 0 };
Vec3f vel = { 0, 0, 0 };
add_actor_to_empty_slot(pos, rot, vel, ACTOR_BUSH_BOWSERS_CASTLE);
});
info = { .ResourceName = "mk:finishline", .Name = "Finishline" };
r.Add(info,
[](const SpawnParams& params) {
GetWorld()->AddActor(new AFinishline(params));
}
);
r.Add(info, AddActorToWorld<AFinishline>);
info = { .ResourceName = "mk:train", .Name = "Train", .Tags = { "vehicle" } };
r.Add(info,
[](const SpawnParams& params) {
GetWorld()->AddActor(new ATrain(params));
}
);
r.Add(info, AddActorToWorld<ATrain>);
info = { .ResourceName = "mk:paddle_boat", .Name = "Paddle Boat", .Tags = { "vehicle" } };
r.Add(info,
[](const SpawnParams& params) {
GetWorld()->AddActor(new ABoat(params));
}
);
r.Add(info, AddActorToWorld<ABoat>);
info = { .ResourceName = "mk:car", .Name = "Car", .Tags = { "vehicle" } };
r.Add(info,
[](const SpawnParams& params) {
GetWorld()->AddActor(new ACar(params));
}
);
r.Add(info, AddActorToWorld<ACar>);
info = { .ResourceName = "mk:truck", .Name = "Truck", .Tags = { "vehicle" } };
r.Add(info,
[](const SpawnParams& params) {
GetWorld()->AddActor(new ATankerTruck(params));
}
);
r.Add(info, AddActorToWorld<ATankerTruck>);
info = { .ResourceName = "mk:tanker_truck", .Name = "Tanker Truck", .Tags = { "vehicle" } };
r.Add(info,
[](const SpawnParams& params) {
GetWorld()->AddActor(new ATankerTruck(params));
}
);
r.Add(info, AddActorToWorld<ATankerTruck>);
info = { .ResourceName = "mk:bus", .Name = "Bus", .Tags = { "vehicle" } };
r.Add(info,
[](const SpawnParams& params) {
GetWorld()->AddActor(new ATankerTruck(params));
}
);
r.Add(info, AddActorToWorld<ATankerTruck>);
info = { .ResourceName = "hm:spaghetti_ship", .Name = "Spaghetti Ship" };
r.Add(info,
[](const SpawnParams& params) {
GetWorld()->AddActor(new ASpaghettiShip(params));
}
);
r.Add(info, AddActorToWorld<ASpaghettiShip>);
info = { .ResourceName = "hm:ship", .Name = "Ghostship (HM64)" };
r.Add(info,
[](const SpawnParams& params) {
GetWorld()->AddActor(new AShip(params));
}
);
r.Add(info, AddActorToWorld<AShip>);
info = { .ResourceName = "hm:starship", .Name = "Starship (HM64)" };
r.Add(info,
[](const SpawnParams& params) {
GetWorld()->AddActor(new AStarship(params));
}
);
r.Add(info, AddActorToWorld<AStarship>);
info = { .ResourceName = "hm:cloud", .Name = "Cloud (HM64)", .Tags = { "item" } };
r.Add(info,
[](const SpawnParams& params) {
GetWorld()->AddActor(new ACloud(params));
}
);
r.Add(info, AddActorToWorld<ACloud>);
info = { .ResourceName = "hm:text", .Name = "Text (HM64)" };
r.Add(info,
[](const SpawnParams& params) {
GetWorld()->AddActor(new AText(params));
}
);
r.Add(info, AddActorToWorld<AText>);
info = { .ResourceName = "mk:bowser_statue", .Name = "Bowser Statue" };
r.Add(info,
[](const SpawnParams& params) {
GetWorld()->AddActor(new ABowserStatue(params));
}
);
r.Add(info, AddActorToWorld<ABowserStatue>);
}
void RegisterTracks(Registry<TrackInfo>& r) {
@ -455,11 +292,7 @@ void RegisterTracks(Registry<TrackInfo>& r) {
.MinimapTexture = minimap_mario_raceway,
};
r.Add(info,
[]() {
GetWorld()->SetCurrentTrack(std::make_unique<MarioRaceway>());
}
);
r.Add(info, []() { GetWorld()->SetCurrentTrack(std::make_unique<MarioRaceway>()); });
info = {
.ResourceName = "mk:choco_mountain",
@ -469,11 +302,7 @@ void RegisterTracks(Registry<TrackInfo>& r) {
.MinimapTexture = minimap_choco_mountain,
};
r.Add(info,
[]() {
GetWorld()->SetCurrentTrack(std::make_unique<ChocoMountain>());
}
);
r.Add(info, []() { GetWorld()->SetCurrentTrack(std::make_unique<ChocoMountain>()); });
info = {
.ResourceName = "mk:bowsers_castle",
@ -483,11 +312,7 @@ void RegisterTracks(Registry<TrackInfo>& r) {
.MinimapTexture = minimap_bowsers_castle,
};
r.Add(info,
[]() {
GetWorld()->SetCurrentTrack(std::make_unique<BowsersCastle>());
}
);
r.Add(info, []() { GetWorld()->SetCurrentTrack(std::make_unique<BowsersCastle>()); });
info = {
.ResourceName = "mk:banshee_boardwalk",
@ -497,11 +322,7 @@ void RegisterTracks(Registry<TrackInfo>& r) {
.MinimapTexture = minimap_banshee_boardwalk,
};
r.Add(info,
[]() {
GetWorld()->SetCurrentTrack(std::make_unique<BansheeBoardwalk>());
}
);
r.Add(info, []() { GetWorld()->SetCurrentTrack(std::make_unique<BansheeBoardwalk>()); });
info = {
.ResourceName = "mk:yoshi_valley",
@ -511,11 +332,7 @@ void RegisterTracks(Registry<TrackInfo>& r) {
.MinimapTexture = minimap_yoshi_valley,
};
r.Add(info,
[]() {
GetWorld()->SetCurrentTrack(std::make_unique<YoshiValley>());
}
);
r.Add(info, []() { GetWorld()->SetCurrentTrack(std::make_unique<YoshiValley>()); });
info = {
.ResourceName = "mk:frappe_snowland",
@ -525,11 +342,7 @@ void RegisterTracks(Registry<TrackInfo>& r) {
.MinimapTexture = minimap_frappe_snowland,
};
r.Add(info,
[]() {
GetWorld()->SetCurrentTrack(std::make_unique<FrappeSnowland>());
}
);
r.Add(info, []() { GetWorld()->SetCurrentTrack(std::make_unique<FrappeSnowland>()); });
info = {
.ResourceName = "mk:koopa_beach",
@ -539,11 +352,7 @@ void RegisterTracks(Registry<TrackInfo>& r) {
.MinimapTexture = minimap_koopa_troopa_beach,
};
r.Add(info,
[]() {
GetWorld()->SetCurrentTrack(std::make_unique<KoopaTroopaBeach>());
}
);
r.Add(info, []() { GetWorld()->SetCurrentTrack(std::make_unique<KoopaTroopaBeach>()); });
info = {
.ResourceName = "mk:royal_raceway",
@ -553,11 +362,7 @@ void RegisterTracks(Registry<TrackInfo>& r) {
.MinimapTexture = minimap_royal_raceway,
};
r.Add(info,
[]() {
GetWorld()->SetCurrentTrack(std::make_unique<RoyalRaceway>());
}
);
r.Add(info, []() { GetWorld()->SetCurrentTrack(std::make_unique<RoyalRaceway>()); });
info = {
.ResourceName = "mk:luigi_raceway",
@ -567,11 +372,7 @@ void RegisterTracks(Registry<TrackInfo>& r) {
.MinimapTexture = minimap_luigi_raceway,
};
r.Add(info,
[]() {
GetWorld()->SetCurrentTrack(std::make_unique<LuigiRaceway>());
}
);
r.Add(info, []() { GetWorld()->SetCurrentTrack(std::make_unique<LuigiRaceway>()); });
info = {
.ResourceName = "mk:moo_moo_farm",
@ -581,11 +382,7 @@ void RegisterTracks(Registry<TrackInfo>& r) {
.MinimapTexture = minimap_moo_moo_farm,
};
r.Add(info,
[]() {
GetWorld()->SetCurrentTrack(std::make_unique<MooMooFarm>());
}
);
r.Add(info, []() { GetWorld()->SetCurrentTrack(std::make_unique<MooMooFarm>()); });
info = {
.ResourceName = "mk:toads_turnpike",
@ -595,11 +392,7 @@ void RegisterTracks(Registry<TrackInfo>& r) {
.MinimapTexture = minimap_toads_turnpike,
};
r.Add(info,
[]() {
GetWorld()->SetCurrentTrack(std::make_unique<ToadsTurnpike>());
}
);
r.Add(info, []() { GetWorld()->SetCurrentTrack(std::make_unique<ToadsTurnpike>()); });
info = {
.ResourceName = "mk:kalimari_desert",
@ -609,11 +402,7 @@ void RegisterTracks(Registry<TrackInfo>& r) {
.MinimapTexture = minimap_kalimari_desert,
};
r.Add(info,
[]() {
GetWorld()->SetCurrentTrack(std::make_unique<KalimariDesert>());
}
);
r.Add(info, []() { GetWorld()->SetCurrentTrack(std::make_unique<KalimariDesert>()); });
info = {
.ResourceName = "mk:sherbet_land",
@ -623,11 +412,7 @@ void RegisterTracks(Registry<TrackInfo>& r) {
.MinimapTexture = minimap_sherbet_land,
};
r.Add(info,
[]() {
GetWorld()->SetCurrentTrack(std::make_unique<SherbetLand>());
}
);
r.Add(info, []() { GetWorld()->SetCurrentTrack(std::make_unique<SherbetLand>()); });
info = {
.ResourceName = "mk:rainbow_road",
@ -637,11 +422,7 @@ void RegisterTracks(Registry<TrackInfo>& r) {
.MinimapTexture = minimap_rainbow_road,
};
r.Add(info,
[]() {
GetWorld()->SetCurrentTrack(std::make_unique<RainbowRoad>());
}
);
r.Add(info, []() { GetWorld()->SetCurrentTrack(std::make_unique<RainbowRoad>()); });
info = {
.ResourceName = "mk:wario_stadium",
@ -651,11 +432,7 @@ void RegisterTracks(Registry<TrackInfo>& r) {
.MinimapTexture = minimap_wario_stadium,
};
r.Add(info,
[]() {
GetWorld()->SetCurrentTrack(std::make_unique<WarioStadium>());
}
);
r.Add(info, []() { GetWorld()->SetCurrentTrack(std::make_unique<WarioStadium>()); });
info = {
.ResourceName = "mk:block_fort",
@ -665,11 +442,7 @@ void RegisterTracks(Registry<TrackInfo>& r) {
.MinimapTexture = minimap_block_fort,
};
r.Add(info,
[]() {
GetWorld()->SetCurrentTrack(std::make_unique<BlockFort>());
}
);
r.Add(info, []() { GetWorld()->SetCurrentTrack(std::make_unique<BlockFort>()); });
info = {
.ResourceName = "mk:skyscraper",
@ -679,11 +452,7 @@ void RegisterTracks(Registry<TrackInfo>& r) {
.MinimapTexture = minimap_skyscraper,
};
r.Add(info,
[]() {
GetWorld()->SetCurrentTrack(std::make_unique<Skyscraper>());
}
);
r.Add(info, []() { GetWorld()->SetCurrentTrack(std::make_unique<Skyscraper>()); });
info = {
.ResourceName = "mk:double_deck",
@ -693,11 +462,7 @@ void RegisterTracks(Registry<TrackInfo>& r) {
.MinimapTexture = minimap_double_deck,
};
r.Add(info,
[]() {
GetWorld()->SetCurrentTrack(std::make_unique<DoubleDeck>());
}
);
r.Add(info, []() { GetWorld()->SetCurrentTrack(std::make_unique<DoubleDeck>()); });
info = {
.ResourceName = "mk:dk_jungle",
@ -707,11 +472,7 @@ void RegisterTracks(Registry<TrackInfo>& r) {
.MinimapTexture = minimap_dks_jungle_parkway,
};
r.Add(info,
[]() {
GetWorld()->SetCurrentTrack(std::make_unique<DKJungle>());
}
);
r.Add(info, []() { GetWorld()->SetCurrentTrack(std::make_unique<DKJungle>()); });
info = {
.ResourceName = "mk:big_donut",
@ -721,11 +482,7 @@ void RegisterTracks(Registry<TrackInfo>& r) {
.MinimapTexture = minimap_big_donut,
};
r.Add(info,
[]() {
GetWorld()->SetCurrentTrack(std::make_unique<BigDonut>());
}
);
r.Add(info, []() { GetWorld()->SetCurrentTrack(std::make_unique<BigDonut>()); });
info = {
.ResourceName = "mk:test_track",
@ -734,9 +491,5 @@ void RegisterTracks(Registry<TrackInfo>& r) {
.Length = "100m",
};
r.Add(info,
[]() {
GetWorld()->SetCurrentTrack(std::make_unique<TestTrack>());
}
);
r.Add(info, []() { GetWorld()->SetCurrentTrack(std::make_unique<TestTrack>()); });
}

View File

@ -1,7 +1,17 @@
#pragma once
#include "Object.h"
#include "Registry.h"
#include "SpawnParams.h"
#include "port/Game.h"
template<class T> static OObject* AddObjectToWorld(const SpawnParams& params) {
return GetWorld()->AddObject(T(params));
}
template<class T> static AActor* AddActorToWorld(const SpawnParams& params) {
return GetWorld()->AddActor(T(params));
}
void RegisterActors(Registry<ActorInfo, const SpawnParams&>& r);
void RegisterTracks(Registry<TrackInfo>& r);

View File

@ -25,7 +25,7 @@ void TrainSmokeTick() {
Object* object;
for (auto& actor : GetWorld()->Actors) {
if (auto train = dynamic_cast<ATrain*>(actor)) {
if (auto* train = dynamic_cast<ATrain*>(actor.get())) {
if (train->SmokeTimer != 0) {
train->SmokeTimer -= 1;
}
@ -49,7 +49,7 @@ void TrainSmokeTick() {
train->SmokeTimer = 100;
}
}
} else if (auto boat = dynamic_cast<ABoat*>(actor)) {
} else if (auto* boat = dynamic_cast<ABoat*>(actor.get())) {
if (boat->SmokeTimer != 0) {
boat->SmokeTimer -= 1;
}
@ -80,7 +80,7 @@ void TrainSmokeDraw(s32 cameraId) {
Camera* camera = &camera1[cameraId];
for (auto& actor : GetWorld()->Actors) {
if (auto train = dynamic_cast<ATrain*>(actor)) {
if (auto train = dynamic_cast<ATrain*>(actor.get())) {
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);
@ -94,7 +94,7 @@ void TrainSmokeDraw(s32 cameraId) {
FrameInterpolation_RecordCloseChild();
}
}
} else if (auto boat = dynamic_cast<ABoat*>(actor)) {
} else if (auto* boat = dynamic_cast<ABoat*>(actor.get())) {
gSPDisplayList(gDisplayListHead++, (Gfx*) D_0D007AE0);
load_texture_block_i8_nomirror((uint8_t*) D_0D029458, 32, 32);

View File

@ -30,8 +30,7 @@ void TrainCrossing::CrossingTrigger() {
OnTriggered = 0;
for (const auto& actor : GetWorld()->Actors) {
if (auto train = dynamic_cast<ATrain*>(actor)) {
;
if (auto* train = dynamic_cast<ATrain*>(actor.get())) {
f32 radius = DynamicRadius(train->Locomotive.position, train->Locomotive.velocity, Position);
if (Distance(train->Locomotive.position, Position) < radius) {

View File

@ -2,30 +2,21 @@
#include "World.h"
#include "Cup.h"
#include "tracks/Track.h"
#include "objects/BombKart.h"
#include "TrainCrossing.h"
#include <memory>
#include "objects/Object.h"
#include "port/Game.h"
#include "editor/GameObject.h"
extern "C" {
#include "camera.h"
#include "objects.h"
#include "main.h"
#include "defines.h"
#include "audio/external.h"
#include "menus.h"
#include "code_800029B0.h"
#include "assets/models/common_data.h"
#include "assets/models/tracks/mario_raceway/mario_raceway_data.h"
}
#include "engine/cameras/GameCamera.h"
#include "engine/cameras/FreeCamera.h"
#include "engine/cameras/TourCamera.h"
#include "engine/cameras/LookBehindCamera.h"
World* World::Instance;
std::unique_ptr<Track> mTrack;
@ -122,19 +113,25 @@ void World::TickCameras() {
}
}
AActor* World::AddActor(AActor* actor) {
Actors.push_back(actor);
actor->BeginPlay();
return Actors.back();
AActor* World::AddActor(AActor actor) {
Actors.push_back(std::make_unique<AActor>(actor));
actor.BeginPlay();
return Actors.back().get();
}
AActor* World::AddActor(std::unique_ptr<AActor> actor) {
Actors.push_back(std::move(actor));
Actors.back()->BeginPlay();
return Actors.back().get();
}
struct Actor* World::AddBaseActor() {
Actors.push_back(new AActor());
Actors.push_back(std::make_unique<AActor>());
AActor* actor = Actors.back();
AActor* actor = Actors.back().get();
// Skip C++ vtable to access variables in C
return reinterpret_cast<struct Actor*>(reinterpret_cast<char*>(Actors.back()) + sizeof(void*));
return reinterpret_cast<struct Actor*>(reinterpret_cast<char*>(actor) + sizeof(void*));
}
void World::ActorBeginPlay(Actor* actor) {
@ -162,21 +159,21 @@ Actor* World::ConvertAActorToActor(AActor* actor) {
}
AActor* World::GetActor(size_t index) {
return Actors[index];
return Actors[index].get();
}
void World::TickActors() {
// This only ticks modded actors
for (AActor* actor : Actors) {
for (auto& actor : Actors) {
if (actor->IsMod()) {
actor->Tick();
}
}
}
StaticMeshActor* World::AddStaticMeshActor(std::string name, FVector pos, IRotator rot, FVector scale, std::string model, int32_t* collision) {
StaticMeshActors.push_back(new StaticMeshActor(name, pos, rot, scale, model, collision));
auto actor = StaticMeshActors.back();
StaticMeshActor* World::AddStaticMeshActor(const std::string& name, FVector pos, IRotator rot, FVector scale, const std::string& model, int32_t* collision) {
StaticMeshActors.push_back(std::make_unique<StaticMeshActor>(name, pos, rot, scale, model, collision));
auto* actor = StaticMeshActors.back().get();
return actor;
}
@ -186,8 +183,8 @@ void World::DrawStaticMeshActors() {
}
}
OObject* World::AddObject(OObject* object) {
Objects.push_back(object);
OObject* World::AddObject(OObject object) {
Objects.push_back(std::make_unique<OObject>(object));
// This is an example of how to get the C object.
// However, nothing is being done with it, so it's been commented out.
@ -195,11 +192,23 @@ OObject* World::AddObject(OObject* object) {
// Object* cObj = &gObjectList[object->_objectIndex];
// }
return Objects.back();
return Objects.back().get();
}
OObject* World::AddObject(std::unique_ptr<OObject> object) {
Objects.push_back(std::move(object));
// This is an example of how to get the C object.
// However, nothing is being done with it, so it's been commented out.
// if (object->_objectIndex != -1) {
// Object* cObj = &gObjectList[object->_objectIndex];
// }
return Objects.back().get();
}
void World::TickObjects() {
for (const auto& object : Objects) {
for (auto& object : Objects) {
object->Tick();
}
}
@ -207,7 +216,7 @@ void World::TickObjects() {
// Some objects such as lakitu are ticked in process_game_tick.
// This is a fallback to support those objects. Probably don't use this.
void World::TickObjects60fps() {
for (const auto& object : Objects) {
for (auto& object : Objects) {
object->Tick60fps();
}
}
@ -218,7 +227,7 @@ ParticleEmitter* World::AddEmitter(ParticleEmitter* emitter) {
}
void World::DrawObjects(s32 cameraId) {
for (const auto& object : Objects) {
for (auto& object : Objects) {
object->Draw(cameraId);
}
}
@ -237,7 +246,7 @@ void World::DrawParticles(s32 cameraId) {
// Sets OObjects or AActors static member variables back to default values
void World::Reset() {
for (const auto& object : Objects) {
for (auto& object : Objects) {
object->Reset(); // Used for OPenguin
}
}
@ -254,23 +263,12 @@ Object* World::GetObjectByIndex(size_t index) {
void World::CleanWorld(void) {
printf("[Game.cpp] Clean World\n");
for (auto& actor : Actors) {
delete actor;
}
World::Reset(); // Reset OObjects
for (auto& object : Objects) {
delete object;
}
for (auto& emitter : Emitters) {
delete emitter;
}
for (auto& actor : StaticMeshActors) {
delete actor;
}
for (size_t i = 0; i < ARRAY_COUNT(mPlayerBombKart); i++) {
mPlayerBombKart[i].state = PlayerBombKart::PlayerBombKartState::DISABLED;
mPlayerBombKart[i]._primAlpha = 0;

View File

@ -65,7 +65,8 @@ public:
void TickCameras();
AActor* AddActor(AActor* actor);
AActor* AddActor(AActor actor);
AActor* AddActor(std::unique_ptr<AActor> actor);
struct Actor* AddBaseActor();
void ActorBeginPlay(Actor* actor);
AActor* GetActor(size_t index);
@ -75,9 +76,10 @@ public:
Actor* ConvertAActorToActor(AActor* actor);
void DrawStaticMeshActors();
StaticMeshActor* AddStaticMeshActor(std::string name, FVector pos, IRotator rot, FVector scale, std::string model, int32_t* collision);
StaticMeshActor* AddStaticMeshActor(const std::string& name, FVector pos, IRotator rot, FVector scale, const std::string& model, int32_t* collision);
OObject* AddObject(OObject* object);
OObject* AddObject(OObject object);
OObject* AddObject(std::unique_ptr<OObject> object);
void TickObjects();
void TickObjects60fps();
@ -117,9 +119,9 @@ public:
std::vector<GameCamera*> Cameras;
std::vector<StaticMeshActor*> StaticMeshActors;
std::vector<AActor*> Actors;
std::vector<OObject*> Objects;
std::vector<std::unique_ptr<StaticMeshActor>> StaticMeshActors;
std::vector<std::unique_ptr<AActor>> Actors;
std::vector<std::unique_ptr<OObject>> Objects;
std::vector<ParticleEmitter*> Emitters;
std::unordered_map<s32, OLakitu*> Lakitus;

View File

@ -1,13 +1,11 @@
#pragma once
#include <libultraship.h>
#include "RegisterContent.h"
#include "engine/Actor.h"
#include "CoreMath.h"
#include "engine/World.h"
extern "C" {
#include "macros.h"
#include "main.h"
#include "camera.h"
#include "common_structs.h"
}
@ -19,7 +17,7 @@ public:
virtual ~ACloud() override = default;
// This is simply a helper function to keep Spawning code clean
static inline ACloud* Spawn(FVector pos, uint16_t time, f32 hop, f32 gravity) {
static ACloud* Spawn(FVector pos, uint16_t time, f32 hop, f32 gravity) {
SpawnParams params = {
.Name = "hm:cloud",
.Type = time, // How long the effect is active
@ -27,7 +25,7 @@ public:
.Speed = hop, // How high you hop
.SpeedB = gravity, // How much gravity is effected
};
return static_cast<ACloud*>(GetWorld()->AddActor(new ACloud(params)));
return dynamic_cast<ACloud*>(AddActorToWorld<ACloud>(params));
}
virtual void Tick() override;

View File

@ -1,15 +1,11 @@
#pragma once
#include <libultraship.h>
#include "RegisterContent.h"
#include "engine/Actor.h"
#include "CoreMath.h"
#include "engine/SpawnParams.h"
#include "engine/CoreMath.h"
#include "engine/World.h"
extern "C" {
#include "common_structs.h"
}
// Falls from the sky bouncing off of geography until it goes through water.
// Then after a brief period of time, respawns.
@ -23,13 +19,13 @@ public:
// This is simply a helper function to keep Spawning code clean
// @arg respawnTimer default game used 60, 120, 180 as the timer. Time until respawn after reaching the bottom?
static inline AFallingRock* Spawn(FVector pos, int16_t respawnTimer) {
static AFallingRock* Spawn(FVector pos, int16_t respawnTimer) {
SpawnParams params = {
.Name = "mk:falling_rock",
.Behaviour = respawnTimer,
.Location = pos,
};
return static_cast<AFallingRock*>(GetWorld()->AddActor(new AFallingRock(params)));
return dynamic_cast<AFallingRock*>(AddActorToWorld<AFallingRock>(params));
}
int16_t TimerLength = 80;

View File

@ -2,12 +2,10 @@
#include <libultraship.h>
#include "CoreMath.h"
#include "RegisterContent.h"
#include "engine/Actor.h"
#include "engine/World.h"
extern "C" {
#include "macros.h"
#include "main.h"
#include "camera.h"
#include "common_structs.h"
}
@ -25,20 +23,20 @@ public:
}
// This is simply a helper function to keep Spawning code clean
static inline AFinishline* Spawn(FVector pos, IRotator rot) {
static AFinishline* Spawn(FVector pos, IRotator rot) {
SpawnParams params = {
.Name = "mk:finishline",
.Location = pos,
.Rotation = rot,
};
return static_cast<AFinishline*>(GetWorld()->AddActor(new AFinishline(params)));
return dynamic_cast<AFinishline*>(AddActorToWorld<AFinishline>(params));
}
static inline AFinishline* Spawn() {
static AFinishline* Spawn() {
SpawnParams params = {
.Name = "mk:finishline",
};
return static_cast<AFinishline*>(GetWorld()->AddActor(new AFinishline(params)));
return dynamic_cast<AFinishline*>(AddActorToWorld<AFinishline>(params));
}
// Virtual functions to be overridden by derived classes

View File

@ -4,6 +4,7 @@
#include "engine/Actor.h"
#include "CoreMath.h"
#include "engine/World.h"
#include "RegisterContent.h"
extern "C" {
#include "common_structs.h"
@ -25,7 +26,7 @@ public:
.Velocity = velocity,
.Speed = 182,
};
return static_cast<AMarioSign*>(GetWorld()->AddActor(new AMarioSign(params)));
return static_cast<AMarioSign*>(AddActorToWorld<AMarioSign>(params));
}
virtual bool IsMod() override;

View File

@ -3,13 +3,8 @@
#include <libultraship.h>
#include <libultra/gbi.h>
#include "CoreMath.h"
#include "RegisterContent.h"
#include "engine/Actor.h"
#include "engine/World.h"
extern "C" {
#include "common_structs.h"
#include "assets/textures/other_textures.h"
}
class AShip : public AActor {
public:
@ -24,7 +19,7 @@ public:
virtual ~AShip() = default;
// This is simply a helper function to keep Spawning code clean
static inline AShip* Spawn(FVector pos, IRotator rot, FVector scale, int16_t skin) {
static AShip* Spawn(FVector pos, IRotator rot, FVector scale, int16_t skin) {
SpawnParams params = {
.Name = "hm:ship",
.Type = skin, // which ship model to use
@ -32,7 +27,7 @@ public:
.Rotation = rot,
.Scale = scale,
};
return static_cast<AShip*>(GetWorld()->AddActor(new AShip(params)));
return dynamic_cast<AShip*>(AddActorToWorld<AShip>(params));
}
AShip::Skin SpawnSkin = Skin::GHOSTSHIP;

View File

@ -3,6 +3,7 @@
#include <libultraship.h>
#include <libultra/gbi.h>
#include "CoreMath.h"
#include "RegisterContent.h"
#include "engine/Actor.h"
#include "engine/World.h"
@ -24,7 +25,7 @@ public:
.Rotation = rot,
.Scale = scale,
};
return static_cast<ASpaghettiShip*>(GetWorld()->AddActor(new ASpaghettiShip(params)));
return static_cast<ASpaghettiShip*>(AddActorToWorld<ASpaghettiShip>(params));
}
virtual void Tick() override;

View File

@ -3,6 +3,7 @@
#include <libultraship.h>
#include <libultra/gbi.h>
#include "CoreMath.h"
#include "RegisterContent.h"
#include "engine/Actor.h"
#include "engine/World.h"
@ -17,7 +18,7 @@ public:
virtual ~AStarship() = default;
// This is simply a helper function to keep Spawning code clean
static inline AStarship* Spawn(FVector pos, IRotator rot, FVector scale, f32 speed, f32 radius) {
static AStarship* Spawn(FVector pos, IRotator rot, FVector scale, f32 speed, f32 radius) {
SpawnParams params = {
.Name = "hm:starship",
.Location = pos,
@ -26,7 +27,7 @@ public:
.Speed = speed,
.SpeedB = radius,
};
return static_cast<AStarship*>(GetWorld()->AddActor(new AStarship(params)));
return dynamic_cast<AStarship*>(AddActorToWorld<AStarship>(params));
}
float SpeedB;

View File

@ -1,10 +1,10 @@
#pragma once
#include <libultraship.h>
#include "RegisterContent.h"
#include "engine/Actor.h"
#include "src/textures.h"
#include "engine/CoreMath.h"
#include "port/Game.h"
class AText : public AActor {
public:
@ -97,16 +97,16 @@ public:
* For transparency {0, 0, 0, 100} <-- alpha value of 100 will render semi-transparent black text.
*
*/
static inline AText* Spawn(std::string text, FVector pos, FVector scale, AText::TextMode textMode, int16_t playerIndex) {
static AText* Spawn(std::string text, FVector pos, FVector scale, AText::TextMode textMode, int16_t playerIndex) {
SpawnParams params = {
.Name = "hm:text",
.Type = static_cast<int16_t>(textMode),
.Behaviour = static_cast<int16_t>(playerIndex),
.Behaviour = playerIndex,
.Skin = text,
.Location = pos,
.Scale = scale,
};
return static_cast<AText*>(GetWorld()->AddActor(new AText(params)));
return dynamic_cast<AText*>(AddActorToWorld<AText>(params));
}
// Virtual functions to be overridden by derived classes

View File

@ -1,13 +1,9 @@
#pragma once
#include <libultraship.h>
#include "RegisterContent.h"
#include "engine/Actor.h"
#include "CoreMath.h"
#include "engine/World.h"
extern "C" {
#include "common_structs.h"
}
class AWarioSign : public AActor {
public:
@ -16,7 +12,7 @@ public:
explicit AWarioSign(const SpawnParams& params);
// This is simply a helper function to keep Spawning code clean
static inline AWarioSign* Spawn(FVector pos, IRotator rot, FVector velocity, FVector scale) {
static AWarioSign* Spawn(FVector pos, IRotator rot, FVector velocity, FVector scale) {
SpawnParams params = {
.Name = "mk:wario_sign",
.Location = pos,
@ -25,7 +21,7 @@ public:
.Velocity = velocity,
.Speed = 182,
};
return static_cast<AWarioSign*>(GetWorld()->AddActor(new AWarioSign(params)));
return dynamic_cast<AWarioSign*>(AddActorToWorld<AWarioSign>(params));
}
virtual bool IsMod() override;

View File

@ -249,7 +249,7 @@ std::pair<AActor*, float> ObjectPicker::CheckAActorRay(Ray ray) {
AActor* hitActor = nullptr;
float hitDistance = FLT_MAX;
for (auto actor : GetWorld()->Actors) {
for (const auto& actor : GetWorld()->Actors) {
if ((actor->bPendingDestroy) && (!actor->IsMod())) {
continue;
}
@ -265,7 +265,7 @@ std::pair<AActor*, float> ObjectPicker::CheckAActorRay(Ray ray) {
if (IntersectRayTriangleAndTransform(ray, FVector(actor->Pos[0], actor->Pos[1], actor->Pos[2]), tri, t)) {
if (t < hitDistance) {
hitDistance = t;
hitActor = static_cast<AActor*>(actor);
hitActor = actor.get();
}
}
}
@ -283,7 +283,7 @@ std::pair<AActor*, float> ObjectPicker::CheckAActorRay(Ray ray) {
if (QueryCollisionRayActor(&ray.Origin.x, &ray.Direction.x, boxMin, boxMax, &t)) {
if (t < hitDistance) {
hitDistance = t;
hitActor = static_cast<AActor*>(actor);
hitActor = actor.get();
}
}
}

View File

@ -7,6 +7,7 @@
#include <iostream>
#include <fstream>
#include <memory>
#include <optional> // Must be before json.hpp
#include <nlohmann/json.hpp>
#include "port/Engine.h"
@ -168,8 +169,8 @@ namespace Editor {
}
void Load_AddStaticMeshActor(const nlohmann::json& actorJson) {
GetWorld()->StaticMeshActors.push_back(new StaticMeshActor("", FVector(0, 0, 0), IRotator(0, 0, 0), FVector(1, 1, 1), "", nullptr));
auto actor = GetWorld()->StaticMeshActors.back();
GetWorld()->StaticMeshActors.push_back(std::make_unique<StaticMeshActor>("", FVector(0, 0, 0), IRotator(0, 0, 0), FVector(1, 1, 1), "", nullptr));
auto& actor = GetWorld()->StaticMeshActors.back();
actor->from_json(actorJson);
printf("After from_json: Pos(%f, %f, %f), Name: %s, Model: %s\n",

View File

@ -4,6 +4,7 @@
#include <vector>
#include "Object.h"
#include "RegisterContent.h"
#include "World.h"
#include "CoreMath.h"
@ -36,7 +37,7 @@ public:
.Location = pos,
.Rotation = rot,
};
return static_cast<OBat*>(GetWorld()->AddObject(new OBat(params)));
return dynamic_cast<OBat*>(AddObjectToWorld<OBat>(params));
}
explicit OBat(const SpawnParams& params);

View File

@ -1,19 +1,13 @@
#pragma once
#include <libultraship.h>
#include "RegisterContent.h"
#include "engine/objects/Object.h"
#include <vector>
#include "engine/Matrix.h"
#include "World.h"
extern "C" {
#include "macros.h"
#include "main.h"
#include "vehicles.h"
#include "waypoints.h"
#include "common_structs.h"
#include "objects.h"
}
/**
@ -52,7 +46,7 @@ class OBombKart : public OObject {
// This is simply a helper function to keep Spawning code clean
// Spawn object at a position
static inline OBombKart* Spawn(FVector pos, uint16_t behaviour, f32 unk_3C) {
static OBombKart* Spawn(FVector pos, uint16_t behaviour, f32 unk_3C) {
SpawnParams params = {
.Name = "mk:bomb_kart",
.Behaviour = behaviour,
@ -60,11 +54,11 @@ class OBombKart : public OObject {
.Speed = unk_3C, // Only used for podium ceremony. Arbitrarily chose Speed for this
.SpeedB = 2.7f, // Chase speed
};
return static_cast<OBombKart*>(GetWorld()->AddObject(new OBombKart(params)));
return dynamic_cast<OBombKart*>(AddObjectToWorld<OBombKart>(params));
}
// Spawn object at a point along the tracks path
static inline OBombKart* Spawn(uint32_t pathIndex, uint32_t pathPoint, uint16_t behaviour, f32 unk_3C) {
static OBombKart* Spawn(uint32_t pathIndex, uint32_t pathPoint, uint16_t behaviour, f32 unk_3C) {
SpawnParams params = {
.Name = "mk:bomb_kart",
.Behaviour = behaviour,
@ -72,7 +66,7 @@ class OBombKart : public OObject {
.PathPoint = pathPoint,
.Speed = unk_3C, // Only used for podium ceremony. Arbitrarily chose Speed for this
};
return static_cast<OBombKart*>(GetWorld()->AddObject(new OBombKart(params)));
return dynamic_cast<OBombKart*>(AddObjectToWorld<OBombKart>(params));
}
// Set waypoint to NULL if using a spawn position and not a waypoint.

View File

@ -4,6 +4,7 @@
#include <vector>
#include "Object.h"
#include "RegisterContent.h"
#include "World.h"
#include "CoreMath.h"
@ -45,7 +46,7 @@ public:
.TriggerSpan = triggerBoundary,
.RightExitSpan = rightBoundary,
};
return static_cast<OBoos*>(GetWorld()->AddObject(new OBoos(params)));
return static_cast<OBoos*>(AddObjectToWorld<OBoos>(params));
}
explicit OBoos(const SpawnParams& params);

View File

@ -29,6 +29,16 @@ OChainChomp::OChainChomp() {
_count++;
}
OChainChomp::OChainChomp(const SpawnParams& params) {
Name = "Chain Chomp";
ResourceName = "mk:chain_chomp";
_idx = _count;
init_object(indexObjectList2[_idx], 0);
_objectIndex = indexObjectList2[_idx];
_count++;
}
void OChainChomp::Tick() {
s32 objectIndex;
Object* object;

View File

@ -23,6 +23,7 @@ extern "C" {
class OChainChomp : public OObject {
public:
explicit OChainChomp();
explicit OChainChomp(const SpawnParams& params);
~OChainChomp() {

View File

@ -3,6 +3,7 @@
#include <libultraship.h>
#include <vector>
#include "Object.h"
#include "RegisterContent.h"
#include "engine/CoreMath.h"
#include "World.h"
@ -32,7 +33,7 @@ public:
.Location = pos,
.PathSpan = span,
};
return static_cast<OCheepCheep*>(GetWorld()->AddObject(new OCheepCheep(params)));
return static_cast<OCheepCheep*>(AddObjectToWorld<OCheepCheep>(params));
}
explicit OCheepCheep(const SpawnParams& params);

View File

@ -2,6 +2,7 @@
#include <libultraship.h>
#include <vector>
#include "RegisterContent.h"
#include "engine/objects/Object.h"
#include "CoreMath.h"
#include "World.h"
@ -37,7 +38,7 @@ public:
.PatrolStart = start,
.PatrolEnd = end,
};
return static_cast<OCrab*>(GetWorld()->AddObject(new OCrab(params)));
return static_cast<OCrab*>(AddObjectToWorld<OCrab>(params));
}
explicit OCrab(const SpawnParams& params);

View File

@ -4,6 +4,7 @@
#include <vector>
#include "Object.h"
#include "RegisterContent.h"
#include "World.h"
extern "C" {
@ -24,7 +25,7 @@ public:
explicit OFlagpole(const SpawnParams& params);
// This is simply a helper function to keep Spawning code clean
static inline OFlagpole* Spawn(FVector pos, s16 direction) {
static OFlagpole* Spawn(FVector pos, s16 direction) {
IRotator rot;
rot.Set(0, direction, 0);
SpawnParams params = {
@ -32,7 +33,7 @@ public:
.Location = pos,
.Rotation = rot,
};
return static_cast<OFlagpole*>(GetWorld()->AddObject(new OFlagpole(params)));
return dynamic_cast<OFlagpole*>(AddObjectToWorld<OFlagpole>(params));
}
~OFlagpole() {

View File

@ -1,20 +1,13 @@
#pragma once
#include <libultraship.h>
#include <vector>
#include "RegisterContent.h"
#include "engine/World.h"
#include "engine/objects/Object.h"
extern "C" {
#include "macros.h"
#include "main.h"
#include "vehicles.h"
#include "waypoints.h"
#include "common_structs.h"
#include "objects.h"
#include "camera.h"
#include "some_data.h"
}
@ -28,12 +21,12 @@ public:
explicit OGrandPrixBalloons(const SpawnParams& params);
// This is simply a helper function to keep Spawning code clean
static inline OGrandPrixBalloons* Spawn(const FVector& pos) {
static OGrandPrixBalloons* Spawn(const FVector& pos) {
SpawnParams params = {
.Name = "mk:grand_prix_balloons",
.Location = pos,
};
return static_cast<OGrandPrixBalloons*>(GetWorld()->AddObject(new OGrandPrixBalloons(params)));
return dynamic_cast<OGrandPrixBalloons*>(AddObjectToWorld<OGrandPrixBalloons>(params));
}
~OGrandPrixBalloons() {

View File

@ -4,6 +4,7 @@
#include <vector>
#include "Object.h"
#include "RegisterContent.h"
#include "engine/World.h"
extern "C" {
@ -34,7 +35,7 @@ public:
.Location = pos,
.PatrolEnd = patrolPoint,
};
return static_cast<OHedgehog*>(GetWorld()->AddObject(new OHedgehog(params)));
return static_cast<OHedgehog*>(AddObjectToWorld<OHedgehog>(params));
}
~OHedgehog() {

View File

@ -1,33 +1,22 @@
#pragma once
#include <libultraship.h>
#include <vector>
#include "Object.h"
#include "RegisterContent.h"
#include "World.h"
extern "C" {
#include "macros.h"
#include "main.h"
#include "vehicles.h"
#include "waypoints.h"
#include "common_structs.h"
#include "objects.h"
#include "camera.h"
#include "some_data.h"
}
class OHotAirBalloon : public OObject {
public:
explicit OHotAirBalloon(const SpawnParams& params);
// This is simply a helper function to keep Spawning code clean
static inline OHotAirBalloon* Spawn(FVector pos) {
static OHotAirBalloon* Spawn(FVector pos) {
SpawnParams params = {
.Name = "mk:hot_air_balloon",
.Location = pos,
};
return static_cast<OHotAirBalloon*>(GetWorld()->AddObject(new OHotAirBalloon(params)));
return dynamic_cast<OHotAirBalloon*>(AddObjectToWorld<OHotAirBalloon>(params));
}
virtual void Tick() override;

View File

@ -15,7 +15,7 @@ OMoleGroup::OMoleGroup(std::vector<FVector>& spawns, size_t tickRate) {
_tickRate = tickRate;
for (auto& pos : spawns) {
pos.x * xOrientation;
OMole* ptr = reinterpret_cast<OMole*>(GetWorld()->AddObject(new OMole(pos, this)));
OMole* ptr = reinterpret_cast<OMole*>(GetWorld()->AddObject(OMole(pos, this)));
_moles.push_back({ptr, pos, false});
}

View File

@ -1,20 +1,10 @@
#pragma once
#include <libultraship.h>
#include <vector>
#include "RegisterContent.h"
#include "engine/World.h"
#include "engine/objects/Object.h"
extern "C" {
#include "macros.h"
#include "main.h"
#include "vehicles.h"
#include "waypoints.h"
#include "common_structs.h"
#include "objects.h"
#include "course_offsets.h"
}
class OPenguin : public OObject {
public:
enum PenguinType : int16_t {
@ -34,11 +24,10 @@ public:
SLIDE6,
};
public:
explicit OPenguin(const SpawnParams& params);
// This is simply a helper function to keep Spawning code clean
static inline OPenguin* Spawn(FVector pos, u16 direction, u16 mirrorModeAngleOffset, f32 diameter, PenguinType type, Behaviour behaviour) {
static OPenguin* Spawn(FVector pos, u16 direction, u16 mirrorModeAngleOffset, f32 diameter, PenguinType type, Behaviour behaviour) {
IRotator rot;
rot.Set(0, direction, mirrorModeAngleOffset);
SpawnParams params = {
@ -49,7 +38,7 @@ public:
.Rotation = rot,
.Speed = diameter, // Diameter of the walking circle
};
return static_cast<OPenguin*>(GetWorld()->AddObject(new OPenguin(params)));
return dynamic_cast<OPenguin*>(AddObjectToWorld<OPenguin>(params));
}
PenguinType Type = PenguinType::CHICK;

View File

@ -1,38 +1,25 @@
#pragma once
#include <libultraship.h>
#include <vector>
#include "RegisterContent.h"
#include "World.h"
extern "C" {
#include "macros.h"
#include "main.h"
#include "vehicles.h"
#include "waypoints.h"
#include "common_structs.h"
#include "objects.h"
#include "course_offsets.h"
#include "some_data.h"
}
class OPodium : public OObject {
public:
enum Behaviour : uint16_t {
};
public:
explicit OPodium(const SpawnParams& params);
// This is simply a helper function to keep Spawning code clean
static inline OPodium* Spawn(const FVector& pos) {
static OPodium* Spawn(const FVector& pos) {
SpawnParams params = {
.Name = "mk:podium",
.Location = pos,
};
return static_cast<OPodium*>(GetWorld()->AddObject(new OPodium(params)));
return dynamic_cast<OPodium*>(AddObjectToWorld<OPodium>(params));
}
virtual void Tick() override;

View File

@ -1,21 +1,11 @@
#pragma once
#include <libultraship.h>
#include <vector>
#include "Object.h"
#include "RegisterContent.h"
#include "engine/World.h"
extern "C" {
#include "macros.h"
#include "main.h"
#include "vehicles.h"
#include "waypoints.h"
#include "common_structs.h"
#include "objects.h"
#include "camera.h"
}
//! @todo unk_0D5 needs to be a struct variable probably. What does it do? Behaviour?
class OSeagull : public OObject {
public:
@ -30,12 +20,12 @@ public:
}
// This is simply a helper function to keep Spawning code clean
static inline OSeagull* Spawn(const FVector& pos) {
static OSeagull* Spawn(const FVector& pos) {
SpawnParams params = {
.Name = "mk:seagull",
.Location = pos,
};
return static_cast<OSeagull*>(GetWorld()->AddObject(new OSeagull(params)));
return dynamic_cast<OSeagull*>(AddObjectToWorld<OSeagull>(params));
}
virtual void Tick() override;

View File

@ -1,31 +1,24 @@
#pragma once
#include <libultraship.h>
#include <vector>
#include "Object.h"
#include "RegisterContent.h"
#include "World.h"
extern "C" {
#include "macros.h"
#include "main.h"
#include "vehicles.h"
#include "waypoints.h"
#include "common_structs.h"
#include "objects.h"
#include "camera.h"
#include "some_data.h"
}
class OSnowman : public OObject {
public:
// This is simply a helper function to keep Spawning code clean
static inline OSnowman* Spawn(FVector pos) {
static OSnowman* Spawn(FVector pos) {
SpawnParams params = {
.Name = "mk:snowman",
.Location = FVector(pos.x, pos.y, pos.z),
};
return static_cast<OSnowman*>(GetWorld()->AddObject(new OSnowman(params)));
return dynamic_cast<OSnowman*>(AddObjectToWorld<OSnowman>(params));
}
explicit OSnowman(const SpawnParams& params);

View File

@ -1,7 +1,7 @@
#pragma once
#include <libultraship.h>
#include <vector>
#include "RegisterContent.h"
#include "engine/World.h"
#include "engine/SpawnParams.h"
#include "engine/CoreMath.h"
@ -9,14 +9,8 @@
#include "engine/objects/Object.h"
extern "C" {
#include "macros.h"
#include "main.h"
#include "vehicles.h"
#include "waypoints.h"
#include "common_structs.h"
#include "objects.h"
#include "camera.h"
#include "some_data.h"
}
//! @todo Make shadow size bigger if thwomp is scaled up
@ -45,7 +39,7 @@ public:
};
// This is simply a helper function to keep Spawning code clean
static inline OThwomp* Spawn(s16 x, s16 z, s16 direction, f32 scale, s16 behaviour, s16 primAlpha, u16 boundingBoxSize = 7) {
static OThwomp* Spawn(s16 x, s16 z, s16 direction, f32 scale, s16 behaviour, s16 primAlpha, u16 boundingBoxSize = 7) {
IRotator rot;
rot.Set(0, direction, 0);
@ -58,7 +52,7 @@ public:
.PrimAlpha = primAlpha,
.BoundingBoxSize = boundingBoxSize
};
return static_cast<OThwomp*>(GetWorld()->AddObject(new OThwomp(params)));
return dynamic_cast<OThwomp*>(AddObjectToWorld<OThwomp>(params));
}
explicit OThwomp(const SpawnParams& params);

View File

@ -1,22 +1,11 @@
#pragma once
#include <libultraship.h>
#include <vector>
#include "Object.h"
#include "RegisterContent.h"
#include "World.h"
extern "C" {
#include "macros.h"
#include "main.h"
#include "vehicles.h"
#include "waypoints.h"
#include "common_structs.h"
#include "objects.h"
#include "camera.h"
#include "some_data.h"
}
class OTrashBin : public OObject {
public:
@ -26,7 +15,7 @@ public:
};
// This is simply a helper function to keep Spawning code clean
static inline OTrashBin* Spawn(const FVector& pos, const IRotator& rot, f32 scale, OTrashBin::Behaviour bhv) {
static OTrashBin* Spawn(const FVector& pos, const IRotator& rot, f32 scale, OTrashBin::Behaviour bhv) {
SpawnParams params = {
.Name = "mk:trash_bin",
.Behaviour = bhv,
@ -34,7 +23,7 @@ public:
.Rotation = rot,
.Scale = FVector(0, scale, 0),
};
return static_cast<OTrashBin*>(GetWorld()->AddObject(new OTrashBin(params)));
return dynamic_cast<OTrashBin*>(AddObjectToWorld<OTrashBin>(params));
}
explicit OTrashBin(const SpawnParams& params);

View File

@ -1,20 +1,13 @@
#pragma once
#include <libultraship.h>
#include <vector>
#include "Object.h"
#include "RegisterContent.h"
#include "World.h"
#include "engine/particles/StarEmitter.h"
extern "C" {
#include "macros.h"
#include "main.h"
#include "vehicles.h"
#include "waypoints.h"
#include "common_structs.h"
#include "objects.h"
#include "course_offsets.h"
#include "some_data.h"
}
class OTrophy : public OObject {
@ -37,14 +30,14 @@ public:
};
// This is simply a helper function to keep Spawning code clean
static inline OTrophy* Spawn(const FVector& pos, TrophyType trophy, Behaviour bhv) {
static OTrophy* Spawn(const FVector& pos, TrophyType trophy, Behaviour bhv) {
SpawnParams params = {
.Name = "mk:trophy",
.Type = trophy,
.Behaviour = bhv,
.Location = pos,
};
return static_cast<OTrophy*>(GetWorld()->AddObject(new OTrophy(params)));
return dynamic_cast<OTrophy*>(AddObjectToWorld<OTrophy>(params));
}
explicit OTrophy(const SpawnParams& params);

View File

@ -16,6 +16,7 @@
#include "engine/objects/Boos.h"
#include "assets/models/tracks/banshee_boardwalk/banshee_boardwalk_data.h"
#include "assets/other/tracks/banshee_boardwalk/banshee_boardwalk_data.h"
#include "port/Game.h"
#include "assets/textures/boo_frames.h"
extern "C" {
@ -165,25 +166,25 @@ void BansheeBoardwalk::BeginPlay() {
}
if (gIsMirrorMode) {
OTrashBin::Spawn(FVector(1765.0f, 45.0f, 195.0f), IRotator(0, 180, 0), 1.0f, bhv);
SpawnActor<OTrashBin>(FVector(1765.0f, 45.0f, 195.0f), IRotator(0, 180, 0), 1.0f, bhv);
} else {
OTrashBin::Spawn(FVector(-1765.0f, 45.0f, 70.0f), IRotator(0, 0, 0), 1.0f, bhv);
SpawnActor<OTrashBin>(FVector(-1765.0f, 45.0f, 70.0f), IRotator(0, 0, 0), 1.0f, bhv);
}
if ((gGamestate != CREDITS_SEQUENCE) && (gModeSelection != TIME_TRIALS)) {
OBat::Spawn(FVector(0,0,0), IRotator(0, 0, 90));
OBoos::Spawn(5, IPathSpan(180, 190), IPathSpan(200, 210), IPathSpan(280, 290));
OBoos::Spawn(5, IPathSpan(490, 500), IPathSpan(510, 520), IPathSpan(620, 630));
SpawnActor<OBat>(FVector(0,0,0), IRotator(0, 0, 90));
SpawnActor<OBoos>(5, IPathSpan(180, 190), IPathSpan(200, 210), IPathSpan(280, 290));
SpawnActor<OBoos>(5, IPathSpan(490, 500), IPathSpan(510, 520), IPathSpan(620, 630));
}
if (gModeSelection == VERSUS) {
OBombKart::Spawn(0, 110, 3, 0.8333333f);
OBombKart::Spawn(0, 190, 1, 0.8333333f);
OBombKart::Spawn(0, 250, 3, 0.8333333f);
OBombKart::Spawn(0, 475, 1, 0.8333333f);
OBombKart::Spawn(0, 610, 3, 0.8333333f);
OBombKart::Spawn(0, 0, 0, 0.8333333f);
OBombKart::Spawn(0, 0, 0, 0.8333333f);
SpawnActor<OBombKart>(0, 110, 3, 0.8333333f);
SpawnActor<OBombKart>(0, 190, 1, 0.8333333f);
SpawnActor<OBombKart>(0, 250, 3, 0.8333333f);
SpawnActor<OBombKart>(0, 475, 1, 0.8333333f);
SpawnActor<OBombKart>(0, 610, 3, 0.8333333f);
SpawnActor<OBombKart>(0, 0, 0, 0.8333333f);
SpawnActor<OBombKart>(0, 0, 0, 0.8333333f);
}
}

View File

@ -129,13 +129,13 @@ void BigDonut::BeginPlay() {
spawn_all_item_boxes((ActorSpawnData*) LOAD_ASSET_RAW(d_course_big_donut_item_box_spawns));
if (gModeSelection == VERSUS) {
OBombKart::Spawn(0, 20, 0, 1.0f);
OBombKart::Spawn(0, 40, 0, 1.0f);
OBombKart::Spawn(0, 60, 0, 1.0f);
OBombKart::Spawn(0, 80, 0, 1.0f);
OBombKart::Spawn(0, 100, 0, 1.0f);
OBombKart::Spawn(0, 120, 0, 1.0);
OBombKart::Spawn(0, 140, 0, 1.0f);
SpawnActor<OBombKart>(0, 20, 0, 1.0f);
SpawnActor<OBombKart>(0, 40, 0, 1.0f);
SpawnActor<OBombKart>(0, 60, 0, 1.0f);
SpawnActor<OBombKart>(0, 80, 0, 1.0f);
SpawnActor<OBombKart>(0, 100, 0, 1.0f);
SpawnActor<OBombKart>(0, 120, 0, 1.0);
SpawnActor<OBombKart>(0, 140, 0, 1.0f);
}
}

View File

@ -120,13 +120,13 @@ void BlockFort::BeginPlay() {
spawn_all_item_boxes((ActorSpawnData*) LOAD_ASSET_RAW(d_course_block_fort_item_box_spawns));
if (gModeSelection == VERSUS) {
OBombKart::Spawn(0, 20, 0, 1.0f);
OBombKart::Spawn(0, 40, 0, 1.0f);
OBombKart::Spawn(0, 60, 0, 1.0f);
OBombKart::Spawn(0, 80, 0, 1.0f);
OBombKart::Spawn(0, 100, 0, 1.0f);
OBombKart::Spawn(0, 120, 0, 1.0f);
OBombKart::Spawn(0, 140, 0, 1.0f);
SpawnActor<OBombKart>(0, 20, 0, 1.0f);
SpawnActor<OBombKart>(0, 40, 0, 1.0f);
SpawnActor<OBombKart>(0, 60, 0, 1.0f);
SpawnActor<OBombKart>(0, 80, 0, 1.0f);
SpawnActor<OBombKart>(0, 100, 0, 1.0f);
SpawnActor<OBombKart>(0, 120, 0, 1.0f);
SpawnActor<OBombKart>(0, 140, 0, 1.0f);
}
}

View File

@ -138,52 +138,52 @@ void BowsersCastle::BeginPlay() {
switch (gCCSelection) {
case CC_100:
case CC_EXTRA:
OThwomp::Spawn(0x0320, 0xf92a, 0xC000, 1.0f, OThwomp::States::STATIONARY, 0);
OThwomp::Spawn(0x044c, 0xf92a, 0xC000, 1.0f, OThwomp::States::STATIONARY, 1);
OThwomp::Spawn(0x02bc, 0xf95c, 0xC000, 1.0f, OThwomp::States::MOVE_AND_ROTATE, 0);
OThwomp::Spawn(0x04b0, 0xf8f8, 0xC000, 1.0f, OThwomp::States::MOVE_AND_ROTATE, 1);
OThwomp::Spawn(0x04b0, 0xf5ba, 0xC000, 1.0f, OThwomp::States::MOVE_FAR, 0);
OThwomp::Spawn(0x04b0, 0xf592, 0xC000, 1.0f, OThwomp::States::MOVE_FAR, 1);
OThwomp::Spawn(0x091a, 0xf5bf, 0xC000, 1.0f, OThwomp::States::STATIONARY_FAST, 0);
OThwomp::Spawn(0x091a, 0xf597, 0xC000, 1.0f, OThwomp::States::STATIONARY_FAST, 1);
OThwomp::Spawn(0x0596, 0xf92f, 0xC000, 1.5f, OThwomp::States::JAILED, 0);
OThwomp::Spawn(0x082a, 0xf9f2, 0x4000, 1.0f, OThwomp::States::SLIDE, 0);
OThwomp::Spawn(0x073a, 0xf9f2, 0x4000, 1.0f, OThwomp::States::SLIDE, 1);
SpawnActor<OThwomp>(0x0320, 0xf92a, 0xC000, 1.0f, OThwomp::States::STATIONARY, 0);
SpawnActor<OThwomp>(0x044c, 0xf92a, 0xC000, 1.0f, OThwomp::States::STATIONARY, 1);
SpawnActor<OThwomp>(0x02bc, 0xf95c, 0xC000, 1.0f, OThwomp::States::MOVE_AND_ROTATE, 0);
SpawnActor<OThwomp>(0x04b0, 0xf8f8, 0xC000, 1.0f, OThwomp::States::MOVE_AND_ROTATE, 1);
SpawnActor<OThwomp>(0x04b0, 0xf5ba, 0xC000, 1.0f, OThwomp::States::MOVE_FAR, 0);
SpawnActor<OThwomp>(0x04b0, 0xf592, 0xC000, 1.0f, OThwomp::States::MOVE_FAR, 1);
SpawnActor<OThwomp>(0x091a, 0xf5bf, 0xC000, 1.0f, OThwomp::States::STATIONARY_FAST, 0);
SpawnActor<OThwomp>(0x091a, 0xf597, 0xC000, 1.0f, OThwomp::States::STATIONARY_FAST, 1);
SpawnActor<OThwomp>(0x0596, 0xf92f, 0xC000, 1.5f, OThwomp::States::JAILED, 0);
SpawnActor<OThwomp>(0x082a, 0xf9f2, 0x4000, 1.0f, OThwomp::States::SLIDE, 0);
SpawnActor<OThwomp>(0x073a, 0xf9f2, 0x4000, 1.0f, OThwomp::States::SLIDE, 1);
break;
case CC_50:
OThwomp::Spawn(0x3B6, 0xF92A, 0xC000, 1.0f, OThwomp::States::STATIONARY, 0);
OThwomp::Spawn(0x0352, 0xf95c, 0xC000, 1.0f, OThwomp::States::MOVE_AND_ROTATE, 0);
OThwomp::Spawn(0x04b0, 0xf5ba, 0xC000, 1.0f, OThwomp::States::MOVE_FAR, 0);
OThwomp::Spawn(0x04b0, 0xf592, 0xC000, 1.0f, OThwomp::States::MOVE_FAR, 1);
OThwomp::Spawn(0x091a, 0xf5b0, 0xC000, 1.0f, OThwomp::States::STATIONARY_FAST, 0);
OThwomp::Spawn(0x0596, 0xf92f, 0xC000, 1.5f, OThwomp::States::JAILED, 0);
OThwomp::Spawn(0x082a, 0xf9f2, 0x4000, 1.0f, OThwomp::States::SLIDE , 0);
OThwomp::Spawn(0x073a, 0xf9f2, 0x4000, 1.0f, OThwomp::States::SLIDE, 1);
SpawnActor<OThwomp>(0x3B6, 0xF92A, 0xC000, 1.0f, OThwomp::States::STATIONARY, 0);
SpawnActor<OThwomp>(0x0352, 0xf95c, 0xC000, 1.0f, OThwomp::States::MOVE_AND_ROTATE, 0);
SpawnActor<OThwomp>(0x04b0, 0xf5ba, 0xC000, 1.0f, OThwomp::States::MOVE_FAR, 0);
SpawnActor<OThwomp>(0x04b0, 0xf592, 0xC000, 1.0f, OThwomp::States::MOVE_FAR, 1);
SpawnActor<OThwomp>(0x091a, 0xf5b0, 0xC000, 1.0f, OThwomp::States::STATIONARY_FAST, 0);
SpawnActor<OThwomp>(0x0596, 0xf92f, 0xC000, 1.5f, OThwomp::States::JAILED, 0);
SpawnActor<OThwomp>(0x082a, 0xf9f2, 0x4000, 1.0f, OThwomp::States::SLIDE , 0);
SpawnActor<OThwomp>(0x073a, 0xf9f2, 0x4000, 1.0f, OThwomp::States::SLIDE, 1);
break;
case CC_150:
OThwomp::Spawn(0x0320, 0xf92a, 0xC000, 1.0f, OThwomp::States::STATIONARY, 0);
OThwomp::Spawn(0x044c, 0xf92a, 0xC000, 1.0f, OThwomp::States::STATIONARY, 1);
OThwomp::Spawn(0x02bc, 0xf95c, 0xC000, 1.0f, OThwomp::States::MOVE_AND_ROTATE, 0);
OThwomp::Spawn(0x04b0, 0xf8f8, 0xC000, 1.0f, OThwomp::States::MOVE_AND_ROTATE, 1);
OThwomp::Spawn(0x04b0, 0xf5ba, 0xC000, 1.0f, OThwomp::States::MOVE_FAR, 0);
OThwomp::Spawn(0x04b0, 0xf592, 0xC000, 1.0f, OThwomp::States::MOVE_FAR, 1);
OThwomp::Spawn(0x091a, 0xf5c9, 0xC000, 1.0f, OThwomp::States::STATIONARY_FAST, 0);
OThwomp::Spawn(0x091a, 0xf5ab, 0xC000, 1.0f, OThwomp::States::STATIONARY_FAST, 1);
OThwomp::Spawn(0x091a, 0xf58d, 0xC000, 1.0f, OThwomp::States::STATIONARY_FAST, 2);
OThwomp::Spawn(0x0596, 0xf92f, 0xC000, 1.5f, OThwomp::States::JAILED, 0);
OThwomp::Spawn(0x082a, 0xf9f2, 0x4000, 1.0f, OThwomp::States::SLIDE, 0);
OThwomp::Spawn(0x073a, 0xf9f2, 0x4000, 1.0f, OThwomp::States::SLIDE, 1);
SpawnActor<OThwomp>(0x0320, 0xf92a, 0xC000, 1.0f, OThwomp::States::STATIONARY, 0);
SpawnActor<OThwomp>(0x044c, 0xf92a, 0xC000, 1.0f, OThwomp::States::STATIONARY, 1);
SpawnActor<OThwomp>(0x02bc, 0xf95c, 0xC000, 1.0f, OThwomp::States::MOVE_AND_ROTATE, 0);
SpawnActor<OThwomp>(0x04b0, 0xf8f8, 0xC000, 1.0f, OThwomp::States::MOVE_AND_ROTATE, 1);
SpawnActor<OThwomp>(0x04b0, 0xf5ba, 0xC000, 1.0f, OThwomp::States::MOVE_FAR, 0);
SpawnActor<OThwomp>(0x04b0, 0xf592, 0xC000, 1.0f, OThwomp::States::MOVE_FAR, 1);
SpawnActor<OThwomp>(0x091a, 0xf5c9, 0xC000, 1.0f, OThwomp::States::STATIONARY_FAST, 0);
SpawnActor<OThwomp>(0x091a, 0xf5ab, 0xC000, 1.0f, OThwomp::States::STATIONARY_FAST, 1);
SpawnActor<OThwomp>(0x091a, 0xf58d, 0xC000, 1.0f, OThwomp::States::STATIONARY_FAST, 2);
SpawnActor<OThwomp>(0x0596, 0xf92f, 0xC000, 1.5f, OThwomp::States::JAILED, 0);
SpawnActor<OThwomp>(0x082a, 0xf9f2, 0x4000, 1.0f, OThwomp::States::SLIDE, 0);
SpawnActor<OThwomp>(0x073a, 0xf9f2, 0x4000, 1.0f, OThwomp::States::SLIDE, 1);
break;
}
if (gModeSelection == VERSUS) {
OBombKart::Spawn(0, 50, 3, 0.8333333f);
OBombKart::Spawn(0, 150, 1, 0.8333333f);
OBombKart::Spawn(0, 200, 3, 0.8333333f);
OBombKart::Spawn(0, 260, 1, 0.8333333f);
OBombKart::Spawn(0, 435, 3, 0.8333333f);
OBombKart::Spawn(0, 0, 0, 0.8333333f);
OBombKart::Spawn(0, 0, 0, 0.8333333f);
SpawnActor<OBombKart>(0, 50, 3, 0.8333333f);
SpawnActor<OBombKart>(0, 150, 1, 0.8333333f);
SpawnActor<OBombKart>(0, 200, 3, 0.8333333f);
SpawnActor<OBombKart>(0, 260, 1, 0.8333333f);
SpawnActor<OBombKart>(0, 435, 3, 0.8333333f);
SpawnActor<OBombKart>(0, 0, 0, 0.8333333f);
SpawnActor<OBombKart>(0, 0, 0, 0.8333333f);
}
}

View File

@ -160,18 +160,18 @@ void ChocoMountain::Load() {
void ChocoMountain::BeginPlay() {
spawn_all_item_boxes((struct ActorSpawnData*)LOAD_ASSET_RAW(d_course_choco_mountain_item_box_spawns));
AFallingRock::Spawn(FVector(2019, 156, 164), 60);
AFallingRock::Spawn(FVector(2018, 155, 379), 120);
AFallingRock::Spawn(FVector(1996, 146, 505), 180);
SpawnActor<AFallingRock>(FVector(2019, 156, 164), 60);
SpawnActor<AFallingRock>(FVector(2018, 155, 379), 120);
SpawnActor<AFallingRock>(FVector(1996, 146, 505), 180);
if (gModeSelection == VERSUS) {
OBombKart::Spawn(0, 140, 3, 0.8333333f);
OBombKart::Spawn(0, 165, 1, 0.8333333f);
OBombKart::Spawn(0, 330, 3, 0.8333333f);
OBombKart::Spawn(0, 550, 1, 0.8333333f);
OBombKart::Spawn(0, 595, 3, 0.8333333f);
OBombKart::Spawn(0, 0, 0, 0.8333333f);
OBombKart::Spawn(0, 0, 0, 0.8333333f);
SpawnActor<OBombKart>(0, 140, 3, 0.8333333f);
SpawnActor<OBombKart>(0, 165, 1, 0.8333333f);
SpawnActor<OBombKart>(0, 330, 3, 0.8333333f);
SpawnActor<OBombKart>(0, 550, 1, 0.8333333f);
SpawnActor<OBombKart>(0, 595, 3, 0.8333333f);
SpawnActor<OBombKart>(0, 0, 0, 0.8333333f);
SpawnActor<OBombKart>(0, 0, 0, 0.8333333f);
}
}

View File

@ -175,16 +175,16 @@ void DKJungle::BeginPlay() {
// The original game only ran vehicle logic every second frame.
// Thus the speed gets divided by two to set speed to match properly
ABoat::Spawn((0.6666666f)/4, 0, 0, ABoat::SpawnMode::POINT);
SpawnActor<ABoat>((0.6666666f)/4, 0, 0, ABoat::SpawnMode::POINT);
if (gModeSelection == VERSUS) {
OBombKart::Spawn(0, 50, 3, 0.8333333f);
OBombKart::Spawn(0, 100, 1, 0.8333333f);
OBombKart::Spawn(0, 150, 3, 0.8333333f);
OBombKart::Spawn(0, 190, 1, 0.8333333f);
OBombKart::Spawn(0, 250, 3, 0.8333333f);
OBombKart::Spawn(0, 0, 0, 0.8333333f);
OBombKart::Spawn(0, 0, 0, 0.8333333f);
SpawnActor<OBombKart>(0, 50, 3, 0.8333333f);
SpawnActor<OBombKart>(0, 100, 1, 0.8333333f);
SpawnActor<OBombKart>(0, 150, 3, 0.8333333f);
SpawnActor<OBombKart>(0, 190, 1, 0.8333333f);
SpawnActor<OBombKart>(0, 250, 3, 0.8333333f);
SpawnActor<OBombKart>(0, 0, 0, 0.8333333f);
SpawnActor<OBombKart>(0, 0, 0, 0.8333333f);
}
}
}

View File

@ -119,13 +119,13 @@ void DoubleDeck::BeginPlay() {
spawn_all_item_boxes((ActorSpawnData*)LOAD_ASSET_RAW(d_course_double_deck_item_box_spawns));
if (gModeSelection == VERSUS) {
OBombKart::Spawn(0, 20, 0, 1.0f);
OBombKart::Spawn(0, 40, 0, 1.0f);
OBombKart::Spawn(0, 60, 0, 1.0f);
OBombKart::Spawn(0, 80, 0, 1.0f);
OBombKart::Spawn(0, 100, 0, 1.0f);
OBombKart::Spawn(0, 120, 0, 1.0f);
OBombKart::Spawn(0, 140, 0, 1.0f);
SpawnActor<OBombKart>(0, 20, 0, 1.0f);
SpawnActor<OBombKart>(0, 40, 0, 1.0f);
SpawnActor<OBombKart>(0, 60, 0, 1.0f);
SpawnActor<OBombKart>(0, 80, 0, 1.0f);
SpawnActor<OBombKart>(0, 100, 0, 1.0f);
SpawnActor<OBombKart>(0, 120, 0, 1.0f);
SpawnActor<OBombKart>(0, 140, 0, 1.0f);
}
}

View File

@ -132,35 +132,35 @@ void FrappeSnowland::BeginPlay() {
spawn_all_item_boxes((struct ActorSpawnData*)LOAD_ASSET_RAW(d_course_frappe_snowland_item_box_spawns));
if (gGamestate != CREDITS_SEQUENCE) {
OSnowman::Spawn(FVector(697, 0, -1684));
OSnowman::Spawn(FVector(82, 0, -2245));
OSnowman::Spawn(FVector(27, 5, -2067));
OSnowman::Spawn(FVector(-656, 0, -1735));
OSnowman::Spawn(FVector(-1497, 0, -83));
OSnowman::Spawn(FVector(-1643, 0, -25));
OSnowman::Spawn(FVector(-1547, 0, -20));
OSnowman::Spawn(FVector(-1445, 0, -10));
OSnowman::Spawn(FVector(-1502, 0, 61));
OSnowman::Spawn(FVector(-1429, 0, 79));
OSnowman::Spawn(FVector(-1586, 0, 71));
OSnowman::Spawn(FVector(-1471, 0, 157));
OSnowman::Spawn(FVector(-1539, 0, 175));
OSnowman::Spawn(FVector(-1484, 0, 303));
OSnowman::Spawn(FVector(-1442, 0, 358));
OSnowman::Spawn(FVector(-1510, 0, 426));
OSnowman::Spawn(FVector(-665, 0, 830));
OSnowman::Spawn(FVector(-701, 3, 853));
OSnowman::Spawn(FVector(-602, 0, 929));
SpawnActor<OSnowman>(FVector(697, 0, -1684));
SpawnActor<OSnowman>(FVector(82, 0, -2245));
SpawnActor<OSnowman>(FVector(27, 5, -2067));
SpawnActor<OSnowman>(FVector(-656, 0, -1735));
SpawnActor<OSnowman>(FVector(-1497, 0, -83));
SpawnActor<OSnowman>(FVector(-1643, 0, -25));
SpawnActor<OSnowman>(FVector(-1547, 0, -20));
SpawnActor<OSnowman>(FVector(-1445, 0, -10));
SpawnActor<OSnowman>(FVector(-1502, 0, 61));
SpawnActor<OSnowman>(FVector(-1429, 0, 79));
SpawnActor<OSnowman>(FVector(-1586, 0, 71));
SpawnActor<OSnowman>(FVector(-1471, 0, 157));
SpawnActor<OSnowman>(FVector(-1539, 0, 175));
SpawnActor<OSnowman>(FVector(-1484, 0, 303));
SpawnActor<OSnowman>(FVector(-1442, 0, 358));
SpawnActor<OSnowman>(FVector(-1510, 0, 426));
SpawnActor<OSnowman>(FVector(-665, 0, 830));
SpawnActor<OSnowman>(FVector(-701, 3, 853));
SpawnActor<OSnowman>(FVector(-602, 0, 929));
}
if (gModeSelection == VERSUS) {
OBombKart::Spawn(0, 50, 3, 0.8333333f);
OBombKart::Spawn(0, 100, 1, 0.8333333f);
OBombKart::Spawn(0, 150, 3, 0.8333333f);
OBombKart::Spawn(0, 290, 1, 0.8333333f);
OBombKart::Spawn(0, 350, 3, 0.8333333f);
OBombKart::Spawn(0, 0, 0, 0.8333333f);
OBombKart::Spawn(0, 0, 0, 0.8333333f);
SpawnActor<OBombKart>(0, 50, 3, 0.8333333f);
SpawnActor<OBombKart>(0, 100, 1, 0.8333333f);
SpawnActor<OBombKart>(0, 150, 3, 0.8333333f);
SpawnActor<OBombKart>(0, 290, 1, 0.8333333f);
SpawnActor<OBombKart>(0, 350, 3, 0.8333333f);
SpawnActor<OBombKart>(0, 0, 0, 0.8333333f);
SpawnActor<OBombKart>(0, 0, 0, 0.8333333f);
}
}

View File

@ -198,17 +198,17 @@ void KalimariDesert::BeginPlay() {
}
}
ATrain::Spawn(_tender, _numCarriages, 2.5f, 0, waypoint, ATrain::SpawnMode::POINT);
SpawnActor<ATrain>(_tender, _numCarriages, 2.5f, 0, waypoint, ATrain::SpawnMode::POINT);
}
if (gModeSelection == VERSUS) {
OBombKart::Spawn(0, 50, 3, 0.8333333f);
OBombKart::Spawn(0, 138, 1, 0.8333333f);
OBombKart::Spawn(0, 280, 3, 0.8333333f);
OBombKart::Spawn(0, 404, 1, 0.8333333f);
OBombKart::Spawn(0, 510, 3, 0.8333333f);
OBombKart::Spawn(0, 0, 0, 0.8333333f);
OBombKart::Spawn(0, 0, 0, 0.8333333f);
SpawnActor<OBombKart>(0, 50, 3, 0.8333333f);
SpawnActor<OBombKart>(0, 138, 1, 0.8333333f);
SpawnActor<OBombKart>(0, 280, 3, 0.8333333f);
SpawnActor<OBombKart>(0, 404, 1, 0.8333333f);
SpawnActor<OBombKart>(0, 510, 3, 0.8333333f);
SpawnActor<OBombKart>(0, 0, 0, 0.8333333f);
SpawnActor<OBombKart>(0, 0, 0, 0.8333333f);
}
}
}

View File

@ -144,40 +144,40 @@ void KoopaTroopaBeach::BeginPlay() {
spawn_palm_trees((struct ActorSpawnData*)LOAD_ASSET_RAW(d_course_koopa_troopa_beach_tree_spawn));
if (gGamestate != CREDITS_SEQUENCE) {
OCrab::Spawn(FVector2D(-1809, 625), FVector2D(-1666, 594));
OCrab::Spawn(FVector2D(-1852, 757), FVector2D(-1620, 740));
OCrab::Spawn(FVector2D(-1478, 1842), FVector2D(-1453, 1833));
OCrab::Spawn(FVector2D(-1418, 1967), FVector2D(-1455, 1962));
OCrab::Spawn(FVector2D(-1472, 2112), FVector2D(-1417, 2100));
OCrab::Spawn(FVector2D(-1389, 2152), FVector2D(-1335, 2136));
OCrab::Spawn(FVector2D(218, 693), FVector2D(69, 696));
OCrab::Spawn(FVector2D(235, 528), FVector2D(24, 501));
OCrab::Spawn(FVector2D(268, 406), FVector2D(101, 394));
OCrab::Spawn(FVector2D(223, 318), FVector2D(86, 308));
SpawnActor<OCrab>(FVector2D(-1809, 625), FVector2D(-1666, 594));
SpawnActor<OCrab>(FVector2D(-1852, 757), FVector2D(-1620, 740));
SpawnActor<OCrab>(FVector2D(-1478, 1842), FVector2D(-1453, 1833));
SpawnActor<OCrab>(FVector2D(-1418, 1967), FVector2D(-1455, 1962));
SpawnActor<OCrab>(FVector2D(-1472, 2112), FVector2D(-1417, 2100));
SpawnActor<OCrab>(FVector2D(-1389, 2152), FVector2D(-1335, 2136));
SpawnActor<OCrab>(FVector2D(218, 693), FVector2D(69, 696));
SpawnActor<OCrab>(FVector2D(235, 528), FVector2D(24, 501));
SpawnActor<OCrab>(FVector2D(268, 406), FVector2D(101, 394));
SpawnActor<OCrab>(FVector2D(223, 318), FVector2D(86, 308));
}
if (gGamestate == CREDITS_SEQUENCE) {
for (size_t i = 0; i < NUM_SEAGULLS; i++) {
OSeagull::Spawn(FVector(-360.0f, 60.0f, -1300.0f));
SpawnActor<OSeagull>(FVector(-360.0f, 60.0f, -1300.0f));
}
} else { // Normal gameplay
for (size_t i = 0; i < 4; i++) {
OSeagull::Spawn(FVector(-985.0f, 15.0f, 1200.0f));
SpawnActor<OSeagull>(FVector(-985.0f, 15.0f, 1200.0f));
}
for (size_t i = 0; i < 6; i++) {
OSeagull::Spawn(FVector(328.0f, 20.0f, 2541.0f));
SpawnActor<OSeagull>(FVector(328.0f, 20.0f, 2541.0f));
}
}
if (gModeSelection == VERSUS) {
OBombKart::Spawn(0, 60, 1, 0.8333333f);
OBombKart::Spawn(0, 120, 1, 0.8333333f);
OBombKart::Spawn(0, 200, 3, 0.8333333f);
OBombKart::Spawn(0, 280, 1, 0.8333333f);
OBombKart::Spawn(0, 435, 3, 0.8333333f);
OBombKart::Spawn(0, 0, 0, 0.8333333f);
OBombKart::Spawn(0, 0, 0, 0.8333333f);
SpawnActor<OBombKart>(0, 60, 1, 0.8333333f);
SpawnActor<OBombKart>(0, 120, 1, 0.8333333f);
SpawnActor<OBombKart>(0, 200, 3, 0.8333333f);
SpawnActor<OBombKart>(0, 280, 1, 0.8333333f);
SpawnActor<OBombKart>(0, 435, 3, 0.8333333f);
SpawnActor<OBombKart>(0, 0, 0, 0.8333333f);
SpawnActor<OBombKart>(0, 0, 0, 0.8333333f);
}
}

View File

@ -142,13 +142,13 @@ void LuigiRaceway::BeginPlay() {
}
if (gModeSelection == VERSUS) {
OBombKart::Spawn(0, 50, 1, 0.8333333f);
OBombKart::Spawn(0, 200, 3, 0.8333333f);
OBombKart::Spawn(0, 305, 1, 0.8333333f);
OBombKart::Spawn(0, 440, 3, 0.8333333f);
OBombKart::Spawn(0, 515, 3, 0.8333333f);
OBombKart::Spawn(0, 0, 0, 0.8333333f);
OBombKart::Spawn(0, 0, 0, 0.8333333f);
SpawnActor<OBombKart>(0, 50, 1, 0.8333333f);
SpawnActor<OBombKart>(0, 200, 3, 0.8333333f);
SpawnActor<OBombKart>(0, 305, 1, 0.8333333f);
SpawnActor<OBombKart>(0, 440, 3, 0.8333333f);
SpawnActor<OBombKart>(0, 515, 3, 0.8333333f);
SpawnActor<OBombKart>(0, 0, 0, 0.8333333f);
SpawnActor<OBombKart>(0, 0, 0, 0.8333333f);
}
}

View File

@ -164,21 +164,21 @@ void MarioRaceway::BeginPlay() {
spawn_piranha_plants((struct ActorSpawnData*)LOAD_ASSET_RAW(d_course_mario_raceway_piranha_plant_spawns));
spawn_all_item_boxes((struct ActorSpawnData*)LOAD_ASSET_RAW(d_course_mario_raceway_item_box_spawns));
AMarioSign::Spawn(FVector(150.0f, 40.0f, -1300.0f), IRotator(0, 0, 0), FVector(0, 0, 0), FVector(1.0f, 1.0f, 1.0f));
AMarioSign::Spawn(FVector(2520.0f, 0.0f, 1240.0f), IRotator(0, 0, 0), FVector(0, 0, 0), FVector(1.0f, 1.0f, 1.0f));
SpawnActor<AMarioSign>(FVector(150.0f, 40.0f, -1300.0f), IRotator(0, 0, 0), FVector(0, 0, 0), FVector(1.0f, 1.0f, 1.0f));
SpawnActor<AMarioSign>(FVector(2520.0f, 0.0f, 1240.0f), IRotator(0, 0, 0), FVector(0, 0, 0), FVector(1.0f, 1.0f, 1.0f));
if (gModeSelection == VERSUS) {
OBombKart::Spawn(0, 40, 3, 0.8333333f);
OBombKart::Spawn(0, 100, 3, 0.8333333f);
OBombKart::Spawn(0, 265, 3, 0.8333333f);
OBombKart::Spawn(0, 285, 1, 0.8333333f);
OBombKart::Spawn(0, 420, 1, 0.8333333f);
OBombKart::Spawn(0, 0, 0, 0.8333333f);
OBombKart::Spawn(0, 0, 0, 0.8333333f);
SpawnActor<OBombKart>(0, 40, 3, 0.8333333f);
SpawnActor<OBombKart>(0, 100, 3, 0.8333333f);
SpawnActor<OBombKart>(0, 265, 3, 0.8333333f);
SpawnActor<OBombKart>(0, 285, 1, 0.8333333f);
SpawnActor<OBombKart>(0, 420, 1, 0.8333333f);
SpawnActor<OBombKart>(0, 0, 0, 0.8333333f);
SpawnActor<OBombKart>(0, 0, 0, 0.8333333f);
}
if (gGamestate != CREDITS_SEQUENCE) {
OGrandPrixBalloons::Spawn(FVector(0, 5, -240));
SpawnActor<OGrandPrixBalloons>(FVector(0, 5, -240));
}
}

View File

@ -209,19 +209,19 @@ void MooMooFarm::BeginPlay() {
break;
}
GetWorld()->AddObject(new OMoleGroup(moleSpawns1, tick1));
GetWorld()->AddObject(new OMoleGroup(moleSpawns2, tick2));
GetWorld()->AddObject(new OMoleGroup(moleSpawns3, tick3));
GetWorld()->AddObject(OMoleGroup(moleSpawns1, tick1));
GetWorld()->AddObject(OMoleGroup(moleSpawns2, tick2));
GetWorld()->AddObject(OMoleGroup(moleSpawns3, tick3));
}
if (gModeSelection == VERSUS) {
OBombKart::Spawn(0, 50, 3, 0.8333333f);
OBombKart::Spawn(0, 140, 3, 0.8333333f);
OBombKart::Spawn(0, 225, 3, 0.8333333f);
OBombKart::Spawn(0, 316, 3, 0.8333333f);
OBombKart::Spawn(0, 434, 3, 0.8333333f);
OBombKart::Spawn(0, 0, 0, 0.8333333f);
OBombKart::Spawn(0, 0, 0, 0.8333333f);
SpawnActor<OBombKart>(0, 50, 3, 0.8333333f);
SpawnActor<OBombKart>(0, 140, 3, 0.8333333f);
SpawnActor<OBombKart>(0, 225, 3, 0.8333333f);
SpawnActor<OBombKart>(0, 316, 3, 0.8333333f);
SpawnActor<OBombKart>(0, 434, 3, 0.8333333f);
SpawnActor<OBombKart>(0, 0, 0, 0.8333333f);
SpawnActor<OBombKart>(0, 0, 0, 0.8333333f);
}
}

View File

@ -144,18 +144,18 @@ void PodiumCeremony::BeginPlay() {
break;
}
OTrophy::Spawn(pos, type, OTrophy::Behaviour::PODIUM_CEREMONY);
SpawnActor<OTrophy>(pos, type, OTrophy::Behaviour::PODIUM_CEREMONY);
OBombKart::Spawn(3, 3, OBombKart::States::PODIUM_CEREMONY, 1.25f);
OBombKart::Spawn(3, 40, 0, 1.0f);
OBombKart::Spawn(3, 60, 0, 1.0f);
OBombKart::Spawn(3, 80, 0, 1.0f);
OBombKart::Spawn(3, 100, 0, 1.0f);
OBombKart::Spawn(3, 120, 0, 1.0f);
OBombKart::Spawn(3, 140, 0, 1.0f);
SpawnActor<OBombKart>(3, 3, OBombKart::States::PODIUM_CEREMONY, 1.25f);
SpawnActor<OBombKart>(3, 40, 0, 1.0f);
SpawnActor<OBombKart>(3, 60, 0, 1.0f);
SpawnActor<OBombKart>(3, 80, 0, 1.0f);
SpawnActor<OBombKart>(3, 100, 0, 1.0f);
SpawnActor<OBombKart>(3, 120, 0, 1.0f);
SpawnActor<OBombKart>(3, 140, 0, 1.0f);
if (gGamestate != CREDITS_SEQUENCE) {
OGrandPrixBalloons::Spawn(FVector(-64, 5, -330));
SpawnActor<OGrandPrixBalloons>(FVector(-64, 5, -330));
}
}

View File

@ -133,19 +133,19 @@ void RainbowRoad::BeginPlay() {
spawn_all_item_boxes((struct ActorSpawnData*)LOAD_ASSET_RAW(d_course_rainbow_road_item_box_spawns));
if (gGamestate != CREDITS_SEQUENCE) {
GetWorld()->AddObject(new OChainChomp());
GetWorld()->AddObject(new OChainChomp());
GetWorld()->AddObject(new OChainChomp());
AddObjectToWorld<OChainChomp>({});
AddObjectToWorld<OChainChomp>({});
AddObjectToWorld<OChainChomp>({});
}
if (gModeSelection == VERSUS) {
OBombKart::Spawn(0, 50, 3, 0.8333333f);
OBombKart::Spawn(0, 100, 1, 0.8333333f);
OBombKart::Spawn(0, 150, 3, 0.8333333f);
OBombKart::Spawn(0, 200, 1, 0.8333333f);
OBombKart::Spawn(0, 250, 3, 0.8333333f);
OBombKart::Spawn(0, 0, 0, 0.8333333f);
OBombKart::Spawn(0, 0, 0, 0.8333333f);
SpawnActor<OBombKart>(0, 50, 3, 0.8333333f);
SpawnActor<OBombKart>(0, 100, 1, 0.8333333f);
SpawnActor<OBombKart>(0, 150, 3, 0.8333333f);
SpawnActor<OBombKart>(0, 200, 1, 0.8333333f);
SpawnActor<OBombKart>(0, 250, 3, 0.8333333f);
SpawnActor<OBombKart>(0, 0, 0, 0.8333333f);
SpawnActor<OBombKart>(0, 0, 0, 0.8333333f);
}
}

View File

@ -130,16 +130,16 @@ void RoyalRaceway::BeginPlay() {
spawn_piranha_plants((struct ActorSpawnData*)LOAD_ASSET_RAW(d_course_royal_raceway_piranha_plant_spawn));
if (gModeSelection == VERSUS) {
OBombKart::Spawn(0, 50, 3, 0.8333333f);
OBombKart::Spawn(0, 100, 3, 0.8333333f);
OBombKart::Spawn(0, 296, 3, 0.8333333f);
OBombKart::Spawn(0, 400, 1, 0.8333333f);
OBombKart::Spawn(0, 746, 3, 0.8333333f);
OBombKart::Spawn(0, 0, 0, 0.8333333f);
OBombKart::Spawn(0, 0, 0, 0.8333333f);
SpawnActor<OBombKart>(0, 50, 3, 0.8333333f);
SpawnActor<OBombKart>(0, 100, 3, 0.8333333f);
SpawnActor<OBombKart>(0, 296, 3, 0.8333333f);
SpawnActor<OBombKart>(0, 400, 1, 0.8333333f);
SpawnActor<OBombKart>(0, 746, 3, 0.8333333f);
SpawnActor<OBombKart>(0, 0, 0, 0.8333333f);
SpawnActor<OBombKart>(0, 0, 0, 0.8333333f);
}
if (gGamestate != CREDITS_SEQUENCE) {
OGrandPrixBalloons::Spawn(FVector(-64, 5, -330));
SpawnActor<OGrandPrixBalloons>(FVector(-64, 5, -330));
}
}

View File

@ -143,42 +143,42 @@ void SherbetLand::BeginPlay() {
// Multiplayer does not spawn the big penguin... It does now!
// if (gPlayerCountSelection1 == 1) {
OPenguin::Spawn(FVector(-383.0f, 2.0f, -690.0f), 0, 0, 0.0f, OPenguin::PenguinType::EMPEROR, OPenguin::Behaviour::STRUT);
SpawnActor<OPenguin>(FVector(-383.0f, 2.0f, -690.0f), 0, 0, 0.0f, OPenguin::PenguinType::EMPEROR, OPenguin::Behaviour::STRUT);
// }
OPenguin::Spawn(FVector(-2960.0f, -80.0f, 1521.0f), 0x150, 0, 100.0f, OPenguin::PenguinType::ADULT, OPenguin::Behaviour::CIRCLE);
OPenguin::Spawn(FVector(-2960.0f, -80.0f, 1521.0f), 0x150, 0, 100.0f, OPenguin::PenguinType::ADULT, OPenguin::Behaviour::CIRCLE);
SpawnActor<OPenguin>(FVector(-2960.0f, -80.0f, 1521.0f), 0x150, 0, 100.0f, OPenguin::PenguinType::ADULT, OPenguin::Behaviour::CIRCLE);
SpawnActor<OPenguin>(FVector(-2960.0f, -80.0f, 1521.0f), 0x150, 0, 100.0f, OPenguin::PenguinType::ADULT, OPenguin::Behaviour::CIRCLE);
OPenguin::Spawn(FVector(-2490.0f, -80.0f, 1612.0f), 0x100, 0, 80.0f, OPenguin::PenguinType::ADULT, OPenguin::Behaviour::CIRCLE);
OPenguin::Spawn(FVector(-2490.0f, -80.0f, 1612.0f), 0x100, 0, 80.0f, OPenguin::PenguinType::ADULT, OPenguin::Behaviour::CIRCLE);
SpawnActor<OPenguin>(FVector(-2490.0f, -80.0f, 1612.0f), 0x100, 0, 80.0f, OPenguin::PenguinType::ADULT, OPenguin::Behaviour::CIRCLE);
SpawnActor<OPenguin>(FVector(-2490.0f, -80.0f, 1612.0f), 0x100, 0, 80.0f, OPenguin::PenguinType::ADULT, OPenguin::Behaviour::CIRCLE);
OPenguin::Spawn(FVector(-2098.0f, -80.0f, 1624.0f), 0xFF00, 0, 80.0f, OPenguin::PenguinType::ADULT, OPenguin::Behaviour::CIRCLE);
OPenguin::Spawn(FVector(-2098.0f, -80.0f, 1624.0f), 0xFF00, 0, 80.0f, OPenguin::PenguinType::ADULT, OPenguin::Behaviour::CIRCLE);
SpawnActor<OPenguin>(FVector(-2098.0f, -80.0f, 1624.0f), 0xFF00, 0, 80.0f, OPenguin::PenguinType::ADULT, OPenguin::Behaviour::CIRCLE);
SpawnActor<OPenguin>(FVector(-2098.0f, -80.0f, 1624.0f), 0xFF00, 0, 80.0f, OPenguin::PenguinType::ADULT, OPenguin::Behaviour::CIRCLE);
OPenguin::Spawn(FVector(-2080.0f, -80.0f, 1171.0f), 0x150, 0, 80.0f, OPenguin::PenguinType::ADULT, OPenguin::Behaviour::CIRCLE);
OPenguin::Spawn(FVector(-2080.0f, -80.0f, 1171.0f), 0x150, 0, 80.0f, OPenguin::PenguinType::ADULT, OPenguin::Behaviour::CIRCLE);
SpawnActor<OPenguin>(FVector(-2080.0f, -80.0f, 1171.0f), 0x150, 0, 80.0f, OPenguin::PenguinType::ADULT, OPenguin::Behaviour::CIRCLE);
SpawnActor<OPenguin>(FVector(-2080.0f, -80.0f, 1171.0f), 0x150, 0, 80.0f, OPenguin::PenguinType::ADULT, OPenguin::Behaviour::CIRCLE);
if (gGamestate == CREDITS_SEQUENCE) {
OPenguin::Spawn(FVector(380.0f, 0.0f, -535.0f), 0x9000, -0x4000, 0.0f, OPenguin::PenguinType::CREDITS, OPenguin::Behaviour::SLIDE3);
SpawnActor<OPenguin>(FVector(380.0f, 0.0f, -535.0f), 0x9000, -0x4000, 0.0f, OPenguin::PenguinType::CREDITS, OPenguin::Behaviour::SLIDE3);
} else {
OPenguin::Spawn(FVector(146.0f, 0.0f, -380.0f), 0x9000, -0x4000, 0.0f, OPenguin::PenguinType::CHICK, OPenguin::Behaviour::SLIDE3);
SpawnActor<OPenguin>(FVector(146.0f, 0.0f, -380.0f), 0x9000, -0x4000, 0.0f, OPenguin::PenguinType::CHICK, OPenguin::Behaviour::SLIDE3);
}
OPenguin::Spawn(FVector(380.0f, 0.0f, -766.0f), 0x5000, 0x8000, 0.0f, OPenguin::PenguinType::CHICK, OPenguin::Behaviour::SLIDE4);
OPenguin::Spawn(FVector(-2300.0f, 0.0f, -210.0f), 0xC000, 0x8000, 0.0f, OPenguin::PenguinType::CHICK, OPenguin::Behaviour::SLIDE6);
OPenguin::Spawn(FVector(-2500.0f, 0.0f, -250.0f), 0x4000, 0x8000, 0.0f, OPenguin::PenguinType::CHICK, OPenguin::Behaviour::SLIDE6);
OPenguin::Spawn(FVector(-535.0f, 0.0f, 875.0f), 0x8000, -0x4000, 0.0f, OPenguin::PenguinType::CHICK, OPenguin::Behaviour::SLIDE6);
OPenguin::Spawn(FVector(-250.0f, 0.0f, 953.0f), 0x9000, -0x4000, 0.0f, OPenguin::PenguinType::CHICK, OPenguin::Behaviour::SLIDE6);
SpawnActor<OPenguin>(FVector(380.0f, 0.0f, -766.0f), 0x5000, 0x8000, 0.0f, OPenguin::PenguinType::CHICK, OPenguin::Behaviour::SLIDE4);
SpawnActor<OPenguin>(FVector(-2300.0f, 0.0f, -210.0f), 0xC000, 0x8000, 0.0f, OPenguin::PenguinType::CHICK, OPenguin::Behaviour::SLIDE6);
SpawnActor<OPenguin>(FVector(-2500.0f, 0.0f, -250.0f), 0x4000, 0x8000, 0.0f, OPenguin::PenguinType::CHICK, OPenguin::Behaviour::SLIDE6);
SpawnActor<OPenguin>(FVector(-535.0f, 0.0f, 875.0f), 0x8000, -0x4000, 0.0f, OPenguin::PenguinType::CHICK, OPenguin::Behaviour::SLIDE6);
SpawnActor<OPenguin>(FVector(-250.0f, 0.0f, 953.0f), 0x9000, -0x4000, 0.0f, OPenguin::PenguinType::CHICK, OPenguin::Behaviour::SLIDE6);
if (gGamestate != CREDITS_SEQUENCE) {
if (gModeSelection == VERSUS) {
OBombKart::Spawn(0, 50, 3, 0.8333333f);
OBombKart::Spawn(0, 100, 1, 0.8333333f);
OBombKart::Spawn(0, 150, 3, 0.8333333f);
OBombKart::Spawn(0, 200, 1, 0.8333333f);
OBombKart::Spawn(0, 250, 3, 0.8333333f);
OBombKart::Spawn(0, 0, 0, 0.8333333f);
OBombKart::Spawn(0, 0, 0, 0.8333333f);
SpawnActor<OBombKart>(0, 50, 3, 0.8333333f);
SpawnActor<OBombKart>(0, 100, 1, 0.8333333f);
SpawnActor<OBombKart>(0, 150, 3, 0.8333333f);
SpawnActor<OBombKart>(0, 200, 1, 0.8333333f);
SpawnActor<OBombKart>(0, 250, 3, 0.8333333f);
SpawnActor<OBombKart>(0, 0, 0, 0.8333333f);
SpawnActor<OBombKart>(0, 0, 0, 0.8333333f);
}
}
}

View File

@ -127,13 +127,13 @@ void Skyscraper::BeginPlay() {
spawn_all_item_boxes((ActorSpawnData*)LOAD_ASSET_RAW(d_course_skyscraper_item_box_spawns));
if (gModeSelection == VERSUS) {
OBombKart::Spawn(0, 20, 0, 1.0f);
OBombKart::Spawn(0, 40, 0, 1.0f);
OBombKart::Spawn(0, 60, 0, 1.0f);
OBombKart::Spawn(0, 80, 0, 1.0f);
OBombKart::Spawn(0, 100, 0, 1.0f);
OBombKart::Spawn(0, 120, 0, 1.0f);
OBombKart::Spawn(0, 140, 0, 1.0f);
SpawnActor<OBombKart>(0, 20, 0, 1.0f);
SpawnActor<OBombKart>(0, 40, 0, 1.0f);
SpawnActor<OBombKart>(0, 60, 0, 1.0f);
SpawnActor<OBombKart>(0, 80, 0, 1.0f);
SpawnActor<OBombKart>(0, 100, 0, 1.0f);
SpawnActor<OBombKart>(0, 120, 0, 1.0f);
SpawnActor<OBombKart>(0, 140, 0, 1.0f);
}
}

View File

@ -200,7 +200,7 @@ void TestTrack::BeginPlay() {
// GetWorld()->AddActor(new OSeagull(2, pos));
// GetWorld()->AddActor(new OSeagull(3, pos));
// GetWorld()->AddObject(new OCheepCheep(FVector(0, 40, 0), OCheepCheep::CheepType::RACE, IPathSpan(0, 10)));
OTrophy::Spawn(FVector(0,0,0), OTrophy::TrophyType::GOLD, OTrophy::Behaviour::GO_FISH);
SpawnActor<OTrophy>(FVector(0,0,0), OTrophy::TrophyType::GOLD, OTrophy::Behaviour::GO_FISH);
//GetWorld()->AddObject(new OSnowman(FVector(0, 0, 0)));
//GetWorld()->AddObject(new OTrashBin(FVector(0.0f, 0.0f, 0.0f), IRotator(0, 90, 0), 1.0f, OTrashBin::Behaviour::MUNCHING));
@ -212,13 +212,13 @@ void TestTrack::BeginPlay() {
// GetWorld()->AddActor(new ABowserStatue(FVector(-200, 0, 0), ABowserStatue::Behaviour::CRUSH));
// GetWorld()->AddObject(new OBoos(10, IPathSpan(0, 5), IPathSpan(18, 23), IPathSpan(25, 50)));
//OThwomp::Spawn(0, 0, 0, 1.0f, 0, 1, 7);
//SpawnActor<OThwomp>(0, 0, 0, 1.0f, 0, 1, 7);
//GetWorld()->AddTrain(ATrain::TenderStatus::HAS_TENDER, 5, 2.5f, 0);
//GetWorld()->AddTrain(ATrain::TenderStatus::HAS_TENDER, 5, 2.5f, 8);
OBombKart::Spawn(0, 25, 4, 0.8333333f);
OBombKart::Spawn(0, 45, 4, 0.8333333f);
SpawnActor<OBombKart>(0, 25, 4, 0.8333333f);
SpawnActor<OBombKart>(0, 45, 4, 0.8333333f);
// GetWorld()->AddActor(new AShip(FVector(0, 0, 0), AShip::Skin::SHIP3));

View File

@ -168,32 +168,32 @@ void ToadsTurnpike::BeginPlay() {
for (size_t i = 0; i < _numTrucks; i++) {
pathPoint = CalculateWaypointDistribution(i, _numTrucks, gPathCountByPathIndex[0], 0);
ATruck::Spawn(a, b, 0, pathPoint, ATruck::SpawnMode::POINT);
SpawnActor<ATruck>(a, b, 0, pathPoint, ATruck::SpawnMode::POINT);
}
for (size_t i = 0; i < _numBuses; i++) {
pathPoint = CalculateWaypointDistribution(i, _numBuses, gPathCountByPathIndex[0], 75);
ABus::Spawn(a, b, 0, pathPoint, ABus::SpawnMode::POINT);
SpawnActor<ABus>(a, b, 0, pathPoint, ABus::SpawnMode::POINT);
}
for (size_t i = 0; i < _numTankerTrucks; i++) {
pathPoint = CalculateWaypointDistribution(i, _numTankerTrucks, gPathCountByPathIndex[0], 50);
ATankerTruck::Spawn(a, b, 0, pathPoint, ATankerTruck::SpawnMode::POINT);
SpawnActor<ATankerTruck>(a, b, 0, pathPoint, ATankerTruck::SpawnMode::POINT);
}
for (size_t i = 0; i < _numCars; i++) {
pathPoint = CalculateWaypointDistribution(i, _numCars, gPathCountByPathIndex[0], 25);
ACar::Spawn(a, b, 0, pathPoint, ACar::SpawnMode::POINT);
SpawnActor<ACar>(a, b, 0, pathPoint, ACar::SpawnMode::POINT);
}
if (gModeSelection == VERSUS) {
OBombKart::Spawn(0, 50, 3, 0.8333333f);
OBombKart::Spawn(0, 100, 1, 0.8333333f);
OBombKart::Spawn(0, 150, 3, 0.8333333f);
OBombKart::Spawn(0, 200, 1, 0.8333333f);
OBombKart::Spawn(0, 250, 3, 0.8333333f);
OBombKart::Spawn(0, 0, 0, 0.8333333f);
OBombKart::Spawn(0, 0, 0, 0.8333333f);
SpawnActor<OBombKart>(0, 50, 3, 0.8333333f);
SpawnActor<OBombKart>(0, 100, 1, 0.8333333f);
SpawnActor<OBombKart>(0, 150, 3, 0.8333333f);
SpawnActor<OBombKart>(0, 200, 1, 0.8333333f);
SpawnActor<OBombKart>(0, 250, 3, 0.8333333f);
SpawnActor<OBombKart>(0, 0, 0, 0.8333333f);
SpawnActor<OBombKart>(0, 0, 0, 0.8333333f);
}
}
}

View File

@ -328,7 +328,7 @@ void Track::Load() {
printf("[Track] Loading... %s\n", ResourceName.c_str());
const TrackInfo* info = gTrackRegistry.GetInfo(ResourceName);
if (nullptr == info) {
printf("Could not find TrackInfo for %s\n", ResourceName);
printf("Could not find TrackInfo for %s\n", ResourceName.c_str());
return;
}
const std::string& trackPath = info->Path;

View File

@ -152,18 +152,18 @@ void WarioStadium::Load() {
void WarioStadium::BeginPlay() {
spawn_all_item_boxes((struct ActorSpawnData*) LOAD_ASSET_RAW(d_course_wario_stadium_item_box_spawns));
AWarioSign::Spawn(FVector(-131.0f, 83.0f, 286.0f), IRotator(0, 0, 0), FVector(0, 0, 0), FVector(1.0f, 1.0f, 1.0f));
AWarioSign::Spawn(FVector(-2353.0f, 72.0f, -1608.0f), IRotator(0, 0, 0), FVector(0, 0, 0), FVector(1.0f, 1.0f, 1.0f));
AWarioSign::Spawn(FVector(-2622.0f, 79.0f, 739.0f), IRotator(0, 0, 0), FVector(0, 0, 0), FVector(1.0f, 1.0f, 1.0f));
SpawnActor<AWarioSign>(FVector(-131.0f, 83.0f, 286.0f), IRotator(0, 0, 0), FVector(0, 0, 0), FVector(1.0f, 1.0f, 1.0f));
SpawnActor<AWarioSign>(FVector(-2353.0f, 72.0f, -1608.0f), IRotator(0, 0, 0), FVector(0, 0, 0), FVector(1.0f, 1.0f, 1.0f));
SpawnActor<AWarioSign>(FVector(-2622.0f, 79.0f, 739.0f), IRotator(0, 0, 0), FVector(0, 0, 0), FVector(1.0f, 1.0f, 1.0f));
if (gModeSelection == VERSUS) {
OBombKart::Spawn(0, 50, 3, 0.8333333f);
OBombKart::Spawn(0, 100, 1, 0.8333333f);
OBombKart::Spawn(0, 150, 3, 0.8333333f);
OBombKart::Spawn(0, 200, 1, 0.8333333f);
OBombKart::Spawn(0, 250, 3, 0.8333333f);
OBombKart::Spawn(0, 0, 0, 0.8333333f);
OBombKart::Spawn(0, 0, 0, 0.8333333f);
SpawnActor<OBombKart>(0, 50, 3, 0.8333333f);
SpawnActor<OBombKart>(0, 100, 1, 0.8333333f);
SpawnActor<OBombKart>(0, 150, 3, 0.8333333f);
SpawnActor<OBombKart>(0, 200, 1, 0.8333333f);
SpawnActor<OBombKart>(0, 250, 3, 0.8333333f);
SpawnActor<OBombKart>(0, 0, 0, 0.8333333f);
SpawnActor<OBombKart>(0, 0, 0, 0.8333333f);
}
}

View File

@ -135,26 +135,26 @@ void YoshiValley::BeginPlay() {
if (gGamestate != CREDITS_SEQUENCE) {
//! @bug Skip spawning in credits due to animation crash for now
OFlagpole::Spawn(FVector(-902, 70, -1406), 0x3800);
OFlagpole::Spawn(FVector(-948, 70, -1533), 0x3800);
OFlagpole::Spawn(FVector(-2170, 0, 723), 0x400);
OFlagpole::Spawn(FVector(-2193, 0, 761), 0x400);
SpawnActor<OFlagpole>(FVector(-902, 70, -1406), 0x3800);
SpawnActor<OFlagpole>(FVector(-948, 70, -1533), 0x3800);
SpawnActor<OFlagpole>(FVector(-2170, 0, 723), 0x400);
SpawnActor<OFlagpole>(FVector(-2193, 0, 761), 0x400);
OHedgehog::Spawn(FVector(-1683, -80, -88), FVector2D(-1650, -114), 9);
OHedgehog::Spawn(FVector(-1636, -93, -147), FVector2D(-1661, -151), 9);
OHedgehog::Spawn(FVector(-1628, -86, -108), FVector2D(-1666, -58), 9);
OHedgehog::Spawn(FVector(-1676, -69, -30), FVector2D(-1651, -26), 9);
OHedgehog::Spawn(FVector(-1227, -27, -989), FVector2D(-1194, -999), 26);
OHedgehog::Spawn(FVector(-1261, -41, -880), FVector2D(-1213, -864), 26);
OHedgehog::Spawn(FVector(-1342, -60, -830), FVector2D(-1249, -927), 26);
OHedgehog::Spawn(FVector(-1429, -78, -849), FVector2D(-1347, -866), 26);
OHedgehog::Spawn(FVector(-1492, -94, -774), FVector2D(-1427, -891), 26);
OHedgehog::Spawn(FVector(-1453, -87, -784), FVector2D(-1509, -809), 26);
OHedgehog::Spawn(FVector(-1488, 89, -852), FVector2D(-1464, -822), 26);
OHedgehog::Spawn(FVector(-1301, 47, -904), FVector2D(-1537, -854), 26);
OHedgehog::Spawn(FVector(-2587, 56, -259), FVector2D(-2624, -241), 28);
OHedgehog::Spawn(FVector(-2493, 94, -454), FVector2D(-2505, -397), 28);
OHedgehog::Spawn(FVector(-2477, 3, -57), FVector2D(-2539, -66), 28);
SpawnActor<OHedgehog>(FVector(-1683, -80, -88), FVector2D(-1650, -114), 9);
SpawnActor<OHedgehog>(FVector(-1636, -93, -147), FVector2D(-1661, -151), 9);
SpawnActor<OHedgehog>(FVector(-1628, -86, -108), FVector2D(-1666, -58), 9);
SpawnActor<OHedgehog>(FVector(-1676, -69, -30), FVector2D(-1651, -26), 9);
SpawnActor<OHedgehog>(FVector(-1227, -27, -989), FVector2D(-1194, -999), 26);
SpawnActor<OHedgehog>(FVector(-1261, -41, -880), FVector2D(-1213, -864), 26);
SpawnActor<OHedgehog>(FVector(-1342, -60, -830), FVector2D(-1249, -927), 26);
SpawnActor<OHedgehog>(FVector(-1429, -78, -849), FVector2D(-1347, -866), 26);
SpawnActor<OHedgehog>(FVector(-1492, -94, -774), FVector2D(-1427, -891), 26);
SpawnActor<OHedgehog>(FVector(-1453, -87, -784), FVector2D(-1509, -809), 26);
SpawnActor<OHedgehog>(FVector(-1488, 89, -852), FVector2D(-1464, -822), 26);
SpawnActor<OHedgehog>(FVector(-1301, 47, -904), FVector2D(-1537, -854), 26);
SpawnActor<OHedgehog>(FVector(-2587, 56, -259), FVector2D(-2624, -241), 28);
SpawnActor<OHedgehog>(FVector(-2493, 94, -454), FVector2D(-2505, -397), 28);
SpawnActor<OHedgehog>(FVector(-2477, 3, -57), FVector2D(-2539, -66), 28);
}
if (gModeSelection == VERSUS) {
@ -162,13 +162,13 @@ void YoshiValley::BeginPlay() {
// the original data has values here.
// Note that the Y height is calculated automatically to place the kart on the surface
OBombKart::Spawn(FVector(-1533, 0, -682), 0, 0.8333333f);
OBombKart::Spawn(FVector(-1565, 0, -619), 0, 0.8333333f);
OBombKart::Spawn(FVector(-1529, 0, -579), 0, 0.8333333f);
OBombKart::Spawn(FVector(-1588, 0, -534), 0, 0.8333333f);
OBombKart::Spawn(FVector(-1598, 0, -207), 0, 0.8333333f);
OBombKart::Spawn(FVector(-1646, 0, -147), 0, 0.8333333f);
OBombKart::Spawn(FVector(-2532, 0, -445), 0, 0.8333333f);
SpawnActor<OBombKart>(FVector(-1533, 0, -682), 0, 0.8333333f);
SpawnActor<OBombKart>(FVector(-1565, 0, -619), 0, 0.8333333f);
SpawnActor<OBombKart>(FVector(-1529, 0, -579), 0, 0.8333333f);
SpawnActor<OBombKart>(FVector(-1588, 0, -534), 0, 0.8333333f);
SpawnActor<OBombKart>(FVector(-1598, 0, -207), 0, 0.8333333f);
SpawnActor<OBombKart>(FVector(-1646, 0, -147), 0, 0.8333333f);
SpawnActor<OBombKart>(FVector(-2532, 0, -445), 0, 0.8333333f);
}
}

View File

@ -3,6 +3,7 @@
#include <libultraship.h>
#include "Actor.h"
#include <vector>
#include "RegisterContent.h"
#include "engine/SpawnParams.h"
#include "engine/CoreMath.h"
#include "engine/World.h"
@ -55,7 +56,7 @@ class ABoat : public AActor {
.PathPoint = pathPoint,
.Speed = speed,
};
return static_cast<ABoat*>(GetWorld()->AddActor(new ABoat(params)));
return static_cast<ABoat*>(AddActorToWorld<ABoat>(params));
}
ABoat::SpawnMode SpawnType = ABoat::SpawnMode::AUTO;

View File

@ -3,14 +3,10 @@
#include <libultraship.h>
#include "Actor.h"
#include <vector>
#include "RegisterContent.h"
#include "engine/SpawnParams.h"
#include "engine/CoreMath.h"
#include "engine/World.h"
extern "C" {
#include "main.h"
#include "vehicles.h"
#include "waypoints.h"
#include "sounds.h"
}
@ -39,7 +35,7 @@ class ABus : public AActor {
u32 SoundBits = SOUND_ARG_LOAD(0x51, 0x01, 0x80, 0x03);
// This is simply a helper function to keep Spawning code clean
static inline ABus* Spawn(f32 speedA, f32 speedB, uint32_t pathIndex, uint32_t pathPoint, ABus::SpawnMode spawnMode) {
static ABus* Spawn(f32 speedA, f32 speedB, uint32_t pathIndex, uint32_t pathPoint, ABus::SpawnMode spawnMode) {
SpawnParams params = {
.Name = "mk:bus",
.Type = static_cast<uint16_t>(spawnMode),
@ -48,7 +44,7 @@ class ABus : public AActor {
.Speed = speedA,
.SpeedB = speedB
};
return static_cast<ABus*>(GetWorld()->AddActor(new ABus(params)));
return dynamic_cast<ABus*>(AddActorToWorld<ABus>(params));
}
explicit ABus(const SpawnParams& params);

View File

@ -3,14 +3,10 @@
#include <libultraship.h>
#include "Actor.h"
#include <vector>
#include "RegisterContent.h"
#include "engine/SpawnParams.h"
#include "engine/CoreMath.h"
#include "engine/World.h"
extern "C" {
#include "main.h"
#include "vehicles.h"
#include "waypoints.h"
#include "sounds.h"
}
@ -32,7 +28,7 @@ class ACar : public AActor {
}
// This is simply a helper function to keep Spawning code clean
static inline ACar* Spawn(f32 speedA, f32 speedB, uint32_t pathIndex, uint32_t pathPoint, ACar::SpawnMode spawnMode) {
static ACar* Spawn(f32 speedA, f32 speedB, uint32_t pathIndex, uint32_t pathPoint, ACar::SpawnMode spawnMode) {
SpawnParams params = {
.Name = "mk:car",
.Type = static_cast<uint16_t>(spawnMode),
@ -41,7 +37,7 @@ class ACar : public AActor {
.Speed = speedA,
.SpeedB = speedB
};
return static_cast<ACar*>(GetWorld()->AddActor(new ACar(params)));
return dynamic_cast<ACar*>(AddActorToWorld<ACar>(params));
}
const char* Type;

View File

@ -3,14 +3,10 @@
#include <libultraship.h>
#include "Actor.h"
#include <vector>
#include "RegisterContent.h"
#include "engine/SpawnParams.h"
#include "engine/CoreMath.h"
#include "engine/World.h"
extern "C" {
#include "main.h"
#include "vehicles.h"
#include "waypoints.h"
#include "sounds.h"
}
@ -39,7 +35,7 @@ class ATankerTruck : public AActor {
u32 SoundBits = SOUND_ARG_LOAD(0x51, 0x01, 0x80, 0x03);
// This is simply a helper function to keep Spawning code clean
static inline ATankerTruck* Spawn(f32 speedA, f32 speedB, uint32_t pathIndex, uint32_t pathPoint, ATankerTruck::SpawnMode spawnMode) {
static ATankerTruck* Spawn(f32 speedA, f32 speedB, uint32_t pathIndex, uint32_t pathPoint, ATankerTruck::SpawnMode spawnMode) {
SpawnParams params = {
.Name = "mk:tanker_truck",
.Type = static_cast<uint16_t>(spawnMode),
@ -48,7 +44,7 @@ class ATankerTruck : public AActor {
.Speed = speedA,
.SpeedB = speedB
};
return static_cast<ATankerTruck*>(GetWorld()->AddActor(new ATankerTruck(params)));
return dynamic_cast<ATankerTruck*>(AddActorToWorld<ATankerTruck>(params));
}
explicit ATankerTruck(const SpawnParams& params);

View File

@ -2,6 +2,7 @@
#include <libultraship.h>
#include <vector>
#include "RegisterContent.h"
#include "engine/SpawnParams.h"
#include "engine/CoreMath.h"
#include "engine/World.h"
@ -69,7 +70,7 @@ class ATrain : public AActor {
.Bool = tender,
.Speed = speed, // 120.0f is about the maximum usable value
};
return static_cast<ATrain*>(GetWorld()->AddActor(new ATrain(params)));
return static_cast<ATrain*>(AddActorToWorld<ATrain>(params));
}
virtual void SetSpawnParams(SpawnParams& params);

View File

@ -3,14 +3,10 @@
#include <libultraship.h>
#include "Actor.h"
#include <vector>
#include "RegisterContent.h"
#include "engine/SpawnParams.h"
#include "engine/CoreMath.h"
#include "engine/World.h"
extern "C" {
#include "main.h"
#include "vehicles.h"
#include "waypoints.h"
#include "sounds.h"
}
@ -44,7 +40,7 @@ class ATruck : public AActor {
uint32_t PathPoint = 0;
// This is simply a helper function to keep Spawning code clean
static inline ATruck* Spawn(f32 speedA, f32 speedB, uint32_t pathIndex, uint32_t pathPoint, ATruck::SpawnMode spawnMode) {
static ATruck* Spawn(f32 speedA, f32 speedB, uint32_t pathIndex, uint32_t pathPoint, ATruck::SpawnMode spawnMode) {
SpawnParams params = {
.Name = "mk:truck",
.Type = static_cast<uint16_t>(spawnMode),
@ -53,7 +49,7 @@ class ATruck : public AActor {
.Speed = speedA,
.SpeedB = speedB
};
return static_cast<ATruck*>(GetWorld()->AddActor(new ATruck(params)));
return dynamic_cast<ATruck*>(AddActorToWorld<ATruck>(params));
}
explicit ATruck(const SpawnParams& params);

View File

@ -6,6 +6,8 @@
#include <stubs.h>
#include "menus.h"
#include "TrackBrowser.h"
#include "editor/Editor.h"
#include "main.h"
#include "code_800029B0.h"
#include "actors.h"

View File

@ -4,6 +4,7 @@
#include "port/Engine.h"
#include <fast/Fast3dWindow.h>
#include <memory>
#include "engine/World.h"
#include "engine/AllTracks.h"
@ -211,8 +212,8 @@ void CM_VehicleCollision(s32 playerId, Player* player) {
void CM_BombKartsWaypoint(s32 cameraId) {
for (auto& object : GetWorld()->Objects) {
if (auto kart = dynamic_cast<OBombKart*>(object)) {
if (kart) {
if (auto* kart = dynamic_cast<OBombKart*>(object.get())) {
if (kart != nullptr) {
kart->Waypoint(cameraId);
}
}
@ -638,9 +639,9 @@ void CM_SpawnStarterLakitu() {
}
for (size_t i = 0; i < gPlayerCountSelection1; i++) {
OLakitu* lakitu = new OLakitu(i, OLakitu::LakituType::STARTER);
GetWorld()->Lakitus[i] = lakitu;
GetWorld()->AddObject(lakitu);
auto lakitu = std::make_unique<OLakitu>(i, OLakitu::LakituType::STARTER);
GetWorld()->Lakitus[i] = lakitu.get();
GetWorld()->AddObject(std::move(lakitu));
}
}
@ -692,7 +693,7 @@ void* GetTrack(void) {
struct Actor* CM_GetActor(size_t index) {
if (index < GetWorld()->Actors.size()) {
AActor* actor = GetWorld()->Actors[index];
AActor* actor = GetWorld()->Actors[index].get();
return reinterpret_cast<struct Actor*>(reinterpret_cast<char*>(actor) + sizeof(void*));
} else {
// throw std::runtime_error("GetActor() index out of bounds");
@ -704,9 +705,12 @@ size_t CM_FindActorIndex(Actor* actor) {
// Move the ptr back to look at the vtable.
// This gets us the proper C++ class instead of just the variables used in C.
AActor* a = reinterpret_cast<AActor*>(reinterpret_cast<char*>(actor) - sizeof(void*));
auto actors = GetWorld()->Actors;
auto& actors = GetWorld()->Actors;
auto it = std::find_if(actors.begin(), actors.end(), [a](const std::unique_ptr<AActor>& ptr) {
return ptr.get() == a;
});
auto it = std::find(actors.begin(), actors.end(), static_cast<AActor*>(a));
if (it != actors.end()) {
return std::distance(actors.begin(), it);
}
@ -715,7 +719,7 @@ size_t CM_FindActorIndex(Actor* actor) {
}
void CM_DeleteActor(size_t index) {
std::vector<AActor*> actors = GetWorld()->Actors;
auto& actors = GetWorld()->Actors;
if (index < actors.size()) {
actors.erase(actors.begin() + index);
}

View File

@ -11,6 +11,11 @@
class Track;
struct Properties;
class World;
template<class T, typename... TArgs> T* SpawnActor(TArgs&&... args) {
return T::Spawn(std::forward<TArgs>(args)...);
}
extern "C" {
#endif
#include "camera.h"

View File

@ -45,7 +45,7 @@ namespace Editor {
std::string label = fmt::format("{}##{}", name, id);
if (ImGui::Button(label.c_str())) {
gEditor.SelectObjectFromSceneExplorer(actor);
gEditor.SelectObjectFromSceneExplorer(actor.get());
}
id += 1;
@ -63,7 +63,7 @@ namespace Editor {
std::string label = fmt::format("{}##{}", name, id);
if (ImGui::Button(label.c_str())) {
gEditor.SelectObjectFromSceneExplorer(object);
gEditor.SelectObjectFromSceneExplorer(object.get());
}
id += 1;
}

View File

@ -5,6 +5,7 @@
#include <common_structs.h>
#include <defines.h>
#include <sounds.h>
#include "TrackBrowser.h"
#include "camera.h"
#include "waypoints.h"
#include "replays.h"

View File

@ -4,6 +4,7 @@
#include "spawn_players.h"
#include "code_800029B0.h"
#include "editor/Editor.h"
#include "kart_attributes.h"
#include "memory.h"
#include "waypoints.h"