44#include " port/hooks/list/PlayerEvent.h"
55#include " port/mods/PortEnhancements.h"
66#include " include/behavior_data.h"
7+ #include " port/hooks/list/EngineEvent.h"
8+ #include " include/level_commands.h"
9+ #include " assets/actors/star/geo.h"
10+ #include " assets/actors/coin/geo.h"
11+ static bool isInitialized = false ;
712
813// TODO: Need to possibly set behaviorArg to fix Star on Red Coin spawn behavior.
914// - Star will spin on an alternate axis and be uncollectable.
@@ -17,35 +22,65 @@ void LogOutSpawns(std::string type, int16_t model, int16_t posX, int16_t posY, i
1722 SPDLOG_INFO (" Type: {} | Model: {} | Position: {}" , type, model, locationStr);
1823}
1924
20- void ModifySpawnedObject (bool * shouldCancel, struct SpawnInfo * spawnInfo) {
25+ // void ModifySpawnedObject(bool* shouldCancel, struct SpawnInfo* spawnInfo) {
26+ // RandoCheckId randoCheckId =
27+ // Rando::StaticData::GetCheckByLocation(spawnInfo->startPos[0], spawnInfo->startPos[1], spawnInfo->startPos[2]);
28+ // if (randoCheckId == RC_UNKNOWN || !Rando::StaticData::IsCheckShuffled(randoCheckId)) {
29+ // *(shouldCancel) = false;
30+ // return;
31+ // }
32+ //
33+ // RandoItemId randoItemId = Rando::StaticData::GetShuffledRandoItem(randoCheckId);
34+ // if (randoItemId == RI_UNKNOWN) {
35+ // return;
36+ // }
37+ //
38+ // int32_t modelId = Rando::StaticData::GetModelByRandoItem(randoItemId);
39+ // const BehaviorScript* behavior = Rando::StaticData::GetBehaviorByModel(modelId);
40+ //
41+ // CustomItem::Spawn(modelId, behavior, spawnInfo->startPos[0], spawnInfo->startPos[1], spawnInfo->startPos[2]);
42+ // *(shouldCancel) = true;
43+ // }
44+
45+ void ModifySpawnedObject (bool * shouldCancel, s16 x, s16 y, s16 z) {
2146 RandoCheckId randoCheckId =
22- Rando::StaticData::GetCheckByLocation (spawnInfo-> startPos [ 0 ], spawnInfo-> startPos [ 1 ], spawnInfo-> startPos [ 2 ] );
47+ Rando::StaticData::GetCheckByLocation (x, y, z );
2348 if (randoCheckId == RC_UNKNOWN || !Rando::StaticData::IsCheckShuffled (randoCheckId)) {
2449 *(shouldCancel) = false ;
2550 return ;
2651 }
2752
2853 RandoItemId randoItemId = Rando::StaticData::GetShuffledRandoItem (randoCheckId);
29- if (randoItemId != RI_UNKNOWN ) {
30- spawnInfo->behaviorScript = segmented_to_virtual (
31- Rando::StaticData::GetBehaviorByModel (Rando::StaticData::GetModelByRandoItem (randoItemId)));
32- spawnInfo->model = NULL ;
33- spawnInfo->behaviorArg = (u32 )randoItemId;
54+ if (randoItemId == RI_UNKNOWN ) {
55+ return ;
3456 }
35- CustomItem::Spawn (spawnInfo);
57+
58+ int32_t modelId = Rando::StaticData::GetModelByRandoItem (randoItemId);
59+ const BehaviorScript* behavior = Rando::StaticData::GetBehaviorByModel (modelId);
60+
61+ CustomItem::Spawn (modelId, behavior, x, y, z);
3662 *(shouldCancel) = true ;
3763}
3864
3965// Entry point for the module, run once on game boot
4066void Rando::ActorBehavior::Init () {
41- REGISTER_LISTENER (SpawnObject, EVENT_PRIORITY_NORMAL , [](IEvent* event) {
42- SpawnObject* ev = (SpawnObject*)event;
67+ // REGISTER_LISTENER(SpawnObject, EVENT_PRIORITY_NORMAL, [](IEvent* event) {
68+ // SpawnObject* ev = (SpawnObject*)event;
69+ // if (!IS_RANDO(selectedFileNum)) {
70+ // return;
71+ // }
72+ // LogOutSpawns("Object", (int16_t)ev->spawnInfo->model, ev->spawnInfo->startPos[0], ev->spawnInfo->startPos[1],
73+ // ev->spawnInfo->startPos[2]);
74+ // ModifySpawnedObject(&event->cancelled, ev->spawnInfo);
75+ // });
76+
77+ REGISTER_LISTENER (SpawnMacroObject, EVENT_PRIORITY_NORMAL , [](IEvent* event) {
78+ SpawnMacroObject* ev = (SpawnMacroObject*)event;
4379 if (!IS_RANDO (selectedFileNum)) {
4480 return ;
4581 }
46- LogOutSpawns (" Object" , (int16_t )ev->spawnInfo ->model , ev->spawnInfo ->startPos [0 ], ev->spawnInfo ->startPos [1 ],
47- ev->spawnInfo ->startPos [2 ]);
48- ModifySpawnedObject (&event->cancelled , ev->spawnInfo );
82+ LogOutSpawns (" Object" , (int16_t )ev->model , ev->posX , ev->posY , ev->posZ );
83+ ModifySpawnedObject (&event->cancelled , ev->posX , ev->posY , ev->posZ );
4984 });
5085
5186 REGISTER_LISTENER (SpawnStar, EVENT_PRIORITY_NORMAL , [](IEvent* event) {
@@ -56,4 +91,17 @@ void Rando::ActorBehavior::Init() {
5691
5792 LogOutSpawns (" Star" , MODEL_STAR , ev->posX , ev->posY , ev->posZ );
5893 });
94+
95+ REGISTER_LISTENER (LevelScriptExecute, EVENT_PRIORITY_NORMAL , [](IEvent* event) {
96+ LevelScriptExecute* ev = (LevelScriptExecute*)event;
97+ if (isInitialized || ev->command != 36 ) {
98+ return ;
99+ }
100+
101+ if (!isInitialized) {
102+ LOAD_MODEL_FROM_GEO (MODEL_STAR , star_geo);
103+ LOAD_MODEL_FROM_GEO (MODEL_RED_COIN , red_coin_geo);
104+ isInitialized = true ;
105+ }
106+ });
59107}
0 commit comments