mirror of
https://github.com/HarbourMasters/Shipwright.git
synced 2025-02-07 02:40:30 -05:00
Merge from develop
This commit is contained in:
commit
6590f97146
@ -1 +1 @@
|
||||
Subproject commit 9a974e002f84cd1fe834ee9d2fa4ccf16d899e0f
|
||||
Subproject commit 2e7d1fe6fdc8ba7ea6ee0682b8f00f48b38a4e89
|
BIN
soh/assets/custom/objects/object_boss_soul/BarkOrHorns
Normal file
BIN
soh/assets/custom/objects/object_boss_soul/BarkOrHorns
Normal file
Binary file not shown.
BIN
soh/assets/custom/objects/object_boss_soul/LightNoise
Normal file
BIN
soh/assets/custom/objects/object_boss_soul/LightNoise
Normal file
Binary file not shown.
@ -0,0 +1,10 @@
|
||||
<Vertex Version="0">
|
||||
<Vtx X="-28" Y="-23" Z="-21" S="0" T="0" R="0" G="0" B="0" A="0"/>
|
||||
<Vtx X="-28" Y="-23" Z="21" S="0" T="0" R="0" G="0" B="0" A="0"/>
|
||||
<Vtx X="-28" Y="34" Z="21" S="0" T="0" R="0" G="0" B="0" A="0"/>
|
||||
<Vtx X="-28" Y="34" Z="-21" S="0" T="0" R="0" G="0" B="0" A="0"/>
|
||||
<Vtx X="28" Y="-23" Z="-21" S="0" T="0" R="0" G="0" B="0" A="0"/>
|
||||
<Vtx X="28" Y="-23" Z="21" S="0" T="0" R="0" G="0" B="0" A="0"/>
|
||||
<Vtx X="28" Y="34" Z="21" S="0" T="0" R="0" G="0" B="0" A="0"/>
|
||||
<Vtx X="28" Y="34" Z="-21" S="0" T="0" R="0" G="0" B="0" A="0"/>
|
||||
</Vertex>
|
BIN
soh/assets/custom/objects/object_boss_soul/heart1
Normal file
BIN
soh/assets/custom/objects/object_boss_soul/heart1
Normal file
Binary file not shown.
@ -0,0 +1,11 @@
|
||||
<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_0" B0="G_CCMUX_0" C0="G_CCMUX_0" D0="G_CCMUX_SHADE" 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="0" G="0" B="0" A="255"/>
|
||||
<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_TEXTURE_GEN="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="1984" T="1984" Level="0" Tile="0" On="1"/>
|
||||
<SetPrimColor M="0" L="0" R="255" G="192" B="113" A="255"/>
|
||||
<SetTextureImage Path="objects/object_boss_soul/BarkOrHorns" Format="G_IM_FMT_RGBA" Size="G_IM_SIZ_32b_LOAD_BLOCK" Width="1"/>
|
||||
<SetTile Format="G_IM_FMT_RGBA" Size="G_IM_SIZ_32b_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="128"/>
|
||||
<SetTile Format="G_IM_FMT_RGBA" Size="G_IM_SIZ_32b" 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_TEXTURE_GEN="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="960" T="960" Level="0" Tile="0" On="1"/>
|
||||
<SetPrimColor M="0" L="0" R="255" G="255" B="255" A="255"/>
|
||||
<SetTextureImage Path="objects/object_boss_soul/heart1" Format="G_IM_FMT_RGBA" Size="G_IM_SIZ_32b_LOAD_BLOCK" Width="1"/>
|
||||
<SetTile Format="G_IM_FMT_RGBA" Size="G_IM_SIZ_32b_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="255" Dxt="256"/>
|
||||
<SetTile Format="G_IM_FMT_RGBA" Size="G_IM_SIZ_32b" Line="4" TMem="0" Tile="0" Palette="0" Cms0="G_TX_WRAP" Cms1="G_TX_NOMIRROR" Cmt0="G_TX_WRAP" Cmt1="G_TX_NOMIRROR" MaskS="4" ShiftS="0" MaskT="4" ShiftT="0"/>
|
||||
<SetTileSize T="0" Uls="0" Ult="0" Lrs="60" Lrt="60"/>
|
||||
<EndDisplayList/>
|
||||
</DisplayList>
|
||||
|
@ -0,0 +1,15 @@
|
||||
<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_TEXEL0" A1="G_CCMUX_ENVIRONMENT" B1="G_CCMUX_0" C1="G_CCMUX_COMBINED" 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"/>
|
||||
<SetTextureImage Path="objects/object_boss_soul/LightNoise" Format="G_IM_FMT_RGBA" Size="G_IM_SIZ_32b_LOAD_BLOCK" Width="1"/>
|
||||
<SetTile Format="G_IM_FMT_RGBA" Size="G_IM_SIZ_32b_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="128"/>
|
||||
<SetTile Format="G_IM_FMT_RGBA" Size="G_IM_SIZ_32b" 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,12 @@
|
||||
<DisplayList Version="0">
|
||||
<PipeSync/>
|
||||
<SetCombineLERP A0="G_CCMUX_0" B0="G_CCMUX_0" C0="G_CCMUX_0" D0="G_CCMUX_SHADE" 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"/>
|
||||
<SetGeometryMode G_ZBUFFER="1" G_SHADE="1" G_CULL_BACK="1" G_FOG="1" G_LIGHTING="1" G_SHADING_SMOOTH="1" />
|
||||
|
||||
<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_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"/>
|
||||
<EndDisplayList/>
|
||||
</DisplayList>
|
||||
|
BIN
soh/assets/custom/objects/object_housekey/Hilite_new
Normal file
BIN
soh/assets/custom/objects/object_housekey/Hilite_new
Normal file
Binary file not shown.
BIN
soh/assets/custom/objects/object_housekey/HouseKey_Tag
Normal file
BIN
soh/assets/custom/objects/object_housekey/HouseKey_Tag
Normal file
Binary file not shown.
15
soh/assets/custom/objects/object_housekey/gHouseKeyDL
Normal file
15
soh/assets/custom/objects/object_housekey/gHouseKeyDL
Normal file
@ -0,0 +1,15 @@
|
||||
<DisplayList Version="0">
|
||||
<CallDisplayList Path="objects/object_housekey/mat_gHouseKeyDL_f3dlite_housekeyringmetal"/>
|
||||
<CallDisplayList Path="objects/object_housekey/gHouseKeyDL_tri_0"/>
|
||||
<CallDisplayList Path="objects/object_housekey/mat_gHouseKeyDL_f3dlite_housekeytag"/>
|
||||
<CallDisplayList Path="objects/object_housekey/gHouseKeyDL_tri_1"/>
|
||||
<CallDisplayList Path="objects/object_housekey/mat_gHouseKeyDL_f3dlite_housekeymetal"/>
|
||||
<CallDisplayList Path="objects/object_housekey/gHouseKeyDL_tri_2"/>
|
||||
<PipeSync/>
|
||||
<SetGeometryMode G_LIGHTING="1" />
|
||||
<ClearGeometryMode G_TEXTURE_GEN="1" />
|
||||
<SetCombineLERP A0="G_CCMUX_0" B0="G_CCMUX_0" C0="G_CCMUX_0" D0="G_CCMUX_SHADE" Aa0="G_ACMUX_0" Ab0="G_ACMUX_0" Ac0="G_ACMUX_0" Ad0="G_ACMUX_ENVIRONMENT" A1="G_CCMUX_0" B1="G_CCMUX_0" C1="G_CCMUX_0" D1="G_CCMUX_SHADE" Aa1="G_ACMUX_0" Ab1="G_ACMUX_0" Ac1="G_ACMUX_0" Ad1="G_ACMUX_ENVIRONMENT"/>
|
||||
<Texture S="65535" T="65535" Level="0" Tile="0" On="0"/>
|
||||
<EndDisplayList/>
|
||||
</DisplayList>
|
||||
|
54
soh/assets/custom/objects/object_housekey/gHouseKeyDL_tri_0
Normal file
54
soh/assets/custom/objects/object_housekey/gHouseKeyDL_tri_0
Normal file
@ -0,0 +1,54 @@
|
||||
<DisplayList Version="0">
|
||||
<LoadVertices Path="objects/object_housekey/gHouseKeyDL_vtx_0" VertexBufferIndex="0" VertexOffset="0" Count="16"/>
|
||||
<Triangle1 V00="0" V01="1" V02="2"/>
|
||||
<Triangle1 V00="0" V01="2" V02="3"/>
|
||||
<Triangle1 V00="3" V01="2" V02="4"/>
|
||||
<Triangle1 V00="3" V01="4" V02="5"/>
|
||||
<Triangle1 V00="5" V01="4" V02="6"/>
|
||||
<Triangle1 V00="5" V01="6" V02="7"/>
|
||||
<Triangle1 V00="7" V01="6" V02="8"/>
|
||||
<Triangle1 V00="7" V01="8" V02="9"/>
|
||||
<Triangle1 V00="9" V01="8" V02="10"/>
|
||||
<Triangle1 V00="9" V01="10" V02="11"/>
|
||||
<Triangle1 V00="12" V01="13" V02="14"/>
|
||||
<Triangle1 V00="14" V01="15" V02="12"/>
|
||||
<LoadVertices Path="objects/object_housekey/gHouseKeyDL_vtx_0" VertexBufferIndex="0" VertexOffset="16" Count="16"/>
|
||||
<Triangle1 V00="0" V01="1" V02="2"/>
|
||||
<Triangle1 V00="3" V01="4" V02="5"/>
|
||||
<Triangle1 V00="5" V01="6" V02="3"/>
|
||||
<Triangle1 V00="5" V01="7" V02="6"/>
|
||||
<Triangle1 V00="8" V01="9" V02="10"/>
|
||||
<Triangle1 V00="8" V01="10" V02="11"/>
|
||||
<Triangle1 V00="11" V01="10" V02="12"/>
|
||||
<Triangle1 V00="11" V01="12" V02="13"/>
|
||||
<Triangle1 V00="13" V01="12" V02="14"/>
|
||||
<Triangle1 V00="13" V01="14" V02="15"/>
|
||||
<LoadVertices Path="objects/object_housekey/gHouseKeyDL_vtx_0" VertexBufferIndex="0" VertexOffset="32" Count="16"/>
|
||||
<Triangle1 V00="0" V01="1" V02="2"/>
|
||||
<Triangle1 V00="0" V01="2" V02="3"/>
|
||||
<Triangle1 V00="4" V01="0" V02="3"/>
|
||||
<Triangle1 V00="4" V01="3" V02="5"/>
|
||||
<Triangle1 V00="6" V01="4" V02="5"/>
|
||||
<Triangle1 V00="6" V01="5" V02="7"/>
|
||||
<Triangle1 V00="8" V01="6" V02="7"/>
|
||||
<Triangle1 V00="8" V01="7" V02="9"/>
|
||||
<Triangle1 V00="10" V01="6" V02="8"/>
|
||||
<Triangle1 V00="10" V01="11" V02="6"/>
|
||||
<Triangle1 V00="12" V01="11" V02="10"/>
|
||||
<Triangle1 V00="12" V01="13" V02="11"/>
|
||||
<Triangle1 V00="13" V01="14" V02="11"/>
|
||||
<Triangle1 V00="13" V01="15" V02="14"/>
|
||||
<LoadVertices Path="objects/object_housekey/gHouseKeyDL_vtx_0" VertexBufferIndex="0" VertexOffset="48" Count="11"/>
|
||||
<Triangle1 V00="0" V01="1" V02="2"/>
|
||||
<Triangle1 V00="0" V01="3" V02="1"/>
|
||||
<Triangle1 V00="3" V01="4" V02="1"/>
|
||||
<Triangle1 V00="3" V01="5" V02="4"/>
|
||||
<Triangle1 V00="1" V01="4" V02="6"/>
|
||||
<Triangle1 V00="1" V01="6" V02="7"/>
|
||||
<Triangle1 V00="2" V01="1" V02="7"/>
|
||||
<Triangle1 V00="2" V01="7" V02="8"/>
|
||||
<Triangle1 V00="9" V01="2" V02="8"/>
|
||||
<Triangle1 V00="9" V01="8" V02="10"/>
|
||||
<EndDisplayList/>
|
||||
</DisplayList>
|
||||
|
43
soh/assets/custom/objects/object_housekey/gHouseKeyDL_tri_1
Normal file
43
soh/assets/custom/objects/object_housekey/gHouseKeyDL_tri_1
Normal file
@ -0,0 +1,43 @@
|
||||
<DisplayList Version="0">
|
||||
<LoadVertices Path="objects/object_housekey/gHouseKeyDL_vtx_1" VertexBufferIndex="0" VertexOffset="0" Count="16"/>
|
||||
<Triangle1 V00="0" V01="1" V02="2"/>
|
||||
<Triangle1 V00="0" V01="3" V02="1"/>
|
||||
<Triangle1 V00="4" V01="3" V02="0"/>
|
||||
<Triangle1 V00="5" V01="4" V02="0"/>
|
||||
<Triangle1 V00="5" V01="0" V02="6"/>
|
||||
<Triangle1 V00="7" V01="5" V02="6"/>
|
||||
<Triangle1 V00="7" V01="6" V02="8"/>
|
||||
<Triangle1 V00="9" V01="7" V02="8"/>
|
||||
<Triangle1 V00="9" V01="8" V02="3"/>
|
||||
<Triangle1 V00="4" V01="9" V02="3"/>
|
||||
<Triangle1 V00="9" V01="4" V02="10"/>
|
||||
<Triangle1 V00="4" V01="11" V02="10"/>
|
||||
<Triangle1 V00="4" V01="12" V02="11"/>
|
||||
<Triangle1 V00="5" V01="12" V02="4"/>
|
||||
<Triangle1 V00="5" V01="13" V02="12"/>
|
||||
<Triangle1 V00="14" V01="13" V02="5"/>
|
||||
<Triangle1 V00="14" V01="5" V02="7"/>
|
||||
<Triangle1 V00="14" V01="7" V02="9"/>
|
||||
<Triangle1 V00="14" V01="9" V02="15"/>
|
||||
<LoadVertices Path="objects/object_housekey/gHouseKeyDL_vtx_1" VertexBufferIndex="0" VertexOffset="16" Count="16"/>
|
||||
<Triangle1 V00="0" V01="1" V02="2"/>
|
||||
<Triangle1 V00="1" V01="3" V02="2"/>
|
||||
<Triangle1 V00="2" V01="3" V02="4"/>
|
||||
<Triangle1 V00="2" V01="4" V02="5"/>
|
||||
<Triangle1 V00="5" V01="4" V02="6"/>
|
||||
<Triangle1 V00="5" V01="6" V02="0"/>
|
||||
<Triangle1 V00="0" V01="6" V02="7"/>
|
||||
<Triangle1 V00="0" V01="7" V02="8"/>
|
||||
<Triangle1 V00="0" V01="2" V02="5"/>
|
||||
<Triangle1 V00="9" V01="10" V02="11"/>
|
||||
<Triangle1 V00="9" V01="11" V02="12"/>
|
||||
<Triangle1 V00="13" V01="12" V02="11"/>
|
||||
<Triangle1 V00="13" V01="11" V02="14"/>
|
||||
<Triangle1 V00="15" V01="13" V02="14"/>
|
||||
<LoadVertices Path="objects/object_housekey/gHouseKeyDL_vtx_1" VertexBufferIndex="0" VertexOffset="32" Count="5"/>
|
||||
<Triangle1 V00="0" V01="1" V02="2"/>
|
||||
<Triangle1 V00="1" V01="3" V02="2"/>
|
||||
<Triangle1 V00="1" V01="4" V02="3"/>
|
||||
<EndDisplayList/>
|
||||
</DisplayList>
|
||||
|
82
soh/assets/custom/objects/object_housekey/gHouseKeyDL_tri_2
Normal file
82
soh/assets/custom/objects/object_housekey/gHouseKeyDL_tri_2
Normal file
@ -0,0 +1,82 @@
|
||||
<DisplayList Version="0">
|
||||
<LoadVertices Path="objects/object_housekey/gHouseKeyDL_vtx_2" VertexBufferIndex="0" VertexOffset="0" Count="16"/>
|
||||
<Triangle1 V00="0" V01="1" V02="2"/>
|
||||
<Triangle1 V00="0" V01="2" V02="3"/>
|
||||
<Triangle1 V00="3" V01="2" V02="4"/>
|
||||
<Triangle1 V00="3" V01="4" V02="5"/>
|
||||
<Triangle1 V00="5" V01="4" V02="6"/>
|
||||
<Triangle1 V00="5" V01="6" V02="7"/>
|
||||
<Triangle1 V00="8" V01="5" V02="7"/>
|
||||
<Triangle1 V00="8" V01="7" V02="9"/>
|
||||
<Triangle1 V00="10" V01="8" V02="9"/>
|
||||
<Triangle1 V00="10" V01="9" V02="11"/>
|
||||
<Triangle1 V00="12" V01="10" V02="11"/>
|
||||
<Triangle1 V00="12" V01="11" V02="13"/>
|
||||
<Triangle1 V00="14" V01="10" V02="12"/>
|
||||
<Triangle1 V00="14" V01="15" V02="10"/>
|
||||
<LoadVertices Path="objects/object_housekey/gHouseKeyDL_vtx_2" VertexBufferIndex="0" VertexOffset="16" Count="16"/>
|
||||
<Triangle1 V00="0" V01="1" V02="2"/>
|
||||
<Triangle1 V00="0" V01="3" V02="1"/>
|
||||
<Triangle1 V00="3" V01="4" V02="1"/>
|
||||
<Triangle1 V00="3" V01="5" V02="4"/>
|
||||
<Triangle1 V00="5" V01="6" V02="4"/>
|
||||
<Triangle1 V00="5" V01="7" V02="6"/>
|
||||
<Triangle1 V00="4" V01="6" V02="8"/>
|
||||
<Triangle1 V00="4" V01="8" V02="9"/>
|
||||
<Triangle1 V00="1" V01="4" V02="9"/>
|
||||
<Triangle1 V00="1" V01="9" V02="10"/>
|
||||
<Triangle1 V00="11" V01="12" V02="13"/>
|
||||
<Triangle1 V00="11" V01="13" V02="14"/>
|
||||
<Triangle1 V00="14" V01="13" V02="15"/>
|
||||
<LoadVertices Path="objects/object_housekey/gHouseKeyDL_vtx_2" VertexBufferIndex="0" VertexOffset="32" Count="16"/>
|
||||
<Triangle1 V00="0" V01="1" V02="2"/>
|
||||
<Triangle1 V00="2" V01="1" V02="3"/>
|
||||
<Triangle1 V00="1" V01="4" V02="3"/>
|
||||
<Triangle1 V00="1" V01="5" V02="4"/>
|
||||
<Triangle1 V00="2" V01="3" V02="6"/>
|
||||
<Triangle1 V00="6" V01="3" V02="7"/>
|
||||
<Triangle1 V00="6" V01="7" V02="8"/>
|
||||
<Triangle1 V00="9" V01="2" V02="6"/>
|
||||
<Triangle1 V00="9" V01="6" V02="10"/>
|
||||
<Triangle1 V00="11" V01="12" V02="13"/>
|
||||
<Triangle1 V00="11" V01="13" V02="14"/>
|
||||
<Triangle1 V00="14" V01="13" V02="15"/>
|
||||
<LoadVertices Path="objects/object_housekey/gHouseKeyDL_vtx_2" VertexBufferIndex="0" VertexOffset="48" Count="16"/>
|
||||
<Triangle1 V00="0" V01="1" V02="2"/>
|
||||
<Triangle1 V00="2" V01="1" V02="3"/>
|
||||
<Triangle1 V00="1" V01="4" V02="3"/>
|
||||
<Triangle1 V00="1" V01="5" V02="4"/>
|
||||
<Triangle1 V00="2" V01="3" V02="6"/>
|
||||
<Triangle1 V00="6" V01="3" V02="7"/>
|
||||
<Triangle1 V00="6" V01="7" V02="8"/>
|
||||
<Triangle1 V00="9" V01="2" V02="6"/>
|
||||
<Triangle1 V00="9" V01="6" V02="10"/>
|
||||
<Triangle1 V00="11" V01="12" V02="13"/>
|
||||
<Triangle1 V00="11" V01="13" V02="14"/>
|
||||
<Triangle1 V00="14" V01="13" V02="15"/>
|
||||
<LoadVertices Path="objects/object_housekey/gHouseKeyDL_vtx_2" VertexBufferIndex="0" VertexOffset="64" Count="16"/>
|
||||
<Triangle1 V00="0" V01="1" V02="2"/>
|
||||
<Triangle1 V00="2" V01="1" V02="3"/>
|
||||
<Triangle1 V00="1" V01="4" V02="3"/>
|
||||
<Triangle1 V00="1" V01="5" V02="4"/>
|
||||
<Triangle1 V00="2" V01="3" V02="6"/>
|
||||
<Triangle1 V00="6" V01="3" V02="7"/>
|
||||
<Triangle1 V00="6" V01="7" V02="8"/>
|
||||
<Triangle1 V00="9" V01="2" V02="6"/>
|
||||
<Triangle1 V00="9" V01="6" V02="10"/>
|
||||
<Triangle1 V00="11" V01="12" V02="13"/>
|
||||
<Triangle1 V00="11" V01="13" V02="14"/>
|
||||
<Triangle1 V00="14" V01="13" V02="15"/>
|
||||
<LoadVertices Path="objects/object_housekey/gHouseKeyDL_vtx_2" VertexBufferIndex="0" VertexOffset="80" Count="11"/>
|
||||
<Triangle1 V00="0" V01="1" V02="2"/>
|
||||
<Triangle1 V00="2" V01="1" V02="3"/>
|
||||
<Triangle1 V00="1" V01="4" V02="3"/>
|
||||
<Triangle1 V00="1" V01="5" V02="4"/>
|
||||
<Triangle1 V00="2" V01="3" V02="6"/>
|
||||
<Triangle1 V00="6" V01="3" V02="7"/>
|
||||
<Triangle1 V00="6" V01="7" V02="8"/>
|
||||
<Triangle1 V00="9" V01="2" V02="6"/>
|
||||
<Triangle1 V00="9" V01="6" V02="10"/>
|
||||
<EndDisplayList/>
|
||||
</DisplayList>
|
||||
|
61
soh/assets/custom/objects/object_housekey/gHouseKeyDL_vtx_0
Normal file
61
soh/assets/custom/objects/object_housekey/gHouseKeyDL_vtx_0
Normal file
@ -0,0 +1,61 @@
|
||||
<Vertex Version="0">
|
||||
<Vtx X="5" Y="3" Z="3" S="-580" T="-836" R="45" G="180" B="91" A="255"/>
|
||||
<Vtx X="8" Y="4" Z="-5" S="-580" T="-1092" R="96" G="190" B="205" A="255"/>
|
||||
<Vtx X="9" Y="9" Z="-5" S="-683" T="-1092" R="110" G="52" B="218" A="255"/>
|
||||
<Vtx X="6" Y="8" Z="3" S="-683" T="-836" R="59" G="42" B="105" A="255"/>
|
||||
<Vtx X="4" Y="11" Z="-6" S="-785" T="-1092" R="6" G="105" B="185" A="255"/>
|
||||
<Vtx X="2" Y="11" Z="2" S="-785" T="-836" R="212" G="95" B="72" A="255"/>
|
||||
<Vtx X="1" Y="8" Z="-7" S="-887" T="-1092" R="186" G="19" B="152" A="255"/>
|
||||
<Vtx X="-2" Y="7" Z="1" S="-887" T="-836" R="135" G="9" B="38" A="255"/>
|
||||
<Vtx X="3" Y="3" Z="-7" S="-990" T="-1092" R="241" G="170" B="164" A="255"/>
|
||||
<Vtx X="1" Y="3" Z="1" S="-990" T="-836" R="190" G="159" B="50" A="255"/>
|
||||
<Vtx X="8" Y="4" Z="-5" S="-1092" T="-1092" R="96" G="190" B="205" A="255"/>
|
||||
<Vtx X="5" Y="3" Z="3" S="-1092" T="-836" R="45" G="180" B="91" A="255"/>
|
||||
<Vtx X="4" Y="11" Z="-6" S="-892" T="-609" R="6" G="105" B="185" A="255"/>
|
||||
<Vtx X="9" Y="9" Z="-5" S="-847" T="-746" R="110" G="52" B="218" A="255"/>
|
||||
<Vtx X="8" Y="4" Z="-5" S="-964" T="-831" R="96" G="190" B="205" A="255"/>
|
||||
<Vtx X="1" Y="8" Z="-7" S="-1036" T="-609" R="186" G="19" B="152" A="255"/>
|
||||
<Vtx X="8" Y="4" Z="-5" S="-964" T="-831" R="96" G="190" B="205" A="255"/>
|
||||
<Vtx X="3" Y="3" Z="-7" S="-1081" T="-746" R="241" G="170" B="164" A="255"/>
|
||||
<Vtx X="1" Y="8" Z="-7" S="-1036" T="-609" R="186" G="19" B="152" A="255"/>
|
||||
<Vtx X="1" Y="3" Z="1" S="-825" T="-746" R="190" G="159" B="50" A="255"/>
|
||||
<Vtx X="5" Y="3" Z="3" S="-708" T="-831" R="45" G="180" B="91" A="255"/>
|
||||
<Vtx X="6" Y="8" Z="3" S="-591" T="-746" R="59" G="42" B="105" A="255"/>
|
||||
<Vtx X="-2" Y="7" Z="1" S="-780" T="-609" R="135" G="9" B="38" A="255"/>
|
||||
<Vtx X="2" Y="11" Z="2" S="-636" T="-609" R="212" G="95" B="72" A="255"/>
|
||||
<Vtx X="-3" Y="30" Z="-4" S="-683" T="-580" R="33" G="246" B="134" A="255"/>
|
||||
<Vtx X="4" Y="17" Z="-3" S="-580" T="-580" R="22" G="11" B="131" A="255"/>
|
||||
<Vtx X="3" Y="17" Z="0" S="-580" T="-751" R="195" G="251" B="111" A="255"/>
|
||||
<Vtx X="-4" Y="30" Z="-1" S="-683" T="-751" R="206" G="230" B="114" A="255"/>
|
||||
<Vtx X="6" Y="17" Z="0" S="-580" T="-922" R="119" G="238" B="41" A="255"/>
|
||||
<Vtx X="-2" Y="33" Z="-2" S="-683" T="-922" R="50" G="114" B="26" A="255"/>
|
||||
<Vtx X="4" Y="17" Z="-3" S="-580" T="-1092" R="22" G="11" B="131" A="255"/>
|
||||
<Vtx X="-3" Y="30" Z="-4" S="-683" T="-1092" R="33" G="246" B="134" A="255"/>
|
||||
<Vtx X="-19" Y="30" Z="-9" S="-785" T="-922" R="168" G="89" B="231" A="255"/>
|
||||
<Vtx X="-2" Y="33" Z="-2" S="-683" T="-922" R="50" G="114" B="26" A="255"/>
|
||||
<Vtx X="-3" Y="30" Z="-4" S="-683" T="-1092" R="33" G="246" B="134" A="255"/>
|
||||
<Vtx X="-17" Y="28" Z="-10" S="-785" T="-1092" R="56" G="250" B="142" A="255"/>
|
||||
<Vtx X="-21" Y="12" Z="-11" S="-887" T="-922" R="151" G="197" B="215" A="255"/>
|
||||
<Vtx X="-18" Y="13" Z="-11" S="-887" T="-1092" R="59" G="18" B="145" A="255"/>
|
||||
<Vtx X="-6" Y="4" Z="-6" S="-990" T="-922" R="23" G="131" B="0" A="255"/>
|
||||
<Vtx X="-6" Y="7" Z="-7" S="-990" T="-1092" R="38" G="28" B="138" A="255"/>
|
||||
<Vtx X="6" Y="17" Z="0" S="-1092" T="-922" R="119" G="238" B="41" A="255"/>
|
||||
<Vtx X="4" Y="17" Z="-3" S="-1092" T="-1092" R="22" G="11" B="131" A="255"/>
|
||||
<Vtx X="3" Y="17" Z="0" S="-1092" T="-751" R="195" G="251" B="111" A="255"/>
|
||||
<Vtx X="-7" Y="6" Z="-4" S="-990" T="-751" R="211" G="12" B="118" A="255"/>
|
||||
<Vtx X="4" Y="17" Z="-3" S="-1092" T="-580" R="22" G="11" B="131" A="255"/>
|
||||
<Vtx X="-6" Y="7" Z="-7" S="-990" T="-580" R="38" G="28" B="138" A="255"/>
|
||||
<Vtx X="-19" Y="13" Z="-8" S="-887" T="-751" R="231" G="1" B="125" A="255"/>
|
||||
<Vtx X="-18" Y="13" Z="-11" S="-887" T="-580" R="59" G="18" B="145" A="255"/>
|
||||
<Vtx X="-18" Y="13" Z="-11" S="-887" T="-580" R="59" G="18" B="145" A="255"/>
|
||||
<Vtx X="-18" Y="28" Z="-6" S="-785" T="-751" R="229" G="234" B="122" A="255"/>
|
||||
<Vtx X="-19" Y="13" Z="-8" S="-887" T="-751" R="231" G="1" B="125" A="255"/>
|
||||
<Vtx X="-17" Y="28" Z="-10" S="-785" T="-580" R="56" G="250" B="142" A="255"/>
|
||||
<Vtx X="-4" Y="30" Z="-1" S="-683" T="-751" R="206" G="230" B="114" A="255"/>
|
||||
<Vtx X="-3" Y="30" Z="-4" S="-683" T="-580" R="33" G="246" B="134" A="255"/>
|
||||
<Vtx X="-2" Y="33" Z="-2" S="-683" T="-922" R="50" G="114" B="26" A="255"/>
|
||||
<Vtx X="-19" Y="30" Z="-9" S="-785" T="-922" R="168" G="89" B="231" A="255"/>
|
||||
<Vtx X="-21" Y="12" Z="-11" S="-887" T="-922" R="151" G="197" B="215" A="255"/>
|
||||
<Vtx X="-7" Y="6" Z="-4" S="-990" T="-751" R="211" G="12" B="118" A="255"/>
|
||||
<Vtx X="-6" Y="4" Z="-6" S="-990" T="-922" R="23" G="131" B="0" A="255"/>
|
||||
</Vertex>
|
39
soh/assets/custom/objects/object_housekey/gHouseKeyDL_vtx_1
Normal file
39
soh/assets/custom/objects/object_housekey/gHouseKeyDL_vtx_1
Normal file
@ -0,0 +1,39 @@
|
||||
<Vertex Version="0">
|
||||
<Vtx X="3" Y="-11" Z="-3" S="1" T="1998" R="197" G="224" B="148" A="255"/>
|
||||
<Vtx X="47" Y="-19" Z="11" S="2015" T="1042" R="122" G="6" B="222" A="255"/>
|
||||
<Vtx X="30" Y="-38" Z="4" S="2015" T="1998" R="28" G="157" B="181" A="255"/>
|
||||
<Vtx X="20" Y="8" Z="4" S="1" T="1042" R="57" G="98" B="199" A="255"/>
|
||||
<Vtx X="3" Y="-2" Z="-3" S="211" T="1772" R="214" G="174" B="169" A="255"/>
|
||||
<Vtx X="2" Y="-2" Z="0" S="211" T="1772" R="157" G="221" B="72" A="255"/>
|
||||
<Vtx X="2" Y="-11" Z="-1" S="1" T="1998" R="144" G="214" B="42" A="255"/>
|
||||
<Vtx X="11" Y="7" Z="4" S="211" T="1268" R="245" G="63" B="110" A="255"/>
|
||||
<Vtx X="19" Y="8" Z="6" S="1" T="1042" R="4" G="87" B="93" A="255"/>
|
||||
<Vtx X="12" Y="8" Z="1" S="211" T="1268" R="99" G="75" B="230" A="255"/>
|
||||
<Vtx X="4" Y="-2" Z="-5" S="211" T="1772" R="28" G="157" B="181" A="255"/>
|
||||
<Vtx X="-6" Y="9" Z="-8" S="778" T="1772" R="198" G="245" B="143" A="255"/>
|
||||
<Vtx X="-8" Y="9" Z="-6" S="853" T="1772" R="136" G="12" B="215" A="255"/>
|
||||
<Vtx X="-8" Y="8" Z="-3" S="778" T="1772" R="140" G="234" B="48" A="255"/>
|
||||
<Vtx X="1" Y="18" Z="0" S="778" T="1268" R="239" G="87" B="91" A="255"/>
|
||||
<Vtx X="1" Y="19" Z="-2" S="853" T="1268" R="239" G="126" B="2" A="255"/>
|
||||
<Vtx X="1" Y="19" Z="-2" S="853" T="1268" R="239" G="126" B="2" A="255"/>
|
||||
<Vtx X="12" Y="8" Z="1" S="211" T="1268" R="99" G="75" B="230" A="255"/>
|
||||
<Vtx X="13" Y="8" Z="-2" S="211" T="1268" R="122" G="6" B="222" A="255"/>
|
||||
<Vtx X="4" Y="-2" Z="-5" S="211" T="1772" R="28" G="157" B="181" A="255"/>
|
||||
<Vtx X="-6" Y="9" Z="-8" S="778" T="1772" R="198" G="245" B="143" A="255"/>
|
||||
<Vtx X="2" Y="19" Z="-5" S="778" T="1268" R="40" G="98" B="186" A="255"/>
|
||||
<Vtx X="-8" Y="9" Z="-6" S="853" T="1772" R="136" G="12" B="215" A="255"/>
|
||||
<Vtx X="-8" Y="8" Z="-3" S="778" T="1772" R="140" G="234" B="48" A="255"/>
|
||||
<Vtx X="1" Y="18" Z="0" S="778" T="1268" R="239" G="87" B="91" A="255"/>
|
||||
<Vtx X="2" Y="-11" Z="-1" S="-16" T="1008" R="144" G="214" B="42" A="255"/>
|
||||
<Vtx X="3" Y="-11" Z="-3" S="-16" T="1008" R="197" G="224" B="148" A="255"/>
|
||||
<Vtx X="30" Y="-38" Z="4" S="2032" T="1008" R="28" G="157" B="181" A="255"/>
|
||||
<Vtx X="29" Y="-38" Z="7" S="2032" T="1008" R="235" G="148" B="63" A="255"/>
|
||||
<Vtx X="46" Y="-19" Z="14" S="2032" T="-16" R="73" G="253" B="104" A="255"/>
|
||||
<Vtx X="47" Y="-19" Z="11" S="2032" T="-16" R="122" G="6" B="222" A="255"/>
|
||||
<Vtx X="20" Y="8" Z="4" S="-16" T="-16" R="57" G="98" B="199" A="255"/>
|
||||
<Vtx X="20" Y="8" Z="4" S="-16" T="-16" R="57" G="98" B="199" A="255"/>
|
||||
<Vtx X="19" Y="8" Z="6" S="-16" T="-16" R="4" G="87" B="93" A="255"/>
|
||||
<Vtx X="46" Y="-19" Z="14" S="2032" T="-16" R="73" G="253" B="104" A="255"/>
|
||||
<Vtx X="29" Y="-38" Z="7" S="2032" T="1008" R="235" G="148" B="63" A="255"/>
|
||||
<Vtx X="2" Y="-11" Z="-1" S="-16" T="1008" R="144" G="214" B="42" A="255"/>
|
||||
</Vertex>
|
93
soh/assets/custom/objects/object_housekey/gHouseKeyDL_vtx_2
Normal file
93
soh/assets/custom/objects/object_housekey/gHouseKeyDL_vtx_2
Normal file
@ -0,0 +1,93 @@
|
||||
<Vertex Version="0">
|
||||
<Vtx X="-11" Y="19" Z="-12" S="-708" T="-580" R="193" G="214" B="154" A="255"/>
|
||||
<Vtx X="-20" Y="19" Z="-7" S="-580" T="-580" R="204" G="214" B="148" A="255"/>
|
||||
<Vtx X="-17" Y="21" Z="-2" S="-580" T="-751" R="60" G="53" B="99" A="255"/>
|
||||
<Vtx X="-8" Y="21" Z="-7" S="-708" T="-751" R="50" G="53" B="104" A="255"/>
|
||||
<Vtx X="-21" Y="16" Z="-1" S="-580" T="-922" R="197" G="170" B="72" A="255"/>
|
||||
<Vtx X="-5" Y="16" Z="-10" S="-708" T="-922" R="97" G="176" B="240" A="255"/>
|
||||
<Vtx X="-20" Y="19" Z="-7" S="-580" T="-1092" R="204" G="214" B="148" A="255"/>
|
||||
<Vtx X="-11" Y="19" Z="-12" S="-708" T="-1092" R="193" G="214" B="154" A="255"/>
|
||||
<Vtx X="-9" Y="33" Z="-16" S="-836" T="-922" R="59" G="86" B="184" A="255"/>
|
||||
<Vtx X="-13" Y="28" Z="-15" S="-836" T="-1092" R="196" G="203" B="157" A="255"/>
|
||||
<Vtx X="-25" Y="33" Z="-7" S="-964" T="-922" R="159" G="80" B="16" A="255"/>
|
||||
<Vtx X="-22" Y="28" Z="-10" S="-964" T="-1092" R="206" G="203" B="152" A="255"/>
|
||||
<Vtx X="-21" Y="16" Z="-1" S="-1092" T="-922" R="197" G="170" B="72" A="255"/>
|
||||
<Vtx X="-20" Y="19" Z="-7" S="-1092" T="-1092" R="204" G="214" B="148" A="255"/>
|
||||
<Vtx X="-17" Y="21" Z="-2" S="-1092" T="-751" R="60" G="53" B="99" A="255"/>
|
||||
<Vtx X="-19" Y="30" Z="-5" S="-964" T="-751" R="63" G="42" B="102" A="255"/>
|
||||
<Vtx X="-20" Y="19" Z="-7" S="-1092" T="-580" R="204" G="214" B="148" A="255"/>
|
||||
<Vtx X="-19" Y="30" Z="-5" S="-964" T="-751" R="63" G="42" B="102" A="255"/>
|
||||
<Vtx X="-17" Y="21" Z="-2" S="-1092" T="-751" R="60" G="53" B="99" A="255"/>
|
||||
<Vtx X="-22" Y="28" Z="-10" S="-964" T="-580" R="206" G="203" B="152" A="255"/>
|
||||
<Vtx X="-10" Y="31" Z="-10" S="-836" T="-751" R="52" G="42" B="108" A="255"/>
|
||||
<Vtx X="-13" Y="28" Z="-15" S="-836" T="-580" R="196" G="203" B="157" A="255"/>
|
||||
<Vtx X="-8" Y="21" Z="-7" S="-708" T="-751" R="50" G="53" B="104" A="255"/>
|
||||
<Vtx X="-11" Y="19" Z="-12" S="-708" T="-580" R="193" G="214" B="154" A="255"/>
|
||||
<Vtx X="-5" Y="16" Z="-10" S="-708" T="-922" R="97" G="176" B="240" A="255"/>
|
||||
<Vtx X="-9" Y="33" Z="-16" S="-836" T="-922" R="59" G="86" B="184" A="255"/>
|
||||
<Vtx X="-25" Y="33" Z="-7" S="-964" T="-922" R="159" G="80" B="16" A="255"/>
|
||||
<Vtx X="-21" Y="22" Z="-4" S="-900" T="-580" R="211" G="116" B="228" A="255"/>
|
||||
<Vtx X="-20" Y="19" Z="-7" S="-772" T="-580" R="245" G="10" B="130" A="255"/>
|
||||
<Vtx X="-35" Y="-3" Z="11" S="-772" T="-708" R="176" G="167" B="213" A="255"/>
|
||||
<Vtx X="-36" Y="0" Z="14" S="-900" T="-708" R="142" G="15" B="55" A="255"/>
|
||||
<Vtx X="-31" Y="-4" Z="13" S="-772" T="-836" R="45" G="140" B="28" A="255"/>
|
||||
<Vtx X="-36" Y="0" Z="14" S="-900" T="-708" R="142" G="15" B="55" A="255"/>
|
||||
<Vtx X="-31" Y="-4" Z="13" S="-772" T="-836" R="45" G="140" B="28" A="255"/>
|
||||
<Vtx X="-32" Y="0" Z="17" S="-900" T="-836" R="11" G="246" B="126" A="255"/>
|
||||
<Vtx X="-16" Y="18" Z="-5" S="-772" T="-964" R="114" G="241" B="201" A="255"/>
|
||||
<Vtx X="-20" Y="19" Z="-7" S="-644" T="-964" R="245" G="10" B="130" A="255"/>
|
||||
<Vtx X="-35" Y="-3" Z="11" S="-644" T="-836" R="176" G="167" B="213" A="255"/>
|
||||
<Vtx X="-17" Y="21" Z="-2" S="-900" T="-964" R="80" G="89" B="43" A="255"/>
|
||||
<Vtx X="-20" Y="19" Z="-7" S="-772" T="-1092" R="245" G="10" B="130" A="255"/>
|
||||
<Vtx X="-21" Y="22" Z="-4" S="-900" T="-1092" R="211" G="116" B="228" A="255"/>
|
||||
<Vtx X="-36" Y="0" Z="14" S="-1028" T="-836" R="142" G="15" B="55" A="255"/>
|
||||
<Vtx X="-21" Y="22" Z="-4" S="-1028" T="-964" R="211" G="116" B="228" A="255"/>
|
||||
<Vtx X="-30" Y="3" Z="10" S="-900" T="-580" R="105" G="24" B="188" A="255"/>
|
||||
<Vtx X="-33" Y="0" Z="9" S="-772" T="-580" R="10" G="171" B="162" A="255"/>
|
||||
<Vtx X="-40" Y="5" Z="10" S="-772" T="-708" R="154" G="7" B="181" A="255"/>
|
||||
<Vtx X="-37" Y="9" Z="11" S="-900" T="-708" R="249" G="117" B="206" A="255"/>
|
||||
<Vtx X="-40" Y="5" Z="14" S="-772" T="-836" R="151" G="232" B="68" A="255"/>
|
||||
<Vtx X="-37" Y="9" Z="11" S="-900" T="-708" R="249" G="117" B="206" A="255"/>
|
||||
<Vtx X="-40" Y="5" Z="14" S="-772" T="-836" R="151" G="232" B="68" A="255"/>
|
||||
<Vtx X="-37" Y="8" Z="15" S="-900" T="-836" R="246" G="85" B="94" A="255"/>
|
||||
<Vtx X="-33" Y="-1" Z="13" S="-772" T="-964" R="7" G="139" B="50" A="255"/>
|
||||
<Vtx X="-33" Y="0" Z="9" S="-644" T="-964" R="10" G="171" B="162" A="255"/>
|
||||
<Vtx X="-40" Y="5" Z="10" S="-644" T="-836" R="154" G="7" B="181" A="255"/>
|
||||
<Vtx X="-30" Y="2" Z="14" S="-900" T="-964" R="102" G="249" B="75" A="255"/>
|
||||
<Vtx X="-33" Y="0" Z="9" S="-772" T="-1092" R="10" G="171" B="162" A="255"/>
|
||||
<Vtx X="-30" Y="3" Z="10" S="-900" T="-1092" R="105" G="24" B="188" A="255"/>
|
||||
<Vtx X="-37" Y="9" Z="11" S="-1028" T="-836" R="249" G="117" B="206" A="255"/>
|
||||
<Vtx X="-30" Y="3" Z="10" S="-1028" T="-964" R="105" G="24" B="188" A="255"/>
|
||||
<Vtx X="-28" Y="7" Z="7" S="-900" T="-580" R="105" G="24" B="188" A="255"/>
|
||||
<Vtx X="-30" Y="4" Z="6" S="-772" T="-580" R="10" G="171" B="162" A="255"/>
|
||||
<Vtx X="-35" Y="9" Z="7" S="-772" T="-708" R="154" G="7" B="181" A="255"/>
|
||||
<Vtx X="-33" Y="11" Z="8" S="-900" T="-708" R="249" G="117" B="206" A="255"/>
|
||||
<Vtx X="-35" Y="8" Z="10" S="-772" T="-836" R="151" G="232" B="68" A="255"/>
|
||||
<Vtx X="-33" Y="11" Z="8" S="-900" T="-708" R="249" G="117" B="206" A="255"/>
|
||||
<Vtx X="-35" Y="8" Z="10" S="-772" T="-836" R="151" G="232" B="68" A="255"/>
|
||||
<Vtx X="-33" Y="11" Z="11" S="-900" T="-836" R="246" G="85" B="94" A="255"/>
|
||||
<Vtx X="-30" Y="4" Z="9" S="-772" T="-964" R="7" G="139" B="50" A="255"/>
|
||||
<Vtx X="-30" Y="4" Z="6" S="-644" T="-964" R="10" G="171" B="162" A="255"/>
|
||||
<Vtx X="-35" Y="9" Z="7" S="-644" T="-836" R="154" G="7" B="181" A="255"/>
|
||||
<Vtx X="-28" Y="6" Z="10" S="-900" T="-964" R="102" G="249" B="75" A="255"/>
|
||||
<Vtx X="-30" Y="4" Z="6" S="-772" T="-1092" R="10" G="171" B="162" A="255"/>
|
||||
<Vtx X="-28" Y="7" Z="7" S="-900" T="-1092" R="105" G="24" B="188" A="255"/>
|
||||
<Vtx X="-33" Y="11" Z="8" S="-1028" T="-836" R="249" G="117" B="206" A="255"/>
|
||||
<Vtx X="-28" Y="7" Z="7" S="-1028" T="-964" R="105" G="24" B="188" A="255"/>
|
||||
<Vtx X="-24" Y="12" Z="2" S="-900" T="-580" R="105" G="24" B="188" A="255"/>
|
||||
<Vtx X="-27" Y="9" Z="1" S="-772" T="-580" R="10" G="171" B="162" A="255"/>
|
||||
<Vtx X="-35" Y="15" Z="2" S="-772" T="-708" R="154" G="7" B="181" A="255"/>
|
||||
<Vtx X="-32" Y="19" Z="3" S="-900" T="-708" R="249" G="117" B="206" A="255"/>
|
||||
<Vtx X="-35" Y="14" Z="7" S="-772" T="-836" R="151" G="232" B="68" A="255"/>
|
||||
<Vtx X="-32" Y="19" Z="3" S="-900" T="-708" R="249" G="117" B="206" A="255"/>
|
||||
<Vtx X="-35" Y="14" Z="7" S="-772" T="-836" R="151" G="232" B="68" A="255"/>
|
||||
<Vtx X="-32" Y="18" Z="8" S="-900" T="-836" R="246" G="85" B="94" A="255"/>
|
||||
<Vtx X="-27" Y="8" Z="6" S="-772" T="-964" R="7" G="139" B="50" A="255"/>
|
||||
<Vtx X="-27" Y="9" Z="1" S="-644" T="-964" R="10" G="171" B="162" A="255"/>
|
||||
<Vtx X="-35" Y="15" Z="2" S="-644" T="-836" R="154" G="7" B="181" A="255"/>
|
||||
<Vtx X="-24" Y="11" Z="7" S="-900" T="-964" R="102" G="249" B="75" A="255"/>
|
||||
<Vtx X="-27" Y="9" Z="1" S="-772" T="-1092" R="10" G="171" B="162" A="255"/>
|
||||
<Vtx X="-24" Y="12" Z="2" S="-900" T="-1092" R="105" G="24" B="188" A="255"/>
|
||||
<Vtx X="-32" Y="19" Z="3" S="-1028" T="-836" R="249" G="117" B="206" A="255"/>
|
||||
<Vtx X="-24" Y="12" Z="2" S="-1028" T="-964" R="105" G="24" B="188" A="255"/>
|
||||
</Vertex>
|
@ -0,0 +1,20 @@
|
||||
<DisplayList Version="0">
|
||||
<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_ENVIRONMENT" D1="G_CCMUX_0" Aa1="G_ACMUX_0" Ab1="G_ACMUX_0" Ac1="G_ACMUX_0" Ad1="G_ACMUX_COMBINED"/>
|
||||
<SetGeometryMode G_ZBUFFER="1" G_SHADE="1" G_CULL_BACK="1" G_FOG="1" G_LIGHTING="1" G_TEXTURE_GEN="1" G_SHADING_SMOOTH="1" />
|
||||
<ClearGeometryMode G_CULL_FRONT="1" G_TEXTURE_GEN_LINEAR="1" />
|
||||
<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_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="960" T="960" Level="0" Tile="0" On="1"/>
|
||||
<SetTextureLUT Mode="G_TT_NONE"/>
|
||||
<TileSync/>
|
||||
<SetTextureImage Path="objects/object_housekey/Hilite_new" 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="4" ShiftS="0" MaskT="4" ShiftT="0"/>
|
||||
<LoadSync/>
|
||||
<LoadBlock Tile="7" Uls="0" Ult="0" Lrs="255" Dxt="512"/>
|
||||
<PipeSync/>
|
||||
<SetTile Format="G_IM_FMT_RGBA" Size="G_IM_SIZ_16b" Line="4" TMem="0" Tile="0" Palette="0" Cms0="G_TX_WRAP" Cms1="G_TX_NOMIRROR" Cmt0="G_TX_WRAP" Cmt1="G_TX_NOMIRROR" MaskS="4" ShiftS="0" MaskT="4" ShiftT="0"/>
|
||||
<SetTileSize T="0" Uls="0" Ult="0" Lrs="60" Lrt="60"/>
|
||||
<EndDisplayList/>
|
||||
</DisplayList>
|
||||
|
@ -0,0 +1,21 @@
|
||||
<DisplayList Version="0">
|
||||
<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"/>
|
||||
<SetGeometryMode G_ZBUFFER="1" G_SHADE="1" G_CULL_BACK="1" G_FOG="1" G_LIGHTING="1" G_TEXTURE_GEN="1" G_SHADING_SMOOTH="1" />
|
||||
<ClearGeometryMode G_CULL_FRONT="1" G_TEXTURE_GEN_LINEAR="1" />
|
||||
<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_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="960" T="960" Level="0" Tile="0" On="1"/>
|
||||
<SetTextureLUT Mode="G_TT_NONE"/>
|
||||
<TileSync/>
|
||||
<SetTextureImage Path="objects/object_housekey/Hilite_new" 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="4" ShiftS="0" MaskT="4" ShiftT="0"/>
|
||||
<LoadSync/>
|
||||
<LoadBlock Tile="7" Uls="0" Ult="0" Lrs="255" Dxt="512"/>
|
||||
<PipeSync/>
|
||||
<SetTile Format="G_IM_FMT_RGBA" Size="G_IM_SIZ_16b" Line="4" TMem="0" Tile="0" Palette="0" Cms0="G_TX_WRAP" Cms1="G_TX_NOMIRROR" Cmt0="G_TX_WRAP" Cmt1="G_TX_NOMIRROR" MaskS="4" ShiftS="0" MaskT="4" ShiftT="0"/>
|
||||
<SetTileSize T="0" Uls="0" Ult="0" Lrs="60" Lrt="60"/>
|
||||
<SetPrimColor M="0" L="0" R="255" G="255" B="218" A="255"/>
|
||||
<EndDisplayList/>
|
||||
</DisplayList>
|
||||
|
@ -0,0 +1,21 @@
|
||||
<DisplayList Version="0">
|
||||
<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"/>
|
||||
<SetGeometryMode G_ZBUFFER="1" G_SHADE="1" G_CULL_BACK="1" G_FOG="1" G_LIGHTING="1" G_SHADING_SMOOTH="1" />
|
||||
<ClearGeometryMode G_CULL_FRONT="1" G_TEXTURE_GEN="1" G_TEXTURE_GEN_LINEAR="1" />
|
||||
<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_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"/>
|
||||
<SetTextureLUT Mode="G_TT_NONE"/>
|
||||
<TileSync/>
|
||||
<SetTextureImage Path="objects/object_housekey/HouseKey_Tag" 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="6" ShiftS="0" MaskT="6" ShiftT="0"/>
|
||||
<LoadSync/>
|
||||
<LoadBlock Tile="7" Uls="0" Ult="0" Lrs="4095" Dxt="128"/>
|
||||
<PipeSync/>
|
||||
<SetTile Format="G_IM_FMT_RGBA" Size="G_IM_SIZ_16b" Line="16" TMem="0" Tile="0" Palette="0" Cms0="G_TX_WRAP" Cms1="G_TX_NOMIRROR" Cmt0="G_TX_WRAP" Cmt1="G_TX_NOMIRROR" MaskS="6" ShiftS="0" MaskT="6" ShiftT="0"/>
|
||||
<SetTileSize T="0" Uls="0" Ult="0" Lrs="252" Lrt="252"/>
|
||||
<SetPrimColor M="0" L="0" R="255" G="255" B="255" A="255"/>
|
||||
<EndDisplayList/>
|
||||
</DisplayList>
|
||||
|
@ -237,6 +237,9 @@ static const ALIGN_ASSET(2) char gKeyringKeysShadowTempleMQDL[] = dgKeyringKeysS
|
||||
#define dgKeyringKeysGanonsCastleMQDL "__OTR__objects/object_keyring/gKeyringKeysGanonsCastleMQDL"
|
||||
static const ALIGN_ASSET(2) char gKeyringKeysGanonsCastleMQDL[] = dgKeyringKeysGanonsCastleMQDL;
|
||||
|
||||
#define dgHouseKeyDL "__OTR__objects/object_housekey/gHouseKeyDL"
|
||||
static const ALIGN_ASSET(2) char gHouseKeyDL[] = dgHouseKeyDL;
|
||||
|
||||
// overlays
|
||||
#define dgOptionsDividerChangeLangVtx "__OTR__overlays/ovl_file_choose/gOptionsDividerChangeLangVtx"
|
||||
static const ALIGN_ASSET(2) char gOptionsDividerChangeLangVtx[] = dgOptionsDividerChangeLangVtx;
|
||||
|
@ -13,7 +13,7 @@ std::array<std::string, LANGUAGE_MAX> RandomizerSettingsMenuText[RSM_MAX] = {
|
||||
// German
|
||||
"Start Randomizer",
|
||||
// French
|
||||
"Start Randomizer",
|
||||
"Commencer le Randomizer",
|
||||
},
|
||||
{
|
||||
// English
|
||||
@ -21,7 +21,7 @@ std::array<std::string, LANGUAGE_MAX> RandomizerSettingsMenuText[RSM_MAX] = {
|
||||
// German
|
||||
"Generate New Randomizer Seed",
|
||||
// French
|
||||
"Generate New Randomizer Seed",
|
||||
"Générer une nouvelle seed pour le Randomizer",
|
||||
},
|
||||
{
|
||||
// English
|
||||
@ -29,7 +29,7 @@ std::array<std::string, LANGUAGE_MAX> RandomizerSettingsMenuText[RSM_MAX] = {
|
||||
// German
|
||||
"Open Randomizer Settings",
|
||||
// French
|
||||
"Open Randomizer Settings",
|
||||
"Ouvrir les paramètres du Randomizer",
|
||||
},
|
||||
{
|
||||
// English
|
||||
@ -37,7 +37,7 @@ std::array<std::string, LANGUAGE_MAX> RandomizerSettingsMenuText[RSM_MAX] = {
|
||||
// German
|
||||
"Generating...",
|
||||
// French
|
||||
"Generating...",
|
||||
"Génération en cours...",
|
||||
},
|
||||
{
|
||||
// English
|
||||
|
@ -196,7 +196,6 @@ void TimeDisplayWindow::Draw() {
|
||||
uint16_t textureIndex = 0;
|
||||
|
||||
for (size_t i = 0; i < textLength; i++) {
|
||||
ImVec2 originalCursorPos = ImGui::GetCursorPos();
|
||||
if (textToDecode[i] == ':' || textToDecode[i] == '.') {
|
||||
textureIndex = 10;
|
||||
} else {
|
||||
|
@ -46,13 +46,6 @@ void SohInputEditorWindow::InitElement() {
|
||||
addButtonName(BTN_DLEFT, "D-pad left");
|
||||
addButtonName(BTN_DRIGHT, "D-pad right");
|
||||
addButtonName(0, "None");
|
||||
|
||||
mDeviceIndexVisiblity.clear();
|
||||
mDeviceIndexVisiblity[Ship::ShipDeviceIndex::Keyboard] = true;
|
||||
mDeviceIndexVisiblity[Ship::ShipDeviceIndex::Blue] = true;
|
||||
for (auto index = 1; index < Ship::ShipDeviceIndex::Max; index++) {
|
||||
mDeviceIndexVisiblity[static_cast<Ship::ShipDeviceIndex>(index)] = false;
|
||||
}
|
||||
}
|
||||
|
||||
#define INPUT_EDITOR_WINDOW_GAME_INPUT_BLOCK_ID 95237929
|
||||
@ -176,6 +169,9 @@ void SohInputEditorWindow::DrawAnalogPreview(const char* label, ImVec2 stick, fl
|
||||
#define BUTTON_COLOR_KEYBOARD_BEIGE ImVec4(0.651f, 0.482f, 0.357f, 0.5f)
|
||||
#define BUTTON_COLOR_KEYBOARD_BEIGE_HOVERED ImVec4(0.651f, 0.482f, 0.357f, 1.0f)
|
||||
|
||||
#define BUTTON_COLOR_MOUSE_BEIGE ImVec4(0.5f, 0.5f, 0.5f, 0.5f)
|
||||
#define BUTTON_COLOR_MOUSE_BEIGE_HOVERED ImVec4(0.5f, 0.5f, 0.5f, 1.0f)
|
||||
|
||||
#define BUTTON_COLOR_GAMEPAD_BLUE ImVec4(0.0f, 0.255f, 0.976f, 0.5f)
|
||||
#define BUTTON_COLOR_GAMEPAD_BLUE_HOVERED ImVec4(0.0f, 0.255f, 0.976f, 1.0f)
|
||||
|
||||
@ -191,29 +187,21 @@ void SohInputEditorWindow::DrawAnalogPreview(const char* label, ImVec2 stick, fl
|
||||
#define BUTTON_COLOR_GAMEPAD_PURPLE ImVec4(0.431f, 0.369f, 0.706f, 0.5f)
|
||||
#define BUTTON_COLOR_GAMEPAD_PURPLE_HOVERED ImVec4(0.431f, 0.369f, 0.706f, 1.0f)
|
||||
|
||||
void SohInputEditorWindow::GetButtonColorsForLUSDeviceIndex(Ship::ShipDeviceIndex lusIndex, ImVec4& buttonColor,
|
||||
void SohInputEditorWindow::GetButtonColorsForDeviceType(Ship::PhysicalDeviceType lusIndex, ImVec4& buttonColor,
|
||||
ImVec4& buttonHoveredColor) {
|
||||
switch (lusIndex) {
|
||||
case Ship::ShipDeviceIndex::Keyboard:
|
||||
case Ship::PhysicalDeviceType::Keyboard:
|
||||
buttonColor = BUTTON_COLOR_KEYBOARD_BEIGE;
|
||||
buttonHoveredColor = BUTTON_COLOR_KEYBOARD_BEIGE_HOVERED;
|
||||
break;
|
||||
case Ship::ShipDeviceIndex::Blue:
|
||||
case Ship::PhysicalDeviceType::Mouse:
|
||||
buttonColor = BUTTON_COLOR_MOUSE_BEIGE;
|
||||
buttonHoveredColor = BUTTON_COLOR_MOUSE_BEIGE_HOVERED;
|
||||
break;
|
||||
case Ship::PhysicalDeviceType::SDLGamepad:
|
||||
buttonColor = BUTTON_COLOR_GAMEPAD_BLUE;
|
||||
buttonHoveredColor = BUTTON_COLOR_GAMEPAD_BLUE_HOVERED;
|
||||
break;
|
||||
case Ship::ShipDeviceIndex::Red:
|
||||
buttonColor = BUTTON_COLOR_GAMEPAD_RED;
|
||||
buttonHoveredColor = BUTTON_COLOR_GAMEPAD_RED_HOVERED;
|
||||
break;
|
||||
case Ship::ShipDeviceIndex::Orange:
|
||||
buttonColor = BUTTON_COLOR_GAMEPAD_ORANGE;
|
||||
buttonHoveredColor = BUTTON_COLOR_GAMEPAD_ORANGE_HOVERED;
|
||||
break;
|
||||
case Ship::ShipDeviceIndex::Green:
|
||||
buttonColor = BUTTON_COLOR_GAMEPAD_GREEN;
|
||||
buttonHoveredColor = BUTTON_COLOR_GAMEPAD_GREEN_HOVERED;
|
||||
break;
|
||||
default:
|
||||
buttonColor = BUTTON_COLOR_GAMEPAD_PURPLE;
|
||||
buttonHoveredColor = BUTTON_COLOR_GAMEPAD_PURPLE_HOVERED;
|
||||
@ -266,9 +254,6 @@ void SohInputEditorWindow::DrawButtonLineEditMappingButton(uint8_t port, N64Butt
|
||||
if (mapping == nullptr) {
|
||||
return;
|
||||
}
|
||||
if (!mDeviceIndexVisiblity[mapping->GetShipDeviceIndex()]) {
|
||||
return;
|
||||
}
|
||||
|
||||
ImGui::PushStyleVar(ImGuiStyleVar_ButtonTextAlign, ImVec2(0.0f, 0.5f));
|
||||
std::string icon = "";
|
||||
@ -287,7 +272,7 @@ void SohInputEditorWindow::DrawButtonLineEditMappingButton(uint8_t port, N64Butt
|
||||
auto buttonHoveredColor = ImGui::GetStyleColorVec4(ImGuiCol_ButtonHovered);
|
||||
auto physicalInputDisplayName =
|
||||
StringHelper::Sprintf("%s %s", icon.c_str(), mapping->GetPhysicalInputName().c_str());
|
||||
GetButtonColorsForLUSDeviceIndex(mapping->GetShipDeviceIndex(), buttonColor, buttonHoveredColor);
|
||||
GetButtonColorsForDeviceType(mapping->GetPhysicalDeviceType(), buttonColor, buttonHoveredColor);
|
||||
ImGui::PushStyleColor(ImGuiCol_Button, buttonColor);
|
||||
ImGui::PushStyleColor(ImGuiCol_ButtonHovered, buttonHoveredColor);
|
||||
auto popupId = StringHelper::Sprintf("editButtonMappingPopup##%s", id.c_str());
|
||||
@ -324,19 +309,12 @@ void SohInputEditorWindow::DrawButtonLineEditMappingButton(uint8_t port, N64Butt
|
||||
ImGui::PopStyleVar();
|
||||
ImGui::SameLine(0, 0);
|
||||
|
||||
#ifndef __WIIU__
|
||||
auto sdlAxisDirectionToButtonMapping = std::dynamic_pointer_cast<Ship::SDLAxisDirectionToButtonMapping>(mapping);
|
||||
auto indexMapping = Ship::Context::GetInstance()
|
||||
->GetControlDeck()
|
||||
->GetDeviceIndexMappingManager()
|
||||
->GetDeviceIndexMappingFromShipDeviceIndex(mapping->GetShipDeviceIndex());
|
||||
auto sdlIndexMapping = std::dynamic_pointer_cast<Ship::ShipDeviceIndexToSDLDeviceIndexMapping>(indexMapping);
|
||||
|
||||
if (sdlIndexMapping != nullptr && sdlAxisDirectionToButtonMapping != nullptr) {
|
||||
if (sdlAxisDirectionToButtonMapping != nullptr) {
|
||||
ImGui::PushStyleVar(ImGuiStyleVar_ButtonTextAlign, ImVec2(0.0f, 0.5f));
|
||||
auto buttonColor = ImGui::GetStyleColorVec4(ImGuiCol_Button);
|
||||
auto buttonHoveredColor = ImGui::GetStyleColorVec4(ImGuiCol_ButtonHovered);
|
||||
GetButtonColorsForLUSDeviceIndex(mapping->GetShipDeviceIndex(), buttonColor, buttonHoveredColor);
|
||||
GetButtonColorsForDeviceType(mapping->GetPhysicalDeviceType(), buttonColor, buttonHoveredColor);
|
||||
ImGui::PushStyleColor(ImGuiCol_Button, buttonColor);
|
||||
ImGui::PushStyleColor(ImGuiCol_ButtonHovered, buttonHoveredColor);
|
||||
ImGui::PushStyleVar(ImGuiStyleVar_ButtonTextAlign, ImVec2(1.0f, 0.5f));
|
||||
@ -357,17 +335,19 @@ void SohInputEditorWindow::DrawButtonLineEditMappingButton(uint8_t port, N64Butt
|
||||
ImGui::Text("Axis Threshold\n\nThe extent to which the joystick\nmust be moved or the trigger\npressed to "
|
||||
"initiate the assigned\nbutton action.\n\n");
|
||||
|
||||
auto globalSettings = Ship::Context::GetInstance()->GetControlDeck()->GetGlobalSDLDeviceSettings();
|
||||
|
||||
if (sdlAxisDirectionToButtonMapping->AxisIsStick()) {
|
||||
ImGui::Text("Stick axis threshold:");
|
||||
|
||||
int32_t stickAxisThreshold = sdlIndexMapping->GetStickAxisThresholdPercentage();
|
||||
int32_t stickAxisThreshold = globalSettings->GetStickAxisThresholdPercentage();
|
||||
if (stickAxisThreshold == 0) {
|
||||
ImGui::BeginDisabled();
|
||||
}
|
||||
ImGui::PushButtonRepeat(true);
|
||||
if (ImGui::Button(StringHelper::Sprintf("-##Stick Axis Threshold%s", id.c_str()).c_str())) {
|
||||
sdlIndexMapping->SetStickAxisThresholdPercentage(stickAxisThreshold - 1);
|
||||
sdlIndexMapping->SaveToConfig();
|
||||
globalSettings->SetStickAxisThresholdPercentage(stickAxisThreshold - 1);
|
||||
globalSettings->SaveToConfig();
|
||||
}
|
||||
ImGui::PopButtonRepeat();
|
||||
if (stickAxisThreshold == 0) {
|
||||
@ -377,8 +357,8 @@ void SohInputEditorWindow::DrawButtonLineEditMappingButton(uint8_t port, N64Butt
|
||||
ImGui::SetNextItemWidth(SCALE_IMGUI_SIZE(160.0f));
|
||||
if (ImGui::SliderInt(StringHelper::Sprintf("##Stick Axis Threshold%s", id.c_str()).c_str(),
|
||||
&stickAxisThreshold, 0, 100, "%d%%", ImGuiSliderFlags_AlwaysClamp)) {
|
||||
sdlIndexMapping->SetStickAxisThresholdPercentage(stickAxisThreshold);
|
||||
sdlIndexMapping->SaveToConfig();
|
||||
globalSettings->SetStickAxisThresholdPercentage(stickAxisThreshold);
|
||||
globalSettings->SaveToConfig();
|
||||
}
|
||||
ImGui::SameLine(0.0f, 0.0f);
|
||||
if (stickAxisThreshold == 100) {
|
||||
@ -386,8 +366,8 @@ void SohInputEditorWindow::DrawButtonLineEditMappingButton(uint8_t port, N64Butt
|
||||
}
|
||||
ImGui::PushButtonRepeat(true);
|
||||
if (ImGui::Button(StringHelper::Sprintf("+##Stick Axis Threshold%s", id.c_str()).c_str())) {
|
||||
sdlIndexMapping->SetStickAxisThresholdPercentage(stickAxisThreshold + 1);
|
||||
sdlIndexMapping->SaveToConfig();
|
||||
globalSettings->SetStickAxisThresholdPercentage(stickAxisThreshold + 1);
|
||||
globalSettings->SaveToConfig();
|
||||
}
|
||||
ImGui::PopButtonRepeat();
|
||||
if (stickAxisThreshold == 100) {
|
||||
@ -398,14 +378,14 @@ void SohInputEditorWindow::DrawButtonLineEditMappingButton(uint8_t port, N64Butt
|
||||
if (sdlAxisDirectionToButtonMapping->AxisIsTrigger()) {
|
||||
ImGui::Text("Trigger axis threshold:");
|
||||
|
||||
int32_t triggerAxisThreshold = sdlIndexMapping->GetTriggerAxisThresholdPercentage();
|
||||
int32_t triggerAxisThreshold = globalSettings->GetTriggerAxisThresholdPercentage();
|
||||
if (triggerAxisThreshold == 0) {
|
||||
ImGui::BeginDisabled();
|
||||
}
|
||||
ImGui::PushButtonRepeat(true);
|
||||
if (ImGui::Button(StringHelper::Sprintf("-##Trigger Axis Threshold%s", id.c_str()).c_str())) {
|
||||
sdlIndexMapping->SetTriggerAxisThresholdPercentage(triggerAxisThreshold - 1);
|
||||
sdlIndexMapping->SaveToConfig();
|
||||
globalSettings->SetTriggerAxisThresholdPercentage(triggerAxisThreshold - 1);
|
||||
globalSettings->SaveToConfig();
|
||||
}
|
||||
ImGui::PopButtonRepeat();
|
||||
if (triggerAxisThreshold == 0) {
|
||||
@ -415,8 +395,8 @@ void SohInputEditorWindow::DrawButtonLineEditMappingButton(uint8_t port, N64Butt
|
||||
ImGui::SetNextItemWidth(SCALE_IMGUI_SIZE(160.0f));
|
||||
if (ImGui::SliderInt(StringHelper::Sprintf("##Trigger Axis Threshold%s", id.c_str()).c_str(),
|
||||
&triggerAxisThreshold, 0, 100, "%d%%", ImGuiSliderFlags_AlwaysClamp)) {
|
||||
sdlIndexMapping->SetTriggerAxisThresholdPercentage(triggerAxisThreshold);
|
||||
sdlIndexMapping->SaveToConfig();
|
||||
globalSettings->SetTriggerAxisThresholdPercentage(triggerAxisThreshold);
|
||||
globalSettings->SaveToConfig();
|
||||
}
|
||||
ImGui::SameLine(0.0f, 0.0f);
|
||||
if (triggerAxisThreshold == 100) {
|
||||
@ -424,8 +404,8 @@ void SohInputEditorWindow::DrawButtonLineEditMappingButton(uint8_t port, N64Butt
|
||||
}
|
||||
ImGui::PushButtonRepeat(true);
|
||||
if (ImGui::Button(StringHelper::Sprintf("+##Trigger Axis Threshold%s", id.c_str()).c_str())) {
|
||||
sdlIndexMapping->SetTriggerAxisThresholdPercentage(triggerAxisThreshold + 1);
|
||||
sdlIndexMapping->SaveToConfig();
|
||||
globalSettings->SetTriggerAxisThresholdPercentage(triggerAxisThreshold + 1);
|
||||
globalSettings->SaveToConfig();
|
||||
}
|
||||
ImGui::PopButtonRepeat();
|
||||
if (triggerAxisThreshold == 100) {
|
||||
@ -444,7 +424,6 @@ void SohInputEditorWindow::DrawButtonLineEditMappingButton(uint8_t port, N64Butt
|
||||
ImGui::PopStyleVar();
|
||||
ImGui::SameLine(0, 0);
|
||||
}
|
||||
#endif
|
||||
|
||||
ImGui::PushStyleColor(ImGuiCol_Button, buttonColor);
|
||||
ImGui::PushStyleColor(ImGuiCol_ButtonHovered, buttonHoveredColor);
|
||||
@ -539,9 +518,6 @@ void SohInputEditorWindow::DrawStickDirectionLineEditMappingButton(uint8_t port,
|
||||
if (mapping == nullptr) {
|
||||
return;
|
||||
}
|
||||
if (!mDeviceIndexVisiblity[mapping->GetShipDeviceIndex()]) {
|
||||
return;
|
||||
}
|
||||
|
||||
ImGui::PushStyleVar(ImGuiStyleVar_ButtonTextAlign, ImVec2(0.0f, 0.5f));
|
||||
std::string icon = "";
|
||||
@ -560,7 +536,7 @@ void SohInputEditorWindow::DrawStickDirectionLineEditMappingButton(uint8_t port,
|
||||
auto buttonHoveredColor = ImGui::GetStyleColorVec4(ImGuiCol_ButtonHovered);
|
||||
auto physicalInputDisplayName =
|
||||
StringHelper::Sprintf("%s %s", icon.c_str(), mapping->GetPhysicalInputName().c_str());
|
||||
GetButtonColorsForLUSDeviceIndex(mapping->GetShipDeviceIndex(), buttonColor, buttonHoveredColor);
|
||||
GetButtonColorsForDeviceType(mapping->GetPhysicalDeviceType(), buttonColor, buttonHoveredColor);
|
||||
ImGui::PushStyleColor(ImGuiCol_Button, buttonColor);
|
||||
ImGui::PushStyleColor(ImGuiCol_ButtonHovered, buttonHoveredColor);
|
||||
auto popupId = StringHelper::Sprintf("editStickDirectionMappingPopup##%s", id.c_str());
|
||||
@ -885,7 +861,7 @@ void SohInputEditorWindow::DrawRumbleSection(uint8_t port) {
|
||||
ImGui::SetNextItemOpen(true, ImGuiCond_Once);
|
||||
auto buttonColor = ImGui::GetStyleColorVec4(ImGuiCol_Button);
|
||||
auto buttonHoveredColor = ImGui::GetStyleColorVec4(ImGuiCol_ButtonHovered);
|
||||
GetButtonColorsForLUSDeviceIndex(mapping->GetShipDeviceIndex(), buttonColor, buttonHoveredColor);
|
||||
GetButtonColorsForDeviceType(mapping->GetPhysicalDeviceType(), buttonColor, buttonHoveredColor);
|
||||
// begin hackaround https://github.com/ocornut/imgui/issues/282#issuecomment-123763192
|
||||
// spaces to have background color for text in a tree node
|
||||
std::string spaces = "";
|
||||
@ -1256,209 +1232,6 @@ void SohInputEditorWindow::DrawGyroSection(uint8_t port) {
|
||||
}
|
||||
}
|
||||
|
||||
void SohInputEditorWindow::DrawButtonDeviceIcons(uint8_t portIndex, std::set<N64ButtonMask> bitmasks) {
|
||||
std::set<Ship::ShipDeviceIndex> allLusDeviceIndices;
|
||||
allLusDeviceIndices.insert(Ship::ShipDeviceIndex::Keyboard);
|
||||
for (auto [lusIndex, mapping] : Ship::Context::GetInstance()
|
||||
->GetControlDeck()
|
||||
->GetDeviceIndexMappingManager()
|
||||
->GetAllDeviceIndexMappingsFromConfig()) {
|
||||
allLusDeviceIndices.insert(lusIndex);
|
||||
}
|
||||
|
||||
std::vector<std::pair<Ship::ShipDeviceIndex, bool>> lusDeviceIndiciesWithMappings;
|
||||
for (auto lusIndex : allLusDeviceIndices) {
|
||||
for (auto [bitmask, button] :
|
||||
Ship::Context::GetInstance()->GetControlDeck()->GetControllerByPort(portIndex)->GetAllButtons()) {
|
||||
if (!bitmasks.contains(bitmask)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (button->HasMappingsForShipDeviceIndex(lusIndex)) {
|
||||
for (auto [id, mapping] : button->GetAllButtonMappings()) {
|
||||
if (mapping->GetShipDeviceIndex() == lusIndex) {
|
||||
lusDeviceIndiciesWithMappings.push_back(
|
||||
std::pair<Ship::ShipDeviceIndex, bool>(lusIndex, mapping->PhysicalDeviceIsConnected()));
|
||||
break;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (auto [lusIndex, connected] : lusDeviceIndiciesWithMappings) {
|
||||
auto buttonColor = ImGui::GetStyleColorVec4(ImGuiCol_Button);
|
||||
auto buttonHoveredColor = ImGui::GetStyleColorVec4(ImGuiCol_ButtonHovered);
|
||||
GetButtonColorsForLUSDeviceIndex(lusIndex, buttonColor, buttonHoveredColor);
|
||||
ImGui::PushStyleColor(ImGuiCol_Button, buttonColor);
|
||||
ImGui::PushStyleColor(ImGuiCol_ButtonHovered, buttonHoveredColor);
|
||||
ImGui::SameLine();
|
||||
if (lusIndex == Ship::ShipDeviceIndex::Keyboard) {
|
||||
ImGui::SmallButton(ICON_FA_KEYBOARD_O);
|
||||
} else {
|
||||
ImGui::SmallButton(connected ? ICON_FA_GAMEPAD : ICON_FA_CHAIN_BROKEN);
|
||||
}
|
||||
ImGui::PopStyleColor();
|
||||
ImGui::PopStyleColor();
|
||||
}
|
||||
}
|
||||
|
||||
void SohInputEditorWindow::DrawAnalogStickDeviceIcons(uint8_t portIndex, Ship::StickIndex stickIndex) {
|
||||
std::set<Ship::ShipDeviceIndex> allLusDeviceIndices;
|
||||
allLusDeviceIndices.insert(Ship::ShipDeviceIndex::Keyboard);
|
||||
for (auto [lusIndex, mapping] : Ship::Context::GetInstance()
|
||||
->GetControlDeck()
|
||||
->GetDeviceIndexMappingManager()
|
||||
->GetAllDeviceIndexMappingsFromConfig()) {
|
||||
allLusDeviceIndices.insert(lusIndex);
|
||||
}
|
||||
|
||||
std::vector<std::pair<Ship::ShipDeviceIndex, bool>> lusDeviceIndiciesWithMappings;
|
||||
for (auto lusIndex : allLusDeviceIndices) {
|
||||
auto controllerStick =
|
||||
stickIndex == Ship::StickIndex::LEFT_STICK
|
||||
? Ship::Context::GetInstance()->GetControlDeck()->GetControllerByPort(portIndex)->GetLeftStick()
|
||||
: Ship::Context::GetInstance()->GetControlDeck()->GetControllerByPort(portIndex)->GetRightStick();
|
||||
if (controllerStick->HasMappingsForShipDeviceIndex(lusIndex)) {
|
||||
for (auto [direction, mappings] : controllerStick->GetAllAxisDirectionMappings()) {
|
||||
bool foundMapping = false;
|
||||
for (auto [id, mapping] : mappings) {
|
||||
if (mapping->GetShipDeviceIndex() == lusIndex) {
|
||||
foundMapping = true;
|
||||
lusDeviceIndiciesWithMappings.push_back(
|
||||
std::pair<Ship::ShipDeviceIndex, bool>(lusIndex, mapping->PhysicalDeviceIsConnected()));
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (foundMapping) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (auto [lusIndex, connected] : lusDeviceIndiciesWithMappings) {
|
||||
auto buttonColor = ImGui::GetStyleColorVec4(ImGuiCol_Button);
|
||||
auto buttonHoveredColor = ImGui::GetStyleColorVec4(ImGuiCol_ButtonHovered);
|
||||
GetButtonColorsForLUSDeviceIndex(lusIndex, buttonColor, buttonHoveredColor);
|
||||
ImGui::PushStyleColor(ImGuiCol_Button, buttonColor);
|
||||
ImGui::PushStyleColor(ImGuiCol_ButtonHovered, buttonHoveredColor);
|
||||
ImGui::SameLine();
|
||||
if (lusIndex == Ship::ShipDeviceIndex::Keyboard) {
|
||||
ImGui::SmallButton(ICON_FA_KEYBOARD_O);
|
||||
} else {
|
||||
ImGui::SmallButton(connected ? ICON_FA_GAMEPAD : ICON_FA_CHAIN_BROKEN);
|
||||
}
|
||||
ImGui::PopStyleColor();
|
||||
ImGui::PopStyleColor();
|
||||
}
|
||||
}
|
||||
|
||||
void SohInputEditorWindow::DrawRumbleDeviceIcons(uint8_t portIndex) {
|
||||
std::set<Ship::ShipDeviceIndex> allLusDeviceIndices;
|
||||
for (auto [lusIndex, mapping] : Ship::Context::GetInstance()
|
||||
->GetControlDeck()
|
||||
->GetDeviceIndexMappingManager()
|
||||
->GetAllDeviceIndexMappingsFromConfig()) {
|
||||
allLusDeviceIndices.insert(lusIndex);
|
||||
}
|
||||
|
||||
std::vector<std::pair<Ship::ShipDeviceIndex, bool>> lusDeviceIndiciesWithMappings;
|
||||
for (auto lusIndex : allLusDeviceIndices) {
|
||||
if (Ship::Context::GetInstance()
|
||||
->GetControlDeck()
|
||||
->GetControllerByPort(portIndex)
|
||||
->GetRumble()
|
||||
->HasMappingsForShipDeviceIndex(lusIndex)) {
|
||||
for (auto [id, mapping] : Ship::Context::GetInstance()
|
||||
->GetControlDeck()
|
||||
->GetControllerByPort(portIndex)
|
||||
->GetRumble()
|
||||
->GetAllRumbleMappings()) {
|
||||
if (mapping->GetShipDeviceIndex() == lusIndex) {
|
||||
lusDeviceIndiciesWithMappings.push_back(
|
||||
std::pair<Ship::ShipDeviceIndex, bool>(lusIndex, mapping->PhysicalDeviceIsConnected()));
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (auto [lusIndex, connected] : lusDeviceIndiciesWithMappings) {
|
||||
auto buttonColor = ImGui::GetStyleColorVec4(ImGuiCol_Button);
|
||||
auto buttonHoveredColor = ImGui::GetStyleColorVec4(ImGuiCol_ButtonHovered);
|
||||
GetButtonColorsForLUSDeviceIndex(lusIndex, buttonColor, buttonHoveredColor);
|
||||
ImGui::PushStyleColor(ImGuiCol_Button, buttonColor);
|
||||
ImGui::PushStyleColor(ImGuiCol_ButtonHovered, buttonHoveredColor);
|
||||
ImGui::SameLine();
|
||||
ImGui::SmallButton(connected ? ICON_FA_GAMEPAD : ICON_FA_CHAIN_BROKEN);
|
||||
ImGui::PopStyleColor();
|
||||
ImGui::PopStyleColor();
|
||||
}
|
||||
}
|
||||
|
||||
void SohInputEditorWindow::DrawGyroDeviceIcons(uint8_t portIndex) {
|
||||
auto mapping =
|
||||
Ship::Context::GetInstance()->GetControlDeck()->GetControllerByPort(portIndex)->GetGyro()->GetGyroMapping();
|
||||
if (mapping == nullptr) {
|
||||
return;
|
||||
}
|
||||
|
||||
auto buttonColor = ImGui::GetStyleColorVec4(ImGuiCol_Button);
|
||||
auto buttonHoveredColor = ImGui::GetStyleColorVec4(ImGuiCol_ButtonHovered);
|
||||
GetButtonColorsForLUSDeviceIndex(mapping->GetShipDeviceIndex(), buttonColor, buttonHoveredColor);
|
||||
ImGui::PushStyleColor(ImGuiCol_Button, buttonColor);
|
||||
ImGui::PushStyleColor(ImGuiCol_ButtonHovered, buttonHoveredColor);
|
||||
ImGui::SameLine();
|
||||
ImGui::SmallButton(mapping->PhysicalDeviceIsConnected() ? ICON_FA_GAMEPAD : ICON_FA_CHAIN_BROKEN);
|
||||
ImGui::PopStyleColor();
|
||||
ImGui::PopStyleColor();
|
||||
}
|
||||
|
||||
void SohInputEditorWindow::DrawLEDDeviceIcons(uint8_t portIndex) {
|
||||
std::set<Ship::ShipDeviceIndex> allLusDeviceIndices;
|
||||
for (auto [lusIndex, mapping] : Ship::Context::GetInstance()
|
||||
->GetControlDeck()
|
||||
->GetDeviceIndexMappingManager()
|
||||
->GetAllDeviceIndexMappingsFromConfig()) {
|
||||
allLusDeviceIndices.insert(lusIndex);
|
||||
}
|
||||
|
||||
std::vector<std::pair<Ship::ShipDeviceIndex, bool>> lusDeviceIndiciesWithMappings;
|
||||
for (auto lusIndex : allLusDeviceIndices) {
|
||||
if (Ship::Context::GetInstance()
|
||||
->GetControlDeck()
|
||||
->GetControllerByPort(portIndex)
|
||||
->GetRumble()
|
||||
->HasMappingsForShipDeviceIndex(lusIndex)) {
|
||||
for (auto [id, mapping] : Ship::Context::GetInstance()
|
||||
->GetControlDeck()
|
||||
->GetControllerByPort(portIndex)
|
||||
->GetLED()
|
||||
->GetAllLEDMappings()) {
|
||||
if (mapping->GetShipDeviceIndex() == lusIndex) {
|
||||
lusDeviceIndiciesWithMappings.push_back(
|
||||
std::pair<Ship::ShipDeviceIndex, bool>(lusIndex, mapping->PhysicalDeviceIsConnected()));
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (auto [lusIndex, connected] : lusDeviceIndiciesWithMappings) {
|
||||
auto buttonColor = ImGui::GetStyleColorVec4(ImGuiCol_Button);
|
||||
auto buttonHoveredColor = ImGui::GetStyleColorVec4(ImGuiCol_ButtonHovered);
|
||||
GetButtonColorsForLUSDeviceIndex(lusIndex, buttonColor, buttonHoveredColor);
|
||||
ImGui::PushStyleColor(ImGuiCol_Button, buttonColor);
|
||||
ImGui::PushStyleColor(ImGuiCol_ButtonHovered, buttonHoveredColor);
|
||||
ImGui::SameLine();
|
||||
ImGui::SmallButton(connected ? ICON_FA_GAMEPAD : ICON_FA_CHAIN_BROKEN);
|
||||
ImGui::PopStyleColor();
|
||||
ImGui::PopStyleColor();
|
||||
}
|
||||
}
|
||||
|
||||
const ImGuiTableFlags PANEL_TABLE_FLAGS =
|
||||
ImGuiTableFlags_BordersH |
|
||||
ImGuiTableFlags_BordersV;
|
||||
@ -1651,66 +1424,52 @@ void SohInputEditorWindow::DrawDpadControlPanel() {
|
||||
Ship::GuiWindow::EndGroupPanel(0);
|
||||
}
|
||||
|
||||
void SohInputEditorWindow::DrawDeviceVisibilityButtons() {
|
||||
std::map<Ship::ShipDeviceIndex, std::pair<std::string, int32_t>> indexMappings;
|
||||
for (auto [lusIndex, mapping] : Ship::Context::GetInstance()
|
||||
->GetControlDeck()
|
||||
->GetDeviceIndexMappingManager()
|
||||
->GetAllDeviceIndexMappingsFromConfig()) {
|
||||
auto sdlIndexMapping = std::static_pointer_cast<Ship::ShipDeviceIndexToSDLDeviceIndexMapping>(mapping);
|
||||
if (sdlIndexMapping == nullptr) {
|
||||
continue;
|
||||
}
|
||||
|
||||
indexMappings[lusIndex] = { sdlIndexMapping->GetSDLControllerName(), -1 };
|
||||
}
|
||||
|
||||
for (auto [lusIndex, mapping] : Ship::Context::GetInstance()
|
||||
->GetControlDeck()
|
||||
->GetDeviceIndexMappingManager()
|
||||
->GetAllDeviceIndexMappings()) {
|
||||
auto sdlIndexMapping = std::static_pointer_cast<Ship::ShipDeviceIndexToSDLDeviceIndexMapping>(mapping);
|
||||
if (sdlIndexMapping == nullptr) {
|
||||
continue;
|
||||
}
|
||||
|
||||
indexMappings[lusIndex] = { sdlIndexMapping->GetSDLControllerName(), sdlIndexMapping->GetSDLDeviceIndex() };
|
||||
}
|
||||
void SohInputEditorWindow::DrawDeviceToggles(uint8_t portIndex) {
|
||||
ImGui::PushItemFlag(ImGuiItemFlags_Disabled, true);
|
||||
|
||||
auto keyboardButtonColor = ImGui::GetStyleColorVec4(ImGuiCol_Button);
|
||||
auto keyboardButtonHoveredColor = ImGui::GetStyleColorVec4(ImGuiCol_ButtonHovered);
|
||||
GetButtonColorsForLUSDeviceIndex(Ship::ShipDeviceIndex::Keyboard, keyboardButtonColor, keyboardButtonHoveredColor);
|
||||
GetButtonColorsForDeviceType(Ship::PhysicalDeviceType::Keyboard, keyboardButtonColor, keyboardButtonHoveredColor);
|
||||
ImGui::PushStyleColor(ImGuiCol_Button, keyboardButtonColor);
|
||||
ImGui::PushStyleColor(ImGuiCol_ButtonHovered, keyboardButtonHoveredColor);
|
||||
bool keyboardVisible = mDeviceIndexVisiblity[Ship::ShipDeviceIndex::Keyboard];
|
||||
if(ImGui::Button(
|
||||
StringHelper::Sprintf("%s %s Keyboard", keyboardVisible ? ICON_FA_EYE : ICON_FA_EYE_SLASH, ICON_FA_KEYBOARD_O)
|
||||
.c_str())) {
|
||||
mDeviceIndexVisiblity[Ship::ShipDeviceIndex::Keyboard] = !keyboardVisible;
|
||||
}
|
||||
ImGui::Button(StringHelper::Sprintf("%s Keyboard", ICON_FA_KEYBOARD_O).c_str());
|
||||
ImGui::PopStyleColor();
|
||||
ImGui::PopStyleColor();
|
||||
|
||||
auto mouseButtonColor = ImGui::GetStyleColorVec4(ImGuiCol_Button);
|
||||
auto mouseButtonHoveredColor = ImGui::GetStyleColorVec4(ImGuiCol_ButtonHovered);
|
||||
GetButtonColorsForDeviceType(Ship::PhysicalDeviceType::Mouse, mouseButtonColor, mouseButtonHoveredColor);
|
||||
ImGui::PushStyleColor(ImGuiCol_Button, mouseButtonColor);
|
||||
ImGui::PushStyleColor(ImGuiCol_ButtonHovered, mouseButtonHoveredColor);
|
||||
ImGui::Button(StringHelper::Sprintf("%s Mouse", ICON_FA_KEYBOARD_O).c_str());
|
||||
ImGui::PopStyleColor();
|
||||
ImGui::PopStyleColor();
|
||||
|
||||
for (auto [lusIndex, info] : indexMappings) {
|
||||
auto [name, sdlIndex] = info;
|
||||
bool connected = sdlIndex != -1;
|
||||
ImGui::PopItemFlag();
|
||||
|
||||
auto connectedDeviceManager = Ship::Context::GetInstance()->GetControlDeck()->GetConnectedPhysicalDeviceManager();
|
||||
for (const auto& [instanceId, name] : connectedDeviceManager->GetConnectedSDLGamepadNames()) {
|
||||
ImGui::PushItemFlag(ImGuiItemFlags_Disabled, true);
|
||||
auto buttonColor = ImGui::GetStyleColorVec4(ImGuiCol_Button);
|
||||
auto buttonHoveredColor = ImGui::GetStyleColorVec4(ImGuiCol_ButtonHovered);
|
||||
GetButtonColorsForLUSDeviceIndex(lusIndex, buttonColor, buttonHoveredColor);
|
||||
|
||||
GetButtonColorsForDeviceType(Ship::PhysicalDeviceType::SDLGamepad, buttonColor, buttonHoveredColor);
|
||||
ImGui::PushStyleColor(ImGuiCol_Button, buttonColor);
|
||||
ImGui::PushStyleColor(ImGuiCol_ButtonHovered, buttonHoveredColor);
|
||||
bool visible = mDeviceIndexVisiblity[lusIndex];
|
||||
if(ImGui::Button(
|
||||
StringHelper::Sprintf("%s %s %s (%s)", visible ? ICON_FA_EYE : ICON_FA_EYE_SLASH, connected ? ICON_FA_GAMEPAD : ICON_FA_CHAIN_BROKEN, name.c_str(),
|
||||
connected ? StringHelper::Sprintf("SDL %d", sdlIndex).c_str() : "Disconnected")
|
||||
.c_str())) {
|
||||
mDeviceIndexVisiblity[lusIndex] = !visible;
|
||||
}
|
||||
auto notIgnored = !connectedDeviceManager->PortIsIgnoringInstanceId(portIndex, instanceId);
|
||||
ImGui::PopItemFlag();
|
||||
if(ImGui::Checkbox(StringHelper::Sprintf("###instanceId_%d", instanceId).c_str(), ¬Ignored)) {
|
||||
if (notIgnored) {
|
||||
connectedDeviceManager->UnignoreInstanceIdForPort(portIndex, instanceId);
|
||||
} else {
|
||||
connectedDeviceManager->IgnoreInstanceIdForPort(portIndex, instanceId);
|
||||
}
|
||||
};
|
||||
ImGui::PushItemFlag(ImGuiItemFlags_Disabled, true);
|
||||
ImGui::SameLine();
|
||||
ImGui::Button(StringHelper::Sprintf("%s %s (SDL)", ICON_FA_GAMEPAD, name.c_str()).c_str());
|
||||
ImGui::PopStyleColor();
|
||||
ImGui::PopStyleColor();
|
||||
ImGui::PopItemFlag();
|
||||
}
|
||||
}
|
||||
|
||||
@ -1719,7 +1478,7 @@ void SohInputEditorWindow::DrawLinkTab() {
|
||||
if (ImGui::BeginTabItem(StringHelper::Sprintf("Link (P1)###port%d", portIndex).c_str())) {
|
||||
DrawClearAllButton(portIndex);
|
||||
DrawSetDefaultsButton(portIndex);
|
||||
DrawDeviceVisibilityButtons();
|
||||
DrawDeviceToggles(portIndex);
|
||||
|
||||
UpdateBitmaskToMappingIds(portIndex);
|
||||
UpdateStickDirectionToMappingIds(portIndex);
|
||||
@ -1729,7 +1488,6 @@ void SohInputEditorWindow::DrawLinkTab() {
|
||||
ImGui::PushStyleColor(ImGuiCol_HeaderActive, ImVec4(0.0f, 0.0f, 0.0f, 1.0f));
|
||||
|
||||
if (ImGui::CollapsingHeader("Buttons", NULL, ImGuiTreeNodeFlags_DefaultOpen)) {
|
||||
DrawButtonDeviceIcons(portIndex, mButtonsBitmasks);
|
||||
DrawButtonLine("A", portIndex, BTN_A, CHIP_COLOR_N64_BLUE);
|
||||
DrawButtonLine("B", portIndex, BTN_B, CHIP_COLOR_N64_GREEN);
|
||||
DrawButtonLine("Start", portIndex, BTN_START, CHIP_COLOR_N64_RED);
|
||||
@ -1744,57 +1502,36 @@ void SohInputEditorWindow::DrawLinkTab() {
|
||||
CHIP_COLOR_N64_YELLOW);
|
||||
DrawButtonLine(StringHelper::Sprintf("C %s", ICON_FA_ARROW_RIGHT).c_str(), portIndex, BTN_CRIGHT,
|
||||
CHIP_COLOR_N64_YELLOW);
|
||||
} else {
|
||||
DrawButtonDeviceIcons(portIndex, mButtonsBitmasks);
|
||||
}
|
||||
|
||||
if (ImGui::CollapsingHeader("D-Pad", NULL, ImGuiTreeNodeFlags_DefaultOpen)) {
|
||||
DrawButtonDeviceIcons(portIndex, mDpadBitmasks);
|
||||
DrawButtonLine(StringHelper::Sprintf("%s", ICON_FA_ARROW_UP).c_str(), portIndex, BTN_DUP);
|
||||
DrawButtonLine(StringHelper::Sprintf("%s", ICON_FA_ARROW_DOWN).c_str(), portIndex, BTN_DDOWN);
|
||||
DrawButtonLine(StringHelper::Sprintf("%s", ICON_FA_ARROW_LEFT).c_str(), portIndex, BTN_DLEFT);
|
||||
DrawButtonLine(StringHelper::Sprintf("%s", ICON_FA_ARROW_RIGHT).c_str(), portIndex, BTN_DRIGHT);
|
||||
} else {
|
||||
DrawButtonDeviceIcons(portIndex, mDpadBitmasks);
|
||||
}
|
||||
|
||||
if (ImGui::CollapsingHeader("Analog Stick", NULL, ImGuiTreeNodeFlags_DefaultOpen)) {
|
||||
DrawAnalogStickDeviceIcons(portIndex, Ship::LEFT_STICK);
|
||||
DrawStickSection(portIndex, Ship::LEFT, 0);
|
||||
} else {
|
||||
DrawAnalogStickDeviceIcons(portIndex, Ship::LEFT_STICK);
|
||||
}
|
||||
|
||||
if (ImGui::CollapsingHeader("Additional (\"Right\") Stick")) {
|
||||
DrawAnalogStickDeviceIcons(portIndex, Ship::RIGHT_STICK);
|
||||
DrawStickSection(portIndex, Ship::RIGHT, 1, CHIP_COLOR_N64_YELLOW);
|
||||
} else {
|
||||
DrawAnalogStickDeviceIcons(portIndex, Ship::RIGHT_STICK);
|
||||
}
|
||||
|
||||
if (ImGui::CollapsingHeader("Rumble")) {
|
||||
DrawRumbleDeviceIcons(portIndex);
|
||||
DrawRumbleSection(portIndex);
|
||||
} else {
|
||||
DrawRumbleDeviceIcons(portIndex);
|
||||
}
|
||||
|
||||
if (ImGui::CollapsingHeader("Gyro")) {
|
||||
DrawGyroDeviceIcons(portIndex);
|
||||
DrawGyroSection(portIndex);
|
||||
} else {
|
||||
DrawGyroDeviceIcons(portIndex);
|
||||
}
|
||||
|
||||
if (ImGui::CollapsingHeader("LEDs")) {
|
||||
DrawLEDDeviceIcons(portIndex);
|
||||
DrawLEDSection(portIndex);
|
||||
} else {
|
||||
DrawLEDDeviceIcons(portIndex);
|
||||
}
|
||||
|
||||
if (ImGui::CollapsingHeader("Modifier Buttons")) {
|
||||
DrawButtonDeviceIcons(portIndex, mModifierButtonsBitmasks);
|
||||
DrawButtonLine("M1", portIndex, BTN_CUSTOM_MODIFIER1);
|
||||
DrawButtonLine("M2", portIndex, BTN_CUSTOM_MODIFIER2);
|
||||
|
||||
@ -1827,15 +1564,10 @@ void SohInputEditorWindow::DrawLinkTab() {
|
||||
Ship::GuiWindow::EndGroupPanel(0);
|
||||
}
|
||||
ImGui::EndDisabled();
|
||||
} else {
|
||||
DrawButtonDeviceIcons(portIndex, mModifierButtonsBitmasks);
|
||||
}
|
||||
|
||||
if (ImGui::CollapsingHeader("Ocarina Controls")) {
|
||||
DrawButtonDeviceIcons(portIndex, mCustomOcarinaButtonsBitmasks);
|
||||
DrawOcarinaControlPanel();
|
||||
} else {
|
||||
DrawButtonDeviceIcons(portIndex, mCustomOcarinaButtonsBitmasks);
|
||||
}
|
||||
|
||||
if (ImGui::CollapsingHeader("Camera Controls")) {
|
||||
@ -1875,7 +1607,7 @@ void SohInputEditorWindow::DrawIvanTab() {
|
||||
if (ImGui::BeginTabItem(StringHelper::Sprintf("Ivan (P2)###port%d", portIndex).c_str())) {
|
||||
DrawClearAllButton(portIndex);
|
||||
DrawSetDefaultsButton(portIndex);
|
||||
DrawDeviceVisibilityButtons();
|
||||
DrawDeviceToggles(portIndex);
|
||||
|
||||
UpdateBitmaskToMappingIds(portIndex);
|
||||
UpdateStickDirectionToMappingIds(portIndex);
|
||||
@ -1885,7 +1617,6 @@ void SohInputEditorWindow::DrawIvanTab() {
|
||||
ImGui::PushStyleColor(ImGuiCol_HeaderActive, ImVec4(0.0f, 0.0f, 0.0f, 1.0f));
|
||||
|
||||
if (ImGui::CollapsingHeader("Buttons", NULL, ImGuiTreeNodeFlags_DefaultOpen)) {
|
||||
DrawButtonDeviceIcons(portIndex, mButtonsBitmasks);
|
||||
DrawButtonLine("A", portIndex, BTN_A, CHIP_COLOR_N64_BLUE);
|
||||
DrawButtonLine("B", portIndex, BTN_B, CHIP_COLOR_N64_GREEN);
|
||||
DrawButtonLine("Z", portIndex, BTN_Z);
|
||||
@ -1897,25 +1628,17 @@ void SohInputEditorWindow::DrawIvanTab() {
|
||||
CHIP_COLOR_N64_YELLOW);
|
||||
DrawButtonLine(StringHelper::Sprintf("C %s", ICON_FA_ARROW_RIGHT).c_str(), portIndex, BTN_CRIGHT,
|
||||
CHIP_COLOR_N64_YELLOW);
|
||||
} else {
|
||||
DrawButtonDeviceIcons(portIndex, mButtonsBitmasks);
|
||||
}
|
||||
|
||||
if (ImGui::CollapsingHeader("D-Pad", NULL, ImGuiTreeNodeFlags_DefaultOpen)) {
|
||||
DrawButtonDeviceIcons(portIndex, mDpadBitmasks);
|
||||
DrawButtonLine(StringHelper::Sprintf("%s", ICON_FA_ARROW_UP).c_str(), portIndex, BTN_DUP);
|
||||
DrawButtonLine(StringHelper::Sprintf("%s", ICON_FA_ARROW_DOWN).c_str(), portIndex, BTN_DDOWN);
|
||||
DrawButtonLine(StringHelper::Sprintf("%s", ICON_FA_ARROW_LEFT).c_str(), portIndex, BTN_DLEFT);
|
||||
DrawButtonLine(StringHelper::Sprintf("%s", ICON_FA_ARROW_RIGHT).c_str(), portIndex, BTN_DRIGHT);
|
||||
} else {
|
||||
DrawButtonDeviceIcons(portIndex, mDpadBitmasks);
|
||||
}
|
||||
|
||||
if (ImGui::CollapsingHeader("Analog Stick", NULL, ImGuiTreeNodeFlags_DefaultOpen)) {
|
||||
DrawAnalogStickDeviceIcons(portIndex, Ship::LEFT_STICK);
|
||||
DrawStickSection(portIndex, Ship::LEFT, 0);
|
||||
} else {
|
||||
DrawAnalogStickDeviceIcons(portIndex, Ship::LEFT_STICK);
|
||||
}
|
||||
|
||||
ImGui::PopStyleColor();
|
||||
@ -1931,7 +1654,7 @@ void SohInputEditorWindow::DrawDebugPortTab(uint8_t portIndex, std::string custo
|
||||
: customName.c_str())) {
|
||||
DrawClearAllButton(portIndex);
|
||||
DrawSetDefaultsButton(portIndex);
|
||||
DrawDeviceVisibilityButtons();
|
||||
DrawDeviceToggles(portIndex);
|
||||
|
||||
UpdateBitmaskToMappingIds(portIndex);
|
||||
UpdateStickDirectionToMappingIds(portIndex);
|
||||
@ -1941,7 +1664,6 @@ void SohInputEditorWindow::DrawDebugPortTab(uint8_t portIndex, std::string custo
|
||||
ImGui::PushStyleColor(ImGuiCol_HeaderActive, ImVec4(0.0f, 0.0f, 0.0f, 1.0f));
|
||||
|
||||
if (ImGui::CollapsingHeader("Buttons", NULL, ImGuiTreeNodeFlags_DefaultOpen)) {
|
||||
DrawButtonDeviceIcons(portIndex, mButtonsBitmasks);
|
||||
DrawButtonLine("A", portIndex, BTN_A, CHIP_COLOR_N64_BLUE);
|
||||
DrawButtonLine("B", portIndex, BTN_B, CHIP_COLOR_N64_GREEN);
|
||||
DrawButtonLine("Start", portIndex, BTN_START, CHIP_COLOR_N64_RED);
|
||||
@ -1956,25 +1678,16 @@ void SohInputEditorWindow::DrawDebugPortTab(uint8_t portIndex, std::string custo
|
||||
CHIP_COLOR_N64_YELLOW);
|
||||
DrawButtonLine(StringHelper::Sprintf("C %s", ICON_FA_ARROW_RIGHT).c_str(), portIndex, BTN_CRIGHT,
|
||||
CHIP_COLOR_N64_YELLOW);
|
||||
} else {
|
||||
DrawButtonDeviceIcons(portIndex, mButtonsBitmasks);
|
||||
}
|
||||
|
||||
if (ImGui::CollapsingHeader("D-Pad", NULL, ImGuiTreeNodeFlags_DefaultOpen)) {
|
||||
DrawButtonDeviceIcons(portIndex, mDpadBitmasks);
|
||||
DrawButtonLine(StringHelper::Sprintf("%s", ICON_FA_ARROW_UP).c_str(), portIndex, BTN_DUP);
|
||||
DrawButtonLine(StringHelper::Sprintf("%s", ICON_FA_ARROW_DOWN).c_str(), portIndex, BTN_DDOWN);
|
||||
DrawButtonLine(StringHelper::Sprintf("%s", ICON_FA_ARROW_LEFT).c_str(), portIndex, BTN_DLEFT);
|
||||
DrawButtonLine(StringHelper::Sprintf("%s", ICON_FA_ARROW_RIGHT).c_str(), portIndex, BTN_DRIGHT);
|
||||
} else {
|
||||
DrawButtonDeviceIcons(portIndex, mDpadBitmasks);
|
||||
}
|
||||
|
||||
if (ImGui::CollapsingHeader("Analog Stick", NULL, ImGuiTreeNodeFlags_DefaultOpen)) {
|
||||
DrawAnalogStickDeviceIcons(portIndex, Ship::LEFT_STICK);
|
||||
DrawStickSection(portIndex, Ship::LEFT, 0);
|
||||
} else {
|
||||
DrawAnalogStickDeviceIcons(portIndex, Ship::LEFT_STICK);
|
||||
}
|
||||
|
||||
ImGui::PopStyleColor();
|
||||
@ -2010,19 +1723,6 @@ void SohInputEditorWindow::DrawSetDefaultsButton(uint8_t portIndex) {
|
||||
}
|
||||
|
||||
if (ImGui::BeginPopup(popupId.c_str())) {
|
||||
std::map<Ship::ShipDeviceIndex, std::pair<std::string, int32_t>> indexMappings;
|
||||
for (auto [lusIndex, mapping] : Ship::Context::GetInstance()
|
||||
->GetControlDeck()
|
||||
->GetDeviceIndexMappingManager()
|
||||
->GetAllDeviceIndexMappings()) {
|
||||
auto sdlIndexMapping = std::static_pointer_cast<Ship::ShipDeviceIndexToSDLDeviceIndexMapping>(mapping);
|
||||
if (sdlIndexMapping == nullptr) {
|
||||
continue;
|
||||
}
|
||||
|
||||
indexMappings[lusIndex] = { sdlIndexMapping->GetSDLControllerName(), sdlIndexMapping->GetSDLDeviceIndex() };
|
||||
}
|
||||
|
||||
bool shouldClose = false;
|
||||
ImGui::PushStyleColor(ImGuiCol_Button, BUTTON_COLOR_KEYBOARD_BEIGE);
|
||||
ImGui::PushStyleColor(ImGuiCol_ButtonHovered, BUTTON_COLOR_KEYBOARD_BEIGE_HOVERED);
|
||||
@ -2041,49 +1741,42 @@ void SohInputEditorWindow::DrawSetDefaultsButton(uint8_t portIndex) {
|
||||
Ship::Context::GetInstance()
|
||||
->GetControlDeck()
|
||||
->GetControllerByPort(portIndex)
|
||||
->ClearAllMappingsForDevice(Ship::ShipDeviceIndex::Keyboard);
|
||||
->ClearAllMappingsForDeviceType(Ship::PhysicalDeviceType::Keyboard);
|
||||
Ship::Context::GetInstance()->GetControlDeck()->GetControllerByPort(portIndex)->AddDefaultMappings(
|
||||
Ship::ShipDeviceIndex::Keyboard);
|
||||
Ship::PhysicalDeviceType::Keyboard);
|
||||
shouldClose = true;
|
||||
ImGui::CloseCurrentPopup();
|
||||
}
|
||||
ImGui::EndPopup();
|
||||
}
|
||||
for (auto [lusIndex, info] : indexMappings) {
|
||||
auto [name, sdlIndex] = info;
|
||||
|
||||
auto buttonColor = ImGui::GetStyleColorVec4(ImGuiCol_Button);
|
||||
auto buttonHoveredColor = ImGui::GetStyleColorVec4(ImGuiCol_ButtonHovered);
|
||||
GetButtonColorsForLUSDeviceIndex(lusIndex, buttonColor, buttonHoveredColor);
|
||||
ImGui::PushStyleColor(ImGuiCol_Button, buttonColor);
|
||||
ImGui::PushStyleColor(ImGuiCol_ButtonHovered, buttonHoveredColor);
|
||||
if (ImGui::Button(StringHelper::Sprintf("%s %s (%s)", ICON_FA_GAMEPAD, name.c_str(),
|
||||
StringHelper::Sprintf("SDL %d", sdlIndex).c_str())
|
||||
.c_str())) {
|
||||
ImGui::OpenPopup(StringHelper::Sprintf("Set Defaults for %s", name.c_str()).c_str());
|
||||
auto buttonColor = ImGui::GetStyleColorVec4(ImGuiCol_Button);
|
||||
auto buttonHoveredColor = ImGui::GetStyleColorVec4(ImGuiCol_ButtonHovered);
|
||||
GetButtonColorsForDeviceType(Ship::PhysicalDeviceType::SDLGamepad, buttonColor, buttonHoveredColor);
|
||||
ImGui::PushStyleColor(ImGuiCol_Button, buttonColor);
|
||||
ImGui::PushStyleColor(ImGuiCol_ButtonHovered, buttonHoveredColor);
|
||||
if (ImGui::Button(StringHelper::Sprintf("%s %s", ICON_FA_GAMEPAD, "Gamepad (SDL)").c_str())) {
|
||||
ImGui::OpenPopup("Set Defaults for Gamepad (SDL)");
|
||||
}
|
||||
ImGui::PopStyleColor();
|
||||
ImGui::PopStyleColor();
|
||||
if (ImGui::BeginPopupModal("Set Defaults for Gamepad (SDL)", NULL, ImGuiWindowFlags_AlwaysAutoResize)) {
|
||||
ImGui::Text("This will clear all existing mappings for\nGamepad (SDL) on port %d.\n\nContinue?", portIndex + 1);
|
||||
if (ImGui::Button("Cancel")) {
|
||||
shouldClose = true;
|
||||
ImGui::CloseCurrentPopup();
|
||||
}
|
||||
ImGui::PopStyleColor();
|
||||
ImGui::PopStyleColor();
|
||||
if (ImGui::BeginPopupModal(StringHelper::Sprintf("Set Defaults for %s", name.c_str()).c_str(), NULL,
|
||||
ImGuiWindowFlags_AlwaysAutoResize)) {
|
||||
ImGui::Text("This will clear all existing mappings for\n%s (SDL %d) on port %d.\n\nContinue?",
|
||||
name.c_str(), sdlIndex, portIndex + 1);
|
||||
if (ImGui::Button("Cancel")) {
|
||||
shouldClose = true;
|
||||
ImGui::CloseCurrentPopup();
|
||||
}
|
||||
if (ImGui::Button("Set defaults")) {
|
||||
Ship::Context::GetInstance()
|
||||
->GetControlDeck()
|
||||
->GetControllerByPort(portIndex)
|
||||
->ClearAllMappingsForDevice(lusIndex);
|
||||
Ship::Context::GetInstance()->GetControlDeck()->GetControllerByPort(portIndex)->AddDefaultMappings(
|
||||
lusIndex);
|
||||
shouldClose = true;
|
||||
ImGui::CloseCurrentPopup();
|
||||
}
|
||||
ImGui::EndPopup();
|
||||
if (ImGui::Button("Set defaults")) {
|
||||
Ship::Context::GetInstance()
|
||||
->GetControlDeck()
|
||||
->GetControllerByPort(portIndex)
|
||||
->ClearAllMappingsForDeviceType(Ship::PhysicalDeviceType::SDLGamepad);
|
||||
Ship::Context::GetInstance()->GetControlDeck()->GetControllerByPort(portIndex)->AddDefaultMappings(
|
||||
Ship::PhysicalDeviceType::SDLGamepad);
|
||||
shouldClose = true;
|
||||
ImGui::CloseCurrentPopup();
|
||||
}
|
||||
ImGui::EndPopup();
|
||||
}
|
||||
|
||||
if (ImGui::Button("Cancel") || shouldClose) {
|
||||
|
@ -83,7 +83,7 @@ class SohInputEditorWindow : public Ship::GuiWindow {
|
||||
void UpdateBitmaskToMappingIds(uint8_t port);
|
||||
void UpdateStickDirectionToMappingIds(uint8_t port);
|
||||
|
||||
void GetButtonColorsForLUSDeviceIndex(Ship::ShipDeviceIndex lusIndex, ImVec4& buttonColor,
|
||||
void GetButtonColorsForDeviceType(Ship::PhysicalDeviceType lusIndex, ImVec4& buttonColor,
|
||||
ImVec4& buttonHoveredColor);
|
||||
void DrawLinkTab();
|
||||
void DrawIvanTab();
|
||||
@ -92,15 +92,9 @@ class SohInputEditorWindow : public Ship::GuiWindow {
|
||||
std::set<N64ButtonMask> mDpadBitmasks;
|
||||
std::set<N64ButtonMask> mModifierButtonsBitmasks;
|
||||
std::set<N64ButtonMask> mCustomOcarinaButtonsBitmasks;
|
||||
void DrawButtonDeviceIcons(uint8_t portIndex, std::set<N64ButtonMask> bitmasks);
|
||||
void DrawAnalogStickDeviceIcons(uint8_t portIndex, Ship::StickIndex stickIndex);
|
||||
void DrawRumbleDeviceIcons(uint8_t portIndex);
|
||||
void DrawGyroDeviceIcons(uint8_t portIndex);
|
||||
void DrawLEDDeviceIcons(uint8_t portIndex);
|
||||
bool mInputEditorPopupOpen;
|
||||
void DrawSetDefaultsButton(uint8_t portIndex);
|
||||
void DrawClearAllButton(uint8_t portIndex);
|
||||
|
||||
std::map<Ship::ShipDeviceIndex, bool> mDeviceIndexVisiblity;
|
||||
void DrawDeviceVisibilityButtons();
|
||||
void DrawDeviceToggles(uint8_t portIndex);
|
||||
};
|
||||
|
@ -402,6 +402,7 @@ static bool EntranceHandler(std::shared_ptr<Ship::Console> Console, const std::v
|
||||
gPlayState->transitionTrigger = TRANS_TRIGGER_START;
|
||||
gPlayState->transitionType = TRANS_TYPE_INSTANT;
|
||||
gSaveContext.nextTransitionType = TRANS_TYPE_INSTANT;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static bool VoidHandler(std::shared_ptr<Ship::Console> Console, const std::vector<std::string>& args, std::string* output) {
|
||||
|
@ -180,9 +180,7 @@ void MessageDebug_StartTextBox(const char* tableId, uint16_t textId, uint8_t lan
|
||||
Font* font = &msgCtx->font;
|
||||
sMessageHasSetSfx = 0;
|
||||
for (u32 i = 0; i < FONT_CHAR_TEX_SIZE * 120; i += FONT_CHAR_TEX_SIZE) {
|
||||
if (&font->charTexBuf[i] != nullptr) {
|
||||
gSPInvalidateTexCache(play->state.gfxCtx->polyOpa.p++, reinterpret_cast<uintptr_t>(&font->charTexBuf[i]));
|
||||
}
|
||||
gSPInvalidateTexCache(play->state.gfxCtx->polyOpa.p++, reinterpret_cast<uintptr_t>(&font->charTexBuf[i]));
|
||||
}
|
||||
R_TEXT_CHAR_SCALE = 75;
|
||||
R_TEXT_LINE_SPACING = 12;
|
||||
|
@ -1551,6 +1551,55 @@ const std::vector<FlagTable> flagTables = {
|
||||
{ RAND_INF_SHADOW_TEMPLE_MQ_WIND_HINT_SUN_FAIRY, "RAND_INF_SHADOW_TEMPLE_MQ_WIND_HINT_SUN_FAIRY" },
|
||||
{ RAND_INF_BOTTOM_OF_THE_WELL_MQ_CELL_SUN_FAIRY, "RAND_INF_BOTTOM_OF_THE_WELL_MQ_CELL_SUN_FAIRY" },
|
||||
{ RAND_INF_BOTTOM_OF_THE_WELL_MQ_BASEMENT_SUN_FAIRY, "RAND_INF_BOTTOM_OF_THE_WELL_MQ_BASEMENT_SUN_FAIRY" },
|
||||
|
||||
{ RAND_INF_GUARD_HOUSE_UNLOCKED, "RAND_INF_GUARD_HOUSE_UNLOCKED" },
|
||||
{ RAND_INF_GUARD_HOUSE_KEY_OBTAINED, "RAND_INF_GUARD_HOUSE_KEY_OBTAINED" },
|
||||
{ RAND_INF_MARKET_BAZAAR_UNLOCKED, "RAND_INF_MARKET_BAZAAR_UNLOCKED" },
|
||||
{ RAND_INF_MARKET_BAZAAR_KEY_OBTAINED, "RAND_INF_MARKET_BAZAAR_KEY_OBTAINED" },
|
||||
{ RAND_INF_MARKET_POTION_SHOP_UNLOCKED, "RAND_INF_MARKET_POTION_SHOP_UNLOCKED" },
|
||||
{ RAND_INF_MARKET_POTION_SHOP_KEY_OBTAINED, "RAND_INF_MARKET_POTION_SHOP_KEY_OBTAINED" },
|
||||
{ RAND_INF_MASK_SHOP_UNLOCKED, "RAND_INF_MASK_SHOP_UNLOCKED" },
|
||||
{ RAND_INF_MASK_SHOP_KEY_OBTAINED, "RAND_INF_MASK_SHOP_KEY_OBTAINED" },
|
||||
{ RAND_INF_MARKET_SHOOTING_GALLERY_UNLOCKED, "RAND_INF_MARKET_SHOOTING_GALLERY_UNLOCKED" },
|
||||
{ RAND_INF_MARKET_SHOOTING_GALLERY_KEY_OBTAINED, "RAND_INF_MARKET_SHOOTING_GALLERY_KEY_OBTAINED" },
|
||||
{ RAND_INF_BOMBCHU_BOWLING_UNLOCKED, "RAND_INF_BOMBCHU_BOWLING_UNLOCKED" },
|
||||
{ RAND_INF_BOMBCHU_BOWLING_KEY_OBTAINED, "RAND_INF_BOMBCHU_BOWLING_KEY_OBTAINED" },
|
||||
{ RAND_INF_TREASURE_CHEST_GAME_BUILDING_UNLOCKED, "RAND_INF_TREASURE_CHEST_GAME_BUILDING_UNLOCKED" },
|
||||
{ RAND_INF_TREASURE_CHEST_GAME_BUILDING_KEY_OBTAINED, "RAND_INF_TREASURE_CHEST_GAME_BUILDING_KEY_OBTAINED" },
|
||||
{ RAND_INF_BOMBCHU_SHOP_UNLOCKED, "RAND_INF_BOMBCHU_SHOP_UNLOCKED" },
|
||||
{ RAND_INF_BOMBCHU_SHOP_KEY_OBTAINED, "RAND_INF_BOMBCHU_SHOP_KEY_OBTAINED" },
|
||||
{ RAND_INF_RICHARDS_HOUSE_UNLOCKED, "RAND_INF_RICHARDS_HOUSE_UNLOCKED" },
|
||||
{ RAND_INF_RICHARDS_HOUSE_KEY_OBTAINED, "RAND_INF_RICHARDS_HOUSE_KEY_OBTAINED" },
|
||||
{ RAND_INF_ALLEY_HOUSE_UNLOCKED, "RAND_INF_ALLEY_HOUSE_UNLOCKED" },
|
||||
{ RAND_INF_ALLEY_HOUSE_KEY_OBTAINED, "RAND_INF_ALLEY_HOUSE_KEY_OBTAINED" },
|
||||
{ RAND_INF_KAK_BAZAAR_UNLOCKED, "RAND_INF_KAK_BAZAAR_UNLOCKED" },
|
||||
{ RAND_INF_KAK_BAZAAR_KEY_OBTAINED, "RAND_INF_KAK_BAZAAR_KEY_OBTAINED" },
|
||||
{ RAND_INF_KAK_POTION_SHOP_UNLOCKED, "RAND_INF_KAK_POTION_SHOP_UNLOCKED" },
|
||||
{ RAND_INF_KAK_POTION_SHOP_KEY_OBTAINED, "RAND_INF_KAK_POTION_SHOP_KEY_OBTAINED" },
|
||||
{ RAND_INF_BOSS_HOUSE_UNLOCKED, "RAND_INF_BOSS_HOUSE_UNLOCKED" },
|
||||
{ RAND_INF_BOSS_HOUSE_KEY_OBTAINED, "RAND_INF_BOSS_HOUSE_KEY_OBTAINED" },
|
||||
{ RAND_INF_GRANNYS_POTION_SHOP_UNLOCKED, "RAND_INF_GRANNYS_POTION_SHOP_UNLOCKED" },
|
||||
{ RAND_INF_GRANNYS_POTION_SHOP_KEY_OBTAINED, "RAND_INF_GRANNYS_POTION_SHOP_KEY_OBTAINED" },
|
||||
{ RAND_INF_SKULLTULA_HOUSE_UNLOCKED, "RAND_INF_SKULLTULA_HOUSE_UNLOCKED" },
|
||||
{ RAND_INF_SKULLTULA_HOUSE_KEY_OBTAINED, "RAND_INF_SKULLTULA_HOUSE_KEY_OBTAINED" },
|
||||
{ RAND_INF_IMPAS_HOUSE_UNLOCKED, "RAND_INF_IMPAS_HOUSE_UNLOCKED" },
|
||||
{ RAND_INF_IMPAS_HOUSE_KEY_OBTAINED, "RAND_INF_IMPAS_HOUSE_KEY_OBTAINED" },
|
||||
{ RAND_INF_WINDMILL_UNLOCKED, "RAND_INF_WINDMILL_UNLOCKED" },
|
||||
{ RAND_INF_WINDMILL_KEY_OBTAINED, "RAND_INF_WINDMILL_KEY_OBTAINED" },
|
||||
{ RAND_INF_KAK_SHOOTING_GALLERY_UNLOCKED, "RAND_INF_KAK_SHOOTING_GALLERY_UNLOCKED" },
|
||||
{ RAND_INF_KAK_SHOOTING_GALLERY_KEY_OBTAINED, "RAND_INF_KAK_SHOOTING_GALLERY_KEY_OBTAINED" },
|
||||
{ RAND_INF_DAMPES_HUT_UNLOCKED, "RAND_INF_DAMPES_HUT_UNLOCKED" },
|
||||
{ RAND_INF_DAMPES_HUT_KEY_OBTAINED, "RAND_INF_DAMPES_HUT_KEY_OBTAINED" },
|
||||
{ RAND_INF_TALONS_HOUSE_UNLOCKED, "RAND_INF_TALONS_HOUSE_UNLOCKED" },
|
||||
{ RAND_INF_TALONS_HOUSE_KEY_OBTAINED, "RAND_INF_TALONS_HOUSE_KEY_OBTAINED" },
|
||||
{ RAND_INF_STABLES_UNLOCKED, "RAND_INF_STABLES_UNLOCKED" },
|
||||
{ RAND_INF_STABLES_KEY_OBTAINED, "RAND_INF_STABLES_KEY_OBTAINED" },
|
||||
{ RAND_INF_BACK_TOWER_UNLOCKED, "RAND_INF_BACK_TOWER_UNLOCKED" },
|
||||
{ RAND_INF_BACK_TOWER_KEY_OBTAINED, "RAND_INF_BACK_TOWER_KEY_OBTAINED" },
|
||||
{ RAND_INF_HYLIA_LAB_UNLOCKED, "RAND_INF_HYLIA_LAB_UNLOCKED" },
|
||||
{ RAND_INF_HYLIA_LAB_KEY_OBTAINED, "RAND_INF_HYLIA_LAB_KEY_OBTAINED" },
|
||||
{ RAND_INF_FISHING_HOLE_UNLOCKED, "RAND_INF_FISHING_HOLE_UNLOCKED" },
|
||||
{ RAND_INF_FISHING_HOLE_KEY_OBTAINED, "RAND_INF_FISHING_HOLE_KEY_OBTAINED" },
|
||||
} },
|
||||
};
|
||||
|
||||
|
@ -1,5 +1,3 @@
|
||||
#pragma once
|
||||
|
||||
#include "performanceTimer.h"
|
||||
|
||||
void StartPerformanceTimer(TimerID timer){
|
||||
|
@ -304,6 +304,13 @@ typedef enum {
|
||||
VB_FROGS_GO_TO_IDLE,
|
||||
// Vanilla condition: var >= gSaveContext.health) && (gSaveContext.health > 0
|
||||
VB_HEALTH_METER_BE_CRITICAL,
|
||||
VB_CONSUME_SMALL_KEY,
|
||||
// Vanilla condition: gSaveContext.inventory.dungeonKeys[gSaveContext.mapIndex] <= 0
|
||||
VB_NOT_HAVE_SMALL_KEY,
|
||||
// Vanilla condition: !Flags_GetSwitch(play, this->actor.params & 0x3F)
|
||||
VB_DOOR_BE_LOCKED,
|
||||
// Vanilla condition: ((doorActor->params >> 7) & 7) == 3
|
||||
VB_DOOR_PLAY_SCENE_TRANSITION,
|
||||
// Opt: *EnKusa
|
||||
VB_GRASS_SETUP_DRAW,
|
||||
VB_GRASS_DROP_ITEM,
|
||||
|
@ -1133,7 +1133,7 @@ void RegisterOpenAllHours() {
|
||||
GameInteractor::Instance->RegisterGameHook<GameInteractor::OnActorInit>([](void* refActor) {
|
||||
Actor* actor = static_cast<Actor*>(refActor);
|
||||
|
||||
if (CVarGetInteger(CVAR_ENHANCEMENT("OpenAllHours"), 0) && (actor->id == ACTOR_EN_DOOR)) {
|
||||
if (CVarGetInteger(CVAR_ENHANCEMENT("OpenAllHours"), 0) && (actor->id == ACTOR_EN_DOOR) && (!IS_RANDO || !OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_LOCK_OVERWORLD_DOORS))) {
|
||||
switch (actor->params) {
|
||||
case 4753: // Night Market Bazaar
|
||||
case 1678: // Night Potion Shop
|
||||
|
@ -2,22 +2,23 @@
|
||||
#include "global.h"
|
||||
#include "z64.h"
|
||||
#include "game-interactor/GameInteractor.h"
|
||||
#include "soh/OTRGlobals.h"
|
||||
|
||||
static const int songMessageMap[] = {
|
||||
TEXT_WARP_MINUET_OF_FOREST,
|
||||
TEXT_WARP_BOLERO_OF_FIRE,
|
||||
TEXT_WARP_SERENADE_OF_WATER,
|
||||
TEXT_WARP_REQUIEM_OF_SPIRIT,
|
||||
TEXT_WARP_NOCTURNE_OF_SHADOW,
|
||||
TEXT_WARP_PRELUDE_OF_LIGHT
|
||||
TEXT_WARP_MINUET_OF_FOREST,
|
||||
TEXT_WARP_BOLERO_OF_FIRE,
|
||||
TEXT_WARP_SERENADE_OF_WATER,
|
||||
TEXT_WARP_REQUIEM_OF_SPIRIT,
|
||||
TEXT_WARP_NOCTURNE_OF_SHADOW,
|
||||
TEXT_WARP_PRELUDE_OF_LIGHT
|
||||
};
|
||||
|
||||
static const int ocarinaSongMap[] = {
|
||||
OCARINA_SONG_MINUET,
|
||||
OCARINA_SONG_BOLERO,
|
||||
OCARINA_SONG_SERENADE,
|
||||
OCARINA_SONG_REQUIEM,
|
||||
OCARINA_SONG_NOCTURNE,
|
||||
OCARINA_SONG_MINUET,
|
||||
OCARINA_SONG_BOLERO,
|
||||
OCARINA_SONG_SERENADE,
|
||||
OCARINA_SONG_REQUIEM,
|
||||
OCARINA_SONG_NOCTURNE,
|
||||
OCARINA_SONG_PRELUDE
|
||||
};
|
||||
|
||||
@ -31,12 +32,12 @@ static const int entranceIndexMap[] = {
|
||||
};
|
||||
|
||||
static const int songAudioMap[] = {
|
||||
NA_BGM_OCA_MINUET,
|
||||
NA_BGM_OCA_BOLERO,
|
||||
NA_BGM_OCA_SERENADE,
|
||||
NA_BGM_OCA_REQUIEM,
|
||||
NA_BGM_OCA_NOCTURNE,
|
||||
NA_BGM_OCA_LIGHT
|
||||
NA_BGM_OCA_MINUET,
|
||||
NA_BGM_OCA_BOLERO,
|
||||
NA_BGM_OCA_SERENADE,
|
||||
NA_BGM_OCA_REQUIEM,
|
||||
NA_BGM_OCA_NOCTURNE,
|
||||
NA_BGM_OCA_LIGHT
|
||||
};
|
||||
|
||||
static bool isWarpActive = false;
|
||||
@ -87,6 +88,47 @@ void PauseWarp_HandleSelection() {
|
||||
int song = gPlayState->pauseCtx.cursorPoint[PAUSE_QUEST];
|
||||
if (aButtonPressed && CHECK_QUEST_ITEM(song) && song >= QUEST_SONG_MINUET && song <= QUEST_SONG_PRELUDE &&
|
||||
gPlayState->pauseCtx.pageIndex == PAUSE_QUEST && gPlayState->pauseCtx.state == 6) {
|
||||
if (gSaveContext.ship.quest.id == QUEST_RANDOMIZER && Randomizer_GetSettingValue(RSK_SHUFFLE_OCARINA_BUTTONS)) {
|
||||
bool canplay = false;
|
||||
switch (song) {
|
||||
case QUEST_SONG_MINUET:
|
||||
canplay = Flags_GetRandomizerInf(RAND_INF_HAS_OCARINA_A) &&
|
||||
Flags_GetRandomizerInf(RAND_INF_HAS_OCARINA_C_LEFT) &&
|
||||
Flags_GetRandomizerInf(RAND_INF_HAS_OCARINA_C_RIGHT) &&
|
||||
Flags_GetRandomizerInf(RAND_INF_HAS_OCARINA_C_UP);
|
||||
break;
|
||||
case QUEST_SONG_BOLERO:
|
||||
canplay = Flags_GetRandomizerInf(RAND_INF_HAS_OCARINA_A) &&
|
||||
Flags_GetRandomizerInf(RAND_INF_HAS_OCARINA_C_RIGHT) &&
|
||||
Flags_GetRandomizerInf(RAND_INF_HAS_OCARINA_C_DOWN);
|
||||
break;
|
||||
case QUEST_SONG_SERENADE:
|
||||
canplay = Flags_GetRandomizerInf(RAND_INF_HAS_OCARINA_A) &&
|
||||
Flags_GetRandomizerInf(RAND_INF_HAS_OCARINA_C_LEFT) &&
|
||||
Flags_GetRandomizerInf(RAND_INF_HAS_OCARINA_C_RIGHT) &&
|
||||
Flags_GetRandomizerInf(RAND_INF_HAS_OCARINA_C_DOWN);
|
||||
break;
|
||||
case QUEST_SONG_REQUIEM:
|
||||
canplay = Flags_GetRandomizerInf(RAND_INF_HAS_OCARINA_A) &&
|
||||
Flags_GetRandomizerInf(RAND_INF_HAS_OCARINA_C_RIGHT) &&
|
||||
Flags_GetRandomizerInf(RAND_INF_HAS_OCARINA_C_DOWN);
|
||||
break;
|
||||
case QUEST_SONG_NOCTURNE:
|
||||
canplay = Flags_GetRandomizerInf(RAND_INF_HAS_OCARINA_A) &&
|
||||
Flags_GetRandomizerInf(RAND_INF_HAS_OCARINA_C_LEFT) &&
|
||||
Flags_GetRandomizerInf(RAND_INF_HAS_OCARINA_C_RIGHT) &&
|
||||
Flags_GetRandomizerInf(RAND_INF_HAS_OCARINA_C_DOWN);
|
||||
break;
|
||||
case QUEST_SONG_PRELUDE:
|
||||
canplay = Flags_GetRandomizerInf(RAND_INF_HAS_OCARINA_C_LEFT) &&
|
||||
Flags_GetRandomizerInf(RAND_INF_HAS_OCARINA_C_RIGHT) &&
|
||||
Flags_GetRandomizerInf(RAND_INF_HAS_OCARINA_C_UP);
|
||||
break;
|
||||
}
|
||||
if (!canplay) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
ActivateWarp(&gPlayState->pauseCtx, song);
|
||||
}
|
||||
}
|
||||
|
@ -408,7 +408,6 @@ const std::vector<const char*> randomizerCvars = {
|
||||
CVAR_RANDOMIZER_SETTING("DoorOfTime"),
|
||||
CVAR_RANDOMIZER_SETTING("DungeonCount"),
|
||||
CVAR_RANDOMIZER_SETTING("EnableBombchuDrops"),
|
||||
CVAR_RANDOMIZER_SETTING("EnableGlitchCutscenes"),
|
||||
CVAR_RANDOMIZER_SETTING("FishingPoleHint"),
|
||||
CVAR_RANDOMIZER_SETTING("Fishsanity"),
|
||||
CVAR_RANDOMIZER_SETTING("FishsanityAgeSplit"),
|
||||
@ -1200,7 +1199,6 @@ const std::vector<PresetEntry> hellModePresetEntries = {
|
||||
PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("CuccosToReturn"), 1),
|
||||
PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("DoorOfTime"), RO_DOOROFTIME_OPEN),
|
||||
PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("EnableBombchuDrops"), 1),
|
||||
PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("EnableGlitchCutscenes"), 1),
|
||||
PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ClosedForest"), RO_CLOSED_FOREST_OFF),
|
||||
PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("GanonTrial"), RO_GANONS_TRIALS_SET_NUMBER),
|
||||
PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("GanonTrialCount"), 6),
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -1935,6 +1935,20 @@ void StaticData::HintTable_Init_Exclude_Overworld() {
|
||||
hintTextTable[RHT_DMC_UPPER_GROTTO_GOSSIP_STONE_FAIRY_BIG] = HintText(CustomMessage("They say that #playing a stormy tune for an odd stone within the side of a crater# reveals #[[1]]#.",
|
||||
/*german*/ "!!!",
|
||||
/*french*/ "Selon moi, jouer une mélodie orageuse pour une pierre étrange dans le côté d'un cratère révèle [[1]].", {QM_RED, QM_GREEN}));
|
||||
|
||||
hintTextTable[RHT_LH_ISLAND_SUN_FAIRY] = HintText(CustomMessage("They say that #summoning the sun on the lake's island# calls #[[1]]#.", {QM_RED, QM_GREEN}));
|
||||
|
||||
hintTextTable[RHT_HF_POND_STORMS_FAIRY] = HintText(CustomMessage("They say that #calling rain to the field's pond# summons #[[1]]#.", {QM_RED, QM_GREEN}));
|
||||
|
||||
hintTextTable[RHT_HF_FENCE_GROTTO_STORMS_FAIRY] = HintText(CustomMessage("They say that #making it rain in a scrub's cave# wakes #[[1]]#.", {QM_RED, QM_GREEN}));
|
||||
|
||||
hintTextTable[RHT_DMT_FLAG_SUN_FAIRY] = HintText(CustomMessage("They say that #changing the time in front of the trail's flag# reveals #[[1]]#.", {QM_RED, QM_GREEN}));
|
||||
|
||||
hintTextTable[RHT_DMT_COW_GROTTO_STORMS_FAIRY] = HintText(CustomMessage("They say that #calling a storm for a lonely cow# reveals #[[1]]#.", {QM_RED, QM_GREEN}));
|
||||
|
||||
hintTextTable[RC_LW_SHORTCUT_STORMS_FAIRY] = HintText(CustomMessage("They say that #making it rain in the Lost Woods# reveals #[[1]]#.", {QM_RED, QM_GREEN}));
|
||||
|
||||
hintTextTable[RC_GF_KITCHEN_SUN_FAIRY] = HintText(CustomMessage("They say that #calling the sun in a guarded kitchen# exposes #[[1]]#.", {QM_RED, QM_GREEN}));
|
||||
|
||||
hintTextTable[RHT_KF_GRASS] = HintText(CustomMessage("They say that #cutting some grass in a forest# reveals #[[1]]#.",
|
||||
/*german*/ "!!!",
|
||||
|
@ -1361,7 +1361,18 @@ void StaticData::HintTable_Init_Item() {
|
||||
// /*spanish*/un destructor de cerraduras final
|
||||
CustomMessage("a final lockpick", /*german*/"ein finaler Dietrich", /*french*/"un crochet à porte final")});
|
||||
// /*spanish*/una apertura portentosa final
|
||||
|
||||
hintTextTable[RHT_OVERWORLD_KEY] = HintText(CustomMessage("an Overworld Key", /*german*/"ein Überwelt-Schlüssel", /*french*/"une clé de l'Overworld"),
|
||||
// /*spanish*/una llave del mundo exterior
|
||||
{
|
||||
CustomMessage("a small key", /*german*/"ein kleiner Schlüssel", /*french*/"une petite clé")
|
||||
// /*spanish*/una llave
|
||||
}, {
|
||||
CustomMessage("a key to the world", /*german*/"ein Schlüssel zur Welt", /*french*/"une clé du monde"),
|
||||
// /*spanish*/una llave al mundo
|
||||
CustomMessage("a key to the kingdom", /*german*/"ein Schlüssel zum Königreich", /*french*/"une clé du royaume"),
|
||||
// /*spanish*/una llave al reino
|
||||
CustomMessage("a key to the universe", /*german*/"ein Schlüssel zum Universum", /*french*/"une clé de l'univers")});
|
||||
// /*spanish*/una llave al universo
|
||||
hintTextTable[RHT_FOREST_TEMPLE_KEY_RING] = HintText(CustomMessage("a Forest Temple Key Ring", /*german*/"ein Schlüsselbund des Waldtempels", /*french*/"un trousseau de clés du Temple de la Forêt"),
|
||||
// /*spanish*/un llavero del Templo del Bosque
|
||||
{
|
||||
|
@ -112,10 +112,10 @@ StaticHintInfo::StaticHintInfo(HintType _type, std::vector<RandomizerHintTextKey
|
||||
targetItems(_targetItems), hintChecks(_hintChecks), yourPocket(_yourPocket), num(_num){}
|
||||
|
||||
RandomizerHintTextKey GetRandomJunkHint(){
|
||||
//temp code to handle random junk hints now I work in keys instead of a vector of HintText
|
||||
//Will be replaced with a better system once more customisable hint pools are added
|
||||
uint32_t range = RHT_JUNK_CREW_29 - RHT_JUNK02;
|
||||
return (RandomizerHintTextKey)(Random(0, range) + RHT_JUNK02);
|
||||
// Temp code to handle random junk hints now I work in keys instead of a vector of HintText
|
||||
// Will be replaced with a better system once more customisable hint pools are added
|
||||
uint32_t range = RHT_JUNK71 - RHT_JUNK01;
|
||||
return (RandomizerHintTextKey)(Random(0, range) + RHT_JUNK01);
|
||||
}
|
||||
|
||||
RandomizerHintTextKey GetRandomGanonJoke(){
|
||||
|
@ -1285,6 +1285,33 @@ void GenerateItemPool() {
|
||||
}
|
||||
}
|
||||
|
||||
if (ctx->GetOption(RSK_LOCK_OVERWORLD_DOORS)) {
|
||||
AddItemToPool(ItemPool, RG_GUARD_HOUSE_KEY);
|
||||
AddItemToPool(ItemPool, RG_MARKET_BAZAAR_KEY);
|
||||
AddItemToPool(ItemPool, RG_MARKET_POTION_SHOP_KEY);
|
||||
AddItemToPool(ItemPool, RG_MASK_SHOP_KEY);
|
||||
AddItemToPool(ItemPool, RG_MARKET_SHOOTING_GALLERY_KEY);
|
||||
AddItemToPool(ItemPool, RG_BOMBCHU_BOWLING_KEY);
|
||||
AddItemToPool(ItemPool, RG_TREASURE_CHEST_GAME_BUILDING_KEY);
|
||||
AddItemToPool(ItemPool, RG_BOMBCHU_SHOP_KEY);
|
||||
AddItemToPool(ItemPool, RG_RICHARDS_HOUSE_KEY);
|
||||
AddItemToPool(ItemPool, RG_ALLEY_HOUSE_KEY);
|
||||
AddItemToPool(ItemPool, RG_KAK_BAZAAR_KEY);
|
||||
AddItemToPool(ItemPool, RG_KAK_POTION_SHOP_KEY);
|
||||
AddItemToPool(ItemPool, RG_BOSS_HOUSE_KEY);
|
||||
AddItemToPool(ItemPool, RG_GRANNYS_POTION_SHOP_KEY);
|
||||
AddItemToPool(ItemPool, RG_SKULLTULA_HOUSE_KEY);
|
||||
AddItemToPool(ItemPool, RG_IMPAS_HOUSE_KEY);
|
||||
AddItemToPool(ItemPool, RG_WINDMILL_KEY);
|
||||
AddItemToPool(ItemPool, RG_KAK_SHOOTING_GALLERY_KEY);
|
||||
AddItemToPool(ItemPool, RG_DAMPES_HUT_KEY);
|
||||
AddItemToPool(ItemPool, RG_TALONS_HOUSE_KEY);
|
||||
AddItemToPool(ItemPool, RG_STABLES_KEY);
|
||||
AddItemToPool(ItemPool, RG_BACK_TOWER_KEY);
|
||||
AddItemToPool(ItemPool, RG_HYLIA_LAB_KEY);
|
||||
AddItemToPool(ItemPool, RG_FISHING_HOLE_KEY);
|
||||
}
|
||||
|
||||
//Shopsanity
|
||||
if (
|
||||
ctx->GetOption(RSK_SHOPSANITY).Is(RO_SHOPSANITY_OFF) ||
|
||||
|
154
soh/soh/Enhancements/randomizer/LockOverworldDoors.cpp
Normal file
154
soh/soh/Enhancements/randomizer/LockOverworldDoors.cpp
Normal file
@ -0,0 +1,154 @@
|
||||
#include <libultraship/libultraship.h>
|
||||
#include "soh/OTRGlobals.h"
|
||||
#include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h"
|
||||
#include "soh/ShipInit.hpp"
|
||||
|
||||
extern "C" {
|
||||
extern PlayState* gPlayState;
|
||||
#include "macros.h"
|
||||
#include "src/overlays/actors/ovl_En_Door/z_en_door.h"
|
||||
}
|
||||
|
||||
#define RAND_GET_OPTION(option) Rando::Context::GetInstance()->GetOption(option).GetContextOptionIndex()
|
||||
|
||||
using SceneDoorParamsPair = std::pair<int, int>;
|
||||
std::map<SceneDoorParamsPair, RandomizerInf> lookupTable = {
|
||||
{{ SCENE_MARKET_ENTRANCE_DAY, 447 }, RAND_INF_GUARD_HOUSE_UNLOCKED },
|
||||
{{ SCENE_MARKET_ENTRANCE_NIGHT, 447 }, RAND_INF_GUARD_HOUSE_UNLOCKED },
|
||||
{{ SCENE_MARKET_ENTRANCE_RUINS, 447 }, RAND_INF_GUARD_HOUSE_UNLOCKED },
|
||||
{{ SCENE_MARKET_GUARD_HOUSE, 447 }, RAND_INF_GUARD_HOUSE_UNLOCKED },
|
||||
{{ SCENE_MARKET_DAY, 4543 }, RAND_INF_MARKET_BAZAAR_UNLOCKED },
|
||||
{{ SCENE_MARKET_NIGHT, 4753 }, RAND_INF_MARKET_BAZAAR_UNLOCKED },
|
||||
{{ SCENE_MARKET_DAY, 1471 }, RAND_INF_MARKET_POTION_SHOP_UNLOCKED },
|
||||
{{ SCENE_MARKET_NIGHT, 1678 }, RAND_INF_MARKET_POTION_SHOP_UNLOCKED },
|
||||
{{ SCENE_MARKET_DAY, 3519 }, RAND_INF_MASK_SHOP_UNLOCKED },
|
||||
{{ SCENE_MARKET_NIGHT, 3728 }, RAND_INF_MASK_SHOP_UNLOCKED },
|
||||
{{ SCENE_MARKET_DAY, 2495 }, RAND_INF_MARKET_SHOOTING_GALLERY_UNLOCKED },
|
||||
{{ SCENE_MARKET_NIGHT, 2703 }, RAND_INF_MARKET_SHOOTING_GALLERY_UNLOCKED },
|
||||
{{ SCENE_SHOOTING_GALLERY, 447 }, RAND_INF_MARKET_SHOOTING_GALLERY_UNLOCKED },
|
||||
{{ SCENE_MARKET_DAY, 5567 }, RAND_INF_BOMBCHU_BOWLING_UNLOCKED },
|
||||
{{ SCENE_MARKET_NIGHT, 5567 }, RAND_INF_BOMBCHU_BOWLING_UNLOCKED },
|
||||
{{ SCENE_BOMBCHU_BOWLING_ALLEY, 447 }, RAND_INF_BOMBCHU_BOWLING_UNLOCKED },
|
||||
{{ SCENE_MARKET_DAY, 653 }, RAND_INF_TREASURE_CHEST_GAME_BUILDING_UNLOCKED },
|
||||
{{ SCENE_MARKET_NIGHT, 447 }, RAND_INF_TREASURE_CHEST_GAME_BUILDING_UNLOCKED },
|
||||
{{ SCENE_TREASURE_BOX_SHOP, 6591 }, RAND_INF_TREASURE_CHEST_GAME_BUILDING_UNLOCKED },
|
||||
{{ SCENE_BACK_ALLEY_DAY, 2689 }, RAND_INF_BOMBCHU_SHOP_UNLOCKED },
|
||||
{{ SCENE_BACK_ALLEY_NIGHT, 2495 }, RAND_INF_BOMBCHU_SHOP_UNLOCKED },
|
||||
{{ SCENE_BACK_ALLEY_DAY, 447 }, RAND_INF_RICHARDS_HOUSE_UNLOCKED },
|
||||
{{ SCENE_BACK_ALLEY_NIGHT, 447 }, RAND_INF_RICHARDS_HOUSE_UNLOCKED },
|
||||
{{ SCENE_DOG_LADY_HOUSE, 447 }, RAND_INF_RICHARDS_HOUSE_UNLOCKED },
|
||||
{{ SCENE_DOG_LADY_HOUSE, 447 }, RAND_INF_RICHARDS_HOUSE_UNLOCKED },
|
||||
{{ SCENE_BACK_ALLEY_HOUSE, 447 }, RAND_INF_ALLEY_HOUSE_UNLOCKED },
|
||||
{{ SCENE_BACK_ALLEY_DAY, 1665 }, RAND_INF_ALLEY_HOUSE_UNLOCKED },
|
||||
{{ SCENE_BACK_ALLEY_NIGHT, 1471 }, RAND_INF_ALLEY_HOUSE_UNLOCKED },
|
||||
{{ SCENE_KAKARIKO_VILLAGE, 6801 }, RAND_INF_KAK_BAZAAR_UNLOCKED }, // Adult Night
|
||||
{{ SCENE_KAKARIKO_VILLAGE, 6591 }, RAND_INF_KAK_BAZAAR_UNLOCKED }, // Adult Day
|
||||
{{ SCENE_KAKARIKO_VILLAGE, 6813 }, RAND_INF_KAK_BAZAAR_UNLOCKED }, // Child Day
|
||||
{{ SCENE_KAKARIKO_VILLAGE, 6814 }, RAND_INF_KAK_BAZAAR_UNLOCKED }, // Child Night
|
||||
{{ SCENE_KAKARIKO_VILLAGE, 8871 }, RAND_INF_KAK_POTION_SHOP_UNLOCKED }, // Child Day/Night Rear
|
||||
{{ SCENE_KAKARIKO_VILLAGE, 8846 }, RAND_INF_KAK_POTION_SHOP_UNLOCKED }, // Adult Night Rear
|
||||
{{ SCENE_KAKARIKO_VILLAGE, 8639 }, RAND_INF_KAK_POTION_SHOP_UNLOCKED }, // Adult Day Rear
|
||||
{{ SCENE_KAKARIKO_VILLAGE, 7822 }, RAND_INF_KAK_POTION_SHOP_UNLOCKED }, // Adult Night
|
||||
{{ SCENE_KAKARIKO_VILLAGE, 7615 }, RAND_INF_KAK_POTION_SHOP_UNLOCKED }, // Child Day/Night and Adult Day
|
||||
{{ SCENE_KAKARIKO_VILLAGE, 2495 }, RAND_INF_BOSS_HOUSE_UNLOCKED },
|
||||
{{ SCENE_KAKARIKO_CENTER_GUEST_HOUSE, 447 }, RAND_INF_BOSS_HOUSE_UNLOCKED },
|
||||
{{ SCENE_KAKARIKO_VILLAGE, 3750 }, RAND_INF_GRANNYS_POTION_SHOP_UNLOCKED }, // Child
|
||||
{{ SCENE_KAKARIKO_VILLAGE, 3519 }, RAND_INF_GRANNYS_POTION_SHOP_UNLOCKED }, // Adult
|
||||
{{ SCENE_POTION_SHOP_GRANNY, 447 }, RAND_INF_GRANNYS_POTION_SHOP_UNLOCKED },
|
||||
{{ SCENE_KAKARIKO_VILLAGE, 5567 }, RAND_INF_SKULLTULA_HOUSE_UNLOCKED },
|
||||
{{ SCENE_HOUSE_OF_SKULLTULA, 447 }, RAND_INF_SKULLTULA_HOUSE_UNLOCKED },
|
||||
{{ SCENE_KAKARIKO_VILLAGE, 1471 }, RAND_INF_IMPAS_HOUSE_UNLOCKED },
|
||||
{{ SCENE_IMPAS_HOUSE, 447 }, RAND_INF_IMPAS_HOUSE_UNLOCKED },
|
||||
{{ SCENE_KAKARIKO_VILLAGE, 447 }, RAND_INF_WINDMILL_UNLOCKED },
|
||||
{{ SCENE_WINDMILL_AND_DAMPES_GRAVE, 2495 }, RAND_INF_WINDMILL_UNLOCKED },
|
||||
{{ SCENE_KAKARIKO_VILLAGE, 4543 }, RAND_INF_KAK_SHOOTING_GALLERY_UNLOCKED }, // Day
|
||||
{{ SCENE_KAKARIKO_VILLAGE, 4751 }, RAND_INF_KAK_SHOOTING_GALLERY_UNLOCKED }, // Night
|
||||
{{ SCENE_SHOOTING_GALLERY, 447 }, RAND_INF_KAK_SHOOTING_GALLERY_UNLOCKED },
|
||||
{{ SCENE_GRAVEYARD, 645 }, RAND_INF_DAMPES_HUT_UNLOCKED }, // Child Day
|
||||
{{ SCENE_GRAVEYARD, 447 }, RAND_INF_DAMPES_HUT_UNLOCKED }, // Child Evening & Adult
|
||||
{{ SCENE_GRAVEYARD, 774 }, RAND_INF_DAMPES_HUT_UNLOCKED }, // Child Night (After Dampes Tour)
|
||||
{{ SCENE_GRAVEKEEPERS_HUT, 447 }, RAND_INF_DAMPES_HUT_UNLOCKED },
|
||||
{{ SCENE_LON_LON_RANCH, 2495 }, RAND_INF_TALONS_HOUSE_UNLOCKED },
|
||||
{{ SCENE_LON_LON_RANCH, 2473 }, RAND_INF_TALONS_HOUSE_UNLOCKED },
|
||||
{{ SCENE_LON_LON_RANCH, 2729 }, RAND_INF_TALONS_HOUSE_UNLOCKED },
|
||||
{{ SCENE_LON_LON_BUILDINGS, 1471 }, RAND_INF_TALONS_HOUSE_UNLOCKED },
|
||||
{{ SCENE_LON_LON_RANCH, 1471 }, RAND_INF_STABLES_UNLOCKED },
|
||||
{{ SCENE_STABLE, 447 }, RAND_INF_STABLES_UNLOCKED },
|
||||
{{ SCENE_LON_LON_RANCH, 447 }, RAND_INF_BACK_TOWER_UNLOCKED },
|
||||
{{ SCENE_LON_LON_BUILDINGS, 447 }, RAND_INF_BACK_TOWER_UNLOCKED },
|
||||
{{ SCENE_LAKE_HYLIA, 447 }, RAND_INF_HYLIA_LAB_UNLOCKED },
|
||||
{{ SCENE_LAKESIDE_LABORATORY, 447 }, RAND_INF_HYLIA_LAB_UNLOCKED },
|
||||
{{ SCENE_LAKE_HYLIA, 1471 }, RAND_INF_FISHING_HOLE_UNLOCKED },
|
||||
{{ SCENE_FISHING_POND, 447 }, RAND_INF_FISHING_HOLE_UNLOCKED },
|
||||
};
|
||||
|
||||
static void OnDoorInit(void* actorRef) {
|
||||
EnDoor* enDoor = static_cast<EnDoor*>(actorRef);
|
||||
enDoor->randomizerInf = RAND_INF_MAX;
|
||||
|
||||
auto it = lookupTable.find({gPlayState->sceneNum, enDoor->actor.params});
|
||||
if (it != lookupTable.end()) {
|
||||
if (it->second == RAND_INF_MARKET_SHOOTING_GALLERY_UNLOCKED && gSaveContext.entranceIndex == 0x3B) {
|
||||
// Adult shooting gallery uses same scene and door params as child, so we manually handle it
|
||||
enDoor->randomizerInf = RAND_INF_KAK_SHOOTING_GALLERY_UNLOCKED;
|
||||
} else {
|
||||
enDoor->randomizerInf = it->second;
|
||||
}
|
||||
if (!Flags_GetRandomizerInf(enDoor->randomizerInf)) {
|
||||
// We don't want to override checkable doors, we still want those to not be openable even if they have a key
|
||||
if (((enDoor->actor.params >> 7) & 7) != DOOR_CHECKABLE) {
|
||||
enDoor->actor.params = (enDoor->actor.params & ~0x380) | (DOOR_LOCKED << 7);
|
||||
enDoor->actionFunc = EnDoor_SetupType;
|
||||
} else {
|
||||
enDoor->lockTimer = 10;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void RegisterLockOverworldDoors() {
|
||||
bool shouldRegister = IS_RANDO && RAND_GET_OPTION(RSK_LOCK_OVERWORLD_DOORS);
|
||||
|
||||
COND_ID_HOOK(OnActorInit, ACTOR_EN_DOOR, shouldRegister, OnDoorInit);
|
||||
|
||||
COND_VB_SHOULD(VB_CONSUME_SMALL_KEY, shouldRegister, {
|
||||
EnDoor* enDoor = va_arg(args, EnDoor*);
|
||||
|
||||
if (enDoor->randomizerInf >= RAND_INF_GUARD_HOUSE_UNLOCKED && enDoor->randomizerInf <= RAND_INF_FISHING_HOLE_KEY_OBTAINED) {
|
||||
Flags_SetRandomizerInf(enDoor->randomizerInf);
|
||||
*should = false;
|
||||
}
|
||||
});
|
||||
|
||||
COND_VB_SHOULD(VB_NOT_HAVE_SMALL_KEY, shouldRegister, {
|
||||
EnDoor* enDoor = va_arg(args, EnDoor*);
|
||||
|
||||
if (enDoor->randomizerInf >= RAND_INF_GUARD_HOUSE_UNLOCKED && enDoor->randomizerInf <= RAND_INF_FISHING_HOLE_KEY_OBTAINED) {
|
||||
*should = !Flags_GetRandomizerInf((RandomizerInf)(enDoor->randomizerInf + 1));
|
||||
}
|
||||
});
|
||||
|
||||
COND_VB_SHOULD(VB_DOOR_BE_LOCKED, shouldRegister, {
|
||||
EnDoor* enDoor = va_arg(args, EnDoor*);
|
||||
|
||||
if (enDoor->randomizerInf >= RAND_INF_GUARD_HOUSE_UNLOCKED && enDoor->randomizerInf <= RAND_INF_FISHING_HOLE_KEY_OBTAINED) {
|
||||
*should = !Flags_GetRandomizerInf(enDoor->randomizerInf);
|
||||
}
|
||||
});
|
||||
|
||||
// The door actor uses the same param to indicate if a door should be locked or be a scene transition, so it cannot be both. Here we're
|
||||
// overriding the check for scene transition to also check if the door is being unlocked and should be a scene transition.
|
||||
COND_VB_SHOULD(VB_DOOR_PLAY_SCENE_TRANSITION, shouldRegister, {
|
||||
EnDoor* enDoor = va_arg(args, EnDoor*);
|
||||
|
||||
if (!*should && (
|
||||
enDoor->actor.id == ACTOR_EN_DOOR &&
|
||||
((enDoor->actor.params >> 7) & 7) == 1 &&
|
||||
enDoor->randomizerInf != RAND_INF_MAX
|
||||
)) {
|
||||
*should = true;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
static RegisterShipInitFunc initFunc(RegisterLockOverworldDoors, { "IS_RANDO" });
|
@ -77,7 +77,7 @@ std::unordered_map<RandomizerGet, std::string> ocarinaButtonNames = {
|
||||
{ RG_OCARINA_C_RIGHT_BUTTON, "C-RHT" },
|
||||
};
|
||||
|
||||
std::map<RandomizerGet, ImVec4> bossSoulMapping = {
|
||||
std::map<RandomizerGet, ImVec4> bossSoulColorMapping = {
|
||||
{ RG_GOHMA_SOUL, { 0.00f, 1.00f, 0.00f, 1.0f } },
|
||||
{ RG_KING_DODONGO_SOUL, { 1.00f, 0.00f, 0.39f, 1.0f } },
|
||||
{ RG_BARINADE_SOUL, { 0.20f, 1.00f, 1.00f, 1.0f } },
|
||||
@ -339,7 +339,7 @@ ImVec4 plandomizerGetItemColor(Rando::Item randoItem) {
|
||||
}
|
||||
|
||||
if (randoItem.GetRandomizerGet() >= RG_GOHMA_SOUL && randoItem.GetRandomizerGet() <= RG_GANON_SOUL) {
|
||||
itemColor = bossSoulMapping.at(randoItem.GetRandomizerGet());
|
||||
itemColor = bossSoulColorMapping.at(randoItem.GetRandomizerGet());
|
||||
}
|
||||
|
||||
return itemColor;
|
||||
|
@ -946,7 +946,13 @@ extern "C" void DrawGanon(PlayState* play) {
|
||||
}
|
||||
|
||||
extern "C" void Randomizer_DrawBossSoul(PlayState* play, GetItemEntry* getItemEntry) {
|
||||
s16 slot = getItemEntry->getItemId - RG_GOHMA_SOUL;
|
||||
s16 slot;
|
||||
if (getItemEntry->getItemId != RG_ICE_TRAP) {
|
||||
slot = getItemEntry->getItemId - RG_GOHMA_SOUL;
|
||||
} else {
|
||||
slot = getItemEntry->drawItemId - RG_GOHMA_SOUL;
|
||||
}
|
||||
|
||||
s16 flameColors[9][3] = {
|
||||
{ 0, 255, 0 }, // Gohma
|
||||
{ 255, 0, 100 }, // King Dodongo
|
||||
@ -1223,3 +1229,18 @@ extern "C" void Randomizer_DrawBombchuBagInLogic(PlayState* play, GetItemEntry*
|
||||
CLOSE_DISPS(play->state.gfxCtx);
|
||||
}
|
||||
}
|
||||
|
||||
extern "C" void Randomizer_DrawOverworldKey(PlayState* play, GetItemEntry* getItemEntry) {
|
||||
OPEN_DISPS(play->state.gfxCtx);
|
||||
|
||||
Gfx_SetupDL_25Opa(play->state.gfxCtx);
|
||||
|
||||
gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 255, 255, 255, 255);
|
||||
gDPSetEnvColor(POLY_OPA_DISP++, 255, 255, 255, 255);
|
||||
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx, (char*)__FILE__, __LINE__),
|
||||
G_MTX_MODELVIEW | G_MTX_LOAD);
|
||||
|
||||
gSPDisplayList(POLY_OPA_DISP++, (Gfx*)gHouseKeyDL);
|
||||
|
||||
CLOSE_DISPS(play->state.gfxCtx);
|
||||
}
|
||||
|
@ -25,6 +25,7 @@ void Randomizer_DrawSkeletonKey(PlayState* play, GetItemEntry* getItemEntry);
|
||||
void Randomizer_DrawMysteryItem(PlayState* play, GetItemEntry getItemEntry);
|
||||
void Randomizer_DrawBombchuBagInLogic(PlayState* play, GetItemEntry* getItemEntry);
|
||||
void Randomizer_DrawBombchuBag(PlayState* play, GetItemEntry* getItemEntry);
|
||||
void Randomizer_DrawOverworldKey(PlayState* play, GetItemEntry* getItemEntry);
|
||||
|
||||
#define GET_ITEM_MYSTERY \
|
||||
{ ITEM_NONE_FE, 0, 0, 0, 0, MOD_RANDOMIZER, MOD_RANDOMIZER, ITEM_NONE_FE, 0, false, ITEM_FROM_NPC, ITEM_CATEGORY_JUNK, ITEM_NONE_FE, MOD_RANDOMIZER, (CustomDrawFunc)Randomizer_DrawMysteryItem }
|
||||
|
@ -20,15 +20,11 @@ void Entrance::SetCondition(ConditionFn newCondition) {
|
||||
}
|
||||
|
||||
bool Entrance::GetConditionsMet() const {
|
||||
auto ctx = Rando::Context::GetInstance();
|
||||
if (ctx->GetOption(RSK_LOGIC_RULES).Is(RO_LOGIC_NO_LOGIC) || ctx->GetOption(RSK_LOGIC_RULES).Is(RO_LOGIC_VANILLA)) {
|
||||
return true;
|
||||
} else if (ctx->GetOption(RSK_LOGIC_RULES).Is(RO_LOGIC_GLITCHLESS)) {
|
||||
return condition_function();
|
||||
} else if (ctx->GetOption(RSK_LOGIC_RULES).Is(RO_LOGIC_GLITCHED)) {
|
||||
return condition_function();
|
||||
}
|
||||
return false;
|
||||
auto ctx = Rando::Context::GetInstance();
|
||||
if (ctx->GetOption(RSK_LOGIC_RULES).Is(RO_LOGIC_GLITCHLESS)) {
|
||||
return condition_function();
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
std::string Entrance::to_string() const {
|
||||
|
@ -2374,6 +2374,8 @@ void RandomizerRegisterHooks() {
|
||||
static uint32_t shuffleGrassOnVanillaBehaviorHook = 0;
|
||||
|
||||
GameInteractor::Instance->RegisterGameHook<GameInteractor::OnLoadGame>([](int32_t fileNum) {
|
||||
ShipInit::Init("IS_RANDO");
|
||||
|
||||
randomizerQueuedChecks = std::queue<RandomizerCheck>();
|
||||
randomizerQueuedCheck = RC_UNKNOWN_CHECK;
|
||||
randomizerQueuedItemEntry = GET_ITEM_NONE;
|
||||
|
@ -159,6 +159,54 @@ void Rando::StaticData::InitItemTable() {
|
||||
itemTable[RG_GANONS_CASTLE_SMALL_KEY] = Item(RG_GANONS_CASTLE_SMALL_KEY, Text{ "Ganon's Castle Small Key", "Petite Clé du Château de Ganon", "Kleiner Schlüssel für Ganons Schloß" }, ITEMTYPE_SMALLKEY, 0xB7, true, LOGIC_GANONS_CASTLE_KEYS, RHT_GANONS_CASTLE_SMALL_KEY, RG_GANONS_CASTLE_SMALL_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER);
|
||||
itemTable[RG_GANONS_CASTLE_SMALL_KEY].SetCustomDrawFunc(Randomizer_DrawSmallKey);
|
||||
itemTable[RG_TREASURE_GAME_SMALL_KEY] = Item(RG_TREASURE_GAME_SMALL_KEY, Text{ "Chest Game Small Key", "Petite Clé du jeu la Chasse-aux-Trésors", "Kleiner Schlüssel für das Truhenspiel" }, ITEMTYPE_SMALLKEY, GI_DOOR_KEY, true, LOGIC_TREASURE_GAME_KEYS, RHT_TREASURE_GAME_SMALL_KEY, ITEM_KEY_SMALL, OBJECT_GI_KEY, GID_KEY_SMALL, 0xF3, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_NONE);
|
||||
itemTable[RG_GUARD_HOUSE_KEY] = Item(RG_GUARD_HOUSE_KEY, Text{ "Guard House Key", "", "Schlüssel für das Haus der Wachen" }, ITEMTYPE_ITEM, GI_DOOR_KEY, true, LOGIC_GUARD_HOUSE_KEY, RHT_OVERWORLD_KEY, RG_GUARD_HOUSE_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER);
|
||||
itemTable[RG_GUARD_HOUSE_KEY].SetCustomDrawFunc(Randomizer_DrawOverworldKey);
|
||||
itemTable[RG_MARKET_BAZAAR_KEY] = Item(RG_MARKET_BAZAAR_KEY, Text{ "Market Bazaar Key", "", "Schlüssel für den Basar des Marktes" }, ITEMTYPE_ITEM, GI_DOOR_KEY, true, LOGIC_MARKET_BAZAAR_KEY, RHT_OVERWORLD_KEY, RG_MARKET_BAZAAR_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER);
|
||||
itemTable[RG_MARKET_BAZAAR_KEY].SetCustomDrawFunc(Randomizer_DrawOverworldKey);
|
||||
itemTable[RG_MARKET_POTION_SHOP_KEY] = Item(RG_MARKET_POTION_SHOP_KEY, Text{ "Market Potion Shop Key", "", "Schlüssel für den Magie-Laden des Marktes" }, ITEMTYPE_ITEM, GI_DOOR_KEY, true, LOGIC_MARKET_POTION_SHOP_KEY, RHT_OVERWORLD_KEY, RG_MARKET_POTION_SHOP_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER);
|
||||
itemTable[RG_MARKET_POTION_SHOP_KEY].SetCustomDrawFunc(Randomizer_DrawOverworldKey);
|
||||
itemTable[RG_MASK_SHOP_KEY] = Item(RG_MASK_SHOP_KEY, Text{ "Mask Shop Key", "", "Schlüssel für den Maskenladen" }, ITEMTYPE_ITEM, GI_DOOR_KEY, true, LOGIC_MASK_SHOP_KEY, RHT_OVERWORLD_KEY, RG_MASK_SHOP_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER);
|
||||
itemTable[RG_MASK_SHOP_KEY].SetCustomDrawFunc(Randomizer_DrawOverworldKey);
|
||||
itemTable[RG_MARKET_SHOOTING_GALLERY_KEY] = Item(RG_MARKET_SHOOTING_GALLERY_KEY, Text{ "Market Shooting Gallery Key", "", "Schlüssel für die Schießbude des Marktes" }, ITEMTYPE_ITEM, GI_DOOR_KEY, true, LOGIC_MARKET_SHOOTING_GALLERY_KEY, RHT_OVERWORLD_KEY, RG_MARKET_SHOOTING_GALLERY_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER);
|
||||
itemTable[RG_MARKET_SHOOTING_GALLERY_KEY].SetCustomDrawFunc(Randomizer_DrawOverworldKey);
|
||||
itemTable[RG_BOMBCHU_BOWLING_KEY] = Item(RG_BOMBCHU_BOWLING_KEY, Text{ "Bombchu Bowling Alley Key", "", "Schlüssel für die Minenbowlingbahn" }, ITEMTYPE_ITEM, GI_DOOR_KEY, true, LOGIC_BOMBCHU_BOWLING_KEY, RHT_OVERWORLD_KEY, RG_BOMBCHU_BOWLING_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER);
|
||||
itemTable[RG_BOMBCHU_BOWLING_KEY].SetCustomDrawFunc(Randomizer_DrawOverworldKey);
|
||||
itemTable[RG_TREASURE_CHEST_GAME_BUILDING_KEY] = Item(RG_TREASURE_CHEST_GAME_BUILDING_KEY, Text{ "Treasure Chest Game Building Key", "", "Schlüssel für das Haus des Schatzkisten-Pokers" }, ITEMTYPE_ITEM, GI_DOOR_KEY, true, LOGIC_TREASURE_CHEST_GAME_BUILDING_KEY,RHT_OVERWORLD_KEY, RG_TREASURE_CHEST_GAME_BUILDING_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER);
|
||||
itemTable[RG_TREASURE_CHEST_GAME_BUILDING_KEY].SetCustomDrawFunc(Randomizer_DrawOverworldKey);
|
||||
itemTable[RG_BOMBCHU_SHOP_KEY] = Item(RG_BOMBCHU_SHOP_KEY, Text{ "Bombchu Shop Key", "", "Schlüssel für den Krabbelminenladen" }, ITEMTYPE_ITEM, GI_DOOR_KEY, true, LOGIC_BOMBCHU_SHOP_KEY, RHT_OVERWORLD_KEY, RG_BOMBCHU_SHOP_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER);
|
||||
itemTable[RG_BOMBCHU_SHOP_KEY].SetCustomDrawFunc(Randomizer_DrawOverworldKey);
|
||||
itemTable[RG_RICHARDS_HOUSE_KEY] = Item(RG_RICHARDS_HOUSE_KEY, Text{ "Richard's House Key", "", "Schlüssel für das Haus von Richard" }, ITEMTYPE_ITEM, GI_DOOR_KEY, true, LOGIC_RICHARDS_HOUSE_KEY, RHT_OVERWORLD_KEY, RG_RICHARDS_HOUSE_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER);
|
||||
itemTable[RG_RICHARDS_HOUSE_KEY].SetCustomDrawFunc(Randomizer_DrawOverworldKey);
|
||||
itemTable[RG_ALLEY_HOUSE_KEY] = Item(RG_ALLEY_HOUSE_KEY, Text{ "Alley House Key", "", "Schlüssel für das Gäßchenhaus" }, ITEMTYPE_ITEM, GI_DOOR_KEY, true, LOGIC_ALLEY_HOUSE_KEY, RHT_OVERWORLD_KEY, RG_ALLEY_HOUSE_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER);
|
||||
itemTable[RG_ALLEY_HOUSE_KEY].SetCustomDrawFunc(Randomizer_DrawOverworldKey);
|
||||
itemTable[RG_KAK_BAZAAR_KEY] = Item(RG_KAK_BAZAAR_KEY, Text{ "Kakariko Bazaar Key", "", "Schlüssel für den Basar von Kakariko" }, ITEMTYPE_ITEM, GI_DOOR_KEY, true, LOGIC_KAK_BAZAAR_KEY, RHT_OVERWORLD_KEY, RG_KAK_BAZAAR_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER);
|
||||
itemTable[RG_KAK_BAZAAR_KEY].SetCustomDrawFunc(Randomizer_DrawOverworldKey);
|
||||
itemTable[RG_KAK_POTION_SHOP_KEY] = Item(RG_KAK_POTION_SHOP_KEY, Text{ "Kakariko Potion Shop Key", "", "Schlüssel für den Magie-Laden von Kakariko" }, ITEMTYPE_ITEM, GI_DOOR_KEY, true, LOGIC_KAK_POTION_SHOP_KEY, RHT_OVERWORLD_KEY, RG_KAK_POTION_SHOP_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER);
|
||||
itemTable[RG_KAK_POTION_SHOP_KEY].SetCustomDrawFunc(Randomizer_DrawOverworldKey);
|
||||
itemTable[RG_BOSS_HOUSE_KEY] = Item(RG_BOSS_HOUSE_KEY, Text{ "Boss's House Key", "", "Schlüssel für das Haus des Chefs" }, ITEMTYPE_ITEM, GI_DOOR_KEY, true, LOGIC_BOSS_HOUSE_KEY, RHT_OVERWORLD_KEY, RG_BOSS_HOUSE_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER);
|
||||
itemTable[RG_BOSS_HOUSE_KEY].SetCustomDrawFunc(Randomizer_DrawOverworldKey);
|
||||
itemTable[RG_GRANNYS_POTION_SHOP_KEY] = Item(RG_GRANNYS_POTION_SHOP_KEY, Text{ "Granny's Potion Shop Key", "", "Schlüssel für Asas Hexenladen" }, ITEMTYPE_ITEM, GI_DOOR_KEY, true, LOGIC_GRANNYS_POTION_SHOP_KEY, RHT_OVERWORLD_KEY, RG_GRANNYS_POTION_SHOP_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER);
|
||||
itemTable[RG_GRANNYS_POTION_SHOP_KEY].SetCustomDrawFunc(Randomizer_DrawOverworldKey);
|
||||
itemTable[RG_SKULLTULA_HOUSE_KEY] = Item(RG_SKULLTULA_HOUSE_KEY, Text{ "Skulltula House Key", "", "Schlüssel für das Skulltula-Haus" }, ITEMTYPE_ITEM, GI_DOOR_KEY, true, LOGIC_SKULLTULA_HOUSE_KEY, RHT_OVERWORLD_KEY, RG_SKULLTULA_HOUSE_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER);
|
||||
itemTable[RG_SKULLTULA_HOUSE_KEY].SetCustomDrawFunc(Randomizer_DrawOverworldKey);
|
||||
itemTable[RG_IMPAS_HOUSE_KEY] = Item(RG_IMPAS_HOUSE_KEY, Text{ "Impa's House Key", "", "Schlüssel für das Haus von Impa" }, ITEMTYPE_ITEM, GI_DOOR_KEY, true, LOGIC_IMPAS_HOUSE_KEY, RHT_OVERWORLD_KEY, RG_IMPAS_HOUSE_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER);
|
||||
itemTable[RG_IMPAS_HOUSE_KEY].SetCustomDrawFunc(Randomizer_DrawOverworldKey);
|
||||
itemTable[RG_WINDMILL_KEY] = Item(RG_WINDMILL_KEY, Text{ "Windmill Key", "", "Schlüssel für die Windmühle" }, ITEMTYPE_ITEM, GI_DOOR_KEY, true, LOGIC_WINDMILL_KEY, RHT_OVERWORLD_KEY, RG_WINDMILL_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER);
|
||||
itemTable[RG_WINDMILL_KEY].SetCustomDrawFunc(Randomizer_DrawOverworldKey);
|
||||
itemTable[RG_KAK_SHOOTING_GALLERY_KEY] = Item(RG_KAK_SHOOTING_GALLERY_KEY, Text{ "Kakariko Shooting Gallery Key", "", "Schlüssel für die Schießbude von Kakariko" }, ITEMTYPE_ITEM, GI_DOOR_KEY, true, LOGIC_KAK_SHOOTING_GALLERY_KEY, RHT_OVERWORLD_KEY, RG_KAK_SHOOTING_GALLERY_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER);
|
||||
itemTable[RG_KAK_SHOOTING_GALLERY_KEY].SetCustomDrawFunc(Randomizer_DrawOverworldKey);
|
||||
itemTable[RG_DAMPES_HUT_KEY] = Item(RG_DAMPES_HUT_KEY, Text{ "Dampe's Hut Key", "", "Schlüssel für die Hütte von Boris" }, ITEMTYPE_ITEM, GI_DOOR_KEY, true, LOGIC_DAMPES_HUT_KEY, RHT_OVERWORLD_KEY, RG_DAMPES_HUT_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER);
|
||||
itemTable[RG_DAMPES_HUT_KEY].SetCustomDrawFunc(Randomizer_DrawOverworldKey);
|
||||
itemTable[RG_TALONS_HOUSE_KEY] = Item(RG_TALONS_HOUSE_KEY, Text{ "Talon's House Key", "", "Schlüssel für das Haus von Talon" }, ITEMTYPE_ITEM, GI_DOOR_KEY, true, LOGIC_TALONS_HOUSE_KEY, RHT_OVERWORLD_KEY, RG_TALONS_HOUSE_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER);
|
||||
itemTable[RG_TALONS_HOUSE_KEY].SetCustomDrawFunc(Randomizer_DrawOverworldKey);
|
||||
itemTable[RG_STABLES_KEY] = Item(RG_STABLES_KEY, Text{ "Stables Key", "", "Schlüssel für die Ställe" }, ITEMTYPE_ITEM, GI_DOOR_KEY, true, LOGIC_STABLES_KEY, RHT_OVERWORLD_KEY, RG_STABLES_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER);
|
||||
itemTable[RG_STABLES_KEY].SetCustomDrawFunc(Randomizer_DrawOverworldKey);
|
||||
itemTable[RG_BACK_TOWER_KEY] = Item(RG_BACK_TOWER_KEY, Text{ "Back Tower Key", "", "Schlüssel für den hinteren Turm" }, ITEMTYPE_ITEM, GI_DOOR_KEY, true, LOGIC_BACK_TOWER_KEY, RHT_OVERWORLD_KEY, RG_BACK_TOWER_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER);
|
||||
itemTable[RG_BACK_TOWER_KEY].SetCustomDrawFunc(Randomizer_DrawOverworldKey);
|
||||
itemTable[RG_HYLIA_LAB_KEY] = Item(RG_HYLIA_LAB_KEY, Text{ "Hylia Laboratory Key", "", "Schlüssel für das Hylia-Labor" }, ITEMTYPE_ITEM, GI_DOOR_KEY, true, LOGIC_HYLIA_LAB_KEY, RHT_OVERWORLD_KEY, RG_HYLIA_LAB_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER);
|
||||
itemTable[RG_HYLIA_LAB_KEY].SetCustomDrawFunc(Randomizer_DrawOverworldKey);
|
||||
itemTable[RG_FISHING_HOLE_KEY] = Item(RG_FISHING_HOLE_KEY, Text{ "Fishing Hole Key", "", "Schlüssel für den Fischweiher" }, ITEMTYPE_ITEM, GI_DOOR_KEY, true, LOGIC_FISHING_HOLE_KEY, RHT_OVERWORLD_KEY, RG_FISHING_HOLE_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER);
|
||||
itemTable[RG_FISHING_HOLE_KEY].SetCustomDrawFunc(Randomizer_DrawOverworldKey);
|
||||
// Key Rings
|
||||
itemTable[RG_FOREST_TEMPLE_KEY_RING] = Item(RG_FOREST_TEMPLE_KEY_RING, Text{ "Forest Temple Key Ring", "Trousseau du Temple de la Forêt", "Schlüsselbund für den Waldtempel" }, ITEMTYPE_SMALLKEY, 0xD5, true, LOGIC_FOREST_TEMPLE_KEYS, RHT_FOREST_TEMPLE_KEY_RING, RG_FOREST_TEMPLE_KEY_RING, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER);
|
||||
itemTable[RG_FOREST_TEMPLE_KEY_RING].SetCustomDrawFunc(Randomizer_DrawKeyRing);
|
||||
|
@ -23,14 +23,10 @@ class EventAccess {
|
||||
|
||||
bool ConditionsMet() const {
|
||||
auto ctx = Rando::Context::GetInstance();
|
||||
if (ctx->GetOption(RSK_LOGIC_RULES).Is(RO_LOGIC_NO_LOGIC) || ctx->GetOption(RSK_LOGIC_RULES).Is(RO_LOGIC_VANILLA)) {
|
||||
return true;
|
||||
} else if (ctx->GetOption(RSK_LOGIC_RULES).Is(RO_LOGIC_GLITCHLESS)) {
|
||||
return condition_function();
|
||||
} else if (ctx->GetOption(RSK_LOGIC_RULES).Is(RO_LOGIC_GLITCHED)) {
|
||||
if (ctx->GetOption(RSK_LOGIC_RULES).Is(RO_LOGIC_GLITCHLESS)) {
|
||||
return condition_function();
|
||||
}
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
bool CheckConditionAtAgeTime(bool& age, bool& time) {
|
||||
@ -71,14 +67,10 @@ class LocationAccess {
|
||||
|
||||
bool GetConditionsMet() const {
|
||||
auto ctx = Rando::Context::GetInstance();
|
||||
if (ctx->GetOption(RSK_LOGIC_RULES).Is(RO_LOGIC_NO_LOGIC) || ctx->GetOption(RSK_LOGIC_RULES).Is(RO_LOGIC_VANILLA)) {
|
||||
return true;
|
||||
} else if (ctx->GetOption(RSK_LOGIC_RULES).Is(RO_LOGIC_GLITCHLESS)) {
|
||||
return condition_function();
|
||||
} else if (ctx->GetOption(RSK_LOGIC_RULES).Is(RO_LOGIC_GLITCHED)) {
|
||||
if (ctx->GetOption(RSK_LOGIC_RULES).Is(RO_LOGIC_GLITCHLESS)) {
|
||||
return condition_function();
|
||||
}
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
bool CheckConditionAtAgeTime(bool& age, bool& time) const;
|
||||
|
@ -71,6 +71,7 @@ void RegionTable_Init_DeathMountainTrail() {
|
||||
LOCATION(RC_DMT_COW_GROTTO_RUPEE_5, true),
|
||||
LOCATION(RC_DMT_COW_GROTTO_RUPEE_6, true),
|
||||
LOCATION(RC_DMT_COW_GROTTO_RED_RUPEE, true),
|
||||
LOCATION(RC_DMT_COW_GROTTO_STORMS_FAIRY, logic->CanUse(RG_SONG_OF_STORMS)),
|
||||
LOCATION(RC_DMT_COW_GROTTO_GRASS_1, logic->CanCutShrubs()),
|
||||
LOCATION(RC_DMT_COW_GROTTO_GRASS_2, logic->CanCutShrubs()),
|
||||
}, {
|
||||
|
@ -36,7 +36,7 @@ void RegionTable_Init_Graveyard() {
|
||||
Entrance(RR_GRAVEYARD_COMPOSERS_GRAVE, []{return logic->CanUse(RG_ZELDAS_LULLABY);}),
|
||||
Entrance(RR_GRAVEYARD_HEART_PIECE_GRAVE, []{return logic->IsAdult || logic->AtNight;}),
|
||||
Entrance(RR_GRAVEYARD_DAMPES_GRAVE, []{return logic->IsAdult;}),
|
||||
Entrance(RR_GRAVEYARD_DAMPES_HOUSE, []{return logic->IsAdult /*|| logic->AtDampeTime*/;}), //TODO: This needs to be handled in ToD rework
|
||||
Entrance(RR_GRAVEYARD_DAMPES_HOUSE, []{return logic->IsAdult && logic->CanOpenOverworldDoor(RG_DAMPES_HUT_KEY) /*|| logic->AtDampeTime*/;}), //TODO: This needs to be handled in ToD rework
|
||||
Entrance(RR_KAKARIKO_VILLAGE, []{return true;}),
|
||||
Entrance(RR_GRAVEYARD_WARP_PAD_REGION, []{return false;}),
|
||||
});
|
||||
@ -115,7 +115,7 @@ void RegionTable_Init_Graveyard() {
|
||||
LOCATION(RC_DAMPE_HINT, logic->IsAdult),
|
||||
}, {
|
||||
//Exits
|
||||
Entrance(RR_THE_GRAVEYARD, []{return true;}),
|
||||
Entrance(RR_THE_GRAVEYARD, []{return logic->CanOpenOverworldDoor(RG_DAMPES_HUT_KEY);}),
|
||||
});
|
||||
|
||||
areaTable[RR_GRAVEYARD_WARP_PAD_REGION] = Region("Graveyard Warp Pad Region", "Graveyard", {RA_THE_GRAVEYARD}, NO_DAY_NIGHT_CYCLE, {
|
||||
|
@ -41,14 +41,14 @@ void RegionTable_Init_Kakariko() {
|
||||
}, {
|
||||
//Exits
|
||||
Entrance(RR_HYRULE_FIELD, []{return true;}),
|
||||
Entrance(RR_KAK_CARPENTER_BOSS_HOUSE, []{return true;}),
|
||||
Entrance(RR_KAK_HOUSE_OF_SKULLTULA, []{return true;}),
|
||||
Entrance(RR_KAK_IMPAS_HOUSE, []{return true;}),
|
||||
Entrance(RR_KAK_WINDMILL, []{return true;}),
|
||||
Entrance(RR_KAK_BAZAAR, []{return logic->IsAdult && logic->AtDay;}),
|
||||
Entrance(RR_KAK_SHOOTING_GALLERY, []{return logic->IsAdult && logic->AtDay;}),
|
||||
Entrance(RR_KAK_CARPENTER_BOSS_HOUSE, []{return logic->CanOpenOverworldDoor(RG_BOSS_HOUSE_KEY);}),
|
||||
Entrance(RR_KAK_HOUSE_OF_SKULLTULA, []{return logic->CanOpenOverworldDoor(RG_SKULLTULA_HOUSE_KEY);}),
|
||||
Entrance(RR_KAK_IMPAS_HOUSE, []{return logic->CanOpenOverworldDoor(RG_IMPAS_HOUSE_KEY);}),
|
||||
Entrance(RR_KAK_WINDMILL, []{return logic->CanOpenOverworldDoor(RG_WINDMILL_KEY);}),
|
||||
Entrance(RR_KAK_BAZAAR, []{return logic->IsAdult && logic->AtDay && logic->CanOpenOverworldDoor(RG_KAK_BAZAAR_KEY);}),
|
||||
Entrance(RR_KAK_SHOOTING_GALLERY, []{return logic->IsAdult && logic->AtDay && logic->CanOpenOverworldDoor(RG_KAK_SHOOTING_GALLERY_KEY);}),
|
||||
Entrance(RR_KAK_WELL, []{return logic->IsAdult || logic->DrainWell || logic->CanUse(RG_IRON_BOOTS);}),
|
||||
Entrance(RR_KAK_POTION_SHOP_FRONT, []{return logic->AtDay || logic->IsChild;}),
|
||||
Entrance(RR_KAK_POTION_SHOP_FRONT, []{return logic->AtDay || logic->IsChild && logic->CanOpenOverworldDoor(RG_KAK_POTION_SHOP_KEY);}),
|
||||
Entrance(RR_KAK_REDEAD_GROTTO, []{return logic->CanOpenBombGrotto();}),
|
||||
Entrance(RR_KAK_IMPAS_LEDGE, []{return (logic->IsChild && logic->AtDay) || (logic->IsAdult && ctx->GetTrickOption(RT_VISIBLE_COLLISION));}),
|
||||
Entrance(RR_KAK_WATCHTOWER, []{return logic->IsAdult || logic->AtDay || logic->CanKillEnemy(RE_GOLD_SKULLTULA, ED_LONGSHOT) || (ctx->GetTrickOption(RT_KAK_TOWER_GS) && logic->CanJumpslashExceptHammer());}),
|
||||
@ -103,8 +103,8 @@ void RegionTable_Init_Kakariko() {
|
||||
//Exits
|
||||
Entrance(RR_KAKARIKO_VILLAGE, []{return true;}),
|
||||
Entrance(RR_KAK_OPEN_GROTTO, []{return true;}),
|
||||
Entrance(RR_KAK_ODD_POTION_BUILDING, []{return logic->IsAdult;}),
|
||||
Entrance(RR_KAK_POTION_SHOP_BACK, []{return logic->IsAdult && logic->AtDay;}),
|
||||
Entrance(RR_KAK_ODD_POTION_BUILDING, []{return logic->IsAdult && logic->CanOpenOverworldDoor(RG_GRANNYS_POTION_SHOP_KEY);}),
|
||||
Entrance(RR_KAK_POTION_SHOP_BACK, []{return logic->IsAdult && logic->AtDay && logic->CanOpenOverworldDoor(RG_KAK_POTION_SHOP_KEY);}),
|
||||
});
|
||||
|
||||
areaTable[RR_KAK_CARPENTER_BOSS_HOUSE] = Region("Kak Carpenter Boss House", "Kak Carpenter Boss House", {}, NO_DAY_NIGHT_CYCLE, {
|
||||
@ -112,7 +112,7 @@ void RegionTable_Init_Kakariko() {
|
||||
EventAccess(&logic->WakeUpAdultTalon, []{return logic->IsAdult && logic->CanUse(RG_POCKET_EGG);}),
|
||||
}, {}, {
|
||||
//Exits
|
||||
Entrance(RR_KAKARIKO_VILLAGE, []{return true;}),
|
||||
Entrance(RR_KAKARIKO_VILLAGE, []{return logic->CanOpenOverworldDoor(RG_BOSS_HOUSE_KEY);}),
|
||||
});
|
||||
|
||||
areaTable[RR_KAK_HOUSE_OF_SKULLTULA] = Region("Kak House of Skulltula", "Kak House of Skulltula", {}, NO_DAY_NIGHT_CYCLE, {}, {
|
||||
@ -125,7 +125,7 @@ void RegionTable_Init_Kakariko() {
|
||||
LOCATION(RC_KAK_100_GOLD_SKULLTULA_REWARD, logic->GetGSCount() >= 100),
|
||||
}, {
|
||||
//Exits
|
||||
Entrance(RR_KAKARIKO_VILLAGE, []{return true;}),
|
||||
Entrance(RR_KAKARIKO_VILLAGE, []{return logic->CanOpenOverworldDoor(RG_SKULLTULA_HOUSE_KEY);}),
|
||||
});
|
||||
|
||||
areaTable[RR_KAK_IMPAS_HOUSE] = Region("Kak Impas House", "Kak Impas House", {}, NO_DAY_NIGHT_CYCLE, {}, {
|
||||
@ -133,7 +133,7 @@ void RegionTable_Init_Kakariko() {
|
||||
LOCATION(RC_KAK_IMPAS_HOUSE_COW, logic->CanUse(RG_EPONAS_SONG)),
|
||||
}, {
|
||||
//Exits
|
||||
Entrance(RR_KAKARIKO_VILLAGE, []{return true;}),
|
||||
Entrance(RR_KAKARIKO_VILLAGE, []{return logic->CanOpenOverworldDoor(RG_IMPAS_HOUSE_KEY);}),
|
||||
});
|
||||
|
||||
areaTable[RR_KAK_IMPAS_HOUSE_BACK] = Region("Kak Impas House Back", "Kak Impas House", {}, NO_DAY_NIGHT_CYCLE, {}, {
|
||||
@ -154,7 +154,7 @@ void RegionTable_Init_Kakariko() {
|
||||
LOCATION(RC_SONG_FROM_WINDMILL, logic->IsAdult && logic->HasItem(RG_FAIRY_OCARINA)),
|
||||
}, {
|
||||
//Exits
|
||||
Entrance(RR_KAKARIKO_VILLAGE, []{return true;}),
|
||||
Entrance(RR_KAKARIKO_VILLAGE, []{return logic->CanOpenOverworldDoor(RG_WINDMILL_KEY);}),
|
||||
});
|
||||
|
||||
areaTable[RR_KAK_BAZAAR] = Region("Kak Bazaar", "Kak Bazaar", {}, NO_DAY_NIGHT_CYCLE, {}, {
|
||||
@ -177,7 +177,7 @@ void RegionTable_Init_Kakariko() {
|
||||
LOCATION(RC_KAK_SHOOTING_GALLERY_REWARD, logic->HasItem(RG_CHILD_WALLET) && logic->IsAdult && logic->CanUse(RG_FAIRY_BOW)),
|
||||
}, {
|
||||
//Exits
|
||||
Entrance(RR_KAKARIKO_VILLAGE, []{return true;}),
|
||||
Entrance(RR_KAKARIKO_VILLAGE, []{return logic->CanOpenOverworldDoor(RG_KAK_SHOOTING_GALLERY_KEY);}),
|
||||
});
|
||||
|
||||
areaTable[RR_KAK_POTION_SHOP_FRONT] = Region("Kak Potion Shop Front", "Kak Potion Shop", {}, NO_DAY_NIGHT_CYCLE, {}, {
|
||||
@ -211,7 +211,7 @@ void RegionTable_Init_Kakariko() {
|
||||
LOCATION(RC_KAK_GRANNYS_SHOP, logic->IsAdult && (logic->CanUse(RG_ODD_MUSHROOM) || logic->TradeQuestStep(RG_ODD_MUSHROOM))),
|
||||
}, {
|
||||
// Exits
|
||||
Entrance(RR_KAK_BACKYARD, []{return true;}),
|
||||
Entrance(RR_KAK_BACKYARD, []{return logic->CanOpenOverworldDoor(RG_GRANNYS_POTION_SHOP_KEY);}),
|
||||
});
|
||||
|
||||
areaTable[RR_KAK_REDEAD_GROTTO] = Region("Kak Redead Grotto", "Kak Redead Grotto", {}, NO_DAY_NIGHT_CYCLE, {}, {
|
||||
|
@ -86,7 +86,7 @@ void RegionTable_Init_LakeHylia() {
|
||||
Entrance(RR_ZORAS_DOMAIN, []{return logic->IsChild && (logic->HasItem(RG_SILVER_SCALE) || logic->CanUse(RG_IRON_BOOTS));}),
|
||||
Entrance(RR_LH_OWL_FLIGHT, []{return logic->IsChild;}),
|
||||
Entrance(RR_LH_FISHING_ISLAND, []{return ((logic->IsChild || logic->WaterTempleClear) && logic->HasItem(RG_BRONZE_SCALE)) || (logic->IsAdult && (logic->CanUse(RG_SCARECROW) || CanPlantBean(RR_LAKE_HYLIA)));}),
|
||||
Entrance(RR_LH_LAB, []{return true;}),
|
||||
Entrance(RR_LH_LAB, []{return logic->CanOpenOverworldDoor(RG_HYLIA_LAB_KEY);}),
|
||||
Entrance(RR_WATER_TEMPLE_ENTRYWAY, []{return logic->CanUse(RG_HOOKSHOT) && ((logic->CanUse(RG_IRON_BOOTS) || (ctx->GetTrickOption(RT_LH_WATER_HOOKSHOT) && logic->HasItem(RG_GOLDEN_SCALE))) || (logic->IsAdult && logic->CanUse(RG_LONGSHOT) && logic->HasItem(RG_GOLDEN_SCALE)));}),
|
||||
Entrance(RR_LH_GROTTO, []{return true;}),
|
||||
});
|
||||
@ -94,7 +94,7 @@ void RegionTable_Init_LakeHylia() {
|
||||
areaTable[RR_LH_FISHING_ISLAND] = Region("LH Fishing Island", "Lake Hylia", {RA_LAKE_HYLIA}, DAY_NIGHT_CYCLE, {}, {}, {
|
||||
//Exits
|
||||
Entrance(RR_LAKE_HYLIA, []{return logic->HasItem(RG_BRONZE_SCALE);}),
|
||||
Entrance(RR_LH_FISHING_POND, []{return true;}),
|
||||
Entrance(RR_LH_FISHING_POND, []{return logic->CanOpenOverworldDoor(RG_FISHING_HOLE_KEY);}),
|
||||
});
|
||||
|
||||
areaTable[RR_LH_OWL_FLIGHT] = Region("LH Owl Flight", "Lake Hylia", {RA_LAKE_HYLIA}, NO_DAY_NIGHT_CYCLE, {}, {}, {
|
||||
@ -112,7 +112,7 @@ void RegionTable_Init_LakeHylia() {
|
||||
LOCATION(RC_LH_LAB_RIGHT_RUPEE, logic->CanUse(RG_IRON_BOOTS) || logic->HasItem(RG_GOLDEN_SCALE)),
|
||||
}, {
|
||||
//Exits
|
||||
Entrance(RR_LAKE_HYLIA, []{return true;}),
|
||||
Entrance(RR_LAKE_HYLIA, []{return logic->CanOpenOverworldDoor(RG_HYLIA_LAB_KEY);}),
|
||||
});
|
||||
|
||||
// TODO: should some of these helpers be done via events instead?
|
||||
@ -157,7 +157,7 @@ void RegionTable_Init_LakeHylia() {
|
||||
LOCATION(RC_FISHING_POLE_HINT, true),
|
||||
}, {
|
||||
//Exits
|
||||
Entrance(RR_LH_FISHING_ISLAND, []{return true;}),
|
||||
Entrance(RR_LH_FISHING_ISLAND, []{return logic->CanOpenOverworldDoor(RG_FISHING_HOLE_KEY);}),
|
||||
});
|
||||
|
||||
areaTable[RR_LH_GROTTO] = Region("LH Grotto", "LH Grotto", {}, NO_DAY_NIGHT_CYCLE, {}, {
|
||||
|
@ -25,9 +25,9 @@ void RegionTable_Init_LonLonRanch() {
|
||||
}, {
|
||||
//Exits
|
||||
Entrance(RR_HYRULE_FIELD, []{return true;}),
|
||||
Entrance(RR_LLR_TALONS_HOUSE, []{return true;}),
|
||||
Entrance(RR_LLR_STABLES, []{return true;}),
|
||||
Entrance(RR_LLR_TOWER, []{return true;}),
|
||||
Entrance(RR_LLR_TALONS_HOUSE, []{return logic->CanOpenOverworldDoor(RG_TALONS_HOUSE_KEY);}),
|
||||
Entrance(RR_LLR_STABLES, []{return logic->CanOpenOverworldDoor(RG_STABLES_KEY);}),
|
||||
Entrance(RR_LLR_TOWER, []{return logic->CanOpenOverworldDoor(RG_BACK_TOWER_KEY);}),
|
||||
Entrance(RR_LLR_GROTTO, []{return logic->IsChild;}),
|
||||
});
|
||||
|
||||
@ -39,7 +39,7 @@ void RegionTable_Init_LonLonRanch() {
|
||||
LOCATION(RC_LLR_TALONS_HOUSE_POT_3, logic->CanBreakPots()),
|
||||
}, {
|
||||
//Exits
|
||||
Entrance(RR_LON_LON_RANCH, []{return true;}),
|
||||
Entrance(RR_LON_LON_RANCH, []{return logic->CanOpenOverworldDoor(RG_TALONS_HOUSE_KEY);}),
|
||||
});
|
||||
|
||||
areaTable[RR_LLR_STABLES] = Region("LLR Stables", "LLR Stables", {}, NO_DAY_NIGHT_CYCLE, {}, {
|
||||
@ -48,7 +48,7 @@ void RegionTable_Init_LonLonRanch() {
|
||||
LOCATION(RC_LLR_STABLES_RIGHT_COW, logic->CanUse(RG_EPONAS_SONG)),
|
||||
}, {
|
||||
//Exits
|
||||
Entrance(RR_LON_LON_RANCH, []{return true;}),
|
||||
Entrance(RR_LON_LON_RANCH, []{return logic->CanOpenOverworldDoor(RG_STABLES_KEY);}),
|
||||
});
|
||||
|
||||
areaTable[RR_LLR_TOWER] = Region("LLR Tower", "LLR Tower", {}, NO_DAY_NIGHT_CYCLE, {}, {
|
||||
@ -58,7 +58,7 @@ void RegionTable_Init_LonLonRanch() {
|
||||
LOCATION(RC_LLR_TOWER_RIGHT_COW, logic->CanUse(RG_EPONAS_SONG)),
|
||||
}, {
|
||||
//Exits
|
||||
Entrance(RR_LON_LON_RANCH, []{return true;}),
|
||||
Entrance(RR_LON_LON_RANCH, []{return logic->CanOpenOverworldDoor(RG_BACK_TOWER_KEY);}),
|
||||
});
|
||||
|
||||
areaTable[RR_LLR_GROTTO] = Region("LLR Grotto", "LLR Grotto", {}, NO_DAY_NIGHT_CYCLE, {}, {
|
||||
|
@ -8,7 +8,7 @@ void RegionTable_Init_Market() {
|
||||
//Exits
|
||||
Entrance(RR_HYRULE_FIELD, []{return logic->IsAdult || logic->AtDay;}),
|
||||
Entrance(RR_THE_MARKET, []{return true;}),
|
||||
Entrance(RR_MARKET_GUARD_HOUSE, []{return true;}),
|
||||
Entrance(RR_MARKET_GUARD_HOUSE, []{return logic->CanOpenOverworldDoor(RG_GUARD_HOUSE_KEY);}),
|
||||
});
|
||||
|
||||
areaTable[RR_THE_MARKET] = Region("Market", "Market", {RA_THE_MARKET}, NO_DAY_NIGHT_CYCLE, {}, {
|
||||
@ -26,21 +26,21 @@ void RegionTable_Init_Market() {
|
||||
Entrance(RR_MARKET_ENTRANCE, []{return true;}),
|
||||
Entrance(RR_TOT_ENTRANCE, []{return true;}),
|
||||
Entrance(RR_CASTLE_GROUNDS, []{return true;}),
|
||||
Entrance(RR_MARKET_BAZAAR, []{return logic->IsChild && logic->AtDay;}),
|
||||
Entrance(RR_MARKET_MASK_SHOP, []{return logic->IsChild && logic->AtDay;}),
|
||||
Entrance(RR_MARKET_SHOOTING_GALLERY, []{return logic->IsChild && logic->AtDay;}),
|
||||
Entrance(RR_MARKET_BOMBCHU_BOWLING, []{return logic->IsChild;}),
|
||||
Entrance(RR_MARKET_TREASURE_CHEST_GAME, []{return logic->IsChild && logic->AtNight;}),
|
||||
Entrance(RR_MARKET_POTION_SHOP, []{return logic->IsChild && logic->AtDay;}),
|
||||
Entrance(RR_MARKET_BAZAAR, []{return logic->IsChild && logic->AtDay && logic->CanOpenOverworldDoor(RG_MARKET_BAZAAR_KEY);}),
|
||||
Entrance(RR_MARKET_MASK_SHOP, []{return logic->IsChild && logic->AtDay && logic->CanOpenOverworldDoor(RG_MASK_SHOP_KEY);}),
|
||||
Entrance(RR_MARKET_SHOOTING_GALLERY, []{return logic->IsChild && logic->AtDay && logic->CanOpenOverworldDoor(RG_MARKET_SHOOTING_GALLERY_KEY);}),
|
||||
Entrance(RR_MARKET_BOMBCHU_BOWLING, []{return logic->IsChild && logic->CanOpenOverworldDoor(RG_BOMBCHU_BOWLING_KEY);}),
|
||||
Entrance(RR_MARKET_TREASURE_CHEST_GAME, []{return logic->IsChild && logic->AtNight && logic->CanOpenOverworldDoor(RG_TREASURE_CHEST_GAME_BUILDING_KEY);}),
|
||||
Entrance(RR_MARKET_POTION_SHOP, []{return logic->IsChild && logic->AtDay && logic->CanOpenOverworldDoor(RG_MARKET_POTION_SHOP_KEY);}),
|
||||
Entrance(RR_MARKET_BACK_ALLEY, []{return logic->IsChild;}),
|
||||
});
|
||||
|
||||
areaTable[RR_MARKET_BACK_ALLEY] = Region("Market Back Alley", "Market", {RA_THE_MARKET}, NO_DAY_NIGHT_CYCLE, {}, {}, {
|
||||
//Exits
|
||||
Entrance(RR_THE_MARKET, []{return true;}),
|
||||
Entrance(RR_MARKET_BOMBCHU_SHOP, []{return logic->AtNight;}),
|
||||
Entrance(RR_MARKET_DOG_LADY_HOUSE, []{return true;}),
|
||||
Entrance(RR_MARKET_MAN_IN_GREEN_HOUSE, []{return logic->AtNight;}),
|
||||
Entrance(RR_MARKET_BOMBCHU_SHOP, []{return logic->AtNight && logic->CanOpenOverworldDoor(RG_BOMBCHU_SHOP_KEY);}),
|
||||
Entrance(RR_MARKET_DOG_LADY_HOUSE, []{return logic->CanOpenOverworldDoor(RG_RICHARDS_HOUSE_KEY);}),
|
||||
Entrance(RR_MARKET_MAN_IN_GREEN_HOUSE, []{return logic->AtNight && logic->CanOpenOverworldDoor(RG_ALLEY_HOUSE_KEY);}),
|
||||
});
|
||||
|
||||
areaTable[RR_MARKET_GUARD_HOUSE] = Region("Market Guard House", "Market Guard House", {}, NO_DAY_NIGHT_CYCLE, {
|
||||
@ -108,7 +108,7 @@ void RegionTable_Init_Market() {
|
||||
LOCATION(RC_MK_GUARD_HOUSE_ADULT_POT_11, logic->IsAdult && logic->CanBreakPots()),
|
||||
}, {
|
||||
//Exits
|
||||
Entrance(RR_MARKET_ENTRANCE, []{return true;}),
|
||||
Entrance(RR_MARKET_ENTRANCE, []{return logic->CanOpenOverworldDoor(RG_GUARD_HOUSE_KEY);}),
|
||||
});
|
||||
|
||||
areaTable[RR_MARKET_BAZAAR] = Region("Market Bazaar", "Market Bazaar", {}, NO_DAY_NIGHT_CYCLE, {}, {
|
||||
@ -143,7 +143,7 @@ void RegionTable_Init_Market() {
|
||||
LOCATION(RC_MARKET_SHOOTING_GALLERY_REWARD, logic->IsChild && logic->HasItem(RG_CHILD_WALLET)),
|
||||
}, {
|
||||
//Exits
|
||||
Entrance(RR_THE_MARKET, []{return true;}),
|
||||
Entrance(RR_THE_MARKET, []{return logic->CanOpenOverworldDoor(RG_MARKET_SHOOTING_GALLERY_KEY);}),
|
||||
});
|
||||
|
||||
areaTable[RR_MARKET_BOMBCHU_BOWLING] = Region("Market Bombchu Bowling", "Market Bombchu Bowling", {}, NO_DAY_NIGHT_CYCLE, {
|
||||
@ -155,7 +155,7 @@ void RegionTable_Init_Market() {
|
||||
LOCATION(RC_MARKET_BOMBCHU_BOWLING_SECOND_PRIZE, logic->CouldPlayBowling && logic->BombchusEnabled()),
|
||||
}, {
|
||||
//Exits
|
||||
Entrance(RR_THE_MARKET, []{return true;}),
|
||||
Entrance(RR_THE_MARKET, []{return logic->CanOpenOverworldDoor(RG_BOMBCHU_BOWLING_KEY);}),
|
||||
});
|
||||
|
||||
areaTable[RR_MARKET_POTION_SHOP] = Region("Market Potion Shop", "Market Potion Shop", {}, NO_DAY_NIGHT_CYCLE, {}, {
|
||||
@ -189,7 +189,7 @@ void RegionTable_Init_Market() {
|
||||
LOCATION(RC_MARKET_TREASURE_CHEST_GAME_ITEM_5, logic->HasItem(RG_CHILD_WALLET) && ((ctx->GetOption(RSK_SHUFFLE_CHEST_MINIGAME).Is(RO_CHEST_GAME_SINGLE_KEYS) && logic->SmallKeys(RR_MARKET_TREASURE_CHEST_GAME, 5)) || (ctx->GetOption(RSK_SHUFFLE_CHEST_MINIGAME).Is(RO_CHEST_GAME_PACK) && logic->SmallKeys(RR_MARKET_TREASURE_CHEST_GAME, 1)) || (logic->CanUse(RG_LENS_OF_TRUTH) && !ctx->GetOption(RSK_SHUFFLE_CHEST_MINIGAME)))),
|
||||
}, {
|
||||
//Exits
|
||||
Entrance(RR_THE_MARKET, []{return true;}),
|
||||
Entrance(RR_THE_MARKET, []{return logic->CanOpenOverworldDoor(RG_TREASURE_CHEST_GAME_BUILDING_KEY);}),
|
||||
});
|
||||
|
||||
areaTable[RR_MARKET_BOMBCHU_SHOP] = Region("Market Bombchu Shop", "Market Bombchu Shop", {}, NO_DAY_NIGHT_CYCLE, {}, {
|
||||
@ -212,7 +212,7 @@ void RegionTable_Init_Market() {
|
||||
LOCATION(RC_MARKET_LOST_DOG, logic->IsChild && logic->AtNight),
|
||||
}, {
|
||||
//Exits
|
||||
Entrance(RR_MARKET_BACK_ALLEY, []{return true;}),
|
||||
Entrance(RR_MARKET_BACK_ALLEY, []{return logic->CanOpenOverworldDoor(RG_RICHARDS_HOUSE_KEY);}),
|
||||
});
|
||||
|
||||
areaTable[RR_MARKET_MAN_IN_GREEN_HOUSE] = Region("Market Man in Green House", "Market Man in Green House", {}, NO_DAY_NIGHT_CYCLE, {}, {
|
||||
@ -222,6 +222,6 @@ void RegionTable_Init_Market() {
|
||||
LOCATION(RC_MK_BACK_ALLEY_HOUSE_POT_3, logic->CanBreakPots()),
|
||||
}, {
|
||||
//Exits
|
||||
Entrance(RR_MARKET_BACK_ALLEY, []{return true;}),
|
||||
Entrance(RR_MARKET_BACK_ALLEY, []{return logic->CanOpenOverworldDoor(RG_ALLEY_HOUSE_KEY);}),
|
||||
});
|
||||
}
|
@ -2168,6 +2168,7 @@ void Rando::StaticData::InitLocationTable() { //
|
||||
locationTable[RC_HF_POND_STORMS_FAIRY] = Location::Fairy(RC_HF_POND_STORMS_FAIRY, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(0x1000, 5012), "Pond Song of Storms Fairy", "Pond Song of Storms Fairy", RHT_HF_POND_STORMS_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_POND_STORMS_FAIRY));
|
||||
locationTable[RC_HF_FENCE_GROTTO_STORMS_FAIRY] = Location::Fairy(RC_HF_FENCE_GROTTO_STORMS_FAIRY, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_GROTTOS, TWO_ACTOR_PARAMS(0x1000, -308), "Inside Fence Storms Fairy", "Inside Fence Storms Fairy", RHT_HF_FENCE_GROTTO_STORMS_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_FENCE_GROTTO_STORMS_FAIRY));
|
||||
locationTable[RC_DMT_FLAG_SUN_FAIRY] = Location::Fairy(RC_DMT_FLAG_SUN_FAIRY, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_TRAIL, SCENE_DEATH_MOUNTAIN_TRAIL, TWO_ACTOR_PARAMS(0x1000, 464), "Flag Sun's Song Fairy", "Flag Sun's Song Fairy", RHT_DMT_FLAG_SUN_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMT_FLAG_SUN_FAIRY));
|
||||
locationTable[RC_DMT_COW_GROTTO_STORMS_FAIRY] = Location::Fairy(RC_DMT_COW_GROTTO_STORMS_FAIRY, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_TRAIL, SCENE_GROTTOS, TWO_ACTOR_PARAMS(0x1000, -311), "Cow Grotto Song of Storms Fairy", "Cow Grotto Song of Storms Fairy", RHT_DMT_COW_GROTTO_STORMS_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMT_COW_GROTTO_STORMS_FAIRY));
|
||||
locationTable[RC_LW_SHORTCUT_STORMS_FAIRY] = Location::Fairy(RC_LW_SHORTCUT_STORMS_FAIRY, RCQUEST_BOTH, RCAREA_LOST_WOODS, SCENE_LOST_WOODS, TWO_ACTOR_PARAMS(0x1000, -795), "Shortcuts Song of Storms Fairy", "Shortcuts Song of Storms Fairy", RHT_LW_SHORTCUT_STORMS_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_SHORTCUT_STORMS_FAIRY));
|
||||
locationTable[RC_GF_KITCHEN_SUN_FAIRY] = Location::Fairy(RC_GF_KITCHEN_SUN_FAIRY, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(0x1000, -621), "Kitchen Sun's Song Fairy", "Kitchen Sun's Song Fairy", RHT_GF_KITCHEN_SUN_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_KITCHEN_SUN_FAIRY));
|
||||
|
||||
|
@ -140,6 +140,31 @@ namespace Rando {
|
||||
case RG_TWINROVA_SOUL:
|
||||
case RG_GANON_SOUL:
|
||||
case RG_SKELETON_KEY:
|
||||
// Overworld Keys
|
||||
case RG_GUARD_HOUSE_KEY:
|
||||
case RG_MARKET_BAZAAR_KEY:
|
||||
case RG_MARKET_POTION_SHOP_KEY:
|
||||
case RG_MASK_SHOP_KEY:
|
||||
case RG_MARKET_SHOOTING_GALLERY_KEY:
|
||||
case RG_BOMBCHU_BOWLING_KEY:
|
||||
case RG_TREASURE_CHEST_GAME_BUILDING_KEY:
|
||||
case RG_BOMBCHU_SHOP_KEY:
|
||||
case RG_RICHARDS_HOUSE_KEY:
|
||||
case RG_ALLEY_HOUSE_KEY:
|
||||
case RG_KAK_BAZAAR_KEY:
|
||||
case RG_KAK_POTION_SHOP_KEY:
|
||||
case RG_BOSS_HOUSE_KEY:
|
||||
case RG_GRANNYS_POTION_SHOP_KEY:
|
||||
case RG_SKULLTULA_HOUSE_KEY:
|
||||
case RG_IMPAS_HOUSE_KEY:
|
||||
case RG_WINDMILL_KEY:
|
||||
case RG_KAK_SHOOTING_GALLERY_KEY:
|
||||
case RG_DAMPES_HUT_KEY:
|
||||
case RG_TALONS_HOUSE_KEY:
|
||||
case RG_STABLES_KEY:
|
||||
case RG_BACK_TOWER_KEY:
|
||||
case RG_HYLIA_LAB_KEY:
|
||||
case RG_FISHING_HOLE_KEY:
|
||||
return CheckRandoInf(RandoGetToRandInf.at(itemName));
|
||||
// Boss Keys
|
||||
case RG_EPONA:
|
||||
@ -382,6 +407,18 @@ namespace Rando {
|
||||
}
|
||||
}
|
||||
|
||||
bool Logic::CanOpenOverworldDoor(RandomizerGet key) {
|
||||
if (!ctx->GetOption(RSK_LOCK_OVERWORLD_DOORS)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
if (HasItem(RG_SKELETON_KEY)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
return HasItem(key);
|
||||
}
|
||||
|
||||
uint8_t GetDifficultyValueFromString(Rando::Option& glitchOption) {
|
||||
return 0;
|
||||
}
|
||||
@ -1293,7 +1330,31 @@ namespace Rando {
|
||||
{ RG_OCARINA_C_RIGHT_BUTTON, RAND_INF_HAS_OCARINA_C_RIGHT },
|
||||
{ RG_SKELETON_KEY, RAND_INF_HAS_SKELETON_KEY },
|
||||
{ RG_GREG_RUPEE, RAND_INF_GREG_FOUND },
|
||||
{ RG_FISHING_POLE, RAND_INF_FISHING_POLE_FOUND }
|
||||
{ RG_FISHING_POLE, RAND_INF_FISHING_POLE_FOUND },
|
||||
{ RG_GUARD_HOUSE_KEY, RAND_INF_GUARD_HOUSE_KEY_OBTAINED },
|
||||
{ RG_MARKET_BAZAAR_KEY, RAND_INF_MARKET_BAZAAR_KEY_OBTAINED },
|
||||
{ RG_MARKET_POTION_SHOP_KEY, RAND_INF_MARKET_POTION_SHOP_KEY_OBTAINED },
|
||||
{ RG_MASK_SHOP_KEY, RAND_INF_MASK_SHOP_KEY_OBTAINED },
|
||||
{ RG_MARKET_SHOOTING_GALLERY_KEY, RAND_INF_MARKET_SHOOTING_GALLERY_KEY_OBTAINED },
|
||||
{ RG_BOMBCHU_BOWLING_KEY, RAND_INF_BOMBCHU_BOWLING_KEY_OBTAINED },
|
||||
{ RG_TREASURE_CHEST_GAME_BUILDING_KEY, RAND_INF_TREASURE_CHEST_GAME_BUILDING_KEY_OBTAINED },
|
||||
{ RG_BOMBCHU_SHOP_KEY, RAND_INF_BOMBCHU_SHOP_KEY_OBTAINED },
|
||||
{ RG_RICHARDS_HOUSE_KEY, RAND_INF_RICHARDS_HOUSE_KEY_OBTAINED },
|
||||
{ RG_ALLEY_HOUSE_KEY, RAND_INF_ALLEY_HOUSE_KEY_OBTAINED },
|
||||
{ RG_KAK_BAZAAR_KEY, RAND_INF_KAK_BAZAAR_KEY_OBTAINED },
|
||||
{ RG_KAK_POTION_SHOP_KEY, RAND_INF_KAK_POTION_SHOP_KEY_OBTAINED },
|
||||
{ RG_BOSS_HOUSE_KEY, RAND_INF_BOSS_HOUSE_KEY_OBTAINED },
|
||||
{ RG_GRANNYS_POTION_SHOP_KEY, RAND_INF_GRANNYS_POTION_SHOP_KEY_OBTAINED },
|
||||
{ RG_SKULLTULA_HOUSE_KEY, RAND_INF_SKULLTULA_HOUSE_KEY_OBTAINED },
|
||||
{ RG_IMPAS_HOUSE_KEY, RAND_INF_IMPAS_HOUSE_KEY_OBTAINED },
|
||||
{ RG_WINDMILL_KEY, RAND_INF_WINDMILL_KEY_OBTAINED },
|
||||
{ RG_KAK_SHOOTING_GALLERY_KEY, RAND_INF_KAK_SHOOTING_GALLERY_KEY_OBTAINED },
|
||||
{ RG_DAMPES_HUT_KEY, RAND_INF_DAMPES_HUT_KEY_OBTAINED },
|
||||
{ RG_TALONS_HOUSE_KEY, RAND_INF_TALONS_HOUSE_KEY_OBTAINED },
|
||||
{ RG_STABLES_KEY, RAND_INF_STABLES_KEY_OBTAINED },
|
||||
{ RG_BACK_TOWER_KEY, RAND_INF_BACK_TOWER_KEY_OBTAINED },
|
||||
{ RG_HYLIA_LAB_KEY, RAND_INF_HYLIA_LAB_KEY_OBTAINED },
|
||||
{ RG_FISHING_HOLE_KEY, RAND_INF_FISHING_HOLE_KEY_OBTAINED },
|
||||
};
|
||||
|
||||
std::map<uint32_t, uint32_t> Logic::RandoGetToDungeonScene = {
|
||||
@ -1635,6 +1696,30 @@ namespace Rando {
|
||||
case RG_OCARINA_C_RIGHT_BUTTON:
|
||||
case RG_GREG_RUPEE:
|
||||
case RG_FISHING_POLE:
|
||||
case RG_GUARD_HOUSE_KEY:
|
||||
case RG_MARKET_BAZAAR_KEY:
|
||||
case RG_MARKET_POTION_SHOP_KEY:
|
||||
case RG_MASK_SHOP_KEY:
|
||||
case RG_MARKET_SHOOTING_GALLERY_KEY:
|
||||
case RG_BOMBCHU_BOWLING_KEY:
|
||||
case RG_TREASURE_CHEST_GAME_BUILDING_KEY:
|
||||
case RG_BOMBCHU_SHOP_KEY:
|
||||
case RG_RICHARDS_HOUSE_KEY:
|
||||
case RG_ALLEY_HOUSE_KEY:
|
||||
case RG_KAK_BAZAAR_KEY:
|
||||
case RG_KAK_POTION_SHOP_KEY:
|
||||
case RG_BOSS_HOUSE_KEY:
|
||||
case RG_GRANNYS_POTION_SHOP_KEY:
|
||||
case RG_SKULLTULA_HOUSE_KEY:
|
||||
case RG_IMPAS_HOUSE_KEY:
|
||||
case RG_WINDMILL_KEY:
|
||||
case RG_KAK_SHOOTING_GALLERY_KEY:
|
||||
case RG_DAMPES_HUT_KEY:
|
||||
case RG_TALONS_HOUSE_KEY:
|
||||
case RG_STABLES_KEY:
|
||||
case RG_BACK_TOWER_KEY:
|
||||
case RG_HYLIA_LAB_KEY:
|
||||
case RG_FISHING_HOLE_KEY:
|
||||
SetRandoInf(RandoGetToRandInf.at(randoGet), state);
|
||||
break;
|
||||
case RG_TRIFORCE_PIECE:
|
||||
|
@ -186,6 +186,7 @@ class Logic {
|
||||
bool HasProjectile(HasProjectileAge age);
|
||||
bool HasItem(RandomizerGet itemName);
|
||||
bool HasBossSoul(RandomizerGet itemName);
|
||||
bool CanOpenOverworldDoor(RandomizerGet itemName);
|
||||
bool SmallKeys(RandomizerRegion dungeon, uint8_t requiredAmount);
|
||||
bool SmallKeys(RandomizerRegion dungeon, uint8_t requiredAmountGlitchless, uint8_t requiredAmountGlitched);
|
||||
bool CanDoGlitch(GlitchType glitch);
|
||||
|
@ -41,6 +41,7 @@ void Settings::CreateOptionDescriptions() {
|
||||
"\n"
|
||||
"Open - Sleeping Waterfall is always open. "
|
||||
"Link may always enter Zora's Domain.";
|
||||
mOptionDescriptions[RSK_LOCK_OVERWORLD_DOORS] = "Add locks to all wooden overworld doors, requiring specific small keys to open them";
|
||||
mOptionDescriptions[RSK_STARTING_AGE] =
|
||||
"Choose which age Link will start as.\n\n"
|
||||
"Starting as adult means you start with the Master Sword in your inventory.\n"
|
||||
@ -708,9 +709,6 @@ void Settings::CreateOptionDescriptions() {
|
||||
"location is reachable. When disabled, only "
|
||||
"required items and locations to beat the game "
|
||||
"will be guaranteed reachable.";
|
||||
mOptionDescriptions[RSK_ENABLE_GLITCH_CUTSCENES] =
|
||||
"The cutscenes of the Poes in Forest Temple and Darunia in Fire Temple will not be skipped. "
|
||||
"These cutscenes are only useful for glitched gameplay and can be safely skipped otherwise.";
|
||||
mOptionDescriptions[RSK_SHUFFLE_BOSS_SOULS] = "Shuffles 8 boss souls (one for each blue warp dungeon). A boss will not appear until you collect its respective soul."
|
||||
"\n\"On + Ganon\" will also hide Ganon and Ganondorf behind a boss soul.";
|
||||
}
|
||||
|
@ -2569,13 +2569,6 @@ void RandomizerSettingsWindow::DrawElement() {
|
||||
ImGui::SameLine();
|
||||
ImGui::TextColored(ImVec4(1.0f, 0.0f, 0.0f, 1.0f), "Heads up! This will disable all rando settings except for entrance shuffle and starter items");
|
||||
}
|
||||
|
||||
UIWidgets::PaddedSeparator();
|
||||
|
||||
// Enable Glitch-Useful Cutscenes
|
||||
if (mSettings->GetOption(RSK_ENABLE_GLITCH_CUTSCENES).RenderImGui()) {
|
||||
mNeedsUpdate = true;
|
||||
}
|
||||
ImGui::PopItemWidth();
|
||||
ImGui::EndTable();
|
||||
}
|
||||
@ -3725,7 +3718,7 @@ CustomMessage Randomizer::GetGoronMessage(u16 index) {
|
||||
void Randomizer::CreateCustomMessages() {
|
||||
// RANDTODO: Translate into french and german and replace GIMESSAGE_UNTRANSLATED
|
||||
// with GIMESSAGE(getItemID, itemID, english, german, french).
|
||||
const std::array<GetItemMessage, 87> getItemMessages = {{
|
||||
const std::array<GetItemMessage, 112> getItemMessages = {{
|
||||
GIMESSAGE(RG_GREG_RUPEE, ITEM_MASK_GORON,
|
||||
"You found %gGreg%w!",
|
||||
"%gGreg%w! Du hast ihn wirklich gefunden!",
|
||||
@ -3773,40 +3766,140 @@ void Randomizer::CreateCustomMessages() {
|
||||
|
||||
GIMESSAGE(RG_GERUDO_FORTRESS_SMALL_KEY, ITEM_KEY_SMALL,
|
||||
"You found a %yThieves Hideout &%wSmall Key!",
|
||||
"Du erhältst einen %rKleinen&Schlüssel%w für das %yDiebesversteck%w!",
|
||||
"Du erhältst einen %rkleinen&Schlüssel%w für das %yDiebesversteck%w!",
|
||||
"Vous obtenez une %rPetite Clé %w&du %yRepaire des Voleurs%w!"),
|
||||
GIMESSAGE(RG_FOREST_TEMPLE_SMALL_KEY, ITEM_KEY_SMALL,
|
||||
"You found a %gForest Temple &%wSmall Key!",
|
||||
"Du erhältst einen %rKleinen&Schlüssel%w für den %gWaldtempel%w!",
|
||||
"Du erhältst einen %rkleinen&Schlüssel%w für den %gWaldtempel%w!",
|
||||
"Vous obtenez une %rPetite Clé %w&du %gTemple de la Forêt%w!"),
|
||||
GIMESSAGE(RG_FIRE_TEMPLE_SMALL_KEY, ITEM_KEY_SMALL,
|
||||
"You found a %rFire Temple &%wSmall Key!",
|
||||
"Du erhältst einen %rKleinen&Schlüssel%w für den %rFeuertempel%w!",
|
||||
"Du erhältst einen %rkleinen&Schlüssel%w für den %rFeuertempel%w!",
|
||||
"Vous obtenez une %rPetite Clé %w&du %rTemple du Feu%w!"),
|
||||
GIMESSAGE(RG_WATER_TEMPLE_SMALL_KEY, ITEM_KEY_SMALL,
|
||||
"You found a %bWater Temple &%wSmall Key!",
|
||||
"Du erhältst einen %rKleinen&Schlüssel%w für den %bWassertempel%w!",
|
||||
"Du erhältst einen %rkleinen&Schlüssel%w für den %bWassertempel%w!",
|
||||
"Vous obtenez une %rPetite Clé %w&du %bTemple de l'Eau%w!"),
|
||||
GIMESSAGE(RG_SPIRIT_TEMPLE_SMALL_KEY, ITEM_KEY_SMALL,
|
||||
"You found a %ySpirit Temple &%wSmall Key!",
|
||||
"Du erhältst einen %rKleinen&Schlüssel%w für den %yGeistertempel%w!",
|
||||
"Du erhältst einen %rkleinen&Schlüssel%w für den %yGeistertempel%w!",
|
||||
"Vous obtenez une %rPetite Clé %w&du %yTemple de l'Esprit%w!"),
|
||||
GIMESSAGE(RG_SHADOW_TEMPLE_SMALL_KEY, ITEM_KEY_SMALL,
|
||||
"You found a %pShadow Temple &%wSmall Key!",
|
||||
"Du erhältst einen %rKleinen&Schlüssel%w für den %pSchattentempel%w!",
|
||||
"Du erhältst einen %rkleinen&Schlüssel%w für den %pSchattentempel%w!",
|
||||
"Vous obtenez une %rPetite Clé %w&du %pTemple de l'Ombre%w!"),
|
||||
GIMESSAGE(RG_BOTTOM_OF_THE_WELL_SMALL_KEY, ITEM_KEY_SMALL,
|
||||
"You found a %pBottom of the &Well %wSmall Key!",
|
||||
"Du erhältst einen %rKleinen&Schlüssel%w für den %pGrund des Brunnens%w!",
|
||||
"Du erhältst einen %rkleinen&Schlüssel%w für den %pGrund des Brunnens%w!",
|
||||
"Vous obtenez une %rPetite Clé %w&du %pPuits%w!"),
|
||||
GIMESSAGE(RG_GERUDO_TRAINING_GROUND_SMALL_KEY, ITEM_KEY_SMALL,
|
||||
"You found a %yGerudo Training &Grounds %wSmall Key!",
|
||||
"Du erhältst einen %rKleinen&Schlüssel%w für die %yGerudo-Trainingsarena%w!",
|
||||
"Du erhältst einen %rkleinen&Schlüssel%w für die %yGerudo-Trainingsarena%w!",
|
||||
"Vous obtenez une %rPetite Clé %w&du %yGymnase Gerudo%w!"),
|
||||
GIMESSAGE(RG_GANONS_CASTLE_SMALL_KEY, ITEM_KEY_SMALL,
|
||||
"You found a %rGanon's Castle &%wSmall Key!",
|
||||
"Du erhältst einen %rKleinen&Schlüssel%w für %rGanons Schloß%w!",
|
||||
"Du erhältst einen %rkleinen&Schlüssel%w für %rGanons Schloß%w!",
|
||||
"Vous obtenez une %rPetite Clé %w&du %rChâteau de Ganon%w!"),
|
||||
GIMESSAGE(RG_GUARD_HOUSE_KEY, ITEM_KEY_SMALL,
|
||||
"You found the key to the&%gGuard House%w!",
|
||||
"Du erhältst einen %rkleinen&Schlüssel%w für das %gHaus der Wachen%w!",
|
||||
"Vous obtenez une %rPetite Clé %w&de la %gMaison des Gardes%w!"),
|
||||
GIMESSAGE(RG_MARKET_BAZAAR_KEY, ITEM_KEY_SMALL,
|
||||
"You found the key to the&%gMarket Bazaar%w!",
|
||||
"Du erhältst einen %rkleinen&Schlüssel%w für den %gBasar des Marktes%w!",
|
||||
"Vous obtenez une %rPetite Clé %w&du %gMarché%w!"),
|
||||
GIMESSAGE(RG_MARKET_POTION_SHOP_KEY, ITEM_KEY_SMALL,
|
||||
"You found the key to the&%gMarket Potion Shop%w!",
|
||||
"Du erhältst einen %rkleinen&Schlüssel%w für den %gMagie-Laden des Marktes%w!",
|
||||
"Vous obtenez une %rPetite Clé %w&du %gMarché%w!"),
|
||||
GIMESSAGE(RG_MASK_SHOP_KEY, ITEM_KEY_SMALL,
|
||||
"You found the key to the&%gMask Shop%w!",
|
||||
"Du erhältst einen %rkleinen&Schlüssel%w für den %gMaskenladen%w!",
|
||||
"Vous obtenez une %rPetite Clé %w&du %gMagasin de Masques%w!"),
|
||||
GIMESSAGE(RG_MARKET_SHOOTING_GALLERY_KEY, ITEM_KEY_SMALL,
|
||||
"You found the key to the&%gMarket Shooting Gallery%w!",
|
||||
"Du erhältst einen %rkleinen&Schlüssel%w für die %gSchießbude des Marktes%w!",
|
||||
"Vous obtenez une %rPetite Clé %w&du %gStand de Tir%w!"),
|
||||
GIMESSAGE(RG_BOMBCHU_BOWLING_KEY, ITEM_KEY_SMALL,
|
||||
"You found the key to the&%gBombchu Bowling Alley%w!",
|
||||
"Du erhältst einen %rkleinen&Schlüssel%w für die %gMinenbowlingbahn%w!",
|
||||
"Vous obtenez une %rPetite Clé %w&du %gBowling Bombchu%w!"),
|
||||
GIMESSAGE(RG_TREASURE_CHEST_GAME_BUILDING_KEY, ITEM_KEY_SMALL,
|
||||
"You found the key to the&%gTreasure Chest Game Building%w!",
|
||||
"Du erhältst einen %rkleinen&Schlüssel%w für das %gHaus des Schatzkisten-Pokers%w!",
|
||||
"Vous obtenez une %rPetite Clé %w&du %gJeu de la Chasse au Trésor%w!"),
|
||||
GIMESSAGE(RG_BOMBCHU_SHOP_KEY, ITEM_KEY_SMALL,
|
||||
"You found the key to the&%gBombchu Shop%w!",
|
||||
"Du erhältst einen %rkleinen&Schlüssel%w für den %gKrabbelminenladen%w!",
|
||||
"Vous obtenez une %rPetite Clé %w&du %gMagasin de Bombchu%w!"),
|
||||
GIMESSAGE(RG_RICHARDS_HOUSE_KEY, ITEM_KEY_SMALL,
|
||||
"You found the key to&%gRichard's House%w!",
|
||||
"Du erhältst einen %rkleinen&Schlüssel%w für das %gHaus von Richard%w!",
|
||||
"Vous obtenez une %rPetite Clé %w&de la %gMaison de Richard%w!"),
|
||||
GIMESSAGE(RG_RICHARDS_HOUSE_KEY, ITEM_KEY_SMALL,
|
||||
"You found the key to&%gRichard's House%w!",
|
||||
"Du erhältst einen %rkleinen&Schlüssel%w für das %gHaus von Richard%w!",
|
||||
"Vous obtenez une %rPetite Clé %w&de la %gMaison de Richard%w!"),
|
||||
GIMESSAGE(RG_ALLEY_HOUSE_KEY, ITEM_KEY_SMALL,
|
||||
"You found the key to&the %gAlley House%w!",
|
||||
"Du erhältst einen %rkleinen&Schlüssel%w für das %gHaus in der Gasse%w!",
|
||||
"Vous obtenez une %rPetite Clé %w&de la %gMaison de la Ruelle%w!"),
|
||||
GIMESSAGE(RG_KAK_BAZAAR_KEY, ITEM_KEY_SMALL,
|
||||
"You found the key to the&%gKakariko Bazaar%w!",
|
||||
"Du erhältst einen %rkleinen&Schlüssel%w für den %gBasar von Kakariko%w!",
|
||||
"Vous obtenez une %rPetite Clé %w&du %gMarché de Cocorico%w!"),
|
||||
GIMESSAGE(RG_KAK_POTION_SHOP_KEY, ITEM_KEY_SMALL,
|
||||
"You found the key to the&%gKakariko Potion Shop%w!",
|
||||
"Du erhältst einen %rkleinen&Schlüssel%w für den %gMagie-Laden von Kakariko%w!",
|
||||
"Vous obtenez une %rPetite Clé %w&du %gMagasin de Potions de Cocorico%w!"),
|
||||
GIMESSAGE(RG_BOSS_HOUSE_KEY, ITEM_KEY_SMALL,
|
||||
"You found the key to the&%gBoss's House%w!",
|
||||
"Du erhältst einen %rkleinen&Schlüssel%w für das %gHaus des Chefs%w!",
|
||||
"Vous obtenez une %rPetite Clé %w&de la %gMaison du Boss%w!"),
|
||||
GIMESSAGE(RG_GRANNYS_POTION_SHOP_KEY, ITEM_KEY_SMALL,
|
||||
"You found the key to&%gGranny's Potion Shop%w!",
|
||||
"Du erhältst einen %rkleinen&Schlüssel%w für %gAsas Hexenladen%w!",
|
||||
"Vous obtenez une %rPetite Clé %w&du %gMagasin de Potions de Grand-mère%w!"),
|
||||
GIMESSAGE(RG_SKULLTULA_HOUSE_KEY, ITEM_KEY_SMALL,
|
||||
"You found the key to the&%gSkulltula House%w!",
|
||||
"Du erhältst einen %rkleinen&Schlüssel%w für das %gSkulltula-Haus%w!",
|
||||
"Vous obtenez une %rPetite Clé %w&de la %gMaison des Skulltulas%w!"),
|
||||
GIMESSAGE(RG_IMPAS_HOUSE_KEY, ITEM_KEY_SMALL,
|
||||
"You found the key to&%gImpa's House%w!",
|
||||
"Du erhältst einen %rkleinen&Schlüssel%w für das %gHaus von Impa%w!",
|
||||
"Vous obtenez une %rPetite Clé %w&de la %gMaison d'Impa%w!"),
|
||||
GIMESSAGE(RG_WINDMILL_KEY, ITEM_KEY_SMALL,
|
||||
"You found the key to the&%gWindmill%w!",
|
||||
"Du erhältst einen %rkleinen&Schlüssel%w für die %gWindmühle%w!",
|
||||
"Vous obtenez une %rPetite Clé %w&du %gMoulin à Vent%w!"),
|
||||
GIMESSAGE(RG_KAK_SHOOTING_GALLERY_KEY, ITEM_KEY_SMALL,
|
||||
"You found the key to the&%gKakariko Shooting Gallery%w!",
|
||||
"Du erhältst einen %rkleinen&Schlüssel%w für die %gSchießbude von Kakariko%w!",
|
||||
"Vous obtenez une %rPetite Clé %w&du %gStand de Tir de Cocorico%w!"),
|
||||
GIMESSAGE(RG_DAMPES_HUT_KEY, ITEM_KEY_SMALL,
|
||||
"You found the key to&%gDampe's Hut%w!",
|
||||
"Du erhältst einen %rkleinen&Schlüssel%w für die %gHütte von Boris%w!",
|
||||
"Vous obtenez une %rPetite Clé %w&du %gChalet de Dampe%w!"),
|
||||
GIMESSAGE(RG_TALONS_HOUSE_KEY, ITEM_KEY_SMALL,
|
||||
"You found the key to&%gTalon's House%w!",
|
||||
"Du erhältst einen %rkleinen&Schlüssel%w für das %gHaus von Talon%w!",
|
||||
"Vous obtenez une %rPetite Clé %w&de la %gMaison de Talon%w!"),
|
||||
GIMESSAGE(RG_STABLES_KEY, ITEM_KEY_SMALL,
|
||||
"You found the key to the&%gStables%w!",
|
||||
"Du erhältst einen %rkleinen&Schlüssel%w für die %gStälle%w!",
|
||||
"Vous obtenez une %rPetite Clé %w&des %gÉcuries%w!"),
|
||||
GIMESSAGE(RG_BACK_TOWER_KEY, ITEM_KEY_SMALL,
|
||||
"You found the key to the&%gBack Tower%w!",
|
||||
"Du erhältst einen %rkleinen&Schlüssel%w für den %ghinteren Turm%w!",
|
||||
"Vous obtenez une %rPetite Clé %w&du %gTour Arrière%w!"),
|
||||
GIMESSAGE(RG_HYLIA_LAB_KEY, ITEM_KEY_SMALL,
|
||||
"You found the key to the&%gHylia Laboratory%w!",
|
||||
"Du erhältst einen %rkleinen&Schlüssel%w für das %gHylia-Labor%w!",
|
||||
"Vous obtenez une %rPetite Clé %w&du %gLaboratoire d'Hylia%w!"),
|
||||
GIMESSAGE(RG_FISHING_HOLE_KEY, ITEM_KEY_SMALL,
|
||||
"You found the key to the&%gFishing Hole%w!",
|
||||
"Du erhältst einen %rkleinen&Schlüssel%w für den %gFischweiher%w!",
|
||||
"Vous obtenez une %rPetite Clé %w&du %gTrou de Pêche%w!"),
|
||||
|
||||
GIMESSAGE(RG_GERUDO_FORTRESS_KEY_RING, ITEM_KEY_SMALL,
|
||||
"You found a %yThieves Hideout &%wKeyring!",
|
||||
@ -4340,6 +4433,9 @@ extern "C" u16 Randomizer_Item_Give(PlayState* play, GetItemEntry giEntry) {
|
||||
|
||||
gSaveContext.inventory.dungeonItems[mapIndex] |= bitmask;
|
||||
return Return_Item_Entry(giEntry, RG_NONE);
|
||||
} else if (item >= RG_GUARD_HOUSE_KEY && item <= RG_FISHING_HOLE_KEY) {
|
||||
Flags_SetRandomizerInf((RandomizerInf)((int)RAND_INF_GUARD_HOUSE_UNLOCKED + ((item - RG_GUARD_HOUSE_KEY) * 2) + 1));
|
||||
return Return_Item_Entry(giEntry, RG_NONE);
|
||||
}
|
||||
|
||||
switch (item) {
|
||||
|
@ -148,6 +148,30 @@ typedef enum {
|
||||
LOGIC_GANONS_CASTLE_KEYS,
|
||||
LOGIC_TREASURE_GAME_KEYS,
|
||||
LOGIC_SKELETON_KEY,
|
||||
LOGIC_GUARD_HOUSE_KEY,
|
||||
LOGIC_MARKET_BAZAAR_KEY,
|
||||
LOGIC_MARKET_POTION_SHOP_KEY,
|
||||
LOGIC_MASK_SHOP_KEY,
|
||||
LOGIC_MARKET_SHOOTING_GALLERY_KEY,
|
||||
LOGIC_BOMBCHU_BOWLING_KEY,
|
||||
LOGIC_TREASURE_CHEST_GAME_BUILDING_KEY,
|
||||
LOGIC_BOMBCHU_SHOP_KEY,
|
||||
LOGIC_RICHARDS_HOUSE_KEY,
|
||||
LOGIC_ALLEY_HOUSE_KEY,
|
||||
LOGIC_KAK_BAZAAR_KEY,
|
||||
LOGIC_KAK_POTION_SHOP_KEY,
|
||||
LOGIC_BOSS_HOUSE_KEY,
|
||||
LOGIC_GRANNYS_POTION_SHOP_KEY,
|
||||
LOGIC_SKULLTULA_HOUSE_KEY,
|
||||
LOGIC_IMPAS_HOUSE_KEY,
|
||||
LOGIC_WINDMILL_KEY,
|
||||
LOGIC_KAK_SHOOTING_GALLERY_KEY,
|
||||
LOGIC_DAMPES_HUT_KEY,
|
||||
LOGIC_TALONS_HOUSE_KEY,
|
||||
LOGIC_STABLES_KEY,
|
||||
LOGIC_BACK_TOWER_KEY,
|
||||
LOGIC_HYLIA_LAB_KEY,
|
||||
LOGIC_FISHING_HOLE_KEY,
|
||||
LOGIC_KOKIRI_EMERALD,
|
||||
LOGIC_GORON_RUBY,
|
||||
LOGIC_ZORA_SAPPHIRE,
|
||||
@ -2800,6 +2824,7 @@ typedef enum {
|
||||
RC_HF_POND_STORMS_FAIRY,
|
||||
RC_HF_FENCE_GROTTO_STORMS_FAIRY,
|
||||
RC_DMT_FLAG_SUN_FAIRY,
|
||||
RC_DMT_COW_GROTTO_STORMS_FAIRY,
|
||||
RC_LW_SHORTCUT_STORMS_FAIRY,
|
||||
RC_GF_KITCHEN_SUN_FAIRY,
|
||||
RC_SPIRIT_TEMPLE_BOULDER_ROOM_SUN_FAIRY,
|
||||
@ -3699,6 +3724,30 @@ typedef enum {
|
||||
RG_HOOKSHOT,
|
||||
RG_LONGSHOT,
|
||||
RG_SCARECROW,
|
||||
RG_GUARD_HOUSE_KEY,
|
||||
RG_MARKET_BAZAAR_KEY,
|
||||
RG_MARKET_POTION_SHOP_KEY,
|
||||
RG_MASK_SHOP_KEY,
|
||||
RG_MARKET_SHOOTING_GALLERY_KEY,
|
||||
RG_BOMBCHU_BOWLING_KEY,
|
||||
RG_TREASURE_CHEST_GAME_BUILDING_KEY,
|
||||
RG_BOMBCHU_SHOP_KEY,
|
||||
RG_RICHARDS_HOUSE_KEY,
|
||||
RG_ALLEY_HOUSE_KEY,
|
||||
RG_KAK_BAZAAR_KEY,
|
||||
RG_KAK_POTION_SHOP_KEY,
|
||||
RG_BOSS_HOUSE_KEY,
|
||||
RG_GRANNYS_POTION_SHOP_KEY,
|
||||
RG_SKULLTULA_HOUSE_KEY,
|
||||
RG_IMPAS_HOUSE_KEY,
|
||||
RG_WINDMILL_KEY,
|
||||
RG_KAK_SHOOTING_GALLERY_KEY,
|
||||
RG_DAMPES_HUT_KEY,
|
||||
RG_TALONS_HOUSE_KEY,
|
||||
RG_STABLES_KEY,
|
||||
RG_BACK_TOWER_KEY,
|
||||
RG_HYLIA_LAB_KEY,
|
||||
RG_FISHING_HOLE_KEY,
|
||||
// Logic Only
|
||||
RG_DISTANT_SCARECROW,
|
||||
RG_STICKS,
|
||||
@ -3789,6 +3838,7 @@ typedef enum {
|
||||
RHT_CAN_BE_FOUND_AT,
|
||||
RHT_HOARDS,
|
||||
// Junk
|
||||
RHT_JUNK01,
|
||||
RHT_JUNK02,
|
||||
RHT_JUNK03,
|
||||
RHT_JUNK04,
|
||||
@ -3859,141 +3909,6 @@ typedef enum {
|
||||
RHT_JUNK69,
|
||||
RHT_JUNK70,
|
||||
RHT_JUNK71,
|
||||
RHT_JUNK72,
|
||||
RHT_JUNK73,
|
||||
RHT_JUNK74,
|
||||
RHT_JUNK75,
|
||||
RHT_JUNK76,
|
||||
RHT_JUNK77,
|
||||
RHT_JUNK78,
|
||||
RHT_JUNK79,
|
||||
RHT_JUNK80,
|
||||
RHT_JUNK81,
|
||||
RHT_JUNK_WTC_1,
|
||||
RHT_JUNK_WTC_2,
|
||||
RHT_JUNK_WTC_3,
|
||||
RHT_JUNK_WTC_4,
|
||||
RHT_JUNK_WTC_5,
|
||||
RHT_JUNK_WTC_6,
|
||||
RHT_JUNK_WTC_7,
|
||||
RHT_JUNK_WTC_8,
|
||||
RHT_JUNK_WTC_9,
|
||||
RHT_JUNK_WTC_10,
|
||||
RHT_JUNK_WTC_11,
|
||||
RHT_JUNK_WTC_12,
|
||||
RHT_JUNK_SEI_1,
|
||||
RHT_JUNK_SEI_2,
|
||||
RHT_JUNK_SEI_3,
|
||||
RHT_JUNK_SEI_4,
|
||||
RHT_JUNK_SEI_5,
|
||||
RHT_JUNK_SEI_6,
|
||||
RHT_JUNK_SEI_7,
|
||||
RHT_JUNK_SEI_8,
|
||||
RHT_JUNK_SEI_9,
|
||||
RHT_JUNK_SEI_10,
|
||||
RHT_JUNK_SEI_11,
|
||||
RHT_JUNK_SEI_12,
|
||||
RHT_JUNK_SEI_13,
|
||||
RHT_JUNK_SEI_14,
|
||||
RHT_JUNK_SEI_15,
|
||||
RHT_JUNK_SEI_16,
|
||||
RHT_JUNK_SEI_17,
|
||||
RHT_JUNK_SEI_18,
|
||||
RHT_JUNK_SEI_19,
|
||||
RHT_JUNK_SEI_20,
|
||||
RHT_JUNK_SEI_21,
|
||||
RHT_JUNK_SEI_22,
|
||||
RHT_JUNK_SEI_23,
|
||||
RHT_JUNK_SEI_24,
|
||||
RHT_JUNK_SEI_25,
|
||||
RHT_JUNK_SEI_26,
|
||||
RHT_JUNK_SEI_27,
|
||||
RHT_JUNK_SEI_28,
|
||||
RHT_JUNK_SEI_29,
|
||||
RHT_JUNK_OTR_MEANS_1,
|
||||
RHT_JUNK_OTR_MEANS_2,
|
||||
RHT_JUNK_OTR_MEANS_3,
|
||||
RHT_JUNK_OTR_MEANS_4,
|
||||
RHT_JUNK_OTR_MEANS_5,
|
||||
RHT_JUNK_OTR_MEANS_6,
|
||||
RHT_JUNK_OTR_MEANS_7,
|
||||
RHT_JUNK_OTR_MEANS_8,
|
||||
RHT_JUNK_OTR_MEANS_9,
|
||||
RHT_JUNK_OTR_MEANS_10,
|
||||
RHT_JUNK_OTR_MEANS_11,
|
||||
RHT_JUNK_OTR_MEANS_12,
|
||||
RHT_JUNK_OTR_MEANS_13,
|
||||
RHT_JUNK_OTR_MEANS_14,
|
||||
RHT_JUNK_OTR_MEANS_15,
|
||||
RHT_JUNK_OTR_MEANS_16,
|
||||
RHT_JUNK_OTR_MEANS_17,
|
||||
RHT_JUNK_OTR_MEANS_18,
|
||||
RHT_JUNK_OTR_MEANS_19,
|
||||
RHT_JUNK_OTR_MEANS_20,
|
||||
RHT_JUNK_OTR_MEANS_21,
|
||||
RHT_JUNK_OTR_MEANS_22,
|
||||
RHT_JUNK_OTR_MEANS_23,
|
||||
RHT_JUNK_OTR_MEANS_24,
|
||||
RHT_JUNK_OTR_MEANS_25,
|
||||
RHT_JUNK_OTR_MEANS_26,
|
||||
RHT_JUNK_OTR_MEANS_27,
|
||||
RHT_JUNK_OTR_MEANS_28,
|
||||
RHT_JUNK_OTR_MEANS_29,
|
||||
RHT_JUNK_OTR_MEANS_30,
|
||||
RHT_JUNK_MISC_1,
|
||||
RHT_JUNK_MISC_2,
|
||||
RHT_JUNK_MISC_3,
|
||||
RHT_JUNK_MISC_4,
|
||||
RHT_JUNK_MISC_5,
|
||||
RHT_JUNK_MISC_6,
|
||||
RHT_JUNK_MISC_7,
|
||||
RHT_JUNK_MISC_8,
|
||||
RHT_JUNK_MISC_9,
|
||||
RHT_JUNK_MISC_10,
|
||||
RHT_JUNK_MISC_11,
|
||||
RHT_JUNK_MISC_12,
|
||||
RHT_JUNK_MISC_13,
|
||||
RHT_JUNK_MISC_14,
|
||||
RHT_JUNK_MISC_15,
|
||||
RHT_JUNK_MISC_16,
|
||||
RHT_JUNK_MISC_17,
|
||||
RHT_JUNK_SG_1,
|
||||
RHT_JUNK_SG_2,
|
||||
RHT_JUNK_SG_3,
|
||||
RHT_JUNK_SG_4,
|
||||
RHT_JUNK_SG_5,
|
||||
RHT_JUNK_SG_6,
|
||||
RHT_JUNK_SG_7,
|
||||
RHT_JUNK_SG_8,
|
||||
RHT_JUNK_CREW_1,
|
||||
RHT_JUNK_CREW_2,
|
||||
RHT_JUNK_CREW_3,
|
||||
RHT_JUNK_CREW_4,
|
||||
RHT_JUNK_CREW_5,
|
||||
RHT_JUNK_CREW_6,
|
||||
RHT_JUNK_CREW_7,
|
||||
RHT_JUNK_CREW_8,
|
||||
RHT_JUNK_CREW_9,
|
||||
RHT_JUNK_CREW_10,
|
||||
RHT_JUNK_CREW_11,
|
||||
RHT_JUNK_CREW_12,
|
||||
RHT_JUNK_CREW_13,
|
||||
RHT_JUNK_CREW_14,
|
||||
RHT_JUNK_CREW_15,
|
||||
RHT_JUNK_CREW_16,
|
||||
RHT_JUNK_CREW_17,
|
||||
RHT_JUNK_CREW_18,
|
||||
RHT_JUNK_CREW_19,
|
||||
RHT_JUNK_CREW_20,
|
||||
RHT_JUNK_CREW_21,
|
||||
RHT_JUNK_CREW_22,
|
||||
RHT_JUNK_CREW_23,
|
||||
RHT_JUNK_CREW_24,
|
||||
RHT_JUNK_CREW_25,
|
||||
RHT_JUNK_CREW_26,
|
||||
RHT_JUNK_CREW_27,
|
||||
RHT_JUNK_CREW_28,
|
||||
RHT_JUNK_CREW_29,
|
||||
// Locations
|
||||
RHT_LINKS_POCKET,
|
||||
RHT_QUEEN_GOHMA,
|
||||
@ -4972,6 +4887,7 @@ typedef enum {
|
||||
RHT_FISHING_POLE,
|
||||
RHT_SKELETON_KEY,
|
||||
RHT_EPONA,
|
||||
RHT_OVERWORLD_KEY,
|
||||
RHT_HINT_MYSTERIOUS,
|
||||
RHT_MYSTERIOUS_ITEM,
|
||||
RHT_MYSTERIOUS_ITEM_CAPITAL,
|
||||
@ -5347,6 +5263,7 @@ typedef enum {
|
||||
RHT_HF_POND_STORMS_FAIRY,
|
||||
RHT_HF_FENCE_GROTTO_STORMS_FAIRY,
|
||||
RHT_DMT_FLAG_SUN_FAIRY,
|
||||
RHT_DMT_COW_GROTTO_STORMS_FAIRY,
|
||||
RHT_LW_SHORTCUT_STORMS_FAIRY,
|
||||
RHT_GF_KITCHEN_SUN_FAIRY,
|
||||
RHT_SPIRIT_TEMPLE_BOULDER_ROOM_SUN_FAIRY,
|
||||
@ -5587,7 +5504,6 @@ typedef enum {
|
||||
RSK_SKIP_EPONA_RACE,
|
||||
RSK_COMPLETE_MASK_QUEST,
|
||||
RSK_SKIP_SCARECROWS_SONG,
|
||||
RSK_ENABLE_GLITCH_CUTSCENES,
|
||||
RSK_SKULLS_SUNS_SONG,
|
||||
RSK_SHUFFLE_ADULT_TRADE,
|
||||
RSK_SHUFFLE_MERCHANTS,
|
||||
@ -5673,6 +5589,7 @@ typedef enum {
|
||||
RSK_SHUFFLE_DEKU_NUT_BAG,
|
||||
RSK_SHUFFLE_FREESTANDING,
|
||||
RSK_SHUFFLE_FAIRIES,
|
||||
RSK_LOCK_OVERWORLD_DOORS,
|
||||
RSK_GRASSANITY,
|
||||
RSK_MAX
|
||||
} RandomizerSettingKey;
|
||||
@ -6039,7 +5956,6 @@ typedef enum {
|
||||
// Logic (glitchless/no logic)
|
||||
typedef enum {
|
||||
RO_LOGIC_GLITCHLESS,
|
||||
RO_LOGIC_GLITCHED,
|
||||
RO_LOGIC_NO_LOGIC,
|
||||
RO_LOGIC_VANILLA,
|
||||
} RandoOptionLogic;
|
||||
|
@ -1249,6 +1249,7 @@ typedef enum {
|
||||
RAND_INF_LH_ISLAND_SUN_FAIRY,
|
||||
RAND_INF_HF_POND_STORMS_FAIRY,
|
||||
RAND_INF_DMT_FLAG_SUN_FAIRY,
|
||||
RAND_INF_DMT_COW_GROTTO_STORMS_FAIRY,
|
||||
RAND_INF_HF_FENCE_GROTTO_STORMS_FAIRY,
|
||||
RAND_INF_LW_SHORTCUT_STORMS_FAIRY,
|
||||
RAND_INF_GF_KITCHEN_SUN_FAIRY,
|
||||
@ -1273,6 +1274,56 @@ typedef enum {
|
||||
RAND_INF_BOTTOM_OF_THE_WELL_MQ_CELL_SUN_FAIRY,
|
||||
RAND_INF_BOTTOM_OF_THE_WELL_MQ_BASEMENT_SUN_FAIRY,
|
||||
|
||||
RAND_INF_GUARD_HOUSE_UNLOCKED,
|
||||
RAND_INF_GUARD_HOUSE_KEY_OBTAINED,
|
||||
RAND_INF_MARKET_BAZAAR_UNLOCKED,
|
||||
RAND_INF_MARKET_BAZAAR_KEY_OBTAINED,
|
||||
RAND_INF_MARKET_POTION_SHOP_UNLOCKED,
|
||||
RAND_INF_MARKET_POTION_SHOP_KEY_OBTAINED,
|
||||
RAND_INF_MASK_SHOP_UNLOCKED,
|
||||
RAND_INF_MASK_SHOP_KEY_OBTAINED,
|
||||
RAND_INF_MARKET_SHOOTING_GALLERY_UNLOCKED,
|
||||
RAND_INF_MARKET_SHOOTING_GALLERY_KEY_OBTAINED,
|
||||
RAND_INF_BOMBCHU_BOWLING_UNLOCKED,
|
||||
RAND_INF_BOMBCHU_BOWLING_KEY_OBTAINED,
|
||||
RAND_INF_TREASURE_CHEST_GAME_BUILDING_UNLOCKED,
|
||||
RAND_INF_TREASURE_CHEST_GAME_BUILDING_KEY_OBTAINED,
|
||||
RAND_INF_BOMBCHU_SHOP_UNLOCKED,
|
||||
RAND_INF_BOMBCHU_SHOP_KEY_OBTAINED,
|
||||
RAND_INF_RICHARDS_HOUSE_UNLOCKED,
|
||||
RAND_INF_RICHARDS_HOUSE_KEY_OBTAINED,
|
||||
RAND_INF_ALLEY_HOUSE_UNLOCKED,
|
||||
RAND_INF_ALLEY_HOUSE_KEY_OBTAINED,
|
||||
RAND_INF_KAK_BAZAAR_UNLOCKED,
|
||||
RAND_INF_KAK_BAZAAR_KEY_OBTAINED,
|
||||
RAND_INF_KAK_POTION_SHOP_UNLOCKED,
|
||||
RAND_INF_KAK_POTION_SHOP_KEY_OBTAINED,
|
||||
RAND_INF_BOSS_HOUSE_UNLOCKED,
|
||||
RAND_INF_BOSS_HOUSE_KEY_OBTAINED,
|
||||
RAND_INF_GRANNYS_POTION_SHOP_UNLOCKED,
|
||||
RAND_INF_GRANNYS_POTION_SHOP_KEY_OBTAINED,
|
||||
RAND_INF_SKULLTULA_HOUSE_UNLOCKED,
|
||||
RAND_INF_SKULLTULA_HOUSE_KEY_OBTAINED,
|
||||
RAND_INF_IMPAS_HOUSE_UNLOCKED,
|
||||
RAND_INF_IMPAS_HOUSE_KEY_OBTAINED,
|
||||
RAND_INF_WINDMILL_UNLOCKED,
|
||||
RAND_INF_WINDMILL_KEY_OBTAINED,
|
||||
RAND_INF_KAK_SHOOTING_GALLERY_UNLOCKED,
|
||||
RAND_INF_KAK_SHOOTING_GALLERY_KEY_OBTAINED,
|
||||
RAND_INF_DAMPES_HUT_UNLOCKED,
|
||||
RAND_INF_DAMPES_HUT_KEY_OBTAINED,
|
||||
RAND_INF_TALONS_HOUSE_UNLOCKED,
|
||||
RAND_INF_TALONS_HOUSE_KEY_OBTAINED,
|
||||
RAND_INF_STABLES_UNLOCKED,
|
||||
RAND_INF_STABLES_KEY_OBTAINED,
|
||||
RAND_INF_BACK_TOWER_UNLOCKED,
|
||||
RAND_INF_BACK_TOWER_KEY_OBTAINED,
|
||||
RAND_INF_HYLIA_LAB_UNLOCKED,
|
||||
RAND_INF_HYLIA_LAB_KEY_OBTAINED,
|
||||
RAND_INF_FISHING_HOLE_UNLOCKED,
|
||||
RAND_INF_FISHING_HOLE_KEY_OBTAINED,
|
||||
|
||||
|
||||
// Overworld Grass
|
||||
RAND_INF_KF_CHILD_GRASS_1,
|
||||
RAND_INF_KF_CHILD_GRASS_2,
|
||||
|
@ -90,17 +90,15 @@ std::vector<ItemTrackerItem> triforcePieces = {
|
||||
};
|
||||
|
||||
std::vector<ItemTrackerItem> bossSoulItems = {
|
||||
//Hack for right now, just gonna draw souls as bottles/big poes.
|
||||
//Will replace with other macro once we have a custom texture
|
||||
ITEM_TRACKER_ITEM_CUSTOM(RG_GOHMA_SOUL, ITEM_BIG_POE, ITEM_BOTTLE, 0, DrawItem ),
|
||||
ITEM_TRACKER_ITEM_CUSTOM(RG_KING_DODONGO_SOUL, ITEM_BIG_POE, ITEM_BOTTLE, 0, DrawItem ),
|
||||
ITEM_TRACKER_ITEM_CUSTOM(RG_BARINADE_SOUL, ITEM_BIG_POE, ITEM_BOTTLE, 0, DrawItem ),
|
||||
ITEM_TRACKER_ITEM_CUSTOM(RG_PHANTOM_GANON_SOUL, ITEM_BIG_POE, ITEM_BOTTLE, 0, DrawItem ),
|
||||
ITEM_TRACKER_ITEM_CUSTOM(RG_VOLVAGIA_SOUL, ITEM_BIG_POE, ITEM_BOTTLE, 0, DrawItem ),
|
||||
ITEM_TRACKER_ITEM_CUSTOM(RG_MORPHA_SOUL, ITEM_BIG_POE, ITEM_BOTTLE, 0, DrawItem ),
|
||||
ITEM_TRACKER_ITEM_CUSTOM(RG_BONGO_BONGO_SOUL, ITEM_BIG_POE, ITEM_BOTTLE, 0, DrawItem ),
|
||||
ITEM_TRACKER_ITEM_CUSTOM(RG_TWINROVA_SOUL, ITEM_BIG_POE, ITEM_BOTTLE, 0, DrawItem ),
|
||||
ITEM_TRACKER_ITEM_CUSTOM(RG_GANON_SOUL, ITEM_BIG_POE, ITEM_BOTTLE, 0, DrawItem ),
|
||||
ITEM_TRACKER_ITEM(RG_GOHMA_SOUL, 0, DrawItem),
|
||||
ITEM_TRACKER_ITEM(RG_KING_DODONGO_SOUL, 0, DrawItem ),
|
||||
ITEM_TRACKER_ITEM(RG_BARINADE_SOUL, 0, DrawItem ),
|
||||
ITEM_TRACKER_ITEM(RG_PHANTOM_GANON_SOUL, 0, DrawItem ),
|
||||
ITEM_TRACKER_ITEM(RG_VOLVAGIA_SOUL, 0, DrawItem ),
|
||||
ITEM_TRACKER_ITEM(RG_MORPHA_SOUL, 0, DrawItem ),
|
||||
ITEM_TRACKER_ITEM(RG_BONGO_BONGO_SOUL, 0, DrawItem ),
|
||||
ITEM_TRACKER_ITEM(RG_TWINROVA_SOUL, 0, DrawItem ),
|
||||
ITEM_TRACKER_ITEM(RG_GANON_SOUL, 0, DrawItem ),
|
||||
};
|
||||
|
||||
std::vector<ItemTrackerItem> ocarinaButtonItems = {
|
||||
|
@ -110,6 +110,7 @@ void Settings::CreateOptions() {
|
||||
mOptions[RSK_DOOR_OF_TIME] = Option::U8("Door of Time", {"Closed", "Song only", "Open"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("DoorOfTime"), mOptionDescriptions[RSK_DOOR_OF_TIME], WidgetType::Combobox);
|
||||
mOptions[RSK_ZORAS_FOUNTAIN] = Option::U8("Zora's Fountain", {"Closed", "Closed as child", "Open"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("ZorasFountain"), mOptionDescriptions[RSK_ZORAS_FOUNTAIN]);
|
||||
mOptions[RSK_SLEEPING_WATERFALL] = Option::U8("Sleeping Waterfall", {"Closed", "Open"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("SleepingWaterfall"), mOptionDescriptions[RSK_SLEEPING_WATERFALL]);
|
||||
mOptions[RSK_LOCK_OVERWORLD_DOORS] = Option::Bool("Lock Overworld Doors", CVAR_RANDOMIZER_SETTING("LockOverworldDoors"), mOptionDescriptions[RSK_LOCK_OVERWORLD_DOORS]);
|
||||
mOptions[RSK_GERUDO_FORTRESS] = Option::U8("Fortress Carpenters", {"Normal", "Fast", "Free"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("FortressCarpenters"), mOptionDescriptions[RSK_GERUDO_FORTRESS]);
|
||||
mOptions[RSK_RAINBOW_BRIDGE] = Option::U8("Rainbow Bridge", {"Vanilla", "Always open", "Stones", "Medallions", "Dungeon rewards", "Dungeons", "Tokens", "Greg"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("RainbowBridge"), mOptionDescriptions[RSK_RAINBOW_BRIDGE], WidgetType::Combobox, RO_BRIDGE_VANILLA, false, IMFLAG_NONE);
|
||||
mOptions[RSK_RAINBOW_BRIDGE_STONE_COUNT] = Option::U8("Bridge Stone Count", {NumOpts(0, 4)}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("StoneCount"), "", WidgetType::Slider, 3, true);
|
||||
@ -250,6 +251,8 @@ void Settings::CreateOptions() {
|
||||
mOptions[RSK_KEYRINGS_BOTTOM_OF_THE_WELL] = Option::U8("Bottom of the Well Keyring", {"No", "Random", "Yes"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("ShuffleKeyRingsBottomOfTheWell"), "", WidgetType::TristateCheckbox, 0);
|
||||
mOptions[RSK_KEYRINGS_GTG] = Option::U8("Gerudo Training Ground Keyring", {"No", "Random", "Yes"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("ShuffleKeyRingsGTG"), "", WidgetType::TristateCheckbox, 0);
|
||||
mOptions[RSK_KEYRINGS_GANONS_CASTLE] = Option::U8("Ganon's Castle Keyring", {"No", "Random", "Yes"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("ShuffleKeyRingsGanonsCastle"), "", WidgetType::TristateCheckbox, 0);
|
||||
//Dummied out due to redundancy with TimeSavers.SkipChildStealth until such a time that logic needs to consider child stealth e.g. because it's freestanding checks are added to freestanding shuffle.
|
||||
//To undo this dummying, readd this setting to an OptionGroup so it appears in the UI, then edit the timesaver check hooks to look at this, and the timesaver setting to lock itself as needed.
|
||||
mOptions[RSK_SKIP_CHILD_STEALTH] = Option::Bool("Skip Child Stealth", {"Don't Skip", "Skip"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("SkipChildStealth"), mOptionDescriptions[RSK_SKIP_CHILD_STEALTH], WidgetType::Checkbox, RO_GENERIC_DONT_SKIP);
|
||||
mOptions[RSK_SKIP_CHILD_ZELDA] = Option::Bool("Skip Child Zelda", {"Don't Skip", "Skip"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("SkipChildZelda"), mOptionDescriptions[RSK_SKIP_CHILD_ZELDA], WidgetType::Checkbox, RO_GENERIC_DONT_SKIP);
|
||||
mOptions[RSK_SKIP_EPONA_RACE] = Option::Bool("Skip Epona Race", {"Don't Skip", "Skip"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("SkipEponaRace"), mOptionDescriptions[RSK_SKIP_EPONA_RACE], WidgetType::Checkbox, RO_GENERIC_DONT_SKIP);
|
||||
@ -257,7 +260,6 @@ void Settings::CreateOptions() {
|
||||
mOptions[RSK_BIG_POE_COUNT] = Option::U8("Big Poe Target Count", {NumOpts(1, 10)}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("BigPoeTargetCount"), mOptionDescriptions[RSK_BIG_POE_COUNT], WidgetType::Slider, 9);
|
||||
mOptions[RSK_CUCCO_COUNT] = Option::U8("Cuccos to return", {NumOpts(0, 7)}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("CuccosToReturn"), mOptionDescriptions[RSK_CUCCO_COUNT], WidgetType::Slider, 7);
|
||||
mOptions[RSK_COMPLETE_MASK_QUEST] = Option::Bool("Complete Mask Quest", CVAR_RANDOMIZER_SETTING("CompleteMaskQuest"), mOptionDescriptions[RSK_COMPLETE_MASK_QUEST]);
|
||||
mOptions[RSK_ENABLE_GLITCH_CUTSCENES] = Option::Bool("Enable Glitch-Useful Cutscenes", CVAR_RANDOMIZER_SETTING("EnableGlitchCutscenes"), mOptionDescriptions[RSK_ENABLE_GLITCH_CUTSCENES]);
|
||||
mOptions[RSK_GOSSIP_STONE_HINTS] = Option::U8("Gossip Stone Hints", {"No Hints", "Need Nothing", "Mask of Truth", "Stone of Agony"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("GossipStoneHints"), mOptionDescriptions[RSK_GOSSIP_STONE_HINTS], WidgetType::Combobox, RO_GOSSIP_STONES_NEED_NOTHING, false, IMFLAG_NONE);
|
||||
mOptions[RSK_HINT_CLARITY] = Option::U8("Hint Clarity", {"Obscure", "Ambiguous", "Clear"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("HintClarity"), mOptionDescriptions[RSK_HINT_CLARITY], WidgetType::Combobox, RO_HINT_CLARITY_CLEAR, true, IMFLAG_INDENT);
|
||||
mOptions[RSK_HINT_DISTRIBUTION] = Option::U8("Hint Distribution", {"Useless", "Balanced", "Strong", "Very Strong"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("HintDistribution"), mOptionDescriptions[RSK_HINT_DISTRIBUTION], WidgetType::Combobox, RO_HINT_DIST_BALANCED, true, IMFLAG_UNINDENT);
|
||||
@ -316,7 +318,7 @@ void Settings::CreateOptions() {
|
||||
mOptions[RSK_STARTING_SKULLTULA_TOKEN] = Option::U8("Gold Skulltula Tokens", {NumOpts(0, 100)}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("StartingSkulltulaToken"), "", WidgetType::Slider);
|
||||
mOptions[RSK_STARTING_HEARTS] = Option::U8("Starting Hearts", {NumOpts(1, 20)}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("StartingHearts"), "", WidgetType::Slider, 2);
|
||||
// TODO: Remainder of Starting Items
|
||||
mOptions[RSK_LOGIC_RULES] = Option::U8("Logic", {"Glitchless", "Glitched", "No Logic", "Vanilla"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("LogicRules"), mOptionDescriptions[RSK_LOGIC_RULES], WidgetType::Combobox, RO_LOGIC_GLITCHLESS);
|
||||
mOptions[RSK_LOGIC_RULES] = Option::U8("Logic", {"Glitchless", "No Logic", "Vanilla"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("LogicRules"), mOptionDescriptions[RSK_LOGIC_RULES], WidgetType::Combobox, RO_LOGIC_GLITCHLESS);
|
||||
mOptions[RSK_ALL_LOCATIONS_REACHABLE] = Option::Bool("All Locations Reachable", {"Off", "On"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("AllLocationsReachable"), mOptionDescriptions[RSK_ALL_LOCATIONS_REACHABLE], WidgetType::Checkbox, RO_GENERIC_ON);
|
||||
mOptions[RSK_SKULLS_SUNS_SONG] = Option::Bool("Night Skulltula's Expect Sun's Song", CVAR_RANDOMIZER_SETTING("GsExpectSunsSong"), mOptionDescriptions[RSK_SKULLS_SUNS_SONG]);
|
||||
mOptions[RSK_DAMAGE_MULTIPLIER] = Option::U8("Damage Multiplier", {"x1/2", "x1", "x2", "x4", "x8", "x16", "OHKO"}, OptionCategory::Setting, "", "", WidgetType::Slider, RO_DAMAGE_MULTIPLIER_DEFAULT);
|
||||
@ -552,6 +554,7 @@ void Settings::CreateOptions() {
|
||||
&mOptions[RSK_DOOR_OF_TIME],
|
||||
&mOptions[RSK_ZORAS_FOUNTAIN],
|
||||
&mOptions[RSK_SLEEPING_WATERFALL],
|
||||
&mOptions[RSK_LOCK_OVERWORLD_DOORS],
|
||||
}, WidgetContainerType::COLUMN);
|
||||
mOptionGroups[RSG_WORLD_IMGUI] = OptionGroup::SubGroup("World Settings", {
|
||||
&mOptions[RSK_STARTING_AGE],
|
||||
@ -705,7 +708,6 @@ void Settings::CreateOptions() {
|
||||
mOptionGroups[RSG_TIMESAVERS_IMGUI] = OptionGroup::SubGroup("Timesavers", {
|
||||
&mOptions[RSK_CUCCO_COUNT],
|
||||
&mOptions[RSK_BIG_POE_COUNT],
|
||||
&mOptions[RSK_SKIP_CHILD_STEALTH],
|
||||
&mOptions[RSK_SKIP_CHILD_ZELDA],
|
||||
&mOptions[RSK_SKIP_EPONA_RACE],
|
||||
&mOptions[RSK_COMPLETE_MASK_QUEST],
|
||||
@ -807,6 +809,7 @@ void Settings::CreateOptions() {
|
||||
&mOptions[RSK_DOOR_OF_TIME],
|
||||
&mOptions[RSK_ZORAS_FOUNTAIN],
|
||||
&mOptions[RSK_SLEEPING_WATERFALL],
|
||||
&mOptions[RSK_LOCK_OVERWORLD_DOORS],
|
||||
&mOptions[RSK_GERUDO_FORTRESS],
|
||||
&mOptions[RSK_RAINBOW_BRIDGE],
|
||||
&mOptions[RSK_RAINBOW_BRIDGE_STONE_COUNT],
|
||||
@ -978,14 +981,12 @@ void Settings::CreateOptions() {
|
||||
&mOptionGroups[RSG_STARTING_OTHER],
|
||||
}, OptionGroupType::DEFAULT);
|
||||
mOptionGroups[RSG_TIMESAVERS] = OptionGroup("Timesaver Settings", {
|
||||
&mOptions[RSK_SKIP_CHILD_STEALTH],
|
||||
&mOptions[RSK_SKIP_CHILD_ZELDA],
|
||||
&mOptions[RSK_SKIP_EPONA_RACE],
|
||||
&mOptions[RSK_SKIP_SCARECROWS_SONG],
|
||||
&mOptions[RSK_BIG_POE_COUNT],
|
||||
&mOptions[RSK_CUCCO_COUNT],
|
||||
&mOptions[RSK_COMPLETE_MASK_QUEST],
|
||||
&mOptions[RSK_ENABLE_GLITCH_CUTSCENES],
|
||||
});
|
||||
mOptionGroups[RSG_MISC] = OptionGroup("Miscellaneous Settings", {
|
||||
&mOptions[RSK_GOSSIP_STONE_HINTS],
|
||||
|
@ -136,6 +136,18 @@ std::map<uint32_t, ItemMapEntry> triforcePieceMapping = {
|
||||
{RG_TRIFORCE_PIECE, {RG_TRIFORCE_PIECE, "RG_TRIFORCE_PIECE", "RG_TRIFORCE_PIECE_Faded", gTriforcePieceTex}}
|
||||
};
|
||||
|
||||
std::map<uint32_t, ItemMapEntry> bossSoulMapping = {
|
||||
{ RG_GOHMA_SOUL, { RG_GOHMA_SOUL, "RG_GOHMA_SOUL", "RG_GOHMA_SOUL_Faded", gBossSoulTex } },
|
||||
{ RG_KING_DODONGO_SOUL, { RG_KING_DODONGO_SOUL, "RG_KING_DODONGO_SOUL", "RG_KING_DODONGO_SOUL_Faded", gBossSoulTex } },
|
||||
{ RG_BARINADE_SOUL, { RG_BARINADE_SOUL, "RG_BARINADE_SOUL", "RG_BARINADE_SOUL_Faded", gBossSoulTex } },
|
||||
{ RG_PHANTOM_GANON_SOUL,{ RG_PHANTOM_GANON_SOUL,"RG_PHANTOM_GANON_SOUL","RG_PHANTOM_GANON_SOUL_Faded", gBossSoulTex } },
|
||||
{ RG_VOLVAGIA_SOUL, { RG_VOLVAGIA_SOUL, "RG_VOLVAGIA_SOUL", "RG_VOLVAGIA_SOUL_Faded", gBossSoulTex } },
|
||||
{ RG_MORPHA_SOUL, { RG_MORPHA_SOUL, "RG_MORPHA_SOUL", "RG_MORPHA_SOUL_Faded", gBossSoulTex } },
|
||||
{ RG_BONGO_BONGO_SOUL, { RG_BONGO_BONGO_SOUL, "RG_BONGO_BONGO_SOUL", "RG_BONGO_BONGO_SOUL_Faded", gBossSoulTex } },
|
||||
{ RG_TWINROVA_SOUL, { RG_TWINROVA_SOUL, "RG_TWINROVA_SOUL", "RG_TWINROVA_SOUL_Faded", gBossSoulTex } },
|
||||
{ RG_GANON_SOUL, { RG_GANON_SOUL, "RG_GANON_SOUL", "RG_GANON_SOUL_Faded", gBossSoulTex } },
|
||||
};
|
||||
|
||||
std::map<uint32_t, QuestMapEntry> questMapping = {
|
||||
QUEST_MAP_ENTRY(QUEST_MEDALLION_FOREST, dgQuestIconMedallionForestTex),
|
||||
QUEST_MAP_ENTRY(QUEST_MEDALLION_FIRE, dgQuestIconMedallionFireTex),
|
||||
@ -208,6 +220,11 @@ void RegisterImGuiItemIcons() {
|
||||
Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadGuiTexture(entry.second.nameFaded, entry.second.texturePath, ImVec4(1, 1, 1, 0.3f));
|
||||
}
|
||||
|
||||
for (const auto& entry : bossSoulMapping) {
|
||||
Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadGuiTexture(entry.second.name, entry.second.texturePath, ImVec4(1, 1, 1, 1));
|
||||
Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadGuiTexture(entry.second.nameFaded, entry.second.texturePath, ImVec4(1, 1, 1, 0.3f));
|
||||
}
|
||||
|
||||
for (const auto& entry : questMapping) {
|
||||
Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadGuiTexture(entry.second.name, entry.second.texturePath, ImVec4(1, 1, 1, 1));
|
||||
Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadGuiTexture(entry.second.nameFaded, entry.second.texturePath, ImVec4(1, 1, 1, 0.3f));
|
||||
|
@ -341,7 +341,6 @@ OTRGlobals::OTRGlobals() {
|
||||
BTN_CUSTOM_OCARINA_PITCH_DOWN,
|
||||
}));
|
||||
context->InitControlDeck(controlDeck);
|
||||
context->GetControlDeck()->SetSinglePlayerMappingMode(true);
|
||||
|
||||
context->InitCrashHandler();
|
||||
context->InitConsole();
|
||||
@ -1836,17 +1835,25 @@ extern "C" void AudioPlayer_Play(const uint8_t* buf, uint32_t len) {
|
||||
}
|
||||
|
||||
extern "C" int Controller_ShouldRumble(size_t slot) {
|
||||
for (auto [id, mapping] : Ship::Context::GetInstance()
|
||||
->GetControlDeck()
|
||||
->GetControllerByPort(static_cast<uint8_t>(slot))
|
||||
->GetRumble()
|
||||
->GetAllRumbleMappings()) {
|
||||
if (mapping->PhysicalDeviceIsConnected()) {
|
||||
return 1;
|
||||
}
|
||||
// don't rumble if we don't have rumble mappings
|
||||
if (Ship::Context::GetInstance()
|
||||
->GetControlDeck()
|
||||
->GetControllerByPort(static_cast<uint8_t>(slot))
|
||||
->GetRumble()
|
||||
->GetAllRumbleMappings().empty()) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
return 0;
|
||||
// don't rumble if we don't have connected gamepads
|
||||
if (Ship::Context::GetInstance()
|
||||
->GetControlDeck()
|
||||
->GetConnectedPhysicalDeviceManager()
|
||||
->GetConnectedSDLGamepadsForPort(slot).empty()) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
// rumble
|
||||
return 1;
|
||||
}
|
||||
|
||||
extern "C" void* getN64WeirdFrame(s32 i) {
|
||||
|
@ -773,7 +773,9 @@ void DrawEnhancementsMenu() {
|
||||
UIWidgets::Tooltip("The default response to Kaepora Gaebora is always that you understood what he said");
|
||||
UIWidgets::PaddedEnhancementCheckbox("Exit Market at Night", CVAR_ENHANCEMENT("MarketSneak"), true, false);
|
||||
UIWidgets::Tooltip("Allows exiting Hyrule Castle Market Town to Hyrule Field at night by speaking to the guard next to the gate.");
|
||||
UIWidgets::PaddedEnhancementCheckbox("Shops and Games Always Open", CVAR_ENHANCEMENT("OpenAllHours"), true, false);
|
||||
bool randoLockedOverworldDoors = IS_RANDO && OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_LOCK_OVERWORLD_DOORS);
|
||||
UIWidgets::PaddedEnhancementCheckbox("Shops and Games Always Open", CVAR_ENHANCEMENT("OpenAllHours"), true, false, randoLockedOverworldDoors,
|
||||
"This is not compatible with the Locked Overworld Doors Randomizer option", UIWidgets::CheckboxGraphics::Checkmark);
|
||||
UIWidgets::Tooltip("Shops and minigames are open both day and night. Requires scene reload to take effect.");
|
||||
UIWidgets::PaddedEnhancementCheckbox("Link as default file name", CVAR_ENHANCEMENT("LinkDefaultName"), true, false);
|
||||
UIWidgets::Tooltip("Allows you to have \"Link\" as a premade file name");
|
||||
|
@ -1319,7 +1319,6 @@ namespace SOH {
|
||||
{ MigrationAction::Rename, "gRandomizeDoorOfTime", "gRandoSettings.DoorOfTime" },
|
||||
{ MigrationAction::Rename, "gRandomizeDungeonCount", "gRandoSettings.DungeonCount" },
|
||||
{ MigrationAction::Rename, "gRandomizeEnableBombchuDrops", "gRandoSettings.EnableBombchuDrops" },
|
||||
{ MigrationAction::Rename, "gRandomizeEnableGlitchCutscenes", "gRandoSettings.EnableGlitchCutscenes" },
|
||||
{ MigrationAction::Rename, "gRandomizeEnabledTricks", "gRandoSettings.EnabledTricks" },
|
||||
{ MigrationAction::Rename, "gRandomizeForest", "gRandoSettings.ClosedForest" },
|
||||
{ MigrationAction::Rename, "gRandomizeFrogsHint", "gRandoSettings.FrogsHint" },
|
||||
|
@ -1197,24 +1197,6 @@ void EnItem00_CustomItemsParticles(Actor* Parent, PlayState* play, GetItemEntry
|
||||
switch (giEntry.drawModIndex) {
|
||||
case MOD_NONE:
|
||||
switch (giEntry.drawItemId) {
|
||||
case ITEM_SONG_MINUET:
|
||||
colorIndex = PARTICLE_BRIGHT_GREEN;
|
||||
break;
|
||||
case ITEM_SONG_BOLERO:
|
||||
colorIndex = PARTICLE_RED;
|
||||
break;
|
||||
case ITEM_SONG_SERENADE:
|
||||
colorIndex = PARTICLE_CYAN;
|
||||
break;
|
||||
case ITEM_SONG_REQUIEM:
|
||||
colorIndex = PARTICLE_ORANGE;
|
||||
break;
|
||||
case ITEM_SONG_NOCTURNE:
|
||||
colorIndex = PARTICLE_VIOLET;
|
||||
break;
|
||||
case ITEM_SONG_PRELUDE:
|
||||
colorIndex = PARTICLE_YELLOW;
|
||||
break;
|
||||
case ITEM_STICK_UPGRADE_20:
|
||||
case ITEM_STICK_UPGRADE_30:
|
||||
colorIndex = PARTICLE_GREEN;
|
||||
@ -1234,6 +1216,7 @@ void EnItem00_CustomItemsParticles(Actor* Parent, PlayState* play, GetItemEntry
|
||||
break;
|
||||
case MOD_RANDOMIZER:
|
||||
switch (giEntry.drawItemId) {
|
||||
case RG_MINUET_OF_FOREST:
|
||||
case RG_MAGIC_SINGLE:
|
||||
case RG_MAGIC_DOUBLE:
|
||||
case RG_MAGIC_BEAN_PACK:
|
||||
@ -1242,19 +1225,30 @@ void EnItem00_CustomItemsParticles(Actor* Parent, PlayState* play, GetItemEntry
|
||||
case RG_GREG_RUPEE:
|
||||
colorIndex = PARTICLE_BRIGHT_GREEN;
|
||||
break;
|
||||
case RG_BOLERO_OF_FIRE:
|
||||
colorIndex = PARTICLE_RED;
|
||||
break;
|
||||
case RG_SERENADE_OF_WATER:
|
||||
case RG_BOTTLE_WITH_FISH:
|
||||
colorIndex = PARTICLE_CYAN;
|
||||
break;
|
||||
case RG_REQUIEM_OF_SPIRIT:
|
||||
colorIndex = PARTICLE_ORANGE;
|
||||
break;
|
||||
case RG_NOCTURNE_OF_SHADOW:
|
||||
case RG_BOTTLE_WITH_POE:
|
||||
colorIndex = PARTICLE_VIOLET;
|
||||
break;
|
||||
case RG_PRELUDE_OF_LIGHT:
|
||||
case RG_BOTTLE_WITH_BIG_POE:
|
||||
colorIndex = PARTICLE_YELLOW;
|
||||
break;
|
||||
case RG_DEKU_STICK_BAG:
|
||||
case RG_STICK_UPGRADE_INF:
|
||||
colorIndex = PARTICLE_GREEN;
|
||||
break;
|
||||
case RG_DEKU_NUT_BAG:
|
||||
case RG_NUT_UPGRADE_INF:
|
||||
colorIndex = PARTICLE_GOLD;
|
||||
break;
|
||||
case RG_DOUBLE_DEFENSE:
|
||||
|
@ -11,6 +11,7 @@
|
||||
#include "objects/object_mizu_objects/object_mizu_objects.h"
|
||||
#include "objects/object_haka_door/object_haka_door.h"
|
||||
#include "soh/ResourceManagerHelpers.h"
|
||||
#include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h"
|
||||
|
||||
#define FLAGS ACTOR_FLAG_UPDATE_CULLING_DISABLED
|
||||
|
||||
@ -162,7 +163,7 @@ void EnDoor_SetupType(EnDoor* this, PlayState* play) {
|
||||
}
|
||||
this->actor.world.rot.y = 0x0000;
|
||||
if (doorType == DOOR_LOCKED) {
|
||||
if (!Flags_GetSwitch(play, this->actor.params & 0x3F)) {
|
||||
if (GameInteractor_Should(VB_DOOR_BE_LOCKED, !Flags_GetSwitch(play, this->actor.params & 0x3F), this)) {
|
||||
this->lockTimer = 10;
|
||||
}
|
||||
} else if (doorType == DOOR_AJAR) {
|
||||
@ -201,8 +202,10 @@ void EnDoor_Idle(EnDoor* this, PlayState* play) {
|
||||
Animation_PlayOnceSetSpeed(&this->skelAnime, D_809FCECC[this->animStyle],
|
||||
(player->stateFlags1 & PLAYER_STATE1_IN_WATER) ? 0.75f : 1.5f);
|
||||
if (this->lockTimer != 0) {
|
||||
gSaveContext.inventory.dungeonKeys[gSaveContext.mapIndex]--;
|
||||
Flags_SetSwitch(play, this->actor.params & 0x3F);
|
||||
if (GameInteractor_Should(VB_CONSUME_SMALL_KEY, true, this)) {
|
||||
gSaveContext.inventory.dungeonKeys[gSaveContext.mapIndex]--;
|
||||
Flags_SetSwitch(play, this->actor.params & 0x3F);
|
||||
}
|
||||
Audio_PlayActorSound2(&this->actor, NA_SE_EV_CHAIN_KEY_UNLOCK);
|
||||
}
|
||||
} else if (!Player_InCsMode(play)) {
|
||||
@ -214,7 +217,7 @@ void EnDoor_Idle(EnDoor* this, PlayState* play) {
|
||||
}
|
||||
if (ABS(phi_v0) < 0x3000) {
|
||||
if (this->lockTimer != 0) {
|
||||
if (gSaveContext.inventory.dungeonKeys[gSaveContext.mapIndex] <= 0) {
|
||||
if (GameInteractor_Should(VB_NOT_HAVE_SMALL_KEY, gSaveContext.inventory.dungeonKeys[gSaveContext.mapIndex] <= 0, this)) {
|
||||
Player* player2 = GET_PLAYER(play);
|
||||
|
||||
player2->naviTextId = -0x203;
|
||||
|
@ -55,6 +55,9 @@ typedef struct EnDoor {
|
||||
/* 0x0198 */ Vec3s jointTable[5];
|
||||
/* 0x01B6 */ Vec3s morphTable[5];
|
||||
/* 0x01D4 */ EnDoorActionFunc actionFunc;
|
||||
// #region SOH [Randomizer]
|
||||
/* */ RandomizerInf randomizerInf;
|
||||
// #endregion
|
||||
} EnDoor; // size = 0x01D8
|
||||
|
||||
#ifdef __cplusplus
|
||||
|
@ -5418,7 +5418,7 @@ s32 Player_ActionHandler_1(Player* this, PlayState* play) {
|
||||
this->stateFlags1 |= PLAYER_STATE1_IN_CUTSCENE;
|
||||
Actor_DisableLens(play);
|
||||
|
||||
if (((doorActor->params >> 7) & 7) == 3) {
|
||||
if (GameInteractor_Should(VB_DOOR_PLAY_SCENE_TRANSITION, ((doorActor->params >> 7) & 7) == 3, doorActor)) {
|
||||
checkPos.x = doorActor->world.pos.x - (sp6C * sp74);
|
||||
checkPos.y = doorActor->world.pos.y + 10.0f;
|
||||
checkPos.z = doorActor->world.pos.z - (sp6C * sp78);
|
||||
|
Loading…
Reference in New Issue
Block a user