mirror of
https://github.com/HarbourMasters/Shipwright.git
synced 2025-08-20 21:33:40 -07:00
treesanity
co-authored-by: turbofist
This commit is contained in:
parent
9e686ae6f6
commit
de93497310
39 changed files with 724 additions and 18 deletions
12
soh/assets/custom/objects/object_rando_tree/gRandoTreeDL
Normal file
12
soh/assets/custom/objects/object_rando_tree/gRandoTreeDL
Normal file
|
@ -0,0 +1,12 @@
|
|||
<DisplayList Version="0">
|
||||
<ClearGeometryMode G_LIGHTING="1" />
|
||||
<LoadVertices Path="objects/object_rando_tree/gRandoTreeDL_vtx_cull" VertexBufferIndex="0" VertexOffset="0" Count="8"/>
|
||||
<SetGeometryMode G_LIGHTING="1" />
|
||||
<CullDisplayList Start="0" End="7"/>
|
||||
<CallDisplayList Path="objects/object_rando_tree/mat_gRandoTreeDL_treeTexMaterial"/>
|
||||
<CallDisplayList Path="objects/object_rando_tree/gRandoTreeDL_tri_0"/>
|
||||
<CallDisplayList Path="objects/object_rando_tree/mat_gRandoTreeDL_triforceTexMaterial"/>
|
||||
<CallDisplayList Path="objects/object_rando_tree/gRandoTreeDL_tri_1"/>
|
||||
<EndDisplayList/>
|
||||
</DisplayList>
|
||||
|
Binary file not shown.
|
@ -0,0 +1,12 @@
|
|||
<DisplayList Version="0">
|
||||
<LoadVertices Path="objects/object_rando_tree/gRandoTreeDL_vtx_0" VertexBufferIndex="0" VertexOffset="0" Count="30"/>
|
||||
<Triangles2 V00="0" V01="1" V02="2" Flag0="0" V10="3" V11="4" V12="5" Flag1="0"/>
|
||||
<Triangles2 V00="6" V01="7" V02="8" Flag0="0" V10="6" V11="8" V12="9" Flag1="0"/>
|
||||
<Triangles2 V00="10" V01="11" V02="12" Flag0="0" V10="10" V11="12" V12="13" Flag1="0"/>
|
||||
<Triangles2 V00="14" V01="15" V02="16" Flag0="0" V10="14" V11="16" V12="17" Flag1="0"/>
|
||||
<Triangles2 V00="18" V01="19" V02="20" Flag0="0" V10="18" V11="20" V12="21" Flag1="0"/>
|
||||
<Triangles2 V00="22" V01="23" V02="24" Flag0="0" V10="23" V11="25" V12="24" Flag1="0"/>
|
||||
<Triangles2 V00="26" V01="27" V02="28" Flag0="0" V10="26" V11="28" V12="29" Flag1="0"/>
|
||||
<EndDisplayList/>
|
||||
</DisplayList>
|
||||
|
|
@ -0,0 +1,9 @@
|
|||
<DisplayList Version="0">
|
||||
<LoadVertices Path="objects/object_rando_tree/gRandoTreeDL_vtx_1" VertexBufferIndex="0" VertexOffset="0" Count="16"/>
|
||||
<Triangles2 V00="0" V01="1" V02="2" Flag0="0" V10="0" V11="2" V12="3" Flag1="0"/>
|
||||
<Triangles2 V00="4" V01="5" V02="6" Flag0="0" V10="4" V11="6" V12="7" Flag1="0"/>
|
||||
<Triangles2 V00="8" V01="9" V02="10" Flag0="0" V10="8" V11="10" V12="11" Flag1="0"/>
|
||||
<Triangles2 V00="12" V01="13" V02="14" Flag0="0" V10="12" V11="14" V12="15" Flag1="0"/>
|
||||
<EndDisplayList/>
|
||||
</DisplayList>
|
||||
|
|
@ -0,0 +1,32 @@
|
|||
<Vertex Version="0">
|
||||
<Vtx X="-7" Y="61" Z="8" S="108" T="-1442" R="15" G="0" B="126" A="255"/>
|
||||
<Vtx X="8" Y="61" Z="6" S="978" T="-1497" R="85" G="4" B="94" A="255"/>
|
||||
<Vtx X="0" Y="400" Z="0" S="721" T="-15424" R="13" G="3" B="126" A="255"/>
|
||||
<Vtx X="-8" Y="61" Z="-6" S="111" T="-1572" R="4" G="133" B="33" A="255"/>
|
||||
<Vtx X="-7" Y="61" Z="8" S="981" T="-1574" R="192" G="4" B="110" A="255"/>
|
||||
<Vtx X="0" Y="400" Z="0" S="736" T="-16260" R="243" G="22" B="132" A="255"/>
|
||||
<Vtx X="9" Y="0" Z="7" S="1024" T="1016" R="85" G="4" B="94" A="255"/>
|
||||
<Vtx X="8" Y="43" Z="6" S="991" T="-747" R="10" G="75" B="102" A="255"/>
|
||||
<Vtx X="-7" Y="43" Z="8" S="73" T="-648" R="13" G="2" B="126" A="255"/>
|
||||
<Vtx X="-8" Y="0" Z="9" S="0" T="1024" R="192" G="4" B="110" A="255"/>
|
||||
<Vtx X="8" Y="0" Z="-9" S="1024" T="1016" R="94" G="4" B="171" A="255"/>
|
||||
<Vtx X="7" Y="43" Z="-8" S="987" T="-815" R="98" G="81" B="251" A="255"/>
|
||||
<Vtx X="8" Y="43" Z="6" S="73" T="-826" R="247" G="122" B="222" A="255"/>
|
||||
<Vtx X="9" Y="0" Z="7" S="0" T="1024" R="85" G="4" B="94" A="255"/>
|
||||
<Vtx X="-10" Y="0" Z="-7" S="0" T="1024" R="146" G="4" B="192" A="255"/>
|
||||
<Vtx X="-9" Y="43" Z="-6" S="70" T="-590" R="250" G="103" B="183" A="255"/>
|
||||
<Vtx X="7" Y="43" Z="-8" S="989" T="-672" R="1" G="16" B="130" A="255"/>
|
||||
<Vtx X="8" Y="0" Z="-9" S="1024" T="1016" R="95" G="4" B="171" A="255"/>
|
||||
<Vtx X="-8" Y="0" Z="9" S="1024" T="1016" R="192" G="4" B="110" A="255"/>
|
||||
<Vtx X="-7" Y="43" Z="8" S="995" T="-741" R="181" G="103" B="7" A="255"/>
|
||||
<Vtx X="-9" Y="43" Z="-6" S="75" T="-732" R="242" G="224" B="134" A="255"/>
|
||||
<Vtx X="-10" Y="0" Z="-7" S="0" T="1024" R="146" G="4" B="192" A="255"/>
|
||||
<Vtx X="7" Y="61" Z="-8" S="973" T="-1426" R="0" G="244" B="130" A="255"/>
|
||||
<Vtx X="-8" Y="61" Z="-6" S="104" T="-1363" R="146" G="4" B="192" A="255"/>
|
||||
<Vtx X="4" Y="200" Z="-5" S="859" T="-6926" R="6" G="2" B="129" A="255"/>
|
||||
<Vtx X="0" Y="400" Z="0" S="694" T="-14868" R="243" G="22" B="132" A="255"/>
|
||||
<Vtx X="8" Y="61" Z="6" S="103" T="-1611" R="2" G="35" B="122" A="255"/>
|
||||
<Vtx X="7" Y="61" Z="-8" S="971" T="-1633" R="94" G="4" B="171" A="255"/>
|
||||
<Vtx X="4" Y="200" Z="-5" S="850" T="-7602" R="94" G="44" B="183" A="255"/>
|
||||
<Vtx X="0" Y="400" Z="0" S="676" T="-16219" R="243" G="22" B="132" A="255"/>
|
||||
</Vertex>
|
|
@ -0,0 +1,18 @@
|
|||
<Vertex Version="0">
|
||||
<Vtx X="7" Y="43" Z="-8" S="-4" T="1053" R="0" G="244" B="130" A="255"/>
|
||||
<Vtx X="-9" Y="43" Z="-6" S="993" T="1053" R="146" G="4" B="192" A="255"/>
|
||||
<Vtx X="-8" Y="61" Z="-6" S="966" T="-89" R="250" G="104" B="183" A="255"/>
|
||||
<Vtx X="7" Y="61" Z="-8" S="22" T="-89" R="1" G="16" B="130" A="255"/>
|
||||
<Vtx X="-7" Y="43" Z="8" S="-4" T="1053" R="15" G="0" B="126" A="255"/>
|
||||
<Vtx X="8" Y="43" Z="6" S="993" T="1053" R="85" G="4" B="94" A="255"/>
|
||||
<Vtx X="8" Y="61" Z="6" S="966" T="-89" R="11" G="75" B="102" A="255"/>
|
||||
<Vtx X="-7" Y="61" Z="8" S="22" T="-89" R="13" G="2" B="126" A="255"/>
|
||||
<Vtx X="-9" Y="43" Z="-6" S="-4" T="1053" R="3" G="133" B="33" A="255"/>
|
||||
<Vtx X="-7" Y="43" Z="8" S="993" T="1053" R="192" G="4" B="110" A="255"/>
|
||||
<Vtx X="-7" Y="61" Z="8" S="966" T="-89" R="182" G="103" B="7" A="255"/>
|
||||
<Vtx X="-8" Y="61" Z="-6" S="22" T="-89" R="242" G="224" B="134" A="255"/>
|
||||
<Vtx X="8" Y="43" Z="6" S="-4" T="1053" R="2" G="35" B="122" A="255"/>
|
||||
<Vtx X="7" Y="43" Z="-8" S="993" T="1053" R="94" G="4" B="171" A="255"/>
|
||||
<Vtx X="7" Y="61" Z="-8" S="966" T="-89" R="98" G="81" B="251" A="255"/>
|
||||
<Vtx X="8" Y="61" Z="6" S="22" T="-89" R="247" G="122" B="222" A="255"/>
|
||||
</Vertex>
|
|
@ -0,0 +1,10 @@
|
|||
<Vertex Version="0">
|
||||
<Vtx X="-10" Y="0" Z="-9" S="0" T="0" R="0" G="0" B="0" A="0"/>
|
||||
<Vtx X="-10" Y="0" Z="9" S="0" T="0" R="0" G="0" B="0" A="0"/>
|
||||
<Vtx X="-10" Y="400" Z="9" S="0" T="0" R="0" G="0" B="0" A="0"/>
|
||||
<Vtx X="-10" Y="400" Z="-9" S="0" T="0" R="0" G="0" B="0" A="0"/>
|
||||
<Vtx X="9" Y="0" Z="-9" S="0" T="0" R="0" G="0" B="0" A="0"/>
|
||||
<Vtx X="9" Y="0" Z="9" S="0" T="0" R="0" G="0" B="0" A="0"/>
|
||||
<Vtx X="9" Y="400" Z="9" S="0" T="0" R="0" G="0" B="0" A="0"/>
|
||||
<Vtx X="9" Y="400" Z="-9" S="0" T="0" R="0" G="0" B="0" A="0"/>
|
||||
</Vertex>
|
|
@ -0,0 +1,16 @@
|
|||
<DisplayList Version="0">
|
||||
<SetGeometryMode G_ZBUFFER="1" G_SHADE="1" G_CULL_BACK="1" G_FOG="1" G_LIGHTING="1" G_SHADING_SMOOTH="1" />
|
||||
<PipeSync/>
|
||||
<SetCombineLERP A0="G_CCMUX_TEXEL0" B0="G_CCMUX_0" C0="G_CCMUX_SHADE" D0="G_CCMUX_0" Aa0="G_ACMUX_0" Ab0="G_ACMUX_0" Ac0="G_ACMUX_0" Ad0="G_ACMUX_1" A1="G_CCMUX_COMBINED" B1="G_CCMUX_0" C1="G_CCMUX_PRIMITIVE" D1="G_CCMUX_0" Aa1="G_ACMUX_0" Ab1="G_ACMUX_0" Ac1="G_ACMUX_0" Ad1="G_ACMUX_COMBINED"/>
|
||||
<SetOtherMode Cmd="G_SETOTHERMODE_H" Sft="4" Length="20" G_AD_NOISE="1" G_CD_MAGICSQ="1" G_CK_NONE="1" G_TC_FILT="1" G_TF_BILERP="1" G_TT_NONE="1" G_TL_TILE="1" G_TD_CLAMP="1" G_TP_PERSP="1" G_CYC_2CYCLE="1" G_PM_NPRIMITIVE="1" />
|
||||
<SetOtherMode Cmd="G_SETOTHERMODE_L" Sft="0" Length="32" G_AC_NONE="1" G_ZS_PIXEL="1" G_RM_FOG_SHADE_A="1" G_RM_AA_ZB_OPA_SURF2="1" />
|
||||
<Texture S="65535" T="65535" Level="0" Tile="0" On="1"/>
|
||||
<SetPrimColor M="0" L="0" R="255" G="255" B="255" A="255"/>
|
||||
<SetTextureImage Path="objects/object_wood02/object_wood02_Tex_000790" Format="G_IM_FMT_RGBA" Size="G_IM_SIZ_16b_LOAD_BLOCK" Width="1"/>
|
||||
<SetTile Format="G_IM_FMT_RGBA" Size="G_IM_SIZ_16b_LOAD_BLOCK" Line="0" TMem="0" Tile="7" Palette="0" Cms0="G_TX_WRAP" Cms1="G_TX_NOMIRROR" Cmt0="G_TX_WRAP" Cmt1="G_TX_NOMIRROR" MaskS="0" ShiftS="0" MaskT="0" ShiftT="0"/>
|
||||
<LoadBlock Tile="7" Uls="0" Ult="0" Lrs="1023" Dxt="256"/>
|
||||
<SetTile Format="G_IM_FMT_RGBA" Size="G_IM_SIZ_16b" Line="8" TMem="0" Tile="0" Palette="0" Cms0="G_TX_WRAP" Cms1="G_TX_NOMIRROR" Cmt0="G_TX_WRAP" Cmt1="G_TX_NOMIRROR" MaskS="5" ShiftS="0" MaskT="5" ShiftT="0"/>
|
||||
<SetTileSize T="0" Uls="0" Ult="0" Lrs="124" Lrt="124"/>
|
||||
<EndDisplayList/>
|
||||
</DisplayList>
|
||||
|
|
@ -0,0 +1,16 @@
|
|||
<DisplayList Version="0">
|
||||
<SetGeometryMode G_ZBUFFER="1" G_SHADE="1" G_CULL_BACK="1" G_FOG="1" G_LIGHTING="1" G_SHADING_SMOOTH="1" />
|
||||
<PipeSync/>
|
||||
<SetCombineLERP A0="G_CCMUX_TEXEL0" B0="G_CCMUX_0" C0="G_CCMUX_SHADE" D0="G_CCMUX_0" Aa0="G_ACMUX_0" Ab0="G_ACMUX_0" Ac0="G_ACMUX_0" Ad0="G_ACMUX_1" A1="G_CCMUX_COMBINED" B1="G_CCMUX_0" C1="G_CCMUX_PRIMITIVE" D1="G_CCMUX_0" Aa1="G_ACMUX_0" Ab1="G_ACMUX_0" Ac1="G_ACMUX_0" Ad1="G_ACMUX_COMBINED"/>
|
||||
<SetOtherMode Cmd="G_SETOTHERMODE_H" Sft="4" Length="20" G_AD_NOISE="1" G_CD_MAGICSQ="1" G_CK_NONE="1" G_TC_FILT="1" G_TF_BILERP="1" G_TT_NONE="1" G_TL_TILE="1" G_TD_CLAMP="1" G_TP_PERSP="1" G_CYC_2CYCLE="1" G_PM_NPRIMITIVE="1" />
|
||||
<SetOtherMode Cmd="G_SETOTHERMODE_L" Sft="0" Length="32" G_AC_NONE="1" G_ZS_PIXEL="1" G_RM_FOG_SHADE_A="1" G_RM_AA_ZB_OPA_SURF2="1" />
|
||||
<Texture S="65535" T="65535" Level="0" Tile="0" On="1"/>
|
||||
<SetPrimColor M="0" L="0" R="255" G="255" B="255" A="255"/>
|
||||
<SetTextureImage Path="objects/object_rando_tree/gRandoTreeDLTriforceTexture32.rgba16" Format="G_IM_FMT_RGBA" Size="G_IM_SIZ_16b_LOAD_BLOCK" Width="1"/>
|
||||
<SetTile Format="G_IM_FMT_RGBA" Size="G_IM_SIZ_16b_LOAD_BLOCK" Line="0" TMem="0" Tile="7" Palette="0" Cms0="G_TX_WRAP" Cms1="G_TX_NOMIRROR" Cmt0="G_TX_WRAP" Cmt1="G_TX_NOMIRROR" MaskS="0" ShiftS="0" MaskT="0" ShiftT="0"/>
|
||||
<LoadBlock Tile="7" Uls="0" Ult="0" Lrs="1023" Dxt="256"/>
|
||||
<SetTile Format="G_IM_FMT_RGBA" Size="G_IM_SIZ_16b" Line="8" TMem="0" Tile="0" Palette="0" Cms0="G_TX_WRAP" Cms1="G_TX_NOMIRROR" Cmt0="G_TX_WRAP" Cmt1="G_TX_NOMIRROR" MaskS="5" ShiftS="0" MaskT="5" ShiftT="0"/>
|
||||
<SetTileSize T="0" Uls="0" Ult="0" Lrs="124" Lrt="124"/>
|
||||
<EndDisplayList/>
|
||||
</DisplayList>
|
||||
|
|
@ -0,0 +1,6 @@
|
|||
<DisplayList Version="0">
|
||||
<SetGeometryMode />
|
||||
<ClearGeometryMode G_FOG="1" />
|
||||
<PipeSync/>
|
||||
</DisplayList>
|
||||
|
|
@ -0,0 +1,6 @@
|
|||
<DisplayList Version="0">
|
||||
<SetGeometryMode />
|
||||
<ClearGeometryMode G_FOG="1" />
|
||||
<PipeSync/>
|
||||
</DisplayList>
|
||||
|
|
@ -77,6 +77,9 @@ static const ALIGN_ASSET(2) char gBossSoulSkullDL[] = dgBossSoulSkullDL;
|
|||
#define dgRandoPotDL "__OTR__objects/gameplay_dangeon_keep/gRandoPotDL"
|
||||
static const ALIGN_ASSET(2) char gRandoPotDL[] = dgRandoPotDL;
|
||||
|
||||
#define dgRandoTreeDL "__OTR__objects/object_rando_tree/gRandoTreeDL"
|
||||
static const ALIGN_ASSET(2) char gRandoTreeDL[] = dgRandoTreeDL;
|
||||
|
||||
#define dgRandoBushDL "__OTR__objects/gameplay_field_keep/gFieldBushRandomDL"
|
||||
static const ALIGN_ASSET(2) char gRandoBushDL[] = dgRandoBushDL;
|
||||
|
||||
|
|
|
@ -2155,6 +2155,22 @@ typedef enum {
|
|||
// - `*EnWood02`
|
||||
VB_TREE_DROP_COLLECTIBLE,
|
||||
|
||||
// ```c
|
||||
// true
|
||||
// ```
|
||||
// #### `args`
|
||||
// - `*ObjWood02`
|
||||
VB_TREE_SETUP_DRAW,
|
||||
|
||||
// #### `result`
|
||||
// ```c
|
||||
// true
|
||||
// ```
|
||||
// #### `args`
|
||||
// - `*ObjWood02`
|
||||
VB_TREE_DROP_ITEM,
|
||||
|
||||
// #### `result`
|
||||
// ```c
|
||||
// true
|
||||
// ```
|
||||
|
|
|
@ -2081,6 +2081,30 @@ void StaticData::HintTable_Init_Exclude_Overworld() {
|
|||
/*german*/ "Man erzählt sich, daß eine #Kiste im Labor am See# #[[1]]# enthielte.",
|
||||
/*french*/ "Selon moi, une #caisse dans un laboratoire# contient #[[1]]#.", {QM_RED, QM_GREEN}));
|
||||
|
||||
hintTextTable[RHT_TREE_HYRULE_FIELD] =
|
||||
HintText(CustomMessage("They say that a #tree in Hyrule Field# contains #[[1]]#.",
|
||||
/*german*/ "",
|
||||
/*french*/ "", { QM_RED, QM_GREEN }));
|
||||
hintTextTable[RHT_TREE_MARKET] =
|
||||
HintText(CustomMessage("They say that a #tree in Hyrule Market# contains #[[1]]#.",
|
||||
/*german*/ "",
|
||||
/*french*/ "", { QM_RED, QM_GREEN }));
|
||||
hintTextTable[RHT_TREE_HYRULE_CASTLE] =
|
||||
HintText(CustomMessage("They say that a #tree in Hyrule Castle# contains #[[1]]#.",
|
||||
/*german*/ "",
|
||||
/*french*/ "", { QM_RED, QM_GREEN }));
|
||||
hintTextTable[RHT_TREE_ZORAS_RIVER] =
|
||||
HintText(CustomMessage("They say that a #tree in Zora's River# contains #[[1]]#.",
|
||||
/*german*/ "",
|
||||
/*french*/ "", { QM_RED, QM_GREEN }));
|
||||
hintTextTable[RHT_TREE_ZORAS_FOUNTAIN] =
|
||||
HintText(CustomMessage("They say that a #tree in Zora's Fountain# contains #[[1]]#.",
|
||||
/*german*/ "",
|
||||
/*french*/ "", { QM_RED, QM_GREEN }));
|
||||
hintTextTable[RHT_TREE_LON_LON_RANCH] =
|
||||
HintText(CustomMessage("They say that a #tree in Lon Lon Ranch# contains #[[1]]#.",
|
||||
/*german*/ "",
|
||||
/*french*/ "", { QM_RED, QM_GREEN }));
|
||||
// clang-format on
|
||||
}
|
||||
} // namespace Rando
|
||||
|
|
|
@ -604,6 +604,10 @@ void GenerateItemPool() {
|
|||
ctx->GetOption(RSK_SHUFFLE_POTS).Is(RO_SHUFFLE_POTS_ALL);
|
||||
PlaceItemsForType(RCTYPE_POT, overworldPotsActive, dungeonPotsActive);
|
||||
|
||||
// Shuffle Trees
|
||||
bool treesActive = (bool)ctx->GetOption(RSK_SHUFFLE_TREES);
|
||||
PlaceItemsForType(RCTYPE_TREE, treesActive, false);
|
||||
|
||||
// Shuffle Crates
|
||||
bool overworldCratesActive = ctx->GetOption(RSK_SHUFFLE_CRATES).Is(RO_SHUFFLE_CRATES_OVERWORLD) ||
|
||||
ctx->GetOption(RSK_SHUFFLE_CRATES).Is(RO_SHUFFLE_CRATES_ALL);
|
||||
|
|
203
soh/soh/Enhancements/randomizer/ShuffleTrees.cpp
Normal file
203
soh/soh/Enhancements/randomizer/ShuffleTrees.cpp
Normal file
|
@ -0,0 +1,203 @@
|
|||
#include <soh/OTRGlobals.h>
|
||||
#include "soh_assets.h"
|
||||
#include "static_data.h"
|
||||
|
||||
extern "C" {
|
||||
#include "variables.h"
|
||||
#include "src/overlays/actors/ovl_En_Wood02/z_en_wood02.h"
|
||||
#include "objects/object_wood02/object_wood02.h"
|
||||
extern PlayState* gPlayState;
|
||||
void EnWood02_Draw(Actor*, PlayState*);
|
||||
}
|
||||
|
||||
static Gfx* D_80B3BF54[] = {
|
||||
(Gfx*)object_wood02_DL_0078D0, (Gfx*)object_wood02_DL_007CA0, (Gfx*)object_wood02_DL_0080D0,
|
||||
(Gfx*)object_wood02_DL_000090, (Gfx*)object_wood02_DL_000340, (Gfx*)object_wood02_DL_000340,
|
||||
(Gfx*)object_wood02_DL_000700,
|
||||
};
|
||||
|
||||
static Gfx* D_80B3BF70[] = {
|
||||
(Gfx*)object_wood02_DL_007968,
|
||||
(Gfx*)object_wood02_DL_007D38,
|
||||
(Gfx*)object_wood02_DL_0081A8,
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
(Gfx*)object_wood02_DL_007AD0,
|
||||
(Gfx*)object_wood02_DL_007E20,
|
||||
(Gfx*)object_wood02_DL_008350,
|
||||
(Gfx*)object_wood02_DL_000160,
|
||||
(Gfx*)object_wood02_DL_000440,
|
||||
(Gfx*)object_wood02_DL_000700,
|
||||
};
|
||||
|
||||
extern void EnItem00_DrawRandomizedItem(EnItem00* enItem00, PlayState* play);
|
||||
|
||||
uint8_t EnWood02_RandomizerHoldsItem(EnWood02* treeActor, PlayState* play) {
|
||||
// Don't pull randomized item if tree isn't randomized or is already checked
|
||||
return IS_RANDO && Rando::Context::GetInstance()->GetOption(RSK_SHUFFLE_TREES).Get() &&
|
||||
!Flags_GetRandomizerInf(treeActor->treeId.randomizerInf) &&
|
||||
treeActor->treeId.randomizerCheck != RC_UNKNOWN_CHECK;
|
||||
}
|
||||
|
||||
extern "C" void EnWood02_RandomizerDraw(Actor* thisx, PlayState* play) {
|
||||
EnWood02* thisy = (EnWood02*)thisx;
|
||||
s16 type = thisy->actor.params;
|
||||
u8 red;
|
||||
u8 green;
|
||||
u8 blue;
|
||||
|
||||
if ((type == WOOD_TREE_OVAL_GREEN_SPAWNER) || (type == WOOD_TREE_OVAL_GREEN_SPAWNED) ||
|
||||
(type == WOOD_TREE_OVAL_GREEN) || (type == WOOD_LEAF_GREEN)) {
|
||||
red = 50;
|
||||
green = 170;
|
||||
blue = 70;
|
||||
} else if ((type == WOOD_TREE_OVAL_YELLOW_SPAWNER) || (type == WOOD_TREE_OVAL_YELLOW_SPAWNED) ||
|
||||
(type == WOOD_LEAF_YELLOW)) {
|
||||
red = 180;
|
||||
green = 155;
|
||||
blue = 0;
|
||||
} else {
|
||||
red = green = blue = 255;
|
||||
}
|
||||
|
||||
OPEN_DISPS(play->state.gfxCtx);
|
||||
Gfx_SetupDL_25Xlu(play->state.gfxCtx);
|
||||
if ((thisy->actor.params == WOOD_LEAF_GREEN) || (thisy->actor.params == WOOD_LEAF_YELLOW)) {
|
||||
Gfx_SetupDL_25Opa(play->state.gfxCtx);
|
||||
gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, red, green, blue, 127);
|
||||
Gfx_DrawDListOpa(play, (Gfx*)gRandoTreeDL);
|
||||
} else if (D_80B3BF70[thisy->drawType & 0xF] != NULL) {
|
||||
gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, red, green, blue, 0);
|
||||
Gfx_DrawDListOpa(play, (Gfx*)gRandoTreeDL);
|
||||
gDPSetEnvColor(POLY_XLU_DISP++, red, green, blue, 0);
|
||||
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx, (char*)__FILE__, __LINE__),
|
||||
G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
|
||||
gSPDisplayList(POLY_XLU_DISP++, D_80B3BF70[thisy->drawType & 0xF]);
|
||||
}
|
||||
CLOSE_DISPS(play->state.gfxCtx);
|
||||
|
||||
if (!EnWood02_RandomizerHoldsItem(thisy, gPlayState)) {
|
||||
thisy->actor.draw = (ActorFunc)EnWood02_Draw;
|
||||
}
|
||||
}
|
||||
|
||||
void EnWood02_RandomizerSpawnCollectible(EnWood02* treeActor, PlayState* play) {
|
||||
EnItem00* item00 = (EnItem00*)Item_DropCollectible2(play, &treeActor->actor.world.pos, ITEM00_SOH_DUMMY);
|
||||
item00->randoInf = treeActor->treeId.randomizerInf;
|
||||
item00->itemEntry =
|
||||
Rando::Context::GetInstance()->GetFinalGIEntry(treeActor->treeId.randomizerCheck, true, GI_NONE);
|
||||
item00->actor.draw = (ActorFunc)EnItem00_DrawRandomizedItem;
|
||||
item00->actor.velocity.y = 0.0f;
|
||||
item00->actor.world.pos.y += 120.0f;
|
||||
item00->actor.speedXZ = 2.0f;
|
||||
item00->actor.world.rot.y = Rand_CenteredFloat(65536.0f);
|
||||
// clear randomizerCheck to prevent multiple bonks,
|
||||
// reloading area without collecting drop won't persist this
|
||||
treeActor->treeId.randomizerCheck = RC_UNKNOWN_CHECK;
|
||||
}
|
||||
|
||||
void EnWood02_RandomizerInit(void* actorRef) {
|
||||
EnWood02* treeActor = static_cast<EnWood02*>(actorRef);
|
||||
if (treeActor->actor.params <= WOOD_TREE_KAKARIKO_ADULT) {
|
||||
treeActor->treeId = OTRGlobals::Instance->gRandomizer->IdentifyTree(
|
||||
gPlayState->sceneNum, (s16)treeActor->actor.world.pos.x, (s16)treeActor->actor.world.pos.z);
|
||||
if (treeActor->treeId.randomizerCheck == RC_UNKNOWN_CHECK) {
|
||||
LUSLOG_WARN("TREE %d,%d", (int)treeActor->actor.world.pos.x, (int)treeActor->actor.world.pos.z);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void RegisterShuffleTrees() {
|
||||
bool shouldRegister = IS_RANDO && Rando::Context::GetInstance()->GetOption(RSK_SHUFFLE_TREES).Get();
|
||||
|
||||
COND_ID_HOOK(OnActorInit, ACTOR_EN_WOOD02, shouldRegister, EnWood02_RandomizerInit);
|
||||
|
||||
COND_VB_SHOULD(VB_TREE_SETUP_DRAW, shouldRegister, {
|
||||
EnWood02* treeActor = va_arg(args, EnWood02*);
|
||||
if (EnWood02_RandomizerHoldsItem(treeActor, gPlayState)) {
|
||||
treeActor->actor.draw = (ActorFunc)EnWood02_RandomizerDraw;
|
||||
*should = false;
|
||||
}
|
||||
});
|
||||
|
||||
COND_VB_SHOULD(VB_TREE_DROP_ITEM, shouldRegister, {
|
||||
EnWood02* treeActor = va_arg(args, EnWood02*);
|
||||
if (EnWood02_RandomizerHoldsItem(treeActor, gPlayState)) {
|
||||
EnWood02_RandomizerSpawnCollectible(treeActor, gPlayState);
|
||||
*should = false;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
static RegisterShipInitFunc initFunc(RegisterShuffleTrees, { "IS_RANDO" });
|
||||
|
||||
void Rando::StaticData::RegisterTreeLocations() {
|
||||
// clang-format off
|
||||
// Trees
|
||||
// Randomizer Check Randomizer Check Quest Area Scene ID Params Short Name Hint Text Key Vanilla Spoiler Collection Check
|
||||
locationTable[RC_MARKET_DAY_TREE] = Location::Tree(RC_MARKET_DAY_TREE, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_DAY, TWO_ACTOR_PARAMS(-100, 240), "Tree in Hyrule Market (Day)", RHT_TREE_MARKET, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MARKET_DAY_TREE));
|
||||
locationTable[RC_HC_NEAR_GUARDS_TREE_1] = Location::Tree(RC_HC_NEAR_GUARDS_TREE_1, RCQUEST_BOTH, RCAREA_HYRULE_CASTLE, SCENE_HYRULE_CASTLE, TWO_ACTOR_PARAMS(1209, 2242), "Tree Near Guards 1", RHT_TREE_HYRULE_CASTLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HC_NEAR_GUARDS_TREE_1));
|
||||
locationTable[RC_HC_NEAR_GUARDS_TREE_2] = Location::Tree(RC_HC_NEAR_GUARDS_TREE_2, RCQUEST_BOTH, RCAREA_HYRULE_CASTLE, SCENE_HYRULE_CASTLE, TWO_ACTOR_PARAMS(943, 2051), "Tree Near Guards 2", RHT_TREE_HYRULE_CASTLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HC_NEAR_GUARDS_TREE_2));
|
||||
locationTable[RC_HC_NEAR_GUARDS_TREE_3] = Location::Tree(RC_HC_NEAR_GUARDS_TREE_3, RCQUEST_BOTH, RCAREA_HYRULE_CASTLE, SCENE_HYRULE_CASTLE, TWO_ACTOR_PARAMS(827, 1428), "Tree Near Guards 3", RHT_TREE_HYRULE_CASTLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HC_NEAR_GUARDS_TREE_3));
|
||||
locationTable[RC_HC_NEAR_GUARDS_TREE_4] = Location::Tree(RC_HC_NEAR_GUARDS_TREE_4, RCQUEST_BOTH, RCAREA_HYRULE_CASTLE, SCENE_HYRULE_CASTLE, TWO_ACTOR_PARAMS(421, 1397), "Tree Near Guards 4", RHT_TREE_HYRULE_CASTLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HC_NEAR_GUARDS_TREE_4));
|
||||
locationTable[RC_HC_NEAR_GUARDS_TREE_5] = Location::Tree(RC_HC_NEAR_GUARDS_TREE_5, RCQUEST_BOTH, RCAREA_HYRULE_CASTLE, SCENE_HYRULE_CASTLE, TWO_ACTOR_PARAMS(-73, 1459), "Tree Near Guards 5", RHT_TREE_HYRULE_CASTLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HC_NEAR_GUARDS_TREE_5));
|
||||
locationTable[RC_HC_NEAR_GUARDS_TREE_6] = Location::Tree(RC_HC_NEAR_GUARDS_TREE_6, RCQUEST_BOTH, RCAREA_HYRULE_CASTLE, SCENE_HYRULE_CASTLE, TWO_ACTOR_PARAMS(1494, 2108), "Tree Near Guards 6", RHT_TREE_HYRULE_CASTLE, RG_DEKU_NUTS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HC_NEAR_GUARDS_TREE_6));
|
||||
locationTable[RC_HC_SKULLTULA_TREE] = Location::Tree(RC_HC_SKULLTULA_TREE, RCQUEST_BOTH, RCAREA_HYRULE_CASTLE, SCENE_HYRULE_CASTLE, TWO_ACTOR_PARAMS(-145, 2961), "HC GS Tree", RHT_TREE_HYRULE_CASTLE, RG_DEKU_NUTS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HC_SKULLTULA_TREE));
|
||||
locationTable[RC_HC_GROTTO_TREE] = Location::Tree(RC_HC_GROTTO_TREE, RCQUEST_BOTH, RCAREA_HYRULE_CASTLE, SCENE_HYRULE_CASTLE, TWO_ACTOR_PARAMS(924, 872), "Tree Near Storms Grotto", RHT_TREE_HYRULE_CASTLE, RG_DEKU_NUTS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HC_GROTTO_TREE));
|
||||
locationTable[RC_HF_NEAR_KAK_TREE] = Location::Tree(RC_HF_NEAR_KAK_TREE, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(3276, 971), "Tree Outside Kakariko", RHT_TREE_HYRULE_FIELD, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_KAK_TREE));
|
||||
locationTable[RC_HF_NEAR_KAK_SMALL_TREE] = Location::Tree(RC_HF_NEAR_KAK_SMALL_TREE, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(2076, -91), "Small Tree Outside Kakariko", RHT_TREE_HYRULE_FIELD, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_KAK_SMALL_TREE));
|
||||
locationTable[RC_HF_TREE_NEAR_HC_GROTTO_1] = Location::Tree(RC_HF_TREE_NEAR_HC_GROTTO_1, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-1041, 1022), "Tree Near HC Entrance Grotto 1", RHT_TREE_HYRULE_FIELD, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_TREE_NEAR_HC_GROTTO_1));
|
||||
locationTable[RC_HF_TREE_NEAR_HC_GROTTO_2] = Location::Tree(RC_HF_TREE_NEAR_HC_GROTTO_2, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-1244, 819), "Tree Near HC Entrance Grotto 2", RHT_TREE_HYRULE_FIELD, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_TREE_NEAR_HC_GROTTO_2));
|
||||
locationTable[RC_HF_TREE_NEAR_HC_GROTTO_3] = Location::Tree(RC_HF_TREE_NEAR_HC_GROTTO_3, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-1448, 620), "Tree Near HC Entrance Grotto 3", RHT_TREE_HYRULE_FIELD, RG_DEKU_NUTS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_TREE_NEAR_HC_GROTTO_3));
|
||||
locationTable[RC_HF_NEAR_LLR_TREE] = Location::Tree(RC_HF_NEAR_LLR_TREE, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-1907, 5409), "Tree Outside Lon Lon Ranch", RHT_TREE_HYRULE_FIELD, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_LLR_TREE));
|
||||
locationTable[RC_HF_NEAR_LH_TREE] = Location::Tree(RC_HF_NEAR_LH_TREE, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-4377, 13662), "Tree Outside Lake Hylia", RHT_TREE_HYRULE_FIELD, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_LH_TREE));
|
||||
locationTable[RC_HF_CHILD_NEAR_GV_TREE] = Location::Tree(RC_HF_CHILD_NEAR_GV_TREE, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-6270, 8579), "Child Near Gerudo Valley Tree", RHT_TREE_HYRULE_FIELD, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_CHILD_NEAR_GV_TREE));
|
||||
locationTable[RC_HF_ADULT_NEAR_GV_TREE] = Location::Tree(RC_HF_ADULT_NEAR_GV_TREE, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-6241, 7097), "Adult Near Gerudo Valley Tree", RHT_TREE_HYRULE_FIELD, RG_DEKU_NUTS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_ADULT_NEAR_GV_TREE));
|
||||
locationTable[RC_HF_NEAR_ZR_TREE] = Location::Tree(RC_HF_NEAR_ZR_TREE, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(3117, 4239), "Tree Outside Zora's River", RHT_TREE_HYRULE_FIELD, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_ZR_TREE));
|
||||
locationTable[RC_HF_NORTHWEST_TREE_1] = Location::Tree(RC_HF_NORTHWEST_TREE_1, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-4777, 136), "Tree in Northwest 1", RHT_TREE_HYRULE_FIELD, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NORTHWEST_TREE_1));
|
||||
locationTable[RC_HF_NORTHWEST_TREE_2] = Location::Tree(RC_HF_NORTHWEST_TREE_2, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-4188, 263), "Tree in Northwest 2", RHT_TREE_HYRULE_FIELD, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NORTHWEST_TREE_2));
|
||||
locationTable[RC_HF_NORTHWEST_TREE_3] = Location::Tree(RC_HF_NORTHWEST_TREE_3, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-5000, -147), "Tree in Northwest 3", RHT_TREE_HYRULE_FIELD, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NORTHWEST_TREE_3));
|
||||
locationTable[RC_HF_NORTHWEST_TREE_4] = Location::Tree(RC_HF_NORTHWEST_TREE_4, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-4463, -182), "Tree in Northwest 4", RHT_TREE_HYRULE_FIELD, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NORTHWEST_TREE_4));
|
||||
locationTable[RC_HF_NORTHWEST_TREE_5] = Location::Tree(RC_HF_NORTHWEST_TREE_5, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-5262, 398), "Tree in Northwest 5", RHT_TREE_HYRULE_FIELD, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NORTHWEST_TREE_5));
|
||||
locationTable[RC_HF_NORTHWEST_TREE_6] = Location::Tree(RC_HF_NORTHWEST_TREE_6, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-4391, 891), "Tree in Northwest 6", RHT_TREE_HYRULE_FIELD, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NORTHWEST_TREE_6));
|
||||
locationTable[RC_HF_EAST_TREE_1] = Location::Tree(RC_HF_EAST_TREE_1, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(3817, 7119), "Tree in East 1", RHT_TREE_HYRULE_FIELD, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_EAST_TREE_1));
|
||||
locationTable[RC_HF_EAST_TREE_2] = Location::Tree(RC_HF_EAST_TREE_2, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(4365, 7182), "Tree in East 2", RHT_TREE_HYRULE_FIELD, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_EAST_TREE_2));
|
||||
locationTable[RC_HF_EAST_TREE_3] = Location::Tree(RC_HF_EAST_TREE_3, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(3837, 7479), "Tree in East 3", RHT_TREE_HYRULE_FIELD, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_EAST_TREE_3));
|
||||
locationTable[RC_HF_EAST_TREE_4] = Location::Tree(RC_HF_EAST_TREE_4, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(3377, 7201), "Tree in East 4", RHT_TREE_HYRULE_FIELD, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_EAST_TREE_4));
|
||||
locationTable[RC_HF_EAST_TREE_5] = Location::Tree(RC_HF_EAST_TREE_5, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(3408, 6676), "Tree in East 5", RHT_TREE_HYRULE_FIELD, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_EAST_TREE_5));
|
||||
locationTable[RC_HF_EAST_TREE_6] = Location::Tree(RC_HF_EAST_TREE_6, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(3935, 6279), "Tree in East 6", RHT_TREE_HYRULE_FIELD, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_EAST_TREE_6));
|
||||
locationTable[RC_HF_SOUTHEAST_TREE_1] = Location::Tree(RC_HF_SOUTHEAST_TREE_1, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(915, 12557), "Tree in Southeast 1", RHT_TREE_HYRULE_FIELD, RG_DEKU_NUTS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_SOUTHEAST_TREE_1));
|
||||
locationTable[RC_HF_SOUTHEAST_TREE_2] = Location::Tree(RC_HF_SOUTHEAST_TREE_2, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(350, 11605), "Tree in Southeast 2", RHT_TREE_HYRULE_FIELD, RG_DEKU_NUTS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_SOUTHEAST_TREE_2));
|
||||
locationTable[RC_HF_SOUTHEAST_TREE_3] = Location::Tree(RC_HF_SOUTHEAST_TREE_3, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(470, 12494), "Tree in Southeast 3", RHT_TREE_HYRULE_FIELD, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_SOUTHEAST_TREE_3));
|
||||
locationTable[RC_HF_SOUTHEAST_TREE_4] = Location::Tree(RC_HF_SOUTHEAST_TREE_4, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(614, 12357), "Tree in Southeast 4", RHT_TREE_HYRULE_FIELD, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_SOUTHEAST_TREE_4));
|
||||
locationTable[RC_HF_SOUTHEAST_TREE_5] = Location::Tree(RC_HF_SOUTHEAST_TREE_5, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(1114, 12156), "Tree in Southeast 5", RHT_TREE_HYRULE_FIELD, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_SOUTHEAST_TREE_5));
|
||||
locationTable[RC_HF_SOUTHEAST_TREE_6] = Location::Tree(RC_HF_SOUTHEAST_TREE_6, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(549, 11204), "Tree in Southeast 6", RHT_TREE_HYRULE_FIELD, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_SOUTHEAST_TREE_6));
|
||||
locationTable[RC_HF_SOUTHEAST_TREE_7] = Location::Tree(RC_HF_SOUTHEAST_TREE_7, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(49, 11405), "Tree in Southeast 7", RHT_TREE_HYRULE_FIELD, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_SOUTHEAST_TREE_7));
|
||||
locationTable[RC_HF_SOUTHEAST_TREE_8] = Location::Tree(RC_HF_SOUTHEAST_TREE_8, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-29, 12005), "Tree in Southeast 8", RHT_TREE_HYRULE_FIELD, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_SOUTHEAST_TREE_8));
|
||||
locationTable[RC_HF_SOUTHEAST_TREE_9] = Location::Tree(RC_HF_SOUTHEAST_TREE_9, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(1514,13157), "Tree in Southeast 9", RHT_TREE_HYRULE_FIELD, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_SOUTHEAST_TREE_9));
|
||||
locationTable[RC_HF_SOUTHEAST_TREE_10] = Location::Tree(RC_HF_SOUTHEAST_TREE_10, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-509,12954), "Tree in Southeast 10", RHT_TREE_HYRULE_FIELD, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_SOUTHEAST_TREE_10));
|
||||
locationTable[RC_HF_SOUTHEAST_TREE_11] = Location::Tree(RC_HF_SOUTHEAST_TREE_11, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-430,12354), "Tree in Southeast 11", RHT_TREE_HYRULE_FIELD, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_SOUTHEAST_TREE_11));
|
||||
locationTable[RC_HF_SOUTHEAST_TREE_12] = Location::Tree(RC_HF_SOUTHEAST_TREE_12, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(69,12153), "Tree in Southeast 12", RHT_TREE_HYRULE_FIELD, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_SOUTHEAST_TREE_12));
|
||||
locationTable[RC_HF_SOUTHEAST_TREE_13] = Location::Tree(RC_HF_SOUTHEAST_TREE_13, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-129,12554), "Tree in Southeast 13", RHT_TREE_HYRULE_FIELD, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_SOUTHEAST_TREE_13));
|
||||
locationTable[RC_HF_SOUTHEAST_TREE_14] = Location::Tree(RC_HF_SOUTHEAST_TREE_14, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(950,11545), "Tree in Southeast 14", RHT_TREE_HYRULE_FIELD, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_SOUTHEAST_TREE_14));
|
||||
locationTable[RC_HF_SOUTHEAST_TREE_15] = Location::Tree(RC_HF_SOUTHEAST_TREE_15, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(949,12205), "Tree in Southeast 15", RHT_TREE_HYRULE_FIELD, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_SOUTHEAST_TREE_15));
|
||||
locationTable[RC_HF_SOUTHEAST_TREE_16] = Location::Tree(RC_HF_SOUTHEAST_TREE_16, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(469,13154), "Tree in Southeast 16", RHT_TREE_HYRULE_FIELD, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_SOUTHEAST_TREE_16));
|
||||
locationTable[RC_HF_SOUTHEAST_TREE_17] = Location::Tree(RC_HF_SOUTHEAST_TREE_17, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(535,12957), "Tree in Southeast 17", RHT_TREE_HYRULE_FIELD, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_SOUTHEAST_TREE_17));
|
||||
locationTable[RC_HF_SOUTHEAST_TREE_18] = Location::Tree(RC_HF_SOUTHEAST_TREE_18, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(1515,12497), "Tree in Southeast 18", RHT_TREE_HYRULE_FIELD, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_SOUTHEAST_TREE_18));
|
||||
locationTable[RC_HF_SOUTHEAST_TREE_19] = Location::Tree(RC_HF_SOUTHEAST_TREE_19, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-786,11293), "Tree in Southeast 19", RHT_TREE_HYRULE_FIELD, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_SOUTHEAST_TREE_19));
|
||||
locationTable[RC_HF_CHILD_SOUTHEAST_TREE_1] = Location::Tree(RC_HF_CHILD_SOUTHEAST_TREE_1, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(1535, 11943), "Child Tree in Southeast Corner 1", RHT_TREE_HYRULE_FIELD, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_CHILD_SOUTHEAST_TREE_1));
|
||||
locationTable[RC_HF_CHILD_SOUTHEAST_TREE_2] = Location::Tree(RC_HF_CHILD_SOUTHEAST_TREE_2, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(2135,11883), "Child Tree in Southeast Corner 2", RHT_TREE_HYRULE_FIELD, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_CHILD_SOUTHEAST_TREE_2));
|
||||
locationTable[RC_HF_CHILD_SOUTHEAST_TREE_3] = Location::Tree(RC_HF_CHILD_SOUTHEAST_TREE_3, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(2134,12543), "Child Tree in Southeast Corner 3", RHT_TREE_HYRULE_FIELD, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_CHILD_SOUTHEAST_TREE_3));
|
||||
locationTable[RC_HF_CHILD_SOUTHEAST_TREE_4] = Location::Tree(RC_HF_CHILD_SOUTHEAST_TREE_4, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(1734,11542), "Child Tree in Southeast Corner 4", RHT_TREE_HYRULE_FIELD, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_CHILD_SOUTHEAST_TREE_4));
|
||||
locationTable[RC_HF_CHILD_SOUTHEAST_TREE_5] = Location::Tree(RC_HF_CHILD_SOUTHEAST_TREE_5, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(1234,11743), "Child Tree in Southeast Corner 5", RHT_TREE_HYRULE_FIELD, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_CHILD_SOUTHEAST_TREE_5));
|
||||
locationTable[RC_HF_CHILD_SOUTHEAST_TREE_6] = Location::Tree(RC_HF_CHILD_SOUTHEAST_TREE_6, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(1155,12343), "Child Tree in Southeast Corner 6", RHT_TREE_HYRULE_FIELD, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_CHILD_SOUTHEAST_TREE_6));
|
||||
locationTable[RC_HF_TEKTITE_GROTTO_TREE] = Location::Tree(RC_HF_TEKTITE_GROTTO_TREE, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-4976, 2812), "Tektite Grotto Tree", RHT_TREE_HYRULE_FIELD, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_TEKTITE_GROTTO_TREE));
|
||||
locationTable[RC_ZF_TREE] = Location::Tree(RC_ZF_TREE, RCQUEST_BOTH, RCAREA_ZORAS_FOUNTAIN, SCENE_ZORAS_FOUNTAIN, TWO_ACTOR_PARAMS(186, 2222), "Tree in Zora's Fountain", RHT_TREE_ZORAS_FOUNTAIN, RG_DEKU_NUTS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_TREE));
|
||||
locationTable[RC_ZR_TREE] = Location::Tree(RC_ZR_TREE, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, TWO_ACTOR_PARAMS(-1690, 554), "Tree in Zoras River", RHT_TREE_ZORAS_RIVER, RG_DEKU_NUTS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_TREE));
|
||||
locationTable[RC_KAK_TREE] = Location::Tree(RC_KAK_TREE, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(-860, 522), "Kakariko GS Tree", RHT_TREE_KAKARIKO, RG_DEKU_NUTS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_TREE));
|
||||
locationTable[RC_LLR_TREE] = Location::Tree(RC_LLR_TREE, RCQUEST_BOTH, RCAREA_LON_LON_RANCH, SCENE_LON_LON_RANCH, TWO_ACTOR_PARAMS(1309, -2241), "Lon Lon Ranch GS Tree", RHT_TREE_LON_LON_RANCH, RG_DEKU_NUTS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LLR_TREE));
|
||||
// clang-format on
|
||||
}
|
||||
|
||||
static RegisterShipInitFunc registerFunc(Rando::StaticData::RegisterTreeLocations);
|
|
@ -192,6 +192,7 @@ void Context::GenerateLocationPool() {
|
|||
!mOptions[RSK_LOGIC_RULES].Is(RO_LOGIC_NO_LOGIC))) ||
|
||||
(location.GetRCType() == RCTYPE_SMALL_CRATE && mOptions[RSK_SHUFFLE_CRATES].Is(RO_SHUFFLE_CRATES_OFF)) ||
|
||||
(location.GetRCType() == RCTYPE_FAIRY && !mOptions[RSK_SHUFFLE_FAIRIES]) ||
|
||||
(location.GetRCType() == RCTYPE_TREE && !mOptions[RSK_SHUFFLE_TREES]) ||
|
||||
(location.GetRCType() == RCTYPE_FREESTANDING &&
|
||||
mOptions[RSK_SHUFFLE_FREESTANDING].Is(RO_SHUFFLE_FREESTANDING_OFF)) ||
|
||||
(location.GetRCType() == RCTYPE_BEEHIVE && !mOptions[RSK_SHUFFLE_BEEHIVES])) {
|
||||
|
|
|
@ -566,6 +566,15 @@ Rando::Location Rando::Location::SmallCrate(RandomizerCheck rc, RandomizerCheckQ
|
|||
false, collectionCheck };
|
||||
}
|
||||
|
||||
Rando::Location Rando::Location::Tree(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckArea area_,
|
||||
SceneID scene_, int32_t actorParams_, std::string&& shortName_,
|
||||
RandomizerHintTextKey hintKey, RandomizerGet vanillaItem,
|
||||
SpoilerCollectionCheck collectionCheck) {
|
||||
return { rc, quest_, RCTYPE_TREE, area_, ACTOR_EN_WOOD02,
|
||||
scene_, actorParams_, std::move(shortName_), hintKey, vanillaItem,
|
||||
false, collectionCheck };
|
||||
}
|
||||
|
||||
Rando::Location Rando::Location::HintStone(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckArea area_,
|
||||
SceneID scene_, int32_t actorParams_, std::string&& shortName_) {
|
||||
return { rc, quest_, RCTYPE_GOSSIP_STONE, area_, ACTOR_EN_GS,
|
||||
|
|
|
@ -246,6 +246,10 @@ class Location {
|
|||
RandomizerHintTextKey hintKey, RandomizerGet vanillaItem,
|
||||
SpoilerCollectionCheck collectionCheck);
|
||||
|
||||
static Location Tree(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckArea area_, SceneID scene_,
|
||||
int32_t actorParams_, std::string&& shortName_, RandomizerHintTextKey hintKey,
|
||||
RandomizerGet vanillaItem, SpoilerCollectionCheck collectionCheck);
|
||||
|
||||
static Location OtherHint(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckArea area_,
|
||||
ActorID actorId_, SceneID scene_, std::string&& shortName_, std::string&& spoilerName_);
|
||||
|
||||
|
|
|
@ -24,7 +24,7 @@ void RegionTable_Init_CastleGrounds() {
|
|||
}, {
|
||||
//Locations
|
||||
LOCATION(RC_HC_MALON_EGG, true),
|
||||
LOCATION(RC_HC_GS_TREE, logic->IsChild && logic->CanKillEnemy(RE_GOLD_SKULLTULA, ED_CLOSE)),
|
||||
LOCATION(RC_HC_GS_TREE, logic->CanKillEnemy(RE_GOLD_SKULLTULA, ED_CLOSE) && logic->CanBonkTrees()),
|
||||
LOCATION(RC_HC_MALON_GOSSIP_STONE_FAIRY, logic->CallGossipFairy()),
|
||||
LOCATION(RC_HC_MALON_GOSSIP_STONE_FAIRY_BIG, logic->CanUse(RG_SONG_OF_STORMS)),
|
||||
LOCATION(RC_HC_ROCK_WALL_GOSSIP_STONE_FAIRY, logic->CallGossipFairy()),
|
||||
|
@ -33,6 +33,14 @@ void RegionTable_Init_CastleGrounds() {
|
|||
LOCATION(RC_HC_ROCK_WALL_GOSSIP_STONE, true),
|
||||
LOCATION(RC_HC_GRASS_1, logic->CanCutShrubs()),
|
||||
LOCATION(RC_HC_GRASS_2, logic->CanCutShrubs()),
|
||||
LOCATION(RC_HC_GROTTO_TREE, logic->CanBonkTrees()),
|
||||
LOCATION(RC_HC_SKULLTULA_TREE, logic->CanBonkTrees()),
|
||||
LOCATION(RC_HC_NEAR_GUARDS_TREE_1, logic->CanBonkTrees()),
|
||||
LOCATION(RC_HC_NEAR_GUARDS_TREE_2, logic->CanBonkTrees()),
|
||||
LOCATION(RC_HC_NEAR_GUARDS_TREE_3, logic->CanBonkTrees()),
|
||||
LOCATION(RC_HC_NEAR_GUARDS_TREE_4, logic->CanBonkTrees()),
|
||||
LOCATION(RC_HC_NEAR_GUARDS_TREE_5, logic->CanBonkTrees()),
|
||||
LOCATION(RC_HC_NEAR_GUARDS_TREE_6, logic->CanBonkTrees()),
|
||||
}, {
|
||||
//Exits
|
||||
Entrance(RR_CASTLE_GROUNDS, []{return true;}),
|
||||
|
|
|
@ -61,6 +61,54 @@ void RegionTable_Init_HyruleField() {
|
|||
LOCATION(RC_HF_NEAR_KF_GRASS_10, logic->CanCutShrubs()),
|
||||
LOCATION(RC_HF_NEAR_KF_GRASS_11, logic->CanCutShrubs()),
|
||||
LOCATION(RC_HF_NEAR_KF_GRASS_12, logic->CanCutShrubs()),
|
||||
LOCATION(RC_HF_NEAR_LLR_TREE, logic->CanBonkTrees()),
|
||||
LOCATION(RC_HF_NEAR_LH_TREE, logic->CanBonkTrees()),
|
||||
LOCATION(RC_HF_CHILD_NEAR_GV_TREE, logic->IsChild && logic->CanBonkTrees()),
|
||||
LOCATION(RC_HF_ADULT_NEAR_GV_TREE, logic->IsAdult && logic->CanBonkTrees()),
|
||||
LOCATION(RC_HF_NEAR_ZR_TREE, logic->CanBonkTrees()),
|
||||
LOCATION(RC_HF_NEAR_KAK_TREE, logic->CanBonkTrees()),
|
||||
LOCATION(RC_HF_NEAR_KAK_SMALL_TREE, logic->CanBonkTrees()),
|
||||
LOCATION(RC_HF_TREE_NEAR_HC_GROTTO_1, logic->CanBonkTrees()),
|
||||
LOCATION(RC_HF_TREE_NEAR_HC_GROTTO_2, logic->CanBonkTrees()),
|
||||
LOCATION(RC_HF_TREE_NEAR_HC_GROTTO_3, logic->CanBonkTrees()),
|
||||
LOCATION(RC_HF_NORTHWEST_TREE_1, logic->CanBonkTrees()),
|
||||
LOCATION(RC_HF_NORTHWEST_TREE_2, logic->CanBonkTrees()),
|
||||
LOCATION(RC_HF_NORTHWEST_TREE_3, logic->CanBonkTrees()),
|
||||
LOCATION(RC_HF_NORTHWEST_TREE_4, logic->CanBonkTrees()),
|
||||
LOCATION(RC_HF_NORTHWEST_TREE_5, logic->CanBonkTrees()),
|
||||
LOCATION(RC_HF_NORTHWEST_TREE_6, logic->CanBonkTrees()),
|
||||
LOCATION(RC_HF_EAST_TREE_1, logic->CanBonkTrees()),
|
||||
LOCATION(RC_HF_EAST_TREE_2, logic->CanBonkTrees()),
|
||||
LOCATION(RC_HF_EAST_TREE_3, logic->CanBonkTrees()),
|
||||
LOCATION(RC_HF_EAST_TREE_4, logic->CanBonkTrees()),
|
||||
LOCATION(RC_HF_EAST_TREE_5, logic->CanBonkTrees()),
|
||||
LOCATION(RC_HF_EAST_TREE_6, logic->CanBonkTrees()),
|
||||
LOCATION(RC_HF_SOUTHEAST_TREE_1, logic->CanBonkTrees()),
|
||||
LOCATION(RC_HF_SOUTHEAST_TREE_2, logic->CanBonkTrees()),
|
||||
LOCATION(RC_HF_SOUTHEAST_TREE_3, logic->CanBonkTrees()),
|
||||
LOCATION(RC_HF_SOUTHEAST_TREE_4, logic->CanBonkTrees()),
|
||||
LOCATION(RC_HF_SOUTHEAST_TREE_5, logic->CanBonkTrees()),
|
||||
LOCATION(RC_HF_SOUTHEAST_TREE_6, logic->CanBonkTrees()),
|
||||
LOCATION(RC_HF_SOUTHEAST_TREE_7, logic->CanBonkTrees()),
|
||||
LOCATION(RC_HF_SOUTHEAST_TREE_8, logic->CanBonkTrees()),
|
||||
LOCATION(RC_HF_SOUTHEAST_TREE_9, logic->CanBonkTrees()),
|
||||
LOCATION(RC_HF_SOUTHEAST_TREE_10, logic->CanBonkTrees()),
|
||||
LOCATION(RC_HF_SOUTHEAST_TREE_11, logic->CanBonkTrees()),
|
||||
LOCATION(RC_HF_SOUTHEAST_TREE_12, logic->CanBonkTrees()),
|
||||
LOCATION(RC_HF_SOUTHEAST_TREE_13, logic->CanBonkTrees()),
|
||||
LOCATION(RC_HF_SOUTHEAST_TREE_14, logic->CanBonkTrees()),
|
||||
LOCATION(RC_HF_SOUTHEAST_TREE_15, logic->CanBonkTrees()),
|
||||
LOCATION(RC_HF_SOUTHEAST_TREE_16, logic->CanBonkTrees()),
|
||||
LOCATION(RC_HF_SOUTHEAST_TREE_17, logic->CanBonkTrees()),
|
||||
LOCATION(RC_HF_SOUTHEAST_TREE_18, logic->CanBonkTrees()),
|
||||
LOCATION(RC_HF_SOUTHEAST_TREE_19, logic->CanBonkTrees()),
|
||||
LOCATION(RC_HF_CHILD_SOUTHEAST_TREE_1, logic->IsChild && logic->CanBonkTrees()),
|
||||
LOCATION(RC_HF_CHILD_SOUTHEAST_TREE_2, logic->IsChild && logic->CanBonkTrees()),
|
||||
LOCATION(RC_HF_CHILD_SOUTHEAST_TREE_3, logic->IsChild && logic->CanBonkTrees()),
|
||||
LOCATION(RC_HF_CHILD_SOUTHEAST_TREE_4, logic->IsChild && logic->CanBonkTrees()),
|
||||
LOCATION(RC_HF_CHILD_SOUTHEAST_TREE_5, logic->IsChild && logic->CanBonkTrees()),
|
||||
LOCATION(RC_HF_CHILD_SOUTHEAST_TREE_6, logic->IsChild && logic->CanBonkTrees()),
|
||||
LOCATION(RC_HF_TEKTITE_GROTTO_TREE, logic->CanBonkTrees()),
|
||||
}, {
|
||||
//Exits
|
||||
Entrance(RR_LW_BRIDGE, []{return true;}),
|
||||
|
|
|
@ -20,7 +20,7 @@ void RegionTable_Init_Kakariko() {
|
|||
LOCATION(RC_KAK_GS_HOUSE_UNDER_CONSTRUCTION, logic->IsChild && logic->CanGetNightTimeGS()),
|
||||
LOCATION(RC_KAK_GS_SKULLTULA_HOUSE, logic->IsChild && logic->CanGetNightTimeGS()),
|
||||
LOCATION(RC_KAK_GS_GUARDS_HOUSE, logic->IsChild && logic->CanGetNightTimeGS()),
|
||||
LOCATION(RC_KAK_GS_TREE, logic->IsChild && logic->CanGetNightTimeGS()),
|
||||
LOCATION(RC_KAK_GS_TREE, logic->IsChild && logic->CanGetNightTimeGS() && logic->CanBonkTrees()),
|
||||
LOCATION(RC_KAK_GS_WATCHTOWER, logic->IsChild && (logic->CanKillEnemy(RE_GOLD_SKULLTULA, ED_LONGSHOT) || (ctx->GetTrickOption(RT_KAK_TOWER_GS) && logic->CanJumpslashExceptHammer())) && logic->CanGetNightTimeGS()),
|
||||
LOCATION(RC_KAK_NEAR_POTION_SHOP_POT_1, logic->IsChild && logic->CanBreakPots()),
|
||||
LOCATION(RC_KAK_NEAR_POTION_SHOP_POT_2, logic->IsChild && logic->CanBreakPots()),
|
||||
|
@ -57,6 +57,7 @@ void RegionTable_Init_Kakariko() {
|
|||
LOCATION(RC_KAK_NEAR_FENCE_CHILD_CRATE, logic->IsChild && logic->CanBreakCrates()),
|
||||
LOCATION(RC_KAK_NEAR_BOARDING_HOUSE_CHILD_CRATE, logic->IsChild && logic->CanBreakCrates()),
|
||||
LOCATION(RC_KAK_NEAR_BAZAAR_CHILD_CRATE, logic->IsChild && logic->CanBreakCrates()),
|
||||
LOCATION(RC_KAK_TREE, logic->IsChild && logic->CanBonkTrees()),
|
||||
}, {
|
||||
//Exits
|
||||
Entrance(RR_HYRULE_FIELD, []{return true;}),
|
||||
|
|
|
@ -12,7 +12,7 @@ void RegionTable_Init_LonLonRanch() {
|
|||
}, {
|
||||
//Locations
|
||||
LOCATION(RC_SONG_FROM_MALON, logic->IsChild && logic->HasItem(RG_ZELDAS_LETTER) && logic->HasItem(RG_FAIRY_OCARINA) && logic->AtDay),
|
||||
LOCATION(RC_LLR_GS_TREE, logic->IsChild),
|
||||
LOCATION(RC_LLR_GS_TREE, logic->IsChild && logic->CanBonkTrees()),
|
||||
LOCATION(RC_LLR_GS_RAIN_SHED, logic->IsChild && logic->CanGetNightTimeGS()),
|
||||
LOCATION(RC_LLR_GS_HOUSE_WINDOW, logic->IsChild && logic->HookshotOrBoomerang() && logic->CanGetNightTimeGS()),
|
||||
LOCATION(RC_LLR_GS_BACK_WALL, logic->IsChild && logic->HookshotOrBoomerang() && logic->CanGetNightTimeGS()),
|
||||
|
@ -24,6 +24,7 @@ void RegionTable_Init_LonLonRanch() {
|
|||
LOCATION(RC_LLR_RAIN_SHED_POT_2, logic->IsChild && logic->CanBreakPots()),
|
||||
LOCATION(RC_LLR_RAIN_SHED_POT_3, logic->IsChild && logic->CanBreakPots()),
|
||||
LOCATION(RC_LLR_NEAR_TREE_CRATE, logic->IsChild && logic->CanBreakCrates()),
|
||||
LOCATION(RC_LLR_TREE, logic->IsChild && logic->CanBonkTrees()),
|
||||
}, {
|
||||
//Exits
|
||||
Entrance(RR_HYRULE_FIELD, []{return true;}),
|
||||
|
|
|
@ -27,6 +27,7 @@ void RegionTable_Init_Market() {
|
|||
LOCATION(RC_MK_NEAR_BAZAAR_CRATE_2, logic->IsChild /*&& logic->CanRoll()*/),
|
||||
LOCATION(RC_MK_SHOOTING_GALLERY_CRATE_1, logic->IsChild /*&& logic->CanRoll()*/),
|
||||
LOCATION(RC_MK_SHOOTING_GALLERY_CRATE_2, logic->IsChild /*&& logic->CanRoll()*/),
|
||||
LOCATION(RC_MARKET_DAY_TREE, logic->IsChild && logic->CanBonkTrees() && logic->AtDay),
|
||||
}, {
|
||||
//Exits
|
||||
Entrance(RR_MARKET_ENTRANCE, []{return true;}),
|
||||
|
|
|
@ -11,7 +11,7 @@ void RegionTable_Init_ZorasFountain() {
|
|||
EventAccess(&logic->ButterflyFairy, []{return logic->CanUse(RG_STICKS) && logic->AtDay;}),
|
||||
}, {
|
||||
//Locations
|
||||
LOCATION(RC_ZF_GS_TREE, logic->IsChild),
|
||||
LOCATION(RC_ZF_GS_TREE, logic->IsChild && logic->CanBonkTrees()),
|
||||
LOCATION(RC_ZF_GS_ABOVE_THE_LOG, logic->IsChild && logic->HookshotOrBoomerang() && logic->CanGetNightTimeGS()),
|
||||
LOCATION(RC_ZF_FAIRY_GOSSIP_STONE_FAIRY, logic->CallGossipFairyExceptSuns()),
|
||||
LOCATION(RC_ZF_FAIRY_GOSSIP_STONE_FAIRY_BIG, logic->CanUse(RG_SONG_OF_STORMS)),
|
||||
|
@ -23,6 +23,7 @@ void RegionTable_Init_ZorasFountain() {
|
|||
LOCATION(RC_ZF_NEAR_JABU_POT_2, logic->IsChild && logic->CanBreakPots()),
|
||||
LOCATION(RC_ZF_NEAR_JABU_POT_3, logic->IsChild && logic->CanBreakPots()),
|
||||
LOCATION(RC_ZF_NEAR_JABU_POT_4, logic->IsChild && logic->CanBreakPots()),
|
||||
LOCATION(RC_ZF_TREE, logic->IsChild && logic->CanBonkTrees()),
|
||||
}, {
|
||||
//Exits
|
||||
Entrance(RR_ZD_BEHIND_KING_ZORA, []{return true;}),
|
||||
|
|
|
@ -7,7 +7,7 @@ void RegionTable_Init_ZoraRiver() {
|
|||
// clang-format off
|
||||
areaTable[RR_ZR_FRONT] = Region("ZR Front", SCENE_ZORAS_RIVER, {}, {
|
||||
//Locations
|
||||
LOCATION(RC_ZR_GS_TREE, logic->IsChild && logic->CanKillEnemy(RE_GOLD_SKULLTULA, ED_CLOSE)),
|
||||
LOCATION(RC_ZR_GS_TREE, logic->IsChild && logic->CanKillEnemy(RE_GOLD_SKULLTULA, ED_CLOSE) && logic->CanBonkTrees()),
|
||||
LOCATION(RC_ZR_GRASS_1, logic->CanCutShrubs()),
|
||||
LOCATION(RC_ZR_GRASS_2, logic->CanCutShrubs()),
|
||||
LOCATION(RC_ZR_GRASS_3, logic->CanCutShrubs()),
|
||||
|
@ -20,6 +20,7 @@ void RegionTable_Init_ZoraRiver() {
|
|||
LOCATION(RC_ZR_GRASS_10, logic->CanCutShrubs()),
|
||||
LOCATION(RC_ZR_GRASS_11, logic->CanCutShrubs()),
|
||||
LOCATION(RC_ZR_GRASS_12, logic->CanCutShrubs()),
|
||||
LOCATION(RC_ZR_TREE, logic->IsChild && logic->CanBonkTrees()),
|
||||
}, {
|
||||
//Exits
|
||||
Entrance(RR_ZORAS_RIVER, []{return logic->IsAdult || logic->BlastOrSmash();}),
|
||||
|
|
|
@ -1152,6 +1152,10 @@ bool Logic::CanBreakSmallCrates() {
|
|||
return true;
|
||||
}
|
||||
|
||||
bool Logic::CanBonkTrees() {
|
||||
return true;
|
||||
}
|
||||
|
||||
bool Logic::HasExplosives() {
|
||||
return CanUse(RG_BOMB_BAG) || CanUse(RG_BOMBCHU_5);
|
||||
}
|
||||
|
|
|
@ -247,6 +247,7 @@ class Logic {
|
|||
bool CanBreakPots();
|
||||
bool CanBreakCrates();
|
||||
bool CanBreakSmallCrates();
|
||||
bool CanBonkTrees();
|
||||
bool HasFireSource();
|
||||
bool HasFireSourceWithTorch();
|
||||
bool TradeQuestStep(RandomizerGet rg);
|
||||
|
|
|
@ -288,6 +288,10 @@ void Settings::CreateOptionDescriptions() {
|
|||
"Overworld - Only shuffle crates that are outside of dungeons.\n"
|
||||
"\n"
|
||||
"All Crates - Shuffle all crates.";
|
||||
mOptionDescriptions[RSK_SHUFFLE_TREES] =
|
||||
"Trees will contain randomized items which are dropped the first time the player rolls into one.\n"
|
||||
"Trees will have a special appearance when carrying randomized items.\n"
|
||||
"\nSome trees are dependant on Link's age, such as some trees in Hyrule Field.";
|
||||
mOptionDescriptions[RSK_SHUFFLE_FISHING_POLE] = "Shuffles the fishing pole into the item pool.\n"
|
||||
"\n"
|
||||
"The fishing pole is required to play the fishing pond minigame.";
|
||||
|
|
|
@ -3258,6 +3258,67 @@ std::map<RandomizerCheck, RandomizerInf> rcToRandomizerInf = {
|
|||
RC_SPIRIT_TEMPLE_MQ_BEAMOS_SMALL_CRATE,
|
||||
RAND_INF_SPIRIT_TEMPLE_MQ_BEAMOS_SMALL_CRATE,
|
||||
},
|
||||
{ RC_MARKET_DAY_TREE, RAND_INF_MARKET_DAY_TREE },
|
||||
{ RC_HC_NEAR_GUARDS_TREE_1, RAND_INF_HC_NEAR_GUARDS_TREE_1 },
|
||||
{ RC_HC_NEAR_GUARDS_TREE_2, RAND_INF_HC_NEAR_GUARDS_TREE_2 },
|
||||
{ RC_HC_NEAR_GUARDS_TREE_3, RAND_INF_HC_NEAR_GUARDS_TREE_3 },
|
||||
{ RC_HC_NEAR_GUARDS_TREE_4, RAND_INF_HC_NEAR_GUARDS_TREE_4 },
|
||||
{ RC_HC_NEAR_GUARDS_TREE_5, RAND_INF_HC_NEAR_GUARDS_TREE_5 },
|
||||
{ RC_HC_NEAR_GUARDS_TREE_6, RAND_INF_HC_NEAR_GUARDS_TREE_6 },
|
||||
{ RC_HC_SKULLTULA_TREE, RAND_INF_HC_SKULLTULA_TREE },
|
||||
{ RC_HC_GROTTO_TREE, RAND_INF_HC_GROTTO_TREE },
|
||||
{ RC_HF_NEAR_KAK_TREE, RAND_INF_HF_NEAR_KAK_TREE },
|
||||
{ RC_HF_NEAR_KAK_SMALL_TREE, RAND_INF_HF_NEAR_KAK_SMALL_TREE },
|
||||
{ RC_HF_TREE_NEAR_HC_GROTTO_1, RAND_INF_HF_TREE_NEAR_HC_GROTTO_1 },
|
||||
{ RC_HF_TREE_NEAR_HC_GROTTO_2, RAND_INF_HF_TREE_NEAR_HC_GROTTO_2 },
|
||||
{ RC_HF_TREE_NEAR_HC_GROTTO_3, RAND_INF_HF_TREE_NEAR_HC_GROTTO_3 },
|
||||
{ RC_HF_NEAR_LLR_TREE, RAND_INF_HF_NEAR_LLR_TREE },
|
||||
{ RC_HF_NEAR_LH_TREE, RAND_INF_HF_NEAR_LH_TREE },
|
||||
{ RC_HF_CHILD_NEAR_GV_TREE, RAND_INF_HF_CHILD_NEAR_GV_TREE },
|
||||
{ RC_HF_ADULT_NEAR_GV_TREE, RAND_INF_HF_ADULT_NEAR_GV_TREE },
|
||||
{ RC_HF_NEAR_ZR_TREE, RAND_INF_HF_NEAR_ZR_TREE },
|
||||
{ RC_HF_NORTHWEST_TREE_1, RAND_INF_HF_NORTHWEST_TREE_1 },
|
||||
{ RC_HF_NORTHWEST_TREE_2, RAND_INF_HF_NORTHWEST_TREE_2 },
|
||||
{ RC_HF_NORTHWEST_TREE_3, RAND_INF_HF_NORTHWEST_TREE_3 },
|
||||
{ RC_HF_NORTHWEST_TREE_4, RAND_INF_HF_NORTHWEST_TREE_4 },
|
||||
{ RC_HF_NORTHWEST_TREE_5, RAND_INF_HF_NORTHWEST_TREE_5 },
|
||||
{ RC_HF_NORTHWEST_TREE_6, RAND_INF_HF_NORTHWEST_TREE_6 },
|
||||
{ RC_HF_EAST_TREE_1, RAND_INF_HF_EAST_TREE_1 },
|
||||
{ RC_HF_EAST_TREE_2, RAND_INF_HF_EAST_TREE_2 },
|
||||
{ RC_HF_EAST_TREE_3, RAND_INF_HF_EAST_TREE_3 },
|
||||
{ RC_HF_EAST_TREE_4, RAND_INF_HF_EAST_TREE_4 },
|
||||
{ RC_HF_EAST_TREE_5, RAND_INF_HF_EAST_TREE_5 },
|
||||
{ RC_HF_EAST_TREE_6, RAND_INF_HF_EAST_TREE_6 },
|
||||
{ RC_HF_SOUTHEAST_TREE_1, RAND_INF_HF_SOUTHEAST_TREE_1 },
|
||||
{ RC_HF_SOUTHEAST_TREE_2, RAND_INF_HF_SOUTHEAST_TREE_2 },
|
||||
{ RC_HF_SOUTHEAST_TREE_3, RAND_INF_HF_SOUTHEAST_TREE_3 },
|
||||
{ RC_HF_SOUTHEAST_TREE_4, RAND_INF_HF_SOUTHEAST_TREE_4 },
|
||||
{ RC_HF_SOUTHEAST_TREE_5, RAND_INF_HF_SOUTHEAST_TREE_5 },
|
||||
{ RC_HF_SOUTHEAST_TREE_6, RAND_INF_HF_SOUTHEAST_TREE_6 },
|
||||
{ RC_HF_SOUTHEAST_TREE_7, RAND_INF_HF_SOUTHEAST_TREE_7 },
|
||||
{ RC_HF_SOUTHEAST_TREE_8, RAND_INF_HF_SOUTHEAST_TREE_8 },
|
||||
{ RC_HF_SOUTHEAST_TREE_9, RAND_INF_HF_SOUTHEAST_TREE_9 },
|
||||
{ RC_HF_SOUTHEAST_TREE_10, RAND_INF_HF_SOUTHEAST_TREE_10 },
|
||||
{ RC_HF_SOUTHEAST_TREE_11, RAND_INF_HF_SOUTHEAST_TREE_11 },
|
||||
{ RC_HF_SOUTHEAST_TREE_12, RAND_INF_HF_SOUTHEAST_TREE_12 },
|
||||
{ RC_HF_SOUTHEAST_TREE_13, RAND_INF_HF_SOUTHEAST_TREE_13 },
|
||||
{ RC_HF_SOUTHEAST_TREE_14, RAND_INF_HF_SOUTHEAST_TREE_14 },
|
||||
{ RC_HF_SOUTHEAST_TREE_15, RAND_INF_HF_SOUTHEAST_TREE_15 },
|
||||
{ RC_HF_SOUTHEAST_TREE_16, RAND_INF_HF_SOUTHEAST_TREE_16 },
|
||||
{ RC_HF_SOUTHEAST_TREE_17, RAND_INF_HF_SOUTHEAST_TREE_17 },
|
||||
{ RC_HF_SOUTHEAST_TREE_18, RAND_INF_HF_SOUTHEAST_TREE_18 },
|
||||
{ RC_HF_SOUTHEAST_TREE_19, RAND_INF_HF_SOUTHEAST_TREE_19 },
|
||||
{ RC_HF_CHILD_SOUTHEAST_TREE_1, RAND_INF_HF_CHILD_SOUTHEAST_TREE_1 },
|
||||
{ RC_HF_CHILD_SOUTHEAST_TREE_2, RAND_INF_HF_CHILD_SOUTHEAST_TREE_2 },
|
||||
{ RC_HF_CHILD_SOUTHEAST_TREE_3, RAND_INF_HF_CHILD_SOUTHEAST_TREE_3 },
|
||||
{ RC_HF_CHILD_SOUTHEAST_TREE_4, RAND_INF_HF_CHILD_SOUTHEAST_TREE_4 },
|
||||
{ RC_HF_CHILD_SOUTHEAST_TREE_5, RAND_INF_HF_CHILD_SOUTHEAST_TREE_5 },
|
||||
{ RC_HF_CHILD_SOUTHEAST_TREE_6, RAND_INF_HF_CHILD_SOUTHEAST_TREE_6 },
|
||||
{ RC_HF_TEKTITE_GROTTO_TREE, RAND_INF_HF_TEKTITE_GROTTO_TREE },
|
||||
{ RC_ZF_TREE, RAND_INF_ZF_TREE },
|
||||
{ RC_ZR_TREE, RAND_INF_ZR_TREE },
|
||||
{ RC_KAK_TREE, RAND_INF_KAK_TREE },
|
||||
{ RC_LLR_TREE, RAND_INF_LLR_TREE },
|
||||
};
|
||||
|
||||
BeehiveIdentity Randomizer::IdentifyBeehive(s32 sceneNum, s16 xPosition, s32 respawnData) {
|
||||
|
@ -3679,6 +3740,26 @@ SmallCrateIdentity Randomizer::IdentifySmallCrate(s32 sceneNum, s32 posX, s32 po
|
|||
return smallCrateIdentity;
|
||||
}
|
||||
|
||||
TreeIdentity Randomizer::IdentifyTree(s32 sceneNum, s32 posX, s32 posZ) {
|
||||
struct TreeIdentity treeIdentity;
|
||||
|
||||
for (int x = -1; x <= 1; x++) {
|
||||
for (int z = -1; z <= 1; z++) {
|
||||
s32 actorParams = TWO_ACTOR_PARAMS(posX + x, posZ + z);
|
||||
Rando::Location* location = GetCheckObjectFromActor(ACTOR_EN_WOOD02, sceneNum, actorParams);
|
||||
if (location->GetRandomizerCheck() != RC_UNKNOWN_CHECK) {
|
||||
treeIdentity.randomizerInf = rcToRandomizerInf[location->GetRandomizerCheck()];
|
||||
treeIdentity.randomizerCheck = location->GetRandomizerCheck();
|
||||
return treeIdentity;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
treeIdentity.randomizerInf = RAND_INF_MAX;
|
||||
treeIdentity.randomizerCheck = RC_UNKNOWN_CHECK;
|
||||
return treeIdentity;
|
||||
}
|
||||
|
||||
u8 Randomizer::GetRandoSettingValue(RandomizerSettingKey randoSettingKey) {
|
||||
return Rando::Context::GetInstance()->GetOption(randoSettingKey).Get();
|
||||
}
|
||||
|
|
|
@ -57,6 +57,7 @@ class Randomizer {
|
|||
GrassIdentity IdentifyGrass(s32 sceneNum, s32 posX, s32 posZ, s32 respawnData, s32 linkAge);
|
||||
CrateIdentity IdentifyCrate(s32 sceneNum, s32 posX, s32 posZ);
|
||||
SmallCrateIdentity IdentifySmallCrate(s32 sceneNum, s32 posX, s32 posZ);
|
||||
TreeIdentity IdentifyTree(s32 sceneNum, s32 posX, s32 posZ);
|
||||
GetItemEntry GetItemFromKnownCheck(RandomizerCheck randomizerCheck, GetItemID ogItemId,
|
||||
bool checkObtainability = true);
|
||||
GetItemEntry GetItemFromActor(s16 actorId, s16 sceneNum, s16 actorParams, GetItemID ogItemId,
|
||||
|
|
|
@ -299,6 +299,7 @@ typedef enum {
|
|||
RCTYPE_CRATE, // Crates
|
||||
RCTYPE_NLCRATE, // NL Crates
|
||||
RCTYPE_SMALL_CRATE, // Small crates
|
||||
RCTYPE_TREE, // Trees
|
||||
RCTYPE_DUNGEON_REWARD, // Dungeon rewards (blue warps)
|
||||
RCTYPE_OCARINA, // Ocarina locations
|
||||
RCTYPE_BEEHIVE, // Beehives
|
||||
|
@ -2645,6 +2646,70 @@ typedef enum {
|
|||
RC_SPIRIT_TEMPLE_MQ_BEAMOS_SMALL_CRATE,
|
||||
// End Crates
|
||||
|
||||
// Start Trees
|
||||
RC_MARKET_DAY_TREE,
|
||||
RC_HC_NEAR_GUARDS_TREE_1,
|
||||
RC_HC_NEAR_GUARDS_TREE_2,
|
||||
RC_HC_NEAR_GUARDS_TREE_3,
|
||||
RC_HC_NEAR_GUARDS_TREE_4,
|
||||
RC_HC_NEAR_GUARDS_TREE_5,
|
||||
RC_HC_NEAR_GUARDS_TREE_6,
|
||||
RC_HC_SKULLTULA_TREE,
|
||||
RC_HC_GROTTO_TREE,
|
||||
RC_HF_NEAR_LLR_TREE,
|
||||
RC_HF_NEAR_LH_TREE,
|
||||
RC_HF_CHILD_NEAR_GV_TREE,
|
||||
RC_HF_ADULT_NEAR_GV_TREE,
|
||||
RC_HF_NEAR_ZR_TREE,
|
||||
RC_HF_NEAR_KAK_TREE,
|
||||
RC_HF_NEAR_KAK_SMALL_TREE,
|
||||
RC_HF_TREE_NEAR_HC_GROTTO_1,
|
||||
RC_HF_TREE_NEAR_HC_GROTTO_2,
|
||||
RC_HF_TREE_NEAR_HC_GROTTO_3,
|
||||
RC_HF_NORTHWEST_TREE_1,
|
||||
RC_HF_NORTHWEST_TREE_2,
|
||||
RC_HF_NORTHWEST_TREE_3,
|
||||
RC_HF_NORTHWEST_TREE_4,
|
||||
RC_HF_NORTHWEST_TREE_5,
|
||||
RC_HF_NORTHWEST_TREE_6,
|
||||
RC_HF_EAST_TREE_1,
|
||||
RC_HF_EAST_TREE_2,
|
||||
RC_HF_EAST_TREE_3,
|
||||
RC_HF_EAST_TREE_4,
|
||||
RC_HF_EAST_TREE_5,
|
||||
RC_HF_EAST_TREE_6,
|
||||
RC_HF_SOUTHEAST_TREE_1,
|
||||
RC_HF_SOUTHEAST_TREE_2,
|
||||
RC_HF_SOUTHEAST_TREE_3,
|
||||
RC_HF_SOUTHEAST_TREE_4,
|
||||
RC_HF_SOUTHEAST_TREE_5,
|
||||
RC_HF_SOUTHEAST_TREE_6,
|
||||
RC_HF_SOUTHEAST_TREE_7,
|
||||
RC_HF_SOUTHEAST_TREE_8,
|
||||
RC_HF_SOUTHEAST_TREE_9,
|
||||
RC_HF_SOUTHEAST_TREE_10,
|
||||
RC_HF_SOUTHEAST_TREE_11,
|
||||
RC_HF_SOUTHEAST_TREE_12,
|
||||
RC_HF_SOUTHEAST_TREE_13,
|
||||
RC_HF_SOUTHEAST_TREE_14,
|
||||
RC_HF_SOUTHEAST_TREE_15,
|
||||
RC_HF_SOUTHEAST_TREE_16,
|
||||
RC_HF_SOUTHEAST_TREE_17,
|
||||
RC_HF_SOUTHEAST_TREE_18,
|
||||
RC_HF_SOUTHEAST_TREE_19,
|
||||
RC_HF_CHILD_SOUTHEAST_TREE_1,
|
||||
RC_HF_CHILD_SOUTHEAST_TREE_2,
|
||||
RC_HF_CHILD_SOUTHEAST_TREE_3,
|
||||
RC_HF_CHILD_SOUTHEAST_TREE_4,
|
||||
RC_HF_CHILD_SOUTHEAST_TREE_5,
|
||||
RC_HF_CHILD_SOUTHEAST_TREE_6,
|
||||
RC_HF_TEKTITE_GROTTO_TREE,
|
||||
RC_ZF_TREE,
|
||||
RC_ZR_TREE,
|
||||
RC_KAK_TREE,
|
||||
RC_LLR_TREE,
|
||||
// End Trees
|
||||
|
||||
RC_PIERRE,
|
||||
RC_DELIVER_RUTOS_LETTER,
|
||||
RC_MASTER_SWORD_PEDESTAL,
|
||||
|
@ -5477,6 +5542,14 @@ typedef enum {
|
|||
RHT_CRATE_SPIRIT_TEMPLE,
|
||||
RHT_CRATE_SHADOW_TEMPLE,
|
||||
RHT_CRATE_GERUDO_TRAINING_GROUND,
|
||||
// Shuffle Trees
|
||||
RHT_TREE_HYRULE_FIELD,
|
||||
RHT_TREE_MARKET,
|
||||
RHT_TREE_HYRULE_CASTLE,
|
||||
RHT_TREE_ZORAS_FOUNTAIN,
|
||||
RHT_TREE_ZORAS_RIVER,
|
||||
RHT_TREE_LON_LON_RANCH,
|
||||
RHT_TREE_KAKARIKO,
|
||||
// Ganon Line
|
||||
RHT_GANON_JOKE01,
|
||||
RHT_GANON_JOKE02,
|
||||
|
@ -5815,6 +5888,7 @@ typedef enum {
|
|||
RSK_SHUFFLE_GERUDO_MEMBERSHIP_CARD,
|
||||
RSK_SHUFFLE_POTS,
|
||||
RSK_SHUFFLE_CRATES,
|
||||
RSK_SHUFFLE_TREES,
|
||||
RSK_SHUFFLE_FROG_SONG_RUPEES,
|
||||
RSK_ITEM_POOL,
|
||||
RSK_ICE_TRAPS,
|
||||
|
@ -6426,6 +6500,11 @@ typedef struct SmallCrateIdentity {
|
|||
RandomizerCheck randomizerCheck;
|
||||
} SmallCrateIdentity;
|
||||
|
||||
typedef struct TreeIdentity {
|
||||
RandomizerInf randomizerInf;
|
||||
RandomizerCheck randomizerCheck;
|
||||
} TreeIdentity;
|
||||
|
||||
typedef enum {
|
||||
TRACKER_WINDOW_FLOATING,
|
||||
TRACKER_WINDOW_WINDOW,
|
||||
|
|
|
@ -189,6 +189,8 @@ void RandomizerCheckObjects::UpdateImGuiVisibility() {
|
|||
CVarGetInteger(CVAR_RANDOMIZER_SETTING("ShuffleCrates"), RO_GENERIC_NO)) &&
|
||||
(location.GetRCType() != RCTYPE_SMALL_CRATE ||
|
||||
CVarGetInteger(CVAR_RANDOMIZER_SETTING("ShuffleCrates"), RO_GENERIC_NO)) &&
|
||||
(location.GetRCType() != RCTYPE_TREE ||
|
||||
CVarGetInteger(CVAR_RANDOMIZER_SETTING("ShuffleTrees"), RO_GENERIC_NO)) &&
|
||||
(location.GetRCType() != RCTYPE_FISH ||
|
||||
ctx->GetFishsanity()->GetFishLocationIncluded(&location, FSO_SOURCE_CVARS)) &&
|
||||
(location.GetRCType() != RCTYPE_ADULT_TRADE ||
|
||||
|
|
|
@ -68,6 +68,7 @@ bool showOverworldGrass;
|
|||
bool showDungeonGrass;
|
||||
bool showOverworldCrates;
|
||||
bool showDungeonCrates;
|
||||
bool showTrees;
|
||||
bool showFrogSongRupees;
|
||||
bool showFairies;
|
||||
bool showStartingMapsCompasses;
|
||||
|
@ -1448,6 +1449,7 @@ void LoadSettings() {
|
|||
showDungeonCrates = false;
|
||||
break;
|
||||
}
|
||||
showTrees = OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_SHUFFLE_TREES);
|
||||
} else { // Vanilla
|
||||
showOverworldTokens = true;
|
||||
showDungeonTokens = true;
|
||||
|
@ -1457,6 +1459,7 @@ void LoadSettings() {
|
|||
showDungeonGrass = false;
|
||||
showOverworldCrates = false;
|
||||
showDungeonCrates = false;
|
||||
showTrees = false;
|
||||
}
|
||||
|
||||
fortressFast = false;
|
||||
|
@ -1569,7 +1572,7 @@ bool IsCheckShuffled(RandomizerCheck rc) {
|
|||
(loc->GetRCType() != RCTYPE_SMALL_CRATE ||
|
||||
(showOverworldCrates && RandomizerCheckObjects::AreaIsOverworld(loc->GetArea())) ||
|
||||
(showDungeonCrates && RandomizerCheckObjects::AreaIsDungeon(loc->GetArea()))) &&
|
||||
(loc->GetRCType() != RCTYPE_COW || showCows) &&
|
||||
(loc->GetRCType() != RCTYPE_TREE || showTrees) && (loc->GetRCType() != RCTYPE_COW || showCows) &&
|
||||
(loc->GetRCType() != RCTYPE_FISH ||
|
||||
OTRGlobals::Instance->gRandoContext->GetFishsanity()->GetFishLocationIncluded(loc)) &&
|
||||
(loc->GetRCType() != RCTYPE_FREESTANDING ||
|
||||
|
|
|
@ -997,6 +997,67 @@ DEFINE_RAND_INF(RAND_INF_SHADOW_TEMPLE_MQ_TRUTH_SPINNER_SMALL_CRATE_3)
|
|||
DEFINE_RAND_INF(RAND_INF_SHADOW_TEMPLE_MQ_TRUTH_SPINNER_SMALL_CRATE_4)
|
||||
DEFINE_RAND_INF(RAND_INF_SPIRIT_TEMPLE_MQ_STATUE_SMALL_CRATE)
|
||||
DEFINE_RAND_INF(RAND_INF_SPIRIT_TEMPLE_MQ_BEAMOS_SMALL_CRATE)
|
||||
DEFINE_RAND_INF(RAND_INF_MARKET_DAY_TREE)
|
||||
DEFINE_RAND_INF(RAND_INF_HC_NEAR_GUARDS_TREE_1)
|
||||
DEFINE_RAND_INF(RAND_INF_HC_NEAR_GUARDS_TREE_2)
|
||||
DEFINE_RAND_INF(RAND_INF_HC_NEAR_GUARDS_TREE_3)
|
||||
DEFINE_RAND_INF(RAND_INF_HC_NEAR_GUARDS_TREE_4)
|
||||
DEFINE_RAND_INF(RAND_INF_HC_NEAR_GUARDS_TREE_5)
|
||||
DEFINE_RAND_INF(RAND_INF_HC_NEAR_GUARDS_TREE_6)
|
||||
DEFINE_RAND_INF(RAND_INF_HC_SKULLTULA_TREE)
|
||||
DEFINE_RAND_INF(RAND_INF_HC_GROTTO_TREE)
|
||||
DEFINE_RAND_INF(RAND_INF_HF_NEAR_LLR_TREE)
|
||||
DEFINE_RAND_INF(RAND_INF_HF_NEAR_LH_TREE)
|
||||
DEFINE_RAND_INF(RAND_INF_HF_CHILD_NEAR_GV_TREE)
|
||||
DEFINE_RAND_INF(RAND_INF_HF_ADULT_NEAR_GV_TREE)
|
||||
DEFINE_RAND_INF(RAND_INF_HF_NEAR_ZR_TREE)
|
||||
DEFINE_RAND_INF(RAND_INF_HF_NEAR_KAK_TREE)
|
||||
DEFINE_RAND_INF(RAND_INF_HF_NEAR_KAK_SMALL_TREE)
|
||||
DEFINE_RAND_INF(RAND_INF_HF_TREE_NEAR_HC_GROTTO_1)
|
||||
DEFINE_RAND_INF(RAND_INF_HF_TREE_NEAR_HC_GROTTO_2)
|
||||
DEFINE_RAND_INF(RAND_INF_HF_TREE_NEAR_HC_GROTTO_3)
|
||||
DEFINE_RAND_INF(RAND_INF_HF_NORTHWEST_TREE_1)
|
||||
DEFINE_RAND_INF(RAND_INF_HF_NORTHWEST_TREE_2)
|
||||
DEFINE_RAND_INF(RAND_INF_HF_NORTHWEST_TREE_3)
|
||||
DEFINE_RAND_INF(RAND_INF_HF_NORTHWEST_TREE_4)
|
||||
DEFINE_RAND_INF(RAND_INF_HF_NORTHWEST_TREE_5)
|
||||
DEFINE_RAND_INF(RAND_INF_HF_NORTHWEST_TREE_6)
|
||||
DEFINE_RAND_INF(RAND_INF_HF_EAST_TREE_1)
|
||||
DEFINE_RAND_INF(RAND_INF_HF_EAST_TREE_2)
|
||||
DEFINE_RAND_INF(RAND_INF_HF_EAST_TREE_3)
|
||||
DEFINE_RAND_INF(RAND_INF_HF_EAST_TREE_4)
|
||||
DEFINE_RAND_INF(RAND_INF_HF_EAST_TREE_5)
|
||||
DEFINE_RAND_INF(RAND_INF_HF_EAST_TREE_6)
|
||||
DEFINE_RAND_INF(RAND_INF_HF_SOUTHEAST_TREE_1)
|
||||
DEFINE_RAND_INF(RAND_INF_HF_SOUTHEAST_TREE_2)
|
||||
DEFINE_RAND_INF(RAND_INF_HF_SOUTHEAST_TREE_3)
|
||||
DEFINE_RAND_INF(RAND_INF_HF_SOUTHEAST_TREE_4)
|
||||
DEFINE_RAND_INF(RAND_INF_HF_SOUTHEAST_TREE_5)
|
||||
DEFINE_RAND_INF(RAND_INF_HF_SOUTHEAST_TREE_6)
|
||||
DEFINE_RAND_INF(RAND_INF_HF_SOUTHEAST_TREE_7)
|
||||
DEFINE_RAND_INF(RAND_INF_HF_SOUTHEAST_TREE_8)
|
||||
DEFINE_RAND_INF(RAND_INF_HF_SOUTHEAST_TREE_9)
|
||||
DEFINE_RAND_INF(RAND_INF_HF_SOUTHEAST_TREE_10)
|
||||
DEFINE_RAND_INF(RAND_INF_HF_SOUTHEAST_TREE_11)
|
||||
DEFINE_RAND_INF(RAND_INF_HF_SOUTHEAST_TREE_12)
|
||||
DEFINE_RAND_INF(RAND_INF_HF_SOUTHEAST_TREE_13)
|
||||
DEFINE_RAND_INF(RAND_INF_HF_SOUTHEAST_TREE_14)
|
||||
DEFINE_RAND_INF(RAND_INF_HF_SOUTHEAST_TREE_15)
|
||||
DEFINE_RAND_INF(RAND_INF_HF_SOUTHEAST_TREE_16)
|
||||
DEFINE_RAND_INF(RAND_INF_HF_SOUTHEAST_TREE_17)
|
||||
DEFINE_RAND_INF(RAND_INF_HF_SOUTHEAST_TREE_18)
|
||||
DEFINE_RAND_INF(RAND_INF_HF_SOUTHEAST_TREE_19)
|
||||
DEFINE_RAND_INF(RAND_INF_HF_CHILD_SOUTHEAST_TREE_1)
|
||||
DEFINE_RAND_INF(RAND_INF_HF_CHILD_SOUTHEAST_TREE_2)
|
||||
DEFINE_RAND_INF(RAND_INF_HF_CHILD_SOUTHEAST_TREE_3)
|
||||
DEFINE_RAND_INF(RAND_INF_HF_CHILD_SOUTHEAST_TREE_4)
|
||||
DEFINE_RAND_INF(RAND_INF_HF_CHILD_SOUTHEAST_TREE_5)
|
||||
DEFINE_RAND_INF(RAND_INF_HF_CHILD_SOUTHEAST_TREE_6)
|
||||
DEFINE_RAND_INF(RAND_INF_HF_TEKTITE_GROTTO_TREE)
|
||||
DEFINE_RAND_INF(RAND_INF_ZF_TREE)
|
||||
DEFINE_RAND_INF(RAND_INF_ZR_TREE)
|
||||
DEFINE_RAND_INF(RAND_INF_KAK_TREE)
|
||||
DEFINE_RAND_INF(RAND_INF_LLR_TREE)
|
||||
|
||||
DEFINE_RAND_INF(RAND_INF_CAUGHT_LOACH)
|
||||
|
||||
|
|
|
@ -216,6 +216,7 @@ void Settings::CreateOptions() {
|
|||
OPT_U8(RSK_SHUFFLE_POTS, "Shuffle Pots", {"Off", "Dungeons", "Overworld", "All Pots"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("ShufflePots"), mOptionDescriptions[RSK_SHUFFLE_POTS], WidgetType::Combobox, RO_SHUFFLE_POTS_OFF);
|
||||
OPT_U8(RSK_SHUFFLE_GRASS, "Shuffle Grass", {"Off", "Dungeons", "Overworld", "All Grass/Bushes"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("ShuffleGrass"), mOptionDescriptions[RSK_SHUFFLE_GRASS], WidgetType::Combobox, RO_SHUFFLE_GRASS_OFF);
|
||||
OPT_U8(RSK_SHUFFLE_CRATES, "Shuffle Crates", {"Off", "Dungeons", "Overworld", "All Crates"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("ShuffleCrates"), mOptionDescriptions[RSK_SHUFFLE_CRATES], WidgetType::Combobox, RO_SHUFFLE_CRATES_OFF);
|
||||
OPT_BOOL(RSK_SHUFFLE_TREES, "Shuffle Trees", CVAR_RANDOMIZER_SETTING("ShuffleTrees"), mOptionDescriptions[RSK_SHUFFLE_TREES]);
|
||||
OPT_BOOL(RSK_SHUFFLE_FISHING_POLE, "Shuffle Fishing Pole", CVAR_RANDOMIZER_SETTING("ShuffleFishingPole"), mOptionDescriptions[RSK_SHUFFLE_FISHING_POLE]);
|
||||
OPT_U8(RSK_SHUFFLE_MERCHANTS, "Shuffle Merchants", {"Off", "Bean Merchant Only", "All But Beans", "All"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("ShuffleMerchants"), mOptionDescriptions[RSK_SHUFFLE_MERCHANTS], WidgetType::Combobox, RO_SHUFFLE_MERCHANTS_OFF, IMFLAG_NONE);
|
||||
OPT_U8(RSK_MERCHANT_PRICES, "Merchant Prices", {"Vanilla", "Cheap Balanced", "Balanced", "Fixed", "Range", "Set By Wallet"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("MerchantPrices"), mOptionDescriptions[RSK_MERCHANT_PRICES], WidgetType::Combobox, RO_PRICE_VANILLA, false, IMFLAG_NONE);
|
||||
|
@ -1277,6 +1278,7 @@ void Settings::CreateOptions() {
|
|||
&mOptions[RSK_SHUFFLE_COWS],
|
||||
&mOptions[RSK_SHUFFLE_POTS],
|
||||
&mOptions[RSK_SHUFFLE_CRATES],
|
||||
&mOptions[RSK_SHUFFLE_TREES],
|
||||
&mOptions[RSK_SHUFFLE_MERCHANTS],
|
||||
&mOptions[RSK_MERCHANT_PRICES],
|
||||
&mOptions[RSK_MERCHANT_PRICES_FIXED_PRICE],
|
||||
|
@ -1509,6 +1511,7 @@ void Settings::CreateOptions() {
|
|||
&mOptions[RSK_SHUFFLE_COWS],
|
||||
&mOptions[RSK_SHUFFLE_POTS],
|
||||
&mOptions[RSK_SHUFFLE_CRATES],
|
||||
&mOptions[RSK_SHUFFLE_TREES],
|
||||
&mOptions[RSK_SHUFFLE_KOKIRI_SWORD],
|
||||
&mOptions[RSK_SHUFFLE_OCARINA],
|
||||
&mOptions[RSK_SHUFFLE_OCARINA_BUTTONS],
|
||||
|
|
|
@ -58,6 +58,7 @@ class StaticData {
|
|||
static void RegisterFreestandingLocations();
|
||||
static void RegisterGrassLocations();
|
||||
static void RegisterCrateLocations();
|
||||
static void RegisterTreeLocations();
|
||||
static void InitHashMaps();
|
||||
static std::array<std::pair<RandomizerCheck, RandomizerCheck>, 17> randomizerFishingPondFish;
|
||||
static std::unordered_map<int8_t, RandomizerCheck> randomizerGrottoFishMap;
|
||||
|
|
|
@ -357,6 +357,7 @@ void EnWood02_Update(Actor* thisx, PlayState* play2) {
|
|||
dropsSpawnPt = this->actor.world.pos;
|
||||
dropsSpawnPt.y += 200.0f;
|
||||
|
||||
if (GameInteractor_Should(VB_TREE_DROP_ITEM, true, this)) {
|
||||
if ((this->unk_14C >= 0) && (this->unk_14C < 0x64)) {
|
||||
if (GameInteractor_Should(VB_TREE_DROP_COLLECTIBLE, true, this)) {
|
||||
Item_DropCollectibleRandom(play, &this->actor, &dropsSpawnPt, this->unk_14C << 4);
|
||||
|
@ -368,6 +369,7 @@ void EnWood02_Update(Actor* thisx, PlayState* play2) {
|
|||
this->actor.world.rot.y, 0, this->actor.home.rot.z, true);
|
||||
this->actor.home.rot.z = 0;
|
||||
}
|
||||
}
|
||||
|
||||
// Spawn falling leaves
|
||||
if (this->unk_14C >= -1) {
|
||||
|
@ -457,12 +459,13 @@ void EnWood02_Draw(Actor* thisx, PlayState* play) {
|
|||
}
|
||||
|
||||
Gfx_SetupDL_25Xlu(gfxCtx);
|
||||
|
||||
if ((this->actor.params == WOOD_LEAF_GREEN) || (this->actor.params == WOOD_LEAF_YELLOW)) {
|
||||
if (GameInteractor_Should(VB_TREE_SETUP_DRAW,
|
||||
(this->actor.params == WOOD_LEAF_GREEN) || (this->actor.params == WOOD_LEAF_YELLOW),
|
||||
this)) {
|
||||
Gfx_SetupDL_25Opa(gfxCtx);
|
||||
gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, red, green, blue, 127);
|
||||
Gfx_DrawDListOpa(play, object_wood02_DL_000700);
|
||||
} else if (D_80B3BF70[this->drawType & 0xF] != NULL) {
|
||||
} else if (GameInteractor_Should(VB_TREE_SETUP_DRAW, D_80B3BF70[this->drawType & 0xF] != NULL, this)) {
|
||||
Gfx_DrawDListOpa(play, D_80B3BF54[this->drawType & 0xF]);
|
||||
gDPSetEnvColor(POLY_XLU_DISP++, red, green, blue, 0);
|
||||
gSPMatrix(POLY_XLU_DISP++, MATRIX_NEWMTX(gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
|
||||
|
|
|
@ -13,6 +13,7 @@ typedef struct EnWood02 {
|
|||
/* 0x0153 */ u8 spawnType;
|
||||
/* 0x0154 */ u8 drawType;
|
||||
/* 0x0158 */ ColliderCylinder collider;
|
||||
/* */ TreeIdentity treeId;
|
||||
} EnWood02; // size = 0x01A4
|
||||
|
||||
// Types with SPAWNED in the name are those that can be managed by a spawner, however the actor allows you to spawn them
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue