Ivan: Move ActorDB registration into IvanCoop.cpp (#6815)

This commit is contained in:
Shishu the Dragon
2026-07-04 13:51:28 +12:00
committed by GitHub
parent c76d175526
commit b09c0733e2
5 changed files with 37 additions and 31 deletions
-21
View File
@@ -595,27 +595,6 @@ void ActorDB::Entry::SetDesc(const std::string& newDesc) {
entry.desc = desc.c_str();
}
#include "src/overlays/actors/ovl_En_Partner/z_en_partner.h"
static ActorDBInit EnPartnerInit = {
"En_Partner",
"Ivan",
ACTORCAT_ITEMACTION,
(ACTOR_FLAG_UPDATE_CULLING_DISABLED | ACTOR_FLAG_DRAW_CULLING_DISABLED | ACTOR_FLAG_HOOKSHOT_PULLS_PLAYER |
ACTOR_FLAG_CAN_PRESS_SWITCHES),
OBJECT_GAMEPLAY_KEEP,
sizeof(EnPartner),
(ActorFunc)EnPartner_Init,
(ActorFunc)EnPartner_Destroy,
(ActorFunc)EnPartner_Update,
(ActorFunc)EnPartner_Draw,
nullptr,
};
extern "C" s16 gEnPartnerId;
void ActorDB::AddBuiltInCustomActors() {
gEnPartnerId = ActorDB::Instance->AddEntry(EnPartnerInit).entry.id;
}
extern "C" ActorDBEntry* ActorDB_Retrieve(const int id) {
return &ActorDB::Instance->RetrieveEntry(id).entry;
}
-2
View File
@@ -62,8 +62,6 @@ class ActorDB {
Entry& RetrieveEntry(const int id);
int RetrieveId(const std::string& name);
static void AddBuiltInCustomActors();
int GetEntryCount();
private:
+37 -6
View File
@@ -1,16 +1,45 @@
#include "soh/ActorDB.h"
#include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h"
#include "soh/ShipInit.hpp"
#include "src/overlays/actors/ovl_En_Partner/z_en_partner.h"
extern "C" {
#include "macros.h"
#include "functions.h"
extern PlayState* gPlayState;
extern s16 gEnPartnerId;
}
#define CVAR_NAME CVAR_ENHANCEMENT("IvanCoopModeEnabled")
#define CVAR_VALUE CVarGetInteger(CVAR_NAME, 0)
static s16 ivanActorId = -1;
static void AddToActorDB() {
if (ivanActorId == -1) {
ActorDBInit entry = {
"En_Partner",
"Ivan",
ACTORCAT_ITEMACTION,
(ACTOR_FLAG_UPDATE_CULLING_DISABLED | ACTOR_FLAG_DRAW_CULLING_DISABLED | ACTOR_FLAG_HOOKSHOT_PULLS_PLAYER |
ACTOR_FLAG_CAN_PRESS_SWITCHES),
OBJECT_GAMEPLAY_KEEP,
sizeof(EnPartner),
(ActorFunc)EnPartner_Init,
(ActorFunc)EnPartner_Destroy,
(ActorFunc)EnPartner_Update,
(ActorFunc)EnPartner_Draw,
nullptr,
};
ivanActorId = ActorDB::Instance->AddEntry(entry).entry.id;
}
}
static Actor* FindIvan(ActorContext* actorCtx) {
if (ivanActorId == -1)
return nullptr;
return Actor_Find(actorCtx, ivanActorId, ACTORCAT_ITEMACTION);
}
static void SpawnIvan() {
if (!gPlayState)
return;
@@ -19,11 +48,13 @@ static void SpawnIvan() {
if (!player)
return;
if (Actor_Find(&gPlayState->actorCtx, gEnPartnerId, ACTORCAT_ITEMACTION))
if (FindIvan(&gPlayState->actorCtx))
return;
AddToActorDB();
PosRot& world = player->actor.world;
Actor_Spawn(&gPlayState->actorCtx, gPlayState, gEnPartnerId, world.pos.x,
Actor_Spawn(&gPlayState->actorCtx, gPlayState, ivanActorId, world.pos.x,
world.pos.y + Player_GetHeight(player) + 5.0f, world.pos.z, 0, world.rot.y, 0, 1);
}
@@ -31,7 +62,7 @@ static void KillIvan() {
if (!gPlayState)
return;
Actor* ivan = Actor_Find(&gPlayState->actorCtx, gEnPartnerId, ACTORCAT_ITEMACTION);
Actor* ivan = FindIvan(&gPlayState->actorCtx);
if (ivan)
Actor_Kill(ivan);
}
@@ -85,8 +116,8 @@ static void PatchDistIfNeeded(Actor* actor) {
if (!ShouldPatchDist(actor->id))
return;
Actor* ivan = Actor_Find(&gPlayState->actorCtx, gEnPartnerId, ACTORCAT_ITEMACTION);
if (ivan == nullptr)
Actor* ivan = FindIvan(&gPlayState->actorCtx);
if (!ivan)
return;
f32 ivanDist = Actor_WorldDistXZToActor(actor, ivan);
-1
View File
@@ -1561,7 +1561,6 @@ extern "C" void InitOTR(int argc, char* argv[]) {
VanillaItemTable_Init();
DebugConsole_Init();
ActorDB::AddBuiltInCustomActors();
// #region SOH [Randomizer] TODO: Remove these and refactor spoiler file handling for randomizer
CVarClear(CVAR_GENERAL("RandomizerNewFileDropped"));
CVarClear(CVAR_GENERAL("RandomizerDroppedFile"));
-1
View File
@@ -33,7 +33,6 @@ Input* D_8012D1F8 = NULL;
PlayState* gPlayState;
s16 firstInit = 0;
s16 gEnPartnerId;
void Play_SpawnScene(PlayState* play, s32 sceneId, s32 spawn);