From 387f73bf05b17d251df7792ec80cf20489c8eb1f Mon Sep 17 00:00:00 2001 From: Sonic Dreamcaster Date: Thu, 23 Oct 2025 03:52:45 -0300 Subject: [PATCH] somewhat working state --- BUILDING.md | 12 +- CMakeLists.txt | 56 +- assets/launcher.rml | 2 +- ...ariokart64recomp.mariokart64recomp.desktop | 4 +- ...b.mariokart64recomp.mariokart64recomp.json | 6 +- ...art64recomp.mariokart64recomp.metainfo.xml | 6 +- include/zelda_config.h | 4 +- patches.toml | 4 +- patches/Makefile | 2 +- patches/actor_tagging.c | 461 --- patches/audio.c | 30 - patches/background.c | 117 - patches/camera.c | 1142 ------- patches/game_fixes.c | 413 --- patches/gfx_config.c | 124 - patches/hud.c | 212 -- patches/improvements.c | 140 - patches/jumbotron.c | 164 - patches/menus.c | 1129 ------- patches/object_tagging.c | 2942 ----------------- patches/overlays.c | 58 - patches/print.c | 8 + patches/render_distance.c | 170 - patches/test_pak.c | 189 -- patches/text_tagging.c | 184 -- patches/texture_fix.c | 818 ----- patches/viewports.c | 144 - patches/workbench.c | 324 -- rsp/aspMain.cpp | 2272 +++++++++++++ src/game/config.cpp | 2 +- src/game/recomp_api.cpp | 18 + src/main/main.cpp | 15 +- src/ui/ui_mod_menu.cpp | 2 +- dukenukemzerohour.us.toml => us.toml | 0 34 files changed, 2355 insertions(+), 8819 deletions(-) delete mode 100644 patches/actor_tagging.c delete mode 100644 patches/audio.c delete mode 100644 patches/background.c delete mode 100644 patches/camera.c delete mode 100644 patches/game_fixes.c delete mode 100644 patches/gfx_config.c delete mode 100644 patches/hud.c delete mode 100644 patches/improvements.c delete mode 100644 patches/jumbotron.c delete mode 100644 patches/menus.c delete mode 100644 patches/object_tagging.c delete mode 100644 patches/overlays.c delete mode 100644 patches/render_distance.c delete mode 100644 patches/test_pak.c delete mode 100644 patches/text_tagging.c delete mode 100644 patches/texture_fix.c delete mode 100644 patches/viewports.c delete mode 100644 patches/workbench.c create mode 100644 rsp/aspMain.cpp rename dukenukemzerohour.us.toml => us.toml (100%) diff --git a/BUILDING.md b/BUILDING.md index 0ec1e86..6fcfbcd 100644 --- a/BUILDING.md +++ b/BUILDING.md @@ -4,7 +4,7 @@ This guide will help you build the project on your local machine. The process wi These steps cover: Running the recompiler and building the project. -## 1. Clone the MarioKart64Recomp Repository +## 1. Clone the DNZHRecomp Repository This project makes use of submodules so you will need to clone the repository with the `--recurse-submodules` flag. ```bash @@ -36,11 +36,11 @@ choco install make ``` ## 3. Generating the C code -Copy the ROM to the root of the MarioKart64Recomp repository with this filename: +Copy the ROM to the root of the DNZHRecomp repository with this filename: -- `mk64.us.z64` +- `baserom.us.z64` -Now that you have the required files, you must build [N64Recomp](https://github.com/Mr-Wiseguy/N64Recomp) and run it to generate the C code to be compiled. The building instructions can be found [here](https://github.com/Mr-Wiseguy/N64Recomp?tab=readme-ov-file#building). That will build the executables: `N64Recomp` and `RSPRecomp` which you should copy to the root of the MarioKart64Recomp repository. +Now that you have the required files, you must build [N64Recomp](https://github.com/Mr-Wiseguy/N64Recomp) and run it to generate the C code to be compiled. The building instructions can be found [here](https://github.com/Mr-Wiseguy/N64Recomp?tab=readme-ov-file#building). That will build the executables: `N64Recomp` and `RSPRecomp` which you should copy to the root of the DNZHRecomp repository. After that, go back to the repository root, and run the following commands: ```bash @@ -58,9 +58,9 @@ If you prefer the command line or you're on a Unix platform you can build the pr ```bash cmake -S . -B build-cmake -DCMAKE_CXX_COMPILER=clang++ -DCMAKE_C_COMPILER=clang -G Ninja -DCMAKE_BUILD_TYPE=Release # or Debug if you want to debug -cmake --build build-cmake --target MarioKart64Recompiled -j$(nproc) --config Release # or Debug +cmake --build build-cmake --target DNZHRecompiled -j$(nproc) --config Release # or Debug ``` ## 5. Success -VoilĂ ! You should now have a `MarioKart64Recompiled` executable in the build directory! If you used Visual Studio this will be `out/build/x64-[Configuration]` and if you used the provided CMake commands then this will be `build-cmake`. You will need to run the executable out of the root folder of this project or copy the assets folder to the build folder to run it. +VoilĂ ! You should now have a `DNZHRecompiled` executable in the build directory! If you used Visual Studio this will be `out/build/x64-[Configuration]` and if you used the provided CMake commands then this will be `build-cmake`. You will need to run the executable out of the root folder of this project or copy the assets folder to the build folder to run it. diff --git a/CMakeLists.txt b/CMakeLists.txt index ca4ac1e..a642736 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -4,7 +4,7 @@ if (APPLE) set(CMAKE_OSX_DEPLOYMENT_TARGET "11.0" CACHE STRING "Minimum OS X deployment version") endif() -project(MarioKart64Recompiled LANGUAGES C CXX) +project(DNZHRecompiled LANGUAGES C CXX) set(CMAKE_C_STANDARD 17) set(CMAKE_CXX_STANDARD 20) set(CMAKE_CXX_STANDARD_REQUIRED ON) @@ -145,7 +145,7 @@ add_custom_command(OUTPUT ) # Main executable -add_executable(MarioKart64Recompiled) +add_executable(DNZHRecompiled) set (SOURCES ${CMAKE_SOURCE_DIR}/src/main/main.cpp @@ -207,7 +207,7 @@ if (APPLE) list(APPEND SOURCES ${CMAKE_SOURCE_DIR}/src/main/support_apple.mm) endif() -target_include_directories(MarioKart64Recompiled PRIVATE +target_include_directories(DNZHRecompiled PRIVATE ${CMAKE_SOURCE_DIR}/include ${CMAKE_SOURCE_DIR}/lib/N64ModernRuntime/N64Recomp/include ${CMAKE_SOURCE_DIR}/lib/concurrentqueue @@ -228,7 +228,7 @@ target_include_directories(MarioKart64Recompiled PRIVATE ) if(CMAKE_SIZEOF_VOID_P EQUAL 8 AND CMAKE_SYSTEM_PROCESSOR MATCHES "x86_64|amd64|AMD64") - target_compile_options(MarioKart64Recompiled PRIVATE + target_compile_options(DNZHRecompiled PRIVATE -march=nehalem # Legacy CPU SUPPORT # -march=core2 @@ -237,7 +237,7 @@ if(CMAKE_SIZEOF_VOID_P EQUAL 8 AND CMAKE_SYSTEM_PROCESSOR MATCHES "x86_64|amd64| -fms-extensions ) else() - target_compile_options(MarioKart64Recompiled PRIVATE + target_compile_options(DNZHRecompiled PRIVATE -fno-strict-aliasing -fms-extensions ) @@ -245,11 +245,11 @@ endif() if (MSVC) # Disable identical code folding, since this breaks mod function patching as multiple functions can get merged into one. - target_link_options(MarioKart64Recompiled PRIVATE /OPT:NOICF) + target_link_options(DNZHRecompiled PRIVATE /OPT:NOICF) elseif (APPLE) # Use a wrapper around ld64 that respects segprot's `max_prot` value in order # to make our executable memory writable (required for mod function patching) - target_link_options(MarioKart64Recompiled PRIVATE + target_link_options(DNZHRecompiled PRIVATE "-fuse-ld=${CMAKE_SOURCE_DIR}/.github/macos/ld64" ) endif() @@ -269,23 +269,23 @@ if (WIN32) URL https://github.com/libsdl-org/SDL/releases/download/release-${SDL2_VERSION}/SDL2-devel-${SDL2_VERSION}-VC.zip ) FetchContent_MakeAvailable(sdl2) - target_include_directories(MarioKart64Recompiled PRIVATE + target_include_directories(DNZHRecompiled PRIVATE ${sdl2_SOURCE_DIR}/include ) - target_link_directories(MarioKart64Recompiled PRIVATE + target_link_directories(DNZHRecompiled PRIVATE ${sdl2_SOURCE_DIR}/lib/x64 ) # Copy SDL2 and dxc DLLs to output folder as post build step - add_custom_command(TARGET MarioKart64Recompiled POST_BUILD + add_custom_command(TARGET DNZHRecompiled POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy_if_different "${sdl2_SOURCE_DIR}/lib/x64/SDL2.dll" "${CMAKE_SOURCE_DIR}/lib/rt64/src/contrib/dxc/bin/x64/dxil.dll" "${CMAKE_SOURCE_DIR}/lib/rt64/src/contrib/dxc/bin/x64/dxcompiler.dll" - $) + $) set_target_properties( - MarioKart64Recompiled + DNZHRecompiled PROPERTIES LINK_FLAGS_DEBUG "/SUBSYSTEM:CONSOLE" LINK_FLAGS_RELEASE "/SUBSYSTEM:WINDOWS /ENTRY:mainCRTStartup" @@ -293,19 +293,19 @@ if (WIN32) LINK_FLAGS_MINSIZEREL "/SUBSYSTEM:WINDOWS /ENTRY:mainCRTStartup" ) - target_sources(MarioKart64Recompiled PRIVATE ${CMAKE_SOURCE_DIR}/icons/app.rc) - target_link_libraries(MarioKart64Recompiled PRIVATE SDL2 Winmm.lib) + target_sources(DNZHRecompiled PRIVATE ${CMAKE_SOURCE_DIR}/icons/app.rc) + target_link_libraries(DNZHRecompiled PRIVATE SDL2 Winmm.lib) endif() if (APPLE) find_package(SDL2 REQUIRED) - target_include_directories(MarioKart64Recompiled PRIVATE ${SDL2_INCLUDE_DIRS}) + target_include_directories(DNZHRecompiled PRIVATE ${SDL2_INCLUDE_DIRS}) set(CMAKE_THREAD_PREFER_PTHREAD TRUE) set(THREADS_PREFER_PTHREAD_FLAG TRUE) find_package(Threads REQUIRED) - target_link_libraries(MarioKart64Recompiled PRIVATE ${CMAKE_DL_LIBS} Threads::Threads SDL2::SDL2) + target_link_libraries(DNZHRecompiled PRIVATE ${CMAKE_DL_LIBS} Threads::Threads SDL2::SDL2) include(${CMAKE_SOURCE_DIR}/.github/macos/apple_bundle.cmake) endif() @@ -321,20 +321,20 @@ if (CMAKE_SYSTEM_NAME MATCHES "Linux") COMMAND file_to_c ${CMAKE_SOURCE_DIR}/icons/512.png icon_bytes ${CMAKE_CURRENT_BINARY_DIR}/icon_bytes.c ${CMAKE_CURRENT_BINARY_DIR}/icon_bytes.h DEPENDS ${CMAKE_SOURCE_DIR}/icons/512.png ) - target_sources(MarioKart64Recompiled PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/icon_bytes.c) + target_sources(DNZHRecompiled PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/icon_bytes.c) message(STATUS "SDL2_FOUND = ${SDL2_FOUND}") message(STATUS "SDL2_INCLUDE_DIRS = ${SDL2_INCLUDE_DIRS}") - target_include_directories(MarioKart64Recompiled PRIVATE ${SDL2_INCLUDE_DIRS}) + target_include_directories(DNZHRecompiled PRIVATE ${SDL2_INCLUDE_DIRS}) message(STATUS "X11_FOUND = ${X11_FOUND}") message(STATUS "X11_Xrandr_FOUND = ${X11_Xrandr_FOUND}") message(STATUS "X11_INCLUDE_DIR = ${X11_INCLUDE_DIR}") message(STATUS "X11_LIBRARIES = ${X11_LIBRARIES}") - target_include_directories(MarioKart64Recompiled PRIVATE ${X11_INCLUDE_DIR} ${X11_Xrandr_INCLUDE_PATH}) - target_link_libraries(MarioKart64Recompiled PRIVATE ${X11_LIBRARIES} ${X11_Xrandr_LIB}) + target_include_directories(DNZHRecompiled PRIVATE ${X11_INCLUDE_DIR} ${X11_Xrandr_INCLUDE_PATH}) + target_link_libraries(DNZHRecompiled PRIVATE ${X11_LIBRARIES} ${X11_Xrandr_LIB}) find_package(Freetype REQUIRED) @@ -343,16 +343,16 @@ if (CMAKE_SYSTEM_NAME MATCHES "Linux") message(STATUS "FREETYPE_LIBRARIES = ${FREETYPE_LIBRARIES}") include_directories(${FREETYPE_LIBRARIES}) - target_link_libraries(MarioKart64Recompiled PRIVATE ${FREETYPE_LIBRARIES} SDL2::SDL2) + target_link_libraries(DNZHRecompiled PRIVATE ${FREETYPE_LIBRARIES} SDL2::SDL2) set(CMAKE_THREAD_PREFER_PTHREAD TRUE) set(THREADS_PREFER_PTHREAD_FLAG TRUE) find_package(Threads REQUIRED) - target_link_libraries(MarioKart64Recompiled PRIVATE "-latomic -static-libstdc++" ${CMAKE_DL_LIBS} Threads::Threads) + target_link_libraries(DNZHRecompiled PRIVATE "-latomic -static-libstdc++" ${CMAKE_DL_LIBS} Threads::Threads) endif() -target_link_libraries(MarioKart64Recompiled PRIVATE +target_link_libraries(DNZHRecompiled PRIVATE PatchesLib RecompiledFuncs librecomp @@ -396,8 +396,8 @@ else() endif() endif() -build_vertex_shader(MarioKart64Recompiled "shaders/InterfaceVS.hlsl" "shaders/InterfaceVS.hlsl") -build_pixel_shader(MarioKart64Recompiled "shaders/InterfacePS.hlsl" "shaders/InterfacePS.hlsl") +build_vertex_shader(DNZHRecompiled "shaders/InterfaceVS.hlsl" "shaders/InterfaceVS.hlsl") +build_pixel_shader(DNZHRecompiled "shaders/InterfacePS.hlsl" "shaders/InterfacePS.hlsl") # Embed all .nrm files in the "mods" directory file(GLOB NRM_FILES "${CMAKE_SOURCE_DIR}/mods/*.nrm") @@ -418,8 +418,8 @@ foreach(NRM_FILE ${NRM_FILES}) list(APPEND GENERATED_NRM_SOURCES ${OUT_C}) endforeach() -target_sources(MarioKart64Recompiled PRIVATE ${GENERATED_NRM_SOURCES}) +target_sources(DNZHRecompiled PRIVATE ${GENERATED_NRM_SOURCES}) -target_sources(MarioKart64Recompiled PRIVATE ${SOURCES}) +target_sources(DNZHRecompiled PRIVATE ${SOURCES}) -set_property(TARGET MarioKart64Recompiled PROPERTY VS_DEBUGGER_WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}") +set_property(TARGET DNZHRecompiled PROPERTY VS_DEBUGGER_WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}") diff --git a/assets/launcher.rml b/assets/launcher.rml index 8345e77..3432c59 100644 --- a/assets/launcher.rml +++ b/assets/launcher.rml @@ -17,7 +17,7 @@
diff --git a/flatpak/io.github.mariokart64recomp.mariokart64recomp.desktop b/flatpak/io.github.mariokart64recomp.mariokart64recomp.desktop index f3f129d..39d35bc 100644 --- a/flatpak/io.github.mariokart64recomp.mariokart64recomp.desktop +++ b/flatpak/io.github.mariokart64recomp.mariokart64recomp.desktop @@ -1,6 +1,6 @@ [Desktop Entry] -Name=MarioKart 64: Recompiled -Exec=/app/bin/MarioKart64Recompiled +Name=Duke Nukem Zero Hour: Recompiled +Exec=/app/bin/DNZHRecompiled Type=Application Icon=io.github.mariokart64recomp.mariokart64recomp Categories=Game; diff --git a/flatpak/io.github.mariokart64recomp.mariokart64recomp.json b/flatpak/io.github.mariokart64recomp.mariokart64recomp.json index 49ce7d8..5577356 100644 --- a/flatpak/io.github.mariokart64recomp.mariokart64recomp.json +++ b/flatpak/io.github.mariokart64recomp.mariokart64recomp.json @@ -17,7 +17,7 @@ ], "modules": [ { - "name": "MarioKart64Recompiled", + "name": "DNZHRecompiled", "buildsystem": "simple", "build-commands": [ "cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_COMPILER=clang++ -DCMAKE_C_COMPILER=clang -DCMAKE_MAKE_PROGRAM=ninja -G Ninja -S lib/N64Recomp -B lib/N64Recomp/cmake-build", @@ -28,10 +28,10 @@ "./N64Recomp us.toml", "./RSPRecomp aspMain.us.toml", "cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_COMPILER=clang++ -DCMAKE_C_COMPILER=clang -DCMAKE_MAKE_PROGRAM=ninja -DPATCHES_C_COMPILER=clang -DPATCHES_LD=ld.lld -DRECOMP_FLATPAK=ON -G Ninja -S . -B cmake-build", - "cmake --build cmake-build --config Release --target MarioKart64Recompiled --parallel", + "cmake --build cmake-build --config Release --target DNZHRecompiled --parallel", "rm -rf assets/scss", "mkdir -p /app/bin", - "cp cmake-build/MarioKart64Recompiled /app/bin/MarioKart64Recompiled", + "cp cmake-build/DNZHRecompiled /app/bin/DNZHRecompiled", "cp recompcontrollerdb.txt /app/bin/recompcontrollerdb.txt", "cp -R assets /app/bin/assets", "install -Dm644 icons/512.png /app/share/icons/hicolor/512x512/apps/${FLATPAK_ID}.png", diff --git a/flatpak/io.github.mariokart64recomp.mariokart64recomp.metainfo.xml b/flatpak/io.github.mariokart64recomp.mariokart64recomp.metainfo.xml index 843c64b..2bf87ab 100644 --- a/flatpak/io.github.mariokart64recomp.mariokart64recomp.metainfo.xml +++ b/flatpak/io.github.mariokart64recomp.mariokart64recomp.metainfo.xml @@ -2,7 +2,7 @@ io.github.mariokart64recomp.mariokart64recomp - MarioKart 64: Recompiled + Duke Nukem Zero Hour: Recompiled Static recompilation of MarioKart 64 for PC. CC0-1.0 @@ -17,11 +17,11 @@

- MarioKart 64: Recompiled is a project that uses N64: Recompiled to statically recompile MarioKart 64 into a native port with many new features and enhancements. This project uses RT64 as the rendering engine to provide some of these enhancements. + Duke Nukem Zero Hour: Recompiled is a project that uses N64: Recompiled to statically recompile MarioKart 64 into a native port with many new features and enhancements. This project uses RT64 as the rendering engine to provide some of these enhancements. The original game is required to run this project. - https://github.com/sonicdcer/MarioKart64Recomp + https://github.com/sonicdcer/DNZHRecomp

diff --git a/include/zelda_config.h b/include/zelda_config.h index 8d367ff..8c3c965 100644 --- a/include/zelda_config.h +++ b/include/zelda_config.h @@ -7,8 +7,8 @@ #include "recomp_input.h" namespace zelda64 { - constexpr std::u8string_view program_id = u8"MarioKart64Recompiled"; - constexpr std::string_view program_name = "MarioKart 64: Recompiled"; + constexpr std::u8string_view program_id = u8"DNZHRecompiled"; + constexpr std::string_view program_name = "Duke Nukem Zero Hour: Recompiled"; // TODO: Move loading configs to the runtime once we have a way to allow per-project customization. void load_config(); diff --git a/patches.toml b/patches.toml index 41fb98c..e101267 100644 --- a/patches.toml +++ b/patches.toml @@ -10,8 +10,8 @@ single_file_output = true use_absolute_symbols = true # Point the recompiler at the symbol files so that it can resolve relocations during recompilation. -func_reference_syms_file = "MarioKart64RecompSyms/mk64.us.syms.toml" -data_reference_syms_files = [ "MarioKart64RecompSyms/mk64.us.datasyms.toml" ] +# func_reference_syms_file = "MarioKart64RecompSyms/mk64.us.syms.toml" +# data_reference_syms_files = [ "MarioKart64RecompSyms/mk64.us.datasyms.toml" ] # data_reference_syms_files = [ "MarioKart64RecompSyms/mk64.us.datasyms.toml", "MarioKart64RecompSyms/mk64.us.datasyms_static.toml" ] # Tell the recompiler to write the output binary. Doing this instead of using objcopy allows the recompiler to patch MIPS32 relocs. diff --git a/patches/Makefile b/patches/Makefile index f2d7adf..5c57e50 100644 --- a/patches/Makefile +++ b/patches/Makefile @@ -6,7 +6,7 @@ LD ?= ld.lld CFLAGS := -target mips -mips2 -mabi=32 -O2 -G0 -mno-abicalls -mno-odd-spreg -mno-check-zero-division \ -fomit-frame-pointer -ffast-math -fno-unsafe-math-optimizations -fno-builtin-memset \ -Wall -Wextra -Wno-incompatible-library-redeclaration -Wno-unused-parameter -Wno-unknown-pragmas -Wno-unused-variable -Wno-unused-but-set-variable -Wno-missing-braces -Wno-unsupported-floating-point-opt -Wno-switch -CPPFLAGS := -nostdinc -DTARGET_N64 -DF3DEX_GBI -DF3D_OLD -D_LANGUAGE_C -DMIPS -I dummy_headers -I ../lib/mk64/include -I ../lib/mk64/include/PR -I ../lib/mk64/include/libc -I ../lib/mk64/src -I ../lib/mk64/assets -I../lib/rt64/include +CPPFLAGS := -nostdinc -DTARGET_N64 -DF3DEX_GBI_2 -D_LANGUAGE_C -DMIPS -I ../lib/DukeNukemZeroHour/include -I ../lib/DukeNukemZeroHour/libs/libultra/PR -I../lib/rt64/include LDFLAGS := -nostdlib -T patches.ld -T syms.ld -Map patches.map --unresolved-symbols=ignore-all --emit-relocs C_SRCS := $(wildcard *.c) diff --git a/patches/actor_tagging.c b/patches/actor_tagging.c deleted file mode 100644 index 66a618c..0000000 --- a/patches/actor_tagging.c +++ /dev/null @@ -1,461 +0,0 @@ -#include "patches.h" - -#if 1 -/** - * @brief Renders the item box actor. - * - * @param camera - * @param item_box - */ -RECOMP_PATCH void render_actor_item_box(Camera* camera, struct ItemBox* item_box) { - UNUSED s32 pad[2]; - Vec3f someVec1; - Vec3f someVec2; - Vec3s someRot; - f32 thing; - UNUSED s32 pad2; - Mat4 someMatrix1; - Mat4 someMatrix2; - UNUSED s32 pad3[4]; - f32 temp_f0; - f32 temp_f0_2; - f32 temp_f0_3; - f32 temp_f12; - f32 temp_f2; - f32 temp_f2_2; - f32 someMultiplier; - - // @recomp Tag the transform. - gEXMatrixGroupDecomposed(gDisplayListHead++, TAG_ITEM_ADDR(item_box), G_EX_PUSH, G_MTX_MODELVIEW, - G_EX_COMPONENT_AUTO, G_EX_COMPONENT_AUTO, G_EX_COMPONENT_AUTO, G_EX_COMPONENT_INTERPOLATE, - G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_SKIP, G_EX_COMPONENT_INTERPOLATE, - G_EX_ORDER_AUTO, G_EX_EDIT_ALLOW); - - temp_f0 = is_within_render_distance(camera->pos, item_box->pos, camera->rot[1], 0.0f, gCameraZoom[camera - camera1], - 4000000.0f); - if (!(temp_f0 < 0.0f) && !(600000.0f < temp_f0)) { - if ((item_box->state == 2) && (temp_f0 < 100000.0f)) { - someRot[0] = 0; - someRot[1] = item_box->rot[1]; - someRot[2] = 0; - someVec2[0] = item_box->pos[0]; - someVec2[1] = item_box->resetDistance + 2.0f; - someVec2[2] = item_box->pos[2]; - mtxf_pos_rotation_xyz(someMatrix1, someVec2, someRot); - - if (!render_set_position(someMatrix1, 0)) { - return; - } - - gSPDisplayList(gDisplayListHead++, (u8*) 0x0D002EE8); - - someRot[1] = item_box->rot[1] * 2; - someVec2[1] = item_box->pos[1]; - mtxf_pos_rotation_xyz(someMatrix1, someVec2, someRot); - - if (!render_set_position(someMatrix1, 0)) { - return; - } - - // Normal state - gDPSetTextureLUT(gDisplayListHead++, G_TT_NONE); - gSPDisplayList(gDisplayListHead++, (u8*) 0x0d003008); - gDPSetTextureLUT(gDisplayListHead++, G_TT_RGBA16); - } - if (item_box->state == 5) { - mtxf_pos_rotation_xyz(someMatrix1, item_box->pos, item_box->rot); - - if (!render_set_position(someMatrix1, 0)) { - return; - } - gDPSetTextureLUT(gDisplayListHead++, G_TT_NONE); - gSPDisplayList(gDisplayListHead++, (u8*) 0x0d003008); - gDPSetTextureLUT(gDisplayListHead++, G_TT_RGBA16); - } - if (item_box->state != 3) { - mtxf_pos_rotation_xyz(someMatrix1, item_box->pos, item_box->rot); - - if (!render_set_position(someMatrix1, 0)) { - return; - } - - gSPClearGeometryMode(gDisplayListHead++, G_LIGHTING); - gDPSetCombineMode(gDisplayListHead++, G_CC_MODULATEIA, G_CC_MODULATEIA); - // if ((item_box->rot[1] < 0xAA1) && (item_box->rot[1] > 0)) { - // gDPSetRenderMode(gDisplayListHead++, G_RM_AA_ZB_OPA_SURF, G_RM_AA_ZB_OPA_SURF2); - // } else if ((item_box->rot[1] >= 0x6AA5) && (item_box->rot[1] < 0x754E)) { - // gDPSetRenderMode(gDisplayListHead++, G_RM_AA_ZB_OPA_SURF, G_RM_AA_ZB_OPA_SURF2); - // } else if ((item_box->rot[1] >= 0x38E1) && (item_box->rot[1] < 0x438A)) { - // gDPSetRenderMode(gDisplayListHead++, G_RM_AA_ZB_OPA_SURF, G_RM_AA_ZB_OPA_SURF2); - // } else if ((item_box->rot[1] >= -14575) && (item_box->rot[1] < -11878)) { - // gDPSetRenderMode(gDisplayListHead++, G_RM_AA_ZB_OPA_SURF, G_RM_AA_ZB_OPA_SURF2); - // } else { - gDPSetBlendMask(gDisplayListHead++, 0xFF); - gDPSetRenderMode(gDisplayListHead++, G_RM_ZB_CLD_SURF, G_RM_ZB_CLD_SURF2); - // } - gSPSetGeometryMode(gDisplayListHead++, G_SHADING_SMOOTH); - gSPDisplayList(gDisplayListHead++, (u8*) 0x0D003090); - } else { - gSPClearGeometryMode(gDisplayListHead++, G_LIGHTING); - gSPClearGeometryMode(gDisplayListHead++, G_CULL_BACK); - gDPSetBlendMask(gDisplayListHead++, 0xFF); - thing = item_box->someTimer; - mtxf_pos_rotation_xyz(someMatrix1, item_box->pos, item_box->rot); - if (thing < 10.0f) { - someMultiplier = 1.0f; - } else { - someMultiplier = 1.0f - ((thing - 10.0f) * 0.1f); - } - mtxf_scale(someMatrix1, someMultiplier); - if (item_box->someTimer & 1) { - gDPSetRenderMode(gDisplayListHead++, G_RM_AA_ZB_OPA_SURF, G_RM_AA_ZB_OPA_SURF2); - } else { - gDPSetRenderMode(gDisplayListHead++, G_RM_AA_ZB_XLU_INTER, G_RM_NOOP2); - } - temp_f2 = 2.0f * thing; - someVec1[0] = 0.0f; - someVec1[1] = temp_f2; - someVec1[2] = thing; - add_translate_mat4_vec3f(someMatrix1, someMatrix2, someVec1); - - if (!render_set_position(someMatrix2, 0)) { - return; - } - - gSPDisplayList(gDisplayListHead++, (u8*) 0x0D003158); - temp_f2_2 = 0.8f * thing; - temp_f12 = 0.5f * thing; - someVec1[0] = temp_f2_2; - someVec1[1] = 2.3f * thing; - someVec1[2] = temp_f12; - add_translate_mat4_vec3f(someMatrix1, someMatrix2, someVec1); - - if (!render_set_position(someMatrix2, 0)) { - return; - } - - gSPDisplayList(gDisplayListHead++, (u8*) 0x0D0031B8); - temp_f0_2 = -0.5f * thing; - someVec1[0] = temp_f2_2; - someVec1[1] = 1.2f * thing; - someVec1[2] = temp_f0_2; - add_translate_mat4_vec3f(someMatrix1, someMatrix2, someVec1); - - if (!render_set_position(someMatrix2, 0)) { - return; - } - - gSPDisplayList(gDisplayListHead++, (u8*) 0x0D003128); - if (!(item_box->someTimer & 1)) { - gDPSetRenderMode(gDisplayListHead++, G_RM_AA_ZB_OPA_SURF, G_RM_AA_ZB_OPA_SURF2); - } else { - gDPSetRenderMode(gDisplayListHead++, G_RM_AA_ZB_XLU_INTER, G_RM_NOOP2); - } - someVec1[0] = 0.0f; - someVec1[1] = 1.8f * thing; - someVec1[2] = -1.0f * thing; - add_translate_mat4_vec3f(someMatrix1, someMatrix2, someVec1); - - if (!render_set_position(someMatrix2, 0)) { - return; - } - - gSPDisplayList(gDisplayListHead++, (u8*) 0x0D0031E8); - temp_f0_3 = -0.8f * thing; - someVec1[0] = temp_f0_3; - someVec1[1] = 0.6f * thing; - someVec1[2] = temp_f0_2; - add_translate_mat4_vec3f(someMatrix1, someMatrix2, someVec1); - - if (!render_set_position(someMatrix2, 0)) { - return; - } - - gSPDisplayList(gDisplayListHead++, (u8*) 0x0D003188); - someVec1[0] = temp_f0_3; - someVec1[1] = temp_f2; - someVec1[2] = temp_f12; - add_translate_mat4_vec3f(someMatrix1, someMatrix2, someVec1); - - if (!render_set_position(someMatrix2, 0)) { - return; - } - - gSPDisplayList(gDisplayListHead++, (u8*) 0x0D0030F8); - gSPSetGeometryMode(gDisplayListHead++, G_CULL_BACK); - } - gSPTexture(gDisplayListHead++, 0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON); - } - // @recomp Pop the transform id. - gEXPopMatrixGroup(gDisplayListHead++, G_MTX_MODELVIEW); -} -#endif - -#if 1 -/** - * @brief Renders the fake item box actor. - * - * @param camera - * @param fakeItemBox - */ -RECOMP_PATCH void render_actor_fake_item_box(Camera* camera, struct FakeItemBox* fakeItemBox) { - Vec3s someRot; - UNUSED s32 pad[3]; - Vec3f someVec; - Mat4 someMatrix2; - Mat4 someMatrix3; - UNUSED s32 pad2[12]; - f32 temp_f0_2; - f32 temp_f0_3; - f32 temp_f12; - f32 temp_f2; - f32 thing; - f32 temp_f2_2; - f32 someMultiplier; - - gEXMatrixGroupDecomposed(gDisplayListHead++, TAG_ITEM_ADDR(fakeItemBox), G_EX_PUSH, G_MTX_MODELVIEW, - G_EX_COMPONENT_AUTO, G_EX_COMPONENT_AUTO, G_EX_COMPONENT_AUTO, G_EX_COMPONENT_INTERPOLATE, - G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_SKIP, G_EX_COMPONENT_INTERPOLATE, - G_EX_ORDER_AUTO, G_EX_EDIT_ALLOW); - - if (is_within_render_distance(camera->pos, fakeItemBox->pos, camera->rot[1], 2500.0f, gCameraZoom[camera - camera1], - 1000000.0f) < 0) { - actor_not_rendered(camera, (struct Actor*) fakeItemBox); - return; - } - if (((f32) gCourseMaxY + 800.0f) < fakeItemBox->pos[1]) { - actor_not_rendered(camera, (struct Actor*) fakeItemBox); - return; - } - if (fakeItemBox->pos[1] < ((f32) gCourseMinY - 800.0f)) { - actor_not_rendered(camera, (struct Actor*) fakeItemBox); - return; - } - - actor_rendered(camera, (struct Actor*) fakeItemBox); - someRot[0] = 0; - someRot[1] = fakeItemBox->rot[1]; - someRot[2] = 0; - mtxf_pos_rotation_xyz(someMatrix2, fakeItemBox->pos, someRot); - mtxf_scale(someMatrix2, fakeItemBox->sizeScaling); - - if (fakeItemBox->state != 2) { - if (!render_set_position(someMatrix2, 0)) { - return; - } - gDPSetTextureLUT(gDisplayListHead++, G_TT_NONE); - gSPDisplayList(gDisplayListHead++, (Gfx*) 0xd002f80); - gDPSetTextureLUT(gDisplayListHead++, G_TT_RGBA16); - mtxf_pos_rotation_xyz(someMatrix2, fakeItemBox->pos, fakeItemBox->rot); - mtxf_scale(someMatrix2, fakeItemBox->sizeScaling); - - if (!render_set_position(someMatrix2, 0)) { - return; - } - - gSPClearGeometryMode(gDisplayListHead++, G_LIGHTING); - gDPSetCombineMode(gDisplayListHead++, G_CC_MODULATEIA, G_CC_MODULATEIA); - // if ((fakeItemBox->rot[1] < 0xAA1) && (fakeItemBox->rot[1] > 0)) { - // gDPSetRenderMode(gDisplayListHead++, G_RM_AA_ZB_OPA_SURF, G_RM_AA_ZB_OPA_SURF2); - // } else if ((fakeItemBox->rot[1] >= 0x6AA5) && (fakeItemBox->rot[1] < 0x754E)) { - // gDPSetRenderMode(gDisplayListHead++, G_RM_AA_ZB_OPA_SURF, G_RM_AA_ZB_OPA_SURF2); - // } else if ((fakeItemBox->rot[1] >= 0x38E1) && (fakeItemBox->rot[1] < 0x438A)) { - // gDPSetRenderMode(gDisplayListHead++, G_RM_AA_ZB_OPA_SURF, G_RM_AA_ZB_OPA_SURF2); - // } else if ((fakeItemBox->rot[1] >= 0xC711) && (fakeItemBox->rot[1] < 0xD1BA)) { - // gDPSetRenderMode(gDisplayListHead++, G_RM_AA_ZB_OPA_SURF, G_RM_AA_ZB_OPA_SURF2); - // } else { - gDPSetBlendMask(gDisplayListHead++, 0xFF); - gDPSetRenderMode(gDisplayListHead++, G_RM_ZB_CLD_SURF, G_RM_ZB_CLD_SURF2); - // } - gSPDisplayList(gDisplayListHead++, (Gfx*) 0x0D003090); - } else { - gSPClearGeometryMode(gDisplayListHead++, G_LIGHTING); - gSPClearGeometryMode(gDisplayListHead++, G_CULL_BACK); - gDPSetBlendMask(gDisplayListHead++, 0xFF); - thing = fakeItemBox->someTimer; - mtxf_pos_rotation_xyz(someMatrix2, fakeItemBox->pos, fakeItemBox->rot); - if (thing < 10.0f) { - someMultiplier = 1.0f; - } else { - someMultiplier = 1.0f - ((thing - 10.0f) * 0.1f); - } - mtxf_scale(someMatrix2, someMultiplier); - if (fakeItemBox->someTimer & 1) { - gDPSetRenderMode(gDisplayListHead++, G_RM_AA_ZB_OPA_SURF, G_RM_AA_ZB_OPA_SURF2); - } else { - gDPSetRenderMode(gDisplayListHead++, G_RM_AA_ZB_XLU_INTER, G_RM_NOOP2); - } - temp_f2 = 2.0f * thing; - someVec[0] = 0.0f; - someVec[1] = temp_f2; - someVec[2] = thing; - add_translate_mat4_vec3f(someMatrix2, someMatrix3, someVec); - - if (!render_set_position(someMatrix3, 0)) { - return; - } - - gSPDisplayList(gDisplayListHead++, (Gfx*) 0x0D003158); - temp_f2_2 = 0.8f * thing; - temp_f12 = 0.5f * thing; - someVec[0] = temp_f2_2; - someVec[1] = 2.3f * thing; - someVec[2] = temp_f12; - add_translate_mat4_vec3f(someMatrix2, someMatrix3, someVec); - - if (!render_set_position(someMatrix3, 0)) { - return; - } - - gSPDisplayList(gDisplayListHead++, (Gfx*) 0x0D0031B8); - temp_f0_2 = -0.5f * thing; - someVec[0] = temp_f2_2; - someVec[1] = 1.2f * thing; - someVec[2] = temp_f0_2; - add_translate_mat4_vec3f(someMatrix2, someMatrix3, someVec); - - if (!render_set_position(someMatrix3, 0)) { - return; - } - - gSPDisplayList(gDisplayListHead++, (Gfx*) 0x0D003128); - if (!(fakeItemBox->someTimer & 1)) { - gDPSetRenderMode(gDisplayListHead++, G_RM_AA_ZB_OPA_SURF, G_RM_AA_ZB_OPA_SURF2); - } else { - gDPSetRenderMode(gDisplayListHead++, G_RM_AA_ZB_XLU_INTER, G_RM_NOOP2); - } - someVec[0] = 0.0f; - someVec[1] = 1.8f * thing; - someVec[2] = -1.0f * thing; - add_translate_mat4_vec3f(someMatrix2, someMatrix3, someVec); - - if (!render_set_position(someMatrix3, 0)) { - return; - } - - gSPDisplayList(gDisplayListHead++, (Gfx*) 0x0D0031E8); - temp_f0_3 = -0.8f * thing; - someVec[0] = temp_f0_3; - someVec[1] = 0.6f * thing; - someVec[2] = temp_f0_2; - add_translate_mat4_vec3f(someMatrix2, someMatrix3, someVec); - - if (!render_set_position(someMatrix3, 0)) { - return; - } - - gSPDisplayList(gDisplayListHead++, (Gfx*) 0x0D003188); - someVec[0] = temp_f0_3; - someVec[1] = temp_f2; - someVec[2] = temp_f12; - add_translate_mat4_vec3f(someMatrix2, someMatrix3, someVec); - - if (!render_set_position(someMatrix3, 0)) { - return; - } - - gSPDisplayList(gDisplayListHead++, (Gfx*) 0x0D0030F8); - gSPSetGeometryMode(gDisplayListHead++, G_CULL_BACK); - } - // @recomp Pop the transform id. - gEXPopMatrixGroup(gDisplayListHead++, G_MTX_MODELVIEW); -} -#endif - -#if 0 -RECOMP_PATCH void func_80068DA0(Player* player, UNUSED s8 arg1, UNUSED f32 arg2, s8 arg3, s8 arg4) { - Vec3f sp9C; - Vec3s sp94; - - if ((player->unk_258[20 + arg4].unk_01C == 1) && ((s32) player->animFrameSelector[arg3] < 0xD)) { - sp9C[1] = (player->pos[1] - 3.0f) + player->unk_258[20 + arg4].unk_000[1]; - sp9C[2] = player->pos[2] + (coss(player->unk_048[arg3]) * -10.0f); - sp9C[0] = player->pos[0] + (sins(player->unk_048[arg3]) * -10.0f); - sp94[0] = 0; - sp94[1] = player->unk_048[arg3]; - sp94[2] = 0; - func_800652D4(sp9C, sp94, player->unk_258[20 + arg4].unk_00C * player->size); - gSPDisplayList(gDisplayListHead++, (Gfx*)0x0D008C90); - gDPLoadTLUT_pal256(gDisplayListHead++, (Gfx*)0x800E52D0); - gDPSetTextureLUT(gDisplayListHead++, G_TT_RGBA16); - gDPLoadTextureBlock(gDisplayListHead++, (Gfx*)0x8018D4A4, G_IM_FMT_CI, G_IM_SIZ_8b, 64, 32, 0, - G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, - G_TX_NOLOD); - gSPVertex(gDisplayListHead++, (Gfx*)0x800E8B80, 4, 0); - gSPDisplayList(gDisplayListHead++, (Gfx*)0xd008c78); - gDPLoadTextureBlock(gDisplayListHead++, (Gfx*)0x8018D4A8, G_IM_FMT_CI, G_IM_SIZ_8b, 64, 32, 0, - G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, - G_TX_NOLOD); - gSPVertex(gDisplayListHead++, (Gfx*)0x800E8BC0, 4, 0); - gSPDisplayList(gDisplayListHead++, (Gfx*)0x0D008DA0); - gDPSetTextureLUT(gDisplayListHead++, G_TT_NONE); - gMatrixEffectCount += 1; - } -} -#endif - -#if 0 -RECOMP_PATCH void func_80067964(Player* player, UNUSED s8 arg1, f32 arg2, UNUSED s8 arg3, s8 arg4) { - Vec3f sp9C; - Vec3s sp94; - - if (player->unk_258[20 + arg4].unk_01C == 1) { - sp9C[0] = player->unk_258[20 + arg4].unk_000[0]; - sp9C[1] = player->unk_258[20 + arg4].unk_000[1]; - sp9C[2] = player->unk_258[20 + arg4].unk_000[2]; - sp94[0] = 0; - sp94[1] = player->unk_258[20 + arg4].unk_020; - sp94[2] = 0; - func_800652D4(sp9C, sp94, player->size * arg2); - gSPDisplayList(gDisplayListHead++, (Gfx*)0x0D008C90); - gSPClearGeometryMode(gDisplayListHead++, G_CULL_BOTH); - gDPLoadTLUT_pal256(gDisplayListHead++, (Gfx*)0x800E52D0); - gDPSetTextureLUT(gDisplayListHead++, G_TT_RGBA16); - gDPLoadTextureBlock(gDisplayListHead++, (Gfx*)0x8018D4AC, G_IM_FMT_CI, G_IM_SIZ_8b, 64, 32, 0, - G_TX_NOMIRROR | G_TX_CLAMP, G_TX_NOMIRROR | G_TX_CLAMP, G_TX_NOMASK, G_TX_NOMASK, - G_TX_NOLOD, G_TX_NOLOD); - gSPVertex(gDisplayListHead++, (Gfx*)0x800E8840, 4, 0); - gSPDisplayList(gDisplayListHead++, (Gfx*)0xd008c78); - gDPLoadTextureBlock(gDisplayListHead++, (Gfx*)0x8018D4B0, G_IM_FMT_CI, G_IM_SIZ_8b, 64, 32, 0, - G_TX_NOMIRROR | G_TX_CLAMP, G_TX_NOMIRROR | G_TX_CLAMP, G_TX_NOMASK, G_TX_NOMASK, - G_TX_NOLOD, G_TX_NOLOD); - gSPVertex(gDisplayListHead++, (Gfx*)0x800E8800, 4, 0); - gSPDisplayList(gDisplayListHead++, (Gfx*)0x0D008DA0); - gDPSetTextureLUT(gDisplayListHead++, G_TT_NONE); - gMatrixEffectCount += 1; - } -} -#endif - -#if 0 -RECOMP_PATCH void func_80068310(Player* player, UNUSED s8 arg1, UNUSED f32 arg2, s8 arg3, s8 arg4) { - UNUSED s32 stackPadding[16]; // huh? - Vec3f sp9C; - Vec3s sp94; - - if (player->unk_258[20 + arg4].unk_01C == 1) { - sp9C[1] = player->unk_258[20 + arg4].unk_000[1]; - sp9C[2] = player->pos[2] + (coss(player->unk_048[arg3]) * -10.0f); - sp9C[0] = player->pos[0] + (sins(player->unk_048[arg3]) * -10.0f); - sp94[0] = 0; - sp94[1] = player->unk_048[arg3]; - sp94[2] = 0; - func_800652D4(sp9C, sp94, player->unk_258[20 + arg4].unk_00C * player->size); - gSPDisplayList(gDisplayListHead++, (Gfx*)0x0D008C90); - gDPLoadTLUT_pal256(gDisplayListHead++, (Gfx*)0x800E52D0); - gDPSetTextureLUT(gDisplayListHead++, G_TT_RGBA16); - gDPLoadTextureBlock(gDisplayListHead++, (Gfx*)0x8018D4B4, G_IM_FMT_CI, G_IM_SIZ_8b, 64, 32, 0, - G_TX_NOMIRROR | G_TX_CLAMP, G_TX_NOMIRROR | G_TX_CLAMP, G_TX_NOMASK, G_TX_NOMASK, - G_TX_NOLOD, G_TX_NOLOD); - gSPVertex(gDisplayListHead++, (Gfx*)0x800E8880, 4, 0); - gSPDisplayList(gDisplayListHead++, (Gfx*)0xd008c78); - gDPLoadTextureBlock(gDisplayListHead++, (Gfx*)0x8018D4B8, G_IM_FMT_CI, G_IM_SIZ_8b, 64, 32, 0, - G_TX_NOMIRROR | G_TX_CLAMP, G_TX_NOMIRROR | G_TX_CLAMP, G_TX_NOMASK, G_TX_NOMASK, - G_TX_NOLOD, G_TX_NOLOD); - gSPVertex(gDisplayListHead++, (Gfx*)0x800E88C0, 4, 0); - gSPDisplayList(gDisplayListHead++, (Gfx*)0x0D008DA0); - gDPSetTextureLUT(gDisplayListHead++, G_TT_NONE); - gMatrixEffectCount += 1; - } -} -#endif \ No newline at end of file diff --git a/patches/audio.c b/patches/audio.c deleted file mode 100644 index a53f429..0000000 --- a/patches/audio.c +++ /dev/null @@ -1,30 +0,0 @@ -#include "patches.h" -#include "sound.h" - -void func_800C36C4(u8 arg0, u8 arg1, u8 arg2, u8 arg3); -void func_800C8F44(u8); - -#if 1 -RECOMP_PATCH void func_800029B0(void) { - switch (D_800DC5A8) { - case 0: - // func_800C8F44(127); - recomp_set_bgm_volume_100(); - break; - case 1: - // func_800C8F44(75); - recomp_set_bgm_volume_59(); - break; - case 2: - // func_800C8F44(0); - recomp_set_bgm_volume_0(); - break; - } -} -#endif - -void audio_set_volume(void) { - func_800C36C4(SEQ_PLAYER_LEVEL, 0, recomp_get_bgm_volume() * 127, 1); - func_800C36C4(SEQ_PLAYER_ENV, 0, recomp_get_env_volume() * 127, 1); - func_800C36C4(SEQ_PLAYER_SFX, 0, recomp_get_sfx_volume() * 127, 1); -} diff --git a/patches/background.c b/patches/background.c deleted file mode 100644 index 9a77841..0000000 --- a/patches/background.c +++ /dev/null @@ -1,117 +0,0 @@ -#include "patches.h" - -// Background Extended for Widescreen -#if 1 - -Mtx D_0D008E98; - -RECOMP_PATCH void func_802A4A0C(Vtx* vtx, struct UnkStruct_800DC5EC* arg1, UNUSED s32 arg2, UNUSED s32 arg3, - UNUSED f32* arg4) { - float aspect = recomp_get_aspect_ratio(0.0f); - u32 margin = 0; - - if (aspect < (4.0f / 3.0f)) { - aspect = (4.0f / 3.0f); - } - - { - // 4:3 baseline - float baseAspect = 1.33133334f; - float scaleX = aspect / baseAspect; - float translateX = (1.0f - scaleX) * 160.0f; - - // Build your matrix at runtime - D_0D008E98 = (Mtx){ toFixedPointMatrix(scaleX, 0.0f, 0.0f, 0.0f, // X scale - 0.0f, 1.0f, 0.0f, 0.0f, // Y scale = 1.0 - 0.0f, 0.0f, 1.0f, 0.0f, // Z scale = 1.0 - translateX, 0.0f, 0.0f, 1.0f // Shift left/right - ) }; - } - - { - Camera* camera = arg1->camera; - s16 temp_t5; - f32 temp_f0; - u16 sp128; - Mat4 matrix1, matrix2, matrix3; - Vec3f sp5C = { 0.0f, 0.0f, 30000.0f }; - f32 sp58; - - course_set_skybox_colours(vtx); - func_802B5564(matrix1, &sp128, camera->unk_B4, gScreenAspect, gCourseNearPersp, gCourseFarPersp, 1.0f); - func_802B5794(matrix2, camera->pos, camera->lookAt); - mtxf_multiplication(matrix3, matrix1, matrix2); - - sp58 = (matrix3[0][3] * sp5C[0] + matrix3[1][3] * sp5C[1] + matrix3[2][3] * sp5C[2]) + matrix3[3][3]; - mtxf_translate_vec3f_mat4(sp5C, matrix3); - - temp_f0 = 1.0f / sp58; - sp5C[0] *= temp_f0 * 160.0f; - sp5C[1] *= temp_f0 * 120.0f; - - temp_t5 = 120 - (s16) sp5C[1]; - arg1->cameraHeight = temp_t5; - - vtx[1].v.ob[1] = vtx[2].v.ob[1] = vtx[4].v.ob[1] = vtx[7].v.ob[1] = temp_t5; - - init_rdp(); - gDPSetRenderMode(gDisplayListHead++, G_RM_OPA_SURF, G_RM_OPA_SURF2); - gSPClearGeometryMode(gDisplayListHead++, G_ZBUFFER | G_LIGHTING); - - // gDPSetScissor(gDisplayListHead++, G_SC_NON_INTERLACE, - // 0, // left - // 0, // top - // SCREEN_WIDTH, // right 320 - // SCREEN_HEIGHT // bottom 240 - //); - - gDPSetScissor(gDisplayListHead++, G_SC_NON_INTERLACE, 0 + margin, 0 + margin, SCREEN_WIDTH - margin, - SCREEN_HEIGHT - margin); - guOrtho(&gGfxPool->mtxScreen, 0.0f, SCREEN_WIDTH, 0.0f, SCREEN_HEIGHT, 0.0f, 5.0f, 1.0f); - gSPPerspNormalize(gDisplayListHead++, 0xFFFF); - - gSPMatrix(gDisplayListHead++, VIRTUAL_TO_PHYSICAL(&gGfxPool->mtxScreen), - G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_PROJECTION); - gSPMatrix(gDisplayListHead++, VIRTUAL_TO_PHYSICAL(&D_0D008E98), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); - - // Top half - gSPVertex(gDisplayListHead++, &vtx[0], 4, 0); - gSP2Triangles(gDisplayListHead++, 0, 3, 1, 0, 1, 3, 2, 0); - - // Bottom half - gSPVertex(gDisplayListHead++, &vtx[4], 4, 0); - gSP2Triangles(gDisplayListHead++, 0, 3, 1, 0, 1, 3, 2, 0); - } -} -#endif - -#include "patches.h" - -// clouds -#if 1 -RECOMP_PATCH void func_800788F8(s32 objectIndex, u16 rot, Camera* camera) { - s16 cameraRot; - // Adjustable culling factor - const float cullingFactor = recomp_get_aspect_ratio(0.0f); - - // Calculate object's rotation relative to the camera - cameraRot = camera->rot[1] + rot; - - // Adjust bounds based on the culling factor - s16 adjustedLowerBound = (s16) (D_8018D210 * cullingFactor); - s16 adjustedUpperBound = (s16) (D_8018D208 * cullingFactor); - - // Check if the object is within the adjusted bounds - if ((cameraRot >= adjustedLowerBound) && (adjustedUpperBound >= cameraRot)) { - // Calculate and update the object's position - gObjectList[objectIndex].unk_09C = (D_8018D218 + (D_8018D1E8 * cameraRot)); - - // Mark the object as visible - set_object_flag_status_true(objectIndex, 0x10); - } else { - // If outside the bounds, mark the object as not visible - set_object_flag_status_false(objectIndex, 0x10); - } -} -#endif - diff --git a/patches/camera.c b/patches/camera.c deleted file mode 100644 index 5cf24ac..0000000 --- a/patches/camera.c +++ /dev/null @@ -1,1142 +0,0 @@ -#include "patches.h" - -f32 func_802AAB4C(Player*); - -#if 1 // GLOBAL - -// Draws the map -#if 0 -extern Gfx* sherbet_land_dls_2[]; - -RECOMP_PATCH void func_8029122C(struct UnkStruct_800DC5EC* arg0, s32 playerId) { - UNUSED s32 pad; - Player* player = arg0->player; - Mat4 matrix; - Vec3f vector; - u16 pathCounter; - u16 cameraRot; - s16 playerDirection; -return; - init_rdp(); - pathCounter = (u16) arg0->pathCounter; - cameraRot = (u16) arg0->camera->rot[1]; - playerDirection = arg0->playerDirection; - - gEXMatrixGroupSimple(gDisplayListHead++, 0xFFFFAAAA, G_EX_NOPUSH, G_MTX_PROJECTION, - G_EX_COMPONENT_SKIP, G_EX_COMPONENT_SKIP, G_EX_COMPONENT_SKIP, G_EX_COMPONENT_SKIP, G_EX_COMPONENT_INTERPOLATE, G_EX_ORDER_LINEAR, G_EX_EDIT_NONE); - - switch (playerId) { - case PLAYER_ONE: - gSPMatrix(gDisplayListHead++, VIRTUAL_TO_PHYSICAL(&gGfxPool->mtxPersp[PLAYER_ONE]), - G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_PROJECTION); - gSPMatrix(gDisplayListHead++, VIRTUAL_TO_PHYSICAL(&gGfxPool->mtxLookAt[PLAYER_ONE]), - G_MTX_NOPUSH | G_MTX_MUL | G_MTX_PROJECTION); - break; - case PLAYER_TWO: - gSPMatrix(gDisplayListHead++, VIRTUAL_TO_PHYSICAL(&gGfxPool->mtxPersp[PLAYER_TWO]), - G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_PROJECTION); - gSPMatrix(gDisplayListHead++, VIRTUAL_TO_PHYSICAL(&gGfxPool->mtxLookAt[PLAYER_TWO]), - G_MTX_NOPUSH | G_MTX_MUL | G_MTX_PROJECTION); - break; - case PLAYER_THREE: - gSPMatrix(gDisplayListHead++, VIRTUAL_TO_PHYSICAL(&gGfxPool->mtxPersp[PLAYER_THREE]), - G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_PROJECTION); - gSPMatrix(gDisplayListHead++, VIRTUAL_TO_PHYSICAL(&gGfxPool->mtxLookAt[PLAYER_THREE]), - G_MTX_NOPUSH | G_MTX_MUL | G_MTX_PROJECTION); - break; - case PLAYER_FOUR: - gSPMatrix(gDisplayListHead++, VIRTUAL_TO_PHYSICAL(&gGfxPool->mtxPersp[PLAYER_FOUR]), - G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_PROJECTION); - gSPMatrix(gDisplayListHead++, VIRTUAL_TO_PHYSICAL(&gGfxPool->mtxLookAt[PLAYER_FOUR]), - G_MTX_NOPUSH | G_MTX_MUL | G_MTX_PROJECTION); - break; - } - mtxf_identity(matrix); - render_set_position(matrix, 0); - switch (gCurrentCourseId) { - case COURSE_BOWSER_CASTLE: - if (gActiveScreenMode != SCREEN_MODE_1P) { - return; - } - if (pathCounter < 6) { - return; - } - if (pathCounter > 9) { - return; - } - if (pathCounter == 9) { - if (cameraRot < 0xA000) { - return; - } - if (cameraRot > 0xE000) { - return; - } - } - gSPDisplayList(gDisplayListHead++, (Gfx*) 0x06009228 /* d_course_bowsers_castle_dl_9228*/); - break; - case COURSE_BANSHEE_BOARDWALK: - gDPPipeSync(gDisplayListHead++); - gSPTexture(gDisplayListHead++, 0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON); - gSPClearGeometryMode(gDisplayListHead++, G_LIGHTING); - gDPSetRenderMode(gDisplayListHead++, G_RM_AA_ZB_XLU_INTER, G_RM_NOOP2); - gDPSetBlendMask(gDisplayListHead++, 0xFF); - gDPSetCombineMode(gDisplayListHead++, G_CC_MODULATEIA, G_CC_MODULATEIA); - // d_course_banshee_boardwalk_packed_dl_878 - gSPDisplayList(gDisplayListHead++, (Gfx*) 0x07000878); - gDPSetAlphaCompare(gDisplayListHead++, G_AC_NONE); - gDPPipeSync(gDisplayListHead++); - break; - case COURSE_KOOPA_BEACH: - - gDPPipeSync(gDisplayListHead++); - gSPTexture(gDisplayListHead++, 0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON); - gSPClearGeometryMode(gDisplayListHead++, G_LIGHTING); - gDPSetRenderMode(gDisplayListHead++, G_RM_AA_ZB_XLU_INTER, G_RM_NOOP2); - gDPSetBlendMask(gDisplayListHead++, 0xFF); - gDPSetCombineMode(gDisplayListHead++, G_CC_MODULATEIA, G_CC_MODULATEIA); - - switch (pathCounter) { - case 22: - case 23: - case 29: - case 30: - case 31: - case 37: - gSPClearGeometryMode(gDisplayListHead++, G_CULL_BACK); - // d_course_koopa_troopa_beach_packed_dl_9E70 - gSPDisplayList(gDisplayListHead++, (Gfx*) 0x07009E70); - gSPSetGeometryMode(gDisplayListHead++, G_CULL_BACK); - break; - } - vector[0] = 0.0f; - vector[1] = D_8015F8E4; - vector[2] = 0.0f; - mtxf_translate(matrix, vector); - render_set_position(matrix, 0); - - gDPSetRenderMode(gDisplayListHead++, G_RM_AA_ZB_XLU_INTER, G_RM_NOOP2); - gDPSetBlendMask(gDisplayListHead++, 0xFF); - gDPSetCombineMode(gDisplayListHead++, G_CC_MODULATEIA, G_CC_MODULATEIA); - gSPClearGeometryMode(gDisplayListHead++, G_CULL_BACK); - render_course_segments((u32) 0x06019578 /* d_course_koopa_troopa_beach_dl_list2*/, arg0); - gSPTexture(gDisplayListHead++, 0xFFFF, 0xFFFF, 1, 1, G_OFF); - gSPSetGeometryMode(gDisplayListHead++, G_CULL_BACK); - gDPSetAlphaCompare(gDisplayListHead++, G_AC_NONE); - gDPPipeSync(gDisplayListHead++); - break; - case COURSE_SHERBET_LAND: - - gDPPipeSync(gDisplayListHead++); - gSPClearGeometryMode(gDisplayListHead++, G_LIGHTING); - gSPTexture(gDisplayListHead++, 0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON); - gDPSetBlendMask(gDisplayListHead++, 0xFF); - gDPSetCombineMode(gDisplayListHead++, G_CC_MODULATEIA, G_CC_MODULATEIA); - gDPSetTextureFilter(gDisplayListHead++, G_TF_BILERP); - gDPSetTexturePersp(gDisplayListHead++, G_TP_PERSP); - - mtxf_identity(matrix); - render_set_position(matrix, 0); - render_course_segments((uintptr_t) sherbet_land_dls_2, arg0); - - gDPSetAlphaCompare(gDisplayListHead++, G_AC_NONE); - if ((func_80290C20(arg0->camera) == 1) && (func_802AAB4C(player) < player->pos[1])) { - gSPSetGeometryMode(gDisplayListHead++, G_ZBUFFER); - gDPSetCombineMode(gDisplayListHead++, G_CC_SHADE, G_CC_SHADE); - gDPSetRenderMode(gDisplayListHead++, G_RM_AA_ZB_OPA_SURF, G_RM_AA_ZB_OPA_SURF2); - // d_course_sherbet_land_packed_dl_2B48 - gSPDisplayList(gDisplayListHead++, (Gfx*) 0x07002B48); - } - gDPPipeSync(gDisplayListHead++); - break; - case COURSE_RAINBOW_ROAD: - gDPPipeSync(gDisplayListHead++); - mtxf_identity(matrix); - render_set_position(matrix, 0); - gSPClearGeometryMode(gDisplayListHead++, G_CULL_BACK); - render_course_segments((uintptr_t) 0x060164b8, arg0); - gSPSetGeometryMode(gDisplayListHead++, G_CULL_BACK); - gDPSetAlphaCompare(gDisplayListHead++, G_AC_NONE); - gDPPipeSync(gDisplayListHead++); - break; - case COURSE_WARIO_STADIUM: - gDPPipeSync(gDisplayListHead++); - gSPTexture(gDisplayListHead++, 0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON); - gSPClearGeometryMode(gDisplayListHead++, G_LIGHTING); - gDPSetRenderMode(gDisplayListHead++, G_RM_AA_ZB_XLU_INTER, G_RM_NOOP2); - gDPSetBlendMask(gDisplayListHead++, 0xFF); - gDPSetCombineMode(gDisplayListHead++, G_CC_MODULATEIA, G_CC_MODULATEIA); - gDPSetTextureFilter(gDisplayListHead++, G_TF_BILERP); - gDPSetTexturePersp(gDisplayListHead++, G_TP_PERSP); - - mtxf_identity(matrix); - render_set_position(matrix, 0); - - gSPClearGeometryMode(gDisplayListHead++, G_CULL_BACK); - gDPSetCombineMode(gDisplayListHead++, G_CC_MODULATEIDECALA, G_CC_MODULATEIDECALA); - gDPSetRenderMode(gDisplayListHead++, G_RM_AA_ZB_XLU_SURF, G_RM_AA_ZB_XLU_SURF2); - gDPSetPrimColor(gDisplayListHead++, 0, 0, 0xFF, 0xFF, 0x00, 0xFF); - // d_course_wario_stadium_packed_dl_EC0 - gSPDisplayList(gDisplayListHead++, (Gfx*) 0x07000EC0); - gSPTexture(gDisplayListHead++, 0xFFFF, 0xFFFF, 1, 1, G_OFF); - gSPSetGeometryMode(gDisplayListHead++, G_CULL_BACK); - gDPSetAlphaCompare(gDisplayListHead++, G_AC_NONE); - gDPPipeSync(gDisplayListHead++); - break; - case COURSE_DK_JUNGLE: - gDPPipeSync(gDisplayListHead++); - gSPClearGeometryMode(gDisplayListHead++, G_LIGHTING); - gSPTexture(gDisplayListHead++, 0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON); - gDPSetBlendMask(gDisplayListHead++, 0xFF); - gDPSetTextureFilter(gDisplayListHead++, G_TF_BILERP); - gDPSetTexturePersp(gDisplayListHead++, G_TP_PERSP); - - mtxf_identity(matrix); - render_set_position(matrix, 0); - - gDPSetCombineMode(gDisplayListHead++, G_CC_MODULATEIA, G_CC_MODULATEIA); - gDPSetRenderMode(gDisplayListHead++, G_RM_AA_ZB_XLU_INTER, G_RM_NOOP2); - - if (pathCounter < 17) { - gDPSetCombineMode(gDisplayListHead++, G_CC_MODULATEIA, G_CC_MODULATEIA); - // d_course_dks_jungle_parkway_packed_dl_3E40 - gSPDisplayList(gDisplayListHead++, (Gfx*) 0x07003E40); - // d_course_dks_jungle_parkway_packed_dl_3EB0 - gSPDisplayList(gDisplayListHead++, (Gfx*) 0x07003EB0); - if ((pathCounter >= 6) && (pathCounter < 13)) { - gDPSetCombineMode(gDisplayListHead++, G_CC_MODULATEIA, G_CC_MODULATEIA); - // d_course_dks_jungle_parkway_packed_dl_3DD0 - gSPDisplayList(gDisplayListHead++, (Gfx*) 0x07003DD0); - } - } else if ((pathCounter == 21) || (pathCounter == 22)) { - if (playerDirection == 3) { - gDPSetCombineMode(gDisplayListHead++, G_CC_MODULATEIDECALA, G_CC_MODULATEIDECALA); - // d_course_dks_jungle_parkway_packed_dl_36A8 - gSPDisplayList(gDisplayListHead++, (Gfx*) 0x070036A8); - } - if ((playerDirection == 1) || (playerDirection == 0)) { - gDPSetCombineMode(gDisplayListHead++, G_CC_MODULATEIDECALA, G_CC_MODULATEIDECALA); - // d_course_dks_jungle_parkway_packed_dl_36A8 - gSPDisplayList(gDisplayListHead++, (Gfx*) 0x070036A8); - } else { - gDPSetCombineMode(gDisplayListHead++, G_CC_MODULATEIA, G_CC_MODULATEIA); - // d_course_dks_jungle_parkway_packed_dl_3F30 - gSPDisplayList(gDisplayListHead++, (Gfx*) 0x07003F30); - // d_course_dks_jungle_parkway_packed_dl_36A8 - gSPDisplayList(gDisplayListHead++, (Gfx*) 0x070036A8); - } - } else if (pathCounter == 24) { - if ((playerDirection == 0) || (playerDirection == 3)) { - gDPSetCombineMode(gDisplayListHead++, G_CC_MODULATEIDECALA, G_CC_MODULATEIDECALA); - // d_course_dks_jungle_parkway_packed_dl_36A8 - gSPDisplayList(gDisplayListHead++, (Gfx*) 0x070036A8); - } - } else if (pathCounter == 23) { - if (playerDirection == 3) { - gDPSetCombineMode(gDisplayListHead++, G_CC_MODULATEIDECALA, G_CC_MODULATEIDECALA); - // d_course_dks_jungle_parkway_packed_dl_36A8 - gSPDisplayList(gDisplayListHead++, (Gfx*) 0x070036A8); - } else if (playerDirection == 0) { - gDPSetCombineMode(gDisplayListHead++, G_CC_MODULATEIDECALA, G_CC_MODULATEIDECALA); - // d_course_dks_jungle_parkway_packed_dl_36A8 - gSPDisplayList(gDisplayListHead++, (Gfx*) 0x070036A8); - } - } - gDPSetCombineMode(gDisplayListHead++, G_CC_MODULATEIA, G_CC_MODULATEIA); - switch (pathCounter) { - case 5: - if (playerDirection != 3) { - // d_course_dks_jungle_parkway_packed_dl_3DD0 - gSPDisplayList(gDisplayListHead++, (Gfx*) 0x07003DD0); - } - break; - case 17: - switch (playerDirection) { - case 0: - // d_course_dks_jungle_parkway_packed_dl_3E40 - gSPDisplayList(gDisplayListHead++, (Gfx*) 0x07003E40); - // d_course_dks_jungle_parkway_packed_dl_3EB0 - gSPDisplayList(gDisplayListHead++, (Gfx*) 0x07003EB0); - break; - case 1: - // d_course_dks_jungle_parkway_packed_dl_3DD0 - gSPDisplayList(gDisplayListHead++, (Gfx*) 0x07003DD0); - // d_course_dks_jungle_parkway_packed_dl_3E40 - gSPDisplayList(gDisplayListHead++, (Gfx*) 0x07003E40); - // d_course_dks_jungle_parkway_packed_dl_3EB0 - gSPDisplayList(gDisplayListHead++, (Gfx*) 0x07003EB0); - break; - case 2: - // d_course_dks_jungle_parkway_packed_dl_ - gSPDisplayList(gDisplayListHead++, (Gfx*) 0x07003E40); - // d_course_dks_jungle_parkway_packed_dl_3EB0 - gSPDisplayList(gDisplayListHead++, (Gfx*) 0x07003EB0); - // d_course_dks_jungle_parkway_packed_dl_3F30 - gSPDisplayList(gDisplayListHead++, (Gfx*) 0x07003F30); - break; - case 3: - // d_course_dks_jungle_parkway_packed_dl_3EB0 - gSPDisplayList(gDisplayListHead++, (Gfx*) 0x07003EB0); - // d_course_dks_jungle_parkway_packed_dl_3F30 - gSPDisplayList(gDisplayListHead++, (Gfx*) 0x07003F30); - break; - } - break; - case 18: - switch (playerDirection) { - case 0: - // d_course_dks_jungle_parkway_packed_dl_3E40 - gSPDisplayList(gDisplayListHead++, (Gfx*) 0x07003E40); - // d_course_dks_jungle_parkway_packed_dl_3EB0 - gSPDisplayList(gDisplayListHead++, (Gfx*) 0x07003EB0); - break; - case 1: - // d_course_dks_jungle_parkway_packed_dl_3DD0 - gSPDisplayList(gDisplayListHead++, (Gfx*) 0x07003DD0); - // d_course_dks_jungle_parkway_packed_dl_3E40 - gSPDisplayList(gDisplayListHead++, (Gfx*) 0x07003E40); - // d_course_dks_jungle_parkway_packed_dl_3EB0 - gSPDisplayList(gDisplayListHead++, (Gfx*) 0x07003EB0); - break; - case 2: - // d_course_dks_jungle_parkway_packed_dl_3E40 - gSPDisplayList(gDisplayListHead++, (Gfx*) 0x07003E40); - // d_course_dks_jungle_parkway_packed_dl_3EB0 - gSPDisplayList(gDisplayListHead++, (Gfx*) 0x07003EB0); - break; - } - break; - case 21: - if ((playerDirection == 0) || (playerDirection == 1)) { - // d_course_dks_jungle_parkway_packed_dl_3E40 - gSPDisplayList(gDisplayListHead++, (Gfx*) 0x07003E40); - // d_course_dks_jungle_parkway_packed_dl_3EB0 - gSPDisplayList(gDisplayListHead++, (Gfx*) 0x07003EB0); - // d_course_dks_jungle_parkway_packed_dl_3F30 - gSPDisplayList(gDisplayListHead++, (Gfx*) 0x07003F30); - } else { - // d_course_dks_jungle_parkway_packed_dl_3EB0 - gSPDisplayList(gDisplayListHead++, (Gfx*) 0x07003EB0); - } - break; - case 22: - if (playerDirection == 0) { - // d_course_dks_jungle_parkway_packed_dl_3F30 - gSPDisplayList(gDisplayListHead++, (Gfx*) 0x07003F30); - } - break; - case 23: - if (playerDirection != 1) { - // d_course_dks_jungle_parkway_packed_dl_3F30 - gSPDisplayList(gDisplayListHead++, (Gfx*) 0x07003F30); - } - break; - } - gSPTexture(gDisplayListHead++, 0xFFFF, 0xFFFF, 1, 1, G_OFF); - gDPSetAlphaCompare(gDisplayListHead++, G_AC_NONE); - gDPPipeSync(gDisplayListHead++); - break; - } -} -#endif - -void* memcpy2(void* dest, const void* src, size_t size) { - unsigned char* su1 = (unsigned char*) dest; - const unsigned char* su2 = (const unsigned char*) src; - - while (size > 0) { - *su1 = *su2; - su1++; - su2++; - size--; - } - - return dest; -} - -void Math_Vec3f_Sum(Vec3f l, Vec3f r, Vec3f dest) { - dest[0] = l[0] + r[0]; - dest[1] = l[1] + r[1]; - dest[2] = l[2] + r[2]; -} - -void Math_Vec3f_Diff(Vec3f l, Vec3f r, Vec3f dest) { - dest[0] = l[0] - r[0]; - dest[1] = l[1] - r[1]; - dest[2] = l[2] - r[2]; -} - -#define SQXYZ(vec) ((vec[0]) * (vec[0]) + (vec[1]) * (vec[1]) + (vec[2]) * (vec[2])) - -f32 Math_Vec3f_DistXYZ(Vec3f a, Vec3f b) { - Vec3f diff; - Math_Vec3f_Diff(b, a, diff); - return sqrtf(SQXYZ(diff)); -} - -typedef struct CameraProps { - Vec3f prev_eye; - Vec3f prev_at; - Vec3f eye_velocity; - Vec3f at_velocity; -} CameraProps; - -static CameraProps gMultiCamera[4]; - -bool should_interpolate_perspective(Vec3f eye, Vec3f at, int cameraId) { - (void) gMultiCamera[cameraId].prev_eye; - (void) gMultiCamera[cameraId].prev_at; - (void) gMultiCamera[cameraId].eye_velocity; - (void) gMultiCamera[cameraId].at_velocity; - - Vec3f predicted_eye; - Vec3f predicted_at; - // Predict the new eye and at positions based on the previous velocity and positions. - Math_Vec3f_Sum(gMultiCamera[cameraId].prev_eye, gMultiCamera[cameraId].eye_velocity, predicted_eye); - Math_Vec3f_Sum(gMultiCamera[cameraId].prev_at, gMultiCamera[cameraId].at_velocity, predicted_at); - - // Calculate the current velocities from the previous and current positions. - Math_Vec3f_Diff(eye, gMultiCamera[cameraId].prev_eye, gMultiCamera[cameraId].eye_velocity); - Math_Vec3f_Diff(at, gMultiCamera[cameraId].prev_at, gMultiCamera[cameraId].at_velocity); - - // Compare the predicted positions to the real positions. - float eye_dist = Math_Vec3f_DistXYZ(predicted_eye, eye); - float at_dist = Math_Vec3f_DistXYZ(predicted_at, at); - - // Compare the velocities of the eye and at positions. - float velocity_diff = Math_Vec3f_DistXYZ(gMultiCamera[cameraId].eye_velocity, gMultiCamera[cameraId].at_velocity); - - // Update the tracking for the previous positions with the new ones. - memcpy2(gMultiCamera[cameraId].prev_eye, eye, sizeof(Vec3f)); - memcpy2(gMultiCamera[cameraId].prev_at, at, sizeof(Vec3f)); - - // These numbers are all picked via testing. - - // If the velocity of both positions was the same, then they're moving together and should interpolate. - if (velocity_diff <= 3.0f && eye_dist <= 100.0f && at_dist <= 100.0f) { - // recomp_printf("if (velocity_diff <= 3.0f && eye_dist <= 100.0f && at_dist <= 100.0f) {\n"); - return true; - } - - // If the focus or position are basically the same across frames and the eye didn't move too far then it should - // probably be interpolated. - // if (at_dist <= 10.0f && eye_dist <= 300.0f) { - // return true; - // } - // if (eye_dist <= 10.0f && at_dist <= 300.0f) { - // return true; - // } - - if (velocity_diff > 50.0f || at_dist > 50.0f || eye_dist > 300.0f) { - gMultiCamera[cameraId].eye_velocity[0] = 0.0f; - gMultiCamera[cameraId].eye_velocity[1] = 0.0f; - gMultiCamera[cameraId].eye_velocity[2] = 0.0f; - gMultiCamera[cameraId].at_velocity[0] = 0.0f; - gMultiCamera[cameraId].at_velocity[1] = 0.0f; - gMultiCamera[cameraId].at_velocity[2] = 0.0f; - return false; - } - // recomp_printf("last return true\n"); - return true; -} - -s32 gCamera1Skipped = 0; -s32 gCamera2Skipped = 0; -s32 gCamera3Skipped = 0; -s32 gCamera4Skipped = 0; - -#if 1 -RECOMP_PATCH void render_player_one_1p_screen(void) { - Camera* camera = &cameras[0]; - UNUSED s32 pad[4]; - u16 perspNorm; - UNUSED s32 pad2[2]; -#ifdef VERSION_EU - f32 sp9C; -#endif - UNUSED s32 pad3; - Mat4 matrix; - - // recomp_printf("CAMERA POS X: %f\n", camera->pos[0]); - // recomp_printf("CAMERA POS Y: %f\n", camera->pos[1]); - // recomp_printf("CAMERA POS Z: %f\n\n", camera->pos[2]); - // recomp_printf("CAMERA LOOKAT X: %f\n", camera->pos[0]); - // recomp_printf("CAMERA LOOKAT Y: %f\n", camera->pos[1]); - // recomp_printf("CAMERA LOOKAT Z: %f\n\n", camera->pos[2]); - - bool bigJump = !should_interpolate_perspective(camera->pos, camera->lookAt, 0); - - if (bigJump) { - gEXMatrixGroupSimple(gDisplayListHead++, 0xFFFFAAAA, G_EX_NOPUSH, G_MTX_PROJECTION, G_EX_COMPONENT_SKIP, - G_EX_COMPONENT_SKIP, G_EX_COMPONENT_SKIP, G_EX_COMPONENT_SKIP, G_EX_COMPONENT_INTERPOLATE, - G_EX_ORDER_LINEAR, G_EX_EDIT_NONE); - recomp_printf("CAMERA 1 SKIPED: %d\n", bigJump); - gCamera1Skipped = true; - } else { - gEXMatrixGroupSimple(gDisplayListHead++, 0xFFFFAAAA, G_EX_NOPUSH, G_MTX_PROJECTION, G_EX_COMPONENT_INTERPOLATE, - G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, - G_EX_COMPONENT_INTERPOLATE, G_EX_ORDER_LINEAR, G_EX_EDIT_NONE); - gCamera1Skipped = false; - } - - func_802A53A4(); - init_rdp(); - // func_802A3730(D_800DC5EC); - gSPSetGeometryMode(gDisplayListHead++, G_ZBUFFER | G_SHADE | G_CULL_BACK | G_LIGHTING | G_SHADING_SMOOTH); - gDPSetRenderMode(gDisplayListHead++, G_RM_AA_ZB_OPA_SURF, G_RM_AA_ZB_OPA_SURF2); - - guPerspective(&gGfxPool->mtxPersp[0], &perspNorm, gCameraZoom[0], gScreenAspect, gCourseNearPersp, gCourseFarPersp, - 1.0f); - - gSPPerspNormalize(gDisplayListHead++, perspNorm); - gSPMatrix(gDisplayListHead++, VIRTUAL_TO_PHYSICAL(&gGfxPool->mtxPersp[0]), - G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_PROJECTION); - - guLookAt(&gGfxPool->mtxLookAt[0], camera->pos[0], camera->pos[1], camera->pos[2], camera->lookAt[0], - camera->lookAt[1], camera->lookAt[2], camera->up[0], camera->up[1], camera->up[2]); - if (D_800DC5C8 == 0) { - gSPMatrix(gDisplayListHead++, VIRTUAL_TO_PHYSICAL(&gGfxPool->mtxLookAt[0]), - G_MTX_NOPUSH | G_MTX_MUL | G_MTX_PROJECTION); - mtxf_identity(matrix); - render_set_position(matrix, 0); - } else { - gSPMatrix(gDisplayListHead++, VIRTUAL_TO_PHYSICAL(&gGfxPool->mtxLookAt[0]), - G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); - } - render_course(D_800DC5EC); - if (D_800DC5C8 == 1) { - gSPMatrix(gDisplayListHead++, VIRTUAL_TO_PHYSICAL(&gGfxPool->mtxLookAt[0]), - G_MTX_NOPUSH | G_MTX_MUL | G_MTX_PROJECTION); - mtxf_identity(matrix); - render_set_position(matrix, 0); - } - render_course_actors(D_800DC5EC); - render_object(RENDER_SCREEN_MODE_1P_PLAYER_ONE); - render_players_on_screen_one(); - func_8029122C(D_800DC5EC, PLAYER_ONE); - func_80021B0C(); - render_item_boxes(D_800DC5EC); - render_player_snow_effect(RENDER_SCREEN_MODE_1P_PLAYER_ONE); - func_80058BF4(); - if (D_800DC5B8 != 0) { - func_80058C20(RENDER_SCREEN_MODE_1P_PLAYER_ONE); - } - func_80093A5C(RENDER_SCREEN_MODE_1P_PLAYER_ONE); - if (D_800DC5B8 != 0) { - render_hud(RENDER_SCREEN_MODE_1P_PLAYER_ONE); - } -} -#endif - -#if 1 -RECOMP_PATCH void render_player_one_2p_screen_vertical(void) { - Camera* camera = &cameras[0]; - UNUSED s32 pad[2]; - u16 perspNorm; - Mat4 matrix; - - bool bigJump = !should_interpolate_perspective(camera->pos, camera->lookAt, 0); - - if (bigJump) { - gEXMatrixGroupSimple(gDisplayListHead++, 0xFFFFAAAB, G_EX_NOPUSH, G_MTX_PROJECTION, G_EX_COMPONENT_SKIP, - G_EX_COMPONENT_SKIP, G_EX_COMPONENT_SKIP, G_EX_COMPONENT_SKIP, G_EX_COMPONENT_INTERPOLATE, - G_EX_ORDER_LINEAR, G_EX_EDIT_NONE); - recomp_printf("CAMERA 1 SKIPED: %d\n", bigJump); - gCamera1Skipped = true; - } else { - gEXMatrixGroupSimple(gDisplayListHead++, 0xFFFFAAAB, G_EX_NOPUSH, G_MTX_PROJECTION, G_EX_COMPONENT_INTERPOLATE, - G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, - G_EX_COMPONENT_INTERPOLATE, G_EX_ORDER_LINEAR, G_EX_EDIT_NONE); - gCamera1Skipped = false; - } - - func_802A50EC(); - - init_rdp(); - func_802A3730(D_800DC5EC); - gSPSetGeometryMode(gDisplayListHead++, G_ZBUFFER | G_SHADE | G_CULL_BACK | G_SHADING_SMOOTH); - - guPerspective(&gGfxPool->mtxPersp[0], &perspNorm, gCameraZoom[0], gScreenAspect, gCourseNearPersp, gCourseFarPersp, - 1.0f); - gSPPerspNormalize(gDisplayListHead++, perspNorm); - gSPMatrix(gDisplayListHead++, VIRTUAL_TO_PHYSICAL(&gGfxPool->mtxPersp[0]), - G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_PROJECTION); - guLookAt(&gGfxPool->mtxLookAt[0], camera->pos[0], camera->pos[1], camera->pos[2], camera->lookAt[0], - camera->lookAt[1], camera->lookAt[2], camera->up[0], camera->up[1], camera->up[2]); - - if (D_800DC5C8 == 0) { - - gSPMatrix(gDisplayListHead++, VIRTUAL_TO_PHYSICAL(&gGfxPool->mtxLookAt[0]), - G_MTX_NOPUSH | G_MTX_MUL | G_MTX_PROJECTION); - mtxf_identity(matrix); - render_set_position(matrix, 0); - } else { - gSPMatrix(gDisplayListHead++, VIRTUAL_TO_PHYSICAL(&gGfxPool->mtxLookAt[0]), - G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); - } - render_course(D_800DC5EC); - if (D_800DC5C8 == 1) { - - gSPMatrix(gDisplayListHead++, VIRTUAL_TO_PHYSICAL(&gGfxPool->mtxLookAt[0]), - G_MTX_NOPUSH | G_MTX_MUL | G_MTX_PROJECTION); - - mtxf_identity(matrix); - render_set_position(matrix, 0); - } - render_course_actors(D_800DC5EC); - render_object(RENDER_SCREEN_MODE_2P_HORIZONTAL_PLAYER_ONE); - render_players_on_screen_one(); - func_8029122C(D_800DC5EC, PLAYER_ONE); - func_80021B0C(); - render_item_boxes(D_800DC5EC); - render_player_snow_effect(RENDER_SCREEN_MODE_2P_HORIZONTAL_PLAYER_ONE); - func_80058BF4(); - if (D_800DC5B8 != 0) { - func_80058C20(RENDER_SCREEN_MODE_2P_HORIZONTAL_PLAYER_ONE); - } - func_80093A5C(RENDER_SCREEN_MODE_2P_HORIZONTAL_PLAYER_ONE); - if (D_800DC5B8 != 0) { - render_hud(RENDER_SCREEN_MODE_2P_HORIZONTAL_PLAYER_ONE); - } - D_8015F788 += 1; -} -#endif - -#if 1 -RECOMP_PATCH void render_player_two_2p_screen_vertical(void) { - Camera* camera = &cameras[1]; - UNUSED s32 pad[2]; - u16 perspNorm; - Mat4 matrix; - - bool bigJump = !should_interpolate_perspective(camera->pos, camera->lookAt, 1); - - if (bigJump) { - gEXMatrixGroupSimple(gDisplayListHead++, 0xFFFFAAAC, G_EX_NOPUSH, G_MTX_PROJECTION, G_EX_COMPONENT_SKIP, - G_EX_COMPONENT_SKIP, G_EX_COMPONENT_SKIP, G_EX_COMPONENT_SKIP, G_EX_COMPONENT_INTERPOLATE, - G_EX_ORDER_LINEAR, G_EX_EDIT_NONE); - recomp_printf("CAMERA 2 SKIPED: %d\n", bigJump); - gCamera2Skipped = true; - } else { - gEXMatrixGroupSimple(gDisplayListHead++, 0xFFFFAAAC, G_EX_NOPUSH, G_MTX_PROJECTION, G_EX_COMPONENT_INTERPOLATE, - G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, - G_EX_COMPONENT_INTERPOLATE, G_EX_ORDER_LINEAR, G_EX_EDIT_NONE); - gCamera2Skipped = false; - } - - func_802A5004(); - init_rdp(); - func_802A3730(D_800DC5F0); - - gSPSetGeometryMode(gDisplayListHead++, G_ZBUFFER | G_SHADE | G_CULL_BACK | G_SHADING_SMOOTH); - - guPerspective(&gGfxPool->mtxPersp[1], &perspNorm, gCameraZoom[1], gScreenAspect, gCourseNearPersp, gCourseFarPersp, - 1.0f); - - gSPPerspNormalize(gDisplayListHead++, perspNorm); - gSPMatrix(gDisplayListHead++, VIRTUAL_TO_PHYSICAL(&gGfxPool->mtxPersp[1]), - G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_PROJECTION); - guLookAt(&gGfxPool->mtxLookAt[1], camera->pos[0], camera->pos[1], camera->pos[2], camera->lookAt[0], - camera->lookAt[1], camera->lookAt[2], camera->up[0], camera->up[1], camera->up[2]); - - if (D_800DC5C8 == 0) { - gSPMatrix(gDisplayListHead++, VIRTUAL_TO_PHYSICAL(&gGfxPool->mtxLookAt[1]), - G_MTX_NOPUSH | G_MTX_MUL | G_MTX_PROJECTION); - mtxf_identity(matrix); - render_set_position(matrix, 0); - } else { - gSPMatrix(gDisplayListHead++, VIRTUAL_TO_PHYSICAL(&gGfxPool->mtxLookAt[1]), - G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); - } - render_course(D_800DC5F0); - if (D_800DC5C8 == 1) { - gSPMatrix(gDisplayListHead++, VIRTUAL_TO_PHYSICAL(&gGfxPool->mtxLookAt[1]), - G_MTX_NOPUSH | G_MTX_MUL | G_MTX_PROJECTION); - mtxf_identity(matrix); - render_set_position(matrix, 0); - } - render_course_actors(D_800DC5F0); - render_object(RENDER_SCREEN_MODE_2P_HORIZONTAL_PLAYER_TWO); - render_players_on_screen_two(); - func_8029122C(D_800DC5F0, PLAYER_TWO); - func_80021C78(); - render_item_boxes(D_800DC5F0); - func_80058BF4(); - render_player_snow_effect(RENDER_SCREEN_MODE_2P_HORIZONTAL_PLAYER_TWO); - if (D_800DC5B8 != 0) { - func_80058C20(RENDER_SCREEN_MODE_2P_HORIZONTAL_PLAYER_TWO); - } - func_80093A5C(RENDER_SCREEN_MODE_2P_HORIZONTAL_PLAYER_TWO); - if (D_800DC5B8 != 0) { - render_hud(RENDER_SCREEN_MODE_2P_HORIZONTAL_PLAYER_TWO); - } - D_8015F788 += 1; -} -#endif - -#if 1 -RECOMP_PATCH void render_player_one_2p_screen_horizontal(void) { - Camera* camera = &cameras[0]; - UNUSED s32 pad[2]; - u16 perspNorm; - Mat4 matrix; -#ifdef VERSION_EU - f32 sp9C; -#endif - - bool bigJump = !should_interpolate_perspective(camera->pos, camera->lookAt, 0); - - if (bigJump) { - gEXMatrixGroupSimple(gDisplayListHead++, 0xFFFFAAAD, G_EX_NOPUSH, G_MTX_PROJECTION, G_EX_COMPONENT_SKIP, - G_EX_COMPONENT_SKIP, G_EX_COMPONENT_SKIP, G_EX_COMPONENT_SKIP, G_EX_COMPONENT_INTERPOLATE, - G_EX_ORDER_LINEAR, G_EX_EDIT_NONE); - recomp_printf("CAMERA 1 SKIPED: %d\n", bigJump); - gCamera1Skipped = true; - } else { - gEXMatrixGroupSimple(gDisplayListHead++, 0xFFFFAAAD, G_EX_NOPUSH, G_MTX_PROJECTION, G_EX_COMPONENT_INTERPOLATE, - G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, - G_EX_COMPONENT_INTERPOLATE, G_EX_ORDER_LINEAR, G_EX_EDIT_NONE); - gCamera1Skipped = false; - } - - func_802A51D4(); - gSPSetGeometryMode(gDisplayListHead++, G_SHADE | G_CULL_BACK | G_LIGHTING | G_SHADING_SMOOTH); - init_rdp(); - func_802A3730(D_800DC5EC); -#ifdef VERSION_EU - sp9C = gScreenAspect * 1.2f; -#endif - gSPSetGeometryMode(gDisplayListHead++, G_ZBUFFER | G_SHADE | G_CULL_BACK | G_SHADING_SMOOTH); -#ifdef VERSION_EU - guPerspective(&gGfxPool->mtxPersp[0], &perspNorm, gCameraZoom[0], sp9C, gCourseNearPersp, gCourseFarPersp, 1.0f); -#else - guPerspective(&gGfxPool->mtxPersp[0], &perspNorm, gCameraZoom[0], gScreenAspect, gCourseNearPersp, gCourseFarPersp, - 1.0f); -#endif - gSPPerspNormalize(gDisplayListHead++, perspNorm); - gSPMatrix(gDisplayListHead++, VIRTUAL_TO_PHYSICAL(&gGfxPool->mtxPersp[0]), - G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_PROJECTION); - guLookAt(&gGfxPool->mtxLookAt[0], camera->pos[0], camera->pos[1], camera->pos[2], camera->lookAt[0], - camera->lookAt[1], camera->lookAt[2], camera->up[0], camera->up[1], camera->up[2]); - - if (D_800DC5C8 == 0) { - - gSPMatrix(gDisplayListHead++, VIRTUAL_TO_PHYSICAL(&gGfxPool->mtxLookAt[0]), - G_MTX_NOPUSH | G_MTX_MUL | G_MTX_PROJECTION); - mtxf_identity(matrix); - render_set_position(matrix, 0); - } else { - gSPMatrix(gDisplayListHead++, VIRTUAL_TO_PHYSICAL(&gGfxPool->mtxLookAt[0]), - G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); - } - render_course(D_800DC5EC); - if (D_800DC5C8 == 1) { - gSPMatrix(gDisplayListHead++, VIRTUAL_TO_PHYSICAL(&gGfxPool->mtxLookAt[0]), - G_MTX_NOPUSH | G_MTX_MUL | G_MTX_PROJECTION); - mtxf_identity(matrix); - render_set_position(matrix, 0); - } - render_course_actors(D_800DC5EC); - render_object(RENDER_SCREEN_MODE_2P_VERTICAL_PLAYER_ONE); - render_players_on_screen_one(); - func_8029122C(D_800DC5EC, PLAYER_ONE); - func_80021B0C(); - render_item_boxes(D_800DC5EC); - render_player_snow_effect(RENDER_SCREEN_MODE_2P_VERTICAL_PLAYER_ONE); - func_80058BF4(); - if (D_800DC5B8 != 0) { - func_80058C20(RENDER_SCREEN_MODE_2P_VERTICAL_PLAYER_ONE); - } - func_80093A5C(RENDER_SCREEN_MODE_2P_VERTICAL_PLAYER_ONE); - if (D_800DC5B8 != 0) { - render_hud(RENDER_SCREEN_MODE_2P_VERTICAL_PLAYER_ONE); - } - D_8015F788 += 1; -} -#endif - -#if 1 -RECOMP_PATCH void render_player_two_2p_screen_horizontal(void) { - Camera* camera = &cameras[1]; - UNUSED s32 pad[2]; - u16 perspNorm; - Mat4 matrix; -#ifdef VERSION_EU - f32 sp9C; -#endif - - bool bigJump = !should_interpolate_perspective(camera->pos, camera->lookAt, 1); - - if (bigJump) { - gEXMatrixGroupSimple(gDisplayListHead++, 0xFFFFAAAE, G_EX_NOPUSH, G_MTX_PROJECTION, G_EX_COMPONENT_SKIP, - G_EX_COMPONENT_SKIP, G_EX_COMPONENT_SKIP, G_EX_COMPONENT_SKIP, G_EX_COMPONENT_INTERPOLATE, - G_EX_ORDER_LINEAR, G_EX_EDIT_NONE); - recomp_printf("CAMERA 2 SKIPED: %d\n", bigJump); - gCamera2Skipped = true; - } else { - gEXMatrixGroupSimple(gDisplayListHead++, 0xFFFFAAAE, G_EX_NOPUSH, G_MTX_PROJECTION, G_EX_COMPONENT_INTERPOLATE, - G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, - G_EX_COMPONENT_INTERPOLATE, G_EX_ORDER_LINEAR, G_EX_EDIT_NONE); - gCamera2Skipped = false; - } - - func_802A52BC(); - gSPSetGeometryMode(gDisplayListHead++, G_SHADE | G_CULL_BACK | G_LIGHTING | G_SHADING_SMOOTH); - init_rdp(); - func_802A3730(D_800DC5F0); -#ifdef VERSION_EU - sp9C = gScreenAspect * 1.2f; -#endif - gSPSetGeometryMode(gDisplayListHead++, G_ZBUFFER | G_SHADE | G_CULL_BACK | G_SHADING_SMOOTH); -#ifdef VERSION_EU - guPerspective(&gGfxPool->mtxPersp[1], &perspNorm, gCameraZoom[1], sp9C, gCourseNearPersp, gCourseFarPersp, 1.0f); -#else - guPerspective(&gGfxPool->mtxPersp[1], &perspNorm, gCameraZoom[1], gScreenAspect, gCourseNearPersp, gCourseFarPersp, - 1.0f); -#endif - gSPPerspNormalize(gDisplayListHead++, perspNorm); - gSPMatrix(gDisplayListHead++, VIRTUAL_TO_PHYSICAL(&gGfxPool->mtxPersp[1]), - G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_PROJECTION); - guLookAt(&gGfxPool->mtxLookAt[1], camera->pos[0], camera->pos[1], camera->pos[2], camera->lookAt[0], - camera->lookAt[1], camera->lookAt[2], camera->up[0], camera->up[1], camera->up[2]); - - if (D_800DC5C8 == 0) { - gSPMatrix(gDisplayListHead++, VIRTUAL_TO_PHYSICAL(&gGfxPool->mtxLookAt[1]), - G_MTX_NOPUSH | G_MTX_MUL | G_MTX_PROJECTION); - mtxf_identity(matrix); - render_set_position(matrix, 0); - } else { - gSPMatrix(gDisplayListHead++, VIRTUAL_TO_PHYSICAL(&gGfxPool->mtxLookAt[1]), - G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); - } - render_course(D_800DC5F0); - if (D_800DC5C8 == 1) { - gSPMatrix(gDisplayListHead++, VIRTUAL_TO_PHYSICAL(&gGfxPool->mtxLookAt[1]), - G_MTX_NOPUSH | G_MTX_MUL | G_MTX_PROJECTION); - mtxf_identity(matrix); - render_set_position(matrix, 0); - } - render_course_actors(D_800DC5F0); - render_object(RENDER_SCREEN_MODE_2P_VERTICAL_PLAYER_TWO); - render_players_on_screen_two(); - func_8029122C(D_800DC5F0, PLAYER_TWO); - func_80021C78(); - render_item_boxes(D_800DC5F0); - render_player_snow_effect(RENDER_SCREEN_MODE_2P_VERTICAL_PLAYER_TWO); - func_80058BF4(); - if (D_800DC5B8 != 0) { - func_80058C20(RENDER_SCREEN_MODE_2P_VERTICAL_PLAYER_TWO); - } - func_80093A5C(RENDER_SCREEN_MODE_2P_VERTICAL_PLAYER_TWO); - if (D_800DC5B8 != 0) { - render_hud(RENDER_SCREEN_MODE_2P_VERTICAL_PLAYER_TWO); - } - D_8015F788 += 1; -} -#endif - -#if 1 -RECOMP_PATCH void render_player_one_3p_4p_screen(void) { - Camera* camera = camera1; - UNUSED s32 pad[2]; - u16 perspNorm; - Mat4 matrix; -#ifdef VERSION_EU - f32 sp9C; - sp9C = gScreenAspect * 1.2f; -#endif - - bool bigJump = !should_interpolate_perspective(camera->pos, camera->lookAt, 0); - - if (bigJump) { - gEXMatrixGroupSimple(gDisplayListHead++, 0xFFFFAAAF, G_EX_NOPUSH, G_MTX_PROJECTION, G_EX_COMPONENT_SKIP, - G_EX_COMPONENT_SKIP, G_EX_COMPONENT_SKIP, G_EX_COMPONENT_SKIP, G_EX_COMPONENT_INTERPOLATE, - G_EX_ORDER_LINEAR, G_EX_EDIT_NONE); - recomp_printf("CAMERA 1 SKIPED: %d\n", bigJump); - gCamera1Skipped = true; - } else { - gEXMatrixGroupSimple(gDisplayListHead++, 0xFFFFAAAF, G_EX_NOPUSH, G_MTX_PROJECTION, G_EX_COMPONENT_INTERPOLATE, - G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, - G_EX_COMPONENT_INTERPOLATE, G_EX_ORDER_LINEAR, G_EX_EDIT_NONE); - gCamera1Skipped = false; - } - - func_802A54A8(); - init_rdp(); - func_802A3730(D_800DC5EC); - gSPSetGeometryMode(gDisplayListHead++, G_ZBUFFER | G_SHADE | G_CULL_BACK | G_SHADING_SMOOTH); -#ifdef VERSION_EU - guPerspective(&gGfxPool->mtxPersp[0], &perspNorm, gCameraZoom[0], sp9C, gCourseNearPersp, gCourseFarPersp, 1.0f); -#else - guPerspective(&gGfxPool->mtxPersp[0], &perspNorm, gCameraZoom[0], gScreenAspect, gCourseNearPersp, gCourseFarPersp, - 1.0f); -#endif - gSPPerspNormalize(gDisplayListHead++, perspNorm); - gSPMatrix(gDisplayListHead++, VIRTUAL_TO_PHYSICAL(&gGfxPool->mtxPersp[0]), - G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_PROJECTION); - guLookAt(&gGfxPool->mtxLookAt[0], camera->pos[0], camera->pos[1], camera->pos[2], camera->lookAt[0], - camera->lookAt[1], camera->lookAt[2], camera->up[0], camera->up[1], camera->up[2]); - - if (D_800DC5C8 == 0) { - gSPMatrix(gDisplayListHead++, VIRTUAL_TO_PHYSICAL(&gGfxPool->mtxLookAt[0]), - G_MTX_NOPUSH | G_MTX_MUL | G_MTX_PROJECTION); - mtxf_identity(matrix); - render_set_position(matrix, 0); - } else { - gSPMatrix(gDisplayListHead++, VIRTUAL_TO_PHYSICAL(&gGfxPool->mtxLookAt[0]), - G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); - } - render_course(D_800DC5EC); - if (D_800DC5C8 == 1) { - gSPMatrix(gDisplayListHead++, VIRTUAL_TO_PHYSICAL(&gGfxPool->mtxLookAt[0]), - G_MTX_NOPUSH | G_MTX_MUL | G_MTX_PROJECTION); - mtxf_identity(matrix); - render_set_position(matrix, 0); - } - render_course_actors(D_800DC5EC); - render_object(RENDER_SCREEN_MODE_3P_4P_PLAYER_ONE); - render_players_on_screen_one(); - func_8029122C(D_800DC5EC, PLAYER_ONE); - func_80021B0C(); - render_item_boxes(D_800DC5EC); - render_player_snow_effect(RENDER_SCREEN_MODE_3P_4P_PLAYER_ONE); - func_80058BF4(); - if (D_800DC5B8 != 0) { - func_80058C20(RENDER_SCREEN_MODE_3P_4P_PLAYER_ONE); - } - func_80093A5C(RENDER_SCREEN_MODE_3P_4P_PLAYER_ONE); - if (D_800DC5B8 != 0) { - render_hud(RENDER_SCREEN_MODE_3P_4P_PLAYER_ONE); - } - D_8015F788 += 1; -} -#endif - -#if 1 -RECOMP_PATCH void render_player_two_3p_4p_screen(void) { - Camera* camera = camera2; - UNUSED s32 pad[2]; - u16 perspNorm; - Mat4 matrix; -#ifdef VERSION_EU - f32 sp9C; - sp9C = gScreenAspect * 1.2f; -#endif - - bool bigJump = !should_interpolate_perspective(camera->pos, camera->lookAt, 1); - - if (bigJump) { - gEXMatrixGroupSimple(gDisplayListHead++, 0xFFFFAAB0, G_EX_NOPUSH, G_MTX_PROJECTION, G_EX_COMPONENT_SKIP, - G_EX_COMPONENT_SKIP, G_EX_COMPONENT_SKIP, G_EX_COMPONENT_SKIP, G_EX_COMPONENT_INTERPOLATE, - G_EX_ORDER_LINEAR, G_EX_EDIT_NONE); - recomp_printf("CAMERA 2 SKIPED: %d\n", bigJump); - gCamera2Skipped = true; - } else { - gEXMatrixGroupSimple(gDisplayListHead++, 0xFFFFAAB0, G_EX_NOPUSH, G_MTX_PROJECTION, G_EX_COMPONENT_INTERPOLATE, - G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, - G_EX_COMPONENT_INTERPOLATE, G_EX_ORDER_LINEAR, G_EX_EDIT_NONE); - gCamera2Skipped = false; - } - - func_802A5590(); - init_rdp(); - func_802A3730(D_800DC5F0); - gSPSetGeometryMode(gDisplayListHead++, G_ZBUFFER | G_SHADE | G_CULL_BACK | G_SHADING_SMOOTH); -#ifdef VERSION_EU - guPerspective(&gGfxPool->mtxPersp[1], &perspNorm, gCameraZoom[1], sp9C, gCourseNearPersp, gCourseFarPersp, 1.0f); -#else - guPerspective(&gGfxPool->mtxPersp[1], &perspNorm, gCameraZoom[1], gScreenAspect, gCourseNearPersp, gCourseFarPersp, - 1.0f); -#endif - gSPPerspNormalize(gDisplayListHead++, perspNorm); - gSPMatrix(gDisplayListHead++, VIRTUAL_TO_PHYSICAL(&gGfxPool->mtxPersp[1]), - G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_PROJECTION); - - guLookAt(&gGfxPool->mtxLookAt[1], camera->pos[0], camera->pos[1], camera->pos[2], camera->lookAt[0], - camera->lookAt[1], camera->lookAt[2], camera->up[0], camera->up[1], camera->up[2]); - if (D_800DC5C8 == 0) { - gSPMatrix(gDisplayListHead++, VIRTUAL_TO_PHYSICAL(&gGfxPool->mtxLookAt[1]), - G_MTX_NOPUSH | G_MTX_MUL | G_MTX_PROJECTION); - mtxf_identity(matrix); - render_set_position(matrix, 0); - } else { - gSPMatrix(gDisplayListHead++, VIRTUAL_TO_PHYSICAL(&gGfxPool->mtxLookAt[1]), - G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); - } - render_course(D_800DC5F0); - if (D_800DC5C8 == 1) { - gSPMatrix(gDisplayListHead++, VIRTUAL_TO_PHYSICAL(&gGfxPool->mtxLookAt[1]), - G_MTX_NOPUSH | G_MTX_MUL | G_MTX_PROJECTION); - mtxf_identity(matrix); - render_set_position(matrix, 0); - } - render_course_actors(D_800DC5F0); - render_object(RENDER_SCREEN_MODE_3P_4P_PLAYER_TWO); - render_players_on_screen_two(); - func_8029122C(D_800DC5F0, PLAYER_TWO); - func_80021C78(); - render_item_boxes(D_800DC5F0); - render_player_snow_effect(RENDER_SCREEN_MODE_3P_4P_PLAYER_TWO); - func_80058BF4(); - if (D_800DC5B8 != 0) { - func_80058C20(RENDER_SCREEN_MODE_3P_4P_PLAYER_TWO); - } - func_80093A5C(RENDER_SCREEN_MODE_3P_4P_PLAYER_TWO); - if (D_800DC5B8 != 0) { - render_hud(RENDER_SCREEN_MODE_3P_4P_PLAYER_TWO); - } - D_8015F788 += 1; -} -#endif - -#if 1 -RECOMP_PATCH void render_player_three_3p_4p_screen(void) { - Camera* camera = camera3; - UNUSED s32 pad[2]; - u16 perspNorm; - Mat4 matrix; - - bool bigJump = !should_interpolate_perspective(camera->pos, camera->lookAt, 2); - - if (bigJump) { - gEXMatrixGroupSimple(gDisplayListHead++, 0xFFFFAAB1, G_EX_NOPUSH, G_MTX_PROJECTION, G_EX_COMPONENT_SKIP, - G_EX_COMPONENT_SKIP, G_EX_COMPONENT_SKIP, G_EX_COMPONENT_SKIP, G_EX_COMPONENT_INTERPOLATE, - G_EX_ORDER_LINEAR, G_EX_EDIT_NONE); - recomp_printf("CAMERA 3 SKIPED: %d\n", bigJump); - gCamera3Skipped = true; - } else { - gEXMatrixGroupSimple(gDisplayListHead++, 0xFFFFAAB1, G_EX_NOPUSH, G_MTX_PROJECTION, G_EX_COMPONENT_INTERPOLATE, - G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, - G_EX_COMPONENT_INTERPOLATE, G_EX_ORDER_LINEAR, G_EX_EDIT_NONE); - gCamera3Skipped = false; - } - - func_802A5678(); - init_rdp(); - func_802A3730(D_800DC5F4); - - gSPSetGeometryMode(gDisplayListHead++, G_ZBUFFER | G_SHADE | G_CULL_BACK | G_SHADING_SMOOTH); - - guPerspective(&gGfxPool->mtxPersp[2], &perspNorm, gCameraZoom[2], gScreenAspect, gCourseNearPersp, gCourseFarPersp, - 1.0f); - - gSPPerspNormalize(gDisplayListHead++, perspNorm); - gSPMatrix(gDisplayListHead++, VIRTUAL_TO_PHYSICAL(&gGfxPool->mtxPersp[2]), - G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_PROJECTION); - guLookAt(&gGfxPool->mtxLookAt[2], camera->pos[0], camera->pos[1], camera->pos[2], camera->lookAt[0], - camera->lookAt[1], camera->lookAt[2], camera->up[0], camera->up[1], camera->up[2]); - if (D_800DC5C8 == 0) { - gSPMatrix(gDisplayListHead++, VIRTUAL_TO_PHYSICAL(&gGfxPool->mtxLookAt[2]), - G_MTX_NOPUSH | G_MTX_MUL | G_MTX_PROJECTION); - - mtxf_identity(matrix); - render_set_position(matrix, 0); - } else { - gSPMatrix(gDisplayListHead++, VIRTUAL_TO_PHYSICAL(&gGfxPool->mtxLookAt[2]), - G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); - } - render_course(D_800DC5F4); - if (D_800DC5C8 == 1) { - gSPMatrix(gDisplayListHead++, VIRTUAL_TO_PHYSICAL(&gGfxPool->mtxLookAt[2]), - G_MTX_NOPUSH | G_MTX_MUL | G_MTX_PROJECTION); - mtxf_identity(matrix); - render_set_position(matrix, 0); - } - render_course_actors(D_800DC5F4); - render_object(RENDER_SCREEN_MODE_3P_4P_PLAYER_THREE); - render_players_on_screen_three(); - func_8029122C(D_800DC5F4, PLAYER_THREE); - func_80021D40(); - render_item_boxes(D_800DC5F4); - render_player_snow_effect(RENDER_SCREEN_MODE_3P_4P_PLAYER_THREE); - func_80058BF4(); - if (D_800DC5B8 != 0) { - func_80058C20(RENDER_SCREEN_MODE_3P_4P_PLAYER_THREE); - } - func_80093A5C(RENDER_SCREEN_MODE_3P_4P_PLAYER_THREE); - if (D_800DC5B8 != 0) { - render_hud(RENDER_SCREEN_MODE_3P_4P_PLAYER_THREE); - } - D_8015F788 += 1; -} -#endif - -#if 1 -RECOMP_PATCH void render_player_four_3p_4p_screen(void) { - Camera* camera = camera4; - UNUSED s32 pad[2]; - u16 perspNorm; - Mat4 matrix; - - bool bigJump = !should_interpolate_perspective(camera->pos, camera->lookAt, 3); - - if (bigJump) { - gEXMatrixGroupSimple(gDisplayListHead++, 0xFFFFAAB2, G_EX_NOPUSH, G_MTX_PROJECTION, G_EX_COMPONENT_SKIP, - G_EX_COMPONENT_SKIP, G_EX_COMPONENT_SKIP, G_EX_COMPONENT_SKIP, G_EX_COMPONENT_INTERPOLATE, - G_EX_ORDER_LINEAR, G_EX_EDIT_NONE); - recomp_printf("CAMERA 4 SKIPED: %d\n", bigJump); - gCamera4Skipped = true; - } else { - gEXMatrixGroupSimple(gDisplayListHead++, 0xFFFFAAB2, G_EX_NOPUSH, G_MTX_PROJECTION, G_EX_COMPONENT_INTERPOLATE, - G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, - G_EX_COMPONENT_INTERPOLATE, G_EX_ORDER_LINEAR, G_EX_EDIT_NONE); - gCamera4Skipped = false; - } - - func_802A5760(); - if (gPlayerCountSelection1 == 3) { - func_80093A5C(RENDER_SCREEN_MODE_3P_4P_PLAYER_FOUR); - if (D_800DC5B8 != 0) { - render_hud(RENDER_SCREEN_MODE_3P_4P_PLAYER_FOUR); - } - D_8015F788 += 1; - return; - } - - init_rdp(); - func_802A3730(D_800DC5F8); - - gSPSetGeometryMode(gDisplayListHead++, G_ZBUFFER | G_SHADE | G_CULL_BACK | G_SHADING_SMOOTH); - - guPerspective(&gGfxPool->mtxPersp[3], &perspNorm, gCameraZoom[3], gScreenAspect, gCourseNearPersp, gCourseFarPersp, - 1.0f); - gSPPerspNormalize(gDisplayListHead++, perspNorm); - gSPMatrix(gDisplayListHead++, VIRTUAL_TO_PHYSICAL(&gGfxPool->mtxPersp[3]), - G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_PROJECTION); - guLookAt(&gGfxPool->mtxLookAt[3], camera->pos[0], camera->pos[1], camera->pos[2], camera->lookAt[0], - camera->lookAt[1], camera->lookAt[2], camera->up[0], camera->up[1], camera->up[2]); - if (D_800DC5C8 == 0) { - gSPMatrix(gDisplayListHead++, VIRTUAL_TO_PHYSICAL(&gGfxPool->mtxLookAt[3]), - G_MTX_NOPUSH | G_MTX_MUL | G_MTX_PROJECTION); - mtxf_identity(matrix); - render_set_position(matrix, 0); - } else { - gSPMatrix(gDisplayListHead++, VIRTUAL_TO_PHYSICAL(&gGfxPool->mtxLookAt[3]), - G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); - } - render_course(D_800DC5F8); - if (D_800DC5C8 == 1) { - gSPMatrix(gDisplayListHead++, VIRTUAL_TO_PHYSICAL(&gGfxPool->mtxLookAt[3]), - G_MTX_NOPUSH | G_MTX_MUL | G_MTX_PROJECTION); - mtxf_identity(matrix); - render_set_position(matrix, 0); - } - render_course_actors(D_800DC5F8); - render_object(RENDER_SCREEN_MODE_3P_4P_PLAYER_FOUR); - render_players_on_screen_four(); - func_8029122C(D_800DC5F8, PLAYER_FOUR); - func_80021DA8(); - render_item_boxes(D_800DC5F8); - render_player_snow_effect(RENDER_SCREEN_MODE_3P_4P_PLAYER_FOUR); - func_80058BF4(); - if (D_800DC5B8 != 0) { - func_80058C20(RENDER_SCREEN_MODE_3P_4P_PLAYER_FOUR); - } - func_80093A5C(RENDER_SCREEN_MODE_3P_4P_PLAYER_FOUR); - if (D_800DC5B8 != 0) { - render_hud(RENDER_SCREEN_MODE_3P_4P_PLAYER_FOUR); - } - D_8015F788 += 1; -} -#endif - -#endif // GLOBAL \ No newline at end of file diff --git a/patches/game_fixes.c b/patches/game_fixes.c deleted file mode 100644 index 0b1abee..0000000 --- a/patches/game_fixes.c +++ /dev/null @@ -1,413 +0,0 @@ -#include "patches.h" - -// Fixes a bug with the recompiler. -int dummy_val = 1; - -RECOMP_PATCH void func_8028FC34(void) { - if (D_802BA038 < 0) { - D_802BA038 = 1920; - return; - } - D_802BA038--; - - // @recomp: Change gControllerFive to gControllers[0] to avoid bug where something - // is pressing other controllers in memory. - - // if (gControllerFive->buttonPressed != 0) { - if (gControllers[0].buttonPressed != 0) { - func_8028FBD4(); - gMenuSelection = START_MENU; - return; - } - if (D_802BA038 == 0) { - func_8028FBD4(); - gMenuSelection = LOGO_INTRO_MENU; - } -} - -#if 0 -RECOMP_PATCH void read_controllers(void) { - OSMesg msg; - - // Start reading controller data - osContStartReadData(&gSIEventMesgQueue); - osRecvMesg(&gSIEventMesgQueue, &msg, OS_MESG_BLOCK); - - // Retrieve the controller data - osContGetReadData(gControllerPads); - - // Update each controller individually - update_controller(0); - update_controller(1); - update_controller(2); - update_controller(3); - - // Optionally, clear or reset gControllerFive if it's no longer needed - if (gControllerFive) { - gControllerFive->button = 0; - gControllerFive->buttonPressed = 0; - gControllerFive->buttonDepressed = 0; - gControllerFive->stickDirection = 0; - gControllerFive->stickPressed = 0; - gControllerFive->stickDepressed = 0; - } -} -#endif - -// Fixed tickrate to 2 on all cases -#if 1 -RECOMP_PATCH void race_logic_loop(void) { - s16 i; - u16 rotY; - - gMatrixObjectCount = 0; - gMatrixEffectCount = 0; - if (gIsGamePaused != 0) { - func_80290B14(); - } - if (gIsInQuitToMenuTransition != 0) { - func_802A38B4(); - return; - } - - if (sNumVBlanks >= 6) { - sNumVBlanks = 5; - } - if (sNumVBlanks < 0) { - sNumVBlanks = 1; - } - func_802A4EF4(); - - switch (gActiveScreenMode) { - case SCREEN_MODE_1P: - gTickSpeed = 2; - staff_ghosts_loop(); - if (gIsGamePaused == 0) { - for (i = 0; i < gTickSpeed; i++) { - if (D_8015011E) { - gCourseTimer += COURSE_TIMER_ITER; - } - func_802909F0(); - evaluate_collision_for_players_and_actors(); - func_800382DC(); - func_8001EE98(gPlayerOneCopy, camera1, 0); - func_80028F70(); - func_8028F474(); - func_80059AC8(); - update_course_actors(); - course_update_water(); - func_8028FCBC(); - } - func_80022744(); - } - func_8005A070(); - sNumVBlanks = 0; - profiler_log_thread5_time(1); - D_8015F788 = 0; - render_player_one_1p_screen(); - if (!gEnableDebugMode) { - D_800DC514 = false; - } else { - if (D_800DC514) { - - if ((gControllerOne->buttonPressed & R_TRIG) && (gControllerOne->button & A_BUTTON) && - (gControllerOne->button & B_BUTTON)) { - D_800DC514 = false; - } - - rotY = camera1->rot[1]; - gDebugPathCount = D_800DC5EC->pathCounter; - if (rotY < 0x2000) { - func_80057A50(40, 100, "SOUTH ", gDebugPathCount); - } else if (rotY < 0x6000) { - func_80057A50(40, 100, "EAST ", gDebugPathCount); - } else if (rotY < 0xA000) { - func_80057A50(40, 100, "NORTH ", gDebugPathCount); - } else if (rotY < 0xE000) { - func_80057A50(40, 100, "WEST ", gDebugPathCount); - } else { - func_80057A50(40, 100, "SOUTH ", gDebugPathCount); - } - - } else { - if ((gControllerOne->buttonPressed & L_TRIG) && (gControllerOne->button & A_BUTTON) && - (gControllerOne->button & B_BUTTON)) { - D_800DC514 = true; - } - } - } - break; - - case SCREEN_MODE_2P_SPLITSCREEN_VERTICAL: - if (gCurrentCourseId == COURSE_DK_JUNGLE) { - gTickSpeed = 2; - } else { - gTickSpeed = 2; - } - if (gIsGamePaused == 0) { - for (i = 0; i < gTickSpeed; i++) { - if (D_8015011E != 0) { - gCourseTimer += COURSE_TIMER_ITER; - } - func_802909F0(); - evaluate_collision_for_players_and_actors(); - func_800382DC(); - func_8001EE98(gPlayerOneCopy, camera1, 0); - func_80029060(); - func_8001EE98(gPlayerTwoCopy, camera2, 1); - func_80029150(); - func_8028F474(); - func_80059AC8(); - update_course_actors(); - course_update_water(); - func_8028FCBC(); - } - func_80022744(); - } - func_8005A070(); - profiler_log_thread5_time(1); - sNumVBlanks = 0; - move_segment_table_to_dmem(); - init_rdp(); - if (D_800DC5B0 != 0) { - select_framebuffer(); - } - D_8015F788 = 0; - if (gPlayerWinningIndex == 0) { - render_player_two_2p_screen_vertical(); - render_player_one_2p_screen_vertical(); - } else { - render_player_one_2p_screen_vertical(); - render_player_two_2p_screen_vertical(); - } - break; - - case SCREEN_MODE_2P_SPLITSCREEN_HORIZONTAL: - - if (gCurrentCourseId == COURSE_DK_JUNGLE) { - gTickSpeed = 2; - } else { - gTickSpeed = 2; - } - - if (gIsGamePaused == 0) { - for (i = 0; i < gTickSpeed; i++) { - if (D_8015011E != 0) { - gCourseTimer += COURSE_TIMER_ITER; - } - func_802909F0(); - evaluate_collision_for_players_and_actors(); - func_800382DC(); - func_8001EE98(gPlayerOneCopy, camera1, 0); - func_80029060(); - func_8001EE98(gPlayerTwoCopy, camera2, 1); - func_80029150(); - func_8028F474(); - func_80059AC8(); - update_course_actors(); - course_update_water(); - func_8028FCBC(); - } - func_80022744(); - } - profiler_log_thread5_time(1); - sNumVBlanks = (u16) 0; - func_8005A070(); - move_segment_table_to_dmem(); - init_rdp(); - if (D_800DC5B0 != 0) { - select_framebuffer(); - } - D_8015F788 = 0; - if (gPlayerWinningIndex == 0) { - render_player_two_2p_screen_horizontal(); - render_player_one_2p_screen_horizontal(); - } else { - render_player_one_2p_screen_horizontal(); - render_player_two_2p_screen_horizontal(); - } - - break; - - case SCREEN_MODE_3P_4P_SPLITSCREEN: - if (gPlayerCountSelection1 == 3) { - switch (gCurrentCourseId) { - case COURSE_BOWSER_CASTLE: - case COURSE_MOO_MOO_FARM: - case COURSE_SKYSCRAPER: - case COURSE_DK_JUNGLE: - gTickSpeed = 2; - break; - default: - gTickSpeed = 2; - break; - } - } else { - // Four players - switch (gCurrentCourseId) { - case COURSE_BLOCK_FORT: - case COURSE_DOUBLE_DECK: - case COURSE_BIG_DONUT: - gTickSpeed = 2; - break; - case COURSE_DK_JUNGLE: - gTickSpeed = 2; - break; - default: - gTickSpeed = 2; - break; - } - } - if (gIsGamePaused == 0) { - for (i = 0; i < gTickSpeed; i++) { - if (D_8015011E != 0) { - gCourseTimer += COURSE_TIMER_ITER; - } - func_802909F0(); - evaluate_collision_for_players_and_actors(); - func_800382DC(); - func_8001EE98(gPlayerOneCopy, camera1, 0); - func_80029158(); - func_8001EE98(gPlayerTwo, camera2, 1); - func_800291E8(); - func_8001EE98(gPlayerThree, camera3, 2); - func_800291F0(); - func_8001EE98(gPlayerFour, camera4, 3); - func_800291F8(); - func_8028F474(); - func_80059AC8(); - update_course_actors(); - course_update_water(); - func_8028FCBC(); - } - func_80022744(); - } - func_8005A070(); - sNumVBlanks = 0; - profiler_log_thread5_time(1); - move_segment_table_to_dmem(); - init_rdp(); - if (D_800DC5B0 != 0) { - select_framebuffer(); - } - D_8015F788 = 0; - if (gPlayerWinningIndex == 0) { - render_player_two_3p_4p_screen(); - render_player_three_3p_4p_screen(); - render_player_four_3p_4p_screen(); - render_player_one_3p_4p_screen(); - } else if (gPlayerWinningIndex == 1) { - render_player_one_3p_4p_screen(); - render_player_three_3p_4p_screen(); - render_player_four_3p_4p_screen(); - render_player_two_3p_4p_screen(); - } else if (gPlayerWinningIndex == 2) { - render_player_one_3p_4p_screen(); - render_player_two_3p_4p_screen(); - render_player_four_3p_4p_screen(); - render_player_three_3p_4p_screen(); - } else { - render_player_one_3p_4p_screen(); - render_player_two_3p_4p_screen(); - render_player_three_3p_4p_screen(); - render_player_four_3p_4p_screen(); - } - break; - } - - if (!gEnableDebugMode) { - gEnableResourceMeters = 0; - } else { - if (gEnableResourceMeters) { - resource_display(); - if ((!(gControllerOne->button & L_TRIG)) && (gControllerOne->button & R_TRIG) && - (gControllerOne->buttonPressed & B_BUTTON)) { - gEnableResourceMeters = 0; - } - } else { - if ((!(gControllerOne->button & L_TRIG)) && (gControllerOne->button & R_TRIG) && - (gControllerOne->buttonPressed & B_BUTTON)) { - gEnableResourceMeters = 1; - } - } - } - func_802A4300(); - func_800591B4(); - func_80093E20(); -#if DVDL - display_dvdl(); -#endif - gDPFullSync(gDisplayListHead++); - gSPEndDisplayList(gDisplayListHead++); -} -#endif - -#if 1 -// play_music_for_current_track -RECOMP_PATCH void func_8028EC98(s32 track) { - // @recomp: play music in 3P/4P modes - // if (gScreenModeSelection == SCREEN_MODE_3P_4P_SPLITSCREEN) { - // return; // If 3P/4P splitscreen mode is currently on, don't play the music for the current track. - // } - - func_800029B0(); - - switch (track) { - case COURSE_MARIO_RACEWAY: // Raceways, Wario Stadium - case COURSE_ROYAL_RACEWAY: - case COURSE_LUIGI_RACEWAY: - case COURSE_WARIO_STADIUM: - func_800C8EAC(SEQ_TRACK_RACEWAY); - break; - - case COURSE_TOADS_TURNPIKE: // Toad's Turnpike - func_800C8EAC(SEQ_TRACK_TURNPIKE); - break; - - case COURSE_YOSHI_VALLEY: // Yoshi Valley, Moo Moo Farm - case COURSE_MOO_MOO_FARM: - func_800C8EAC(SEQ_TRACK_FARM); - break; - - case COURSE_CHOCO_MOUNTAIN: // Choco Mountain, Various Battle Stages - case COURSE_BLOCK_FORT: - case COURSE_DOUBLE_DECK: - func_800C8EAC(SEQ_TRACK_MOUNTAIN); - break; - - case COURSE_KALAMARI_DESERT: // Kalimari Desert - func_800C8EAC(SEQ_TRACK_DESERT); - break; - - case COURSE_KOOPA_BEACH: // Koopa Troopa Beach - func_800C8EAC(SEQ_TRACK_BEACH); - break; - - case COURSE_BOWSER_CASTLE: // Bowser Castle - func_800C8EAC(SEQ_TRACK_CASTLE); - break; - - case COURSE_BANSHEE_BOARDWALK: // Banshee Boardwalk - func_800C8EAC(SEQ_TRACK_SCARY); - break; - - case COURSE_FRAPPE_SNOWLAND: // Frappe Snowland, Sherbet Land - case COURSE_SHERBET_LAND: - func_800C8EAC(SEQ_TRACK_SNOW); - break; - - case COURSE_RAINBOW_ROAD: // Rainbow Road - func_800C8EAC(SEQ_TRACK_RAINBOW); - break; - - case COURSE_DK_JUNGLE: // DK's Jungle Parkway - func_800C8EAC(SEQ_TRACK_JUNGLE); - break; - - case COURSE_SKYSCRAPER: // Other Battle Stages - case COURSE_BIG_DONUT: - func_800C8EAC(SEQ_TRACK_BATTLE); - break; - } -} -#endif \ No newline at end of file diff --git a/patches/gfx_config.c b/patches/gfx_config.c deleted file mode 100644 index 2d5e1dd..0000000 --- a/patches/gfx_config.c +++ /dev/null @@ -1,124 +0,0 @@ -#include "patches.h" -#include "sound.h" - -#define GFX_POOL_EXTENDED_SIZE (GFX_POOL_SIZE * 0x10) - -Gfx gfxPoolExtended[2][GFX_POOL_EXTENDED_SIZE]; - -RECOMP_PATCH void config_gfx_pool(void) { - gGfxPool = &gGfxPools[gGlobalTimer & 1]; - set_segment_base_addr(1, gGfxPool); - // gDisplayListHead = gGfxPool->gfxPool; - gDisplayListHead = gfxPoolExtended[gGlobalTimer & 1]; - gEXEnable(gDisplayListHead++); // @recomp - gEXSetRDRAMExtended(gDisplayListHead++, 1); // @recomp - gEXSetRefreshRate(gDisplayListHead++, 60 / 2); - gGfxSPTask = &gGfxPool->spTask; - gEXSetScissor(gDisplayListHead++, G_SC_NON_INTERLACE, G_EX_ORIGIN_LEFT, G_EX_ORIGIN_RIGHT, 0, 0, 0, - SCREEN_HEIGHT); // @recomp - - // TODO: move this to a more appropriate place - audio_set_volume(); -} - -#if 1 -/** - * Initializes the Fast3D OSTask structure. - * Loads F3DEX or F3DLX based on the number of players - **/ -RECOMP_PATCH void create_gfx_task_structure(void) { - gGfxSPTask->msgqueue = &gGfxVblankQueue; - gGfxSPTask->msg = (OSMesg) 2; - gGfxSPTask->task.t.type = M_GFXTASK; - gGfxSPTask->task.t.flags = OS_TASK_DP_WAIT; - gGfxSPTask->task.t.ucode_boot = rspF3DBootStart; - gGfxSPTask->task.t.ucode_boot_size = ((u8*) rspF3DBootEnd - (u8*) rspF3DBootStart); - // The split-screen multiplayer racing state uses F3DLX which has a simple subpixel calculation. - // Singleplayer race mode and all other game states use F3DEX. - // http://n64devkit.square7.ch/n64man/ucode/gspF3DEX.htm - if (gGamestate != RACING || gPlayerCountSelection1 == 1) { - gGfxSPTask->task.t.ucode = gspF3DEXTextStart; - gGfxSPTask->task.t.ucode_data = gspF3DEXDataStart; - } else { - gGfxSPTask->task.t.ucode = gspF3DLXTextStart; - gGfxSPTask->task.t.ucode_data = gspF3DLXDataStart; - } - gGfxSPTask->task.t.flags = 0; - gGfxSPTask->task.t.flags = OS_TASK_DP_WAIT; - gGfxSPTask->task.t.ucode_size = SP_UCODE_SIZE; - gGfxSPTask->task.t.ucode_data_size = SP_UCODE_DATA_SIZE; - gGfxSPTask->task.t.dram_stack = (u64*) &gGfxSPTaskStack; - gGfxSPTask->task.t.dram_stack_size = SP_DRAM_STACK_SIZE8; - gGfxSPTask->task.t.output_buff = (u64*) &gGfxSPTaskOutputBuffer; - gGfxSPTask->task.t.output_buff_size = (u64*) ((u8*) gGfxSPTaskOutputBuffer + sizeof(gGfxSPTaskOutputBuffer)); - // gGfxSPTask->task.t.data_ptr = (u64*) gGfxPool->gfxPool; - gGfxSPTask->task.t.data_ptr = (u64*) gfxPoolExtended[gGlobalTimer & 1]; - // gGfxSPTask->task.t.data_size = (gDisplayListHead - gGfxPool->gfxPool) * sizeof(Gfx); - gGfxSPTask->task.t.data_size = (gDisplayListHead - gfxPoolExtended[gGlobalTimer & 1]) * sizeof(Gfx); - func_8008C214(); - gGfxSPTask->task.t.yield_data_ptr = (u64*) &gGfxSPTaskYieldBuffer; - gGfxSPTask->task.t.yield_data_size = OS_YIELD_DATA_SIZE; - - u32 bytesLeft = (GFX_POOL_EXTENDED_SIZE * 8 - gGfxSPTask->task.t.data_size); - // recomp_printf("bytesLeft: %d\n\n", bytesLeft); - if (bytesLeft < 0) { - // CRASH - recomp_printf("GFXPOOL is full!\n bytesLeft: %x\n\n", bytesLeft); - *(volatile int*) 0 = 0; - } -} -#endif - -#if 0 -RECOMP_PATCH void rendering_init(void) { - gGfxPool = &gGfxPools[0]; - set_segment_base_addr(1, gGfxPool); - gGfxSPTask = &gGfxPool->spTask; - gDisplayListHead = gGfxPool->gfxPool; - init_rcp(); - clear_framebuffer(0); - end_master_display_list(); - exec_display_list(&gGfxPool->spTask); - sRenderingFramebuffer++; - gGlobalTimer++; -} -#endif - -/** - * Inserts matrix into the rsp. Position, rotation and mode of where to render the next object and check number of - * object already render Note that gMatrixObjectCount gets reset at the beginning of the game loop. So no cleanup needs - * to be performed. - */ -#define MTX_OBJECT_POOL_SIZE_EXTENDED (MTX_OBJECT_POOL_SIZE * 10) - -Mtx mtxObjectExtended[2][MTX_OBJECT_POOL_SIZE_EXTENDED]; - -RECOMP_PATCH s32 render_set_position(Mat4 mtx, s32 mode) { - int frameIndex = (int) (gGfxPool - gGfxPools); - - if (gMatrixObjectCount >= MTX_OBJECT_POOL_SIZE * 10) { - recomp_printf("gMatrixObjectCount : %d\n", gMatrixObjectCount); - return 0; - } - - mtxf_to_mtx(&mtxObjectExtended[frameIndex][gMatrixObjectCount], mtx); - switch (mode) { - case 0: - gSPMatrix(gDisplayListHead++, VIRTUAL_TO_PHYSICAL(&mtxObjectExtended[frameIndex][gMatrixObjectCount++]), - G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); - break; - case 1: - gSPMatrix(gDisplayListHead++, VIRTUAL_TO_PHYSICAL(&mtxObjectExtended[frameIndex][gMatrixObjectCount++]), - G_MTX_PUSH | G_MTX_LOAD | G_MTX_MODELVIEW); - break; - case 3: - gSPMatrix(gDisplayListHead++, VIRTUAL_TO_PHYSICAL(&mtxObjectExtended[frameIndex][gMatrixObjectCount++]), - G_MTX_PUSH | G_MTX_MUL | G_MTX_MODELVIEW); - break; - case 2: - gSPMatrix(gDisplayListHead++, VIRTUAL_TO_PHYSICAL(&mtxObjectExtended[frameIndex][gMatrixObjectCount++]), - G_MTX_NOPUSH | G_MTX_MUL | G_MTX_MODELVIEW); - break; - } - return 1; -} diff --git a/patches/hud.c b/patches/hud.c deleted file mode 100644 index ba05873..0000000 --- a/patches/hud.c +++ /dev/null @@ -1,212 +0,0 @@ -#include "patches.h" - -// HUD -#if 1 // lap counter, Timer -RECOMP_PATCH void draw_simplified_lap_count(s32 playerId) { - gEXSetScissor(gDisplayListHead++, G_SC_NON_INTERLACE, G_EX_ORIGIN_LEFT, G_EX_ORIGIN_RIGHT, 0, 0, 0, - SCREEN_HEIGHT); // @recomp - gEXSetRectAlign(gDisplayListHead++, G_EX_ORIGIN_LEFT, G_EX_ORIGIN_LEFT, 0, 0, 0, 0); - draw_hud_2d_texture_32x8((s32) playerHUD[playerId].lapX, playerHUD[playerId].lapY + 3, (u8*) 0x000000000d00a958); - draw_hud_2d_texture_32x16(playerHUD[playerId].lapX + 0x1C, (s32) playerHUD[playerId].lapY, - (u8*) gHudLapTextures[playerHUD[playerId].alsoLapCount]); - gEXSetRectAlign(gDisplayListHead++, G_EX_ORIGIN_NONE, G_EX_ORIGIN_NONE, 0, 0, 0, 0); -} - -RECOMP_PATCH void func_8004EB38(s32 playerId) { - hud_player* temp_s0; - - gEXSetRectAlign(gDisplayListHead++, G_EX_ORIGIN_RIGHT, G_EX_ORIGIN_RIGHT, -(SCREEN_WIDTH) * 4, 0, - -(SCREEN_WIDTH) * 4, 0); // @recomp - - temp_s0 = &playerHUD[playerId]; - - if ((u8) temp_s0->unk_7B != 0) { - func_8004C9D8(temp_s0->lap1CompletionTimeX - 0x13, temp_s0->timerY + 8, 0x00000080, (u8*) 0x000000000d00c158, - 0x00000020, 0x00000010, 0x00000020, 0x00000010); - func_8004F950((s32) temp_s0->lap1CompletionTimeX, (s32) temp_s0->timerY, 0x00000080, (s32) temp_s0->someTimer); - } - - if ((u8) temp_s0->unk_7C != 0) { - func_8004C9D8(temp_s0->lap2CompletionTimeX - 0x13, temp_s0->timerY + 8, 0x00000050, (u8*) 0x000000000d00c158, - 0x00000020, 0x00000010, 0x00000020, 0x00000010); - func_8004F950((s32) temp_s0->lap2CompletionTimeX, (s32) temp_s0->timerY, 0x00000050, (s32) temp_s0->someTimer); - } - - gEXSetRectAlign(gDisplayListHead++, G_EX_ORIGIN_LEFT, G_EX_ORIGIN_LEFT, 0, 0, 0, 0); // @recomp - - if ((u8) temp_s0->unk_7E != 0) { - func_8004C9D8((s32) temp_s0->lapAfterImage1X, temp_s0->lapY + 3, 0x00000080, (u8*) 0x000000000d00a958, - 0x00000020, 8, 0x00000020, 8); - func_8004C9D8(temp_s0->lapAfterImage1X + 0x1C, (s32) temp_s0->lapY, 0x00000080, - (u8*) gHudLapTextures[temp_s0->alsoLapCount], 0x00000020, 0x00000010, 0x00000020, 0x00000010); - } - - if ((u8) temp_s0->unk_7F != 0) { - func_8004C9D8((s32) temp_s0->lapAfterImage2X, temp_s0->lapY + 3, 0x00000050, (u8*) 0x000000000d00a958, - 0x00000020, 8, 0x00000020, 8); - func_8004C9D8(temp_s0->lapAfterImage2X + 0x1C, (s32) temp_s0->lapY, 0x00000050, - (u8*) gHudLapTextures[temp_s0->alsoLapCount], 0x00000020, 0x00000010, 0x00000020, 0x00000010); - } - - gEXSetRectAlign(gDisplayListHead++, G_EX_ORIGIN_NONE, G_EX_ORIGIN_NONE, 0, 0, 0, 0); // @recomp -} -#endif - -// HUD On Screen Timer -#if 1 -RECOMP_PATCH void render_hud_timer(s32 playerId) { - s32 var_s0; - gEXSetScissor(gDisplayListHead++, G_SC_NON_INTERLACE, G_EX_ORIGIN_LEFT, G_EX_ORIGIN_RIGHT, 0, 0, 0, - SCREEN_HEIGHT); // @recomp - gEXSetRectAlign(gDisplayListHead++, G_EX_ORIGIN_RIGHT, G_EX_ORIGIN_RIGHT, -(SCREEN_WIDTH) * 4, 0, - -(SCREEN_WIDTH) * 4, 0); // @recomp - if ((gModeSelection != 2) && (gModeSelection != 3)) { - if (D_8018D320 == playerHUD[playerId].lapCount) { - if (D_8015F890 == 0) { - for (var_s0 = 0; var_s0 < 3; var_s0++) { - if (D_80165658[var_s0] == 0) { - print_timer(playerHUD[playerId].lapCompletionTimeXs[var_s0], - playerHUD[playerId].timerY + (var_s0 * 0x10), - playerHUD[playerId].lapDurations[var_s0]); - } else { - print_timer_rainbow(playerHUD[playerId].lapCompletionTimeXs[var_s0], - playerHUD[playerId].timerY + (var_s0 * 0x10), - playerHUD[playerId].lapDurations[var_s0]); - } - } - draw_hud_2d_texture_32x16(playerHUD[playerId].totalTimeX - 0x13, playerHUD[playerId].timerY + 0x38, - (u8*) 0xd00bd58); - if (D_801657E5 != 0) { - print_timer_rainbow(playerHUD[playerId].totalTimeX, playerHUD[playerId].timerY + 0x30, - playerHUD[playerId].someTimer); - } else { - print_timer(playerHUD[playerId].totalTimeX, playerHUD[playerId].timerY + 0x30, - playerHUD[playerId].someTimer); - } - } - } else { - if (playerHUD[playerId].blinkTimer == 0) { - draw_hud_2d_texture_32x16(playerHUD[playerId].timerX - 0x13, playerHUD[playerId].timerY + 8, - (u8*) 0xd00c158); - print_timer(playerHUD[playerId].timerX, playerHUD[playerId].timerY, playerHUD[playerId].someTimer); - } else { - draw_hud_2d_texture_32x16(playerHUD[playerId].timerX - 0x13, playerHUD[playerId].timerY + 8, - (u8*) 0xd00ad58); - if (D_801657E3 != 0) { - print_timer_rainbow(playerHUD[playerId].timerX, playerHUD[playerId].timerY, - playerHUD[playerId].someTimer1); - } else if (playerHUD[playerId].blinkState == 0) { - print_timer(playerHUD[playerId].timerX, playerHUD[playerId].timerY, playerHUD[playerId].someTimer1); - } - } - } - } - gEXSetRectAlign(gDisplayListHead++, G_EX_ORIGIN_NONE, G_EX_ORIGIN_NONE, 0, 0, 0, 0); // @recomp -} -#endif - -// Speedometer -#if 1 -RECOMP_PATCH void func_8004ED40(s32 arg0) { - gEXSetScissor(gDisplayListHead++, G_SC_NON_INTERLACE, G_EX_ORIGIN_LEFT, G_EX_ORIGIN_RIGHT, 0, 0, 0, - SCREEN_HEIGHT); // @recomp - gEXSetRectAlign(gDisplayListHead++, G_EX_ORIGIN_RIGHT, G_EX_ORIGIN_RIGHT, -(SCREEN_WIDTH) * 4, 0, - -(SCREEN_WIDTH) * 4, 0); // @recomp - gEXSetViewportAlign(gDisplayListHead++, G_EX_ORIGIN_RIGHT, -(SCREEN_WIDTH) * 4, 0); - gSPViewport(gDisplayListHead++, VIRTUAL_TO_PHYSICAL((void*) 0x802B8880)); - - func_8004A2F4(playerHUD[arg0].speedometerX, playerHUD[arg0].speedometerY, 0U, 1.0f, D_8018D300, D_8018D308, - D_8018D310, 0xFF, (u8*) 0xd009958, (Vtx*) 0x0D0064B0, 64, 96, 64, 48); - func_8004A258(D_8018CFEC, D_8018CFF4, D_8016579E, 1.0f, (u8*) 0xd00a558, (Vtx*) 0x0D005FF0, 0x40, 0x20, 0x40, 0x20); - gEXSetViewportAlign(gDisplayListHead++, G_EX_ORIGIN_NONE, 0, 0); - gEXSetRectAlign(gDisplayListHead++, G_EX_ORIGIN_NONE, G_EX_ORIGIN_NONE, 0, 0, 0, 0); -} -#endif - -// Theboy181: Temp fix for HUD in MP (until proper widescreen is made for MP modes) -#if 1 -RECOMP_PATCH void func_800591B4(void) { - if ((gHUDDisable == 0) && (D_800DC5B8 != 0)) { - func_80057C60(); - gSPDisplayList(gDisplayListHead++, 0x0d0076f8); // SETUP_DL - - if (gIsHUDVisible != 0) { - if (D_801657D8 == 0) { - if (D_801657F0 != false) { - func_800514BC(); - } - - if ((!gDemoMode) && (D_801657E8 != false)) { - if (D_80165800[0] != 0) { - if (gScreenModeSelection < SCREEN_MODE_3P_4P_SPLITSCREEN) { - gEXSetScissor(gDisplayListHead++, G_SC_NON_INTERLACE, G_EX_ORIGIN_LEFT, G_EX_ORIGIN_RIGHT, - 0, 0, 0, SCREEN_HEIGHT); // @recomp - - gEXSetRectAlign(gDisplayListHead++, G_EX_ORIGIN_RIGHT, G_EX_ORIGIN_RIGHT, - -(SCREEN_WIDTH) * 4, 0, -(SCREEN_WIDTH) * 4, 0); // @recomp - } - - func_8004EE54(0); // map - if (gModeSelection != BATTLE) { - render_mini_map_finish_line(0); - } - - if (gScreenModeSelection < SCREEN_MODE_3P_4P_SPLITSCREEN) { - gEXSetViewportAlign(gDisplayListHead++, G_EX_ORIGIN_RIGHT, -(SCREEN_WIDTH) * 4, 0); - gSPViewport(gDisplayListHead++, VIRTUAL_TO_PHYSICAL((void*) 0x802B8880)); - } - - func_8004F3E4(0); // racers on the map, including the player. - - if (gScreenModeSelection < SCREEN_MODE_3P_4P_SPLITSCREEN) { - gEXSetViewportAlign(gDisplayListHead++, G_EX_ORIGIN_NONE, 0, 0); - gEXSetRectAlign(gDisplayListHead++, G_EX_ORIGIN_NONE, G_EX_ORIGIN_NONE, 0, 0, 0, - 0); // @recomp - } - } - - if ((gScreenModeSelection == SCREEN_MODE_2P_SPLITSCREEN_HORIZONTAL) && (D_80165800[1] != 0)) { - func_8004EE54(1); // map splitscreen - if (gModeSelection != BATTLE) { - render_mini_map_finish_line(1); - } - func_8004F3E4(1); // player splitscreen - } - } - } - - if (gScreenModeSelection < SCREEN_MODE_3P_4P_SPLITSCREEN) { - gEXSetScissor(gDisplayListHead++, G_SC_NON_INTERLACE, G_EX_ORIGIN_LEFT, G_EX_ORIGIN_RIGHT, 0, 0, 0, - SCREEN_HEIGHT); // @recomp - - if (D_801657E2 == 0) { - gEXSetViewportAlign(gDisplayListHead++, G_EX_ORIGIN_LEFT, 0, 0); - } else { - gEXSetViewportAlign(gDisplayListHead++, G_EX_ORIGIN_NONE, 0, 0); - } - - gSPViewport(gDisplayListHead++, VIRTUAL_TO_PHYSICAL((void*) 0x802B8880)); - } - - if ((D_801657E4 != 2) && (gModeSelection == GRAND_PRIX) && (D_8018D2BC != 0)) { - func_80050320(); // racers ranking - } - - func_800590D4(); // Player Ranking position (ex. 1st, 2nd, etc) - - if (gScreenModeSelection < SCREEN_MODE_3P_4P_SPLITSCREEN) { - gEXSetViewportAlign(gDisplayListHead++, G_EX_ORIGIN_NONE, 0, 0); - gEXSetRectAlign(gDisplayListHead++, G_EX_ORIGIN_NONE, G_EX_ORIGIN_NONE, 0, 0, 0, 0); // @recomp - } - } - - func_8005902C(); - func_80057DD0(); - func_80057CE4(); - } - - if (gScreenModeSelection < SCREEN_MODE_3P_4P_SPLITSCREEN) { - gEXSetViewportAlign(gDisplayListHead++, G_EX_ORIGIN_NONE, 0, 0); - } -} -#endif \ No newline at end of file diff --git a/patches/improvements.c b/patches/improvements.c deleted file mode 100644 index a17d7fa..0000000 --- a/patches/improvements.c +++ /dev/null @@ -1,140 +0,0 @@ -#include "patches.h" - -// Blur characters -#if 1 -RECOMP_PATCH void render_kart(Player* player, s8 playerId, s8 arg2, s8 arg3) { - UNUSED s32 pad; - Mat4 sp1A4; - UNUSED s32 pad2[17]; - Vec3f sp154; - Vec3s sp14C; - f32 sp148; - f32 sp144; - f32 sp140; - s16 temp_v1; - s16 thing; - - if (player->unk_044 & 0x2000) { - sp14C[0] = 0; - sp14C[1] = player->unk_048[arg2]; - sp14C[2] = 0; - func_80062B18(&sp148, &sp144, &sp140, 0.0f, 1.5f, 0.0f, -player->unk_048[arg2], player->unk_050[arg2]); - sp154[1] = (player->pos[1] - player->boundingBoxSize) + (sp144 - 2.0); - sp154[0] = player->pos[0] + sp148; - sp154[2] = player->pos[2] + sp140; - } else { - thing = (u16) (player->unk_048[arg2] + player->rotation[1] + player->unk_0C0); - temp_v1 = player->unk_0CC[arg2] * sins(thing); - if ((player->effects & 8) == 8) { - sp14C[0] = cameras[arg2].rot[0] - 0x4000; - } else { - sp14C[0] = -temp_v1 * 0.8; - } - sp14C[1] = player->unk_048[arg2]; - sp14C[2] = player->unk_050[arg2]; - if (((s32) player->effects & HIT_EFFECT) == HIT_EFFECT) { - func_80062B18(&sp148, &sp144, &sp140, 0.0f, 8.0f, 0.0f, -player->unk_048[arg2], player->unk_050[arg2]); - sp154[1] = (player->pos[1] - player->boundingBoxSize) + player->unk_108; - sp154[0] = player->pos[0] + sp148; - sp154[2] = player->pos[2] + sp140; - } else { - func_80062B18(&sp148, &sp144, &sp140, 0.0f, 1.5f, 0.0f, -player->unk_048[arg2], player->unk_050[arg2]); - sp154[1] = (player->pos[1] - player->boundingBoxSize) + player->unk_108 + (sp144 - 2.0); - sp154[0] = player->pos[0] + sp148; - sp154[2] = player->pos[2] + sp140; - } - } -#ifdef AVOID_UB - gPlayerPalette = &gPlayerPalettesList[D_801651D0[arg2][playerId]][arg2][playerId]; -#else - gPlayerPalette = (struct_D_802F1F80*) &gPlayerPalettesList[D_801651D0[arg2][playerId]][arg2][playerId * 0x100]; -#endif - if ((arg2 == 0) || (arg2 == 1)) { - sKartUpperTexture = &D_802BFB80.arraySize8[D_801651D0[arg2][playerId]][arg2][playerId].pixel_index_array[0]; - sKartLowerTexture = &D_802BFB80.arraySize8[D_801651D0[arg2][playerId]][arg2][playerId].pixel_index_array[0x7C0]; - } else { - sKartUpperTexture = - &D_802BFB80.arraySize8[D_801651D0[arg2][playerId]][arg2 - 1][playerId - 4].pixel_index_array[0]; - sKartLowerTexture = - &D_802BFB80.arraySize8[D_801651D0[arg2][playerId]][arg2 - 1][playerId - 4].pixel_index_array[0x7C0]; - } - mtxf_translate_rotate(sp1A4, sp154, sp14C); - mtxf_scale2(sp1A4, gCharacterSize[player->characterId] * player->size); - convert_to_fixed_point_matrix(&gGfxPool->mtxKart[playerId + (arg2 * 8)], sp1A4); - - if ((player->effects & BOO_EFFECT) == BOO_EFFECT) { - if (arg2 == playerId) { - gSPMatrix(gDisplayListHead++, VIRTUAL_TO_PHYSICAL(&gGfxPool->mtxKart[playerId + (arg2 * 8)]), - G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); - gSPDisplayList(gDisplayListHead++, (Gfx*) 0xd008cd8); - gDPLoadTLUT_pal256(gDisplayListHead++, gPlayerPalette); - gDPSetTextureLUT(gDisplayListHead++, G_TT_RGBA16); - func_8004B614(gPlayerRedEffect[playerId], gPlayerGreenEffect[playerId], gPlayerBlueEffect[playerId], - gPlayerCyanEffect[playerId], gPlayerMagentaEffect[playerId], gPlayerYellowEffect[playerId], - (s32) player->unk_0C6); - gDPSetRenderMode(gDisplayListHead++, - AA_EN | Z_CMP | Z_UPD | IM_RD | CVG_DST_WRAP | ZMODE_XLU | CVG_X_ALPHA | FORCE_BL | - GBL_c1(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA), - AA_EN | Z_CMP | Z_UPD | IM_RD | CVG_DST_WRAP | ZMODE_XLU | CVG_X_ALPHA | FORCE_BL | - GBL_c2(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA)); - } else { - gSPMatrix(gDisplayListHead++, VIRTUAL_TO_PHYSICAL(&gGfxPool->mtxKart[playerId + (arg2 * 8)]), - G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); - gSPDisplayList(gDisplayListHead++, (Gfx*) 0xd008cd8); - gDPLoadTLUT_pal256(gDisplayListHead++, gPlayerPalette); - gDPSetTextureLUT(gDisplayListHead++, G_TT_RGBA16); - func_8004B614(gPlayerRedEffect[playerId], gPlayerGreenEffect[playerId], gPlayerBlueEffect[playerId], - gPlayerCyanEffect[playerId], gPlayerMagentaEffect[playerId], gPlayerYellowEffect[playerId], - D_8018D970[playerId]); - gDPSetRenderMode(gDisplayListHead++, - AA_EN | Z_CMP | Z_UPD | IM_RD | CVG_DST_WRAP | ZMODE_XLU | CVG_X_ALPHA | FORCE_BL | - GBL_c1(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA), - AA_EN | Z_CMP | Z_UPD | IM_RD | CVG_DST_WRAP | ZMODE_XLU | CVG_X_ALPHA | FORCE_BL | - GBL_c2(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA)); - } - } else if (((player->unk_0CA & 4) == 4) || (player->soundEffects & 0x08000000) || - (player->soundEffects & 0x04000000)) { - gSPMatrix(gDisplayListHead++, VIRTUAL_TO_PHYSICAL(&gGfxPool->mtxKart[playerId + (arg2 * 8)]), - G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); - gSPDisplayList(gDisplayListHead++, (Gfx*) 0xd008cd8); - gDPLoadTLUT_pal256(gDisplayListHead++, gPlayerPalette); - gDPSetTextureLUT(gDisplayListHead++, G_TT_RGBA16); - func_8004B614(gPlayerRedEffect[playerId], gPlayerGreenEffect[playerId], gPlayerBlueEffect[playerId], - gPlayerCyanEffect[playerId], gPlayerMagentaEffect[playerId], gPlayerYellowEffect[playerId], - (s32) player->unk_0C6); - gDPSetAlphaCompare(gDisplayListHead++, G_AC_DITHER); - gDPSetRenderMode(gDisplayListHead++, G_RM_ZB_XLU_SURF, G_RM_ZB_XLU_SURF2); - } else { - gSPMatrix(gDisplayListHead++, VIRTUAL_TO_PHYSICAL(&gGfxPool->mtxKart[playerId + (arg2 * 8)]), - G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); - gSPDisplayList(gDisplayListHead++, (Gfx*) 0xd008cd8); - gDPLoadTLUT_pal256(gDisplayListHead++, gPlayerPalette); - gDPSetTextureLUT(gDisplayListHead++, G_TT_RGBA16); - func_8004B614(gPlayerRedEffect[playerId], gPlayerGreenEffect[playerId], gPlayerBlueEffect[playerId], - gPlayerCyanEffect[playerId], gPlayerMagentaEffect[playerId], gPlayerYellowEffect[playerId], - (s32) player->unk_0C6); - - // @recomp: blured kart looks better. - // gDPSetRenderMode(gDisplayListHead++, G_RM_AA_ZB_TEX_EDGE, G_RM_AA_ZB_TEX_EDGE2); - gDPSetRenderMode(gDisplayListHead++, - AA_EN | Z_CMP | Z_UPD | IM_RD | CVG_DST_WRAP | ZMODE_XLU | CVG_X_ALPHA | FORCE_BL | - GBL_c1(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA), - AA_EN | Z_CMP | Z_UPD | IM_RD | CVG_DST_WRAP | ZMODE_XLU | CVG_X_ALPHA | FORCE_BL | - GBL_c2(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA)); - } - - gDPLoadTextureBlock(gDisplayListHead++, sKartUpperTexture, G_IM_FMT_CI, G_IM_SIZ_8b, 64, 32, 0, - G_TX_NOMIRROR | G_TX_CLAMP, G_TX_NOMIRROR | G_TX_CLAMP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, - G_TX_NOLOD); - gSPVertex(gDisplayListHead++, &D_800DDBB4[playerId][arg3], 4, 0); - gSPDisplayList(gDisplayListHead++, (Gfx*) 0xd008c78); - - gDPLoadTextureBlock(gDisplayListHead++, sKartLowerTexture, G_IM_FMT_CI, G_IM_SIZ_8b, 64, 32, 0, - G_TX_NOMIRROR | G_TX_CLAMP, G_TX_NOMIRROR | G_TX_CLAMP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, - G_TX_NOLOD); - gSPVertex(gDisplayListHead++, &D_800DDBB4[playerId][arg3 + 4], 4, 0); - gSPDisplayList(gDisplayListHead++, (Gfx*) 0xd008c78); - gSPTexture(gDisplayListHead++, 1, 1, 0, G_TX_RENDERTILE, G_OFF); - gDPSetAlphaCompare(gDisplayListHead++, G_AC_NONE); -} -#endif \ No newline at end of file diff --git a/patches/jumbotron.c b/patches/jumbotron.c deleted file mode 100644 index 0af27eb..0000000 --- a/patches/jumbotron.c +++ /dev/null @@ -1,164 +0,0 @@ -#include "patches.h" - -#if 1 - -s16 currentScreenSection = 0; - -RECOMP_PATCH void render_luigi_raceway(struct UnkStruct_800DC5EC* arg0) { - u16 sp22 = (u16) arg0->pathCounter; - s16 prevFrame; - - gSPTexture(gDisplayListHead++, 0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON); - gSPSetGeometryMode(gDisplayListHead++, G_SHADING_SMOOTH); - gSPClearGeometryMode(gDisplayListHead++, G_LIGHTING); - - if (func_80290C20(arg0->camera) == 1) { - gDPSetCombineMode(gDisplayListHead++, G_CC_SHADE, G_CC_SHADE); - gDPSetRenderMode(gDisplayListHead++, G_RM_AA_ZB_OPA_SURF, G_RM_AA_ZB_OPA_SURF2); - // d_course_luigi_raceway_packed_dl_9EC0 - gSPDisplayList(gDisplayListHead++, ((uintptr_t) 0x07009EC0)); - } - - gDPSetCombineMode(gDisplayListHead++, G_CC_MODULATEIA, G_CC_MODULATEIA); - gDPSetRenderMode(gDisplayListHead++, G_RM_AA_ZB_OPA_SURF, G_RM_AA_ZB_OPA_SURF2); - - render_course_segments((uintptr_t) luigi_raceway_dls, arg0); - - gDPSetCombineMode(gDisplayListHead++, G_CC_MODULATEIDECALA, G_CC_MODULATEIDECALA); - gDPSetRenderMode(gDisplayListHead++, G_RM_AA_ZB_TEX_EDGE, G_RM_AA_ZB_TEX_EDGE2); - // d_course_luigi_raceway_packed_dl_E0 - gSPDisplayList(gDisplayListHead++, ((uintptr_t) 0x070000E0)); - // d_course_luigi_raceway_packed_dl_68 - gSPDisplayList(gDisplayListHead++, ((uintptr_t) 0x07000068)); - - D_800DC5DC = 88; - D_800DC5E0 = 72; - - // Render only the first player camera onto the television billboard. Screen agnostic screens of other players). - if ((gActiveScreenMode == SCREEN_MODE_1P) && (sp22 >= 10) && (sp22 < 17)) { - - prevFrame = (s16) sRenderedFramebuffer - 1; - - if (prevFrame < 0) { - prevFrame = 2; - } else if (prevFrame >= 3) { - prevFrame = 0; - } - - // Loop through all six sections and render them in the same frame - for (currentScreenSection = 0; currentScreenSection < 6; currentScreenSection++) { - switch (currentScreenSection) { - case 0: - copy_framebuffer(D_800DC5DC, D_800DC5E0, 64, 32, - (u16*) PHYSICAL_TO_VIRTUAL(gPhysicalFramebuffers[prevFrame]), - (u16*) PHYSICAL_TO_VIRTUAL(gSegmentTable[5] + 0xF800)); - break; - case 1: - copy_framebuffer(D_800DC5DC + 64, D_800DC5E0, 64, 32, - (u16*) PHYSICAL_TO_VIRTUAL(gPhysicalFramebuffers[prevFrame]), - (u16*) PHYSICAL_TO_VIRTUAL(gSegmentTable[5] + 0x10800)); - break; - case 2: - copy_framebuffer(D_800DC5DC, D_800DC5E0 + 32, 64, 32, - (u16*) PHYSICAL_TO_VIRTUAL(gPhysicalFramebuffers[prevFrame]), - (u16*) PHYSICAL_TO_VIRTUAL(gSegmentTable[5] + 0x11800)); - break; - case 3: - copy_framebuffer(D_800DC5DC + 64, D_800DC5E0 + 32, 64, 32, - (u16*) PHYSICAL_TO_VIRTUAL(gPhysicalFramebuffers[prevFrame]), - (u16*) PHYSICAL_TO_VIRTUAL(gSegmentTable[5] + 0x12800)); - break; - case 4: - copy_framebuffer(D_800DC5DC, D_800DC5E0 + 64, 64, 32, - (u16*) PHYSICAL_TO_VIRTUAL(gPhysicalFramebuffers[prevFrame]), - (u16*) PHYSICAL_TO_VIRTUAL(gSegmentTable[5] + 0x13800)); - break; - case 5: - copy_framebuffer(D_800DC5DC + 64, D_800DC5E0 + 64, 64, 32, - (u16*) PHYSICAL_TO_VIRTUAL(gPhysicalFramebuffers[prevFrame]), - (u16*) PHYSICAL_TO_VIRTUAL(gSegmentTable[5] + 0x14800)); - break; - } - } - } -} - -#endif - -#if 1 -RECOMP_PATCH void render_wario_stadium(struct UnkStruct_800DC5EC* arg0) { - s16 prevFrame; - - gSPTexture(gDisplayListHead++, 0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON); - gSPSetGeometryMode(gDisplayListHead++, G_SHADING_SMOOTH); - gSPClearGeometryMode(gDisplayListHead++, G_LIGHTING); - - if (func_80290C20(arg0->camera) == 1) { - - gDPSetCombineMode(gDisplayListHead++, G_CC_SHADE, G_CC_SHADE); - gDPSetRenderMode(gDisplayListHead++, G_RM_AA_ZB_OPA_SURF, G_RM_AA_ZB_OPA_SURF2); - // d_course_wario_stadium_packed_dl_A0C8 - gSPDisplayList(gDisplayListHead++, ((uintptr_t) 0x0700A0C8)); - } - gDPSetCombineMode(gDisplayListHead++, G_CC_MODULATERGBA, G_CC_MODULATERGBA); - gDPSetRenderMode(gDisplayListHead++, G_RM_AA_ZB_OPA_SURF, G_RM_AA_ZB_OPA_SURF2); - - render_course_segments((uintptr_t) wario_stadium_dls, arg0); - - // d_course_wario_stadium_packed_dl_A228 - gSPDisplayList(gDisplayListHead++, ((uintptr_t) 0x0700A228)); - gDPSetCombineMode(gDisplayListHead++, G_CC_MODULATEIDECALA, G_CC_MODULATEIDECALA); - gDPSetRenderMode(gDisplayListHead++, G_RM_AA_ZB_TEX_EDGE, G_RM_AA_ZB_TEX_EDGE2); - gSPClearGeometryMode(gDisplayListHead++, G_CULL_BACK); - // d_course_wario_stadium_packed_dl_A88 - gSPDisplayList(gDisplayListHead++, ((uintptr_t) 0x07000A88)); - gSPSetGeometryMode(gDisplayListHead++, G_CULL_BACK); - - D_800DC5DC = 88; - D_800DC5E0 = 72; - if (gActiveScreenMode == SCREEN_MODE_1P) { - prevFrame = (s16) sRenderedFramebuffer - 1; - if (prevFrame < 0) { - prevFrame = 2; - } else if (prevFrame >= 3) { - prevFrame = 0; - } - - // Loop through all six sections and render them in the same frame - for (currentScreenSection = 0; currentScreenSection < 6; currentScreenSection++) { - switch (currentScreenSection) { - case 0: - copy_framebuffer(D_800DC5DC, D_800DC5E0, 64, 32, - (u16*) PHYSICAL_TO_VIRTUAL(gPhysicalFramebuffers[prevFrame]), - (u16*) PHYSICAL_TO_VIRTUAL(gSegmentTable[5] + 0x8800)); - break; - case 1: - copy_framebuffer(D_800DC5DC + 64, D_800DC5E0, 64, 32, - (u16*) PHYSICAL_TO_VIRTUAL(gPhysicalFramebuffers[prevFrame]), - (u16*) PHYSICAL_TO_VIRTUAL(gSegmentTable[5] + 0x9800)); - break; - case 2: - copy_framebuffer(D_800DC5DC, D_800DC5E0 + 32, 64, 32, - (u16*) PHYSICAL_TO_VIRTUAL(gPhysicalFramebuffers[prevFrame]), - (u16*) PHYSICAL_TO_VIRTUAL(gSegmentTable[5] + 0xA800)); - break; - case 3: - copy_framebuffer(D_800DC5DC + 64, D_800DC5E0 + 32, 64, 32, - (u16*) PHYSICAL_TO_VIRTUAL(gPhysicalFramebuffers[prevFrame]), - (u16*) PHYSICAL_TO_VIRTUAL(gSegmentTable[5] + 0xB800)); - break; - case 4: - copy_framebuffer(D_800DC5DC, D_800DC5E0 + 64, 64, 32, - (u16*) PHYSICAL_TO_VIRTUAL(gPhysicalFramebuffers[prevFrame]), - (u16*) PHYSICAL_TO_VIRTUAL(gSegmentTable[5] + 0xC800)); - break; - case 5: - copy_framebuffer(D_800DC5DC + 64, D_800DC5E0 + 64, 64, 32, - (u16*) PHYSICAL_TO_VIRTUAL(gPhysicalFramebuffers[prevFrame]), - (u16*) PHYSICAL_TO_VIRTUAL(gSegmentTable[5] + 0xD800)); - break; - } - } - } -} -#endif \ No newline at end of file diff --git a/patches/menus.c b/patches/menus.c deleted file mode 100644 index 9f20399..0000000 --- a/patches/menus.c +++ /dev/null @@ -1,1129 +0,0 @@ -#include "patches.h" - -bool recompDebugSwitch = 0; - -RECOMP_PATCH void handle_menus_with_pri_arg(s32 priSpecial) { - s32 j = 0; - s32 isRendered = 0; - s32 i = 0; - s32 type = 0; - MenuItem* entry = NULL; - volatile u8* address; - - // gDPSetTextureFilter(gDisplayListHead++, G_TF_POINT); - // gEXEnable(gDisplayListHead++); // @recomp - // gEXSetRefreshRate(gDisplayListHead++, 60 / 2); - - // @recomp: Patch the sequence bug that prevented the whole end results song from playing. - { - address = (volatile u8*) 0x803B16DC; - - if (*address == 0x40) { - *address = 0x2; - recomp_printf("Sequence PATCHED!\n"); - } - } - -#if 0 - { - if (gControllers[0].button & U_JPAD) { - recompDebugSwitch = 1; - recomp_printf("recompDebugSwitch: ON : %d\n", recompDebugSwitch); - } - if (gControllers[0].button & D_JPAD) { - recompDebugSwitch = 0; - recomp_printf("recompDebugSwitch: OFF : %d\n", recompDebugSwitch); - } - } -#endif - - for (i = 0; i < MENU_ITEMS_MAX; i++) { - isRendered = false; - entry = &gMenuItems[i]; - type = entry->type; - if ((type == MENU_ITEM_UI_NO_CONTROLLER) || (type == MENU_ITEM_UI_START_RECORD_TIME) || - (type == MENU_ITEM_PAUSE)) { - if (priSpecial != 0) { - isRendered = true; - } - } else if (priSpecial == 0) { - isRendered = true; - } - - if (isRendered == false) { - continue; - } - - switch (type) { - case 240: - gDPSetTextureFilter(gDisplayListHead++, G_TF_BILERP); - break; - case MENU_ITEM_UI_LOGO_INTRO: - gDPSetTextureFilter(gDisplayListHead++, G_TF_BILERP); - if (sIntroModelTimer < 0x50) { - sIntroModelSpeed = 3.0f; - } else if (sIntroModelTimer < 90) { - if (sIntroModelMotionSpeed < 1.0) { - sIntroModelMotionSpeed += 0.1; - } - sIntroModelSpeed += 0.1; - } else if (sIntroModelTimer < 0xA0) { - sIntroModelSpeed += 0.1; - } else if (sIntroModelTimer < 0x190) { - sIntroModelSpeed += 0.3; - } - gIntroModelRotY -= sIntroModelSpeed; - sIntroModelTimer += 1; - if (gIntroModelRotY < -360.0f) { - gIntroModelRotY += 360.0f; - } - entry->param1++; - if (entry->param1 == 0x000000B4) { - func_8009E000(40); - func_800CA388(0x64U); - gMenuFadeType = MENU_FADE_TYPE_MAIN; - } - if ((entry->param2 != 0) && (entry->param1 >= 3)) { - entry->param2 = 0; - play_sound2(SOUND_INTRO_LOGO); - } - break; - case MENU_ITEM_TYPE_0DA: - func_800A954C(entry); - break; - case MENU_ITEM_TYPE_0D6: - func_800A9710(entry); - break; - case MENU_ITEM_TYPE_0D4: - func_800A97BC(entry); - break; - case MENU_ITEM_UI_START_RECORD_TIME: - gDPSetTextureFilter(gDisplayListHead++, G_TF_BILERP); - switch (entry->state) { - case 0: - if (gControllers[0].button & L_TRIG) { - gDebugMenuSelection = 3; - } -#if DEBUG_ENDING == 1 - if (gControllers[0].button & U_CBUTTONS) { - gGamestateNext = CREDITS_SEQUENCE; - } -#endif -#if DEBUG_CEREMONY == 1 - if (gControllers[0].button & R_CBUTTONS) { - gGamestateNext = ENDING; - } -#endif - // @recomp: Change gControllerFive to gControllers[0] to avoid bug where something - // is pressing other controllers in memory. - if (gControllers[0].button & R_TRIG) { - entry->state = 1; - play_sound2(SOUND_ACTION_PING); - } else { - entry->visible = 0; - } - break; - case 1: - default: - entry->visible = 1; - break; - } - break; - case MENU_ITEM_UI_GAME_SELECT: - func_800AA280(entry); - break; - case MAIN_MENU_OPTION_GFX: - case MAIN_MENU_DATA_GFX: - switch (gMainMenuSelection) { - case MAIN_MENU_OPTION: - case MAIN_MENU_DATA: - case MAIN_MENU_PLAYER_SELECT: - func_800A9B9C(entry); - break; - case MAIN_MENU_MODE_SELECT: - case MAIN_MENU_MODE_SUB_SELECT: - case MAIN_MENU_OK_SELECT: - case MAIN_MENU_OK_SELECT_GO_BACK: - case MAIN_MENU_MODE_SUB_SELECT_GO_BACK: - func_800A9C40(entry); - break; - } - break; - case MENU_ITEM_UI_OK: - func_800AA280(entry); - update_ok_menu_item(entry); - break; - case MENU_ITEM_UI_1P_GAME: - case MENU_ITEM_UI_2P_GAME: - case MENU_ITEM_UI_3P_GAME: - case MENU_ITEM_UI_4P_GAME: - switch (gMainMenuSelection) { - case MAIN_MENU_OPTION: - case MAIN_MENU_DATA: - case MAIN_MENU_PLAYER_SELECT: - gDPSetTextureFilter(gDisplayListHead++, G_TF_POINT); - func_800A9B9C(entry); - break; - case MAIN_MENU_MODE_SELECT: - case MAIN_MENU_MODE_SUB_SELECT: - case MAIN_MENU_OK_SELECT: - case MAIN_MENU_OK_SELECT_GO_BACK: - case MAIN_MENU_MODE_SUB_SELECT_GO_BACK: - gDPSetTextureFilter(gDisplayListHead++, G_TF_POINT); - func_800A9C40(entry); - break; - } - func_800A9D5C(entry); - break; - case MAIN_MENU_50CC: - case MAIN_MENU_100CC: - case MAIN_MENU_150CC: - case MAIN_MENU_EXTRA_CC: - case MENU_ITEM_TYPE_016: - case MENU_ITEM_TYPE_017: - case MAIN_MENU_TIME_TRIALS_BEGIN: - case MAIN_MENU_TIME_TRIALS_DATA: - func_800A9E58(entry); - break; - case MENU_ITEM_TYPE_01B: - gDPSetTextureFilter(gDisplayListHead++, G_TF_POINT); - func_800AA2EC(entry); - break; - case CHARACTER_SELECT_MENU_1P_CURSOR: - case CHARACTER_SELECT_MENU_2P_CURSOR: - case CHARACTER_SELECT_MENU_3P_CURSOR: - case CHARACTER_SELECT_MENU_4P_CURSOR: - update_cursor(entry); - break; - case CHARACTER_SELECT_MENU_MARIO: - case CHARACTER_SELECT_MENU_LUIGI: - case CHARACTER_SELECT_MENU_TOAD: - case CHARACTER_SELECT_MENU_PEACH: - case CHARACTER_SELECT_MENU_YOSHI: - case CHARACTER_SELECT_MENU_DK: - case CHARACTER_SELECT_MENU_WARIO: - case CHARACTER_SELECT_MENU_BOWSER: - func_800AAC18(entry); - switch (entry->type) { - case CHARACTER_SELECT_MENU_MARIO: - case CHARACTER_SELECT_MENU_LUIGI: - case CHARACTER_SELECT_MENU_TOAD: - case CHARACTER_SELECT_MENU_PEACH: - case CHARACTER_SELECT_MENU_YOSHI: - case CHARACTER_SELECT_MENU_DK: - case CHARACTER_SELECT_MENU_WARIO: - case CHARACTER_SELECT_MENU_BOWSER: - gDPSetTextureFilter(gDisplayListHead++, G_TF_POINT); - func_800AA69C(entry); - break; - } - switch (gPlayerSelectMenuSelection) { - case PLAYER_SELECT_MENU_MAIN: - func_800AAB90(entry); - break; - case PLAYER_SELECT_MENU_OK: - case PLAYER_SELECT_MENU_OK_GO_BACK: - func_800AAA9C(entry); - break; - } - func_800AAE18(entry); - break; - case CHARACTER_SELECT_MENU_OK: - case COURSE_SELECT_OK: - update_ok_menu_item(entry); - break; - case COURSE_SELECT_MUSHROOM_CUP: - case COURSE_SELECT_FLOWER_CUP: - case COURSE_SELECT_STAR_CUP: - case COURSE_SELECT_SPECIAL_CUP: - func_800AB164(entry); - switch (gSubMenuSelection) { - case SUB_MENU_MAP_SELECT_CUP: - func_800AB020(entry); - break; - case SUB_MENU_MAP_SELECT_COURSE: - case SUB_MENU_MAP_SELECT_OK: - func_800AB098(entry); - break; - } - break; - case MENU_ITEM_TYPE_058: - case COURSE_SELECT_COURSE_NAMES: - case MENU_ITEM_TYPE_05A: - case MENU_ITEM_TYPE_05B: - func_800AB260(entry); - break; - case MENU_ITEM_TYPE_064: - func_800AB314(entry); - break; - case MENU_ITEM_TYPE_05F: - case MENU_ITEM_TYPE_060: - case MENU_ITEM_TYPE_061: - case MENU_ITEM_TYPE_062: - gDPSetTextureFilter(gDisplayListHead++, G_TF_POINT); - func_800AB290(entry); - break; - case MENU_ITEM_TYPE_065: - case MENU_ITEM_TYPE_066: - func_800AB904(entry); - break; - case MENU_ITEM_TYPE_067: - func_800AB9B0(entry); - break; - case MENU_ITEM_TYPE_078: - case MENU_ITEM_TYPE_079: - case MENU_ITEM_TYPE_07A: - case MENU_ITEM_TYPE_07B: - case MENU_ITEM_TYPE_08C: - func_800ABAE8(entry); - break; - case MENU_ITEM_TYPE_08D: - func_800ABB24(entry); - break; - case MENU_ITEM_TYPE_07C: - case MENU_ITEM_TYPE_07D: - case MENU_ITEM_TYPE_07E: - case MENU_ITEM_TYPE_07F: - case MENU_ITEM_TYPE_080: - case MENU_ITEM_TYPE_081: - case MENU_ITEM_TYPE_082: - case MENU_ITEM_TYPE_083: - case MENU_ITEM_TYPE_084: - case MENU_ITEM_TYPE_085: - case MENU_ITEM_TYPE_086: - case MENU_ITEM_TYPE_087: - case MENU_ITEM_TYPE_088: - case MENU_ITEM_TYPE_089: - case MENU_ITEM_TYPE_08A: - case MENU_ITEM_TYPE_08B: - gDPSetTextureFilter(gDisplayListHead++, G_TF_POINT); - func_800ABBCC(entry); - break; - case MENU_ITEM_TYPE_096: - func_800ABC38(entry); - break; - case MENU_ITEM_TYPE_097: - func_800ABEAC(entry); - break; - case MENU_ITEM_TYPE_05E: - func_800AC300(entry); - break; - case MENU_ITEM_TYPE_0AA: - func_800AC324(entry); - break; - case MENU_ITEM_TYPE_0AB: - func_800AC458(entry); - break; - case MENU_ITEM_TYPE_0AC: - func_800ACA14(entry); - break; - case MENU_ITEM_TYPE_0AF: - func_800AC978(entry); - break; - case MENU_ITEM_TYPE_0B0: - func_800ACC50(entry); - break; - case MENU_ITEM_TYPE_0B1: - case MENU_ITEM_TYPE_0B2: - case MENU_ITEM_TYPE_0B3: - case MENU_ITEM_TYPE_0B4: - func_800ACF40(entry); - break; - case MENU_ITEM_TYPE_0B9: - func_800AD1A4(entry); - break; - case MENU_ITEM_TYPE_0BA: - func_800AD2E8(entry); - break; - case MENU_ITEM_ANNOUNCE_GHOST: - gDPSetTextureFilter(gDisplayListHead++, G_TF_BILERP); - func_800AEC54(entry); - break; - case MENU_ITEM_PAUSE: - gDPSetTextureFilter(gDisplayListHead++, G_TF_BILERP); - func_800ADF48(entry); - break; - case MENU_ITEM_END_COURSE_OPTION: - gDPSetTextureFilter(gDisplayListHead++, G_TF_BILERP); - func_800AE218(entry); - break; - case MENU_ITEM_DATA_COURSE_IMAGE: - func_800AEDBC(entry); - break; - case MENU_ITEM_DATA_COURSE_SELECTABLE: - func_800AEE90(entry); - break; - case MENU_ITEM_TYPE_0E9: - func_800AEEBC(entry); - break; - case MENU_ITEM_TYPE_0EA: - func_800AEEE8(entry); - break; - case MENU_ITEM_TYPE_0BE: - func_800AEF14(entry); - break; - case MENU_ITEM_TYPE_10E: - func_800AEF74(entry); - break; - case MENU_ITEM_TYPE_12B: - func_800AF004(entry); - break; - case MENU_ITEM_TYPE_12C: - case MENU_ITEM_TYPE_12D: - case MENU_ITEM_TYPE_12E: - case MENU_ITEM_TYPE_12F: - func_800AF1AC(entry); - break; - case MENU_ITEM_TYPE_130: - func_800AF270(entry); - break; - case MENU_ITEM_TYPE_190: - case MENU_ITEM_TYPE_191: - case MENU_ITEM_TYPE_192: - case MENU_ITEM_TYPE_193: - case MENU_ITEM_TYPE_194: - case MENU_ITEM_TYPE_195: - case MENU_ITEM_TYPE_196: - case MENU_ITEM_TYPE_197: - case MENU_ITEM_TYPE_198: - case MENU_ITEM_TYPE_199: - case MENU_ITEM_TYPE_19A: - case MENU_ITEM_TYPE_19B: - case MENU_ITEM_TYPE_19C: - case MENU_ITEM_TYPE_19D: - case MENU_ITEM_TYPE_19E: - case MENU_ITEM_TYPE_19F: - case MENU_ITEM_TYPE_1A0: - case MENU_ITEM_TYPE_1A1: - case MENU_ITEM_TYPE_1A2: - case MENU_ITEM_TYPE_1A3: - case MENU_ITEM_TYPE_1A4: - case MENU_ITEM_TYPE_1A5: - case MENU_ITEM_TYPE_1A6: - case MENU_ITEM_TYPE_1A7: - case MENU_ITEM_TYPE_1A8: - case MENU_ITEM_TYPE_1A9: - case MENU_ITEM_TYPE_1AA: - case MENU_ITEM_TYPE_1AB: - case MENU_ITEM_TYPE_1AC: - case MENU_ITEM_TYPE_1AD: - case MENU_ITEM_TYPE_1AE: - case MENU_ITEM_TYPE_1AF: - case MENU_ITEM_TYPE_1B0: - case MENU_ITEM_TYPE_1B1: - case MENU_ITEM_TYPE_1B2: - case MENU_ITEM_TYPE_1B3: - case MENU_ITEM_TYPE_1B4: - case MENU_ITEM_TYPE_1B5: - case MENU_ITEM_TYPE_1B6: - case MENU_ITEM_TYPE_1B7: - case MENU_ITEM_TYPE_1B8: - case MENU_ITEM_TYPE_1B9: - case MENU_ITEM_TYPE_1BA: - case MENU_ITEM_TYPE_1BB: - case MENU_ITEM_TYPE_1BC: - case MENU_ITEM_TYPE_1BD: - case MENU_ITEM_TYPE_1BE: - case MENU_ITEM_TYPE_1BF: - case MENU_ITEM_TYPE_1C0: - case MENU_ITEM_TYPE_1C1: - case MENU_ITEM_TYPE_1C2: - case MENU_ITEM_TYPE_1C3: - case MENU_ITEM_TYPE_1C4: - case MENU_ITEM_TYPE_1C5: - case MENU_ITEM_TYPE_1C6: - case MENU_ITEM_TYPE_1C7: - case MENU_ITEM_TYPE_1C8: - case MENU_ITEM_TYPE_1C9: - case MENU_ITEM_TYPE_1CA: - case MENU_ITEM_TYPE_1CB: - case MENU_ITEM_TYPE_1CC: - case MENU_ITEM_TYPE_1CD: - case MENU_ITEM_TYPE_1CE: - func_800AF480(entry); - break; - case MENU_ITEM_UI_NONE: - case MENU_ITEM_UI_START_BACKGROUND: - case MENU_ITEM_UI_LOGO_AND_COPYRIGHT: - case MENU_ITEM_UI_PUSH_START_BUTTON: - case MENU_ITEM_UI_NO_CONTROLLER: - break; - } - } - - for (j = 0; j < MENU_ITEM_PRIORITY_MAX; j++) { - for (i = 0; i < MENU_ITEMS_MAX; i++) { - isRendered = false; - entry = &gMenuItems[i]; - type = entry->type; - if ((type == MENU_ITEM_UI_NO_CONTROLLER) || (type == MENU_ITEM_UI_START_RECORD_TIME) || - (type == MENU_ITEM_PAUSE)) { - if (priSpecial != 0) { - isRendered = true; - } - } else if (priSpecial == 0) { - isRendered = true; - } - if ((isRendered != 0) && (j == (s8) entry->priority)) { - render_menus(entry); - } - } - } - -#if 0 - for (int num = 0; num < 8; num++) { - if (gControllers[num].button != 0) { - recomp_printf("BUTTON: %x\n", gControllers[num].button); - recomp_printf("BUTTON: %x\n", gControllers[num].button); - } - } -#endif -} - -#if 1 -Gfx* func_8009BC9C_2(Gfx* arg0, MenuTexture* arg1, s32 arg2, s32 arg3, s32 arg4, s32 arg5, MenuItem* item); -Gfx* RenderMenuTextures(Gfx* arg0, MenuTexture* arg1, s32 column, s32 row); -RECOMP_PATCH void render_menus(MenuItem* arg0) { - s32 var_a1 = 0; - s32 var_v1 = 0; - UNUSED s32 stackPadding0; - UNUSED s32 stackPadding1; - MenuTexture* sp9C; - UNUSED s32 stackPadding2; - s32 temp_a0; - s32 temp_t2; - s32 temp_t5; - s32 temp_t9; - s32 temp_v1; - char sp80[3]; - s32 var_t0; - UNUSED s32 var_a2; - f32 why = 0.75f; - s32 one = 1; - f32 floatone = 1; - UNUSED s32 stackPadding3; - UNUSED s32 stackPadding4; - f32 scaleX; - - if (arg0->visible) { - gDPPipeSync(gDisplayListHead++); - switch (arg0->type) { /* switch 6; irregular */ - case MENU_ITEM_UI_LOGO_INTRO: - func_80094660(gGfxPool, arg0->param1); - break; - case START_MENU_FLAG: - render_checkered_flag(gGfxPool, arg0->param1); - break; - case MENU_ITEM_TYPE_0D2: - gDisplayListHead = func_8009B9D0(gDisplayListHead, D_020014C8); - break; - case MENU_ITEM_TYPE_0D3: - gDisplayListHead = func_8009B9D0(gDisplayListHead, D_02001540); - break; - case MENU_ITEM_TYPE_0D4: - func_800A09E0(arg0); - func_800A0AD0(arg0); - func_800A0B80(arg0); - break; - case MENU_ITEM_TYPE_0D5: - // Sets the text color of the text on the Controller Pak menu - // Also sets the color of the shading at the top and bottom of the menu - // Does not set color of the text in the table itself - gDPSetPrimColor(gDisplayListHead++, 0, 0, 0x00, 0x00, 0x00, 0xFF); - gDisplayListHead = func_8009B9D0(gDisplayListHead, D_020015A4); - gDPSetPrimColor(gDisplayListHead++, 0, 0, 0x32, 0x00, 0x00, 0xFF); - gDisplayListHead = func_8009B9D0(gDisplayListHead, D_020015CC); - gDPSetPrimColor(gDisplayListHead++, 0, 0, 0x00, 0x32, 0x00, 0xFF); - gDisplayListHead = func_8009B9D0(gDisplayListHead, D_02001630); - gDPSetPrimColor(gDisplayListHead++, 0, 0, 0x32, 0x32, 0x00, 0xFF); - gDisplayListHead = func_8009B9D0(gDisplayListHead, D_02001658); - break; - case MENU_ITEM_TYPE_0D6: - func_8009A76C(arg0->D_8018DEE0_index, arg0->column, arg0->row, -1); - break; - case MENU_ITEM_TYPE_0D7: - func_800A0DFC(); - break; - case MENU_ITEM_TYPE_0D8: - case MENU_ITEM_TYPE_0D9: - func_800A0EB8(arg0, arg0->type - 0xD8); - break; - case MENU_ITEM_UI_START_BACKGROUND: - gDisplayListHead = RenderMenuTextures( - gDisplayListHead, gMenuTexturesBackground[has_unlocked_extra_mode()], arg0->column, arg0->row); - break; - case MENU_ITEM_UI_LOGO_AND_COPYRIGHT: - render_game_logo((arg0->column + 0xA0), (arg0->row + 0x47)); - gDisplayListHead = - render_menu_textures(gDisplayListHead, seg2_copyright_1996_texture, arg0->column, arg0->row); - break; - case MENU_ITEM_UI_PUSH_START_BUTTON: - if (((gGlobalTimer / 8) % 3) != 0) { - gDisplayListHead = - render_menu_textures(gDisplayListHead, seg2_push_start_button_texture, arg0->column, arg0->row); - } - break; - case MENU_ITEM_UI_START_RECORD_TIME: - var_t0 = (s32) ((f32) (get_string_width(gCourseNamesDup[0]) + 5) * 0.9f) / 2; - gDisplayListHead = draw_box(gDisplayListHead, 0xA0 - var_t0, 0x0000007B, var_t0 + 0xA0, 0x000000A4, 0, - 0, 0, 0x00000096); - set_text_color(TEXT_GREEN); - print_text1_center_mode_1(0x0000009B, 0x0000008C, gCourseNamesDup[0], 0, 0.9f, 0.9f); - temp_v1 = func_800B4EB4(0, 7) & 0xFFFFF; - if (temp_v1 < 0x1EAA) { - set_text_color((s32) gGlobalTimer % 2); - } else if (temp_v1 < 0x2329) { - set_text_color((s32) gGlobalTimer % 3); - } else { - set_text_color(TEXT_YELLOW); - } - get_time_record_minutes(temp_v1, sp80); - func_800939C8(0x00000077, 0x000000A0, sp80, 0, 1.0f, 1.0f); - print_text_mode_1(0x0000008B, 0x000000A0, "'", 0, 1.0f, 1.0f); - get_time_record_seconds(temp_v1, sp80); - func_800939C8(0x00000094, 0x000000A0, sp80, 0, 1.0f, 1.0f); - print_text_mode_1(0x000000A7, 0x000000A0, "\"", 0, 1.0f, 1.0f); - get_time_record_centiseconds(temp_v1, sp80); - func_800939C8(0x000000B4, 0x000000A0, sp80, 0, 1.0f, 1.0f); - break; - case MENU_ITEM_UI_NO_CONTROLLER: - var_t0 = get_string_width(gTextNoController[0]); - temp_v1 = get_string_width(gTextNoController[1]); - if (var_t0 < temp_v1) { - var_t0 = temp_v1; - } - temp_t2 = (s32) (var_t0 * why) / 2; - temp_t5 = (s32) (((why * 2) + 0.5) * 16.0) / 2; - gDisplayListHead = draw_box(gDisplayListHead, 0xA0 - temp_t2, 0xB6 - temp_t5, temp_t2 + 0xA0, - temp_t5 + 0xB6, 0, 0, 0, 0x00000096); - set_text_color(TEXT_BLUE_GREEN_RED_CYCLE_1); - for (temp_t9 = 0; temp_t9 < 2; temp_t9++) { - print_text1_center_mode_1(0xA0 * one - floatone * why, - (s32) (0xB4 * one + ((f32) (temp_t9 * 0x12) * why)), - gTextNoController[temp_t9], 0, why, why); - } - break; - case MAIN_MENU_BACKGROUND: - case CHARACTER_SELECT_BACKGROUND: - case COURSE_SELECT_BACKGROUND: - gDisplayListHead = func_8009BC9C_2(gDisplayListHead, gMenuTexturesBackground[has_unlocked_extra_mode()], - arg0->column, arg0->row, 3, 0, arg0); - break; - case MENU_ITEM_UI_GAME_SELECT: - gDisplayListHead = - render_menu_textures(gDisplayListHead, seg2_game_select_texture, arg0->column, arg0->row); - break; - case MENU_ITEM_UI_1P_GAME: - case MENU_ITEM_UI_2P_GAME: - case MENU_ITEM_UI_3P_GAME: - case MENU_ITEM_UI_4P_GAME: - var_a1 = arg0->type - 0xB; - func_800A8270(var_a1, arg0); - func_800A0FA4(arg0, var_a1); - break; - case MENU_ITEM_UI_OK: - func_800A8564(arg0); - gDisplayListHead = - func_8009BC9C_2(gDisplayListHead, D_0200487C, arg0->column, arg0->row, 2, arg0->param1, NULL); - break; - case MAIN_MENU_OPTION_GFX: - case MAIN_MENU_DATA_GFX: - var_a1 = arg0->type - 0xF; - if (arg0->param1 < 0x20) { - temp_t9 = (arg0->param1 * 0x3A) / 64; - if (var_a1 == gMainMenuSelection) { - gDisplayListHead = - draw_flash_select_case_fast(gDisplayListHead, arg0->column + temp_t9, arg0->row, - (arg0->column - temp_t9) + 0x39, arg0->row + 0x12); - } else { - gDisplayListHead = - draw_box_fill(gDisplayListHead, arg0->column + temp_t9, arg0->row, - (arg0->column - temp_t9) + 0x39, arg0->row + 0x12, 1, 1, 1, 0x000000FF); - } - } - var_v1 = arg0->type - 0xA; - gDisplayListHead = func_8009BC9C_2(gDisplayListHead, D_800E8254[var_v1], arg0->column, arg0->row, 2, - arg0->param1, NULL); - break; - case MAIN_MENU_50CC: - case MAIN_MENU_100CC: - case MAIN_MENU_150CC: - case MAIN_MENU_EXTRA_CC: - case MENU_ITEM_TYPE_016: - case MENU_ITEM_TYPE_017: - case MAIN_MENU_TIME_TRIALS_BEGIN: - case MAIN_MENU_TIME_TRIALS_DATA: - var_v1 = gGameModeSubMenuColumn[gPlayerCount - 1][gGameModeMenuColumn[gPlayerCount - 1]]; - var_a1 = gGameModePlayerSelection[gPlayerCount - 1][gGameModeMenuColumn[gPlayerCount - 1]]; - switch (arg0->type) { /* switch 5 */ - case MAIN_MENU_50CC: /* switch 5 */ - case MAIN_MENU_100CC: /* switch 5 */ - case MAIN_MENU_150CC: /* switch 5 */ - case MAIN_MENU_EXTRA_CC: /* switch 5 */ - switch (var_a1) { - case 0: - case 2: - break; - default: - var_v1 = -1; - break; - } - - var_a1 = MAIN_MENU_50CC; - sp9C = segmented_to_virtual_dupe(D_800E8294[arg0->type - MAIN_MENU_50CC]); - break; - case MENU_ITEM_TYPE_016: /* switch 5 */ - case MENU_ITEM_TYPE_017: /* switch 5 */ - if (var_a1 != 2) { - var_v1 = -1; - } else { - var_a1 = MENU_ITEM_TYPE_016; - sp9C = segmented_to_virtual_dupe(D_800E82A4[arg0->type - MENU_ITEM_TYPE_016]); - } - break; - case MAIN_MENU_TIME_TRIALS_BEGIN: /* switch 5 */ - case MAIN_MENU_TIME_TRIALS_DATA: /* switch 5 */ - if (var_a1 != 1) { - var_v1 = -1; - } else { - var_a1 = MAIN_MENU_TIME_TRIALS_BEGIN; - sp9C = segmented_to_virtual_dupe(D_800E82AC[arg0->type - MAIN_MENU_TIME_TRIALS_BEGIN]); - } - break; - } - if (var_v1 == -1) { - break; - } - if ((gMainMenuSelection >= MAIN_MENU_MODE_SUB_SELECT) && (var_v1 == (arg0->type - var_a1))) { - if (gMainMenuSelection > MAIN_MENU_MODE_SUB_SELECT) { - gDisplayListHead = - draw_box_fill(gDisplayListHead, arg0->column, arg0->row, arg0->column + 0x3F, - arg0->row + 0x11, 0x000000FF, 0x000000F9, 0x000000DC, 0x000000FF); - } else { - gDisplayListHead = draw_flash_select_case_slow( - gDisplayListHead, arg0->column ^ 0, arg0->row ^ 0, arg0->column + 0x3F, arg0->row + 0x11); - } - } else { - gDisplayListHead = draw_box_fill(gDisplayListHead, arg0->column, arg0->row, arg0->column + 0x3F, - arg0->row + 0x11, 1, 1, 1, 0x000000FF); - } - gDisplayListHead = render_menu_textures(gDisplayListHead, sp9C, arg0->column, arg0->row); - break; - case MENU_ITEM_TYPE_01B: - if (arg0->state == 2) { - gDPSetTextureFilter(gDisplayListHead++, G_TF_BILERP); - } else { - gDPSetTextureFilter(gDisplayListHead++, G_TF_POINT); - } - func_800A10CC(arg0); - break; - case CHARACTER_SELECT_MENU_PLAYER_SELECT_BANNER: - gDisplayListHead = render_menu_textures(gDisplayListHead, D_02004B4C, arg0->column, arg0->row); - break; - case CHARACTER_SELECT_MENU_1P_CURSOR: - case CHARACTER_SELECT_MENU_2P_CURSOR: - case CHARACTER_SELECT_MENU_3P_CURSOR: - case CHARACTER_SELECT_MENU_4P_CURSOR: - temp_a0 = arg0->type - CHARACTER_SELECT_MENU_1P_CURSOR; - if (gCharacterGridSelections[temp_a0]) { - if (gCharacterGridIsSelected[temp_a0] == 0) { - temp_t2 = 0x000000FF; - } else { - temp_t2 = gGlobalTimer % 16; - if (temp_t2 >= 8) { - temp_t2 = (-temp_t2 * 8) + 0x80; - } else { - temp_t2 *= 8; - } - temp_t2 += 0xBF; - } - render_cursor_player(arg0, temp_a0, temp_t2); - } - break; - case CHARACTER_SELECT_MENU_OK: - func_800A8564(arg0); - gDisplayListHead = - func_8009BC9C_2(gDisplayListHead, D_02004B74, arg0->column, arg0->row, 2, arg0->param1, NULL); - break; - case CHARACTER_SELECT_MENU_MARIO: - case CHARACTER_SELECT_MENU_LUIGI: - case CHARACTER_SELECT_MENU_TOAD: - case CHARACTER_SELECT_MENU_PEACH: - case CHARACTER_SELECT_MENU_YOSHI: - case CHARACTER_SELECT_MENU_DK: - case CHARACTER_SELECT_MENU_WARIO: - case CHARACTER_SELECT_MENU_BOWSER: - func_800A12BC(arg0, segmented_to_virtual_dupe(D_800E7D54[arg0->type - 0x2B])); - /* fallthrough */ - case MENU_ITEM_TYPE_0A0: - case MENU_ITEM_TYPE_0A1: - func_8009A76C(arg0->D_8018DEE0_index, arg0->column, arg0->row, arg0->param1); - break; - case MENU_ITEM_TYPE_058: - case COURSE_SELECT_COURSE_NAMES: - case MENU_ITEM_TYPE_05A: - case MENU_ITEM_TYPE_05B: - case COURSE_SELECT_BATTLE_NAMES: - func_800A8A98(arg0); - gDisplayListHead = render_menu_textures( - gDisplayListHead, - segmented_to_virtual_dupe(gMenuTexturesTrackSelection[arg0->type - COURSE_SELECT_MAP_SELECT]), - arg0->column, arg0->row); - func_800A8CA4(arg0); - break; - case COURSE_SELECT_MAP_SELECT: - gDisplayListHead = render_menu_textures( - gDisplayListHead, - segmented_to_virtual_dupe(gMenuTexturesTrackSelection[arg0->type - COURSE_SELECT_MAP_SELECT]), - arg0->column, arg0->row); - break; - case MENU_ITEM_TYPE_05F: - case MENU_ITEM_TYPE_060: - case MENU_ITEM_TYPE_061: - case MENU_ITEM_TYPE_062: - func_800A1500(arg0); - break; - case COURSE_SELECT_MUSHROOM_CUP: - case COURSE_SELECT_FLOWER_CUP: - case COURSE_SELECT_STAR_CUP: - case COURSE_SELECT_SPECIAL_CUP: - var_a1 = arg0->type - 0x53; - func_800A890C(var_a1, arg0); - func_800A143C(arg0, var_a1); - break; - case COURSE_SELECT_OK: - func_800A8564(arg0); - gDisplayListHead = - func_8009BC9C_2(gDisplayListHead, D_02004E80, arg0->column, arg0->row, 2, arg0->param1, NULL); - break; - case MENU_ITEM_TYPE_065: - case MENU_ITEM_TYPE_066: - if (arg0->type == MENU_ITEM_TYPE_065) { - scaleX = 0.6f; - } else { - scaleX = 0.8f; - } - func_800A86E8(arg0); - set_text_color(TEXT_YELLOW); - print_text_mode_1(arg0->column + 8, arg0->row + 0x10, gBestTimeText[arg0->type - 0x65], 0, scaleX, - 0.8f); - func_800A874C(arg0); - break; - case MENU_ITEM_TYPE_06E: - render_battle_introduction(arg0); - break; - case MENU_ITEM_TYPE_067: - func_800A8EC0(arg0); - break; - case MENU_ITEM_TYPE_068: - gDisplayListHead = draw_box_fill(gDisplayListHead, arg0->column, arg0->row, arg0->column + 0x3F, - arg0->row + 0x11, 1, 1, 1, 0x000000FF); - gDisplayListHead = render_menu_textures( - gDisplayListHead, segmented_to_virtual_dupe(D_800E8294[gCCSelection]), arg0->column, arg0->row); - break; - case MENU_ITEM_TYPE_069: - func_800A8F48(arg0); - break; - case MENU_ITEM_TYPE_078: - case MENU_ITEM_TYPE_079: - case MENU_ITEM_TYPE_07A: - case MENU_ITEM_TYPE_07B: - var_a1 = arg0->type - 0x78; - func_800A90D4(var_a1, arg0); - func_800A143C(arg0, var_a1); - break; - case MENU_ITEM_TYPE_08C: - if ((gMainMenuSelection >= MAIN_MENU_MODE_SUB_SELECT) && (var_a1 == (arg0->type - var_v1))) { - if (gMainMenuSelection > MAIN_MENU_MODE_SUB_SELECT) { - gDisplayListHead = - draw_box_fill(gDisplayListHead, arg0->column, arg0->row, arg0->column + 0x3F, - arg0->row + 0x11, 0x000000FF, 0x000000F9, 0x000000DC, 0x000000FF); - } else { - gDisplayListHead = draw_flash_select_case_slow( - gDisplayListHead, arg0->column ^ 0, arg0->row ^ 0, arg0->column + 0x3F, arg0->row + 0x11); - } - } else { - gDisplayListHead = draw_box_fill(gDisplayListHead, arg0->column, arg0->row, arg0->column + 0x3F, - arg0->row + 0x11, 1, 1, 1, 0x000000FF); - } - gDisplayListHead = render_menu_textures(gDisplayListHead, seg2_data_texture, arg0->column, arg0->row); - set_text_color(TEXT_YELLOW); - print_text1_left(0x00000125, 0x0000001C, gTextMenuData, 0, 0.55f, 0.55f); - break; - case MENU_ITEM_TYPE_08D: - func_800A1780(arg0); - break; - case MENU_ITEM_TYPE_07C: - case MENU_ITEM_TYPE_07D: - case MENU_ITEM_TYPE_07E: - case MENU_ITEM_TYPE_07F: - case MENU_ITEM_TYPE_080: - case MENU_ITEM_TYPE_081: - case MENU_ITEM_TYPE_082: - case MENU_ITEM_TYPE_083: - case MENU_ITEM_TYPE_084: - case MENU_ITEM_TYPE_085: - case MENU_ITEM_TYPE_086: - case MENU_ITEM_TYPE_087: - case MENU_ITEM_TYPE_088: - case MENU_ITEM_TYPE_089: - case MENU_ITEM_TYPE_08A: - case MENU_ITEM_TYPE_08B: - func_800A15EC(arg0); - break; - case MENU_ITEM_TYPE_096: - set_text_color(TEXT_BLUE_GREEN_RED_CYCLE_1); - print_text1_left(arg0->column, arg0->row, gCupNames[D_800DC540], arg0->param1, arg0->paramf, 1.0f); - break; - case MENU_ITEM_TYPE_097: - set_text_color(TEXT_BLUE_GREEN_RED_CYCLE_2); - print_text_mode_1(arg0->column, arg0->row, gCourseNames[gCurrentCourseId], arg0->param1, arg0->paramf, - 1.0f); - break; - case MENU_ITEM_TYPE_098: - func_800A2D1C(arg0); - break; - case MENU_ITEM_TYPE_05E: - gDisplayListHead = func_80096CD8(gDisplayListHead, 0x00000019, 0x00000072, 0x0000007CU, 0x0000004AU); - break; - case MENU_ITEM_TYPE_0AA: - // scissor - gEXSetScissor(gDisplayListHead++, G_SC_NON_INTERLACE, G_EX_ORIGIN_LEFT, G_EX_ORIGIN_RIGHT, 0, 0, - SCREEN_WIDTH, SCREEN_HEIGHT); - // color - gDPSetPrimColor(gDisplayListHead++, 0, 0, 0, 0, 0, 255); - // black box in the top-right - gEXTextureRectangle(gDisplayListHead++, G_EX_ORIGIN_LEFT, G_EX_ORIGIN_RIGHT, (SCREEN_WIDTH / 2) * 4, - 0 * 4, SCREEN_WIDTH * 4, (SCREEN_HEIGHT / 2) * 4, 0, 0, 0, 0, 0); - // black box in the bottom-left - gEXTextureRectangle(gDisplayListHead++, G_EX_ORIGIN_LEFT, G_EX_ORIGIN_RIGHT, 0 * 4, - (SCREEN_HEIGHT / 2) * 4, (-SCREEN_WIDTH / 2) * 4, SCREEN_HEIGHT * 4, 0, 0, 0, 0, - 0); - func_800A2EB8(arg0); - break; - case MENU_ITEM_TYPE_0AB: - // scissor - gEXSetScissor(gDisplayListHead++, G_SC_NON_INTERLACE, G_EX_ORIGIN_LEFT, G_EX_ORIGIN_RIGHT, 0, 0, - SCREEN_WIDTH, SCREEN_HEIGHT); - // color - gDPSetPrimColor(gDisplayListHead++, 0, 0, 0, 0, 0, 255); - // black box in the top-left - gEXTextureRectangle(gDisplayListHead++, G_EX_ORIGIN_LEFT, G_EX_ORIGIN_RIGHT, 0 * 4, 0 * 4, - (-SCREEN_WIDTH / 2) * 4, (SCREEN_HEIGHT / 2) * 4, 0, 0, 0, 0, 0); - // black box in the bottom-right - gEXTextureRectangle(gDisplayListHead++, G_EX_ORIGIN_LEFT, G_EX_ORIGIN_RIGHT, (SCREEN_WIDTH / 2) * 4, - (SCREEN_HEIGHT / 2) * 4, SCREEN_WIDTH * 4, SCREEN_HEIGHT * 4, 0, 0, 0, 0, 0); - - func_800A34A8(arg0); - - break; - case MENU_ITEM_TYPE_0AC: - func_800A6154(arg0); - break; - case MENU_ITEM_TYPE_0AF: - func_800A6034(arg0); - break; - case MENU_ITEM_TYPE_0B0: - func_800A638C(arg0); - break; - case MENU_ITEM_TYPE_0B1: - case MENU_ITEM_TYPE_0B2: - case MENU_ITEM_TYPE_0B3: - case MENU_ITEM_TYPE_0B4: - if (arg0->state != 0) { - var_v1 = arg0->type - MENU_ITEM_TYPE_0B1; - gDisplayListHead = render_menu_textures( - gDisplayListHead, - segmented_to_virtual_dupe(D_800E7D54[D_800EFD64[gCharacterSelections[var_v1]]]), arg0->column, - arg0->row); - func_8009A7EC(arg0->D_8018DEE0_index, arg0->column, arg0->row, var_v1, arg0->param1); - render_cursor_player(arg0, var_v1, 0x000000FF); - } - break; - case MENU_ITEM_TYPE_0B9: - time_trials_finish_text_render(arg0); - break; - case MENU_ITEM_TYPE_0BA: - func_800A3E60(arg0); - break; - case MENU_ITEM_ANNOUNCE_GHOST: - render_menu_item_announce_ghost(arg0); - break; - case MENU_ITEM_PAUSE: - render_pause_menu(arg0); - break; - case MENU_ITEM_END_COURSE_OPTION: - render_menu_item_end_course_option(arg0); - break; - case MENU_ITEM_DATA_COURSE_IMAGE: - render_menu_item_data_course_image(arg0); - break; - case MENU_ITEM_DATA_COURSE_INFO: - render_menu_item_data_course_info(arg0); - break; - case MENU_ITEM_DATA_COURSE_SELECTABLE: - menu_item_data_course_selectable(arg0); - break; - case MENU_ITEM_TYPE_0E9: - func_800A1DE0(arg0); - break; - case MENU_ITEM_TYPE_0EA: - func_800A1F30(arg0); - break; - case MENU_ITEM_TYPE_0F0: - func_800A1FB0(arg0); - break; - case MENU_ITEM_TYPE_0F1: - gDisplayListHead = render_menu_textures(gDisplayListHead, D_02004638, arg0->column, arg0->row); - break; - case MENU_ITEM_TYPE_10E: - func_800A70E8(arg0); - break; - case MENU_ITEM_TYPE_12B: - func_800A7258(arg0); - break; - case MENU_ITEM_TYPE_12C: - func_800A72FC(arg0); - break; - case MENU_ITEM_TYPE_12D: - func_800A7448(arg0); - break; - case MENU_ITEM_TYPE_12E: - func_800A75A0(arg0); - break; - case MENU_ITEM_TYPE_12F: - func_800A761C(arg0); - break; - case MENU_ITEM_TYPE_130: - if (arg0->state != 0) { - gDisplayListHead = render_menu_textures( - gDisplayListHead, segmented_to_virtual_dupe(D_800E7D54[D_800EFD64[D_802874D8.unk1E]]), - arg0->column, arg0->row); - func_8009A7EC(arg0->D_8018DEE0_index, arg0->column, arg0->row, 0, arg0->param1); - } - break; - case MENU_ITEM_TYPE_190: - case MENU_ITEM_TYPE_191: - case MENU_ITEM_TYPE_192: - case MENU_ITEM_TYPE_193: - case MENU_ITEM_TYPE_194: - case MENU_ITEM_TYPE_195: - case MENU_ITEM_TYPE_196: - case MENU_ITEM_TYPE_197: - case MENU_ITEM_TYPE_198: - case MENU_ITEM_TYPE_199: - case MENU_ITEM_TYPE_19A: - case MENU_ITEM_TYPE_19B: - case MENU_ITEM_TYPE_19C: - case MENU_ITEM_TYPE_19D: - case MENU_ITEM_TYPE_19E: - case MENU_ITEM_TYPE_19F: - case MENU_ITEM_TYPE_1A0: - case MENU_ITEM_TYPE_1A1: - case MENU_ITEM_TYPE_1A2: - case MENU_ITEM_TYPE_1A3: - case MENU_ITEM_TYPE_1A4: - case MENU_ITEM_TYPE_1A5: - case MENU_ITEM_TYPE_1A6: - case MENU_ITEM_TYPE_1A7: - case MENU_ITEM_TYPE_1A8: - case MENU_ITEM_TYPE_1A9: - case MENU_ITEM_TYPE_1AA: - case MENU_ITEM_TYPE_1AB: - case MENU_ITEM_TYPE_1AC: - case MENU_ITEM_TYPE_1AD: - case MENU_ITEM_TYPE_1AE: - case MENU_ITEM_TYPE_1AF: - case MENU_ITEM_TYPE_1B0: - case MENU_ITEM_TYPE_1B1: - case MENU_ITEM_TYPE_1B2: - case MENU_ITEM_TYPE_1B3: - case MENU_ITEM_TYPE_1B4: - case MENU_ITEM_TYPE_1B5: - case MENU_ITEM_TYPE_1B6: - case MENU_ITEM_TYPE_1B7: - case MENU_ITEM_TYPE_1B8: - case MENU_ITEM_TYPE_1B9: - case MENU_ITEM_TYPE_1BA: - case MENU_ITEM_TYPE_1BB: - case MENU_ITEM_TYPE_1BC: - case MENU_ITEM_TYPE_1BD: - case MENU_ITEM_TYPE_1BE: - case MENU_ITEM_TYPE_1BF: - case MENU_ITEM_TYPE_1C0: - case MENU_ITEM_TYPE_1C1: - case MENU_ITEM_TYPE_1C2: - case MENU_ITEM_TYPE_1C3: - case MENU_ITEM_TYPE_1C4: - case MENU_ITEM_TYPE_1C5: - case MENU_ITEM_TYPE_1C6: - case MENU_ITEM_TYPE_1C7: - case MENU_ITEM_TYPE_1C8: - case MENU_ITEM_TYPE_1C9: - case MENU_ITEM_TYPE_1CA: - case MENU_ITEM_TYPE_1CB: - case MENU_ITEM_TYPE_1CC: - case MENU_ITEM_TYPE_1CD: - case MENU_ITEM_TYPE_1CE: - menu_item_credits_render(arg0); - break; - } - } -} -#endif - -#if 1 -Gfx* func_8009BC9C_2(Gfx* arg0, MenuTexture* arg1, s32 arg2, s32 arg3, s32 arg4, s32 arg5, MenuItem* item) { - MenuTexture* var_s0; - u8* temp_v0_3; - - var_s0 = segmented_to_virtual_dupe(arg1); - while (var_s0->textureData != NULL) { - switch (var_s0->type) { - case 0: - gSPDisplayList(arg0++, (Gfx*) 0x2007708); - break; - case 1: - gSPDisplayList(arg0++, (Gfx*) 0x2007728); - break; - } - temp_v0_3 = (u8*) func_8009B8C4(var_s0->textureData); - if (temp_v0_3 != 0) { - switch (arg4) { - case 1: - arg0 = func_80097AE4(arg0, 0, var_s0->dX + arg2, var_s0->dY + arg3, temp_v0_3, arg5); - break; - case 2: - arg0 = func_80097E58(arg0, 0, 0, 0U, var_s0->width, var_s0->height, var_s0->dX + arg2, - var_s0->dY + arg3, temp_v0_3, var_s0->width, var_s0->height, arg5); - break; - case 3: - // Background - if (item == NULL) - goto defaultDraw; - switch (item->type) { - case 35: - case 36: - case 37: - arg0 = drawBackground(arg0, 0, 0, 0, var_s0->width, var_s0->height, var_s0->dX + arg2, - var_s0->dY + arg3, temp_v0_3, var_s0->width, var_s0->height); - break; - default: - defaultDraw: - arg0 = func_80097A14(arg0, 0, 0, 0, var_s0->width, var_s0->height, var_s0->dX + arg2, - var_s0->dY + arg3, temp_v0_3, var_s0->width, var_s0->height); - break; - } - break; - case 4: - arg0 = func_80097274(arg0, 0, 0x00000400, 0x00000400, 0, 0, var_s0->width, var_s0->height, - var_s0->dX + arg2, var_s0->dY + arg3, (u16*) temp_v0_3, var_s0->width, - var_s0->height, arg5); - break; - } - } - var_s0++; - } - return arg0; -} -#endif \ No newline at end of file diff --git a/patches/object_tagging.c b/patches/object_tagging.c deleted file mode 100644 index 70ba482..0000000 --- a/patches/object_tagging.c +++ /dev/null @@ -1,2942 +0,0 @@ -#include "patches.h" - -#if 1 // GLOBAL -typedef enum ObjectList { - /* 10 */ OBJECT_10 = 10, - /* 10 */ OBJECT_11, - /* 10 */ OBJECT_12 -} ObjectList; - -// Sets statis visibility for some objects -// used by: -// render_object_trash_bin -// render_object_snowmans_list_2 -// render_object_snowmans_list_1 -// render_object_smoke_particles -// func_80054D00 (moles) -// func_80054F04 (moles) -// func_80055228 (Unk Yoshi Valley object) -// render_object_seagulls -// render_object_crabs -// render_object_hedgehogs -// render_object_train_penguins -// func_80057114 (VS bomb karts?) -#if 0 // CRASHES THE GAME IN THE 4 PLAYER SHERBET LAND DEMO -RECOMP_PATCH s32 func_8008A364(s32 objectIndex, s32 cameraId, u16 arg2, s32 arg3) { - Camera* camera; - u32 dist; - u16 var_a2; - - camera = &camera1[cameraId]; - set_object_flag_status_false(objectIndex, 0x00020000 | VISIBLE); - dist = get_horizontal_distance_to_camera(objectIndex, camera); - if (1 /* dist < (arg3 * arg3)*/) { - set_object_flag_status_true(objectIndex, 0x00020000); - // if (dist < 0x2711U) { - // var_a2 = 0x5555; - // } else if (dist < 0x9C41U) { - // var_a2 = 0x4000; - // } else { - // var_a2 = arg2; - // } - if (1 /* is_object_visible_on_camera(objectIndex, camera, var_a2) != 0 */) { - set_object_flag_status_true(objectIndex, VISIBLE); - } - } - return dist; -} -#endif - -#if 1 -RECOMP_PATCH void render_player(Player* player, s8 playerId, s8 screenId) { - UNUSED s32 pad[2]; - s32 temp_t1; - s32 var_v1; - OSMesg* sp34; - - if ((gCamera1Skipped && (screenId == 0)) || (gCamera2Skipped && (screenId == 1)) || - (gCamera3Skipped && (screenId == 2)) || (gCamera4Skipped && (screenId == 3))) { - // Skip - // @recomp Tag the transform - gEXMatrixGroupDecomposed(gDisplayListHead++, (TAG_OBJECT(player) << 16) | playerId << 8 | screenId, G_EX_PUSH, G_MTX_MODELVIEW, - G_EX_COMPONENT_AUTO, G_EX_COMPONENT_SKIP, G_EX_COMPONENT_AUTO, - G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_SKIP, - G_EX_COMPONENT_INTERPOLATE, G_EX_ORDER_AUTO, G_EX_EDIT_ALLOW); - } else { - // @recomp Tag the transform - gEXMatrixGroupDecomposed(gDisplayListHead++, (TAG_OBJECT(player) << 16) | playerId << 8 | screenId, G_EX_PUSH, G_MTX_MODELVIEW, - G_EX_COMPONENT_AUTO, G_EX_COMPONENT_AUTO, G_EX_COMPONENT_AUTO, - G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_SKIP, - G_EX_COMPONENT_INTERPOLATE, G_EX_ORDER_AUTO, G_EX_EDIT_ALLOW); - } - - update_wheel_palette(player, playerId, screenId, D_801651D0[screenId][playerId]); - if (!(player->unk_002 & (4 << (screenId * 4)))) { - var_v1 = 0; - } else { - var_v1 = 8; - } - func_80023BF0(player, playerId, screenId, var_v1); - temp_t1 = 8 << (screenId * 4); - if ((temp_t1 == (player->unk_002 & temp_t1)) && (player->collision.surfaceDistance[2] <= 50.0f) && - (player->surfaceType != ICE)) { - if ((gCamera1Skipped && (screenId == 0)) || (gCamera2Skipped && (screenId == 1)) || - (gCamera3Skipped && (screenId == 2)) || (gCamera4Skipped && (screenId == 3))) { - // Skip - // @recomp Tag the transform - gEXMatrixGroupDecomposed(gDisplayListHead++, - (TAG_OBJECT(player) << 16) & 0xFFFF0000 | playerId << 8 | screenId, G_EX_PUSH, - G_MTX_MODELVIEW, G_EX_COMPONENT_AUTO, G_EX_COMPONENT_SKIP, G_EX_COMPONENT_AUTO, - G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_SKIP, - G_EX_COMPONENT_INTERPOLATE, G_EX_ORDER_AUTO, G_EX_EDIT_ALLOW); - } else { - gEXMatrixGroupDecomposed(gDisplayListHead++, - (TAG_OBJECT(player) << 16) & 0xFFFF0000 | playerId << 8 | screenId, G_EX_PUSH, - G_MTX_MODELVIEW, G_EX_COMPONENT_AUTO, G_EX_COMPONENT_AUTO, G_EX_COMPONENT_AUTO, - G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_SKIP, - G_EX_COMPONENT_INTERPOLATE, G_EX_ORDER_AUTO, G_EX_EDIT_ALLOW); - } - if ((player->effects & BOO_EFFECT) == BOO_EFFECT) { - if (playerId == screenId) { - render_player_shadow(player, playerId, screenId); - } - } else { - render_player_shadow(player, playerId, screenId); - } - // @recomp Pop the transform id. - gEXPopMatrixGroup(gDisplayListHead++, G_MTX_MODELVIEW); - } - if ((player->type & PLAYER_INVISIBLE_OR_BOMB) != PLAYER_INVISIBLE_OR_BOMB) { - if ((gCamera1Skipped && (screenId == 0)) || (gCamera2Skipped && (screenId == 1)) || - (gCamera3Skipped && (screenId == 2)) || (gCamera4Skipped && (screenId == 3))) { - // Skip - // @recomp Tag the transform - gEXMatrixGroupDecomposed(gDisplayListHead++, - (TAG_OBJECT(player) << 16) & 0xFFFF0000 | playerId << 8 | screenId, G_EX_PUSH, - G_MTX_MODELVIEW, G_EX_COMPONENT_AUTO, G_EX_COMPONENT_SKIP, G_EX_COMPONENT_AUTO, - G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_SKIP, - G_EX_COMPONENT_INTERPOLATE, G_EX_ORDER_AUTO, G_EX_EDIT_ALLOW); - } else { - gEXMatrixGroupDecomposed(gDisplayListHead++, - (TAG_OBJECT(player) << 16) & 0xFFFF0000 | playerId << 8 | screenId, G_EX_PUSH, - G_MTX_MODELVIEW, G_EX_COMPONENT_AUTO, G_EX_COMPONENT_AUTO, G_EX_COMPONENT_AUTO, - G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_SKIP, - G_EX_COMPONENT_INTERPOLATE, G_EX_ORDER_AUTO, G_EX_EDIT_ALLOW); - } - render_kart(player, playerId, screenId, var_v1); - - // @recomp Pop the transform id. - gEXPopMatrixGroup(gDisplayListHead++, G_MTX_MODELVIEW); - } else { - if ((gCamera1Skipped && (screenId == 0)) || (gCamera2Skipped && (screenId == 1)) || - (gCamera3Skipped && (screenId == 2)) || (gCamera4Skipped && (screenId == 3))) { - // Skip - // @recomp Tag the transform - gEXMatrixGroupDecomposed(gDisplayListHead++, - (TAG_OBJECT(player) << 16) & 0xFFFF0000 | playerId << 8 | screenId, G_EX_PUSH, - G_MTX_MODELVIEW, G_EX_COMPONENT_AUTO, G_EX_COMPONENT_SKIP, G_EX_COMPONENT_AUTO, - G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_SKIP, - G_EX_COMPONENT_INTERPOLATE, G_EX_ORDER_AUTO, G_EX_EDIT_ALLOW); - } else { - gEXMatrixGroupDecomposed(gDisplayListHead++, - (TAG_OBJECT(player) << 16) & 0xFFFF0000 | playerId << 8 | screenId, G_EX_PUSH, - G_MTX_MODELVIEW, G_EX_COMPONENT_AUTO, G_EX_COMPONENT_AUTO, G_EX_COMPONENT_AUTO, - G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_SKIP, - G_EX_COMPONENT_INTERPOLATE, G_EX_ORDER_AUTO, G_EX_EDIT_ALLOW); - } - render_ghost(player, playerId, screenId, var_v1); - - // @recomp Pop the transform id. - gEXPopMatrixGroup(gDisplayListHead++, G_MTX_MODELVIEW); - } - osRecvMesg(&gDmaMesgQueue, (OSMesg*) &sp34, OS_MESG_BLOCK); - if ((temp_t1 == (player->unk_002 & temp_t1)) && (player->surfaceType == ICE) && ((player->unk_0CA & 1) != 1) && - (player->collision.surfaceDistance[2] <= 30.0f)) { - if ((gCamera1Skipped && (screenId == 0)) || (gCamera2Skipped && (screenId == 1)) || - (gCamera3Skipped && (screenId == 2)) || (gCamera4Skipped && (screenId == 3))) { - // Skip - // @recomp Tag the transform - gEXMatrixGroupDecomposed(gDisplayListHead++, - (TAG_OBJECT(player) << 16) & 0xFFFF0000 | playerId << 8 | screenId, G_EX_PUSH, - G_MTX_MODELVIEW, G_EX_COMPONENT_AUTO, G_EX_COMPONENT_SKIP, G_EX_COMPONENT_AUTO, - G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_SKIP, - G_EX_COMPONENT_INTERPOLATE, G_EX_ORDER_AUTO, G_EX_EDIT_ALLOW); - } else { - gEXMatrixGroupDecomposed(gDisplayListHead++, - (TAG_OBJECT(player) << 16) & 0xFFFF0000 | playerId << 8 | screenId, G_EX_PUSH, - G_MTX_MODELVIEW, G_EX_COMPONENT_AUTO, G_EX_COMPONENT_AUTO, G_EX_COMPONENT_AUTO, - G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_SKIP, - G_EX_COMPONENT_INTERPOLATE, G_EX_ORDER_AUTO, G_EX_EDIT_ALLOW); - } - render_player_ice_reflection(player, playerId, screenId, var_v1); - - // @recomp Pop the transform id. - gEXPopMatrixGroup(gDisplayListHead++, G_MTX_MODELVIEW); - } - if (player->boostPower >= 2.0f) { - if ((gCamera1Skipped && (screenId == 0)) || (gCamera2Skipped && (screenId == 1)) || - (gCamera3Skipped && (screenId == 2)) || (gCamera4Skipped && (screenId == 3))) { - // Skip - // @recomp Tag the transform - gEXMatrixGroupDecomposed(gDisplayListHead++, - (TAG_OBJECT(player) << 16) & 0xFFFF0000 | playerId << 8 | screenId, G_EX_PUSH, - G_MTX_MODELVIEW, G_EX_COMPONENT_AUTO, G_EX_COMPONENT_SKIP, G_EX_COMPONENT_AUTO, - G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_SKIP, - G_EX_COMPONENT_INTERPOLATE, G_EX_ORDER_AUTO, G_EX_EDIT_ALLOW); - } else { - gEXMatrixGroupDecomposed(gDisplayListHead++, - (TAG_OBJECT(player) << 16) & 0xFFFF0000 | playerId << 8 | screenId, G_EX_PUSH, - G_MTX_MODELVIEW, G_EX_COMPONENT_AUTO, G_EX_COMPONENT_AUTO, G_EX_COMPONENT_AUTO, - G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_SKIP, - G_EX_COMPONENT_INTERPOLATE, G_EX_ORDER_AUTO, G_EX_EDIT_ALLOW); - } - func_80025DE8(player, playerId, screenId, var_v1); - - // @recomp Pop the transform id. - gEXPopMatrixGroup(gDisplayListHead++, G_MTX_MODELVIEW); - } - - // @recomp Pop the transform id. - gEXPopMatrixGroup(gDisplayListHead++, G_MTX_MODELVIEW); -} -#endif - -// Balloons -#if 1 -RECOMP_PATCH void func_80053D74(s32 objectIndex, UNUSED s32 arg1, s32 vertexIndex) { - Object* object; - int i = 0; - Vtx* vtx = (Vtx*) 0x0d0060b0; - - if (gMatrixHudCount <= MTX_HUD_POOL_SIZE_MAX) { - object = &gObjectList[objectIndex]; - D_80183E80[2] = (s16) (object->unk_084[6] + 0x8000); - - gEXEnable(gDisplayListHead++); - - // @recomp Tag the transform. - gEXMatrixGroupDecomposedNormal(gDisplayListHead++, (objectIndex << 8) + i++, G_EX_PUSH, G_MTX_MODELVIEW, - G_EX_EDIT_ALLOW); - - rsp_set_matrix_transformation(object->pos, (u16*) D_80183E80, object->sizeScaling); - set_color_render((s32) object->unk_084[0], (s32) object->unk_084[1], (s32) object->unk_084[2], - (s32) object->unk_084[3], (s32) object->unk_084[4], (s32) object->unk_084[5], - (s32) object->primAlpha); - gSPVertex(gDisplayListHead++, &vtx[vertexIndex], 4, 0); - gSPDisplayList(gDisplayListHead++, (Gfx*) 0x0d006940); - - // @recomp Pop the transform id. - gEXPopMatrixGroup(gDisplayListHead++, G_MTX_MODELVIEW); - } -} -#endif - -// Ceremony balloons -#if 1 -RECOMP_PATCH void balloon_update(CeremonyActor* actor) { - // @recomp Tag the transform. - gEXMatrixGroupDecomposedNormal(gDisplayListHead++, (u32) actor, G_EX_PUSH, G_MTX_MODELVIEW, G_EX_EDIT_ALLOW); - - render_balloon(actor->pos, 1.0f, actor->unk2E, actor->unk2C); - - // @recomp Pop the transform id. - gEXPopMatrixGroup(gDisplayListHead++, G_MTX_MODELVIEW); - - actor->pos[1] += 0.8f; - actor->unk2E = sins(actor->unk30) * actor->unk34; - actor->unk30 += actor->unk32; - actor->timer++; - - // Delete actor - if (actor->timer > 800) { - actor->isActive = 0; - } - if (D_802874B0[13] == 1) { - actor->isActive = 0; - } -} -#endif - -// Ceremony trophy star particles -#if 1 -RECOMP_PATCH void func_80054BE8(s32 cameraId) { - s32 i; - s32 temp_a0; - Camera* camera; - - camera = &camera1[cameraId]; - gSPDisplayList(gDisplayListHead++, (Gfx*) 0x0D007AE0); - load_texture_block_ia8_nomirror(D_8018D488, 0x00000020, 0x00000020); - func_8004B35C(0x000000FF, 0x000000FF, 0, 0x000000FF); - D_80183E80[0] = 0; - for (i = 0; i < gObjectParticle3_SIZE; i++) { - temp_a0 = gObjectParticle3[i]; - if ((temp_a0 != -1) && (gObjectList[temp_a0].state >= 2)) { - // @recomp Tag the transform. - gEXMatrixGroupDecomposedNormal(gDisplayListHead++, (u32) &gObjectList[temp_a0] << 16 | i, G_EX_PUSH, - G_MTX_MODELVIEW, G_EX_EDIT_ALLOW); - - func_80054AFC(temp_a0, camera->pos); - // @recomp Pop the transform id. - gEXPopMatrixGroup(gDisplayListHead++, G_MTX_MODELVIEW); - } - } -} -#endif - -#if 1 -RECOMP_PATCH void firework_update(Firework* actor) { - s32 i; - Vec3f pos; - if (actor->unk44 < 30) { - for (i = 0; i < 10; i++) { - pos[0] = actor->pos[0]; - pos[1] = actor->pos[1] - i * 2; - pos[2] = actor->pos[2]; - // @recomp Tag the transform. - gEXMatrixGroupDecomposedNormal(gDisplayListHead++, (u32) actor + i, G_EX_PUSH, G_MTX_MODELVIEW, - G_EX_EDIT_ALLOW); - - render_fireworks(pos, ((10 - i) / 10.0f) * 2, fireworkColour[actor->unk48], - (((((30 - actor->unk44) * 100)) / 30.0f))); - - // @recomp Pop the transform id. - gEXPopMatrixGroup(gDisplayListHead++, G_MTX_MODELVIEW); - } - - } else { - if (actor->unk2C < 5) { - actor->unk3C += actor->unk40 * 2; - actor->unk34 += actor->unk38 * 2; - } else { - actor->unk3C += actor->unk40 / (1.0f + (((actor->unk2C * 7) - 0x23) / 10.0f)); - actor->unk34 += actor->unk38 / (1.0f + (((actor->unk2C * 7) - 0x23) / 10.0f)); - if (actor->unk3C < 0) { - actor->unk3C = 0; - } - } - actor->unk2C += 1; - if (((actor->unk3C > 0) && ((actor->unk34 > 0.0f))) || (actor->unk2C < 30)) { - // @recomp Tag the transform. - gEXMatrixGroupDecomposedNormal(gDisplayListHead++, (u32) actor << 16, G_EX_PUSH, G_MTX_MODELVIEW, - G_EX_EDIT_ALLOW); - - render_fireworks(actor->pos, actor->unk34, actor->unk30, (s16) actor->unk3C); - - // @recomp Pop the transform id. - gEXPopMatrixGroup(gDisplayListHead++, G_MTX_MODELVIEW); - } else { - actor->isActive = 0; - } - } - actor->unk44 += 1; -} -#endif - -// Star particles -#if 1 -RECOMP_PATCH void func_800691B8(Player* player, s8 arg1, s16 arg2, s8 arg3) { - Vec3f sp5C; - Vec3s sp54; - s16 alpha; - - if (player->unk_258[30 + arg2].unk_01C == 1) { - alpha = player->unk_258[30 + arg2].unk_03E; - sp5C[0] = player->unk_258[30 + arg2].unk_000[0]; - sp5C[1] = player->unk_258[30 + arg2].unk_000[1]; - sp5C[2] = player->unk_258[30 + arg2].unk_000[2]; - sp54[0] = 0; - sp54[1] = player->unk_048[arg3]; - player->unk_258[30 + arg2].unk_03A += 0x1C71; - sp54[2] = player->unk_258[30 + arg2].unk_03A; - - // @recomp Tag the transform. - gEXMatrixGroupDecomposed(gDisplayListHead++, TAG_OBJECT(arg2) | OBJECT_10 << 16, G_EX_PUSH, G_MTX_MODELVIEW, - G_EX_COMPONENT_AUTO, G_EX_COMPONENT_AUTO, G_EX_COMPONENT_AUTO, - G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_SKIP, - G_EX_COMPONENT_INTERPOLATE, G_EX_ORDER_AUTO, G_EX_EDIT_ALLOW); - - func_800652D4(sp5C, sp54, player->size * 0.5); - gSPDisplayList(gDisplayListHead++, (Gfx*) 0x0D008D58); - gDPSetTextureLUT(gDisplayListHead++, G_TT_NONE); - gDPLoadTextureBlock(gDisplayListHead++, D_8018D488, G_IM_FMT_IA, G_IM_SIZ_8b, 32, 32, 0, - G_TX_NOMIRROR | G_TX_CLAMP, G_TX_NOMIRROR | G_TX_CLAMP, G_TX_NOMASK, G_TX_NOMASK, - G_TX_NOLOD, G_TX_NOLOD); - func_8004B35C(255, 255, 0, alpha); - gDPSetRenderMode(gDisplayListHead++, G_RM_ZB_CLD_SURF, G_RM_ZB_CLD_SURF2); - gSPVertex(gDisplayListHead++, (Vtx*) 0x800E87C0, 4, 0); - gSPDisplayList(gDisplayListHead++, (Gfx*) 0x0D008DA0); - gMatrixEffectCount++; - - // @recomp Pop the transform id. - gEXPopMatrixGroup(gDisplayListHead++, G_MTX_MODELVIEW); - } -} -#endif - -#if 1 -RECOMP_PATCH void func_800696CC(Player* player, UNUSED s8 arg1, s16 arg2, s8 arg3, f32 arg4) { - Vec3f sp5C; - Vec3s sp54; - s16 alpha; - - if (player->unk_258[30 + arg2].unk_01C == 1) { - alpha = player->unk_258[30 + arg2].unk_03E; - sp5C[0] = player->unk_258[30 + arg2].unk_000[0]; - sp5C[1] = player->unk_258[30 + arg2].unk_000[1]; - sp5C[2] = player->unk_258[30 + arg2].unk_000[2]; - sp54[0] = 0; - sp54[1] = player->unk_048[arg3]; - sp54[2] = 0; - - // @recomp Tag the transform. - gEXMatrixGroupDecomposed(gDisplayListHead++, TAG_OBJECT(arg2) | OBJECT_11 << 16, G_EX_PUSH, G_MTX_MODELVIEW, - G_EX_COMPONENT_AUTO, G_EX_COMPONENT_AUTO, G_EX_COMPONENT_AUTO, - G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_SKIP, - G_EX_COMPONENT_INTERPOLATE, G_EX_ORDER_AUTO, G_EX_EDIT_ALLOW); - - func_800652D4(sp5C, sp54, player->size * arg4); - gSPDisplayList(gDisplayListHead++, (Gfx*) 0x0D008D58); - gDPSetTextureLUT(gDisplayListHead++, G_TT_NONE); - gDPLoadTextureBlock(gDisplayListHead++, D_8018D488, G_IM_FMT_IA, G_IM_SIZ_8b, 32, 32, 0, - G_TX_NOMIRROR | G_TX_CLAMP, G_TX_NOMIRROR | G_TX_CLAMP, G_TX_NOMASK, G_TX_NOMASK, - G_TX_NOLOD, G_TX_NOLOD); - func_8004B35C(0x000000FF, 0x000000FF, 0, alpha); - gDPSetRenderMode(gDisplayListHead++, G_RM_ZB_CLD_SURF, G_RM_ZB_CLD_SURF2); - gSPVertex(gDisplayListHead++, (Vtx*) 0x800E87C0, 4, 0); - gSPDisplayList(gDisplayListHead++, (Gfx*) 0x0D008DA0); - gMatrixEffectCount += 1; - - // @recomp Pop the transform id. - gEXPopMatrixGroup(gDisplayListHead++, G_MTX_MODELVIEW); - } -} -#endif - -#if 1 -RECOMP_PATCH void func_80069938(Player* player, UNUSED s8 arg1, s16 arg2, s8 arg3) { - Vec3f sp5C; - Vec3s sp54; - s16 alpha; - - if (player->unk_258[30 + arg2].unk_01C == 1) { - alpha = player->unk_258[30 + arg2].unk_03E; - sp5C[0] = player->unk_258[30 + arg2].unk_000[0]; - sp5C[1] = player->unk_258[30 + arg2].unk_000[1]; - sp5C[2] = player->unk_258[30 + arg2].unk_000[2]; - sp54[0] = 0; - sp54[1] = player->unk_048[arg3]; - sp54[2] = player->unk_258[30 + arg2].unk_038; - - // @recomp Tag the transform. - gEXMatrixGroupDecomposed(gDisplayListHead++, TAG_OBJECT(arg2) | OBJECT_12 << 16, G_EX_PUSH, G_MTX_MODELVIEW, - G_EX_COMPONENT_AUTO, G_EX_COMPONENT_AUTO, G_EX_COMPONENT_AUTO, - G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_SKIP, - G_EX_COMPONENT_INTERPOLATE, G_EX_ORDER_AUTO, G_EX_EDIT_ALLOW); - - func_800652D4(sp5C, sp54, player->unk_258[30 + arg2].unk_00C * player->size); - gSPDisplayList(gDisplayListHead++, (Gfx*) 0x0D008D58); - gDPSetTextureLUT(gDisplayListHead++, G_TT_NONE); - gDPLoadTextureBlock(gDisplayListHead++, D_8018D488, G_IM_FMT_IA, G_IM_SIZ_8b, 32, 32, 0, - G_TX_NOMIRROR | G_TX_CLAMP, G_TX_NOMIRROR | G_TX_CLAMP, G_TX_NOMASK, G_TX_NOMASK, - G_TX_NOLOD, G_TX_NOLOD); - func_8004B35C(0x000000FF, 0x000000FF, 0, alpha); - gDPSetRenderMode(gDisplayListHead++, G_RM_ZB_CLD_SURF, G_RM_ZB_CLD_SURF2); - gSPVertex(gDisplayListHead++, (Vtx*) 0x800E87C0, 4, 0); - gSPDisplayList(gDisplayListHead++, (Gfx*) 0x0D008DA0); - gMatrixEffectCount += 1; - - // @recomp Pop the transform id. - gEXPopMatrixGroup(gDisplayListHead++, G_MTX_MODELVIEW); - } -} -#endif - -// EEEEEEEEEEEEEEEEEEEEEEEEEEEE -#if 1 -RECOMP_PATCH void func_80065AB0(Player* player, UNUSED s8 arg1, s16 arg2, s8 arg3) { - Vec3f spB4; - Vec3s spAC; - s32 var_s0; - s16 primRed; - s16 primGreen; - s16 primBlue; - s16 primAlpha; - s16 envRed; - s16 envGreen; - s16 envBlue; - s32 sp8C[] = { 0x00ffffff, 0x00ffff00, 0x00ff9600 }; - - if (player->unk_258[10 + arg2].unk_01C == 1) { - if (player->unk_204 >= 50) { - var_s0 = 1; - } else { - var_s0 = 0; - } - - primRed = player->unk_258[10 + arg2].unk_038; - primGreen = player->unk_258[10 + arg2].unk_03A; - primBlue = player->unk_258[10 + arg2].unk_03C; - primAlpha = player->unk_258[10 + arg2].unk_03E; - envRed = (sp8C[player->unk_258[10 + arg2].unk_040] >> 0x10) & 0xFF; - envGreen = (sp8C[player->unk_258[10 + arg2].unk_040] >> 0x08) & 0xFF; - envBlue = (sp8C[player->unk_258[10 + arg2].unk_040] >> 0x00) & 0xFF; - - spB4[0] = player->unk_258[10 + arg2].unk_000[0]; - spB4[1] = player->unk_258[10 + arg2].unk_000[1]; - spB4[2] = player->unk_258[10 + arg2].unk_000[2]; - spAC[0] = 0; - spAC[1] = player->unk_048[arg3]; - spAC[2] = 0; - - // @recomp Tag the transform. - gEXMatrixGroupDecomposed(gDisplayListHead++, player->type << 8 | arg2 | var_s0 << 16, G_EX_PUSH, - G_MTX_MODELVIEW, G_EX_COMPONENT_AUTO, G_EX_COMPONENT_AUTO, G_EX_COMPONENT_AUTO, - G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_SKIP, - G_EX_COMPONENT_INTERPOLATE, G_EX_ORDER_AUTO, G_EX_EDIT_ALLOW); - - func_800652D4(spB4, spAC, player->unk_258[10 + arg2].unk_00C * player->size); - - if (var_s0 == 0) { - // Blured E - gSPDisplayList(gDisplayListHead++, 0x0D008DB8); - gDPLoadTextureBlock(gDisplayListHead++, D_800E4770[var_s0][0], G_IM_FMT_I, G_IM_SIZ_8b, 16, 16, 0, - G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK, - G_TX_NOLOD, G_TX_NOLOD); - func_8004B72C(primRed, primGreen, primBlue, envRed, envGreen, envBlue, primAlpha); - gDPSetRenderMode(gDisplayListHead++, G_RM_ZB_XLU_SURF, G_RM_ZB_XLU_SURF2); - gSPDisplayList(gDisplayListHead++, 0xD008DF8); - } else { - // Normal E - gSPDisplayList(gDisplayListHead++, 0x0D008DB8); - gDPLoadTextureBlock(gDisplayListHead++, D_800E4770[var_s0][0], G_IM_FMT_I, G_IM_SIZ_8b, 32, 32, 0, - G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK, - G_TX_NOLOD, G_TX_NOLOD); - func_8004B72C(primRed, primGreen, primBlue, envRed, envGreen, envBlue, primAlpha); - gDPSetRenderMode(gDisplayListHead++, G_RM_ZB_XLU_SURF, G_RM_ZB_XLU_SURF2); - gSPDisplayList(gDisplayListHead++, 0x0D008E48); - } - gMatrixEffectCount += 1; - - // @recomp Pop the transform id. - gEXPopMatrixGroup(gDisplayListHead++, G_MTX_MODELVIEW); - } -} -#endif - -// Tag smoke and dust -#if 1 -RECOMP_PATCH void func_8006D474(Player* player, s8 playerId, s8 screenId) { - s16 i; - gEXEnable(gDisplayListHead++); // @recomp - - if ((player->unk_002 & (8 << (screenId * 4))) == (8 << (screenId * 4))) { - for (i = 0; i < 10; i++) { - // @recomp Tag the transform. - gEXMatrixGroupDecomposedNormal(gDisplayListHead++, TAG_SMOKE_DUST((playerId << 8) + i), G_EX_PUSH, - G_MTX_MODELVIEW, G_EX_EDIT_ALLOW); - switch (player->unk_258[i].unk_012) { - case 1: - if (gActiveScreenMode == SCREEN_MODE_3P_4P_SPLITSCREEN) { - if (screenId == playerId) { - func_8006538C(player, playerId, i, screenId); - } - } else { - - func_8006538C(player, playerId, i, screenId); - } - break; - case 6: - if (gActiveScreenMode == SCREEN_MODE_3P_4P_SPLITSCREEN) { - if (screenId == playerId) { - func_80066BAC(player, playerId, i, screenId); - } - } else if (screenId == playerId) { - func_80066BAC(player, playerId, i, screenId); - } - break; - } - // @recomp Pop the transform id. - gEXPopMatrixGroup(gDisplayListHead++, G_MTX_MODELVIEW); - - // @recomp Tag the transform. - gEXMatrixGroupDecomposedNormal(gDisplayListHead++, TAG_SMOKE_DUST((playerId << 8) + i + 30), G_EX_PUSH, - G_MTX_MODELVIEW, G_EX_EDIT_ALLOW); - - switch (player->unk_258[i + 30].unk_012) { - case 1: - case 9: - if (gActiveScreenMode == SCREEN_MODE_1P) { - func_800691B8(player, playerId, i, screenId); - } else if (screenId == playerId) { - func_800691B8(player, playerId, i, screenId); - } - break; - case 2: - if (gActiveScreenMode == SCREEN_MODE_1P) { - func_800696CC(player, playerId, i, screenId, player->unk_258[i + 30].unk_00C); - } else if (screenId == playerId) { - func_800696CC(player, playerId, i, screenId, player->unk_258[i + 30].unk_00C); - } - break; - case 3: - if (gActiveScreenMode == SCREEN_MODE_1P) { - func_80067280(player, playerId, i, screenId); - } else if (screenId == playerId) { - func_80067280(player, (s32) playerId, i, screenId); - } - break; - case 4: - if (gActiveScreenMode == SCREEN_MODE_1P) { - func_80069444(player, playerId, i, screenId); - } else if (screenId == playerId) { - func_80069444(player, playerId, i, screenId); - } - break; - case 5: - if (gActiveScreenMode == SCREEN_MODE_1P) { - func_80069938(player, playerId, i, screenId); - } else if (screenId == playerId) { - func_80069938(player, playerId, i, screenId); - } - break; - case 6: - if (gActiveScreenMode == SCREEN_MODE_1P) { - func_80069BA8(player, playerId, i, screenId); - } else if (screenId == playerId) { - func_80069BA8(player, playerId, i, screenId); - } - break; - case 7: - if (gActiveScreenMode == SCREEN_MODE_1P) { - func_80069DB8(player, playerId, i, screenId); - } else if (screenId == playerId) { - func_80069DB8(player, playerId, i, screenId); - } - break; - case 8: - if (gActiveScreenMode == SCREEN_MODE_1P) { - func_80067604(player, playerId, i, screenId); - } else if (screenId == playerId) { - func_80067604(player, playerId, i, screenId); - } - break; - } - // @recomp Pop the transform id. - gEXPopMatrixGroup(gDisplayListHead++, G_MTX_MODELVIEW); - - // @recomp Tag the transform. - gEXMatrixGroupDecomposedNormal(gDisplayListHead++, TAG_SMOKE_DUST((playerId << 8) + i + 10), G_EX_PUSH, - G_MTX_MODELVIEW, G_EX_EDIT_ALLOW); - switch (player->unk_258[i + 10].unk_012) { - case 1: - if (gActiveScreenMode == SCREEN_MODE_3P_4P_SPLITSCREEN) { - if (screenId == playerId) { - func_80065AB0(player, playerId, i, screenId); - } - } else { - func_80065AB0(player, playerId, i, screenId); - } - break; - case 2: - case 3: - case 4: - case 5: - if (gActiveScreenMode == SCREEN_MODE_3P_4P_SPLITSCREEN) { - if (screenId == playerId) { - func_80065F0C(player, playerId, i, screenId); - } - } else { - func_80065F0C(player, playerId, i, screenId); - } - break; - case 9: - if (gActiveScreenMode == SCREEN_MODE_3P_4P_SPLITSCREEN) { - if (screenId == playerId) { - func_800664E0(player, (s32) playerId, i, screenId); - } - } else { - func_800664E0(player, (s32) playerId, i, screenId); - } - break; - case 11: - if (gActiveScreenMode == SCREEN_MODE_3P_4P_SPLITSCREEN) { - if (screenId == playerId) { - func_8006A01C(player, playerId, i, screenId); - } - } else if (screenId == playerId) { - func_8006A01C(player, playerId, i, screenId); - } - break; - } - // @recomp Pop the transform id. - gEXPopMatrixGroup(gDisplayListHead++, G_MTX_MODELVIEW); - } - } - if ((gModeSelection == BATTLE) && (player->unk_002 & (2 << (screenId * 4)))) { - func_8006BA94(player, playerId, screenId); - } -} -#endif - -#if 1 -RECOMP_PATCH void func_80051ABC(s16 arg0, s32 arg1) { - s32 i; - s32 objectIndex; - Object* object; - u32 margin = 0; - - D_8018D228 = 0xFF; - gSPDisplayList(gDisplayListHead++, (Gfx*) 0x0D007A60); - if ((u8) D_8018D230 != 0) { - func_8004B414(255, 255, 255, 255); - for (i = 0; i < D_8018D1F0; i++) { - objectIndex = D_8018CC80[arg1 + i]; - object = &gObjectList[objectIndex]; - func_800519D4(objectIndex, object->unk_09C, arg0 - object->unk_09E); - } - } else { - func_8004B6C4(255, 255, 255); - for (i = 0; i < D_8018D1F0; i++) { - objectIndex = D_8018CC80[arg1 + i]; - object = &gObjectList[objectIndex]; - gEXMatrixGroupDecomposed(gDisplayListHead++, TAG_OBJECT(object), G_EX_PUSH, G_MTX_MODELVIEW, - G_EX_COMPONENT_AUTO, G_EX_COMPONENT_AUTO, G_EX_COMPONENT_AUTO, - G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_SKIP, - G_EX_COMPONENT_INTERPOLATE, G_EX_ORDER_LINEAR, G_EX_EDIT_ALLOW); - - gDPSetScissor(gDisplayListHead++, G_SC_NON_INTERLACE, 0 + margin, 0 + margin, SCREEN_WIDTH - margin, - SCREEN_HEIGHT - margin); - - func_800518F8(objectIndex, object->unk_09C, arg0 - object->unk_09E); - - // @recomp Pop the transform id. - gEXPopMatrixGroup(gDisplayListHead++, G_MTX_MODELVIEW); - } - } -} -#endif - -// Farm Moles -#if 0 -RECOMP_PATCH void func_80054D00(s32 objectIndex, s32 cameraId) { - Camera* camera; - - camera = &camera1[cameraId]; - if (gObjectList[objectIndex].state >= 3) { - func_8008A364(objectIndex, cameraId, 0x2AABU, 0x0000012C); - if (is_obj_flag_status_active(objectIndex, VISIBLE) != 0) { - gEXMatrixGroupDecomposed(gDisplayListHead++, TAG_OBJECT(&gObjectList[objectIndex]), G_EX_PUSH, - G_MTX_MODELVIEW, G_EX_COMPONENT_AUTO, G_EX_COMPONENT_AUTO, G_EX_COMPONENT_AUTO, - G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_SKIP, - G_EX_COMPONENT_INTERPOLATE, G_EX_ORDER_LINEAR, G_EX_EDIT_ALLOW); - - D_80183E80[0] = (s16) gObjectList[objectIndex].orientation[0]; - D_80183E80[1] = - func_800418AC(gObjectList[objectIndex].pos[0], gObjectList[objectIndex].pos[2], camera->pos); - D_80183E80[2] = (u16) gObjectList[objectIndex].orientation[2]; - func_80048130(gObjectList[objectIndex].pos, (u16*) D_80183E80, gObjectList[objectIndex].sizeScaling, - (u8*) gObjectList[objectIndex].activeTLUT, gObjectList[objectIndex].activeTexture, - (Vtx*) 0x0D0062B0, 32, 64, 32, 64, 5); - - // @recomp Pop the transform id. - gEXPopMatrixGroup(gDisplayListHead++, G_MTX_MODELVIEW); - } - } -} - -RECOMP_PATCH void func_80054E10(s32 objectIndex) { - if (gObjectList[objectIndex].state > 0) { - if (is_obj_flag_status_active(objectIndex, 0x00800000) != 0) { - gEXMatrixGroupDecomposed(gDisplayListHead++, TAG_OBJECT(&gObjectList[objectIndex]), G_EX_PUSH, - G_MTX_MODELVIEW, G_EX_COMPONENT_AUTO, G_EX_COMPONENT_AUTO, G_EX_COMPONENT_AUTO, - G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_SKIP, - G_EX_COMPONENT_INTERPOLATE, G_EX_ORDER_LINEAR, G_EX_EDIT_ALLOW); - - D_80183E50[0] = gObjectList[objectIndex].pos[0]; - D_80183E50[1] = gObjectList[objectIndex].surfaceHeight + 0.8; - D_80183E50[2] = gObjectList[objectIndex].pos[2]; - D_80183E70[0] = gObjectList[objectIndex].velocity[0]; - D_80183E70[1] = gObjectList[objectIndex].velocity[1]; - D_80183E70[2] = gObjectList[objectIndex].velocity[2]; - func_8004A9B8(gObjectList[objectIndex].sizeScaling); - - // @recomp Pop the transform id. - gEXPopMatrixGroup(gDisplayListHead++, G_MTX_MODELVIEW); - } - } -} - -RECOMP_PATCH void func_80054F04(s32 cameraId) { - s32 i; - s32 objectIndex; - Camera* camera = &camera1[cameraId]; - Object* object; - - gSPDisplayList(gDisplayListHead++, (Gfx*) 0x0D0079C8); - load_texture_block_rgba16_mirror((u8*) 0x6013670, 16, 16); - - for (i = 0; i < gObjectParticle2_SIZE; i++) { - objectIndex = gObjectParticle2[i]; - object = &gObjectList[objectIndex]; - - if (object->state > 0) { - func_8008A364(objectIndex, cameraId, 0x2AABU, 200); - if ((is_obj_flag_status_active(objectIndex, VISIBLE) != 0) && (gMatrixHudCount <= MTX_HUD_POOL_SIZE_MAX)) { - gEXMatrixGroupDecomposed(gDisplayListHead++, TAG_OBJECT(object) | (i << 16), G_EX_PUSH, G_MTX_MODELVIEW, - G_EX_COMPONENT_AUTO, G_EX_COMPONENT_AUTO, G_EX_COMPONENT_AUTO, - G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_SKIP, - G_EX_COMPONENT_INTERPOLATE, G_EX_ORDER_LINEAR, G_EX_EDIT_ALLOW); - - object->orientation[1] = func_800418AC(object->pos[0], object->pos[2], camera->pos); - rsp_set_matrix_gObjectList(objectIndex); - gSPDisplayList(gDisplayListHead++, (Gfx*) 0x0D006980); - - // @recomp Pop the transform id. - gEXPopMatrixGroup(gDisplayListHead++, G_MTX_MODELVIEW); - } - } - } - gSPTexture(gDisplayListHead++, 1, 1, 0, G_TX_RENDERTILE, G_OFF); -} -#endif - -// 0x21CA8 -Vtx d_course_kalimari_desert_unknown_model1[] = { - { { { 0, 12, 12 }, 0, { 0, 0 }, { 0xFF, 0xFF, 0xFF, 0xFF } } }, - { { { 0, -12, 12 }, 0, { 0, 2048 }, { 0xFF, 0xFF, 0xFF, 0xFF } } }, - { { { 0, -12, -12 }, 0, { 2048, 2048 }, { 0xFF, 0xFF, 0xFF, 0xFF } } }, - { { { 0, 12, -12 }, 0, { 2048, 0 }, { 0xFF, 0xFF, 0xFF, 0xFF } } }, -}; -Vtx d_course_kalimari_desert_unknown_model2[] = { - { { { 0, 6, 6 }, 0, { 0, 0 }, { 0xFF, 0xFF, 0xFF, 0xFF } } }, - { { { 0, -6, 6 }, 0, { 0, 2048 }, { 0xFF, 0xFF, 0xFF, 0xFF } } }, - { { { 0, -6, -6 }, 0, { 2048, 2048 }, { 0xFF, 0xFF, 0xFF, 0xFF } } }, - { { { 0, 6, -6 }, 0, { 2048, 0 }, { 0xFF, 0xFF, 0xFF, 0xFF } } }, -}; - -// @recomp there's absolutely zero reason for the train wheels to be using decals -// I'm commenting them out since they cause performance issues in accurate renderers for nothing. -Gfx d_course_kalimari_desert_dl_22D70[] = { - gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON), - gsDPPipeSync(), - gsDPSetCombineMode(G_CC_MODULATEIDECALA, G_CC_MODULATEIDECALA), - gsDPSetRenderMode(G_RM_AA_ZB_TEX_EDGE, G_RM_AA_ZB_TEX_EDGE2), - gsSPVertex(d_course_kalimari_desert_unknown_model1, 4, 0), - gsSP2Triangles(0, 1, 2, 0, 0, 2, 3, 0), - // gsDPSetRenderMode(G_RM_AA_ZB_XLU_DECAL, G_RM_AA_ZB_XLU_DECAL2), - // gsSP2Triangles(0, 1, 2, 0, 0, 2, 3, 0), - gsSPEndDisplayList(), -}; - -Gfx d_course_kalimari_desert_dl_22DB8[] = { - gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON), - gsDPPipeSync(), - gsDPSetCombineMode(G_CC_MODULATEIDECALA, G_CC_MODULATEIDECALA), - gsDPSetRenderMode(G_RM_AA_ZB_TEX_EDGE, G_RM_AA_ZB_TEX_EDGE2), - gsSPVertex(d_course_kalimari_desert_unknown_model2, 4, 0), - gsSP2Triangles(0, 1, 2, 0, 0, 2, 3, 0), - // gsDPSetRenderMode(G_RM_AA_ZB_XLU_DECAL, G_RM_AA_ZB_XLU_DECAL2), - // gsSP2Triangles(0, 1, 2, 0, 0, 2, 3, 0), - gsSPEndDisplayList(), -}; - -#if 1 -/** - * @brief Renders the train engine actor. - * Actor used in Kalimari Desert. - * His update position are made in vehicle. - * - * @param camera - * @param actor - */ -RECOMP_PATCH void render_actor_train_engine(Camera* camera, struct TrainCar* actor) { - UNUSED s32 pad[2]; - s32 maxObjectsReached; - Vec3f sp160; - Mat4 sp120; - Mat4 spE0; - Mat4 spA0; - - f32 distance = is_within_render_distance(camera->pos, actor->pos, camera->rot[1], 2500.0f, - gCameraZoom[camera - camera1], 9000000.0f); - - if (distance < 0.0f) { - return; - } - - gSPClearGeometryMode(gDisplayListHead++, G_LIGHTING); - - mtxf_pos_rotation_xyz(sp120, actor->pos, actor->rot); - maxObjectsReached = render_set_position(sp120, 0) == 0; - - static char* sLocomotive = "Locomotive"; - - gEXMatrixGroupDecomposed(gDisplayListHead++, TAG_OBJECT(sLocomotive) & 0xFFFFFFF0 | 1, G_EX_PUSH, G_MTX_MODELVIEW, - G_EX_COMPONENT_AUTO, G_EX_COMPONENT_AUTO, G_EX_COMPONENT_AUTO, G_EX_COMPONENT_INTERPOLATE, - G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_SKIP, G_EX_COMPONENT_INTERPOLATE, - G_EX_ORDER_AUTO, G_EX_EDIT_ALLOW); - - if (maxObjectsReached) { - return; - } - - if (1 /* distance < 122500.0f */) { - gSPDisplayList(gDisplayListHead++, (Gfx*) 0x0601c0f0 /*d_course_kalimari_desert_dl_1C0F0*/); - gSPDisplayList(gDisplayListHead++, (Gfx*) 0x0601b978 /*d_course_kalimari_desert_dl_1B978*/); - - } else if (distance < 640000.0f) { - gSPDisplayList(gDisplayListHead++, (Gfx*) 0x0601d670 /* d_course_kalimari_desert_dl_1D670 */); - gSPDisplayList(gDisplayListHead++, (Gfx*) 0x0601d160 /* d_course_kalimari_desert_dl_1D160 */); - } else { - gSPDisplayList(gDisplayListHead++, (Gfx*) 0x0601e910 /* d_course_kalimari_desert_dl_1E910 */); - gSPDisplayList(gDisplayListHead++, (Gfx*) 0x0601e480 /* d_course_kalimari_desert_dl_1E480 */); - } - - // if (1440000.0f < distance) { - // return; - // } - - gSPClearGeometryMode(gDisplayListHead++, G_CULL_BACK); - gSPDisplayList(gDisplayListHead++, (Gfx*) 0x06022d28 /* d_course_kalimari_desert_dl_22D28 */); - - mtxf_rotate_x(sp120, actor->wheelRot); - vec3f_set(sp160, 17.0f, 6.0f, 32.0f); - mtxf_translate(spE0, sp160); - mtxf_multiplication(spA0, sp120, spE0); - - // @recomp Pop the transform id. - gEXPopMatrixGroup(gDisplayListHead++, G_MTX_MODELVIEW); - - gEXMatrixGroupDecomposed(gDisplayListHead++, TAG_OBJECT(sLocomotive) & 0xFFFFFFF0 | 2, G_EX_PUSH, G_MTX_MODELVIEW, - G_EX_COMPONENT_AUTO, G_EX_COMPONENT_AUTO, G_EX_COMPONENT_AUTO, G_EX_COMPONENT_INTERPOLATE, - G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_SKIP, G_EX_COMPONENT_INTERPOLATE, - G_EX_ORDER_AUTO, G_EX_EDIT_ALLOW); - - maxObjectsReached = render_set_position(spA0, 3) == 0; - if (maxObjectsReached) { - return; - } - - gSPDisplayList(gDisplayListHead++, d_course_kalimari_desert_dl_22DB8 /* d_course_kalimari_desert_dl_22DB8 */); - gSPPopMatrix(gDisplayListHead++, G_MTX_MODELVIEW); - - mtxf_rotate_x(sp120, actor->wheelRot); - vec3f_set(sp160, -17.0, 6.0f, 32.0f); - mtxf_translate(spE0, sp160); - mtxf_multiplication(spA0, sp120, spE0); - - // @recomp Pop the transform id. - gEXPopMatrixGroup(gDisplayListHead++, G_MTX_MODELVIEW); - - gEXMatrixGroupDecomposed(gDisplayListHead++, TAG_OBJECT(sLocomotive) & 0xFFFFFFF0 | 3, G_EX_PUSH, G_MTX_MODELVIEW, - G_EX_COMPONENT_AUTO, G_EX_COMPONENT_AUTO, G_EX_COMPONENT_AUTO, G_EX_COMPONENT_INTERPOLATE, - G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_SKIP, G_EX_COMPONENT_INTERPOLATE, - G_EX_ORDER_AUTO, G_EX_EDIT_ALLOW); - - maxObjectsReached = render_set_position(spA0, 3) == 0; - if (maxObjectsReached) { - return; - } - - gSPDisplayList(gDisplayListHead++, d_course_kalimari_desert_dl_22DB8 /* d_course_kalimari_desert_dl_22DB8 */); - gSPPopMatrix(gDisplayListHead++, G_MTX_MODELVIEW); - - mtxf_rotate_x(sp120, (s16) (actor->wheelRot + 0x16C)); - vec3f_set(sp160, 17.0f, 6.0f, 16.0f); - mtxf_translate(spE0, sp160); - mtxf_multiplication(spA0, sp120, spE0); - - // @recomp Pop the transform id. - gEXPopMatrixGroup(gDisplayListHead++, G_MTX_MODELVIEW); - - gEXMatrixGroupDecomposed(gDisplayListHead++, TAG_OBJECT(sLocomotive) & 0xFFFFFFF0 | 4, G_EX_PUSH, G_MTX_MODELVIEW, - G_EX_COMPONENT_AUTO, G_EX_COMPONENT_AUTO, G_EX_COMPONENT_AUTO, G_EX_COMPONENT_INTERPOLATE, - G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_SKIP, G_EX_COMPONENT_INTERPOLATE, - G_EX_ORDER_AUTO, G_EX_EDIT_ALLOW); - - maxObjectsReached = render_set_position(spA0, 3) == 0; - if (maxObjectsReached) { - return; - } - - gSPDisplayList(gDisplayListHead++, d_course_kalimari_desert_dl_22DB8 /* d_course_kalimari_desert_dl_22DB8 */); - gSPPopMatrix(gDisplayListHead++, G_MTX_MODELVIEW); - - mtxf_rotate_x(sp120, (s16) (actor->wheelRot + 0x16C)); - vec3f_set(sp160, -17.0f, 6.0f, 16.0f); - mtxf_translate(spE0, sp160); - mtxf_multiplication(spA0, sp120, spE0); - - // @recomp Pop the transform id. - gEXPopMatrixGroup(gDisplayListHead++, G_MTX_MODELVIEW); - - gEXMatrixGroupDecomposed(gDisplayListHead++, TAG_OBJECT(sLocomotive) & 0xFFFFFFF0 | 5, G_EX_PUSH, G_MTX_MODELVIEW, - G_EX_COMPONENT_AUTO, G_EX_COMPONENT_AUTO, G_EX_COMPONENT_AUTO, G_EX_COMPONENT_INTERPOLATE, - G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_SKIP, G_EX_COMPONENT_INTERPOLATE, - G_EX_ORDER_AUTO, G_EX_EDIT_ALLOW); - - maxObjectsReached = render_set_position(spA0, 3) == 0; - if (maxObjectsReached) { - return; - } - - gSPDisplayList(gDisplayListHead++, d_course_kalimari_desert_dl_22DB8 /* d_course_kalimari_desert_dl_22DB8 */); - gSPPopMatrix(gDisplayListHead++, G_MTX_MODELVIEW); - - mtxf_rotate_x(sp120, (s16) (actor->wheelRot + 0x444)); - vec3f_set(sp160, 17.0f, 12.0f, -12.0f); - mtxf_translate(spE0, sp160); - mtxf_multiplication(spA0, sp120, spE0); - - // @recomp Pop the transform id. - gEXPopMatrixGroup(gDisplayListHead++, G_MTX_MODELVIEW); - - gEXMatrixGroupDecomposed(gDisplayListHead++, TAG_OBJECT(sLocomotive) & 0xFFFFFFF0 | 6, G_EX_PUSH, G_MTX_MODELVIEW, - G_EX_COMPONENT_AUTO, G_EX_COMPONENT_AUTO, G_EX_COMPONENT_AUTO, G_EX_COMPONENT_INTERPOLATE, - G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_SKIP, G_EX_COMPONENT_INTERPOLATE, - G_EX_ORDER_AUTO, G_EX_EDIT_ALLOW); - - maxObjectsReached = render_set_position(spA0, 3) == 0; - if (maxObjectsReached) { - return; - } - - gSPDisplayList(gDisplayListHead++, d_course_kalimari_desert_dl_22D70 /* d_course_kalimari_desert_dl_22D70 */); - gSPPopMatrix(gDisplayListHead++, G_MTX_MODELVIEW); - - mtxf_rotate_x(sp120, (s16) (actor->wheelRot + 0x444)); - vec3f_set(sp160, -17.0f, 12.0f, -12.0f); - mtxf_translate(spE0, sp160); - mtxf_multiplication(spA0, sp120, spE0); - - // @recomp Pop the transform id. - gEXPopMatrixGroup(gDisplayListHead++, G_MTX_MODELVIEW); - - gEXMatrixGroupDecomposed(gDisplayListHead++, TAG_OBJECT(sLocomotive) & 0xFFFFFFF0 | 7, G_EX_PUSH, G_MTX_MODELVIEW, - G_EX_COMPONENT_AUTO, G_EX_COMPONENT_AUTO, G_EX_COMPONENT_AUTO, G_EX_COMPONENT_INTERPOLATE, - G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_SKIP, G_EX_COMPONENT_INTERPOLATE, - G_EX_ORDER_AUTO, G_EX_EDIT_ALLOW); - - maxObjectsReached = render_set_position(spA0, 3) == 0; - if (maxObjectsReached) { - return; - } - - gSPDisplayList(gDisplayListHead++, d_course_kalimari_desert_dl_22D70 /* d_course_kalimari_desert_dl_22D70 */); - gSPPopMatrix(gDisplayListHead++, G_MTX_MODELVIEW); - - mtxf_rotate_x(sp120, (s16) (actor->wheelRot + 0x2D8)); - vec3f_set(sp160, 17.0f, 12.0f, -34.0f); - mtxf_translate(spE0, sp160); - mtxf_multiplication(spA0, sp120, spE0); - - // @recomp Pop the transform id. - gEXPopMatrixGroup(gDisplayListHead++, G_MTX_MODELVIEW); - - gEXMatrixGroupDecomposed(gDisplayListHead++, TAG_OBJECT(sLocomotive) & 0xFFFFFFF0 | 8, G_EX_PUSH, G_MTX_MODELVIEW, - G_EX_COMPONENT_AUTO, G_EX_COMPONENT_AUTO, G_EX_COMPONENT_AUTO, G_EX_COMPONENT_INTERPOLATE, - G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_SKIP, G_EX_COMPONENT_INTERPOLATE, - G_EX_ORDER_AUTO, G_EX_EDIT_ALLOW); - - maxObjectsReached = render_set_position(spA0, 3) == 0; - if (maxObjectsReached) { - return; - } - - gSPDisplayList(gDisplayListHead++, d_course_kalimari_desert_dl_22D70 /* d_course_kalimari_desert_dl_22D70 */); - gSPPopMatrix(gDisplayListHead++, G_MTX_MODELVIEW); - - mtxf_rotate_x(sp120, (s16) (actor->wheelRot + 0x2D8)); - vec3f_set(sp160, -17.0f, 12.0f, -34.0f); - mtxf_translate(spE0, sp160); - mtxf_multiplication(spA0, sp120, spE0); - - // @recomp Pop the transform id. - gEXPopMatrixGroup(gDisplayListHead++, G_MTX_MODELVIEW); - - gEXMatrixGroupDecomposed(gDisplayListHead++, TAG_OBJECT(sLocomotive) & 0xFFFFFFF0 | 9, G_EX_PUSH, G_MTX_MODELVIEW, - G_EX_COMPONENT_AUTO, G_EX_COMPONENT_AUTO, G_EX_COMPONENT_AUTO, G_EX_COMPONENT_INTERPOLATE, - G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_SKIP, G_EX_COMPONENT_INTERPOLATE, - G_EX_ORDER_AUTO, G_EX_EDIT_ALLOW); - - maxObjectsReached = render_set_position(spA0, 3) == 0; - if (maxObjectsReached) { - return; - } - - gSPDisplayList(gDisplayListHead++, d_course_kalimari_desert_dl_22D70 /* d_course_kalimari_desert_dl_22D70 */); - gSPPopMatrix(gDisplayListHead++, G_MTX_MODELVIEW); - gSPSetGeometryMode(gDisplayListHead++, G_CULL_BACK); - - // @recomp Pop the transform id. - gEXPopMatrixGroup(gDisplayListHead++, G_MTX_MODELVIEW); -} -#endif - -#if 1 -RECOMP_PATCH void render_actor_train_tender(Camera* camera, struct TrainCar* actor) { - Mat4 sp120; - Vec3f sp160; - Mat4 spE0; - Mat4 spA0; - - f32 temp_f0 = is_within_render_distance(camera->pos, actor->pos, camera->rot[1], 625.0f, - gCameraZoom[camera - camera1], 9000000.0f); - - if (temp_f0 < 0.0f) { - return; - } - - gSPClearGeometryMode(gDisplayListHead++, G_LIGHTING); - - static char* sTender = "tender"; - - // @recomp Tag the transform - gEXMatrixGroupDecomposed(gDisplayListHead++, TAG_OBJECT(sTender) & 0xFFFFFFF0 | 0, G_EX_PUSH, G_MTX_MODELVIEW, - G_EX_COMPONENT_AUTO, G_EX_COMPONENT_AUTO, G_EX_COMPONENT_AUTO, G_EX_COMPONENT_INTERPOLATE, - G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_SKIP, G_EX_COMPONENT_INTERPOLATE, - G_EX_ORDER_AUTO, G_EX_EDIT_ALLOW); - - mtxf_pos_rotation_xyz(sp120, actor->pos, actor->rot); - if (render_set_position(sp120, 0) == 0) { - return; - } - - if (1 /* temp_f0 < 250000.0f*/) { - - gSPDisplayList(gDisplayListHead++, (Gfx*) 0x0601f228 /* d_course_kalimari_desert_dl_1F228*/); - - } else if (temp_f0 < 1000000.0f) { - // gSPDisplayList(gDisplayListHead++, d_course_kalimari_desert_dl_1F708); - } else { - // gSPDisplayList(gDisplayListHead++, d_course_kalimari_desert_dl_1FAF8); - } - // if (1440000.0f < temp_f0) { - // return; - // } - - gSPClearGeometryMode(gDisplayListHead++, G_CULL_BACK); - gSPDisplayList(gDisplayListHead++, (Gfx*) 0x06022d28 /* d_course_kalimari_desert_dl_22D28 */); - - mtxf_rotate_x(sp120, actor->wheelRot); - vec3f_set(sp160, 17.0f, 6.0f, 8.0f); - mtxf_translate(spE0, sp160); - mtxf_multiplication(spA0, sp120, spE0); - - // @recomp Pop the transform id. - gEXPopMatrixGroup(gDisplayListHead++, G_MTX_MODELVIEW); - - // @recomp Tag the transform - gEXMatrixGroupDecomposed(gDisplayListHead++, TAG_OBJECT(sTender) & 0xFFFFFFF0 | 1, G_EX_PUSH, G_MTX_MODELVIEW, - G_EX_COMPONENT_AUTO, G_EX_COMPONENT_AUTO, G_EX_COMPONENT_AUTO, G_EX_COMPONENT_INTERPOLATE, - G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_SKIP, G_EX_COMPONENT_INTERPOLATE, - G_EX_ORDER_AUTO, G_EX_EDIT_ALLOW); - - if (render_set_position(spA0, 3) == 0) { - return; - } - - gSPDisplayList(gDisplayListHead++, d_course_kalimari_desert_dl_22DB8 /* d_course_kalimari_desert_dl_22DB8 */); - gSPPopMatrix(gDisplayListHead++, G_MTX_MODELVIEW); - - mtxf_rotate_x(sp120, actor->wheelRot); - vec3f_set(sp160, -17.0, 6.0f, 8.0f); - mtxf_translate(spE0, sp160); - mtxf_multiplication(spA0, sp120, spE0); - - // @recomp Pop the transform id. - gEXPopMatrixGroup(gDisplayListHead++, G_MTX_MODELVIEW); - - // @recomp Tag the transform - gEXMatrixGroupDecomposed(gDisplayListHead++, TAG_OBJECT(sTender) & 0xFFFFFFF0 | 2, G_EX_PUSH, G_MTX_MODELVIEW, - G_EX_COMPONENT_AUTO, G_EX_COMPONENT_AUTO, G_EX_COMPONENT_AUTO, G_EX_COMPONENT_INTERPOLATE, - G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_SKIP, G_EX_COMPONENT_INTERPOLATE, - G_EX_ORDER_AUTO, G_EX_EDIT_ALLOW); - - if (render_set_position(spA0, 3) == 0) { - return; - } - - gSPPopMatrix(gDisplayListHead++, G_MTX_MODELVIEW); - - // @recomp Pop the transform id. - gEXPopMatrixGroup(gDisplayListHead++, G_MTX_MODELVIEW); - - // @recomp Tag the transform - gEXMatrixGroupDecomposed(gDisplayListHead++, TAG_OBJECT(sTender) & 0xFFFFFFF0 | 3, G_EX_PUSH, G_MTX_MODELVIEW, - G_EX_COMPONENT_AUTO, G_EX_COMPONENT_AUTO, G_EX_COMPONENT_AUTO, G_EX_COMPONENT_INTERPOLATE, - G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_SKIP, G_EX_COMPONENT_INTERPOLATE, - G_EX_ORDER_AUTO, G_EX_EDIT_ALLOW); - - gSPDisplayList(gDisplayListHead++, d_course_kalimari_desert_dl_22DB8 /* d_course_kalimari_desert_dl_22DB8 */); - - mtxf_rotate_x(sp120, (s16) (actor->wheelRot + 0x444)); - vec3f_set(sp160, 17.0f, 6.0f, -8.0f); - mtxf_translate(spE0, sp160); - mtxf_multiplication(spA0, sp120, spE0); - - // @recomp Pop the transform id. - gEXPopMatrixGroup(gDisplayListHead++, G_MTX_MODELVIEW); - - // @recomp Tag the transform - gEXMatrixGroupDecomposed(gDisplayListHead++, TAG_OBJECT(sTender) & 0xFFFFFFF0 | 4, G_EX_PUSH, G_MTX_MODELVIEW, - G_EX_COMPONENT_AUTO, G_EX_COMPONENT_AUTO, G_EX_COMPONENT_AUTO, G_EX_COMPONENT_INTERPOLATE, - G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_SKIP, G_EX_COMPONENT_INTERPOLATE, - G_EX_ORDER_AUTO, G_EX_EDIT_ALLOW); - - if (render_set_position(spA0, 3) == 0) { - return; - } - - gSPDisplayList(gDisplayListHead++, d_course_kalimari_desert_dl_22DB8 /* d_course_kalimari_desert_dl_22DB8 */); - gSPPopMatrix(gDisplayListHead++, G_MTX_MODELVIEW); - - mtxf_rotate_x(sp120, (s16) (actor->wheelRot + 0x444)); - vec3f_set(sp160, -17.0f, 6.0f, -8.0f); - mtxf_translate(spE0, sp160); - mtxf_multiplication(spA0, sp120, spE0); - - // @recomp Pop the transform id. - gEXPopMatrixGroup(gDisplayListHead++, G_MTX_MODELVIEW); - - // @recomp Tag the transform - gEXMatrixGroupDecomposed(gDisplayListHead++, TAG_OBJECT(sTender) & 0xFFFFFFF0 | 5, G_EX_PUSH, G_MTX_MODELVIEW, - G_EX_COMPONENT_AUTO, G_EX_COMPONENT_AUTO, G_EX_COMPONENT_AUTO, G_EX_COMPONENT_INTERPOLATE, - G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_SKIP, G_EX_COMPONENT_INTERPOLATE, - G_EX_ORDER_AUTO, G_EX_EDIT_ALLOW); - - if (render_set_position(spA0, 3) == 0) { - return; - } - gSPDisplayList(gDisplayListHead++, d_course_kalimari_desert_dl_22DB8 /* d_course_kalimari_desert_dl_22DB8 */); - gSPPopMatrix(gDisplayListHead++, G_MTX_MODELVIEW); - - // @recomp Pop the transform id. - gEXPopMatrixGroup(gDisplayListHead++, G_MTX_MODELVIEW); - - gSPSetGeometryMode(gDisplayListHead++, G_CULL_BACK); -} -#endif - -#if 1 -RECOMP_PATCH void render_actor_train_passenger_car(Camera* camera, struct TrainCar* actor) { - Mat4 sp120; - Vec3f sp160; - Mat4 spE0; - Mat4 spA0; - - f32 temp_f0 = is_within_render_distance(camera->pos, actor->pos, camera->rot[1], 2025.0f, - gCameraZoom[camera - camera1], 9000000.0f); - - if (temp_f0 < 0.0f) { - return; - } - - gSPClearGeometryMode(gDisplayListHead++, G_LIGHTING); - - mtxf_pos_rotation_xyz(sp120, actor->pos, actor->rot); - - // recomp_printf("render_actor_train_passenger_car: actor addr: %x\n", actor); - - // @recomp Tag the transform - gEXMatrixGroupDecomposed(gDisplayListHead++, (TAG_OBJECT(actor) << 16) & 0xFFFF0000 | 0, G_EX_PUSH, G_MTX_MODELVIEW, - G_EX_COMPONENT_AUTO, G_EX_COMPONENT_AUTO, G_EX_COMPONENT_AUTO, G_EX_COMPONENT_INTERPOLATE, - G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_SKIP, G_EX_COMPONENT_INTERPOLATE, - G_EX_ORDER_AUTO, G_EX_EDIT_ALLOW); - - if (render_set_position(sp120, 0) == 0) { - return; - } - - if (1 /* temp_f0 < 250000.0f*/) { - - gSPDisplayList(gDisplayListHead++, (Gfx*) 0x06020a20 /* d_course_kalimari_desert_dl_20A20 */); - gSPDisplayList(gDisplayListHead++, (Gfx*) 0x06020a08 /* d_course_kalimari_desert_dl_20A08*/); - - } else if (temp_f0 < 1000000.0f) { - - // gSPDisplayList(gDisplayListHead++, d_course_kalimari_desert_dl_21550); - // gSPDisplayList(gDisplayListHead++, d_course_kalimari_desert_dl_21220); - } else { - // gSPDisplayList(gDisplayListHead++, d_course_kalimari_desert_dl_21C90); - // gSPDisplayList(gDisplayListHead++, d_course_kalimari_desert_dl_21A80); - } - - // if (1440000.0f < temp_f0) { - // return; - // } - - gSPClearGeometryMode(gDisplayListHead++, G_CULL_BACK); - gSPDisplayList(gDisplayListHead++, (Gfx*) 0x06022d28 /* d_course_kalimari_desert_dl_22D28 */); - - mtxf_rotate_x(sp120, actor->wheelRot); - vec3f_set(sp160, 17.0f, 6.0f, 28.0f); - mtxf_translate(spE0, sp160); - mtxf_multiplication(spA0, sp120, spE0); - - // @recomp Pop the transform id. - gEXPopMatrixGroup(gDisplayListHead++, G_MTX_MODELVIEW); - - // @recomp Tag the transform - gEXMatrixGroupDecomposed(gDisplayListHead++, (TAG_OBJECT(actor) << 16) & 0xFFFF0000 | 1, G_EX_PUSH, G_MTX_MODELVIEW, - G_EX_COMPONENT_AUTO, G_EX_COMPONENT_AUTO, G_EX_COMPONENT_AUTO, G_EX_COMPONENT_INTERPOLATE, - G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_SKIP, G_EX_COMPONENT_INTERPOLATE, - G_EX_ORDER_AUTO, G_EX_EDIT_ALLOW); - - if (render_set_position(spA0, 3) == 0) { - return; - } - - gSPDisplayList(gDisplayListHead++, d_course_kalimari_desert_dl_22DB8 /* d_course_kalimari_desert_dl_22DB8 */); - gSPPopMatrix(gDisplayListHead++, G_MTX_MODELVIEW); - - mtxf_rotate_x(sp120, actor->wheelRot); - vec3f_set(sp160, -17.0, 6.0f, 28.0f); - mtxf_translate(spE0, sp160); - mtxf_multiplication(spA0, sp120, spE0); - - // @recomp Pop the transform id. - gEXPopMatrixGroup(gDisplayListHead++, G_MTX_MODELVIEW); - - // @recomp Tag the transform - gEXMatrixGroupDecomposed(gDisplayListHead++, (TAG_OBJECT(actor) << 16) & 0xFFFF0000 | 2, G_EX_PUSH, G_MTX_MODELVIEW, - G_EX_COMPONENT_AUTO, G_EX_COMPONENT_AUTO, G_EX_COMPONENT_AUTO, G_EX_COMPONENT_INTERPOLATE, - G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_SKIP, G_EX_COMPONENT_INTERPOLATE, - G_EX_ORDER_AUTO, G_EX_EDIT_ALLOW); - - if (render_set_position(spA0, 3) == 0) { - return; - } - - gSPDisplayList(gDisplayListHead++, d_course_kalimari_desert_dl_22DB8 /* d_course_kalimari_desert_dl_22DB8 */); - gSPPopMatrix(gDisplayListHead++, G_MTX_MODELVIEW); - - mtxf_rotate_x(sp120, (s16) (actor->wheelRot + 0x222)); - vec3f_set(sp160, 17.0f, 6.0f, 12.0f); - mtxf_translate(spE0, sp160); - mtxf_multiplication(spA0, sp120, spE0); - - // @recomp Pop the transform id. - gEXPopMatrixGroup(gDisplayListHead++, G_MTX_MODELVIEW); - - // @recomp Tag the transform - gEXMatrixGroupDecomposed(gDisplayListHead++, (TAG_OBJECT(actor) << 16) & 0xFFFF0000 | 3, G_EX_PUSH, G_MTX_MODELVIEW, - G_EX_COMPONENT_AUTO, G_EX_COMPONENT_AUTO, G_EX_COMPONENT_AUTO, G_EX_COMPONENT_INTERPOLATE, - G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_SKIP, G_EX_COMPONENT_INTERPOLATE, - G_EX_ORDER_AUTO, G_EX_EDIT_ALLOW); - - if (render_set_position(spA0, 3) == 0) { - return; - } - - gSPDisplayList(gDisplayListHead++, d_course_kalimari_desert_dl_22DB8 /* d_course_kalimari_desert_dl_22DB8 */); - gSPPopMatrix(gDisplayListHead++, G_MTX_MODELVIEW); - - mtxf_rotate_x(sp120, (s16) (actor->wheelRot + 0x222)); - vec3f_set(sp160, -17.0f, 6.0f, 12.0f); - mtxf_translate(spE0, sp160); - mtxf_multiplication(spA0, sp120, spE0); - - // @recomp Pop the transform id. - gEXPopMatrixGroup(gDisplayListHead++, G_MTX_MODELVIEW); - - // @recomp Tag the transform - gEXMatrixGroupDecomposed(gDisplayListHead++, (TAG_OBJECT(actor) << 16) & 0xFFFF0000 | 4, G_EX_PUSH, G_MTX_MODELVIEW, - G_EX_COMPONENT_AUTO, G_EX_COMPONENT_AUTO, G_EX_COMPONENT_AUTO, G_EX_COMPONENT_INTERPOLATE, - G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_SKIP, G_EX_COMPONENT_INTERPOLATE, - G_EX_ORDER_AUTO, G_EX_EDIT_ALLOW); - - if (render_set_position(spA0, 3) == 0) { - return; - } - - gSPDisplayList(gDisplayListHead++, d_course_kalimari_desert_dl_22DB8 /* d_course_kalimari_desert_dl_22DB8 */); - gSPPopMatrix(gDisplayListHead++, G_MTX_MODELVIEW); - - mtxf_rotate_x(sp120, (s16) (actor->wheelRot + 0x5B0)); - vec3f_set(sp160, 17.0f, 6.0f, -8.0f); - mtxf_translate(spE0, sp160); - mtxf_multiplication(spA0, sp120, spE0); - - // @recomp Pop the transform id. - gEXPopMatrixGroup(gDisplayListHead++, G_MTX_MODELVIEW); - - // @recomp Tag the transform - gEXMatrixGroupDecomposed(gDisplayListHead++, (TAG_OBJECT(actor) << 16) & 0xFFFF0000 | 5, G_EX_PUSH, G_MTX_MODELVIEW, - G_EX_COMPONENT_AUTO, G_EX_COMPONENT_AUTO, G_EX_COMPONENT_AUTO, G_EX_COMPONENT_INTERPOLATE, - G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_SKIP, G_EX_COMPONENT_INTERPOLATE, - G_EX_ORDER_AUTO, G_EX_EDIT_ALLOW); - - if (render_set_position(spA0, 3) == 0) { - return; - } - - gSPDisplayList(gDisplayListHead++, d_course_kalimari_desert_dl_22DB8 /* d_course_kalimari_desert_dl_22DB8 */); - gSPPopMatrix(gDisplayListHead++, G_MTX_MODELVIEW); - - mtxf_rotate_x(sp120, (s16) (actor->wheelRot + 0x5B0)); - vec3f_set(sp160, -17.0f, 6.0f, -8.0f); - mtxf_translate(spE0, sp160); - mtxf_multiplication(spA0, sp120, spE0); - - // @recomp Pop the transform id. - gEXPopMatrixGroup(gDisplayListHead++, G_MTX_MODELVIEW); - - // @recomp Tag the transform - gEXMatrixGroupDecomposed(gDisplayListHead++, (TAG_OBJECT(actor) << 16) & 0xFFFF0000 | 6, G_EX_PUSH, G_MTX_MODELVIEW, - G_EX_COMPONENT_AUTO, G_EX_COMPONENT_AUTO, G_EX_COMPONENT_AUTO, G_EX_COMPONENT_INTERPOLATE, - G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_SKIP, G_EX_COMPONENT_INTERPOLATE, - G_EX_ORDER_AUTO, G_EX_EDIT_ALLOW); - - if (render_set_position(spA0, 3) == 0) { - return; - } - - gSPDisplayList(gDisplayListHead++, d_course_kalimari_desert_dl_22DB8 /* d_course_kalimari_desert_dl_22DB8 */); - gSPPopMatrix(gDisplayListHead++, G_MTX_MODELVIEW); - - mtxf_rotate_x(sp120, (s16) (actor->wheelRot + 0x16C)); - vec3f_set(sp160, 17.0f, 6.0f, -24.0f); - mtxf_translate(spE0, sp160); - mtxf_multiplication(spA0, sp120, spE0); - - // @recomp Pop the transform id. - gEXPopMatrixGroup(gDisplayListHead++, G_MTX_MODELVIEW); - - // @recomp Tag the transform - gEXMatrixGroupDecomposed(gDisplayListHead++, (TAG_OBJECT(actor) << 16) & 0xFFFF0000 | 7, G_EX_PUSH, G_MTX_MODELVIEW, - G_EX_COMPONENT_AUTO, G_EX_COMPONENT_AUTO, G_EX_COMPONENT_AUTO, G_EX_COMPONENT_INTERPOLATE, - G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_SKIP, G_EX_COMPONENT_INTERPOLATE, - G_EX_ORDER_AUTO, G_EX_EDIT_ALLOW); - - if (render_set_position(spA0, 3) == 0) { - return; - } - - gSPDisplayList(gDisplayListHead++, d_course_kalimari_desert_dl_22DB8 /* d_course_kalimari_desert_dl_22DB8 */); - gSPPopMatrix(gDisplayListHead++, G_MTX_MODELVIEW); - - mtxf_rotate_x(sp120, (s16) (actor->wheelRot + 0x16C)); - vec3f_set(sp160, -17.0f, 6.0f, -24.0f); - mtxf_translate(spE0, sp160); - mtxf_multiplication(spA0, sp120, spE0); - - // @recomp Pop the transform id. - gEXPopMatrixGroup(gDisplayListHead++, G_MTX_MODELVIEW); - - // @recomp Tag the transform - gEXMatrixGroupDecomposed(gDisplayListHead++, (TAG_OBJECT(actor) << 16) & 0xFFFF0000 | 8, G_EX_PUSH, G_MTX_MODELVIEW, - G_EX_COMPONENT_AUTO, G_EX_COMPONENT_AUTO, G_EX_COMPONENT_AUTO, G_EX_COMPONENT_INTERPOLATE, - G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_SKIP, G_EX_COMPONENT_INTERPOLATE, - G_EX_ORDER_AUTO, G_EX_EDIT_ALLOW); - - if (render_set_position(spA0, 3) == 0) { - return; - } - - gSPDisplayList(gDisplayListHead++, d_course_kalimari_desert_dl_22DB8 /* d_course_kalimari_desert_dl_22DB8 */); - gSPPopMatrix(gDisplayListHead++, G_MTX_MODELVIEW); - - // @recomp Pop the transform id. - gEXPopMatrixGroup(gDisplayListHead++, G_MTX_MODELVIEW); - - gSPSetGeometryMode(gDisplayListHead++, G_CULL_BACK); -} -#endif - -// Trains smoke particles. -#if 1 -RECOMP_PATCH void render_object_trains_smoke_particles(s32 cameraId) { - Camera* camera; - s32 i; - - camera = &camera1[cameraId]; - gSPDisplayList(gDisplayListHead++, (Gfx*) 0x0D007AE0 /* D_0D007AE0 */); - load_texture_block_i8_nomirror((u8*) 0x0D029458 /*D_0D029458 */, 32, 32); - func_8004B72C(255, 255, 255, 255, 255, 255, 255); - D_80183E80[0] = 0; - D_80183E80[2] = 0x8000; - - if ((gTrainList[0].someFlags != 0) && - (is_particle_on_screen(gTrainList[0].locomotive.position, camera, 0x4000U) != 0)) { - - for (i = 0; i < gObjectParticle2_SIZE; i++) { - // @recomp Tag the transform - gEXMatrixGroupDecomposed(gDisplayListHead++, (TAG_OBJECT(&gTrainList[0]) << 16) & 0xFFFF0000 | i, G_EX_PUSH, - G_MTX_MODELVIEW, G_EX_COMPONENT_AUTO, G_EX_COMPONENT_AUTO, G_EX_COMPONENT_AUTO, - G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_SKIP, - G_EX_COMPONENT_INTERPOLATE, G_EX_ORDER_AUTO, G_EX_EDIT_ALLOW); - - render_object_train_smoke_particle(gObjectParticle2[i], cameraId); - - // @recomp Pop the transform id. - gEXPopMatrixGroup(gDisplayListHead++, G_MTX_MODELVIEW); - } - } - - if ((gTrainList[1].someFlags != 0) && - (is_particle_on_screen(gTrainList[1].locomotive.position, camera, 0x4000U) != 0)) { - for (i = 0; i < gObjectParticle3_SIZE; i++) { - // @recomp Tag the transform - gEXMatrixGroupDecomposed(gDisplayListHead++, (TAG_OBJECT(&gTrainList[1]) << 16) & 0xFFFF0000 | i, G_EX_PUSH, - G_MTX_MODELVIEW, G_EX_COMPONENT_AUTO, G_EX_COMPONENT_AUTO, G_EX_COMPONENT_AUTO, - G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_SKIP, - G_EX_COMPONENT_INTERPOLATE, G_EX_ORDER_AUTO, G_EX_EDIT_ALLOW); - - render_object_train_smoke_particle(gObjectParticle3[i], cameraId); - - // @recomp Pop the transform id. - gEXPopMatrixGroup(gDisplayListHead++, G_MTX_MODELVIEW); - } - } -} -#endif - -#if 1 -RECOMP_PATCH void render_course_actors(struct UnkStruct_800DC5EC* arg0) { - Camera* camera = arg0->camera; - u16 pathCounter = arg0->pathCounter; - UNUSED s32 pad[12]; - s32 i; - - struct Actor* actor; - UNUSED Vec3f sp4C = { 0.0f, 5.0f, 10.0f }; - f32 sp48 = sins(camera->rot[1] - 0x8000); // unk26; - f32 temp_f0 = coss(camera->rot[1] - 0x8000); - - D_801502C0[0][0] = temp_f0; - D_801502C0[0][2] = -sp48; - D_801502C0[2][2] = temp_f0; - D_801502C0[1][0] = 0.0f; - D_801502C0[0][1] = 0.0f; - D_801502C0[2][1] = 0.0f; - D_801502C0[1][2] = 0.0f; - D_801502C0[0][3] = 0.0f; - D_801502C0[1][3] = 0.0f; - D_801502C0[2][3] = 0.0f; // 2c - D_801502C0[2][0] = sp48; - D_801502C0[1][1] = 1.0f; - D_801502C0[3][3] = 1.0f; // unk3c - - gSPClearGeometryMode(gDisplayListHead++, G_LIGHTING); - gSPSetLights1(gDisplayListHead++, D_800DC610[1]); - gSPTexture(gDisplayListHead++, 0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON); - - if (gModeSelection != BATTLE) { - func_80297340(camera); - } - D_8015F8E0 = 0; - - // recomp_printf("gCamera1Skipped: %d \n", gCamera1Skipped); - // recomp_printf("camera->playerId: %d \n", camera->playerId); - - for (i = 0; i < ACTOR_LIST_SIZE; i++) { - actor = &gActorList[i]; - - if (actor->flags == 0) { - continue; - } - - if ((gCamera1Skipped && (camera->playerId == 0)) || (gCamera2Skipped && (camera->playerId == 1)) || - (gCamera3Skipped && (camera->playerId == 2)) || (gCamera4Skipped && (camera->playerId == 3))) { - // Skip - // @recomp Tag the transform - gEXMatrixGroupDecomposed(gDisplayListHead++, TAG_OBJECT((u32) actor << 16) | 0x01000000, G_EX_PUSH, - G_MTX_MODELVIEW, G_EX_COMPONENT_SKIP, G_EX_COMPONENT_SKIP, G_EX_COMPONENT_SKIP, - G_EX_COMPONENT_SKIP, G_EX_COMPONENT_SKIP, G_EX_COMPONENT_SKIP, G_EX_COMPONENT_SKIP, - G_EX_ORDER_AUTO, G_EX_EDIT_ALLOW); - -#if 0 - recomp_printf("render_course_actors: actor->type %d Camera %d skipped \n", actor->type, camera->playerId); - - if (gCamera1Skipped) { - recomp_printf("gCamera1Skipped = %d \n", gCamera1Skipped); - } - if (gCamera2Skipped) { - recomp_printf("gCamera2Skipped = %d \n", gCamera2Skipped); - } - if (gCamera3Skipped) { - recomp_printf("gCamera3Skipped = %d \n", gCamera3Skipped); - } - if (gCamera4Skipped) { - recomp_printf("gCamera4Skipped = %d \n", gCamera4Skipped); - } -#endif - } else { - // @recomp Tag the transform. - gEXMatrixGroupDecomposedNormal(gDisplayListHead++, TAG_OBJECT(actor), G_EX_PUSH, G_MTX_MODELVIEW, - G_EX_EDIT_ALLOW); - } - - switch (actor->type) { - case ACTOR_TREE_MARIO_RACEWAY: - render_actor_tree_mario_raceway(camera, D_801502C0, actor); - break; - case ACTOR_TREE_YOSHI_VALLEY: - render_actor_tree_yoshi_valley(camera, D_801502C0, actor); - break; - case ACTOR_TREE_ROYAL_RACEWAY: - render_actor_tree_royal_raceway(camera, D_801502C0, actor); - break; - case ACTOR_TREE_MOO_MOO_FARM: - render_actor_tree_moo_moo_farm(camera, D_801502C0, actor); - break; - case ACTOR_UNKNOWN_0x1A: - func_80299864(camera, D_801502C0, actor); - break; - case ACTOR_TREE_BOWSERS_CASTLE: - render_actor_tree_bowser_castle(camera, D_801502C0, actor); - break; - case ACTOR_BUSH_BOWSERS_CASTLE: - render_actor_bush_bowser_castle(camera, D_801502C0, actor); - break; - case ACTOR_TREE_FRAPPE_SNOWLAND: - render_actor_tree_frappe_snowland(camera, D_801502C0, actor); - break; - case ACTOR_CACTUS1_KALAMARI_DESERT: - render_actor_tree_cactus1_kalimari_desert(camera, D_801502C0, actor); - break; - case ACTOR_CACTUS2_KALAMARI_DESERT: - render_actor_tree_cactus2_kalimari_desert(camera, D_801502C0, actor); - break; - case ACTOR_CACTUS3_KALAMARI_DESERT: - render_actor_tree_cactus3_kalimari_desert(camera, D_801502C0, actor); - break; - case ACTOR_FALLING_ROCK: - // @recomp Tag the transform - gEXMatrixGroupDecomposed(gDisplayListHead++, TAG_OBJECT((u32) actor << 16) | 0x01000000, G_EX_PUSH, - G_MTX_MODELVIEW, G_EX_COMPONENT_AUTO, G_EX_COMPONENT_AUTO, G_EX_COMPONENT_AUTO, - G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_SKIP, - G_EX_COMPONENT_INTERPOLATE, G_EX_ORDER_AUTO, G_EX_EDIT_ALLOW); - - render_actor_falling_rock(camera, (struct FallingRock*) actor); - - // @recomp Pop the transform id. - gEXPopMatrixGroup(gDisplayListHead++, G_MTX_MODELVIEW); - break; - case ACTOR_KIWANO_FRUIT: - render_actor_kiwano_fruit(camera, D_801502C0, actor); - break; - case ACTOR_BANANA: - render_actor_banana(camera, D_801502C0, (struct BananaActor*) actor); - break; - case ACTOR_GREEN_SHELL: - render_actor_green_shell(camera, D_801502C0, (struct ShellActor*) actor); - break; - case ACTOR_RED_SHELL: - render_actor_red_shell(camera, D_801502C0, (struct ShellActor*) actor); - break; - case ACTOR_BLUE_SPINY_SHELL: - render_actor_blue_shell(camera, D_801502C0, (struct ShellActor*) actor); - break; - case ACTOR_PIRANHA_PLANT: - render_actor_piranha_plant(camera, D_801502C0, (struct PiranhaPlant*) actor); - break; - case ACTOR_TRAIN_ENGINE: - render_actor_train_engine(camera, (struct TrainCar*) actor); - break; - case ACTOR_TRAIN_TENDER: - render_actor_train_tender(camera, (struct TrainCar*) actor); - break; - case ACTOR_TRAIN_PASSENGER_CAR: - render_actor_train_passenger_car(camera, (struct TrainCar*) actor); - break; - case ACTOR_COW: - render_actor_cow(camera, D_801502C0, actor); - break; - case ACTOR_UNKNOWN_0x14: - func_8029AC18(camera, D_801502C0, actor); - break; - case ACTOR_MARIO_SIGN: - render_actor_mario_sign(camera, D_801502C0, actor); - break; - case ACTOR_WARIO_SIGN: - render_actor_wario_sign(camera, actor); - break; - case ACTOR_PALM_TREE: - render_actor_palm_tree(camera, D_801502C0, (struct PalmTree*) actor); - break; - case ACTOR_PADDLE_BOAT: - render_actor_paddle_boat(camera, (struct PaddleWheelBoat*) actor, D_801502C0, pathCounter); - break; - case ACTOR_BOX_TRUCK: - render_actor_box_truck(camera, actor); - break; - case ACTOR_SCHOOL_BUS: - render_actor_school_bus(camera, actor); - break; - case ACTOR_TANKER_TRUCK: - render_actor_tanker_truck(camera, actor); - break; - case ACTOR_CAR: - render_actor_car(camera, actor); - break; - case ACTOR_RAILROAD_CROSSING: - render_actor_railroad_crossing(camera, (struct RailroadCrossing*) actor); - break; - case ACTOR_YOSHI_EGG: - render_actor_yoshi_egg(camera, D_801502C0, (struct YoshiValleyEgg*) actor, pathCounter); - break; - } - // @recomp Pop the transform id. - gEXPopMatrixGroup(gDisplayListHead++, G_MTX_MODELVIEW); - } - - if ((gCamera1Skipped && (camera->playerId == 1)) || (gCamera2Skipped && (camera->playerId == 2)) || - (gCamera3Skipped && (camera->playerId == 3)) || (gCamera4Skipped && (camera->playerId == 4))) { - // Skip - // @recomp Tag the transform - gEXMatrixGroupDecomposed(gDisplayListHead++, TAG_OBJECT((u32) actor << 16) | 0x01000000, G_EX_PUSH, - G_MTX_MODELVIEW, G_EX_COMPONENT_SKIP, G_EX_COMPONENT_SKIP, G_EX_COMPONENT_SKIP, - G_EX_COMPONENT_SKIP, G_EX_COMPONENT_SKIP, G_EX_COMPONENT_SKIP, G_EX_COMPONENT_SKIP, - G_EX_ORDER_AUTO, G_EX_EDIT_ALLOW); - // recomp_printf("render_course_actors: Camera %d skipped \n", camera->playerId); - } else { - // @recomp Tag the transform - gEXMatrixGroupDecomposed(gDisplayListHead++, TAG_OBJECT((u32) actor << 16) | 0x01000000, G_EX_PUSH, - G_MTX_MODELVIEW, G_EX_COMPONENT_AUTO, G_EX_COMPONENT_AUTO, G_EX_COMPONENT_AUTO, - G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_SKIP, - G_EX_COMPONENT_INTERPOLATE, G_EX_ORDER_AUTO, G_EX_EDIT_ALLOW); - } - - switch (gCurrentCourseId) { - case COURSE_MOO_MOO_FARM: - render_cows(camera, D_801502C0, actor); - break; - case COURSE_DK_JUNGLE: - render_palm_trees(camera, D_801502C0, actor); - break; - } - // @recomp Pop the transform id. - gEXPopMatrixGroup(gDisplayListHead++, G_MTX_MODELVIEW); -} -#endif - -#if 1 -RECOMP_PATCH void render_object_for_player(s32 cameraId) { - // @recomp Tag the transform. - gEXMatrixGroupDecomposedNormal(gDisplayListHead++, TAG_OBJECT_BY_CAM_ID(cameraId), G_EX_PUSH, G_MTX_MODELVIEW, - G_EX_EDIT_ALLOW); - - switch (gCurrentCourseId) { - case COURSE_MARIO_RACEWAY: - break; - case COURSE_CHOCO_MOUNTAIN: - break; - case COURSE_BOWSER_CASTLE: - render_object_thwomps(cameraId); - render_object_bowser_flame(cameraId); - break; - case COURSE_BANSHEE_BOARDWALK: - if (gGamestate != CREDITS_SEQUENCE) { - render_object_trash_bin(cameraId); - render_object_bat(cameraId); - func_8005217C(cameraId); - render_object_boos(cameraId); - } - break; - case COURSE_YOSHI_VALLEY: - func_80055228(cameraId); - if (gGamestate != CREDITS_SEQUENCE) { - render_object_hedgehogs(cameraId); - } - break; - case COURSE_FRAPPE_SNOWLAND: - if (gGamestate != CREDITS_SEQUENCE) { - render_object_snowmans(cameraId); - } - break; - case COURSE_KOOPA_BEACH: - if (gGamestate != CREDITS_SEQUENCE) { - render_object_crabs(cameraId); - } - if (gGamestate != CREDITS_SEQUENCE) { - if ((gPlayerCount == 1) || (gPlayerCount == 2)) { - render_object_seagulls(cameraId); - } - } else { - render_object_seagulls(cameraId); - } - break; - case COURSE_ROYAL_RACEWAY: - break; - case COURSE_LUIGI_RACEWAY: - if (D_80165898 != 0) { - render_object_hot_air_balloon(cameraId); - } - break; - case COURSE_MOO_MOO_FARM: - if (gGamestate != CREDITS_SEQUENCE) { - render_object_moles(cameraId); - } - break; - case COURSE_TOADS_TURNPIKE: - break; - case COURSE_KALAMARI_DESERT: - render_object_trains_smoke_particles(cameraId); - break; - case COURSE_SHERBET_LAND: - if (gGamestate != CREDITS_SEQUENCE) { - func_80052E30(cameraId); - } - render_object_train_penguins(cameraId); - break; - case COURSE_RAINBOW_ROAD: - if (gGamestate != CREDITS_SEQUENCE) { - render_object_neon(cameraId); - render_object_chain_chomps(cameraId); - } - break; - case COURSE_WARIO_STADIUM: - break; - case COURSE_BLOCK_FORT: - break; - case COURSE_SKYSCRAPER: - break; - case COURSE_DOUBLE_DECK: - break; - case COURSE_DK_JUNGLE: - if (gGamestate != CREDITS_SEQUENCE) { - render_object_paddle_boat_smoke_particles(cameraId); - } - break; - } - - render_object_smoke_particles(cameraId); - render_object_leaf_particle(cameraId); - - if (D_80165730 != 0) { - func_80053E6C(cameraId); - } - if (gModeSelection == BATTLE) { - render_object_bomb_kart(cameraId); - } - // @recomp Pop the transform id. - gEXPopMatrixGroup(gDisplayListHead++, G_MTX_MODELVIEW); -} -#endif - -#if 1 -RECOMP_PATCH void render_object_chain_chomps(s32 cameraId) { - s32 i; - s32 objectIndex; - - for (i = 0; i < NUM_CHAIN_CHOMPS; i++) { - objectIndex = indexObjectList2[i]; - // @recomp Tag the transform. - // @recomp Tag the transform. - gEXMatrixGroupDecomposedNormal(gDisplayListHead++, TAG_OBJECT((u32) &indexObjectList2[i] << 16) | cameraId, - G_EX_PUSH, G_MTX_MODELVIEW, G_EX_EDIT_ALLOW); - - func_8008A1D0(objectIndex, cameraId, 0x000005DC, 0x000009C4); - if (is_obj_flag_status_active(objectIndex, VISIBLE) != 0) { - func_80055AB8(objectIndex, cameraId); - } - // @recomp Pop the transform id. - gEXPopMatrixGroup(gDisplayListHead++, G_MTX_MODELVIEW); - } -} -#endif - -#if 1 -RECOMP_PATCH void render_object_bomb_kart(s32 cameraId) { - Player* temp_v0; - s32 temp_s1; - s32 temp_s0; - s32 i; - Object* object; - - for (i = 0; i < 4; i++) { - temp_s0 = gIndexObjectBombKart[i]; - object = &gObjectList[temp_s0]; - // @recomp Tag the transform. - gEXMatrixGroupDecomposedNormal(gDisplayListHead++, - TAG_OBJECT((u32) &gObjectList[temp_s0] << 16) | temp_s0 & 0xFF << 8 | cameraId, - G_EX_PUSH, G_MTX_MODELVIEW, G_EX_EDIT_ALLOW); - if (object->state != 0) { - temp_s1 = object->primAlpha; - temp_v0 = &gPlayerOne[i]; - object->pos[0] = temp_v0->pos[0]; - object->pos[1] = temp_v0->pos[1] - 2.0; - object->pos[2] = temp_v0->pos[2]; - object->surfaceHeight = temp_v0->unk_074; - func_800563DC(temp_s0, cameraId, temp_s1); - func_8005669C(temp_s0, cameraId, temp_s1); - func_800568A0(temp_s0, cameraId); - } - // @recomp Pop the transform id. - gEXPopMatrixGroup(gDisplayListHead++, G_MTX_MODELVIEW); - } -} -#endif - -#if 1 -RECOMP_PATCH void func_80053E6C(s32 arg0) __attribute__((optnone)) { - s32 i; - s32 objectIndex; - - gSPDisplayList(gDisplayListHead++, (Gfx*) 0x0D007E98); - gDPLoadTLUT_pal256(gDisplayListHead++, (u8*) 0x800E52D0); - func_8004B614(0, 0, 0, 0, 0, 0, 0); - D_80183E80[0] = 0; - D_80183E80[1] = 0x8000; - rsp_load_texture(D_8018D4BC, 64, 32); - - for (i = 0; i < D_80165738; i++) { - objectIndex = gObjectParticle3[i]; - // @recomp Tag the transform. - gEXMatrixGroupDecomposedNormal(gDisplayListHead++, TAG_OBJECT(&gObjectParticle3[i]) | arg0, G_EX_PUSH, - G_MTX_MODELVIEW, G_EX_EDIT_ALLOW); - if ((objectIndex != NULL_OBJECT_ID) && (gObjectList[objectIndex].state >= 2)) { - func_80053D74(objectIndex, arg0, 0); - } - // @recomp Pop the transform id. - gEXPopMatrixGroup(gDisplayListHead++, G_MTX_MODELVIEW); - } - - rsp_load_texture(D_8018D4C0, 0x40, 0x20); - - for (i = 0; i < D_80165738; i++) { - objectIndex = gObjectParticle3[i]; - // @recomp Tag the transform. - gEXMatrixGroupDecomposedNormal(gDisplayListHead++, TAG_OBJECT(&gObjectParticle3[i]) | arg0, G_EX_PUSH, - G_MTX_MODELVIEW, G_EX_EDIT_ALLOW); - if ((objectIndex != NULL_OBJECT_ID) && (gObjectList[objectIndex].state >= 2)) { - func_80053D74(objectIndex, arg0, 4); - } - // @recomp Pop the transform id. - gEXPopMatrixGroup(gDisplayListHead++, G_MTX_MODELVIEW); - } -} -#endif - -#if 1 -RECOMP_PATCH void render_object_leaf_particle(s32 cameraId) { - s32 i; - s32 leafIndex; - Object* object; - - gSPDisplayList(gDisplayListHead++, (Gfx*) 0x0D0079C8); - gSPClearGeometryMode(gDisplayListHead++, G_CULL_BOTH); - load_texture_block_rgba16_mirror((u8*) 0x0d028dd8 /* common_texture_particle_leaf */, 32, 16); - for (i = 0; i < gLeafParticle_SIZE; i++) { - leafIndex = gLeafParticle[i]; - // @recomp Tag the transform. - gEXMatrixGroupDecomposedNormal(gDisplayListHead++, TAG_OBJECT(&gLeafParticle[i]) | cameraId, G_EX_PUSH, - G_MTX_MODELVIEW, G_EX_EDIT_ALLOW); - if (leafIndex != -1) { - object = &gObjectList[leafIndex]; - if ((object->state >= 2) && (object->unk_0D5 == 7) && (gMatrixHudCount <= MTX_HUD_POOL_SIZE_MAX)) { - rsp_set_matrix_gObjectList(leafIndex); - gSPDisplayList(gDisplayListHead++, (Gfx*) 0x0D0069C8); - } - } - // @recomp Pop the transform id. - gEXPopMatrixGroup(gDisplayListHead++, G_MTX_MODELVIEW); - } - gSPSetGeometryMode(gDisplayListHead++, G_CULL_BACK); - gSPTexture(gDisplayListHead++, 1, 1, 0, G_TX_RENDERTILE, G_OFF); -} -#endif - -#if 1 -RECOMP_PATCH void render_object_smoke_particles(s32 cameraId) { - Camera* sp54; - s32 i; - s32 objectIndex; - Object* object; - - sp54 = &camera1[cameraId]; - gSPDisplayList(gDisplayListHead++, (Gfx*) 0x0D007AE0); - u8(*common_texture_particle_smoke)[1024] = (u8(*)[1024]) 0x0d02bc58; - load_texture_block_i8_nomirror(common_texture_particle_smoke[D_80165598], 32, 32); - func_8004B72C(255, 255, 255, 255, 255, 255, 255); - D_80183E80[0] = 0; - D_80183E80[2] = 0x8000; - for (i = 0; i < gObjectParticle4_SIZE; i++) { - objectIndex = gObjectParticle4[i]; - // @recomp Tag the transform - gEXMatrixGroupDecomposed(gDisplayListHead++, (TAG_OBJECT(gObjectParticle4[i]) << 16) & 0xFFFF0000 | i, - G_EX_PUSH, G_MTX_MODELVIEW, G_EX_COMPONENT_AUTO, G_EX_COMPONENT_AUTO, - G_EX_COMPONENT_AUTO, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, - G_EX_COMPONENT_SKIP, G_EX_COMPONENT_INTERPOLATE, G_EX_ORDER_AUTO, G_EX_EDIT_ALLOW); - - if (objectIndex != NULL_OBJECT_ID) { - object = &gObjectList[objectIndex]; - if (object->state >= 2) { - if (object->unk_0D8 == 3) { - func_8008A364(objectIndex, cameraId, 0x4000U, 0x00000514); - } else { - func_8008A364(objectIndex, cameraId, 0x4000U, 0x000001F4); - } - if (is_obj_flag_status_active(objectIndex, VISIBLE) != 0) { - func_8005477C(objectIndex, object->unk_0D8, sp54->pos); - } - } - } - // @recomp Pop the transform id. - gEXPopMatrixGroup(gDisplayListHead++, G_MTX_MODELVIEW); - } -} - -#endif - -#if 1 -RECOMP_PATCH void render_object_paddle_boat_smoke_particles(s32 cameraId) { - UNUSED s32 pad[2]; - Camera* camera; - s32 i; - - camera = &camera1[cameraId]; - gSPDisplayList(gDisplayListHead++, (Gfx*) 0x0D007AE0); - - load_texture_block_i8_nomirror((u8*) 0x0D029458, 32, 32); - func_8004B72C(255, 255, 255, 255, 255, 255, 255); - D_80183E80[0] = 0; - D_80183E80[2] = 0x8000; - if ((gPaddleBoats[0].someFlags != 0) && (is_particle_on_screen(gPaddleBoats[0].position, camera, 0x4000U) != 0)) { - for (i = 0; i < gObjectParticle2_SIZE; i++) { - // @recomp Tag the transform - gEXMatrixGroupDecomposed(gDisplayListHead++, (TAG_OBJECT(gObjectParticle2[i]) << 16) & 0xFFFF0000 | i, - G_EX_PUSH, G_MTX_MODELVIEW, G_EX_COMPONENT_AUTO, G_EX_COMPONENT_AUTO, - G_EX_COMPONENT_AUTO, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, - G_EX_COMPONENT_SKIP, G_EX_COMPONENT_INTERPOLATE, G_EX_ORDER_AUTO, G_EX_EDIT_ALLOW); - - render_object_paddle_boat_smoke_particle(gObjectParticle2[i], cameraId); - - // @recomp Pop the transform id. - gEXPopMatrixGroup(gDisplayListHead++, G_MTX_MODELVIEW); - } - } - if ((gPaddleBoats[1].someFlags != 0) && (is_particle_on_screen(gPaddleBoats[1].position, camera, 0x4000U) != 0)) { - for (i = 0; i < gObjectParticle3_SIZE; i++) { - // @recomp Tag the transform - gEXMatrixGroupDecomposed(gDisplayListHead++, (TAG_OBJECT(gObjectParticle3[i]) << 16) & 0xFFFF0000 | i, - G_EX_PUSH, G_MTX_MODELVIEW, G_EX_COMPONENT_AUTO, G_EX_COMPONENT_AUTO, - G_EX_COMPONENT_AUTO, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, - G_EX_COMPONENT_SKIP, G_EX_COMPONENT_INTERPOLATE, G_EX_ORDER_AUTO, G_EX_EDIT_ALLOW); - - render_object_paddle_boat_smoke_particle(gObjectParticle3[i], cameraId); - - // @recomp Pop the transform id. - gEXPopMatrixGroup(gDisplayListHead++, G_MTX_MODELVIEW); - } - } -} -#endif - -#if 1 -RECOMP_PATCH void render_object_neon(s32 cameraId) { - Camera* camera; - s32 i; - s32 objectIndex; - Object* object; - - camera = &camera1[cameraId]; - for (i = 0; i < 10; i++) { - objectIndex = indexObjectList1[i]; - - // @recomp Tag the transform. - gEXMatrixGroupDecomposedNormal(gDisplayListHead++, TAG_OBJECT(&indexObjectList1[i]) | cameraId, G_EX_PUSH, - G_MTX_MODELVIEW, G_EX_EDIT_ALLOW); - - if (D_8018E838[cameraId] == 0) { - object = &gObjectList[objectIndex]; - if ((object->state >= 2) && (is_obj_index_flag_status_inactive(objectIndex, 0x00080000) != 0) && - (is_object_visible_on_camera(objectIndex, camera, 0x2AABU) != 0)) { - object->orientation[1] = angle_between_object_camera(objectIndex, camera); - draw_2d_texture_at(object->pos, object->orientation, object->sizeScaling, (u8*) object->activeTLUT, - object->activeTexture, (Vtx*) 0x0d0060b0 /* common_vtx_hedgehog */, 64, 64, 64, 32); - } - } - - // @recomp Pop the transform id. - gEXPopMatrixGroup(gDisplayListHead++, G_MTX_MODELVIEW); - } -} -#endif - -#if 1 -RECOMP_PATCH void render_object_train_penguins(s32 cameraId) { - s32 i; - s32 objectIndex; - s32 temp_s1; - s32 var_a3; - u16 var_s1; - u32 var_s3; - - if (gPlayerCountSelection1 == 1) { - var_s3 = 0x0003D090; - } else if (gPlayerCountSelection1 == 2) { - var_s3 = 0x00027100; - } else { - var_s3 = 0x00015F90; - } - for (i = 0; i < NUM_PENGUINS; i++) { - objectIndex = indexObjectList1[i]; - - // @recomp Tag the transform. - // gEXMatrixGroupDecomposedNormal(gDisplayListHead++, TAG_OBJECT(&indexObjectList1[i]) | cameraId, G_EX_PUSH, - // G_MTX_MODELVIEW, G_EX_EDIT_ALLOW); - // @recomp Tag the transform - gEXMatrixGroupDecomposed(gDisplayListHead++, TAG_OBJECT(&indexObjectList1[i]) | cameraId, G_EX_PUSH, - G_MTX_MODELVIEW, G_EX_COMPONENT_AUTO, G_EX_COMPONENT_AUTO, G_EX_COMPONENT_AUTO, - G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_SKIP, - G_EX_COMPONENT_INTERPOLATE, G_EX_ORDER_AUTO, G_EX_EDIT_ALLOW); - - if (gObjectList[objectIndex].state >= 2) { - if (gPlayerCountSelection1 == 1) { - var_s1 = 0x4000; - if (i == 0) { - var_a3 = 0x000005DC; - } else if (func_80072320(objectIndex, 8) != 0) { - var_a3 = 0x00000320; - } else { - var_a3 = 0x000003E8; - } - } else { - if (func_80072320(objectIndex, 8) != 0) { - var_a3 = 0x000001F4; - var_s1 = 0x4000; - } else { - var_a3 = 0x00000258; - var_s1 = 0x5555; - } - } - temp_s1 = func_8008A364(objectIndex, cameraId, var_s1, var_a3); - if (is_obj_flag_status_active(objectIndex, VISIBLE) != 0) { - func_800557B4(objectIndex, (u32) temp_s1, var_s3); - } - } - - // @recomp Pop the transform id. - gEXPopMatrixGroup(gDisplayListHead++, G_MTX_MODELVIEW); - } -} -#endif - -#if 1 -RECOMP_PATCH void render_object_moles(s32 cameraId) { - s32 i; - - for (i = 0; i < NUM_GROUP1_MOLES; i++) { - // @recomp Tag the transform. - gEXMatrixGroupDecomposedNormal(gDisplayListHead++, TAG_OBJECT(&indexObjectList1[i]) | cameraId, G_EX_PUSH, - G_MTX_MODELVIEW, G_EX_EDIT_ALLOW); - func_80054D00(indexObjectList1[i], cameraId); - // @recomp Pop the transform id. - gEXPopMatrixGroup(gDisplayListHead++, G_MTX_MODELVIEW); - } - for (i = 0; i < NUM_GROUP2_MOLES; i++) { - // @recomp Tag the transform. - gEXMatrixGroupDecomposedNormal(gDisplayListHead++, TAG_OBJECT(&indexObjectList2[i]) | cameraId, G_EX_PUSH, - G_MTX_MODELVIEW, G_EX_EDIT_ALLOW); - func_80054D00(indexObjectList2[i], cameraId); - // @recomp Pop the transform id. - gEXPopMatrixGroup(gDisplayListHead++, G_MTX_MODELVIEW); - } - for (i = 0; i < NUM_GROUP3_MOLES; i++) { - // @recomp Tag the transform. - gEXMatrixGroupDecomposedNormal(gDisplayListHead++, TAG_OBJECT(&indexObjectList3[i]) | cameraId, G_EX_PUSH, - G_MTX_MODELVIEW, G_EX_EDIT_ALLOW); - func_80054D00(indexObjectList3[i], cameraId); - // @recomp Pop the transform id. - gEXPopMatrixGroup(gDisplayListHead++, G_MTX_MODELVIEW); - } - func_80054EB8(cameraId); - func_80054F04(cameraId); -} - -RECOMP_PATCH void func_80054EB8(s32 cameraId) { - s32 i; - - for (i = 0; i < NUM_TOTAL_MOLES; i++) { - // @recomp Tag the transform. - gEXMatrixGroupDecomposedNormal(gDisplayListHead++, TAG_OBJECT(&gObjectParticle1[i]) | cameraId, G_EX_PUSH, - G_MTX_MODELVIEW, G_EX_EDIT_ALLOW); - func_80054E10(gObjectParticle1[i]); - // @recomp Pop the transform id. - gEXPopMatrixGroup(gDisplayListHead++, G_MTX_MODELVIEW); - } -} - -RECOMP_PATCH void func_80054F04(s32 cameraId) { - s32 i; - s32 objectIndex; - Camera* sp44; - Object* object; - - sp44 = &camera1[cameraId]; - gSPDisplayList(gDisplayListHead++, (Gfx*) 0x0D0079C8); - load_texture_block_rgba16_mirror((u8*) 0x06013670 /* d_course_moo_moo_farm_mole_dirt */, 0x00000010, 0x00000010); - for (i = 0; i < gObjectParticle2_SIZE; i++) { - objectIndex = gObjectParticle2[i]; - object = &gObjectList[objectIndex]; - // @recomp Tag the transform. - gEXMatrixGroupDecomposedNormal(gDisplayListHead++, TAG_OBJECT(object) | cameraId | (i & 0xFF) << 8, G_EX_PUSH, - G_MTX_MODELVIEW, G_EX_EDIT_ALLOW); - if (object->state > 0) { - func_8008A364(objectIndex, cameraId, 0x2AABU, 0x000000C8); - if ((is_obj_flag_status_active(objectIndex, VISIBLE) != 0) && (gMatrixHudCount <= MTX_HUD_POOL_SIZE_MAX)) { - object->orientation[1] = func_800418AC(object->pos[0], object->pos[2], sp44->pos); - rsp_set_matrix_gObjectList(objectIndex); - gSPDisplayList(gDisplayListHead++, (Gfx*) 0x0D006980); - } - } - // @recomp Pop the transform id. - gEXPopMatrixGroup(gDisplayListHead++, G_MTX_MODELVIEW); - } - gSPTexture(gDisplayListHead++, 1, 1, 0, G_TX_RENDERTILE, G_OFF); -} -#endif - -#if 1 -RECOMP_PATCH void render_object_seagulls(s32 arg0) { - s32 i; - s32 var_s1; - - for (i = 0; i < NUM_SEAGULLS; i++) { - var_s1 = indexObjectList2[i]; - // @recomp Tag the transform. - // gEXMatrixGroupDecomposedNormal(gDisplayListHead++, TAG_OBJECT(&indexObjectList1[i]) | arg0, G_EX_PUSH, - // G_MTX_MODELVIEW, G_EX_EDIT_ALLOW); - gEXMatrixGroupDecomposed(gDisplayListHead++, TAG_OBJECT(&indexObjectList1[i]) | arg0, G_EX_PUSH, - G_MTX_MODELVIEW, G_EX_COMPONENT_AUTO, G_EX_COMPONENT_AUTO, G_EX_COMPONENT_AUTO, - G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_SKIP, - G_EX_COMPONENT_INTERPOLATE, G_EX_ORDER_LINEAR, G_EX_EDIT_ALLOW); - - if (func_8008A364(var_s1, arg0, 0x5555U, 0x000005DC) < 0x9C401) { - D_80165908 = 1; - func_800722A4(var_s1, 2); - } - if (is_obj_flag_status_active(var_s1, VISIBLE) != 0) { - func_800552BC(var_s1); - } - // @recomp Pop the transform id. - gEXPopMatrixGroup(gDisplayListHead++, G_MTX_MODELVIEW); - } -} - -#endif - -#if 1 -RECOMP_PATCH void render_object_crabs(s32 cameraId) { - s32 i; - s32 objId; - - for (i = 0; i < NUM_CRABS; i++) { - objId = indexObjectList1[i]; - // @recomp Tag the transform. - // gEXMatrixGroupDecomposedNormal(gDisplayListHead++, TAG_OBJECT(&indexObjectList1[i]) | cameraId, G_EX_PUSH, - // G_MTX_MODELVIEW, G_EX_EDIT_ALLOW); - gEXMatrixGroupDecomposed(gDisplayListHead++, TAG_OBJECT(&indexObjectList1[i]) | cameraId, G_EX_PUSH, - G_MTX_MODELVIEW, G_EX_COMPONENT_AUTO, G_EX_COMPONENT_AUTO, G_EX_COMPONENT_AUTO, - G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_SKIP, - G_EX_COMPONENT_INTERPOLATE, G_EX_ORDER_LINEAR, G_EX_EDIT_ALLOW); - func_8008A364(objId, cameraId, 0x2AABU, 800); - if (1 /* is_obj_flag_status_active(objId, VISIBLE) != 0*/) { - draw_crabs(objId, cameraId); - } - // @recomp Pop the transform id. - gEXPopMatrixGroup(gDisplayListHead++, G_MTX_MODELVIEW); - } -} -#endif - -#if 1 -RECOMP_PATCH void render_object_snowmans_list_1(s32 cameraId) { - s32 i; - s32 objectIndex; - Camera* camera = &camera1[cameraId]; - - for (i = 0; i < NUM_SNOWMEN; i++) { - objectIndex = indexObjectList1[i]; - // @recomp Tag the transform. - gEXMatrixGroupDecomposedNormal(gDisplayListHead++, TAG_OBJECT(&indexObjectList1[i]) | cameraId, G_EX_PUSH, - G_MTX_MODELVIEW, G_EX_EDIT_ALLOW); - if (gObjectList[objectIndex].state >= 2) { - func_8008A364(objectIndex, cameraId, 0x2AABU, 600); - if (is_obj_flag_status_active(objectIndex, VISIBLE) != 0) { - D_80183E80[0] = (s16) gObjectList[objectIndex].orientation[0]; - D_80183E80[1] = - func_800418AC(gObjectList[objectIndex].pos[0], gObjectList[objectIndex].pos[2], camera->pos); - D_80183E80[2] = (u16) gObjectList[objectIndex].orientation[2]; - if (is_obj_flag_status_active(objectIndex, 16) != 0) { - draw_2d_texture_at(gObjectList[objectIndex].pos, (u16*) D_80183E80, - gObjectList[objectIndex].sizeScaling, (u8*) gObjectList[objectIndex].activeTLUT, - gObjectList[objectIndex].activeTexture, gObjectList[objectIndex].vertex, 64, 64, - 64, 32); - } - objectIndex = indexObjectList2[i]; - D_80183E80[0] = (s16) gObjectList[objectIndex].orientation[0]; - D_80183E80[2] = (u16) gObjectList[objectIndex].orientation[2]; - draw_2d_texture_at(gObjectList[objectIndex].pos, (u16*) D_80183E80, - gObjectList[objectIndex].sizeScaling, (u8*) gObjectList[objectIndex].activeTLUT, - gObjectList[objectIndex].activeTexture, gObjectList[objectIndex].vertex, 64, 64, 64, - 32); - } - } - // @recomp Pop the transform id. - gEXPopMatrixGroup(gDisplayListHead++, G_MTX_MODELVIEW); - } -} -#endif - -#if 1 -RECOMP_PATCH void render_object_snowmans_list_2(s32 cameraId) { - Camera* sp44 = &camera1[cameraId]; - s32 i; - s32 objectIndex; - Object* object; - - load_texture_and_tlut((u8*) 0x06006d20 /* d_course_frappe_snowland_snow_tlut */, - (u8*) 0x06006f20 /* d_course_frappe_snowland_snow */, 32, 32); - for (i = 0; i < gObjectParticle2_SIZE; i++) { - objectIndex = gObjectParticle2[i]; - - // @recomp Tag the transform. - gEXMatrixGroupDecomposedNormal(gDisplayListHead++, TAG_OBJECT(gObjectParticle2[i]) | cameraId, G_EX_PUSH, - G_MTX_MODELVIEW, G_EX_EDIT_ALLOW); - - if (objectIndex != NULL_OBJECT_ID) { - object = &gObjectList[objectIndex]; - if (object->state > 0) { - func_8008A364(objectIndex, cameraId, 0x2AABU, 0x000001F4); - if (is_obj_flag_status_active(objectIndex, VISIBLE) != 0) { - object->orientation[1] = func_800418AC(object->pos[0], object->pos[2], sp44->pos); - rsp_set_matrix_gObjectList(objectIndex); - gSPDisplayList(gDisplayListHead++, (Gfx*) 0x0D0069E0); - } - } - } - // @recomp Pop the transform id. - gEXPopMatrixGroup(gDisplayListHead++, G_MTX_MODELVIEW); - } - gSPTexture(gDisplayListHead++, 1, 1, 0, G_TX_RENDERTILE, G_OFF); -} -#endif - -#if 1 -RECOMP_PATCH void func_80055228(s32 cameraId) { - s32 i; - s32 temp_s0; - - for (i = 0; i < 4; i++) { - temp_s0 = indexObjectList1[i]; - func_8008A364(temp_s0, cameraId, 0x4000U, 0x000005DC); - - // @recomp Tag the transform. - gEXMatrixGroupDecomposedNormal(gDisplayListHead++, TAG_OBJECT(&indexObjectList1[i]) | cameraId, G_EX_PUSH, - G_MTX_MODELVIEW, G_EX_EDIT_ALLOW); - - if (is_obj_flag_status_active(temp_s0, VISIBLE) != 0) { - func_80055164(temp_s0); - } - - // @recomp Pop the transform id. - gEXPopMatrixGroup(gDisplayListHead++, G_MTX_MODELVIEW); - } -} -#endif - -#if 1 -RECOMP_PATCH void render_object_hedgehogs(s32 arg0) { - s32 test; - u32 var; - s32 i; - - for (i = 0; i < NUM_HEDGEHOGS; i++) { - test = indexObjectList2[i]; - var = func_8008A364(test, arg0, 0x4000U, 0x000003E8); - - // @recomp Tag the transform. - gEXMatrixGroupDecomposedNormal(gDisplayListHead++, TAG_OBJECT(&indexObjectList2[i]) | arg0, G_EX_PUSH, - G_MTX_MODELVIEW, G_EX_EDIT_ALLOW); - - if (is_obj_flag_status_active(test, VISIBLE) != 0) { - set_object_flag_status_true(test, 0x00200000); - if (var < 0x2711U) { - set_object_flag_status_true(test, 0x00000020); - } else { - set_object_flag_status_false(test, 0x00000020); - } - if (var < 0x57E41U) { - set_object_flag_status_true(test, 0x00400000); - } - if (var < 0x52211U) { - func_800555BC(test, arg0); - } - } - // @recomp Pop the transform id. - gEXPopMatrixGroup(gDisplayListHead++, G_MTX_MODELVIEW); - } -} -#endif - -#if 1 -RECOMP_PATCH void render_object_boos(s32 arg0) { - u32 temp_s2; - s32 i; - s32 objectIndex; - - for (i = 0; i < NUM_BOOS; i++) { - objectIndex = indexObjectList3[i]; - - // @recomp Tag the transform. - gEXMatrixGroupDecomposedNormal(gDisplayListHead++, TAG_OBJECT(&gObjectList[objectIndex]) | arg0, G_EX_PUSH, - G_MTX_MODELVIEW, G_EX_EDIT_ALLOW); - if (gObjectList[objectIndex].state >= 2) { - temp_s2 = func_8008A364(objectIndex, arg0, 0x4000U, 0x00000320); - if (is_obj_flag_status_active(objectIndex, VISIBLE) != 0) { - func_800523B8(objectIndex, arg0, temp_s2); - } - } - - // @recomp Pop the transform id. - gEXPopMatrixGroup(gDisplayListHead++, G_MTX_MODELVIEW); - } -} -#endif - -#if 1 // Bats (Banshee Boardwalk) tb181 -RECOMP_PATCH void render_object_bat(s32 cameraId) { - s32 i; - s32 objectIndex; - Camera* temp_s7; - - objectIndex = indexObjectList1[0]; - temp_s7 = &camera1[cameraId]; - func_80046F60(gObjectList[objectIndex].activeTLUT, gObjectList[objectIndex].activeTexture, 0x00000020, 0x00000040, - 5); - - D_80183E80[0] = gObjectList[objectIndex].orientation[0]; - D_80183E80[2] = gObjectList[objectIndex].orientation[2]; - - if ((D_8018CFB0 != 0) || (D_8018CFC8 != 0)) { - for (i = 0; i < 40; i++) { - objectIndex = gObjectParticle2[i]; - if (objectIndex == -1) - continue; - - if ((gObjectList[objectIndex].state >= 2) && (gMatrixHudCount < 0x2EF)) { - D_80183E80[1] = - func_800418AC(gObjectList[objectIndex].pos[0], gObjectList[objectIndex].pos[2], temp_s7->pos); - - // Tagging the transform with unique object properties - s32 transformTag = ((objectIndex & 0xFF) << 16) | ((i & 0xFF) << 8) | (cameraId & 0xFF); - - gEXMatrixGroupDecomposed(gDisplayListHead++, transformTag, G_EX_PUSH, G_MTX_MODELVIEW, - G_EX_COMPONENT_AUTO, G_EX_COMPONENT_AUTO, G_EX_COMPONENT_AUTO, - G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_SKIP, - G_EX_COMPONENT_INTERPOLATE, G_EX_ORDER_LINEAR, G_EX_EDIT_ALLOW); - - func_800431B0(gObjectList[objectIndex].pos, D_80183E80, gObjectList[objectIndex].sizeScaling, - (Vtx*) 0x0D0062B0); - - // @recomp Pop the transform id. - gEXPopMatrixGroup(gDisplayListHead++, G_MTX_MODELVIEW); - } - } - } - - if ((D_8018CFE8 != 0) || (D_8018D000 != 0)) { - for (i = 0; i < 30; i++) { - objectIndex = gObjectParticle3[i]; - if (objectIndex == -1) - continue; - - if ((gObjectList[objectIndex].state >= 2) && (gMatrixHudCount < 0x2EF)) { - D_80183E80[1] = - func_800418AC(gObjectList[objectIndex].pos[0], gObjectList[objectIndex].pos[2], temp_s7->pos); - - // Tagging the transform with unique object properties - s32 transformTag = ((objectIndex & 0xFF) << 16) | ((i & 0xFF) << 8) | (cameraId & 0xFF); - - gEXMatrixGroupDecomposed(gDisplayListHead++, transformTag, G_EX_PUSH, G_MTX_MODELVIEW, - G_EX_COMPONENT_AUTO, G_EX_COMPONENT_AUTO, G_EX_COMPONENT_AUTO, - G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_SKIP, - G_EX_COMPONENT_INTERPOLATE, G_EX_ORDER_LINEAR, G_EX_EDIT_ALLOW); - - func_800431B0(gObjectList[objectIndex].pos, D_80183E80, gObjectList[objectIndex].sizeScaling, - (Vtx*) 0x0D0062B0); - - // @recomp Pop the transform id. - gEXPopMatrixGroup(gDisplayListHead++, G_MTX_MODELVIEW); - } - } - } - - gSPTexture(gDisplayListHead++, 0x0001, 0x0001, 0, G_TX_RENDERTILE, G_OFF); -} -#endif - -#if 1 -RECOMP_PATCH void render_object_thwomps(s32 cameraId) { - s32 objectIndex = 0; - s32 i; - UNUSED s32 stackPadding0; - s16 minusone, plusone; - Camera* camera; - Object* object; - - camera = &camera1[cameraId]; - if (cameraId == PLAYER_ONE) { - for (i = 0; i < gNumActiveThwomps; i++) { - objectIndex = indexObjectList1[i]; - set_object_flag_status_false(objectIndex, 0x00070000); - func_800722CC(objectIndex, 0x00000110); - } - } - - func_800534A4(objectIndex); - for (i = 0; i < gNumActiveThwomps; i++) { - objectIndex = indexObjectList1[i]; - minusone = gObjectList[objectIndex].unk_0DF - 1; - plusone = gObjectList[objectIndex].unk_0DF + 1; - - // @recomp Tag the transform. - gEXMatrixGroupDecomposedNormal(gDisplayListHead++, TAG_OBJECT(&gObjectList[objectIndex]) | i, G_EX_PUSH, - G_MTX_MODELVIEW, G_EX_EDIT_ALLOW); - - if (gGamestate != 9) { - if ((D_8018CF68[cameraId] >= minusone) && (plusone >= D_8018CF68[cameraId]) && - (is_object_visible_on_camera(objectIndex, camera, 0x8000U) != 0)) { - render_object_thwomps_model(objectIndex); - } - } else { - render_object_thwomps_model(objectIndex); - } - - // @recomp Pop the transform id. - gEXPopMatrixGroup(gDisplayListHead++, G_MTX_MODELVIEW); - } - gSPDisplayList(gDisplayListHead++, (Gfx*) 0x0D0079C8); - gDPSetCombineMode(gDisplayListHead++, G_CC_MODULATEIA, G_CC_MODULATEIA); - gSPNumLights(gDisplayListHead++, 1); - gSPLight(gDisplayListHead++, &D_800E4668.l[0], LIGHT_1); - gSPLight(gDisplayListHead++, &D_800E4668.a, LIGHT_2); - gSPClearGeometryMode(gDisplayListHead++, G_CULL_BOTH); - gSPSetGeometryMode(gDisplayListHead++, G_SHADE | G_LIGHTING | G_SHADING_SMOOTH); - load_texture_block_rgba16_mirror((u8*) 0x06006738 /* d_course_bowsers_castle_thwomp_side */, 0x00000020, - 0x00000020); - for (i = 0; i < gObjectParticle3_SIZE; i++) { - objectIndex = gObjectParticle3[i]; - if (objectIndex != NULL_OBJECT_ID) { - object = &gObjectList[objectIndex]; - if ((object->state > 0) && (object->unk_0D5 == 3) && (gMatrixHudCount <= MTX_HUD_POOL_SIZE_MAX)) { - // @recomp Tag the transform. - gEXMatrixGroupDecomposedNormal(gDisplayListHead++, TAG_OBJECT(object) | i, G_EX_PUSH, G_MTX_MODELVIEW, - G_EX_EDIT_ALLOW); - - rsp_set_matrix_transformation(object->pos, object->orientation, object->sizeScaling); - gSPVertex(gDisplayListHead++, (Vtx*) 0x0D005C00, 3, 0); - gSPDisplayList(gDisplayListHead++, (Gfx*) 0x0D006930); - - // @recomp Pop the transform id. - gEXPopMatrixGroup(gDisplayListHead++, G_MTX_MODELVIEW); - } - } - } - gSPSetGeometryMode(gDisplayListHead++, G_CULL_BACK); - gSPClearGeometryMode(gDisplayListHead++, G_LIGHTING); - gSPTexture(gDisplayListHead++, 0x0001, 0x0001, 0, G_TX_RENDERTILE, G_OFF); - gSPDisplayList(gDisplayListHead++, (Gfx*) 0x0D007AE0); - load_texture_block_ia8_nomirror(D_8018D490, 0x00000020, 0x00000020); - func_8004B3C8(0); - D_80183E80[0] = 0; - D_80183E80[2] = 0x8000; - for (i = 0; i < gObjectParticle2_SIZE; i++) { - objectIndex = gObjectParticle2[i]; - if (objectIndex != NULL_OBJECT_ID) { - object = &gObjectList[objectIndex]; - if ((object->state >= 2) && (object->unk_0D5 == 2) && (gMatrixHudCount <= MTX_HUD_POOL_SIZE_MAX)) { - // @recomp Tag the transform. - gEXMatrixGroupDecomposedNormal(gDisplayListHead++, TAG_OBJECT(object) | i, G_EX_PUSH, G_MTX_MODELVIEW, - G_EX_EDIT_ALLOW); - - func_8004B138(0x000000FF, 0x000000FF, 0x000000FF, (s32) object->primAlpha); - D_80183E80[1] = func_800418AC(object->pos[0], object->pos[2], camera->pos); - func_800431B0(object->pos, D_80183E80, object->sizeScaling, (Vtx*) 0x0D005AE0); - - // @recomp Pop the transform id. - gEXPopMatrixGroup(gDisplayListHead++, G_MTX_MODELVIEW); - } - } - } -} -#endif - -#if 1 -RECOMP_PATCH void render_object_bowser_flame_particle(s32 objectIndex, s32 cameraId) { - Camera* camera; - Object* object; - - camera = &camera1[cameraId]; - if (gMatrixHudCount <= MTX_HUD_POOL_SIZE_MAX) { - object = &gObjectList[objectIndex]; - - // @recomp Tag the transform. - gEXMatrixGroupDecomposedNormal(gDisplayListHead++, TAG_OBJECT(object), G_EX_PUSH, G_MTX_MODELVIEW, - G_EX_EDIT_ALLOW); - - if (object->unk_0D5 == 9) { - func_8004B72C(0xFF, (s32) object->type, 0, (s32) object->unk_0A2, 0, 0, (s32) object->primAlpha); - } else { - func_8004B138(0xFF, (s32) object->type, 0, (s32) object->primAlpha); - } - D_80183E80[1] = func_800418AC(object->pos[0], object->pos[2], camera->pos); - func_800431B0(object->pos, D_80183E80, object->sizeScaling, (Vtx*) 0x0D005AE0); - - // @recomp Pop the transform id. - gEXPopMatrixGroup(gDisplayListHead++, G_MTX_MODELVIEW); - } -} -#endif - -#if 0 -RECOMP_PATCH void render_cows(Camera* camera, Mat4 arg1, UNUSED struct Actor* actor) { - u16 temp_s1; - f32 temp_f0; - struct ActorSpawnData* var_t1; - struct ActorSpawnData* var_s1; - struct ActorSpawnData* var_s5; - Vec3f sp88; - u32 soundThing = SOUND_ARG_LOAD(0x19, 0x01, 0x90, 0x4D); - s32 segment = SEGMENT_NUMBER2(0x06014200 /* d_course_moo_moo_farm_cow_spawn */); - s32 offset = SEGMENT_OFFSET(0x06014200 /* d_course_moo_moo_farm_cow_spawn */); - - var_t1 = (struct ActorSpawnData*) VIRTUAL_TO_PHYSICAL2(gSegmentTable[segment] + offset); - D_8015F704 = 6.4e7f; - gSPTexture(gDisplayListHead++, 0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON); - gDPSetCombineMode(gDisplayListHead++, G_CC_MODULATEIDECALA, G_CC_MODULATEIDECALA); - gDPSetRenderMode(gDisplayListHead++, G_RM_AA_ZB_TEX_EDGE, G_RM_AA_ZB_TEX_EDGE2); - var_s5 = NULL; - var_s1 = var_t1; - while (var_s1->pos[0] != END_OF_SPAWN_DATA) { - sp88[0] = var_s1->pos[0] * gCourseDirection; - sp88[1] = var_s1->pos[1]; - sp88[2] = var_s1->pos[2]; - temp_f0 = is_within_render_distance(camera->pos, sp88, camera->rot[1], 0.0f, gCameraZoom[camera - camera1], - 4000000.0f); - if (temp_f0 > 0.0f) { - if (temp_f0 < D_8015F704) { - D_8015F704 = temp_f0; - var_s5 = var_s1; - } - arg1[3][0] = sp88[0]; - arg1[3][1] = sp88[1]; - arg1[3][2] = sp88[2]; - if ((gMatrixObjectCount < MTX_OBJECT_POOL_SIZE)) { - // @recomp Tag the transform. - gEXMatrixGroupDecomposedNormal(gDisplayListHead++, TAG_OBJECT((u32) actor << 16) | var_s1->someId, - G_EX_PUSH, G_MTX_MODELVIEW, G_EX_EDIT_ALLOW); - - if (render_set_position(arg1, 0) != 0) { - - switch (var_s1->someId) { - case 0: - gSPDisplayList(gDisplayListHead++, (Gfx*) 0x06013c00 /* d_course_moo_moo_farm_dl_cow1 */); - break; - case 1: - gSPDisplayList(gDisplayListHead++, (Gfx*) 0x06013ca0 /* d_course_moo_moo_farm_dl_cow2 */); - break; - case 2: - gSPDisplayList(gDisplayListHead++, (Gfx*) 0x06013d20 /* d_course_moo_moo_farm_dl_cow3 */); - break; - case 3: - gSPDisplayList(gDisplayListHead++, (Gfx*) 0x06013da0 /* d_course_moo_moo_farm_dl_cow4 */); - break; - case 4: - gSPDisplayList(gDisplayListHead++, (Gfx*) 0x06013e20 /* d_course_moo_moo_farm_dl_cow5 */); - break; - } - } - // @recomp Pop the transform id. - gEXPopMatrixGroup(gDisplayListHead++, G_MTX_MODELVIEW); - } else { - return; - } - } - var_s1++; - } - - if ((camera == camera1) && (var_s5 != NULL)) { - if (D_8015F700 == 0) { - temp_s1 = var_s5 - var_t1; - if ((temp_s1 != D_8015F702) && (D_8015F704 < 160000.0f)) { - func_800C99E0(D_8015F708, soundThing); - D_8015F708[0] = var_s5->pos[0] * gCourseDirection; - D_8015F708[1] = var_s5->pos[1]; - D_8015F708[2] = var_s5->pos[2]; - D_8015F702 = temp_s1; - func_800C98B8(D_8015F708, D_802B91C8, soundThing); - D_8015F700 = 0x00F0; - } - } else { - D_8015F700 -= 1; - } - } -} -#endif - -#if 1 // Nintendo Logo (Nintendo Rotating Blur Effect) -RECOMP_PATCH void func_800942D0(void) { - Mtx* test; - f32 var_f26; - s32 var_s2; - s32 thing; - - test = &gGfxPool->mtxObject[0]; - gSPMatrix(gDisplayListHead++, &gGfxPool->mtxScreen, G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_PROJECTION); - gSPMatrix(gDisplayListHead++, &gGfxPool->mtxLookAt[0], G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); - - // **Base Transformation (No Tagging for Static Logo)** - guRotate(test, gIntroModelRotX, 1.0f, 0.0f, 0.0f); - guRotate(test + 1, gIntroModelRotY, 0.0f, 1.0f, 0.0f); - guScale(test + 2, 1.0f, 1.0f, gIntroModelScale); - gSPMatrix(gDisplayListHead++, test++, G_MTX_NOPUSH | G_MTX_MUL | G_MTX_MODELVIEW); - gSPMatrix(gDisplayListHead++, test++, G_MTX_NOPUSH | G_MTX_MUL | G_MTX_MODELVIEW); - gSPMatrix(gDisplayListHead++, test++, G_MTX_PUSH | G_MTX_MUL | G_MTX_MODELVIEW); - gDPSetRenderMode(gDisplayListHead++, G_RM_AA_ZB_OPA_SURF, G_RM_AA_ZB_OPA_SURF2); - gDPSetEnvColor(gDisplayListHead++, 0x00, 0x00, 0x00, 0x00); - gSPDisplayList(gDisplayListHead++, D_02007F60); - gSPPopMatrix(gDisplayListHead++, G_MTX_MODELVIEW); - - if (sIntroModelMotionSpeed > 0) { - var_f26 = sIntroModelSpeed; - if (var_f26 > 10.0f) { - var_f26 = 10.0f; - } - for (var_s2 = 0, thing = 0xC0; var_s2 < 0xC; var_s2++, thing -= 0x10) { - - // **Effect-Only Tagging for Motion (Keeps FPS Stable)** - s32 motionTag = ((var_s2 & 0xF) << 8) | (((s32) sIntroModelMotionSpeed & 0xFF) << 16); - gEXMatrixGroupDecomposed(gDisplayListHead++, motionTag, G_EX_PUSH, G_MTX_MODELVIEW, G_EX_COMPONENT_AUTO, - G_EX_COMPONENT_AUTO, G_EX_COMPONENT_AUTO, G_EX_COMPONENT_INTERPOLATE, - G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_SKIP, G_EX_COMPONENT_INTERPOLATE, - G_EX_ORDER_LINEAR, G_EX_EDIT_ALLOW); - - guRotate(test, 0.0f, 1.0f, 0.0f, 0.0f); - guRotate(test + 1, (var_s2 + 1) * sIntroModelMotionSpeed * var_f26, 0.0f, 1.0f, 0.0f); - guScale(test + 2, 1.0f, 1.0f, 2.0f); - gSPMatrix(gDisplayListHead++, test++, G_MTX_PUSH | G_MTX_MUL | G_MTX_MODELVIEW); - gSPMatrix(gDisplayListHead++, test++, G_MTX_NOPUSH | G_MTX_MUL | G_MTX_MODELVIEW); - gSPMatrix(gDisplayListHead++, test++, G_MTX_NOPUSH | G_MTX_MUL | G_MTX_MODELVIEW); - gDPSetRenderMode(gDisplayListHead++, G_RM_AA_ZB_XLU_SURF, G_RM_AA_ZB_XLU_SURF2); - gDPSetEnvColor(gDisplayListHead++, 0x00, 0x00, 0x00, thing); - gSPDisplayList(gDisplayListHead++, 0x0000000006009410); - - // **Pop Effect Transform** - gSPPopMatrix(gDisplayListHead++, G_MTX_MODELVIEW); - gEXPopMatrixGroup(gDisplayListHead++, G_MTX_MODELVIEW); - } - } -} -#endif - -#if 1 -RECOMP_PATCH void render_lakitu(s32 cameraId) { - Camera* camera; - f32 var_f0; - f32 var_f2; - s32 objectIndex; - Object* object; - - objectIndex = gIndexLakituList[cameraId]; - camera = &camera1[cameraId]; - if (is_obj_flag_status_active(objectIndex, 0x00000010) != 0) { - object = &gObjectList[objectIndex]; - object->orientation[0] = 0; - object->orientation[1] = func_800418AC(object->pos[0], object->pos[2], camera->pos); - object->orientation[2] = 0x8000; - // @recomp Tag the transform. - gEXMatrixGroupDecomposedNormal(gDisplayListHead++, TAG_OBJECT(&gIndexLakituList[cameraId]) | cameraId, - G_EX_PUSH, G_MTX_MODELVIEW, G_EX_EDIT_ALLOW); - - if (func_80072354(objectIndex, 2) != 0) { - draw_2d_texture_at(object->pos, object->orientation, object->sizeScaling, (u8*) object->activeTLUT, - object->activeTexture, object->vertex, (s32) object->textureWidth, - (s32) object->textureHeight, (s32) object->textureWidth, - (s32) object->textureHeight / 2); - } else { - func_800485C4(object->pos, object->orientation, object->sizeScaling, (s32) object->primAlpha, - (u8*) object->activeTLUT, object->activeTexture, object->vertex, (s32) object->textureWidth, - (s32) object->textureHeight, (s32) object->textureWidth, (s32) object->textureHeight / 2); - } - if (gScreenModeSelection == SCREEN_MODE_1P) { - var_f0 = object->pos[0] - D_8018CF14->pos[0]; - var_f2 = object->pos[2] - D_8018CF14->pos[2]; - if (var_f0 < 0.0f) { - var_f0 = -var_f0; - } - if (var_f2 < 0.0f) { - var_f2 = -var_f2; - } - if ((var_f0 + var_f2) <= 200.0) { - func_8004A630(&D_8018C0B0[cameraId], object->pos, 0.35f); - } - } - // @recomp Pop the transform id. - gEXPopMatrixGroup(gDisplayListHead++, G_MTX_MODELVIEW); - } -} -#endif - -#define ABS(x) ((x) >= 0 ? (x) : -(x)) -#define ABSF(x) ((x) >= 0.0f ? (x) : -(x)) - -// Snowflakes in the background -#if 1 -struct ObjectInterpData { - s32 objectIndex; - s16 x, y; -}; -struct ObjectInterpData prevObject[OBJECT_LIST_SIZE] = { 0 }; - -RECOMP_PATCH void func_800518F8(s32 objectIndex, s16 x, s16 y) { - // Search all recorded objects for the one we're drawing - for (size_t i = 140; i < 190; i++) { - if (objectIndex == prevObject[i].objectIndex) { - // recomp_printf("Object coincidence: %d\n", objectIndex); - // Coincidence! - // Skip drawing the object this frame if it warped to the other side of the screen - if ((ABS(x - prevObject[i].x) > SCREEN_WIDTH / 2) || (ABS(y - prevObject[i].y) > SCREEN_HEIGHT / 2)) { - prevObject[objectIndex].x = x; - prevObject[objectIndex].y = y; - prevObject[objectIndex].objectIndex = objectIndex; - return; - } - } - } - - if (gObjectList[objectIndex].status & 0x10) { - // @recomp Tag the transform. - gEXMatrixGroupDecomposedNormal(gDisplayListHead++, TAG_OBJECT(&gObjectList[objectIndex]), G_EX_PUSH, - G_MTX_MODELVIEW, G_EX_EDIT_ALLOW); - - if (D_8018D228 != gObjectList[objectIndex].unk_0D5) { - D_8018D228 = gObjectList[objectIndex].unk_0D5; - func_80044DA0(gObjectList[objectIndex].activeTexture, gObjectList[objectIndex].textureWidth, - gObjectList[objectIndex].textureHeight); - } - func_80042330(x, y, 0, gObjectList[objectIndex].sizeScaling); - gSPVertex(gDisplayListHead++, gObjectList[objectIndex].vertex, 4, 0); - gSPDisplayList(gDisplayListHead++, (Gfx*) 0x0d006940 /* common_rectangle_display */); - - // @recomp Pop the transform id. - gEXPopMatrixGroup(gDisplayListHead++, G_MTX_MODELVIEW); - } - - // Save current cloud index and x position - prevObject[objectIndex].x = x; - prevObject[objectIndex].y = y; - prevObject[objectIndex].objectIndex = objectIndex; -} -#endif - -#if 1 -struct ObjectInterpData2 { - s32 objectIndex; - f32 x, y; -}; -struct ObjectInterpData2 prevObject2[OBJECT_LIST_SIZE] = { 0 }; - -s32 mtxf_set_matrix_gObjectList_snowflakes(s32 objectIndex, Mat4 transformMatrix) { - f32 sinX; - Object* object = &gObjectList[objectIndex]; - f32 sinY; - f32 cosY; - f32 sinZ; - f32 cosZ; - f32 cosX; - - sinX = sins(object->orientation[0]); - cosX = coss(object->orientation[0]); - sinY = sins(object->orientation[1]); - cosY = coss(object->orientation[1]); - sinZ = sins(object->orientation[2]); - cosZ = coss(object->orientation[2]); - - transformMatrix[0][0] = object->sizeScaling * ((cosY * cosZ) + (sinX * sinY * sinZ)); - transformMatrix[1][0] = object->sizeScaling * ((-cosY * sinZ) + sinX * sinY * cosZ); - transformMatrix[2][0] = object->sizeScaling * (cosX * sinY); - transformMatrix[3][0] = object->pos[0]; - transformMatrix[0][1] = object->sizeScaling * (cosX * sinZ); - transformMatrix[1][1] = object->sizeScaling * (cosX * cosZ); - transformMatrix[2][1] = object->sizeScaling * -sinX; - transformMatrix[3][1] = object->pos[1]; - transformMatrix[0][2] = object->sizeScaling * ((-sinY * cosZ) + (sinX * cosY * sinZ)); - transformMatrix[1][2] = object->sizeScaling * ((sinY * sinZ) + (sinX * cosY * cosZ)); - transformMatrix[2][2] = object->sizeScaling * (cosX * cosY); - transformMatrix[3][2] = object->pos[2]; - transformMatrix[0][3] = 0.0f; - transformMatrix[1][3] = 0.0f; - transformMatrix[2][3] = 0.0f; - transformMatrix[3][3] = 1.0f; - - // Search all recorded objects for the one we're drawing - for (int i = 240; i < 290; i++) { - if (objectIndex == prevObject2[i].objectIndex) { - // recomp_printf("Object coincidence: %d\n", objectIndex); - // Coincidence! - // Skip drawing the object this frame if it warped to the other side of the screen - if ((ABSF(object->pos[0] - prevObject2[i].x) > 10) || (ABSF(object->pos[1] - prevObject2[i].y) > 10)) { - prevObject2[objectIndex].x = object->pos[0]; - prevObject2[objectIndex].y = object->pos[1]; - prevObject2[objectIndex].objectIndex = objectIndex; - // recomp_printf("IDX: %d X: %f Y: %f Z: ", objectIndex, object->pos[0], object->pos[1], - // object->pos[2]); recomp_printf("%f DX: %f DY %f \n", ABSF(object->pos[0] - prevObject2[i].x), - // ABSF(object->pos[1] - prevObject2[i].y)); - return 1; - } - } - } - prevObject2[objectIndex].x = object->pos[0]; - prevObject2[objectIndex].y = object->pos[1]; - prevObject2[objectIndex].objectIndex = objectIndex; - - return 0; -} -#endif - -#if 1 -void rsp_set_matrix_gObjectList_snowflakes(s32 transformIndex) { - Mat4 matrix; - - if (mtxf_set_matrix_gObjectList_snowflakes(transformIndex, matrix)) - return; - ; - convert_to_fixed_point_matrix(&gGfxPool->mtxHud[gMatrixHudCount], matrix); - - gSPMatrix(gDisplayListHead++, VIRTUAL_TO_PHYSICAL(&gGfxPool->mtxHud[gMatrixHudCount++]), - G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); -} -#endif - -// Snowflakes -#if 1 -RECOMP_PATCH void render_object_snowflakes_particles(void) { - s32 i; - s32 snowflakeIndex; - - gSPDisplayList(gDisplayListHead++, (Gfx*) 0x0D007AE0); - gDPSetCombineLERP(gDisplayListHead++, 1, 0, SHADE, 0, 0, 0, 0, TEXEL0, 1, 0, SHADE, 0, 0, 0, 0, TEXEL0); - func_80044F34((u8*) 0x0D0293D8, 0x10, 0x10); - for (i = 0; i < NUM_SNOWFLAKES; i++) { - snowflakeIndex = gObjectParticle1[i]; - // @recomp Tag the transform. - gEXMatrixGroupDecomposedNormal(gDisplayListHead++, TAG_OBJECT(&gObjectParticle1[i]), G_EX_PUSH, G_MTX_MODELVIEW, - G_EX_EDIT_ALLOW); - if (gObjectList[snowflakeIndex].state >= 2) { - rsp_set_matrix_gObjectList_snowflakes(snowflakeIndex); - gSPDisplayList(gDisplayListHead++, (Gfx*) 0x0D006980); - } - // @recomp Pop the transform id. - gEXPopMatrixGroup(gDisplayListHead++, G_MTX_MODELVIEW); - } - gSPTexture(gDisplayListHead++, 1, 1, 0, G_TX_RENDERTILE, G_OFF); -} -#endif - -#endif // GLOBAL \ No newline at end of file diff --git a/patches/overlays.c b/patches/overlays.c deleted file mode 100644 index f6401a2..0000000 --- a/patches/overlays.c +++ /dev/null @@ -1,58 +0,0 @@ -#include "patches.h" - -#define SEG_RACING_ (uintptr_t) 0x8028DF00 -#define SEG_RACING_ROM_START_ (u8*) 0xf7510 -#define SEG_RACING_SIZE_ (size_t) 0x2C470 -#define SEG_RACING_ROM_SIZE_ (size_t) ALIGN16(0x0000000000123640 - 0x00000000000f7510) - -#if 1 -RECOMP_PATCH void dma_copy(u8* dest, u8* romAddr, size_t size) { - recomp_load_overlays((u32) romAddr, dest, size); - // recomp_printf("%08X %08X %08X\n", (u32) romAddr, (u32) dest, (u32) size); - - // osInvalDCache(dest, size); - while (size > 0x100) { - osPiStartDma(&gDmaIoMesg, 0, 0, (uintptr_t) romAddr, dest, 0x100, &gDmaMesgQueue); - osRecvMesg(&gDmaMesgQueue, &gMainReceivedMesg, 1); - size -= 0x100; - romAddr += 0x100; - dest += 0x100; - } - if (size != 0) { - osPiStartDma(&gDmaIoMesg, 0, 0, (uintptr_t) romAddr, dest, size, &gDmaMesgQueue); - osRecvMesg(&gDmaMesgQueue, &gMainReceivedMesg, 1); - } -} -#endif - -#if 0 - -RECOMP_PATCH void init_segment_racing(void) { - recomp_load_overlays((u32) SEG_RACING_ROM_START_, (u32*) SEG_RACING_, SEG_RACING_ROM_SIZE_); - bzero((void*) SEG_RACING_, SEG_RACING_SIZE_); - // osWritebackDCacheAll(); - dma_copy((u8*) SEG_RACING_, (u8*) SEG_RACING_ROM_START_, SEG_RACING_ROM_SIZE_); - // osInvalICache((void*) SEG_RACING_, SEG_RACING_SIZE_); - // osInvalDCache((void*) SEG_RACING_, SEG_RACISEG_RACING_SIZE_NG_SIZE); -} -#endif - -#if 0 -#define SEG_ENDING_ (uintptr_t) 0x80280000 -#define SEG_ENDING_ROM_START_ (uintptr_t) 0x0000000000123640 -/** - * Ending segment original size is 0xDF00 but much of that remains unused. - * This auto fits the segment to its proper size. - */ -#define SEG_ENDING_SIZE_ (size_t) 0xDF00 -#define SEG_ENDING_ROM_SIZE_ (size_t) ALIGN16((ptrdiff_t) (0x13aae0 - 0x123640)) - -RECOMP_PATCH void init_segment_ending_sequences(void) { - recomp_load_overlays((u32) SEG_ENDING_ROM_START_, (u32*) SEG_ENDING_, SEG_ENDING_ROM_SIZE_); - bzero((void*) SEG_ENDING_, SEG_ENDING_SIZE_); - // osWritebackDCacheAll(); - dma_copy((u8*) SEG_ENDING_, (u8*) SEG_ENDING_ROM_START_, SEG_ENDING_ROM_SIZE_); - // osInvalICache((void*) SEG_ENDING_, SEG_ENDING_SIZE_); - // osInvalDCache((void*) SEG_ENDING_, SEG_ENDING_SIZE_); -} -#endif diff --git a/patches/print.c b/patches/print.c index 9e8db94..9d52b50 100644 --- a/patches/print.c +++ b/patches/print.c @@ -1,3 +1,4 @@ +#if 0 #include "patches.h" #include "misc_funcs.h" @@ -24,4 +25,11 @@ RECOMP_EXPORT int recomp_printf(const char* fmt, ...) { return ret; } + #else + void dummy_function(void) { + int dummyVar = 0; + + if (dummyVar); + } + #endif diff --git a/patches/render_distance.c b/patches/render_distance.c deleted file mode 100644 index 27bb911..0000000 --- a/patches/render_distance.c +++ /dev/null @@ -1,170 +0,0 @@ -#include "patches.h" - -#if 1 // Draw Distance Improved@tb181 -RECOMP_PATCH f32 is_within_render_distance(Vec3f cameraPos, Vec3f objectPos, u16 orientationY, f32 minDistance, f32 fov, - f32 maxDistance) { - u16 angleObject; - u16 temp_v0; - f32 distanceX; - f32 distance; - f32 distanceY; - f32 scaleFov; - s32 plus_fov_angle; - s32 minus_fov_angle; - u16 temp; - s32 count = 0; - - maxDistance *= 6.5f; - scaleFov = 1.25; - - f32 extended_fov = ((f32) fov * 0xB6 * scaleFov); // Sets the Culling for objects on the left and right - - - distanceX = objectPos[0] - cameraPos[0]; - distanceX = distanceX * distanceX; - if (maxDistance < distanceX) { - return -1.0f; - } - - distanceY = objectPos[2] - cameraPos[2]; - distanceY = distanceY * distanceY; - if (maxDistance < distanceY) { - return -1.0f; - } - - distance = distanceX + distanceY; - if (distance < minDistance) { - return distance; - } - - if (distance > maxDistance) { - return -1.0f; - } - - angleObject = get_angle_between_two_vectors(cameraPos, objectPos); - minus_fov_angle = (orientationY - extended_fov); - plus_fov_angle = (orientationY + extended_fov); - - if (minDistance == 0.0f) { - if (is_visible_between_angle((orientationY + extended_fov), (orientationY - extended_fov), angleObject) == 1) { - if (0){//if (gCurrentCourseId == COURSE_KALAMARI_DESERT) { - return distance / 6.5f; // set for better DD settings in Desert - } else { - return distance / 10.0f; // Items - } - } - return -1.0f; - } - - if (is_visible_between_angle((u16) plus_fov_angle, (u16) minus_fov_angle, angleObject) == 1) { - if (0){//if (gCurrentCourseId == COURSE_KALAMARI_DESERT) { - return distance / 2.0f; - } else { - return distance / 10.0f; // DD Vhicles - } - } - - temp_v0 = func_802B7CA8(minDistance / distance); - temp = angleObject + temp_v0; - - if (is_visible_between_angle(plus_fov_angle, minus_fov_angle, temp) == 1) { - return 0; - } - - temp = angleObject - temp_v0; - if (is_visible_between_angle(plus_fov_angle, minus_fov_angle, temp) == 1) { - return distance; - } - return -1.0f; -} -#endif - -#if 1 // Increase DD for effects, snowmen, ect... @tb181 -RECOMP_PATCH u32 get_horizontal_distance_to_camera(s32 objectIndex, Camera* camera) { - s32 x; - s32 y; - - x = gObjectList[objectIndex].pos[0] - camera->pos[0]; - y = gObjectList[objectIndex].pos[2] - camera->pos[2]; - return (x * x) + (y * y) / 5; // Increase DD -} -#endif - -// Kart Draw Distance -#if 1 -RECOMP_PATCH u16 check_player_camera_collision(Player* player, Camera* camera, f32 arg2, f32 arg3) { - UNUSED f32 pad[6]; - f32 sp64; - f32 sp60; - f32 sp5C; - f32 sp58; - f32 sp54; - f32 sp50; - f32 sp4C; - f32 sp48; - f32 sp44; - s16 var_v0; - u16 ret; - - // Define a multiplier to scale the draw distance - const f32 distanceMultiplier = 3.0f; // Adjust this value as needed - - // Apply the multiplier to arg2 and arg3 - arg2 *= distanceMultiplier; - arg3 *= distanceMultiplier / 5; - - ret = false; - switch (gActiveScreenMode) { - case SCREEN_MODE_1P: - var_v0 = 0x293C; - break; - case SCREEN_MODE_2P_SPLITSCREEN_HORIZONTAL: - case SCREEN_MODE_2P_SPLITSCREEN_VERTICAL: - var_v0 = 0x3058; - break; - case SCREEN_MODE_3P_4P_SPLITSCREEN: - var_v0 = 0x1FFE; - break; - default: - var_v0 = 0x1FFE; - break; - } - sp4C = (arg2 * coss((camera->rot[1] - var_v0))) + camera->pos[2]; - sp58 = (arg2 * sins((camera->rot[1] - var_v0))) + camera->pos[0]; - sp48 = (arg2 * coss((camera->rot[1] + var_v0))) + camera->pos[2]; - sp54 = (arg2 * sins((camera->rot[1] + var_v0))) + camera->pos[0]; - sp44 = (arg3 * coss((camera->rot[1] + 0x5FFA))) + camera->pos[2]; - sp50 = (arg3 * sins((camera->rot[1] + 0x5FFA))) + camera->pos[0]; - - sp64 = ((sp4C - player->pos[2]) * (sp54 - player->pos[0])) - ((sp48 - player->pos[2]) * (sp58 - player->pos[0])); - sp60 = ((sp48 - player->pos[2]) * (sp50 - player->pos[0])) - ((sp44 - player->pos[2]) * (sp54 - player->pos[0])); - sp5C = ((sp44 - player->pos[2]) * (sp58 - player->pos[0])) - ((sp4C - player->pos[2]) * (sp50 - player->pos[0])); - - if (((sp64 >= 0) && (sp60 >= 0) && (sp5C >= 0)) || (((sp64) <= 0) && (sp60 <= 0) && (sp5C <= 0))) { - ret = true; - } - return ret; -} -#endif - -// Fix Culling for gObjectList items -#if 1 -RECOMP_PATCH bool is_object_visible_on_camera(s32 objectIndex, Camera* camera, u16 angle) { - u16 temp_t2; - s32 var_t0; - - var_t0 = false; - - // Update angle dynamically if needed - angle = 0x6000; // New angle for wider FOV, equivalent to ~120° - - temp_t2 = (get_angle_between_xy(camera->pos[0], gObjectList[objectIndex].pos[0], camera->pos[2], - gObjectList[objectIndex].pos[2]) + - ((s32) angle / 2)) - - camera->rot[1]; - if ((temp_t2 >= 0) && (angle >= temp_t2)) { - var_t0 = true; - } - return var_t0; -} -#endif \ No newline at end of file diff --git a/patches/test_pak.c b/patches/test_pak.c deleted file mode 100644 index 89ab6e2..0000000 --- a/patches/test_pak.c +++ /dev/null @@ -1,189 +0,0 @@ -#if 0 -#include "patches.h" - -extern OSPfs gControllerPak1FileHandle; -extern u16 gCompanyCode; -extern u32 gGameCode; -extern const u8 gGameName[]; -extern const u8 gExtCode[]; -static u32 ghost_pak_emu[0x3C00] = { 0 }; - -void testPak(void); -s32 osPfsReadWriteFile_recomp(OSPfs* pfs, s32 file_no, u8 flag, int offset, int size_in_bytes, u8* data_buffer); -s32 osPfsFindFile_recomp(OSPfs* pfs, u16 company_code, u32 game_code, u8* game_name, u8* ext_name, s32* file_no); -void move_segment_table_to_dmem(void); -void init_rdp(void); -void set_viewport(void); -void select_framebuffer(void); -void init_z_buffer(void); -s32 func_800B6088(s32 arg0); -s32 func_800051C4(void); - -void* memcpy2(void* dest, const void* src, size_t size) { - unsigned char* su1 = (unsigned char*) dest; - const unsigned char* su2 = (const unsigned char*) src; - - while (size > 0) { - *su1 = *su2; - su1++; - su2++; - size--; - } - - return dest; -} - -RECOMP_PATCH void init_rcp(void) { - - move_segment_table_to_dmem(); - init_rdp(); - set_viewport(); - select_framebuffer(); - init_z_buffer(); -} - -void testPak(void) { - int success = 0; - u8 buffer[256]; - u8 buffer2[256]; - recomp_printf("PAKTEST START\n"); - - osPfsFindFile_recomp(&gControllerPak1FileHandle, gCompanyCode, gGameCode, (u8*) gGameName, (u8*) gExtCode, - &gControllerPak1FileNote); - osPfsFindFile_recomp(&gControllerPak1FileHandle, gCompanyCode, gGameCode, (u8*) gGameName, (u8*) gExtCode, - &gControllerPak1FileNote); - - for (size_t i = 0; i < 256; i++) { - recomp_printf("Preparing buffer: %d\n", i); - buffer[i] = i; - } - - osPfsReadWriteFile_recomp(&gControllerPak1FileHandle, 0, PFS_WRITE, 0, ARRAY_COUNT(buffer), (u8*) buffer); - - osPfsFindFile_recomp(&gControllerPak1FileHandle, gCompanyCode, gGameCode, (u8*) gGameName, (u8*) gExtCode, - &gControllerPak1FileNote); - - for (size_t i = 0; i < 256; i++) { - buffer2[i] = -1; - } - - osPfsReadWriteFile_recomp(&gControllerPak1FileHandle, 0, PFS_READ, 0, ARRAY_COUNT(buffer2), (u8*) buffer2); - - for (size_t i = 0; i < 256; i++) { - recomp_printf("ReadBack: %d\n", buffer2[i]); - } -} - -extern u32* D_800DC714; -extern struct_8018EE10_entry D_8018EE10[2]; -extern u16 bPlayerGhostDisabled; -extern s32 D_80162DE0; -extern s32 D_80162DFC; -void func_8000522C(void); -extern u8 func_800B60E8(s32 page); - -#if 0 -RECOMP_PATCH s32 func_800B64EC(s32 arg0) { - s32 temp_s0; - s32 readSuccess; - u8* phi_s1; - - if ((arg0 != 0) && (arg0 != 1)) { - return -1; - } - - recomp_printf("osPfsReadWriteFile\n"); - recomp_printf("PAGE: %d\n", arg0); - // readSuccess = osPfsReadWriteFile_recomp(&gControllerPak1FileHandle, gControllerPak1FileNote, PFS_READ, (arg0 * 0x3C00) + 0x100, - // 0x3C00, (u8*) D_800DC714); - readSuccess = 0; - memcpy2(D_800DC714, ghost_pak_emu, 0x3C00); - - // u8* ptr = (u8*) (D_800DC714 ); - // for (size_t i = 0; i < 0x3C00; i++) { - // recomp_printf("%x ", ptr[i]); - // } - - recomp_printf("\n"); - if (readSuccess == 0) { - recomp_printf("readSuccess pass\n"); - phi_s1 = (u8 *) &D_8018EE10[arg0]; temp_s0 = 0; - - while (1) { - if (phi_s1[7] != func_800B60E8(temp_s0)) { - recomp_printf("phi_s1[7] != func_800B60E8(temp_s0)\n"); - D_8018EE10[arg0].ghostDataSaved = 0; - return -2; - } - - ++phi_s1; - if ((++temp_s0) == 60) { - recomp_printf("(++temp_s0) == 60\n"); - func_8000522C(); - u16* bPlayerGhostDisabled_ = (u16*) 0x80162f44; - *bPlayerGhostDisabled_ = 0; - D_80162DE0 = (s32) D_8018EE10[arg0].characterId; - D_80162DFC = D_8018EE10[arg0].unk_00; - break; - } - } - } - recomp_printf("return readSuccess\n"); - return readSuccess; -} -#endif - -#if 0 -RECOMP_PATCH s32 func_800B6178(s32 arg0) { - s32 var_v0; - s32 var_s0; - struct_8018EE10_entry* temp_s3; - - switch (arg0) { - case 0: - case 1: - break; - default: - return -1; - } - if (gGamestate == RACING) { - func_800051C4(); - } - temp_s3 = &D_8018EE10[arg0]; - temp_s3->ghostDataSaved = 0; - var_v0 = func_800B6088(arg0); - if (var_v0 != 0) { - temp_s3->ghostDataSaved = 0; - for (var_s0 = 0; var_s0 < 0x3C; var_s0++) { - temp_s3->unk_07[var_s0] = var_s0; - } - } else { - var_v0 = osPfsReadWriteFile_recomp(&gControllerPak1FileHandle, gControllerPak1FileNote, 1U, (arg0 * 0x3C00) + 0x100, - 0x00003C00, (u8*) D_800DC714); - - memcpy2(ghost_pak_emu, D_800DC714, 0x3C00); - - if (var_v0 == 0) { - temp_s3->ghostDataSaved = 1; - if (gGamestate == RACING) { - temp_s3->courseIndex = (gCupSelection * 4) + gCourseIndexInCup; - } - temp_s3->unk_00 = D_80162DFC; - temp_s3->characterId = (u8) D_80162DE0; - for (var_s0 = 0; var_s0 < 0x3C; var_s0++) { - temp_s3->unk_07[var_s0] = func_800B60E8(var_s0); - } - var_v0 = func_800B6088(arg0); - } - if (var_v0 != 0) { - temp_s3->ghostDataSaved = 0; - for (var_s0 = 0; var_s0 < 0x3C; var_s0++) { - temp_s3->unk_07[var_s0] = var_s0; - } - } - } - return var_v0; -} -#endif - -#endif \ No newline at end of file diff --git a/patches/text_tagging.c b/patches/text_tagging.c deleted file mode 100644 index 3122739..0000000 --- a/patches/text_tagging.c +++ /dev/null @@ -1,184 +0,0 @@ -#include "patches.h" - -#if 0 -RECOMP_PATCH void print_text_mode_1(s32 column, s32 row, char* text, s32 tracking, f32 scaleX, f32 scaleY) { - // @recomp Tag the transform. - gEXMatrixGroupDecomposed(gDisplayListHead++, (u32) text << 16 | column << 8 | row, G_EX_PUSH, G_MTX_MODELVIEW, - G_EX_COMPONENT_AUTO, G_EX_COMPONENT_AUTO, G_EX_COMPONENT_AUTO, G_EX_COMPONENT_INTERPOLATE, - G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_SKIP, G_EX_COMPONENT_INTERPOLATE, - G_EX_ORDER_AUTO, G_EX_EDIT_ALLOW); - - print_text0(column, row, text, tracking, scaleX, scaleY, 1); - - // @recomp Pop the transform id. - gEXPopMatrixGroup(gDisplayListHead++, G_MTX_MODELVIEW); -} -#endif - -#if 1 -RECOMP_PATCH void print_text0(s32 column, s32 row, char* text, s32 tracking, f32 scaleX, f32 scaleY, s32 mode) { - s32 stringWidth = 0; - s32 glyphIndex; - - gSPDisplayList(gDisplayListHead++, (u8*) 0x020077A8); - if (*text != 0) { - do { - // @recomp Tag the transform. - gEXMatrixGroupDecomposed(gDisplayListHead++, TAG_LETTER(text), G_EX_PUSH, G_MTX_MODELVIEW, - G_EX_COMPONENT_AUTO, G_EX_COMPONENT_AUTO, G_EX_COMPONENT_AUTO, - G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_SKIP, - G_EX_COMPONENT_INTERPOLATE, G_EX_ORDER_LINEAR, G_EX_EDIT_ALLOW); - - glyphIndex = char_to_glyph_index(text); - if (glyphIndex >= 0) { - load_menu_img((MenuTexture*) segmented_to_virtual_dupe((const void*) gGlyphTextureLUT[glyphIndex])); - gDisplayListHead = - print_letter(gDisplayListHead, - (MenuTexture*) segmented_to_virtual_dupe((const void*) gGlyphTextureLUT[glyphIndex]), - column + (stringWidth * scaleX), row, mode, scaleX, scaleY); - stringWidth += gGlyphDisplayWidth[glyphIndex] + tracking; - } else if ((glyphIndex != -2) && (glyphIndex == -1)) { - stringWidth += tracking + 7; - } else { - gSPDisplayList(gDisplayListHead++, (u8*) 0x020077D8); - return; - } - if (glyphIndex >= 0x30) { - text += 2; - } else { - text += 1; - } - - // @recomp Pop the transform id. - gEXPopMatrixGroup(gDisplayListHead++, G_MTX_MODELVIEW); - - } while (*text != 0); - } - gSPDisplayList(gDisplayListHead++, (u8*) 0x020077D8); -} - -// "tracking" is a uniform spacing between all characters in a given word -RECOMP_PATCH void print_text1(s32 column, s32 row, char* text, s32 tracking, f32 scaleX, f32 scaleY, s32 arg6) { - char* temp_string = text; - s32 stringWidth = 0; - s32 glyphIndex; - s32 sp60; - - while (*temp_string != 0) { - glyphIndex = char_to_glyph_index(temp_string); - if (glyphIndex >= 0) { - stringWidth += ((gGlyphDisplayWidth[glyphIndex] + tracking) * scaleX); - } else if ((glyphIndex != -2) && (glyphIndex == -1)) { - stringWidth += ((tracking + 7) * scaleX); - } else { - return; - } - if (glyphIndex >= 0x30) { - temp_string += 2; - } else { - temp_string += 1; - } - } - - switch (arg6) { - case LEFT_TEXT: - // ??? - do { - } while (0); - case RIGHT_TEXT: - column -= stringWidth; - break; - case CENTER_TEXT_MODE_1: - case CENTER_TEXT_MODE_2: - column -= stringWidth / 2; - break; - default: - break; - } - - if (arg6 < 3) { - sp60 = 1; - } else { - sp60 = 2; - } - - gSPDisplayList(gDisplayListHead++, (u8*) 0x020077A8); - while (*text != 0) { - // @recomp Tag the transform. - gEXMatrixGroupDecomposed(gDisplayListHead++, TAG_LETTER(text), G_EX_PUSH, G_MTX_MODELVIEW, G_EX_COMPONENT_AUTO, - G_EX_COMPONENT_AUTO, G_EX_COMPONENT_AUTO, G_EX_COMPONENT_INTERPOLATE, - G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_SKIP, G_EX_COMPONENT_INTERPOLATE, - G_EX_ORDER_LINEAR, G_EX_EDIT_ALLOW); - - glyphIndex = char_to_glyph_index(text); - if (glyphIndex >= 0) { - load_menu_img(segmented_to_virtual_dupe(gGlyphTextureLUT[glyphIndex])); - gDisplayListHead = print_letter(gDisplayListHead, segmented_to_virtual_dupe(gGlyphTextureLUT[glyphIndex]), - column, row, sp60, scaleX, scaleY); - column = column + (s32) ((gGlyphDisplayWidth[glyphIndex] + tracking) * scaleX); - } else if ((glyphIndex != -2) && (glyphIndex == -1)) { - column = column + (s32) ((tracking + 7) * scaleX); - } else { - gSPDisplayList(gDisplayListHead++, (u8*) 0x020077D8); - return; - } - if (glyphIndex >= 0x30) { - text += 2; - } else { - text += 1; - } - - // @recomp Pop the transform id. - gEXPopMatrixGroup(gDisplayListHead++, G_MTX_MODELVIEW); - } - gSPDisplayList(gDisplayListHead++, (u8*) 0x020077D8); -} - -RECOMP_PATCH void print_text2(s32 column, s32 row, char* text, s32 tracking, f32 scaleX, f32 scaleY, s32 arg6) { - MenuTexture* glyphTexture; - s32 characterWidth; - s32 glyphIndex; - - gSPDisplayList(gDisplayListHead++, (u8*) 0x020077A8); - if (*text != 0) { - do { - // @recomp Tag the transform. - gEXMatrixGroupDecomposed(gDisplayListHead++, TAG_LETTER(text), G_EX_PUSH, G_MTX_MODELVIEW, - G_EX_COMPONENT_AUTO, G_EX_COMPONENT_AUTO, G_EX_COMPONENT_AUTO, - G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_SKIP, - G_EX_COMPONENT_INTERPOLATE, G_EX_ORDER_LINEAR, G_EX_EDIT_ALLOW); - - glyphIndex = char_to_glyph_index(text); - if (glyphIndex >= 0) { - glyphTexture = (MenuTexture*) segmented_to_virtual_dupe((const void*) gGlyphTextureLUT[glyphIndex]); - load_menu_img(glyphTexture); - gDisplayListHead = - print_letter(gDisplayListHead, glyphTexture, column - (gGlyphDisplayWidth[glyphIndex] / 2), row, - arg6, scaleX, scaleY); - if ((glyphIndex >= 213) && (glyphIndex < 224)) { - characterWidth = 32; - } else { - characterWidth = 12; - } - column = column + (s32) ((characterWidth + tracking) * scaleX); - } else if ((glyphIndex != -2) && (glyphIndex == -1)) { - column = column + (s32) ((tracking + 7) * scaleX); - } else { - gSPDisplayList(gDisplayListHead++, (u8*) 0x020077D8); - return; - } - if (glyphIndex >= 0x30) { - text += 2; - } else { - text += 1; - } - - // @recomp Pop the transform id. - gEXPopMatrixGroup(gDisplayListHead++, G_MTX_MODELVIEW); - - } while (*text != 0); - } - - gSPDisplayList(gDisplayListHead++, (u8*) 0x020077D8); -} -#endif diff --git a/patches/texture_fix.c b/patches/texture_fix.c deleted file mode 100644 index 94e4f26..0000000 --- a/patches/texture_fix.c +++ /dev/null @@ -1,818 +0,0 @@ -#include "patches.h" - -extern u8* D_802BA050; -extern u8* D_802BA054; -extern u8* D_802BA058; -extern u8 D_0B002A00[]; - -extern u8 gTextureGreenShell0[]; -extern u8 gTextureGreenShell1[]; -extern u8 gTextureGreenShell2[]; -extern u8 gTextureGreenShell3[]; -extern u8 gTextureGreenShell4[]; -extern u8 gTextureGreenShell5[]; -extern u8 gTextureGreenShell6[]; -extern u8 gTextureGreenShell7[]; -extern u8 gTextureBlueShell0[]; -extern u8 gTextureBlueShell1[]; -extern u8 gTextureBlueShell2[]; -extern u8 gTextureBlueShell3[]; -extern u8 gTextureBlueShell4[]; -extern u8 gTextureBlueShell5[]; -extern u8 gTextureBlueShell6[]; -extern u8 gTextureBlueShell7[]; -extern u8 gTextureFinishLineBanner1[]; -extern u8 gTextureFinishLineBanner2[]; -extern u8 gTextureFinishLineBanner3[]; -extern u8 gTextureFinishLineBanner4[]; -extern u8 gTextureFinishLineBanner5[]; -extern u8 gTextureFinishLineBanner6[]; -extern u8 gTextureFinishLineBanner7[]; -extern u8 gTextureFinishLineBanner8[]; -extern u8 gTexture671A88[]; -extern u8 gTexture6774D8[]; -extern u8 gTexturePiranhaPlant1[]; -extern u8 gTexturePiranhaPlant2[]; -extern u8 gTexturePiranhaPlant3[]; -extern u8 gTexturePiranhaPlant4[]; -extern u8 gTexturePiranhaPlant5[]; -extern u8 gTexturePiranhaPlant6[]; -extern u8 gTexturePiranhaPlant7[]; -extern u8 gTexturePiranhaPlant8[]; -extern u8 gTexturePiranhaPlant9[]; -extern u8 gTextureShrub[]; -extern u8 gTextureTrees1[]; -extern u8 gTextureTrees2[]; -extern u8 gTextureTrees3[]; -extern u8 gTextureTrees4[]; -extern u8 gTextureTrees5[]; -extern u8 gTextureTrees6[]; -extern u8 gTextureTrees7[]; -extern u8 gTextureFrappeSnowlandTreeLeft[]; -extern u8 gTextureFrappeSnowlandTreeRight[]; -extern u8 gTextureTrees5Left[]; -extern u8 gTextureTrees5Right[]; -extern u8 gTextureTrees4Right[]; -extern u8 gTextureCow01Left[]; -extern u8 gTextureCow01Right[]; -extern u8 gTextureCow02Left[]; -extern u8 gTextureCow02Right[]; -extern u8 gTextureCow03Left[]; -extern u8 gTextureTrees4Left[]; -extern u8 gTextureCow04Left[]; - -extern u8 gTextureCow03Right[]; -extern u8 gTextureCow04Right[]; -extern u8 gTextureCow05Left[]; -extern u8 gTextureCow05Right[]; -extern u8 gTextureCactus1Left[]; -extern u8 gTextureCactus1Right[]; -extern u8 gTextureCactus2Left[]; -extern u8 gTextureCactus2Right[]; -extern u8 gTextureCactus2Right[]; -extern u8 gTextureCactus3[]; -extern u8 gTextureDksJungleParkwayKiwanoFruit1[]; -extern u8 gTextureDksJungleParkwayKiwanoFruit2[]; -extern u8 gTextureDksJungleParkwayKiwanoFruit3[]; - -u8* dma_textures(u8*, u32, u32); -void spawn_course_vehicles(void); - -#if 1 -/** - * @brief Loads actor textures, course specific actor textures. - * Calls to spawn_course_vehicles and place_course_actors - * - */ -RECOMP_PATCH void init_actors_and_load_textures(void) { - set_segment_base_addr(3, (void*) gNextFreeMemoryAddress); - // @recomp Fix the size of the compressed green shell assets to fix the infinite - // hashes that could be generated. - // D_802BA050 = dma_textures(gTextureGreenShell0, 0x00000257U, 0x00000400U); - // dma_textures(gTextureGreenShell1, 0x00000242U, 0x00000400U); - // dma_textures(gTextureGreenShell2, 0x00000259U, 0x00000400U); - // dma_textures(gTextureGreenShell3, 0x00000256U, 0x00000400U); - // dma_textures(gTextureGreenShell4, 0x00000246U, 0x00000400U); - // dma_textures(gTextureGreenShell5, 0x0000025EU, 0x00000400U); - // dma_textures(gTextureGreenShell6, 0x0000025CU, 0x00000400U); - D_802BA050 = dma_textures(gTextureGreenShell0, 0x0000024EU, 0x00000400U); - dma_textures(gTextureGreenShell1, 0x00000250U, 0x00000400U); - dma_textures(gTextureGreenShell2, 0x00000258U, 0x00000400U); - dma_textures(gTextureGreenShell3, 0x0000025EU, 0x00000400U); - dma_textures(gTextureGreenShell4, 0x00000258U, 0x00000400U); - dma_textures(gTextureGreenShell5, 0x00000269U, 0x00000400U); - dma_textures(gTextureGreenShell6, 0x00000260U, 0x00000400U); - dma_textures(gTextureGreenShell7, 0x00000254U, 0x00000400U); - D_802BA054 = dma_textures(gTextureBlueShell0, 0x0000022AU, 0x00000400U); - dma_textures(gTextureBlueShell1, 0x00000237U, 0x00000400U); - dma_textures(gTextureBlueShell2, 0x0000023EU, 0x00000400U); - dma_textures(gTextureBlueShell3, 0x00000243U, 0x00000400U); - dma_textures(gTextureBlueShell4, 0x00000255U, 0x00000400U); - dma_textures(gTextureBlueShell5, 0x00000259U, 0x00000400U); - dma_textures(gTextureBlueShell6, 0x00000239U, 0x00000400U); - dma_textures(gTextureBlueShell7, 0x00000236U, 0x00000400U); - dma_textures(gTextureFinishLineBanner1, 0x0000028EU, 0x00000800U); - dma_textures(gTextureFinishLineBanner2, 0x000002FBU, 0x00000800U); - dma_textures(gTextureFinishLineBanner3, 0x00000302U, 0x00000800U); - dma_textures(gTextureFinishLineBanner4, 0x000003B4U, 0x00000800U); - dma_textures(gTextureFinishLineBanner5, 0x0000031EU, 0x00000800U); - dma_textures(gTextureFinishLineBanner6, 0x0000036EU, 0x00000800U); - dma_textures(gTextureFinishLineBanner7, 0x0000029CU, 0x00000800U); - dma_textures(gTextureFinishLineBanner8, 0x0000025BU, 0x00000800U); - dma_textures(gTexture671A88, 0x00000400U, 0x00000800U); - dma_textures(gTexture6774D8, 0x00000400U, 0x00000800U); - - switch (gCurrentCourseId) { - case COURSE_MARIO_RACEWAY: - dma_textures(gTextureTrees1, 0x0000035BU, 0x00000800U); - D_802BA058 = dma_textures(gTexturePiranhaPlant1, 0x000003E8U, 0x00000800U); - dma_textures(gTexturePiranhaPlant2, 0x000003E8U, 0x00000800U); - dma_textures(gTexturePiranhaPlant3, 0x000003E8U, 0x00000800U); - dma_textures(gTexturePiranhaPlant4, 0x000003E8U, 0x00000800U); - dma_textures(gTexturePiranhaPlant5, 0x000003E8U, 0x00000800U); - dma_textures(gTexturePiranhaPlant6, 0x000003E8U, 0x00000800U); - dma_textures(gTexturePiranhaPlant7, 0x000003E8U, 0x00000800U); - dma_textures(gTexturePiranhaPlant8, 0x000003E8U, 0x00000800U); - dma_textures(gTexturePiranhaPlant9, 0x000003E8U, 0x00000800U); - break; - case COURSE_BOWSER_CASTLE: - dma_textures(gTextureShrub, 0x000003FFU, 0x00000800U); - break; - case COURSE_YOSHI_VALLEY: - dma_textures(gTextureTrees2, 0x000003E8U, 0x00000800U); - break; - case COURSE_FRAPPE_SNOWLAND: - dma_textures(gTextureFrappeSnowlandTreeLeft, 0x00000454U, 0x00000800U); - dma_textures(gTextureFrappeSnowlandTreeRight, 0x00000432U, 0x00000800U); - break; - case COURSE_ROYAL_RACEWAY: - dma_textures(gTextureTrees3, 0x000003E8U, 0x00000800U); - dma_textures(gTextureTrees7, 0x000003E8U, 0x00000800U); - D_802BA058 = dma_textures(gTexturePiranhaPlant1, 0x000003E8U, 0x00000800U); - dma_textures(gTexturePiranhaPlant2, 0x000003E8U, 0x00000800U); - dma_textures(gTexturePiranhaPlant3, 0x000003E8U, 0x00000800U); - dma_textures(gTexturePiranhaPlant4, 0x000003E8U, 0x00000800U); - dma_textures(gTexturePiranhaPlant5, 0x000003E8U, 0x00000800U); - dma_textures(gTexturePiranhaPlant6, 0x000003E8U, 0x00000800U); - dma_textures(gTexturePiranhaPlant7, 0x000003E8U, 0x00000800U); - dma_textures(gTexturePiranhaPlant8, 0x000003E8U, 0x00000800U); - dma_textures(gTexturePiranhaPlant9, 0x000003E8U, 0x00000800U); - break; - case COURSE_LUIGI_RACEWAY: - dma_textures(gTextureTrees5Left, 0x000003E8U, 0x00000800U); - dma_textures(gTextureTrees5Right, 0x000003E8U, 0x00000800U); - break; - case COURSE_MOO_MOO_FARM: - dma_textures(gTextureTrees4Left, 0x000003E8U, 0x00000800U); - dma_textures(gTextureTrees4Right, 0x000003E8U, 0x00000800U); - dma_textures(gTextureCow01Left, 0x00000400U, 0x00000800U); - dma_textures(gTextureCow01Right, 0x00000400U, 0x00000800U); - dma_textures(gTextureCow02Left, 0x00000400U, 0x00000800U); - dma_textures(gTextureCow02Right, 0x00000400U, 0x00000800U); - dma_textures(gTextureCow03Left, 0x00000400U, 0x00000800U); - dma_textures(gTextureCow03Right, 0x00000400U, 0x00000800U); - dma_textures(gTextureCow04Left, 0x00000400U, 0x00000800U); - dma_textures(gTextureCow04Right, 0x00000400U, 0x00000800U); - dma_textures(gTextureCow05Left, 0x00000400U, 0x00000800U); - dma_textures(gTextureCow05Right, 0x00000400U, 0x00000800U); - break; - case COURSE_KALAMARI_DESERT: - dma_textures(gTextureCactus1Left, 0x0000033EU, 0x00000800U); - dma_textures(gTextureCactus1Right, 0x000002FBU, 0x00000800U); - dma_textures(gTextureCactus2Left, 0x000002A8U, 0x00000800U); - dma_textures(gTextureCactus2Right, 0x00000374U, 0x00000800U); - dma_textures(gTextureCactus3, 0x000003AFU, 0x00000800U); - break; - case COURSE_DK_JUNGLE: - dma_textures(gTextureDksJungleParkwayKiwanoFruit1, 0x0000032FU, 0x00000400U); - dma_textures(gTextureDksJungleParkwayKiwanoFruit2, 0x00000369U, 0x00000400U); - dma_textures(gTextureDksJungleParkwayKiwanoFruit3, 0x00000364U, 0x00000400U); - break; - } - - init_red_shell_texture(); - destroy_all_actors(); - spawn_course_actors(); - spawn_course_vehicles(); -} -#endif - -#if 1 -RECOMP_PATCH Gfx* func_80095E10(Gfx* displayListHead, s8 arg1, s32 arg2, s32 arg3, s32 arg4, s32 arg5, s32 arg6, - s32 arg7, s32 arg8, s32 arg9, u8* argA, u32 argB, u32 argC) { - u32 var_a1_2 = arg4; - u32 var_s3 = arg5; - s32 sp7C; - u32 var_s2; - u32 var_s4; - s32 var_t0 = 1; - s32 temp_lo; - s32 sp68 = 0; - s32 sp64 = 0; - s32 var_v0_2; - - while ((u32) var_t0 < argB) { - var_t0 *= 2; - } - - temp_lo = 0x400 / var_t0; - - while ((u32) (temp_lo / 2) > argC) { - temp_lo /= 2; - } - - var_v0_2 = var_t0; - while (var_v0_2 > 1) { - var_v0_2 /= 2; - sp68 += 1; - } - var_v0_2 = temp_lo; - - while (var_v0_2 > 1) { - var_v0_2 /= 2; - sp64 += 1; - } - - if (arg8 < 0) { - arg4 -= arg8; - arg8 = 0; - } else if (((arg6 - arg4) + arg8) > SCREEN_WIDTH) { - arg6 = (arg4 - arg8) + SCREEN_WIDTH; - } - - if (arg9 < 0) { - arg5 -= arg9; - arg9 = 0; - } else if (((arg7 - arg5) + arg9) > SCREEN_HEIGHT) { - arg7 = (arg5 - arg9) + SCREEN_HEIGHT; - } - - if (arg6 < arg4) { - return displayListHead; - } - if (arg7 < arg5) { - return displayListHead; - } - sp7C = arg8; - for (var_s3 = arg5; var_s3 < (u32) arg7; var_s3 += temp_lo) { - - if ((u32) arg7 < temp_lo + var_s3) { - var_s4 = arg7 - var_s3; - if (!var_s4) { - break; - } - } else { - var_s4 = temp_lo; - } - - for (var_a1_2 = arg4; var_a1_2 < (u32) arg6; var_a1_2 += var_t0) { - - if ((u32) arg6 < var_t0 + var_a1_2) { - var_s2 = arg6 - var_a1_2; - if (!var_s2) { - break; - } - } else { - var_s2 = var_t0; - } - gDPLoadTextureTile(displayListHead++, argA, arg1, G_IM_SIZ_16b, argB, 0, var_a1_2, var_s3, - // var_a1_2 + var_s2, var_s3 + var_s4, 0, G_TX_NOMIRROR | G_TX_WRAP, - // G_TX_NOMIRROR | G_TX_WRAP, sp68, sp64, G_TX_NOLOD, G_TX_NOLOD); - // @recomp Fix textures loading more pixels than they should by adjusting the - // tile size and the mask. - var_a1_2 + var_s2 - 1, var_s3 + var_s4 - 1, 0, G_TX_NOMIRROR | G_TX_WRAP, - G_TX_NOMIRROR | G_TX_WRAP, 0, 0, G_TX_NOLOD, G_TX_NOLOD); - gSPTextureRectangle(displayListHead++, arg8 * 4, arg9 * 4, (arg8 + var_s2) * 4, (arg9 + var_s4) * 4, 0, - (var_a1_2 * 32) & 0xFFFF, (var_s3 * 32) & 0xFFFF, arg2, arg3); - - arg8 += var_t0; - } - - arg8 = sp7C; - arg9 += temp_lo; - } - return displayListHead; -} -#endif - -#if 1 -RECOMP_PATCH Gfx* func_800963F0(Gfx* displayListHead, s8 arg1, s32 arg2, s32 arg3, f32 arg4, f32 arg5, s32 arg6, - s32 arg7, s32 arg8, s32 arg9, s32 argA, s32 argB, u8* argC, u32 argD, u32 argE) { - u32 var_a1_2 = arg6; - u32 var_s3 = arg7; - s32 sp7C; - u32 var_s2; - u32 var_s4; - u32 a; - u32 b; - s32 var_t0 = 1; - s32 temp_lo; - s32 sp68 = 0; - s32 sp64 = 0; - s32 var_v0_2; - - while ((u32) var_t0 < argD) { - var_t0 *= 2; - } - - temp_lo = 0x400 / var_t0; - - while ((u32) (temp_lo / 2) > argE) { - temp_lo /= 2; - } - - var_v0_2 = var_t0; - while (var_v0_2 > 1) { - var_v0_2 /= 2; - sp68 += 1; - } - var_v0_2 = temp_lo; - - while (var_v0_2 > 1) { - var_v0_2 /= 2; - sp64 += 1; - } - - if (argA < 0) { - arg6 -= argA; - argA = 0; - } else if ((argA + (arg8 - arg6) * arg4) > SCREEN_WIDTH) { - arg8 -= argA + (arg8 - arg6) * arg4 - SCREEN_WIDTH; - } - - if (argB < 0) { - arg7 -= argB; - argB = 0; - } else if ((argB + (arg9 - arg7) * arg5) > SCREEN_HEIGHT) { - arg9 -= argB + (arg9 - arg7) * arg5 - SCREEN_HEIGHT; - } - - if (arg8 < arg6) { - return displayListHead; - } - if (arg9 < arg7) { - return displayListHead; - } - arg2 /= arg4; - arg3 /= arg5; - - sp7C = argA; - for (var_s3 = arg7; var_s3 < (u32) arg9; var_s3 += temp_lo) { - - if ((u32) arg9 < temp_lo + var_s3) { - var_s4 = arg9 - var_s3; - if (!var_s4) { - break; - } - } else { - var_s4 = temp_lo; - } - b = var_s4 * arg5; - for (var_a1_2 = arg6; var_a1_2 < (u32) arg8; var_a1_2 += var_t0) { - - if ((u32) arg8 < (var_t0 + var_a1_2)) { - var_s2 = arg8 - var_a1_2; - if (!var_s2) { - break; - } - } else { - var_s2 = var_t0; - } - a = var_s2 * arg4; - - gDPLoadTextureTile(displayListHead++, argC, arg1, G_IM_SIZ_16b, argD, argE, var_a1_2, var_s3, - // var_a1_2 + var_s2, var_s3 + var_s4, 0, G_TX_NOMIRROR | G_TX_WRAP, - // G_TX_NOMIRROR | G_TX_WRAP, sp68, sp64, G_TX_NOLOD, G_TX_NOLOD); - // @recomp Fix textures loading more pixels than they should by adjusting the - // tile size and the mask. - var_a1_2 + var_s2 - 1, var_s3 + var_s4 - 1, 0, G_TX_NOMIRROR | G_TX_WRAP, - G_TX_NOMIRROR | G_TX_WRAP, 0, 0, G_TX_NOLOD, G_TX_NOLOD); - gSPTextureRectangle(displayListHead++, argA * 4, argB * 4, (argA + a) * 4, (argB + b) * 4, 0, - (var_a1_2 * 32) & 0xFFFF, (var_s3 * 32) & 0xFFFF, arg2, arg3); - - argA += var_t0 * arg4; - } - - argA = sp7C; - argB += temp_lo * arg5; - } - return displayListHead; -} -#endif - -#if 1 -RECOMP_PATCH Gfx* func_80097274(Gfx* displayListHead, s8 arg1, s32 arg2, s32 arg3, s32 arg4, s32 arg5, s32 arg6, - s32 arg7, s32 arg8, s32 arg9, UNUSED u16* argA, u32 argB, u32 argC, UNUSED s32 argD) { - u32 var_a1_2 = arg4; - u32 var_s3 = arg5; - s32 sp7C; - u32 var_s2; - u32 var_s4; - s32 var_t0 = 1; - s32 temp_lo; - s32 sp68 = 0; - s32 sp64 = 0; - s32 var_v0_2; - - gDPPipeSync(displayListHead++); - gDPSetCycleType(displayListHead++, G_CYC_2CYCLE); - gDPSetTextureLOD(displayListHead++, G_TL_TILE); - gDPSetPrimColor(displayListHead++, 0, 0, 0, 0, 0, gGlobalTimer % 256); - gDPSetCombineLERP(displayListHead++, TEXEL1, TEXEL0, PRIMITIVE_ALPHA, TEXEL0, TEXEL1, TEXEL0, PRIMITIVE, TEXEL0, 0, - 0, 0, COMBINED, 0, 0, 0, COMBINED); - - while ((u32) var_t0 < argB) { - var_t0 *= 2; - } - temp_lo = 0x400 / var_t0; - while ((u32) (temp_lo / 2) > argC) { - temp_lo /= 2; - } - var_v0_2 = var_t0; - while (var_v0_2 > 1) { - var_v0_2 /= 2; - sp68 += 1; - } - var_v0_2 = temp_lo; - while (var_v0_2 > 1) { - var_v0_2 /= 2; - sp64 += 1; - } - if (arg8 < 0) { - arg4 -= arg8; - arg8 = 0; - } else if (((arg6 - arg4) + arg8) > 320) { - arg6 = (arg4 - arg8) + 320; - } - if (arg9 < 0) { - arg5 -= arg9; - arg9 = 0; - } else if (((arg7 - arg5) + arg9) > 240) { - arg7 = (arg5 - arg9) + 240; - } - if (arg6 < arg4) { - return displayListHead; - } - if (arg7 < arg5) { - return displayListHead; - } - sp7C = arg8; - for (var_s3 = arg5; var_s3 < (u32) arg7; var_s3 += temp_lo) { - if ((u32) arg7 < temp_lo + var_s3) { - var_s4 = arg7 - var_s3; - if (!var_s4) { - break; - } - } else { - var_s4 = temp_lo; - } - for (var_a1_2 = arg4; var_a1_2 < (u32) arg6; var_a1_2 += var_t0) { - if ((u32) arg6 < var_t0 + var_a1_2) { - var_s2 = arg6 - var_a1_2; - if (!var_s2) { - break; - } - } else { - var_s2 = var_t0; - } - - u8* D_0B002A00_MissingSym = (u8*) 0x0B002A00; - - gDPLoadMultiTile(displayListHead++, argA, 0, G_TX_RENDERTILE, arg1, G_IM_SIZ_16b, argB, argC, var_a1_2, - // var_s3, var_a1_2 + var_s2, var_s3 + var_s4, 0, G_TX_WRAP, G_TX_WRAP, sp68, sp64, - // @recomp Fix textures loading more pixels than they should by adjusting the - // tile size and the mask. - var_s3, var_a1_2 + var_s2 - 1, var_s3 + var_s4 - 1, 0, G_TX_WRAP, G_TX_WRAP, 0, 0, - G_TX_NOLOD, G_TX_NOLOD); - gDPLoadMultiTile(displayListHead++, *D_0B002A00_MissingSym + random_int(128) * 2, 256, G_TX_RENDERTILE + 1, - arg1, - // G_IM_SIZ_16b, argB, argC, var_a1_2, var_s3, var_a1_2 + var_s2, var_s3 + var_s4, 0, - // G_TX_WRAP, G_TX_WRAP, sp68, sp64, G_TX_NOLOD, G_TX_NOLOD); - // @recomp Fix textures loading more pixels than they should by adjusting the - // tile size and the mask. - G_IM_SIZ_16b, argB, argC, var_a1_2, var_s3, var_a1_2 + var_s2 - 1, var_s3 + var_s4 - 1, 0, - G_TX_WRAP, G_TX_WRAP, 0, 0, G_TX_NOLOD, G_TX_NOLOD); - gSPTextureRectangle(displayListHead++, arg8 * 4, arg9 * 4, (arg8 + var_s2) * 4, (arg9 + var_s4) * 4, 0, - (var_a1_2 * 32) & 0xFFFF, (var_s3 * 32) & 0xFFFF, arg2, arg3); - arg8 += var_t0; - } - arg8 = sp7C; - arg9 += temp_lo; - } - gDPPipeSync(displayListHead++); - gDPSetCycleType(displayListHead++, G_CYC_1CYCLE); - return displayListHead; -} -#endif - -#if 1 -RECOMP_PATCH Gfx* func_80097E58(Gfx* displayListHead, s8 fmt, UNUSED u32 arg2, u32 arg3, UNUSED u32 arg4, u32 arg5, - s32 arg6, s32 arg7, u8* someTexture, u32 arg9, UNUSED u32 argA, s32 width) { - u32 ult; - u32 temp; - s32 arg6Copy; - s32 temp_v1; - s32 var_s2; - s32 lrs; - s32 spDC; - s32 temp2 = 32; - - if (width >= 32) { - return displayListHead; - } - - arg6Copy = arg6; - - lrs = arg9 / 2; - spDC = arg9 - lrs; - for (ult = arg3; ult < arg5; ult += 32) { - temp = 0; - if ((ult + temp2) > arg5) { - var_s2 = arg5 - ult; - if (!var_s2) { - break; - } - } else { - var_s2 = temp2; - } - temp_v1 = ((32 * lrs) << 10) / (lrs * (32 - width)); - - // gDPLoadTextureTile(displayListHead++, someTexture, fmt, G_IM_SIZ_16b, arg9, argA, temp, ult, temp + lrs, - // ult + var_s2, 0, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, 5, 5, G_TX_NOLOD, - // @recomp Fix textures loading more pixels than they should by adjusting the - // tile size and the mask. - gDPLoadTextureTile(displayListHead++, someTexture, fmt, G_IM_SIZ_16b, arg9, argA, temp, ult, temp + lrs - 1, - ult + var_s2 - 1, 0, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, 0, 0, G_TX_NOLOD, - G_TX_NOLOD); - gSPTextureRectangle(displayListHead++, (arg6 + lrs * width / 32) << 2, arg7 << 2, (arg6 + lrs) << 2, - (arg7 + var_s2) << 2, 0, 0, (ult << 5) & 0xFFFF, temp_v1, 1024); - arg6 += lrs; - temp_v1 = ((32 * spDC) << 10) / (spDC * (32 - width)); - // gDPLoadTextureTile(displayListHead++, someTexture, fmt, G_IM_SIZ_16b, arg9, argA, temp + lrs, ult, temp + - // arg9, - // ult + var_s2, 0, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, 5, 5, G_TX_NOLOD, - // @recomp Fix textures loading more pixels than they should by adjusting the - // tile size and the mask. - gDPLoadTextureTile(displayListHead++, someTexture, fmt, G_IM_SIZ_16b, arg9, argA, temp + lrs, ult, - temp + arg9 - 1, ult + var_s2 - 1, 0, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, - 0, 0, G_TX_NOLOD, G_TX_NOLOD); - gSPTextureRectangle(displayListHead++, arg6 << 2, arg7 << 2, (arg6 + spDC * (32 - width) / 32) << 2, - (arg7 + var_s2) << 2, 0, (lrs << 5) & 0xFFFF, (ult << 5) & 0xFFFF, temp_v1, 1024); - arg6 = arg6Copy; - arg7 += temp2; - } - return displayListHead; -} -#endif - -Gfx* drawBackground(Gfx* displayListHead, s8 arg1, s32 arg2, s32 arg3, s32 arg4, s32 arg5, s32 arg6, s32 arg7, u8* arg8, - u32 arg9, u32 argA) { - gDPPipeSync(displayListHead++); - gDPSetCycleType(displayListHead++, G_CYC_COPY); - displayListHead = drawBackground2(displayListHead, arg1, 0x00001000, 0x00000400, arg2, arg3, arg4, arg5, arg6, arg7, - arg8, arg9, argA); - gDPPipeSync(displayListHead++); - gDPSetCycleType(displayListHead++, G_CYC_1CYCLE); - return displayListHead; -} - -Gfx* RenderMenuTextures(Gfx* arg0, MenuTexture* arg1, s32 column, s32 row) { - MenuTexture* temp_v0; - u8* temp_v0_3; - s8 var_s4; - - temp_v0 = segmented_to_virtual_dupe(arg1); - while (temp_v0->textureData != NULL) { - var_s4 = 0; - switch (temp_v0->type) { - case 0: - gSPDisplayList(arg0++, 0x02007708); - break; - case 1: - gSPDisplayList(arg0++, 0x02007728); - break; - case 2: - gSPDisplayList(arg0++, 0x02007748); - break; - case 3: - gSPDisplayList(arg0++, 0x02007768); - var_s4 = 3; - break; - case 4: - gSPDisplayList(arg0++, 0x02007788); - break; - default: - gSPDisplayList(arg0++, 0x02007728); - break; - } - temp_v0_3 = (u8*) func_8009B8C4(temp_v0->textureData); - if (temp_v0_3 != 0) { - if (D_8018E7AC[4] != 4) { - arg0 = RenderBackground(arg0, var_s4, 0x00000400, 0x00000400, 0, 0, temp_v0->width, temp_v0->height, - temp_v0->dX + column, temp_v0->dY + row, temp_v0_3, temp_v0->width, - temp_v0->height); - } else { - arg0 = func_800987D0(arg0, 0U, 0U, temp_v0->width, temp_v0->height, temp_v0->dX + column, - temp_v0->dY + row, temp_v0_3, temp_v0->width, temp_v0->height); - } - } - temp_v0++; - } - return arg0; -} - -Gfx* RenderBackground(Gfx* displayListHead, s8 arg1, s32 arg2, s32 arg3, s32 arg4, s32 arg5, s32 arg6, s32 arg7, - s32 arg8, s32 arg9, u8* argA, u32 argB, u32 argC) { - u32 var_a1_2 = arg4; - u32 var_s3 = arg5; - s32 sp7C; - u32 var_s2; - u32 var_s4; - s32 var_t0 = 1; - s32 temp_lo; - s32 sp68 = 0; - s32 sp64 = 0; - s32 var_v0_2; - - while ((u32) var_t0 < argB) { - var_t0 *= 2; - } - - temp_lo = 0x400 / var_t0; - - while ((u32) (temp_lo / 2) > argC) { - temp_lo /= 2; - } - - var_v0_2 = var_t0; - while (var_v0_2 > 1) { - var_v0_2 /= 2; - sp68 += 1; - } - var_v0_2 = temp_lo; - - while (var_v0_2 > 1) { - var_v0_2 /= 2; - sp64 += 1; - } - - if (arg8 < 0) { - arg4 -= arg8; - arg8 = 0; - } else if (((arg6 - arg4) + arg8) > SCREEN_WIDTH) { - arg6 = (arg4 - arg8) + SCREEN_WIDTH; - } - - if (arg9 < 0) { - arg5 -= arg9; - arg9 = 0; - } else if (((arg7 - arg5) + arg9) > SCREEN_HEIGHT) { - arg7 = (arg5 - arg9) + SCREEN_HEIGHT; - } - - if (arg6 < arg4) { - return displayListHead; - } - if (arg7 < arg5) { - return displayListHead; - } - sp7C = arg8; - for (var_s3 = arg5; var_s3 < (u32) arg7; var_s3 += temp_lo) { - - if ((u32) arg7 < temp_lo + var_s3) { - var_s4 = arg7 - var_s3; - if (!var_s4) { - break; - } - } else { - var_s4 = temp_lo; - } - - for (var_a1_2 = arg4; var_a1_2 < (u32) arg6; var_a1_2 += var_t0) { - - if ((u32) arg6 < var_t0 + var_a1_2) { - var_s2 = arg6 - var_a1_2; - if (!var_s2) { - break; - } - } else { - var_s2 = var_t0; - } - gDPLoadTextureTile(displayListHead++, argA, arg1, G_IM_SIZ_16b, argB, 0, var_a1_2, var_s3, - // var_a1_2 + var_s2, var_s3 + var_s4, 0, G_TX_NOMIRROR | G_TX_WRAP, - // G_TX_NOMIRROR | G_TX_WRAP, sp68, sp64, G_TX_NOLOD, G_TX_NOLOD); - // @recomp Fix textures loading more pixels than they should by adjusting the - // tile size and the mask. - var_a1_2 + var_s2 - 1, var_s3 + var_s4 - 1, 0, G_TX_NOMIRROR | G_TX_WRAP, - G_TX_NOMIRROR | G_TX_WRAP, 0, 0, G_TX_NOLOD, G_TX_NOLOD); - gEXTextureRectangle(displayListHead++, G_EX_ORIGIN_CENTER, G_EX_ORIGIN_CENTER, arg8 * 4 - SCREEN_WIDTH * 2, arg9 * 4, - (arg8 + var_s2) * 4 - SCREEN_WIDTH * 2, (arg9 + var_s4) * 4, 0, (var_a1_2 * 32) & 0xFFFF, - (var_s3 * 32) & 0xFFFF, arg2, arg3); - - arg8 += var_t0; - } - - arg8 = sp7C; - arg9 += temp_lo; - } - return displayListHead; -} - -#if 1 -Gfx* drawBackground2(Gfx* displayListHead, s8 arg1, s32 arg2, s32 arg3, s32 arg4, s32 arg5, s32 arg6, s32 arg7, - s32 arg8, s32 arg9, u8* argA, u32 argB, u32 argC) { - u32 var_a1_2 = arg4; - u32 var_s3 = arg5; - s32 sp7C; - u32 var_s2; - u32 var_s4; - s32 var_t0 = 1; - s32 temp_lo; - s32 sp68 = 0; - s32 sp64 = 0; - s32 var_v0_2; - - while ((u32) var_t0 < argB) { - var_t0 *= 2; - } - - temp_lo = 0x400 / var_t0; - - while ((u32) (temp_lo / 2) > argC) { - temp_lo /= 2; - } - - var_v0_2 = var_t0; - while (var_v0_2 > 1) { - var_v0_2 /= 2; - sp68 += 1; - } - var_v0_2 = temp_lo; - - while (var_v0_2 > 1) { - var_v0_2 /= 2; - sp64 += 1; - } - - if (arg8 < 0) { - arg4 -= arg8; - arg8 = 0; - } else if (((arg6 - arg4) + arg8) > SCREEN_WIDTH) { - arg6 = (arg4 - arg8) + SCREEN_WIDTH; - } - - if (arg9 < 0) { - arg5 -= arg9; - arg9 = 0; - } else if (((arg7 - arg5) + arg9) > SCREEN_HEIGHT) { - arg7 = (arg5 - arg9) + SCREEN_HEIGHT; - } - - if (arg6 < arg4) { - return displayListHead; - } - if (arg7 < arg5) { - return displayListHead; - } - sp7C = arg8; - for (var_s3 = arg5; var_s3 < (u32) arg7; var_s3 += temp_lo) { - - if ((u32) arg7 < temp_lo + var_s3) { - var_s4 = arg7 - var_s3; - if (!var_s4) { - break; - } - } else { - var_s4 = temp_lo; - } - - for (var_a1_2 = arg4; var_a1_2 < (u32) arg6; var_a1_2 += var_t0) { - - if ((u32) arg6 < var_t0 + var_a1_2) { - var_s2 = arg6 - var_a1_2; - if (!var_s2) { - break; - } - } else { - var_s2 = var_t0; - } - gDPLoadTextureTile(displayListHead++, argA, arg1, G_IM_SIZ_16b, argB, 0, var_a1_2, var_s3, - // var_a1_2 + var_s2, var_s3 + var_s4, 0, G_TX_NOMIRROR | G_TX_WRAP, - // G_TX_NOMIRROR | G_TX_WRAP, sp68, sp64, G_TX_NOLOD, G_TX_NOLOD); - // @recomp Fix textures loading more pixels than they should by adjusting the - // tile size and the mask. - var_a1_2 + var_s2 - 1, var_s3 + var_s4 - 1, 0, G_TX_NOMIRROR | G_TX_WRAP, - G_TX_NOMIRROR | G_TX_WRAP, 0, 0, G_TX_NOLOD, G_TX_NOLOD); - gEXTextureRectangle(displayListHead++, G_EX_ORIGIN_CENTER, G_EX_ORIGIN_CENTER, arg8 * 4 - SCREEN_WIDTH * 2, arg9 * 4, - (arg8 + var_s2) * 4 - SCREEN_WIDTH * 2, (arg9 + var_s4) * 4, 0, (var_a1_2 * 32) & 0xFFFF, - (var_s3 * 32) & 0xFFFF, arg2, arg3); - - arg8 += var_t0; - } - - arg8 = sp7C; - arg9 += temp_lo; - } - return displayListHead; -} -#endif diff --git a/patches/viewports.c b/patches/viewports.c deleted file mode 100644 index eb5a082..0000000 --- a/patches/viewports.c +++ /dev/null @@ -1,144 +0,0 @@ -#include "patches.h" - -#if 0 // GLOBAL - -#if 1 -RECOMP_PATCH void func_802A3730(struct UnkStruct_800DC5EC* arg0) { - s32 ulx; - s32 uly; - s32 lrx; - s32 lry; - s32 screenWidth = arg0->screenWidth * 2; - s32 screenHeight = arg0->screenHeight * 2; - s32 screenStartX = arg0->screenStartX * 4; - s32 screenStartY = arg0->screenStartY * 4; - - arg0->viewport.vp.vscale[0] = screenWidth; - arg0->viewport.vp.vscale[1] = screenHeight; - arg0->viewport.vp.vscale[2] = 511; - arg0->viewport.vp.vscale[3] = 0; - - arg0->viewport.vp.vtrans[0] = screenStartX; - arg0->viewport.vp.vtrans[1] = screenStartY; - arg0->viewport.vp.vtrans[2] = 511; - arg0->viewport.vp.vtrans[3] = 0; - - // gSPViewport(gDisplayListHead++, VIRTUAL_TO_PHYSICAL(&arg0->viewport)); - gEXViewport(gDisplayListHead++, G_EX_ORIGIN_CENTER, VIRTUAL_TO_PHYSICAL(&arg0->viewport)); - - screenWidth /= 4; - screenHeight /= 4; - - screenStartX /= 4; - screenStartY /= 4; - - lrx = screenStartX + screenWidth; - if (lrx > SCREEN_WIDTH) { - lrx = SCREEN_WIDTH; - } - - lry = screenStartY + screenHeight; - if (lry > SCREEN_HEIGHT) { - lry = SCREEN_HEIGHT; - } - ulx = 0; - uly = 0; - - // arg0->viewport.vp.vtrans[0] -= screenWidth / 2; - - //gDPSetScissor(gDisplayListHead++, G_SC_NON_INTERLACE, ulx, uly, lrx, lry); - gEXSetScissor(gDisplayListHead++, G_SC_NON_INTERLACE, G_EX_ORIGIN_LEFT, G_EX_ORIGIN_RIGHT, 0, 0, 0, 240); -} -#endif - -#if 1 -RECOMP_PATCH void func_802A4300(void) { - - if (gActiveScreenMode == SCREEN_MODE_1P) { - return; - } - if (D_800DC5B0 != 0) { - return; - } - - gDPPipeSync(gDisplayListHead++); - gDPSetCycleType(gDisplayListHead++, G_CYC_FILL); - gDPSetColorImage(gDisplayListHead++, G_IM_FMT_RGBA, G_IM_SIZ_16b, SCREEN_WIDTH, - VIRTUAL_TO_PHYSICAL(gPhysicalFramebuffers[sRenderingFramebuffer])); - gDPSetFillColor(gDisplayListHead++, 0x00010001); - gSPViewport(gDisplayListHead++, VIRTUAL_TO_PHYSICAL(&D_802B8880)); - // gDPSetScissor(gDisplayListHead++, G_SC_NON_INTERLACE, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT); - gDPPipeSync(gDisplayListHead++); - - switch (gActiveScreenMode) { - case SCREEN_MODE_2P_SPLITSCREEN_VERTICAL: - gDPFillRectangle(gDisplayListHead++, 157, 0, 159, 239); - break; - case SCREEN_MODE_2P_SPLITSCREEN_HORIZONTAL: - gDPFillRectangle(gDisplayListHead++, 0, 119, 319, 121); - break; - case SCREEN_MODE_3P_4P_SPLITSCREEN: - gDPFillRectangle(gDisplayListHead++, 157, 0, 159, 239); - gDPFillRectangle(gDisplayListHead++, 0, 119, 319, 121); - break; - } - gDPPipeSync(gDisplayListHead++); - gDPSetCycleType(gDisplayListHead++, G_CYC_1CYCLE); -} -#endif - -#if 1 -RECOMP_PATCH void select_framebuffer(void) { - gDPSetColorImage(gDisplayListHead++, G_IM_FMT_RGBA, G_IM_SIZ_16b, SCREEN_WIDTH, - VIRTUAL_TO_PHYSICAL(gPhysicalFramebuffers[sRenderingFramebuffer])); - gDPSetFillColor(gDisplayListHead++, GPACK_RGBA5551(D_800DC5D0, D_800DC5D4, D_800DC5D8, 1) << 0x10 | - GPACK_RGBA5551(D_800DC5D0, D_800DC5D4, D_800DC5D8, 1)); - gDPPipeSync(gDisplayListHead++); - // gDPSetScissor(gDisplayListHead++, G_SC_NON_INTERLACE, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT); - gDPFillRectangle(gDisplayListHead++, 0, 0, SCREEN_WIDTH - 1, SCREEN_HEIGHT - 1); - gDPPipeSync(gDisplayListHead++); - gDPSetCycleType(gDisplayListHead++, G_CYC_1CYCLE); -} -#endif - -#if 1 -RECOMP_PATCH void init_rdp(void) { - gDPPipeSync(gDisplayListHead++); - gDPPipelineMode(gDisplayListHead++, G_PM_1PRIMITIVE); - // gDPSetScissor(gDisplayListHead++, G_SC_NON_INTERLACE, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT); - gDPSetCombineMode(gDisplayListHead++, G_CC_SHADE, G_CC_SHADE); - gDPSetTextureLOD(gDisplayListHead++, G_TL_TILE); - gDPSetTextureLUT(gDisplayListHead++, G_TT_NONE); - gDPSetTextureDetail(gDisplayListHead++, G_TD_CLAMP); - gDPSetTexturePersp(gDisplayListHead++, G_TP_PERSP); - gDPSetTextureFilter(gDisplayListHead++, G_TF_BILERP); - gDPSetTextureConvert(gDisplayListHead++, G_TC_FILT); - gDPSetCombineKey(gDisplayListHead++, G_CK_NONE); - gDPSetAlphaCompare(gDisplayListHead++, G_AC_NONE); - gDPSetRenderMode(gDisplayListHead++, G_RM_OPA_SURF, G_RM_OPA_SURF2); - gDPSetBlendMask(gDisplayListHead++, 0xFF); - gDPSetColorDither(gDisplayListHead++, G_CD_DISABLE); - gDPPipeSync(gDisplayListHead++); - gSPClipRatio(gDisplayListHead++, FRUSTRATIO_1); -} -#endif - -#if 1 -RECOMP_PATCH void init_z_buffer(void) { - gDPPipeSync(gDisplayListHead++); - gDPSetCycleType(gDisplayListHead++, G_CYC_FILL); - gDPSetDepthImage(gDisplayListHead++, gPhysicalZBuffer); - gDPSetColorImage(gDisplayListHead++, G_IM_FMT_RGBA, G_IM_SIZ_16b, SCREEN_WIDTH, gPhysicalZBuffer); - gDPSetFillColor(gDisplayListHead++, 0xFFFCFFFC); - gDPPipeSync(gDisplayListHead++); - // gDPSetScissor(gDisplayListHead++, G_SC_NON_INTERLACE, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT); - gDPFillRectangle(gDisplayListHead++, 0, 0, 319, 239); - gDPPipeSync(gDisplayListHead++); - gDPSetColorImage(gDisplayListHead++, G_IM_FMT_RGBA, G_IM_SIZ_16b, SCREEN_WIDTH, - VIRTUAL_TO_PHYSICAL(gPhysicalFramebuffers[sRenderingFramebuffer])); - gDPSetCycleType(gDisplayListHead++, G_CYC_1CYCLE); - gDPSetDepthSource(gDisplayListHead++, G_ZS_PIXEL); -} -#endif - -#endif // GLOBAL \ No newline at end of file diff --git a/patches/workbench.c b/patches/workbench.c deleted file mode 100644 index 9def925..0000000 --- a/patches/workbench.c +++ /dev/null @@ -1,324 +0,0 @@ -#include "patches.h" - -#if 0 -RECOMP_PATCH void func_802A3730(struct UnkStruct_800DC5EC* arg0) { - s32 ulx; - s32 uly; - s32 lrx; - s32 lry; - s32 screenWidth = arg0->screenWidth * 2; - s32 screenHeight = arg0->screenHeight * 2; - s32 screenStartX = arg0->screenStartX * 4; - s32 screenStartY = arg0->screenStartY * 4; - - arg0->viewport.vp.vscale[0] = screenWidth; - arg0->viewport.vp.vscale[1] = screenHeight; - arg0->viewport.vp.vscale[2] = 511; - arg0->viewport.vp.vscale[3] = 0; - - arg0->viewport.vp.vtrans[0] = screenStartX; - arg0->viewport.vp.vtrans[1] = screenStartY; - arg0->viewport.vp.vtrans[2] = 511; - arg0->viewport.vp.vtrans[3] = 0; - - gSPViewport(gDisplayListHead++, VIRTUAL_TO_PHYSICAL(&arg0->viewport)); - - screenWidth /= 4; - screenHeight /= 4; - - screenStartX /= 4; - screenStartY /= 4; - - lrx = screenStartX + screenWidth; - if (lrx > SCREEN_WIDTH) { - lrx = SCREEN_WIDTH; - } - - lry = screenStartY + screenHeight; - if (lry > SCREEN_HEIGHT) { - lry = SCREEN_HEIGHT; - } - ulx = 0; - uly = 0; - - gDPSetScissor(gDisplayListHead++, G_SC_NON_INTERLACE, ulx, uly, lrx, lry); -} -#endif - -#if 1 // Fix Debug on issue ( need to figure out actual issue. -void func_800CA330(u8 arg0); - -RECOMP_PATCH void func_8028F4E8(void) { - if (gEnableDebugMode) { - if (((gControllerOne->button & R_TRIG) != 0) && ((gControllerOne->button & L_TRIG) != 0) && - ((gControllerOne->button & A_BUTTON) != 0) && ((gControllerOne->button & B_BUTTON) != 0)) { - - func_800CA330(0x19); - func_800CA388(0x19); - gGotoMode = MAIN_MENU_FROM_QUIT; - D_800DC510 = 6; - D_800DC5B4 = 1; - D_800DC5B0 = 1; - D_800DC5B8 = 0; - D_802BA038 = 5; - } - } -} -#endif - -#if 0 -int counter = 0; - -RECOMP_PATCH void func_80094A64(struct GfxPool* pool) { - - gMatrixHudCount = 0; - gMatrixEffectCount = 0; - gSPViewport(gDisplayListHead++, VIRTUAL_TO_PHYSICAL(0x802B8880)); - gDPSetScissor(gDisplayListHead++, G_SC_NON_INTERLACE, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT); - guOrtho(&pool->mtxScreen, 0.0f, SCREEN_WIDTH - 1, SCREEN_HEIGHT - 1, 0.0f, -100.0f, 100.0f, 1.0f); - gSPMatrix(gDisplayListHead++, &pool->mtxScreen, G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_PROJECTION); - gSPDisplayList(gDisplayListHead++, (Gfx*) 0x02007650); - setup_menus(); - func_80092290(4, D_8018E850, D_8018E858); - func_80092290(5, &D_8018E850[1], &D_8018E858[1]); - func_80099A70(); - func_8009C918(); - switch (gMenuSelection) { - case START_MENU: - func_80095574(); - func_80093E40(); - break; - case OPTIONS_MENU: - case DATA_MENU: - case COURSE_DATA_MENU: - case LOGO_INTRO_MENU: - case CONTROLLER_PAK_MENU: - case MAIN_MENU: - case CHARACTER_SELECT_MENU: - case COURSE_SELECT_MENU: - handle_menus_default(); - func_80099AEC(); - // recomp_sleep_miliseconds(60); - break; - } - func_8009CA2C(); - gCycleFlashMenu += 1; - gDPPipeSync(gDisplayListHead++); - gSPDisplayList(gDisplayListHead++, (Gfx*) 0x020076B0); -} - -RECOMP_PATCH void func_8009CA6C(s32 arg0) { - s32 var_a1; - - if ((arg0 == 4) || ((find_menu_items(0x000000AA) == NULL) && (find_menu_items(0x000000AB) == NULL) && - (find_menu_items(0x000000B9) == NULL) && (find_menu_items(0x000000BA) == NULL) && - (find_menu_items(0x000000AC) == NULL) && (find_menu_items(0x000000B0) == NULL))) { - var_a1 = 0; - gSPDisplayList(gDisplayListHead++, (Gfx*) 0x0D0076F8); - if ((arg0 != 4) && (gIsGamePaused != 0)) { - var_a1 = 1; - } - switch (D_8018E7AC[arg0]) { - case 1: - func_8009CDDC(arg0, var_a1); // fade in - return; - case 2: - func_8009D958(arg0, var_a1); // fade out - return; - case 3: - func_8009DB8C(); - return; - case 4: - func_8009DAA8(); - return; - case 5: - func_8009D998(arg0); - return; - case 7: - func_8009D978(arg0, var_a1); - return; - case 8: - func_8009CDFC(arg0, var_a1); - break; - case 0: - default: - break; - } - } -} - -RECOMP_PATCH void func_8009CBE4(s32 arg0, s32 arg1, s32 arg2) { - RGBA16* color; - s16 x, y, w, h; - UNUSED s32 pad[3]; - struct UnkStruct_800DC5EC* unk; - struct UnkStruct_8018E7E8 *size, *start; - - if ((gModeSelection == GRAND_PRIX) || (gModeSelection == TIME_TRIALS)) { - start = &(D_8018E7E8[arg0]); - size = &(D_8018E810[arg0]); - x = start->x; - y = start->y; - w = size->x; - h = size->y; - } else if (arg0 >= 4) { - start = &(D_8018E7E8[arg0]); - size = &(D_8018E810[arg0]); - x = start->x; - y = start->y; - w = size->x; - h = size->y; - } else { - unk = &D_8015F480[arg0]; - x = unk->screenStartX; - y = unk->screenStartY; - w = unk->screenWidth; - h = unk->screenHeight; - } - color = &D_800E7AE8[arg2]; - gDisplayListHead = draw_box(gDisplayListHead, x - (w / 2), y - (h / 2), (w / 2) + x, (h / 2) + y, color->red, - color->green, color->blue, 0xFF - (D_8018E7D0[arg0] * 0xFF / D_8018E7B8[arg0])); - - if ((arg1 == 0) && (D_8018E7D0[arg0] += 1, (D_8018E7D0[arg0] >= D_8018E7B8[arg0]))) { - if (gGamestate == RACING) { - - D_8018E7AC[arg0] = 6; - return; - } - D_8018E7AC[arg0] = 0; - unref_8018EE0C = 0; - } -} - -RECOMP_PATCH void func_8009D77C(s32 arg0, s32 arg1, s32 arg2) { - s16 var_ra; - s16 var_t3; - s16 var_t4; - s32 temp_t8; - s32 temp_v1; - s32 var_t2; - s32 someMath0; - s32 someMath1; - RGBA16* temp_v0_2; - s32 sp44; - UNUSED s32 stackPadding0; - - counter++; - recomp_printf("counter: %d\n", counter); - - if ((gModeSelection == 0) || (gModeSelection == 1)) { - var_t3 = D_8018E7E8[arg0].x; - var_t4 = D_8018E7E8[arg0].y; - var_ra = D_8018E810[arg0].x; - sp44 = D_8018E810[arg0].y; - } else if (arg0 >= 4) { - var_t3 = D_8018E7E8[arg0].x; - var_t4 = D_8018E7E8[arg0].y; - var_ra = D_8018E810[arg0].x; - sp44 = D_8018E810[arg0].y; - } else { - var_t3 = D_8015F480[arg0].screenStartX; - var_t4 = D_8015F480[arg0].screenStartY; - var_ra = D_8015F480[arg0].screenWidth; - sp44 = D_8015F480[arg0].screenHeight; - } - var_t2 = (D_8018E7D0[arg0] * 0xFF) / D_8018E7B8[arg0]; - if (var_t2 >= 0x100) { - var_t2 = 0x000000FF; - } - temp_v1 = var_ra / 2; - temp_t8 = sp44 / 2; - temp_v0_2 = &D_800E7AE8[arg2]; - // Why does it have to written like this to match? - someMath0 = temp_v1; - someMath0 += var_t3; - someMath1 = temp_t8; - someMath1 += var_t4; - gDisplayListHead = draw_box(gDisplayListHead, var_t3 - temp_v1, var_t4 - temp_t8, someMath0, someMath1, - temp_v0_2->red, temp_v0_2->green, temp_v0_2->blue, var_t2); - if (arg1 == 0) { - D_8018E7D0[arg0]++; - if ((D_8018E7B8[arg0] + 1) < D_8018E7D0[arg0]) { - if (counter >= 300) { - counter = 0; - func_8009CE64(arg0); - } - } - } -} -#endif - -#if 0 -RECOMP_PATCH void render_course(struct UnkStruct_800DC5EC* arg0) { - - set_course_lighting(D_800DC610, D_802B87D4, 0, 1); - if (creditsRenderMode) { - render_course_credits(); - return; - } - - switch (gCurrentCourseId) { - case COURSE_MARIO_RACEWAY: - render_mario_raceway(arg0); - break; - case COURSE_CHOCO_MOUNTAIN: - render_choco_mountain(arg0); - break; - case COURSE_BOWSER_CASTLE: - render_bowsers_castle(arg0); - break; - case COURSE_BANSHEE_BOARDWALK: - render_banshee_boardwalk(arg0); - break; - case COURSE_YOSHI_VALLEY: - render_yoshi_valley(arg0); - break; - case COURSE_FRAPPE_SNOWLAND: - render_frappe_snowland(arg0); - break; - case COURSE_KOOPA_BEACH: - render_koopa_troopa_beach(arg0); - break; - case COURSE_ROYAL_RACEWAY: - render_royal_raceway(arg0); - break; - case COURSE_LUIGI_RACEWAY: - render_luigi_raceway(arg0); - break; - case COURSE_MOO_MOO_FARM: - render_moo_moo_farm(arg0); - break; - case COURSE_TOADS_TURNPIKE: - render_toads_turnpike(arg0); - break; - case COURSE_KALAMARI_DESERT: - render_kalimari_desert(arg0); - break; - case COURSE_SHERBET_LAND: - render_sherbet_land(arg0); - break; - case COURSE_RAINBOW_ROAD: - render_rainbow_road(arg0); - // render_course_credits(); - break; - case COURSE_WARIO_STADIUM: - render_wario_stadium(arg0); - break; - case COURSE_BLOCK_FORT: - render_block_fort(arg0); - break; - case COURSE_SKYSCRAPER: - render_skyscraper(arg0); - break; - case COURSE_DOUBLE_DECK: - render_double_deck(arg0); - break; - case COURSE_DK_JUNGLE: - render_dks_jungle_parkway(arg0); - break; - case COURSE_BIG_DONUT: - render_big_donut(arg0); - break; - } -} -#endif \ No newline at end of file diff --git a/rsp/aspMain.cpp b/rsp/aspMain.cpp new file mode 100644 index 0000000..4cda2e7 --- /dev/null +++ b/rsp/aspMain.cpp @@ -0,0 +1,2272 @@ +#include "librecomp/rsp.hpp" +#include "librecomp/rsp_vu_impl.hpp" +RspExitReason aspMain(uint8_t* rdram, [[maybe_unused]] uint32_t ucode_addr) { + uint32_t r1 = 0, r2 = 0, r3 = 0, r4 = 0, r5 = 0, r6 = 0, r7 = 0; + uint32_t r8 = 0, r9 = 0, r10 = 0, r11 = 0, r12 = 0, r13 = 0, r14 = 0, r15 = 0; + uint32_t r16 = 0, r17 = 0, r18 = 0, r19 = 0, r20 = 0, r21 = 0, r22 = 0, r23 = 0; + uint32_t r24 = 0, r25 = 0, r26 = 0, r27 = 0, r28 = 0, r29 = 0, r30 = 0, r31 = 0; + uint32_t dma_mem_address = 0, dma_dram_address = 0, jump_target = 0; + const char * debug_file = NULL; int debug_line = 0; + RSP rsp{}; + r1 = 0xFC0; + // addi $24, $zero, 0x360 + r24 = RSP_ADD32(0, 0X360); + // addi $23, $zero, 0xF90 + r23 = RSP_ADD32(0, 0XF90); + // lw $28, 0x30($1) + r28 = RSP_MEM_W_LOAD(0X30, r1); + // lw $27, 0x34($1) + r27 = RSP_MEM_W_LOAD(0X34, r1); + // mfc0 $5, DPC_STATUS + r5 = 0; + // andi $4, $5, 0x1 + r4 = r5 & 0X1; + // beq $4, $zero, L_10B4 + if (r4 == 0) { + // andi $4, $5, 0x100 + r4 = r5 & 0X100; + goto L_10B4; + } + // andi $4, $5, 0x100 + r4 = r5 & 0X100; + // beq $4, $zero, L_10B4 + if (r4 == 0) { + // nop + + goto L_10B4; + } + // nop + +L_10A8: + // mfc0 $4, DPC_STATUS + r4 = 0; + // andi $4, $4, 0x100 + r4 = r4 & 0X100; + // bgtz $4, L_10A8 + if (RSP_SIGNED(r4) > 0) { + // nop + + goto L_10A8; + } +L_10B4: + // nop + + // jal 0x1150 + r31 = 0x10C0; + // nop + + goto L_1150; + // nop + +L_10C0: + // addi $2, $zero, 0xF + r2 = RSP_ADD32(0, 0XF); + // addi $1, $zero, 0x320 + r1 = RSP_ADD32(0, 0X320); +L_10C8: + // sw $zero, 0x0($1) + RSP_MEM_W_STORE(0X0, r1, 0); + // bgtz $2, L_10C8 + if (RSP_SIGNED(r2) > 0) { + // addi $2, $2, -0x1 + r2 = RSP_ADD32(r2, -0X1); + goto L_10C8; + } + // addi $2, $2, -0x1 + r2 = RSP_ADD32(r2, -0X1); +L_10D4: + // mfc0 $2, SP_DMA_BUSY + r2 = 0; + // bne $2, $zero, L_10D4 + if (r2 != 0) { + // addi $29, $zero, 0x380 + r29 = RSP_ADD32(0, 0X380); + goto L_10D4; + } + // addi $29, $zero, 0x380 + r29 = RSP_ADD32(0, 0X380); + // mtc0 $zero, SP_SEMAPHORE +L_10E4: + // lw $26, 0x0($29) + r26 = RSP_MEM_W_LOAD(0X0, r29); + // lw $25, 0x4($29) + r25 = RSP_MEM_W_LOAD(0X4, r29); + // srl $1, $26, 23 + r1 = S32(U32(r26) >> 23); + // andi $1, $1, 0xFE + r1 = r1 & 0XFE; + // addi $28, $28, 0x8 + r28 = RSP_ADD32(r28, 0X8); + // addi $27, $27, -0x8 + r27 = RSP_ADD32(r27, -0X8); + // addi $29, $29, 0x8 + r29 = RSP_ADD32(r29, 0X8); + // addi $30, $30, -0x8 + r30 = RSP_ADD32(r30, -0X8); + // add $2, $zero, $1 + r2 = RSP_ADD32(0, r1); + // lh $2, 0x10($2) + r2 = RSP_MEM_H_LOAD(0X10, r2); + // jr $2 + jump_target = r2; + debug_file = __FILE__; debug_line = __LINE__; + // nop + + goto do_indirect_jump; + // nop + + // break 0 + return RspExitReason::Broke; +L_1118: + // bgtz $30, L_10E4 + if (RSP_SIGNED(r30) > 0) { + // nop + + goto L_10E4; + } + // nop + + // blez $27, L_1138 + if (RSP_SIGNED(r27) <= 0) { + // nop + + goto L_1138; + } + // nop + + // jal 0x1150 + r31 = 0x1130; + // nop + + goto L_1150; + // nop + +L_1130: + // j L_10D4 + // nop + + goto L_10D4; + // nop + +L_1138: + // ori $1, $zero, 0x4000 + r1 = 0 | 0X4000; + // mtc0 $1, SP_STATUS + // break 0 + return RspExitReason::Broke; + // nop + +L_1148: + // b L_1148 + // nop + + goto L_1148; + // nop + +L_1150: + // addi $5, $ra, 0x0 + r5 = RSP_ADD32(r31, 0X0); + // add $2, $zero, $28 + r2 = RSP_ADD32(0, r28); + // addi $3, $27, 0x0 + r3 = RSP_ADD32(r27, 0X0); + // addi $4, $3, -0x140 + r4 = RSP_ADD32(r3, -0X140); + // blez $4, L_116C + if (RSP_SIGNED(r4) <= 0) { + // addi $1, $zero, 0x380 + r1 = RSP_ADD32(0, 0X380); + goto L_116C; + } + // addi $1, $zero, 0x380 + r1 = RSP_ADD32(0, 0X380); + // addi $3, $zero, 0x140 + r3 = RSP_ADD32(0, 0X140); +L_116C: + // addi $30, $3, 0x0 + r30 = RSP_ADD32(r3, 0X0); + // jal 0x1184 + r31 = 0x1178; + // addi $3, $3, -0x1 + r3 = RSP_ADD32(r3, -0X1); + goto L_1184; + // addi $3, $3, -0x1 + r3 = RSP_ADD32(r3, -0X1); +L_1178: + // addi $29, $zero, 0x380 + r29 = RSP_ADD32(0, 0X380); + // jr $5 + jump_target = r5; + debug_file = __FILE__; debug_line = __LINE__; + // nop + + goto do_indirect_jump; + // nop + +L_1184: + // mfc0 $4, SP_SEMAPHORE + r4 = 0; + // bne $4, $zero, L_1184 + if (r4 != 0) { + // nop + + goto L_1184; + } + // nop + +L_1190: + // mfc0 $4, SP_DMA_FULL + r4 = 0; + // bne $4, $zero, L_1190 + if (r4 != 0) { + // nop + + goto L_1190; + } + // nop + + // mtc0 $1, SP_MEM_ADDR + SET_DMA_MEM(r1); + // mtc0 $2, SP_DRAM_ADDR + SET_DMA_DRAM(r2); + // mtc0 $3, SP_RD_LEN + DO_DMA_READ(r3); + // jr $ra + jump_target = r31; + debug_file = __FILE__; debug_line = __LINE__; + // nop + + goto do_indirect_jump; + // nop + +L_11B0: + // mfc0 $4, SP_SEMAPHORE + r4 = 0; + // bne $4, $zero, L_11B0 + if (r4 != 0) { + // nop + + goto L_11B0; + } + // nop + +L_11BC: + // mfc0 $4, SP_DMA_FULL + r4 = 0; + // bne $4, $zero, L_11BC + if (r4 != 0) { + // nop + + goto L_11BC; + } + // nop + + // mtc0 $1, SP_MEM_ADDR + SET_DMA_MEM(r1); + // mtc0 $2, SP_DRAM_ADDR + SET_DMA_DRAM(r2); + // mtc0 $3, SP_WR_LEN + DO_DMA_WRITE(r3); + // jr $ra + jump_target = r31; + debug_file = __FILE__; debug_line = __LINE__; + // nop + + goto do_indirect_jump; + // nop + +L_11DC: + // andi $3, $25, 0xFFFF + r3 = r25 & 0XFFFF; + // beq $3, $zero, L_1118 + if (r3 == 0) { + // addi $4, $zero, 0x5C0 + r4 = RSP_ADD32(0, 0X5C0); + goto L_1118; + } + // addi $4, $zero, 0x5C0 + r4 = RSP_ADD32(0, 0X5C0); + // andi $2, $26, 0xFFFF + r2 = r26 & 0XFFFF; + // add $2, $2, $4 + r2 = RSP_ADD32(r2, r4); + // vxor $v1, $v1, $v1 + rsp.VXOR<0>(rsp.vpu.r[1], rsp.vpu.r[1], rsp.vpu.r[1]); + // addi $3, $3, -0x10 + r3 = RSP_ADD32(r3, -0X10); +L_11F8: + // sdv $v1[0], 0x0($2) + rsp.SDV<0>(rsp.vpu.r[1], r2, 0X0); + // sdv $v1[0], 0x8($2) + rsp.SDV<0>(rsp.vpu.r[1], r2, 0X1); + // addi $2, $2, 0x10 + r2 = RSP_ADD32(r2, 0X10); + // bgtz $3, L_11F8 + if (RSP_SIGNED(r3) > 0) { + // addi $3, $3, -0x10 + r3 = RSP_ADD32(r3, -0X10); + goto L_11F8; + } + // addi $3, $3, -0x10 + r3 = RSP_ADD32(r3, -0X10); + // j L_1118 + // nop + + goto L_1118; + // nop + +L_1214: + // lhu $3, 0x4($24) + r3 = RSP_MEM_HU_LOAD(0X4, r24); + // beq $3, $zero, L_1118 + if (r3 == 0) { + // sll $2, $25, 8 + r2 = S32(r25) << 8; + goto L_1118; + } + // sll $2, $25, 8 + r2 = S32(r25) << 8; + // srl $2, $2, 8 + r2 = S32(U32(r2) >> 8); + // srl $4, $25, 24 + r4 = S32(U32(r25) >> 24); + // sll $4, $4, 2 + r4 = S32(r4) << 2; + // lw $5, 0x320($4) + r5 = RSP_MEM_W_LOAD(0X320, r4); + // add $2, $2, $5 + r2 = RSP_ADD32(r2, r5); + // lhu $1, 0x0($24) + r1 = RSP_MEM_HU_LOAD(0X0, r24); + // jal 0x1184 + r31 = 0x1240; + // addi $3, $3, -0x1 + r3 = RSP_ADD32(r3, -0X1); + goto L_1184; + // addi $3, $3, -0x1 + r3 = RSP_ADD32(r3, -0X1); +L_1240: + // mfc0 $1, SP_DMA_BUSY + r1 = 0; + // bne $1, $zero, L_1240 + if (r1 != 0) { + // nop + + goto L_1240; + } + // nop + + // j L_1118 + // mtc0 $zero, SP_SEMAPHORE + goto L_1118; + // mtc0 $zero, SP_SEMAPHORE +L_1254: + // lhu $3, 0x4($24) + r3 = RSP_MEM_HU_LOAD(0X4, r24); + // beq $3, $zero, L_1118 + if (r3 == 0) { + // sll $2, $25, 8 + r2 = S32(r25) << 8; + goto L_1118; + } + // sll $2, $25, 8 + r2 = S32(r25) << 8; + // srl $2, $2, 8 + r2 = S32(U32(r2) >> 8); + // srl $4, $25, 24 + r4 = S32(U32(r25) >> 24); + // sll $4, $4, 2 + r4 = S32(r4) << 2; + // lw $5, 0x320($4) + r5 = RSP_MEM_W_LOAD(0X320, r4); + // add $2, $2, $5 + r2 = RSP_ADD32(r2, r5); + // lhu $1, 0x2($24) + r1 = RSP_MEM_HU_LOAD(0X2, r24); + // jal 0x11B0 + r31 = 0x1280; + // addi $3, $3, -0x1 + r3 = RSP_ADD32(r3, -0X1); + goto L_11B0; + // addi $3, $3, -0x1 + r3 = RSP_ADD32(r3, -0X1); +L_1280: + // mfc0 $1, SP_DMA_BUSY + r1 = 0; + // bne $1, $zero, L_1280 + if (r1 != 0) { + // nop + + goto L_1280; + } + // nop + + // j L_1118 + // mtc0 $zero, SP_SEMAPHORE + goto L_1118; + // mtc0 $zero, SP_SEMAPHORE +L_1294: + // sll $2, $25, 8 + r2 = S32(r25) << 8; + // srl $2, $2, 8 + r2 = S32(U32(r2) >> 8); + // srl $4, $25, 24 + r4 = S32(U32(r25) >> 24); + // sll $4, $4, 2 + r4 = S32(r4) << 2; + // lw $5, 0x320($4) + r5 = RSP_MEM_W_LOAD(0X320, r4); + // add $2, $2, $5 + r2 = RSP_ADD32(r2, r5); + // addi $1, $zero, 0x4C0 + r1 = RSP_ADD32(0, 0X4C0); + // andi $3, $26, 0xFFFF + r3 = r26 & 0XFFFF; + // jal 0x1184 + r31 = 0x12BC; + // addi $3, $3, -0x1 + r3 = RSP_ADD32(r3, -0X1); + goto L_1184; + // addi $3, $3, -0x1 + r3 = RSP_ADD32(r3, -0X1); +L_12BC: + // mfc0 $1, SP_DMA_BUSY + r1 = 0; + // bne $1, $zero, L_12BC + if (r1 != 0) { + // nop + + goto L_12BC; + } + // nop + + // j L_1118 + // mtc0 $zero, SP_SEMAPHORE + goto L_1118; + // mtc0 $zero, SP_SEMAPHORE +L_12D0: + // sll $3, $25, 8 + r3 = S32(r25) << 8; + // srl $3, $3, 8 + r3 = S32(U32(r3) >> 8); + // srl $2, $25, 24 + r2 = S32(U32(r25) >> 24); + // sll $2, $2, 2 + r2 = S32(r2) << 2; + // add $4, $zero, $2 + r4 = RSP_ADD32(0, r2); + // j L_1118 + // sw $3, 0x320($4) + RSP_MEM_W_STORE(0X320, r4, r3); + goto L_1118; + // sw $3, 0x320($4) + RSP_MEM_W_STORE(0X320, r4, r3); +L_12EC: + // addi $1, $26, 0x5C0 + r1 = RSP_ADD32(r26, 0X5C0); + // srl $2, $25, 16 + r2 = S32(U32(r25) >> 16); + // addi $2, $2, 0x5C0 + r2 = RSP_ADD32(r2, 0X5C0); + // srl $4, $26, 16 + r4 = S32(U32(r26) >> 16); + // andi $4, $4, 0x8 + r4 = r4 & 0X8; + // bgtz $4, L_1318 + if (RSP_SIGNED(r4) > 0) { + // addi $3, $25, 0x5C0 + r3 = RSP_ADD32(r25, 0X5C0); + goto L_1318; + } + // addi $3, $25, 0x5C0 + r3 = RSP_ADD32(r25, 0X5C0); + // sh $1, 0x0($24) + RSP_MEM_H_STORE(0X0, r24, r1); + // sh $2, 0x2($24) + RSP_MEM_H_STORE(0X2, r24, r2); + // j L_1118 + // sh $25, 0x4($24) + RSP_MEM_H_STORE(0X4, r24, r25); + goto L_1118; + // sh $25, 0x4($24) + RSP_MEM_H_STORE(0X4, r24, r25); +L_1318: + // sh $3, 0xE($24) + RSP_MEM_H_STORE(0XE, r24, r3); + // sh $1, 0xA($24) + RSP_MEM_H_STORE(0XA, r24, r1); + // j L_1118 + // sh $2, 0xC($24) + RSP_MEM_H_STORE(0XC, r24, r2); + goto L_1118; + // sh $2, 0xC($24) + RSP_MEM_H_STORE(0XC, r24, r2); +L_1328: + // srl $2, $26, 16 + r2 = S32(U32(r26) >> 16); + // andi $1, $2, 0x8 + r1 = r2 & 0X8; + // beq $1, $zero, L_1344 + if (r1 == 0) { + // andi $1, $2, 0x4 + r1 = r2 & 0X4; + goto L_1344; + } + // andi $1, $2, 0x4 + r1 = r2 & 0X4; + // sh $26, 0x1C($24) + RSP_MEM_H_STORE(0X1C, r24, r26); + // j L_1118 + // sh $25, 0x1E($24) + RSP_MEM_H_STORE(0X1E, r24, r25); + goto L_1118; + // sh $25, 0x1E($24) + RSP_MEM_H_STORE(0X1E, r24, r25); +L_1344: + // beq $1, $zero, L_1364 + if (r1 == 0) { + // andi $1, $2, 0x2 + r1 = r2 & 0X2; + goto L_1364; + } + // andi $1, $2, 0x2 + r1 = r2 & 0X2; + // beq $1, $zero, L_135C + if (r1 == 0) { + // nop + + goto L_135C; + } + // nop + + // j L_1118 + // sh $26, 0x6($24) + RSP_MEM_H_STORE(0X6, r24, r26); + goto L_1118; + // sh $26, 0x6($24) + RSP_MEM_H_STORE(0X6, r24, r26); +L_135C: + // j L_1118 + // sh $26, 0x8($24) + RSP_MEM_H_STORE(0X8, r24, r26); + goto L_1118; + // sh $26, 0x8($24) + RSP_MEM_H_STORE(0X8, r24, r26); +L_1364: + // beq $1, $zero, L_137C + if (r1 == 0) { + // srl $1, $25, 16 + r1 = S32(U32(r25) >> 16); + goto L_137C; + } + // srl $1, $25, 16 + r1 = S32(U32(r25) >> 16); + // sh $26, 0x10($24) + RSP_MEM_H_STORE(0X10, r24, r26); + // sh $1, 0x12($24) + RSP_MEM_H_STORE(0X12, r24, r1); + // j L_1118 + // sh $25, 0x14($24) + RSP_MEM_H_STORE(0X14, r24, r25); + goto L_1118; + // sh $25, 0x14($24) + RSP_MEM_H_STORE(0X14, r24, r25); +L_137C: + // sh $26, 0x16($24) + RSP_MEM_H_STORE(0X16, r24, r26); + // sh $1, 0x18($24) + RSP_MEM_H_STORE(0X18, r24, r1); + // j L_1118 + // sh $25, 0x1A($24) + RSP_MEM_H_STORE(0X1A, r24, r25); + goto L_1118; + // sh $25, 0x1A($24) + RSP_MEM_H_STORE(0X1A, r24, r25); +L_138C: + // lhu $1, 0x4($24) + r1 = RSP_MEM_HU_LOAD(0X4, r24); + // lhu $4, 0x2($24) + r4 = RSP_MEM_HU_LOAD(0X2, r24); + // beq $1, $zero, L_1118 + if (r1 == 0) { + // andi $3, $25, 0xFFFF + r3 = r25 & 0XFFFF; + goto L_1118; + } + // andi $3, $25, 0xFFFF + r3 = r25 & 0XFFFF; + // addi $3, $3, 0x5C0 + r3 = RSP_ADD32(r3, 0X5C0); + // srl $2, $25, 16 + r2 = S32(U32(r25) >> 16); + // addi $2, $2, 0x5C0 + r2 = RSP_ADD32(r2, 0X5C0); +L_13A8: + // lqv $v1[0], 0x0($2) + rsp.LQV<0>(rsp.vpu.r[1], r2, 0X0); + // lqv $v2[0], 0x0($3) + rsp.LQV<0>(rsp.vpu.r[2], r3, 0X0); + // ssv $v1[0], 0x0($4) + rsp.SSV<0>(rsp.vpu.r[1], r4, 0X0); + // ssv $v2[0], 0x2($4) + rsp.SSV<0>(rsp.vpu.r[2], r4, 0X1); + // ssv $v1[2], 0x4($4) + rsp.SSV<2>(rsp.vpu.r[1], r4, 0X2); + // ssv $v2[2], 0x6($4) + rsp.SSV<2>(rsp.vpu.r[2], r4, 0X3); + // ssv $v1[4], 0x8($4) + rsp.SSV<4>(rsp.vpu.r[1], r4, 0X4); + // ssv $v2[4], 0xA($4) + rsp.SSV<4>(rsp.vpu.r[2], r4, 0X5); + // ssv $v1[6], 0xC($4) + rsp.SSV<6>(rsp.vpu.r[1], r4, 0X6); + // ssv $v2[6], 0xE($4) + rsp.SSV<6>(rsp.vpu.r[2], r4, 0X7); + // ssv $v1[8], 0x10($4) + rsp.SSV<8>(rsp.vpu.r[1], r4, 0X8); + // ssv $v2[8], 0x12($4) + rsp.SSV<8>(rsp.vpu.r[2], r4, 0X9); + // ssv $v1[10], 0x14($4) + rsp.SSV<10>(rsp.vpu.r[1], r4, 0XA); + // ssv $v2[10], 0x16($4) + rsp.SSV<10>(rsp.vpu.r[2], r4, 0XB); + // ssv $v1[12], 0x18($4) + rsp.SSV<12>(rsp.vpu.r[1], r4, 0XC); + // ssv $v2[12], 0x1A($4) + rsp.SSV<12>(rsp.vpu.r[2], r4, 0XD); + // ssv $v1[14], 0x1C($4) + rsp.SSV<14>(rsp.vpu.r[1], r4, 0XE); + // ssv $v2[14], 0x1E($4) + rsp.SSV<14>(rsp.vpu.r[2], r4, 0XF); + // addi $1, $1, -0x10 + r1 = RSP_ADD32(r1, -0X10); + // addi $2, $2, 0x10 + r2 = RSP_ADD32(r2, 0X10); + // addi $3, $3, 0x10 + r3 = RSP_ADD32(r3, 0X10); + // bgtz $1, L_13A8 + if (RSP_SIGNED(r1) > 0) { + // addi $4, $4, 0x20 + r4 = RSP_ADD32(r4, 0X20); + goto L_13A8; + } + // addi $4, $4, 0x20 + r4 = RSP_ADD32(r4, 0X20); + // j L_1118 + // nop + + goto L_1118; + // nop + +L_140C: + // andi $1, $25, 0xFFFF + r1 = r25 & 0XFFFF; + // beq $1, $zero, L_1118 + if (r1 == 0) { + // andi $2, $26, 0xFFFF + r2 = r26 & 0XFFFF; + goto L_1118; + } + // andi $2, $26, 0xFFFF + r2 = r26 & 0XFFFF; + // addi $2, $2, 0x5C0 + r2 = RSP_ADD32(r2, 0X5C0); + // srl $3, $25, 16 + r3 = S32(U32(r25) >> 16); + // addi $3, $3, 0x5C0 + r3 = RSP_ADD32(r3, 0X5C0); +L_1424: + // ldv $v1[0], 0x0($2) + rsp.LDV<0>(rsp.vpu.r[1], r2, 0X0); + // ldv $v2[0], 0x8($2) + rsp.LDV<0>(rsp.vpu.r[2], r2, 0X1); + // addi $1, $1, -0x10 + r1 = RSP_ADD32(r1, -0X10); + // addi $2, $2, 0x10 + r2 = RSP_ADD32(r2, 0X10); + // sdv $v1[0], 0x0($3) + rsp.SDV<0>(rsp.vpu.r[1], r3, 0X0); + // sdv $v2[0], 0x8($3) + rsp.SDV<0>(rsp.vpu.r[2], r3, 0X1); + // bgtz $1, L_1424 + if (RSP_SIGNED(r1) > 0) { + // addi $3, $3, 0x10 + r3 = RSP_ADD32(r3, 0X10); + goto L_1424; + } + // addi $3, $3, 0x10 + r3 = RSP_ADD32(r3, 0X10); + // j L_1118 + // nop + + goto L_1118; + // nop + +L_144C: + // sll $1, $25, 8 + r1 = S32(r25) << 8; + // srl $1, $1, 8 + r1 = S32(U32(r1) >> 8); + // srl $3, $25, 24 + r3 = S32(U32(r25) >> 24); + // sll $3, $3, 2 + r3 = S32(r3) << 2; + // lw $2, 0x320($3) + r2 = RSP_MEM_W_LOAD(0X320, r3); + // add $1, $1, $2 + r1 = RSP_ADD32(r1, r2); + // sw $1, 0x10($24) + RSP_MEM_W_STORE(0X10, r24, r1); + // j L_1118 + // nop + + goto L_1118; + // nop + +L_1470: + // lqv $v31[0], 0x0($zero) + rsp.LQV<0>(rsp.vpu.r[31], 0, 0X0); + // vxor $v27, $v27, $v27 + rsp.VXOR<0>(rsp.vpu.r[27], rsp.vpu.r[27], rsp.vpu.r[27]); + // lhu $21, 0x0($24) + r21 = RSP_MEM_HU_LOAD(0X0, r24); + // vxor $v25, $v25, $v25 + rsp.VXOR<0>(rsp.vpu.r[25], rsp.vpu.r[25], rsp.vpu.r[25]); + // vxor $v24, $v24, $v24 + rsp.VXOR<0>(rsp.vpu.r[24], rsp.vpu.r[24], rsp.vpu.r[24]); + // addi $20, $21, 0x1 + r20 = RSP_ADD32(r21, 0X1); + // lhu $19, 0x2($24) + r19 = RSP_MEM_HU_LOAD(0X2, r24); + // vxor $v13, $v13, $v13 + rsp.VXOR<0>(rsp.vpu.r[13], rsp.vpu.r[13], rsp.vpu.r[13]); + // vxor $v14, $v14, $v14 + rsp.VXOR<0>(rsp.vpu.r[14], rsp.vpu.r[14], rsp.vpu.r[14]); + // lhu $18, 0x4($24) + r18 = RSP_MEM_HU_LOAD(0X4, r24); + // vxor $v15, $v15, $v15 + rsp.VXOR<0>(rsp.vpu.r[15], rsp.vpu.r[15], rsp.vpu.r[15]); + // lui $1, 0xFF + r1 = S32(0XFF << 16); + // vxor $v16, $v16, $v16 + rsp.VXOR<0>(rsp.vpu.r[16], rsp.vpu.r[16], rsp.vpu.r[16]); + // ori $1, $1, 0xFFFF + r1 = r1 | 0XFFFF; + // vxor $v17, $v17, $v17 + rsp.VXOR<0>(rsp.vpu.r[17], rsp.vpu.r[17], rsp.vpu.r[17]); + // and $17, $25, $1 + r17 = r25 & r1; + // vxor $v18, $v18, $v18 + rsp.VXOR<0>(rsp.vpu.r[18], rsp.vpu.r[18], rsp.vpu.r[18]); + // srl $2, $25, 24 + r2 = S32(U32(r25) >> 24); + // vxor $v19, $v19, $v19 + rsp.VXOR<0>(rsp.vpu.r[19], rsp.vpu.r[19], rsp.vpu.r[19]); + // sll $2, $2, 2 + r2 = S32(r2) << 2; + // lw $3, 0x320($2) + r3 = RSP_MEM_W_LOAD(0X320, r2); + // add $17, $17, $3 + r17 = RSP_ADD32(r17, r3); + // sqv $v27[0], 0x0($19) + rsp.SQV<0>(rsp.vpu.r[27], r19, 0X0); + // sqv $v27[0], 0x10($19) + rsp.SQV<0>(rsp.vpu.r[27], r19, 0X1); + // srl $1, $26, 16 + r1 = S32(U32(r26) >> 16); + // andi $1, $1, 0x1 + r1 = r1 & 0X1; + // bgtz $1, L_150C + if (RSP_SIGNED(r1) > 0) { + // srl $1, $26, 16 + r1 = S32(U32(r26) >> 16); + goto L_150C; + } + // srl $1, $26, 16 + r1 = S32(U32(r26) >> 16); + // andi $1, $1, 0x2 + r1 = r1 & 0X2; + // beq $zero, $1, L_14F0 + if (0 == r1) { + // addi $2, $17, 0x0 + r2 = RSP_ADD32(r17, 0X0); + goto L_14F0; + } + // addi $2, $17, 0x0 + r2 = RSP_ADD32(r17, 0X0); + // lw $2, 0x10($24) + r2 = RSP_MEM_W_LOAD(0X10, r24); +L_14F0: + // addi $1, $19, 0x0 + r1 = RSP_ADD32(r19, 0X0); + // jal 0x1184 + r31 = 0x14FC; + // addi $3, $zero, 0x1F + r3 = RSP_ADD32(0, 0X1F); + goto L_1184; + // addi $3, $zero, 0x1F + r3 = RSP_ADD32(0, 0X1F); +L_14FC: + // mfc0 $5, SP_DMA_BUSY + r5 = 0; + // bne $5, $zero, L_14FC + if (r5 != 0) { + // nop + + goto L_14FC; + } + // nop + + // mtc0 $zero, SP_SEMAPHORE +L_150C: + // addi $16, $zero, 0x30 + r16 = RSP_ADD32(0, 0X30); + // addi $15, $zero, 0x4C0 + r15 = RSP_ADD32(0, 0X4C0); + // ldv $v25[0], 0x0($16) + rsp.LDV<0>(rsp.vpu.r[25], r16, 0X0); + // ldv $v24[8], 0x0($16) + rsp.LDV<8>(rsp.vpu.r[24], r16, 0X0); + // ldv $v23[0], 0x8($16) + rsp.LDV<0>(rsp.vpu.r[23], r16, 0X1); + // ldv $v23[8], 0x8($16) + rsp.LDV<8>(rsp.vpu.r[23], r16, 0X1); + // lqv $v27[0], 0x10($19) + rsp.LQV<0>(rsp.vpu.r[27], r19, 0X1); + // addi $19, $19, 0x20 + r19 = RSP_ADD32(r19, 0X20); + // beq $18, $zero, L_16E8 + if (r18 == 0) { + // ldv $v1[0], 0x0($20) + rsp.LDV<0>(rsp.vpu.r[1], r20, 0X0); + goto L_16E8; + } + // ldv $v1[0], 0x0($20) + rsp.LDV<0>(rsp.vpu.r[1], r20, 0X0); + // lbu $1, 0x0($21) + r1 = RSP_MEM_BU(0X0, r21); + // andi $11, $1, 0xF + r11 = r1 & 0XF; + // sll $11, $11, 5 + r11 = S32(r11) << 5; + // vand $v3, $v25, $v1[0] + rsp.VAND<8>(rsp.vpu.r[3], rsp.vpu.r[25], rsp.vpu.r[1]); + // add $13, $11, $15 + r13 = RSP_ADD32(r11, r15); + // vand $v4, $v24, $v1[1] + rsp.VAND<9>(rsp.vpu.r[4], rsp.vpu.r[24], rsp.vpu.r[1]); + // srl $14, $1, 4 + r14 = S32(U32(r1) >> 4); + // vand $v5, $v25, $v1[2] + rsp.VAND<10>(rsp.vpu.r[5], rsp.vpu.r[25], rsp.vpu.r[1]); + // addi $2, $zero, 0xC + r2 = RSP_ADD32(0, 0XC); + // vand $v6, $v24, $v1[3] + rsp.VAND<11>(rsp.vpu.r[6], rsp.vpu.r[24], rsp.vpu.r[1]); + // sub $14, $2, $14 + r14 = RSP_SUB32(r2, r14); + // addi $2, $14, -0x1 + r2 = RSP_ADD32(r14, -0X1); + // addi $3, $zero, 0x1 + r3 = RSP_ADD32(0, 0X1); + // sll $3, $3, 15 + r3 = S32(r3) << 15; + // srlv $4, $3, $2 + r4 = S32(U32(r3) >> (r2 & 31)); + // mtc2 $4, $v22[0] + rsp.MTC2<0>(r4, rsp.vpu.r[22]); + // lqv $v21[0], 0x0($13) + rsp.LQV<0>(rsp.vpu.r[21], r13, 0X0); + // lqv $v20[0], 0x10($13) + rsp.LQV<0>(rsp.vpu.r[20], r13, 0X1); + // addi $13, $13, -0x2 + r13 = RSP_ADD32(r13, -0X2); + // lrv $v19[0], 0x20($13) + rsp.LRV<0>(rsp.vpu.r[19], r13, 0X2); + // addi $13, $13, -0x2 + r13 = RSP_ADD32(r13, -0X2); + // lrv $v18[0], 0x20($13) + rsp.LRV<0>(rsp.vpu.r[18], r13, 0X2); + // addi $13, $13, -0x2 + r13 = RSP_ADD32(r13, -0X2); + // lrv $v17[0], 0x20($13) + rsp.LRV<0>(rsp.vpu.r[17], r13, 0X2); + // addi $13, $13, -0x2 + r13 = RSP_ADD32(r13, -0X2); + // lrv $v16[0], 0x20($13) + rsp.LRV<0>(rsp.vpu.r[16], r13, 0X2); + // addi $13, $13, -0x2 + r13 = RSP_ADD32(r13, -0X2); + // lrv $v15[0], 0x20($13) + rsp.LRV<0>(rsp.vpu.r[15], r13, 0X2); + // addi $13, $13, -0x2 + r13 = RSP_ADD32(r13, -0X2); + // lrv $v14[0], 0x20($13) + rsp.LRV<0>(rsp.vpu.r[14], r13, 0X2); + // addi $13, $13, -0x2 + r13 = RSP_ADD32(r13, -0X2); + // lrv $v13[0], 0x20($13) + rsp.LRV<0>(rsp.vpu.r[13], r13, 0X2); +L_15B4: + // addi $20, $20, 0x9 + r20 = RSP_ADD32(r20, 0X9); + // vmudn $v30, $v3, $v23 + rsp.VMUDN<0>(rsp.vpu.r[30], rsp.vpu.r[3], rsp.vpu.r[23]); + // addi $21, $21, 0x9 + r21 = RSP_ADD32(r21, 0X9); + // vmadn $v30, $v4, $v23 + rsp.VMADN<0>(rsp.vpu.r[30], rsp.vpu.r[4], rsp.vpu.r[23]); + // ldv $v1[0], 0x0($20) + rsp.LDV<0>(rsp.vpu.r[1], r20, 0X0); + // vmudn $v29, $v5, $v23 + rsp.VMUDN<0>(rsp.vpu.r[29], rsp.vpu.r[5], rsp.vpu.r[23]); + // lbu $1, 0x0($21) + r1 = RSP_MEM_BU(0X0, r21); + // vmadn $v29, $v6, $v23 + rsp.VMADN<0>(rsp.vpu.r[29], rsp.vpu.r[6], rsp.vpu.r[23]); + // blez $14, L_15E4 + if (RSP_SIGNED(r14) <= 0) { + // andi $11, $1, 0xF + r11 = r1 & 0XF; + goto L_15E4; + } + // andi $11, $1, 0xF + r11 = r1 & 0XF; + // vmudm $v30, $v30, $v22[0] + rsp.VMUDM<8>(rsp.vpu.r[30], rsp.vpu.r[30], rsp.vpu.r[22]); + // vmudm $v29, $v29, $v22[0] + rsp.VMUDM<8>(rsp.vpu.r[29], rsp.vpu.r[29], rsp.vpu.r[22]); +L_15E4: + // sll $11, $11, 5 + r11 = S32(r11) << 5; + // vand $v3, $v25, $v1[0] + rsp.VAND<8>(rsp.vpu.r[3], rsp.vpu.r[25], rsp.vpu.r[1]); + // add $13, $11, $15 + r13 = RSP_ADD32(r11, r15); + // vand $v4, $v24, $v1[1] + rsp.VAND<9>(rsp.vpu.r[4], rsp.vpu.r[24], rsp.vpu.r[1]); + // vand $v5, $v25, $v1[2] + rsp.VAND<10>(rsp.vpu.r[5], rsp.vpu.r[25], rsp.vpu.r[1]); + // vand $v6, $v24, $v1[3] + rsp.VAND<11>(rsp.vpu.r[6], rsp.vpu.r[24], rsp.vpu.r[1]); + // srl $14, $1, 4 + r14 = S32(U32(r1) >> 4); + // vmudh $v2, $v21, $v27[6] + rsp.VMUDH<14>(rsp.vpu.r[2], rsp.vpu.r[21], rsp.vpu.r[27]); + // addi $2, $zero, 0xC + r2 = RSP_ADD32(0, 0XC); + // vmadh $v2, $v20, $v27[7] + rsp.VMADH<15>(rsp.vpu.r[2], rsp.vpu.r[20], rsp.vpu.r[27]); + // sub $14, $2, $14 + r14 = RSP_SUB32(r2, r14); + // vmadh $v2, $v19, $v30[0] + rsp.VMADH<8>(rsp.vpu.r[2], rsp.vpu.r[19], rsp.vpu.r[30]); + // addi $2, $14, -0x1 + r2 = RSP_ADD32(r14, -0X1); + // vmadh $v2, $v18, $v30[1] + rsp.VMADH<9>(rsp.vpu.r[2], rsp.vpu.r[18], rsp.vpu.r[30]); + // addi $3, $zero, 0x1 + r3 = RSP_ADD32(0, 0X1); + // vmadh $v2, $v17, $v30[2] + rsp.VMADH<10>(rsp.vpu.r[2], rsp.vpu.r[17], rsp.vpu.r[30]); + // sll $3, $3, 15 + r3 = S32(r3) << 15; + // vmadh $v2, $v16, $v30[3] + rsp.VMADH<11>(rsp.vpu.r[2], rsp.vpu.r[16], rsp.vpu.r[30]); + // srlv $4, $3, $2 + r4 = S32(U32(r3) >> (r2 & 31)); + // vmadh $v28, $v15, $v30[4] + rsp.VMADH<12>(rsp.vpu.r[28], rsp.vpu.r[15], rsp.vpu.r[30]); + // mtc2 $4, $v22[0] + rsp.MTC2<0>(r4, rsp.vpu.r[22]); + // vmadh $v2, $v14, $v30[5] + rsp.VMADH<13>(rsp.vpu.r[2], rsp.vpu.r[14], rsp.vpu.r[30]); + // vmadh $v2, $v13, $v30[6] + rsp.VMADH<14>(rsp.vpu.r[2], rsp.vpu.r[13], rsp.vpu.r[30]); + // vmadh $v2, $v30, $v31[5] + rsp.VMADH<13>(rsp.vpu.r[2], rsp.vpu.r[30], rsp.vpu.r[31]); + // vsar $v26, $v7, $v28[1] + rsp.VSAR<9>(rsp.vpu.r[26], rsp.vpu.r[7]); + // vsar $v28, $v7, $v28[0] + rsp.VSAR<8>(rsp.vpu.r[28], rsp.vpu.r[7]); + // vmudn $v2, $v26, $v31[4] + rsp.VMUDN<12>(rsp.vpu.r[2], rsp.vpu.r[26], rsp.vpu.r[31]); + // vmadh $v28, $v28, $v31[4] + rsp.VMADH<12>(rsp.vpu.r[28], rsp.vpu.r[28], rsp.vpu.r[31]); + // vmudh $v2, $v19, $v29[0] + rsp.VMUDH<8>(rsp.vpu.r[2], rsp.vpu.r[19], rsp.vpu.r[29]); + // addi $12, $13, -0x2 + r12 = RSP_ADD32(r13, -0X2); + // vmadh $v2, $v18, $v29[1] + rsp.VMADH<9>(rsp.vpu.r[2], rsp.vpu.r[18], rsp.vpu.r[29]); + // lrv $v19[0], 0x20($12) + rsp.LRV<0>(rsp.vpu.r[19], r12, 0X2); + // vmadh $v2, $v17, $v29[2] + rsp.VMADH<10>(rsp.vpu.r[2], rsp.vpu.r[17], rsp.vpu.r[29]); + // addi $12, $12, -0x2 + r12 = RSP_ADD32(r12, -0X2); + // vmadh $v2, $v16, $v29[3] + rsp.VMADH<11>(rsp.vpu.r[2], rsp.vpu.r[16], rsp.vpu.r[29]); + // lrv $v18[0], 0x20($12) + rsp.LRV<0>(rsp.vpu.r[18], r12, 0X2); + // vmadh $v2, $v15, $v29[4] + rsp.VMADH<12>(rsp.vpu.r[2], rsp.vpu.r[15], rsp.vpu.r[29]); + // addi $12, $12, -0x2 + r12 = RSP_ADD32(r12, -0X2); + // vmadh $v2, $v14, $v29[5] + rsp.VMADH<13>(rsp.vpu.r[2], rsp.vpu.r[14], rsp.vpu.r[29]); + // lrv $v17[0], 0x20($12) + rsp.LRV<0>(rsp.vpu.r[17], r12, 0X2); + // vmadh $v2, $v13, $v29[6] + rsp.VMADH<14>(rsp.vpu.r[2], rsp.vpu.r[13], rsp.vpu.r[29]); + // addi $12, $12, -0x2 + r12 = RSP_ADD32(r12, -0X2); + // vmadh $v2, $v29, $v31[5] + rsp.VMADH<13>(rsp.vpu.r[2], rsp.vpu.r[29], rsp.vpu.r[31]); + // lrv $v16[0], 0x20($12) + rsp.LRV<0>(rsp.vpu.r[16], r12, 0X2); + // vmadh $v2, $v21, $v28[6] + rsp.VMADH<14>(rsp.vpu.r[2], rsp.vpu.r[21], rsp.vpu.r[28]); + // addi $12, $12, -0x2 + r12 = RSP_ADD32(r12, -0X2); + // vmadh $v2, $v20, $v28[7] + rsp.VMADH<15>(rsp.vpu.r[2], rsp.vpu.r[20], rsp.vpu.r[28]); + // lrv $v15[0], 0x20($12) + rsp.LRV<0>(rsp.vpu.r[15], r12, 0X2); + // vsar $v26, $v7, $v27[1] + rsp.VSAR<9>(rsp.vpu.r[26], rsp.vpu.r[7]); + // addi $12, $12, -0x2 + r12 = RSP_ADD32(r12, -0X2); + // vsar $v27, $v7, $v27[0] + rsp.VSAR<8>(rsp.vpu.r[27], rsp.vpu.r[7]); + // lrv $v14[0], 0x20($12) + rsp.LRV<0>(rsp.vpu.r[14], r12, 0X2); + // addi $12, $12, -0x2 + r12 = RSP_ADD32(r12, -0X2); + // lrv $v13[0], 0x20($12) + rsp.LRV<0>(rsp.vpu.r[13], r12, 0X2); + // lqv $v21[0], 0x0($13) + rsp.LQV<0>(rsp.vpu.r[21], r13, 0X0); + // vmudn $v2, $v26, $v31[4] + rsp.VMUDN<12>(rsp.vpu.r[2], rsp.vpu.r[26], rsp.vpu.r[31]); + // lqv $v20[0], 0x10($13) + rsp.LQV<0>(rsp.vpu.r[20], r13, 0X1); + // vmadh $v27, $v27, $v31[4] + rsp.VMADH<12>(rsp.vpu.r[27], rsp.vpu.r[27], rsp.vpu.r[31]); + // addi $18, $18, -0x20 + r18 = RSP_ADD32(r18, -0X20); + // sdv $v28[0], 0x0($19) + rsp.SDV<0>(rsp.vpu.r[28], r19, 0X0); + // sdv $v28[8], 0x8($19) + rsp.SDV<8>(rsp.vpu.r[28], r19, 0X1); + // sdv $v27[0], 0x10($19) + rsp.SDV<0>(rsp.vpu.r[27], r19, 0X2); + // sdv $v27[8], 0x18($19) + rsp.SDV<8>(rsp.vpu.r[27], r19, 0X3); + // bgtz $18, L_15B4 + if (RSP_SIGNED(r18) > 0) { + // addi $19, $19, 0x20 + r19 = RSP_ADD32(r19, 0X20); + goto L_15B4; + } + // addi $19, $19, 0x20 + r19 = RSP_ADD32(r19, 0X20); +L_16E8: + // addi $1, $19, -0x20 + r1 = RSP_ADD32(r19, -0X20); + // addi $2, $17, 0x0 + r2 = RSP_ADD32(r17, 0X0); + // jal 0x11B0 + r31 = 0x16F8; + // addi $3, $zero, 0x1F + r3 = RSP_ADD32(0, 0X1F); + goto L_11B0; + // addi $3, $zero, 0x1F + r3 = RSP_ADD32(0, 0X1F); +L_16F8: + // mfc0 $5, SP_DMA_BUSY + r5 = 0; + // bne $5, $zero, L_16F8 + if (r5 != 0) { + // nop + + goto L_16F8; + } + // nop + + // j L_1118 + // mtc0 $zero, SP_SEMAPHORE + goto L_1118; + // mtc0 $zero, SP_SEMAPHORE +L_170C: + // lqv $v31[0], 0x0($zero) + rsp.LQV<0>(rsp.vpu.r[31], 0, 0X0); + // vxor $v28, $v28, $v28 + rsp.VXOR<0>(rsp.vpu.r[28], rsp.vpu.r[28], rsp.vpu.r[28]); + // lhu $21, 0x0($24) + r21 = RSP_MEM_HU_LOAD(0X0, r24); + // vxor $v17, $v17, $v17 + rsp.VXOR<0>(rsp.vpu.r[17], rsp.vpu.r[17], rsp.vpu.r[17]); + // lhu $20, 0x2($24) + r20 = RSP_MEM_HU_LOAD(0X2, r24); + // vxor $v18, $v18, $v18 + rsp.VXOR<0>(rsp.vpu.r[18], rsp.vpu.r[18], rsp.vpu.r[18]); + // lhu $19, 0x4($24) + r19 = RSP_MEM_HU_LOAD(0X4, r24); + // vxor $v19, $v19, $v19 + rsp.VXOR<0>(rsp.vpu.r[19], rsp.vpu.r[19], rsp.vpu.r[19]); + // beq $19, $zero, L_1874 + if (r19 == 0) { + // andi $14, $26, 0xFFFF + r14 = r26 & 0XFFFF; + goto L_1874; + } + // andi $14, $26, 0xFFFF + r14 = r26 & 0XFFFF; + // mtc2 $14, $v31[10] + rsp.MTC2<10>(r14, rsp.vpu.r[31]); + // sll $14, $14, 2 + r14 = S32(r14) << 2; + // mtc2 $14, $v16[0] + rsp.MTC2<0>(r14, rsp.vpu.r[16]); + // lui $1, 0xFF + r1 = S32(0XFF << 16); + // vxor $v20, $v20, $v20 + rsp.VXOR<0>(rsp.vpu.r[20], rsp.vpu.r[20], rsp.vpu.r[20]); + // ori $1, $1, 0xFFFF + r1 = r1 | 0XFFFF; + // vxor $v21, $v21, $v21 + rsp.VXOR<0>(rsp.vpu.r[21], rsp.vpu.r[21], rsp.vpu.r[21]); + // and $18, $25, $1 + r18 = r25 & r1; + // vxor $v22, $v22, $v22 + rsp.VXOR<0>(rsp.vpu.r[22], rsp.vpu.r[22], rsp.vpu.r[22]); + // srl $2, $25, 24 + r2 = S32(U32(r25) >> 24); + // vxor $v23, $v23, $v23 + rsp.VXOR<0>(rsp.vpu.r[23], rsp.vpu.r[23], rsp.vpu.r[23]); + // sll $2, $2, 2 + r2 = S32(r2) << 2; + // lw $3, 0x320($2) + r3 = RSP_MEM_W_LOAD(0X320, r2); + // add $18, $18, $3 + r18 = RSP_ADD32(r18, r3); + // slv $v28[0], 0x0($23) + rsp.SLV<0>(rsp.vpu.r[28], r23, 0X0); + // srl $1, $26, 16 + r1 = S32(U32(r26) >> 16); + // andi $1, $1, 0x1 + r1 = r1 & 0X1; + // bgtz $1, L_17A0 + if (RSP_SIGNED(r1) > 0) { + // nop + + goto L_17A0; + } + // nop + + // addi $1, $23, 0x0 + r1 = RSP_ADD32(r23, 0X0); + // addi $2, $18, 0x0 + r2 = RSP_ADD32(r18, 0X0); + // jal 0x1184 + r31 = 0x1790; + // addi $3, $zero, 0x7 + r3 = RSP_ADD32(0, 0X7); + goto L_1184; + // addi $3, $zero, 0x7 + r3 = RSP_ADD32(0, 0X7); +L_1790: + // mfc0 $5, SP_DMA_BUSY + r5 = 0; + // bne $5, $zero, L_1790 + if (r5 != 0) { + // nop + + goto L_1790; + } + // nop + + // mtc0 $zero, SP_SEMAPHORE +L_17A0: + // addi $13, $zero, 0x4C0 + r13 = RSP_ADD32(0, 0X4C0); + // addi $1, $zero, 0x4 + r1 = RSP_ADD32(0, 0X4); + // mtc2 $1, $v14[0] + rsp.MTC2<0>(r1, rsp.vpu.r[14]); + // lqv $v24[0], 0x10($13) + rsp.LQV<0>(rsp.vpu.r[24], r13, 0X1); + // vmudm $v16, $v24, $v16[0] + rsp.VMUDM<8>(rsp.vpu.r[16], rsp.vpu.r[24], rsp.vpu.r[16]); + // ldv $v28[8], 0x0($23) + rsp.LDV<8>(rsp.vpu.r[28], r23, 0X0); + // sqv $v16[0], 0x10($13) + rsp.SQV<0>(rsp.vpu.r[16], r13, 0X1); + // lqv $v25[0], 0x0($13) + rsp.LQV<0>(rsp.vpu.r[25], r13, 0X0); + // addi $13, $13, -0x2 + r13 = RSP_ADD32(r13, -0X2); + // lrv $v23[0], 0x20($13) + rsp.LRV<0>(rsp.vpu.r[23], r13, 0X2); + // addi $13, $13, -0x2 + r13 = RSP_ADD32(r13, -0X2); + // lrv $v22[0], 0x20($13) + rsp.LRV<0>(rsp.vpu.r[22], r13, 0X2); + // addi $13, $13, -0x2 + r13 = RSP_ADD32(r13, -0X2); + // lrv $v21[0], 0x20($13) + rsp.LRV<0>(rsp.vpu.r[21], r13, 0X2); + // addi $13, $13, -0x2 + r13 = RSP_ADD32(r13, -0X2); + // lrv $v20[0], 0x20($13) + rsp.LRV<0>(rsp.vpu.r[20], r13, 0X2); + // addi $13, $13, -0x2 + r13 = RSP_ADD32(r13, -0X2); + // lrv $v19[0], 0x20($13) + rsp.LRV<0>(rsp.vpu.r[19], r13, 0X2); + // addi $13, $13, -0x2 + r13 = RSP_ADD32(r13, -0X2); + // lrv $v18[0], 0x20($13) + rsp.LRV<0>(rsp.vpu.r[18], r13, 0X2); + // addi $13, $13, -0x2 + r13 = RSP_ADD32(r13, -0X2); + // lrv $v17[0], 0x20($13) + rsp.LRV<0>(rsp.vpu.r[17], r13, 0X2); + // ldv $v30[0], 0x0($21) + rsp.LDV<0>(rsp.vpu.r[30], r21, 0X0); + // ldv $v30[8], 0x8($21) + rsp.LDV<8>(rsp.vpu.r[30], r21, 0X1); +L_1800: + // vmudh $v16, $v25, $v28[6] + rsp.VMUDH<14>(rsp.vpu.r[16], rsp.vpu.r[25], rsp.vpu.r[28]); + // addi $21, $21, 0x10 + r21 = RSP_ADD32(r21, 0X10); + // vmadh $v16, $v24, $v28[7] + rsp.VMADH<15>(rsp.vpu.r[16], rsp.vpu.r[24], rsp.vpu.r[28]); + // addi $19, $19, -0x10 + r19 = RSP_ADD32(r19, -0X10); + // vmadh $v16, $v23, $v30[0] + rsp.VMADH<8>(rsp.vpu.r[16], rsp.vpu.r[23], rsp.vpu.r[30]); + // vmadh $v16, $v22, $v30[1] + rsp.VMADH<9>(rsp.vpu.r[16], rsp.vpu.r[22], rsp.vpu.r[30]); + // vmadh $v16, $v21, $v30[2] + rsp.VMADH<10>(rsp.vpu.r[16], rsp.vpu.r[21], rsp.vpu.r[30]); + // vmadh $v16, $v20, $v30[3] + rsp.VMADH<11>(rsp.vpu.r[16], rsp.vpu.r[20], rsp.vpu.r[30]); + // vmadh $v28, $v19, $v30[4] + rsp.VMADH<12>(rsp.vpu.r[28], rsp.vpu.r[19], rsp.vpu.r[30]); + // vmadh $v16, $v18, $v30[5] + rsp.VMADH<13>(rsp.vpu.r[16], rsp.vpu.r[18], rsp.vpu.r[30]); + // vmadh $v16, $v17, $v30[6] + rsp.VMADH<14>(rsp.vpu.r[16], rsp.vpu.r[17], rsp.vpu.r[30]); + // vmadh $v16, $v30, $v31[5] + rsp.VMADH<13>(rsp.vpu.r[16], rsp.vpu.r[30], rsp.vpu.r[31]); + // ldv $v30[0], 0x0($21) + rsp.LDV<0>(rsp.vpu.r[30], r21, 0X0); + // vsar $v26, $v15, $v28[1] + rsp.VSAR<9>(rsp.vpu.r[26], rsp.vpu.r[15]); + // ldv $v30[8], 0x8($21) + rsp.LDV<8>(rsp.vpu.r[30], r21, 0X1); + // vsar $v28, $v15, $v28[0] + rsp.VSAR<8>(rsp.vpu.r[28], rsp.vpu.r[15]); + // vmudn $v16, $v26, $v14[0] + rsp.VMUDN<8>(rsp.vpu.r[16], rsp.vpu.r[26], rsp.vpu.r[14]); + // vmadh $v28, $v28, $v14[0] + rsp.VMADH<8>(rsp.vpu.r[28], rsp.vpu.r[28], rsp.vpu.r[14]); + // sdv $v28[0], 0x0($20) + rsp.SDV<0>(rsp.vpu.r[28], r20, 0X0); + // sdv $v28[8], 0x8($20) + rsp.SDV<8>(rsp.vpu.r[28], r20, 0X1); + // bgtz $19, L_1800 + if (RSP_SIGNED(r19) > 0) { + // addi $20, $20, 0x10 + r20 = RSP_ADD32(r20, 0X10); + goto L_1800; + } + // addi $20, $20, 0x10 + r20 = RSP_ADD32(r20, 0X10); + // addi $1, $20, -0x8 + r1 = RSP_ADD32(r20, -0X8); + // addi $2, $18, 0x0 + r2 = RSP_ADD32(r18, 0X0); + // jal 0x11B0 + r31 = 0x1868; + // addi $3, $zero, 0x7 + r3 = RSP_ADD32(0, 0X7); + goto L_11B0; + // addi $3, $zero, 0x7 + r3 = RSP_ADD32(0, 0X7); +L_1868: + // mfc0 $5, SP_DMA_BUSY + r5 = 0; + // bne $5, $zero, L_1868 + if (r5 != 0) { + // nop + + goto L_1868; + } + // nop + +L_1874: + // j L_1118 + // mtc0 $zero, SP_SEMAPHORE + goto L_1118; + // mtc0 $zero, SP_SEMAPHORE +L_187C: + // lh $8, 0x0($24) + r8 = RSP_MEM_H_LOAD(0X0, r24); + // lh $19, 0x2($24) + r19 = RSP_MEM_H_LOAD(0X2, r24); + // lh $18, 0x4($24) + r18 = RSP_MEM_H_LOAD(0X4, r24); + // lui $4, 0xFF + r4 = S32(0XFF << 16); + // ori $4, $4, 0xFFFF + r4 = r4 | 0XFFFF; + // and $2, $25, $4 + r2 = r25 & r4; + // srl $5, $25, 24 + r5 = S32(U32(r25) >> 24); + // sll $5, $5, 2 + r5 = S32(r5) << 2; + // lw $6, 0x320($5) + r6 = RSP_MEM_W_LOAD(0X320, r5); + // add $2, $2, $6 + r2 = RSP_ADD32(r2, r6); + // addi $1, $23, 0x0 + r1 = RSP_ADD32(r23, 0X0); + // sw $2, 0x40($23) + RSP_MEM_W_STORE(0X40, r23, r2); + // addi $3, $zero, 0x1F + r3 = RSP_ADD32(0, 0X1F); + // srl $7, $26, 16 + r7 = S32(U32(r26) >> 16); + // andi $10, $7, 0x1 + r10 = r7 & 0X1; + // bgtz $10, L_18DC + if (RSP_SIGNED(r10) > 0) { + // nop + + goto L_18DC; + } + // nop + + // jal 0x1184 + r31 = 0x18C8; + // nop + + goto L_1184; + // nop + +L_18C8: + // mfc0 $1, SP_DMA_BUSY + r1 = 0; + // bne $1, $zero, L_18C8 + if (r1 != 0) { + // nop + + goto L_18C8; + } + // nop + + // j L_18E8 + // mtc0 $zero, SP_SEMAPHORE + goto L_18E8; + // mtc0 $zero, SP_SEMAPHORE +L_18DC: + // sh $zero, 0x8($23) + RSP_MEM_H_STORE(0X8, r23, 0); + // vxor $v16, $v16, $v16 + rsp.VXOR<0>(rsp.vpu.r[16], rsp.vpu.r[16], rsp.vpu.r[16]); + // sdv $v16[0], 0x0($23) + rsp.SDV<0>(rsp.vpu.r[16], r23, 0X0); +L_18E8: + // andi $10, $7, 0x2 + r10 = r7 & 0X2; + // beq $10, $zero, L_1908 + if (r10 == 0) { + // nop + + goto L_1908; + } + // nop + + // lh $11, 0xA($23) + r11 = RSP_MEM_H_LOAD(0XA, r23); + // lqv $v3[0], 0x10($23) + rsp.LQV<0>(rsp.vpu.r[3], r23, 0X1); + // sdv $v3[0], 0x3F0($8) + rsp.SDV<0>(rsp.vpu.r[3], r8, -0X2); + // sdv $v3[8], 0x3F8($8) + rsp.SDV<8>(rsp.vpu.r[3], r8, -0X1); + // sub $8, $8, $11 + r8 = RSP_SUB32(r8, r11); +L_1908: + // addi $8, $8, -0x8 + r8 = RSP_ADD32(r8, -0X8); + // lsv $v23[14], 0x8($23) + rsp.LSV<14>(rsp.vpu.r[23], r23, 0X4); + // ldv $v16[0], 0x0($23) + rsp.LDV<0>(rsp.vpu.r[16], r23, 0X0); + // sdv $v16[0], 0x0($8) + rsp.SDV<0>(rsp.vpu.r[16], r8, 0X0); + // mtc2 $8, $v18[4] + rsp.MTC2<4>(r8, rsp.vpu.r[18]); + // addi $10, $zero, 0xC0 + r10 = RSP_ADD32(0, 0XC0); + // mtc2 $10, $v18[6] + rsp.MTC2<6>(r10, rsp.vpu.r[18]); + // mtc2 $26, $v18[8] + rsp.MTC2<8>(r26, rsp.vpu.r[18]); + // addi $10, $zero, 0x40 + r10 = RSP_ADD32(0, 0X40); + // mtc2 $10, $v18[10] + rsp.MTC2<10>(r10, rsp.vpu.r[18]); + // addi $9, $zero, 0x40 + r9 = RSP_ADD32(0, 0X40); + // lqv $v31[0], 0x10($9) + rsp.LQV<0>(rsp.vpu.r[31], r9, 0X1); + // lqv $v25[0], 0x0($9) + rsp.LQV<0>(rsp.vpu.r[25], r9, 0X0); + // vsub $v25, $v25, $v31 + rsp.VSUB<0>(rsp.vpu.r[25], rsp.vpu.r[25], rsp.vpu.r[31]); + // lqv $v30[0], 0x20($9) + rsp.LQV<0>(rsp.vpu.r[30], r9, 0X2); + // lqv $v29[0], 0x30($9) + rsp.LQV<0>(rsp.vpu.r[29], r9, 0X3); + // lqv $v28[0], 0x40($9) + rsp.LQV<0>(rsp.vpu.r[28], r9, 0X4); + // lqv $v27[0], 0x50($9) + rsp.LQV<0>(rsp.vpu.r[27], r9, 0X5); + // lqv $v26[0], 0x60($9) + rsp.LQV<0>(rsp.vpu.r[26], r9, 0X6); + // vsub $v25, $v25, $v31 + rsp.VSUB<0>(rsp.vpu.r[25], rsp.vpu.r[25], rsp.vpu.r[31]); + // lqv $v24[0], 0x70($9) + rsp.LQV<0>(rsp.vpu.r[24], r9, 0X7); + // addi $21, $23, 0x20 + r21 = RSP_ADD32(r23, 0X20); + // addi $20, $23, 0x30 + r20 = RSP_ADD32(r23, 0X30); + // vxor $v22, $v22, $v22 + rsp.VXOR<0>(rsp.vpu.r[22], rsp.vpu.r[22], rsp.vpu.r[22]); + // vmudm $v23, $v31, $v23[7] + rsp.VMUDM<15>(rsp.vpu.r[23], rsp.vpu.r[31], rsp.vpu.r[23]); + // vmadm $v22, $v25, $v18[4] + rsp.VMADM<12>(rsp.vpu.r[22], rsp.vpu.r[25], rsp.vpu.r[18]); + // vmadn $v23, $v31, $v30[0] + rsp.VMADN<8>(rsp.vpu.r[23], rsp.vpu.r[31], rsp.vpu.r[30]); + // vmudn $v21, $v31, $v18[2] + rsp.VMUDN<10>(rsp.vpu.r[21], rsp.vpu.r[31], rsp.vpu.r[18]); + // vmadn $v21, $v22, $v30[2] + rsp.VMADN<10>(rsp.vpu.r[21], rsp.vpu.r[22], rsp.vpu.r[30]); + // vmudl $v17, $v23, $v18[5] + rsp.VMUDL<13>(rsp.vpu.r[17], rsp.vpu.r[23], rsp.vpu.r[18]); + // vmudn $v17, $v17, $v30[4] + rsp.VMUDN<12>(rsp.vpu.r[17], rsp.vpu.r[17], rsp.vpu.r[30]); + // vmadn $v17, $v31, $v18[3] + rsp.VMADN<11>(rsp.vpu.r[17], rsp.vpu.r[31], rsp.vpu.r[18]); + // lqv $v25[0], 0x0($9) + rsp.LQV<0>(rsp.vpu.r[25], r9, 0X0); + // sqv $v21[0], 0x0($21) + rsp.SQV<0>(rsp.vpu.r[21], r21, 0X0); + // sqv $v17[0], 0x0($20) + rsp.SQV<0>(rsp.vpu.r[17], r20, 0X0); + // ssv $v23[7], 0x8($23) + rsp.SSV<7>(rsp.vpu.r[23], r23, 0X4); + // lh $17, 0x0($21) + r17 = RSP_MEM_H_LOAD(0X0, r21); + // lh $9, 0x0($20) + r9 = RSP_MEM_H_LOAD(0X0, r20); + // lh $13, 0x8($21) + r13 = RSP_MEM_H_LOAD(0X8, r21); + // lh $5, 0x8($20) + r5 = RSP_MEM_H_LOAD(0X8, r20); + // lh $16, 0x2($21) + r16 = RSP_MEM_H_LOAD(0X2, r21); + // lh $8, 0x2($20) + r8 = RSP_MEM_H_LOAD(0X2, r20); + // lh $12, 0xA($21) + r12 = RSP_MEM_H_LOAD(0XA, r21); + // lh $4, 0xA($20) + r4 = RSP_MEM_H_LOAD(0XA, r20); + // lh $15, 0x4($21) + r15 = RSP_MEM_H_LOAD(0X4, r21); + // lh $7, 0x4($20) + r7 = RSP_MEM_H_LOAD(0X4, r20); + // lh $11, 0xC($21) + r11 = RSP_MEM_H_LOAD(0XC, r21); + // lh $3, 0xC($20) + r3 = RSP_MEM_H_LOAD(0XC, r20); + // lh $14, 0x6($21) + r14 = RSP_MEM_H_LOAD(0X6, r21); + // lh $6, 0x6($20) + r6 = RSP_MEM_H_LOAD(0X6, r20); + // lh $10, 0xE($21) + r10 = RSP_MEM_H_LOAD(0XE, r21); + // lh $2, 0xE($20) + r2 = RSP_MEM_H_LOAD(0XE, r20); +L_19D8: + // ldv $v16[0], 0x0($17) + rsp.LDV<0>(rsp.vpu.r[16], r17, 0X0); + // vmudm $v23, $v31, $v23[7] + rsp.VMUDM<15>(rsp.vpu.r[23], rsp.vpu.r[31], rsp.vpu.r[23]); + // ldv $v15[0], 0x0($9) + rsp.LDV<0>(rsp.vpu.r[15], r9, 0X0); + // vmadh $v23, $v31, $v22[7] + rsp.VMADH<15>(rsp.vpu.r[23], rsp.vpu.r[31], rsp.vpu.r[22]); + // ldv $v16[8], 0x0($13) + rsp.LDV<8>(rsp.vpu.r[16], r13, 0X0); + // vmadm $v22, $v25, $v18[4] + rsp.VMADM<12>(rsp.vpu.r[22], rsp.vpu.r[25], rsp.vpu.r[18]); + // ldv $v15[8], 0x0($5) + rsp.LDV<8>(rsp.vpu.r[15], r5, 0X0); + // vmadn $v23, $v31, $v30[0] + rsp.VMADN<8>(rsp.vpu.r[23], rsp.vpu.r[31], rsp.vpu.r[30]); + // ldv $v14[0], 0x0($16) + rsp.LDV<0>(rsp.vpu.r[14], r16, 0X0); + // vmudn $v21, $v31, $v18[2] + rsp.VMUDN<10>(rsp.vpu.r[21], rsp.vpu.r[31], rsp.vpu.r[18]); + // ldv $v13[0], 0x0($8) + rsp.LDV<0>(rsp.vpu.r[13], r8, 0X0); + // vmadn $v21, $v22, $v30[2] + rsp.VMADN<10>(rsp.vpu.r[21], rsp.vpu.r[22], rsp.vpu.r[30]); + // ldv $v14[8], 0x0($12) + rsp.LDV<8>(rsp.vpu.r[14], r12, 0X0); + // vmudl $v17, $v23, $v18[5] + rsp.VMUDL<13>(rsp.vpu.r[17], rsp.vpu.r[23], rsp.vpu.r[18]); + // ldv $v13[8], 0x0($4) + rsp.LDV<8>(rsp.vpu.r[13], r4, 0X0); + // ldv $v12[0], 0x0($15) + rsp.LDV<0>(rsp.vpu.r[12], r15, 0X0); + // ldv $v11[0], 0x0($7) + rsp.LDV<0>(rsp.vpu.r[11], r7, 0X0); + // ldv $v12[8], 0x0($11) + rsp.LDV<8>(rsp.vpu.r[12], r11, 0X0); + // vmudn $v17, $v17, $v30[4] + rsp.VMUDN<12>(rsp.vpu.r[17], rsp.vpu.r[17], rsp.vpu.r[30]); + // ldv $v11[8], 0x0($3) + rsp.LDV<8>(rsp.vpu.r[11], r3, 0X0); + // ldv $v10[0], 0x0($14) + rsp.LDV<0>(rsp.vpu.r[10], r14, 0X0); + // ldv $v9[0], 0x0($6) + rsp.LDV<0>(rsp.vpu.r[9], r6, 0X0); + // vmadn $v17, $v31, $v18[3] + rsp.VMADN<11>(rsp.vpu.r[17], rsp.vpu.r[31], rsp.vpu.r[18]); + // ldv $v10[8], 0x0($10) + rsp.LDV<8>(rsp.vpu.r[10], r10, 0X0); + // vmulf $v8, $v16, $v15 + rsp.VMULF<0>(rsp.vpu.r[8], rsp.vpu.r[16], rsp.vpu.r[15]); + // ldv $v9[8], 0x0($2) + rsp.LDV<8>(rsp.vpu.r[9], r2, 0X0); + // vmulf $v7, $v14, $v13 + rsp.VMULF<0>(rsp.vpu.r[7], rsp.vpu.r[14], rsp.vpu.r[13]); + // sqv $v21[0], 0x0($21) + rsp.SQV<0>(rsp.vpu.r[21], r21, 0X0); + // vmulf $v6, $v12, $v11 + rsp.VMULF<0>(rsp.vpu.r[6], rsp.vpu.r[12], rsp.vpu.r[11]); + // sqv $v17[0], 0x0($20) + rsp.SQV<0>(rsp.vpu.r[17], r20, 0X0); + // lh $17, 0x0($21) + r17 = RSP_MEM_H_LOAD(0X0, r21); + // vmulf $v5, $v10, $v9 + rsp.VMULF<0>(rsp.vpu.r[5], rsp.vpu.r[10], rsp.vpu.r[9]); + // lh $9, 0x0($20) + r9 = RSP_MEM_H_LOAD(0X0, r20); + // vadd $v8, $v8, $v8[1q] + rsp.VADD<3>(rsp.vpu.r[8], rsp.vpu.r[8], rsp.vpu.r[8]); + // lh $13, 0x8($21) + r13 = RSP_MEM_H_LOAD(0X8, r21); + // vadd $v7, $v7, $v7[1q] + rsp.VADD<3>(rsp.vpu.r[7], rsp.vpu.r[7], rsp.vpu.r[7]); + // lh $5, 0x8($20) + r5 = RSP_MEM_H_LOAD(0X8, r20); + // vadd $v6, $v6, $v6[1q] + rsp.VADD<3>(rsp.vpu.r[6], rsp.vpu.r[6], rsp.vpu.r[6]); + // lh $16, 0x2($21) + r16 = RSP_MEM_H_LOAD(0X2, r21); + // vadd $v5, $v5, $v5[1q] + rsp.VADD<3>(rsp.vpu.r[5], rsp.vpu.r[5], rsp.vpu.r[5]); + // lh $8, 0x2($20) + r8 = RSP_MEM_H_LOAD(0X2, r20); + // vadd $v8, $v8, $v8[2h] + rsp.VADD<6>(rsp.vpu.r[8], rsp.vpu.r[8], rsp.vpu.r[8]); + // lh $12, 0xA($21) + r12 = RSP_MEM_H_LOAD(0XA, r21); + // vadd $v7, $v7, $v7[2h] + rsp.VADD<6>(rsp.vpu.r[7], rsp.vpu.r[7], rsp.vpu.r[7]); + // lh $4, 0xA($20) + r4 = RSP_MEM_H_LOAD(0XA, r20); + // vadd $v6, $v6, $v6[2h] + rsp.VADD<6>(rsp.vpu.r[6], rsp.vpu.r[6], rsp.vpu.r[6]); + // lh $15, 0x4($21) + r15 = RSP_MEM_H_LOAD(0X4, r21); + // vadd $v5, $v5, $v5[2h] + rsp.VADD<6>(rsp.vpu.r[5], rsp.vpu.r[5], rsp.vpu.r[5]); + // lh $7, 0x4($20) + r7 = RSP_MEM_H_LOAD(0X4, r20); + // vmudn $v4, $v29, $v8[0h] + rsp.VMUDN<4>(rsp.vpu.r[4], rsp.vpu.r[29], rsp.vpu.r[8]); + // lh $11, 0xC($21) + r11 = RSP_MEM_H_LOAD(0XC, r21); + // vmadn $v4, $v28, $v7[0h] + rsp.VMADN<4>(rsp.vpu.r[4], rsp.vpu.r[28], rsp.vpu.r[7]); + // lh $3, 0xC($20) + r3 = RSP_MEM_H_LOAD(0XC, r20); + // vmadn $v4, $v27, $v6[0h] + rsp.VMADN<4>(rsp.vpu.r[4], rsp.vpu.r[27], rsp.vpu.r[6]); + // lh $14, 0x6($21) + r14 = RSP_MEM_H_LOAD(0X6, r21); + // vmadn $v4, $v26, $v5[0h] + rsp.VMADN<4>(rsp.vpu.r[4], rsp.vpu.r[26], rsp.vpu.r[5]); + // lh $6, 0x6($20) + r6 = RSP_MEM_H_LOAD(0X6, r20); + // lh $10, 0xE($21) + r10 = RSP_MEM_H_LOAD(0XE, r21); + // addi $18, $18, -0x10 + r18 = RSP_ADD32(r18, -0X10); + // sqv $v4[0], 0x0($19) + rsp.SQV<0>(rsp.vpu.r[4], r19, 0X0); + // blez $18, L_1AD8 + if (RSP_SIGNED(r18) <= 0) { + // lh $2, 0xE($20) + r2 = RSP_MEM_H_LOAD(0XE, r20); + goto L_1AD8; + } + // lh $2, 0xE($20) + r2 = RSP_MEM_H_LOAD(0XE, r20); + // j L_19D8 + // addi $19, $19, 0x10 + r19 = RSP_ADD32(r19, 0X10); + goto L_19D8; + // addi $19, $19, 0x10 + r19 = RSP_ADD32(r19, 0X10); +L_1AD8: + // ssv $v23[0], 0x8($23) + rsp.SSV<0>(rsp.vpu.r[23], r23, 0X4); + // ldv $v16[0], 0x0($17) + rsp.LDV<0>(rsp.vpu.r[16], r17, 0X0); + // sdv $v16[0], 0x0($23) + rsp.SDV<0>(rsp.vpu.r[16], r23, 0X0); + // lh $6, 0x0($24) + r6 = RSP_MEM_H_LOAD(0X0, r24); + // addi $17, $17, 0x8 + r17 = RSP_ADD32(r17, 0X8); + // sub $5, $17, $6 + r5 = RSP_SUB32(r17, r6); + // andi $4, $5, 0xF + r4 = r5 & 0XF; + // sub $17, $17, $4 + r17 = RSP_SUB32(r17, r4); + // beq $4, $zero, L_1B04 + if (r4 == 0) { + // addi $7, $zero, 0x10 + r7 = RSP_ADD32(0, 0X10); + goto L_1B04; + } + // addi $7, $zero, 0x10 + r7 = RSP_ADD32(0, 0X10); + // sub $4, $7, $4 + r4 = RSP_SUB32(r7, r4); +L_1B04: + // sh $4, 0xA($23) + RSP_MEM_H_STORE(0XA, r23, r4); + // ldv $v3[0], 0x0($17) + rsp.LDV<0>(rsp.vpu.r[3], r17, 0X0); + // ldv $v3[8], 0x8($17) + rsp.LDV<8>(rsp.vpu.r[3], r17, 0X1); + // sqv $v3[0], 0x10($23) + rsp.SQV<0>(rsp.vpu.r[3], r23, 0X1); + // lw $2, 0x40($23) + r2 = RSP_MEM_W_LOAD(0X40, r23); + // addi $1, $23, 0x0 + r1 = RSP_ADD32(r23, 0X0); + // jal 0x11B0 + r31 = 0x1B24; + // addi $3, $zero, 0x1F + r3 = RSP_ADD32(0, 0X1F); + goto L_11B0; + // addi $3, $zero, 0x1F + r3 = RSP_ADD32(0, 0X1F); +L_1B24: + // mfc0 $5, SP_DMA_BUSY + r5 = 0; + // bne $5, $zero, L_1B24 + if (r5 != 0) { + // nop + + goto L_1B24; + } + // nop + + // j L_1118 + // mtc0 $zero, SP_SEMAPHORE + goto L_1118; + // mtc0 $zero, SP_SEMAPHORE +L_1B38: + // lui $4, 0xFF + r4 = S32(0XFF << 16); + // ori $4, $4, 0xFFFF + r4 = r4 | 0XFFFF; + // and $2, $25, $4 + r2 = r25 & r4; + // srl $5, $25, 24 + r5 = S32(U32(r25) >> 24); + // sll $5, $5, 2 + r5 = S32(r5) << 2; + // lw $6, 0x320($5) + r6 = RSP_MEM_W_LOAD(0X320, r5); + // add $2, $2, $6 + r2 = RSP_ADD32(r2, r6); + // addi $1, $23, 0x0 + r1 = RSP_ADD32(r23, 0X0); + // addi $3, $zero, 0x4F + r3 = RSP_ADD32(0, 0X4F); + // vxor $v0, $v0, $v0 + rsp.VXOR<0>(rsp.vpu.r[0], rsp.vpu.r[0], rsp.vpu.r[0]); + // addi $11, $zero, 0x40 + r11 = RSP_ADD32(0, 0X40); + // lqv $v31[0], 0x10($11) + rsp.LQV<0>(rsp.vpu.r[31], r11, 0X1); + // lqv $v10[0], 0x0($zero) + rsp.LQV<0>(rsp.vpu.r[10], 0, 0X0); + // srl $12, $26, 16 + r12 = S32(U32(r26) >> 16); + // andi $10, $12, 0x1 + r10 = r12 & 0X1; + // beq $10, $zero, L_1B84 + if (r10 == 0) { + // lqv $v24[0], 0x10($24) + rsp.LQV<0>(rsp.vpu.r[24], r24, 0X1); + goto L_1B84; + } + // lqv $v24[0], 0x10($24) + rsp.LQV<0>(rsp.vpu.r[24], r24, 0X1); + // j L_1BB0 + // nop + + goto L_1BB0; + // nop + +L_1B84: + // jal 0x1184 + r31 = 0x1B8C; + // nop + + goto L_1184; + // nop + +L_1B8C: + // mfc0 $5, SP_DMA_BUSY + r5 = 0; + // bne $5, $zero, L_1B8C + if (r5 != 0) { + // nop + + goto L_1B8C; + } + // nop + + // mtc0 $zero, SP_SEMAPHORE + // lqv $v20[0], 0x0($23) + rsp.LQV<0>(rsp.vpu.r[20], r23, 0X0); + // lqv $v21[0], 0x10($23) + rsp.LQV<0>(rsp.vpu.r[21], r23, 0X1); + // lqv $v18[0], 0x20($23) + rsp.LQV<0>(rsp.vpu.r[18], r23, 0X2); + // lqv $v19[0], 0x30($23) + rsp.LQV<0>(rsp.vpu.r[19], r23, 0X3); + // lqv $v24[0], 0x40($23) + rsp.LQV<0>(rsp.vpu.r[24], r23, 0X4); +L_1BB0: + // lh $13, 0x0($24) + r13 = RSP_MEM_H_LOAD(0X0, r24); + // lh $19, 0x2($24) + r19 = RSP_MEM_H_LOAD(0X2, r24); + // lh $18, 0xA($24) + r18 = RSP_MEM_H_LOAD(0XA, r24); + // lh $17, 0xC($24) + r17 = RSP_MEM_H_LOAD(0XC, r24); + // lh $16, 0xE($24) + r16 = RSP_MEM_H_LOAD(0XE, r24); + // lh $14, 0x4($24) + r14 = RSP_MEM_H_LOAD(0X4, r24); + // addi $15, $zero, 0x10 + r15 = RSP_ADD32(0, 0X10); + // mfc2 $21, $v24[2] + rsp.MFC2<2>(r21, rsp.vpu.r[24]); + // mfc2 $20, $v24[8] + rsp.MFC2<8>(r20, rsp.vpu.r[24]); + // andi $9, $12, 0x8 + r9 = r12 & 0X8; + // bgtz $9, L_1BEC + if (RSP_SIGNED(r9) > 0) { + // nop + + goto L_1BEC; + } + // nop + + // addi $17, $23, 0x50 + r17 = RSP_ADD32(r23, 0X50); + // add $16, $zero, $17 + r16 = RSP_ADD32(0, r17); + // addi $15, $zero, 0x0 + r15 = RSP_ADD32(0, 0X0); +L_1BEC: + // beq $10, $zero, L_1CF0 + if (r10 == 0) { + // lqv $v30[0], 0x70($11) + rsp.LQV<0>(rsp.vpu.r[30], r11, 0X7); + goto L_1CF0; + } + // lqv $v30[0], 0x70($11) + rsp.LQV<0>(rsp.vpu.r[30], r11, 0X7); + // lqv $v17[0], 0x0($13) + rsp.LQV<0>(rsp.vpu.r[17], r13, 0X0); + // lqv $v29[0], 0x0($19) + rsp.LQV<0>(rsp.vpu.r[29], r19, 0X0); + // lqv $v27[0], 0x0($17) + rsp.LQV<0>(rsp.vpu.r[27], r17, 0X0); + // vxor $v21, $v21, $v21 + rsp.VXOR<0>(rsp.vpu.r[21], rsp.vpu.r[21], rsp.vpu.r[21]); + // lsv $v20[14], 0x6($24) + rsp.LSV<14>(rsp.vpu.r[20], r24, 0X3); + // vmudm $v23, $v20, $v24[2] + rsp.VMUDM<10>(rsp.vpu.r[23], rsp.vpu.r[20], rsp.vpu.r[24]); + // vmadh $v22, $v20, $v24[1] + rsp.VMADH<9>(rsp.vpu.r[22], rsp.vpu.r[20], rsp.vpu.r[24]); + // vmadn $v23, $v31, $v0[0] + rsp.VMADN<8>(rsp.vpu.r[23], rsp.vpu.r[31], rsp.vpu.r[0]); + // vsubc $v23, $v23, $v21 + rsp.VSUBC<0>(rsp.vpu.r[23], rsp.vpu.r[23], rsp.vpu.r[21]); + // vsub $v22, $v22, $v20 + rsp.VSUB<0>(rsp.vpu.r[22], rsp.vpu.r[22], rsp.vpu.r[20]); + // vmudl $v23, $v30, $v23[7] + rsp.VMUDL<15>(rsp.vpu.r[23], rsp.vpu.r[30], rsp.vpu.r[23]); + // vmadn $v23, $v30, $v22[7] + rsp.VMADN<15>(rsp.vpu.r[23], rsp.vpu.r[30], rsp.vpu.r[22]); + // vmadm $v22, $v31, $v0[0] + rsp.VMADM<8>(rsp.vpu.r[22], rsp.vpu.r[31], rsp.vpu.r[0]); + // vmadm $v21, $v31, $v21[7] + rsp.VMADM<15>(rsp.vpu.r[21], rsp.vpu.r[31], rsp.vpu.r[21]); + // vmadh $v20, $v31, $v20[7] + rsp.VMADH<15>(rsp.vpu.r[20], rsp.vpu.r[31], rsp.vpu.r[20]); + // bgtz $21, L_1C44 + if (RSP_SIGNED(r21) > 0) { + // vmadn $v21, $v31, $v0[0] + rsp.VMADN<8>(rsp.vpu.r[21], rsp.vpu.r[31], rsp.vpu.r[0]); + goto L_1C44; + } + // vmadn $v21, $v31, $v0[0] + rsp.VMADN<8>(rsp.vpu.r[21], rsp.vpu.r[31], rsp.vpu.r[0]); + // vge $v20, $v20, $v24[0] + rsp.VGE<8>(rsp.vpu.r[20], rsp.vpu.r[20], rsp.vpu.r[24]); + // j L_1C48 + // nop + + goto L_1C48; + // nop + +L_1C44: + // vcl $v20, $v20, $v24[0] + rsp.VCL<8>(rsp.vpu.r[20], rsp.vpu.r[20], rsp.vpu.r[24]); +L_1C48: + // vmulf $v16, $v20, $v24[6] + rsp.VMULF<14>(rsp.vpu.r[16], rsp.vpu.r[20], rsp.vpu.r[24]); + // vmulf $v15, $v20, $v24[7] + rsp.VMULF<15>(rsp.vpu.r[15], rsp.vpu.r[20], rsp.vpu.r[24]); + // vmulf $v29, $v29, $v10[6] + rsp.VMULF<14>(rsp.vpu.r[29], rsp.vpu.r[29], rsp.vpu.r[10]); + // vmacf $v29, $v17, $v16 + rsp.VMACF<0>(rsp.vpu.r[29], rsp.vpu.r[17], rsp.vpu.r[16]); + // vmulf $v27, $v27, $v10[6] + rsp.VMULF<14>(rsp.vpu.r[27], rsp.vpu.r[27], rsp.vpu.r[10]); + // vmacf $v27, $v17, $v15 + rsp.VMACF<0>(rsp.vpu.r[27], rsp.vpu.r[17], rsp.vpu.r[15]); + // sqv $v29[0], 0x0($19) + rsp.SQV<0>(rsp.vpu.r[29], r19, 0X0); + // sqv $v27[0], 0x0($17) + rsp.SQV<0>(rsp.vpu.r[27], r17, 0X0); + // lqv $v28[0], 0x0($18) + rsp.LQV<0>(rsp.vpu.r[28], r18, 0X0); + // lqv $v26[0], 0x0($16) + rsp.LQV<0>(rsp.vpu.r[26], r16, 0X0); + // vxor $v19, $v19, $v19 + rsp.VXOR<0>(rsp.vpu.r[19], rsp.vpu.r[19], rsp.vpu.r[19]); + // lsv $v18[14], 0x8($24) + rsp.LSV<14>(rsp.vpu.r[18], r24, 0X4); + // vmudm $v23, $v18, $v24[5] + rsp.VMUDM<13>(rsp.vpu.r[23], rsp.vpu.r[18], rsp.vpu.r[24]); + // vmadh $v22, $v18, $v24[4] + rsp.VMADH<12>(rsp.vpu.r[22], rsp.vpu.r[18], rsp.vpu.r[24]); + // vmadn $v23, $v31, $v0[0] + rsp.VMADN<8>(rsp.vpu.r[23], rsp.vpu.r[31], rsp.vpu.r[0]); + // vsubc $v23, $v23, $v19 + rsp.VSUBC<0>(rsp.vpu.r[23], rsp.vpu.r[23], rsp.vpu.r[19]); + // vsub $v22, $v22, $v18 + rsp.VSUB<0>(rsp.vpu.r[22], rsp.vpu.r[22], rsp.vpu.r[18]); + // vmudl $v23, $v30, $v23[7] + rsp.VMUDL<15>(rsp.vpu.r[23], rsp.vpu.r[30], rsp.vpu.r[23]); + // vmadn $v23, $v30, $v22[7] + rsp.VMADN<15>(rsp.vpu.r[23], rsp.vpu.r[30], rsp.vpu.r[22]); + // vmadm $v22, $v31, $v0[0] + rsp.VMADM<8>(rsp.vpu.r[22], rsp.vpu.r[31], rsp.vpu.r[0]); + // vmadm $v19, $v31, $v19[7] + rsp.VMADM<15>(rsp.vpu.r[19], rsp.vpu.r[31], rsp.vpu.r[19]); + // vmadh $v18, $v31, $v18[7] + rsp.VMADH<15>(rsp.vpu.r[18], rsp.vpu.r[31], rsp.vpu.r[18]); + // bgtz $20, L_1CB4 + if (RSP_SIGNED(r20) > 0) { + // vmadn $v19, $v31, $v0[0] + rsp.VMADN<8>(rsp.vpu.r[19], rsp.vpu.r[31], rsp.vpu.r[0]); + goto L_1CB4; + } + // vmadn $v19, $v31, $v0[0] + rsp.VMADN<8>(rsp.vpu.r[19], rsp.vpu.r[31], rsp.vpu.r[0]); + // vge $v18, $v18, $v24[3] + rsp.VGE<11>(rsp.vpu.r[18], rsp.vpu.r[18], rsp.vpu.r[24]); + // j L_1CB8 + // nop + + goto L_1CB8; + // nop + +L_1CB4: + // vcl $v18, $v18, $v24[3] + rsp.VCL<11>(rsp.vpu.r[18], rsp.vpu.r[18], rsp.vpu.r[24]); +L_1CB8: + // vmulf $v16, $v18, $v24[6] + rsp.VMULF<14>(rsp.vpu.r[16], rsp.vpu.r[18], rsp.vpu.r[24]); + // vmulf $v15, $v18, $v24[7] + rsp.VMULF<15>(rsp.vpu.r[15], rsp.vpu.r[18], rsp.vpu.r[24]); + // vmulf $v28, $v28, $v10[6] + rsp.VMULF<14>(rsp.vpu.r[28], rsp.vpu.r[28], rsp.vpu.r[10]); + // vmacf $v28, $v17, $v16 + rsp.VMACF<0>(rsp.vpu.r[28], rsp.vpu.r[17], rsp.vpu.r[16]); + // vmulf $v26, $v26, $v10[6] + rsp.VMULF<14>(rsp.vpu.r[26], rsp.vpu.r[26], rsp.vpu.r[10]); + // vmacf $v26, $v17, $v15 + rsp.VMACF<0>(rsp.vpu.r[26], rsp.vpu.r[17], rsp.vpu.r[15]); + // sqv $v28[0], 0x0($18) + rsp.SQV<0>(rsp.vpu.r[28], r18, 0X0); + // sqv $v26[0], 0x0($16) + rsp.SQV<0>(rsp.vpu.r[26], r16, 0X0); + // addi $14, $14, -0x10 + r14 = RSP_ADD32(r14, -0X10); + // addi $13, $13, 0x10 + r13 = RSP_ADD32(r13, 0X10); + // addi $19, $19, 0x10 + r19 = RSP_ADD32(r19, 0X10); + // addi $18, $18, 0x10 + r18 = RSP_ADD32(r18, 0X10); + // add $17, $17, $15 + r17 = RSP_ADD32(r17, r15); + // add $16, $16, $15 + r16 = RSP_ADD32(r16, r15); +L_1CF0: + // vmudl $v23, $v21, $v24[2] + rsp.VMUDL<10>(rsp.vpu.r[23], rsp.vpu.r[21], rsp.vpu.r[24]); + // vmadm $v23, $v20, $v24[2] + rsp.VMADM<10>(rsp.vpu.r[23], rsp.vpu.r[20], rsp.vpu.r[24]); + // vmadn $v23, $v21, $v24[1] + rsp.VMADN<9>(rsp.vpu.r[23], rsp.vpu.r[21], rsp.vpu.r[24]); + // vmadh $v20, $v20, $v24[1] + rsp.VMADH<9>(rsp.vpu.r[20], rsp.vpu.r[20], rsp.vpu.r[24]); + // vmadn $v21, $v31, $v0[0] + rsp.VMADN<8>(rsp.vpu.r[21], rsp.vpu.r[31], rsp.vpu.r[0]); +L_1D04: + // bgtz $21, L_1D30 + if (RSP_SIGNED(r21) > 0) { + // lqv $v17[0], 0x0($13) + rsp.LQV<0>(rsp.vpu.r[17], r13, 0X0); + goto L_1D30; + } + // lqv $v17[0], 0x0($13) + rsp.LQV<0>(rsp.vpu.r[17], r13, 0X0); + // vge $v20, $v20, $v24[0] + rsp.VGE<8>(rsp.vpu.r[20], rsp.vpu.r[20], rsp.vpu.r[24]); + // vmudl $v23, $v19, $v24[5] + rsp.VMUDL<13>(rsp.vpu.r[23], rsp.vpu.r[19], rsp.vpu.r[24]); + // vmadm $v23, $v18, $v24[5] + rsp.VMADM<13>(rsp.vpu.r[23], rsp.vpu.r[18], rsp.vpu.r[24]); + // vmadn $v23, $v19, $v24[4] + rsp.VMADN<12>(rsp.vpu.r[23], rsp.vpu.r[19], rsp.vpu.r[24]); + // lqv $v29[0], 0x0($19) + rsp.LQV<0>(rsp.vpu.r[29], r19, 0X0); + // vmadh $v18, $v18, $v24[4] + rsp.VMADH<12>(rsp.vpu.r[18], rsp.vpu.r[18], rsp.vpu.r[24]); + // lqv $v27[0], 0x0($17) + rsp.LQV<0>(rsp.vpu.r[27], r17, 0X0); + // j L_1D50 + // vmadn $v19, $v31, $v0[0] + rsp.VMADN<8>(rsp.vpu.r[19], rsp.vpu.r[31], rsp.vpu.r[0]); + goto L_1D50; + // vmadn $v19, $v31, $v0[0] + rsp.VMADN<8>(rsp.vpu.r[19], rsp.vpu.r[31], rsp.vpu.r[0]); +L_1D30: + // vcl $v20, $v20, $v24[0] + rsp.VCL<8>(rsp.vpu.r[20], rsp.vpu.r[20], rsp.vpu.r[24]); + // vmudl $v23, $v19, $v24[5] + rsp.VMUDL<13>(rsp.vpu.r[23], rsp.vpu.r[19], rsp.vpu.r[24]); + // vmadm $v23, $v18, $v24[5] + rsp.VMADM<13>(rsp.vpu.r[23], rsp.vpu.r[18], rsp.vpu.r[24]); + // vmadn $v23, $v19, $v24[4] + rsp.VMADN<12>(rsp.vpu.r[23], rsp.vpu.r[19], rsp.vpu.r[24]); + // lqv $v29[0], 0x0($19) + rsp.LQV<0>(rsp.vpu.r[29], r19, 0X0); + // vmadh $v18, $v18, $v24[4] + rsp.VMADH<12>(rsp.vpu.r[18], rsp.vpu.r[18], rsp.vpu.r[24]); + // lqv $v27[0], 0x0($17) + rsp.LQV<0>(rsp.vpu.r[27], r17, 0X0); + // vmadn $v19, $v31, $v0[0] + rsp.VMADN<8>(rsp.vpu.r[19], rsp.vpu.r[31], rsp.vpu.r[0]); +L_1D50: + // vmulf $v16, $v20, $v24[6] + rsp.VMULF<14>(rsp.vpu.r[16], rsp.vpu.r[20], rsp.vpu.r[24]); + // sqv $v20[0], 0x0($23) + rsp.SQV<0>(rsp.vpu.r[20], r23, 0X0); + // vmulf $v15, $v20, $v24[7] + rsp.VMULF<15>(rsp.vpu.r[15], rsp.vpu.r[20], rsp.vpu.r[24]); + // sqv $v21[0], 0x10($23) + rsp.SQV<0>(rsp.vpu.r[21], r23, 0X1); + // vmulf $v29, $v29, $v10[6] + rsp.VMULF<14>(rsp.vpu.r[29], rsp.vpu.r[29], rsp.vpu.r[10]); + // vmacf $v29, $v17, $v16 + rsp.VMACF<0>(rsp.vpu.r[29], rsp.vpu.r[17], rsp.vpu.r[16]); + // lqv $v28[0], 0x0($18) + rsp.LQV<0>(rsp.vpu.r[28], r18, 0X0); + // vmulf $v27, $v27, $v10[6] + rsp.VMULF<14>(rsp.vpu.r[27], rsp.vpu.r[27], rsp.vpu.r[10]); + // lqv $v26[0], 0x0($16) + rsp.LQV<0>(rsp.vpu.r[26], r16, 0X0); + // vmacf $v27, $v17, $v15 + rsp.VMACF<0>(rsp.vpu.r[27], rsp.vpu.r[17], rsp.vpu.r[15]); + // bgtz $20, L_1DA0 + if (RSP_SIGNED(r20) > 0) { + // sqv $v29[0], 0x0($19) + rsp.SQV<0>(rsp.vpu.r[29], r19, 0X0); + goto L_1DA0; + } + // sqv $v29[0], 0x0($19) + rsp.SQV<0>(rsp.vpu.r[29], r19, 0X0); + // vge $v18, $v18, $v24[3] + rsp.VGE<11>(rsp.vpu.r[18], rsp.vpu.r[18], rsp.vpu.r[24]); + // vmudl $v23, $v21, $v24[2] + rsp.VMUDL<10>(rsp.vpu.r[23], rsp.vpu.r[21], rsp.vpu.r[24]); + // sqv $v27[0], 0x0($17) + rsp.SQV<0>(rsp.vpu.r[27], r17, 0X0); + // vmadm $v23, $v20, $v24[2] + rsp.VMADM<10>(rsp.vpu.r[23], rsp.vpu.r[20], rsp.vpu.r[24]); + // vmadn $v23, $v21, $v24[1] + rsp.VMADN<9>(rsp.vpu.r[23], rsp.vpu.r[21], rsp.vpu.r[24]); + // vmadh $v20, $v20, $v24[1] + rsp.VMADH<9>(rsp.vpu.r[20], rsp.vpu.r[20], rsp.vpu.r[24]); + // j L_1DBC + // vmadn $v21, $v31, $v0[0] + rsp.VMADN<8>(rsp.vpu.r[21], rsp.vpu.r[31], rsp.vpu.r[0]); + goto L_1DBC; + // vmadn $v21, $v31, $v0[0] + rsp.VMADN<8>(rsp.vpu.r[21], rsp.vpu.r[31], rsp.vpu.r[0]); +L_1DA0: + // vcl $v18, $v18, $v24[3] + rsp.VCL<11>(rsp.vpu.r[18], rsp.vpu.r[18], rsp.vpu.r[24]); + // vmudl $v23, $v21, $v24[2] + rsp.VMUDL<10>(rsp.vpu.r[23], rsp.vpu.r[21], rsp.vpu.r[24]); + // sqv $v27[0], 0x0($17) + rsp.SQV<0>(rsp.vpu.r[27], r17, 0X0); + // vmadm $v23, $v20, $v24[2] + rsp.VMADM<10>(rsp.vpu.r[23], rsp.vpu.r[20], rsp.vpu.r[24]); + // vmadn $v23, $v21, $v24[1] + rsp.VMADN<9>(rsp.vpu.r[23], rsp.vpu.r[21], rsp.vpu.r[24]); + // vmadh $v20, $v20, $v24[1] + rsp.VMADH<9>(rsp.vpu.r[20], rsp.vpu.r[20], rsp.vpu.r[24]); + // vmadn $v21, $v31, $v0[0] + rsp.VMADN<8>(rsp.vpu.r[21], rsp.vpu.r[31], rsp.vpu.r[0]); +L_1DBC: + // vmulf $v16, $v18, $v24[6] + rsp.VMULF<14>(rsp.vpu.r[16], rsp.vpu.r[18], rsp.vpu.r[24]); + // addi $14, $14, -0x10 + r14 = RSP_ADD32(r14, -0X10); + // vmulf $v15, $v18, $v24[7] + rsp.VMULF<15>(rsp.vpu.r[15], rsp.vpu.r[18], rsp.vpu.r[24]); + // addi $19, $19, 0x10 + r19 = RSP_ADD32(r19, 0X10); + // vmulf $v28, $v28, $v10[6] + rsp.VMULF<14>(rsp.vpu.r[28], rsp.vpu.r[28], rsp.vpu.r[10]); + // add $17, $17, $15 + r17 = RSP_ADD32(r17, r15); + // vmacf $v28, $v17, $v16 + rsp.VMACF<0>(rsp.vpu.r[28], rsp.vpu.r[17], rsp.vpu.r[16]); + // addi $13, $13, 0x10 + r13 = RSP_ADD32(r13, 0X10); + // vmulf $v26, $v26, $v10[6] + rsp.VMULF<14>(rsp.vpu.r[26], rsp.vpu.r[26], rsp.vpu.r[10]); + // vmacf $v26, $v17, $v15 + rsp.VMACF<0>(rsp.vpu.r[26], rsp.vpu.r[17], rsp.vpu.r[15]); + // sqv $v28[0], 0x0($18) + rsp.SQV<0>(rsp.vpu.r[28], r18, 0X0); + // addi $18, $18, 0x10 + r18 = RSP_ADD32(r18, 0X10); + // blez $14, L_1DFC + if (RSP_SIGNED(r14) <= 0) { + // sqv $v26[0], 0x0($16) + rsp.SQV<0>(rsp.vpu.r[26], r16, 0X0); + goto L_1DFC; + } + // sqv $v26[0], 0x0($16) + rsp.SQV<0>(rsp.vpu.r[26], r16, 0X0); + // j L_1D04 + // add $16, $16, $15 + r16 = RSP_ADD32(r16, r15); + goto L_1D04; + // add $16, $16, $15 + r16 = RSP_ADD32(r16, r15); +L_1DFC: + // sqv $v18[0], 0x20($23) + rsp.SQV<0>(rsp.vpu.r[18], r23, 0X2); + // sqv $v19[0], 0x30($23) + rsp.SQV<0>(rsp.vpu.r[19], r23, 0X3); + // sqv $v24[0], 0x40($23) + rsp.SQV<0>(rsp.vpu.r[24], r23, 0X4); + // jal 0x11B0 + r31 = 0x1E10; + // addi $3, $zero, 0x4F + r3 = RSP_ADD32(0, 0X4F); + goto L_11B0; + // addi $3, $zero, 0x4F + r3 = RSP_ADD32(0, 0X4F); +L_1E10: + // mfc0 $5, SP_DMA_BUSY + r5 = 0; + // bne $5, $zero, L_1E10 + if (r5 != 0) { + // nop + + goto L_1E10; + } + // nop + + // j L_1118 + // mtc0 $zero, SP_SEMAPHORE + goto L_1118; + // mtc0 $zero, SP_SEMAPHORE +L_1E24: + // lqv $v31[0], 0x0($zero) + rsp.LQV<0>(rsp.vpu.r[31], 0, 0X0); + // lhu $18, 0x4($24) + r18 = RSP_MEM_HU_LOAD(0X4, r24); + // beq $18, $zero, L_1E94 + if (r18 == 0) { + // nop + + goto L_1E94; + } + // nop + + // andi $19, $25, 0xFFFF + r19 = r25 & 0XFFFF; + // addi $19, $19, 0x5C0 + r19 = RSP_ADD32(r19, 0X5C0); + // srl $20, $25, 16 + r20 = S32(U32(r25) >> 16); + // addi $20, $20, 0x5C0 + r20 = RSP_ADD32(r20, 0X5C0); + // andi $17, $26, 0xFFFF + r17 = r26 & 0XFFFF; + // mtc2 $17, $v30[0] + rsp.MTC2<0>(r17, rsp.vpu.r[30]); + // lqv $v27[0], 0x0($19) + rsp.LQV<0>(rsp.vpu.r[27], r19, 0X0); + // lqv $v29[0], 0x0($20) + rsp.LQV<0>(rsp.vpu.r[29], r20, 0X0); + // lqv $v26[0], 0x10($19) + rsp.LQV<0>(rsp.vpu.r[26], r19, 0X1); + // lqv $v28[0], 0x10($20) + rsp.LQV<0>(rsp.vpu.r[28], r20, 0X1); +L_1E5C: + // vmulf $v27, $v27, $v31[6] + rsp.VMULF<14>(rsp.vpu.r[27], rsp.vpu.r[27], rsp.vpu.r[31]); + // addi $18, $18, -0x20 + r18 = RSP_ADD32(r18, -0X20); + // vmacf $v27, $v29, $v30[0] + rsp.VMACF<8>(rsp.vpu.r[27], rsp.vpu.r[29], rsp.vpu.r[30]); + // addi $20, $20, 0x20 + r20 = RSP_ADD32(r20, 0X20); + // sqv $v27[0], 0x0($19) + rsp.SQV<0>(rsp.vpu.r[27], r19, 0X0); + // vmulf $v26, $v26, $v31[6] + rsp.VMULF<14>(rsp.vpu.r[26], rsp.vpu.r[26], rsp.vpu.r[31]); + // lqv $v29[0], 0x0($20) + rsp.LQV<0>(rsp.vpu.r[29], r20, 0X0); + // vmacf $v26, $v28, $v30[0] + rsp.VMACF<8>(rsp.vpu.r[26], rsp.vpu.r[28], rsp.vpu.r[30]); + // lqv $v28[0], 0x10($20) + rsp.LQV<0>(rsp.vpu.r[28], r20, 0X1); + // sqv $v26[0], 0x10($19) + rsp.SQV<0>(rsp.vpu.r[26], r19, 0X1); + // addi $19, $19, 0x20 + r19 = RSP_ADD32(r19, 0X20); + // lqv $v27[0], 0x0($19) + rsp.LQV<0>(rsp.vpu.r[27], r19, 0X0); + // bgtz $18, L_1E5C + if (RSP_SIGNED(r18) > 0) { + // lqv $v26[0], 0x10($19) + rsp.LQV<0>(rsp.vpu.r[26], r19, 0X1); + goto L_1E5C; + } + // lqv $v26[0], 0x10($19) + rsp.LQV<0>(rsp.vpu.r[26], r19, 0X1); +L_1E94: + // j L_1118 + // nop + + goto L_1118; + // nop + + // nop + + return RspExitReason::ImemOverrun; +do_indirect_jump: + switch ((jump_target | 0x1000) & 0X1FFF) { + case 0x18C8: goto L_18C8; + case 0x14FC: goto L_14FC; + case 0x1868: goto L_1868; + case 0x10C0: goto L_10C0; + case 0x1178: goto L_1178; + case 0x1130: goto L_1130; + case 0x1240: goto L_1240; + case 0x1280: goto L_1280; + case 0x1294: goto L_1294; + case 0x1254: goto L_1254; + case 0x1214: goto L_1214; + case 0x1E10: goto L_1E10; + case 0x16F8: goto L_16F8; + case 0x12BC: goto L_12BC; + case 0x1790: goto L_1790; + case 0x1B24: goto L_1B24; + case 0x1B8C: goto L_1B8C; + case 0x1118: goto L_1118; + case 0x1470: goto L_1470; + case 0x11DC: goto L_11DC; + case 0x1B38: goto L_1B38; + case 0x187C: goto L_187C; + case 0x12D0: goto L_12D0; + case 0x12EC: goto L_12EC; + case 0x1328: goto L_1328; + case 0x144C: goto L_144C; + case 0x140C: goto L_140C; + case 0x1E24: goto L_1E24; + case 0x138C: goto L_138C; + case 0x170C: goto L_170C; + } + printf("Unhandled jump target 0x%04X in microcode aspMain, coming from [%s:%d]\n", jump_target, debug_file, debug_line); + printf("Register dump: r0 = %08X r1 = %08X r2 = %08X r3 = %08X r4 = %08X r5 = %08X r6 = %08X r7 = %08X\n" + " r8 = %08X r9 = %08X r10 = %08X r11 = %08X r12 = %08X r13 = %08X r14 = %08X r15 = %08X\n" + " r16 = %08X r17 = %08X r18 = %08X r19 = %08X r20 = %08X r21 = %08X r22 = %08X r23 = %08X\n" + " r24 = %08X r25 = %08X r26 = %08X r27 = %08X r28 = %08X r29 = %08X r30 = %08X r31 = %08X\n", + 0, r1, r2, r3, r4, r5, r6, r7, r8, r9, r10, r11, r12, r13, r14, r15, r16, + r17, r18, r19, r20, r21, r22, r23, r24, r25, r26, r27, r28, r29, r30, r31); + return RspExitReason::UnhandledJumpTarget; +} diff --git a/src/game/config.cpp b/src/game/config.cpp index 526e267..c901b04 100644 --- a/src/game/config.cpp +++ b/src/game/config.cpp @@ -22,7 +22,7 @@ constexpr std::u8string_view general_filename = u8"general.json"; constexpr std::u8string_view graphics_filename = u8"graphics.json"; constexpr std::u8string_view controls_filename = u8"controls.json"; constexpr std::u8string_view sound_filename = u8"sound.json"; -constexpr std::u8string_view program_id = u8"MarioKart64Recompiled"; +constexpr std::u8string_view program_id = u8"DNZHRecompiled"; constexpr auto res_default = ultramodern::renderer::Resolution::Auto; constexpr auto hr_default = ultramodern::renderer::HUDRatioMode::Full; diff --git a/src/game/recomp_api.cpp b/src/game/recomp_api.cpp index 8c4541a..c5b8862 100644 --- a/src/game/recomp_api.cpp +++ b/src/game/recomp_api.cpp @@ -23,6 +23,24 @@ extern "C" void recomp_sleep_miliseconds(uint8_t* rdram, recomp_context* ctx) { ultramodern::sleep_milliseconds(time); } +extern "C" void bzero_recomp(uint8_t* rdram, recomp_context* ctx) { + // Empty +} + +// int toupper(int c) { +// if (c >= 'a' && c <= 'z') +// return c - ('a' - 'A'); +// return c; +// } + +extern "C" void toupper_recomp(uint8_t* rdram, recomp_context* ctx) { + // Empty + s32 c = _arg<0, s32>(rdram, ctx); + + if (c >= 'a' && c <= 'z') + ctx->r2 = c - ('a' - 'A'); + ctx->r2 = c; +} extern "C" void rmonPrintf_recomp(uint8_t* rdram, recomp_context* ctx) { // Empty diff --git a/src/main/main.cpp b/src/main/main.cpp index 30d66f7..84290a3 100644 --- a/src/main/main.cpp +++ b/src/main/main.cpp @@ -144,7 +144,7 @@ ultramodern::renderer::WindowHandle create_window(ultramodern::gfx_callbacks_t:: flags |= SDL_WINDOW_VULKAN; #endif - window = SDL_CreateWindow("MarioKart 64: Recompiled", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 1600, 960, flags); + window = SDL_CreateWindow("Duke Nukem Zero Hour: Recompiled", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 1600, 960, flags); #if defined(__linux__) SetImageAsIcon("icons/512.png",window); if (ultramodern::renderer::get_graphics_config().wm_option == ultramodern::renderer::WindowMode::Fullscreen) { // TODO: Remove once RT64 gets native fullscreen support on Linux @@ -219,10 +219,9 @@ void queue_samples(int16_t* audio_data, size_t sample_count) { // swap buffer to correct for the address xor caused by endianness handling. float cur_main_volume = zelda64::get_main_volume() / 100.0f; // Get the current main volume, normalized to 0.0-1.0. for (size_t i = 0; i < sample_count; i += input_channels) { - // TODO: Don't swap buffers since the channels are reversed in MK64 for some reason // Investigate - swap_buffer[i + 0 + duplicated_input_frames * input_channels] = audio_data[i + 0] * (1.0f / 32768.0f) * cur_main_volume; - swap_buffer[i + 1 + duplicated_input_frames * input_channels] = audio_data[i + 1] * (1.0f / 32768.0f) * cur_main_volume; + swap_buffer[i + 0 + duplicated_input_frames * input_channels] = audio_data[i + 1] * (1.0f / 32768.0f) * cur_main_volume; + swap_buffer[i + 1 + duplicated_input_frames * input_channels] = audio_data[i + 0] * (1.0f / 32768.0f) * cur_main_volume; } // TODO handle cases where a chunk is smaller than the duplicated frame count. @@ -352,11 +351,11 @@ gpr get_entrypoint_address(); // array of supported GameEntry objects std::vector supported_games = { { - .rom_hash = 0x54572403569b87c1, // retail + .rom_hash = 0xafc33da7101fec88, // retail .internal_name = "MARIOKART64", - .game_id = u8"mk64.us", - .mod_game_id = "mk64", - .save_type = recomp::SaveType::Eep4k, + .game_id = u8"dnzh.us", + .mod_game_id = "dnzh", + .save_type = recomp::SaveType::None, .is_enabled = true, .entrypoint_address = get_entrypoint_address(), .entrypoint = recomp_entrypoint, diff --git a/src/ui/ui_mod_menu.cpp b/src/ui/ui_mod_menu.cpp index f0b0cd7..3f9e36e 100644 --- a/src/ui/ui_mod_menu.cpp +++ b/src/ui/ui_mod_menu.cpp @@ -630,7 +630,7 @@ void ModMenu::process_event(const Event &e) { } ModMenu::ModMenu(Element *parent) : Element(parent) { - game_mod_id = "mk64"; + game_mod_id = "dnzh"; ContextId context = get_current_context(); diff --git a/dukenukemzerohour.us.toml b/us.toml similarity index 100% rename from dukenukemzerohour.us.toml rename to us.toml