mirror of
https://github.com/HarbourMasters/Shipwright
synced 2026-08-21 14:55:27 -04:00
Apply Enemy Rando Dark Link fixes to Crowd Control & Sail (#7054)
This commit is contained in:
@@ -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();
|
||||
|
||||
@@ -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() {
|
||||
|
||||
@@ -16,6 +16,7 @@ class Sail : public Network {
|
||||
static Sail* Instance;
|
||||
|
||||
void Enable();
|
||||
void Disable();
|
||||
void OnIncomingJson(nlohmann::json payload);
|
||||
void OnConnected();
|
||||
void OnDisconnected();
|
||||
|
||||
Reference in New Issue
Block a user