mirror of
https://github.com/TwilitRealm/dusklight
synced 2026-08-02 16:16:20 -04:00
Compare commits
504 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 8220f2b8e9 | |||
| ce2d37df68 | |||
| 687307b4c1 | |||
| 4b0a58b8f2 | |||
| f16290d1e0 | |||
| e9a84c2fb5 | |||
| c1d34d7b68 | |||
| d12cf18ce1 | |||
| 1643474573 | |||
| 3d06c6607c | |||
| 1d275f4ead | |||
| 957dbe976e | |||
| ba994a4e65 | |||
| 21e75bac1c | |||
| 9b087aadda | |||
| 1aa81ff907 | |||
| 21a7823045 | |||
| a245876f7f | |||
| 1c59d124dc | |||
| 7766739df1 | |||
| 0b23015ddb | |||
| 9537df2ee7 | |||
| 9e6dd59e49 | |||
| fa34335a09 | |||
| a4c619ad58 | |||
| cf0c1c3160 | |||
| 6be65a461d | |||
| bb1c1447d0 | |||
| dce6b4c666 | |||
| 9756612b35 | |||
| 49f27acb2b | |||
| d1ea637d22 | |||
| 591c38e871 | |||
| a5bc71795e | |||
| 26d0725c76 | |||
| 1b3b493fbf | |||
| f62a70f9d0 | |||
| ec2173db9f | |||
| 563944d4a3 | |||
| b8f69e82dd | |||
| 830b560933 | |||
| 6592871fa2 | |||
| e57c952deb | |||
| 4239cea3d5 | |||
| 9bd34a0d02 | |||
| cce67c1809 | |||
| 6bf0dfd92a | |||
| 4d8fcfa551 | |||
| a3de85fb4b | |||
| 08e0645ef8 | |||
| f20cf3c24e | |||
| b2dfdf4158 | |||
| 99689258a2 | |||
| 08345d01ed | |||
| 56d47d475f | |||
| 8a92efbe0d | |||
| 1790ad6faf | |||
| e39c139b97 | |||
| 54b3545736 | |||
| 2428ca2efe | |||
| 05d9cf0402 | |||
| 2651640ee0 | |||
| f8c5a8988b | |||
| 544964c1a5 | |||
| 7bd3e9cafd | |||
| 8999c4c9c5 | |||
| 917def4732 | |||
| 0516282bb6 | |||
| d855efe513 | |||
| 28733f5c15 | |||
| b2ac2d6600 | |||
| 68bebfad3a | |||
| a0f5b250b4 | |||
| cb70f2c3b3 | |||
| 5851954ca1 | |||
| c65f0bb0ac | |||
| 038254db48 | |||
| c1997b3d68 | |||
| 474a7dce00 | |||
| 382f33d021 | |||
| b743a762b4 | |||
| 302abd6b65 | |||
| 3f6ae4324b | |||
| dccded964b | |||
| ea09dd73c6 | |||
| c426b52a15 | |||
| 41e0a81c39 | |||
| 5b6f2f6e91 | |||
| bbea07ba9e | |||
| 0f0dca5514 | |||
| 3fb86dbac8 | |||
| 7e367c1e15 | |||
| 46e81963e2 | |||
| 4f1d4cde3d | |||
| 45c8fa9f19 | |||
| 87635d3cf7 | |||
| e5324c7562 | |||
| 03593def22 | |||
| 2ae5518c81 | |||
| bc45bf27c2 | |||
| 7d2c9776ea | |||
| fbf4fcc50c | |||
| 1868d698f5 | |||
| d858626be1 | |||
| f00ad8e0ea | |||
| 7b521aef02 | |||
| 4721b8da50 | |||
| b06af0e057 | |||
| 518dea482e | |||
| daf2f18369 | |||
| 9307d8abde | |||
| b3dbf2c71b | |||
| 4bb5f320c3 | |||
| f1357f09ed | |||
| e3eb63f158 | |||
| 47c0a399e1 | |||
| dfdd5250bd | |||
| ba7211126c | |||
| ef607434dd | |||
| f12838ea3b | |||
| dc88e11115 | |||
| e671ed748b | |||
| 98633a5cb6 | |||
| 6c1aeb0d0a | |||
| a2d41bcfba | |||
| 96ed5c671b | |||
| de12d277d0 | |||
| 3b8ec9efa6 | |||
| 39b079ddb9 | |||
| e2790d922a | |||
| afed2c1774 | |||
| 46a67c658c | |||
| 351afd6686 | |||
| 485374abba | |||
| 8ecd848307 | |||
| c4a13c8c10 | |||
| 313e9be99d | |||
| d79088ba05 | |||
| 3aa7abe73f | |||
| 8e38f27602 | |||
| 7543db2222 | |||
| 32e553e38d | |||
| 089a947c30 | |||
| 83a5ccce92 | |||
| 48de086d65 | |||
| 5a61b912bb | |||
| 4e92b22c5d | |||
| ede9697dae | |||
| 580b772c3c | |||
| 143b548102 | |||
| 15742c71f3 | |||
| 40f753e18b | |||
| 65f4048a41 | |||
| e78a198adf | |||
| 75d86ab296 | |||
| 62e48984bf | |||
| deb213d07a | |||
| 484c5e8bf3 | |||
| bb67fc991d | |||
| 7326a619da | |||
| 4ce5800a33 | |||
| 66a8af31b3 | |||
| 85fe76b5be | |||
| ffa1fd5da4 | |||
| 3d2c5633cd | |||
| 08ce522edb | |||
| ab007b4c44 | |||
| 2cf2442dc8 | |||
| 7354bfc163 | |||
| 7bca56ea80 | |||
| 42eb9ef518 | |||
| be4a1d8838 | |||
| fd523a7e4d | |||
| 650b56beee | |||
| 1e3f097e63 | |||
| 9fd5678ae4 | |||
| dcf6268444 | |||
| 1f4370af85 | |||
| ed458dc2b3 | |||
| 7cebc42266 | |||
| 0d819b215d | |||
| 8113fc3088 | |||
| 78bc0216fb | |||
| b74603c883 | |||
| 9e8b451462 | |||
| d25695be0e | |||
| ba9dc8e9ba | |||
| ddb9816158 | |||
| 33e19f58e0 | |||
| ece92765c9 | |||
| c2dea2ab8f | |||
| e0dea86134 | |||
| 8409c2ab9f | |||
| 3eb4181b9c | |||
| 0d33d44e75 | |||
| 6ea50f33e4 | |||
| 769b8f02c8 | |||
| d77da3fba3 | |||
| ea0c697afa | |||
| 6321bcf0d8 | |||
| 1e7e9b3513 | |||
| 63e7fb4187 | |||
| 453accc674 | |||
| a565601849 | |||
| e92a3b4a90 | |||
| 141ddafdc8 | |||
| 007561874d | |||
| b167124a70 | |||
| 879c68f8a3 | |||
| ccaee02c2e | |||
| ff498af6e8 | |||
| 9c3420bcc7 | |||
| 23a6719e99 | |||
| 95c1a93332 | |||
| 63a91bffde | |||
| d33b3c16e1 | |||
| 33e2ffbb6e | |||
| 491a73f517 | |||
| 54efc49bd8 | |||
| f6eaa64156 | |||
| ed1f21f333 | |||
| 0a0f1e9a04 | |||
| 64720ef0e0 | |||
| b213ae2faa | |||
| d7e0c240d0 | |||
| 56de23e2e6 | |||
| 0862408ee8 | |||
| b2b74e5c4d | |||
| 39da278394 | |||
| ec2f2753a2 | |||
| 89a0702d2b | |||
| 9d94e9684f | |||
| f8d01ae6d2 | |||
| 9f400543c2 | |||
| 3861bf5506 | |||
| 5c745735d7 | |||
| 886fb7f2db | |||
| 01d0d12af0 | |||
| c0f882845d | |||
| 7225fb25dc | |||
| 5ab46c604b | |||
| f3b29d97d0 | |||
| 9447f4e89b | |||
| 7db5386885 | |||
| 9c1617d423 | |||
| 4c4e3e4b10 | |||
| 4db50d2843 | |||
| ba5a59eee2 | |||
| 5e69c7bdce | |||
| 04d9640eff | |||
| 83480110fd | |||
| 5038068905 | |||
| 7388213715 | |||
| 0e1e64fe7d | |||
| f48a3be466 | |||
| 61835c05ba | |||
| 762a597eba | |||
| 69283fc611 | |||
| b0efe464c0 | |||
| a6fda86ebf | |||
| 4b363dab06 | |||
| 77ae5fd0b3 | |||
| 2890a663f3 | |||
| f263a33db2 | |||
| 99ee9c2f48 | |||
| 1cfb22fdd9 | |||
| bf85d511a8 | |||
| dc9dce2cd7 | |||
| 8333ae35a8 | |||
| ced018794f | |||
| bfb715e11a | |||
| 9e9f36e484 | |||
| 38031e2545 | |||
| 2dea7375ef | |||
| 48bfcec0a3 | |||
| 7a4c23fa33 | |||
| 0014be0e82 | |||
| 870bd6476c | |||
| 96d9b5e7b1 | |||
| 09a73d5828 | |||
| e14d1f1f68 | |||
| 9f6c39754b | |||
| eda9991e6a | |||
| 95e699fb63 | |||
| 618d5b5733 | |||
| 2ececa3206 | |||
| 4fddaba76b | |||
| 045df82445 | |||
| b3833be529 | |||
| f45aa6040e | |||
| 25b273a726 | |||
| 3e99420527 | |||
| f6e526b187 | |||
| 23567fba42 | |||
| 255a55d4c8 | |||
| d7ca855d9a | |||
| e8318e2eb3 | |||
| f4992aa378 | |||
| 97388be8e5 | |||
| dbad1a4832 | |||
| 40949474a1 | |||
| 1166b58447 | |||
| 2c7cfa8951 | |||
| 89621dbff5 | |||
| 18f688e4b3 | |||
| 354d9b2fde | |||
| bc7faadc02 | |||
| c265207c92 | |||
| 05678f1ddc | |||
| cf015c4219 | |||
| a11427a48f | |||
| c87d7e3875 | |||
| 75f6337985 | |||
| 71f33021cc | |||
| 5b52f13f4b | |||
| 0a8cbc8f08 | |||
| 28e907aafd | |||
| 7018796b93 | |||
| b28e21fa18 | |||
| afc53ce1b2 | |||
| 4b0564779f | |||
| dc5fd98cfd | |||
| e2c51ec45c | |||
| 38640354b0 | |||
| 0393fdad6d | |||
| 5fc0340603 | |||
| 99652c01ed | |||
| 580d50ab05 | |||
| cfa680f2d8 | |||
| e4e438e1ba | |||
| 4ec1a0e52c | |||
| f251a3497d | |||
| 05734d9e93 | |||
| 30e4291f14 | |||
| 88770b90ab | |||
| 5a22ce6321 | |||
| 62b30d2dad | |||
| 5a5004793a | |||
| d0cb0c001a | |||
| 7a246941f8 | |||
| c3ad0abd37 | |||
| 91d6ec1f26 | |||
| a863ea253e | |||
| f5789aaebd | |||
| 438fd2fe71 | |||
| 040094115b | |||
| d4bc2daa89 | |||
| 622920d8c0 | |||
| 2b9dd50a8d | |||
| ff44cdfd3c | |||
| 3b0cc4c712 | |||
| 71d73a9db4 | |||
| 4ef7511336 | |||
| 9b34fd8f8f | |||
| a5cc64c2fe | |||
| ce88c237a3 | |||
| cee8101b37 | |||
| 409663711b | |||
| decf925e5d | |||
| cbead7bbb0 | |||
| 05e5023354 | |||
| 3126605cd6 | |||
| 0b932c1993 | |||
| 5ed72f4af2 | |||
| 1a3aac4d05 | |||
| 573414dc83 | |||
| 7132655d42 | |||
| 318bf293ca | |||
| 3149f929c1 | |||
| 8acdbf03bf | |||
| 11a632511f | |||
| 33941d8ede | |||
| 01d217acb5 | |||
| 7c331fdb2c | |||
| f7d3cf32fd | |||
| 95ceb1241b | |||
| 5c9ff2f5fa | |||
| 6b5e251037 | |||
| 4905718024 | |||
| 00929789a1 | |||
| 8e3306f87f | |||
| 8ea4b7747d | |||
| 02852eb586 | |||
| 7d9d398844 | |||
| dfe6d10c07 | |||
| 80f4284e82 | |||
| c7c9b664e8 | |||
| e2de904f8a | |||
| 1f593812c8 | |||
| d3d0016d16 | |||
| b7adbde0d5 | |||
| 94bfb8c9e3 | |||
| 8949a3a8ee | |||
| 80b0d11319 | |||
| 49e8058f4e | |||
| fccce91ea5 | |||
| 8b117c8ed3 | |||
| e77fe61596 | |||
| 0da8b4c6dc | |||
| 726999c476 | |||
| f774cc689c | |||
| 498db43c62 | |||
| 89f1c6c71f | |||
| c801cb2a84 | |||
| f069be5789 | |||
| b4722177ca | |||
| a36695a240 | |||
| 148a3d23eb | |||
| e7e5363c0c | |||
| 93cc3bd2ce | |||
| 52a53b64dc | |||
| fa473d48a9 | |||
| 8774cfa31b | |||
| 8270ec3050 | |||
| 6113df21e0 | |||
| dbdb4daa58 | |||
| dd04da230f | |||
| 7606998ba6 | |||
| 0f0c10d26a | |||
| 88dd4a2aae | |||
| cc75af7cce | |||
| 7520998aca | |||
| ab28ae36e3 | |||
| 88826bd5f8 | |||
| 39a9dd4029 | |||
| 23fe55fdca | |||
| a31e388b3a | |||
| 3e241da2a4 | |||
| ce80d83c00 | |||
| f62fb69a4d | |||
| 782bf4e0b3 | |||
| 727066e54e | |||
| f13ecbaec7 | |||
| be390c3645 | |||
| fdfe379824 | |||
| da2cb85aa1 | |||
| 2b4598821b | |||
| 4cd911a114 | |||
| 5484cd69b5 | |||
| 1ff9421cea | |||
| c0e83af35e | |||
| 2c6d0b11dd | |||
| bab1cda97a | |||
| da24b6a1e2 | |||
| 2bb05b0248 | |||
| 96d82c5fc2 | |||
| 5175795814 | |||
| 049758431c | |||
| 762f103991 | |||
| 66aeeb8857 | |||
| d3a9c52ec5 | |||
| dea93938e6 | |||
| 890a42b3ee | |||
| 38f591c521 | |||
| 14ec080a23 | |||
| 48da572df0 | |||
| 0cb77802be | |||
| dacfe11d95 | |||
| cc58b41901 | |||
| 04a2417f02 | |||
| 9e74ffd9be | |||
| dec4045e25 | |||
| 4daf410cce | |||
| cf604b5fb0 | |||
| 8738e5b122 | |||
| 38bea19a7b | |||
| bf70de83f1 | |||
| f478751080 | |||
| a18ce4e6dd | |||
| e77bc5c9e5 | |||
| 7e39274da2 | |||
| 4ad05a3445 | |||
| 4e25db0f20 | |||
| 98b492bd89 | |||
| 461d59984f | |||
| 796a67f207 | |||
| 2d4247f10e | |||
| d4028fefa8 | |||
| 7e5726c255 | |||
| 1873330e61 | |||
| 9c9316466b | |||
| 123c809e14 | |||
| 8172e672de | |||
| 4d1771649a | |||
| c91925f243 | |||
| 87116b871b | |||
| 3547c57de0 | |||
| 2d8a60aa75 | |||
| dd773bc261 | |||
| 535c2f53c1 | |||
| c8cde246a9 | |||
| bc66d96d8b | |||
| 6c55f42ce2 | |||
| 679044f33d | |||
| ac53fdbbff | |||
| 0b78547ba1 | |||
| 0ebab8bad3 | |||
| ab7d3a5e03 | |||
| 2f79bbe067 | |||
| b8b5b7197c | |||
| 554a461c95 | |||
| 1efb6c4a80 | |||
| 377d6a0d25 | |||
| 72bed7a1ba |
+33
-44
@@ -90,7 +90,6 @@ option(DUSK_ENABLE_SENTRY_NATIVE "Enable sentry-native crash reporting support"
|
|||||||
option(DUSK_PACKAGE_INSTALL "Install Dusklight with a Linux-native file structure" OFF)
|
option(DUSK_PACKAGE_INSTALL "Install Dusklight with a Linux-native file structure" OFF)
|
||||||
option(DUSK_GFX_DEBUG_GROUPS "Report debug groups to the native graphics API" ${DUSK_GFX_DEBUG_GROUPS_DEFAULT})
|
option(DUSK_GFX_DEBUG_GROUPS "Report debug groups to the native graphics API" ${DUSK_GFX_DEBUG_GROUPS_DEFAULT})
|
||||||
option(DUSK_ENABLE_CODE_MODS "Enable code mods" OFF)
|
option(DUSK_ENABLE_CODE_MODS "Enable code mods" OFF)
|
||||||
option(DUSK_ENABLE_OPUS "Enable loading Opus audio files for mods" ON)
|
|
||||||
|
|
||||||
set(DUSK_HAS_FUNCHOOK OFF)
|
set(DUSK_HAS_FUNCHOOK OFF)
|
||||||
if (DUSK_ENABLE_CODE_MODS AND (NOT APPLE OR CMAKE_SYSTEM_NAME STREQUAL "Darwin"))
|
if (DUSK_ENABLE_CODE_MODS AND (NOT APPLE OR CMAKE_SYSTEM_NAME STREQUAL "Darwin"))
|
||||||
@@ -194,21 +193,24 @@ if (DUSK_MOVIE_SUPPORT)
|
|||||||
endif ()
|
endif ()
|
||||||
endif ()
|
endif ()
|
||||||
|
|
||||||
if (CMAKE_CXX_COMPILER_FRONTEND_VARIANT STREQUAL "GNU")
|
if (CMAKE_SYSTEM_NAME STREQUAL Linux)
|
||||||
# -Wno-multichar: Multi-character constants ('ABCD') are implementation-defined but all compilers
|
# -Wno-multichar: Multi-character constants ('ABCD') are implementation-defined but all compilers
|
||||||
# (CW, GCC, Clang, MSVC) encode them identically in big-endian order.
|
# (CW, GCC, Clang, MSVC) encode them identically in big-endian order.
|
||||||
# For >4-char literals (which GCC/Clang truncate to int), use the MULTI_CHAR() macro.
|
# For >4-char literals (which GCC/Clang truncate to int), use the MULTI_CHAR() macro.
|
||||||
# -Wdeprecated-declarations: JSystem uses std::iterator, deprecated in C++17
|
# -Wdeprecated-declarations: JSystem uses std::iterator, deprecated in C++17
|
||||||
|
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-multichar")
|
||||||
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-multichar -Wno-trigraphs -Wno-deprecated-declarations")
|
||||||
|
set(CMAKE_INSTALL_RPATH "$ORIGIN")
|
||||||
|
set(CMAKE_BUILD_RPATH "$ORIGIN")
|
||||||
|
elseif (APPLE)
|
||||||
|
add_compile_options(-Wno-declaration-after-statement -Wno-non-pod-varargs)
|
||||||
|
set(CMAKE_INSTALL_RPATH "@loader_path")
|
||||||
|
set(CMAKE_BUILD_RPATH "@loader_path")
|
||||||
|
elseif (MSVC)
|
||||||
add_compile_options(
|
add_compile_options(
|
||||||
$<$<COMPILE_LANGUAGE:C,CXX>:-Wno-multichar>
|
$<$<COMPILE_LANGUAGE:C,CXX>:/bigobj>
|
||||||
$<$<COMPILE_LANGUAGE:CXX>:-Wno-trigraphs>
|
$<$<COMPILE_LANGUAGE:C,CXX>:/MP>
|
||||||
$<$<COMPILE_LANGUAGE:CXX>:-Wno-deprecated-declarations>
|
$<$<COMPILE_LANGUAGE:C,CXX>:/FS>
|
||||||
)
|
|
||||||
elseif (CMAKE_CXX_COMPILER_FRONTEND_VARIANT STREQUAL "MSVC")
|
|
||||||
add_compile_options(
|
|
||||||
$<$<COMPILE_LANGUAGE:C,CXX>:/bigobj>
|
|
||||||
$<$<COMPILE_LANGUAGE:C,CXX>:/MP>
|
|
||||||
$<$<COMPILE_LANGUAGE:C,CXX>:/FS>
|
|
||||||
)
|
)
|
||||||
|
|
||||||
if (NOT DUSK_BUILD_WARNINGS)
|
if (NOT DUSK_BUILD_WARNINGS)
|
||||||
@@ -223,15 +225,6 @@ elseif (CMAKE_CXX_COMPILER_FRONTEND_VARIANT STREQUAL "MSVC")
|
|||||||
add_compile_options($<$<COMPILE_LANGUAGE:C,CXX>:/utf-8>)
|
add_compile_options($<$<COMPILE_LANGUAGE:C,CXX>:/utf-8>)
|
||||||
endif ()
|
endif ()
|
||||||
|
|
||||||
if (CMAKE_SYSTEM_NAME STREQUAL Linux)
|
|
||||||
set(CMAKE_INSTALL_RPATH "$ORIGIN")
|
|
||||||
set(CMAKE_BUILD_RPATH "$ORIGIN")
|
|
||||||
elseif (APPLE)
|
|
||||||
add_compile_options(-Wno-declaration-after-statement -Wno-non-pod-varargs)
|
|
||||||
set(CMAKE_INSTALL_RPATH "@loader_path")
|
|
||||||
set(CMAKE_BUILD_RPATH "@loader_path")
|
|
||||||
endif ()
|
|
||||||
|
|
||||||
include(FetchContent)
|
include(FetchContent)
|
||||||
|
|
||||||
# Declare all dependencies first so CMake can download them in parallel
|
# Declare all dependencies first so CMake can download them in parallel
|
||||||
@@ -255,25 +248,6 @@ FetchContent_Declare(miniz
|
|||||||
)
|
)
|
||||||
|
|
||||||
set(_fetch_content_deps cxxopts json miniz)
|
set(_fetch_content_deps cxxopts json miniz)
|
||||||
|
|
||||||
if (DUSK_ENABLE_OPUS)
|
|
||||||
message(STATUS "dusklight: Fetching opusfile")
|
|
||||||
|
|
||||||
# Opusfile options
|
|
||||||
SET(OP_DISABLE_HTTP ON CACHE BOOL "" FORCE)
|
|
||||||
SET(OP_DISABLE_DOCS ON CACHE BOOL "" FORCE)
|
|
||||||
SET(OP_DISABLE_EXAMPLES ON CACHE BOOL "" FORCE)
|
|
||||||
|
|
||||||
message(STATUS "dusklight: Fetching opusfile")
|
|
||||||
FetchContent_Declare(
|
|
||||||
opusfile
|
|
||||||
GIT_REPOSITORY https://github.com/xiph/opusfile.git
|
|
||||||
GIT_TAG 6dfd29e7adb87f2e193575fc3fa88cbf1a0b27df
|
|
||||||
)
|
|
||||||
|
|
||||||
list(APPEND _fetch_content_deps opusfile)
|
|
||||||
endif ()
|
|
||||||
|
|
||||||
if (DUSK_HAS_FUNCHOOK)
|
if (DUSK_HAS_FUNCHOOK)
|
||||||
message(STATUS "dusklight: Fetching funchook")
|
message(STATUS "dusklight: Fetching funchook")
|
||||||
# cmake/PatchFunchook.cmake patches funchook's cmake/capstone.cmake.in to inject a
|
# cmake/PatchFunchook.cmake patches funchook's cmake/capstone.cmake.in to inject a
|
||||||
@@ -366,10 +340,6 @@ set(GAME_LIBS aurora::core aurora::gx aurora::gd aurora::si aurora::vi aurora::p
|
|||||||
if (DUSK_HAS_FUNCHOOK)
|
if (DUSK_HAS_FUNCHOOK)
|
||||||
list(APPEND GAME_LIBS funchook-static)
|
list(APPEND GAME_LIBS funchook-static)
|
||||||
endif ()
|
endif ()
|
||||||
if (DUSK_ENABLE_OPUS)
|
|
||||||
list(APPEND GAME_LIBS OpusFile::opusfile)
|
|
||||||
list(APPEND GAME_COMPILE_DEFS DUSK_OPUS=1)
|
|
||||||
endif ()
|
|
||||||
|
|
||||||
if (DUSK_ENABLE_SENTRY_NATIVE)
|
if (DUSK_ENABLE_SENTRY_NATIVE)
|
||||||
list(APPEND GAME_LIBS sentry)
|
list(APPEND GAME_LIBS sentry)
|
||||||
@@ -428,6 +398,8 @@ if (DUSK_MOVIE_SUPPORT)
|
|||||||
list(APPEND GAME_COMPILE_DEFS MOVIE_SUPPORT=1)
|
list(APPEND GAME_COMPILE_DEFS MOVIE_SUPPORT=1)
|
||||||
endif ()
|
endif ()
|
||||||
|
|
||||||
|
include(src/dusk/randomizer/randomizer.cmake)
|
||||||
|
|
||||||
set(DUSK_ENABLE_DISCORD_DEFAULT ON)
|
set(DUSK_ENABLE_DISCORD_DEFAULT ON)
|
||||||
if (DEFINED DUSK_ENABLE_DISCORD_RPC AND NOT DEFINED DUSK_ENABLE_DISCORD)
|
if (DEFINED DUSK_ENABLE_DISCORD_RPC AND NOT DEFINED DUSK_ENABLE_DISCORD)
|
||||||
set(DUSK_ENABLE_DISCORD_DEFAULT ${DUSK_ENABLE_DISCORD_RPC})
|
set(DUSK_ENABLE_DISCORD_DEFAULT ${DUSK_ENABLE_DISCORD_RPC})
|
||||||
@@ -509,6 +481,24 @@ if (ENABLE_ASAN)
|
|||||||
target_sources(dusklight PRIVATE src/dusk/asan_options.c)
|
target_sources(dusklight PRIVATE src/dusk/asan_options.c)
|
||||||
endif ()
|
endif ()
|
||||||
|
|
||||||
|
# Add embedded data to target
|
||||||
|
|
||||||
|
file(GLOB_RECURSE RANDOMIZER_DATA "src/dusk/randomizer/generator/data/*")
|
||||||
|
file(GLOB_RECURSE RANDOMIZER_ASSETS "src/dusk/randomizer/assets/*")
|
||||||
|
list(APPEND RANDOMIZER_DATA ${RANDOMIZER_ASSETS})
|
||||||
|
set(RANDO_ROOT_DATA_DIR ${CMAKE_CURRENT_SOURCE_DIR})
|
||||||
|
|
||||||
|
foreach (RANDOMIZER_FILE IN LISTS RANDOMIZER_DATA)
|
||||||
|
file(RELATIVE_PATH REL_PATH ${RANDO_ROOT_DATA_DIR} ${RANDOMIZER_FILE})
|
||||||
|
if(REL_PATH MATCHES "^src/dusk/randomizer/generator/data/tests")
|
||||||
|
message(STATUS "Skipping Embed: ${REL_PATH}")
|
||||||
|
continue()
|
||||||
|
endif ()
|
||||||
|
|
||||||
|
message(STATUS "Embedding File: ${REL_PATH}")
|
||||||
|
b_embed(dusklight ${REL_PATH})
|
||||||
|
endforeach ()
|
||||||
|
|
||||||
target_compile_definitions(dusklight PRIVATE ${GAME_COMPILE_DEFS})
|
target_compile_definitions(dusklight PRIVATE ${GAME_COMPILE_DEFS})
|
||||||
target_include_directories(dusklight PRIVATE ${miniz_SOURCE_DIR})
|
target_include_directories(dusklight PRIVATE ${miniz_SOURCE_DIR})
|
||||||
target_link_libraries(dusklight PRIVATE aurora::main ${GAME_LIBS} ${JSYSTEM_LINK_LIBRARIES})
|
target_link_libraries(dusklight PRIVATE aurora::main ${GAME_LIBS} ${JSYSTEM_LINK_LIBRARIES})
|
||||||
@@ -641,7 +631,6 @@ if (DUSK_ENABLE_CODE_MODS AND CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR
|
|||||||
add_subdirectory(mods/ao_mod)
|
add_subdirectory(mods/ao_mod)
|
||||||
add_subdirectory(mods/shadow_mod)
|
add_subdirectory(mods/shadow_mod)
|
||||||
add_subdirectory(mods/window_demo)
|
add_subdirectory(mods/window_demo)
|
||||||
add_subdirectory(mods/audio_mod)
|
|
||||||
endif ()
|
endif ()
|
||||||
|
|
||||||
if (APPLE)
|
if (APPLE)
|
||||||
|
|||||||
@@ -1,26 +0,0 @@
|
|||||||
#pragma endian big
|
|
||||||
|
|
||||||
#include "std/sys.pat"
|
|
||||||
#include "type/magic.pat"
|
|
||||||
#include "std/array.pat"
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Wrapper for a file-global pointer that allows it to be stored in an array.
|
|
||||||
*/
|
|
||||||
struct Offset<T> {
|
|
||||||
T* offset : u32 [[inline]];
|
|
||||||
};
|
|
||||||
|
|
||||||
struct JAUSeqCollectionTable {
|
|
||||||
u32 mEntryCount;
|
|
||||||
u32 mBmsOffset[mEntryCount];
|
|
||||||
};
|
|
||||||
|
|
||||||
struct JAUSeqCollectionData {
|
|
||||||
type::Magic<"SC"> mMagic;
|
|
||||||
u16 mNumSoundCategories;
|
|
||||||
u32 mSectionSize;
|
|
||||||
Offset<JAUSeqCollectionTable> mTableOffsets[mNumSoundCategories];
|
|
||||||
};
|
|
||||||
|
|
||||||
JAUSeqCollectionData data @ 0x0;
|
|
||||||
@@ -1,71 +0,0 @@
|
|||||||
#pragma endian big
|
|
||||||
|
|
||||||
#include "std/sys.pat"
|
|
||||||
#include "type/magic.pat"
|
|
||||||
#include "std/array.pat"
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Wrapper for a file-global pointer that allows it to be stored in an array.
|
|
||||||
*/
|
|
||||||
struct Offset<T> {
|
|
||||||
T* offset : u32 [[inline]];
|
|
||||||
};
|
|
||||||
|
|
||||||
struct ItemSoundEffect {
|
|
||||||
u8 mPriority;
|
|
||||||
u8 mVolume;
|
|
||||||
padding[2];
|
|
||||||
u32 mSwBit;
|
|
||||||
float mPitch;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct ItemSequence {
|
|
||||||
u8 mPriority;
|
|
||||||
u8 mVolume;
|
|
||||||
u16 mResourceId;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct ItemStream {
|
|
||||||
u8 mPriority;
|
|
||||||
u8 mVolume;
|
|
||||||
u16 mStreamPanParameters;
|
|
||||||
char* mStreamFilePath[] : u32;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct SoundTableGroupEntry {
|
|
||||||
u8 mTypeId;
|
|
||||||
if (mTypeId == 0x51) {
|
|
||||||
ItemSoundEffect* mOffset : u24 [[inline]];
|
|
||||||
} else if (mTypeId == 0x60) {
|
|
||||||
ItemSequence* mOffset : u24 [[inline]];
|
|
||||||
} else if (mTypeId == 0x70 || mTypeId == 0x71) {
|
|
||||||
ItemStream* mOffset : u24 [[inline]];
|
|
||||||
} else {
|
|
||||||
u24 mOffset;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
struct TGroup {
|
|
||||||
u32 mNumItems;
|
|
||||||
padding[4];
|
|
||||||
SoundTableGroupEntry mEntries[mNumItems];
|
|
||||||
};
|
|
||||||
|
|
||||||
struct TSection {
|
|
||||||
u32 mNumGroups;
|
|
||||||
Offset<TGroup> mGroupOffsets[mNumGroups];
|
|
||||||
};
|
|
||||||
|
|
||||||
struct Root {
|
|
||||||
u32 mSectionNumber;
|
|
||||||
Offset<TSection> mSectionOffsets[mSectionNumber];
|
|
||||||
};
|
|
||||||
|
|
||||||
struct THeader {
|
|
||||||
type::Magic<"BST "> mMagic;
|
|
||||||
|
|
||||||
padding[8];
|
|
||||||
Root* mRoot : u32;
|
|
||||||
};
|
|
||||||
|
|
||||||
THeader header @ 0x0;
|
|
||||||
@@ -1,228 +0,0 @@
|
|||||||
#pragma endian big
|
|
||||||
|
|
||||||
#include "std/sys.pat"
|
|
||||||
#include "type/magic.pat"
|
|
||||||
#include "std/array.pat"
|
|
||||||
|
|
||||||
/*
|
|
||||||
WSYS file
|
|
||||||
The WSYS file contains roughly two sections: WBCT and WINF.
|
|
||||||
WBCT contains the mapping of Wave ID -> wave archives.
|
|
||||||
WINF are the wave archives themselves and their metadata.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Wrapper for a file-global pointer that allows it to be stored in an array.
|
|
||||||
*/
|
|
||||||
struct Offset<T> {
|
|
||||||
T* offset : u32 [[inline]];
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Format that audio data is in..
|
|
||||||
*/
|
|
||||||
enum WaveFormat : u8 {
|
|
||||||
/**
|
|
||||||
* 16-samples-per-9-bytes custom Nintendo ADPCM.
|
|
||||||
*/
|
|
||||||
ADPCM4 = 0,
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 16-samples-per-5-bytes custom Nintendo ADPCM.
|
|
||||||
*/
|
|
||||||
ADPCM2 = 1,
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 8-bit-per-sample PCM.
|
|
||||||
*/
|
|
||||||
PCM8 = 2,
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 16-bit-per-sample PCM.
|
|
||||||
*/
|
|
||||||
PCM16 = 3,
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Defines playback info for a single audio "wave".
|
|
||||||
* This data is stored per archive, making it duplicated (except for mAWOffsetStart)
|
|
||||||
*/
|
|
||||||
struct TWave {
|
|
||||||
padding[1]; // unknown
|
|
||||||
WaveFormat mWaveFormat;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Key (as in like, the musical term) this sample is in.
|
|
||||||
*/
|
|
||||||
u8 mBaseKey;
|
|
||||||
padding[1];
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Sample rate of the audio in Hz.
|
|
||||||
*/
|
|
||||||
float mSampleRate;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Position where the sample data starts.
|
|
||||||
* This is in the .aw file for the archive containing this TWave.
|
|
||||||
*/
|
|
||||||
u32 mAWOffsetStart;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Byte length of the sample data.
|
|
||||||
*/
|
|
||||||
u32 mAWLength;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Indicates whether the sample should loop or not. All bits appear set if so.
|
|
||||||
*/
|
|
||||||
u32 mLoopFlags;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Audio sample at which the loop starts.
|
|
||||||
*/
|
|
||||||
u32 mLoopStartSample;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Audio sample at which the loop ends (and goes back to mLoopStartSample).
|
|
||||||
*/
|
|
||||||
u32 mLoopEndSample;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Total sample count in this wave.
|
|
||||||
*/
|
|
||||||
u32 mSampleCount;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Last sample for continuing ADPCM decode after loop.
|
|
||||||
*/
|
|
||||||
s16 mpLast;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Penult sample for continuing ADPCM decode after loop.
|
|
||||||
*/
|
|
||||||
s16 mpPenult;
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* A single wave archive on disk.
|
|
||||||
* These are paired 1:1 with TCtrlScene objects.
|
|
||||||
*/
|
|
||||||
struct TWaveArchive {
|
|
||||||
/**
|
|
||||||
* Filename of the raw sample data on disc. Relative to /Audiores/Waves/
|
|
||||||
*/
|
|
||||||
char mFileName[0x70];
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Amount of waves in this archive.
|
|
||||||
* Matches the count in the paired TCtrl object.
|
|
||||||
*/
|
|
||||||
u32 mWaveCount;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Offsets to the wave metadata (not sample data) in the WSYS.
|
|
||||||
* These are paired 1:1 to the TCtrlWaves, and the TCtrlWave contains the actual
|
|
||||||
* "Wave ID" used by the game for lookups.
|
|
||||||
*/
|
|
||||||
Offset<TWave> waveOffsets[mWaveCount];
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Header containing data for wave archives and their metadata.
|
|
||||||
*/
|
|
||||||
struct TWaveArchiveBank {
|
|
||||||
type::Magic<"WINF"> mMagic;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Amount of archives in this wave bank.
|
|
||||||
* Matches the value in TCtrlGroup.
|
|
||||||
*/
|
|
||||||
u32 mArchiveCounts;
|
|
||||||
Offset<TWaveArchive> mArchiveOffsets[mArchiveCounts];
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Definition for a single wave in a control group.
|
|
||||||
*/
|
|
||||||
struct TCtrlWave {
|
|
||||||
/**
|
|
||||||
* Group ID matches the index of the control group this item is referenced by.
|
|
||||||
*/
|
|
||||||
u16 mGroupId;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Wave ID used by the game to look this wave up.
|
|
||||||
*/
|
|
||||||
u16 mWaveId;
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Contains the actual data for a TCtrlScene.
|
|
||||||
* Why is this separate? Who knows.
|
|
||||||
*/
|
|
||||||
struct TCtrl {
|
|
||||||
// Other versions of this struct with different magic (C-EX and C-ST) also exist in the file.
|
|
||||||
// They aren't pointed to so we don't need to worry about them.
|
|
||||||
type::Magic<"C-DF"> mMagic;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Amount of waves in this group.
|
|
||||||
* Matches the value in TWaveArchive.
|
|
||||||
*/
|
|
||||||
u32 waveCount;
|
|
||||||
Offset<TCtrlWave> mWaveOffsets[waveCount];
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* A single scene or "group" of waves that are loaded at once.
|
|
||||||
*/
|
|
||||||
struct TCtrlScene {
|
|
||||||
type::Magic<"SCNE"> mMagic;
|
|
||||||
|
|
||||||
padding[8]; // unknown
|
|
||||||
TCtrl* mCtrlOffset : u32 [[inline]];
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Contains the "control" section of the WSYS.
|
|
||||||
*/
|
|
||||||
struct TCtrlGroup {
|
|
||||||
type::Magic<"WBCT"> mMagic;
|
|
||||||
|
|
||||||
padding[4]; // unknown
|
|
||||||
u32 mGroupCount;
|
|
||||||
|
|
||||||
Offset<TCtrlScene> mCtrlSceneOffsets[mGroupCount];
|
|
||||||
};
|
|
||||||
|
|
||||||
struct THeader {
|
|
||||||
type::Magic<"WSYS"> mMagic;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Size of WSYS in bytes.
|
|
||||||
*/
|
|
||||||
u32 mSize;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* ID of wave bank.
|
|
||||||
* This matches the value passed to the BAA load command.
|
|
||||||
* The game originally does not use this value itself, but Dusklight does rely on it.
|
|
||||||
*/
|
|
||||||
u32 mId;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Total amount of waves in this wave bank.
|
|
||||||
* (not groups! Waves!)
|
|
||||||
*/
|
|
||||||
u32 mWaveTableSize;
|
|
||||||
|
|
||||||
TWaveArchiveBank* archiveBankOffset : u32;
|
|
||||||
TCtrlGroup* ctrlGroupOffset : u32;
|
|
||||||
};
|
|
||||||
|
|
||||||
THeader header @ 0x0;
|
|
||||||
|
|
||||||
std::assert(
|
|
||||||
header.archiveBankOffset.mArchiveCounts == header.ctrlGroupOffset.mGroupCount,
|
|
||||||
"Control group and archive count does not match!");
|
|
||||||
@@ -1,90 +0,0 @@
|
|||||||
# JAudio
|
|
||||||
|
|
||||||
**JAudio** is the name for the audio engine used by Twilight Princess (along with many other Nintendo games from the era). TP uses exclusively JAudio v2, while other games use v1 or a mix of v1 and v2 infrastructure. This document will primarily focus on TP's use case, but best efforts will be made to document where behavior is TP-specific.
|
|
||||||
|
|
||||||
## Common concepts
|
|
||||||
|
|
||||||
Audio is almost exclusively
|
|
||||||
|
|
||||||
### `JAISoundID`
|
|
||||||
|
|
||||||
A "sound", be that a _sound effect_ or music, is referenced in-code through the `JAISoundID` type. This is a `u32` that the game uses to look up the relevant sound. The actual value is bitpacked (BE) from the following fields:
|
|
||||||
|
|
||||||
| Type | Field | Description |
|
|
||||||
|-------|------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
|
|
||||||
| `u8` | Section ID | Section of the Sound Table this sound effect is located in. 0 for sound effects, 1 for sequenced music, 2 for streamed music.[^sectionids] |
|
|
||||||
| `u8` | Group ID | ID of group further used to organize inside the Sound Table's Section. Sound effects are grouped into things like "SYSTEM" and "ENEMY", other sections leave this at 0. |
|
|
||||||
| `u16` | "Wave ID" | Index inside the group to look up the sound at.<br/>**Note** that the term "wave" in code is extremely confusing[^waveterm]; it does **not** refer to audio samples ("waves") in the wave banks directly. |
|
|
||||||
|
|
||||||
[^sectionids]: JAudio itself can seemingly work outside this convention, however it is enforced by some TP-specific game code.
|
|
||||||
|
|
||||||
[^waveterm]: Possibly vestigial from JAudio v1, where I believe there were less layers of indirection.
|
|
||||||
|
|
||||||
## Disc files
|
|
||||||
|
|
||||||
All audio data is stored in `/Audiores` on the disc. Files are as follows:
|
|
||||||
|
|
||||||
### `/Audiores/Seqs/Z2SoundSeqs.arc`
|
|
||||||
|
|
||||||
Contains the BMS instructions for all BMS-based music and sound effects. Not all data is kept in memory at once.
|
|
||||||
|
|
||||||
### `/Audiores/Stream/*.ast`
|
|
||||||
|
|
||||||
Contains individual streamed music. Each file is a separate music track. See [this page](https://www.lumasworkshop.com/wiki/AST_(File_Format)) for file format description.
|
|
||||||
|
|
||||||
### `/Audiores/Waves/*.aw`
|
|
||||||
|
|
||||||
Contains audio sample data for sequenced music and sound effects. These files are pure meat, no bone: they are loaded directly into ARAM and all metadata is stored in the BAA WSYS sections.
|
|
||||||
|
|
||||||
Each file contains audio samples for one "scene", with factors like the current level determining what "scenes" are made resident in memory. There is tons of duplicate data between scenes, presumably to increase simplicity and loading performance.
|
|
||||||
|
|
||||||
### `/Audiores/Z2Sound.baa`
|
|
||||||
|
|
||||||
Contains all remaining metadata for the audio system. This is effectively a container for a bunch of different sub-sections. The file starts with a bunch of "commands" that indicate where other data in the file is. Each command has a 4-character identifier and depending on the command will be followed by some extra arguments before the next command.
|
|
||||||
|
|
||||||
The commands used by TP's BAA file are as follows (note that the decompiled code has support for more load commands, which are unused):
|
|
||||||
|
|
||||||
| Command/Argument | Value | Description |
|
|
||||||
|------------------|-----------------|-------------------------------------------------------------------------------------------------------------------------------------------|
|
|
||||||
| Command | `AA_<` | Start of BAA commands. Must be at the start of the file and only appear once. |
|
|
||||||
| Command | `>_AA` | End of BAA commands. |
|
|
||||||
| Command | `ws `[^spaces] | Wave bank/WSYS data. Defines where audio samples are located on disc. |
|
|
||||||
| Argument | u32 | Wave bank ID, max 255. In TP, 0 is sound effects, 1 is music samples. |
|
|
||||||
| Argument | u32 | File offset for start of `WSYS` data |
|
|
||||||
| Argument | u32 | Bit field selecting which groups (= `.aw` files) to load immediately. TP leaves this at zero.[^32ws] |
|
|
||||||
| Command | `bnk `[^spaces] | Instrument bank/IBNK |
|
|
||||||
| Argument | u32 | Target wave bank ID |
|
|
||||||
| Argument | u32 | File offset for start of `IBNK` data |
|
|
||||||
| Command | `bsc `[^spaces] | Sound effect sequence collection. |
|
|
||||||
| Argument | u32 | File offset for start of `SC` data. |
|
|
||||||
| Argument | u32 | File offset for end of `SC` data. |
|
|
||||||
| Command | `bst `[^spaces] | Sound table. Defines parameters for music and sound effects. |
|
|
||||||
| Argument | u32 | File offset for start of `BST `[^spaces] data. |
|
|
||||||
| Argument | u32 | File offset for end of `BST `[^spaces] data. |
|
|
||||||
| Command | `bstn` | Sound name table. Defines names of all music and sound effects. Present on disc, but loading is disabled on release versions of the game. |
|
|
||||||
| Argument | u32 | File offset for start of `BSTN` data. |
|
|
||||||
| Argument | u32 | File offset for end of `BSTN` data. |
|
|
||||||
| Command | `bfca` | Unknown, something related to initialization of DSP FX data. |
|
|
||||||
| Argument | u32 | File offset for start of `RARC` data. |
|
|
||||||
|
|
||||||
[^spaces]: Padded with spaces.
|
|
||||||
|
|
||||||
[^32ws]: Both of TP's wave banks have far more than 32 groups, and seemingly this mechanism would not be able to deal with that.
|
|
||||||
|
|
||||||
Following is data descriptions for the remaining data in the `.BAA`, as pointed to by the above commands.
|
|
||||||
|
|
||||||
### `WSYS` / Wave banks
|
|
||||||
|
|
||||||
`WSYS` / Wave bank data defines where a set of audio samples can be found on disc. Each wave bank is made of multiple "groups", where each group corresponds to one `.aw` file on disc. Each group has a set of "wave IDs" it contains, along with the metadata (e.g. sample rate) and data offset in the `.aw` file.
|
|
||||||
|
|
||||||
Multiple groups can contain the same wave ID, thus meaning the raw audio samples can be duplicated on disk.
|
|
||||||
|
|
||||||
For the actual binary layout of this data, check [the ImHex pattern](imhex/jaudio/wsys.hexpat)
|
|
||||||
|
|
||||||
*Relevant classes: `JASWSParser`, `JASBasicWaveBank`, `JASSimpleWaveBank`.*
|
|
||||||
|
|
||||||
## Further reading & credits
|
|
||||||
|
|
||||||
* https://www.lumasworkshop.com/wiki/SMR.szs (note that details like the exact layout of the BAA are not the same as TP)
|
|
||||||
* XAYRGA for doing much RE work and making [JAMTools](https://xayr.gay/tools/SoundModdingToolkit/)
|
|
||||||
* The decompiled source code, duh.
|
|
||||||
+144
-5
@@ -1458,6 +1458,8 @@ set(DUSK_FILES
|
|||||||
src/dusk/imgui/ImGuiHeapOverlay.cpp
|
src/dusk/imgui/ImGuiHeapOverlay.cpp
|
||||||
src/dusk/imgui/ImGuiMenuTools.cpp
|
src/dusk/imgui/ImGuiMenuTools.cpp
|
||||||
src/dusk/imgui/ImGuiMenuTools.hpp
|
src/dusk/imgui/ImGuiMenuTools.hpp
|
||||||
|
src/dusk/imgui/ImGuiMenuRandomizer.cpp
|
||||||
|
src/dusk/imgui/ImGuiMenuRandomizer.hpp
|
||||||
src/dusk/imgui/ImGuiProcessOverlay.cpp
|
src/dusk/imgui/ImGuiProcessOverlay.cpp
|
||||||
src/dusk/imgui/ImGuiSaveEditor.cpp
|
src/dusk/imgui/ImGuiSaveEditor.cpp
|
||||||
src/dusk/imgui/ImGuiStateShare.cpp
|
src/dusk/imgui/ImGuiStateShare.cpp
|
||||||
@@ -1485,10 +1487,6 @@ set(DUSK_FILES
|
|||||||
src/dusk/mods/log_buffer.hpp
|
src/dusk/mods/log_buffer.hpp
|
||||||
src/dusk/mods/manifest.cpp
|
src/dusk/mods/manifest.cpp
|
||||||
src/dusk/mods/manifest.hpp
|
src/dusk/mods/manifest.hpp
|
||||||
src/dusk/mods/svc/audio_res/audio_res.hpp
|
|
||||||
src/dusk/mods/svc/audio_res/audio_res.cpp
|
|
||||||
src/dusk/mods/svc/audio_res/wave.cpp
|
|
||||||
src/dusk/mods/svc/audio_res/opus.cpp
|
|
||||||
src/dusk/mods/svc/camera.cpp
|
src/dusk/mods/svc/camera.cpp
|
||||||
src/dusk/mods/svc/config.cpp
|
src/dusk/mods/svc/config.cpp
|
||||||
src/dusk/mods/svc/config.hpp
|
src/dusk/mods/svc/config.hpp
|
||||||
@@ -1524,6 +1522,8 @@ set(DUSK_FILES
|
|||||||
src/dusk/ui/component.hpp
|
src/dusk/ui/component.hpp
|
||||||
src/dusk/ui/controller_config.cpp
|
src/dusk/ui/controller_config.cpp
|
||||||
src/dusk/ui/controller_config.hpp
|
src/dusk/ui/controller_config.hpp
|
||||||
|
src/dusk/ui/cosmetics.hpp
|
||||||
|
src/dusk/ui/cosmetics.cpp
|
||||||
src/dusk/ui/controls.hpp
|
src/dusk/ui/controls.hpp
|
||||||
src/dusk/ui/document.cpp
|
src/dusk/ui/document.cpp
|
||||||
src/dusk/ui/document.hpp
|
src/dusk/ui/document.hpp
|
||||||
@@ -1582,14 +1582,153 @@ set(DUSK_FILES
|
|||||||
src/dusk/ui/warp.hpp
|
src/dusk/ui/warp.hpp
|
||||||
src/dusk/ui/window.cpp
|
src/dusk/ui/window.cpp
|
||||||
src/dusk/ui/window.hpp
|
src/dusk/ui/window.hpp
|
||||||
|
src/dusk/ui/rando_config.cpp
|
||||||
|
src/dusk/ui/rando_config.hpp
|
||||||
|
src/dusk/ui/rando_seed_generation.cpp
|
||||||
|
src/dusk/ui/rando_seed_generation.hpp
|
||||||
|
src/dusk/achievements.cpp
|
||||||
|
src/dusk/iso_validate.cpp
|
||||||
|
src/dusk/livesplit.cpp
|
||||||
|
src/dusk/OSContext.cpp
|
||||||
|
src/dusk/OSReport.cpp
|
||||||
|
src/dusk/OSThread.cpp
|
||||||
|
src/dusk/OSMutex.cpp
|
||||||
|
src/dusk/mods/log_buffer.cpp
|
||||||
|
src/dusk/mods/log_buffer.hpp
|
||||||
|
src/dusk/mods/manifest.cpp
|
||||||
|
src/dusk/mods/manifest.hpp
|
||||||
|
src/dusk/mods/loader/bundle_disk.cpp
|
||||||
|
src/dusk/mods/loader/bundle_zip.cpp
|
||||||
|
src/dusk/mods/loader/context.cpp
|
||||||
|
src/dusk/mods/loader/depgraph.cpp
|
||||||
|
src/dusk/mods/loader/depgraph.hpp
|
||||||
|
src/dusk/mods/loader/loader.cpp
|
||||||
|
src/dusk/mods/loader/loader.hpp
|
||||||
|
src/dusk/mods/loader/native_module.cpp
|
||||||
|
src/dusk/mods/loader/native_module.hpp
|
||||||
|
src/dusk/mods/svc/camera.cpp
|
||||||
|
src/dusk/mods/svc/config.cpp
|
||||||
|
src/dusk/mods/svc/config.hpp
|
||||||
|
src/dusk/mods/svc/game.cpp
|
||||||
|
src/dusk/mods/svc/gfx.cpp
|
||||||
|
src/dusk/mods/svc/hook.cpp
|
||||||
|
src/dusk/mods/svc/host.cpp
|
||||||
|
src/dusk/mods/svc/log.cpp
|
||||||
|
src/dusk/mods/svc/overlay.cpp
|
||||||
|
src/dusk/mods/svc/resource.cpp
|
||||||
|
src/dusk/mods/svc/texture.cpp
|
||||||
|
src/dusk/mods/svc/ui.cpp
|
||||||
|
src/dusk/mods/svc/ui.hpp
|
||||||
|
src/dusk/mods/svc/registry.cpp
|
||||||
|
src/dusk/mods/svc/registry.hpp
|
||||||
|
src/dusk/discord.cpp
|
||||||
|
src/dusk/discord.hpp
|
||||||
|
src/dusk/discord_presence.cpp
|
||||||
|
src/dusk/version.cpp
|
||||||
|
src/dusk/action_bindings.cpp
|
||||||
src/dusk/update_check.cpp
|
src/dusk/update_check.cpp
|
||||||
src/dusk/update_check.hpp
|
src/dusk/update_check.hpp
|
||||||
src/dusk/version.cpp
|
src/dusk/version.cpp
|
||||||
|
src/dusk/cosmetics/color_utils.hpp
|
||||||
|
src/dusk/cosmetics/color_utils.cpp
|
||||||
|
src/dusk/cosmetics/midna_hair_color.hpp
|
||||||
|
src/dusk/cosmetics/midna_hair_color.cpp
|
||||||
|
src/dusk/cosmetics/texture_utils.hpp
|
||||||
|
src/dusk/cosmetics/texture_utils.cpp
|
||||||
|
# Randomizer files
|
||||||
|
src/dusk/randomizer/game/custom_flow_ids.hpp
|
||||||
|
src/dusk/randomizer/game/flags.cpp
|
||||||
|
src/dusk/randomizer/game/flags.h
|
||||||
|
src/dusk/randomizer/game/messages.cpp
|
||||||
|
src/dusk/randomizer/game/messages.hpp
|
||||||
|
src/dusk/randomizer/game/stages.cpp
|
||||||
|
src/dusk/randomizer/game/stages.h
|
||||||
|
src/dusk/randomizer/game/tools.cpp
|
||||||
|
src/dusk/randomizer/game/tools.h
|
||||||
|
src/dusk/randomizer/game/verify_item_functions.cpp
|
||||||
|
src/dusk/randomizer/game/verify_item_functions.h
|
||||||
|
src/dusk/randomizer/game/randomizer_context.cpp
|
||||||
|
src/dusk/randomizer/game/randomizer_context.hpp
|
||||||
|
src/dusk/randomizer/generator/logic/area.cpp
|
||||||
|
src/dusk/randomizer/generator/logic/area.hpp
|
||||||
|
src/dusk/randomizer/generator/logic/dungeon.cpp
|
||||||
|
src/dusk/randomizer/generator/logic/dungeon.hpp
|
||||||
|
src/dusk/randomizer/generator/logic/entrance.cpp
|
||||||
|
src/dusk/randomizer/generator/logic/entrance.hpp
|
||||||
|
src/dusk/randomizer/generator/logic/entrance_shuffle.cpp
|
||||||
|
src/dusk/randomizer/generator/logic/entrance_shuffle.hpp
|
||||||
|
src/dusk/randomizer/generator/logic/fill.cpp
|
||||||
|
src/dusk/randomizer/generator/logic/fill.hpp
|
||||||
|
src/dusk/randomizer/generator/logic/flatten/bits.cpp
|
||||||
|
src/dusk/randomizer/generator/logic/flatten/bits.hpp
|
||||||
|
src/dusk/randomizer/generator/logic/flatten/flatten.cpp
|
||||||
|
src/dusk/randomizer/generator/logic/flatten/flatten.hpp
|
||||||
|
src/dusk/randomizer/generator/logic/flatten/simplify_algebraic.cpp
|
||||||
|
src/dusk/randomizer/generator/logic/flatten/simplify_algebraic.hpp
|
||||||
|
src/dusk/randomizer/generator/logic/hint_types.hpp
|
||||||
|
src/dusk/randomizer/generator/logic/hints.cpp
|
||||||
|
src/dusk/randomizer/generator/logic/hints.hpp
|
||||||
|
src/dusk/randomizer/generator/logic/item.cpp
|
||||||
|
src/dusk/randomizer/generator/logic/item.hpp
|
||||||
|
src/dusk/randomizer/generator/logic/item_pool.cpp
|
||||||
|
src/dusk/randomizer/generator/logic/item_pool.hpp
|
||||||
|
src/dusk/randomizer/generator/logic/location.cpp
|
||||||
|
src/dusk/randomizer/generator/logic/location.hpp
|
||||||
|
src/dusk/randomizer/generator/logic/plandomizer.cpp
|
||||||
|
src/dusk/randomizer/generator/logic/plandomizer.hpp
|
||||||
|
src/dusk/randomizer/generator/logic/requirement.cpp
|
||||||
|
src/dusk/randomizer/generator/logic/requirement.hpp
|
||||||
|
src/dusk/randomizer/generator/logic/search.cpp
|
||||||
|
src/dusk/randomizer/generator/logic/search.hpp
|
||||||
|
src/dusk/randomizer/generator/logic/spoiler_log.cpp
|
||||||
|
src/dusk/randomizer/generator/logic/spoiler_log.hpp
|
||||||
|
src/dusk/randomizer/generator/logic/world.cpp
|
||||||
|
src/dusk/randomizer/generator/logic/world.hpp
|
||||||
|
src/dusk/randomizer/generator/randomizer.cpp
|
||||||
|
src/dusk/randomizer/generator/randomizer.hpp
|
||||||
|
src/dusk/randomizer/generator/seedgen/config.cpp
|
||||||
|
src/dusk/randomizer/generator/seedgen/config.hpp
|
||||||
|
src/dusk/randomizer/generator/seedgen/packed_bits.hpp
|
||||||
|
src/dusk/randomizer/generator/seedgen/seed.cpp
|
||||||
|
src/dusk/randomizer/generator/seedgen/seed.hpp
|
||||||
|
src/dusk/randomizer/generator/seedgen/settings.cpp
|
||||||
|
src/dusk/randomizer/generator/seedgen/settings.hpp
|
||||||
|
src/dusk/randomizer/generator/test/test.cpp
|
||||||
|
src/dusk/randomizer/generator/test/test.hpp
|
||||||
|
src/dusk/randomizer/generator/utility/base64pp.hpp
|
||||||
|
src/dusk/randomizer/generator/utility/color.cpp
|
||||||
|
src/dusk/randomizer/generator/utility/color.hpp
|
||||||
|
src/dusk/randomizer/generator/utility/crc32.hpp
|
||||||
|
src/dusk/randomizer/generator/utility/common.cpp
|
||||||
|
src/dusk/randomizer/generator/utility/common.hpp
|
||||||
|
src/dusk/randomizer/generator/utility/container.hpp
|
||||||
|
src/dusk/randomizer/generator/utility/endian.cpp
|
||||||
|
src/dusk/randomizer/generator/utility/endian.hpp
|
||||||
|
src/dusk/randomizer/generator/utility/exception.hpp
|
||||||
|
src/dusk/randomizer/generator/utility/file.cpp
|
||||||
|
src/dusk/randomizer/generator/utility/file.hpp
|
||||||
|
src/dusk/randomizer/generator/utility/general.hpp
|
||||||
|
src/dusk/randomizer/generator/utility/log.cpp
|
||||||
|
src/dusk/randomizer/generator/utility/log.hpp
|
||||||
|
src/dusk/randomizer/generator/utility/math.hpp
|
||||||
|
src/dusk/randomizer/generator/utility/path.cpp
|
||||||
|
src/dusk/randomizer/generator/utility/path.hpp
|
||||||
|
src/dusk/randomizer/generator/utility/platform.cpp
|
||||||
|
src/dusk/randomizer/generator/utility/platform.hpp
|
||||||
|
src/dusk/randomizer/generator/utility/random.cpp
|
||||||
|
src/dusk/randomizer/generator/utility/random.hpp
|
||||||
|
src/dusk/randomizer/generator/utility/string.cpp
|
||||||
|
src/dusk/randomizer/generator/utility/string.hpp
|
||||||
|
src/dusk/randomizer/generator/utility/text.cpp
|
||||||
|
src/dusk/randomizer/generator/utility/text.hpp
|
||||||
|
src/dusk/randomizer/generator/utility/thread_local.hpp
|
||||||
|
src/dusk/randomizer/generator/utility/time.cpp
|
||||||
|
src/dusk/randomizer/generator/utility/time.hpp
|
||||||
|
src/dusk/randomizer/generator/utility/yaml.hpp
|
||||||
src/helpers/batch.cpp
|
src/helpers/batch.cpp
|
||||||
src/helpers/endian.cpp
|
src/helpers/endian.cpp
|
||||||
src/helpers/offset_ptr.cpp
|
src/helpers/offset_ptr.cpp
|
||||||
src/helpers/string.cpp
|
src/helpers/string.cpp
|
||||||
src/helpers/cast.cpp
|
|
||||||
)
|
)
|
||||||
|
|
||||||
set(DUSK_HTTP_BACKEND_FILES
|
set(DUSK_HTTP_BACKEND_FILES
|
||||||
|
|||||||
@@ -9,8 +9,6 @@
|
|||||||
#include "JSystem/JAudio2/JAUAudibleParam.h"
|
#include "JSystem/JAudio2/JAUAudibleParam.h"
|
||||||
#include "JSystem/TPosition3.h"
|
#include "JSystem/TPosition3.h"
|
||||||
|
|
||||||
#define Z2_AUDIO_PLAYERS 1
|
|
||||||
|
|
||||||
struct Z2Audible;
|
struct Z2Audible;
|
||||||
|
|
||||||
struct Z2AudibleAbsPos {
|
struct Z2AudibleAbsPos {
|
||||||
@@ -51,14 +49,10 @@ struct Z2AudioCamera {
|
|||||||
f32 getCamDist() const { return mCamDist; }
|
f32 getCamDist() const { return mCamDist; }
|
||||||
|
|
||||||
|
|
||||||
/* 0x00 */ JGeometry::TPosition3f32 mViewMatrix;
|
/* 0x00 */ JGeometry::TPosition3f32 field_0x0;
|
||||||
/* 0x30 */ JGeometry::TVec3<f32> mVel;
|
/* 0x30 */ JGeometry::TVec3<f32> mVel;
|
||||||
/* 0x3C */ JGeometry::TVec3<f32> mPos;
|
/* 0x3C */ JGeometry::TVec3<f32> mPos;
|
||||||
|
/* 0x48 */ JGeometry::TVec3<f32> field_0x48;
|
||||||
/**
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
/* 0x48 */ JGeometry::TVec3<f32> mLastPos;
|
|
||||||
/* 0x54 */ f32 mFovySin;
|
/* 0x54 */ f32 mFovySin;
|
||||||
/* 0x58 */ f32 mVolCenterZ;
|
/* 0x58 */ f32 mVolCenterZ;
|
||||||
/* 0x5C */ f32 mTargetVolume;
|
/* 0x5C */ f32 mTargetVolume;
|
||||||
@@ -89,14 +83,14 @@ struct Z2SpotMic {
|
|||||||
/* 0x04 */ f32 field_0x4;
|
/* 0x04 */ f32 field_0x4;
|
||||||
/* 0x08 */ f32 field_0x8;
|
/* 0x08 */ f32 field_0x8;
|
||||||
/* 0x0C */ f32 field_0xc;
|
/* 0x0C */ f32 field_0xc;
|
||||||
/* 0x10 */ Z2AudioCamera* field_0x10[Z2_AUDIO_PLAYERS];
|
/* 0x10 */ Z2AudioCamera* field_0x10[1];
|
||||||
/* 0x14 */ Vec* mPosPtr;
|
/* 0x14 */ Vec* mPosPtr;
|
||||||
/* 0x18 */ f32 field_0x18[Z2_AUDIO_PLAYERS];
|
/* 0x18 */ f32 field_0x18[1];
|
||||||
/* 0x1C */ f32 field_0x1c;
|
/* 0x1C */ f32 field_0x1c;
|
||||||
/* 0x20 */ f32 field_0x20[Z2_AUDIO_PLAYERS];
|
/* 0x20 */ f32 field_0x20[1];
|
||||||
/* 0x24 */ bool mIgnoreIfOut;
|
/* 0x24 */ bool mIgnoreIfOut;
|
||||||
/* 0x25 */ bool mMicOn;
|
/* 0x25 */ bool mMicOn;
|
||||||
/* 0x26 */ bool field_0x26[Z2_AUDIO_PLAYERS];
|
/* 0x26 */ bool field_0x26[1];
|
||||||
}; // Size: 0x28
|
}; // Size: 0x28
|
||||||
|
|
||||||
struct Z2Audience3DSetting {
|
struct Z2Audience3DSetting {
|
||||||
@@ -108,99 +102,62 @@ struct Z2Audience3DSetting {
|
|||||||
void updateDolbyDist(f32, f32);
|
void updateDolbyDist(f32, f32);
|
||||||
|
|
||||||
void calcVolumeFactorAll() {
|
void calcVolumeFactorAll() {
|
||||||
mDistanceMaxes[1] = 1.25f * mDistanceMaxes[0];
|
field_0x0[1] = 1.25f * field_0x0[0];
|
||||||
mDistanceMaxes[2] = 1.5f * mDistanceMaxes[0];
|
field_0x0[2] = 1.5f * field_0x0[0];
|
||||||
mDistanceMaxes[3] = 2.0f * mDistanceMaxes[0];
|
field_0x0[3] = 2.0f * field_0x0[0];
|
||||||
mDistanceMaxes[4] = 3.0f * mDistanceMaxes[0];
|
field_0x0[4] = 3.0f * field_0x0[0];
|
||||||
mDistanceMaxes[5] = 4.0f * mDistanceMaxes[0];
|
field_0x0[5] = 4.0f * field_0x0[0];
|
||||||
mDistanceMaxes[6] = 6.0f * mDistanceMaxes[0];
|
field_0x0[6] = 6.0f * field_0x0[0];
|
||||||
mDistanceMaxes[7] = 8.0f * mDistanceMaxes[0];
|
field_0x0[7] = 8.0f * field_0x0[0];
|
||||||
mDistanceMaxes[8] = 0.9f * mDistanceMaxes[0];
|
field_0x0[8] = 0.9f * field_0x0[0];
|
||||||
mDistanceMaxes[9] = 0.8f * mDistanceMaxes[0];
|
field_0x0[9] = 0.8f * field_0x0[0];
|
||||||
mDistanceMaxes[10] = 0.7f * mDistanceMaxes[0];
|
field_0x0[10] = 0.7f * field_0x0[0];
|
||||||
mDistanceMaxes[11] = 0.6f * mDistanceMaxes[0];
|
field_0x0[11] = 0.6f * field_0x0[0];
|
||||||
mDistanceMaxes[12] = 0.5f * mDistanceMaxes[0];
|
field_0x0[12] = 0.5f * field_0x0[0];
|
||||||
mDistanceMaxes[13] = 0.4f * mDistanceMaxes[0];
|
field_0x0[13] = 0.4f * field_0x0[0];
|
||||||
mDistanceMaxes[14] = 0.3f * mDistanceMaxes[0];
|
field_0x0[14] = 0.3f * field_0x0[0];
|
||||||
for (int i = 0; i < 15; i++) {
|
for (int i = 0; i < 15; i++) {
|
||||||
mVolumeFactor[i] = (mMinDistanceVolume - 1.0f) / (mDistanceMaxes[i] - mMaxVolumeDistance);
|
field_0x70[i] = (field_0x40 - 1.0f) / (field_0x0[i] - field_0x3c);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void calcPriorityFactorAll() {
|
void calcPriorityFactorAll() {
|
||||||
for (int i = 0; i < 15; i++) {
|
for (int i = 0; i < 15; i++) {
|
||||||
mPriorityFactor[i] = mMaxDistancePriority / (mDistanceMaxes[i] - mMaxVolumeDistance);
|
field_0xac[i] = field_0x64 / (field_0x0[i] - field_0x3c);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void calcFxMixFactorAll() {
|
void calcFxMixFactorAll() {
|
||||||
for (int i = 0; i < 15; i++) {
|
for (int i = 0; i < 15; i++) {
|
||||||
mFxMixFactor[i] = (mMaxDistanceFxMix - mMinDistanceFxMix) / (mDistanceMaxes[i] - mMaxVolumeDistance);
|
field_0xe8[i] = (field_0x54 - field_0x50) / (field_0x0[i] - field_0x3c);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/* 0x000 */ f32 field_0x0[15];
|
||||||
* Maximum distance a sound can reach before being "far away"
|
/* 0x03C */ f32 field_0x3c;
|
||||||
* Being far away affects stuff like culling, lowering its priority, forcibly stopping it, etc.
|
/* 0x040 */ f32 field_0x40;
|
||||||
* Sounds select which entry they use based on their VolBits.
|
/* 0x044 */ f32 field_0x44;
|
||||||
*/
|
/* 0x048 */ f32 field_0x48;
|
||||||
/* 0x000 */ f32 mDistanceMaxes[15];
|
/* 0x04C */ f32 field_0x4c;
|
||||||
|
/* 0x050 */ f32 field_0x50;
|
||||||
/**
|
/* 0x054 */ f32 field_0x54;
|
||||||
* Distance at which the max volume of a sound is reached.
|
/* 0x058 */ f32 field_0x58;
|
||||||
* i.e. sounds do *not* get louder if they get closer than this.
|
/* 0x05C */ f32 field_0x5c;
|
||||||
*/
|
|
||||||
/* 0x03C */ f32 mMaxVolumeDistance;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* FX Mix value at maximum distance (@ref mDistanceMaxes)
|
|
||||||
*/
|
|
||||||
/* 0x040 */ f32 mMinDistanceVolume;
|
|
||||||
/* 0x044 */ f32 mDolbyFrontDistanceMax;
|
|
||||||
/* 0x048 */ f32 mDolbyBehindDistanceMax;
|
|
||||||
/* 0x04C */ f32 mDolbyCenterValue;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* FX Mix value at minimum distance (@ref mMaxVolumeDistance)
|
|
||||||
*/
|
|
||||||
/* 0x050 */ f32 mMinDistanceFxMix;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* FX Mix value at maximum distance (@ref mDistanceMaxes)
|
|
||||||
*/
|
|
||||||
/* 0x054 */ f32 mMaxDistanceFxMix;
|
|
||||||
/* 0x058 */ f32 mPanFactor;
|
|
||||||
/* 0x05C */ f32 mSonicSpeed; // Used for doppler effect calculations.
|
|
||||||
/* 0x060 */ f32 field_0x60;
|
/* 0x060 */ f32 field_0x60;
|
||||||
|
/* 0x064 */ u32 field_0x64;
|
||||||
/**
|
|
||||||
* Priority that sounds receive when "far away".
|
|
||||||
* @see mDistanceMaxes
|
|
||||||
*/
|
|
||||||
/* 0x064 */ u32 mMaxDistancePriority;
|
|
||||||
/* 0x068 */ f32 field_0x68;
|
/* 0x068 */ f32 field_0x68;
|
||||||
/* 0x06C */ f32 field_0x6c;
|
/* 0x06C */ f32 field_0x6c;
|
||||||
/* 0x070 */ f32 mVolumeFactor[15];
|
/* 0x070 */ f32 field_0x70[15];
|
||||||
/* 0x0AC */ f32 mPriorityFactor[15];
|
/* 0x0AC */ f32 field_0xac[15];
|
||||||
/* 0x0E8 */ f32 mFxMixFactor[15];
|
/* 0x0E8 */ f32 field_0xe8[15];
|
||||||
/* 0x124 */ bool mVolumeDistInit;
|
/* 0x124 */ bool mVolumeDistInit;
|
||||||
/* 0x125 */ bool mDolbyDistInit;
|
/* 0x125 */ bool mDolbyDistInit;
|
||||||
}; // Size: 0x128
|
}; // Size: 0x128
|
||||||
|
|
||||||
struct Z2AudibleRelPos {
|
struct Z2AudibleRelPos {
|
||||||
/* 0x00 */ JGeometry::TVec3<f32> mCameraRelative;
|
/* 0x00 */ JGeometry::TVec3<f32> field_0x00;
|
||||||
|
/* 0x0C */ f32 field_0xC;
|
||||||
/**
|
/* 0x10 */ f32 field_0x10;
|
||||||
* Distance from mCameraRelative. This is from the object root and not the
|
|
||||||
* exact distance used for volume/priority calculations.
|
|
||||||
*/
|
|
||||||
/* 0x0C */ f32 mTrueDistance;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Distance from mCameraRelative but offset by mVolCenterZ.
|
|
||||||
* This presumably means the distance is more centered on the object than mTrueDistance.
|
|
||||||
*/
|
|
||||||
/* 0x10 */ f32 mCenterDistance;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
struct Z2AudibleChannel {
|
struct Z2AudibleChannel {
|
||||||
@@ -214,7 +171,7 @@ struct Z2AudibleChannel {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* 0x00 */ JASSoundParams mParams;
|
/* 0x00 */ JASSoundParams mParams;
|
||||||
/* 0x14 */ Z2AudibleRelPos mRelPos;
|
/* 0x14 */ Z2AudibleRelPos field_0x14;
|
||||||
/* 0x28 */ f32 field_0x28;
|
/* 0x28 */ f32 field_0x28;
|
||||||
/* 0x2c */ f32 mPan;
|
/* 0x2c */ f32 mPan;
|
||||||
/* 0x30 */ f32 mDolby;
|
/* 0x30 */ f32 mDolby;
|
||||||
@@ -243,8 +200,8 @@ struct Z2Audible : public JAIAudible, public JASPoolAllocObject<Z2Audible> {
|
|||||||
|
|
||||||
/* 0x10 */ JAUAudibleParam mParam;
|
/* 0x10 */ JAUAudibleParam mParam;
|
||||||
/* 0x14 */ Z2AudibleAbsPos mAbsPos;
|
/* 0x14 */ Z2AudibleAbsPos mAbsPos;
|
||||||
/* 0x2C */ Z2AudibleChannel mChannel[Z2_AUDIO_PLAYERS];
|
/* 0x2C */ Z2AudibleChannel mChannel[1];
|
||||||
/* 0x64 */ f32 mMicDistances[Z2_AUDIO_PLAYERS];
|
/* 0x64 */ f32 field_0x64[1];
|
||||||
};
|
};
|
||||||
|
|
||||||
struct Z2Audience : public JAIAudience, public JASGlobalInstance<Z2Audience> {
|
struct Z2Audience : public JAIAudience, public JASGlobalInstance<Z2Audience> {
|
||||||
|
|||||||
@@ -46,6 +46,11 @@ public:
|
|||||||
s32 getSeLoadStatus(u32 wave) { return getWaveLoadStatus(wave, 0); }
|
s32 getSeLoadStatus(u32 wave) { return getWaveLoadStatus(wave, 0); }
|
||||||
s32 getBgmLoadStatus(u32 wave) { return getWaveLoadStatus(wave, 1); }
|
s32 getBgmLoadStatus(u32 wave) { return getWaveLoadStatus(wave, 1); }
|
||||||
u8 getDemoSeWaveNum() { return loadedDemoWave; }
|
u8 getDemoSeWaveNum() { return loadedDemoWave; }
|
||||||
|
#if TARGET_PC
|
||||||
|
u8 getLoadedSeWave_1() { return loadedSeWave_1;}
|
||||||
|
u8 getLoadedSeWave_2() { return loadedSeWave_2;}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
/* 0x00 */ JAISoundID BGM_ID;
|
/* 0x00 */ JAISoundID BGM_ID;
|
||||||
|
|||||||
@@ -3912,6 +3912,16 @@ public:
|
|||||||
u16 getReadyItem() { return dComIfGp_getSelectItem(mSelectItemId); }
|
u16 getReadyItem() { return dComIfGp_getSelectItem(mSelectItemId); }
|
||||||
|
|
||||||
static u32 getOtherHeapSize() { return 0xF0A60; }
|
static u32 getOtherHeapSize() { return 0xF0A60; }
|
||||||
|
|
||||||
|
#if TARGET_PC
|
||||||
|
u16 getEventId() { return mMsgFlow.getEventId(); }
|
||||||
|
|
||||||
|
bool checkSwimming() {return checkModeFlg(MODE_SWIMMING);}
|
||||||
|
|
||||||
|
BE<short>** getDomeLockChromaTable() {
|
||||||
|
return &field_0x0724->mAnmCRegDataR;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
static DUSK_GAME_DATA daAlink_BckData const m_mainBckShield[20];
|
static DUSK_GAME_DATA daAlink_BckData const m_mainBckShield[20];
|
||||||
static DUSK_GAME_DATA daAlink_BckData const m_mainBckSword[5];
|
static DUSK_GAME_DATA daAlink_BckData const m_mainBckSword[5];
|
||||||
@@ -6391,7 +6401,8 @@ public:
|
|||||||
|
|
||||||
class daAlinkHIO_huLight_c0 {
|
class daAlinkHIO_huLight_c0 {
|
||||||
public:
|
public:
|
||||||
static DUSK_GAME_DATA daAlinkHIO_huLight_c1 const m;
|
static DUSK_GAME_DATA daAlinkHIO_huLight_c1 IF_NOT_DUSK(const) m;
|
||||||
|
IF_DUSK(static DUSK_GAME_DATA daAlinkHIO_huLight_c1 const original;)
|
||||||
};
|
};
|
||||||
|
|
||||||
class daAlinkHIO_wlLight_c1 {
|
class daAlinkHIO_wlLight_c1 {
|
||||||
@@ -6465,7 +6476,8 @@ public:
|
|||||||
|
|
||||||
class daAlinkHIO_kandelaar_c0 {
|
class daAlinkHIO_kandelaar_c0 {
|
||||||
public:
|
public:
|
||||||
static DUSK_GAME_DATA daAlinkHIO_kandelaar_c1 const m;
|
static DUSK_GAME_DATA daAlinkHIO_kandelaar_c1 IF_NOT_DUSK(const) m;
|
||||||
|
IF_DUSK(static DUSK_GAME_DATA daAlinkHIO_kandelaar_c1 const original;)
|
||||||
};
|
};
|
||||||
|
|
||||||
class daAlinkHIO_kandelaar_c : public daAlinkHIO_data_c {
|
class daAlinkHIO_kandelaar_c : public daAlinkHIO_data_c {
|
||||||
|
|||||||
@@ -120,7 +120,10 @@ public:
|
|||||||
BOOL chkAction(actionFunc action) { return action == mAction; }
|
BOOL chkAction(actionFunc action) { return action == mAction; }
|
||||||
|
|
||||||
static DUSK_GAME_DATA eventFunc mEvtSeqList[1];
|
static DUSK_GAME_DATA eventFunc mEvtSeqList[1];
|
||||||
|
#if TARGET_PC
|
||||||
|
// Keep track of last given bug for rando
|
||||||
|
static DUSK_GAME_DATA u8 mGivenInsectId;
|
||||||
|
#endif
|
||||||
private:
|
private:
|
||||||
/* 0xB48 */ Z2Creature mSound;
|
/* 0xB48 */ Z2Creature mSound;
|
||||||
/* 0xBD8 */ J3DModel* mpUmbrellaModel;
|
/* 0xBD8 */ J3DModel* mpUmbrellaModel;
|
||||||
|
|||||||
@@ -64,6 +64,9 @@ public:
|
|||||||
virtual int Delete();
|
virtual int Delete();
|
||||||
virtual BOOL checkSmallTbox() { return true; }
|
virtual BOOL checkSmallTbox() { return true; }
|
||||||
|
|
||||||
|
#if TARGET_PC
|
||||||
|
u8 getTboxNo() { return fopAcM_GetParamBit(this, 16, 8);}
|
||||||
|
#endif
|
||||||
u8 getModelType() { return fopAcM_GetParamBit(this, 8, 4); }
|
u8 getModelType() { return fopAcM_GetParamBit(this, 8, 4); }
|
||||||
u8 getItemNo() { return fopAcM_GetParamBit(this, 0, 8); }
|
u8 getItemNo() { return fopAcM_GetParamBit(this, 0, 8); }
|
||||||
|
|
||||||
|
|||||||
@@ -114,6 +114,10 @@ public:
|
|||||||
|
|
||||||
bool checkBoomWindTgTimer() { return mBoomWindTgTimer == 0; }
|
bool checkBoomWindTgTimer() { return mBoomWindTgTimer == 0; }
|
||||||
|
|
||||||
|
#if TARGET_PC
|
||||||
|
void setRandomizerItem(bool setFoolishItemModel = false);
|
||||||
|
#endif
|
||||||
|
|
||||||
static DUSK_GAME_DATA procFunc mFuncPtr[];
|
static DUSK_GAME_DATA procFunc mFuncPtr[];
|
||||||
static DUSK_GAME_DATA const dCcD_SrcCyl m_cyl_src;
|
static DUSK_GAME_DATA const dCcD_SrcCyl m_cyl_src;
|
||||||
static DUSK_GAME_DATA s32 m_timer_max;
|
static DUSK_GAME_DATA s32 m_timer_max;
|
||||||
|
|||||||
@@ -7,4 +7,9 @@ class fopAc_ac_c;
|
|||||||
int CheckFieldItemCreateHeap(fopAc_ac_c* actor);
|
int CheckFieldItemCreateHeap(fopAc_ac_c* actor);
|
||||||
int CheckItemCreateHeap(fopAc_ac_c* i_this);
|
int CheckItemCreateHeap(fopAc_ac_c* i_this);
|
||||||
|
|
||||||
|
#if TARGET_PC
|
||||||
|
// Used for foolish items in rando. Foolish item model id is saved to home.angle.z
|
||||||
|
#define M_ITEMNO_MODEL_ITEM_ID (IF_DUSK(randomizer_IsActive() && m_itemNo == dItemNo_Randomizer_FOOLISH_ITEM_e && home.angle.z != 0 ? home.angle.z :) m_itemNo)
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif /* D_A_D_A_ITEMBASE_STATIC_H */
|
#endif /* D_A_D_A_ITEMBASE_STATIC_H */
|
||||||
|
|||||||
@@ -74,7 +74,17 @@ public:
|
|||||||
s16 getAngleY() const { return mAngleY; }
|
s16 getAngleY() const { return mAngleY; }
|
||||||
void setAngleY(s16 angle) { mAngleY = angle;}
|
void setAngleY(s16 angle) { mAngleY = angle;}
|
||||||
|
|
||||||
|
#if TARGET_PC
|
||||||
|
BOOL isRandomized() const;
|
||||||
|
#endif
|
||||||
|
|
||||||
static DUSK_GAME_DATA ResourceData const mData[23];
|
static DUSK_GAME_DATA ResourceData const mData[23];
|
||||||
|
#if TARGET_PC
|
||||||
|
static DUSK_GAME_DATA ResourceData mRandoData[23];
|
||||||
|
#define M_SHOP_DATA (isRandomized() ? mRandoData : mData)
|
||||||
|
#else
|
||||||
|
#define M_SHOP_DATA mData
|
||||||
|
#endif
|
||||||
static DUSK_GAME_DATA f32 const m_cullfar_max;
|
static DUSK_GAME_DATA f32 const m_cullfar_max;
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
|
|||||||
@@ -474,6 +474,9 @@ public:
|
|||||||
s8 getNextStageRoomNo() { return mNextStage.getRoomNo(); }
|
s8 getNextStageRoomNo() { return mNextStage.getRoomNo(); }
|
||||||
s8 getNextStageLayer() { return mNextStage.getLayer(); }
|
s8 getNextStageLayer() { return mNextStage.getLayer(); }
|
||||||
BOOL isEnableNextStage() { return mNextStage.isEnable(); }
|
BOOL isEnableNextStage() { return mNextStage.isEnable(); }
|
||||||
|
#if TARGET_PC
|
||||||
|
void setEnableNextStage() { return mNextStage.setEnable(); }
|
||||||
|
#endif
|
||||||
void offEnableNextStage() { mNextStage.offEnable(); }
|
void offEnableNextStage() { mNextStage.offEnable(); }
|
||||||
s8 getNextStageWipe() { return mNextStage.getWipe(); }
|
s8 getNextStageWipe() { return mNextStage.getWipe(); }
|
||||||
u8 getNextStageWipeSpeed() { return mNextStage.getWipeSpeed(); }
|
u8 getNextStageWipeSpeed() { return mNextStage.getWipeSpeed(); }
|
||||||
@@ -1276,6 +1279,10 @@ int dComIfGd_setShadow(u32 param_0, s8 param_1, J3DModel* param_2, cXyz* param_3
|
|||||||
f32 param_5, f32 param_6, f32 param_7, cBgS_PolyInfo& param_8,
|
f32 param_5, f32 param_6, f32 param_7, cBgS_PolyInfo& param_8,
|
||||||
dKy_tevstr_c* param_9, s16 param_10, f32 param_11, TGXTexObj* param_12);
|
dKy_tevstr_c* param_9, s16 param_10, f32 param_11, TGXTexObj* param_12);
|
||||||
|
|
||||||
|
#if TARGET_PC
|
||||||
|
void dComIfGs_setupRandomizerSave();
|
||||||
|
#endif
|
||||||
|
|
||||||
inline dSv_info_c* dComIfGs_getSaveInfo() {
|
inline dSv_info_c* dComIfGs_getSaveInfo() {
|
||||||
return &g_dComIfG_gameInfo.info;
|
return &g_dComIfG_gameInfo.info;
|
||||||
}
|
}
|
||||||
@@ -1336,9 +1343,13 @@ inline u8 dComIfGs_getSelectEquipShield() {
|
|||||||
return g_dComIfG_gameInfo.info.getPlayer().getPlayerStatusA().getSelectEquip(COLLECT_SHIELD);
|
return g_dComIfG_gameInfo.info.getPlayer().getPlayerStatusA().getSelectEquip(COLLECT_SHIELD);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if TARGET_PC
|
||||||
|
u8 dComIfGs_getCollectSmell();
|
||||||
|
#else
|
||||||
inline u8 dComIfGs_getCollectSmell() {
|
inline u8 dComIfGs_getCollectSmell() {
|
||||||
return g_dComIfG_gameInfo.info.getPlayer().getPlayerStatusA().getSelectEquip(COLLECT_SMELL);
|
return g_dComIfG_gameInfo.info.getPlayer().getPlayerStatusA().getSelectEquip(COLLECT_SMELL);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
inline void dComIfGs_setCollectSmell(u8 smell) {
|
inline void dComIfGs_setCollectSmell(u8 smell) {
|
||||||
g_dComIfG_gameInfo.info.getPlayer().getPlayerStatusA().setSelectEquip(COLLECT_SMELL, smell);
|
g_dComIfG_gameInfo.info.getPlayer().getPlayerStatusA().setSelectEquip(COLLECT_SMELL, smell);
|
||||||
@@ -1428,6 +1439,12 @@ inline BOOL dComIfGs_isDarkClearLV(int i_no) {
|
|||||||
return g_dComIfG_gameInfo.info.getPlayer().getPlayerStatusB().isDarkClearLV(i_no);
|
return g_dComIfG_gameInfo.info.getPlayer().getPlayerStatusB().isDarkClearLV(i_no);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if TARGET_PC
|
||||||
|
inline u8 dComIfGs_getDarkClearLV() {
|
||||||
|
return g_dComIfG_gameInfo.info.getPlayer().getPlayerStatusB().getDarkClearLV();
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
inline void dComIfGs_onTransformLV(int i_no) {
|
inline void dComIfGs_onTransformLV(int i_no) {
|
||||||
g_dComIfG_gameInfo.info.getPlayer().getPlayerStatusB().onTransformLV(i_no);
|
g_dComIfG_gameInfo.info.getPlayer().getPlayerStatusB().onTransformLV(i_no);
|
||||||
}
|
}
|
||||||
@@ -1505,6 +1522,12 @@ inline void dComIfGs_onRegionBit(int i_region) {
|
|||||||
g_dComIfG_gameInfo.info.getPlayer().getPlayerFieldLastStayInfo().onRegionBit(i_region);
|
g_dComIfG_gameInfo.info.getPlayer().getPlayerFieldLastStayInfo().onRegionBit(i_region);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if TARGET_PC
|
||||||
|
inline void dComIfGs_setRegionBit(u8 i_region) {
|
||||||
|
g_dComIfG_gameInfo.info.getPlayer().getPlayerFieldLastStayInfo().setRegionBit(i_region);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
inline void dComIfGs_setPlayerFieldLastStayInfo(const char* i_stage, cXyz& i_pos, s16 i_angle,
|
inline void dComIfGs_setPlayerFieldLastStayInfo(const char* i_stage, cXyz& i_pos, s16 i_angle,
|
||||||
s8 i_point, u8 i_region) {
|
s8 i_point, u8 i_region) {
|
||||||
g_dComIfG_gameInfo.info.getPlayer().getPlayerFieldLastStayInfo().set(i_stage, i_pos, i_angle,
|
g_dComIfG_gameInfo.info.getPlayer().getPlayerFieldLastStayInfo().set(i_stage, i_pos, i_angle,
|
||||||
@@ -1656,6 +1679,16 @@ inline void dComIfGs_setPachinkoNum(u8 i_num) {
|
|||||||
g_dComIfG_gameInfo.info.getPlayer().getItemRecord().setPachinkoNum(i_num);
|
g_dComIfG_gameInfo.info.getPlayer().getItemRecord().setPachinkoNum(i_num);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if TARGET_PC
|
||||||
|
inline u8 dComIfGs_getAncientDocumentNum() {
|
||||||
|
return g_dComIfG_gameInfo.info.getPlayer().getItemRecord().getAncientDocumentNum();
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void dComIfGs_setAncientDocumentNum(u8 i_num) {
|
||||||
|
g_dComIfG_gameInfo.info.getPlayer().getItemRecord().setAncientDocumentNum(i_num);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
inline u8 dComIfGs_getPachinkoMax() {
|
inline u8 dComIfGs_getPachinkoMax() {
|
||||||
return 50;
|
return 50;
|
||||||
}
|
}
|
||||||
@@ -1828,7 +1861,16 @@ inline u8 dComIfGs_getGetNumber(int i_no) {
|
|||||||
inline void dComIfGs_setGetNumber(int i_no, u8 i_value) {
|
inline void dComIfGs_setGetNumber(int i_no, u8 i_value) {
|
||||||
g_dComIfG_gameInfo.info.getPlayer().getLetterInfo().setGetNumber(i_no, i_value);
|
g_dComIfG_gameInfo.info.getPlayer().getLetterInfo().setGetNumber(i_no, i_value);
|
||||||
}
|
}
|
||||||
|
#if TARGET_PC
|
||||||
|
// For rando
|
||||||
|
inline void dComIfGs_setAllLetterGet() {
|
||||||
|
g_dComIfG_gameInfo.info.getPlayer().getLetterInfo().setAllLetterGet();
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void dComIfGs_setAllLetterRead() {
|
||||||
|
g_dComIfG_gameInfo.info.getPlayer().getLetterInfo().setAllLetterRead();
|
||||||
|
}
|
||||||
|
#endif
|
||||||
inline void dComIfGs_addFishNum(u8 param_0) {
|
inline void dComIfGs_addFishNum(u8 param_0) {
|
||||||
g_dComIfG_gameInfo.info.getPlayer().getFishingInfo().addFishCount(param_0);
|
g_dComIfG_gameInfo.info.getPlayer().getFishingInfo().addFishCount(param_0);
|
||||||
}
|
}
|
||||||
@@ -1944,6 +1986,16 @@ inline u8 dComIfGs_getPalLanguage() {
|
|||||||
return g_dComIfG_gameInfo.info.getPlayer().getConfig().getPalLanguage();
|
return g_dComIfG_gameInfo.info.getPlayer().getConfig().getPalLanguage();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if TARGET_PC
|
||||||
|
// Kinda hacky, but will do for now
|
||||||
|
inline void dComIfGs_onRegionFlag(int i_stageNo, int i_no) {
|
||||||
|
auto regionFlags = reinterpret_cast<u8*>(&g_dComIfG_gameInfo.info.getSavedata().getSave(i_stageNo).getBit());
|
||||||
|
const int offset = i_no / 8;
|
||||||
|
const int shift = i_no % 8;
|
||||||
|
regionFlags[offset] |= (0x80 >> shift);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
inline BOOL dComIfGs_isSaveTbox(int i_stageNo, int i_no) {
|
inline BOOL dComIfGs_isSaveTbox(int i_stageNo, int i_no) {
|
||||||
return g_dComIfG_gameInfo.info.getSavedata().getSave(i_stageNo).getBit().isTbox(i_no);
|
return g_dComIfG_gameInfo.info.getSavedata().getSave(i_stageNo).getBit().isTbox(i_no);
|
||||||
}
|
}
|
||||||
@@ -2028,6 +2080,10 @@ inline void dComIfGs_setKeyNum(u8 i_keyNum) {
|
|||||||
g_dComIfG_gameInfo.info.getMemory().getBit().setKeyNum(i_keyNum);
|
g_dComIfG_gameInfo.info.getMemory().getBit().setKeyNum(i_keyNum);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if TARGET_PC
|
||||||
|
u8 dComIfGs_getKeyNum(int i_stageNo);
|
||||||
|
#endif
|
||||||
|
|
||||||
inline void dComIfGs_onDungeonItemMap() {
|
inline void dComIfGs_onDungeonItemMap() {
|
||||||
g_dComIfG_gameInfo.info.getMemory().getBit().onDungeonItemMap();
|
g_dComIfG_gameInfo.info.getMemory().getBit().onDungeonItemMap();
|
||||||
}
|
}
|
||||||
@@ -2460,6 +2516,12 @@ inline s8 dComIfGp_getStartStageRoomNo() {
|
|||||||
return g_dComIfG_gameInfo.play.getStartStageRoomNo();
|
return g_dComIfG_gameInfo.play.getStartStageRoomNo();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if TARGET_PC
|
||||||
|
inline s8 dComIfGp_getLayerNo() {
|
||||||
|
return g_dComIfG_gameInfo.play.getLayerNo(0);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
inline s8 dComIfGp_getStartStageLayer() {
|
inline s8 dComIfGp_getStartStageLayer() {
|
||||||
return g_dComIfG_gameInfo.play.getStartStageLayer();
|
return g_dComIfG_gameInfo.play.getStartStageLayer();
|
||||||
}
|
}
|
||||||
@@ -2504,6 +2566,12 @@ inline void dComIfGp_offEnableNextStage() {
|
|||||||
g_dComIfG_gameInfo.play.offEnableNextStage();
|
g_dComIfG_gameInfo.play.offEnableNextStage();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if TARGET_PC
|
||||||
|
inline void dComIfGp_setEnableNextStage() {
|
||||||
|
g_dComIfG_gameInfo.play.setEnableNextStage();
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
inline s8 dComIfGp_getNextStageWipe() {
|
inline s8 dComIfGp_getNextStageWipe() {
|
||||||
return g_dComIfG_gameInfo.play.getNextStageWipe();
|
return g_dComIfG_gameInfo.play.getNextStageWipe();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -203,6 +203,9 @@ public:
|
|||||||
DATASELPROC_DATA_SELECT_MOVE_ANIME,
|
DATASELPROC_DATA_SELECT_MOVE_ANIME,
|
||||||
DATASELPROC_SELECT_DATA_OPEN_MOVE,
|
DATASELPROC_SELECT_DATA_OPEN_MOVE,
|
||||||
DATASELPROC_SELECT_DATA_NAME_MOVE,
|
DATASELPROC_SELECT_DATA_NAME_MOVE,
|
||||||
|
#if TARGET_PC
|
||||||
|
DATASELPROC_SELECT_DATA_PLAY_MOVE, // Select between vanilla or randomizer play
|
||||||
|
#endif
|
||||||
DATASELPROC_SELECT_DATA_OPENERASE_MOVE,
|
DATASELPROC_SELECT_DATA_OPENERASE_MOVE,
|
||||||
DATASELPROC_MENU_SELECT,
|
DATASELPROC_MENU_SELECT,
|
||||||
DATASELPROC_MENU_SELECT_MOVE_ANM,
|
DATASELPROC_MENU_SELECT_MOVE_ANM,
|
||||||
@@ -331,6 +334,9 @@ public:
|
|||||||
void makeRecInfo(u8);
|
void makeRecInfo(u8);
|
||||||
void selectDataOpenMove();
|
void selectDataOpenMove();
|
||||||
void selectDataNameMove();
|
void selectDataNameMove();
|
||||||
|
#if TARGET_PC
|
||||||
|
void selectDataPlayTypeMove();
|
||||||
|
#endif
|
||||||
void selectDataOpenEraseMove();
|
void selectDataOpenEraseMove();
|
||||||
void menuSelect();
|
void menuSelect();
|
||||||
void menuSelectStart();
|
void menuSelectStart();
|
||||||
@@ -732,7 +738,12 @@ public:
|
|||||||
/* 0x2378 */ J2DPicture* mpFadePict;
|
/* 0x2378 */ J2DPicture* mpFadePict;
|
||||||
#endif
|
#endif
|
||||||
#ifdef TARGET_PC
|
#ifdef TARGET_PC
|
||||||
dDlst_FileSelFade_c mFadeDlst;
|
struct mDusk {
|
||||||
|
dDlst_FileSelFade_c mFadeDlst;
|
||||||
|
bool mStartNameAnm;
|
||||||
|
bool mBackToFileSelect;
|
||||||
|
int mPendingRmlCloseFrames{0};
|
||||||
|
} mDusk;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if PLATFORM_WII || PLATFORM_SHIELD
|
#if PLATFORM_WII || PLATFORM_SHIELD
|
||||||
@@ -743,7 +754,7 @@ public:
|
|||||||
};
|
};
|
||||||
|
|
||||||
#ifdef TARGET_PC
|
#ifdef TARGET_PC
|
||||||
STATIC_ASSERT(sizeof(dFile_select_c) == 0x237C + sizeof(dDlst_FileSelFade_c));
|
STATIC_ASSERT(sizeof(dFile_select_c) == 0x237C + sizeof(dFile_select_c::mDusk));
|
||||||
#else
|
#else
|
||||||
STATIC_ASSERT(sizeof(dFile_select_c) == 0x237C);
|
STATIC_ASSERT(sizeof(dFile_select_c) == 0x237C);
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -32,6 +32,11 @@ void item_func_ARROW_20();
|
|||||||
void item_func_ARROW_30();
|
void item_func_ARROW_30();
|
||||||
void item_func_ARROW_1();
|
void item_func_ARROW_1();
|
||||||
void item_func_PACHINKO_SHOT();
|
void item_func_PACHINKO_SHOT();
|
||||||
|
#if TARGET_PC
|
||||||
|
void item_func_FOOLISH_ITEM();
|
||||||
|
void item_func_ORDON_PORTAL();
|
||||||
|
void item_func_SOUTH_FARON_PORTAL();
|
||||||
|
#endif
|
||||||
void item_func_WATER_BOMB_5();
|
void item_func_WATER_BOMB_5();
|
||||||
void item_func_WATER_BOMB_10();
|
void item_func_WATER_BOMB_10();
|
||||||
void item_func_WATER_BOMB_20();
|
void item_func_WATER_BOMB_20();
|
||||||
@@ -65,6 +70,12 @@ void item_func_DUNGEON_EXIT_2();
|
|||||||
void item_func_WALLET_LV1();
|
void item_func_WALLET_LV1();
|
||||||
void item_func_WALLET_LV2();
|
void item_func_WALLET_LV2();
|
||||||
void item_func_WALLET_LV3();
|
void item_func_WALLET_LV3();
|
||||||
|
#if TARGET_PC
|
||||||
|
void item_func_UPPER_ZORAS_RIVER_PORTAL();
|
||||||
|
void item_func_CASTLE_TOWN_PORTAL();
|
||||||
|
void item_func_GERUDO_DESERT_PORTAL();
|
||||||
|
void item_func_NORTH_FARON_PORTAL();
|
||||||
|
#endif
|
||||||
void item_func_ZORAS_JEWEL();
|
void item_func_ZORAS_JEWEL();
|
||||||
void item_func_HAWK_EYE();
|
void item_func_HAWK_EYE();
|
||||||
void item_func_WOOD_STICK();
|
void item_func_WOOD_STICK();
|
||||||
@@ -81,13 +92,23 @@ void item_func_LIGHT_SWORD();
|
|||||||
void item_func_FISHING_ROD_1();
|
void item_func_FISHING_ROD_1();
|
||||||
void item_func_PACHINKO();
|
void item_func_PACHINKO();
|
||||||
void item_func_COPY_ROD_2();
|
void item_func_COPY_ROD_2();
|
||||||
|
#if TARGET_PC
|
||||||
|
void item_func_KAKARIKO_GORGE_PORTAL();
|
||||||
|
void item_func_KAKARIKO_VILLAGE_PORTAL();
|
||||||
|
#endif
|
||||||
void item_func_BOMB_BAG_LV2();
|
void item_func_BOMB_BAG_LV2();
|
||||||
void item_func_BOMB_BAG_LV1();
|
void item_func_BOMB_BAG_LV1();
|
||||||
void item_func_BOMB_IN_BAG();
|
void item_func_BOMB_IN_BAG();
|
||||||
|
#if TARGET_PC
|
||||||
|
void item_func_DEATH_MOUNTAIN_PORTAL();
|
||||||
|
#endif
|
||||||
void item_func_LIGHT_ARROW();
|
void item_func_LIGHT_ARROW();
|
||||||
void item_func_ARROW_LV1();
|
void item_func_ARROW_LV1();
|
||||||
void item_func_ARROW_LV2();
|
void item_func_ARROW_LV2();
|
||||||
void item_func_ARROW_LV3();
|
void item_func_ARROW_LV3();
|
||||||
|
#if TARGET_PC
|
||||||
|
void item_func_ZORAS_DOMAIN_PORTAL();
|
||||||
|
#endif
|
||||||
void item_func_LURE_ROD();
|
void item_func_LURE_ROD();
|
||||||
void item_func_BOMB_ARROW();
|
void item_func_BOMB_ARROW();
|
||||||
void item_func_HAWK_ARROW();
|
void item_func_HAWK_ARROW();
|
||||||
@@ -133,8 +154,33 @@ void item_func_BILL();
|
|||||||
void item_func_WOOD_STATUE();
|
void item_func_WOOD_STATUE();
|
||||||
void item_func_IRIAS_PENDANT();
|
void item_func_IRIAS_PENDANT();
|
||||||
void item_func_HORSE_FLUTE();
|
void item_func_HORSE_FLUTE();
|
||||||
|
#if TARGET_PC
|
||||||
|
void item_func_FOREST_SMALL_KEY();
|
||||||
|
void item_func_MINES_SMALL_KEY();
|
||||||
|
void item_func_LAKEBED_SMALL_KEY();
|
||||||
|
void item_func_ARBITERS_SMALL_KEY();
|
||||||
|
void item_func_SNOWPEAK_SMALL_KEY();
|
||||||
|
void item_func_TEMPLE_OF_TIME_SMALL_KEY();
|
||||||
|
void item_func_CITY_SMALL_KEY();
|
||||||
|
void item_func_PALACE_SMALL_KEY();
|
||||||
|
void item_func_HYRULE_SMALL_KEY();
|
||||||
|
void item_func_CAMP_SMALL_KEY();
|
||||||
|
void item_func_LAKE_HYLIA_PORTAL();
|
||||||
|
#endif
|
||||||
void item_func_RAFRELS_MEMO();
|
void item_func_RAFRELS_MEMO();
|
||||||
void item_func_ASHS_SCRIBBLING();
|
void item_func_ASHS_SCRIBBLING();
|
||||||
|
#if TARGET_PC
|
||||||
|
void item_func_FOREST_BOSS_KEY();
|
||||||
|
void item_func_LAKEBED_BOSS_KEY();
|
||||||
|
void item_func_ARBITERS_BOSS_KEY();
|
||||||
|
void item_func_TEMPLE_OF_TIME_BOSS_KEY();
|
||||||
|
void item_func_CITY_BOSS_KEY();
|
||||||
|
void item_func_PALACE_BOSS_KEY();
|
||||||
|
void item_func_HYRULE_BOSS_KEY();
|
||||||
|
void item_func_FOREST_COMPASS();
|
||||||
|
void item_func_MINES_COMPASS();
|
||||||
|
void item_func_LAKEBED_COMPASS();
|
||||||
|
#endif
|
||||||
void item_func_CHUCHU_YELLOW2();
|
void item_func_CHUCHU_YELLOW2();
|
||||||
void item_func_OIL_BOTTLE3();
|
void item_func_OIL_BOTTLE3();
|
||||||
void item_func_SHOP_BEE_CHILD();
|
void item_func_SHOP_BEE_CHILD();
|
||||||
@@ -147,12 +193,34 @@ void item_func_FILLED_CONTAINER();
|
|||||||
void item_func_MIRROR_PIECE_2();
|
void item_func_MIRROR_PIECE_2();
|
||||||
void item_func_MIRROR_PIECE_3();
|
void item_func_MIRROR_PIECE_3();
|
||||||
void item_func_MIRROR_PIECE_4();
|
void item_func_MIRROR_PIECE_4();
|
||||||
|
#if TARGET_PC
|
||||||
|
void item_func_ARBITERS_COMPASS();
|
||||||
|
void item_func_SNOWPEAK_COMPASS();
|
||||||
|
void item_func_TEMPLE_OF_TIME_COMPASS();
|
||||||
|
void item_func_CITY_COMPASS();
|
||||||
|
void item_func_PALACE_COMPASS();
|
||||||
|
void item_func_HYRULE_COMPASS();
|
||||||
|
void item_func_MIRROR_CHAMBER_PORTAL();
|
||||||
|
void item_func_SNOWPEAK_PORTAL();
|
||||||
|
#endif
|
||||||
void item_func_SMELL_YELIA_POUCH();
|
void item_func_SMELL_YELIA_POUCH();
|
||||||
void item_func_SMELL_PUMPKIN();
|
void item_func_SMELL_PUMPKIN();
|
||||||
void item_func_SMELL_POH();
|
void item_func_SMELL_POH();
|
||||||
void item_func_SMELL_FISH();
|
void item_func_SMELL_FISH();
|
||||||
void item_func_SMELL_CHILDREN();
|
void item_func_SMELL_CHILDREN();
|
||||||
void item_func_SMELL_MEDICINE();
|
void item_func_SMELL_MEDICINE();
|
||||||
|
#if TARGET_PC
|
||||||
|
void item_func_FOREST_MAP();
|
||||||
|
void item_func_MINES_MAP();
|
||||||
|
void item_func_LAKEBED_MAP();
|
||||||
|
void item_func_ARBITERS_MAP();
|
||||||
|
void item_func_SNOWPEAK_MAP();
|
||||||
|
void item_func_TEMPLE_OF_TIME_MAP();
|
||||||
|
void item_func_CITY_MAP();
|
||||||
|
void item_func_PALACE_MAP();
|
||||||
|
void item_func_HYRULE_MAP();
|
||||||
|
void item_func_SACRED_GROVE_PORTAL();
|
||||||
|
#endif
|
||||||
void item_func_M_BEETLE();
|
void item_func_M_BEETLE();
|
||||||
void item_func_F_BEETLE();
|
void item_func_F_BEETLE();
|
||||||
void item_func_M_BUTTERFLY();
|
void item_func_M_BUTTERFLY();
|
||||||
@@ -177,7 +245,23 @@ void item_func_M_ANT();
|
|||||||
void item_func_F_ANT();
|
void item_func_F_ANT();
|
||||||
void item_func_M_MAYFLY();
|
void item_func_M_MAYFLY();
|
||||||
void item_func_F_MAYFLY();
|
void item_func_F_MAYFLY();
|
||||||
|
#if TARGET_PC
|
||||||
|
void item_func_FUSED_SHADOW_1();
|
||||||
|
void item_func_FUSED_SHADOW_2();
|
||||||
|
void item_func_FUSED_SHADOW_3();
|
||||||
|
void item_func_MIRROR_PIECE_1();
|
||||||
|
#endif
|
||||||
void item_func_POU_SPIRIT();
|
void item_func_POU_SPIRIT();
|
||||||
|
#if TARGET_PC
|
||||||
|
void item_func_ENDING_BLOW();
|
||||||
|
void item_func_SHIELD_ATTACK();
|
||||||
|
void item_func_BACK_SLICE();
|
||||||
|
void item_func_HELM_SPLITTER();
|
||||||
|
void item_func_MORTAL_DRAW();
|
||||||
|
void item_func_JUMP_STRIKE();
|
||||||
|
void item_func_GREAT_SPIN();
|
||||||
|
void item_func_ELDIN_BRIDGE_PORTAL();
|
||||||
|
#endif
|
||||||
void item_func_ANCIENT_DOCUMENT();
|
void item_func_ANCIENT_DOCUMENT();
|
||||||
void item_func_AIR_LETTER();
|
void item_func_AIR_LETTER();
|
||||||
void item_func_ANCIENT_DOCUMENT2();
|
void item_func_ANCIENT_DOCUMENT2();
|
||||||
@@ -221,6 +305,10 @@ int item_getcheck_func_ARROW_20();
|
|||||||
int item_getcheck_func_ARROW_30();
|
int item_getcheck_func_ARROW_30();
|
||||||
int item_getcheck_func_ARROW_1();
|
int item_getcheck_func_ARROW_1();
|
||||||
int item_getcheck_func_PACHINKO_SHOT();
|
int item_getcheck_func_PACHINKO_SHOT();
|
||||||
|
#if TARGET_PC
|
||||||
|
int item_getcheck_func_ORDON_PORTAL();
|
||||||
|
int item_getcheck_func_SOUTH_FARON_PORTAL();
|
||||||
|
#endif
|
||||||
int item_getcheck_func_WATER_BOMB_5();
|
int item_getcheck_func_WATER_BOMB_5();
|
||||||
int item_getcheck_func_WATER_BOMB_10();
|
int item_getcheck_func_WATER_BOMB_10();
|
||||||
int item_getcheck_func_WATER_BOMB_20();
|
int item_getcheck_func_WATER_BOMB_20();
|
||||||
@@ -254,6 +342,12 @@ int item_getcheck_func_DUNGEON_EXIT_2();
|
|||||||
int item_getcheck_func_WALLET_LV1();
|
int item_getcheck_func_WALLET_LV1();
|
||||||
int item_getcheck_func_WALLET_LV2();
|
int item_getcheck_func_WALLET_LV2();
|
||||||
int item_getcheck_func_WALLET_LV3();
|
int item_getcheck_func_WALLET_LV3();
|
||||||
|
#if TARGET_PC
|
||||||
|
int item_getcheck_func_UPPER_ZORAS_RIVER_PORTAL();
|
||||||
|
int item_getcheck_func_CASTLE_TOWN_PORTAL();
|
||||||
|
int item_getcheck_func_GERUDO_DESERT_PORTAL();
|
||||||
|
int item_getcheck_func_NORTH_FARON_PORTAL();
|
||||||
|
#endif
|
||||||
int item_getcheck_func_ZORAS_JEWEL();
|
int item_getcheck_func_ZORAS_JEWEL();
|
||||||
int item_getcheck_func_HAWK_EYE();
|
int item_getcheck_func_HAWK_EYE();
|
||||||
int item_getcheck_func_WOOD_STICK();
|
int item_getcheck_func_WOOD_STICK();
|
||||||
@@ -270,13 +364,23 @@ int item_getcheck_func_LIGHT_SWORD();
|
|||||||
int item_getcheck_func_FISHING_ROD_1();
|
int item_getcheck_func_FISHING_ROD_1();
|
||||||
int item_getcheck_func_PACHINKO();
|
int item_getcheck_func_PACHINKO();
|
||||||
int item_getcheck_func_COPY_ROD_2();
|
int item_getcheck_func_COPY_ROD_2();
|
||||||
|
#if TARGET_PC
|
||||||
|
int item_getcheck_func_KAKARIKO_GORGE_PORTAL();
|
||||||
|
int item_getcheck_func_KAKARIKO_VILLAGE_PORTAL();
|
||||||
|
#endif
|
||||||
int item_getcheck_func_BOMB_BAG_LV2();
|
int item_getcheck_func_BOMB_BAG_LV2();
|
||||||
int item_getcheck_func_BOMB_BAG_LV1();
|
int item_getcheck_func_BOMB_BAG_LV1();
|
||||||
int item_getcheck_func_BOMB_IN_BAG();
|
int item_getcheck_func_BOMB_IN_BAG();
|
||||||
|
#if TARGET_PC
|
||||||
|
int item_getcheck_func_DEATH_MOUNTAIN_PORTAL();
|
||||||
|
#endif
|
||||||
int item_getcheck_func_LIGHT_ARROW();
|
int item_getcheck_func_LIGHT_ARROW();
|
||||||
int item_getcheck_func_ARROW_LV1();
|
int item_getcheck_func_ARROW_LV1();
|
||||||
int item_getcheck_func_ARROW_LV2();
|
int item_getcheck_func_ARROW_LV2();
|
||||||
int item_getcheck_func_ARROW_LV3();
|
int item_getcheck_func_ARROW_LV3();
|
||||||
|
#if TARGET_PC
|
||||||
|
int item_getcheck_func_ZORAS_DOMAIN_PORTAL();
|
||||||
|
#endif
|
||||||
int item_getcheck_func_LURE_ROD();
|
int item_getcheck_func_LURE_ROD();
|
||||||
int item_getcheck_func_BOMB_ARROW();
|
int item_getcheck_func_BOMB_ARROW();
|
||||||
int item_getcheck_func_HAWK_ARROW();
|
int item_getcheck_func_HAWK_ARROW();
|
||||||
@@ -322,6 +426,10 @@ int item_getcheck_func_BILL();
|
|||||||
int item_getcheck_func_WOOD_STATUE();
|
int item_getcheck_func_WOOD_STATUE();
|
||||||
int item_getcheck_func_IRIAS_PENDANT();
|
int item_getcheck_func_IRIAS_PENDANT();
|
||||||
int item_getcheck_func_HORSE_FLUTE();
|
int item_getcheck_func_HORSE_FLUTE();
|
||||||
|
#if TARGET_PC
|
||||||
|
int item_getcheck_func_CAMP_SMALL_KEY();
|
||||||
|
int item_getcheck_func_LAKE_HYLIA_PORTAL();
|
||||||
|
#endif
|
||||||
int item_getcheck_func_RAFRELS_MEMO();
|
int item_getcheck_func_RAFRELS_MEMO();
|
||||||
int item_getcheck_func_ASHS_SCRIBBLING();
|
int item_getcheck_func_ASHS_SCRIBBLING();
|
||||||
int item_getcheck_func_CHUCHU_YELLOW2();
|
int item_getcheck_func_CHUCHU_YELLOW2();
|
||||||
@@ -336,12 +444,19 @@ int item_getcheck_func_FILLED_CONTAINER();
|
|||||||
int item_getcheck_func_MIRROR_PIECE_2();
|
int item_getcheck_func_MIRROR_PIECE_2();
|
||||||
int item_getcheck_func_MIRROR_PIECE_3();
|
int item_getcheck_func_MIRROR_PIECE_3();
|
||||||
int item_getcheck_func_MIRROR_PIECE_4();
|
int item_getcheck_func_MIRROR_PIECE_4();
|
||||||
|
#if TARGET_PC
|
||||||
|
int item_getcheck_func_MIRROR_CHAMBER_PORTAL();
|
||||||
|
int item_getcheck_func_SNOWPEAK_PORTAL();
|
||||||
|
#endif
|
||||||
int item_getcheck_func_SMELL_YELIA_POUCH();
|
int item_getcheck_func_SMELL_YELIA_POUCH();
|
||||||
int item_getcheck_func_SMELL_PUMPKIN();
|
int item_getcheck_func_SMELL_PUMPKIN();
|
||||||
int item_getcheck_func_SMELL_POH();
|
int item_getcheck_func_SMELL_POH();
|
||||||
int item_getcheck_func_SMELL_FISH();
|
int item_getcheck_func_SMELL_FISH();
|
||||||
int item_getcheck_func_SMELL_CHILDREN();
|
int item_getcheck_func_SMELL_CHILDREN();
|
||||||
int item_getcheck_func_SMELL_MEDICINE();
|
int item_getcheck_func_SMELL_MEDICINE();
|
||||||
|
#if TARGET_PC
|
||||||
|
int item_getcheck_func_SACRED_GROVE_PORTAL();
|
||||||
|
#endif
|
||||||
int item_getcheck_func_M_BEETLE();
|
int item_getcheck_func_M_BEETLE();
|
||||||
int item_getcheck_func_F_BEETLE();
|
int item_getcheck_func_F_BEETLE();
|
||||||
int item_getcheck_func_M_BUTTERFLY();
|
int item_getcheck_func_M_BUTTERFLY();
|
||||||
@@ -366,7 +481,23 @@ int item_getcheck_func_M_ANT();
|
|||||||
int item_getcheck_func_F_ANT();
|
int item_getcheck_func_F_ANT();
|
||||||
int item_getcheck_func_M_MAYFLY();
|
int item_getcheck_func_M_MAYFLY();
|
||||||
int item_getcheck_func_F_MAYFLY();
|
int item_getcheck_func_F_MAYFLY();
|
||||||
|
#if TARGET_PC
|
||||||
|
int item_getcheck_func_FUSED_SHADOW_1();
|
||||||
|
int item_getcheck_func_FUSED_SHADOW_2();
|
||||||
|
int item_getcheck_func_FUSED_SHADOW_3();
|
||||||
|
int item_getcheck_func_MIRROR_PIECE_1();
|
||||||
|
#endif
|
||||||
int item_getcheck_func_POU_SPIRIT();
|
int item_getcheck_func_POU_SPIRIT();
|
||||||
|
#if TARGET_PC
|
||||||
|
int item_getcheck_func_ENDING_BLOW();
|
||||||
|
int item_getcheck_func_SHIELD_ATTACK();
|
||||||
|
int item_getcheck_func_BACK_SLICE();
|
||||||
|
int item_getcheck_func_HELM_SPLITTER();
|
||||||
|
int item_getcheck_func_MORTAL_DRAW();
|
||||||
|
int item_getcheck_func_JUMP_STRIKE();
|
||||||
|
int item_getcheck_func_GREAT_SPIN();
|
||||||
|
int item_getcheck_func_ELDIN_BRIDGE_PORTAL();
|
||||||
|
#endif
|
||||||
int item_getcheck_func_ANCIENT_DOCUMENT();
|
int item_getcheck_func_ANCIENT_DOCUMENT();
|
||||||
int item_getcheck_func_AIR_LETTER();
|
int item_getcheck_func_AIR_LETTER();
|
||||||
int item_getcheck_func_ANCIENT_DOCUMENT2();
|
int item_getcheck_func_ANCIENT_DOCUMENT2();
|
||||||
@@ -395,6 +526,9 @@ int checkItemGet(u8, int);
|
|||||||
BOOL isHeart(u8 item_no);
|
BOOL isHeart(u8 item_no);
|
||||||
int isBomb(u8);
|
int isBomb(u8);
|
||||||
int isArrow(u8);
|
int isArrow(u8);
|
||||||
|
#if TARGET_PC
|
||||||
|
int isRupee(u8);
|
||||||
|
#endif
|
||||||
int addBombCount(u8, u8);
|
int addBombCount(u8, u8);
|
||||||
BOOL isBottleItem(u8 item_no);
|
BOOL isBottleItem(u8 item_no);
|
||||||
u8 check_itemno(int i_itemNo);
|
u8 check_itemno(int i_itemNo);
|
||||||
|
|||||||
@@ -35,7 +35,65 @@ struct dItem_fieldItemResource {
|
|||||||
/* 0xC */ u16 mHeapSize;
|
/* 0xC */ u16 mHeapSize;
|
||||||
}; // Size: 0x10
|
}; // Size: 0x10
|
||||||
|
|
||||||
|
#if TARGET_PC
|
||||||
|
// Delcared helper functions since we can't include dComIfg_isRandomizer here
|
||||||
|
dItem_itemResource* dItem_data_getItemResource();
|
||||||
|
dItem_fieldItemResource* dItem_data_getFieldItemResource();
|
||||||
|
dItem_itemInfo* dItem_data_getItemInfo();
|
||||||
|
#endif
|
||||||
|
|
||||||
struct dItem_data {
|
struct dItem_data {
|
||||||
|
#if TARGET_PC
|
||||||
|
static const char* getArcName(u8 index) { return dItem_data_getItemResource()[index].mArcName; }
|
||||||
|
|
||||||
|
static s16 getBtpName(u8 index) { return dItem_data_getItemResource()[index].mBtpName; }
|
||||||
|
|
||||||
|
static s16 getBrkName(u8 index) { return dItem_data_getItemResource()[index].mBrkName; }
|
||||||
|
|
||||||
|
static s16 getBxaName(u8 index) { return -1; }
|
||||||
|
|
||||||
|
static s16 getBckName(u8 index) { return dItem_data_getItemResource()[index].mBckName; }
|
||||||
|
|
||||||
|
static s16 getBpkName(u8 index) { return -1; }
|
||||||
|
|
||||||
|
static s16 getBtkName(u8 index) { return dItem_data_getItemResource()[index].mBtkName; }
|
||||||
|
|
||||||
|
static s16 getBmdName(u8 index) { return dItem_data_getItemResource()[index].mBmdName; }
|
||||||
|
|
||||||
|
static s8 getTevFrm(u8 index) { return dItem_data_getItemResource()[index].mTevFrm; }
|
||||||
|
|
||||||
|
static s8 getBtpFrm(u8 index) { return dItem_data_getItemResource()[index].mBtpFrm; }
|
||||||
|
|
||||||
|
static s16 getTexture(u8 index) { return dItem_data_getItemResource()[index].mTexture; }
|
||||||
|
|
||||||
|
static u8 getTexScale (u8 index) { return dItem_data_getItemResource()[index].mTexScale; }
|
||||||
|
|
||||||
|
static const char* getFieldArc(u8 index) { return dItem_data_getFieldItemResource()[index].mFieldArc; }
|
||||||
|
|
||||||
|
static s16 getItemBmdName(u8 index) { return dItem_data_getFieldItemResource()[index].mItemBmdName; }
|
||||||
|
|
||||||
|
static s16 getItemBtkName(u8 index) { return -1; }
|
||||||
|
|
||||||
|
static s16 getItemBpkName(u8 index) { return -1; }
|
||||||
|
|
||||||
|
static s16 getItemBckName(u8 index) { return dItem_data_getFieldItemResource()[index].mItemBckName; }
|
||||||
|
|
||||||
|
static s16 getItemBxaName(u8 index) { return -1; }
|
||||||
|
|
||||||
|
static s16 getItemBrkName(u8 index) { return dItem_data_getFieldItemResource()[index].mItemBrkName; }
|
||||||
|
|
||||||
|
static s16 getItemBtpName(u8 index) { return -1; }
|
||||||
|
|
||||||
|
static BOOL chkFlag(u8 index, int flag) { return dItem_data_getItemInfo()[index].mFlag & flag; }
|
||||||
|
|
||||||
|
static u8 getShadowSize(u8 index) { return dItem_data_getItemInfo()[index].mShadowSize; }
|
||||||
|
|
||||||
|
static const u8 getH(u8 index) { return dItem_data_getItemInfo()[index].mH; }
|
||||||
|
|
||||||
|
static const u8 getR(u8 index) { return dItem_data_getItemInfo()[index].mR; }
|
||||||
|
|
||||||
|
static u16 getFieldHeapSize(u8 index) { return dItem_data_getFieldItemResource()[index].mHeapSize; }
|
||||||
|
#else
|
||||||
static const char* getArcName(u8 index) { return item_resource[index].mArcName; }
|
static const char* getArcName(u8 index) { return item_resource[index].mArcName; }
|
||||||
|
|
||||||
static s16 getBtpName(u8 index) { return item_resource[index].mBtpName; }
|
static s16 getBtpName(u8 index) { return item_resource[index].mBtpName; }
|
||||||
@@ -85,10 +143,16 @@ struct dItem_data {
|
|||||||
static const u8 getR(u8 index) { return item_info[index].mR; }
|
static const u8 getR(u8 index) { return item_info[index].mR; }
|
||||||
|
|
||||||
static u16 getFieldHeapSize(u8 index) { return field_item_res[index].mHeapSize; }
|
static u16 getFieldHeapSize(u8 index) { return field_item_res[index].mHeapSize; }
|
||||||
|
#endif
|
||||||
|
|
||||||
static DUSK_GAME_DATA dItem_itemResource item_resource[255];
|
static DUSK_GAME_DATA dItem_itemResource item_resource[255];
|
||||||
static DUSK_GAME_DATA dItem_fieldItemResource field_item_res[255];
|
static DUSK_GAME_DATA dItem_fieldItemResource field_item_res[255];
|
||||||
static DUSK_GAME_DATA dItem_itemInfo item_info[255];
|
static DUSK_GAME_DATA dItem_itemInfo item_info[255];
|
||||||
|
#if TARGET_PC
|
||||||
|
static DUSK_GAME_DATA dItem_itemResource item_resource_randomizer[255];
|
||||||
|
static DUSK_GAME_DATA dItem_fieldItemResource field_item_res_randomizer[255];
|
||||||
|
static DUSK_GAME_DATA dItem_itemInfo item_info_randomizer[255];
|
||||||
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
@@ -350,4 +414,267 @@ enum {
|
|||||||
/* 0xFF */ dItemNo_NONE_e,
|
/* 0xFF */ dItemNo_NONE_e,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#if TARGET_PC
|
||||||
|
// Randomizer item ids. Mostly the same, but we use most unused
|
||||||
|
// entries for custom portals and keys
|
||||||
|
enum {
|
||||||
|
/* 0x00 */ dItemNo_Randomizer_HEART_e,
|
||||||
|
/* 0x01 */ dItemNo_Randomizer_GREEN_RUPEE_e,
|
||||||
|
/* 0x02 */ dItemNo_Randomizer_BLUE_RUPEE_e,
|
||||||
|
/* 0x03 */ dItemNo_Randomizer_YELLOW_RUPEE_e,
|
||||||
|
/* 0x04 */ dItemNo_Randomizer_RED_RUPEE_e,
|
||||||
|
/* 0x05 */ dItemNo_Randomizer_PURPLE_RUPEE_e,
|
||||||
|
/* 0x06 */ dItemNo_Randomizer_ORANGE_RUPEE_e,
|
||||||
|
/* 0x07 */ dItemNo_Randomizer_SILVER_RUPEE_e,
|
||||||
|
/* 0x08 */ dItemNo_Randomizer_S_MAGIC_e,
|
||||||
|
/* 0x09 */ dItemNo_Randomizer_L_MAGIC_e,
|
||||||
|
/* 0x0A */ dItemNo_Randomizer_BOMB_5_e,
|
||||||
|
/* 0x0B */ dItemNo_Randomizer_BOMB_10_e,
|
||||||
|
/* 0x0C */ dItemNo_Randomizer_BOMB_20_e,
|
||||||
|
/* 0x0D */ dItemNo_Randomizer_BOMB_30_e,
|
||||||
|
/* 0x0E */ dItemNo_Randomizer_ARROW_10_e,
|
||||||
|
/* 0x0F */ dItemNo_Randomizer_ARROW_20_e,
|
||||||
|
/* 0x10 */ dItemNo_Randomizer_ARROW_30_e,
|
||||||
|
/* 0x11 */ dItemNo_Randomizer_ARROW_1_e,
|
||||||
|
/* 0x12 */ dItemNo_Randomizer_PACHINKO_SHOT_e,
|
||||||
|
/* 0x13 */ dItemNo_Randomizer_FOOLISH_ITEM_e,
|
||||||
|
/* 0x14 */ dItemNo_Randomizer_ORDON_PORTAL_e,
|
||||||
|
/* 0x15 */ dItemNo_Randomizer_SOUTH_FARON_PORTAL_e,
|
||||||
|
/* 0x16 */ dItemNo_Randomizer_WATER_BOMB_5_e,
|
||||||
|
/* 0x17 */ dItemNo_Randomizer_WATER_BOMB_10_e,
|
||||||
|
/* 0x18 */ dItemNo_Randomizer_WATER_BOMB_20_e,
|
||||||
|
/* 0x19 */ dItemNo_Randomizer_WATER_BOMB_30_e,
|
||||||
|
/* 0x1A */ dItemNo_Randomizer_BOMB_INSECT_5_e,
|
||||||
|
/* 0x1B */ dItemNo_Randomizer_BOMB_INSECT_10_e,
|
||||||
|
/* 0x1C */ dItemNo_Randomizer_BOMB_INSECT_20_e,
|
||||||
|
/* 0x1D */ dItemNo_Randomizer_BOMB_INSECT_30_e,
|
||||||
|
/* 0x1E */ dItemNo_Randomizer_RECOVERY_FAILY_e,
|
||||||
|
/* 0x1F */ dItemNo_Randomizer_TRIPLE_HEART_e,
|
||||||
|
/* 0x20 */ dItemNo_Randomizer_SMALL_KEY_e,
|
||||||
|
/* 0x21 */ dItemNo_Randomizer_KAKERA_HEART_e,
|
||||||
|
/* 0x22 */ dItemNo_Randomizer_UTAWA_HEART_e,
|
||||||
|
/* 0x23 */ dItemNo_Randomizer_MAP_e,
|
||||||
|
/* 0x24 */ dItemNo_Randomizer_COMPUS_e,
|
||||||
|
/* 0x25 */ dItemNo_Randomizer_DUNGEON_EXIT_e,
|
||||||
|
/* 0x26 */ dItemNo_Randomizer_BOSS_KEY_e,
|
||||||
|
/* 0x27 */ dItemNo_Randomizer_DUNGEON_BACK_e,
|
||||||
|
/* 0x28 */ dItemNo_Randomizer_SWORD_e,
|
||||||
|
/* 0x29 */ dItemNo_Randomizer_MASTER_SWORD_e,
|
||||||
|
/* 0x2A */ dItemNo_Randomizer_WOOD_SHIELD_e,
|
||||||
|
/* 0x2B */ dItemNo_Randomizer_SHIELD_e,
|
||||||
|
/* 0x2C */ dItemNo_Randomizer_HYLIA_SHIELD_e,
|
||||||
|
/* 0x2D */ dItemNo_Randomizer_TKS_LETTER_e,
|
||||||
|
/* 0x2E */ dItemNo_Randomizer_WEAR_CASUAL_e,
|
||||||
|
/* 0x2F */ dItemNo_Randomizer_WEAR_KOKIRI_e,
|
||||||
|
/* 0x30 */ dItemNo_Randomizer_ARMOR_e,
|
||||||
|
/* 0x31 */ dItemNo_Randomizer_WEAR_ZORA_e,
|
||||||
|
/* 0x32 */ dItemNo_Randomizer_MAGIC_LV1_e,
|
||||||
|
/* 0x33 */ dItemNo_Randomizer_DUNGEON_EXIT_2_e,
|
||||||
|
/* 0x34 */ dItemNo_Randomizer_WALLET_LV1_e,
|
||||||
|
/* 0x35 */ dItemNo_Randomizer_WALLET_LV2_e,
|
||||||
|
/* 0x36 */ dItemNo_Randomizer_WALLET_LV3_e,
|
||||||
|
/* 0x37 */ dItemNo_Randomizer_NOENTRY_55_e,
|
||||||
|
/* 0x38 */ dItemNo_Randomizer_NOENTRY_56_e,
|
||||||
|
/* 0x39 */ dItemNo_Randomizer_UPPER_ZORAS_RIVER_PORTAL_e,
|
||||||
|
/* 0x3A */ dItemNo_Randomizer_CASTLE_TOWN_PORTAL_e,
|
||||||
|
/* 0x3B */ dItemNo_Randomizer_GERUDO_DESERT_PORTAL_e,
|
||||||
|
/* 0x3C */ dItemNo_Randomizer_NORTH_FARON_PORTAL_e,
|
||||||
|
/* 0x3D */ dItemNo_Randomizer_ZORAS_JEWEL_e,
|
||||||
|
/* 0x3E */ dItemNo_Randomizer_HAWK_EYE_e,
|
||||||
|
/* 0x3F */ dItemNo_Randomizer_WOOD_STICK_e,
|
||||||
|
/* 0x40 */ dItemNo_Randomizer_BOOMERANG_e,
|
||||||
|
/* 0x41 */ dItemNo_Randomizer_SPINNER_e,
|
||||||
|
/* 0x42 */ dItemNo_Randomizer_IRONBALL_e,
|
||||||
|
/* 0x43 */ dItemNo_Randomizer_BOW_e,
|
||||||
|
/* 0x44 */ dItemNo_Randomizer_HOOKSHOT_e,
|
||||||
|
/* 0x45 */ dItemNo_Randomizer_HVY_BOOTS_e,
|
||||||
|
/* 0x46 */ dItemNo_Randomizer_COPY_ROD_e,
|
||||||
|
/* 0x47 */ dItemNo_Randomizer_W_HOOKSHOT_e,
|
||||||
|
/* 0x48 */ dItemNo_Randomizer_KANTERA_e,
|
||||||
|
/* 0x49 */ dItemNo_Randomizer_LIGHT_SWORD_e,
|
||||||
|
/* 0x4A */ dItemNo_Randomizer_FISHING_ROD_1_e,
|
||||||
|
/* 0x4B */ dItemNo_Randomizer_PACHINKO_e,
|
||||||
|
/* 0x4C */ dItemNo_Randomizer_COPY_ROD_2_e,
|
||||||
|
/* 0x4D */ dItemNo_Randomizer_KAKARIKO_GORGE_PORTAL_e,
|
||||||
|
/* 0x4E */ dItemNo_Randomizer_KAKARIKO_VILLAGE_PORTAL_e,
|
||||||
|
/* 0x4F */ dItemNo_Randomizer_BOMB_BAG_LV2_e,
|
||||||
|
/* 0x50 */ dItemNo_Randomizer_BOMB_BAG_LV1_e,
|
||||||
|
/* 0x51 */ dItemNo_Randomizer_BOMB_IN_BAG_e,
|
||||||
|
/* 0x52 */ dItemNo_Randomizer_DEATH_MOUNTAIN_PORTAL_e,
|
||||||
|
/* 0x53 */ dItemNo_Randomizer_LIGHT_ARROW_e,
|
||||||
|
/* 0x54 */ dItemNo_Randomizer_ARROW_LV1_e,
|
||||||
|
/* 0x55 */ dItemNo_Randomizer_ARROW_LV2_e,
|
||||||
|
/* 0x56 */ dItemNo_Randomizer_ARROW_LV3_e,
|
||||||
|
/* 0x57 */ dItemNo_Randomizer_ZORAS_DOMAIN_PORTAL_e,
|
||||||
|
/* 0x58 */ dItemNo_Randomizer_LURE_ROD_e,
|
||||||
|
/* 0x59 */ dItemNo_Randomizer_BOMB_ARROW_e,
|
||||||
|
/* 0x5A */ dItemNo_Randomizer_HAWK_ARROW_e,
|
||||||
|
/* 0x5B */ dItemNo_Randomizer_BEE_ROD_e,
|
||||||
|
/* 0x5C */ dItemNo_Randomizer_JEWEL_ROD_e,
|
||||||
|
/* 0x5D */ dItemNo_Randomizer_WORM_ROD_e,
|
||||||
|
/* 0x5E */ dItemNo_Randomizer_JEWEL_BEE_ROD_e,
|
||||||
|
/* 0x5F */ dItemNo_Randomizer_JEWEL_WORM_ROD_e,
|
||||||
|
/* 0x60 */ dItemNo_Randomizer_EMPTY_BOTTLE_e,
|
||||||
|
/* 0x61 */ dItemNo_Randomizer_RED_BOTTLE_e,
|
||||||
|
/* 0x62 */ dItemNo_Randomizer_GREEN_BOTTLE_e,
|
||||||
|
/* 0x63 */ dItemNo_Randomizer_BLUE_BOTTLE_e,
|
||||||
|
/* 0x64 */ dItemNo_Randomizer_MILK_BOTTLE_e,
|
||||||
|
/* 0x65 */ dItemNo_Randomizer_HALF_MILK_BOTTLE_e,
|
||||||
|
/* 0x66 */ dItemNo_Randomizer_OIL_BOTTLE_e,
|
||||||
|
/* 0x67 */ dItemNo_Randomizer_WATER_BOTTLE_e,
|
||||||
|
/* 0x68 */ dItemNo_Randomizer_OIL_BOTTLE_2_e,
|
||||||
|
/* 0x69 */ dItemNo_Randomizer_RED_BOTTLE_2_e,
|
||||||
|
/* 0x6A */ dItemNo_Randomizer_UGLY_SOUP_e,
|
||||||
|
/* 0x6B */ dItemNo_Randomizer_HOT_SPRING_e,
|
||||||
|
/* 0x6C */ dItemNo_Randomizer_FAIRY_e,
|
||||||
|
/* 0x6D */ dItemNo_Randomizer_HOT_SPRING_2_e,
|
||||||
|
/* 0x6E */ dItemNo_Randomizer_OIL2_e,
|
||||||
|
/* 0x6F */ dItemNo_Randomizer_OIL_e,
|
||||||
|
/* 0x70 */ dItemNo_Randomizer_NORMAL_BOMB_e,
|
||||||
|
/* 0x71 */ dItemNo_Randomizer_WATER_BOMB_e,
|
||||||
|
/* 0x72 */ dItemNo_Randomizer_POKE_BOMB_e,
|
||||||
|
/* 0x73 */ dItemNo_Randomizer_FAIRY_DROP_e,
|
||||||
|
/* 0x74 */ dItemNo_Randomizer_WORM_e,
|
||||||
|
/* 0x75 */ dItemNo_Randomizer_DROP_BOTTLE_e,
|
||||||
|
/* 0x76 */ dItemNo_Randomizer_BEE_CHILD_e,
|
||||||
|
/* 0x77 */ dItemNo_Randomizer_CHUCHU_RARE_e,
|
||||||
|
/* 0x78 */ dItemNo_Randomizer_CHUCHU_RED_e,
|
||||||
|
/* 0x79 */ dItemNo_Randomizer_CHUCHU_BLUE_e,
|
||||||
|
/* 0x7A */ dItemNo_Randomizer_CHUCHU_GREEN_e,
|
||||||
|
/* 0x7B */ dItemNo_Randomizer_CHUCHU_YELLOW_e,
|
||||||
|
/* 0x7C */ dItemNo_Randomizer_CHUCHU_PURPLE_e,
|
||||||
|
/* 0x7D */ dItemNo_Randomizer_LV1_SOUP_e,
|
||||||
|
/* 0x7E */ dItemNo_Randomizer_LV2_SOUP_e,
|
||||||
|
/* 0x7F */ dItemNo_Randomizer_LV3_SOUP_e,
|
||||||
|
/* 0x80 */ dItemNo_Randomizer_LETTER_e,
|
||||||
|
/* 0x81 */ dItemNo_Randomizer_BILL_e,
|
||||||
|
/* 0x82 */ dItemNo_Randomizer_WOOD_STATUE_e,
|
||||||
|
/* 0x83 */ dItemNo_Randomizer_IRIAS_PENDANT_e,
|
||||||
|
/* 0x84 */ dItemNo_Randomizer_HORSE_FLUTE_e,
|
||||||
|
/* 0x85 */ dItemNo_Randomizer_FOREST_SMALL_KEY_e,
|
||||||
|
/* 0x86 */ dItemNo_Randomizer_MINES_SMALL_KEY_e,
|
||||||
|
/* 0x87 */ dItemNo_Randomizer_LAKEBED_SMALL_KEY_e,
|
||||||
|
/* 0x88 */ dItemNo_Randomizer_ARBITERS_SMALL_KEY_e,
|
||||||
|
/* 0x89 */ dItemNo_Randomizer_SNOWPEAK_SMALL_KEY_e,
|
||||||
|
/* 0x8A */ dItemNo_Randomizer_TEMPLE_OF_TIME_SMALL_KEY_e,
|
||||||
|
/* 0x8B */ dItemNo_Randomizer_CITY_SMALL_KEY_e,
|
||||||
|
/* 0x8C */ dItemNo_Randomizer_PALACE_SMALL_KEY_e,
|
||||||
|
/* 0x8D */ dItemNo_Randomizer_HYRULE_SMALL_KEY_e,
|
||||||
|
/* 0x8E */ dItemNo_Randomizer_CAMP_SMALL_KEY_e,
|
||||||
|
/* 0x8F */ dItemNo_Randomizer_LAKE_HYLIA_PORTAL_e,
|
||||||
|
/* 0x90 */ dItemNo_Randomizer_RAFRELS_MEMO_e,
|
||||||
|
/* 0x91 */ dItemNo_Randomizer_ASHS_SCRIBBLING_e,
|
||||||
|
/* 0x92 */ dItemNo_Randomizer_FOREST_BOSS_KEY_e,
|
||||||
|
/* 0x93 */ dItemNo_Randomizer_LAKEBED_BOSS_KEY_e,
|
||||||
|
/* 0x94 */ dItemNo_Randomizer_ARBITERS_BOSS_KEY_e,
|
||||||
|
/* 0x95 */ dItemNo_Randomizer_TEMPLE_OF_TIME_BOSS_KEY_e,
|
||||||
|
/* 0x96 */ dItemNo_Randomizer_CITY_BOSS_KEY_e,
|
||||||
|
/* 0x97 */ dItemNo_Randomizer_PALACE_BOSS_KEY_e,
|
||||||
|
/* 0x98 */ dItemNo_Randomizer_HYRULE_BOSS_KEY_e,
|
||||||
|
/* 0x99 */ dItemNo_Randomizer_FOREST_COMPASS_e,
|
||||||
|
/* 0x9A */ dItemNo_Randomizer_MINES_COMPASS_e,
|
||||||
|
/* 0x9B */ dItemNo_Randomizer_LAKEBED_COMPASS_e,
|
||||||
|
/* 0x9C */ dItemNo_Randomizer_CHUCHU_YELLOW2_e,
|
||||||
|
/* 0x9D */ dItemNo_Randomizer_OIL_BOTTLE3_e,
|
||||||
|
/* 0x9E */ dItemNo_Randomizer_SHOP_BEE_CHILD_e,
|
||||||
|
/* 0x9F */ dItemNo_Randomizer_CHUCHU_BLACK_e,
|
||||||
|
/* 0xA0 */ dItemNo_Randomizer_LIGHT_DROP_e,
|
||||||
|
/* 0xA1 */ dItemNo_Randomizer_DROP_CONTAINER_e,
|
||||||
|
/* 0xA2 */ dItemNo_Randomizer_DROP_CONTAINER02_e,
|
||||||
|
/* 0xA3 */ dItemNo_Randomizer_DROP_CONTAINER03_e,
|
||||||
|
/* 0xA4 */ dItemNo_Randomizer_FILLED_CONTAINER_e,
|
||||||
|
/* 0xA5 */ dItemNo_Randomizer_MIRROR_PIECE_2_e,
|
||||||
|
/* 0xA6 */ dItemNo_Randomizer_MIRROR_PIECE_3_e,
|
||||||
|
/* 0xA7 */ dItemNo_Randomizer_MIRROR_PIECE_4_e,
|
||||||
|
/* 0xA8 */ dItemNo_Randomizer_ARBITERS_COMPASS_e,
|
||||||
|
/* 0xA9 */ dItemNo_Randomizer_SNOWPEAK_COMPASS_e,
|
||||||
|
/* 0xAA */ dItemNo_Randomizer_TEMPLE_OF_TIME_COMPASS_e,
|
||||||
|
/* 0xAB */ dItemNo_Randomizer_CITY_COMPASS_e,
|
||||||
|
/* 0xAC */ dItemNo_Randomizer_PALACE_COMPASS_e,
|
||||||
|
/* 0xAD */ dItemNo_Randomizer_HYRULE_COMPASS_e,
|
||||||
|
/* 0xAE */ dItemNo_Randomizer_MIRROR_CHAMBER_PORTAL_e,
|
||||||
|
/* 0xAF */ dItemNo_Randomizer_SNOWPEAK_PORTAL_e,
|
||||||
|
/* 0xB0 */ dItemNo_Randomizer_SMELL_YELIA_POUCH_e,
|
||||||
|
/* 0xB1 */ dItemNo_Randomizer_SMELL_PUMPKIN_e,
|
||||||
|
/* 0xB2 */ dItemNo_Randomizer_SMELL_POH_e,
|
||||||
|
/* 0xB3 */ dItemNo_Randomizer_SMELL_FISH_e,
|
||||||
|
/* 0xB4 */ dItemNo_Randomizer_SMELL_CHILDREN_e,
|
||||||
|
/* 0xB5 */ dItemNo_Randomizer_SMELL_MEDICINE_e,
|
||||||
|
/* 0xB6 */ dItemNo_Randomizer_FOREST_MAP_e,
|
||||||
|
/* 0xB7 */ dItemNo_Randomizer_MINES_MAP_e,
|
||||||
|
/* 0xB8 */ dItemNo_Randomizer_LAKEBED_MAP_e,
|
||||||
|
/* 0xB9 */ dItemNo_Randomizer_ARBITERS_MAP_e,
|
||||||
|
/* 0xBA */ dItemNo_Randomizer_SNOWPEAK_MAP_e,
|
||||||
|
/* 0xBB */ dItemNo_Randomizer_TEMPLE_OF_TIME_MAP_e,
|
||||||
|
/* 0xBC */ dItemNo_Randomizer_CITY_MAP_e,
|
||||||
|
/* 0xBD */ dItemNo_Randomizer_PALACE_MAP_e,
|
||||||
|
/* 0xBE */ dItemNo_Randomizer_HYRULE_MAP_e,
|
||||||
|
/* 0xBF */ dItemNo_Randomizer_SACRED_GROVE_PORTAL_e,
|
||||||
|
/* 0xC0 */ dItemNo_Randomizer_M_BEETLE_e,
|
||||||
|
/* 0xC1 */ dItemNo_Randomizer_F_BEETLE_e,
|
||||||
|
/* 0xC2 */ dItemNo_Randomizer_M_BUTTERFLY_e,
|
||||||
|
/* 0xC3 */ dItemNo_Randomizer_F_BUTTERFLY_e,
|
||||||
|
/* 0xC4 */ dItemNo_Randomizer_M_STAG_BEETLE_e,
|
||||||
|
/* 0xC5 */ dItemNo_Randomizer_F_STAG_BEETLE_e,
|
||||||
|
/* 0xC6 */ dItemNo_Randomizer_M_GRASSHOPPER_e,
|
||||||
|
/* 0xC7 */ dItemNo_Randomizer_F_GRASSHOPPER_e,
|
||||||
|
/* 0xC8 */ dItemNo_Randomizer_M_NANAFUSHI_e,
|
||||||
|
/* 0xC9 */ dItemNo_Randomizer_F_NANAFUSHI_e,
|
||||||
|
/* 0xCA */ dItemNo_Randomizer_M_DANGOMUSHI_e,
|
||||||
|
/* 0xCB */ dItemNo_Randomizer_F_DANGOMUSHI_e,
|
||||||
|
/* 0xCC */ dItemNo_Randomizer_M_MANTIS_e,
|
||||||
|
/* 0xCD */ dItemNo_Randomizer_F_MANTIS_e,
|
||||||
|
/* 0xCE */ dItemNo_Randomizer_M_LADYBUG_e,
|
||||||
|
/* 0xCF */ dItemNo_Randomizer_F_LADYBUG_e,
|
||||||
|
/* 0xD0 */ dItemNo_Randomizer_M_SNAIL_e,
|
||||||
|
/* 0xD1 */ dItemNo_Randomizer_F_SNAIL_e,
|
||||||
|
/* 0xD2 */ dItemNo_Randomizer_M_DRAGONFLY_e,
|
||||||
|
/* 0xD3 */ dItemNo_Randomizer_F_DRAGONFLY_e,
|
||||||
|
/* 0xD4 */ dItemNo_Randomizer_M_ANT_e,
|
||||||
|
/* 0xD5 */ dItemNo_Randomizer_F_ANT_e,
|
||||||
|
/* 0xD6 */ dItemNo_Randomizer_M_MAYFLY_e,
|
||||||
|
/* 0xD7 */ dItemNo_Randomizer_F_MAYFLY_e,
|
||||||
|
/* 0xD8 */ dItemNo_Randomizer_FUSED_SHADOW_1_e,
|
||||||
|
/* 0xD9 */ dItemNo_Randomizer_FUSED_SHADOW_2_e,
|
||||||
|
/* 0xDA */ dItemNo_Randomizer_FUSED_SHADOW_3_e,
|
||||||
|
/* 0xDB */ dItemNo_Randomizer_MIRROR_PIECE_1_e,
|
||||||
|
/* 0xDC */ dItemNo_Randomizer_NOENTRY_220_e,
|
||||||
|
/* 0xDD */ dItemNo_Randomizer_NOENTRY_221_e,
|
||||||
|
/* 0xDE */ dItemNo_Randomizer_NOENTRY_222_e,
|
||||||
|
/* 0xDF */ dItemNo_Randomizer_NOENTRY_223_e,
|
||||||
|
/* 0xE0 */ dItemNo_Randomizer_POU_SPIRIT_e,
|
||||||
|
/* 0xE1 */ dItemNo_Randomizer_ENDING_BLOW_e,
|
||||||
|
/* 0xE2 */ dItemNo_Randomizer_SHIELD_ATTACK_e,
|
||||||
|
/* 0xE3 */ dItemNo_Randomizer_BACK_SLICE_e,
|
||||||
|
/* 0xE4 */ dItemNo_Randomizer_HELM_SPLITTER_e,
|
||||||
|
/* 0xE5 */ dItemNo_Randomizer_MORTAL_DRAW_e,
|
||||||
|
/* 0xE6 */ dItemNo_Randomizer_JUMP_STRIKE_e,
|
||||||
|
/* 0xE7 */ dItemNo_Randomizer_GREAT_SPIN_e,
|
||||||
|
/* 0xE8 */ dItemNo_Randomizer_ELDIN_BRIDGE_PORTAL_e,
|
||||||
|
/* 0xE9 */ dItemNo_Randomizer_ANCIENT_DOCUMENT_e,
|
||||||
|
/* 0xEA */ dItemNo_Randomizer_AIR_LETTER_e,
|
||||||
|
/* 0xEB */ dItemNo_Randomizer_ANCIENT_DOCUMENT2_e,
|
||||||
|
/* 0xEC */ dItemNo_Randomizer_LV7_DUNGEON_EXIT_e,
|
||||||
|
/* 0xED */ dItemNo_Randomizer_LINKS_SAVINGS_e,
|
||||||
|
/* 0xEE */ dItemNo_Randomizer_SMALL_KEY2_e,
|
||||||
|
/* 0xEF */ dItemNo_Randomizer_POU_FIRE1_e,
|
||||||
|
/* 0xF0 */ dItemNo_Randomizer_POU_FIRE2_e,
|
||||||
|
/* 0xF1 */ dItemNo_Randomizer_POU_FIRE3_e,
|
||||||
|
/* 0xF2 */ dItemNo_Randomizer_POU_FIRE4_e,
|
||||||
|
/* 0xF3 */ dItemNo_Randomizer_BOSSRIDER_KEY_e,
|
||||||
|
/* 0xF4 */ dItemNo_Randomizer_TOMATO_PUREE_e,
|
||||||
|
/* 0xF5 */ dItemNo_Randomizer_TASTE_e,
|
||||||
|
/* 0xF6 */ dItemNo_Randomizer_LV5_BOSS_KEY_e,
|
||||||
|
/* 0xF7 */ dItemNo_Randomizer_SURFBOARD_e,
|
||||||
|
/* 0xF8 */ dItemNo_Randomizer_KANTERA2_e,
|
||||||
|
/* 0xF9 */ dItemNo_Randomizer_L2_KEY_PIECES1_e,
|
||||||
|
/* 0xFA */ dItemNo_Randomizer_L2_KEY_PIECES2_e,
|
||||||
|
/* 0xFB */ dItemNo_Randomizer_L2_KEY_PIECES3_e,
|
||||||
|
/* 0xFC */ dItemNo_Randomizer_KEY_OF_CARAVAN_e,
|
||||||
|
/* 0xFD */ dItemNo_Randomizer_LV2_BOSS_KEY_e,
|
||||||
|
/* 0xFE */ dItemNo_Randomizer_KEY_OF_FILONE_e,
|
||||||
|
/* 0xFF */ dItemNo_Randomizer_NONE_e,
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif /* D_D_ITEM_DATA_H */
|
#endif /* D_D_ITEM_DATA_H */
|
||||||
|
|||||||
@@ -75,6 +75,7 @@ public:
|
|||||||
bool dpdMove();
|
bool dpdMove();
|
||||||
u8 openExplain(u8);
|
u8 openExplain(u8);
|
||||||
#if TARGET_PC
|
#if TARGET_PC
|
||||||
|
void updateSlotImage(u8 slot);
|
||||||
bool pointerMove();
|
bool pointerMove();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -219,6 +220,7 @@ private:
|
|||||||
bool mCursorInterpCurrAngular;
|
bool mCursorInterpCurrAngular;
|
||||||
bool mCursorInterpInit;
|
bool mCursorInterpInit;
|
||||||
bool mPointerTouchPressHoveredCurrent;
|
bool mPointerTouchPressHoveredCurrent;
|
||||||
|
J2DPicture* mDpadIcon;
|
||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -129,7 +129,9 @@ public:
|
|||||||
bool getPlayerSubject();
|
bool getPlayerSubject();
|
||||||
bool isBButtonShow(bool);
|
bool isBButtonShow(bool);
|
||||||
s16 getButtonTimer();
|
s16 getButtonTimer();
|
||||||
|
#if TARGET_PC
|
||||||
|
f32 getZButtonAlpha() { return mButtonZAlpha;}
|
||||||
|
#endif
|
||||||
virtual ~dMeter2Draw_c();
|
virtual ~dMeter2Draw_c();
|
||||||
|
|
||||||
J2DScreen* getMainScreenPtr() { return mpScreen; }
|
J2DScreen* getMainScreenPtr() { return mpScreen; }
|
||||||
|
|||||||
@@ -41,6 +41,26 @@ public:
|
|||||||
/* 0x12 */ BE(u16) unk_0x12;
|
/* 0x12 */ BE(u16) unk_0x12;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#if TARGET_PC
|
||||||
|
// Default attributes for custom text ids
|
||||||
|
static JMSMesgEntry_c defaultJMSMesgEntry{
|
||||||
|
.string_offset = 0,
|
||||||
|
.message_id = 0,
|
||||||
|
.event_label_id = 0,
|
||||||
|
.se_speaker = 0x24,
|
||||||
|
.fuki_kind = 0x00,
|
||||||
|
.output_type = 0x00,
|
||||||
|
.fuki_pos_type = 0x00,
|
||||||
|
.unk_0xc = 0xFF,
|
||||||
|
.unk_0xd = 0x00,
|
||||||
|
.se_mood = 0x00,
|
||||||
|
.camera_id = 0x00,
|
||||||
|
.base_anm_id = 0x02,
|
||||||
|
.face_anm_id = 0x03,
|
||||||
|
.unk_0x12 = 0x0400,
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
class JMSMesgInfo_c {
|
class JMSMesgInfo_c {
|
||||||
public:
|
public:
|
||||||
/* 0x00 */ bmg_section_t header; // section header
|
/* 0x00 */ bmg_section_t header; // section header
|
||||||
@@ -48,6 +68,9 @@ public:
|
|||||||
/* 0x0A */ BE(u16) entry_size; // size of an entry
|
/* 0x0A */ BE(u16) entry_size; // size of an entry
|
||||||
/* 0x0C */ u8 padding[4]; // padding
|
/* 0x0C */ u8 padding[4]; // padding
|
||||||
/* 0x10 */ JMSMesgEntry_c entries[0];
|
/* 0x10 */ JMSMesgEntry_c entries[0];
|
||||||
|
#if TARGET_PC
|
||||||
|
JMSMesgEntry_c& getEntry(u16 index);
|
||||||
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
class COutFont_c;
|
class COutFont_c;
|
||||||
|
|||||||
+25
-2
@@ -58,6 +58,9 @@ public:
|
|||||||
int checkEventRender(int*, int*, int*, int*);
|
int checkEventRender(int*, int*, int*, int*);
|
||||||
void remove();
|
void remove();
|
||||||
u16 getEventId(int*);
|
u16 getEventId(int*);
|
||||||
|
#if TARGET_PC
|
||||||
|
u16 getEventId();
|
||||||
|
#endif
|
||||||
u32 getMsgNo();
|
u32 getMsgNo();
|
||||||
u32 getNowMsgNo();
|
u32 getNowMsgNo();
|
||||||
msg_class* getMsg();
|
msg_class* getMsg();
|
||||||
@@ -128,6 +131,11 @@ public:
|
|||||||
u16 query051(mesg_flow_node_branch*, fopAc_ac_c*, int);
|
u16 query051(mesg_flow_node_branch*, fopAc_ac_c*, int);
|
||||||
u16 query052(mesg_flow_node_branch*, fopAc_ac_c*, int);
|
u16 query052(mesg_flow_node_branch*, fopAc_ac_c*, int);
|
||||||
u16 query053(mesg_flow_node_branch*, fopAc_ac_c*, int);
|
u16 query053(mesg_flow_node_branch*, fopAc_ac_c*, int);
|
||||||
|
#if TARGET_PC
|
||||||
|
u16 query054(mesg_flow_node_branch*, fopAc_ac_c*, int);
|
||||||
|
u16 query055(mesg_flow_node_branch*, fopAc_ac_c*, int);
|
||||||
|
u16 query056(mesg_flow_node_branch*, fopAc_ac_c*, int);
|
||||||
|
#endif
|
||||||
int event000(mesg_flow_node_event*, fopAc_ac_c*);
|
int event000(mesg_flow_node_event*, fopAc_ac_c*);
|
||||||
int event001(mesg_flow_node_event*, fopAc_ac_c*);
|
int event001(mesg_flow_node_event*, fopAc_ac_c*);
|
||||||
int event002(mesg_flow_node_event*, fopAc_ac_c*);
|
int event002(mesg_flow_node_event*, fopAc_ac_c*);
|
||||||
@@ -171,6 +179,12 @@ public:
|
|||||||
int event040(mesg_flow_node_event*, fopAc_ac_c*);
|
int event040(mesg_flow_node_event*, fopAc_ac_c*);
|
||||||
int event041(mesg_flow_node_event*, fopAc_ac_c*);
|
int event041(mesg_flow_node_event*, fopAc_ac_c*);
|
||||||
int event042(mesg_flow_node_event*, fopAc_ac_c*);
|
int event042(mesg_flow_node_event*, fopAc_ac_c*);
|
||||||
|
#if TARGET_PC
|
||||||
|
// events for rando
|
||||||
|
int event043(mesg_flow_node_event*, fopAc_ac_c*);
|
||||||
|
int event044(mesg_flow_node_event*, fopAc_ac_c*);
|
||||||
|
int event045(mesg_flow_node_event*, fopAc_ac_c*);
|
||||||
|
#endif
|
||||||
|
|
||||||
void initWord(fopAc_ac_c*, const char*, u8, int, fopAc_ac_c**);
|
void initWord(fopAc_ac_c*, const char*, u8, int, fopAc_ac_c**);
|
||||||
|
|
||||||
@@ -185,8 +199,17 @@ public:
|
|||||||
void setMsg(u32 msg) { mMsg = msg; }
|
void setMsg(u32 msg) { mMsg = msg; }
|
||||||
bool checkEndFlow() { return (u32)field_0x26 == 1; }
|
bool checkEndFlow() { return (u32)field_0x26 == 1; }
|
||||||
|
|
||||||
static DUSK_GAME_DATA queryFunc mQueryList[53];
|
static DUSK_GAME_DATA queryFunc mQueryList[DUSK_IF_ELSE(56, 53)];
|
||||||
static DUSK_GAME_DATA eventFunc mEventList[43];
|
static DUSK_GAME_DATA eventFunc mEventList[DUSK_IF_ELSE(46, 43)];
|
||||||
|
|
||||||
|
#if TARGET_PC
|
||||||
|
// patch funcs for rando
|
||||||
|
u32 getKeyForIndex(u16 nodeIdx);
|
||||||
|
void randoPatchNodeType(u8& type, u16 nodeIdx);
|
||||||
|
void randoPatchMessageNode(mesg_flow_node*& message_node, u16 nodeIdx);
|
||||||
|
void randoPatchBranchNode(mesg_flow_node_branch*& branch_node, u16 nodeIdx);
|
||||||
|
void randoPatchEventNode(mesg_flow_node_event*& event_node, u16 nodeIdx);
|
||||||
|
#endif
|
||||||
|
|
||||||
private:
|
private:
|
||||||
/* 0x04 */ u8* mFlow_p;
|
/* 0x04 */ u8* mFlow_p;
|
||||||
|
|||||||
@@ -199,6 +199,9 @@ public:
|
|||||||
void setTime(f32 i_time) { mTime = i_time; }
|
void setTime(f32 i_time) { mTime = i_time; }
|
||||||
u16 getDate() const { return mDate; }
|
u16 getDate() const { return mDate; }
|
||||||
void setDate(u16 i_date) { mDate = i_date; }
|
void setDate(u16 i_date) { mDate = i_date; }
|
||||||
|
#if TARGET_PC
|
||||||
|
u8 getDarkClearLV() const { return mDarkClearLevelFlag; }
|
||||||
|
#endif
|
||||||
|
|
||||||
/* 0x00 */ BE(OSTime) mDateIpl;
|
/* 0x00 */ BE(OSTime) mDateIpl;
|
||||||
/* 0x08 */ u8 mTransformLevelFlag;
|
/* 0x08 */ u8 mTransformLevelFlag;
|
||||||
@@ -272,6 +275,9 @@ public:
|
|||||||
bool isFieldDataExistFlag() const { return mFieldDataExistFlag ? true : false; }
|
bool isFieldDataExistFlag() const { return mFieldDataExistFlag ? true : false; }
|
||||||
void offFieldDataExistFlag() { mFieldDataExistFlag = false; }
|
void offFieldDataExistFlag() { mFieldDataExistFlag = false; }
|
||||||
void onFieldDataExistFlag() { mFieldDataExistFlag = true; }
|
void onFieldDataExistFlag() { mFieldDataExistFlag = true; }
|
||||||
|
#if TARGET_PC
|
||||||
|
void setRegionBit(u8 region) { mRegion |= region;}
|
||||||
|
#endif
|
||||||
|
|
||||||
#if TARGET_PC
|
#if TARGET_PC
|
||||||
/* 0x00 */ BE(Vec) mPos;
|
/* 0x00 */ BE(Vec) mPos;
|
||||||
@@ -376,12 +382,21 @@ public:
|
|||||||
void setArrowNum(u8 i_num) { mArrowNum = i_num; }
|
void setArrowNum(u8 i_num) { mArrowNum = i_num; }
|
||||||
u8 getPachinkoNum() const { return mPachinkoNum; }
|
u8 getPachinkoNum() const { return mPachinkoNum; }
|
||||||
void setPachinkoNum(u8 i_num) { mPachinkoNum = i_num; }
|
void setPachinkoNum(u8 i_num) { mPachinkoNum = i_num; }
|
||||||
|
#if TARGET_PC
|
||||||
|
u8 getAncientDocumentNum() const { return mAncientDocumentNum; }
|
||||||
|
void setAncientDocumentNum(u8 i_num) { mAncientDocumentNum = i_num; }
|
||||||
|
#endif
|
||||||
|
|
||||||
/* 0x0 */ u8 mArrowNum;
|
/* 0x0 */ u8 mArrowNum;
|
||||||
/* 0x1 */ u8 mBombNum[3];
|
/* 0x1 */ u8 mBombNum[3];
|
||||||
/* 0x4 */ u8 mBottleNum[4];
|
/* 0x4 */ u8 mBottleNum[4];
|
||||||
/* 0x8 */ u8 mPachinkoNum;
|
/* 0x8 */ u8 mPachinkoNum;
|
||||||
|
#if TARGET_PC
|
||||||
|
/* 0x9 */ u8 mAncientDocumentNum; // Custom Field for Randomizer
|
||||||
|
/* 0x9 */ u8 unk5[2];
|
||||||
|
#else
|
||||||
/* 0x9 */ u8 unk5[3];
|
/* 0x9 */ u8 unk5[3];
|
||||||
|
#endif
|
||||||
}; // Size: 0xC
|
}; // Size: 0xC
|
||||||
|
|
||||||
class dSv_player_item_max_c {
|
class dSv_player_item_max_c {
|
||||||
@@ -413,7 +428,11 @@ public:
|
|||||||
u8 getPohNum() const { return mPohNum; }
|
u8 getPohNum() const { return mPohNum; }
|
||||||
|
|
||||||
void addPohNum() {
|
void addPohNum() {
|
||||||
|
#if TARGET_PC
|
||||||
|
if (mPohNum < 0x3D) {
|
||||||
|
#else
|
||||||
if (mPohNum < 0xFF) {
|
if (mPohNum < 0xFF) {
|
||||||
|
#endif
|
||||||
mPohNum++;
|
mPohNum++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -458,6 +477,11 @@ public:
|
|||||||
int isLetterReadFlag(int i_no) const;
|
int isLetterReadFlag(int i_no) const;
|
||||||
u8 getGetNumber(int i_no) { return mGetNumber[i_no]; }
|
u8 getGetNumber(int i_no) { return mGetNumber[i_no]; }
|
||||||
void setGetNumber(int i_no, u8 i_value) { mGetNumber[i_no] = i_value; }
|
void setGetNumber(int i_no, u8 i_value) { mGetNumber[i_no] = i_value; }
|
||||||
|
#if TARGET_PC
|
||||||
|
// For rando
|
||||||
|
void setAllLetterGet() { mLetterGetFlags[0] |= 0xFFFF;}
|
||||||
|
void setAllLetterRead() { mLetterReadFlags[0] |= 0xFFFF;}
|
||||||
|
#endif
|
||||||
|
|
||||||
/* 0x00 */ BE(u32) mLetterGetFlags[2];
|
/* 0x00 */ BE(u32) mLetterGetFlags[2];
|
||||||
/* 0x08 */ BE(u32) mLetterReadFlags[2];
|
/* 0x08 */ BE(u32) mLetterReadFlags[2];
|
||||||
@@ -664,10 +688,14 @@ public:
|
|||||||
void onDungeonItemBossKey() { onDungeonItem(BOSS_KEY); }
|
void onDungeonItemBossKey() { onDungeonItem(BOSS_KEY); }
|
||||||
void offDungeonItemBossKey() { offDungeonItem(BOSS_KEY); }
|
void offDungeonItemBossKey() { offDungeonItem(BOSS_KEY); }
|
||||||
s32 isDungeonItemBossKey() const { return isDungeonItem(BOSS_KEY); }
|
s32 isDungeonItemBossKey() const { return isDungeonItem(BOSS_KEY); }
|
||||||
|
#if TARGET_PC
|
||||||
|
void onStageBossEnemy();
|
||||||
|
#else
|
||||||
void onStageBossEnemy() {
|
void onStageBossEnemy() {
|
||||||
onDungeonItem(STAGE_BOSS_ENEMY);
|
onDungeonItem(STAGE_BOSS_ENEMY);
|
||||||
onDungeonItem(OOCCOO_NOTE);
|
onDungeonItem(OOCCOO_NOTE);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
void offStageBossEnemy() { offDungeonItem(STAGE_BOSS_ENEMY); }
|
void offStageBossEnemy() { offDungeonItem(STAGE_BOSS_ENEMY); }
|
||||||
s32 isStageBossEnemy() const { return isDungeonItem(STAGE_BOSS_ENEMY); }
|
s32 isStageBossEnemy() const { return isDungeonItem(STAGE_BOSS_ENEMY); }
|
||||||
void onStageLife() { onDungeonItem(STAGE_LIFE); }
|
void onStageLife() { onDungeonItem(STAGE_LIFE); }
|
||||||
@@ -948,6 +976,7 @@ public:
|
|||||||
/* 0x8 */ s8 m_no;
|
/* 0x8 */ s8 m_no;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
class dSv_info_c {
|
class dSv_info_c {
|
||||||
public:
|
public:
|
||||||
void init();
|
void init();
|
||||||
|
|||||||
@@ -1292,6 +1292,9 @@ public:
|
|||||||
void set(const char*, s8, s16, s8, s8, u8);
|
void set(const char*, s8, s16, s8, s8, u8);
|
||||||
void offEnable() { enabled = 0; }
|
void offEnable() { enabled = 0; }
|
||||||
BOOL isEnable() const { return enabled; }
|
BOOL isEnable() const { return enabled; }
|
||||||
|
#if TARGET_PC
|
||||||
|
void setEnable() { enabled |= 0x1; }
|
||||||
|
#endif
|
||||||
s8 getWipe() const { return wipe; }
|
s8 getWipe() const { return wipe; }
|
||||||
u8 getWipeSpeed() const { return wipe_speed; }
|
u8 getWipeSpeed() const { return wipe_speed; }
|
||||||
dStage_startStage_c* getStartStage() { return this; }
|
dStage_startStage_c* getStartStage() { return this; }
|
||||||
|
|||||||
@@ -1,18 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
|
|
||||||
namespace dusk::helpers::alignment {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Read data from an address that may not be aligned properly.
|
|
||||||
* @tparam T Type of data to read.
|
|
||||||
* @param ptr Address to read from.
|
|
||||||
* @return The copied value.
|
|
||||||
*/
|
|
||||||
template <typename T> requires std::is_trivially_copyable_v<T>
|
|
||||||
[[nodiscard]] constexpr T read_unaligned(u8 const* ptr) {
|
|
||||||
T copy;
|
|
||||||
memcpy(©, ptr, sizeof(T));
|
|
||||||
return copy;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,48 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
|
|
||||||
#include <limits>
|
|
||||||
#include <utility>
|
|
||||||
#include <span>
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Helper functions for performing casts.
|
|
||||||
*/
|
|
||||||
namespace dusk::helpers::cast {
|
|
||||||
/**
|
|
||||||
* Implementation details of dusk::helpers::cast.
|
|
||||||
*/
|
|
||||||
namespace _impl {
|
|
||||||
[[noreturn]] void overrun_high();
|
|
||||||
[[noreturn]] void overrun_low();
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename T>
|
|
||||||
concept IntCastable = std::is_integral_v<T> && std::is_trivially_copyable_v<T>;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Helper type that allows easily casting between integer types,
|
|
||||||
* that safely aborts if an overflow were to occur.
|
|
||||||
* Usage:
|
|
||||||
* @code
|
|
||||||
* size_t foobar = 20;
|
|
||||||
* int real = bounded_cast(foobar);
|
|
||||||
* @endcode
|
|
||||||
*/
|
|
||||||
template <IntCastable Source>
|
|
||||||
struct bounded_cast {
|
|
||||||
Source src;
|
|
||||||
|
|
||||||
template <IntCastable Target>
|
|
||||||
[[nodiscard]] constexpr operator Target() const {
|
|
||||||
if (std::cmp_greater(src, std::numeric_limits<Target>::max())) [[unlikely]] {
|
|
||||||
_impl::overrun_high();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (std::cmp_less(src, std::numeric_limits<Target>::min())) [[unlikely]] {
|
|
||||||
_impl::overrun_low();
|
|
||||||
}
|
|
||||||
|
|
||||||
return static_cast<Target>(src);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
@@ -285,7 +285,6 @@ inline void be_swap(Mtx& val) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#define LE(T) T
|
|
||||||
#define BE(T) BE<T>
|
#define BE(T) BE<T>
|
||||||
#define BE_HOST(T) (T.host())
|
#define BE_HOST(T) (T.host())
|
||||||
#else
|
#else
|
||||||
|
|||||||
@@ -394,4 +394,7 @@ inline int mDoAud_monsSeStart(u32 i_soundId, const Vec* i_pos, u32 i_actorId, u3
|
|||||||
0);
|
0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if TARGET_PC
|
||||||
|
mDoAud_zelAudio_c& mDoAud_getZelAudio();
|
||||||
|
#endif
|
||||||
#endif /* M_DO_M_DO_AUDIO_H */
|
#endif /* M_DO_M_DO_AUDIO_H */
|
||||||
|
|||||||
@@ -67,6 +67,10 @@ public:
|
|||||||
|
|
||||||
JKRMemArchive* getArchive() const { return mArchive; }
|
JKRMemArchive* getArchive() const { return mArchive; }
|
||||||
JKRHeap* getHeap() const { return mHeap; }
|
JKRHeap* getHeap() const { return mHeap; }
|
||||||
|
#if TARGET_PC
|
||||||
|
s32 getEntryNumber() const { return mEntryNumber; }
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
/* 0x14 */ u8 mMountDirection;
|
/* 0x14 */ u8 mMountDirection;
|
||||||
|
|||||||
@@ -154,6 +154,18 @@ public:
|
|||||||
return (J2DTextBoxHBinding)((mFlags >> 2) & 3);
|
return (J2DTextBoxHBinding)((mFlags >> 2) & 3);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if TARGET_PC
|
||||||
|
void setVBinding(J2DTextBoxVBinding vBinding) {
|
||||||
|
mFlags &= 0b1100;
|
||||||
|
mFlags |= (vBinding & 3);
|
||||||
|
}
|
||||||
|
|
||||||
|
void setHBinding(J2DTextBoxHBinding hBinding) {
|
||||||
|
mFlags &= 0b0011;
|
||||||
|
mFlags |= ((hBinding & 3) << 2);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
JUtility::TColor getCharColor() { return mCharColor; }
|
JUtility::TColor getCharColor() { return mCharColor; }
|
||||||
JUtility::TColor getGradColor() { return mGradientColor; }
|
JUtility::TColor getGradColor() { return mGradientColor; }
|
||||||
u16 getStringAllocByte() const { return mStringLength; }
|
u16 getStringAllocByte() const { return mStringLength; }
|
||||||
|
|||||||
@@ -101,7 +101,7 @@ struct JAISoundStatus_ {
|
|||||||
bool isMute() const { return field_0x0.flags.mute; }
|
bool isMute() const { return field_0x0.flags.mute; }
|
||||||
bool isPaused() const { return field_0x0.flags.paused; }
|
bool isPaused() const { return field_0x0.flags.paused; }
|
||||||
void pauseWhenOut() {
|
void pauseWhenOut() {
|
||||||
field_0x1.flags.mPauseWhenOut = 1;
|
field_0x1.flags.flag3 = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* 0x0 */ union {
|
/* 0x0 */ union {
|
||||||
@@ -120,9 +120,9 @@ struct JAISoundStatus_ {
|
|||||||
/* 0x1 */ union {
|
/* 0x1 */ union {
|
||||||
u8 value;
|
u8 value;
|
||||||
struct {
|
struct {
|
||||||
u8 mComesBack : 1;
|
u8 flag1 : 1;
|
||||||
u8 flag2 : 1;
|
u8 flag2 : 1;
|
||||||
u8 mPauseWhenOut : 1;
|
u8 flag3 : 1;
|
||||||
u8 flag4 : 1;
|
u8 flag4 : 1;
|
||||||
u8 flag5 : 1;
|
u8 flag5 : 1;
|
||||||
u8 flag6 : 1;
|
u8 flag6 : 1;
|
||||||
@@ -309,7 +309,7 @@ public:
|
|||||||
bool hasLifeTime() const { return status_.field_0x1.flags.flag2; }
|
bool hasLifeTime() const { return status_.field_0x1.flags.flag2; }
|
||||||
|
|
||||||
void removeLifeTime_() {
|
void removeLifeTime_() {
|
||||||
status_.field_0x1.flags.mComesBack = false;
|
status_.field_0x1.flags.flag1 = false;
|
||||||
status_.field_0x1.flags.flag2 = 0;
|
status_.field_0x1.flags.flag2 = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -346,7 +346,7 @@ public:
|
|||||||
|
|
||||||
void setComesBack(bool param_0) {
|
void setComesBack(bool param_0) {
|
||||||
JUT_ASSERT(354, status_.state.flags.calcedOnce == 0);
|
JUT_ASSERT(354, status_.state.flags.calcedOnce == 0);
|
||||||
status_.field_0x1.flags.mComesBack = 1;
|
status_.field_0x1.flags.flag1 = 1;
|
||||||
if (param_0) {
|
if (param_0) {
|
||||||
status_.pauseWhenOut();
|
status_.pauseWhenOut();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,14 +9,14 @@
|
|||||||
*/
|
*/
|
||||||
struct JAISoundParamsProperty {
|
struct JAISoundParamsProperty {
|
||||||
void init() {
|
void init() {
|
||||||
mVolume = 1.0f;
|
field_0x0 = 1.0f;
|
||||||
mFxMix = 0.0f;
|
field_0x4 = 0.0f;
|
||||||
mPitch = 1.0f;
|
field_0x8 = 1.0f;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* 0x00 */ f32 mVolume;
|
/* 0x00 */ f32 field_0x0;
|
||||||
/* 0x04 */ f32 mFxMix;
|
/* 0x04 */ f32 field_0x4;
|
||||||
/* 0x08 */ f32 mPitch;
|
/* 0x08 */ f32 field_0x8;
|
||||||
}; // Size: 0xC
|
}; // Size: 0xC
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -14,20 +14,20 @@ const int OSC_MAX = 2;
|
|||||||
*/
|
*/
|
||||||
struct JASInstParam : public JASSoundParams {
|
struct JASInstParam : public JASSoundParams {
|
||||||
JASInstParam() {
|
JASInstParam() {
|
||||||
mOscillators = NULL;
|
field_0x14 = NULL;
|
||||||
mDirectRelease = 0;
|
field_0x18 = 0;
|
||||||
mWaveId = 0;
|
field_0x1a = 0;
|
||||||
mChannelType = 0;
|
field_0x1c = 0;
|
||||||
mOscillatorCount = 0;
|
field_0x1d = 0;
|
||||||
mDontSetKey = 0;
|
field_0x1e = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
JASOscillator::Data** mOscillators;
|
JASOscillator::Data** field_0x14;
|
||||||
u16 mDirectRelease;
|
u16 field_0x18;
|
||||||
u16 mWaveId;
|
u16 field_0x1a;
|
||||||
u8 mChannelType; // Always CHANNEL_WAVE in practice
|
u8 field_0x1c;
|
||||||
u8 mOscillatorCount;
|
u8 field_0x1d;
|
||||||
u8 mDontSetKey;
|
u8 field_0x1e;
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -52,10 +52,10 @@ struct JASBasicInst : public JASInst {
|
|||||||
void setHighKey(int key) { mHighKey = key; }
|
void setHighKey(int key) { mHighKey = key; }
|
||||||
|
|
||||||
/* 0x0 */ s32 mHighKey;
|
/* 0x0 */ s32 mHighKey;
|
||||||
/* 0x4 */ u16 mWaveId;
|
/* 0x4 */ u16 field_0x4;
|
||||||
/* 0x6 */ u16 field_0x6;
|
/* 0x6 */ u16 field_0x6;
|
||||||
/* 0x8 */ f32 mVolumeMult;
|
/* 0x8 */ f32 field_0x8;
|
||||||
/* 0xC */ f32 mPitchMult;
|
/* 0xC */ f32 field_0xc;
|
||||||
};
|
};
|
||||||
|
|
||||||
JASBasicInst();
|
JASBasicInst();
|
||||||
@@ -74,7 +74,7 @@ struct JASBasicInst : public JASInst {
|
|||||||
|
|
||||||
/* 0x04 */ f32 mVolume;
|
/* 0x04 */ f32 mVolume;
|
||||||
/* 0x08 */ f32 mPitch;
|
/* 0x08 */ f32 mPitch;
|
||||||
/* 0x0C */ JASOscillator::Data const* mOscillators[OSC_MAX];
|
/* 0x0C */ JASOscillator::Data const* field_0xc[OSC_MAX];
|
||||||
/* 0x10 */ u32 mKeymapCount;
|
/* 0x10 */ u32 mKeymapCount;
|
||||||
/* 0x14 */ TKeymap* mKeymap;
|
/* 0x14 */ TKeymap* mKeymap;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -12,27 +12,21 @@ struct JASBasicWaveBank : public JASWaveBank {
|
|||||||
struct TWaveHandle : public JASWaveHandle {
|
struct TWaveHandle : public JASWaveHandle {
|
||||||
TWaveHandle() { mHeap = NULL; }
|
TWaveHandle() { mHeap = NULL; }
|
||||||
virtual intptr_t getWavePtr() const;
|
virtual intptr_t getWavePtr() const;
|
||||||
virtual const JASWaveInfo* getWaveInfo() const { return &mWaveInfo; }
|
virtual const JASWaveInfo* getWaveInfo() const { return &field_0x4; }
|
||||||
#if TARGET_PC
|
|
||||||
/**
|
|
||||||
* @see JASChannel::mAramBaseAddress
|
|
||||||
*/
|
|
||||||
[[nodiscard]] void const* getAramBaseAddress() const override { return nullptr; }
|
|
||||||
#endif
|
|
||||||
bool compareHeap(JASHeap* heap) const { return mHeap == heap;}
|
bool compareHeap(JASHeap* heap) const { return mHeap == heap;}
|
||||||
|
|
||||||
/* 0x04 */ JASWaveInfo mWaveInfo;
|
/* 0x04 */ JASWaveInfo field_0x4;
|
||||||
/* 0x28 */ JASHeap* mHeap;
|
/* 0x28 */ JASHeap* mHeap;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct TGroupWaveInfo {
|
struct TGroupWaveInfo {
|
||||||
TGroupWaveInfo() {
|
TGroupWaveInfo() {
|
||||||
waveId = 0xffff;
|
field_0x0 = 0xffff;
|
||||||
mOffsetStart = -1;
|
field_0x4 = -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* 0x00 */ u16 waveId;
|
/* 0x00 */ u16 field_0x0;
|
||||||
/* 0x04 */ int mOffsetStart;
|
/* 0x04 */ int field_0x4;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct TWaveGroup : JASWaveArc {
|
struct TWaveGroup : JASWaveArc {
|
||||||
@@ -50,7 +44,7 @@ struct JASBasicWaveBank : public JASWaveBank {
|
|||||||
u32 getWaveCount() const { return mWaveCount; }
|
u32 getWaveCount() const { return mWaveCount; }
|
||||||
};
|
};
|
||||||
|
|
||||||
JASBasicWaveBank(IF_DUSK(u32 bankId));
|
JASBasicWaveBank();
|
||||||
~JASBasicWaveBank();
|
~JASBasicWaveBank();
|
||||||
TWaveGroup* getWaveGroup(u32);
|
TWaveGroup* getWaveGroup(u32);
|
||||||
void setGroupCount(u32, JKRHeap*);
|
void setGroupCount(u32, JKRHeap*);
|
||||||
@@ -62,7 +56,7 @@ struct JASBasicWaveBank : public JASWaveBank {
|
|||||||
JASWaveArc* getWaveArc(u32 param_0) { return getWaveGroup(param_0); }
|
JASWaveArc* getWaveArc(u32 param_0) { return getWaveGroup(param_0); }
|
||||||
u32 getArcCount() const { return mGroupCount; }
|
u32 getArcCount() const { return mGroupCount; }
|
||||||
|
|
||||||
/* 0x04 */ OSMutex mWaveTableMutex;
|
/* 0x04 */ OSMutex field_0x4;
|
||||||
/* 0x1C */ TWaveHandle* mWaveTable;
|
/* 0x1C */ TWaveHandle* mWaveTable;
|
||||||
/* 0x20 */ TWaveGroup* mWaveGroupArray;
|
/* 0x20 */ TWaveGroup* mWaveGroupArray;
|
||||||
/* 0x24 */ u16 mHandleCount;
|
/* 0x24 */ u16 mHandleCount;
|
||||||
|
|||||||
@@ -8,7 +8,6 @@
|
|||||||
#include "JSystem/JAudio2/JASWaveInfo.h"
|
#include "JSystem/JAudio2/JASWaveInfo.h"
|
||||||
#include "JSystem/JAudio2/JASDSPInterface.h"
|
#include "JSystem/JAudio2/JASDSPInterface.h"
|
||||||
#include <os.h>
|
#include <os.h>
|
||||||
#include <memory>
|
|
||||||
|
|
||||||
struct JASDSPChannel;
|
struct JASDSPChannel;
|
||||||
|
|
||||||
@@ -16,20 +15,6 @@ namespace JASDsp {
|
|||||||
struct TChannel;
|
struct TChannel;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if TARGET_PC
|
|
||||||
/**
|
|
||||||
* An object to manage the lifetime of the sample data pointed to by JASChannel.
|
|
||||||
*
|
|
||||||
* JASChannel can (optionally) accept an unique_ptr to an object to this type,
|
|
||||||
* in which case it will be destroyed when the JASChannel is done.
|
|
||||||
*
|
|
||||||
* @see JASChannel::mSampleReference
|
|
||||||
*/
|
|
||||||
struct JASSampleDataReference {
|
|
||||||
virtual ~JASSampleDataReference() = default;
|
|
||||||
};
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @ingroup jsystem-jaudio
|
* @ingroup jsystem-jaudio
|
||||||
*
|
*
|
||||||
@@ -174,30 +159,13 @@ public:
|
|||||||
struct {
|
struct {
|
||||||
u32 mChannelType; // CHANNEL_WAVE or CHANNEL_OSCILLATOR
|
u32 mChannelType; // CHANNEL_WAVE or CHANNEL_OSCILLATOR
|
||||||
JASWaveInfo mWaveInfo;
|
JASWaveInfo mWaveInfo;
|
||||||
} mAnon;
|
} field_0xdc;
|
||||||
union {
|
union {
|
||||||
u32 mWaveAramAddress;
|
u32 mWaveAramAddress;
|
||||||
u32 mOscillatorSomething;
|
u32 mOscillatorSomething;
|
||||||
u32 field_0x104;
|
u32 field_0x104;
|
||||||
};
|
};
|
||||||
|
|
||||||
#if TARGET_PC
|
|
||||||
/**
|
|
||||||
* Memory address at which this sound effect should consider ARAM to start.
|
|
||||||
*
|
|
||||||
* By changing this, sound effects can effectively be played back from anywhere in memory,
|
|
||||||
* rather than just the emulated ARAM space.
|
|
||||||
*
|
|
||||||
* If nullptr, the regular emulated ARAM is used.
|
|
||||||
*/
|
|
||||||
void const* mAramBaseAddress;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @see JASSampleDataReference
|
|
||||||
*/
|
|
||||||
std::unique_ptr<JASSampleDataReference> mSampleReference;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
static DUSK_GAME_DATA OSMessageQueue sBankDisposeMsgQ;
|
static DUSK_GAME_DATA OSMessageQueue sBankDisposeMsgQ;
|
||||||
static DUSK_GAME_DATA OSMessage sBankDisposeMsg[16];
|
static DUSK_GAME_DATA OSMessage sBankDisposeMsg[16];
|
||||||
static DUSK_GAME_DATA OSMessage sBankDisposeList[16];
|
static DUSK_GAME_DATA OSMessage sBankDisposeList[16];
|
||||||
|
|||||||
@@ -109,9 +109,7 @@ namespace JASDsp {
|
|||||||
* Pitch shift via changing playback speed.
|
* Pitch shift via changing playback speed.
|
||||||
*/
|
*/
|
||||||
/* 0x004 */ u16 mPitch;
|
/* 0x004 */ u16 mPitch;
|
||||||
#if !TARGET_PC
|
|
||||||
/* 0x006 */ short _unused1;
|
/* 0x006 */ short _unused1;
|
||||||
#endif
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set to 1 when playback starts, cleared by DSP later,
|
* Set to 1 when playback starts, cleared by DSP later,
|
||||||
@@ -120,27 +118,19 @@ namespace JASDsp {
|
|||||||
* (Corroborated by fields JASAramStream checks never being cleared explicitly by CPU.)
|
* (Corroborated by fields JASAramStream checks never being cleared explicitly by CPU.)
|
||||||
*/
|
*/
|
||||||
/* 0x008 */ u16 mResetFlag;
|
/* 0x008 */ u16 mResetFlag;
|
||||||
#if !TARGET_PC
|
|
||||||
/* 0x00A */ u8 _unused2[0x00C - 0x00A];
|
/* 0x00A */ u8 _unused2[0x00C - 0x00A];
|
||||||
#endif
|
|
||||||
/* 0x00C */ s16 mPauseFlag;
|
/* 0x00C */ s16 mPauseFlag;
|
||||||
#if !TARGET_PC
|
|
||||||
/* 0x00E */ short _unused3;
|
/* 0x00E */ short _unused3;
|
||||||
#endif
|
|
||||||
/* 0x010 */ OutputChannelConfig mOutputChannels[DSP_OUTPUT_CHANNELS];
|
/* 0x010 */ OutputChannelConfig mOutputChannels[DSP_OUTPUT_CHANNELS];
|
||||||
#if !TARGET_PC
|
|
||||||
/* 0x040 */ u8 _unused4[0x050 - 0x040];
|
/* 0x040 */ u8 _unused4[0x050 - 0x040];
|
||||||
#endif
|
|
||||||
/* 0x050 */ u16 mAutoMixerPanDolby; // pan is upper 8 bits, dolby lower 8.
|
/* 0x050 */ u16 mAutoMixerPanDolby; // pan is upper 8 bits, dolby lower 8.
|
||||||
/* 0x052 */ u16 mAutoMixerFxMix;
|
/* 0x052 */ u16 mAutoMixerFxMix;
|
||||||
/* 0x054 */ u16 mAutoMixerInitVolume;
|
/* 0x054 */ u16 mAutoMixerInitVolume;
|
||||||
/* 0x056 */ u16 mAutoMixerVolume;
|
/* 0x056 */ u16 mAutoMixerVolume;
|
||||||
/* 0x058 */ u16 mAutoMixerBeenSet;
|
/* 0x058 */ u16 mAutoMixerBeenSet;
|
||||||
#if !TARGET_PC
|
|
||||||
/* 0x05A */ u8 _unused5[0x060 - 0x05A];
|
/* 0x05A */ u8 _unused5[0x060 - 0x05A];
|
||||||
/* 0x060 */ short field_0x060; // Only cleared to zero, presumed used by DSP.
|
/* 0x060 */ short field_0x060; // Only cleared to zero, presumed used by DSP.
|
||||||
/* 0x062 */ u8 _unused6[0x064 - 0x062];
|
/* 0x062 */ u8 _unused6[0x064 - 0x062];
|
||||||
#endif
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Samples per ADPCM frame for ADPCM audio. Seems just set to 1 for PCM formats.
|
* Samples per ADPCM frame for ADPCM audio. Seems just set to 1 for PCM formats.
|
||||||
@@ -149,9 +139,7 @@ namespace JASDsp {
|
|||||||
/* 0x064 */ u16 mSamplesPerBlock;
|
/* 0x064 */ u16 mSamplesPerBlock;
|
||||||
/* 0x066 */ short field_0x066; // Only cleared to zero, presumed used by DSP.
|
/* 0x066 */ short field_0x066; // Only cleared to zero, presumed used by DSP.
|
||||||
/* 0x068 */ u32 mSamplePosition; // Only ever initialized by code, name is guess.
|
/* 0x068 */ u32 mSamplePosition; // Only ever initialized by code, name is guess.
|
||||||
#if !TARGET_PC
|
|
||||||
/* 0x06C */ u8 _unused7[0x070 - 0x06C];
|
/* 0x06C */ u8 _unused7[0x070 - 0x06C];
|
||||||
#endif
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Current audio read position in ARAM. Updated by DSP.
|
* Current audio read position in ARAM. Updated by DSP.
|
||||||
@@ -163,13 +151,11 @@ namespace JASDsp {
|
|||||||
* Gets written by DSP, but also CPU.
|
* Gets written by DSP, but also CPU.
|
||||||
*/
|
*/
|
||||||
/* 0x074 */ u32 mSamplesLeft; // Never directly cleared to zero. Seems sus. Cleared by DSP?
|
/* 0x074 */ u32 mSamplesLeft; // Never directly cleared to zero. Seems sus. Cleared by DSP?
|
||||||
#if !TARGET_PC
|
|
||||||
/* 0x078 */ short field_0x078[4]; // Only cleared to zero, presumed used by DSP.
|
/* 0x078 */ short field_0x078[4]; // Only cleared to zero, presumed used by DSP.
|
||||||
/* 0x080 */ short field_0x080[20]; // Only cleared to zero, presumed used by DSP.
|
/* 0x080 */ short field_0x080[20]; // Only cleared to zero, presumed used by DSP.
|
||||||
/* 0x0A8 */ short field_0x0a8[4]; // Only cleared to zero, presumed used by DSP.
|
/* 0x0A8 */ short field_0x0a8[4]; // Only cleared to zero, presumed used by DSP.
|
||||||
/* 0x0B0 */ u16 field_0x0b0[16]; // Only cleared to zero, presumed used by DSP.
|
/* 0x0B0 */ u16 field_0x0b0[16]; // Only cleared to zero, presumed used by DSP.
|
||||||
/* 0x0D0 */ u8 _unused8[0x100 - 0x0D0];
|
/* 0x0D0 */ u8 _unused8[0x100 - 0x0D0];
|
||||||
#endif
|
|
||||||
/* 0x100 */ u16 mBytesPerBlock;
|
/* 0x100 */ u16 mBytesPerBlock;
|
||||||
/* 0x102 */ u16 mLoopFlag;
|
/* 0x102 */ u16 mLoopFlag;
|
||||||
|
|
||||||
@@ -190,26 +176,9 @@ namespace JASDsp {
|
|||||||
/* 0x118 */ u32 mWaveAramAddress;
|
/* 0x118 */ u32 mWaveAramAddress;
|
||||||
/* 0x11C */ int mSampleCount;
|
/* 0x11C */ int mSampleCount;
|
||||||
/* 0x120 */ s16 fir_filter_params[8];
|
/* 0x120 */ s16 fir_filter_params[8];
|
||||||
#if !TARGET_PC
|
|
||||||
/* 0x130 */ u8 _unused9[0x148 - 0x130];
|
/* 0x130 */ u8 _unused9[0x148 - 0x130];
|
||||||
#endif
|
|
||||||
/* 0x148 */ s16 iir_filter_params[8];
|
/* 0x148 */ s16 iir_filter_params[8];
|
||||||
#if !TARGET_PC
|
|
||||||
/* 0x158 */ u8 _unused10[0x180 - 0x158];
|
/* 0x158 */ u8 _unused10[0x180 - 0x158];
|
||||||
#endif
|
|
||||||
|
|
||||||
#if TARGET_PC
|
|
||||||
/**
|
|
||||||
* Memory address at which this sound effect should consider ARAM to start.
|
|
||||||
* This means fields like mWaveAramAddress will be relative to this pointer instead.
|
|
||||||
*
|
|
||||||
* By changing this, sound effects can effectively be played back from anywhere in memory,
|
|
||||||
* rather than just the emulated ARAM space.
|
|
||||||
*
|
|
||||||
* If nullptr, the regular emulated ARAM is used.
|
|
||||||
*/
|
|
||||||
void const* mAramBaseAddress;
|
|
||||||
#endif
|
|
||||||
};
|
};
|
||||||
|
|
||||||
void boot(void (*)(void*));
|
void boot(void (*)(void*));
|
||||||
|
|||||||
@@ -21,10 +21,10 @@ struct JASDrumSet : public JASInst {
|
|||||||
/* 0x00 */ f32 mVolume;
|
/* 0x00 */ f32 mVolume;
|
||||||
/* 0x04 */ f32 mPitch;
|
/* 0x04 */ f32 mPitch;
|
||||||
/* 0x08 */ f32 mPan;
|
/* 0x08 */ f32 mPan;
|
||||||
/* 0x0C */ u16 mDirectRelease;
|
/* 0x0C */ u16 field_0xc;
|
||||||
/* 0x0E */ u16 mWaveId;
|
/* 0x0E */ u16 field_0xe;
|
||||||
/* 0x10 */ f32 mVolumeMult;
|
/* 0x10 */ f32 field_0x10;
|
||||||
/* 0x14 */ f32 mPitchMult;
|
/* 0x14 */ f32 field_0x14;
|
||||||
};
|
};
|
||||||
|
|
||||||
JASDrumSet();
|
JASDrumSet();
|
||||||
|
|||||||
@@ -10,18 +10,12 @@ struct JASSimpleWaveBank : JASWaveBank, JASWaveArc {
|
|||||||
intptr_t getWavePtr() const;
|
intptr_t getWavePtr() const;
|
||||||
TWaveHandle();
|
TWaveHandle();
|
||||||
const JASWaveInfo* getWaveInfo() const;
|
const JASWaveInfo* getWaveInfo() const;
|
||||||
#if TARGET_PC
|
|
||||||
/**
|
|
||||||
* @see JASChannel::mAramBaseAddress
|
|
||||||
*/
|
|
||||||
[[nodiscard]] void const* getAramBaseAddress() const override { return nullptr; }
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* 0x04 */ JASWaveInfo mWaveInfo;
|
/* 0x04 */ JASWaveInfo mWaveInfo;
|
||||||
/* 0x28 */ JASHeap* mHeap;
|
/* 0x28 */ JASHeap* mHeap;
|
||||||
};
|
};
|
||||||
|
|
||||||
JASSimpleWaveBank(IF_DUSK(u32 bankId));
|
JASSimpleWaveBank();
|
||||||
~JASSimpleWaveBank();
|
~JASSimpleWaveBank();
|
||||||
void setWaveTableSize(u32, JKRHeap*);
|
void setWaveTableSize(u32, JKRHeap*);
|
||||||
JASWaveHandle* getWaveHandle(u32) const;
|
JASWaveHandle* getWaveHandle(u32) const;
|
||||||
|
|||||||
@@ -26,9 +26,7 @@ public:
|
|||||||
};
|
};
|
||||||
|
|
||||||
struct TCtrlWave {
|
struct TCtrlWave {
|
||||||
// Wave ID in lower half.
|
/* 0x0 */ BE(u32) _00;
|
||||||
// Upper bits appear to be group ID, which is unused by the game code.
|
|
||||||
/* 0x0 */ BE(u32) mWaveAndGroupId;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
struct TWave {
|
struct TWave {
|
||||||
@@ -59,14 +57,13 @@ public:
|
|||||||
};
|
};
|
||||||
|
|
||||||
struct TCtrl {
|
struct TCtrl {
|
||||||
/* 0x0 */ BE(u32) mMagic; // 'C-DF'.
|
/* 0x0 */ u8 _00[4];
|
||||||
/* 0x4 */ BE(u32) mWaveCount;
|
/* 0x4 */ BE(u32) mWaveCount;
|
||||||
/* 0x8 */ TOffset<TCtrlWave> mCtrlWaveOffsets[0];
|
/* 0x8 */ TOffset<TCtrlWave> mCtrlWaveOffsets[0];
|
||||||
};
|
};
|
||||||
|
|
||||||
struct TCtrlScene {
|
struct TCtrlScene {
|
||||||
/* 0x0 */ BE(u32) mMagic; // 'SCNE'
|
/* 0x0 */ u8 _00[0xC];
|
||||||
/* 0x4 */ u8 _00[0x8];
|
|
||||||
/* 0xC */ TOffset<TCtrl> mCtrlOffset;
|
/* 0xC */ TOffset<TCtrl> mCtrlOffset;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -66,7 +66,7 @@ struct JASWaveArc : JASDisposer {
|
|||||||
};
|
};
|
||||||
|
|
||||||
/* 0x04 */ mutable JASHeap mHeap;
|
/* 0x04 */ mutable JASHeap mHeap;
|
||||||
/* 0x48 */ u32 mCurrentlyLoaded;
|
/* 0x48 */ u32 _48;
|
||||||
/* 0x4C */ volatile s32 mStatus;
|
/* 0x4C */ volatile s32 mStatus;
|
||||||
/* 0x50 */ int mEntryNum;
|
/* 0x50 */ int mEntryNum;
|
||||||
/* 0x54 */ u32 mFileLength;
|
/* 0x54 */ u32 mFileLength;
|
||||||
|
|||||||
@@ -2,11 +2,6 @@
|
|||||||
#define JASWAVEINFO_H
|
#define JASWAVEINFO_H
|
||||||
|
|
||||||
#include <types.h>
|
#include <types.h>
|
||||||
#include <memory>
|
|
||||||
|
|
||||||
#if TARGET_PC
|
|
||||||
struct JASSampleDataReference;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
struct JASWaveArc;
|
struct JASWaveArc;
|
||||||
|
|
||||||
@@ -22,7 +17,7 @@ struct JASWaveArc;
|
|||||||
struct JASWaveInfo {
|
struct JASWaveInfo {
|
||||||
JASWaveInfo() {
|
JASWaveInfo() {
|
||||||
mBaseKey = 0x3c;
|
mBaseKey = 0x3c;
|
||||||
mpLoaded = &one;
|
field_0x20 = &one;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* 0x00 */ u8 mWaveFormat;
|
/* 0x00 */ u8 mWaveFormat;
|
||||||
@@ -36,7 +31,7 @@ struct JASWaveInfo {
|
|||||||
/* 0x18 */ int mSampleCount;
|
/* 0x18 */ int mSampleCount;
|
||||||
/* 0x1C */ s16 mpLast;
|
/* 0x1C */ s16 mpLast;
|
||||||
/* 0x1E */ s16 mpPenult;
|
/* 0x1E */ s16 mpPenult;
|
||||||
/* 0x20 */ const u32* mpLoaded;
|
/* 0x20 */ const u32* field_0x20;
|
||||||
|
|
||||||
static DUSK_GAME_DATA u32 one;
|
static DUSK_GAME_DATA u32 one;
|
||||||
};
|
};
|
||||||
@@ -50,17 +45,6 @@ public:
|
|||||||
virtual ~JASWaveHandle() {}
|
virtual ~JASWaveHandle() {}
|
||||||
virtual const JASWaveInfo* getWaveInfo() const = 0;
|
virtual const JASWaveInfo* getWaveInfo() const = 0;
|
||||||
virtual intptr_t getWavePtr() const = 0;
|
virtual intptr_t getWavePtr() const = 0;
|
||||||
#if TARGET_PC
|
|
||||||
/**
|
|
||||||
* @see JASChannel::mAramBaseAddress
|
|
||||||
*/
|
|
||||||
[[nodiscard]] virtual void const* getAramBaseAddress() const = 0;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Create a @ref JASSampleDataReference to keep the sample data for this wave alive.
|
|
||||||
*/
|
|
||||||
[[nodiscard]] virtual std::unique_ptr<JASSampleDataReference> getSampleReference() const { return nullptr; }
|
|
||||||
#endif
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -69,12 +53,6 @@ public:
|
|||||||
*/
|
*/
|
||||||
class JASWaveBank {
|
class JASWaveBank {
|
||||||
public:
|
public:
|
||||||
#if TARGET_PC
|
|
||||||
const u32 bankId;
|
|
||||||
|
|
||||||
JASWaveBank(u32 bankId) : bankId(bankId) { }
|
|
||||||
#endif
|
|
||||||
|
|
||||||
virtual ~JASWaveBank() {}
|
virtual ~JASWaveBank() {}
|
||||||
virtual JASWaveHandle* getWaveHandle(u32) const = 0;
|
virtual JASWaveHandle* getWaveHandle(u32) const = 0;
|
||||||
virtual JASWaveArc* getWaveArc(u32) = 0;
|
virtual JASWaveArc* getWaveArc(u32) = 0;
|
||||||
|
|||||||
@@ -10,7 +10,7 @@
|
|||||||
*/
|
*/
|
||||||
struct JAUAudibleParam {
|
struct JAUAudibleParam {
|
||||||
f32 getDopplerPower() const {
|
f32 getDopplerPower() const {
|
||||||
return field_0x0.bytes.mDopplerPower * (1.0f / 15.0f);
|
return field_0x0.bytes.b0_0 * (1.0f / 15.0f);
|
||||||
}
|
}
|
||||||
|
|
||||||
union {
|
union {
|
||||||
@@ -19,18 +19,14 @@ struct JAUAudibleParam {
|
|||||||
BE(u16) f1;
|
BE(u16) f1;
|
||||||
} half;
|
} half;
|
||||||
struct {
|
struct {
|
||||||
u8 mDopplerPower : 4;
|
u8 b0_0 : 4;
|
||||||
u8 mCalculatePriority : 1;
|
u8 b0_4 : 1;
|
||||||
u8 mCalcDistanceVolume : 1;
|
u8 b0_5 : 1;
|
||||||
u8 mCalcFxMix : 1;
|
u8 b0_6 : 1;
|
||||||
u8 mCullAtMaxDistance : 1;
|
u8 b0_7 : 1;
|
||||||
u8 mCalcPan : 1;
|
u8 b1_0 : 1;
|
||||||
u8 mCalcDolby : 1;
|
u8 b1_1 : 1;
|
||||||
/**
|
u8 b1_2_7 : 6;
|
||||||
* Most bits in this field are unused, 8 indicates clamping of volume
|
|
||||||
* to ensure it doesn't go below 0.2 in mixChannelOut()
|
|
||||||
*/
|
|
||||||
u8 mClampMinVolume : 6;
|
|
||||||
u8 b2;
|
u8 b2;
|
||||||
u8 b3;
|
u8 b3;
|
||||||
} bytes;
|
} bytes;
|
||||||
|
|||||||
@@ -5,162 +5,16 @@
|
|||||||
#include "JSystem/JAudio2/JASGadget.h"
|
#include "JSystem/JAudio2/JASGadget.h"
|
||||||
#include "helpers/endian.h"
|
#include "helpers/endian.h"
|
||||||
|
|
||||||
// Constants for TypeIDs of JAUSoundTable entries.
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Used as a test to see if the type ID is valid. All other type IDs contain this bit.
|
|
||||||
*/
|
|
||||||
#define SOUND_TYPEID_VALID 0x40
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Sound is a sound effect.
|
|
||||||
*/
|
|
||||||
#define SOUND_TYPEID_SOUND_EFFECT 0x51
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Sound is a music sequence.
|
|
||||||
*/
|
|
||||||
#define SOUND_TYPEID_SEQUENCE 0x60
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Sound is a streamed music file.
|
|
||||||
*/
|
|
||||||
#define SOUND_TYPEID_STREAM 0x70
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Sound is a streamed music file. Unsure of difference from SOUND_TYPEID_STREAM
|
|
||||||
*/
|
|
||||||
#define SOUND_TYPEID_STREAM_ALT 0x71
|
|
||||||
|
|
||||||
//
|
|
||||||
// Values for mSwBit on sound effect items.
|
|
||||||
//
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Sound is always calculated as max priority (0).
|
|
||||||
*/
|
|
||||||
#define SOUND_SW_ALWAYS_MAX_PRIORITY 0x0000'0001
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Don't calculate volume by distance.
|
|
||||||
*/
|
|
||||||
#define SOUND_SW_IGNORE_DISTANCE_VOL 0x0000'0002
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Don't calculate FX mix (reverb) by distance.
|
|
||||||
*/
|
|
||||||
#define SOUND_SW_IGNORE_FX_MIX 0x0000'0004
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Offset to shift to access @see SOUND_SW_RANDOM_PITCH_MASK
|
|
||||||
*/
|
|
||||||
#define SOUND_SW_RANDOM_PITCH_OFFSET 4
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 4-bit value (0-15) to control the power of pitch randomization on sound playback.
|
|
||||||
* Code acts different for values above 8, not sure what the exact implication is.
|
|
||||||
*/
|
|
||||||
#define SOUND_SW_RANDOM_PITCH_MASK 0x0000'00F0
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Offset to shift to access @see SOUND_SW_DOPPLER_POWER_MASK
|
|
||||||
*/
|
|
||||||
#define SOUND_SW_DOPPLER_POWER_OFFSET 8
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 4-bit value (0-15) to scale the power of the Doppler effect for this sound.
|
|
||||||
*/
|
|
||||||
#define SOUND_SW_DOPPLER_POWER_MASK 0x0000'0F00
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Don't calculate panning (left/right) values for this sound.
|
|
||||||
*/
|
|
||||||
#define SOUND_SW_IGNORE_PAN 0x0000'1000
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Don't calculate Dolby (behind/front) values for this sound.
|
|
||||||
*/
|
|
||||||
#define SOUND_SW_IGNORE_DOLBY 0x0000'2000
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 3-bit mask used to select a volume distance/falloff class for this sound.
|
|
||||||
*/
|
|
||||||
#define SOUND_SW_VOL_DIST_BIT_MASK 0x0007'0000
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Limit minimum volume of this sound (after distance falloff) to 0.2.
|
|
||||||
*/
|
|
||||||
#define SOUND_SW_CLAMP_MIN_VOLUME 0x0008'0000
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 3-bit mask used to select a *different* volume distance/falloff class for this sound.
|
|
||||||
* @see SOUND_SW_VOL_DIST_BIT_MASK must be zero for this to work.
|
|
||||||
*/
|
|
||||||
#define SOUND_SW_VOL_DIST_BIT_2_MASK 0x0070'0000
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Mark sound as "far away" or "culled" when at max distance (selected by distance class).
|
|
||||||
* This affects a bunch of stuff like culling, automatic stopping, priorities, etc.
|
|
||||||
*/
|
|
||||||
#define SOUND_SW_CULL_AT_MAX_DISTANCE 0x0080'0000
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Not sure what this does.
|
|
||||||
* Something causing volume/pan/dolby adjustment in Z2Audible::setOuterParams?
|
|
||||||
*/
|
|
||||||
#define SOUND_SW_VOL_SOMETHING_MASK 0x0F00'0000
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Offset to shift to access @see SOUND_SW_RANDOM_VOLUME_MASK
|
|
||||||
*/
|
|
||||||
#define SOUND_SW_RANDOM_VOLUME_OFFSET 28
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 4-bit value (0-15) to control the power of volume randomization on sound playback.
|
|
||||||
*/
|
|
||||||
#define SOUND_SW_RANDOM_VOLUME_MASK 0xF000'0000
|
|
||||||
|
|
||||||
#define SOUND_VOL_DIST_BIT_MASK_SHIFTED (SOUND_SW_VOL_DIST_BIT_MASK >> 16)
|
|
||||||
#define SOUND_VOL_DIST_BIT_2_MASK_SHIFTED (SOUND_SW_VOL_DIST_BIT_2_MASK >> 16)
|
|
||||||
#define SOUND_VOL_SOMETHING_MASK_SHIFTED (SOUND_SW_VOL_SOMETHING_MASK >> 16)
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @ingroup jsystem-jaudio
|
* @ingroup jsystem-jaudio
|
||||||
* A single entry in the sound table.
|
*
|
||||||
* Fields are interpreted differently depending on the type ID of the entry,
|
|
||||||
* which is not stored in this struct.
|
|
||||||
*/
|
*/
|
||||||
struct JAUSoundTableItem {
|
struct JAUSoundTableItem {
|
||||||
u8 mPriority;
|
u8 mPriority;
|
||||||
u8 mVolume;
|
u8 field_0x1;
|
||||||
union {
|
BE(u16) mResourceId;
|
||||||
/**
|
BE(u32) field_0x4;
|
||||||
* For music sequences: the resource ID of the sequence.
|
BE(f32) field_0x8;
|
||||||
*/
|
|
||||||
BE(u16) mResourceId;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* For streamed music: bitpacked channel configuration.
|
|
||||||
*/
|
|
||||||
BE(u16) mStreamPanParameters;
|
|
||||||
};
|
|
||||||
union {
|
|
||||||
/**
|
|
||||||
* For sound effects: bitpacked field controlling a *bunch* of audio parameters.
|
|
||||||
*/
|
|
||||||
BE(u32) mSwBit;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* For streamed music: offset (relative to start of BST)
|
|
||||||
* to null-terminated string containing music file path.
|
|
||||||
*/
|
|
||||||
BE(u32) mStreamFilePath;
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* For sound effects: pitch multiplier.
|
|
||||||
*/
|
|
||||||
BE(f32) mPitch;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -170,25 +24,23 @@ struct JAUSoundTableItem {
|
|||||||
template<typename Root, typename Section, typename Group, typename Typename_0>
|
template<typename Root, typename Section, typename Group, typename Typename_0>
|
||||||
struct JAUSoundTable_ {
|
struct JAUSoundTable_ {
|
||||||
JAUSoundTable_() {
|
JAUSoundTable_() {
|
||||||
mData = NULL;
|
field_0x0 = NULL;
|
||||||
mRoot = 0;
|
field_0x4 = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void reset() {
|
void reset() {
|
||||||
mData = NULL;
|
field_0x0 = NULL;
|
||||||
mRoot = NULL;
|
field_0x4 = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
void init(const void* dataStart) {
|
void init(const void* param_0) {
|
||||||
mData = dataStart;
|
field_0x0 = param_0;
|
||||||
// magic number is not in debug rom. I'm not sure what this comparison is (maybe some sort of '' number?)
|
// magic number is not in debug rom. I'm not sure what this comparison is (maybe some sort of '' number?)
|
||||||
// I also do not know how it is different between JAUSoundTable and JAUSoundNameTable
|
// I also do not know how it is different between JAUSoundTable and JAUSoundNameTable
|
||||||
// Future person here: This is checking for either "BST " or "BSTN", with the second two letters in Root::magicNumber().
|
if (*(BE(u32)*)field_0x0 + 0xbdad0000 != Root::magicNumber()) {
|
||||||
// Idk why the operations here are all weird but I can't use objdiff right now.
|
field_0x0 = NULL;
|
||||||
if (*(BE(u32)*)mData + 0xbdad0000 != Root::magicNumber()) {
|
|
||||||
mData = NULL;
|
|
||||||
} else {
|
} else {
|
||||||
mRoot = (Root*)((u8*)mData + *((BE(u32)*)mData + 3));
|
field_0x4 = (Root*)((u8*)field_0x0 + *((BE(u32)*)field_0x0 + 3));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -196,34 +48,34 @@ struct JAUSoundTable_ {
|
|||||||
if (index < 0) {
|
if (index < 0) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
if ((u32)index >= mRoot->mSectionNumber) {
|
if ((u32)index >= field_0x4->mSectionNumber) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
u32 offset = mRoot->mSectionOffsets[index];
|
u32 offset = field_0x4->mSectionOffsets[index];
|
||||||
if (offset == 0) {
|
if (offset == 0) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
return (Section*)((u8*)mData + offset);
|
return (Section*)((u8*)field_0x0 + offset);
|
||||||
}
|
}
|
||||||
|
|
||||||
Group* getGroup(Section* section, int index) const {
|
Group* getGroup(Section* param_1, int index) const {
|
||||||
int iVar1;
|
int iVar1;
|
||||||
|
|
||||||
if (index < 0) {
|
if (index < 0) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
if ((u32)index >= section->mNumGroups) {
|
if ((u32)index >= param_1->mNumGroups) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
u32 offset = section->getGroupOffset(index);
|
u32 offset = param_1->getGroupOffset(index);
|
||||||
if (offset == 0) {
|
if (offset == 0) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
return (Group*)((u8*)mData + offset);
|
return (Group*)((u8*)field_0x0 + offset);
|
||||||
}
|
}
|
||||||
|
|
||||||
const void* mData;
|
const void* field_0x0;
|
||||||
Root* mRoot;
|
Root* field_0x4;
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -231,7 +83,7 @@ struct JAUSoundTable_ {
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
struct JAUSoundTableRoot {
|
struct JAUSoundTableRoot {
|
||||||
static inline u32 magicNumber() { return 'T '; } // Second half of "BST "
|
static inline u32 magicNumber() { return 0x5420; }
|
||||||
BE(u32) mSectionNumber;
|
BE(u32) mSectionNumber;
|
||||||
BE(u32) mSectionOffsets[0];
|
BE(u32) mSectionOffsets[0];
|
||||||
};
|
};
|
||||||
@@ -282,7 +134,7 @@ struct JAUSoundTableGroup {
|
|||||||
|
|
||||||
BE(u32) mNumItems;
|
BE(u32) mNumItems;
|
||||||
BE(u32) field_0x4;
|
BE(u32) field_0x4;
|
||||||
u8 mTypeIds[0]; // TODO: Should probably be BE(u32), but I can't objdiff rn.
|
u8 mTypeIds[0];
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -290,7 +142,7 @@ struct JAUSoundTableGroup {
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
struct JAUSoundTable : public JASGlobalInstance<JAUSoundTable> {
|
struct JAUSoundTable : public JASGlobalInstance<JAUSoundTable> {
|
||||||
JAUSoundTable(bool setInstance) : JASGlobalInstance<JAUSoundTable>(setInstance) {
|
JAUSoundTable(bool param_0) : JASGlobalInstance<JAUSoundTable>(param_0) {
|
||||||
}
|
}
|
||||||
~JAUSoundTable() {}
|
~JAUSoundTable() {}
|
||||||
|
|
||||||
@@ -305,11 +157,11 @@ struct JAUSoundTable : public JASGlobalInstance<JAUSoundTable> {
|
|||||||
if (offset == 0) {
|
if (offset == 0) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
return (JAUSoundTableItem*)((u8*)field_0x0.mData + offset);
|
return (JAUSoundTableItem*)((u8*)field_0x0.field_0x0 + offset);
|
||||||
}
|
}
|
||||||
|
|
||||||
const void* getResource() const { return field_0x0.mData; }
|
const void* getResource() const { return field_0x0.field_0x0; }
|
||||||
bool isValid() const { return field_0x0.mData != NULL; }
|
bool isValid() const { return field_0x0.field_0x0 != NULL; }
|
||||||
|
|
||||||
JAUSoundTable_<JAUSoundTableRoot,JAUSoundTableSection,JAUSoundTableGroup,void> field_0x0;
|
JAUSoundTable_<JAUSoundTableRoot,JAUSoundTableSection,JAUSoundTableGroup,void> field_0x0;
|
||||||
};
|
};
|
||||||
@@ -319,7 +171,7 @@ struct JAUSoundTable : public JASGlobalInstance<JAUSoundTable> {
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
struct JAUSoundNameTableRoot {
|
struct JAUSoundNameTableRoot {
|
||||||
static inline u32 magicNumber() { return 'TN'; } // Second half of "BSTN"
|
static inline u32 magicNumber() { return 0x544e; }
|
||||||
BE(u32) mSectionNumber;
|
BE(u32) mSectionNumber;
|
||||||
BE(u32) mSectionOffsets[0];
|
BE(u32) mSectionOffsets[0];
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -70,7 +70,7 @@ void JAISe::JAISeCategoryMgr_mixOut_(bool param_0, const JASSoundParams& params,
|
|||||||
if (inner_.field_0x26c) {
|
if (inner_.field_0x26c) {
|
||||||
switch (inner_.track.getStatus()) {
|
switch (inner_.track.getStatus()) {
|
||||||
case JASTrack::STATUS_STOPPED:
|
case JASTrack::STATUS_STOPPED:
|
||||||
if (status_.field_0x1.flags.mComesBack) {
|
if (status_.field_0x1.flags.flag1) {
|
||||||
startTrack_(params);
|
startTrack_(params);
|
||||||
} else {
|
} else {
|
||||||
stop_JAISound_();
|
stop_JAISound_();
|
||||||
@@ -84,8 +84,8 @@ void JAISe::JAISeCategoryMgr_mixOut_(bool param_0, const JASSoundParams& params,
|
|||||||
startTrack_(params);
|
startTrack_(params);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if (status_.field_0x1.flags.mComesBack) {
|
} else if (status_.field_0x1.flags.flag1) {
|
||||||
if (status_.field_0x1.flags.mPauseWhenOut) {
|
if (status_.field_0x1.flags.flag3) {
|
||||||
inner_.track.pause(true);
|
inner_.track.pause(true);
|
||||||
} else {
|
} else {
|
||||||
stopTrack_();
|
stopTrack_();
|
||||||
|
|||||||
@@ -167,7 +167,7 @@ JAISeMgr::JAISeMgr(bool setInstance) : JASGlobalInstance<JAISeMgr>(setInstance)
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool JAISeMgr::isUsingSeqData(const JAISeqDataRegion& seqDataRegion) {
|
bool JAISeMgr::isUsingSeqData(const JAISeqDataRegion& seqDataRegion) {
|
||||||
for (int i = 0; i < NUM_CATEGORIES; i++) {
|
for (int i = 0; i < 16; i++) {
|
||||||
if (mCategoryMgrs[i].JAISeCategoryMgr::isUsingSeqData(seqDataRegion)) {
|
if (mCategoryMgrs[i].JAISeCategoryMgr::isUsingSeqData(seqDataRegion)) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -177,7 +177,7 @@ bool JAISeMgr::isUsingSeqData(const JAISeqDataRegion& seqDataRegion) {
|
|||||||
|
|
||||||
int JAISeMgr::releaseSeqData(const JAISeqDataRegion& seqDataRegion) {
|
int JAISeMgr::releaseSeqData(const JAISeqDataRegion& seqDataRegion) {
|
||||||
bool r30 = 0;
|
bool r30 = 0;
|
||||||
for (int i = 0; i < NUM_CATEGORIES; i++) {
|
for (int i = 0; i < 16; i++) {
|
||||||
switch (mCategoryMgrs[i].JAISeCategoryMgr::releaseSeqData(seqDataRegion)) {
|
switch (mCategoryMgrs[i].JAISeCategoryMgr::releaseSeqData(seqDataRegion)) {
|
||||||
case 0:
|
case 0:
|
||||||
return 0;
|
return 0;
|
||||||
@@ -191,14 +191,14 @@ int JAISeMgr::releaseSeqData(const JAISeqDataRegion& seqDataRegion) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void JAISeMgr::setCategoryArrangement(const JAISeCategoryArrangement& arrangement) {
|
void JAISeMgr::setCategoryArrangement(const JAISeCategoryArrangement& arrangement) {
|
||||||
for (int i = 0; i < NUM_CATEGORIES; i++) {
|
for (int i = 0; i < 16; i++) {
|
||||||
mCategoryMgrs[i].setMaxActiveSe(arrangement.mItems[i].mMaxActiveSe);
|
mCategoryMgrs[i].setMaxActiveSe(arrangement.mItems[i].mMaxActiveSe);
|
||||||
mCategoryMgrs[i].setMaxInactiveSe(arrangement.mItems[i].mMaxInactiveSe);
|
mCategoryMgrs[i].setMaxInactiveSe(arrangement.mItems[i].mMaxInactiveSe);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void JAISeMgr::getCategoryArrangement(JAISeCategoryArrangement* arrangement) {
|
void JAISeMgr::getCategoryArrangement(JAISeCategoryArrangement* arrangement) {
|
||||||
for (int i = 0; i < NUM_CATEGORIES; i++) {
|
for (int i = 0; i < 16; i++) {
|
||||||
int active = mCategoryMgrs[i].getMaxActiveSe();
|
int active = mCategoryMgrs[i].getMaxActiveSe();
|
||||||
JUT_ASSERT(299, active <= 255);
|
JUT_ASSERT(299, active <= 255);
|
||||||
arrangement->mItems[i].mMaxActiveSe = active;
|
arrangement->mItems[i].mMaxActiveSe = active;
|
||||||
@@ -209,19 +209,19 @@ void JAISeMgr::getCategoryArrangement(JAISeCategoryArrangement* arrangement) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void JAISeMgr::stop() {
|
void JAISeMgr::stop() {
|
||||||
for (int i = 0; i < NUM_CATEGORIES; i++) {
|
for (int i = 0; i < 16; i++) {
|
||||||
mCategoryMgrs[i].stop();
|
mCategoryMgrs[i].stop();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void JAISeMgr::stopSoundID(JAISoundID id) {
|
void JAISeMgr::stopSoundID(JAISoundID id) {
|
||||||
for (int i = 0; i < NUM_CATEGORIES; i++) {
|
for (int i = 0; i < 16; i++) {
|
||||||
mCategoryMgrs[i].stopSoundID(id);
|
mCategoryMgrs[i].stopSoundID(id);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void JAISeMgr::initParams() {
|
void JAISeMgr::initParams() {
|
||||||
for (int i = 0; i < NUM_CATEGORIES; i++) {
|
for (int i = 0; i < 16; i++) {
|
||||||
mCategoryMgrs[i].getParams()->init();
|
mCategoryMgrs[i].getParams()->init();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -270,16 +270,16 @@ JAISe* JAISeMgr::newSe_(int category, u32 priority) {
|
|||||||
|
|
||||||
void JAISeMgr::calc() {
|
void JAISeMgr::calc() {
|
||||||
mParams.calc();
|
mParams.calc();
|
||||||
for (int i = 0; i < NUM_CATEGORIES; i++) {
|
for (int i = 0; i < 16; i++) {
|
||||||
mCategoryMgrs[i].JAISeMgr_calc_();
|
mCategoryMgrs[i].JAISeMgr_calc_();
|
||||||
}
|
}
|
||||||
for (int i = 0; i < NUM_CATEGORIES; i++) {
|
for (int i = 0; i < 16; i++) {
|
||||||
mCategoryMgrs[i].JAISeMgr_freeDeadSe_();
|
mCategoryMgrs[i].JAISeMgr_freeDeadSe_();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void JAISeMgr::mixOut() {
|
void JAISeMgr::mixOut() {
|
||||||
for (int i = 0; i < NUM_CATEGORIES; i++) {
|
for (int i = 0; i < 16; i++) {
|
||||||
mCategoryMgrs[i].JAISeMgr_mixOut_(mParams, mSoundActivity);
|
mCategoryMgrs[i].JAISeMgr_mixOut_(mParams, mSoundActivity);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -324,7 +324,7 @@ bool JAISeMgr::startSound(JAISoundID id, JAISoundHandle* handle, const JGeometry
|
|||||||
|
|
||||||
int JAISeMgr::getNumActiveSe() const {
|
int JAISeMgr::getNumActiveSe() const {
|
||||||
int num = 0;
|
int num = 0;
|
||||||
for (int i = 0; i < NUM_CATEGORIES; i++) {
|
for (int i = 0; i < 16; i++) {
|
||||||
num += mCategoryMgrs[i].getNumSe();
|
num += mCategoryMgrs[i].getNumSe();
|
||||||
}
|
}
|
||||||
return num;
|
return num;
|
||||||
|
|||||||
@@ -54,9 +54,9 @@ s32 JAISoundStatus_::unlockIfLocked() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void JAISoundParams::mixOutAll(const JASSoundParams& inParams, JASSoundParams* outParams, f32 param_2) {
|
void JAISoundParams::mixOutAll(const JASSoundParams& inParams, JASSoundParams* outParams, f32 param_2) {
|
||||||
outParams->mVolume = move_.params_.mVolume * (inParams.mVolume * property_.mVolume) * param_2;
|
outParams->mVolume = move_.params_.mVolume * (inParams.mVolume * property_.field_0x0) * param_2;
|
||||||
outParams->mFxMix = move_.params_.mFxMix + (inParams.mFxMix + property_.mFxMix);
|
outParams->mFxMix = move_.params_.mFxMix + (inParams.mFxMix + property_.field_0x4);
|
||||||
outParams->mPitch = move_.params_.mPitch * (inParams.mPitch * property_.mPitch);
|
outParams->mPitch = move_.params_.mPitch * (inParams.mPitch * property_.field_0x8);
|
||||||
outParams->mPan = (inParams.mPan + move_.params_.mPan) - 0.5f;
|
outParams->mPan = (inParams.mPan + move_.params_.mPan) - 0.5f;
|
||||||
outParams->mDolby = inParams.mDolby + move_.params_.mDolby;
|
outParams->mDolby = inParams.mDolby + move_.params_.mDolby;
|
||||||
}
|
}
|
||||||
@@ -181,7 +181,7 @@ bool JAISound::calc_JAISound_() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (audience_ != NULL && audible_ != NULL) {
|
if (audience_ != NULL && audible_ != NULL) {
|
||||||
if ((priority_ = audience_->calcPriority(audible_)) == 0xFFFFFFFF && status_.field_0x1.flags.mComesBack == 0) {
|
if ((priority_ = audience_->calcPriority(audible_)) == 0xFFFFFFFF && status_.field_0x1.flags.flag1 == 0) {
|
||||||
stop_JAISound_();
|
stop_JAISound_();
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -713,7 +713,7 @@ void JASAramStream::channelStart() {
|
|||||||
wave_info.mpPenult = 0;
|
wave_info.mpPenult = 0;
|
||||||
// probably a fake match, this should be set in the JASWaveInfo constructor
|
// probably a fake match, this should be set in the JASWaveInfo constructor
|
||||||
static u32 const one = 1;
|
static u32 const one = 1;
|
||||||
wave_info.mpLoaded = &one;
|
wave_info.field_0x20 = &one;
|
||||||
JASChannel* jc = JKR_NEW JASChannel(channelCallback, this);
|
JASChannel* jc = JKR_NEW JASChannel(channelCallback, this);
|
||||||
JUT_ASSERT(963, jc);
|
JUT_ASSERT(963, jc);
|
||||||
jc->setPriority(0x7f7f);
|
jc->setPriority(0x7f7f);
|
||||||
@@ -722,9 +722,9 @@ void JASAramStream::channelStart() {
|
|||||||
}
|
}
|
||||||
jc->setInitPitch(mSampleRate / JASDriver::getDacRate());
|
jc->setInitPitch(mSampleRate / JASDriver::getDacRate());
|
||||||
jc->setOscInit(0, &OSC_ENV);
|
jc->setOscInit(0, &OSC_ENV);
|
||||||
jc->mAnon.mWaveInfo = wave_info;
|
jc->field_0xdc.mWaveInfo = wave_info;
|
||||||
jc->mWaveAramAddress = mAramAddress + sBlockSize * mAramBlocksPerChannel * i;
|
jc->mWaveAramAddress = mAramAddress + sBlockSize * mAramBlocksPerChannel * i;
|
||||||
jc->mAnon.mChannelType = 0;
|
jc->field_0xdc.mChannelType = 0;
|
||||||
int ret = jc->playForce();
|
int ret = jc->playForce();
|
||||||
JUT_ASSERT(977, ret);
|
JUT_ASSERT(977, ret);
|
||||||
JUT_ASSERT_MSG(979, mChannels[i] == NULL, "channelStart for already playing channel");
|
JUT_ASSERT_MSG(979, mChannels[i] == NULL, "channelStart for already playing channel");
|
||||||
|
|||||||
@@ -115,9 +115,9 @@ JASBasicBank* JASBNKParser::Ver1::createBasicBank(void const* stream, JKRHeap* h
|
|||||||
JASBasicInst::TKeymap* keymap = instp->getKeyRegion(j);
|
JASBasicInst::TKeymap* keymap = instp->getKeyRegion(j);
|
||||||
keymap->setHighKey(*data >> 0x18);
|
keymap->setHighKey(*data >> 0x18);
|
||||||
u32 fVar4 = data[1];
|
u32 fVar4 = data[1];
|
||||||
keymap->mWaveId = JSULoHalf(data[3]);
|
keymap->field_0x4 = JSULoHalf(data[3]);
|
||||||
keymap->mVolumeMult = *(BE(f32)*)&data[4];
|
keymap->field_0x8 = *(BE(f32)*)&data[4];
|
||||||
keymap->mPitchMult = *(BE(f32)*)&data[5];
|
keymap->field_0xc = *(BE(f32)*)&data[5];
|
||||||
data += 2;
|
data += 2;
|
||||||
for (int k = 0; k < fVar4; k++) {
|
for (int k = 0; k < fVar4; k++) {
|
||||||
data += 4;
|
data += 4;
|
||||||
@@ -159,9 +159,9 @@ JASBasicBank* JASBNKParser::Ver1::createBasicBank(void const* stream, JKRHeap* h
|
|||||||
ptr++;
|
ptr++;
|
||||||
}
|
}
|
||||||
u32 pVar6 = ptr[0];
|
u32 pVar6 = ptr[0];
|
||||||
percp->mWaveId = JSULoHalf(ptr[2]);
|
percp->field_0xe = JSULoHalf(ptr[2]);
|
||||||
percp->mVolumeMult = *(BE(f32)*)&ptr[3];
|
percp->field_0x10 = *(BE(f32)*)&ptr[3];
|
||||||
percp->mPitchMult = *(BE(f32)*)&ptr[4];
|
percp->field_0x14 = *(BE(f32)*)&ptr[4];
|
||||||
for (int k = 0; k < pVar6; k++) {}
|
for (int k = 0; k < pVar6; k++) {}
|
||||||
drump->setPerc(j, percp);
|
drump->setPerc(j, percp);
|
||||||
}
|
}
|
||||||
@@ -260,9 +260,9 @@ JASBasicBank* JASBNKParser::Ver0::createBasicBank(void const* stream, JKRHeap* h
|
|||||||
TKeymap* tkeymap = tinst->mKeymapOffset[j].ptr(header);
|
TKeymap* tkeymap = tinst->mKeymapOffset[j].ptr(header);
|
||||||
keymap->setHighKey(tkeymap->mHighKey);
|
keymap->setHighKey(tkeymap->mHighKey);
|
||||||
TVmap* tvmap = tkeymap->mVmapOffset.ptr(header);
|
TVmap* tvmap = tkeymap->mVmapOffset.ptr(header);
|
||||||
keymap->mWaveId = JSULoHalf(tvmap->field_0x4);
|
keymap->field_0x4 = JSULoHalf(tvmap->field_0x4);
|
||||||
keymap->mVolumeMult = tvmap->field_0x8;
|
keymap->field_0x8 = tvmap->field_0x8;
|
||||||
keymap->mPitchMult = tvmap->field_0xc;
|
keymap->field_0xc = tvmap->field_0xc;
|
||||||
}
|
}
|
||||||
|
|
||||||
bank->setInst(i, instp);
|
bank->setInst(i, instp);
|
||||||
@@ -288,9 +288,9 @@ JASBasicBank* JASBNKParser::Ver0::createBasicBank(void const* stream, JKRHeap* h
|
|||||||
percp->setRelease(tperc->mRelease[j]);
|
percp->setRelease(tperc->mRelease[j]);
|
||||||
}
|
}
|
||||||
TVmap* vmap = tpmap->mVmapOffset.ptr(header);
|
TVmap* vmap = tpmap->mVmapOffset.ptr(header);
|
||||||
percp->mWaveId = JSULoHalf(vmap->field_0x4);
|
percp->field_0xe = JSULoHalf(vmap->field_0x4);
|
||||||
percp->mVolumeMult = vmap->field_0x8;
|
percp->field_0x10 = vmap->field_0x8;
|
||||||
percp->mPitchMult = vmap->field_0xc;
|
percp->field_0x14 = vmap->field_0xc;
|
||||||
setp->setPerc(j, percp);
|
setp->setPerc(j, percp);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -314,8 +314,8 @@ JASOscillator::Data* JASBNKParser::Ver0::findOscPtr(JASBasicBank* bank, THeader
|
|||||||
if (inst != NULL) {
|
if (inst != NULL) {
|
||||||
JASInstParam param;
|
JASInstParam param;
|
||||||
inst->getParam(0x3c, 0x7f, ¶m);
|
inst->getParam(0x3c, 0x7f, ¶m);
|
||||||
if (j < param.mOscillatorCount) {
|
if (j < param.field_0x1d) {
|
||||||
return param.mOscillators[j];
|
return param.field_0x14[j];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,83 +1,64 @@
|
|||||||
#include "JSystem/JSystem.h" // IWYU pragma: keep
|
#include "JSystem/JSystem.h" // IWYU pragma: keep
|
||||||
|
|
||||||
#include "JSystem/JAudio2/JASBank.h"
|
#include "JSystem/JAudio2/JASBank.h"
|
||||||
|
|
||||||
#include "dusk/mods/svc/audio_res/audio_res.hpp"
|
|
||||||
#include "JSystem/JAudio2/JASAiCtrl.h"
|
#include "JSystem/JAudio2/JASAiCtrl.h"
|
||||||
#include "JSystem/JAudio2/JASBasicInst.h"
|
#include "JSystem/JAudio2/JASBasicInst.h"
|
||||||
#include "JSystem/JAudio2/JASBasicWaveBank.h"
|
#include "JSystem/JAudio2/JASBasicWaveBank.h"
|
||||||
#include "JSystem/JAudio2/JASChannel.h"
|
#include "JSystem/JAudio2/JASChannel.h"
|
||||||
|
|
||||||
using namespace dusk::mods::svc::audio_res;
|
|
||||||
|
|
||||||
// NONMATCHING JASPoolAllocObject_MultiThreaded<_> locations
|
// NONMATCHING JASPoolAllocObject_MultiThreaded<_> locations
|
||||||
JASChannel* JASBank::noteOn(JASBank const* bank, int program, u8 key, u8 velocity, u16 priority,
|
JASChannel* JASBank::noteOn(JASBank const* param_0, int param_1, u8 param_2, u8 param_3, u16 param_4,
|
||||||
void (*callback)(u32, JASChannel*, JASDsp::TChannel*, void*),
|
void (*param_5)(u32, JASChannel*, JASDsp::TChannel*, void*),
|
||||||
void* callback_data) {
|
void* param_6) {
|
||||||
if (program >= 0xf0) {
|
if (param_1 >= 0xf0) {
|
||||||
return noteOnOsc(program - 0xf0, key, velocity, priority, callback, callback_data);
|
return noteOnOsc(param_1 - 0xf0, param_2, param_3, param_4, param_5, param_6);
|
||||||
}
|
}
|
||||||
if (!bank) {
|
if (!param_0) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
JASInstParam instParam;
|
JASInstParam stack_60;
|
||||||
if (!bank->getInstParam(program, key, velocity, &instParam)) {
|
if (!param_0->getInstParam(param_1, param_2, param_3, &stack_60)) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
JASWaveBank* waveBank = bank->getWaveBank();
|
JASWaveBank* waveBank = param_0->getWaveBank();
|
||||||
if (!waveBank) {
|
if (!waveBank) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
JASWaveHandle* waveHandle = waveBank->getWaveHandle(instParam.mWaveId);
|
JASWaveHandle* waveHandle = waveBank->getWaveHandle(stack_60.field_0x1a);
|
||||||
if (!waveHandle) {
|
if (!waveHandle) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
#if TARGET_PC
|
|
||||||
auto const wave_key = AudioWaveKey(static_cast<AudioWaveBank>(waveBank->bankId), instParam.mWaveId);
|
|
||||||
std::lock_guard lock(s_replacements_mutex);
|
|
||||||
auto const found_replacement = s_replacements.find(wave_key);
|
|
||||||
if (found_replacement != s_replacements.end()) {
|
|
||||||
waveHandle = &found_replacement->second;
|
|
||||||
}
|
|
||||||
|
|
||||||
auto const aramBase = waveHandle->getAramBaseAddress();
|
|
||||||
#endif
|
|
||||||
|
|
||||||
const JASWaveInfo* waveInfo = waveHandle->getWaveInfo();
|
const JASWaveInfo* waveInfo = waveHandle->getWaveInfo();
|
||||||
if (!waveInfo) {
|
if (!waveInfo) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
intptr_t wavePtr = waveHandle->getWavePtr();
|
intptr_t wavePtr = waveHandle->getWavePtr();
|
||||||
if (!wavePtr IF_DUSK(&& !aramBase)) {
|
if (!wavePtr) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
JASChannel* channel = JKR_NEW JASChannel(callback, callback_data);
|
JASChannel* channel = JKR_NEW JASChannel(param_5, param_6);
|
||||||
if (!channel) {
|
if (!channel) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
channel->setPriority(priority);
|
channel->setPriority(param_4);
|
||||||
channel->mAnon.mWaveInfo = *waveInfo;
|
channel->field_0xdc.mWaveInfo = *waveInfo;
|
||||||
channel->mWaveAramAddress = wavePtr;
|
channel->mWaveAramAddress = wavePtr;
|
||||||
#if TARGET_PC
|
channel->field_0xdc.mChannelType = stack_60.field_0x1c;
|
||||||
channel->mAramBaseAddress = aramBase;
|
channel->setBankDisposeID(param_0);
|
||||||
channel->mSampleReference = waveHandle->getSampleReference();
|
channel->setInitPitch(stack_60.mPitch * (waveInfo->mSampleRate / JASDriver::getDacRate()));
|
||||||
#endif
|
if (stack_60.field_0x1e == 0) {
|
||||||
channel->mAnon.mChannelType = instParam.mChannelType;
|
channel->setKey(param_2 - waveInfo->mBaseKey);
|
||||||
channel->setBankDisposeID(bank);
|
|
||||||
channel->setInitPitch(instParam.mPitch * (waveInfo->mSampleRate / JASDriver::getDacRate()));
|
|
||||||
if (instParam.mDontSetKey == 0) {
|
|
||||||
channel->setKey(key - waveInfo->mBaseKey);
|
|
||||||
}
|
}
|
||||||
channel->setInitVolume(instParam.mVolume);
|
channel->setInitVolume(stack_60.mVolume);
|
||||||
channel->setVelocity(velocity);
|
channel->setVelocity(param_3);
|
||||||
channel->setInitPan(instParam.mPan);
|
channel->setInitPan(stack_60.mPan);
|
||||||
channel->setInitFxmix(instParam.mFxMix);
|
channel->setInitFxmix(stack_60.mFxMix);
|
||||||
channel->setInitDolby(instParam.mDolby);
|
channel->setInitDolby(stack_60.mDolby);
|
||||||
for (u32 i = 0; i < instParam.mOscillatorCount; i++) {
|
for (u32 i = 0; i < stack_60.field_0x1d; i++) {
|
||||||
channel->setOscInit(i, instParam.mOscillators[i]);
|
channel->setOscInit(i, stack_60.field_0x14[i]);
|
||||||
}
|
}
|
||||||
channel->setDirectRelease(instParam.mDirectRelease);
|
channel->setDirectRelease(stack_60.field_0x18);
|
||||||
if (!channel->play()) {
|
if (!channel->play()) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
@@ -85,24 +66,24 @@ JASChannel* JASBank::noteOn(JASBank const* bank, int program, u8 key, u8 velocit
|
|||||||
}
|
}
|
||||||
|
|
||||||
// NONMATCHING JASPoolAllocObject_MultiThreaded<_> locations
|
// NONMATCHING JASPoolAllocObject_MultiThreaded<_> locations
|
||||||
JASChannel* JASBank::noteOnOsc(int param_0, u8 key, u8 velocity, u16 priority,
|
JASChannel* JASBank::noteOnOsc(int param_0, u8 param_1, u8 param_2, u16 param_3,
|
||||||
void (*callback)(u32, JASChannel*, JASDsp::TChannel*, void*),
|
void (*param_4)(u32, JASChannel*, JASDsp::TChannel*, void*),
|
||||||
void* callback_data) {
|
void* param_5) {
|
||||||
static JASOscillator::Point const OSC_RELEASE_TABLE[2] = {
|
static JASOscillator::Point const OSC_RELEASE_TABLE[2] = {
|
||||||
{0x0001, 0x000A, 0x0000},
|
{0x0001, 0x000A, 0x0000},
|
||||||
{0x000F, 0x0000, 0x0000},
|
{0x000F, 0x0000, 0x0000},
|
||||||
};
|
};
|
||||||
static const JASOscillator::Data OSC_ENV = {0, 1.0f, NULL, OSC_RELEASE_TABLE, 1.0f, 0.0f};
|
static const JASOscillator::Data OSC_ENV = {0, 1.0f, NULL, OSC_RELEASE_TABLE, 1.0f, 0.0f};
|
||||||
JASChannel* channel = JKR_NEW JASChannel(callback, callback_data);
|
JASChannel* channel = JKR_NEW JASChannel(param_4, param_5);
|
||||||
if (!channel) {
|
if (!channel) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
channel->setPriority(priority);
|
channel->setPriority(param_3);
|
||||||
channel->mOscillatorSomething = param_0;
|
channel->mOscillatorSomething = param_0;
|
||||||
channel->mAnon.mChannelType = CHANNEL_OSCILLATOR;
|
channel->field_0xdc.mChannelType = 2;
|
||||||
channel->setInitPitch(16736.016f / JASDriver::getDacRate());
|
channel->setInitPitch(16736.016f / JASDriver::getDacRate());
|
||||||
channel->setKey(key - channel->mAnon.mWaveInfo.mBaseKey);
|
channel->setKey(param_1 - channel->field_0xdc.mWaveInfo.mBaseKey);
|
||||||
channel->setVelocity(velocity);
|
channel->setVelocity(param_2);
|
||||||
channel->setOscInit(0, &OSC_ENV);
|
channel->setOscInit(0, &OSC_ENV);
|
||||||
if (!channel->play()) {
|
if (!channel->play()) {
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|||||||
@@ -14,20 +14,20 @@ void JASBasicBank::newInstTable(u8 num, JKRHeap* heap) {
|
|||||||
mInstNumMax = num;
|
mInstNumMax = num;
|
||||||
mInstTable = JKR_NEW_ARRAY_ARGS(JASInst*, mInstNumMax, heap, 0);
|
mInstTable = JKR_NEW_ARRAY_ARGS(JASInst*, mInstNumMax, heap, 0);
|
||||||
#if TARGET_ANDROID
|
#if TARGET_ANDROID
|
||||||
JASCalc::_bzero(mInstTable, mInstNumMax * sizeof(mInstTable[0]));
|
JASCalc::_bzero(mInstTable, mInstNumMax * 4);
|
||||||
#else
|
#else
|
||||||
JASCalc::bzero(mInstTable, mInstNumMax * sizeof(mInstTable[0]));
|
JASCalc::bzero(mInstTable, mInstNumMax * 4);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool JASBasicBank::getInstParam(int prg_no, int key, int velocity,
|
bool JASBasicBank::getInstParam(int prg_no, int param_1, int param_2,
|
||||||
JASInstParam* o_param) const {
|
JASInstParam* o_param) const {
|
||||||
JASInst* inst = getInst(prg_no);
|
JASInst* inst = getInst(prg_no);
|
||||||
if (inst == NULL) {
|
if (inst == NULL) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
return inst->getParam(key, velocity, o_param);
|
return inst->getParam(param_1, param_2, o_param);
|
||||||
}
|
}
|
||||||
|
|
||||||
void JASBasicBank::setInst(int prg_no, JASInst* inst) {
|
void JASBasicBank::setInst(int prg_no, JASInst* inst) {
|
||||||
|
|||||||
@@ -14,9 +14,9 @@ JASBasicInst::JASBasicInst() {
|
|||||||
mKeymapCount = 0;
|
mKeymapCount = 0;
|
||||||
mKeymap = NULL;
|
mKeymap = NULL;
|
||||||
#if TARGET_ANDROID
|
#if TARGET_ANDROID
|
||||||
JASCalc::_bzero(mOscillators, sizeof(mOscillators));
|
JASCalc::_bzero(field_0xc, sizeof(field_0xc));
|
||||||
#else
|
#else
|
||||||
JASCalc::bzero(mOscillators, sizeof(mOscillators));
|
JASCalc::bzero(field_0xc, sizeof(field_0xc));
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -24,18 +24,18 @@ JASBasicInst::~JASBasicInst() {
|
|||||||
JKR_DELETE_ARRAY(mKeymap);
|
JKR_DELETE_ARRAY(mKeymap);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool JASBasicInst::getParam(int key, int velocity, JASInstParam* o_param) const {
|
bool JASBasicInst::getParam(int param_0, int param_1, JASInstParam* param_2) const {
|
||||||
UNUSED(velocity);
|
UNUSED(param_1);
|
||||||
o_param->mChannelType = 0;
|
param_2->field_0x1c = 0;
|
||||||
o_param->mDontSetKey = 0;
|
param_2->field_0x1e = 0;
|
||||||
o_param->mOscillators = (JASOscillator::Data**)&mOscillators;
|
param_2->field_0x14 = (JASOscillator::Data**)&field_0xc;
|
||||||
o_param->mOscillatorCount = 2;
|
param_2->field_0x1d = 2;
|
||||||
o_param->mVolume = mVolume;
|
param_2->mVolume = mVolume;
|
||||||
o_param->mPitch = mPitch;
|
param_2->mPitch = mPitch;
|
||||||
|
|
||||||
TKeymap* keyMap = NULL;
|
TKeymap* keyMap = NULL;
|
||||||
for (int i = 0; i < mKeymapCount; i++) {
|
for (int i = 0; i < mKeymapCount; i++) {
|
||||||
if (key <= mKeymap[i].mHighKey) {
|
if (param_0 <= mKeymap[i].mHighKey) {
|
||||||
keyMap = &mKeymap[i];
|
keyMap = &mKeymap[i];
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -45,9 +45,9 @@ bool JASBasicInst::getParam(int key, int velocity, JASInstParam* o_param) const
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
o_param->mVolume *= keyMap->mVolumeMult;
|
param_2->mVolume *= keyMap->field_0x8;
|
||||||
o_param->mPitch *= keyMap->mPitchMult;
|
param_2->mPitch *= keyMap->field_0xc;
|
||||||
o_param->mWaveId = u16(keyMap->mWaveId);
|
param_2->field_0x1a = u16(keyMap->field_0x4);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -61,7 +61,7 @@ void JASBasicInst::setKeyRegionCount(u32 count, JKRHeap* param_1) {
|
|||||||
void JASBasicInst::setOsc(int index, JASOscillator::Data const* param_1) {
|
void JASBasicInst::setOsc(int index, JASOscillator::Data const* param_1) {
|
||||||
JUT_ASSERT(128, index < OSC_MAX);
|
JUT_ASSERT(128, index < OSC_MAX);
|
||||||
JUT_ASSERT(129, index >= 0);
|
JUT_ASSERT(129, index >= 0);
|
||||||
mOscillators[index] = param_1;
|
field_0xc[index] = param_1;
|
||||||
}
|
}
|
||||||
|
|
||||||
JASBasicInst::TKeymap* JASBasicInst::getKeyRegion(int index) {
|
JASBasicInst::TKeymap* JASBasicInst::getKeyRegion(int index) {
|
||||||
|
|||||||
@@ -6,12 +6,12 @@
|
|||||||
#include "JSystem/JUtility/JUTAssert.h"
|
#include "JSystem/JUtility/JUTAssert.h"
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
|
||||||
JASBasicWaveBank::JASBasicWaveBank(IF_DUSK(u32 bankId)) IF_DUSK(: JASWaveBank(bankId)) {
|
JASBasicWaveBank::JASBasicWaveBank() {
|
||||||
mWaveTable = NULL;
|
mWaveTable = NULL;
|
||||||
mWaveGroupArray = NULL;
|
mWaveGroupArray = NULL;
|
||||||
mHandleCount = 0;
|
mHandleCount = 0;
|
||||||
mGroupCount = 0;
|
mGroupCount = 0;
|
||||||
OSInitMutex(&mWaveTableMutex);
|
OSInitMutex(&field_0x4);
|
||||||
}
|
}
|
||||||
|
|
||||||
JASBasicWaveBank::~JASBasicWaveBank() {
|
JASBasicWaveBank::~JASBasicWaveBank() {
|
||||||
@@ -44,13 +44,13 @@ void JASBasicWaveBank::setWaveTableSize(u32 param_0, JKRHeap* param_1) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void JASBasicWaveBank::incWaveTable(JASBasicWaveBank::TWaveGroup const* param_0) {
|
void JASBasicWaveBank::incWaveTable(JASBasicWaveBank::TWaveGroup const* param_0) {
|
||||||
JASMutexLock lock(&mWaveTableMutex);
|
JASMutexLock lock(&field_0x4);
|
||||||
for (u32 i = 0; i < param_0->getWaveCount(); i++) {
|
for (u32 i = 0; i < param_0->getWaveCount(); i++) {
|
||||||
TWaveHandle* handle = mWaveTable + param_0->getWaveID(i);
|
TWaveHandle* handle = mWaveTable + param_0->getWaveID(i);
|
||||||
if (!handle->mHeap) {
|
if (!handle->mHeap) {
|
||||||
handle->mHeap = ¶m_0->mHeap;
|
handle->mHeap = ¶m_0->mHeap;
|
||||||
handle->mWaveInfo.mpLoaded = ¶m_0->mCurrentlyLoaded;
|
handle->field_0x4.field_0x20 = ¶m_0->_48;
|
||||||
handle->mWaveInfo.mOffsetStart = param_0->mCtrlWaveArray[i].mOffsetStart;
|
handle->field_0x4.mOffsetStart = param_0->mCtrlWaveArray[i].field_0x4;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -58,13 +58,13 @@ void JASBasicWaveBank::incWaveTable(JASBasicWaveBank::TWaveGroup const* param_0)
|
|||||||
DUSK_GAME_DATA u32 JASBasicWaveBank::mNoLoad;
|
DUSK_GAME_DATA u32 JASBasicWaveBank::mNoLoad;
|
||||||
|
|
||||||
void JASBasicWaveBank::decWaveTable(JASBasicWaveBank::TWaveGroup const* param_0) {
|
void JASBasicWaveBank::decWaveTable(JASBasicWaveBank::TWaveGroup const* param_0) {
|
||||||
JASMutexLock lock(&mWaveTableMutex);
|
JASMutexLock lock(&field_0x4);
|
||||||
for (u32 i = 0; i < param_0->getWaveCount(); i++) {
|
for (u32 i = 0; i < param_0->getWaveCount(); i++) {
|
||||||
TWaveHandle* handle = mWaveTable + param_0->getWaveID(i);
|
TWaveHandle* handle = mWaveTable + param_0->getWaveID(i);
|
||||||
if (handle->mHeap == ¶m_0->mHeap) {
|
if (handle->mHeap == ¶m_0->mHeap) {
|
||||||
handle->mHeap = NULL;
|
handle->mHeap = NULL;
|
||||||
handle->mWaveInfo.mpLoaded = &mNoLoad;
|
handle->field_0x4.field_0x20 = &mNoLoad;
|
||||||
handle->mWaveInfo.mOffsetStart = -1;
|
handle->field_0x4.mOffsetStart = -1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -80,15 +80,15 @@ JASWaveHandle* JASBasicWaveBank::getWaveHandle(u32 param_0) const {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void JASBasicWaveBank::setWaveInfo(JASBasicWaveBank::TWaveGroup* wgrp, int index,
|
void JASBasicWaveBank::setWaveInfo(JASBasicWaveBank::TWaveGroup* wgrp, int index,
|
||||||
u16 waveId, JASWaveInfo const& param_3) {
|
u16 param_2, JASWaveInfo const& param_3) {
|
||||||
JUT_ASSERT(204, wgrp);
|
JUT_ASSERT(204, wgrp);
|
||||||
JUT_ASSERT(205, index < wgrp->mWaveCount);
|
JUT_ASSERT(205, index < wgrp->mWaveCount);
|
||||||
JUT_ASSERT(206, index >= 0);
|
JUT_ASSERT(206, index >= 0);
|
||||||
mWaveTable[waveId].mWaveInfo = param_3;
|
mWaveTable[param_2].field_0x4 = param_3;
|
||||||
mWaveTable[waveId].mWaveInfo.mpLoaded = &mNoLoad;
|
mWaveTable[param_2].field_0x4.field_0x20 = &mNoLoad;
|
||||||
mWaveTable[waveId].mWaveInfo.mOffsetStart = -1;
|
mWaveTable[param_2].field_0x4.mOffsetStart = -1;
|
||||||
wgrp->mCtrlWaveArray[index].waveId = waveId;
|
wgrp->mCtrlWaveArray[index].field_0x0 = param_2;
|
||||||
wgrp->mCtrlWaveArray[index].mOffsetStart = param_3.mOffsetStart;
|
wgrp->mCtrlWaveArray[index].field_0x4 = param_3.mOffsetStart;
|
||||||
}
|
}
|
||||||
|
|
||||||
JASBasicWaveBank::TWaveGroup::TWaveGroup() {
|
JASBasicWaveBank::TWaveGroup::TWaveGroup() {
|
||||||
@@ -122,7 +122,7 @@ void JASBasicWaveBank::TWaveGroup::onEraseDone() {
|
|||||||
u32 JASBasicWaveBank::TWaveGroup::getWaveID(int index) const {
|
u32 JASBasicWaveBank::TWaveGroup::getWaveID(int index) const {
|
||||||
JUT_ASSERT(298, index < mWaveCount);
|
JUT_ASSERT(298, index < mWaveCount);
|
||||||
JUT_ASSERT(299, index >= 0);
|
JUT_ASSERT(299, index >= 0);
|
||||||
return mCtrlWaveArray[index].waveId;
|
return mCtrlWaveArray[index].field_0x0;
|
||||||
}
|
}
|
||||||
|
|
||||||
intptr_t JASBasicWaveBank::TWaveHandle::getWavePtr() const {
|
intptr_t JASBasicWaveBank::TWaveHandle::getWavePtr() const {
|
||||||
@@ -131,5 +131,5 @@ intptr_t JASBasicWaveBank::TWaveHandle::getWavePtr() const {
|
|||||||
if (base == 0) {
|
if (base == 0) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
return (intptr_t)base + mWaveInfo.mOffsetStart;
|
return (intptr_t)base + field_0x4.mOffsetStart;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -26,9 +26,6 @@ JASChannel::JASChannel(Callback i_callback, void* i_callbackData) :
|
|||||||
mCallback(i_callback),
|
mCallback(i_callback),
|
||||||
mCallbackData(i_callbackData),
|
mCallbackData(i_callbackData),
|
||||||
mUpdateTimer(0),
|
mUpdateTimer(0),
|
||||||
#if TARGET_PC
|
|
||||||
mAramBaseAddress(nullptr),
|
|
||||||
#endif
|
|
||||||
mBankDisposeID(NULL),
|
mBankDisposeID(NULL),
|
||||||
mKey(0),
|
mKey(0),
|
||||||
mVelocity(0x7f),
|
mVelocity(0x7f),
|
||||||
@@ -37,7 +34,7 @@ JASChannel::JASChannel(Callback i_callback, void* i_callbackData) :
|
|||||||
mKeySweepCount(0),
|
mKeySweepCount(0),
|
||||||
mSkipSamples(0)
|
mSkipSamples(0)
|
||||||
{
|
{
|
||||||
mAnon.mChannelType = 0;
|
field_0xdc.mChannelType = 0;
|
||||||
field_0x104 = 0;
|
field_0x104 = 0;
|
||||||
mMixConfig[0].whole = 0x150;
|
mMixConfig[0].whole = 0x150;
|
||||||
mMixConfig[1].whole = 0x210;
|
mMixConfig[1].whole = 0x210;
|
||||||
@@ -240,7 +237,7 @@ s32 JASChannel::initialUpdateDSPChannel(JASDsp::TChannel* i_channel) {
|
|||||||
mCallback(CB_START, this, i_channel, mCallbackData);
|
mCallback(CB_START, this, i_channel, mCallbackData);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mAnon.mWaveInfo.mpLoaded[0] == 0) {
|
if (field_0xdc.mWaveInfo.field_0x20[0] == 0) {
|
||||||
JUT_WARN_DEVICE(346, 2, "%s", "Lost wave data while playing");
|
JUT_WARN_DEVICE(346, 2, "%s", "Lost wave data while playing");
|
||||||
mDspCh->free();
|
mDspCh->free();
|
||||||
mDspCh = NULL;
|
mDspCh = NULL;
|
||||||
@@ -256,12 +253,9 @@ s32 JASChannel::initialUpdateDSPChannel(JASDsp::TChannel* i_channel) {
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (mAnon.mChannelType) {
|
switch (field_0xdc.mChannelType) {
|
||||||
case 0:
|
case 0:
|
||||||
i_channel->setWaveInfo(mAnon.mWaveInfo, mWaveAramAddress, mSkipSamples);
|
i_channel->setWaveInfo(field_0xdc.mWaveInfo, mWaveAramAddress, mSkipSamples);
|
||||||
#if TARGET_PC
|
|
||||||
i_channel->mAramBaseAddress = mAramBaseAddress;
|
|
||||||
#endif
|
|
||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
i_channel->setOscInfo(mOscillatorSomething);
|
i_channel->setOscInfo(mOscillatorSomething);
|
||||||
@@ -321,7 +315,7 @@ s32 JASChannel::updateDSPChannel(JASDsp::TChannel* i_channel) {
|
|||||||
mCallback(CB_PLAY, this, i_channel, mCallbackData);
|
mCallback(CB_PLAY, this, i_channel, mCallbackData);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mAnon.mWaveInfo.mpLoaded[0] == 0) {
|
if (field_0xdc.mWaveInfo.field_0x20[0] == 0) {
|
||||||
JUT_WARN_DEVICE(456, 2, "%s","Lost wave data while playing");
|
JUT_WARN_DEVICE(456, 2, "%s","Lost wave data while playing");
|
||||||
mDspCh->free();
|
mDspCh->free();
|
||||||
mDspCh = NULL;
|
mDspCh = NULL;
|
||||||
|
|||||||
@@ -523,12 +523,9 @@ void JASDsp::TChannel::init() {
|
|||||||
void JASDsp::TChannel::playStart() {
|
void JASDsp::TChannel::playStart() {
|
||||||
JUT_ASSERT(508, dspMutex);
|
JUT_ASSERT(508, dspMutex);
|
||||||
field_0x10c = 0;
|
field_0x10c = 0;
|
||||||
#if !TARGET_PC
|
|
||||||
field_0x060 = 0;
|
field_0x060 = 0;
|
||||||
#endif
|
|
||||||
mResetFlag = 1;
|
mResetFlag = 1;
|
||||||
field_0x066 = 0;
|
field_0x066 = 0;
|
||||||
#if !TARGET_PC
|
|
||||||
int i;
|
int i;
|
||||||
for (i = 0; i < 4; i++) {
|
for (i = 0; i < 4; i++) {
|
||||||
field_0x078[i] = 0;
|
field_0x078[i] = 0;
|
||||||
@@ -537,7 +534,6 @@ void JASDsp::TChannel::playStart() {
|
|||||||
for (i = 0; i < 20; i++) {
|
for (i = 0; i < 20; i++) {
|
||||||
field_0x080[i] = 0;
|
field_0x080[i] = 0;
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
mIsActive = 1;
|
mIsActive = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -605,11 +601,9 @@ void JASDsp::TChannel::setWaveInfo(JASWaveInfo const& waveInfo, u32 aramAddress,
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#if !TARGET_PC
|
|
||||||
for (i = 0; i < 16; i++) {
|
for (i = 0; i < 16; i++) {
|
||||||
field_0x0b0[i] = 0;
|
field_0x0b0[i] = 0;
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -26,8 +26,8 @@ void JASDrumSet::newPercArray(u8 num, JKRHeap* heap) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool JASDrumSet::getParam(int key, int velocity, JASInstParam* o_param) const {
|
bool JASDrumSet::getParam(int key, int param_1, JASInstParam* param_2) const {
|
||||||
UNUSED(velocity);
|
UNUSED(param_1);
|
||||||
JUT_ASSERT(48, key >= 0);
|
JUT_ASSERT(48, key >= 0);
|
||||||
if (mPercArray == NULL) {
|
if (mPercArray == NULL) {
|
||||||
return false;
|
return false;
|
||||||
@@ -43,12 +43,12 @@ bool JASDrumSet::getParam(int key, int velocity, JASInstParam* o_param) const {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
o_param->mChannelType = 0;
|
param_2->field_0x1c = 0;
|
||||||
o_param->mDontSetKey = 1;
|
param_2->field_0x1e = 1;
|
||||||
o_param->mVolume = perc->mVolume;
|
param_2->mVolume = perc->mVolume;
|
||||||
o_param->mPitch = perc->mPitch;
|
param_2->mPitch = perc->mPitch;
|
||||||
o_param->mPan = perc->mPan;
|
param_2->mPan = perc->mPan;
|
||||||
o_param->mDirectRelease = u16(perc->mDirectRelease);
|
param_2->field_0x18 = u16(perc->field_0xc);
|
||||||
|
|
||||||
static JASOscillator::Data osc;
|
static JASOscillator::Data osc;
|
||||||
|
|
||||||
@@ -61,11 +61,11 @@ bool JASDrumSet::getParam(int key, int velocity, JASInstParam* o_param) const {
|
|||||||
|
|
||||||
static JASOscillator::Data* oscp = &osc;
|
static JASOscillator::Data* oscp = &osc;
|
||||||
|
|
||||||
o_param->mOscillators = &oscp;
|
param_2->field_0x14 = &oscp;
|
||||||
o_param->mOscillatorCount = 1;
|
param_2->field_0x1d = 1;
|
||||||
o_param->mVolume *= perc->mVolumeMult;
|
param_2->mVolume *= perc->field_0x10;
|
||||||
o_param->mPitch *= perc->mPitchMult;
|
param_2->mPitch *= perc->field_0x14;
|
||||||
o_param->mWaveId = u16(perc->mWaveId);
|
param_2->field_0x1a = u16(perc->field_0xe);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -107,12 +107,12 @@ JASDrumSet::TPerc::TPerc() {
|
|||||||
mVolume = 1.0f;
|
mVolume = 1.0f;
|
||||||
mPitch = 1.0f;
|
mPitch = 1.0f;
|
||||||
mPan = 0.5f;
|
mPan = 0.5f;
|
||||||
mDirectRelease = 1000;
|
field_0xc = 1000;
|
||||||
}
|
}
|
||||||
|
|
||||||
void JASDrumSet::TPerc::setRelease(u32 release) {
|
void JASDrumSet::TPerc::setRelease(u32 release) {
|
||||||
JUT_ASSERT(224, release < 0x10000);
|
JUT_ASSERT(224, release < 0x10000);
|
||||||
mDirectRelease = release;
|
field_0xc = release;
|
||||||
}
|
}
|
||||||
|
|
||||||
u32 JASDrumSet::getType() const { return 'PERC'; }
|
u32 JASDrumSet::getType() const { return 'PERC'; }
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
#include "JSystem/JAudio2/JASSimpleWaveBank.h"
|
#include "JSystem/JAudio2/JASSimpleWaveBank.h"
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
|
||||||
JASSimpleWaveBank::JASSimpleWaveBank(IF_DUSK(u32 bankId)) IF_DUSK(: JASWaveBank(bankId)) {
|
JASSimpleWaveBank::JASSimpleWaveBank() {
|
||||||
mWaveTable = NULL;
|
mWaveTable = NULL;
|
||||||
mWaveTableSize = 0;
|
mWaveTableSize = 0;
|
||||||
}
|
}
|
||||||
@@ -28,7 +28,7 @@ JASWaveHandle* JASSimpleWaveBank::getWaveHandle(u32 no) const {
|
|||||||
|
|
||||||
void JASSimpleWaveBank::setWaveInfo(u32 no, JASWaveInfo const& waveInfo) {
|
void JASSimpleWaveBank::setWaveInfo(u32 no, JASWaveInfo const& waveInfo) {
|
||||||
mWaveTable[no].mWaveInfo = waveInfo;
|
mWaveTable[no].mWaveInfo = waveInfo;
|
||||||
mWaveTable[no].mWaveInfo.mpLoaded = &mCurrentlyLoaded;
|
mWaveTable[no].mWaveInfo.field_0x20 = &_48;
|
||||||
mWaveTable[no].mHeap = &mHeap;
|
mWaveTable[no].mHeap = &mHeap;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -288,13 +288,13 @@ void JASTrack::setLatestKey(u8 param_0) {
|
|||||||
field_0x22b += getTransposeTotal();
|
field_0x22b += getTransposeTotal();
|
||||||
}
|
}
|
||||||
|
|
||||||
JASChannel* JASTrack::channelStart(JASTrack::TChannelMgr* i_channelMgr, u32 key, u32 velocity,
|
JASChannel* JASTrack::channelStart(JASTrack::TChannelMgr* i_channelMgr, u32 param_1, u32 param_2,
|
||||||
u32 i_updateTimer) {
|
u32 i_updateTimer) {
|
||||||
JASBank* bank = NULL;
|
JASBank* bank = NULL;
|
||||||
if (mBankTable != NULL) {
|
if (mBankTable != NULL) {
|
||||||
bank = mBankTable->getBank(mBankNumber);
|
bank = mBankTable->getBank(mBankNumber);
|
||||||
}
|
}
|
||||||
JASChannel* channel = JASBank::noteOn(bank, mProgNumber, key, velocity,
|
JASChannel* channel = JASBank::noteOn(bank, mProgNumber, param_1, param_2,
|
||||||
mNoteOnPrio | mReleasePrio << 8,
|
mNoteOnPrio | mReleasePrio << 8,
|
||||||
channelUpdateCallback, i_channelMgr);
|
channelUpdateCallback, i_channelMgr);
|
||||||
if (channel == NULL) {
|
if (channel == NULL) {
|
||||||
@@ -315,17 +315,17 @@ JASChannel* JASTrack::channelStart(JASTrack::TChannelMgr* i_channelMgr, u32 key,
|
|||||||
return channel;
|
return channel;
|
||||||
}
|
}
|
||||||
|
|
||||||
int JASTrack::noteOn(u32 noteid, u32 key, u32 velocity) {
|
int JASTrack::noteOn(u32 noteid, u32 param_1, u32 param_2) {
|
||||||
JUT_ASSERT(486, noteid != 0 && noteid < TChannelMgr::CHANNEL_MAX);
|
JUT_ASSERT(486, noteid != 0 && noteid < TChannelMgr::CHANNEL_MAX);
|
||||||
if (isMute()) {
|
if (isMute()) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
int ret = 1;
|
int ret = 1;
|
||||||
key += getTransposeTotal();
|
param_1 += getTransposeTotal();
|
||||||
for (u32 i = 0; i < mChannelMgrCount; i++) {
|
for (u32 i = 0; i < mChannelMgrCount; i++) {
|
||||||
if (mChannelMgrs[i] != NULL) {
|
if (mChannelMgrs[i] != NULL) {
|
||||||
mChannelMgrs[i]->noteOff(noteid, 0);
|
mChannelMgrs[i]->noteOff(noteid, 0);
|
||||||
JASChannel* channel = channelStart(mChannelMgrs[i], key, velocity, 0);
|
JASChannel* channel = channelStart(mChannelMgrs[i], param_1, param_2, 0);
|
||||||
if (channel == NULL) {
|
if (channel == NULL) {
|
||||||
ret = 0;
|
ret = 0;
|
||||||
}
|
}
|
||||||
@@ -356,7 +356,7 @@ int JASTrack::gateOn(u32 param_0, u32 i_velocity, f32 i_time, u32 i_flags) {
|
|||||||
} else {
|
} else {
|
||||||
JASChannel* channel = channel_mgr->mChannels[0];
|
JASChannel* channel = channel_mgr->mChannels[0];
|
||||||
if (channel != NULL) {
|
if (channel != NULL) {
|
||||||
channel->setKey(uvar7 - channel->mAnon.mWaveInfo.mBaseKey);
|
channel->setKey(uvar7 - channel->field_0xdc.mWaveInfo.mBaseKey);
|
||||||
channel->setVelocity(i_velocity);
|
channel->setVelocity(i_velocity);
|
||||||
channel->setUpdateTimer(update_timer);
|
channel->setUpdateTimer(update_timer);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -15,9 +15,9 @@ bool JASVoiceBank::getInstParam(int param_0, int param_1, int param_2,
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
sOscTable = (JASOscillator::Data*)&sOscData;
|
sOscTable = (JASOscillator::Data*)&sOscData;
|
||||||
param_3->mWaveId = param_0;
|
param_3->field_0x1a = param_0;
|
||||||
param_3->mOscillatorCount = 1;
|
param_3->field_0x1d = 1;
|
||||||
param_3->mOscillators = &sOscTable;
|
param_3->field_0x14 = &sOscTable;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -30,7 +30,7 @@ JASBasicWaveBank* JASWSParser::createBasicWaveBank(void const* stream, JKRHeap*
|
|||||||
u32 free_size = heap->getFreeSize();
|
u32 free_size = heap->getFreeSize();
|
||||||
|
|
||||||
THeader* header = (THeader*)stream;
|
THeader* header = (THeader*)stream;
|
||||||
JASBasicWaveBank* wave_bank = JKR_NEW_ARGS (heap, 0) JASBasicWaveBank IF_DUSK((header->mId));
|
JASBasicWaveBank* wave_bank = JKR_NEW_ARGS (heap, 0) JASBasicWaveBank;
|
||||||
if (wave_bank == NULL) {
|
if (wave_bank == NULL) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
@@ -60,7 +60,7 @@ JASBasicWaveBank* JASWSParser::createBasicWaveBank(void const* stream, JKRHeap*
|
|||||||
wave_info.mpLast = wave->mpLast;
|
wave_info.mpLast = wave->mpLast;
|
||||||
wave_info.mpPenult = wave->mpPenult;
|
wave_info.mpPenult = wave->mpPenult;
|
||||||
TCtrlWave* ctrl_wave = ctrl->mCtrlWaveOffsets[j].ptr(header);
|
TCtrlWave* ctrl_wave = ctrl->mCtrlWaveOffsets[j].ptr(header);
|
||||||
u16 local_74 = JSULoHalf(ctrl_wave->mWaveAndGroupId);
|
u16 local_74 = JSULoHalf(ctrl_wave->_00);
|
||||||
wave_bank->setWaveInfo(wave_group, j, local_74, wave_info);
|
wave_bank->setWaveInfo(wave_group, j, local_74, wave_info);
|
||||||
}
|
}
|
||||||
wave_group->setFileName(archive->mFileName);
|
wave_group->setFileName(archive->mFileName);
|
||||||
@@ -82,7 +82,7 @@ JASSimpleWaveBank* JASWSParser::createSimpleWaveBank(void const* stream, JKRHeap
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
JASSimpleWaveBank* wave_bank = JKR_NEW_ARGS (heap, 0) JASSimpleWaveBank IF_DUSK((header->mId));
|
JASSimpleWaveBank* wave_bank = JKR_NEW_ARGS (heap, 0) JASSimpleWaveBank;
|
||||||
if (wave_bank == NULL) {
|
if (wave_bank == NULL) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
@@ -94,7 +94,7 @@ JASSimpleWaveBank* JASWSParser::createSimpleWaveBank(void const* stream, JKRHeap
|
|||||||
TWaveArchive* archive = archiveBank->mArchiveOffsets[0].ptr(header);
|
TWaveArchive* archive = archiveBank->mArchiveOffsets[0].ptr(header);
|
||||||
for (int i = 0; i < ctrl->mWaveCount; i++) {
|
for (int i = 0; i < ctrl->mWaveCount; i++) {
|
||||||
TCtrlWave* ctrlWave = ctrl->mCtrlWaveOffsets[i].ptr(header);
|
TCtrlWave* ctrlWave = ctrl->mCtrlWaveOffsets[i].ptr(header);
|
||||||
u32 tmp = JSULoHalf(ctrlWave->mWaveAndGroupId);
|
u32 tmp = JSULoHalf(ctrlWave->_00);
|
||||||
if (max < tmp) {
|
if (max < tmp) {
|
||||||
max = tmp;
|
max = tmp;
|
||||||
}
|
}
|
||||||
@@ -116,8 +116,8 @@ JASSimpleWaveBank* JASWSParser::createSimpleWaveBank(void const* stream, JKRHeap
|
|||||||
wave_info.mpLast = wave->mpLast;
|
wave_info.mpLast = wave->mpLast;
|
||||||
wave_info.mpPenult = wave->mpPenult;
|
wave_info.mpPenult = wave->mpPenult;
|
||||||
TCtrlWave* ctrl_wave = ctrl->mCtrlWaveOffsets[i].ptr(header);
|
TCtrlWave* ctrl_wave = ctrl->mCtrlWaveOffsets[i].ptr(header);
|
||||||
u32 waveId = JSULoHalf(ctrl_wave->mWaveAndGroupId);
|
u32 tmp = JSULoHalf(ctrl_wave->_00);
|
||||||
wave_bank->setWaveInfo(waveId, wave_info);
|
wave_bank->setWaveInfo(tmp, wave_info);
|
||||||
}
|
}
|
||||||
wave_bank->setFileName(archive->mFileName);
|
wave_bank->setFileName(archive->mFileName);
|
||||||
|
|
||||||
|
|||||||
@@ -38,7 +38,7 @@ char* JASWaveArcLoader::getCurrentDir() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
JASWaveArc::JASWaveArc() : mHeap(this) {
|
JASWaveArc::JASWaveArc() : mHeap(this) {
|
||||||
mCurrentlyLoaded = 0;
|
_48 = 0;
|
||||||
mStatus = 0;
|
mStatus = 0;
|
||||||
mEntryNum = -1;
|
mEntryNum = -1;
|
||||||
mFileLength = 0;
|
mFileLength = 0;
|
||||||
@@ -57,7 +57,7 @@ bool JASWaveArc::loadSetup(u32 param_0) {
|
|||||||
if (mStatus != 1) {
|
if (mStatus != 1) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
mCurrentlyLoaded = 1;
|
_48 = 1;
|
||||||
mStatus = 2;
|
mStatus = 2;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -71,7 +71,7 @@ bool JASWaveArc::eraseSetup() {
|
|||||||
mStatus = 0;
|
mStatus = 0;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
mCurrentlyLoaded = 0;
|
_48 = 0;
|
||||||
mStatus = 0;
|
mStatus = 0;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -91,7 +91,7 @@ void JASWaveArc::loadToAramCallback(void* this_) {
|
|||||||
|
|
||||||
bool JASWaveArc::sendLoadCmd() {
|
bool JASWaveArc::sendLoadCmd() {
|
||||||
JASMutexLock mutexLock(&mMutex);
|
JASMutexLock mutexLock(&mMutex);
|
||||||
mCurrentlyLoaded = 0;
|
_48 = 0;
|
||||||
mStatus = 1;
|
mStatus = 1;
|
||||||
loadToAramCallbackParams commandInfo;
|
loadToAramCallbackParams commandInfo;
|
||||||
commandInfo.mWavArc = this;
|
commandInfo.mWavArc = this;
|
||||||
|
|||||||
@@ -7,6 +7,11 @@
|
|||||||
|
|
||||||
#include "JSystem/JMessage/control.h"
|
#include "JSystem/JMessage/control.h"
|
||||||
|
|
||||||
|
#if TARGET_PC
|
||||||
|
#include "dusk/randomizer/game/custom_flow_ids.hpp"
|
||||||
|
#include "dusk/randomizer/game/messages.hpp"
|
||||||
|
#endif
|
||||||
|
|
||||||
JMessage::TControl::TControl()
|
JMessage::TControl::TControl()
|
||||||
: pSequenceProcessor_(NULL),
|
: pSequenceProcessor_(NULL),
|
||||||
pRenderingProcessor_(NULL),
|
pRenderingProcessor_(NULL),
|
||||||
@@ -71,6 +76,12 @@ int JMessage::TControl::setMessageID(u32 uMsgID, u32 param_1, bool* pbValid) {
|
|||||||
|
|
||||||
u32 uCode = pProcessor->toMessageCode_messageID(uMsgID, param_1, pbValid);
|
u32 uCode = pProcessor->toMessageCode_messageID(uMsgID, param_1, pbValid);
|
||||||
if (uCode == 0xFFFFFFFF) {
|
if (uCode == 0xFFFFFFFF) {
|
||||||
|
#if TARGET_PC
|
||||||
|
// If this is a custom text id
|
||||||
|
if (uMsgID >= BASE_CUSTOM_MSG_AND_FLOW_ID)
|
||||||
|
uCode = CUSTOM_BMG_GROUP << 16 | uMsgID;
|
||||||
|
else // return 0
|
||||||
|
#endif
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -80,6 +91,16 @@ int JMessage::TControl::setMessageID(u32 uMsgID, u32 param_1, bool* pbValid) {
|
|||||||
bool JMessage::TControl::setMessageCode_inSequence_(JMessage::TProcessor const* pProcessor, u16 u16GroupID, u16 u16Index) {
|
bool JMessage::TControl::setMessageCode_inSequence_(JMessage::TProcessor const* pProcessor, u16 u16GroupID, u16 u16Index) {
|
||||||
pEntry_ = pProcessor->getMessageEntry_messageCode(u16GroupID, u16Index);
|
pEntry_ = pProcessor->getMessageEntry_messageCode(u16GroupID, u16Index);
|
||||||
if (pEntry_ == NULL) {
|
if (pEntry_ == NULL) {
|
||||||
|
#if TARGET_PC
|
||||||
|
if (HandleCustomText(this, u16Index)) {
|
||||||
|
uMessageGroupID_ = u16GroupID;
|
||||||
|
uMessageID_ = u16Index;
|
||||||
|
pResourceCache_ = pProcessor->getResourceCache();
|
||||||
|
pMessageText_current_ = pMessageText_begin_;
|
||||||
|
oStack_renderingProcessor_.clear();
|
||||||
|
return true;
|
||||||
|
} else
|
||||||
|
#endif
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -90,6 +111,10 @@ bool JMessage::TControl::setMessageCode_inSequence_(JMessage::TProcessor const*
|
|||||||
JUT_ASSERT(155, pResourceCache_!=NULL);
|
JUT_ASSERT(155, pResourceCache_!=NULL);
|
||||||
|
|
||||||
pMessageText_begin_ = pResourceCache_->getMessageText_messageEntry(pEntry_);
|
pMessageText_begin_ = pResourceCache_->getMessageText_messageEntry(pEntry_);
|
||||||
|
#if TARGET_PC
|
||||||
|
// Feels kinda hacky to have to hijack this deep into JSystem, but works for now
|
||||||
|
HandleTextOverrides(this, pProcessor, uMessageGroupID_, uMessageID_);
|
||||||
|
#endif
|
||||||
pMessageText_current_ = pMessageText_begin_;
|
pMessageText_current_ = pMessageText_begin_;
|
||||||
oStack_renderingProcessor_.clear();
|
oStack_renderingProcessor_.clear();
|
||||||
return true;
|
return true;
|
||||||
|
|||||||
@@ -1,19 +0,0 @@
|
|||||||
cmake_minimum_required(VERSION 3.25)
|
|
||||||
project(audio_mod CXX)
|
|
||||||
|
|
||||||
if (CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR)
|
|
||||||
set(DUSK_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../.." CACHE PATH "Path to dusk source root")
|
|
||||||
option(DUSK_MOD_USE_FULL_TREE "Use full build instead of the minimal mod SDK" OFF)
|
|
||||||
set(CMAKE_POSITION_INDEPENDENT_CODE ON)
|
|
||||||
if (DUSK_MOD_USE_FULL_TREE)
|
|
||||||
add_subdirectory("${DUSK_DIR}" dusk EXCLUDE_FROM_ALL)
|
|
||||||
else ()
|
|
||||||
add_subdirectory("${DUSK_DIR}/sdk" dusk-sdk EXCLUDE_FROM_ALL)
|
|
||||||
endif ()
|
|
||||||
endif ()
|
|
||||||
|
|
||||||
add_mod(audio_mod
|
|
||||||
SOURCES src/mod.cpp
|
|
||||||
MOD_JSON mod.json
|
|
||||||
RES_DIR res
|
|
||||||
)
|
|
||||||
@@ -1,7 +0,0 @@
|
|||||||
{
|
|
||||||
"id": "dev.twilitrealm.audio_mod",
|
|
||||||
"name": "[DEMO] Audio Mod",
|
|
||||||
"version": "1.0.0",
|
|
||||||
"author": "You, the listener",
|
|
||||||
"description": "An example Dusklight mod"
|
|
||||||
}
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
go.opus and go.wav are licensed CC0, from https://kenney.nl/assets/voiceover-pack
|
|
||||||
Binary file not shown.
Binary file not shown.
@@ -1,39 +0,0 @@
|
|||||||
#include "mods/service.hpp"
|
|
||||||
#include "mods/svc/audio_res.h"
|
|
||||||
#include "mods/svc/log.h"
|
|
||||||
|
|
||||||
DEFINE_MOD();
|
|
||||||
IMPORT_SERVICE(LogService, svc_log);
|
|
||||||
IMPORT_SERVICE(AudioResService, svc_audio_res);
|
|
||||||
|
|
||||||
extern "C" {
|
|
||||||
|
|
||||||
MOD_EXPORT ModResult mod_initialize(ModError*) {
|
|
||||||
svc_log->info(mod_ctx, "template_mod initialized");
|
|
||||||
AudioWaveHandle handle;
|
|
||||||
svc_audio_res->replace_wave(
|
|
||||||
mod_ctx,
|
|
||||||
SoundEffects,
|
|
||||||
4238,
|
|
||||||
"res/go.opus",
|
|
||||||
nullptr,
|
|
||||||
&handle);
|
|
||||||
svc_audio_res->replace_wave(
|
|
||||||
mod_ctx,
|
|
||||||
SoundEffects,
|
|
||||||
4237,
|
|
||||||
"res/go.opus",
|
|
||||||
nullptr,
|
|
||||||
&handle);
|
|
||||||
return MOD_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
MOD_EXPORT ModResult mod_update(ModError*) {
|
|
||||||
return MOD_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
MOD_EXPORT ModResult mod_shutdown(ModError*) {
|
|
||||||
svc_log->info(mod_ctx, "template_mod unloaded");
|
|
||||||
return MOD_OK;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -105,6 +105,18 @@ window content pane > * {
|
|||||||
flex: 0 0 auto;
|
flex: 0 0 auto;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pane.excluded-locations-pane {
|
||||||
|
display: flex;
|
||||||
|
flex-flow: column;
|
||||||
|
flex: 1 1 0;
|
||||||
|
min-width: 0;
|
||||||
|
min-height: 0;
|
||||||
|
gap: 8dp;
|
||||||
|
overflow-y: scroll;
|
||||||
|
font-size: 20dp;
|
||||||
|
border-top: 1dp #92875B;
|
||||||
|
}
|
||||||
|
|
||||||
window content pane:last-of-type > div {
|
window content pane:last-of-type > div {
|
||||||
line-height: 1.625;
|
line-height: 1.625;
|
||||||
}
|
}
|
||||||
@@ -478,6 +490,7 @@ window.modal.danger .modal-header icon {
|
|||||||
font-size: 20dp;
|
font-size: 20dp;
|
||||||
color: #FFFFFF;
|
color: #FFFFFF;
|
||||||
font-weight: normal;
|
font-weight: normal;
|
||||||
|
word-break: break-word;
|
||||||
}
|
}
|
||||||
|
|
||||||
.modal-body span.tip {
|
.modal-body span.tip {
|
||||||
@@ -519,3 +532,15 @@ progress.verification-progress-bar {
|
|||||||
flex: 0 0 auto;
|
flex: 0 0 auto;
|
||||||
padding-top: 4dp;
|
padding-top: 4dp;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.current-option-text {
|
||||||
|
padding-left: 5dp;
|
||||||
|
border: 2dp #C2A42D;
|
||||||
|
border-radius: 14dp;
|
||||||
|
}
|
||||||
|
|
||||||
|
.not-current-option-text {
|
||||||
|
padding-left: 5dp;
|
||||||
|
margin: 2dp; /*Used to mimic border*/
|
||||||
|
opacity: 0.5;
|
||||||
|
}
|
||||||
@@ -1,67 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
|
|
||||||
#include <mods/api.h>
|
|
||||||
|
|
||||||
#define AUDIO_RES_SERVICE_ID "dev.twilitrealm.dusklight.audio_res"
|
|
||||||
#define AUDIO_RES_SERVICE_MAJOR 1u
|
|
||||||
#define AUDIO_RES_SERVICE_MINOR 0u
|
|
||||||
|
|
||||||
#define AUDIO_RES_DEFAULT_KEY 0x3C;
|
|
||||||
|
|
||||||
typedef enum AudioWaveBank : uint8_t {
|
|
||||||
SoundEffects = 0,
|
|
||||||
MusicSamples = 1,
|
|
||||||
} AudioWaveBank;
|
|
||||||
|
|
||||||
typedef enum AudioWaveFormat : uint8_t {
|
|
||||||
Adpcm4 = 0,
|
|
||||||
Adpcm2 = 1,
|
|
||||||
Pcm8 = 2,
|
|
||||||
Pcm16 = 3,
|
|
||||||
} AudioWaveFormat;
|
|
||||||
|
|
||||||
typedef uint64_t AudioWaveHandle;
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
typedef struct AudioRawWave {
|
|
||||||
AudioWaveFormat format;
|
|
||||||
float sample_rate;
|
|
||||||
int16_t sample_value_last;
|
|
||||||
int16_t sample_value_penult;
|
|
||||||
} AudioRawWave;
|
|
||||||
|
|
||||||
typedef struct AudioWaveInfo {
|
|
||||||
uint8_t base_key;
|
|
||||||
bool loop;
|
|
||||||
uint32_t loop_start_sample;
|
|
||||||
uint32_t loop_end_sample;
|
|
||||||
|
|
||||||
AudioRawWave const* raw_wave;
|
|
||||||
} AudioWaveInfo;
|
|
||||||
|
|
||||||
typedef struct AudioResService {
|
|
||||||
ServiceHeader header;
|
|
||||||
|
|
||||||
ModResult (*replace_wave)(
|
|
||||||
ModContext* ctx,
|
|
||||||
AudioWaveBank bank,
|
|
||||||
uint16_t wave_id,
|
|
||||||
char const* file_name,
|
|
||||||
AudioWaveInfo const* wave_info,
|
|
||||||
AudioWaveHandle* out_handle);
|
|
||||||
|
|
||||||
ModResult (*remove_wave)(ModContext* ctx, AudioWaveHandle handle);
|
|
||||||
} AudioResService;
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
#include "mods/service.hpp"
|
|
||||||
|
|
||||||
template <>
|
|
||||||
struct mods::ServiceTraits<AudioResService> {
|
|
||||||
static constexpr const char* id = AUDIO_RES_SERVICE_ID;
|
|
||||||
static constexpr uint16_t major_version = AUDIO_RES_SERVICE_MAJOR;
|
|
||||||
static constexpr uint16_t minor_version = AUDIO_RES_SERVICE_MINOR;
|
|
||||||
};
|
|
||||||
#endif
|
|
||||||
+134
-134
@@ -36,14 +36,14 @@ Z2Audible::Z2Audible(const JGeometry::TVec3<f32>& pos, const JGeometry::TVec3<f3
|
|||||||
mParam.field_0x0.raw = 0xFFFFFFFF;
|
mParam.field_0x0.raw = 0xFFFFFFFF;
|
||||||
mAbsPos.init(&mPos, pos, param_1);
|
mAbsPos.init(&mPos, pos, param_1);
|
||||||
|
|
||||||
for (int i = 0; i < Z2_AUDIO_PLAYERS; i++) {
|
for (int i = 0; i < 1; i++) {
|
||||||
if ((channel & (1 << i)) == 0) {
|
if ((channel & (1 << i)) == 0) {
|
||||||
mChannel[i].init();
|
mChannel[i].init();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int i = 0; i < Z2_AUDIO_PLAYERS; i = i + 1) {
|
for (int i = 0; i < 1; i = i + 1) {
|
||||||
mMicDistances[i] = 0.0f;
|
field_0x64[i] = 0.0f;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -57,18 +57,18 @@ void Z2Audible::calc() {
|
|||||||
|
|
||||||
JASSoundParams* Z2Audible::getOuterParams(int index) {
|
JASSoundParams* Z2Audible::getOuterParams(int index) {
|
||||||
JUT_ASSERT(80, index >= 0);
|
JUT_ASSERT(80, index >= 0);
|
||||||
JUT_ASSERT(81, index < 1); // Z2_AUDIO_PLAYERS
|
JUT_ASSERT(81, index < 1);
|
||||||
return &mChannel[index].mParams;
|
return &mChannel[index].mParams;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Z2Audible::setOuterParams(const JASSoundParams& outParams, const JASSoundParams& inParams,
|
void Z2Audible::setOuterParams(const JASSoundParams& outParams, const JASSoundParams& inParams,
|
||||||
int index) {
|
int index) {
|
||||||
JUT_ASSERT(89, index >= 0);
|
JUT_ASSERT(89, index >= 0);
|
||||||
JUT_ASSERT(90, index < 1); // Z2_AUDIO_PLAYERS
|
JUT_ASSERT(90, index < 1);
|
||||||
|
|
||||||
Z2AudibleChannel* channel = &mChannel[index];
|
Z2AudibleChannel* channel = &mChannel[index];
|
||||||
u8 volSomething = (mParam.field_0x0.half.f1 & SOUND_VOL_SOMETHING_MASK_SHIFTED) >> 8;
|
u8 iStack_94 = (mParam.field_0x0.half.f1 & 0xf00) >> 8;
|
||||||
if (volSomething == 0) {
|
if (iStack_94 == 0) {
|
||||||
channel->mParams.combine(outParams, inParams);
|
channel->mParams.combine(outParams, inParams);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -91,7 +91,7 @@ void Z2Audible::setOuterParams(const JASSoundParams& outParams, const JASSoundPa
|
|||||||
|
|
||||||
f32 dVar9 = inParams.mVolume * local_b8.length();
|
f32 dVar9 = inParams.mVolume * local_b8.length();
|
||||||
f32 dVar10 = 1.0f;
|
f32 dVar10 = 1.0f;
|
||||||
f32 dVar12 = Z2Calc::linearTransform(volSomething, 0.0f, 15.0f, 1.0f, 0.3f, true);
|
f32 dVar12 = Z2Calc::linearTransform(iStack_94, 0.0f, 15.0f, 1.0f, 0.3f, true);
|
||||||
if (inParams.mVolume > dVar12 && dVar9 > 0.001f) {
|
if (inParams.mVolume > dVar12 && dVar9 > 0.001f) {
|
||||||
dVar10 = Z2Calc::getParamByExp(dVar9, 0.3f, 0.001f, 0.1f, dVar12, 1.0f,
|
dVar10 = Z2Calc::getParamByExp(dVar9, 0.3f, 0.001f, 0.1f, dVar12, 1.0f,
|
||||||
Z2Calc::CURVE_POSITIVE);
|
Z2Calc::CURVE_POSITIVE);
|
||||||
@@ -141,18 +141,18 @@ void Z2Audible::setOuterParams(const JASSoundParams& outParams, const JASSoundPa
|
|||||||
|
|
||||||
Z2AudibleChannel* Z2Audible::getChannel(int index) {
|
Z2AudibleChannel* Z2Audible::getChannel(int index) {
|
||||||
JUT_ASSERT(220, index >= 0);
|
JUT_ASSERT(220, index >= 0);
|
||||||
JUT_ASSERT(221, index < 1); // Z2_AUDIO_PLAYERS
|
JUT_ASSERT(221, index < 1);
|
||||||
return &mChannel[index];
|
return &mChannel[index];
|
||||||
}
|
}
|
||||||
|
|
||||||
u32 Z2Audible::getDistVolBit() {
|
u32 Z2Audible::getDistVolBit() {
|
||||||
u16 uVar1 = getAudibleParam()->field_0x0.half.f1;
|
u16 uVar1 = getAudibleParam()->field_0x0.half.f1;
|
||||||
if (uVar1 != 0) {
|
if (uVar1 != 0) {
|
||||||
if ((uVar1 & SOUND_VOL_DIST_BIT_MASK_SHIFTED) != 0) {
|
if ((uVar1 & 7) != 0) {
|
||||||
return uVar1 & SOUND_VOL_DIST_BIT_MASK_SHIFTED;
|
return uVar1 & 7;
|
||||||
}
|
}
|
||||||
if ((uVar1 & SOUND_VOL_DIST_BIT_2_MASK_SHIFTED) != 0) {
|
if ((uVar1 & 0x70) != 0) {
|
||||||
return ((int)(uVar1 & SOUND_VOL_DIST_BIT_2_MASK_SHIFTED) >> 4) + 7;
|
return ((int)(uVar1 & 0x70) >> 4) + 7;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -166,15 +166,15 @@ Z2Audience3DSetting::Z2Audience3DSetting() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void Z2Audience3DSetting::init() {
|
void Z2Audience3DSetting::init() {
|
||||||
mMinDistanceVolume = Z2Param::MIN_DISTANCE_VOLUME;
|
field_0x40 = Z2Param::MIN_DISTANCE_VOLUME;
|
||||||
mDolbyBehindDistanceMax = Z2Param::DOLBY_BEHIND_DISTANCE_MAX;
|
field_0x48 = Z2Param::DOLBY_BEHIND_DISTANCE_MAX;
|
||||||
mDolbyFrontDistanceMax = Z2Param::DOLBY_FLONT_DISTANCE_MAX;
|
field_0x44 = Z2Param::DOLBY_FLONT_DISTANCE_MAX;
|
||||||
mMaxDistanceFxMix = Z2Param::DISTANCE_FX_PARAM;
|
field_0x54 = Z2Param::DISTANCE_FX_PARAM;
|
||||||
mMinDistanceFxMix = 0.0f;
|
field_0x50 = 0.0f;
|
||||||
mDolbyCenterValue = Z2Param::DOLBY_CENTER_VALUE;
|
field_0x4c = Z2Param::DOLBY_CENTER_VALUE;
|
||||||
mPanFactor = 0.5f;
|
field_0x58 = 0.5f;
|
||||||
mMaxDistancePriority = 0xff;
|
field_0x64 = 0xff;
|
||||||
mSonicSpeed = Z2Param::SONIC_SPEED;
|
field_0x5c = Z2Param::SONIC_SPEED;
|
||||||
field_0x60 = 1.5f;
|
field_0x60 = 1.5f;
|
||||||
|
|
||||||
initVolumeDist();
|
initVolumeDist();
|
||||||
@@ -184,8 +184,8 @@ void Z2Audience3DSetting::init() {
|
|||||||
void Z2Audience3DSetting::initVolumeDist() {
|
void Z2Audience3DSetting::initVolumeDist() {
|
||||||
if (mVolumeDistInit) return;
|
if (mVolumeDistInit) return;
|
||||||
|
|
||||||
mDistanceMaxes[0] = Z2Param::DISTANCE_MAX;
|
field_0x0[0] = Z2Param::DISTANCE_MAX;
|
||||||
mMaxVolumeDistance = Z2Param::MAX_VOLUME_DISTANCE;
|
field_0x3c = Z2Param::MAX_VOLUME_DISTANCE;
|
||||||
|
|
||||||
calcVolumeFactorAll();
|
calcVolumeFactorAll();
|
||||||
calcPriorityFactorAll();
|
calcPriorityFactorAll();
|
||||||
@@ -197,12 +197,12 @@ void Z2Audience3DSetting::initVolumeDist() {
|
|||||||
static f32 cNearFarRatio = Z2Param::MAX_VOLUME_DISTANCE / Z2Param::DISTANCE_MAX;
|
static f32 cNearFarRatio = Z2Param::MAX_VOLUME_DISTANCE / Z2Param::DISTANCE_MAX;
|
||||||
|
|
||||||
void Z2Audience3DSetting::updateVolumeDist(f32 param_0) {
|
void Z2Audience3DSetting::updateVolumeDist(f32 param_0) {
|
||||||
mDistanceMaxes[0] = param_0;
|
field_0x0[0] = param_0;
|
||||||
|
|
||||||
if (param_0 > Z2Param::DISTANCE_MAX) {
|
if (param_0 > Z2Param::DISTANCE_MAX) {
|
||||||
mMaxVolumeDistance = cNearFarRatio * param_0;
|
field_0x3c = cNearFarRatio * param_0;
|
||||||
} else {
|
} else {
|
||||||
mMaxVolumeDistance = Z2Param::MAX_VOLUME_DISTANCE;
|
field_0x3c = Z2Param::MAX_VOLUME_DISTANCE;
|
||||||
}
|
}
|
||||||
|
|
||||||
calcVolumeFactorAll();
|
calcVolumeFactorAll();
|
||||||
@@ -214,29 +214,29 @@ void Z2Audience3DSetting::updateVolumeDist(f32 param_0) {
|
|||||||
|
|
||||||
void Z2Audience3DSetting::initDolbyDist() {
|
void Z2Audience3DSetting::initDolbyDist() {
|
||||||
if (!mDolbyDistInit) {
|
if (!mDolbyDistInit) {
|
||||||
mDolbyFrontDistanceMax = Z2Param::DOLBY_FLONT_DISTANCE_MAX;
|
field_0x44 = Z2Param::DOLBY_FLONT_DISTANCE_MAX;
|
||||||
mDolbyBehindDistanceMax = Z2Param::DOLBY_BEHIND_DISTANCE_MAX;
|
field_0x48 = Z2Param::DOLBY_BEHIND_DISTANCE_MAX;
|
||||||
field_0x68 = -mDolbyCenterValue / mDolbyFrontDistanceMax;
|
field_0x68 = -field_0x4c / field_0x44;
|
||||||
field_0x6c = (1.0f - mDolbyCenterValue) / mDolbyBehindDistanceMax;
|
field_0x6c = (1.0f - field_0x4c) / field_0x48;
|
||||||
mDolbyDistInit = true;
|
mDolbyDistInit = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Z2Audience3DSetting::updateDolbyDist(f32 param_0, f32 param_1) {
|
void Z2Audience3DSetting::updateDolbyDist(f32 param_0, f32 param_1) {
|
||||||
if (param_0 > -1.0f * Z2Param::DOLBY_FLONT_DISTANCE_MAX) {
|
if (param_0 > -1.0f * Z2Param::DOLBY_FLONT_DISTANCE_MAX) {
|
||||||
mDolbyFrontDistanceMax = -1.0f * param_0;
|
field_0x44 = -1.0f * param_0;
|
||||||
} else {
|
} else {
|
||||||
mDolbyFrontDistanceMax = Z2Param::DOLBY_FLONT_DISTANCE_MAX;
|
field_0x44 = Z2Param::DOLBY_FLONT_DISTANCE_MAX;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (param_1 < 2.0f * mDolbyFrontDistanceMax) {
|
if (param_1 < 2.0f * field_0x44) {
|
||||||
param_1 = 2.0f * mDolbyFrontDistanceMax;
|
param_1 = 2.0f * field_0x44;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (param_1 > Z2Param::DOLBY_BEHIND_DISTANCE_MAX) {
|
if (param_1 > Z2Param::DOLBY_BEHIND_DISTANCE_MAX) {
|
||||||
mDolbyBehindDistanceMax = param_1;
|
field_0x48 = param_1;
|
||||||
} else {
|
} else {
|
||||||
mDolbyBehindDistanceMax = Z2Param::DOLBY_BEHIND_DISTANCE_MAX;
|
field_0x48 = Z2Param::DOLBY_BEHIND_DISTANCE_MAX;
|
||||||
}
|
}
|
||||||
|
|
||||||
mDolbyDistInit = false;
|
mDolbyDistInit = false;
|
||||||
@@ -254,28 +254,28 @@ Z2AudioCamera::Z2AudioCamera() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void Z2AudioCamera::init() {
|
void Z2AudioCamera::init() {
|
||||||
JGeometry::TPosition3f32 viewMatrix;
|
JGeometry::TPosition3f32 aTStack_38;
|
||||||
viewMatrix.identity();
|
aTStack_38.identity();
|
||||||
JGeometry::TVec3<f32> VStack_44;
|
JGeometry::TVec3<f32> VStack_44;
|
||||||
VStack_44.set(100000.0f, 100000.0f, 100000.0f);
|
VStack_44.set(100000.0f, 100000.0f, 100000.0f);
|
||||||
setCameraState(viewMatrix, *(Vec*)&VStack_44, true);
|
setCameraState(aTStack_38, *(Vec*)&VStack_44, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Z2AudioCamera::setCameraState(f32 const (*viewMatrix)[4], Vec& pos, bool initial) {
|
void Z2AudioCamera::setCameraState(f32 const (*param_0)[4], Vec& pos, bool param_2) {
|
||||||
mViewMatrix.set(viewMatrix);
|
field_0x0.set(param_0);
|
||||||
if (initial) {
|
if (param_2) {
|
||||||
mPos.set(pos);
|
mPos.set(pos);
|
||||||
mLastPos.set(mPos);
|
field_0x48.set(mPos);
|
||||||
mVel.zero();
|
mVel.zero();
|
||||||
} else {
|
} else {
|
||||||
mLastPos.set(mPos);
|
field_0x48.set(mPos);
|
||||||
mPos.set(pos);
|
mPos.set(pos);
|
||||||
mVel.sub(mPos, mLastPos);
|
mVel.sub(mPos, field_0x48);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Z2AudioCamera::setCameraState(f32 (*viewMatrix)[4], Vec& pos, Vec& param_2, f32 param_3,
|
void Z2AudioCamera::setCameraState(f32 (*param_0)[4], Vec& pos, Vec& param_2, f32 param_3,
|
||||||
f32 param_4, bool param_5, bool initial) {
|
f32 param_4, bool param_5, bool param_6) {
|
||||||
JGeometry::TVec3<f32> aTStack_c0;
|
JGeometry::TVec3<f32> aTStack_c0;
|
||||||
VECSubtract(¶m_2, &pos, (Vec*)&aTStack_c0);
|
VECSubtract(¶m_2, &pos, (Vec*)&aTStack_c0);
|
||||||
mCamDist = aTStack_c0.length();
|
mCamDist = aTStack_c0.length();
|
||||||
@@ -312,7 +312,7 @@ void Z2AudioCamera::setCameraState(f32 (*viewMatrix)[4], Vec& pos, Vec& param_2,
|
|||||||
Z2GetAudience()->getSetting()->updateDolbyDist(mCamDist, mCamDist);
|
Z2GetAudience()->getSetting()->updateDolbyDist(mCamDist, mCamDist);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
Vec aTStack_cc = {viewMatrix[0][0], viewMatrix[0][1], viewMatrix[0][2]};
|
Vec aTStack_cc = {param_0[0][0], param_0[0][1], param_0[0][2]};
|
||||||
Mtx rotMtx;
|
Mtx rotMtx;
|
||||||
MTXRotAxisRad(rotMtx, &aTStack_cc, (M_PI / 180.0f) * (-1.0f * dVar10));
|
MTXRotAxisRad(rotMtx, &aTStack_cc, (M_PI / 180.0f) * (-1.0f * dVar10));
|
||||||
JGeometry::TVec3<f32> aTStack_d8;
|
JGeometry::TVec3<f32> aTStack_d8;
|
||||||
@@ -324,7 +324,7 @@ void Z2AudioCamera::setCameraState(f32 (*viewMatrix)[4], Vec& pos, Vec& param_2,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
setCameraState(viewMatrix, pos, initial);
|
setCameraState(param_0, pos, param_6);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Z2AudioCamera::convertAbsToRel(Z2Audible* audible, int channelNum) {
|
void Z2AudioCamera::convertAbsToRel(Z2Audible* audible, int channelNum) {
|
||||||
@@ -337,17 +337,17 @@ void Z2AudioCamera::convertAbsToRel(Z2Audible* audible, int channelNum) {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
Z2AudibleRelPos* relPos = &channel->mRelPos;
|
Z2AudibleRelPos* relPos = &channel->field_0x14;
|
||||||
MTXMultVec(mViewMatrix, (Vec*)&audible->getPos(), (Vec*)&relPos->mCameraRelative);
|
MTXMultVec(field_0x0, (Vec*)&audible->getPos(), (Vec*)&relPos->field_0x00);
|
||||||
relPos->mTrueDistance = relPos->mCameraRelative.length();
|
relPos->field_0xC = relPos->field_0x00.length();
|
||||||
|
|
||||||
JGeometry::TVec3<f32> aTStack_38(relPos->mCameraRelative);
|
JGeometry::TVec3<f32> aTStack_38(relPos->field_0x00);
|
||||||
aTStack_38.z += mVolCenterZ;
|
aTStack_38.z += mVolCenterZ;
|
||||||
relPos->mCenterDistance = aTStack_38.length();
|
relPos->field_0x10 = aTStack_38.length();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Z2AudioCamera::convertAbsToRel(Vec& src, Vec* dst) const {
|
bool Z2AudioCamera::convertAbsToRel(Vec& src, Vec* dst) const {
|
||||||
MTXMultVec(mViewMatrix, &src, dst);
|
MTXMultVec(field_0x0, &src, dst);
|
||||||
return isInSight(*dst);
|
return isInSight(*dst);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -395,7 +395,7 @@ void Z2SpotMic::calcVolumeFactor(int camID) {
|
|||||||
|
|
||||||
void Z2SpotMic::setMicState(Z2AudioCamera* camera, int camID) {
|
void Z2SpotMic::setMicState(Z2AudioCamera* camera, int camID) {
|
||||||
JUT_ASSERT(622, camID >= 0);
|
JUT_ASSERT(622, camID >= 0);
|
||||||
JUT_ASSERT(623, camID < 1); // Z2_AUDIO_PLAYERS
|
JUT_ASSERT(623, camID < 1);
|
||||||
|
|
||||||
if (mMicOn && mPosPtr != 0 && camera != NULL) {
|
if (mMicOn && mPosPtr != 0 && camera != NULL) {
|
||||||
clearMicState(camID);
|
clearMicState(camID);
|
||||||
@@ -406,8 +406,8 @@ void Z2SpotMic::setMicState(Z2AudioCamera* camera, int camID) {
|
|||||||
aVStack_58.z += camera->getVolCenterZ();
|
aVStack_58.z += camera->getVolCenterZ();
|
||||||
|
|
||||||
f32 dVar10 = aVStack_58.length();
|
f32 dVar10 = aVStack_58.length();
|
||||||
f32 dVar11 = Z2GetAudience()->getSetting()->mDistanceMaxes[0];
|
f32 dVar11 = Z2GetAudience()->getSetting()->field_0x0[0];
|
||||||
f32 dVar12 = Z2GetAudience()->getSetting()->mMaxVolumeDistance;
|
f32 dVar12 = Z2GetAudience()->getSetting()->field_0x3c;
|
||||||
if (dVar10 > dVar11) {
|
if (dVar10 > dVar11) {
|
||||||
field_0x18[camID] = field_0xc;
|
field_0x18[camID] = field_0xc;
|
||||||
} else {
|
} else {
|
||||||
@@ -443,21 +443,21 @@ f32 Z2SpotMic::calcMicDist(Z2Audible* audible) {
|
|||||||
return aTStack_1c.length();
|
return aTStack_1c.length();
|
||||||
}
|
}
|
||||||
|
|
||||||
u32 Z2SpotMic::calcMicPriority(f32 micDistance) {
|
u32 Z2SpotMic::calcMicPriority(f32 param_0) {
|
||||||
if (micDistance > field_0x4) {
|
if (param_0 > field_0x4) {
|
||||||
return Z2GetAudience()->getSetting()->mMaxDistancePriority;
|
return Z2GetAudience()->getSetting()->field_0x64;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (micDistance < field_0x0) {
|
if (param_0 < field_0x0) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
return field_0x1c * (micDistance - field_0x0);
|
return field_0x1c * (param_0 - field_0x0);
|
||||||
}
|
}
|
||||||
|
|
||||||
f32 Z2SpotMic::calcMicVolume(f32 param_0, int camID, f32 param_2) {
|
f32 Z2SpotMic::calcMicVolume(f32 param_0, int camID, f32 param_2) {
|
||||||
JUT_ASSERT(687, camID >= 0);
|
JUT_ASSERT(687, camID >= 0);
|
||||||
JUT_ASSERT(688, camID < 1); // Z2_AUDIO_PLAYERS
|
JUT_ASSERT(688, camID < 1);
|
||||||
|
|
||||||
if (mMicOn == false) {
|
if (mMicOn == false) {
|
||||||
return param_2;
|
return param_2;
|
||||||
@@ -497,7 +497,7 @@ f32 Z2SpotMic::calcMicVolume(f32 param_0, int camID, f32 param_2) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Z2Audience::Z2Audience() : JASGlobalInstance<Z2Audience>(true), field_0x4(1.0f), field_0x8(0x7f) {
|
Z2Audience::Z2Audience() : JASGlobalInstance<Z2Audience>(true), field_0x4(1.0f), field_0x8(0x7f) {
|
||||||
mNumPlayers = Z2_AUDIO_PLAYERS;
|
mNumPlayers = 1;
|
||||||
mUsingOffMicVol = false;
|
mUsingOffMicVol = false;
|
||||||
mAudioCamera[0].init();
|
mAudioCamera[0].init();
|
||||||
mAudioCamera[0].setMainCamera(true);
|
mAudioCamera[0].setMainCamera(true);
|
||||||
@@ -512,11 +512,11 @@ bool Z2Audience::isActive() const {
|
|||||||
return Z2Audible::getTotalMemCount() != Z2Audible::getFreeMemCount();
|
return Z2Audible::getTotalMemCount() != Z2Audible::getFreeMemCount();
|
||||||
}
|
}
|
||||||
|
|
||||||
void Z2Audience::setAudioCamera(f32 (*viewMatrix)[4], Vec& pos, Vec& param_2, f32 param_3,
|
void Z2Audience::setAudioCamera(f32 (*param_0)[4], Vec& pos, Vec& param_2, f32 param_3,
|
||||||
f32 param_4, bool param_5, int camID, bool initial) {
|
f32 param_4, bool param_5, int camID, bool param_7) {
|
||||||
JUT_ASSERT(687, camID >= 0);
|
JUT_ASSERT(687, camID >= 0);
|
||||||
JUT_ASSERT(688, camID < mNumPlayers);
|
JUT_ASSERT(688, camID < mNumPlayers);
|
||||||
mAudioCamera[camID].setCameraState(viewMatrix, pos, param_2, param_3, param_4, param_5, initial);
|
mAudioCamera[camID].setCameraState(param_0, pos, param_2, param_3, param_4, param_5, param_7);
|
||||||
mLinkMic->setMicState(&mAudioCamera[camID], camID);
|
mLinkMic->setMicState(&mAudioCamera[camID], camID);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -529,7 +529,7 @@ JAIAudible* Z2Audience::newAudible(const JGeometry::TVec3<f32>& pos, JAISoundID
|
|||||||
}
|
}
|
||||||
|
|
||||||
JAUAudibleParam params = Z2GetSoundInfo()->getAudibleSwFull(soundID);
|
JAUAudibleParam params = Z2GetSoundInfo()->getAudibleSwFull(soundID);
|
||||||
bool x = params.field_0x0.bytes.mDopplerPower != 0;
|
bool x = params.field_0x0.bytes.b0_0 != 0;
|
||||||
|
|
||||||
Z2Audible* audible = JKR_NEW Z2Audible(pos, param_2, channelNum, x);
|
Z2Audible* audible = JKR_NEW Z2Audible(pos, param_2, channelNum, x);
|
||||||
if (audible == NULL) {
|
if (audible == NULL) {
|
||||||
@@ -543,13 +543,13 @@ JAIAudible* Z2Audience::newAudible(const JGeometry::TVec3<f32>& pos, JAISoundID
|
|||||||
if (channel != NULL) {
|
if (channel != NULL) {
|
||||||
u32 distVolBit = audible->getDistVolBit();
|
u32 distVolBit = audible->getDistVolBit();
|
||||||
mAudioCamera[i].convertAbsToRel(audible, i);
|
mAudioCamera[i].convertAbsToRel(audible, i);
|
||||||
calcDeltaPriority_(channel->mRelPos.mCenterDistance, distVolBit, false);
|
calcDeltaPriority_(channel->field_0x14.field_0x10, distVolBit, false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int i = 0; i < Z2_AUDIO_PLAYERS; i++) {
|
for (int i = 0; i < 1; i++) {
|
||||||
if (mSpotMic[i].isOn()) {
|
if (mSpotMic[i].isOn()) {
|
||||||
audible->mMicDistances[i] = mSpotMic[i].calcMicDist(audible);
|
audible->field_0x64[i] = mSpotMic[i].calcMicDist(audible);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -569,7 +569,7 @@ Z2Audible::~Z2Audible() {}
|
|||||||
u32 Z2Audience::calcPriority(JAIAudible* audible) {
|
u32 Z2Audience::calcPriority(JAIAudible* audible) {
|
||||||
Z2Audible* Z2audible = (Z2Audible*)audible;
|
Z2Audible* Z2audible = (Z2Audible*)audible;
|
||||||
|
|
||||||
if (!Z2audible->getAudibleParam()->field_0x0.bytes.mCalculatePriority) {
|
if (!Z2audible->getAudibleParam()->field_0x0.bytes.b0_4) {
|
||||||
for (int i = 0; i < mNumPlayers; i++) {
|
for (int i = 0; i < mNumPlayers; i++) {
|
||||||
mAudioCamera[i].convertAbsToRel(Z2audible, i);
|
mAudioCamera[i].convertAbsToRel(Z2audible, i);
|
||||||
}
|
}
|
||||||
@@ -584,17 +584,17 @@ u32 Z2Audience::calcPriority(JAIAudible* audible) {
|
|||||||
mAudioCamera[i].convertAbsToRel(Z2audible, i);
|
mAudioCamera[i].convertAbsToRel(Z2audible, i);
|
||||||
u32 distvolBit = Z2audible->getDistVolBit();
|
u32 distvolBit = Z2audible->getDistVolBit();
|
||||||
const JAUAudibleParam* puVar1 = Z2audible->getAudibleParam();
|
const JAUAudibleParam* puVar1 = Z2audible->getAudibleParam();
|
||||||
deltaPriority[i] = calcDeltaPriority_(channel->mRelPos.mCenterDistance, distvolBit, puVar1->field_0x0.bytes.mCullAtMaxDistance);
|
deltaPriority[i] = calcDeltaPriority_(channel->field_0x14.field_0x10, distvolBit, puVar1->field_0x0.bytes.b0_7);
|
||||||
if (deltaPriority[i] < rv) {
|
if (deltaPriority[i] < rv) {
|
||||||
rv = deltaPriority[i];
|
rv = deltaPriority[i];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int i = 0; i < Z2_AUDIO_PLAYERS; i++) {
|
for (int i = 0; i < 1; i++) {
|
||||||
if (mSpotMic[i].isOn()) {
|
if (mSpotMic[i].isOn()) {
|
||||||
Z2audible->mMicDistances[i] = mSpotMic[i].calcMicDist(Z2audible);
|
Z2audible->field_0x64[i] = mSpotMic[i].calcMicDist(Z2audible);
|
||||||
u32 micPriority = mSpotMic[i].calcMicPriority(Z2audible->mMicDistances[i]);
|
u32 micPriority = mSpotMic[i].calcMicPriority(Z2audible->field_0x64[i]);
|
||||||
if (micPriority < rv) {
|
if (micPriority < rv) {
|
||||||
rv = micPriority;
|
rv = micPriority;
|
||||||
}
|
}
|
||||||
@@ -619,31 +619,31 @@ void Z2Audience::mixChannelOut(const JASSoundParams& outParams, JAIAudible* audi
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
JASSoundParams calcParams;
|
JASSoundParams local_60;
|
||||||
u32 distVolBit = Z2audible->getDistVolBit();
|
u32 distVolBit = Z2audible->getDistVolBit();
|
||||||
if (Z2audible->getAudibleParam()->field_0x0.bytes.mCalcDistanceVolume) {
|
if (Z2audible->getAudibleParam()->field_0x0.bytes.b0_5) {
|
||||||
calcParams.mVolume = calcVolume_(channel->mRelPos.mCenterDistance, distVolBit);
|
local_60.mVolume = calcVolume_(channel->field_0x14.field_0x10, distVolBit);
|
||||||
f32 dVar9 = mLinkMic->calcMicVolume(Z2audible->mMicDistances[0], channelNum, calcParams.mVolume);
|
f32 dVar9 = mLinkMic->calcMicVolume(Z2audible->field_0x64[0], channelNum, local_60.mVolume);
|
||||||
if (dVar9 < 0.0f) {
|
if (dVar9 < 0.0f) {
|
||||||
dVar9 = calcOffMicSound(calcParams.mVolume);
|
dVar9 = calcOffMicSound(local_60.mVolume);
|
||||||
}
|
}
|
||||||
calcParams.mVolume = dVar9;
|
local_60.mVolume = dVar9;
|
||||||
|
|
||||||
JAUAudibleParam* params = Z2audible->getAudibleParam();
|
JAUAudibleParam* params = Z2audible->getAudibleParam();
|
||||||
if ((params->field_0x0.bytes.mClampMinVolume & 8) && (calcParams.mVolume <= 0.2f)) {
|
if ((params->field_0x0.bytes.b1_2_7 & 8) && (local_60.mVolume <= 0.2f)) {
|
||||||
calcParams.mVolume = 0.2f;
|
local_60.mVolume = 0.2f;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
calcParams.mVolume = 1.0f;
|
local_60.mVolume = 1.0f;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Z2audible->getAudibleParam()->field_0x0.bytes.mCalcDolby && mNumPlayers == 1) {
|
if (Z2audible->getAudibleParam()->field_0x0.bytes.b1_1 && mNumPlayers == 1) {
|
||||||
calcParams.mDolby = calcRelPosDolby(*(Vec*)&channel->mRelPos.mCameraRelative, channelNum);
|
local_60.mDolby = calcRelPosDolby(*(Vec*)&channel->field_0x14.field_0x00, channelNum);
|
||||||
} else {
|
} else {
|
||||||
calcParams.mDolby = 0.5f;
|
local_60.mDolby = 0.5f;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Z2audible->getAudibleParam()->field_0x0.bytes.mCalcPan) {
|
if (Z2audible->getAudibleParam()->field_0x0.bytes.b1_0) {
|
||||||
if (mNumPlayers > 2) {
|
if (mNumPlayers > 2) {
|
||||||
f32 fVar1;
|
f32 fVar1;
|
||||||
if (channelNum & 1) {
|
if (channelNum & 1) {
|
||||||
@@ -651,24 +651,24 @@ void Z2Audience::mixChannelOut(const JASSoundParams& outParams, JAIAudible* audi
|
|||||||
} else {
|
} else {
|
||||||
fVar1 = 0.0f;
|
fVar1 = 0.0f;
|
||||||
}
|
}
|
||||||
calcParams.mPan = fVar1;
|
local_60.mPan = fVar1;
|
||||||
} else {
|
} else {
|
||||||
calcParams.mPan = calcRelPosPan(*(Vec*)&channel->mRelPos.mCameraRelative, channelNum);
|
local_60.mPan = calcRelPosPan(*(Vec*)&channel->field_0x14.field_0x00, channelNum);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
calcParams.mPan = 0.5f;
|
local_60.mPan = 0.5f;
|
||||||
}
|
}
|
||||||
|
|
||||||
calcParams.mPitch = calcPitch_(channel, Z2audible, &mAudioCamera[channelNum]);
|
local_60.mPitch = calcPitch_(channel, Z2audible, &mAudioCamera[channelNum]);
|
||||||
f32 fxMix;
|
f32 dVar9;
|
||||||
if (Z2audible->getAudibleParam()->field_0x0.bytes.mCalcFxMix) {
|
if (Z2audible->getAudibleParam()->field_0x0.bytes.b0_6) {
|
||||||
fxMix = calcFxMix_(channel->mRelPos.mTrueDistance, distVolBit);
|
dVar9 = calcFxMix_(channel->field_0x14.field_0xC, distVolBit);
|
||||||
} else {
|
} else {
|
||||||
fxMix = 0.0f;
|
dVar9 = 0.0f;
|
||||||
}
|
}
|
||||||
calcParams.mFxMix = fxMix;
|
local_60.mFxMix = dVar9;
|
||||||
calcParams.clamp();
|
local_60.clamp();
|
||||||
Z2audible->setOuterParams(outParams, calcParams, channelNum);
|
Z2audible->setOuterParams(outParams, local_60, channelNum);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -688,18 +688,18 @@ f32 Z2Audience::calcRelPosVolume(const Vec& param_0, f32 param_1, int camID) {
|
|||||||
aTStack_3c.y *= 1.5f;
|
aTStack_3c.y *= 1.5f;
|
||||||
|
|
||||||
f32 len = aTStack_3c.length();
|
f32 len = aTStack_3c.length();
|
||||||
if (len > mSetting.mDistanceMaxes[0] * param_1) {
|
if (len > mSetting.field_0x0[0] * param_1) {
|
||||||
return mSetting.mMinDistanceVolume;
|
return mSetting.field_0x40;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (len < mSetting.mMaxVolumeDistance) {
|
if (len < mSetting.field_0x3c) {
|
||||||
return 1.0f;
|
return 1.0f;
|
||||||
}
|
}
|
||||||
|
|
||||||
return JGeometry::TUtil<f32>::clamp(
|
return JGeometry::TUtil<f32>::clamp(
|
||||||
1.0f + ((mSetting.mMinDistanceVolume - 1.0f) /
|
1.0f + ((mSetting.field_0x40 - 1.0f) /
|
||||||
((mSetting.mDistanceMaxes[0] * param_1) - mSetting.mMaxVolumeDistance)) *
|
((mSetting.field_0x0[0] * param_1) - mSetting.field_0x3c)) *
|
||||||
(len - mSetting.mMaxVolumeDistance),
|
(len - mSetting.field_0x3c),
|
||||||
0.0f, 1.0f);
|
0.0f, 1.0f);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -717,7 +717,7 @@ f32 Z2Audience::calcRelPosPan(const Vec& param_0, int camID) {
|
|||||||
return 0.5f;
|
return 0.5f;
|
||||||
}
|
}
|
||||||
|
|
||||||
dVar6 = (0.5f + mSetting.mPanFactor * (local_54.x / dVar6));
|
dVar6 = (0.5f + mSetting.field_0x58 * (local_54.x / dVar6));
|
||||||
if (local_54.z <= 0.0f) {
|
if (local_54.z <= 0.0f) {
|
||||||
f32 fovySin = mAudioCamera[camID].getFovySin();
|
f32 fovySin = mAudioCamera[camID].getFovySin();
|
||||||
if (dVar6 < 0.5f) {
|
if (dVar6 < 0.5f) {
|
||||||
@@ -757,52 +757,52 @@ f32 Z2Audience::calcRelPosDolby(const Vec& param_0, int camID) {
|
|||||||
return 0.5f - 0.5f * cosf(t * static_cast<f32>(M_PI));
|
return 0.5f - 0.5f * cosf(t * static_cast<f32>(M_PI));
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
if (fVar1 > mSetting.mDolbyBehindDistanceMax) {
|
if (fVar1 > mSetting.field_0x48) {
|
||||||
return 1.0f;
|
return 1.0f;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (fVar1 < mSetting.mDolbyFrontDistanceMax) {
|
if (fVar1 < mSetting.field_0x44) {
|
||||||
return 0.0f;
|
return 0.0f;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (fVar1 < 0.0f) {
|
if (fVar1 < 0.0f) {
|
||||||
return Z2Calc::getParamByExp(
|
return Z2Calc::getParamByExp(
|
||||||
fVar1, mSetting.mDolbyFrontDistanceMax, 0.0f,
|
fVar1, mSetting.field_0x44, 0.0f,
|
||||||
0.3f, 0.0f,
|
0.3f, 0.0f,
|
||||||
mSetting.mDolbyCenterValue, Z2Calc::CURVE_POSITIVE);
|
mSetting.field_0x4c, Z2Calc::CURVE_POSITIVE);
|
||||||
}
|
}
|
||||||
|
|
||||||
return Z2Calc::getParamByExp(
|
return Z2Calc::getParamByExp(
|
||||||
fVar1, 0.0f, mSetting.mDolbyBehindDistanceMax,
|
fVar1, 0.0f, mSetting.field_0x48,
|
||||||
0.3f, mSetting.mDolbyCenterValue,
|
0.3f, mSetting.field_0x4c,
|
||||||
1.0f, Z2Calc::CURVE_NEGATIVE);
|
1.0f, Z2Calc::CURVE_NEGATIVE);
|
||||||
}
|
}
|
||||||
|
|
||||||
f32 Z2Audience::calcVolume_(f32 param_0, int distVolBit) const {
|
f32 Z2Audience::calcVolume_(f32 param_0, int distVolBit) const {
|
||||||
if (param_0 > mSetting.mDistanceMaxes[distVolBit]) {
|
if (param_0 > mSetting.field_0x0[distVolBit]) {
|
||||||
return mSetting.mMinDistanceVolume;
|
return mSetting.field_0x40;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (param_0 < mSetting.mMaxVolumeDistance) {
|
if (param_0 < mSetting.field_0x3c) {
|
||||||
return 1.0f;
|
return 1.0f;
|
||||||
}
|
}
|
||||||
|
|
||||||
return JGeometry::TUtil<f32>::clamp((mSetting.mVolumeFactor[distVolBit] * (param_0 - mSetting.mMaxVolumeDistance)) + 1.0f, 0.0f, 1.0f);
|
return JGeometry::TUtil<f32>::clamp((mSetting.field_0x70[distVolBit] * (param_0 - mSetting.field_0x3c)) + 1.0f, 0.0f, 1.0f);
|
||||||
}
|
}
|
||||||
|
|
||||||
u32 Z2Audience::calcDeltaPriority_(f32 distance, int distVolBit, bool cullMaxDistance) const {
|
u32 Z2Audience::calcDeltaPriority_(f32 param_0, int distVolBit, bool param_2) const {
|
||||||
if (distance > mSetting.mDistanceMaxes[distVolBit]) {
|
if (param_0 > mSetting.field_0x0[distVolBit]) {
|
||||||
if (cullMaxDistance) {
|
if (param_2) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
return mSetting.mMaxDistancePriority;
|
return mSetting.field_0x64;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (distance < mSetting.mMaxVolumeDistance) {
|
if (param_0 < mSetting.field_0x3c) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
return mSetting.mPriorityFactor[distVolBit] * (distance - mSetting.mMaxVolumeDistance);
|
return mSetting.field_0xac[distVolBit] * (param_0 - mSetting.field_0x3c);
|
||||||
}
|
}
|
||||||
|
|
||||||
f32 Z2Audience::calcPitchDoppler_(const JGeometry::TVec3<f32>& param_0,
|
f32 Z2Audience::calcPitchDoppler_(const JGeometry::TVec3<f32>& param_0,
|
||||||
@@ -810,24 +810,24 @@ f32 Z2Audience::calcPitchDoppler_(const JGeometry::TVec3<f32>& param_0,
|
|||||||
const JGeometry::TVec3<f32>& param_2, f32 param_3) const {
|
const JGeometry::TVec3<f32>& param_2, f32 param_3) const {
|
||||||
f32 dVar8 = param_0.dot(param_1);
|
f32 dVar8 = param_0.dot(param_1);
|
||||||
f32 dVar7 = param_0.dot(param_2);
|
f32 dVar7 = param_0.dot(param_2);
|
||||||
return (mSetting.mSonicSpeed + param_3 * dVar8) / (mSetting.mSonicSpeed + param_3 * dVar7);
|
return (mSetting.field_0x5c + param_3 * dVar8) / (mSetting.field_0x5c + param_3 * dVar7);
|
||||||
}
|
}
|
||||||
|
|
||||||
f32 Z2Audience::calcFxMix_(f32 distance, int distVolBit) const {
|
f32 Z2Audience::calcFxMix_(f32 param_0, int distVolBit) const {
|
||||||
if (distance > mSetting.mDistanceMaxes[distVolBit]) {
|
if (param_0 > mSetting.field_0x0[distVolBit]) {
|
||||||
return mSetting.mMaxDistanceFxMix;
|
return mSetting.field_0x54;
|
||||||
}
|
}
|
||||||
if (distance < mSetting.mMaxVolumeDistance) {
|
if (param_0 < mSetting.field_0x3c) {
|
||||||
return mSetting.mMinDistanceFxMix;
|
return mSetting.field_0x50;
|
||||||
}
|
}
|
||||||
return mSetting.mMinDistanceFxMix + mSetting.mFxMixFactor[distVolBit] * (distance - mSetting.mMaxVolumeDistance);
|
return mSetting.field_0x50 + mSetting.field_0xe8[distVolBit] * (param_0 - mSetting.field_0x3c);
|
||||||
}
|
}
|
||||||
|
|
||||||
f32 Z2Audience::calcPitch_(Z2AudibleChannel* channel, const Z2Audible* audible, const Z2AudioCamera* camera) const {
|
f32 Z2Audience::calcPitch_(Z2AudibleChannel* channel, const Z2Audible* audible, const Z2AudioCamera* camera) const {
|
||||||
JAUAudibleParam audParam = *audible->getAudibleParam();
|
JAUAudibleParam audParam = *audible->getAudibleParam();
|
||||||
if (audParam.field_0x0.bytes.mDopplerPower) {
|
if (audParam.field_0x0.bytes.b0_0) {
|
||||||
JGeometry::TVec3<f32> aTStack_4c;
|
JGeometry::TVec3<f32> aTStack_4c;
|
||||||
aTStack_4c.normalize(channel->mRelPos.mCameraRelative);
|
aTStack_4c.normalize(channel->field_0x14.field_0x00);
|
||||||
JAUAudibleParam audParam = *audible->getAudibleParam();
|
JAUAudibleParam audParam = *audible->getAudibleParam();
|
||||||
|
|
||||||
f32 doppler = audParam.getDopplerPower();
|
f32 doppler = audParam.getDopplerPower();
|
||||||
|
|||||||
@@ -14,6 +14,10 @@
|
|||||||
#include <cstring>
|
#include <cstring>
|
||||||
#include "Z2AudioLib/SpotName.h"
|
#include "Z2AudioLib/SpotName.h"
|
||||||
|
|
||||||
|
#if TARGET_PC
|
||||||
|
#include "dusk/randomizer/game/randomizer_context.hpp"
|
||||||
|
#endif
|
||||||
|
|
||||||
Z2SceneMgr::Z2SceneMgr() : JASGlobalInstance<Z2SceneMgr>(true) {
|
Z2SceneMgr::Z2SceneMgr() : JASGlobalInstance<Z2SceneMgr>(true) {
|
||||||
sceneNum = -1;
|
sceneNum = -1;
|
||||||
BGM_ID = -1;
|
BGM_ID = -1;
|
||||||
@@ -1230,7 +1234,8 @@ void Z2SceneMgr::setSceneName(char* spot, s32 room, s32 layer) {
|
|||||||
bgm_id = Z2BGM_DUNGEON_FOREST;
|
bgm_id = Z2BGM_DUNGEON_FOREST;
|
||||||
bgm_wave1 = 0xa;
|
bgm_wave1 = 0xa;
|
||||||
/* dSv_event_flag_c::M_022 - Forest Temple - Forest Temple clear (Midna creates warp hole) */
|
/* dSv_event_flag_c::M_022 - Forest Temple - Forest Temple clear (Midna creates warp hole) */
|
||||||
} else if (dComIfGs_isEventBit(dSv_event_flag_c::saveBitLabels[55])) {
|
// In rando, check for boss defeated instead
|
||||||
|
} else if (dComIfGs_isEventBit(dSv_event_flag_c::saveBitLabels[55]) IF_DUSK(&& (!randomizer_IsActive() || dComIfGs_isStageBossEnemy()))) {
|
||||||
bgm_id = 0x200005b;
|
bgm_id = 0x200005b;
|
||||||
} else {
|
} else {
|
||||||
bgm_wave1 = 0xc;
|
bgm_wave1 = 0xc;
|
||||||
@@ -1290,11 +1295,13 @@ void Z2SceneMgr::setSceneName(char* spot, s32 room, s32 layer) {
|
|||||||
break;
|
break;
|
||||||
case Z2SCENE_LAKEBED_TEMPLE_BOSS:
|
case Z2SCENE_LAKEBED_TEMPLE_BOSS:
|
||||||
se_wave1 = 9;
|
se_wave1 = 9;
|
||||||
if (dComIfGs_isStageSwitch(4, 0xe)) {
|
// In rando, check for boss defeated instead
|
||||||
|
if (dComIfGs_isStageSwitch(4, 0xe) IF_DUSK(&& (!randomizer_IsActive() || dComIfGs_isStageBossEnemy()))) {
|
||||||
bgm_id = Z2BGM_DUNGEON_LV3;
|
bgm_id = Z2BGM_DUNGEON_LV3;
|
||||||
bgm_wave1 = 0x15;
|
bgm_wave1 = 0x15;
|
||||||
/* dSv_event_flag_c::M_045 - Lakebed Temple - Lakebed Temple clear */
|
/* dSv_event_flag_c::M_045 - Lakebed Temple - Lakebed Temple clear */
|
||||||
} else if (dComIfGs_isEventBit(dSv_event_flag_c::saveBitLabels[78])) {
|
// In rando, check for boss defeated instead
|
||||||
|
} else if (dComIfGs_isEventBit(dSv_event_flag_c::saveBitLabels[78]) IF_DUSK(&& (!randomizer_IsActive() || dComIfGs_isStageBossEnemy()))) {
|
||||||
bgm_id = 0x200005b;
|
bgm_id = 0x200005b;
|
||||||
} else {
|
} else {
|
||||||
bgm_wave1 = 0x1e;
|
bgm_wave1 = 0x1e;
|
||||||
@@ -1324,11 +1331,11 @@ void Z2SceneMgr::setSceneName(char* spot, s32 room, s32 layer) {
|
|||||||
break;
|
break;
|
||||||
case Z2SCENE_ARBITERS_GROUNDS_BOSS:
|
case Z2SCENE_ARBITERS_GROUNDS_BOSS:
|
||||||
se_wave1 = 0xd;
|
se_wave1 = 0xd;
|
||||||
if (dComIfGs_isStageSwitch(0xa, 0xa)) {
|
if (dComIfGs_isStageSwitch(0xa, 0xa) IF_DUSK(&& (!randomizer_IsActive() || dComIfGs_isStageBossEnemy()))) {
|
||||||
bgm_id = Z2BGM_DUNGEON_LV4;
|
bgm_id = Z2BGM_DUNGEON_LV4;
|
||||||
bgm_wave1 = 0x1a;
|
bgm_wave1 = 0x1a;
|
||||||
/* dSv_event_flag_c::F_0265 - Arbiter's Grounds - Arbiter's Grounds clear */
|
/* dSv_event_flag_c::F_0265 - Arbiter's Grounds - Arbiter's Grounds clear */
|
||||||
} else if (dComIfGs_isEventBit(dSv_event_flag_c::saveBitLabels[265])) {
|
} else if (dComIfGs_isEventBit(dSv_event_flag_c::saveBitLabels[265]) IF_DUSK(&& (!randomizer_IsActive() || dComIfGs_isStageBossEnemy()))) {
|
||||||
bgm_id = 0x200005b;
|
bgm_id = 0x200005b;
|
||||||
} else {
|
} else {
|
||||||
bgm_wave1 = 0x4c;
|
bgm_wave1 = 0x4c;
|
||||||
@@ -1389,11 +1396,11 @@ void Z2SceneMgr::setSceneName(char* spot, s32 room, s32 layer) {
|
|||||||
break;
|
break;
|
||||||
case Z2SCENE_TEMPLE_OF_TIME_BOSS:
|
case Z2SCENE_TEMPLE_OF_TIME_BOSS:
|
||||||
se_wave1 = 0x15;
|
se_wave1 = 0x15;
|
||||||
if (dComIfGs_isStageSwitch(7, 0x18)) {
|
if (dComIfGs_isStageSwitch(7, 0x18) IF_DUSK(&& (!randomizer_IsActive() || dComIfGs_isStageBossEnemy()))) {
|
||||||
bgm_id = Z2BGM_DUNGEON_LV6;
|
bgm_id = Z2BGM_DUNGEON_LV6;
|
||||||
bgm_wave1 = 0x26;
|
bgm_wave1 = 0x26;
|
||||||
/* dSv_event_flag_c::F_0267 - Temple of Time - Temple of Time clear */
|
/* dSv_event_flag_c::F_0267 - Temple of Time - Temple of Time clear */
|
||||||
} else if (dComIfGs_isEventBit(dSv_event_flag_c::saveBitLabels[267])) {
|
} else if (dComIfGs_isEventBit(dSv_event_flag_c::saveBitLabels[267]) IF_DUSK(&& (!randomizer_IsActive() || dComIfGs_isStageBossEnemy()))) {
|
||||||
bgm_id = 0x200005b;
|
bgm_id = 0x200005b;
|
||||||
} else {
|
} else {
|
||||||
bgm_wave1 = 0x4e;
|
bgm_wave1 = 0x4e;
|
||||||
@@ -1642,7 +1649,7 @@ void Z2SceneMgr::setSceneName(char* spot, s32 room, s32 layer) {
|
|||||||
JSUList<JAIStream>* stream_list = Z2GetSoundMgr()->getStreamMgr()->getStreamList();
|
JSUList<JAIStream>* stream_list = Z2GetSoundMgr()->getStreamMgr()->getStreamList();
|
||||||
JSULink<JAIStream>* stream;
|
JSULink<JAIStream>* stream;
|
||||||
for (stream = stream_list->getFirst(); stream != NULL; stream = stream->getNext()) {
|
for (stream = stream_list->getFirst(); stream != NULL; stream = stream->getNext()) {
|
||||||
if (bVar2 || sound_table->getTypeID(stream->getObject()->getID()) != SOUND_TYPEID_STREAM) {
|
if (bVar2 || sound_table->getTypeID(stream->getObject()->getID()) != 0x71) {
|
||||||
stream->getObject()->stop(Z2Param::SCENE_CHANGE_BGM_FADEOUT_TIME);
|
stream->getObject()->stop(Z2Param::SCENE_CHANGE_BGM_FADEOUT_TIME);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -23,7 +23,7 @@ u16 Z2SoundInfo::getBgmSeqResourceID(JAISoundID soundID) const {
|
|||||||
|
|
||||||
if (data != NULL) {
|
if (data != NULL) {
|
||||||
switch ((typeID & 0xf0)) {
|
switch ((typeID & 0xf0)) {
|
||||||
case SOUND_TYPEID_SEQUENCE:
|
case 0x60:
|
||||||
return (u16)data->mResourceId;
|
return (u16)data->mResourceId;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -53,7 +53,7 @@ u32 Z2SoundInfo::getPriority(JAISoundID soundID) const {
|
|||||||
JAUSoundTableItem* data = JASGlobalInstance<JAUSoundTable>::getInstance()->getData(soundID);
|
JAUSoundTableItem* data = JASGlobalInstance<JAUSoundTable>::getInstance()->getData(soundID);
|
||||||
u8 typeID = JASGlobalInstance<JAUSoundTable>::getInstance()->getTypeID(soundID);
|
u8 typeID = JASGlobalInstance<JAUSoundTable>::getInstance()->getTypeID(soundID);
|
||||||
|
|
||||||
if (data != NULL && (typeID & SOUND_TYPEID_VALID) != 0) {
|
if (data != NULL && (typeID & 0x40) != 0) {
|
||||||
return data->mPriority;
|
return data->mPriority;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -67,64 +67,64 @@ JAUAudibleParam Z2SoundInfo::getAudibleSwFull(JAISoundID soundID) {
|
|||||||
|
|
||||||
u8 typeID = JASGlobalInstance<JAUSoundTable>::getInstance()->getTypeID(soundID);
|
u8 typeID = JASGlobalInstance<JAUSoundTable>::getInstance()->getTypeID(soundID);
|
||||||
switch (typeID) {
|
switch (typeID) {
|
||||||
case SOUND_TYPEID_SOUND_EFFECT:
|
case 81:
|
||||||
audibleParam.field_0x0.bytes.mDopplerPower = (u32)getSwBit(soundID) >> SOUND_SW_DOPPLER_POWER_OFFSET;
|
audibleParam.field_0x0.bytes.b0_0 = (u32)getSwBit(soundID) >> 8;
|
||||||
if ((getSwBit(soundID) & SOUND_SW_ALWAYS_MAX_PRIORITY) != 0) {
|
if ((getSwBit(soundID) & 1) != 0) {
|
||||||
audibleParam.field_0x0.bytes.mCalculatePriority = 0;
|
audibleParam.field_0x0.bytes.b0_4 = 0;
|
||||||
} else {
|
} else {
|
||||||
audibleParam.field_0x0.bytes.mCalculatePriority = 1;
|
audibleParam.field_0x0.bytes.b0_4 = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((getSwBit(soundID) & SOUND_SW_IGNORE_DISTANCE_VOL) != 0) {
|
if ((getSwBit(soundID) & 2) != 0) {
|
||||||
audibleParam.field_0x0.bytes.mCalcDistanceVolume = 0;
|
audibleParam.field_0x0.bytes.b0_5 = 0;
|
||||||
} else {
|
} else {
|
||||||
audibleParam.field_0x0.bytes.mCalcDistanceVolume = 1;
|
audibleParam.field_0x0.bytes.b0_5 = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((getSwBit(soundID) & SOUND_SW_IGNORE_FX_MIX) != 0) {
|
if ((getSwBit(soundID) & 4) != 0) {
|
||||||
audibleParam.field_0x0.bytes.mCalcFxMix = 0;
|
audibleParam.field_0x0.bytes.b0_6 = 0;
|
||||||
} else {
|
} else {
|
||||||
audibleParam.field_0x0.bytes.mCalcFxMix = 1;
|
audibleParam.field_0x0.bytes.b0_6 = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((getSwBit(soundID) & SOUND_SW_CULL_AT_MAX_DISTANCE) != 0) {
|
if ((getSwBit(soundID) & 0x800000) != 0) {
|
||||||
audibleParam.field_0x0.bytes.mCullAtMaxDistance = 1;
|
audibleParam.field_0x0.bytes.b0_7 = 1;
|
||||||
} else {
|
} else {
|
||||||
audibleParam.field_0x0.bytes.mCullAtMaxDistance = 0;
|
audibleParam.field_0x0.bytes.b0_7 = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((getSwBit(soundID) & SOUND_SW_IGNORE_PAN) != 0) {
|
if ((getSwBit(soundID) & 0x1000) != 0) {
|
||||||
audibleParam.field_0x0.bytes.mCalcPan = 0;
|
audibleParam.field_0x0.bytes.b1_0 = 0;
|
||||||
} else {
|
} else {
|
||||||
audibleParam.field_0x0.bytes.mCalcPan = 1;
|
audibleParam.field_0x0.bytes.b1_0 = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((getSwBit(soundID) & SOUND_SW_IGNORE_DOLBY) != 0) {
|
if ((getSwBit(soundID) & 0x2000) != 0) {
|
||||||
audibleParam.field_0x0.bytes.mCalcDolby = 0;
|
audibleParam.field_0x0.bytes.b1_1 = 0;
|
||||||
} else {
|
} else {
|
||||||
audibleParam.field_0x0.bytes.mCalcDolby = 1;
|
audibleParam.field_0x0.bytes.b1_1 = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
uVar7 = 0;
|
uVar7 = 0;
|
||||||
if ((getSwBit(soundID) & SOUND_SW_CLAMP_MIN_VOLUME) != 0) {
|
if ((getSwBit(soundID) & 0x80000) != 0) {
|
||||||
uVar7 = 8;
|
uVar7 = 8;
|
||||||
}
|
}
|
||||||
|
|
||||||
iVar1 = (getSwBit(soundID) >> 16) & SOUND_VOL_DIST_BIT_MASK_SHIFTED;
|
iVar1 = (getSwBit(soundID) >> 16) & 0x7;
|
||||||
iVar1 += (getSwBit(soundID) >> 16) & SOUND_VOL_DIST_BIT_2_MASK_SHIFTED;
|
iVar1 += (getSwBit(soundID) >> 16) & 0x70;
|
||||||
iVar1 += (getSwBit(soundID) >> 16) & SOUND_VOL_SOMETHING_MASK_SHIFTED;
|
iVar1 += (getSwBit(soundID) >> 16) & 0xf00;
|
||||||
audibleParam.field_0x0.bytes.mClampMinVolume = uVar7;
|
audibleParam.field_0x0.bytes.b1_2_7 = uVar7;
|
||||||
audibleParam.field_0x0.half.f1 = iVar1;
|
audibleParam.field_0x0.half.f1 = iVar1;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
audibleParam.field_0x0.bytes.mDopplerPower = 0;
|
audibleParam.field_0x0.bytes.b0_0 = 0;
|
||||||
audibleParam.field_0x0.bytes.mCalculatePriority = 1;
|
audibleParam.field_0x0.bytes.b0_4 = 1;
|
||||||
audibleParam.field_0x0.bytes.mCalcDistanceVolume = 1;
|
audibleParam.field_0x0.bytes.b0_5 = 1;
|
||||||
audibleParam.field_0x0.bytes.mCalcFxMix = 1;
|
audibleParam.field_0x0.bytes.b0_6 = 1;
|
||||||
audibleParam.field_0x0.bytes.mCullAtMaxDistance = 0;
|
audibleParam.field_0x0.bytes.b0_7 = 0;
|
||||||
audibleParam.field_0x0.bytes.mCalcPan = 1;
|
audibleParam.field_0x0.bytes.b1_0 = 1;
|
||||||
audibleParam.field_0x0.bytes.mCalcDolby = 1;
|
audibleParam.field_0x0.bytes.b1_1 = 1;
|
||||||
audibleParam.field_0x0.bytes.mClampMinVolume = 0;
|
audibleParam.field_0x0.bytes.b1_2_7 = 0;
|
||||||
audibleParam.field_0x0.half.f1 = 0;
|
audibleParam.field_0x0.half.f1 = 0;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -139,53 +139,53 @@ u16 Z2SoundInfo::getAudibleSw(JAISoundID soundID) const {
|
|||||||
|
|
||||||
u8 typeID = JASGlobalInstance<JAUSoundTable>::getInstance()->getTypeID(soundID);
|
u8 typeID = JASGlobalInstance<JAUSoundTable>::getInstance()->getTypeID(soundID);
|
||||||
switch (typeID) {
|
switch (typeID) {
|
||||||
case SOUND_TYPEID_SOUND_EFFECT:
|
case 81:
|
||||||
audibleParam.field_0x0.bytes.mDopplerPower = (u32)getSwBit(soundID) >> SOUND_SW_DOPPLER_POWER_OFFSET;
|
audibleParam.field_0x0.bytes.b0_0 = (u32)getSwBit(soundID) >> 8;
|
||||||
if ((getSwBit(soundID) & SOUND_SW_ALWAYS_MAX_PRIORITY) != 0) {
|
if ((getSwBit(soundID) & 1) != 0) {
|
||||||
audibleParam.field_0x0.bytes.mCalculatePriority = 0;
|
audibleParam.field_0x0.bytes.b0_4 = 0;
|
||||||
} else {
|
} else {
|
||||||
audibleParam.field_0x0.bytes.mCalculatePriority = 1;
|
audibleParam.field_0x0.bytes.b0_4 = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((getSwBit(soundID) & SOUND_SW_IGNORE_DISTANCE_VOL) != 0) {
|
if ((getSwBit(soundID) & 2) != 0) {
|
||||||
audibleParam.field_0x0.bytes.mCalcDistanceVolume = 0;
|
audibleParam.field_0x0.bytes.b0_5 = 0;
|
||||||
} else {
|
} else {
|
||||||
audibleParam.field_0x0.bytes.mCalcDistanceVolume = 1;
|
audibleParam.field_0x0.bytes.b0_5 = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((getSwBit(soundID) & 4) != 0) {
|
if ((getSwBit(soundID) & 4) != 0) {
|
||||||
audibleParam.field_0x0.bytes.mCalcFxMix = 0;
|
audibleParam.field_0x0.bytes.b0_6 = 0;
|
||||||
} else {
|
} else {
|
||||||
audibleParam.field_0x0.bytes.mCalcFxMix = 1;
|
audibleParam.field_0x0.bytes.b0_6 = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((getSwBit(soundID) & SOUND_SW_CULL_AT_MAX_DISTANCE) != 0) {
|
if ((getSwBit(soundID) & 0x800000) != 0) {
|
||||||
audibleParam.field_0x0.bytes.mCullAtMaxDistance = 1;
|
audibleParam.field_0x0.bytes.b0_7 = 1;
|
||||||
} else {
|
} else {
|
||||||
audibleParam.field_0x0.bytes.mCullAtMaxDistance = 0;
|
audibleParam.field_0x0.bytes.b0_7 = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((getSwBit(soundID) & SOUND_SW_IGNORE_PAN) != 0) {
|
if ((getSwBit(soundID) & 0x1000) != 0) {
|
||||||
audibleParam.field_0x0.bytes.mCalcPan = 0;
|
audibleParam.field_0x0.bytes.b1_0 = 0;
|
||||||
} else {
|
} else {
|
||||||
audibleParam.field_0x0.bytes.mCalcPan = 1;
|
audibleParam.field_0x0.bytes.b1_0 = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((getSwBit(soundID) & SOUND_SW_IGNORE_DOLBY) != 0) {
|
if ((getSwBit(soundID) & 0x2000) != 0) {
|
||||||
audibleParam.field_0x0.bytes.mCalcDolby = 0;
|
audibleParam.field_0x0.bytes.b1_1 = 0;
|
||||||
} else {
|
} else {
|
||||||
audibleParam.field_0x0.bytes.mCalcDolby = 1;
|
audibleParam.field_0x0.bytes.b1_1 = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
uVar7 = 0;
|
uVar7 = 0;
|
||||||
if ((getSwBit(soundID) & SOUND_SW_CLAMP_MIN_VOLUME) != 0) {
|
if ((getSwBit(soundID) & 0x80000) != 0) {
|
||||||
uVar7 = 8;
|
uVar7 = 8;
|
||||||
}
|
}
|
||||||
|
|
||||||
iVar1 = (getSwBit(soundID) >> 16) & SOUND_VOL_DIST_BIT_MASK_SHIFTED;
|
iVar1 = (getSwBit(soundID) >> 16) & 0x7;
|
||||||
iVar1 += (getSwBit(soundID) >> 16) & SOUND_VOL_DIST_BIT_2_MASK_SHIFTED;
|
iVar1 += (getSwBit(soundID) >> 16) & 0x70;
|
||||||
iVar1 += (getSwBit(soundID) >> 16) & SOUND_VOL_SOMETHING_MASK_SHIFTED;
|
iVar1 += (getSwBit(soundID) >> 16) & 0xf00;
|
||||||
audibleParam.field_0x0.bytes.mClampMinVolume = uVar7;
|
audibleParam.field_0x0.bytes.b1_2_7 = uVar7;
|
||||||
audibleParam.field_0x0.half.f1 = iVar1;
|
audibleParam.field_0x0.half.f1 = iVar1;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
@@ -208,19 +208,19 @@ void Z2SoundInfo::getSeInfo(JAISoundID soundID, JAISe* sePtr) const {
|
|||||||
}
|
}
|
||||||
|
|
||||||
switch(typeID) {
|
switch(typeID) {
|
||||||
case SOUND_TYPEID_SOUND_EFFECT:
|
case 81:
|
||||||
sePtr->getProperty().mPitch *= data->mPitch;
|
sePtr->getProperty().field_0x8 *= data->field_0x8;
|
||||||
u32 pitchParam = (getSwBit(soundID) & SOUND_SW_RANDOM_PITCH_MASK) >> SOUND_SW_RANDOM_PITCH_OFFSET;
|
u32 uStack_6c = (getSwBit(soundID) & 0xf0) >> 4;
|
||||||
if (pitchParam > 8) {
|
if (uStack_6c > 8) {
|
||||||
sePtr->getProperty().mPitch += Z2Calc::linearTransform(pitchParam, 8.0f, 15.0f, 16.0f, 24.0f, true) / 48.0f * Z2Calc::getRandom_0_1();
|
sePtr->getProperty().field_0x8 += Z2Calc::linearTransform(uStack_6c, 8.0f, 15.0f, 16.0f, 24.0f, true) / 48.0f * Z2Calc::getRandom_0_1();
|
||||||
} else {
|
} else {
|
||||||
sePtr->getProperty().mPitch += (pitchParam / 48.0f) * Z2Calc::getRandom_0_1();
|
sePtr->getProperty().field_0x8 += (uStack_6c / 48.0f) * Z2Calc::getRandom_0_1();
|
||||||
}
|
}
|
||||||
|
|
||||||
u32 uVar1 = (u32)getSwBit(soundID) >> SOUND_SW_RANDOM_VOLUME_OFFSET;
|
u32 uVar1 = (u32)getSwBit(soundID) >> 0x1c;
|
||||||
if (uVar1 != 0) {
|
if (uVar1 != 0) {
|
||||||
f32 dVar18 = (uVar1 / 15.0f) * Z2Calc::getRandom_0_1();
|
f32 dVar18 = (uVar1 / 15.0f) * Z2Calc::getRandom_0_1();
|
||||||
sePtr->getProperty().mVolume -= dVar18 < 0.0f ? 0.0f : (dVar18 > 1.0f ? 1.0f : dVar18);
|
sePtr->getProperty().field_0x0 -= dVar18 < 0.0f ? 0.0f : (dVar18 > 1.0f ? 1.0f : dVar18);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -240,13 +240,13 @@ void Z2SoundInfo::getStreamInfo(JAISoundID soundID, JAIStream* streamPtr) const
|
|||||||
|
|
||||||
u8 typeID = JASGlobalInstance<JAUSoundTable>::getInstance()->getTypeID(soundID);
|
u8 typeID = JASGlobalInstance<JAUSoundTable>::getInstance()->getTypeID(soundID);
|
||||||
switch (typeID & 0xf0) {
|
switch (typeID & 0xf0) {
|
||||||
case SOUND_TYPEID_STREAM:
|
case 0x70:
|
||||||
u16 uVar1;
|
u16 uVar1;
|
||||||
s32 iVar4;
|
s32 iVar4;
|
||||||
data = JASGlobalInstance<JAUSoundTable>::getInstance()->getData(soundID);
|
data = JASGlobalInstance<JAUSoundTable>::getInstance()->getData(soundID);
|
||||||
JUT_ASSERT(356, data);
|
JUT_ASSERT(356, data);
|
||||||
|
|
||||||
uVar1 = data->mStreamPanParameters;
|
uVar1 = data->mResourceId;
|
||||||
numChild = streamPtr->getNumChild();
|
numChild = streamPtr->getNumChild();
|
||||||
iVar4 = 0;
|
iVar4 = 0;
|
||||||
for (; iVar4 < numChild && uVar1 != 0; uVar1 >>= JAUStdSoundTableType::STRM_CH_SHIFT, iVar4++) {
|
for (; iVar4 < numChild && uVar1 != 0; uVar1 >>= JAUStdSoundTableType::STRM_CH_SHIFT, iVar4++) {
|
||||||
@@ -277,12 +277,12 @@ const char* Z2SoundInfo::getStreamFilePath(JAISoundID soundID) {
|
|||||||
const void* resource;
|
const void* resource;
|
||||||
|
|
||||||
switch (JASGlobalInstance<JAUSoundTable>::getInstance()->getTypeID(soundID) & 0xf0) {
|
switch (JASGlobalInstance<JAUSoundTable>::getInstance()->getTypeID(soundID) & 0xf0) {
|
||||||
case SOUND_TYPEID_STREAM:
|
case 0x70:
|
||||||
data = JASGlobalInstance<JAUSoundTable>::getInstance()->getData(soundID);
|
data = JASGlobalInstance<JAUSoundTable>::getInstance()->getData(soundID);
|
||||||
JUT_ASSERT(394, data);
|
JUT_ASSERT(394, data);
|
||||||
resource = JASGlobalInstance<JAUSoundTable>::getInstance()->getResource();
|
resource = JASGlobalInstance<JAUSoundTable>::getInstance()->getResource();
|
||||||
JUT_ASSERT(398, resource);
|
JUT_ASSERT(398, resource);
|
||||||
return JAUStdSoundTableType::StringOffset::getString(resource, data->mStreamFilePath);
|
return JAUStdSoundTableType::StringOffset::getString(resource, data->field_0x4);
|
||||||
default:
|
default:
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
@@ -300,8 +300,8 @@ int Z2SoundInfo::getSwBit(JAISoundID soundID) const {
|
|||||||
u8 typeID = JASGlobalInstance<JAUSoundTable>::getInstance()->getTypeID(soundID);
|
u8 typeID = JASGlobalInstance<JAUSoundTable>::getInstance()->getTypeID(soundID);
|
||||||
if (data != NULL) {
|
if (data != NULL) {
|
||||||
switch(typeID) {
|
switch(typeID) {
|
||||||
case SOUND_TYPEID_SOUND_EFFECT:
|
case 81:
|
||||||
return data->mSwBit;
|
return data->field_0x4;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -313,7 +313,7 @@ void Z2SoundInfo::getSoundInfo_(JAISoundID soundID, JAISound* soundPtr) const {
|
|||||||
JAUSoundTableItem* data = JASGlobalInstance<JAUSoundTable>::getInstance()->getData(soundID);
|
JAUSoundTableItem* data = JASGlobalInstance<JAUSoundTable>::getInstance()->getData(soundID);
|
||||||
|
|
||||||
u8 typeID = JASGlobalInstance<JAUSoundTable>::getInstance()->getTypeID(soundID);
|
u8 typeID = JASGlobalInstance<JAUSoundTable>::getInstance()->getTypeID(soundID);
|
||||||
if (data != NULL && (typeID & SOUND_TYPEID_VALID) != 0) {
|
if (data != NULL && (typeID & 0x40) != 0) {
|
||||||
soundPtr->getProperty().mVolume = (1.0f / 127.0f) * data->mVolume;
|
soundPtr->getProperty().field_0x0 = (1.0f / 127.0f) * data->field_0x1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -222,7 +222,7 @@ Z2SoundHandlePool* Z2SoundObjBase::startCollisionSE(u32 hitID, u32 mapinfo, Z2So
|
|||||||
if (30 <= mapinfo && mapinfo <= 52) {
|
if (30 <= mapinfo && mapinfo <= 52) {
|
||||||
Z2Audible* audible = (Z2Audible*)(*handle)->getAudible();
|
Z2Audible* audible = (Z2Audible*)(*handle)->getAudible();
|
||||||
if (audible != NULL) {
|
if (audible != NULL) {
|
||||||
audible->getAudibleParam()->field_0x0.bytes.mClampMinVolume = 8;
|
audible->getAudibleParam()->field_0x0.bytes.b1_2_7 = 8;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -57,8 +57,12 @@
|
|||||||
#include "dusk/settings.h"
|
#include "dusk/settings.h"
|
||||||
#include "res/Object/Alink.h"
|
#include "res/Object/Alink.h"
|
||||||
#include <cstring>
|
#include <cstring>
|
||||||
#include <helpers/string.hpp>
|
#include "dusk/cosmetics/color_utils.hpp"
|
||||||
|
#include "dusk/randomizer/game/flags.h"
|
||||||
|
#include "dusk/randomizer/game/stages.h"
|
||||||
|
#include "dusk/randomizer/game/tools.h"
|
||||||
#endif
|
#endif
|
||||||
|
#include <helpers/string.hpp>
|
||||||
|
|
||||||
static int daAlink_Create(fopAc_ac_c* i_this);
|
static int daAlink_Create(fopAc_ac_c* i_this);
|
||||||
static int daAlink_Delete(daAlink_c* i_this);
|
static int daAlink_Delete(daAlink_c* i_this);
|
||||||
@@ -4231,6 +4235,25 @@ int daAlink_c::createHeap() {
|
|||||||
if (mpHIO == NULL) {
|
if (mpHIO == NULL) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
#if TARGET_PC
|
||||||
|
const auto& lanternColor = dusk::getSettings().cosmetics.lanternGlowColor.getValue();
|
||||||
|
if (dusk::cosmetics::is_valid_hex_color_str(lanternColor)) {
|
||||||
|
u8 r = std::stoi(lanternColor.substr(0, 2), nullptr, 16);
|
||||||
|
u8 g = std::stoi(lanternColor.substr(2, 2), nullptr, 16);
|
||||||
|
u8 b = std::stoi(lanternColor.substr(4, 2), nullptr, 16);
|
||||||
|
auto& lanternAmbience = mpHIO->mItem.mLanternPL.m;
|
||||||
|
auto& lanternSphere = mpHIO->mItem.mLantern.m;
|
||||||
|
lanternAmbience.mColorR = r;
|
||||||
|
lanternAmbience.mColorG = g;
|
||||||
|
lanternAmbience.mColorB = b;
|
||||||
|
lanternSphere.mColorReg1R = r;
|
||||||
|
lanternSphere.mColorReg1G = g;
|
||||||
|
lanternSphere.mColorReg1B = b;
|
||||||
|
lanternSphere.mColorReg2R = r;
|
||||||
|
lanternSphere.mColorReg2G = g;
|
||||||
|
lanternSphere.mColorReg2B = b;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
if (!(mpWlChangeModel = initModel(dRes_ID_ALINK_BMD_WL_CHANGE_e, 0))) {
|
if (!(mpWlChangeModel = initModel(dRes_ID_ALINK_BMD_WL_CHANGE_e, 0))) {
|
||||||
return 0;
|
return 0;
|
||||||
@@ -10573,9 +10596,16 @@ void daAlink_c::decideDoStatus() {
|
|||||||
(actor_name == fpcNm_TAG_KMSG_e &&
|
(actor_name == fpcNm_TAG_KMSG_e &&
|
||||||
static_cast<daTag_KMsg_c*>(field_0x27f4)->getType() == 3))
|
static_cast<daTag_KMsg_c*>(field_0x27f4)->getType() == 3))
|
||||||
{
|
{
|
||||||
if (!checkEquipAnime() && checkMasterSwordEquip()) {
|
// Don't check vanilla condition in randomizer
|
||||||
|
if (!checkEquipAnime() && checkMasterSwordEquip() IF_DUSK(&& !randomizer_IsActive())) {
|
||||||
setDoStatus(BUTTON_STATUS_STRIKE);
|
setDoStatus(BUTTON_STATUS_STRIKE);
|
||||||
}
|
}
|
||||||
|
#if TARGET_PC
|
||||||
|
// Separate check for striking sword into the pedestal for randomizer
|
||||||
|
if (!checkEquipAnime() && randomizer_IsActive() && randomizer_checkTempleOfTimeRequirement()) {
|
||||||
|
setDoStatus(BUTTON_STATUS_STRIKE);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
} else if (mTargetedActor != NULL && checkGoatCatchActor(mTargetedActor) &&
|
} else if (mTargetedActor != NULL && checkGoatCatchActor(mTargetedActor) &&
|
||||||
mAttention->getActionBtnB() != NULL &&
|
mAttention->getActionBtnB() != NULL &&
|
||||||
@@ -11483,6 +11513,14 @@ int daAlink_c::orderTalk(int i_checkZTalk) {
|
|||||||
static void* daAlink_searchBouDoor(fopAc_ac_c* i_actor, void* i_data) {
|
static void* daAlink_searchBouDoor(fopAc_ac_c* i_actor, void* i_data) {
|
||||||
UNUSED(i_data);
|
UNUSED(i_data);
|
||||||
|
|
||||||
|
#if TARGET_PC
|
||||||
|
// In randomizer, we don't want Bo preventing us from entering his house on Day 2
|
||||||
|
if (randomizer_IsActive() && daAlink_c::checkStageName("F_SP103"))
|
||||||
|
{
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
if (fopAcM_GetName(i_actor) == fpcNm_NPC_BOU_e && ((daNpc_Bou_c*)i_actor)->speakTo()) {
|
if (fopAcM_GetName(i_actor) == fpcNm_NPC_BOU_e && ((daNpc_Bou_c*)i_actor)->speakTo()) {
|
||||||
return i_actor;
|
return i_actor;
|
||||||
}
|
}
|
||||||
@@ -12263,6 +12301,14 @@ BOOL daAlink_c::checkGroundSpecialMode() {
|
|||||||
if (mLinkAcch.ChkGroundHit() && !checkModeFlg(MODE_PLAYER_FLY) && !checkMagneBootsOn() &&
|
if (mLinkAcch.ChkGroundHit() && !checkModeFlg(MODE_PLAYER_FLY) && !checkMagneBootsOn() &&
|
||||||
checkEndResetFlg0(ERFLG0_FORCE_WOLF_CHANGE))
|
checkEndResetFlg0(ERFLG0_FORCE_WOLF_CHANGE))
|
||||||
{
|
{
|
||||||
|
#if TARGET_PC
|
||||||
|
u8 stage = getStageID();
|
||||||
|
// In rando, don't transform in twilight fog unless we have shadow crystal
|
||||||
|
if (randomizer_IsActive() && !dComIfGs_isEventBit(TRANSFORMING_UNLOCKED) &&
|
||||||
|
(stage == Palace_of_Twilight || stage == Phantom_Zant_1 || stage == Phantom_Zant_2)) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
return procCoMetamorphoseInit();
|
return procCoMetamorphoseInit();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1624,7 +1624,7 @@ DUSK_GAME_DATA const daAlinkHIO_bomb_c1 daAlinkHIO_bomb_c0::m = {
|
|||||||
|
|
||||||
#pragma push
|
#pragma push
|
||||||
#pragma force_active on
|
#pragma force_active on
|
||||||
DUSK_GAME_DATA const daAlinkHIO_huLight_c1 daAlinkHIO_huLight_c0::m = {
|
DUSK_GAME_DATA IF_NOT_DUSK(const) daAlinkHIO_huLight_c1 daAlinkHIO_huLight_c0::m = {
|
||||||
0,
|
0,
|
||||||
3,
|
3,
|
||||||
0,
|
0,
|
||||||
@@ -1638,8 +1638,25 @@ DUSK_GAME_DATA const daAlinkHIO_huLight_c1 daAlinkHIO_huLight_c0::m = {
|
|||||||
0.0f,
|
0.0f,
|
||||||
};
|
};
|
||||||
#pragma pop
|
#pragma pop
|
||||||
|
#if TARGET_PC
|
||||||
|
// Save original lantern colors incase player reverts to default
|
||||||
|
DUSK_GAME_DATA const daAlinkHIO_huLight_c1 daAlinkHIO_huLight_c0::original = {
|
||||||
|
0,
|
||||||
|
3,
|
||||||
|
0,
|
||||||
|
181,
|
||||||
|
112,
|
||||||
|
40,
|
||||||
|
-70,
|
||||||
|
1.0f,
|
||||||
|
50.0f,
|
||||||
|
350.0f,
|
||||||
|
0.0f,
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
DUSK_GAME_DATA const daAlinkHIO_kandelaar_c1 daAlinkHIO_kandelaar_c0::m = {
|
|
||||||
|
DUSK_GAME_DATA IF_NOT_DUSK(const) daAlinkHIO_kandelaar_c1 daAlinkHIO_kandelaar_c0::m = {
|
||||||
{
|
{
|
||||||
30,
|
30,
|
||||||
1.1f,
|
1.1f,
|
||||||
@@ -1672,6 +1689,42 @@ DUSK_GAME_DATA const daAlinkHIO_kandelaar_c1 daAlinkHIO_kandelaar_c0::m = {
|
|||||||
0.5f,
|
0.5f,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#if TARGET_PC
|
||||||
|
// Save original lantern colors incase player reverts to default
|
||||||
|
DUSK_GAME_DATA const daAlinkHIO_kandelaar_c1 daAlinkHIO_kandelaar_c0::original = {
|
||||||
|
{
|
||||||
|
30,
|
||||||
|
1.1f,
|
||||||
|
2.0f,
|
||||||
|
3.0f,
|
||||||
|
17.0f,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
11,
|
||||||
|
1.0f,
|
||||||
|
0.0f,
|
||||||
|
3.0f,
|
||||||
|
12.0f,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
17,
|
||||||
|
1.0f,
|
||||||
|
0.0f,
|
||||||
|
3.0f,
|
||||||
|
18.0f,
|
||||||
|
},
|
||||||
|
80,
|
||||||
|
40,
|
||||||
|
20,
|
||||||
|
40,
|
||||||
|
30,
|
||||||
|
10,
|
||||||
|
3,
|
||||||
|
200,
|
||||||
|
0.5f,
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
DUSK_GAME_DATA const daAlinkHIO_fmChain_c1 daAlinkHIO_fmChain_c0::m = {
|
DUSK_GAME_DATA const daAlinkHIO_fmChain_c1 daAlinkHIO_fmChain_c0::m = {
|
||||||
{
|
{
|
||||||
20,
|
20,
|
||||||
|
|||||||
@@ -23,10 +23,13 @@
|
|||||||
#include "d/actor/d_a_npc_tkc.h"
|
#include "d/actor/d_a_npc_tkc.h"
|
||||||
#include <cstring>
|
#include <cstring>
|
||||||
|
|
||||||
|
#if TARGET_PC
|
||||||
#include "dusk/imgui/ImGuiConsole.hpp"
|
#include "dusk/imgui/ImGuiConsole.hpp"
|
||||||
#include "dusk/settings.h"
|
#include "dusk/settings.h"
|
||||||
#include "dusk/speedrun.h"
|
#include "dusk/speedrun.h"
|
||||||
|
#include "dusk/randomizer/game/randomizer_context.hpp"
|
||||||
#include "dusk/version.hpp"
|
#include "dusk/version.hpp"
|
||||||
|
#endif
|
||||||
|
|
||||||
BOOL daAlink_c::checkEventRun() const {
|
BOOL daAlink_c::checkEventRun() const {
|
||||||
return dComIfGp_event_runCheck() || checkPlayerDemoMode();
|
return dComIfGp_event_runCheck() || checkPlayerDemoMode();
|
||||||
@@ -1024,13 +1027,26 @@ void daAlink_c::setGetItemFace(u16 i_itemNo) {
|
|||||||
|| i_itemNo == dItemNo_ANCIENT_DOCUMENT2_e
|
|| i_itemNo == dItemNo_ANCIENT_DOCUMENT2_e
|
||||||
|| i_itemNo == dItemNo_DROP_CONTAINER_e
|
|| i_itemNo == dItemNo_DROP_CONTAINER_e
|
||||||
|| i_itemNo == dItemNo_DROP_CONTAINER02_e
|
|| i_itemNo == dItemNo_DROP_CONTAINER02_e
|
||||||
|
#if TARGET_PC
|
||||||
|
// Rando items for facial expressions
|
||||||
|
|| (randomizer_IsActive() && i_itemNo == dItemNo_Randomizer_WOOD_STICK_e)
|
||||||
|
|| (randomizer_IsActive() && i_itemNo == dItemNo_Randomizer_SWORD_e)
|
||||||
|
|| (randomizer_IsActive() && i_itemNo == dItemNo_Randomizer_SHIELD_e)
|
||||||
|
|| (randomizer_IsActive() && i_itemNo == dItemNo_Randomizer_MASTER_SWORD_e)
|
||||||
|
|| (randomizer_IsActive() && i_itemNo == dItemNo_Randomizer_LIGHT_SWORD_e)
|
||||||
|
|| (randomizer_IsActive() && i_itemNo == dItemNo_Randomizer_MAGIC_LV1_e)
|
||||||
|
#endif
|
||||||
|| i_itemNo == dItemNo_DROP_CONTAINER03_e)
|
|| i_itemNo == dItemNo_DROP_CONTAINER03_e)
|
||||||
{
|
{
|
||||||
setFaceBasicBck(dRes_ID_ALANM_BCK_FI_e);
|
setFaceBasicBck(dRes_ID_ALANM_BCK_FI_e);
|
||||||
} else if (i_itemNo == dItemNo_DUNGEON_EXIT_e || i_itemNo == dItemNo_LV7_DUNGEON_EXIT_e) {
|
} else if (i_itemNo == dItemNo_DUNGEON_EXIT_e || i_itemNo == dItemNo_LV7_DUNGEON_EXIT_e) {
|
||||||
setFaceBasicTexture(FTANM_K_A);
|
setFaceBasicTexture(FTANM_K_A);
|
||||||
setFaceBasicBck(dRes_ID_ALANM_BCK_FK_e);
|
setFaceBasicBck(dRes_ID_ALANM_BCK_FK_e);
|
||||||
|
#if TARGET_PC
|
||||||
|
} else if (i_itemNo == dItemNo_TOMATO_PUREE_e || i_itemNo == dItemNo_TASTE_e || (randomizer_IsActive() && i_itemNo == dItemNo_Randomizer_FOOLISH_ITEM_e)) {
|
||||||
|
#else
|
||||||
} else if (i_itemNo == dItemNo_TOMATO_PUREE_e || i_itemNo == dItemNo_TASTE_e) {
|
} else if (i_itemNo == dItemNo_TOMATO_PUREE_e || i_itemNo == dItemNo_TASTE_e) {
|
||||||
|
#endif
|
||||||
setFaceBasicBck(dRes_ID_ALANM_BCK_FJ_e);
|
setFaceBasicBck(dRes_ID_ALANM_BCK_FJ_e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -2217,18 +2233,283 @@ void daAlink_c::setGetSubBgm(int i_itemNo) {
|
|||||||
/* dItemNo_KEY_OF_FILONE_e */ SETYPE_ITEM_GET_MINI,
|
/* dItemNo_KEY_OF_FILONE_e */ SETYPE_ITEM_GET_MINI,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#if TARGET_PC
|
||||||
|
// Randomizer SeType changes
|
||||||
|
static const u8 getSeTypeRandomizer[255] = {
|
||||||
|
/* dItemNo_Randomizer_HEART_e */ SETYPE_NONE,
|
||||||
|
/* dItemNo_Randomizer_GREEN_RUPEE_e */ SETYPE_ITEM_GET_ME,
|
||||||
|
/* dItemNo_Randomizer_BLUE_RUPEE_e */ SETYPE_ITEM_GET_ME,
|
||||||
|
/* dItemNo_Randomizer_YELLOW_RUPEE_e */ SETYPE_ITEM_GET_ME,
|
||||||
|
/* dItemNo_Randomizer_RED_RUPEE_e */ SETYPE_ITEM_GET_ME,
|
||||||
|
/* dItemNo_Randomizer_PURPLE_RUPEE_e */ SETYPE_ITEM_GET_ME,
|
||||||
|
/* dItemNo_Randomizer_ORANGE_RUPEE_e */ SETYPE_ITEM_GET_MINI,
|
||||||
|
/* dItemNo_Randomizer_SILVER_RUPEE_e */ SETYPE_ITEM_GET_MINI,
|
||||||
|
/* dItemNo_Randomizer_S_MAGIC_e */ SETYPE_NONE,
|
||||||
|
/* dItemNo_Randomizer_L_MAGIC_e */ SETYPE_NONE,
|
||||||
|
/* dItemNo_Randomizer_BOMB_5_e */ SETYPE_ITEM_GET_ME,
|
||||||
|
/* dItemNo_Randomizer_BOMB_10_e */ SETYPE_ITEM_GET_ME,
|
||||||
|
/* dItemNo_Randomizer_BOMB_20_e */ SETYPE_ITEM_GET_ME,
|
||||||
|
/* dItemNo_Randomizer_BOMB_30_e */ SETYPE_ITEM_GET_ME,
|
||||||
|
/* dItemNo_Randomizer_ARROW_10_e */ SETYPE_ITEM_GET_ME,
|
||||||
|
/* dItemNo_Randomizer_ARROW_20_e */ SETYPE_ITEM_GET_ME,
|
||||||
|
/* dItemNo_Randomizer_ARROW_30_e */ SETYPE_ITEM_GET_ME,
|
||||||
|
/* dItemNo_Randomizer_ARROW_1_e */ SETYPE_ITEM_GET_ME,
|
||||||
|
/* dItemNo_Randomizer_PACHINKO_SHOT_e */ SETYPE_ITEM_GET_ME,
|
||||||
|
/* dItemNo_Randomizer_FOOLISH_ITEM_e_e */ SETYPE_NONE,
|
||||||
|
/* dItemNo_Randomizer_NOENTRY_20_e */ SETYPE_ITEM_GET_MINI,
|
||||||
|
/* dItemNo_Randomizer_NOENTRY_21_e */ SETYPE_ITEM_GET_MINI,
|
||||||
|
/* dItemNo_Randomizer_WATER_BOMB_5_e */ SETYPE_ITEM_GET_ME,
|
||||||
|
/* dItemNo_Randomizer_WATER_BOMB_10_e */ SETYPE_ITEM_GET_ME,
|
||||||
|
/* dItemNo_Randomizer_WATER_BOMB_20_e */ SETYPE_ITEM_GET_ME,
|
||||||
|
/* dItemNo_Randomizer_WATER_BOMB_30_e */ SETYPE_ITEM_GET_ME,
|
||||||
|
/* dItemNo_Randomizer_BOMB_INSECT_5_e */ SETYPE_ITEM_GET_ME,
|
||||||
|
/* dItemNo_Randomizer_BOMB_INSECT_10_e */ SETYPE_ITEM_GET_ME,
|
||||||
|
/* dItemNo_Randomizer_BOMB_INSECT_20_e */ SETYPE_ITEM_GET_ME,
|
||||||
|
/* dItemNo_Randomizer_BOMB_INSECT_30_e */ SETYPE_ITEM_GET_ME,
|
||||||
|
/* dItemNo_Randomizer_RECOVERY_FAILY_e */ SETYPE_ITEM_GET_MINI,
|
||||||
|
/* dItemNo_Randomizer_TRIPLE_HEART_e */ SETYPE_ITEM_GET_MINI,
|
||||||
|
/* dItemNo_Randomizer_SMALL_KEY_e */ SETYPE_ITEM_GET_MINI,
|
||||||
|
/* dItemNo_Randomizer_KAKERA_HEART_e */ SETYPE_ITEM_GET_MINI,
|
||||||
|
/* dItemNo_Randomizer_UTAWA_HEART_e */ SETYPE_HEART,
|
||||||
|
/* dItemNo_Randomizer_MAP_e */ SETYPE_ITEM_GET,
|
||||||
|
/* dItemNo_Randomizer_COMPUS_e */ SETYPE_ITEM_GET,
|
||||||
|
/* dItemNo_Randomizer_DUNGEON_EXIT_e */ SETYPE_ITEM_GET_MINI,
|
||||||
|
/* dItemNo_Randomizer_BOSS_KEY_e */ SETYPE_ITEM_GET,
|
||||||
|
/* dItemNo_Randomizer_DUNGEON_BACK_e */ SETYPE_ITEM_GET_MINI,
|
||||||
|
/* dItemNo_Randomizer_SWORD_e */ SETYPE_ITEM_GET,
|
||||||
|
/* dItemNo_Randomizer_MASTER_SWORD_e */ SETYPE_ITEM_GET,
|
||||||
|
/* dItemNo_Randomizer_WOOD_SHIELD_e */ SETYPE_ITEM_GET,
|
||||||
|
/* dItemNo_Randomizer_SHIELD_e */ SETYPE_ITEM_GET,
|
||||||
|
/* dItemNo_Randomizer_HYLIA_SHIELD_e */ SETYPE_ITEM_GET,
|
||||||
|
/* dItemNo_Randomizer_TKS_LETTER_e */ SETYPE_ITEM_GET_MINI,
|
||||||
|
/* dItemNo_Randomizer_WEAR_CASUAL_e */ SETYPE_ITEM_GET_MINI,
|
||||||
|
/* dItemNo_Randomizer_WEAR_KOKIRI_e */ SETYPE_ITEM_GET_MINI,
|
||||||
|
/* dItemNo_Randomizer_ARMOR_e */ SETYPE_ITEM_GET,
|
||||||
|
/* dItemNo_Randomizer_WEAR_ZORA_e */ SETYPE_ITEM_GET,
|
||||||
|
/* dItemNo_Randomizer_MAGIC_LV1_e */ SETYPE_ITEM_GET,
|
||||||
|
/* dItemNo_Randomizer_DUNGEON_EXIT_2_e */ SETYPE_ITEM_GET_MINI,
|
||||||
|
/* dItemNo_Randomizer_WALLET_LV1_e */ SETYPE_ITEM_GET_MINI,
|
||||||
|
/* dItemNo_Randomizer_WALLET_LV2_e */ SETYPE_ITEM_GET,
|
||||||
|
/* dItemNo_Randomizer_WALLET_LV3_e */ SETYPE_ITEM_GET,
|
||||||
|
/* dItemNo_Randomizer_NOENTRY_55_e */ SETYPE_ITEM_GET_MINI,
|
||||||
|
/* dItemNo_Randomizer_NOENTRY_56_e */ SETYPE_ITEM_GET_MINI,
|
||||||
|
/* dItemNo_Randomizer_NOENTRY_57_e */ SETYPE_ITEM_GET_MINI,
|
||||||
|
/* dItemNo_Randomizer_NOENTRY_58_e */ SETYPE_ITEM_GET_MINI,
|
||||||
|
/* dItemNo_Randomizer_NOENTRY_59_e */ SETYPE_ITEM_GET_MINI,
|
||||||
|
/* dItemNo_Randomizer_NOENTRY_60_e */ SETYPE_ITEM_GET_MINI,
|
||||||
|
/* dItemNo_Randomizer_ZORAS_JEWEL_e */ SETYPE_ITEM_GET,
|
||||||
|
/* dItemNo_Randomizer_HAWK_EYE_e */ SETYPE_ITEM_GET,
|
||||||
|
/* dItemNo_Randomizer_WOOD_STICK_e */ SETYPE_ITEM_GET_MINI,
|
||||||
|
/* dItemNo_Randomizer_BOOMERANG_e */ SETYPE_ITEM_GET,
|
||||||
|
/* dItemNo_Randomizer_SPINNER_e */ SETYPE_ITEM_GET,
|
||||||
|
/* dItemNo_Randomizer_IRONBALL_e */ SETYPE_ITEM_GET,
|
||||||
|
/* dItemNo_Randomizer_BOW_e */ SETYPE_ITEM_GET,
|
||||||
|
/* dItemNo_Randomizer_HOOKSHOT_e */ SETYPE_ITEM_GET,
|
||||||
|
/* dItemNo_Randomizer_HVY_BOOTS_e */ SETYPE_ITEM_GET,
|
||||||
|
/* dItemNo_Randomizer_COPY_ROD_e */ SETYPE_ITEM_GET,
|
||||||
|
/* dItemNo_Randomizer_W_HOOKSHOT_e */ SETYPE_ITEM_GET,
|
||||||
|
/* dItemNo_Randomizer_KANTERA_e */ SETYPE_ITEM_GET,
|
||||||
|
/* dItemNo_Randomizer_LIGHT_SWORD_e */ SETYPE_ITEM_GET,
|
||||||
|
/* dItemNo_Randomizer_FISHING_ROD_1_e */ SETYPE_ITEM_GET,
|
||||||
|
/* dItemNo_Randomizer_PACHINKO_e */ SETYPE_ITEM_GET,
|
||||||
|
/* dItemNo_Randomizer_COPY_ROD_2_e */ SETYPE_ITEM_GET,
|
||||||
|
/* dItemNo_Randomizer_NOENTRY_77_e */ SETYPE_ITEM_GET_MINI,
|
||||||
|
/* dItemNo_Randomizer_NOENTRY_78_e */ SETYPE_ITEM_GET_MINI,
|
||||||
|
/* dItemNo_Randomizer_BOMB_BAG_LV2_e */ SETYPE_ITEM_GET,
|
||||||
|
/* dItemNo_Randomizer_BOMB_BAG_LV1_e */ SETYPE_ITEM_GET,
|
||||||
|
/* dItemNo_Randomizer_BOMB_IN_BAG_e */ SETYPE_ITEM_GET,
|
||||||
|
/* dItemNo_Randomizer_NOENTRY_82_e */ SETYPE_ITEM_GET_MINI,
|
||||||
|
/* dItemNo_Randomizer_LIGHT_ARROW_e */ SETYPE_ITEM_GET_MINI,
|
||||||
|
/* dItemNo_Randomizer_ARROW_LV1_e */ SETYPE_ITEM_GET_MINI,
|
||||||
|
/* dItemNo_Randomizer_ARROW_LV2_e */ SETYPE_ITEM_GET,
|
||||||
|
/* dItemNo_Randomizer_ARROW_LV3_e */ SETYPE_ITEM_GET,
|
||||||
|
/* dItemNo_Randomizer_NOENTRY_87_e */ SETYPE_ITEM_GET_MINI,
|
||||||
|
/* dItemNo_Randomizer_LURE_ROD_e */ SETYPE_ITEM_GET_MINI,
|
||||||
|
/* dItemNo_Randomizer_BOMB_ARROW_e */ SETYPE_ITEM_GET_MINI,
|
||||||
|
/* dItemNo_Randomizer_HAWK_ARROW_e */ SETYPE_ITEM_GET_MINI,
|
||||||
|
/* dItemNo_Randomizer_BEE_ROD_e */ SETYPE_ITEM_GET_MINI,
|
||||||
|
/* dItemNo_Randomizer_JEWEL_ROD_e */ SETYPE_ITEM_GET_MINI,
|
||||||
|
/* dItemNo_Randomizer_WORM_ROD_e */ SETYPE_ITEM_GET_MINI,
|
||||||
|
/* dItemNo_Randomizer_JEWEL_BEE_ROD_e */ SETYPE_ITEM_GET_MINI,
|
||||||
|
/* dItemNo_Randomizer_JEWEL_WORM_ROD_e */ SETYPE_ITEM_GET_MINI,
|
||||||
|
/* dItemNo_Randomizer_EMPTY_BOTTLE_e */ SETYPE_ITEM_GET,
|
||||||
|
/* dItemNo_Randomizer_RED_BOTTLE_e */ SETYPE_ITEM_GET_MINI,
|
||||||
|
/* dItemNo_Randomizer_GREEN_BOTTLE_e */ SETYPE_ITEM_GET_MINI,
|
||||||
|
/* dItemNo_Randomizer_BLUE_BOTTLE_e */ SETYPE_ITEM_GET_MINI,
|
||||||
|
/* dItemNo_Randomizer_MILK_BOTTLE_e */ SETYPE_ITEM_GET_MINI,
|
||||||
|
/* dItemNo_Randomizer_HALF_MILK_BOTTLE_e */ SETYPE_ITEM_GET,
|
||||||
|
/* dItemNo_Randomizer_OIL_BOTTLE_e */ SETYPE_ITEM_GET_MINI,
|
||||||
|
/* dItemNo_Randomizer_WATER_BOTTLE_e */ SETYPE_ITEM_GET_MINI,
|
||||||
|
/* dItemNo_Randomizer_OIL_BOTTLE_2_e */ SETYPE_ITEM_GET_MINI,
|
||||||
|
/* dItemNo_Randomizer_RED_BOTTLE_2_e */ SETYPE_ITEM_GET_MINI,
|
||||||
|
/* dItemNo_Randomizer_UGLY_SOUP_e */ SETYPE_ITEM_GET_MINI,
|
||||||
|
/* dItemNo_Randomizer_HOT_SPRING_e */ SETYPE_ITEM_GET_MINI,
|
||||||
|
/* dItemNo_Randomizer_FAIRY_e */ SETYPE_ITEM_GET_MINI,
|
||||||
|
/* dItemNo_Randomizer_HOT_SPRING_2_e */ SETYPE_ITEM_GET_MINI,
|
||||||
|
/* dItemNo_Randomizer_OIL2_e */ SETYPE_ITEM_GET_MINI,
|
||||||
|
/* dItemNo_Randomizer_OIL_e */ SETYPE_ITEM_GET_MINI,
|
||||||
|
/* dItemNo_Randomizer_NORMAL_BOMB_e */ SETYPE_ITEM_GET_MINI,
|
||||||
|
/* dItemNo_Randomizer_WATER_BOMB_e */ SETYPE_ITEM_GET_MINI,
|
||||||
|
/* dItemNo_Randomizer_POKE_BOMB_e */ SETYPE_ITEM_GET_MINI,
|
||||||
|
/* dItemNo_Randomizer_FAIRY_DROP_e */ SETYPE_ITEM_GET,
|
||||||
|
/* dItemNo_Randomizer_WORM_e */ SETYPE_ITEM_GET_MINI,
|
||||||
|
/* dItemNo_Randomizer_DROP_BOTTLE_e */ SETYPE_ITEM_GET,
|
||||||
|
/* dItemNo_Randomizer_BEE_CHILD_e */ SETYPE_ITEM_GET_MINI,
|
||||||
|
/* dItemNo_Randomizer_CHUCHU_RARE_e */ SETYPE_ITEM_GET,
|
||||||
|
/* dItemNo_Randomizer_CHUCHU_RED_e */ SETYPE_ITEM_GET_MINI,
|
||||||
|
/* dItemNo_Randomizer_CHUCHU_BLUE_e */ SETYPE_ITEM_GET_MINI,
|
||||||
|
/* dItemNo_Randomizer_CHUCHU_GREEN_e */ SETYPE_ITEM_GET_MINI,
|
||||||
|
/* dItemNo_Randomizer_CHUCHU_YELLOW_e */ SETYPE_ITEM_GET_MINI,
|
||||||
|
/* dItemNo_Randomizer_CHUCHU_PURPLE_e */ SETYPE_ITEM_GET_MINI,
|
||||||
|
/* dItemNo_Randomizer_LV1_SOUP_e */ SETYPE_ITEM_GET_MINI,
|
||||||
|
/* dItemNo_Randomizer_LV2_SOUP_e */ SETYPE_ITEM_GET_MINI,
|
||||||
|
/* dItemNo_Randomizer_LV3_SOUP_e */ SETYPE_ITEM_GET_MINI,
|
||||||
|
/* dItemNo_Randomizer_LETTER_e */ SETYPE_ITEM_GET_MINI,
|
||||||
|
/* dItemNo_Randomizer_BILL_e */ SETYPE_ITEM_GET_MINI,
|
||||||
|
/* dItemNo_Randomizer_WOOD_STATUE_e */ SETYPE_ITEM_GET_MINI,
|
||||||
|
/* dItemNo_Randomizer_IRIAS_PENDANT_e */ SETYPE_ITEM_GET_MINI,
|
||||||
|
/* dItemNo_Randomizer_HORSE_FLUTE_e */ SETYPE_ITEM_GET_MINI,
|
||||||
|
/* dItemNo_Randomizer_NOENTRY_133_e */ SETYPE_ITEM_GET_MINI,
|
||||||
|
/* dItemNo_Randomizer_NOENTRY_134_e */ SETYPE_ITEM_GET_MINI,
|
||||||
|
/* dItemNo_Randomizer_NOENTRY_135_e */ SETYPE_ITEM_GET_MINI,
|
||||||
|
/* dItemNo_Randomizer_NOENTRY_136_e */ SETYPE_ITEM_GET_MINI,
|
||||||
|
/* dItemNo_Randomizer_NOENTRY_137_e */ SETYPE_ITEM_GET_MINI,
|
||||||
|
/* dItemNo_Randomizer_NOENTRY_138_e */ SETYPE_ITEM_GET_MINI,
|
||||||
|
/* dItemNo_Randomizer_NOENTRY_139_e */ SETYPE_ITEM_GET_MINI,
|
||||||
|
/* dItemNo_Randomizer_NOENTRY_140_e */ SETYPE_ITEM_GET_MINI,
|
||||||
|
/* dItemNo_Randomizer_NOENTRY_141_e */ SETYPE_ITEM_GET_MINI,
|
||||||
|
/* dItemNo_Randomizer_NOENTRY_142_e */ SETYPE_ITEM_GET_MINI,
|
||||||
|
/* dItemNo_Randomizer_NOENTRY_143_e */ SETYPE_ITEM_GET_MINI,
|
||||||
|
/* dItemNo_Randomizer_RAFRELS_MEMO_e */ SETYPE_ITEM_GET_MINI,
|
||||||
|
/* dItemNo_Randomizer_ASHS_SCRIBBLING_e */ SETYPE_ITEM_GET_MINI,
|
||||||
|
/* dItemNo_Randomizer_NOENTRY_146_e */ SETYPE_ITEM_GET,
|
||||||
|
/* dItemNo_Randomizer_NOENTRY_147_e */ SETYPE_ITEM_GET,
|
||||||
|
/* dItemNo_Randomizer_NOENTRY_148_e */ SETYPE_ITEM_GET,
|
||||||
|
/* dItemNo_Randomizer_NOENTRY_149_e */ SETYPE_ITEM_GET,
|
||||||
|
/* dItemNo_Randomizer_NOENTRY_150_e */ SETYPE_ITEM_GET,
|
||||||
|
/* dItemNo_Randomizer_NOENTRY_151_e */ SETYPE_ITEM_GET,
|
||||||
|
/* dItemNo_Randomizer_NOENTRY_152_e */ SETYPE_ITEM_GET,
|
||||||
|
/* dItemNo_Randomizer_NOENTRY_153_e */ SETYPE_ITEM_GET_MINI,
|
||||||
|
/* dItemNo_Randomizer_NOENTRY_154_e */ SETYPE_ITEM_GET_MINI,
|
||||||
|
/* dItemNo_Randomizer_NOENTRY_155_e */ SETYPE_ITEM_GET_MINI,
|
||||||
|
/* dItemNo_Randomizer_CHUCHU_YELLOW2_e */ SETYPE_ITEM_GET_MINI,
|
||||||
|
/* dItemNo_Randomizer_OIL_BOTTLE3_e */ SETYPE_ITEM_GET,
|
||||||
|
/* dItemNo_Randomizer_SHOP_BEE_CHILD_e */ SETYPE_ITEM_GET_MINI,
|
||||||
|
/* dItemNo_Randomizer_CHUCHU_BLACK_e */ SETYPE_ITEM_GET_MINI,
|
||||||
|
/* dItemNo_Randomizer_LIGHT_DROP_e */ SETYPE_ITEM_GET_MINI,
|
||||||
|
/* dItemNo_Randomizer_DROP_CONTAINER_e */ SETYPE_ITEM_GET,
|
||||||
|
/* dItemNo_Randomizer_DROP_CONTAINER02_e */ SETYPE_ITEM_GET,
|
||||||
|
/* dItemNo_Randomizer_DROP_CONTAINER03_e */ SETYPE_ITEM_GET,
|
||||||
|
/* dItemNo_Randomizer_FILLED_CONTAINER_e */ SETYPE_ITEM_GET_MINI,
|
||||||
|
/* dItemNo_Randomizer_MIRROR_PIECE_2_e */ SETYPE_ITEM_GET,
|
||||||
|
/* dItemNo_Randomizer_MIRROR_PIECE_3_e */ SETYPE_ITEM_GET,
|
||||||
|
/* dItemNo_Randomizer_MIRROR_PIECE_4_e */ SETYPE_ITEM_GET,
|
||||||
|
/* dItemNo_Randomizer_NOENTRY_168_e */ SETYPE_ITEM_GET_MINI,
|
||||||
|
/* dItemNo_Randomizer_NOENTRY_169_e */ SETYPE_ITEM_GET_MINI,
|
||||||
|
/* dItemNo_Randomizer_NOENTRY_170_e */ SETYPE_ITEM_GET_MINI,
|
||||||
|
/* dItemNo_Randomizer_NOENTRY_171_e */ SETYPE_ITEM_GET_MINI,
|
||||||
|
/* dItemNo_Randomizer_NOENTRY_172_e */ SETYPE_ITEM_GET_MINI,
|
||||||
|
/* dItemNo_Randomizer_NOENTRY_173_e */ SETYPE_ITEM_GET_MINI,
|
||||||
|
/* dItemNo_Randomizer_NOENTRY_174_e */ SETYPE_ITEM_GET_MINI,
|
||||||
|
/* dItemNo_Randomizer_NOENTRY_175_e */ SETYPE_ITEM_GET_MINI,
|
||||||
|
/* dItemNo_Randomizer_SMELL_YELIA_POUCH_e */ SETYPE_ITEM_GET_SMELL,
|
||||||
|
/* dItemNo_Randomizer_SMELL_PUMPKIN_e */ SETYPE_ITEM_GET_SMELL,
|
||||||
|
/* dItemNo_Randomizer_SMELL_POH_e */ SETYPE_ITEM_GET_SMELL,
|
||||||
|
/* dItemNo_Randomizer_SMELL_FISH_e */ SETYPE_ITEM_GET_SMELL,
|
||||||
|
/* dItemNo_Randomizer_SMELL_CHILDREN_e */ SETYPE_ITEM_GET_SMELL,
|
||||||
|
/* dItemNo_Randomizer_SMELL_MEDICINE_e */ SETYPE_ITEM_GET_SMELL,
|
||||||
|
/* dItemNo_Randomizer_NOENTRY_182_e */ SETYPE_ITEM_GET_MINI,
|
||||||
|
/* dItemNo_Randomizer_NOENTRY_183_e */ SETYPE_ITEM_GET_MINI,
|
||||||
|
/* dItemNo_Randomizer_NOENTRY_184_e */ SETYPE_ITEM_GET_MINI,
|
||||||
|
/* dItemNo_Randomizer_NOENTRY_185_e */ SETYPE_ITEM_GET_MINI,
|
||||||
|
/* dItemNo_Randomizer_NOENTRY_186_e */ SETYPE_ITEM_GET_MINI,
|
||||||
|
/* dItemNo_Randomizer_NOENTRY_187_e */ SETYPE_ITEM_GET_MINI,
|
||||||
|
/* dItemNo_Randomizer_NOENTRY_188_e */ SETYPE_ITEM_GET_MINI,
|
||||||
|
/* dItemNo_Randomizer_NOENTRY_189_e */ SETYPE_ITEM_GET_MINI,
|
||||||
|
/* dItemNo_Randomizer_NOENTRY_190_e */ SETYPE_ITEM_GET_MINI,
|
||||||
|
/* dItemNo_Randomizer_NOENTRY_191_e */ SETYPE_ITEM_GET_MINI,
|
||||||
|
/* dItemNo_Randomizer_M_BEETLE_e */ SETYPE_ITEM_GET_INSECT,
|
||||||
|
/* dItemNo_Randomizer_F_BEETLE_e */ SETYPE_ITEM_GET_INSECT,
|
||||||
|
/* dItemNo_Randomizer_M_BUTTERFLY_e */ SETYPE_ITEM_GET_INSECT,
|
||||||
|
/* dItemNo_Randomizer_F_BUTTERFLY_e */ SETYPE_ITEM_GET_INSECT,
|
||||||
|
/* dItemNo_Randomizer_M_STAG_BEETLE_e */ SETYPE_ITEM_GET_INSECT,
|
||||||
|
/* dItemNo_Randomizer_F_STAG_BEETLE_e */ SETYPE_ITEM_GET_INSECT,
|
||||||
|
/* dItemNo_Randomizer_M_GRASSHOPPER_e */ SETYPE_ITEM_GET_INSECT,
|
||||||
|
/* dItemNo_Randomizer_F_GRASSHOPPER_e */ SETYPE_ITEM_GET_INSECT,
|
||||||
|
/* dItemNo_Randomizer_M_NANAFUSHI_e */ SETYPE_ITEM_GET_INSECT,
|
||||||
|
/* dItemNo_Randomizer_F_NANAFUSHI_e */ SETYPE_ITEM_GET_INSECT,
|
||||||
|
/* dItemNo_Randomizer_M_DANGOMUSHI_e */ SETYPE_ITEM_GET_INSECT,
|
||||||
|
/* dItemNo_Randomizer_F_DANGOMUSHI_e */ SETYPE_ITEM_GET_INSECT,
|
||||||
|
/* dItemNo_Randomizer_M_MANTIS_e */ SETYPE_ITEM_GET_INSECT,
|
||||||
|
/* dItemNo_Randomizer_F_MANTIS_e */ SETYPE_ITEM_GET_INSECT,
|
||||||
|
/* dItemNo_Randomizer_M_LADYBUG_e */ SETYPE_ITEM_GET_INSECT,
|
||||||
|
/* dItemNo_Randomizer_F_LADYBUG_e */ SETYPE_ITEM_GET_INSECT,
|
||||||
|
/* dItemNo_Randomizer_M_SNAIL_e */ SETYPE_ITEM_GET_INSECT,
|
||||||
|
/* dItemNo_Randomizer_F_SNAIL_e */ SETYPE_ITEM_GET_INSECT,
|
||||||
|
/* dItemNo_Randomizer_M_DRAGONFLY_e */ SETYPE_ITEM_GET_INSECT,
|
||||||
|
/* dItemNo_Randomizer_F_DRAGONFLY_e */ SETYPE_ITEM_GET_INSECT,
|
||||||
|
/* dItemNo_Randomizer_M_ANT_e */ SETYPE_ITEM_GET_INSECT,
|
||||||
|
/* dItemNo_Randomizer_F_ANT_e */ SETYPE_ITEM_GET_INSECT,
|
||||||
|
/* dItemNo_Randomizer_M_MAYFLY_e */ SETYPE_ITEM_GET_INSECT,
|
||||||
|
/* dItemNo_Randomizer_F_MAYFLY_e */ SETYPE_ITEM_GET_INSECT,
|
||||||
|
/* dItemNo_Randomizer_NOENTRY_216_e */ SETYPE_ITEM_GET,
|
||||||
|
/* dItemNo_Randomizer_NOENTRY_217_e */ SETYPE_ITEM_GET,
|
||||||
|
/* dItemNo_Randomizer_NOENTRY_218_e */ SETYPE_ITEM_GET,
|
||||||
|
/* dItemNo_Randomizer_NOENTRY_219_e */ SETYPE_ITEM_GET,
|
||||||
|
/* dItemNo_Randomizer_NOENTRY_220_e */ SETYPE_ITEM_GET,
|
||||||
|
/* dItemNo_Randomizer_NOENTRY_221_e */ SETYPE_ITEM_GET,
|
||||||
|
/* dItemNo_Randomizer_NOENTRY_222_e */ SETYPE_ITEM_GET,
|
||||||
|
/* dItemNo_Randomizer_NOENTRY_223_e */ SETYPE_ITEM_GET,
|
||||||
|
/* dItemNo_Randomizer_POU_SPIRIT_e */ SETYPE_ITEM_GET_POU,
|
||||||
|
/* dItemNo_Randomizer_NOENTRY_225_e */ SETYPE_ITEM_GET,
|
||||||
|
/* dItemNo_Randomizer_NOENTRY_226_e */ SETYPE_ITEM_GET,
|
||||||
|
/* dItemNo_Randomizer_NOENTRY_227_e */ SETYPE_ITEM_GET,
|
||||||
|
/* dItemNo_Randomizer_NOENTRY_228_e */ SETYPE_ITEM_GET,
|
||||||
|
/* dItemNo_Randomizer_NOENTRY_229_e */ SETYPE_ITEM_GET,
|
||||||
|
/* dItemNo_Randomizer_NOENTRY_230_e */ SETYPE_ITEM_GET,
|
||||||
|
/* dItemNo_Randomizer_NOENTRY_231_e */ SETYPE_ITEM_GET,
|
||||||
|
/* dItemNo_Randomizer_NOENTRY_232_e */ SETYPE_ITEM_GET,
|
||||||
|
/* dItemNo_Randomizer_ANCIENT_DOCUMENT_e */ SETYPE_ITEM_GET_MINI,
|
||||||
|
/* dItemNo_Randomizer_AIR_LETTER_e */ SETYPE_ITEM_GET_MINI,
|
||||||
|
/* dItemNo_Randomizer_ANCIENT_DOCUMENT2_e */ SETYPE_ITEM_GET,
|
||||||
|
/* dItemNo_Randomizer_LV7_DUNGEON_EXIT_e */ SETYPE_ITEM_GET_MINI,
|
||||||
|
/* dItemNo_Randomizer_LINKS_SAVINGS_e */ SETYPE_ITEM_GET_MINI,
|
||||||
|
/* dItemNo_Randomizer_SMALL_KEY2_e */ SETYPE_ITEM_GET_MINI,
|
||||||
|
/* dItemNo_Randomizer_POU_FIRE1_e */ SETYPE_NONE,
|
||||||
|
/* dItemNo_Randomizer_POU_FIRE2_e */ SETYPE_NONE,
|
||||||
|
/* dItemNo_Randomizer_POU_FIRE3_e */ SETYPE_NONE,
|
||||||
|
/* dItemNo_Randomizer_POU_FIRE4_e */ SETYPE_NONE,
|
||||||
|
/* dItemNo_Randomizer_BOSSRIDER_KEY_e */ SETYPE_ITEM_GET_MINI,
|
||||||
|
/* dItemNo_Randomizer_TOMATO_PUREE_e */ SETYPE_ITEM_GET_ME,
|
||||||
|
/* dItemNo_Randomizer_TASTE_e */ SETYPE_ITEM_GET_ME,
|
||||||
|
/* dItemNo_Randomizer_LV5_BOSS_KEY_e */ SETYPE_ITEM_GET,
|
||||||
|
/* dItemNo_Randomizer_SURFBOARD_e */ SETYPE_NONE,
|
||||||
|
/* dItemNo_Randomizer_KANTERA2_e */ SETYPE_ITEM_GET_ME,
|
||||||
|
/* dItemNo_Randomizer_L2_KEY_PIECES1_e */ SETYPE_ITEM_GET_MINI,
|
||||||
|
/* dItemNo_Randomizer_L2_KEY_PIECES2_e */ SETYPE_ITEM_GET_MINI,
|
||||||
|
/* dItemNo_Randomizer_L2_KEY_PIECES3_e */ SETYPE_ITEM_GET_MINI,
|
||||||
|
/* dItemNo_Randomizer_KEY_OF_CARAVAN_e */ SETYPE_ITEM_GET_MINI,
|
||||||
|
/* dItemNo_Randomizer_LV2_BOSS_KEY_e */ SETYPE_ITEM_GET,
|
||||||
|
/* dItemNo_Randomizer_KEY_OF_FILONE_e */ SETYPE_ITEM_GET_MINI,
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
static u32 const bgmLabel[8] = {
|
static u32 const bgmLabel[8] = {
|
||||||
Z2BGM_HEART_GET, Z2BGM_ITEM_GET, Z2BGM_ITEM_GET_MINI, Z2BGM_ITEM_GET_ME,
|
Z2BGM_HEART_GET, Z2BGM_ITEM_GET, Z2BGM_ITEM_GET_MINI, Z2BGM_ITEM_GET_ME,
|
||||||
Z2BGM_ITEM_GET_INSECT, Z2BGM_ITEM_GET_SMELL, Z2BGM_ITEM_GET_POU, Z2BGM_ITEM_GET_ME_S,
|
Z2BGM_ITEM_GET_INSECT, Z2BGM_ITEM_GET_SMELL, Z2BGM_ITEM_GET_POU, Z2BGM_ITEM_GET_ME_S,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#if TARGET_PC
|
||||||
|
u32 se_type = randomizer_IsActive() ? getSeTypeRandomizer[i_itemNo] : getSeType[i_itemNo];
|
||||||
|
#else
|
||||||
u32 se_type = getSeType[i_itemNo];
|
u32 se_type = getSeType[i_itemNo];
|
||||||
|
#endif
|
||||||
|
|
||||||
if (se_type == SETYPE_ITEM_GET_ME && mProcVar4.field_0x3010 == 0) {
|
if (se_type == SETYPE_ITEM_GET_ME && mProcVar4.field_0x3010 == 0) {
|
||||||
se_type = SETYPE_ITEM_GET_ME_S;
|
se_type = SETYPE_ITEM_GET_ME_S;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (se_type != SETYPE_NONE) {
|
if (se_type != SETYPE_NONE IF_DUSK(|| i_itemNo == dItemNo_Randomizer_FOOLISH_ITEM_e)) {
|
||||||
mDoAud_subBgmStart(bgmLabel[se_type]);
|
mDoAud_subBgmStart(bgmLabel[se_type]);
|
||||||
dComIfGp_setMesgBgmOn();
|
dComIfGp_setMesgBgmOn();
|
||||||
}
|
}
|
||||||
@@ -2260,6 +2541,15 @@ int daAlink_c::procCoGetItemInit() {
|
|||||||
s16 var_r22 = 0;
|
s16 var_r22 = 0;
|
||||||
BOOL var_r31 = FALSE;
|
BOOL var_r31 = FALSE;
|
||||||
BOOL var_r30 = FALSE;
|
BOOL var_r30 = FALSE;
|
||||||
|
#if TARGET_PC
|
||||||
|
if (randomizer_IsActive()) {
|
||||||
|
// If we are giving a custom item, we want to set mParam0 to 0x100 so that instead of trying to search for an item
|
||||||
|
// actor that doesnt exist we want the game to create one using the item id in mGtItm.
|
||||||
|
if (g_randomizerState.getGiveItemToPlayerStatus() == RandomizerState::ITEM_IN_QUEUE) {
|
||||||
|
mDemo.setParam0(0x100);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
if (mProcID == PROC_GET_ITEM || mProcID == PROC_INSECT_CATCH ||
|
if (mProcID == PROC_GET_ITEM || mProcID == PROC_INSECT_CATCH ||
|
||||||
(mProcID == PROC_PREACTION_UNEQUIP && !checkNoUpperAnime()))
|
(mProcID == PROC_PREACTION_UNEQUIP && !checkNoUpperAnime()))
|
||||||
{
|
{
|
||||||
@@ -2297,6 +2587,11 @@ int daAlink_c::procCoGetItemInit() {
|
|||||||
} else {
|
} else {
|
||||||
item_no = dComIfGp_event_getGtItm();
|
item_no = dComIfGp_event_getGtItm();
|
||||||
}
|
}
|
||||||
|
#if TARGET_PC
|
||||||
|
if (randomizer_IsActive() && g_randomizerState.getGiveItemToPlayerStatus() == RandomizerState::ITEM_IN_QUEUE) {
|
||||||
|
g_randomizerState.setGiveItemToPlayerStatus(RandomizerState::CLEAR_QUEUE);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
fpc_ProcID item_partner_id = fopAcM_createItemForPresentDemo(¤t.pos, item_no, 0, -1,
|
fpc_ProcID item_partner_id = fopAcM_createItemForPresentDemo(¤t.pos, item_no, 0, -1,
|
||||||
fopAcM_GetRoomNo(this), NULL, NULL);
|
fopAcM_GetRoomNo(this), NULL, NULL);
|
||||||
@@ -2524,8 +2819,10 @@ int daAlink_c::procCoGetItem() {
|
|||||||
} else if (mProcVar2.field_0x300c == 0x23 && checkStageName("D_MN11")) {
|
} else if (mProcVar2.field_0x300c == 0x23 && checkStageName("D_MN11")) {
|
||||||
field_0x32cc = 0x5C0;
|
field_0x32cc = 0x5C0;
|
||||||
} else if (mProcVar2.field_0x300c == 0xE0) {
|
} else if (mProcVar2.field_0x300c == 0xE0) {
|
||||||
if (dComIfGs_getPohSpiritNum() == 20) {
|
// Don't show special text in rando
|
||||||
|
if (dComIfGs_getPohSpiritNum() == 20 IF_DUSK(&& !randomizer_IsActive())) {
|
||||||
field_0x32cc = 0x4CF;
|
field_0x32cc = 0x4CF;
|
||||||
|
// Rando gives poe soul after the text, so it'll never hit this
|
||||||
} else if (dComIfGs_getPohSpiritNum() == 60) {
|
} else if (dComIfGs_getPohSpiritNum() == 60) {
|
||||||
field_0x32cc = 0x4D0;
|
field_0x32cc = 0x4D0;
|
||||||
} else {
|
} else {
|
||||||
@@ -4555,6 +4852,13 @@ int daAlink_c::procCoWarpInit(int param_0, int param_1) {
|
|||||||
(checkItemGet(dItemNo_DUNGEON_BACK_e, 1) &&
|
(checkItemGet(dItemNo_DUNGEON_BACK_e, 1) &&
|
||||||
strcmp(stageName, dComIfGs_getWarpStageName()) == 0))
|
strcmp(stageName, dComIfGs_getWarpStageName()) == 0))
|
||||||
{
|
{
|
||||||
|
#if TARGET_PC
|
||||||
|
// In rando, only clear the Ooccoo slot if Ooccoo is in it
|
||||||
|
u8 ooccooSlot = dComIfGs_getItem(SLOT_18, false);
|
||||||
|
if (!randomizer_IsActive() || ooccooSlot == dItemNo_Randomizer_DUNGEON_EXIT_e ||
|
||||||
|
ooccooSlot == dItemNo_Randomizer_DUNGEON_EXIT_2_e ||
|
||||||
|
ooccooSlot == dItemNo_Randomizer_LV7_DUNGEON_EXIT_e)
|
||||||
|
#endif
|
||||||
dComIfGs_setItem(SLOT_18, dItemNo_NONE_e);
|
dComIfGs_setItem(SLOT_18, dItemNo_NONE_e);
|
||||||
dComIfGs_resetLastWarpAcceptStage();
|
dComIfGs_resetLastWarpAcceptStage();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1191,6 +1191,19 @@ void daAlink_c::setLightningSwordEffect() {
|
|||||||
emitter = setEmitter(&field_0x327c[i], effName[i], ¤t.pos, &shape_angle);
|
emitter = setEmitter(&field_0x327c[i], effName[i], ¤t.pos, &shape_angle);
|
||||||
if (emitter != NULL) {
|
if (emitter != NULL) {
|
||||||
emitter->setGlobalRTMatrix(mSwordModel->getBaseTRMtx());
|
emitter->setGlobalRTMatrix(mSwordModel->getBaseTRMtx());
|
||||||
|
#if TARGET_PC
|
||||||
|
// Apply custom light sword glow if applicable
|
||||||
|
const auto& lightSwordGlowColor = dusk::getSettings().cosmetics.lightSwordGlowColor.getValue();
|
||||||
|
if (dusk::cosmetics::is_valid_hex_color_str(lightSwordGlowColor)) {
|
||||||
|
GXColor color = dusk::cosmetics::hex_color_str_to_gx_color(lightSwordGlowColor);
|
||||||
|
emitter->setGlobalEnvColor(color.r, color.g, color.b);
|
||||||
|
emitter->setGlobalPrmColor(color.r, color.g, color.b);
|
||||||
|
} else if (lightSwordGlowColor == "Rainbow") {
|
||||||
|
GXColor color = dusk::cosmetics::get_rainbow_rgb(127.5f);
|
||||||
|
emitter->setGlobalEnvColor(color.r, color.g, color.b);
|
||||||
|
emitter->setGlobalPrmColor(color.r, color.g, color.b);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -6889,6 +6889,31 @@ void daAlink_c::setWolfLockDomeModel() {
|
|||||||
} else {
|
} else {
|
||||||
field_0x0724->setFrame(0.0f);
|
field_0x0724->setFrame(0.0f);
|
||||||
}
|
}
|
||||||
|
#if TARGET_PC
|
||||||
|
// Replace charge ring color
|
||||||
|
const auto& domeRingColorStr = dusk::getSettings().cosmetics.midnaChargeRingColor.getValue();
|
||||||
|
if (dusk::cosmetics::is_valid_hex_color_str(domeRingColorStr)) {
|
||||||
|
auto domeRingColor = dusk::cosmetics::hex_color_str_to_gx_color(domeRingColorStr);
|
||||||
|
const u8 domeWave1RGBA[3] = {domeRingColor.r, domeRingColor.g, domeRingColor.b};
|
||||||
|
const u8 domeWave2RGBA[3] = {domeRingColor.r, domeRingColor.g, domeRingColor.b};
|
||||||
|
u8** chromaRegisterTable = reinterpret_cast<u8**>(daAlink_getAlinkActorClass()->getDomeLockChromaTable());
|
||||||
|
|
||||||
|
for (int i = 0; i < 3; i++)
|
||||||
|
{
|
||||||
|
u8* currentTable = chromaRegisterTable[i];
|
||||||
|
const u8 currentWave1Color = domeWave1RGBA[i];
|
||||||
|
const u8 currentWave2Color = domeWave2RGBA[i];
|
||||||
|
const u8 currentBaseColor = (currentWave1Color + currentWave2Color) / 2;
|
||||||
|
|
||||||
|
currentTable[0x3] = currentBaseColor; // Set Alpha for the ring base
|
||||||
|
currentTable[0x13] = currentWave1Color; // Set Alpha for ring wave 1
|
||||||
|
currentTable[0x23] = currentWave2Color; // Set Alpha for ring wave 2
|
||||||
|
currentTable[0xB] = currentBaseColor; // Set Alpha for darkworld ring base
|
||||||
|
currentTable[0x1B] = currentWave1Color; // Set Alpha for darkworld ring wave 1
|
||||||
|
currentTable[0x2B] = currentWave2Color; // Set Alpha for darkworld ring wave 2
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void daAlink_c::setWolfBallModel() {
|
void daAlink_c::setWolfBallModel() {
|
||||||
|
|||||||
@@ -18,6 +18,11 @@
|
|||||||
#include "c/c_damagereaction.h"
|
#include "c/c_damagereaction.h"
|
||||||
#include <cmath>
|
#include <cmath>
|
||||||
|
|
||||||
|
#if TARGET_PC
|
||||||
|
#include "dusk/randomizer/game/randomizer_context.hpp"
|
||||||
|
#include "dusk/randomizer/game/tools.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
enum B_bq_RES_File_ID {
|
enum B_bq_RES_File_ID {
|
||||||
/* BCK */
|
/* BCK */
|
||||||
/* 0x07 */ BCK_BQ_APPEAR = 0x7,
|
/* 0x07 */ BCK_BQ_APPEAR = 0x7,
|
||||||
@@ -896,6 +901,11 @@ static void b_bq_end(b_bq_class* i_this) {
|
|||||||
i_this->mMode = 1;
|
i_this->mMode = 1;
|
||||||
|
|
||||||
int sw = fopAcM_GetParam(a_this) >> 0x18;
|
int sw = fopAcM_GetParam(a_this) >> 0x18;
|
||||||
|
#if TARGET_PC
|
||||||
|
if (randomizer_IsActive()) {
|
||||||
|
checkTransformFromWolf(); // If the player is wolf, they will softlock after the defeat cutscene is completed.
|
||||||
|
}
|
||||||
|
#endif
|
||||||
dComIfGs_onSwitch(sw, fopAcM_GetRoomNo(a_this));
|
dComIfGs_onSwitch(sw, fopAcM_GetRoomNo(a_this));
|
||||||
// fallthrough
|
// fallthrough
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -19,6 +19,10 @@
|
|||||||
#include "f_op/f_op_actor_enemy.h"
|
#include "f_op/f_op_actor_enemy.h"
|
||||||
#include "Z2AudioLib/Z2Instances.h"
|
#include "Z2AudioLib/Z2Instances.h"
|
||||||
|
|
||||||
|
#if TARGET_PC
|
||||||
|
#include "dusk/randomizer/game/randomizer_context.hpp"
|
||||||
|
#endif
|
||||||
|
|
||||||
enum daB_DS_Joint {
|
enum daB_DS_Joint {
|
||||||
DS_JNT_BACKBONE1,
|
DS_JNT_BACKBONE1,
|
||||||
DS_JNT_BACKBONE2,
|
DS_JNT_BACKBONE2,
|
||||||
@@ -4084,6 +4088,15 @@ void daB_DS_c::executeBattle2Dead() {
|
|||||||
camera->mCamera.SetTrimSize(0);
|
camera->mCamera.SetTrimSize(0);
|
||||||
dComIfGp_event_reset();
|
dComIfGp_event_reset();
|
||||||
dComIfGs_onStageBossEnemy(0x13);
|
dComIfGs_onStageBossEnemy(0x13);
|
||||||
|
#if TARGET_PC
|
||||||
|
if (randomizer_IsActive()) {
|
||||||
|
// Give the boss item
|
||||||
|
u8 agDungeonReward = randomizer_getItemAtLocation("Arbiters Grounds Dungeon Reward");
|
||||||
|
g_randomizerState.addItemToEventQueue(agDungeonReward);
|
||||||
|
// Set custom item flag
|
||||||
|
dComIfGs_onItem(0x9E, -1);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
/* dSv_event_flag_c::F_0265 - Arbiter's Grounds - Arbiter's Grounds clear */
|
/* dSv_event_flag_c::F_0265 - Arbiter's Grounds - Arbiter's Grounds clear */
|
||||||
dComIfGs_onEventBit(0x2010);
|
dComIfGs_onEventBit(0x2010);
|
||||||
fopAcM_delete(this);
|
fopAcM_delete(this);
|
||||||
|
|||||||
@@ -15,6 +15,10 @@
|
|||||||
#include "Z2AudioLib/Z2Instances.h"
|
#include "Z2AudioLib/Z2Instances.h"
|
||||||
#include <cstring>
|
#include <cstring>
|
||||||
|
|
||||||
|
#if TARGET_PC
|
||||||
|
#include "dusk/randomizer/game/randomizer_context.hpp"
|
||||||
|
#endif
|
||||||
|
|
||||||
static cXyz l_player_offset = cXyz(0.0f, 115.0f, 54.0f);
|
static cXyz l_player_offset = cXyz(0.0f, 115.0f, 54.0f);
|
||||||
|
|
||||||
static cXyz l_wolf_offset = cXyz(13.0f, 135.0f, 57.0f);
|
static cXyz l_wolf_offset = cXyz(13.0f, 135.0f, 57.0f);
|
||||||
@@ -530,6 +534,33 @@ int daDitem_c::execute() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
mSound.framework(0, dComIfGp_getReverb(fopAcM_GetRoomNo(this)));
|
mSound.framework(0, dComIfGp_getReverb(fopAcM_GetRoomNo(this)));
|
||||||
|
|
||||||
|
#if TARGET_PC
|
||||||
|
// Certain items use field models that are too big to fit in link's hands so we want to scale them down to fit.
|
||||||
|
if (randomizer_IsActive()) {
|
||||||
|
switch (m_itemNo)
|
||||||
|
{
|
||||||
|
case dItemNo_Randomizer_MIRROR_PIECE_1_e:
|
||||||
|
case dItemNo_Randomizer_MIRROR_PIECE_2_e:
|
||||||
|
case dItemNo_Randomizer_MIRROR_PIECE_3_e:
|
||||||
|
case dItemNo_Randomizer_MIRROR_PIECE_4_e:
|
||||||
|
{
|
||||||
|
scale.x = 0.05f;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case dItemNo_Randomizer_MASTER_SWORD_e:
|
||||||
|
case dItemNo_Randomizer_LIGHT_SWORD_e:
|
||||||
|
{
|
||||||
|
scale.x = 0.001f;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -10,6 +10,9 @@
|
|||||||
#include "d/actor/d_a_midna.h"
|
#include "d/actor/d_a_midna.h"
|
||||||
#include "d/d_door_param2.h"
|
#include "d/d_door_param2.h"
|
||||||
#include "d/actor/d_a_player.h"
|
#include "d/actor/d_a_player.h"
|
||||||
|
#if TARGET_PC
|
||||||
|
#include "d/actor/d_a_alink.h"
|
||||||
|
#endif
|
||||||
#include "d/d_com_inf_game.h"
|
#include "d/d_com_inf_game.h"
|
||||||
#include "d/d_msg_object.h"
|
#include "d/d_msg_object.h"
|
||||||
#include "d/d_map_path_dmap.h"
|
#include "d/d_map_path_dmap.h"
|
||||||
@@ -20,6 +23,7 @@
|
|||||||
#if TARGET_PC
|
#if TARGET_PC
|
||||||
#include <f_ap/f_ap_game.h>
|
#include <f_ap/f_ap_game.h>
|
||||||
#include <dusk/autosave.h>
|
#include <dusk/autosave.h>
|
||||||
|
#include "dusk/randomizer/game/randomizer_context.hpp"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
char DUSK_CONST* daDoor20_c::getStopBmdName() {
|
char DUSK_CONST* daDoor20_c::getStopBmdName() {
|
||||||
@@ -313,7 +317,16 @@ int daDoor20_c::checkOpenMsgDoor(int* param_1) {
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
field_0x624.init(NULL, msgNo, 0, NULL);
|
field_0x624.init(NULL, msgNo, 0, NULL);
|
||||||
|
#if TARGET_PC
|
||||||
|
int rv = 1;
|
||||||
|
|
||||||
|
// If we are in SPR, we don't want Yeta's msg flow to prevent us from opening the door if we haven't talked to her.
|
||||||
|
if (randomizer_IsActive() && !daAlink_c::checkStageName("D_MN11")) {
|
||||||
|
rv = field_0x624.checkOpenDoor(this, param_1);
|
||||||
|
}
|
||||||
|
#else
|
||||||
int rv = field_0x624.checkOpenDoor(this, param_1);
|
int rv = field_0x624.checkOpenDoor(this, param_1);
|
||||||
|
#endif
|
||||||
dMsgObject_endFlowGroup();
|
dMsgObject_endFlowGroup();
|
||||||
return rv;
|
return rv;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -11,6 +11,11 @@
|
|||||||
#include "f_op/f_op_actor_enemy.h"
|
#include "f_op/f_op_actor_enemy.h"
|
||||||
#include <cstring>
|
#include <cstring>
|
||||||
|
|
||||||
|
#if TARGET_PC
|
||||||
|
#include "dusk/randomizer/game/randomizer_context.hpp"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
class daE_HP_HIO_c : public JORReflexible {
|
class daE_HP_HIO_c : public JORReflexible {
|
||||||
public:
|
public:
|
||||||
daE_HP_HIO_c();
|
daE_HP_HIO_c();
|
||||||
@@ -726,11 +731,16 @@ void daE_HP_c::executeDead() {
|
|||||||
fopAcM_onSwitch(this, bitSw);
|
fopAcM_onSwitch(this, bitSw);
|
||||||
}
|
}
|
||||||
|
|
||||||
dComIfGs_addPohSpiritNum();
|
#if TARGET_PC
|
||||||
|
if (randomizer_IsActive()) {
|
||||||
|
g_randomizerState.handlePoeItem(bitSw);
|
||||||
|
} else
|
||||||
|
#endif
|
||||||
|
dComIfGs_addPohSpiritNum();
|
||||||
|
|
||||||
field_0x784 = -1;
|
field_0x784 = -1;
|
||||||
|
|
||||||
if (dComIfGs_getPohSpiritNum() == 20) {
|
if (dComIfGs_getPohSpiritNum() == 20 IF_DUSK(&& !randomizer_IsActive())) {
|
||||||
dComIfGs_onEventBit(dSv_event_flag_c::saveBitLabels[0x1c9]);
|
dComIfGs_onEventBit(dSv_event_flag_c::saveBitLabels[0x1c9]);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -752,7 +762,7 @@ void daE_HP_c::executeDead() {
|
|||||||
field_0x788 = 1;
|
field_0x788 = 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if (field_0x788 != 0) {
|
} else if (field_0x788 != 0 IF_DUSK(|| randomizer_IsActive())) {
|
||||||
fopAcM_createDisappear(this, ¤t.pos, 8, 3, 0xff);
|
fopAcM_createDisappear(this, ¤t.pos, 8, 3, 0xff);
|
||||||
fopAcM_delete(this);
|
fopAcM_delete(this);
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -10,6 +10,10 @@
|
|||||||
#include "d/d_s_play.h"
|
#include "d/d_s_play.h"
|
||||||
#include "c/c_damagereaction.h"
|
#include "c/c_damagereaction.h"
|
||||||
|
|
||||||
|
#if TARGET_PC
|
||||||
|
#include "dusk/randomizer/game/randomizer_context.hpp"
|
||||||
|
#endif
|
||||||
|
|
||||||
enum daE_MD_TYPE {
|
enum daE_MD_TYPE {
|
||||||
TYPE_DUMMY,
|
TYPE_DUMMY,
|
||||||
TYPE_REAL,
|
TYPE_REAL,
|
||||||
@@ -396,7 +400,10 @@ inline int daE_MD_c::create() {
|
|||||||
int phase_state = dComIfG_resLoad(&mPhase, "E_MD");
|
int phase_state = dComIfG_resLoad(&mPhase, "E_MD");
|
||||||
if (phase_state == cPhs_COMPLEATE_e) {
|
if (phase_state == cPhs_COMPLEATE_e) {
|
||||||
OS_REPORT("E_MD PARAM %x\n", fopAcM_GetParam(this));
|
OS_REPORT("E_MD PARAM %x\n", fopAcM_GetParam(this));
|
||||||
if (cDmr_SkipInfo != 0 && current.pos.z > -1500.0f) {
|
|
||||||
|
// Always create the armor in rando (otherwise ball and chain won't spawn
|
||||||
|
// if the player leaves and re-enters without getting it)
|
||||||
|
if (cDmr_SkipInfo != 0 && current.pos.z > -1500.0f IF_DUSK(&& !randomizer_IsActive())) {
|
||||||
return cPhs_ERROR_e;
|
return cPhs_ERROR_e;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -21,7 +21,11 @@
|
|||||||
#include "Z2AudioLib/Z2Instances.h"
|
#include "Z2AudioLib/Z2Instances.h"
|
||||||
#include <cstring>
|
#include <cstring>
|
||||||
|
|
||||||
|
#if TARGET_PC
|
||||||
|
#include "dusk/randomizer/game/randomizer_context.hpp"
|
||||||
|
#include "dusk/randomizer/game/tools.h"
|
||||||
#include "dusk/version.hpp"
|
#include "dusk/version.hpp"
|
||||||
|
#endif
|
||||||
|
|
||||||
class daE_MK_HIO_c : public JORReflexible {
|
class daE_MK_HIO_c : public JORReflexible {
|
||||||
public:
|
public:
|
||||||
@@ -1730,6 +1734,11 @@ static void demo_camera_end(e_mk_class* i_this) {
|
|||||||
work.z = AREG_F(2) + -20.0f;
|
work.z = AREG_F(2) + -20.0f;
|
||||||
MtxPosition(&work, &pos);
|
MtxPosition(&work, &pos);
|
||||||
pos += i_this->crownPos;
|
pos += i_this->crownPos;
|
||||||
|
#if TARGET_PC
|
||||||
|
if (randomizer_IsActive()) {
|
||||||
|
checkTransformFromWolf(); // If the player is wolf, they will void and lose the boomerang check.
|
||||||
|
}
|
||||||
|
#endif
|
||||||
fopAcM_createDisappear(actor, &pos, 5, 0, 0xff);
|
fopAcM_createDisappear(actor, &pos, 5, 0, 0xff);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -14,6 +14,10 @@
|
|||||||
#include "Z2AudioLib/Z2Instances.h"
|
#include "Z2AudioLib/Z2Instances.h"
|
||||||
#include <cstring>
|
#include <cstring>
|
||||||
|
|
||||||
|
#if TARGET_PC
|
||||||
|
#include "dusk/randomizer/game/randomizer_context.hpp"
|
||||||
|
#include "dusk/randomizer/game/tools.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
static s16 mAttackNo = 3;
|
static s16 mAttackNo = 3;
|
||||||
|
|
||||||
@@ -1132,11 +1136,17 @@ static void e_po_dead(e_po_class* i_this) {
|
|||||||
camera_player->mCamera.Start();
|
camera_player->mCamera.Start();
|
||||||
camera_player->mCamera.SetTrimSize(0);
|
camera_player->mCamera.SetTrimSize(0);
|
||||||
dComIfGp_event_reset();
|
dComIfGp_event_reset();
|
||||||
dComIfGs_addPohSpiritNum();
|
#if TARGET_PC
|
||||||
|
if (!randomizer_IsActive()) {
|
||||||
|
#endif
|
||||||
|
dComIfGs_addPohSpiritNum();
|
||||||
#if !PLATFORM_SHIELD
|
#if !PLATFORM_SHIELD
|
||||||
if (dComIfGs_getPohSpiritNum() == 0x14) {
|
if (dComIfGs_getPohSpiritNum() == 0x14) {
|
||||||
/* dSv_event_flag_c::F_0457 - Castle Town - Revived cat */
|
/* dSv_event_flag_c::F_0457 - Castle Town - Revived cat */
|
||||||
dComIfGs_onEventBit(dSv_event_flag_c::saveBitLabels[457]);
|
dComIfGs_onEventBit(dSv_event_flag_c::saveBitLabels[457]);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#if TARGET_PC
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
daPy_getPlayerActorClass()->cancelOriginalDemo();
|
daPy_getPlayerActorClass()->cancelOriginalDemo();
|
||||||
@@ -1265,6 +1275,14 @@ static void e_po_dead(e_po_class* i_this) {
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (i_this->field_0x75C == -1) {
|
if (i_this->field_0x75C == -1) {
|
||||||
|
#if TARGET_PC
|
||||||
|
if (randomizer_IsActive()) {
|
||||||
|
u16 key = getStageID() << 8 | i_this->BitSW;
|
||||||
|
u8 itemId = randomizer_GetContext().mPoeOverrides[key];
|
||||||
|
i_this->field_0x75C = fopAcM_createItemForPresentDemo(&a_this->current.pos, itemId, 0,
|
||||||
|
-1, -1, NULL, NULL);
|
||||||
|
} else
|
||||||
|
#endif
|
||||||
i_this->field_0x75C = fopAcM_createItemForPresentDemo(&a_this->current.pos, 0xE0, 0,
|
i_this->field_0x75C = fopAcM_createItemForPresentDemo(&a_this->current.pos, 0xE0, 0,
|
||||||
-1, -1, NULL, NULL);
|
-1, -1, NULL, NULL);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -204,7 +204,11 @@ static void e_rb_move(e_rb_class* i_this) {
|
|||||||
spC.x = i_this->field_0xa10.x - enemy->current.pos.x;
|
spC.x = i_this->field_0xa10.x - enemy->current.pos.x;
|
||||||
spC.z = i_this->field_0xa10.z - enemy->current.pos.z;
|
spC.z = i_this->field_0xa10.z - enemy->current.pos.z;
|
||||||
|
|
||||||
|
#if AVOID_UB
|
||||||
|
f32 speed_target{};
|
||||||
|
#else
|
||||||
f32 speed_target;
|
f32 speed_target;
|
||||||
|
#endif
|
||||||
switch (i_this->mode) {
|
switch (i_this->mode) {
|
||||||
case 0:
|
case 0:
|
||||||
i_this->mode = 1;
|
i_this->mode = 1;
|
||||||
|
|||||||
@@ -16,6 +16,11 @@
|
|||||||
#include "f_op/f_op_camera_mng.h"
|
#include "f_op/f_op_camera_mng.h"
|
||||||
#include <cstring>
|
#include <cstring>
|
||||||
|
|
||||||
|
#if TARGET_PC
|
||||||
|
#include "dusk/randomizer/game/randomizer_context.hpp"
|
||||||
|
#include "dusk/randomizer/game/verify_item_functions.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
class daE_RDB_HIO_c : public JORReflexible {
|
class daE_RDB_HIO_c : public JORReflexible {
|
||||||
public:
|
public:
|
||||||
daE_RDB_HIO_c();
|
daE_RDB_HIO_c();
|
||||||
@@ -1250,6 +1255,12 @@ static void demo_camera(e_rdb_class* i_this) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (iVar1 != 0) {
|
if (iVar1 != 0) {
|
||||||
|
#if TARGET_PC
|
||||||
|
if (randomizer_IsActive()) {
|
||||||
|
u8 itemId = verifyProgressiveItem(randomizer_getItemAtLocation("Hyrule Castle King Bulblin Key"));
|
||||||
|
daPy_getPlayerActorClass()->changeDemoMode(11, itemId, 0, 0);
|
||||||
|
} else // do the next line
|
||||||
|
#endif
|
||||||
daPy_getPlayerActorClass()->changeDemoMode(11, 32, 0, 0);
|
daPy_getPlayerActorClass()->changeDemoMode(11, 32, 0, 0);
|
||||||
i_this->mDemoMode = 12;
|
i_this->mDemoMode = 12;
|
||||||
i_this->field_0x10aa = 0;
|
i_this->field_0x10aa = 0;
|
||||||
|
|||||||
@@ -9,6 +9,10 @@
|
|||||||
#include "SSystem/SComponent/c_math.h"
|
#include "SSystem/SComponent/c_math.h"
|
||||||
#include "Z2AudioLib/Z2Instances.h"
|
#include "Z2AudioLib/Z2Instances.h"
|
||||||
#include "d/actor/d_a_player.h"
|
#include "d/actor/d_a_player.h"
|
||||||
|
#if TARGET_PC
|
||||||
|
#include "d/actor/d_a_alink.h"
|
||||||
|
#include "dusk/randomizer/game/randomizer_context.hpp"
|
||||||
|
#endif
|
||||||
#include "d/d_com_inf_game.h"
|
#include "d/d_com_inf_game.h"
|
||||||
#include "d/d_path.h"
|
#include "d/d_path.h"
|
||||||
#include "d/d_s_play.h"
|
#include "d/d_s_play.h"
|
||||||
@@ -1687,6 +1691,18 @@ static void demo_camera(e_s1_class* i_this) {
|
|||||||
if (i_this->mDemoTimer == 137) {
|
if (i_this->mDemoTimer == 137) {
|
||||||
if (!dComIfGs_isSwitch(i_this->mSwBit, fopAcM_GetRoomNo(a_this))) {
|
if (!dComIfGs_isSwitch(i_this->mSwBit, fopAcM_GetRoomNo(a_this))) {
|
||||||
dComIfGs_onSwitch(i_this->mSwBit, fopAcM_GetRoomNo(a_this));
|
dComIfGs_onSwitch(i_this->mSwBit, fopAcM_GetRoomNo(a_this));
|
||||||
|
#if TARGET_PC
|
||||||
|
if (randomizer_IsActive() && daAlink_c::checkStageName("F_SP126")) {
|
||||||
|
// We check to see if the flag being set is for the UZR portal as a safety precaution.
|
||||||
|
if (i_this->mSwBit == 0x15 && g_dComIfG_gameInfo.info.getSavedata().getPlayer().getPlayerStatusA().getTransformStatus())
|
||||||
|
{
|
||||||
|
// Set the flag to make Iza 1 available and set the memory bit for having talked to her after opening the portal as human.
|
||||||
|
dComIfGs_onEventBit(0xB02);
|
||||||
|
dComIfGs_onSwitch(0x37, fopAcM_GetRoomNo(a_this));
|
||||||
|
}
|
||||||
|
// Note for the above stuff. This works for now. Eventually would like to adjust this to a FLW patch since I think we could accomplish similar results by having the conversation continue as normal regardless of form, but I haven't looked into it that much.
|
||||||
|
}
|
||||||
|
#endif
|
||||||
OS_REPORT("S! BITSW %d\n", i_this->mSwBit);
|
OS_REPORT("S! BITSW %d\n", i_this->mSwBit);
|
||||||
OS_REPORT("S! BITSW %d\n", dComIfGs_isSwitch(i_this->mSwBit, fopAcM_GetRoomNo(a_this)));
|
OS_REPORT("S! BITSW %d\n", dComIfGs_isSwitch(i_this->mSwBit, fopAcM_GetRoomNo(a_this)));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -10,7 +10,10 @@
|
|||||||
#include "d/d_com_inf_game.h"
|
#include "d/d_com_inf_game.h"
|
||||||
#include "d/actor/d_a_player.h"
|
#include "d/actor/d_a_player.h"
|
||||||
#include "d/d_s_play.h"
|
#include "d/d_s_play.h"
|
||||||
|
#if TARGET_PC
|
||||||
|
#include "dusk/randomizer/game/randomizer_context.hpp"
|
||||||
|
#include "dusk/randomizer/game/verify_item_functions.h"
|
||||||
|
#endif
|
||||||
enum daE_TH_ACTION {
|
enum daE_TH_ACTION {
|
||||||
ACTION_STOP,
|
ACTION_STOP,
|
||||||
ACTION_SPIN,
|
ACTION_SPIN,
|
||||||
@@ -931,6 +934,12 @@ static void get_demo(e_th_ball_class* i_this) {
|
|||||||
case 0:
|
case 0:
|
||||||
break;
|
break;
|
||||||
case 1:
|
case 1:
|
||||||
|
#if TARGET_PC
|
||||||
|
if (randomizer_IsActive()) {
|
||||||
|
u8 itemId = verifyProgressiveItem(randomizer_getItemAtLocation("Snowpeak Ruins Ball and Chain"));
|
||||||
|
demo_id = fopAcM_createItemForTrBoxDemo(&i_this->current.pos, itemId, -1, fopAcM_GetRoomNo(i_this), NULL, NULL);
|
||||||
|
} else
|
||||||
|
#endif
|
||||||
demo_id = fopAcM_createItemForTrBoxDemo(&i_this->current.pos, dItemNo_IRONBALL_e, -1, fopAcM_GetRoomNo(i_this), NULL, NULL);
|
demo_id = fopAcM_createItemForTrBoxDemo(&i_this->current.pos, dItemNo_IRONBALL_e, -1, fopAcM_GetRoomNo(i_this), NULL, NULL);
|
||||||
JUT_ASSERT(1670, demo_id != fpcM_ERROR_PROCESS_ID_e);
|
JUT_ASSERT(1670, demo_id != fpcM_ERROR_PROCESS_ID_e);
|
||||||
i_this->mDemoMode = 2;
|
i_this->mDemoMode = 2;
|
||||||
|
|||||||
@@ -10,6 +10,10 @@
|
|||||||
#include "d/d_com_inf_game.h"
|
#include "d/d_com_inf_game.h"
|
||||||
#include "d/actor/d_a_spinner.h"
|
#include "d/actor/d_a_spinner.h"
|
||||||
|
|
||||||
|
#if TARGET_PC
|
||||||
|
#include "dusk/randomizer/game/randomizer_context.hpp"
|
||||||
|
#endif
|
||||||
|
|
||||||
static int daKytag08_Draw(kytag08_class* i_this) {
|
static int daKytag08_Draw(kytag08_class* i_this) {
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@@ -88,8 +92,17 @@ static int daKytag08_Execute(kytag08_class* i_this) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((daPy_getPlayerActorClass()->checkKandelaarSwing(TRUE) && i_this->mSizeTimer < 100) ||
|
#if TARGET_PC
|
||||||
dComIfGs_BossLife_public_Get() == 1)
|
bool doFogWipe = false;
|
||||||
|
if (randomizer_IsActive()) {
|
||||||
|
doFogWipe = ((i_this->mSizeTimer < 100) || dComIfGs_BossLife_public_Get() == 1);
|
||||||
|
}else {
|
||||||
|
doFogWipe = (daPy_getPlayerActorClass()->checkKandelaarSwing(TRUE) && i_this->mSizeTimer < 100) || dComIfGs_BossLife_public_Get() == 1;
|
||||||
|
}
|
||||||
|
if (doFogWipe)
|
||||||
|
#else
|
||||||
|
if ((daPy_getPlayerActorClass()->checkKandelaarSwing(TRUE) && i_this->mSizeTimer < 100) || dComIfGs_BossLife_public_Get() == 1)
|
||||||
|
#endif
|
||||||
{
|
{
|
||||||
dComIfGs_BossLife_public_Set(0);
|
dComIfGs_BossLife_public_Set(0);
|
||||||
i_this->mTargetAvoidPos = i_this->current.pos;
|
i_this->mTargetAvoidPos = i_this->current.pos;
|
||||||
|
|||||||
@@ -29,6 +29,7 @@
|
|||||||
#include "dusk/frame_interpolation.h"
|
#include "dusk/frame_interpolation.h"
|
||||||
#include "dusk/settings.h"
|
#include "dusk/settings.h"
|
||||||
#include "dusk/version.hpp"
|
#include "dusk/version.hpp"
|
||||||
|
#include "dusk/randomizer/game/randomizer_context.hpp"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
class dmg_rod_HIO_c : public JORReflexible {
|
class dmg_rod_HIO_c : public JORReflexible {
|
||||||
@@ -2955,6 +2956,10 @@ static void lure_heart(dmg_rod_class* i_this) {
|
|||||||
if (obj_life != NULL) {
|
if (obj_life != NULL) {
|
||||||
fopAcM_delete(obj_life);
|
fopAcM_delete(obj_life);
|
||||||
fopAcM_onItem(obj_life, 0x80);
|
fopAcM_onItem(obj_life, 0x80);
|
||||||
|
#if TARGET_PC
|
||||||
|
// Don't give the item here in rando. We give it later when the FLW message happens
|
||||||
|
if (!randomizer_IsActive())
|
||||||
|
#endif
|
||||||
execItemGet(dItemNo_KAKERA_HEART_e);
|
execItemGet(dItemNo_KAKERA_HEART_e);
|
||||||
u8 eventReg = dComIfGs_getEventReg(0xECFF);
|
u8 eventReg = dComIfGs_getEventReg(0xECFF);
|
||||||
eventReg |= (u8)0x40;
|
eventReg |= (u8)0x40;
|
||||||
@@ -4090,6 +4095,10 @@ static void uki_catch(dmg_rod_class* i_this) {
|
|||||||
} else if (mgfish->mCaughtType == MG_CATCH_BIN) {
|
} else if (mgfish->mCaughtType == MG_CATCH_BIN) {
|
||||||
i_this->msgflow.init(actor, 0x139A, 0, NULL);
|
i_this->msgflow.init(actor, 0x139A, 0, NULL);
|
||||||
dComIfGs_onEventBit(dSv_event_flag_c::saveBitLabels[468]);
|
dComIfGs_onEventBit(dSv_event_flag_c::saveBitLabels[468]);
|
||||||
|
#if TARGET_PC
|
||||||
|
// Don't give the item here in rando. We give it later in the FLW Message
|
||||||
|
if (!randomizer_IsActive())
|
||||||
|
#endif
|
||||||
dComIfGs_setEmptyBottle();
|
dComIfGs_setEmptyBottle();
|
||||||
} else if (mgfish->mCaughtType == MG_CATCH_KN) {
|
} else if (mgfish->mCaughtType == MG_CATCH_KN) {
|
||||||
i_this->msgflow.init(actor, 0x139C, 0, NULL);
|
i_this->msgflow.init(actor, 0x139C, 0, NULL);
|
||||||
@@ -4356,7 +4365,8 @@ static void uki_main(dmg_rod_class* i_this) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!dComIfGs_isEventBit(dSv_event_flag_c::saveBitLabels[468])) {
|
if (!dComIfGs_isEventBit(dSv_event_flag_c::saveBitLabels[468])) {
|
||||||
if (cM_rndF(1.0f) <= 0.5f) {
|
// Always succeed the rng check in rando for fishing bottle
|
||||||
|
if (cM_rndF(1.0f) <= 0.5f IF_DUSK(|| randomizer_IsActive())) {
|
||||||
cXyz bin_pos(6800.0f, 30.0f, -270.0f);
|
cXyz bin_pos(6800.0f, 30.0f, -270.0f);
|
||||||
bin_pos -= player->current.pos;
|
bin_pos -= player->current.pos;
|
||||||
|
|
||||||
|
|||||||
+35
-31
@@ -14,7 +14,11 @@
|
|||||||
#include "d/d_msg_object.h"
|
#include "d/d_msg_object.h"
|
||||||
#include "d/d_s_play.h"
|
#include "d/d_s_play.h"
|
||||||
#include "d/d_debug_viewer.h"
|
#include "d/d_debug_viewer.h"
|
||||||
|
|
||||||
|
#if TARGET_PC
|
||||||
#include "dusk/frame_interpolation.h"
|
#include "dusk/frame_interpolation.h"
|
||||||
|
#include "dusk/cosmetics/midna_hair_color.hpp"
|
||||||
|
#endif
|
||||||
|
|
||||||
static f32 dummy_lit_3777(int idx, u8 foo) {
|
static f32 dummy_lit_3777(int idx, u8 foo) {
|
||||||
Vec dummy_vec = {0.0f, 0.0f, 0.0f};
|
Vec dummy_vec = {0.0f, 0.0f, 0.0f};
|
||||||
@@ -686,28 +690,28 @@ cPhs_Step daMidna_c::create() {
|
|||||||
mpMorf->modelCalc();
|
mpMorf->modelCalc();
|
||||||
setBodyPartMatrix();
|
setBodyPartMatrix();
|
||||||
|
|
||||||
field_0x6e0.r = l_normalColor.r;
|
field_0x6e0.r = DUSK_IF_ELSE(dusk::cosmetics::get_midna_hair_normalColor()->r , l_normalColor.r);
|
||||||
field_0x6e0.g = l_normalColor.g;
|
field_0x6e0.g = DUSK_IF_ELSE(dusk::cosmetics::get_midna_hair_normalColor()->g , l_normalColor.g);
|
||||||
field_0x6e0.b = l_normalColor.b;
|
field_0x6e0.b = DUSK_IF_ELSE(dusk::cosmetics::get_midna_hair_normalColor()->b , l_normalColor.b);
|
||||||
field_0x6e0.a = l_normalColor.a;
|
field_0x6e0.a = DUSK_IF_ELSE(dusk::cosmetics::get_midna_hair_normalColor()->a , l_normalColor.a);
|
||||||
if (dKy_darkworld_check()) {
|
if (dKy_darkworld_check()) {
|
||||||
field_0x6e8.r = l_normalKColor.r;
|
field_0x6e8.r = DUSK_IF_ELSE(dusk::cosmetics::get_midna_hair_normalKColor()->r, l_normalKColor.r);
|
||||||
field_0x6e8.g = l_normalKColor.g;
|
field_0x6e8.g = DUSK_IF_ELSE(dusk::cosmetics::get_midna_hair_normalKColor()->g, l_normalKColor.g);
|
||||||
field_0x6e8.b = l_normalKColor.b;
|
field_0x6e8.b = DUSK_IF_ELSE(dusk::cosmetics::get_midna_hair_normalKColor()->b, l_normalKColor.b);
|
||||||
field_0x6e8.a = l_normalKColor.a;
|
field_0x6e8.a = DUSK_IF_ELSE(dusk::cosmetics::get_midna_hair_normalKColor()->a, l_normalKColor.a);
|
||||||
field_0x6ec.r = l_normalKColor2.r;
|
field_0x6ec.r = DUSK_IF_ELSE(dusk::cosmetics::get_midna_hair_normalKColor2()->r, l_normalKColor2.r);
|
||||||
field_0x6ec.g = l_normalKColor2.g;
|
field_0x6ec.g = DUSK_IF_ELSE(dusk::cosmetics::get_midna_hair_normalKColor2()->g, l_normalKColor2.g);
|
||||||
field_0x6ec.b = l_normalKColor2.b;
|
field_0x6ec.b = DUSK_IF_ELSE(dusk::cosmetics::get_midna_hair_normalKColor2()->b, l_normalKColor2.b);
|
||||||
field_0x6ec.a = l_normalKColor2.a;
|
field_0x6ec.a = DUSK_IF_ELSE(dusk::cosmetics::get_midna_hair_normalKColor2()->a, l_normalKColor2.a);
|
||||||
} else {
|
} else {
|
||||||
field_0x6e8.r = l_lNormalKColor.r;
|
field_0x6e8.r = DUSK_IF_ELSE(dusk::cosmetics::get_midna_hair_lNormalKColor()->r, l_lNormalKColor.r);
|
||||||
field_0x6e8.g = l_lNormalKColor.g;
|
field_0x6e8.g = DUSK_IF_ELSE(dusk::cosmetics::get_midna_hair_lNormalKColor()->g, l_lNormalKColor.g);
|
||||||
field_0x6e8.b = l_lNormalKColor.b;
|
field_0x6e8.b = DUSK_IF_ELSE(dusk::cosmetics::get_midna_hair_lNormalKColor()->b, l_lNormalKColor.b);
|
||||||
field_0x6e8.a = l_lNormalKColor.a;
|
field_0x6e8.a = DUSK_IF_ELSE(dusk::cosmetics::get_midna_hair_lNormalKColor()->a, l_lNormalKColor.a);
|
||||||
field_0x6ec.r = l_lNormalKColor2.r;
|
field_0x6ec.r = DUSK_IF_ELSE(dusk::cosmetics::get_midna_hair_lNormalKColor2()->r, l_lNormalKColor2.r);
|
||||||
field_0x6ec.g = l_lNormalKColor2.g;
|
field_0x6ec.g = DUSK_IF_ELSE(dusk::cosmetics::get_midna_hair_lNormalKColor2()->g, l_lNormalKColor2.g);
|
||||||
field_0x6ec.b = l_lNormalKColor2.b;
|
field_0x6ec.b = DUSK_IF_ELSE(dusk::cosmetics::get_midna_hair_lNormalKColor2()->b, l_lNormalKColor2.b);
|
||||||
field_0x6ec.a = l_lNormalKColor2.a;
|
field_0x6ec.a = DUSK_IF_ELSE(dusk::cosmetics::get_midna_hair_lNormalKColor2()->a, l_lNormalKColor2.a);
|
||||||
}
|
}
|
||||||
|
|
||||||
model = mpShadowModel;
|
model = mpShadowModel;
|
||||||
@@ -1060,7 +1064,7 @@ void daMidna_c::setBodyPartMatrix() {
|
|||||||
const GXColorS10* color;
|
const GXColorS10* color;
|
||||||
const GXColor* kcolor1;
|
const GXColor* kcolor1;
|
||||||
const GXColor* kcolor2;
|
const GXColor* kcolor2;
|
||||||
|
|
||||||
if (bvar2) {
|
if (bvar2) {
|
||||||
if (bvar8) {
|
if (bvar8) {
|
||||||
modelData->getMaterialNodePointer(2)->getShape()->show();
|
modelData->getMaterialNodePointer(2)->getShape()->show();
|
||||||
@@ -1068,24 +1072,24 @@ void daMidna_c::setBodyPartMatrix() {
|
|||||||
modelData->getMaterialNodePointer(1)->getShape()->show();
|
modelData->getMaterialNodePointer(1)->getShape()->show();
|
||||||
}
|
}
|
||||||
|
|
||||||
kcolor1 = &l_bigKColor;
|
kcolor1 = DUSK_IF_ELSE(dusk::cosmetics::get_midna_hair_bigKColor(), &l_bigKColor);
|
||||||
if (dKy_darkworld_check()) {
|
if (dKy_darkworld_check()) {
|
||||||
color = &l_bigColor;
|
color = DUSK_IF_ELSE(dusk::cosmetics::get_midna_hair_bigColor(), &l_bigColor);
|
||||||
kcolor2 = &l_normalKColor2;
|
kcolor2 = DUSK_IF_ELSE(dusk::cosmetics::get_midna_hair_normalKColor2(), &l_normalKColor2);
|
||||||
} else {
|
} else {
|
||||||
color = &l_lBigColor;
|
color = DUSK_IF_ELSE(dusk::cosmetics::get_midna_hair_lBigColor(), &l_lBigColor);
|
||||||
kcolor2 = &l_lBigKColor2;
|
kcolor2 = DUSK_IF_ELSE(dusk::cosmetics::get_midna_hair_lBigKColor2(), &l_lBigKColor2);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
modelData->getMaterialNodePointer(0)->getShape()->show();
|
modelData->getMaterialNodePointer(0)->getShape()->show();
|
||||||
|
|
||||||
color = &l_normalColor;
|
color = DUSK_IF_ELSE(dusk::cosmetics::get_midna_hair_normalColor(), &l_normalColor);
|
||||||
if (dKy_darkworld_check()) {
|
if (dKy_darkworld_check()) {
|
||||||
kcolor1 = &l_normalKColor;
|
kcolor1 = DUSK_IF_ELSE(dusk::cosmetics::get_midna_hair_normalKColor(), &l_normalKColor);
|
||||||
kcolor2 = &l_normalKColor2;
|
kcolor2 = DUSK_IF_ELSE(dusk::cosmetics::get_midna_hair_normalKColor2(), &l_normalKColor2);
|
||||||
} else {
|
} else {
|
||||||
kcolor1 = &l_lNormalKColor;
|
kcolor1 = DUSK_IF_ELSE(dusk::cosmetics::get_midna_hair_lNormalKColor(), &l_lNormalKColor);
|
||||||
kcolor2 = &l_lNormalKColor2;
|
kcolor2 = DUSK_IF_ELSE(dusk::cosmetics::get_midna_hair_lNormalKColor2(), &l_lNormalKColor2);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -14,6 +14,12 @@
|
|||||||
#include "m_Do/m_Do_lib.h"
|
#include "m_Do/m_Do_lib.h"
|
||||||
#include <cstring>
|
#include <cstring>
|
||||||
|
|
||||||
|
#if TARGET_PC
|
||||||
|
#include "dusk/randomizer/game/randomizer_context.hpp"
|
||||||
|
#include "dusk/randomizer/game/stages.h"
|
||||||
|
#include "dusk/randomizer/game/tools.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
#if DEBUG
|
#if DEBUG
|
||||||
void daNpcT_cmnListenPropertyEvent(char* param_0, int* param_1, daNpcT_HIOParam* param_2) {
|
void daNpcT_cmnListenPropertyEvent(char* param_0, int* param_1, daNpcT_HIOParam* param_2) {
|
||||||
sprintf(¶m_0[*param_1], "%.3ff,\t// 注目オフセット\n", param_2->attention_offset);
|
sprintf(¶m_0[*param_1], "%.3ff,\t// 注目オフセット\n", param_2->attention_offset);
|
||||||
@@ -2886,6 +2892,29 @@ void daNpcT_offEvtBit(u32 i_no) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
BOOL daNpcT_chkEvtBit(u32 i_no) {
|
BOOL daNpcT_chkEvtBit(u32 i_no) {
|
||||||
|
#if TARGET_PC
|
||||||
|
if (randomizer_IsActive()) {
|
||||||
|
switch (i_no) {
|
||||||
|
case 0x153: // Checking if the player has Ending Blow
|
||||||
|
{
|
||||||
|
if (getStageID() == Hidden_Skill) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case 0x40: // Checking if the player has completed Goron Mines
|
||||||
|
{
|
||||||
|
if (getStageID() == Kakariko_Village_Interiors) {
|
||||||
|
return true; // Return true so Barnes will sell bombs no matter what
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
return dComIfGs_isEventBit(dSv_event_flag_c::saveBitLabels[i_no]);
|
return dComIfGs_isEventBit(dSv_event_flag_c::saveBitLabels[i_no]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -14,6 +14,11 @@
|
|||||||
#include "d/d_meter2_info.h"
|
#include "d/d_meter2_info.h"
|
||||||
#include "d/actor/d_a_horse.h"
|
#include "d/actor/d_a_horse.h"
|
||||||
#include "Z2AudioLib/Z2Instances.h"
|
#include "Z2AudioLib/Z2Instances.h"
|
||||||
|
|
||||||
|
#if TARGET_PC
|
||||||
|
#include "dusk/randomizer/game/randomizer_context.hpp"
|
||||||
|
#endif
|
||||||
|
|
||||||
#if DEBUG
|
#if DEBUG
|
||||||
#include "JSystem/JHostIO/JORFile.h"
|
#include "JSystem/JHostIO/JORFile.h"
|
||||||
#include "d/d_debug_viewer.h"
|
#include "d/d_debug_viewer.h"
|
||||||
@@ -1744,6 +1749,12 @@ int daNpc_Aru_c::cutSpeakTo(int i_staffID) {
|
|||||||
switch (eventId) {
|
switch (eventId) {
|
||||||
case 1:
|
case 1:
|
||||||
if (mItemPartnerId == fpcM_ERROR_PROCESS_ID_e) {
|
if (mItemPartnerId == fpcM_ERROR_PROCESS_ID_e) {
|
||||||
|
#if TARGET_PC
|
||||||
|
if (randomizer_IsActive()) {
|
||||||
|
itemNo = randomizer_getItemAtLocation("Herding Goats Reward");
|
||||||
|
randomizer_setTempFlagForLocation("Herding Goats Reward");
|
||||||
|
}
|
||||||
|
#endif
|
||||||
mItemPartnerId = fopAcM_createItemForPresentDemo(¤t.pos, itemNo, 0, -1, -1, NULL, NULL);
|
mItemPartnerId = fopAcM_createItemForPresentDemo(¤t.pos, itemNo, 0, -1, -1, NULL, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -10,6 +10,11 @@
|
|||||||
#include "JSystem/J3DGraphBase/J3DMaterial.h"
|
#include "JSystem/J3DGraphBase/J3DMaterial.h"
|
||||||
#include <cstring>
|
#include <cstring>
|
||||||
|
|
||||||
|
#if TARGET_PC
|
||||||
|
#include "dusk/randomizer/game/randomizer_context.hpp"
|
||||||
|
#include "dusk/randomizer/game/verify_item_functions.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
DUSK_GAME_DATA const daNpcAshB_HIOParam daNpcAshB_Param_c::m = {
|
DUSK_GAME_DATA const daNpcAshB_HIOParam daNpcAshB_Param_c::m = {
|
||||||
205.0f, // attention_offset
|
205.0f, // attention_offset
|
||||||
-3.0f, // gravity
|
-3.0f, // gravity
|
||||||
@@ -1001,6 +1006,12 @@ BOOL daNpcAshB_c::EvCut_Appear(int i_staffID) {
|
|||||||
case '0008':
|
case '0008':
|
||||||
local_30[0] = 0;
|
local_30[0] = 0;
|
||||||
if (mFlow.getEventId(local_30) == 1) {
|
if (mFlow.getEventId(local_30) == 1) {
|
||||||
|
#if TARGET_PC
|
||||||
|
if (randomizer_IsActive()) {
|
||||||
|
local_30[0] = verifyProgressiveItem(randomizer_getItemAtLocation("Ashei Sketch"));
|
||||||
|
randomizer_setTempFlagForLocation("Ashei Sketch");
|
||||||
|
}
|
||||||
|
#endif
|
||||||
mItemPartnerId =
|
mItemPartnerId =
|
||||||
fopAcM_createItemForPresentDemo(¤t.pos, local_30[0], 0, -1, -1, 0, 0);
|
fopAcM_createItemForPresentDemo(¤t.pos, local_30[0], 0, -1, -1, 0, 0);
|
||||||
dComIfGp_event_setItemPartnerId(mItemPartnerId);
|
dComIfGp_event_setItemPartnerId(mItemPartnerId);
|
||||||
|
|||||||
@@ -13,6 +13,10 @@
|
|||||||
#include "d/actor/d_a_npc_len.h"
|
#include "d/actor/d_a_npc_len.h"
|
||||||
#include <cstring>
|
#include <cstring>
|
||||||
|
|
||||||
|
#if TARGET_PC
|
||||||
|
#include "dusk/randomizer/game/randomizer_context.hpp"
|
||||||
|
#endif
|
||||||
|
|
||||||
enum Bans_RES_File_ID {
|
enum Bans_RES_File_ID {
|
||||||
/* BCK */
|
/* BCK */
|
||||||
/* 0x06 */ BCK_BANS_F_TALK_A = 0x6,
|
/* 0x06 */ BCK_BANS_F_TALK_A = 0x6,
|
||||||
@@ -618,6 +622,7 @@ BOOL daNpc_Bans_c::isDelete() {
|
|||||||
Delete if TYPE_MAKING_BOMBS and:
|
Delete if TYPE_MAKING_BOMBS and:
|
||||||
Horseback Battle Not Cleared or Goron Mines Cleared
|
Horseback Battle Not Cleared or Goron Mines Cleared
|
||||||
*/
|
*/
|
||||||
|
IF_DUSK(if (randomizer_IsActive()) { return TRUE;}) // Always delete this type in randomizer
|
||||||
return !daNpcT_chkEvtBit(85) || // dSv_event_flag_c::M_052 - Main Event - Horseback battle clear
|
return !daNpcT_chkEvtBit(85) || // dSv_event_flag_c::M_052 - Main Event - Horseback battle clear
|
||||||
daNpcT_chkEvtBit(64); // dSv_event_flag_c::M_031 - Goron Mines - Goron Mines clear
|
daNpcT_chkEvtBit(64); // dSv_event_flag_c::M_031 - Goron Mines - Goron Mines clear
|
||||||
|
|
||||||
@@ -626,6 +631,7 @@ BOOL daNpc_Bans_c::isDelete() {
|
|||||||
Delete if TYPE_SHOP and:
|
Delete if TYPE_SHOP and:
|
||||||
Goron Mines Cleared
|
Goron Mines Cleared
|
||||||
*/
|
*/
|
||||||
|
IF_DUSK(if (randomizer_IsActive()) { return FALSE;}) // Never delete this type in randomizer
|
||||||
return !daNpcT_chkEvtBit(64); // dSv_event_flag_c::M_031 - Goron Mines - Goron Mines clear
|
return !daNpcT_chkEvtBit(64); // dSv_event_flag_c::M_031 - Goron Mines - Goron Mines clear
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
|||||||
@@ -14,6 +14,10 @@
|
|||||||
#include "d/d_camera.h"
|
#include "d/d_camera.h"
|
||||||
#include <cstring>
|
#include <cstring>
|
||||||
|
|
||||||
|
#if TARGET_PC
|
||||||
|
#include "dusk/randomizer/game/randomizer_context.hpp"
|
||||||
|
#endif
|
||||||
|
|
||||||
enum Bou_RES_File_ID {
|
enum Bou_RES_File_ID {
|
||||||
/* BCK */
|
/* BCK */
|
||||||
/* 0x06 */ BCK_BOU_F_TALK_A = 0x6,
|
/* 0x06 */ BCK_BOU_F_TALK_A = 0x6,
|
||||||
@@ -1034,8 +1038,9 @@ bool daNpcBouS_c::wait(void* param_1) {
|
|||||||
mTurnMode = 0;
|
mTurnMode = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!checkItemGet(dItemNo_HVY_BOOTS_e, 1) && dComIfGs_isTbox(2)) {
|
// In randomizer, we don't want bo to try and talk to us once the chest has been opened.
|
||||||
|
if (IF_DUSK(!randomizer_IsActive() &&) !checkItemGet(dItemNo_HVY_BOOTS_e, 1) && dComIfGs_isTbox(2)) {
|
||||||
mForcibleTalk = 1;
|
mForcibleTalk = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -11,6 +11,10 @@
|
|||||||
#include "d/d_meter2_info.h"
|
#include "d/d_meter2_info.h"
|
||||||
#include "d/d_timer.h"
|
#include "d/d_timer.h"
|
||||||
|
|
||||||
|
#if TARGET_PC
|
||||||
|
#include "dusk/randomizer/game/randomizer_context.hpp"
|
||||||
|
#endif
|
||||||
|
|
||||||
enum Event {
|
enum Event {
|
||||||
EVT_NONE,
|
EVT_NONE,
|
||||||
EVT_GAME_START,
|
EVT_GAME_START,
|
||||||
@@ -1804,6 +1808,17 @@ int daNpcChin_c::_Evt_GameSucceed_CutMain(const int& param_0) {
|
|||||||
itemId1 = 0;
|
itemId1 = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if TARGET_PC
|
||||||
|
if (randomizer_IsActive()) {
|
||||||
|
if (itemId1 == dItemNo_ARROW_LV2_e) {
|
||||||
|
itemId1 = randomizer_getItemAtLocation("STAR Prize 1");
|
||||||
|
randomizer_setTempFlagForLocation("STAR Prize 1");
|
||||||
|
} else if (itemId1 == dItemNo_ARROW_LV3_e) {
|
||||||
|
itemId1 = randomizer_getItemAtLocation("STAR Prize 2");
|
||||||
|
randomizer_setTempFlagForLocation("STAR Prize 2");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
fpc_ProcID itemId2 = fopAcM_createItemForPresentDemo(¤t.pos, itemId1, 0, -1, -1,
|
fpc_ProcID itemId2 = fopAcM_createItemForPresentDemo(¤t.pos, itemId1, 0, -1, -1,
|
||||||
0, 0);
|
0, 0);
|
||||||
if (itemId2 != -1) {
|
if (itemId2 != -1) {
|
||||||
|
|||||||
@@ -11,6 +11,11 @@
|
|||||||
#include "JSystem/JHostIO/JORFile.h"
|
#include "JSystem/JHostIO/JORFile.h"
|
||||||
#include <cstring>
|
#include <cstring>
|
||||||
|
|
||||||
|
#if TARGET_PC
|
||||||
|
#include "dusk/randomizer/game/randomizer_context.hpp"
|
||||||
|
#include "dusk/randomizer/game/verify_item_functions.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
enum fairy_RES_File_ID {
|
enum fairy_RES_File_ID {
|
||||||
/* BCK */
|
/* BCK */
|
||||||
/* 0x09 */ BCK_FAIRY_F_SAD = 0x9,
|
/* 0x09 */ BCK_FAIRY_F_SAD = 0x9,
|
||||||
@@ -1269,7 +1274,7 @@ void daNpc_Fairy_c::AppearDemoCall() {
|
|||||||
} else {
|
} else {
|
||||||
mEvtNo = EVT_APPEAR_50F_02;
|
mEvtNo = EVT_APPEAR_50F_02;
|
||||||
}
|
}
|
||||||
} else if (dComIfGs_checkEmptyBottle()) {
|
} else if (dComIfGs_checkEmptyBottle() IF_DUSK(|| randomizer_IsActive())) {
|
||||||
mEvtNo = EVT_APPEAR_50F_01;
|
mEvtNo = EVT_APPEAR_50F_01;
|
||||||
} else {
|
} else {
|
||||||
mEvtNo = EVT_APPEAR_50F_04;
|
mEvtNo = EVT_APPEAR_50F_04;
|
||||||
@@ -1333,6 +1338,14 @@ void daNpc_Fairy_c::PresentDemoCall() {
|
|||||||
item_no = 0;
|
item_no = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if TARGET_PC
|
||||||
|
// If we haven't visted this great fairy before, give the random item
|
||||||
|
if (randomizer_IsActive() && !daNpcT_chkEvtBit(505)) {
|
||||||
|
item_no = verifyProgressiveItem(randomizer_getItemAtLocation("Cave of Ordeals Great Fairy Reward"));
|
||||||
|
randomizer_setTempFlagForLocation("Cave of Ordeals Great Fairy Reward");
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
fpc_ProcID id = fopAcM_createItemForPresentDemo(¤t.pos, item_no, 0, -1, -1, NULL, NULL);
|
fpc_ProcID id = fopAcM_createItemForPresentDemo(¤t.pos, item_no, 0, -1, -1, NULL, NULL);
|
||||||
if (id != fpcM_ERROR_PROCESS_ID_e) {
|
if (id != fpcM_ERROR_PROCESS_ID_e) {
|
||||||
dComIfGp_event_setItemPartnerId(id);
|
dComIfGp_event_setItemPartnerId(id);
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user