Apply Enemy Rando Dark Link fixes to Crowd Control & Sail (#7054)

This commit is contained in:
Philip Dubé
2026-08-09 23:46:51 +00:00
committed by GitHub
parent f35f134c93
commit 0cf2b37013
6 changed files with 92 additions and 58 deletions
@@ -19,7 +19,6 @@ extern "C" {
#include "src/overlays/actors/ovl_En_Encount1/z_en_encount1.h"
#include "src/overlays/actors/ovl_En_GeldB/z_en_geldb.h"
#include "src/overlays/actors/ovl_En_Peehat/z_en_peehat.h"
#include "src/overlays/actors/ovl_En_Rr/z_en_rr.h"
#include "src/overlays/actors/ovl_En_Vali/z_en_vali.h"
extern PlayState* gPlayState;
@@ -652,63 +651,6 @@ void CustomPeehatLarvaDestroy(Actor* thisx, PlayState* play) {
void RegisterEnemyRandomizer() {
COND_ID_HOOK(OnActorInit, ACTOR_EN_MB, ENEMY_RANDOMIZER_ENABLED, FixClubMoblinScale);
// prevent dark link from triggering a voidout
COND_VB_SHOULD(VB_TRIGGER_VOIDOUT, ENEMY_RANDOMIZER_ENABLED, {
Actor* actor = va_arg(args, Actor*);
if (*should == true && actor->category != ACTORCAT_PLAYER) {
// Improvement opportunity: Play sfx
*should = false;
Actor_Kill(actor);
}
});
// prevent dark link dealing fall damage to the player
COND_VB_SHOULD(VB_RECIEVE_FALL_DAMAGE, ENEMY_RANDOMIZER_ENABLED, {
Actor* actor = va_arg(args, Actor*);
if (actor->category != ACTORCAT_PLAYER) {
*should = false;
}
});
// prevent dark link from interfering with HESS/recoil/etc when at more than 100 away from him
COND_VB_SHOULD(VB_TORCH2_HANDLE_CLANKING, ENEMY_RANDOMIZER_ENABLED, {
Actor* darkLink = va_arg(args, Actor*);
if (darkLink->xzDistToPlayer > 100.0f) {
*should = false;
}
});
// prevent dark link from interfering with ice floors
COND_VB_SHOULD(VB_SET_STATIC_PREV_FLOOR_TYPE, ENEMY_RANDOMIZER_ENABLED, {
Player* playerOrDarkLink = va_arg(args, Player*);
if (playerOrDarkLink->actor.id != ACTOR_PLAYER) {
*should = false;
}
});
// prevent dark link from interfering with ice floors
COND_VB_SHOULD(VB_SET_STATIC_FLOOR_TYPE, ENEMY_RANDOMIZER_ENABLED, {
Player* playerOrDarkLink = va_arg(args, Player*);
if (playerOrDarkLink->actor.id != ACTOR_PLAYER) {
*should = false;
}
});
// prevent dark link from being grabbed by like likes and therefore grabbing the player
COND_VB_SHOULD(VB_LIKE_LIKE_GRAB_PLAYER, ENEMY_RANDOMIZER_ENABLED, {
EnRr* likeLike = va_arg(args, EnRr*);
if (!(likeLike->collider1.base.oc != NULL && likeLike->collider1.base.oc->category == ACTORCAT_PLAYER) &&
!(likeLike->collider2.base.oc != NULL && likeLike->collider2.base.oc->category == ACTORCAT_PLAYER)) {
*should = false;
}
});
// Allow Random Gerudo Fighters (contain no keys) to spawn without any switch flags
COND_VB_SHOULD(VB_GERUDO_FIGHTER_CONTINUE_WAITING, ENEMY_RANDOMIZER_ENABLED, {
EnGeldB* enGeldB = va_arg(args, EnGeldB*);
@@ -0,0 +1,77 @@
#include "soh/Enhancements/game-interactor/GameInteractor.h"
#include "soh/Enhancements/enhancementTypes.h"
#include "soh/ShipInit.hpp"
#include "soh/cvar_prefixes.h"
extern "C" {
#include "functions.h"
#include "src/overlays/actors/ovl_En_Rr/z_en_rr.h"
}
// Dark Link runs the player update function, so anything he does that has a global effect (voiding
// out, fall damage, the shared floor type statics) happens to Link instead.
static void RegisterDarkLinkFixes() {
bool required =
CVarGetInteger(CVAR_ENHANCEMENT("RandomizedEnemies"), ENEMY_RANDOMIZER_OFF) != ENEMY_RANDOMIZER_OFF ||
CVarGetInteger(CVAR_REMOTE_CROWD_CONTROL("Enabled"), 0) || CVarGetInteger(CVAR_REMOTE_SAIL("Enabled"), 0);
// prevent dark link from triggering a voidout
COND_VB_SHOULD(VB_TRIGGER_VOIDOUT, required, {
Actor* actor = va_arg(args, Actor*);
if (*should == true && actor->category != ACTORCAT_PLAYER) {
// Improvement opportunity: Play sfx
*should = false;
Actor_Kill(actor);
}
});
// prevent dark link dealing fall damage to the player
COND_VB_SHOULD(VB_RECIEVE_FALL_DAMAGE, required, {
Actor* actor = va_arg(args, Actor*);
if (actor->category != ACTORCAT_PLAYER) {
*should = false;
}
});
// prevent dark link from interfering with HESS/recoil/etc when at more than 100 away from him
COND_VB_SHOULD(VB_TORCH2_HANDLE_CLANKING, required, {
Actor* darkLink = va_arg(args, Actor*);
if (darkLink->xzDistToPlayer > 100.0f) {
*should = false;
}
});
// prevent dark link from interfering with ice floors
COND_VB_SHOULD(VB_SET_STATIC_PREV_FLOOR_TYPE, required, {
Player* playerOrDarkLink = va_arg(args, Player*);
if (playerOrDarkLink->actor.id != ACTOR_PLAYER) {
*should = false;
}
});
// prevent dark link from interfering with ice floors
COND_VB_SHOULD(VB_SET_STATIC_FLOOR_TYPE, required, {
Player* playerOrDarkLink = va_arg(args, Player*);
if (playerOrDarkLink->actor.id != ACTOR_PLAYER) {
*should = false;
}
});
// prevent dark link from being grabbed by like likes and therefore grabbing the player
COND_VB_SHOULD(VB_LIKE_LIKE_GRAB_PLAYER, required, {
EnRr* likeLike = va_arg(args, EnRr*);
if (!(likeLike->collider1.base.oc != NULL && likeLike->collider1.base.oc->category == ACTORCAT_PLAYER) &&
!(likeLike->collider2.base.oc != NULL && likeLike->collider2.base.oc->category == ACTORCAT_PLAYER)) {
*should = false;
}
});
}
static RegisterShipInitFunc initFunc(RegisterDarkLinkFixes,
{ CVAR_ENHANCEMENT("RandomizedEnemies"), CVAR_REMOTE_CROWD_CONTROL("Enabled"),
CVAR_REMOTE_SAIL("Enabled") });
@@ -13,6 +13,12 @@ extern PlayState* gPlayState;
void CrowdControl::Enable() {
Network::Enable(CVarGetString(CVAR_REMOTE_CROWD_CONTROL("Host"), "127.0.0.1"),
CVarGetInteger(CVAR_REMOTE_CROWD_CONTROL("Port"), 43384));
ShipInit::Init(CVAR_REMOTE_CROWD_CONTROL("Enabled"));
}
void CrowdControl::Disable() {
Network::Disable();
ShipInit::Init(CVAR_REMOTE_CROWD_CONTROL("Enabled"));
}
void CrowdControl::OnConnected() {
@@ -80,6 +80,7 @@ class CrowdControl : public Network {
public:
static CrowdControl* Instance;
void Enable();
void Disable();
void OnIncomingJson(nlohmann::json payload);
void OnConnected();
void OnDisconnected();
+7
View File
@@ -4,6 +4,7 @@
#include <ship/window/Window.h>
#include <ship/window/gui/ConsoleWindow.h>
#include <spdlog/spdlog.h>
#include "soh/ShipInit.hpp"
#include "soh/ShipUtils.h"
#include "soh/cvar_prefixes.h"
@@ -14,6 +15,12 @@ template <class DstType, class SrcType> bool IsType(const SrcType* src) {
void Sail::Enable() {
Network::Enable(CVarGetString(CVAR_REMOTE_SAIL("Host"), "127.0.0.1"),
CVarGetInteger(CVAR_REMOTE_SAIL("Port"), 43384));
ShipInit::Init(CVAR_REMOTE_SAIL("Enabled"));
}
void Sail::Disable() {
Network::Disable();
ShipInit::Init(CVAR_REMOTE_SAIL("Enabled"));
}
void Sail::OnConnected() {
+1
View File
@@ -16,6 +16,7 @@ class Sail : public Network {
static Sail* Instance;
void Enable();
void Disable();
void OnIncomingJson(nlohmann::json payload);
void OnConnected();
void OnDisconnected();