diff --git a/CMakeLists.txt b/CMakeLists.txt index 9c3945459..6dc479fb4 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -5,7 +5,7 @@ set(CMAKE_CXX_STANDARD 20 CACHE STRING "The C++ standard to use") set(CMAKE_OSX_DEPLOYMENT_TARGET "10.15" CACHE STRING "Minimum OS X deployment version") -project(Ship VERSION 9.0.0 LANGUAGES C CXX) +project(Ship VERSION 9.0.1 LANGUAGES C CXX) include(CMake/soh-cvars.cmake) include(CMake/lus-cvars.cmake) diff --git a/README.md b/README.md index e7f929bad..ea1ad76a2 100644 --- a/README.md +++ b/README.md @@ -61,7 +61,8 @@ Congratulations, you are now sailing with the Ship of Harkinian! Have fun! ### Other shortcuts | Keys | Action | | - | - | -| F1 | Toggle menubar | +| ESC | Toggle menu | +| F2 | Toggle capture mouse input | | F5 | Save state | | F6 | Change state | | F7 | Load state | diff --git a/soh/assets/objects/object_mag/object_mag.h b/soh/assets/objects/object_mag/object_mag.h index b470b71dd..720d0cbe5 100644 --- a/soh/assets/objects/object_mag/object_mag.h +++ b/soh/assets/objects/object_mag/object_mag.h @@ -18,6 +18,12 @@ static const ALIGN_ASSET(2) char gTitleCopyright19982002Tex[] = dgTitleCopyright #define dgTitleCopyright19982003Tex "__OTR__objects/object_mag/gTitleCopyright19982003Tex" static const ALIGN_ASSET(2) char gTitleCopyright19982003Tex[] = dgTitleCopyright19982003Tex; +#define dgTitleCopyright19982004EngTex "__OTR__objects/object_mag/gTitleCopyright19982004EngTex" +static const ALIGN_ASSET(2) char gTitleCopyright19982004EngTex[] = dgTitleCopyright19982004EngTex; + +#define dgTitleCopyright19982004JpnTex "__OTR__objects/object_mag/gTitleCopyright19982004JpnTex" +static const ALIGN_ASSET(2) char gTitleCopyright19982004JpnTex[] = dgTitleCopyright19982004JpnTex; + #define dgTitleMasterQuestSubtitleTex "__OTR__objects/object_mag/gTitleMasterQuestSubtitleTex" static const ALIGN_ASSET(2) char gTitleMasterQuestSubtitleTex[] = dgTitleMasterQuestSubtitleTex; diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_bv.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_bv.xml index 58db6e1d4..d2ebf275b 100644 --- a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_bv.xml +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_bv.xml @@ -38,7 +38,7 @@ - + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_fd.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_fd.xml index 9bc25d3a6..260957967 100644 --- a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_fd.xml +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_fd.xml @@ -28,7 +28,7 @@ - + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_fhg.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_fhg.xml index 6a275daeb..669875aaf 100644 --- a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_fhg.xml +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_fhg.xml @@ -38,7 +38,7 @@ - + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_ganon.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_ganon.xml index 5b68602ba..c654c7fec 100644 --- a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_ganon.xml +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_ganon.xml @@ -68,7 +68,7 @@ - + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_goma.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_goma.xml index ec3e42114..922678a3c 100644 --- a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_goma.xml +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_goma.xml @@ -159,7 +159,7 @@ - + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_kingdodongo.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_kingdodongo.xml index a865c15de..5ef07a26f 100644 --- a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_kingdodongo.xml +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_kingdodongo.xml @@ -48,7 +48,7 @@ - + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_mag.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_mag.xml index b2b082e6b..6e07fa2cd 100644 --- a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_mag.xml +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_mag.xml @@ -1,7 +1,7 @@ - + @@ -18,4 +18,4 @@ - \ No newline at end of file + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_mo.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_mo.xml index f450368f3..4c4be74c8 100644 --- a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_mo.xml +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_mo.xml @@ -6,7 +6,7 @@ - + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_sst.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_sst.xml index d64787fa1..b874b9a41 100644 --- a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_sst.xml +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_sst.xml @@ -17,7 +17,7 @@ - + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_tw.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_tw.xml index d238e10ab..c7fd2a60b 100644 --- a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_tw.xml +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_tw.xml @@ -273,7 +273,7 @@ - + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_bv.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_bv.xml index 58db6e1d4..d2ebf275b 100644 --- a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_bv.xml +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_bv.xml @@ -38,7 +38,7 @@ - + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_fd.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_fd.xml index 9bc25d3a6..260957967 100644 --- a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_fd.xml +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_fd.xml @@ -28,7 +28,7 @@ - + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_fhg.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_fhg.xml index 6a275daeb..669875aaf 100644 --- a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_fhg.xml +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_fhg.xml @@ -38,7 +38,7 @@ - + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_ganon.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_ganon.xml index 5b68602ba..c654c7fec 100644 --- a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_ganon.xml +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_ganon.xml @@ -68,7 +68,7 @@ - + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_goma.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_goma.xml index ec3e42114..922678a3c 100644 --- a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_goma.xml +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_goma.xml @@ -159,7 +159,7 @@ - + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_kingdodongo.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_kingdodongo.xml index a865c15de..5ef07a26f 100644 --- a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_kingdodongo.xml +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_kingdodongo.xml @@ -48,7 +48,7 @@ - + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_mo.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_mo.xml index f450368f3..4c4be74c8 100644 --- a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_mo.xml +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_mo.xml @@ -6,7 +6,7 @@ - + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_sst.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_sst.xml index d64787fa1..b874b9a41 100644 --- a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_sst.xml +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_sst.xml @@ -17,7 +17,7 @@ - + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_tw.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_tw.xml index d238e10ab..c7fd2a60b 100644 --- a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_tw.xml +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_tw.xml @@ -273,7 +273,7 @@ - + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_bv.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_bv.xml index 58db6e1d4..d2ebf275b 100644 --- a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_bv.xml +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_bv.xml @@ -38,7 +38,7 @@ - + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_fd.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_fd.xml index 9bc25d3a6..260957967 100644 --- a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_fd.xml +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_fd.xml @@ -28,7 +28,7 @@ - + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_fhg.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_fhg.xml index 6a275daeb..669875aaf 100644 --- a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_fhg.xml +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_fhg.xml @@ -38,7 +38,7 @@ - + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ganon.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ganon.xml index 5b68602ba..c654c7fec 100644 --- a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ganon.xml +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ganon.xml @@ -68,7 +68,7 @@ - + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_goma.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_goma.xml index ec3e42114..922678a3c 100644 --- a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_goma.xml +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_goma.xml @@ -159,7 +159,7 @@ - + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_kingdodongo.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_kingdodongo.xml index a865c15de..5ef07a26f 100644 --- a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_kingdodongo.xml +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_kingdodongo.xml @@ -48,7 +48,7 @@ - + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_mag.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_mag.xml index b68d4227a..063d801a3 100644 --- a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_mag.xml +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_mag.xml @@ -1,7 +1,7 @@ - + @@ -17,4 +17,4 @@ - \ No newline at end of file + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_mo.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_mo.xml index f450368f3..4c4be74c8 100644 --- a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_mo.xml +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_mo.xml @@ -6,7 +6,7 @@ - + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_sst.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_sst.xml index d64787fa1..b874b9a41 100644 --- a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_sst.xml +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_sst.xml @@ -17,7 +17,7 @@ - + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_tw.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_tw.xml index d238e10ab..c7fd2a60b 100644 --- a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_tw.xml +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_tw.xml @@ -273,7 +273,7 @@ - + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_bv.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_bv.xml index 58db6e1d4..d2ebf275b 100644 --- a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_bv.xml +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_bv.xml @@ -38,7 +38,7 @@ - + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_fd.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_fd.xml index 9bc25d3a6..260957967 100644 --- a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_fd.xml +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_fd.xml @@ -28,7 +28,7 @@ - + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_fhg.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_fhg.xml index 6a275daeb..669875aaf 100644 --- a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_fhg.xml +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_fhg.xml @@ -38,7 +38,7 @@ - + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ganon.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ganon.xml index 5b68602ba..c654c7fec 100644 --- a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ganon.xml +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ganon.xml @@ -68,7 +68,7 @@ - + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_goma.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_goma.xml index ec3e42114..922678a3c 100644 --- a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_goma.xml +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_goma.xml @@ -159,7 +159,7 @@ - + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_kingdodongo.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_kingdodongo.xml index a865c15de..5ef07a26f 100644 --- a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_kingdodongo.xml +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_kingdodongo.xml @@ -48,7 +48,7 @@ - + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_mag.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_mag.xml index 84467d76d..6276dee1d 100644 --- a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_mag.xml +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_mag.xml @@ -1,8 +1,8 @@ - - + + @@ -18,4 +18,4 @@ - \ No newline at end of file + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_mo.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_mo.xml index f450368f3..4c4be74c8 100644 --- a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_mo.xml +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_mo.xml @@ -6,7 +6,7 @@ - + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_sst.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_sst.xml index d64787fa1..b874b9a41 100644 --- a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_sst.xml +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_sst.xml @@ -17,7 +17,7 @@ - + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_tw.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_tw.xml index d238e10ab..c7fd2a60b 100644 --- a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_tw.xml +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_tw.xml @@ -273,7 +273,7 @@ - + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_bv.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_bv.xml index 58db6e1d4..d2ebf275b 100644 --- a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_bv.xml +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_bv.xml @@ -38,7 +38,7 @@ - + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_fd.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_fd.xml index 9bc25d3a6..260957967 100644 --- a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_fd.xml +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_fd.xml @@ -28,7 +28,7 @@ - + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_fhg.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_fhg.xml index 6a275daeb..669875aaf 100644 --- a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_fhg.xml +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_fhg.xml @@ -38,7 +38,7 @@ - + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ganon.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ganon.xml index 5b68602ba..c654c7fec 100644 --- a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ganon.xml +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ganon.xml @@ -68,7 +68,7 @@ - + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_goma.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_goma.xml index ec3e42114..922678a3c 100644 --- a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_goma.xml +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_goma.xml @@ -159,7 +159,7 @@ - + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_kingdodongo.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_kingdodongo.xml index a865c15de..5ef07a26f 100644 --- a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_kingdodongo.xml +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_kingdodongo.xml @@ -48,7 +48,7 @@ - + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_mo.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_mo.xml index f450368f3..4c4be74c8 100644 --- a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_mo.xml +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_mo.xml @@ -6,7 +6,7 @@ - + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_sst.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_sst.xml index d64787fa1..b874b9a41 100644 --- a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_sst.xml +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_sst.xml @@ -17,7 +17,7 @@ - + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_tw.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_tw.xml index d238e10ab..c7fd2a60b 100644 --- a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_tw.xml +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_tw.xml @@ -273,7 +273,7 @@ - + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_bv.xml b/soh/assets/xml/N64_NTSC_10/objects/object_bv.xml index 58db6e1d4..d2ebf275b 100644 --- a/soh/assets/xml/N64_NTSC_10/objects/object_bv.xml +++ b/soh/assets/xml/N64_NTSC_10/objects/object_bv.xml @@ -38,7 +38,7 @@ - + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_fd.xml b/soh/assets/xml/N64_NTSC_10/objects/object_fd.xml index 9bc25d3a6..260957967 100644 --- a/soh/assets/xml/N64_NTSC_10/objects/object_fd.xml +++ b/soh/assets/xml/N64_NTSC_10/objects/object_fd.xml @@ -28,7 +28,7 @@ - + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_fhg.xml b/soh/assets/xml/N64_NTSC_10/objects/object_fhg.xml index 6a275daeb..669875aaf 100644 --- a/soh/assets/xml/N64_NTSC_10/objects/object_fhg.xml +++ b/soh/assets/xml/N64_NTSC_10/objects/object_fhg.xml @@ -38,7 +38,7 @@ - + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_ganon.xml b/soh/assets/xml/N64_NTSC_10/objects/object_ganon.xml index 5b68602ba..c654c7fec 100644 --- a/soh/assets/xml/N64_NTSC_10/objects/object_ganon.xml +++ b/soh/assets/xml/N64_NTSC_10/objects/object_ganon.xml @@ -68,7 +68,7 @@ - + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_goma.xml b/soh/assets/xml/N64_NTSC_10/objects/object_goma.xml index ec3e42114..922678a3c 100644 --- a/soh/assets/xml/N64_NTSC_10/objects/object_goma.xml +++ b/soh/assets/xml/N64_NTSC_10/objects/object_goma.xml @@ -159,7 +159,7 @@ - + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_kingdodongo.xml b/soh/assets/xml/N64_NTSC_10/objects/object_kingdodongo.xml index a865c15de..5ef07a26f 100644 --- a/soh/assets/xml/N64_NTSC_10/objects/object_kingdodongo.xml +++ b/soh/assets/xml/N64_NTSC_10/objects/object_kingdodongo.xml @@ -48,7 +48,7 @@ - + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_mo.xml b/soh/assets/xml/N64_NTSC_10/objects/object_mo.xml index f450368f3..4c4be74c8 100644 --- a/soh/assets/xml/N64_NTSC_10/objects/object_mo.xml +++ b/soh/assets/xml/N64_NTSC_10/objects/object_mo.xml @@ -6,7 +6,7 @@ - + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_sst.xml b/soh/assets/xml/N64_NTSC_10/objects/object_sst.xml index d64787fa1..b874b9a41 100644 --- a/soh/assets/xml/N64_NTSC_10/objects/object_sst.xml +++ b/soh/assets/xml/N64_NTSC_10/objects/object_sst.xml @@ -17,7 +17,7 @@ - + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_tw.xml b/soh/assets/xml/N64_NTSC_10/objects/object_tw.xml index d238e10ab..c7fd2a60b 100644 --- a/soh/assets/xml/N64_NTSC_10/objects/object_tw.xml +++ b/soh/assets/xml/N64_NTSC_10/objects/object_tw.xml @@ -273,7 +273,7 @@ - + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_bv.xml b/soh/assets/xml/N64_NTSC_11/objects/object_bv.xml index 58db6e1d4..d2ebf275b 100644 --- a/soh/assets/xml/N64_NTSC_11/objects/object_bv.xml +++ b/soh/assets/xml/N64_NTSC_11/objects/object_bv.xml @@ -38,7 +38,7 @@ - + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_fd.xml b/soh/assets/xml/N64_NTSC_11/objects/object_fd.xml index 9bc25d3a6..260957967 100644 --- a/soh/assets/xml/N64_NTSC_11/objects/object_fd.xml +++ b/soh/assets/xml/N64_NTSC_11/objects/object_fd.xml @@ -28,7 +28,7 @@ - + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_fhg.xml b/soh/assets/xml/N64_NTSC_11/objects/object_fhg.xml index 6a275daeb..669875aaf 100644 --- a/soh/assets/xml/N64_NTSC_11/objects/object_fhg.xml +++ b/soh/assets/xml/N64_NTSC_11/objects/object_fhg.xml @@ -38,7 +38,7 @@ - + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_ganon.xml b/soh/assets/xml/N64_NTSC_11/objects/object_ganon.xml index 5b68602ba..c654c7fec 100644 --- a/soh/assets/xml/N64_NTSC_11/objects/object_ganon.xml +++ b/soh/assets/xml/N64_NTSC_11/objects/object_ganon.xml @@ -68,7 +68,7 @@ - + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_goma.xml b/soh/assets/xml/N64_NTSC_11/objects/object_goma.xml index ec3e42114..922678a3c 100644 --- a/soh/assets/xml/N64_NTSC_11/objects/object_goma.xml +++ b/soh/assets/xml/N64_NTSC_11/objects/object_goma.xml @@ -159,7 +159,7 @@ - + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_kingdodongo.xml b/soh/assets/xml/N64_NTSC_11/objects/object_kingdodongo.xml index a865c15de..5ef07a26f 100644 --- a/soh/assets/xml/N64_NTSC_11/objects/object_kingdodongo.xml +++ b/soh/assets/xml/N64_NTSC_11/objects/object_kingdodongo.xml @@ -48,7 +48,7 @@ - + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_mo.xml b/soh/assets/xml/N64_NTSC_11/objects/object_mo.xml index f450368f3..4c4be74c8 100644 --- a/soh/assets/xml/N64_NTSC_11/objects/object_mo.xml +++ b/soh/assets/xml/N64_NTSC_11/objects/object_mo.xml @@ -6,7 +6,7 @@ - + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_sst.xml b/soh/assets/xml/N64_NTSC_11/objects/object_sst.xml index d64787fa1..b874b9a41 100644 --- a/soh/assets/xml/N64_NTSC_11/objects/object_sst.xml +++ b/soh/assets/xml/N64_NTSC_11/objects/object_sst.xml @@ -17,7 +17,7 @@ - + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_tw.xml b/soh/assets/xml/N64_NTSC_11/objects/object_tw.xml index d238e10ab..c7fd2a60b 100644 --- a/soh/assets/xml/N64_NTSC_11/objects/object_tw.xml +++ b/soh/assets/xml/N64_NTSC_11/objects/object_tw.xml @@ -273,7 +273,7 @@ - + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_bv.xml b/soh/assets/xml/N64_NTSC_12/objects/object_bv.xml index 58db6e1d4..d2ebf275b 100644 --- a/soh/assets/xml/N64_NTSC_12/objects/object_bv.xml +++ b/soh/assets/xml/N64_NTSC_12/objects/object_bv.xml @@ -38,7 +38,7 @@ - + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_fd.xml b/soh/assets/xml/N64_NTSC_12/objects/object_fd.xml index 9bc25d3a6..260957967 100644 --- a/soh/assets/xml/N64_NTSC_12/objects/object_fd.xml +++ b/soh/assets/xml/N64_NTSC_12/objects/object_fd.xml @@ -28,7 +28,7 @@ - + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_fhg.xml b/soh/assets/xml/N64_NTSC_12/objects/object_fhg.xml index 6a275daeb..669875aaf 100644 --- a/soh/assets/xml/N64_NTSC_12/objects/object_fhg.xml +++ b/soh/assets/xml/N64_NTSC_12/objects/object_fhg.xml @@ -38,7 +38,7 @@ - + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_ganon.xml b/soh/assets/xml/N64_NTSC_12/objects/object_ganon.xml index 5b68602ba..c654c7fec 100644 --- a/soh/assets/xml/N64_NTSC_12/objects/object_ganon.xml +++ b/soh/assets/xml/N64_NTSC_12/objects/object_ganon.xml @@ -68,7 +68,7 @@ - + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_goma.xml b/soh/assets/xml/N64_NTSC_12/objects/object_goma.xml index ec3e42114..922678a3c 100644 --- a/soh/assets/xml/N64_NTSC_12/objects/object_goma.xml +++ b/soh/assets/xml/N64_NTSC_12/objects/object_goma.xml @@ -159,7 +159,7 @@ - + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_kingdodongo.xml b/soh/assets/xml/N64_NTSC_12/objects/object_kingdodongo.xml index a865c15de..5ef07a26f 100644 --- a/soh/assets/xml/N64_NTSC_12/objects/object_kingdodongo.xml +++ b/soh/assets/xml/N64_NTSC_12/objects/object_kingdodongo.xml @@ -48,7 +48,7 @@ - + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_mo.xml b/soh/assets/xml/N64_NTSC_12/objects/object_mo.xml index f450368f3..4c4be74c8 100644 --- a/soh/assets/xml/N64_NTSC_12/objects/object_mo.xml +++ b/soh/assets/xml/N64_NTSC_12/objects/object_mo.xml @@ -6,7 +6,7 @@ - + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_sst.xml b/soh/assets/xml/N64_NTSC_12/objects/object_sst.xml index d64787fa1..b874b9a41 100644 --- a/soh/assets/xml/N64_NTSC_12/objects/object_sst.xml +++ b/soh/assets/xml/N64_NTSC_12/objects/object_sst.xml @@ -17,7 +17,7 @@ - + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_tw.xml b/soh/assets/xml/N64_NTSC_12/objects/object_tw.xml index d238e10ab..c7fd2a60b 100644 --- a/soh/assets/xml/N64_NTSC_12/objects/object_tw.xml +++ b/soh/assets/xml/N64_NTSC_12/objects/object_tw.xml @@ -273,7 +273,7 @@ - + diff --git a/soh/include/z64.h b/soh/include/z64.h index 99835304f..83e1498db 100644 --- a/soh/include/z64.h +++ b/soh/include/z64.h @@ -544,6 +544,8 @@ typedef enum { LANGUAGE_MAX } Language; +#define TODO_TRANSLATE "__Translate_This__" + // TODO get these properties from the textures themselves #define FONT_CHAR_TEX_WIDTH 16 #define FONT_CHAR_TEX_HEIGHT 16 diff --git a/soh/soh/Enhancements/controls/InputViewer.cpp b/soh/soh/Enhancements/controls/InputViewer.cpp index a48b1811f..3ae3bc1ba 100644 --- a/soh/soh/Enhancements/controls/InputViewer.cpp +++ b/soh/soh/Enhancements/controls/InputViewer.cpp @@ -584,7 +584,7 @@ void InputViewerSettingsWindow::DrawElement() { } // gInputViewer.Dpad CVarCheckbox("Show D-Pad Layers", CVAR_INPUT_VIEWER("Dpad"), - CheckboxOptions().Color(THEME_COLOR).DefaultValue(true)); + CheckboxOptions().Color(THEME_COLOR).DefaultValue(false)); if (useIndividualOutlines && CVarGetInteger(CVAR_INPUT_VIEWER("Dpad"), 0)) { ImGui::Indent(); CVarCombobox("##DpadOutline", CVAR_INPUT_VIEWER("DpadOutlineMode"), buttonOutlineOptionsVerbose, @@ -593,7 +593,7 @@ void InputViewerSettingsWindow::DrawElement() { } // gInputViewer.Mod1 CVarCheckbox("Show Modifier Button 1 Layers", CVAR_INPUT_VIEWER("Mod1"), - CheckboxOptions().Color(THEME_COLOR).DefaultValue(true)); + CheckboxOptions().Color(THEME_COLOR).DefaultValue(false)); if (useIndividualOutlines && CVarGetInteger(CVAR_INPUT_VIEWER("Mod1"), 0)) { ImGui::Indent(); CVarCombobox("##Mmod1Outline", CVAR_INPUT_VIEWER("Mod1OutlineMode"), buttonOutlineOptionsVerbose, @@ -602,7 +602,7 @@ void InputViewerSettingsWindow::DrawElement() { } // gInputViewer.Mod2 CVarCheckbox("Show Modifier Button 2 Layers", CVAR_INPUT_VIEWER("Mod2"), - CheckboxOptions().Color(THEME_COLOR).DefaultValue(true)); + CheckboxOptions().Color(THEME_COLOR).DefaultValue(false)); if (useIndividualOutlines && CVarGetInteger(CVAR_INPUT_VIEWER("Mod2"), 0)) { ImGui::Indent(); CVarCombobox("##Mod2Outline", CVAR_INPUT_VIEWER("Mod2OutlineMode"), buttonOutlineOptionsVerbose, @@ -652,7 +652,7 @@ void InputViewerSettingsWindow::DrawElement() { "Right Stick Visibility", CVAR_INPUT_VIEWER("RightStick.VisibilityMode"), stickModeOptions, ComboboxOptions() .Color(THEME_COLOR) - .DefaultIndex(STICK_MODE_ALWAYS_SHOWN) + .DefaultIndex(STICK_MODE_ALWAYS_HIDDEN) .Tooltip( "Determines the conditions under which the moving layer of the right stick texture is visible.")); @@ -661,7 +661,7 @@ void InputViewerSettingsWindow::DrawElement() { "Right Stick Outline/Background Visibility", CVAR_INPUT_VIEWER("RightStick.OutlineMode"), stickModeOptions, ComboboxOptions() .Color(THEME_COLOR) - .DefaultIndex(STICK_MODE_ALWAYS_SHOWN) + .DefaultIndex(STICK_MODE_ALWAYS_HIDDEN) .Tooltip( "Determines the conditions under which the right stick outline/background texture is visible.")); diff --git a/soh/soh/Enhancements/cosmetics/authenticGfxPatches.cpp b/soh/soh/Enhancements/cosmetics/authenticGfxPatches.cpp index 477fe6f0a..b2b473166 100644 --- a/soh/soh/Enhancements/cosmetics/authenticGfxPatches.cpp +++ b/soh/soh/Enhancements/cosmetics/authenticGfxPatches.cpp @@ -281,11 +281,24 @@ void PatchIronKnuckleTextureOverflow() { } } +void PatchBoulderFragment() { + // The boulder fragment renders invisible due to the change made by https://github.com/Kenix3/libultraship/pull/721 + // Until it is known wether this change is approriate or something else should be done to it, the following patches + // adjust the render mode for the DL to not become invisible + ResourceMgr_PatchGfxByName(gBoulderFragmentsDL, "boulderFragmentRenderFix3", 3, + gsDPSetRenderMode(G_RM_FOG_SHADE_A, G_RM_AA_ZB_OPA_SURF2)); + ResourceMgr_PatchGfxByName(gBoulderFragmentsDL, "boulderFragmentRenderFix6", 6, + gsDPSetCombineMode(G_CC_MODULATEIDECALA, G_CC_MODULATEIA_PRIM2)); +} + void ApplyAuthenticGfxPatches() { + // Overflow textures PatchArrowTipTexture(); PatchDekuStickTextureOverflow(); PatchFreezardTextureOverflow(); PatchIronKnuckleTextureOverflow(); + + PatchBoulderFragment(); } // Patches the Sold Out GI DL to render the texture in the mirror boundary diff --git a/soh/soh/Enhancements/custom-message/CustomMessageManager.cpp b/soh/soh/Enhancements/custom-message/CustomMessageManager.cpp index d4c478657..278b8db0c 100644 --- a/soh/soh/Enhancements/custom-message/CustomMessageManager.cpp +++ b/soh/soh/Enhancements/custom-message/CustomMessageManager.cpp @@ -155,11 +155,12 @@ const std::string CustomMessage::GetFrench(MessageFormat format) const { } const std::string CustomMessage::GetForCurrentLanguage(MessageFormat format) const { - return GetForLanguage((gSaveContext.language == LANGUAGE_JPN) ? LANGUAGE_ENG : gSaveContext.language, format); + return GetForLanguage(((Language)gSaveContext.language == LANGUAGE_JPN) ? LANGUAGE_ENG : gSaveContext.language, + format); } const std::string CustomMessage::GetForLanguage(uint8_t language, MessageFormat format) const { - std::string output = messages[language].length() > 0 ? messages[language] : messages[LANGUAGE_ENG]; + std::string output = messages[language] != TODO_TRANSLATE ? messages[language] : messages[LANGUAGE_ENG]; ProcessMessageFormat(output, format); return output; } @@ -273,8 +274,12 @@ void CustomMessage::Replace(std::string&& oldStr, std::string&& newStr) { void CustomMessage::Replace(std::string&& oldStr, CustomMessage newMessage) { for (uint8_t language = 0; language < LANGUAGE_MAX - 1; language++) { size_t position = messages[language].find(oldStr); + std::string newMsg = newMessage.messages[language]; + if (language != LANGUAGE_ENG && newMsg == TODO_TRANSLATE) { + newMsg = newMessage.messages[LANGUAGE_ENG]; + } while (position != std::string::npos) { - messages[language].replace(position, oldStr.length(), newMessage.messages[language]); + messages[language].replace(position, oldStr.length(), newMsg); position = messages[language].find(oldStr); } } diff --git a/soh/soh/Enhancements/custom-message/CustomMessageManager.h b/soh/soh/Enhancements/custom-message/CustomMessageManager.h index 71ae423b5..f312d9f85 100644 --- a/soh/soh/Enhancements/custom-message/CustomMessageManager.h +++ b/soh/soh/Enhancements/custom-message/CustomMessageManager.h @@ -6,6 +6,7 @@ #include #include "../../../include/z64item.h" +#include "../../../include/z64.h" #include "../../../include/message_data_textbox_types.h" #include "../randomizer/3drando/text.hpp" @@ -203,7 +204,7 @@ class CustomMessage { void CleanString(std::string& str) const; private: - std::vector messages = { "", "", "" }; + std::vector messages = { "", TODO_TRANSLATE, TODO_TRANSLATE }; TextBoxType type = TEXTBOX_TYPE_BLACK; TextBoxPosition position = TEXTBOX_POS_BOTTOM; std::vector colors = {}; diff --git a/soh/soh/Enhancements/debugger/MessageViewer.cpp b/soh/soh/Enhancements/debugger/MessageViewer.cpp index fef875e94..83aac4d6c 100644 --- a/soh/soh/Enhancements/debugger/MessageViewer.cpp +++ b/soh/soh/Enhancements/debugger/MessageViewer.cpp @@ -2,6 +2,7 @@ #include "soh/SohGui/UIWidgets.hpp" #include "soh/SohGui/SohGui.hpp" +#include "soh/SohGui/SohMenu.h" #include "soh/OTRGlobals.h" #include @@ -56,22 +57,12 @@ void MessageViewer::DrawElement() { memset(mTextIdBuf, 0, sizeof(char) * MAX_STRING_SIZE); } PopStyleCheckbox(); - ImGui::Text("Language"); - ImGui::SameLine(); - PushStyleCombobox(THEME_COLOR); - if (ImGui::BeginCombo("##Language", mLanguages[mLanguage])) { - // ReSharper disable CppDFAUnreachableCode - for (size_t i = 0; i < mLanguages.size(); i++) { - if (strlen(mLanguages[i]) > 0) { - if (ImGui::Selectable(mLanguages[i], i == mLanguage)) { - mLanguage = i; - } - } - } - ImGui::EndCombo(); - } - PopStyleCombobox(); - UIWidgets::InsertHelpHoverText("Which language to load from the selected text ID"); + SohGui::SohMenu::UpdateLanguageMap(SohGui::languages); + UIWidgets::Combobox("Language", &mLanguage, SohGui::languages, + UIWidgets::ComboboxOptions() + .Color(THEME_COLOR) + .DefaultIndex(0) + .Tooltip("Which language to load from the selected text ID")); PushStyleButton(THEME_COLOR); if (ImGui::Button("Display Message##ExistingMessage")) { mDisplayExistingMessageClicked = true; @@ -196,6 +187,11 @@ void MessageDebug_StartTextBox(const char* tableId, uint16_t textId, uint8_t lan R_TEXT_CHAR_SCALE = 75; R_TEXT_LINE_SPACING = 12; R_TEXT_INIT_XPOS = 65; + if (language == LANGUAGE_JPN) { + R_TEXT_CHAR_SCALE = 88; + R_TEXT_LINE_SPACING = 18; + R_TEXT_INIT_XPOS = 65; + } char* buffer = font->msgBuf; msgCtx->textId = textId; if (strlen(tableId) == 0) { @@ -207,10 +203,8 @@ void MessageDebug_StartTextBox(const char* tableId, uint16_t textId, uint8_t lan constexpr int maxBufferSize = sizeof(font->msgBuf); const CustomMessage messageEntry = CustomMessageManager::Instance->RetrieveMessage(tableId, textId); font->charTexBuf[0] = (messageEntry.GetTextBoxType() << 4) | messageEntry.GetTextBoxPosition(); - switch (language) { - font->msgLength = - SohUtils::CopyStringToCharBuffer(buffer, messageEntry.GetForLanguage(language), maxBufferSize); - } + font->msgLength = + SohUtils::CopyStringToCharBuffer(buffer, messageEntry.GetForLanguage(language), maxBufferSize); msgCtx->msgLength = static_cast(font->msgLength); } msgCtx->textBoxProperties = font->charTexBuf[0]; diff --git a/soh/soh/Enhancements/debugger/MessageViewer.h b/soh/soh/Enhancements/debugger/MessageViewer.h index 20924a0b6..83e290114 100644 --- a/soh/soh/Enhancements/debugger/MessageViewer.h +++ b/soh/soh/Enhancements/debugger/MessageViewer.h @@ -4,7 +4,7 @@ #ifdef __cplusplus #include "GuiWindow.h" -#include +#include extern "C" { #endif /** @@ -41,7 +41,6 @@ class MessageViewer : public Ship::GuiWindow { void DisplayCustomMessage() const; static constexpr uint16_t MAX_STRING_SIZE = 1024; - static constexpr std::array mLanguages = { "English", "German", "French" }; static constexpr int HEXADECIMAL = 0; static constexpr int DECIMAL = 1; char* mTableIdBuf; @@ -49,7 +48,7 @@ class MessageViewer : public Ship::GuiWindow { char* mTextIdBuf; uint16_t mTextId; int mTextIdBase = HEXADECIMAL; - size_t mLanguage = LANGUAGE_ENG; + int32_t mLanguage = LANGUAGE_ENG; char* mCustomMessageBuf; std::string mCustomMessageString; bool mDisplayExistingMessageClicked = false; diff --git a/soh/soh/Enhancements/debugger/debugSaveEditor.cpp b/soh/soh/Enhancements/debugger/debugSaveEditor.cpp index 534201f8e..a97a41d16 100644 --- a/soh/soh/Enhancements/debugger/debugSaveEditor.cpp +++ b/soh/soh/Enhancements/debugger/debugSaveEditor.cpp @@ -849,9 +849,19 @@ void DrawFlagsTab() { DrawGroupWithBorder( [&]() { - size_t selectedGsMap = 0; + PushStyleCombobox(THEME_COLOR); + static size_t selectedGsMap = 0; ImGui::Text("Gold Skulltulas"); - Combobox("Map##Gold Skulltulas", &selectedGsMap, gsMapping, comboboxOptionsBase.Tooltip("")); + if (ImGui::BeginCombo("##GSMap", gsMapping[selectedGsMap])) { + for (size_t index = 0; index < gsMapping.size(); index++) { + if (ImGui::Selectable(gsMapping[index])) { + selectedGsMap = index; + } + } + + ImGui::EndCombo(); + } + PopStyleCombobox(); // TODO We should write out descriptions for each one... ugh ImGui::AlignTextToFramePadding(); diff --git a/soh/soh/Enhancements/enemyrandomizer.cpp b/soh/soh/Enhancements/enemyrandomizer.cpp index 611131584..84e1d040e 100644 --- a/soh/soh/Enhancements/enemyrandomizer.cpp +++ b/soh/soh/Enhancements/enemyrandomizer.cpp @@ -120,7 +120,6 @@ static EnemyEntry randomizedEnemySpawnTable[RANDOMIZED_ENEMY_SPAWN_TABLE_SIZE] = { ACTOR_EN_CROW, 0 }, // Guay { ACTOR_EN_FIREFLY, 4 }, // Ice Keese { ACTOR_EN_ST, 2 }, // Skulltula (invisible) - { ACTOR_EN_IK, 3 }, // Iron Knuckle (white, standing) { ACTOR_EN_FIREFLY, 2 }, // Regular Keese { ACTOR_EN_DEKUBABA, 1 }, // Deku Baba (large) { ACTOR_EN_RR, 0 }, // Like-Like @@ -141,6 +140,7 @@ static EnemyEntry randomizedEnemySpawnTable[RANDOMIZED_ENEMY_SPAWN_TABLE_SIZE] = { ACTOR_EN_TP, -1 }, // Electric Tailpasaran { ACTOR_EN_BW, 0 }, // Torch Slug { ACTOR_EN_WALLMAS, 1 }, // Wallmaster + { ACTOR_EN_IK, 3 }, // Iron Knuckle (white, standing) { ACTOR_EN_WF, 1 }, // Wolfos (white) { ACTOR_EN_KAREBABA, 0 }, // Withered Deku Baba @@ -318,26 +318,20 @@ extern "C" uint8_t GetRandomizedEnemy(PlayState* play, int16_t* actorId, f32* po return 1; } -std::vector selectedEnemyList; +static std::vector selectedEnemyList; void GetSelectedEnemies() { selectedEnemyList.clear(); - if (CVarGetInteger(CVAR_ENHANCEMENT("RandomizedEnemies"), ENEMY_RANDOMIZER_OFF) == ENEMY_RANDOMIZER_RANDOM) { - for (int i = 0; i < 49; i++) { - if (CVarGetInteger(CVAR_ENHANCEMENT("RandomizedEnemyList.All"), 0)) { - selectedEnemyList.push_back(randomizedEnemySpawnTable[i]); - } else if (CVarGetInteger(enemyCVarList[i], 1)) { - selectedEnemyList.push_back(randomizedEnemySpawnTable[i]); - } - } - if (selectedEnemyList.size() == 0) { - selectedEnemyList.push_back(randomizedEnemySpawnTable[0]); - } - } else { - for (int i = 0; i < 49; i++) { + for (int i = 0; i < 49; i++) { + if (CVarGetInteger(CVAR_ENHANCEMENT("RandomizedEnemyList.All"), 0)) { + selectedEnemyList.push_back(randomizedEnemySpawnTable[i]); + } else if (CVarGetInteger(enemyCVarList[i], 1)) { selectedEnemyList.push_back(randomizedEnemySpawnTable[i]); } } + if (selectedEnemyList.size() == 0) { + selectedEnemyList.push_back(randomizedEnemySpawnTable[0]); + } } EnemyEntry GetRandomizedEnemyEntry(uint32_t seed) { @@ -348,7 +342,7 @@ EnemyEntry GetRandomizedEnemyEntry(uint32_t seed) { uint32_t finalSeed = seed + (IS_RANDO ? Rando::Context::GetInstance()->GetSeed() : gSaveContext.ship.stats.fileCreatedAt); Random_Init(finalSeed); - uint32_t randomNumber = Random(0, RANDOMIZED_ENEMY_SPAWN_TABLE_SIZE); + uint32_t randomNumber = Random(0, selectedEnemyList.size()); return selectedEnemyList[randomNumber]; } else { uint32_t randomSelectedEnemy = Random(0, selectedEnemyList.size()); diff --git a/soh/soh/Enhancements/game-interactor/vanilla-behavior/GIVanillaBehavior.h b/soh/soh/Enhancements/game-interactor/vanilla-behavior/GIVanillaBehavior.h index 1c516fc6e..6c18a6edb 100644 --- a/soh/soh/Enhancements/game-interactor/vanilla-behavior/GIVanillaBehavior.h +++ b/soh/soh/Enhancements/game-interactor/vanilla-behavior/GIVanillaBehavior.h @@ -946,6 +946,14 @@ typedef enum { // - `*VBFishingData` VB_GIVE_RANDO_FISHING_PRIZE, + // #### `result` + // ```c + // false + // ``` + // #### `args` + // - '*Fishing' (&this) + VB_GIVE_RANDO_GLITCH_FISHING_PRIZE, + // #### `result` // ```c // true diff --git a/soh/soh/Enhancements/randomizer/3drando/fill.cpp b/soh/soh/Enhancements/randomizer/3drando/fill.cpp index e5e22ad1d..dcae4842c 100644 --- a/soh/soh/Enhancements/randomizer/3drando/fill.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/fill.cpp @@ -161,7 +161,7 @@ static void ValidateOtherEntrance(GetAccessibleLocationsStruct& gals) { } // If we are not shuffling the guard house, add the key so we can properly check for poe merchant access if (gals.validatedStartingRegion && gals.foundTempleOfTime && - !ctx->GetOption(RSK_SHUFFLE_INTERIOR_ENTRANCES).Is(RO_INTERIOR_ENTRANCE_SHUFFLE_ALL)) { + ctx->GetOption(RSK_SHUFFLE_INTERIOR_ENTRANCES).Is(RO_INTERIOR_ENTRANCE_SHUFFLE_OFF)) { Rando::StaticData::RetrieveItem(RG_GUARD_HOUSE_KEY).ApplyEffect(); } } @@ -213,7 +213,7 @@ void ProcessExits(Region* region, GetAccessibleLocationsStruct& gals, Randomizer // Update Time of Day Access for the exit if (UpdateToDAccess(&exit, exitRegion)) { gals.logicUpdated = true; - if (!gals.sphereZeroComplete) { + if (!gals.sphereZeroComplete || logic->AreCheckingBigPoes) { if (!gals.foundTempleOfTime || !gals.validatedStartingRegion) { ValidateOtherEntrance(gals); } @@ -622,7 +622,7 @@ void ValidateEntrances(bool checkPoeCollectorAccess, bool checkOtherEntranceAcce RegionTable(RR_ROOT)->adultDay = true; } else if (checkPoeCollectorAccess) { // If we are not shuffling the guard house, add the key so we can properly check for poe merchant access - if (!ctx->GetOption(RSK_SHUFFLE_INTERIOR_ENTRANCES).Is(RO_INTERIOR_ENTRANCE_SHUFFLE_ALL)) { + if (ctx->GetOption(RSK_SHUFFLE_INTERIOR_ENTRANCES).Is(RO_INTERIOR_ENTRANCE_SHUFFLE_OFF)) { Rando::StaticData::RetrieveItem(RG_GUARD_HOUSE_KEY).ApplyEffect(); } } else { diff --git a/soh/soh/Enhancements/randomizer/3drando/hint_list.cpp b/soh/soh/Enhancements/randomizer/3drando/hint_list.cpp index 12af0775d..895a11e0e 100644 --- a/soh/soh/Enhancements/randomizer/3drando/hint_list.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/hint_list.cpp @@ -1458,257 +1458,257 @@ void StaticData::HintTable_Init() { ---------------------------*/ hintTextTable[RHT_JUNK01] = HintText(CustomMessage("They say you must read the names of \"Special Deal\" shop items carefully.", - /*german*/ "", + /*german*/ TODO_TRANSLATE, /*french*/ "Selon moi, les \"Offres spéciales\" sont parfois trompeuses... Lisez les attentivement!")); hintTextTable[RHT_JUNK02] = HintText(CustomMessage("They say that Zelda is a poor leader.", - /*german*/ "", + /*german*/ TODO_TRANSLATE, /*french*/ "Selon moi, Zelda ne ferait pas un bon monarque.")); hintTextTable[RHT_JUNK03] = HintText(CustomMessage("These hints can be quite useful. This is an exception.", - /*german*/ "", + /*german*/ TODO_TRANSLATE, /*french*/ "Ces indices sont très utiles, à l'exception de celui-ci.")); hintTextTable[RHT_JUNK04] = HintText(CustomMessage("They say that the Lizalfos in Dodongo's Cavern like to play in lava.", - /*german*/ "", + /*german*/ TODO_TRANSLATE, /*french*/ "Selon moi, les Lézalfos de la Caverne Dodongo aiment patauger dans la lave.")); hintTextTable[RHT_JUNK05] = HintText(CustomMessage("They say that all the Zora drowned in Wind Waker.", - /*german*/ "", + /*german*/ TODO_TRANSLATE, /*french*/ "Selon moi, les Zoras se sont noyés dans Wind Waker.")); hintTextTable[RHT_JUNK06] = HintText(CustomMessage("If Gorons eat rocks, does that mean I'm in danger?", - /*german*/ "", + /*german*/ TODO_TRANSLATE, /*french*/ "Ne dis pas au Gorons que je suis ici. Ils mangent des roches, tu sais!")); hintTextTable[RHT_JUNK07] = HintText(CustomMessage("'Member when Ganon was a blue pig?^I 'member.", - /*german*/ "", + /*german*/ TODO_TRANSLATE, /*french*/ "Dans mon temps, Ganon était un cochon bleu...^Pff! Les jeunes de nos jours, et leur Ganondorf!")); hintTextTable[RHT_JUNK08] = HintText(CustomMessage("One who does not have Triforce can't go in.", - /*german*/ "", + /*german*/ TODO_TRANSLATE, /*french*/ "Ceux sans Triforce doivent rebrousser chemin.")); hintTextTable[RHT_JUNK09] = HintText(CustomMessage("Save your future, end the Happy Mask Salesman.", - /*german*/ "", + /*german*/ TODO_TRANSLATE, /*french*/ "Selon moi, tu t'éviteras des jours de malheur si tu vaincs le vendeur de masques...")); hintTextTable[RHT_JUNK10] = HintText(CustomMessage("Glitches are a pathway to many abilities some consider to be... Unnatural.", - /*german*/ "", + /*german*/ TODO_TRANSLATE, /*french*/ "Les glitchs sont un moyen d'acquérir de nombreuses facultés considérées par certains comme... contraire ")); hintTextTable[RHT_JUNK11] = HintText(CustomMessage("I'm stoned. Get it?", - /*german*/ "", + /*german*/ TODO_TRANSLATE, /*french*/ "Allez, roche, papier, ciseau...&Roche.")); hintTextTable[RHT_JUNK12] = HintText(CustomMessage("Hoot! Hoot! Would you like me to repeat that?", - /*german*/ "", + /*german*/ TODO_TRANSLATE, /*french*/ "Hou hou! Veux-tu que je répète tout ça?")); hintTextTable[RHT_JUNK13] = HintText(CustomMessage("Gorons are stupid. They eat rocks.", - /*german*/ "", + /*german*/ TODO_TRANSLATE, /*french*/ "Les Gorons sont des vraies têtes dures.")); hintTextTable[RHT_JUNK14] = HintText(CustomMessage("They say that Lon Lon Ranch prospered under Ingo.", - /*german*/ "", + /*german*/ TODO_TRANSLATE, /*french*/ "Selon moi, le Ranch Lon Lon était plus prospère sous Ingo.")); hintTextTable[RHT_JUNK15] = HintText(CustomMessage("They say without the Lens of Truth, the Treasure Chest Mini-Game is a 1 out of 32 chance.^Good luck!", - /*german*/ "", + /*german*/ TODO_TRANSLATE, /*french*/ "Gagner la Chasse-aux-Trésors est 1 chance sur 32.^Bonne chance!")); hintTextTable[RHT_JUNK16] = HintText(CustomMessage("Use bombs wisely.", - /*german*/ "", + /*german*/ TODO_TRANSLATE, /*french*/ "Utilise les bombes avec précaution.")); hintTextTable[RHT_JUNK17] = HintText(CustomMessage("They say that players who select the \"ON\" option for \"MOTION CONTROL\" are the real \"Zelda players!\"", - /*german*/ "", + /*german*/ TODO_TRANSLATE, /*french*/ "Selon moi, ceux qui utilisent les contrôles gyroscopiques sont les VRAIS joueurs.")); hintTextTable[RHT_JUNK18] = HintText(CustomMessage("L2P @.", - /*german*/ "", + /*german*/ TODO_TRANSLATE, /*french*/ "Arrête de lire les indices et joue comme un grand, @.")); hintTextTable[RHT_JUNK19] = HintText(CustomMessage("I bet you'd like to have more bombs.", - /*german*/ "", + /*german*/ TODO_TRANSLATE, /*french*/ "Je parie que tu veux plus de bombes.")); hintTextTable[RHT_JUNK20] = HintText(CustomMessage("When all else fails, use Fire.", - /*german*/ "", + /*german*/ TODO_TRANSLATE, /*french*/ "Quand rien ne marche, utilise le feu.")); hintTextTable[RHT_JUNK21] = HintText(CustomMessage("Here's a hint, @. Don't be bad.", - /*german*/ "", + /*german*/ TODO_TRANSLATE, /*french*/ "Selon moi, la #Triforce# n'est pas dans le jeu... Duh!")); hintTextTable[RHT_JUNK22] = HintText(CustomMessage("Game Over. Return of Ganon.", - /*german*/ "", + /*german*/ TODO_TRANSLATE, /*french*/ "Partie terminée. RETour de Ganon.")); hintTextTable[RHT_JUNK23] = HintText(CustomMessage("May the way of the Hero lead to the Triforce.", - /*german*/ "", + /*german*/ TODO_TRANSLATE, /*french*/ "Que le chemin du héros te mène à la Triforce.")); hintTextTable[RHT_JUNK24] = HintText(CustomMessage("Can't find an item? Scan an Amiibo.", - /*german*/ "", + /*german*/ TODO_TRANSLATE, /*french*/ "Tu cherches de quoi? Utilise un Amiibo!")); hintTextTable[RHT_JUNK25] = HintText(CustomMessage("They say this game has just a few glitches.", - /*german*/ "", + /*german*/ TODO_TRANSLATE, /*french*/ "Selon moi, ce jeu est complètement exempt de glitchs.")); hintTextTable[RHT_JUNK26] = HintText(CustomMessage("BRRING BRRING This is Ulrira. Wrong number?", - /*german*/ "", + /*german*/ TODO_TRANSLATE, /*french*/ "DRING DRING!! Pépé le Ramollo à l'appareil... Quoi? Faux numéro?")); hintTextTable[RHT_JUNK27] = HintText(CustomMessage("Tingle Tingle Kooloo Limpah!", - /*german*/ "", + /*german*/ TODO_TRANSLATE, /*french*/ "Tingle! Tingle! Kooloolin... Pah!")); hintTextTable[RHT_JUNK28] = HintText(CustomMessage("L is real 2401", - /*german*/ "", + /*german*/ TODO_TRANSLATE, /*french*/ "L is real 2401")); hintTextTable[RHT_JUNK29] = HintText(CustomMessage("They say that Ganondorf will appear in the next Mario Tennis.", - /*german*/ "", + /*german*/ TODO_TRANSLATE, /*french*/ "Selon moi, Ganondorf sera la nouvelle recrue dans Mario Tennis.")); hintTextTable[RHT_JUNK30] = HintText(CustomMessage("They say Medigoron sells the earliest Breath of the Wild demo.", - /*german*/ "", + /*german*/ TODO_TRANSLATE, /*french*/ "Selon moi, Medigoron vend une démo de #Breath of the Wild#.")); hintTextTable[RHT_JUNK31] = HintText(CustomMessage("Can you move me? I don't get great service here.", - /*german*/ "", + /*german*/ TODO_TRANSLATE, /*french*/ "Peux-tu me déplacer? J'ai pas une bonne réception ici.")); hintTextTable[RHT_JUNK32] = HintText(CustomMessage("They say if you use Strength on the truck, you can find Mew.", - /*german*/ "", + /*german*/ TODO_TRANSLATE, /*french*/ "Selon moi, #Mew# se trouve dessous le camion... Duh!")); hintTextTable[RHT_JUNK33] = HintText(CustomMessage("I'm a helpful hint Gossip Stone!^See, I'm helping.", - /*german*/ "", + /*german*/ TODO_TRANSLATE, /*french*/ "Salut! Je suis une pierre de bons conseils!^Tiens, tu vois? J'aide bien, hein?")); hintTextTable[RHT_JUNK34] = HintText(CustomMessage("Dear @, please come to the castle. I've baked a cake for you.&Yours truly, Princess Zelda.", - /*german*/ "", + /*german*/ TODO_TRANSLATE, /*french*/ "Mon très cher @:&Viens vite au château, je t'ai préparé&un délicieux gâteau...^À bientôt, Princesse Zelda")); hintTextTable[RHT_JUNK35] = HintText(CustomMessage("They say all toasters toast toast.", - /*german*/ "", + /*german*/ TODO_TRANSLATE, /*french*/ "Selon moi, les grille-pains grillent du pain.")); hintTextTable[RHT_JUNK36] = HintText(CustomMessage("You thought it would be a useful hint, but it was me, junk hint!", - /*german*/ "", + /*german*/ TODO_TRANSLATE, /*french*/ "Tu t'attendais à un bon indice... Mais c'était moi, un mauvais indice!")); hintTextTable[RHT_JUNK37] = HintText(CustomMessage("They say that quest guidance can be found at a talking rock.", - /*german*/ "", + /*german*/ TODO_TRANSLATE, /*french*/ "Selon moi, des #indices# se trouvent auprès d'une pierre parlante... Duh!")); hintTextTable[RHT_JUNK38] = HintText(CustomMessage("They say that the final item you're looking for can be found somewhere in Hyrule.", - /*german*/ "", + /*german*/ TODO_TRANSLATE, /*french*/ "Selon moi, le #dernier objet# se trouve quelque part dans Hyrule... Duh!")); hintTextTable[RHT_JUNK39] = HintText(CustomMessage("Mweep.^Mweep.^Mweep.^Mweep.^Mweep.^Mweep.^Mweep.^Mweep.^Mweep.^Mweep.^Mweep.^Mweep.", - /*german*/ "", + /*german*/ TODO_TRANSLATE, /*french*/ "Mwip.^Mwip.^Mwip.^Mwip.^Mwip.^Mwip.^Mwip.^Mwip.^Mwip.^Mwip.^Mwip.^Mwip.")); hintTextTable[RHT_JUNK40] = HintText(CustomMessage("They say that Barinade fears Deku Nuts.", - /*german*/ "", + /*german*/ TODO_TRANSLATE, /*french*/ "Selon moi, Barinade a la frousse des noix Mojo.")); hintTextTable[RHT_JUNK41] = HintText(CustomMessage("They say that Flare Dancers do not fear Goron-crafted blades.", - /*german*/ "", + /*german*/ TODO_TRANSLATE, /*french*/ "Selon moi, le danse-flamme n'a pas peur des armes de Goron.")); hintTextTable[RHT_JUNK42] = HintText(CustomMessage("They say that Morpha is easily trapped in a corner.", - /*german*/ "", + /*german*/ TODO_TRANSLATE, /*french*/ "Selon moi, Morpha est facilement coincé.")); hintTextTable[RHT_JUNK43] = HintText(CustomMessage("They say that Bongo Bongo really hates the cold.", - /*german*/ "", + /*german*/ TODO_TRANSLATE, /*french*/ "Selon moi, Bongo Bongo a facilement froid aux doigts.")); hintTextTable[RHT_JUNK44] = HintText(CustomMessage("They say that your sword is most powerful when you put it away.", - /*german*/ "", + /*german*/ TODO_TRANSLATE, /*french*/ "Selon moi, ton épée est à pleine puissance quand tu la rengaines.")); hintTextTable[RHT_JUNK45] = HintText(CustomMessage("They say that bombing the hole Volvagia last flew into can be rewarding.", - /*german*/ "", + /*german*/ TODO_TRANSLATE, /*french*/ "Selon moi, le trou où se creuse Volvagia est vulnérable aux bombes.")); hintTextTable[RHT_JUNK46] = HintText(CustomMessage("They say that invisible ghosts can be exposed with Deku Nuts.", - /*german*/ "", + /*german*/ TODO_TRANSLATE, /*french*/ "Selon moi, des fantômes invisibles apparaissent avec des noix Mojo.")); hintTextTable[RHT_JUNK47] = HintText(CustomMessage("They say that the real Phantom Ganon is bright and loud.", - /*german*/ "", + /*german*/ TODO_TRANSLATE, /*french*/ "Selon moi, le vrai spectre de Ganon est clair et bruyant.")); hintTextTable[RHT_JUNK48] = HintText(CustomMessage("They say that walking backwards is very fast.", - /*german*/ "", + /*german*/ TODO_TRANSLATE, /*french*/ "Selon moi, tu fais marche arrière très rapidement pour un héros.")); hintTextTable[RHT_JUNK49] = HintText(CustomMessage("They say Ingo is not very good at planning ahead.", - /*german*/ "", + /*german*/ TODO_TRANSLATE, /*french*/ "Selon moi, Ingo ne fait pas un très bon geôlier.")); hintTextTable[RHT_JUNK50] = HintText(CustomMessage("You found a spiritual Stone! By which I mean, I worship Nayru.", - /*german*/ "", + /*german*/ TODO_TRANSLATE, /*french*/ "Vous avez trouvé une Pierre Ancestrale! En effet, je vénère la déesse Hylia.")); hintTextTable[RHT_JUNK51] = HintText(CustomMessage("Open your eyes.^Open your eyes.^Wake up, @.", - /*german*/ "", + /*german*/ TODO_TRANSLATE, /*french*/ "Réveille-toi...^Réveille-toi.^Ouvre les yeux, @.")); hintTextTable[RHT_JUNK52] = HintText(CustomMessage("They say that the Nocturne of Shadow can bring you very close to Ganon.", - /*german*/ "", - /*french*/ "Selon moi, le nocturne de l'ombre peut t'amener très près de Ganon.")); + /*german*/ TODO_TRANSLATE, + /*french*/ "Selon moi, le Nocturne de l'Ombre peut t'amener très près de Ganon.")); hintTextTable[RHT_JUNK53] = HintText(CustomMessage("They say that Twinrova always casts the same spell the first three times.", - /*german*/ "", - /*french*/ "Selon moi, Twinrova lance toujours les mêmes trois premiers sorts.")); + /*german*/ TODO_TRANSLATE, + /*french*/ "Selon moi, le Duo Maléfique lance toujours les mêmes trois premiers sorts.")); hintTextTable[RHT_JUNK54] = HintText(CustomMessage("They say that the nightly builds may be unstable.", - /*german*/ "", + /*german*/ TODO_TRANSLATE, /*french*/ "Selon moi, les \"nightly builds\" peuvent être instables.")); hintTextTable[RHT_JUNK55] = HintText(CustomMessage("You're playing a Randomizer. I'm randomized!^Here's a random number: #4#.&Enjoy your Randomizer!", - /*german*/ "", + /*german*/ TODO_TRANSLATE, /*french*/ "Tu joues à un randomizer. Je suis aléatoire!^Voici un nombre aléatoire: #4#.&Bonne partie!")); hintTextTable[RHT_JUNK56] = HintText(CustomMessage("They say Ganondorf's bolts can be reflected with glass or steel.", - /*german*/ "", + /*german*/ TODO_TRANSLATE, /*french*/ "Selon moi, les éclairs de Ganon se reflètent sur l'acier et le verre.")); hintTextTable[RHT_JUNK57] = HintText(CustomMessage("They say Ganon's tail is vulnerable to nuts, arrows, swords, explosives, hammers...^...sticks, seeds, " "boomerangs...^...rods, shovels, iron balls, angry bees...", - /*german*/ "", + /*german*/ TODO_TRANSLATE, /*french*/ "Selon moi, la queue de Ganon est vulnérable aux noix, flèches, épées, bombes, marteaux...^...bâtons, " "graines, boomerangs...^...baguettes, pelles, boulets de fer, abeilles enragées...")); hintTextTable[RHT_JUNK58] = HintText(CustomMessage("They say that you're wasting time reading this hint, but I disagree. Talk to me again!", - /*german*/ "", + /*german*/ TODO_TRANSLATE, /*french*/ "Selon moi... tu sais quoi? Parle-moi encore, et je te le dirai!")); hintTextTable[RHT_JUNK59] = HintText(CustomMessage("They say Ganondorf knows where to find the instrument of his doom.", - /*german*/ "", + /*german*/ TODO_TRANSLATE, /*french*/ "Selon moi, Ganondorf sait où il a caché son point faible.")); hintTextTable[RHT_JUNK60] = HintText(CustomMessage("I heard @ is pretty good at Zelda.", - /*german*/ "", + /*german*/ TODO_TRANSLATE, /*french*/ "Apparemment, @ est super bon à Zelda.")); hintTextTable[RHT_JUNK61] = HintText(CustomMessage("Hi @, we've been trying to reach you about your car's extended warranty. ", - /*german*/ "", + /*german*/ TODO_TRANSLATE, /*french*/ "Bonjour, @. Vous avez une voiture? Vous savez, nous offrons des assurances abordables...")); hintTextTable[RHT_JUNK62] = HintText(CustomMessage("They say that it's actually possible to beat the running man.", - /*german*/ "", + /*german*/ TODO_TRANSLATE, /*french*/ "Selon moi, il est possible de battre le coureur.&Donc, tu prends ton arc, et...")); hintTextTable[RHT_JUNK63] = HintText(CustomMessage("They say this hint makes more sense in other languages.", - /*german*/ "", + /*german*/ TODO_TRANSLATE, /*french*/ "Selon moi, ces indices auraient pu être mieux traduits... Duh!")); // ^ Junk hints above are from 3drando @@ -1721,36 +1721,36 @@ void StaticData::HintTable_Init() { "Erreur 0x69a504:&Traduction manquante^C'est de la faute à Purple Hato!&J'vous jure!" hintTextTable[RHT_JUNK64] = HintText(CustomMessage("They say Greg is special.", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); + /*german*/ TODO_TRANSLATE, + /*french*/ "Selon moi, Greg est spécial.")); hintTextTable[RHT_JUNK65] = HintText(CustomMessage("They say the longer the Goron's neck, the wiser they are.", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); + /*german*/ TODO_TRANSLATE, + /*french*/ "Selon moi, plus le cou des Gorons est long, plus ils sont sage." )); hintTextTable[RHT_JUNK66] = HintText(CustomMessage("They say this ship is what all true gamers strive for.", - /*german*/ "", + /*german*/ TODO_TRANSLATE, /*french*/ "Selon moi, cette version du port est ce pour quoi luttent tous les vrais gamers.")); hintTextTable[RHT_JUNK67] = HintText(CustomMessage("They say that Glowsticks can be found in the Raveyard.", - /*german*/ "", - /*french*/ "On peut trouver des Bâtons Lumineux sur le dancefloor du cimetière.")); + /*german*/ TODO_TRANSLATE, + /*french*/ "Selon moi, on peut trouver des Bâtons Lumineux sur le dancefloor du cimetière.")); hintTextTable[RHT_JUNK68] = HintText(CustomMessage("They say @'s uncle works for Nintendo.", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); + /*german*/ TODO_TRANSLATE, + /*french*/ "Selon moi, l'oncle de @ travaille chez Nintendo.")); hintTextTable[RHT_JUNK69] = HintText(CustomMessage("They say pulling all gravestones in the graveyard leads to something magical.", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); + /*german*/ TODO_TRANSLATE, + /*french*/ "Selon moi, tirer toutes les tombes du Cimetière déclanche un truc magique.")); hintTextTable[RHT_JUNK70] = HintText(CustomMessage("They say holding L while pausing makes you win the game.", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); + /*german*/ TODO_TRANSLATE, + /*french*/ "Selon moi, maintenir L pendant que vous appuyez sur START vous permet de terminer le jeu.")); hintTextTable[RHT_JUNK71] = HintText(CustomMessage("They say @'s body is ready.", - /*german*/ "", - /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); + /*german*/ TODO_TRANSLATE, + /*french*/ "Selon moi, ce junk hint ne se traduirait pas bien en français.")); /*-------------------------- | DUNGEON HINT TEXT | @@ -2214,27 +2214,27 @@ void StaticData::HintTable_Init() { ---------------------------*/ hintTextTable[RHT_GANONDORF_HINT_LA_ONLY] = HintText(CustomMessage("Ha ha ha... You'll never beat me by reflecting my lightning bolts and unleashing the arrows from #[[1]]#!", - /*german*/ "", + /*german*/ TODO_TRANSLATE, /*french*/ "Ha ha ha... Pauvre fou! Tu ne pourras jamais me vaincre sans les flèches que j'ai cachées dans #[[1]]#!", {QM_RED})); // /*spanish*/Ja, ja, ja... Nunca me derrotarás reflejando mis esferas de energía y desplegando la flecha de luz de #[[1]]#! hintTextTable[RHT_GANONDORF_HINT_MS_ONLY] = HintText(CustomMessage("Ha ha ha... You'll never defeat me, drop a castle on me and finish me off with the sacred blade from #[[2]]#!", - /*german*/ "", - /*french*/ "", + /*german*/ TODO_TRANSLATE, + /*french*/ "Ha ha ha... Pauvre fou! Tu ne pourras jamais me vaincre sans l'Épée de Légende cachée dans #[[2]]#!", {QM_RED})); hintTextTable[RHT_GANONDORF_HINT_LA_AND_MS] = HintText(CustomMessage("Ha ha ha... You'll never beat me by reflecting my lightning bolts and unleashing the arrows from #[[1]]#!" "^And even if you do, you'll never find the legendary blade hidden in #[[2]]#!", - /*german*/ "", + /*german*/ TODO_TRANSLATE, /*french*/ "Ha ha ha... Pauvre fou! Tu ne pourras jamais me vaincre sans les flèches que j'ai cachées dans #[[1]]#!" - "^Et même si tu les trouves, tu ne touveras jamais l'épée de légende cachée dans #[[2]]#!", + "^Et même si tu les trouves, tu ne touveras jamais l'Épée de Légende cachée dans #[[2]]#!", {QM_RED, QM_RED})); // /*spanish*/Ja, ja, ja... Nunca me derrotarás reflejando mis esferas de energía y desplegando la flecha de luz de #[[1]]#! // ^E incluso si lo haces, nunca encontrarás la espada legendaria escondida en #[[2]]#! hintTextTable[RHT_SHEIK_HINT_LA_ONLY] = HintText(CustomMessage("I overheard Ganondorf say that he misplaced the #Light Arrows# in #[[1]]#.", - /*german*/ "", + /*german*/ TODO_TRANSLATE, /*french*/ "J'ai entendu dire que Ganondorf aurait caché les #Flèches de Lumière# dans #[[1]]#.", {QM_YELLOW, QM_RED})); @@ -2244,17 +2244,17 @@ void StaticData::HintTable_Init() { {QM_RED, QM_RED})); hintTextTable[RHT_GREG_HINT] = HintText(CustomMessage("By the way, if you're interested, I saw the shiniest #Green Rupee# somewhere in #[[1]]#.^It's said to have #mysterious powers#...^But then, it could just be another regular rupee.&Oh well.", - /*german*/ "", + /*german*/ TODO_TRANSLATE, /*french*/ "Au fait, si ça t'intéresse, j'ai aperçu le plus éclatant des #Rubis Verts# quelque part à #[[1]]#. On dit qu'il possède des pouvoirs mystérieux... Mais bon, ça pourrait juste être un autre rubis ordinaire.",//RANDOTODO color in mysterious powers {QM_GREEN, QM_RED, QM_RED})); hintTextTable[RHT_SARIA_TALK_HINT] = HintText(CustomMessage("Did you feel the #surge of magic# recently? A mysterious bird told me it came from #[[1]]#.^You should check that place out, @!", - /*german*/ "", + /*german*/ TODO_TRANSLATE, /*french*/ "As-tu récemment ressenti une vague de #puissance magique#? Un mystérieux hibou m'a dit qu'elle provenait du #[[1]]#. Tu devrais aller y jeter un coup d'oeil, @!", {QM_GREEN, QM_RED})); hintTextTable[RHT_SARIA_SONG_HINT] = HintText(CustomMessage("Did you feel the #surge of magic# recently? A mysterious bird told me it came from #[[1]]#.^You should check that place out, @!\x0B", - /*german*/ "", + /*german*/ TODO_TRANSLATE, /*french*/ "As-tu récemment ressenti une vague de #puissance magique#? Un mystérieux hibou m'a dit qu'elle provenait du #[[1]]#. Tu devrais aller y jeter un coup d'oeil, @!\x0B", {QM_GREEN, QM_RED}, {}, TEXTBOX_TYPE_BLUE)); @@ -2339,33 +2339,33 @@ void StaticData::HintTable_Init() { ---------------------------*/ hintTextTable[RHT_GANON_JOKE01] = HintText(CustomMessage("Oh! It's @.&I was expecting someone called Sheik.&Do you know what happened to them?", - /*german*/ "", + /*german*/ TODO_TRANSLATE, /*french*/ "Ah, c'est @.&J'attendais un certain Sheik.&Tu sais ce qui lui est arrivé?")); // /*spanish*/¡Oh! Pero si es @.&Estaba esperando a alguien llamado Sheik. ¿Sabes qué puede haberle pasado? hintTextTable[RHT_GANON_JOKE02] = HintText(CustomMessage("I knew I shouldn't have put the key on the other side of my door.", - /*german*/ "", + /*german*/ TODO_TRANSLATE, /*french*/ "J'aurais dû garder la clé ici. Hélas...")); // /*spanish*/Sabía que no tendría que haber dejado la llave al otro lado de la puerta. hintTextTable[RHT_GANON_JOKE03] = HintText(CustomMessage("Looks like it's time for a round of tennis.", - /*german*/ "", + /*german*/ TODO_TRANSLATE, /*french*/ "C'est l'heure de jouer au tennis.")); // /*spanish*/Parece que es hora de una pachanga de tenis. hintTextTable[RHT_GANON_JOKE04] = HintText(CustomMessage("You'll never deflect my bolts of energy with your sword, then shoot me with those Light Arrows you happen to have.", - /*german*/ "", + /*german*/ TODO_TRANSLATE, /*french*/ "Ne perds pas ton temps à frapper mes éclairs d'énergie avec ton épée et me tirer avec tes flèches de Lumière!")); // /*spanish*/Nunca reflejarás mis esferas de energía con tu espada, para después dispararme con las flechas de luz que tendrás. hintTextTable[RHT_GANON_JOKE05] = HintText(CustomMessage("Why did I leave my trident back in the desert?", - /*german*/ "", + /*german*/ TODO_TRANSLATE, /*french*/ "Sale bêtise... Et j'ai oublié mon trident dans le désert!")); // /*spanish*/Santa Hylia... ¿Por qué me habré dejado el tridente en el desierto? hintTextTable[RHT_GANON_JOKE06] = HintText(CustomMessage("Zelda is probably going to do something stupid, like send you back to your own timeline.^So this is " "quite meaningless. Do you really want to save this moron?", - /*german*/ "", + /*german*/ TODO_TRANSLATE, /*french*/ "Même si je suis vaincu... Zelda te renverra dans ton ère, et je reviendrai conquérir!^Telle est la " "prophécie d'Hyrule Historia!")); // /*spanish*/Seguro que Zelda trata de hacer alguna tontería, como enviarte de vuelta a tu línea temporal.^No tiene @@ -2373,30 +2373,30 @@ void StaticData::HintTable_Init() { hintTextTable[RHT_GANON_JOKE07] = HintText(CustomMessage("What about Zelda makes you think&she'd be a better ruler than I?^I saved Lon Lon Ranch,&fed the " "hungry,&and my castle floats.", - /*german*/ "", + /*german*/ TODO_TRANSLATE, /*french*/ "Zelda ne sera jamais un meilleur monarque que moi!^J'ai un château volant, mes sujets sont des belles " "amazones... et mes Moblins sont clairement plus puissants que jamais!")); // /*spanish*/¿Qué te hace pensar que Zelda gobierna mejor que yo?^Yo he salvado el Rancho Lon Lon,&he alimentado a // los hambrientos&y hasta hago que mi castillo flote. hintTextTable[RHT_GANON_JOKE08] = HintText(CustomMessage("I've learned this spell,&it's really neat,&I'll keep it later&for your treat!", - /*german*/ "", + /*german*/ TODO_TRANSLATE, /*french*/ "Gamin, ton destin achève,&sous mon sort tu périras!&Cette partie ne fut pas brève,&et cette mort, tu subiras!")); // /*spanish*/Veamos ahora que harás,&la batalla ha de comenzar,&te enviaré de una vez al más allá,&¿listo para // afrontar la verdad? hintTextTable[RHT_GANON_JOKE09] = HintText(CustomMessage("Many tricks are up my sleeve,&to save yourself&you'd better leave!", - /*german*/ "", + /*german*/ TODO_TRANSLATE, /*french*/ "Sale petit garnement,&tu fais erreur!&C'est maintenant que marque&ta dernière heure!")); // /*spanish*/¿No osarás a mí enfrentarte?&Rimas aparte,&¡voy a matarte! hintTextTable[RHT_GANON_JOKE10] = HintText(CustomMessage("After what you did to Koholint Island, how can you call me the bad guy?", - /*german*/ "", + /*german*/ TODO_TRANSLATE, /*french*/ "J'admire ce que tu as fait à l'Île Koholint... Toi et moi, nous devrions faire équipe!")); // /*spanish*/Después de lo que le hiciste a la Isla Koholint, ¿cómo te atreves a llamarme malvado? hintTextTable[RHT_GANON_JOKE11] = HintText(CustomMessage("Today, let's begin down&'The Hero is Defeated' timeline.", - /*german*/ "", + /*german*/ TODO_TRANSLATE, /*french*/ "Si tu me vaincs, Hyrule sera englouti... mais si tu meurs, on aura A Link to the Past, le meilleur opus " "de la série!")); // /*spanish*/Hoy daremos lugar a la línea temporal del Héroe Derrotado.&¡Prepárate para el culmen de esta saga! diff --git a/soh/soh/Enhancements/randomizer/3drando/hint_list/hint_list_exclude_dungeon.cpp b/soh/soh/Enhancements/randomizer/3drando/hint_list/hint_list_exclude_dungeon.cpp index 5bd4e9e65..066bde6e9 100644 --- a/soh/soh/Enhancements/randomizer/3drando/hint_list/hint_list_exclude_dungeon.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/hint_list/hint_list_exclude_dungeon.cpp @@ -124,11 +124,11 @@ void StaticData::HintTable_Init_Exclude_Dungeon() { /*french*/ "Selon moi, un #coeur dans l'Arbre Mojo# cache #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_DEKU_TREE_GRASS] = HintText(CustomMessage("They say that some #grass in the Deku Tree# hides #[[1]]#.", - /*german*/ "", - /*french*/ "", {QM_RED, QM_GREEN})); + /*german*/ "Man erzählt sich, daß etwas #Gras im Deku-Baum# #[[1]]# verstecke.", + /*french*/ "Selon moi, de l'#herbe dans l'Arbre Mojo# cache #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_CRATE_DEKU_TREE] = HintText(CustomMessage("They say that a #crate in the Deku Tree# contains #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß eine #Kiste im Deku-Baum# #[[1]]# enthielte.", /*french*/ "Selon moi, une #caisse dans l'Arbre Mojo# contient #[[1]]#.", {QM_RED, QM_GREEN})); /*-------------------------- @@ -303,14 +303,14 @@ void StaticData::HintTable_Init_Exclude_Dungeon() { hintTextTable[RHT_DODONGOS_CAVERN_GOSSIP_STONE_FAIRY_BIG] = HintText(CustomMessage("They say that #playing a stormy tune for an odd stone in Dodongo's Cavern# reveals #[[1]]#.", /*german*/ "Man erzählt sich, daß das #Spielen einer stürmischen Melodie für einen seltsamen Stein in Dodongos Höhle# #[[1]]# enthülle.", - /*french*/ "Selon moi, #jouer un air orageux pour une pierre étrange dans la Caverne Dodongo# révèle #[[1]]#.", {QM_RED, QM_GREEN})); + /*french*/ "Selon moi, #jouer une mélodie orageuse pour une pierre étrange dans la Caverne Dodongo# révèle #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_DODONGOS_CAVERN_GRASS] = HintText(CustomMessage("They say that some #grass in Dodongo's Cavern# hides #[[1]]#.", - /*german*/ "!!!", - /*french*/ "", {QM_RED, QM_GREEN})); - + /*german*/ "Man erzählt sich, daß etwas #Gras in Dodongos Höhle# #[[1]]# verstecke.", + /*french*/ "Selon moi, de l'#herbe dans la Caverne Dodongo# cache #[[1]]#.", {QM_RED, QM_GREEN})); + hintTextTable[RHT_CRATE_DODONGOS_CAVERN] = HintText(CustomMessage("They say that a #crate in Dodongo's Cavern# contains #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß eine #Kiste in Dodongos Höhle# #[[1]]# enthielte.", /*french*/ "Selon moi, une #caisse dans la Caverne Dodongo# contient #[[1]]#.", {QM_RED, QM_GREEN})); /*-------------------------- @@ -473,11 +473,11 @@ void StaticData::HintTable_Init_Exclude_Dungeon() { /*french*/ "Selon moi, près d'un #ascenceur central dans le Ventre de Jabu-Jabu# se trouve #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_JABU_JABUS_BELLY_GRASS] = HintText(CustomMessage("They say that some #grass in Jabu Jabu's Belly# hides #[[1]]#.", - /*german*/ "", - /*french*/ "", {QM_RED, QM_GREEN})); + /*german*/ "Man erzählt sich, daß etwas #Gras in Jabu-Jabus Bauch# #[[1]]# verstecke.", + /*french*/ "Selon moi, de l'#herbe dans le Ventre de Jabu-Jabu# cache #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_CRATE_JABU_JABU] = HintText(CustomMessage("They say that a #crate in Jabu Jabu's Belly# contains #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß eine #Kiste in Jabu-Jabus Bauch# #[[1]]# enthielte.", /*french*/ "Selon moi, une #caisse dans le Ventre de Jabu-Jabu# contient #[[1]]#.", {QM_RED, QM_GREEN})); /*-------------------------- @@ -706,12 +706,12 @@ void StaticData::HintTable_Init_Exclude_Dungeon() { /*german*/ "Man erzählt sich, daß eine #Vase im Waldtempel# #[[1]]# enthielte.", /*french*/ "Selon moi, une #jarre dans le Temple de la Fôret# contient #[[1]]#.", {QM_RED, QM_GREEN})); - hintTextTable[RHT_FOREST_TEMPLE_HEART] = HintText(CustomMessage("They say that a #heart in the Forest Temple# hides #[[1]]#.", - /*german*/ "Man erzählt sich, daß ein #Herz im Waldtempel# #[[1]]# verstecke.", - /*french*/ "Selon moi, un #coeur dans le Temple de la Fôret# cache #[[1]]#.", {QM_RED, QM_GREEN})); + hintTextTable[RHT_FOREST_TEMPLE_HEART] = HintText(CustomMessage("They say that a #heart in the Forest Temple# hides #[[1]]#.", + /*german*/ "Man erzählt sich, daß ein #Herz im Waldtempel# #[[1]]# verstecke.", + /*french*/ "Selon moi, un #coeur dans le Temple de la Fôret# cache #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_CRATE_FOREST_TEMPLE] = HintText(CustomMessage("They say that a #crate in Forest Temple# contains #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß eine #Kiste im Waldtempel# #[[1]]# enthielte.", /*french*/ "Selon moi, une #caisse dans le Temple de la Fôret# contient #[[1]]#.", {QM_RED, QM_GREEN})); /*-------------------------- @@ -911,15 +911,15 @@ void StaticData::HintTable_Init_Exclude_Dungeon() { /*french*/ "Selon moi, un #coeur dans le Temple du Feu# cache #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_FIRE_TEMPLE_MQ_LOOP_STALFOS_SUN_FAIRY] = HintText(CustomMessage("They say that #calling the sun in a hot arena# reveals #[[1]]#.", - /*german*/ "!!!", + /*german*/ "Man erzählt sich, daß das #Anrufen der Sonne in einer heißen Arena# #[[1]]# enthülle.", /*french*/ "Selon moi, #appeler le soleil dans une arène chaude# révèle #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_FIRE_TEMPLE_MQ_LOOP_KNUCKLE_SUN_FAIRY] = HintText(CustomMessage("They say that #calling the sun behind a knight's throne in a volcano# reveals #[[1]]#.", - /*german*/ "!!!", + /*german*/ "Man erzählt sich, daß das #Anrufen der Sonne hinter dem Thron eines Ritters in einem Vulkan# #[[1]]# enthülle.", /*french*/ "Selon moi, #appeler le soleil derrière le trône d’un chevalier dans un volcan# révèle #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_CRATE_FIRE_TEMPLE] = HintText(CustomMessage("They say that a #crate in Fire Temple# contains #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß eine #Kiste im Feuertempel# #[[1]]# enthielte.", /*french*/ "Selon moi, une #caisse dans le Temple du Feu# contient #[[1]]#.", {QM_RED, QM_GREEN})); /*-------------------------- @@ -1058,25 +1058,25 @@ void StaticData::HintTable_Init_Exclude_Dungeon() { /*french*/ "Selon moi, une #rivière dans le Temple de l'Eau# cache #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_WATER_TEMPLE_MQ_DARK_LINK_PILAR_SUN_FAIRY] = HintText(CustomMessage("They say that #calling the sun atop a small pillar before a duel with one's shadow# reveals #[[1]]#.", - /*german*/ "!!!", + /*german*/ "Man erzählt sich, daß das #Anrufen der Sonne auf einer kleinen Säule vor einem Duell mit seinem Schatten# #[[1]]# enthülle.", /*french*/ "Selon moi, #appeler le soleil au sommet d’un petit pilier avant un duel avec son ombre# révèle #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_WATER_TEMPLE_MQ_DARK_LINK_LEFT_STORM_FAIRY] = HintText(CustomMessage("They say that #calling the rain before a duel with one's shadow# reveals #[[1]]#.", - /*german*/ "!!!", + /*german*/ "Man erzählt sich, daß das #Anrufen des Regens vor einem Duell mit seinem Schatten# #[[1]]# enthülle.", /*french*/ "Selon moi, #appeler la pluie avant un duel avec son ombre# révèle #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_WATER_TEMPLE_MQ_DARK_LINK_RIGHT_SUN_FAIRY] = HintText(CustomMessage("They say that #calling the sun before a duel with one's shadow# reveals #[[1]]#.", - /*german*/ "!!!", + /*german*/ "Man erzählt sich, daß das #Anrufen der Sonne vor einem Duell mit seinem Schatten# #[[1]]# enthülle.", /*french*/ "Selon moi, #appeler le soleil avant un duel avec son ombre# révèle #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_CRATE_WATER_TEMPLE] = HintText(CustomMessage("They say that a #crate in Water Temple# contains #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß eine #Kiste im Wassertempel# #[[1]]# enthielte.", /*french*/ "Selon moi, une #caisse dans le Temple de l'Eau# contient #[[1]]#.", {QM_RED, QM_GREEN})); /*-------------------------- | SPIRIT TEMPLE | ---------------------------*/ - hintTextTable[RHT_SPIRIT_TEMPLE_CHILD_BRIDGE_CHEST] = HintText(CustomMessage("They say that a child conquers a #skull in green fire# in the Spirit Temple to reach #[[1]]#.", + hintTextTable[RHT_SPIRIT_TEMPLE_CHILD_BRIDGE_CHEST] = HintText(CustomMessage("They say that a child conquers a #skull in green fire# in the Spirit Temple to reach #[[1]]#.", /*german*/ "Man erzählt sich, daß ein Kind einen #Schädel in grünem Feuer# im Geistertempel erobere, um #[[1]]# zu erreichen.", /*french*/ "Selon moi, le #crâne au halo vert dans le colosse# cache #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, el joven que #baje el puente# del Templo del Espíritu encontrará #[[1]]#. @@ -1311,15 +1311,15 @@ void StaticData::HintTable_Init_Exclude_Dungeon() { /*french*/ "Selon moi, une #jarre dans le Temple de l'Esprit# contient #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_SPIRIT_TEMPLE_HEART] = HintText(CustomMessage("They say that on a #small platform# in the Spirit Temple lies #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß auf einer #kleinen Plattform# im Geistertempel #[[1]]# läge.", /*french*/ "Selon moi, sur une #petite plateforme# dans le Temple de l'Esprit repose #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_SPIRIT_TEMPLE_MQ_HEART] = HintText(CustomMessage("They say that guarded by a #ring of flame# in the Spirit Temple is #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß sich bewacht von einem #Ring der Flammen# im Geistertempel #[[1]]# befände.", /*french*/ "Selon moi, protégé par un #cercle de flammes# dans le Temple de l'Esprit se trouve #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_CRATE_SPIRIT_TEMPLE] = HintText(CustomMessage("They say that a #crate in Spirit Temple# contains #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß eine #Kiste im Geistertempel# #[[1]]# enthielte.", /*french*/ "Selon moi, une #caisse dans le Temple de l'Esprit# contient #[[1]]#.", {QM_RED, QM_GREEN})); /*-------------------------- @@ -1574,19 +1574,19 @@ void StaticData::HintTable_Init_Exclude_Dungeon() { /*french*/ "Selon moi, un #coeur dans le Temple de l'Ombre# cache #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_SHADOW_TEMPLE_BEAMOS_STORM_FAIRY] = HintText(CustomMessage("They say that an #calling the rain for a sentry guarding a house of the dead# reveals #[[1]]#.", - /*german*/ "!!!", + /*german*/ "Man erzählt sich, daß das #Anrufen des Regens für einen über ein Haus der Toten wachenden Posten# #[[1]]# enthülle.", /*french*/ "Selon moi, #appeler la pluie pour une sentinelle gardant une maison des morts# révèle #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_SHADOW_TEMPLE_PIT_STORM_FAIRY] = HintText(CustomMessage("They say that an #calling the rain on a platform suspended above a bottomless pit# reveals #[[1]]#.", - /*german*/ "!!!", + /*german*/ "Man erzählt sich, daß das #Anrufen des Regens auf einer über einer bodenlosen Grube hängenden Plattform# #[[1]]# enthülle.", /*french*/ "Selon moi, #appeler la pluie sur une plateforme suspendue au-dessus d’un gouffre sans fond# révèle #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_SHADOW_TEMPLE_WIND_HINT_SUN_FAIRY] = HintText(CustomMessage("They say that an #calling the sun near an invisible chest guarded by the dead# reveals #[[1]]#.", - /*german*/ "!!!", + /*german*/ "Man erzählt sich, daß das #Anrufen der Sonne nahe einer von Toten bewachten unsichtbaren Truhe# #[[1]]# enthülle.", /*french*/ "Selon moi, #appeler le soleil près d’un coffre invisible gardé par les morts# révèle #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_CRATE_SHADOW_TEMPLE] = HintText(CustomMessage("They say that a #crate in Shadow Temple# contains #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß eine #Kiste im Schattentempel# #[[1]]# enthielte.", /*french*/ "Selon moi, une #caisse dans le Temple de l'Ombre# contient #[[1]]#.", {QM_RED, QM_GREEN})); /*-------------------------- @@ -1716,7 +1716,7 @@ void StaticData::HintTable_Init_Exclude_Dungeon() { /*french*/ "Selon moi, un #coeur dans le Puits# cache #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_BOTTOM_OF_THE_WELL_RUPEE] = HintText(CustomMessage("They say that a #hidden path through the floor# in the well leads to #[[1]]#.", - /*german*/ "Man erzählt sich, daß ein #versteckter Pfad durch den Grund# im Brunnen zu #[[1]]# führe.", + /*german*/ "Man erzählt sich, daß ein #versteckter Pfad durch den Boden# im Brunnen zu #[[1]]# führe.", /*french*/ "Selon moi, un #passage caché sous le sol# dans le puits mène à #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_BOTTOM_OF_THE_WELL_BASEMENT_SUN_FAIRY] = HintText(CustomMessage("They say that an #calling the sun a dead end# within the well reveals #[[1]]#.", @@ -1732,8 +1732,8 @@ void StaticData::HintTable_Init_Exclude_Dungeon() { /*french*/ "Selon moi, #appeler le soleil dans une impasse# à l’intérieur du puits révèle #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_BOTTOM_OF_THE_WELL_GRASS] = HintText(CustomMessage("They say that some #grass in the Bottom of the Well# hides #[[1]]#.", - /*german*/ "", - /*french*/ "", {QM_RED, QM_GREEN})); + /*german*/ "Man erzählt sich, daß etwas #Gras auf dem Grund des Brunnens# #[[1]]# verstecke.", + /*french*/ "Selon moi, de l'#herbe dans le Puits# cache #[[1]]#.", {QM_RED, QM_GREEN})); /*-------------------------- @@ -1815,7 +1815,7 @@ void StaticData::HintTable_Init_Exclude_Dungeon() { hintTextTable[RHT_ICE_CAVERN_HEART] = HintText(CustomMessage("They say that atop on a #frozen pillar# lies #[[1]]#.", /*german*/ "Man erzählt sich, daß auf einer #gefrorenen Säule# #[[1]]# läge.", - /*french*/ "Selon moi, ", {QM_RED, QM_GREEN})); + /*french*/ "Selon moi, le dessus d'un #pilier de glace# cache #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_ICE_CAVERN_RUPEE] = HintText(CustomMessage("They say that a #rupee in a frozen cavern# hides #[[1]]#.", /*german*/ "Man erzählt sich, daß ein #Rubin in einer gefrorenen Kaverne# #[[1]]# verstecke.", @@ -2013,7 +2013,7 @@ void StaticData::HintTable_Init_Exclude_Dungeon() { /*french*/ "Selon moi, dans #une épreuve avec un Dinolfos# révèle #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_CRATE_GERUDO_TRAINING_GROUND] = HintText(CustomMessage("They say that a #crate in Gerudo Training Ground# contains #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß eine #Kiste auf dem Gerudo-Trainingsgelände# #[[1]]# enthielte.", /*french*/ "Selon moi, une #caisse dans le Gymnase Gerudo# contient #[[1]]#.", {QM_RED, QM_GREEN})); /*-------------------------- diff --git a/soh/soh/Enhancements/randomizer/3drando/hint_list/hint_list_exclude_overworld.cpp b/soh/soh/Enhancements/randomizer/3drando/hint_list/hint_list_exclude_overworld.cpp index 1858e2131..cf7921eac 100644 --- a/soh/soh/Enhancements/randomizer/3drando/hint_list/hint_list_exclude_overworld.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/hint_list/hint_list_exclude_overworld.cpp @@ -6,7 +6,7 @@ namespace Rando { void StaticData::HintTable_Init_Exclude_Overworld() { // clang-format off - hintTextTable[RHT_KF_KOKIRI_SWORD_CHEST] = HintText(CustomMessage("They say that the #hidden treasure of the Kokiri# is #[[1]]#.", + hintTextTable[RHT_KF_KOKIRI_SWORD_CHEST] = HintText(CustomMessage("They say that the #hidden treasure of the Kokiri# is #[[1]]#.", /*german*/ "Man erzählt sich, daß der #versteckte Schatz der Kokiri# #[[1]]# sei.", /*french*/ "Selon moi, le #trésor des Kokiri# est #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, el #tesoro oculto de los Kokiri# esconde #[[1]]#. @@ -1344,12 +1344,12 @@ void StaticData::HintTable_Init_Exclude_Overworld() { hintTextTable[RHT_SFM_DEKU_SCRUB_GROTTO_REAR] = HintText(CustomMessage("They say that a #scrub underground duo# sells #[[1]]#.", /*german*/ "Man erzählt sich, daß ein #Deku-Paar im Untergrund# #[[1]]# verkaufe.", - /*french*/ "Selon moi, le #duo de peste Mojo au cœur du sanctuaire sylvestre# vend #[[1]]#.", {QM_RED, QM_GREEN})); + /*french*/ "Selon moi, le #duo de peste Mojo au coeur du sanctuaire sylvestre# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, un #par de dekus subterráneos# de la pradera sagrada venden #[[1]]#. hintTextTable[RHT_SFM_DEKU_SCRUB_GROTTO_FRONT] = HintText(CustomMessage("They say that a #scrub underground duo# sells #[[1]]#.", /*german*/ "Man erzählt sich, daß ein #Deku-Paar im Untergrund# #[[1]]# verkaufe.", - /*french*/ "Selon moi, le #duo de peste Mojo au cœur du sanctuaire sylvestre# vend #[[1]]#.", {QM_RED, QM_GREEN})); + /*french*/ "Selon moi, le #duo de peste Mojo au coeur du sanctuaire sylvestre# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, un #par de dekus subterráneos# de la pradera sagrada venden #[[1]]#. hintTextTable[RHT_GC_DEKU_SCRUB_GROTTO_LEFT] = HintText(CustomMessage("They say that a #trio of scrubs# sells #[[1]]#.", @@ -1459,37 +1459,37 @@ void StaticData::HintTable_Init_Exclude_Overworld() { hintTextTable[RHT_BEEHIVE_CHEST_GROTTO] = HintText(CustomMessage("They say that a #beehive above a chest# hides #[[1]]#.", /*german*/ "Man erzählt sich, daß ein #Bienenstock oberhalb einer Truhe# #[[1]]# verberge.", - /*french*/ "Selon moi, #[[1]]#.", {QM_RED, QM_GREEN})); + /*french*/ "Selon moi, une #ruche au dessus d'un coffre# cache #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una #colmena sobre un cofre# esconde #[[1]]#. hintTextTable[RHT_BEEHIVE_LONELY_SCRUB_GROTTO] = HintText(CustomMessage("They say that a #beehive above a lonely scrub# hides #[[1]]#.", /*german*/ "Man erzählt sich, daß ein #Bienenstock oberhalb eines einsamen Deku# #[[1]]# verberge.", - /*french*/ "Selon moi, #[[1]]#.", {QM_RED, QM_GREEN})); + /*french*/ "Selon moi, une #ruche au dessus d'une Peste Mojo solitaire# cache #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una #colmena sobre un deku solitario# esconde #[[1]]#. hintTextTable[RHT_BEEHIVE_SCRUB_PAIR_GROTTO] = HintText(CustomMessage("They say that a #beehive above a pair of scrubs# hides #[[1]]#.", /*german*/ "Man erzählt sich, daß ein #Bienenstock oberhalb eines Deku-Paars# #[[1]]# verberge.", - /*french*/ "Selon moi, #[[1]]#.", {QM_RED, QM_GREEN})); + /*french*/ "Selon moi, une #ruche au dessus d'un duo de Pestes Mojo# cache #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una #colmena sobre un par de dekus# esconde #[[1]]#. hintTextTable[RHT_BEEHIVE_SCRUB_TRIO_GROTTO] = HintText(CustomMessage("They say that a #beehive above a trio of scrubs# hides #[[1]]#.", /*german*/ "Man erzählt sich, daß ein #Bienenstock oberhalb eines Deku-Trios# #[[1]]# verberge.", - /*french*/ "Selon moi, #[[1]]#.", {QM_RED, QM_GREEN})); + /*french*/ "Selon moi, une #ruche au dessus d'un trio de Pestes Mojo# cache #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una #colmena sobre un trío de dekus# esconde #[[1]]#. hintTextTable[RHT_BEEHIVE_COW_GROTTO] = HintText(CustomMessage("They say that a #beehive above a cow# hides #[[1]]#.", /*german*/ "Man erzählt sich, daß ein #Bienenstock oberhalb einer Kuh# #[[1]]# verberge.", - /*french*/ "Selon moi, #[[1]]#.", {QM_RED, QM_GREEN})); + /*french*/ "Selon moi, une #ruche au dessus d'une vache# cache #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una #colmena sobre una vaca# esconde #[[1]]#. hintTextTable[RHT_BEEHIVE_IN_FRONT_OF_KING_ZORA] = HintText(CustomMessage("They say that a #beehive in front of the king of the zoras# hides #[[1]]#.", /*german*/ "Man erzählt sich, daß ein #Bienenstock vor dem Zora-König# #[[1]]# verberge.", - /*french*/ "Selon moi, #[[1]]#.", {QM_RED, QM_GREEN})); + /*french*/ "Selon moi, une #ruche devant le Roi des Zoras# cache #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una #colmena delante del rey de los zoras# esconde #[[1]]#. hintTextTable[RHT_BEEHIVE_BEHIND_KING_ZORA] = HintText(CustomMessage("They say that a #beehive behind the king of the zoras# hides #[[1]]#.", /*german*/ "Man erzählt sich, daß ein #Bienenstock hinter dem Zora-König# #[[1]]# verberge.", - /*french*/ "Selon moi, #[[1]]#.", {QM_RED, QM_GREEN})); + /*french*/ "Selon moi, une #rucheau derrière le Roi des Zoras# cache #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una #colmena detrás del rey de los zoras# esconde #[[1]]#. hintTextTable[RHT_POT_KOKIRI_FOREST] = HintText(CustomMessage("They say that a #pot in Kokiri Forest# contains #[[1]]#.", @@ -1557,463 +1557,501 @@ void StaticData::HintTable_Init_Exclude_Overworld() { /*french*/ "Selon moi, un cœur dans la #maison d'une amie chère# cache #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ hintTextTable[RHT_LOST_WOODS_RUPEE] = HintText(CustomMessage("They say that under a #boulder in the woods# lies #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß unter einem #Felsen in den Wäldern# #[[1]]# läge.", /*french*/ "Selon moi, sous un #rocher dans les bois# se trouve #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ hintTextTable[RHT_LOST_WOODS_SHORTCUT_RUPEE] = HintText(CustomMessage("They say that in a #pool of water in the woods# lies #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß in einem #Wasserbecken in den Wäldern# #[[1]]# läge.", /*french*/ "Selon moi, dans une #mare d'eau dans les bois# se trouve #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ hintTextTable[RHT_LAKE_HYLIA_RUPEE] = HintText(CustomMessage("They say that just off the #coast of a lake# lies #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß an der #Küste eines Sees# #[[1]]# läge.", /*french*/ "Selon moi, juste au large de la #côte d'un lac# se trouve #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ hintTextTable[RHT_LABORATORY_RUPEE] = HintText(CustomMessage("They say that at the #bottom of a tank# lies #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß auf dem #Grund eines Reservoirs# #[[1]]# läge.", /*french*/ "Selon moi, au #fond d'un réservoir# se trouve #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ hintTextTable[RHT_DAMPES_GRAVE_RUPEE] = HintText(CustomMessage("They say that within a #quick-footed spirit's grave# lies #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß innerhalb eines #Grabes eines leichtfüßigen Geistes# #[[1]]# läge.", /*french*/ "Selon moi, dans la #tombe d'un esprit à pieds rapides# se trouve #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ hintTextTable[RHT_GERUDO_VALLEY_GROTTO_RUPEE] = HintText(CustomMessage("They say that an Octarok in an #underground spring# guards #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein Oktorok in einer #untergründigen Quelle# #[[1]]# bewache.", /*french*/ "Selon moi, un Octrocher dans une #source souterraine# garde #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ hintTextTable[RHT_DEATH_MOUNTAIN_TRAIL_RUPEE] = HintText(CustomMessage("They say that beneath a boulder on a #mountain's cliffside# lies #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß unterhalb eines Felsens an einem #abfallenden Felswand eines Berges# #[[1]]# läge.", /*french*/ "Selon moi, sous un rocher sur la #falaise d'une montagne# se trouve #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ hintTextTable[RHT_DEATH_MOUNTAIN_TRAIL_GROTTO_HEART] = HintText(CustomMessage("They say that accompanying a #cow in a small cave# is #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß unterhalb eines Felsens an einem #abfallenden Felswand eines Berges# #[[1]]# läge.", /*french*/ "Selon moi, accompagner une #vache dans une petite grotte# est #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ hintTextTable[RHT_DEATH_MOUNTAIN_TRAIL_GROTTO_RUPEE] = HintText(CustomMessage("They say that accompanying a #cow in a small cave# is #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß das Begleiten einer #Kuh in einer kleinen Höhle# #[[1]]# sei.", /*french*/ "Selon moi, accompagner une #vache dans une petite grotte# est #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ hintTextTable[RHT_DEATH_MOUNTAIN_CRATER_RUPEE] = HintText(CustomMessage("They say that on a #small platform suspended above lava# lies #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß auf einer #oberhalb von Lava hängenden kleinen Plattform# #[[1]]# läge.", /*french*/ "Selon moi, sur une #petite plateforme suspendue au-dessus de la lave# se trouve #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ hintTextTable[RHT_ZORAS_RIVER_WATERFALL_RUPEE] = HintText(CustomMessage("They say that beneath a #waterfall feeding a narrow river# lies #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß unterhalb eines #einen schmalen Fluss nährenden Wasserfall# #[[1]]# läge.", /*french*/ "Selon moi, sous une #cascade alimentant une rivière étroite# se trouve #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ hintTextTable[RHT_ZORAS_FOUNTAIN_RUPEE] = HintText(CustomMessage("They say that at the bottom of a #partially-frozen spring# lies #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß auf dem Grund einer #teilweise gefrorenen Quelle# #[[1]]# läge.", /*french*/ "Selon moi, au fond d'une #source partiellement gelée# se trouve #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ hintTextTable[RHT_SFM_FAIRY_GROTTO_FAIRY] = HintText(CustomMessage("They say that within #a fountain beneath a forest meadow# rests #[[1]]#.", - /*german*/ "!!!", + /*german*/ "Man erzählt sich, daß innerhalb #eines Brunnens unter einer Waldwiese# #[[1]]# ruhe.", /*french*/ "Selon moi, dans #une fontaine sous un bosquet forestier# repose #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_ZR_FAIRY_GROTTO_FAIRY] = HintText(CustomMessage("They say that within #a fountain beneath a river# rests #[[1]]#.", - /*german*/ "!!!", + /*german*/ "Man erzählt sich, daß innerhalb #eines Brunnens unter einem Fluß# #[[1]]# ruhe.", /*french*/ "Selon moi, dans #une fontaine sous une rivière# repose #[[1]]#.", {QM_RED, QM_GREEN})); - hintTextTable[RHT_HF_FAIRY_GROTTO_FAIRY] = HintText(CustomMessage("They say that within #a fountain beneath a a few trees bordering a wide field# rests #[[1]]#.", - /*german*/ "!!!", + hintTextTable[RHT_HF_FAIRY_GROTTO_FAIRY] = HintText(CustomMessage("They say that within #a fountain beneath a few trees bordering a wide field# rests #[[1]]#.", + /*german*/ "Man erzählt sich, daß innerhalb #eines Brunnens unter ein weites Feld angrenzenden Bäumen# #[[1]]# ruhe.", /*french*/ "Selon moi, dans #une fontaine sous quelques arbres bordant un vaste champ# repose #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_ZD_FAIRY_GROTTO_FAIRY] = HintText(CustomMessage("They say that within #a fountain beneath the home of the Zoras# rests #[[1]]#.", - /*german*/ "!!!", + /*german*/ "Man erzählt sich, daß innerhalb #eines Brunnens unter der Heimat der Zoras# #[[1]]# ruhe.", /*french*/ "Selon moi, dans #une fontaine sous la maison des Zora# repose #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_GF_FAIRY_GROTTO_FAIRY] = HintText(CustomMessage("They say that within #a fountain beneath the home of thieves# rests #[[1]]#.", - /*german*/ "!!!", + /*german*/ "Man erzählt sich, daß innerhalb #eines Brunnens unter der Heimat von Dieben# #[[1]]# ruhe.", /*french*/ "Selon moi, dans #une fontaine sous la maison des voleurs# repose #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_GRAVEYARD_SHIELD_GRAVE_FAIRY] = HintText(CustomMessage("They say that within #a fountain behind a wall within a grave# rests #[[1]]#.", - /*german*/ "!!!", + /*german*/ "Man erzählt sich, daß innerhalb #eines Brunnens unter einer Mauer innerhalb eines Grabes# #[[1]]# ruhe.", /*french*/ "Selon moi, dans #une fontaine derrière un mur dans une tombe# repose #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_COLOSSUS_OASIS_FAIRY] = HintText(CustomMessage("They say that #restoring water to a dried oasis# reveals #[[1]]#.", - /*german*/ "!!!", + /*german*/ "Man erzählt sich, daß das #Wiederbringen von Wasser zu einer ausgetrockneten Oase# #[[1]]# enthülle.", /*french*/ "Selon moi, #restaurer l'eau dans un oasis asséché# révèle #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_ZR_BEAN_SPROUT_FAIRY] = HintText(CustomMessage("They say that #watering a young sprout on the riverside# reveals #[[1]]#.", - /*german*/ "!!!", + /*german*/ "Man erzählt sich, daß das #Wässern eines jungen Sprosses am Flußufer# #[[1]]# enthülle.", /*french*/ "Selon moi, #arroser une jeune pousse au bord de la rivière# révèle #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_KF_BEAN_SPROUT_FAIRY] = HintText(CustomMessage("They say that #watering a young sprout near a forest shop# reveals #[[1]]#.", - /*german*/ "!!!", + /*german*/ "Man erzählt sich, daß das #Wässern eines jungen Sprosses nahe des Waldladens# #[[1]]# enthülle.", /*french*/ "Selon moi, #arroser une jeune pousse près d'un magasin forestier# révèle #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_LW_BEAN_SPROUT_NEAR_BRIDGE_FAIRY] = HintText(CustomMessage("They say that #watering a young sprout near the entrance to the forest# reveals #[[1]]#.", - /*german*/ "!!!", + /*german*/ "Man erzählt sich, daß das #Wässern eines jungen Sprosses nahe des Eingangs zum Wald# #[[1]]# enthülle.", /*french*/ "Selon moi, #arroser une jeune pousse près de l'entrée de la forêt# révèle #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_LW_BEAN_SPROUT_NEAR_THEATER_FAIRY] = HintText(CustomMessage("They say that #watering a young sprout above a sylvan theatre# reveals #[[1]]#.", - /*german*/ "!!!", + /*german*/ "Man erzählt sich, daß das #Wässern eines jungen Sprosses oberhalb eines waldigen Theaters# #[[1]]# enthülle.", /*french*/ "Selon moi, #arroser une jeune pousse au-dessus d'un théâtre sylvestre# révèle #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_LH_BEAN_SPROUT_FAIRY] = HintText(CustomMessage("They say that #watering a young sprout on the lakeside# reveals #[[1]]#.", - /*german*/ "!!!", + /*german*/ "Man erzählt sich, daß das #Wässern eines jungen Sprosses am Seeufer# #[[1]]# enthülle.", /*french*/ "Selon moi, #arroser une jeune pousse au bord du lac# révèle #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_GV_BEAN_SPROUT_FAIRY] = HintText(CustomMessage("They say that #watering a young sprout on the side of a canyon# reveals #[[1]]#.", - /*german*/ "!!!", + /*german*/ "Man erzählt sich, daß das #Wässern eines jungen Sprosses an der Seite einer Schlucht# #[[1]]# enthülle.", /*french*/ "Selon moi, #arroser une jeune pousse sur le côté d'un canyon# révèle #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_COLOSSUS_BEAN_SPROUT_FAIRY] = HintText(CustomMessage("They say that #watering a young sprout near a temple of the sand# reveals #[[1]]#.", - /*german*/ "!!!", + /*german*/ "Man erzählt sich, daß das #Wässern eines jungen Sprosses nahe eines Tempels des Sandes# #[[1]]# enthülle.", /*french*/ "Selon moi, #arroser une jeune pousse près d'un temple du sable# révèle #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_GRAVEYARD_BEAN_SPROUT_FAIRY] = HintText(CustomMessage("They say that #watering a young sprout within a graveyard# reveals #[[1]]#.", - /*german*/ "!!!", + /*german*/ "Man erzählt sich, daß das #Wässern eines jungen Sprosses auf einem Friedhof# #[[1]]# enthülle.", /*french*/ "Selon moi, #arroser une jeune pousse dans un cimetière# révèle #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_DMC_BEAN_SPROUT_FAIRY] = HintText(CustomMessage("They say that #watering a young sprout within a volcano# reveals #[[1]]#.", - /*german*/ "!!!", + /*german*/ "Man erzählt sich, daß das #Wässern eines jungen Sprosses innerhalb eines Vulkans# #[[1]]# enthülle.", /*french*/ "Selon moi, #arroser une jeune pousse dans un volcan# révèle #[[1]]#.", {QM_RED, QM_GREEN})); - hintTextTable[RHT_DMT_BEAN_SPROUT_FAIRY] = HintText(CustomMessage("They say that #watering a young sprout on the moutainside# reveals #[[1]]#.", - /*german*/ "!!!", + hintTextTable[RHT_DMT_BEAN_SPROUT_FAIRY] = HintText(CustomMessage("They say that #watering a young sprout on the mountainside# reveals #[[1]]#.", + /*german*/ "Man erzählt sich, daß das #Wässern eines jungen Sprosses an einem Berghang# #[[1]]# enthülle.", /*french*/ "Selon moi, #arroser une jeune pousse sur le flanc d'une montagne# révèle #[[1]]#.", {QM_RED, QM_GREEN})); - hintTextTable[RHT_TOT_GOSSIP_STONE_FAIRY] = HintText(CustomMessage("They say that #playing a tune for an odd stone in the ouskirts of the market# reveals #[[1]]#.", - /*german*/ "!!!", + hintTextTable[RHT_TOT_GOSSIP_STONE_FAIRY] = HintText(CustomMessage("They say that #playing a tune for an odd stone in the outskirts of the market# reveals #[[1]]#.", + /*german*/ "Man erzählt sich, daß das #Spielen einer Melodie für einen seltsamen Stein am Rand des Marktes# #[[1]]# enthülle.", /*french*/ "Selon moi, #jouer une mélodie pour une pierre étrange en périphérie du marché# révèle #[[1]]#.", {QM_RED, QM_GREEN})); - hintTextTable[RHT_TOT_GOSSIP_STONE_FAIRY_BIG] = HintText(CustomMessage("They say that #playing a stormy tune for an odd stone in the ouskirts of the market# reveals #[[1]]#.", - /*german*/ "!!!", + hintTextTable[RHT_TOT_GOSSIP_STONE_FAIRY_BIG] = HintText(CustomMessage("They say that #playing a stormy tune for an odd stone in the outskirts of the market# reveals #[[1]]#.", + /*german*/ "Man erzählt sich, daß das #Spielen einer stürmischen Melodie für einen seltsamen Stein am Rand des Marktes# #[[1]]# enthülle.", /*french*/ "Selon moi, #jouer une mélodie orageuse pour une pierre étrange en périphérie du marché# révèle #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_DMC_GOSSIP_STONE_FAIRY] = HintText(CustomMessage("They say that #playing a tune for an odd stone within a volcano# reveals #[[1]]#.", - /*german*/ "!!!", + /*german*/ "Man erzählt sich, daß das #Spielen einer Melodie für einen seltsamen Stein innerhalb eines Vulkans# #[[1]]# enthülle.", /*french*/ "Selon moi, #jouer une mélodie pour une pierre étrange dans un volcan# révèle #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_DMC_GOSSIP_STONE_FAIRY_BIG] = HintText(CustomMessage("They say that #playing a stormy tune for an odd stone within a volcano# reveals #[[1]]#.", - /*german*/ "!!!", + /*german*/ "Man erzählt sich, daß das #Spielen einer stürmischen Melodie für einen seltsamen Stein innerhalb eines Vulkans# #[[1]]# enthülle.", /*french*/ "Selon moi, #jouer une mélodie orageuse pour une pierre étrange dans un volcan# révèle #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_DMT_GOSSIP_STONE_FAIRY] = HintText(CustomMessage("They say that #playing a tune for an odd stone on a mountain cliff face# reveals #[[1]]#.", - /*german*/ "!!!", + /*german*/ "Man erzählt sich, daß das #Spielen einer Melodie für einen seltsamen Stein an einer Bergklippe# #[[1]]# enthülle.", /*french*/ "Selon moi, #jouer une mélodie pour une pierre étrange sur une falaise de montagne# révèle #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_DMT_GOSSIP_STONE_FAIRY_BIG] = HintText(CustomMessage("They say that #playing a stormy tune for an odd stone on a mountain cliff face# reveals #[[1]]#.", - /*german*/ "!!!", + /*german*/ "Man erzählt sich, daß das #Spielen einer stürmischen Melodie für einen seltsamen Stein an einer Bergklippe# #[[1]]# enthülle.", /*french*/ "Selon moi, #jouer une mélodie orageuse pour une pierre étrange sur une falaise de montagne# révèle #[[1]]#.", {QM_RED, QM_GREEN})); - hintTextTable[RHT_COLOSSUS_GOSSIP_STONE_FAIRY] = HintText(CustomMessage("They say that #playing a tune for an odd stone near the temple of the sane# reveals #[[1]]#.", - /*german*/ "!!!", + hintTextTable[RHT_COLOSSUS_GOSSIP_STONE_FAIRY] = HintText(CustomMessage("They say that #playing a tune for an odd stone near the temple of the sand# reveals #[[1]]#.", + /*german*/ "Man erzählt sich, daß das #Spielen einer Melodie für einen seltsamen Stein nahe des Tempels des Sandes# #[[1]]# enthülle.", /*french*/ "Selon moi, #jouer une mélodie pour une pierre étrange près du temple du sable# révèle #[[1]]#.", {QM_RED, QM_GREEN})); - hintTextTable[RHT_COLOSSUS_GOSSIP_STONE_FAIRY_BIG] = HintText(CustomMessage("They say that #playing a stormy tune for an odd stone near the temple of the sane# reveals #[[1]]#.", - /*german*/ "!!!", + hintTextTable[RHT_COLOSSUS_GOSSIP_STONE_FAIRY_BIG] = HintText(CustomMessage("They say that #playing a stormy tune for an odd stone near the temple of the sand# reveals #[[1]]#.", + /*german*/ "Man erzählt sich, daß das #Spielen einer stürmischen Melodie für einen seltsamen Stein nahe des Tempels des Sandes# #[[1]]# enthülle.", /*french*/ "Selon moi, #jouer une mélodie orageuse pour une pierre étrange près du temple du sable# révèle #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_GV_GOSSIP_STONE_FAIRY] = HintText(CustomMessage("They say that #playing a tune for an odd stone near a canyon waterfall# reveals #[[1]]#.", - /*german*/ "!!!", + /*german*/ "Man erzählt sich, daß das #Spielen einer Melodie für einen seltsamen Stein nahe eines Wasserfalls in einer Schlucht# #[[1]]# enthülle.", /*french*/ "Selon moi, #jouer une mélodie pour une pierre étrange près d'une cascade de canyon# révèle #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_GV_GOSSIP_STONE_FAIRY_BIG] = HintText(CustomMessage("They say that #playing a stormy tune for an odd stone near a canyon waterfall# reveals #[[1]]#.", - /*german*/ "!!!", + /*german*/ "Man erzählt sich, daß das #Spielen einer stürmischen Melodie für einen seltsamen Stein nahe eines Wasserfalls in einer Schlucht# #[[1]]# enthülle.", /*french*/ "Selon moi, #jouer une mélodie orageuse pour une pierre étrange près d'une cascade de canyon# révèle #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_GC_MAZE_GOSSIP_STONE_FAIRY] = HintText(CustomMessage("They say that #playing a tune for an odd stone behind a maze of rock# reveals #[[1]]#.", - /*german*/ "!!!", + /*german*/ "Man erzählt sich, daß das #Spielen einer Melodie für einen seltsamen Stein hinter einem Felslabyrinth# #[[1]]# enthülle.", /*french*/ "Selon moi, #jouer une mélodie pour une pierre étrange derrière un labyrinthe de roches# révèle #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_GC_MAZE_GOSSIP_STONE_FAIRY_BIG] = HintText(CustomMessage("They say that #playing a stormy tune for an odd stone behind a maze of rock# reveals #[[1]]#.", - /*german*/ "!!!", + /*german*/ "Man erzählt sich, daß das #Spielen einer stürmischen Melodie für einen seltsamen Stein hinter einem Felslabyrinth# #[[1]]# enthülle.", /*french*/ "Selon moi, #jouer une mélodie orageuse pour une pierre étrange derrière un labyrinthe de roches# révèle #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_GC_MEDIGORON_GOSSIP_STONE_FAIRY] = HintText(CustomMessage("They say that #playing a tune for an odd stone near a blacksmith# reveals #[[1]]#.", - /*german*/ "!!!", + /*german*/ "Man erzählt sich, daß das #Spielen einer Melodie für einen seltsamen Stein nahe eines Schmiedes# #[[1]]# enthülle.", /*french*/ "Selon moi, #jouer une mélodie pour une pierre étrange près d'un forgeron# révèle #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_GC_MEDIGORON_GOSSIP_STONE_FAIRY_BIG] = HintText(CustomMessage("They say that #playing a stormy tune for an odd stone near a blacksmith# reveals #[[1]]#.", - /*german*/ "!!!", + /*german*/ "Man erzählt sich, daß das #Spielen einer stürmischen Melodie für einen seltsamen Stein nahe eines Schmiedes# #[[1]]# enthülle.", /*french*/ "Selon moi, #jouer une mélodie orageuse pour une pierre étrange près d'un forgeron# révèle #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_GRAVEYARD_GOSSIP_STONE_FAIRY] = HintText(CustomMessage("They say that #playing a tune for an odd stone overlooking the graveyard# reveals #[[1]]#.", - /*german*/ "!!!", + /*german*/ "Man erzählt sich, daß das #Spielen einer Melodie für einen seltsamen Stein, welcher den Friedhof überblickt#, #[[1]]# enthülle.", /*french*/ "Selon moi, #jouer une mélodie pour une pierre étrange surplombant le cimetière# révèle #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_GRAVEYARD_GOSSIP_STONE_FAIRY_BIG] = HintText(CustomMessage("They say that #playing a stormy tune for an odd stone overlooking the graveyard# reveals #[[1]]#.", - /*german*/ "!!!", + /*german*/ "Man erzählt sich, daß das #Spielen einer stürmischen Melodie für einen seltsamen Stein, welcher den Friedhof überblickt#, #[[1]]# enthülle.", /*french*/ "Selon moi, #jouer une mélodie orageuse pour une pierre étrange surplombant le cimetière# révèle #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_HC_MALON_GOSSIP_STONE_FAIRY] = HintText(CustomMessage("They say that #playing a tune for an odd stone overlooking the path to the castle# reveals #[[1]]#.", - /*german*/ "!!!", + /*german*/ "Man erzählt sich, daß das #Spielen einer Melodie für einen seltsamen Stein, welcher den Pfad zum Schloß überblickt#, #[[1]]# enthülle.", /*french*/ "Selon moi, #jouer une mélodie pour une pierre étrange surplombant le chemin du château# révèle #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_HC_MALON_GOSSIP_STONE_FAIRY_BIG] = HintText(CustomMessage("They say that #playing a stormy tune for an odd stone overlooking the path to the castle# reveals #[[1]]#.", - /*german*/ "!!!", + /*german*/ "Man erzählt sich, daß das #Spielen einer stürmischen Melodie für einen seltsamen Stein, welcher den Pfad zum Schloß überblickt#, #[[1]]# enthülle.", /*french*/ "Selon moi, #jouer une mélodie orageuse pour une pierre étrange surplombant le chemin du château# révèle #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_HC_ROCK_WALL_GOSSIP_STONE_FAIRY] = HintText(CustomMessage("They say that #playing a tune for an odd stone near a secret path to the castle# reveals #[[1]]#.", - /*german*/ "!!!", + /*german*/ "Man erzählt sich, daß das #Spielen einer Melodie für einen seltsamen Stein nahe eines geheimen Pfades zum Schloß# #[[1]]# enthülle.", /*french*/ "Selon moi, #jouer une mélodie pour une pierre étrange près d'un chemin secret vers le château# révèle #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_HC_ROCK_WALL_GOSSIP_STONE_FAIRY_BIG] = HintText(CustomMessage("They say that #playing a stormy tune for an odd stone near a secret path to the castle# reveals #[[1]]#.", - /*german*/ "!!!", + /*german*/ "Man erzählt sich, daß das #Spielen einer stürmischen Melodie für einen seltsamen Stein nahe eines geheimen Pfades zum Schloß# #[[1]]# enthülle.", /*french*/ "Selon moi, #jouer une mélodie orageuse pour une pierre étrange près d'un chemin secret vers le château# révèle #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_HC_STORMS_GROTTO_GOSSIP_STONE_FAIRY] = HintText(CustomMessage("They say that #playing a tune for an odd stone beneath the castle# reveals #[[1]]#.", - /*german*/ "!!!", + /*german*/ "Man erzählt sich, daß das #Spielen einer Melodie für einen seltsamen Stein unterhalb des Schloßes# #[[1]]# enthülle.", /*french*/ "Selon moi, #jouer une mélodie pour une pierre étrange sous le château# révèle #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_HC_STORMS_GROTTO_GOSSIP_STONE_FAIRY_BIG] = HintText(CustomMessage("They say that #playing a stormy tune for an odd stone beneath the castle# reveals #[[1]]#.", - /*german*/ "!!!", - /*french*/ "Selon moi, jouer une mélodie orageuse pour une pierre étrange sous le château révèle [[1]].", {QM_RED, QM_GREEN})); + /*german*/ "Man erzählt sich, daß das #Spielen einer stürmischen Melodie für einen seltsamen Stein unterhalb des Schloßes# #[[1]]# enthülle.", + /*french*/ "Selon moi, #jouer une mélodie orageuse pour une pierre étrange sous le château# révèle [[1]].", {QM_RED, QM_GREEN})); hintTextTable[RHT_KF_DEKU_TREE_GOSSIP_STONE_FAIRY] = HintText(CustomMessage("They say that #playing a tune for an odd stone near an ancient tree# reveals #[[1]]#.", - /*german*/ "!!!", - /*french*/ "Selon moi, jouer une mélodie pour une pierre étrange près d'un arbre ancien révèle [[1]].", {QM_RED, QM_GREEN})); + /*german*/ "Man erzählt sich, daß das #Spielen einer Melodie für einen seltsamen Stein nahe eines antiken Baumes# #[[1]]# enthülle.", + /*french*/ "Selon moi, #jouer une mélodie pour une pierre étrange près d'un arbre ancien# révèle [[1]].", {QM_RED, QM_GREEN})); hintTextTable[RHT_KF_DEKU_TREE_GOSSIP_STONE_FAIRY_BIG] = HintText(CustomMessage("They say that #playing a stormy tune for an odd stone near an ancient tree# reveals #[[1]]#.", - /*german*/ "!!!", - /*french*/ "Selon moi, jouer une mélodie orageuse pour une pierre étrange près d'un arbre ancien révèle [[1]].", {QM_RED, QM_GREEN})); + /*german*/ "Man erzählt sich, daß das #Spielen einer stürmischen Melodie für einen seltsamen Stein nahe eines antiken Baumes# #[[1]]# enthülle.", + /*french*/ "Selon moi, #jouer une mélodie orageuse pour une pierre étrange près d'un arbre ancien# révèle [[1]].", {QM_RED, QM_GREEN})); hintTextTable[RHT_KF_GOSSIP_STONE_FAIRY] = HintText(CustomMessage("They say that #playing a tune for an odd stone overlooking a forest village# reveals #[[1]]#.", - /*german*/ "!!!", - /*french*/ "Selon moi, jouer une mélodie pour une pierre étrange surplombant un village forestier révèle [[1]].", {QM_RED, QM_GREEN})); + /*german*/ "Man erzählt sich, daß das #Spielen einer Melodie für einen seltsamen Stein, welcher ein Dorf im Wald überblickt#, #[[1]]# enthülle.", + /*french*/ "Selon moi, #jouer une mélodie pour une pierre étrange surplombant un village forestier# révèle [[1]].", {QM_RED, QM_GREEN})); hintTextTable[RHT_KF_GOSSIP_STONE_FAIRY_BIG] = HintText(CustomMessage("They say that #playing a stormy tune for an odd stone overlooking a forest village# reveals #[[1]]#.", - /*german*/ "!!!", - /*french*/ "Selon moi, jouer une mélodie orageuse pour une pierre étrange surplombant un village forestier révèle [[1]].", {QM_RED, QM_GREEN})); + /*german*/ "Man erzählt sich, daß das #Spielen einer stürmischen Melodie für einen seltsamen Stein, welcher ein Dorf im Wald überblickt#, #[[1]]# enthülle.", + /*french*/ "Selon moi, #jouer une mélodie orageuse pour une pierre étrange surplombant un village forestier# révèle [[1]].", {QM_RED, QM_GREEN})); hintTextTable[RHT_KF_STORMS_GROTTO_GOSSIP_STONE_FAIRY] = HintText(CustomMessage("They say that #playing a tune for an odd stone beneath a forest village# reveals #[[1]]#.", - /*german*/ "!!!", - /*french*/ "Selon moi, jouer une mélodie pour une pierre étrange sous un village forestier révèle [[1]].", {QM_RED, QM_GREEN})); + /*german*/ "Man erzählt sich, daß das #Spielen einer Melodie für einen seltsamen Stein unterhalb eines Dorfes im Wald# #[[1]]# enthülle.", + /*french*/ "Selon moi, #jouer une mélodie pour une pierre étrange sous un village forestier# révèle [[1]].", {QM_RED, QM_GREEN})); hintTextTable[RHT_KF_STORMS_GROTTO_GOSSIP_STONE_FAIRY_BIG] = HintText(CustomMessage("They say that #playing a stormy tune for an odd stone beneath a forest village# reveals #[[1]]#.", - /*german*/ "!!!", - /*french*/ "Selon moi, jouer une mélodie orageuse pour une pierre étrange sous un village forestier révèle [[1]].", {QM_RED, QM_GREEN})); + /*german*/ "Man erzählt sich, daß das #Spielen einer stürmischen Melodie für einen seltsamen Stein unterhalb eines Dorfes im Wald# #[[1]]# enthülle.", + /*french*/ "Selon moi, #jouer une mélodie orageuse pour une pierre étrange sous un village forestier# révèle [[1]].", {QM_RED, QM_GREEN})); hintTextTable[RHT_LH_LAB_GOSSIP_STONE_FAIRY] = HintText(CustomMessage("They say that #playing a tune for an odd stone overlooking the river feeding a lake# reveals #[[1]]#.", - /*german*/ "!!!", - /*french*/ "Selon moi, jouer une mélodie pour une pierre étrange surplombant la rivière qui alimente un lac révèle [[1]].", {QM_RED, QM_GREEN})); + /*german*/ "Man erzählt sich, daß das #Spielen einer Melodie für einen seltsamen Stein, welcher einen See nährenden Fluß überblickt#, #[[1]]# enthülle.", + /*french*/ "Selon moi, #jouer une mélodie pour une pierre étrange surplombant la rivière qui alimente un lac# révèle [[1]].", {QM_RED, QM_GREEN})); hintTextTable[RHT_LH_LAB_GOSSIP_STONE_FAIRY_BIG] = HintText(CustomMessage("They say that #playing a stormy tune for an odd stone overlooking the river feeding a lake# reveals #[[1]]#.", - /*german*/ "!!!", - /*french*/ "Selon moi, jouer une mélodie orageuse pour une pierre étrange surplombant la rivière qui alimente un lac révèle [[1]].", {QM_RED, QM_GREEN})); + /*german*/ "Man erzählt sich, daß das #Spielen einer stürmischen Melodie für einen seltsamen Stein, welcher einen See nährenden Fluß überblickt#, #[[1]]# enthülle.", + /*french*/ "Selon moi, #jouer une mélodie orageuse pour une pierre étrange surplombant la rivière qui alimente un lac# révèle [[1]].", {QM_RED, QM_GREEN})); hintTextTable[RHT_LH_SOUTHEAST_GOSSIP_STONE_FAIRY] = HintText(CustomMessage("They say that #playing a tune for an odd stone at the back of a lake# reveals #[[1]]#.", - /*german*/ "!!!", - /*french*/ "Selon moi, jouer une mélodie pour une pierre étrange au fond d'un lac révèle [[1]].", {QM_RED, QM_GREEN})); + /*german*/ "Man erzählt sich, daß das #Spielen einer Melodie für einen seltsamen Stein am Rücken eines Sees# #[[1]]# enthülle.", + /*french*/ "Selon moi, #jouer une mélodie pour une pierre étrange au fond d'un lac# révèle [[1]].", {QM_RED, QM_GREEN})); hintTextTable[RHT_LH_SOUTHEAST_GOSSIP_STONE_FAIRY_BIG] = HintText(CustomMessage("They say that #playing a stormy tune for an odd stone at the back of a lake# reveals #[[1]]#.", - /*german*/ "!!!", - /*french*/ "Selon moi, jouer une mélodie orageuse pour une pierre étrange au fond d'un lac révèle [[1]].", {QM_RED, QM_GREEN})); + /*german*/ "Man erzählt sich, daß das #Spielen einer stürmischen Melodie für einen seltsamen Stein am Rücken eines Sees# #[[1]]# enthülle.", + /*french*/ "Selon moi, #jouer une mélodie orageuse pour une pierre étrange au fond d'un lac# révèle [[1]].", {QM_RED, QM_GREEN})); hintTextTable[RHT_LH_SOUTHWEST_GOSSIP_STONE_FAIRY] = HintText(CustomMessage("They say that #playing a tune for an odd stone at the back of a lake# reveals #[[1]]#.", - /*german*/ "!!!", - /*french*/ "Selon moi, jouer une mélodie pour une pierre étrange au fond d'un lac révèle [[1]].", {QM_RED, QM_GREEN})); + /*german*/ "Man erzählt sich, daß das #Spielen einer Melodie für einen seltsamen Stein am Rücken eines Sees# #[[1]]# enthülle.", + /*french*/ "Selon moi, #jouer une mélodie pour une pierre étrange au fond d'un lac# révèle [[1]].", {QM_RED, QM_GREEN})); hintTextTable[RHT_LH_SOUTHWEST_GOSSIP_STONE_FAIRY_BIG] = HintText(CustomMessage("They say that #playing a stormy tune for an odd stone at the back of a lake# reveals #[[1]]#.", - /*german*/ "!!!", - /*french*/ "Selon moi, jouer une mélodie orageuse pour une pierre étrange au fond d'un lac révèle [[1]].", {QM_RED, QM_GREEN})); + /*german*/ "Man erzählt sich, daß das #Spielen einer stürmischen Melodie für einen seltsamen Stein am Rücken eines Sees# #[[1]]# enthülle.", + /*french*/ "Selon moi, #jouer une mélodie orageuse pour une pierre étrange au fond d'un lac# révèle [[1]].", {QM_RED, QM_GREEN})); hintTextTable[RHT_LW_GOSSIP_STONE_FAIRY] = HintText(CustomMessage("They say that #playing a tune for an odd stone within a perplexing wood# reveals #[[1]]#.", - /*german*/ "!!!", - /*french*/ "Selon moi, jouer une mélodie pour une pierre étrange dans un bois déroutant révèle [[1]].", {QM_RED, QM_GREEN})); + /*german*/ "Man erzählt sich, daß das #Spielen einer Melodie für einen seltsamen Stein innerhalb eines verwirrenden Waldes# #[[1]]# enthülle.", + /*french*/ "Selon moi, #jouer une mélodie pour une pierre étrange dans un bois déroutant# révèle [[1]].", {QM_RED, QM_GREEN})); hintTextTable[RHT_LW_GOSSIP_STONE_FAIRY_BIG] = HintText(CustomMessage("They say that #playing a stormy tune for an odd stone within a perplexing wood# reveals #[[1]]#.", - /*german*/ "!!!", - /*french*/ "Selon moi, jouer une mélodie orageuse pour une pierre étrange dans un bois déroutant révèle [[1]].", {QM_RED, QM_GREEN})); + /*german*/ "Man erzählt sich, daß das #Spielen einer stürmischen Melodie für einen seltsamen Stein innerhalb eines verwirrenden Waldes# #[[1]]# enthülle.", + /*french*/ "Selon moi, #jouer une mélodie orageuse pour une pierre étrange dans un bois déroutant# révèle [[1]].", {QM_RED, QM_GREEN})); hintTextTable[RHT_SFM_MAZE_GOSSIP_STONE_FAIRY] = HintText(CustomMessage("They say that #playing a tune for an odd stone overlooking a forest maze# reveals #[[1]]#.", - /*german*/ "!!!", - /*french*/ "Selon moi, jouer une mélodie pour une pierre étrange surplombant un labyrinthe forestier révèle [[1]].", {QM_RED, QM_GREEN})); + /*german*/ "Man erzählt sich, daß das #Spielen einer Melodie für einen seltsamen Stein, welcher ein Waldlabyrinth überblickt#, #[[1]]# enthülle.", + /*french*/ "Selon moi, #jouer une mélodie pour une pierre étrange surplombant un labyrinthe forestier# révèle [[1]].", {QM_RED, QM_GREEN})); hintTextTable[RHT_SFM_MAZE_GOSSIP_STONE_FAIRY_BIG] = HintText(CustomMessage("They say that #playing a stormy tune for an odd stone overlooking a forest maze# reveals #[[1]]#.", - /*german*/ "!!!", - /*french*/ "Selon moi, jouer une mélodie orageuse pour une pierre étrange surplombant un labyrinthe forestier révèle [[1]].", {QM_RED, QM_GREEN})); + /*german*/ "Man erzählt sich, daß das #Spielen einer stürmischen Melodie für einen seltsamen Stein, welcher ein Waldlabyrinth überblickt#, #[[1]]# enthülle.", + /*french*/ "Selon moi, #jouer une mélodie orageuse pour une pierre étrange surplombant un labyrinthe forestier# révèle [[1]].", {QM_RED, QM_GREEN})); hintTextTable[RHT_SFM_SARIA_GOSSIP_STONE_FAIRY] = HintText(CustomMessage("They say that #playing a tune for an odd stone watching a hiding place in the woods# reveals #[[1]]#.", - /*german*/ "!!!", - /*french*/ "Selon moi, jouer une mélodie pour une pierre étrange surveillant une cachette dans les bois révèle [[1]].", {QM_RED, QM_GREEN})); + /*german*/ "Man erzählt sich, daß das #Spielen einer Melodie für einen seltsamen Stein, welcher ein Versteck im Wald überblickt#, #[[1]]# enthülle.", + /*french*/ "Selon moi, #jouer une mélodie pour une pierre étrange surveillant une cachette dans les bois# révèle [[1]].", {QM_RED, QM_GREEN})); hintTextTable[RHT_SFM_SARIA_GOSSIP_STONE_FAIRY_BIG] = HintText(CustomMessage("They say that #playing a stormy tune for an odd stone watching a hiding place in the woods# reveals #[[1]]#.", - /*german*/ "!!!", - /*french*/ "Selon moi, jouer une mélodie orageuse pour une pierre étrange surveillant une cachette dans les bois révèle [[1]].", {QM_RED, QM_GREEN})); + /*german*/ "Man erzählt sich, daß das #Spielen einer stürmischen Melodie für einen seltsamen Stein, welcher ein Versteck im Wald überblickt#, #[[1]]# enthülle.", + /*french*/ "Selon moi, #jouer une mélodie orageuse pour une pierre étrange surveillant une cachette dans les bois# révèle [[1]].", {QM_RED, QM_GREEN})); hintTextTable[RHT_ZD_GOSSIP_STONE_FAIRY] = HintText(CustomMessage("They say that #playing a tune for an odd stone listening to an aquatic king# reveals #[[1]]#.", - /*german*/ "!!!", - /*french*/ "Selon moi, jouer une mélodie pour une pierre étrange écoutant un roi aquatique révèle [[1]].", {QM_RED, QM_GREEN})); + /*german*/ "Man erzählt sich, daß das #Spielen einer Melodie für einen seltsamen Stein, welcher einem aquatischen König zuhört#, #[[1]]# enthülle.", + /*french*/ "Selon moi, #jouer une mélodie pour une pierre étrange écoutant un roi aquatique# révèle [[1]].", {QM_RED, QM_GREEN})); hintTextTable[RHT_ZD_GOSSIP_STONE_FAIRY_BIG] = HintText(CustomMessage("They say that #playing a stormy tune for an odd stone listening to an aquatic king# reveals #[[1]]#.", - /*german*/ "!!!", - /*french*/ "Selon moi, jouer une mélodie orageuse pour une pierre étrange écoutant un roi aquatique révèle [[1]].", {QM_RED, QM_GREEN})); + /*german*/ "Man erzählt sich, daß das #Spielen einer stürmischen Melodie für einen seltsamen Stein, welcher einem aquatischen König zuhört#, #[[1]]# enthülle.", + /*french*/ "Selon moi, #jouer une mélodie orageuse pour une pierre étrange écoutant un roi aquatique# révèle [[1]].", {QM_RED, QM_GREEN})); - hintTextTable[RHT_ZF_FAIRY_GOSSIP_STONE_FAIRY] = HintText(CustomMessage("They say that #playing a tune for an odd stone in the ouskirts of a deap fountain# reveals #[[1]]#.", - /*german*/ "!!!", - /*french*/ "Selon moi, jouer une mélodie pour une pierre étrange en périphérie d'une profonde fontaine révèle [[1]].", {QM_RED, QM_GREEN})); + hintTextTable[RHT_ZF_FAIRY_GOSSIP_STONE_FAIRY] = HintText(CustomMessage("They say that #playing a tune for an odd stone in the outskirts of a deep fountain# reveals #[[1]]#.", + /*german*/ "Man erzählt sich, daß das #Spielen einer Melodie für einen seltsamen Stein am Rand eines tiefen Brunnens# #[[1]]# enthülle.", + /*french*/ "Selon moi, #jouer une mélodie pour une pierre étrange en périphérie d'une profonde fontaine# révèle [[1]].", {QM_RED, QM_GREEN})); - hintTextTable[RHT_ZF_FAIRY_GOSSIP_STONE_FAIRY_BIG] = HintText(CustomMessage("They say that #playing a stormy tune for an odd stone in the ouskirts of a deap fountain# reveals #[[1]]#.", - /*german*/ "!!!", - /*french*/ "Selon moi, jouer une mélodie orageuse pour une pierre étrange en périphérie d'une profonde fontaine révèle [[1]].", {QM_RED, QM_GREEN})); + hintTextTable[RHT_ZF_FAIRY_GOSSIP_STONE_FAIRY_BIG] = HintText(CustomMessage("They say that #playing a stormy tune for an odd stone in the outskirts of a deep fountain# reveals #[[1]]#.", + /*german*/ "Man erzählt sich, daß das #Spielen einer stürmischen Melodie für einen seltsamen Stein am Rand eines tiefen Brunnens# #[[1]]# enthülle.", + /*french*/ "Selon moi, #jouer une mélodie orageuse pour une pierre étrange en périphérie d'une profonde fontaine# révèle [[1]].", {QM_RED, QM_GREEN})); hintTextTable[RHT_ZF_JABU_GOSSIP_STONE_FAIRY] = HintText(CustomMessage("They say that #playing a tune for an odd stone watching a guardian of the sea# reveals #[[1]]#.", - /*german*/ "!!!", - /*french*/ "Selon moi, jouer une mélodie pour une pierre étrange surveillant un gardien de la mer révèle [[1]].", {QM_RED, QM_GREEN})); + /*german*/ "Man erzählt sich, daß das #Spielen einer Melodie für einen seltsamen Stein, welcher einen Wächter des Meeres beobachtet#, #[[1]]# enthülle.", + /*french*/ "Selon moi, #jouer une mélodie pour une pierre étrange surveillant un gardien de la mer# révèle [[1]].", {QM_RED, QM_GREEN})); hintTextTable[RHT_ZF_JABU_GOSSIP_STONE_FAIRY_BIG] = HintText(CustomMessage("They say that #playing a stormy tune for an odd stone watching a guardian of the sea# reveals #[[1]]#.", - /*german*/ "!!!", - /*french*/ "Selon moi, jouer une mélodie orageuse pour une pierre étrange surveillant un gardien de la mer révèle [[1]].", {QM_RED, QM_GREEN})); + /*german*/ "Man erzählt sich, daß das #Spielen einer stürmischen Melodie für einen seltsamen Stein, welcher einen Wächter des Meeres beobachtet#, #[[1]]# enthülle.", + /*french*/ "Selon moi, #jouer une mélodie orageuse pour une pierre étrange surveillant un gardien de la mer# révèle [[1]].", {QM_RED, QM_GREEN})); hintTextTable[RHT_ZR_NEAR_GROTTOS_GOSSIP_STONE_FAIRY] = HintText(CustomMessage("They say that #playing a tune for an odd stone overwatching a river# reveals #[[1]]#.", - /*german*/ "!!!", - /*french*/ "Selon moi, jouer une mélodie pour une pierre étrange surplombant une rivière révèle [[1]].", {QM_RED, QM_GREEN})); + /*german*/ "Man erzählt sich, daß das #Spielen einer Melodie für einen seltsamen Stein, welcher einen Fluß überblickt#, #[[1]]# enthülle.", + /*french*/ "Selon moi, #jouer une mélodie pour une pierre étrange surplombant une rivière# révèle [[1]].", {QM_RED, QM_GREEN})); hintTextTable[RHT_ZR_NEAR_GROTTOS_GOSSIP_STONE_FAIRY_BIG] = HintText(CustomMessage("They say that #playing a stormy tune for an odd stone overwatching a river# reveals #[[1]]#.", - /*german*/ "!!!", - /*french*/ "Selon moi, jouer une mélodie orageuse pour une pierre étrange surplombant une rivière révèle [[1]].", {QM_RED, QM_GREEN})); + /*german*/ "Man erzählt sich, daß das #Spielen einer stürmischen Melodie für einen seltsamen Stein, welcher einen Fluß überblickt#, #[[1]]# enthülle.", + /*french*/ "Selon moi, #jouer une mélodie orageuse pour une pierre étrange surplombant une rivière# révèle [[1]].", {QM_RED, QM_GREEN})); hintTextTable[RHT_ZR_NEAR_DOMAIN_GOSSIP_STONE_FAIRY] = HintText(CustomMessage("They say that #playing a tune for an odd stone beneath a waterfall# reveals #[[1]]#.", - /*german*/ "!!!", - /*french*/ "Selon moi, jouer une mélodie pour une pierre étrange sous une cascade révèle [[1]].", {QM_RED, QM_GREEN})); + /*german*/ "Man erzählt sich, daß das #Spielen einer Melodie für einen seltsamen Stein unterhalb eines Wasserfalls# #[[1]]# enthülle.", + /*french*/ "Selon moi, #jouer une mélodie pour une pierre étrange sous une cascade# révèle [[1]].", {QM_RED, QM_GREEN})); hintTextTable[RHT_ZR_NEAR_DOMAIN_GOSSIP_STONE_FAIRY_BIG] = HintText(CustomMessage("They say that #playing a stormy tune for an odd stone beneath a waterfall# reveals #[[1]]#.", - /*german*/ "!!!", - /*french*/ "Selon moi, jouer une mélodie orageuse pour une pierre étrange sous une cascade révèle [[1]].", {QM_RED, QM_GREEN})); + /*german*/ "Man erzählt sich, daß das #Spielen einer stürmischen Melodie für einen seltsamen Stein unterhalb eines Wasserfalls# #[[1]]# enthülle.", + /*french*/ "Selon moi, #jouer une mélodie orageuse pour une pierre étrange sous une cascade# révèle [[1]].", {QM_RED, QM_GREEN})); hintTextTable[RHT_HF_COW_GROTTO_GOSSIP_STONE_FAIRY] = HintText(CustomMessage("They say that #playing a tune for an odd stone hiding near a cow# reveals #[[1]]#.", - /*german*/ "!!!", - /*french*/ "Selon moi, jouer une mélodie pour une pierre étrange cachée près d'une vache révèle [[1]].", {QM_RED, QM_GREEN})); + /*german*/ "Man erzählt sich, daß das #Spielen einer Melodie für einen seltsamen Stein, welcher sich nahe einer Kuh versteckt#, #[[1]]# enthülle.", + /*french*/ "Selon moi, #jouer une mélodie pour une pierre étrange cachée près d'une vache# révèle [[1]].", {QM_RED, QM_GREEN})); hintTextTable[RHT_HF_COW_GROTTO_GOSSIP_STONE_FAIRY_BIG] = HintText(CustomMessage("They say that #playing a stormy tune for an odd stone hiding near a cow# reveals #[[1]]#.", - /*german*/ "!!!", - /*french*/ "Selon moi, jouer une mélodie orageuse pour une pierre étrange cachée près d'une vache révèle [[1]].", {QM_RED, QM_GREEN})); + /*german*/ "Man erzählt sich, daß das #Spielen einer stürmischen Melodie für einen seltsamen Stein, welcher sich nahe einer Kuh versteckt#, #[[1]]# enthülle.", + /*french*/ "Selon moi, #jouer une mélodie orageuse pour une pierre étrange cachée près d'une vache# révèle [[1]].", {QM_RED, QM_GREEN})); hintTextTable[RHT_HF_NEAR_MARKET_GROTTO_GOSSIP_STONE_FAIRY] = HintText(CustomMessage("They say that #playing a tune for an odd stone beneath the entrance to the market# reveals #[[1]]#.", - /*german*/ "!!!", - /*french*/ "Selon moi, jouer une mélodie pour une pierre étrange sous l'entrée du marché révèle [[1]].", {QM_RED, QM_GREEN})); + /*german*/ "Man erzählt sich, daß das #Spielen einer Melodie für einen seltsamen Stein unterhalb des Eingangs zum Markt# #[[1]]# enthülle.", + /*french*/ "Selon moi, #jouer une mélodie pour une pierre étrange sous l'entrée du marché# révèle [[1]].", {QM_RED, QM_GREEN})); hintTextTable[RHT_HF_NEAR_MARKET_GROTTO_GOSSIP_STONE_FAIRY_BIG] = HintText(CustomMessage("They say that #playing a stormy tune for an odd stone beneath the entrance to the market# reveals #[[1]]#.", - /*german*/ "!!!", - /*french*/ "Selon moi, jouer une mélodie orageuse pour une pierre étrange sous l'entrée du marché révèle [[1]].", {QM_RED, QM_GREEN})); + /*german*/ "Man erzählt sich, daß das #Spielen einer stürmischen Melodie für einen seltsamen Stein unterhalb des Eingangs zum Markt# #[[1]]# enthülle.", + /*french*/ "Selon moi, #jouer une mélodie orageuse pour une pierre étrange sous l'entrée du marché# révèle [[1]].", {QM_RED, QM_GREEN})); hintTextTable[RHT_HF_SOUTHEAST_GROTTO_GOSSIP_STONE_FAIRY] = HintText(CustomMessage("They say that #playing a tune for an odd stone beneath trees guarded by a Peahat# reveals #[[1]]#.", - /*german*/ "!!!", - /*french*/ "Selon moi, jouer une mélodie pour une pierre étrange sous des arbres gardés par un Peahat révèle [[1]].", {QM_RED, QM_GREEN})); + /*german*/ "Man erzählt sich, daß das #Spielen einer Melodie für einen seltsamen Stein unterhalb von Killeranas bewachten Bäumen# #[[1]]# enthülle.", + /*french*/ "Selon moi, #jouer une mélodie pour une pierre étrange sous des arbres gardés par un Peahat# révèle [[1]].", {QM_RED, QM_GREEN})); hintTextTable[RHT_HF_SOUTHEAST_GROTTO_GOSSIP_STONE_FAIRY_BIG] = HintText(CustomMessage("They say that #playing a stormy tune for an odd stone beneath trees guarded by a Peahat# reveals #[[1]]#.", - /*german*/ "!!!", - /*french*/ "Selon moi, jouer une mélodie orageuse pour une pierre étrange sous des arbres gardés par un Peahat révèle [[1]].", {QM_RED, QM_GREEN})); + /*german*/ "Man erzählt sich, daß das #Spielen einer stürmischen Melodie für einen seltsamen Stein unterhalb von Killeranas bewachten Bäumen# #[[1]]# enthülle.", + /*french*/ "Selon moi, #jouer une mélodie orageuse pour une pierre étrange sous des arbres gardés par un Peahat# révèle [[1]].", {QM_RED, QM_GREEN})); hintTextTable[RHT_KAK_OPEN_GROTTO_GOSSIP_STONE_FAIRY] = HintText(CustomMessage("They say that #playing a tune for an odd stone beneath a village at the base of a mountain# reveals #[[1]]#.", - /*german*/ "!!!", - /*french*/ "Selon moi, jouer une mélodie pour une pierre étrange sous un village au pied d'une montagne révèle [[1]].", {QM_RED, QM_GREEN})); + /*german*/ "Man erzählt sich, daß das #Spielen einer Melodie für einen seltsamen Stein unterhalb eines Dorfes am Fuße eines Berges# #[[1]]# enthülle.", + /*french*/ "Selon moi, #jouer une mélodie pour une pierre étrange sous un village au pied d'une montagne# révèle [[1]].", {QM_RED, QM_GREEN})); hintTextTable[RHT_KAK_OPEN_GROTTO_GOSSIP_STONE_FAIRY_BIG] = HintText(CustomMessage("They say that #playing a stormy tune for an odd stone beneath a village at the base of a mountain# reveals #[[1]]#.", - /*german*/ "!!!", - /*french*/ "Selon moi, jouer une mélodie orageuse pour une pierre étrange sous un village au pied d'une montagne révèle [[1]].", {QM_RED, QM_GREEN})); + /*german*/ "Man erzählt sich, daß das #Spielen einer stürmischen Melodie für einen seltsamen Stein unterhalb eines Dorfes am Fuße eines Berges# #[[1]]# enthülle.", + /*french*/ "Selon moi, #jouer une mélodie orageuse pour une pierre étrange sous un village au pied d'une montagne# révèle [[1]].", {QM_RED, QM_GREEN})); hintTextTable[RHT_ZR_OPEN_GROTTO_GOSSIP_STONE_FAIRY] = HintText(CustomMessage("They say that #playing a tune for an odd stone within a plateau by a river# reveals #[[1]]#.", - /*german*/ "!!!", - /*french*/ "Selon moi, jouer une mélodie pour une pierre étrange dans un plateau près d'une rivière révèle [[1]].", {QM_RED, QM_GREEN})); + /*german*/ "Man erzählt sich, daß das #Spielen einer Melodie für einen seltsamen Stein auf einem Plateau von einem Fluß# #[[1]]# enthülle.", + /*french*/ "Selon moi, #jouer une mélodie pour une pierre étrange dans un plateau près d'une rivière# révèle [[1]].", {QM_RED, QM_GREEN})); hintTextTable[RHT_ZR_OPEN_GROTTO_GOSSIP_STONE_FAIRY_BIG] = HintText(CustomMessage("They say that #playing a stormy tune for an odd stone within a plateau by a river# reveals #[[1]]#.", - /*german*/ "!!!", - /*french*/ "Selon moi, jouer une mélodie orageuse pour une pierre étrange dans un plateau près d'une rivière révèle [[1]].", {QM_RED, QM_GREEN})); + /*german*/ "Man erzählt sich, daß das #Spielen einer stürmischen Melodie für einen seltsamen Stein auf einem Plateau bei einem Fluß# #[[1]]# enthülle.", + /*french*/ "Selon moi, #jouer une mélodie orageuse pour une pierre étrange dans un plateau près d'une rivière# révèle [[1]].", {QM_RED, QM_GREEN})); hintTextTable[RHT_LW_NEAR_SHORTCUTS_GROTTO_GOSSIP_STONE_FAIRY] = HintText(CustomMessage("They say that #playing a tune for an odd stone beneath an escape from the forest# reveals #[[1]]#.", - /*german*/ "!!!", - /*french*/ "Selon moi, jouer une mélodie pour une pierre étrange sous une issue de la forêt révèle [[1]].", {QM_RED, QM_GREEN})); + /*german*/ "Man erzählt sich, daß das #Spielen einer Melodie für einen seltsamen Stein unterhalb eines Auswegs des Waldes# #[[1]]# enthülle.", + /*french*/ "Selon moi, #jouer une mélodie pour une pierre étrange sous une issue de la forêt# révèle [[1]].", {QM_RED, QM_GREEN})); hintTextTable[RHT_LW_NEAR_SHORTCUTS_GROTTO_GOSSIP_STONE_FAIRY_BIG] = HintText(CustomMessage("They say that #playing a stormy tune for an odd stone beneath an escape from the forest# reveals #[[1]]#.", - /*german*/ "!!!", - /*french*/ "Selon moi, jouer une mélodie orageuse pour une pierre étrange sous une issue de la forêt révèle [[1]].", {QM_RED, QM_GREEN})); + /*german*/ "Man erzählt sich, daß das #Spielen einer stürmischen Melodie für einen seltsamen Stein unterhalb eines Auswegs des Waldes# #[[1]]# enthülle.", + /*french*/ "Selon moi, #jouer une mélodie orageuse pour une pierre étrange sous une issue de la forêt# révèle [[1]].", {QM_RED, QM_GREEN})); hintTextTable[RHT_DMT_STORMS_GROTTO_GOSSIP_STONE_FAIRY] = HintText(CustomMessage("They say that #playing a tune for an odd stone beneath the entrance to a village within a mountain# reveals #[[1]]#.", - /*german*/ "!!!", - /*french*/ "Selon moi, jouer une mélodie pour une pierre étrange sous l'entrée d'un village dans une montagne révèle [[1]].", {QM_RED, QM_GREEN})); + /*german*/ "Man erzählt sich, daß das #Spielen einer Melodie für einen seltsamen Stein unterhalb eines Eingangs zu einem Dorf innerhalb eines Berges# #[[1]]# enthülle.", + /*french*/ "Selon moi, #jouer une mélodie pour une pierre étrange sous l'entrée d'un village dans une montagne# révèle [[1]].", {QM_RED, QM_GREEN})); hintTextTable[RHT_DMT_STORMS_GROTTO_GOSSIP_STONE_FAIRY_BIG] = HintText(CustomMessage("They say that #playing a stormy tune for an odd stone beneath the entrance to a village within a mountain# reveals #[[1]]#.", - /*german*/ "!!!", - /*french*/ "Selon moi, jouer une mélodie orageuse pour une pierre étrange sous l'entrée d'un village dans une montagne révèle [[1]].", {QM_RED, QM_GREEN})); + /*german*/ "Man erzählt sich, daß das #Spielen einer stürmischen Melodie für einen seltsamen Stein unterhalb eines Eingangs zu einem Dorf innerhalb eines Berges# #[[1]]# enthülle.", + /*french*/ "Selon moi, #jouer une mélodie orageuse pour une pierre étrange sous l'entrée d'un village dans une montagne# révèle [[1]].", {QM_RED, QM_GREEN})); hintTextTable[RHT_DMC_UPPER_GROTTO_GOSSIP_STONE_FAIRY] = HintText(CustomMessage("They say that #playing a tune for an odd stone within the side of a crater# reveals #[[1]]#.", - /*german*/ "!!!", - /*french*/ "Selon moi, jouer une mélodie pour une pierre étrange dans le côté d'un cratère révèle [[1]].", {QM_RED, QM_GREEN})); + /*german*/ "Man erzählt sich, daß das #Spielen einer Melodie für einen seltsamen Stein innerhalb der Seite eines Kraters# #[[1]]# enthülle.", + /*french*/ "Selon moi, #jouer une mélodie pour une pierre étrange dans le côté d'un cratère# révèle [[1]].", {QM_RED, QM_GREEN})); hintTextTable[RHT_DMC_UPPER_GROTTO_GOSSIP_STONE_FAIRY_BIG] = HintText(CustomMessage("They say that #playing a stormy tune for an odd stone within the side of a crater# reveals #[[1]]#.", - /*german*/ "!!!", - /*french*/ "Selon moi, jouer une mélodie orageuse pour une pierre étrange dans le côté d'un cratère révèle [[1]].", {QM_RED, QM_GREEN})); + /*german*/ "Man erzählt sich, daß das #Spielen einer stürmischen Melodie für einen seltsamen Stein innerhalb der Seite eines Kraters# #[[1]]# enthülle.", + /*french*/ "Selon moi, #jouer une mélodie orageuse pour une pierre étrange dans le côté d'un cratère# révèle [[1]].", {QM_RED, QM_GREEN})); - hintTextTable[RHT_LH_ISLAND_SUN_FAIRY] = HintText(CustomMessage("They say that #summoning the sun on the lake's island# calls #[[1]]#.", {QM_RED, QM_GREEN})); + hintTextTable[RHT_LH_ISLAND_SUN_FAIRY] = HintText(CustomMessage("They say that #summoning the sun on the lake's island# calls #[[1]]#.", + /*german*/ "Man erzählt sich, daß das #Beschwören der Sonne auf der Insel eines Sees# #[[1]]# anrufe.", + /*french*/ "Selon moi, #appeler le soleil sur l'île du lac # révèle #[[1]]#.", {QM_RED, QM_GREEN})); - hintTextTable[RHT_HF_POND_STORMS_FAIRY] = HintText(CustomMessage("They say that #calling rain to the field's pond# summons #[[1]]#.", {QM_RED, QM_GREEN})); + hintTextTable[RHT_HF_POND_STORMS_FAIRY] = HintText(CustomMessage("They say that #calling rain to the field's pond# summons #[[1]]#.", + /*german*/ "Man erzählt sich, daß das #Anrufen des Regens für den Tümpel eines Feldes# #[[1]]# beschwöre.", + /*french*/ "Selon moi, #jouer une mélodie orageuse dans l'étang d'une plaine# révèle #[[1]]#.", {QM_RED, QM_GREEN})); - hintTextTable[RHT_HF_FENCE_GROTTO_STORMS_FAIRY] = HintText(CustomMessage("They say that #making it rain in a scrub's cave# wakes #[[1]]#.", {QM_RED, QM_GREEN})); + hintTextTable[RHT_HF_FENCE_GROTTO_STORMS_FAIRY] = HintText(CustomMessage("They say that #making it rain in a scrub's cave# wakes #[[1]]#.", + /*german*/ "Man erzählt sich, daß das #Machen von Regen in der Höhle eines Dekus# #[[1]]# erwecke.", + /*french*/ "Selon moi, #jouer une mélodie orageuse dans la grotte d'une Peste Mojo# révèle #[[1]]#.", {QM_RED, QM_GREEN})); - hintTextTable[RHT_DMT_FLAG_SUN_FAIRY] = HintText(CustomMessage("They say that #changing the time in front of the trail's flag# reveals #[[1]]#.", {QM_RED, QM_GREEN})); + hintTextTable[RHT_DMT_FLAG_SUN_FAIRY] = HintText(CustomMessage("They say that #changing the time in front of the trail's flag# reveals #[[1]]#.", + /*german*/ "Man erzählt sich, daß das #Verändern der Zeit im Angesicht der Flagge eines Pfades# #[[1]]# enthülle.", + /*french*/ "Selon moi, #appeler le soleil devant un drapeau du Mont du Péril # révèle #[[1]]#.", {QM_RED, QM_GREEN})); - hintTextTable[RHT_DMT_COW_GROTTO_STORMS_FAIRY] = HintText(CustomMessage("They say that #calling a storm for a lonely cow# reveals #[[1]]#.", {QM_RED, QM_GREEN})); + hintTextTable[RHT_DMT_COW_GROTTO_STORMS_FAIRY] = HintText(CustomMessage("They say that #calling a storm for a lonely cow# reveals #[[1]]#.", + /*german*/ "Man erzählt sich, daß das #Anrufen eines Sturms für eine einsame Kuh# #[[1]]# enthülle.", + /*french*/ "Selon moi, #jouer une mélodie orageuse pour une vache solitaire# révèle #[[1]]#.", {QM_RED, QM_GREEN})); - hintTextTable[RHT_LW_SHORTCUT_STORMS_FAIRY] = HintText(CustomMessage("They say that #making it rain in the Lost Woods# reveals #[[1]]#.", {QM_RED, QM_GREEN})); + hintTextTable[RHT_LW_SHORTCUT_STORMS_FAIRY] = HintText(CustomMessage("They say that #making it rain in the Lost Woods# reveals #[[1]]#.", + /*german*/ "Man erzählt sich, daß das #Machen von Regen in den verlorenen Wäldern# #[[1]]# enthülle.", + /*french*/ "Selon moi, #jouer une mélodie orageuse dans les Bois Perdus# révèle #[[1]]#.", {QM_RED, QM_GREEN})); - hintTextTable[RHT_GF_KITCHEN_SUN_FAIRY] = HintText(CustomMessage("They say that #calling the sun in a guarded kitchen# exposes #[[1]]#.", {QM_RED, QM_GREEN})); + hintTextTable[RHT_GF_KITCHEN_SUN_FAIRY] = HintText(CustomMessage("They say that #calling the sun in a guarded kitchen# exposes #[[1]]#.", + /*german*/ "Man erzählt sich, daß das #Anrufen der Sonne in einer bewachten Küche# #[[1]]# freilege.", + /*french*/ "Selon moi, #appeler le soleil dans une cuisine gardée# révèle #[[1]]#.", {QM_RED, QM_GREEN})); - hintTextTable[RHT_LW_DEKU_SCRUB_GROTTO_SUN_FAIRY] = HintText(CustomMessage("They say that #calling the sun for scrubs in the Lost Woods# reveals #[[1]]#.", { QM_RED, QM_GREEN })); + hintTextTable[RHT_LW_DEKU_SCRUB_GROTTO_SUN_FAIRY] = HintText(CustomMessage("They say that #calling the sun for scrubs in the Lost Woods# reveals #[[1]]#.", + /*german*/ "Man erzählt sich, daß das #Anrufen der Sonne für Dekus in den verlorenen Wäldern# #[[1]]# enthülle.", + /*french*/ "Selon moi, #appeler le soleil pour les Pestes dans les Bois Perdus # révèle #[[1]]#.", {QM_RED, QM_GREEN})); - hintTextTable[RHT_GRAVEYARD_ROYAL_FAMILYS_TOMB_SUN_FAIRY] = HintText(CustomMessage("They say that #calling the sun in a royal tomb# reveals #[[1]]#.", { QM_RED, QM_GREEN })); + hintTextTable[RHT_GRAVEYARD_ROYAL_FAMILYS_TOMB_SUN_FAIRY] = HintText(CustomMessage("They say that #calling the sun in a royal tomb# reveals #[[1]]#.", + /*german*/ "Man erzählt sich, daß das #Anrufen der Sonne in einer königlichen Gruft# #[[1]]# enthülle.", + /*french*/ "Selon moi, #appeler le soleil dans une tombe royale# révèle #[[1]]#.", {QM_RED, QM_GREEN})); - hintTextTable[RHT_KF_GRASS] = HintText(CustomMessage("They say that #cutting some grass in a forest# reveals #[[1]]#.", { QM_RED, QM_GREEN })); + hintTextTable[RHT_KF_GRASS] = HintText(CustomMessage("They say that #cutting some grass in a forest# reveals #[[1]]#.", + /*german*/ "Man erzählt sich, daß das #Schneiden einiger Gräser in einem Wald# #[[1]]# enthülle.", + /*french*/ "Selon moi, de l'#herbe dans un fôret# cache #[[1]]#.", {QM_RED, QM_GREEN})); - hintTextTable[RHT_LW_GRASS] = HintText(CustomMessage("They say that #cutting some grass in the woods# reveals #[[1]]#.", { QM_RED, QM_GREEN })); + hintTextTable[RHT_LW_GRASS] = HintText(CustomMessage("They say that #cutting some grass in the woods# reveals #[[1]]#.", + /*german*/ "Man erzählt sich, daß das #Schneiden einiger Gräser in den Wäldern# #[[1]]# enthülle.", + /*french*/ "Selon moi, de l'#herbe dans des bois# cache #[[1]]#.", {QM_RED, QM_GREEN})); - hintTextTable[RHT_MARKET_GRASS] = HintText(CustomMessage("They say that #cutting some grass in the market# reveals #[[1]]#.", { QM_RED, QM_GREEN })); + hintTextTable[RHT_MARKET_GRASS] = HintText(CustomMessage("They say that #cutting some grass in the market# reveals #[[1]]#.", + /*german*/ "Man erzählt sich, daß das #Schneiden einiger Gräser auf dem Markt# #[[1]]# enthülle.", + /*french*/ "Selon moi, de l'#herbe dans un marché# cache #[[1]]#.", {QM_RED, QM_GREEN})); - hintTextTable[RHT_HC_GRASS] = HintText(CustomMessage("They say that #cutting some grass near the castle# reveals #[[1]]#.", { QM_RED, QM_GREEN })); + hintTextTable[RHT_HC_GRASS] = HintText(CustomMessage("They say that #cutting some grass near the castle# reveals #[[1]]#.", + /*german*/ "Man erzählt sich, daß das #Schneiden einiger Gräser in der Nähe vom Schloß# #[[1]]# enthülle.", + /*french*/ "Selon moi, de l'#herbe près du château# cache #[[1]]#.", {QM_RED, QM_GREEN})); - hintTextTable[RHT_KAK_GRASS] = HintText(CustomMessage("They say that #cutting some grass in a village# reveals #[[1]]#.", { QM_RED, QM_GREEN })); + hintTextTable[RHT_KAK_GRASS] = HintText(CustomMessage("They say that #cutting some grass in a village# reveals #[[1]]#.", + /*german*/ "Man erzählt sich, daß das #Schneiden einiger Gräser in einem Dorf# #[[1]]# enthülle.", + /*french*/ "Selon moi, de l'#herbe dans un village# cache #[[1]]#.", {QM_RED, QM_GREEN})); - hintTextTable[RHT_GY_GRASS] = HintText(CustomMessage("They say that #cutting some grass in a graveyard# reveals #[[1]]#.", { QM_RED, QM_GREEN })); + hintTextTable[RHT_GY_GRASS] = HintText(CustomMessage("They say that #cutting some grass in a graveyard# reveals #[[1]]#.", + /*german*/ "Man erzählt sich, daß das #Schneiden einiger Gräser auf einem Friedhof# #[[1]]# enthülle.", + /*french*/ "Selon moi, de l'#herbe dans un cimetère# cache #[[1]]#.", {QM_RED, QM_GREEN})); - hintTextTable[RHT_LH_GRASS] = HintText(CustomMessage("They say that #cutting some grass near a lake# reveals #[[1]]#.", { QM_RED, QM_GREEN })); + hintTextTable[RHT_LH_GRASS] = HintText(CustomMessage("They say that #cutting some grass near a lake# reveals #[[1]]#.", + /*german*/ "Man erzählt sich, daß das #Schneiden einiger Gräser nahe eines Sees# #[[1]]# enthülle.", + /*french*/ "Selon moi, de l'#herbe près d'un lac# cache #[[1]]#.", {QM_RED, QM_GREEN})); - hintTextTable[RHT_HF_GRASS] = HintText(CustomMessage("They say that #cutting some grass on a field# reveals #[[1]]#.", { QM_RED, QM_GREEN })); + hintTextTable[RHT_HF_GRASS] = HintText(CustomMessage("They say that #cutting some grass on a field# reveals #[[1]]#.", + /*german*/ "Man erzählt sich, daß das #Schneiden einiger Gräser auf einem Feld# #[[1]]# enthülle.", + /*french*/ "Selon moi, de l'#herbe dans une plaine# cache #[[1]]#.", {QM_RED, QM_GREEN})); - hintTextTable[RHT_ZR_GRASS] = HintText(CustomMessage("They say that #cutting some grass near a river# reveals #[[1]]#.", { QM_RED, QM_GREEN })); + hintTextTable[RHT_ZR_GRASS] = HintText(CustomMessage("They say that #cutting some grass near a river# reveals #[[1]]#.", + /*german*/ "Man erzählt sich, daß das #Schneiden einiger Gräser in der Nähe von einem Fluß# #[[1]]# enthülle.", + /*french*/ "Selon moi, de l'#herbe près d'une rivière# cache #[[1]]#.", {QM_RED, QM_GREEN})); - hintTextTable[RHT_GROTTO_GRASS] = HintText(CustomMessage("They say that #cutting some grass in a grotto# reveals #[[1]]#.", { QM_RED, QM_GREEN })); + hintTextTable[RHT_GROTTO_GRASS] = HintText(CustomMessage("They say that #cutting some grass in a grotto# reveals #[[1]]#.", + /*german*/ "Man erzählt sich, daß das #Schneiden einiger Gräser in einer Grotte# #[[1]]# enthülle.", + /*french*/ "Selon moi, de l'#herbe# cache #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_CRATE_GERUDO_VALLEY] = HintText(CustomMessage("They say that a #crate in Gerudo Valley# contains #[[1]]#.", - /*german*/ "", - /*french*/ "Selon moi, une #caisse dans une vallée# a #[[1]]#.", { QM_RED, QM_GREEN })); + /*german*/ "Man erzählt sich, daß eine #Kiste im Gerudotal# #[[1]]# enthielte.", + /*french*/ "Selon moi, une #caisse dans une vallée# a #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_CRATE_GERUDOS_FORTRESS] = HintText(CustomMessage("They say that a #crate in Gerudo Fortress# contains #[[1]]#.", - /*german*/ "", - /*french*/ "Selon moi, une #caisse dans la Forteresse Gerudo# contient #[[1]]#.", { QM_RED, QM_GREEN })); + /*german*/ "Man erzählt sich, daß eine #Kiste in der Gerudofestung# #[[1]]# enthielte.", + /*french*/ "Selon moi, une #caisse dans la Forteresse Gerudo# contient #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_CRATE_WASTELAND] = HintText(CustomMessage("They say that a #crate in Haunted Wasteland# contains #[[1]]#.", - /*german*/ "", - /*french*/ "Selon moi, une #caisse dans le Désert Hanté# contient #[[1]]#.", { QM_RED, QM_GREEN })); + /*german*/ "Man erzählt sich, daß eine #Kiste im Gerudotal# #[[1]]# enthielte.", + /*french*/ "Selon moi, une #caisse dans le Désert Hanté# contient #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_CRATE_MARKET] = HintText(CustomMessage("They say that a #crate in the Market# contains #[[1]]#.", - /*german*/ "", - /*french*/ "Selon moi, une #caisse dans la Place du Marché# contient #[[1]]#.", { QM_RED, QM_GREEN })); + /*german*/ "Man erzählt sich, daß eine #Kiste in der Gespensterwüste# #[[1]]# enthielte.", + /*french*/ "Selon moi, une #caisse dans la Place du Marché# contient #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_CRATE_KAKARIKO_VILLAGE] = HintText(CustomMessage("They say that a #crate in Kakariko Village# contains #[[1]]#.", - /*german*/ "", - /*french*/ "Selon moi, une #caisse dans le Village de Cocorico# contient #[[1]]#.", { QM_RED, QM_GREEN })); + /*german*/ "Man erzählt sich, daß eine #Kiste im Dorf von Kakariko# #[[1]]# enthielte.", + /*french*/ "Selon moi, une #caisse dans le Village de Cocorico# contient #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_CRATE_GRAVEYARD] = HintText(CustomMessage("They say that a #crate in the Graveyard# contains #[[1]]#.", - /*german*/ "", - /*french*/ "Selon moi, une #caisse dans le Cimetière# contient #[[1]]#.", { QM_RED, QM_GREEN })); + /*german*/ "Man erzählt sich, daß eine #Kiste auf dem Friedhof# #[[1]]# enthielte.", + /*french*/ "Selon moi, une #caisse dans le Cimetière# contient #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_CRATE_GORON_CITY] = HintText(CustomMessage("They say that a #crate in Goron City# contains #[[1]]#.", - /*german*/ "", - /*french*/ "Selon moi, une #caisse dans le Village Goron# contient #[[1]]#.", { QM_RED, QM_GREEN })); + /*german*/ "Man erzählt sich, daß eine #Kiste in Goronia# #[[1]]# enthielte.", + /*french*/ "Selon moi, une #caisse dans le Village Goron# contient #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_CRATE_DEATH_MOUNTAIN_CRATER] = HintText(CustomMessage("They say that a #crate in Death Mountain Crater# contains #[[1]]#.", - /*german*/ "", - /*french*/ "Selon moi, une #caisse sur le Mont du Péril# contient #[[1]]#.", { QM_RED, QM_GREEN })); + /*german*/ "Man erzählt sich, daß eine #Kiste im Todeskrater# #[[1]]# enthielte.", + /*french*/ "Selon moi, une #caisse sur le Mont du Péril# contient #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_CRATE_LON_LON_RANCH] = HintText(CustomMessage("They say that a #crate in Lon Lon Ranch# contains #[[1]]#.", - /*german*/ "", - /*french*/ "Selon moi, une #caisse dans le Ranch Lon Lon# contient #[[1]]#.", { QM_RED, QM_GREEN })); + /*german*/ "Man erzählt sich, daß eine #Kiste auf der Lon Lon-Farm# #[[1]]# enthielte.", + /*french*/ "Selon moi, une #caisse dans le Ranch Lon Lon# contient #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_CRATE_LAKESIDE_LABORATORY] = HintText(CustomMessage("They say that a #crate in the Laboratory# contains #[[1]]#.", - /*german*/ "", - /*french*/ "Selon moi, une #caisse dans un laboratoire# contient #[[1]]#.", { QM_RED, QM_GREEN })); + /*german*/ "Man erzählt sich, daß eine #Kiste im Laboratorium# #[[1]]# enthielte.", + /*french*/ "Selon moi, une #caisse dans un laboratoire# contient #[[1]]#.", {QM_RED, QM_GREEN})); // clang-format on } diff --git a/soh/soh/Enhancements/randomizer/3drando/hint_list/hint_list_item.cpp b/soh/soh/Enhancements/randomizer/3drando/hint_list/hint_list_item.cpp index c9430baea..5afa0f847 100644 --- a/soh/soh/Enhancements/randomizer/3drando/hint_list/hint_list_item.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/hint_list/hint_list_item.cpp @@ -1962,69 +1962,69 @@ void StaticData::HintTable_Init_Item() { CustomMessage("a gold fragment", /*german*/"ein goldenes Fragment", /*french*/"un fragment d'or")}); // /*spanish*/un fragmento dorado - hintTextTable[RHT_GOHMA_SOUL] = HintText(CustomMessage("the soul of Gohma", /*german*/"die Seele Gohmas", /*french*/""), + hintTextTable[RHT_GOHMA_SOUL] = HintText(CustomMessage("the soul of Gohma", /*german*/"die Seele Gohmas", /*french*/"l'Âme de Gohma"), { - CustomMessage("something webbed", /*german*/"etwas Verwobenes", /*french*/"") + CustomMessage("something webbed", /*german*/"etwas Verwobenes", /*french*/"un truc entoilé") }, { - CustomMessage("an invasive soul", /*german*/"eine invasive Seele", /*french*/""), - CustomMessage("some spider essence", /*german*/"etwas spinnenartige Essenz", /*french*/"")}); + CustomMessage("an invasive soul", /*german*/"eine invasive Seele", /*french*/"une âme invasive"), + CustomMessage("some spider essence", /*german*/"etwas spinnenartige Essenz", /*french*/"une essence d'araignée")}); - hintTextTable[RHT_KING_DODONGO_SOUL] = HintText(CustomMessage("the soul of King Dodongo", /*german*/"die Seele König Dodongos", /*french*/""), + hintTextTable[RHT_KING_DODONGO_SOUL] = HintText(CustomMessage("the soul of King Dodongo", /*german*/"die Seele König Dodongos", /*french*/"l'Âme du Roi Dodongo"), { - CustomMessage("something explosive", /*german*/"etwas Explosives", /*french*/"") + CustomMessage("something explosive", /*german*/"etwas Explosives", /*french*/"un truc détonnant") }, { - CustomMessage("a royal soul", /*german*/"eine royale Seele", /*french*/""), - CustomMessage("some reptile essence", /*german*/"etwas reptilienartige Essenz", /*french*/"")}); + CustomMessage("a royal soul", /*german*/"eine royale Seele", /*french*/"une âme royale"), + CustomMessage("some reptile essence", /*german*/"etwas reptilienartige Essenz", /*french*/"une essence de reptile")}); - hintTextTable[RHT_BARINADE_SOUL] = HintText(CustomMessage("the soul of Barinade", /*german*/"die Seele Barinades", /*french*/""), + hintTextTable[RHT_BARINADE_SOUL] = HintText(CustomMessage("the soul of Barinade", /*german*/"die Seele Barinades", /*french*/"l'Âme de Barinade"), { - CustomMessage("something fishy", /*german*/"etwas Fischiges", /*french*/"") + CustomMessage("something fishy", /*german*/"etwas Fischiges", /*french*/"un truc gluant") }, { - CustomMessage("an infectuous soul", /*german*/"eine infektiöse Seele", /*french*/""), - CustomMessage("some parasitic essence", /*german*/"etwas parasitäre Essenz", /*french*/"")}); + CustomMessage("an infectuous soul", /*german*/"eine infektiöse Seele", /*french*/"une âme infectieuse"), + CustomMessage("some parasitic essence", /*german*/"etwas parasitäre Essenz", /*french*/"une essence parasitique")}); - hintTextTable[RHT_PHANTOM_GANON_SOUL] = HintText(CustomMessage("the soul of Phantom Ganon", /*german*/"die Seele Phantom-Ganons", /*french*/""), + hintTextTable[RHT_PHANTOM_GANON_SOUL] = HintText(CustomMessage("the soul of Phantom Ganon", /*german*/"die Seele Phantom-Ganons", /*french*/"l'Âme de Ganon Spectral"), { - CustomMessage("something spectral", /*german*/"etwas Spektrales", /*french*/"") + CustomMessage("something spectral", /*german*/"etwas Spektrales", /*french*/"un truc spectral") }, { - CustomMessage("a duplicate soul", /*german*/"eine duplizierte Seele", /*french*/""), + CustomMessage("a duplicate soul", /*german*/"eine duplizierte Seele", /*french*/"une âme clonée"), - CustomMessage("some illusionary essence", /*german*/"etwas illusionäre Essenz", /*french*/"")}); + CustomMessage("some illusionary essence", /*german*/"etwas illusionäre Essenz", /*french*/"une essence illusoire")}); - hintTextTable[RHT_VOLVAGIA_SOUL] = HintText(CustomMessage("the soul of Volvagia", /*german*/"die Seele Volvagias", /*french*/""), + hintTextTable[RHT_VOLVAGIA_SOUL] = HintText(CustomMessage("the soul of Volvagia", /*german*/"die Seele Volvagias", /*french*/"l'Âme de Volcania"), { - CustomMessage("something hot", /*german*/"etwas Heißes", /*french*/"") + CustomMessage("something hot", /*german*/"etwas Heißes", /*french*/"quelque chose de très chaud") }, { - CustomMessage("a draconic soul", /*german*/"eine drakonische Seele", /*french*/""), - CustomMessage("some magmatic essence", /*german*/"etwas magmatische Essenz", /*french*/"")}); + CustomMessage("a draconic soul", /*german*/"eine drakonische Seele", /*french*/"une essence draconique"), + CustomMessage("some magmatic essence", /*german*/"etwas magmatische Essenz", /*french*/"une essence magmatique")}); - hintTextTable[RHT_MORPHA_SOUL] = HintText(CustomMessage("the soul of Morpha", /*german*/"die Seele Morphas", /*french*/""), + hintTextTable[RHT_MORPHA_SOUL] = HintText(CustomMessage("the soul of Morpha", /*german*/"die Seele Morphas", /*french*/"l'Âme de Morpha"), { - CustomMessage("something wet", /*german*/"etwas Nasses", /*french*/"") + CustomMessage("something wet", /*german*/"etwas Nasses", /*french*/"un truc mouillé") }, { - CustomMessage("an aquatic soul", /*german*/"eine aquatische Seele", /*french*/""), - CustomMessage("some liquid essence", /*german*/"etwas flüssige Essenz", /*french*/"")}); + CustomMessage("an aquatic soul", /*german*/"eine aquatische Seele", /*french*/"une âme aquatique"), + CustomMessage("some liquid essence", /*german*/"etwas flüssige Essenz", /*french*/"une essence liquide")}); - hintTextTable[RHT_BONGO_BONGO_SOUL] = HintText(CustomMessage("the soul of Bongo Bongo", /*german*/"die Seele Bongo Bongos", /*french*/""), + hintTextTable[RHT_BONGO_BONGO_SOUL] = HintText(CustomMessage("the soul of Bongo Bongo", /*german*/"die Seele Bongo Bongos", /*french*/"l'Âme de Bongo Bongo"), { - CustomMessage("something dark", /*german*/"etwas Dunkles", /*french*/"") + CustomMessage("something dark", /*german*/"etwas Dunkles", /*french*/"quelque chose de sombre") }, { - CustomMessage("a shadowy soul", /*german*/"eine schattige Seele", /*french*/""), - CustomMessage("some handy essence", /*german*/"etwas praktische Essenz", /*french*/"")}); + CustomMessage("a shadowy soul", /*german*/"eine schattige Seele", /*french*/"une âme ténébreuse"), + CustomMessage("some handy essence", /*german*/"etwas praktische Essenz", /*french*/"l'âme du tape m'en cinq")}); - hintTextTable[RHT_TWINROVA_SOUL] = HintText(CustomMessage("the soul of Twinrova", /*german*/"die Seele Twinrovas", /*french*/""), + hintTextTable[RHT_TWINROVA_SOUL] = HintText(CustomMessage("the soul of Twinrova", /*german*/"die Seele Twinrovas", /*french*/"l'Âme du Duo Maléfique"), { - CustomMessage("something spiritual", /*german*/"etwas Spirituelles", /*french*/"") + CustomMessage("something spiritual", /*german*/"etwas Spirituelles", /*french*/"un truc spirituel") }, { - CustomMessage("old souls", /*german*/"alte Seelen", /*french*/""), - CustomMessage("twin essences", /*german*/"Zwillingsessenzen", /*french*/"")}); + CustomMessage("old souls", /*german*/"alte Seelen", /*french*/"deux vieilles âmes"), + CustomMessage("twin essences", /*german*/"Zwillingsessenzen", /*french*/"des essences jumelles")}); - hintTextTable[RHT_GANON_SOUL] = HintText(CustomMessage("the soul of Ganon", /*german*/"die Seele Ganons", /*french*/""), + hintTextTable[RHT_GANON_SOUL] = HintText(CustomMessage("the soul of Ganon", /*german*/"die Seele Ganons", /*french*/"l'Âme de Ganon"), { - CustomMessage("something strong", /*german*/"etwas Starkes", /*french*/"") + CustomMessage("something strong", /*german*/"etwas Starkes", /*french*/"un truc de fort") }, { - CustomMessage("an evil soul", /*german*/"eine böse Seele", /*french*/""), - CustomMessage("some powerful essence", /*german*/"etwas mächtige Essenz", /*french*/"")}); + CustomMessage("an evil soul", /*german*/"eine böse Seele", /*french*/"une âme maléfique"), + CustomMessage("some powerful essence", /*german*/"etwas mächtige Essenz", /*french*/"une essence incroyablement puissante")}); hintTextTable[RHT_OCARINA_A_BUTTON] = HintText(CustomMessage("an Ocarina A Button", /*german*/"eine Okarina A Taste", /*french*/"la Touche A de l'Ocarina"), // /*spanish*/un botón A de Ocarina @@ -2098,53 +2098,22 @@ void StaticData::HintTable_Init_Item() { { CustomMessage("a master unlocker", /*german*/ "ein Meisterentsperrer", /*french*/ "un Kit de Déverrouillage") }); // /*spanish*/un desbloqueador maestro - hintTextTable[RHT_QUIVER_INF] = HintText(CustomMessage("an infinite Quiver", /*german*/"ein unendlicher Köcher", /*french*/"un Carquois Infini"), - { - CustomMessage("", /*german*/"!!!", /*french*/"!!!"), - }, { - CustomMessage("", /*german*/"!!!", /*french*/"!!!")}); + //RANDOTODO if these are ever used for anything other than name, they want abscure and ambiguous hints + hintTextTable[RHT_QUIVER_INF] = HintText(CustomMessage("an infinite Quiver", /*german*/"ein unendlicher Köcher", /*french*/"un Carquois Infini")); - hintTextTable[RHT_BOMB_BAG_INF] = HintText(CustomMessage("an infinite Bomb Bag", /*german*/"eine unendliche Bombentasche", /*french*/"un Sac de Bombe sans fond"), - { - CustomMessage("", /*german*/"!!!", /*french*/"!!!"), - }, { - CustomMessage("", /*german*/"!!!", /*french*/"!!!")}); + hintTextTable[RHT_BOMB_BAG_INF] = HintText(CustomMessage("an infinite Bomb Bag", /*german*/"eine unendliche Bombentasche", /*french*/"un Sac de Bombe sans fond")); - hintTextTable[RHT_BULLET_BAG_INF] = HintText(CustomMessage("an infinite Bullet Bag", /*german*/"eine unendliche Samentasche", /*french*/"un Sac de Graine sans fond"), - { - CustomMessage("", /*german*/"!!!", /*french*/"!!!"), - }, { - CustomMessage("", /*german*/"!!!", /*french*/"!!!")}); + hintTextTable[RHT_BULLET_BAG_INF] = HintText(CustomMessage("an infinite Bullet Bag", /*german*/"eine unendliche Samentasche", /*french*/"un Sac de Graine sans fond")); - hintTextTable[RHT_STICK_UPGRADE_INF] = HintText(CustomMessage("infinite Deku Sticks", /*german*/"unendliche Deku-Stäbe", /*french*/"des Bâtons Mojo illimités"), - { - CustomMessage("", /*german*/"!!!", /*french*/"!!!"), - }, { - CustomMessage("", /*german*/"!!!", /*french*/"!!!")}); + hintTextTable[RHT_STICK_UPGRADE_INF] = HintText(CustomMessage("infinite Deku Sticks", /*german*/"unendliche Deku-Stäbe", /*french*/"des Bâtons Mojo illimités")); - hintTextTable[RHT_NUT_UPGRADE_INF] = HintText(CustomMessage("infinite Deku Nuts", /*german*/"unendliche Deku-Nüsse", /*french*/"des Noix Mojo illimitées"), - { - CustomMessage("", /*german*/"!!!", /*french*/"!!!"), - }, { - CustomMessage("", /*german*/"!!!", /*french*/"!!!")}); + hintTextTable[RHT_NUT_UPGRADE_INF] = HintText(CustomMessage("infinite Deku Nuts", /*german*/"unendliche Deku-Nüsse", /*french*/"des Noix Mojo illimitées")); - hintTextTable[RHT_MAGIC_INF] = HintText(CustomMessage("unlimited Magic", /*german*/"unendliche Magie", /*french*/"de la Magie infinie"), - { - CustomMessage("", /*german*/"!!!", /*french*/"!!!"), - }, { - CustomMessage("", /*german*/"!!!", /*french*/"!!!")}); + hintTextTable[RHT_MAGIC_INF] = HintText(CustomMessage("unlimited Magic", /*german*/"unendliche Magie", /*french*/"de la Magie infinie")); - hintTextTable[RHT_BOMBCHU_INF] = HintText(CustomMessage("infinite Bombchus", /*german*/"unendliche Krabbelminen", /*french*/"des Missiles Teigneux illimités"), - { - CustomMessage("", /*german*/"!!!", /*french*/"!!!"), - }, { - CustomMessage("", /*german*/"!!!", /*french*/"!!!")}); + hintTextTable[RHT_BOMBCHU_INF] = HintText(CustomMessage("infinite Bombchus", /*german*/"unendliche Krabbelminen", /*french*/"des Missiles Teigneux illimités")); - hintTextTable[RHT_WALLET_INF] = HintText(CustomMessage("an infinite Wallet", /*german*/"eine unendliche Geldbörse", /*french*/"une Bourse sans fond"), - { - CustomMessage("", /*german*/"!!!", /*french*/"!!!"), - }, { - CustomMessage("", /*german*/"!!!", /*french*/"!!!")}); + hintTextTable[RHT_WALLET_INF] = HintText(CustomMessage("an infinite Wallet", /*german*/"eine unendliche Geldbörse", /*french*/"une Bourse sans fond")); hintTextTable[RHT_EPONA] = HintText(CustomMessage("Epona", /*german*/"Epona", /*french*/"Epona"), // /*spanish*/a Epona diff --git a/soh/soh/Enhancements/randomizer/3drando/hints.cpp b/soh/soh/Enhancements/randomizer/3drando/hints.cpp index c55145fcd..8e928185f 100644 --- a/soh/soh/Enhancements/randomizer/3drando/hints.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/hints.cpp @@ -835,7 +835,7 @@ void CreateGanondorfJoke() { void CreateGanondorfHint() { auto ctx = Rando::Context::GetInstance(); if (ctx->GetOption(RSK_GANONDORF_HINT) && !ctx->GetHint(RH_GANONDORF_HINT)->IsEnabled()) { - if (ctx->GetOption(RSK_SHUFFLE_MASTER_SWORD)) { + if (ctx->GetOption(RSK_SHUFFLE_MASTER_SWORD) && ctx->GetOption(RSK_STARTING_MASTER_SWORD).Is(RO_GENERIC_OFF)) { CreateStaticItemHint( RH_GANONDORF_HINT, { RHT_GANONDORF_HINT_LA_ONLY, RHT_GANONDORF_HINT_MS_ONLY, RHT_GANONDORF_HINT_LA_AND_MS }, diff --git a/soh/soh/Enhancements/randomizer/3drando/shops.cpp b/soh/soh/Enhancements/randomizer/3drando/shops.cpp index 8224865ac..110ab8a76 100644 --- a/soh/soh/Enhancements/randomizer/3drando/shops.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/shops.cpp @@ -759,7 +759,7 @@ void InitTrickNames() { trickNameTable[RG_RECOVERY_HEART] = { Text{ "Love", "Bisou", "Te amo" }, Text{ "Life", "Vie", "vida" }, - Text{ "HP", "VP", "VP" }, + Text{ "HP", "PV", "VP" }, }; trickNameTable[RG_GREEN_RUPEE] = { Text{ "False Greg", "Faux Greg", "Falso Greg" }, Text{ "One Ruby", "Un rubis", "Un rubí" }, @@ -779,15 +779,15 @@ void InitTrickNames() { Text{ "Rupee (20)", "Rubis (20)", "Peso hyliano" }, }; trickNameTable[RG_PURPLE_RUPEE] = { - Text{ "Purpee", "pourbi", "morupiua" }, - Text{ "Fifty Rubies", "cinquante rubis", "Cincuenta rubíes" }, + Text{ "Purpee", "Pourbi", "morupiua" }, + Text{ "Fifty Rubies", "Cinquante rubis", "Cincuenta rubíes" }, Text{ "Rupoor (50)", "Roupir (50)", "Rupobre (50)" }, Text{ "Fifty Rupees", "Cinquante rubis", "Balboa hyliano" }, Text{ "Rupee (50)", "Rubis (50)", "Peso hyliano" }, }; trickNameTable[RG_HUGE_RUPEE] = { Text{ "Hugo", "Or Rubi", "Oro Rubi" }, - Text{ "Two Hundred Rubies", "deux cents rubis", "Doscientos rubíes" }, + Text{ "Two Hundred Rubies", "Deux cents rubis", "Doscientos rubíes" }, Text{ "Diamond", "Diamant", "Diamante" }, Text{ "Huge Ruby", "Énorme rubis", "Rubi gigante" }, Text{ "Two Hundred Rupees", "Deux cent rubis", "Euro hyliano" }, @@ -806,53 +806,54 @@ void InitTrickNames() { trickNameTable[RG_TRIFORCE_PIECE] = { Text{ "Piece of Cheese", "Morceau de Fromage", "Piece of Cheese" }, Text{ "Triforce Shard", "Éclat de Triforce", "Triforce Shard" }, - Text{ "Shiny Rock", "Caiiloux Brillant", "Shiny Rock" }, + Text{ "Shiny Rock", "Caillou Brillant", "Shiny Rock" }, }; + // TODO_TRANSLATE trickNameTable[RG_GOHMA_SOUL] = { - Text{ "Spider Sense", "", "" }, - Text{ "Deku Spirit", "", "" }, - Text{ "Ghost of Ghoma", "", "" }, + Text{ "Spider Sense", "Sens de l'Araignée", "" }, + Text{ "Deku Spirit", "Parasite Mojo", "" }, + Text{ "Ghost of Ghoma", "Fantôme de Gohma", "" }, }; trickNameTable[RG_KING_DODONGO_SOUL] = { - Text{ "Lizard Soul", "", "" }, - Text{ "Regal Remains", "", "" }, - Text{ "Dodongo's Core", "", "" }, + Text{ "Lizard Soul", "Âme d'un Lézard", "" }, + Text{ "Regal Remains", "Restes Délicieux", "" }, + Text{ "Dodongo's Core", "Coeur de Dodongo", "" }, }; trickNameTable[RG_BARINADE_SOUL] = { - Text{ "Parasitic Poltergeist", "", "" }, - Text{ "Jabu Insides", "", "" }, - Text{ "Barinade Bacteria", "", "" }, + Text{ "Parasitic Poltergeist", "Poltergeist Parasite", "" }, + Text{ "Jabu Insides", "Entrailles de Jabu-Jabu", "" }, + Text{ "Barinade Bacteria", "Bactérie de Barinade", "" }, }; trickNameTable[RG_PHANTOM_GANON_SOUL] = { - Text{ "Bigger Poe", "", "" }, - Text{ "Sacred Forest Pine Tree", "", "" }, - Text{ "Ganon's Phantom", "", "" }, + Text{ "Bigger Poe", "Âme Gigantesque", "" }, + Text{ "Sacred Forest Pine Tree", "Grande Perche du Bosquet Sacré", "" }, + Text{ "Ganon's Phantom", "Fantôme de Ganon", "" }, }; trickNameTable[RG_VOLVAGIA_SOUL] = { - Text{ "Dragon Roast", "", "" }, - Text{ "Hot n' Ready", "", "" }, - Text{ "Volvagia's Vitality", "", "" }, + Text{ "Dragon Roast", "Friture du Dragon", "" }, + Text{ "Hot n' Ready", "Sauce Barbecue", "" }, + Text{ "Volvagia's Vitality", "Vitalité de Volcania", "" }, }; trickNameTable[RG_MORPHA_SOUL] = { - Text{ "Dihydrogen Monoxide", "", "" }, - Text{ "Morpha Molecules", "", "" }, - Text{ "Wet Stuff", "", "" }, + Text{ "Dihydrogen Monoxide", "Monoxyde de Dihydrogène", "" }, + Text{ "Morpha Molecules", "Molécule de Morpha", "" }, + Text{ "Wet Stuff", "Truc Mouillé", "" }, }; trickNameTable[RG_BONGO_BONGO_SOUL] = { - Text{ "Shadow Soul", "", "" }, - Text{ "Dark Essence", "", "" }, - Text{ "Bongo Bongo's Bongo", "", "" }, + Text{ "Shadow Soul", "Âme de l'Ombre", "" }, + Text{ "Dark Essence", "Essence Sombre", "" }, + Text{ "Bongo Bongo's Bongo", "Bongo de Bongo Bongo", "" }, }; trickNameTable[RG_TWINROVA_SOUL] = { - Text{ "Sandy Ashes", "", "" }, - Text{ "Spiritual Spirit", "", "" }, - Text{ "Twin Rovers", "", "" }, + Text{ "Sandy Ashes", "Cendres des Vieilles", "" }, + Text{ "Spiritual Spirit", "Esprit Spirituel", "" }, + Text{ "Twin Rovers", "Duo Angélique", "" }, }; trickNameTable[RG_GANON_SOUL] = { - Text{ "Pure Evil", "", "" }, - Text{ "Ganon's Ghost", "", "" }, - Text{ "Pork", "", "" }, + Text{ "Pure Evil", "Mal Incarné", "" }, + Text{ "Ganon's Ghost", "Le Malin", "" }, + Text{ "Pork", "Porc", "" }, }; trickNameTable[RG_FISHING_POLE] = { @@ -862,31 +863,31 @@ void InitTrickNames() { }; trickNameTable[RG_OCARINA_A_BUTTON] = { - Text{ "Ocarina J Button", "", "" }, - Text{ "Ocarina Ayy Button", "", "" }, - Text{ "Ocarina A Trigger", "", "" }, + Text{ "Ocarina J Button", "Touche Ha de l'Ocarina", "" }, + Text{ "Ocarina Ayy Button", "Touche Ah de l'Ocarina", "" }, + Text{ "Ocarina A Trigger", "Bumper A de l'Ocarina", "" }, }; trickNameTable[RG_OCARINA_C_UP_BUTTON] = { - Text{ "Ocarina C North Button", "", "" }, - Text{ "Ocarina C App Button", "", "" }, - Text{ "Ocarina Sup Button", "", "" }, + Text{ "Ocarina C North Button", "Touche C Nord de l'Ocarina", "" }, + Text{ "Ocarina C App Button", "Touche C'est Haut de l'Ocarina", "" }, + Text{ "Ocarina Sup Button", "Touche O de l'Ocarina", "" }, }; trickNameTable[RG_OCARINA_C_DOWN_BUTTON] = { - Text{ "Ocarina C South Button", "", "" }, - Text{ "Ocarina Z Down Button", "", "" }, - Text{ "Ocarina See Down Button", "", "" }, - Text{ "Ocarina C Dawn Button", "", "" }, + Text{ "Ocarina C South Button", "Touche C Sud de l'Ocarina", "" }, + Text{ "Ocarina Z Down Button", "Touche Z Bas de l'Ocarina", "" }, + Text{ "Ocarina See Down Button", "Touche C'est Bas de l'Ocarina", "" }, + Text{ "Ocarina C Dawn Button", "Touche Séba de l'Ocarina", "" }, }; trickNameTable[RG_OCARINA_C_LEFT_BUTTON] = { - Text{ "Ocarina C West Button", "", "" }, - Text{ "Ocarina Sea Left Button", "", "" }, - Text{ "Ocarina C Lift Button", "", "" }, - Text{ "Ocarina Rewind Button", "", "" }, + Text{ "Ocarina C West Button", "Touche C Ouest de l'Ocarina", "" }, + Text{ "Ocarina Sea Left Button", "Touche Cégoche de L'Ocarina", "" }, + Text{ "Ocarina C Lift Button", "Touche C'est Gauche de l'Ocarina", "" }, + Text{ "Ocarina Rewind Button", "Touche Rembobiner de l'Ocarina", "" }, }; trickNameTable[RG_OCARINA_C_RIGHT_BUTTON] = { - Text{ "Ocarina C East Button", "", "" }, - Text{ "Ocarina C Wright Button", "", "" }, - Text{ "Overworld C Right Button", "", "" }, + Text{ "Ocarina C East Button", "Touche C Est de l'Ocarina", "" }, + Text{ "Ocarina C Wright Button", "Touche C'est Droite de l'Ocarina", "" }, + Text{ "Overworld C Right Button", "Trou Droit de l'Ocarina", "" }, }; /* diff --git a/soh/soh/Enhancements/randomizer/3drando/spoiler_log.cpp b/soh/soh/Enhancements/randomizer/3drando/spoiler_log.cpp index 7938d8665..a1c912773 100644 --- a/soh/soh/Enhancements/randomizer/3drando/spoiler_log.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/spoiler_log.cpp @@ -267,10 +267,10 @@ static void WriteAllLocations() { switch (gSaveContext.language) { case 0: default: - placedItemName = location->GetPlacedItemName().english; + placedItemName = location->GetPlacedItemName().GetEnglish(); break; case 2: - placedItemName = location->GetPlacedItemName().french; + placedItemName = location->GetPlacedItemName().GetFrench(); break; } @@ -303,18 +303,18 @@ static void WriteAllLocations() { ["model"] = Rando::StaticData::RetrieveItem( ctx->overrides[location->GetRandomizerCheck()].LooksLike()) .GetName() - .english; + .GetEnglish(); jsonData["locations"][Rando::StaticData::GetLocation(location->GetRandomizerCheck())->GetName()] - ["trickName"] = ctx->overrides[location->GetRandomizerCheck()].GetTrickName().english; + ["trickName"] = ctx->overrides[location->GetRandomizerCheck()].GetTrickName().GetEnglish(); break; case 2: jsonData["locations"][Rando::StaticData::GetLocation(location->GetRandomizerCheck())->GetName()] ["model"] = Rando::StaticData::RetrieveItem( ctx->overrides[location->GetRandomizerCheck()].LooksLike()) .GetName() - .french; + .GetFrench(); jsonData["locations"][Rando::StaticData::GetLocation(location->GetRandomizerCheck())->GetName()] - ["trickName"] = ctx->overrides[location->GetRandomizerCheck()].GetTrickName().french; + ["trickName"] = ctx->overrides[location->GetRandomizerCheck()].GetTrickName().GetFrench(); break; } } diff --git a/soh/soh/Enhancements/randomizer/ShuffleGrass.cpp b/soh/soh/Enhancements/randomizer/ShuffleGrass.cpp index f318ad948..b8d31144a 100644 --- a/soh/soh/Enhancements/randomizer/ShuffleGrass.cpp +++ b/soh/soh/Enhancements/randomizer/ShuffleGrass.cpp @@ -35,8 +35,10 @@ extern "C" void EnKusa_RandomizerDraw(Actor* thisx, PlayState* play) { if (grassActor->grassIdentity.randomizerCheck != RC_MAX && Flags_GetRandomizerInf(grassActor->grassIdentity.randomizerInf) == 0) { int csmc = CVarGetInteger(CVAR_ENHANCEMENT("ChestSizeAndTextureMatchContents"), CSMC_DISABLED); + int requiresStoneAgony = CVarGetInteger(CVAR_ENHANCEMENT("ChestSizeDependsStoneOfAgony"), 0); - if (csmc == CSMC_BOTH || csmc == CSMC_TEXTURE) { + if ((csmc == CSMC_BOTH || csmc == CSMC_TEXTURE) && + (!requiresStoneAgony || (requiresStoneAgony && CHECK_QUEST_ITEM(QUEST_STONE_OF_AGONY)))) { auto itemEntry = Rando::Context::GetInstance()->GetFinalGIEntry(grassActor->grassIdentity.randomizerCheck, true, GI_NONE); GetItemCategory getItemCategory = itemEntry.getItemCategory; diff --git a/soh/soh/Enhancements/randomizer/context.cpp b/soh/soh/Enhancements/randomizer/context.cpp index fa755325e..4127ab21a 100644 --- a/soh/soh/Enhancements/randomizer/context.cpp +++ b/soh/soh/Enhancements/randomizer/context.cpp @@ -180,8 +180,6 @@ void Context::GenerateLocationPool() { location.GetRandomizerCheck() == RC_HF_DEKU_SCRUB_GROTTO)) || (location.GetRCType() == RCTYPE_ADULT_TRADE && mOptions[RSK_SHUFFLE_ADULT_TRADE].Is(RO_GENERIC_OFF)) || (location.GetRCType() == RCTYPE_COW && mOptions[RSK_SHUFFLE_COWS].Is(RO_GENERIC_OFF)) || - (location.GetRandomizerCheck() == RC_LH_HYRULE_LOACH && - mOptions[RSK_FISHSANITY].IsNot(RO_FISHSANITY_HYRULE_LOACH)) || (location.GetRCType() == RCTYPE_FISH && !mFishsanity->GetFishLocationIncluded(&location)) || (location.GetRCType() == RCTYPE_POT && mOptions[RSK_SHUFFLE_POTS].Is(RO_SHUFFLE_POTS_OFF)) || (location.GetRCType() == RCTYPE_GRASS && mOptions[RSK_SHUFFLE_GRASS].Is(RO_SHUFFLE_GRASS_OFF)) || diff --git a/soh/soh/Enhancements/randomizer/entrance.cpp b/soh/soh/Enhancements/randomizer/entrance.cpp index 05638a2b3..40eaca212 100644 --- a/soh/soh/Enhancements/randomizer/entrance.cpp +++ b/soh/soh/Enhancements/randomizer/entrance.cpp @@ -878,10 +878,10 @@ int EntranceShuffler::ShuffleAllEntrances() { { EntranceType::Dungeon, RR_SHADOW_TEMPLE_ENTRYWAY, RR_GRAVEYARD_WARP_PAD_REGION, ENTR_GRAVEYARD_OUTSIDE_TEMPLE } }, { { EntranceType::Dungeon, RR_KAK_WELL, RR_BOTTOM_OF_THE_WELL_ENTRYWAY, ENTR_BOTTOM_OF_THE_WELL_ENTRANCE }, { EntranceType::Dungeon, RR_BOTTOM_OF_THE_WELL_ENTRYWAY, RR_KAK_WELL, ENTR_KAKARIKO_VILLAGE_OUTSIDE_BOTTOM_OF_THE_WELL } }, - { { EntranceType::Dungeon, RR_ZORAS_FOUNTAIN, RR_ICE_CAVERN_ENTRYWAY, ENTR_ICE_CAVERN_ENTRANCE }, - { EntranceType::Dungeon, RR_ICE_CAVERN_ENTRYWAY, RR_ZORAS_FOUNTAIN, ENTR_ZORAS_FOUNTAIN_OUTSIDE_ICE_CAVERN } }, - { { EntranceType::Dungeon, RR_GERUDO_FORTRESS, RR_GERUDO_TRAINING_GROUND_ENTRYWAY, ENTR_GERUDO_TRAINING_GROUND_ENTRANCE }, - { EntranceType::Dungeon, RR_GERUDO_TRAINING_GROUND_ENTRYWAY, RR_GERUDO_FORTRESS, ENTR_GERUDOS_FORTRESS_OUTSIDE_GERUDO_TRAINING_GROUND } }, + { { EntranceType::Dungeon, RR_ZF_LEDGE, RR_ICE_CAVERN_ENTRYWAY, ENTR_ICE_CAVERN_ENTRANCE }, + { EntranceType::Dungeon, RR_ICE_CAVERN_ENTRYWAY, RR_ZF_LEDGE, ENTR_ZORAS_FOUNTAIN_OUTSIDE_ICE_CAVERN } }, + { { EntranceType::Dungeon, RR_GERUDO_FORTRESS, RR_GERUDO_TRAINING_GROUND_ENTRYWAY, ENTR_GERUDO_TRAINING_GROUND_ENTRANCE }, + { EntranceType::Dungeon, RR_GERUDO_TRAINING_GROUND_ENTRYWAY, RR_GERUDO_FORTRESS, ENTR_GERUDOS_FORTRESS_OUTSIDE_GERUDO_TRAINING_GROUND } }, { { EntranceType::GanonDungeon, RR_GANONS_CASTLE_LEDGE, RR_GANONS_CASTLE_ENTRYWAY, ENTR_INSIDE_GANONS_CASTLE_ENTRANCE }, { EntranceType::GanonDungeon, RR_GANONS_CASTLE_ENTRYWAY, RR_CASTLE_GROUNDS_FROM_GANONS_CASTLE, ENTR_CASTLE_GROUNDS_RAINBOW_BRIDGE_EXIT } }, diff --git a/soh/soh/Enhancements/randomizer/fishsanity.cpp b/soh/soh/Enhancements/randomizer/fishsanity.cpp index fe9b4c0f1..8d4435f9a 100644 --- a/soh/soh/Enhancements/randomizer/fishsanity.cpp +++ b/soh/soh/Enhancements/randomizer/fishsanity.cpp @@ -78,6 +78,9 @@ bool Fishsanity::GetFishLocationIncluded(Rando::Location* loc, FishsanityOptions return false; } RandomizerCheck rc = loc->GetRandomizerCheck(); + if (mode == RO_FISHSANITY_HYRULE_LOACH && rc != RC_LH_HYRULE_LOACH) { + return false; + } // Are pond fish enabled, and is this a pond fish location? if (mode != RO_FISHSANITY_OVERWORLD && numFish > 0 && loc->GetScene() == SCENE_FISHING_POND && loc->GetActorID() == ACTOR_FISHING) { diff --git a/soh/soh/Enhancements/randomizer/hook_handlers.cpp b/soh/soh/Enhancements/randomizer/hook_handlers.cpp index 5a803f39b..a10e8b67f 100644 --- a/soh/soh/Enhancements/randomizer/hook_handlers.cpp +++ b/soh/soh/Enhancements/randomizer/hook_handlers.cpp @@ -1591,6 +1591,17 @@ void RandomizerOnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, va_l } break; } + case VB_GIVE_RANDO_GLITCH_FISHING_PRIZE: { + if (IS_RANDO) { + Fishing* fishing = va_arg(args, Fishing*); + if (!Flags_GetRandomizerInf(RAND_INF_ADULT_FISHING)) { + Flags_SetRandomizerInf(RAND_INF_ADULT_FISHING); + } + *should = true; + fishing->stateAndTimer = 0; + } + break; + } case VB_TRADE_TIMER_EYEDROPS: { EnMk* enMk = va_arg(args, EnMk*); Flags_SetRandomizerInf(RAND_INF_ADULT_TRADES_LH_TRADE_FROG); @@ -1632,7 +1643,7 @@ void RandomizerOnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, va_l gPlayState->actorCtx.flags.tempCollect = 0; // If the respawnFlag is set for a grotto return, we don't want the void out to happen. - // Set the data flag to one to prevent the respawn point from being overriden by dungeon doors. + // Set the data flag to one to prevent the respawn point from being overridden by dungeon doors. if (gSaveContext.respawnFlag == 2) { gSaveContext.respawn[RESPAWN_MODE_DOWN].data = 1; *should = false; diff --git a/soh/soh/Enhancements/randomizer/item_list.cpp b/soh/soh/Enhancements/randomizer/item_list.cpp index af5f99cca..64d6a726c 100644 --- a/soh/soh/Enhancements/randomizer/item_list.cpp +++ b/soh/soh/Enhancements/randomizer/item_list.cpp @@ -172,53 +172,53 @@ void Rando::StaticData::InitItemTable() { 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_TREASURE_GAME_SMALL_KEY].SetCustomDrawFunc(Randomizer_DrawSmallKey); - 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] = Item(RG_GUARD_HOUSE_KEY, Text{ "Guard House Key", "Clé de la Maison des Gardes", "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] = Item(RG_MARKET_BAZAAR_KEY, Text{ "Market Bazaar Key", "Clé du Bazar de la Place du Marché", "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] = Item(RG_MARKET_POTION_SHOP_KEY, Text{ "Market Potion Shop Key", "Clé du Magasin de Potions de la Place du Marché", "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] = Item(RG_MASK_SHOP_KEY, Text{ "Mask Shop Key", "Clé de la Foire aux Masques", "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] = Item(RG_MARKET_SHOOTING_GALLERY_KEY, Text{ "Market Shooting Gallery Key", "Clé du Stand de Tir de la Place du Marché", "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] = Item(RG_BOMBCHU_BOWLING_KEY, Text{ "Bombchu Bowling Alley Key", "Clé du Bowling Teigneux", "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] = Item(RG_TREASURE_CHEST_GAME_BUILDING_KEY, Text{ "Treasure Chest Game Building Key", "Clé de la Chasse au Trésor", "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] = Item(RG_BOMBCHU_SHOP_KEY, Text{ "Bombchu Shop Key", "Clé du Magasin de Missiles", "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] = Item(RG_RICHARDS_HOUSE_KEY, Text{ "Richard's House Key", "Clé de la Maison de Kiki", "Schlüssel für das Haus von Richard" }, ITEMTYPE_ITEM, GI_DOOR_KEY, true, LOGIC_RICHARDS_HOUSE_KEY, RHT_OVERWORLD_KEY, RG_RICHARDS_HOUSE_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); itemTable[RG_RICHARDS_HOUSE_KEY].SetCustomDrawFunc(Randomizer_DrawOverworldKey); - itemTable[RG_ALLEY_HOUSE_KEY] = Item(RG_ALLEY_HOUSE_KEY, Text{ "Alley House Key", "", "Schlüssel für das Gassenhaus" }, ITEMTYPE_ITEM, GI_DOOR_KEY, true, LOGIC_ALLEY_HOUSE_KEY, RHT_OVERWORLD_KEY, RG_ALLEY_HOUSE_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); + itemTable[RG_ALLEY_HOUSE_KEY] = Item(RG_ALLEY_HOUSE_KEY, Text{ "Alley House Key", "Clé de la Maison de la Ruelle", "Schlüssel für das Gassenhaus" }, ITEMTYPE_ITEM, GI_DOOR_KEY, true, LOGIC_ALLEY_HOUSE_KEY, RHT_OVERWORLD_KEY, RG_ALLEY_HOUSE_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); itemTable[RG_ALLEY_HOUSE_KEY].SetCustomDrawFunc(Randomizer_DrawOverworldKey); - itemTable[RG_KAK_BAZAAR_KEY] = Item(RG_KAK_BAZAAR_KEY, Text{ "Kakariko Bazaar Key", "", "Schlüssel für den Basar von Kakariko" }, ITEMTYPE_ITEM, GI_DOOR_KEY, true, LOGIC_KAK_BAZAAR_KEY, RHT_OVERWORLD_KEY, RG_KAK_BAZAAR_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); + itemTable[RG_KAK_BAZAAR_KEY] = Item(RG_KAK_BAZAAR_KEY, Text{ "Kakariko Bazaar Key", "Clé du Bazar de Cocorico", "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] = Item(RG_KAK_POTION_SHOP_KEY, Text{ "Kakariko Potion Shop Key", "Clé du Magasin de Potions de Cocorico", "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] = Item(RG_BOSS_HOUSE_KEY, Text{ "Boss's House Key", "Clé de la Maison du Chef des Ouvriers", "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] = Item(RG_GRANNYS_POTION_SHOP_KEY, Text{ "Granny's Potion Shop Key", "Clé de l'Apothicaire", "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] = Item(RG_SKULLTULA_HOUSE_KEY, Text{ "Skulltula House Key", "Clé de la Maison des Araignées", "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] = Item(RG_IMPAS_HOUSE_KEY, Text{ "Impa's House Key", "Clé de la Maison d'Impa", "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] = Item(RG_WINDMILL_KEY, Text{ "Windmill Key", "Clé du Moulin", "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] = Item(RG_KAK_SHOOTING_GALLERY_KEY, Text{ "Kakariko Shooting Gallery Key", "Clé du Stand de Tir de Cocorico", "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] = Item(RG_DAMPES_HUT_KEY, Text{ "Dampe's Hut Key", "Clé de la Cabane d'Igor", "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] = Item(RG_TALONS_HOUSE_KEY, Text{ "Talon's House Key", "Clé de la Maison de Talon", "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] = Item(RG_STABLES_KEY, Text{ "Stables Key", "Clé des Écuries", "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] = Item(RG_BACK_TOWER_KEY, Text{ "Back Tower Key", "Clé du Silo", "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] = Item(RG_HYLIA_LAB_KEY, Text{ "Hylia Laboratory Key", "Clé du Laboratoire du Lac Hylia", "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] = Item(RG_FISHING_HOLE_KEY, Text{ "Fishing Hole Key", "Clé de l'Étang", "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); diff --git a/soh/soh/Enhancements/randomizer/location_access.cpp b/soh/soh/Enhancements/randomizer/location_access.cpp index c06ca5d70..6cf2aa2ab 100644 --- a/soh/soh/Enhancements/randomizer/location_access.cpp +++ b/soh/soh/Enhancements/randomizer/location_access.cpp @@ -326,7 +326,7 @@ void RegionTable_Init() { EventAccess(&logic->KakarikoVillageGateOpen, []{return ctx->GetOption(RSK_KAK_GATE).Is(RO_KAK_GATE_OPEN);}), //The big poes bottle softlock safety check does not account for the guard house lock if the guard house is not shuffled, so the key is needed before we can safely allow bottle use in logic //RANDOTODO a setting that lets you drink/dump big poes so we don't need this logic - EventAccess(&logic->CouldEmptyBigPoes, []{return ctx->GetOption(RSK_SHUFFLE_INTERIOR_ENTRANCES).Is(RO_INTERIOR_ENTRANCE_SHUFFLE_ALL) || logic->CanOpenOverworldDoor(RG_GUARD_HOUSE_KEY);}), + EventAccess(&logic->CouldEmptyBigPoes, []{return !ctx->GetOption(RSK_SHUFFLE_INTERIOR_ENTRANCES).Is(RO_INTERIOR_ENTRANCE_SHUFFLE_OFF) || logic->CanOpenOverworldDoor(RG_GUARD_HOUSE_KEY);}), }, { //Locations LOCATION(RC_LINKS_POCKET, true), diff --git a/soh/soh/Enhancements/randomizer/location_access/dungeons/bottom_of_the_well.cpp b/soh/soh/Enhancements/randomizer/location_access/dungeons/bottom_of_the_well.cpp index 4ec6b6773..44c3fa817 100644 --- a/soh/soh/Enhancements/randomizer/location_access/dungeons/bottom_of_the_well.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/dungeons/bottom_of_the_well.cpp @@ -50,7 +50,7 @@ void RegionTable_Init_BottomOfTheWell() { LOCATION(RC_BOTTOM_OF_THE_WELL_FRONT_LEFT_FAKE_WALL_CHEST, true), LOCATION(RC_BOTTOM_OF_THE_WELL_RIGHT_BOTTOM_FAKE_WALL_CHEST, true), LOCATION(RC_BOTTOM_OF_THE_WELL_COMPASS_CHEST, true), - //N64 has no extra check here, but I can't get past without dealing with the spider or taking a hit, they probably assume sticks + //You can just barely pass the spider on the right side without damage or items, but it's probably tight enough to count as as a trick LOCATION(RC_BOTTOM_OF_THE_WELL_CENTER_SKULLTULA_CHEST, logic->CanPassEnemy(RE_BIG_SKULLTULA) || logic->TakeDamage()), //Not technically behind a wall, but still logically needs lens due to pits LOCATION(RC_BOTTOM_OF_THE_WELL_BACK_LEFT_BOMBABLE_CHEST, logic->HasExplosives()), @@ -160,7 +160,7 @@ void RegionTable_Init_BottomOfTheWell() { }, { //Exits Entrance(RR_BOTTOM_OF_THE_WELL_SOUTHWEST_ROOM, []{return logic->IsChild && logic->CanPassEnemy(RE_BIG_SKULLTULA);}), - //It's possible top abuse boulder's limited range of collision detection to detonate the flowers through the boulder with bow, but this is a glitch + //It's possible to abuse boulder's limited range of collision detection to detonate the flowers through the boulder with bow, but this is a glitch //the exact range is just past the furthest away plank in the green goo section Entrance(RR_BOTTOM_OF_THE_WELL_BASEMENT_USEFUL_BOMB_FLOWERS, []{return Here(RR_BOTTOM_OF_THE_WELL_BASEMENT, []{return logic->BlastOrSmash() || logic->CanUse(RG_DINS_FIRE) || (logic->CanUse(RG_STICKS) && ctx->GetTrickOption(RT_BOTW_BASEMENT));});}), }); diff --git a/soh/soh/Enhancements/randomizer/location_access/dungeons/ice_cavern.cpp b/soh/soh/Enhancements/randomizer/location_access/dungeons/ice_cavern.cpp index ff2bf9594..7aa2066ca 100644 --- a/soh/soh/Enhancements/randomizer/location_access/dungeons/ice_cavern.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/dungeons/ice_cavern.cpp @@ -11,7 +11,7 @@ void RegionTable_Init_IceCavern() { //Exits Entrance(RR_ICE_CAVERN_BEGINNING, []{return ctx->GetDungeon(ICE_CAVERN)->IsVanilla();}), Entrance(RR_ICE_CAVERN_MQ_BEGINNING, []{return ctx->GetDungeon(ICE_CAVERN)->IsMQ() && logic->CanUseProjectile();}), - Entrance(RR_ZORAS_FOUNTAIN, []{return true;}), + Entrance(RR_ZF_LEDGE, []{return true;}), }); #pragma region Vanilla diff --git a/soh/soh/Enhancements/randomizer/location_access/gerudo_fortress.cpp b/soh/soh/Enhancements/randomizer/location_access/gerudo_fortress.cpp index 4b4579210..dd95b11fb 100644 --- a/soh/soh/Enhancements/randomizer/location_access/gerudo_fortress.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/gerudo_fortress.cpp @@ -27,8 +27,8 @@ void RegionTable_Init_GerudoFortress() { LOCATION(RC_GF_GERUDO_MEMBERSHIP_CARD, logic->CanFinishGerudoFortress()), LOCATION(RC_GF_GS_ARCHERY_RANGE, logic->IsAdult && logic->HookshotOrBoomerang() && logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD) && logic->CanGetNightTimeGS()), LOCATION(RC_GF_GS_TOP_FLOOR, logic->IsAdult && (logic->CanJumpslashExceptHammer() || logic->CanUse(RG_FAIRY_SLINGSHOT) || logic->CanUse(RG_BOOMERANG) || logic->HasExplosives() || logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_HOOKSHOT) || logic->CanUse(RG_DINS_FIRE)) && (logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD) || logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_HOOKSHOT) || logic->CanUse(RG_HOVER_BOOTS) || ctx->GetTrickOption(RT_GF_KITCHEN) || ctx->GetTrickOption(RT_GF_JUMP)) && logic->CanGetNightTimeGS()), - LOCATION(RC_GF_BREAK_ROOM_POT_1, ((logic->IsAdult && logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD)) || logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_HOOKSHOT)) && logic->CanBreakPots()), - LOCATION(RC_GF_BREAK_ROOM_POT_2, ((logic->IsAdult && logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD)) || logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_HOOKSHOT)) && logic->CanBreakPots()), + LOCATION(RC_GF_BREAK_ROOM_POT_1, (logic->CanUse(RG_LONGSHOT) || (logic->IsAdult && logic->CanUse(RG_SCARECROW)) || (logic->CanUse(RG_HOVER_BOOTS) || (ctx->GetTrickOption(RT_GF_JUMP) && (ctx->GetTrickOption(RT_GF_KITCHEN) || logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD) || logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_HOOKSHOT))))) && logic->CanBreakPots()), + LOCATION(RC_GF_BREAK_ROOM_POT_2, (logic->CanUse(RG_LONGSHOT) || (logic->IsAdult && logic->CanUse(RG_SCARECROW)) || (logic->CanUse(RG_HOVER_BOOTS) || (ctx->GetTrickOption(RT_GF_JUMP) && (ctx->GetTrickOption(RT_GF_KITCHEN) || logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD) || logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_HOOKSHOT))))) && logic->CanBreakPots()), LOCATION(RC_GF_KITCHEN_POT_1, (logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD) || logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_HOOKSHOT)) && logic->CanBreakPots()), LOCATION(RC_GF_KITCHEN_POT_2, (logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD) || logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_HOOKSHOT)) && logic->CanBreakPots()), LOCATION(RC_GF_NORTH_F1_CARPENTER_POT_1, logic->CanBreakPots()), @@ -43,7 +43,7 @@ void RegionTable_Init_GerudoFortress() { LOCATION(RC_GF_SOUTH_F1_CARPENTER_CELL_POT_2, logic->CanBreakPots()), LOCATION(RC_GF_SOUTH_F1_CARPENTER_CELL_POT_3, logic->CanBreakPots()), LOCATION(RC_GF_SOUTH_F1_CARPENTER_CELL_POT_4, logic->CanBreakPots()), - LOCATION(RC_GF_ABOVE_JAIL_CRATE, ((logic->IsAdult && logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD)) || logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_HOOKSHOT)) && logic->CanBreakCrates()), + LOCATION(RC_GF_ABOVE_JAIL_CRATE, (logic->CanUse(RG_LONGSHOT) || (logic->IsAdult && logic->CanUse(RG_SCARECROW)) || (logic->CanUse(RG_HOOKSHOT) && ctx->GetTrickOption(RT_GF_JUMP))) && logic->CanBreakCrates()), LOCATION(RC_GF_OUTSIDE_CENTER_CRATE_1, logic->CanBreakCrates()), LOCATION(RC_GF_OUTSIDE_CENTER_CRATE_2, logic->CanBreakCrates()), LOCATION(RC_GF_OUTSIDE_CENTER_CRATE_3, logic->CanBreakCrates()), @@ -60,7 +60,7 @@ void RegionTable_Init_GerudoFortress() { LOCATION(RC_GF_ARCHERY_START_CRATE_1, (logic->IsChild || logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD)) && logic->CanBreakCrates()), LOCATION(RC_GF_ARCHERY_START_CRATE_2, (logic->IsChild || logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD)) && logic->CanBreakCrates()), LOCATION(RC_GF_ARCHERY_LEFT_END_CRATE_1, (logic->IsChild || logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD)) && logic->CanBreakCrates()), - LOCATION(RC_GF_ARCHERY_LEFT_END_CRATE_2, (logic->IsChild || logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD)) && logic->CanBreakCrates()), + LOCATION(RC_GF_ARCHERY_LEFT_END_CRATE_2, (logic->IsChild || logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD)) && (logic->IsAdult || (logic->BlastOrSmash() || logic->HookshotOrBoomerang() || logic->CanUse(RG_HOVER_BOOTS)))), LOCATION(RC_GF_ARCHERY_LEFT_END_CHILD_CRATE, logic->IsChild && logic->HasExplosives() && logic->CanBreakCrates()), LOCATION(RC_GF_ARCHERY_RIGHT_END_CRATE_1, (logic->IsChild || logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD)) && logic->CanBreakCrates()), LOCATION(RC_GF_ARCHERY_RIGHT_END_CRATE_2, (logic->IsChild || logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD)) && logic->CanBreakCrates()), @@ -69,10 +69,10 @@ void RegionTable_Init_GerudoFortress() { LOCATION(RC_GF_KITCHEN_CRATE_3, (logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD) || logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_HOOKSHOT)) && logic->CanBreakCrates()), LOCATION(RC_GF_KITCHEN_CRATE_4, (logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD) || logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_HOOKSHOT)) && logic->CanBreakCrates()), LOCATION(RC_GF_KITCHEN_CRATE_5, (logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD) || logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_HOOKSHOT)) && logic->CanBreakCrates()), - LOCATION(RC_GF_BREAK_ROOM_CRATE_1, ((logic->IsAdult && logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD)) || logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_HOOKSHOT)) && logic->CanBreakCrates()), - LOCATION(RC_GF_BREAK_ROOM_CRATE_2, ((logic->IsAdult && logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD)) || logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_HOOKSHOT)) && logic->CanBreakCrates()), - LOCATION(RC_GF_BREAK_ROOM_CRATE_3, ((logic->IsAdult && logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD)) || logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_HOOKSHOT)) && logic->CanBreakCrates()), - LOCATION(RC_GF_BREAK_ROOM_CRATE_4, ((logic->IsAdult && logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD)) || logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_HOOKSHOT)) && logic->CanBreakCrates()), + LOCATION(RC_GF_BREAK_ROOM_CRATE_1, (logic->CanUse(RG_LONGSHOT) || (logic->IsAdult && logic->CanUse(RG_SCARECROW)) || (logic->CanUse(RG_HOVER_BOOTS) || (ctx->GetTrickOption(RT_GF_JUMP) && (ctx->GetTrickOption(RT_GF_KITCHEN) || logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD) || logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_HOOKSHOT))))) && logic->CanBreakCrates()), + LOCATION(RC_GF_BREAK_ROOM_CRATE_2, (logic->CanUse(RG_LONGSHOT) || (logic->IsAdult && logic->CanUse(RG_SCARECROW)) || (logic->CanUse(RG_HOVER_BOOTS) || (ctx->GetTrickOption(RT_GF_JUMP) && (ctx->GetTrickOption(RT_GF_KITCHEN) || logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD) || logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_HOOKSHOT))))) && logic->CanBreakCrates()), + LOCATION(RC_GF_BREAK_ROOM_CRATE_3, (logic->CanUse(RG_LONGSHOT) || (logic->IsAdult && logic->CanUse(RG_SCARECROW)) || ((logic->CanUse(RG_HOVER_BOOTS) || ctx->GetTrickOption(RT_GF_JUMP)) && (logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD) || logic->CanUse(RG_FAIRY_BOW)))) && logic->CanBreakCrates()), + LOCATION(RC_GF_BREAK_ROOM_CRATE_4, (logic->CanUse(RG_LONGSHOT) || (logic->IsAdult && logic->CanUse(RG_SCARECROW)) || ((logic->CanUse(RG_HOVER_BOOTS) || ctx->GetTrickOption(RT_GF_JUMP)) && (logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD) || logic->CanUse(RG_FAIRY_BOW)))) && logic->CanBreakCrates()), LOCATION(RC_GF_NORTH_F1_CARPENTER_CRATE, (logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD) || logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_HOOKSHOT)) && logic->CanBreakCrates()), LOCATION(RC_GF_NORTH_F3_CARPENTER_CRATE, (logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD) || logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_HOOKSHOT)) && logic->CanBreakCrates()), LOCATION(RC_GF_SOUTH_F2_CARPENTER_CRATE_1, logic->CanBreakCrates()), diff --git a/soh/soh/Enhancements/randomizer/location_access/overworld/market.cpp b/soh/soh/Enhancements/randomizer/location_access/overworld/market.cpp index 2016b24cd..0314bfde0 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/market.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/market.cpp @@ -14,18 +14,19 @@ void RegionTable_Init_Market() { areaTable[RR_THE_MARKET] = Region("Market", "Market", {RA_THE_MARKET}, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LOCATION(RC_MARKET_GRASS_1, logic->IsChild && logic->CanCutShrubs()), - LOCATION(RC_MARKET_GRASS_2, logic->IsChild && logic->CanCutShrubs()), - LOCATION(RC_MARKET_GRASS_3, logic->IsChild && logic->CanCutShrubs()), - LOCATION(RC_MARKET_GRASS_4, logic->IsChild && logic->CanCutShrubs()), - LOCATION(RC_MARKET_GRASS_5, logic->IsChild && logic->CanCutShrubs()), - LOCATION(RC_MARKET_GRASS_6, logic->IsChild && logic->CanCutShrubs()), - LOCATION(RC_MARKET_GRASS_7, logic->IsChild && logic->CanCutShrubs()), - LOCATION(RC_MARKET_GRASS_8, logic->IsChild && logic->CanCutShrubs()), - LOCATION(RC_MK_NEAR_BAZAAR_CRATE_1, logic->IsChild && logic->CanBreakCrates()), - LOCATION(RC_MK_NEAR_BAZAAR_CRATE_2, logic->IsChild && logic->CanBreakCrates()), - LOCATION(RC_MK_SHOOTING_GALLERY_CRATE_1, logic->IsChild && logic->CanBreakCrates()), - LOCATION(RC_MK_SHOOTING_GALLERY_CRATE_2, logic->IsChild && logic->CanBreakCrates()), + //RANDOTODO add item avalibility to regions to remove need to hardcode logic in limited item use situations + LOCATION(RC_MARKET_GRASS_1, logic->IsChild && (logic->CanUseSword() || logic->HasItem(RG_GORONS_BRACELET))), + LOCATION(RC_MARKET_GRASS_2, logic->IsChild && (logic->CanUseSword() || logic->HasItem(RG_GORONS_BRACELET))), + LOCATION(RC_MARKET_GRASS_3, logic->IsChild && (logic->CanUseSword() || logic->HasItem(RG_GORONS_BRACELET))), + LOCATION(RC_MARKET_GRASS_4, logic->IsChild && (logic->CanUseSword() || logic->HasItem(RG_GORONS_BRACELET))), + LOCATION(RC_MARKET_GRASS_5, logic->IsChild && (logic->CanUseSword() || logic->HasItem(RG_GORONS_BRACELET))), + LOCATION(RC_MARKET_GRASS_6, logic->IsChild && (logic->CanUseSword() || logic->HasItem(RG_GORONS_BRACELET))), + LOCATION(RC_MARKET_GRASS_7, logic->IsChild && (logic->CanUseSword() || logic->HasItem(RG_GORONS_BRACELET))), + LOCATION(RC_MARKET_GRASS_8, logic->IsChild && (logic->CanUseSword() || logic->HasItem(RG_GORONS_BRACELET))), + LOCATION(RC_MK_NEAR_BAZAAR_CRATE_1, logic->IsChild /*&& logic->CanRoll()*/), + LOCATION(RC_MK_NEAR_BAZAAR_CRATE_2, logic->IsChild /*&& logic->CanRoll()*/), + LOCATION(RC_MK_SHOOTING_GALLERY_CRATE_1, logic->IsChild /*&& logic->CanRoll()*/), + LOCATION(RC_MK_SHOOTING_GALLERY_CRATE_2, logic->IsChild /*&& logic->CanRoll()*/), }, { //Exits Entrance(RR_MARKET_ENTRANCE, []{return true;}), diff --git a/soh/soh/Enhancements/randomizer/location_access/overworld/zoras_domain.cpp b/soh/soh/Enhancements/randomizer/location_access/overworld/zoras_domain.cpp index 07922bc8f..3bee82b26 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/zoras_domain.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/zoras_domain.cpp @@ -17,8 +17,8 @@ void RegionTable_Init_ZorasDomain() { //Locations LOCATION(RC_ZD_DIVING_MINIGAME, logic->HasItem(RG_BRONZE_SCALE) && logic->HasItem(RG_CHILD_WALLET) && logic->IsChild), LOCATION(RC_ZD_CHEST, logic->IsChild && logic->CanUse(RG_STICKS)), - LOCATION(RC_ZD_KING_ZORA_THAWED, logic->KingZoraThawed), - LOCATION(RC_ZD_TRADE_PRESCRIPTION, logic->KingZoraThawed && logic->CanUse(RG_PRESCRIPTION)), + LOCATION(RC_ZD_KING_ZORA_THAWED, logic->IsAdult && logic->KingZoraThawed), + LOCATION(RC_ZD_TRADE_PRESCRIPTION, logic->IsAdult && logic->KingZoraThawed && logic->CanUse(RG_PRESCRIPTION)), LOCATION(RC_ZD_GS_FROZEN_WATERFALL, logic->IsAdult && (logic->HookshotOrBoomerang() || logic->CanUse(RG_FAIRY_SLINGSHOT) || logic->CanUse(RG_FAIRY_BOW) || (logic->CanUse(RG_MAGIC_SINGLE) && (logic->CanUse(RG_MASTER_SWORD) || logic->CanUse(RG_KOKIRI_SWORD) || logic->CanUse(RG_BIGGORON_SWORD))) || (ctx->GetTrickOption(RT_ZD_GS) && logic->CanJumpslashExceptHammer())) && logic->CanGetNightTimeGS()), LOCATION(RC_ZD_FISH_1, logic->IsChild && logic->HasBottle()), LOCATION(RC_ZD_FISH_2, logic->IsChild && logic->HasBottle()), @@ -28,8 +28,8 @@ void RegionTable_Init_ZorasDomain() { LOCATION(RC_ZD_GOSSIP_STONE_FAIRY, logic->CallGossipFairyExceptSuns()), LOCATION(RC_ZD_GOSSIP_STONE_FAIRY_BIG, logic->CanUse(RG_SONG_OF_STORMS)), LOCATION(RC_ZD_GOSSIP_STONE, true), - LOCATION(RC_ZD_IN_FRONT_OF_KING_ZORA_BEEHIVE_LEFT, logic->CanBreakUpperBeehives()), - LOCATION(RC_ZD_IN_FRONT_OF_KING_ZORA_BEEHIVE_RIGHT, logic->CanBreakUpperBeehives()), + LOCATION(RC_ZD_IN_FRONT_OF_KING_ZORA_BEEHIVE_LEFT, logic->IsChild && logic->CanBreakUpperBeehives()), + LOCATION(RC_ZD_IN_FRONT_OF_KING_ZORA_BEEHIVE_RIGHT, logic->IsChild && logic->CanBreakUpperBeehives()), LOCATION(RC_ZD_NEAR_SHOP_POT_1, logic->CanBreakPots()), LOCATION(RC_ZD_NEAR_SHOP_POT_2, logic->CanBreakPots()), LOCATION(RC_ZD_NEAR_SHOP_POT_3, logic->CanBreakPots()), @@ -50,9 +50,12 @@ void RegionTable_Init_ZorasDomain() { Entrance(RR_ZD_STORMS_GROTTO, []{return logic->CanOpenStormsGrotto();}), }); - areaTable[RR_ZD_BEHIND_KING_ZORA] = Region("ZD Behind King Zora", "Zoras Domain", {RA_ZORAS_DOMAIN}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_ZD_BEHIND_KING_ZORA] = Region("ZD Behind King Zora", "Zoras Domain", {RA_ZORAS_DOMAIN}, NO_DAY_NIGHT_CYCLE, { + //Events + EventAccess(&logic->KingZoraThawed, []{return logic->IsAdult && logic->BlueFire();}), + }, { //Locations - LOCATION(RC_ZD_BEHIND_KING_ZORA_BEEHIVE, logic->CanBreakUpperBeehives()), + LOCATION(RC_ZD_BEHIND_KING_ZORA_BEEHIVE, logic->IsChild && logic->CanBreakUpperBeehives()), }, { //Exits Entrance(RR_ZORAS_DOMAIN, []{return logic->DeliverLetter || ctx->GetOption(RSK_ZORAS_FOUNTAIN).Is(RO_ZF_OPEN) || (ctx->GetOption(RSK_ZORAS_FOUNTAIN).Is(RO_ZF_CLOSED_CHILD) && logic->IsAdult);}), diff --git a/soh/soh/Enhancements/randomizer/location_access/overworld/zoras_fountain.cpp b/soh/soh/Enhancements/randomizer/location_access/overworld/zoras_fountain.cpp index a03070454..3ac0921a3 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/zoras_fountain.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/zoras_fountain.cpp @@ -11,18 +11,44 @@ void RegionTable_Init_ZorasFountain() { EventAccess(&logic->ButterflyFairy, []{return logic->ButterflyFairy || (logic->CanUse(RG_STICKS) && logic->AtDay);}), }, { //Locations - LOCATION(RC_ZF_ICEBERG_FREESTANDING_POH, logic->IsAdult), + LOCATION(RC_ZF_GS_TREE, logic->IsChild), + LOCATION(RC_ZF_GS_ABOVE_THE_LOG, logic->IsChild && logic->HookshotOrBoomerang() && logic->CanGetNightTimeGS()), + LOCATION(RC_ZF_FAIRY_GOSSIP_STONE_FAIRY, logic->CallGossipFairyExceptSuns()), + LOCATION(RC_ZF_FAIRY_GOSSIP_STONE_FAIRY_BIG, logic->CanUse(RG_SONG_OF_STORMS)), + LOCATION(RC_ZF_JABU_GOSSIP_STONE_FAIRY, logic->CallGossipFairyExceptSuns()), + LOCATION(RC_ZF_JABU_GOSSIP_STONE_FAIRY_BIG, logic->CanUse(RG_SONG_OF_STORMS)), + LOCATION(RC_ZF_FAIRY_GOSSIP_STONE, true), + LOCATION(RC_ZF_JABU_GOSSIP_STONE, true), + LOCATION(RC_ZF_NEAR_JABU_POT_1, logic->IsChild && logic->CanBreakPots()), + LOCATION(RC_ZF_NEAR_JABU_POT_2, logic->IsChild && logic->CanBreakPots()), + LOCATION(RC_ZF_NEAR_JABU_POT_3, logic->IsChild && logic->CanBreakPots()), + LOCATION(RC_ZF_NEAR_JABU_POT_4, logic->IsChild && logic->CanBreakPots()), + }, { + //Exits + Entrance(RR_ZD_BEHIND_KING_ZORA, []{return true;}), + Entrance(RR_ZF_ICEBERGS, []{return logic->IsAdult;}), + Entrance(RR_ZF_LAKEBED, []{return logic->CanUse(RG_IRON_BOOTS);}), + //child can break the brown rock without lifting the silver rock and it stays gone for adult, but it's not intuitive and there's no reasonable case where it matters. + Entrance(RR_ZF_HIDDEN_CAVE, []{return logic->CanUse(RG_SILVER_GAUNTLETS) && logic->BlastOrSmash();}), + Entrance(RR_ZF_ROCK, []{return logic->IsAdult && logic->CanUse(RG_SCARECROW);}), + Entrance(RR_JABU_JABUS_BELLY_ENTRYWAY, []{return (logic->IsChild && logic->CanUse(RG_BOTTLE_WITH_FISH));}), + Entrance(RR_ZF_GREAT_FAIRY_FOUNTAIN, []{return logic->HasExplosives() || (ctx->GetTrickOption(RT_ZF_GREAT_FAIRY_WITHOUT_EXPLOSIVES) && logic->CanUse(RG_MEGATON_HAMMER) && logic->CanUse(RG_SILVER_GAUNTLETS));}), + }); + + areaTable[RR_ZF_ICEBERGS] = Region("ZF Icebergs", "Zoras Fountain", {RA_ZORAS_FOUNTAIN}, NO_DAY_NIGHT_CYCLE, {}, { + //Locations + LOCATION(RC_ZF_ICEBERG_FREESTANDING_POH, logic->IsAdult), + }, { + //Exits + //This hover is pretty tight, come at it with momentum and aim for the small corner polygon of the big iceburg while spamming roll + Entrance(RR_ZORAS_FOUNTAIN, []{return logic->HasItem(RG_BRONZE_SCALE) || logic->HasItem(RG_HOVER_BOOTS);}), + Entrance(RR_ZF_LAKEBED, []{return logic->CanUse(RG_IRON_BOOTS);}), + Entrance(RR_ZF_LEDGE, []{return true;}), + }); + + areaTable[RR_ZF_LAKEBED] = Region("ZF Lakebed", "Zoras Fountain", {RA_ZORAS_FOUNTAIN}, NO_DAY_NIGHT_CYCLE, {}, { + //Locations LOCATION(RC_ZF_BOTTOM_FREESTANDING_POH, logic->IsAdult && logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer() >= 16), - LOCATION(RC_ZF_GS_TREE, logic->IsChild), - LOCATION(RC_ZF_GS_ABOVE_THE_LOG, logic->IsChild && logic->HookshotOrBoomerang() && logic->CanGetNightTimeGS()), - LOCATION(RC_ZF_GS_HIDDEN_CAVE, logic->CanUse(RG_SILVER_GAUNTLETS) && logic->BlastOrSmash() && logic->HookshotOrBoomerang() && logic->IsAdult && logic->CanGetNightTimeGS()), - LOCATION(RC_ZF_HIDDEN_CAVE_POT_1, logic->CanUse(RG_SILVER_GAUNTLETS) && logic->IsAdult && logic->BlastOrSmash() && logic->CanBreakPots()), - LOCATION(RC_ZF_HIDDEN_CAVE_POT_2, logic->CanUse(RG_SILVER_GAUNTLETS) && logic->IsAdult && logic->BlastOrSmash() && logic->CanBreakPots()), - LOCATION(RC_ZF_HIDDEN_CAVE_POT_3, logic->CanUse(RG_SILVER_GAUNTLETS) && logic->IsAdult && logic->BlastOrSmash() && logic->CanBreakPots()), - LOCATION(RC_ZF_FAIRY_GOSSIP_STONE_FAIRY, logic->CallGossipFairyExceptSuns()), - LOCATION(RC_ZF_FAIRY_GOSSIP_STONE_FAIRY_BIG, logic->CanUse(RG_SONG_OF_STORMS)), - LOCATION(RC_ZF_JABU_GOSSIP_STONE_FAIRY, logic->CallGossipFairyExceptSuns()), - LOCATION(RC_ZF_JABU_GOSSIP_STONE_FAIRY_BIG, logic->CanUse(RG_SONG_OF_STORMS)), LOCATION(RC_ZF_BOTTOM_NORTH_INNER_RUPEE, logic->IsAdult && logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer() >= 16), LOCATION(RC_ZF_BOTTOM_NORTHEAST_INNER_RUPEE, logic->IsAdult && logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer() >= 16), LOCATION(RC_ZF_BOTTOM_SOUTHEAST_INNER_RUPEE, logic->IsAdult && logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer() >= 16), @@ -41,18 +67,47 @@ void RegionTable_Init_ZorasFountain() { LOCATION(RC_ZF_BOTTOM_SOUTH_OUTER_RUPEE, logic->IsAdult && logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer() >= 16), LOCATION(RC_ZF_BOTTOM_SOUTHWEST_OUTER_RUPEE, logic->IsAdult && logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer() >= 16), LOCATION(RC_ZF_BOTTOM_NORTHWEST_OUTER_RUPEE, logic->IsAdult && logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer() >= 16), - LOCATION(RC_ZF_FAIRY_GOSSIP_STONE, true), - LOCATION(RC_ZF_JABU_GOSSIP_STONE, true), - LOCATION(RC_ZF_NEAR_JABU_POT_1, logic->IsChild && logic->CanBreakPots()), - LOCATION(RC_ZF_NEAR_JABU_POT_2, logic->IsChild && logic->CanBreakPots()), - LOCATION(RC_ZF_NEAR_JABU_POT_3, logic->IsChild && logic->CanBreakPots()), - LOCATION(RC_ZF_NEAR_JABU_POT_4, logic->IsChild && logic->CanBreakPots()), }, { //Exits - Entrance(RR_ZD_BEHIND_KING_ZORA, []{return true;}), - Entrance(RR_JABU_JABUS_BELLY_ENTRYWAY, []{return (logic->IsChild && logic->CanUse(RG_BOTTLE_WITH_FISH));}), - Entrance(RR_ICE_CAVERN_ENTRYWAY, []{return logic->IsAdult;}), - Entrance(RR_ZF_GREAT_FAIRY_FOUNTAIN, []{return logic->HasExplosives() || (ctx->GetTrickOption(RT_ZF_GREAT_FAIRY_WITHOUT_EXPLOSIVES) && logic->CanUse(RG_MEGATON_HAMMER) && logic->CanUse(RG_SILVER_GAUNTLETS));}), + Entrance(RR_ZORAS_FOUNTAIN, []{return logic->HasItem(RG_BRONZE_SCALE);}), + }); + + areaTable[RR_ZF_LEDGE] = Region("ZF Ledge", "Zoras Fountain", {RA_ZORAS_FOUNTAIN}, NO_DAY_NIGHT_CYCLE, {}, {}, { + //Exits + Entrance(RR_ZORAS_FOUNTAIN, []{return logic->HasItem(RG_BRONZE_SCALE);}), + Entrance(RR_ZF_ICEBERGS, []{return logic->IsAdult;}), + Entrance(RR_ZF_LAKEBED, []{return logic->CanUse(RG_IRON_BOOTS);}), + Entrance(RR_ICE_CAVERN_ENTRYWAY, []{return true;}), + }); + + areaTable[RR_ZF_HIDDEN_CAVE] = Region("ZF Hidden Cave", "Zoras Fountain", {RA_ZORAS_FOUNTAIN}, NO_DAY_NIGHT_CYCLE, {}, { + //Locations + LOCATION(RC_ZF_HIDDEN_CAVE_POT_1, logic->IsAdult && logic->CanBreakPots()), + LOCATION(RC_ZF_HIDDEN_CAVE_POT_2, logic->IsAdult && logic->CanBreakPots()), + LOCATION(RC_ZF_HIDDEN_CAVE_POT_3, logic->IsAdult && logic->CanBreakPots()), + }, { + //Exits + //There are invisible big skultullas here as adult but they do not block the path and can be "seen" with Z-target + //Lens is not currently needed for this either, implying they are not considered blocking, but it's open for discussion long-term + Entrance(RR_ZF_HIDDEN_LEDGE, []{return true;}), + }); + + areaTable[RR_ZF_HIDDEN_LEDGE] = Region("ZF Hidden Ledge", "Zoras Fountain", {RA_ZORAS_FOUNTAIN}, NO_DAY_NIGHT_CYCLE, {}, { + //Locations + LOCATION(RC_ZF_GS_HIDDEN_CAVE, logic->IsAdult && logic->CanGetEnemyDrop(RE_GOLD_SKULLTULA, ED_BOMB_THROW) && logic->CanGetNightTimeGS()), + }, { + //Exits + //It is possible to avoid fall damage by jumping towards the right and landing in deeper water, but this is basically never relevent + Entrance(RR_ZORAS_FOUNTAIN, []{return logic->HasItem(RG_BRONZE_SCALE) || logic->TakeDamage();}), + Entrance(RR_ZF_HIDDEN_CAVE, []{return true;}), + }); + + areaTable[RR_ZF_ROCK] = Region("ZF Rock", "Zoras Fountain", {RA_ZORAS_FOUNTAIN}, NO_DAY_NIGHT_CYCLE, {}, { + //Locations + //Has a wonder item + }, { + //Exits + Entrance(RR_ZORAS_FOUNTAIN, []{return true;}), }); areaTable[RR_ZF_GREAT_FAIRY_FOUNTAIN] = Region("ZF Great Fairy Fountain", "ZF Great Fairy Fountain", {}, NO_DAY_NIGHT_CYCLE, {}, { diff --git a/soh/soh/Enhancements/randomizer/logic.cpp b/soh/soh/Enhancements/randomizer/logic.cpp index 4a1ede8e7..9fd460d93 100644 --- a/soh/soh/Enhancements/randomizer/logic.cpp +++ b/soh/soh/Enhancements/randomizer/logic.cpp @@ -71,7 +71,7 @@ bool Logic::HasItem(RandomizerGet itemName) { case RG_DISTANT_SCARECROW: return ScarecrowsSong() && CanUse(RG_LONGSHOT); case RG_MAGIC_BEAN: - return GetAmmo(ITEM_BEAN) > 0; + return GetAmmo(ITEM_BEAN) > 0 || CheckInventory(ITEM_BEAN, true); case RG_KOKIRI_SWORD: case RG_DEKU_SHIELD: case RG_GORON_TUNIC: @@ -558,9 +558,8 @@ bool Logic::CanKillEnemy(RandomizerEnemy enemy, EnemyDistance distance, bool wal } return killed; case RE_DODONGO: - return CanUse(RG_KOKIRI_SWORD) || CanUse(RG_MASTER_SWORD) || CanUse(RG_BIGGORON_SWORD) || - CanUse(RG_MEGATON_HAMMER) || (quantity <= 5 && CanUse(RG_STICKS)) || HasExplosives() || - CanUse(RG_FAIRY_SLINGSHOT) || CanUse(RG_FAIRY_BOW); + return CanUseSword() || CanUse(RG_MEGATON_HAMMER) || (quantity <= 5 && CanUse(RG_STICKS)) || + HasExplosives() || CanUse(RG_FAIRY_SLINGSHOT) || CanUse(RG_FAIRY_BOW); case RE_LIZALFOS: return CanJumpslash() || HasExplosives() || CanUse(RG_FAIRY_SLINGSHOT) || CanUse(RG_FAIRY_BOW); case RE_KEESE: @@ -604,11 +603,9 @@ bool Logic::CanKillEnemy(RandomizerEnemy enemy, EnemyDistance distance, bool wal (CanUse(RG_NUTS) || HookshotOrBoomerang() || CanStandingShield())); case RE_DEAD_HAND: // RANDOTODO change Dead Hand trick to be sticks Dead Hand - return CanUse(RG_KOKIRI_SWORD) || CanUse(RG_MASTER_SWORD) || CanUse(RG_BIGGORON_SWORD) || - (CanUse(RG_STICKS) && ctx->GetTrickOption(RT_BOTW_CHILD_DEADHAND)); + return CanUseSword() || (CanUse(RG_STICKS) && ctx->GetTrickOption(RT_BOTW_CHILD_DEADHAND)); case RE_WITHERED_DEKU_BABA: - return CanUse(RG_KOKIRI_SWORD) || CanUse(RG_MASTER_SWORD) || CanUse(RG_BIGGORON_SWORD) || - CanUse(RG_BOOMERANG); + return CanUseSword() || CanUse(RG_BOOMERANG); case RE_LIKE_LIKE: case RE_FLOORMASTER: return CanDamage(); @@ -645,8 +642,7 @@ bool Logic::CanKillEnemy(RandomizerEnemy enemy, EnemyDistance distance, bool wal // bow and sling can wake them and damage after they shed their armour, so could reduce ammo requirements for // explosives to 10. requires 8 sticks to kill so would be a trick unless we apply higher stick bag logic case RE_IRON_KNUCKLE: - return CanUse(RG_KOKIRI_SWORD) || CanUse(RG_MASTER_SWORD) || CanUse(RG_BIGGORON_SWORD) || - CanUse(RG_MEGATON_HAMMER) || HasExplosives(); + return CanUseSword() || CanUse(RG_MEGATON_HAMMER) || HasExplosives(); // To stun flare dancer with chus, you have to hit the flame under it while it is spinning. It should eventually // return to spinning after dashing for a while if you miss the window it is possible to damage the core with // explosives, but difficult to get all 4 hits in even with chus, and if it reconstructs the core heals, so it @@ -695,9 +691,8 @@ bool Logic::CanKillEnemy(RandomizerEnemy enemy, EnemyDistance distance, bool wal CanUse(RG_STICKS) || HasExplosives() || CanUse(RG_HOOKSHOT) || CanUse(RG_DINS_FIRE) || CanUse(RG_FIRE_ARROWS); case RE_SHELL_BLADE: - return CanUse(RG_KOKIRI_SWORD) || CanUse(RG_MASTER_SWORD) || CanUse(RG_BIGGORON_SWORD) || - CanUse(RG_MEGATON_HAMMER) || CanUse(RG_STICKS) || HasExplosives() || CanUse(RG_HOOKSHOT) || - CanUse(RG_FAIRY_BOW) || CanUse(RG_DINS_FIRE); + return CanJumpslash() || HasExplosives() || CanUse(RG_HOOKSHOT) || CanUse(RG_FAIRY_BOW) || + CanUse(RG_DINS_FIRE); case RE_SPIKE: return CanUse(RG_MASTER_SWORD) || CanUse(RG_BIGGORON_SWORD) || CanUse(RG_MEGATON_HAMMER) || CanUse(RG_STICKS) || HasExplosives() || CanUse(RG_HOOKSHOT) || CanUse(RG_FAIRY_BOW) || @@ -744,25 +739,20 @@ bool Logic::CanKillEnemy(RandomizerEnemy enemy, EnemyDistance distance, bool wal case RE_BARINADE: return HasBossSoul(RG_BARINADE_SOUL) && CanUse(RG_BOOMERANG) && CanJumpslashExceptHammer(); case RE_PHANTOM_GANON: - return HasBossSoul(RG_PHANTOM_GANON_SOUL) && - (CanUse(RG_KOKIRI_SWORD) || CanUse(RG_MASTER_SWORD) || CanUse(RG_BIGGORON_SWORD)) && + return HasBossSoul(RG_PHANTOM_GANON_SOUL) && CanUseSword() && (CanUse(RG_HOOKSHOT) || CanUse(RG_FAIRY_BOW) || CanUse(RG_FAIRY_SLINGSHOT)); case RE_VOLVAGIA: return HasBossSoul(RG_VOLVAGIA_SOUL) && CanUse(RG_MEGATON_HAMMER); case RE_MORPHA: - return HasBossSoul(RG_MORPHA_SOUL) && CanUse(RG_HOOKSHOT) && - (CanUse(RG_KOKIRI_SWORD) || CanUse(RG_MASTER_SWORD) || CanUse(RG_BIGGORON_SWORD) || - CanUse(RG_MEGATON_HAMMER)); + return HasBossSoul(RG_MORPHA_SOUL) && CanUse(RG_HOOKSHOT) && (CanUseSword() || CanUse(RG_MEGATON_HAMMER)); case RE_BONGO_BONGO: return HasBossSoul(RG_BONGO_BONGO_SOUL) && - (CanUse(RG_LENS_OF_TRUTH) || ctx->GetTrickOption(RT_LENS_BONGO)) && - (CanUse(RG_KOKIRI_SWORD) || CanUse(RG_MASTER_SWORD) || CanUse(RG_BIGGORON_SWORD)) && + (CanUse(RG_LENS_OF_TRUTH) || ctx->GetTrickOption(RT_LENS_BONGO)) && CanUseSword() && (CanUse(RG_HOOKSHOT) || CanUse(RG_FAIRY_BOW) || CanUse(RG_FAIRY_SLINGSHOT) || ctx->GetTrickOption(RT_SHADOW_BONGO)); case RE_TWINROVA: return HasBossSoul(RG_TWINROVA_SOUL) && CanUse(RG_MIRROR_SHIELD) && - (CanUse(RG_KOKIRI_SWORD) || CanUse(RG_MASTER_SWORD) || CanUse(RG_BIGGORON_SWORD) || - CanUse(RG_MEGATON_HAMMER)); + (CanUseSword() || CanUse(RG_MEGATON_HAMMER)); case RE_GANONDORF: // RANDOTODO: Trick to use hammer (no jumpslash) or stick (only jumpslash) instead of a sword to reflect the // energy ball and either of them regardless of jumpslashing to damage and kill ganondorf @@ -771,8 +761,7 @@ bool Logic::CanKillEnemy(RandomizerEnemy enemy, EnemyDistance distance, bool wal // for killing ganondorf and all of those can reflect the energy ball // This will not be the case once ammo logic in taken into account as // sticks are limited and using a bottle might become a requirement in that case - return HasBossSoul(RG_GANON_SOUL) && CanUse(RG_LIGHT_ARROWS) && - (CanUse(RG_KOKIRI_SWORD) || CanUse(RG_MASTER_SWORD) || CanUse(RG_BIGGORON_SWORD)); + return HasBossSoul(RG_GANON_SOUL) && CanUse(RG_LIGHT_ARROWS) && CanUseSword(); case RE_GANON: return HasBossSoul(RG_GANON_SOUL) && CanUse(RG_MASTER_SWORD); case RE_DARK_LINK: @@ -792,8 +781,7 @@ bool Logic::CanKillEnemy(RandomizerEnemy enemy, EnemyDistance distance, bool wal return CanUse(RG_BOOMERANG); case RE_BARI: return HookshotOrBoomerang() || CanUse(RG_FAIRY_BOW) || HasExplosives() || CanUse(RG_MEGATON_HAMMER) || - CanUse(RG_STICKS) || CanUse(RG_DINS_FIRE) || - (TakeDamage() && (CanUse(RG_KOKIRI_SWORD) || CanUse(RG_MASTER_SWORD) || CanUse(RG_BIGGORON_SWORD))); + CanUse(RG_STICKS) || CanUse(RG_DINS_FIRE) || (TakeDamage() && CanUseSword()); case RE_SHABOM: // RANDOTODO when you add better damage logic, you can kill this by taking hits return CanUse(RG_BOOMERANG) || CanUse(RG_NUTS) || CanJumpslash() || CanUse(RG_DINS_FIRE) || @@ -962,7 +950,7 @@ bool Logic::CanBreakMudWalls() { } bool Logic::CanGetDekuBabaSticks() { - return (CanUse(RG_KOKIRI_SWORD) || CanUse(RG_MASTER_SWORD) || CanUse(RG_BIGGORON_SWORD) || CanUse(RG_BOOMERANG)); + return CanUseSword() || CanUse(RG_BOOMERANG); } bool Logic::CanGetDekuBabaNuts() { @@ -1060,9 +1048,13 @@ bool Logic::HasBottle() { return BottleCount() >= 1; } +bool Logic::CanUseSword() { + return CanUse(RG_KOKIRI_SWORD) || CanUse(RG_MASTER_SWORD) || CanUse(RG_BIGGORON_SWORD); +} + bool Logic::CanJumpslashExceptHammer() { // Not including hammer as hammer jump attacks can be weird; - return CanUse(RG_STICKS) || CanUse(RG_KOKIRI_SWORD) || CanUse(RG_MASTER_SWORD) || CanUse(RG_BIGGORON_SWORD); + return CanUse(RG_STICKS) || CanUseSword(); } bool Logic::CanJumpslash() { @@ -2244,7 +2236,7 @@ const std::vector& GetDungeonSmallKeyDoors(SceneID sceneId) { return dungeonSmallKeyDoors[key]; } -int8_t GetUsedSmallKeyCount(SceneID sceneId) { +int8_t Logic::GetUsedSmallKeyCount(SceneID sceneId) { const auto& smallKeyDoors = GetDungeonSmallKeyDoors(sceneId); // Get the swch value for the scene @@ -2252,7 +2244,7 @@ int8_t GetUsedSmallKeyCount(SceneID sceneId) { if (gPlayState != nullptr && gPlayState->sceneNum == sceneId) { swch = gPlayState->actorCtx.flags.swch; } else { - swch = gSaveContext.sceneFlags[sceneId].swch; + swch = mSaveContext->sceneFlags[sceneId].swch; } // Count the number of small keys doors unlocked diff --git a/soh/soh/Enhancements/randomizer/logic.h b/soh/soh/Enhancements/randomizer/logic.h index 4549c9952..4f966f5de 100644 --- a/soh/soh/Enhancements/randomizer/logic.h +++ b/soh/soh/Enhancements/randomizer/logic.h @@ -209,6 +209,7 @@ class Logic { uint8_t BottleCount(); uint8_t OcarinaButtons(); bool HasBottle(); + bool CanUseSword(); bool CanJumpslashExceptHammer(); bool CanJumpslash(); bool CanHitSwitch(EnemyDistance distance = ED_CLOSE, bool inWater = false); @@ -267,6 +268,7 @@ class Logic { bool CheckEquipment(uint32_t item); bool CheckQuestItem(uint32_t item); void SetQuestItem(uint32_t item, bool state); + int8_t GetUsedSmallKeyCount(SceneID sceneId); uint8_t GetSmallKeyCount(uint32_t dungeonIndex); void SetSmallKeyCount(uint32_t dungeonIndex, uint8_t count); bool CheckDungeonItem(uint32_t item, uint32_t dungeonIndex); diff --git a/soh/soh/Enhancements/randomizer/option.h b/soh/soh/Enhancements/randomizer/option.h index d92fa4473..507729498 100644 --- a/soh/soh/Enhancements/randomizer/option.h +++ b/soh/soh/Enhancements/randomizer/option.h @@ -302,7 +302,7 @@ class Option { /** * @brief Automatically renders a widget for this option in ImGui, based on the various * properties of this Option. Typically, Bool options are rendered as Checkboxes and - * U8 options are rendered as Comboboxes, but this can be overriden during construction with + * U8 options are rendered as Comboboxes, but this can be overridden during construction with * the `widgetType` property. */ bool RenderImGui(); diff --git a/soh/soh/Enhancements/randomizer/randomizer.cpp b/soh/soh/Enhancements/randomizer/randomizer.cpp index d567a3d8e..7a5f8dd69 100644 --- a/soh/soh/Enhancements/randomizer/randomizer.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer.cpp @@ -65,9 +65,10 @@ const std::string Randomizer::NaviRandoMessageTableID = "RandomizerNavi"; const std::string Randomizer::IceTrapRandoMessageTableID = "RandomizerIceTrap"; const std::string Randomizer::randoMiscHintsTableID = "RandomizerMiscHints"; -static const char* englishRupeeNames[175] = { +static const char* englishRupeeNames[190] = { "[P]", "Bad RNG Rolls", + "Baht", "Bananas", "Beanbean Coins", "Beans", @@ -86,6 +87,7 @@ static const char* englishRupeeNames[175] = { "BugFrags", "Canadian Dollars", "Cards", + "Cents", "Chaos Orbs", "Clams", "Coal", @@ -106,6 +108,8 @@ static const char* englishRupeeNames[175] = { "Darseks", "Dead Memes", "Diamonds", + "Dimes", + "Dinars", "DNA", "Doge", "Dogecoin", @@ -114,7 +118,9 @@ static const char* englishRupeeNames[175] = { "Dollarydoos", "Dosh", "Doubloons", + "Drakes", "Dwarfbucks", + "ECU", "Elexit", "Emeralds", "Energon", @@ -150,7 +156,7 @@ static const char* englishRupeeNames[175] = { "KF7 Ammo", "Kinstones", "Kremcoins", - "Kroner", + "Kronor", "Leaves", "Lemmings", "Lien", @@ -173,11 +179,14 @@ static const char* englishRupeeNames[175] = { "Munny", "Mushrooms", "Mysteries", + "Naira", "Neopoints", + "Nickels", "Notes", "Nuyen", "Orbs", "Ore", + "Pence", "Pix", "Pixels", "Plastyks", @@ -190,19 +199,23 @@ static const char* englishRupeeNames[175] = { "Pounds", "Power Pellets", "Primogems", - "Réals", + "Rand", + "Reais", "Refined Metal", "Remote Mines", "Retweets", "Rhinu", + "Rials", "Rings", "Riot Points", + "Riyals", "Robux", "Rubies", "Rubles", "Runite Ore", "Rupees", "Saint Quartz", + "Sapphires", "Septims", "Shekels", "Shillings", @@ -235,24 +248,27 @@ static const char* englishRupeeNames[175] = { "Vespene Gas", "Watts", "Widgets", + "Won", "Woolongs", "World Dollars", "Wumpa Fruit", "Yen", + "Yuan", "Zenny", "Zorkmids", }; -static const char* germanRupeeNames[65] = { - "Bananen", "Bitcoin", "Bonbons", "Bratwürste", "Brause UFOs", "Brötchen", "Cent", "Diamanten", - "Diridari", "Dogecoin", "ECU", "Elexit", "Erz", "Erzbrocken", "Euro", "EXP", - "Forint", "Franken", "Freunde", "Gil", "Gold", "Groschen", "Gulden", "Gummibären", - "Heller", "Juwelen", "Karolin", "Kartoffeln", "Kies", "Knete", "Knochen", "Kohle", - "Kraniche", "Kreuzer", "Kronen", "Kronkorken", "Kröten", "Mark", "Mäuse", "Monde", - "Moorhühner", "Moos", "Münzen", "Penunze", "Pesa", "Pfandflaschen", "Pfennig", "Pfund", - "Pilze", "Plastiks", "Pokédollar", "Radieschen", "Rappen", "Rubine", "Saphire", "Schilling", - "Seelen", "Smaragde", "Steine", "Sterne", "Sternis", "Tael", "Taler", "Wagenchips", - "Zenny" +static const char* germanRupeeNames[80] = { + "Baht", "Bananen", "Bitcoin", "Bonbons", "Bratwürste", "Brause UFOs", "Brötchen", "Cent", + "Diamanten", "Dinar", "Diridari", "Dogecoin", "Dollar", "Draken", "ECU", "Elexit", + "Erz", "Erzbrocken", "Euro", "EXP", "Forint", "Franken", "Freunde", "Gil", + "Gold", "Groschen", "Gulden", "Gummibären", "Heller", "Juwelen", "Karolin", "Kartoffeln", + "Kies", "Knete", "Knochen", "Kohle", "Kraniche", "Kreuzer", "Kronen", "Kronkorken", + "Kröten", "Lira", "Mark", "Mäuse", "Monde", "Moorhühner", "Moos", "Münzen", + "Naira", "Penunze", "Pesa", "Pfandflaschen", "Pfennig", "Pfund", "Pilze", "Plastiks", + "Pokédollar", "Radieschen", "Rand", "Rappen", "Real", "Rial", "Riyal", "Rubine", + "Rupien", "Saphire", "Schilling", "Seelen", "Septime", "Smaragde", "Steine", "Sterne", + "Sternis", "Tael", "Taler", "Wagenchips", "Won", "Yen", "Yuan", "Zenny", }; static const char* frenchRupeeNames[40] = { @@ -260,7 +276,7 @@ static const char* frenchRupeeNames[40] = { "Centimes", "Champignons", "Clochettes", "Crédits", "Croissants", "Diamants", "Dogecoin", "Dollars", "Émeraudes", "Éthers", "Étoiles", "Euros", "Florens", "Francs", "Galds", "Gils", "Grouses", "Halos", "Joyaux", "Lunes", "Mailles", "Munnies", "Orbes", "Orens", - "Pépètes", "Pièces", "Plastyks", "Pokédollars", "Pokémon", "Radis", "Rubis", "Zennies" + "Pépètes", "Pièces", "Plastyks", "Pokédollars", "Pokémon", "Radis", "Rubis", "Zennies", }; Randomizer::Randomizer() { @@ -472,11 +488,10 @@ void Randomizer::LoadMerchantMessages() { // prompted buy/don't buy CustomMessageManager::Instance->CreateMessage( Randomizer::merchantMessageTableID, TEXT_SHOP_ITEM_RANDOM, - CustomMessage( - "\x08#[[1]]# #[[2]]_Rupees#&Special deal! #ONE LEFT#!&Get it while it lasts!\x0A\x02", - "\x08#[[1]]# #[[2]]_Rubine#&Sonderangebot! #NUR NOCH EINES VERFÜGBAR#!&Beeilen Sie sich!\x0A\x02", - "\x08#[[1]]# #[[2]]_Rubis#&Offre spéciale! #DERNIER EN STOCK#!&Faites vite!\x0A\x02", - { QM_GREEN, QM_YELLOW, QM_RED })); + CustomMessage("\x08#[[1]]# #[[2]]_Rupees#&Special deal! #ONE LEFT#!&Get it while it lasts!\x0A\x02", + "\x08#[[1]]# #[[2]]_Rubine#&#NUR NOCH EINES VERFÜGBAR#!&Beeilen Sie sich!\x0A\x02", + "\x08#[[1]]# #[[2]]_Rubis#&#DERNIER EN STOCK#!&Faites vite!\x0A\x02", + { QM_GREEN, QM_YELLOW, QM_RED })); CustomMessageManager::Instance->CreateMessage( Randomizer::merchantMessageTableID, TEXT_SHOP_ITEM_RANDOM_CONFIRM, @@ -5239,7 +5254,7 @@ void Randomizer::CreateCustomMessages() { "Vous obtenez la %rClé %wdu %gBazar&de la Place du Marché%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 la %rClé %wde la&%gPlace du Marché%w!"), + "Vous obtenez la %rClé %wdu&%gMagasin de Potions de la&Place du Marché%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 la %rClé %wde la&%gFoire aux Masques%w!"), @@ -5271,7 +5286,7 @@ void Randomizer::CreateCustomMessages() { "Vous obtenez la %rClé %wdu %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 la %rClé %wde la %gMaison&du chef des ouvriers%w!"), + "Vous obtenez la %rClé %wde la %gMaison&du Chef des Ouvriers%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 la %rClé %wde&l'%gApothicaire%w!"), diff --git a/soh/soh/Enhancements/randomizer/randomizerTypes.h b/soh/soh/Enhancements/randomizer/randomizerTypes.h index 34bddd0a5..ce074bf4c 100644 --- a/soh/soh/Enhancements/randomizer/randomizerTypes.h +++ b/soh/soh/Enhancements/randomizer/randomizerTypes.h @@ -509,6 +509,12 @@ typedef enum { RR_ZD_SHOP, RR_ZD_STORMS_GROTTO, RR_ZORAS_FOUNTAIN, + RR_ZF_ICEBERGS, + RR_ZF_LAKEBED, + RR_ZF_LEDGE, + RR_ZF_HIDDEN_CAVE, + RR_ZF_HIDDEN_LEDGE, + RR_ZF_ROCK, RR_ZF_GREAT_FAIRY_FOUNTAIN, RR_LON_LON_RANCH, RR_LLR_TALONS_HOUSE, diff --git a/soh/soh/Enhancements/randomizer/randomizer_check_tracker.cpp b/soh/soh/Enhancements/randomizer/randomizer_check_tracker.cpp index 5eeabb99c..93798fea5 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_check_tracker.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer_check_tracker.cpp @@ -137,9 +137,9 @@ std::map> checksByArea; bool areasFullyChecked[RCAREA_INVALID]; u32 areasSpoiled = 0; bool showVOrMQ; -s8 areaChecksGotten[RCAREA_INVALID]; //| "Kokiri Forest (4/9)" -s8 areaChecksAvailable[RCAREA_INVALID]; -s8 areaCheckTotals[RCAREA_INVALID]; +s16 areaChecksGotten[RCAREA_INVALID]; //| "Kokiri Forest (4/9)" +s16 areaChecksAvailable[RCAREA_INVALID]; +s16 areaCheckTotals[RCAREA_INVALID]; uint16_t totalChecks = 0; uint16_t totalChecksAvailable = 0; uint16_t totalChecksGotten = 0; @@ -245,6 +245,7 @@ Color_RGBA8 Color_Saved_Extra = { 0, 185, 0, 255 }; // Green std::vector buttons = { BTN_A, BTN_B, BTN_CUP, BTN_CDOWN, BTN_CLEFT, BTN_CRIGHT, BTN_L, BTN_Z, BTN_R, BTN_START, BTN_DUP, BTN_DDOWN, BTN_DLEFT, BTN_DRIGHT }; static ImGuiTextFilter checkSearch; +static bool recalculateAvailable = false; std::array filterAreasHidden = { 0 }; std::array filterChecksHidden = { 0 }; @@ -877,7 +878,7 @@ void SaveTrackerData(SaveContext* saveContext, int sectionID, bool fullSave) { void SaveFile(SaveContext* saveContext, int sectionID, bool fullSave) { SaveTrackerData(saveContext, sectionID, fullSave); if (fullSave) { - RecalculateAvailableChecks(); + recalculateAvailable = true; } } @@ -1086,14 +1087,6 @@ void CheckTrackerWindow::DrawElement() { bool doingCollapseOrExpand = optExpandAll || optCollapseAll; bool isThisAreaSpoiled; RandomizerCheckArea lastArea = RCAREA_INVALID; - Color_RGBA8 areaCompleteColor = - CVarGetColor(CVAR_TRACKER_CHECK("AreaComplete.MainColor.Value"), Color_Main_Default); - Color_RGBA8 areaIncompleteColor = - CVarGetColor(CVAR_TRACKER_CHECK("AreaIncomplete.MainColor.Value"), Color_Main_Default); - Color_RGBA8 extraCompleteColor = - CVarGetColor(CVAR_TRACKER_CHECK("AreaComplete.ExtraColor.Value"), Color_Area_Complete_Extra_Default); - Color_RGBA8 extraIncompleteColor = - CVarGetColor(CVAR_TRACKER_CHECK("AreaIncomplete.ExtraColor.Value"), Color_Area_Incomplete_Extra_Default); Color_RGBA8 mainColor; Color_RGBA8 extraColor; std::string stemp; @@ -1121,11 +1114,11 @@ void CheckTrackerWindow::DrawElement() { } else { // Get the colour for the area if (thisAreaFullyChecked) { - mainColor = areaCompleteColor; - extraColor = extraCompleteColor; + mainColor = Color_Area_Complete_Main; + extraColor = Color_Area_Complete_Extra; } else { - mainColor = areaIncompleteColor; - extraColor = extraIncompleteColor; + mainColor = Color_Area_Incomplete_Main; + extraColor = Color_Area_Incomplete_Extra; } // Draw the area @@ -1932,7 +1925,7 @@ void ImGuiDrawTwoColorPickerSection(const char* text, const char* cvarMainName, "Hidden", cvarHideName, UIWidgets::CheckboxOptions( { { .tooltip = "When active, checks will hide by default when updated to this state. Can " - "be overriden with the \"Show Hidden Items\" option." } }) + "be overridden with the \"Show Hidden Items\" option." } }) .Color(theme)); ImGui::PopID(); } @@ -2032,6 +2025,10 @@ static std::unordered_map buttonStrings = { }; void CheckTrackerSettingsWindow::DrawElement() { + if (recalculateAvailable) { + recalculateAvailable = false; + RecalculateAvailableChecks(); + } ImGui::PushStyleVar(ImGuiStyleVar_CellPadding, { 8.0f, 8.0f }); if (ImGui::BeginTable("CheckTrackerSettingsTable", 2, ImGuiTableFlags_BordersH | ImGuiTableFlags_BordersV)) { ImGui::TableSetupColumn("General settings", ImGuiTableColumnFlags_WidthStretch, 200.0f); diff --git a/soh/soh/Enhancements/randomizer/randomizer_entrance.c b/soh/soh/Enhancements/randomizer/randomizer_entrance.c index 3c7b433af..11d17e621 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_entrance.c +++ b/soh/soh/Enhancements/randomizer/randomizer_entrance.c @@ -404,9 +404,9 @@ void Entrance_SetSavewarpEntrance(void) { gSaveContext.entranceIndex = ENTR_ICE_CAVERN_ENTRANCE; } else if (scene == SCENE_INSIDE_GANONS_CASTLE) { gSaveContext.entranceIndex = ENTR_INSIDE_GANONS_CASTLE_ENTRANCE; - } else if (scene == SCENE_GANONS_TOWER || scene == SCENE_INSIDE_GANONS_CASTLE_COLLAPSE || - scene == SCENE_GANONS_TOWER_COLLAPSE_INTERIOR || scene == SCENE_GANON_BOSS || - scene == SCENE_GANONS_TOWER_COLLAPSE_EXTERIOR) { + } else if (scene == SCENE_GANONS_TOWER || scene == SCENE_GANONDORF_BOSS || + scene == SCENE_INSIDE_GANONS_CASTLE_COLLAPSE || scene == SCENE_GANONS_TOWER_COLLAPSE_INTERIOR || + scene == SCENE_GANON_BOSS || scene == SCENE_GANONS_TOWER_COLLAPSE_EXTERIOR) { gSaveContext.entranceIndex = ENTR_GANONS_TOWER_0; // Inside Ganon's Castle -> Ganon's Tower Climb } else if (scene == SCENE_THIEVES_HIDEOUT) { // Theives hideout gSaveContext.entranceIndex = ENTR_THIEVES_HIDEOUT_0; // Gerudo Fortress -> Thieve's Hideout spawn 0 diff --git a/soh/soh/Enhancements/randomizer/randomizer_entrance_tracker.cpp b/soh/soh/Enhancements/randomizer/randomizer_entrance_tracker.cpp index c8e12f449..f93172647 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_entrance_tracker.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer_entrance_tracker.cpp @@ -423,7 +423,7 @@ bool IsEntranceDiscovered(s16 index) { bool isDiscovered = Entrance_GetIsEntranceDiscovered(index); if (!isDiscovered) { // If the pair included one of the hyrule field <-> zora's river entrances, - // the randomizer will have also overriden the water-based entrances, so check those too + // the randomizer will have also overridden the water-based entrances, so check those too if ((index == ENTR_ZORAS_RIVER_WEST_EXIT && Entrance_GetIsEntranceDiscovered(ENTR_ZORAS_RIVER_3)) || (index == ENTR_ZORAS_RIVER_3 && Entrance_GetIsEntranceDiscovered(ENTR_ZORAS_RIVER_WEST_EXIT))) { isDiscovered = true; diff --git a/soh/soh/Enhancements/randomizer/randomizer_item_tracker.cpp b/soh/soh/Enhancements/randomizer/randomizer_item_tracker.cpp index 8d9d2559a..b86da3c0c 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_item_tracker.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer_item_tracker.cpp @@ -1161,8 +1161,12 @@ void BeginFloatingWindows(std::string UniqueName, ImGuiWindowFlags flags = 0) { windowFlags |= ImGuiWindowFlags_NoInputs | ImGuiWindowFlags_NoMove; } } - ImGui::PushStyleColor(ImGuiCol_WindowBg, - VecFromRGBA8(CVarGetColor(CVAR_TRACKER_ITEM("BgColor.Value"), { 0, 0, 0, 0 }))); + auto color = VecFromRGBA8(CVarGetColor(CVAR_TRACKER_ITEM("BgColor.Value"), { 0, 0, 0, 0 })); + ImGuiWindow* window = ImGui::FindWindowByName(UniqueName.c_str()); + if (window != NULL && window->DockTabIsVisible) { + color.w = 1.0f; + } + ImGui::PushStyleColor(ImGuiCol_WindowBg, color); ImGui::PushStyleColor(ImGuiCol_Border, ImVec4(0, 0, 0, 0)); ImGui::PushStyleVar(ImGuiStyleVar_WindowRounding, 4.0f); ImGui::Begin(UniqueName.c_str(), nullptr, windowFlags); @@ -1839,7 +1843,8 @@ void ItemTrackerSettingsWindow::DrawElement() { } if (CVarGetInteger(CVAR_TRACKER_ITEM("DisplayType.DungeonRewards"), SECTION_DISPLAY_MAIN_WINDOW) == SECTION_DISPLAY_SEPARATE) { - if (CVarCheckbox("Circle display", CVAR_TRACKER_ITEM("DungeonRewardsLayout"))) { + if (CVarCheckbox("Circle display", CVAR_TRACKER_ITEM("DungeonRewardsLayout"), + CheckboxOptions().DefaultValue(false).Color(THEME_COLOR))) { shouldUpdateVectors = true; } } diff --git a/soh/soh/Enhancements/randomizer/savefile.cpp b/soh/soh/Enhancements/randomizer/savefile.cpp index 4753bb4b4..cb8c7eaef 100644 --- a/soh/soh/Enhancements/randomizer/savefile.cpp +++ b/soh/soh/Enhancements/randomizer/savefile.cpp @@ -107,6 +107,7 @@ void GiveLinksPocketItem() { } void SetStartingItems() { + int startingAge = OTRGlobals::Instance->gRandoContext->GetOption(RSK_SELECTED_STARTING_AGE).Get(); if (Randomizer_GetSettingValue(RSK_STARTING_KOKIRI_SWORD)) Item_Give(NULL, ITEM_SWORD_KOKIRI); if (Randomizer_GetSettingValue(RSK_STARTING_DEKU_SHIELD)) @@ -158,6 +159,13 @@ void SetStartingItems() { if (Randomizer_GetSettingValue(RSK_STARTING_NUTS) && !Randomizer_GetSettingValue(RSK_SHUFFLE_DEKU_NUT_BAG)) { GiveLinkDekuNuts(20); } + if (Randomizer_GetSettingValue(RSK_STARTING_MASTER_SWORD)) { + if (startingAge == RO_AGE_ADULT) { + Item_Give(NULL, ITEM_SWORD_MASTER); + } else { + gSaveContext.inventory.equipment |= 1 << 1; + } + } if (Randomizer_GetSettingValue(RSK_FULL_WALLETS)) { GiveLinkRupees(9001); diff --git a/soh/soh/Enhancements/randomizer/settings.cpp b/soh/soh/Enhancements/randomizer/settings.cpp index 5a4150542..c5d0c23d8 100644 --- a/soh/soh/Enhancements/randomizer/settings.cpp +++ b/soh/soh/Enhancements/randomizer/settings.cpp @@ -2014,16 +2014,16 @@ void Settings::UpdateOptionProperties() { } } - int dungeonShuffle = + bool dungeonShuffle = CVarGetInteger(CVAR_RANDOMIZER_SETTING("ShuffleDungeonsEntrances"), RO_DUNGEON_ENTRANCE_SHUFFLE_OFF); - int bossShuffle = + bool bossShuffle = CVarGetInteger(CVAR_RANDOMIZER_SETTING("ShuffleBossEntrances"), RO_BOSS_ROOM_ENTRANCE_SHUFFLE_OFF); - int overworldShuffle = CVarGetInteger(CVAR_RANDOMIZER_SETTING("ShuffleOverworldEntrances"), RO_GENERIC_OFF); - int interiorShuffle = CVarGetInteger(CVAR_RANDOMIZER_SETTING("ShuffleInteriorsEntrances"), RO_GENERIC_OFF); - int grottoShuffle = CVarGetInteger(CVAR_RANDOMIZER_SETTING("ShuffleGrottosEntrances"), RO_GENERIC_OFF); + bool overworldShuffle = CVarGetInteger(CVAR_RANDOMIZER_SETTING("ShuffleOverworldEntrances"), RO_GENERIC_OFF); + bool interiorShuffle = CVarGetInteger(CVAR_RANDOMIZER_SETTING("ShuffleInteriorsEntrances"), RO_GENERIC_OFF); + bool grottoShuffle = CVarGetInteger(CVAR_RANDOMIZER_SETTING("ShuffleGrottosEntrances"), RO_GENERIC_OFF); - // Hide Mixed Entrances option if no applicable entrance shuffles are visible - if (!dungeonShuffle && !bossShuffle && !overworldShuffle && !interiorShuffle && !grottoShuffle) { + // Hide Mixed Entrances option if 1 or no applicable entrance shuffles are visible + if (dungeonShuffle + bossShuffle + overworldShuffle + interiorShuffle + grottoShuffle <= 1) { mOptions[RSK_MIXED_ENTRANCE_POOLS].Hide(); } else { mOptions[RSK_MIXED_ENTRANCE_POOLS].Unhide(); @@ -2782,6 +2782,36 @@ void Context::FinalizeSettings(const std::set& excludedLocation trials[i]->SetAsRequired(); } + bool dungeonShuffle = !mOptions[RSK_SHUFFLE_DUNGEON_ENTRANCES].Is(RO_GENERIC_OFF); + bool bossShuffle = !mOptions[RSK_SHUFFLE_BOSS_ENTRANCES].Is(RO_GENERIC_OFF); + bool overworldShuffle = !mOptions[RSK_SHUFFLE_OVERWORLD_ENTRANCES].Is(RO_GENERIC_OFF); + bool interiorShuffle = !mOptions[RSK_SHUFFLE_INTERIOR_ENTRANCES].Is(RO_INTERIOR_ENTRANCE_SHUFFLE_OFF); + bool grottoShuffle = !mOptions[RSK_SHUFFLE_GROTTO_ENTRANCES].Is(RO_GENERIC_OFF); + + if (dungeonShuffle + bossShuffle + overworldShuffle + interiorShuffle + grottoShuffle <= 1) { + mOptions[RSK_MIXED_ENTRANCE_POOLS].Set(RO_GENERIC_OFF); + } + + if (!mOptions[RSK_MIXED_ENTRANCE_POOLS] || !dungeonShuffle) { + mOptions[RSK_MIX_DUNGEON_ENTRANCES].Set(RO_GENERIC_OFF); + } + + if (!mOptions[RSK_MIXED_ENTRANCE_POOLS] || !bossShuffle) { + mOptions[RSK_MIX_BOSS_ENTRANCES].Set(RO_GENERIC_OFF); + } + + if (!mOptions[RSK_MIXED_ENTRANCE_POOLS] || !overworldShuffle) { + mOptions[RSK_MIX_OVERWORLD_ENTRANCES].Set(RO_GENERIC_OFF); + } + + if (!mOptions[RSK_MIXED_ENTRANCE_POOLS] || !interiorShuffle) { + mOptions[RSK_MIX_INTERIOR_ENTRANCES].Set(RO_GENERIC_OFF); + } + + if (!mOptions[RSK_MIXED_ENTRANCE_POOLS] || !grottoShuffle) { + mOptions[RSK_MIX_GROTTO_ENTRANCES].Set(RO_GENERIC_OFF); + } + if (mOptions[RSK_FOREST].Is(RO_CLOSED_FOREST_ON) && (mOptions[RSK_SHUFFLE_INTERIOR_ENTRANCES].Is(RO_INTERIOR_ENTRANCE_SHUFFLE_ALL) || mOptions[RSK_SHUFFLE_OVERWORLD_ENTRANCES] || mOptions[RSK_SHUFFLE_OVERWORLD_SPAWNS] || diff --git a/soh/soh/OTRGlobals.cpp b/soh/soh/OTRGlobals.cpp index 0151773a9..72030657e 100644 --- a/soh/soh/OTRGlobals.cpp +++ b/soh/soh/OTRGlobals.cpp @@ -310,7 +310,7 @@ OTRGlobals::OTRGlobals() { // tell LUS to reserve 3 SoH specific threads (Game, Audio, Save) context->InitResourceManager(OTRFiles, {}, 3); - prevAltAssets = CVarGetInteger(CVAR_ENHANCEMENT("AltAssets"), 0); + prevAltAssets = CVarGetInteger(CVAR_SETTING("AltAssets"), 0); context->GetResourceManager()->SetAltAssetsEnabled(prevAltAssets); auto controlDeck = std::make_shared(std::vector({ @@ -1428,7 +1428,7 @@ extern "C" void Graph_StartFrame() { } #endif case KbScancode::LUS_KB_TAB: { - CVarSetInteger(CVAR_ENHANCEMENT("AltAssets"), !CVarGetInteger(CVAR_ENHANCEMENT("AltAssets"), 0)); + CVarSetInteger(CVAR_SETTING("AltAssets"), !CVarGetInteger(CVAR_SETTING("AltAssets"), 0)); break; } } @@ -1524,7 +1524,7 @@ extern "C" void Graph_ProcessGfxCommands(Gfx* commands) { } } - bool curAltAssets = CVarGetInteger(CVAR_ENHANCEMENT("AltAssets"), 0); + bool curAltAssets = CVarGetInteger(CVAR_SETTING("AltAssets"), 0); if (prevAltAssets != curAltAssets) { prevAltAssets = curAltAssets; Ship::Context::GetInstance()->GetResourceManager()->SetAltAssetsEnabled(curAltAssets); diff --git a/soh/soh/SaveManager.cpp b/soh/soh/SaveManager.cpp index 36640c728..97ab6a52a 100644 --- a/soh/soh/SaveManager.cpp +++ b/soh/soh/SaveManager.cpp @@ -2908,6 +2908,7 @@ extern "C" void Save_LoadFile(void) { OTRGlobals::Instance->gRandoContext = Rando::Context::CreateInstance(); OTRGlobals::Instance->gRandoContext->GetLogic()->SetSaveContext(&gSaveContext); Rando::Settings::GetInstance()->AssignContext(OTRGlobals::Instance->gRandoContext); + OTRGlobals::Instance->gRandoContext->AddExcludedOptions(); SaveManager::Instance->LoadFile(gSaveContext.fileNum); } diff --git a/soh/soh/SohGui/SohMenu.h b/soh/soh/SohGui/SohMenu.h index 4a72938bb..eb3b1f4f7 100644 --- a/soh/soh/SohGui/SohMenu.h +++ b/soh/soh/SohGui/SohMenu.h @@ -28,6 +28,13 @@ void disableBetaQuest(); namespace SohGui { +static std::unordered_map languages = { + { LANGUAGE_ENG, "English" }, + { LANGUAGE_GER, "German" }, + { LANGUAGE_FRA, "French" }, + { LANGUAGE_JPN, "Japanese" }, +}; + static const std::unordered_map menuThemeOptions = { { UIWidgets::Colors::Red, "Red" }, { UIWidgets::Colors::DarkRed, "Dark Red" }, diff --git a/soh/soh/SohGui/SohMenuEnhancements.cpp b/soh/soh/SohGui/SohMenuEnhancements.cpp index 10975589f..786183882 100644 --- a/soh/soh/SohGui/SohMenuEnhancements.cpp +++ b/soh/soh/SohGui/SohMenuEnhancements.cpp @@ -429,12 +429,12 @@ void SohMenu::AddMenuEnhancements() { AddWidget(path, "Mods", WIDGET_SEPARATOR_TEXT); AddWidget(path, "Use Alternate Assets", WIDGET_CVAR_CHECKBOX) - .CVar(CVAR_ENHANCEMENT("AltAssets")) + .CVar(CVAR_SETTING("AltAssets")) .Options(CheckboxOptions().Tooltip( "Toggle between standard assets and alternate assets. Usually mods will indicate if " "this setting has to be used or not.")); AddWidget(path, "Disable Bomb Billboarding", WIDGET_CVAR_CHECKBOX) - .CVar("DisableBombBillboarding") + .CVar(CVAR_ENHANCEMENT("DisableBombBillboarding")) .Options(CheckboxOptions().Tooltip( "Disables bombs always rotating to face the camera. To be used in conjunction with mods that want to " "replace bombs with 3D objects.")); @@ -562,7 +562,7 @@ void SohMenu::AddMenuEnhancements() { AddWidget(path, "Kokiri Draw Distance", WIDGET_CVAR_CHECKBOX) .CVar(CVAR_ENHANCEMENT("DisableKokiriDrawDistance")) .PreFunc( - [](WidgetInfo& info) { info.isHidden = CVarGetInteger(CVAR_ENHANCEMENT("DisableDrawDistance"), 1) > 1; }) + [](WidgetInfo& info) { info.isHidden = CVarGetInteger(CVAR_ENHANCEMENT("DisableDrawDistance"), 1) <= 1; }) .Options(CheckboxOptions().Tooltip( "The Kokiri are mystical beings that fade into view when approached. Enabling this will remove their " "draw distance.")); @@ -745,7 +745,7 @@ void SohMenu::AddMenuEnhancements() { }) .Options(CheckboxOptions().Tooltip( "Allows Light Arrows to activate Sun Switches. May require a room reload if toggled during gameplay.")); - AddWidget(path, "Bow and Child/Slingshot as Adult", WIDGET_CVAR_CHECKBOX) + AddWidget(path, "Bow as Child/Slingshot as Adult", WIDGET_CVAR_CHECKBOX) .CVar(CVAR_ENHANCEMENT("BowSlingshotAmmoFix")) .Options(CheckboxOptions().Tooltip("Allows Child Link to use a Bow with Arrows.\n" "Allows Adult Link to use a Slingshot with Seeds.\n\n" @@ -777,9 +777,8 @@ void SohMenu::AddMenuEnhancements() { .Options(CheckboxOptions().Tooltip( "Change aiming for the Boomerang from Third-Person to First-Person to see past Link's head.")); AddWidget(path, "Aiming Reticle for Boomerang", WIDGET_CVAR_CHECKBOX) - .CVar(CVAR_ENHANCEMENT("BoomerangFirstPerson")) - .PreFunc( - [](WidgetInfo& info) { info.isHidden = CVarGetInteger(CVAR_ENHANCEMENT("BoomerangFirstPerson"), 0) != 0; }) + .CVar(CVAR_ENHANCEMENT("BoomerangReticle")) + .PreFunc([](WidgetInfo& info) { info.isHidden = !CVarGetInteger(CVAR_ENHANCEMENT("BoomerangFirstPerson"), 0); }) .Options(CheckboxOptions().Tooltip("Aiming with the Boomerang will display a reticle as with the Hookshot.")); AddWidget(path, "Magic Spells", WIDGET_SEPARATOR_TEXT); @@ -1098,7 +1097,7 @@ void SohMenu::AddMenuEnhancements() { .CVar(CVAR_ENHANCEMENT("DeleteFileOnDeath")) .Options(CheckboxOptions().Tooltip("Dying will delete your file.\n\n" ICON_FA_EXCLAMATION_TRIANGLE " WARNING " ICON_FA_EXCLAMATION_TRIANGLE - "\nTHIS IS NOT REVERSABLE!\nUSE AT YOUR OWN RISK!")); + "\nTHIS IS NOT REVERSIBLE!\nUSE AT YOUR OWN RISK!")); AddWidget(path, "Always Win Goron Pot", WIDGET_CVAR_CHECKBOX) .CVar(CVAR_ENHANCEMENT("GoronPot")) .Options(CheckboxOptions().Tooltip("Always get the Heart Piece/Purple Rupee from the Spinning Goron Pot.")); diff --git a/soh/soh/SohGui/SohMenuSettings.cpp b/soh/soh/SohGui/SohMenuSettings.cpp index 94619a43b..2b1f77799 100644 --- a/soh/soh/SohGui/SohMenuSettings.cpp +++ b/soh/soh/SohGui/SohMenuSettings.cpp @@ -14,12 +14,7 @@ namespace SohGui { extern std::shared_ptr mSohMenu; using namespace UIWidgets; -static const std::unordered_map languages = { - { LANGUAGE_ENG, "English" }, - { LANGUAGE_GER, "German" }, - { LANGUAGE_FRA, "French" }, - { LANGUAGE_JPN, "Japanese" }, -}; + static std::unordered_map imguiScaleOptions = { { 0, "Small" }, { 1, "Normal" }, diff --git a/soh/soh/SohGui/UIWidgets.cpp b/soh/soh/SohGui/UIWidgets.cpp index f5e84f302..3c4e91147 100644 --- a/soh/soh/SohGui/UIWidgets.cpp +++ b/soh/soh/SohGui/UIWidgets.cpp @@ -895,6 +895,12 @@ bool CVarColorPicker(const char* label, const char* cvarName, Color_RGBA8 defaul UIWidgets::ButtonOptions({ { .tooltip = "Resets this color to its default value" } }) .Color(themeColor) .Size(UIWidgets::Sizes::Inline))) { + // TODO: Remove for next minor or major version, temporary fix for already migrated configs to 3 for 9.0.0 + CVarClear((std::string(cvarName) + ".R").c_str()); + CVarClear((std::string(cvarName) + ".G").c_str()); + CVarClear((std::string(cvarName) + ".B").c_str()); + CVarClear((std::string(cvarName) + ".A").c_str()); + CVarClear((std::string(cvarName) + ".Type").c_str()); CVarClearBlock(valueCVar.c_str()); Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesNextFrame(); } diff --git a/soh/soh/config/ConfigMigrators.h b/soh/soh/config/ConfigMigrators.h index a312be604..ee7e91792 100644 --- a/soh/soh/config/ConfigMigrators.h +++ b/soh/soh/config/ConfigMigrators.h @@ -1263,10 +1263,10 @@ std::vector version3Migrations = { { MigrationAction::Rename, "gUnfixGoronSpin", "gCosmetics.UnfixGoronSpin" }, { MigrationAction::Rename, "gNL_Diamond_Env", "gCosmetics.Magic.NayrusSecondary" }, { MigrationAction::Rename, "gUseSpellsCol", "gCosmetics.UseSpellsColors" }, - { MigrationAction::Rename, "gItemTrackerBgColorA", "gTrackers.ItemTracker.BgColorA" }, - { MigrationAction::Rename, "gItemTrackerBgColorB", "gTrackers.ItemTracker.BgColorB" }, - { MigrationAction::Rename, "gItemTrackerBgColorG", "gTrackers.ItemTracker.BgColorG" }, - { MigrationAction::Rename, "gItemTrackerBgColorR", "gTrackers.ItemTracker.BgColorR" }, + { MigrationAction::Rename, "gItemTrackerBgColorA", "gTrackers.ItemTracker.BgColor.Value.A" }, + { MigrationAction::Rename, "gItemTrackerBgColorB", "gTrackers.ItemTracker.BgColor.Value.B" }, + { MigrationAction::Rename, "gItemTrackerBgColorG", "gTrackers.ItemTracker.BgColor.Value.G" }, + { MigrationAction::Rename, "gItemTrackerBgColorR", "gTrackers.ItemTracker.BgColor.Value.R" }, { MigrationAction::Rename, "gItemTrackerCapacityTrack", "gTrackers.ItemTracker.ItemCountType" }, { MigrationAction::Rename, "gItemTrackerComboButton1", "gTrackers.ItemTracker.ComboButton1" }, { MigrationAction::Rename, "gItemTrackerComboButton2", "gTrackers.ItemTracker.ComboButton2" }, @@ -1310,22 +1310,24 @@ std::vector version3Migrations = { { MigrationAction::Rename, "gEntranceTrackerSortBy", "gTrackers.EntranceTracker.SortBy" }, { MigrationAction::Rename, "gCheckTrackerAreaCompleteHide", "gTrackers.CheckTracker.AreaComplete.Hide" }, { MigrationAction::Rename, "gCheckTrackerAreaExtraCompleteColor", - "gTrackers.CheckTracker.AreaComplete.ExtraColor" }, - { MigrationAction::Rename, "gCheckTrackerAreaExtraIncompleteColor", - "gTrackers.CheckTracker.AreaIncomplete.ExtraColor" }, + "gTrackers.CheckTracker.AreaComplete.ExtraColor.Value" }, + { MigrationAction::Rename, "gCheckTrackerAreaExtraIncompleteColor.Value", + "gTrackers.CheckTracker.AreaIncomplete.ExtraColor.Value" }, { MigrationAction::Rename, "gCheckTrackerAreaIncompleteHide", "gTrackers.CheckTracker.AreaIncomplete.Hide" }, - { MigrationAction::Rename, "gCheckTrackerAreaMainCompleteColor", "gTrackers.CheckTracker.AreaComplete.MainColor" }, - { MigrationAction::Rename, "gCheckTrackerAreaMainIncompleteColor", - "gTrackers.CheckTracker.AreaIncomplete.MainColor" }, - { MigrationAction::Rename, "gCheckTrackerBgColor", "gTrackers.CheckTracker.BgColor" }, - { MigrationAction::Rename, "gCheckTrackerCollectedExtraColor", "gTrackers.CheckTracker.Collected.ExtraColor" }, + { MigrationAction::Rename, "gCheckTrackerAreaMainCompleteColor", + "gTrackers.CheckTracker.AreaComplete.MainColor.Value" }, + { MigrationAction::Rename, "gCheckTrackerAreaMainIncompleteColor.Value", + "gTrackers.CheckTracker.AreaIncomplete.MainColor.Value" }, + { MigrationAction::Rename, "gCheckTrackerBgColor", "gTrackers.CheckTracker.BgColor.Value" }, + { MigrationAction::Rename, "gCheckTrackerCollectedExtraColor", + "gTrackers.CheckTracker.Collected.ExtraColor.Value" }, { MigrationAction::Rename, "gCheckTrackerCollectedHide", "gTrackers.CheckTracker.Collected.Hide" }, - { MigrationAction::Rename, "gCheckTrackerCollectedMainColor", "gTrackers.CheckTracker.Collected.MainColor" }, + { MigrationAction::Rename, "gCheckTrackerCollectedMainColor", "gTrackers.CheckTracker.Collected.MainColor.Value" }, { MigrationAction::Rename, "gCheckTrackerComboButton1", "gTrackers.CheckTracker.ComboButton1" }, { MigrationAction::Rename, "gCheckTrackerComboButton2", "gTrackers.CheckTracker.ComboButton2" }, { MigrationAction::Rename, "gCheckTrackerDisplayType", "gTrackers.CheckTracker.DisplayType" }, - { MigrationAction::Rename, "gCheckTrackerHintedExtraColor", "gTrackers.CheckTracker.Hinted.ExtraColor" }, - { MigrationAction::Rename, "gCheckTrackerHintedMainColor", "gTrackers.CheckTracker.Hinted.MainColor" }, + { MigrationAction::Rename, "gCheckTrackerHintedExtraColor", "gTrackers.CheckTracker.Hinted.ExtraColor.Value" }, + { MigrationAction::Rename, "gCheckTrackerHintedMainColor", "gTrackers.CheckTracker.Hinted.MainColor.Value" }, { MigrationAction::Rename, "gCheckTrackerHintedHide", "gTrackers.CheckTracker.Hinted.Hide" }, { MigrationAction::Rename, "gCheckTrackerHudEditMode", "gTrackers.CheckTracker.Draggable" }, { MigrationAction::Rename, "gCheckTrackerKnownHide", "gTrackers.CheckTracker.Scummed.Hide" }, @@ -1334,7 +1336,7 @@ std::vector version3Migrations = { "gTrackers.CheckTracker.HideUnshuffledShopChecks" }, { MigrationAction::Rename, "gCheckTrackerOptionMQSpoilers", "gTrackers.CheckTracker.MQSpoilers" }, { MigrationAction::Rename, "gCheckTrackerOptionShowHidden", "gTrackers.CheckTracker.ShowHidden" }, - { MigrationAction::Rename, "gCheckTrackerSavedExtraColor", "gTrackers.CheckTracker.Saved.ExtraColor" }, + { MigrationAction::Rename, "gCheckTrackerSavedExtraColor", "gTrackers.CheckTracker.Saved.ExtraColor.Value" }, { MigrationAction::Rename, "gCheckTrackerSavedHide", "gTrackers.CheckTracker.Saved.Hide" }, { MigrationAction::Rename, "gCheckTrackerSavedMainColor", "gTrackers.CheckTracker.Saved.MainColor" }, { MigrationAction::Rename, "gCheckTrackerScummedExtraColor", "gTrackers.CheckTracker.Scummed.ExtraColor" }, @@ -1345,10 +1347,11 @@ std::vector version3Migrations = { { MigrationAction::Rename, "gCheckTrackerShowOnlyPaused", "gTrackers.CheckTracker.ShowOnlyPaused" }, { MigrationAction::Rename, "gCheckTrackerSkippedExtraColor", "gTrackers.CheckTracker.Skipped.ExtraColor" }, { MigrationAction::Rename, "gCheckTrackerSkippedHide", "gTrackers.CheckTracker.Skipped.Hide" }, - { MigrationAction::Rename, "gCheckTrackerSkippedMainColor", "gTrackers.CheckTracker.Skipped.MainColor" }, - { MigrationAction::Rename, "gCheckTrackerUncheckedExtraColor", "gTrackers.CheckTracker.Unchecked.ExtraColor" }, + { MigrationAction::Rename, "gCheckTrackerSkippedMainColor", "gTrackers.CheckTracker.Skipped.MainColor.Value" }, + { MigrationAction::Rename, "gCheckTrackerUncheckedExtraColor", + "gTrackers.CheckTracker.Unchecked.ExtraColor.Value" }, { MigrationAction::Rename, "gCheckTrackerUncheckedHide", "gTrackers.CheckTracker.Unchecked.Hide" }, - { MigrationAction::Rename, "gCheckTrackerUncheckedMainColor", "gTrackers.CheckTracker.Unchecked.MainColor" }, + { MigrationAction::Rename, "gCheckTrackerUncheckedMainColor", "gTrackers.CheckTracker.Unchecked.MainColor.Value" }, { MigrationAction::Rename, "gCheckTrackerWindowType", "gTrackers.CheckTracker.WindowType" }, { MigrationAction::Rename, "gRandomize10GSHint", "gRandoSettings.10GSHint" }, { MigrationAction::Rename, "gRandomize20GSHint", "gRandoSettings.20GSHint" }, diff --git a/soh/src/overlays/actors/ovl_En_Mag/z_en_mag.c b/soh/src/overlays/actors/ovl_En_Mag/z_en_mag.c index b7ba0617a..6290d65be 100644 --- a/soh/src/overlays/actors/ovl_En_Mag/z_en_mag.c +++ b/soh/src/overlays/actors/ovl_En_Mag/z_en_mag.c @@ -484,8 +484,17 @@ bool EnMag_ShouldDrawPressStart(Font* font, Gfx** gfxP, bool isActualText) { // Title logo is shifted to the left in Master Quest #define LOGO_X_SHIFT (isMQ ? 0 : -8) #define LOGO_TEX (isMQ ? gTitleZeldaShieldLogoMQTex : gTitleZeldaShieldLogoTex) +// Copyright texture is different depending on the version +// JPN CE displays two slightly different 2004 copyrights when lang is jpn or not +// Otherwise the other GC JPN versions either display 2002 for JPN or 2003 for others +// Else fallback to 2003 for GC or 1998 for N64 +#define COPYRIGHT_TEX \ + (isJpnGC_CE \ + ? (gSaveContext.language == LANGUAGE_JPN ? gTitleCopyright19982004JpnTex : gTitleCopyright19982004EngTex) \ + : (isGC ? ((isJpnGC_notCE || gSaveContext.language == LANGUAGE_JPN) ? gTitleCopyright19982002Tex \ + : gTitleCopyright19982003Tex) \ + : gTitleCopyright1998Tex)) // Copyright texture is larger on GC -#define COPYRIGHT_TEX (isGC ? gTitleCopyright19982003Tex : gTitleCopyright1998Tex) #define COPYRIGHT_TEX_WIDTH (isGC ? 160 : 128) #define COPYRIGHT_TEX_LEFT (isGC ? 78 : 94) @@ -515,6 +524,9 @@ void EnMag_DrawInner(Actor* thisx, PlayState* play, Gfx** gfxP) { u16 rectTop; bool isMQ = ResourceMgr_IsGameMasterQuest(); bool isGC = ResourceMgr_GetGamePlatform(0) == GAME_PLATFORM_GC; + bool isJpnGC_CE = isGC && ResourceMgr_GetGameVersion(0) == OOT_NTSC_JP_GC_CE; + bool isJpnGC_notCE = + isGC && (ResourceMgr_GetGameVersion(0) == OOT_NTSC_JP_GC || ResourceMgr_GetGameVersion(0) == OOT_NTSC_JP_MQ); gSPSegment(gfx++, 0x06, play->objectCtx.status[this->actor.objBankIndex].segment); diff --git a/soh/src/overlays/actors/ovl_Fishing/z_fishing.c b/soh/src/overlays/actors/ovl_Fishing/z_fishing.c index 3c2028ce0..94d7e15ca 100644 --- a/soh/src/overlays/actors/ovl_Fishing/z_fishing.c +++ b/soh/src/overlays/actors/ovl_Fishing/z_fishing.c @@ -5170,7 +5170,9 @@ void Fishing_HandleOwnerDialog(Fishing* this, PlayState* play) { if (Actor_HasParent(&this->actor, play)) { this->stateAndTimer = 24; } else { - Actor_OfferGetItem(&this->actor, play, GI_SCALE_GOLDEN, 2000.0f, 1000.0f); + if (!GameInteractor_Should(VB_GIVE_RANDO_GLITCH_FISHING_PRIZE, false, &this)) { + Actor_OfferGetItem(&this->actor, play, GI_SCALE_GOLDEN, 2000.0f, 1000.0f); + } } break; diff --git a/soh/src/overlays/gamestates/ovl_select/z_select.c b/soh/src/overlays/gamestates/ovl_select/z_select.c index 3e1fcf220..e08ba7c97 100644 --- a/soh/src/overlays/gamestates/ovl_select/z_select.c +++ b/soh/src/overlays/gamestates/ovl_select/z_select.c @@ -40,7 +40,7 @@ void Select_LoadGame(SelectContext* this, s32 entranceIndex) { Audio_QueueSeqCmd(SEQ_PLAYER_BGM_MAIN << 24 | NA_BGM_STOP); gSaveContext.entranceIndex = entranceIndex; - // Check the entrance to see if the exit should be overriden to a grotto return point for entrance rando + // Check the entrance to see if the exit should be overridden to a grotto return point for entrance rando if (IS_RANDO && Randomizer_GetSettingValue(RSK_SHUFFLE_ENTRANCES)) { // Ignore return value as we want to load into the entrance specified by the debug menu Grotto_OverrideSpecialEntrance(Entrance_GetOverride(entranceIndex)); @@ -105,7 +105,7 @@ void Select_Grotto_LoadGame(SelectContext* this, s32 grottoIndex) { gSaveContext.respawn[RESPAWN_MODE_RETURN].playerParams = 0x4ff; gSaveContext.respawn[RESPAWN_MODE_RETURN].pos = this->betterGrottos[grottoIndex].pos; - // Check the entrance to see if the exit should be overriden to a grotto return point for entrance rando + // Check the entrance to see if the exit should be overridden to a grotto return point for entrance rando if (IS_RANDO && Randomizer_GetSettingValue(RSK_SHUFFLE_ENTRANCES)) { // Use grotto content and parent scene num to identify the right grotto s16 grottoEntrance = Grotto_GetRenamedGrottoIndexFromOriginal(this->betterGrottos[grottoIndex].data,