mirror of
https://github.com/HarbourMasters/Shipwright
synced 2026-08-21 06:48:39 -04:00
FixFlexDrops (#7047)
This commit is contained in:
@@ -0,0 +1,21 @@
|
||||
#include "soh/Enhancements/game-interactor/GameInteractor.h"
|
||||
#include "soh/ShipInit.hpp"
|
||||
|
||||
extern "C" {
|
||||
#include "z64.h"
|
||||
// Converts a drop id based on age, health and owned items. Returns -1 when the drop can't be given.
|
||||
s16 func_8001F404(s16 dropId);
|
||||
}
|
||||
|
||||
static void RegisterFixFlexDrops() {
|
||||
// The flex drop picks the first thing you're low on, but doesn't check that you own the item to hold it,
|
||||
// so the drop is thrown away instead of falling through to the next candidate.
|
||||
COND_VB_SHOULD(VB_FLEX_DROP_AMMO, CVarGetInteger(CVAR_ENHANCEMENT("FixFlexDrops"), 0), {
|
||||
s16 dropId = va_arg(args, s32);
|
||||
if (*should && func_8001F404(dropId) == -1) {
|
||||
*should = false;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
static RegisterShipInitFunc initFunc(RegisterFixFlexDrops, { CVAR_ENHANCEMENT("FixFlexDrops") });
|
||||
@@ -6,7 +6,7 @@ extern "C" {
|
||||
#include "src/overlays/actors/ovl_Bg_Haka_Ship/z_bg_haka_ship.h"
|
||||
}
|
||||
|
||||
void RegisterFasterShadowShip() {
|
||||
static void RegisterFasterShadowShip() {
|
||||
COND_VB_SHOULD(VB_SHADOW_SHIP_SET_SPEED, CVarGetInteger(CVAR_ENHANCEMENT("FasterShadowShip"), 0), {
|
||||
BgHakaShip* ship = va_arg(args, BgHakaShip*);
|
||||
PlayState* play = va_arg(args, PlayState*);
|
||||
|
||||
@@ -791,6 +791,14 @@ typedef enum {
|
||||
// - None
|
||||
VB_FLASH_SCREEN_FOR_FINISHING_BLOW,
|
||||
|
||||
// #### `result`
|
||||
// ```c
|
||||
// varies
|
||||
// ```
|
||||
// #### `args`
|
||||
// - `s32` (drop id)
|
||||
VB_FLEX_DROP_AMMO,
|
||||
|
||||
// #### `result`
|
||||
// ```c
|
||||
// true
|
||||
|
||||
@@ -1079,6 +1079,11 @@ void SohMenu::AddMenuEnhancements() {
|
||||
.CVar(CVAR_ENHANCEMENT("BushDropFix"))
|
||||
.Options(CheckboxOptions().Tooltip(
|
||||
"Fixes the bushes to drop items correctly rather than spawning undefined items."));
|
||||
AddWidget(path, "Fix Flex Drops", WIDGET_CVAR_CHECKBOX)
|
||||
.CVar(CVAR_ENHANCEMENT("FixFlexDrops"))
|
||||
.Options(CheckboxOptions().Tooltip(
|
||||
"The flex drop gives whichever ammo you are lowest on, but doesn't check that you own the item to hold "
|
||||
"it, so the drop is lost. This makes it skip ammo you can't carry."));
|
||||
AddWidget(path, "Fix Enemies not Spawning Near Water", WIDGET_CVAR_CHECKBOX)
|
||||
.CVar(CVAR_ENHANCEMENT("EnemySpawnsOverWaterboxes"))
|
||||
.Options(CheckboxOptions().Tooltip(
|
||||
|
||||
@@ -1727,15 +1727,17 @@ void Item_DropCollectibleRandom(PlayState* play, Actor* fromActor, Vec3f* spawnP
|
||||
params = 0xA * 0x10;
|
||||
dropTableIndex = 0x0;
|
||||
dropId = ITEM00_MAGIC_SMALL;
|
||||
} else if (!LINK_IS_ADULT && (AMMO(ITEM_SLINGSHOT) < 6)) {
|
||||
} else if (GameInteractor_Should(VB_FLEX_DROP_AMMO, !LINK_IS_ADULT && (AMMO(ITEM_SLINGSHOT) < 6),
|
||||
ITEM00_SEEDS)) {
|
||||
params = 0xA * 0x10;
|
||||
dropTableIndex = 0x0;
|
||||
dropId = ITEM00_SEEDS;
|
||||
} else if (LINK_IS_ADULT && (AMMO(ITEM_BOW) < 6)) {
|
||||
} else if (GameInteractor_Should(VB_FLEX_DROP_AMMO, LINK_IS_ADULT && (AMMO(ITEM_BOW) < 6),
|
||||
ITEM00_ARROWS_MEDIUM)) {
|
||||
params = 0xA * 0x10;
|
||||
dropTableIndex = 0x0;
|
||||
dropId = ITEM00_ARROWS_MEDIUM;
|
||||
} else if (AMMO(ITEM_BOMB) < 6) {
|
||||
} else if (GameInteractor_Should(VB_FLEX_DROP_AMMO, AMMO(ITEM_BOMB) < 6, ITEM00_BOMBS_A)) {
|
||||
params = 0xD * 0x10;
|
||||
dropTableIndex = 0x0;
|
||||
dropId = ITEM00_BOMBS_A;
|
||||
|
||||
Reference in New Issue
Block a user