diff --git a/.github/workflows/build-check.yml b/.github/workflows/build-check.yml new file mode 100644 index 0000000..3410344 --- /dev/null +++ b/.github/workflows/build-check.yml @@ -0,0 +1,36 @@ +name: MM3DR Build Check + +on: + pull_request: + +jobs: + format: + name: Verify Formatting + runs-on: ubuntu-latest + + steps: + - name: Checkout Project + uses: actions/checkout@v3 + +# - name: Format Project +# uses: DoozyX/clang-format-lint-action@v0.15 +# with: +# source: "./code ./source" +# extensions: 'c,h,cpp,hpp' +# clangFormatVersion: 14 + + build: + name: Confirm Compilable + runs-on: ubuntu-latest + container: + image: ghcr.io/z3dr/randotools:latest + + steps: + - name: Checkout Project + uses: actions/checkout@v3 + with: + submodules: true + + - name: Compile Project + run: | + make -j \ No newline at end of file diff --git a/.github/workflows/create-build.yml b/.github/workflows/create-build.yml new file mode 100644 index 0000000..170d6cb --- /dev/null +++ b/.github/workflows/create-build.yml @@ -0,0 +1,456 @@ +name: MM3DR Build Script + +on: + workflow_dispatch: + inputs: + build_type: + description: 'Build type:' + required: true + type: choice + options: + - Nightly + - Release + version: + description: 'Release version: (For example: 3.2)' + required: false + +jobs: + get-changelog: + name: Retrieve Changelog + runs-on: ubuntu-latest + steps: + - name: Checkout Project + uses: actions/checkout@v4 + with: + fetch-depth: 0 + - name: Get Last Nightly Commit and Private Key + id: nightly-version + run: | + if [[ ${{ github.event.inputs.build_type == 'Nightly' }} == true ]]; then + echo "last_nightly=$(git describe --tags $(git rev-list --tags --max-count=1))" >> $GITHUB_ENV + else + echo "last_nightly=$(git describe --tags --match="v[0-9]*" HEAD --abbrev=0)" >> $GITHUB_ENV + fi + + - name: Generate changelog + id: changelog + uses: metcalfc/changelog-generator@v4.3.0 + with: + myToken: ${{ secrets.GITHUB_TOKEN }} + base-ref: ${{ env.last_nightly }} + outputs: + changelog: ${{ steps.changelog.outputs.changelog }} + last-nightly: ${{ env.last_nightly }} + + build-cia-3dsx: + needs: get-changelog + name: Build CIA and 3DSX Files + runs-on: ubuntu-latest + container: + image: ghcr.io/z3dr/randotools:latest + + steps: + - name: Checkout Project + uses: actions/checkout@v4 + with: + submodules: true + + - if: ${{ github.event.inputs.build_type == 'Nightly' }} + name: Run Build Script Nightly + run: | + chmod +x linux_build_rando.sh + ./linux_build_rando.sh + + - if: ${{ github.event.inputs.build_type == 'Release' }} + name: Run Build Script Release + env: + url_tag: v${{ github.event.inputs.version }} + run: | + chmod +x linux_build_rando.sh + ./linux_build_rando.sh + + - name: Get shorthand commit. + id: vars + run: echo "sha_short=$(echo ${{ github.sha }} | cut -c1-6)" >> $GITHUB_ENV + + - if: ${{ github.event.inputs.build_type == 'Nightly' }} + name: Create Pre-release + uses: ncipollo/release-action@v1.14.0 + with: + token: "${{ secrets.GITHUB_TOKEN }}" + artifacts: "MM3D_Randomizer.cia,MM3D_Randomizer.3dsx,cia.png,3dsx.png" + prerelease: true + commit: "${{ github.sha }}" + tag: "Nightly-${{ env.sha_short }}" + name: "Nightly-${{ env.sha_short }}" + body: | + Please note that these are DEVELOPMENT builds and may not be entirely stable. + When reporting issues, please mention the six character commit listed in the randomizer menu. + You can use the FBI homebrew application to install the randomizer using either of these QR codes. + CIA QR Code: + ![CIA Download](https://github.com/${{ github.repository }}/releases/download/Nightly-${{ env.sha_short }}/cia.png) + 3DSX QR Code: + ![CIA Download](https://github.com/${{ github.repository }}/releases/download/Nightly-${{ env.sha_short }}/3dsx.png) + + Changes Since [${{ needs.get-changelog.outputs.last-nightly }}](https://github.com/${{ github.repository }}/releases/tag/${{ needs.get-changelog.outputs.last-nightly }}) 🛠: + ${{ needs.get-changelog.outputs.changelog }} + + + - if: ${{ github.event.inputs.build_type == 'Release' }} + name: Create Release + uses: ncipollo/release-action@v1.14.0 + with: + token: "${{ secrets.GITHUB_TOKEN }}" + artifacts: "MM3D_Randomizer.cia,MM3D_Randomizer.3dsx,cia.png,3dsx.png" + prerelease: false + commit: "${{ github.sha }}" + tag: "v${{ github.event.inputs.version }}" + name: "v${{ github.event.inputs.version }}" + body: | + ${{ github.event.inputs.version }} Changes 🛠: + ${{ needs.get-changelog.outputs.changelog }} + + When reporting issues, please mention the six character commit listed in the randomizer menu. + You can use the FBI homebrew application to install the randomizer using either of these QR codes. + CIA QR Code: + ![CIA Download](https://github.com/${{ github.repository }}/releases/download/v${{ github.event.inputs.version }}/cia.png) + 3DSX QR Code: + ![CIA Download](https://github.com/${{ github.repository }}/releases/download/v${{ github.event.inputs.version }}/3dsx.png) + + deploy-gist: + needs: build-cia-3dsx + runs-on: ubuntu-latest + steps: + - name: Create basic JSON struct. + + run: | + cat >> ./MM3DR.unistore<< EOF + { + "storeContent": [ + { + "info": { + "title": "MM3D Randomizer ", + "author": "Z3DR Team", + "description": "A randomizer patch for MM3D to be used with Luma for Nintendo 3DS", + "category": [ + "game patch" + ], + "console": [ + "3DS" + ], + "icon_index": 2, + "sheet_index": 0, + "last_updated": " at (UTC)", + "license": "MIT", + "version": "" + }, + "Download MM3D_Randomizer.3dsx": [ + { + "file": "https://github.com/Z3DR/MM3D_Randomizer/releases/latest/download/MM3D_Randomizer.3dsx", + "message": "Downloading MM3D_Randomizer_.3dsx...", + "output": "%3DSX%/MM3D_Randomizer_.3dsx", + "type": "downloadFile" + } + ], + "Download MM3D_Randomizer.cia": [ + { + "file": "https://github.com/Z3DR/MM3D_randomizer/releases/latest/download/MM3D_Randomizer.cia", + "message": "Downloading MM3D_Randomizer_.cia...", + "output": "sdmc:/MM3D_Randomizer_.cia", + "type": "downloadFile" + }, + { + "file": "/MM3D_Randomizer_.cia", + "message": "Installing MM3D_Randomizer_.cia...", + "type": "installCia" + }, + { + "file": "sdmc:/MM3D_Randomizer_.cia", + "message": "Deleting MM3D_Randomizer_.cia.", + "type": "deleteFile" + } + ] + }, + { + "info": { + "title": "MM3D Randomizer Nightly ", + "author": "MM3DR Team", + "description": "A randomizer patch for MM3D to be used with Luma for Nintendo 3DS", + "category": [ + "game patch" + ], + "console": [ + "3DS" + ], + "icon_index": 1, + "sheet_index": 0, + "last_updated": " at (UTC)", + "license": "MIT", + "version": "" + }, + "Download MM3D_Randomizer.3dsx": [ + { + "file": "", + "message": "Downloading MM3D_Randomizer_.3dsx...", + "output": "%3DSX%/MM3D_Randomizer_.3dsx", + "type": "downloadFile" + } + ], + "Download MM3D_Randomizer.cia": [ + { + "file": "", + "message": "Downloading MM3D_Randomizer_.cia...", + "output": "sdmc:/MM3D_Randomizer_.cia", + "type": "downloadFile" + }, + { + "file": "/MM3D_Randomizer_.cia", + "message": "Installing MM3D_Randomizer_.cia...", + "type": "installCia" + }, + { + "file": "sdmc:/MM3D_Randomizer_.cia", + "message": "Deleting MM3D_Randomizer_.cia.", + "type": "deleteFile" + } + ] + }, + { + "info": { + "title": "MM3D Randomizer Nightly ", + "author": "MM3DR Team", + "description": "A randomizer patch for MM3D to be used with Luma for Nintendo 3DS", + "category": [ + "game patch" + ], + "console": [ + "3DS" + ], + "icon_index": 1, + "sheet_index": 0, + "last_updated": " at (UTC)", + "license": "MIT", + "version": "" + }, + "Download MM3D_Randomizer.3dsx": [ + { + "file": "", + "message": "Downloading MM3D_Randomizer_.3dsx...", + "output": "%3DSX%/MM3D_Randomizer_.3dsx", + "type": "downloadFile" + } + ], + "Download MM3D_Randomizer.cia": [ + { + "file": "", + "message": "Downloading MM3D_Randomizer_.cia...", + "output": "sdmc:/MM3D_Randomizer_.cia", + "type": "downloadFile" + }, + { + "file": "/MM3D_Randomizer_.cia", + "message": "Installing MM3D_Randomizer_.cia...", + "type": "installCia" + }, + { + "file": "sdmc:/MM3D_Randomizer_.cia", + "message": "Deleting MM3D_Randomizer_.cia.", + "type": "deleteFile" + } + ] + }, + { + "info": { + "title": "MM3D Randomizer Nightly ", + "author": "MM3DR Team", + "description": "A randomizer patch for MM3D to be used with Luma for Nintendo 3DS", + "category": [ + "game patch" + ], + "console": [ + "3DS" + ], + "icon_index": 1, + "sheet_index": 0, + "last_updated": " at (UTC)", + "license": "MIT", + "version": "" + }, + "Download MM3D_Randomizer.3dsx": [ + { + "file": "", + "message": "Downloading MM3D_Randomizer_.3dsx...", + "output": "%3DSX%/MM3D_Randomizer_.3dsx", + "type": "downloadFile" + } + ], + "Download MM3D_Randomizer.cia": [ + { + "file": "", + "message": "Downloading MM3D_Randomizer_.cia...", + "output": "sdmc:/MM3D_Randomizer_.cia", + "type": "downloadFile" + }, + { + "file": "/MM3D_Randomizer_.cia", + "message": "Installing MM3D_Randomizer_.cia...", + "type": "installCia" + }, + { + "file": "sdmc:/MM3D_Randomizer_.cia", + "message": "Deleting MM3D_Randomizer_.cia.", + "type": "deleteFile" + } + ] + }, + { + "info": { + "title": "MM3D Randomizer Nightly ", + "author": "MM3DR Team", + "description": "A randomizer patch for MM3D to be used with Luma for Nintendo 3DS", + "category": [ + "game patch" + ], + "console": [ + "3DS" + ], + "icon_index": 1, + "sheet_index": 0, + "last_updated": " at (UTC)", + "license": "MIT", + "version": "" + }, + "Download MM3D_Randomizer.3dsx": [ + { + "file": "", + "message": "Downloading MM3D_Randomizer_.3dsx...", + "output": "%3DSX%/MM3D_Randomizer_.3dsx", + "type": "downloadFile" + } + ], + "Download MM3D_Randomizer.cia": [ + { + "file": "", + "message": "Downloading MM3D_Randomizer_.cia...", + "output": "sdmc:/MM3D_Randomizer_.cia", + "type": "downloadFile" + }, + { + "file": "/MM3D_Randomizer_.cia", + "message": "Installing MM3D_Randomizer_.cia...", + "type": "installCia" + }, + { + "file": "sdmc:/MM3D_Randomizer_.cia", + "message": "Deleting MM3D_Randomizer_.cia.", + "type": "deleteFile" + } + ] + }, + { + "info": { + "title": "MM3D Randomizer Nightly ", + "author": "MM3DR Team", + "description": "A randomizer patch for MM3D to be used with Luma for Nintendo 3DS", + "category": [ + "game patch" + ], + "console": [ + "3DS" + ], + "icon_index": 1, + "sheet_index": 0, + "last_updated": " at (UTC)", + "license": "MIT", + "version": "" + }, + "Download MM3D_Randomizer.3dsx": [ + { + "file": "", + "message": "Downloading MM3D_Randomizer_.3dsx...", + "output": "%3DSX%/MM3D_Randomizer_.3dsx", + "type": "downloadFile" + } + ], + "Download MM3D_Randomizer.cia": [ + { + "file": "", + "message": "Downloading MM3D_Randomizer_.cia...", + "output": "sdmc:/MM3D_Randomizer_.cia", + "type": "downloadFile" + }, + { + "file": "/MM3D_Randomizer_.cia", + "message": "Installing MM3D_Randomizer_.cia...", + "type": "installCia" + }, + { + "file": "sdmc:/MM3D_Randomizer_.cia", + "message": "Deleting MM3D_Randomizer_.cia.", + "type": "deleteFile" + } + ] + } + ], + "storeInfo": { + "title": "MM3D Randomizer", + "author": "MM3DR Team", + "description": "MM3D Randomizer - An online database of the most recent versions of the random experience for MM3D", + "url": "https://phlexplexi.co/unistore", + "file": "MM3DR.unistore", + "sheetURL": "https://phlexplexi.co/icon.t3x", + "sheet": "icon.t3x", + "bg_index": 1, + "bg_sheet": 0, + "revision": , + "version": 3 + } + } + EOF + echo "Forgive me for this." + curl -sb -H "https://api.github.com/repos/Z3DR/MM3D_Randomizer/releases" | jq '.[0:8] | .[].assets | .[3] | (.browser_download_url + " " +.created_at)' | grep "Nightly" | head -n 5 >> ciaDownloads.txt + curl -sb -H "https://api.github.com/repos/Z3DR/MM3D_Randomizer/releases" | jq '.[0:8] | .[].assets | .[2] | (.browser_download_url + " " +.created_at)' | grep "Nightly" | head -n 5 >> 3dsxDownloads.txt + STABLEVERSION=`curl -sb -H "https://api.github.com/repos/Z3DR/MM3D_Randomizer/releases/latest" | jq '.name'` + STABLEMODIFIED=`curl -sb -H "https://api.github.com/repos/Z3DR/MM3D_Randomizer/releases/latest" | jq '.published_at'` + STABLEVERSION=`sed -e 's/^"//' -e 's/"$//' <<<"$STABLEVERSION"` + STABLEMODIFIED=`sed -e 's/^"//' -e 's/"$//' <<<"$STABLEMODIFIED"` + REVISION=`curl -Is -k "https://api.github.com/repos/Z3DR/MM3D_Randomizer/commits?per_page=1" | sed -n '/^[Ll]ink:/ s/.*"next".*page=\([0-9]*\).*"last".*/\1/p'` + MODIFIED=$(echo ${STABLEMODIFIED} | cut -c1-10) + MODIFIED_DATE=$(echo ${STABLEMODIFIED} | cut -c12-19) + sed -i "s##${STABLEVERSION}#g" MM3DR.unistore + sed -i "s##$MODIFIED#g" MM3DR.unistore + sed -i "s##$MODIFIED_DATE#g" MM3DR.unistore + sed -i "s##$REVISION#g" MM3DR.unistore + LINES=$(cat ciaDownloads.txt) + LINENUM=1 + IFS=$'\n' + for LINE in $LINES + do + LINE=`sed -e 's/^"//' -e 's/"$//' <<<"$LINE"` + ARRLINE=($(echo $LINE | tr " " "\n")) + sed -i "s##${ARRLINE[0]}#g" MM3DR.unistore + VERSION=$(echo ${ARRLINE[0]} | cut -c75-80) + MODIFIED=$(echo ${ARRLINE[1]} | cut -c1-10) + MODIFIED_DATE=$(echo ${ARRLINE[1]} | cut -c12-19) + sed -i "s##$VERSION#g" MM3DR.unistore + sed -i "s##$MODIFIED#g" MM3DR.unistore + sed -i "s##$MODIFIED_DATE#g" MM3DR.unistore + LINENUM=`expr $LINENUM + 1` + done + LINES=$(cat 3dsxDownloads.txt) + LINENUM=1 + for LINE in $LINES + do + LINE=`sed -e 's/^"//' -e 's/"$//' <<<"$LINE"` + ARRLINE=($(echo $LINE | tr " " "\n")) + sed -i "s##${ARRLINE[0]}#g" MM3DR.unistore + LINENUM=`expr $LINENUM + 1` + done + + - name: Deploy to Gist + uses: exuanbo/actions-deploy-gist@v1.1.4 + with: + token: ${{ secrets.TOKEN }} + gist_id: a0bb911772800a7071eddf6298ff6e9f + gist_file_name: MM3DR.unistore + file_path: ./MM3DR.unistore diff --git a/.gitmodules b/.gitmodules index 359d65c..a0bdeab 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +1,4 @@ [submodule "Z3DR"] path = Z3DR - url = https://github.com/Z3DR/Z3DR.git + url = https://github.com/Z3DR/mm3dr.git + branch = dev \ No newline at end of file diff --git a/Makefile b/Makefile index ac12e42..d54d025 100644 --- a/Makefile +++ b/Makefile @@ -38,7 +38,7 @@ TARGET := $(notdir $(CURDIR)) BUILD := build SOURCES := source DATA := data -INCLUDES := source/include Z3DR/patch_code/mm3d/include +INCLUDES := source/include Z3DR/code/include GRAPHICS := gfx GFXBUILD := $(BUILD) ROMFS := romfs @@ -175,10 +175,10 @@ all: $(BUILD) $(GFXBUILD) $(DEPSDIR) $(ROMFS_T3XFILES) $(T3XHFILES) $(BUILD): @git submodule update --init - $(MAKE) -C Z3DR/patch_code/mm3d/ - @mv Z3DR/patch_code/mm3d/basecode.ips $(ROMFS)/basecode.ips - @mv Z3DR/patch_code/mm3d/basecode1.1.ips $(ROMFS)/basecode1.1.ips - @mv Z3DR/patch_code/mm3d/patch_symbols.hpp $(CURDIR)/source/include/ + $(MAKE) -C Z3DR/code/ + @mv Z3DR/code/basecode.ips $(ROMFS)/basecode.ips + @mv Z3DR/code/basecode1.1.ips $(ROMFS)/basecode1.1.ips + @mv Z3DR/source/patch_symbols.hpp $(CURDIR)/source/include/ @mkdir -p $@ ifneq ($(GFXBUILD),$(BUILD)) @@ -195,8 +195,9 @@ endif clean: @echo Cleaning app and basecode ... @rm -fr $(BUILD) $(TARGET).3dsx $(TARGET).cia $(OUTPUT).smdh $(TARGET).elf $(GFXBUILD) $(ROMFS)/basecode.ips source/include/patch_symbols.hpp - $(MAKE) clean -f Z3DR/patch_code/mm3d/Makefile - @rm -rf Z3DR/patch_code/mm3d/build + $(MAKE) clean -f Z3DR/code/Makefile + @rm -rf Z3DR/code/build + @rm -rf Z3DR/code/basecode.ips Z3DR/code/basecode1.1.ips Z3DR/code/code.elf Z3DR/source/patch_symbols.hpp #--------------------------------------------------------------------------------- $(GFXBUILD)/%.t3x $(BUILD)/%.h : %.t3s #--------------------------------------------------------------------------------- diff --git a/README.md b/README.md index f01f015..ee69adf 100644 --- a/README.md +++ b/README.md @@ -30,7 +30,7 @@ As a service to the player in this very long game, various tedious elements of t Please be sure to explore the many customizable settings which are available when using the app! There are many options which can alter the length or difficulty of each playthrough. -Want to discuss the randomizer with others? Join our [Discord server](https://discord.gg/EVvzb6varj)! +Want to discuss the randomizer with others? Join our [Discord server](https://discord.gg/73ZNdjbfFp)! ## Installation @@ -58,7 +58,7 @@ Right now, save files are shared between any playthroughs you create and the bas ### Getting Stuck With a game the size of _Majora's Mask 3D_, it's quite easy for players to get stuck in certain situations with no apparent path to progressing. -Before reporting an issue, please make sure to check out the [Discord server](https://discord.gg/EVvzb6varj) to see if that issue has been reported already. +Before reporting an issue, please make sure to check out the [Discord server](https://discord.gg/73ZNdjbfFp) to see if that issue has been reported already. You may also find a map tracker helpful, as these allow you to see all checks which are available with your current items, and check which ones you've gotten already although keep in mind these were designed for the original Majora's Mask Randomizer so there may be some slight discrepancies. diff --git a/Z3DR b/Z3DR index c209686..8a402b8 160000 --- a/Z3DR +++ b/Z3DR @@ -1 +1 @@ -Subproject commit c209686c39896eaada00ee9c4d507867ebd7598b +Subproject commit 8a402b8912e41a8cff8149eb3f1d5f9be36b3136 diff --git a/linux_build_rando.sh b/linux_build_rando.sh index a3ac65b..7a3e3fc 100755 --- a/linux_build_rando.sh +++ b/linux_build_rando.sh @@ -5,8 +5,8 @@ compile() { APP_NAME=$(basename "$PWD") BANNERTOOLAPP=bannertool IS_GH_ACTIONS=true - if [ -n "$var" ]; then - echo "Building on Github Actions.." + if [ -n "$GITHUB_SHA" ]; then + echo "Building on Github Actions..." else echo "GITHUB_SHA is empty, building locally." IS_GH_ACTIONS=false @@ -36,15 +36,20 @@ compile() { export commitHashShort=$(echo ${GITHUB_SHA::6}) sed -i "s/develop/${commitHashShort:-develop}/" ./source/include/version.hpp - make -j debug_app=1 + make -j sed -i "s/${commitHashShort}/develop/" ./source/include/version.hpp $BANNERTOOLAPP makebanner -i ./banner.png -a ./audio.wav -o ./banner.bnr $BANNERTOOLAPP makesmdh -s "Majora's Mask 3D Randomizer" -l "A Randomized Majoras Mask Experience" -p "Z3DR Team" -i icon.png -o ./icon.icn 3dstool -cvtf romfs ./romfs.bin --romfs-dir ./romfs makerom -f cia -o ${APP_NAME}.cia -DAPP_ENCRYPTED=false -target t -exefslogo -elf ./${APP_NAME}.elf -icon ./icon.icn -banner ./banner.bnr -rsf ./mmrando.rsf -romfs ./romfs.bin -major 1 -minor 0 -micro 0 if $IS_GH_ACTIONS; then - qrencode -ocia.png https://github.com/$GITHUB_REPOSITORY/releases/download/Nightly-$commitHashShort/${APP_NAME}.cia - qrencode -o3dsx.png https://github.com/$GITHUB_REPOSITORY/releases/download/Nightly-$commitHashShort/${APP_NAME}.3dsx + if [[ ${url_tag+x} ]]; then + qrencode -ocia.png https://github.com/$GITHUB_REPOSITORY/releases/download/$url_tag/${APP_NAME}.cia + qrencode -o3dsx.png https://github.com/$GITHUB_REPOSITORY/releases/download/$url_tag/${APP_NAME}.3dsx + else + qrencode -ocia.png https://github.com/$GITHUB_REPOSITORY/releases/download/Nightly-$commitHashShort/${APP_NAME}.cia + qrencode -o3dsx.png https://github.com/$GITHUB_REPOSITORY/releases/download/Nightly-$commitHashShort/${APP_NAME}.3dsx + fi fi } diff --git a/romfs/zelda2_mag.gar.lzs b/romfs/zelda2_mag.gar.lzs index 889ee30..b711e03 100644 Binary files a/romfs/zelda2_mag.gar.lzs and b/romfs/zelda2_mag.gar.lzs differ diff --git a/source/custom_messages.cpp b/source/custom_messages.cpp index f6cdfe2..b18af23 100644 --- a/source/custom_messages.cpp +++ b/source/custom_messages.cpp @@ -133,7 +133,7 @@ void CreateBaselineCustomMessages() { // Great Bay CreateMessage(0x6141, 0xFFFF, 0x3FFFFFFF, 0xFF0000, - "You got the #boss key# for the #Great Bay Temple#! ow you can enter the chamber where the boss lurks!", + "You got the #boss key# for the #Great Bay Temple#! Now you can enter the chamber where the boss lurks!", {QM_GREEN, QM_RED}, {}, {}, 0x0, false, false); // Stone Tower @@ -143,8 +143,13 @@ void CreateBaselineCustomMessages() { // Kokiri Sword CreateMessage(0x0037, 0xFFFF, 0x3FFFFFFF, 0xFF0000, - "You got the #kokiri sword!# The trusty sword you're familiar with. A treasure from Kokiri Forest.", + "You got the #Kokiri Sword!# The trusty sword you're familiar with. A treasure from Kokiri Forest.", {QM_GREEN, QM_RED}, {}, {}, 0x0, false, false); + + // Ice Trap + CreateMessage(0x0012, 0xFFFF, 0x3FFFFFFF, 0xFF0000, + " #FOOL!#", + {QM_RED}, {}, {}, 0x0, false, false); } u32 NumMessages() { diff --git a/source/dungeon.cpp b/source/dungeon.cpp index 001e593..802a188 100644 --- a/source/dungeon.cpp +++ b/source/dungeon.cpp @@ -147,9 +147,9 @@ std::vector DungeonInfo::GetEveryLocation() const { WOODFALL_TEMPLE_MAP_CHEST, WOODFALL_TEMPLE_COMPASS_CHEST, WOODFALL_TEMPLE_SMALL_KEY_CHEST, - ODOLWA_HEART_CONTAINER, WOODFALL_TEMPLE_HEROS_BOW_CHEST, WOODFALL_TEMPLE_BOSS_KEY_CHEST, + ODOLWA_HEART_CONTAINER, ODOLWA, WOODFALL_TEMPLE_DEKU_PRINCESS, },{ @@ -209,8 +209,8 @@ std::vector DungeonInfo::GetEveryLocation() const { GBT_SMALL_KEY_CHEST, GBT_ICE_ARROW_CHEST, GBT_BOSS_KEY_CHEST, - GYORG, GYORG_HEART_CONTAINER, + GYORG, },{ //STRAY FAIRY LOCATIONS GBT_SF_SKULLTULA, @@ -241,8 +241,8 @@ std::vector DungeonInfo::GetEveryLocation() const { STONE_TOWER_TEMPLE_UPDRAFT_ROOM_CHEST, STONE_TOWER_TEMPLE_GIANTS_MASK_CHEST, STONE_TOWER_TEMPLE_LIGHT_ARROW_CHEST, - TWINMOLD, TWINMOLD_HEART_CONTAINER, + TWINMOLD, },{ //STRAY FAIRY LOCATIONS ST_SF_MIRROR_SUN_BLOCK, @@ -352,6 +352,10 @@ std::vector DungeonInfo::GetEveryLocation() const { PF_INT_UPPER_CHEST, PF_INT_TANK_CHEST, PF_INT_INVISIBLE_SOLDIER, + PF_INT_HOOKSHOT_ROOM_ZORA_EGG, + PF_INT_GUARD_ROOM_ZORA_EGG, + PF_INT_BARREL_MAZE_ZORA_EGG, + PF_INT_LAVA_ROOM_ZORA_EGG, },{} ); DungeonInfo BeneathTheWell = DungeonInfo("Beneath The Well", NONE, NONE, NONE, NONE, 0, { diff --git a/source/fill.cpp b/source/fill.cpp index 288fe7a..a8c23b8 100644 --- a/source/fill.cpp +++ b/source/fill.cpp @@ -50,22 +50,23 @@ static void RemoveStartingItemsFromPool() { //This function propigates time of day access through entrances +/* static bool UpdateToDAccess(Entrance* entrance) { bool ageTimePropigated = false; - //Area* parent = entrance->GetParentRegion(); + Area* parent = entrance->GetParentRegion(); //PlacementLog_Msg("\nparent = "); //PlacementLog_Msg(parent->regionName+"\n"); Area* connection = entrance->GetConnectedRegion(); //PlacementLog_Msg("\nconnection = "); //PlacementLog_Msg(connection->regionName+"\n"); - if (!connection){ + if (!connection && parent->HereCheck() && entrance->ConditionsMet()){ ageTimePropigated = true; } return ageTimePropigated; -} +}*/ std::vector GetAllEmptyLocations() { return FilterFromPool(allLocations, [](const LocationKey loc) { return Location(loc)->GetPlacedItemKey() == NONE;}); @@ -76,7 +77,11 @@ std::vector GetAllEmptyLocations() { //specifies the pool of locations that we're trying to search for an accessible location in std::vector GetAccessibleLocations(const std::vector& allowedLocations, SearchMode mode) { std::vector accessibleLocations; - + //PlacementLog_Msg("Allowed Locations passed to AcceessibleLocations Function:\n"); + //for (LocationKey loc : allowedLocations) + //{ + // PlacementLog_Msg(Location(loc)->GetName() + "\n"); + //} //Reset all access to begin a new search ApplyStartingInventory(); @@ -92,13 +97,13 @@ std::vector GetAccessibleLocations(const std::vector& //Variables for search std::vector newItemLocations; bool updatedEvents = false; - bool ageTimePropigated = false; + //bool ageTimePropigated = false; bool firstIteration = true; //If no new items are found and no events are updated, then the next iteration won't provide any new location - while (newItemLocations.size() > 0 || ageTimePropigated || firstIteration || updatedEvents) { // - events not included in mm3dr yet + while (newItemLocations.size() > 0 || firstIteration || updatedEvents) { // || ageTimePropigated firstIteration = false; - ageTimePropigated = false; + //ageTimePropigated = false; updatedEvents = false; for (ItemLocation* location : newItemLocations) { @@ -121,13 +126,13 @@ std::vector GetAccessibleLocations(const std::vector& for (auto& exit : area->exits) { //Update Time of Day Access for the exit - if (UpdateToDAccess(&exit)){ - ageTimePropigated=true; - } + //if (UpdateToDAccess(&exit)){ + // ageTimePropigated=true; + // } //if the exit is accessable and hasn't been added yet, add it to pool Area* exitArea = exit.GetConnectedRegion(); - if (!exitArea->addedToPool && exit.ConditionsMet()) { + if (!exitArea->addedToPool && exit.GetConditionsMet()) { exitArea->addedToPool = true; areaPool.push_back(exit.GetAreaKey()); //PlacementLog_Msg("Added :" + exitArea->regionName + " to the pool \n"); @@ -151,7 +156,7 @@ std::vector GetAccessibleLocations(const std::vector& LocationKey loc = locPair.GetLocation(); ItemLocation* location = Location(loc); - if ((!location->IsAddedToPool()) && (locPair.ConditionsMet())) { + if ((!location->IsAddedToPool()) && (locPair.GetConditionsMet())) { location->AddToPool(); @@ -190,7 +195,7 @@ std::vector GetAccessibleLocations(const std::vector& } } //MAJORA'S_MASK has been found, seed is beatable, nothing else in this or future spheres matters - else if (location->GetPlacedItemKey() == MAJORAS_MASK) { + if (location->GetPlacedItemKey() == MAJORAS_MASK) { CitraPrint("Majoras Mask has been found!"); itemSphere.clear(); itemSphere.push_back(loc); @@ -233,7 +238,7 @@ std::vector GetAccessibleLocations(const std::vector& } return {}; } - + erase_if(accessibleLocations, [&allowedLocations](LocationKey loc) { for (LocationKey allowedLocation : allowedLocations) { if (loc == allowedLocation || Location(loc)->GetPlacedItemKey() != NONE) { @@ -242,6 +247,7 @@ std::vector GetAccessibleLocations(const std::vector& } return true; }); + return accessibleLocations; } @@ -339,9 +345,18 @@ static void FastFill(std::vector items, std::vector locati //Loop until locations are empty, or also end if items are empty and the parameters specify to end then while (!locations.empty() && (!endOnItemsEmpty || !items.empty())) { LocationKey loc = RandomElement(locations, true); + ItemKey item = RandomElement(items, true); + /*if ( (Location(loc)->IsRepeatable() == false) && (ItemTable(item).IsReusable() == true) ){ + //unsuccessfulPlacement = true; + CitraPrint("Attemting to place repeatable item in nonrepeatable spot in FastFill"); + PlacementLog_Msg("\n Attempted to place " + ItemTable(item).GetName().GetEnglish() + " at " + Location(loc)->GetName()); + items.push_back(item); + locations.push_back(loc); + } + else {*/ Location(loc)->SetAsHintable(); - PlaceItemInLocation(loc, RandomElement(items, true)); - + PlaceItemInLocation(loc, item); + if (items.empty() && !endOnItemsEmpty) { items.push_back(GetJunkItem()); } @@ -392,11 +407,16 @@ static void AssumedFill(const std::vector& items, const std::vector itemsToPlace = items; //copy all not yet placed advancement items so that we can apply their effects for the fill algorithm - std::vector itemsToNotPlace = FilterFromPool(ItemPool, [](const ItemKey i) { + //std::vector itemsToNotPlace = FilterFromPool(ItemPool, [](const ItemKey i) { //CitraPrint("Added item to itemsToNotPlace: "); //CitraPrint(ItemTable(i).GetName().GetEnglish()); - return ItemTable(i).IsAdvancement();}); - + // return ItemTable(i).IsAdvancement();}); + std::vector itemsToNotPlace = ItemPool; + //PlacementLog_Msg("ItemsNotToPlace:\n"); + //for (ItemKey items : itemsToNotPlace) + //{ + // PlacementLog_Msg(" " + ItemTable(items).GetName().GetEnglish() + "," ); + //} //shuffle the order of items to place Shuffle(itemsToPlace); @@ -407,33 +427,37 @@ static void AssumedFill(const std::vector& items, const std::vectorGetName()); - PlacementLog_Msg("\n"); - CitraPrint(Location(loc)->GetName()); - }*/ + //PlacementLog_Msg("\nAllowed Locations are: \n"); + //CitraPrint("Allowed Locations are:"); + //for (LocationKey loc : allowedLocations) + // { + // PlacementLog_Msg(Location(loc)->GetName()); + // PlacementLog_Msg("\n"); + // CitraPrint(Location(loc)->GetName()); + // } //get all accessible locations that are allowed //CitraPrint("Accessible Locations: "); const std::vector accessibleLocations = GetAccessibleLocations(allowedLocations); //print accessable locations to see what's accessable - /*CitraPrint("Accessable Locations are:"); - PlacementLog_Msg("\nAccessable Locations are: \n"); - for (LocationKey loc : accessibleLocations) - { - PlacementLog_Msg(Location(loc)->GetName()); - PlacementLog_Msg("\n"); - CitraPrint(Location(loc)->GetName()); - }*/ + //CitraPrint("Accessable Locations are:"); + //PlacementLog_Msg("\nAccessable Locations are: \n"); + //for (LocationKey loc : accessibleLocations) + // { + // PlacementLog_Msg(Location(loc)->GetName()); + // PlacementLog_Msg("\n"); + // //CitraPrint(Location(loc)->GetName()); + // } //retry if there are no more locations to place items if (accessibleLocations.empty()) { @@ -463,12 +487,13 @@ static void AssumedFill(const std::vector& items, const std::vectorIsRepeatable()) && ItemTable(item).IsReusable() ){ //unsuccessfulPlacement = true; - CitraPrint("Attemting to place things where they shouldnt be"); + CitraPrint("Attemting to place repeatable item in non repeatable spot in AssumedFill"); PlacementLog_Msg("\n Attempted to place " + ItemTable(item).GetName().GetEnglish() + " at " + Location(selectedLocation)->GetName()); itemsToPlace.push_back(item); } else { PlaceItemInLocation(selectedLocation, item); + //PlacementLog_Msg("Placed " + ItemTable(item).GetName().GetEnglish() + " at " + Location(selectedLocation)->GetName()); //CitraPrint("Placed " + ItemTable(item).GetName().GetEnglish() + " at " + Location(selectedLocation)->GetName()); attemptedLocations.push_back(selectedLocation); @@ -707,11 +732,14 @@ static void RandomizeLinksPocket() { int VanillaFill() { //Perform minimum needed initialization - AreaTable_Init(); + CitraPrint("Starting VanillaFill\n"); + AreaTable_Init(); //Reset the world graph to intialize the proper locations + ItemReset(); //Reset shops incase of shopsanity random GenerateLocationPool(); GenerateItemPool(); GenerateStartingInventory(); - //Place vanilla item in each location + RemoveStartingItemsFromPool(); + FillExcludedLocations(); RandomizeDungeonRewards(); for (LocationKey loc : allLocations) { Location(loc)->PlaceVanillaItem(); @@ -723,42 +751,58 @@ int VanillaFill() { // printf("\x1b[7;32HDone"); //} //Finish up + GeneratePlaythrough(); + printf("Done"); + printf("\x1b[9;10HCalculating Playthrough..."); + PareDownPlaythrough(); + printf("Done"); + printf("\x1b[10;10HCalculating Way of the Hero..."); + CalculateWotH(); + printf("Done"); + CitraPrint("Creating Item Overrides"); CreateItemOverrides(); - //CreateEntranceOverrides(); - //CreateAlwaysIncludedMessages(); + // CreateEntranceOverrides(); + // CreateAlwaysIncludedMessages(); + if (GossipStoneHints.IsNot(rnd::GossipStoneHintsSetting::HINTS_NO_HINTS)) { + printf("\x1b[11;10HCreating Hints..."); + CreateAllHints(); + printf("Done"); + } + return 1; } int NoLogicFill() { + CitraPrint("StartingNoLogicFill\n"); AreaTable_Init(); //Reset the world graph to intialize the proper locations ItemReset(); //Reset shops incase of shopsanity random GenerateLocationPool(); GenerateItemPool(); GenerateStartingInventory(); + RemoveStartingItemsFromPool(); + FillExcludedLocations(); RandomizeDungeonRewards(); std::vector remainingPool = FilterAndEraseFromPool(ItemPool, [](const ItemKey i) {return true;}); FastFill(remainingPool, GetAllEmptyLocations(), false); GeneratePlaythrough(); - //Successful placement, produced beatable result - //if (playthroughBeatable && !placementFailure) { - // printf("Done"); - // printf("\x1b[9;10HCalculating Playthrough..."); - // PareDownPlaythrough(); - // CalculateWotH(); - // printf("Done"); - CreateItemOverrides(); - // CreateEntranceOverrides(); - // CreateAlwaysIncludedMessages(); - /*if (GossipStoneHints.IsNot(HINTS_NO_HINTS)) { - printf("\x1b[10;10HCreating Hints..."); - CreateAllHints(); - printf("Done"); - } - if (ShuffleMerchants.Is(SHUFFLEMERCHANTS_HINTS)) { - CreateMerchantsHints(); - }*/ - //} - return 1; + printf("Done"); + printf("\x1b[9;10HCalculating Playthrough..."); + PareDownPlaythrough(); + printf("Done"); + printf("\x1b[10;10HCalculating Way of the Hero..."); + CalculateWotH(); + printf("Done"); + CitraPrint("Creating Item Overrides"); + CreateItemOverrides(); + // CreateEntranceOverrides(); + // CreateAlwaysIncludedMessages(); + if (GossipStoneHints.IsNot(rnd::GossipStoneHintsSetting::HINTS_NO_HINTS)) { + printf("\x1b[11;10HCreating Hints..."); + CreateAllHints(); + printf("Done"); + } + + return 1; } @@ -779,6 +823,9 @@ int Fill() { FillExcludedLocations(); showItemProgress = true; + + //Place dungeon rewards - always vanilla for now + RandomizeDungeonRewards(); //Place dungeon items restricted to their Own Dungeon @@ -786,9 +833,17 @@ int Fill() { RandomizeOwnDungeon(dungeon); } + if (ShuffleGFRewards.Is((u8)GreatFairyRewardShuffleSetting::GFREWARDSHUFFLE_ALL_GREAT_FARIES)){ + //get GF locations + std::vector gfLocations = FilterFromPool(allLocations, [](const LocationKey loc) {return Location(loc)->IsCategory(Category::cFairyFountain);}); + std::vector gfItems = FilterAndEraseFromPool(ItemPool, [gfLocations](const ItemKey i) { return ItemTable(i).GetItemType() == ITEMTYPE_GFAIRY;}); + + AssumedFill(gfItems, gfLocations, true); + } + //Place Main Inventory First //So first get all items in the pool + DekuMask, - std::vector mainadvancementItems = FilterAndEraseFromPool(ItemPool, [](const ItemKey i) {return ItemTable(i).IsAdvancement();});//&& ItemTable(i).GetItemType() == ITEMTYPE_ITEM + std::vector mainadvancementItems = FilterAndEraseFromPool(ItemPool, [](const ItemKey i) {return ItemTable(i).IsAdvancement() && ItemTable(i).GetItemType() != ITEMTYPE_QUEST;});//(ItemTable(i).GetItemType() == ITEMTYPE_ITEM || ItemTable(i).GetItemType() == ITEMTYPE_MASK || ItemTable(i).GetItemType() == ITEMTYPE_TRADE || ItemTable(i).GetItemType() == ITEMTYPE_GFAIRY) //Then Place those to expand the amount of checks available AssumedFill(mainadvancementItems, allLocations,true); @@ -800,14 +855,10 @@ int Fill() { } //Then Place Deku Merchant Items - if(ShuffleMerchants) { + /* if(ShuffleMerchants) { std::vector dekuTrades = FilterAndEraseFromPool(ItemPool, [](const ItemKey i) {return ItemTable(i).GetItemType() == ITEMTYPE_TRADE;}); AssumedFill(dekuTrades, allLocations); - } - - //Place dungeon rewards - always vanilla for now - RandomizeDungeonRewards(); - + } */ //Then Place songs if song shuffle is set to specific locations /* @@ -827,13 +878,7 @@ int Fill() { AssumedFill(songs, songLocations, true); }*/ - /*if (ShuffleGFRewards.Is(GreatFairyRewardShuffleSetting::GFREWARDSHUFFLE_ALL_GREAT_FARIES)){ - //get GF locations - std::vector gfLocations = FilterFromPool(allLocations, [](const LocationKey loc) {return Location(loc)->IsCategory(Category::cFairyFountain);}); - std::vector gfItems = FilterAndEraseFromPool(ItemPool, [gfLocations](const ItemKey i) { return i == Location(gfLocations)->GetVanillaItem();}); - - - }*/ + //Then place dungeon items that are assigned to restrictive location pools RandomizeDungeonItems(); @@ -862,7 +907,7 @@ int Fill() { GeneratePlaythrough(); //TODO::FIX PLAYTHROUGH //Successful placement, produced beatable result - if (!placementFailure ) {//&& playthroughBeatable + if (!placementFailure && playthroughBeatable ) { printf("Done"); printf("\x1b[9;10HCalculating Playthrough..."); PareDownPlaythrough(); @@ -874,19 +919,20 @@ int Fill() { CreateItemOverrides(); // CreateEntranceOverrides(); // CreateAlwaysIncludedMessages(); - /*if (GossipStoneHints.IsNot(HINTS_NO_HINTS)) { - printf("\x1b[10;10HCreating Hints..."); + if (GossipStoneHints.IsNot(rnd::GossipStoneHintsSetting::HINTS_NO_HINTS)) { + printf("\x1b[11;10HCreating Hints..."); CreateAllHints(); printf("Done"); - } - if (ShuffleMerchants.Is(SHUFFLEMERCHANTS_HINTS)) { + } + /*if (ShuffleMerchants.Is(SHUFFLEMERCHANTS_HINTS)) { CreateMerchantsHints(); }*/ return 1; } //Unsuccessful placement if (retries < 4) { - GetAccessibleLocations(allLocations, SearchMode::AllLocationsReachable); + //LogicReset(); + //GetAccessibleLocations(allLocations, SearchMode::AllLocationsReachable); printf("\x1b[9;10HFailed. Retrying... %d", retries + 2); CitraPrint("Failed. Retrying..."); Areas::ResetAllLocations(); diff --git a/source/hint_list.cpp b/source/hint_list.cpp index 3671039..79bdd12 100644 --- a/source/hint_list.cpp +++ b/source/hint_list.cpp @@ -22,7 +22,10 @@ void HintTable_Init() { //hintTable[ITEM] = HintText::Item({ Text{"English","French","Spanish"} }); - //Item Hint Text + /*------------------------- + | ITEM HINTS | + --------------------------*/ + hintTable[KOKIRI_SWORD] = HintText::Item({ Text{"a forest blade", "a forest blade", "a forest blade"} }); hintTable[RAZOR_SWORD] = HintText::Item({ Text{"a sharp blade", "a sharp blade", "a sharp blade"} }); hintTable[GILDED_SWORD] = HintText::Item({ Text{"a very sharp blade", "a very sharp blade", "a very sharp blade"} }); @@ -42,12 +45,13 @@ void HintTable_Init() { hintTable[MOONS_TEAR] = HintText::Item({ Text{"a lunar teardrop", "a lunar teardrop", "a lunar teardrop"} }); hintTable[SPIN_ATTACK] = HintText::Item({ Text{"a magic attack", "a magic attack", "a magic attack"} }); hintTable[LENS_OF_TRUTH] = HintText::Item({ Text{"a lie detector","a lie detector", "a lie detector"} }); - hintTable[FIRE_ARROWS] = HintText::Item({ Text{"the power of fire", "the power of fire", "the power of fire"} }); + hintTable[HEROS_BOW] = HintText::Item({Text{"a bow", "a bow", "a bow"}}); + hintTable[FIRE_ARROWS] = HintText::Item({ Text{"the power of fire", "the power of fire", "the power of fire"} }); hintTable[ICE_ARROWS] = HintText::Item({ Text{"the power of ice", "the power of ice", "the power of ice"} }); hintTable[LIGHT_ARROWS] = HintText::Item({ Text{"the power of light", "the power of light", "the power of light"} }); hintTable[HOOKSHOT] = HintText::Item({ Text{"a chain and grapple", "a chain and grapple", "a chain and grapple"} }); hintTable[MAGIC_BEAN] = HintText::Item({ Text{"a plant seed", "a plant seed", "a plant seed"} }); - // MAGIC_BEAN_PACK, + hintTable[MAGIC_BEAN_PACK] = HintText::Item({ Text{"multiple plant seeds", "multiple plant seeds", "multiple plant seeds"} }); hintTable[DOUBLE_DEFENSE] = HintText::Item({ Text{"magical defence", "magical defence", "magical defence"} }); // OCARINA_OF_TIME, hintTable[PICTOGRAPH_BOX] = HintText::Item({ Text{"a capture device", "a capture device", "a capture device"} }); @@ -74,157 +78,31 @@ void HintTable_Init() { hintTable[GAROS_MASK] = HintText::Item({ Text{"the mask of spies", "the mask of spies", "the mask of spies"}}); hintTable[CAPTAINS_HAT] = HintText::Item({ Text{"a commanding presence", "a commanding presence", "a commanding presence"}}); hintTable[GIANTS_MASK] = HintText::Item({ Text{"a growth spurt", "a growth spurt", "a growth spurt"}}); - hintTable[FIERCE_DIETY_MASK] = HintText::Item({ Text{"the wrath of a god", "the wrath of a god", "the wrath of a god"}}); + hintTable[FIERCE_DEITY_MASK] = HintText::Item({ Text{"the wrath of a god", "the wrath of a god", "the wrath of a god"}}); hintTable[MASK_OF_TRUTH] = HintText::Item({ Text{"a piercing gaze", "a piercing gaze", "a piercing gaze"}}); - //SKULLTULA TOKENS + hintTable[FISHING_PASS] = HintText::Item({Text{"a fishing pass", "a fishing passs", "a fishing pass"}}); + hintTable[ICE_TRAP] = HintText::Item({Text{"a frosty surprise", "a frosty surprise", "a frosty surprise"}}); + hintTable[ZORA_EGG] = HintText::Item({Text{"a zora egg", "a zora egg", "a zora egg"}}); + //SKULLTULA TOKENS hintTable[SWAMP_SKULLTULA_TOKEN] = HintText::Item({ Text{"a golden token", "a golden token", "a golden token"} }); - /* - hintTable[SWAMP_SKULLTULA_TOKEN1] = HintText::Item({ Text{"a golden token", "a golden token", "a golden token"} }); - hintTable[SWAMP_SKULLTULA_TOKEN2] = HintText::Item({ Text{"a golden token", "a golden token", "a golden token"} }); - hintTable[SWAMP_SKULLTULA_TOKEN3] = HintText::Item({ Text{"a golden token", "a golden token", "a golden token"} }); - hintTable[SWAMP_SKULLTULA_TOKEN4] = HintText::Item({ Text{"a golden token", "a golden token", "a golden token"} }); - hintTable[SWAMP_SKULLTULA_TOKEN5] = HintText::Item({ Text{"a golden token", "a golden token", "a golden token"} }); - hintTable[SWAMP_SKULLTULA_TOKEN6] = HintText::Item({ Text{"a golden token", "a golden token", "a golden token"} }); - hintTable[SWAMP_SKULLTULA_TOKEN7] = HintText::Item({ Text{"a golden token", "a golden token", "a golden token"} }); - hintTable[SWAMP_SKULLTULA_TOKEN8] = HintText::Item({ Text{"a golden token", "a golden token", "a golden token"} }); - hintTable[SWAMP_SKULLTULA_TOKEN9] = HintText::Item({ Text{"a golden token", "a golden token", "a golden token"} }); - hintTable[SWAMP_SKULLTULA_TOKEN10] = HintText::Item({ Text{"a golden token", "a golden token", "a golden token"} }); - hintTable[SWAMP_SKULLTULA_TOKEN12] = HintText::Item({ Text{"a golden token", "a golden token", "a golden token"} }); - hintTable[SWAMP_SKULLTULA_TOKEN13] = HintText::Item({ Text{"a golden token", "a golden token", "a golden token"} }); - hintTable[SWAMP_SKULLTULA_TOKEN14] = HintText::Item({ Text{"a golden token", "a golden token", "a golden token"} }); - hintTable[SWAMP_SKULLTULA_TOKEN15] = HintText::Item({ Text{"a golden token", "a golden token", "a golden token"} }); - hintTable[SWAMP_SKULLTULA_TOKEN16] = HintText::Item({ Text{"a golden token", "a golden token", "a golden token"} }); - hintTable[SWAMP_SKULLTULA_TOKEN17] = HintText::Item({ Text{"a golden token", "a golden token", "a golden token"} }); - hintTable[SWAMP_SKULLTULA_TOKEN18] = HintText::Item({ Text{"a golden token", "a golden token", "a golden token"} }); - hintTable[SWAMP_SKULLTULA_TOKEN19] = HintText::Item({ Text{"a golden token", "a golden token", "a golden token"} }); - hintTable[SWAMP_SKULLTULA_TOKEN20] = HintText::Item({ Text{"a golden token", "a golden token", "a golden token"} }); - hintTable[SWAMP_SKULLTULA_TOKEN21] = HintText::Item({ Text{"a golden token", "a golden token", "a golden token"} }); - hintTable[SWAMP_SKULLTULA_TOKEN22] = HintText::Item({ Text{"a golden token", "a golden token", "a golden token"} }); - hintTable[SWAMP_SKULLTULA_TOKEN23] = HintText::Item({ Text{"a golden token", "a golden token", "a golden token"} }); - hintTable[SWAMP_SKULLTULA_TOKEN24] = HintText::Item({ Text{"a golden token", "a golden token", "a golden token"} }); - hintTable[SWAMP_SKULLTULA_TOKEN25] = HintText::Item({ Text{"a golden token", "a golden token", "a golden token"} }); - hintTable[SWAMP_SKULLTULA_TOKEN26] = HintText::Item({ Text{"a golden token", "a golden token", "a golden token"} }); - hintTable[SWAMP_SKULLTULA_TOKEN27] = HintText::Item({ Text{"a golden token", "a golden token", "a golden token"} }); - hintTable[SWAMP_SKULLTULA_TOKEN28] = HintText::Item({ Text{"a golden token", "a golden token", "a golden token"} }); - hintTable[SWAMP_SKULLTULA_TOKEN29] = HintText::Item({ Text{"a golden token", "a golden token", "a golden token"} }); - hintTable[SWAMP_SKULLTULA_TOKEN30] = HintText::Item({ Text{"a golden token", "a golden token", "a golden token"} }); - */ hintTable[OCEANSIDE_SKULLTULA_TOKEN] = HintText::Item({ Text{"a golden token", "a golden token", "a golden token"} }); - /* - hintTable[OCEANSIDE_SKULLTULA_TOKEN1] = HintText::Item({ Text{"a golden token", "a golden token", "a golden token"} }); - hintTable[OCEANSIDE_SKULLTULA_TOKEN2] = HintText::Item({ Text{"a golden token", "a golden token", "a golden token"} }); - hintTable[OCEANSIDE_SKULLTULA_TOKEN3] = HintText::Item({ Text{"a golden token", "a golden token", "a golden token"} }); - hintTable[OCEANSIDE_SKULLTULA_TOKEN4] = HintText::Item({ Text{"a golden token", "a golden token", "a golden token"} }); - hintTable[OCEANSIDE_SKULLTULA_TOKEN5] = HintText::Item({ Text{"a golden token", "a golden token", "a golden token"} }); - hintTable[OCEANSIDE_SKULLTULA_TOKEN6] = HintText::Item({ Text{"a golden token", "a golden token", "a golden token"} }); - hintTable[OCEANSIDE_SKULLTULA_TOKEN7] = HintText::Item({ Text{"a golden token", "a golden token", "a golden token"} }); - hintTable[OCEANSIDE_SKULLTULA_TOKEN8] = HintText::Item({ Text{"a golden token", "a golden token", "a golden token"} }); - hintTable[OCEANSIDE_SKULLTULA_TOKEN9] = HintText::Item({ Text{"a golden token", "a golden token", "a golden token"} }); - hintTable[OCEANSIDE_SKULLTULA_TOKEN10] = HintText::Item({ Text{"a golden token", "a golden token", "a golden token"} }); - hintTable[OCEANSIDE_SKULLTULA_TOKEN11] = HintText::Item({ Text{"a golden token", "a golden token", "a golden token"} }); - hintTable[OCEANSIDE_SKULLTULA_TOKEN12] = HintText::Item({ Text{"a golden token", "a golden token", "a golden token"} }); - hintTable[OCEANSIDE_SKULLTULA_TOKEN13] = HintText::Item({ Text{"a golden token", "a golden token", "a golden token"} }); - hintTable[OCEANSIDE_SKULLTULA_TOKEN14] = HintText::Item({ Text{"a golden token", "a golden token", "a golden token"} }); - hintTable[OCEANSIDE_SKULLTULA_TOKEN15] = HintText::Item({ Text{"a golden token", "a golden token", "a golden token"} }); - hintTable[OCEANSIDE_SKULLTULA_TOKEN16] = HintText::Item({ Text{"a golden token", "a golden token", "a golden token"} }); - hintTable[OCEANSIDE_SKULLTULA_TOKEN17] = HintText::Item({ Text{"a golden token", "a golden token", "a golden token"} }); - hintTable[OCEANSIDE_SKULLTULA_TOKEN18] = HintText::Item({ Text{"a golden token", "a golden token", "a golden token"} }); - hintTable[OCEANSIDE_SKULLTULA_TOKEN19] = HintText::Item({ Text{"a golden token", "a golden token", "a golden token"} }); - hintTable[OCEANSIDE_SKULLTULA_TOKEN20] = HintText::Item({ Text{"a golden token", "a golden token", "a golden token"} }); - hintTable[OCEANSIDE_SKULLTULA_TOKEN21] = HintText::Item({ Text{"a golden token", "a golden token", "a golden token"} }); - hintTable[OCEANSIDE_SKULLTULA_TOKEN22] = HintText::Item({ Text{"a golden token", "a golden token", "a golden token"} }); - hintTable[OCEANSIDE_SKULLTULA_TOKEN23] = HintText::Item({ Text{"a golden token", "a golden token", "a golden token"} }); - hintTable[OCEANSIDE_SKULLTULA_TOKEN24] = HintText::Item({ Text{"a golden token", "a golden token", "a golden token"} }); - hintTable[OCEANSIDE_SKULLTULA_TOKEN25] = HintText::Item({ Text{"a golden token", "a golden token", "a golden token"} }); - hintTable[OCEANSIDE_SKULLTULA_TOKEN26] = HintText::Item({ Text{"a golden token", "a golden token", "a golden token"} }); - hintTable[OCEANSIDE_SKULLTULA_TOKEN27] = HintText::Item({ Text{"a golden token", "a golden token", "a golden token"} }); - hintTable[OCEANSIDE_SKULLTULA_TOKEN28] = HintText::Item({ Text{"a golden token", "a golden token", "a golden token"} }); - hintTable[OCEANSIDE_SKULLTULA_TOKEN29] = HintText::Item({ Text{"a golden token", "a golden token", "a golden token"} }); - hintTable[OCEANSIDE_SKULLTULA_TOKEN30] = HintText::Item({ Text{"a golden token", "a golden token", "a golden token"} }); - */ + //Stray Fairies hintTable[CT_STRAY_FAIRY] = HintText::Item({ Text{"a lost fairy", "a lost fairy", "a lost fairy"} }); hintTable[WF_STRAY_FAIRY] = HintText::Item({ Text{"a lost fairy", "a lost fairy", "a lost faiy"} }); - /* - hintTable[WF_STRAY_FAIRY1] = HintText::Item({ Text{"a lost fairy", "a lost fairy", "a lost faiy"} }); - hintTable[WF_STRAY_FAIRY2] = HintText::Item({ Text{"a lost fairy", "a lost fairy", "a lost faiy"} }); - hintTable[WF_STRAY_FAIRY3] = HintText::Item({ Text{"a lost fairy", "a lost fairy", "a lost faiy"} }); - hintTable[WF_STRAY_FAIRY4] = HintText::Item({ Text{"a lost fairy", "a lost fairy", "a lost faiy"} }); - hintTable[WF_STRAY_FAIRY5] = HintText::Item({ Text{"a lost fairy", "a lost fairy", "a lost faiy"} }); - hintTable[WF_STRAY_FAIRY6] = HintText::Item({ Text{"a lost fairy", "a lost fairy", "a lost faiy"} }); - hintTable[WF_STRAY_FAIRY7] = HintText::Item({ Text{"a lost fairy", "a lost fairy", "a lost faiy"} }); - hintTable[WF_STRAY_FAIRY8] = HintText::Item({ Text{"a lost fairy", "a lost fairy", "a lost faiy"} }); - hintTable[WF_STRAY_FAIRY9] = HintText::Item({ Text{"a lost fairy", "a lost fairy", "a lost faiy"} }); - hintTable[WF_STRAY_FAIRY10] = HintText::Item({ Text{"a lost fairy", "a lost fairy", "a lost faiy"} }); - hintTable[WF_STRAY_FAIRY11] = HintText::Item({ Text{"a lost fairy", "a lost fairy", "a lost faiy"} }); - hintTable[WF_STRAY_FAIRY12] = HintText::Item({ Text{"a lost fairy", "a lost fairy", "a lost faiy"} }); - hintTable[WF_STRAY_FAIRY13] = HintText::Item({ Text{"a lost fairy", "a lost fairy", "a lost faiy"} }); - hintTable[WF_STRAY_FAIRY14] = HintText::Item({ Text{"a lost fairy", "a lost fairy", "a lost faiy"} }); - hintTable[WF_STRAY_FAIRY15] = HintText::Item({ Text{"a lost fairy", "a lost fairy", "a lost faiy"} }); - */ hintTable[SH_STRAY_FAIRY] = HintText::Item({ Text{"a lost fairy", "a lost fairy", "a lost fairy"} }); - /* - hintTable[SH_STRAY_FAIRY1] = HintText::Item({ Text{"a lost fairy", "a lost fairy", "a lost fairy"} }); - hintTable[SH_STRAY_FAIRY2] = HintText::Item({ Text{"a lost fairy", "a lost fairy", "a lost fairy"} }); - hintTable[SH_STRAY_FAIRY3] = HintText::Item({ Text{"a lost fairy", "a lost fairy", "a lost fairy"} }); - hintTable[SH_STRAY_FAIRY4] = HintText::Item({ Text{"a lost fairy", "a lost fairy", "a lost fairy"} }); - hintTable[SH_STRAY_FAIRY5] = HintText::Item({ Text{"a lost fairy", "a lost fairy", "a lost fairy"} }); - hintTable[SH_STRAY_FAIRY6] = HintText::Item({ Text{"a lost fairy", "a lost fairy", "a lost fairy"} }); - hintTable[SH_STRAY_FAIRY7] = HintText::Item({ Text{"a lost fairy", "a lost fairy", "a lost fairy"} }); - hintTable[SH_STRAY_FAIRY8] = HintText::Item({ Text{"a lost fairy", "a lost fairy", "a lost fairy"} }); - hintTable[SH_STRAY_FAIRY9] = HintText::Item({ Text{"a lost fairy", "a lost fairy", "a lost fairy"} }); - hintTable[SH_STRAY_FAIRY10] = HintText::Item({ Text{"a lost fairy", "a lost fairy", "a lost fairy"} }); - hintTable[SH_STRAY_FAIRY11] = HintText::Item({ Text{"a lost fairy", "a lost fairy", "a lost fairy"} }); - hintTable[SH_STRAY_FAIRY12] = HintText::Item({ Text{"a lost fairy", "a lost fairy", "a lost fairy"} }); - hintTable[SH_STRAY_FAIRY13] = HintText::Item({ Text{"a lost fairy", "a lost fairy", "a lost fairy"} }); - hintTable[SH_STRAY_FAIRY14] = HintText::Item({ Text{"a lost fairy", "a lost fairy", "a lost fairy"} }); - hintTable[SH_STRAY_FAIRY15] = HintText::Item({ Text{"a lost fairy", "a lost fairy", "a lost fairy"} }); - */ hintTable[GBT_STRAY_FAIRY] = HintText::Item({ Text{"a lost fairy", "a lost fairy", "a lost fairy"} }); - /* - hintTable[GBT_STRAY_FAIRY1] = HintText::Item({ Text{"a lost fairy", "a lost fairy", "a lost fairy"} }); - hintTable[GBT_STRAY_FAIRY2] = HintText::Item({ Text{"a lost fairy", "a lost fairy", "a lost fairy"} }); - hintTable[GBT_STRAY_FAIRY3] = HintText::Item({ Text{"a lost fairy", "a lost fairy", "a lost fairy"} }); - hintTable[GBT_STRAY_FAIRY4] = HintText::Item({ Text{"a lost fairy", "a lost fairy", "a lost fairy"} }); - hintTable[GBT_STRAY_FAIRY5] = HintText::Item({ Text{"a lost fairy", "a lost fairy", "a lost fairy"} }); - hintTable[GBT_STRAY_FAIRY6] = HintText::Item({ Text{"a lost fairy", "a lost fairy", "a lost fairy"} }); - hintTable[GBT_STRAY_FAIRY7] = HintText::Item({ Text{"a lost fairy", "a lost fairy", "a lost fairy"} }); - hintTable[GBT_STRAY_FAIRY8] = HintText::Item({ Text{"a lost fairy", "a lost fairy", "a lost fairy"} }); - hintTable[GBT_STRAY_FAIRY9] = HintText::Item({ Text{"a lost fairy", "a lost fairy", "a lost fairy"} }); - hintTable[GBT_STRAY_FAIRY10] = HintText::Item({ Text{"a lost fairy", "a lost fairy", "a lost fairy"} }); - hintTable[GBT_STRAY_FAIRY11] = HintText::Item({ Text{"a lost fairy", "a lost fairy", "a lost fairy"} }); - hintTable[GBT_STRAY_FAIRY12] = HintText::Item({ Text{"a lost fairy", "a lost fairy", "a lost fairy"} }); - hintTable[GBT_STRAY_FAIRY13] = HintText::Item({ Text{"a lost fairy", "a lost fairy", "a lost fairy"} }); - hintTable[GBT_STRAY_FAIRY14] = HintText::Item({ Text{"a lost fairy", "a lost fairy", "a lost fairy"} }); - hintTable[GBT_STRAY_FAIRY15] = HintText::Item({ Text{"a lost fairy", "a lost fairy", "a lost fairy"} }); - */ hintTable[ST_STRAY_FAIRY] = HintText::Item({ Text{"a lost fairy", "a lost fairy", "a lost fairy"} }); - /* - hintTable[ST_STRAY_FAIRY1] = HintText::Item({ Text{"a lost fairy", "a lost fairy", "a lost fairy"} }); - hintTable[ST_STRAY_FAIRY2] = HintText::Item({ Text{"a lost fairy", "a lost fairy", "a lost fairy"} }); - hintTable[ST_STRAY_FAIRY3] = HintText::Item({ Text{"a lost fairy", "a lost fairy", "a lost fairy"} }); - hintTable[ST_STRAY_FAIRY4] = HintText::Item({ Text{"a lost fairy", "a lost fairy", "a lost fairy"} }); - hintTable[ST_STRAY_FAIRY5] = HintText::Item({ Text{"a lost fairy", "a lost fairy", "a lost fairy"} }); - hintTable[ST_STRAY_FAIRY6] = HintText::Item({ Text{"a lost fairy", "a lost fairy", "a lost fairy"} }); - hintTable[ST_STRAY_FAIRY7] = HintText::Item({ Text{"a lost fairy", "a lost fairy", "a lost fairy"} }); - hintTable[ST_STRAY_FAIRY8] = HintText::Item({ Text{"a lost fairy", "a lost fairy", "a lost fairy"} }); - hintTable[ST_STRAY_FAIRY9] = HintText::Item({ Text{"a lost fairy", "a lost fairy", "a lost fairy"} }); - hintTable[ST_STRAY_FAIRY10] = HintText::Item({ Text{"a lost fairy", "a lost fairy", "a lost fairy"} }); - hintTable[ST_STRAY_FAIRY11] = HintText::Item({ Text{"a lost fairy", "a lost fairy", "a lost fairy"} }); - hintTable[ST_STRAY_FAIRY12] = HintText::Item({ Text{"a lost fairy", "a lost fairy", "a lost fairy"} }); - hintTable[ST_STRAY_FAIRY13] = HintText::Item({ Text{"a lost fairy", "a lost fairy", "a lost fairy"} }); - hintTable[ST_STRAY_FAIRY14] = HintText::Item({ Text{"a lost fairy", "a lost fairy", "a lost fairy"} }); - hintTable[ST_STRAY_FAIRY15] = HintText::Item({ Text{"a lost fairy", "a lost fairy", "a lost fairy"} }); - */ //PROGRESSIVE ITEMS (unused currently) - // PROGRESSIVE_SWORD, - // PROGRESSIVE_BOMB_BAG, - // PROGRESSIVE_BOW, - // PROGRESSIVE_WALLET, - // PROGRESSIVE_MAGIC_METER, + hintTable[PROGRESSIVE_SWORD] = HintText::Item({ Text{"a progressive sword", "", ""} }); + hintTable[PROGRESSIVE_BOMB_BAG] = HintText::Item({ Text{"a progressive bomb bag", "", ""} }); + hintTable[PROGRESSIVE_BOW] = HintText::Item({ Text{"a progressive bow", "", ""} }); + hintTable[PROGRESSIVE_WALLET] = HintText::Item({ Text{"a progressive wallet", "", ""} }); + hintTable[PROGRESSIVE_MAGIC_METER] = HintText::Item({ Text{"progressive magic meter", "", ""} }); // PROGRESSIVE_BOMBCHUS, - //BOTTLE ITEMS + //BOTTLE ITEMS + hintTable[EMPTY_BOTTLE] = HintText::Item({ Text{"a glass container", "a glass container", "a glass container"} }); hintTable[EMPTY_BOTTLE1] = HintText::Item({ Text{"a glass container", "a glass container", "a glass container"} }); hintTable[EMPTY_BOTTLE2] = HintText::Item({ Text{"a glass container", "a glass container", "a glass container"} }); hintTable[BOTTLE_WITH_MILK] = HintText::Item({ Text{"a dairy product", "a dairy product", "a dairy product"}}); @@ -244,6 +122,7 @@ void HintTable_Init() { hintTable[BOTTLE_WITH_ZORA_EGG] = HintText::Item({ Text{"a lost child", "a lost child", "a lost child"}}); hintTable[SEAHORSE] = HintText::Item({ Text{"a sea creature", "a sea creatre", "a sea creature"}}); hintTable[BOTTLE_WITH_MUSHROOM] = HintText::Item({ Text{"a strange fungus", "a strange fungus", "a strange fungus"}}); + hintTable[BOTTLE_WITH_MYSTERY_MILK] = HintText::Item({ Text{"a strange drink", "a strange drink", "a strange drink"}}); //UPGRADABLE ITEMS hintTable[LARGE_QUIVER] = HintText::Item({ Text{"a ranged weapon", "a ranged weapon", "a ranged weapon"}}); hintTable[LARGEST_QUIVER] = HintText::Item({ Text{"a ranged weapon", "a ranged weapon", "a ranged weapon"}}); @@ -263,45 +142,14 @@ void HintTable_Init() { //hintTable[INVERTED_SONG_OF_TIME] = HintText::Item({ Text{"slowed time", "slowed time", "slowed time"}}); hintTable[EPONAS_SONG] = HintText::Item({ Text{"a horses song", "a horses song", "a horses song"}}); hintTable[SONATA_OF_AWAKENING] = HintText::Item({ Text{"a royal song", "a royal song", "a royal song"}}); + hintTable[LULLABY_INTRO] = HintText::Item({ Text{"a sleepy melody intro", "a sleepy melody intro", "a sleepy melody intro"}}); hintTable[GORONS_LULLABY] = HintText::Item({ Text{"a sleepy melody", "a sleepy melody", "a sleepy melody"}}); hintTable[NEW_WAVE_BOSSA_NOVA] = HintText::Item({ Text{"a song of newborns", "a song of newborns", "a song of newborns"}}); hintTable[ELEGY_OF_EMPTINESS] = HintText::Item({ Text{"empty shells", "empty shells", "empty shells"}}); hintTable[OATH_TO_ORDER] = HintText::Item({ Text{"a song of giants", "a song of giants", "a song of giants"}}); //PIECES OF HEART hintTable[PIECE_OF_HEART] = HintText::Item({ Text{"a segment of health", "a segment of health", "a segment of health"} }); - /* - hintTable[PIECE_OF_HEART1] = HintText::Item({ Text{"a segment of health", "a segment of health", "a segment of health"} }); - hintTable[PIECE_OF_HEART2] = HintText::Item({ Text{"a segment of health", "a segment of health", "a segment of health"} }); - hintTable[PIECE_OF_HEART3] = HintText::Item({ Text{"a segment of health", "a segment of health", "a segment of health"} }); - hintTable[PIECE_OF_HEART4] = HintText::Item({ Text{"a segment of health", "a segment of health", "a segment of health"} }); - hintTable[PIECE_OF_HEART5] = HintText::Item({ Text{"a segment of health", "a segment of health", "a segment of health"} }); - hintTable[PIECE_OF_HEART6] = HintText::Item({ Text{"a segment of health", "a segment of health", "a segment of health"} }); - hintTable[PIECE_OF_HEART7] = HintText::Item({ Text{"a segment of health", "a segment of health", "a segment of health"} }); - hintTable[PIECE_OF_HEART8] = HintText::Item({ Text{"a segment of health", "a segment of health", "a segment of health"} }); - hintTable[PIECE_OF_HEART9] = HintText::Item({ Text{"a segment of health", "a segment of health", "a segment of health"} }); - hintTable[PIECE_OF_HEART10] = HintText::Item({ Text{"a segment of health", "a segment of health", "a segment of health"} }); - hintTable[PIECE_OF_HEART11] = HintText::Item({ Text{"a segment of health", "a segment of health", "a segment of health"} }); - hintTable[PIECE_OF_HEART12] = HintText::Item({ Text{"a segment of health", "a segment of health", "a segment of health"} }); - hintTable[PIECE_OF_HEART13] = HintText::Item({ Text{"a segment of health", "a segment of health", "a segment of health"} }); - hintTable[PIECE_OF_HEART14] = HintText::Item({ Text{"a segment of health", "a segment of health", "a segment of health"} }); - hintTable[PIECE_OF_HEART15] = HintText::Item({ Text{"a segment of health", "a segment of health", "a segment of health"} }); - hintTable[PIECE_OF_HEART16] = HintText::Item({ Text{"a segment of health", "a segment of health", "a segment of health"} }); - hintTable[PIECE_OF_HEART17] = HintText::Item({ Text{"a segment of health", "a segment of health", "a segment of health"} }); - hintTable[PIECE_OF_HEART18] = HintText::Item({ Text{"a segment of health", "a segment of health", "a segment of health"} }); - hintTable[PIECE_OF_HEART19] = HintText::Item({ Text{"a segment of health", "a segment of health", "a segment of health"} }); - hintTable[PIECE_OF_HEART20] = HintText::Item({ Text{"a segment of health", "a segment of health", "a segment of health"} }); - hintTable[PIECE_OF_HEART21] = HintText::Item({ Text{"a segment of health", "a segment of health", "a segment of health"} }); - hintTable[PIECE_OF_HEART22] = HintText::Item({ Text{"a segment of health", "a segment of health", "a segment of health"} }); - hintTable[PIECE_OF_HEART23] = HintText::Item({ Text{"a segment of health", "a segment of health", "a segment of health"} }); - hintTable[PIECE_OF_HEART24] = HintText::Item({ Text{"a segment of health", "a segment of health", "a segment of health"} }); - hintTable[PIECE_OF_HEART25] = HintText::Item({ Text{"a segment of health", "a segment of health", "a segment of health"} }); - hintTable[PIECE_OF_HEART26] = HintText::Item({ Text{"a segment of health", "a segment of health", "a segment of health"} }); - hintTable[PIECE_OF_HEART27] = HintText::Item({ Text{"a segment of health", "a segment of health", "a segment of health"} }); - hintTable[PIECE_OF_HEART28] = HintText::Item({ Text{"a segment of health", "a segment of health", "a segment of health"} }); - hintTable[PIECE_OF_HEART29] = HintText::Item({ Text{"a segment of health", "a segment of health", "a segment of health"} }); - hintTable[PIECE_OF_HEART30] = HintText::Item({ Text{"a segment of health", "a segment of health", "a segment of health"} }); - hintTable[PIECE_OF_HEART31] = HintText::Item({ Text{"a segment of health", "a segment of health", "a segment of health"} }); - */ + hintTable[HEART_CONTAINER] = HintText::Item({Text{"a new heart","a new heart", "a new heart"}}); //MAPS hintTable[MAP] = HintText::Item({ Text{"a paper guide", "a paper guide", "a paper guide"}}); hintTable[WOODFALL_TEMPLE_MAP] = HintText::Item({ Text{"a paper guide", "a paper guide", "a paper guide"} }); @@ -328,18 +176,767 @@ void HintTable_Init() { hintTable[STONE_TOWER_TEMPLE_BOSS_KEY] = HintText::Item({ Text{"an important key", "an important key", "an important key"} }); //SMALLKEYS hintTable[SMALL_KEY] = HintText::Item({ Text{"a useful key", "a useful key", "a useful key"} }); - hintTable[WOODFALL_TEMPLE_SMALL_KEY] = HintText::Item({ Text{"a useful key", "a useful key", "a useful key"} }); - //hintTable[SNOWHEAD_TEMPLE_SMALL_KEY1] = HintText::Item({ Text{"a useful key", "a useful key", "a useful key"} }); - //hintTable[SNOWHEAD_TEMPLE_SMALL_KEY2] = HintText::Item({ Text{"a useful key", "a useful key", "a useful key"} }); - //hintTable[SNOWHEAD_TEMPLE_SMALL_KEY3] = HintText::Item({ Text{"a useful key", "a useful key", "a useful key"} }); - hintTable[GBT_SMALL_KEY] = HintText::Item({ Text{"a useful key", "a useful key", "a useful key"} }); - //hintTable[STONE_TOWER_TEMPLE_SMALL_KEY1] = HintText::Item({ Text{"a useful key", "a useful key", "a useful key"} }); - //hintTable[STONE_TOWER_TEMPLE_SMALL_KEY2] = HintText::Item({ Text{"a useful key", "a useful key", "a useful key"} }); - //hintTable[STONE_TOWER_TEMPLE_SMALL_KEY3] = HintText::Item({ Text{"a useful key", "a useful key", "a useful key"} }); - //hintTable[STONE_TOWER_TEMPLE_SMALL_KEY4] = HintText::Item({ Text{"a useful key", "a useful key", "a useful key"} }); - //DUNGEON REWARDS + hintTable[WOODFALL_TEMPLE_SMALL_KEY] = HintText::Item({Text{"swampy small key", "", ""}}); + hintTable[SNOWHEAD_TEMPLE_SMALL_KEY] = HintText::Item({Text{"icy small key", "", ""}}); + hintTable[GBT_SMALL_KEY] = HintText::Item({Text{"ocean small key", "", ""}}); + hintTable[STONE_TOWER_TEMPLE_SMALL_KEY] = HintText::Item({Text{"rocky small key", "", ""}}); + //DUNGEON REWARDS hintTable[ODOLWAS_REMAINS] = HintText::Item({ Text{"a boss's remains", "a boss's remains", "a boss's remains"} }); hintTable[GOHTS_REMAINS] = HintText::Item({ Text{"a boss's remains", "a boss's remains", "a boss's remains"} }); hintTable[GYORGS_REMAINS] = HintText::Item({ Text{"a boss's remains", "a boss's remains", "a boss's remains"} }); hintTable[TWINMOLDS_REMAINS] = HintText::Item({ Text{"a boss's remains", "a boss's remains", "a boss's remains"} }); + + /*----------------------- + | REFILL ITEMS | + -----------------------*/ + hintTable[RECOVERY_HEART] = HintText::Item({Text{"Recovery Heart","",""}}); + hintTable[GREEN_RUPEE] = HintText::Item({Text{"Green rupee", "", ""}}); + hintTable[BLUE_RUPEE] = HintText::Item({Text{"Blue rupee", "", ""}}); + hintTable[RED_RUPEE] = HintText::Item({Text{"Red rupee", "", ""}}); + hintTable[PURPLE_RUPEE] = HintText::Item({Text{"Purple rupee", "", ""}}); + hintTable[SILVER_RUPEE] = HintText::Item({Text{"Silver rupee", "", ""}}); + hintTable[HUGE_RUPEE] = HintText::Item({Text{"Huge rupee", "", ""}}); + hintTable[DEKU_NUTS_5] = HintText::Item({Text{"5 nuts", "", ""}}); + hintTable[DEKU_NUTS_10] = HintText::Item({Text{"10 nuts", "", ""}}); + hintTable[BOMBS_5] = HintText::Item({Text{"5 explosive orbs", "", ""}}); + hintTable[BOMBS_10] = HintText::Item({Text{"10 explosive orbs", "", ""}}); + hintTable[BOMBS_20] = HintText::Item({Text{"20 explosive orbs", "", ""}}); + hintTable[BOMBCHU_5] = HintText::Item({Text{"5 explosive mice", "", ""}}); + hintTable[BOMBCHU_10] = HintText::Item({Text{"10 explosive mice", "", ""}}); + hintTable[BOMBCHU_20] = HintText::Item({Text{"20 explosive mice", "", ""}}); + hintTable[ARROWS_10] = HintText::Item({Text{"10 projectile sticks", "", ""}}); + hintTable[ARROWS_30] = HintText::Item({Text{"30 projectile sticks", "", ""}}); + hintTable[ARROWS_40] = HintText::Item({Text{"40 projectile sticks", "", ""}}); + hintTable[ARROWS_50] = HintText::Item({Text{"50 projectile sticks", "", ""}}); + hintTable[BLUE_POTION_REFILL] = HintText::Item({Text{"Blue Potion Refill", "", ""}}); + hintTable[GREEN_POTION_REFILL] = HintText::Item({Text{"Green Potion Refill", "", ""}}); + hintTable[RED_POTION_REFILL] = HintText::Item({Text{"Red Potion Refill", "", ""}}); + hintTable[BOMBCHU_DROP] = HintText::Item({Text{"explosive mice", "", ""}}); + hintTable[DEKU_STICK_1] = HintText::Item({Text{"1 stick", "",""}}); + + /*---------------- + | SHOP ITEMS | + ----------------*/ + hintTable[BUY_ARROWS_10] = HintText::Item({Text{"Buy 10 Arrows","",""}}); + hintTable[BUY_ARROWS_30] = HintText::Item({Text{"Buy 30 Arrows","",""}}); + hintTable[BUY_BLUE_POTION] = HintText::Item({Text{"Buy Blue Potion","",""}}); + hintTable[BUY_BOMBCHU_10] = HintText::Item({Text{"Buy 10 Bombchu","",""}}); + hintTable[BUY_BOMBS_10] = HintText::Item({Text{"Buy 10 Bombs","",""}}); + hintTable[BUY_DEKU_NUT_10] = HintText::Item({Text{"Buy 10 Deku Nuts","",""}}); + hintTable[BUY_DEKU_STICK_1] = HintText::Item({Text{"Buy 1 Deku Stick","",""}}); + hintTable[BUY_FAIRYS_SPIRIT] = HintText::Item({Text{"Buy Fairy","",""}}); + hintTable[BUY_GREEN_POTION] = HintText::Item({Text{"Buy Green Potion","",""}}); + hintTable[BUY_HEROS_SHIELD] = HintText::Item({Text{"Buy Hero Shield","",""}}); + hintTable[BUY_MAGIC_BEAN] = HintText::Item({Text{"Buy Magic Bean","",""}}); + hintTable[BUY_RED_POTION] = HintText::Item({Text{"Buy Red Potion","",""}}); + + /*----------------------- + | SOMETIMES HINT TEXT | + -----------------------*/ + // Clock Tower + hintTable[CLOCK_TOWER_OCARINA_OF_TIME] = HintText::Sometimes({ Text{"A Musical Instrument","A Musical Instrument","A Musical Instrument"}}); + hintTable[HMS_DEKU_MASK] = HintText::Sometimes({ Text{"a forest curse removed rewards","a cursed removed","a cursed removed"}}); + hintTable[HMS_SONG_OF_HEALING] = HintText::Sometimes({ Text{"a masked man's melody teaches","a masked man's melody","a masked man's melody"}}); + hintTable[HMS_BOMBERS_NOTEBOOK] = HintText::Sometimes({ Text{"a masked man's gift rewards","a masked man's gift","a masked man's gift"}}); + hintTable[HMS_STARTING_SWORD] = HintText::Sometimes({ Text{"a new file yields","a new file","a new file"}}); + hintTable[HMS_STARTING_SHIELD] = HintText::Sometimes({ Text{"a new file yields","a new file","a new file"}}); + //PRE_CLOCK_TOWN_CHEST, +//Deku Palace + hintTable[DEKU_PALACE_BEAN_SELLER] = HintText::Sometimes({ Text{"a gorging merchant sells", "", ""}}); + hintTable[DEKU_PALACE_WEST_GARDEN] = HintText::Sometimes({ Text{"the home of scrubs contains", "", ""}}); + hintTable[DEKU_PALACE_BUTLER_RACE] = HintText::Sometimes({ Text{"the royal servant rewards", "", ""}}); + hintTable[DEKU_PALACE_BEAN_GROTTO_CHEST] = HintText::Sometimes({ Text{"a merchant's cave contains", "", ""}}); + hintTable[DEKU_PALACE_IMPRISONED_MONKEY] = HintText::Sometimes({ Text{"a false imprisonment teaches", "", ""}}); +//East Clock Town + hintTable[E_CLOCK_TOWN_AROMA_IN_BAR] = HintText::Sometimes({ Text{"an important lady rewards", "", ""}}); + hintTable[E_CLOCK_TOWN_ARCHERY_1] = HintText::Sometimes({ Text{"a town activity rewards", "", ""}}); + hintTable[E_CLOCK_TOWN_ARCHERY_2] = HintText::Sometimes({ Text{"a town activity rewards", "", ""}}); + hintTable[E_CLOCK_TOWN_MAYOR] = HintText::Sometimes({ Text{"a town leader rewards", "", ""}}); + hintTable[E_CLOCK_TOWN_HONEY_DARLING_3DAYS] = HintText::Sometimes({ Text{"a lovers game rewards", "", ""}}); + hintTable[E_CLOCK_TOWN_TREASURE_CHEST_GAME_GORON] = HintText::Sometimes({ Text{"a treasure game rewards", "", ""}}); + hintTable[E_CLOCK_TOWN_POSTMAN_FREEDOM] = HintText::Sometimes({ Text{"a delivery person rewards", "", ""}}); + hintTable[E_CLOCK_TOWN_GORMAN] = HintText::Sometimes({ Text{"a miserable leader rewards", "", ""}}); + hintTable[E_CLOCK_TOWN_AROMA_IN_OFFICE] = HintText::Sometimes({ Text{"an important lady rewards", "", ""}}); + hintTable[BOMBERS_HIDEOUT_CHEST] = HintText::Sometimes({ Text{"a secret hideout contains", "", ""}}); + hintTable[E_CLOCK_TOWN_CHEST] = HintText::Sometimes({ Text{"a shop roof contains", "", ""}}); + hintTable[E_CLOCK_TOWN_POSTBOX] = HintText::Sometimes({ Text{"a correspondence box contains", "", ""}}); + //hintTable[E_CLOCK_TOWN_MILK_BAR_CHATEAU] = HintText::Sometimes({ Text{"", "", ""}}); + //hintTable[E_CLOCK_TOWN_MILK_BAR_MILK] = HintText::Sometimes({ Text{"", "", ""}}); + hintTable[GORMAN_TRACK_MYSTERY_MILK_QUEST] = HintText::Sometimes({ Text{"an upset stomach cure rewards", "", ""}}); + //hintTable[E_CLOCK_TOWN_HONEY_DARLING_ANY_DAY] = HintText::Sometimes({ Text{"", "", ""}}); + //hintTable[E_CLOCK_TOWN_TREASURE_CHEST_GAME_HUMAN] = HintText::Sometimes({ Text{"", "", ""}}); + //hintTable[E_CLOCK_TOWN_TREASURE_CHEST_GAME_ZORA] = HintText::Sometimes({ Text{"", "", ""}}); + //hintTable[E_CLOCK_TOWN_TREASURE_CHEST_GAME_DEKU] = HintText::Sometimes({ Text{"", "", ""}}); +//Goron Village + hintTable[GORON_VILLAGE_POWDER_KEG_CHALLENGE] = HintText::Sometimes({ Text{"a large goron rewards", "", ""}}); + hintTable[GORON_VILLAGE_SCRUB_PURCHASE] = HintText::Sometimes({ Text{"a northern merchant sells", "", ""}}); + hintTable[GORON_VILLAGE_LENS_OF_TRUTH_CHEST] = HintText::Sometimes({ Text{"a lonely peak contains", "", ""}}); + hintTable[GORON_VILLAGE_SCRUB_TRADE] = HintText::Sometimes({ Text{"a northern merchant trades", "", ""}}); + hintTable[GORON_VILLAGE_LEDGE] = HintText::Sometimes({ Text{"a cold ledge contains", "", ""}}); + hintTable[GORON_VILLAGE_POWDER_KEG_CHALLENGE_SPRING] = HintText::Sometimes({ Text{"a large goron rewards", "", ""}}); + hintTable[GORON_VILLAGE_SCRUB_PURCHASE_SPRING] = HintText::Sometimes({ Text{"a northern merchant sells", "", ""}}); + hintTable[GORON_VILLAGE_SCRUB_TRADE_SPRING] = HintText::Sometimes({ Text{"a northern merchant trades", "", ""}}); + hintTable[GORON_VILLAGE_LEDGE_SPRING] = HintText::Sometimes({ Text{"a cold ledge contains", "", ""}}); + hintTable[GORON_VILLAGE_GORON_LULLABY] = HintText::Sometimes({ Text{"a lonely child teaches", "", ""}}); + hintTable[LENS_CAVE_RED_RUPEE] = HintText::Sometimes({ Text{"a lonely peak contains", "", ""}}); + hintTable[LENS_CAVE_PURPLE_RUPEE] = HintText::Sometimes({ Text{"a lonely peak contains", "", ""}}); + hintTable[GORON_SHOP_ITEM_1] = HintText::Sometimes({ Text{"a goron shop sells", "", ""}}); + hintTable[GORON_SHOP_ITEM_2] = HintText::Sometimes({ Text{"a goron shop sells", "", ""}}); + hintTable[GORON_SHOP_ITEM_3] = HintText::Sometimes({ Text{"a goron shop sells", "", ""}}); +//Great Bay Coast + hintTable[GBC_OCEAN_SPIDER_DAY1] = HintText::Sometimes({ Text{"a new ocean home owner rewards", "", ""}}); + //hintTable[GBC_OCEAN_SPIDER_DAY2] = HintText::Sometimes({ Text{"", "", ""}}); + //hintTable[GBC_OCEAN_SPIDER_DAY3] = HintText::Sometimes({ Text{"", "", ""}}); + hintTable[GBC_FISHERMAN_GAME] = HintText::Sometimes({ Text{"an ocean game rewards", "", ""}}); + hintTable[GBC_OCEAN_SPIDER_CHEST] = HintText::Sometimes({ Text{"the colored masks contains", "", ""}}); + hintTable[GBC_LAB_FISH] = HintText::Sometimes({ Text{"feeding the fish rewards", "", ""}}); + hintTable[GBC_LEDGE] = HintText::Sometimes({ Text{"an ocean ledge contains", "", ""}}); + hintTable[GBC_MIKAU] = HintText::Sometimes({ Text{"a healed spirit rewards", "", ""}}); + hintTable[GBC_BABY_ZORAS] = HintText::Sometimes({ Text{"the pirates' loot teaches", "", ""}}); + hintTable[GBC_GROTTO_CHEST] = HintText::Sometimes({ Text{"an ocean cave contains", "", ""}}); + hintTable[GBC_GROTTO_COW1] = HintText::Sometimes({ Text{"a lost creature gives", "", ""}}); + hintTable[GBC_GROTTO_COW2] = HintText::Sometimes({ Text{"a lost creature gives", "", ""}}); + hintTable[GBC_FISHERMAN_PHOTO] = HintText::Sometimes({ Text{"a fisherman rewards", "", ""}}); + hintTable[TINGLE_GBC_GB] = HintText::Sometimes({ Text{"a map maker sells", "", ""}}); + hintTable[TINGLE_GBC_ST] = HintText::Sometimes({ Text{"a map maker sells", "", ""}}); +//Ikana Canyon + hintTable[IKANA_CANYON_GREAT_FAIRY] = HintText::Sometimes({Text{"the fairy of kindness rewards", "", ""}}); + hintTable[IKANA_CANYON_POE_HUT_HP] = HintText::Sometimes({Text{"a game of ghosts rewards", "", ""}}); + hintTable[IKANA_CANYON_LEDGE] = HintText::Sometimes({Text{"a canyon ledge contains", "", ""}}); + hintTable[IKANA_CANYON_PAMELAS_FATHER] = HintText::Sometimes({Text{"a lost father rewards", "", ""}}); + hintTable[IKANA_CANYON_SECRET_SHRINE_GROTTO_CHEST] = HintText::Sometimes({Text{"a waterfall cave contains", "", ""}}); + hintTable[IKANA_CANYON_SCRUB_TRADE] = HintText::Sometimes({Text{"an eastern merchant trades", "", ""}}); + hintTable[IKANA_CANYON_SCRUB_PURCHASE] = HintText::Sometimes({Text{"an eastern merchant sells", "", ""}}); + hintTable[TINGLE_IKANA_CANYON_ST] = HintText::Sometimes({Text{"a map maker sells", "", ""}}); + hintTable[TINGLE_IKANA_CANYON_CT] = HintText::Sometimes({Text{"a map maker sells", "", ""}}); +//Ikana Graveyard + hintTable[IKANA_GRAVEYARD_DAMPE_DIGGING] = HintText::Sometimes({Text{"a fearful basement contains", "", ""}}); + hintTable[IKANA_GRAVEYARD_IRON_KNUCKLE_CHEST] = HintText::Sometimes({Text{"a hollow ground contains", "", ""}}); + hintTable[IKANA_GRAVEYARD_CAPTAIN_KEETA_CHEST] = HintText::Sometimes({Text{"a skeletal leader rewards", "", ""}}); + hintTable[IKANA_GRAVEYARD_DAY_ONE_GRAVE_TABLET] = HintText::Sometimes({Text{"a hollow ground teaches", "", ""}}); + hintTable[IKANA_GRAVEYARD_DAY_ONE_GRAVE_BATS] = HintText::Sometimes({Text{"a cloud of bats contains", "", ""}}); + hintTable[IKANA_GRAVEYARD_GROTTO_CHEST] = HintText::Sometimes({Text{"a circled cave contains", "", ""}}); +//Laundry Pool + hintTable[LAUNDRY_POOL_KAFEI] = HintText::Sometimes({Text{"a posted letter rewards", "", ""}}); + hintTable[LAUNDRY_POOL_CURIOSITY_SHOP_MAN_ONE] = HintText::Sometimes({Text{"a shady dealer rewards", "", ""}}); + hintTable[LAUNDRY_POOL_CURIOSITY_SHOP_MAN_TWO] = HintText::Sometimes({Text{"a shady dealer rewards", "", ""}}); + hintTable[LAUNDRY_POOL_GURU_GURU] = HintText::Sometimes({Text{"a musician gives", "", ""}}); + hintTable[LAUNDRY_POOL_SF] = HintText::Sometimes({Text{"a lost fairy is", "", ""}}); +//Milk Road + hintTable[MILK_ROAD_GORMAN_RACE] = HintText::Sometimes({Text{"a sporting event rewards", "", ""}}); + hintTable[MILK_ROAD_GORMAN_MILK_BUY] = HintText::Sometimes({Text{"a dodgy seller sells", "", ""}}); + hintTable[MILK_ROAD_KEATON_QUIZ] = HintText::Sometimes({Text{"a mysterious fox rewards", "", ""}}); + hintTable[TINGLE_MILK_ROAD_RR] = HintText::Sometimes({Text{"a map maker sells", "", ""}}); + hintTable[TINGLE_MILK_ROAD_GB] = HintText::Sometimes({Text{"a map maker sells", "", ""}}); +//Mountain Village + hintTable[MOUNTAIN_VILLAGE_SMITH_DAY_ONE] = HintText::Sometimes({Text{"a moutain smith crafts", "", ""}}); + hintTable[MOUNTAIN_VILLAGE_SMITH_DAY_TWO] = HintText::Sometimes({Text{"a mountain smith crafts", "", ""}}); + hintTable[MOUNTAIN_VILLAGE_FROG_CHOIR] = HintText::Sometimes({Text{"a frog choir rewards", "", ""}}); + hintTable[MOUNTAIN_VILLAGE_KEATON_QUIZ] = HintText::Sometimes({Text{"a mysterious fox rewards", "", ""}}); + hintTable[MOUNTAIN_VILLAGE_DARMANI] = HintText::Sometimes({Text{"a mountain spirit rewards", "", ""}}); + hintTable[MOUNTAIN_VILLAGE_HUNGRY_GORON] = HintText::Sometimes({Text{"a hungry goron rewards", "", ""}}); + hintTable[MOUNTAIN_WATERFALL_CHEST] = HintText::Sometimes({Text{"a springtime waterfall contains", "", ""}}); + hintTable[MOUNTAIN_VILLAGE_SPRING_WATER_GROTTO_CHEST] = HintText::Sometimes({Text{"a springtime cave contains", "", ""}}); +//N Clock Town + hintTable[N_CLOCK_TOWN_GREAT_FAIRY_DEKU] = HintText::Sometimes({Text{"the fairy of magic rewards", "", ""}}); + //hintTable[N_CLOCK_TOWN_BOMBERS_HIDE_SEEK] = HintText::Sometimes({Text{"", "", ""}}); doesn't give an item in 3d + hintTable[N_CLOCK_TOWN_KEATON_QUIZ] = HintText::Sometimes({Text{"a mysterious fox rewards", "", ""}}); + hintTable[N_CLOCK_TOWN_DEKU_PLAYGROUND_3DAYS] = HintText::Sometimes({Text{"a game for scrubs rewards", "", ""}}); + hintTable[N_CLOCK_TOWN_TREE] = HintText::Sometimes({Text{"a town playground contains", "", ""}}); + hintTable[N_CLOCK_TOWN_OLD_LADY] = HintText::Sometimes({Text{"an old lady's struggle rewards", "", ""}}); + hintTable[N_CLOCK_TOWN_GREAT_FAIRY_HUMAN] = HintText::Sometimes({Text{"the fairy of magi rewardsc", "", ""}}); + hintTable[TINGLE_N_CLOCK_TOWN_CT] = HintText::Sometimes({Text{"a map maker sells", "", ""}}); + hintTable[TINGLE_N_CLOCK_TOWN_WF] = HintText::Sometimes({Text{"a map maker sells", "", ""}}); + hintTable[N_CLOCK_TOWN_POSTBOX] = HintText::Sometimes({Text{"a correspondence box contains", "", ""}}); + //hintTable[N_CLOCK_TOWN_DEKU_PLAYGROUND_ADAY] = HintText::Sometimes({Text{"a game for scrubs", "", ""}}); +//Road to Snowhead + hintTable[ROAD_TO_SNOWHEAD_PILLAR] = HintText::Sometimes({Text{"a cold platform contains", "", ""}}); + hintTable[ROAD_TO_SNOWHEAD_GROTTO_CHEST] = HintText::Sometimes({Text{"a snowy cave contains", "", ""}}); +//Pinnacle Rock + hintTable[PINNACLE_ROCK_SEAHORSES] = HintText::Sometimes({Text{"a fishy reunion rewards", "", ""}}); + hintTable[PINNACLE_ROCK_UPPER_CHEST] = HintText::Sometimes({Text{"a marine trench contains", "", ""}}); + hintTable[PINNACLE_ROCK_LOWER_CHEST] = HintText::Sometimes({Text{"a marine trench contains", "", ""}}); + hintTable[PINNACLE_ROCK_ZORA_EGG1] = HintText::Sometimes({Text{"in a marine trench rests", "", ""}}); + hintTable[PINNACLE_ROCK_ZORA_EGG2] = HintText::Sometimes({Text{"in a marine trench rests", "", ""}}); + hintTable[PINNACLE_ROCK_ZORA_EGG3] = HintText::Sometimes({Text{"in a marine trench rests", "", ""}}); +//Road to Ikana + hintTable[ROAD_TO_IKANA_PILLAR_CHEST] = HintText::Sometimes({Text{"a high chest contains", "", ""}}); + hintTable[ROAD_TO_IKANA_GROTTO_CHEST] = HintText::Sometimes({Text{"a blocked cave contains", "", ""}}); +//Road to Southern Swamp + hintTable[ROAD_TO_SS_ARCHERY_1] = HintText::Sometimes({Text{"a swamp game rewards", "", ""}}); + hintTable[ROAD_TO_SS_ARCHERY_2] = HintText::Sometimes({Text{"a swamp game rewards", "", ""}}); + hintTable[ROAD_TO_SS_TREE] = HintText::Sometimes({Text{"a batty tree contains", "", ""}}); + hintTable[ROAD_TO_SWAMP_GROTTO_CHEST] = HintText::Sometimes({Text{"a southern cave contains", "", ""}}); + hintTable[TINGLE_ROAD_TO_SS_WF] = HintText::Sometimes({Text{"a map maker sells", "", ""}}); + hintTable[TINGLE_ROAD_TO_SS_SH] = HintText::Sometimes({Text{"a map maker sells", "", ""}}); +//Romani Ranch + hintTable[ROMANI_RANCH_ALIEN_DEFENSE] = HintText::Sometimes({Text{"a ranch invasion rewards", "", ""}}); + hintTable[ROMANI_RANCH_DOG_RACE] = HintText::Sometimes({Text{"a sporting event rewards", "", ""}}); + hintTable[ROMANI_RANCH_GROG] = HintText::Sometimes({Text{"a chicken lover rewards", "", ""}}); + hintTable[ROMANI_RANCH_CREMIA_ESCORT] = HintText::Sometimes({Text{"an older sister rewards", "", ""}}); + hintTable[ROMANI_RANCH_ROMANIS_GAME] = HintText::Sometimes({Text{"an equine reunion teaches", "", ""}}); + hintTable[ROMANI_RANCH_COW_1] = HintText::Sometimes({Text{"a lost creature gives", "", ""}}); + hintTable[ROMANI_RANCH_COW_2] = HintText::Sometimes({Text{"a lost creature gives", "", ""}}); + hintTable[ROMANI_RANCH_COW_3] = HintText::Sometimes({Text{"a lost creature gives", "", ""}}); + hintTable[DOGGY_RACETRACK_ROOF_CHEST] = HintText::Sometimes({Text{"a day at the races contains", "", ""}}); +//S Clock Town + hintTable[S_CLOCK_TOWN_SCRUB_TRADE] = HintText::Sometimes({Text{"a town merchant trades", "", ""}}); + hintTable[S_CLOCK_TOWN_POSTBOX] = HintText::Sometimes({Text{"a correspondence box contains", "", ""}}); + hintTable[S_CLOCK_TOWN_CLOCK_TOWER_ENTRANCE] = HintText::Sometimes({Text{"the tower doors contains", "", ""}}); + hintTable[S_CLOCK_TOWN_STRAW_ROOF_CHEST] = HintText::Sometimes({Text{"a straw roof contains", "", ""}}); + hintTable[S_CLOCK_TOWN_FINAL_DAY_CHEST] = HintText::Sometimes({Text{"a carnival tower contains", "", ""}}); + hintTable[S_CLOCK_TOWN_BANK_REWARD_1] = HintText::Sometimes({Text{"a keeper of wealth rewards", "", ""}}); + hintTable[S_CLOCK_TOWN_BANK_REWARD_2] = HintText::Sometimes({Text{"interest rewards", "", ""}}); + hintTable[S_CLOCK_TOWN_BANK_REWARD_3] = HintText::Sometimes({Text{"being rich rewards", "", ""}}); +//Snowhead + hintTable[SNOWHEAD_GREAT_FAIRY] = HintText::Sometimes({Text{"the fairy of power rewards", "", ""}}); +//Southern Swamp + hintTable[SOUTHERN_SWAMP_KOUME] = HintText::Sometimes({Text{"a witch rewards", "", ""}}); + hintTable[SOUTHERN_SWAMP_KOTAKE] = HintText::Sometimes({Text{"a sleeping witch rewards", "", ""}}); + hintTable[SOUTHERN_SWAMP_KOTAKE_IN_WOODS] = HintText::Sometimes({Text{"a witch rewards", "", ""}}); + hintTable[SOUTHERN_SWAMP_SCRUB_TRADE] = HintText::Sometimes({Text{"a southern merchant trades", "", ""}}); + hintTable[SOUTHERN_SWAMP_PICTOGRAPH_WINNER] = HintText::Sometimes({Text{"a swamp game rewards", "", ""}}); + hintTable[SOUTHERN_SWAMP_BOAT_ARCHERY] = HintText::Sometimes({Text{"a swamp game rewards", "", ""}}); + hintTable[SWAMP_TOURIST_CENTER_ROOF] = HintText::Sometimes({Text{"a tourist center contains", "", ""}}); + hintTable[SOUTHERN_SWAMP_NEAR_SPIDER_HOUSE_GROTTO_CHEST] = HintText::Sometimes({Text{"a swampy cave contains", "", ""}}); + hintTable[SOUTHERN_SWAMP_SPIDER_HOUSE_REWARD] = HintText::Sometimes({Text{"a swamp spider man rewards", "", ""}}); + hintTable[SOUTHERN_SWAMP_MYSTERY_WOODS_GROTTO_CHEST] = HintText::Sometimes({Text{"a mystery cave contains", "", ""}}); + hintTable[SOUTHERN_SWAMP_KOTAKE_MUSHROOM_SALE] = HintText::Sometimes({Text{"a sleeping witch rewards", "", ""}}); + //hintTable[SOUTHERN_SWAMP_PICTOGRAPH_STANDARD] = HintText::Sometimes({Text{"", "", ""}}); + //hintTable[SOUTHERN_SWAMP_PICTOGRAPH_GOOD] = HintText::Sometimes({Text{"", "", ""}}); + hintTable[SOUTHERN_SWAMP_SCRUB_PURCHASE] = HintText::Sometimes({Text{"a southern merchant sells", "", ""}}); + hintTable[SOUTHERN_SWAMP_SCRUB_PURCHASE_CLEAR] = HintText::Sometimes({Text{"a southern merchant sells", "", ""}}); + hintTable[SOUTHERN_SWAMP_SCRUB_TRADE_CLEAR] = HintText::Sometimes({Text{"a southern merchant trades", "", ""}}); + hintTable[SWAMP_TOURIST_CENTER_ROOF_CLEAR] = HintText::Sometimes({Text{"a tourist center contains", "", ""}}); + hintTable[POTION_SHOP_ITEM_1] = HintText::Sometimes({Text{"a potion maker sells", "", ""}}); + hintTable[POTION_SHOP_ITEM_2] = HintText::Sometimes({Text{"a potion maker sells", "", ""}}); + hintTable[POTION_SHOP_ITEM_3] = HintText::Sometimes({Text{"a potion maker sells", "", ""}}); +//Stock Pot Inn + hintTable[STOCKPOTINN_RESERVATION] = HintText::Sometimes({Text{"checking-in rewards", "", ""}}); + hintTable[STOCKPOTINN_MIDNIGHT_MEETING] = HintText::Sometimes({Text{"a late meeting rewards", "", ""}}); + hintTable[STOCKPOTINN_TOILET_HAND] = HintText::Sometimes({Text{"a strange palm rewards", "", ""}}); + hintTable[STOCKPOTINN_GRANDMA_SHORT_STORY] = HintText::Sometimes({Text{"an old lady rewards", "", ""}}); + hintTable[STOCKPOTINN_GRANDMA_LONG_STORY] = HintText::Sometimes({Text{"an old lady rewards", "", ""}}); + hintTable[STOCKPOTINN_ANJU_AND_KAFEI] = HintText::Sometimes({Text{"a lovers' reunion rewards", "", ""}}); + hintTable[STOCKPOTINN_STAFF_ROOM_CHEST] = HintText::Sometimes({Text{"an employee room contains", "", ""}}); + hintTable[STOCKPOTINN_GUEST_ROOM_CHEST] = HintText::Sometimes({Text{"a guest bedroom contains", "", ""}}); +//Stone Tower + hintTable[STONE_TOWER_INVERTED_RIGHT_CHEST] = HintText::Sometimes({Text{"a sky below contains", "", ""}}); + hintTable[STONE_TOWER_INVERTED_CENTER_CHEST] = HintText::Sometimes({Text{"a sky below contains", "", ""}}); + hintTable[STONE_TOWER_INVERTED_LEFT_CHEST] = HintText::Sometimes({Text{"a sky below contains", "", ""}}); +//Termina Field + hintTable[TERMINA_FIELD_MOONS_TEAR] = HintText::Sometimes({Text{"a falling star contains", "", ""}}); + hintTable[TERMINA_FIELD_GOSSIP_STONES] = HintText::Sometimes({Text{"mysterious stones reward", "", ""}}); + hintTable[TERMINA_FIELD_BUSINESS_SCRUB] = HintText::Sometimes({Text{"a hidden merchant sells", "", ""}}); + hintTable[TERMINA_FIELD_PEAHAT_GROTTO_CHEST] = HintText::Sometimes({Text{"a hollow ground contains", "", ""}}); + hintTable[TERMINA_FIELD_DODONGO_GROTTO_CHEST] = HintText::Sometimes({Text{"a hollow ground contains", "", ""}}); + hintTable[TERMINA_FIELD_BIO_BABA_GROTTO_BEEHIVE] = HintText::Sometimes({Text{"a beehive contains", "", ""}}); + hintTable[TERMINA_FIELD_KAMARO] = HintText::Sometimes({Text{"a dancer rewards", "", ""}}); + hintTable[TERMINA_FIELD_PILLAR_GROTTO_CHEST] = HintText::Sometimes({Text{"a hollow pillar contains", "", ""}}); + hintTable[TERMINA_FIELD_GRASS_GROTTO_CHEST] = HintText::Sometimes({Text{"a grassy cave contains", "", ""}}); + hintTable[TERMINA_FIELD_UNDERWATER_CHEST] = HintText::Sometimes({Text{"a sunken chest contains", "", ""}}); + hintTable[TERMINA_FIELD_GRASS_CHEST] = HintText::Sometimes({Text{"a grassy chest contains", "", ""}}); + hintTable[TERMINA_FIELD_STUMP_CHEST] = HintText::Sometimes({Text{"a tree chest contains", "", ""}}); + hintTable[TERMINA_FIELD_GROTTO_COW1] = HintText::Sometimes({Text{"a lost creature gives", "", ""}}); + hintTable[TERMINA_FIELD_GROTTO_COW2] = HintText::Sometimes({Text{"a lost creature gibes", "", ""}}); +//Twin Islands + hintTable[HOT_SPRING_WATER_GROTTO_CHEST] = HintText::Sometimes({Text{"a steamy grotto contains", "", ""}}); + hintTable[TWIN_ISLANDS_GORON_RACE] = HintText::Sometimes({Text{"a sporting event rewards", "", ""}}); + hintTable[TWIN_ISLANDS_GORON_RACETRACK_GROTTO_CHEST] = HintText::Sometimes({Text{"a hidden cave contains", "", ""}}); + hintTable[TWIN_ISLANDS_UNDERWATER_RAMP_CHEST] = HintText::Sometimes({Text{"a spring treasure contains", "", ""}}); + hintTable[TWIN_ISLANDS_CAVE_CHEST] = HintText::Sometimes({Text{"a sunken springtime treasure contains", "", ""}}); + hintTable[TWIN_ISLANDS_LULLABY_INTRO] = HintText::Sometimes({Text{"a goron elder teaches", "", ""}}); + hintTable[TINGLE_TWIN_ISLANDS_SH] = HintText::Sometimes({Text{"a map maker sells ", "", ""}}); + hintTable[TINGLE_TWIN_ISLANDS_RR] = HintText::Sometimes({Text{"a map maker sells", "", ""}}); + hintTable[TINGLE_TWIN_ISLANDS_SH_SPRING] = HintText::Sometimes({Text{"a map maker sells", "", ""}}); + hintTable[TINGLE_TWIN_ISLANDS_RR_SPRING] = HintText::Sometimes({Text{"a map maker sells", "", ""}}); +//W Clock Town + hintTable[W_CLOCK_TOWN_BOMB_BAG_BUY] = HintText::Sometimes({Text{"a town merchant sells", "", ""}}); + hintTable[W_CLOCK_TOWN_BIG_BOMB_BAG_BUY] = HintText::Sometimes({Text{"a town merchant sells", "", ""}}); + hintTable[W_CLOCK_TOWN_POSTMANS_GAME] = HintText::Sometimes({Text{"a delivery person rewards", "", ""}}); + hintTable[W_CLOCK_TOWN_ROSA_SISTERS] = HintText::Sometimes({Text{"traveling sisters reward", "", ""}}); + hintTable[W_CLOCK_TOWN_SWORDSMANS_SCHOOL] = HintText::Sometimes({Text{"a town game rewards", "", ""}}); + hintTable[W_CLOCK_TOWN_ALL_NIGHT_MASK_BUY] = HintText::Sometimes({Text{"a shady town merchant sells", "", ""}}); + hintTable[W_CLOCK_TOWN_BOMB_SHOP_GORON] = HintText::Sometimes({Text{"a town goron merchant sells", "", ""}}); + //hintTable[W_CLOCK_TOWN_LOTTERY] = HintText::Sometimes({Text{"", "", ""}}); + hintTable[TRADING_POST_ITEM_1] = HintText::Sometimes({Text{"a town merchant sells", "", ""}}); + hintTable[TRADING_POST_ITEM_2] = HintText::Sometimes({Text{"a town merchant sells", "", ""}}); + hintTable[TRADING_POST_ITEM_3] = HintText::Sometimes({Text{"a town merchant sells", "", ""}}); + hintTable[TRADING_POST_ITEM_4] = HintText::Sometimes({Text{"a town merchant sells", "", ""}}); + hintTable[TRADING_POST_ITEM_5] = HintText::Sometimes({Text{"a town merchant sells", "", ""}}); + hintTable[TRADING_POST_ITEM_6] = HintText::Sometimes({Text{"a town merchant sells", "", ""}}); + hintTable[TRADING_POST_ITEM_7] = HintText::Sometimes({Text{"a town merchant sells", "", ""}}); + hintTable[TRADING_POST_ITEM_8] = HintText::Sometimes({Text{"a town merchant sells", "", ""}}); + hintTable[BOMB_SHOP_ITEM_1] = HintText::Sometimes({Text{"a town merchant sells", "", ""}}); + hintTable[BOMB_SHOP_ITEM_2] = HintText::Sometimes({Text{"a town merchant sells", "", ""}}); + //hintTable[BOMB_SHOP_ITEM_3] = HintText::Sometimes({Text{"a town merchant", "", ""}}); +//Woodfall + hintTable[WOODFALL_BRIDGE_CHEST] = HintText::Sometimes({Text{"a swamp chest contains", "", ""}}); + hintTable[WOODFALL_BEHIND_OWL_CHEST] = HintText::Sometimes({Text{"a swamp chest contains", "", ""}}); + hintTable[ENTRANCE_TO_WOODFALL_CHEST] = HintText::Sometimes({Text{"a swamp chest contains", "", ""}}); + hintTable[WOODFALL_GREAT_FAIRY] = HintText::Sometimes({Text{"the fairy of wisdom rewards", "", ""}}); +//Zora Cape + hintTable[ZORA_CAPE_GREAT_FAIRY] = HintText::Sometimes({Text{"the fairy of courage rewards", "", ""}}); + hintTable[ZORA_CAPE_BEAVER_RACE_1] = HintText::Sometimes({Text{"a river dweller rewards", "", ""}}); + hintTable[ZORA_CAPE_BEAVER_RACE_2] = HintText::Sometimes({Text{"a river dweller rewards", "", ""}}); + hintTable[ZORA_CAPE_LIKE_LIKE] = HintText::Sometimes({Text{"a shield eater contains", "", ""}}); + hintTable[ZORA_CAPE_LEDGE_NO_TREE] = HintText::Sometimes({Text{"a high place contains", "", ""}}); + hintTable[ZORA_CAPE_LEDGE_WITH_TREE] = HintText::Sometimes({Text{"a high place contains", "", ""}}); + hintTable[ZORA_CAPE_GROTTO_CHEST] = HintText::Sometimes({Text{"a beach cave contains", "", ""}}); + hintTable[ZORA_CAPE_UNDERWATER_CHEST] = HintText::Sometimes({Text{"a sunken chest contains ", "", ""}}); +//Zora Hall + hintTable[ZORA_HALL_SCRUB_TRADE] = HintText::Sometimes({Text{"a western merchant trades", "", ""}}); + hintTable[ZORA_HALL_EVAN] = HintText::Sometimes({Text{"a musician rewards", "", ""}}); + hintTable[ZORA_HALL_LULU_ROOM_LEDGE] = HintText::Sometimes({Text{"the singer's room contains", "", ""}}); + hintTable[ZORA_HALL_SCRUB_PURCHASE] = HintText::Sometimes({Text{"a western merchant sells", "", ""}}); + //hintTable[ZORA_HALL_STAGE_LIGHTS] = HintText::Sometimes({Text{"a fan", "", ""}}); + //hintTable[ZORA_HALL_BAD_PHOTO_LULU] = HintText::Sometimes({Text{"a fan", "", ""}}); + //hintTable[ZORA_HALL_GOOD_PHOTO_LULU] = HintText::Sometimes({Text{"a fan", "", ""}}); + hintTable[ZORA_SHOP_ITEM_1] = HintText::Sometimes({Text{"a zora merchant sells", "", ""}}); + hintTable[ZORA_SHOP_ITEM_2] = HintText::Sometimes({Text{"a zora merchant sells", "", ""}}); + hintTable[ZORA_SHOP_ITEM_3] = HintText::Sometimes({Text{"a zora merchant sells", "", ""}}); + + /*------------------------- + | DUNGEON LOCATION TEXT | + -------------------------*/ + + hintTable[WOODFALL_TEMPLE_HEROS_BOW_CHEST] = HintText::Exclude({Text{"the sleeping temple contains", "", ""}}); + hintTable[WOODFALL_TEMPLE_MAP_CHEST] = HintText::Exclude({Text{"the sleeping temple contains", "", ""}}); + hintTable[WOODFALL_TEMPLE_COMPASS_CHEST] = HintText::Exclude({Text{"the sleeping temple contains", "", ""}}); + hintTable[WOODFALL_TEMPLE_BOSS_KEY_CHEST] = HintText::Exclude({Text{"the sleeping temple contains", "", ""}}); + hintTable[WOODFALL_TEMPLE_SMALL_KEY_CHEST] = HintText::Exclude({Text{"the sleeping temple contains", "", ""}}); + hintTable[WOODFALL_TEMPLE_DEKU_PRINCESS] = HintText::Exclude({Text{"the sleeping temple rewards", "", ""}}); + hintTable[WF_SF_ENTRANCE_FAIRY] = HintText::Exclude({Text{"a lost fairy is", "", ""}}); + hintTable[WF_SF_ENTRANCE_PLATFORM] = HintText::Exclude({Text{"a lost fairy is", "", ""}}); + hintTable[WF_SF_MAIN_ROOM_BUBBLE] = HintText::Exclude({Text{"a lost fairy is", "", ""}}); + hintTable[WF_SF_MAIN_ROOM_SWITCH] = HintText::Exclude({Text{"a lost fairy is", "", ""}}); + hintTable[WF_SF_PRE_BOSS_LOWER_RIGHT_BUBBLE] = HintText::Exclude({Text{"a lost fairy is", "", ""}}); + hintTable[WF_SF_PRE_BOSS_UPPER_RIGHT_BUBBLE] = HintText::Exclude({Text{"a lost fairy is", "", ""}}); + hintTable[WF_SF_PRE_BOSS_UPPER_LEFT_BUBBLE] = HintText::Exclude({Text{"a lost fairy is", "", ""}}); + hintTable[WF_SF_PRE_BOSS_PILLAR_BUBBLE] = HintText::Exclude({Text{"a lost fairy is", "", ""}}); + hintTable[WF_SF_DEKU_BABA] = HintText::Exclude({Text{"a lost fairy is", "", ""}}); + hintTable[WF_SF_DRAGONFLY_ROOM_BUBBLE] = HintText::Exclude({Text{"a lost fairy is", "", ""}}); + hintTable[WF_SF_SKULLTULA] = HintText::Exclude({Text{"a lost fairy is", "", ""}}); + hintTable[WF_SF_DARK_ROOM] = HintText::Exclude({Text{"a lost fairy is", "", ""}}); + hintTable[WF_SF_JAR_FAIRY] = HintText::Exclude({Text{"a lost fairy is", "", ""}}); + hintTable[WF_SF_BRIDGE_ROOM_BEEHIVE] = HintText::Exclude({Text{"a lost fairy is", "", ""}}); + hintTable[WF_SF_PLATFORM_ROOM_BEEHIVE] = HintText::Exclude({Text{"a lost fairy is", "", ""}}); + hintTable[ODOLWA_HEART_CONTAINER] = HintText::Exclude({Text{"a masked evil contains", "", ""}}); +//Snowhead Temple + hintTable[SNOWHEAD_TEMPLE_FIRE_ARROW_CHEST] = HintText::Exclude({Text{"an icy temple contains", "", ""}}); + hintTable[SNOWHEAD_TEMPLE_MAP_CHEST] = HintText::Exclude({Text{"an icy temple contains", "", ""}}); + hintTable[SNOWHEAD_TEMPLE_COMPASS_CHEST] = HintText::Exclude({Text{"an icy temple contains", "", ""}}); + hintTable[SNOWHEAD_TEMPLE_BOSS_KEY_CHEST] = HintText::Exclude({Text{"an icy temple contains", "", ""}}); + hintTable[SNOWHEAD_TEMPLE_BLOCK_ROOM_CHEST] = HintText::Exclude({Text{"an icy temple contains", "", ""}}); + hintTable[SNOWHEAD_TEMPLE_ICICLE_ROOM_CHEST] = HintText::Exclude({Text{"an icy temple contains", "", ""}}); + hintTable[SNOWHEAD_TEMPLE_BRIDGE_ROOM_CHEST] = HintText::Exclude({Text{"an icy temple contains", "", ""}}); + hintTable[SH_SF_SNOW_ROOM_BUBBLE] = HintText::Exclude({Text{"a lost fairy is", "", ""}}); + hintTable[SH_SF_CEILING_BUBBLE] = HintText::Exclude({Text{"a lost fairy is", "", ""}}); + hintTable[SH_SF_DINOLFOS_1] = HintText::Exclude({Text{"a lost fairy is", "", ""}}); + hintTable[SH_SF_DINOLFOS_2] = HintText::Exclude({Text{"a lost fairy is", "", ""}}); + hintTable[SH_SF_BRIDGE_ROOM_LEDGE_BUBBLE] = HintText::Exclude({Text{"a lost fairy is", "", ""}}); + hintTable[SH_SF_BRIDGE_ROOM_PILLAR_BUBBLE] = HintText::Exclude({Text{"a lost fairy is", "", ""}}); + hintTable[SH_SF_MAP_ROOM_FAIRY] = HintText::Exclude({Text{"a lost fairy is", "", ""}}); + hintTable[SH_SF_MAP_ROOM_LEDGE] = HintText::Exclude({Text{"a lost fairy is", "", ""}}); + hintTable[SH_SF_BASEMENT] = HintText::Exclude({Text{"a lost fairy is", "", ""}}); + hintTable[SH_SF_TWIN_BLOCK] = HintText::Exclude({Text{"a lost fairy is", "", ""}}); + hintTable[SH_SF_ICICLE_ROOM_WALL] = HintText::Exclude({Text{"a lost fairy is", "", ""}}); + hintTable[SH_SF_MAIN_ROOM_WALL] = HintText::Exclude({Text{"a lost fairy is", "", ""}}); + hintTable[SH_SF_PILLAR_FREEZARDS] = HintText::Exclude({Text{"a lost fairy is", "", ""}}); + hintTable[SH_SF_ICE_PUZZLE] = HintText::Exclude({Text{"a lost fairy is", "", ""}}); + hintTable[SH_SF_CRATE] = HintText::Exclude({Text{"a lost fairy is", "", ""}}); + hintTable[GOHT_HEART_CONTAINER] = HintText::Exclude({Text{"a masked evil contains", "", ""}}); +//Great bay Temple + hintTable[GBT_ICE_ARROW_CHEST] = HintText::Exclude({Text{"the murky watered temple contains", "", ""}}); + hintTable[GBT_MAP_CHEST] = HintText::Exclude({Text{"the murky watered temple contains", "", ""}}); + hintTable[GBT_COMPASS_CHEST] = HintText::Exclude({Text{"the murky watered temple contains", "", ""}}); + hintTable[GBT_BOSS_KEY_CHEST] = HintText::Exclude({Text{"the murky watered temple contains", "", ""}}); + hintTable[GBT_SMALL_KEY_CHEST] = HintText::Exclude({Text{"the murky watered temple contains", "", ""}}); + hintTable[GBT_SF_SKULLTULA] = HintText::Exclude({Text{"a lost fairy is", "", ""}}); + hintTable[GBT_SF_WATER_CONTROL_UNDERWATER_BUBBLE] = HintText::Exclude({Text{"a lost fairy is", "", ""}}); + hintTable[GBT_SF_WATERWHEEL_ROOM_LOWER] = HintText::Exclude({Text{"a lost fairy is", "", ""}}); + hintTable[GBT_SF_WATERWHEEL_ROOM_UPPER] = HintText::Exclude({Text{"a lost fairy is", "", ""}}); + hintTable[GBT_SF_GREEN_VALVE] = HintText::Exclude({Text{"a lost fairy is", "", ""}}); + hintTable[GBT_SF_SEESAW_ROOM] = HintText::Exclude({Text{"a lost fairy is", "", ""}}); + hintTable[GBT_SF_ENTRANCE_TORCHES] = HintText::Exclude({Text{"a lost fairy is", "", ""}}); + hintTable[GBT_SF_BIO_BABAS] = HintText::Exclude({Text{"a lost fairy is", "", ""}}); + hintTable[GBT_SF_UNDERWATER_BARREL] = HintText::Exclude({Text{"a lost fairy is", "", ""}}); + hintTable[GBT_SF_WHIRLPOOL_BARREL] = HintText::Exclude({Text{"a lost fairy is", "", ""}}); + hintTable[GBT_SF_WHIRLPOOL_JAR] = HintText::Exclude({Text{"a lost fairy is", "", ""}}); + hintTable[GBT_SF_DEXIHANDS_JAR] = HintText::Exclude({Text{"a lost fairy is", "", ""}}); + hintTable[GBT_SF_LEDGE_JAR] = HintText::Exclude({Text{"a lost fairy is", "", ""}}); + hintTable[GBT_SF_PRE_BOSS_ROOM_BUBBLE] = HintText::Exclude({Text{"a lost fairy is", "", ""}}); + hintTable[GBT_SF_PRE_BOSS_ROOM_UNDERWATER_BUBBLE] = HintText::Exclude({Text{"a lost fairy is", "", ""}}); + hintTable[GYORG_HEART_CONTAINER] = HintText::Exclude({Text{"a masked evil contains", "", ""}}); +//Stone Tower Temple + hintTable[STONE_TOWER_TEMPLE_MAP_CHEST] = HintText::Exclude({Text{"a rocky temple contains", "", ""}}); + hintTable[STONE_TOWER_TEMPLE_COMPASS_CHEST] = HintText::Exclude({Text{"a rocky temple contains", "", ""}}); + hintTable[STONE_TOWER_TEMPLE_BOSS_KEY_CHEST] = HintText::Exclude({Text{"a rocky temple contains", "", ""}}); + hintTable[STONE_TOWER_TEMPLE_ARMOS_ROOM_CHEST] = HintText::Exclude({Text{"a rocky temple contains", "", ""}}); + hintTable[STONE_TOWER_TEMPLE_BRIDGE_SWITCH_CHEST] = HintText::Exclude({Text{"a rocky temple contains", "", ""}}); + hintTable[STONE_TOWER_TEMPLE_UPDRAFT_ROOM_CHEST] = HintText::Exclude({Text{"a rocky temple contains", "", ""}}); + hintTable[STONE_TOWER_TEMPLE_DEATH_ARMOS_ROOM_CHEST] = HintText::Exclude({Text{"a rocky temple contains", "", ""}}); + hintTable[STONE_TOWER_TEMPLE_LIGHT_ARROW_CHEST] = HintText::Exclude({Text{"a rocky temple contains", "", ""}}); + hintTable[STONE_TOWER_TEMPLE_GIANTS_MASK_CHEST] = HintText::Exclude({Text{"a rocky temple contains", "", ""}}); + hintTable[ST_SF_MIRROR_SUN_BLOCK] = HintText::Exclude({Text{"a lost fairy is", "", ""}}); + hintTable[ST_SF_LAVA_ROOM_LEDGE] = HintText::Exclude({Text{"a lost fairy is", "", ""}}); + hintTable[ST_SF_LAVA_ROOM_FIRE_RING] = HintText::Exclude({Text{"a lost fairy is", "", ""}}); + hintTable[ST_SF_EYEGORE] = HintText::Exclude({Text{"a lost fairy is", "", ""}}); + hintTable[ST_SF_UPDRAFT_FIRE_RING] = HintText::Exclude({Text{"a lost fairy is", "", ""}}); + hintTable[ST_SF_MIRROR_SUN_SWITCH] = HintText::Exclude({Text{"a lost fairy is", "", ""}}); + hintTable[ST_SF_BOSS_WARP] = HintText::Exclude({Text{"a lost fairy is", "", ""}}); + hintTable[ST_SF_WIZZROBE] = HintText::Exclude({Text{"a lost fairy is", "", ""}}); + hintTable[ST_SF_DEATH_ARMOS] = HintText::Exclude({Text{"a lost fairy is", "", ""}}); + hintTable[ST_SF_UPDRAFT_FROZEN_EYE] = HintText::Exclude({Text{"a lost fairy is", "", ""}}); + hintTable[ST_SF_THIN_BRIDGE] = HintText::Exclude({Text{"a lost fairy is", "", ""}}); + hintTable[ST_SF_BASEMENT_LEDGE] = HintText::Exclude({Text{"a lost fairy is", "", ""}}); + hintTable[ST_SF_STATUE_EYE] = HintText::Exclude({Text{"a lost fairy is", "", ""}}); + hintTable[ST_SF_UNDERWATER] = HintText::Exclude({Text{"a lost fairy is", "", ""}}); + hintTable[ST_SF_BRIDGE_CRYSTAL] = HintText::Exclude({Text{"a lost fairy is", "", ""}}); + hintTable[TWINMOLD_HEART_CONTAINER] = HintText::Exclude({Text{"a masked evil contains", "", ""}}); +//Pirate Fortress + hintTable[PF_INTERIOR_HOOKSHOT_CHEST] = HintText::Exclude({Text{"the home of pirates contains", "", ""}}); + hintTable[PF_INT_LOWER_CHEST] = HintText::Exclude({Text{"the home of pirates contains", "", ""}}); + hintTable[PF_INT_UPPER_CHEST] = HintText::Exclude({Text{"the home of pirates contains", "", ""}}); + hintTable[PF_INT_TANK_CHEST] = HintText::Exclude({Text{"the home of pirates contains", "", ""}}); + hintTable[PF_INT_GUARD_ROOM_CHEST] = HintText::Exclude({Text{"the home of pirates contains", "", ""}}); + hintTable[PF_CAGE_ROOM_SHALLOW_CHEST] = HintText::Exclude({Text{"the home of pirates contains", "", ""}}); + hintTable[PF_CAGE_ROOM_DEEP_CHEST] = HintText::Exclude({Text{"the home of pirates contains", "", ""}}); + hintTable[PF_MAZE_CHEST] = HintText::Exclude({Text{"the home of pirates contains", "", ""}}); + hintTable[PF_SEWER_CAGE] = HintText::Exclude({Text{"the home of pirates contains", "", ""}}); + hintTable[PF_EXTERIOR_LOG_CHEST] = HintText::Exclude({Text{"the home of pirates contains", "", ""}}); + hintTable[PF_EXTERIOR_SAND_CHEST] = HintText::Exclude({Text{"the home of pirates contains", "", ""}}); + hintTable[PF_EXTERIOR_CORNER_CHEST] = HintText::Exclude({Text{"the home of pirates contains", "", ""}}); + hintTable[PF_INT_INVISIBLE_SOLDIER] = HintText::Exclude({Text{"the home of pirates contains", "", ""}}); + hintTable[PF_INT_HOOKSHOT_ROOM_ZORA_EGG] = HintText::Exclude({Text{"in the home of pirates rests", "", ""}}); + hintTable[PF_INT_GUARD_ROOM_ZORA_EGG] = HintText::Exclude({Text{"in the home of pirates rests", "", ""}}); + hintTable[PF_INT_BARREL_MAZE_ZORA_EGG] = HintText::Exclude({Text{"in the home of pirates rests", "", ""}}); + hintTable[PF_INT_LAVA_ROOM_ZORA_EGG] = HintText::Exclude({Text{"in the home of pirates rests", "", ""}}); +//Beneath the Well + hintTable[BENEATH_THE_WELL_MIRROR_SHIELD_CHEST] = HintText::Exclude({Text{"a frightful exchange contains", "", ""}}); + hintTable[WELL_LEFT_PATH_CHEST] = HintText::Exclude({Text{"a frightful exchange contains", "", ""}}); + hintTable[WELL_RIGHT_PATH_CHEST] = HintText::Exclude({Text{"a frightful exchange contains", "", ""}}); + hintTable[BENEATH_THE_WELL_COW] = HintText::Exclude({Text{"a lost creature contains", "", ""}}); +//Ikana Castle + hintTable[IKANA_CASTLE_PILLAR] = HintText::Exclude({Text{"a fiery pilar contains", "", ""}}); + hintTable[IKANA_CASTLE_IKANA_KING] = HintText::Exclude({Text{"a fallen king teaches", "", ""}}); +//Secret Shrine + hintTable[SECRET_SHRINE_DINOLFOS_CHEST] = HintText::Exclude({Text{"a secret place contains", "", ""}}); + hintTable[SECRET_SHRINE_WIZZROBE_CHEST] = HintText::Exclude({Text{"a secret place contains", "", ""}}); + hintTable[SECRET_SHRINE_WART_CHEST] = HintText::Exclude({Text{"a secret place contains", "", ""}}); + hintTable[SECRET_SHRINE_GARO_CHEST] = HintText::Exclude({Text{"a secret place contains", "", ""}}); + hintTable[SECRET_SHRINE_FINAL_CHEST] = HintText::Exclude({Text{"a secret place contains", "", ""}}); +//The Moon + hintTable[THE_MOON_DEKU_TRIAL_BONUS] = HintText::Exclude({Text{"a masked child's game contains", "", ""}}); + hintTable[THE_MOON_GORON_TRIAL_BONUS] = HintText::Exclude({Text{"a masked child's game contains", "", ""}}); + hintTable[THE_MOON_ZORA_TRIAL_BONUS] = HintText::Exclude({Text{"a masked child's game contains", "", ""}}); + hintTable[THE_MOON_LINK_TRIAL_BONUS] = HintText::Exclude({Text{"a masked child's game contains", "", ""}}); + hintTable[THE_MOON_GARO_CHEST] = HintText::Exclude({Text{"a masked child's game contains", "", ""}}); + hintTable[THE_MOON_IRON_KNUCKLE_CHEST] = HintText::Exclude({Text{"a masked child's game contains", "", ""}}); + hintTable[THE_MOON_MAJORA_CHILD] = HintText::Exclude({Text{"the lonely child rewards", "", ""}}); +//Southern Swamp Skulltula House + hintTable[SSH_MAIN_ROOM_NEAR_CEILING] = HintText::Exclude({Text{"a gold spider is", "", ""}}); + hintTable[SSH_MAIN_ROOM_WATER] = HintText::Exclude({Text{"a gold spider is", "", ""}}); + hintTable[SSH_MAIN_ROOM_LOWER_LEFT_SOIL] = HintText::Exclude({Text{"a gold spider is", "", ""}}); + hintTable[SSH_MAIN_ROOM_LOWER_RIGHT_SOIL] = HintText::Exclude({Text{"a gold spider is", "", ""}}); + hintTable[SSH_MAIN_ROOM_UPPER_SOIL] = HintText::Exclude({Text{"a gold spider is", "", ""}}); + hintTable[SSH_MAIN_ROOM_PILLAR] = HintText::Exclude({Text{"a gold spider is", "", ""}}); + hintTable[SSH_MAIN_ROOM_UPPER_PILLAR] = HintText::Exclude({Text{"a gold spider is", "", ""}}); + hintTable[SSH_MAIN_ROOM_JAR] = HintText::Exclude({Text{"a gold spider is", "", ""}}); + hintTable[SSH_MONUMENT_ROOM_CRATE_1] = HintText::Exclude({Text{"a gold spider is", "", ""}}); + hintTable[SSH_MONUMENT_ROOM_CRATE_2] = HintText::Exclude({Text{"a gold spider is", "", ""}}); + hintTable[SSH_MONUMENT_ROOM_TORCH] = HintText::Exclude({Text{"a gold spider is", "", ""}}); + hintTable[SSH_MONUMENT_ROOM_ON_MONUMENT] = HintText::Exclude({Text{"a gold spider is", "", ""}}); + hintTable[SSH_MONUMENT_ROOM_LOWER_WALL] = HintText::Exclude({Text{"a gold spider is", "", ""}}); + hintTable[SSH_GOLD_ROOM_NEAR_CEILING] = HintText::Exclude({Text{"a gold spider is", "", ""}}); + hintTable[SSH_GOLD_ROOM_PILLAR] = HintText::Exclude({Text{"a gold spider is", "", ""}}); + hintTable[SSH_GOLD_ROOM_BEEHIVE] = HintText::Exclude({Text{"a gold spider is", "", ""}}); + hintTable[SSH_GOLD_ROOM_WALL] = HintText::Exclude({Text{"a gold spider is", "", ""}}); + hintTable[SSH_POT_ROOM_JAR] = HintText::Exclude({Text{"a gold spider is", "", ""}}); + hintTable[SSH_POT_ROOM_POT_1] = HintText::Exclude({Text{"a gold spider is", "", ""}}); + hintTable[SSH_POT_ROOM_POT_2] = HintText::Exclude({Text{"a gold spider is", "", ""}}); + hintTable[SSH_POT_ROOM_BEHIND_VINES] = HintText::Exclude({Text{"a gold spider is", "", ""}}); + hintTable[SSH_POT_ROOM_WALL] = HintText::Exclude({Text{"a gold spider is", "", ""}}); + hintTable[SSH_POT_ROOM_BEEHIVE_1] = HintText::Exclude({Text{"a gold spider is", "", ""}}); + hintTable[SSH_POT_ROOM_BEEHIVE_2] = HintText::Exclude({Text{"a gold spider is", "", ""}}); + hintTable[SSH_TREE_ROOM_TREE_1] = HintText::Exclude({Text{"a gold spider is", "", ""}}); + hintTable[SSH_TREE_ROOM_TREE_2] = HintText::Exclude({Text{"a gold spider is", "", ""}}); + hintTable[SSH_TREE_ROOM_TREE_3] = HintText::Exclude({Text{"a gold spider is", "", ""}}); + hintTable[SSH_TREE_ROOM_GRASS_1] = HintText::Exclude({Text{"a gold spider is", "", ""}}); + hintTable[SSH_TREE_ROOM_GRASS_2] = HintText::Exclude({Text{"a gold spider is", "", ""}}); + hintTable[SSH_TREE_ROOM_BEEHIVE] = HintText::Exclude({Text{"a gold spider is", "", ""}}); +//Oceanside spider House + hintTable[OSH_ENTRANCE_LEFT_WALL] = HintText::Exclude({Text{"a gold spider is", "", ""}}); + hintTable[OSH_ENTRANCE_RIGHT_WALL] = HintText::Exclude({Text{"a gold spider is", "", ""}}); + hintTable[OSH_ENTRANCE_WEB] = HintText::Exclude({Text{"a gold spider is", "", ""}}); + hintTable[OSH_LIBRARY_HOLE_BEHIND_PICTURE] = HintText::Exclude({Text{"a gold spider is", "", ""}}); + hintTable[OSH_LIBRARY_HOLE_BEHIND_CABINET] = HintText::Exclude({Text{"a gold spider is", "", ""}}); + hintTable[OSH_LIBRARY_ON_CORNER_BOOKSHELF] = HintText::Exclude({Text{"a gold spider is", "", ""}}); + hintTable[OSH_LIBRARY_CEILING_EDGE] = HintText::Exclude({Text{"a gold spider is", "", ""}}); + hintTable[OSH_LIBRARY_BEHIND_BOOKCASE_1] = HintText::Exclude({Text{"a gold spider is", "", ""}}); + hintTable[OSH_LIBRARY_BEHIND_BOOKCASE_2] = HintText::Exclude({Text{"a gold spider is", "", ""}}); + hintTable[OSH_LIBRARY_BEHIND_PICTURE] = HintText::Exclude({Text{"a gold spider is", "", ""}}); + hintTable[OSH_SECOND_ROOM_CEILING_EDGE] = HintText::Exclude({Text{"a gold spider is", "", ""}}); + hintTable[OSH_SECOND_ROOM_CEILING_PLANK] = HintText::Exclude({Text{"a gold spider is", "", ""}}); + hintTable[OSH_SECOND_ROOM_JAR] = HintText::Exclude({Text{"a gold spider is", "", ""}}); + hintTable[OSH_SECOND_ROOM_WEBBED_HOLE] = HintText::Exclude({Text{"a gold spider is", "", ""}}); + hintTable[OSH_SECOND_ROOM_WEBBED_POT] = HintText::Exclude({Text{"a gold spider is", "", ""}}); + hintTable[OSH_SECOND_ROOM_UPPER_POT] = HintText::Exclude({Text{"a gold spider is", "", ""}}); + hintTable[OSH_SECOND_ROOM_BEHIND_SKULL_1] = HintText::Exclude({Text{"a gold spider is", "", ""}}); + hintTable[OSH_SECOND_ROOM_BEHIND_SKULL_2] = HintText::Exclude({Text{"a gold spider is", "", ""}}); + hintTable[OSH_SECOND_ROOM_LOWER_POT] = HintText::Exclude({Text{"a gold spider is", "", ""}}); + hintTable[OSH_STORAGE_ROOM_CEILING_WEB] = HintText::Exclude({Text{"a gold spider is", "", ""}}); + hintTable[OSH_STORAGE_ROOM_BEHIND_CRATE] = HintText::Exclude({Text{"a gold spider is", "", ""}}); + hintTable[OSH_STORAGE_ROOM_WALL] = HintText::Exclude({Text{"a gold spider is", "", ""}}); + hintTable[OSH_STORAGE_ROOM_CRATE] = HintText::Exclude({Text{"a gold spider is", "", ""}}); + hintTable[OSH_STORAGE_ROOM_BARREL] = HintText::Exclude({Text{"a gold spider is", "", ""}}); + hintTable[OSH_COLORED_SKULLS_CEILING_EDGE] = HintText::Exclude({Text{"a gold spider is", "", ""}}); + hintTable[OSH_COLORED_SKULLS_CHANDELIER_1] = HintText::Exclude({Text{"a gold spider is", "", ""}}); + hintTable[OSH_COLORED_SKULLS_CHANDELIER_2] = HintText::Exclude({Text{"a gold spider is", "", ""}}); + hintTable[OSH_COLORED_SKULLS_CHANDELIER_3] = HintText::Exclude({Text{"a gold spider is", "", ""}}); + hintTable[OSH_COLORED_SKULLS_BEHIND_PICTURE] = HintText::Exclude({Text{"a gold spider is", "", ""}}); + hintTable[OSH_COLORED_SKULLS_POT] = HintText::Exclude({Text{"a gold spider is", "", ""}}); + + + /*---------------------- + | REGTION HINT TEXT | + ----------------------*/ + hintTable[N_CLOCK_TOWN] = HintText::Region({ Text{"N Clock Town", "", ""}}); + hintTable[CLOCK_TOWN_FAIRY_FOUNTAIN] = HintText::Region({Text{"Clock Town Fairy Fountain", "", ""}}); + hintTable[CLOCK_TOWN_DEKU_PLAYGROUND] = HintText::Region({Text{"Deku Playground", "", ""}}); + hintTable[E_CLOCK_TOWN] = HintText::Region({Text{"E Clock Town", "", ""}}); + hintTable[STOCKPOTINN] = HintText::Region({Text{"Stock Pot Inn", "", ""}}); + hintTable[STOCKPOTINN_GUEST_ROOM] = HintText::Region({Text{"Stock Pot Inn", "", ""}}); + hintTable[STOCKPOTINN_STAFF_ROOM] = HintText::Region({Text{"Stock Pot Inn", "", ""}}); + hintTable[STOCKPOTINN_GRANDMA_ROOM] = HintText::Region({Text{"Stock Pot Inn", "", ""}}); + hintTable[CLOCK_TOWN_OBSERVATORY] = HintText::Region({Text{"Observatory", "", ""}}); + hintTable[CLOCK_TOWN_BAR] = HintText::Region({Text{"Milk Bar", "", ""}}); + hintTable[CLOCK_TOWN_HONEY_DARLING] = HintText::Region({Text{"E Clock Town", "", ""}}); + hintTable[CLOCK_TOWN_TREASURE_CHEST_GAME] = HintText::Region({Text{"E Clock Town", "", ""}}); + hintTable[CLOCK_TOWN_ARCHERY] = HintText::Region({Text{"E Clock Town", "", ""}}); + hintTable[CLOCK_TOWN_MAYOR_HOUSE] = HintText::Region({Text{"E Clock Town", "", ""}}); + hintTable[W_CLOCK_TOWN] = HintText::Region({Text{"W Clock Town", "", ""}}); + hintTable[CLOCK_TOWN_SWORDSMANS_SCHOOL] = HintText::Region({Text{"W Clock Town", "", ""}}); + hintTable[CLOCK_TOWN_POSTMAN_HOUSE] = HintText::Region({Text{"W Clock Town", "", ""}}); + hintTable[CLOCK_TOWN_LOTTERY] = HintText::Region({Text{"W Clock Town", "", ""}}); + hintTable[CLOCK_TOWN_BOMB_SHOP] = HintText::Region({Text{"W Clock Town", "", ""}}); + hintTable[CLOCK_TOWN_TRADING_POST] = HintText::Region({Text{"W Clock Town", "", ""}}); + hintTable[CLOCK_TOWN_CURIOSITY_SHOP] = HintText::Region({Text{"W Clock Town", "", ""}}); + hintTable[S_CLOCK_TOWN] = HintText::Region({Text{"S Clock Town", "", ""}}); + hintTable[CLOCK_TOWER] = HintText::Region({Text{"Clock Tower", "", ""}}); + hintTable[CLOCK_TOWER_ROOF] = HintText::Region({Text{"Clock Tower Roof", "", ""}}); + hintTable[LAUNDRY_POOL] = HintText::Region({Text{"Laundry Pool", "", ""}}); + hintTable[LAUNDRY_POOL_KAFEI_HIDEOUT] = HintText::Region({Text{"Laundry Pool", "", ""}}); + hintTable[TERMINA_FIELD] = HintText::Region({Text{"Termina Field", "", ""}}); + hintTable[TERMINA_FIELD_PEAHAT_GROTTO] = HintText::Region({Text{"Termina Field", "", ""}}); + hintTable[TERMINA_FIELD_DODONGO_GROTTO] = HintText::Region({Text{"Termina Field", "", ""}}); + hintTable[TERMINA_FIELD_BIO_BABA_GROTTO] = HintText::Region({Text{"Termina Field", "", ""}}); + hintTable[TERMINA_FIELD_PILLAR_GROTTO] = HintText::Region({Text{"Termina Field", "", ""}}); + hintTable[TERMINA_FIELD_GRASS_GROTTO] = HintText::Region({Text{"Termina Field", "", ""}}); + hintTable[TERMINA_FIELD_BUSINESS_SCRUB_GROTTO] = HintText::Region({Text{"Termina Field", "", ""}}); + hintTable[TERMINA_FIELD_COW_GROTTO] = HintText::Region({Text{"Termina Field", "", ""}}); + hintTable[TERMINA_FIELD_GOSSIP_STONES_GROTTO] = HintText::Region({Text{"Termina Field", "", ""}}); + hintTable[ROAD_TO_SOUTHERN_SWAMP] = HintText::Region({Text{"Road to Southern Swamp", "", ""}}); + hintTable[ROAD_TO_SOUTHERN_SWAMP_ARCHERY] = HintText::Region({Text{"Road to Southern Swamp", "", ""}}); + hintTable[ROAD_TO_SWAMP_GROTTO] = HintText::Region({Text{"Road to Southern Swamp", "", ""}}); + hintTable[SOUTHERN_SWAMP] = HintText::Region({Text{"Southern Swamp", "", ""}}); + hintTable[SWAMP_TOURIST_CENTER] = HintText::Region({Text{"Southern Swamp", "", ""}}); + hintTable[SOUTHERN_SWAMP_HAGS_POTION_SHOP] = HintText::Region({Text{"Southern Swamp", "", ""}}); + hintTable[MYSTERY_WOODS] = HintText::Region({Text{"Mystery Woods", "", ""}}); + hintTable[SOUTHERN_SWAMP_MYSTERY_WOODS_GROTTO] = HintText::Region({Text{"Mystery Woods", "", ""}}); + hintTable[SOUTHERN_SWAMP_NEAR_SPIDER_HOUSE_GROTTO] = HintText::Region({Text{"Southern Swamp", "", ""}}); + hintTable[SOUTHERN_SWAMP_TOP] = HintText::Region({Text{"Southern Swamp", "", ""}}); + hintTable[DEKU_PALACE] = HintText::Region({Text{"Deku Palace", "", ""}}); + hintTable[DEKU_PALACE_INTERIOR] = HintText::Region({Text{"Deku Palace", "", ""}}); + hintTable[DEKU_PALACE_BEAN_GROTTO] = HintText::Region({Text{"Deku Palace", "", ""}}); + hintTable[DEKU_SHRINE] = HintText::Region({Text{"Deku Palace", "", ""}}); + hintTable[WOODFALL] = HintText::Region({Text{"Woodfall", "", ""}}); + hintTable[WOODFALL_FAIRY_FOUNTAIN] = HintText::Region({Text{"Woodfall Fairy Foutain", "", ""}}); + hintTable[PATH_TO_MOUNTAIN_VILLAGE] = HintText::Region({Text{"Path to Mountain Vilage", "", ""}}); + hintTable[MOUNTAIN_VILLAGE] = HintText::Region({Text{"Mountain Village", "", ""}}); + hintTable[GORON_GRAVEYARD] = HintText::Region({Text{"Goron Graveyard", "", ""}}); + hintTable[MOUNTAIN_SMITHY] = HintText::Region({Text{"Mountain Village", "", ""}}); + hintTable[MOUNTAIN_VILLAGE_SPRING_WATER_GROTTO] = HintText::Region({Text{"Mountain Village", "", ""}}); + hintTable[TWIN_ISLANDS] = HintText::Region({Text{"Twin Islands", "", ""}}); + hintTable[GORON_RACETRACK] = HintText::Region({Text{"Goron Racetrack", "", ""}}); + hintTable[TWIN_ISLANDS_GORON_RACETRACK_GROTTO] = HintText::Region({Text{"Twin Islands", "", ""}}); + hintTable[TWIN_ISLANDS_SPRING_WATER_GROTTO] = HintText::Region({Text{"Twin Islands", "", ""}}); + hintTable[GORON_VILLAGE] = HintText::Region({Text{"Goron Village", "", ""}}); + hintTable[GORON_VILLAGE_LENS_CAVE] = HintText::Region({Text{"Goron Village", "", ""}}); + hintTable[GORON_VILLAGE_INTERIOR] = HintText::Region({Text{"Goron Village", "", ""}}); + hintTable[GORON_VILLAGE_SHOP] = HintText::Region({Text{"Goron Village", "", ""}}); + hintTable[ROAD_TO_SNOWHEAD] = HintText::Region({Text{"Road to Snowhead", "", ""}}); + hintTable[ROAD_TO_SNOWHEAD_GROTTO] = HintText::Region({Text{"Road to Snowhead", "", ""}}); + hintTable[SNOWHEAD] = HintText::Region({Text{"Snowhead", "", ""}}); + hintTable[SNOWHEAD_FAIRY_FOUNTAIN] = HintText::Region({Text{"Snowhead Fairy Fountain", "", ""}}); + hintTable[MILK_ROAD] = HintText::Region({Text{"Milk Road", "", ""}}); + hintTable[GORMAN_TRACK] = HintText::Region({Text{"Gorman Track", "", ""}}); + hintTable[ROMANI_RANCH] = HintText::Region({Text{"Romani Ranch", "", ""}}); + hintTable[DOGGY_RACETRACK] = HintText::Region({Text{"Romani Ranch", "", ""}}); + hintTable[CUCCO_SHACK] = HintText::Region({Text{"Romani Ranch", "", ""}}); + hintTable[ROMANI_RANCH_HOUSE] = HintText::Region({Text{"Romani Ranch", "", ""}}); + hintTable[ROMANI_RANCH_BARN] = HintText::Region({Text{"Romani Ranch", "", ""}}); + hintTable[GREAT_BAY_COAST] = HintText::Region({Text{"Great Bay Coast", "", ""}}); + hintTable[GREAT_BAY_COAST_MARINE_LAB] = HintText::Region({Text{"Great Bay Coast", "", ""}}); + hintTable[GREAT_BAY_COAST_GROTTO] = HintText::Region({Text{"Great Bay Coast", "", ""}}); + hintTable[GREAT_BAY_COAST_COW_GROTTO] = HintText::Region({Text{"Great Bay Coast", "", ""}}); + hintTable[FISHERMAN_HUT] = HintText::Region({Text{"Great Bay Coast", "", ""}}); + hintTable[PINNACLE_ROCK] = HintText::Region({Text{"Pinnacle Rock", "", ""}}); + hintTable[ZORA_CAPE] = HintText::Region({Text{"Zora Cape", "", ""}}); + hintTable[WATERFALL_RAPIDS] = HintText::Region({Text{"Zora Cape", "", ""}}); + hintTable[GREAT_BAY_FAIRY_FOUNTAIN] = HintText::Region({Text{"Zora Cape Fairy Fountain", "", ""}}); + hintTable[ZORA_CAPE_GROTTO] = HintText::Region({Text{"Zora Cape", "", ""}}); + hintTable[ZORA_HALL] = HintText::Region({Text{"Zora Hall", "", ""}}); + hintTable[ZORA_HALL_EVANS_ROOM] = HintText::Region({Text{"Zora Hall", "", ""}}); + hintTable[ZORA_HALL_LULUS_ROOM] = HintText::Region({Text{"Zora Hall", "", ""}}); + hintTable[ZORA_HALL_JAPAS_ROOM] = HintText::Region({Text{"Zora Hall", "", ""}}); + hintTable[ZORA_HALL_TIJOS_ROOM] = HintText::Region({Text{"Zora Hall", "", ""}}); + hintTable[ZORA_HALL_SHOP] = HintText::Region({Text{"Zora Hall", "", ""}}); + hintTable[ZORA_HALL_BACK_ENTRANCE] = HintText::Region({Text{"Zora Hall", "", ""}}); + hintTable[ROAD_TO_IKANA] = HintText::Region({Text{"Road to Ikana", "", ""}}); + hintTable[ROAD_TO_IKANA_GROTTO] = HintText::Region({Text{"Road to Ikana", "", ""}}); + hintTable[IKANA_GRAVEYARD] = HintText::Region({Text{"Ikana Graveyard", "", ""}}); + hintTable[IKANA_GRAVEYARD_GROTTO] = HintText::Region({Text{"Ikana Graveyard", "", ""}}); + hintTable[IKANA_GRAVEYARD_BELOW_GRAVE1] = HintText::Region({Text{"Ikana Graveyard", "", ""}}); + hintTable[IKANA_GRAVEYARD_BATS_ROOM] = HintText::Region({Text{"Ikana Graveyard", "", ""}}); + hintTable[IKANA_GRAVEYARD_TABLET_ROOM] = HintText::Region({Text{"Ikana Graveyard", "", ""}}); + hintTable[IKANA_GRAVEYARD_BELOW_GRAVE2] = HintText::Region({Text{"Ikana Graveyard", "", ""}}); + hintTable[IKANA_GRAVEYARD_PRE_IRON_KNUCKLE_ROOM] = HintText::Region({Text{"Ikana Graveyard", "", ""}}); + hintTable[IKANA_GRAVEYARD_IRON_KNUCKLE_ROOM] = HintText::Region({Text{"Ikana Graveyard", "", ""}}); + hintTable[IKANA_GRAVEYARD_BELOW_GRAVE3] = HintText::Region({Text{"Ikana Graveyard", "", ""}}); + hintTable[DAMPES_HUT] = HintText::Region({Text{"Ikana Graveyard", "", ""}}); + hintTable[IKANA_CANYON] = HintText::Region({Text{"Ikana Canyon", "", ""}}); + hintTable[IKANA_CANYON_UPPER] = HintText::Region({Text{"Ikana Canyon", "", ""}}); + hintTable[IKANA_CANYON_CAVE] = HintText::Region({Text{"Ikana Canyon", "", ""}}); + hintTable[SAKONS_HIDEOUT] = HintText::Region({Text{"Ikana Canyon", "", ""}}); + hintTable[MUSIC_BOX_HOUSE] = HintText::Region({Text{"Ikana Canyon", "", ""}}); + hintTable[IKANA_CANYON_POE_HUT] = HintText::Region({Text{"Ikana Canyon", "", ""}}); + hintTable[IKANA_CANYON_GREAT_FAIRY_FOUNTAIN] = HintText::Region({Text{"Ikana Canyon Fairy Foutain", "", ""}}); + hintTable[IKANA_CANYON_SECRET_SHRINE_GROTTO] = HintText::Region({Text{"Ikana Canyon", "", ""}}); + hintTable[STONE_TOWER] = HintText::Region({Text{"Stone Tower", "", ""}}); + hintTable[INVERTED_STONE_TOWER] = HintText::Region({Text{"Stone Tower", "", ""}}); + + /*--------------------- + | JUNK HINT TEXT | + ---------------------*/ + hintTable[JUNK01] = HintText::Junk({Text{"That's no moon.", "", ""}}); + hintTable[JUNK02] = HintText::Junk({Text{"The moon is haunted.", "", ""}}); + hintTable[JUNK03] = HintText::Junk({Text{"Majora has sick dance moves.", "", ""}}); + hintTable[JUNK04] = HintText::Junk({Text{"Making hints is hard.", "", ""}}); + hintTable[JUNK05] = HintText::Junk({Text{"May the way of the Hero lead to the Triforce.", "", ""}}); + hintTable[JUNK06] = HintText::Junk({Text{"They say that the final item you're looking for can be found somewhere in Termina.", "", ""}}); + hintTable[JUNK07] = HintText::Junk({Text{"They say that 85 percent of statistics are made up", "", ""}}); + hintTable[JUNK08] = HintText::Junk({Text{"They say the golden dog is picked as the winner most often", "", ""}}); + hintTable[JUNK09] = HintText::Junk({Text{"Be patient young grasshopper", "", ""}}); + hintTable[JUNK10] = HintText::Junk({Text{"The Ikana King used to be quite handsome", "", ""}}); + hintTable[JUNK11] = HintText::Junk({Text{"If the Goron Elder is frozen how does he move each day", "", ""}}); + hintTable[JUNK12] = HintText::Junk({Text{"The Owl's feathers lead the way", "", ""}}); + hintTable[JUNK13] = HintText::Junk({Text{"The Happy Mask Salesman doesn't sleep", "", ""}}); + hintTable[JUNK14] = HintText::Junk({Text{"why do they call it oven when you of in the cold food of out hot eat the food", "", ""}}); + hintTable[JUNK15] = HintText::Junk({Text{"It seems Link has difficulties remembering music without the help of a fairy.", "", ""}}); + hintTable[JUNK16] = HintText::Junk({Text{"Pickle.", "", ""}}); + hintTable[JUNK17] = HintText::Junk({Text{"Why is it called The Legend of Zelda Majora's Mask when Zelda isn't here?", "", ""}}); + hintTable[JUNK18] = HintText::Junk({Text{"They say you can find the Star Fox cast in your mask inventory screen.", "", ""}}); + hintTable[JUNK19] = HintText::Junk({Text{"They say #L# is Real 2401.", "", ""}}); + hintTable[JUNK20] = HintText::Junk({Text{"They say #The Moon# blinks if you stare long enough", "", ""}}); + hintTable[JUNK21] = HintText::Junk({Text{"They say bunnies have a really good sense of time.", "", ""}}); + hintTable[JUNK22] = HintText::Junk({Text{"They say this game has a method of infinitely jumping.", "", ""}}); + hintTable[JUNK23] = HintText::Junk({Text{"According to all known laws of aviation there is no way a Zora should be able to fly.", "", ""}}); + hintTable[JUNK24] = HintText::Junk({Text{"Why is Zelda green?", "", ""}}); + hintTable[JUNK25] = HintText::Junk({Text{"Did you know for the first time in 23 years, in 2023 Waluigi didn't star in a game?", "", ""}}); + hintTable[JUNK26] = HintText::Junk({Text{"Here's a hint, @. Don't be bad.", "", ""}}); + hintTable[JUNK27] = HintText::Junk({Text{"They say this randomizer actually took longer to develop than the original Majora's Mask.", "", ""}}); + hintTable[JUNK28] = HintText::Junk({Text{"They say pirates are allergic to #bees#.", "", ""}}); + hintTable[JUNK29] = HintText::Junk({Text{"Ocean man, take me by the hand.", "", ""}}); + hintTable[JUNK30] = HintText::Junk({Text{"Special shoutouts to ennopp who plays piano during this cutscene", "", ""}}); + hintTable[JUNK31] = HintText::Junk({Text{"Did you know it's actually surprisingly easy to mod a 3DS?", "", ""}}); + hintTable[JUNK32] = HintText::Junk({Text{"Zora eggs are quite delicious.", "", ""}}); + hintTable[JUNK33] = HintText::Junk({Text{"Zabora and Gabora have gotten better at making swords that stay sharp.", "", ""}}); + hintTable[JUNK34] = HintText::Junk({Text{"They say Tacoman369 has never defeated Majora.", "", ""}}); + hintTable[JUNK35] = HintText::Junk({Text{"L2P @.", "", ""}}); + hintTable[JUNK36] = HintText::Junk({Text{"They say the #Majora's Mask 3D Randomizer# developers are cool people.", "", ""}}); + hintTable[JUNK37] = HintText::Junk({Text{"Also try #Ocarina of Time 3D Randomizer#!", "", ""}}); + hintTable[JUNK38] = HintText::Junk({Text{"The single rupee is a unique item.", "", ""}}); + hintTable[JUNK39] = HintText::Junk({Text{"Hey, listen!", "", ""}}); + hintTable[JUNK40] = HintText::Junk({Text{"They say even the Hero of Time can't help everyone.", "", ""}}); + hintTable[JUNK41] = HintText::Junk({Text{"The dirt around here tastes really good.", "", ""}}); + hintTable[JUNK42] = HintText::Junk({Text{"Talk to me again for the best hint.", "", ""}}); + hintTable[JUNK43] = HintText::Junk({Text{"They say Gorons discovered a method of space travel.", "", ""}}); + hintTable[JUNK44] = HintText::Junk({Text{"I AM ERROR", "", ""}}); + hintTable[JUNK45] = HintText::Junk({Text{"Real 3DS ZELDA players use motion controls.", "", ""}}); + hintTable[JUNK46] = HintText::Junk({Text{"Real ZELDA players use HOLD targeting.", "", ""}}); + hintTable[JUNK47] = HintText::Junk({Text{"They say items are random...", "", ""}}); + hintTable[JUNK48] = HintText::Junk({Text{"Dear Mario, please come to the castle. I've baked a cake for you. Yours truly, Princess Toadstool, Peach", "", ""}}); + hintTable[JUNK49] = HintText::Junk({Text{"They say the key to victory is beating the game...", "", ""}}); + hintTable[JUNK50] = HintText::Junk({Text{"They say the gold dog cheats.", "", ""}}); + hintTable[JUNK51] = HintText::Junk({Text{"They say @ drowned.", "", ""}}); + hintTable[JUNK52] = HintText::Junk({Text{"Goodbye then.", "", ""}}); + hintTable[JUNK53] = HintText::Junk({Text{"You've met with a terrible hint, haven't you?", "", ""}}); + hintTable[JUNK54] = HintText::Junk({Text{"I'm stoned. Get it?", "", ""}}); + hintTable[JUNK55] = HintText::Junk({Text{"One who doesn't have all the masks will not get a #special reward#", "", ""}}); + hintTable[JUNK56] = HintText::Junk({Text{"They say the #blue dog# will win a race some day...", "", ""}}); + hintTable[JUNK57] = HintText::Junk({Text{"Remember to check your 3DS battery level and save often.", "", ""}}); + hintTable[JUNK58] = HintText::Junk({Text{"Just be a rock.", "", ""}}); + hintTable[JUNK59] = HintText::Junk({Text{"I can't feel my legs!", "", ""}}); + hintTable[JUNK60] = HintText::Junk({Text{"What are you staring at?", "", ""}}); + hintTable[JUNK61] = HintText::Junk({Text{"Glitches are a pathway to many abilities some consider to be... Unnatural.", "", ""}}); + hintTable[JUNK62] = HintText::Junk({Text{"You ever just feel like smashing that $ button?", "", ""}}); + hintTable[JUNK63] = HintText::Junk({Text{"I think the Mask of Truth has it's uses!", "", ""}}); + hintTable[JUNK64] = HintText::Junk({Text{"There's a lot of eyes here, isn't there?", "", ""}}); + hintTable[JUNK65] = HintText::Junk({Text{"I think that #large object in the sky# hasn't moved in a few days.", "", ""}}); + hintTable[JUNK66] = HintText::Junk({Text{"Watch out for that #large object in the sky!#", "", ""}}); + hintTable[JUNK67] = HintText::Junk({Text{"#Tingle Tingle Kooloo Limpah!#", "", ""}}); + hintTable[JUNK68] = HintText::Junk({Text{"They say if you have three specific items, you can zoom across Termina.", "", ""}}); + hintTable[JUNK69] = HintText::Junk({Text{"They say the powder keg can remain fairly elusive.", "", ""}}); + hintTable[JUNK70] = HintText::Junk({Text{"It's pretty cold here, would you mind warming me up, @?", "", ""}}); + hintTable[JUNK71] = HintText::Junk({Text{"These hints can be quite useful. This is an exception.", "", ""}}); + hintTable[JUNK72] = HintText::Junk({Text{"Turns are more effective when you tilt the whole console.", "", ""}}); + hintTable[JUNK73] = HintText::Junk({Text{"You ever been in a cockpit before?", "", ""}}); + hintTable[JUNK74] = HintText::Junk({Text{"It's a secret to everybody", "", ""}}); + hintTable[JUNK75] = HintText::Junk({Text{"You found me!", "", ""}}); + hintTable[JUNK76] = HintText::Junk({Text{"I have it on my post-it note somewhere.", "", ""}}); + hintTable[JUNK77] = HintText::Junk({Text{"Follow the rainbow.", "", ""}}); + + /*------------------------ + | DUNGEON HINT TEXT | + ------------------------*/ + + hintTable[WOODFALL_TEMPLE] = HintText::DungeonName({Text{"the sleeping temple", "the sleeping temple", "the sleeping temple"}}), + hintTable[SNOWHEAD_TEMPLE] = HintText::DungeonName({Text{"an icy temple", "an icy temple", "an icy temple"}}); + hintTable[GREAT_BAY_TEMPLE] = HintText::DungeonName({Text{"the murky watered temple", "the murky watered temple", "the murky watered temple"}}); + hintTable[STONE_TOWER_TEMPLE] = HintText::DungeonName({Text{"a rocky temple", "a rocky temple", "a rocky temple"}}); + hintTable[PIRATE_FORTRESS] = HintText::DungeonName({Text{"the home of pirates", "the home of pirates", "the home of pirates"}}); + hintTable[BENEATH_THE_WELL] = HintText::DungeonName({Text{"an empty watering hole", "an empty watering hole", "an empty watering hole"}}); + hintTable[IKANA_CASTLE] = HintText::DungeonName({Text{"a fallen castle", "a fallen castle", "a fallen castle"}}); + hintTable[SECRET_SHRINE] = HintText::DungeonName({Text{"a mini boss run area", "a mini boss run area", "a mini boss run area"}}); + hintTable[SSH] = HintText::DungeonName({Text{"a home to muddy spiders", "a home to muddy spiders", "a home to muddy spiders"}}); + hintTable[OSH] = HintText::DungeonName({Text{"a home To swimming spiders", "a home To swimming spiders", "a home To swimming spiders"}}); + hintTable[THE_MOON] = HintText::DungeonName({Text{"a dungeon out of this world", "a dungeon out of this world", "a dungeon out of this world"}}); + + /*----------------------- + | BOSS HINT TEXT | + -----------------------*/ + hintTable[ODOLWA] = HintText::Boss({Text{"A Tattooed Warrior", "A Tattooed Warrior", "A Tattooed Warrior"}}); + hintTable[GOHT] = HintText::Boss({Text{"A Mechanical Bull","A Mechanical Bull", "A Mechanical Bull"}}); + hintTable[GYORG] = HintText::Boss({Text{"A Poisonous Fish", "A Poisonous Fish", "A Poisonous Fish"}}); + hintTable[TWINMOLD] = HintText::Boss({Text{"A Giant Centipede Duo", "A Giant Centipede Duo", "A Giant Centipede Duo"}}), + hintTable[MAJORA] = HintText::Boss({Text{"A Cursed Mask", "A Cursed Mask", "A Cursed Mask"}}); + + +} + +const HintText& Hint(const HintKey hintKey) { + return hintTable[hintKey]; +} + +std::vector GetHintCategory(HintCategory category) { + + std::vector hintsInCategory = {}; + + for (const auto& hint : hintTable) { + if (hint.GetType() == category) { + hintsInCategory.push_back(hint); + } + } + return hintsInCategory; } \ No newline at end of file diff --git a/source/hints.cpp b/source/hints.cpp index d64c8ce..5f232e7 100644 --- a/source/hints.cpp +++ b/source/hints.cpp @@ -9,6 +9,7 @@ #include "spoiler_log.hpp" #include "fill.hpp" #include "hint_list.hpp" +#include "custom_messages.hpp" //#include "trial.hpp" //#include "entrance.hpp" @@ -122,8 +123,8 @@ static Area* GetHintRegion(const AreaKey area) { } //add unchecked exits to spot queue - //bool checked = false; - /* + bool checked = false; + for (auto& exit : AreaTable(region)->exits) { for (AreaKey checkedExit : alreadyChecked) { if (exit.GetAreaKey() == checkedExit) { @@ -135,9 +136,8 @@ static Area* GetHintRegion(const AreaKey area) { if (!checked) { spotQueue.insert(spotQueue.begin(), exit.GetAreaKey()); } - }*/ + } } - return AreaTable(NONE); } @@ -151,21 +151,27 @@ static std::vector GetAccessibleGossipStones(const LocationKey hint auto accessibleGossipStones = GetAccessibleLocations(gossipStoneLocations); //Give the item back to the location Location(hintedLocation)->SetPlacedItem(originalItem); - + return accessibleGossipStones; } -/*static void AddHint(Text hint, const LocationKey gossipStone, const std::vector& colors = {}) { +static void AddHint(Text hint, const LocationKey gossipStone, const std::vector& colors = {}) { //save hints as dummy items for writing to the spoiler log - //NewItem(gossipStone, Item{hint, ITEMTYPE_EVENT, GI_RUPEE_BLUE_LOSE, false, &noVariable, NONE}); + NewItem(gossipStone, Item{ false, true, &noVariable, hint, NONE, (u32)GetItemID::GI_RUPEE_BLUE, ITEMTYPE_EVENT, (u16)0}); Location(gossipStone)->SetPlacedItem(gossipStone); //create the in game message - //u32 messageId = 0x400 + Location(gossipStone)->GetFlag(); + u16 messageId = Location(gossipStone)->GetTextID(); + std::vector icons = {}; //u32 sariaMessageId = 0xA00 + Location(gossipStone)->GetFlag(); + CitraPrint("Our hint text is " + hint.GetEnglish()); + if (hint.GetEnglish().find("$")) { + icons.push_back(B_BUTTON); + } + CustomMessages::CreateMessage(messageId, 0xFFFF, 0x3FFFFFFF, 0xFF0020, hint.GetEnglish().c_str(), colors, icons, {}, 0x0, false, false); //CreateMessageFromTextObject(messageId, 0, 2, 3, AddColorsAndFormat(hint, colors)); //CreateMessageFromTextObject(sariaMessageId, 0, 2, 3, AddColorsAndFormat(hint + EVENT_TRIGGER(), colors)); -}*/ +} static void CreateLocationHint(const std::vector& possibleHintLocations) { //return if there aren't any hintable locations or gossip stones available @@ -190,7 +196,7 @@ static void CreateLocationHint(const std::vector& possibleHintLocat return; } - //LocationKey gossipStone = RandomElement(accessibleGossipStones); + LocationKey gossipStone = RandomElement(accessibleGossipStones); Location(hintedLocation)->SetAsHinted(); //make hint text @@ -203,7 +209,7 @@ static void CreateLocationHint(const std::vector& possibleHintLocat PlacementLog_Msg(finalHint.english); PlacementLog_Msg("\n\n"); - //AddHint(finalHint, gossipStone, {QM_GREEN, QM_RED}); + AddHint(finalHint, gossipStone, {QM_GREEN, QM_RED}); } static void CreateWothHint(u8* remainingDungeonWothHints) { @@ -240,24 +246,26 @@ static void CreateWothHint(u8* remainingDungeonWothHints) { return; } Location(hintedLocation)->SetAsHinted(); - //LocationKey gossipStone = RandomElement(gossipStoneLocations); + LocationKey gossipStone = RandomElement(gossipStoneLocations); //form hint text Text locationText; if (Location(hintedLocation)->IsDungeon()) { *remainingDungeonWothHints -= 1; AreaKey parentRegion = Location(hintedLocation)->GetParentRegionKey(); + CitraPrint("WoTH Hint: Getting " + Location(hintedLocation)->GetName() + "'s parent region which is " + Location(parentRegion)->GetName()); locationText = AreaTable(parentRegion)->GetHint().GetText(); } else { AreaKey parentRegion = Location(hintedLocation)->GetParentRegionKey(); + CitraPrint("WoTH Hint: Getting " + Location(hintedLocation)->GetName() + "'s parent region which is " + Location(parentRegion)->GetName()); locationText = GetHintRegion(parentRegion)->GetHint().GetText(); } Text finalWothHint = Hint(PREFIX).GetText()+"#"+locationText+"#"+Hint(WAY_OF_THE_HERO).GetText(); PlacementLog_Msg("\tMessage: "); PlacementLog_Msg(finalWothHint.english); PlacementLog_Msg("\n\n"); - //AddHint(finalWothHint, gossipStone, {QM_LBLUE}); + AddHint(finalWothHint, gossipStone, {QM_BLUE}); } static void CreateBarrenHint(u8* remainingDungeonBarrenHints, std::vector& barrenLocations) { @@ -287,23 +295,25 @@ static void CreateBarrenHint(u8* remainingDungeonBarrenHints, std::vectorSetAsHinted(); - //LocationKey gossipStone = RandomElement(gossipStoneLocations); + LocationKey gossipStone = RandomElement(gossipStoneLocations); //form hint text Text locationText; if (Location(hintedLocation)->IsDungeon()) { *remainingDungeonBarrenHints -= 1; AreaKey parentRegion = Location(hintedLocation)->GetParentRegionKey(); + CitraPrint("Barrent Hint: Getting " + Location(hintedLocation)->GetName() + "'s parent region which is " + Location(parentRegion)->GetName()); locationText = Hint(AreaTable(parentRegion)->hintKey).GetText(); } else { AreaKey parentRegion = Location(hintedLocation)->GetParentRegionKey(); + CitraPrint("Barrent Hint: Getting " + Location(hintedLocation)->GetName() + "'s parent region which is " + Location(parentRegion)->GetName()); locationText = Hint(GetHintRegion(parentRegion)->hintKey).GetText(); } Text finalBarrenHint = Hint(PREFIX).GetText()+Hint(PLUNDERING).GetText()+"#"+locationText+"#"+Hint(FOOLISH).GetText(); PlacementLog_Msg("\tMessage: "); PlacementLog_Msg(finalBarrenHint.english); PlacementLog_Msg("\n\n"); - //AddHint(finalBarrenHint, gossipStone, {QM_PINK}); + AddHint(finalBarrenHint, gossipStone, {QM_RED}); //get rid of all other locations in this same barren region barrenLocations = FilterFromPool(barrenLocations, [hintedLocation](LocationKey loc){ @@ -338,25 +348,34 @@ static void CreateRandomLocationHint(const bool goodItem = false) { return; } Location(hintedLocation)->SetAsHinted(); - //LocationKey gossipStone = RandomElement(gossipStoneLocations); + LocationKey gossipStone = RandomElement(gossipStoneLocations); //form hint text + /* CitraPrint("Checking location " + Location(hintedLocation)->GetName() + \ + "'s item which is " + Location(hintedLocation)->GetPlacedItemName().GetEnglish() + \ + " and GetItemID of " + Location(hintedLocation)->GetPlacedItem().GetItemId() + "\n"); + DebugPrint("Checking location %s's item which is %s and GetItemID of %#04x and hint text is %s\n", Location(hintedLocation)->GetName().c_str(), \ + Location(hintedLocation)->GetPlacedItemName().GetEnglish().c_str(), \ + Location(hintedLocation)->GetPlacedItem().GetItemId(), \ + Location(hintedLocation)->GetPlacedItem().GetHint().GetText().GetEnglish().c_str()); */ Text itemText = Location(hintedLocation)->GetPlacedItem().GetHint().GetText(); if (Location(hintedLocation)->IsDungeon()) { AreaKey parentRegion = Location(hintedLocation)->GetParentRegionKey(); Text locationText = AreaTable(parentRegion)->GetHint().GetText(); + CitraPrint("Random Loc Hint: Getting " + Location(hintedLocation)->GetName() + "'s parent region which is " + Location(parentRegion)->GetName()); Text finalHint = Hint(PREFIX).GetText()+"#"+locationText+"# "+Hint(HOARDS).GetText()+" #"+itemText+"#."; PlacementLog_Msg("\tMessage: "); PlacementLog_Msg(finalHint.english); PlacementLog_Msg("\n\n"); - //AddHint(finalHint, gossipStone, {QM_GREEN, QM_RED}); + AddHint(finalHint, gossipStone, {QM_GREEN, QM_RED}); } else { + CitraPrint("Random Loc Hint: Getting " + Location(hintedLocation)->GetName() + "'s parent region which is " + Location(Location(hintedLocation)->GetParentRegionKey())->GetName()); Text locationText = GetHintRegion(Location(hintedLocation)->GetParentRegionKey())->GetHint().GetText(); Text finalHint = Hint(PREFIX).GetText()+"#"+itemText+"# "+Hint(CAN_BE_FOUND_AT).GetText()+" #"+locationText+"#."; PlacementLog_Msg("\tMessage: "); PlacementLog_Msg(finalHint.english); PlacementLog_Msg("\n\n"); - //AddHint(finalHint, gossipStone, {QM_RED, QM_GREEN}); + AddHint(finalHint, gossipStone, {QM_RED, QM_GREEN}); } } @@ -367,20 +386,25 @@ static void CreateGoodItemHint() { static void CreateJunkHint() { //duplicate junk hints are possible for now const HintText junkHint = RandomElement(GetHintCategory(HintCategory::Junk)); + LogicReset(); const std::vector gossipStones = GetAccessibleLocations(gossipStoneLocations); if (gossipStones.empty()) { PlacementLog_Msg("\tNO GOSSIP STONES TO PLACE HINT\n\n"); return; } - //LocationKey gossipStone = RandomElement(gossipStones); + LocationKey gossipStone = RandomElement(gossipStones); Text hint = junkHint.GetText(); PlacementLog_Msg("\tMessage: "); PlacementLog_Msg(hint.english); + PlacementLog_Msg("\n"); + + PlacementLog_Msg("\tLocation: "); + PlacementLog_Msg(Location(gossipStone)->GetName()); PlacementLog_Msg("\n\n"); - //AddHint(hint, gossipStone, {QM_PINK}); + AddHint(hint, gossipStone, {QM_RED}); } static std::vector CalculateBarrenRegions() { @@ -479,7 +503,6 @@ void CreateAllHints() { //get a random hint type from the remaining hints HintType type = RandomElement(remainingHintTypes, true); - PlacementLog_Msg("Attempting to make hint of type: "); PlacementLog_Msg(std::to_string(static_cast(type))); PlacementLog_Msg("\n"); @@ -519,10 +542,10 @@ void CreateAllHints() { } //If any gossip stones failed to have a hint placed on them for some reason, place a junk hint as a failsafe. - /*for (LocationKey gossipStone : FilterFromPool(gossipStoneLocations, [](const LocationKey loc){return Location(loc)->GetPlacedItemKey() == NONE;})) { + for (LocationKey gossipStone : FilterFromPool(gossipStoneLocations, [](const LocationKey loc){return Location(loc)->GetPlacedItemKey() == NONE;})) { const HintText junkHint = RandomElement(GetHintCategory(HintCategory::Junk)); - //AddHint(junkHint.GetText(), gossipStone, {QM_PINK}); - }*/ + AddHint(junkHint.GetText(), gossipStone, {QM_RED}); + } //Getting gossip stone locations temporarily sets one location to not be reachable. //Call the function one last time to get rid of false positives on locations not diff --git a/source/include/category.hpp b/source/include/category.hpp index ad19b95..62c2939 100644 --- a/source/include/category.hpp +++ b/source/include/category.hpp @@ -77,6 +77,13 @@ enum class Category { cDayOne, cDayTwo, cDayThree, + cAnjuAndKafei, + cNotebook, + cAlternateCheck, + cZoraEgg, + cMoonItems, + cFDM, + cMainInventory, }; enum class OptionCategory { diff --git a/source/include/entrance.hpp b/source/include/entrance.hpp index 92feedb..027607e 100644 --- a/source/include/entrance.hpp +++ b/source/include/entrance.hpp @@ -68,13 +68,15 @@ class Entrance { bool ConditionsMet() const { Area* parent = AreaTable(parentRegion); + int conditionsMet = 0; //PlacementLog_Msg("\nConditions Met parent = "); //PlacementLog_Msg(parent->regionName+"\n"); if (!parent->AllAccess()){ return false; } + conditionsMet = (parent->HasAccess()); Logic::UpdateHelpers(); - return GetConditionsMet(); + return conditionsMet; } AreaKey GetAreaKey() const { diff --git a/source/include/hints.hpp b/source/include/hints.hpp index 8cf5d41..b789a7a 100644 --- a/source/include/hints.hpp +++ b/source/include/hints.hpp @@ -5,6 +5,7 @@ #include #include +#include "keys.hpp" #include "text.hpp" #include "random.hpp" #include "settings.hpp" diff --git a/source/include/item.hpp b/source/include/item.hpp index fc0890b..cfd519b 100644 --- a/source/include/item.hpp +++ b/source/include/item.hpp @@ -33,6 +33,7 @@ enum ItemType { ITEMTYPE_STRAYFAIRY, ITEMTYPE_QUEST, ITEMTYPE_TRADE, + ITEMTYPE_GFAIRY, }; class Item { diff --git a/source/include/item_location.hpp b/source/include/item_location.hpp index 9b072ba..5934633 100644 --- a/source/include/item_location.hpp +++ b/source/include/item_location.hpp @@ -156,6 +156,10 @@ class ItemLocation { return scene; } + u16 GetTextID() const { + return textID; + } + u8 GetFlag() const { return flag; } diff --git a/source/include/keys.hpp b/source/include/keys.hpp index 6db9284..6e2e502 100644 --- a/source/include/keys.hpp +++ b/source/include/keys.hpp @@ -57,7 +57,7 @@ typedef enum { GAROS_MASK, CAPTAINS_HAT, GIANTS_MASK, - FIERCE_DIETY_MASK, + FIERCE_DEITY_MASK, MASK_OF_TRUTH, SWAMP_SKULLTULA_TOKEN, OCEANSIDE_SKULLTULA_TOKEN, @@ -127,6 +127,7 @@ typedef enum { SONG_OF_TIME, SONG_OF_STORMS, SONATA_OF_AWAKENING, + LULLABY_INTRO, GORONS_LULLABY, NEW_WAVE_BOSSA_NOVA, ELEGY_OF_EMPTINESS, @@ -237,6 +238,7 @@ typedef enum { SOUTHERN_SWAMP_MUSIC_STATUE, GIANTS_OATH_TO_ORDER, DEKU_PALACE_IMPRISONED_MONKEY, + TWIN_ISLANDS_LULLABY_INTRO, GORON_VILLAGE_GORON_LULLABY, GBC_BABY_ZORAS, ROMANI_RANCH_ROMANIS_GAME, @@ -281,6 +283,10 @@ typedef enum { GORON_VILLAGE_LEDGE, LENS_CAVE_RED_RUPEE, LENS_CAVE_PURPLE_RUPEE, + GORON_VILLAGE_POWDER_KEG_CHALLENGE_SPRING, + GORON_VILLAGE_SCRUB_PURCHASE_SPRING, + GORON_VILLAGE_SCRUB_TRADE_SPRING, + GORON_VILLAGE_LEDGE_SPRING, GORON_SHOP_ITEM_1, GORON_SHOP_ITEM_2, GORON_SHOP_ITEM_3, @@ -334,6 +340,7 @@ typedef enum { MOUNTAIN_VILLAGE_SMITH_DAY_ONE, MOUNTAIN_VILLAGE_SMITH_DAY_TWO, MOUNTAIN_VILLAGE_FROG_CHOIR, + MOUNTAIN_VILLAGE_KEATON_QUIZ, MOUNTAIN_VILLAGE_DARMANI, MOUNTAIN_VILLAGE_HUNGRY_GORON, MOUNTAIN_WATERFALL_CHEST, @@ -405,10 +412,13 @@ typedef enum { SOUTHERN_SWAMP_PICTOGRAPH_STANDARD, SOUTHERN_SWAMP_PICTOGRAPH_GOOD, SOUTHERN_SWAMP_SCRUB_PURCHASE, + SOUTHERN_SWAMP_SCRUB_PURCHASE_CLEAR, + SOUTHERN_SWAMP_SCRUB_TRADE_CLEAR, + SWAMP_TOURIST_CENTER_ROOF_CLEAR, POTION_SHOP_ITEM_1, POTION_SHOP_ITEM_2, POTION_SHOP_ITEM_3, -//StockPotInn +//Stock Pot Inn STOCKPOTINN_RESERVATION, STOCKPOTINN_MIDNIGHT_MEETING, STOCKPOTINN_TOILET_HAND, @@ -455,7 +465,6 @@ typedef enum { W_CLOCK_TOWN_ALL_NIGHT_MASK_BUY, W_CLOCK_TOWN_LOTTERY, W_CLOCK_TOWN_BOMB_SHOP_GORON, - W_CLOCK_TOWN_POSTBOX, TRADING_POST_ITEM_1, TRADING_POST_ITEM_2, TRADING_POST_ITEM_3, @@ -810,6 +819,7 @@ typedef enum { IKANA_GRAVEYARD_BATS_ROOM, IKANA_GRAVEYARD_TABLET_ROOM, IKANA_GRAVEYARD_BELOW_GRAVE2, + IKANA_GRAVEYARD_PRE_IRON_KNUCKLE_ROOM, IKANA_GRAVEYARD_IRON_KNUCKLE_ROOM, IKANA_GRAVEYARD_BELOW_GRAVE3, DAMPES_HUT, @@ -899,6 +909,7 @@ typedef enum { STONE_TOWER_TEMPLE_INVERTED_ENTRANCE_DEATH_ARMOS_LEDGE, STONE_TOWER_TEMPLE_PRE_GOMESS_ROOM, STONE_TOWER_TEMPLE_GOMESS_ROOM, + STONE_TOWER_TEMPLE_INVERTED_EYEGORE_ROOM, STONE_TOWER_TEMPLE_INVERTED_THIN_BRIDGE_ROOM, STONE_TOWER_TEMPLE_PRE_BOSS_ROOM, STONE_TOWER_TEMPLE_BOSS_ROOM, @@ -1116,7 +1127,7 @@ typedef enum { JUNK68, JUNK69, JUNK70, - JUMK71, + JUNK71, JUNK72, JUNK73, JUNK74, diff --git a/source/include/location_access.hpp b/source/include/location_access.hpp index e59044e..8b0dbcb 100644 --- a/source/include/location_access.hpp +++ b/source/include/location_access.hpp @@ -156,8 +156,14 @@ class Area { void ResetVariables(); + }; + /*extern std::array areaTable; + extern std::vector grottoEvents; + bool Here(const AreaKey area, ConditionFn condition); + bool HasAccessTo(const AreaKey area);*/ + namespace Areas { extern void AccessReset(); diff --git a/source/include/logic.hpp b/source/include/logic.hpp index 8965a3a..f394f96 100644 --- a/source/include/logic.hpp +++ b/source/include/logic.hpp @@ -37,9 +37,10 @@ namespace Logic { extern bool AlienBottle; extern bool GoronRaceBottle; extern bool BeaverRaceBottle; - extern bool DampeBottle; + extern bool ArcheryBottle; extern bool ChateauBottle; extern bool MysteryMilkBottle; + extern bool UsableMysteryMilkBottle; extern bool BombersNotebook; extern bool MirrorShield; extern bool HerosShield; @@ -82,7 +83,7 @@ namespace Logic { extern bool GarosMask; extern bool CaptainsHat; extern bool GiantsMask; - extern bool FierceDietyMask; + extern bool FierceDeityMask; extern bool MaskOfTruth; extern bool OneMask; extern bool TwoMasks; @@ -114,6 +115,7 @@ namespace Logic { extern bool SongOfStorms; extern bool SongOfHealing; extern bool SonataOfAwakening; + extern bool LullabyIntro; extern bool GoronsLullaby; extern bool NewWaveBossaNova; extern bool ElegyOfEmptiness; @@ -308,6 +310,7 @@ namespace Logic { extern bool WoodfallFrog; extern bool GreatBayFrog; extern bool ThinBridgeCrystalChest; + extern bool MilkQuestStart; extern bool CanGoToMoon; @@ -326,4 +329,4 @@ namespace Logic { u8 TotalMaskCount(); bool EventsUpdated(); void LogicReset(); -} \ No newline at end of file +} diff --git a/source/include/menu.hpp b/source/include/menu.hpp index ee78177..67066ca 100644 --- a/source/include/menu.hpp +++ b/source/include/menu.hpp @@ -42,10 +42,8 @@ void PrintOptionSubMenu(); void PrintSubMenu(); void PrintPresetsMenu(); void PrintResetToDefaultsMenu(); -void PrintGenerateMenu(); void ClearDescription(); void PrintOptionDescription(); -void PrintVersionDescription(); void GenerateRandomizer(); std::string GetInput(const char* hintText); diff --git a/source/include/setting_descriptions.hpp b/source/include/setting_descriptions.hpp index a6c8b27..8c7d541 100644 --- a/source/include/setting_descriptions.hpp +++ b/source/include/setting_descriptions.hpp @@ -106,7 +106,7 @@ extern string_view blastLong; extern string_view blastVeryLong; extern string_view underwaterOcarinaDesc; -extern string_view fierceDietyAnywhereDesc; +extern string_view fierceDeityAnywhereDesc; extern string_view skipMinigamePhasesDesc; extern string_view fastLabFishDesc; extern string_view fastBankDesc; @@ -207,7 +207,7 @@ extern string_view shuffleHeartContainersDesc; extern string_view shufflePiecesOfHeartDesc; extern string_view shuffleMainInventoryDesc; extern string_view shuffleTransformationDesc; -extern string_view shuffleFierceDietyDesc; +extern string_view shuffleFierceDeityDesc; extern string_view shuffleMoonItemsDesc; extern string_view shuffleBombersNotebookDesc; extern string_view ocarinaDiveDesc; @@ -215,6 +215,7 @@ extern string_view fastZoraSwimDesc; extern string_view dpadMaskDesc; extern string_view dpadOcarinaDesc; extern string_view dpadArrowDesc; +extern string_view twinmoldRestorationDesc; extern string_view customMapButtonDesc; extern string_view customItemsButtonDesc; extern string_view customMasksButtonDesc; @@ -223,4 +224,8 @@ extern string_view ingameSpoilersButtonDesc; extern string_view compassShowWotHDesc; extern string_view skipHMSCutsceneDesc; extern string_view skipDarmaniCutsceneDesc; -extern string_view skipMikauCutsceneDesc; \ No newline at end of file +extern string_view skipMikauCutsceneDesc; +extern string_view skipBombersMinigameDesc; +extern string_view NARegionDesc; +extern string_view EURegionDesc; +extern string_view VersionDesc; \ No newline at end of file diff --git a/source/include/settings.hpp b/source/include/settings.hpp index 4e251b4..8cb4de4 100644 --- a/source/include/settings.hpp +++ b/source/include/settings.hpp @@ -363,7 +363,7 @@ namespace Settings { extern Option StartingGaroMask; extern Option StartingCaptainsHat; extern Option StartingGiantsMask; - extern Option StartingFierceDietyMask; + extern Option StartingFierceDeityMask; extern Option StartingMaskOfTruth; //Excluded Locations extern std::vector excludeLocationsOptions; @@ -400,7 +400,7 @@ namespace Settings { extern Option ItemPoolValue; extern Option ShuffleMainInventory; extern Option ShuffleTransformation; - extern Option ShuffleFierceDiety; + extern Option ShuffleFierceDeity; extern Option ShuffleChests; extern Option ShuffleMasks; extern Option ShuffleGFRewards; @@ -419,14 +419,16 @@ namespace Settings { extern Option ChestSize; extern Option ChangeOverworldItems; extern Option IngameSpoilers; + extern Option RegionSelect; extern Option MenuOpeningButton; extern Option RsDurability; + extern Option SkipBombersMinigame; extern std::vectorotherSettingsOptions; //Comfort extern Option BlastMaskCooldown; extern Option UnderwaterOcarina; - extern Option FierceDietyAnywhere; + extern Option FierceDeityAnywhere; extern Option ProgressiveGildedSword; extern Option StartingSpin; extern Option AmmoDrops; @@ -447,6 +449,10 @@ namespace Settings { extern Option SkipSongReplays; extern Option FastZoraSwim; extern Option OcarinaDive; + extern Option DpadTransform; + extern Option DpadOcarina; + extern Option DpadArrows; + extern Option TwinmoldRestoraion; //Trial Skips extern Option OdolwaTrialSkip; @@ -524,8 +530,10 @@ namespace Settings { extern u32 LinksPocketRewardBitMask; extern std::array rDungeonRewardOverrides; - extern u8 PlayOption; - extern u8 Version; + extern Option PlayOption; + extern Option Version; + extern std::vector gameOptions; + extern Menu gameSettings; } diff --git a/source/include/version.hpp b/source/include/version.hpp index c3cbce1..42e18eb 100644 --- a/source/include/version.hpp +++ b/source/include/version.hpp @@ -1,4 +1,4 @@ #pragma once -#define RANDOMIZER_VERSION "v1.0Beta" +#define RANDOMIZER_VERSION "v1.3.0" #define COMMIT_NUMBER "develop" diff --git a/source/item_list.cpp b/source/item_list.cpp index bb07440..24819c2 100644 --- a/source/item_list.cpp +++ b/source/item_list.cpp @@ -13,7 +13,7 @@ void ItemTable_Init() { //repeatable denotes that an item in a vanilla playth itemTable[TEST] = Item(); itemTable[NONE] = Item(false, false, &noVariable, Text{"No Item", "Rien", "Sin Objeto" }, NONE, (u32)GetItemID::GI_NONE, ITEMTYPE_EVENT); itemTable[KOKIRI_SWORD] = Item(true , false, &KokiriSword, Text{"Kokiri Sword", "Épée Kokiri", "Espada Kokiri" }, KOKIRI_SWORD, (u32)GetItemID::GI_KOKIRI_SWORD, ITEMTYPE_ITEM ); - itemTable[GREAT_FAIRYS_SWORD] = Item(true , false, &GreatFairySword, Text{"Great Fairys Sword", "Grande Épée de Fees", "Espada de la Gran Hada"}, GREAT_FAIRYS_SWORD, (u32)GetItemID::GI_GREAT_FAIRY_SWORD, ITEMTYPE_ITEM ); + itemTable[GREAT_FAIRYS_SWORD] = Item(true , false, &GreatFairySword, Text{"Great Fairy's Sword", "Grande Épée de Fees", "Espada de la Gran Hada"}, GREAT_FAIRYS_SWORD, (u32)GetItemID::GI_GREAT_FAIRY_SWORD, ITEMTYPE_GFAIRY ); itemTable[HEROS_SHIELD] = Item(false, true, &HerosShield, Text{"Heros Shield", "Bouclier du Heros", "Escudo del Heroe"}, HEROS_SHIELD, (u32)GetItemID::GI_SHIELD_HERO, ITEMTYPE_ITEM ); itemTable[DEKU_STICK] = Item(true , true, &DekuStick, Text{"Deku Stick", "Bâton Mojo", "palos deku" }, DEKU_STICK, (u32)GetItemID::GI_STICKS_1, ITEMTYPE_ITEM ); itemTable[LAND_TITLE] = Item(true, true, &LandTitle, Text{"Land Title Deed", "Titre de propriete fonciere", "Escritura de propiedad de la Tierra" }, LAND_TITLE, (u32)GetItemID::GI_TOWN_TITLE_DEED, ITEMTYPE_TRADE ); @@ -26,7 +26,7 @@ void ItemTable_Init() { //repeatable denotes that an item in a vanilla playth itemTable[PENDANT_MEMORIES] = Item(true, true, &PendantAccess, Text{"Pendant of Memories", "Pendentif de Souvenirs", "Colgante de recuerdos" }, PENDANT_MEMORIES, (u32)GetItemID::GI_PENDANT_OF_MEMORIES, ITEMTYPE_QUEST ); itemTable[LETTER_MAMA] = Item(true, true, &LetterMama, Text{"Special Delivery to Mama", "Livraison speciale a maman", "Entrega especial a mama" }, LETTER_MAMA, (u32)GetItemID::GI_LETTER_TO_MAMA, ITEMTYPE_QUEST ); itemTable[MOONS_TEAR] = Item(true, true, &MoonsTear, Text{"Moon's Tear", "Larme de lune", "Lagrima de luna" }, MOONS_TEAR, (u32)GetItemID::GI_MOONS_TEAR, ITEMTYPE_TRADE ); - itemTable[SPIN_ATTACK] = Item(true, false, &SpinAttack, Text{"Spin Attack", "attaque de rotation", "ataque giratorio" }, SPIN_ATTACK, 0x2C, ITEMTYPE_ITEM ); + itemTable[SPIN_ATTACK] = Item(true, false, &SpinAttack, Text{"Spin Attack", "attaque de rotation", "ataque giratorio" }, SPIN_ATTACK, 0x2C, ITEMTYPE_GFAIRY ); itemTable[LENS_OF_TRUTH] = Item(true, false, &LensOfTruth, Text{"Lens of Truth", "Loupe de vérité", "Lupa de la Verdad"}, LENS_OF_TRUTH, (u32)GetItemID::GI_LENS_OF_TRUTH, ITEMTYPE_ITEM ); itemTable[HEROS_BOW] = Item(true, false, &HerosBow, Text{"Hero's Bow", "Hero's Bow", "Hero's Bow"}, HEROS_BOW, (u32)GetItemID::GI_HEROS_BOW, ITEMTYPE_ITEM ); itemTable[FIRE_ARROWS] = Item(true, false, &FireArrows, Text{"Fire Arrow", "Flèche de feu", "Flecha de fuego"}, FIRE_ARROWS, (u32)GetItemID::GI_FIRE_ARROW, ITEMTYPE_ITEM ); @@ -35,7 +35,7 @@ void ItemTable_Init() { //repeatable denotes that an item in a vanilla playth itemTable[HOOKSHOT] = Item(true, false, &Hookshot, Text{"Hookshot", "Grappin", "Gancho" }, HOOKSHOT, (u32)GetItemID::GI_HOOKSHOT, ITEMTYPE_ITEM ); itemTable[MAGIC_BEAN] = Item(true, true, &MagicBean, Text{"Magic Bean", "Haricot magique", "Habichuelas mágicas"}, MAGIC_BEAN, (u32)GetItemID::GI_MAGIC_BEAN, ITEMTYPE_ITEM ); itemTable[MAGIC_BEAN_PACK] = Item(true, true, &MagicBeanPack, Text{"Magic Bean Pack", "Paquet de haricots magiques", "Lote de habichuelas mágicas"}, MAGIC_BEAN_PACK, (u32)GetItemID::GI_MAGIC_BEAN, ITEMTYPE_ITEM ); - itemTable[DOUBLE_DEFENSE] = Item(true, false, &noVariable, Text{"Double Defense", "Double défence", "Doble poder defensivo"}, DOUBLE_DEFENSE, 0xB2, ITEMTYPE_ITEM ); + itemTable[DOUBLE_DEFENSE] = Item(true, false, &noVariable, Text{"Double Defense", "Double défence", "Doble poder defensivo"}, DOUBLE_DEFENSE, 0xB2, ITEMTYPE_GFAIRY ); itemTable[OCARINA_OF_TIME] = Item(true, false, &Ocarina, Text{"Ocarina of Time", "Ocarina du temps", "Ocarina del Tiempo"}, OCARINA_OF_TIME, (u32)GetItemID::GI_OCARINA_OF_TIME, ITEMTYPE_ITEM ); itemTable[PICTOGRAPH_BOX] = Item(true, false, &Pictobox, Text{"Pictograph Box", "Boite a Images", "Camara Pictografica"}, PICTOGRAPH_BOX, (u32)GetItemID::GI_PICTOGRAPH_BOX, ITEMTYPE_ITEM ); itemTable[POWDER_KEG] = Item(true, true, &PowderKeg, Text{"Powder Keg", "Baril de Poudre", "Barril de Polovora"}, POWDER_KEG, (u32)GetItemID::GI_POWDER_KEG, ITEMTYPE_ITEM ); @@ -53,15 +53,15 @@ void ItemTable_Init() { //repeatable denotes that an item in a vanilla playth itemTable[DON_GEROS_MASK] = Item(true, false, &DonGerosMask, Text{"Don Gero's Mask", "Masque de Don Gero", "Máscara de Don Gero"}, DON_GEROS_MASK, (u32)GetItemID::GI_MASK_DON_GEROS, ITEMTYPE_MASK ); itemTable[MASK_OF_SCENTS] = Item(true, false, &MaskOfScents, Text{"Mask of Scents", "Masque des Senteurs", "Máscara de aromas"}, MASK_OF_SCENTS, (u32)GetItemID::GI_MASK_OF_SCENTS, ITEMTYPE_MASK ); itemTable[ROMANIS_MASK] = Item(true, false, &RomanisMask, Text{"Romani's Mask", "Masque de Romani", "Máscara de Romani"}, ROMANIS_MASK, (u32)GetItemID::GI_MASK_ROMANIS, ITEMTYPE_MASK ); - itemTable[CIRCUS_LEADERS_MASK] = Item(true, false, &CircusLeadersMask, Text{"Circus Leader's Mask", "Masque de chef de cirque", "Máscara de lider de circo"}, CIRCUS_LEADERS_MASK, (u32)GetItemID::GI_MASK_TROUPE_LEADERS, ITEMTYPE_MASK ); + itemTable[CIRCUS_LEADERS_MASK] = Item(true, false, &CircusLeadersMask, Text{"Troupe Leader's Mask", "Masque de chef de troupe", "Máscara de lider de troupe"}, CIRCUS_LEADERS_MASK, (u32)GetItemID::GI_MASK_TROUPE_LEADERS, ITEMTYPE_MASK ); itemTable[KAFEIS_MASK] = Item(true, false, &KafeisMask, Text{"Kafei's Mask", "Masque de Kafei", "Máscara de Kafei"}, KAFEIS_MASK, (u32)GetItemID::GI_MASK_KAFEIS, ITEMTYPE_MASK ); itemTable[COUPLES_MASK] = Item(true, false, &CouplesMask, Text{"Couple's Mask", "Masque de couple", "Máscara de pareja"}, COUPLES_MASK, (u32)GetItemID::GI_MASK_COUPLES, ITEMTYPE_MASK ); itemTable[KAMAROS_MASK] = Item(true, false, &KamarosMask, Text{"Kamaro's Mask", "Masque de Kamaro", "Máscara de Kamaro"}, KAMAROS_MASK, (u32)GetItemID::GI_MASK_KAMARAOS, ITEMTYPE_MASK ); - itemTable[GIBDOS_MASK] = Item(true, false, &GibdosMask, Text{"Gibdo's Mask", "Masque Gibdo", "Máscara de Gibdo"}, GIBDOS_MASK, (u32)GetItemID::GI_MASK_GIBDO, ITEMTYPE_MASK ); + itemTable[GIBDOS_MASK] = Item(true, false, &GibdosMask, Text{"Gibdo Mask", "Masque Gibdo", "Máscara de Gibdo"}, GIBDOS_MASK, (u32)GetItemID::GI_MASK_GIBDO, ITEMTYPE_MASK ); itemTable[GAROS_MASK] = Item(true, false, &GarosMask, Text{"Garo's Mask", "Masque de Garo", "Máscara de Garo"}, GAROS_MASK, (u32)GetItemID::GI_MASK_GARO, ITEMTYPE_MASK ); itemTable[CAPTAINS_HAT] = Item(true, false, &CaptainsHat, Text{"Captain's Hat", "Chapeau de capitaine", "Sombrero de Capitan"}, CAPTAINS_HAT, (u32)GetItemID::GI_MASK_CAPTAINS_HAT, ITEMTYPE_MASK ); itemTable[GIANTS_MASK] = Item(true, false, &GiantsMask, Text{"Giant's Mask", "Masque de geant", "Máscara de gigante"}, GIANTS_MASK, (u32)GetItemID::GI_MASK_GIANTS, ITEMTYPE_MASK ); - itemTable[FIERCE_DIETY_MASK] = Item(true, false, &FierceDietyMask, Text{"Fierce Diety Mask", "Masque Dietetique Fiere", "Máscara Fiere Diety"}, FIERCE_DIETY_MASK, (u32)GetItemID::GI_MASK_FIERCE_DEITY, ITEMTYPE_MASK ); + itemTable[FIERCE_DEITY_MASK] = Item(true, false, &FierceDeityMask, Text{"Fierce Deity Mask", "Masque Dietetique Fiere", "Máscara Fiere Deity"}, FIERCE_DEITY_MASK, (u32)GetItemID::GI_MASK_FIERCE_DEITY, ITEMTYPE_MASK ); itemTable[MASK_OF_TRUTH] = Item(true, false, &MaskOfTruth, Text{"Mask of Truth", "Masque de vérité", "Máscara de la Verdad"}, MASK_OF_TRUTH, (u32)GetItemID::GI_MASK_OF_TRUTH, ITEMTYPE_MASK ); itemTable[FISHING_PASS] = Item(false, true, &noVariable, Text{"Fishing Pass", "Fishing Pass", "Fishing Pass"}, FISHING_PASS, 0xBA, ITEMTYPE_ITEM ); // @@ -89,18 +89,21 @@ void ItemTable_Init() { //repeatable denotes that an item in a vanilla playth itemTable[ST_STRAY_FAIRY] = Item(true, true, &StoneTowerStrayFairies, Text{"Stone Tower Stray Fairy", "Fee errante de la Forteresse de Pierre", "Hada Callejera de la Torre Piedra" }, ST_STRAY_FAIRY, (u32)GetItemID::GI_NONE, ITEMTYPE_STRAYFAIRY); //Bottles - itemTable[EMPTY_BOTTLE1] = Item(true, false, &DampeBottle, Text{"Empty Bottle", "Flacon vide", "Botella vacía" }, EMPTY_BOTTLE1, (u32)GetItemID::GI_BOTTLE_EMPTY, ITEMTYPE_ITEM); + itemTable[EMPTY_BOTTLE1] = Item(true, false, &ArcheryBottle, Text{"Empty Bottle", "Flacon vide", "Botella vacía" }, EMPTY_BOTTLE1, (u32)GetItemID::GI_BOTTLE_EMPTY, ITEMTYPE_ITEM); itemTable[EMPTY_BOTTLE2] = Item(true, false, &BeaverRaceBottle, Text{"Empty Bottle", "Flacon vide", "Botella vacía" }, EMPTY_BOTTLE2, (u32)GetItemID::GI_BOTTLE_EMPTY, ITEMTYPE_ITEM); itemTable[EMPTY_BOTTLE] = Item(true, false, &HasBottle, Text{"Empty Bottle", "Flacon vide", "Botella vacía" }, EMPTY_BOTTLE, (u32)GetItemID::GI_BOTTLE_EMPTY, ITEMTYPE_ITEM); itemTable[BOTTLE_WITH_MILK] = Item(true, false, &AlienBottle, Text{"Bottle with Milk", "Flacon de lait", "Botella de leche Lon Lon"}, BOTTLE_WITH_MILK, (u32)GetItemID::GI_BOTTLE_MILK, ITEMTYPE_ITEM); itemTable[BOTTLE_WITH_RED_POTION] = Item(true, false, &WitchBottle, Text{"Bottle with Red Potion", "Flacon de potion rouge", "Botella de poción roja"}, BOTTLE_WITH_RED_POTION, (u32)GetItemID::GI_BOTTLE_POTION_RED, ITEMTYPE_ITEM); - itemTable[GOLD_DUST] = Item(true, true, &GoronRaceBottle, Text{"Gold Dust", "Poudre d'Or", "Polvo de Oro" }, GOLD_DUST, (u32)GetItemID::GI_BOTTLE_GOLD_DUST, ITEMTYPE_ITEM); + itemTable[GOLD_DUST] = Item(true, true, &GoronRaceBottle, Text{"Gold Dust", "Poudre d'Or", "Polvo de Oro" }, GOLD_DUST, (u32)GetItemID::GI_BOTTLE_GOLD_DUST, ITEMTYPE_QUEST); itemTable[CHATEAU_ROMANI] = Item(true, false, &ChateauBottle, Text{"Chateau Romani", "Chateau Romani", "Reserva Romani" }, CHATEAU_ROMANI, (u32)GetItemID::GI_BOTTLE_CHATEAU_ROMANI, ITEMTYPE_ITEM); - itemTable[BOTTLE_WITH_MYSTERY_MILK] = Item(true, true, &MysteryMilkBottle, Text{"Bottle with Mystery Milk", "Bottle with Mystery Milk", "Bottle with Mystery Milk"}, BOTTLE_WITH_MYSTERY_MILK, (u32)GetItemID::GI_BOTTLE_MYSTERY_MILK, ITEMTYPE_ITEM); + itemTable[BOTTLE_WITH_MYSTERY_MILK] = Item(true, true, &MysteryMilkBottle, Text{"Bottle with Mystery Milk", "Bottle with Mystery Milk", "Bottle with Mystery Milk"}, BOTTLE_WITH_MYSTERY_MILK, (u32)GetItemID::GI_BOTTLE_MYSTERY_MILK, ITEMTYPE_QUEST); //Other bottle items itemTable[DEKU_PRINCESS] = Item(true, true, &DekuPrincess, Text{"Deku Princess", "Princesse Mojo", "Princesa Deku"}, DEKU_PRINCESS, (u32)GetItemID::GI_DEKU_PRINCESS_FAIRY, ITEMTYPE_ITEM); + itemTable[BOTTLE_WITH_GREEN_POTION] = Item(false, false, &HasBottle, Text{"Bottle with Green Potion", "Flacon de potion verde", "Botella de poción verte"}, BOTTLE_WITH_GREEN_POTION, (u32)GetItemID::GI_POTION_GREEN, ITEMTYPE_ITEM); + itemTable[BOTTLE_WITH_BLUE_POTION] = Item(false, false, &HasBottle, Text{"Bottle with Blue Potion", "Flacon de potion azul", "Botella de poción bleu"}, BOTTLE_WITH_BLUE_POTION, (u32)GetItemID::GI_POTION_BLUE, ITEMTYPE_ITEM); itemTable[BOTTLE_WITH_FAIRY] = Item(false, true, &HasBottle, Text{"Bottle with Fairy", "Bottle with Fairy", "Bottle with Fairy",}, BOTTLE_WITH_FAIRY, (u32)GetItemID::GI_FAIRY, ITEMTYPE_ITEM); itemTable[BOTTLE_WITH_BUGS] = Item(false, true, &HasBottle, Text{"Bottle with Bugs", "Bottle with Bugs", "Bottle with Bugs",}, BOTTLE_WITH_BUGS, (u32)GetItemID::GI_BOTTLE_BUG, ITEMTYPE_ITEM); + itemTable[BOTTLE_WITH_FISH] = Item(false, true, &HasBottle, Text{"Bottle with Fish", "Bottle with Fish", "Bottle with Fish"}, BOTTLE_WITH_FISH, (u32)GetItemID::GI_BOTTLE_FISH, ITEMTYPE_ITEM); itemTable[BOTTLE_WITH_POE] = Item(false, true, &HasBottle, Text{"Bottle with Poe", "Bottle with Poe", "Bottle with Poe",}, BOTTLE_WITH_POE, (u32)GetItemID::GI_BOTTLE_POE_TEXT, ITEMTYPE_ITEM); itemTable[BOTTLE_WITH_BIG_POE] = Item(false, true, &HasBottle, Text{"Bottle with Big Poe", "Bottle with Big Poe", "Bottle with Big Poe",}, BOTTLE_WITH_BIG_POE, (u32)GetItemID::GI_BOTTLE_BIG_POE, ITEMTYPE_ITEM); itemTable[BOTTLE_WITH_SPRING_WATER] = Item(false, true, &HasBottle, Text{"Bottle with Spring Water", "Bottle with Spring Water", "Bottle with Spring Water",}, BOTTLE_WITH_SPRING_WATER, (u32)GetItemID::GI_BOTTLE_SPRING_WATER, ITEMTYPE_ITEM); @@ -108,7 +111,7 @@ void ItemTable_Init() { //repeatable denotes that an item in a vanilla playth itemTable[BOTTLE_WITH_ZORA_EGG] = Item(false, true, &HasBottle, Text{"Bottle with Zora Egg", "Bottle with Zora Egg", "Bottle with Zora Egg",}, BOTTLE_WITH_ZORA_EGG, (u32)GetItemID::GI_BOTTLE_ZORA_EGG, ITEMTYPE_ITEM); itemTable[BOTTLE_WITH_MUSHROOM] = Item(false, true, &HasBottle, Text{"Bottle with Mushroom", "Bottle with Mushroom", "Bottle with Mushroom",}, BOTTLE_WITH_MUSHROOM, (u32)GetItemID::GI_BOTTLE_MAGIC_MUSHROOM, ITEMTYPE_ITEM); itemTable[ZORA_EGG] = Item(false, true, &ZoraEgg, Text{"Zora Egg", "Oeuf de Zora", "Huevo de Zora"}, ZORA_EGG, (u32)GetItemID::GI_BOTTLE_ZORA_EGG, ITEMTYPE_ITEM); - itemTable[SEAHORSE] = Item(false, true, &Seahorse, Text{"Seahorse", "Hippocampe", "Caballo de mar"}, SEAHORSE, (u32)GetItemID::GI_BOTTLE_SEAHORSE, ITEMTYPE_ITEM); + itemTable[SEAHORSE] = Item(true, true, &Seahorse, Text{"Seahorse", "Hippocampe", "Caballo de mar"}, SEAHORSE, (u32)GetItemID::GI_BOTTLE_SEAHORSE, ITEMTYPE_ITEM); //Upgrades itemTable[RAZOR_SWORD] = Item(true, false, &RazorSword, Text{"Razor Sword", "Lame Rasoir", "Espada Afilada" }, RAZOR_SWORD, (u32)GetItemID::GI_RAZOR_SWORD, ITEMTYPE_ITEM ); @@ -128,6 +131,7 @@ void ItemTable_Init() { //repeatable denotes that an item in a vanilla playth //itemTable[SONG_OF_TIME] = Item(Text{"Song of Time", "Chant du temps", "Canción del tiempo"}, ITEMTYPE_SONG, 0xC5, true, &SongOfTime, SONG_OF_TIME, false,); itemTable[SONG_OF_STORMS] = Item(true, false, &SongOfStorms, Text{"Song of Storms", "Chant des tempêtes", "Canción de la tormenta"}, SONG_OF_STORMS, (u32)GetItemID::GI_NONE, ITEMTYPE_SONG); itemTable[SONATA_OF_AWAKENING] = Item(true, false, &SonataOfAwakening, Text{"Sonata of Awakening", "Sonate de i'Eveil", "Sonata del Despertar"}, SONATA_OF_AWAKENING, (u32)GetItemID::GI_NONE, ITEMTYPE_SONG ); + itemTable[LULLABY_INTRO] = Item(true, false, &LullabyIntro, Text{"Goron's Lullaby Intro", "Goron's Lullaby Intro", "Goron's Lullaby Intro"}, LULLABY_INTRO, (u32)GetItemID::GI_NONE, ITEMTYPE_SONG ); itemTable[GORONS_LULLABY] = Item(true, false, &GoronsLullaby, Text{"Goron's Lullaby", "Berceuse des Gorons", "Nana Goron"}, GORONS_LULLABY, (u32)GetItemID::GI_NONE, ITEMTYPE_SONG); itemTable[NEW_WAVE_BOSSA_NOVA] = Item(true, false, &NewWaveBossaNova, Text{"New Wave Bossa Nova", "Bossa Nova des Flots", "Nueva Bossanova"}, NEW_WAVE_BOSSA_NOVA, (u32)GetItemID::GI_NONE, ITEMTYPE_SONG ); itemTable[ELEGY_OF_EMPTINESS] = Item(true, false, &ElegyOfEmptiness, Text{"Elegy of Emptiness", "Hymne du Vida", "Elegia al Vacio"}, ELEGY_OF_EMPTINESS, (u32)GetItemID::GI_NONE, ITEMTYPE_SONG ); @@ -146,9 +150,9 @@ void ItemTable_Init() { //repeatable denotes that an item in a vanilla playth itemTable[CLOCK_TOWN_MAP] = Item(false, false, &noVariable, Text{"Clock Town Map", "Carte de Bourg-Clocher", "Mapa de la Cuidad Reloj"}, CLOCK_TOWN_MAP, (u32)GetItemID::GI_MAP_OF_CLOCK_TOWN, ITEMTYPE_MAP); itemTable[WOODFALL_MAP] = Item(false, false, &noVariable, Text{"Woodfall Map", "Carte du Bois-Cascade", "Mapa del Bosque Catarata"}, WOODFALL_MAP, (u32)GetItemID::GI_MAP_OF_WOODFALL, ITEMTYPE_MAP); itemTable[SNOWHEAD_MAP] = Item(false, false, &noVariable, Text{"Snowhead Map", "Carte du Pic Des Neiges", "Mapa del Pico Nevado"}, SNOWHEAD_MAP, (u32)GetItemID::GI_MAP_OF_SNOWHEAD, ITEMTYPE_MAP); - itemTable[GREAT_BAY_MAP] = Item(false, false, &noVariable, Text{"Great Bay Map", "Carte du Plage de la Grande Baie", "Mapa del Costa de la Gran Bahia"}, ROMANI_RANCH_MAP, (u32)GetItemID::GI_MAP_OF_ROMANI_RANCH, ITEMTYPE_MAP); - itemTable[STONE_TOWER_MAP] = Item(false, false, &noVariable, Text{"Stone Tower Map", "Carte du Forteresse de Pierre", "Mapa del Torre de Piedra"}, GREAT_BAY_MAP, (u32)GetItemID::GI_MAP_OF_GREAT_BAY, ITEMTYPE_MAP); - itemTable[ROMANI_RANCH_MAP] = Item(false, false, &noVariable, Text{"Romani Ranch Map", "Carte de Ranch Romani", "Mapa de Rancho Romani"}, STONE_TOWER_MAP, (u32)GetItemID::GI_MAP_OF_STONE_TOWER, ITEMTYPE_MAP); + itemTable[GREAT_BAY_MAP] = Item(false, false, &noVariable, Text{"Great Bay Map", "Carte du Plage de la Grande Baie", "Mapa del Costa de la Gran Bahia"}, GREAT_BAY_MAP, (u32)GetItemID::GI_MAP_OF_GREAT_BAY, ITEMTYPE_MAP); + itemTable[STONE_TOWER_MAP] = Item(false, false, &noVariable, Text{"Stone Tower Map", "Carte du Forteresse de Pierre", "Mapa del Torre de Piedra"}, STONE_TOWER_MAP, (u32)GetItemID::GI_MAP_OF_STONE_TOWER, ITEMTYPE_MAP); + itemTable[ROMANI_RANCH_MAP] = Item(false, false, &noVariable, Text{"Romani Ranch Map", "Carte de Ranch Romani", "Mapa de Rancho Romani"}, ROMANI_RANCH_MAP, (u32)GetItemID::GI_MAP_OF_ROMANI_RANCH, ITEMTYPE_MAP); itemTable[WOODFALL_TEMPLE_COMPASS] = Item(false, false, &noVariable, Text{"Woodfall Temple Compass", "Boussole de Temple de Bois-Cascade", "Brújula del Templo del Bosque Catarata"}, WOODFALL_TEMPLE_COMPASS, (u32)0xA7, ITEMTYPE_COMPASS ); itemTable[SNOWHEAD_TEMPLE_COMPASS] = Item(false, false, &noVariable, Text{"Snowhead Temple Compass", "Boussole de Temple du Pic des Neiges", "Brújula del Templo del Pico Nevado"}, SNOWHEAD_TEMPLE_COMPASS, (u32)0xA8, ITEMTYPE_COMPASS ); @@ -206,10 +210,6 @@ void ItemTable_Init() { //repeatable denotes that an item in a vanilla playth itemTable[RED_POTION_REFILL] = Item(false, true, &noVariable, Text{"Red Potion Refill", "Potion rouge", "Recarga de poción roja" }, RED_POTION_REFILL, (u32)GetItemID::GI_POTION_RED, ITEMTYPE_REFILL); itemTable[GREEN_POTION_REFILL] = Item(false, true, &noVariable, Text{"Green Potion Refill", "Potion verte", "Recarga de poción verde" }, GREEN_POTION_REFILL, (u32)GetItemID::GI_POTION_GREEN, ITEMTYPE_REFILL); itemTable[BLUE_POTION_REFILL] = Item(false, true, &noVariable, Text{"Blue Potion Refill", "Potion bleue", "Recarga de poción azul" }, BLUE_POTION_REFILL, (u32)GetItemID::GI_POTION_BLUE, ITEMTYPE_REFILL); - - itemTable[MAJORAS_MASK] = Item(true, false, &noVariable, Text{"Majora's Mask", "Majora's Mask", "Majora's Mask" }, MAJORAS_MASK, (u32)GetItemID::GI_ERROR_NOTHING_40, ITEMTYPE_EVENT); - itemTable[HINT] = Item(true, true, &noVariable, Text{"Hint", "Indice", "Pista" }, HINT, (u32)GetItemID::GI_ERROR_NOTHING_40, ITEMTYPE_EVENT); - //Shop Items Repeatable price itemTable[BUY_ARROWS_10] = Item(false, true, &noVariable, Text{"Buy Arrows (10)", "Acheter: Flèches (10)", "Comprar flechas (10)"}, BUY_ARROWS_10, (u32)GetItemID::GI_ARROWS_MEDIUM, ITEMTYPE_SHOP); itemTable[BUY_ARROWS_30] = Item(false, true, &noVariable, Text{"Buy Arrows (30)", "Acheter: Flèches (30)", "Comprar flechas (30)"}, BUY_ARROWS_30, (u32)GetItemID::GI_ARROWS_LARGE, ITEMTYPE_SHOP); @@ -229,8 +229,11 @@ void ItemTable_Init() { //repeatable denotes that an item in a vanilla playth itemTable[PROGRESSIVE_BOMB_BAG] = Item(true, false, &ProgressiveBombBag, Text{"Progressive Bomb Bag", "Sac de bombes (prog.)", "Saco de bombas progresivo" }, PROGRESSIVE_BOMB_BAG, 0x46, ITEMTYPE_ITEM); itemTable[PROGRESSIVE_BOW] = Item(true, false, &ProgressiveBow, Text{"Progressive Bow", "Arc (prog.)", "Arco progresivo" }, PROGRESSIVE_BOW, 0x47, ITEMTYPE_ITEM); itemTable[PROGRESSIVE_WALLET] = Item(true, false, &ProgressiveWallet, Text{"Progressive Wallet", "Bourse (prog.)", "Bolsa de rupias progresiva" }, PROGRESSIVE_WALLET, 0x48, ITEMTYPE_ITEM); - itemTable[PROGRESSIVE_MAGIC_METER] = Item(true, false, &ProgressiveMagic, Text{"Progressive Magic Meter", "Jauge de magie (prog.)", "Poder mágico progresivo" }, PROGRESSIVE_MAGIC_METER, 0x49, ITEMTYPE_ITEM); + itemTable[PROGRESSIVE_MAGIC_METER] = Item(true, false, &ProgressiveMagic, Text{"Progressive Magic Meter", "Jauge de magie (prog.)", "Poder mágico progresivo" }, PROGRESSIVE_MAGIC_METER, 0x49, ITEMTYPE_GFAIRY); + itemTable[MAJORAS_MASK] = Item(true, false, &noVariable, Text{"Majora's Mask", "Majora's Mask", "Majora's Mask" }, MAJORAS_MASK, (u32)GetItemID::GI_ERROR_NOTHING_40, ITEMTYPE_EVENT); + itemTable[HINT] = Item(true, true, &noVariable, Text{"Hint", "Indice", "Pista" }, HINT, (u32)GetItemID::GI_ERROR_NOTHING_40, ITEMTYPE_EVENT); + //itemTable[PROGRESSIVE_BOMBCHUS] = Item(Text{ "Progressive Bombchu", "Bombchus (prog.)", "Bombchus progresivos" }, ITEMTYPE_ITEM, 0x89, true, &Bombchus, PROGRESSIVE_BOMBCHUS, false, ); // itemTable[PROGRESSIVE_NUT_UPGRADE] = Item(Text{"Progressive Nut Capacity", "Capacité de noix (prog.)", "Capacidad de nueces deku progresiva"}, ITEMTYPE_ITEM, 0x87, false, &noVariable, PROGRESSIVE_NUT_UPGRADE, false,); // itemTable[PROGRESSIVE_STICK_UPGRADE] = Item(Text{"Progressive Stick Capacity", "Capacité de bâtons (prog.)", "Capacidad de palos deku progresiva"}, ITEMTYPE_ITEM, 0x88, false, &noVariable, PROGRESSIVE_STICK_UPGRADE, false,); @@ -240,4 +243,14 @@ void ItemTable_Init() { //repeatable denotes that an item in a vanilla playth Item& ItemTable(const ItemKey itemKey) { return itemTable[itemKey]; -}; \ No newline at end of file +}; + +//This function should only be used to place items containing hint text +//at gossip stone locations +void NewItem(const ItemKey itemKey, const Item item) { + if (itemKey <= PROGRESSIVE_MAGIC_METER) { + printf("\x1b[25;0HWARNING: ATTEMPTED TO OVERWRITE ITEM %lu\n", itemKey); + return; + } + itemTable[itemKey] = item; +} diff --git a/source/item_location.cpp b/source/item_location.cpp index 79d40c7..2b7d745 100644 --- a/source/item_location.cpp +++ b/source/item_location.cpp @@ -17,12 +17,12 @@ void LocationTable_Init() { //LocationTable itemlocation::type scene, flag, Repeatable, name hint key (hint_list.cpp) vanilla item categories collection check 376 Collection Check Group //Happy Mask Salesman - Starting Items - locationTable[HMS_SONG_OF_HEALING] = ItemLocation::Base (0x63, 0x54, false, "Song of Healing", HMS_SONG_OF_HEALING, SONG_OF_HEALING, {Category::cClockTower, Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(6), SpoilerCollectionCheckGroup::GROUP_NO_GROUP); + locationTable[HMS_SONG_OF_HEALING] = ItemLocation::Base (0x63, 0x54, false, "Song of Healing", HMS_SONG_OF_HEALING, SONG_OF_HEALING, {Category::cClockTower, Category::cDayOne, Category::cSong}, SpoilerCollectionCheck::ItemGetInf(6), SpoilerCollectionCheckGroup::GROUP_NO_GROUP); locationTable[CLOCK_TOWER_OCARINA_OF_TIME] = ItemLocation::Base (0x19, 0x4C, false, "Ocarina of Time", CLOCK_TOWER_OCARINA_OF_TIME, OCARINA_OF_TIME, {Category::cClockTower, Category::cDayThree}, SpoilerCollectionCheck::ItemGetInf(6), SpoilerCollectionCheckGroup::GROUP_NO_GROUP ); locationTable[HMS_DEKU_MASK] = ItemLocation::Base (0x63, 0x78, false, "Deku Mask", HMS_DEKU_MASK, DEKU_MASK, {Category::cClockTower, Category::cTransformMask}, SpoilerCollectionCheck::ItemGetInf(6), SpoilerCollectionCheckGroup::GROUP_NO_GROUP ); - locationTable[HMS_BOMBERS_NOTEBOOK] = ItemLocation::Base (0x63, 0x50, false, "Bombers Notebook", HMS_BOMBERS_NOTEBOOK, BOMBERS_NOTEBOOK, {Category::cClockTower, Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(6), SpoilerCollectionCheckGroup::GROUP_NO_GROUP ); - locationTable[HMS_STARTING_SWORD] = ItemLocation::Base (0x00, 0x37, false, "Starting Sword", HMS_STARTING_SWORD, PROGRESSIVE_SWORD, {Category::cClockTower}, SpoilerCollectionCheck::ItemGetInf(6), SpoilerCollectionCheckGroup::GROUP_NO_GROUP ); - locationTable[HMS_STARTING_SHIELD] = ItemLocation::Base (0x00, 0x32, false, "Starting Shield", HMS_STARTING_SHIELD, HEROS_SHIELD, {Category::cClockTower}, SpoilerCollectionCheck::ItemGetInf(6), SpoilerCollectionCheckGroup::GROUP_NO_GROUP ); + locationTable[HMS_BOMBERS_NOTEBOOK] = ItemLocation::Base (0x63, 0x50, false, "Bombers Notebook", HMS_BOMBERS_NOTEBOOK, BOMBERS_NOTEBOOK, {Category::cClockTower, Category::cDayOne, Category::cNotebook}, SpoilerCollectionCheck::ItemGetInf(6), SpoilerCollectionCheckGroup::GROUP_NO_GROUP ); + locationTable[HMS_STARTING_SWORD] = ItemLocation::Base (0x00, 0x37, false, "Starting Sword", HMS_STARTING_SWORD, PROGRESSIVE_SWORD, {Category::cClockTower, Category::cAlternateCheck}, SpoilerCollectionCheck::ItemGetInf(6), SpoilerCollectionCheckGroup::GROUP_NO_GROUP ); + locationTable[HMS_STARTING_SHIELD] = ItemLocation::Base (0x00, 0x32, false, "Starting Shield", HMS_STARTING_SHIELD, HEROS_SHIELD, {Category::cClockTower, Category::cAlternateCheck}, SpoilerCollectionCheck::ItemGetInf(6), SpoilerCollectionCheckGroup::GROUP_NO_GROUP ); //Deku Palace locationTable[DEKU_PALACE_BEAN_SELLER] = ItemLocation::Base (0x07, 0x35, true, "DP Bean Seller", DEKU_PALACE_BEAN_SELLER, MAGIC_BEAN, {Category::cDekuPalace,Category::cWoodfall,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_DEKU_PALACE ); @@ -32,17 +32,17 @@ void LocationTable_Init() { locationTable[DEKU_PALACE_BEAN_GROTTO_CHEST] = ItemLocation::Chest (0x07, 0x05, true, "DP Bean Grotto Chest", DEKU_PALACE_BEAN_GROTTO_CHEST, RED_RUPEE, {Category::cDekuPalace,Category::cGrotto,Category::cWoodfall,Category::cChest,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_DEKU_PALACE); //East Clock Town - locationTable[E_CLOCK_TOWN_AROMA_IN_BAR] = ItemLocation::Base (0x15, 0x6F, false, "ECT Milk Bar Madame Aroma", E_CLOCK_TOWN_AROMA_IN_BAR, CHATEAU_ROMANI, {Category::cEastClockTown, Category::cDayThree}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_E_CLOCK_TOWN ); - locationTable[E_CLOCK_TOWN_ARCHERY_1] = ItemLocation::Base (0x20, 0x47, false, "ECT Archery #1", E_CLOCK_TOWN_ARCHERY_1, PROGRESSIVE_BOW, {Category::cEastClockTown, Category::cMinigame,Category::cDayOne }, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_E_CLOCK_TOWN ); + locationTable[E_CLOCK_TOWN_AROMA_IN_BAR] = ItemLocation::Base (0x15, 0x6F, false, "ECT Milk Bar Madame Aroma", E_CLOCK_TOWN_AROMA_IN_BAR, CHATEAU_ROMANI, {Category::cEastClockTown, Category::cDayThree, Category::cMainInventory}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_E_CLOCK_TOWN ); + locationTable[E_CLOCK_TOWN_ARCHERY_1] = ItemLocation::Base (0x20, 0x47, false, "ECT Archery #1", E_CLOCK_TOWN_ARCHERY_1, PROGRESSIVE_BOW, {Category::cEastClockTown, Category::cMinigame,Category::cDayOne, Category::cMainInventory }, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_E_CLOCK_TOWN ); locationTable[E_CLOCK_TOWN_MAYOR] = ItemLocation::Base (0x12, 0x0C, false, "ECT Mayor Reward", E_CLOCK_TOWN_MAYOR, PIECE_OF_HEART, {Category::cEastClockTown, Category::cVanillaHeartPiece ,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_E_CLOCK_TOWN ); - locationTable[E_CLOCK_TOWN_ARCHERY_2] = ItemLocation::Base (0x20, 0x0C, true, "ECT Archery #2", E_CLOCK_TOWN_ARCHERY_2, PIECE_OF_HEART, {Category::cEastClockTown, Category::cMinigame , Category::cVanillaHeartPiece,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_E_CLOCK_TOWN ); - locationTable[E_CLOCK_TOWN_HONEY_DARLING_3DAYS] = ItemLocation::Base (0x11, 0x0C, true, "ECT Honey and Darling 3 Days", E_CLOCK_TOWN_HONEY_DARLING_3DAYS, PIECE_OF_HEART, {Category::cEastClockTown, Category::cMinigame , Category::cVanillaHeartPiece,Category::cDayThree}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_E_CLOCK_TOWN ); + locationTable[E_CLOCK_TOWN_ARCHERY_2] = ItemLocation::Base (0x20, 0x0C, false, "ECT Archery #2", E_CLOCK_TOWN_ARCHERY_2, PIECE_OF_HEART, {Category::cEastClockTown, Category::cMinigame , Category::cVanillaHeartPiece,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_E_CLOCK_TOWN ); + locationTable[E_CLOCK_TOWN_HONEY_DARLING_3DAYS] = ItemLocation::Base (0x11, 0x0C, false, "ECT Honey and Darling 3 Days", E_CLOCK_TOWN_HONEY_DARLING_3DAYS, PIECE_OF_HEART, {Category::cEastClockTown, Category::cMinigame , Category::cVanillaHeartPiece,Category::cDayThree}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_E_CLOCK_TOWN ); locationTable[E_CLOCK_TOWN_TREASURE_CHEST_GAME_GORON] = ItemLocation::Chest (0x17, 0x00, true, "ECT Treasure Chest Game (Goron)", E_CLOCK_TOWN_TREASURE_CHEST_GAME_GORON, PIECE_OF_HEART, {Category::cEastClockTown, Category::cMinigame, Category::cVanillaHeartPiece,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_E_CLOCK_TOWN ); - locationTable[E_CLOCK_TOWN_POSTMAN_FREEDOM] = ItemLocation::Base (0x6C, 0x84, true, "ECT Postman's Freedom", E_CLOCK_TOWN_POSTMAN_FREEDOM, POSTMANS_HAT, {Category::cEastClockTown, Category::cVanillaMask,Category::cDayThree}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_E_CLOCK_TOWN ); + locationTable[E_CLOCK_TOWN_POSTMAN_FREEDOM] = ItemLocation::Base (0x6C, 0x84, false, "ECT Postman's Freedom", E_CLOCK_TOWN_POSTMAN_FREEDOM, POSTMANS_HAT, {Category::cEastClockTown, Category::cVanillaMask,Category::cDayThree}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_E_CLOCK_TOWN ); locationTable[E_CLOCK_TOWN_GORMAN] = ItemLocation::Base (0x15, 0x83, false, "ECT Milk Bar Gorman", E_CLOCK_TOWN_GORMAN, CIRCUS_LEADERS_MASK, {Category::cEastClockTown, Category::cVanillaMask,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_E_CLOCK_TOWN ); - locationTable[E_CLOCK_TOWN_AROMA_IN_OFFICE] = ItemLocation::Base (0x12, 0x8F, false, "ECT Mayor's Office Madame Aroma", E_CLOCK_TOWN_AROMA_IN_OFFICE, KAFEIS_MASK, {Category::cEastClockTown, Category::cVanillaMask,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_E_CLOCK_TOWN ); - locationTable[BOMBERS_HIDEOUT_CHEST] = ItemLocation::Chest (0x29, 0x00, true, "Bombers' Hideout Chest", BOMBERS_HIDEOUT_CHEST, SILVER_RUPEE, {Category::cEastClockTown,Category::cChest,Category::cDayOne }, SpoilerCollectionCheckGroup::GROUP_E_CLOCK_TOWN ); - locationTable[E_CLOCK_TOWN_CHEST] = ItemLocation::Chest (0x6C, 0x0A, true, "ECT Chest", E_CLOCK_TOWN_CHEST, SILVER_RUPEE, {Category::cEastClockTown,Category::cChest ,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_E_CLOCK_TOWN ); + locationTable[E_CLOCK_TOWN_AROMA_IN_OFFICE] = ItemLocation::Base (0x12, 0x8F, false, "ECT Mayor's Office Madame Aroma", E_CLOCK_TOWN_AROMA_IN_OFFICE, KAFEIS_MASK, {Category::cEastClockTown, Category::cDayOne, Category::cAnjuAndKafei}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_E_CLOCK_TOWN ); + locationTable[BOMBERS_HIDEOUT_CHEST] = ItemLocation::Chest (0x29, 0x00, true, "Bombers' Hideout Chest", BOMBERS_HIDEOUT_CHEST, SILVER_RUPEE, {Category::cEastClockTown, Category::cChest,Category::cDayOne }, SpoilerCollectionCheckGroup::GROUP_E_CLOCK_TOWN ); + locationTable[E_CLOCK_TOWN_CHEST] = ItemLocation::Chest (0x6C, 0x0A, true, "ECT Chest", E_CLOCK_TOWN_CHEST, SILVER_RUPEE, {Category::cEastClockTown, Category::cChest ,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_E_CLOCK_TOWN ); //locationTable[E_CLOCK_TOWN_MILK_BAR_CHATEAU] = ItemLocation::Base (0x12, 0x00, true, "Milk Bar Chateau Buy", E_CLOCK_TOWN_MILK_BAR_CHATEAU, CHATEAU_ROMANI, {Category::cEastClockTown}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_E_CLOCK_TOWN ); //locationTable[E_CLOCK_TOWN_MILK_BAR_MILK] = ItemLocation::Base (0x12, 0x00, true, "Milk Bar Milk Buy", E_CLOCK_TOWN_MILK_BAR_MILK, MILK, {Category::cEastClockTown}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_E_CLOCK_TOWN ); //locationTable[E_CLOCK_TOWN_HONEY_DARLING_ANY_DAY] = ItemLocation::Base (0x11, 0x00, true, "Honey and Darling Any Day", E_CLOCK_TOWN_HONEY_DARLING_ANY_DAY, PURPLE_RUPEE, {Category::cEClockTown,Category::cMinigame}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_E_CLOCK_TOWN ); @@ -52,70 +52,75 @@ void LocationTable_Init() { locationTable[E_CLOCK_TOWN_POSTBOX] = ItemLocation::Base (0x6C, 0xBA, false, "ECT Postbox", E_CLOCK_TOWN_POSTBOX, PIECE_OF_HEART, {Category::cEastClockTown, Category::cVanillaHeartPiece,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_E_CLOCK_TOWN ); //Goron Village - locationTable[GORON_VILLAGE_POWDER_KEG_CHALLENGE] = ItemLocation::Base (0x48, 0x34, true, "GV Powder Keg Challenge", GORON_VILLAGE_POWDER_KEG_CHALLENGE, POWDER_KEG, {Category::cGoronVillage,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_GORON_VILLAGE ); - locationTable[GORON_VILLAGE_SCRUB_PURCHASE] = ItemLocation::Base (0x3D, 0x1D, false, "GV Scrub Purchase", GORON_VILLAGE_SCRUB_PURCHASE, PROGRESSIVE_BOMB_BAG, {Category::cGoronVillage, Category::cDekuScrub,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_GORON_VILLAGE ); - locationTable[GORON_VILLAGE_LENS_OF_TRUTH_CHEST] = ItemLocation::Chest (0x07, 0x01, true, "GV Lens of Truth Chest", GORON_VILLAGE_LENS_OF_TRUTH_CHEST, LENS_OF_TRUTH, {Category::cGoronVillage,Category::cChest,Category::cDayOne }, SpoilerCollectionCheckGroup::GROUP_GORON_VILLAGE ); - locationTable[GORON_VILLAGE_SCRUB_TRADE] = ItemLocation::Base (0x4D, 0x99, true, "GV Deku Scrub Merchant Trade", GORON_VILLAGE_SCRUB_TRADE, MOUNTAIN_TITLE, {Category::cGoronVillage, Category::cDekuScrub,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_GORON_VILLAGE ); - locationTable[GORON_VILLAGE_LEDGE] = ItemLocation::Collectable(0x4D, 0x00, false, "GV Piece of Heart", GORON_VILLAGE_LEDGE, PIECE_OF_HEART, {Category::cGoronVillage, Category::cVanillaHeartPiece,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_GORON_VILLAGE ); - locationTable[GORON_VILLAGE_GORON_LULLABY] = ItemLocation::Base (0x32, 0x4D, false, "GV Goron Lullaby", GORON_VILLAGE_GORON_LULLABY, GORONS_LULLABY, {Category::cGoronVillage, Category::cSong,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_GORON_VILLAGE ); - locationTable[LENS_CAVE_RED_RUPEE] = ItemLocation::Chest (0x07, 0x03, true, "GV Lens Cave Invisible Chest", LENS_CAVE_RED_RUPEE, RED_RUPEE, {Category::cGoronVillage,Category::cChest ,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_GORON_VILLAGE ); - locationTable[LENS_CAVE_PURPLE_RUPEE] = ItemLocation::Chest (0x07, 0x06, true, "GV Lens Cave Rock Chest", LENS_CAVE_PURPLE_RUPEE, PURPLE_RUPEE, {Category::cGoronVillage,Category::cChest ,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_GORON_VILLAGE ); - + locationTable[GORON_VILLAGE_POWDER_KEG_CHALLENGE] = ItemLocation::Base (0x4D, 0x34, false, "GV Powder Keg Challenge", GORON_VILLAGE_POWDER_KEG_CHALLENGE, POWDER_KEG, {Category::cGoronVillage, Category::cDayOne, Category::cMainInventory}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_GORON_VILLAGE ); + locationTable[GORON_VILLAGE_SCRUB_PURCHASE] = ItemLocation::Base (0x4D, 0x1D, false, "GV Scrub Purchase", GORON_VILLAGE_SCRUB_PURCHASE, PROGRESSIVE_BOMB_BAG, {Category::cGoronVillage, Category::cDekuScrub,Category::cDayOne, Category::cShop, Category::cMainInventory}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_GORON_VILLAGE ); + locationTable[GORON_VILLAGE_LENS_OF_TRUTH_CHEST] = ItemLocation::Chest (0x07, 0x01, true, "GV Lens of Truth Chest", GORON_VILLAGE_LENS_OF_TRUTH_CHEST, LENS_OF_TRUTH, {Category::cGoronVillage, Category::cChest, Category::cDayOne, Category::cMainInventory }, SpoilerCollectionCheckGroup::GROUP_GORON_VILLAGE ); + locationTable[GORON_VILLAGE_SCRUB_TRADE] = ItemLocation::Base (0x4D, 0x99, true, "GV Deku Scrub Merchant Trade", GORON_VILLAGE_SCRUB_TRADE, MOUNTAIN_TITLE, {Category::cGoronVillage, Category::cDekuScrub, Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_GORON_VILLAGE ); + locationTable[GORON_VILLAGE_LEDGE] = ItemLocation::Collectable(0x4D, 0x00, false, "GV Piece of Heart", GORON_VILLAGE_LEDGE, PIECE_OF_HEART, {Category::cGoronVillage, Category::cVanillaHeartPiece, Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_GORON_VILLAGE ); + locationTable[GORON_VILLAGE_GORON_LULLABY] = ItemLocation::Base (0x32, 0x4D, false, "GV Goron Lullaby", GORON_VILLAGE_GORON_LULLABY, GORONS_LULLABY, {Category::cGoronVillage, Category::cSong, Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_GORON_VILLAGE ); + locationTable[LENS_CAVE_RED_RUPEE] = ItemLocation::Chest (0x07, 0x03, true, "GV Lens Cave Invisible Chest", LENS_CAVE_RED_RUPEE, RED_RUPEE, {Category::cGoronVillage, Category::cChest ,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_GORON_VILLAGE ); + locationTable[LENS_CAVE_PURPLE_RUPEE] = ItemLocation::Chest (0x07, 0x06, true, "GV Lens Cave Rock Chest", LENS_CAVE_PURPLE_RUPEE, PURPLE_RUPEE, {Category::cGoronVillage, Category::cChest ,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_GORON_VILLAGE ); + locationTable[GORON_VILLAGE_POWDER_KEG_CHALLENGE_SPRING] = ItemLocation::Base (0x48, 0x34, false, "GV Powder Keg Challenge (Spring)", GORON_VILLAGE_POWDER_KEG_CHALLENGE_SPRING, POWDER_KEG, {Category::cGoronVillage, Category::cDayOne, Category::cAlternateCheck}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_GORON_VILLAGE ); + locationTable[GORON_VILLAGE_SCRUB_PURCHASE_SPRING] = ItemLocation::Base (0x48, 0x1D, false, "GV Scrub Purchase (Spring)", GORON_VILLAGE_SCRUB_PURCHASE_SPRING, PROGRESSIVE_BOMB_BAG, {Category::cGoronVillage, Category::cDekuScrub,Category::cDayOne, Category::cShop, Category::cAlternateCheck}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_GORON_VILLAGE ); + locationTable[GORON_VILLAGE_SCRUB_TRADE_SPRING] = ItemLocation::Base (0x48, 0x99, true, "GV Deku Scrub Merchant Trade (Spring)", GORON_VILLAGE_SCRUB_TRADE_SPRING, MOUNTAIN_TITLE, {Category::cGoronVillage, Category::cDekuScrub,Category::cDayOne, Category::cAlternateCheck}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_GORON_VILLAGE ); + locationTable[GORON_VILLAGE_LEDGE_SPRING] = ItemLocation::Collectable(0x48, 0x00, false, "GV Piece of Heart (Spring)", GORON_VILLAGE_LEDGE_SPRING, PIECE_OF_HEART, {Category::cGoronVillage, Category::cVanillaHeartPiece,Category::cDayOne, Category::cAlternateCheck}, SpoilerCollectionCheckGroup::GROUP_GORON_VILLAGE ); + //Great Bay Coast - locationTable[GBC_OCEAN_SPIDER_DAY1] = ItemLocation::Base (0x28, 0x48, false, "OSH Day 1 Reward", GBC_OCEAN_SPIDER_DAY1, PROGRESSIVE_WALLET, {Category::cGreatBayCoast ,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_GREAT_BAY_COAST ); + locationTable[GBC_OCEAN_SPIDER_DAY1] = ItemLocation::Base (0x28, 0x48, false, "OSH Reward", GBC_OCEAN_SPIDER_DAY1, PROGRESSIVE_WALLET, {Category::cGreatBayCoast ,Category::cDayOne, Category::cMainInventory}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_GREAT_BAY_COAST ); //locationTable[GBC_OCEAN_SPIDER_DAY2] = ItemLocation::Base (0x28, 0x00, true, "OSH Day 2 Reward", GBC_OCEAN_SPIDER_DAY2, PURPLE_RUPEE, {Category::cGreatBayCoast ,Category::cDayTwo}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_GREAT_BAY_COAST ); //locationTable[GBC_OCEAN_SPIDER_DAY3] = ItemLocation::Base (0x28, 0x00, true, "OSH Day 3 Reward", GBC_OCEAN_SPIDER_DAY3, RED_RUPEE, {Category::cGreatBayCoast,Category::cDayThree}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_GREAT_BAY_COAST ); - locationTable[GBC_FISHERMAN_GAME] = ItemLocation::Base (0x37, 0x06, false, "GBC Fisherman's Game", GBC_FISHERMAN_GAME, PIECE_OF_HEART, {Category::cGreatBayCoast, Category::cMinigame,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_GREAT_BAY_COAST ); - locationTable[GBC_OCEAN_SPIDER_CHEST] = ItemLocation::Chest (0x28, 0x00, false, "OSH Chest", GBC_OCEAN_SPIDER_CHEST, PIECE_OF_HEART, {Category::cGreatBayCoast, Category::cVanillaHeartPiece ,Category::cDayOne,Category::cChest}, SpoilerCollectionCheckGroup::GROUP_GREAT_BAY_COAST ); + locationTable[GBC_FISHERMAN_GAME] = ItemLocation::Base (0x37, 0x0C, false, "GBC Fisherman's Game", GBC_FISHERMAN_GAME, PIECE_OF_HEART, {Category::cGreatBayCoast, Category::cVanillaHeartPiece, Category::cMinigame,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_GREAT_BAY_COAST ); + locationTable[GBC_OCEAN_SPIDER_CHEST] = ItemLocation::Chest (0x28, 0x00, false, "OSH Chest", GBC_OCEAN_SPIDER_CHEST, PIECE_OF_HEART, {Category::cGreatBayCoast, Category::cVanillaHeartPiece, Category::cDayOne,Category::cChest}, SpoilerCollectionCheckGroup::GROUP_GREAT_BAY_COAST ); locationTable[GBC_LAB_FISH] = ItemLocation::Collectable(0x2F, 0x00, false, "GBC Marine Lab Fish HP", GBC_LAB_FISH, PIECE_OF_HEART, {Category::cGreatBayCoast, Category::cVanillaHeartPiece,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_GREAT_BAY_COAST ); locationTable[GBC_LEDGE] = ItemLocation::Collectable(0x37, 0x00, false, "GBC Ledge", GBC_LEDGE, PIECE_OF_HEART, {Category::cGreatBayCoast, Category::cVanillaHeartPiece,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_GREAT_BAY_COAST ); locationTable[GBC_MIKAU] = ItemLocation::Base (0x37, 0x7A, false, "GBC Mikau", GBC_MIKAU, ZORA_MASK, {Category::cGreatBayCoast, Category::cTransformMask,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_GREAT_BAY_COAST ); locationTable[GBC_BABY_ZORAS] = ItemLocation::Base (0x2F, 0x4E, false, "GBC Marine Lab Baby Zoras", GBC_BABY_ZORAS, NEW_WAVE_BOSSA_NOVA, {Category::cGreatBayCoast, Category::cSong,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_GREAT_BAY_COAST ); - locationTable[GBC_GROTTO_CHEST] = ItemLocation::Chest (0x07, 0x17, true, "GBC Grotto Chest", GREAT_BAY_COAST_GROTTO, RED_RUPEE, {Category::cGreatBayCoast,Category::cGrotto,Category::cChest ,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_GREAT_BAY_COAST ); - locationTable[GBC_FISHERMAN_PHOTO] = ItemLocation::Base (0x3C, 0x95, true, "GBC Fisherman Photo", GBC_FISHERMAN_PHOTO, SEAHORSE, {Category::cGreatBayCoast,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_GREAT_BAY_COAST ); + locationTable[GBC_GROTTO_CHEST] = ItemLocation::Chest (0x07, 0x17, true, "GBC Grotto Chest", GREAT_BAY_COAST_GROTTO, RED_RUPEE, {Category::cGreatBayCoast, Category::cGrotto,Category::cChest ,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_GREAT_BAY_COAST ); + locationTable[GBC_FISHERMAN_PHOTO] = ItemLocation::Base (0x3C, 0x95, false, "GBC Fisherman Photo", GBC_FISHERMAN_PHOTO, SEAHORSE, {Category::cGreatBayCoast, Category::cMainInventory}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_GREAT_BAY_COAST ); //Ikana Canyon - locationTable[IKANA_CANYON_GREAT_FAIRY] = ItemLocation::Base (0x26, 0x3B, false, "IC Great Fairy", IKANA_CANYON_GREAT_FAIRY, GREAT_FAIRYS_SWORD, {Category::cIkanaCanyon,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_IKANA_CANYON ); - locationTable[IKANA_CANYON_POE_HUT_HP] = ItemLocation::Base (0x51, 0x06, false, "IC Poe Hut", IKANA_CANYON_POE_HUT_HP, PIECE_OF_HEART, {Category::cIkanaCanyon, Category::cVanillaHeartPiece,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_IKANA_CANYON ); + locationTable[IKANA_CANYON_GREAT_FAIRY] = ItemLocation::Base (0x26, 0x3B, false, "IC Great Fairy", IKANA_CANYON_GREAT_FAIRY, GREAT_FAIRYS_SWORD, {Category::cIkanaCanyon, Category::cDayOne, Category::cFairyFountain, Category::cMainInventory}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_IKANA_CANYON ); + locationTable[IKANA_CANYON_POE_HUT_HP] = ItemLocation::Base (0x51, 0x0C, false, "IC Poe Hut", IKANA_CANYON_POE_HUT_HP, PIECE_OF_HEART, {Category::cIkanaCanyon, Category::cVanillaHeartPiece,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_IKANA_CANYON ); locationTable[IKANA_CANYON_LEDGE] = ItemLocation::Collectable(0x13, 0x00, false, "IC Ledge", IKANA_CANYON_LEDGE, PIECE_OF_HEART, {Category::cIkanaCanyon, Category::cVanillaHeartPiece,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_IKANA_CANYON ); locationTable[IKANA_CANYON_PAMELAS_FATHER] = ItemLocation::Base (0x55, 0x87, false, "IC Pamela's Father", IKANA_CANYON_PAMELAS_FATHER, GIBDOS_MASK, {Category::cIkanaCanyon, Category::cVanillaMask,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_IKANA_CANYON ); locationTable[IKANA_CANYON_SECRET_SHRINE_GROTTO_CHEST] = ItemLocation::Chest (0x07, 0x14, true, "IC Secret Shrine Grotto", IKANA_CANYON_SECRET_SHRINE_GROTTO_CHEST, BOMBCHU_5, {Category::cIkanaCanyon, Category::cGrotto,Category::cChest ,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_IKANA_CANYON ); locationTable[IKANA_CANYON_SCRUB_TRADE] = ItemLocation::Base (0x13, 0x07, true, "IC Deku Scrub Merchant Trade", IKANA_CANYON_SCRUB_TRADE, HUGE_RUPEE, {Category::cIkanaCanyon, Category::cDekuScrub,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_IKANA_CANYON ); - locationTable[IKANA_CANYON_SCRUB_PURCHASE] = ItemLocation::Base (0x13, 0x5D, true, "IC Deku Scrub Merchant Purchase", IKANA_CANYON_SCRUB_PURCHASE, BLUE_POTION_REFILL, {Category::cIkanaCanyon, Category::cDekuScrub,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_IKANA_CANYON ); + locationTable[IKANA_CANYON_SCRUB_PURCHASE] = ItemLocation::Base (0x13, 0x5D, true, "IC Deku Scrub Merchant Purchase", IKANA_CANYON_SCRUB_PURCHASE, BLUE_POTION_REFILL, {Category::cIkanaCanyon, Category::cDekuScrub,Category::cDayOne, Category::cShop}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_IKANA_CANYON ); //Ikana Graveyard - locationTable[IKANA_GRAVEYARD_DAMPE_DIGGING] = ItemLocation::Chest (0x30, 0x00, false, "IG Dampe Digging", IKANA_GRAVEYARD_DAMPE_DIGGING, PIECE_OF_HEART, {Category::cIkanaGraveyard, Category::cMinigame,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_IKANA_GRAVEYARD ); - locationTable[IKANA_GRAVEYARD_IRON_KNUCKLE_CHEST] = ItemLocation::Chest (0x0C, 0x04, false, "IG Iron Knuckle Chest", IKANA_GRAVEYARD_IRON_KNUCKLE_CHEST, PIECE_OF_HEART, {Category::cIkanaGraveyard, Category::cVanillaHeartPiece, Category::cChest, Category::cDayTwo}, SpoilerCollectionCheckGroup::GROUP_IKANA_GRAVEYARD ); - locationTable[IKANA_GRAVEYARD_CAPTAIN_KEETA_CHEST] = ItemLocation::Chest (0x0C, 0x7C, false, "IG Captain Keeta's Chest", IKANA_GRAVEYARD_CAPTAIN_KEETA_CHEST, CAPTAINS_HAT, {Category::cIkanaGraveyard, Category::cVanillaMask,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_IKANA_GRAVEYARD ); + locationTable[IKANA_GRAVEYARD_DAMPE_DIGGING] = ItemLocation::Chest (0x30, 0x10, false, "IG Dampe Digging", IKANA_GRAVEYARD_DAMPE_DIGGING, PIECE_OF_HEART, {Category::cIkanaGraveyard, Category::cVanillaHeartPiece, Category::cMinigame,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_IKANA_GRAVEYARD ); + locationTable[IKANA_GRAVEYARD_IRON_KNUCKLE_CHEST] = ItemLocation::Chest (0x0C, 0x00, false, "IG Iron Knuckle Chest", IKANA_GRAVEYARD_IRON_KNUCKLE_CHEST, PIECE_OF_HEART, {Category::cIkanaGraveyard, Category::cVanillaHeartPiece, Category::cChest, Category::cDayTwo}, SpoilerCollectionCheckGroup::GROUP_IKANA_GRAVEYARD ); + locationTable[IKANA_GRAVEYARD_CAPTAIN_KEETA_CHEST] = ItemLocation::Chest (0x43, 0x00, false, "IG Captain Keeta's Chest", IKANA_GRAVEYARD_CAPTAIN_KEETA_CHEST, CAPTAINS_HAT, {Category::cIkanaGraveyard, Category::cVanillaMask,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_IKANA_GRAVEYARD ); locationTable[IKANA_GRAVEYARD_DAY_ONE_GRAVE_TABLET] = ItemLocation::Base (0x0C, 0x73, false, "IG Day 1 Grave Tablet", IKANA_GRAVEYARD_DAY_ONE_GRAVE_TABLET, SONG_OF_STORMS, {Category::cIkanaGraveyard, Category::cSong,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_IKANA_GRAVEYARD ); - locationTable[IKANA_GRAVEYARD_DAY_ONE_GRAVE_BATS] = ItemLocation::Chest (0x0C, 0x03, true, "IG Day 1 Grave Bats", IKANA_GRAVEYARD_DAY_ONE_GRAVE_BATS, PURPLE_RUPEE, {Category::cIkanaGraveyard,Category::cChest ,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_IKANA_GRAVEYARD ); + locationTable[IKANA_GRAVEYARD_DAY_ONE_GRAVE_BATS] = ItemLocation::Chest (0x0C, 0x03, true, "IG Day 1 Grave Bats", IKANA_GRAVEYARD_DAY_ONE_GRAVE_BATS, PURPLE_RUPEE, {Category::cIkanaGraveyard, Category::cChest ,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_IKANA_GRAVEYARD ); locationTable[IKANA_GRAVEYARD_GROTTO_CHEST] = ItemLocation::Chest (0x07, 0x18, true, "IG Grotto", IKANA_GRAVEYARD_GROTTO_CHEST, BOMBCHU_5, {Category::cIkanaGraveyard, Category::cGrotto,Category::cChest ,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_IKANA_GRAVEYARD ); //Laundry Pool - locationTable[LAUNDRY_POOL_KAFEI] = ItemLocation::Base (0x0D, 0xAB, true, "LP Kafei's Pendant", LAUNDRY_POOL_KAFEI, PENDANT_MEMORIES, {Category::cLaundryPool,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_LAUNDRY_POOL ); + locationTable[LAUNDRY_POOL_KAFEI] = ItemLocation::Base (0x0D, 0xAB, true, "LP Kafei's Pendant", LAUNDRY_POOL_KAFEI, PENDANT_MEMORIES, {Category::cLaundryPool,Category::cDayOne, Category::cAnjuAndKafei}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_LAUNDRY_POOL ); locationTable[LAUNDRY_POOL_CURIOSITY_SHOP_MAN_ONE] = ItemLocation::Base (0x0D, 0x80, false, "LP Curiosity Shop Man 1", LAUNDRY_POOL_CURIOSITY_SHOP_MAN_ONE, KEATON_MASK, {Category::cLaundryPool, Category::cVanillaMask,Category::cDayThree}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_LAUNDRY_POOL ); - locationTable[LAUNDRY_POOL_CURIOSITY_SHOP_MAN_TWO] = ItemLocation::Base (0x0D, 0xA1, true, "LP Curiosity Shop Man 2", LAUNDRY_POOL_CURIOSITY_SHOP_MAN_TWO, LETTER_MAMA, {Category::cLaundryPool,Category::cDayThree}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_LAUNDRY_POOL ); + locationTable[LAUNDRY_POOL_CURIOSITY_SHOP_MAN_TWO] = ItemLocation::Base (0x0D, 0xA1, true, "LP Curiosity Shop Man 2", LAUNDRY_POOL_CURIOSITY_SHOP_MAN_TWO, LETTER_MAMA, {Category::cLaundryPool,Category::cDayThree, Category::cAnjuAndKafei}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_LAUNDRY_POOL ); locationTable[LAUNDRY_POOL_GURU_GURU] = ItemLocation::Base (0x70, 0x8C, false, "LP Guru Guru", LAUNDRY_POOL_GURU_GURU, BREMEN_MASK, {Category::cLaundryPool, Category::cVanillaMask,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_LAUNDRY_POOL ); //Milk Road locationTable[MILK_ROAD_GORMAN_RACE] = ItemLocation::Base (0x6A, 0x81, false, "MR Gorman Track Race", MILK_ROAD_GORMAN_RACE, GAROS_MASK, {Category::cMilkRoad, Category::cMinigame, Category::cVanillaMask,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_MILK_ROAD ); - locationTable[MILK_ROAD_GORMAN_MILK_BUY] = ItemLocation::Base (0x6A, 0x92, true, "MR Gorman Track Milk Purchase", MILK_ROAD_GORMAN_MILK_BUY, MILK, {Category::cMilkRoad,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_MILK_ROAD ); - locationTable[GORMAN_TRACK_MYSTERY_MILK_QUEST] = ItemLocation::Base (0x6A, 0x70, false, "MR Gorman's Mystery Milk Quest", GORMAN_TRACK_MYSTERY_MILK_QUEST, BOTTLE_WITH_MYSTERY_MILK, {Category::cMilkRoad,Category::cDayTwo}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_MILK_ROAD ); - locationTable[MILK_ROAD_KEATON_QUIZ] = ItemLocation::Base (0x6A, 0x0C, false, "MR Keaton Quiz", MILK_ROAD_KEATON_QUIZ, PIECE_OF_HEART, {Category::cMilkRoad, Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_MILK_ROAD ); + locationTable[MILK_ROAD_GORMAN_MILK_BUY] = ItemLocation::Base (0x6A, 0x92, true, "MR Gorman Track Milk Purchase", MILK_ROAD_GORMAN_MILK_BUY, MILK, {Category::cMilkRoad,Category::cDayOne, Category::cShop}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_MILK_ROAD ); + locationTable[GORMAN_TRACK_MYSTERY_MILK_QUEST] = ItemLocation::Base (0x6A, 0x70, false, "MR Gorman's Mystery Milk Quest", GORMAN_TRACK_MYSTERY_MILK_QUEST, BOTTLE_WITH_MYSTERY_MILK, {Category::cMilkRoad, Category::cMainInventory}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_MILK_ROAD ); + locationTable[MILK_ROAD_KEATON_QUIZ] = ItemLocation::Base (0x22, 0x03, false, "MR Keaton Quiz", MILK_ROAD_KEATON_QUIZ, PIECE_OF_HEART, {Category::cMilkRoad, Category::cVanillaHeartPiece, Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_MILK_ROAD ); //Mountain Village - locationTable[MOUNTAIN_VILLAGE_SMITH_DAY_ONE] = ItemLocation::Base (0x2C, 0x4A, false, "MV Smith Day 1", MOUNTAIN_VILLAGE_SMITH_DAY_ONE, RAZOR_SWORD, {Category::cMountainVillage,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_MOUNTAIN_VILLAGE ); - locationTable[MOUNTAIN_VILLAGE_SMITH_DAY_TWO] = ItemLocation::Base (0x2C, 0x4A, false, "MV Smith Day 2", MOUNTAIN_VILLAGE_SMITH_DAY_TWO, GILDED_SWORD, {Category::cMountainVillage,Category::cDayTwo}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_MOUNTAIN_VILLAGE ); + locationTable[MOUNTAIN_VILLAGE_SMITH_DAY_ONE] = ItemLocation::Base (0x2C, 0x38, false, "MV Razor Sword", MOUNTAIN_VILLAGE_SMITH_DAY_ONE, RAZOR_SWORD, {Category::cMountainVillage,Category::cDayOne, Category::cMainInventory}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_MOUNTAIN_VILLAGE ); + locationTable[MOUNTAIN_VILLAGE_SMITH_DAY_TWO] = ItemLocation::Base (0x2C, 0x39, false, "MV Gilded Sword", MOUNTAIN_VILLAGE_SMITH_DAY_TWO, GILDED_SWORD, {Category::cMountainVillage,Category::cDayTwo, Category::cMainInventory}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_MOUNTAIN_VILLAGE ); locationTable[MOUNTAIN_VILLAGE_FROG_CHOIR] = ItemLocation::Base (0x5A, 0x0C, false, "MV Frog Choir", MOUNTAIN_VILLAGE_FROG_CHOIR, PIECE_OF_HEART, {Category::cMountainVillage, Category::cVanillaHeartPiece,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_MOUNTAIN_VILLAGE ); locationTable[MOUNTAIN_VILLAGE_DARMANI] = ItemLocation::Base (0x4E, 0x79, false, "MV Graveyard Darmani", MOUNTAIN_VILLAGE_DARMANI, GORON_MASK, {Category::cMountainVillage, Category::cTransformMask,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_MOUNTAIN_VILLAGE ); locationTable[MOUNTAIN_VILLAGE_HUNGRY_GORON] = ItemLocation::Base (0x50, 0x88, false, "MV Hungry Goron", MOUNTAIN_VILLAGE_HUNGRY_GORON, DON_GEROS_MASK, {Category::cMountainVillage, Category::cVanillaMask,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_MOUNTAIN_VILLAGE ); locationTable[MOUNTAIN_WATERFALL_CHEST] = ItemLocation::Chest (0x5A, 0x00, true, "MV Waterfall Chest", MOUNTAIN_WATERFALL_CHEST, RED_RUPEE, {Category::cMountainVillage,Category::cChest,Category::cDayOne }, SpoilerCollectionCheckGroup::GROUP_MOUNTAIN_VILLAGE ); locationTable[MOUNTAIN_VILLAGE_SPRING_WATER_GROTTO_CHEST] = ItemLocation::Chest (0x07, 0x1B, true, "MV Spring Water Grotto", MOUNTAIN_VILLAGE_SPRING_WATER_GROTTO_CHEST, RED_RUPEE, {Category::cMountainVillage, Category::cGrotto,Category::cChest,Category::cDayOne }, SpoilerCollectionCheckGroup::GROUP_MOUNTAIN_VILLAGE ); - + locationTable[MOUNTAIN_VILLAGE_KEATON_QUIZ] = ItemLocation::Base (0x5A, 0x03, false, "MV Keaton Quiz", MOUNTAIN_VILLAGE_KEATON_QUIZ, PIECE_OF_HEART, {Category::cMountainVillage, Category::cVanillaHeartPiece,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_MOUNTAIN_VILLAGE ); + //N Clock Town locationTable[N_CLOCK_TOWN_GREAT_FAIRY_DEKU] = ItemLocation::Base (0x26, 0x0E, false, "NCT Great Fairy (Deku)", N_CLOCK_TOWN_GREAT_FAIRY_DEKU, PROGRESSIVE_MAGIC_METER, {Category::cNorthClockTown, Category::cFairyFountain,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_N_CLOCK_TOWN ); - //locationTable[N_CLOCK_TOWN_BOMBERS_HIDE_SEEK] = ItemLocation::Base (0x6E, 0x50, true, "NCT Bombers Hide n Seek", N_CLOCK_TOWN_BOMBERS_HIDE_SEEK, BOMBERS_NOTEBOOK, {Category::cNorthClockTown,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_N_CLOCK_TOWN ); - locationTable[N_CLOCK_TOWN_KEATON_QUIZ] = ItemLocation::Base (0x6E, 0x0C, false, "NCT Keaton Quiz", N_CLOCK_TOWN_KEATON_QUIZ, PIECE_OF_HEART, {Category::cNorthClockTown, Category::cMinigame, Category::cVanillaHeartPiece,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_N_CLOCK_TOWN ); + //locationTable[N_CLOCK_TOWN_BOMBERS_HIDE_SEEK] = ItemLocation::Base (0x6E, 0x50, true, "NCT Bombers Hide n Seek", N_CLOCK_TOWN_BOMBERS_HIDE_SEEK, BOMBERS_NOTEBOOK, {Category::cNorthClockTown,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_N_CLOCK_TOWN ); + locationTable[N_CLOCK_TOWN_KEATON_QUIZ] = ItemLocation::Base (0x6E, 0x03, false, "NCT Keaton Quiz", N_CLOCK_TOWN_KEATON_QUIZ, PIECE_OF_HEART, {Category::cNorthClockTown, Category::cMinigame, Category::cVanillaHeartPiece,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_N_CLOCK_TOWN ); locationTable[N_CLOCK_TOWN_DEKU_PLAYGROUND_3DAYS] = ItemLocation::Base (0x1E, 0x0C, false, "NCT Deku Playground 3 Days Reward", N_CLOCK_TOWN_DEKU_PLAYGROUND_3DAYS, PIECE_OF_HEART, {Category::cNorthClockTown, Category::cMinigame, Category::cVanillaHeartPiece,Category::cDayThree}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_N_CLOCK_TOWN ); locationTable[N_CLOCK_TOWN_TREE] = ItemLocation::Collectable(0x6E, 0x00, false, "NCT Tree", N_CLOCK_TOWN_TREE, PIECE_OF_HEART, {Category::cNorthClockTown, Category::cVanillaHeartPiece,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_N_CLOCK_TOWN ); locationTable[N_CLOCK_TOWN_OLD_LADY] = ItemLocation::Base (0x6E, 0x8D, false, "NCT Old Lady", N_CLOCK_TOWN_OLD_LADY, BLAST_MASK, {Category::cNorthClockTown, Category::cVanillaMask,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_N_CLOCK_TOWN ); @@ -131,48 +136,48 @@ void LocationTable_Init() { locationTable[PINNACLE_ROCK_SEAHORSES] = ItemLocation::Base (0x25, 0x0C, false, "PR Seahorses", PINNACLE_ROCK_SEAHORSES, PIECE_OF_HEART, {Category::cPinnacleRock, Category::cVanillaHeartPiece,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_PINNACLE_ROCK ); locationTable[PINNACLE_ROCK_UPPER_CHEST] = ItemLocation::Chest (0x25, 0x02, true, "PR Upper Chest", PINNACLE_ROCK_UPPER_CHEST, RED_RUPEE, {Category::cPinnacleRock,Category::cChest ,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_PINNACLE_ROCK ); locationTable[PINNACLE_ROCK_LOWER_CHEST] = ItemLocation::Chest (0x25, 0x01, true, "PR Lower Chest", PINNACLE_ROCK_LOWER_CHEST, RED_RUPEE, {Category::cPinnacleRock,Category::cChest ,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_PINNACLE_ROCK ); - locationTable[PINNACLE_ROCK_ZORA_EGG1] = ItemLocation::Collectable(0x25, 0x69, true, "PR Zora Egg 1", PINNACLE_ROCK_ZORA_EGG1, ZORA_EGG, {Category::cPinnacleRock, Category::cBottleCatch,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_PINNACLE_ROCK ); - locationTable[PINNACLE_ROCK_ZORA_EGG2] = ItemLocation::Collectable(0x25, 0x69, true, "PR Zora Egg 2", PINNACLE_ROCK_ZORA_EGG2, ZORA_EGG, {Category::cPinnacleRock, Category::cBottleCatch,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_PINNACLE_ROCK ); - locationTable[PINNACLE_ROCK_ZORA_EGG3] = ItemLocation::Collectable(0x25, 0x69, true, "PR Zora Egg 3", PINNACLE_ROCK_ZORA_EGG3, ZORA_EGG, {Category::cPinnacleRock, Category::cBottleCatch,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_PINNACLE_ROCK ); + locationTable[PINNACLE_ROCK_ZORA_EGG1] = ItemLocation::Collectable(0x25, 0x69, true, "PR Zora Egg 1", PINNACLE_ROCK_ZORA_EGG1, ZORA_EGG, {Category::cPinnacleRock, Category::cBottleCatch,Category::cDayOne, Category::cZoraEgg}, SpoilerCollectionCheckGroup::GROUP_PINNACLE_ROCK ); + locationTable[PINNACLE_ROCK_ZORA_EGG2] = ItemLocation::Collectable(0x25, 0x69, true, "PR Zora Egg 2", PINNACLE_ROCK_ZORA_EGG2, ZORA_EGG, {Category::cPinnacleRock, Category::cBottleCatch,Category::cDayOne, Category::cZoraEgg}, SpoilerCollectionCheckGroup::GROUP_PINNACLE_ROCK ); + locationTable[PINNACLE_ROCK_ZORA_EGG3] = ItemLocation::Collectable(0x25, 0x69, true, "PR Zora Egg 3", PINNACLE_ROCK_ZORA_EGG3, ZORA_EGG, {Category::cPinnacleRock, Category::cBottleCatch,Category::cDayOne, Category::cZoraEgg}, SpoilerCollectionCheckGroup::GROUP_PINNACLE_ROCK ); //Road to Ikana locationTable[ROAD_TO_IKANA_PILLAR_CHEST] = ItemLocation::Chest (0x53, 0x00, true, "Road to Ikana Pillar Chest", ROAD_TO_IKANA_PILLAR_CHEST, RED_RUPEE, {Category::cRoadToIkana,Category::cChest ,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_IKANA_CANYON ); locationTable[ROAD_TO_IKANA_GROTTO_CHEST] = ItemLocation::Chest (0x07, 0x16, true, "Road to Ikana Grotto", ROAD_TO_IKANA_GROTTO_CHEST, BOMBCHU_5, {Category::cRoadToIkana,Category::cGrotto,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_IKANA_CANYON ); //Road to Southern Swamp - locationTable[ROAD_TO_SS_ARCHERY_1] = ItemLocation::Base (0x24, 0x47, false, "Road to Southern Swamp Archery 1", ROAD_TO_SS_ARCHERY_1, PROGRESSIVE_BOW, {Category::cRoadToSouthernSwamp,Category::cMinigame,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_SOUTHERN_SWAMP ); - locationTable[ROAD_TO_SS_ARCHERY_2] = ItemLocation::Base (0x24, 0x0C, true, "Road to Southern Swamp Archery 2", ROAD_TO_SS_ARCHERY_2, PIECE_OF_HEART, {Category::cRoadToSouthernSwamp,Category::cMinigame, Category::cVanillaHeartPiece,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_SOUTHERN_SWAMP ); + locationTable[ROAD_TO_SS_ARCHERY_1] = ItemLocation::Base (0x24, 0x47, false, "Road to Southern Swamp Archery 1", ROAD_TO_SS_ARCHERY_1, PROGRESSIVE_BOW, {Category::cRoadToSouthernSwamp,Category::cMinigame,Category::cDayOne, Category::cMainInventory}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_SOUTHERN_SWAMP ); + locationTable[ROAD_TO_SS_ARCHERY_2] = ItemLocation::Base (0x24, 0x0C, false, "Road to Southern Swamp Archery 2", ROAD_TO_SS_ARCHERY_2, PIECE_OF_HEART, {Category::cRoadToSouthernSwamp,Category::cMinigame, Category::cVanillaHeartPiece,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_SOUTHERN_SWAMP ); locationTable[ROAD_TO_SS_TREE] = ItemLocation::Collectable(0x40, 0x00, false, "Road to Southern Swamp Tree", ROAD_TO_SS_TREE, PIECE_OF_HEART, {Category::cRoadToSouthernSwamp, Category::cVanillaHeartPiece,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_SOUTHERN_SWAMP ); locationTable[ROAD_TO_SWAMP_GROTTO_CHEST] = ItemLocation::Chest (0x07, 0x1E, true, "Road to Southern Swamp Grotto", ROAD_TO_SWAMP_GROTTO_CHEST, RED_RUPEE, {Category::cRoadToSouthernSwamp,Category::cGrotto, Category::cChest,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_SOUTHERN_SWAMP ); //Romani Ranch - locationTable[ROMANI_RANCH_ALIEN_DEFENSE] = ItemLocation::Base (0x35, 0x60, true, "RR Alien Defense", ROMANI_RANCH_ALIEN_DEFENSE, BOTTLE_WITH_MILK, {Category::cRomaniRanch,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_ROMANI_RANCH ); + locationTable[ROMANI_RANCH_ALIEN_DEFENSE] = ItemLocation::Base (0x35, 0x60, false, "RR Alien Defense", ROMANI_RANCH_ALIEN_DEFENSE, BOTTLE_WITH_MILK, {Category::cRomaniRanch}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_ROMANI_RANCH ); locationTable[ROMANI_RANCH_DOG_RACE] = ItemLocation::Base (0x41, 0x0C, false, "RR Dog Race", ROMANI_RANCH_DOG_RACE, PIECE_OF_HEART, {Category::cRomaniRanch,Category::cMinigame, Category::cVanillaHeartPiece,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_ROMANI_RANCH ); locationTable[ROMANI_RANCH_GROG] = ItemLocation::Base (0x42, 0x7F, false, "RR Grog", ROMANI_RANCH_GROG, BUNNY_HOOD, {Category::cRomaniRanch, Category::cVanillaMask,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_ROMANI_RANCH ); - locationTable[ROMANI_RANCH_CREMIA_ESCORT] = ItemLocation::Base (0x35, 0x82, true, "RR Cremia Escort", ROMANI_RANCH_CREMIA_ESCORT, ROMANIS_MASK, {Category::cRomaniRanch, Category::cVanillaMask,Category::cDayTwo}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_ROMANI_RANCH ); + locationTable[ROMANI_RANCH_CREMIA_ESCORT] = ItemLocation::Base (0x2D, 0x82, true, "RR Cremia Escort", ROMANI_RANCH_CREMIA_ESCORT, ROMANIS_MASK, {Category::cRomaniRanch, Category::cVanillaMask,Category::cDayTwo}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_ROMANI_RANCH ); locationTable[ROMANI_RANCH_ROMANIS_GAME] = ItemLocation::Base (0x35, 0x6C, false, "RR Romani's Game", ROMANI_RANCH_ROMANIS_GAME, EPONAS_SONG, {Category::cRomaniRanch,Category::cSong,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_ROMANI_RANCH ); locationTable[DOGGY_RACETRACK_ROOF_CHEST] = ItemLocation::Chest (0x41, 0x00, true, "RR Doggy Racetrack Roof Chest", DOGGY_RACETRACK_ROOF_CHEST, PURPLE_RUPEE, {Category::cRomaniRanch,Category::cChest,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_ROMANI_RANCH ); //S Clock Town - locationTable[S_CLOCK_TOWN_SCRUB_TRADE] = ItemLocation::Base (0x6F, 0x97, true, "SCT Scrub Trade", S_CLOCK_TOWN_SCRUB_TRADE, LAND_TITLE, {Category::cSouthClockTown,Category::cDekuScrub,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_S_CLOCK_TOWN ); + locationTable[S_CLOCK_TOWN_SCRUB_TRADE] = ItemLocation::Base (0x6F, 0x97, true, "SCT Scrub Trade", S_CLOCK_TOWN_SCRUB_TRADE, LAND_TITLE, {Category::cSouthClockTown,Category::cDekuScrub,Category::cDayOne, Category::cTradeItem}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_S_CLOCK_TOWN ); locationTable[S_CLOCK_TOWN_POSTBOX] = ItemLocation::Base (0x6F, 0xBA, false, "SCT Postbox", S_CLOCK_TOWN_POSTBOX, PIECE_OF_HEART, {Category::cSouthClockTown, Category::cVanillaHeartPiece,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_S_CLOCK_TOWN ); locationTable[S_CLOCK_TOWN_CLOCK_TOWER_ENTRANCE] = ItemLocation::Collectable(0x6F, 0x00, false, "SCT Clock Tower Entrance", S_CLOCK_TOWN_CLOCK_TOWER_ENTRANCE, PIECE_OF_HEART, {Category::cSouthClockTown, Category::cVanillaHeartPiece,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_S_CLOCK_TOWN ); locationTable[S_CLOCK_TOWN_STRAW_ROOF_CHEST] = ItemLocation::Chest (0x6F, 0x00, true, "SCT Straw Roof Chest", S_CLOCK_TOWN_STRAW_ROOF_CHEST, RED_RUPEE, {Category::cSouthClockTown,Category::cChest ,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_S_CLOCK_TOWN ); locationTable[S_CLOCK_TOWN_FINAL_DAY_CHEST] = ItemLocation::Chest (0x6F, 0x01, true, "SCT Final Day Chest", S_CLOCK_TOWN_FINAL_DAY_CHEST, PURPLE_RUPEE, {Category::cSouthClockTown,Category::cChest ,Category::cDayThree}, SpoilerCollectionCheckGroup::GROUP_S_CLOCK_TOWN ); - locationTable[S_CLOCK_TOWN_BANK_REWARD_1] = ItemLocation::Base (0x6F, 0x48, false, "SCT Bank Reward 1", S_CLOCK_TOWN_BANK_REWARD_1, PROGRESSIVE_WALLET, {Category::cSouthClockTown,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_S_CLOCK_TOWN ); - locationTable[S_CLOCK_TOWN_BANK_REWARD_2] = ItemLocation::Base (0x6F, 0x02, false, "SCT Bank Reward 2", S_CLOCK_TOWN_BANK_REWARD_2, BLUE_RUPEE, {Category::cSouthClockTown,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_S_CLOCK_TOWN ); + locationTable[S_CLOCK_TOWN_BANK_REWARD_1] = ItemLocation::Base (0x6F, 0x48, false, "SCT Bank Reward 1", S_CLOCK_TOWN_BANK_REWARD_1, PROGRESSIVE_WALLET, {Category::cSouthClockTown,Category::cDayOne, Category::cMainInventory}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_S_CLOCK_TOWN ); + locationTable[S_CLOCK_TOWN_BANK_REWARD_2] = ItemLocation::Base (0x6F, 0x03, false, "SCT Bank Reward 2", S_CLOCK_TOWN_BANK_REWARD_2, BLUE_RUPEE, {Category::cSouthClockTown,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_S_CLOCK_TOWN ); locationTable[S_CLOCK_TOWN_BANK_REWARD_3] = ItemLocation::Base (0x6F, 0x0C, false, "SCT Bank Reward 3", S_CLOCK_TOWN_BANK_REWARD_3, PIECE_OF_HEART, {Category::cSouthClockTown, Category::cVanillaHeartPiece,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_S_CLOCK_TOWN ); //Snowhead locationTable[SNOWHEAD_GREAT_FAIRY] = ItemLocation::Base (0x26, 0x2B, false, "SH Great Fairy", SNOWHEAD_GREAT_FAIRY, PROGRESSIVE_MAGIC_METER, {Category::cSnowhead, Category::cFairyFountain,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_SNOWHEAD ); //Southern Swamp - locationTable[SOUTHERN_SWAMP_KOUME] = ItemLocation::Base (0x57, 0x43, false, "SS Koume", SOUTHERN_SWAMP_KOUME, PICTOGRAPH_BOX, {Category::cSouthernSwamp,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_SOUTHERN_SWAMP ); - locationTable[SOUTHERN_SWAMP_KOTAKE] = ItemLocation::Base (0x0A, 0x59, true, "SS Kotake", SOUTHERN_SWAMP_KOTAKE, BOTTLE_WITH_RED_POTION, {Category::cSouthernSwamp,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_SOUTHERN_SWAMP ); - locationTable[SOUTHERN_SWAMP_KOTAKE_IN_WOODS] = ItemLocation::Base (0x64, 0x59, true, "SS Mystery Woods Kotake", SOUTHERN_SWAMP_KOTAKE_IN_WOODS, BOTTLE_WITH_RED_POTION, {Category::cSouthernSwamp,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_SOUTHERN_SWAMP ); - locationTable[SOUTHERN_SWAMP_SCRUB_TRADE] = ItemLocation::Base (0x45, 0x98, true, "SS Deku Scrub Merchant Trade", SOUTHERN_SWAMP_SCRUB_TRADE, SWAMP_TITLE, {Category::cSouthernSwamp, Category::cDekuScrub,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_SOUTHERN_SWAMP ); + locationTable[SOUTHERN_SWAMP_KOUME] = ItemLocation::Base (0x57, 0x43, false, "SS Koume", SOUTHERN_SWAMP_KOUME, PICTOGRAPH_BOX, {Category::cSouthernSwamp,Category::cDayOne, Category::cMainInventory}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_SOUTHERN_SWAMP ); + locationTable[SOUTHERN_SWAMP_KOTAKE] = ItemLocation::Base (0x0A, 0x59, false, "SS Kotake", SOUTHERN_SWAMP_KOTAKE, BOTTLE_WITH_RED_POTION, {Category::cSouthernSwamp, Category::cMainInventory}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_SOUTHERN_SWAMP ); + locationTable[SOUTHERN_SWAMP_KOTAKE_IN_WOODS] = ItemLocation::Base (0x64, 0x59, false, "SS Mystery Woods Kotake", SOUTHERN_SWAMP_KOTAKE_IN_WOODS, BOTTLE_WITH_RED_POTION, {Category::cSouthernSwamp, Category::cAlternateCheck, Category::cMainInventory}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_SOUTHERN_SWAMP ); + locationTable[SOUTHERN_SWAMP_SCRUB_TRADE] = ItemLocation::Base (0x45, 0x98, true, "SS Deku Scrub Merchant Trade", SOUTHERN_SWAMP_SCRUB_TRADE, SWAMP_TITLE, {Category::cSouthernSwamp, Category::cDekuScrub,Category::cDayOne, Category::cTradeItem}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_SOUTHERN_SWAMP ); locationTable[SOUTHERN_SWAMP_PICTOGRAPH_WINNER] = ItemLocation::Base (0x57, 0xBA, false, "SS Pictograph Contest Winner", SOUTHERN_SWAMP_PICTOGRAPH_WINNER, PIECE_OF_HEART, {Category::cSouthernSwamp, Category::cVanillaHeartPiece,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_SOUTHERN_SWAMP ); - locationTable[SOUTHERN_SWAMP_BOAT_ARCHERY] = ItemLocation::Base (0x57, 0x5A, false, "SS Boat Archery", SOUTHERN_SWAMP_BOAT_ARCHERY, EMPTY_BOTTLE2, {Category::cSouthernSwamp, Category::cMinigame, Category::cVanillaHeartPiece,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_SOUTHERN_SWAMP ); + locationTable[SOUTHERN_SWAMP_BOAT_ARCHERY] = ItemLocation::Base (0x57, 0x5A, false, "SS Boat Archery", SOUTHERN_SWAMP_BOAT_ARCHERY, EMPTY_BOTTLE1, {Category::cSouthernSwamp, Category::cMinigame, Category::cMainInventory}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_SOUTHERN_SWAMP ); locationTable[SWAMP_TOURIST_CENTER_ROOF] = ItemLocation::Collectable(0x45, 0x00, false, "SS Tourist Center Roof", SWAMP_TOURIST_CENTER_ROOF, PIECE_OF_HEART, {Category::cSouthernSwamp, Category::cVanillaHeartPiece,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_SOUTHERN_SWAMP ); locationTable[SOUTHERN_SWAMP_SPIDER_HOUSE_REWARD] = ItemLocation::Base (0x27, 0x8A, false, "SSH Reward", SOUTHERN_SWAMP_SPIDER_HOUSE_REWARD, MASK_OF_TRUTH, {Category::cSouthernSwamp, Category::cVanillaMask,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_SOUTHERN_SWAMP ); locationTable[SOUTHERN_SWAMP_MUSIC_STATUE] = ItemLocation::Base (0x45, 0x72, false, "SS Music Statue", SOUTHERN_SWAMP_MUSIC_STATUE, SONG_OF_SOARING, {Category::cSouthernSwamp, Category::cSong,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_SOUTHERN_SWAMP ); @@ -181,25 +186,28 @@ void LocationTable_Init() { locationTable[SOUTHERN_SWAMP_KOTAKE_MUSHROOM_SALE] = ItemLocation::Base (0x0A, 0x5D, true, "SS Kotake Mushroom Sale", SOUTHERN_SWAMP_KOTAKE_MUSHROOM_SALE, RED_RUPEE, {Category::cSouthernSwamp,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_SOUTHERN_SWAMP ); //locationTable[SOUTHERN_SWAMP_PICTOGRAPH_STANDARD] = ItemLocation::Base (0x0A, 0x00, true, "SS Pictograph Standard", SOUTHERN_SWAMP_PICTOGRAPH_STANDARD, BLUE_RUPEE, {Category::cSouthernSwamp, Category::cMinigame}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_SOUTHERN_SWAMP ); //locationTable[SOUTHERN_SWAMP_PICTOGRAPH_GOOD] = ItemLocation::Base (0x0A, 0x00, true, "SS Pictograph Good", SOUTHERN_SWAMP_PICTOGRAPH_GOOD, RED_RUPEE, {Category::cSouthernSwamp,Category::cMinigame}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_SOUTHERN_SWAMP ); - locationTable[SOUTHERN_SWAMP_SCRUB_PURCHASE] = ItemLocation::Base (0x45, 0x35, true, "SS Deku Scrub Merchant Purchase", SOUTHERN_SWAMP_SCRUB_PURCHASE, MAGIC_BEAN, {Category::cSouthernSwamp, Category::cDekuScrub,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_SOUTHERN_SWAMP ); + locationTable[SOUTHERN_SWAMP_SCRUB_PURCHASE] = ItemLocation::Base (0x45, 0x35, true, "SS Deku Scrub Merchant Purchase", SOUTHERN_SWAMP_SCRUB_PURCHASE, MAGIC_BEAN, {Category::cSouthernSwamp, Category::cDekuScrub,Category::cDayOne, Category::cShop}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_SOUTHERN_SWAMP ); + locationTable[SOUTHERN_SWAMP_SCRUB_PURCHASE_CLEAR] = ItemLocation::Base (0x00, 0x35, true, "SS Deku Scrub Merchant Purchase (Cleared)", SOUTHERN_SWAMP_SCRUB_PURCHASE_CLEAR, MAGIC_BEAN, {Category::cSouthernSwamp, Category::cDekuScrub,Category::cDayOne, Category::cShop, Category::cAlternateCheck}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_SOUTHERN_SWAMP ); + locationTable[SWAMP_TOURIST_CENTER_ROOF_CLEAR] = ItemLocation::Collectable(0x00, 0x00, false, "SS Tourist Center Roof (Cleared)", SWAMP_TOURIST_CENTER_ROOF_CLEAR, PIECE_OF_HEART, {Category::cSouthernSwamp, Category::cVanillaHeartPiece,Category::cDayOne, Category::cAlternateCheck}, SpoilerCollectionCheckGroup::GROUP_SOUTHERN_SWAMP ); + locationTable[SOUTHERN_SWAMP_SCRUB_TRADE_CLEAR] = ItemLocation::Base (0x00, 0x98, true, "SS Deku Scrub Merchant Trade (Cleared)", SOUTHERN_SWAMP_SCRUB_TRADE_CLEAR, SWAMP_TITLE, {Category::cSouthernSwamp, Category::cDekuScrub,Category::cDayOne,Category::cTradeItem, Category::cAlternateCheck}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_SOUTHERN_SWAMP ); //Stock Pot Inn - locationTable[STOCKPOTINN_RESERVATION] = ItemLocation::Base (0x61, 0xA0, true, "SPI Reservation", STOCKPOTINN_RESERVATION, ROOM_KEY, {Category::cStockPotInn,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_STOCKPOTINN ); - locationTable[STOCKPOTINN_MIDNIGHT_MEETING] = ItemLocation::Base (0x61, 0xAA, true, "SPI Midnight Meeting", STOCKPOTINN_MIDNIGHT_MEETING, LETTER_KAFEI, {Category::cStockPotInn,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_STOCKPOTINN ); - locationTable[STOCKPOTINN_TOILET_HAND] = ItemLocation::Base (0x61, 0x01, true, "SPI Toilet Hand", STOCKPOTINN_TOILET_HAND, PIECE_OF_HEART, {Category::cStockPotInn, Category::cVanillaHeartPiece,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_STOCKPOTINN ); - locationTable[STOCKPOTINN_GRANDMA_SHORT_STORY] = ItemLocation::Base (0x61, 0x0C, true, "SPI Grandma Short Story", STOCKPOTINN_GRANDMA_SHORT_STORY, PIECE_OF_HEART, {Category::cStockPotInn, Category::cVanillaHeartPiece,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_STOCKPOTINN ); - locationTable[STOCKPOTINN_GRANDMA_LONG_STORY] = ItemLocation::Base (0x61, 0xBA, true, "SPI Grandma Long Story", STOCKPOTINN_GRANDMA_LONG_STORY, PIECE_OF_HEART, {Category::cStockPotInn, Category::cVanillaHeartPiece,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_STOCKPOTINN ); - locationTable[STOCKPOTINN_ANJU_AND_KAFEI] = ItemLocation::Base (0x61, 0x85, true, "SPI Anju And Kafei", STOCKPOTINN_ANJU_AND_KAFEI, COUPLES_MASK, {Category::cStockPotInn, Category::cVanillaMask,Category::cDayThree}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_STOCKPOTINN ); + locationTable[STOCKPOTINN_RESERVATION] = ItemLocation::Base (0x61, 0xA0, true, "SPI Reservation", STOCKPOTINN_RESERVATION, ROOM_KEY, {Category::cStockPotInn,Category::cDayOne, Category::cAnjuAndKafei}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_STOCKPOTINN ); + locationTable[STOCKPOTINN_MIDNIGHT_MEETING] = ItemLocation::Base (0x61, 0xAA, true, "SPI Midnight Meeting", STOCKPOTINN_MIDNIGHT_MEETING, LETTER_KAFEI, {Category::cStockPotInn,Category::cDayOne, Category::cAnjuAndKafei}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_STOCKPOTINN ); + locationTable[STOCKPOTINN_TOILET_HAND] = ItemLocation::Base (0x61, 0x01, false, "SPI Toilet Hand", STOCKPOTINN_TOILET_HAND, PIECE_OF_HEART, {Category::cStockPotInn, Category::cVanillaHeartPiece,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_STOCKPOTINN ); + locationTable[STOCKPOTINN_GRANDMA_SHORT_STORY] = ItemLocation::Base (0x61, 0x0C, false, "SPI Grandma Short Story", STOCKPOTINN_GRANDMA_SHORT_STORY, PIECE_OF_HEART, {Category::cStockPotInn, Category::cVanillaHeartPiece,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_STOCKPOTINN ); + locationTable[STOCKPOTINN_GRANDMA_LONG_STORY] = ItemLocation::Base (0x61, 0xBA, false, "SPI Grandma Long Story", STOCKPOTINN_GRANDMA_LONG_STORY, PIECE_OF_HEART, {Category::cStockPotInn, Category::cVanillaHeartPiece,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_STOCKPOTINN ); + locationTable[STOCKPOTINN_ANJU_AND_KAFEI] = ItemLocation::Base (0x61, 0x85, false, "SPI Anju And Kafei", STOCKPOTINN_ANJU_AND_KAFEI, COUPLES_MASK, {Category::cStockPotInn, Category::cDayThree, Category::cAnjuAndKafei}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_STOCKPOTINN ); locationTable[STOCKPOTINN_STAFF_ROOM_CHEST] = ItemLocation::Chest (0x61, 0x01, true, "SPI Staff Room Chest", STOCKPOTINN_STAFF_ROOM_CHEST, SILVER_RUPEE, {Category::cStockPotInn,Category::cChest ,Category::cDayThree}, SpoilerCollectionCheckGroup::GROUP_STOCKPOTINN ); locationTable[STOCKPOTINN_GUEST_ROOM_CHEST] = ItemLocation::Chest (0x61, 0x00, true, "SPI Guest Room Chest", STOCKPOTINN_GUEST_ROOM_CHEST, SILVER_RUPEE, {Category::cStockPotInn,Category::cChest ,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_STOCKPOTINN ); //Stone Tower - locationTable[STONE_TOWER_INVERTED_RIGHT_CHEST] = ItemLocation::Chest (0x18, 0x1D, true, "IST Right Chest", STONE_TOWER_INVERTED_RIGHT_CHEST, SILVER_RUPEE, {Category::cStoneTower,Category::cChest,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_STONE_TOWER ); - locationTable[STONE_TOWER_INVERTED_CENTER_CHEST] = ItemLocation::Chest (0x18, 0x1E, true, "IST Center Chest", STONE_TOWER_INVERTED_CENTER_CHEST, BOMBCHU_10, {Category::cStoneTower,Category::cChest,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_STONE_TOWER ); - locationTable[STONE_TOWER_INVERTED_LEFT_CHEST] = ItemLocation::Chest (0x18, 0x1F, true, "IST Left Chest", STONE_TOWER_INVERTED_LEFT_CHEST, MAGIC_BEAN, {Category::cStoneTower,Category::cChest,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_STONE_TOWER ); + locationTable[STONE_TOWER_INVERTED_RIGHT_CHEST] = ItemLocation::Chest (0x59, 0x1D, true, "IST Right Chest", STONE_TOWER_INVERTED_RIGHT_CHEST, SILVER_RUPEE, {Category::cStoneTower,Category::cChest,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_STONE_TOWER ); + locationTable[STONE_TOWER_INVERTED_CENTER_CHEST] = ItemLocation::Chest (0x59, 0x1E, true, "IST Center Chest", STONE_TOWER_INVERTED_CENTER_CHEST, BOMBCHU_10, {Category::cStoneTower,Category::cChest,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_STONE_TOWER ); + locationTable[STONE_TOWER_INVERTED_LEFT_CHEST] = ItemLocation::Chest (0x59, 0x1F, true, "IST Left Chest", STONE_TOWER_INVERTED_LEFT_CHEST, MAGIC_BEAN, {Category::cStoneTower,Category::cChest,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_STONE_TOWER ); //Termina Field - locationTable[TERMINA_FIELD_MOONS_TEAR] = ItemLocation::Base (0x2D, 0x96, true, "TF Moon's Tear", TERMINA_FIELD_MOONS_TEAR, MOONS_TEAR, {Category::cTerminaField,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_TERMINA_FIELD ); + locationTable[TERMINA_FIELD_MOONS_TEAR] = ItemLocation::Base (0x2D, 0x96, true, "TF Moon's Tear", TERMINA_FIELD_MOONS_TEAR, MOONS_TEAR, {Category::cTerminaField,Category::cDayOne, Category::cTradeItem}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_TERMINA_FIELD ); locationTable[TERMINA_FIELD_GOSSIP_STONES] = ItemLocation::Base (0x07, 0x0C, false, "TF Gossip Stones", TERMINA_FIELD_GOSSIP_STONES, PIECE_OF_HEART, {Category::cTerminaField,Category::cGrotto, Category::cVanillaHeartPiece,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_TERMINA_FIELD ); locationTable[TERMINA_FIELD_BUSINESS_SCRUB] = ItemLocation::Base (0x07, 0x01, false, "TF Business Scrub", TERMINA_FIELD_BUSINESS_SCRUB, PIECE_OF_HEART, {Category::cTerminaField,Category::cGrotto,Category::cDekuScrub, Category::cVanillaHeartPiece,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_TERMINA_FIELD ); locationTable[TERMINA_FIELD_PEAHAT_GROTTO_CHEST] = ItemLocation::Chest (0x07, 0x04, true, "TF Peahat Grotto Chest", TERMINA_FIELD_PEAHAT_GROTTO_CHEST, PIECE_OF_HEART, {Category::cTerminaField,Category::cGrotto, Category::cVanillaHeartPiece,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_TERMINA_FIELD ); @@ -214,21 +222,20 @@ void LocationTable_Init() { //Twin Islands locationTable[HOT_SPRING_WATER_GROTTO_CHEST] = ItemLocation::Chest (0x07, 0x02, true, "TI Hot Spring Water Grotto Chest", HOT_SPRING_WATER_GROTTO_CHEST, RED_RUPEE, {Category::cTwinIslands, Category::cGrotto,Category::cChest ,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_TWIN_ISLANDS ); - locationTable[TWIN_ISLANDS_GORON_RACE] = ItemLocation::Base (0x6B, 0x6A, true, "TI Goron Racetrack Race", TWIN_ISLANDS_GORON_RACE, GOLD_DUST, {Category::cTwinIslands,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_TWIN_ISLANDS ); + locationTable[TWIN_ISLANDS_GORON_RACE] = ItemLocation::Base (0x6B, 0x6A, true, "TI Goron Racetrack Race", TWIN_ISLANDS_GORON_RACE, GOLD_DUST, {Category::cTwinIslands, Category::cMainInventory}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_TWIN_ISLANDS ); locationTable[TWIN_ISLANDS_GORON_RACETRACK_GROTTO_CHEST] = ItemLocation::Chest (0x07, 0x19, true, "TI Goron Racetrack Grotto", TWIN_ISLANDS_GORON_RACETRACK_GROTTO_CHEST, BOMBCHU_5, {Category::cTwinIslands, Category::cGrotto,Category::cChest ,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_TWIN_ISLANDS ); locationTable[TWIN_ISLANDS_UNDERWATER_RAMP_CHEST] = ItemLocation::Chest (0x5E, 0x06, true, "TI Underwater Ramp Chest", TWIN_ISLANDS_UNDERWATER_RAMP_CHEST, PIECE_OF_HEART, {Category::cTwinIslands, Category::cVanillaHeartPiece, Category::cChest, Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_TWIN_ISLANDS ); locationTable[TWIN_ISLANDS_CAVE_CHEST] = ItemLocation::Chest (0x5E, 0x00, true, "TI Cave Chest", TWIN_ISLANDS_CAVE_CHEST, RED_RUPEE, {Category::cTwinIslands,Category::cChest ,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_TWIN_ISLANDS ); - + locationTable[TWIN_ISLANDS_LULLABY_INTRO] = ItemLocation::Base (0x5D, 0x00, false, "TI Lullaby Intro", TWIN_ISLANDS_LULLABY_INTRO, LULLABY_INTRO, {Category::cTwinIslands, Category::cSong, Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_TWIN_ISLANDS ); //W Clock Town - locationTable[W_CLOCK_TOWN_BOMB_BAG_BUY] = ItemLocation::Base (0x0D, 0x1B, false, "WCT Bomb Bag Purchase", W_CLOCK_TOWN_BOMB_BAG_BUY, PROGRESSIVE_BOMB_BAG, {Category::cWestClockTown,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN ); - locationTable[W_CLOCK_TOWN_BIG_BOMB_BAG_BUY] = ItemLocation::Base (0x0D, 0x1C, false, "WCT Big Bomb Bag Purchase", W_CLOCK_TOWN_BIG_BOMB_BAG_BUY, PROGRESSIVE_BOMB_BAG, {Category::cWestClockTown,Category::cDayTwo}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN ); - locationTable[W_CLOCK_TOWN_POSTMANS_GAME] = ItemLocation::Base (0x2E, 0x0C, true, "WCT Postman's Game", W_CLOCK_TOWN_POSTMANS_GAME, PIECE_OF_HEART, {Category::cWestClockTown, Category::cVanillaHeartPiece,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN ); - locationTable[W_CLOCK_TOWN_ROSA_SISTERS] = ItemLocation::Base (0x6D, 0x0C, true, "WCT Rosa Sisters", W_CLOCK_TOWN_ROSA_SISTERS, PIECE_OF_HEART, {Category::cWestClockTown, Category::cVanillaHeartPiece,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN ); - locationTable[W_CLOCK_TOWN_SWORDSMANS_SCHOOL] = ItemLocation::Base (0x54, 0x0C, false, "WCT Swordsman's School", W_CLOCK_TOWN_SWORDSMANS_SCHOOL, PIECE_OF_HEART, {Category::cWestClockTown, Category::cVanillaHeartPiece,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN ); - locationTable[W_CLOCK_TOWN_ALL_NIGHT_MASK_BUY] = ItemLocation::Base (0x0D, 0x7E, true, "WCT All-Night Mask Purchase", W_CLOCK_TOWN_ALL_NIGHT_MASK_BUY, ALL_NIGHT_MASK, {Category::cWestClockTown, Category::cVanillaMask,Category::cDayThree}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN ); + locationTable[W_CLOCK_TOWN_BOMB_BAG_BUY] = ItemLocation::Base (0x0D, 0x1B, false, "WCT Bomb Bag Purchase", W_CLOCK_TOWN_BOMB_BAG_BUY, PROGRESSIVE_BOMB_BAG, {Category::cWestClockTown,Category::cDayOne, Category::cShop, Category::cMainInventory}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN ); + locationTable[W_CLOCK_TOWN_BIG_BOMB_BAG_BUY] = ItemLocation::Base (0x0D, 0x1C, false, "WCT Big Bomb Bag Purchase", W_CLOCK_TOWN_BIG_BOMB_BAG_BUY, PROGRESSIVE_BOMB_BAG, {Category::cWestClockTown,Category::cDayTwo, Category::cShop, Category::cMainInventory}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN ); + locationTable[W_CLOCK_TOWN_POSTMANS_GAME] = ItemLocation::Base (0x2E, 0x0C, false, "WCT Postman's Game", W_CLOCK_TOWN_POSTMANS_GAME, PIECE_OF_HEART, {Category::cWestClockTown, Category::cVanillaHeartPiece,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN ); + locationTable[W_CLOCK_TOWN_ROSA_SISTERS] = ItemLocation::Base (0x6D, 0x0C, false, "WCT Rosa Sisters", W_CLOCK_TOWN_ROSA_SISTERS, PIECE_OF_HEART, {Category::cWestClockTown, Category::cVanillaHeartPiece,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN ); + locationTable[W_CLOCK_TOWN_SWORDSMANS_SCHOOL] = ItemLocation::Base (0x54, 0x0C, false, "WCT Swordsman's School", W_CLOCK_TOWN_SWORDSMANS_SCHOOL, PIECE_OF_HEART, {Category::cWestClockTown, Category::cVanillaHeartPiece,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN ); + locationTable[W_CLOCK_TOWN_ALL_NIGHT_MASK_BUY] = ItemLocation::Base (0x0D, 0x7E, false, "WCT All-Night Mask Purchase", W_CLOCK_TOWN_ALL_NIGHT_MASK_BUY, ALL_NIGHT_MASK, {Category::cWestClockTown, Category::cVanillaMask,Category::cDayThree}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN ); //locationTable[W_CLOCK_TOWN_LOTTERY] = ItemLocation::Base (0x39, 0x00, true, "WCT Lottery", W_CLOCK_TOWN_LOTTERY, PURPLE_RUPEE, {Category::cWestClockTown}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN ); - locationTable[W_CLOCK_TOWN_BOMB_SHOP_GORON] = ItemLocation::Base (0x0D, 0x34, true, "WCT Bomb Shop Goron", W_CLOCK_TOWN_BOMB_SHOP_GORON, POWDER_KEG, {Category::cWestClockTown, Category::cMerchant,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN ); - locationTable[W_CLOCK_TOWN_POSTBOX] = ItemLocation::Base (0x6D, 0xBA, false, "WCT Postbox", W_CLOCK_TOWN_POSTBOX, PIECE_OF_HEART, {Category::cWestClockTown, Category::cVanillaHeartPiece,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN ); + locationTable[W_CLOCK_TOWN_BOMB_SHOP_GORON] = ItemLocation::Base (0x0D, 0x34, true, "WCT Bomb Shop Goron", W_CLOCK_TOWN_BOMB_SHOP_GORON, POWDER_KEG, {Category::cWestClockTown, Category::cMerchant,Category::cDayOne, Category::cShop, Category::cMainInventory}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN ); //Woodfall locationTable[WOODFALL_BRIDGE_CHEST] = ItemLocation::Chest (0x46, 0x01, true, "WF Bridge Chest", WOODFALL_BRIDGE_CHEST, PIECE_OF_HEART, {Category::cWoodfall, Category::cVanillaHeartPiece, Category::cChest, Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_WOODFALL ); @@ -238,8 +245,8 @@ void LocationTable_Init() { //Zora Cape locationTable[ZORA_CAPE_GREAT_FAIRY] = ItemLocation::Base (0x26, 0xB2, false, "ZC Great Fairy", ZORA_CAPE_GREAT_FAIRY, DOUBLE_DEFENSE, {Category::cZoraCape,Category::cFairyFountain,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_ZORA_CAPE ); - locationTable[ZORA_CAPE_BEAVER_RACE_1] = ItemLocation::Base (0x4A, 0x5A, true, "ZC Beaver Race 1", ZORA_CAPE_BEAVER_RACE_1, EMPTY_BOTTLE1, {Category::cZoraCape,Category::cMinigame,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_ZORA_CAPE ); - locationTable[ZORA_CAPE_BEAVER_RACE_2] = ItemLocation::Base (0x4A, 0x0C, true, "ZC Beaver Race 2", ZORA_CAPE_BEAVER_RACE_2, PIECE_OF_HEART, {Category::cZoraCape,Category::cMinigame, Category::cVanillaHeartPiece,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_ZORA_CAPE ); + locationTable[ZORA_CAPE_BEAVER_RACE_1] = ItemLocation::Base (0x4A, 0x5A, false, "ZC Beaver Race 1", ZORA_CAPE_BEAVER_RACE_1, EMPTY_BOTTLE2, {Category::cZoraCape,Category::cMinigame, Category::cMainInventory}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_ZORA_CAPE ); + locationTable[ZORA_CAPE_BEAVER_RACE_2] = ItemLocation::Base (0x4A, 0x0C, false, "ZC Beaver Race 2", ZORA_CAPE_BEAVER_RACE_2, PIECE_OF_HEART, {Category::cZoraCape,Category::cMinigame, Category::cVanillaHeartPiece,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_ZORA_CAPE ); locationTable[ZORA_CAPE_LIKE_LIKE] = ItemLocation::Collectable(0x38, 0x00, false, "ZC Like Like HP", ZORA_CAPE_LIKE_LIKE, PIECE_OF_HEART, {Category::cZoraCape, Category::cVanillaHeartPiece,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_ZORA_CAPE ); locationTable[ZORA_CAPE_LEDGE_NO_TREE] = ItemLocation::Chest (0x38, 0x01, true, "ZC Ledge Without Tree Chest", ZORA_CAPE_LEDGE_NO_TREE, RED_RUPEE, {Category::cZoraCape,Category::cChest ,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_ZORA_CAPE ); locationTable[ZORA_CAPE_LEDGE_WITH_TREE] = ItemLocation::Chest (0x38, 0x02, true, "ZC Ledge With Tree Chest", ZORA_CAPE_LEDGE_WITH_TREE, RED_RUPEE, {Category::cZoraCape,Category::cChest ,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_ZORA_CAPE ); @@ -247,10 +254,10 @@ void LocationTable_Init() { locationTable[ZORA_CAPE_UNDERWATER_CHEST] = ItemLocation::Chest (0x38, 0x00, true, "ZC Underwater Chest", ZORA_CAPE_UNDERWATER_CHEST, PURPLE_RUPEE, {Category::cZoraCape,Category::cChest ,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_ZORA_CAPE ); //Zora Hall - locationTable[ZORA_HALL_SCRUB_TRADE] = ItemLocation::Base (0x4C, 0x9A, true, "ZH Deku Scrub Merchant Trade", ZORA_HALL_SCRUB_TRADE, OCEAN_TITLE, {Category::cZoraHall, Category::cDekuScrub,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_ZORA_HALL ); - locationTable[ZORA_HALL_EVAN] = ItemLocation::Base (0x4C, 0x0C, false, "ZH Deku Evan", ZORA_HALL_EVAN, PIECE_OF_HEART, {Category::cZoraHall, Category::cVanillaHeartPiece,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_ZORA_HALL ); + locationTable[ZORA_HALL_SCRUB_TRADE] = ItemLocation::Base (0x4C, 0x9A, true, "ZH Deku Scrub Merchant Trade", ZORA_HALL_SCRUB_TRADE, OCEAN_TITLE, {Category::cZoraHall, Category::cDekuScrub,Category::cDayOne, Category::cTradeItem}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_ZORA_HALL ); + locationTable[ZORA_HALL_EVAN] = ItemLocation::Base (0x4C, 0x0C, false, "ZH Evan", ZORA_HALL_EVAN, PIECE_OF_HEART, {Category::cZoraHall, Category::cVanillaHeartPiece,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_ZORA_HALL ); locationTable[ZORA_HALL_LULU_ROOM_LEDGE] = ItemLocation::Collectable(0x4C, 0x00, false, "ZH Lulu's Room Ledge", ZORA_HALL_LULU_ROOM_LEDGE, PIECE_OF_HEART, {Category::cZoraHall, Category::cVanillaHeartPiece,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_ZORA_HALL ); - locationTable[ZORA_HALL_SCRUB_PURCHASE] = ItemLocation::Base (0x4C, 0x5C, true, "ZH Deku Scrub Merchant Purchase", ZORA_HALL_SCRUB_PURCHASE, GREEN_POTION_REFILL, {Category::cZoraHall, Category::cDekuScrub,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_ZORA_HALL ); + locationTable[ZORA_HALL_SCRUB_PURCHASE] = ItemLocation::Base (0x4C, 0x5C, true, "ZH Deku Scrub Merchant Purchase", ZORA_HALL_SCRUB_PURCHASE, GREEN_POTION_REFILL, {Category::cZoraHall, Category::cDekuScrub,Category::cDayOne, Category::cShop}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_ZORA_HALL ); //locationTable[ZORA_HALL_STAGE_LIGHTS] = ItemLocation::Base (0x33, 0x00, true, "ZH Stage Lights", ZORA_HALL_STAGE_LIGHTS, BLUE_RUPEE, {Category::cZoraHall}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_ZORA_HALL ); //locationTable[ZORA_HALL_BAD_PHOTO_LULU] = ItemLocation::Base (0x4C, 0x00, true, "ZH Bad Photograph of Lulu", ZORA_HALL_SCRUB_TRADE, BLUE_RUPEE, {Category::cZoraHall, Category::cDekuScrub}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_ZORA_HALL ); //locationTable[ZORA_HALL_GOOD_PHOTO_LULU] = ItemLocation::Base (0x4C, 0x00, true, "ZH Good Photograph of Lulu", ZORA_HALL_SCRUB_TRADE, BLUE_RUPEE, {Category::cZoraHall, Category::cDekuScrub}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_ZORA_HALL ); @@ -262,7 +269,7 @@ void LocationTable_Init() { //Woodfall Temple - locationTable[WOODFALL_TEMPLE_HEROS_BOW_CHEST] = ItemLocation::Chest (0x1B, 0x1B, true, "Woodfall Temple Hero's Bow Chest", WOODFALL_TEMPLE_HEROS_BOW_CHEST, PROGRESSIVE_BOW, {Category::cWoodfall, Category::cWoodfallTemple,Category::cChest ,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_WOODFALL_TEMPLE ); + locationTable[WOODFALL_TEMPLE_HEROS_BOW_CHEST] = ItemLocation::Chest (0x1B, 0x1B, true, "Woodfall Temple Hero's Bow Chest", WOODFALL_TEMPLE_HEROS_BOW_CHEST, PROGRESSIVE_BOW, {Category::cWoodfall, Category::cWoodfallTemple,Category::cChest ,Category::cDayOne, Category::cMainInventory}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_WOODFALL_TEMPLE ); locationTable[WOODFALL_TEMPLE_MAP_CHEST] = ItemLocation::Chest (0x1B, 0x1D, true, "Woodfall Temple Map Chest", WOODFALL_TEMPLE_MAP_CHEST, WOODFALL_MAP, {Category::cWoodfall, Category::cWoodfallTemple,Category::cVanillaMap,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_WOODFALL_TEMPLE ); locationTable[WOODFALL_TEMPLE_COMPASS_CHEST] = ItemLocation::Chest (0x1B, 0x1C, true, "Woodfall Temple Compass Chest", WOODFALL_TEMPLE_COMPASS_CHEST, WOODFALL_TEMPLE_COMPASS, {Category::cWoodfall, Category::cWoodfallTemple,Category::cVanillaCompass,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_WOODFALL_TEMPLE ); locationTable[WOODFALL_TEMPLE_BOSS_KEY_CHEST] = ItemLocation::Chest (0x1B, 0x1E, true, "Woodfall Temple Boss Key Chest", WOODFALL_TEMPLE_BOSS_KEY_CHEST, WOODFALL_TEMPLE_BOSS_KEY, {Category::cWoodfall, Category::cWoodfallTemple,Category::cVanillaBossKey,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_WOODFALL_TEMPLE ); @@ -271,7 +278,7 @@ void LocationTable_Init() { locationTable[WOODFALL_TEMPLE_DEKU_PRINCESS] = ItemLocation::Base (0x1B, 0x5F, true, "Deku Princess", WOODFALL_TEMPLE_DEKU_PRINCESS, DEKU_PRINCESS, {Category::cWoodfall, Category::cWoodfallTemple, Category::cBottleCatch,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_DUNGEON_WOODFALL_TEMPLE ); //Snowhead Temple - locationTable[SNOWHEAD_TEMPLE_FIRE_ARROW_CHEST] = ItemLocation::Chest (0x21, 0x1B, true, "Snowhead Temple Fire Arrow Chest", SNOWHEAD_TEMPLE_FIRE_ARROW_CHEST, FIRE_ARROWS, {Category::cSnowhead, Category::cSnowheadTemple,Category::cChest ,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SNOWHEAD_TEMPLE ); + locationTable[SNOWHEAD_TEMPLE_FIRE_ARROW_CHEST] = ItemLocation::Chest (0x21, 0x1B, true, "Snowhead Temple Fire Arrow Chest", SNOWHEAD_TEMPLE_FIRE_ARROW_CHEST, FIRE_ARROWS, {Category::cSnowhead, Category::cSnowheadTemple,Category::cChest ,Category::cDayOne, Category::cMainInventory}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SNOWHEAD_TEMPLE ); locationTable[SNOWHEAD_TEMPLE_MAP_CHEST] = ItemLocation::Chest (0x21, 0x1D, true, "Snowhead Temple Map Chest", SNOWHEAD_TEMPLE_MAP_CHEST, SNOWHEAD_TEMPLE_MAP, {Category::cSnowhead, Category::cSnowheadTemple, Category::cVanillaMap,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SNOWHEAD_TEMPLE ); locationTable[SNOWHEAD_TEMPLE_COMPASS_CHEST] = ItemLocation::Chest (0x21, 0x1C, true, "Snowhead Temple Compass Chest", SNOWHEAD_TEMPLE_COMPASS_CHEST, SNOWHEAD_TEMPLE_COMPASS, {Category::cSnowhead, Category::cSnowheadTemple, Category::cVanillaCompass,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SNOWHEAD_TEMPLE ); locationTable[SNOWHEAD_TEMPLE_BOSS_KEY_CHEST] = ItemLocation::Chest (0x21, 0x1E, true, "Snowhead Temple Boss Key Chest", SNOWHEAD_TEMPLE_BOSS_KEY_CHEST, SNOWHEAD_TEMPLE_BOSS_KEY, {Category::cSnowhead, Category::cSnowheadTemple, Category::cVanillaBossKey,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SNOWHEAD_TEMPLE ); @@ -280,7 +287,7 @@ void LocationTable_Init() { locationTable[SNOWHEAD_TEMPLE_BRIDGE_ROOM_CHEST] = ItemLocation::Chest (0x21, 0x01, true, "Snowhead Temple Bridge Room Chest", SNOWHEAD_TEMPLE_BRIDGE_ROOM_CHEST, SNOWHEAD_TEMPLE_SMALL_KEY, {Category::cSnowhead, Category::cSnowheadTemple, Category::cVanillaSmallKey,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SNOWHEAD_TEMPLE ); //Great Bay Temple - locationTable[GBT_ICE_ARROW_CHEST] = ItemLocation::Chest (0x49, 0x1B, true, "Great Bay Temple Ice Arrow Chest", GBT_ICE_ARROW_CHEST, ICE_ARROWS, {Category::cGreatBayTemple,Category::cChest,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GREAT_BAY ); + locationTable[GBT_ICE_ARROW_CHEST] = ItemLocation::Chest (0x49, 0x1B, true, "Great Bay Temple Ice Arrow Chest", GBT_ICE_ARROW_CHEST, ICE_ARROWS, {Category::cGreatBayTemple,Category::cChest,Category::cDayOne, Category::cMainInventory}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GREAT_BAY ); locationTable[GBT_MAP_CHEST] = ItemLocation::Chest (0x49, 0x1D, true, "Great Bay Temple Map Chest", GBT_MAP_CHEST, GBT_MAP, {Category::cGreatBayTemple, Category::cVanillaMap,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GREAT_BAY ); locationTable[GBT_COMPASS_CHEST] = ItemLocation::Chest (0x49, 0x1C, true, "Great Bay Temple Compass Chest", GBT_COMPASS_CHEST, GBT_COMPASS, {Category::cGreatBayTemple, Category::cVanillaCompass,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GREAT_BAY ); locationTable[GBT_BOSS_KEY_CHEST] = ItemLocation::Chest (0x49, 0x1E, true, "Great Bay Temple Boss Key Chest", GBT_BOSS_KEY_CHEST, GBT_BOSS_KEY, {Category::cGreatBayTemple, Category::cVanillaBossKey,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GREAT_BAY ); @@ -294,11 +301,11 @@ void LocationTable_Init() { locationTable[STONE_TOWER_TEMPLE_BRIDGE_SWITCH_CHEST] = ItemLocation::Chest (0x16, 0x01, true, "Stone Tower Temple Bridge Switch Chest", STONE_TOWER_TEMPLE_BRIDGE_SWITCH_CHEST, STONE_TOWER_TEMPLE_SMALL_KEY, {Category::cStoneTowerTemple, Category::cVanillaSmallKey,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_STONE_TOWER ); locationTable[STONE_TOWER_TEMPLE_UPDRAFT_ROOM_CHEST] = ItemLocation::Chest (0x18, 0x04, true, "Stone Tower Temple Updraft Room Chest", STONE_TOWER_TEMPLE_UPDRAFT_ROOM_CHEST, STONE_TOWER_TEMPLE_SMALL_KEY, {Category::cStoneTowerTemple, Category::cVanillaSmallKey,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_STONE_TOWER ); locationTable[STONE_TOWER_TEMPLE_DEATH_ARMOS_ROOM_CHEST] = ItemLocation::Chest (0x18, 0x05, true, "Stone Tower Temple Death Armos Room Chest", STONE_TOWER_TEMPLE_DEATH_ARMOS_ROOM_CHEST, STONE_TOWER_TEMPLE_SMALL_KEY, {Category::cStoneTowerTemple, Category::cVanillaSmallKey,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_STONE_TOWER ); - locationTable[STONE_TOWER_TEMPLE_LIGHT_ARROW_CHEST] = ItemLocation::Chest (0x16, 0x1B, true, "Stone Tower Temple Light Arrow Chest", STONE_TOWER_TEMPLE_LIGHT_ARROW_CHEST, LIGHT_ARROWS, {Category::cStoneTowerTemple,Category::cChest ,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_STONE_TOWER ); - locationTable[STONE_TOWER_TEMPLE_GIANTS_MASK_CHEST] = ItemLocation::Chest (0x36, 0x7D, true, "Stone Tower Temple Giant's Mask Chest", STONE_TOWER_TEMPLE_GIANTS_MASK_CHEST, GIANTS_MASK, {Category::cStoneTowerTemple,Category::cChest, Category::cVanillaMask ,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_STONE_TOWER ); + locationTable[STONE_TOWER_TEMPLE_LIGHT_ARROW_CHEST] = ItemLocation::Chest (0x16, 0x1B, true, "Stone Tower Temple Light Arrow Chest", STONE_TOWER_TEMPLE_LIGHT_ARROW_CHEST, LIGHT_ARROWS, {Category::cStoneTowerTemple,Category::cChest ,Category::cDayOne, Category::cMainInventory}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_STONE_TOWER ); + locationTable[STONE_TOWER_TEMPLE_GIANTS_MASK_CHEST] = ItemLocation::Chest (0x36, 0x00, false, "Stone Tower Temple Giant's Mask Chest", STONE_TOWER_TEMPLE_GIANTS_MASK_CHEST, GIANTS_MASK, {Category::cStoneTowerTemple,Category::cChest, Category::cVanillaMask ,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_STONE_TOWER ); //Pirate Fortress - locationTable[PF_INTERIOR_HOOKSHOT_CHEST] = ItemLocation::Chest (0x23, 0x02, true, "Pirate's Fortress Int Hookshot Chest", PF_INTERIOR_HOOKSHOT_CHEST, HOOKSHOT, {Category::cPiratesFortressInterior,Category::cChest ,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_PIRATE_FORTRESS ); + locationTable[PF_INTERIOR_HOOKSHOT_CHEST] = ItemLocation::Chest (0x23, 0x02, true, "Pirate's Fortress Int Hookshot Chest", PF_INTERIOR_HOOKSHOT_CHEST, HOOKSHOT, {Category::cPiratesFortressInterior,Category::cChest ,Category::cDayOne, Category::cMainInventory}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_PIRATE_FORTRESS ); locationTable[PF_INT_LOWER_CHEST] = ItemLocation::Chest (0x14, 0x00, true, "Pirate's Fortress Int Lower Chest", PF_INT_LOWER_CHEST, RED_RUPEE, {Category::cPiratesFortressInterior,Category::cChest ,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_PIRATE_FORTRESS ); locationTable[PF_INT_UPPER_CHEST] = ItemLocation::Chest (0x14, 0x01, true, "Pirate's Fortress Int Upper Chest", PF_INT_UPPER_CHEST, RED_RUPEE, {Category::cPiratesFortressInterior,Category::cChest ,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_PIRATE_FORTRESS ); locationTable[PF_INT_TANK_CHEST] = ItemLocation::Chest (0x23, 0x00, true, "Pirate's Fortress Int Tank Chest", PF_INT_TANK_CHEST, RED_RUPEE, {Category::cPiratesFortressInterior,Category::cChest ,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_PIRATE_FORTRESS ); @@ -310,15 +317,15 @@ void LocationTable_Init() { locationTable[PF_EXTERIOR_LOG_CHEST] = ItemLocation::Chest (0x3B, 0x00, true, "Pirate's Fortress Ext Log Chest", PF_EXTERIOR_LOG_CHEST, RED_RUPEE, {Category::cPiratesFortressExterior,Category::cChest ,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_PIRATE_FORTRESS ); locationTable[PF_EXTERIOR_SAND_CHEST] = ItemLocation::Chest (0x3B, 0x01, true, "Pirate's Fortress Ext Sand Chest", PF_EXTERIOR_SAND_CHEST, RED_RUPEE, {Category::cPiratesFortressExterior,Category::cChest ,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_PIRATE_FORTRESS ); locationTable[PF_EXTERIOR_CORNER_CHEST] = ItemLocation::Chest (0x3B, 0x02, true, "Pirate's Fortress Ext Corner Chest", PF_EXTERIOR_CORNER_CHEST, RED_RUPEE, {Category::cPiratesFortressExterior,Category::cChest ,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_PIRATE_FORTRESS ); - locationTable[PF_INT_INVISIBLE_SOLDIER] = ItemLocation::Base (0x14, 0x8B, false, "Pirate's Fortress Int Invisible Soldier", PF_INT_INVISIBLE_SOLDIER, STONE_MASK, {Category::cPiratesFortressInterior, Category::cVanillaMask,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_DUNGEON_PIRATE_FORTRESS ); - locationTable[PF_INT_HOOKSHOT_ROOM_ZORA_EGG] = ItemLocation::Collectable(0x23, 0x69, true, "Pirate's Fortress Int Hookshot Room Zora Egg", PF_INT_HOOKSHOT_ROOM_ZORA_EGG, ZORA_EGG, {Category::cPiratesFortressInterior, Category::cBottleCatch,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_PIRATE_FORTRESS ); - locationTable[PF_INT_GUARD_ROOM_ZORA_EGG] = ItemLocation::Collectable(0x23, 0x69, true, "Pirate's Fortress Int Guard Room Zora Egg", PF_INT_GUARD_ROOM_ZORA_EGG, ZORA_EGG, {Category::cPiratesFortressInterior, Category::cBottleCatch,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_PIRATE_FORTRESS ); - locationTable[PF_INT_BARREL_MAZE_ZORA_EGG] = ItemLocation::Collectable(0x23, 0x69, true, "Pirate's Fortress Int Barrel Maze Zora Egg", PF_INT_BARREL_MAZE_ZORA_EGG, ZORA_EGG, {Category::cPiratesFortressInterior, Category::cBottleCatch,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_PIRATE_FORTRESS ); - locationTable[PF_INT_LAVA_ROOM_ZORA_EGG] = ItemLocation::Collectable(0x23, 0x69, true, "Pirate's Fortress Int Lava Room Zora Egg", PF_INT_LAVA_ROOM_ZORA_EGG, ZORA_EGG, {Category::cPiratesFortressInterior, Category::cBottleCatch,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_PIRATE_FORTRESS ); + locationTable[PF_INT_INVISIBLE_SOLDIER] = ItemLocation::Base (0x14, 0x8B, false, "Pirate's Fortress Int Invisible Soldier", PF_INT_INVISIBLE_SOLDIER, STONE_MASK, {Category::cPiratesFortressInterior, Category::cVanillaMask,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_DUNGEON_PIRATE_FORTRESS ); + locationTable[PF_INT_HOOKSHOT_ROOM_ZORA_EGG] = ItemLocation::Collectable(0x23, 0x69, true, "Pirate's Fortress Int Hookshot Room Zora Egg", PF_INT_HOOKSHOT_ROOM_ZORA_EGG, ZORA_EGG, {Category::cPiratesFortressInterior, Category::cBottleCatch,Category::cDayOne, Category::cZoraEgg}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_PIRATE_FORTRESS ); + locationTable[PF_INT_GUARD_ROOM_ZORA_EGG] = ItemLocation::Collectable(0x23, 0x69, true, "Pirate's Fortress Int Guard Room Zora Egg", PF_INT_GUARD_ROOM_ZORA_EGG, ZORA_EGG, {Category::cPiratesFortressInterior, Category::cBottleCatch,Category::cDayOne, Category::cZoraEgg}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_PIRATE_FORTRESS ); + locationTable[PF_INT_BARREL_MAZE_ZORA_EGG] = ItemLocation::Collectable(0x23, 0x69, true, "Pirate's Fortress Int Barrel Maze Zora Egg", PF_INT_BARREL_MAZE_ZORA_EGG, ZORA_EGG, {Category::cPiratesFortressInterior, Category::cBottleCatch,Category::cDayOne, Category::cZoraEgg}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_PIRATE_FORTRESS ); + locationTable[PF_INT_LAVA_ROOM_ZORA_EGG] = ItemLocation::Collectable(0x23, 0x69, true, "Pirate's Fortress Int Lava Room Zora Egg", PF_INT_LAVA_ROOM_ZORA_EGG, ZORA_EGG, {Category::cPiratesFortressInterior, Category::cBottleCatch,Category::cDayOne, Category::cZoraEgg}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_PIRATE_FORTRESS ); //Beneath The Well - locationTable[BENEATH_THE_WELL_MIRROR_SHIELD_CHEST] = ItemLocation::Chest (0x4B, 0x1B, true, "Beneath the Well Mirror Shield Chest" , BENEATH_THE_WELL_MIRROR_SHIELD_CHEST, MIRROR_SHIELD, {Category::cBeneathTheWell,Category::cChest ,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_BENEATH_THE_WELL ); + locationTable[BENEATH_THE_WELL_MIRROR_SHIELD_CHEST] = ItemLocation::Chest (0x4B, 0x1B, true, "Beneath the Well Mirror Shield Chest" , BENEATH_THE_WELL_MIRROR_SHIELD_CHEST, MIRROR_SHIELD, {Category::cBeneathTheWell,Category::cChest ,Category::cDayOne, Category::cMainInventory}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_BENEATH_THE_WELL ); locationTable[WELL_LEFT_PATH_CHEST] = ItemLocation::Chest (0x4B, 0x02, true, "Beneath the Well Left Path Chest" , WELL_LEFT_PATH_CHEST, PURPLE_RUPEE, {Category::cBeneathTheWell,Category::cChest ,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_BENEATH_THE_WELL ); locationTable[WELL_RIGHT_PATH_CHEST] = ItemLocation::Chest (0x4B, 0x01, true, "Beneath the Well Right Path Chest", WELL_RIGHT_PATH_CHEST, PURPLE_RUPEE, {Category::cBeneathTheWell,Category::cChest ,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_BENEATH_THE_WELL ); @@ -334,23 +341,23 @@ void LocationTable_Init() { locationTable[SECRET_SHRINE_FINAL_CHEST] = ItemLocation::Chest (0x60, 0x0A, true, "Secret Shrine Final Chest", SECRET_SHRINE_FINAL_CHEST, PIECE_OF_HEART, {Category::cSecretShrine, Category::cVanillaHeartPiece, Category::cChest, Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SECRET_SHRINE ); //The Moon - locationTable[THE_MOON_DEKU_TRIAL_BONUS] = ItemLocation::Collectable(0x2A, 0x00, false, "The Moon Deku Trial Bonus", THE_MOON_DEKU_TRIAL_BONUS, PIECE_OF_HEART, {Category::cTheMoon,Category::cDayThree}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_THE_MOON ); - locationTable[THE_MOON_GORON_TRIAL_BONUS] = ItemLocation::Collectable(0x3F, 0x00, false, "The Moon Goron Trial Bonus", THE_MOON_GORON_TRIAL_BONUS, PIECE_OF_HEART, {Category::cTheMoon,Category::cDayThree}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_THE_MOON ); - locationTable[THE_MOON_ZORA_TRIAL_BONUS] = ItemLocation::Collectable(0x47, 0x00, false, "The Moon Zora Trial Bonus", THE_MOON_ZORA_TRIAL_BONUS, PIECE_OF_HEART, {Category::cTheMoon,Category::cDayThree}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_THE_MOON ); - locationTable[THE_MOON_LINK_TRIAL_BONUS] = ItemLocation::Collectable(0x66, 0x00, false, "The Moon Link Trial Bonus", THE_MOON_LINK_TRIAL_BONUS, PIECE_OF_HEART, {Category::cTheMoon,Category::cDayThree}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_THE_MOON ); - locationTable[THE_MOON_GARO_CHEST] = ItemLocation::Chest (0x66, 0x01, true, "The Moon Garo Chest", THE_MOON_GARO_CHEST, ARROWS_30, {Category::cTheMoon,Category::cDayThree}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_THE_MOON ); - locationTable[THE_MOON_IRON_KNUCKLE_CHEST] = ItemLocation::Chest (0x67, 0x02, true, "The Moon Iron Knuckle Chest", THE_MOON_IRON_KNUCKLE_CHEST, BOMBCHU_10, {Category::cTheMoon,Category::cDayThree}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_THE_MOON ); - locationTable[THE_MOON_MAJORA_CHILD] = ItemLocation::Base (0x67, 0x7B, false, "The Moon Majora Child", THE_MOON_MAJORA_CHILD, FIERCE_DIETY_MASK, {Category::cTheMoon,Category::cDayThree}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_DUNGEON_THE_MOON ); + locationTable[THE_MOON_DEKU_TRIAL_BONUS] = ItemLocation::Collectable(0x2A, 0x00, false, "The Moon Deku Trial Bonus", THE_MOON_DEKU_TRIAL_BONUS, PIECE_OF_HEART, {Category::cTheMoon,Category::cDayThree, Category::cMoonItems}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_THE_MOON ); + locationTable[THE_MOON_GORON_TRIAL_BONUS] = ItemLocation::Collectable(0x3F, 0x00, false, "The Moon Goron Trial Bonus", THE_MOON_GORON_TRIAL_BONUS, PIECE_OF_HEART, {Category::cTheMoon,Category::cDayThree, Category::cMoonItems}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_THE_MOON ); + locationTable[THE_MOON_ZORA_TRIAL_BONUS] = ItemLocation::Collectable(0x47, 0x00, false, "The Moon Zora Trial Bonus", THE_MOON_ZORA_TRIAL_BONUS, PIECE_OF_HEART, {Category::cTheMoon,Category::cDayThree, Category::cMoonItems}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_THE_MOON ); + locationTable[THE_MOON_LINK_TRIAL_BONUS] = ItemLocation::Collectable(0x66, 0x00, false, "The Moon Link Trial Bonus", THE_MOON_LINK_TRIAL_BONUS, PIECE_OF_HEART, {Category::cTheMoon,Category::cDayThree, Category::cMoonItems}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_THE_MOON ); + locationTable[THE_MOON_GARO_CHEST] = ItemLocation::Chest (0x66, 0x01, true, "The Moon Garo Chest", THE_MOON_GARO_CHEST, ARROWS_30, {Category::cTheMoon,Category::cDayThree, Category::cMoonItems}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_THE_MOON ); + locationTable[THE_MOON_IRON_KNUCKLE_CHEST] = ItemLocation::Chest (0x67, 0x02, true, "The Moon Iron Knuckle Chest", THE_MOON_IRON_KNUCKLE_CHEST, BOMBCHU_10, {Category::cTheMoon,Category::cDayThree, Category::cMoonItems}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_THE_MOON ); + locationTable[THE_MOON_MAJORA_CHILD] = ItemLocation::Base (0x67, 0x7B, false, "The Moon Majora Child", THE_MOON_MAJORA_CHILD, FIERCE_DEITY_MASK, {Category::cTheMoon,Category::cDayThree, Category::cFDM}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_DUNGEON_THE_MOON ); /*------------------------------- --- BOSSES --- -------------------------------*/ locationTable[LINKS_POCKET] = ItemLocation::Base (0x63, 0x00, false, "Link's Pocket", LINKS_POCKET, NONE, {}, SpoilerCollectionCheck::AlwaysCollected(), SpoilerCollectionCheckGroup::GROUP_NO_GROUP ); - locationTable[ODOLWA] = ItemLocation::Reward (0x1F, 0x2D, false, "Woodfall Temple Odolwa's Remains", ODOLWAS_REMAINS, ODOLWAS_REMAINS, {}, SpoilerCollectionCheck::EventChkInf(0), SpoilerCollectionCheckGroup::GROUP_DUNGEON_WOODFALL_TEMPLE ); - locationTable[GOHT] = ItemLocation::Reward (0x44, 0x2F, false, "Snowhead Temple Goht's Remains", GOHTS_REMAINS, GOHTS_REMAINS, {}, SpoilerCollectionCheck::EventChkInf(0), SpoilerCollectionCheckGroup::GROUP_DUNGEON_SNOWHEAD_TEMPLE ); - locationTable[GYORG] = ItemLocation::Reward (0x5F, 0x30, false, "Great Bay Temple Gyorg's Remains", GYORGS_REMAINS, GYORGS_REMAINS, {}, SpoilerCollectionCheck::EventChkInf(0), SpoilerCollectionCheckGroup::GROUP_DUNGEON_GREAT_BAY ); - locationTable[TWINMOLD] = ItemLocation::Reward (0x36, 0x31, false, "Stone Tower Temple Twinmold's Remains", TWINMOLDS_REMAINS, TWINMOLDS_REMAINS, {}, SpoilerCollectionCheck::EventChkInf(0), SpoilerCollectionCheckGroup::GROUP_DUNGEON_STONE_TOWER ); + locationTable[ODOLWA] = ItemLocation::Base (0x1F, 0x2D, false, "Woodfall Temple Odolwa's Remains", ODOLWAS_REMAINS, ODOLWAS_REMAINS, {}, SpoilerCollectionCheck::EventChkInf(0), SpoilerCollectionCheckGroup::GROUP_DUNGEON_WOODFALL_TEMPLE ); + locationTable[GOHT] = ItemLocation::Base (0x44, 0x2F, false, "Snowhead Temple Goht's Remains", GOHTS_REMAINS, GOHTS_REMAINS, {}, SpoilerCollectionCheck::EventChkInf(0), SpoilerCollectionCheckGroup::GROUP_DUNGEON_SNOWHEAD_TEMPLE ); + locationTable[GYORG] = ItemLocation::Base (0x5F, 0x30, false, "Great Bay Temple Gyorg's Remains", GYORGS_REMAINS, GYORGS_REMAINS, {}, SpoilerCollectionCheck::EventChkInf(0), SpoilerCollectionCheckGroup::GROUP_DUNGEON_GREAT_BAY ); + locationTable[TWINMOLD] = ItemLocation::Base (0x36, 0x31, false, "Stone Tower Temple Twinmold's Remains", TWINMOLDS_REMAINS, TWINMOLDS_REMAINS, {}, SpoilerCollectionCheck::EventChkInf(0), SpoilerCollectionCheckGroup::GROUP_DUNGEON_STONE_TOWER ); locationTable[MAJORA] = ItemLocation::Reward (0x0B, 0x00, false, "Majora", MAJORA, MAJORAS_MASK, {}, SpoilerCollectionCheck::None(), SpoilerCollectionCheckGroup::GROUP_DUNGEON_THE_MOON ); /*------------------------------- @@ -500,10 +507,10 @@ void LocationTable_Init() { /*------------------------------- ---HEART CONTAINERS --- -------------------------------*/ - locationTable[ODOLWA_HEART_CONTAINER] = ItemLocation::Base (0x1F, 0x00, false, "Woodfall Temple Odolwa Heart Container", ODOLWA_HEART_CONTAINER, HEART_CONTAINER, {Category::cWoodfall, Category::cWoodfallTemple,Category::cBossHeart, Category::cDungeonReward,Category::cDayOne}, SpoilerCollectionCheck::Collectable(0x00,0x00), SpoilerCollectionCheckGroup::GROUP_DUNGEON_WOODFALL_TEMPLE ); - locationTable[GOHT_HEART_CONTAINER] = ItemLocation::Base (0x44, 0x00, false, "Snowhead Temple Goht Heart Container", GOHT_HEART_CONTAINER, HEART_CONTAINER, {Category::cSnowhead, Category::cSnowheadTemple, Category::cBossHeart, Category::cDungeonReward,Category::cDayOne}, SpoilerCollectionCheck::Collectable(0x00,0x00), SpoilerCollectionCheckGroup::GROUP_DUNGEON_SNOWHEAD_TEMPLE ); - locationTable[GYORG_HEART_CONTAINER] = ItemLocation::Base (0x5F, 0x00, false, "Great Bay Temple Gyorg Heart Container", GYORG_HEART_CONTAINER, HEART_CONTAINER, {Category::cZoraCape, Category::cGreatBayTemple, Category::cBossHeart, Category::cDungeonReward,Category::cDayOne}, SpoilerCollectionCheck::Collectable(0x00,0x00), SpoilerCollectionCheckGroup::GROUP_DUNGEON_GREAT_BAY ); - locationTable[TWINMOLD_HEART_CONTAINER] = ItemLocation::Base (0x36, 0x00, false, "Stone Tower Temple Twinmold Heart Container", TWINMOLD_HEART_CONTAINER, HEART_CONTAINER, {Category::cStoneTower, Category::cStoneTowerTemple,Category::cBossHeart, Category::cDungeonReward,Category::cDayOne}, SpoilerCollectionCheck::Collectable(0x00,0x00), SpoilerCollectionCheckGroup::GROUP_DUNGEON_STONE_TOWER ); + locationTable[ODOLWA_HEART_CONTAINER] = ItemLocation::Base (0x1F, 0x0D, false, "Woodfall Temple Odolwa Heart Container", ODOLWA_HEART_CONTAINER, HEART_CONTAINER, {Category::cWoodfall, Category::cWoodfallTemple,Category::cBossHeart, Category::cDungeonReward,Category::cDayOne}, SpoilerCollectionCheck::Collectable(0x00,0x00), SpoilerCollectionCheckGroup::GROUP_DUNGEON_WOODFALL_TEMPLE ); + locationTable[GOHT_HEART_CONTAINER] = ItemLocation::Base (0x44, 0x0D, false, "Snowhead Temple Goht Heart Container", GOHT_HEART_CONTAINER, HEART_CONTAINER, {Category::cSnowhead, Category::cSnowheadTemple, Category::cBossHeart, Category::cDungeonReward,Category::cDayOne}, SpoilerCollectionCheck::Collectable(0x00,0x00), SpoilerCollectionCheckGroup::GROUP_DUNGEON_SNOWHEAD_TEMPLE ); + locationTable[GYORG_HEART_CONTAINER] = ItemLocation::Base (0x5F, 0x0D, false, "Great Bay Temple Gyorg Heart Container", GYORG_HEART_CONTAINER, HEART_CONTAINER, {Category::cZoraCape, Category::cGreatBayTemple, Category::cBossHeart, Category::cDungeonReward,Category::cDayOne}, SpoilerCollectionCheck::Collectable(0x00,0x00), SpoilerCollectionCheckGroup::GROUP_DUNGEON_GREAT_BAY ); + locationTable[TWINMOLD_HEART_CONTAINER] = ItemLocation::Base (0x36, 0x0D, false, "Stone Tower Temple Twinmold Heart Container", TWINMOLD_HEART_CONTAINER, HEART_CONTAINER, {Category::cStoneTower, Category::cStoneTowerTemple,Category::cBossHeart, Category::cDungeonReward,Category::cDayOne}, SpoilerCollectionCheck::Collectable(0x00,0x00), SpoilerCollectionCheckGroup::GROUP_DUNGEON_STONE_TOWER ); /*------------------------------- --- COWS --- @@ -530,8 +537,8 @@ void LocationTable_Init() { locationTable[TINGLE_TWIN_ISLANDS_SH] = ItemLocation::Base (0x5D, 0xB6, false, "TI Tingle Snowhead Map Buy", TINGLE_TWIN_ISLANDS_SH, SNOWHEAD_MAP, {Category::cTwinIslands, Category::cTingleMap,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_TWIN_ISLANDS); locationTable[TINGLE_TWIN_ISLANDS_RR] = ItemLocation::Base (0x5D, 0xB7, false, "TI Tingle Romani Ranch Buy", TINGLE_TWIN_ISLANDS_RR, ROMANI_RANCH_MAP, {Category::cTwinIslands, Category::cTingleMap, Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_TWIN_ISLANDS); - locationTable[TINGLE_TWIN_ISLANDS_SH_SPRING] = ItemLocation::Base (0x5E, 0xB6, false, "TI Tingle Snowhead Map Buy (Spring)", TINGLE_TWIN_ISLANDS_SH_SPRING, SNOWHEAD_MAP, {Category::cTwinIslands, Category::cTingleMap, Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_TWIN_ISLANDS); - locationTable[TINGLE_TWIN_ISLANDS_RR_SPRING] = ItemLocation::Base (0x5E, 0xB7, false, "TI Tingle Romani Ranch Map Buy (Spring)", TINGLE_TWIN_ISLANDS_RR_SPRING, ROMANI_RANCH_MAP, {Category::cTwinIslands, Category::cTingleMap, Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_TWIN_ISLANDS); + locationTable[TINGLE_TWIN_ISLANDS_SH_SPRING] = ItemLocation::Base (0x5E, 0xB6, false, "TI Tingle Snowhead Map Buy (Spring)", TINGLE_TWIN_ISLANDS_SH_SPRING, SNOWHEAD_MAP, {Category::cTwinIslands, Category::cTingleMap, Category::cDayOne, Category::cAlternateCheck}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_TWIN_ISLANDS); + locationTable[TINGLE_TWIN_ISLANDS_RR_SPRING] = ItemLocation::Base (0x5E, 0xB7, false, "TI Tingle Romani Ranch Map Buy (Spring)", TINGLE_TWIN_ISLANDS_RR_SPRING, ROMANI_RANCH_MAP, {Category::cTwinIslands, Category::cTingleMap, Category::cDayOne, Category::cAlternateCheck}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_TWIN_ISLANDS); locationTable[TINGLE_MILK_ROAD_RR] = ItemLocation::Base (0x22, 0xB7, false, "MR Tingle Romani Ranch Map Buy", TINGLE_MILK_ROAD_RR, ROMANI_RANCH_MAP, {Category::cMilkRoad, Category::cTingleMap,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_MILK_ROAD); locationTable[TINGLE_MILK_ROAD_GB] = ItemLocation::Base (0x22, 0xB8, false, "MR Tingle Great Bay Map Buy", TINGLE_MILK_ROAD_GB, GREAT_BAY_MAP, {Category::cMilkRoad, Category::cTingleMap, Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_MILK_ROAD); @@ -819,6 +826,10 @@ std::vector overworldLocations = { GORON_VILLAGE_GORON_LULLABY, LENS_CAVE_RED_RUPEE, LENS_CAVE_PURPLE_RUPEE, + GORON_VILLAGE_POWDER_KEG_CHALLENGE_SPRING, + GORON_VILLAGE_SCRUB_PURCHASE_SPRING, + GORON_VILLAGE_SCRUB_TRADE_SPRING, + GORON_VILLAGE_LEDGE_SPRING, GORON_SHOP_ITEM_1, GORON_SHOP_ITEM_2, GORON_SHOP_ITEM_3, @@ -871,6 +882,7 @@ std::vector overworldLocations = { MOUNTAIN_VILLAGE_SMITH_DAY_ONE, MOUNTAIN_VILLAGE_SMITH_DAY_TWO, MOUNTAIN_VILLAGE_FROG_CHOIR, + MOUNTAIN_VILLAGE_KEATON_QUIZ, MOUNTAIN_VILLAGE_DARMANI, MOUNTAIN_VILLAGE_HUNGRY_GORON, MOUNTAIN_WATERFALL_CHEST, @@ -912,6 +924,7 @@ std::vector overworldLocations = { ROMANI_RANCH_DOG_RACE, ROMANI_RANCH_GROG, ROMANI_RANCH_CREMIA_ESCORT, + ROMANI_RANCH_ROMANIS_GAME, ROMANI_RANCH_COW_1, ROMANI_RANCH_COW_2, ROMANI_RANCH_COW_3, @@ -942,6 +955,9 @@ std::vector overworldLocations = { //SOUTHERN_SWAMP_PICTOGRAPH_STANDARD, //SOUTHERN_SWAMP_PICTOGRAPH_GOOD, SOUTHERN_SWAMP_SCRUB_PURCHASE, + SOUTHERN_SWAMP_SCRUB_PURCHASE_CLEAR, + SOUTHERN_SWAMP_SCRUB_TRADE_CLEAR, + SWAMP_TOURIST_CENTER_ROOF_CLEAR, POTION_SHOP_ITEM_1, POTION_SHOP_ITEM_2, POTION_SHOP_ITEM_3, @@ -979,6 +995,7 @@ std::vector overworldLocations = { TWIN_ISLANDS_GORON_RACETRACK_GROTTO_CHEST, TWIN_ISLANDS_UNDERWATER_RAMP_CHEST, TWIN_ISLANDS_CAVE_CHEST, + TWIN_ISLANDS_LULLABY_INTRO, TINGLE_TWIN_ISLANDS_SH, TINGLE_TWIN_ISLANDS_RR, TINGLE_TWIN_ISLANDS_SH_SPRING, @@ -991,7 +1008,6 @@ std::vector overworldLocations = { W_CLOCK_TOWN_SWORDSMANS_SCHOOL, W_CLOCK_TOWN_ALL_NIGHT_MASK_BUY, W_CLOCK_TOWN_BOMB_SHOP_GORON, - W_CLOCK_TOWN_POSTBOX, //W_CLOCK_TOWN_LOTTERY, TRADING_POST_ITEM_1, TRADING_POST_ITEM_2, @@ -1110,18 +1126,23 @@ std::vector GetLocations(const std::vector& locationPo } void LocationReset() { - for (LocationKey il : allLocations) { +/*for (LocationKey il : allLocations) { Location(il)->RemoveFromPool(); } for (LocationKey il : dungeonRewardLocations) { Location(il)->RemoveFromPool(); - } + }*/ for (LocationKey il : gossipStoneLocations) { Location(il)->RemoveFromPool(); } + // Something's still missing from allLocations, IDK what though and this fixes it + for (LocationKey il = LINKS_POCKET; il <= OSH_COLORED_SKULLS_POT; il++) { + Location(il)->RemoveFromPool(); + } + //Location(GANONDORF_HINT)->RemoveFromPool(); } @@ -1167,7 +1188,6 @@ void CreateItemOverrides() { auto loc7 = Location(S_CLOCK_TOWN_POSTBOX); PlaceItemInLocation(N_CLOCK_TOWN_POSTBOX, loc7->GetPlacedItemKey()); PlaceItemInLocation(E_CLOCK_TOWN_POSTBOX, loc7->GetPlacedItemKey()); - PlaceItemInLocation(W_CLOCK_TOWN_POSTBOX, loc7->GetPlacedItemKey()); //Duplicate Tingle Maps so each map buy is the same in both locaations auto loc8 = Location(TINGLE_N_CLOCK_TOWN_CT); //get clocktown map item auto loc9 = Location(TINGLE_ROAD_TO_SS_WF); //get swamp map item @@ -1183,8 +1203,26 @@ void CreateItemOverrides() { PlaceItemInLocation(TINGLE_MILK_ROAD_GB, loc12->GetPlacedItemKey());//copy great bay map into ranch PlaceItemInLocation(TINGLE_GBC_ST, loc13->GetPlacedItemKey());//copy stone tower map into great bay PlaceItemInLocation(TINGLE_IKANA_CANYON_CT, loc8->GetPlacedItemKey()); //copy clocktown into stone tower + //Keaton Quiz auto loc14 = Location(N_CLOCK_TOWN_KEATON_QUIZ); PlaceItemInLocation(MILK_ROAD_KEATON_QUIZ, loc14->GetPlacedItemKey());//copy NCT keaton quiz item to milk road + PlaceItemInLocation(MOUNTAIN_VILLAGE_KEATON_QUIZ, loc14->GetPlacedItemKey());//copy NCT keaton quiz item to Mountain Village + //Spring time Goron Village + auto loc15 = Location(GORON_VILLAGE_POWDER_KEG_CHALLENGE); + auto loc16 = Location(GORON_VILLAGE_SCRUB_PURCHASE); + auto loc17 = Location(GORON_VILLAGE_SCRUB_TRADE); + auto loc18 = Location(GORON_VILLAGE_LEDGE); + PlaceItemInLocation(GORON_VILLAGE_POWDER_KEG_CHALLENGE_SPRING, loc15->GetPlacedItemKey()); + PlaceItemInLocation(GORON_VILLAGE_SCRUB_PURCHASE_SPRING, loc16->GetPlacedItemKey()); + PlaceItemInLocation(GORON_VILLAGE_SCRUB_TRADE_SPRING, loc17->GetPlacedItemKey()); + PlaceItemInLocation(GORON_VILLAGE_LEDGE_SPRING, loc18->GetPlacedItemKey()); + //Cleared Southern Swamp + auto loc19 = Location(SOUTHERN_SWAMP_SCRUB_PURCHASE); + auto loc20 = Location(SOUTHERN_SWAMP_SCRUB_TRADE); + auto loc21 = Location(SWAMP_TOURIST_CENTER_ROOF); + PlaceItemInLocation(SOUTHERN_SWAMP_SCRUB_PURCHASE_CLEAR, loc19->GetPlacedItemKey()); + PlaceItemInLocation(SOUTHERN_SWAMP_SCRUB_TRADE_CLEAR, loc20->GetPlacedItemKey()); + PlaceItemInLocation(SWAMP_TOURIST_CENTER_ROOF_CLEAR, loc21->GetPlacedItemKey()); for (LocationKey locKey : allLocations) { auto loc = Location(locKey); @@ -1201,8 +1239,8 @@ void CreateItemOverrides() { //PlacementLog_Msg(std::to_string(loc->GetScene())); PlacementLog_Msg("\tScene: "); PlacementLog_Msg(std::to_string(loc->Key().scene)); - //PlacementLog_Msg("\tType: "); - //PlacementLog_Msg(std::to_string(loc->Key().type)); + PlacementLog_Msg("\tType: "); + PlacementLog_Msg(std::to_string((u8)loc->Key().type)); //PlacementLog_Msg("\tLoc's Flag: "); //PlacementLog_Msg(std::to_string(loc->GetFlag())); PlacementLog_Msg("\tFlag: "); diff --git a/source/item_pool.cpp b/source/item_pool.cpp index cb64191..e7fcda4 100644 --- a/source/item_pool.cpp +++ b/source/item_pool.cpp @@ -103,7 +103,7 @@ const std::array easyItems = { GAROS_MASK, CAPTAINS_HAT, GIANTS_MASK, - FIERCE_DIETY_MASK, + FIERCE_DEITY_MASK, MASK_OF_TRUTH, EMPTY_BOTTLE1, EMPTY_BOTTLE2, @@ -257,7 +257,7 @@ const std::array chestItems = { MIRROR_SHIELD, }; -const std::array songList = { +const std::array songList = { //SONG_OF_TIME, //SONG_OF_DOUBLE_TIME, //INVERTED_SONG_OF_TIME, //SoT not included yet @@ -266,6 +266,7 @@ const std::array songList = { SONG_OF_HEALING, //SONG_OF_SOARING, SONATA_OF_AWAKENING, + LULLABY_INTRO, GORONS_LULLABY, NEW_WAVE_BOSSA_NOVA, ELEGY_OF_EMPTINESS, @@ -275,6 +276,7 @@ const std::array songList = { static void PlaceVanillaSongs() { PlaceItemInLocation(HMS_SONG_OF_HEALING, SONG_OF_HEALING); PlaceItemInLocation(DEKU_PALACE_IMPRISONED_MONKEY, SONATA_OF_AWAKENING); + PlaceItemInLocation(TWIN_ISLANDS_LULLABY_INTRO, LULLABY_INTRO); PlaceItemInLocation(GORON_VILLAGE_GORON_LULLABY, GORONS_LULLABY); PlaceItemInLocation(ROMANI_RANCH_ROMANIS_GAME, EPONAS_SONG); PlaceItemInLocation(GBC_BABY_ZORAS, NEW_WAVE_BOSSA_NOVA); @@ -283,6 +285,7 @@ static void PlaceVanillaSongs() { PlaceItemInLocation(GIANTS_OATH_TO_ORDER, OATH_TO_ORDER); }; +// TODO: Change back to 18 when the override value is correct. const std::array maskList = { KEATON_MASK, BUNNY_HOOD, @@ -300,7 +303,7 @@ const std::array maskList = { GIBDOS_MASK, GAROS_MASK, CAPTAINS_HAT, - GIANTS_MASK, + GIANTS_MASK, MASK_OF_TRUTH, }; @@ -353,6 +356,7 @@ static void PlaceVanillaMainInventory() { PlaceItemInLocation(STONE_TOWER_TEMPLE_LIGHT_ARROW_CHEST, LIGHT_ARROWS); //PlaceItemInLocation(DEKU_PALACE_BEAN_DADDY, MAGIC_BEAN);//Shopsanity PlaceItemInLocation(GORON_VILLAGE_POWDER_KEG_CHALLENGE, POWDER_KEG); + PlaceItemInLocation(GORON_VILLAGE_POWDER_KEG_CHALLENGE_SPRING, POWDER_KEG); PlaceItemInLocation(SOUTHERN_SWAMP_KOTAKE, PICTOGRAPH_BOX); PlaceItemInLocation(PF_INTERIOR_HOOKSHOT_CHEST, HOOKSHOT); PlaceItemInLocation(GORON_VILLAGE_LENS_OF_TRUTH_CHEST, LENS_OF_TRUTH); @@ -361,17 +365,17 @@ static void PlaceVanillaMainInventory() { PlaceItemInLocation(TWIN_ISLANDS_GORON_RACE, GOLD_DUST); PlaceItemInLocation(E_CLOCK_TOWN_AROMA_IN_BAR, CHATEAU_ROMANI); PlaceItemInLocation(GORMAN_TRACK_MYSTERY_MILK_QUEST, BOTTLE_WITH_MYSTERY_MILK); - PlaceItemInLocation(ZORA_CAPE_BEAVER_RACE_1,EMPTY_BOTTLE2); - PlaceItemInLocation(IKANA_GRAVEYARD_DAMPE_DIGGING,EMPTY_BOTTLE1); + PlaceItemInLocation(SOUTHERN_SWAMP_BOAT_ARCHERY, EMPTY_BOTTLE1); + PlaceItemInLocation(ZORA_CAPE_BEAVER_RACE_1, EMPTY_BOTTLE2); PlaceItemInLocation(ROMANI_RANCH_ALIEN_DEFENSE,BOTTLE_WITH_MILK); PlaceItemInLocation(GBC_FISHERMAN_PHOTO, SEAHORSE); }; -const std::array progressiveItemsList = { +const std::array progressiveItemsList = { PROGRESSIVE_BOW, PROGRESSIVE_BOW, PROGRESSIVE_BOW, //1 Bow + 2 Quiver Upgrades - PROGRESSIVE_BOMB_BAG, + //PROGRESSIVE_BOMB_BAG, //PROGRESSIVE_BOMB_BAG, //PROGRESSIVE_BOMB_BAG, //3 Bomb Bags - 2 are in Bomb Shop - part of Shopsanity //PROGRESSIVE_MAGIC_METER, @@ -457,10 +461,10 @@ const std::array scrubPurchaseItems = { BLUE_POTION_REFILL, }; -const std::array moonItemList = { +const std::array moonItemList = { //2Chests and 4 trial rewards, FDM separate - ARROWS_30, - BOMBCHU_10, + //ARROWS_30, -just replace with junk + //BOMBCHU_10, PIECE_OF_HEART, PIECE_OF_HEART, PIECE_OF_HEART, @@ -491,6 +495,7 @@ std::array zoraEggs = { ZORA_EGG, ZORA_EGG, ZORA_EGG, + ZORA_EGG, }; std::array tingleMaps = { @@ -797,7 +802,8 @@ static void PlaceVanillaShopItems() { PlaceItemInLocation(TRADING_POST_ITEM_7, BUY_DEKU_NUT_10); PlaceItemInLocation(TRADING_POST_ITEM_8, BUY_MAGIC_BEAN); PlaceItemInLocation(BOMB_SHOP_ITEM_1, BUY_BOMBS_10); - PlaceItemInLocation(BOMB_SHOP_ITEM_2, BUY_BOMBCHU_10); + PlaceItemInLocation(BOMB_SHOP_ITEM_2, BUY_BOMBCHU_10); + PlaceItemInLocation(W_CLOCK_TOWN_BOMB_SHOP_GORON, POWDER_KEG); PlaceItemInLocation(POTION_SHOP_ITEM_1, BUY_BLUE_POTION); PlaceItemInLocation(POTION_SHOP_ITEM_2, BUY_GREEN_POTION); PlaceItemInLocation(POTION_SHOP_ITEM_3, BUY_RED_POTION); @@ -808,18 +814,33 @@ static void PlaceVanillaShopItems() { PlaceItemInLocation(ZORA_SHOP_ITEM_2, BUY_ARROWS_10); PlaceItemInLocation(ZORA_SHOP_ITEM_3, BUY_RED_POTION); PlaceItemInLocation(GORON_VILLAGE_SCRUB_PURCHASE, PROGRESSIVE_BOMB_BAG); + PlaceItemInLocation(GORON_VILLAGE_SCRUB_PURCHASE_SPRING, PROGRESSIVE_BOMB_BAG); PlaceItemInLocation(IKANA_CANYON_SCRUB_PURCHASE, BLUE_POTION_REFILL); PlaceItemInLocation(ZORA_HALL_SCRUB_PURCHASE, GREEN_POTION_REFILL); PlaceItemInLocation(MILK_ROAD_GORMAN_MILK_BUY, MILK); //other 2 scrub sales handled in beans and main inventory }; -/* + static void SetScarceItemPool() { - //todo + ReplaceMaxItem(BOMBCHU_5, 1); + ReplaceMaxItem(BOMBCHU_10, 3); + ReplaceMaxItem(PROGRESSIVE_MAGIC_METER, 1); + ReplaceMaxItem(DOUBLE_DEFENSE, 0); + ReplaceMaxItem(PROGRESSIVE_BOW, 2); + ReplaceMaxItem(PROGRESSIVE_BOMB_BAG, 2); + ReplaceMaxItem(HEART_CONTAINER, 0); + }; static void SetMinimalItemPool(){ - //todo -};*/ + ReplaceMaxItem(BOMBCHU_5, 1); + ReplaceMaxItem(BOMBCHU_10, 0); + ReplaceMaxItem(BOMBCHU_20,0); + ReplaceMaxItem(PROGRESSIVE_MAGIC_METER, 1); + ReplaceMaxItem(PROGRESSIVE_BOW,1); + ReplaceMaxItem(PROGRESSIVE_BOMB_BAG, 1); + ReplaceMaxItem(PIECE_OF_HEART,0); + //ReplaceMaxItem(HEART_CONTAINER, 2); +}; void GenerateItemPool() { @@ -873,20 +894,25 @@ void GenerateItemPool() { //temp placement until shopsanity works PlaceItemInLocation(SOUTHERN_SWAMP_SCRUB_PURCHASE, MAGIC_BEAN); - //Place Temp Items at alt locations so they don't get filled with important stuff - will be replaced later PlaceItemInLocation(SOUTHERN_SWAMP_KOTAKE_IN_WOODS, BLUE_RUPEE); PlaceItemInLocation(N_CLOCK_TOWN_POSTBOX, BLUE_RUPEE); PlaceItemInLocation(E_CLOCK_TOWN_POSTBOX, BLUE_RUPEE); - PlaceItemInLocation(W_CLOCK_TOWN_POSTBOX, BLUE_RUPEE); PlaceItemInLocation(MILK_ROAD_KEATON_QUIZ, BLUE_RUPEE); - + PlaceItemInLocation(MOUNTAIN_VILLAGE_KEATON_QUIZ, BLUE_RUPEE); + PlaceItemInLocation(GORON_VILLAGE_POWDER_KEG_CHALLENGE_SPRING, BLUE_RUPEE); + PlaceItemInLocation(GORON_VILLAGE_SCRUB_PURCHASE_SPRING, BLUE_RUPEE); + PlaceItemInLocation(GORON_VILLAGE_SCRUB_TRADE_SPRING, BLUE_RUPEE); + PlaceItemInLocation(GORON_VILLAGE_LEDGE_SPRING, BLUE_RUPEE); + PlaceItemInLocation(SOUTHERN_SWAMP_SCRUB_PURCHASE_CLEAR, BLUE_RUPEE); + PlaceItemInLocation(SOUTHERN_SWAMP_SCRUB_TRADE_CLEAR, BLUE_RUPEE); + PlaceItemInLocation(SWAMP_TOURIST_CENTER_ROOF_CLEAR, BLUE_RUPEE); //Check Non Dungeon Settings //KOKIRISWORD SHUFFLE if(StartingKokiriSword.Value() == (u8)StartingSwordSetting::STARTINGSWORD_NONE) {//if starting with no sword we need to add an extra to the pool - AddItemToMainPool(PROGRESSIVE_SWORD); + AddItemToMainPool(PROGRESSIVE_SWORD, 1); IceTrapModels.push_back(0x37);//GetItemID::GI_KOKIRI_SWORD PlaceItemInLocation(HMS_STARTING_SWORD,GREEN_RUPEE);//Add Junk to this location because theres no way to get it otherwise } else { @@ -895,7 +921,7 @@ void GenerateItemPool() { //SHUFFLE STARTING SHIELD if(StartingShield.Value() == (u8)StartingSheildSetting::STARTINGSHIELD_NONE){//if starting with no shield add an extra to the pool - AddItemToMainPool(HEROS_SHIELD); + AddItemToMainPool(HEROS_SHIELD, 1); PlaceItemInLocation(HMS_STARTING_SHIELD, GREEN_RUPEE);//PlaceJunk Here because you cant not get this } else { PlaceItemInLocation(HMS_STARTING_SHIELD, HEROS_SHIELD);}//if starting with any other shield place this here because this location is unobtainable @@ -954,7 +980,9 @@ void GenerateItemPool() { if (ShuffleMasks) { AddItemsToPool(ItemPool, maskList); } - else {PlaceVanillaMasks();} + else { + PlaceVanillaMasks(); + } //SONG SHUFFLE //add extra songs only if song shuffle is anywhere @@ -967,6 +995,10 @@ void GenerateItemPool() { //else { PlaceVanillaSongs(); //} + if (StartingSongOfHealing.Value() == u8(1)){//if starting with song of healing fill deku mask and notebook spots as they are unobtainable + PlaceItemInLocation(HMS_DEKU_MASK, GREEN_RUPEE); + PlaceItemInLocation(HMS_BOMBERS_NOTEBOOK, GREEN_RUPEE); + } //if (ShuffleSoaring) //{ @@ -978,20 +1010,21 @@ void GenerateItemPool() { //GREAT FAIRY SHUFFLE - if(ShuffleGFRewards.Is(GreatFairyRewardShuffleSetting::GFREWARDSHUFFLE_ANYWHERE)){ - AddItemToMainPool(PROGRESSIVE_MAGIC_METER); - AddItemToMainPool(PROGRESSIVE_MAGIC_METER); - AddItemToMainPool(SPIN_ATTACK); - if(ShuffleMainInventory){AddItemToMainPool(GREAT_FAIRYS_SWORD);} - if(!RemoveDoubleDefense){AddItemToMainPool(DOUBLE_DEFENSE);} - } - else{ + if(ShuffleGFRewards.Is((u8)GreatFairyRewardShuffleSetting::GFREWARDSHUFFLE_VANILLA)){ PlaceItemInLocation(N_CLOCK_TOWN_GREAT_FAIRY_DEKU, PROGRESSIVE_MAGIC_METER); PlaceItemInLocation(WOODFALL_GREAT_FAIRY, SPIN_ATTACK); PlaceItemInLocation(SNOWHEAD_GREAT_FAIRY, PROGRESSIVE_MAGIC_METER); if(!ShuffleMainInventory){PlaceItemInLocation(IKANA_CANYON_GREAT_FAIRY, GREAT_FAIRYS_SWORD);} if(!RemoveDoubleDefense){PlaceItemInLocation(ZORA_CAPE_GREAT_FAIRY, DOUBLE_DEFENSE);} } + else{ + + AddItemToMainPool(PROGRESSIVE_MAGIC_METER); + AddItemToMainPool(PROGRESSIVE_MAGIC_METER); + AddItemToMainPool(SPIN_ATTACK); + if(ShuffleMainInventory){AddItemToMainPool(GREAT_FAIRYS_SWORD);} + if(!RemoveDoubleDefense){AddItemToMainPool(DOUBLE_DEFENSE);} + } //REMOVE DD MAYBE? if (RemoveDoubleDefense) { //Prob not needed since its not added unless this is off @@ -1012,12 +1045,12 @@ void GenerateItemPool() { PlaceItemInLocation(GBC_MIKAU, ZORA_MASK); } - //FIERECE DIETY SHUFFLE - if(ShuffleFierceDiety){ - AddItemToMainPool(FIERCE_DIETY_MASK); + //FIERECE DEITY SHUFFLE + if(ShuffleFierceDeity){ + AddItemToMainPool(FIERCE_DEITY_MASK); } else{ - PlaceItemInLocation(THE_MOON_MAJORA_CHILD,FIERCE_DIETY_MASK); + PlaceItemInLocation(THE_MOON_MAJORA_CHILD,FIERCE_DEITY_MASK); } //PIECEOFHEART SHUFFLE @@ -1067,14 +1100,14 @@ void GenerateItemPool() { if (ShuffleTradeItems){//TradeItems refers to Anju&Kafei Items AddItemsToPool(ItemPool, anjuKafeiTradeItems); } else { - if(ShuffleMasks){ - AddItemToMainPool(KAFEIS_MASK); - AddItemToMainPool(COUPLES_MASK); - } - else{ + //if(ShuffleMasks){ //-Kafei & Couples Mask part of A&K not masks + // AddItemToMainPool(KAFEIS_MASK); + // AddItemToMainPool(COUPLES_MASK); + //} + //else{ PlaceItemInLocation(E_CLOCK_TOWN_AROMA_IN_OFFICE, KAFEIS_MASK); PlaceItemInLocation(STOCKPOTINN_ANJU_AND_KAFEI, COUPLES_MASK); - } + //} PlaceItemInLocation(STOCKPOTINN_MIDNIGHT_MEETING, LETTER_KAFEI); PlaceItemInLocation(LAUNDRY_POOL_CURIOSITY_SHOP_MAN_TWO, LETTER_MAMA); PlaceItemInLocation(STOCKPOTINN_RESERVATION, ROOM_KEY); @@ -1164,7 +1197,6 @@ void GenerateItemPool() { AddItemToMainPool(dungeon->GetCompass()); } } - AddItemsToPool(ItemPool, tingleMaps); } if (Keysanity.Is(KeysanitySetting::KEYSANITY_VANILLA)) { @@ -1206,18 +1238,18 @@ void GenerateItemPool() { // TO-DO ItemPool for extra items & Scarce and Minimal pools - /*if (ItemPoolValue.Is(ITEMPOOL_PLENTIFUL)) { + //if (ItemPoolValue.Is(ITEMPOOL_PLENTIFUL)) { //AddItemsToPool(ItemPool, easyItems); - } - else { + //} + //else { //AddItemsToPool(ItemPool, normalItems); - } - if (ItemPoolValue.Is(ITEMPOOL_SCARCE)) {//TO DO + //} + if (ItemPoolValue.Is(ItemPoolSetting::ITEMPOOL_SCARCE)) {//TO DO SetScarceItemPool(); } - else if (ItemPoolValue.Is(ITEMPOOL_MINIMAL)) { + else if (ItemPoolValue.Is(ItemPoolSetting::ITEMPOOL_MINIMAL)) { SetMinimalItemPool(); - }*/ + } if (ItemPoolValue.Is(ItemPoolSetting::ITEMPOOL_PLENTIFUL)) { @@ -1241,7 +1273,6 @@ void GenerateItemPool() { AddItemToPool(PendingJunkPool, STONE_TOWER_TEMPLE_BOSS_KEY); } - } //Replace ice traps with junk from the pending junk pool if necessary diff --git a/source/location_access.cpp b/source/location_access.cpp index 61b6aa9..48ac88e 100644 --- a/source/location_access.cpp +++ b/source/location_access.cpp @@ -16,8 +16,13 @@ using namespace Settings; bool LocationAccess::ConditionsMet() const { - //Area* parentRegion = AreaTable(Location(location)->GetParentRegionKey()); - bool conditionsMet = true; + + bool conditionsMet = false; + + UpdateHelpers(); + if (GetConditionsMet()) { + conditionsMet= true; + } return conditionsMet;// && CanBuy(); } @@ -161,7 +166,7 @@ bool Area::CheckAllAccess(const AreaKey exitKey) { for(Entrance& exit: exits) { if(exit.GetAreaKey() == exitKey) { - exit.ConditionsMet(); + exit.GetConditionsMet(); } } return false; @@ -223,9 +228,9 @@ void AreaTable_Init() { //Locations LocationAccess(N_CLOCK_TOWN_KEATON_QUIZ, {[] {return KeatonMask;}}), LocationAccess(N_CLOCK_TOWN_TREE, {[] {return true;}}), - LocationAccess(N_CLOCK_TOWN_OLD_LADY, {[] {return Fighting || Bow;}}), - LocationAccess(TINGLE_N_CLOCK_TOWN_CT, {[]{return (ProgressiveMagic = 0) || ( (DekuMask && MagicMeter) || Bow || Hookshot || ZoraMask );}}), - LocationAccess(TINGLE_N_CLOCK_TOWN_WF, {[]{return (ProgressiveMagic = 0) || ( (DekuMask && MagicMeter) || Bow || Hookshot || ZoraMask );}}), + LocationAccess(N_CLOCK_TOWN_OLD_LADY, {[] {return Fighting;}}), + LocationAccess(TINGLE_N_CLOCK_TOWN_CT, {[]{return (DekuMask && MagicMeter) || Bow || Hookshot || ZoraMask;}}), + LocationAccess(TINGLE_N_CLOCK_TOWN_WF, {[]{return (DekuMask && MagicMeter) || Bow || Hookshot || ZoraMask;}}), LocationAccess(N_CLOCK_TOWN_POSTBOX, {[]{return PostmansHat;}}), }, @@ -243,7 +248,7 @@ void AreaTable_Init() { }, { //Locations - LocationAccess(N_CLOCK_TOWN_GREAT_FAIRY_DEKU, {[] {return ClockTownStrayFairy && (ZoraMask || DekuMask || GoronMask );}}), + LocationAccess(N_CLOCK_TOWN_GREAT_FAIRY_DEKU, {[] {return ClockTownStrayFairy && DekuMask;}}), LocationAccess(N_CLOCK_TOWN_GREAT_FAIRY_HUMAN, {[] {return ClockTownStrayFairy;}}), }, @@ -278,8 +283,8 @@ void AreaTable_Init() { //Exits Entrance(N_CLOCK_TOWN, {[]{return true;}}), Entrance(TERMINA_FIELD, {[]{return true;}}), - Entrance(CLOCK_TOWN_OBSERVATORY, {[]{return true;}}), - Entrance(STOCKPOTINN, {[]{return true;}}),//to-Do StockPotInn Night Access + Entrance(CLOCK_TOWN_OBSERVATORY, {[]{return BombersNotebook || SkipBombersMinigame;}}), + Entrance(STOCKPOTINN, {[]{return true;}}),//to-Do Stock Pot Inn Night Access Entrance(CLOCK_TOWN_BAR, {[]{return RomanisMask;}}), Entrance(CLOCK_TOWN_HONEY_DARLING, {[]{return true;}}), Entrance(CLOCK_TOWN_TREASURE_CHEST_GAME, {[]{return true;}}), @@ -288,8 +293,9 @@ void AreaTable_Init() { Entrance(S_CLOCK_TOWN, {[]{return true;}}), }); - areaTable[STOCKPOTINN] = Area("StockPotInn", "StockPotInn", STOCKPOTINN, { + areaTable[STOCKPOTINN] = Area("Stock Pot Inn", "Stock Pot Inn", STOCKPOTINN, { //Events + EventAccess(&MilkQuestStart, {[] {return CircusLeadersMask;}}), }, { //Locations @@ -298,13 +304,13 @@ void AreaTable_Init() { }, { //Exits - Entrance(STOCKPOTINN_GUEST_ROOM, {[]{return GoronMask;}}), + Entrance(STOCKPOTINN_GUEST_ROOM, {[]{return RoomKey;}}), Entrance(STOCKPOTINN_STAFF_ROOM, {[]{return true;}}), Entrance(STOCKPOTINN_GRANDMA_ROOM, {[]{return true;}}), Entrance(E_CLOCK_TOWN, {[]{return true;}}), }); - areaTable[STOCKPOTINN_GUEST_ROOM] = Area("StockPotInn Guest Room", "StockPotInn Guest Room", NONE, { + areaTable[STOCKPOTINN_GUEST_ROOM] = Area("Stock Pot Inn Guest Room", "Stock Pot Inn Guest Room", NONE, { //Events //Listen to Anju? --probably not needed as its not hard required }, @@ -317,13 +323,13 @@ void AreaTable_Init() { Entrance(STOCKPOTINN, {[]{return true;}}), }); - areaTable[STOCKPOTINN_STAFF_ROOM] = Area("StockPotInn Staff Room", "StockPotInn Staff Room", NONE, { + areaTable[STOCKPOTINN_STAFF_ROOM] = Area("Stock Pot Inn Staff Room", "Stock Pot Inn Staff Room", NONE, { //Events }, { //Locations LocationAccess(STOCKPOTINN_MIDNIGHT_MEETING, {[] {return KafeisMask && (DekuMask || RoomKey);}}), - LocationAccess(STOCKPOTINN_ANJU_AND_KAFEI, {[] {return KafeisMask && LetterKafei && PendantOfMemories && SunMask;}}), + LocationAccess(STOCKPOTINN_ANJU_AND_KAFEI, {[] {return KafeisMask && LetterKafei && PendantAccess && SunMask;}}), LocationAccess(STOCKPOTINN_STAFF_ROOM_CHEST, {[] {return true;}}),//Day 3? }, { @@ -331,7 +337,7 @@ void AreaTable_Init() { Entrance(STOCKPOTINN, {[]{return true;}}), }); - areaTable[STOCKPOTINN_GRANDMA_ROOM] = Area("StockPotInn Grandma's Room", "StockPotInn Grandma's Room", NONE, { + areaTable[STOCKPOTINN_GRANDMA_ROOM] = Area("Stock Pot Inn Grandma's Room", "Stock Pot Inn Grandma's Room", NONE, { //Events }, { @@ -347,10 +353,11 @@ void AreaTable_Init() { areaTable[CLOCK_TOWN_OBSERVATORY] = Area("Astral Observatory/Bombers Hideout", "Astral Obseravtory/Bombers Hideout", NONE, { //Events EventAccess(&WatchMoonTearFall, {[]{return true;}}), + EventAccess(&ScarecrowSong, {[]{return Ocarina;}}), }, { //Locations - LocationAccess(BOMBERS_HIDEOUT_CHEST, {[] {return AnyBombBag;}}), + LocationAccess(BOMBERS_HIDEOUT_CHEST, {[] {return AnyBombBag || BlastMask;}}), }, { //Exits @@ -428,8 +435,6 @@ void AreaTable_Init() { { //Locations LocationAccess(W_CLOCK_TOWN_ROSA_SISTERS, {[] {return KamarosMask;}}), - LocationAccess(W_CLOCK_TOWN_POSTBOX, {[]{return PostmansHat;}}), - }, { //Exits @@ -448,8 +453,7 @@ void AreaTable_Init() { }, { //Locations - LocationAccess(W_CLOCK_TOWN_SWORDSMANS_SCHOOL, {[] {return Fighting;}}), - LocationAccess(W_CLOCK_TOWN_SWORDSMANS_SCHOOL, {[] {return Fighting;}}), + LocationAccess(W_CLOCK_TOWN_SWORDSMANS_SCHOOL, {[] {return AnyBSword;}}), }, { //Exits @@ -461,7 +465,7 @@ void AreaTable_Init() { }, { //Locations - LocationAccess(W_CLOCK_TOWN_POSTMANS_GAME, {[] {return true;}}),//Maybe Bunny Hood? + LocationAccess(W_CLOCK_TOWN_POSTMANS_GAME, {[] {return BunnyHood;}}),//trick to do without? }, { //Exits @@ -490,7 +494,7 @@ void AreaTable_Init() { LocationAccess(BOMB_SHOP_ITEM_2, {[]{return true;}}), LocationAccess(W_CLOCK_TOWN_BOMB_BAG_BUY, {[] {return true;}}), LocationAccess(W_CLOCK_TOWN_BIG_BOMB_BAG_BUY, {[] {return OldLadySaved;}}), - LocationAccess(W_CLOCK_TOWN_BOMB_SHOP_GORON, {[] {return GoronMask;}}), + LocationAccess(W_CLOCK_TOWN_BOMB_SHOP_GORON, {[] {return GoronMask && PowderKeg;}}), }, { //Exits @@ -499,6 +503,8 @@ void AreaTable_Init() { areaTable[CLOCK_TOWN_TRADING_POST] = Area("Trading Post", "Trading Post", NONE, { //Events + EventAccess(&ScarecrowSong, {[]{return Ocarina;}}), + EventAccess(&SpringWater, {[]{return SpringWater;}}), }, { //Locations @@ -521,7 +527,7 @@ void AreaTable_Init() { }, { //Locations - LocationAccess(W_CLOCK_TOWN_ALL_NIGHT_MASK_BUY, {[] {return AnyWallet;}}), + LocationAccess(W_CLOCK_TOWN_ALL_NIGHT_MASK_BUY, {[] {return (ProgressiveWallet >= 2);}}), }, { //Exits @@ -540,7 +546,7 @@ void AreaTable_Init() { LocationAccess(S_CLOCK_TOWN_FINAL_DAY_CHEST, {[] {return Hookshot || (DekuMask && MoonsTear);}}), LocationAccess(S_CLOCK_TOWN_BANK_REWARD_1, {[] {return true;}}), LocationAccess(S_CLOCK_TOWN_BANK_REWARD_2, {[] {return AnyWallet;}}), - LocationAccess(S_CLOCK_TOWN_BANK_REWARD_3, {[] {return AnyWallet;}}), + LocationAccess(S_CLOCK_TOWN_BANK_REWARD_3, {[] {return (OceanWallet500 || ProgressiveWallet > 1);}}), }, { //Exits @@ -625,7 +631,19 @@ void AreaTable_Init() { LocationAccess(TERMINA_FIELD_UNDERWATER_CHEST, {[] {return ZoraMask;}}), LocationAccess(TERMINA_FIELD_GRASS_CHEST, {[] {return true;}}), LocationAccess(TERMINA_FIELD_STUMP_CHEST, {[] {return Hookshot || (MagicBean && WaterForBeans);}}), - + LocationAccess(TF_TOP_SNOWHEAD_GOSSIP, { [] { return true; } }), + LocationAccess(TF_MILK_ROAD_TREE_GOSSIP, { [] { return true; } }), + LocationAccess(TF_IKANA_SNOWHEAD_GOSSIP, { [] { return true; } }), + LocationAccess(TF_OBSERVATORY_GOSSIP, { [] { return true; } }), + LocationAccess(TF_LOWER_SNOWHEAD_GOSSIP, { [] { return true; } }), + LocationAccess(TF_NEAR_GRASS_CHEST_GOSSIP, { [] { return true; } }), + //Gossip Stones + LocationAccess(TF_MILK_ROAD_TREE_GOSSIP, {[] {return true;}}), + LocationAccess(TF_IKANA_SNOWHEAD_GOSSIP, {[] {return true;}}), + LocationAccess(TF_OBSERVATORY_GOSSIP, {[] {return true;}}), + LocationAccess(TF_TOP_SNOWHEAD_GOSSIP, {[] {return true;}}), + LocationAccess(TF_LOWER_SNOWHEAD_GOSSIP, {[] {return true;}}), + LocationAccess(TF_NEAR_GRASS_CHEST_GOSSIP, {[] {return true;}}), }, { //Exits @@ -635,11 +653,11 @@ void AreaTable_Init() { Entrance(S_CLOCK_TOWN, {[]{return true;}}), Entrance(TERMINA_FIELD_PEAHAT_GROTTO, {[]{return true;}}), Entrance(TERMINA_FIELD_DODONGO_GROTTO, {[]{return true;}}), - Entrance(TERMINA_FIELD_BIO_BABA_GROTTO, {[]{return true;}}), + Entrance(TERMINA_FIELD_BIO_BABA_GROTTO, {[]{return AnyBombBag || BlastMask || GoronMask;}}), Entrance(TERMINA_FIELD_PILLAR_GROTTO, {[]{return true;}}), Entrance(TERMINA_FIELD_GRASS_GROTTO, {[]{return true;}}), Entrance(TERMINA_FIELD_BUSINESS_SCRUB_GROTTO, {[]{return true;}}), - Entrance(TERMINA_FIELD_COW_GROTTO, {[]{return true;}}), + Entrance(TERMINA_FIELD_COW_GROTTO, {[]{return AnyBombBag || BlastMask;}}), Entrance(TERMINA_FIELD_GOSSIP_STONES_GROTTO, {[]{return AnyBombBag || BlastMask || GoronMask;}}),//Something to break rocks Entrance(ROAD_TO_SOUTHERN_SWAMP, {[]{return true;}}), Entrance(PATH_TO_MOUNTAIN_VILLAGE, {[]{return Bow;}}),// || (HotSpringWater && AnyBottle) @@ -648,7 +666,7 @@ void AreaTable_Init() { Entrance(ROAD_TO_IKANA, {[]{return true;}}), }); - areaTable[TERMINA_FIELD_PEAHAT_GROTTO] = Area("Termina Field Peahat Grotto","Termina Field Peahat Grotto", NONE,{ + areaTable[TERMINA_FIELD_PEAHAT_GROTTO] = Area("Termina Field Peahat Grotto","Termina Field Peahat Grotto", TERMINA_FIELD_PEAHAT_GROTTO,{ //Events }, { @@ -660,7 +678,7 @@ void AreaTable_Init() { //Exits Entrance(TERMINA_FIELD, {[]{return true;}}), }); - areaTable[TERMINA_FIELD_DODONGO_GROTTO] = Area("Termina Field Dodongo Grotto","Termina Field Dodongo Grotto", NONE,{ + areaTable[TERMINA_FIELD_DODONGO_GROTTO] = Area("Termina Field Dodongo Grotto","Termina Field Dodongo Grotto", TERMINA_FIELD_DODONGO_GROTTO,{ //Events }, { @@ -672,7 +690,7 @@ void AreaTable_Init() { //Exits Entrance(TERMINA_FIELD, {[]{return true;}}), }); - areaTable[TERMINA_FIELD_BIO_BABA_GROTTO] = Area("Termina Field Bio Baba Grotto","Termina Field Bio Baba Grotto", NONE,{ + areaTable[TERMINA_FIELD_BIO_BABA_GROTTO] = Area("Termina Field Bio Baba Grotto","Termina Field Bio Baba Grotto", TERMINA_FIELD_BIO_BABA_GROTTO,{ //Events }, { @@ -683,7 +701,7 @@ void AreaTable_Init() { //Exits Entrance(TERMINA_FIELD, {[]{return true;}}), }); - areaTable[TERMINA_FIELD_PILLAR_GROTTO] = Area("Termina Field Pillar Grotto","Termina Field Pillar Grotto", NONE,{ + areaTable[TERMINA_FIELD_PILLAR_GROTTO] = Area("Termina Field Pillar Grotto","Termina Field Pillar Grotto", TERMINA_FIELD_PILLAR_GROTTO,{ //Events }, { @@ -694,7 +712,7 @@ void AreaTable_Init() { //Exits Entrance(TERMINA_FIELD, {[]{return true;}}), }); - areaTable[TERMINA_FIELD_GRASS_GROTTO] = Area("Termina Field Grass Grotto","Termina Field Grass Grotto", NONE,{ + areaTable[TERMINA_FIELD_GRASS_GROTTO] = Area("Termina Field Grass Grotto","Termina Field Grass Grotto", TERMINA_FIELD_GRASS_GROTTO,{ //Events }, { @@ -705,30 +723,30 @@ void AreaTable_Init() { { //Exits }); - areaTable[TERMINA_FIELD_BUSINESS_SCRUB_GROTTO] = Area("Termina Field Business Scrub Grotto","Termina Field Business Scrub Grotto", NONE,{ + areaTable[TERMINA_FIELD_BUSINESS_SCRUB_GROTTO] = Area("Termina Field Business Scrub Grotto","Termina Field Business Scrub Grotto", TERMINA_FIELD_BUSINESS_SCRUB_GROTTO,{ //Events }, { //Locations - LocationAccess(TERMINA_FIELD_BUSINESS_SCRUB, {[] {return AnyWallet;}}), + LocationAccess(TERMINA_FIELD_BUSINESS_SCRUB, {[] {return AnyWallet && WatchMoonTearFall;}}), }, { //Exits Entrance(TERMINA_FIELD, {[]{return true;}}), }); - areaTable[TERMINA_FIELD_COW_GROTTO] = Area("Termina Field Cow Grotto","Termina Field Cow Grotto", NONE,{ + areaTable[TERMINA_FIELD_COW_GROTTO] = Area("Termina Field Cow Grotto","Termina Field Cow Grotto", TERMINA_FIELD_COW_GROTTO,{ //Events }, { //Locations - LocationAccess(TERMINA_FIELD_GROTTO_COW1, {[]{return CanPlay(EponasSong);}}), - LocationAccess(TERMINA_FIELD_GROTTO_COW2, {[]{return CanPlay(EponasSong);}}), + LocationAccess(TERMINA_FIELD_GROTTO_COW1, {[]{return EponasSong && AnyBottle;}}), + LocationAccess(TERMINA_FIELD_GROTTO_COW2, {[]{return EponasSong && AnyBottle;}}), }, { //Exits Entrance(TERMINA_FIELD, {[]{return true;}}), }); - areaTable[TERMINA_FIELD_GOSSIP_STONES_GROTTO] = Area("Termina Field Gossip Stones Grotto","Termina Field Gossip Stones Grotto", NONE,{ + areaTable[TERMINA_FIELD_GOSSIP_STONES_GROTTO] = Area("Termina Field Gossip Stones Grotto","Termina Field Gossip Stones Grotto", TERMINA_FIELD_GOSSIP_STONES_GROTTO,{ //Events }, { @@ -736,7 +754,10 @@ void AreaTable_Init() { LocationAccess(TERMINA_FIELD_GOSSIP_STONES, {[] {return (GoronMask && CanPlay(GoronsLullaby)) || (DekuMask && CanPlay(SonataOfAwakening)) || (ZoraMask && CanPlay(NewWaveBossaNova));}}), - + LocationAccess(TF_FOUR_STONE_GROTTO_1, {[] {return true;}}), + LocationAccess(TF_FOUR_STONE_GROTTO_2, {[] {return true;}}), + LocationAccess(TF_FOUR_STONE_GROTTO_3, {[] {return true;}}), + LocationAccess(TF_FOUR_STONE_GROTTO_4, {[] {return true;}}), }, { //Exits @@ -748,9 +769,11 @@ void AreaTable_Init() { }, { //Locations - LocationAccess(ROAD_TO_SS_TREE, {[] {return DekuMask && (MagicMeter || Bow || Hookshot || ZoraMask);}}),//something to kill the dragonfly - LocationAccess(TINGLE_ROAD_TO_SS_WF, {[]{return (ProgressiveMagic = 0) || ( (DekuMask && MagicMeter) || Bow || Hookshot || ZoraMask );}}), - LocationAccess(TINGLE_ROAD_TO_SS_SH, {[]{return (ProgressiveMagic = 0) || ( (DekuMask && MagicMeter) || Bow || Hookshot || ZoraMask );}}), + LocationAccess(ROAD_TO_SS_TREE, {[] {return (DekuMask && MagicMeter) || Bow || Hookshot || ZoraMask;}}),//something to kill the dragonfly + LocationAccess(TINGLE_ROAD_TO_SS_WF, {[]{return (DekuMask && MagicMeter) || Bow || Hookshot || ZoraMask;}}), + LocationAccess(TINGLE_ROAD_TO_SS_SH, {[]{return (DekuMask && MagicMeter) || Bow || Hookshot || ZoraMask;}}), + //Gossip Stones + LocationAccess(ROAD_TO_SS_GOSSIP, {[] {return true;}}), }, { //Exits @@ -798,6 +821,11 @@ void AreaTable_Init() { LocationAccess(SOUTHERN_SWAMP_SCRUB_PURCHASE, {[]{return DekuMask;}}), LocationAccess(SOUTHERN_SWAMP_MUSIC_STATUE, {[] {return true;}}), LocationAccess(SWAMP_TOURIST_CENTER_ROOF, {[] {return DekuMask && LandTitle;}}), + LocationAccess(SOUTHERN_SWAMP_SCRUB_TRADE_CLEAR, {[] {return LandTitle && WoodfallClear;}}), + LocationAccess(SOUTHERN_SWAMP_SCRUB_PURCHASE_CLEAR, {[]{return DekuMask && WoodfallClear;}}), + LocationAccess(SWAMP_TOURIST_CENTER_ROOF_CLEAR, {[] {return DekuMask && LandTitle && WoodfallClear;}}), + //Gossip Stones + LocationAccess(SS_GOSSIP, {[] {return true;}}), }, { //Exits @@ -816,7 +844,7 @@ void AreaTable_Init() { }, { //Locations - LocationAccess(SOUTHERN_SWAMP_KOUME, {[] {return AnyBottle && DekuMask;}}), + LocationAccess(SOUTHERN_SWAMP_KOUME, {[] {return AnyBottle;}}), LocationAccess(SOUTHERN_SWAMP_PICTOGRAPH_WINNER, {[] {return Pictobox;}}), LocationAccess(SOUTHERN_SWAMP_BOAT_ARCHERY, {[] {return WoodfallClear && AnyBottle;}}), }, @@ -943,7 +971,7 @@ void AreaTable_Init() { }, { //Locations - LocationAccess(DEKU_PALACE_BUTLER_RACE, {[] {return DekuMask;}}),// && DekuPrincessReturned + LocationAccess(DEKU_PALACE_BUTLER_RACE, {[] {return DekuMask && DekuPrincessReturned;}}), }, { //Exits @@ -986,11 +1014,13 @@ void AreaTable_Init() { { //Locations //Path Grotto - requires Bombs & (maybe)Mask of Truth? - has no items just freestanding money + //Gossip Stones + LocationAccess(PATH_TO_MV_GOSSIP, {[] {return true;}}), }, { //Exits Entrance(TERMINA_FIELD, {[]{return true;}}), - Entrance(MOUNTAIN_VILLAGE, {[]{return AnyBombBag;}}), + Entrance(MOUNTAIN_VILLAGE, {[]{return AnyBombBag || BlastMask;}}), }); areaTable[MOUNTAIN_VILLAGE] = Area("Mountain Village", "Mountain Village", MOUNTAIN_VILLAGE, { @@ -999,9 +1029,12 @@ void AreaTable_Init() { { //Locations LocationAccess(MOUNTAIN_VILLAGE_FROG_CHOIR, {[] {return SnowheadClear && LaundryFrog && SwampFrog && WoodfallFrog && GreatBayFrog && DonGerosMask;}}), - LocationAccess(MOUNTAIN_VILLAGE_HUNGRY_GORON, {[] {return GoronMask && MagicMeter;}}), - LocationAccess(MOUNTAIN_WATERFALL_CHEST, {[] {return SnowheadClear;}}), - + LocationAccess(MOUNTAIN_VILLAGE_HUNGRY_GORON, {[] {return (GoronMask && MagicMeter) && (HasFireSource || (LullabyIntro && HasFireSourceWithTorch));}}), + LocationAccess(MOUNTAIN_WATERFALL_CHEST, {[] {return SnowheadClear && LensOfTruth && MagicMeter;}}), + LocationAccess(MOUNTAIN_VILLAGE_KEATON_QUIZ, {[]{return SnowheadClear && KeatonMask && AnySword;}}), + //Gossip Stones + LocationAccess(MV_NEAR_FROGS_GOSSIP, {[] {return true;}}), + LocationAccess(MV_NEAR_GROTTO_GOSSIP, {[] {return true;}}), }, { //Exits @@ -1030,8 +1063,8 @@ void AreaTable_Init() { }, { //Locations - LocationAccess(MOUNTAIN_VILLAGE_SMITH_DAY_ONE, {[] {return AnyWallet && ( HotSpringWater || SnowheadClear || (Bow && MagicMeter && FireArrows));}}), - LocationAccess(MOUNTAIN_VILLAGE_SMITH_DAY_TWO, {[] {return GoronRaceBottle && (HotSpringWater || SnowheadClear || (Bow && MagicMeter && FireArrows));}}), + LocationAccess(MOUNTAIN_VILLAGE_SMITH_DAY_ONE, {[] {return AnyWallet && AnyBSword && (HotSpringWater || SnowheadClear || (Bow && MagicMeter && FireArrows));}}), //Need to check for B sword + LocationAccess(MOUNTAIN_VILLAGE_SMITH_DAY_TWO, {[] {return GoronRaceBottle && AnyWallet && AnyBSword && (HotSpringWater || SnowheadClear || (Bow && MagicMeter && FireArrows));}}), //Currently need at least one progressive wallet as these are not independent checks }, { //Exits @@ -1058,10 +1091,11 @@ void AreaTable_Init() { //Locations LocationAccess(TWIN_ISLANDS_UNDERWATER_RAMP_CHEST, {[] {return SnowheadClear && ZoraMask;}}), LocationAccess(TWIN_ISLANDS_CAVE_CHEST, {[] {return SnowheadClear && ZoraMask;}}), - LocationAccess(TINGLE_TWIN_ISLANDS_SH, {[]{return (ProgressiveMagic = 0) || ( (DekuMask && MagicMeter) || Bow || Hookshot || ZoraMask );}}), - LocationAccess(TINGLE_TWIN_ISLANDS_RR, {[]{return (ProgressiveMagic = 0) || ( (DekuMask && MagicMeter) || Bow || Hookshot || ZoraMask );}}), - LocationAccess(TINGLE_TWIN_ISLANDS_SH_SPRING, {[]{return (ProgressiveMagic = 0) || ( (DekuMask && MagicMeter) || Bow || Hookshot || ZoraMask );}}), - LocationAccess(TINGLE_TWIN_ISLANDS_RR_SPRING, {[]{return (ProgressiveMagic = 0) || ( (DekuMask && MagicMeter) || Bow || Hookshot || ZoraMask );}}), + LocationAccess(TWIN_ISLANDS_LULLABY_INTRO, {[] {return GoronMask && ((AnyBottle && HotSpringWater) || (Bow && MagicMeter && FireArrows));}}), + LocationAccess(TINGLE_TWIN_ISLANDS_SH, {[]{return (DekuMask && MagicMeter) || Bow || Hookshot || ZoraMask;}}), + LocationAccess(TINGLE_TWIN_ISLANDS_RR, {[]{return (DekuMask && MagicMeter) || Bow || Hookshot || ZoraMask;}}), + LocationAccess(TINGLE_TWIN_ISLANDS_SH_SPRING, {[]{return (DekuMask && MagicMeter) || Bow || Hookshot || ZoraMask;}}), + LocationAccess(TINGLE_TWIN_ISLANDS_RR_SPRING, {[]{return (DekuMask && MagicMeter) || Bow || Hookshot || ZoraMask;}}), }, { //Exits @@ -1081,7 +1115,7 @@ void AreaTable_Init() { { //Exits Entrance(TWIN_ISLANDS, {[]{return true;}}), - Entrance(TWIN_ISLANDS_GORON_RACETRACK_GROTTO, {[]{return AnyBombBag;}}), + Entrance(TWIN_ISLANDS_GORON_RACETRACK_GROTTO, {[]{return (AnyBombBag || BlastMask) && ((Hookshot && ScarecrowSong) || GoronMask);}}), }); areaTable[TWIN_ISLANDS_GORON_RACETRACK_GROTTO] = Area("Goron Racetrack Grotto", "Goron Racetrack Grotto", NONE, { @@ -1116,14 +1150,18 @@ void AreaTable_Init() { { //Locations LocationAccess(GORON_VILLAGE_POWDER_KEG_CHALLENGE, {[] {return GoronMask && (SnowheadClear || (Bow && FireArrows && MagicMeter));}}), - LocationAccess(GORON_VILLAGE_SCRUB_PURCHASE, {[] {return AnyWallet && GoronMask;}}), + LocationAccess(GORON_VILLAGE_SCRUB_PURCHASE, {[] {return AnyWallet && GoronMask && (ProgressiveBombBag >= 2);}}), LocationAccess(GORON_VILLAGE_SCRUB_TRADE, {[] {return DekuMask && SwampTitle;}}), LocationAccess(GORON_VILLAGE_LEDGE, {[] {return DekuMask && SwampTitle;}}), + LocationAccess(GORON_VILLAGE_POWDER_KEG_CHALLENGE_SPRING, {[] {return GoronMask && (SnowheadClear || (Bow && FireArrows && MagicMeter));}}), + LocationAccess(GORON_VILLAGE_SCRUB_PURCHASE_SPRING, {[] {return AnyWallet && GoronMask;}}), + LocationAccess(GORON_VILLAGE_SCRUB_TRADE_SPRING, {[] {return DekuMask && SwampTitle;}}), + LocationAccess(GORON_VILLAGE_LEDGE_SPRING, {[] {return DekuMask && SwampTitle;}}), }, { //Exits Entrance(GORON_VILLAGE_LENS_CAVE, {[]{return true;}}), - Entrance(GORON_VILLAGE_INTERIOR, {[]{return (AnyBottle && HotSpringWater) || GoronMask;}}), //unfreeze goron or open it yourself + Entrance(GORON_VILLAGE_INTERIOR, {[]{return (AnyBottle && HotSpringWater) || (Bow && FireArrows && MagicMeter) || GoronMask;}}), //unfreeze goron or open it yourself Entrance(TWIN_ISLANDS, {[]{return true;}}), }); @@ -1134,7 +1172,7 @@ void AreaTable_Init() { //Locations LocationAccess(GORON_VILLAGE_LENS_OF_TRUTH_CHEST, {[] {return true;}}), LocationAccess(LENS_CAVE_RED_RUPEE, {[] {return LensOfTruth && MagicMeter;}}), - LocationAccess(LENS_CAVE_PURPLE_RUPEE, {[] {return AnyBombBag && LensOfTruth && MagicMeter;}}), + LocationAccess(LENS_CAVE_PURPLE_RUPEE, {[] {return AnyBombBag || BlastMask;}}), //Do not need Lens for this chest }, { //Exits @@ -1149,7 +1187,7 @@ void AreaTable_Init() { }, { //Locations - LocationAccess(GORON_VILLAGE_GORON_LULLABY, {[]{return GoronMask;}}), + LocationAccess(GORON_VILLAGE_GORON_LULLABY, {[]{return GoronMask && LullabyIntro;}}), }, { //Exits @@ -1176,12 +1214,12 @@ void AreaTable_Init() { }, { //Locations - LocationAccess(ROAD_TO_SNOWHEAD_PILLAR, {[] {return GoronMask && MagicMeter && LensOfTruth;}}), + LocationAccess(ROAD_TO_SNOWHEAD_PILLAR, {[] {return GoronMask && MagicMeter && LensOfTruth && Hookshot && ScarecrowSong;}}), }, { //Exits - Entrance(ROAD_TO_SNOWHEAD_GROTTO, {[]{return GoronMask && MagicMeter && AnyBombBag;}}), + Entrance(ROAD_TO_SNOWHEAD_GROTTO, {[]{return GoronMask && MagicMeter && (AnyBombBag || BlastMask);}}), Entrance(MOUNTAIN_VILLAGE, {[]{return true;}}), Entrance(SNOWHEAD, {[]{return GoronMask && MagicMeter;}}), }); @@ -1229,9 +1267,11 @@ void AreaTable_Init() { }, { //Locations - LocationAccess(TINGLE_MILK_ROAD_RR, {[]{return (ProgressiveMagic = 0) || ( (DekuMask && MagicMeter) || Bow || Hookshot || ZoraMask );}}), - LocationAccess(TINGLE_MILK_ROAD_GB, {[]{return (ProgressiveMagic = 0) || ( (DekuMask && MagicMeter) || Bow || Hookshot || ZoraMask );}}), + LocationAccess(TINGLE_MILK_ROAD_RR, {[]{return (DekuMask && MagicMeter) || Bow || Hookshot || ZoraMask;}}), + LocationAccess(TINGLE_MILK_ROAD_GB, {[]{return (DekuMask && MagicMeter) || Bow || Hookshot || ZoraMask;}}), LocationAccess(MILK_ROAD_KEATON_QUIZ, {[] {return KeatonMask;}}), + //Gossip Stones + LocationAccess(MR_GOSSIP, {[] {return true;}}), }, { //Exits @@ -1243,12 +1283,13 @@ void AreaTable_Init() { areaTable[GORMAN_TRACK] = Area("Gorman Track", "Gorman Track", NONE, { //Events + EventAccess(&UsableMysteryMilkBottle, {[] {return MilkQuestStart && CircusLeadersMask && MysteryMilkBottle;}}), // Assumes that if you could start the quest, you can finish it }, { //Locations LocationAccess(MILK_ROAD_GORMAN_RACE, {[]{return CanPlay(EponasSong);}}), LocationAccess(MILK_ROAD_GORMAN_MILK_BUY, {[]{return AnyBottle;}}), - LocationAccess(GORMAN_TRACK_MYSTERY_MILK_QUEST, {[] {return CircusLeadersMask;}}), + LocationAccess(GORMAN_TRACK_MYSTERY_MILK_QUEST, {[] {return MilkQuestStart && CircusLeadersMask;}}), }, { //Exits @@ -1263,6 +1304,10 @@ void AreaTable_Init() { LocationAccess(ROMANI_RANCH_ALIEN_DEFENSE, {[] {return GoronMask && PowderKeg && Bow;}}),//Day1 Night LocationAccess(ROMANI_RANCH_CREMIA_ESCORT, {[] {return GoronMask && PowderKeg && Bow;}}),//Day2 LocationAccess(ROMANI_RANCH_ROMANIS_GAME, {[] {return GoronMask && PowderKeg && Bow;}}),//Day1 + //Gossip Stones + LocationAccess(RR_ENTRANCE_GOSSIP, {[] {return true;}}), + LocationAccess(RR_BARN_GOSSIP, {[] {return true;}}), + LocationAccess(RR_FIELD_GOSSIP, {[] {return true;}}), }, { //Exits @@ -1278,8 +1323,10 @@ void AreaTable_Init() { }, { //Locations - LocationAccess(ROMANI_RANCH_DOG_RACE, {[] {return true;}}), + LocationAccess(ROMANI_RANCH_DOG_RACE, {[] {return MaskOfTruth;}}), LocationAccess(DOGGY_RACETRACK_ROOF_CHEST, {[] {return Hookshot || (WaterForBeans && MagicBean);}}), + //Gossip Stones + LocationAccess(DOGGY_RACETRACK_GOSSIP, {[] {return true;}}), }, { //Exits @@ -1292,6 +1339,8 @@ void AreaTable_Init() { { //Locations LocationAccess(ROMANI_RANCH_GROG, {[] {return BremenMask;}}), + //Gossip Stones + LocationAccess(CUCCO_SHACK_GOSSIP, {[] {return true;}}), }, { //Exits @@ -1314,9 +1363,9 @@ void AreaTable_Init() { }, { //Locations - LocationAccess(ROMANI_RANCH_COW_1, {[]{return EponasSong && AnyBottle;}}), - LocationAccess(ROMANI_RANCH_COW_2, {[]{return EponasSong && AnyBottle;}}), - LocationAccess(ROMANI_RANCH_COW_3, {[]{return EponasSong && AnyBottle;}}), + LocationAccess(ROMANI_RANCH_COW_1, {[]{return EponasSong && AnyBottle && PowderKeg && GoronMask;}}), + LocationAccess(ROMANI_RANCH_COW_2, {[]{return EponasSong && AnyBottle && PowderKeg && GoronMask;}}), + LocationAccess(ROMANI_RANCH_COW_3, {[]{return EponasSong && AnyBottle && PowderKeg && GoronMask;}}), }, { //Exits @@ -1331,8 +1380,11 @@ void AreaTable_Init() { LocationAccess(GBC_FISHERMAN_GAME, {[] {return GreatBayClear && Hookshot;}}), LocationAccess(GBC_LEDGE, {[] {return Hookshot && MagicBean && AnyBottle;}}), LocationAccess(GBC_MIKAU, {[] {return CanPlay(SongOfHealing);}}), - LocationAccess(TINGLE_GBC_GB, {[]{ return (ProgressiveMagic = 0) || ( (DekuMask && MagicMeter) || Bow || Hookshot || ZoraMask );}}), - LocationAccess(TINGLE_GBC_ST, {[]{ return (ProgressiveMagic = 0) || ( (DekuMask && MagicMeter) || Bow || Hookshot || ZoraMask );}}), + LocationAccess(TINGLE_GBC_GB, {[]{ return (DekuMask && MagicMeter) || Bow || Hookshot || ZoraMask;}}), + LocationAccess(TINGLE_GBC_ST, {[]{ return (DekuMask && MagicMeter) || Bow || Hookshot || ZoraMask;}}), + //Gossip Stones + LocationAccess(GBC_BENEATH_COW_GROTTO_GOSSIP, {[] {return true;}}), + LocationAccess(GBC_OUTSIDE_FORTRESS_GOSSIP, {[] {return true;}}), }, { //Exits @@ -1405,11 +1457,11 @@ void AreaTable_Init() { { //Locations LocationAccess(PINNACLE_ROCK_SEAHORSES, {[]{return ZoraMask && MagicMeter && Seahorse;}}), - LocationAccess(PINNACLE_ROCK_UPPER_CHEST, {[]{return ZoraMask && MagicMeter;}}), - LocationAccess(PINNACLE_ROCK_LOWER_CHEST, {[]{return ZoraMask && MagicMeter;}}), - LocationAccess(PINNACLE_ROCK_ZORA_EGG1, {[]{return ZoraMask && MagicMeter && AnyBottle;}}), - LocationAccess(PINNACLE_ROCK_ZORA_EGG2, {[]{return ZoraMask && MagicMeter && AnyBottle;}}), - LocationAccess(PINNACLE_ROCK_ZORA_EGG3, {[]{return ZoraMask && MagicMeter && AnyBottle;}}), + LocationAccess(PINNACLE_ROCK_UPPER_CHEST, {[]{return ZoraMask && MagicMeter && Seahorse;}}), + LocationAccess(PINNACLE_ROCK_LOWER_CHEST, {[]{return ZoraMask && MagicMeter && Seahorse;}}), + LocationAccess(PINNACLE_ROCK_ZORA_EGG1, {[]{return ZoraMask && MagicMeter && AnyBottle && Seahorse;}}), + LocationAccess(PINNACLE_ROCK_ZORA_EGG2, {[]{return ZoraMask && MagicMeter && AnyBottle && Seahorse;}}), + LocationAccess(PINNACLE_ROCK_ZORA_EGG3, {[]{return ZoraMask && MagicMeter && AnyBottle && Seahorse;}}), }, { //Exits @@ -1425,7 +1477,8 @@ void AreaTable_Init() { LocationAccess(ZORA_CAPE_LEDGE_NO_TREE, {[] {return Hookshot;}}), LocationAccess(ZORA_CAPE_LEDGE_WITH_TREE, {[] {return Hookshot;}}), LocationAccess(ZORA_CAPE_UNDERWATER_CHEST, {[] {return ZoraMask;}}), - + //Gossip Stones + LocationAccess(ZC_GOSSIP, {[] {return true;}}), }, { //Exits @@ -1433,7 +1486,7 @@ void AreaTable_Init() { Entrance(ZORA_HALL, {[]{return ZoraMask;}}), Entrance(WATERFALL_RAPIDS, {[]{return Hookshot;}}), Entrance(GREAT_BAY_FAIRY_FOUNTAIN, {[]{return Hookshot;}}), - Entrance(ZORA_CAPE_GROTTO, {[]{return Hookshot && AnyBombBag;}}), + Entrance(ZORA_CAPE_GROTTO, {[]{return AnyBombBag || BlastMask || GoronMask;}}), //Just need something to break the rock Entrance(GREAT_BAY_TEMPLE_ENTRANCE, {[]{return Hookshot && ZoraMask && CanPlay(NewWaveBossaNova);}}), Entrance(ZORA_HALL_BACK_ENTRANCE, {[]{return ZoraMask;}}), }); @@ -1613,7 +1666,7 @@ void AreaTable_Init() { Entrance(IKANA_GRAVEYARD_BELOW_GRAVE1, {[]{return CaptainsHat;}}), Entrance(IKANA_GRAVEYARD_BELOW_GRAVE2, {[]{return CaptainsHat;}}), Entrance(IKANA_GRAVEYARD_BELOW_GRAVE3, {[]{return CaptainsHat;}}), - Entrance(IKANA_GRAVEYARD_GROTTO, {[]{return AnyBombBag;}}), + Entrance(IKANA_GRAVEYARD_GROTTO, {[]{return AnyBombBag || BlastMask;}}), }); areaTable[IKANA_GRAVEYARD_GROTTO] = Area("Ikana Graveyard Grotto", "Ikana Graveyard Grotto", NONE, { @@ -1674,7 +1727,19 @@ void AreaTable_Init() { { //Exits Entrance(IKANA_GRAVEYARD, {[]{return true;}}), - Entrance(IKANA_GRAVEYARD_IRON_KNUCKLE_ROOM, {[]{return true;}}), + Entrance(IKANA_GRAVEYARD_PRE_IRON_KNUCKLE_ROOM, {[]{return true;}}), + }); + + areaTable[IKANA_GRAVEYARD_PRE_IRON_KNUCKLE_ROOM] = Area("Ikana Graveyard Below Graves Pre Iron Knuckle Room", "Ikana Graveyard Below Graves Pre Iron Knuckle Room", NONE, { + //Evvents + }, + { + //Locations + }, + { + //Exits + Entrance(IKANA_GRAVEYARD_BELOW_GRAVE2, {[]{return true;}}), + Entrance(IKANA_GRAVEYARD_IRON_KNUCKLE_ROOM, {[]{return Bow && LensOfTruth && MagicMeter && (AnyBombBag || BlastMask);}}), }); areaTable[IKANA_GRAVEYARD_IRON_KNUCKLE_ROOM] = Area("Ikana Graveyard Below Graves Iron Knuckle Room", "Ikana Graveyard Below Graves Iron Knuckle Room", NONE, { @@ -1682,7 +1747,7 @@ void AreaTable_Init() { }, { //Locations - LocationAccess(IKANA_GRAVEYARD_IRON_KNUCKLE_CHEST, {[] {return CaptainsHat && AnyBombBag && Fighting;}}), //Doesnt need bombs? + LocationAccess(IKANA_GRAVEYARD_IRON_KNUCKLE_CHEST, {[] {return Fighting;}}), }, { //Exits @@ -1716,19 +1781,22 @@ void AreaTable_Init() { areaTable[IKANA_CANYON] = Area("Lower Ikana Canyon", "Lower Ikana Canyon", IKANA_CANYON, { //Events - EventAccess(&EnterSakonHideout, {[]{return LetterKafei && PendantOfMemories && KafeisMask;}}),//probably missing a req + EventAccess(&EnterSakonHideout, {[]{return LetterKafei && PendantAccess && KafeisMask;}}),//probably missing a req }, { //Locations LocationAccess(IKANA_CANYON_LEDGE, {[] {return ZoraMask && OceanTitle && DekuMask;}}), LocationAccess(IKANA_CANYON_SCRUB_TRADE, {[] {return ZoraMask && OceanTitle;}}), LocationAccess(IKANA_CANYON_SCRUB_PURCHASE, {[]{return AnyWallet && AnyBottle;}}), + //Gossip Stones + LocationAccess(IC_DOCK_GOSSIP, {[] {return true;}}), + LocationAccess(IC_SAKON_GOSSIP, {[] {return true;}}), }, { //Exits Entrance(ROAD_TO_IKANA, {[]{return true;}}), Entrance(SAKONS_HIDEOUT, {[]{return EnterSakonHideout;}}), - Entrance(SECRET_SHRINE, {[]{return true;}}), //slow swim but don't NEED zora mask + Entrance(SECRET_SHRINE_ENTRANCE, {[]{return true;}}), //slow swim but don't NEED zora mask Entrance(IKANA_CANYON_SECRET_SHRINE_GROTTO, {[]{return true;}}), Entrance(SOUTHERN_SWAMP, {[]{return true;}}),//end of river Entrance(IKANA_CANYON_UPPER, {[]{return IceArrows && MagicMeter && Bow && Hookshot;}}), @@ -1739,8 +1807,10 @@ void AreaTable_Init() { }, { //Locations - LocationAccess(TINGLE_IKANA_CANYON_ST, {[]{return (ProgressiveMagic = 0) || ( (DekuMask && MagicMeter) || Bow || Hookshot || ZoraMask );}}), - LocationAccess(TINGLE_IKANA_CANYON_CT, {[]{return (ProgressiveMagic = 0) || ( (DekuMask && MagicMeter) || Bow || Hookshot || ZoraMask );}}), + LocationAccess(TINGLE_IKANA_CANYON_ST, {[]{return (DekuMask && MagicMeter) || Bow || Hookshot || ZoraMask;}}), + LocationAccess(TINGLE_IKANA_CANYON_CT, {[]{return (DekuMask && MagicMeter) || Bow || Hookshot || ZoraMask;}}), + //Gossip Stones + LocationAccess(IC_SPIRIT_HOUSE_GOSSIP, {[] {return true;}}), }, { //Exits @@ -1835,8 +1905,8 @@ void AreaTable_Init() { { //Exits Entrance(IKANA_CANYON_UPPER, {[]{return true;}}), - Entrance(STONE_TOWER_TEMPLE_ENTRANCE, {[]{return CanPlay(ElegyOfEmptiness) && GoronMask && ZoraMask && DekuMask && Hookshot;}}), - Entrance(INVERTED_STONE_TOWER, {[]{return CanPlay(ElegyOfEmptiness) && GoronMask && ZoraMask && DekuMask && Hookshot && Bow && LightArrows && MagicMeter;}}), + Entrance(STONE_TOWER_TEMPLE_ENTRANCE, {[]{return CanPlay(ElegyOfEmptiness) && GoronMask && ZoraMask && Hookshot;}}), + Entrance(INVERTED_STONE_TOWER, {[]{return CanPlay(ElegyOfEmptiness) && GoronMask && ZoraMask && Hookshot && Bow && LightArrows && MagicMeter;}}), }); areaTable[INVERTED_STONE_TOWER] = Area("Inverted Stone Tower", "Inverted Stone Tower", INVERTED_STONE_TOWER, { @@ -1869,7 +1939,7 @@ void AreaTable_Init() { { //Locations LocationAccess(WF_SF_ENTRANCE_FAIRY, {[] {return DekuMask && MagicMeter && GreatFairyMask;}}), - LocationAccess(WF_SF_ENTRANCE_PLATFORM, {[] {return ((DekuMask && MagicMeter) || Hookshot) && GreatFairyMask;}}), + LocationAccess(WF_SF_ENTRANCE_PLATFORM, {[] {return ((DekuMask && MagicMeter) || Hookshot);}}), }, { //Exits @@ -1914,13 +1984,13 @@ void AreaTable_Init() { }, { //Locations - LocationAccess(WOODFALL_TEMPLE_SMALL_KEY_CHEST, {[] {return DekuMask;}}), + LocationAccess(WOODFALL_TEMPLE_SMALL_KEY_CHEST, {[] {return DekuMask || Hookshot;}}), //Future proofing for Fairysanity and Entrance Randomizer }, { //Exits Entrance(WOODFALL_TEMPLE_MAIN_ROOM, {[]{return true;}}), Entrance(WOODFALL_TEMPLE_UPPER_PLATFORM_ROOM, {[]{return Bow && DekuMask;}}), - Entrance(WOODFALL_TEMPLE_MAP_ROOM, {[]{return DekuMask;}}), + Entrance(WOODFALL_TEMPLE_MAP_ROOM, {[]{return DekuMask || Hookshot;}}), //Future proofing }), areaTable[WOODFALL_TEMPLE_MAP_ROOM] = Area("Woodfall Temple Map Room", "Woodfall Temple Map Room", WOODFALL_TEMPLE, { @@ -1928,7 +1998,7 @@ void AreaTable_Init() { }, { //Locations - LocationAccess(WOODFALL_TEMPLE_MAP_CHEST, {[] {return DekuMask;}}), + LocationAccess(WOODFALL_TEMPLE_MAP_CHEST, {[] {return DekuMask;}}), //Goron ground pound can also take care of them }, { //Exits @@ -2020,7 +2090,7 @@ void AreaTable_Init() { }, { //Locations - LocationAccess(WF_SF_DRAGONFLY_ROOM_BUBBLE, {[] {return Bow && DekuMask && GreatFairyMask;}}), + LocationAccess(WF_SF_DRAGONFLY_ROOM_BUBBLE, {[] {return Bow && DekuMask;}}), //No need for GFM here, Fairy is ground level }, { //Exits @@ -2033,10 +2103,10 @@ void AreaTable_Init() { }, { //Locations - LocationAccess(WF_SF_PRE_BOSS_LOWER_RIGHT_BUBBLE, {[] {return Bow && GreatFairyMask;}}), - LocationAccess(WF_SF_PRE_BOSS_UPPER_RIGHT_BUBBLE, {[] {return Bow && GreatFairyMask;}}), - LocationAccess(WF_SF_PRE_BOSS_UPPER_LEFT_BUBBLE, {[] {return Bow && GreatFairyMask;}}), - LocationAccess(WF_SF_PRE_BOSS_PILLAR_BUBBLE, {[] {return GreatFairyMask && (Bow || Hookshot);}}), + LocationAccess(WF_SF_PRE_BOSS_LOWER_RIGHT_BUBBLE, {[] {return true;}}), //These fairies are ground level and you can jump on the platforms and run into them + LocationAccess(WF_SF_PRE_BOSS_UPPER_RIGHT_BUBBLE, {[] {return true;}}), + LocationAccess(WF_SF_PRE_BOSS_UPPER_LEFT_BUBBLE, {[] {return true;}}), + LocationAccess(WF_SF_PRE_BOSS_PILLAR_BUBBLE, {[] {return DekuMask || (GreatFairyMask && (Bow || Hookshot));}}), //Can either hit the switch with Deku or make the fairy come to you with bow/hookshot }, { //Exits @@ -2062,11 +2132,11 @@ void AreaTable_Init() { areaTable[WOODFALL_TEMPLE_PRINCESS_ROOM] = Area("Deku Princess Room", "Deku Princess Room", WOODFALL_TEMPLE, { //Events - EventAccess(&DekuPrincess, {[]{return WoodfallClear;}}), + EventAccess(&DekuPrincess, {[]{return WoodfallClear && AnyBottle;}}), }, { //Locations - LocationAccess(WOODFALL_TEMPLE_DEKU_PRINCESS, {[]{return AnyBottle;}}), + LocationAccess(WOODFALL_TEMPLE_DEKU_PRINCESS, {[]{return AnyBottle && AnySword;}}), }, { //Exits @@ -2097,9 +2167,9 @@ void AreaTable_Init() { }, { //Locations - LocationAccess(SNOWHEAD_TEMPLE_BRIDGE_ROOM_CHEST, {[] {return GoronMask && MagicMeter;}}), + LocationAccess(SNOWHEAD_TEMPLE_BRIDGE_ROOM_CHEST, {[] {return (GoronMask || Hookshot) && FireArrows && Bow && MagicMeter;}}), // Fire Arrow to melt ice, then hookshot to it //StrayFairies - LocationAccess(SH_SF_BRIDGE_ROOM_LEDGE_BUBBLE, {[] {return ((GreatFairyMask && Bow) || (Hookshot && GreatFairyMask));}}), + LocationAccess(SH_SF_BRIDGE_ROOM_LEDGE_BUBBLE, {[] {return (GoronMask || (GreatFairyMask && Bow) || (Hookshot && GreatFairyMask));}}), //Can walk up to it with Goron LocationAccess(SH_SF_BRIDGE_ROOM_PILLAR_BUBBLE, {[] {return ((GreatFairyMask && Bow) || (Hookshot && GreatFairyMask));}}), }, { @@ -2226,8 +2296,8 @@ void AreaTable_Init() { }, { //Locations - LocationAccess(SNOWHEAD_TEMPLE_ICICLE_ROOM_CHEST, {[] {return Bow;}}), - LocationAccess(SH_SF_ICICLE_ROOM_WALL, {[] {return Bow && GreatFairyMask;}}), + LocationAccess(SNOWHEAD_TEMPLE_ICICLE_ROOM_CHEST, {[] {return Bow || (ZoraMask && (GoronMask || (Bow && FireArrows && MagicMeter) || AnyBombBag));}}), //Either shoot the icicles down or climb up as Zora and break snow boulder + LocationAccess(SH_SF_ICICLE_ROOM_WALL, {[] {return Bow && GreatFairyMask && LensOfTruth && MagicMeter;}}), }, { //Exits @@ -2240,7 +2310,7 @@ void AreaTable_Init() { }, { //Locations - LocationAccess(SH_SF_CEILING_BUBBLE, {[] {return (Hookshot || Bow) && GreatFairyMask;}}), + LocationAccess(SH_SF_CEILING_BUBBLE, {[] {return (Hookshot || Bow) && GreatFairyMask && LensOfTruth && MagicMeter;}}), }, { //Exits @@ -2253,7 +2323,7 @@ void AreaTable_Init() { }, { //Locations - LocationAccess(SH_SF_MAIN_ROOM_WALL, {[] {return (Bow || Hookshot) && GreatFairyMask;}}), + LocationAccess(SH_SF_MAIN_ROOM_WALL, {[] {return (Bow || Hookshot) && GreatFairyMask && LensOfTruth && MagicMeter;}}), }, { //Exits @@ -2323,7 +2393,7 @@ void AreaTable_Init() { { //Exits Entrance(SNOWHEAD_TEMPLE_MAIN_ROOM_3F, {[]{return SmallKeys(SnowheadTempleKeys, 3);}}), - Entrance(SNOWHEAD_TEMPLE_DINOLFOS_ROOM, {[]{return true;}})//maybe FireArrows? + Entrance(SNOWHEAD_TEMPLE_DINOLFOS_ROOM, {[]{return true;}}) //Need Fire Arrows to melt the ice and progress, but you can also just jump down }); areaTable[SNOWHEAD_TEMPLE_MAIN_ROOM_4F] = Area("Snowhead Temple Main Room 4F", "Snowhead Temple Main Room 4F", SNOWHEAD_TEMPLE, { @@ -2387,6 +2457,7 @@ void AreaTable_Init() { //Locations LocationAccess(GOHT, {[] {return GoronMask && FireArrows && Bow && MagicMeter && BossKeySnowheadTemple;}}), LocationAccess(GOHT_HEART_CONTAINER, {[] {return GoronMask && BossKeySnowheadTemple && Bow && FireArrows && MagicMeter;}}), + LocationAccess(GIANTS_OATH_TO_ORDER, {[]{return SnowheadClear;}}), }, { //Exits @@ -2418,7 +2489,7 @@ void AreaTable_Init() { { //Locations LocationAccess(GBT_SF_SKULLTULA, {[] {return Hookshot || (Bow && GreatFairyMask);}}), - LocationAccess(GBT_SF_WATER_CONTROL_UNDERWATER_BUBBLE, {[] {return Hookshot && (ZoraMask || GreatFairyMask);}}), + LocationAccess(GBT_SF_WATER_CONTROL_UNDERWATER_BUBBLE, {[] {return (Bow || Hookshot) && (ZoraMask || GreatFairyMask);}}), //Shoot with Bow/Hookshot and collect }, { //Exits @@ -2431,8 +2502,8 @@ void AreaTable_Init() { }, { //Locations - LocationAccess(GBT_SF_WHIRLPOOL_JAR, {[] {return ZoraMask && Hookshot;}}), - LocationAccess(GBT_SF_WHIRLPOOL_BARREL, {[] {return ZoraMask && Hookshot;}}), + LocationAccess(GBT_SF_WHIRLPOOL_JAR, {[] {return ZoraMask || (Bow && GreatFairyMask);}}), //Swim down or shoot pot with bow and get with mask on + LocationAccess(GBT_SF_WHIRLPOOL_BARREL, {[] {return true;}}), //Climb the ladder and bonk }, { //Exits @@ -2461,8 +2532,8 @@ void AreaTable_Init() { }, { //Locations - LocationAccess(GBT_MAP_CHEST, {[] {return ZoraMask && Hookshot;}}), - LocationAccess(GBT_SF_LEDGE_JAR, {[] {return ZoraMask && Hookshot && (GreatFairyMask || (Bow && MagicMeter && IceArrows));}}), + LocationAccess(GBT_MAP_CHEST, {[] {return ZoraMask && (Hookshot || (Bow && MagicMeter && IceArrows));}}), + LocationAccess(GBT_SF_LEDGE_JAR, {[] {return ZoraMask && (Hookshot || Bow) && (GreatFairyMask || (Bow && MagicMeter && IceArrows));}}), //Shoot to break pot and either get with GFM or ice platforms }, { //Exits @@ -2501,8 +2572,8 @@ void AreaTable_Init() { { //Locations LocationAccess(GBT_COMPASS_CHEST, {[] {return ZoraMask;}}), - LocationAccess(GBT_SMALL_KEY_CHEST, {[] {return ZoraMask && Hookshot;}}), - LocationAccess(GBT_SF_DEXIHANDS_JAR, {[] {return ZoraMask && GreatFairyMask;}}), + LocationAccess(GBT_SMALL_KEY_CHEST, {[] {return ZoraMask;}}), + LocationAccess(GBT_SF_DEXIHANDS_JAR, {[] {return (ZoraMask || Bow || Hookshot) && GreatFairyMask;}}), //technically don't need Great Fairy Mask, you can break the jar and the hands will shake you into the fairy }, { @@ -2581,7 +2652,7 @@ void AreaTable_Init() { }, { //Locations - LocationAccess(GBT_SF_WATERWHEEL_ROOM_LOWER, {[] {return Hookshot && ZoraMask && GBTReverseWaterDirection;}}), + LocationAccess(GBT_SF_WATERWHEEL_ROOM_LOWER, {[] {return Hookshot && ZoraMask && ReverseWaterFlow;}}), LocationAccess(GBT_SF_WATERWHEEL_ROOM_UPPER, {[] {return ZoraMask && Hookshot && Bow && MagicMeter && IceArrows;}}), }, { @@ -2628,6 +2699,7 @@ void AreaTable_Init() { //Locations LocationAccess(GYORG, {[] {return ZoraMask && Hookshot && BossKeyGreatBayTemple && IceArrows && FireArrows && Bow && MagicMeter;}}), LocationAccess(GYORG_HEART_CONTAINER, {[] {return ZoraMask && Hookshot && BossKeyGreatBayTemple && IceArrows && FireArrows && Bow && MagicMeter;}}), + LocationAccess(GIANTS_OATH_TO_ORDER, {[]{return GreatBayClear;}}), }, { //Exits @@ -2656,7 +2728,7 @@ void AreaTable_Init() { areaTable[STONE_TOWER_TEMPLE_UPRIGHT_DEATH_ARMOS_ROOM] = Area("Stone Tower Temple Upright Death Armos Room", "Stone Tower Temple Upright Death Armos Room", STONE_TOWER_TEMPLE, { //Events - EventAccess(&ArmosRoomLightHole, {[]{return CanPlay(ElegyOfEmptiness) && ZoraMask && GoronMask && AnyBombBag;}}), + EventAccess(&ArmosRoomLightHole, {[]{return CanPlay(ElegyOfEmptiness) && ZoraMask && GoronMask && (AnyBombBag || BlastMask);}}), }, { //Locations @@ -2788,7 +2860,7 @@ void AreaTable_Init() { { //Exits Entrance(STONE_TOWER_TEMPLE_UPDRAFT_ROOM, {[]{return true;}}), - Entrance(STONE_TOWER_TEMPLE_INVERTED_THIN_BRIDGE_ROOM, {[]{return Hookshot && InvertedChestSpawn;}}), + Entrance(STONE_TOWER_TEMPLE_INVERTED_EYEGORE_ROOM, {[]{return Hookshot && InvertedChestSpawn && SmallKeys(StoneTowerTempleKeys, 4);}}), }); areaTable[STONE_TOWER_TEMPLE_UPDRAFT_ROOM] = Area("Inverted Stone Tower Temple Updraft Room", "Inverted Stone Tower Temple Updraft Room", STONE_TOWER_TEMPLE, { @@ -2907,6 +2979,18 @@ void AreaTable_Init() { Entrance(STONE_TOWER_TEMPLE_PRE_GOMESS_ROOM, {[]{return LightArrows && Bow && MagicMeter;}}), }); + areaTable[STONE_TOWER_TEMPLE_INVERTED_EYEGORE_ROOM] = Area("Inverted Stone Tower Eyegore Room", "Inverted Stone Tower Eyegore Room", STONE_TOWER_TEMPLE, { + //Events + }, + { + //Locations + }, + { + //Exits + Entrance(STONE_TOWER_TEMPLE_INVERTED_ENTRANCE, {[]{return true;}}), + Entrance(STONE_TOWER_TEMPLE_INVERTED_THIN_BRIDGE_ROOM, {[]{return Bow && MagicMeter && LightArrows;}}) + }); + areaTable[STONE_TOWER_TEMPLE_INVERTED_THIN_BRIDGE_ROOM] = Area("Inverted Stone Tower Thin Bridge Room", "Inverted Stone Tower Thin Bridge Room", STONE_TOWER_TEMPLE, { //Events EventAccess(&ThinBridgeCrystalChest, {[]{return Fighting || Bow;}}), @@ -2940,6 +3024,7 @@ void AreaTable_Init() { LocationAccess(STONE_TOWER_TEMPLE_GIANTS_MASK_CHEST, {[] {return LightArrows && Bow && MagicMeter && BossKeyStoneTowerTemple;}}), LocationAccess(TWINMOLD, {[] {return LightArrows && Bow && MagicMeter && BossKeyStoneTowerTemple && GiantsMask;}}), LocationAccess(TWINMOLD_HEART_CONTAINER, {[] {return LightArrows && Bow && MagicMeter && BossKeyStoneTowerTemple && GiantsMask;}}), + LocationAccess(GIANTS_OATH_TO_ORDER, {[]{return StoneTowerClear;}}), }, { //Exits @@ -3036,7 +3121,7 @@ void AreaTable_Init() { areaTable[PIRATE_FORTRESS_HOOKSHOT_ROOM_TOP] = Area("Pirates Fortress Upper Hookshot Room", "Pirates Fortress Upper Hookshot Room", PIRATE_FORTRESS, { //Events - EventAccess(&PirateBees, {[]{return Bow || Hookshot;}}), + EventAccess(&PirateBees, {[]{return Bow;}}),//potential trick for zora fins or deku bubble? }, { //Locations @@ -3156,7 +3241,7 @@ void AreaTable_Init() { }, { //Locations - LocationAccess(WELL_LEFT_PATH_CHEST, {[] {return true;}}), + LocationAccess(WELL_LEFT_PATH_CHEST, {[] {return LensOfTruth && MagicMeter;}}),//invisible chest }, { //Exits @@ -3263,7 +3348,7 @@ void AreaTable_Init() { }, { //Locations - LocationAccess(BENEATH_THE_WELL_MIRROR_SHIELD_CHEST, {[] {return (FireArrows || LightArrows) && Bow && MagicMeter;}}),//Either burn the cloth or just light arow the switch + LocationAccess(BENEATH_THE_WELL_MIRROR_SHIELD_CHEST, {[] {return FireArrows && Bow && MagicMeter;}}),//Either burn the cloth or just light arow the switch }, { //Exits @@ -3402,7 +3487,7 @@ void AreaTable_Init() { }, { //Locations - LocationAccess(IKANA_CASTLE_IKANA_KING, {[] {return (LightArrows || MirrorShield) && Fighting && FireArrows && Bow && MagicMeter;}}), + LocationAccess(IKANA_CASTLE_IKANA_KING, {[] {return MirrorShield && Fighting && FireArrows && Bow && MagicMeter;}}), }, { //Exits @@ -3410,7 +3495,7 @@ void AreaTable_Init() { }); - areaTable[SECRET_SHRINE_ENTRANCE] = Area("Secret Shrine Entrance", "Secret Shrine Entrance", SECRET_SHRINE_ENTRANCE, { + areaTable[SECRET_SHRINE_ENTRANCE] = Area("Secret Shrine Entrance", "Secret Shrine Entrance", SECRET_SHRINE, { //Events }, { @@ -3422,7 +3507,7 @@ void AreaTable_Init() { Entrance(SECRET_SHRINE_CENTER_ROOM, {[]{return LightArrows && Bow && MagicMeter;}}), }); - areaTable[SECRET_SHRINE_CENTER_ROOM] = Area("Secret Shrine Center Room", "Secret Shrine Center Room", SECRET_SHRINE_CENTER_ROOM, { + areaTable[SECRET_SHRINE_CENTER_ROOM] = Area("Secret Shrine Center Room", "Secret Shrine Center Room", SECRET_SHRINE, { //Events }, { @@ -3438,7 +3523,7 @@ void AreaTable_Init() { Entrance(SECRET_SHRINE_GARO_ROOM, {[]{return true;}}), }); - areaTable[SECRET_SHRINE_DINOLFOS_ROOM] = Area("Secret Shrine Dinolfos Room", "Secret Shrine Dinolfos Room", SECRET_SHRINE_DINOLFOS_ROOM, { + areaTable[SECRET_SHRINE_DINOLFOS_ROOM] = Area("Secret Shrine Dinolfos Room", "Secret Shrine Dinolfos Room", SECRET_SHRINE, { //Events }, { @@ -3450,7 +3535,7 @@ void AreaTable_Init() { Entrance(SECRET_SHRINE_CENTER_ROOM, {[]{return true;}}), }); - areaTable[SECRET_SHRINE_WIZZROBE_ROOM] = Area("Secret Shrine Wizzrobe Room", "Secret Shrine Wizzrobe Room", SECRET_SHRINE_WIZZROBE_ROOM, { + areaTable[SECRET_SHRINE_WIZZROBE_ROOM] = Area("Secret Shrine Wizzrobe Room", "Secret Shrine Wizzrobe Room", SECRET_SHRINE, { //Events }, { @@ -3462,7 +3547,7 @@ void AreaTable_Init() { Entrance(SECRET_SHRINE_CENTER_ROOM, {[]{return true;}}), }); - areaTable[SECRET_SHRINE_WART_ROOM] = Area("Secret Shrine Wart Room", "Secret Shrine Wart Room", SECRET_SHRINE_WART_ROOM, { + areaTable[SECRET_SHRINE_WART_ROOM] = Area("Secret Shrine Wart Room", "Secret Shrine Wart Room", SECRET_SHRINE, { //Events }, { @@ -3474,7 +3559,7 @@ void AreaTable_Init() { Entrance(SECRET_SHRINE_CENTER_ROOM, {[]{return true;}}), }); - areaTable[SECRET_SHRINE_GARO_ROOM] = Area("Secret Shrine Garo Room", "Secret Shrine Garo Room", SECRET_SHRINE_GARO_ROOM, { + areaTable[SECRET_SHRINE_GARO_ROOM] = Area("Secret Shrine Garo Room", "Secret Shrine Garo Room", SECRET_SHRINE, { //Events }, { @@ -3503,12 +3588,18 @@ void AreaTable_Init() { Entrance(THE_MOON_LINK_TRIAL_ENTRANCE, {[]{return (TotalMaskCount() >= 4);}}), }); - areaTable[THE_MOON_DEKU_TRIAL] = Area("The Moon Deku Trial", "The Moon Deku Trial", THE_MOON_DEKU_TRIAL, { + areaTable[THE_MOON_DEKU_TRIAL] = Area("The Moon Deku Trial", "The Moon Deku Trial", THE_MOON, { //Events }, { //Locations LocationAccess(THE_MOON_DEKU_TRIAL_BONUS, {[] {return DekuMask;}}), + //Gossip Stones + LocationAccess(MOON_DEKU_GOSSIP_1, {[] {return DekuMask;}}), + LocationAccess(MOON_DEKU_GOSSIP_2, {[] {return DekuMask;}}), + LocationAccess(MOON_DEKU_GOSSIP_3, {[] {return DekuMask;}}), + LocationAccess(MOON_DEKU_GOSSIP_4, {[] {return DekuMask;}}), + LocationAccess(MOON_DEKU_GOSSIP_5, {[] {return DekuMask;}}), }, { //Exits @@ -3516,7 +3607,7 @@ void AreaTable_Init() { Entrance(THE_MOON_DEKU_TRIAL_KID_ROOM, {[]{return DekuMask;}}), }); - areaTable[THE_MOON_DEKU_TRIAL_KID_ROOM] = Area("The Moon Deku Trial Kid Room", "The Moon Deku Trial Kid Room", THE_MOON_DEKU_TRIAL_KID_ROOM, { + areaTable[THE_MOON_DEKU_TRIAL_KID_ROOM] = Area("The Moon Deku Trial Kid Room", "The Moon Deku Trial Kid Room", THE_MOON, { //Events }, { @@ -3528,12 +3619,18 @@ void AreaTable_Init() { Entrance(THE_MOON_DEKU_TRIAL, {[]{return true;}}), }); - areaTable[THE_MOON_GORON_TRIAL] = Area("The Moon Goron Trial", "The Moon Goron Trial", THE_MOON_GORON_TRIAL, { + areaTable[THE_MOON_GORON_TRIAL] = Area("The Moon Goron Trial", "The Moon Goron Trial", THE_MOON, { //Events }, { //Locations LocationAccess(THE_MOON_GORON_TRIAL_BONUS, {[] {return GoronMask && MagicMeter;}}), + //Gossip Stones + LocationAccess(MOON_GORON_GOSSIP_1, {[] {return GoronMask;}}), + LocationAccess(MOON_GORON_GOSSIP_2, {[] {return GoronMask;}}), + LocationAccess(MOON_GORON_GOSSIP_3, {[] {return GoronMask;}}), + LocationAccess(MOON_GORON_GOSSIP_4, {[] {return GoronMask;}}), + LocationAccess(MOON_GORON_GOSSIP_5, {[] {return GoronMask;}}), }, { //Exits @@ -3541,7 +3638,7 @@ void AreaTable_Init() { Entrance(THE_MOON_GORON_TRIAL_KID_ROOM, {[]{return GoronMask;}}), }); - areaTable[THE_MOON_GORON_TRIAL_KID_ROOM] = Area("The Moon Goron Trial Kid Room", "The Moon Goron Trial Kid Room", THE_MOON_GORON_TRIAL_KID_ROOM, { + areaTable[THE_MOON_GORON_TRIAL_KID_ROOM] = Area("The Moon Goron Trial Kid Room", "The Moon Goron Trial Kid Room", THE_MOON, { //Events }, { @@ -3553,12 +3650,18 @@ void AreaTable_Init() { Entrance(THE_MOON_GORON_TRIAL, {[]{return GoronMask;}}), }); - areaTable[THE_MOON_ZORA_TRIAL] = Area("The Moon Zora Trial", "The Moon Zora Trial", THE_MOON_ZORA_TRIAL, { + areaTable[THE_MOON_ZORA_TRIAL] = Area("The Moon Zora Trial", "The Moon Zora Trial", THE_MOON, { //Events }, { //Locations LocationAccess(THE_MOON_ZORA_TRIAL_BONUS, {[] {return ZoraMask && MagicMeter;}}), + //Gossip Stones + LocationAccess(MOON_ZORA_GOSSIP_1, {[] {return ZoraMask;}}), + LocationAccess(MOON_ZORA_GOSSIP_2, {[] {return ZoraMask;}}), + LocationAccess(MOON_ZORA_GOSSIP_3, {[] {return ZoraMask;}}), + LocationAccess(MOON_ZORA_GOSSIP_4, {[] {return ZoraMask;}}), + LocationAccess(MOON_ZORA_GOSSIP_5, {[] {return ZoraMask;}}), }, { //Exits @@ -3566,7 +3669,7 @@ void AreaTable_Init() { Entrance(THE_MOON_ZORA_TRIAL_KID_ROOM, {[]{return ZoraMask && MagicMeter;}}), }); - areaTable[THE_MOON_ZORA_TRIAL_KID_ROOM] = Area("The Moon Zora Trial Kid Room", "The Moon Zora Trial Kid Room", THE_MOON_ZORA_TRIAL_KID_ROOM, { + areaTable[THE_MOON_ZORA_TRIAL_KID_ROOM] = Area("The Moon Zora Trial Kid Room", "The Moon Zora Trial Kid Room", THE_MOON, { //Events }, { @@ -3578,7 +3681,7 @@ void AreaTable_Init() { Entrance(THE_MOON_ZORA_TRIAL, {[]{return true;}}), }); - areaTable[THE_MOON_LINK_TRIAL_ENTRANCE] = Area("The Moon Link Trial Entrance", "The Moon Link Trial Entrance", THE_MOON_LINK_TRIAL_ENTRANCE, { + areaTable[THE_MOON_LINK_TRIAL_ENTRANCE] = Area("The Moon Link Trial Entrance", "The Moon Link Trial Entrance", THE_MOON, { //Events }, { @@ -3590,7 +3693,7 @@ void AreaTable_Init() { Entrance(THE_MOON_LINK_TRIAL_DINOLFOS_ROOM, {[]{return true;}}), }); - areaTable[THE_MOON_LINK_TRIAL_DINOLFOS_ROOM] = Area("The Moon Link Trial Dinolfos Room", "The Moon Link Trial Dinolfos Room", THE_MOON_LINK_TRIAL_DINOLFOS_ROOM, { + areaTable[THE_MOON_LINK_TRIAL_DINOLFOS_ROOM] = Area("The Moon Link Trial Dinolfos Room", "The Moon Link Trial Dinolfos Room", THE_MOON, { //Events }, { @@ -3602,11 +3705,13 @@ void AreaTable_Init() { Entrance(THE_MOON_LINK_TRIAL_GOSSIP_ROOM_1, {[]{return Fighting;}}), }); - areaTable[THE_MOON_LINK_TRIAL_GOSSIP_ROOM_1] = Area("The Moon Link Trial Gossip Room 1", "The Moon Link Trial Gossip Room 1", THE_MOON_LINK_TRIAL_GOSSIP_ROOM_1, { + areaTable[THE_MOON_LINK_TRIAL_GOSSIP_ROOM_1] = Area("The Moon Link Trial Gossip Room 1", "The Moon Link Trial Gossip Room 1", THE_MOON, { //Events }, { //Locations + //Gossip Stones + LocationAccess(MOON_LINK_GOSSIP_1, {[] {return true;}}), }, { //Exits @@ -3614,7 +3719,7 @@ void AreaTable_Init() { Entrance(THE_MOON_LINK_TRIAL_GARO_ROOM, {[]{return true;}}), }); - areaTable[THE_MOON_LINK_TRIAL_GARO_ROOM] = Area("The Moon Link Trial Garo Room", "The Moon Link Trial Garo Room", THE_MOON_LINK_TRIAL_GARO_ROOM, { + areaTable[THE_MOON_LINK_TRIAL_GARO_ROOM] = Area("The Moon Link Trial Garo Room", "The Moon Link Trial Garo Room", THE_MOON, { //Events }, { @@ -3627,11 +3732,13 @@ void AreaTable_Init() { Entrance(THE_MOON_LINK_TRIAL_GOSSIP_ROOM_2, {[]{return Fighting && Hookshot;}}), }); - areaTable[THE_MOON_LINK_TRIAL_GOSSIP_ROOM_2] = Area("The Moon Link Trial Gossip Room 2", "The Moon Link Trial Gossip Room 2", THE_MOON_LINK_TRIAL_GOSSIP_ROOM_2, { + areaTable[THE_MOON_LINK_TRIAL_GOSSIP_ROOM_2] = Area("The Moon Link Trial Gossip Room 2", "The Moon Link Trial Gossip Room 2", THE_MOON, { //Events }, { //Locations + //Gossip Stones + LocationAccess(MOON_LINK_GOSSIP_2, {[] {return true;}}), }, { //Exits @@ -3639,12 +3746,15 @@ void AreaTable_Init() { Entrance(THE_MOON_LINK_TRIAL_IRON_KNUCKLE_ROOM, {[]{return true;}}), }); - areaTable[THE_MOON_LINK_TRIAL_IRON_KNUCKLE_ROOM] = Area("The Moon Link Trial Iron Knuckle Room", "The Moon Link Trial Iron Knuckle Room", THE_MOON_LINK_TRIAL_IRON_KNUCKLE_ROOM, { + areaTable[THE_MOON_LINK_TRIAL_IRON_KNUCKLE_ROOM] = Area("The Moon Link Trial Iron Knuckle Room", "The Moon Link Trial Iron Knuckle Room", THE_MOON, { //Events }, { //Locations LocationAccess(THE_MOON_IRON_KNUCKLE_CHEST, {[] {return Fighting;}}), + //Gossip Stones + LocationAccess(MOON_LINK_GOSSIP_3, {[] {return true;}}), + LocationAccess(MOON_LINK_GOSSIP_4, {[] {return true;}}), }, { //Exits @@ -3652,12 +3762,14 @@ void AreaTable_Init() { Entrance(THE_MOON_LINK_TRIAL_PIECE_OF_HEART_ROOM, {[]{return Fighting && AnyBombBag && Bow;}}), }); - areaTable[THE_MOON_LINK_TRIAL_PIECE_OF_HEART_ROOM] = Area("The Moon Link Trial Piece of Heart Room", "The Moon Link Trial Piece of Heart Room", THE_MOON_LINK_TRIAL_PIECE_OF_HEART_ROOM, { + areaTable[THE_MOON_LINK_TRIAL_PIECE_OF_HEART_ROOM] = Area("The Moon Link Trial Piece of Heart Room", "The Moon Link Trial Piece of Heart Room", THE_MOON, { //Events }, { //Locations LocationAccess(THE_MOON_LINK_TRIAL_BONUS, {[] {return true;}}), + //Gossip Stones + LocationAccess(MOON_LINK_GOSSIP_5, {[] {return true;}}), }, { //Exits @@ -3665,7 +3777,7 @@ void AreaTable_Init() { Entrance(THE_MOON_LINK_TRIAL_KID_ROOM, {[]{return (AnyBombBag && FireArrows && Bow && MagicMeter) || CanPlay(SongOfStorms);}}), }); - areaTable[THE_MOON_LINK_TRIAL_KID_ROOM] = Area("The Moon Link Trial Kid Room", "The Moon Link Trial Kid Room", THE_MOON_LINK_TRIAL_KID_ROOM, { + areaTable[THE_MOON_LINK_TRIAL_KID_ROOM] = Area("The Moon Link Trial Kid Room", "The Moon Link Trial Kid Room", THE_MOON, { //Events }, { @@ -3956,7 +4068,7 @@ void AreaTable_Init() { } namespace Areas { - static std::array < const AreaKey, 265> allAreas = { + static std::array < const AreaKey, 267> allAreas = { ROOT, ROOT_EXITS, N_CLOCK_TOWN, @@ -4059,6 +4171,7 @@ namespace Areas { IKANA_GRAVEYARD_BATS_ROOM, IKANA_GRAVEYARD_TABLET_ROOM, IKANA_GRAVEYARD_BELOW_GRAVE2, + IKANA_GRAVEYARD_PRE_IRON_KNUCKLE_ROOM, IKANA_GRAVEYARD_IRON_KNUCKLE_ROOM, IKANA_GRAVEYARD_BELOW_GRAVE3, DAMPES_HUT, @@ -4147,6 +4260,7 @@ namespace Areas { STONE_TOWER_TEMPLE_INVERTED_ENTRANCE_DEATH_ARMOS_LEDGE, STONE_TOWER_TEMPLE_PRE_GOMESS_ROOM, STONE_TOWER_TEMPLE_GOMESS_ROOM, + STONE_TOWER_TEMPLE_INVERTED_EYEGORE_ROOM, STONE_TOWER_TEMPLE_INVERTED_THIN_BRIDGE_ROOM, STONE_TOWER_TEMPLE_PRE_BOSS_ROOM, STONE_TOWER_TEMPLE_BOSS_ROOM, diff --git a/source/logic.cpp b/source/logic.cpp index bec57e3..ed70670 100644 --- a/source/logic.cpp +++ b/source/logic.cpp @@ -45,9 +45,10 @@ namespace Logic { bool AlienBottle = false; bool GoronRaceBottle = false; bool BeaverRaceBottle = false; - bool DampeBottle = false; + bool ArcheryBottle = false; bool ChateauBottle = false; bool MysteryMilkBottle = false; + bool UsableMysteryMilkBottle = false; bool BombersNotebook = false; bool MirrorShield = false; bool HerosShield = false; @@ -90,7 +91,7 @@ namespace Logic { bool GarosMask = false; bool CaptainsHat = false; bool GiantsMask = false; - bool FierceDietyMask = false; + bool FierceDeityMask = false; bool MaskOfTruth = false; bool OneMask = false; bool TwoMasks = false; @@ -122,6 +123,7 @@ namespace Logic { bool SongOfStorms = false; bool SonataOfAwakening = false; bool SongOfHealing = false; + bool LullabyIntro = false; bool GoronsLullaby = false; bool NewWaveBossaNova = false; bool ElegyOfEmptiness = false; @@ -299,6 +301,7 @@ namespace Logic { bool WoodfallFrog = false; bool GreatBayFrog = false; bool ThinBridgeCrystalChest = false; + bool MilkQuestStart = false; bool CanGoToMoon = false; @@ -363,7 +366,7 @@ namespace Logic { (item == GAROS_MASK) || (item == CAPTAINS_HAT) || (item == GIANTS_MASK) || - (item == FIERCE_DIETY_MASK) || + (item == FIERCE_DEITY_MASK) || (item == MASK_OF_TRUTH); } static bool HasItem(ItemKey itemName) { @@ -397,7 +400,7 @@ namespace Logic { (itemName == GAROS_MASK && GarosMask) || (itemName == CAPTAINS_HAT && CaptainsHat) || (itemName == GIANTS_MASK && GiantsMask) || - (itemName == FIERCE_DIETY_MASK && FierceDietyMask) || + (itemName == FIERCE_DEITY_MASK && FierceDeityMask) || (itemName == MASK_OF_TRUTH && MaskOfTruth); } @@ -428,7 +431,7 @@ namespace Logic { } bool TotalHeartContainers(u8 requiredAmount) { - return (HeartContainers + (PiecesOfHeart/4) >= requiredAmount); + return (HeartContainers + (PiecesOfHeart/4) + 3 >= requiredAmount); } u8 TotalMaskCount() { @@ -462,9 +465,9 @@ namespace Logic { DekuNutDrop = NutPot || NutCrate || DekuBabaNuts; BugsAccess = BugShrub || WanderingBugs || BugRock; FishAccess = LoneFish || FishGroup; - WaterAccess = (SpringWater && WitchBottle) || CanPlay(SongOfStorms); - HotSpringWaterAccess = HotSpringWater && WitchBottle; - WaterForBeans = (WitchBottle && WaterAccess) || SongOfStorms; + WaterAccess = (SpringWater && AnyBottle) || CanPlay(SongOfStorms); + HotSpringWaterAccess = HotSpringWater && AnyBottle; + WaterForBeans = (AnyBottle && WaterAccess) || SongOfStorms; AnyMagicBean = (MagicBean || MagicBeanPack || LimitlessBeans); //refills Bombs = AnyBombBag; @@ -495,7 +498,7 @@ namespace Logic { //Item Helpers AnyMagicBean = MagicBean || LimitlessBeans; AnyWallet = Townwallet200 || OceanWallet500 || (ProgressiveWallet >= 1); - AnyBottle = WitchBottle || AlienBottle || BeaverRaceBottle || DampeBottle || GoronRaceBottle || ChateauBottle || MysteryMilkBottle || HasBottle; + AnyBottle = WitchBottle || AlienBottle || BeaverRaceBottle || ArcheryBottle || GoronRaceBottle || ChateauBottle || UsableMysteryMilkBottle || HasBottle; MagicMeter = (ProgressiveMagic >= 1) || MagicPower || ExtendedMagicPower; WaterForBeans = (AnyBottle && (SpringWater || HotSpringWater)) || SongOfStorms; Scarecrow = Hookshot && CanPlay(ScarecrowSong); @@ -514,13 +517,13 @@ namespace Logic { AnyHealingPotion = AnyRedPotion || AnyBluePotion; AnyRedPotion = AnyBottle; AnyBluePotion = AnyBottle; - TwoBottles = { (WitchBottle && AlienBottle) || (WitchBottle && BeaverRaceBottle) || (WitchBottle && DampeBottle) || + TwoBottles = { (WitchBottle && AlienBottle) || (WitchBottle && BeaverRaceBottle) || (WitchBottle && ArcheryBottle) || (WitchBottle && GoronRaceBottle) || (WitchBottle && ChateauBottle) || (AlienBottle && GoronRaceBottle) || - (AlienBottle && BeaverRaceBottle) || (AlienBottle && DampeBottle) || (AlienBottle && ChateauBottle) || - (GoronRaceBottle && BeaverRaceBottle) || (GoronRaceBottle && DampeBottle) || (GoronRaceBottle && ChateauBottle) || - (BeaverRaceBottle && DampeBottle) || (BeaverRaceBottle && ChateauBottle) || (DampeBottle && ChateauBottle) || - (WitchBottle && MysteryMilkBottle) || (AlienBottle && MysteryMilkBottle) || (BeaverRaceBottle && MysteryMilkBottle) || - (DampeBottle && MysteryMilkBottle) || (GoronRaceBottle && MysteryMilkBottle) || (ChateauBottle && MysteryMilkBottle)}; + (AlienBottle && BeaverRaceBottle) || (AlienBottle && ArcheryBottle) || (AlienBottle && ChateauBottle) || + (GoronRaceBottle && BeaverRaceBottle) || (GoronRaceBottle && ArcheryBottle) || (GoronRaceBottle && ChateauBottle) || + (BeaverRaceBottle && ArcheryBottle) || (BeaverRaceBottle && ChateauBottle) || (ArcheryBottle && ChateauBottle) || + (WitchBottle && UsableMysteryMilkBottle) || (AlienBottle && UsableMysteryMilkBottle) || (BeaverRaceBottle && UsableMysteryMilkBottle) || + (ArcheryBottle && UsableMysteryMilkBottle) || (GoronRaceBottle && UsableMysteryMilkBottle) || (ChateauBottle && UsableMysteryMilkBottle)}; //Tricks PoisonWaterAsZora = ZoraMask && TakeDamage; @@ -572,9 +575,10 @@ namespace Logic { AlienBottle = false; GoronRaceBottle = false; BeaverRaceBottle = false; - DampeBottle = false; + ArcheryBottle = false; ChateauBottle = false; MysteryMilkBottle = false; + UsableMysteryMilkBottle = false; BombersNotebook = false; MirrorShield = false; HerosShield = false; @@ -617,7 +621,7 @@ namespace Logic { GarosMask = false; CaptainsHat = false; GiantsMask = false; - FierceDietyMask = false; + FierceDeityMask = false; MaskOfTruth = false; OneMask = false; TwoMasks = false; @@ -649,6 +653,7 @@ namespace Logic { SongOfStorms = false; SonataOfAwakening = false; SongOfHealing = false; + LullabyIntro = false; GoronsLullaby = false; NewWaveBossaNova = false; ElegyOfEmptiness = false; @@ -828,6 +833,7 @@ namespace Logic { WoodfallFrog = false; GreatBayFrog = false; ThinBridgeCrystalChest = false; + MilkQuestStart = false; ZoraEgg = 0; diff --git a/source/menu.cpp b/source/menu.cpp index 9c2ef16..f90e9a1 100644 --- a/source/menu.cpp +++ b/source/menu.cpp @@ -20,7 +20,6 @@ using namespace Settings; namespace { bool seedChanged; - bool choosePlayOption; u16 pastSeedLength; u16 settingBound = 0; PrintConsole topScreen, bottomScreen; @@ -48,7 +47,6 @@ void MenuInit() { Settings::InitSettings(); seedChanged = false; - choosePlayOption = false; pastSeedLength = Settings::seed.length(); settingBound = 0; @@ -164,7 +162,7 @@ void MenuUpdate(u32 kDown) { } } //If they pressed B on any menu other than main, go backwards to the previous menu - else if (kDown & KEY_B && currentMenu->mode != MAIN_MENU && !choosePlayOption) { + else if (kDown & KEY_B && currentMenu->mode != MAIN_MENU) { //Want to reset generate menu when leaving if (currentMenu->mode == POST_GENERATE) { @@ -226,9 +224,6 @@ void MenuUpdate(u32 kDown) { PrintResetToDefaultsMenu(); } else if (currentMenu->mode == GENERATE_MODE) { UpdateGenerateMenu(kDown); - if (currentMenu->mode != POST_GENERATE) { - PrintGenerateMenu(); - } } else if (currentMenu->mode == SUB_MENU) { PrintSubMenu(); } @@ -320,33 +315,14 @@ void UpdateResetToDefaultsMenu(u32 kDown) { printf("\x1b[24;5HSettings have been reset to defaults."); } } - +u16 menuIdx2; void UpdateGenerateMenu(u32 kDown) { - if (!choosePlayOption) { - if ((kDown & KEY_A) != 0) { - Settings::PlayOption = currentMenu->menuIdx; - consoleSelect(&bottomScreen); - consoleClear(); - choosePlayOption = true; - } - } - else { - if ((kDown & KEY_B) !=0) { - consoleSelect(&bottomScreen); - consoleClear(); - choosePlayOption = false; - } - else if ((kDown & KEY_A) !=0) { - Settings::Version = currentMenu->menuIdx; - consoleSelect(&bottomScreen); - consoleClear(); + //consoleSelect(&bottomScreen); + //consoleClear(); GenerateRandomizer(); //This is just a dummy mode to stop the prompt from appearing again currentMenu->mode = POST_GENERATE; - choosePlayOption = false; - } - } - } + } void PrintMainMenu() { printf("\x1b[0;%dHMain Settings", 1+(BOTTOM_WIDTH-13)/2); @@ -485,47 +461,6 @@ void PrintResetToDefaultsMenu() { printf("\x1b[12;4HPress B to return to the preset menu."); } -void PrintGenerateMenu() { - - consoleSelect(&bottomScreen); - - if (!choosePlayOption) { - printf("\x1b[3;%dHHow will you play?", 1+(BOTTOM_WIDTH-18)/2); - std::vector playOptions = {"3ds Console", "Citra Emulator"}; - - for (u8 i = 0; i < playOptions.size(); i++) { - - std::string option = playOptions[i]; - u8 row = 6 + (i * 2); - //make the current selection green - if (currentMenu->menuIdx == i) { - printf("\x1b[%d;%dH%s>", row, 14, GREEN); - printf("\x1b[%d;%dH%s%s", row, 15, option.c_str(), RESET); - } else { - printf("\x1b[%d;%dH%s", row, 15, option.c_str()); - } - } - } - else { - printf("\x1b[3;%dHSelect your game version", 1 + (BOTTOM_WIDTH -18) / 2); - std::vector versionOptions = {"1.0", "1.1"}; - - for (u8 j=0; j < versionOptions.size(); j++) { - std::string option = versionOptions[j]; - u8 row = 6 + (j * 2); - //make the current selection green - if (currentMenu->menuIdx == j) { - printf("\x1b[%d;%dH%s>", row, 14, GREEN); - printf("\x1b[%d;%dH%s%s", row, 15, option.c_str(), RESET); - } else { - printf("\x1b[%d;%dH%s", row, 15, option.c_str()); - } - } - ClearDescription(); - PrintVersionDescription(); - - } -} void ClearDescription() { consoleSelect(&topScreen); @@ -543,15 +478,6 @@ void PrintOptionDescription() { printf("\x1b[22;0H%s", description.data()); } -void PrintVersionDescription() { - ClearDescription(); //"Description must fit in this space ---------------//" - std::string_view description = "Due to patch size when using version 1.1 it can \n" - "take up to 30 seconds to launch the game, this is\n" - "expected and will not effect gameplay"; - - printf("\x1b[22;0H%s", description.data()); -} - void GenerateRandomizer() { consoleSelect(&topScreen); @@ -584,23 +510,23 @@ void GenerateRandomizer() { return; } } - printf("\x1b[12;10HWriting Patch..."); + printf("\x1b[13;10HWriting Patch..."); if (WriteAllPatches()) { printf("Done"); - if (Settings::PlayOption == PATCH_CONSOLE) { - printf("\x1b[14;10HQuit out using the home menu. Then\n"); - printf("\x1b[15;10Henable game patching and launch MM3D!\n"); + if (Settings::PlayOption.Value() == PATCH_CONSOLE) { + printf("\x1b[15;10HQuit out using the home menu. Then\n"); + printf("\x1b[16;10Henable game patching and launch MM3D!\n"); } - else if (Settings::PlayOption == PATCH_CITRA) { - printf("\x1b[14;10HCopy code.ips, exheader.bin and romfs to\n"); - printf("\x1b[15;10Hthe MM3D mods folder, then launch MM3D!\n"); + else if (Settings::PlayOption.Value() == PATCH_CITRA) { + printf("\x1b[15;10HCopy code.ips, exheader.bin and romfs to\n"); + printf("\x1b[16;10Hthe MM3D mods folder, then launch MM3D!\n"); } const auto& randomizerHash = GetRandomizerHash(); - printf("\x1b[17;10HHash:"); + printf("\x1b[18;10HHash:"); for (size_t i = 0; i < randomizerHash.size(); i++) { - printf("\x1b[%zu;11H- %s", i + 18, randomizerHash[i].c_str()); + printf("\x1b[%zu;11H- %s", i + 19, randomizerHash[i].c_str()); } } else { diff --git a/source/patch.cpp b/source/patch.cpp index e8b956e..91b4c1e 100644 --- a/source/patch.cpp +++ b/source/patch.cpp @@ -111,15 +111,27 @@ bool WriteAllPatches() { FSUSER_CreateDirectory(sdmcArchive, fsMakePath(PATH_ASCII, "/luma"), FS_ATTRIBUTE_DIRECTORY); //Create the titles directory if it doesn't exist FSUSER_CreateDirectory(sdmcArchive, fsMakePath(PATH_ASCII, "/luma/titles"), FS_ATTRIBUTE_DIRECTORY); - //Create the 0004000000125500 directory if it doesn't exist (mm3d game id) - FSUSER_CreateDirectory(sdmcArchive, fsMakePath(PATH_ASCII, "/luma/titles/0004000000125500"), FS_ATTRIBUTE_DIRECTORY); - //Create the romfs directory if it doesn't exist (for LayeredFS) - FSUSER_CreateDirectory(sdmcArchive, fsMakePath(PATH_ASCII, "/luma/titles/0004000000125500/romfs"), FS_ATTRIBUTE_DIRECTORY); - //Create the actor directory if it doesn't exist - FSUSER_CreateDirectory(sdmcArchive, fsMakePath(PATH_ASCII, "/luma/titles/0004000000125500/romfs/actor"), FS_ATTRIBUTE_DIRECTORY); - //Create the actors directory if it doesn't exist - FSUSER_CreateDirectory(sdmcArchive, fsMakePath(PATH_ASCII, "/luma/titles/0004000000125500/romfs/actors"), FS_ATTRIBUTE_DIRECTORY); + //Create the 0004000000125500 OR 0004000000125600 directory if it doesn't exist (mm3d game id: NA/EUR) + if (!Settings::RegionSelect){ + FSUSER_CreateDirectory(sdmcArchive, fsMakePath(PATH_ASCII, "/luma/titles/0004000000125500"), FS_ATTRIBUTE_DIRECTORY); + //Create the romfs directory if it doesn't exist (for LayeredFS) + FSUSER_CreateDirectory(sdmcArchive, fsMakePath(PATH_ASCII, "/luma/titles/0004000000125500/romfs"), FS_ATTRIBUTE_DIRECTORY); + //Create the actor directory if it doesn't exist + FSUSER_CreateDirectory(sdmcArchive, fsMakePath(PATH_ASCII, "/luma/titles/0004000000125500/romfs/actor"), FS_ATTRIBUTE_DIRECTORY); + //Create the actors directory if it doesn't exist + FSUSER_CreateDirectory(sdmcArchive, fsMakePath(PATH_ASCII, "/luma/titles/0004000000125500/romfs/actors"), FS_ATTRIBUTE_DIRECTORY); + } + //EU + if (Settings::RegionSelect){ + FSUSER_CreateDirectory(sdmcArchive, fsMakePath(PATH_ASCII, "/luma/titles/0004000000125600"), FS_ATTRIBUTE_DIRECTORY); + //Create the romfs directory if it doesn't exist (for LayeredFS) + FSUSER_CreateDirectory(sdmcArchive, fsMakePath(PATH_ASCII, "/luma/titles/0004000000125600/romfs"), FS_ATTRIBUTE_DIRECTORY); + //Create the actor directory if it doesn't exist + FSUSER_CreateDirectory(sdmcArchive, fsMakePath(PATH_ASCII, "/luma/titles/0004000000125600/romfs/actor"), FS_ATTRIBUTE_DIRECTORY); + //Create the actors directory if it doesn't exist + FSUSER_CreateDirectory(sdmcArchive, fsMakePath(PATH_ASCII, "/luma/titles/0004000000125600/romfs/actors"), FS_ATTRIBUTE_DIRECTORY); + } /*romfs is used to get files from the romfs folder.This allows us to copy //from basecode and write the exheader without the user needing to worry about //placing them manually on their SD card.*/ @@ -131,17 +143,29 @@ bool WriteAllPatches() { /*------------------------ - | basecode.ips | --------------------------*/ - - // Delete code.ips if it exists - FSUSER_DeleteFile(sdmcArchive, fsMakePath(PATH_ASCII, "/luma/titles/0004000000125500/code.ips")); - - // Open code.ips - if (!R_SUCCEEDED(res = FSUSER_OpenFile(&code, sdmcArchive, fsMakePath(PATH_ASCII, "/luma/titles/0004000000125500/code.ips"), FS_OPEN_WRITE | FS_OPEN_CREATE, 0))) { - return false; + //NA + if (!Settings::RegionSelect){ + // Delete code.ips if it exists + FSUSER_DeleteFile(sdmcArchive, fsMakePath(PATH_ASCII, "/luma/titles/0004000000125500/code.ips")); + + // Open code.ips + if (!R_SUCCEEDED(res = FSUSER_OpenFile(&code, sdmcArchive, fsMakePath(PATH_ASCII, "/luma/titles/0004000000125500/code.ips"), FS_OPEN_WRITE | FS_OPEN_CREATE, 0))) { + return false; + } + } + //EU + if (Settings::RegionSelect){ + // Delete code.ips if it exists + FSUSER_DeleteFile(sdmcArchive, fsMakePath(PATH_ASCII, "/luma/titles/0004000000125600/code.ips")); + + // Open code.ips + if (!R_SUCCEEDED(res = FSUSER_OpenFile(&code, sdmcArchive, fsMakePath(PATH_ASCII, "/luma/titles/0004000000125600/code.ips"), FS_OPEN_WRITE | FS_OPEN_CREATE, 0))) { + return false; + } } // Copy basecode to code - const char* basecodeFile = Settings::Version == 0 ? "romfs:/basecode.ips" : "romfs/basecode1.1.ips"; + const char* basecodeFile = Settings::Version.Value() == 0 ? "romfs:/basecode.ips" : "romfs:/basecode1.1.ips"; if (auto basecode = FILEPtr{std::fopen(basecodeFile, "r"), std::fclose}) { // obtain basecode.ips file size fseek(basecode.get(), 0, SEEK_END); @@ -340,13 +364,19 @@ bool WriteAllPatches() { // Get exheader for proper playOption const char * filePath; - if (Settings::PlayOption == PATCH_CONSOLE) { + if (Settings::PlayOption.Value() == PATCH_CONSOLE) { filePath = "romfs:/exheader.bin"; } else { filePath = "romfs:/exheader_citra.bin"; } - - CopyFile(sdmcArchive, "/luma/titles/0004000000125500/exheader.bin", filePath); + //NA + if (!Settings::RegionSelect){ + CopyFile(sdmcArchive, "/luma/titles/0004000000125500/exheader.bin", filePath); + } + //EU + if (Settings::RegionSelect){ + CopyFile(sdmcArchive, "/luma/titles/0004000000125600/exheader.bin", filePath); + } /*------------------------ - | custom assets | @@ -356,7 +386,7 @@ bool WriteAllPatches() { // Delete assets if it exists - Handle assetsOut; + /*Handle assetsOut; const char* assetsOutPath = "/luma/titles/0004000000125500/romfs/actor/zelda_gi_melody.zar"; const char* assetsInPath = "romfs:/zelda_gi_melody.zar"; FSUSER_DeleteFile(sdmcArchive, fsMakePath(PATH_ASCII, assetsOutPath)); @@ -390,7 +420,7 @@ bool WriteAllPatches() { } FSFILE_Close(assetsOut); - //FSUSER_CloseArchive(sdmcArchive); + //FSUSER_CloseArchive(sdmcArchive);*/ /*------------------- | TITLESCREEN LZS | @@ -398,32 +428,104 @@ bool WriteAllPatches() { // Delete assets if it exists Handle titleassetsOut; - const char* titleassetsOutPath = "/luma/titles/0004000000125500/romfs/actors/zelda2_mag.gar.lzs"; const char* titleassetsInPath = "romfs:/zelda2_mag.gar.lzs"; - FSUSER_DeleteFile(sdmcArchive, fsMakePath(PATH_ASCII, titleassetsOutPath)); + //NA + if (!Settings::RegionSelect){ + const char* titleassetsOutPath = "/luma/titles/0004000000125500/romfs/actors/zelda2_mag.gar.lzs"; + FSUSER_DeleteFile(sdmcArchive, fsMakePath(PATH_ASCII, titleassetsOutPath)); + // Open assets destination + if (!R_SUCCEEDED(res = FSUSER_OpenFile(&titleassetsOut, sdmcArchive, fsMakePath(PATH_ASCII, titleassetsOutPath), FS_OPEN_WRITE | FS_OPEN_CREATE, 0))) { + return false; + } - // Open assets destination - if (!R_SUCCEEDED(res = FSUSER_OpenFile(&titleassetsOut, sdmcArchive, fsMakePath(PATH_ASCII, titleassetsOutPath), FS_OPEN_WRITE | FS_OPEN_CREATE, 0))) { - return false; + if (auto file = FILEPtr{std::fopen(titleassetsInPath, "r"), std::fclose}) { + // obtain assets size + fseek(file.get(), 0, SEEK_END); + const auto lSize = static_cast(ftell(file.get())); + rewind(file.get()); + + // copy assets into the buffer + std::vector buffer(lSize); + fread(buffer.data(), 1, buffer.size(), file.get()); + + // Write the assets to final destination + if (!R_SUCCEEDED(res = FSFILE_Write(titleassetsOut, &bytesWritten, 0, buffer.data(), buffer.size(), FS_WRITE_FLUSH))) { + return false; + } + } } + //EU + if (Settings::RegionSelect){ + const char* titleassetsOutPath = "/luma/titles/0004000000125600/romfs/actors/zelda2_mag.gar.lzs"; + FSUSER_DeleteFile(sdmcArchive, fsMakePath(PATH_ASCII, titleassetsOutPath)); + // Open assets destination + if (!R_SUCCEEDED(res = FSUSER_OpenFile(&titleassetsOut, sdmcArchive, fsMakePath(PATH_ASCII, titleassetsOutPath), FS_OPEN_WRITE | FS_OPEN_CREATE, 0))) { + return false; + } - if (auto file = FILEPtr{std::fopen(titleassetsInPath, "r"), std::fclose}) { - // obtain assets size - fseek(file.get(), 0, SEEK_END); - const auto lSize = static_cast(ftell(file.get())); - rewind(file.get()); + if (auto file = FILEPtr{std::fopen(titleassetsInPath, "r"), std::fclose}) { + // obtain assets size + fseek(file.get(), 0, SEEK_END); + const auto lSize = static_cast(ftell(file.get())); + rewind(file.get()); - // copy assets into the buffer - std::vector buffer(lSize); - fread(buffer.data(), 1, buffer.size(), file.get()); + // copy assets into the buffer + std::vector buffer(lSize); + fread(buffer.data(), 1, buffer.size(), file.get()); - // Write the assets to final destination - if (!R_SUCCEEDED(res = FSFILE_Write(titleassetsOut, &bytesWritten, 0, buffer.data(), buffer.size(), FS_WRITE_FLUSH))) { - return false; + // Write the assets to final destination + if (!R_SUCCEEDED(res = FSFILE_Write(titleassetsOut, &bytesWritten, 0, buffer.data(), buffer.size(), FS_WRITE_FLUSH))) { + return false; + } } } + FSFILE_Close(titleassetsOut); + /*------------------- + | LOCALE EMULATION | + -------------------*/ + + if (Settings::PlayOption.Value() == PATCH_CONSOLE) { + Handle localeOut; + //NA + if (!Settings::RegionSelect){ + const char* localeOutPath = "/luma/titles/0004000000125500/locale.txt"; + FSUSER_DeleteFile(sdmcArchive, fsMakePath(PATH_ASCII, localeOutPath)); + + if (!R_SUCCEEDED(res = FSUSER_OpenFile(&localeOut, sdmcArchive, fsMakePath(PATH_ASCII, localeOutPath), FS_OPEN_WRITE | FS_OPEN_CREATE, 0))) { + return false; + } + } + //EU + if (Settings::RegionSelect){ + const char* localeOutPath = "/luma/titles/0004000000125600/locale.txt"; + FSUSER_DeleteFile(sdmcArchive, fsMakePath(PATH_ASCII, localeOutPath)); + if (!R_SUCCEEDED(res = FSUSER_OpenFile(&localeOut, sdmcArchive, fsMakePath(PATH_ASCII, localeOutPath), FS_OPEN_WRITE | FS_OPEN_CREATE, 0))) { + return false; + } + } + + + //NA + if (!Settings::RegionSelect){ + std::vector buffer = { 'U', 'S', 'A', ' ', 'E', 'N' }; + if (!R_SUCCEEDED(res = FSFILE_Write(localeOut, &bytesWritten, 0, buffer.data(), buffer.size(), FS_WRITE_FLUSH))) { + return false; + } + FSFILE_Close(localeOut); + } + //EU + if (Settings::RegionSelect){ + std::vector buffer = { 'E', 'U', 'R', ' ', 'E', 'N' }; + if (!R_SUCCEEDED(res = FSFILE_Write(localeOut, &bytesWritten, 0, buffer.data(), buffer.size(), FS_WRITE_FLUSH))) { + return false; + } + FSFILE_Close(localeOut); + } + + } + FSUSER_CloseArchive(sdmcArchive); return true; diff --git a/source/playthrough.cpp b/source/playthrough.cpp index 0e2ac09..c06ee3d 100644 --- a/source/playthrough.cpp +++ b/source/playthrough.cpp @@ -19,10 +19,10 @@ namespace Playthrough { //resolved to something random Random_Init(seed); - //overrides.clear(); + overrides.clear(); //CustomMessages::ClearMessages(); ItemReset(); - //HintReset(); + HintReset(); Areas::AccessReset(); Settings::UpdateSettings(); @@ -76,7 +76,7 @@ namespace Playthrough { clockTownMap = ItemTable(Location(TINGLE_N_CLOCK_TOWN_CT)->GetPlacedItemKey()).GetName().GetEnglish(); woodfallMap = ItemTable(Location(TINGLE_N_CLOCK_TOWN_WF)->GetPlacedItemKey()).GetName().GetEnglish(); - CustomMessages::CreateMessage(0x1D12, 0xFFFF, 0x3FF0A005, 0xFF1001, + CustomMessages::CreateMessage(0x1D12, 0xFFFF, 0x3FF0A014, 0xFF1001, woodfallMap.insert(0, "#").append("# #20 Rupees#&").append(snowHeadMap.insert(0, "#").c_str()).append("# #40 Rupees#").append("&#No thanks#").c_str(), {QM_GREEN, QM_RED, QM_GREEN, QM_RED, QM_GREEN}, {}, {}, 0x0, false, false); woodfallMap = ItemTable(Location(TINGLE_N_CLOCK_TOWN_WF)->GetPlacedItemKey()).GetName().GetEnglish(); @@ -109,14 +109,14 @@ namespace Playthrough { if (Settings::GenerateSpoilerLog) { //write logs - printf("\x1b[11;10HWriting Spoiler Log..."); + printf("\x1b[12;10HWriting Spoiler Log..."); if (SpoilerLog_Write()) { printf("Done"); } else { printf("Failed"); } #ifdef ENABLE_DEBUG - printf("\x1b[11;10HWriting Placement Log..."); + printf("\x1b[12;10HWriting Placement Log..."); if (PlacementLog_Write()) { printf("Done\n"); } else { diff --git a/source/setting_descriptions.cpp b/source/setting_descriptions.cpp index 742567a..1bb5a40 100644 --- a/source/setting_descriptions.cpp +++ b/source/setting_descriptions.cpp @@ -18,9 +18,9 @@ string_view logicVanilla = "For those who want to play the game nor "locations will contain their vanilla items. This\n" "supercedes all item shuffle, logic, hint, and\n" // "item pool settings. You can still use non-vanilla\n" - "world settings such as adult start or entrance\n" // - "shuffle, but the game may require glitches to\n" // - "complete if you do."; // + "world settings such as entrance shuffle, \n" // + "but the game may require glitches to complete\n" // + "if you do."; // /*------------------------------ // | ALL LOCATIONS REACHABLE | // ------------------------------*/ // @@ -120,78 +120,63 @@ string_view shuffleMainInventoryDesc = "Shuffle Main Inventory Items\n" "Magic Beans and Fire, Ice, and Light Arrows"; // // string_view shuffleTransformationDesc = "Shuffles Deku, Goron, and Zora Masks"; // -string_view shuffleFierceDietyDesc = "Shuffles Fierce Diety Mask"; // +string_view shuffleFierceDeityDesc = "Shuffles Fierce Deity Mask"; // string_view shuffleMoonItemsDesc = "Shuffles Items from the Moon into the pool\n" // - "Includes 4 Pieces of Heart, 10 Bombchu & 30 Arrows"; + "Includes 4 Pieces of Heart, and 2 junk items"; // /*------------------------------ // | MAPS AND COMPASSES | // ------------------------------*/ // -string_view mapCompassStartWith = "**OPTION CURRENTLY WIP**\n" // - "Maps and Compasses are given to you from the\n" // +string_view mapCompassStartWith = "Maps and Compasses are given to you from the\n" // "start. This will add a small amount of money and\n" "refill items to the pool."; // string_view mapCompassVanilla = "Maps and Compasses will appear in their vanilla\n"// "locations."; // -string_view mapCompassOwnDungeon = "**OPTION CURRENTLY WIP**\n" // - "Maps and Compasses can only appear in their\n" // +string_view mapCompassOwnDungeon = "Maps and Compasses can only appear in their\n" // "respective dungeon."; // -string_view mapCompassAnyDungeon = "**OPTION CURRENTLY WIP**\n" // - "Maps and Compasses can only appear in a dungeon,\n"// +string_view mapCompassAnyDungeon = "Maps and Compasses can only appear in a dungeon,\n"// "but not necessarily the dungeon they are for."; // -string_view mapCompassOverworld = "**OPTION CURRENTLY WIP**\n" // - "Maps and Compasses can only appear outside of\n" // +string_view mapCompassOverworld = "Maps and Compasses can only appear outside of\n" // "dungeons."; // -string_view mapCompassAnywhere = "**OPTION CURRENTLY WIP**\n" // - "Maps and Compasses can appear anywhere in the\n" // +string_view mapCompassAnywhere = "Maps and Compasses can appear anywhere in the\n" // "world."; // /*------------------------------ // | SMALL KEYS | // ------------------------------*/ // -string_view smallKeyStartWith = "**OPTION CURRENTLY WIP**\n" // - "Small Keys are given to you from the start so you\n" +string_view smallKeyStartWith = "Small Keys are given to you from the start so you\n" "won't have to worry about locked doors. An easier\n" "mode."; // -string_view smallKeyVanilla = "Small Keys will appear in their vanilla locations.";// -string_view smallKeyOwnDungeon = "**OPTION CURRENTLY WIP**\n" // - "Small Keys can only appear in their respective\n" // +string_view smallKeyVanilla = "Small Keys will appear in their vanilla locations.";// +string_view smallKeyOwnDungeon = "Small Keys can only appear in their respective\n" // "dungeon. "; // -string_view smallKeyAnyDungeon = "**OPTION CURRENTLY WIP**\n" // - "Small Keys can only appear inside of any dungeon,\n" +string_view smallKeyAnyDungeon = "Small Keys can only appear inside of any dungeon,\n" "but won't necessarily be in the dungeon that the\n" "key is for. A difficult mode since it is more\n" // "likely to need to enter a dungeon multiple times."; -string_view smallKeyOverworld = "**OPTION CURRENTLY WIP**\n" // - "Small Keys can only appear outside of dungeons.\n"// +string_view smallKeyOverworld = "Small Keys can only appear outside of dungeons.\n"// "You may need to enter a dungeon multiple times to\n" "gain items to access the overworld locations with\n" "the keys required to finish a dungeon."; // -string_view smallKeyAnywhere = "**OPTION CURRENTLY WIP**\n" // - "Small Keys can appear anywhere in the world. A\n" // +string_view smallKeyAnywhere = "Small Keys can appear anywhere in the world. A\n" // "difficult mode since it is more likely to need to\n" "enter a dungeon multiple times."; // /*------------------------------ // | BOSS KEYS | // ------------------------------*/ // -string_view bossKeyStartWith = "**OPTION CURRENTLY WIP**\n" // - "Boss Keys are given to you from the start so you\n" +string_view bossKeyStartWith = "Boss Keys are given to you from the start so you\n" "won't have to worry about boss doors. An easier\n"// "mode."; // string_view bossKeyVanilla = "Boss Keys will appear in their vanilla locations.";// -string_view bossKeyOwnDungeon = "**OPTION CURRENTLY WIP**\n" // - "Boss Keys can only appear in their respective\n" // +string_view bossKeyOwnDungeon = "Boss Keys can only appear in their respective\n" // "dungeon."; // -string_view bossKeyAnyDungeon = "**OPTION CURRENTLY WIP**\n" // - "Boss Keys can only appear inside of any dungeon,\n" +string_view bossKeyAnyDungeon = "Boss Keys can only appear inside of any dungeon,\n" "but won't necessarily be in the dungeon that the\n" "key is for. A difficult mode since it is more\n" // "likely to need to enter a dungeon multiple times."; -string_view bossKeyOverworld = "**OPTION CURRENTLY WIP**\n" // - "Boss Keys can only appear outside of dungeons.\n" // +string_view bossKeyOverworld = "Boss Keys can only appear outside of dungeons.\n" // "You may need to enter a dungeon without the boss\n" "key to get items required to find the key in the\n" "overworld."; // -string_view bossKeyAnywhere = "**OPTION CURRENTLY WIP**\n" // - "Boss Keys can appear anywhere in the world. A\n" // +string_view bossKeyAnywhere = "Boss Keys can appear anywhere in the world. A\n" // "difficult mode since it is more likely to need to\n" "enter a dungeon multiple times."; // /*------------------------------ // @@ -254,8 +239,7 @@ string_view shuffleStartShield = "**OPTION CURRENTLY WIP**\n" | SHUFFLE GREAT FAIRY REWARDS | // ------------------------------*/ // string_view shuffleGFVanilla = "Great Fairy Rewards will be Vanilla"; // -string_view shuffleGFSelf = "**OPTION CURRENTLY WIP**\n" // - "Great Fairy Rewards will be shuffled among \n" // +string_view shuffleGFSelf = "Great Fairy Rewards will be shuffled among \n" // "other Great Fairy Locations"; // string_view shuffleGFAnywhere = "Great Fairy Rewards can be anywhere"; // /*------------------------------ // @@ -309,8 +293,7 @@ string_view songsDungeonRewards = "**OPTION CURRENTLY WIP**\n" string_view songsAllLocations = "**OPTION CURRENTLY WIP**\n" // "Songs can appear in any location."; // // -string_view shuffleSoaringVanilla = "**OPTION CURRENTLY WIP**\n" // - "Sets Song of Soaring to its Vanilla Location"; // +string_view shuffleSoaringVanilla = "Sets Song of Soaring to its Vanilla Location"; // string_view shuffleSoaringRandom = "**OPTION CURRENTLY WIP**\n" // "Randomizes Song of Soaring"; // /*------------------------------ // @@ -329,20 +312,15 @@ string_view gossipStonesHintsDesc = "Gossip Stones can be made to give hints /*------------------------------ // | CLEARER HINTS | // ------------------------------*/ // -string_view clearerHintsDesc = "**OPTION CURRENTLY WIP**\n" // - "The hints provided by Gossip Stones will be very\n" +string_view clearerHintsDesc = "The hints provided by Gossip Stones will be very\n" "direct if this option is enabled."; // /*------------------------------ // | HINT DISTRIBUTION | // ------------------------------*/ // -string_view uselessHintsDesc = "**OPTION CURRENTLY WIP**\n" // - "Only junk hints."; // -string_view balancedHintsDesc = "**OPTION CURRENTLY WIP**\n" // - "Recommended hint spread."; // -string_view strongHintsDesc = "**OPTION CURRENTLY WIP**\n" // - "More useful hints."; // -string_view veryStrongHintsDesc = "**OPTION CURRENTLY WIP**\n" // - "Many powerful hints."; // +string_view uselessHintsDesc = "Only junk hints."; // +string_view balancedHintsDesc = "Recommended hint spread."; // +string_view strongHintsDesc = "More useful hints."; // +string_view veryStrongHintsDesc = "Many powerful hints."; // // /*------------------------------ // | CHANGE OVERWORLD SPIRTES | // @@ -354,10 +332,8 @@ string_view changeOverworldItemsDesc = "**OPTION CURRENTLY WIP**\n" /*------------------------------ // | INGAME SPOILERS | // ------------------------------*/ // -string_view ingameSpoilersShowDesc = "**OPTION CURRENTLY WIP**\n" // - "Every spoiler is shown."; // -string_view ingameSpoilersHideDesc = "**OPTION CURRENTLY WIP**\n" // - "Hides the spheres page and only shows a\n" // +string_view ingameSpoilersShowDesc = "Every spoiler is shown."; // +string_view ingameSpoilersHideDesc = "Hides the spheres page and only shows a\n" // "location's item after it has been found."; // // string_view genSpoilerLogDesc = "Choose to Generate a Spoiler Log"; // @@ -389,21 +365,19 @@ string_view advancedTrapDmgDesc = "**OPTION CURRENTLY WIP**\n" /*------------------------------ // | ITEM POOL | // ------------------------------*/ // -string_view itemPoolPlentiful = "**OPTION CURRENTLY WIP**\n" // - "Extra major items are added to the pool."; // +string_view itemPoolPlentiful = "Extra major items are added to the pool."; // string_view itemPoolBalanced = "Original item pool."; // -string_view itemPoolScarce = "**OPTION CURRENTLY WIP**\n" // - "Some excess items are removed, including health\n"// +string_view itemPoolScarce = "Some excess items are removed, including health\n"// "upgrades."; // -string_view itemPoolMinimal = "**OPTION CURRENTLY WIP**\n" // - "Most excess items are removed."; // +string_view itemPoolMinimal = "Most excess items are removed."; // // /*------------------------------ // | ICE TRAPS | // ------------------------------*/ // -string_view iceTrapsOff = "All Ice Traps are removed."; // -string_view iceTrapsNormal = "Only Ice Traps from the base item pool are placed."; -string_view iceTrapsExtra = "Chance to add extra Ice Traps when junk items are\n" +string_view iceTrapsOff = "All Ice Traps are removed.\n" // + "This is the same as Vanilla as the base game\n" // + "Does not have any Ice Traps."; // +string_view iceTrapsExtra = "Chance to add Ice Traps when junk items are\n" "added to the itempool."; // string_view iceTrapsMayhem = "All added junk items will be Ice Traps."; // string_view iceTrapsOnslaught = "All junk items will be replaced by Ice Traps, even" @@ -417,17 +391,13 @@ string_view removeDDDesc = "If set the double defense item will be /*------------------------------ // | BLAST MASK COOLDOWN | // ------------------------------*/ // -string_view blastDefault = "**OPTION CURRENTLY WIP**\n" // - "Sets the cooldown time on the blastmask to \n" // +string_view blastDefault = "Sets the cooldown time on the blastmask to \n" // "the default cooldown time of 10 seconds"; // -string_view blastInstant = "**OPTION CURRENTLY WIP**\n" // - "Sets the cooldown time on the blastmask to \n" // +string_view blastInstant = "Sets the cooldown time on the blastmask to \n" // "have no cooldown time"; // -string_view blastVeryShort = "**OPTION CURRENTLY WIP**\n" // - "Sets the cooldown time on the blastmask to \n" // - "have an even shorter cooldown time of 1 second"; // -string_view blastShort = "**OPTION CURRENTLY WIP**\n" // - "Sets the cooldown time on the blastmask to \n" // +string_view blastVeryShort = "Sets the cooldown time on the blastmask to \n" // + "have an even shorter cooldown time of 3 seconds"; // +string_view blastShort = "Sets the cooldown time on the blastmask to \n" // "have a shorter cooldown time of 5 seconds"; // string_view blastLong = "**OPTION CURRENTLY WIP**\n" // "Sets the cooldown time on the blastmask to \n" // @@ -444,8 +414,8 @@ string_view skipMinigamePhasesDesc = "**OPTION CURRENTLY WIP**\n" "both rewards at once for that minigame." // "Also skips the first beaver race."; // // -string_view fierceDietyAnywhereDesc = "**OPTION CURRENTLY WIP**\n" // - "Enables the use of the Fierce Diety Mask anywhere";// +string_view fierceDeityAnywhereDesc = "**OPTION CURRENTLY WIP**\n" // + "Enables the use of the Fierce Deity Mask anywhere";// // string_view underwaterOcarinaDesc = "**OPTION CURRENTLY WIP**\n" // "Enables the use of the ocarina while underwater.";// @@ -641,10 +611,12 @@ string_view ocarinaDiveDesc = "Enables Ocarina Diving"; string_view dpadMaskDesc = "Enables using the 3 D-Pad buttons to use\n" // "transformation masks. This option will also\n" // "patch using Down A with Mask Storage."; // -string_view dpadOcarinaDesc = "Enables using D-Pad down to activate your\n" // +string_view dpadOcarinaDesc = "Enables using D-Pad right to activate your\n" // "ocarina."; // string_view dpadArrowDesc = "Enables using D-Pad up to change your current\n" // "arrow that is being used."; // +string_view twinmoldRestorationDesc = "Fixes Twinmold boss fight so Red Twinmold does not\n" + "regen health when it burrows."; // // /*------------------------------- // | CUSTOM BUTTON MAPPING | // @@ -659,15 +631,28 @@ string_view customNotebookDesc = "Change the button to open the Bomber's N "Default is Start"; // string_view ingameSpoilersButtonDesc = "Change the button to open the ingame Spoiler Log\n"// "Default is Select"; // - -/*------------------------------ // -| GLITCHES | // -------------------------------*/ // +/*------------------------------- // +| BOMBERS MINIGAME SKIP | // +-------------------------------*/ // +string_view skipBombersMinigameDesc = "Skip Bomber's Minigame to get the code.\n" // + "Sets the code to 12345."; // +/*------------------------------ // +| GLITCHES | // +------------------------------*/ // const std::vector GlitchDifficulties{"Novice", "Intermediate", "Advanced", "Expert", "Hero"}; - -/*------------------------------ // -| CUTSCENE OPTIONS | // -------------------------------*/ +/*------------------------------ // +| CUTSCENE OPTIONS | // +------------------------------*/ // string_view skipHMSCutsceneDesc = "Skips the initial Happy Mask Salesman's cutscenes"; // string_view skipDarmaniCutsceneDesc = "Skips the Song of Healing Cutscene for Darmani"; // -string_view skipMikauCutsceneDesc = "Skips the Song of Healing Cutscene for Mikau"; // \ No newline at end of file +string_view skipMikauCutsceneDesc = "Skips the Song of Healing Cutscene for Mikau"; // +/*------------------------------ // +| REGION OPTIONS | // +------------------------------*/ // +string_view NARegionDesc = " North America\n" // + "Currently only supports English Hints and Custom Text"; +string_view EURegionDesc = " Europe\n" // + "Currently only supports English Hints and Custom Text"; +string_view VersionDesc = "Due to patch size when using version 1.1 it can \n" // + "take up to 30 seconds to launch the game, this is\n"// + "expected and will not effect gameplay"; // \ No newline at end of file diff --git a/source/settings.cpp b/source/settings.cpp index ace36a0..cdee5f2 100644 --- a/source/settings.cpp +++ b/source/settings.cpp @@ -53,7 +53,7 @@ namespace Settings { Option CustomItemsButton = Option::U8("Items", { buttonOptions }, { customItemsButtonDesc }, OptionCategory::Setting, 0); Option CustomMasksButton = Option::U8("Masks", { buttonOptions }, { customMasksButtonDesc }, OptionCategory::Setting, 0); Option CustomNotebookButton = Option::U8("Bombers Notebook", { buttonOptions }, { customNotebookDesc }, OptionCategory::Setting, 1); - Option IngameSpoilersButton = Option::U8("Ingame Spoler Log",{ buttonOptions }, { ingameSpoilersButtonDesc }, OptionCategory::Setting, 2); + Option IngameSpoilersButton = Option::U8("Ingame Spoiler Log",{ buttonOptions }, { ingameSpoilersButtonDesc }, OptionCategory::Setting, 2); std::vector