Lock overworld doors Randomizer option

This commit is contained in:
Garrett Cox 2024-09-03 21:10:40 -05:00
parent e5f4c091f8
commit c4b903fd5f
36 changed files with 1074 additions and 61 deletions

Binary file not shown.

Binary file not shown.

View 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>

View 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>

View 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>

View 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>

View 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>

View 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>

View 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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -80,6 +80,9 @@ static const ALIGN_ASSET(2) char gFishingPoleGiDL[] = dgFishingPoleGiDL;
#define dgMysteryItemDL "__OTR__objects/object_mystery_item/gMysteryItemDL"
static const ALIGN_ASSET(2) char gMysteryItemDL[] = dgMysteryItemDL;
#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;

View File

@ -284,7 +284,7 @@ typedef struct {
// #endregion
// #region SOH [Randomizer]
// Upstream TODO: Move these to their own struct or name to more obviously specific to Randomizer
/* */ u16 randomizerInf[17];
/* */ u16 randomizerInf[21];
/* */ u8 mqDungeonCount;
/* */ u16 adultTradeItems;
/* */ u8 triforcePiecesCollected;

View File

@ -348,7 +348,7 @@ const std::vector<FlagTable> flagTables = {
{ 0x24, "Market Crowd Text Randomizer" },
{ 0x30, "Entered the Market" },
} },
{ "Randomizer Inf Flags", RANDOMIZER_INF, 16, {
{ "Randomizer Inf Flags", RANDOMIZER_INF, 20, {
{ RAND_INF_DUNGEONS_DONE_SPIRIT_TEMPLE, "DUNGEONS_DONE_SPIRIT_TEMPLE" },
{ RAND_INF_DUNGEONS_DONE_SHADOW_TEMPLE, "DUNGEONS_DONE_SHADOW_TEMPLE" },
@ -621,6 +621,53 @@ const std::vector<FlagTable> flagTables = {
{ RAND_INF_ZF_GREAT_FAIRY_REWARD, "RAND_INF_ZF_GREAT_FAIRY_REWARD" },
{ RAND_INF_COLOSSUS_GREAT_FAIRY_REWARD, "RAND_INF_COLOSSUS_GREAT_FAIRY_REWARD" },
{ RAND_INF_OGC_GREAT_FAIRY_REWARD, "RAND_INF_OGC_GREAT_FAIRY_REWARD" },
{ 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_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" },
} },
};

View File

@ -289,6 +289,11 @@ typedef enum {
// Opt: *EnFr
// Vanilla condition: this->reward == GI_NONE
VB_FROGS_GO_TO_IDLE,
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,
/*** Play Cutscenes ***/

View File

@ -1361,7 +1361,20 @@ 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 kleiner Schlüssel für Ganons Schloß", /*french*/"une petite clé du Château de Ganon"),
// /*spanish*/una llave pequeña del Castillo de Ganon
{
CustomMessage("a small key", /*german*/"ein kleiner Schlüssel", /*french*/"une petite clé")
// /*spanish*/una llave pequeña
}, {
CustomMessage("a final tool for unlocking", /*german*/"ein finales Werkzeug zur Entschlüsselung", /*french*/"un anti-porte final"),
// /*spanish*/una clave de una entrada final
CustomMessage("a final dungeon pass", /*german*/"ein finaler Dungeon-Pass", /*french*/"le rêve final d'un prisonnier"),
// /*spanish*/un pase de una mazmorra final
CustomMessage("a final lock remover", /*german*/"ein finaler Schlossentferner", /*french*/"un efface-serrure final"),
// /*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_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
{

View File

@ -1162,6 +1162,32 @@ 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_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) ||

View File

@ -8,7 +8,7 @@ void RegionTable_Init_CastleTown() {
//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, {}, {}, {
@ -16,20 +16,20 @@ void RegionTable_Init_CastleTown() {
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_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;}}),
});
@ -176,7 +176,7 @@ void RegionTable_Init_CastleTown() {
LOCATION(RC_MARKET_GS_GUARD_HOUSE, logic->IsChild),
}, {
//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, {}, {
@ -210,7 +210,7 @@ void RegionTable_Init_CastleTown() {
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, {
@ -222,7 +222,7 @@ void RegionTable_Init_CastleTown() {
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, {}, {
@ -256,7 +256,7 @@ void RegionTable_Init_CastleTown() {
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, {}, {
@ -279,7 +279,7 @@ void RegionTable_Init_CastleTown() {
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, {}, {}, {

View File

@ -135,7 +135,7 @@ void RegionTable_Init_HyruleField() {
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;}}),
});
@ -143,7 +143,7 @@ void RegionTable_Init_HyruleField() {
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_HOLE, {[]{return true;}}),
Entrance(RR_LH_FISHING_HOLE, {[]{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, {}, {}, {
@ -158,7 +158,7 @@ void RegionTable_Init_HyruleField() {
LOCATION(RC_LH_GS_LAB_CRATE, logic->CanUse(RG_IRON_BOOTS) && logic->CanUse(RG_HOOKSHOT)),
}, {
//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?
@ -203,7 +203,7 @@ void RegionTable_Init_HyruleField() {
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, {}, {
@ -231,9 +231,9 @@ void RegionTable_Init_HyruleField() {
}, {
//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;}}),
});
@ -242,7 +242,7 @@ void RegionTable_Init_HyruleField() {
LOCATION(RC_LLR_TALONS_CHICKENS, logic->HasItem(RG_CHILD_WALLET) && logic->IsChild && logic->AtDay && logic->HasItem(RG_ZELDAS_LETTER)),
}, {
//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, {}, {
@ -251,7 +251,7 @@ void RegionTable_Init_HyruleField() {
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, {}, {
@ -261,7 +261,7 @@ void RegionTable_Init_HyruleField() {
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, {}, {

View File

@ -22,14 +22,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_BOTTOM_OF_THE_WELL_ENTRYWAY, {[]{return logic->DrainWell && (logic->IsChild || ctx->GetOption(RSK_SHUFFLE_DUNGEON_ENTRANCES).IsNot(RO_DUNGEON_ENTRANCE_SHUFFLE_OFF));}}),
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->CanUse(RG_HOOKSHOT) || (logic->IsAdult && ctx->GetTrickOption(RT_VISIBLE_COLLISION));}}),
Entrance(RR_KAK_ROOFTOP, {[]{return logic->CanUse(RG_HOOKSHOT) || (ctx->GetTrickOption(RT_KAK_MAN_ON_ROOF) && (logic->IsAdult || logic->AtDay || logic->CanUse(RG_FAIRY_SLINGSHOT) || logic->CanUse(RG_BOMBCHU_5) || logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_LONGSHOT)));}}),
@ -65,8 +65,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, {
@ -74,7 +74,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, {}, {
@ -87,7 +87,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, {}, {
@ -95,7 +95,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, {}, {
@ -117,7 +117,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, {}, {
@ -140,7 +140,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, {}, {
@ -174,7 +174,7 @@ void RegionTable_Init_Kakariko() {
},
{
// 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, {}, {
@ -214,7 +214,7 @@ void RegionTable_Init_Kakariko() {
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;}}),
});
@ -264,7 +264,7 @@ void RegionTable_Init_Kakariko() {
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, {

View File

@ -592,4 +592,19 @@ extern "C" void Randomizer_DrawSkeletonKey(PlayState* play, GetItemEntry* getIte
gSPGrayscale(POLY_OPA_DISP++, false);
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);
}

View File

@ -23,6 +23,7 @@ void Randomizer_DrawBronzeScale(PlayState* play, GetItemEntry* getItemEntry);
void Randomizer_DrawFishingPoleGI(PlayState* play, GetItemEntry* getItemEntry);
void Randomizer_DrawSkeletonKey(PlayState* play, GetItemEntry* getItemEntry);
void Randomizer_DrawMysteryItem(PlayState* play, GetItemEntry getItemEntry);
void Randomizer_DrawOverworldKey(PlayState* play, GetItemEntry* getItemEntry);
#define GET_ITEM_MYSTERY \
{ ITEM_NONE_FE, 0, 0, 0, 0, 0, 0, ITEM_NONE_FE, 0, false, ITEM_FROM_NPC, ITEM_CATEGORY_JUNK, NULL, MOD_RANDOMIZER, (CustomDrawFunc)Randomizer_DrawMysteryItem }

View File

@ -47,6 +47,7 @@ extern "C" {
#include "src/overlays/actors/ovl_Door_Gerudo/z_door_gerudo.h"
#include "src/overlays/actors/ovl_En_Xc/z_en_xc.h"
#include "src/overlays/actors/ovl_Fishing/z_fishing.h"
#include "src/overlays/actors/ovl_En_Door/z_en_door.h"
#include "adult_trade_shuffle.h"
#include "draw.h"
@ -1229,6 +1230,14 @@ void RandomizerOnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, va_l
}
break;
}
case VB_CONSUME_SMALL_KEY: {
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;
}
break;
}
case VB_GERUDOS_BE_FRIENDLY: {
*should = CHECK_QUEST_ITEM(QUEST_GERUDO_CARD);
break;
@ -1394,6 +1403,20 @@ void RandomizerOnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, va_l
}
break;
}
case VB_NOT_HAVE_SMALL_KEY: {
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));
}
break;
}
case VB_DOOR_BE_LOCKED: {
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);
}
break;
}
case VB_TRADE_TIMER_ODD_MUSHROOM:
case VB_TRADE_TIMER_EYEDROPS:
case VB_TRADE_TIMER_FROG:
@ -1591,6 +1614,74 @@ void ObjComb_RandomizerWait(ObjComb* objComb, PlayState* play) {
}
}
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_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, 390 }, RAND_INF_DAMPES_HUT_UNLOCKED }, // Child Evening
{{ SCENE_GRAVEYARD, 646 }, RAND_INF_DAMPES_HUT_UNLOCKED }, // Child Night (After Dampes Tour)
{{ SCENE_GRAVEYARD, 447 }, RAND_INF_DAMPES_HUT_UNLOCKED }, // Adult
{{ 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 },
};
void RandomizerOnActorInitHandler(void* actorRef) {
Actor* actor = static_cast<Actor*>(actorRef);
@ -1603,6 +1694,30 @@ void RandomizerOnActorInitHandler(void* actorRef) {
}
}
if (actor->id == ACTOR_EN_DOOR) {
EnDoor* enDoor = static_cast<EnDoor*>(actorRef);
enDoor->randomizerInf = RAND_INF_MAX;
auto it = lookupTable.find({gPlayState->sceneNum, actor->params});
if (it != lookupTable.end() && RAND_GET_OPTION(RSK_LOCK_OVERWORLD_DOORS)) {
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 (((actor->params >> 7) & 7) != DOOR_CHECKABLE) {
actor->params = (actor->params & ~0x380) | (DOOR_LOCKED << 7);
enDoor->actionFunc = EnDoor_SetupType;
} else {
enDoor->lockTimer = 10;
}
}
}
}
if (actor->id == ACTOR_EN_DNS) {
EnDns* enDns = static_cast<EnDns*>(actorRef);
s16 respawnData = gSaveContext.respawn[RESPAWN_MODE_RETURN].data & ((1 << 8) - 1);

View File

@ -159,6 +159,52 @@ 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_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);

View File

@ -137,6 +137,30 @@ 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_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:
@ -377,6 +401,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;
}
@ -1036,7 +1072,30 @@ 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_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 = {
@ -1378,6 +1437,29 @@ 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_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:

View File

@ -159,6 +159,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);

View File

@ -33,6 +33,7 @@ void Settings::CreateOptionDescriptions() {
"\n"
"Open - King Zora has already mweeped out of the way in both "
"time periods. Ruto's Letter is removed from the item pool.";
mOptionDescriptions[RSK_LOCK_OVERWORLD_DOORS] = "Add locks to all overworld wooden 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"

View File

@ -2717,7 +2717,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, 85> getItemMessages = {{
const std::array<GetItemMessage, 108> getItemMessages = {{
GIMESSAGE(RG_GREG_RUPEE, ITEM_MASK_GORON,
"You found %gGreg%w!",
"%gGreg%w! Du hast ihn wirklich gefunden!",
@ -2765,40 +2765,132 @@ 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_GROUNDS_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_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!",

View File

@ -146,6 +146,29 @@ 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_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,
@ -2270,6 +2293,29 @@ 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_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,
@ -3736,6 +3782,7 @@ typedef enum {
RHT_ISOLATED_PLACE,
RHT_DUNGEON_ORDINARY,
RHT_DUNGEON_MASTERFUL,
RHT_OVERWORLD_KEY,
RHT_MAX
} RandomizerHintTextKey;
@ -4021,6 +4068,7 @@ typedef enum {
RSK_SKELETON_KEY,
RSK_SHUFFLE_DEKU_STICK_BAG,
RSK_SHUFFLE_DEKU_NUT_BAG,
RSK_LOCK_OVERWORLD_DOORS,
RSK_MAX
} RandomizerSettingKey;

View File

@ -306,6 +306,54 @@ typedef enum {
RAND_INF_CHILD_TRADES_MASK_ZORA,
RAND_INF_CHILD_TRADES_MASK_GERUDO,
RAND_INF_CHILD_TRADES_MASK_TRUTH,
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_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,
// If you add anything to this list, you need to update the size of randomizerInf in z64save.h to be ceil(RAND_INF_MAX / 16)
RAND_INF_MAX,

View File

@ -109,6 +109,7 @@ void Settings::CreateOptions() {
mOptions[RSK_KAK_GATE] = Option::U8("Kakariko Gate", {"Closed", "Open"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("KakarikoGate"), mOptionDescriptions[RSK_KAK_GATE]);
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_LOCK_OVERWORLD_DOORS] = Option::Bool("Lock Overworld Doors", "gRandomizeLockOverworldDoors", mOptionDescriptions[RSK_LOCK_OVERWORLD_DOORS]);
mOptions[RSK_GERUDO_FORTRESS] = Option::U8("Gerudo Fortress", {"Normal", "Fast", "Open"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("GerudoFortress"), 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("Stone Count", {NumOpts(0, 4)}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("StoneCount"), "", WidgetType::Slider, 3, true);
@ -695,6 +696,7 @@ void Settings::CreateOptions() {
&mOptions[RSK_KAK_GATE],
&mOptions[RSK_DOOR_OF_TIME],
&mOptions[RSK_ZORAS_FOUNTAIN],
&mOptions[RSK_LOCK_OVERWORLD_DOORS],
}, false, WidgetContainerType::COLUMN);
mOptionGroups[RSG_WORLD_IMGUI] = OptionGroup::SubGroup("World Settings", {
&mOptions[RSK_STARTING_AGE],
@ -944,6 +946,7 @@ void Settings::CreateOptions() {
&mOptions[RSK_KAK_GATE],
&mOptions[RSK_DOOR_OF_TIME],
&mOptions[RSK_ZORAS_FOUNTAIN],
&mOptions[RSK_LOCK_OVERWORLD_DOORS],
&mOptions[RSK_GERUDO_FORTRESS],
&mOptions[RSK_RAINBOW_BRIDGE],
&mOptions[RSK_RAINBOW_BRIDGE_STONE_COUNT],
@ -1262,6 +1265,7 @@ void Settings::CreateOptions() {
{ "Open Settings:Door of Time", RSK_DOOR_OF_TIME },
{ "Open Settings:Zora's Fountain", RSK_ZORAS_FOUNTAIN },
{ "World Settings:Starting Age", RSK_STARTING_AGE },
{ "Open Settings:Lock Overworld Doors", RSK_LOCK_OVERWORLD_DOORS },
{ "Open Settings:Gerudo Fortress", RSK_GERUDO_FORTRESS },
{ "Open Settings:Rainbow Bridge", RSK_RAINBOW_BRIDGE },
{ "Open Settings:Stone Count", RSK_RAINBOW_BRIDGE_STONE_COUNT },
@ -2801,6 +2805,7 @@ void Settings::ParseJson(nlohmann::json spoilerFileJson) {
case RSK_MQ_DUNGEON_SET:
case RSK_SHUFFLE_DEKU_NUT_BAG:
case RSK_SHUFFLE_DEKU_STICK_BAG:
case RSK_LOCK_OVERWORLD_DOORS:
if (it.value() == "Off") {
mOptions[index].SetSelectedIndex(RO_GENERIC_OFF);
} else if (it.value() == "On") {

View File

@ -2712,6 +2712,9 @@ 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(RAND_INF_GUARD_HOUSE_UNLOCKED + ((item - RG_GUARD_HOUSE_KEY) * 2) + 1);
return Return_Item_Entry(giEntry, RG_NONE);
}
if (item == RG_TYCOON_WALLET) {

View File

@ -10,6 +10,7 @@
#include "objects/object_hidan_objects/object_hidan_objects.h"
#include "objects/object_mizu_objects/object_mizu_objects.h"
#include "objects/object_haka_door/object_haka_door.h"
#include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h"
#define FLAGS ACTOR_FLAG_UPDATE_WHILE_CULLED
@ -161,7 +162,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) {
@ -200,8 +201,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)) {
@ -213,7 +216,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;

View File

@ -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

View File

@ -5413,7 +5413,14 @@ s32 Player_ActionHandler_1(Player* this, PlayState* play) {
this->stateFlags1 |= PLAYER_STATE1_IN_CUTSCENE;
Actor_DisableLens(play);
if (((doorActor->params >> 7) & 7) == 3) {
if (
((doorActor->params >> 7) & 7) == 3 ||
(
doorActor->id == ACTOR_EN_DOOR &&
((doorActor->params >> 7) & 7) == 1 &&
((EnDoor*)doorActor)->randomizerInf != RAND_INF_MAX
)
) {
checkPos.x = doorActor->world.pos.x - (sp6C * sp74);
checkPos.y = doorActor->world.pos.y + 10.0f;
checkPos.z = doorActor->world.pos.z - (sp6C * sp78);