Merge pull request #1191 from leggettc18/get-item-rework-rando-next

Get-item-rework-rando-next
This commit is contained in:
briaguya 2022-08-23 20:40:08 -04:00 committed by GitHub
commit b7e07bef2f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
80 changed files with 2847 additions and 2613 deletions

View File

@ -1,195 +1,213 @@
cmake_minimum_required(VERSION 3.16.0 FATAL_ERROR) cmake_minimum_required(VERSION 3.16.0 FATAL_ERROR)
set(CMAKE_SYSTEM_VERSION 10.0 CACHE STRING "" FORCE) set(CMAKE_SYSTEM_VERSION 10.0 CACHE STRING "" FORCE)
set(CMAKE_CXX_STANDARD 20 CACHE STRING "The C++ standard to use") set(CMAKE_CXX_STANDARD 20 CACHE STRING "The C++ standard to use")
#set(CMAKE_C_STANDARD 11 CACHE STRING "The C standard to use") - issue with soh compile with MSVC #set(CMAKE_C_STANDARD 11 CACHE STRING "The C standard to use") - issue with soh compile with MSVC
if (CMAKE_SYSTEM_NAME STREQUAL "Darwin") if (CMAKE_SYSTEM_NAME STREQUAL "Darwin")
set(MACOSX_DEPLOYMENT_TARGET "10.15" CACHE STRING "Minimum OS X deployment version" FORCE) set(MACOSX_DEPLOYMENT_TARGET "10.15" CACHE STRING "Minimum OS X deployment version" FORCE)
endif() endif()
project(Ship C CXX) project(Ship C CXX)
set(PROJECT_VERSION_MAJOR "3") set(PROJECT_VERSION_MAJOR "3")
set(PROJECT_VERSION_MINOR "0") set(PROJECT_VERSION_MINOR "0")
set(PROJECT_VERSION_PATCH "0") set(PROJECT_VERSION_PATCH "0")
set_property(DIRECTORY ${CMAKE_SOURCE_DIR} PROPERTY VS_STARTUP_PROJECT soh) set_property(DIRECTORY ${CMAKE_SOURCE_DIR} PROPERTY VS_STARTUP_PROJECT soh)
add_compile_options($<$<CXX_COMPILER_ID:MSVC>:/MP>) add_compile_options($<$<CXX_COMPILER_ID:MSVC>:/MP>)
if (CMAKE_SYSTEM_NAME STREQUAL "Windows") if (CMAKE_SYSTEM_NAME STREQUAL "Windows")
include(CMake/automate-vcpkg.cmake) include(CMake/automate-vcpkg.cmake)
set(VCPKG_TRIPLET x64-windows-static) set(VCPKG_TRIPLET x64-windows-static)
set(VCPKG_TARGET_TRIPLET x64-windows-static) set(VCPKG_TARGET_TRIPLET x64-windows-static)
vcpkg_bootstrap() vcpkg_bootstrap()
vcpkg_install_packages(zlib bzip2 libpng SDL2 GLEW glfw3) vcpkg_install_packages(zlib bzip2 libpng SDL2 GLEW glfw3)
endif() endif()
################################################################################ ################################################################################
# Set target arch type if empty. Visual studio solution generator provides it. # Set target arch type if empty. Visual studio solution generator provides it.
################################################################################ ################################################################################
if (CMAKE_SYSTEM_NAME STREQUAL "Windows") if (CMAKE_SYSTEM_NAME STREQUAL "Windows")
if(NOT CMAKE_VS_PLATFORM_NAME) if(NOT CMAKE_VS_PLATFORM_NAME)
set(CMAKE_VS_PLATFORM_NAME "x64") set(CMAKE_VS_PLATFORM_NAME "x64")
endif() endif()
message("${CMAKE_VS_PLATFORM_NAME} architecture in use") message("${CMAKE_VS_PLATFORM_NAME} architecture in use")
if(NOT ("${CMAKE_VS_PLATFORM_NAME}" STREQUAL "x64" if(NOT ("${CMAKE_VS_PLATFORM_NAME}" STREQUAL "x64"
OR "${CMAKE_VS_PLATFORM_NAME}" STREQUAL "Win32")) OR "${CMAKE_VS_PLATFORM_NAME}" STREQUAL "Win32"))
message(FATAL_ERROR "${CMAKE_VS_PLATFORM_NAME} arch is not supported!") message(FATAL_ERROR "${CMAKE_VS_PLATFORM_NAME} arch is not supported!")
endif() endif()
endif() endif()
################################################################################ ################################################################################
# Global configuration types # Global configuration types
################################################################################ ################################################################################
if (CMAKE_SYSTEM_NAME STREQUAL "NintendoSwitch") if (CMAKE_SYSTEM_NAME STREQUAL "NintendoSwitch")
set(CMAKE_C_FLAGS_DEBUG "-O3 -ffast-math") set(CMAKE_C_FLAGS_DEBUG "-O3 -ffast-math")
set(CMAKE_CXX_FLAGS_DEBUG "-O3 -ffast-math") set(CMAKE_CXX_FLAGS_DEBUG "-O3 -ffast-math")
set(CMAKE_C_FLAGS_RELEASE "-O3 -ffast-math -DNDEBUG") set(CMAKE_C_FLAGS_RELEASE "-O3 -ffast-math -DNDEBUG")
set(CMAKE_CXX_FLAGS_RELEASE "-O3 -ffast-math -DNDEBUG") set(CMAKE_CXX_FLAGS_RELEASE "-O3 -ffast-math -DNDEBUG")
else() else()
set(CMAKE_C_FLAGS_RELEASE "-O2 -DNDEBUG") set(CMAKE_C_FLAGS_RELEASE "-O2 -DNDEBUG")
set(CMAKE_CXX_FLAGS_RELEASE "-O2 -DNDEBUG") set(CMAKE_CXX_FLAGS_RELEASE "-O2 -DNDEBUG")
set(CMAKE_OBJCXX_FLAGS_RELEASE "-O2 -DNDEBUG") set(CMAKE_OBJCXX_FLAGS_RELEASE "-O2 -DNDEBUG")
endif() endif()
if(NOT CMAKE_BUILD_TYPE ) if(NOT CMAKE_BUILD_TYPE )
set(CMAKE_BUILD_TYPE "Debug" CACHE STRING "Choose the type of build." FORCE) set(CMAKE_BUILD_TYPE "Debug" CACHE STRING "Choose the type of build." FORCE)
endif() endif()
################################################################################ ################################################################################
# Global compiler options # Global compiler options
################################################################################ ################################################################################
if(MSVC) if(MSVC)
# remove default flags provided with CMake for MSVC # remove default flags provided with CMake for MSVC
set(CMAKE_C_FLAGS "") set(CMAKE_C_FLAGS "")
set(CMAKE_C_FLAGS_DEBUG "") set(CMAKE_C_FLAGS_DEBUG "")
set(CMAKE_C_FLAGS_RELEASE "") set(CMAKE_C_FLAGS_RELEASE "")
set(CMAKE_CXX_FLAGS "") set(CMAKE_CXX_FLAGS "")
set(CMAKE_CXX_FLAGS_DEBUG "") set(CMAKE_CXX_FLAGS_DEBUG "")
set(CMAKE_CXX_FLAGS_RELEASE "") set(CMAKE_CXX_FLAGS_RELEASE "")
endif() endif()
################################################################################ ################################################################################
# Global linker options # Global linker options
################################################################################ ################################################################################
if(MSVC) if(MSVC)
# remove default flags provided with CMake for MSVC # remove default flags provided with CMake for MSVC
set(CMAKE_EXE_LINKER_FLAGS "") set(CMAKE_EXE_LINKER_FLAGS "")
set(CMAKE_MODULE_LINKER_FLAGS "") set(CMAKE_MODULE_LINKER_FLAGS "")
set(CMAKE_SHARED_LINKER_FLAGS "") set(CMAKE_SHARED_LINKER_FLAGS "")
set(CMAKE_STATIC_LINKER_FLAGS "") set(CMAKE_STATIC_LINKER_FLAGS "")
set(CMAKE_EXE_LINKER_FLAGS_DEBUG "${CMAKE_EXE_LINKER_FLAGS}") set(CMAKE_EXE_LINKER_FLAGS_DEBUG "${CMAKE_EXE_LINKER_FLAGS}")
set(CMAKE_MODULE_LINKER_FLAGS_DEBUG "${CMAKE_MODULE_LINKER_FLAGS}") set(CMAKE_MODULE_LINKER_FLAGS_DEBUG "${CMAKE_MODULE_LINKER_FLAGS}")
set(CMAKE_SHARED_LINKER_FLAGS_DEBUG "${CMAKE_SHARED_LINKER_FLAGS}") set(CMAKE_SHARED_LINKER_FLAGS_DEBUG "${CMAKE_SHARED_LINKER_FLAGS}")
set(CMAKE_STATIC_LINKER_FLAGS_DEBUG "${CMAKE_STATIC_LINKER_FLAGS}") set(CMAKE_STATIC_LINKER_FLAGS_DEBUG "${CMAKE_STATIC_LINKER_FLAGS}")
set(CMAKE_EXE_LINKER_FLAGS_RELEASE "${CMAKE_EXE_LINKER_FLAGS}") set(CMAKE_EXE_LINKER_FLAGS_RELEASE "${CMAKE_EXE_LINKER_FLAGS}")
set(CMAKE_MODULE_LINKER_FLAGS_RELEASE "${CMAKE_MODULE_LINKER_FLAGS}") set(CMAKE_MODULE_LINKER_FLAGS_RELEASE "${CMAKE_MODULE_LINKER_FLAGS}")
set(CMAKE_SHARED_LINKER_FLAGS_RELEASE "${CMAKE_SHARED_LINKER_FLAGS}") set(CMAKE_SHARED_LINKER_FLAGS_RELEASE "${CMAKE_SHARED_LINKER_FLAGS}")
set(CMAKE_STATIC_LINKER_FLAGS_RELEASE "${CMAKE_STATIC_LINKER_FLAGS}") set(CMAKE_STATIC_LINKER_FLAGS_RELEASE "${CMAKE_STATIC_LINKER_FLAGS}")
endif() endif()
################################################################################ ################################################################################
# Common utils # Common utils
################################################################################ ################################################################################
include(CMake/Utils.cmake) include(CMake/Utils.cmake)
if(CMAKE_SYSTEM_NAME MATCHES "Linux") if(CMAKE_SYSTEM_NAME MATCHES "Linux")
get_linux_lsb_release_information() get_linux_lsb_release_information()
message(STATUS "Linux ${LSB_RELEASE_ID_SHORT} ${LSB_RELEASE_VERSION_SHORT} ${LSB_RELEASE_CODENAME_SHORT}") message(STATUS "Linux ${LSB_RELEASE_ID_SHORT} ${LSB_RELEASE_VERSION_SHORT} ${LSB_RELEASE_CODENAME_SHORT}")
else() else()
message(STATUS ${CMAKE_SYSTEM_NAME}) message(STATUS ${CMAKE_SYSTEM_NAME})
endif() endif()
################################################################################ ################################################################################
# Additional Global Settings(add specific info there) # Additional Global Settings(add specific info there)
################################################################################ ################################################################################
include(CMake/GlobalSettingsInclude.cmake OPTIONAL) include(CMake/GlobalSettingsInclude.cmake OPTIONAL)
################################################################################ ################################################################################
# Use solution folders feature # Use solution folders feature
################################################################################ ################################################################################
set_property(GLOBAL PROPERTY USE_FOLDERS ON) set_property(GLOBAL PROPERTY USE_FOLDERS ON)
################################################################################ ################################################################################
# Sub-projects # Sub-projects
################################################################################ ################################################################################
add_subdirectory(libultraship/libultraship ${CMAKE_BINARY_DIR}/libultraship) add_subdirectory(libultraship/libultraship ${CMAKE_BINARY_DIR}/libultraship)
add_subdirectory(ZAPDTR/ZAPD ${CMAKE_BINARY_DIR}/ZAPD) add_subdirectory(ZAPDTR/ZAPD ${CMAKE_BINARY_DIR}/ZAPD)
add_subdirectory(ZAPDTR/ZAPDUtils ${CMAKE_BINARY_DIR}/ZAPDUtils) add_subdirectory(ZAPDTR/ZAPDUtils ${CMAKE_BINARY_DIR}/ZAPDUtils)
add_subdirectory(OTRExporter) add_subdirectory(OTRExporter)
add_subdirectory(soh) add_subdirectory(soh)
if(NOT CMAKE_SYSTEM_NAME MATCHES "Darwin|NintendoSwitch|CafeOS") if(NOT CMAKE_SYSTEM_NAME MATCHES "Darwin|NintendoSwitch|CafeOS")
add_subdirectory(OTRGui) add_subdirectory(OTRGui)
endif() endif()
set_property(TARGET soh PROPERTY APPIMAGE_DESKTOP_FILE_TERMINAL YES) set_property(TARGET soh PROPERTY APPIMAGE_DESKTOP_FILE_TERMINAL YES)
set_property(TARGET soh PROPERTY APPIMAGE_DESKTOP_FILE "${CMAKE_SOURCE_DIR}/scripts/linux/appimage/soh.desktop") set_property(TARGET soh PROPERTY APPIMAGE_DESKTOP_FILE "${CMAKE_SOURCE_DIR}/scripts/linux/appimage/soh.desktop")
set_property(TARGET soh PROPERTY APPIMAGE_ICON_FILE "${CMAKE_BINARY_DIR}/sohIcon.png") set_property(TARGET soh PROPERTY APPIMAGE_ICON_FILE "${CMAKE_BINARY_DIR}/sohIcon.png")
if("${CMAKE_SYSTEM_NAME}" STREQUAL "Linux") if("${CMAKE_SYSTEM_NAME}" STREQUAL "Linux")
INSTALL(PROGRAMS "${CMAKE_SOURCE_DIR}/scripts/linux/appimage/soh.sh" DESTINATION . COMPONENT appimage) install(PROGRAMS "${CMAKE_SOURCE_DIR}/scripts/linux/appimage/soh.sh" DESTINATION . COMPONENT appimage)
endif() endif()
find_package(Python3 COMPONENTS Interpreter) find_package(Python3 COMPONENTS Interpreter)
add_custom_target( add_custom_target(
ExtractAssets ExtractAssets
# CMake versions prior to 3.17 do not have the rm command, use remove instead for older versions # CMake versions prior to 3.17 do not have the rm command, use remove instead for older versions
COMMAND ${CMAKE_COMMAND} -E $<IF:$<VERSION_LESS:${CMAKE_VERSION},3.17>,remove,rm> -f oot.otr COMMAND ${CMAKE_COMMAND} -E $<IF:$<VERSION_LESS:${CMAKE_VERSION},3.17>,remove,rm> -f oot.otr
COMMAND ${Python3_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/OTRExporter/extract_assets.py -z "$<TARGET_FILE:ZAPD>" COMMAND ${Python3_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/OTRExporter/extract_assets.py -z "$<TARGET_FILE:ZAPD>"
COMMAND ${CMAKE_COMMAND} -E copy oot.otr ${CMAKE_SOURCE_DIR} COMMAND ${CMAKE_COMMAND} -E copy oot.otr ${CMAKE_SOURCE_DIR}
COMMAND ${CMAKE_COMMAND} -E copy oot.otr ${CMAKE_BINARY_DIR}/soh COMMAND ${CMAKE_COMMAND} -E copy oot.otr ${CMAKE_BINARY_DIR}/soh
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/OTRExporter WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/OTRExporter
COMMENT "Running asset extraction..." COMMENT "Running asset extraction..."
DEPENDS ZAPD DEPENDS ZAPD
BYPRODUCTS oot.otr ${CMAKE_SOURCE_DIR}/oot.otr BYPRODUCTS oot.otr ${CMAKE_SOURCE_DIR}/oot.otr
) )
if(CMAKE_SYSTEM_NAME MATCHES "Linux") if(CMAKE_SYSTEM_NAME MATCHES "Linux")
find_package(ImageMagick COMPONENTS convert) find_package(ImageMagick COMPONENTS convert)
if (ImageMagick_FOUND) if (ImageMagick_FOUND)
execute_process ( execute_process (
COMMAND ${ImageMagick_convert_EXECUTABLE} soh/macosx/sohIcon.png -resize 512x512 ${CMAKE_BINARY_DIR}/sohIcon.png COMMAND ${ImageMagick_convert_EXECUTABLE} soh/macosx/sohIcon.png -resize 512x512 ${CMAKE_BINARY_DIR}/sohIcon.png
OUTPUT_VARIABLE outVar OUTPUT_VARIABLE outVar
) )
endif() endif()
endif() endif()
if(CMAKE_SYSTEM_NAME MATCHES "Darwin") if(CMAKE_SYSTEM_NAME MATCHES "Darwin")
add_custom_target(CreateOSXIcons add_custom_target(CreateOSXIcons
COMMAND mkdir -p ${CMAKE_BINARY_DIR}/macosx/soh.iconset COMMAND mkdir -p ${CMAKE_BINARY_DIR}/macosx/soh.iconset
COMMAND sips -z 16 16 soh/macosx/sohIcon.png --out ${CMAKE_BINARY_DIR}/macosx/soh.iconset/icon_16x16.png COMMAND sips -z 16 16 soh/macosx/sohIcon.png --out ${CMAKE_BINARY_DIR}/macosx/soh.iconset/icon_16x16.png
COMMAND sips -z 32 32 soh/macosx/sohIcon.png --out ${CMAKE_BINARY_DIR}/macosx/soh.iconset/icon_16x16@2x.png COMMAND sips -z 32 32 soh/macosx/sohIcon.png --out ${CMAKE_BINARY_DIR}/macosx/soh.iconset/icon_16x16@2x.png
COMMAND sips -z 32 32 soh/macosx/sohIcon.png --out ${CMAKE_BINARY_DIR}/macosx/soh.iconset/icon_32x32.png COMMAND sips -z 32 32 soh/macosx/sohIcon.png --out ${CMAKE_BINARY_DIR}/macosx/soh.iconset/icon_32x32.png
COMMAND sips -z 64 64 soh/macosx/sohIcon.png --out ${CMAKE_BINARY_DIR}/macosx/soh.iconset/icon_32x32@2x.png COMMAND sips -z 64 64 soh/macosx/sohIcon.png --out ${CMAKE_BINARY_DIR}/macosx/soh.iconset/icon_32x32@2x.png
COMMAND sips -z 128 128 soh/macosx/sohIcon.png --out ${CMAKE_BINARY_DIR}/macosx/soh.iconset/icon_128x128.png COMMAND sips -z 128 128 soh/macosx/sohIcon.png --out ${CMAKE_BINARY_DIR}/macosx/soh.iconset/icon_128x128.png
COMMAND sips -z 256 256 soh/macosx/sohIcon.png --out ${CMAKE_BINARY_DIR}/macosx/soh.iconset/icon_128x128@2x.png COMMAND sips -z 256 256 soh/macosx/sohIcon.png --out ${CMAKE_BINARY_DIR}/macosx/soh.iconset/icon_128x128@2x.png
COMMAND sips -z 256 256 soh/macosx/sohIcon.png --out ${CMAKE_BINARY_DIR}/macosx/soh.iconset/icon_256x256.png COMMAND sips -z 256 256 soh/macosx/sohIcon.png --out ${CMAKE_BINARY_DIR}/macosx/soh.iconset/icon_256x256.png
COMMAND sips -z 512 512 soh/macosx/sohIcon.png --out ${CMAKE_BINARY_DIR}/macosx/soh.iconset/icon_256x256@2x.png COMMAND sips -z 512 512 soh/macosx/sohIcon.png --out ${CMAKE_BINARY_DIR}/macosx/soh.iconset/icon_256x256@2x.png
COMMAND sips -z 512 512 soh/macosx/sohIcon.png --out ${CMAKE_BINARY_DIR}/macosx/soh.iconset/icon_512x512.png COMMAND sips -z 512 512 soh/macosx/sohIcon.png --out ${CMAKE_BINARY_DIR}/macosx/soh.iconset/icon_512x512.png
COMMAND cp soh/macosx/sohIcon.png ${CMAKE_BINARY_DIR}/macosx/soh.iconset/icon_512x512@2x.png COMMAND cp soh/macosx/sohIcon.png ${CMAKE_BINARY_DIR}/macosx/soh.iconset/icon_512x512@2x.png
COMMAND iconutil -c icns -o ${CMAKE_BINARY_DIR}/macosx/soh.icns ${CMAKE_BINARY_DIR}/macosx/soh.iconset COMMAND iconutil -c icns -o ${CMAKE_BINARY_DIR}/macosx/soh.icns ${CMAKE_BINARY_DIR}/macosx/soh.iconset
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
COMMENT "Creating OSX icons ..." COMMENT "Creating OSX icons ..."
) )
add_dependencies(soh CreateOSXIcons) add_dependencies(soh CreateOSXIcons)
endif()
add_custom_target(Assets ALL
if(CMAKE_SYSTEM_NAME MATCHES "Windows|NintendoSwitch|CafeOS") COMMAND ${CMAKE_COMMAND} -Dsrc_dir="${CMAKE_SOURCE_DIR}/OTRGui/assets/extractor" -Ddst_dir="${CMAKE_BINARY_DIR}/assets/extractor" -P "${CMAKE_SOURCE_DIR}/OTRGui/Overwrite.cmake"
INSTALL(FILES ${CMAKE_SOURCE_DIR}/README.md DESTINATION . COMPONENT ship RENAME readme.txt ) COMMAND ${CMAKE_COMMAND} -Dsrc_dir="${CMAKE_SOURCE_DIR}/OTRExporter/assets" -Ddst_dir="${CMAKE_BINARY_DIR}/assets/game" -P "${CMAKE_SOURCE_DIR}/OTRGui/Overwrite.cmake"
endif() COMMAND ${CMAKE_COMMAND} -Dsrc_dir="${CMAKE_SOURCE_DIR}/soh/assets/xml" -Ddst_dir="${CMAKE_BINARY_DIR}/assets/extractor/xmls" -P "${CMAKE_SOURCE_DIR}/OTRGui/Overwrite.cmake"
)
if(CMAKE_SYSTEM_NAME MATCHES "Linux") add_dependencies(soh Assets)
set(CPACK_GENERATOR "External")
elseif(CMAKE_SYSTEM_NAME MATCHES "Windows|NintendoSwitch|CafeOS") install(TARGETS ZAPD DESTINATION ${CMAKE_BINARY_DIR}/assets/extractor)
set(CPACK_GENERATOR "ZIP")
elseif(CMAKE_SYSTEM_NAME MATCHES "Darwin") set(PROGRAM_PERMISSIONS_EXECUTE OWNER_EXECUTE OWNER_WRITE OWNER_READ GROUP_EXECUTE GROUP_READ WORLD_EXECUTE WORLD_READ)
set(CPACK_GENERATOR "Bundle")
endif() install(DIRECTORY ${CMAKE_BINARY_DIR}/assets
DESTINATION .
set(CPACK_PROJECT_CONFIG_FILE ${CMAKE_SOURCE_DIR}/CMake/Packaging-2.cmake) PATTERN ZAPD.out
include(CMake/Packaging.cmake) PERMISSIONS ${PROGRAM_PERMISSIONS_EXECUTE}
)
endif()
if(CMAKE_SYSTEM_NAME MATCHES "Windows|NintendoSwitch|CafeOS")
install(FILES ${CMAKE_SOURCE_DIR}/README.md DESTINATION . COMPONENT ship RENAME readme.txt )
endif()
if(CMAKE_SYSTEM_NAME MATCHES "Linux")
set(CPACK_GENERATOR "External")
elseif(CMAKE_SYSTEM_NAME MATCHES "Windows|NintendoSwitch|CafeOS")
set(CPACK_GENERATOR "ZIP")
elseif(CMAKE_SYSTEM_NAME MATCHES "Darwin")
set(CPACK_GENERATOR "Bundle")
endif()
set(CPACK_PROJECT_CONFIG_FILE ${CMAKE_SOURCE_DIR}/CMake/Packaging-2.cmake)
include(CMake/Packaging.cmake)

2
Jenkinsfile vendored
View File

@ -23,7 +23,7 @@ pipeline {
]) ])
sh ''' sh '''
cp ../../ZELOOTD.z64 OTRExporter/baserom_non_mq.z64 cp ../../ZELOOTD.z64 OTRExporter/baserom_non_mq.z64
cmake --no-warn-unused-cli -H. -Bbuild-cmake -GNinja -DCMAKE_BUILD_TYPE:STRING=Release cmake --no-warn-unused-cli -H. -Bbuild-cmake -GNinja -DCMAKE_BUILD_TYPE:STRING=Release -DCMAKE_OSX_ARCHITECTURES="x86_64;arm64"
cmake --build build-cmake --target ExtractAssets --config Release cmake --build build-cmake --target ExtractAssets --config Release
''' '''
stash includes: 'soh/assets/**/*', name: 'assets' stash includes: 'soh/assets/**/*', name: 'assets'

View File

@ -73,12 +73,7 @@ namespace Ship {
} }
void ControlDeck::WriteToPad(OSContPad* pad) const { void ControlDeck::WriteToPad(OSContPad* pad) const {
#ifdef __SWITCH__
bool shouldBlockGameInput = CVar_GetS32("gOpenMenuBar", 0);
#else
bool shouldBlockGameInput = CVar_GetS32("gOpenMenuBar", 0) && CVar_GetS32("gControlNav", 0); bool shouldBlockGameInput = CVar_GetS32("gOpenMenuBar", 0) && CVar_GetS32("gControlNav", 0);
#endif
for (size_t i = 0; i < virtualDevices.size(); i++) { for (size_t i = 0; i < virtualDevices.size(); i++) {
const std::shared_ptr<Controller> backend = physicalDevices[virtualDevices[i]]; const std::shared_ptr<Controller> backend = physicalDevices[virtualDevices[i]];

View File

@ -484,12 +484,7 @@ namespace SohImGui {
io->ConfigFlags |= ImGuiConfigFlags_ViewportsEnable; io->ConfigFlags |= ImGuiConfigFlags_ViewportsEnable;
} }
#ifdef __SWITCH__ if (CVar_GetS32("gControlNav", 0) && CVar_GetS32("gOpenMenuBar", 0)) {
bool enableControllerNavigation = true;
#else
bool enableControllerNavigation = CVar_GetS32("gControlNav", 0);
#endif
if (enableControllerNavigation && CVar_GetS32("gOpenMenuBar", 0)) {
io->ConfigFlags |= ImGuiConfigFlags_NavEnableGamepad | ImGuiConfigFlags_NavEnableKeyboard; io->ConfigFlags |= ImGuiConfigFlags_NavEnableGamepad | ImGuiConfigFlags_NavEnableKeyboard;
} else { } else {
io->ConfigFlags &= ~ImGuiConfigFlags_NavEnableGamepad; io->ConfigFlags &= ~ImGuiConfigFlags_NavEnableGamepad;
@ -921,19 +916,15 @@ namespace SohImGui {
ImGui::DockSpace(dockId, ImVec2(0.0f, 0.0f), ImGuiDockNodeFlags_None | ImGuiDockNodeFlags_NoDockingInCentralNode); ImGui::DockSpace(dockId, ImVec2(0.0f, 0.0f), ImGuiDockNodeFlags_None | ImGuiDockNodeFlags_NoDockingInCentralNode);
if (ImGui::IsKeyPressed(TOGGLE_BTN) || ImGui::IsKeyPressed(TOGGLE_PAD_BTN)) { if (ImGui::IsKeyPressed(TOGGLE_BTN) ||
(ImGui::IsKeyPressed(TOGGLE_PAD_BTN) && CVar_GetS32("gControlNav", 0))) {
bool menu_bar = CVar_GetS32("gOpenMenuBar", 0); bool menu_bar = CVar_GetS32("gOpenMenuBar", 0);
CVar_SetS32("gOpenMenuBar", !menu_bar); CVar_SetS32("gOpenMenuBar", !menu_bar);
needs_save = true; needs_save = true;
GlobalCtx2::GetInstance()->GetWindow()->SetMenuBar(menu_bar); GlobalCtx2::GetInstance()->GetWindow()->SetMenuBar(menu_bar);
ShowCursor(menu_bar, Dialogues::dMenubar); ShowCursor(menu_bar, Dialogues::dMenubar);
GlobalCtx2::GetInstance()->GetWindow()->GetControlDeck()->SaveControllerSettings(); GlobalCtx2::GetInstance()->GetWindow()->GetControlDeck()->SaveControllerSettings();
#ifdef __SWITCH__ if (CVar_GetS32("gControlNav", 0) && CVar_GetS32("gOpenMenuBar", 0)) {
bool enableControllerNavigation = true;
#else
bool enableControllerNavigation = CVar_GetS32("gControlNav", 0);
#endif
if (enableControllerNavigation && CVar_GetS32("gOpenMenuBar", 0)) {
io->ConfigFlags |= ImGuiConfigFlags_NavEnableGamepad | ImGuiConfigFlags_NavEnableKeyboard; io->ConfigFlags |= ImGuiConfigFlags_NavEnableGamepad | ImGuiConfigFlags_NavEnableKeyboard;
} else { } else {
io->ConfigFlags &= ~ImGuiConfigFlags_NavEnableGamepad; io->ConfigFlags &= ~ImGuiConfigFlags_NavEnableGamepad;

View File

@ -406,6 +406,14 @@ namespace Ship {
x *= scale; x *= scale;
y *= scale; y *= scale;
} }
if (isRightStick) {
getRightStickX(virtualSlot) = x;
getRightStickY(virtualSlot) = y;
} else {
getLeftStickX(virtualSlot) = x;
getLeftStickY(virtualSlot) = y;
}
} }
void WiiUController::CreateDefaultBinding(int32_t virtualSlot) { void WiiUController::CreateDefaultBinding(int32_t virtualSlot) {

View File

@ -279,6 +279,14 @@ namespace Ship {
x *= scale; x *= scale;
y *= scale; y *= scale;
} }
if (isRightStick) {
getRightStickX(virtualSlot) = x;
getRightStickY(virtualSlot) = y;
} else {
getLeftStickX(virtualSlot) = x;
getLeftStickY(virtualSlot) = y;
}
} }
void WiiUGamepad::CreateDefaultBinding(int32_t virtualSlot) { void WiiUGamepad::CreateDefaultBinding(int32_t virtualSlot) {

View File

@ -220,6 +220,7 @@ set(Header_Files__soh__Enhancements__randomizer__3drando
"soh/Enhancements/randomizer/3drando/trial.hpp" "soh/Enhancements/randomizer/3drando/trial.hpp"
"soh/Enhancements/randomizer/3drando/utils.hpp" "soh/Enhancements/randomizer/3drando/utils.hpp"
) )
source_group("Header Files\\soh\\Enhancements\\randomizer\\3drando" FILES ${Header_Files__soh__Enhancements__randomizer__3drando}) source_group("Header Files\\soh\\Enhancements\\randomizer\\3drando" FILES ${Header_Files__soh__Enhancements__randomizer__3drando})
set(Header_Files__soh__Enhancements__custom_message set(Header_Files__soh__Enhancements__custom_message
@ -229,6 +230,13 @@ set(Header_Files__soh__Enhancements__custom_message
source_group("Header Files\\soh\\Enhancements\\custom-message" FILES ${Header_Files__soh__Enhancements__custom_message}) source_group("Header Files\\soh\\Enhancements\\custom-message" FILES ${Header_Files__soh__Enhancements__custom_message})
set(Header_Files__soh__Enhancements__item_tables
"soh/Enhancements/item-tables/ItemTableManager.h"
"soh/Enhancements/item-tables/ItemTableTypes.h"
)
source_group("Header Files\\soh\\Enhancements\\item-tables" FILES ${Header_Files__soh__Enhancements__item_tables})
set(Source_Files__soh set(Source_Files__soh
"soh/GbiWrap.cpp" "soh/GbiWrap.cpp"
"soh/OTRAudio.h" "soh/OTRAudio.h"
@ -353,6 +361,12 @@ set(Source_Files__soh__Enhancements__custom_message
source_group("Source Files\\soh\\Enhancements\\custom-message" FILES ${Source_Files__soh__Enhancements__custom_message}) source_group("Source Files\\soh\\Enhancements\\custom-message" FILES ${Source_Files__soh__Enhancements__custom_message})
set(Source_Files__soh__Enhancements__item_tables
"soh/Enhancements/item-tables/ItemTableManager.cpp"
)
source_group("Source Files\\soh\\Enhancements\\item-tables" FILES ${Source_Files__soh__Enhancements__item_tables})
set(Source_Files__src__boot set(Source_Files__src__boot
"src/boot/assert.c" "src/boot/assert.c"
"src/boot/boot_main.c" "src/boot/boot_main.c"
@ -1562,6 +1576,7 @@ set(ALL_FILES
${Header_Files__soh__Enhancements__debugger} ${Header_Files__soh__Enhancements__debugger}
${Header_Files__soh__Enhancements__randomizer} ${Header_Files__soh__Enhancements__randomizer}
${Header_Files__soh__Enhancements__randomizer__3drando} ${Header_Files__soh__Enhancements__randomizer__3drando}
${Header_Files__soh__Enhancements__item_tables}
${Header_Files__soh__Enhancements__custom_message} ${Header_Files__soh__Enhancements__custom_message}
${Source_Files__soh} ${Source_Files__soh}
${Source_Files__soh__Enhancements} ${Source_Files__soh__Enhancements}
@ -1572,6 +1587,7 @@ set(ALL_FILES
${Source_Files__soh__Enhancements__randomizer__3drando} ${Source_Files__soh__Enhancements__randomizer__3drando}
${Source_Files__soh__Enhancements__randomizer__3drando__hint_list} ${Source_Files__soh__Enhancements__randomizer__3drando__hint_list}
${Source_Files__soh__Enhancements__randomizer__3drando__location_access} ${Source_Files__soh__Enhancements__randomizer__3drando__location_access}
${Source_Files__soh__Enhancements__item_tables}
${Source_Files__soh__Enhancements__custom_message} ${Source_Files__soh__Enhancements__custom_message}
${Source_Files__src__boot} ${Source_Files__src__boot}
${Source_Files__src__buffers} ${Source_Files__src__buffers}

View File

@ -10,6 +10,7 @@ extern "C"
#endif #endif
#include "../../libultraship/libultraship/luslog.h" #include "../../libultraship/libultraship/luslog.h"
#include <soh/Enhancements/item-tables/ItemTableTypes.h>
#if defined(INCLUDE_GAME_PRINTF) && !defined(NDEBUG) #if defined(INCLUDE_GAME_PRINTF) && !defined(NDEBUG)
#define osSyncPrintf(fmt, ...) lusprintf(__FILE__, __LINE__, 0, fmt, __VA_ARGS__) #define osSyncPrintf(fmt, ...) lusprintf(__FILE__, __LINE__, 0, fmt, __VA_ARGS__)
@ -453,7 +454,10 @@ u32 Actor_TextboxIsClosing(Actor* actor, GlobalContext* globalCtx);
s8 func_8002F368(GlobalContext* globalCtx); s8 func_8002F368(GlobalContext* globalCtx);
void Actor_GetScreenPos(GlobalContext* globalCtx, Actor* actor, s16* x, s16* y); void Actor_GetScreenPos(GlobalContext* globalCtx, Actor* actor, s16* x, s16* y);
u32 Actor_HasParent(Actor* actor, GlobalContext* globalCtx); u32 Actor_HasParent(Actor* actor, GlobalContext* globalCtx);
s32 GiveItemWithoutActor(GlobalContext* globalCtx, s32 getItemId); // TODO: Rename the follwing 3 functions using whatever scheme we use when we rename func_8002F434 and func_8002F554.
s32 GiveItemEntryWithoutActor(GlobalContext* globalCtx, GetItemEntry getItemEntry);
s32 GiveItemEntryFromActor(Actor* actor, GlobalContext* globalCtx, GetItemEntry getItemEntry, f32 xzRange, f32 yRange);
void GiveItemEntryFromActorWithFixedRange(Actor* actor, GlobalContext* globalCtx, GetItemEntry getItemEntry);
s32 func_8002F434(Actor* actor, GlobalContext* globalCtx, s32 getItemId, f32 xzRange, f32 yRange); s32 func_8002F434(Actor* actor, GlobalContext* globalCtx, s32 getItemId, f32 xzRange, f32 yRange);
void func_8002F554(Actor* actor, GlobalContext* globalCtx, s32 getItemId); void func_8002F554(Actor* actor, GlobalContext* globalCtx, s32 getItemId);
void func_8002F580(Actor* actor, GlobalContext* globalCtx); void func_8002F580(Actor* actor, GlobalContext* globalCtx);
@ -1050,6 +1054,7 @@ void Interface_LoadItemIcon1(GlobalContext* globalCtx, u16 button);
void Interface_LoadItemIcon2(GlobalContext* globalCtx, u16 button); void Interface_LoadItemIcon2(GlobalContext* globalCtx, u16 button);
void func_80084BF4(GlobalContext* globalCtx, u16 flag); void func_80084BF4(GlobalContext* globalCtx, u16 flag);
u8 Item_Give(GlobalContext* globalCtx, u8 item); u8 Item_Give(GlobalContext* globalCtx, u8 item);
u16 Randomizer_Item_Give(GlobalContext* globalCtx, GetItemEntry giEntry);
u8 Item_CheckObtainability(u8 item); u8 Item_CheckObtainability(u8 item);
void Inventory_DeleteItem(u16 item, u16 invSlot); void Inventory_DeleteItem(u16 item, u16 invSlot);
s32 Inventory_ReplaceItem(GlobalContext* globalCtx, u16 oldItem, u16 newItem); s32 Inventory_ReplaceItem(GlobalContext* globalCtx, u16 oldItem, u16 newItem);

View File

@ -244,50 +244,6 @@ typedef enum {
/* 0x99 */ ITEM_STICK_UPGRADE_30, /* 0x99 */ ITEM_STICK_UPGRADE_30,
/* 0x9A */ ITEM_NUT_UPGRADE_30, /* 0x9A */ ITEM_NUT_UPGRADE_30,
/* 0x9B */ ITEM_NUT_UPGRADE_40, /* 0x9B */ ITEM_NUT_UPGRADE_40,
/* 0x9C */ ITEM_BOTTLE_WITH_RED_POTION,
/* 0x9D */ ITEM_BOTTLE_WITH_GREEN_POTION,
/* 0x9E */ ITEM_BOTTLE_WITH_BLUE_POTION,
/* 0x9F */ ITEM_BOTTLE_WITH_FAIRY,
/* 0xA0 */ ITEM_BOTTLE_WITH_FISH,
/* 0xA1 */ ITEM_BOTTLE_WITH_BLUE_FIRE,
/* 0xA2 */ ITEM_BOTTLE_WITH_BUGS,
/* 0xA3 */ ITEM_BOTTLE_WITH_POE,
/* 0xA4 */ ITEM_BOTTLE_WITH_BIG_POE,
/* 0xA5 */ ITEM_GERUDO_FORTRESS_SMALL_KEY,
/* 0xA6 */ ITEM_FOREST_TEMPLE_SMALL_KEY,
/* 0xA7 */ ITEM_FIRE_TEMPLE_SMALL_KEY,
/* 0xA8 */ ITEM_WATER_TEMPLE_SMALL_KEY,
/* 0xA9 */ ITEM_SPIRIT_TEMPLE_SMALL_KEY,
/* 0xAA */ ITEM_SHADOW_TEMPLE_SMALL_KEY,
/* 0xAB */ ITEM_BOTTOM_OF_THE_WELL_SMALL_KEY,
/* 0xAC */ ITEM_GERUDO_TRAINING_GROUNDS_SMALL_KEY,
/* 0xAD */ ITEM_GANONS_CASTLE_SMALL_KEY,
/* 0xAE */ ITEM_FOREST_TEMPLE_BOSS_KEY,
/* 0xAF */ ITEM_FIRE_TEMPLE_BOSS_KEY,
/* 0xB0 */ ITEM_WATER_TEMPLE_BOSS_KEY,
/* 0xB1 */ ITEM_SPIRIT_TEMPLE_BOSS_KEY,
/* 0xB2 */ ITEM_SHADOW_TEMPLE_BOSS_KEY,
/* 0xB3 */ ITEM_GANONS_CASTLE_BOSS_KEY,
/* 0xB4 */ ITEM_DEKU_TREE_MAP,
/* 0xB5 */ ITEM_DODONGOS_CAVERN_MAP,
/* 0xB6 */ ITEM_JABU_JABUS_BELLY_MAP,
/* 0xB7 */ ITEM_FOREST_TEMPLE_MAP,
/* 0xB8 */ ITEM_FIRE_TEMPLE_MAP,
/* 0xB9 */ ITEM_WATER_TEMPLE_MAP,
/* 0xBA */ ITEM_SPIRIT_TEMPLE_MAP,
/* 0xBB */ ITEM_SHADOW_TEMPLE_MAP,
/* 0xBC */ ITEM_BOTTOM_OF_THE_WELL_MAP,
/* 0xBD */ ITEM_ICE_CAVERN_MAP,
/* 0xBE */ ITEM_DEKU_TREE_COMPASS,
/* 0xBF */ ITEM_DODONGOS_CAVERN_COMPASS,
/* 0xC0 */ ITEM_JABU_JABUS_BELLY_COMPASS,
/* 0xC1 */ ITEM_FOREST_TEMPLE_COMPASS,
/* 0xC2 */ ITEM_FIRE_TEMPLE_COMPASS,
/* 0xC3 */ ITEM_WATER_TEMPLE_COMPASS,
/* 0xC4 */ ITEM_SPIRIT_TEMPLE_COMPASS,
/* 0xC5 */ ITEM_SHADOW_TEMPLE_COMPASS,
/* 0xC6 */ ITEM_BOTTOM_OF_THE_WELL_COMPASS,
/* 0xC7 */ ITEM_ICE_CAVERN_COMPASS,
/* 0xFC */ ITEM_LAST_USED = 0xFC, /* 0xFC */ ITEM_LAST_USED = 0xFC,
/* 0xFE */ ITEM_NONE_FE = 0xFE, /* 0xFE */ ITEM_NONE_FE = 0xFE,
/* 0xFF */ ITEM_NONE = 0xFF /* 0xFF */ ITEM_NONE = 0xFF
@ -423,87 +379,8 @@ typedef enum {
/* 0x7A */ GI_NUT_UPGRADE_40, /* 0x7A */ GI_NUT_UPGRADE_40,
/* 0x7B */ GI_BULLET_BAG_50, /* 0x7B */ GI_BULLET_BAG_50,
/* 0x7C */ GI_ICE_TRAP, // freezes link when opened from a chest /* 0x7C */ GI_ICE_TRAP, // freezes link when opened from a chest
/* 0x7D */ GI_TEXT_0, // no model appears over Link, shows text id 0 (pocket egg) /* 0x7D */ GI_TEXT_0, // no model appears over Link, shows text id 0 (pocket egg)
/* 0x84 */ GI_MAX
/* 0x7E */ GI_MEDALLION_LIGHT,
/* 0x7F */ GI_MEDALLION_FOREST,
/* 0x80 */ GI_MEDALLION_FIRE,
/* 0x81 */ GI_MEDALLION_WATER,
/* 0x82 */ GI_MEDALLION_SHADOW,
/* 0x83 */ GI_MEDALLION_SPIRIT,
/* 0x84 */ GI_STONE_KOKIRI,
/* 0x85 */ GI_STONE_GORON,
/* 0x86 */ GI_STONE_ZORA,
/* 0x87 */ GI_ZELDAS_LULLABY,
/* 0x88 */ GI_SUNS_SONG,
/* 0x89 */ GI_EPONAS_SONG,
/* 0x8A */ GI_SONG_OF_STORMS,
/* 0x8B */ GI_SONG_OF_TIME,
/* 0x8C */ GI_SARIAS_SONG,
/* 0x8D */ GI_MINUET_OF_FOREST,
/* 0x8E */ GI_BOLERO_OF_FIRE,
/* 0x8F */ GI_SERENADE_OF_WATER,
/* 0x90 */ GI_NOCTURNE_OF_SHADOW,
/* 0x91 */ GI_REQUIEM_OF_SPIRIT,
/* 0x92 */ GI_PRELUDE_OF_LIGHT,
/* 0x93 */ GI_SINGLE_MAGIC,
/* 0x94 */ GI_DOUBLE_MAGIC,
/* 0x95 */ GI_DOUBLE_DEFENSE,
/* 0x96 */ GI_BOTTLE_WITH_RED_POTION,
/* 0x97 */ GI_BOTTLE_WITH_GREEN_POTION,
/* 0x98 */ GI_BOTTLE_WITH_BLUE_POTION,
/* 0x99 */ GI_BOTTLE_WITH_FAIRY,
/* 0x9A */ GI_BOTTLE_WITH_FISH,
/* 0x9B */ GI_BOTTLE_WITH_BLUE_FIRE,
/* 0x9C */ GI_BOTTLE_WITH_BUGS,
/* 0x9D */ GI_BOTTLE_WITH_POE,
/* 0x9E */ GI_BOTTLE_WITH_BIG_POE,
/* 0x9F */ GI_GERUDO_FORTRESS_SMALL_KEY,
/* 0xA0 */ GI_FOREST_TEMPLE_SMALL_KEY,
/* 0xA1 */ GI_FIRE_TEMPLE_SMALL_KEY,
/* 0xA2 */ GI_WATER_TEMPLE_SMALL_KEY,
/* 0xA3 */ GI_SPIRIT_TEMPLE_SMALL_KEY,
/* 0xA4 */ GI_SHADOW_TEMPLE_SMALL_KEY,
/* 0xA5 */ GI_BOTTOM_OF_THE_WELL_SMALL_KEY,
/* 0xA6 */ GI_GERUDO_TRAINING_GROUNDS_SMALL_KEY,
/* 0xA7 */ GI_GANONS_CASTLE_SMALL_KEY,
/* 0xA8 */ GI_FOREST_TEMPLE_BOSS_KEY,
/* 0xA9 */ GI_FIRE_TEMPLE_BOSS_KEY,
/* 0xAA */ GI_WATER_TEMPLE_BOSS_KEY,
/* 0xAB */ GI_SPIRIT_TEMPLE_BOSS_KEY,
/* 0xAC */ GI_SHADOW_TEMPLE_BOSS_KEY,
/* 0xAD */ GI_GANONS_CASTLE_BOSS_KEY,
/* 0xAE */ GI_DEKU_TREE_MAP,
/* 0xAF */ GI_DODONGOS_CAVERN_MAP,
/* 0xB0 */ GI_JABU_JABUS_BELLY_MAP,
/* 0xB1 */ GI_FOREST_TEMPLE_MAP,
/* 0xB2 */ GI_FIRE_TEMPLE_MAP,
/* 0xB3 */ GI_WATER_TEMPLE_MAP,
/* 0xB4 */ GI_SPIRIT_TEMPLE_MAP,
/* 0xB5 */ GI_SHADOW_TEMPLE_MAP,
/* 0xB6 */ GI_BOTTOM_OF_THE_WELL_MAP,
/* 0xB7 */ GI_ICE_CAVERN_MAP,
/* 0xB8 */ GI_DEKU_TREE_COMPASS,
/* 0xB9 */ GI_DODONGOS_CAVERN_COMPASS,
/* 0xBA */ GI_JABU_JABUS_BELLY_COMPASS,
/* 0xBB */ GI_FOREST_TEMPLE_COMPASS,
/* 0xBC */ GI_FIRE_TEMPLE_COMPASS,
/* 0xBD */ GI_WATER_TEMPLE_COMPASS,
/* 0xBE */ GI_SPIRIT_TEMPLE_COMPASS,
/* 0xBF */ GI_SHADOW_TEMPLE_COMPASS,
/* 0xC0 */ GI_BOTTOM_OF_THE_WELL_COMPASS,
/* 0xC1 */ GI_ICE_CAVERN_COMPASS,
/* 0xAE */ GI_MAX
} GetItemID; } GetItemID;
typedef enum { typedef enum {

View File

@ -2,17 +2,10 @@
#define Z64PLAYER_H #define Z64PLAYER_H
#include "z64actor.h" #include "z64actor.h"
#include "soh/Enhancements/item-tables/ItemTableTypes.h"
struct Player; struct Player;
typedef struct {
/* 0x00 */ u8 itemId;
/* 0x01 */ u8 field; // various bit-packed data
/* 0x02 */ s8 gi; // defines the draw id and chest opening animation
/* 0x03 */ u8 textId;
/* 0x04 */ u16 objectId;
} GetItemEntry; // size = 0x06
extern GetItemEntry sGetItemTable[195]; extern GetItemEntry sGetItemTable[195];
typedef enum { typedef enum {
@ -374,6 +367,7 @@ typedef enum {
FLAG_SCENE_TREASURE, FLAG_SCENE_TREASURE,
FLAG_SCENE_CLEAR, FLAG_SCENE_CLEAR,
FLAG_SCENE_COLLECTIBLE, FLAG_SCENE_COLLECTIBLE,
FLAG_EVENT_CHECK_INF,
FLAG_COW_MILKED FLAG_COW_MILKED
} FlagType; } FlagType;
@ -639,6 +633,7 @@ typedef struct Player {
/* 0x0A89 */ bool pendingIceTrap; /* 0x0A89 */ bool pendingIceTrap;
/* 0x0A95 */ PendingFlag pendingFlag; /* 0x0A95 */ PendingFlag pendingFlag;
/* 0x0AA1 */ u8 boomerangQuickRecall; // Has the player pressed the boomerang button while it's in the air still? /* 0x0AA1 */ u8 boomerangQuickRecall; // Has the player pressed the boomerang button while it's in the air still?
} Player; // size = 0xAA2 /* 0x0AA2 */ GetItemEntry getItemEntry;
} Player; // size = 0xAAA
#endif #endif

View File

@ -1,8 +1,69 @@
#!/bin/sh #!/bin/bash
BUNDLE="`echo "$0" | sed -e 's/\/Contents\/MacOS\/.*//'`"
RESOURCES="$BUNDLE/Contents/Resources"
export DYLD_FRAMEWORK_PATH=$RESOURCES/Frameworks SNAME="$(dirname $0)"
export DYLD_LIBRARY_PATH=$RESOURCES/bin export DATA_SHARE="$HOME/Library/Application Support/com.shipofharkinian.soh"
export SNAME
export RESPATH="${SNAME%/MacOS*}/Resources"
export LIBPATH="${SNAME%/MacOS*}/Frameworks"
export DYLD_FALLBACK_LIBRARY_PATH="$LIBPATH"
exec "$RESOURCES/soh-macos" while [ ! -e "$DATA_SHARE/oot.otr" ]; do
ASSETDIR="$(mktemp -d /tmp/assets-XXXXX)"
export ASSETDIR
cp -r "$RESPATH/assets" "$ASSETDIR"
mkdir -p "$ASSETDIR"/tmp
mkdir -p "$ASSETDIR"/Extract/assets
DROPROM="$(osascript -ss - "$ASSETDIR" <<-EOF
set romFile to choose file of type {"b64","n64","v64","z64"} with prompt "Please select your ROM:"
set destinationFolder to POSIX file "$ASSETDIR"
tell application "Finder"
duplicate romFile to destinationFolder
end tell
EOF
)"
"$DROPROM"
for rom in "$ASSETDIR"/*.*64
do
if [ ! -e "$rom" ]; then
echo "no ROM"
osascript -e 'display dialog "Select ROM to generate OTR" giving up after 5'
rm -r "$ASSETDIR"
exit
fi
done
cp "$ASSETDIR"/*.*64 "$ASSETDIR"/tmp/rom.z64
cp -r "$ASSETDIR"/assets/game/ship_of_harkinian "$ASSETDIR"/Extract/assets/
cd "$ASSETDIR" || return
ROMHASH="$(shasum "$ASSETDIR"/tmp/rom.z64 | awk '{ print $1 }')"
case "$ROMHASH" in
cee6bc3c2a634b41728f2af8da54d9bf8cc14099)
export ROM=GC_NMQ_D;;
0227d7c0074f2d0ac935631990da8ec5914597b4)
export ROM=GC_NMQ_PAL_F;;
*)
WRONGHASH="$(osascript -ss - "$ROMHASH" <<-EOF
display dialog "Incompatible ROM hash $ROMHASH" \
with title "Incompatible ROM hash" \
with icon caution \
giving up after 5
EOF
)"
"$WRONGHASH"
rm -r "$ASSETDIR"
exit;;
esac
echo "$ROM"
osascript -e 'display notification "Processing OTR..." with title "SOH: Generating OTR"'
assets/extractor/ZAPD.out ed -i assets/extractor/xmls/"${ROM}" -b tmp/rom.z64 -fl assets/extractor/filelists -o placeholder -osf placeholder -gsf 1 -rconf assets/extractor/Config_"${ROM}".xml -se OTR
if [ -e "$PWD"/oot.otr ]; then
osascript -e 'display notification "OTR Successfully Generated" with title "SOH: Generating OTR"'
if [ ! -e "$DATA_SHARE" ]; then mkdir "$DATA_SHARE"; fi
cp "$ASSETDIR"/oot.otr "$DATA_SHARE"
rm -r "$ASSETDIR"
fi
break
done
"$RESPATH"/soh-macos
exit

View File

@ -25,6 +25,9 @@ void BootCommands_Init()
CVar_RegisterS32("gDebugEnabled", 0); CVar_RegisterS32("gDebugEnabled", 0);
CVar_RegisterS32("gLanguages", 0); //0 = English / 1 = German / 2 = French CVar_RegisterS32("gLanguages", 0); //0 = English / 1 = German / 2 = French
CVar_RegisterS32("gHudColors", 1); //0 = N64 / 1 = NGC / 2 = Custom CVar_RegisterS32("gHudColors", 1); //0 = N64 / 1 = NGC / 2 = Custom
#if defined(__SWITCH__) || defined(__WIIU__)
CVar_RegisterS32("gControlNav", 1); // always enable controller nav on switch/wii u
#endif
} }
//void BootCommands_ParseBootArgs(char* str) //void BootCommands_ParseBootArgs(char* str)

View File

@ -1,5 +1,6 @@
#include "CustomMessageManager.h" #include "CustomMessageManager.h"
#include <algorithm> #include <algorithm>
#include <stdint.h>
using namespace std::literals::string_literals; using namespace std::literals::string_literals;
@ -80,9 +81,8 @@ bool CustomMessageManager::InsertCustomMessage(std::string tableID, uint16_t tex
return messageInsertResult.second; return messageInsertResult.second;
} }
bool CustomMessageManager::CreateGetItemMessage(std::string tableID, uint16_t giid, ItemID iid,
CustomMessageEntry messageEntry) {
bool CustomMessageManager::CreateGetItemMessage(std::string tableID, GetItemID giid, ItemID iid, CustomMessageEntry messageEntry) {
FormatCustomMessage(messageEntry.english, iid); FormatCustomMessage(messageEntry.english, iid);
FormatCustomMessage(messageEntry.german, iid); FormatCustomMessage(messageEntry.german, iid);
FormatCustomMessage(messageEntry.french, iid); FormatCustomMessage(messageEntry.french, iid);

View File

@ -89,7 +89,7 @@ class CustomMessageManager {
with the provided giid (getItemID) as its key. This function also inserts the icon corresponding to with the provided giid (getItemID) as its key. This function also inserts the icon corresponding to
the provided iid (itemID) at the beginning of each page of the textbox. the provided iid (itemID) at the beginning of each page of the textbox.
*/ */
bool CreateGetItemMessage(std::string tableID, GetItemID giid, ItemID iid, CustomMessageEntry messages); bool CreateGetItemMessage(std::string tableID, uint16_t giid, ItemID iid, CustomMessageEntry messages);
/* /*
Formats the provided Custom Message Entry and inserts it into the table with the provided tableID, Formats the provided Custom Message Entry and inserts it into the table with the provided tableID,

View File

@ -17,7 +17,7 @@ typedef enum {
#ifdef __cplusplus #ifdef __cplusplus
typedef struct { typedef struct {
GetItemID giid; u16 giid;
ItemID iid; ItemID iid;
std::string english; std::string english;
std::string german; std::string german;

View File

@ -0,0 +1,42 @@
#include "ItemTableManager.h"
#include <stdexcept>
ItemTableManager::ItemTableManager() {
}
ItemTableManager::~ItemTableManager() {
this->itemTables.clear();
}
bool ItemTableManager::AddItemTable(uint16_t tableID) {
ItemTable newItemTable;
return itemTables.emplace(tableID, newItemTable).second;
}
bool ItemTableManager::AddItemEntry(uint16_t tableID, uint16_t getItemID, GetItemEntry getItemEntry) {
try {
ItemTable* itemTable = RetrieveItemTable(tableID);
return itemTable->emplace(getItemID, getItemEntry).second;
} catch (const std::out_of_range& oor) { return false; }
}
GetItemEntry ItemTableManager::RetrieveItemEntry(uint16_t tableID, uint16_t itemID) {
try {
ItemTable* itemTable = RetrieveItemTable(tableID);
return itemTable->at(itemID);
} catch (std::out_of_range& oor) { return GET_ITEM_NONE; }
}
bool ItemTableManager::ClearItemTable(uint16_t tableID) {
try {
ItemTable* itemTable = RetrieveItemTable(tableID);
itemTable->clear();
return true;
} catch (const std::out_of_range& oor) { return false; }
}
ItemTable* ItemTableManager::RetrieveItemTable(uint16_t tableID) {
try {
return &itemTables.at(tableID);
} catch (const std::out_of_range& oor) { throw(oor); }
}

View File

@ -0,0 +1,23 @@
#pragma once
#include "ItemTableTypes.h"
#include "z64item.h"
#include <unordered_map>
typedef std::unordered_map<uint16_t, GetItemEntry> ItemTable;
class ItemTableManager {
public:
static ItemTableManager* Instance;
ItemTableManager();
~ItemTableManager();
bool AddItemTable(uint16_t tableID);
bool AddItemEntry(uint16_t tableID, uint16_t getItemID, GetItemEntry getItemEntry);
GetItemEntry RetrieveItemEntry(uint16_t tableID, uint16_t itemID);
bool ClearItemTable(uint16_t tableID);
private:
std::unordered_map<uint16_t, ItemTable> itemTables;
ItemTable* RetrieveItemTable(uint16_t tableID);
};

View File

@ -0,0 +1,25 @@
#pragma once
#ifdef __cplusplus
#include <stdint.h>
#endif
#define CHEST_ANIM_SHORT 0
#define CHEST_ANIM_LONG 1
#define GET_ITEM(itemId, objectId, drawId, textId, field, chestAnim, modIndex, getItemId) \
{ itemId, field, (chestAnim != CHEST_ANIM_SHORT ? 1 : -1) * (drawId + 1), textId, objectId, modIndex, getItemId, drawId, true }
#define GET_ITEM_NONE \
{ ITEM_NONE, 0, 0, 0, 0, 0, 0, 0, false }
typedef struct {
/* 0x00 */ uint16_t itemId;
/* 0x01 */ uint16_t field; // various bit-packed data
/* 0x02 */ int16_t gi; // defines the draw id and chest opening animation
/* 0x03 */ uint16_t textId;
/* 0x04 */ uint16_t objectId;
/* 0x06 */ uint16_t modIndex; // 0 = Vanilla, 1 = Randomizer, future mods will increment up?
/* 0x08 */ int16_t getItemId;
/* 0x0A */ uint16_t gid; // Stores the GID value unmodified for future reference.
/* 0x0C */ uint16_t collectable; // determines whether the item can be collected on the overworld. Will be true in most cases.
} GetItemEntry; // size = 0x0F

File diff suppressed because it is too large Load Diff

View File

@ -16,11 +16,13 @@ class Randomizer {
std::string ganonHintText; std::string ganonHintText;
std::string ganonText; std::string ganonText;
std::unordered_map<RandomizerSettingKey, u8> randoSettings; std::unordered_map<RandomizerSettingKey, u8> randoSettings;
GetItemID GetItemFromGet(RandomizerGet randoGet, GetItemID ogItemId); s16 GetItemFromGet(RandomizerGet randoGet, GetItemID ogItemId);
GetItemID GetItemFromActor(s16 actorId, s16 actorParams, s16 sceneNum, GetItemID ogItemId); s16 GetItemFromActor(s16 actorId, s16 actorParams, s16 sceneNum, GetItemID ogItemId);
void ParseRandomizerSettingsFile(const char* spoilerFileName); void ParseRandomizerSettingsFile(const char* spoilerFileName);
void ParseHintLocationsFile(const char* spoilerFileName); void ParseHintLocationsFile(const char* spoilerFileName);
void ParseItemLocationsFile(const char* spoilerFileName, bool silent); void ParseItemLocationsFile(const char* spoilerFileName, bool silent);
bool IsItemVanilla(RandomizerGet randoGet);
public: public:
Randomizer(); Randomizer();
@ -38,14 +40,15 @@ class Randomizer {
void LoadHintLocations(const char* spoilerFileName); void LoadHintLocations(const char* spoilerFileName);
void LoadItemLocations(const char* spoilerFileName, bool silent); void LoadItemLocations(const char* spoilerFileName, bool silent);
u8 GetRandoSettingValue(RandomizerSettingKey randoSettingKey); u8 GetRandoSettingValue(RandomizerSettingKey randoSettingKey);
RandomizerCheck GetCheckFromActor(s16 actorId, s16 actorParams, s16 sceneNum); RandomizerCheck GetCheckFromActor(s16 sceneNum, s16 actorId, s16 actorParams);
std::string GetChildAltarText() const; std::string GetChildAltarText() const;
std::string GetAdultAltarText() const; std::string GetAdultAltarText() const;
std::string GetGanonText() const; std::string GetGanonText() const;
std::string GetGanonHintText() const; std::string GetGanonHintText() const;
GetItemID GetRandomizedItemIdFromKnownCheck(RandomizerCheck randomizerCheck, GetItemID ogId); s16 GetRandomizedItemIdFromKnownCheck(RandomizerCheck randomizerCheck, GetItemID ogId);
GetItemID GetRandomizedItemId(GetItemID ogId, s16 actorId, s16 actorParams, s16 sceneNum); s16 GetRandomizedItemId(GetItemID ogId, s16 actorId, s16 actorParams, s16 sceneNum);
static void CreateCustomMessages(); static void CreateCustomMessages();
bool CheckContainsVanillaItem(RandomizerCheck randoCheck);
}; };
#ifdef __cplusplus #ifdef __cplusplus

View File

@ -2,6 +2,11 @@
#include <stdint.h> #include <stdint.h>
// This should probably go in a less rando-specific location
// but the best location will probably be in the modding engine
// which doesn't exist yet.
typedef enum { MOD_NONE, MOD_RANDOMIZER } ModIndex;
typedef struct { typedef struct {
char tex[512]; char tex[512];
uint16_t width; uint16_t width;
@ -810,6 +815,8 @@ typedef enum {
RG_PROGRESSIVE_STICK_UPGRADE, RG_PROGRESSIVE_STICK_UPGRADE,
RG_PROGRESSIVE_BOMBCHUS, RG_PROGRESSIVE_BOMBCHUS,
RG_PROGRESSIVE_MAGIC_METER, RG_PROGRESSIVE_MAGIC_METER,
RG_MAGIC_SINGLE, // Added for refactor of GetItemEntries
RG_MAGIC_DOUBLE, // Added for refactor of GetItemEntries
RG_PROGRESSIVE_OCARINA, RG_PROGRESSIVE_OCARINA,
RG_PROGRESSIVE_GORONSWORD, RG_PROGRESSIVE_GORONSWORD,
RG_EMPTY_BOTTLE, RG_EMPTY_BOTTLE,
@ -951,7 +958,8 @@ typedef enum {
RG_BUY_RED_POTION_40, RG_BUY_RED_POTION_40,
RG_BUY_RED_POTION_50, RG_BUY_RED_POTION_50,
RG_TRIFORCE, RG_TRIFORCE,
RG_HINT RG_HINT,
RG_MAX
} RandomizerGet; } RandomizerGet;
typedef enum { typedef enum {

View File

@ -57,10 +57,12 @@
#include <Audio.h> #include <Audio.h>
#include <soh/Enhancements/custom-message/CustomMessageTypes.h> #include <soh/Enhancements/custom-message/CustomMessageTypes.h>
#include <functions.h> #include <functions.h>
#include <soh/Enhancements/item-tables/ItemTableManager.h>
OTRGlobals* OTRGlobals::Instance; OTRGlobals* OTRGlobals::Instance;
SaveManager* SaveManager::Instance; SaveManager* SaveManager::Instance;
CustomMessageManager* CustomMessageManager::Instance; CustomMessageManager* CustomMessageManager::Instance;
ItemTableManager* ItemTableManager::Instance;
OTRGlobals::OTRGlobals() { OTRGlobals::OTRGlobals() {
context = Ship::GlobalCtx2::CreateInstance("Ship of Harkinian"); context = Ship::GlobalCtx2::CreateInstance("Ship of Harkinian");
@ -158,6 +160,145 @@ extern "C" void OTRAudio_Exit() {
audio.thread.join(); audio.thread.join();
} }
extern "C" void VanillaItemTable_Init() {
GetItemEntry getItemTable[] = {
GET_ITEM(ITEM_BOMBS_5, OBJECT_GI_BOMB_1, GID_BOMB, 0x32, 0x59, CHEST_ANIM_SHORT, MOD_NONE, GI_BOMBS_5),
GET_ITEM(ITEM_NUTS_5, OBJECT_GI_NUTS, GID_NUTS, 0x34, 0x0C, CHEST_ANIM_SHORT, MOD_NONE, GI_NUTS_5),
GET_ITEM(ITEM_BOMBCHU, OBJECT_GI_BOMB_2, GID_BOMBCHU, 0x33, 0x80, CHEST_ANIM_SHORT, MOD_NONE, GI_BOMBCHUS_10),
GET_ITEM(ITEM_BOW, OBJECT_GI_BOW, GID_BOW, 0x31, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_BOW),
GET_ITEM(ITEM_SLINGSHOT, OBJECT_GI_PACHINKO, GID_SLINGSHOT, 0x30, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_SLINGSHOT),
GET_ITEM(ITEM_BOOMERANG, OBJECT_GI_BOOMERANG, GID_BOOMERANG, 0x35, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_BOOMERANG),
GET_ITEM(ITEM_STICK, OBJECT_GI_STICK, GID_STICK, 0x37, 0x0D, CHEST_ANIM_SHORT, MOD_NONE, GI_STICKS_1),
GET_ITEM(ITEM_HOOKSHOT, OBJECT_GI_HOOKSHOT, GID_HOOKSHOT, 0x36, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_HOOKSHOT),
GET_ITEM(ITEM_LONGSHOT, OBJECT_GI_HOOKSHOT, GID_LONGSHOT, 0x4F, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_LONGSHOT),
GET_ITEM(ITEM_LENS, OBJECT_GI_GLASSES, GID_LENS, 0x39, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_LENS),
GET_ITEM(ITEM_LETTER_ZELDA, OBJECT_GI_LETTER, GID_LETTER_ZELDA, 0x69, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_LETTER_ZELDA),
GET_ITEM(ITEM_OCARINA_TIME, OBJECT_GI_OCARINA, GID_OCARINA_TIME, 0x3A, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_OCARINA_OOT),
GET_ITEM(ITEM_HAMMER, OBJECT_GI_HAMMER, GID_HAMMER, 0x38, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_HAMMER),
GET_ITEM(ITEM_COJIRO, OBJECT_GI_NIWATORI, GID_COJIRO, 0x02, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_COJIRO),
GET_ITEM(ITEM_BOTTLE, OBJECT_GI_BOTTLE, GID_BOTTLE, 0x42, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_BOTTLE),
GET_ITEM(ITEM_POTION_RED, OBJECT_GI_LIQUID, GID_POTION_RED, 0x43, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_POTION_RED),
GET_ITEM(ITEM_POTION_GREEN, OBJECT_GI_LIQUID, GID_POTION_GREEN, 0x44, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_POTION_GREEN),
GET_ITEM(ITEM_POTION_BLUE, OBJECT_GI_LIQUID, GID_POTION_BLUE, 0x45, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_POTION_BLUE),
GET_ITEM(ITEM_FAIRY, OBJECT_GI_BOTTLE, GID_BOTTLE, 0x46, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_FAIRY),
GET_ITEM(ITEM_MILK_BOTTLE, OBJECT_GI_MILK, GID_MILK, 0x98, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_MILK_BOTTLE),
GET_ITEM(ITEM_LETTER_RUTO, OBJECT_GI_BOTTLE_LETTER, GID_LETTER_RUTO, 0x99, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_LETTER_RUTO),
GET_ITEM(ITEM_BEAN, OBJECT_GI_BEAN, GID_BEAN, 0x48, 0x80, CHEST_ANIM_SHORT, MOD_NONE, GI_BEAN),
GET_ITEM(ITEM_MASK_SKULL, OBJECT_GI_SKJ_MASK, GID_MASK_SKULL, 0x10, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_MASK_SKULL),
GET_ITEM(ITEM_MASK_SPOOKY, OBJECT_GI_REDEAD_MASK, GID_MASK_SPOOKY, 0x11, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_MASK_SPOOKY),
GET_ITEM(ITEM_CHICKEN, OBJECT_GI_NIWATORI, GID_CHICKEN, 0x48, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_CHICKEN),
GET_ITEM(ITEM_MASK_KEATON, OBJECT_GI_KI_TAN_MASK, GID_MASK_KEATON, 0x12, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_MASK_KEATON),
GET_ITEM(ITEM_MASK_BUNNY, OBJECT_GI_RABIT_MASK, GID_MASK_BUNNY, 0x13, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_MASK_BUNNY),
GET_ITEM(ITEM_MASK_TRUTH, OBJECT_GI_TRUTH_MASK, GID_MASK_TRUTH, 0x17, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_MASK_TRUTH),
GET_ITEM(ITEM_POCKET_EGG, OBJECT_GI_EGG, GID_EGG, 0x01, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_POCKET_EGG),
GET_ITEM(ITEM_POCKET_CUCCO, OBJECT_GI_NIWATORI, GID_CHICKEN, 0x48, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_POCKET_CUCCO),
GET_ITEM(ITEM_ODD_MUSHROOM, OBJECT_GI_MUSHROOM, GID_ODD_MUSHROOM, 0x03, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_ODD_MUSHROOM),
GET_ITEM(ITEM_ODD_POTION, OBJECT_GI_POWDER, GID_ODD_POTION, 0x04, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_ODD_POTION),
GET_ITEM(ITEM_SAW, OBJECT_GI_SAW, GID_SAW, 0x05, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_SAW),
GET_ITEM(ITEM_SWORD_BROKEN, OBJECT_GI_BROKENSWORD, GID_SWORD_BROKEN, 0x08, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_SWORD_BROKEN),
GET_ITEM(ITEM_PRESCRIPTION, OBJECT_GI_PRESCRIPTION, GID_PRESCRIPTION, 0x09, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_PRESCRIPTION),
GET_ITEM(ITEM_FROG, OBJECT_GI_FROG, GID_FROG, 0x0D, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_FROG),
GET_ITEM(ITEM_EYEDROPS, OBJECT_GI_EYE_LOTION, GID_EYEDROPS, 0x0E, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_EYEDROPS),
GET_ITEM(ITEM_CLAIM_CHECK, OBJECT_GI_TICKETSTONE, GID_CLAIM_CHECK, 0x0A, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_CLAIM_CHECK),
GET_ITEM(ITEM_SWORD_KOKIRI, OBJECT_GI_SWORD_1, GID_SWORD_KOKIRI, 0xA4, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_SWORD_KOKIRI),
GET_ITEM(ITEM_SWORD_BGS, OBJECT_GI_LONGSWORD, GID_SWORD_BGS, 0x4B, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_SWORD_KNIFE),
GET_ITEM(ITEM_SHIELD_DEKU, OBJECT_GI_SHIELD_1, GID_SHIELD_DEKU, 0x4C, 0xA0, CHEST_ANIM_SHORT, MOD_NONE, GI_SHIELD_DEKU),
GET_ITEM(ITEM_SHIELD_HYLIAN, OBJECT_GI_SHIELD_2, GID_SHIELD_HYLIAN, 0x4D, 0xA0, CHEST_ANIM_SHORT, MOD_NONE, GI_SHIELD_HYLIAN),
GET_ITEM(ITEM_SHIELD_MIRROR, OBJECT_GI_SHIELD_3, GID_SHIELD_MIRROR, 0x4E, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_SHIELD_MIRROR),
GET_ITEM(ITEM_TUNIC_GORON, OBJECT_GI_CLOTHES, GID_TUNIC_GORON, 0x50, 0xA0, CHEST_ANIM_LONG, MOD_NONE, GI_TUNIC_GORON),
GET_ITEM(ITEM_TUNIC_ZORA, OBJECT_GI_CLOTHES, GID_TUNIC_ZORA, 0x51, 0xA0, CHEST_ANIM_LONG, MOD_NONE, GI_TUNIC_ZORA),
GET_ITEM(ITEM_BOOTS_IRON, OBJECT_GI_BOOTS_2, GID_BOOTS_IRON, 0x53, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_BOOTS_IRON),
GET_ITEM(ITEM_BOOTS_HOVER, OBJECT_GI_HOVERBOOTS, GID_BOOTS_HOVER, 0x54, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_BOOTS_HOVER),
GET_ITEM(ITEM_QUIVER_40, OBJECT_GI_ARROWCASE, GID_QUIVER_40, 0x56, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_QUIVER_40),
GET_ITEM(ITEM_QUIVER_50, OBJECT_GI_ARROWCASE, GID_QUIVER_50, 0x57, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_QUIVER_50),
GET_ITEM(ITEM_BOMB_BAG_20, OBJECT_GI_BOMBPOUCH, GID_BOMB_BAG_20, 0x58, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_BOMB_BAG_20),
GET_ITEM(ITEM_BOMB_BAG_30, OBJECT_GI_BOMBPOUCH, GID_BOMB_BAG_30, 0x59, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_BOMB_BAG_30),
GET_ITEM(ITEM_BOMB_BAG_40, OBJECT_GI_BOMBPOUCH, GID_BOMB_BAG_40, 0x5A, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_BOMB_BAG_40),
GET_ITEM(ITEM_GAUNTLETS_SILVER, OBJECT_GI_GLOVES, GID_GAUNTLETS_SILVER, 0x5B, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_GAUNTLETS_SILVER),
GET_ITEM(ITEM_GAUNTLETS_GOLD, OBJECT_GI_GLOVES, GID_GAUNTLETS_GOLD, 0x5C, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_GAUNTLETS_GOLD),
GET_ITEM(ITEM_SCALE_SILVER, OBJECT_GI_SCALE, GID_SCALE_SILVER, 0xCD, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_SCALE_SILVER),
GET_ITEM(ITEM_SCALE_GOLDEN, OBJECT_GI_SCALE, GID_SCALE_GOLDEN, 0xCE, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_SCALE_GOLD),
GET_ITEM(ITEM_STONE_OF_AGONY, OBJECT_GI_MAP, GID_STONE_OF_AGONY, 0x68, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_STONE_OF_AGONY),
GET_ITEM(ITEM_GERUDO_CARD, OBJECT_GI_GERUDO, GID_GERUDO_CARD, 0x7B, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_GERUDO_CARD),
GET_ITEM(ITEM_OCARINA_FAIRY, OBJECT_GI_OCARINA_0, GID_OCARINA_FAIRY, 0x4A, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_OCARINA_FAIRY),
GET_ITEM(ITEM_SEEDS, OBJECT_GI_SEED, GID_SEEDS, 0xDC, 0x50, CHEST_ANIM_SHORT, MOD_NONE, GI_SEEDS_5),
GET_ITEM(ITEM_HEART_CONTAINER, OBJECT_GI_HEARTS, GID_HEART_CONTAINER, 0xC6, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_HEART_CONTAINER),
GET_ITEM(ITEM_HEART_PIECE_2, OBJECT_GI_HEARTS, GID_HEART_PIECE, 0xC2, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_HEART_PIECE),
GET_ITEM(ITEM_KEY_BOSS, OBJECT_GI_BOSSKEY, GID_KEY_BOSS, 0xC7, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_KEY_BOSS),
GET_ITEM(ITEM_COMPASS, OBJECT_GI_COMPASS, GID_COMPASS, 0x67, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_COMPASS),
GET_ITEM(ITEM_DUNGEON_MAP, OBJECT_GI_MAP, GID_DUNGEON_MAP, 0x66, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_MAP),
GET_ITEM(ITEM_KEY_SMALL, OBJECT_GI_KEY, GID_KEY_SMALL, 0x60, 0x80, CHEST_ANIM_SHORT, MOD_NONE, GI_KEY_SMALL),
GET_ITEM(ITEM_MAGIC_SMALL, OBJECT_GI_MAGICPOT, GID_MAGIC_SMALL, 0x52, 0x6F, CHEST_ANIM_SHORT, MOD_NONE, GI_MAGIC_SMALL),
GET_ITEM(ITEM_MAGIC_LARGE, OBJECT_GI_MAGICPOT, GID_MAGIC_LARGE, 0x52, 0x6E, CHEST_ANIM_SHORT, MOD_NONE, GI_MAGIC_LARGE),
GET_ITEM(ITEM_WALLET_ADULT, OBJECT_GI_PURSE, GID_WALLET_ADULT, 0x5E, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_WALLET_ADULT),
GET_ITEM(ITEM_WALLET_GIANT, OBJECT_GI_PURSE, GID_WALLET_GIANT, 0x5F, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_WALLET_GIANT),
GET_ITEM(ITEM_WEIRD_EGG, OBJECT_GI_EGG, GID_EGG, 0x9A, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_WEIRD_EGG),
GET_ITEM(ITEM_HEART, OBJECT_GI_HEART, GID_HEART, 0x55, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_HEART),
GET_ITEM(ITEM_ARROWS_SMALL, OBJECT_GI_ARROW, GID_ARROWS_SMALL, 0xE6, 0x48, CHEST_ANIM_SHORT, MOD_NONE, GI_ARROWS_SMALL),
GET_ITEM(ITEM_ARROWS_MEDIUM, OBJECT_GI_ARROW, GID_ARROWS_MEDIUM, 0xE6, 0x49, CHEST_ANIM_SHORT, MOD_NONE, GI_ARROWS_MEDIUM),
GET_ITEM(ITEM_ARROWS_LARGE, OBJECT_GI_ARROW, GID_ARROWS_LARGE, 0xE6, 0x4A, CHEST_ANIM_SHORT, MOD_NONE, GI_ARROWS_LARGE),
GET_ITEM(ITEM_RUPEE_GREEN, OBJECT_GI_RUPY, GID_RUPEE_GREEN, 0x6F, 0x00, CHEST_ANIM_SHORT, MOD_NONE, GI_RUPEE_GREEN),
GET_ITEM(ITEM_RUPEE_BLUE, OBJECT_GI_RUPY, GID_RUPEE_BLUE, 0xCC, 0x01, CHEST_ANIM_SHORT, MOD_NONE, GI_RUPEE_BLUE),
GET_ITEM(ITEM_RUPEE_RED, OBJECT_GI_RUPY, GID_RUPEE_RED, 0xF0, 0x02, CHEST_ANIM_SHORT, MOD_NONE, GI_RUPEE_RED),
GET_ITEM(ITEM_HEART_CONTAINER, OBJECT_GI_HEARTS, GID_HEART_CONTAINER, 0xC6, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_HEART_CONTAINER_2),
GET_ITEM(ITEM_MILK, OBJECT_GI_MILK, GID_MILK, 0x98, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_MILK),
GET_ITEM(ITEM_MASK_GORON, OBJECT_GI_GOLONMASK, GID_MASK_GORON, 0x14, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_MASK_GORON),
GET_ITEM(ITEM_MASK_ZORA, OBJECT_GI_ZORAMASK, GID_MASK_ZORA, 0x15, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_MASK_ZORA),
GET_ITEM(ITEM_MASK_GERUDO, OBJECT_GI_GERUDOMASK, GID_MASK_GERUDO, 0x16, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_MASK_GERUDO),
GET_ITEM(ITEM_BRACELET, OBJECT_GI_BRACELET, GID_BRACELET, 0x79, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_BRACELET),
GET_ITEM(ITEM_RUPEE_PURPLE, OBJECT_GI_RUPY, GID_RUPEE_PURPLE, 0xF1, 0x14, CHEST_ANIM_SHORT, MOD_NONE, GI_RUPEE_PURPLE),
GET_ITEM(ITEM_RUPEE_GOLD, OBJECT_GI_RUPY, GID_RUPEE_GOLD, 0xF2, 0x13, CHEST_ANIM_SHORT, MOD_NONE, GI_RUPEE_GOLD),
GET_ITEM(ITEM_SWORD_BGS, OBJECT_GI_LONGSWORD, GID_SWORD_BGS, 0x0C, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_SWORD_BGS),
GET_ITEM(ITEM_ARROW_FIRE, OBJECT_GI_M_ARROW, GID_ARROW_FIRE, 0x70, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_ARROW_FIRE),
GET_ITEM(ITEM_ARROW_ICE, OBJECT_GI_M_ARROW, GID_ARROW_ICE, 0x71, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_ARROW_ICE),
GET_ITEM(ITEM_ARROW_LIGHT, OBJECT_GI_M_ARROW, GID_ARROW_LIGHT, 0x72, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_ARROW_LIGHT),
GET_ITEM(ITEM_SKULL_TOKEN, OBJECT_GI_SUTARU, GID_SKULL_TOKEN, 0xB4, 0x80, CHEST_ANIM_SHORT, MOD_NONE, GI_SKULL_TOKEN),
GET_ITEM(ITEM_DINS_FIRE, OBJECT_GI_GODDESS, GID_DINS_FIRE, 0xAD, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_DINS_FIRE),
GET_ITEM(ITEM_FARORES_WIND, OBJECT_GI_GODDESS, GID_FARORES_WIND, 0xAE, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_FARORES_WIND),
GET_ITEM(ITEM_NAYRUS_LOVE, OBJECT_GI_GODDESS, GID_NAYRUS_LOVE, 0xAF, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_NAYRUS_LOVE),
GET_ITEM(ITEM_BULLET_BAG_30, OBJECT_GI_DEKUPOUCH, GID_BULLET_BAG, 0x07, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_BULLET_BAG_30),
GET_ITEM(ITEM_BULLET_BAG_40, OBJECT_GI_DEKUPOUCH, GID_BULLET_BAG, 0x07, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_BULLET_BAG_40),
GET_ITEM(ITEM_STICKS_5, OBJECT_GI_STICK, GID_STICK, 0x37, 0x0D, CHEST_ANIM_SHORT, MOD_NONE, GI_STICKS_5),
GET_ITEM(ITEM_STICKS_10, OBJECT_GI_STICK, GID_STICK, 0x37, 0x0D, CHEST_ANIM_SHORT, MOD_NONE, GI_STICKS_10),
GET_ITEM(ITEM_NUTS_5, OBJECT_GI_NUTS, GID_NUTS, 0x34, 0x0C, CHEST_ANIM_SHORT, MOD_NONE, GI_NUTS_5_2),
GET_ITEM(ITEM_NUTS_10, OBJECT_GI_NUTS, GID_NUTS, 0x34, 0x0C, CHEST_ANIM_SHORT, MOD_NONE, GI_NUTS_10),
GET_ITEM(ITEM_BOMB, OBJECT_GI_BOMB_1, GID_BOMB, 0x32, 0x59, CHEST_ANIM_SHORT, MOD_NONE, GI_BOMBS_1),
GET_ITEM(ITEM_BOMBS_10, OBJECT_GI_BOMB_1, GID_BOMB, 0x32, 0x59, CHEST_ANIM_SHORT, MOD_NONE, GI_BOMBS_10),
GET_ITEM(ITEM_BOMBS_20, OBJECT_GI_BOMB_1, GID_BOMB, 0x32, 0x59, CHEST_ANIM_SHORT, MOD_NONE, GI_BOMBS_20),
GET_ITEM(ITEM_BOMBS_30, OBJECT_GI_BOMB_1, GID_BOMB, 0x32, 0x59, CHEST_ANIM_SHORT, MOD_NONE, GI_BOMBS_30),
GET_ITEM(ITEM_SEEDS_30, OBJECT_GI_SEED, GID_SEEDS, 0xDC, 0x50, CHEST_ANIM_SHORT, MOD_NONE, GI_SEEDS_30),
GET_ITEM(ITEM_BOMBCHUS_5, OBJECT_GI_BOMB_2, GID_BOMBCHU, 0x33, 0x80, CHEST_ANIM_SHORT, MOD_NONE, GI_BOMBCHUS_5),
GET_ITEM(ITEM_BOMBCHUS_20, OBJECT_GI_BOMB_2, GID_BOMBCHU, 0x33, 0x80, CHEST_ANIM_SHORT, MOD_NONE, GI_BOMBCHUS_20),
GET_ITEM(ITEM_FISH, OBJECT_GI_FISH, GID_FISH, 0x47, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_FISH),
GET_ITEM(ITEM_BUG, OBJECT_GI_INSECT, GID_BUG, 0x7A, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_BUGS),
GET_ITEM(ITEM_BLUE_FIRE, OBJECT_GI_FIRE, GID_BLUE_FIRE, 0x5D, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_BLUE_FIRE),
GET_ITEM(ITEM_POE, OBJECT_GI_GHOST, GID_POE, 0x97, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_POE),
GET_ITEM(ITEM_BIG_POE, OBJECT_GI_GHOST, GID_BIG_POE, 0xF9, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_BIG_POE),
GET_ITEM(ITEM_KEY_SMALL, OBJECT_GI_KEY, GID_KEY_SMALL, 0xF3, 0x80, CHEST_ANIM_SHORT, MOD_NONE, GI_DOOR_KEY),
GET_ITEM(ITEM_RUPEE_GREEN, OBJECT_GI_RUPY, GID_RUPEE_GREEN, 0xF4, 0x00, CHEST_ANIM_SHORT, MOD_NONE, GI_RUPEE_GREEN_LOSE),
GET_ITEM(ITEM_RUPEE_BLUE, OBJECT_GI_RUPY, GID_RUPEE_BLUE, 0xF5, 0x01, CHEST_ANIM_SHORT, MOD_NONE, GI_RUPEE_BLUE_LOSE),
GET_ITEM(ITEM_RUPEE_RED, OBJECT_GI_RUPY, GID_RUPEE_RED, 0xF6, 0x02, CHEST_ANIM_SHORT, MOD_NONE, GI_RUPEE_RED_LOSE),
GET_ITEM(ITEM_RUPEE_PURPLE, OBJECT_GI_RUPY, GID_RUPEE_PURPLE, 0xF7, 0x14, CHEST_ANIM_SHORT, MOD_NONE, GI_RUPEE_PURPLE_LOSE),
GET_ITEM(ITEM_HEART_PIECE_2, OBJECT_GI_HEARTS, GID_HEART_PIECE, 0xFA, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_HEART_PIECE_WIN),
GET_ITEM(ITEM_STICK_UPGRADE_20, OBJECT_GI_STICK, GID_STICK, 0x90, 0x80, CHEST_ANIM_SHORT, MOD_NONE, GI_STICK_UPGRADE_20),
GET_ITEM(ITEM_STICK_UPGRADE_30, OBJECT_GI_STICK, GID_STICK, 0x91, 0x80, CHEST_ANIM_SHORT, MOD_NONE, GI_STICK_UPGRADE_30),
GET_ITEM(ITEM_NUT_UPGRADE_30, OBJECT_GI_NUTS, GID_NUTS, 0xA7, 0x80, CHEST_ANIM_SHORT, MOD_NONE, GI_NUT_UPGRADE_30),
GET_ITEM(ITEM_NUT_UPGRADE_40, OBJECT_GI_NUTS, GID_NUTS, 0xA8, 0x80, CHEST_ANIM_SHORT, MOD_NONE, GI_NUT_UPGRADE_40),
GET_ITEM(ITEM_BULLET_BAG_50, OBJECT_GI_DEKUPOUCH, GID_BULLET_BAG_50, 0x6C, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_BULLET_BAG_50),
GET_ITEM_NONE,
GET_ITEM_NONE,
};
ItemTableManager::Instance->AddItemTable(MOD_NONE);
for (uint8_t i = 0; i < ARRAY_COUNT(getItemTable); i++) {
// The vanilla item table array started with ITEM_BOMBS_5,
// but the GetItemID enum started with GI_NONE. Then everywhere
// that table was accessed used `GetItemID - 1`. This allows the
// "first" item of the new map to start at 1, syncing it up with
// the GetItemID values and removing the need for the `- 1`
ItemTableManager::Instance->AddItemEntry(MOD_NONE, i+1, getItemTable[i]);
}
}
extern "C" void OTRExtScanner() { extern "C" void OTRExtScanner() {
auto lst = *OTRGlobals::Instance->context->GetResourceManager()->ListFiles("*.*").get(); auto lst = *OTRGlobals::Instance->context->GetResourceManager()->ListFiles("*.*").get();
@ -180,6 +321,7 @@ extern "C" void InitOTR() {
OTRGlobals::Instance = new OTRGlobals(); OTRGlobals::Instance = new OTRGlobals();
SaveManager::Instance = new SaveManager(); SaveManager::Instance = new SaveManager();
CustomMessageManager::Instance = new CustomMessageManager(); CustomMessageManager::Instance = new CustomMessageManager();
ItemTableManager::Instance = new ItemTableManager();
auto t = OTRGlobals::Instance->context->GetResourceManager()->LoadFile("version"); auto t = OTRGlobals::Instance->context->GetResourceManager()->LoadFile("version");
if (!t->bHasLoadError) if (!t->bHasLoadError)
@ -198,6 +340,7 @@ extern "C" void InitOTR() {
Rando_Init(); Rando_Init();
InitItemTracker(); InitItemTracker();
OTRExtScanner(); OTRExtScanner();
VanillaItemTable_Init();
} }
extern "C" void DeinitOTR() { extern "C" void DeinitOTR() {
@ -1401,14 +1544,6 @@ extern "C" void* getN64WeirdFrame(s32 i) {
return &weirdFrameBytes[i + sizeof(n64WeirdFrames)]; return &weirdFrameBytes[i + sizeof(n64WeirdFrames)];
} }
extern "C" s16 Randomizer_GetItemModelFromId(s16 itemId) {
return OTRGlobals::Instance->gRandomizer->GetItemModelFromId(itemId);
}
extern "C" s32 Randomizer_GetItemIDFromGetItemID(s32 getItemId) {
return OTRGlobals::Instance->gRandomizer->GetItemIDFromGetItemID(getItemId);
}
extern "C" void Randomizer_LoadSettings(const char* spoilerFileName) { extern "C" void Randomizer_LoadSettings(const char* spoilerFileName) {
OTRGlobals::Instance->gRandomizer->LoadRandomizerSettings(spoilerFileName); OTRGlobals::Instance->gRandomizer->LoadRandomizerSettings(spoilerFileName);
} }
@ -1468,24 +1603,54 @@ extern "C" CustomMessageEntry Randomizer_GetHintFromCheck(RandomizerCheck check)
return hintText; return hintText;
} }
extern "C" s32 Randomizer_GetRandomizedItemId(GetItemID ogId, s16 actorId, s16 actorParams, s16 sceneNum) { extern "C" GetItemEntry ItemTable_Retrieve(int16_t getItemID) {
return OTRGlobals::Instance->gRandomizer->GetRandomizedItemId(ogId, actorId, actorParams, sceneNum); GetItemEntry giEntry = ItemTableManager::Instance->RetrieveItemEntry(MOD_NONE, getItemID);
return giEntry;
} }
extern "C" s32 Randomizer_GetItemIdFromKnownCheck(RandomizerCheck randomizerCheck, GetItemID ogId) { extern "C" GetItemEntry ItemTable_RetrieveEntry(s16 tableID, s16 getItemID) {
return OTRGlobals::Instance->gRandomizer->GetRandomizedItemIdFromKnownCheck(randomizerCheck, ogId); return ItemTableManager::Instance->RetrieveItemEntry(tableID, getItemID);
} }
extern "C" bool Randomizer_ObtainedFreestandingIceTrap(RandomizerCheck randomizerCheck, GetItemID ogId, Actor* actor) { extern "C" GetItemEntry Randomizer_GetRandomizedItem(GetItemID ogId, s16 actorId, s16 actorParams, s16 sceneNum) {
s16 getItemModIndex;
if (OTRGlobals::Instance->gRandomizer->CheckContainsVanillaItem(
OTRGlobals::Instance->gRandomizer->GetCheckFromActor(sceneNum, actorId, actorParams))) {
getItemModIndex = MOD_NONE;
} else {
getItemModIndex = MOD_RANDOMIZER;
}
s16 itemID = OTRGlobals::Instance->gRandomizer->GetRandomizedItemId(ogId, actorId, actorParams, sceneNum);
return ItemTable_RetrieveEntry(getItemModIndex, itemID);
}
extern "C" GetItemEntry Randomizer_GetItemFromKnownCheck(RandomizerCheck randomizerCheck, GetItemID ogId) {
s16 getItemModIndex;
if (OTRGlobals::Instance->gRandomizer->CheckContainsVanillaItem(randomizerCheck)) {
getItemModIndex = MOD_NONE;
} else {
getItemModIndex = MOD_RANDOMIZER;
}
s16 itemID = OTRGlobals::Instance->gRandomizer->GetRandomizedItemIdFromKnownCheck(randomizerCheck, ogId);
return ItemTable_RetrieveEntry(getItemModIndex, itemID);
}
extern "C" u32 Randomizer_ObtainedFreestandingIceTrap(RandomizerCheck randomizerCheck, GetItemID ogId, Actor* actor) {
return gSaveContext.n64ddFlag && (actor->parent != NULL) && return gSaveContext.n64ddFlag && (actor->parent != NULL) &&
Randomizer_GetItemIdFromKnownCheck(randomizerCheck, ogId) == GI_ICE_TRAP; Randomizer_GetItemFromKnownCheck(randomizerCheck, ogId).getItemId == RG_ICE_TRAP;
} }
extern "C" bool Randomizer_ItemIsIceTrap(RandomizerCheck randomizerCheck, GetItemID ogId) { extern "C" u32 Randomizer_ItemIsIceTrap(RandomizerCheck randomizerCheck, GetItemID ogId) {
return gSaveContext.n64ddFlag && Randomizer_GetItemIdFromKnownCheck(randomizerCheck, ogId) == GI_ICE_TRAP; return gSaveContext.n64ddFlag && Randomizer_GetItemFromKnownCheck(randomizerCheck, ogId).getItemId == RG_ICE_TRAP;
} }
extern "C" CustomMessageEntry Randomizer_GetCustomGetItemMessage(GetItemID giid, char* buffer, const int maxBufferSize) { extern "C" CustomMessageEntry Randomizer_GetCustomGetItemMessage(Player* player) {
s16 giid;
if (player->getItemEntry.objectId != OBJECT_INVALID) {
giid = player->getItemEntry.getItemId;
} else {
giid = player->getItemId;
}
const CustomMessageEntry getItemText = CustomMessageManager::Instance->RetrieveMessage(Randomizer::getItemMessageTableID, giid); const CustomMessageEntry getItemText = CustomMessageManager::Instance->RetrieveMessage(Randomizer::getItemMessageTableID, giid);
return getItemText; return getItemText;
} }
@ -1500,7 +1665,7 @@ extern "C" int CustomMessage_RetrieveIfExists(GlobalContext* globalCtx) {
if (gSaveContext.n64ddFlag) { if (gSaveContext.n64ddFlag) {
if (textId == TEXT_RANDOMIZER_CUSTOM_ITEM) { if (textId == TEXT_RANDOMIZER_CUSTOM_ITEM) {
messageEntry = messageEntry =
Randomizer_GetCustomGetItemMessage((GetItemID)GET_PLAYER(globalCtx)->getItemId, buffer, maxBufferSize); Randomizer_GetCustomGetItemMessage(GET_PLAYER(globalCtx));
} else if (textId == TEXT_RANDOMIZER_GOSSIP_STONE_HINTS && Randomizer_GetSettingValue(RSK_GOSSIP_STONE_HINTS) != 0 && } else if (textId == TEXT_RANDOMIZER_GOSSIP_STONE_HINTS && Randomizer_GetSettingValue(RSK_GOSSIP_STONE_HINTS) != 0 &&
(Randomizer_GetSettingValue(RSK_GOSSIP_STONE_HINTS) == 1 || (Randomizer_GetSettingValue(RSK_GOSSIP_STONE_HINTS) == 1 ||
(Randomizer_GetSettingValue(RSK_GOSSIP_STONE_HINTS) == 2 && (Randomizer_GetSettingValue(RSK_GOSSIP_STONE_HINTS) == 2 &&

View File

@ -5,6 +5,7 @@
#include "GlobalCtx2.h" #include "GlobalCtx2.h"
#include "SaveManager.h" #include "SaveManager.h"
#include <soh/Enhancements/item-tables/ItemTableTypes.h>
#ifdef __cplusplus #ifdef __cplusplus
#include "Enhancements/savestates.h" #include "Enhancements/savestates.h"
@ -20,6 +21,7 @@ public:
std::shared_ptr<Ship::GlobalCtx2> context; std::shared_ptr<Ship::GlobalCtx2> context;
std::shared_ptr<SaveStateMgr> gSaveStateMgr; std::shared_ptr<SaveStateMgr> gSaveStateMgr;
std::shared_ptr<Randomizer> gRandomizer; std::shared_ptr<Randomizer> gRandomizer;
uint16_t getItemModIndex;
OTRGlobals(); OTRGlobals();
~OTRGlobals(); ~OTRGlobals();
@ -30,6 +32,7 @@ private:
#endif #endif
#ifndef __cplusplus #ifndef __cplusplus
void VanillaItemTable_Init();
void OTRAudio_Init(); void OTRAudio_Init();
void InitAudio(); void InitAudio();
void Graph_StartFrame(); void Graph_StartFrame();
@ -95,13 +98,13 @@ u8 Randomizer_GetSettingValue(RandomizerSettingKey randoSettingKey);
RandomizerCheck Randomizer_GetCheckFromActor(s16 actorId, s16 actorParams, s16 sceneNum); RandomizerCheck Randomizer_GetCheckFromActor(s16 actorId, s16 actorParams, s16 sceneNum);
void Randomizer_LoadHintLocations(const char* spoilerFileName); void Randomizer_LoadHintLocations(const char* spoilerFileName);
void Randomizer_LoadItemLocations(const char* spoilerFileName, bool silent); void Randomizer_LoadItemLocations(const char* spoilerFileName, bool silent);
s16 Randomizer_GetItemModelFromId(s16 itemId); GetItemEntry Randomizer_GetRandomizedItem(GetItemID ogId, s16 actorId, s16 actorParams, s16 sceneNum);
s32 Randomizer_GetItemIDFromGetItemID(s32 getItemId); GetItemEntry Randomizer_GetItemFromKnownCheck(RandomizerCheck randomizerCheck, GetItemID ogId);
s32 Randomizer_GetRandomizedItemId(GetItemID ogId, s16 actorId, s16 actorParams, s16 sceneNum);
s32 Randomizer_GetItemIdFromKnownCheck(RandomizerCheck randomizerCheck, GetItemID ogId);
bool Randomizer_ObtainedFreestandingIceTrap(RandomizerCheck randomizerCheck, GetItemID ogId, Actor* actor); bool Randomizer_ObtainedFreestandingIceTrap(RandomizerCheck randomizerCheck, GetItemID ogId, Actor* actor);
bool Randomizer_ItemIsIceTrap(RandomizerCheck randomizerCheck, GetItemID ogId); bool Randomizer_ItemIsIceTrap(RandomizerCheck randomizerCheck, GetItemID ogId);
int CustomMessage_RetrieveIfExists(GlobalContext* globalCtx); int CustomMessage_RetrieveIfExists(GlobalContext* globalCtx);
GetItemEntry ItemTable_Retrieve(int16_t getItemID);
GetItemEntry ItemTable_RetrieveEntry(s16 modIndex, s16 getItemID);
#endif #endif
#endif #endif

View File

@ -60,6 +60,7 @@ void OTRGameplay_InitScene(GlobalContext* globalCtx, s32 spawn) {
globalCtx->cUpElfMsgs = nullptr; globalCtx->cUpElfMsgs = nullptr;
globalCtx->setupPathList = nullptr; globalCtx->setupPathList = nullptr;
globalCtx->numSetupActors = 0; globalCtx->numSetupActors = 0;
OTRGlobals::Instance->getItemModIndex = MOD_NONE;
Object_InitBank(globalCtx, &globalCtx->objectCtx); Object_InitBank(globalCtx, &globalCtx->objectCtx);
LightContext_Init(globalCtx, &globalCtx->lightCtx); LightContext_Init(globalCtx, &globalCtx->lightCtx);
TransitionActor_InitContext(&globalCtx->state, &globalCtx->transiActorCtx); TransitionActor_InitContext(&globalCtx->state, &globalCtx->transiActorCtx);

View File

@ -1246,7 +1246,7 @@ void Audio_StepFreqLerp(FreqLerp* lerp);
void func_800F56A8(void); void func_800F56A8(void);
void Audio_PlayNatureAmbienceSequence(u8 natureAmbienceId); void Audio_PlayNatureAmbienceSequence(u8 natureAmbienceId);
s32 Audio_SetGanonDistVol(u8 targetVol); s32 Audio_SetGanonDistVol(u8 targetVol);
void Audio_PlayFanfare_Rando(ItemID getItemId); void Audio_PlayFanfare_Rando(GetItemEntry getItem);
// Right stick as virtual C buttons // Right stick as virtual C buttons
#define RSTICK_UP 0x100000 #define RSTICK_UP 0x100000
@ -3957,42 +3957,51 @@ void Audio_ResetSfxChannelState(void) {
// Function to play "get-item" fanfares according to the type of item obtained (used in rando) // Function to play "get-item" fanfares according to the type of item obtained (used in rando)
// Longer fanfares for medallions/stones/songs are behind the Cvar // Longer fanfares for medallions/stones/songs are behind the Cvar
void Audio_PlayFanfare_Rando(ItemID getItemId) { void Audio_PlayFanfare_Rando(GetItemEntry getItem) {
s32 temp1; s32 temp1;
s16 getItemId = getItem.getItemId;
s16 itemId = getItem.itemId;
if (((getItemId >= GI_RUPEE_GREEN) && (getItemId <= GI_RUPEE_RED)) || if (getItem.modIndex == MOD_NONE) {
((getItemId >= GI_RUPEE_PURPLE) && (getItemId <= GI_RUPEE_GOLD)) || if (((itemId >= ITEM_RUPEE_GREEN) && (itemId <= ITEM_RUPEE_GOLD)) || (itemId == ITEM_HEART)) {
((getItemId >= GI_RUPEE_GREEN_LOSE) && (getItemId <= GI_RUPEE_PURPLE_LOSE)) || (getItemId == GI_HEART)) { Audio_PlaySoundGeneral(NA_SE_SY_GET_BOXITEM, &D_801333D4, 4, &D_801333E0, &D_801333E0, &D_801333E8);
Audio_PlaySoundGeneral(NA_SE_SY_GET_BOXITEM, &D_801333D4, 4, &D_801333E0, &D_801333E0, &D_801333E8);
} else {
if ((getItemId == GI_HEART_CONTAINER_2) || (getItemId == GI_HEART_CONTAINER) ||
((getItemId == GI_HEART_PIECE) && ((gSaveContext.inventory.questItems & 0xF0000000) == 0x40000000))) {
temp1 = NA_BGM_HEART_GET | 0x900;
} else { } else {
temp1 = (getItemId == GI_HEART_PIECE) ? NA_BGM_SMALL_ITEM_GET : NA_BGM_ITEM_GET | 0x900; if (itemId == ITEM_HEART_CONTAINER ||
} ((itemId == ITEM_HEART_PIECE_2) && ((gSaveContext.inventory.questItems & 0xF0000000) == 0x40000000))) {
// If we get a skulltula token or the "WINNER" heart, play "get small item" temp1 = NA_BGM_HEART_GET | 0x900;
if (getItemId == GI_SKULL_TOKEN || getItemId == GI_HEART_PIECE_WIN) { } else {
temp1 = NA_BGM_SMALL_ITEM_GET | 0x900; temp1 = (itemId == ITEM_HEART_PIECE_2) ? NA_BGM_SMALL_ITEM_GET : NA_BGM_ITEM_GET | 0x900;
}
// But if the "WINNER" heart is the 4th heart piece collected, play "get heart container"
if (getItemId == GI_HEART_PIECE_WIN && ((gSaveContext.inventory.questItems & 0xF0000000) == 0x40000000)) {
temp1 = NA_BGM_HEART_GET | 0x900;
}
// If the setting is toggled on and we get special quest items (longer fanfares):
if (CVar_GetS32("gRandoQuestItemFanfares", 0) != 0) {
// If we get a medallion, play the "get a medallion" fanfare
if ((getItemId >= GI_MEDALLION_LIGHT) && (getItemId <= GI_MEDALLION_SPIRIT)) {
temp1 = NA_BGM_MEDALLION_GET | 0x900;
} }
// If it's a Spiritual Stone, play the "get a spiritual stone" fanfare // If we get a skulltula token or the "WINNER" heart, play "get small item"
if ((getItemId >= GI_STONE_KOKIRI) && (getItemId <= GI_STONE_ZORA)) { // Also make sure "WINNER" heart is not the 4th heart piece.
temp1 = NA_BGM_SPIRITUAL_STONE | 0x900; if (itemId == ITEM_SKULL_TOKEN || (getItemId == GI_HEART_PIECE_WIN && itemId == ITEM_HEART_PIECE_2 &&
(gSaveContext.inventory.questItems & 0xF0000000) != 0x40000000)) {
temp1 = NA_BGM_SMALL_ITEM_GET | 0x900;
} }
// If the item we're getting is a song, play the "learned a song" fanfare // If the setting is toggled on and we get special quest items (longer fanfares):
if ((getItemId >= GI_ZELDAS_LULLABY) && (getItemId <= GI_PRELUDE_OF_LIGHT)) { if (CVar_GetS32("gRandoQuestItemFanfares", 0) != 0) {
temp1 = NA_BGM_OCA_FAIRY_GET | 0x900; // If we get a medallion, play the "get a medallion" fanfare
if ((itemId >= ITEM_MEDALLION_FOREST) && (itemId <= ITEM_MEDALLION_LIGHT)) {
temp1 = NA_BGM_MEDALLION_GET | 0x900;
}
// If it's a Spiritual Stone, play the "get a spiritual stone" fanfare
if ((itemId >= ITEM_KOKIRI_EMERALD) && (itemId <= ITEM_ZORA_SAPPHIRE)) {
temp1 = NA_BGM_SPIRITUAL_STONE | 0x900;
}
// If the item we're getting is a song, play the "learned a song" fanfare
if ((itemId >= ITEM_SONG_MINUET) && (itemId <= ITEM_SONG_STORMS)) {
temp1 = NA_BGM_OCA_FAIRY_GET | 0x900;
}
} }
Audio_PlayFanfare(temp1);
}
} else if (getItem.modIndex == MOD_RANDOMIZER) {
if ((itemId >= RG_BOTTLE_WITH_RED_POTION && itemId <= RG_BOTTLE_WITH_BIG_POE) ||
(itemId >= RG_DEKU_TREE_MAP && itemId <= RG_GANONS_CASTLE_SMALL_KEY)) {
temp1 = NA_BGM_ITEM_GET | 0x900;
} else {
// Just in case nothing else matches.
temp1 = NA_BGM_ITEM_GET | 0x900;
} }
Audio_PlayFanfare(temp1); Audio_PlayFanfare(temp1);
} }

View File

@ -1955,14 +1955,25 @@ u32 Actor_HasParent(Actor* actor, GlobalContext* globalCtx) {
} }
} }
s32 GiveItemWithoutActor(GlobalContext* globalCtx, s32 getItemId) { /**
* Uses the given `GetItemEntry` to prepare the player to receive an item via the animation
* where Link holds an item over his head. This function does not require an actor for giving
* the player an item, instead setting the player as their own interactRangeActor and getItemDirection.
*
* \param globalCtx the Global Context
* \param getItemEntry the GetItemEntry for the item you want the player to receive.
* \return true if the player can receive an item, false if not.
*/
s32 GiveItemEntryWithoutActor(GlobalContext* globalCtx, GetItemEntry getItemEntry) {
Player* player = GET_PLAYER(globalCtx); Player* player = GET_PLAYER(globalCtx);
if (!(player->stateFlags1 & 0x3C7080) && Player_GetExplosiveHeld(player) < 0) { if (!(player->stateFlags1 & 0x3C7080) && Player_GetExplosiveHeld(player) < 0) {
if (((player->heldActor != NULL) && (getItemId > GI_NONE) && (getItemId < GI_MAX)) || if (((player->heldActor != NULL) && ((getItemEntry.getItemId > GI_NONE) && (getItemEntry.getItemId < GI_MAX)) ||
(gSaveContext.n64ddFlag && (getItemEntry.getItemId > RG_NONE) && (getItemEntry.getItemId < RG_MAX))) ||
(!(player->stateFlags1 & 0x20000800))) { (!(player->stateFlags1 & 0x20000800))) {
if ((getItemId != GI_NONE)) { if ((getItemEntry.getItemId != GI_NONE)) {
player->getItemId = getItemId; player->getItemEntry = getItemEntry;
player->getItemId = getItemEntry.getItemId;
player->interactRangeActor = &player->actor; player->interactRangeActor = &player->actor;
player->getItemDirection = player->actor.shape.rot.y; player->getItemDirection = player->actor.shape.rot.y;
// Player state 26 = Player is frozen // Player state 26 = Player is frozen
@ -1977,12 +1988,69 @@ s32 GiveItemWithoutActor(GlobalContext* globalCtx, s32 getItemId) {
return false; return false;
} }
/**
* Uses the given `GetItemEntry` to prepare the player to receive an item via the animation
* where Link holds an item over his head. This uses data from the actor link is receiving
* the item from to set the player's interactRangeActor and getItemDirection. It also checks
* a range from which Link must be from said actor in order to receive the item.
*
* \param actor the actor link is receiving an item from. Will usually be a chest but can also
* be an npc.
* \param globalCtx the Global Context
* \param getItemEntry the GetItemEntry for the item you want the player to receive.
* \param xzRange the distance on the x and z axes that the player can be from the target
* actor to receive the item.
* \param yRange the distance on the y axis that the player can be from the target actor
* to receive the item.
* \return true if the player can receive an item, false if not.
*/
s32 GiveItemEntryFromActor(Actor* actor, GlobalContext* globalCtx, GetItemEntry getItemEntry, f32 xzRange, f32 yRange) {
Player* player = GET_PLAYER(globalCtx);
if (!(player->stateFlags1 & 0x3C7080) && Player_GetExplosiveHeld(player) < 0) {
if ((((player->heldActor != NULL) || (actor == player->targetActor)) &&
((!gSaveContext.n64ddFlag && ((getItemEntry.getItemId > GI_NONE) && (getItemEntry.getItemId < GI_MAX))) ||
(gSaveContext.n64ddFlag && ((getItemEntry.getItemId > RG_NONE) && (getItemEntry.getItemId < RG_MAX))))) ||
(!(player->stateFlags1 & 0x20000800))) {
if ((actor->xzDistToPlayer < xzRange) && (fabsf(actor->yDistToPlayer) < yRange)) {
s16 yawDiff = actor->yawTowardsPlayer - player->actor.shape.rot.y;
s32 absYawDiff = ABS(yawDiff);
if ((getItemEntry.getItemId != GI_NONE) || (player->getItemDirection < absYawDiff)) {
player->getItemEntry = getItemEntry;
player->getItemId = getItemEntry.getItemId;
player->interactRangeActor = actor;
player->getItemDirection = absYawDiff;
return true;
}
}
}
}
return false;
}
/**
* Uses the given `GetItemEntry` to prepare the player to receive an item via the animation
* where Link holds an item over his head. This is a wrapper function around `GiveItemEntryFromActor`
* that supplies a fixed xzRange of 50.0f and a fixed yRange of 10.0f.
*
* \param actor the target actor that link is receiving an item from.
* \param globalCtx the Global Context
* \param getItemEntry the GetItemEntry for the item you want the player to receive.
*/
void GiveItemEntryFromActorWithFixedRange(Actor* actor, GlobalContext* globalCtx, GetItemEntry getItemEntry) {
GiveItemEntryFromActor(actor, globalCtx, getItemEntry, 50.0f, 10.0f);
}
// TODO: Rename to GiveItemIdFromActor or similar
// If you're doing something for randomizer, you're probably looking for GiveItemEntryFromActor
s32 func_8002F434(Actor* actor, GlobalContext* globalCtx, s32 getItemId, f32 xzRange, f32 yRange) { s32 func_8002F434(Actor* actor, GlobalContext* globalCtx, s32 getItemId, f32 xzRange, f32 yRange) {
Player* player = GET_PLAYER(globalCtx); Player* player = GET_PLAYER(globalCtx);
if (!(player->stateFlags1 & 0x3C7080) && Player_GetExplosiveHeld(player) < 0) { if (!(player->stateFlags1 & 0x3C7080) && Player_GetExplosiveHeld(player) < 0) {
if ((((player->heldActor != NULL) || (actor == player->targetActor)) && (getItemId > GI_NONE) && if ((((player->heldActor != NULL) || (actor == player->targetActor)) &&
(getItemId < GI_MAX)) || ((!gSaveContext.n64ddFlag && ((getItemId > GI_NONE) && (getItemId < GI_MAX))) || (gSaveContext.n64ddFlag && ((getItemId > RG_NONE) && (getItemId < RG_MAX))))) ||
(!(player->stateFlags1 & 0x20000800))) { (!(player->stateFlags1 & 0x20000800))) {
if ((actor->xzDistToPlayer < xzRange) && (fabsf(actor->yDistToPlayer) < yRange)) { if ((actor->xzDistToPlayer < xzRange) && (fabsf(actor->yDistToPlayer) < yRange)) {
s16 yawDiff = actor->yawTowardsPlayer - player->actor.shape.rot.y; s16 yawDiff = actor->yawTowardsPlayer - player->actor.shape.rot.y;
@ -2001,6 +2069,8 @@ s32 func_8002F434(Actor* actor, GlobalContext* globalCtx, s32 getItemId, f32 xzR
return false; return false;
} }
// TODO: Rename to GiveItemIdFromActorWithFixedRange or similar
// If you're doing something for randomizer, you're probably looking for GiveItemEntryFromActorWithFixedRange
void func_8002F554(Actor* actor, GlobalContext* globalCtx, s32 getItemId) { void func_8002F554(Actor* actor, GlobalContext* globalCtx, s32 getItemId) {
func_8002F434(actor, globalCtx, getItemId, 50.0f, 10.0f); func_8002F434(actor, globalCtx, getItemId, 50.0f, 10.0f);
} }
@ -5997,7 +6067,7 @@ s32 func_80038290(GlobalContext* globalCtx, Actor* actor, Vec3s* arg2, Vec3s* ar
return true; return true;
} }
s32 GetChestGameRandoGetItemId(s8 room, s16 ogDrawId, GlobalContext* globalCtx) { GetItemEntry GetChestGameRandoGetItem(s8 room, s16 ogDrawId, GlobalContext* globalCtx) {
if (Randomizer_GetSettingValue(RSK_SHUFFLE_CHEST_MINIGAME)) { if (Randomizer_GetSettingValue(RSK_SHUFFLE_CHEST_MINIGAME)) {
// RANDOTODO update this logic when we implement keysanity // RANDOTODO update this logic when we implement keysanity
// because 3drando replaces the keys not the rupees // because 3drando replaces the keys not the rupees
@ -6008,27 +6078,27 @@ s32 GetChestGameRandoGetItemId(s8 room, s16 ogDrawId, GlobalContext* globalCtx)
switch(room) { switch(room) {
case 1: case 1:
if(!Flags_GetCollectible(globalCtx, 0x1B)) { if(!Flags_GetCollectible(globalCtx, 0x1B)) {
return Randomizer_GetItemIdFromKnownCheck(RC_MARKET_TREASURE_CHEST_GAME_ITEM_1, GI_RUPEE_GREEN); return Randomizer_GetItemFromKnownCheck(RC_MARKET_TREASURE_CHEST_GAME_ITEM_1, GI_RUPEE_GREEN);
} }
break; break;
case 2: case 2:
if(!Flags_GetCollectible(globalCtx, 0x1C)) { if(!Flags_GetCollectible(globalCtx, 0x1C)) {
return Randomizer_GetItemIdFromKnownCheck(RC_MARKET_TREASURE_CHEST_GAME_ITEM_2, GI_RUPEE_GREEN); return Randomizer_GetItemFromKnownCheck(RC_MARKET_TREASURE_CHEST_GAME_ITEM_2, GI_RUPEE_GREEN);
} }
break; break;
case 3: case 3:
if(!Flags_GetCollectible(globalCtx, 0x1D)) { if(!Flags_GetCollectible(globalCtx, 0x1D)) {
return Randomizer_GetItemIdFromKnownCheck(RC_MARKET_TREASURE_CHEST_GAME_ITEM_3, GI_RUPEE_BLUE); return Randomizer_GetItemFromKnownCheck(RC_MARKET_TREASURE_CHEST_GAME_ITEM_3, GI_RUPEE_BLUE);
} }
break; break;
case 4: case 4:
if(!Flags_GetCollectible(globalCtx, 0x1E)) { if(!Flags_GetCollectible(globalCtx, 0x1E)) {
return Randomizer_GetItemIdFromKnownCheck(RC_MARKET_TREASURE_CHEST_GAME_ITEM_4, GI_RUPEE_BLUE); return Randomizer_GetItemFromKnownCheck(RC_MARKET_TREASURE_CHEST_GAME_ITEM_4, GI_RUPEE_BLUE);
} }
break; break;
case 5: case 5:
if(!Flags_GetCollectible(globalCtx, 0x1F)) { if(!Flags_GetCollectible(globalCtx, 0x1F)) {
return Randomizer_GetItemIdFromKnownCheck(RC_MARKET_TREASURE_CHEST_GAME_ITEM_5, GI_RUPEE_RED); return Randomizer_GetItemFromKnownCheck(RC_MARKET_TREASURE_CHEST_GAME_ITEM_5, GI_RUPEE_RED);
} }
break; break;
} }
@ -6036,17 +6106,17 @@ s32 GetChestGameRandoGetItemId(s8 room, s16 ogDrawId, GlobalContext* globalCtx)
} }
if(ogDrawId == GID_HEART_PIECE) { if(ogDrawId == GID_HEART_PIECE) {
return Randomizer_GetItemIdFromKnownCheck(RC_MARKET_TREASURE_CHEST_GAME_REWARD, GI_HEART_PIECE); return Randomizer_GetItemFromKnownCheck(RC_MARKET_TREASURE_CHEST_GAME_REWARD, GI_HEART_PIECE);
} }
return GI_NONE; return (GetItemEntry)GET_ITEM_NONE;
} }
s16 GetChestGameRandoGiDrawId(s8 room, s16 ogDrawId, GlobalContext* globalCtx) { s16 GetChestGameRandoGiDrawId(s8 room, s16 ogDrawId, GlobalContext* globalCtx) {
s32 randoGetItemId = GetChestGameRandoGetItemId(room, ogDrawId, globalCtx); GetItemEntry randoGetItem = GetChestGameRandoGetItem(room, ogDrawId, globalCtx);
if(randoGetItemId != GI_NONE) { if (randoGetItem.itemId != RG_NONE) {
return Randomizer_GetItemModelFromId(randoGetItemId); return randoGetItem.gid;
} }
return ogDrawId; return ogDrawId;

View File

@ -335,6 +335,7 @@ void EnItem00_Init(Actor* thisx, GlobalContext* globalCtx) {
f32 yOffset = 980.0f; f32 yOffset = 980.0f;
f32 shadowScale = 6.0f; f32 shadowScale = 6.0f;
s32 getItemId = GI_NONE; s32 getItemId = GI_NONE;
GetItemEntry getItem = (GetItemEntry)GET_ITEM_NONE;
s16 spawnParam8000 = this->actor.params & 0x8000; s16 spawnParam8000 = this->actor.params & 0x8000;
s32 pad1; s32 pad1;
@ -508,9 +509,15 @@ void EnItem00_Init(Actor* thisx, GlobalContext* globalCtx) {
break; break;
} }
if ((gSaveContext.n64ddFlag || getItemId != GI_NONE) && !Actor_HasParent(&this->actor, globalCtx)) { if (!Actor_HasParent(&this->actor, globalCtx)) {
getItemId = Randomizer_GetRandomizedItemId(getItemId, this->actor.id, this->ogParams, globalCtx->sceneNum); if (!gSaveContext.n64ddFlag) {
func_8002F554(&this->actor, globalCtx, getItemId); if (getItemId != GI_NONE) {
func_8002F554(&this->actor, globalCtx, getItemId);
}
} else {
getItem = Randomizer_GetRandomizedItem(getItemId, this->actor.id, this->ogParams, globalCtx->sceneNum);
GiveItemEntryFromActorWithFixedRange(&this->actor, globalCtx, getItem);
}
} }
EnItem00_SetupAction(this, func_8001E5C8); EnItem00_SetupAction(this, func_8001E5C8);
@ -666,10 +673,15 @@ void func_8001E304(EnItem00* this, GlobalContext* globalCtx) {
void func_8001E5C8(EnItem00* this, GlobalContext* globalCtx) { void func_8001E5C8(EnItem00* this, GlobalContext* globalCtx) {
Player* player = GET_PLAYER(globalCtx); Player* player = GET_PLAYER(globalCtx);
if (this->getItemId != GI_NONE) { if (this->getItemId != GI_NONE) {
if (!Actor_HasParent(&this->actor, globalCtx)) { if (!Actor_HasParent(&this->actor, globalCtx)) {
func_8002F434(&this->actor, globalCtx, this->getItemId, 50.0f, 80.0f); if (!gSaveContext.n64ddFlag) {
func_8002F434(&this->actor, globalCtx, this->getItemId, 50.0f, 80.0f);
} else {
GetItemEntry getItemEntry =
Randomizer_GetRandomizedItem(this->getItemId, this->actor.id, this->ogParams, globalCtx->sceneNum);
GiveItemEntryFromActor(&this->actor, globalCtx, getItemEntry, 50.0f, 80.0f);
}
this->unk_15A++; this->unk_15A++;
} else { } else {
this->getItemId = GI_NONE; this->getItemId = GI_NONE;
@ -703,6 +715,7 @@ void EnItem00_Update(Actor* thisx, GlobalContext* globalCtx) {
s16* params; s16* params;
Actor* dynaActor; Actor* dynaActor;
s32 getItemId = GI_NONE; s32 getItemId = GI_NONE;
GetItemEntry getItem = (GetItemEntry)GET_ITEM_NONE;
s16 sp3A = 0; s16 sp3A = 0;
s16 i; s16 i;
u32* temp; u32* temp;
@ -883,10 +896,13 @@ void EnItem00_Update(Actor* thisx, GlobalContext* globalCtx) {
params = &this->actor.params; params = &this->actor.params;
if ((getItemId != GI_NONE) && !Actor_HasParent(&this->actor, globalCtx)) { if ((getItemId != GI_NONE) && !Actor_HasParent(&this->actor, globalCtx)) {
if (gSaveContext.n64ddFlag) { if (!gSaveContext.n64ddFlag) {
getItemId = Randomizer_GetRandomizedItemId(getItemId, this->actor.id, this->ogParams, globalCtx->sceneNum); func_8002F554(&this->actor, globalCtx, getItemId);
} else {
getItem = Randomizer_GetRandomizedItem(getItemId, this->actor.id, this->ogParams, globalCtx->sceneNum);
getItemId = getItem.getItemId;
GiveItemEntryFromActorWithFixedRange(&this->actor, globalCtx, getItem);
} }
func_8002F554(&this->actor, globalCtx, getItemId);
} }
switch (*params) { switch (*params) {
@ -1214,38 +1230,56 @@ void EnItem00_Draw(Actor* thisx, GlobalContext* globalCtx) {
} }
} }
void EnItem00_CustomItemsParticles(Actor* Parent, GlobalContext* globalCtx, s16 getItemId) { void EnItem00_CustomItemsParticles(Actor* Parent, GlobalContext* globalCtx, GetItemEntry giEntry) {
s16 color_slot; s16 color_slot;
switch (getItemId) { switch (giEntry.modIndex) {
case GI_MINUET_OF_FOREST: case MOD_NONE:
case GI_SINGLE_MAGIC: switch (giEntry.itemId) {
case GI_DOUBLE_MAGIC: case ITEM_SONG_MINUET:
color_slot = 0; color_slot = 0;
break;
case ITEM_SONG_BOLERO:
color_slot = 1;
break;
case ITEM_SONG_SERENADE:
color_slot = 2;
break;
case ITEM_SONG_REQUIEM:
color_slot = 3;
break;
case ITEM_SONG_NOCTURNE:
color_slot = 4;
break;
case ITEM_SONG_PRELUDE:
color_slot = 5;
break;
case ITEM_STICK_UPGRADE_20:
case ITEM_STICK_UPGRADE_30:
color_slot = 6;
break;
case ITEM_NUT_UPGRADE_30:
case ITEM_NUT_UPGRADE_40:
color_slot = 7;
break;
default:
return;
}
break; break;
case GI_BOLERO_OF_FIRE: case MOD_RANDOMIZER:
case GI_DOUBLE_DEFENSE: switch (giEntry.itemId) {
color_slot = 1; case RG_MAGIC_SINGLE:
break; case RG_MAGIC_DOUBLE:
case GI_SERENADE_OF_WATER: color_slot = 0;
color_slot = 2; break;
break; case RG_DOUBLE_DEFENSE:
case GI_REQUIEM_OF_SPIRIT: color_slot = 1;
color_slot = 3; break;
break; default:
case GI_NOCTURNE_OF_SHADOW: return;
color_slot = 4; }
break;
case GI_PRELUDE_OF_LIGHT:
color_slot = 5;
break;
case GI_STICK_UPGRADE_20:
case GI_STICK_UPGRADE_30:
color_slot = 6;
break;
case GI_NUT_UPGRADE_30:
case GI_NUT_UPGRADE_40:
color_slot = 7;
break; break;
default:
return;
} }
s16* colors[9][3] = { s16* colors[9][3] = {
@ -1323,12 +1357,10 @@ void EnItem00_DrawCollectible(EnItem00* this, GlobalContext* globalCtx) {
if (gSaveContext.n64ddFlag && (this->getItemId != GI_NONE || this->actor.params == ITEM00_SMALL_KEY)) { if (gSaveContext.n64ddFlag && (this->getItemId != GI_NONE || this->actor.params == ITEM00_SMALL_KEY)) {
f32 mtxScale = 16.0f; f32 mtxScale = 16.0f;
Matrix_Scale(mtxScale, mtxScale, mtxScale, MTXMODE_APPLY); Matrix_Scale(mtxScale, mtxScale, mtxScale, MTXMODE_APPLY);
s32 randoGetItemId = Randomizer_GetRandomizedItemId(this->getItemId, this->actor.id, this->ogParams, globalCtx->sceneNum); GetItemEntry randoGetItemEntry =
if ((randoGetItemId >= GI_MINUET_OF_FOREST && randoGetItemId <= GI_DOUBLE_DEFENSE) || Randomizer_GetRandomizedItem(this->getItemId, this->actor.id, this->ogParams, globalCtx->sceneNum);
(randoGetItemId >= GI_STICK_UPGRADE_20 && randoGetItemId <= GI_NUT_UPGRADE_40)) { EnItem00_CustomItemsParticles(&this->actor, globalCtx, randoGetItemEntry);
EnItem00_CustomItemsParticles(&this->actor, globalCtx, randoGetItemId); GetItem_Draw(globalCtx, randoGetItemEntry.gid);
}
GetItem_Draw(globalCtx, Randomizer_GetItemModelFromId(randoGetItemId));
} else { } else {
s32 texIndex = this->actor.params - 3; s32 texIndex = this->actor.params - 3;
@ -1384,12 +1416,10 @@ void EnItem00_DrawHeartPiece(EnItem00* this, GlobalContext* globalCtx) {
if (gSaveContext.n64ddFlag) { if (gSaveContext.n64ddFlag) {
f32 mtxScale = 16.0f; f32 mtxScale = 16.0f;
Matrix_Scale(mtxScale, mtxScale, mtxScale, MTXMODE_APPLY); Matrix_Scale(mtxScale, mtxScale, mtxScale, MTXMODE_APPLY);
s32 randoGetItemId = Randomizer_GetRandomizedItemId(GI_HEART_PIECE, this->actor.id, this->ogParams, globalCtx->sceneNum); GetItemEntry randoGetItemEntry =
if ((randoGetItemId >= GI_MINUET_OF_FOREST && randoGetItemId <= GI_DOUBLE_DEFENSE) || Randomizer_GetRandomizedItem(GI_HEART_PIECE, this->actor.id, this->ogParams, globalCtx->sceneNum);
(randoGetItemId >= GI_STICK_UPGRADE_20 && randoGetItemId <= GI_NUT_UPGRADE_40)) { EnItem00_CustomItemsParticles(&this->actor, globalCtx, randoGetItemEntry);
EnItem00_CustomItemsParticles(&this->actor, globalCtx, randoGetItemId); GetItem_Draw(globalCtx, randoGetItemEntry.gid);
}
GetItem_Draw(globalCtx, Randomizer_GetItemModelFromId(randoGetItemId));
} else { } else {
s32 pad; s32 pad;

View File

@ -1591,70 +1591,6 @@ u8 Item_Give(GlobalContext* globalCtx, u8 item) {
osSyncPrintf("item_get_setting=%d pt=%d z=%x\n", item, slot, gSaveContext.inventory.items[slot]); osSyncPrintf("item_get_setting=%d pt=%d z=%x\n", item, slot, gSaveContext.inventory.items[slot]);
osSyncPrintf(VT_RST); osSyncPrintf(VT_RST);
if (item == ITEM_SINGLE_MAGIC) {
gSaveContext.magicAcquired = true;
gSaveContext.unk_13F6 = 0x30;
Magic_Fill(globalCtx);
return ITEM_NONE;
} else if (item == ITEM_DOUBLE_MAGIC) {
if (!gSaveContext.magicAcquired) {
gSaveContext.magicAcquired = true;
}
gSaveContext.doubleMagic = true;
gSaveContext.unk_13F6 = 0x60;
gSaveContext.magicLevel = 0;
Magic_Fill(globalCtx);
return ITEM_NONE;
}
if (item == ITEM_DOUBLE_DEFENSE) {
gSaveContext.doubleDefense = true;
gSaveContext.inventory.defenseHearts = 20;
gSaveContext.healthAccumulator = 0x140;
return ITEM_NONE;
}
if (item >= ITEM_BOTTLE_WITH_RED_POTION &&
item <= ITEM_BOTTLE_WITH_BIG_POE) {
temp = SLOT(ITEM_BOTTLE);
for (i = 0; i < 4; i++) {
if (gSaveContext.inventory.items[temp + i] == ITEM_NONE) {
switch (item) {
case ITEM_BOTTLE_WITH_RED_POTION:
item = ITEM_POTION_RED;
break;
case ITEM_BOTTLE_WITH_GREEN_POTION:
item = ITEM_POTION_GREEN;
break;
case ITEM_BOTTLE_WITH_BLUE_POTION:
item = ITEM_POTION_BLUE;
break;
case ITEM_BOTTLE_WITH_FAIRY:
item = ITEM_FAIRY;
break;
case ITEM_BOTTLE_WITH_FISH:
item = ITEM_FISH;
break;
case ITEM_BOTTLE_WITH_BLUE_FIRE:
item = ITEM_BLUE_FIRE;
break;
case ITEM_BOTTLE_WITH_BUGS:
item = ITEM_BUG;
break;
case ITEM_BOTTLE_WITH_POE:
item = ITEM_POE;
break;
case ITEM_BOTTLE_WITH_BIG_POE:
item = ITEM_BIG_POE;
break;
}
gSaveContext.inventory.items[temp + i] = item;
return ITEM_NONE;
}
}
}
if ((item >= ITEM_MEDALLION_FOREST) && (item <= ITEM_MEDALLION_LIGHT)) { if ((item >= ITEM_MEDALLION_FOREST) && (item <= ITEM_MEDALLION_LIGHT)) {
gSaveContext.inventory.questItems |= gBitFlags[item - ITEM_MEDALLION_FOREST + QUEST_MEDALLION_FOREST]; gSaveContext.inventory.questItems |= gBitFlags[item - ITEM_MEDALLION_FOREST + QUEST_MEDALLION_FOREST];
@ -1758,100 +1694,6 @@ u8 Item_Give(GlobalContext* globalCtx, u8 item) {
gSaveContext.inventory.dungeonKeys[gSaveContext.mapIndex]++; gSaveContext.inventory.dungeonKeys[gSaveContext.mapIndex]++;
return ITEM_NONE; return ITEM_NONE;
} }
} else if (
(item >= ITEM_GERUDO_FORTRESS_SMALL_KEY && item <= ITEM_GANONS_CASTLE_SMALL_KEY) ||
(item >= ITEM_FOREST_TEMPLE_BOSS_KEY && item <= ITEM_GANONS_CASTLE_BOSS_KEY) ||
(item >= ITEM_DEKU_TREE_MAP && item <= ITEM_ICE_CAVERN_MAP) ||
(item >= ITEM_DEKU_TREE_COMPASS && item <= ITEM_ICE_CAVERN_COMPASS)
) {
int mapIndex = gSaveContext.mapIndex;
switch (item) {
case ITEM_DEKU_TREE_MAP:
case ITEM_DEKU_TREE_COMPASS:
mapIndex = SCENE_YDAN;
break;
case ITEM_DODONGOS_CAVERN_MAP:
case ITEM_DODONGOS_CAVERN_COMPASS:
mapIndex = SCENE_DDAN;
break;
case ITEM_JABU_JABUS_BELLY_MAP:
case ITEM_JABU_JABUS_BELLY_COMPASS:
mapIndex = SCENE_BDAN;
break;
case ITEM_FOREST_TEMPLE_MAP:
case ITEM_FOREST_TEMPLE_COMPASS:
case ITEM_FOREST_TEMPLE_SMALL_KEY:
case ITEM_FOREST_TEMPLE_BOSS_KEY:
mapIndex = SCENE_BMORI1;
break;
case ITEM_FIRE_TEMPLE_MAP:
case ITEM_FIRE_TEMPLE_COMPASS:
case ITEM_FIRE_TEMPLE_SMALL_KEY:
case ITEM_FIRE_TEMPLE_BOSS_KEY:
mapIndex = SCENE_HIDAN;
break;
case ITEM_WATER_TEMPLE_MAP:
case ITEM_WATER_TEMPLE_COMPASS:
case ITEM_WATER_TEMPLE_SMALL_KEY:
case ITEM_WATER_TEMPLE_BOSS_KEY:
mapIndex = SCENE_MIZUSIN;
break;
case ITEM_SPIRIT_TEMPLE_MAP:
case ITEM_SPIRIT_TEMPLE_COMPASS:
case ITEM_SPIRIT_TEMPLE_SMALL_KEY:
case ITEM_SPIRIT_TEMPLE_BOSS_KEY:
mapIndex = SCENE_JYASINZOU;
break;
case ITEM_SHADOW_TEMPLE_MAP:
case ITEM_SHADOW_TEMPLE_COMPASS:
case ITEM_SHADOW_TEMPLE_SMALL_KEY:
case ITEM_SHADOW_TEMPLE_BOSS_KEY:
mapIndex = SCENE_HAKADAN;
break;
case ITEM_BOTTOM_OF_THE_WELL_MAP:
case ITEM_BOTTOM_OF_THE_WELL_COMPASS:
case ITEM_BOTTOM_OF_THE_WELL_SMALL_KEY:
mapIndex = SCENE_HAKADANCH;
break;
case ITEM_ICE_CAVERN_MAP:
case ITEM_ICE_CAVERN_COMPASS:
mapIndex = SCENE_ICE_DOUKUTO;
break;
case ITEM_GANONS_CASTLE_BOSS_KEY:
mapIndex = SCENE_GANON;
break;
case ITEM_GERUDO_TRAINING_GROUNDS_SMALL_KEY:
mapIndex = SCENE_MEN;
break;
case ITEM_GERUDO_FORTRESS_SMALL_KEY:
mapIndex = SCENE_GERUDOWAY;
break;
case ITEM_GANONS_CASTLE_SMALL_KEY:
mapIndex = SCENE_GANONTIKA;
break;
}
if ((item >= ITEM_GERUDO_FORTRESS_SMALL_KEY) && (item <= ITEM_GANONS_CASTLE_SMALL_KEY)) {
if (gSaveContext.inventory.dungeonKeys[mapIndex] < 0) {
gSaveContext.inventory.dungeonKeys[mapIndex] = 1;
return ITEM_NONE;
} else {
gSaveContext.inventory.dungeonKeys[mapIndex]++;
return ITEM_NONE;
}
} else {
int bitmask;
if ((item >= ITEM_DEKU_TREE_MAP) && (item <= ITEM_ICE_CAVERN_MAP)) {
bitmask = gBitFlags[2];
} else if ((item >= ITEM_DEKU_TREE_COMPASS) && (item <= ITEM_ICE_CAVERN_COMPASS)) {
bitmask = gBitFlags[1];
} else {
bitmask = gBitFlags[0];
}
gSaveContext.inventory.dungeonItems[mapIndex] |= bitmask;
return ITEM_NONE;
}
} else if ((item == ITEM_QUIVER_30) || (item == ITEM_BOW)) { } else if ((item == ITEM_QUIVER_30) || (item == ITEM_BOW)) {
if (CUR_UPG_VALUE(UPG_QUIVER) == 0) { if (CUR_UPG_VALUE(UPG_QUIVER) == 0) {
Inventory_ChangeUpgrade(UPG_QUIVER, 1); Inventory_ChangeUpgrade(UPG_QUIVER, 1);
@ -2313,6 +2155,176 @@ u8 Item_Give(GlobalContext* globalCtx, u8 item) {
return temp; return temp;
} }
u16 Randomizer_Item_Give(GlobalContext* globalCtx, GetItemEntry giEntry) {
uint16_t item = giEntry.itemId;
uint16_t temp;
uint16_t i;
uint16_t slot;
slot = SLOT(item);
if (item == RG_MAGIC_SINGLE) {
gSaveContext.magicAcquired = true;
gSaveContext.unk_13F6 = 0x30;
Magic_Fill(globalCtx);
return RG_NONE;
} else if (item == RG_MAGIC_DOUBLE) {
if (!gSaveContext.magicAcquired) {
gSaveContext.magicAcquired = true;
}
gSaveContext.doubleMagic = true;
gSaveContext.unk_13F6 = 0x60;
gSaveContext.magicLevel = 0;
Magic_Fill(globalCtx);
return RG_NONE;
}
if (item == RG_DOUBLE_DEFENSE) {
gSaveContext.doubleDefense = true;
gSaveContext.inventory.defenseHearts = 20;
gSaveContext.healthAccumulator = 0x140;
return RG_NONE;
}
if (item >= RG_BOTTLE_WITH_RED_POTION && item <= RG_BOTTLE_WITH_BIG_POE) {
temp = SLOT(ITEM_BOTTLE);
for (i = 0; i < 4; i++) {
if (gSaveContext.inventory.items[temp + i] == ITEM_NONE) {
switch (item) {
case RG_BOTTLE_WITH_RED_POTION:
item = ITEM_POTION_RED;
break;
case RG_BOTTLE_WITH_GREEN_POTION:
item = ITEM_POTION_GREEN;
break;
case RG_BOTTLE_WITH_BLUE_POTION:
item = ITEM_POTION_BLUE;
break;
case RG_BOTTLE_WITH_FAIRY:
item = ITEM_FAIRY;
break;
case RG_BOTTLE_WITH_FISH:
item = ITEM_FISH;
break;
case RG_BOTTLE_WITH_BLUE_FIRE:
item = ITEM_BLUE_FIRE;
break;
case RG_BOTTLE_WITH_BUGS:
item = ITEM_BUG;
break;
case RG_BOTTLE_WITH_POE:
item = ITEM_POE;
break;
case RG_BOTTLE_WITH_BIG_POE:
item = ITEM_BIG_POE;
break;
}
gSaveContext.inventory.items[temp + i] = item;
return ITEM_NONE;
}
}
} else if ((item >= RG_FOREST_TEMPLE_SMALL_KEY && item <= RG_GANONS_CASTLE_SMALL_KEY) ||
(item >= RG_FOREST_TEMPLE_BOSS_KEY && item <= RG_GANONS_CASTLE_BOSS_KEY) ||
(item >= RG_DEKU_TREE_MAP && item <= RG_ICE_CAVERN_MAP) ||
(item >= RG_DEKU_TREE_COMPASS && item <= RG_ICE_CAVERN_COMPASS)) {
int mapIndex = gSaveContext.mapIndex;
switch (item) {
case RG_DEKU_TREE_MAP:
case RG_DEKU_TREE_COMPASS:
mapIndex = SCENE_YDAN;
break;
case RG_DODONGOS_CAVERN_MAP:
case RG_DODONGOS_CAVERN_COMPASS:
mapIndex = SCENE_DDAN;
break;
case RG_JABU_JABUS_BELLY_MAP:
case RG_JABU_JABUS_BELLY_COMPASS:
mapIndex = SCENE_BDAN;
break;
case RG_FOREST_TEMPLE_MAP:
case RG_FOREST_TEMPLE_COMPASS:
case RG_FOREST_TEMPLE_SMALL_KEY:
case RG_FOREST_TEMPLE_BOSS_KEY:
mapIndex = SCENE_BMORI1;
break;
case RG_FIRE_TEMPLE_MAP:
case RG_FIRE_TEMPLE_COMPASS:
case RG_FIRE_TEMPLE_SMALL_KEY:
case RG_FIRE_TEMPLE_BOSS_KEY:
mapIndex = SCENE_HIDAN;
break;
case RG_WATER_TEMPLE_MAP:
case RG_WATER_TEMPLE_COMPASS:
case RG_WATER_TEMPLE_SMALL_KEY:
case RG_WATER_TEMPLE_BOSS_KEY:
mapIndex = SCENE_MIZUSIN;
break;
case RG_SPIRIT_TEMPLE_MAP:
case RG_SPIRIT_TEMPLE_COMPASS:
case RG_SPIRIT_TEMPLE_SMALL_KEY:
case RG_SPIRIT_TEMPLE_BOSS_KEY:
mapIndex = SCENE_JYASINZOU;
break;
case RG_SHADOW_TEMPLE_MAP:
case RG_SHADOW_TEMPLE_COMPASS:
case RG_SHADOW_TEMPLE_SMALL_KEY:
case RG_SHADOW_TEMPLE_BOSS_KEY:
mapIndex = SCENE_HAKADAN;
break;
case RG_BOTTOM_OF_THE_WELL_MAP:
case RG_BOTTOM_OF_THE_WELL_COMPASS:
case RG_BOTTOM_OF_THE_WELL_SMALL_KEY:
mapIndex = SCENE_HAKADANCH;
break;
case RG_ICE_CAVERN_MAP:
case RG_ICE_CAVERN_COMPASS:
mapIndex = SCENE_ICE_DOUKUTO;
break;
case RG_GANONS_CASTLE_BOSS_KEY:
mapIndex = SCENE_GANON;
break;
case RG_GERUDO_TRAINING_GROUNDS_SMALL_KEY:
mapIndex = SCENE_MEN;
break;
case RG_GERUDO_FORTRESS_SMALL_KEY:
mapIndex = SCENE_GERUDOWAY;
break;
case RG_GANONS_CASTLE_SMALL_KEY:
mapIndex = SCENE_GANONTIKA;
break;
}
if ((item >= RG_FOREST_TEMPLE_SMALL_KEY) && (item <= RG_GANONS_CASTLE_SMALL_KEY)) {
if (gSaveContext.inventory.dungeonKeys[mapIndex] < 0) {
gSaveContext.inventory.dungeonKeys[mapIndex] = 1;
return RG_NONE;
} else {
gSaveContext.inventory.dungeonKeys[mapIndex]++;
return RG_NONE;
}
} else {
int bitmask;
if ((item >= RG_DEKU_TREE_MAP) && (item <= RG_ICE_CAVERN_MAP)) {
bitmask = gBitFlags[2];
} else if ((item >= RG_DEKU_TREE_COMPASS) && (item <= RG_ICE_CAVERN_COMPASS)) {
bitmask = gBitFlags[1];
} else {
bitmask = gBitFlags[0];
}
gSaveContext.inventory.dungeonItems[mapIndex] |= bitmask;
return RG_NONE;
}
}
temp = gSaveContext.inventory.items[slot];
osSyncPrintf("Item_Register(%d)=%d %d\n", slot, item, temp);
INV_CONTENT(item) = item;
return temp;
}
u8 Item_CheckObtainability(u8 item) { u8 Item_CheckObtainability(u8 item) {
s16 i; s16 i;
s16 slot = SLOT(item); s16 slot = SLOT(item);
@ -2365,11 +2377,11 @@ u8 Item_CheckObtainability(u8 item) {
} else { } else {
return ITEM_NONE; return ITEM_NONE;
} }
} else if ( } else if ( gSaveContext.n64ddFlag &&
(item >= ITEM_GERUDO_FORTRESS_SMALL_KEY) && (item <= ITEM_GANONS_CASTLE_SMALL_KEY) || ((item >= RG_GERUDO_FORTRESS_SMALL_KEY) && (item <= RG_GANONS_CASTLE_SMALL_KEY) ||
(item >= ITEM_FOREST_TEMPLE_BOSS_KEY) && (item <= ITEM_GANONS_CASTLE_BOSS_KEY) || (item >= RG_FOREST_TEMPLE_BOSS_KEY) && (item <= RG_GANONS_CASTLE_BOSS_KEY) ||
(item >= ITEM_DEKU_TREE_MAP) && (item <= ITEM_ICE_CAVERN_MAP) || (item >= RG_DEKU_TREE_MAP) && (item <= RG_ICE_CAVERN_MAP) ||
(item >= ITEM_DEKU_TREE_COMPASS) && (item <= ITEM_ICE_CAVERN_COMPASS) (item >= RG_DEKU_TREE_COMPASS) && (item <= RG_ICE_CAVERN_COMPASS))
) { ) {
return ITEM_NONE; return ITEM_NONE;
} else if ((item == ITEM_KEY_BOSS) || (item == ITEM_COMPASS) || (item == ITEM_DUNGEON_MAP)) { } else if ((item == ITEM_KEY_BOSS) || (item == ITEM_COMPASS) || (item == ITEM_DUNGEON_MAP)) {

View File

@ -201,8 +201,8 @@ void GivePlayerRandoRewardSongOfTime(GlobalContext* globalCtx, RandomizerCheck c
if (gSaveContext.entranceIndex == 0x050F && player != NULL && !Player_InBlockingCsMode(globalCtx, player) && if (gSaveContext.entranceIndex == 0x050F && player != NULL && !Player_InBlockingCsMode(globalCtx, player) &&
!Flags_GetTreasure(globalCtx, 0x1F) && gSaveContext.nextTransition == 0xFF) { !Flags_GetTreasure(globalCtx, 0x1F) && gSaveContext.nextTransition == 0xFF) {
GetItemID getItemId = Randomizer_GetItemIdFromKnownCheck(check, GI_SONG_OF_TIME); GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(check, RG_SONG_OF_TIME);
GiveItemWithoutActor(globalCtx, getItemId); GiveItemEntryWithoutActor(globalCtx, getItemEntry);
player->pendingFlag.flagID = 0x1F; player->pendingFlag.flagID = 0x1F;
player->pendingFlag.flagType = FLAG_SCENE_TREASURE; player->pendingFlag.flagType = FLAG_SCENE_TREASURE;
} }
@ -216,8 +216,8 @@ void GivePlayerRandoRewardNocturne(GlobalContext* globalCtx, RandomizerCheck che
gSaveContext.entranceIndex == 0x0195) && LINK_IS_ADULT && CHECK_QUEST_ITEM(QUEST_MEDALLION_FOREST) && gSaveContext.entranceIndex == 0x0195) && LINK_IS_ADULT && CHECK_QUEST_ITEM(QUEST_MEDALLION_FOREST) &&
CHECK_QUEST_ITEM(QUEST_MEDALLION_FIRE) && CHECK_QUEST_ITEM(QUEST_MEDALLION_WATER) && player != NULL && CHECK_QUEST_ITEM(QUEST_MEDALLION_FIRE) && CHECK_QUEST_ITEM(QUEST_MEDALLION_WATER) && player != NULL &&
!Player_InBlockingCsMode(globalCtx, player) && !Flags_GetEventChkInf(0xAA)) { !Player_InBlockingCsMode(globalCtx, player) && !Flags_GetEventChkInf(0xAA)) {
GetItemID getItemId = Randomizer_GetItemIdFromKnownCheck(check, GI_NOCTURNE_OF_SHADOW); GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(check, RG_NOCTURNE_OF_SHADOW);
GiveItemWithoutActor(globalCtx, getItemId); GiveItemEntryWithoutActor(globalCtx, getItemEntry);
Flags_SetEventChkInf(0xAA); Flags_SetEventChkInf(0xAA);
} }
} }
@ -228,8 +228,8 @@ void GivePlayerRandoRewardRequiem(GlobalContext* globalCtx, RandomizerCheck chec
if ((gSaveContext.gameMode == 0) && (gSaveContext.respawnFlag <= 0) && (gSaveContext.cutsceneIndex < 0xFFF0)) { if ((gSaveContext.gameMode == 0) && (gSaveContext.respawnFlag <= 0) && (gSaveContext.cutsceneIndex < 0xFFF0)) {
if ((gSaveContext.entranceIndex == 0x01E1) && !Flags_GetEventChkInf(0xAC) && player != NULL && if ((gSaveContext.entranceIndex == 0x01E1) && !Flags_GetEventChkInf(0xAC) && player != NULL &&
!Player_InBlockingCsMode(globalCtx, player)) { !Player_InBlockingCsMode(globalCtx, player)) {
GetItemID getItemId = Randomizer_GetItemIdFromKnownCheck(check, GI_SONG_OF_TIME); GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(check, RG_SONG_OF_TIME);
GiveItemWithoutActor(globalCtx, getItemId); GiveItemEntryWithoutActor(globalCtx, getItemEntry);
Flags_SetEventChkInf(0xAC); Flags_SetEventChkInf(0xAC);
} }
} }
@ -242,21 +242,22 @@ void GivePlayerRandoRewardZeldaLightArrowsGift(GlobalContext* globalCtx, Randomi
(gEntranceTable[((void)0, gSaveContext.entranceIndex)].scene == SCENE_TOKINOMA) && (gEntranceTable[((void)0, gSaveContext.entranceIndex)].scene == SCENE_TOKINOMA) &&
!Flags_GetTreasure(globalCtx, 0x1E) && player != NULL && !Player_InBlockingCsMode(globalCtx, player) && !Flags_GetTreasure(globalCtx, 0x1E) && player != NULL && !Player_InBlockingCsMode(globalCtx, player) &&
globalCtx->sceneLoadFlag == 0) { globalCtx->sceneLoadFlag == 0) {
GetItemID getItemId = Randomizer_GetItemIdFromKnownCheck(check, GI_ARROW_LIGHT); GetItemEntry getItem = Randomizer_GetItemFromKnownCheck(check, GI_ARROW_LIGHT);
GiveItemWithoutActor(globalCtx, getItemId); if (player->pendingFlag.flagType == FLAG_NONE && GiveItemEntryWithoutActor(globalCtx, getItem)) {
player->pendingFlag.flagID = 0x1E; player->pendingFlag.flagID = 0x1E;
player->pendingFlag.flagType = FLAG_SCENE_TREASURE; player->pendingFlag.flagType = FLAG_SCENE_TREASURE;
}
} }
} }
void GivePlayerRandoRewardSariaGift(GlobalContext* globalCtx, RandomizerCheck check) { void GivePlayerRandoRewardSariaGift(GlobalContext* globalCtx, RandomizerCheck check) {
Player* player = GET_PLAYER(globalCtx); Player* player = GET_PLAYER(globalCtx);
if (gSaveContext.entranceIndex == 0x05E0) { if (gSaveContext.entranceIndex == 0x05E0) {
GetItemID getItemId = Randomizer_GetItemIdFromKnownCheck(check, GI_ZELDAS_LULLABY); GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(check, RG_ZELDAS_LULLABY);
if ((!Flags_GetEventChkInf(0xC1) || (player->getItemId == getItemId && getItemId != GI_ICE_TRAP)) && if ((!Flags_GetEventChkInf(0xC1) || (player->getItemId == getItemEntry.getItemId && getItemEntry.getItemId != GI_ICE_TRAP)) &&
player != NULL && !Player_InBlockingCsMode(globalCtx, player)) { player != NULL && !Player_InBlockingCsMode(globalCtx, player)) {
GiveItemWithoutActor(globalCtx, getItemId); GiveItemEntryWithoutActor(globalCtx, getItemEntry);
Flags_SetEventChkInf(0xC1); Flags_SetEventChkInf(0xC1);
} }
} }

View File

@ -2,6 +2,7 @@
#include "vt.h" #include "vt.h"
#include <string.h> #include <string.h>
#include <soh/Enhancements/randomizer/randomizerTypes.h>
#define NUM_DUNGEONS 8 #define NUM_DUNGEONS 8
#define NUM_TRIALS 6 #define NUM_TRIALS 6
@ -307,11 +308,11 @@ void GiveLinkDekuNutUpgrade(GetItemID giid) {
} }
void GiveLinkMagic(GetItemID giid) { void GiveLinkMagic(GetItemID giid) {
if (giid == GI_SINGLE_MAGIC) { if (giid == RG_MAGIC_SINGLE) {
gSaveContext.magicLevel = 1; gSaveContext.magicLevel = 1;
gSaveContext.magicAcquired = true; gSaveContext.magicAcquired = true;
gSaveContext.doubleMagic = false; gSaveContext.doubleMagic = false;
} else if (giid == GI_DOUBLE_MAGIC) { } else if (giid == RG_MAGIC_DOUBLE) {
gSaveContext.magicLevel = 2; gSaveContext.magicLevel = 2;
gSaveContext.magicAcquired = true; gSaveContext.magicAcquired = true;
gSaveContext.doubleMagic = true; gSaveContext.doubleMagic = true;
@ -327,40 +328,40 @@ void GiveLinkSong(GetItemID getItemId) {
uint32_t bitMask; uint32_t bitMask;
switch (getItemId) { switch (getItemId) {
case GI_ZELDAS_LULLABY: case RG_ZELDAS_LULLABY:
bitMask = 1 << QUEST_SONG_LULLABY; bitMask = 1 << QUEST_SONG_LULLABY;
break; break;
case GI_SUNS_SONG: case RG_SUNS_SONG:
bitMask = 1 << QUEST_SONG_SUN; bitMask = 1 << QUEST_SONG_SUN;
break; break;
case GI_EPONAS_SONG: case RG_EPONAS_SONG:
bitMask = 1 << QUEST_SONG_EPONA; bitMask = 1 << QUEST_SONG_EPONA;
break; break;
case GI_SONG_OF_STORMS: case RG_SONG_OF_STORMS:
bitMask = 1 << QUEST_SONG_STORMS; bitMask = 1 << QUEST_SONG_STORMS;
break; break;
case GI_SONG_OF_TIME: case RG_SONG_OF_TIME:
bitMask = 1 << QUEST_SONG_TIME; bitMask = 1 << QUEST_SONG_TIME;
break; break;
case GI_SARIAS_SONG: case RG_SARIAS_SONG:
bitMask = 1 << QUEST_SONG_SARIA; bitMask = 1 << QUEST_SONG_SARIA;
break; break;
case GI_MINUET_OF_FOREST: case RG_MINUET_OF_FOREST:
bitMask = 1 << QUEST_SONG_MINUET; bitMask = 1 << QUEST_SONG_MINUET;
break; break;
case GI_BOLERO_OF_FIRE: case RG_BOLERO_OF_FIRE:
bitMask = 1 << QUEST_SONG_BOLERO; bitMask = 1 << QUEST_SONG_BOLERO;
break; break;
case GI_SERENADE_OF_WATER: case RG_SERENADE_OF_WATER:
bitMask = 1 << QUEST_SONG_SERENADE; bitMask = 1 << QUEST_SONG_SERENADE;
break; break;
case GI_NOCTURNE_OF_SHADOW: case RG_NOCTURNE_OF_SHADOW:
bitMask = 1 << QUEST_SONG_NOCTURNE; bitMask = 1 << QUEST_SONG_NOCTURNE;
break; break;
case GI_REQUIEM_OF_SPIRIT: case RG_REQUIEM_OF_SPIRIT:
bitMask = 1 << QUEST_SONG_REQUIEM; bitMask = 1 << QUEST_SONG_REQUIEM;
break; break;
case GI_PRELUDE_OF_LIGHT: case RG_PRELUDE_OF_LIGHT:
bitMask = 1 << QUEST_SONG_PRELUDE; bitMask = 1 << QUEST_SONG_PRELUDE;
break; break;
} }
@ -368,43 +369,43 @@ void GiveLinkSong(GetItemID getItemId) {
gSaveContext.inventory.questItems |= bitMask; gSaveContext.inventory.questItems |= bitMask;
} }
void GiveLinkDungeonReward(GetItemID getItemId) { void GiveLinkDungeonReward(uint16_t getItemId) {
s16 item; s16 item;
u8 medallion = 0; u8 medallion = 0;
switch (getItemId) { switch (getItemId) {
case GI_MEDALLION_FOREST: case RG_FOREST_MEDALLION:
item = ITEM_MEDALLION_FOREST; item = ITEM_MEDALLION_FOREST;
medallion = 1; medallion = 1;
break; break;
case GI_MEDALLION_FIRE: case RG_FIRE_MEDALLION:
item = ITEM_MEDALLION_FIRE; item = ITEM_MEDALLION_FIRE;
medallion = 1; medallion = 1;
break; break;
case GI_MEDALLION_WATER: case RG_WATER_MEDALLION:
item = ITEM_MEDALLION_WATER; item = ITEM_MEDALLION_WATER;
medallion = 1; medallion = 1;
break; break;
case GI_MEDALLION_SHADOW: case RG_SHADOW_MEDALLION:
item = ITEM_MEDALLION_SHADOW; item = ITEM_MEDALLION_SHADOW;
medallion = 1; medallion = 1;
break; break;
case GI_MEDALLION_SPIRIT: case RG_SPIRIT_MEDALLION:
item = ITEM_MEDALLION_SPIRIT; item = ITEM_MEDALLION_SPIRIT;
medallion = 1; medallion = 1;
break; break;
case GI_MEDALLION_LIGHT: case RG_LIGHT_MEDALLION:
item = ITEM_MEDALLION_LIGHT; item = ITEM_MEDALLION_LIGHT;
medallion = 1; medallion = 1;
break; break;
case GI_STONE_KOKIRI: case RG_KOKIRI_EMERALD:
item = ITEM_KOKIRI_EMERALD; item = ITEM_KOKIRI_EMERALD;
break; break;
case GI_STONE_GORON: case RG_GORON_RUBY:
item = ITEM_GORON_RUBY; item = ITEM_GORON_RUBY;
break; break;
case GI_STONE_ZORA: case RG_ZORA_SAPPHIRE:
item = ITEM_ZORA_SAPPHIRE; item = ITEM_ZORA_SAPPHIRE;
break; break;
} }
@ -420,72 +421,72 @@ void GiveLinkDungeonItem(GetItemID getItemId) {
int mapIndex; int mapIndex;
switch (getItemId) { switch (getItemId) {
case GI_DEKU_TREE_MAP: case RG_DEKU_TREE_MAP:
case GI_DEKU_TREE_COMPASS: case RG_DEKU_TREE_COMPASS:
mapIndex = SCENE_YDAN; mapIndex = SCENE_YDAN;
break; break;
case GI_DODONGOS_CAVERN_MAP: case RG_DODONGOS_CAVERN_MAP:
case GI_DODONGOS_CAVERN_COMPASS: case RG_DODONGOS_CAVERN_COMPASS:
mapIndex = SCENE_DDAN; mapIndex = SCENE_DDAN;
break; break;
case GI_JABU_JABUS_BELLY_MAP: case RG_JABU_JABUS_BELLY_MAP:
case GI_JABU_JABUS_BELLY_COMPASS: case RG_JABU_JABUS_BELLY_COMPASS:
mapIndex = SCENE_BDAN; mapIndex = SCENE_BDAN;
break; break;
case GI_FOREST_TEMPLE_MAP: case RG_FOREST_TEMPLE_MAP:
case GI_FOREST_TEMPLE_COMPASS: case RG_FOREST_TEMPLE_COMPASS:
case GI_FOREST_TEMPLE_SMALL_KEY: case RG_FOREST_TEMPLE_SMALL_KEY:
case GI_FOREST_TEMPLE_BOSS_KEY: case RG_FOREST_TEMPLE_BOSS_KEY:
mapIndex = SCENE_BMORI1; mapIndex = SCENE_BMORI1;
break; break;
case GI_FIRE_TEMPLE_MAP: case RG_FIRE_TEMPLE_MAP:
case GI_FIRE_TEMPLE_COMPASS: case RG_FIRE_TEMPLE_COMPASS:
case GI_FIRE_TEMPLE_SMALL_KEY: case RG_FIRE_TEMPLE_SMALL_KEY:
case GI_FIRE_TEMPLE_BOSS_KEY: case RG_FIRE_TEMPLE_BOSS_KEY:
mapIndex = SCENE_HIDAN; mapIndex = SCENE_HIDAN;
break; break;
case GI_WATER_TEMPLE_MAP: case RG_WATER_TEMPLE_MAP:
case GI_WATER_TEMPLE_COMPASS: case RG_WATER_TEMPLE_COMPASS:
case GI_WATER_TEMPLE_SMALL_KEY: case RG_WATER_TEMPLE_SMALL_KEY:
case GI_WATER_TEMPLE_BOSS_KEY: case RG_WATER_TEMPLE_BOSS_KEY:
mapIndex = SCENE_MIZUSIN; mapIndex = SCENE_MIZUSIN;
break; break;
case GI_SPIRIT_TEMPLE_MAP: case RG_SPIRIT_TEMPLE_MAP:
case GI_SPIRIT_TEMPLE_COMPASS: case RG_SPIRIT_TEMPLE_COMPASS:
case GI_SPIRIT_TEMPLE_SMALL_KEY: case RG_SPIRIT_TEMPLE_SMALL_KEY:
case GI_SPIRIT_TEMPLE_BOSS_KEY: case RG_SPIRIT_TEMPLE_BOSS_KEY:
mapIndex = SCENE_JYASINZOU; mapIndex = SCENE_JYASINZOU;
break; break;
case GI_SHADOW_TEMPLE_MAP: case RG_SHADOW_TEMPLE_MAP:
case GI_SHADOW_TEMPLE_COMPASS: case RG_SHADOW_TEMPLE_COMPASS:
case GI_SHADOW_TEMPLE_SMALL_KEY: case RG_SHADOW_TEMPLE_SMALL_KEY:
case GI_SHADOW_TEMPLE_BOSS_KEY: case RG_SHADOW_TEMPLE_BOSS_KEY:
mapIndex = SCENE_HAKADAN; mapIndex = SCENE_HAKADAN;
break; break;
case GI_BOTTOM_OF_THE_WELL_MAP: case RG_BOTTOM_OF_THE_WELL_MAP:
case GI_BOTTOM_OF_THE_WELL_COMPASS: case RG_BOTTOM_OF_THE_WELL_COMPASS:
case GI_BOTTOM_OF_THE_WELL_SMALL_KEY: case RG_BOTTOM_OF_THE_WELL_SMALL_KEY:
mapIndex = SCENE_HAKADANCH; mapIndex = SCENE_HAKADANCH;
break; break;
case GI_ICE_CAVERN_MAP: case RG_ICE_CAVERN_MAP:
case GI_ICE_CAVERN_COMPASS: case RG_ICE_CAVERN_COMPASS:
mapIndex = SCENE_ICE_DOUKUTO; mapIndex = SCENE_ICE_DOUKUTO;
break; break;
case GI_GANONS_CASTLE_BOSS_KEY: case RG_GANONS_CASTLE_BOSS_KEY:
mapIndex = SCENE_GANON; mapIndex = SCENE_GANON;
break; break;
case GI_GERUDO_TRAINING_GROUNDS_SMALL_KEY: case RG_GERUDO_TRAINING_GROUNDS_SMALL_KEY:
mapIndex = SCENE_MEN; mapIndex = SCENE_MEN;
break; break;
case GI_GERUDO_FORTRESS_SMALL_KEY: case RG_GERUDO_FORTRESS_SMALL_KEY:
mapIndex = SCENE_GERUDOWAY; mapIndex = SCENE_GERUDOWAY;
break; break;
case GI_GANONS_CASTLE_SMALL_KEY: case RG_GANONS_CASTLE_SMALL_KEY:
mapIndex = SCENE_GANONTIKA; mapIndex = SCENE_GANONTIKA;
break; break;
} }
if ((getItemId >= GI_GERUDO_FORTRESS_SMALL_KEY) && (getItemId <= GI_GANONS_CASTLE_SMALL_KEY)) { if ((getItemId >= RG_GERUDO_FORTRESS_SMALL_KEY) && (getItemId <= RG_GANONS_CASTLE_SMALL_KEY)) {
if (gSaveContext.inventory.dungeonKeys[mapIndex] < 0) { if (gSaveContext.inventory.dungeonKeys[mapIndex] < 0) {
gSaveContext.inventory.dungeonKeys[mapIndex] = 1; gSaveContext.inventory.dungeonKeys[mapIndex] = 1;
} else { } else {
@ -493,9 +494,9 @@ void GiveLinkDungeonItem(GetItemID getItemId) {
} }
} else { } else {
int bitmask; int bitmask;
if ((getItemId >= GI_DEKU_TREE_MAP) && (getItemId <= GI_ICE_CAVERN_MAP)) { if ((getItemId >= RG_DEKU_TREE_MAP) && (getItemId <= RG_ICE_CAVERN_MAP)) {
bitmask = gBitFlags[2]; bitmask = gBitFlags[2];
} else if ((getItemId >= GI_DEKU_TREE_COMPASS) && (getItemId <= GI_ICE_CAVERN_COMPASS)) { } else if ((getItemId >= RG_DEKU_TREE_COMPASS) && (getItemId <= RG_ICE_CAVERN_COMPASS)) {
bitmask = gBitFlags[1]; bitmask = gBitFlags[1];
} else { } else {
bitmask = gBitFlags[0]; bitmask = gBitFlags[0];
@ -506,9 +507,9 @@ void GiveLinkDungeonItem(GetItemID getItemId) {
} }
void GiveLinksPocketMedallion() { void GiveLinksPocketMedallion() {
GetItemID getItemId = Randomizer_GetItemIdFromKnownCheck(RC_LINKS_POCKET, RG_NONE); GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(RC_LINKS_POCKET, RG_NONE);
GiveLinkDungeonReward(getItemId); GiveLinkDungeonReward(getItemEntry.getItemId);
} }
/** /**
@ -795,102 +796,73 @@ void Sram_InitSave(FileChooseContext* fileChooseCtx) {
} }
if(Randomizer_GetSettingValue(RSK_SKIP_CHILD_ZELDA)) { if(Randomizer_GetSettingValue(RSK_SKIP_CHILD_ZELDA)) {
s32 giid = Randomizer_GetItemIdFromKnownCheck(RC_SONG_FROM_IMPA, GI_ZELDAS_LULLABY); GetItemEntry getItem = Randomizer_GetItemFromKnownCheck(RC_SONG_FROM_IMPA, RG_ZELDAS_LULLABY);
s32 giid = getItem.getItemId;
if(giid >= GI_ZELDAS_LULLABY && giid <= GI_PRELUDE_OF_LIGHT) {
GiveLinkSong(giid); if (getItem.modIndex == MOD_NONE) {
} else if (giid == GI_RUPEE_GREEN || if(getItem.itemId >= ITEM_KOKIRI_EMERALD && getItem.itemId <= ITEM_MEDALLION_LIGHT) {
giid == GI_RUPEE_BLUE || GiveLinkDungeonReward(getItem.getItemId);
giid == GI_RUPEE_RED || } else if (giid == GI_RUPEE_GREEN || giid == GI_RUPEE_BLUE || giid == GI_RUPEE_RED ||
giid == GI_RUPEE_PURPLE || giid == GI_RUPEE_PURPLE || giid == GI_RUPEE_GOLD) {
giid == GI_RUPEE_GOLD) { GiveLinkRupeesByGetItemId(giid);
GiveLinkRupeesByGetItemId(giid); } else if (giid == GI_BOMBCHUS_10 || giid == GI_BOMBCHUS_5 || giid == GI_BOMBCHUS_20) {
} else if (giid == GI_BOMBCHUS_10 || GiveLinkBombchus(giid);
giid == GI_BOMBCHUS_5 || } else if (giid == GI_STICKS_1 || giid == GI_STICKS_5 || giid == GI_STICKS_10) {
giid == GI_BOMBCHUS_20) { GiveLinkDekuSticksByGetItemId(giid);
GiveLinkBombchus(giid); } else if (giid == GI_NUTS_5 || giid == GI_NUTS_10) {
} else if (giid == GI_STICKS_1 || GiveLinkDekuNutsByGetItemId(giid);
giid == GI_STICKS_5 || } else if (giid == GI_BEAN) {
giid == GI_STICKS_10) { GiveLinkBeans();
GiveLinkDekuSticksByGetItemId(giid); } else if (giid == GI_SWORD_KOKIRI) {
} else if (giid == GI_NUTS_5 || GiveLinkKokiriSword();
giid == GI_NUTS_10) { } else if (giid == GI_SWORD_BGS) {
GiveLinkDekuNutsByGetItemId(giid); GiveLinkBiggoronSword();
} else if (giid == GI_BEAN) { } else if (giid == GI_SWORD_KNIFE) {
GiveLinkBeans(); GiveLinkGiantsKnife();
} else if (giid >= GI_MEDALLION_LIGHT && giid <= GI_STONE_ZORA) { } else if (giid == GI_SHIELD_DEKU) {
GiveLinkDungeonReward(giid); GiveLinkDekuShield();
} else if (giid == GI_SWORD_KOKIRI) { } else if (giid == GI_SHIELD_HYLIAN) {
GiveLinkKokiriSword(); GiveLinkHylianShield();
} else if (giid == GI_SWORD_BGS) { } else if (giid == GI_SHIELD_MIRROR) {
GiveLinkBiggoronSword(); GiveLinkMirrorShield();
} else if (giid == GI_SWORD_KNIFE) { } else if (giid == GI_TUNIC_GORON) {
GiveLinkGiantsKnife(); GiveLinkGoronTunic();
} else if (giid == GI_SHIELD_DEKU) { } else if (giid == GI_TUNIC_ZORA) {
GiveLinkDekuShield(); GiveLinkZoraTunic();
} else if (giid == GI_SHIELD_HYLIAN) { } else if (giid == GI_BOOTS_IRON) {
GiveLinkHylianShield(); GiveLinkIronBoots();
} else if (giid == GI_SHIELD_MIRROR) { } else if (giid == GI_BOOTS_HOVER) {
GiveLinkMirrorShield(); GiveLinkHoverBoots();
} else if (giid == GI_TUNIC_GORON) { } else if (giid == GI_SLINGSHOT || giid == GI_BULLET_BAG_40 || giid == GI_BULLET_BAG_50) {
GiveLinkGoronTunic(); GiveLinkBulletBagUpgrade(giid);
} else if (giid == GI_TUNIC_ZORA) { } else if (giid == GI_BOW || giid == GI_QUIVER_40 || giid == GI_QUIVER_50) {
GiveLinkZoraTunic(); GiveLinkQuiverUpgrade(giid);
} else if (giid == GI_BOOTS_IRON) { } else if (giid == GI_BOMB_BAG_20 || giid == GI_BOMB_BAG_30 || giid == GI_BOMB_BAG_40) {
GiveLinkIronBoots(); GiveLinkBombBagUpgrade(giid);
} else if (giid == GI_BOOTS_HOVER) { } else if (giid == GI_BRACELET || giid == GI_GAUNTLETS_SILVER || giid == GI_GAUNTLETS_GOLD) {
GiveLinkHoverBoots(); GiveLinkStrengthUpgrade(giid);
} else if (giid == GI_SLINGSHOT || } else if (giid == GI_SCALE_SILVER || giid == GI_SCALE_GOLD) {
giid == GI_BULLET_BAG_40 || GiveLinkScaleUpgrade(giid);
giid == GI_BULLET_BAG_50) { } else if (giid == GI_WALLET_ADULT || giid == GI_WALLET_GIANT) {
GiveLinkBulletBagUpgrade(giid); GiveLinkWalletUpgrade(giid);
} else if (giid == GI_BOW || } else if (giid == GI_STONE_OF_AGONY) {
giid == GI_QUIVER_40 || GiveLinkStoneOfAgony();
giid == GI_QUIVER_50) { } else if (giid == GI_GERUDO_CARD) {
GiveLinkQuiverUpgrade(giid); GiveLinkGerudoCard();
} else if (giid == GI_BOMB_BAG_20 || } else if (giid == GI_HEART_PIECE) {
giid == GI_BOMB_BAG_30 || GiveLinkPieceOfHeart();
giid == GI_BOMB_BAG_40) { } else if (giid == GI_HEART_CONTAINER) {
GiveLinkBombBagUpgrade(giid); GiveLinkHeartContainer();
} else if (giid == GI_BRACELET || } else if (giid == GI_STICK_UPGRADE_20 || giid == GI_STICK_UPGRADE_30) {
giid == GI_GAUNTLETS_SILVER || GiveLinkDekuStickUpgrade(giid);
giid == GI_GAUNTLETS_GOLD) { } else if (giid == GI_NUT_UPGRADE_30 || giid == GI_NUT_UPGRADE_40) {
GiveLinkStrengthUpgrade(giid); GiveLinkDekuNutUpgrade(giid);
} else if (giid == GI_SCALE_SILVER || } else {
giid == GI_SCALE_GOLD) { s32 iid = getItem.itemId;
GiveLinkScaleUpgrade(giid); if (iid != -1) INV_CONTENT(iid) = iid;
} else if (giid == GI_WALLET_ADULT || }
giid == GI_WALLET_GIANT) { } else if (getItem.modIndex == MOD_RANDOMIZER) {
GiveLinkWalletUpgrade(giid); Randomizer_Item_Give(NULL, getItem);
} else if (giid == GI_STONE_OF_AGONY) {
GiveLinkStoneOfAgony();
} else if (giid == GI_GERUDO_CARD) {
GiveLinkGerudoCard();
} else if (giid == GI_HEART_PIECE) {
GiveLinkPieceOfHeart();
} else if (giid == GI_HEART_CONTAINER) {
GiveLinkHeartContainer();
} else if (giid == GI_STICK_UPGRADE_20 ||
giid == GI_STICK_UPGRADE_30) {
GiveLinkDekuStickUpgrade(giid);
} else if (giid == GI_NUT_UPGRADE_30 ||
giid == GI_NUT_UPGRADE_40) {
GiveLinkDekuNutUpgrade(giid);
} else if (giid == GI_SINGLE_MAGIC ||
giid == GI_DOUBLE_MAGIC) {
GiveLinkMagic(giid);
} else if (giid == GI_DOUBLE_DEFENSE) {
GiveLinkDoubleDefense();
} else if (
(giid >= GI_GERUDO_FORTRESS_SMALL_KEY && giid <= GI_GANONS_CASTLE_SMALL_KEY) ||
(giid >= GI_FOREST_TEMPLE_BOSS_KEY && giid <= GI_GANONS_CASTLE_BOSS_KEY) ||
(giid >= GI_DEKU_TREE_MAP && giid <= GI_ICE_CAVERN_MAP) ||
(giid >= GI_DEKU_TREE_COMPASS && giid <= GI_ICE_CAVERN_COMPASS)
) {
GiveLinkDungeonItem(giid);
} else {
s32 iid = Randomizer_GetItemIDFromGetItemID(giid);
if (iid != -1) INV_CONTENT(iid) = iid;
} }
// malon/talon back at ranch // malon/talon back at ranch

View File

@ -70,14 +70,14 @@ const ActorInit Bg_Dy_Yoseizo_InitVars = {
void GivePlayerRandoRewardGreatFairy(BgDyYoseizo* this, GlobalContext* globalCtx) { void GivePlayerRandoRewardGreatFairy(BgDyYoseizo* this, GlobalContext* globalCtx) {
Player* player = GET_PLAYER(globalCtx); Player* player = GET_PLAYER(globalCtx);
GetItemID getItemId = Randomizer_GetRandomizedItemId(GI_NONE, this->actor.id, this->fountainType + 1, globalCtx->sceneNum); GetItemEntry getItemEntry = Randomizer_GetRandomizedItem(GI_NONE, this->actor.id, this->fountainType + 1, globalCtx->sceneNum);
if (this->actor.parent == GET_PLAYER(globalCtx) && !Flags_GetTreasure(globalCtx, this->fountainType + 1) && if (this->actor.parent == GET_PLAYER(globalCtx) && !Flags_GetTreasure(globalCtx, this->fountainType + 1) &&
!Player_InBlockingCsMode(globalCtx, GET_PLAYER(globalCtx))) { !Player_InBlockingCsMode(globalCtx, GET_PLAYER(globalCtx))) {
Flags_SetTreasure(globalCtx, this->fountainType + 1); Flags_SetTreasure(globalCtx, this->fountainType + 1);
Actor_Kill(&this->actor); Actor_Kill(&this->actor);
} else if (!Flags_GetTreasure(globalCtx, this->fountainType + 1)) { } else if (!Flags_GetTreasure(globalCtx, this->fountainType + 1)) {
func_8002F434(&this->actor, globalCtx, getItemId, 10000.0f, 100.0f); GiveItemEntryFromActor(&this->actor, globalCtx, getItemEntry, 10000.0f, 100.0f);
} }
} }

View File

@ -2087,8 +2087,8 @@ void DemoEffect_DrawGetItem(Actor* thisx, GlobalContext* globalCtx) {
return; return;
} }
if (gSaveContext.n64ddFlag && globalCtx->sceneNum == SCENE_BDAN) { if (gSaveContext.n64ddFlag && globalCtx->sceneNum == SCENE_BDAN) {
GetItemID getItemID = Randomizer_GetItemIdFromKnownCheck(RC_BARINADE, RG_ZORA_SAPPHIRE); GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(RC_BARINADE, RG_ZORA_SAPPHIRE);
this->getItem.drawId = Randomizer_GetItemModelFromId(getItemID); this->getItem.drawId = getItemEntry.gid;
} }
func_8002EBCC(thisx, globalCtx, 0); func_8002EBCC(thisx, globalCtx, 0);
func_8002ED80(thisx, globalCtx, 0); func_8002ED80(thisx, globalCtx, 0);

View File

@ -899,13 +899,13 @@ void func_80986BF8(DemoIm* this, GlobalContext* globalCtx) {
} }
void GivePlayerRandoRewardImpa(Actor* impa, GlobalContext* globalCtx, RandomizerCheck check) { void GivePlayerRandoRewardImpa(Actor* impa, GlobalContext* globalCtx, RandomizerCheck check) {
GetItemID getItemId = Randomizer_GetItemIdFromKnownCheck(check, GI_ZELDAS_LULLABY); GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(check, RG_ZELDAS_LULLABY);
if (impa->parent != NULL && impa->parent->id == GET_PLAYER(globalCtx)->actor.id && if (impa->parent != NULL && impa->parent->id == GET_PLAYER(globalCtx)->actor.id &&
!Flags_GetTreasure(globalCtx, 0x1F)) { !Flags_GetTreasure(globalCtx, 0x1F)) {
Flags_SetTreasure(globalCtx, 0x1F); Flags_SetTreasure(globalCtx, 0x1F);
} else if (!Flags_GetTreasure(globalCtx, 0x1F) && !Randomizer_GetSettingValue(RSK_SKIP_CHILD_ZELDA)) { } else if (!Flags_GetTreasure(globalCtx, 0x1F) && !Randomizer_GetSettingValue(RSK_SKIP_CHILD_ZELDA)) {
func_8002F434(impa, globalCtx, getItemId, 75.0f, 50.0f); GiveItemEntryFromActor(impa, globalCtx, getItemEntry, 75.0f, 50.0f);
} else if (!Player_InBlockingCsMode(globalCtx, GET_PLAYER(globalCtx))) { } else if (!Player_InBlockingCsMode(globalCtx, GET_PLAYER(globalCtx))) {
gSaveContext.eventChkInf[5] |= 0x200; gSaveContext.eventChkInf[5] |= 0x200;
globalCtx->sceneLoadFlag = 0x14; globalCtx->sceneLoadFlag = 0x14;

View File

@ -462,13 +462,13 @@ s32 DoorWarp1_PlayerInRange(DoorWarp1* this, GlobalContext* globalCtx) {
} }
void GivePlayerRandoReward(DoorWarp1* this, Player* player, GlobalContext* globalCtx, u8 ruto, u8 adult) { void GivePlayerRandoReward(DoorWarp1* this, Player* player, GlobalContext* globalCtx, u8 ruto, u8 adult) {
GetItemID getItemId = Randomizer_GetRandomizedItemId(GI_NONE, this->actor.id, this->actor.params, globalCtx->sceneNum); GetItemEntry getItemEntry = Randomizer_GetRandomizedItem(GI_NONE, this->actor.id, this->actor.params, globalCtx->sceneNum);
if (this->actor.parent != NULL && this->actor.parent->id == GET_PLAYER(globalCtx)->actor.id && if (this->actor.parent != NULL && this->actor.parent->id == GET_PLAYER(globalCtx)->actor.id &&
!Flags_GetTreasure(globalCtx, 0x1F)) { !Flags_GetTreasure(globalCtx, 0x1F)) {
Flags_SetTreasure(globalCtx, 0x1F); Flags_SetTreasure(globalCtx, 0x1F);
} else if (!Flags_GetTreasure(globalCtx, 0x1F)) { } else if (!Flags_GetTreasure(globalCtx, 0x1F)) {
func_8002F434(&this->actor, globalCtx, getItemId, 10000.0f, 100.0f); GiveItemEntryFromActor(&this->actor, globalCtx, getItemEntry, 10000.0f, 100.0f);
} else if (!Player_InBlockingCsMode(globalCtx, GET_PLAYER(globalCtx))) { } else if (!Player_InBlockingCsMode(globalCtx, GET_PLAYER(globalCtx))) {
if (adult) { if (adult) {
OnePointCutscene_Init(globalCtx, 0x25E8, 999, &this->actor, MAIN_CAM); OnePointCutscene_Init(globalCtx, 0x25E8, 999, &this->actor, MAIN_CAM);

View File

@ -126,11 +126,11 @@ void func_809B0558(EnAni* this, GlobalContext* globalCtx) {
} }
gSaveContext.itemGetInf[1] |= 0x20; gSaveContext.itemGetInf[1] |= 0x20;
} else { } else {
if (gSaveContext.n64ddFlag) { if (!gSaveContext.n64ddFlag) {
s32 getItemId = Randomizer_GetItemIdFromKnownCheck(RC_KAK_MAN_ON_ROOF, GI_HEART_PIECE);
func_8002F434(&this->actor, globalCtx, getItemId, 10000.0f, 200.0f);
} else {
func_8002F434(&this->actor, globalCtx, GI_HEART_PIECE, 10000.0f, 200.0f); func_8002F434(&this->actor, globalCtx, GI_HEART_PIECE, 10000.0f, 200.0f);
} else {
GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(RC_KAK_MAN_ON_ROOF, GI_HEART_PIECE);
GiveItemEntryFromActor(&this->actor, globalCtx, getItemEntry, 10000.0f, 200.0f);
} }
} }
} }
@ -140,11 +140,11 @@ void func_809B05F0(EnAni* this, GlobalContext* globalCtx) {
EnAni_SetupAction(this, func_809B0558); EnAni_SetupAction(this, func_809B0558);
} }
if (gSaveContext.n64ddFlag) { if (!gSaveContext.n64ddFlag) {
s32 getItemId = Randomizer_GetItemIdFromKnownCheck(RC_KAK_MAN_ON_ROOF, GI_HEART_PIECE);
func_8002F434(&this->actor, globalCtx, getItemId, 10000.0f, 200.0f);
} else {
func_8002F434(&this->actor, globalCtx, GI_HEART_PIECE, 10000.0f, 200.0f); func_8002F434(&this->actor, globalCtx, GI_HEART_PIECE, 10000.0f, 200.0f);
} else {
GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(RC_KAK_MAN_ON_ROOF, GI_HEART_PIECE);
GiveItemEntryFromActor(&this->actor, globalCtx, getItemEntry, 10000.0f, 200.0f);
} }
} }

View File

@ -177,6 +177,7 @@ void EnBomBowlPit_GivePrize(EnBomBowlPit* this, GlobalContext* globalCtx) {
func_8002DF54(globalCtx, NULL, 7); func_8002DF54(globalCtx, NULL, 7);
this->getItemId = sGetItemIds[this->prizeIndex]; this->getItemId = sGetItemIds[this->prizeIndex];
this->getItemEntry = (GetItemEntry)GET_ITEM_NONE;
if ((this->getItemId == GI_BOMB_BAG_30) && (CUR_CAPACITY(UPG_BOMB_BAG) == 30)) { if ((this->getItemId == GI_BOMB_BAG_30) && (CUR_CAPACITY(UPG_BOMB_BAG) == 30)) {
this->getItemId = GI_BOMB_BAG_40; this->getItemId = GI_BOMB_BAG_40;
@ -185,22 +186,27 @@ void EnBomBowlPit_GivePrize(EnBomBowlPit* this, GlobalContext* globalCtx) {
if (gSaveContext.n64ddFlag) { if (gSaveContext.n64ddFlag) {
switch (this->prizeIndex) { switch (this->prizeIndex) {
case EXITEM_BOMB_BAG_BOWLING: case EXITEM_BOMB_BAG_BOWLING:
this->getItemId = this->getItemEntry = Randomizer_GetItemFromKnownCheck(RC_MARKET_BOMBCHU_BOWLING_FIRST_PRIZE, GI_BOMB_BAG_20);
Randomizer_GetItemIdFromKnownCheck(RC_MARKET_BOMBCHU_BOWLING_FIRST_PRIZE, GI_BOMB_BAG_20); this->getItemId = this->getItemEntry.getItemId;
break; break;
case EXITEM_HEART_PIECE_BOWLING: case EXITEM_HEART_PIECE_BOWLING:
this->getItemId = this->getItemEntry = Randomizer_GetItemFromKnownCheck(RC_MARKET_BOMBCHU_BOWLING_SECOND_PRIZE, GI_HEART_PIECE);
Randomizer_GetItemIdFromKnownCheck(RC_MARKET_BOMBCHU_BOWLING_SECOND_PRIZE, GI_HEART_PIECE); this->getItemId = this->getItemEntry.getItemId;
break; break;
case EXITEM_BOMBCHUS_BOWLING: case EXITEM_BOMBCHUS_BOWLING:
this->getItemId = Randomizer_GetItemIdFromKnownCheck(RC_MARKET_BOMBCHU_BOWLING_BOMBCHUS, GI_BOMBCHUS_10); this->getItemEntry = Randomizer_GetItemFromKnownCheck(RC_MARKET_BOMBCHU_BOWLING_BOMBCHUS, GI_BOMBCHUS_10);
this->getItemId = this->getItemEntry.getItemId;
break; break;
} }
} }
player->stateFlags1 &= ~0x20000000; player->stateFlags1 &= ~0x20000000;
this->actor.parent = NULL; this->actor.parent = NULL;
func_8002F434(&this->actor, globalCtx, this->getItemId, 2000.0f, 1000.0f); if (!gSaveContext.n64ddFlag || this->getItemEntry.getItemId == GI_NONE) {
func_8002F434(&this->actor, globalCtx, this->getItemId, 2000.0f, 1000.0f);
} else {
GiveItemEntryFromActor(&this->actor, globalCtx, this->getItemEntry, 2000.0f, 1000.0f);
}
player->stateFlags1 |= 0x20000000; player->stateFlags1 |= 0x20000000;
this->actionFunc = EnBomBowlPit_WaitTillPrizeGiven; this->actionFunc = EnBomBowlPit_WaitTillPrizeGiven;
} }
@ -209,7 +215,11 @@ void EnBomBowlPit_WaitTillPrizeGiven(EnBomBowlPit* this, GlobalContext* globalCt
if (Actor_HasParent(&this->actor, globalCtx)) { if (Actor_HasParent(&this->actor, globalCtx)) {
this->actionFunc = EnBomBowlPit_Reset; this->actionFunc = EnBomBowlPit_Reset;
} else { } else {
func_8002F434(&this->actor, globalCtx, this->getItemId, 2000.0f, 1000.0f); if (!gSaveContext.n64ddFlag || this->getItemEntry.getItemId == GI_NONE) {
func_8002F434(&this->actor, globalCtx, this->getItemId, 2000.0f, 1000.0f);
} else {
GiveItemEntryFromActor(&this->actor, globalCtx, this->getItemEntry, 2000.0f, 1000.0f);
}
} }
} }

View File

@ -33,6 +33,7 @@ typedef struct EnBomBowlPit {
/* 0x01D4 */ Vec3f unk_1D4; // camera eye (maxsteps) /* 0x01D4 */ Vec3f unk_1D4; // camera eye (maxsteps)
/* 0x01E0 */ EnExItem* exItem; /* 0x01E0 */ EnExItem* exItem;
/* 0x01E4 */ char unk_1E4[0x3520]; /* 0x01E4 */ char unk_1E4[0x3520];
/* */ GetItemEntry getItemEntry;
} EnBomBowlPit; // size = 0x3704 } EnBomBowlPit; // size = 0x3704
#endif #endif

View File

@ -70,6 +70,7 @@ static InitChainEntry sInitChain[] = {
}; };
static UNK_TYPE sUnused; static UNK_TYPE sUnused;
GetItemEntry sItem;
void EnBox_SetupAction(EnBox* this, EnBoxActionFunc actionFunc) { void EnBox_SetupAction(EnBox* this, EnBoxActionFunc actionFunc) {
this->actionFunc = actionFunc; this->actionFunc = actionFunc;
@ -445,40 +446,47 @@ void EnBox_WaitOpen(EnBox* this, GlobalContext* globalCtx) {
func_8002DBD0(&this->dyna.actor, &sp4C, &player->actor.world.pos); func_8002DBD0(&this->dyna.actor, &sp4C, &player->actor.world.pos);
if (sp4C.z > -50.0f && sp4C.z < 0.0f && fabsf(sp4C.y) < 10.0f && fabsf(sp4C.x) < 20.0f && if (sp4C.z > -50.0f && sp4C.z < 0.0f && fabsf(sp4C.y) < 10.0f && fabsf(sp4C.x) < 20.0f &&
Player_IsFacingActor(&this->dyna.actor, 0x3000, globalCtx)) { Player_IsFacingActor(&this->dyna.actor, 0x3000, globalCtx)) {
int32_t item = Randomizer_GetRandomizedItemId(this->dyna.actor.params >> 5 & 0x7F, this->dyna.actor.id, this->dyna.actor.params, globalCtx->sceneNum); sItem = Randomizer_GetRandomizedItem(this->dyna.actor.params >> 5 & 0x7F, this->dyna.actor.id, this->dyna.actor.params, globalCtx->sceneNum);
GetItemEntry blueRupee = ItemTable_RetrieveEntry(MOD_NONE, GI_RUPEE_BLUE);
// RANDOTODO treasure chest game rando // RANDOTODO treasure chest game rando
if (Randomizer_GetSettingValue(RSK_SHUFFLE_CHEST_MINIGAME)) { if (Randomizer_GetSettingValue(RSK_SHUFFLE_CHEST_MINIGAME)) {
if (gSaveContext.n64ddFlag && globalCtx->sceneNum == 16 && (this->dyna.actor.params & 0x60) != 0x20) { if (gSaveContext.n64ddFlag && globalCtx->sceneNum == 16 && (this->dyna.actor.params & 0x60) != 0x20) {
if((this->dyna.actor.params & 0xF) < 2) { if((this->dyna.actor.params & 0xF) < 2) {
if(Flags_GetCollectible(globalCtx, 0x1B)) { if(Flags_GetCollectible(globalCtx, 0x1B)) {
item = GI_RUPEE_BLUE; sItem = blueRupee;
} }
} }
if((this->dyna.actor.params & 0xF) >= 2 && (this->dyna.actor.params & 0xF) < 4) { if((this->dyna.actor.params & 0xF) >= 2 && (this->dyna.actor.params & 0xF) < 4) {
if(Flags_GetCollectible(globalCtx, 0x1C)) { if(Flags_GetCollectible(globalCtx, 0x1C)) {
item = GI_RUPEE_BLUE; sItem = blueRupee;
} }
} }
if((this->dyna.actor.params & 0xF) >= 4 && (this->dyna.actor.params & 0xF) < 6) { if((this->dyna.actor.params & 0xF) >= 4 && (this->dyna.actor.params & 0xF) < 6) {
if(Flags_GetCollectible(globalCtx, 0x1D)) { if(Flags_GetCollectible(globalCtx, 0x1D)) {
item = GI_RUPEE_BLUE; sItem = blueRupee;
} }
} }
if((this->dyna.actor.params & 0xF) >= 6 && (this->dyna.actor.params & 0xF) < 8) { if((this->dyna.actor.params & 0xF) >= 6 && (this->dyna.actor.params & 0xF) < 8) {
if(Flags_GetCollectible(globalCtx, 0x1E)) { if(Flags_GetCollectible(globalCtx, 0x1E)) {
item = GI_RUPEE_BLUE; sItem = blueRupee;
} }
} }
if((this->dyna.actor.params & 0xF) >= 8 && (this->dyna.actor.params & 0xF) < 10) { if((this->dyna.actor.params & 0xF) >= 8 && (this->dyna.actor.params & 0xF) < 10) {
if(Flags_GetCollectible(globalCtx, 0x1F)) { if(Flags_GetCollectible(globalCtx, 0x1F)) {
item = GI_RUPEE_BLUE; sItem = blueRupee;
} }
} }
} }
} }
// Chests need to have a negative getItemId in order to not immediately give their item
func_8002F554(&this->dyna.actor, globalCtx, 0 - item); // when approaching.
if (gSaveContext.n64ddFlag) {
sItem.getItemId = 0 - sItem.getItemId;
GiveItemEntryFromActorWithFixedRange(&this->dyna.actor, globalCtx, sItem);
} else {
func_8002F554(&this->dyna.actor, globalCtx, -(this->dyna.actor.params >> 5 & 0x7F));
}
} }
if (Flags_GetTreasure(globalCtx, this->dyna.actor.params & 0x1F)) { if (Flags_GetTreasure(globalCtx, this->dyna.actor.params & 0x1F)) {
EnBox_SetupAction(this, EnBox_Open); EnBox_SetupAction(this, EnBox_Open);
@ -590,9 +598,7 @@ void EnBox_Update(Actor* thisx, GlobalContext* globalCtx) {
} }
if (((!gSaveContext.n64ddFlag && ((this->dyna.actor.params >> 5 & 0x7F) == 0x7C)) || if (((!gSaveContext.n64ddFlag && ((this->dyna.actor.params >> 5 & 0x7F) == 0x7C)) ||
(gSaveContext.n64ddFlag && Randomizer_GetRandomizedItemId(this->dyna.actor.params >> 5 & 0x7F, (gSaveContext.n64ddFlag && ABS(sItem.getItemId) == RG_ICE_TRAP)) &&
this->dyna.actor.id, this->dyna.actor.params,
globalCtx->sceneNum) == GI_ICE_TRAP)) &&
this->actionFunc == EnBox_Open && this->skelanime.curFrame > 45 && this->actionFunc == EnBox_Open && this->skelanime.curFrame > 45 &&
this->iceSmokeTimer < 100) EnBox_SpawnIceSmoke(this, globalCtx); this->iceSmokeTimer < 100) EnBox_SpawnIceSmoke(this, globalCtx);
} }

View File

@ -343,8 +343,8 @@ bool EnCow_HasBeenMilked(EnCow* this, GlobalContext* globalCtx) {
void EnCow_GivePlayerRandomizedItem(EnCow* this, GlobalContext* globalCtx) { void EnCow_GivePlayerRandomizedItem(EnCow* this, GlobalContext* globalCtx) {
if (!EnCow_HasBeenMilked(this, globalCtx)) { if (!EnCow_HasBeenMilked(this, globalCtx)) {
CowInfo cowInfo = EnCow_GetInfo(this, globalCtx); CowInfo cowInfo = EnCow_GetInfo(this, globalCtx);
GetItemID itemId = Randomizer_GetItemIdFromKnownCheck(cowInfo.randomizerCheck, GI_MILK); GetItemEntry itemEntry = Randomizer_GetItemFromKnownCheck(cowInfo.randomizerCheck, GI_MILK);
func_8002F434(&this->actor, globalCtx, itemId, 10000.0f, 100.0f); GiveItemEntryFromActor(&this->actor, globalCtx, itemEntry, 10000.0f, 100.0f);
} else { } else {
// once we've gotten the rando reward from the cow, // once we've gotten the rando reward from the cow,
// return them to the their default action function // return them to the their default action function

View File

@ -453,7 +453,12 @@ void func_809EEA00(EnDivingGame* this, GlobalContext* globalCtx) {
if ((this->unk_292 == Message_GetState(&globalCtx->msgCtx) && Message_ShouldAdvance(globalCtx))) { if ((this->unk_292 == Message_GetState(&globalCtx->msgCtx) && Message_ShouldAdvance(globalCtx))) {
Message_CloseTextbox(globalCtx); Message_CloseTextbox(globalCtx);
this->actor.parent = NULL; this->actor.parent = NULL;
func_8002F434(&this->actor, globalCtx, gSaveContext.n64ddFlag ? Randomizer_GetItemIdFromKnownCheck(RC_ZD_DIVING_MINIGAME, GI_SCALE_SILVER) : GI_SCALE_SILVER, 90.0f, 10.0f); if (!gSaveContext.n64ddFlag) {
func_8002F434(&this->actor, globalCtx, GI_SCALE_SILVER, 90.0f, 10.0f);
} else {
GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(RC_ZD_DIVING_MINIGAME, GI_SCALE_SILVER);
GiveItemEntryFromActor(&this->actor, globalCtx, getItemEntry, 90.0f, 10.0f);
}
this->actionFunc = func_809EEA90; this->actionFunc = func_809EEA90;
} }
} }
@ -463,7 +468,12 @@ void func_809EEA90(EnDivingGame* this, GlobalContext* globalCtx) {
if (Actor_HasParent(&this->actor, globalCtx)) { if (Actor_HasParent(&this->actor, globalCtx)) {
this->actionFunc = func_809EEAF8; this->actionFunc = func_809EEAF8;
} else { } else {
func_8002F434(&this->actor, globalCtx, gSaveContext.n64ddFlag ? Randomizer_GetItemIdFromKnownCheck(RC_ZD_DIVING_MINIGAME, GI_SCALE_SILVER) : GI_SCALE_SILVER, 90.0f, 10.0f); if (!gSaveContext.n64ddFlag) {
func_8002F434(&this->actor, globalCtx, GI_SCALE_SILVER, 90.0f, 10.0f);
} else {
GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(RC_ZD_DIVING_MINIGAME, GI_SCALE_SILVER);
GiveItemEntryFromActor(&this->actor, globalCtx, getItemEntry, 90.0f, 10.0f);
}
} }
} }

View File

@ -371,7 +371,8 @@ void EnDns_Talk(EnDns* this, GlobalContext* globalCtx) {
void func_809EFDD0(EnDns* this, GlobalContext* globalCtx) { void func_809EFDD0(EnDns* this, GlobalContext* globalCtx) {
if (this->actor.params == 0x9) { if (this->actor.params == 0x9) {
if (gSaveContext.n64ddFlag) { if (gSaveContext.n64ddFlag) {
func_8002F434(&this->actor, globalCtx, Randomizer_GetRandomizedItemId(GI_STICK_UPGRADE_30, this->actor.id, this->actor.params, globalCtx->sceneNum), 130.0f, 100.0f); GetItemEntry getItemEntry = Randomizer_GetRandomizedItem(GI_STICK_UPGRADE_30, this->actor.id, this->actor.params, globalCtx->sceneNum);
GiveItemEntryFromActor(&this->actor, globalCtx, getItemEntry, 130.0f, 100.0f);
} else if (CUR_UPG_VALUE(UPG_STICKS) < 2) { } else if (CUR_UPG_VALUE(UPG_STICKS) < 2) {
func_8002F434(&this->actor, globalCtx, GI_STICK_UPGRADE_20, 130.0f, 100.0f); func_8002F434(&this->actor, globalCtx, GI_STICK_UPGRADE_20, 130.0f, 100.0f);
} else { } else {
@ -379,14 +380,20 @@ void func_809EFDD0(EnDns* this, GlobalContext* globalCtx) {
} }
} else if (this->actor.params == 0xA) { } else if (this->actor.params == 0xA) {
if (gSaveContext.n64ddFlag) { if (gSaveContext.n64ddFlag) {
func_8002F434(&this->actor, globalCtx, Randomizer_GetRandomizedItemId(GI_NUT_UPGRADE_40, this->actor.id, this->actor.params, globalCtx->sceneNum), 130.0f, 100.0f); GetItemEntry getItemEntry = Randomizer_GetRandomizedItem(GI_NUT_UPGRADE_40, this->actor.id, this->actor.params, globalCtx->sceneNum);
GiveItemEntryFromActor(&this->actor, globalCtx, getItemEntry, 130.0f, 100.0f);
} else if (CUR_UPG_VALUE(UPG_NUTS) < 2) { } else if (CUR_UPG_VALUE(UPG_NUTS) < 2) {
func_8002F434(&this->actor, globalCtx, GI_NUT_UPGRADE_30, 130.0f, 100.0f); func_8002F434(&this->actor, globalCtx, GI_NUT_UPGRADE_30, 130.0f, 100.0f);
} else { } else {
func_8002F434(&this->actor, globalCtx, GI_NUT_UPGRADE_40, 130.0f, 100.0f); func_8002F434(&this->actor, globalCtx, GI_NUT_UPGRADE_40, 130.0f, 100.0f);
} }
} else { } else {
func_8002F434(&this->actor, globalCtx, gSaveContext.n64ddFlag ? Randomizer_GetRandomizedItemId(this->dnsItemEntry->getItemId, this->actor.id, this->actor.params, globalCtx->sceneNum) : this->dnsItemEntry->getItemId, 130.0f, 100.0f); if (!gSaveContext.n64ddFlag) {
func_8002F434(&this->actor, globalCtx, this->dnsItemEntry->getItemId, 130.0f, 100.0f);
} else {
GetItemEntry getItemEntry = Randomizer_GetRandomizedItem(this->dnsItemEntry->getItemId, this->actor.id, this->actor.params, globalCtx->sceneNum);
GiveItemEntryFromActor(&this->actor, globalCtx, getItemEntry, 130.0f, 100.0f);
}
} }
} }

View File

@ -139,13 +139,15 @@ void EnDntDemo_Judge(EnDntDemo* this, GlobalContext* globalCtx) {
switch (Player_GetMask(globalCtx)) { switch (Player_GetMask(globalCtx)) {
case PLAYER_MASK_SKULL: case PLAYER_MASK_SKULL:
if (!Flags_GetTreasure(globalCtx, 0x1F)) { if (!Flags_GetTreasure(globalCtx, 0x1F)) {
GiveItemWithoutActor(globalCtx, Randomizer_GetItemIdFromKnownCheck(RC_DEKU_THEATER_SKULL_MASK, GI_STICK_UPGRADE_30)); GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(RC_DEKU_THEATER_SKULL_MASK, GI_STICK_UPGRADE_30);
GiveItemEntryWithoutActor(globalCtx, getItemEntry);
Flags_SetTreasure(globalCtx, 0x1F); Flags_SetTreasure(globalCtx, 0x1F);
} }
break; break;
case PLAYER_MASK_TRUTH: case PLAYER_MASK_TRUTH:
if (!Flags_GetTreasure(globalCtx, 0x1E)) { if (!Flags_GetTreasure(globalCtx, 0x1E)) {
GiveItemWithoutActor(globalCtx, Randomizer_GetItemIdFromKnownCheck(RC_DEKU_THEATER_MASK_OF_TRUTH, GI_NUT_UPGRADE_40)); GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(RC_DEKU_THEATER_MASK_OF_TRUTH, GI_NUT_UPGRADE_40);
GiveItemEntryWithoutActor(globalCtx, getItemEntry);
Flags_SetTreasure(globalCtx, 0x1E); Flags_SetTreasure(globalCtx, 0x1E);
} }
break; break;

View File

@ -94,8 +94,10 @@ void EnDs_GiveOddPotion(EnDs* this, GlobalContext* globalCtx) {
} else { } else {
u32 itemId = GI_ODD_POTION; u32 itemId = GI_ODD_POTION;
if (gSaveContext.n64ddFlag) { if (gSaveContext.n64ddFlag) {
itemId = Randomizer_GetItemIdFromKnownCheck(RC_KAK_TRADE_ODD_MUSHROOM, GI_ODD_POTION); GetItemEntry itemEntry = Randomizer_GetItemFromKnownCheck(RC_KAK_TRADE_ODD_MUSHROOM, GI_ODD_POTION);
GiveItemEntryFromActor(&this->actor, globalCtx, itemEntry, 10000.0f, 50.0f);
Randomizer_ConsumeAdultTradeItem(globalCtx, ITEM_ODD_MUSHROOM); Randomizer_ConsumeAdultTradeItem(globalCtx, ITEM_ODD_MUSHROOM);
return;
} }
func_8002F434(&this->actor, globalCtx, itemId, 10000.0f, 50.0f); func_8002F434(&this->actor, globalCtx, itemId, 10000.0f, 50.0f);
} }
@ -107,8 +109,10 @@ void EnDs_TalkAfterBrewOddPotion(EnDs* this, GlobalContext* globalCtx) {
this->actionFunc = EnDs_GiveOddPotion; this->actionFunc = EnDs_GiveOddPotion;
u32 itemId = GI_ODD_POTION; u32 itemId = GI_ODD_POTION;
if (gSaveContext.n64ddFlag) { if (gSaveContext.n64ddFlag) {
itemId = Randomizer_GetItemIdFromKnownCheck(RC_KAK_TRADE_ODD_MUSHROOM, GI_ODD_POTION); GetItemEntry itemEntry = Randomizer_GetItemFromKnownCheck(RC_KAK_TRADE_ODD_MUSHROOM, GI_ODD_POTION);
GiveItemEntryFromActor(&this->actor, globalCtx, itemEntry, 10000.0f, 50.0f);
Randomizer_ConsumeAdultTradeItem(globalCtx, ITEM_ODD_MUSHROOM); Randomizer_ConsumeAdultTradeItem(globalCtx, ITEM_ODD_MUSHROOM);
return;
} }
func_8002F434(&this->actor, globalCtx, itemId, 10000.0f, 50.0f); func_8002F434(&this->actor, globalCtx, itemId, 10000.0f, 50.0f);
} }

View File

@ -548,7 +548,12 @@ void func_809FEC70(EnDu* this, GlobalContext* globalCtx) {
EnDu_SetupAction(this, func_809FECE4); EnDu_SetupAction(this, func_809FECE4);
} else { } else {
f32 xzRange = this->actor.xzDistToPlayer + 1.0f; f32 xzRange = this->actor.xzDistToPlayer + 1.0f;
func_8002F434(&this->actor, globalCtx, gSaveContext.n64ddFlag ? Randomizer_GetItemIdFromKnownCheck(RC_GC_DARUNIAS_JOY, GI_BRACELET) : GI_BRACELET, xzRange, fabsf(this->actor.yDistToPlayer) + 1.0f); if (!gSaveContext.n64ddFlag) {
func_8002F434(&this->actor, globalCtx, GI_BRACELET, xzRange, fabsf(this->actor.yDistToPlayer) + 1.0f);
} else {
GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(RC_GC_DARUNIAS_JOY, GI_BRACELET);
GiveItemEntryFromActor(&this->actor, globalCtx, getItemEntry, xzRange, fabsf(this->actor.yDistToPlayer) + 1.0f);
}
} }
} }

View File

@ -138,8 +138,8 @@ void EnExItem_WaitForObject(EnExItem* this, GlobalContext* globalCtx) {
case EXITEM_BOMB_BAG_BOWLING: case EXITEM_BOMB_BAG_BOWLING:
this->unk_17C = func_8002EBCC; this->unk_17C = func_8002EBCC;
if (gSaveContext.n64ddFlag) { if (gSaveContext.n64ddFlag) {
this->giDrawId = Randomizer_GetItemModelFromId( this->giDrawId =
Randomizer_GetItemIdFromKnownCheck(RC_MARKET_BOMBCHU_BOWLING_FIRST_PRIZE, GI_BOMB_BAG_20)); Randomizer_GetItemFromKnownCheck(RC_MARKET_BOMBCHU_BOWLING_FIRST_PRIZE, GI_BOMB_BAG_20).gid;
} else { } else {
this->giDrawId = GID_BOMB_BAG_30; this->giDrawId = GID_BOMB_BAG_30;
} }
@ -173,8 +173,7 @@ void EnExItem_WaitForObject(EnExItem* this, GlobalContext* globalCtx) {
case EXITEM_BOMBCHUS_BOWLING: case EXITEM_BOMBCHUS_BOWLING:
this->unk_17C = func_8002EBCC; this->unk_17C = func_8002EBCC;
if (gSaveContext.n64ddFlag) { if (gSaveContext.n64ddFlag) {
this->giDrawId = Randomizer_GetItemModelFromId( this->giDrawId = Randomizer_GetItemFromKnownCheck(RC_MARKET_BOMBCHU_BOWLING_BOMBCHUS, GI_BOMBCHUS_10).gid;
Randomizer_GetItemIdFromKnownCheck(RC_MARKET_BOMBCHU_BOWLING_BOMBCHUS, GI_BOMBCHUS_10));
} else { } else {
this->giDrawId = GID_BOMBCHU; this->giDrawId = GID_BOMBCHU;
} }
@ -397,6 +396,7 @@ void EnExItem_TargetPrizeApproach(EnExItem* this, GlobalContext* globalCtx) {
this->actor.world.pos.z += (tmpf3 / tmpf4) * 5.0f; this->actor.world.pos.z += (tmpf3 / tmpf4) * 5.0f;
} }
} else { } else {
GetItemEntry getItemEntry = (GetItemEntry)GET_ITEM_NONE;
s32 getItemId; s32 getItemId;
this->actor.draw = NULL; this->actor.draw = NULL;
@ -404,7 +404,8 @@ void EnExItem_TargetPrizeApproach(EnExItem* this, GlobalContext* globalCtx) {
this->actor.parent = NULL; this->actor.parent = NULL;
if (gSaveContext.n64ddFlag) { if (gSaveContext.n64ddFlag) {
GET_PLAYER(globalCtx)->stateFlags1 &= ~(PLAYER_STATE1_10 | PLAYER_STATE1_11); GET_PLAYER(globalCtx)->stateFlags1 &= ~(PLAYER_STATE1_10 | PLAYER_STATE1_11);
getItemId = Randomizer_GetItemIdFromKnownCheck(RC_LW_TARGET_IN_WOODS, GI_BULLET_BAG_50); getItemEntry = Randomizer_GetItemFromKnownCheck(RC_LW_TARGET_IN_WOODS, GI_BULLET_BAG_50);
getItemId = getItemEntry.getItemId;
} else { } else {
if (CUR_UPG_VALUE(UPG_BULLET_BAG) == 1) { if (CUR_UPG_VALUE(UPG_BULLET_BAG) == 1) {
getItemId = GI_BULLET_BAG_40; getItemId = GI_BULLET_BAG_40;
@ -412,24 +413,28 @@ void EnExItem_TargetPrizeApproach(EnExItem* this, GlobalContext* globalCtx) {
getItemId = GI_BULLET_BAG_50; getItemId = GI_BULLET_BAG_50;
} }
} }
func_8002F434(&this->actor, globalCtx, getItemId, 2000.0f, 1000.0f);
if (!gSaveContext.n64ddFlag || getItemEntry.getItemId == GI_NONE) {
func_8002F434(&this->actor, globalCtx, getItemId, 2000.0f, 1000.0f);
} else {
GiveItemEntryFromActor(&this->actor, globalCtx, getItemEntry, 2000.0f, 1000.0f);
}
this->actionFunc = EnExItem_TargetPrizeGive; this->actionFunc = EnExItem_TargetPrizeGive;
} }
} }
void EnExItem_TargetPrizeGive(EnExItem* this, GlobalContext* globalCtx) { void EnExItem_TargetPrizeGive(EnExItem* this, GlobalContext* globalCtx) {
s32 getItemId;
if (Actor_HasParent(&this->actor, globalCtx)) { if (Actor_HasParent(&this->actor, globalCtx)) {
this->actionFunc = EnExItem_TargetPrizeFinish; this->actionFunc = EnExItem_TargetPrizeFinish;
} else { } else {
if (gSaveContext.n64ddFlag) { if (!gSaveContext.n64ddFlag) {
getItemId = Randomizer_GetItemIdFromKnownCheck(RC_LW_TARGET_IN_WOODS, GI_BULLET_BAG_50); s32 getItemId = (CUR_UPG_VALUE(UPG_BULLET_BAG) == 2) ? GI_BULLET_BAG_50 : GI_BULLET_BAG_40;
func_8002F434(&this->actor, globalCtx, getItemId, 2000.0f, 1000.0f);
} else { } else {
getItemId = (CUR_UPG_VALUE(UPG_BULLET_BAG) == 2) ? GI_BULLET_BAG_50 : GI_BULLET_BAG_40; GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(RC_LW_TARGET_IN_WOODS, GI_BULLET_BAG_50);
GiveItemEntryFromActor(&this->actor, globalCtx, getItemEntry, 2000.0f, 1000.0f);
} }
func_8002F434(&this->actor, globalCtx, getItemId, 2000.0f, 1000.0f);
} }
} }
@ -506,24 +511,19 @@ void EnExItem_DrawItems(EnExItem* this, GlobalContext* globalCtx) {
if (this) {} if (this) {}
func_8002ED80(&this->actor, globalCtx, 0); func_8002ED80(&this->actor, globalCtx, 0);
if (gSaveContext.n64ddFlag) { if (gSaveContext.n64ddFlag) {
s32 randoGetItemId; GetItemEntry randoGetItem;
switch (this->type) { switch (this->type) {
case EXITEM_BOMB_BAG_BOWLING: case EXITEM_BOMB_BAG_BOWLING:
case EXITEM_BOMB_BAG_COUNTER: case EXITEM_BOMB_BAG_COUNTER:
randoGetItemId = Randomizer_GetItemIdFromKnownCheck( randoGetItem = Randomizer_GetItemFromKnownCheck(RC_MARKET_BOMBCHU_BOWLING_FIRST_PRIZE, GI_BOMB_BAG_20);
RC_MARKET_BOMBCHU_BOWLING_FIRST_PRIZE, GI_BOMB_BAG_20);
break; break;
case EXITEM_BOMBCHUS_BOWLING: case EXITEM_BOMBCHUS_BOWLING:
case EXITEM_BOMBCHUS_COUNTER: case EXITEM_BOMBCHUS_COUNTER:
randoGetItemId = Randomizer_GetItemIdFromKnownCheck( randoGetItem = Randomizer_GetItemFromKnownCheck(RC_MARKET_BOMBCHU_BOWLING_BOMBCHUS, GI_BOMBCHUS_10);
RC_MARKET_BOMBCHU_BOWLING_BOMBCHUS, GI_BOMBCHUS_10);
break; break;
} }
if ((randoGetItemId >= GI_MINUET_OF_FOREST && randoGetItemId <= GI_DOUBLE_DEFENSE) || EnItem00_CustomItemsParticles(&this->actor, globalCtx, randoGetItem);
(randoGetItemId >= GI_STICK_UPGRADE_20 && randoGetItemId <= GI_NUT_UPGRADE_40)) {
EnItem00_CustomItemsParticles(&this->actor, globalCtx, randoGetItemId);
}
} }
GetItem_Draw(globalCtx, this->giDrawId); GetItem_Draw(globalCtx, this->giDrawId);
@ -533,13 +533,10 @@ void EnExItem_DrawHeartPiece(EnExItem* this, GlobalContext* globalCtx) {
func_8002ED80(&this->actor, globalCtx, 0); func_8002ED80(&this->actor, globalCtx, 0);
if (gSaveContext.n64ddFlag) { if (gSaveContext.n64ddFlag) {
s32 randoGetItemId = Randomizer_GetItemIdFromKnownCheck( GetItemEntry randoGetItem =
RC_MARKET_BOMBCHU_BOWLING_SECOND_PRIZE, GI_HEART_PIECE); Randomizer_GetItemFromKnownCheck(RC_MARKET_BOMBCHU_BOWLING_SECOND_PRIZE, GI_HEART_PIECE);
if ((randoGetItemId >= GI_MINUET_OF_FOREST && randoGetItemId <= GI_DOUBLE_DEFENSE) || EnItem00_CustomItemsParticles(&this->actor, globalCtx, randoGetItem);
(randoGetItemId >= GI_STICK_UPGRADE_20 && randoGetItemId <= GI_NUT_UPGRADE_40)) { GetItem_Draw(globalCtx, randoGetItem.gid);
EnItem00_CustomItemsParticles(&this->actor, globalCtx, randoGetItemId);
}
GetItem_Draw(globalCtx, Randomizer_GetItemModelFromId(randoGetItemId));
} else { } else {
GetItem_Draw(globalCtx, GID_HEART_PIECE); GetItem_Draw(globalCtx, GID_HEART_PIECE);
} }

View File

@ -602,6 +602,7 @@ void EnFr_Idle(EnFr* this, GlobalContext* globalCtx) {
player->actor.world.pos.z = this->actor.world.pos.z; // z = -1220.0f player->actor.world.pos.z = this->actor.world.pos.z; // z = -1220.0f
player->currentYaw = player->actor.world.rot.y = player->actor.shape.rot.y = this->actor.world.rot.y; player->currentYaw = player->actor.world.rot.y = player->actor.shape.rot.y = this->actor.world.rot.y;
this->reward = GI_NONE; this->reward = GI_NONE;
this->getItemEntry = (GetItemEntry)GET_ITEM_NONE;
this->actionFunc = EnFr_Activate; this->actionFunc = EnFr_Activate;
} else if (EnFr_IsAboveAndWithin30DistXZ(player, this)) { } else if (EnFr_IsAboveAndWithin30DistXZ(player, this)) {
player->unk_6A8 = &this->actor; player->unk_6A8 = &this->actor;
@ -837,6 +838,7 @@ s32 EnFr_IsFrogSongComplete(EnFr* this, GlobalContext* globalCtx) {
void EnFr_OcarinaMistake(EnFr* this, GlobalContext* globalCtx) { void EnFr_OcarinaMistake(EnFr* this, GlobalContext* globalCtx) {
Message_CloseTextbox(globalCtx); Message_CloseTextbox(globalCtx);
this->reward = GI_NONE; this->reward = GI_NONE;
this->getItemEntry = (GetItemEntry)GET_ITEM_NONE;
func_80078884(NA_SE_SY_OCARINA_ERROR); func_80078884(NA_SE_SY_OCARINA_ERROR);
Audio_OcaSetInstrument(0); Audio_OcaSetInstrument(0);
sEnFrPointers.flags = 12; sEnFrPointers.flags = 12;
@ -945,13 +947,15 @@ void EnFr_SetReward(EnFr* this, GlobalContext* globalCtx) {
songIndex = this->songIndex; songIndex = this->songIndex;
this->actionFunc = EnFr_Deactivate; this->actionFunc = EnFr_Deactivate;
this->reward = GI_NONE; this->reward = GI_NONE;
this->getItemEntry = (GetItemEntry)GET_ITEM_NONE;
if ((songIndex >= FROG_ZL) && (songIndex <= FROG_SOT)) { if ((songIndex >= FROG_ZL) && (songIndex <= FROG_SOT)) {
if (!(gSaveContext.eventChkInf[13] & sSongIndex[songIndex])) { if (!(gSaveContext.eventChkInf[13] & sSongIndex[songIndex])) {
gSaveContext.eventChkInf[13] |= sSongIndex[songIndex]; gSaveContext.eventChkInf[13] |= sSongIndex[songIndex];
if (!gSaveContext.n64ddFlag) { if (!gSaveContext.n64ddFlag) {
this->reward = GI_RUPEE_PURPLE; this->reward = GI_RUPEE_PURPLE;
} else { } else {
this->reward = Randomizer_GetItemIdFromKnownCheck(EnFr_RandomizerCheckFromSongIndex(songIndex), GI_RUPEE_PURPLE); this->getItemEntry = Randomizer_GetItemFromKnownCheck(EnFr_RandomizerCheckFromSongIndex(songIndex), GI_RUPEE_PURPLE);
this->reward = this->getItemEntry.getItemId;
} }
} else { } else {
this->reward = GI_RUPEE_BLUE; this->reward = GI_RUPEE_BLUE;
@ -962,7 +966,8 @@ void EnFr_SetReward(EnFr* this, GlobalContext* globalCtx) {
if (!gSaveContext.n64ddFlag) { if (!gSaveContext.n64ddFlag) {
this->reward = GI_HEART_PIECE; this->reward = GI_HEART_PIECE;
} else { } else {
this->reward = Randomizer_GetItemIdFromKnownCheck(RC_ZR_FROGS_IN_THE_RAIN, GI_HEART_PIECE); this->getItemEntry = Randomizer_GetItemFromKnownCheck(RC_ZR_FROGS_IN_THE_RAIN, GI_HEART_PIECE);
this->reward = this->getItemEntry.getItemId;
} }
} else { } else {
this->reward = GI_RUPEE_BLUE; this->reward = GI_RUPEE_BLUE;
@ -973,7 +978,8 @@ void EnFr_SetReward(EnFr* this, GlobalContext* globalCtx) {
if (!gSaveContext.n64ddFlag) { if (!gSaveContext.n64ddFlag) {
this->reward = GI_HEART_PIECE; this->reward = GI_HEART_PIECE;
} else { } else {
this->reward = Randomizer_GetItemIdFromKnownCheck(RC_ZR_FROGS_OCARINA_GAME, GI_HEART_PIECE); this->getItemEntry = Randomizer_GetItemFromKnownCheck(RC_ZR_FROGS_OCARINA_GAME, GI_HEART_PIECE);
this->reward = this->getItemEntry.getItemId;
} }
} else { } else {
this->reward = GI_RUPEE_PURPLE; this->reward = GI_RUPEE_PURPLE;
@ -1024,7 +1030,11 @@ void EnFr_Deactivate(EnFr* this, GlobalContext* globalCtx) {
this->actionFunc = EnFr_Idle; this->actionFunc = EnFr_Idle;
} else { } else {
this->actionFunc = EnFr_GiveReward; this->actionFunc = EnFr_GiveReward;
func_8002F434(&this->actor, globalCtx, this->reward, 30.0f, 100.0f); if (!gSaveContext.n64ddFlag || this->getItemEntry.getItemId == GI_NONE) {
func_8002F434(&this->actor, globalCtx, this->reward, 30.0f, 100.0f);
} else {
GiveItemEntryFromActor(&this->actor, globalCtx, this->getItemEntry, 30.0f, 100.0f);
}
} }
} }
@ -1033,12 +1043,16 @@ void EnFr_GiveReward(EnFr* this, GlobalContext* globalCtx) {
this->actor.parent = NULL; this->actor.parent = NULL;
this->actionFunc = EnFr_SetIdle; this->actionFunc = EnFr_SetIdle;
} else { } else {
func_8002F434(&this->actor, globalCtx, this->reward, 30.0f, 100.0f); if (!gSaveContext.n64ddFlag || this->getItemEntry.getItemId == GI_NONE) {
func_8002F434(&this->actor, globalCtx, this->reward, 30.0f, 100.0f);
} else {
GiveItemEntryFromActor(&this->actor, globalCtx, this->getItemEntry, 30.0f, 100.0f);
}
} }
} }
void EnFr_SetIdle(EnFr* this, GlobalContext* globalCtx) { void EnFr_SetIdle(EnFr* this, GlobalContext* globalCtx) {
if ((Message_GetState(&globalCtx->msgCtx) == TEXT_STATE_DONE) && Message_ShouldAdvance(globalCtx) || (gSaveContext.n64ddFlag && this->reward == GI_ICE_TRAP)) { if ((Message_GetState(&globalCtx->msgCtx) == TEXT_STATE_DONE) && Message_ShouldAdvance(globalCtx) || (gSaveContext.n64ddFlag && this->reward == RG_ICE_TRAP)) {
this->actionFunc = EnFr_Idle; this->actionFunc = EnFr_Idle;
} }
} }

View File

@ -73,6 +73,7 @@ typedef struct EnFr {
/* 0x03AA */ s16 xyAngleButterfly; // Butterfly Travels along random angles in the x-y plane /* 0x03AA */ s16 xyAngleButterfly; // Butterfly Travels along random angles in the x-y plane
/* 0x03AC */ Vec3f posButterfly; // Position/Coordinates of the Butterfly /* 0x03AC */ Vec3f posButterfly; // Position/Coordinates of the Butterfly
/* 0x03B8 */ Vec3f posButterflyLight; // Used in Lights_PointNoGlowSetInfo() /* 0x03B8 */ Vec3f posButterflyLight; // Used in Lights_PointNoGlowSetInfo()
/* */ GetItemEntry getItemEntry;
} EnFr; // size = 0x03C4 } EnFr; // size = 0x03C4
typedef struct { typedef struct {

View File

@ -154,8 +154,8 @@ void GivePlayerRandoRewardSongOfStorms(EnFu* windmillGuy, GlobalContext* globalC
Flags_SetTreasure(globalCtx, 0x1F); Flags_SetTreasure(globalCtx, 0x1F);
windmillGuy->actionFunc = func_80A1DBD4; windmillGuy->actionFunc = func_80A1DBD4;
} else if (!Flags_GetTreasure(globalCtx, 0x1F)) { } else if (!Flags_GetTreasure(globalCtx, 0x1F)) {
GetItemID getItemId = Randomizer_GetItemIdFromKnownCheck(check, GI_SONG_OF_STORMS); GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(check, RG_SONG_OF_STORMS);
func_8002F434(&windmillGuy->actor, globalCtx, getItemId, 10000.0f, 100.0f); GiveItemEntryFromActor(&windmillGuy->actor, globalCtx, getItemEntry, 10000.0f, 100.0f);
} }
} }

View File

@ -353,7 +353,12 @@ void func_80A2FA50(EnGb* this, GlobalContext* globalCtx) {
void func_80A2FB40(EnGb* this, GlobalContext* globalCtx) { void func_80A2FB40(EnGb* this, GlobalContext* globalCtx) {
if (Message_GetState(&globalCtx->msgCtx) == TEXT_STATE_DONE && Message_ShouldAdvance(globalCtx)) { if (Message_GetState(&globalCtx->msgCtx) == TEXT_STATE_DONE && Message_ShouldAdvance(globalCtx)) {
func_8002F434(&this->dyna.actor, globalCtx, gSaveContext.n64ddFlag ? Randomizer_GetItemIdFromKnownCheck(RC_MARKET_10_BIG_POES, GI_BOTTLE) : GI_BOTTLE, 100.0f, 10.0f); if (!gSaveContext.n64ddFlag) {
func_8002F434(&this->dyna.actor, globalCtx, GI_BOTTLE, 100.0f, 10.0f);
} else {
GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(RC_MARKET_10_BIG_POES, GI_BOTTLE);
GiveItemEntryFromActor(&this->dyna.actor, globalCtx, getItemEntry, 100.0f, 10.0f);
}
this->actionFunc = func_80A2FBB0; this->actionFunc = func_80A2FBB0;
} }
} }
@ -363,7 +368,12 @@ void func_80A2FBB0(EnGb* this, GlobalContext* globalCtx) {
this->dyna.actor.parent = NULL; this->dyna.actor.parent = NULL;
this->actionFunc = func_80A2FC0C; this->actionFunc = func_80A2FC0C;
} else { } else {
func_8002F434(&this->dyna.actor, globalCtx, gSaveContext.n64ddFlag ? Randomizer_GetItemIdFromKnownCheck(RC_MARKET_10_BIG_POES, GI_BOTTLE) : GI_BOTTLE, 100.0f, 10.0f); if (!gSaveContext.n64ddFlag) {
func_8002F434(&this->dyna.actor, globalCtx, GI_BOTTLE, 100.0f, 10.0f);
} else {
GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(RC_MARKET_10_BIG_POES, GI_BOTTLE);
GiveItemEntryFromActor(&this->dyna.actor, globalCtx, getItemEntry, 100.0f, 10.0f);
}
} }
} }

View File

@ -502,6 +502,7 @@ void EnGe1_SetupWait_Archery(EnGe1* this, GlobalContext* globalCtx) {
} }
void EnGe1_WaitTillItemGiven_Archery(EnGe1* this, GlobalContext* globalCtx) { void EnGe1_WaitTillItemGiven_Archery(EnGe1* this, GlobalContext* globalCtx) {
GetItemEntry getItemEntry = (GetItemEntry)GET_ITEM_NONE;
s32 getItemId; s32 getItemId;
if (Actor_HasParent(&this->actor, globalCtx)) { if (Actor_HasParent(&this->actor, globalCtx)) {
@ -533,21 +534,28 @@ void EnGe1_WaitTillItemGiven_Archery(EnGe1* this, GlobalContext* globalCtx) {
break; break;
} }
} else { } else {
getItemId = Randomizer_GetItemIdFromKnownCheck( getItemEntry = Randomizer_GetItemFromKnownCheck(RC_GF_HBA_1500_POINTS, CUR_UPG_VALUE(UPG_QUIVER) == 1 ? GI_QUIVER_40 : GI_QUIVER_50);
RC_GF_HBA_1500_POINTS, CUR_UPG_VALUE(UPG_QUIVER) == 1 ? GI_QUIVER_40 : GI_QUIVER_50); getItemId = getItemEntry.getItemId;
} }
} else { } else {
if (!gSaveContext.n64ddFlag) { if (!gSaveContext.n64ddFlag) {
getItemId = GI_HEART_PIECE; getItemId = GI_HEART_PIECE;
} else { } else {
getItemId = Randomizer_GetItemIdFromKnownCheck(RC_GF_HBA_1000_POINTS, GI_HEART_PIECE); getItemEntry = Randomizer_GetItemFromKnownCheck(RC_GF_HBA_1000_POINTS, GI_HEART_PIECE);
getItemId = getItemEntry.getItemId;
} }
} }
func_8002F434(&this->actor, globalCtx, getItemId, 10000.0f, 50.0f);
if (!gSaveContext.n64ddFlag || getItemEntry.getItemId == GI_NONE) {
func_8002F434(&this->actor, globalCtx, getItemId, 10000.0f, 50.0f);
} else {
GiveItemEntryFromActor(&this->actor, globalCtx, getItemEntry, 10000.0f, 50.0f);
}
} }
} }
void EnGe1_BeginGiveItem_Archery(EnGe1* this, GlobalContext* globalCtx) { void EnGe1_BeginGiveItem_Archery(EnGe1* this, GlobalContext* globalCtx) {
GetItemEntry getItemEntry = (GetItemEntry)GET_ITEM_NONE;
s32 getItemId; s32 getItemId;
if (Actor_TextboxIsClosing(&this->actor, globalCtx)) { if (Actor_TextboxIsClosing(&this->actor, globalCtx)) {
@ -567,18 +575,23 @@ void EnGe1_BeginGiveItem_Archery(EnGe1* this, GlobalContext* globalCtx) {
break; break;
} }
} else { } else {
getItemId = Randomizer_GetItemIdFromKnownCheck(RC_GF_HBA_1500_POINTS, getItemEntry = Randomizer_GetItemFromKnownCheck(RC_GF_HBA_1500_POINTS, CUR_UPG_VALUE(UPG_QUIVER) == 1 ? GI_QUIVER_40 : GI_QUIVER_50);
CUR_UPG_VALUE(UPG_QUIVER) == 1 ? GI_QUIVER_40 : GI_QUIVER_50); getItemId = getItemEntry.getItemId;
} }
} else { } else {
if (!gSaveContext.n64ddFlag) { if (!gSaveContext.n64ddFlag) {
getItemId = GI_HEART_PIECE; getItemId = GI_HEART_PIECE;
} else { } else {
getItemId = Randomizer_GetItemIdFromKnownCheck(RC_GF_HBA_1000_POINTS, GI_HEART_PIECE); getItemEntry = Randomizer_GetItemFromKnownCheck(RC_GF_HBA_1000_POINTS, GI_HEART_PIECE);
getItemId = getItemEntry.getItemId;
} }
} }
func_8002F434(&this->actor, globalCtx, getItemId, 10000.0f, 50.0f); if (!gSaveContext.n64ddFlag || getItemEntry.getItemId == GI_NONE) {
func_8002F434(&this->actor, globalCtx, getItemId, 10000.0f, 50.0f);
} else {
GiveItemEntryFromActor(&this->actor, globalCtx, getItemEntry, 10000.0f, 50.0f);
}
} }
void EnGe1_TalkWinPrize_Archery(EnGe1* this, GlobalContext* globalCtx) { void EnGe1_TalkWinPrize_Archery(EnGe1* this, GlobalContext* globalCtx) {

View File

@ -457,7 +457,12 @@ void EnGe2_WaitTillCardGiven(EnGe2* this, GlobalContext* globalCtx) {
this->actor.parent = NULL; this->actor.parent = NULL;
this->actionFunc = EnGe2_SetActionAfterTalk; this->actionFunc = EnGe2_SetActionAfterTalk;
} else { } else {
func_8002F434(&this->actor, globalCtx, gSaveContext.n64ddFlag ? Randomizer_GetItemIdFromKnownCheck(RC_GF_GERUDO_MEMBERSHIP_CARD, GI_GERUDO_CARD) : GI_GERUDO_CARD, 10000.0f, 50.0f); if (!gSaveContext.n64ddFlag) {
func_8002F434(&this->actor, globalCtx, GI_GERUDO_CARD, 10000.0f, 50.0f);
} else {
GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(RC_GF_GERUDO_MEMBERSHIP_CARD, GI_GERUDO_CARD);
GiveItemEntryFromActor(&this->actor, globalCtx, getItemEntry, 10000.0f, 50.0f);
}
} }
} }
@ -466,7 +471,12 @@ void EnGe2_GiveCard(EnGe2* this, GlobalContext* globalCtx) {
Message_CloseTextbox(globalCtx); Message_CloseTextbox(globalCtx);
this->actor.flags &= ~ACTOR_FLAG_16; this->actor.flags &= ~ACTOR_FLAG_16;
this->actionFunc = EnGe2_WaitTillCardGiven; this->actionFunc = EnGe2_WaitTillCardGiven;
func_8002F434(&this->actor, globalCtx, gSaveContext.n64ddFlag ? Randomizer_GetItemIdFromKnownCheck(RC_GF_GERUDO_MEMBERSHIP_CARD, GI_GERUDO_CARD) : GI_GERUDO_CARD, 10000.0f, 50.0f); if (!gSaveContext.n64ddFlag) {
func_8002F434(&this->actor, globalCtx, GI_GERUDO_CARD, 10000.0f, 50.0f);
} else {
GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(RC_GF_GERUDO_MEMBERSHIP_CARD, GI_GERUDO_CARD);
GiveItemEntryFromActor(&this->actor, globalCtx, getItemEntry, 10000.0f, 50.0f);
}
} }
} }

View File

@ -142,7 +142,12 @@ void EnGe3_WaitTillCardGiven(EnGe3* this, GlobalContext* globalCtx) {
this->actor.parent = NULL; this->actor.parent = NULL;
this->actionFunc = EnGe3_Wait; this->actionFunc = EnGe3_Wait;
} else { } else {
func_8002F434(&this->actor, globalCtx, gSaveContext.n64ddFlag ? Randomizer_GetItemIdFromKnownCheck(RC_GF_GERUDO_MEMBERSHIP_CARD, GI_GERUDO_CARD) : GI_GERUDO_CARD, 10000.0f, 50.0f); if (!gSaveContext.n64ddFlag) {
func_8002F434(&this->actor, globalCtx, GI_GERUDO_CARD, 10000.0f, 50.0f);
} else {
GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(RC_GF_GERUDO_MEMBERSHIP_CARD, GI_GERUDO_CARD);
GiveItemEntryFromActor(&this->actor, globalCtx, getItemEntry, 10000.0f, 50.0f);
}
} }
} }
@ -151,7 +156,12 @@ void EnGe3_GiveCard(EnGe3* this, GlobalContext* globalCtx) {
Message_CloseTextbox(globalCtx); Message_CloseTextbox(globalCtx);
this->actor.flags &= ~ACTOR_FLAG_16; this->actor.flags &= ~ACTOR_FLAG_16;
this->actionFunc = EnGe3_WaitTillCardGiven; this->actionFunc = EnGe3_WaitTillCardGiven;
func_8002F434(&this->actor, globalCtx, gSaveContext.n64ddFlag ? Randomizer_GetItemIdFromKnownCheck(RC_GF_GERUDO_MEMBERSHIP_CARD, GI_GERUDO_CARD) : GI_GERUDO_CARD, 10000.0f, 50.0f); if (!gSaveContext.n64ddFlag) {
func_8002F434(&this->actor, globalCtx, GI_GERUDO_CARD, 10000.0f, 50.0f);
} else {
GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(RC_GF_GERUDO_MEMBERSHIP_CARD, GI_GERUDO_CARD);
GiveItemEntryFromActor(&this->actor, globalCtx, getItemEntry, 10000.0f, 50.0f);
}
} }
} }

View File

@ -947,6 +947,7 @@ void func_80A40B1C(EnGo* this, GlobalContext* globalCtx) {
void EnGo_GetItem(EnGo* this, GlobalContext* globalCtx) { void EnGo_GetItem(EnGo* this, GlobalContext* globalCtx) {
f32 xzDist; f32 xzDist;
f32 yDist; f32 yDist;
GetItemEntry getItemEntry = (GetItemEntry)GET_ITEM_NONE;
s32 getItemId; s32 getItemId;
if (Actor_HasParent(&this->actor, globalCtx)) { if (Actor_HasParent(&this->actor, globalCtx)) {
@ -957,21 +958,30 @@ void EnGo_GetItem(EnGo* this, GlobalContext* globalCtx) {
this->unk_20C = 0; this->unk_20C = 0;
if ((this->actor.params & 0xF0) == 0x90) { if ((this->actor.params & 0xF0) == 0x90) {
if (INV_CONTENT(ITEM_TRADE_ADULT) == ITEM_CLAIM_CHECK) { if (INV_CONTENT(ITEM_TRADE_ADULT) == ITEM_CLAIM_CHECK) {
getItemId = gSaveContext.n64ddFlag ? Randomizer_GetItemIdFromKnownCheck(RC_DMT_TRADE_CLAIM_CHECK, GI_SWORD_BGS) : GI_SWORD_BGS; if (!gSaveContext.n64ddFlag) {
getItemId = GI_SWORD_BGS;
} else {
getItemEntry = Randomizer_GetItemFromKnownCheck(RC_DMT_TRADE_CLAIM_CHECK, GI_SWORD_BGS);
getItemId = getItemEntry.getItemId;
}
this->unk_20C = 1; this->unk_20C = 1;
} }
if (INV_CONTENT(ITEM_TRADE_ADULT) == ITEM_EYEDROPS) { if (INV_CONTENT(ITEM_TRADE_ADULT) == ITEM_EYEDROPS) {
getItemId = GI_CLAIM_CHECK;
if (gSaveContext.n64ddFlag) { if (gSaveContext.n64ddFlag) {
getItemId = Randomizer_GetItemIdFromKnownCheck(RC_DMT_TRADE_EYEDROPS, GI_CLAIM_CHECK); getItemEntry = Randomizer_GetItemFromKnownCheck(RC_DMT_TRADE_EYEDROPS, GI_CLAIM_CHECK);
getItemId = getItemEntry.getItemId;
Randomizer_ConsumeAdultTradeItem(globalCtx, ITEM_EYEDROPS); Randomizer_ConsumeAdultTradeItem(globalCtx, ITEM_EYEDROPS);
} else {
getItemId = GI_CLAIM_CHECK;
} }
} }
if (INV_CONTENT(ITEM_TRADE_ADULT) == ITEM_SWORD_BROKEN) { if (INV_CONTENT(ITEM_TRADE_ADULT) == ITEM_SWORD_BROKEN) {
getItemId = GI_PRESCRIPTION;
if (gSaveContext.n64ddFlag) { if (gSaveContext.n64ddFlag) {
getItemId = Randomizer_GetItemIdFromKnownCheck(RC_DMT_TRADE_BROKEN_SWORD, GI_PRESCRIPTION); getItemEntry = Randomizer_GetItemFromKnownCheck(RC_DMT_TRADE_BROKEN_SWORD, GI_PRESCRIPTION);
Randomizer_ConsumeAdultTradeItem(globalCtx, ITEM_SWORD_BROKEN); Randomizer_ConsumeAdultTradeItem(globalCtx, ITEM_SWORD_BROKEN);
getItemId = getItemEntry.getItemId;
} else {
getItemId = GI_PRESCRIPTION;
} }
} }
} }
@ -982,7 +992,11 @@ void EnGo_GetItem(EnGo* this, GlobalContext* globalCtx) {
yDist = fabsf(this->actor.yDistToPlayer) + 1.0f; yDist = fabsf(this->actor.yDistToPlayer) + 1.0f;
xzDist = this->actor.xzDistToPlayer + 1.0f; xzDist = this->actor.xzDistToPlayer + 1.0f;
func_8002F434(&this->actor, globalCtx, getItemId, xzDist, yDist); if (!gSaveContext.n64ddFlag || getItemEntry.getItemId == GI_NONE) {
func_8002F434(&this->actor, globalCtx, getItemId, xzDist, yDist);
} else {
GiveItemEntryFromActor(&this->actor, globalCtx, getItemEntry, xzDist, yDist);
}
} }
} }

View File

@ -287,6 +287,13 @@ void EnGo2_GetItem(EnGo2* this, GlobalContext* globalCtx, s32 getItemId) {
fabsf(this->actor.yDistToPlayer) + 1.0f); fabsf(this->actor.yDistToPlayer) + 1.0f);
} }
void EnGo2_GetItemEntry(EnGo2* this, GlobalContext* globalCtx, GetItemEntry getItemEntry) {
this->getItemId = getItemEntry.getItemId;
this->getItemEntry = getItemEntry;
GiveItemEntryFromActor(&this->actor, globalCtx, getItemEntry, this->actor.xzDistToPlayer + 1.0f,
fabsf(this->actor.yDistToPlayer) + 1.0f);
}
s32 EnGo2_GetDialogState(EnGo2* this, GlobalContext* globalCtx) { s32 EnGo2_GetDialogState(EnGo2* this, GlobalContext* globalCtx) {
s16 dialogState = Message_GetState(&globalCtx->msgCtx); s16 dialogState = Message_GetState(&globalCtx->msgCtx);
@ -335,8 +342,6 @@ u16 EnGo2_GetTextIdGoronCityRollingBig(GlobalContext* globalCtx, EnGo2* this) {
} }
s16 EnGo2_GetStateGoronCityRollingBig(GlobalContext* globalCtx, EnGo2* this) { s16 EnGo2_GetStateGoronCityRollingBig(GlobalContext* globalCtx, EnGo2* this) {
s32 bombBagUpgrade;
switch (Message_GetState(&globalCtx->msgCtx)) { switch (Message_GetState(&globalCtx->msgCtx)) {
case TEXT_STATE_CLOSING: case TEXT_STATE_CLOSING:
return 2; return 2;
@ -345,11 +350,10 @@ s16 EnGo2_GetStateGoronCityRollingBig(GlobalContext* globalCtx, EnGo2* this) {
if (this->actor.textId == 0x3012) { if (this->actor.textId == 0x3012) {
this->actionFunc = EnGo2_SetupGetItem; this->actionFunc = EnGo2_SetupGetItem;
if(!gSaveContext.n64ddFlag) { if(!gSaveContext.n64ddFlag) {
bombBagUpgrade = CUR_CAPACITY(UPG_BOMB_BAG) == 30 ? GI_BOMB_BAG_40 : GI_BOMB_BAG_30; EnGo2_GetItem(this, globalCtx, CUR_CAPACITY(UPG_BOMB_BAG) == 30 ? GI_BOMB_BAG_40 : GI_BOMB_BAG_30);
} else { } else {
bombBagUpgrade = Randomizer_GetItemIdFromKnownCheck(RC_GC_ROLLING_GORON_AS_CHILD, GI_BOMB_BAG_40); EnGo2_GetItemEntry(this, globalCtx, Randomizer_GetItemFromKnownCheck(RC_GC_ROLLING_GORON_AS_CHILD, GI_BOMB_BAG_40));
} }
EnGo2_GetItem(this, globalCtx, bombBagUpgrade);
Message_CloseTextbox(globalCtx); Message_CloseTextbox(globalCtx);
gSaveContext.infTable[17] |= 0x4000; gSaveContext.infTable[17] |= 0x4000;
return 2; return 2;
@ -543,7 +547,7 @@ s16 EnGo2_GetStateGoronCityLink(GlobalContext* globalCtx, EnGo2* this) {
} }
gSaveContext.infTable[16] |= 0x200; gSaveContext.infTable[16] |= 0x200;
EnGo2_GetItem(this, globalCtx, Randomizer_GetItemIdFromKnownCheck(RC_GC_ROLLING_GORON_AS_ADULT, GI_TUNIC_GORON)); EnGo2_GetItemEntry(this, globalCtx, Randomizer_GetItemFromKnownCheck(RC_GC_ROLLING_GORON_AS_ADULT, GI_TUNIC_GORON));
this->actionFunc = EnGo2_SetupGetItem; this->actionFunc = EnGo2_SetupGetItem;
Flags_SetTreasure(globalCtx, 0x1F); Flags_SetTreasure(globalCtx, 0x1F);
return 2; return 2;
@ -622,7 +626,7 @@ s16 EnGo2_GetStateGoronDmtBiggoron(GlobalContext* globalCtx, EnGo2* this) {
return 0; return 0;
} }
EnGo2_GetItem(this, globalCtx, Randomizer_GetItemIdFromKnownCheck(RC_DMT_TRADE_CLAIM_CHECK, GI_SWORD_BGS)); EnGo2_GetItemEntry(this, globalCtx, Randomizer_GetItemFromKnownCheck(RC_DMT_TRADE_CLAIM_CHECK, GI_SWORD_BGS));
Flags_SetTreasure(globalCtx, 0x1F); Flags_SetTreasure(globalCtx, 0x1F);
} else { } else {
EnGo2_GetItem(this, globalCtx, GI_SWORD_BGS); EnGo2_GetItem(this, globalCtx, GI_SWORD_BGS);
@ -653,12 +657,14 @@ s16 EnGo2_GetStateGoronDmtBiggoron(GlobalContext* globalCtx, EnGo2* this) {
if (Message_ShouldAdvance(globalCtx)) { if (Message_ShouldAdvance(globalCtx)) {
if ((this->actor.textId == 0x3054) || (this->actor.textId == 0x3055)) { if ((this->actor.textId == 0x3054) || (this->actor.textId == 0x3055)) {
if (globalCtx->msgCtx.choiceIndex == 0) { if (globalCtx->msgCtx.choiceIndex == 0) {
u32 getItemId = GI_PRESCRIPTION;
if (gSaveContext.n64ddFlag) { if (gSaveContext.n64ddFlag) {
getItemId = Randomizer_GetItemIdFromKnownCheck(RC_DMT_TRADE_BROKEN_SWORD, GI_PRESCRIPTION); GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(RC_DMT_TRADE_BROKEN_SWORD, GI_PRESCRIPTION);
Randomizer_ConsumeAdultTradeItem(globalCtx, ITEM_SWORD_BROKEN); Randomizer_ConsumeAdultTradeItem(globalCtx, ITEM_SWORD_BROKEN);
EnGo2_GetItemEntry(this, globalCtx, getItemEntry);
} else {
u32 getItemId = GI_PRESCRIPTION;
EnGo2_GetItem(this, globalCtx, getItemId);
} }
EnGo2_GetItem(this, globalCtx, getItemId);
this->actionFunc = EnGo2_SetupGetItem; this->actionFunc = EnGo2_SetupGetItem;
return 2; return 2;
} }
@ -1575,6 +1581,7 @@ void EnGo2_Init(Actor* thisx, GlobalContext* globalCtx) {
this->unk_216 = this->actor.shape.rot.z; this->unk_216 = this->actor.shape.rot.z;
this->unk_26E = 1; this->unk_26E = 1;
this->path = Path_GetByIndex(globalCtx, (this->actor.params & 0x3E0) >> 5, 0x1F); this->path = Path_GetByIndex(globalCtx, (this->actor.params & 0x3E0) >> 5, 0x1F);
this->getItemEntry = (GetItemEntry)GET_ITEM_NONE;
switch (this->actor.params & 0x1F) { switch (this->actor.params & 0x1F) {
case GORON_CITY_ENTRANCE: case GORON_CITY_ENTRANCE:
case GORON_CITY_ISLAND: case GORON_CITY_ISLAND:
@ -1814,8 +1821,11 @@ void EnGo2_SetupGetItem(EnGo2* this, GlobalContext* globalCtx) {
this->actor.parent = NULL; this->actor.parent = NULL;
this->actionFunc = EnGo2_SetGetItem; this->actionFunc = EnGo2_SetGetItem;
} else { } else {
func_8002F434(&this->actor, globalCtx, this->getItemId, this->actor.xzDistToPlayer + 1.0f, if (!gSaveContext.n64ddFlag || this->getItemEntry.getItemId == GI_NONE) {
fabsf(this->actor.yDistToPlayer) + 1.0f); func_8002F434(&this->actor, globalCtx, this->getItemId, this->actor.xzDistToPlayer + 1.0f, fabsf(this->actor.yDistToPlayer) + 1.0f);
} else {
GiveItemEntryFromActor(&this->actor, globalCtx, this->getItemEntry, this->actor.xzDistToPlayer + 1.0f, fabsf(this->actor.yDistToPlayer) + 1.0f);
}
} }
} }
@ -1887,12 +1897,14 @@ void EnGo2_BiggoronEyedrops(EnGo2* this, GlobalContext* globalCtx) {
this->unk_26E = 2; this->unk_26E = 2;
this->skelAnime.playSpeed = 0.0f; this->skelAnime.playSpeed = 0.0f;
this->skelAnime.curFrame = this->skelAnime.endFrame; this->skelAnime.curFrame = this->skelAnime.endFrame;
u32 getItemId = GI_CLAIM_CHECK;
if (gSaveContext.n64ddFlag) { if (gSaveContext.n64ddFlag) {
getItemId = Randomizer_GetItemIdFromKnownCheck(RC_DMT_TRADE_EYEDROPS, GI_CLAIM_CHECK); GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(RC_DMT_TRADE_EYEDROPS, GI_CLAIM_CHECK);
Randomizer_ConsumeAdultTradeItem(globalCtx, ITEM_EYEDROPS); Randomizer_ConsumeAdultTradeItem(globalCtx, ITEM_EYEDROPS);
EnGo2_GetItemEntry(this, globalCtx, getItemEntry);
} else {
u32 getItemId = GI_CLAIM_CHECK;
EnGo2_GetItem(this, globalCtx, getItemId);
} }
EnGo2_GetItem(this, globalCtx, getItemId);
this->actionFunc = EnGo2_SetupGetItem; this->actionFunc = EnGo2_SetupGetItem;
this->goronState = 0; this->goronState = 0;
} }

View File

@ -104,6 +104,7 @@ typedef struct EnGo2 {
/* 0x0598 */ char unk_598[0x02]; /* 0x0598 */ char unk_598[0x02];
/* 0x059A */ s16 camId; /* 0x059A */ s16 camId;
/* 0x059C */ s16 unk_59C; /* 0x059C */ s16 unk_59C;
/* */ GetItemEntry getItemEntry;
} EnGo2; // size = 0x05A0 } EnGo2; // size = 0x05A0
#endif #endif

View File

@ -177,12 +177,14 @@ void func_80A6E740(EnHs* this, GlobalContext* globalCtx) {
this->actor.parent = NULL; this->actor.parent = NULL;
func_80A6E3A0(this, func_80A6E630); func_80A6E3A0(this, func_80A6E630);
} else { } else {
s32 itemId = GI_ODD_MUSHROOM;
if (gSaveContext.n64ddFlag) { if (gSaveContext.n64ddFlag) {
itemId = Randomizer_GetItemIdFromKnownCheck(RC_LW_TRADE_COJIRO, GI_ODD_MUSHROOM); GetItemEntry itemEntry = Randomizer_GetItemFromKnownCheck(RC_LW_TRADE_COJIRO, GI_ODD_MUSHROOM);
Randomizer_ConsumeAdultTradeItem(globalCtx, ITEM_COJIRO); Randomizer_ConsumeAdultTradeItem(globalCtx, ITEM_COJIRO);
GiveItemEntryFromActor(&this->actor, globalCtx, itemEntry, 10000.0f, 50.0f);
} else {
s32 itemId = GI_ODD_MUSHROOM;
func_8002F434(&this->actor, globalCtx, itemId, 10000.0f, 50.0f);
} }
func_8002F434(&this->actor, globalCtx, itemId, 10000.0f, 50.0f);
} }
this->unk_2A8 |= 1; this->unk_2A8 |= 1;
@ -193,12 +195,14 @@ void func_80A6E7BC(EnHs* this, GlobalContext* globalCtx) {
switch (globalCtx->msgCtx.choiceIndex) { switch (globalCtx->msgCtx.choiceIndex) {
case 0: case 0:
func_80A6E3A0(this, func_80A6E740); func_80A6E3A0(this, func_80A6E740);
s32 itemId = GI_ODD_MUSHROOM;
if (gSaveContext.n64ddFlag) { if (gSaveContext.n64ddFlag) {
itemId = Randomizer_GetItemIdFromKnownCheck(RC_LW_TRADE_COJIRO, GI_ODD_MUSHROOM); GetItemEntry itemEntry = Randomizer_GetItemFromKnownCheck(RC_LW_TRADE_COJIRO, GI_ODD_MUSHROOM);
Randomizer_ConsumeAdultTradeItem(globalCtx, ITEM_COJIRO); Randomizer_ConsumeAdultTradeItem(globalCtx, ITEM_COJIRO);
GiveItemEntryFromActor(&this->actor, globalCtx, itemEntry, 10000.0f, 50.0f);
} else {
s32 itemId = GI_ODD_MUSHROOM;
func_8002F434(&this->actor, globalCtx, itemId, 10000.0f, 50.0f);
} }
func_8002F434(&this->actor, globalCtx, itemId, 10000.0f, 50.0f);
break; break;
case 1: case 1:
Message_ContinueTextbox(globalCtx, 0x10B4); Message_ContinueTextbox(globalCtx, 0x10B4);

View File

@ -659,7 +659,18 @@ s16 func_80A70058(GlobalContext* globalCtx, Actor* thisx) {
gSaveContext.dogParams = 0; gSaveContext.dogParams = 0;
break; break;
case 0x709F: case 0x709F:
func_80A6F7CC(this, globalCtx, (gSaveContext.infTable[25] & 2) ? GI_RUPEE_BLUE : gSaveContext.n64ddFlag ? Randomizer_GetItemIdFromKnownCheck(RC_MARKET_LOST_DOG, GI_HEART_PIECE) : GI_HEART_PIECE); if (gSaveContext.infTable[25] & 2) { // Already brought the lost dog back
func_80A6F7CC(this, globalCtx, GI_RUPEE_BLUE);
} else {
if (!gSaveContext.n64ddFlag) {
func_80A6F7CC(this, globalCtx, GI_HEART_PIECE);
} else {
this->getItemEntry = Randomizer_GetItemFromKnownCheck(RC_MARKET_LOST_DOG, GI_HEART_PIECE);
// The follownig line and last arguments of GiveItemEntryFromActor are copied from func_80A6F7CC
this->unkGetItemId = this->getItemEntry.getItemId;
GiveItemEntryFromActor(&this->actor, globalCtx, this->getItemEntry, this->actor.xzDistToPlayer + 1.0f, fabsf(this->actor.yDistToPlayer) + 1.0f);
}
}
this->actionFunc = func_80A714C4; this->actionFunc = func_80A714C4;
break; break;
} }
@ -883,6 +894,7 @@ void EnHy_Init(Actor* thisx, GlobalContext* globalCtx) {
Actor_Kill(&this->actor); Actor_Kill(&this->actor);
} }
this->getItemEntry = (GetItemEntry)GET_ITEM_NONE;
this->actionFunc = EnHy_InitImpl; this->actionFunc = EnHy_InitImpl;
} }
@ -1050,8 +1062,11 @@ void func_80A714C4(EnHy* this, GlobalContext* globalCtx) {
if (Actor_HasParent(&this->actor, globalCtx)) { if (Actor_HasParent(&this->actor, globalCtx)) {
this->actionFunc = func_80A71530; this->actionFunc = func_80A71530;
} else { } else {
func_8002F434(&this->actor, globalCtx, this->unkGetItemId, this->actor.xzDistToPlayer + 1.0f, if (!gSaveContext.n64ddFlag || this->getItemEntry.getItemId == GI_NONE) {
fabsf(this->actor.yDistToPlayer) + 1.0f); func_8002F434(&this->actor, globalCtx, this->unkGetItemId, this->actor.xzDistToPlayer + 1.0f, fabsf(this->actor.yDistToPlayer) + 1.0f);
} else {
GiveItemEntryFromActor(&this->actor, globalCtx, this->getItemEntry, this->actor.xzDistToPlayer + 1.0f, fabsf(this->actor.yDistToPlayer) + 1.0f);
}
} }
} }

View File

@ -59,6 +59,7 @@ typedef struct EnHy {
/* 0x0270 */ Vec3s jointTable[16]; /* 0x0270 */ Vec3s jointTable[16];
/* 0x02D0 */ Vec3s morphTable[16]; /* 0x02D0 */ Vec3s morphTable[16];
/* 0x0330 */ u16 unk_330; /* 0x0330 */ u16 unk_330;
/* */ GetItemEntry getItemEntry;
} EnHy; // size = 0x0334 } EnHy; // size = 0x0334
#endif #endif

View File

@ -1230,12 +1230,14 @@ void func_80A99504(EnKo* this, GlobalContext* globalCtx) {
this->actor.parent = NULL; this->actor.parent = NULL;
this->actionFunc = func_80A99560; this->actionFunc = func_80A99560;
} else { } else {
s32 itemId = GI_SAW;
if (gSaveContext.n64ddFlag) { if (gSaveContext.n64ddFlag) {
itemId = Randomizer_GetItemIdFromKnownCheck(RC_LW_TRADE_ODD_POTION, GI_SAW); GetItemEntry itemEntry = Randomizer_GetItemFromKnownCheck(RC_LW_TRADE_ODD_POTION, GI_SAW);
Randomizer_ConsumeAdultTradeItem(globalCtx, ITEM_ODD_POTION); Randomizer_ConsumeAdultTradeItem(globalCtx, ITEM_ODD_POTION);
GiveItemEntryFromActor(&this->actor, globalCtx, itemEntry, 120.0f, 10.0f);
} else {
s32 itemId = GI_SAW;
func_8002F434(&this->actor, globalCtx, itemId, 120.0f, 10.0f);
} }
func_8002F434(&this->actor, globalCtx, itemId, 120.0f, 10.0f);
} }
} }

View File

@ -454,6 +454,7 @@ void EnKz_Wait(EnKz* this, GlobalContext* globalCtx) {
} }
void EnKz_SetupGetItem(EnKz* this, GlobalContext* globalCtx) { void EnKz_SetupGetItem(EnKz* this, GlobalContext* globalCtx) {
GetItemEntry getItemEntry = (GetItemEntry)GET_ITEM_NONE;
s32 getItemId; s32 getItemId;
f32 xzRange; f32 xzRange;
f32 yRange; f32 yRange;
@ -465,18 +466,24 @@ void EnKz_SetupGetItem(EnKz* this, GlobalContext* globalCtx) {
} else { } else {
if (gSaveContext.n64ddFlag) { if (gSaveContext.n64ddFlag) {
if (this->isTrading) { if (this->isTrading) {
getItemId = Randomizer_GetItemIdFromKnownCheck(RC_ZD_TRADE_PRESCRIPTION, GI_FROG); getItemEntry = Randomizer_GetItemFromKnownCheck(RC_ZD_TRADE_PRESCRIPTION, GI_FROG);
getItemId = getItemEntry.getItemId;
Randomizer_ConsumeAdultTradeItem(globalCtx, ITEM_PRESCRIPTION); Randomizer_ConsumeAdultTradeItem(globalCtx, ITEM_PRESCRIPTION);
Flags_SetTreasure(globalCtx, 0x1F); Flags_SetTreasure(globalCtx, 0x1F);
} else { } else {
getItemId = Randomizer_GetItemIdFromKnownCheck(RC_ZD_KING_ZORA_THAWED, GI_TUNIC_ZORA); getItemEntry = Randomizer_GetItemFromKnownCheck(RC_ZD_KING_ZORA_THAWED, GI_TUNIC_ZORA);
getItemId = getItemEntry.getItemId;
} }
} else { } else {
getItemId = this->isTrading ? GI_FROG : GI_TUNIC_ZORA; getItemId = this->isTrading ? GI_FROG : GI_TUNIC_ZORA;
} }
yRange = fabsf(this->actor.yDistToPlayer) + 1.0f; yRange = fabsf(this->actor.yDistToPlayer) + 1.0f;
xzRange = this->actor.xzDistToPlayer + 1.0f; xzRange = this->actor.xzDistToPlayer + 1.0f;
func_8002F434(&this->actor, globalCtx, getItemId, xzRange, yRange); if (!gSaveContext.n64ddFlag || getItemEntry.getItemId == GI_NONE) {
func_8002F434(&this->actor, globalCtx, getItemId, xzRange, yRange);
} else {
GiveItemEntryFromActor(&this->actor, globalCtx, getItemEntry, xzRange, yRange);
}
} }
} }

View File

@ -338,11 +338,11 @@ void func_80AA0EA0(EnMa1* this, GlobalContext* globalCtx) {
this->actor.parent = NULL; this->actor.parent = NULL;
this->actionFunc = func_80AA0EFC; this->actionFunc = func_80AA0EFC;
} else { } else {
if (gSaveContext.n64ddFlag) { if (!gSaveContext.n64ddFlag) {
GetItemID getItemId = Randomizer_GetItemIdFromKnownCheck(RC_HC_MALON_EGG, GI_WEIRD_EGG);
func_8002F434(&this->actor, globalCtx, getItemId, 120.0f, 10.0f);
} else {
func_8002F434(&this->actor, globalCtx, GI_WEIRD_EGG, 120.0f, 10.0f); func_8002F434(&this->actor, globalCtx, GI_WEIRD_EGG, 120.0f, 10.0f);
} else {
GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(RC_HC_MALON_EGG, GI_WEIRD_EGG);
GiveItemEntryFromActor(&this->actor, globalCtx, getItemEntry, 120.0f, 10.0f);
} }
} }
} }
@ -357,7 +357,7 @@ void func_80AA0EFC(EnMa1* this, GlobalContext* globalCtx) {
} }
void GivePlayerRandoRewardMalon(EnMa1* malon, GlobalContext* globalCtx, RandomizerCheck check) { void GivePlayerRandoRewardMalon(EnMa1* malon, GlobalContext* globalCtx, RandomizerCheck check) {
GetItemID getItemId = Randomizer_GetItemIdFromKnownCheck(check, GI_EPONAS_SONG); GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(check, RG_EPONAS_SONG);
// Prevents flag from getting set if we weren't able to get the item (i.e. Player is holding shield // Prevents flag from getting set if we weren't able to get the item (i.e. Player is holding shield
// when closing the textbox). // when closing the textbox).
if (malon->actor.parent != NULL && malon->actor.parent->id == GET_PLAYER(globalCtx)->actor.id && if (malon->actor.parent != NULL && malon->actor.parent->id == GET_PLAYER(globalCtx)->actor.id &&
@ -367,7 +367,7 @@ void GivePlayerRandoRewardMalon(EnMa1* malon, GlobalContext* globalCtx, Randomiz
// (confirmed via breakpoints in a vanilla save). // (confirmed via breakpoints in a vanilla save).
malon->actionFunc = func_80AA0D88; malon->actionFunc = func_80AA0D88;
} else if (!Flags_GetTreasure(globalCtx, 0x1F)) { } else if (!Flags_GetTreasure(globalCtx, 0x1F)) {
func_8002F434(&malon->actor, globalCtx, getItemId, 10000.0f, 100.0f); GiveItemEntryFromActor(&malon->actor, globalCtx, getItemEntry, 10000.0f, 100.0f);
} }
// make malon sing again after giving the item. // make malon sing again after giving the item.
malon->unk_1E8.unk_00 = 0; malon->unk_1E8.unk_00 = 0;

View File

@ -99,24 +99,28 @@ void func_80AACA94(EnMk* this, GlobalContext* globalCtx) {
gSaveContext.eventInf[1] &= ~1; gSaveContext.eventInf[1] &= ~1;
} }
} else { } else {
s32 getItemID = GI_EYEDROPS;
if (gSaveContext.n64ddFlag) { if (gSaveContext.n64ddFlag) {
getItemID = Randomizer_GetItemIdFromKnownCheck(RC_LH_TRADE_FROG, GI_EYEDROPS); GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(RC_LH_TRADE_FROG, GI_EYEDROPS);
Randomizer_ConsumeAdultTradeItem(globalCtx, ITEM_FROG); Randomizer_ConsumeAdultTradeItem(globalCtx, ITEM_FROG);
GiveItemEntryFromActor(&this->actor, globalCtx, getItemEntry, 10000.0f, 50.0f);
} else {
s32 getItemID = GI_EYEDROPS;
func_8002F434(&this->actor, globalCtx, getItemID, 10000.0f, 50.0f);
} }
func_8002F434(&this->actor, globalCtx, getItemID, 10000.0f, 50.0f);
} }
} }
void func_80AACB14(EnMk* this, GlobalContext* globalCtx) { void func_80AACB14(EnMk* this, GlobalContext* globalCtx) {
if (Actor_TextboxIsClosing(&this->actor, globalCtx)) { if (Actor_TextboxIsClosing(&this->actor, globalCtx)) {
this->actionFunc = func_80AACA94; this->actionFunc = func_80AACA94;
s32 getItemID = GI_EYEDROPS;
if (gSaveContext.n64ddFlag) { if (gSaveContext.n64ddFlag) {
getItemID = Randomizer_GetItemIdFromKnownCheck(RC_LH_TRADE_FROG, GI_EYEDROPS); GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(RC_LH_TRADE_FROG, GI_EYEDROPS);
Randomizer_ConsumeAdultTradeItem(globalCtx, ITEM_FROG); Randomizer_ConsumeAdultTradeItem(globalCtx, ITEM_FROG);
GiveItemEntryFromActor(&this->actor, globalCtx, getItemEntry, 10000.0f, 50.0f);
} else {
s32 getItemID = GI_EYEDROPS;
func_8002F434(&this->actor, globalCtx, getItemID, 10000.0f, 50.0f);
} }
func_8002F434(&this->actor, globalCtx, getItemID, 10000.0f, 50.0f);
} }
} }
@ -211,14 +215,24 @@ void func_80AACFA0(EnMk* this, GlobalContext* globalCtx) {
gSaveContext.itemGetInf[1] |= 1; gSaveContext.itemGetInf[1] |= 1;
} else { } else {
// not sure when/how/if this is getting called // not sure when/how/if this is getting called
func_8002F434(&this->actor, globalCtx, gSaveContext.n64ddFlag ? Randomizer_GetItemIdFromKnownCheck(RC_LH_LAB_DIVE, GI_HEART_PIECE) : GI_HEART_PIECE, 10000.0f, 50.0f); if (!gSaveContext.n64ddFlag) {
func_8002F434(&this->actor, globalCtx, GI_HEART_PIECE, 10000.0f, 50.0f);
} else {
GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(RC_LH_LAB_DIVE, GI_HEART_PIECE);
GiveItemEntryFromActor(&this->actor, globalCtx, getItemEntry, 10000.0f, 50.0f);
}
} }
} }
void func_80AAD014(EnMk* this, GlobalContext* globalCtx) { void func_80AAD014(EnMk* this, GlobalContext* globalCtx) {
if (Actor_TextboxIsClosing(&this->actor, globalCtx)) { if (Actor_TextboxIsClosing(&this->actor, globalCtx)) {
this->actionFunc = func_80AACFA0; this->actionFunc = func_80AACFA0;
func_8002F434(&this->actor, globalCtx, gSaveContext.n64ddFlag ? Randomizer_GetItemIdFromKnownCheck(RC_LH_LAB_DIVE, GI_HEART_PIECE) : GI_HEART_PIECE, 10000.0f, 50.0f); if (!gSaveContext.n64ddFlag) {
func_8002F434(&this->actor, globalCtx, GI_HEART_PIECE, 10000.0f, 50.0f);
} else {
GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(RC_LH_LAB_DIVE, GI_HEART_PIECE);
GiveItemEntryFromActor(&this->actor, globalCtx, getItemEntry, 10000.0f, 50.0f);
}
} }
this->flags |= 1; this->flags |= 1;

View File

@ -89,6 +89,7 @@ void EnNiwLady_Init(Actor* thisx, GlobalContext* globalCtx) {
osSyncPrintf("\n\n"); osSyncPrintf("\n\n");
this->actionFunc = func_80AB9F24; this->actionFunc = func_80AB9F24;
thisx->uncullZoneForward = 600.0f; thisx->uncullZoneForward = 600.0f;
this->getItemEntry = (GetItemEntry)GET_ITEM_NONE;
} }
void EnNiwLady_Destroy(Actor* thisx, GlobalContext* globalCtx) { void EnNiwLady_Destroy(Actor* thisx, GlobalContext* globalCtx) {
@ -305,12 +306,12 @@ void func_80ABA654(EnNiwLady* this, GlobalContext* globalCtx) {
if (!(gSaveContext.itemGetInf[0] & 0x1000)) { if (!(gSaveContext.itemGetInf[0] & 0x1000)) {
this->actor.parent = NULL; this->actor.parent = NULL;
if (gSaveContext.n64ddFlag) { if (!gSaveContext.n64ddFlag) {
s32 itemId = Randomizer_GetItemIdFromKnownCheck(RC_KAK_ANJU_AS_CHILD, GI_BOTTLE);
func_8002F434(&this->actor, globalCtx, itemId, 100.0f, 50.0f);
} else {
this->getItemId = GI_BOTTLE; this->getItemId = GI_BOTTLE;
func_8002F434(&this->actor, globalCtx, GI_BOTTLE, 100.0f, 50.0f); func_8002F434(&this->actor, globalCtx, GI_BOTTLE, 100.0f, 50.0f);
} else {
this->getItemEntry = Randomizer_GetItemFromKnownCheck(RC_KAK_ANJU_AS_CHILD, GI_BOTTLE);
GiveItemEntryFromActor(&this->actor, globalCtx, this->getItemEntry, 100.0f, 50.0f);
} }
this->actionFunc = func_80ABAC00; this->actionFunc = func_80ABAC00;
@ -395,11 +396,12 @@ void func_80ABA9B8(EnNiwLady* this, GlobalContext* globalCtx) {
Message_CloseTextbox(globalCtx); Message_CloseTextbox(globalCtx);
this->actor.parent = NULL; this->actor.parent = NULL;
if (gSaveContext.n64ddFlag) { if (!gSaveContext.n64ddFlag) {
s32 itemId = Randomizer_GetItemIdFromKnownCheck(RC_KAK_ANJU_AS_ADULT, GI_POCKET_EGG);
func_8002F434(&this->actor, globalCtx, itemId, 200.0f, 100.0f);
} else {
func_8002F434(&this->actor, globalCtx, GI_POCKET_EGG, 200.0f, 100.0f); func_8002F434(&this->actor, globalCtx, GI_POCKET_EGG, 200.0f, 100.0f);
} else {
// TODO: get-item-rework Adult trade sequence
this->getItemEntry = Randomizer_GetItemFromKnownCheck(RC_KAK_ANJU_AS_ADULT, GI_POCKET_EGG);
GiveItemEntryFromActor(&this->actor, globalCtx, this->getItemEntry, 200.0f, 100.0f);
} }
this->actionFunc = func_80ABAC00; this->actionFunc = func_80ABAC00;
@ -457,14 +459,19 @@ void func_80ABAC00(EnNiwLady* this, GlobalContext* globalCtx) {
if (gSaveContext.n64ddFlag) { if (gSaveContext.n64ddFlag) {
if (getItemId == GI_POCKET_EGG) { if (getItemId == GI_POCKET_EGG) {
getItemId = Randomizer_GetItemIdFromKnownCheck(RC_KAK_ANJU_AS_ADULT, GI_POCKET_EGG); // TODO: get-item-rework Adult trade sequence
this->getItemEntry = Randomizer_GetItemFromKnownCheck(RC_KAK_ANJU_AS_ADULT, GI_POCKET_EGG);
GiveItemEntryFromActor(&this->actor, globalCtx, this->getItemEntry, 200.0f, 100.0f);
} else { } else {
getItemId = Randomizer_GetItemIdFromKnownCheck(RC_KAK_TRADE_POCKET_CUCCO, GI_COJIRO); this->getItemEntry = Randomizer_GetItemFromKnownCheck(RC_KAK_TRADE_POCKET_CUCCO, GI_COJIRO);
Randomizer_ConsumeAdultTradeItem(globalCtx, ITEM_POCKET_CUCCO); Randomizer_ConsumeAdultTradeItem(globalCtx, ITEM_POCKET_CUCCO);
GiveItemEntryFromActor(&this->actor, globalCtx, this->getItemEntry, 200.0f, 100.0f);
} }
} }
} }
func_8002F434(&this->actor, globalCtx, getItemId, 200.0f, 100.0f); if (this->getItemEntry.getItemId == GI_NONE) {
func_8002F434(&this->actor, globalCtx, getItemId, 200.0f, 100.0f);
}
} }
} }

View File

@ -40,6 +40,7 @@ typedef struct EnNiwLady {
/* 0x0284 */ s32 getItemId; /* 0x0284 */ s32 getItemId;
/* 0x0288 */ struct_80034A14_arg1 unk_288; /* 0x0288 */ struct_80034A14_arg1 unk_288;
/* 0x02B0 */ ColliderCylinder collider; /* 0x02B0 */ ColliderCylinder collider;
/* 0x02FC */ GetItemEntry getItemEntry;
} EnNiwLady; // size = 0x02FC } EnNiwLady; // size = 0x02FC
#endif #endif

View File

@ -324,8 +324,8 @@ void func_80ABF708(EnOkarinaTag* this, GlobalContext* globalCtx) {
void GivePlayerRandoRewardSunSong(EnOkarinaTag* song, GlobalContext* globalCtx, RandomizerCheck check) { void GivePlayerRandoRewardSunSong(EnOkarinaTag* song, GlobalContext* globalCtx, RandomizerCheck check) {
Flags_SetTreasure(globalCtx, 0x1F); Flags_SetTreasure(globalCtx, 0x1F);
GetItemID getItemId = Randomizer_GetItemIdFromKnownCheck(check, GI_LETTER_ZELDA); GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(check, GI_LETTER_ZELDA);
func_8002F434(&song->actor, globalCtx, getItemId, 10000.0f, 100.0f); GiveItemEntryFromActor(&song->actor, globalCtx, getItemEntry, 10000.0f, 100.0f);
} }
void func_80ABF7CC(EnOkarinaTag* this, GlobalContext* globalCtx) { void func_80ABF7CC(EnOkarinaTag* this, GlobalContext* globalCtx) {

View File

@ -618,14 +618,12 @@ void func_80AF67D0(EnSa* this, GlobalContext* globalCtx) {
} }
void GivePlayerRandoRewardSaria(EnSa* saria, GlobalContext* globalCtx, RandomizerCheck check) { void GivePlayerRandoRewardSaria(EnSa* saria, GlobalContext* globalCtx, RandomizerCheck check) {
GetItemID getItemId = GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(check, RG_SARIAS_SONG);
Randomizer_GetItemIdFromKnownCheck(check, GI_SARIAS_SONG);
if (saria->actor.parent != NULL && saria->actor.parent->id == GET_PLAYER(globalCtx)->actor.id && if (saria->actor.parent != NULL && saria->actor.parent->id == GET_PLAYER(globalCtx)->actor.id &&
!Flags_GetTreasure(globalCtx, 0x1F)) { !Flags_GetTreasure(globalCtx, 0x1F)) {
Flags_SetTreasure(globalCtx, 0x1F); Flags_SetTreasure(globalCtx, 0x1F);
} else if (!Flags_GetTreasure(globalCtx, 0x1F)) { } else if (!Flags_GetTreasure(globalCtx, 0x1F)) {
func_8002F434(&saria->actor, globalCtx, getItemId, 10000.0f, 100.0f); GiveItemEntryFromActor(&saria->actor, globalCtx, getItemEntry, 10000.0f, 100.0f);
} }
} }

View File

@ -17,10 +17,12 @@ s32 func_80AFB748(EnSi* this, GlobalContext* globalCtx);
void func_80AFB768(EnSi* this, GlobalContext* globalCtx); void func_80AFB768(EnSi* this, GlobalContext* globalCtx);
void func_80AFB89C(EnSi* this, GlobalContext* globalCtx); void func_80AFB89C(EnSi* this, GlobalContext* globalCtx);
void func_80AFB950(EnSi* this, GlobalContext* globalCtx); void func_80AFB950(EnSi* this, GlobalContext* globalCtx);
void Randomizer_GrantSkullReward(EnSi* this, GlobalContext* globalCtx);
s32 textId = 0xB4; s32 textId = 0xB4;
s32 giveItemId = ITEM_SKULL_TOKEN; s32 giveItemId = ITEM_SKULL_TOKEN;
s32 getItemId; s32 getItemId;
GetItemEntry getItem;
static ColliderCylinderInit sCylinderInit = { static ColliderCylinderInit sCylinderInit = {
{ {
@ -98,30 +100,21 @@ void func_80AFB768(EnSi* this, GlobalContext* globalCtx) {
if (this->collider.base.ocFlags2 & OC2_HIT_PLAYER) { if (this->collider.base.ocFlags2 & OC2_HIT_PLAYER) {
this->collider.base.ocFlags2 &= ~OC2_HIT_PLAYER; this->collider.base.ocFlags2 &= ~OC2_HIT_PLAYER;
if (gSaveContext.n64ddFlag) { if (gSaveContext.n64ddFlag) {
getItemId = Randomizer_GetRandomizedItemId(GI_SKULL_TOKEN, this->actor.id, this->actor.params, globalCtx->sceneNum); Randomizer_GrantSkullReward(this, globalCtx);
if (getItemId == GI_ICE_TRAP) {
player->getItemId = GI_ICE_TRAP;
player->pendingIceTrap = true;
textId = 0xF8;
} else {
textId = sGetItemTable[getItemId - 1].textId;
giveItemId = sGetItemTable[getItemId - 1].itemId;
Item_Give(globalCtx, giveItemId);
}
player->getItemId = getItemId;
} else { } else {
Item_Give(globalCtx, giveItemId); Item_Give(globalCtx, giveItemId);
} }
if ((CVar_GetS32("gSkulltulaFreeze", 0) != 1 || giveItemId != ITEM_SKULL_TOKEN) && getItemId != GI_ICE_TRAP) { if ((CVar_GetS32("gSkulltulaFreeze", 0) != 1 || giveItemId != ITEM_SKULL_TOKEN) && getItemId != RG_ICE_TRAP) {
player->actor.freezeTimer = 20; player->actor.freezeTimer = 20;
} }
Message_StartTextbox(globalCtx, textId, NULL); Message_StartTextbox(globalCtx, textId, NULL);
if (gSaveContext.n64ddFlag) { if (gSaveContext.n64ddFlag && getItemId != RG_ICE_TRAP) {
Audio_PlayFanfare_Rando(getItemId); Audio_PlayFanfare_Rando(getItem);
} else { } else {
Audio_PlayFanfare(NA_BGM_SMALL_ITEM_GET); Audio_PlayFanfare(NA_BGM_SMALL_ITEM_GET);
} }
player->getItemEntry = (GetItemEntry)GET_ITEM_NONE;
this->actionFunc = func_80AFB950; this->actionFunc = func_80AFB950;
} else { } else {
Collider_UpdateCylinder(&this->actor, &this->collider); Collider_UpdateCylinder(&this->actor, &this->collider);
@ -134,33 +127,23 @@ void func_80AFB768(EnSi* this, GlobalContext* globalCtx) {
void func_80AFB89C(EnSi* this, GlobalContext* globalCtx) { void func_80AFB89C(EnSi* this, GlobalContext* globalCtx) {
Player* player = GET_PLAYER(globalCtx); Player* player = GET_PLAYER(globalCtx);
Math_SmoothStepToF(&this->actor.scale.x, 0.25f, 0.4f, 1.0f, 0.0f); Math_SmoothStepToF(&this->actor.scale.x, 0.25f, 0.4f, 1.0f, 0.0f);
Actor_SetScale(&this->actor, this->actor.scale.x); Actor_SetScale(&this->actor, this->actor.scale.x);
this->actor.shape.rot.y += 0x400; this->actor.shape.rot.y += 0x400;
if (!CHECK_FLAG_ALL(this->actor.flags, ACTOR_FLAG_13)) { if (!CHECK_FLAG_ALL(this->actor.flags, ACTOR_FLAG_13)) {
if (gSaveContext.n64ddFlag) { if (gSaveContext.n64ddFlag) {
getItemId = Randomizer_GetRandomizedItemId(GI_SKULL_TOKEN, this->actor.id, this->actor.params, globalCtx->sceneNum); Randomizer_GrantSkullReward(this, globalCtx);
if (getItemId == GI_ICE_TRAP) {
player->getItemId = GI_ICE_TRAP;
player->pendingIceTrap = true;
textId = 0xF8;
} else {
textId = sGetItemTable[getItemId - 1].textId;
giveItemId = sGetItemTable[getItemId - 1].itemId;
Item_Give(globalCtx, giveItemId);
}
player->getItemId = getItemId;
} else { } else {
Item_Give(globalCtx, giveItemId); Item_Give(globalCtx, giveItemId);
} }
Message_StartTextbox(globalCtx, textId, NULL); Message_StartTextbox(globalCtx, textId, NULL);
if (gSaveContext.n64ddFlag) { if (gSaveContext.n64ddFlag && getItemId != RG_ICE_TRAP) {
Audio_PlayFanfare_Rando(getItemId); Audio_PlayFanfare_Rando(getItem);
} else { } else {
Audio_PlayFanfare(NA_BGM_SMALL_ITEM_GET); Audio_PlayFanfare(NA_BGM_SMALL_ITEM_GET);
} }
player->getItemEntry = (GetItemEntry)GET_ITEM_NONE;
this->actionFunc = func_80AFB950; this->actionFunc = func_80AFB950;
} }
} }
@ -169,7 +152,7 @@ void func_80AFB950(EnSi* this, GlobalContext* globalCtx) {
Player* player = GET_PLAYER(globalCtx); Player* player = GET_PLAYER(globalCtx);
if (Message_GetState(&globalCtx->msgCtx) != TEXT_STATE_CLOSING && if (Message_GetState(&globalCtx->msgCtx) != TEXT_STATE_CLOSING &&
((CVar_GetS32("gSkulltulaFreeze", 0) != 1 || giveItemId != ITEM_SKULL_TOKEN) && getItemId != GI_ICE_TRAP)) { ((CVar_GetS32("gSkulltulaFreeze", 0) != 1 || giveItemId != ITEM_SKULL_TOKEN) && getItemId != RG_ICE_TRAP)) {
player->actor.freezeTimer = 10; player->actor.freezeTimer = 10;
} else { } else {
SET_GS_FLAGS((this->actor.params & 0x1F00) >> 8, this->actor.params & 0xFF); SET_GS_FLAGS((this->actor.params & 0x1F00) >> 8, this->actor.params & 0xFF);
@ -195,16 +178,35 @@ void EnSi_Draw(Actor* thisx, GlobalContext* globalCtx) {
if (!gSaveContext.n64ddFlag) { if (!gSaveContext.n64ddFlag) {
GetItem_Draw(globalCtx, GID_SKULL_TOKEN_2); GetItem_Draw(globalCtx, GID_SKULL_TOKEN_2);
} else { } else {
getItemId = Randomizer_GetRandomizedItemId(GI_SKULL_TOKEN, this->actor.id, this->actor.params, globalCtx->sceneNum); getItem = Randomizer_GetRandomizedItem(GI_SKULL_TOKEN, this->actor.id, this->actor.params, globalCtx->sceneNum);
if (getItemId >= GI_MINUET_OF_FOREST && getItemId <= GI_DOUBLE_DEFENSE) { EnItem00_CustomItemsParticles(&this->actor, globalCtx, getItem);
EnItem00_CustomItemsParticles(&this->actor, globalCtx, getItemId); if (getItem.itemId != ITEM_SKULL_TOKEN) {
}
if (getItemId != ITEM_SKULL_TOKEN) {
f32 mtxScale = 1.5f; f32 mtxScale = 1.5f;
Matrix_Scale(mtxScale, mtxScale, mtxScale, MTXMODE_APPLY); Matrix_Scale(mtxScale, mtxScale, mtxScale, MTXMODE_APPLY);
} }
GetItem_Draw(globalCtx, Randomizer_GetItemModelFromId(getItemId)); GetItem_Draw(globalCtx, getItem.gid);
} }
} }
} }
void Randomizer_GrantSkullReward(EnSi* this, GlobalContext* globalCtx) {
Player* player = GET_PLAYER(globalCtx);
getItem = Randomizer_GetRandomizedItem(GI_SKULL_TOKEN, this->actor.id, this->actor.params, globalCtx->sceneNum);
getItemId = getItem.getItemId;
if (getItemId == RG_ICE_TRAP) {
player->pendingIceTrap = true;
textId = 0xF8;
} else {
textId = getItem.textId;
giveItemId = getItem.itemId;
if (getItem.modIndex == MOD_NONE) {
Item_Give(globalCtx, giveItemId);
} else if (getItem.modIndex == MOD_RANDOMIZER) {
Randomizer_Item_Give(globalCtx, getItem);
}
}
// player->getItemId = getItemId;
player->getItemEntry = getItem;
}

View File

@ -1035,8 +1035,12 @@ void EnSkj_SariaSongTalk(EnSkj* this, GlobalContext* globalCtx) {
EnSkj_SetupWaitInRange(this); EnSkj_SetupWaitInRange(this);
} else { } else {
func_80AFFE24(this); func_80AFFE24(this);
func_8002F434(&this->actor, globalCtx, gSaveContext.n64ddFlag ? Randomizer_GetItemIdFromKnownCheck(RC_LW_SKULL_KID, GI_HEART_PIECE) : GI_HEART_PIECE, EnSkj_GetItemXzRange(this), if (!gSaveContext.n64ddFlag) {
EnSkj_GetItemYRange(this)); func_8002F434(&this->actor, globalCtx, GI_HEART_PIECE, EnSkj_GetItemXzRange(this), EnSkj_GetItemYRange(this));
} else {
GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(RC_LW_SKULL_KID, GI_HEART_PIECE);
GiveItemEntryFromActor(&this->actor, globalCtx, getItemEntry, EnSkj_GetItemXzRange(this), EnSkj_GetItemYRange(this));
}
} }
} }
} }
@ -1050,7 +1054,12 @@ void func_80AFFE44(EnSkj* this, GlobalContext* globalCtx) {
this->actor.parent = NULL; this->actor.parent = NULL;
EnSkj_SetupPostSariasSong(this); EnSkj_SetupPostSariasSong(this);
} else { } else {
func_8002F434(&this->actor, globalCtx, gSaveContext.n64ddFlag ? Randomizer_GetItemIdFromKnownCheck(RC_LW_SKULL_KID, GI_HEART_PIECE) : GI_HEART_PIECE, EnSkj_GetItemXzRange(this), EnSkj_GetItemYRange(this)); if (!gSaveContext.n64ddFlag) {
func_8002F434(&this->actor, globalCtx, GI_HEART_PIECE, EnSkj_GetItemXzRange(this), EnSkj_GetItemYRange(this));
} else {
GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(RC_LW_SKULL_KID, GI_HEART_PIECE);
GiveItemEntryFromActor(&this->actor, globalCtx, getItemEntry, EnSkj_GetItemXzRange(this), EnSkj_GetItemYRange(this));
}
} }
} }
@ -1527,11 +1536,12 @@ void EnSkj_WonOcarinaMiniGame(EnSkj* this, GlobalContext* globalCtx) {
void EnSkj_WaitToGiveReward(EnSkj* this, GlobalContext* globalCtx) { void EnSkj_WaitToGiveReward(EnSkj* this, GlobalContext* globalCtx) {
if ((Message_GetState(&globalCtx->msgCtx) == TEXT_STATE_DONE) && Message_ShouldAdvance(globalCtx)) { if ((Message_GetState(&globalCtx->msgCtx) == TEXT_STATE_DONE) && Message_ShouldAdvance(globalCtx)) {
func_8002F434(&this->actor, globalCtx, if (gSaveContext.n64ddFlag && gSaveContext.ocarinaGameRoundNum != 3) {
gSaveContext.n64ddFlag && gSaveContext.ocarinaGameRoundNum != 3 GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(RC_LW_OCARINA_MEMORY_GAME, GI_HEART_PIECE);
? Randomizer_GetItemIdFromKnownCheck(RC_LW_OCARINA_MEMORY_GAME, GI_HEART_PIECE) GiveItemEntryFromActor(&this->actor, globalCtx, getItemEntry, 26.0f, 26.0f);
: sOcarinaGameRewards[gSaveContext.ocarinaGameRoundNum], } else {
26.0f, 26.0f); func_8002F434(&this->actor, globalCtx, sOcarinaGameRewards[gSaveContext.ocarinaGameRoundNum], 26.0f, 26.0f);
}
this->actionFunc = EnSkj_GiveOcarinaGameReward; this->actionFunc = EnSkj_GiveOcarinaGameReward;
} }
@ -1542,11 +1552,12 @@ void EnSkj_GiveOcarinaGameReward(EnSkj* this, GlobalContext* globalCtx) {
this->actor.parent = NULL; this->actor.parent = NULL;
this->actionFunc = EnSkj_FinishOcarinaGameRound; this->actionFunc = EnSkj_FinishOcarinaGameRound;
} else { } else {
func_8002F434(&this->actor, globalCtx, if (gSaveContext.n64ddFlag && gSaveContext.ocarinaGameRoundNum != 3) {
gSaveContext.n64ddFlag && gSaveContext.ocarinaGameRoundNum != 3 GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(RC_LW_OCARINA_MEMORY_GAME, GI_HEART_PIECE);
? Randomizer_GetItemIdFromKnownCheck(RC_LW_OCARINA_MEMORY_GAME, GI_HEART_PIECE) GiveItemEntryFromActor(&this->actor, globalCtx, getItemEntry, 26.0f, 26.0f);
: sOcarinaGameRewards[gSaveContext.ocarinaGameRoundNum], } else {
26.0f, 26.0f); func_8002F434(&this->actor, globalCtx, sOcarinaGameRewards[gSaveContext.ocarinaGameRoundNum], 26.0f, 26.0f);
}
} }
} }

View File

@ -239,27 +239,29 @@ void EnSth_ParentRewardObtainedWait(EnSth* this, GlobalContext* globalCtx) {
void EnSth_GivePlayerItem(EnSth* this, GlobalContext* globalCtx) { void EnSth_GivePlayerItem(EnSth* this, GlobalContext* globalCtx) {
u16 getItemId = sGetItemIds[this->actor.params]; u16 getItemId = sGetItemIds[this->actor.params];
GetItemEntry getItemEntry = (GetItemEntry)GET_ITEM_NONE;
if (gSaveContext.n64ddFlag) { if (gSaveContext.n64ddFlag) {
switch (getItemId) { switch (getItemId) {
case GI_RUPEE_GOLD: case GI_RUPEE_GOLD:
break; break;
case GI_WALLET_ADULT: case GI_WALLET_ADULT:
getItemId = Randomizer_GetItemIdFromKnownCheck(RC_KAK_10_GOLD_SKULLTULA_REWARD, GI_WALLET_ADULT); getItemEntry = Randomizer_GetItemFromKnownCheck(RC_KAK_10_GOLD_SKULLTULA_REWARD, GI_WALLET_ADULT);
break; break;
case GI_STONE_OF_AGONY: case GI_STONE_OF_AGONY:
getItemId = Randomizer_GetItemIdFromKnownCheck(RC_KAK_20_GOLD_SKULLTULA_REWARD, GI_STONE_OF_AGONY); getItemEntry = Randomizer_GetItemFromKnownCheck(RC_KAK_20_GOLD_SKULLTULA_REWARD, GI_STONE_OF_AGONY);
break; break;
case GI_WALLET_GIANT: case GI_WALLET_GIANT:
getItemId = Randomizer_GetItemIdFromKnownCheck(RC_KAK_30_GOLD_SKULLTULA_REWARD, GI_WALLET_GIANT); getItemEntry = Randomizer_GetItemFromKnownCheck(RC_KAK_30_GOLD_SKULLTULA_REWARD, GI_WALLET_GIANT);
break; break;
case GI_BOMBCHUS_10: case GI_BOMBCHUS_10:
getItemId = Randomizer_GetItemIdFromKnownCheck(RC_KAK_40_GOLD_SKULLTULA_REWARD, GI_BOMBCHUS_10); getItemEntry = Randomizer_GetItemFromKnownCheck(RC_KAK_40_GOLD_SKULLTULA_REWARD, GI_BOMBCHUS_10);
break; break;
case GI_HEART_PIECE: case GI_HEART_PIECE:
getItemId = Randomizer_GetItemIdFromKnownCheck(RC_KAK_50_GOLD_SKULLTULA_REWARD, GI_HEART_PIECE); getItemEntry = Randomizer_GetItemFromKnownCheck(RC_KAK_50_GOLD_SKULLTULA_REWARD, GI_HEART_PIECE);
break; break;
} }
getItemId = getItemEntry.getItemId;
} else { } else {
switch (this->actor.params) { switch (this->actor.params) {
case 1: case 1:
@ -277,7 +279,11 @@ void EnSth_GivePlayerItem(EnSth* this, GlobalContext* globalCtx) {
} }
} }
func_8002F434(&this->actor, globalCtx, getItemId, 10000.0f, 50.0f); if (!gSaveContext.n64ddFlag || getItemEntry.getItemId == GI_NONE) {
func_8002F434(&this->actor, globalCtx, getItemId, 10000.0f, 50.0f);
} else {
GiveItemEntryFromActor(&this->actor, globalCtx, getItemEntry, 10000.0f, 50.0f);
}
} }
void EnSth_GiveReward(EnSth* this, GlobalContext* globalCtx) { void EnSth_GiveReward(EnSth* this, GlobalContext* globalCtx) {

View File

@ -169,6 +169,7 @@ void EnSyatekiMan_Init(Actor* thisx, GlobalContext* globalCtx) {
this->blinkFunc = EnSyatekiMan_BlinkWait; this->blinkFunc = EnSyatekiMan_BlinkWait;
this->actor.colChkInfo.cylRadius = 100; this->actor.colChkInfo.cylRadius = 100;
this->actionFunc = EnSyatekiMan_Start; this->actionFunc = EnSyatekiMan_Start;
this->getItemEntry = (GetItemEntry)GET_ITEM_NONE;
} }
void EnSyatekiMan_Destroy(Actor* thisx, GlobalContext* globalCtx) { void EnSyatekiMan_Destroy(Actor* thisx, GlobalContext* globalCtx) {
@ -336,7 +337,8 @@ void EnSyatekiMan_EndGame(EnSyatekiMan* this, GlobalContext* globalCtx) {
this->actor.parent = NULL; this->actor.parent = NULL;
if (!LINK_IS_ADULT) { if (!LINK_IS_ADULT) {
if(gSaveContext.n64ddFlag && !Flags_GetTreasure(globalCtx, 0x1E)) { if(gSaveContext.n64ddFlag && !Flags_GetTreasure(globalCtx, 0x1E)) {
this->getItemId = Randomizer_GetItemIdFromKnownCheck(RC_MARKET_SHOOTING_GALLERY_REWARD, GI_BULLET_BAG_50); this->getItemEntry = Randomizer_GetItemFromKnownCheck(RC_MARKET_SHOOTING_GALLERY_REWARD, GI_BULLET_BAG_50);
this->getItemId = this->getItemEntry.getItemId;
Flags_SetTreasure(globalCtx, 0x1E); Flags_SetTreasure(globalCtx, 0x1E);
} else if (!gSaveContext.n64ddFlag && !(gSaveContext.itemGetInf[0] & 0x2000)) { } else if (!gSaveContext.n64ddFlag && !(gSaveContext.itemGetInf[0] & 0x2000)) {
osSyncPrintf(VT_FGCOL(GREEN) "☆☆☆☆☆ Equip_Pachinko ☆☆☆☆☆ %d\n" VT_RST, osSyncPrintf(VT_FGCOL(GREEN) "☆☆☆☆☆ Equip_Pachinko ☆☆☆☆☆ %d\n" VT_RST,
@ -351,7 +353,8 @@ void EnSyatekiMan_EndGame(EnSyatekiMan* this, GlobalContext* globalCtx) {
} }
} else { } else {
if(gSaveContext.n64ddFlag && !Flags_GetTreasure(globalCtx, 0x1F)) { if(gSaveContext.n64ddFlag && !Flags_GetTreasure(globalCtx, 0x1F)) {
this->getItemId = Randomizer_GetItemIdFromKnownCheck(RC_KAK_SHOOTING_GALLERY_REWARD, GI_QUIVER_50); this->getItemEntry = Randomizer_GetItemFromKnownCheck(RC_KAK_SHOOTING_GALLERY_REWARD, GI_QUIVER_50);
this->getItemId = this->getItemEntry.getItemId;
Flags_SetTreasure(globalCtx, 0x1F); Flags_SetTreasure(globalCtx, 0x1F);
} else if (!gSaveContext.n64ddFlag && !(gSaveContext.itemGetInf[0] & 0x4000)) { } else if (!gSaveContext.n64ddFlag && !(gSaveContext.itemGetInf[0] & 0x4000)) {
osSyncPrintf(VT_FGCOL(GREEN) "☆☆☆☆☆ Equip_Bow ☆☆☆☆☆ %d\n" VT_RST, osSyncPrintf(VT_FGCOL(GREEN) "☆☆☆☆☆ Equip_Bow ☆☆☆☆☆ %d\n" VT_RST,
@ -371,7 +374,11 @@ void EnSyatekiMan_EndGame(EnSyatekiMan* this, GlobalContext* globalCtx) {
this->getItemId = GI_RUPEE_PURPLE; this->getItemId = GI_RUPEE_PURPLE;
} }
} }
func_8002F434(&this->actor, globalCtx, this->getItemId, 2000.0f, 1000.0f); if (!gSaveContext.n64ddFlag || this->getItemEntry.getItemId == GI_NONE) {
func_8002F434(&this->actor, globalCtx, this->getItemId, 2000.0f, 1000.0f);
} else {
GiveItemEntryFromActor(&this->actor, globalCtx, this->getItemEntry, 2000.0f, 1000.0f);
}
this->actionFunc = EnSyatekiMan_GivePrize; this->actionFunc = EnSyatekiMan_GivePrize;
break; break;
case SYATEKI_RESULT_ALMOST: case SYATEKI_RESULT_ALMOST:
@ -400,7 +407,11 @@ void EnSyatekiMan_GivePrize(EnSyatekiMan* this, GlobalContext* globalCtx) {
if (Actor_HasParent(&this->actor, globalCtx)) { if (Actor_HasParent(&this->actor, globalCtx)) {
this->actionFunc = EnSyatekiMan_FinishPrize; this->actionFunc = EnSyatekiMan_FinishPrize;
} else { } else {
func_8002F434(&this->actor, globalCtx, this->getItemId, 2000.0f, 1000.0f); if (!gSaveContext.n64ddFlag || this->getItemEntry.getItemId == GI_NONE) {
func_8002F434(&this->actor, globalCtx, this->getItemId, 2000.0f, 1000.0f);
} else {
GiveItemEntryFromActor(&this->actor, globalCtx, this->getItemEntry, 2000.0f, 1000.0f);
}
} }
} }

View File

@ -28,6 +28,7 @@ typedef struct EnSyatekiMan {
/* 0x0220 */ Actor* tempGallery; /* 0x0220 */ Actor* tempGallery;
/* 0x0224 */ EnSyatekiManOtherFunc blinkFunc; // Seems to be part of a blink system with unk_20C and unk_20E, but it's unused. /* 0x0224 */ EnSyatekiManOtherFunc blinkFunc; // Seems to be part of a blink system with unk_20C and unk_20E, but it's unused.
/* 0x0228 */ s16 csCam; /* 0x0228 */ s16 csCam;
/* */ GetItemEntry getItemEntry;
} EnSyatekiMan; // size = 0x022C } EnSyatekiMan; // size = 0x022C
#endif #endif

View File

@ -876,7 +876,12 @@ void func_80B15E80(EnTa* this, GlobalContext* globalCtx) {
} else if (this->unk_2E0 & 2) { } else if (this->unk_2E0 & 2) {
func_8002F434(&this->actor, globalCtx, GI_MILK, 10000.0f, 50.0f); func_8002F434(&this->actor, globalCtx, GI_MILK, 10000.0f, 50.0f);
} else { } else {
func_8002F434(&this->actor, globalCtx, GI_MILK_BOTTLE, 10000.0f, 50.0f); if (!gSaveContext.n64ddFlag) {
func_8002F434(&this->actor, globalCtx, GI_MILK_BOTTLE, 10000.0f, 50.0f);
} else {
GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(RC_LLR_TALONS_CHICKENS, GI_MILK_BOTTLE);
GiveItemEntryFromActor(&this->actor, globalCtx, getItemEntry, 10000.0f, 50.0f);
}
} }
this->unk_2E0 |= 1; this->unk_2E0 |= 1;
} }
@ -886,7 +891,12 @@ void func_80B15F54(EnTa* this, GlobalContext* globalCtx) {
Message_CloseTextbox(globalCtx); Message_CloseTextbox(globalCtx);
this->unk_2E0 &= ~0x2; this->unk_2E0 &= ~0x2;
func_80B13AA0(this, func_80B15E80, func_80B16938); func_80B13AA0(this, func_80B15E80, func_80B16938);
func_8002F434(&this->actor, globalCtx, gSaveContext.n64ddFlag ? Randomizer_GetItemIdFromKnownCheck(RC_LLR_TALONS_CHICKENS, GI_MILK_BOTTLE) : GI_MILK_BOTTLE, 10000.0f, 50.0f); if (!gSaveContext.n64ddFlag) {
func_8002F434(&this->actor, globalCtx, GI_MILK_BOTTLE, 10000.0f, 50.0f);
} else {
GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(RC_LLR_TALONS_CHICKENS, GI_MILK_BOTTLE);
GiveItemEntryFromActor(&this->actor, globalCtx, getItemEntry, 10000.0f, 50.0f);
}
} }
} }

View File

@ -314,12 +314,14 @@ void func_80B20768(EnToryo* this, GlobalContext* globalCtx) {
this->actor.parent = NULL; this->actor.parent = NULL;
this->unk_1E4 = 5; this->unk_1E4 = 5;
} else { } else {
s32 itemId = GI_SWORD_BROKEN;
if (gSaveContext.n64ddFlag) { if (gSaveContext.n64ddFlag) {
itemId = Randomizer_GetItemIdFromKnownCheck(RC_GV_TRADE_SAW, GI_SWORD_BROKEN); GetItemEntry itemEntry = Randomizer_GetItemFromKnownCheck(RC_GV_TRADE_SAW, GI_SWORD_BROKEN);
Randomizer_ConsumeAdultTradeItem(globalCtx, ITEM_SAW); Randomizer_ConsumeAdultTradeItem(globalCtx, ITEM_SAW);
GiveItemEntryFromActor(&this->actor, globalCtx, itemEntry, 100.0f, 10.0f);
} else {
s32 itemId = GI_SWORD_BROKEN;
func_8002F434(&this->actor, globalCtx, itemId, 100.0f, 10.0f);
} }
func_8002F434(&this->actor, globalCtx, itemId, 100.0f, 10.0f);
} }
return; return;
} }

View File

@ -289,18 +289,18 @@ void func_80B3CA38(EnXc* this, GlobalContext* globalCtx) {
void GivePlayerRandoRewardSheikSong(EnXc* sheik, GlobalContext* globalCtx, RandomizerCheck check, int sheikType, GetItemID ogSongId) { void GivePlayerRandoRewardSheikSong(EnXc* sheik, GlobalContext* globalCtx, RandomizerCheck check, int sheikType, GetItemID ogSongId) {
Player* player = GET_PLAYER(globalCtx); Player* player = GET_PLAYER(globalCtx);
if (sheik->actor.parent != NULL && sheik->actor.parent->id == player->actor.id && if (!(gSaveContext.eventChkInf[5] & sheikType)) {
!(gSaveContext.eventChkInf[5] & sheikType)) { GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(check, ogSongId);
gSaveContext.eventChkInf[5] |= sheikType;
} else if (!(gSaveContext.eventChkInf[5] & sheikType)) {
GetItemID getItemId = Randomizer_GetItemIdFromKnownCheck(check, ogSongId);
if (check == RC_SHEIK_AT_TEMPLE && !Flags_GetTreasure(globalCtx, 0x1F)) { if (check == RC_SHEIK_AT_TEMPLE && !Flags_GetTreasure(globalCtx, 0x1F)) {
if (func_8002F434(&sheik->actor, globalCtx, getItemId, 10000.0f, 100.0f)) { if (GiveItemEntryFromActor(&sheik->actor, globalCtx, getItemEntry, 10000.0f, 100.0f)) {
player->pendingFlag.flagID = 0x1F; player->pendingFlag.flagID = 0x1F;
player->pendingFlag.flagType = FLAG_SCENE_TREASURE; player->pendingFlag.flagType = FLAG_SCENE_TREASURE;
} }
} else if (check != RC_SHEIK_AT_TEMPLE) { } else if (check != RC_SHEIK_AT_TEMPLE) {
func_8002F434(&sheik->actor, globalCtx, getItemId, 10000.0f, 100.0f); if (GiveItemEntryFromActor(&sheik->actor, globalCtx, getItemEntry, 10000.0f, 100.0f)) {
player->pendingFlag.flagID = (0x5 << 4) | (sheikType & 0xF) >> 1;
player->pendingFlag.flagType = FLAG_EVENT_CHECK_INF;
}
} }
} }
} }
@ -318,7 +318,7 @@ s32 EnXc_MinuetCS(EnXc* this, GlobalContext* globalCtx) {
gSaveContext.eventChkInf[5] |= 1; gSaveContext.eventChkInf[5] |= 1;
Item_Give(globalCtx, ITEM_SONG_MINUET); Item_Give(globalCtx, ITEM_SONG_MINUET);
} else { } else {
GivePlayerRandoRewardSheikSong(this, globalCtx, RC_SHEIK_IN_FOREST, 1, GI_MINUET_OF_FOREST); GivePlayerRandoRewardSheikSong(this, globalCtx, RC_SHEIK_IN_FOREST, 1, RG_MINUET_OF_FOREST);
return false; return false;
} }
return true; return true;
@ -354,7 +354,7 @@ s32 EnXc_BoleroCS(EnXc* this, GlobalContext* globalCtx) {
gSaveContext.eventChkInf[5] |= 2; gSaveContext.eventChkInf[5] |= 2;
Item_Give(globalCtx, ITEM_SONG_BOLERO); Item_Give(globalCtx, ITEM_SONG_BOLERO);
} else { } else {
GivePlayerRandoRewardSheikSong(this, globalCtx, RC_SHEIK_IN_CRATER, 2, GI_BOLERO_OF_FIRE); GivePlayerRandoRewardSheikSong(this, globalCtx, RC_SHEIK_IN_CRATER, 2, RG_BOLERO_OF_FIRE);
return false; return false;
} }
return true; return true;
@ -395,7 +395,7 @@ s32 EnXc_SerenadeCS(EnXc* this, GlobalContext* globalCtx) {
gSaveContext.eventChkInf[5] |= 4; // Learned Serenade of Water Flag gSaveContext.eventChkInf[5] |= 4; // Learned Serenade of Water Flag
Item_Give(globalCtx, ITEM_SONG_SERENADE); Item_Give(globalCtx, ITEM_SONG_SERENADE);
} else { } else {
GivePlayerRandoRewardSheikSong(this, globalCtx, RC_SHEIK_IN_ICE_CAVERN, 4, GI_SERENADE_OF_WATER); GivePlayerRandoRewardSheikSong(this, globalCtx, RC_SHEIK_IN_ICE_CAVERN, 4, RG_SERENADE_OF_WATER);
return false; return false;
} }
osSyncPrintf("ブーツを取った!!!!!!!!!!!!!!!!!!\n"); osSyncPrintf("ブーツを取った!!!!!!!!!!!!!!!!!!\n");
@ -2206,7 +2206,7 @@ void EnXc_InitTempleOfTime(EnXc* this, GlobalContext* globalCtx) {
gSaveContext.cutsceneTrigger = 1; gSaveContext.cutsceneTrigger = 1;
this->action = SHEIK_ACTION_30; this->action = SHEIK_ACTION_30;
} else { } else {
GivePlayerRandoRewardSheikSong(this, globalCtx, RC_SHEIK_AT_TEMPLE, 0x20, GI_PRELUDE_OF_LIGHT); GivePlayerRandoRewardSheikSong(this, globalCtx, RC_SHEIK_AT_TEMPLE, 0x20, RG_PRELUDE_OF_LIGHT);
} }
} else if (!(gSaveContext.eventChkInf[5] & 0x20)) { } else if (!(gSaveContext.eventChkInf[5] & 0x20)) {
func_80B3C9EC(this); func_80B3C9EC(this);
@ -2348,7 +2348,7 @@ void EnXc_Update(Actor* thisx, GlobalContext* globalCtx) {
if (this->actor.params == SHEIK_TYPE_9) { if (this->actor.params == SHEIK_TYPE_9) {
if (gSaveContext.n64ddFlag && LINK_IS_ADULT) { if (gSaveContext.n64ddFlag && LINK_IS_ADULT) {
if (CHECK_QUEST_ITEM(QUEST_MEDALLION_FOREST) && !(gSaveContext.eventChkInf[5] & 0x20)) { if (CHECK_QUEST_ITEM(QUEST_MEDALLION_FOREST) && !(gSaveContext.eventChkInf[5] & 0x20)) {
GivePlayerRandoRewardSheikSong(this, globalCtx, RC_SHEIK_AT_TEMPLE, 0x20, GI_PRELUDE_OF_LIGHT); GivePlayerRandoRewardSheikSong(this, globalCtx, RC_SHEIK_AT_TEMPLE, 0x20, RG_PRELUDE_OF_LIGHT);
} }
} }
} }

View File

@ -233,8 +233,8 @@ void GivePlayerRandoRewardZeldaChild(EnZl4* zelda, GlobalContext* globalCtx, Ran
Flags_SetTreasure(globalCtx, 0x1E); Flags_SetTreasure(globalCtx, 0x1E);
} else if (!Flags_GetTreasure(globalCtx, 0x1E) && !Randomizer_GetSettingValue(RSK_SKIP_CHILD_ZELDA) && Actor_TextboxIsClosing(&zelda->actor, globalCtx) && } else if (!Flags_GetTreasure(globalCtx, 0x1E) && !Randomizer_GetSettingValue(RSK_SKIP_CHILD_ZELDA) && Actor_TextboxIsClosing(&zelda->actor, globalCtx) &&
(globalCtx->msgCtx.textId == 0x703C || globalCtx->msgCtx.textId == 0x703D)) { (globalCtx->msgCtx.textId == 0x703C || globalCtx->msgCtx.textId == 0x703D)) {
GetItemID getItemId = Randomizer_GetItemIdFromKnownCheck(check, GI_LETTER_ZELDA); GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(check, GI_LETTER_ZELDA);
func_8002F434(&zelda->actor, globalCtx, getItemId, 10000.0f, 100.0f); GiveItemEntryFromActor(&zelda->actor, globalCtx, getItemEntry, 10000.0f, 100.0f);
} else if (Flags_GetTreasure(globalCtx, 0x1E) && !Player_InBlockingCsMode(globalCtx, GET_PLAYER(globalCtx))) { } else if (Flags_GetTreasure(globalCtx, 0x1E) && !Player_InBlockingCsMode(globalCtx, GET_PLAYER(globalCtx))) {
gSaveContext.unk_13EE = 0x32; gSaveContext.unk_13EE = 0x32;
gSaveContext.eventChkInf[4] |= 1; gSaveContext.eventChkInf[4] |= 1;

View File

@ -5000,6 +5000,7 @@ void Fishing_HandleOwnerDialog(Fishing* this, GlobalContext* globalCtx) {
(Message_GetState(&globalCtx->msgCtx) == TEXT_STATE_NONE)) && (Message_GetState(&globalCtx->msgCtx) == TEXT_STATE_NONE)) &&
Message_ShouldAdvance(globalCtx)) { Message_ShouldAdvance(globalCtx)) {
s32 getItemId; s32 getItemId;
GetItemEntry getItemEntry = (GetItemEntry)GET_ITEM_NONE;
Message_CloseTextbox(globalCtx); Message_CloseTextbox(globalCtx);
@ -5054,9 +5055,12 @@ void Fishing_HandleOwnerDialog(Fishing* this, GlobalContext* globalCtx) {
if (D_80B7E078 >= Fishing_GetMinimumRequiredScore()) { if (D_80B7E078 >= Fishing_GetMinimumRequiredScore()) {
HIGH_SCORE(HS_FISHING) |= 0x400; HIGH_SCORE(HS_FISHING) |= 0x400;
sSinkingLureLocation = (u8)Rand_ZeroFloat(3.999f) + 1; sSinkingLureLocation = (u8)Rand_ZeroFloat(3.999f) + 1;
getItemId = gSaveContext.n64ddFlag ? if (!gSaveContext.n64ddFlag) {
Randomizer_GetItemIdFromKnownCheck(RC_LH_CHILD_FISHING, GI_HEART_PIECE) : getItemId = GI_HEART_PIECE;
GI_HEART_PIECE; } else {
getItemEntry = Randomizer_GetItemFromKnownCheck(RC_LH_CHILD_FISHING, GI_HEART_PIECE);
getItemId = getItemEntry.getItemId;
}
} }
} }
} else { } else {
@ -5064,9 +5068,12 @@ void Fishing_HandleOwnerDialog(Fishing* this, GlobalContext* globalCtx) {
if (D_80B7E078 >= Fishing_GetMinimumRequiredScore()) { if (D_80B7E078 >= Fishing_GetMinimumRequiredScore()) {
HIGH_SCORE(HS_FISHING) |= 0x800; HIGH_SCORE(HS_FISHING) |= 0x800;
sSinkingLureLocation = (u8)Rand_ZeroFloat(3.999f) + 1; sSinkingLureLocation = (u8)Rand_ZeroFloat(3.999f) + 1;
getItemId = gSaveContext.n64ddFlag ? if (!gSaveContext.n64ddFlag) {
Randomizer_GetItemIdFromKnownCheck(RC_LH_ADULT_FISHING, GI_SCALE_GOLD) : getItemId = GI_SCALE_GOLD;
GI_SCALE_GOLD; } else {
getItemEntry = Randomizer_GetItemFromKnownCheck(RC_LH_ADULT_FISHING, GI_SCALE_GOLD);
getItemId = getItemEntry.getItemId;
}
} }
} }
} }
@ -5076,7 +5083,11 @@ void Fishing_HandleOwnerDialog(Fishing* this, GlobalContext* globalCtx) {
} }
this->actor.parent = NULL; this->actor.parent = NULL;
func_8002F434(&this->actor, globalCtx, getItemId, 2000.0f, 1000.0f); if (!gSaveContext.n64ddFlag || getItemEntry.getItemId == GI_NONE) {
func_8002F434(&this->actor, globalCtx, getItemId, 2000.0f, 1000.0f);
} else {
GiveItemEntryFromActor(&this->actor, globalCtx, getItemEntry, 2000.0f, 1000.0f);
}
this->unk_15C = 23; this->unk_15C = 23;
} }
break; break;
@ -5140,9 +5151,8 @@ void Fishing_HandleOwnerDialog(Fishing* this, GlobalContext* globalCtx) {
if (!gSaveContext.n64ddFlag) { if (!gSaveContext.n64ddFlag) {
func_8002F434(&this->actor, globalCtx, GI_SCALE_GOLD, 2000.0f, 1000.0f); func_8002F434(&this->actor, globalCtx, GI_SCALE_GOLD, 2000.0f, 1000.0f);
} else { } else {
func_8002F434(&this->actor, globalCtx, GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(RC_LH_ADULT_FISHING, GI_SCALE_GOLD);
Randomizer_GetItemIdFromKnownCheck(RC_LH_ADULT_FISHING, GI_SCALE_GOLD), 2000.0f, GiveItemEntryFromActor(&this->actor, globalCtx, getItemEntry, 2000.0f, 1000.0f);
1000.0f);
} }
} }
break; break;

View File

@ -59,11 +59,11 @@ void ItemBHeart_Update(Actor* thisx, GlobalContext* globalCtx) {
Flags_SetCollectible(globalCtx, 0x1F); Flags_SetCollectible(globalCtx, 0x1F);
Actor_Kill(&this->actor); Actor_Kill(&this->actor);
} else { } else {
if (gSaveContext.n64ddFlag) { if (!gSaveContext.n64ddFlag) {
s32 getItemId = Randomizer_GetRandomizedItemId(GI_HEART_CONTAINER_2, this->actor.id, this->actor.params, globalCtx->sceneNum);
func_8002F434(&this->actor, globalCtx, getItemId, 30.0f, 40.0f);
} else {
func_8002F434(&this->actor, globalCtx, GI_HEART_CONTAINER_2, 30.0f, 40.0f); func_8002F434(&this->actor, globalCtx, GI_HEART_CONTAINER_2, 30.0f, 40.0f);
} else {
GetItemEntry getItemEntry = Randomizer_GetRandomizedItem(GI_HEART_CONTAINER_2, this->actor.id, this->actor.params, globalCtx->sceneNum);
GiveItemEntryFromActor(&this->actor, globalCtx, getItemEntry, 30.0f, 40.0f);
} }
} }
} }
@ -99,8 +99,8 @@ void ItemBHeart_Draw(Actor* thisx, GlobalContext* globalCtx) {
} }
if (gSaveContext.n64ddFlag) { if (gSaveContext.n64ddFlag) {
GetItem_Draw(globalCtx, GetItem_Draw(globalCtx, Randomizer_GetRandomizedItem(GI_HEART_CONTAINER_2,
Randomizer_GetItemModelFromId(Randomizer_GetRandomizedItemId(GI_HEART_CONTAINER_2, this->actor.id, this->actor.params, globalCtx->sceneNum))); this->actor.id,this->actor.params, globalCtx->sceneNum).gid);
} else { } else {
if (flag) { if (flag) {
func_80093D84(globalCtx->state.gfxCtx); func_80093D84(globalCtx->state.gfxCtx);

View File

@ -21,6 +21,7 @@ void ItemEtcetera_SpawnSparkles(ItemEtcetera* this, GlobalContext* globalCtx);
void ItemEtcetera_MoveFireArrowDown(ItemEtcetera* this, GlobalContext* globalCtx); void ItemEtcetera_MoveFireArrowDown(ItemEtcetera* this, GlobalContext* globalCtx);
void func_80B85B28(ItemEtcetera* this, GlobalContext* globalCtx); void func_80B85B28(ItemEtcetera* this, GlobalContext* globalCtx);
void ItemEtcetera_UpdateFireArrow(ItemEtcetera* this, GlobalContext* globalCtx); void ItemEtcetera_UpdateFireArrow(ItemEtcetera* this, GlobalContext* globalCtx);
GetItemEntry GetChestGameRandoGetItem(s8 room, s16 ogDrawId, GlobalContext* globalCtx);
const ActorInit Item_Etcetera_InitVars = { const ActorInit Item_Etcetera_InitVars = {
ACTOR_ITEM_ETCETERA, ACTOR_ITEM_ETCETERA,
@ -132,11 +133,11 @@ void func_80B85824(ItemEtcetera* this, GlobalContext* globalCtx) {
} }
Actor_Kill(&this->actor); Actor_Kill(&this->actor);
} else { } else {
if (gSaveContext.n64ddFlag) { if (!gSaveContext.n64ddFlag) {
s32 getItemId = Randomizer_GetItemIdFromKnownCheck(RC_LH_SUN, GI_ARROW_FIRE);
func_8002F434(&this->actor, globalCtx, getItemId, 30.0f, 50.0f);
} else {
func_8002F434(&this->actor, globalCtx, this->getItemId, 30.0f, 50.0f); func_8002F434(&this->actor, globalCtx, this->getItemId, 30.0f, 50.0f);
} else {
GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(RC_LH_SUN, GI_ARROW_FIRE);
GiveItemEntryFromActor(&this->actor, globalCtx, getItemEntry, 30.0f, 50.0f);
} }
} }
} }
@ -155,11 +156,11 @@ void func_80B858B4(ItemEtcetera* this, GlobalContext* globalCtx) {
} else { } else {
if (0) {} // Necessary to match if (0) {} // Necessary to match
if (gSaveContext.n64ddFlag) { if (!gSaveContext.n64ddFlag) {
s32 getItemId = Randomizer_GetItemIdFromKnownCheck(RC_LH_UNDERWATER_ITEM, GI_LETTER_RUTO);
func_8002F434(&this->actor, globalCtx, getItemId, 30.0f, 50.0f);
} else {
func_8002F434(&this->actor, globalCtx, this->getItemId, 30.0f, 50.0f); func_8002F434(&this->actor, globalCtx, this->getItemId, 30.0f, 50.0f);
} else {
GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(RC_LH_UNDERWATER_ITEM, GI_LETTER_RUTO);
GiveItemEntryFromActor(&this->actor, globalCtx, getItemEntry, 30.0f, 50.0f);
} }
if ((globalCtx->gameplayFrames & 0xD) == 0) { if ((globalCtx->gameplayFrames & 0xD) == 0) {
@ -229,13 +230,10 @@ void ItemEtcetera_DrawThroughLens(Actor* thisx, GlobalContext* globalCtx) {
func_8002ED80(&this->actor, globalCtx, 0); func_8002ED80(&this->actor, globalCtx, 0);
if(gSaveContext.n64ddFlag && globalCtx->sceneNum == 16) { if(gSaveContext.n64ddFlag && globalCtx->sceneNum == 16) {
s32 randoGetItemId = GetChestGameRandoGetItemId(this->actor.room, this->giDrawId, globalCtx); GetItemEntry randoGetItem = GetChestGameRandoGetItem(this->actor.room, this->giDrawId, globalCtx);
if ((randoGetItemId >= GI_MINUET_OF_FOREST && randoGetItemId <= GI_DOUBLE_DEFENSE) || EnItem00_CustomItemsParticles(&this->actor, globalCtx, randoGetItem);
(randoGetItemId >= GI_STICK_UPGRADE_20 && randoGetItemId <= GI_NUT_UPGRADE_40)) { if (randoGetItem.itemId != ITEM_NONE) {
EnItem00_CustomItemsParticles(&this->actor, globalCtx, randoGetItemId); GetItem_Draw(globalCtx, randoGetItem.gid);
}
if (randoGetItemId != GI_NONE) {
GetItem_Draw(globalCtx, Randomizer_GetItemModelFromId(randoGetItemId));
return; return;
} }
} }
@ -249,20 +247,17 @@ void ItemEtcetera_Draw(Actor* thisx, GlobalContext* globalCtx) {
s32 type = this->actor.params & 0xFF; s32 type = this->actor.params & 0xFF;
if (gSaveContext.n64ddFlag) { if (gSaveContext.n64ddFlag) {
s32 randoGetItemId = GI_NONE; GetItemEntry randoGetItem = (GetItemEntry)GET_ITEM_NONE;
if (type == ITEM_ETC_ARROW_FIRE) { if (type == ITEM_ETC_ARROW_FIRE) {
randoGetItemId = Randomizer_GetItemIdFromKnownCheck(RC_LH_SUN, GI_ARROW_FIRE); randoGetItem = Randomizer_GetItemFromKnownCheck(RC_LH_SUN, GI_ARROW_FIRE);
} else if (type == ITEM_ETC_LETTER) { } else if (type == ITEM_ETC_LETTER) {
randoGetItemId = Randomizer_GetItemIdFromKnownCheck(RC_LH_UNDERWATER_ITEM, GI_LETTER_RUTO); randoGetItem = Randomizer_GetItemFromKnownCheck(RC_LH_UNDERWATER_ITEM, GI_LETTER_RUTO);
} }
if ((randoGetItemId >= GI_MINUET_OF_FOREST && randoGetItemId <= GI_DOUBLE_DEFENSE) || EnItem00_CustomItemsParticles(&this->actor, globalCtx, randoGetItem);
(randoGetItemId >= GI_STICK_UPGRADE_20 && randoGetItemId <= GI_NUT_UPGRADE_40)) {
EnItem00_CustomItemsParticles(&this->actor, globalCtx, randoGetItemId);
}
if (randoGetItemId != GI_NONE) { if (randoGetItem.itemId != RG_NONE) {
this->giDrawId = Randomizer_GetItemModelFromId(randoGetItemId); this->giDrawId = randoGetItem.gid;
} }
} }

View File

@ -190,11 +190,12 @@ void ItemOcarina_WaitInWater(ItemOcarina* this, GlobalContext* globalCtx) {
this->actionFunc = ItemOcarina_StartSoTCutscene; this->actionFunc = ItemOcarina_StartSoTCutscene;
this->actor.draw = NULL; this->actor.draw = NULL;
} else { } else {
func_8002F434(&this->actor, globalCtx, if (!gSaveContext.n64ddFlag) {
gSaveContext.n64ddFlag func_8002F434(&this->actor, globalCtx, GI_OCARINA_OOT, 30.0f, 50.0f);
? Randomizer_GetItemIdFromKnownCheck(RC_HF_OCARINA_OF_TIME_ITEM, GI_OCARINA_OOT) } else {
: GI_OCARINA_OOT, GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(RC_HF_OCARINA_OF_TIME_ITEM, GI_OCARINA_OOT);
30.0f, 50.0f); GiveItemEntryFromActor(&this->actor, globalCtx, getItemEntry, 30.0f, 50.0f);
}
if ((globalCtx->gameplayFrames & 13) == 0) { if ((globalCtx->gameplayFrames & 13) == 0) {
EffectSsBubble_Spawn(globalCtx, &this->actor.world.pos, 0.0f, 0.0f, 10.0f, 0.13f); EffectSsBubble_Spawn(globalCtx, &this->actor.world.pos, 0.0f, 0.0f, 10.0f, 0.13f);
@ -215,12 +216,9 @@ void ItemOcarina_Draw(Actor* thisx, GlobalContext* globalCtx) {
func_8002ED80(thisx, globalCtx, 0); func_8002ED80(thisx, globalCtx, 0);
if (gSaveContext.n64ddFlag) { if (gSaveContext.n64ddFlag) {
s32 randoGetItemId = Randomizer_GetItemIdFromKnownCheck(RC_HF_OCARINA_OF_TIME_ITEM, GI_OCARINA_OOT); GetItemEntry randoGetItem = Randomizer_GetItemFromKnownCheck(RC_HF_OCARINA_OF_TIME_ITEM, GI_OCARINA_OOT);
if ((randoGetItemId >= GI_MINUET_OF_FOREST && randoGetItemId <= GI_DOUBLE_DEFENSE) || EnItem00_CustomItemsParticles(&this->actor, globalCtx, randoGetItem);
(randoGetItemId >= GI_STICK_UPGRADE_20 && randoGetItemId <= GI_NUT_UPGRADE_40)) { GetItem_Draw(globalCtx, randoGetItem.gid);
EnItem00_CustomItemsParticles(&this->actor, globalCtx, randoGetItemId);
}
GetItem_Draw(globalCtx, Randomizer_GetItemModelFromId(randoGetItemId));
return; return;
} }

View File

@ -21,15 +21,7 @@
#include "objects/object_link_child/object_link_child.h" #include "objects/object_link_child/object_link_child.h"
#include "textures/icon_item_24_static/icon_item_24_static.h" #include "textures/icon_item_24_static/icon_item_24_static.h"
#include <soh/Enhancements/custom-message/CustomMessageTypes.h> #include <soh/Enhancements/custom-message/CustomMessageTypes.h>
#include <soh/Enhancements/item-tables/ItemTableTypes.h>
#define GET_ITEM(itemId, objectId, drawId, textId, field, chestAnim) \
{ itemId, field, (chestAnim != CHEST_ANIM_SHORT ? 1 : -1) * (drawId + 1), textId, objectId }
#define CHEST_ANIM_SHORT 0
#define CHEST_ANIM_LONG 1
#define GET_ITEM_NONE \
{ ITEM_NONE, 0, 0, 0, OBJECT_INVALID }
typedef enum { typedef enum {
/* 0x00 */ KNOB_ANIM_ADULT_L, /* 0x00 */ KNOB_ANIM_ADULT_L,
@ -490,215 +482,6 @@ static u16 D_8085361C[] = {
NA_SE_VO_LI_FALL_L, NA_SE_VO_LI_FALL_L,
}; };
GetItemEntry sGetItemTable[] = {
GET_ITEM(ITEM_BOMBS_5, OBJECT_GI_BOMB_1, GID_BOMB, 0x32, 0x59, CHEST_ANIM_SHORT),
GET_ITEM(ITEM_NUTS_5, OBJECT_GI_NUTS, GID_NUTS, 0x34, 0x0C, CHEST_ANIM_SHORT),
GET_ITEM(ITEM_BOMBCHU, OBJECT_GI_BOMB_2, GID_BOMBCHU, 0x33, 0x80, CHEST_ANIM_SHORT),
GET_ITEM(ITEM_BOW, OBJECT_GI_BOW, GID_BOW, 0x31, 0x80, CHEST_ANIM_LONG),
GET_ITEM(ITEM_SLINGSHOT, OBJECT_GI_PACHINKO, GID_SLINGSHOT, 0x30, 0x80, CHEST_ANIM_LONG),
GET_ITEM(ITEM_BOOMERANG, OBJECT_GI_BOOMERANG, GID_BOOMERANG, 0x35, 0x80, CHEST_ANIM_LONG),
GET_ITEM(ITEM_STICK, OBJECT_GI_STICK, GID_STICK, 0x37, 0x0D, CHEST_ANIM_SHORT),
GET_ITEM(ITEM_HOOKSHOT, OBJECT_GI_HOOKSHOT, GID_HOOKSHOT, 0x36, 0x80, CHEST_ANIM_LONG),
GET_ITEM(ITEM_LONGSHOT, OBJECT_GI_HOOKSHOT, GID_LONGSHOT, 0x4F, 0x80, CHEST_ANIM_LONG),
GET_ITEM(ITEM_LENS, OBJECT_GI_GLASSES, GID_LENS, 0x39, 0x80, CHEST_ANIM_LONG),
GET_ITEM(ITEM_LETTER_ZELDA, OBJECT_GI_LETTER, GID_LETTER_ZELDA, 0x69, 0x80, CHEST_ANIM_LONG),
GET_ITEM(ITEM_OCARINA_TIME, OBJECT_GI_OCARINA, GID_OCARINA_TIME, 0x3A, 0x80, CHEST_ANIM_LONG),
GET_ITEM(ITEM_HAMMER, OBJECT_GI_HAMMER, GID_HAMMER, 0x38, 0x80, CHEST_ANIM_LONG),
GET_ITEM(ITEM_COJIRO, OBJECT_GI_NIWATORI, GID_COJIRO, 0x02, 0x80, CHEST_ANIM_LONG),
GET_ITEM(ITEM_BOTTLE, OBJECT_GI_BOTTLE, GID_BOTTLE, 0x42, 0x80, CHEST_ANIM_LONG),
GET_ITEM(ITEM_POTION_RED, OBJECT_GI_LIQUID, GID_POTION_RED, 0x43, 0x80, CHEST_ANIM_LONG),
GET_ITEM(ITEM_POTION_GREEN, OBJECT_GI_LIQUID, GID_POTION_GREEN, 0x44, 0x80, CHEST_ANIM_LONG),
GET_ITEM(ITEM_POTION_BLUE, OBJECT_GI_LIQUID, GID_POTION_BLUE, 0x45, 0x80, CHEST_ANIM_LONG),
GET_ITEM(ITEM_FAIRY, OBJECT_GI_BOTTLE, GID_BOTTLE, 0x46, 0x80, CHEST_ANIM_LONG),
GET_ITEM(ITEM_MILK_BOTTLE, OBJECT_GI_MILK, GID_MILK, 0x98, 0x80, CHEST_ANIM_LONG),
GET_ITEM(ITEM_LETTER_RUTO, OBJECT_GI_BOTTLE_LETTER, GID_LETTER_RUTO, 0x99, 0x80, CHEST_ANIM_LONG),
GET_ITEM(ITEM_BEAN, OBJECT_GI_BEAN, GID_BEAN, 0x48, 0x80, CHEST_ANIM_SHORT),
GET_ITEM(ITEM_MASK_SKULL, OBJECT_GI_SKJ_MASK, GID_MASK_SKULL, 0x10, 0x80, CHEST_ANIM_LONG),
GET_ITEM(ITEM_MASK_SPOOKY, OBJECT_GI_REDEAD_MASK, GID_MASK_SPOOKY, 0x11, 0x80, CHEST_ANIM_LONG),
GET_ITEM(ITEM_CHICKEN, OBJECT_GI_NIWATORI, GID_CHICKEN, 0x48, 0x80, CHEST_ANIM_LONG),
GET_ITEM(ITEM_MASK_KEATON, OBJECT_GI_KI_TAN_MASK, GID_MASK_KEATON, 0x12, 0x80, CHEST_ANIM_LONG),
GET_ITEM(ITEM_MASK_BUNNY, OBJECT_GI_RABIT_MASK, GID_MASK_BUNNY, 0x13, 0x80, CHEST_ANIM_LONG),
GET_ITEM(ITEM_MASK_TRUTH, OBJECT_GI_TRUTH_MASK, GID_MASK_TRUTH, 0x17, 0x80, CHEST_ANIM_LONG),
GET_ITEM(ITEM_POCKET_EGG, OBJECT_GI_EGG, GID_EGG, 0x01, 0x80, CHEST_ANIM_LONG),
GET_ITEM(ITEM_POCKET_CUCCO, OBJECT_GI_NIWATORI, GID_CHICKEN, 0x48, 0x80, CHEST_ANIM_LONG),
GET_ITEM(ITEM_ODD_MUSHROOM, OBJECT_GI_MUSHROOM, GID_ODD_MUSHROOM, 0x03, 0x80, CHEST_ANIM_LONG),
GET_ITEM(ITEM_ODD_POTION, OBJECT_GI_POWDER, GID_ODD_POTION, 0x04, 0x80, CHEST_ANIM_LONG),
GET_ITEM(ITEM_SAW, OBJECT_GI_SAW, GID_SAW, 0x05, 0x80, CHEST_ANIM_LONG),
GET_ITEM(ITEM_SWORD_BROKEN, OBJECT_GI_BROKENSWORD, GID_SWORD_BROKEN, 0x08, 0x80, CHEST_ANIM_LONG),
GET_ITEM(ITEM_PRESCRIPTION, OBJECT_GI_PRESCRIPTION, GID_PRESCRIPTION, 0x09, 0x80, CHEST_ANIM_LONG),
GET_ITEM(ITEM_FROG, OBJECT_GI_FROG, GID_FROG, 0x0D, 0x80, CHEST_ANIM_LONG),
GET_ITEM(ITEM_EYEDROPS, OBJECT_GI_EYE_LOTION, GID_EYEDROPS, 0x0E, 0x80, CHEST_ANIM_LONG),
GET_ITEM(ITEM_CLAIM_CHECK, OBJECT_GI_TICKETSTONE, GID_CLAIM_CHECK, 0x0A, 0x80, CHEST_ANIM_LONG),
GET_ITEM(ITEM_SWORD_KOKIRI, OBJECT_GI_SWORD_1, GID_SWORD_KOKIRI, 0xA4, 0x80, CHEST_ANIM_LONG),
GET_ITEM(ITEM_SWORD_BGS, OBJECT_GI_LONGSWORD, GID_SWORD_BGS, 0x4B, 0x80, CHEST_ANIM_LONG),
GET_ITEM(ITEM_SHIELD_DEKU, OBJECT_GI_SHIELD_1, GID_SHIELD_DEKU, 0x4C, 0xA0, CHEST_ANIM_SHORT),
GET_ITEM(ITEM_SHIELD_HYLIAN, OBJECT_GI_SHIELD_2, GID_SHIELD_HYLIAN, 0x4D, 0xA0, CHEST_ANIM_SHORT),
GET_ITEM(ITEM_SHIELD_MIRROR, OBJECT_GI_SHIELD_3, GID_SHIELD_MIRROR, 0x4E, 0x80, CHEST_ANIM_LONG),
GET_ITEM(ITEM_TUNIC_GORON, OBJECT_GI_CLOTHES, GID_TUNIC_GORON, 0x50, 0xA0, CHEST_ANIM_LONG),
GET_ITEM(ITEM_TUNIC_ZORA, OBJECT_GI_CLOTHES, GID_TUNIC_ZORA, 0x51, 0xA0, CHEST_ANIM_LONG),
GET_ITEM(ITEM_BOOTS_IRON, OBJECT_GI_BOOTS_2, GID_BOOTS_IRON, 0x53, 0x80, CHEST_ANIM_LONG),
GET_ITEM(ITEM_BOOTS_HOVER, OBJECT_GI_HOVERBOOTS, GID_BOOTS_HOVER, 0x54, 0x80, CHEST_ANIM_LONG),
GET_ITEM(ITEM_QUIVER_40, OBJECT_GI_ARROWCASE, GID_QUIVER_40, 0x56, 0x80, CHEST_ANIM_LONG),
GET_ITEM(ITEM_QUIVER_50, OBJECT_GI_ARROWCASE, GID_QUIVER_50, 0x57, 0x80, CHEST_ANIM_LONG),
GET_ITEM(ITEM_BOMB_BAG_20, OBJECT_GI_BOMBPOUCH, GID_BOMB_BAG_20, 0x58, 0x80, CHEST_ANIM_LONG),
GET_ITEM(ITEM_BOMB_BAG_30, OBJECT_GI_BOMBPOUCH, GID_BOMB_BAG_30, 0x59, 0x80, CHEST_ANIM_LONG),
GET_ITEM(ITEM_BOMB_BAG_40, OBJECT_GI_BOMBPOUCH, GID_BOMB_BAG_40, 0x5A, 0x80, CHEST_ANIM_LONG),
GET_ITEM(ITEM_GAUNTLETS_SILVER, OBJECT_GI_GLOVES, GID_GAUNTLETS_SILVER, 0x5B, 0x80, CHEST_ANIM_LONG),
GET_ITEM(ITEM_GAUNTLETS_GOLD, OBJECT_GI_GLOVES, GID_GAUNTLETS_GOLD, 0x5C, 0x80, CHEST_ANIM_LONG),
GET_ITEM(ITEM_SCALE_SILVER, OBJECT_GI_SCALE, GID_SCALE_SILVER, 0xCD, 0x80, CHEST_ANIM_LONG),
GET_ITEM(ITEM_SCALE_GOLDEN, OBJECT_GI_SCALE, GID_SCALE_GOLDEN, 0xCE, 0x80, CHEST_ANIM_LONG),
GET_ITEM(ITEM_STONE_OF_AGONY, OBJECT_GI_MAP, GID_STONE_OF_AGONY, 0x68, 0x80, CHEST_ANIM_LONG),
GET_ITEM(ITEM_GERUDO_CARD, OBJECT_GI_GERUDO, GID_GERUDO_CARD, 0x7B, 0x80, CHEST_ANIM_LONG),
GET_ITEM(ITEM_OCARINA_FAIRY, OBJECT_GI_OCARINA_0, GID_OCARINA_FAIRY, 0x4A, 0x80, CHEST_ANIM_LONG),
GET_ITEM(ITEM_SEEDS, OBJECT_GI_SEED, GID_SEEDS, 0xDC, 0x50, CHEST_ANIM_SHORT),
GET_ITEM(ITEM_HEART_CONTAINER, OBJECT_GI_HEARTS, GID_HEART_CONTAINER, 0xC6, 0x80, CHEST_ANIM_LONG),
GET_ITEM(ITEM_HEART_PIECE_2, OBJECT_GI_HEARTS, GID_HEART_PIECE, 0xC2, 0x80, CHEST_ANIM_LONG),
GET_ITEM(ITEM_KEY_BOSS, OBJECT_GI_BOSSKEY, GID_KEY_BOSS, 0xC7, 0x80, CHEST_ANIM_LONG),
GET_ITEM(ITEM_COMPASS, OBJECT_GI_COMPASS, GID_COMPASS, 0x67, 0x80, CHEST_ANIM_LONG),
GET_ITEM(ITEM_DUNGEON_MAP, OBJECT_GI_MAP, GID_DUNGEON_MAP, 0x66, 0x80, CHEST_ANIM_LONG),
GET_ITEM(ITEM_KEY_SMALL, OBJECT_GI_KEY, GID_KEY_SMALL, 0x60, 0x80, CHEST_ANIM_SHORT),
GET_ITEM(ITEM_MAGIC_SMALL, OBJECT_GI_MAGICPOT, GID_MAGIC_SMALL, 0x52, 0x6F, CHEST_ANIM_SHORT),
GET_ITEM(ITEM_MAGIC_LARGE, OBJECT_GI_MAGICPOT, GID_MAGIC_LARGE, 0x52, 0x6E, CHEST_ANIM_SHORT),
GET_ITEM(ITEM_WALLET_ADULT, OBJECT_GI_PURSE, GID_WALLET_ADULT, 0x5E, 0x80, CHEST_ANIM_LONG),
GET_ITEM(ITEM_WALLET_GIANT, OBJECT_GI_PURSE, GID_WALLET_GIANT, 0x5F, 0x80, CHEST_ANIM_LONG),
GET_ITEM(ITEM_WEIRD_EGG, OBJECT_GI_EGG, GID_EGG, 0x9A, 0x80, CHEST_ANIM_LONG),
GET_ITEM(ITEM_HEART, OBJECT_GI_HEART, GID_HEART, 0x55, 0x80, CHEST_ANIM_LONG),
GET_ITEM(ITEM_ARROWS_SMALL, OBJECT_GI_ARROW, GID_ARROWS_SMALL, 0xE6, 0x48, CHEST_ANIM_SHORT),
GET_ITEM(ITEM_ARROWS_MEDIUM, OBJECT_GI_ARROW, GID_ARROWS_MEDIUM, 0xE6, 0x49, CHEST_ANIM_SHORT),
GET_ITEM(ITEM_ARROWS_LARGE, OBJECT_GI_ARROW, GID_ARROWS_LARGE, 0xE6, 0x4A, CHEST_ANIM_SHORT),
GET_ITEM(ITEM_RUPEE_GREEN, OBJECT_GI_RUPY, GID_RUPEE_GREEN, 0x6F, 0x00, CHEST_ANIM_SHORT),
GET_ITEM(ITEM_RUPEE_BLUE, OBJECT_GI_RUPY, GID_RUPEE_BLUE, 0xCC, 0x01, CHEST_ANIM_SHORT),
GET_ITEM(ITEM_RUPEE_RED, OBJECT_GI_RUPY, GID_RUPEE_RED, 0xF0, 0x02, CHEST_ANIM_SHORT),
GET_ITEM(ITEM_HEART_CONTAINER, OBJECT_GI_HEARTS, GID_HEART_CONTAINER, 0xC6, 0x80, CHEST_ANIM_LONG),
GET_ITEM(ITEM_MILK, OBJECT_GI_MILK, GID_MILK, 0x98, 0x80, CHEST_ANIM_LONG),
GET_ITEM(ITEM_MASK_GORON, OBJECT_GI_GOLONMASK, GID_MASK_GORON, 0x14, 0x80, CHEST_ANIM_LONG),
GET_ITEM(ITEM_MASK_ZORA, OBJECT_GI_ZORAMASK, GID_MASK_ZORA, 0x15, 0x80, CHEST_ANIM_LONG),
GET_ITEM(ITEM_MASK_GERUDO, OBJECT_GI_GERUDOMASK, GID_MASK_GERUDO, 0x16, 0x80, CHEST_ANIM_LONG),
GET_ITEM(ITEM_BRACELET, OBJECT_GI_BRACELET, GID_BRACELET, 0x79, 0x80, CHEST_ANIM_LONG),
GET_ITEM(ITEM_RUPEE_PURPLE, OBJECT_GI_RUPY, GID_RUPEE_PURPLE, 0xF1, 0x14, CHEST_ANIM_SHORT),
GET_ITEM(ITEM_RUPEE_GOLD, OBJECT_GI_RUPY, GID_RUPEE_GOLD, 0xF2, 0x13, CHEST_ANIM_SHORT),
GET_ITEM(ITEM_SWORD_BGS, OBJECT_GI_LONGSWORD, GID_SWORD_BGS, 0x0C, 0x80, CHEST_ANIM_LONG),
GET_ITEM(ITEM_ARROW_FIRE, OBJECT_GI_M_ARROW, GID_ARROW_FIRE, 0x70, 0x80, CHEST_ANIM_LONG),
GET_ITEM(ITEM_ARROW_ICE, OBJECT_GI_M_ARROW, GID_ARROW_ICE, 0x71, 0x80, CHEST_ANIM_LONG),
GET_ITEM(ITEM_ARROW_LIGHT, OBJECT_GI_M_ARROW, GID_ARROW_LIGHT, 0x72, 0x80, CHEST_ANIM_LONG),
GET_ITEM(ITEM_SKULL_TOKEN, OBJECT_GI_SUTARU, GID_SKULL_TOKEN, 0xB4, 0x80, CHEST_ANIM_SHORT),
GET_ITEM(ITEM_DINS_FIRE, OBJECT_GI_GODDESS, GID_DINS_FIRE, 0xAD, 0x80, CHEST_ANIM_LONG),
GET_ITEM(ITEM_FARORES_WIND, OBJECT_GI_GODDESS, GID_FARORES_WIND, 0xAE, 0x80, CHEST_ANIM_LONG),
GET_ITEM(ITEM_NAYRUS_LOVE, OBJECT_GI_GODDESS, GID_NAYRUS_LOVE, 0xAF, 0x80, CHEST_ANIM_LONG),
GET_ITEM(ITEM_BULLET_BAG_30, OBJECT_GI_DEKUPOUCH, GID_BULLET_BAG, 0x07, 0x80, CHEST_ANIM_LONG),
GET_ITEM(ITEM_BULLET_BAG_40, OBJECT_GI_DEKUPOUCH, GID_BULLET_BAG, 0x07, 0x80, CHEST_ANIM_LONG),
GET_ITEM(ITEM_STICKS_5, OBJECT_GI_STICK, GID_STICK, 0x37, 0x0D, CHEST_ANIM_SHORT),
GET_ITEM(ITEM_STICKS_10, OBJECT_GI_STICK, GID_STICK, 0x37, 0x0D, CHEST_ANIM_SHORT),
GET_ITEM(ITEM_NUTS_5, OBJECT_GI_NUTS, GID_NUTS, 0x34, 0x0C, CHEST_ANIM_SHORT),
GET_ITEM(ITEM_NUTS_10, OBJECT_GI_NUTS, GID_NUTS, 0x34, 0x0C, CHEST_ANIM_SHORT),
GET_ITEM(ITEM_BOMB, OBJECT_GI_BOMB_1, GID_BOMB, 0x32, 0x59, CHEST_ANIM_SHORT),
GET_ITEM(ITEM_BOMBS_10, OBJECT_GI_BOMB_1, GID_BOMB, 0x32, 0x59, CHEST_ANIM_SHORT),
GET_ITEM(ITEM_BOMBS_20, OBJECT_GI_BOMB_1, GID_BOMB, 0x32, 0x59, CHEST_ANIM_SHORT),
GET_ITEM(ITEM_BOMBS_30, OBJECT_GI_BOMB_1, GID_BOMB, 0x32, 0x59, CHEST_ANIM_SHORT),
GET_ITEM(ITEM_SEEDS_30, OBJECT_GI_SEED, GID_SEEDS, 0xDC, 0x50, CHEST_ANIM_SHORT),
GET_ITEM(ITEM_BOMBCHUS_5, OBJECT_GI_BOMB_2, GID_BOMBCHU, 0x33, 0x80, CHEST_ANIM_SHORT),
GET_ITEM(ITEM_BOMBCHUS_20, OBJECT_GI_BOMB_2, GID_BOMBCHU, 0x33, 0x80, CHEST_ANIM_SHORT),
GET_ITEM(ITEM_FISH, OBJECT_GI_FISH, GID_FISH, 0x47, 0x80, CHEST_ANIM_LONG),
GET_ITEM(ITEM_BUG, OBJECT_GI_INSECT, GID_BUG, 0x7A, 0x80, CHEST_ANIM_LONG),
GET_ITEM(ITEM_BLUE_FIRE, OBJECT_GI_FIRE, GID_BLUE_FIRE, 0x5D, 0x80, CHEST_ANIM_LONG),
GET_ITEM(ITEM_POE, OBJECT_GI_GHOST, GID_POE, 0x97, 0x80, CHEST_ANIM_LONG),
GET_ITEM(ITEM_BIG_POE, OBJECT_GI_GHOST, GID_BIG_POE, 0xF9, 0x80, CHEST_ANIM_LONG),
GET_ITEM(ITEM_KEY_SMALL, OBJECT_GI_KEY, GID_KEY_SMALL, 0xF3, 0x80, CHEST_ANIM_SHORT),
GET_ITEM(ITEM_RUPEE_GREEN, OBJECT_GI_RUPY, GID_RUPEE_GREEN, 0xF4, 0x00, CHEST_ANIM_SHORT),
GET_ITEM(ITEM_RUPEE_BLUE, OBJECT_GI_RUPY, GID_RUPEE_BLUE, 0xF5, 0x01, CHEST_ANIM_SHORT),
GET_ITEM(ITEM_RUPEE_RED, OBJECT_GI_RUPY, GID_RUPEE_RED, 0xF6, 0x02, CHEST_ANIM_SHORT),
GET_ITEM(ITEM_RUPEE_PURPLE, OBJECT_GI_RUPY, GID_RUPEE_PURPLE, 0xF7, 0x14, CHEST_ANIM_SHORT),
GET_ITEM(ITEM_HEART_PIECE_2, OBJECT_GI_HEARTS, GID_HEART_PIECE, 0xFA, 0x80, CHEST_ANIM_LONG),
GET_ITEM(ITEM_STICK_UPGRADE_20, OBJECT_GI_STICK, GID_STICK, 0x90, 0x80, CHEST_ANIM_SHORT),
GET_ITEM(ITEM_STICK_UPGRADE_30, OBJECT_GI_STICK, GID_STICK, 0x91, 0x80, CHEST_ANIM_SHORT),
GET_ITEM(ITEM_NUT_UPGRADE_30, OBJECT_GI_NUTS, GID_NUTS, 0xA7, 0x80, CHEST_ANIM_SHORT),
GET_ITEM(ITEM_NUT_UPGRADE_40, OBJECT_GI_NUTS, GID_NUTS, 0xA8, 0x80, CHEST_ANIM_SHORT),
GET_ITEM(ITEM_BULLET_BAG_50, OBJECT_GI_DEKUPOUCH, GID_BULLET_BAG_50, 0x6C, 0x80, CHEST_ANIM_LONG),
GET_ITEM(ITEM_ARROW_ICE, OBJECT_GI_M_ARROW, GID_ARROW_ICE, 0x3C, 0x80, CHEST_ANIM_SHORT), // Ice Traps
GET_ITEM_NONE,
GET_ITEM(ITEM_MEDALLION_LIGHT, OBJECT_GI_MEDAL, GID_MEDALLION_LIGHT, 0x40, 0x80, CHEST_ANIM_LONG),
GET_ITEM(ITEM_MEDALLION_FOREST, OBJECT_GI_MEDAL, GID_MEDALLION_FOREST, 0x3E, 0x80, CHEST_ANIM_LONG),
GET_ITEM(ITEM_MEDALLION_FIRE, OBJECT_GI_MEDAL, GID_MEDALLION_FIRE, 0x3C, 0x80, CHEST_ANIM_LONG),
GET_ITEM(ITEM_MEDALLION_WATER, OBJECT_GI_MEDAL, GID_MEDALLION_WATER, 0x3D, 0x80, CHEST_ANIM_LONG),
GET_ITEM(ITEM_MEDALLION_SHADOW, OBJECT_GI_MEDAL, GID_MEDALLION_SHADOW, 0x41, 0x80, CHEST_ANIM_LONG),
GET_ITEM(ITEM_MEDALLION_SPIRIT, OBJECT_GI_MEDAL, GID_MEDALLION_SPIRIT, 0x3F, 0x80, CHEST_ANIM_LONG),
GET_ITEM(ITEM_KOKIRI_EMERALD, OBJECT_GI_JEWEL, GID_KOKIRI_EMERALD, 0x80, 0x80, CHEST_ANIM_LONG),
GET_ITEM(ITEM_GORON_RUBY, OBJECT_GI_JEWEL, GID_GORON_RUBY, 0x81, 0x80, CHEST_ANIM_LONG),
GET_ITEM(ITEM_ZORA_SAPPHIRE, OBJECT_GI_JEWEL, GID_ZORA_SAPPHIRE, 0x82, 0x80, CHEST_ANIM_LONG),
GET_ITEM(ITEM_SONG_LULLABY, OBJECT_GI_MELODY, GID_SONG_ZELDA, 0xD4, 0x80, CHEST_ANIM_LONG),
GET_ITEM(ITEM_SONG_SUN, OBJECT_GI_MELODY, GID_SONG_SUN, 0xD3, 0x80, CHEST_ANIM_LONG),
GET_ITEM(ITEM_SONG_EPONA, OBJECT_GI_MELODY, GID_SONG_EPONA, 0xD2, 0x80, CHEST_ANIM_LONG),
GET_ITEM(ITEM_SONG_STORMS, OBJECT_GI_MELODY, GID_SONG_STORM, 0xD6, 0x80, CHEST_ANIM_LONG),
GET_ITEM(ITEM_SONG_TIME, OBJECT_GI_MELODY, GID_SONG_TIME, 0xD5, 0x80, CHEST_ANIM_LONG),
GET_ITEM(ITEM_SONG_SARIA, OBJECT_GI_MELODY, GID_SONG_SARIA, 0xD1, 0x80, CHEST_ANIM_LONG),
GET_ITEM(ITEM_SONG_MINUET, OBJECT_GI_MELODY, GID_SONG_MINUET, 0x73, 0x80, CHEST_ANIM_LONG),
GET_ITEM(ITEM_SONG_BOLERO, OBJECT_GI_MELODY, GID_SONG_BOLERO, 0x74, 0x80, CHEST_ANIM_LONG),
GET_ITEM(ITEM_SONG_SERENADE, OBJECT_GI_MELODY, GID_SONG_SERENADE, 0x75, 0x80, CHEST_ANIM_LONG),
GET_ITEM(ITEM_SONG_NOCTURNE, OBJECT_GI_MELODY, GID_SONG_NOCTURNE, 0x77, 0x80, CHEST_ANIM_LONG),
GET_ITEM(ITEM_SONG_REQUIEM, OBJECT_GI_MELODY, GID_SONG_REQUIEM, 0x76, 0x80, CHEST_ANIM_LONG),
GET_ITEM(ITEM_SONG_PRELUDE, OBJECT_GI_MELODY, GID_SONG_PRELUDE, 0x78, 0x80, CHEST_ANIM_LONG),
GET_ITEM(ITEM_SINGLE_MAGIC, OBJECT_GI_MAGICPOT, GID_MAGIC_SMALL, 0xE4, 0x80, CHEST_ANIM_LONG),
GET_ITEM(ITEM_DOUBLE_MAGIC, OBJECT_GI_MAGICPOT, GID_MAGIC_LARGE, 0xE8, 0x80, CHEST_ANIM_LONG),
GET_ITEM(ITEM_DOUBLE_DEFENSE, OBJECT_GI_HEARTS, GID_HEART_CONTAINER, 0xE9, 0x80, CHEST_ANIM_LONG),
GET_ITEM(ITEM_BOTTLE_WITH_RED_POTION, OBJECT_GI_LIQUID, GID_POTION_RED, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG),
GET_ITEM(ITEM_BOTTLE_WITH_GREEN_POTION, OBJECT_GI_LIQUID, GID_POTION_GREEN, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG),
GET_ITEM(ITEM_BOTTLE_WITH_BLUE_POTION, OBJECT_GI_LIQUID, GID_POTION_BLUE, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG),
GET_ITEM(ITEM_BOTTLE_WITH_FAIRY, OBJECT_GI_BOTTLE, GID_BOTTLE, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG),
GET_ITEM(ITEM_BOTTLE_WITH_FISH, OBJECT_GI_FISH, GID_FISH, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG),
GET_ITEM(ITEM_BOTTLE_WITH_BLUE_FIRE, OBJECT_GI_FIRE, GID_BLUE_FIRE, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG),
GET_ITEM(ITEM_BOTTLE_WITH_BUGS, OBJECT_GI_INSECT, GID_BUG, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG),
GET_ITEM(ITEM_BOTTLE_WITH_POE, OBJECT_GI_GHOST, GID_POE, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG),
GET_ITEM(ITEM_BOTTLE_WITH_BIG_POE, OBJECT_GI_GHOST, GID_BIG_POE, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG),
GET_ITEM(ITEM_GERUDO_FORTRESS_SMALL_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT),
GET_ITEM(ITEM_FOREST_TEMPLE_SMALL_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT),
GET_ITEM(ITEM_FIRE_TEMPLE_SMALL_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT),
GET_ITEM(ITEM_WATER_TEMPLE_SMALL_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT),
GET_ITEM(ITEM_SPIRIT_TEMPLE_SMALL_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT),
GET_ITEM(ITEM_SHADOW_TEMPLE_SMALL_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT),
GET_ITEM(ITEM_BOTTOM_OF_THE_WELL_SMALL_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT),
GET_ITEM(ITEM_GERUDO_TRAINING_GROUNDS_SMALL_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT),
GET_ITEM(ITEM_GANONS_CASTLE_SMALL_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT),
GET_ITEM(ITEM_FOREST_TEMPLE_BOSS_KEY, OBJECT_GI_BOSSKEY, GID_KEY_BOSS, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG),
GET_ITEM(ITEM_FIRE_TEMPLE_BOSS_KEY, OBJECT_GI_BOSSKEY, GID_KEY_BOSS, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG),
GET_ITEM(ITEM_WATER_TEMPLE_BOSS_KEY, OBJECT_GI_BOSSKEY, GID_KEY_BOSS, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG),
GET_ITEM(ITEM_SPIRIT_TEMPLE_BOSS_KEY, OBJECT_GI_BOSSKEY, GID_KEY_BOSS, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG),
GET_ITEM(ITEM_SHADOW_TEMPLE_BOSS_KEY, OBJECT_GI_BOSSKEY, GID_KEY_BOSS, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG),
GET_ITEM(ITEM_GANONS_CASTLE_BOSS_KEY, OBJECT_GI_BOSSKEY, GID_KEY_BOSS, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG),
GET_ITEM(ITEM_DEKU_TREE_MAP, OBJECT_GI_MAP, GID_DUNGEON_MAP, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG),
GET_ITEM(ITEM_DODONGOS_CAVERN_MAP, OBJECT_GI_MAP, GID_DUNGEON_MAP, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG),
GET_ITEM(ITEM_JABU_JABUS_BELLY_MAP, OBJECT_GI_MAP, GID_DUNGEON_MAP, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG),
GET_ITEM(ITEM_FOREST_TEMPLE_MAP, OBJECT_GI_MAP, GID_DUNGEON_MAP, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG),
GET_ITEM(ITEM_FIRE_TEMPLE_MAP, OBJECT_GI_MAP, GID_DUNGEON_MAP, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG),
GET_ITEM(ITEM_WATER_TEMPLE_MAP, OBJECT_GI_MAP, GID_DUNGEON_MAP, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG),
GET_ITEM(ITEM_SPIRIT_TEMPLE_MAP, OBJECT_GI_MAP, GID_DUNGEON_MAP, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG),
GET_ITEM(ITEM_SHADOW_TEMPLE_MAP, OBJECT_GI_MAP, GID_DUNGEON_MAP, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG),
GET_ITEM(ITEM_BOTTOM_OF_THE_WELL_MAP, OBJECT_GI_MAP, GID_DUNGEON_MAP, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG),
GET_ITEM(ITEM_ICE_CAVERN_MAP, OBJECT_GI_MAP, GID_DUNGEON_MAP, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG),
GET_ITEM(ITEM_DEKU_TREE_COMPASS, OBJECT_GI_COMPASS, GID_COMPASS, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG),
GET_ITEM(ITEM_DODONGOS_CAVERN_COMPASS, OBJECT_GI_COMPASS, GID_COMPASS, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG),
GET_ITEM(ITEM_JABU_JABUS_BELLY_COMPASS, OBJECT_GI_COMPASS, GID_COMPASS, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG),
GET_ITEM(ITEM_FOREST_TEMPLE_COMPASS, OBJECT_GI_COMPASS, GID_COMPASS, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG),
GET_ITEM(ITEM_FIRE_TEMPLE_COMPASS, OBJECT_GI_COMPASS, GID_COMPASS, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG),
GET_ITEM(ITEM_WATER_TEMPLE_COMPASS, OBJECT_GI_COMPASS, GID_COMPASS, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG),
GET_ITEM(ITEM_SPIRIT_TEMPLE_COMPASS, OBJECT_GI_COMPASS, GID_COMPASS, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG),
GET_ITEM(ITEM_SHADOW_TEMPLE_COMPASS, OBJECT_GI_COMPASS, GID_COMPASS, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG),
GET_ITEM(ITEM_BOTTOM_OF_THE_WELL_COMPASS, OBJECT_GI_COMPASS, GID_COMPASS, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG),
GET_ITEM(ITEM_ICE_CAVERN_COMPASS, OBJECT_GI_COMPASS, GID_COMPASS, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG),
GET_ITEM_NONE,
GET_ITEM_NONE,
};
static LinkAnimationHeader* D_80853914[PLAYER_ANIMGROUP_MAX][PLAYER_ANIMTYPE_MAX] = { static LinkAnimationHeader* D_80853914[PLAYER_ANIMGROUP_MAX][PLAYER_ANIMTYPE_MAX] = {
/* PLAYER_ANIMGROUP_0 */ /* PLAYER_ANIMGROUP_0 */
{ &gPlayerAnim_003240, &gPlayerAnim_003238, &gPlayerAnim_003238, &gPlayerAnim_002BE0, &gPlayerAnim_003240, { &gPlayerAnim_003240, &gPlayerAnim_003238, &gPlayerAnim_003238, &gPlayerAnim_002BE0, &gPlayerAnim_003240,
@ -1625,9 +1408,14 @@ s32 func_808332E4(Player* this) {
} }
void func_808332F4(Player* this, GlobalContext* globalCtx) { void func_808332F4(Player* this, GlobalContext* globalCtx) {
GetItemEntry* giEntry = &sGetItemTable[this->getItemId - 1]; GetItemEntry giEntry;
if (this->getItemEntry.objectId == OBJECT_INVALID) {
giEntry = ItemTable_Retrieve(this->getItemId);
} else {
giEntry = this->getItemEntry;
}
this->unk_862 = ABS(giEntry->gi); this->unk_862 = ABS(giEntry.gi);
} }
static LinkAnimationHeader* func_80833338(Player* this) { static LinkAnimationHeader* func_80833338(Player* this) {
@ -1814,6 +1602,7 @@ void func_808337D4(GlobalContext* globalCtx, Player* this) {
this->interactRangeActor = spawnedActor; this->interactRangeActor = spawnedActor;
this->heldActor = spawnedActor; this->heldActor = spawnedActor;
this->getItemId = GI_NONE; this->getItemId = GI_NONE;
this->getItemEntry = (GetItemEntry)GET_ITEM_NONE;
this->unk_3BC.y = spawnedActor->shape.rot.y - this->actor.shape.rot.y; this->unk_3BC.y = spawnedActor->shape.rot.y - this->actor.shape.rot.y;
this->stateFlags1 |= PLAYER_STATE1_11; this->stateFlags1 |= PLAYER_STATE1_11;
} }
@ -4739,11 +4528,12 @@ void func_8083A434(GlobalContext* globalCtx, Player* this) {
if (this->getItemId == GI_HEART_CONTAINER_2) { if (this->getItemId == GI_HEART_CONTAINER_2) {
this->unk_850 = 20; this->unk_850 = 20;
} }
else if (this->getItemId >= 0) { else if (this->getItemId >= 0 || (this->getItemEntry.objectId != OBJECT_INVALID && this->getItemEntry.getItemId >= 0)) {
this->unk_850 = 1; this->unk_850 = 1;
} }
else { else {
this->getItemId = -this->getItemId; this->getItemId = -this->getItemId;
this->getItemEntry.getItemId = -this->getItemEntry.getItemId;
} }
} }
@ -5034,7 +4824,7 @@ static LinkAnimationHeader* D_80854548[] = {
s32 func_8083B040(Player* this, GlobalContext* globalCtx) { s32 func_8083B040(Player* this, GlobalContext* globalCtx) {
s32 sp2C; s32 sp2C;
s32 sp28; s32 sp28;
GetItemEntry* giEntry; GetItemEntry giEntry;
Actor* targetActor; Actor* targetActor;
if ((this->unk_6AD != 0) && if ((this->unk_6AD != 0) &&
@ -5071,8 +4861,12 @@ s32 func_8083B040(Player* this, GlobalContext* globalCtx) {
func_80835DE4(globalCtx, this, func_8084F104, 0); func_80835DE4(globalCtx, this, func_8084F104, 0);
if (sp2C >= 0) { if (sp2C >= 0) {
giEntry = &sGetItemTable[D_80854528[sp2C] - 1]; if (this->getItemEntry.objectId == OBJECT_INVALID) {
func_8083AE40(this, giEntry->objectId); giEntry = ItemTable_Retrieve(D_80854528[sp2C]);
} else {
giEntry = this->getItemEntry;
}
func_8083AE40(this, giEntry.objectId);
} }
this->stateFlags1 |= PLAYER_STATE1_6 | PLAYER_STATE1_28 | PLAYER_STATE1_29; this->stateFlags1 |= PLAYER_STATE1_6 | PLAYER_STATE1_28 | PLAYER_STATE1_29;
@ -6270,7 +6064,7 @@ void func_8083E4C4(GlobalContext* globalCtx, Player* this, GetItemEntry* giEntry
Item_Give(globalCtx, giEntry->itemId); Item_Give(globalCtx, giEntry->itemId);
} }
func_80078884((this->getItemId < 0) ? NA_SE_SY_GET_BOXITEM : NA_SE_SY_GET_ITEM); func_80078884((this->getItemId < 0 || this->getItemEntry.getItemId < 0) ? NA_SE_SY_GET_BOXITEM : NA_SE_SY_GET_ITEM);
} }
// Sets a flag according to which type of flag is specified in player->pendingFlag.flagType // Sets a flag according to which type of flag is specified in player->pendingFlag.flagType
@ -6292,6 +6086,9 @@ void Player_SetPendingFlag(Player* this, GlobalContext* globalCtx) {
case FLAG_COW_MILKED: case FLAG_COW_MILKED:
gSaveContext.cowsMilked[this->pendingFlag.flagID] = 1; gSaveContext.cowsMilked[this->pendingFlag.flagID] = 1;
break; break;
case FLAG_EVENT_CHECK_INF:
Flags_SetEventChkInf(this->pendingFlag.flagID);
break;
case FLAG_NONE: case FLAG_NONE:
default: default:
break; break;
@ -6310,16 +6107,20 @@ s32 func_8083E5A8(Player* this, GlobalContext* globalCtx) {
this->getItemId = iREG(68); this->getItemId = iREG(68);
} }
if (this->getItemId < GI_MAX) { GetItemEntry giEntry;
GetItemEntry* giEntry = &sGetItemTable[this->getItemId - 1]; if (this->getItemEntry.objectId == OBJECT_INVALID) {
giEntry = ItemTable_Retrieve(this->getItemId);
} else {
giEntry = this->getItemEntry;
}
if (giEntry.collectable) {
if ((interactedActor != &this->actor) && !iREG(67)) { if ((interactedActor != &this->actor) && !iREG(67)) {
interactedActor->parent = &this->actor; interactedActor->parent = &this->actor;
} }
iREG(67) = false; iREG(67) = false;
if (gSaveContext.n64ddFlag && this->getItemId == GI_ICE_TRAP) { if (gSaveContext.n64ddFlag && giEntry.getItemId == RG_ICE_TRAP) {
this->stateFlags1 &= ~(PLAYER_STATE1_10 | PLAYER_STATE1_11); this->stateFlags1 &= ~(PLAYER_STATE1_10 | PLAYER_STATE1_11);
this->actor.colChkInfo.damage = 0; this->actor.colChkInfo.damage = 0;
func_80837C0C(globalCtx, this, 3, 0.0f, 0.0f, 0, 20); func_80837C0C(globalCtx, this, 3, 0.0f, 0.0f, 0, 20);
@ -6327,24 +6128,25 @@ s32 func_8083E5A8(Player* this, GlobalContext* globalCtx) {
return 1; return 1;
} }
s32 drop = giEntry->objectId; s32 drop = giEntry.objectId;
if (gSaveContext.n64ddFlag || (globalCtx->sceneNum == SCENE_BOWLING) || !(CVar_GetS32("gFastDrops", 0) && if (gSaveContext.n64ddFlag || (globalCtx->sceneNum == SCENE_BOWLING) || !(CVar_GetS32("gFastDrops", 0) &&
((drop == OBJECT_GI_BOMB_1) || (drop == OBJECT_GI_NUTS) || (drop == OBJECT_GI_STICK) || ((drop == OBJECT_GI_BOMB_1) || (drop == OBJECT_GI_NUTS) || (drop == OBJECT_GI_STICK) ||
(drop == OBJECT_GI_SEED) || (drop == OBJECT_GI_MAGICPOT) || (drop == OBJECT_GI_ARROW))) && (drop == OBJECT_GI_SEED) || (drop == OBJECT_GI_MAGICPOT) || (drop == OBJECT_GI_ARROW))) &&
(Item_CheckObtainability(giEntry->itemId) == ITEM_NONE)) { (Item_CheckObtainability(giEntry.itemId) == ITEM_NONE)) {
if (gSaveContext.n64ddFlag && if (gSaveContext.n64ddFlag &&
((interactedActor->id == ACTOR_EN_ITEM00 && ((interactedActor->id == ACTOR_EN_ITEM00 &&
(interactedActor->params != 6 && interactedActor->params != 17)) || (interactedActor->params != 6 && interactedActor->params != 17)) ||
(interactedActor->id == ACTOR_EN_KAREBABA || interactedActor->id == ACTOR_EN_DEKUBABA))) { (interactedActor->id == ACTOR_EN_KAREBABA || interactedActor->id == ACTOR_EN_DEKUBABA))) {
func_8083E4C4(globalCtx, this, giEntry); func_8083E4C4(globalCtx, this, &giEntry);
this->getItemId = GI_NONE; this->getItemId = GI_NONE;
this->getItemEntry = (GetItemEntry)GET_ITEM_NONE;
return 0; return 0;
} }
func_808323B4(globalCtx, this); func_808323B4(globalCtx, this);
func_8083AE40(this, giEntry->objectId); func_8083AE40(this, giEntry.objectId);
if (!(this->stateFlags2 & PLAYER_STATE2_10) || (this->currentBoots == PLAYER_BOOTS_IRON)) { if (!(this->stateFlags2 & PLAYER_STATE2_10) || (this->currentBoots == PLAYER_BOOTS_IRON)) {
func_80836898(globalCtx, this, func_8083A434); func_80836898(globalCtx, this, func_8083A434);
@ -6357,29 +6159,35 @@ s32 func_8083E5A8(Player* this, GlobalContext* globalCtx) {
return 1; return 1;
} }
func_8083E4C4(globalCtx, this, giEntry); func_8083E4C4(globalCtx, this, &giEntry);
this->getItemId = GI_NONE; this->getItemId = GI_NONE;
this->getItemEntry = (GetItemEntry)GET_ITEM_NONE;
} }
} else if (CHECK_BTN_ALL(sControlInput->press.button, BTN_A) && !(this->stateFlags1 & PLAYER_STATE1_11) && } else if (CHECK_BTN_ALL(sControlInput->press.button, BTN_A) && !(this->stateFlags1 & PLAYER_STATE1_11) &&
!(this->stateFlags2 & PLAYER_STATE2_10)) { !(this->stateFlags2 & PLAYER_STATE2_10)) {
if (this->getItemId != GI_NONE) { if (this->getItemId != GI_NONE || this->getItemEntry.objectId != OBJECT_INVALID) {
GetItemEntry* giEntry = &sGetItemTable[-this->getItemId - 1]; GetItemEntry giEntry;
if (this->getItemEntry.objectId == OBJECT_INVALID) {
giEntry = ItemTable_Retrieve(-this->getItemId);
} else {
giEntry = this->getItemEntry;
}
EnBox* chest = (EnBox*)interactedActor; EnBox* chest = (EnBox*)interactedActor;
if (CVar_GetS32("gFastChests", 0) != 0) { if (CVar_GetS32("gFastChests", 0) != 0) {
giEntry->gi = -1 * abs(giEntry->gi); giEntry.gi = -1 * abs(giEntry.gi);
} }
if (giEntry->itemId != ITEM_NONE) { if (giEntry.itemId != ITEM_NONE) {
if (((Item_CheckObtainability(giEntry->itemId) == ITEM_NONE) && (giEntry->field & 0x40)) || if (((Item_CheckObtainability(giEntry.itemId) == ITEM_NONE) && (giEntry.field & 0x40)) ||
((Item_CheckObtainability(giEntry->itemId) != ITEM_NONE) && (giEntry->field & 0x20))) { ((Item_CheckObtainability(giEntry.itemId) != ITEM_NONE) && (giEntry.field & 0x20))) {
this->getItemId = -GI_RUPEE_BLUE; this->getItemId = -GI_RUPEE_BLUE;
giEntry = &sGetItemTable[GI_RUPEE_BLUE - 1]; giEntry = ItemTable_Retrieve(GI_RUPEE_BLUE);
} }
} }
func_80836898(globalCtx, this, func_8083A434); func_80836898(globalCtx, this, func_8083A434);
this->stateFlags1 |= PLAYER_STATE1_10 | PLAYER_STATE1_11 | PLAYER_STATE1_29; this->stateFlags1 |= PLAYER_STATE1_10 | PLAYER_STATE1_11 | PLAYER_STATE1_29;
func_8083AE40(this, giEntry->objectId); func_8083AE40(this, giEntry.objectId);
this->actor.world.pos.x = this->actor.world.pos.x =
chest->dyna.actor.world.pos.x - (Math_SinS(chest->dyna.actor.shape.rot.y) * 29.4343f); chest->dyna.actor.world.pos.x - (Math_SinS(chest->dyna.actor.shape.rot.y) * 29.4343f);
this->actor.world.pos.z = this->actor.world.pos.z =
@ -6387,8 +6195,8 @@ s32 func_8083E5A8(Player* this, GlobalContext* globalCtx) {
this->currentYaw = this->actor.shape.rot.y = chest->dyna.actor.shape.rot.y; this->currentYaw = this->actor.shape.rot.y = chest->dyna.actor.shape.rot.y;
func_80832224(this); func_80832224(this);
if ((giEntry->itemId != ITEM_NONE) && (giEntry->gi >= 0) && if ((giEntry.itemId != ITEM_NONE) && (giEntry.gi >= 0) &&
(Item_CheckObtainability(giEntry->itemId) == ITEM_NONE)) { (Item_CheckObtainability(giEntry.itemId) == ITEM_NONE)) {
func_808322D0(globalCtx, this, this->ageProperties->unk_98); func_808322D0(globalCtx, this, this->ageProperties->unk_98);
func_80832F54(globalCtx, this, 0x28F); func_80832F54(globalCtx, this, 0x28F);
chest->unk_1F4 = 1; chest->unk_1F4 = 1;
@ -6786,6 +6594,7 @@ s32 func_8083F7BC(Player* this, GlobalContext* globalCtx) {
this->stateFlags1 |= PLAYER_STATE1_11; this->stateFlags1 |= PLAYER_STATE1_11;
this->interactRangeActor = &wallPolyActor->actor; this->interactRangeActor = &wallPolyActor->actor;
this->getItemId = GI_NONE; this->getItemId = GI_NONE;
this->getItemEntry = (GetItemEntry)GET_ITEM_NONE;
this->currentYaw = this->actor.wallYaw + 0x8000; this->currentYaw = this->actor.wallYaw + 0x8000;
func_80832224(this); func_80832224(this);
@ -9878,14 +9687,12 @@ void func_808473D4(GlobalContext* globalCtx, Player* this) {
else if ((!(this->stateFlags1 & PLAYER_STATE1_11) || (heldActor == NULL)) && else if ((!(this->stateFlags1 & PLAYER_STATE1_11) || (heldActor == NULL)) &&
(interactRangeActor != NULL) && (interactRangeActor != NULL) &&
((!sp1C && (this->getItemId == GI_NONE)) || ((!sp1C && (this->getItemId == GI_NONE)) ||
((this->getItemId < 0) && !(this->stateFlags1 & PLAYER_STATE1_27)))) { ((this->getItemId < 0 || this->getItemEntry.getItemId < 0) && !(this->stateFlags1 & PLAYER_STATE1_27)))) {
if (this->getItemId < 0) { if (this->getItemId < 0 || this->getItemEntry.getItemId < 0) {
doAction = DO_ACTION_OPEN; doAction = DO_ACTION_OPEN;
} } else if ((interactRangeActor->id == ACTOR_BG_TOKI_SWD) && LINK_IS_ADULT) {
else if ((interactRangeActor->id == ACTOR_BG_TOKI_SWD) && LINK_IS_ADULT) {
doAction = DO_ACTION_DROP; doAction = DO_ACTION_DROP;
} } else {
else {
doAction = DO_ACTION_GRAB; doAction = DO_ACTION_GRAB;
} }
} }
@ -9937,7 +9744,7 @@ void func_808473D4(GlobalContext* globalCtx, Player* this) {
} }
} }
else if (!(this->stateFlags1 & PLAYER_STATE1_27) && func_8083A0D4(this) && else if (!(this->stateFlags1 & PLAYER_STATE1_27) && func_8083A0D4(this) &&
(this->getItemId < GI_MAX)) { ((!gSaveContext.n64ddFlag && this->getItemId < GI_MAX) || (gSaveContext.n64ddFlag && this->getItemEntry.getItemId < RG_MAX))) {
doAction = DO_ACTION_GRAB; doAction = DO_ACTION_GRAB;
} }
else if (this->stateFlags2 & PLAYER_STATE2_11) { else if (this->stateFlags2 & PLAYER_STATE2_11) {
@ -11083,7 +10890,8 @@ void Player_UpdateCommon(Player* this, GlobalContext* globalCtx, Input* input) {
Collider_ResetQuadAT(globalCtx, &this->shieldQuad.base); Collider_ResetQuadAT(globalCtx, &this->shieldQuad.base);
if (this->pendingIceTrap) { if (this->pendingIceTrap) {
GiveItemWithoutActor(globalCtx, GI_ICE_TRAP); this->getItemEntry = ItemTable_RetrieveEntry(MOD_RANDOMIZER, RG_ICE_TRAP);
GiveItemEntryWithoutActor(globalCtx, this->getItemEntry);
} }
} }
@ -12728,6 +12536,7 @@ void func_8084DF6C(GlobalContext* globalCtx, Player* this) {
this->unk_862 = 0; this->unk_862 = 0;
this->stateFlags1 &= ~(PLAYER_STATE1_10 | PLAYER_STATE1_11); this->stateFlags1 &= ~(PLAYER_STATE1_10 | PLAYER_STATE1_11);
this->getItemId = GI_NONE; this->getItemId = GI_NONE;
this->getItemEntry = (GetItemEntry)GET_ITEM_NONE;
func_8005B1A4(Gameplay_GetCamera(globalCtx, 0)); func_8005B1A4(Gameplay_GetCamera(globalCtx, 0));
} }
@ -12739,16 +12548,20 @@ void func_8084DFAC(GlobalContext* globalCtx, Player* this) {
} }
s32 func_8084DFF4(GlobalContext* globalCtx, Player* this) { s32 func_8084DFF4(GlobalContext* globalCtx, Player* this) {
GetItemEntry* giEntry; GetItemEntry giEntry;
s32 temp1; s32 temp1;
s32 temp2; s32 temp2;
if (this->getItemId == GI_NONE) { if (this->getItemId == GI_NONE && this->getItemEntry.objectId == OBJECT_INVALID) {
return 1; return 1;
} }
if (this->unk_84F == 0) { if (this->unk_84F == 0) {
giEntry = &sGetItemTable[this->getItemId - 1]; if (this->getItemEntry.objectId == OBJECT_INVALID) {
giEntry = ItemTable_Retrieve(this->getItemId);
} else {
giEntry = this->getItemEntry;
}
this->unk_84F = 1; this->unk_84F = 1;
// make sure we get the BGS instead of giant's knife // make sure we get the BGS instead of giant's knife
@ -12757,34 +12570,47 @@ s32 func_8084DFF4(GlobalContext* globalCtx, Player* this) {
gSaveContext.swordHealth = 8; gSaveContext.swordHealth = 8;
} }
Message_StartTextbox(globalCtx, giEntry->textId, &this->actor); Message_StartTextbox(globalCtx, giEntry.textId, &this->actor);
Item_Give(globalCtx, giEntry->itemId); if (giEntry.modIndex == MOD_NONE) {
Item_Give(globalCtx, giEntry.itemId);
} else {
Randomizer_Item_Give(globalCtx, giEntry);
}
Player_SetPendingFlag(this, globalCtx); Player_SetPendingFlag(this, globalCtx);
// In rando the fanfares are handled by a function in code_800EC960.c // Use this if we do have a getItemEntry
if (gSaveContext.n64ddFlag) { if (giEntry.modIndex == MOD_NONE) {
Audio_PlayFanfare_Rando(this->getItemId); if (gSaveContext.n64ddFlag) {
} Audio_PlayFanfare_Rando(giEntry);
else if (((this->getItemId >= GI_RUPEE_GREEN) && (this->getItemId <= GI_RUPEE_RED)) || } else if (((giEntry.itemId >= ITEM_RUPEE_GREEN) && (giEntry.itemId <= ITEM_RUPEE_RED)) ||
((this->getItemId >= GI_RUPEE_PURPLE) && (this->getItemId <= GI_RUPEE_GOLD)) || ((giEntry.itemId >= ITEM_RUPEE_PURPLE) && (giEntry.itemId <= ITEM_RUPEE_GOLD)) ||
((this->getItemId >= GI_RUPEE_GREEN_LOSE) && (this->getItemId <= GI_RUPEE_PURPLE_LOSE)) || (giEntry.itemId == ITEM_HEART)) {
(this->getItemId == GI_HEART)) { Audio_PlaySoundGeneral(NA_SE_SY_GET_BOXITEM, &D_801333D4, 4, &D_801333E0, &D_801333E0, &D_801333E8);
Audio_PlaySoundGeneral(NA_SE_SY_GET_BOXITEM, &D_801333D4, 4, &D_801333E0, &D_801333E0, &D_801333E8); } else {
} if ((giEntry.itemId == ITEM_HEART_CONTAINER) ||
else { ((giEntry.itemId == ITEM_HEART_PIECE) &&
if ((this->getItemId == GI_HEART_CONTAINER_2) || (this->getItemId == GI_HEART_CONTAINER) || ((gSaveContext.inventory.questItems & 0xF0000000) == 0x40000000))) {
((this->getItemId == GI_HEART_PIECE) && temp1 = NA_BGM_HEART_GET | 0x900;
((gSaveContext.inventory.questItems & 0xF0000000) == 0x40000000))) { } else {
temp1 = NA_BGM_HEART_GET | 0x900; temp1 = temp2 =
(giEntry.itemId == ITEM_HEART_PIECE) ? NA_BGM_SMALL_ITEM_GET : NA_BGM_ITEM_GET | 0x900;
}
Audio_PlayFanfare(temp1);
} }
else { } else if (giEntry.modIndex == MOD_RANDOMIZER) {
temp1 = temp2 = (this->getItemId == GI_HEART_PIECE) ? NA_BGM_SMALL_ITEM_GET : NA_BGM_ITEM_GET | 0x900; if (gSaveContext.n64ddFlag) {
Audio_PlayFanfare_Rando(giEntry);
} else if (giEntry.itemId == RG_DOUBLE_DEFENSE || giEntry.itemId == RG_MAGIC_SINGLE ||
giEntry.itemId == RG_MAGIC_DOUBLE) {
Audio_PlayFanfare(NA_BGM_HEART_GET | 0x900);
} else {
Audio_PlayFanfare(NA_BGM_ITEM_GET | 0x900);
} }
Audio_PlayFanfare(temp1); } else {
// Just in case something weird happens with modIndex.
Audio_PlayFanfare(NA_BGM_ITEM_GET | 0x900);
} }
} } else {
else {
if (Message_GetState(&globalCtx->msgCtx) == TEXT_STATE_CLOSING) { if (Message_GetState(&globalCtx->msgCtx) == TEXT_STATE_CLOSING) {
if (this->getItemId == GI_GAUNTLETS_SILVER && !gSaveContext.n64ddFlag) { if (this->getItemId == GI_GAUNTLETS_SILVER && !gSaveContext.n64ddFlag) {
globalCtx->nextEntranceIndex = 0x0123; globalCtx->nextEntranceIndex = 0x0123;
@ -12795,6 +12621,7 @@ s32 func_8084DFF4(GlobalContext* globalCtx, Player* this) {
func_80852FFC(globalCtx, NULL, 8); func_80852FFC(globalCtx, NULL, 8);
} }
this->getItemId = GI_NONE; this->getItemId = GI_NONE;
this->getItemEntry = (GetItemEntry)GET_ITEM_NONE;
} }
} }
@ -12959,15 +12786,16 @@ void func_8084E6D4(Player* this, GlobalContext* globalCtx) {
else { else {
func_80832DBC(this); func_80832DBC(this);
if (this->getItemId == GI_ICE_TRAP) { if ((this->getItemId == GI_ICE_TRAP && !gSaveContext.n64ddFlag) ||
(gSaveContext.n64ddFlag && (this->getItemId == RG_ICE_TRAP || this->getItemEntry.getItemId == RG_ICE_TRAP))) {
this->stateFlags1 &= ~(PLAYER_STATE1_10 | PLAYER_STATE1_11); this->stateFlags1 &= ~(PLAYER_STATE1_10 | PLAYER_STATE1_11);
if (this->getItemId != GI_ICE_TRAP) { if ((this->getItemId != GI_ICE_TRAP && !gSaveContext.n64ddFlag) ||
(gSaveContext.n64ddFlag && (this->getItemId != RG_ICE_TRAP || this->getItemEntry.getItemId != RG_ICE_TRAP))) {
Actor_Spawn(&globalCtx->actorCtx, globalCtx, ACTOR_EN_CLEAR_TAG, this->actor.world.pos.x, Actor_Spawn(&globalCtx->actorCtx, globalCtx, ACTOR_EN_CLEAR_TAG, this->actor.world.pos.x,
this->actor.world.pos.y + 100.0f, this->actor.world.pos.z, 0, 0, 0, 0); this->actor.world.pos.y + 100.0f, this->actor.world.pos.z, 0, 0, 0, 0);
func_8083C0E8(this, globalCtx); func_8083C0E8(this, globalCtx);
} } else {
else {
this->actor.colChkInfo.damage = 0; this->actor.colChkInfo.damage = 0;
func_80837C0C(globalCtx, this, 3, 0.0f, 0.0f, 0, 20); func_80837C0C(globalCtx, this, 3, 0.0f, 0.0f, 0, 20);
} }
@ -13356,14 +13184,14 @@ void func_8084F104(Player* this, GlobalContext* globalCtx) {
func_80853148(globalCtx, targetActor); func_80853148(globalCtx, targetActor);
} }
else { else {
GetItemEntry* giEntry = &sGetItemTable[D_80854528[this->exchangeItemId - 1] - 1]; GetItemEntry giEntry = ItemTable_Retrieve(D_80854528[this->exchangeItemId - 1]);
if (this->itemActionParam >= PLAYER_AP_LETTER_ZELDA) { if (this->itemActionParam >= PLAYER_AP_LETTER_ZELDA) {
if (giEntry->gi >= 0) { if (giEntry.gi >= 0) {
this->unk_862 = giEntry->gi; this->unk_862 = giEntry.gi;
} }
else { else {
this->unk_862 = -giEntry->gi; this->unk_862 = -giEntry.gi;
} }
} }