mirror of
https://github.com/TwilitRealm/dusklight
synced 2026-07-05 11:33:39 -04:00
Compare commits
533 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 589c6675fe | |||
| 0be48db605 | |||
| dbb9ce2c03 | |||
| cc808ab50c | |||
| 591c38e871 | |||
| a5bc71795e | |||
| 09f087656a | |||
| 7682165478 | |||
| fe15366912 | |||
| cfadf7607a | |||
| f81d25b425 | |||
| ebf6f31719 | |||
| 590d209f76 | |||
| ed21cd4fd0 | |||
| 26d0725c76 | |||
| 1b3b493fbf | |||
| f62a70f9d0 | |||
| ec2173db9f | |||
| 563944d4a3 | |||
| b8f69e82dd | |||
| 830b560933 | |||
| 57019bea30 | |||
| c590018059 | |||
| 277538bb81 | |||
| e7eefbb0cb | |||
| 7ee39edee7 | |||
| 6592871fa2 | |||
| 5a1368b355 | |||
| 6984ae83bf | |||
| e57c952deb | |||
| 4239cea3d5 | |||
| 93479100fc | |||
| 9bd34a0d02 | |||
| cce67c1809 | |||
| 6bf0dfd92a | |||
| 4d8fcfa551 | |||
| 6366ab61d1 | |||
| 7537f1c4a8 | |||
| a3de85fb4b | |||
| 08e0645ef8 | |||
| f20cf3c24e | |||
| b2dfdf4158 | |||
| 99689258a2 | |||
| 5418b1831d | |||
| 2d4e69466b | |||
| 427dcfab82 | |||
| 08345d01ed | |||
| 56d47d475f | |||
| 8a92efbe0d | |||
| f5642f3073 | |||
| cc9c15de54 | |||
| 1fd8a2ca3c | |||
| 0c9c8795ce | |||
| 9eb9acfa11 | |||
| 1790ad6faf | |||
| e39c139b97 | |||
| 54b3545736 | |||
| facbf35343 | |||
| 7a34830dc7 | |||
| e4557efb23 | |||
| 42e12eb5ab | |||
| 16cc37ca10 | |||
| 44cb2c84ba | |||
| 8e9d4d624a | |||
| db87b91954 | |||
| ad53af5c78 | |||
| a6e5160c71 | |||
| 38a0a7be0b | |||
| 2428ca2efe | |||
| 05d9cf0402 | |||
| 02fdde3768 | |||
| 33e13d508b | |||
| afc3376aec | |||
| b07fb50128 | |||
| d0894853d7 | |||
| 2651640ee0 | |||
| f8c5a8988b | |||
| cacb768725 | |||
| 00707024bb | |||
| 544964c1a5 | |||
| 59b76f7aae | |||
| 7bd3e9cafd | |||
| 8999c4c9c5 | |||
| 917def4732 | |||
| 0516282bb6 | |||
| 4466442cfb | |||
| d6f741947a | |||
| d855efe513 | |||
| 51a25206c2 | |||
| 28733f5c15 | |||
| b2ac2d6600 | |||
| 7c5ed6a0e1 | |||
| 131a09f317 | |||
| a58f9c7b43 | |||
| f6b86d3f38 | |||
| b118fa19e1 | |||
| 7290649bb8 | |||
| 68bebfad3a | |||
| a0f5b250b4 | |||
| cb70f2c3b3 | |||
| 34e1e740ab | |||
| 5851954ca1 | |||
| c65f0bb0ac | |||
| 038254db48 | |||
| c1997b3d68 | |||
| 474a7dce00 | |||
| 382f33d021 | |||
| efbf82d4c7 | |||
| b743a762b4 | |||
| 302abd6b65 | |||
| 3f6ae4324b | |||
| dccded964b | |||
| ea09dd73c6 | |||
| c426b52a15 | |||
| 41e0a81c39 | |||
| 5b6f2f6e91 | |||
| bbea07ba9e | |||
| 0f0dca5514 | |||
| 3fb86dbac8 | |||
| 83adafff82 | |||
| 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 |
+22
-2
@@ -291,13 +291,13 @@ message(STATUS "dusklight: Fetching cxxopts")
|
||||
FetchContent_Declare(cxxopts
|
||||
URL https://github.com/jarro2783/cxxopts/archive/refs/tags/v3.3.1.tar.gz
|
||||
URL_HASH SHA256=3bfc70542c521d4b55a46429d808178916a579b28d048bd8c727ee76c39e2072
|
||||
DOWNLOAD_EXTRACT_TIMESTAMP TRUE
|
||||
DOWNLOAD_EXTRACT_TIMESTAMP FALSE
|
||||
)
|
||||
message(STATUS "dusklight: Fetching nlohmann/json")
|
||||
FetchContent_Declare(json
|
||||
URL https://github.com/nlohmann/json/releases/download/v3.12.0/json.tar.xz
|
||||
URL_HASH SHA256=42f6e95cad6ec532fd372391373363b62a14af6d771056dbfc86160e6dfff7aa
|
||||
DOWNLOAD_EXTRACT_TIMESTAMP TRUE
|
||||
DOWNLOAD_EXTRACT_TIMESTAMP FALSE
|
||||
)
|
||||
FetchContent_MakeAvailable(cxxopts json)
|
||||
|
||||
@@ -437,6 +437,8 @@ if (DUSK_MOVIE_SUPPORT)
|
||||
list(APPEND GAME_COMPILE_DEFS MOVIE_SUPPORT=1)
|
||||
endif ()
|
||||
|
||||
include(src/dusk/randomizer/randomizer.cmake)
|
||||
|
||||
set(DUSK_ENABLE_DISCORD_DEFAULT ON)
|
||||
if (DEFINED DUSK_ENABLE_DISCORD_RPC AND NOT DEFINED DUSK_ENABLE_DISCORD)
|
||||
set(DUSK_ENABLE_DISCORD_DEFAULT ${DUSK_ENABLE_DISCORD_RPC})
|
||||
@@ -520,6 +522,24 @@ if (ENABLE_ASAN)
|
||||
target_sources(dusklight PRIVATE src/dusk/asan_options.c)
|
||||
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_include_directories(dusklight PRIVATE ${GAME_INCLUDE_DIRS})
|
||||
target_link_libraries(dusklight PRIVATE aurora::main ${GAME_LIBS} ${JSYSTEM_LINK_LIBRARIES})
|
||||
|
||||
+5
-1
@@ -158,7 +158,11 @@
|
||||
"cacheVariables": {
|
||||
"CMAKE_C_COMPILER": "cl",
|
||||
"CMAKE_CXX_COMPILER": "cl",
|
||||
"CMAKE_INSTALL_PREFIX": "${sourceDir}/build/install"
|
||||
"CMAKE_INSTALL_PREFIX": "${sourceDir}/build/install",
|
||||
"CMAKE_DISABLE_FIND_PACKAGE_PkgConfig": {
|
||||
"type": "BOOL",
|
||||
"value": true
|
||||
}
|
||||
},
|
||||
"vendor": {
|
||||
"microsoft.com/VisualStudioSettings/CMake/1.0": {
|
||||
|
||||
@@ -20,31 +20,17 @@ It aims to be as accurate as possible to the original while also providing new o
|
||||
> Dusklight does *not* provide any copyrighted assets. You must provide your own copy of the original game.
|
||||
|
||||
> [!IMPORTANT]
|
||||
> At a minimum, Dusklight requires a GPU with support for either D3D12, Vulkan, or Metal. Your experience with specific hardware, operating systems, and drivers may vary. In particular, older Intel iGPUs have a high likelihood of incompatibility. We are also aware of a number of issues on devices with Adreno GPUs and are working to resolve them.
|
||||
> At a minimum, Dusklight requires a GPU with support for D3D12, Vulkan 1.1+, or Metal. For older devices, best-effort support is provided for D3D11 and OpenGL ES (Android), but will not achieve full accuracy or performance. Your experience with specific hardware, operating systems, and drivers may vary.
|
||||
|
||||
### 1. Dump your game
|
||||
|
||||
You must dump your own copy of the game, please see [this article](https://wiki.dolphin-emu.org/index.php?title=Ripping_Games) for instructions. After dumping, you can use a program like [Dolphin](https://dolphin-emu.org/) or [nodtool](https://github.com/encounter/nod/releases) to convert the `.iso` to a `.rvz` to save space.
|
||||
You must dump your own copy of the game. Please see [this article](https://wiki.dolphin-emu.org/index.php?title=Ripping_Games) for instructions. After dumping, you can use a program like [Dolphin](https://dolphin-emu.org/) or [nodtool](https://github.com/encounter/nod/releases) to convert the `.iso` to `.rvz` to save space.
|
||||
|
||||
Currently, only the GameCube USA and EUR releases are supported. Support for other versions of the game is planned in the future.
|
||||
|
||||
### 2. Download [Dusklight](https://github.com/TwilitRealm/dusklight/releases)
|
||||
### 2. Install Dusklight
|
||||
|
||||
### 3. Setup the game
|
||||
**Windows / macOS / Linux**
|
||||
- Extract the .zip file
|
||||
- Launch Dusklight
|
||||
- Press **Select Disc Image** and provide the path to your supported game dump
|
||||
- Press **Play**!
|
||||
|
||||
**iOS**
|
||||
- Follow the [iOS setup guide](docs/ios-install-altstore.md)
|
||||
|
||||
**Android**
|
||||
- Install the Dusklight APK
|
||||
- Launch Dusklight
|
||||
- Press **Select Disc Image** and provide the path to your supported game dump
|
||||
- Press **Play**!
|
||||
Visit the [official installation guide](https://twilitrealm.dev/install/) for full instructions.
|
||||
|
||||
# Building
|
||||
|
||||
|
||||
Vendored
+1
-1
Submodule extern/aurora updated: cc9aa81ce7...9087a409da
+121
@@ -1418,7 +1418,11 @@ set(DUSK_FILES
|
||||
include/dusk/scope_guard.hpp
|
||||
src/dusk/dvd_asset.cpp
|
||||
src/d/actor/d_a_alink_dusk.cpp
|
||||
src/dusk/android_frame_rate.hpp
|
||||
src/dusk/android_frame_rate.cpp
|
||||
src/dusk/asserts.cpp
|
||||
src/dusk/batch.cpp
|
||||
src/dusk/batch.hpp
|
||||
src/dusk/config.cpp
|
||||
src/dusk/crash_handler.cpp
|
||||
src/dusk/crash_reporting.cpp
|
||||
@@ -1432,6 +1436,8 @@ set(DUSK_FILES
|
||||
src/dusk/game_clock.cpp
|
||||
src/dusk/globals.cpp
|
||||
src/dusk/gyro.cpp
|
||||
include/dusk/menu_pointer.h
|
||||
src/dusk/menu_pointer.cpp
|
||||
src/dusk/mouse.cpp
|
||||
src/dusk/gamepad_color.cpp
|
||||
src/dusk/autosave.cpp
|
||||
@@ -1445,6 +1451,7 @@ set(DUSK_FILES
|
||||
src/dusk/stubs.cpp
|
||||
include/dusk/texture_replacements.hpp
|
||||
src/dusk/texture_replacements.cpp
|
||||
src/dusk/touch_camera.cpp
|
||||
src/dusk/update_check.cpp
|
||||
src/dusk/update_check.hpp
|
||||
#src/dusk/m_Do_ext_dusk.cpp
|
||||
@@ -1457,6 +1464,9 @@ set(DUSK_FILES
|
||||
src/dusk/imgui/ImGuiBloomWindow.hpp
|
||||
src/dusk/imgui/ImGuiMenuTools.cpp
|
||||
src/dusk/imgui/ImGuiMenuTools.hpp
|
||||
src/dusk/imgui/ImGuiMenuRandomizer.cpp
|
||||
src/dusk/imgui/ImGuiMenuRandomizer.hpp
|
||||
src/dusk/imgui/ImGuiArchipelagoDebug.cpp
|
||||
src/dusk/imgui/ImGuiActorSpawner.cpp
|
||||
src/dusk/imgui/ImGuiProcessOverlay.cpp
|
||||
src/dusk/imgui/ImGuiCameraOverlay.cpp
|
||||
@@ -1474,8 +1484,11 @@ set(DUSK_FILES
|
||||
src/dusk/ui/button.hpp
|
||||
src/dusk/ui/component.cpp
|
||||
src/dusk/ui/component.hpp
|
||||
src/dusk/ui/controls.hpp
|
||||
src/dusk/ui/controller_config.cpp
|
||||
src/dusk/ui/controller_config.hpp
|
||||
src/dusk/ui/cosmetics.hpp
|
||||
src/dusk/ui/cosmetics.cpp
|
||||
src/dusk/ui/document.cpp
|
||||
src/dusk/ui/document.hpp
|
||||
src/dusk/ui/editor.cpp
|
||||
@@ -1486,6 +1499,8 @@ set(DUSK_FILES
|
||||
src/dusk/ui/graphics_tuner.hpp
|
||||
src/dusk/ui/input.cpp
|
||||
src/dusk/ui/input.hpp
|
||||
src/dusk/ui/icon_provider.cpp
|
||||
src/dusk/ui/icon_provider.hpp
|
||||
src/dusk/ui/modal.cpp
|
||||
src/dusk/ui/modal.hpp
|
||||
src/dusk/ui/nav_types.hpp
|
||||
@@ -1511,12 +1526,24 @@ set(DUSK_FILES
|
||||
src/dusk/ui/string_button.hpp
|
||||
src/dusk/ui/tab_bar.cpp
|
||||
src/dusk/ui/tab_bar.hpp
|
||||
src/dusk/ui/touch_controls_common.cpp
|
||||
src/dusk/ui/touch_controls_common.hpp
|
||||
src/dusk/ui/touch_controls.cpp
|
||||
src/dusk/ui/touch_controls.hpp
|
||||
src/dusk/ui/touch_controls_editor.cpp
|
||||
src/dusk/ui/touch_controls_editor.hpp
|
||||
src/dusk/ui/ui.cpp
|
||||
src/dusk/ui/ui.hpp
|
||||
src/dusk/ui/warp.cpp
|
||||
src/dusk/ui/warp.hpp
|
||||
src/dusk/ui/window.cpp
|
||||
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/ui/archi_connect_modal.cpp
|
||||
src/dusk/ui/archi_connect_modal.hpp
|
||||
src/dusk/achievements.cpp
|
||||
src/dusk/iso_validate.cpp
|
||||
src/dusk/livesplit.cpp
|
||||
@@ -1530,6 +1557,100 @@ set(DUSK_FILES
|
||||
src/dusk/discord_presence.cpp
|
||||
src/dusk/version.cpp
|
||||
src/dusk/action_bindings.cpp
|
||||
src/dusk/cosmetics/color_utils.hpp
|
||||
src/dusk/cosmetics/color_utils.cpp
|
||||
src/dusk/cosmetics/texture_utils.hpp
|
||||
src/dusk/cosmetics/texture_utils.cpp
|
||||
# Randomizer files
|
||||
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/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
|
||||
# Archipelago Files
|
||||
src/dusk/archipelago/archipelago_context.cpp
|
||||
)
|
||||
|
||||
set(DUSK_HTTP_BACKEND_FILES
|
||||
|
||||
@@ -16,37 +16,37 @@
|
||||
];
|
||||
forAllSystems = lib.genAttrs supportedSystems;
|
||||
|
||||
dawnVersion = "v20260423.175430";
|
||||
nodVersion = "v2.0.0-alpha.8";
|
||||
dawnVersion = "v20260618.032059";
|
||||
nodVersion = "v2.0.0-alpha.10";
|
||||
versionSuffix = "nix-" + (self.shortRev or self.dirtyShortRev or "dirty");
|
||||
|
||||
dawnInfo = {
|
||||
"x86_64-linux" = {
|
||||
triple = "linux-x86_64";
|
||||
hash = "sha256-HXfKTLHtMPwupnFnaflCARtXVPuS/0PoCePXidjE5xs=";
|
||||
hash = "sha256-GFSd573b+VQx/VmFdNQgWDd0V9ayQlcw0Zuopke12ak=";
|
||||
};
|
||||
"aarch64-linux" = {
|
||||
triple = "linux-aarch64";
|
||||
hash = "sha256-34yyFpfqBZUwoFXQ41F0AwAU78FaNihOSY0oriwn6B0=";
|
||||
hash = "sha256-ZaoP7BAjBMnfAv2/AMRi3FNH2ZtyqASCSFyU/oB2Mzg=";
|
||||
};
|
||||
"aarch64-darwin" = {
|
||||
triple = "darwin-arm64";
|
||||
hash = "sha256-eQnzrBp6gjiBek1VYQ9A5W13ClYWrDDKjIqv/7eNTR4=";
|
||||
hash = "sha256-HT+qtlLaSHyoXPrUcXgcTGa877X5YfzbxRD4bJb7i1Y=";
|
||||
};
|
||||
"x86_64-darwin" = {
|
||||
triple = "darwin-x86_64";
|
||||
hash = "sha256-QGWiGdxiI9kci3NPXH6QFFirxn16851zB/w3jqhIBJ4=";
|
||||
hash = "sha256-cUNaCbA7rlKSukDVKGaVEVw0Zt1+mSbaHbmUCMvMVWc=";
|
||||
};
|
||||
};
|
||||
|
||||
nodPrebuiltInfo = {
|
||||
"x86_64-linux" = {
|
||||
triple = "linux-x86_64";
|
||||
hash = "sha256-mUqvLsbsqaZ+HAjMmHYPYO+MgtanGRTw7Gzn5uXR5rE=";
|
||||
hash = "sha256-FVQWECVA2gWdc+n5OQ/Tvwn8z0qdgjSd1WlFt5HKOec=";
|
||||
};
|
||||
"aarch64-darwin" = {
|
||||
triple = "macos-arm64";
|
||||
hash = "sha256-UPy1ywCcv0K6VJOU3uUelJuUdBh3UNaPRlyP5LOBeDw=";
|
||||
hash = "sha256-8ZEejxksVgShNKUVRCBYaLOp9x/qOC9pAeVrElQUGUk=";
|
||||
};
|
||||
};
|
||||
|
||||
@@ -75,7 +75,7 @@
|
||||
'';
|
||||
|
||||
dawn = pkgs.fetchzip {
|
||||
url = "https://github.com/encounter/dawn-build/releases/download/${dawnVersion}/dawn-${dawnInfo.${system}.triple}.tar.gz";
|
||||
url = "https://github.com/encounter/dawn/releases/download/${dawnVersion}/dawn-${dawnInfo.${system}.triple}.tar.gz";
|
||||
hash = dawnInfo.${system}.hash;
|
||||
stripRoot = false;
|
||||
};
|
||||
@@ -94,7 +94,7 @@
|
||||
owner = "encounter";
|
||||
repo = "nod";
|
||||
rev = nodVersion;
|
||||
hash = "sha256-+zrtVzjo0+X/6uMcNUn1+FaSR+jOhrcQSDNBFjw0NDs=";
|
||||
hash = "sha256-r8qDlOVxv5iKiFjJQrcBuL9HVoOM3yEjRVnQIMqaICs=";
|
||||
};
|
||||
patches = [ ./fix-cmake-paths.patch ];
|
||||
cargoDeps = pkgs.rustPlatform.importCargoLock {
|
||||
@@ -138,15 +138,15 @@
|
||||
NOD_PREBUILT = nod;
|
||||
CXXOPTS = pkgs.cxxopts.src;
|
||||
JSON = pkgs.nlohmann_json.src;
|
||||
XXHASH = pkgs.xxHash.src;
|
||||
XXHASH = pkgs.xxhash.src;
|
||||
ZSTD = pkgs.zstd.src;
|
||||
FMT = pkgs.fetchzip {
|
||||
url = "https://github.com/fmtlib/fmt/archive/refs/tags/11.1.4.tar.gz";
|
||||
hash = "sha256-sUbxlYi/Aupaox3JjWFqXIjcaQa0LFjclQAOleT+FRA=";
|
||||
url = "https://github.com/fmtlib/fmt/archive/refs/tags/12.1.0.tar.gz";
|
||||
hash = "sha256-ZmI1Dv0ZabPlxa02OpERI47jp7zFfjpeWCy1WyuPYZ0=";
|
||||
};
|
||||
TRACY = pkgs.fetchzip {
|
||||
url = "https://github.com/wolfpld/tracy/archive/a64b9a20294d59421a2f57aeca3c6383d8c48169.tar.gz";
|
||||
hash = "sha256-hbNGOsGeyGSvCJ2No8RkwOib1lX2on3vNZSzyVkZdXw=";
|
||||
url = "https://github.com/wolfpld/tracy/archive/6789e7d6f9a65ec98926b602097a33a9676d2606.tar.gz";
|
||||
hash = "sha256-Xxyd7G/mnXEPpN+ehmwl0AkAhS3CwObpJNDgcqbdUJg=";
|
||||
};
|
||||
IMGUI = pkgs.fetchFromGitHub {
|
||||
owner = "ocornut";
|
||||
@@ -194,7 +194,7 @@
|
||||
pkgs.zstd
|
||||
pkgs.cxxopts
|
||||
pkgs.nlohmann_json
|
||||
pkgs.xxHash
|
||||
pkgs.xxhash
|
||||
pkgs.abseil-cpp
|
||||
pkgs.zlib
|
||||
pkgs.libpng
|
||||
@@ -269,6 +269,12 @@
|
||||
runHook postInstall
|
||||
'';
|
||||
|
||||
postFixup = lib.optionalString (!isDarwin) ''
|
||||
patchelf \
|
||||
--add-needed "${pkgs.vulkan-loader}/lib/libvulkan.so" \
|
||||
$out/bin/dusklight
|
||||
'';
|
||||
|
||||
dontStrip = true;
|
||||
|
||||
meta = {
|
||||
|
||||
@@ -46,6 +46,11 @@ public:
|
||||
s32 getSeLoadStatus(u32 wave) { return getWaveLoadStatus(wave, 0); }
|
||||
s32 getBgmLoadStatus(u32 wave) { return getWaveLoadStatus(wave, 1); }
|
||||
u8 getDemoSeWaveNum() { return loadedDemoWave; }
|
||||
#if TARGET_PC
|
||||
u8 getLoadedSeWave_1() { return loadedSeWave_1;}
|
||||
u8 getLoadedSeWave_2() { return loadedSeWave_2;}
|
||||
#endif
|
||||
|
||||
|
||||
private:
|
||||
/* 0x00 */ JAISoundID BGM_ID;
|
||||
|
||||
@@ -3912,6 +3912,12 @@ public:
|
||||
u16 getReadyItem() { return dComIfGp_getSelectItem(mSelectItemId); }
|
||||
|
||||
static u32 getOtherHeapSize() { return 0xF0A60; }
|
||||
|
||||
#if TARGET_PC
|
||||
u16 getEventId() { return mMsgFlow.getEventId(); }
|
||||
|
||||
bool checkSwimming() {return checkModeFlg(MODE_SWIMMING);}
|
||||
#endif
|
||||
|
||||
static daAlink_BckData const m_mainBckShield[20];
|
||||
static daAlink_BckData const m_mainBckSword[5];
|
||||
@@ -4556,6 +4562,7 @@ public:
|
||||
void handleWolfHowl();
|
||||
void handleQuickTransform();
|
||||
bool checkAimContext();
|
||||
bool checkAimInputContext();
|
||||
|
||||
void onIronBallChainInterpCallback();
|
||||
|
||||
@@ -6390,7 +6397,8 @@ public:
|
||||
|
||||
class daAlinkHIO_huLight_c0 {
|
||||
public:
|
||||
static daAlinkHIO_huLight_c1 const m;
|
||||
static daAlinkHIO_huLight_c1 IF_NOT_DUSK(const) m;
|
||||
IF_DUSK(static daAlinkHIO_huLight_c1 const original;)
|
||||
};
|
||||
|
||||
class daAlinkHIO_wlLight_c1 {
|
||||
@@ -6464,7 +6472,8 @@ public:
|
||||
|
||||
class daAlinkHIO_kandelaar_c0 {
|
||||
public:
|
||||
static daAlinkHIO_kandelaar_c1 const m;
|
||||
static daAlinkHIO_kandelaar_c1 IF_NOT_DUSK(const) m;
|
||||
IF_DUSK(static daAlinkHIO_kandelaar_c1 const original;)
|
||||
};
|
||||
|
||||
class daAlinkHIO_kandelaar_c : public daAlinkHIO_data_c {
|
||||
|
||||
@@ -88,9 +88,14 @@ public:
|
||||
/* 0x396A */ u8 field_0x396A[0x399E - 0x396A];
|
||||
/* 0x399E */ s16 field_0x399e;
|
||||
/* 0x39A0 */ u8 field_0x39A0[0x39A4 - 0x39A0];
|
||||
|
||||
#if TARGET_PC
|
||||
/* 0x39A4 */ cM_rnd_c mMantRng;
|
||||
#endif
|
||||
};
|
||||
|
||||
#if TARGET_PC
|
||||
STATIC_ASSERT(sizeof(mant_class) == 0x39ac);
|
||||
#else
|
||||
STATIC_ASSERT(sizeof(mant_class) == 0x39a4);
|
||||
#endif
|
||||
|
||||
#endif /* D_A_MANT_H */
|
||||
|
||||
@@ -120,7 +120,10 @@ public:
|
||||
BOOL chkAction(actionFunc action) { return action == mAction; }
|
||||
|
||||
static eventFunc mEvtSeqList[1];
|
||||
|
||||
#if TARGET_PC
|
||||
// Keep track of last given bug for rando
|
||||
static u8 mGivenInsectId;
|
||||
#endif
|
||||
private:
|
||||
/* 0xB48 */ Z2Creature mSound;
|
||||
/* 0xBD8 */ J3DModel* mpUmbrellaModel;
|
||||
|
||||
@@ -64,6 +64,9 @@ public:
|
||||
virtual int Delete();
|
||||
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 getItemNo() { return fopAcM_GetParamBit(this, 0, 8); }
|
||||
|
||||
|
||||
@@ -4,6 +4,10 @@
|
||||
#include "JSystem/J3DGraphBase/J3DPacket.h"
|
||||
#include "SSystem/SComponent/c_xyz.h"
|
||||
|
||||
#if TARGET_PC
|
||||
#include "dusk/batch.hpp"
|
||||
#endif
|
||||
|
||||
class cCcD_Obj;
|
||||
class dCcMassS_HitInf;
|
||||
class fopAc_ac_c;
|
||||
@@ -107,6 +111,12 @@ public:
|
||||
#if TARGET_PC
|
||||
TGXTexObj mTexObj_l_J_Ohana00_64TEX;
|
||||
TGXTexObj mTexObj_l_J_Ohana01_64128_0419TEX;
|
||||
|
||||
dusk::batch::LeafTemplate mTplHana00; // l_J_hana00DL
|
||||
dusk::batch::LeafTemplate mTplHana00Cut; // l_J_hana00_cDL
|
||||
dusk::batch::LeafTemplate mTplHana01; // l_J_hana01DL
|
||||
dusk::batch::LeafTemplate mTplHana01Cut00; // l_J_hana01_c_00DL
|
||||
dusk::batch::LeafTemplate mTplHana01Cut; // l_J_hana01_c_01DL
|
||||
#endif
|
||||
}; // Size: 0x12A54
|
||||
|
||||
|
||||
@@ -4,6 +4,10 @@
|
||||
#include "JSystem/J3DGraphBase/J3DPacket.h"
|
||||
#include "SSystem/SComponent/c_xyz.h"
|
||||
|
||||
#if TARGET_PC
|
||||
#include "../../../src/dusk/batch.hpp"
|
||||
#endif
|
||||
|
||||
class cCcD_Obj;
|
||||
class csXyz;
|
||||
class dCcMassS_HitInf;
|
||||
@@ -110,6 +114,10 @@ public:
|
||||
#if TARGET_PC
|
||||
TGXTexObj mTexObj_l_M_Hijiki00TEX;
|
||||
TGXTexObj mTexObj_l_M_kusa05_RGBATEX;
|
||||
|
||||
dusk::batch::LeafTemplate mTplKusa9q; // l_M_Kusa_9qDL
|
||||
dusk::batch::LeafTemplate mTplKusa9qCut; // l_M_Kusa_9q_cDL
|
||||
dusk::batch::LeafTemplate mTplTengusa; // l_M_TenGusaDL
|
||||
#endif
|
||||
}; // Size: 0x1D718
|
||||
|
||||
|
||||
@@ -114,6 +114,10 @@ public:
|
||||
|
||||
bool checkBoomWindTgTimer() { return mBoomWindTgTimer == 0; }
|
||||
|
||||
#if TARGET_PC
|
||||
void setRandomizerItem(bool setFoolishItemModel = false);
|
||||
#endif
|
||||
|
||||
static procFunc mFuncPtr[];
|
||||
static const dCcD_SrcCyl m_cyl_src;
|
||||
static s32 m_timer_max;
|
||||
|
||||
@@ -7,4 +7,9 @@ class fopAc_ac_c;
|
||||
int CheckFieldItemCreateHeap(fopAc_ac_c* actor);
|
||||
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 */
|
||||
|
||||
@@ -74,7 +74,17 @@ public:
|
||||
s16 getAngleY() const { return mAngleY; }
|
||||
void setAngleY(s16 angle) { mAngleY = angle;}
|
||||
|
||||
#if TARGET_PC
|
||||
BOOL isRandomized() const;
|
||||
#endif
|
||||
|
||||
static ResourceData const mData[23];
|
||||
#if TARGET_PC
|
||||
static ResourceData mRandoData[23];
|
||||
#define M_SHOP_DATA (isRandomized() ? mRandoData : mData)
|
||||
#else
|
||||
#define M_SHOP_DATA mData
|
||||
#endif
|
||||
static f32 const m_cullfar_max;
|
||||
|
||||
enum {
|
||||
|
||||
@@ -1037,7 +1037,7 @@ public:
|
||||
bool test1Camera(s32);
|
||||
bool test2Camera(s32);
|
||||
#if TARGET_PC
|
||||
static bool canUseFreeCam();
|
||||
static bool isAimActive();
|
||||
bool freeCamera();
|
||||
bool executeDebugFlyCam();
|
||||
void deactivateDebugFlyCam();
|
||||
|
||||
@@ -1,6 +1,10 @@
|
||||
#ifndef D_COM_D_COM_INF_GAME_H
|
||||
#define D_COM_D_COM_INF_GAME_H
|
||||
|
||||
#if TARGET_PC
|
||||
#include "dusk/randomizer/game/randomizer_context.hpp"
|
||||
#endif
|
||||
|
||||
#include "d/d_attention.h"
|
||||
#include "d/d_cc_s.h"
|
||||
#include "d/d_event.h"
|
||||
@@ -466,6 +470,9 @@ public:
|
||||
s8 getNextStageRoomNo() { return mNextStage.getRoomNo(); }
|
||||
s8 getNextStageLayer() { return mNextStage.getLayer(); }
|
||||
BOOL isEnableNextStage() { return mNextStage.isEnable(); }
|
||||
#if TARGET_PC
|
||||
void setEnableNextStage() { return mNextStage.setEnable(); }
|
||||
#endif
|
||||
void offEnableNextStage() { mNextStage.offEnable(); }
|
||||
s8 getNextStageWipe() { return mNextStage.getWipe(); }
|
||||
u8 getNextStageWipeSpeed() { return mNextStage.getWipeSpeed(); }
|
||||
@@ -1121,6 +1128,15 @@ void dComIfGs_setWarpItemData(char const* stage, cXyz pos, s16 angle, s8 roomNo,
|
||||
u8 param_5);
|
||||
BOOL dComIfGs_isStageSwitch(int i_stageNo, int i_no);
|
||||
BOOL dComIfGs_isStageTbox(int i_stageNo, int i_no);
|
||||
#if TARGET_PC
|
||||
void dComIfGs_onStageTbox(int i_stageNo, int i_no);
|
||||
void dComIfGs_offStageTbox(int i_stageNo, int i_no);
|
||||
|
||||
void dComIfGs_onStageItem(int i_stageNo, int i_no);
|
||||
void dComIfGs_offStageItem(int i_stageNo, int i_no);
|
||||
|
||||
#endif
|
||||
|
||||
void dComIfGs_onStageSwitch(int i_stageNo, int i_no);
|
||||
void dComIfGs_offStageSwitch(int i_stageNo, int i_no);
|
||||
BOOL dComIfGs_isStageSwitch(int i_stageNo, int i_no);
|
||||
@@ -1268,6 +1284,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,
|
||||
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() {
|
||||
return &g_dComIfG_gameInfo.info;
|
||||
}
|
||||
@@ -1328,9 +1348,13 @@ inline u8 dComIfGs_getSelectEquipShield() {
|
||||
return g_dComIfG_gameInfo.info.getPlayer().getPlayerStatusA().getSelectEquip(COLLECT_SHIELD);
|
||||
}
|
||||
|
||||
#if TARGET_PC
|
||||
u8 dComIfGs_getCollectSmell();
|
||||
#else
|
||||
inline u8 dComIfGs_getCollectSmell() {
|
||||
return g_dComIfG_gameInfo.info.getPlayer().getPlayerStatusA().getSelectEquip(COLLECT_SMELL);
|
||||
}
|
||||
#endif
|
||||
|
||||
inline void dComIfGs_setCollectSmell(u8 smell) {
|
||||
g_dComIfG_gameInfo.info.getPlayer().getPlayerStatusA().setSelectEquip(COLLECT_SMELL, smell);
|
||||
@@ -1420,6 +1444,12 @@ inline BOOL dComIfGs_isDarkClearLV(int 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) {
|
||||
g_dComIfG_gameInfo.info.getPlayer().getPlayerStatusB().onTransformLV(i_no);
|
||||
}
|
||||
@@ -1497,6 +1527,12 @@ inline void dComIfGs_onRegionBit(int 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,
|
||||
s8 i_point, u8 i_region) {
|
||||
g_dComIfG_gameInfo.info.getPlayer().getPlayerFieldLastStayInfo().set(i_stage, i_pos, i_angle,
|
||||
@@ -1648,6 +1684,16 @@ inline void dComIfGs_setPachinkoNum(u8 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() {
|
||||
return 50;
|
||||
}
|
||||
@@ -1820,7 +1866,16 @@ inline u8 dComIfGs_getGetNumber(int i_no) {
|
||||
inline void dComIfGs_setGetNumber(int i_no, u8 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) {
|
||||
g_dComIfG_gameInfo.info.getPlayer().getFishingInfo().addFishCount(param_0);
|
||||
}
|
||||
@@ -1936,6 +1991,33 @@ inline u8 dComIfGs_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);
|
||||
}
|
||||
|
||||
inline void dComIfGs_onSaveTbox(int i_stageNo, int i_no) {
|
||||
g_dComIfG_gameInfo.info.getSavedata().getSave(i_stageNo).getBit().onTbox(i_no);
|
||||
}
|
||||
|
||||
inline void dComIfGs_offSaveTbox(int i_stageNo, int i_no) {
|
||||
g_dComIfG_gameInfo.info.getSavedata().getSave(i_stageNo).getBit().offTbox(i_no);
|
||||
}
|
||||
|
||||
inline void dComIfGs_onSaveItem(int i_no) {
|
||||
g_dComIfG_gameInfo.info.getMemory().getBit().onItem(i_no);
|
||||
}
|
||||
|
||||
inline void dComIfGs_offSaveItem(int i_no) {
|
||||
g_dComIfG_gameInfo.info.getMemory().getBit().offItem(i_no);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
inline BOOL dComIfGs_isSaveTbox(int i_stageNo, int i_no) {
|
||||
return g_dComIfG_gameInfo.info.getSavedata().getSave(i_stageNo).getBit().isTbox(i_no);
|
||||
}
|
||||
@@ -2020,6 +2102,10 @@ inline void dComIfGs_setKeyNum(u8 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() {
|
||||
g_dComIfG_gameInfo.info.getMemory().getBit().onDungeonItemMap();
|
||||
}
|
||||
@@ -2396,6 +2482,12 @@ inline void dComIfGs_onItem(int i_bitNo, int i_roomNo) {
|
||||
g_dComIfG_gameInfo.info.onItem(i_bitNo, i_roomNo);
|
||||
}
|
||||
|
||||
#if TARGET_PC
|
||||
inline void dComIfGs_offItem(int i_bitNo, int i_roomNo) {
|
||||
g_dComIfG_gameInfo.info.offItem(i_bitNo, i_roomNo);
|
||||
}
|
||||
#endif
|
||||
|
||||
inline bool dComIfGs_isItem(int i_bitNo, int i_roomNo) {
|
||||
return g_dComIfG_gameInfo.info.isItem(i_bitNo, i_roomNo);
|
||||
}
|
||||
@@ -2452,6 +2544,12 @@ inline s8 dComIfGp_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() {
|
||||
return g_dComIfG_gameInfo.play.getStartStageLayer();
|
||||
}
|
||||
@@ -2496,6 +2594,12 @@ inline void dComIfGp_offEnableNextStage() {
|
||||
g_dComIfG_gameInfo.play.offEnableNextStage();
|
||||
}
|
||||
|
||||
#if TARGET_PC
|
||||
inline void dComIfGp_setEnableNextStage() {
|
||||
g_dComIfG_gameInfo.play.setEnableNextStage();
|
||||
}
|
||||
#endif
|
||||
|
||||
inline s8 dComIfGp_getNextStageWipe() {
|
||||
return g_dComIfG_gameInfo.play.getNextStageWipe();
|
||||
}
|
||||
|
||||
@@ -203,6 +203,10 @@ public:
|
||||
DATASELPROC_DATA_SELECT_MOVE_ANIME,
|
||||
DATASELPROC_SELECT_DATA_OPEN_MOVE,
|
||||
DATASELPROC_SELECT_DATA_NAME_MOVE,
|
||||
#if TARGET_PC
|
||||
DATASELPROC_SELECT_DATA_PLAY_MOVE, // Select between vanilla or randomizer play
|
||||
DATASELPROC_MENU_ARCHIPELAGO_CONNECT, // Wait for archipelago to connect
|
||||
#endif
|
||||
DATASELPROC_SELECT_DATA_OPENERASE_MOVE,
|
||||
DATASELPROC_MENU_SELECT,
|
||||
DATASELPROC_MENU_SELECT_MOVE_ANM,
|
||||
@@ -287,6 +291,11 @@ public:
|
||||
MEMCARDCHECKPROC_ERR_YESNO_CURSOR_MOVE_ANM,
|
||||
MEMCARDCHECKPROC_SAVEDATA_CLEAR,
|
||||
|
||||
#if TARGET_PC
|
||||
MEMCARDCHECKPROC_AUTO_MAKE_GAMEFILE,
|
||||
MEMCARDCHECKPROC_AUTO_MAKE_GAMEFILE_ERR_WAIT,
|
||||
#endif
|
||||
|
||||
#if PLATFORM_WII || PLATFORM_SHIELD
|
||||
MEMCARDCHECKPROC_NAND_STAT_CHECK,
|
||||
MEMCARDCHECKPROC_GAMEFILE_INIT_SEL,
|
||||
@@ -326,6 +335,10 @@ public:
|
||||
void makeRecInfo(u8);
|
||||
void selectDataOpenMove();
|
||||
void selectDataNameMove();
|
||||
#if TARGET_PC
|
||||
void selectDataPlayTypeMove();
|
||||
void menuArchipelagoConnect();
|
||||
#endif
|
||||
void selectDataOpenEraseMove();
|
||||
void menuSelect();
|
||||
void menuSelectStart();
|
||||
@@ -411,6 +424,10 @@ public:
|
||||
bool yesnoWakuAlpahAnm(u8);
|
||||
#if TARGET_PC
|
||||
void fileSelectWide();
|
||||
bool pointerDataSelect();
|
||||
bool pointerMenuSelect();
|
||||
bool pointerCopyDataToSelect();
|
||||
bool pointerYesNoSelect(bool errorSelect);
|
||||
#endif
|
||||
void _draw();
|
||||
void errorMoveAnmInitSet(int, int);
|
||||
@@ -445,6 +462,10 @@ public:
|
||||
void MemCardMakeGameFile();
|
||||
void MemCardMakeGameFileWait();
|
||||
void MemCardMakeGameFileCheck();
|
||||
#if TARGET_PC
|
||||
void MemCardAutoMakeGameFile();
|
||||
void MemCardAutoMakeGameFileErrWait();
|
||||
#endif
|
||||
void MemCardMsgWindowInitOpen();
|
||||
void MemCardMsgWindowOpen();
|
||||
void MemCardMsgWindowClose();
|
||||
@@ -719,7 +740,14 @@ public:
|
||||
/* 0x2378 */ J2DPicture* mpFadePict;
|
||||
#endif
|
||||
#ifdef TARGET_PC
|
||||
dDlst_FileSelFade_c mFadeDlst;
|
||||
struct mDusk {
|
||||
dDlst_FileSelFade_c mFadeDlst;
|
||||
bool mStartNameAnm;
|
||||
bool mBackToFileSelect;
|
||||
bool mArchipelagoBeginConnect;
|
||||
bool mArchiStartCloseFile;
|
||||
int mPendingRmlCloseFrames{0};
|
||||
} mDusk;
|
||||
#endif
|
||||
|
||||
#if PLATFORM_WII || PLATFORM_SHIELD
|
||||
@@ -730,7 +758,7 @@ public:
|
||||
};
|
||||
|
||||
#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
|
||||
STATIC_ASSERT(sizeof(dFile_select_c) == 0x237C);
|
||||
#endif
|
||||
|
||||
@@ -32,6 +32,11 @@ void item_func_ARROW_20();
|
||||
void item_func_ARROW_30();
|
||||
void item_func_ARROW_1();
|
||||
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_10();
|
||||
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_LV2();
|
||||
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_HAWK_EYE();
|
||||
void item_func_WOOD_STICK();
|
||||
@@ -81,13 +92,23 @@ void item_func_LIGHT_SWORD();
|
||||
void item_func_FISHING_ROD_1();
|
||||
void item_func_PACHINKO();
|
||||
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_LV1();
|
||||
void item_func_BOMB_IN_BAG();
|
||||
#if TARGET_PC
|
||||
void item_func_DEATH_MOUNTAIN_PORTAL();
|
||||
#endif
|
||||
void item_func_LIGHT_ARROW();
|
||||
void item_func_ARROW_LV1();
|
||||
void item_func_ARROW_LV2();
|
||||
void item_func_ARROW_LV3();
|
||||
#if TARGET_PC
|
||||
void item_func_ZORAS_DOMAIN_PORTAL();
|
||||
#endif
|
||||
void item_func_LURE_ROD();
|
||||
void item_func_BOMB_ARROW();
|
||||
void item_func_HAWK_ARROW();
|
||||
@@ -133,8 +154,33 @@ void item_func_BILL();
|
||||
void item_func_WOOD_STATUE();
|
||||
void item_func_IRIAS_PENDANT();
|
||||
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_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_OIL_BOTTLE3();
|
||||
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_3();
|
||||
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_PUMPKIN();
|
||||
void item_func_SMELL_POH();
|
||||
void item_func_SMELL_FISH();
|
||||
void item_func_SMELL_CHILDREN();
|
||||
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_F_BEETLE();
|
||||
void item_func_M_BUTTERFLY();
|
||||
@@ -177,7 +245,24 @@ void item_func_M_ANT();
|
||||
void item_func_F_ANT();
|
||||
void item_func_M_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();
|
||||
void item_func_ARCHIPELAGO_ITEM();
|
||||
#endif
|
||||
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_AIR_LETTER();
|
||||
void item_func_ANCIENT_DOCUMENT2();
|
||||
@@ -221,6 +306,10 @@ int item_getcheck_func_ARROW_20();
|
||||
int item_getcheck_func_ARROW_30();
|
||||
int item_getcheck_func_ARROW_1();
|
||||
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_10();
|
||||
int item_getcheck_func_WATER_BOMB_20();
|
||||
@@ -254,6 +343,12 @@ int item_getcheck_func_DUNGEON_EXIT_2();
|
||||
int item_getcheck_func_WALLET_LV1();
|
||||
int item_getcheck_func_WALLET_LV2();
|
||||
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_HAWK_EYE();
|
||||
int item_getcheck_func_WOOD_STICK();
|
||||
@@ -270,13 +365,23 @@ int item_getcheck_func_LIGHT_SWORD();
|
||||
int item_getcheck_func_FISHING_ROD_1();
|
||||
int item_getcheck_func_PACHINKO();
|
||||
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_LV1();
|
||||
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_ARROW_LV1();
|
||||
int item_getcheck_func_ARROW_LV2();
|
||||
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_BOMB_ARROW();
|
||||
int item_getcheck_func_HAWK_ARROW();
|
||||
@@ -322,6 +427,10 @@ int item_getcheck_func_BILL();
|
||||
int item_getcheck_func_WOOD_STATUE();
|
||||
int item_getcheck_func_IRIAS_PENDANT();
|
||||
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_ASHS_SCRIBBLING();
|
||||
int item_getcheck_func_CHUCHU_YELLOW2();
|
||||
@@ -336,12 +445,19 @@ int item_getcheck_func_FILLED_CONTAINER();
|
||||
int item_getcheck_func_MIRROR_PIECE_2();
|
||||
int item_getcheck_func_MIRROR_PIECE_3();
|
||||
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_PUMPKIN();
|
||||
int item_getcheck_func_SMELL_POH();
|
||||
int item_getcheck_func_SMELL_FISH();
|
||||
int item_getcheck_func_SMELL_CHILDREN();
|
||||
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_F_BEETLE();
|
||||
int item_getcheck_func_M_BUTTERFLY();
|
||||
@@ -366,7 +482,23 @@ int item_getcheck_func_M_ANT();
|
||||
int item_getcheck_func_F_ANT();
|
||||
int item_getcheck_func_M_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();
|
||||
#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_AIR_LETTER();
|
||||
int item_getcheck_func_ANCIENT_DOCUMENT2();
|
||||
@@ -395,6 +527,9 @@ int checkItemGet(u8, int);
|
||||
BOOL isHeart(u8 item_no);
|
||||
int isBomb(u8);
|
||||
int isArrow(u8);
|
||||
#if TARGET_PC
|
||||
int isRupee(u8);
|
||||
#endif
|
||||
int addBombCount(u8, u8);
|
||||
BOOL isBottleItem(u8 item_no);
|
||||
u8 check_itemno(int i_itemNo);
|
||||
|
||||
@@ -35,7 +35,65 @@ struct dItem_fieldItemResource {
|
||||
/* 0xC */ u16 mHeapSize;
|
||||
}; // 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 {
|
||||
#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 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 u16 getFieldHeapSize(u8 index) { return field_item_res[index].mHeapSize; }
|
||||
#endif
|
||||
|
||||
static dItem_itemResource item_resource[255];
|
||||
static dItem_fieldItemResource field_item_res[255];
|
||||
static dItem_itemInfo item_info[255];
|
||||
#if TARGET_PC
|
||||
static dItem_itemResource item_resource_randomizer[255];
|
||||
static dItem_fieldItemResource field_item_res_randomizer[255];
|
||||
static dItem_itemInfo item_info_randomizer[255];
|
||||
#endif
|
||||
};
|
||||
|
||||
enum {
|
||||
@@ -350,4 +414,267 @@ enum {
|
||||
/* 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_ARCHIPELAGO_ITEM_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 */
|
||||
|
||||
@@ -157,6 +157,9 @@ public:
|
||||
int getDispType() const;
|
||||
void _move(f32, f32, int, f32);
|
||||
void _draw();
|
||||
#if TARGET_PC
|
||||
bool refreshTextureSize();
|
||||
#endif
|
||||
|
||||
virtual ~dMap_c() {
|
||||
#if DEBUG
|
||||
|
||||
@@ -74,6 +74,8 @@ public:
|
||||
|
||||
#if TARGET_PC
|
||||
void menuCollectWide();
|
||||
bool pointerWait();
|
||||
void pointerActivateCurrent();
|
||||
#endif
|
||||
|
||||
void _create();
|
||||
|
||||
@@ -51,6 +51,10 @@ public:
|
||||
void setBButtonString(u16);
|
||||
void setHIO(bool);
|
||||
|
||||
#if TARGET_PC
|
||||
bool pointerWait();
|
||||
#endif
|
||||
|
||||
virtual void draw() { _draw(); }
|
||||
virtual ~dMenu_Insect_c();
|
||||
|
||||
|
||||
@@ -55,6 +55,10 @@ public:
|
||||
u8 getLetterNum();
|
||||
void setHIO(bool);
|
||||
|
||||
#if TARGET_PC
|
||||
bool pointerWait();
|
||||
#endif
|
||||
|
||||
virtual void draw() { _draw(); }
|
||||
virtual ~dMenu_Letter_c();
|
||||
|
||||
|
||||
@@ -80,6 +80,9 @@ public:
|
||||
void setBButtonString(u16);
|
||||
bool isRumbleSupported();
|
||||
bool dpdMenuMove();
|
||||
#if TARGET_PC
|
||||
bool pointerConfirmSelect();
|
||||
#endif
|
||||
void paneResize(u64);
|
||||
void initialize();
|
||||
void yesnoMenuMoveAnmInitSet(int, int);
|
||||
|
||||
@@ -74,6 +74,10 @@ public:
|
||||
void clacEllipsePlotAverage(int, f32, f32);
|
||||
bool dpdMove();
|
||||
u8 openExplain(u8);
|
||||
#if TARGET_PC
|
||||
void updateSlotImage(u8 slot);
|
||||
bool pointerMove();
|
||||
#endif
|
||||
|
||||
virtual void draw() { _draw(); }
|
||||
virtual ~dMenu_Ring_c();
|
||||
@@ -215,6 +219,8 @@ private:
|
||||
bool mCursorInterpPrevAngular;
|
||||
bool mCursorInterpCurrAngular;
|
||||
bool mCursorInterpInit;
|
||||
bool mPointerTouchPressHoveredCurrent;
|
||||
J2DPicture* mDpadIcon;
|
||||
#endif
|
||||
};
|
||||
|
||||
|
||||
@@ -266,6 +266,8 @@ public:
|
||||
|
||||
#if TARGET_PC
|
||||
void menuSaveWide();
|
||||
bool pointerSaveSelect();
|
||||
bool pointerYesNoSelect(bool errorSelect, u8 errParam = 0, u8 soundParam = 0);
|
||||
#endif
|
||||
|
||||
void _draw2();
|
||||
|
||||
@@ -49,6 +49,10 @@ public:
|
||||
u8 getSkillNum();
|
||||
void setHIO(bool);
|
||||
|
||||
#if TARGET_PC
|
||||
bool pointerWait();
|
||||
#endif
|
||||
|
||||
virtual void draw() { _draw(); }
|
||||
virtual ~dMenu_Skill_c();
|
||||
|
||||
|
||||
@@ -129,7 +129,9 @@ public:
|
||||
bool getPlayerSubject();
|
||||
bool isBButtonShow(bool);
|
||||
s16 getButtonTimer();
|
||||
|
||||
#if TARGET_PC
|
||||
f32 getZButtonAlpha() { return mButtonZAlpha;}
|
||||
#endif
|
||||
virtual ~dMeter2Draw_c();
|
||||
|
||||
J2DScreen* getMainScreenPtr() { return mpScreen; }
|
||||
|
||||
+20
-2
@@ -58,6 +58,9 @@ public:
|
||||
int checkEventRender(int*, int*, int*, int*);
|
||||
void remove();
|
||||
u16 getEventId(int*);
|
||||
#if TARGET_PC
|
||||
u16 getEventId();
|
||||
#endif
|
||||
u32 getMsgNo();
|
||||
u32 getNowMsgNo();
|
||||
msg_class* getMsg();
|
||||
@@ -128,6 +131,9 @@ public:
|
||||
u16 query051(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);
|
||||
#if TARGET_PC
|
||||
u16 query054(mesg_flow_node_branch*, fopAc_ac_c*, int);
|
||||
#endif
|
||||
int event000(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*);
|
||||
@@ -171,6 +177,11 @@ public:
|
||||
int event040(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*);
|
||||
#if TARGET_PC
|
||||
// events for rando
|
||||
int event043(mesg_flow_node_event*, fopAc_ac_c*);
|
||||
int event044(mesg_flow_node_event*, fopAc_ac_c*);
|
||||
#endif
|
||||
|
||||
void initWord(fopAc_ac_c*, const char*, u8, int, fopAc_ac_c**);
|
||||
|
||||
@@ -185,8 +196,15 @@ public:
|
||||
void setMsg(u32 msg) { mMsg = msg; }
|
||||
bool checkEndFlow() { return (u32)field_0x26 == 1; }
|
||||
|
||||
static queryFunc mQueryList[53];
|
||||
static eventFunc mEventList[43];
|
||||
static queryFunc mQueryList[DUSK_IF_ELSE(54, 53)];
|
||||
static eventFunc mEventList[DUSK_IF_ELSE(45, 43)];
|
||||
|
||||
#if TARGET_PC
|
||||
// patch funcs for rando
|
||||
void randoPatchNodeType(u8& type, u16 nodeIdx);
|
||||
void randoPatchBranchNode(mesg_flow_node_branch*& branch_node, u16 nodeIdx);
|
||||
void randoPatchEventNode(mesg_flow_node_event*& event_node, u16 nodeIdx);
|
||||
#endif
|
||||
|
||||
private:
|
||||
/* 0x04 */ u8* mFlow_p;
|
||||
|
||||
@@ -360,7 +360,12 @@ inline void dMsgObject_demoMessageGroup() {
|
||||
}
|
||||
|
||||
inline bool dMsgObject_isTalkNowCheck() {
|
||||
#if TARGET_PC
|
||||
dMsgObject_c* msgObject = dMsgObject_getMsgObjectClass();
|
||||
return msgObject != NULL && msgObject->getStatus() != 1;
|
||||
#else
|
||||
return dMsgObject_getMsgObjectClass()->getStatus() == 1 ? false : true;
|
||||
#endif
|
||||
}
|
||||
|
||||
inline bool dMsgObject_isKillMessageFlag() {
|
||||
@@ -497,7 +502,12 @@ inline void dMsgObject_onMsgSend() {
|
||||
}
|
||||
|
||||
inline bool dMsgObject_isFukidashiCheck() {
|
||||
#if TARGET_PC
|
||||
dMsgObject_c* msgObject = dMsgObject_getMsgObjectClass();
|
||||
return msgObject != NULL && msgObject->getScrnDrawPtr() != NULL;
|
||||
#else
|
||||
return dMsgObject_getMsgObjectClass()->getScrnDrawPtr() == NULL ? false : true;
|
||||
#endif
|
||||
}
|
||||
|
||||
inline void* dMsgObject_getTalkHeap() {
|
||||
|
||||
@@ -49,6 +49,10 @@ public:
|
||||
void selectScale();
|
||||
void selectTrans();
|
||||
void selectAnimeTransform(int);
|
||||
#if TARGET_PC
|
||||
bool pointerMove();
|
||||
bool consumePointerClick();
|
||||
#endif
|
||||
|
||||
void setOffsetX(f32 i_offsetX) { mOffsetX = i_offsetX; }
|
||||
bool isAnimeUpdate(int param_0) { return (field_0x114 & (u8)(1 << param_0)) ? TRUE : FALSE; }
|
||||
|
||||
@@ -10,6 +10,10 @@
|
||||
#include "JSystem/JHostIO/JORReflexible.h"
|
||||
#include "dusk/endian.h"
|
||||
|
||||
#if TARGET_PC
|
||||
#include <unordered_map>
|
||||
#endif
|
||||
|
||||
static const int DEFAULT_SELECT_ITEM_INDEX = 0;
|
||||
static const int MAX_SELECT_ITEM = 4;
|
||||
static const int SELECT_ITEM_NUM = 2;
|
||||
@@ -199,6 +203,9 @@ public:
|
||||
void setTime(f32 i_time) { mTime = i_time; }
|
||||
u16 getDate() const { return mDate; }
|
||||
void setDate(u16 i_date) { mDate = i_date; }
|
||||
#if TARGET_PC
|
||||
u8 getDarkClearLV() const { return mDarkClearLevelFlag; }
|
||||
#endif
|
||||
|
||||
/* 0x00 */ BE(OSTime) mDateIpl;
|
||||
/* 0x08 */ u8 mTransformLevelFlag;
|
||||
@@ -272,6 +279,9 @@ public:
|
||||
bool isFieldDataExistFlag() const { return mFieldDataExistFlag ? true : false; }
|
||||
void offFieldDataExistFlag() { mFieldDataExistFlag = false; }
|
||||
void onFieldDataExistFlag() { mFieldDataExistFlag = true; }
|
||||
#if TARGET_PC
|
||||
void setRegionBit(u8 region) { mRegion |= region;}
|
||||
#endif
|
||||
|
||||
#if TARGET_PC
|
||||
/* 0x00 */ BE(Vec) mPos;
|
||||
@@ -376,12 +386,21 @@ public:
|
||||
void setArrowNum(u8 i_num) { mArrowNum = i_num; }
|
||||
u8 getPachinkoNum() const { return mPachinkoNum; }
|
||||
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;
|
||||
/* 0x1 */ u8 mBombNum[3];
|
||||
/* 0x4 */ u8 mBottleNum[4];
|
||||
/* 0x8 */ u8 mPachinkoNum;
|
||||
#if TARGET_PC
|
||||
/* 0x9 */ u8 mAncientDocumentNum; // Custom Field for Randomizer
|
||||
/* 0x9 */ u8 unk5[2];
|
||||
#else
|
||||
/* 0x9 */ u8 unk5[3];
|
||||
#endif
|
||||
}; // Size: 0xC
|
||||
|
||||
class dSv_player_item_max_c {
|
||||
@@ -413,7 +432,11 @@ public:
|
||||
u8 getPohNum() const { return mPohNum; }
|
||||
|
||||
void addPohNum() {
|
||||
#if TARGET_PC
|
||||
if (mPohNum < 0x3D) {
|
||||
#else
|
||||
if (mPohNum < 0xFF) {
|
||||
#endif
|
||||
mPohNum++;
|
||||
}
|
||||
}
|
||||
@@ -458,6 +481,11 @@ public:
|
||||
int isLetterReadFlag(int i_no) const;
|
||||
u8 getGetNumber(int i_no) { return mGetNumber[i_no]; }
|
||||
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];
|
||||
/* 0x08 */ BE(u32) mLetterReadFlags[2];
|
||||
@@ -664,10 +692,14 @@ public:
|
||||
void onDungeonItemBossKey() { onDungeonItem(BOSS_KEY); }
|
||||
void offDungeonItemBossKey() { offDungeonItem(BOSS_KEY); }
|
||||
s32 isDungeonItemBossKey() const { return isDungeonItem(BOSS_KEY); }
|
||||
#if TARGET_PC
|
||||
void onStageBossEnemy();
|
||||
#else
|
||||
void onStageBossEnemy() {
|
||||
onDungeonItem(STAGE_BOSS_ENEMY);
|
||||
onDungeonItem(OOCCOO_NOTE);
|
||||
}
|
||||
#endif
|
||||
void offStageBossEnemy() { offDungeonItem(STAGE_BOSS_ENEMY); }
|
||||
s32 isStageBossEnemy() const { return isDungeonItem(STAGE_BOSS_ENEMY); }
|
||||
void onStageLife() { onDungeonItem(STAGE_LIFE); }
|
||||
@@ -948,6 +980,7 @@ public:
|
||||
/* 0x8 */ s8 m_no;
|
||||
};
|
||||
|
||||
|
||||
class dSv_info_c {
|
||||
public:
|
||||
void init();
|
||||
@@ -960,6 +993,9 @@ public:
|
||||
BOOL isSwitch(int i_no, int i_roomNo) const;
|
||||
BOOL revSwitch(int i_no, int i_roomNo);
|
||||
void onItem(int i_no, int i_roomNo);
|
||||
#if TARGET_PC
|
||||
void offItem(int i_no, int i_roomNo);
|
||||
#endif
|
||||
BOOL isItem(int i_no, int i_roomNo) const;
|
||||
void onActor(int i_no, int i_roomNo);
|
||||
void offActor(int i_no, int i_roomNo);
|
||||
|
||||
@@ -1292,6 +1292,9 @@ public:
|
||||
void set(const char*, s8, s16, s8, s8, u8);
|
||||
void offEnable() { enabled = 0; }
|
||||
BOOL isEnable() const { return enabled; }
|
||||
#if TARGET_PC
|
||||
void setEnable() { enabled |= 0x1; }
|
||||
#endif
|
||||
s8 getWipe() const { return wipe; }
|
||||
u8 getWipeSpeed() const { return wipe_speed; }
|
||||
dStage_startStage_c* getStartStage() { return this; }
|
||||
|
||||
@@ -9,6 +9,8 @@ namespace dusk {
|
||||
enum class ActionBinds {
|
||||
FIRST_PERSON_CAMERA,
|
||||
CALL_MIDNA,
|
||||
OPEN_MAP_SCREEN,
|
||||
TOGGLE_MINIMAP,
|
||||
OPEN_DUSKLIGHT_MENU,
|
||||
TURBO_SPEED_BUTTON,
|
||||
COUNT,
|
||||
@@ -32,6 +34,12 @@ bool isActionBound(ActionBinds action, u32 port);
|
||||
|
||||
void updateActionBindings();
|
||||
|
||||
void setVirtualActionBind(ActionBinds action, u32 port, bool pressed, bool available = true);
|
||||
|
||||
void clearVirtualActionBind(ActionBinds action, u32 port);
|
||||
|
||||
void clearAllVirtualActionBinds();
|
||||
|
||||
bool getActionBindTrig(ActionBinds action, u32 port);
|
||||
|
||||
bool getActionBindHold(ActionBinds action, u32 port);
|
||||
|
||||
@@ -4,6 +4,7 @@
|
||||
#include "dolphin/types.h"
|
||||
#include <type_traits>
|
||||
#include <cstdlib>
|
||||
#include <limits>
|
||||
#include <string>
|
||||
|
||||
/**
|
||||
@@ -139,11 +140,16 @@ concept ConfigValueInteger =
|
||||
|| std::is_same_v<T, s64>
|
||||
|| std::is_same_v<T, u64>;
|
||||
|
||||
template <typename T>
|
||||
struct ConfigValueTraits {
|
||||
static constexpr bool enabled = false;
|
||||
};
|
||||
|
||||
/**
|
||||
* \brief Concept that defines the legal set of types that can be used for CVar values.
|
||||
*
|
||||
* Valid types cannot be cv-qualified and must be basic primitive types (int, float, bool),
|
||||
* strings, or enums of the basic primitives.
|
||||
* strings, enums of the basic primitives, or explicitly-enabled structured settings.
|
||||
*/
|
||||
template <typename T>
|
||||
concept ConfigValue =
|
||||
@@ -154,7 +160,8 @@ concept ConfigValue =
|
||||
|| std::is_same_v<T, f32>
|
||||
|| std::is_same_v<T, f64>
|
||||
|| std::is_same_v<T, std::string>
|
||||
|| (std::is_enum_v<T> && ConfigValueInteger<std::underlying_type_t<T>>));
|
||||
|| (std::is_enum_v<T> && ConfigValueInteger<std::underlying_type_t<T>>)
|
||||
|| ConfigValueTraits<T>::enabled);
|
||||
|
||||
template <ConfigValue T>
|
||||
const ConfigImplBase* GetConfigImpl();
|
||||
|
||||
@@ -0,0 +1,65 @@
|
||||
#pragma once
|
||||
|
||||
#include "dolphin/types.h"
|
||||
|
||||
class CPaneMgr;
|
||||
|
||||
namespace dusk::menu_pointer {
|
||||
|
||||
using TargetId = u16;
|
||||
constexpr TargetId InvalidTarget = 0xffff;
|
||||
|
||||
enum class Context {
|
||||
None,
|
||||
FileSelect,
|
||||
Save,
|
||||
ItemWheel,
|
||||
Collection,
|
||||
Options,
|
||||
Dialog,
|
||||
};
|
||||
|
||||
enum class Phase {
|
||||
Move,
|
||||
Press,
|
||||
Release,
|
||||
Cancel,
|
||||
};
|
||||
|
||||
struct State {
|
||||
f32 x = 0.0f;
|
||||
f32 y = 0.0f;
|
||||
bool valid = false;
|
||||
bool down = false;
|
||||
bool pressed = false;
|
||||
bool released = false;
|
||||
bool clicked = false;
|
||||
bool touch = false;
|
||||
};
|
||||
|
||||
void begin_game_frame() noexcept;
|
||||
void end_game_frame() noexcept;
|
||||
void begin_context(Context context) noexcept;
|
||||
bool handle_fallthrough_pointer(f32 x, f32 y, Phase phase, bool touch, s32 mouseButton = -1) noexcept;
|
||||
|
||||
bool active() noexcept;
|
||||
bool enabled() noexcept;
|
||||
bool mouse_capture_active() noexcept;
|
||||
const State& state() noexcept;
|
||||
void set_hover_target(TargetId target) noexcept;
|
||||
bool consume_click() noexcept;
|
||||
bool peek_click() noexcept;
|
||||
void set_dialog_choice(u8 choice, bool clicked) noexcept;
|
||||
bool get_dialog_choice(u8& choice) noexcept;
|
||||
bool consume_dialog_click(u8& choice) noexcept;
|
||||
void defer_activation(Context context, TargetId target) noexcept;
|
||||
bool consume_deferred_activation(Context context, TargetId target) noexcept;
|
||||
void clear_deferred_activation(Context context) noexcept;
|
||||
u32 suppressed_pad_buttons(u32 port) noexcept;
|
||||
void finish_pad_suppression_read(u32 port) noexcept;
|
||||
|
||||
bool hit_rect(f32 left, f32 top, f32 right, f32 bottom, f32 padding = 0.0f) noexcept;
|
||||
bool hit_pane(CPaneMgr* pane, f32 padding = 0.0f) noexcept;
|
||||
bool hit_pane(J2DPane* pane, f32 padding = 0.0f) noexcept;
|
||||
|
||||
} // namespace dusk::menu_pointer
|
||||
+68
-17
@@ -1,9 +1,9 @@
|
||||
#ifndef DUSK_CONFIG_H
|
||||
#define DUSK_CONFIG_H
|
||||
#pragma once
|
||||
|
||||
#include <array>
|
||||
|
||||
#include "dusk/config_var.hpp"
|
||||
#include "dusk/ui/controls.hpp"
|
||||
|
||||
namespace dusk {
|
||||
|
||||
@@ -40,17 +40,18 @@ enum class DiscVerificationState : u8 {
|
||||
HashMismatch,
|
||||
};
|
||||
|
||||
enum class GyroMode : u8 {
|
||||
Sensor = 0,
|
||||
Mouse = 1,
|
||||
};
|
||||
|
||||
enum class FrameInterpMode : u8 {
|
||||
Off = 0,
|
||||
Capped = 1,
|
||||
Unlimited = 2,
|
||||
};
|
||||
|
||||
enum class TouchTargeting : u8 {
|
||||
Hybrid = 0,
|
||||
Hold = 1,
|
||||
Switch = 2,
|
||||
};
|
||||
|
||||
enum class MenuScaling : u8 {
|
||||
GameCube = 0,
|
||||
Wii = 1,
|
||||
@@ -96,18 +97,18 @@ struct ConfigEnumRange<DiscVerificationState> {
|
||||
static constexpr auto max = DiscVerificationState::HashMismatch;
|
||||
};
|
||||
|
||||
template <>
|
||||
struct ConfigEnumRange<GyroMode> {
|
||||
static constexpr auto min = GyroMode::Sensor;
|
||||
static constexpr auto max = GyroMode::Mouse;
|
||||
};
|
||||
|
||||
template <>
|
||||
struct ConfigEnumRange<FrameInterpMode> {
|
||||
static constexpr auto min = FrameInterpMode::Off;
|
||||
static constexpr auto max = FrameInterpMode::Unlimited;
|
||||
};
|
||||
|
||||
template <>
|
||||
struct ConfigEnumRange<TouchTargeting> {
|
||||
static constexpr auto min = TouchTargeting::Hybrid;
|
||||
static constexpr auto max = TouchTargeting::Switch;
|
||||
};
|
||||
|
||||
template <>
|
||||
struct ConfigEnumRange<MenuScaling> {
|
||||
static constexpr auto min = MenuScaling::GameCube;
|
||||
@@ -119,6 +120,11 @@ struct ConfigEnumRange<MagicArmorMode> {
|
||||
static constexpr auto min = MagicArmorMode::NORMAL;
|
||||
static constexpr auto max = MagicArmorMode::COSMETIC;
|
||||
};
|
||||
|
||||
template <>
|
||||
struct ConfigValueTraits<ui::ControlLayout> {
|
||||
static constexpr bool enabled = true;
|
||||
};
|
||||
} // namespace config
|
||||
|
||||
// Persistent user settings
|
||||
@@ -134,6 +140,9 @@ struct UserSettings {
|
||||
ConfigVar<bool> enableFpsOverlay;
|
||||
ConfigVar<int> fpsOverlayCorner;
|
||||
ConfigVar<int> maxFrameRate;
|
||||
ConfigVar<bool> rememberWindowSize;
|
||||
ConfigVar<int> lastWindowWidth;
|
||||
ConfigVar<int> lastWindowHeight;
|
||||
} video;
|
||||
|
||||
struct {
|
||||
@@ -218,6 +227,10 @@ struct UserSettings {
|
||||
ConfigVar<float> mouseCameraSensitivity;
|
||||
ConfigVar<bool> invertMouseY;
|
||||
ConfigVar<bool> freeCamera;
|
||||
ConfigVar<bool> enableTouchControls;
|
||||
ConfigVar<TouchTargeting> touchTargeting;
|
||||
ConfigVar<bool> enableMenuPointer;
|
||||
ConfigVar<ui::ControlLayout> touchControlsLayout;
|
||||
ConfigVar<bool> invertCameraXAxis;
|
||||
ConfigVar<bool> invertCameraYAxis;
|
||||
ConfigVar<bool> invertFirstPersonXAxis;
|
||||
@@ -226,6 +239,8 @@ struct UserSettings {
|
||||
ConfigVar<bool> invertAirSwimY;
|
||||
ConfigVar<float> freeCameraXSensitivity;
|
||||
ConfigVar<float> freeCameraYSensitivity;
|
||||
ConfigVar<float> touchCameraXSensitivity;
|
||||
ConfigVar<float> touchCameraYSensitivity;
|
||||
ConfigVar<bool> debugFlyCam;
|
||||
ConfigVar<bool> debugFlyCamLockEvents;
|
||||
ConfigVar<bool> allowBackgroundInput;
|
||||
@@ -263,6 +278,8 @@ struct UserSettings {
|
||||
ConfigVar<bool> liveSplitEnabled;
|
||||
ConfigVar<bool> showSpeedrunRTATimer;
|
||||
ConfigVar<bool> recordingMode;
|
||||
|
||||
// Misc
|
||||
ConfigVar<bool> removeQuestMapMarkers;
|
||||
ConfigVar<bool> showInputViewer;
|
||||
ConfigVar<bool> showInputViewerGyro;
|
||||
@@ -273,7 +290,6 @@ struct UserSettings {
|
||||
ConfigVar<DiscVerificationState> isoVerification;
|
||||
ConfigVar<std::string> graphicsBackend;
|
||||
ConfigVar<bool> skipPreLaunchUI;
|
||||
ConfigVar<bool> showPipelineCompilation;
|
||||
ConfigVar<bool> wasPresetChosen;
|
||||
ConfigVar<bool> checkForUpdates;
|
||||
ConfigVar<int> cardFileType;
|
||||
@@ -284,9 +300,46 @@ struct UserSettings {
|
||||
struct {
|
||||
std::array<ActionBindConfigVar, 4> firstPersonCamera;
|
||||
std::array<ActionBindConfigVar, 4> callMidna;
|
||||
std::array<ActionBindConfigVar, 4> openMapScreen;
|
||||
std::array<ActionBindConfigVar, 4> toggleMinimap;
|
||||
std::array<ActionBindConfigVar, 4> openDusklightMenu;
|
||||
std::array<ActionBindConfigVar, 4> turboSpeedButton;
|
||||
} actionBindings;
|
||||
|
||||
// Randomizer seed hashes, 1 per file
|
||||
struct {
|
||||
std::array<ConfigVar<std::string>, 3> seedHashes;
|
||||
} randomizer;
|
||||
|
||||
// Archipelago Settings
|
||||
struct {
|
||||
std::array<ConfigVar<std::string>, 3> savesServerIP;
|
||||
std::array<ConfigVar<std::string>, 3> savesServerPass;
|
||||
std::array<ConfigVar<std::string>, 3> savesSlotName;
|
||||
} archipelago;
|
||||
|
||||
// Cosmetics
|
||||
struct {
|
||||
ConfigVar<std::string> herosTunicCapColor;
|
||||
ConfigVar<std::string> herosTunicTorsoColor;
|
||||
ConfigVar<std::string> herosTunicSkirtColor;
|
||||
ConfigVar<std::string> zoraArmorCapColor;
|
||||
ConfigVar<std::string> zoraArmorHelmetColor;
|
||||
ConfigVar<std::string> zoraArmorTorsoColor;
|
||||
ConfigVar<std::string> zoraArmorScalesColor;
|
||||
ConfigVar<std::string> zoraArmorFlippersColor;
|
||||
ConfigVar<std::string> lanternGlowColor;
|
||||
ConfigVar<std::string> woodenSwordColor;
|
||||
ConfigVar<std::string> msBladeColor;
|
||||
ConfigVar<std::string> msHandleColor;
|
||||
ConfigVar<std::string> lightSwordGlowColor;
|
||||
ConfigVar<std::string> boomerangColor;
|
||||
ConfigVar<std::string> ironBootsColor;
|
||||
ConfigVar<std::string> spinnerColor;
|
||||
ConfigVar<std::string> linkHairColor;
|
||||
ConfigVar<std::string> wolfLinkColor;
|
||||
ConfigVar<std::string> eponaColor;
|
||||
} cosmetics;
|
||||
};
|
||||
|
||||
UserSettings& getSettings();
|
||||
@@ -315,6 +368,4 @@ struct TransientSettings {
|
||||
|
||||
TransientSettings& getTransientSettings();
|
||||
|
||||
}
|
||||
|
||||
#endif // DUSK_CONFIG_H
|
||||
} // namespace dusk
|
||||
|
||||
@@ -0,0 +1,12 @@
|
||||
#pragma once
|
||||
|
||||
namespace dusk::touch_camera {
|
||||
|
||||
constexpr float YAW_DEGREES_PER_DP = 0.34f;
|
||||
constexpr float PITCH_DEGREES_PER_DP = 0.22f;
|
||||
|
||||
void add_delta(float yaw_dp, float pitch_dp) noexcept;
|
||||
bool consume_delta(float& yaw_dp, float& pitch_dp) noexcept;
|
||||
void clear() noexcept;
|
||||
|
||||
} // namespace dusk::touch_camera
|
||||
@@ -398,4 +398,7 @@ inline int mDoAud_monsSeStart(u32 i_soundId, const Vec* i_pos, u32 i_actorId, u3
|
||||
0);
|
||||
}
|
||||
|
||||
#if TARGET_PC
|
||||
mDoAud_zelAudio_c& mDoAud_getZelAudio();
|
||||
#endif
|
||||
#endif /* M_DO_M_DO_AUDIO_H */
|
||||
|
||||
@@ -67,6 +67,10 @@ public:
|
||||
|
||||
JKRMemArchive* getArchive() const { return mArchive; }
|
||||
JKRHeap* getHeap() const { return mHeap; }
|
||||
#if TARGET_PC
|
||||
s32 getEntryNumber() const { return mEntryNumber; }
|
||||
#endif
|
||||
|
||||
|
||||
private:
|
||||
/* 0x14 */ u8 mMountDirection;
|
||||
|
||||
@@ -212,6 +212,9 @@ public:
|
||||
void setCornerColor(JUtility::TColor c0) {
|
||||
setCornerColor(c0, c0, c0, c0);
|
||||
}
|
||||
#if TARGET_PC
|
||||
JUtility::TColor corner(size_t index) const { return mCornerColor[index]; }
|
||||
#endif
|
||||
|
||||
protected:
|
||||
/* 0x100 */ JUTTexture* mTexture[2];
|
||||
|
||||
@@ -154,6 +154,18 @@ public:
|
||||
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 getGradColor() { return mGradientColor; }
|
||||
u16 getStringAllocByte() const { return mStringLength; }
|
||||
|
||||
@@ -3,6 +3,20 @@
|
||||
|
||||
#include <gx.h>
|
||||
|
||||
#if TARGET_PC
|
||||
#include <mtx.h>
|
||||
|
||||
struct ParticleDrawCtx {
|
||||
bool batch; // off = immediate mode
|
||||
bool useTexMtx; // UVs transformed by texMtx
|
||||
bool useClr0; // prm color in GX_VA_CLR0
|
||||
bool useClr1; // env color in GX_VA_CLR1
|
||||
Mtx texMtx;
|
||||
GXColor clr0;
|
||||
GXColor clr1;
|
||||
};
|
||||
#endif
|
||||
|
||||
struct JPAEmitterWorkData;
|
||||
class JPABaseParticle;
|
||||
class JKRHeap;
|
||||
@@ -75,6 +89,9 @@ public:
|
||||
|
||||
const GXTevColorArg* getTevColorArg() const { return st_ca[(pBsd->mFlags >> 0x0F) & 0x07]; }
|
||||
const GXTevAlphaArg* getTevAlphaArg() const { return st_aa[(pBsd->mFlags >> 0x12) & 0x01]; }
|
||||
#if TARGET_PC
|
||||
u32 getTevColorArgSel() const { return (pBsd->mFlags >> 0x0F) & 0x07; }
|
||||
#endif
|
||||
|
||||
u32 getType() const { return (pBsd->mFlags >> 0) & 0x0F; }
|
||||
u32 getDirType() const { return (pBsd->mFlags >> 4) & 0x07; }
|
||||
@@ -186,26 +203,34 @@ void JPARegistPrm(JPAEmitterWorkData*);
|
||||
void JPARegistEnv(JPAEmitterWorkData*);
|
||||
void JPARegistPrmEnv(JPAEmitterWorkData*);
|
||||
|
||||
void JPADrawPoint(JPAEmitterWorkData*, JPABaseParticle*);
|
||||
void JPADrawLine(JPAEmitterWorkData*, JPABaseParticle*);
|
||||
void JPADrawRotBillboard(JPAEmitterWorkData*, JPABaseParticle*);
|
||||
void JPADrawBillboard(JPAEmitterWorkData*, JPABaseParticle*);
|
||||
void JPADrawRotDirection(JPAEmitterWorkData*, JPABaseParticle*);
|
||||
void JPADrawDirection(JPAEmitterWorkData*, JPABaseParticle*);
|
||||
void JPADrawRotation(JPAEmitterWorkData*, JPABaseParticle*);
|
||||
void JPADrawDBillboard(JPAEmitterWorkData*, JPABaseParticle*);
|
||||
void JPADrawRotYBillboard(JPAEmitterWorkData*, JPABaseParticle*);
|
||||
void JPADrawYBillboard(JPAEmitterWorkData*, JPABaseParticle*);
|
||||
void JPADrawParticleCallBack(JPAEmitterWorkData*, JPABaseParticle*);
|
||||
void JPALoadTexAnm(JPAEmitterWorkData*, JPABaseParticle*);
|
||||
void JPASetPointSize(JPAEmitterWorkData*, JPABaseParticle*);
|
||||
void JPASetLineWidth(JPAEmitterWorkData*, JPABaseParticle*);
|
||||
void JPALoadCalcTexCrdMtxAnm(JPAEmitterWorkData*, JPABaseParticle*);
|
||||
void JPARegistAlpha(JPAEmitterWorkData*, JPABaseParticle*);
|
||||
void JPARegistEnv(JPAEmitterWorkData*, JPABaseParticle*);
|
||||
void JPARegistAlphaEnv(JPAEmitterWorkData*, JPABaseParticle*);
|
||||
void JPARegistPrmAlpha(JPAEmitterWorkData*, JPABaseParticle*);
|
||||
void JPARegistPrmAlphaEnv(JPAEmitterWorkData*, JPABaseParticle*);
|
||||
#if TARGET_PC
|
||||
#define JPA_DRAW_PARTICLE_ARGS JPAEmitterWorkData*, JPABaseParticle*, ParticleDrawCtx*
|
||||
#else
|
||||
#define JPA_DRAW_PARTICLE_ARGS JPAEmitterWorkData*, JPABaseParticle*
|
||||
#endif
|
||||
|
||||
void JPADrawPoint(JPA_DRAW_PARTICLE_ARGS);
|
||||
void JPADrawLine(JPA_DRAW_PARTICLE_ARGS);
|
||||
void JPADrawRotBillboard(JPA_DRAW_PARTICLE_ARGS);
|
||||
void JPADrawBillboard(JPA_DRAW_PARTICLE_ARGS);
|
||||
void JPADrawRotDirection(JPA_DRAW_PARTICLE_ARGS);
|
||||
void JPADrawDirection(JPA_DRAW_PARTICLE_ARGS);
|
||||
void JPADrawRotation(JPA_DRAW_PARTICLE_ARGS);
|
||||
void JPADrawDBillboard(JPA_DRAW_PARTICLE_ARGS);
|
||||
void JPADrawRotYBillboard(JPA_DRAW_PARTICLE_ARGS);
|
||||
void JPADrawYBillboard(JPA_DRAW_PARTICLE_ARGS);
|
||||
void JPADrawParticleCallBack(JPA_DRAW_PARTICLE_ARGS);
|
||||
void JPALoadTexAnm(JPA_DRAW_PARTICLE_ARGS);
|
||||
void JPASetPointSize(JPA_DRAW_PARTICLE_ARGS);
|
||||
void JPASetLineWidth(JPA_DRAW_PARTICLE_ARGS);
|
||||
void JPALoadCalcTexCrdMtxAnm(JPA_DRAW_PARTICLE_ARGS);
|
||||
void JPARegistAlpha(JPA_DRAW_PARTICLE_ARGS);
|
||||
void JPARegistEnv(JPA_DRAW_PARTICLE_ARGS);
|
||||
void JPARegistAlphaEnv(JPA_DRAW_PARTICLE_ARGS);
|
||||
void JPARegistPrmAlpha(JPA_DRAW_PARTICLE_ARGS);
|
||||
void JPARegistPrmAlphaEnv(JPA_DRAW_PARTICLE_ARGS);
|
||||
|
||||
#undef JPA_DRAW_PARTICLE_ARGS
|
||||
|
||||
#if TARGET_PC
|
||||
void JPAInterpBillboard(JPAEmitterWorkData*, JPABaseParticle*);
|
||||
|
||||
@@ -17,6 +17,10 @@ class JPADynamicsBlock;
|
||||
class JPAFieldBlock;
|
||||
class JPAKeyBlock;
|
||||
|
||||
#if TARGET_PC
|
||||
struct ParticleDrawCtx;
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @ingroup jsystem-jparticle
|
||||
*
|
||||
@@ -50,13 +54,19 @@ public:
|
||||
public:
|
||||
typedef void (*EmitterFunc)(JPAEmitterWorkData*);
|
||||
typedef void (*ParticleFunc)(JPAEmitterWorkData*, JPABaseParticle*);
|
||||
#if TARGET_PC
|
||||
typedef void (*DrawParticleFunc)(JPAEmitterWorkData*, JPABaseParticle*,
|
||||
ParticleDrawCtx*);
|
||||
#else
|
||||
typedef ParticleFunc DrawParticleFunc;
|
||||
#endif
|
||||
/* 0x00 */ EmitterFunc* mpCalcEmitterFuncList;
|
||||
/* 0x04 */ EmitterFunc* mpDrawEmitterFuncList;
|
||||
/* 0x08 */ EmitterFunc* mpDrawEmitterChildFuncList;
|
||||
/* 0x0C */ ParticleFunc* mpCalcParticleFuncList;
|
||||
/* 0x10 */ ParticleFunc* mpDrawParticleFuncList;
|
||||
/* 0x10 */ DrawParticleFunc* mpDrawParticleFuncList;
|
||||
/* 0x14 */ ParticleFunc* mpCalcParticleChildFuncList;
|
||||
/* 0x18 */ ParticleFunc* mpDrawParticleChildFuncList;
|
||||
/* 0x18 */ DrawParticleFunc* mpDrawParticleChildFuncList;
|
||||
|
||||
/* 0x1C */ JPABaseShape* pBsp;
|
||||
/* 0x20 */ JPAExtraShape* pEsp;
|
||||
@@ -77,6 +87,20 @@ public:
|
||||
/* 0x45 */ u8 mpDrawParticleFuncListNum;
|
||||
/* 0x46 */ u8 mpCalcParticleChildFuncListNum;
|
||||
/* 0x47 */ u8 mpDrawParticleChildFuncListNum;
|
||||
|
||||
#if TARGET_PC
|
||||
struct BatchInfo {
|
||||
f32 vtxPos[8][3];
|
||||
f32 vtxUv[8][2];
|
||||
u8 vtxCount; // 4 (quad) or 8 (cross)
|
||||
bool supported; // draw func list contains only batchable funcs
|
||||
bool hasPtclColor; // per-particle JPARegist* func is present
|
||||
bool hasPtclTexMtx; // JPALoadCalcTexCrdMtxAnm is present
|
||||
};
|
||||
BatchInfo mBatchInfo;
|
||||
|
||||
void initBatchInfo();
|
||||
#endif
|
||||
};
|
||||
|
||||
#endif /* JPARESOURCE_H */
|
||||
|
||||
@@ -136,8 +136,8 @@ void J3DLoadCPCmd(u8 addr, u32 val) {
|
||||
#if TARGET_PC
|
||||
static void J3DLoadArrayBasePtr(GXAttr attr, void* data, u32 size, bool le) {
|
||||
u32 idx = (attr == GX_VA_NBT) ? 1 : (attr - GX_VA_POS);
|
||||
GXCmd1u8(GX_LOAD_AURORA);
|
||||
GXCmd1u16(GX_LOAD_AURORA_ARRAYBASE | idx);
|
||||
GXCmd1u8(GX_AURORA);
|
||||
GXCmd1u16(GX_AURORA_LOAD_ARRAYBASE | idx);
|
||||
GXCmd1u64((u64)data);
|
||||
GXCmd1u32(size);
|
||||
GXCmd1u8(le ? 1 : 0);
|
||||
|
||||
@@ -7,265 +7,11 @@
|
||||
#include "JSystem/JKernel/JKRHeap.h"
|
||||
|
||||
#if TARGET_PC
|
||||
#include <algorithm>
|
||||
#include <aurora/dl.hpp>
|
||||
#include <tracy/Tracy.hpp>
|
||||
#include <vector>
|
||||
#include "dusk/logging.h"
|
||||
|
||||
namespace {
|
||||
|
||||
u16 read_be16(const u8* data) {
|
||||
return (u16(data[0]) << 8) | data[1];
|
||||
}
|
||||
|
||||
void append_be16(std::vector<u8>& out, u16 value) {
|
||||
out.push_back(value >> 8);
|
||||
out.push_back(value & 0xFF);
|
||||
}
|
||||
|
||||
void append_bytes(std::vector<u8>& out, const u8* data, u32 size) {
|
||||
out.insert(out.end(), data, data + size);
|
||||
}
|
||||
|
||||
bool is_matrix_idx_attr(GXAttr attr) {
|
||||
return attr >= GX_VA_PNMTXIDX && attr <= GX_VA_TEX7MTXIDX;
|
||||
}
|
||||
|
||||
bool is_draw_opcode(u8 opcode) {
|
||||
return opcode == GX_QUADS || opcode == GX_TRIANGLES || opcode == GX_TRIANGLESTRIP ||
|
||||
opcode == GX_TRIANGLEFAN || opcode == GX_LINES || opcode == GX_LINESTRIP ||
|
||||
opcode == GX_POINTS;
|
||||
}
|
||||
|
||||
bool is_mergeable_draw_opcode(u8 opcode) {
|
||||
return opcode == GX_QUADS || opcode == GX_TRIANGLES || opcode == GX_TRIANGLESTRIP ||
|
||||
opcode == GX_TRIANGLEFAN;
|
||||
}
|
||||
|
||||
bool calc_vtx_stride(const GXVtxDescList* vtxDesc, u32& stride) {
|
||||
stride = 0;
|
||||
for (; vtxDesc->attr != GX_VA_NULL; vtxDesc++) {
|
||||
switch (vtxDesc->type) {
|
||||
case GX_NONE:
|
||||
break;
|
||||
case GX_DIRECT:
|
||||
if (!is_matrix_idx_attr(vtxDesc->attr)) {
|
||||
return false;
|
||||
}
|
||||
stride += 1;
|
||||
break;
|
||||
case GX_INDEX8:
|
||||
stride += 1;
|
||||
break;
|
||||
case GX_INDEX16:
|
||||
stride += 2;
|
||||
break;
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return stride != 0;
|
||||
}
|
||||
|
||||
bool get_command_size(const u8* dlStart, u32 dlSize, u32 offset, u32 stride, u32& cmdSize) {
|
||||
if (offset >= dlSize) {
|
||||
return false;
|
||||
}
|
||||
|
||||
const u8 cmd = dlStart[offset];
|
||||
const u8 opcode = cmd & GX_OPCODE_MASK;
|
||||
switch (opcode) {
|
||||
case GX_NOP:
|
||||
case GX_CMD_INVL_VC:
|
||||
cmdSize = 1;
|
||||
return true;
|
||||
case (GX_LOAD_BP_REG & GX_OPCODE_MASK):
|
||||
cmdSize = 5;
|
||||
return offset + cmdSize <= dlSize;
|
||||
case GX_LOAD_CP_REG:
|
||||
cmdSize = 6;
|
||||
return offset + cmdSize <= dlSize;
|
||||
case GX_LOAD_XF_REG: {
|
||||
if (offset + 5 > dlSize) {
|
||||
return false;
|
||||
}
|
||||
const u16 count = read_be16(dlStart + offset + 1) + 1;
|
||||
cmdSize = 5 + count * 4;
|
||||
return offset + cmdSize <= dlSize;
|
||||
}
|
||||
case GX_LOAD_INDX_A:
|
||||
case GX_LOAD_INDX_B:
|
||||
case GX_LOAD_INDX_C:
|
||||
case GX_LOAD_INDX_D:
|
||||
cmdSize = 5;
|
||||
return offset + cmdSize <= dlSize;
|
||||
case GX_CMD_CALL_DL:
|
||||
cmdSize = 9;
|
||||
return offset + cmdSize <= dlSize;
|
||||
default:
|
||||
if (is_draw_opcode(opcode)) {
|
||||
if (offset + 3 > dlSize) {
|
||||
return false;
|
||||
}
|
||||
const u16 vtxCount = read_be16(dlStart + offset + 1);
|
||||
cmdSize = 3 + vtxCount * stride;
|
||||
return offset + cmdSize <= dlSize;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
struct MergeRun {
|
||||
u8 cmd = 0;
|
||||
u16 vtxCount = 0;
|
||||
std::vector<u8> vertices;
|
||||
};
|
||||
|
||||
void flush_merge_run(std::vector<u8>& out, MergeRun& run) {
|
||||
if (run.vtxCount == 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
out.push_back(run.cmd);
|
||||
append_be16(out, run.vtxCount);
|
||||
append_bytes(out, run.vertices.data(), run.vertices.size());
|
||||
run.vertices.clear();
|
||||
run.vtxCount = 0;
|
||||
}
|
||||
|
||||
void append_vertex(std::vector<u8>& out, const u8* vertices, u32 stride, u16 idx) {
|
||||
append_bytes(out, vertices + idx * stride, stride);
|
||||
}
|
||||
|
||||
bool triangulate_draw(
|
||||
std::vector<u8>& out, u8 opcode, const u8* vertices, u32 stride, u16 vtxCount) {
|
||||
switch (opcode) {
|
||||
case GX_TRIANGLES:
|
||||
append_bytes(out, vertices, vtxCount * stride);
|
||||
return true;
|
||||
case GX_TRIANGLEFAN:
|
||||
if (vtxCount < 3) {
|
||||
return false;
|
||||
}
|
||||
for (u16 v = 2; v < vtxCount; v++) {
|
||||
append_vertex(out, vertices, stride, 0);
|
||||
append_vertex(out, vertices, stride, v - 1);
|
||||
append_vertex(out, vertices, stride, v);
|
||||
}
|
||||
return true;
|
||||
case GX_TRIANGLESTRIP:
|
||||
if (vtxCount < 3) {
|
||||
return false;
|
||||
}
|
||||
for (u16 v = 2; v < vtxCount; v++) {
|
||||
if ((v & 1) == 0) {
|
||||
append_vertex(out, vertices, stride, v - 2);
|
||||
append_vertex(out, vertices, stride, v - 1);
|
||||
} else {
|
||||
append_vertex(out, vertices, stride, v - 1);
|
||||
append_vertex(out, vertices, stride, v - 2);
|
||||
}
|
||||
append_vertex(out, vertices, stride, v);
|
||||
}
|
||||
return true;
|
||||
case GX_QUADS:
|
||||
if ((vtxCount & 3) != 0) {
|
||||
return false;
|
||||
}
|
||||
for (u16 v = 0; v < vtxCount; v += 4) {
|
||||
append_vertex(out, vertices, stride, v);
|
||||
append_vertex(out, vertices, stride, v + 1);
|
||||
append_vertex(out, vertices, stride, v + 2);
|
||||
append_vertex(out, vertices, stride, v + 2);
|
||||
append_vertex(out, vertices, stride, v + 3);
|
||||
append_vertex(out, vertices, stride, v);
|
||||
}
|
||||
return true;
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
void append_triangles_to_run(
|
||||
std::vector<u8>& out, MergeRun& run, u8 cmd, const std::vector<u8>& vertices, u32 stride) {
|
||||
u32 offset = 0;
|
||||
u32 remaining = vertices.size() / stride;
|
||||
while (remaining != 0) {
|
||||
if (run.vtxCount != 0 && run.cmd != cmd) {
|
||||
flush_merge_run(out, run);
|
||||
}
|
||||
|
||||
if (run.vtxCount == 0) {
|
||||
run.cmd = cmd;
|
||||
}
|
||||
|
||||
u32 available = 0xFFFF - run.vtxCount;
|
||||
if (available == 0) {
|
||||
flush_merge_run(out, run);
|
||||
continue;
|
||||
}
|
||||
|
||||
u32 toCopy = std::min(remaining, available);
|
||||
append_bytes(run.vertices, vertices.data() + offset * stride, toCopy * stride);
|
||||
run.vtxCount += toCopy;
|
||||
offset += toCopy;
|
||||
remaining -= toCopy;
|
||||
|
||||
if (run.vtxCount == 0xFFFF) {
|
||||
flush_merge_run(out, run);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
bool optimize_display_list(const u8* dlStart, u32 dlSize, u32 stride, std::vector<u8>& out) {
|
||||
MergeRun run;
|
||||
out.reserve(dlSize);
|
||||
|
||||
for (u32 offset = 0; offset < dlSize;) {
|
||||
u32 cmdSize = 0;
|
||||
if (!get_command_size(dlStart, dlSize, offset, stride, cmdSize)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
const u8 cmd = dlStart[offset];
|
||||
const u8 opcode = cmd & GX_OPCODE_MASK;
|
||||
if (opcode == GX_NOP) {
|
||||
offset += cmdSize;
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!is_draw_opcode(opcode)) {
|
||||
flush_merge_run(out, run);
|
||||
append_bytes(out, dlStart + offset, cmdSize);
|
||||
offset += cmdSize;
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!is_mergeable_draw_opcode(opcode)) {
|
||||
flush_merge_run(out, run);
|
||||
append_bytes(out, dlStart + offset, cmdSize);
|
||||
offset += cmdSize;
|
||||
continue;
|
||||
}
|
||||
|
||||
const u16 vtxCount = read_be16(dlStart + offset + 1);
|
||||
const u8* vertices = dlStart + offset + 3;
|
||||
std::vector<u8> triangles;
|
||||
if (!triangulate_draw(triangles, opcode, vertices, stride, vtxCount)) {
|
||||
flush_merge_run(out, run);
|
||||
append_bytes(out, dlStart + offset, cmdSize);
|
||||
offset += cmdSize;
|
||||
continue;
|
||||
}
|
||||
|
||||
append_triangles_to_run(out, run, (GX_TRIANGLES | (cmd & GX_VAT_MASK)), triangles, stride);
|
||||
offset += cmdSize;
|
||||
}
|
||||
|
||||
flush_merge_run(out, run);
|
||||
return true;
|
||||
}
|
||||
|
||||
void set_display_list_copy(void*& displayList, u32& displayListSize, const u8* data, u32 size) {
|
||||
const u32 alignedSize = ALIGN_NEXT(size, 0x20);
|
||||
u8* newDL = JKR_NEW_ARRAY_ARGS(u8, alignedSize, 0x20);
|
||||
@@ -289,20 +35,11 @@ u32 J3DShapeDraw::countVertex(u32 stride) {
|
||||
u8* dlStart = (u8*)getDisplayList();
|
||||
|
||||
#if TARGET_PC
|
||||
for (u32 offset = 0; offset < getDisplayListSize();) {
|
||||
u8 cmd = dlStart[offset];
|
||||
u8 opcode = cmd & GX_OPCODE_MASK;
|
||||
u32 cmdSize = 0;
|
||||
if (!get_command_size(dlStart, getDisplayListSize(), offset, stride, cmdSize)) {
|
||||
break;
|
||||
aurora::gx::dl::Reader reader{dlStart, getDisplayListSize(), static_cast<u8>(stride)};
|
||||
while (const auto cmd = reader.next()) {
|
||||
if (cmd->kind != aurora::gx::dl::Command::Kind::Passthrough) {
|
||||
count += cmd->draw.vtxCount;
|
||||
}
|
||||
if (!is_draw_opcode(opcode)) {
|
||||
offset += cmdSize;
|
||||
continue;
|
||||
}
|
||||
int vtxNum = be16(*reinterpret_cast<u16*>(dlStart + offset + 1));
|
||||
count += vtxNum;
|
||||
offset += 3 + stride * vtxNum;
|
||||
}
|
||||
#else
|
||||
for (u8* dl = dlStart; (dl - dlStart) < getDisplayListSize();) {
|
||||
@@ -320,6 +57,53 @@ u32 J3DShapeDraw::countVertex(u32 stride) {
|
||||
return count;
|
||||
}
|
||||
|
||||
#if TARGET_PC
|
||||
void J3DShapeDraw::addTexMtxIndexInDL(u32 stride, u32 attrOffs, u32 valueBase) {
|
||||
u32 byteNum = countVertex(stride);
|
||||
u32 oldSize = mDisplayListSize;
|
||||
u32 newSize = ALIGN_NEXT(oldSize + byteNum, 0x20);
|
||||
u8* newDLStart = JKR_NEW_ARRAY_ARGS(u8, newSize, 0x20);
|
||||
u8* oldDLStart = (u8*)mDisplayList;
|
||||
u8* newDL = newDLStart;
|
||||
|
||||
aurora::gx::dl::Reader reader{oldDLStart, mDisplayListSize, static_cast<u8>(stride)};
|
||||
while (const auto cmd = reader.next()) {
|
||||
if (cmd->kind == aurora::gx::dl::Command::Kind::Passthrough) {
|
||||
std::memcpy(newDL, cmd->data, cmd->size);
|
||||
newDL += cmd->size;
|
||||
continue;
|
||||
}
|
||||
|
||||
const auto& draw = cmd->draw;
|
||||
const u32 headerSize = draw.vertices - cmd->data;
|
||||
std::memcpy(newDL, cmd->data, headerSize);
|
||||
newDL += headerSize;
|
||||
|
||||
for (u32 i = 0; i < draw.vtxCount; i++) {
|
||||
const u8* oldVtx = draw.vertices + stride * i;
|
||||
u8 pnmtxidx = oldVtx[0];
|
||||
std::memcpy(newDL, oldVtx, attrOffs);
|
||||
newDL += attrOffs;
|
||||
*newDL++ = valueBase + pnmtxidx;
|
||||
std::memcpy(newDL, oldVtx + attrOffs, stride - attrOffs);
|
||||
newDL += stride - attrOffs;
|
||||
}
|
||||
}
|
||||
if (reader.failed()) {
|
||||
// preserve the remainder untouched
|
||||
std::memcpy(newDL, oldDLStart + reader.pos(), mDisplayListSize - reader.pos());
|
||||
newDL += mDisplayListSize - reader.pos();
|
||||
}
|
||||
|
||||
u32 realSize = ALIGN_NEXT((uintptr_t)newDL - (uintptr_t)newDLStart, 0x20);
|
||||
for (; (newDL - newDLStart) < newSize; newDL++)
|
||||
*newDL = 0;
|
||||
|
||||
mDisplayListSize = realSize;
|
||||
mDisplayList = newDLStart;
|
||||
DCStoreRange(newDLStart, mDisplayListSize);
|
||||
}
|
||||
#else
|
||||
void J3DShapeDraw::addTexMtxIndexInDL(u32 stride, u32 attrOffs, u32 valueBase) {
|
||||
u32 byteNum = countVertex(stride);
|
||||
u32 oldSize = mDisplayListSize;
|
||||
@@ -330,32 +114,13 @@ void J3DShapeDraw::addTexMtxIndexInDL(u32 stride, u32 attrOffs, u32 valueBase) {
|
||||
u8* newDL = newDLStart;
|
||||
|
||||
for (; (oldDL - oldDLStart) < mDisplayListSize;) {
|
||||
#if TARGET_PC
|
||||
u32 oldOffset = oldDL - oldDLStart;
|
||||
u32 cmdSize = 0;
|
||||
if (!get_command_size(oldDLStart, mDisplayListSize, oldOffset, stride, cmdSize)) {
|
||||
memcpy(newDL, oldDL, mDisplayListSize - oldOffset);
|
||||
newDL += mDisplayListSize - oldOffset;
|
||||
break;
|
||||
}
|
||||
#endif
|
||||
// Copy command
|
||||
u8 cmd = *(u8*)oldDL;
|
||||
oldDL++;
|
||||
*newDL++ = cmd;
|
||||
|
||||
#if TARGET_PC
|
||||
u8 opcode = cmd & GX_OPCODE_MASK;
|
||||
if (!is_draw_opcode(opcode)) {
|
||||
memcpy(newDL, oldDL, cmdSize - 1);
|
||||
oldDL += cmdSize - 1;
|
||||
newDL += cmdSize - 1;
|
||||
continue;
|
||||
}
|
||||
#else
|
||||
if (cmd != GX_TRIANGLEFAN && cmd != GX_TRIANGLESTRIP)
|
||||
break;
|
||||
#endif
|
||||
|
||||
// Copy count
|
||||
int vtxNum = *(u16*)oldDL;
|
||||
@@ -384,6 +149,7 @@ void J3DShapeDraw::addTexMtxIndexInDL(u32 stride, u32 attrOffs, u32 valueBase) {
|
||||
mDisplayList = newDLStart;
|
||||
DCStoreRange(newDLStart, mDisplayListSize);
|
||||
}
|
||||
#endif
|
||||
|
||||
J3DShapeDraw::J3DShapeDraw(const u8* displayList, u32 displayListSize) {
|
||||
#if TARGET_PC
|
||||
@@ -397,12 +163,8 @@ J3DShapeDraw::J3DShapeDraw(const u8* displayList, u32 displayListSize) {
|
||||
#if TARGET_PC
|
||||
J3DShapeDraw::J3DShapeDraw(
|
||||
const u8* displayList, u32 displayListSize, const GXVtxDescList* vtxDesc) {
|
||||
u32 stride = 0;
|
||||
std::vector<u8> optimized;
|
||||
if (calc_vtx_stride(vtxDesc, stride) &&
|
||||
optimize_display_list(displayList, displayListSize, stride, optimized))
|
||||
{
|
||||
set_display_list_copy(mDisplayList, mDisplayListSize, optimized.data(), optimized.size());
|
||||
if (const auto optimized = aurora::gx::dl::optimize(displayList, displayListSize, vtxDesc)) {
|
||||
set_display_list_copy(mDisplayList, mDisplayListSize, optimized->data(), optimized->size());
|
||||
} else {
|
||||
set_display_list_copy(mDisplayList, mDisplayListSize, displayList, displayListSize);
|
||||
}
|
||||
|
||||
@@ -7,6 +7,10 @@
|
||||
|
||||
#include "JSystem/JMessage/control.h"
|
||||
|
||||
#if TARGET_PC
|
||||
#include "dusk/randomizer/game/messages.hpp"
|
||||
#endif
|
||||
|
||||
JMessage::TControl::TControl()
|
||||
: pSequenceProcessor_(NULL),
|
||||
pRenderingProcessor_(NULL),
|
||||
@@ -90,6 +94,10 @@ bool JMessage::TControl::setMessageCode_inSequence_(JMessage::TProcessor const*
|
||||
JUT_ASSERT(155, pResourceCache_!=NULL);
|
||||
|
||||
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_;
|
||||
oStack_renderingProcessor_.clear();
|
||||
return true;
|
||||
|
||||
@@ -14,6 +14,33 @@
|
||||
#endif
|
||||
#include "tracy/Tracy.hpp"
|
||||
|
||||
#if TARGET_PC
|
||||
#define JPA_DRAW_CTX_PARAM , ParticleDrawCtx* ctx
|
||||
|
||||
namespace {
|
||||
GXColor emitter_prm_color(JPAEmitterWorkData* work) {
|
||||
JPABaseEmitter* emtr = work->mpEmtr;
|
||||
GXColor prm = emtr->mPrmClr;
|
||||
prm.r = COLOR_MULTI(prm.r, emtr->mGlobalPrmClr.r);
|
||||
prm.g = COLOR_MULTI(prm.g, emtr->mGlobalPrmClr.g);
|
||||
prm.b = COLOR_MULTI(prm.b, emtr->mGlobalPrmClr.b);
|
||||
prm.a = COLOR_MULTI(prm.a, emtr->mGlobalPrmClr.a);
|
||||
return prm;
|
||||
}
|
||||
|
||||
GXColor emitter_env_color(JPAEmitterWorkData* work) {
|
||||
JPABaseEmitter* emtr = work->mpEmtr;
|
||||
GXColor env = emtr->mEnvClr;
|
||||
env.r = COLOR_MULTI(env.r, emtr->mGlobalEnvClr.r);
|
||||
env.g = COLOR_MULTI(env.g, emtr->mGlobalEnvClr.g);
|
||||
env.b = COLOR_MULTI(env.b, emtr->mGlobalEnvClr.b);
|
||||
return env;
|
||||
}
|
||||
} // namespace
|
||||
#else
|
||||
#define JPA_DRAW_CTX_PARAM
|
||||
#endif
|
||||
|
||||
void JPASetPointSize(JPAEmitterWorkData* work) {
|
||||
GXSetPointSize((u8)(25.0f * work->mGlobalPtclScl.x), GX_TO_ONE);
|
||||
}
|
||||
@@ -22,15 +49,16 @@ void JPASetLineWidth(JPAEmitterWorkData* work) {
|
||||
GXSetLineWidth((u8)(25.0f * work->mGlobalPtclScl.x), GX_TO_ONE);
|
||||
}
|
||||
|
||||
void JPASetPointSize(JPAEmitterWorkData* work, JPABaseParticle* ptcl) {
|
||||
void JPASetPointSize(JPAEmitterWorkData* work, JPABaseParticle* ptcl JPA_DRAW_CTX_PARAM) {
|
||||
GXSetPointSize((u8)(ptcl->mParticleScaleX * (25.0f * work->mGlobalPtclScl.x)), GX_TO_ONE);
|
||||
}
|
||||
|
||||
void JPASetLineWidth(JPAEmitterWorkData* work, JPABaseParticle* ptcl) {
|
||||
void JPASetLineWidth(JPAEmitterWorkData* work, JPABaseParticle* ptcl JPA_DRAW_CTX_PARAM) {
|
||||
GXSetLineWidth((u8)(ptcl->mParticleScaleX * (25.0f * work->mGlobalPtclScl.x)), GX_TO_ONE);
|
||||
}
|
||||
|
||||
void JPARegistPrm(JPAEmitterWorkData* work) {
|
||||
ZoneScoped;
|
||||
JPABaseEmitter* emtr = work->mpEmtr;
|
||||
GXColor prm = emtr->mPrmClr;
|
||||
prm.r = COLOR_MULTI(prm.r, emtr->mGlobalPrmClr.r);
|
||||
@@ -41,6 +69,7 @@ void JPARegistPrm(JPAEmitterWorkData* work) {
|
||||
}
|
||||
|
||||
void JPARegistEnv(JPAEmitterWorkData* work) {
|
||||
ZoneScoped;
|
||||
JPABaseEmitter* emtr = work->mpEmtr;
|
||||
GXColor env = emtr->mEnvClr;
|
||||
env.r = COLOR_MULTI(env.r, emtr->mGlobalEnvClr.r);
|
||||
@@ -50,6 +79,7 @@ void JPARegistEnv(JPAEmitterWorkData* work) {
|
||||
}
|
||||
|
||||
void JPARegistPrmEnv(JPAEmitterWorkData* work) {
|
||||
ZoneScoped;
|
||||
JPABaseEmitter* emtr = work->mpEmtr;
|
||||
GXColor prm = emtr->mPrmClr;
|
||||
GXColor env = emtr->mEnvClr;
|
||||
@@ -64,7 +94,8 @@ void JPARegistPrmEnv(JPAEmitterWorkData* work) {
|
||||
GXSetTevColor(GX_TEVREG1, env);
|
||||
}
|
||||
|
||||
void JPARegistAlpha(JPAEmitterWorkData* work, JPABaseParticle* ptcl) {
|
||||
void JPARegistAlpha(JPAEmitterWorkData* work, JPABaseParticle* ptcl JPA_DRAW_CTX_PARAM) {
|
||||
ZoneScoped;
|
||||
JPABaseEmitter* emtr = work->mpEmtr;
|
||||
GXColor prm = emtr->mPrmClr;
|
||||
prm.r = COLOR_MULTI(prm.r, emtr->mGlobalPrmClr.r);
|
||||
@@ -72,10 +103,19 @@ void JPARegistAlpha(JPAEmitterWorkData* work, JPABaseParticle* ptcl) {
|
||||
prm.b = COLOR_MULTI(prm.b, emtr->mGlobalPrmClr.b);
|
||||
prm.a = COLOR_MULTI(prm.a, emtr->mGlobalPrmClr.a);
|
||||
prm.a = COLOR_MULTI(prm.a, ptcl->mPrmColorAlphaAnm);
|
||||
#if TARGET_PC
|
||||
if (ctx->batch) {
|
||||
ctx->clr0 = prm;
|
||||
if (ctx->useClr1) {
|
||||
ctx->clr1 = emitter_env_color(work);
|
||||
}
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
GXSetTevColor(GX_TEVREG0, prm);
|
||||
}
|
||||
|
||||
void JPARegistPrmAlpha(JPAEmitterWorkData* work, JPABaseParticle* ptcl) {
|
||||
void JPARegistPrmAlpha(JPAEmitterWorkData* work, JPABaseParticle* ptcl JPA_DRAW_CTX_PARAM) {
|
||||
ZoneScoped;
|
||||
JPABaseEmitter* emtr = work->mpEmtr;
|
||||
GXColor prm = ptcl->mPrmClr;
|
||||
@@ -84,10 +124,19 @@ void JPARegistPrmAlpha(JPAEmitterWorkData* work, JPABaseParticle* ptcl) {
|
||||
prm.b = COLOR_MULTI(prm.b, emtr->mGlobalPrmClr.b);
|
||||
prm.a = COLOR_MULTI(prm.a, emtr->mGlobalPrmClr.a);
|
||||
prm.a = COLOR_MULTI(prm.a, ptcl->mPrmColorAlphaAnm);
|
||||
#if TARGET_PC
|
||||
if (ctx->batch) {
|
||||
ctx->clr0 = prm;
|
||||
if (ctx->useClr1) {
|
||||
ctx->clr1 = emitter_env_color(work);
|
||||
}
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
GXSetTevColor(GX_TEVREG0, prm);
|
||||
}
|
||||
|
||||
void JPARegistPrmAlphaEnv(JPAEmitterWorkData* work, JPABaseParticle* ptcl) {
|
||||
void JPARegistPrmAlphaEnv(JPAEmitterWorkData* work, JPABaseParticle* ptcl JPA_DRAW_CTX_PARAM) {
|
||||
ZoneScoped;
|
||||
JPABaseEmitter* emtr = work->mpEmtr;
|
||||
GXColor prm = ptcl->mPrmClr;
|
||||
@@ -100,11 +149,19 @@ void JPARegistPrmAlphaEnv(JPAEmitterWorkData* work, JPABaseParticle* ptcl) {
|
||||
env.r = COLOR_MULTI(env.r, emtr->mGlobalEnvClr.r);
|
||||
env.g = COLOR_MULTI(env.g, emtr->mGlobalEnvClr.g);
|
||||
env.b = COLOR_MULTI(env.b, emtr->mGlobalEnvClr.b);
|
||||
#if TARGET_PC
|
||||
if (ctx->batch) {
|
||||
ctx->clr0 = prm;
|
||||
ctx->clr1 = env;
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
GXSetTevColor(GX_TEVREG0, prm);
|
||||
GXSetTevColor(GX_TEVREG1, env);
|
||||
}
|
||||
|
||||
void JPARegistAlphaEnv(JPAEmitterWorkData* work, JPABaseParticle* ptcl) {
|
||||
void JPARegistAlphaEnv(JPAEmitterWorkData* work, JPABaseParticle* ptcl JPA_DRAW_CTX_PARAM) {
|
||||
ZoneScoped;
|
||||
JPABaseEmitter* emtr = work->mpEmtr;
|
||||
GXColor prm = emtr->mPrmClr;
|
||||
GXColor env = ptcl->mEnvClr;
|
||||
@@ -116,16 +173,31 @@ void JPARegistAlphaEnv(JPAEmitterWorkData* work, JPABaseParticle* ptcl) {
|
||||
env.r = COLOR_MULTI(env.r, emtr->mGlobalEnvClr.r);
|
||||
env.g = COLOR_MULTI(env.g, emtr->mGlobalEnvClr.g);
|
||||
env.b = COLOR_MULTI(env.b, emtr->mGlobalEnvClr.b);
|
||||
#if TARGET_PC
|
||||
if (ctx->batch) {
|
||||
ctx->clr0 = prm;
|
||||
ctx->clr1 = env;
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
GXSetTevColor(GX_TEVREG0, prm);
|
||||
GXSetTevColor(GX_TEVREG1, env);
|
||||
}
|
||||
|
||||
void JPARegistEnv(JPAEmitterWorkData* work, JPABaseParticle* ptcl) {
|
||||
void JPARegistEnv(JPAEmitterWorkData* work, JPABaseParticle* ptcl JPA_DRAW_CTX_PARAM) {
|
||||
ZoneScoped;
|
||||
JPABaseEmitter* emtr = work->mpEmtr;
|
||||
GXColor env = ptcl->mEnvClr;
|
||||
env.r = COLOR_MULTI(env.r, emtr->mGlobalEnvClr.r);
|
||||
env.g = COLOR_MULTI(env.g, emtr->mGlobalEnvClr.g);
|
||||
env.b = COLOR_MULTI(env.b, emtr->mGlobalEnvClr.b);
|
||||
#if TARGET_PC
|
||||
if (ctx->batch) {
|
||||
ctx->clr0 = emitter_prm_color(work);
|
||||
ctx->clr1 = env;
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
GXSetTevColor(GX_TEVREG1, env);
|
||||
}
|
||||
|
||||
@@ -258,7 +330,7 @@ void JPAGenCalcTexCrdMtxAnm(JPAEmitterWorkData* work) {
|
||||
GXSetTexCoordGen(GX_TEXCOORD0, GX_TG_MTX2x4, GX_TG_TEX0, GX_TEXMTX0);
|
||||
}
|
||||
|
||||
void JPALoadCalcTexCrdMtxAnm(JPAEmitterWorkData* work, JPABaseParticle* param_1) {
|
||||
void JPALoadCalcTexCrdMtxAnm(JPAEmitterWorkData* work, JPABaseParticle* param_1 JPA_DRAW_CTX_PARAM) {
|
||||
ZoneScoped;
|
||||
JPABaseShape* shape = work->mpRes->getBsp();
|
||||
f32 dVar16 = param_1->mAge;
|
||||
@@ -286,6 +358,12 @@ void JPALoadCalcTexCrdMtxAnm(JPAEmitterWorkData* work, JPABaseParticle* param_1)
|
||||
local_108[2][1] = 0.0f;
|
||||
local_108[2][2] = 1.0f;
|
||||
local_108[2][3] = 0.0f;
|
||||
#if TARGET_PC
|
||||
if (ctx->batch) {
|
||||
MTXCopy(local_108, ctx->texMtx);
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
GXLoadTexMtxImm(local_108, 0x1e, GX_MTX2x4);
|
||||
}
|
||||
|
||||
@@ -299,7 +377,7 @@ void JPALoadTexAnm(JPAEmitterWorkData* work) {
|
||||
work->mpResMgr->load(work->mpRes->getTexIdx(work->mpEmtr->mTexAnmIdx), GX_TEXMAP0);
|
||||
}
|
||||
|
||||
void JPALoadTexAnm(JPAEmitterWorkData* work, JPABaseParticle* ptcl) {
|
||||
void JPALoadTexAnm(JPAEmitterWorkData* work, JPABaseParticle* ptcl JPA_DRAW_CTX_PARAM) {
|
||||
ZoneScoped;
|
||||
work->mpResMgr->load(work->mpRes->getTexIdx(ptcl->mTexAnmIdx), GX_TEXMAP0);
|
||||
}
|
||||
@@ -429,6 +507,47 @@ static projectionFunc p_prj[3] = {
|
||||
};
|
||||
|
||||
#if TARGET_PC
|
||||
static void emit_batch_quad(JPAEmitterWorkData* work, const ParticleDrawCtx* ctx,
|
||||
const Mtx posMtx) {
|
||||
const JPAResource::BatchInfo& info = work->mpRes->mBatchInfo;
|
||||
|
||||
for (int i = 0; i < info.vtxCount; i++) {
|
||||
Vec localPos = {info.vtxPos[i][0], info.vtxPos[i][1], info.vtxPos[i][2]};
|
||||
Vec drawPos;
|
||||
MTXMultVec(posMtx, &localPos, &drawPos);
|
||||
|
||||
f32 texS = info.vtxUv[i][0];
|
||||
f32 texT = info.vtxUv[i][1];
|
||||
if (ctx->useTexMtx) {
|
||||
f32 srcS = texS;
|
||||
f32 srcT = texT;
|
||||
texS = ctx->texMtx[0][0] * srcS + ctx->texMtx[0][1] * srcT + ctx->texMtx[0][3];
|
||||
texT = ctx->texMtx[1][0] * srcS + ctx->texMtx[1][1] * srcT + ctx->texMtx[1][3];
|
||||
}
|
||||
|
||||
GXPosition3f32(drawPos.x, drawPos.y, drawPos.z);
|
||||
if (ctx->useClr0) {
|
||||
GXColor4u8(ctx->clr0.r, ctx->clr0.g, ctx->clr0.b, ctx->clr0.a);
|
||||
}
|
||||
if (ctx->useClr1) {
|
||||
GXColor4u8(ctx->clr1.r, ctx->clr1.g, ctx->clr1.b, ctx->clr1.a);
|
||||
}
|
||||
GXTexCoord2f32(texS, texT);
|
||||
}
|
||||
}
|
||||
|
||||
static void submit_particle_quad(
|
||||
JPAEmitterWorkData* work, ParticleDrawCtx* ctx, const Mtx posMtx, const u8* dl, u32 dlSize) {
|
||||
if (ctx->batch) {
|
||||
emit_batch_quad(work, ctx, posMtx);
|
||||
return;
|
||||
}
|
||||
|
||||
GXLoadPosMtxImm(posMtx, GX_PNMTX0);
|
||||
p_prj[work->mPrjType](work, posMtx);
|
||||
GXCallDisplayList(dl, dlSize);
|
||||
}
|
||||
|
||||
void JPAInterpBillboard(JPAEmitterWorkData* work, JPABaseParticle* ptcl) {
|
||||
Mtx ptclPosMtx;
|
||||
MTXTrans(ptclPosMtx, ptcl->mPosition.x, ptcl->mPosition.y, ptcl->mPosition.z);
|
||||
@@ -448,7 +567,7 @@ void JPAInterpRotBillboard(JPAEmitterWorkData* work, JPABaseParticle* ptcl) {
|
||||
}
|
||||
#endif
|
||||
|
||||
void JPADrawBillboard(JPAEmitterWorkData* work, JPABaseParticle* ptcl) {
|
||||
void JPADrawBillboard(JPAEmitterWorkData* work, JPABaseParticle* ptcl JPA_DRAW_CTX_PARAM) {
|
||||
if (ptcl->checkStatus(JPAPtclStts_Invisible)) {
|
||||
return;
|
||||
}
|
||||
@@ -473,12 +592,16 @@ void JPADrawBillboard(JPAEmitterWorkData* work, JPABaseParticle* ptcl) {
|
||||
posMtx[2][2] = 1.0f;
|
||||
posMtx[2][3] = pos.z;
|
||||
posMtx[0][1] = posMtx[0][2] = posMtx[1][0] = posMtx[1][2] = posMtx[2][0] = posMtx[2][1] = 0.0f;
|
||||
#if TARGET_PC
|
||||
submit_particle_quad(work, ctx, posMtx, jpa_dl, sizeof(jpa_dl));
|
||||
#else
|
||||
GXLoadPosMtxImm(posMtx, GX_PNMTX0);
|
||||
p_prj[work->mPrjType](work, posMtx);
|
||||
GXCallDisplayList(jpa_dl, sizeof(jpa_dl));
|
||||
#endif
|
||||
}
|
||||
|
||||
void JPADrawRotBillboard(JPAEmitterWorkData* work, JPABaseParticle* ptcl) {
|
||||
void JPADrawRotBillboard(JPAEmitterWorkData* work, JPABaseParticle* ptcl JPA_DRAW_CTX_PARAM) {
|
||||
if (ptcl->checkStatus(JPAPtclStts_Invisible)) {
|
||||
return;
|
||||
}
|
||||
@@ -517,12 +640,16 @@ void JPADrawRotBillboard(JPAEmitterWorkData* work, JPABaseParticle* ptcl) {
|
||||
posMtx[2][2] = 1.0f;
|
||||
posMtx[2][3] = pos.z;
|
||||
posMtx[0][2] = posMtx[1][2] = posMtx[2][0] = posMtx[2][1] = 0.0f;
|
||||
#if TARGET_PC
|
||||
submit_particle_quad(work, ctx, posMtx, jpa_dl, sizeof(jpa_dl));
|
||||
#else
|
||||
GXLoadPosMtxImm(posMtx, GX_PNMTX0);
|
||||
p_prj[work->mPrjType](work, posMtx);
|
||||
GXCallDisplayList(jpa_dl, sizeof(jpa_dl));
|
||||
#endif
|
||||
}
|
||||
|
||||
void JPADrawYBillboard(JPAEmitterWorkData* work, JPABaseParticle* param_1) {
|
||||
void JPADrawYBillboard(JPAEmitterWorkData* work, JPABaseParticle* param_1 JPA_DRAW_CTX_PARAM) {
|
||||
if (param_1->checkStatus(JPAPtclStts_Invisible)) {
|
||||
return;
|
||||
}
|
||||
@@ -542,12 +669,16 @@ void JPADrawYBillboard(JPAEmitterWorkData* work, JPABaseParticle* param_1) {
|
||||
local_38[2][2] = work->mYBBCamMtx[2][2];
|
||||
local_38[2][3] = local_48.z;
|
||||
local_38[0][1] = local_38[0][2] = local_38[1][0] = local_38[2][0] = 0.0f;
|
||||
#if TARGET_PC
|
||||
submit_particle_quad(work, ctx, local_38, jpa_dl, sizeof(jpa_dl));
|
||||
#else
|
||||
GXLoadPosMtxImm(local_38, GX_PNMTX0);
|
||||
p_prj[work->mPrjType](work, local_38);
|
||||
GXCallDisplayList(jpa_dl, sizeof(jpa_dl));
|
||||
#endif
|
||||
}
|
||||
|
||||
void JPADrawRotYBillboard(JPAEmitterWorkData* work, JPABaseParticle* param_1) {
|
||||
void JPADrawRotYBillboard(JPAEmitterWorkData* work, JPABaseParticle* param_1 JPA_DRAW_CTX_PARAM) {
|
||||
if (param_1->checkStatus(JPAPtclStts_Invisible)) {
|
||||
return;
|
||||
}
|
||||
@@ -576,9 +707,13 @@ void JPADrawRotYBillboard(JPAEmitterWorkData* work, JPABaseParticle* param_1) {
|
||||
local_38[2][1] = local_94 * fVar1;
|
||||
local_38[2][2] = local_90;
|
||||
local_38[2][3] = local_48.z;
|
||||
#if TARGET_PC
|
||||
submit_particle_quad(work, ctx, local_38, jpa_dl, sizeof(jpa_dl));
|
||||
#else
|
||||
GXLoadPosMtxImm(local_38, GX_PNMTX0);
|
||||
p_prj[work->mPrjType](work, local_38);
|
||||
GXCallDisplayList(jpa_dl, sizeof(jpa_dl));
|
||||
#endif
|
||||
}
|
||||
|
||||
void dirTypeVel(JPAEmitterWorkData const* work, JPABaseParticle const* param_1,
|
||||
@@ -741,6 +876,88 @@ static u8* p_dl[2] = {
|
||||
};
|
||||
|
||||
#if TARGET_PC
|
||||
static bool make_direction_mtx(JPAEmitterWorkData* work, JPABaseParticle* ptcl, Mtx posMtx) {
|
||||
JGeometry::TVec3<f32> axisY;
|
||||
JGeometry::TVec3<f32> axisZ;
|
||||
JGeometry::TVec3<f32> baseAxis(ptcl->mBaseAxis);
|
||||
p_direction[work->mDirType](work, ptcl, &axisY);
|
||||
if (axisY.isZero()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
axisY.normalize();
|
||||
axisZ.cross(baseAxis, axisY);
|
||||
if (axisZ.isZero()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
axisZ.normalize();
|
||||
baseAxis.cross(axisY, axisZ);
|
||||
baseAxis.normalize();
|
||||
ptcl->mBaseAxis.set(baseAxis);
|
||||
|
||||
f32 scaleX = work->mGlobalPtclScl.x * ptcl->mParticleScaleX;
|
||||
f32 scaleY = work->mGlobalPtclScl.y * ptcl->mParticleScaleY;
|
||||
posMtx[0][0] = baseAxis.x;
|
||||
posMtx[0][1] = axisY.x;
|
||||
posMtx[0][2] = axisZ.x;
|
||||
posMtx[0][3] = ptcl->mPosition.x;
|
||||
posMtx[1][0] = baseAxis.y;
|
||||
posMtx[1][1] = axisY.y;
|
||||
posMtx[1][2] = axisZ.y;
|
||||
posMtx[1][3] = ptcl->mPosition.y;
|
||||
posMtx[2][0] = baseAxis.z;
|
||||
posMtx[2][1] = axisY.z;
|
||||
posMtx[2][2] = axisZ.z;
|
||||
posMtx[2][3] = ptcl->mPosition.z;
|
||||
p_plane[work->mPlaneType](posMtx, scaleX, scaleY);
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool make_rot_direction_mtx(JPAEmitterWorkData* work, JPABaseParticle* ptcl, Mtx posMtx) {
|
||||
f32 sinRot = JMASSin(ptcl->mRotateAngle);
|
||||
f32 cosRot = JMASCos(ptcl->mRotateAngle);
|
||||
JGeometry::TVec3<f32> axisY;
|
||||
JGeometry::TVec3<f32> axisZ;
|
||||
JGeometry::TVec3<f32> baseAxis(ptcl->mBaseAxis);
|
||||
p_direction[work->mDirType](work, ptcl, &axisY);
|
||||
if (axisY.isZero()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
axisY.normalize();
|
||||
axisZ.cross(baseAxis, axisY);
|
||||
if (axisZ.isZero()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
axisZ.normalize();
|
||||
baseAxis.cross(axisY, axisZ);
|
||||
baseAxis.normalize();
|
||||
ptcl->mBaseAxis.set(baseAxis);
|
||||
|
||||
f32 scaleX = work->mGlobalPtclScl.x * ptcl->mParticleScaleX;
|
||||
f32 scaleY = work->mGlobalPtclScl.y * ptcl->mParticleScaleY;
|
||||
Mtx rotMtx;
|
||||
Mtx dirMtx;
|
||||
p_rot[work->mRotType](sinRot, cosRot, rotMtx);
|
||||
p_plane[work->mPlaneType](rotMtx, scaleX, scaleY);
|
||||
dirMtx[0][0] = baseAxis.x;
|
||||
dirMtx[0][1] = axisY.x;
|
||||
dirMtx[0][2] = axisZ.x;
|
||||
dirMtx[0][3] = ptcl->mPosition.x;
|
||||
dirMtx[1][0] = baseAxis.y;
|
||||
dirMtx[1][1] = axisY.y;
|
||||
dirMtx[1][2] = axisZ.y;
|
||||
dirMtx[1][3] = ptcl->mPosition.y;
|
||||
dirMtx[2][0] = baseAxis.z;
|
||||
dirMtx[2][1] = axisY.z;
|
||||
dirMtx[2][2] = axisZ.z;
|
||||
dirMtx[2][3] = ptcl->mPosition.z;
|
||||
MTXConcat(dirMtx, rotMtx, posMtx);
|
||||
return true;
|
||||
}
|
||||
|
||||
void JPAInterpDirection(JPAEmitterWorkData* work, JPABaseParticle* ptcl) {
|
||||
JGeometry::TVec3<f32> axisY;
|
||||
JGeometry::TVec3<f32> axisZ;
|
||||
@@ -823,7 +1040,7 @@ void JPAInterpRotDirection(JPAEmitterWorkData* work, JPABaseParticle* ptcl) {
|
||||
}
|
||||
#endif
|
||||
|
||||
void JPADrawDirection(JPAEmitterWorkData* work, JPABaseParticle* ptcl) {
|
||||
void JPADrawDirection(JPAEmitterWorkData* work, JPABaseParticle* ptcl JPA_DRAW_CTX_PARAM) {
|
||||
if (ptcl->checkStatus(JPAPtclStts_Invisible)) {
|
||||
return;
|
||||
}
|
||||
@@ -832,8 +1049,12 @@ void JPADrawDirection(JPAEmitterWorkData* work, JPABaseParticle* ptcl) {
|
||||
|
||||
Mtx posMtx;
|
||||
#if TARGET_PC
|
||||
if (!dusk::frame_interp::lookup_replacement(ptcl, posMtx))
|
||||
#endif
|
||||
if (!dusk::frame_interp::lookup_replacement(ptcl, posMtx) &&
|
||||
!make_direction_mtx(work, ptcl, posMtx))
|
||||
{
|
||||
return;
|
||||
}
|
||||
#else
|
||||
{
|
||||
JGeometry::TVec3<f32> axisY;
|
||||
JGeometry::TVec3<f32> axisZ;
|
||||
@@ -869,14 +1090,19 @@ void JPADrawDirection(JPAEmitterWorkData* work, JPABaseParticle* ptcl) {
|
||||
posMtx[2][3] = ptcl->mPosition.z;
|
||||
p_plane[work->mPlaneType](posMtx, scaleX, scaleY);
|
||||
}
|
||||
#endif
|
||||
|
||||
MTXConcat(work->mPosCamMtx, posMtx, posMtx);
|
||||
#if TARGET_PC
|
||||
submit_particle_quad(work, ctx, posMtx, p_dl[work->mDLType], sizeof(jpa_dl));
|
||||
#else
|
||||
GXLoadPosMtxImm(posMtx, GX_PNMTX0);
|
||||
p_prj[work->mPrjType](work, posMtx);
|
||||
GXCallDisplayList(p_dl[work->mDLType], sizeof(jpa_dl));
|
||||
#endif
|
||||
}
|
||||
|
||||
void JPADrawRotDirection(JPAEmitterWorkData* work, JPABaseParticle* ptcl) {
|
||||
void JPADrawRotDirection(JPAEmitterWorkData* work, JPABaseParticle* ptcl JPA_DRAW_CTX_PARAM) {
|
||||
if (ptcl->checkStatus(JPAPtclStts_Invisible)) {
|
||||
return;
|
||||
}
|
||||
@@ -886,8 +1112,12 @@ void JPADrawRotDirection(JPAEmitterWorkData* work, JPABaseParticle* ptcl) {
|
||||
Mtx mtx1;
|
||||
Mtx mtx2;
|
||||
#if TARGET_PC
|
||||
if (!dusk::frame_interp::lookup_replacement(ptcl, mtx1))
|
||||
#endif
|
||||
if (!dusk::frame_interp::lookup_replacement(ptcl, mtx1) &&
|
||||
!make_rot_direction_mtx(work, ptcl, mtx1))
|
||||
{
|
||||
return;
|
||||
}
|
||||
#else
|
||||
{
|
||||
f32 sinRot = JMASSin(ptcl->mRotateAngle);
|
||||
f32 cosRot = JMASCos(ptcl->mRotateAngle);
|
||||
@@ -927,13 +1157,18 @@ void JPADrawRotDirection(JPAEmitterWorkData* work, JPABaseParticle* ptcl) {
|
||||
mtx2[2][3] = ptcl->mPosition.z;
|
||||
MTXConcat(mtx2, mtx1, mtx1);
|
||||
}
|
||||
#endif
|
||||
MTXConcat(work->mPosCamMtx, mtx1, mtx2);
|
||||
#if TARGET_PC
|
||||
submit_particle_quad(work, ctx, mtx2, p_dl[work->mDLType], sizeof(jpa_dl));
|
||||
#else
|
||||
GXLoadPosMtxImm(mtx2, GX_PNMTX0);
|
||||
p_prj[work->mPrjType](work, mtx2);
|
||||
GXCallDisplayList(p_dl[work->mDLType], sizeof(jpa_dl));
|
||||
#endif
|
||||
}
|
||||
|
||||
void JPADrawDBillboard(JPAEmitterWorkData* param_0, JPABaseParticle* param_1) {
|
||||
void JPADrawDBillboard(JPAEmitterWorkData* param_0, JPABaseParticle* param_1 JPA_DRAW_CTX_PARAM) {
|
||||
if (param_1->checkStatus(JPAPtclStts_Invisible)) {
|
||||
return;
|
||||
}
|
||||
@@ -970,7 +1205,7 @@ void JPADrawDBillboard(JPAEmitterWorkData* param_0, JPABaseParticle* param_1) {
|
||||
GXCallDisplayList(jpa_dl, sizeof(jpa_dl));
|
||||
}
|
||||
|
||||
void JPADrawRotation(JPAEmitterWorkData* param_0, JPABaseParticle* param_1) {
|
||||
void JPADrawRotation(JPAEmitterWorkData* param_0, JPABaseParticle* param_1 JPA_DRAW_CTX_PARAM) {
|
||||
if (param_1->checkStatus(JPAPtclStts_Invisible)) {
|
||||
return;
|
||||
}
|
||||
@@ -988,12 +1223,16 @@ void JPADrawRotation(JPAEmitterWorkData* param_0, JPABaseParticle* param_1) {
|
||||
auStack_88[1][3] = param_1->mPosition.y;
|
||||
auStack_88[2][3] = param_1->mPosition.z;
|
||||
MTXConcat(param_0->mPosCamMtx, auStack_88, auStack_88);
|
||||
#if TARGET_PC
|
||||
submit_particle_quad(param_0, ctx, auStack_88, p_dl[param_0->mDLType], sizeof(jpa_dl));
|
||||
#else
|
||||
GXLoadPosMtxImm(auStack_88, 0);
|
||||
p_prj[param_0->mPrjType](param_0, auStack_88);
|
||||
GXCallDisplayList(p_dl[param_0->mDLType], sizeof(jpa_dl));
|
||||
#endif
|
||||
}
|
||||
|
||||
void JPADrawPoint(JPAEmitterWorkData* work, JPABaseParticle* ptcl) {
|
||||
void JPADrawPoint(JPAEmitterWorkData* work, JPABaseParticle* ptcl JPA_DRAW_CTX_PARAM) {
|
||||
if (ptcl->checkStatus(JPAPtclStts_Invisible)) {
|
||||
return;
|
||||
}
|
||||
@@ -1010,7 +1249,7 @@ void JPADrawPoint(JPAEmitterWorkData* work, JPABaseParticle* ptcl) {
|
||||
GXSetVtxDesc(GX_VA_TEX0, GX_INDEX8);
|
||||
}
|
||||
|
||||
void JPADrawLine(JPAEmitterWorkData* param_0, JPABaseParticle* param_1) {
|
||||
void JPADrawLine(JPAEmitterWorkData* param_0, JPABaseParticle* param_1 JPA_DRAW_CTX_PARAM) {
|
||||
if (param_1->checkStatus(JPAPtclStts_Invisible)) {
|
||||
return;
|
||||
}
|
||||
@@ -1086,7 +1325,7 @@ void JPADrawStripe(JPAEmitterWorkData* param_0) {
|
||||
GXSetVtxDesc(GX_VA_POS, GX_DIRECT);
|
||||
GXSetVtxDesc(GX_VA_TEX0, GX_DIRECT);
|
||||
GXBegin(GX_TRIANGLESTRIP, GX_VTXFMT1, ptcl_num << 1);
|
||||
for (JPANode<JPABaseParticle>* node = startNode; node != param_0->mpAlivePtcl->getEnd();
|
||||
for (JPANode<JPABaseParticle>* node = startNode; node != param_0->mpAlivePtcl->getEnd();
|
||||
node = node_func(node), coord += step) {
|
||||
param_0->mpCurNode = node;
|
||||
JPABaseParticle* particle = node->getObject();
|
||||
@@ -1111,7 +1350,7 @@ void JPADrawStripe(JPAEmitterWorkData* param_0) {
|
||||
}
|
||||
particle->mBaseAxis.cross(local_f8, local_104);
|
||||
particle->mBaseAxis.normalize();
|
||||
|
||||
|
||||
local_c8[0][0] = local_104.x;
|
||||
local_c8[0][1] = local_f8.x;
|
||||
local_c8[0][2] = particle->mBaseAxis.x;
|
||||
@@ -1177,7 +1416,7 @@ void JPADrawStripeX(JPAEmitterWorkData* param_0) {
|
||||
GXSetVtxDesc(GX_VA_POS, GX_DIRECT);
|
||||
GXSetVtxDesc(GX_VA_TEX0, GX_DIRECT);
|
||||
GXBegin(GX_TRIANGLESTRIP, GX_VTXFMT1, ptcl_num << 1);
|
||||
for (JPANode<JPABaseParticle>* node = startNode; node != param_0->mpAlivePtcl->getEnd();
|
||||
for (JPANode<JPABaseParticle>* node = startNode; node != param_0->mpAlivePtcl->getEnd();
|
||||
node = node_func(node), coord += step) {
|
||||
param_0->mpCurNode = node;
|
||||
JPABaseParticle* particle = node->getObject();
|
||||
@@ -1202,7 +1441,7 @@ void JPADrawStripeX(JPAEmitterWorkData* param_0) {
|
||||
}
|
||||
particle->mBaseAxis.cross(local_c0, local_cc);
|
||||
particle->mBaseAxis.normalize();
|
||||
|
||||
|
||||
local_90[0][0] = local_cc.x;
|
||||
local_90[0][1] = local_c0.x;
|
||||
local_90[0][2] = particle->mBaseAxis.x;
|
||||
@@ -1227,7 +1466,7 @@ void JPADrawStripeX(JPAEmitterWorkData* param_0) {
|
||||
|
||||
coord = start_coord;
|
||||
GXBegin(GX_TRIANGLESTRIP, GX_VTXFMT1, ptcl_num << 1);
|
||||
for (JPANode<JPABaseParticle>* node = startNode; node != param_0->mpAlivePtcl->getEnd();
|
||||
for (JPANode<JPABaseParticle>* node = startNode; node != param_0->mpAlivePtcl->getEnd();
|
||||
node = node_func(node), coord += step) {
|
||||
param_0->mpCurNode = node;
|
||||
JPABaseParticle* particle = node->getObject();
|
||||
@@ -1252,7 +1491,7 @@ void JPADrawStripeX(JPAEmitterWorkData* param_0) {
|
||||
}
|
||||
particle->mBaseAxis.cross(local_c0, local_cc);
|
||||
particle->mBaseAxis.normalize();
|
||||
|
||||
|
||||
local_90[0][0] = local_cc.x;
|
||||
local_90[0][1] = local_c0.x;
|
||||
local_90[0][2] = particle->mBaseAxis.x;
|
||||
@@ -1289,7 +1528,7 @@ void JPADrawEmitterCallBackB(JPAEmitterWorkData* work) {
|
||||
emtr->mpEmtrCallBack->draw(emtr);
|
||||
}
|
||||
|
||||
void JPADrawParticleCallBack(JPAEmitterWorkData* work, JPABaseParticle* ptcl) {
|
||||
void JPADrawParticleCallBack(JPAEmitterWorkData* work, JPABaseParticle* ptcl JPA_DRAW_CTX_PARAM) {
|
||||
JPABaseEmitter* emtr = work->mpEmtr;
|
||||
if (emtr->mpPtclCallBack == NULL) {
|
||||
return;
|
||||
|
||||
@@ -18,9 +18,21 @@
|
||||
#include "global.h"
|
||||
#include "tracy/Tracy.hpp"
|
||||
|
||||
#if TARGET_PC
|
||||
#define JPA_DRAW_CTX_ARG , &ctx
|
||||
#else
|
||||
#define JPA_DRAW_CTX_ARG
|
||||
#endif
|
||||
|
||||
JPAResource::JPAResource() {
|
||||
mpCalcEmitterFuncList = mpDrawEmitterFuncList = mpDrawEmitterChildFuncList = NULL;
|
||||
#if TARGET_PC
|
||||
mpCalcParticleFuncList = mpCalcParticleChildFuncList = NULL;
|
||||
mpDrawParticleFuncList = mpDrawParticleChildFuncList = NULL;
|
||||
mBatchInfo = {};
|
||||
#else
|
||||
mpCalcParticleFuncList = mpDrawParticleFuncList = mpCalcParticleChildFuncList = mpDrawParticleChildFuncList = NULL;
|
||||
#endif
|
||||
pBsp = NULL;
|
||||
pEsp = NULL;
|
||||
pCsp = NULL;
|
||||
@@ -61,6 +73,60 @@ static u8 jpa_crd[32] ATTRIBUTE_ALIGN(32) = {
|
||||
0x00, 0x00, 0x01, 0x00, 0x01, 0x02, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x02, 0x02, 0x00, 0x02,
|
||||
};
|
||||
|
||||
#if TARGET_PC
|
||||
void JPAResource::initBatchInfo() {
|
||||
mBatchInfo = {};
|
||||
|
||||
bool hasDrawFunc = false;
|
||||
for (int i = 0; i < mpDrawParticleFuncListNum; i++) {
|
||||
DrawParticleFunc func = mpDrawParticleFuncList[i];
|
||||
if (func == JPADrawBillboard || func == JPADrawRotBillboard ||
|
||||
func == JPADrawYBillboard || func == JPADrawRotYBillboard ||
|
||||
func == JPADrawDirection || func == JPADrawRotDirection || func == JPADrawRotation)
|
||||
{
|
||||
hasDrawFunc = true;
|
||||
} else if (func == JPADrawParticleCallBack) {
|
||||
// Batchable only for emitters without a particle callback; checked per draw
|
||||
} else if (func == JPALoadCalcTexCrdMtxAnm) {
|
||||
mBatchInfo.hasPtclTexMtx = true;
|
||||
} else if (func == JPARegistAlpha || func == JPARegistPrmAlpha ||
|
||||
func == JPARegistPrmAlphaEnv || func == JPARegistAlphaEnv ||
|
||||
func == static_cast<DrawParticleFunc>(JPARegistEnv)) // overloaded
|
||||
{
|
||||
mBatchInfo.hasPtclColor = true;
|
||||
} else {
|
||||
// JPADrawPoint, JPADrawLine, JPADrawDBillboard, JPALoadTexAnm,
|
||||
// JPASetPointSize, JPASetLineWidth
|
||||
return;
|
||||
}
|
||||
}
|
||||
if (!hasDrawFunc) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Template array offsets, same math as setPTev
|
||||
int base_plane_type = (pBsp->getType() == 3 || pBsp->getType() == 7) ?
|
||||
pBsp->getBasePlaneType() : 0;
|
||||
int center_offset = pEsp != nullptr ? (pEsp->getScaleCenterX() + 3 * pEsp->getScaleCenterY()) * 0xC : 0x30;
|
||||
const s8* pos = reinterpret_cast<const s8*>(jpa_pos) + center_offset + base_plane_type * 0x6C;
|
||||
const s8* crd = reinterpret_cast<const s8*>(jpa_crd) + (pBsp->getTilingS() + 2 * pBsp->getTilingT()) * 8;
|
||||
|
||||
bool cross = pBsp->getType() == 4 || pBsp->getType() == 8;
|
||||
mBatchInfo.vtxCount = cross ? 8 : 4;
|
||||
for (int i = 0; i < mBatchInfo.vtxCount; i++) {
|
||||
int posIdx = i < 4 ? i : 72 + (i - 4);
|
||||
int crdIdx = i & 3;
|
||||
mBatchInfo.vtxPos[i][0] = pos[posIdx * 3 + 0];
|
||||
mBatchInfo.vtxPos[i][1] = pos[posIdx * 3 + 1];
|
||||
mBatchInfo.vtxPos[i][2] = pos[posIdx * 3 + 2];
|
||||
mBatchInfo.vtxUv[i][0] = crd[crdIdx * 2 + 0];
|
||||
mBatchInfo.vtxUv[i][1] = crd[crdIdx * 2 + 1];
|
||||
}
|
||||
|
||||
mBatchInfo.supported = true;
|
||||
}
|
||||
#endif
|
||||
|
||||
void JPAResource::init(JKRHeap* heap) {
|
||||
BOOL is_glbl_clr_anm = pBsp->isGlblClrAnm();
|
||||
BOOL is_glbl_tex_anm = pBsp->isGlblTexAnm();
|
||||
@@ -525,7 +591,10 @@ void JPAResource::init(JKRHeap* heap) {
|
||||
|
||||
if (mpDrawParticleFuncListNum != 0) {
|
||||
mpDrawParticleFuncList =
|
||||
(ParticleFunc*)JKRAllocFromHeap(heap, mpDrawParticleFuncListNum * sizeof(ParticleFunc), alignof(ParticleFunc));
|
||||
(DrawParticleFunc*)JKRAllocFromHeap(
|
||||
heap,
|
||||
mpDrawParticleFuncListNum * sizeof(DrawParticleFunc),
|
||||
alignof(DrawParticleFunc));
|
||||
}
|
||||
|
||||
func_no = 0;
|
||||
@@ -635,7 +704,10 @@ void JPAResource::init(JKRHeap* heap) {
|
||||
|
||||
if (mpDrawParticleChildFuncListNum != 0) {
|
||||
mpDrawParticleChildFuncList =
|
||||
(ParticleFunc*)JKRAllocFromHeap(heap, mpDrawParticleChildFuncListNum * sizeof(ParticleFunc), sizeof(EmitterFunc));
|
||||
(DrawParticleFunc*)JKRAllocFromHeap(
|
||||
heap,
|
||||
mpDrawParticleChildFuncListNum * sizeof(DrawParticleFunc),
|
||||
alignof(DrawParticleFunc));
|
||||
}
|
||||
|
||||
func_no = 0;
|
||||
@@ -699,6 +771,10 @@ void JPAResource::init(JKRHeap* heap) {
|
||||
mpDrawParticleChildFuncList[func_no] = &JPARegistPrmAlphaEnv;
|
||||
func_no++;
|
||||
}
|
||||
|
||||
#if TARGET_PC
|
||||
initBatchInfo();
|
||||
#endif
|
||||
}
|
||||
|
||||
bool JPAResource::calc(JPAEmitterWorkData* work, JPABaseEmitter* emtr) {
|
||||
@@ -808,6 +884,183 @@ void JPAResource::draw(JPAEmitterWorkData* work, JPABaseEmitter* emtr) {
|
||||
}
|
||||
}
|
||||
|
||||
#if TARGET_PC
|
||||
static GXTevAlphaArg to_vtx_alpha_arg(GXTevAlphaArg arg) {
|
||||
return arg == GX_CA_A0 ? GX_CA_RASA : arg;
|
||||
}
|
||||
|
||||
static void batch_set_tev_op(GXTevStageID stage) {
|
||||
GXSetTevColorOp(stage, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, GX_TRUE, GX_TEVPREV);
|
||||
GXSetTevAlphaOp(stage, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, GX_TRUE, GX_TEVPREV);
|
||||
}
|
||||
|
||||
static void batch_setup_tev(JPAEmitterWorkData* work, bool useClr1) {
|
||||
JPABaseShape* shape = work->mpRes->getBsp();
|
||||
JPAExTexShape* ets = work->mpRes->getEts();
|
||||
bool useIndirect = ets != nullptr && ets->isUseIndirect();
|
||||
|
||||
// JPAEmitterManager::draw configures both channels to pass vertex color through
|
||||
GXSetNumChans(useClr1 ? 2 : 1);
|
||||
|
||||
const GXTevAlphaArg* alphaArg = shape->getTevAlphaArg();
|
||||
GXSetTevOrder(GX_TEVSTAGE0, GX_TEXCOORD0, GX_TEXMAP0, GX_COLOR0A0);
|
||||
GXSetTevAlphaIn(GX_TEVSTAGE0, to_vtx_alpha_arg(alphaArg[0]), to_vtx_alpha_arg(alphaArg[1]),
|
||||
to_vtx_alpha_arg(alphaArg[2]), to_vtx_alpha_arg(alphaArg[3]));
|
||||
batch_set_tev_op(GX_TEVSTAGE0);
|
||||
if (!useIndirect) {
|
||||
GXSetTevDirect(GX_TEVSTAGE0);
|
||||
}
|
||||
GXTevStageID nextStage = GX_TEVSTAGE1;
|
||||
|
||||
switch (shape->getTevColorArgSel()) {
|
||||
case 0: // TEXC
|
||||
GXSetTevColorIn(GX_TEVSTAGE0, GX_CC_ZERO, GX_CC_TEXC, GX_CC_ONE, GX_CC_ZERO);
|
||||
break;
|
||||
case 1: // C0 * TEXC
|
||||
GXSetTevColorIn(GX_TEVSTAGE0, GX_CC_ZERO, GX_CC_RASC, GX_CC_TEXC, GX_CC_ZERO);
|
||||
break;
|
||||
case 2: // lerp(C0, 1, TEXC)
|
||||
GXSetTevColorIn(GX_TEVSTAGE0, GX_CC_RASC, GX_CC_ONE, GX_CC_TEXC, GX_CC_ZERO);
|
||||
break;
|
||||
case 3: // lerp(C1, C0, TEXC) = C0 * TEXC (stage 0) + C1 * (1 - TEXC) (stage 1)
|
||||
GXSetTevColorIn(GX_TEVSTAGE0, GX_CC_ZERO, GX_CC_RASC, GX_CC_TEXC, GX_CC_ZERO);
|
||||
GXSetTevOrder(nextStage, GX_TEXCOORD0, GX_TEXMAP0, GX_COLOR1A1);
|
||||
GXSetTevColorIn(nextStage, GX_CC_RASC, GX_CC_ZERO, GX_CC_TEXC, GX_CC_CPREV);
|
||||
GXSetTevAlphaIn(nextStage, GX_CA_ZERO, GX_CA_ZERO, GX_CA_ZERO, GX_CA_APREV);
|
||||
batch_set_tev_op(nextStage);
|
||||
GXSetTevDirect(nextStage);
|
||||
nextStage = static_cast<GXTevStageID>(nextStage + 1);
|
||||
break;
|
||||
case 4: // TEXC * C0 + C1: C0 * TEXC (stage 0), + C1 (stage 1)
|
||||
GXSetTevColorIn(GX_TEVSTAGE0, GX_CC_ZERO, GX_CC_RASC, GX_CC_TEXC, GX_CC_ZERO);
|
||||
GXSetTevOrder(nextStage, GX_TEXCOORD0, GX_TEXMAP0, GX_COLOR1A1);
|
||||
GXSetTevColorIn(nextStage, GX_CC_CPREV, GX_CC_ZERO, GX_CC_ZERO, GX_CC_RASC);
|
||||
GXSetTevAlphaIn(nextStage, GX_CA_ZERO, GX_CA_ZERO, GX_CA_ZERO, GX_CA_APREV);
|
||||
batch_set_tev_op(nextStage);
|
||||
GXSetTevDirect(nextStage);
|
||||
nextStage = static_cast<GXTevStageID>(nextStage + 1);
|
||||
break;
|
||||
case 5: // C0
|
||||
GXSetTevColorIn(GX_TEVSTAGE0, GX_CC_ZERO, GX_CC_ZERO, GX_CC_ZERO, GX_CC_RASC);
|
||||
break;
|
||||
}
|
||||
|
||||
if (ets != nullptr && ets->isUseSecTex()) {
|
||||
// Mirrors setPTev's secondary texture stage, at the next free stage
|
||||
GXTexCoordID texCoord = useIndirect ? GX_TEXCOORD2 : GX_TEXCOORD1;
|
||||
GXSetTevOrder(nextStage, texCoord, GX_TEXMAP3, GX_COLOR_NULL);
|
||||
GXSetTevColorIn(nextStage, GX_CC_ZERO, GX_CC_TEXC, GX_CC_CPREV, GX_CC_ZERO);
|
||||
GXSetTevAlphaIn(nextStage, GX_CA_ZERO, GX_CA_TEXA, GX_CA_APREV, GX_CA_ZERO);
|
||||
batch_set_tev_op(nextStage);
|
||||
GXSetTevDirect(nextStage);
|
||||
nextStage = static_cast<GXTevStageID>(nextStage + 1);
|
||||
}
|
||||
|
||||
GXSetNumTevStages(nextStage);
|
||||
}
|
||||
|
||||
static void batch_setup_vtx_desc(bool useClr0, bool useClr1) {
|
||||
static Mtx identityMtx = {
|
||||
{1.0f, 0.0f, 0.0f, 0.0f},
|
||||
{0.0f, 1.0f, 0.0f, 0.0f},
|
||||
{0.0f, 0.0f, 1.0f, 0.0f},
|
||||
};
|
||||
|
||||
GXLoadPosMtxImm(identityMtx, GX_PNMTX0);
|
||||
GXSetCurrentMtx(GX_PNMTX0);
|
||||
GXClearVtxDesc();
|
||||
GXSetVtxDesc(GX_VA_POS, GX_DIRECT);
|
||||
if (useClr0) {
|
||||
GXSetVtxDesc(GX_VA_CLR0, GX_DIRECT);
|
||||
}
|
||||
if (useClr1) {
|
||||
GXSetVtxDesc(GX_VA_CLR1, GX_DIRECT);
|
||||
}
|
||||
GXSetVtxDesc(GX_VA_TEX0, GX_DIRECT);
|
||||
GXSetVtxAttrFmt(GX_VTXFMT1, GX_VA_POS, GX_POS_XYZ, GX_F32, 0);
|
||||
if (useClr0) {
|
||||
GXSetVtxAttrFmt(GX_VTXFMT1, GX_VA_CLR0, GX_CLR_RGBA, GX_RGBA8, 0);
|
||||
}
|
||||
if (useClr1) {
|
||||
GXSetVtxAttrFmt(GX_VTXFMT1, GX_VA_CLR1, GX_CLR_RGBA, GX_RGBA8, 0);
|
||||
}
|
||||
GXSetVtxAttrFmt(GX_VTXFMT1, GX_VA_TEX0, GX_TEX_ST, GX_F32, 0);
|
||||
}
|
||||
|
||||
static void batch_restore_gx(JPAEmitterWorkData* work, bool changedTev, bool changedTexMtx) {
|
||||
GXClearVtxDesc();
|
||||
GXSetVtxDesc(GX_VA_POS, GX_INDEX8);
|
||||
GXSetVtxDesc(GX_VA_TEX0, GX_INDEX8);
|
||||
GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_POS, GX_POS_XYZ, GX_S8, 0);
|
||||
GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_TEX0, GX_TEX_ST, GX_S8, 0);
|
||||
GXSetVtxAttrFmt(GX_VTXFMT1, GX_VA_POS, GX_POS_XYZ, GX_F32, 0);
|
||||
GXSetVtxAttrFmt(GX_VTXFMT1, GX_VA_TEX0, GX_TEX_ST, GX_F32, 0);
|
||||
GXSetCurrentMtx(GX_PNMTX0);
|
||||
|
||||
if (changedTexMtx) {
|
||||
GXSetTexCoordGen(GX_TEXCOORD0, GX_TG_MTX2x4, GX_TG_TEX0, GX_TEXMTX0);
|
||||
}
|
||||
|
||||
if (changedTev) {
|
||||
GXSetNumChans(0);
|
||||
work->mpRes->getBsp()->setGX(work);
|
||||
work->mpRes->setPTev();
|
||||
}
|
||||
}
|
||||
|
||||
static bool draw_particle_batch(JPAEmitterWorkData* work) {
|
||||
ZoneScoped;
|
||||
|
||||
JPAResource* res = work->mpRes;
|
||||
const JPAResource::BatchInfo& info = res->mBatchInfo;
|
||||
if (!info.supported || work->mPrjType != 0 || work->mpEmtr->mpPtclCallBack != nullptr) {
|
||||
return false;
|
||||
}
|
||||
|
||||
bool useClr0 = false;
|
||||
bool useClr1 = false;
|
||||
if (info.hasPtclColor) {
|
||||
u32 colorSel = res->getBsp()->getTevColorArgSel();
|
||||
if (colorSel >= 6) {
|
||||
return false;
|
||||
}
|
||||
useClr0 = true;
|
||||
useClr1 = colorSel == 3 || colorSel == 4;
|
||||
batch_setup_tev(work, useClr1);
|
||||
}
|
||||
|
||||
if (info.hasPtclTexMtx) {
|
||||
// UVs are CPU-transformed; drop the texgen
|
||||
GXSetTexCoordGen(GX_TEXCOORD0, GX_TG_MTX2x4, GX_TG_TEX0, GX_IDENTITY);
|
||||
}
|
||||
|
||||
batch_setup_vtx_desc(useClr0, useClr1);
|
||||
|
||||
ParticleDrawCtx ctx{};
|
||||
ctx.batch = true;
|
||||
ctx.useTexMtx = info.hasPtclTexMtx;
|
||||
ctx.useClr0 = useClr0;
|
||||
ctx.useClr1 = useClr1;
|
||||
|
||||
bool fwdAhead = res->getBsp()->isDrawFwdAhead();
|
||||
JPANode<JPABaseParticle>* node = fwdAhead ? work->mpEmtr->mAlivePtclBase.getLast() :
|
||||
work->mpEmtr->mAlivePtclBase.getFirst();
|
||||
|
||||
GXBegin(GX_QUADS, GX_VTXFMT1, GX_AUTO);
|
||||
while (node != work->mpEmtr->mAlivePtclBase.getEnd()) {
|
||||
work->mpCurNode = node;
|
||||
for (int i = res->mpDrawParticleFuncListNum - 1; i >= 0; i--) {
|
||||
(*res->mpDrawParticleFuncList[i])(work, node->getObject(), &ctx);
|
||||
}
|
||||
node = fwdAhead ? node->getPrev() : node->getNext();
|
||||
}
|
||||
GXEnd();
|
||||
|
||||
batch_restore_gx(work, useClr0, info.hasPtclTexMtx);
|
||||
return true;
|
||||
}
|
||||
#endif
|
||||
|
||||
void JPAResource::drawP(JPAEmitterWorkData* work) {
|
||||
ZoneScoped;
|
||||
work->mpEmtr->clearStatus(0x80);
|
||||
@@ -842,13 +1095,25 @@ void JPAResource::drawP(JPAEmitterWorkData* work) {
|
||||
(*mpDrawEmitterFuncList[i])(work);
|
||||
}
|
||||
|
||||
#if TARGET_PC
|
||||
if (draw_particle_batch(work)) {
|
||||
GXSetMisc(GX_MT_XF_FLUSH, 0);
|
||||
if (work->mpEmtr->mpEmtrCallBack != nullptr) {
|
||||
work->mpEmtr->mpEmtrCallBack->drawAfter(work->mpEmtr);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
ParticleDrawCtx ctx{}; // immediate mode
|
||||
#endif
|
||||
|
||||
if (pBsp->isDrawFwdAhead()) {
|
||||
JPANode<JPABaseParticle>* node = work->mpEmtr->mAlivePtclBase.getLast();
|
||||
for (; node != work->mpEmtr->mAlivePtclBase.getEnd(); node = node->getPrev()) {
|
||||
work->mpCurNode = node;
|
||||
if (mpDrawParticleFuncList != NULL) {
|
||||
for (int i = mpDrawParticleFuncListNum - 1; i >= 0; i--) {
|
||||
(*mpDrawParticleFuncList[i])(work, node->getObject());
|
||||
(*mpDrawParticleFuncList[i])(work, node->getObject() JPA_DRAW_CTX_ARG);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -858,7 +1123,7 @@ void JPAResource::drawP(JPAEmitterWorkData* work) {
|
||||
work->mpCurNode = node;
|
||||
if (mpDrawParticleFuncList != NULL) {
|
||||
for (int i = mpDrawParticleFuncListNum - 1; i >= 0; i--) {
|
||||
(*mpDrawParticleFuncList[i])(work, node->getObject());
|
||||
(*mpDrawParticleFuncList[i])(work, node->getObject() JPA_DRAW_CTX_ARG);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -905,13 +1170,17 @@ void JPAResource::drawC(JPAEmitterWorkData* work) {
|
||||
(*mpDrawEmitterChildFuncList[i])(work);
|
||||
}
|
||||
|
||||
#if TARGET_PC
|
||||
ParticleDrawCtx ctx{}; // immediate mode
|
||||
#endif
|
||||
|
||||
if (pBsp->isDrawFwdAhead()) {
|
||||
JPANode<JPABaseParticle>* node = work->mpEmtr->mAlivePtclChld.getLast();
|
||||
for (; node != work->mpEmtr->mAlivePtclChld.getEnd(); node = node->getPrev()) {
|
||||
work->mpCurNode = node;
|
||||
if (mpDrawParticleChildFuncList != NULL) {
|
||||
for (int i = mpDrawParticleChildFuncListNum - 1; i >= 0; i--) {
|
||||
(*mpDrawParticleChildFuncList[i])(work, node->getObject());
|
||||
(*mpDrawParticleChildFuncList[i])(work, node->getObject() JPA_DRAW_CTX_ARG);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -921,7 +1190,7 @@ void JPAResource::drawC(JPAEmitterWorkData* work) {
|
||||
work->mpCurNode = node;
|
||||
if (mpDrawParticleChildFuncList != NULL) {
|
||||
for (int i = mpDrawParticleChildFuncListNum - 1; i >= 0; i--) {
|
||||
(*mpDrawParticleChildFuncList[i])(work, node->getObject());
|
||||
(*mpDrawParticleChildFuncList[i])(work, node->getObject() JPA_DRAW_CTX_ARG);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4,6 +4,7 @@ import android.app.ActionBar;
|
||||
import android.app.Activity;
|
||||
import android.content.ActivityNotFoundException;
|
||||
import android.content.ClipData;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.database.Cursor;
|
||||
import android.net.Uri;
|
||||
@@ -14,12 +15,16 @@ import android.provider.DocumentsContract;
|
||||
import android.provider.OpenableColumns;
|
||||
import android.provider.Settings;
|
||||
import android.util.Log;
|
||||
import android.view.Display;
|
||||
import android.view.Surface;
|
||||
import android.view.SurfaceHolder;
|
||||
import android.view.View;
|
||||
import android.view.Window;
|
||||
import android.view.WindowInsets;
|
||||
import android.view.WindowInsetsController;
|
||||
|
||||
import org.libsdl.app.SDLActivity;
|
||||
import org.libsdl.app.SDLSurface;
|
||||
|
||||
import java.io.File;
|
||||
import java.util.ArrayList;
|
||||
@@ -27,6 +32,7 @@ import java.util.List;
|
||||
|
||||
public class DuskActivity extends SDLActivity {
|
||||
private static final String TAG = "DuskActivity";
|
||||
private static final float DEFAULT_SURFACE_FRAME_RATE = 60.0f;
|
||||
private static final int FOLDER_DIALOG_REQUEST_CODE = 0x4455;
|
||||
private static final int MANAGE_STORAGE_REQUEST_CODE = 0x4456;
|
||||
private static final String EXTERNAL_STORAGE_AUTHORITY =
|
||||
@@ -88,6 +94,11 @@ public class DuskActivity extends SDLActivity {
|
||||
hideSystemBars();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected SDLSurface createSDLSurface(Context context) {
|
||||
return new DuskSurface(context);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onResume() {
|
||||
super.onResume();
|
||||
@@ -139,6 +150,77 @@ public class DuskActivity extends SDLActivity {
|
||||
};
|
||||
}
|
||||
|
||||
public void setPreferredSurfaceFrameRate(float frameRate) {
|
||||
runOnUiThread(() -> {
|
||||
if (mSurface instanceof DuskSurface) {
|
||||
((DuskSurface)mSurface).setPreferredFrameRate(frameRate);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private static final class DuskSurface extends SDLSurface {
|
||||
private float preferredFrameRate = DEFAULT_SURFACE_FRAME_RATE;
|
||||
|
||||
DuskSurface(Context context) {
|
||||
super(context);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
|
||||
super.surfaceChanged(holder, format, width, height);
|
||||
setTargetFrameRate(holder);
|
||||
}
|
||||
|
||||
void setPreferredFrameRate(float frameRate) {
|
||||
preferredFrameRate = frameRate;
|
||||
setTargetFrameRate(getHolder());
|
||||
}
|
||||
|
||||
private void setTargetFrameRate(SurfaceHolder holder) {
|
||||
if (!mIsSurfaceReady || Build.VERSION.SDK_INT < Build.VERSION_CODES.R) {
|
||||
return;
|
||||
}
|
||||
|
||||
Surface surface = holder != null ? holder.getSurface() : getHolder().getSurface();
|
||||
if (surface == null || !surface.isValid()) {
|
||||
return;
|
||||
}
|
||||
|
||||
float targetFrameRate = getMaxSupportedFrameRate();
|
||||
if (preferredFrameRate > 0.0f) {
|
||||
targetFrameRate = preferredFrameRate;
|
||||
}
|
||||
if (targetFrameRate <= 0.0f) {
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
surface.setFrameRate(
|
||||
targetFrameRate, Surface.FRAME_RATE_COMPATIBILITY_DEFAULT);
|
||||
Log.v(TAG, "Requested surface frame rate " + targetFrameRate + " fps");
|
||||
} catch (RuntimeException e) {
|
||||
Log.w(TAG, "Failed to request surface frame rate", e);
|
||||
}
|
||||
}
|
||||
|
||||
private float getMaxSupportedFrameRate() {
|
||||
if (mDisplay == null) {
|
||||
return 0.0f;
|
||||
}
|
||||
|
||||
float maxFrameRate = mDisplay.getRefreshRate();
|
||||
Display.Mode[] modes = mDisplay.getSupportedModes();
|
||||
if (modes == null) {
|
||||
return maxFrameRate;
|
||||
}
|
||||
|
||||
for (Display.Mode mode : modes) {
|
||||
maxFrameRate = Math.max(maxFrameRate, mode.getRefreshRate());
|
||||
}
|
||||
return maxFrameRate;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected String[] getArguments() {
|
||||
Intent intent = getIntent();
|
||||
|
||||
+209
-35
@@ -19,9 +19,13 @@ import android.os.*;
|
||||
|
||||
import java.lang.Runnable;
|
||||
import java.util.Arrays;
|
||||
import java.util.HashMap;
|
||||
import java.util.LinkedList;
|
||||
import java.util.UUID;
|
||||
|
||||
import java.util.regex.Pattern;
|
||||
import java.util.regex.Matcher;
|
||||
|
||||
class HIDDeviceBLESteamController extends BluetoothGattCallback implements HIDDevice {
|
||||
|
||||
private static final String TAG = "hidapi";
|
||||
@@ -33,10 +37,19 @@ class HIDDeviceBLESteamController extends BluetoothGattCallback implements HIDDe
|
||||
private boolean mIsConnected = false;
|
||||
private boolean mIsChromebook = false;
|
||||
private boolean mIsReconnecting = false;
|
||||
private boolean mHasEnabledNotifications = false;
|
||||
private boolean mHasSeenInputUpdate = false;
|
||||
private boolean mFrozen = false;
|
||||
private LinkedList<GattOperation> mOperations;
|
||||
GattOperation mCurrentOperation = null;
|
||||
private Handler mHandler;
|
||||
private int mProductId = -1;
|
||||
private int mReportId = 0;
|
||||
private UUID mInputCharacteristic;
|
||||
|
||||
private static final int D0G_BLE2_PID = 0x1106;
|
||||
private static final int TRITON_BLE_PID = 0x1303;
|
||||
|
||||
|
||||
private static final int TRANSPORT_AUTO = 0;
|
||||
private static final int TRANSPORT_BREDR = 1;
|
||||
@@ -45,10 +58,14 @@ class HIDDeviceBLESteamController extends BluetoothGattCallback implements HIDDe
|
||||
private static final int CHROMEBOOK_CONNECTION_CHECK_INTERVAL = 10000;
|
||||
|
||||
static final UUID steamControllerService = UUID.fromString("100F6C32-1735-4313-B402-38567131E5F3");
|
||||
static final UUID inputCharacteristic = UUID.fromString("100F6C33-1735-4313-B402-38567131E5F3");
|
||||
static final UUID inputCharacteristicD0G = UUID.fromString("100F6C33-1735-4313-B402-38567131E5F3");
|
||||
static final UUID inputCharacteristicTriton_0x45 = UUID.fromString("100F6C7A-1735-4313-B402-38567131E5F3");
|
||||
static final UUID inputCharacteristicTriton_0x47 = UUID.fromString("100F6C7C-1735-4313-B402-38567131E5F3");
|
||||
static final UUID reportCharacteristic = UUID.fromString("100F6C34-1735-4313-B402-38567131E5F3");
|
||||
static private final byte[] enterValveMode = new byte[] { (byte)0xC0, (byte)0x87, 0x03, 0x08, 0x07, 0x00 };
|
||||
|
||||
private HashMap<Integer, BluetoothGattCharacteristic> mOutputReportChars = new HashMap<Integer, BluetoothGattCharacteristic>();
|
||||
|
||||
static class GattOperation {
|
||||
private enum Operation {
|
||||
CHR_READ,
|
||||
@@ -61,6 +78,7 @@ class HIDDeviceBLESteamController extends BluetoothGattCallback implements HIDDe
|
||||
byte[] mValue;
|
||||
BluetoothGatt mGatt;
|
||||
boolean mResult = true;
|
||||
int mDelayMs = 0;
|
||||
|
||||
private GattOperation(BluetoothGatt gatt, GattOperation.Operation operation, UUID uuid) {
|
||||
mGatt = gatt;
|
||||
@@ -68,6 +86,13 @@ class HIDDeviceBLESteamController extends BluetoothGattCallback implements HIDDe
|
||||
mUuid = uuid;
|
||||
}
|
||||
|
||||
private GattOperation(BluetoothGatt gatt, GattOperation.Operation operation, UUID uuid, int delayMs) {
|
||||
mGatt = gatt;
|
||||
mOp = operation;
|
||||
mUuid = uuid;
|
||||
mDelayMs = delayMs;
|
||||
}
|
||||
|
||||
private GattOperation(BluetoothGatt gatt, GattOperation.Operation operation, UUID uuid, byte[] value) {
|
||||
mGatt = gatt;
|
||||
mOp = operation;
|
||||
@@ -75,6 +100,14 @@ class HIDDeviceBLESteamController extends BluetoothGattCallback implements HIDDe
|
||||
mValue = value;
|
||||
}
|
||||
|
||||
private GattOperation(BluetoothGatt gatt, GattOperation.Operation operation, UUID uuid, byte[] value, int delayMs) {
|
||||
mGatt = gatt;
|
||||
mOp = operation;
|
||||
mUuid = uuid;
|
||||
mValue = value;
|
||||
mDelayMs = delayMs;
|
||||
}
|
||||
|
||||
public void run() {
|
||||
// This is executed in main thread
|
||||
BluetoothGattCharacteristic chr;
|
||||
@@ -136,6 +169,8 @@ class HIDDeviceBLESteamController extends BluetoothGattCallback implements HIDDe
|
||||
return mResult;
|
||||
}
|
||||
|
||||
public int getDelayMs() { return mDelayMs; }
|
||||
|
||||
private BluetoothGattCharacteristic getCharacteristic(UUID uuid) {
|
||||
BluetoothGattService valveService = mGatt.getService(steamControllerService);
|
||||
if (valveService == null)
|
||||
@@ -154,6 +189,10 @@ class HIDDeviceBLESteamController extends BluetoothGattCallback implements HIDDe
|
||||
static public GattOperation enableNotification(BluetoothGatt gatt, UUID uuid) {
|
||||
return new GattOperation(gatt, Operation.ENABLE_NOTIFICATION, uuid);
|
||||
}
|
||||
|
||||
static public GattOperation enableNotification(BluetoothGatt gatt, UUID uuid, int delayMs) {
|
||||
return new GattOperation(gatt, Operation.ENABLE_NOTIFICATION, uuid, delayMs);
|
||||
}
|
||||
}
|
||||
|
||||
HIDDeviceBLESteamController(HIDDeviceManager manager, BluetoothDevice device) {
|
||||
@@ -166,6 +205,8 @@ class HIDDeviceBLESteamController extends BluetoothGattCallback implements HIDDe
|
||||
mHandler = new Handler(Looper.getMainLooper());
|
||||
|
||||
mGatt = connectGatt();
|
||||
mHasEnabledNotifications = false;
|
||||
mHasSeenInputUpdate = false;
|
||||
// final HIDDeviceBLESteamController finalThis = this;
|
||||
// mHandler.postDelayed(new Runnable() {
|
||||
// @Override
|
||||
@@ -314,8 +355,45 @@ class HIDDeviceBLESteamController extends BluetoothGattCallback implements HIDDe
|
||||
Log.v(TAG, "Found Valve steam controller service " + service.getUuid());
|
||||
|
||||
for (BluetoothGattCharacteristic chr : service.getCharacteristics()) {
|
||||
if (chr.getUuid().equals(inputCharacteristic)) {
|
||||
Log.v(TAG, "Found input characteristic");
|
||||
if (chr.getUuid().equals(inputCharacteristicTriton_0x45)) {
|
||||
Log.v(TAG, "Found Triton input characteristic 0x45");
|
||||
mProductId = TRITON_BLE_PID;
|
||||
mReportId = 0x45;
|
||||
mInputCharacteristic = chr.getUuid();
|
||||
} else if (chr.getUuid().equals(inputCharacteristicTriton_0x47)) {
|
||||
Log.v(TAG, "Found Triton input characteristic 0x47");
|
||||
mProductId = TRITON_BLE_PID;
|
||||
mReportId = 0x47;
|
||||
mInputCharacteristic = chr.getUuid();
|
||||
} else if (chr.getUuid().equals(inputCharacteristicD0G)) {
|
||||
Log.v(TAG, "Found D0G input characteristic");
|
||||
mProductId = D0G_BLE2_PID;
|
||||
mReportId = 0x03;
|
||||
mInputCharacteristic = chr.getUuid();
|
||||
} else {
|
||||
Pattern reportPattern = Pattern.compile("100F6C([0-9A-Z]{2})", Pattern.CASE_INSENSITIVE);
|
||||
Matcher matcher = reportPattern.matcher(chr.getUuid().toString());
|
||||
|
||||
if (matcher.find()) {
|
||||
try {
|
||||
int reportId = Integer.parseInt(matcher.group(1), 16);
|
||||
|
||||
reportId -= 0x35;
|
||||
if (reportId >= 0x80) {
|
||||
// This is a Triton output report characteristic that we need to care about.
|
||||
Log.v(TAG, "Found Triton output report 0x" + Integer.toString(reportId, 16));
|
||||
mOutputReportChars.put(reportId, chr);
|
||||
}
|
||||
}
|
||||
catch (NumberFormatException nfe) {
|
||||
Log.w(TAG, "Could not parse report characteristic " + chr.getUuid().toString() + ": " + nfe.toString());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (BluetoothGattCharacteristic chr : service.getCharacteristics()) {
|
||||
if (chr.getUuid().equals(mInputCharacteristic)) {
|
||||
// Start notifications
|
||||
BluetoothGattDescriptor cccd = chr.getDescriptor(UUID.fromString("00002902-0000-1000-8000-00805f9b34fb"));
|
||||
if (cccd != null) {
|
||||
@@ -372,21 +450,30 @@ class HIDDeviceBLESteamController extends BluetoothGattCallback implements HIDDe
|
||||
mCurrentOperation = mOperations.removeFirst();
|
||||
}
|
||||
|
||||
// Run in main thread
|
||||
mHandler.post(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
synchronized (mOperations) {
|
||||
if (mCurrentOperation == null) {
|
||||
Log.e(TAG, "Current operation null in executor?");
|
||||
return;
|
||||
}
|
||||
Runnable gattOperationRunnable = new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
synchronized (mOperations) {
|
||||
if (mCurrentOperation == null) {
|
||||
Log.e(TAG, "Current operation null in executor?");
|
||||
return;
|
||||
}
|
||||
|
||||
mCurrentOperation.run();
|
||||
// now wait for the GATT callback and when it comes, finish this operation
|
||||
mCurrentOperation.run();
|
||||
// now wait for the GATT callback and when it comes, finish this operation
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
if (mCurrentOperation.getDelayMs() == 0) {
|
||||
// Run in main thread
|
||||
mHandler.post(gattOperationRunnable);
|
||||
}
|
||||
else {
|
||||
// If we have a delay on this operation, wait before we post it.
|
||||
mHandler.postDelayed(gattOperationRunnable, mCurrentOperation.getDelayMs());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private void queueGattOperation(GattOperation op) {
|
||||
@@ -397,8 +484,39 @@ class HIDDeviceBLESteamController extends BluetoothGattCallback implements HIDDe
|
||||
}
|
||||
|
||||
private void enableNotification(UUID chrUuid) {
|
||||
GattOperation op = HIDDeviceBLESteamController.GattOperation.enableNotification(mGatt, chrUuid);
|
||||
// Add a 500ms delay to notification write for Amazon Fire TV devices, as otherwise if we do this too quickly after connecting
|
||||
// it will return success and then silently drop the operation on the floor.
|
||||
GattOperation op = HIDDeviceBLESteamController.GattOperation.enableNotification(mGatt, chrUuid, 500);
|
||||
queueGattOperation(op);
|
||||
|
||||
// Amazon Fire devices can also silently timeout on writeDescriptor, so
|
||||
// set up a little delayed check that will attempt to write a second time.
|
||||
//
|
||||
// While this only seems to be needed on Amazon Fire TV devices at present, it
|
||||
// doesn't hurt to have a retry on other devices as well.
|
||||
//
|
||||
final HIDDeviceBLESteamController finalThis = this;
|
||||
final UUID finalUuid = chrUuid;
|
||||
mHandler.postDelayed(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
if (!finalThis.mHasEnabledNotifications) {
|
||||
|
||||
if (finalThis.mHasSeenInputUpdate) {
|
||||
// Amazon Five devices may have enabled notifications on the input characteristic and not given us a callback. If we've seen
|
||||
// input reports, though, somewhat by definition notifications are enabled.
|
||||
Log.w(TAG, "WriteDescriptor has never returned, but we've seen input reports. Moving on with controller initialization.");
|
||||
finalThis.mHasEnabledNotifications = true;
|
||||
finalThis.enableValveMode();
|
||||
return;
|
||||
}
|
||||
|
||||
// Give one more try.
|
||||
GattOperation retry = HIDDeviceBLESteamController.GattOperation.enableNotification(finalThis.mGatt, finalUuid, 500);
|
||||
finalThis.queueGattOperation(retry);
|
||||
}
|
||||
}
|
||||
}, 1000);
|
||||
}
|
||||
|
||||
void writeCharacteristic(UUID uuid, byte[] value) {
|
||||
@@ -448,8 +566,16 @@ class HIDDeviceBLESteamController extends BluetoothGattCallback implements HIDDe
|
||||
mIsConnected = false;
|
||||
gatt.disconnect();
|
||||
mGatt = connectGatt(false);
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
if (getProductId() == TRITON_BLE_PID) {
|
||||
// Android will not properly play well with Data Length Extensions without manually requesting a large MTU,
|
||||
// and Triton controllers require DLE support.
|
||||
//
|
||||
// 517 is basically a "magic number" as far as Android's bluetooth code is concerned, so do not change
|
||||
// this value. It is functionally "please enable data length extensions" on some Android builds.
|
||||
mGatt.requestMtu(517);
|
||||
}
|
||||
|
||||
probeService(this);
|
||||
}
|
||||
}
|
||||
@@ -474,7 +600,7 @@ class HIDDeviceBLESteamController extends BluetoothGattCallback implements HIDDe
|
||||
// Only register controller with the native side once it has been fully configured
|
||||
if (!isRegistered()) {
|
||||
Log.v(TAG, "Registering Steam Controller with ID: " + getId());
|
||||
mManager.HIDDeviceConnected(getId(), getIdentifier(), getVendorId(), getProductId(), getSerialNumber(), getVersion(), getManufacturerName(), getProductName(), 0, 0, 0, 0, true);
|
||||
mManager.HIDDeviceConnected(getId(), getIdentifier(), getVendorId(), getProductId(), getSerialNumber(), getVersion(), getManufacturerName(), getProductName(), 0, 0, 0, 0, true, mReportId);
|
||||
setRegistered();
|
||||
}
|
||||
}
|
||||
@@ -487,7 +613,8 @@ class HIDDeviceBLESteamController extends BluetoothGattCallback implements HIDDe
|
||||
// Enable this for verbose logging of controller input reports
|
||||
//Log.v(TAG, "onCharacteristicChanged uuid=" + characteristic.getUuid() + " data=" + HexDump.dumpHexString(characteristic.getValue()));
|
||||
|
||||
if (characteristic.getUuid().equals(inputCharacteristic) && !mFrozen) {
|
||||
if (characteristic.getUuid().equals(mInputCharacteristic) && !mFrozen) {
|
||||
mHasSeenInputUpdate = true;
|
||||
mManager.HIDDeviceInputReport(getId(), characteristic.getValue());
|
||||
}
|
||||
}
|
||||
@@ -497,19 +624,36 @@ class HIDDeviceBLESteamController extends BluetoothGattCallback implements HIDDe
|
||||
//Log.v(TAG, "onDescriptorRead status=" + status);
|
||||
}
|
||||
|
||||
private void enableValveMode()
|
||||
{
|
||||
BluetoothGattService valveService = mGatt.getService(steamControllerService);
|
||||
if (valveService == null)
|
||||
return;
|
||||
|
||||
BluetoothGattCharacteristic reportChr = valveService.getCharacteristic(reportCharacteristic);
|
||||
if (reportChr != null) {
|
||||
if (getProductId() == TRITON_BLE_PID) {
|
||||
// For Triton we just mark things registered.
|
||||
Log.v(TAG, "Registering Triton Steam Controller with ID: " + getId());
|
||||
mManager.HIDDeviceConnected(getId(), getIdentifier(), getVendorId(), getProductId(), getSerialNumber(), getVersion(), getManufacturerName(), getProductName(), 0, 0, 0, 0, true, mReportId);
|
||||
setRegistered();
|
||||
} else {
|
||||
// For the original controller, we need to manually enter Valve mode.
|
||||
Log.v(TAG, "Writing report characteristic to enter valve mode");
|
||||
reportChr.setValue(enterValveMode);
|
||||
mGatt.writeCharacteristic(reportChr);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDescriptorWrite(BluetoothGatt gatt, BluetoothGattDescriptor descriptor, int status) {
|
||||
BluetoothGattCharacteristic chr = descriptor.getCharacteristic();
|
||||
//Log.v(TAG, "onDescriptorWrite status=" + status + " uuid=" + chr.getUuid() + " descriptor=" + descriptor.getUuid());
|
||||
|
||||
if (chr.getUuid().equals(inputCharacteristic)) {
|
||||
boolean hasWrittenInputDescriptor = true;
|
||||
BluetoothGattCharacteristic reportChr = chr.getService().getCharacteristic(reportCharacteristic);
|
||||
if (reportChr != null) {
|
||||
Log.v(TAG, "Writing report characteristic to enter valve mode");
|
||||
reportChr.setValue(enterValveMode);
|
||||
gatt.writeCharacteristic(reportChr);
|
||||
}
|
||||
if (chr.getUuid().equals(mInputCharacteristic)) {
|
||||
mHasEnabledNotifications = true;
|
||||
enableValveMode();
|
||||
}
|
||||
|
||||
finishCurrentGattOperation();
|
||||
@@ -548,9 +692,20 @@ class HIDDeviceBLESteamController extends BluetoothGattCallback implements HIDDe
|
||||
|
||||
@Override
|
||||
public int getProductId() {
|
||||
// We don't have an easy way to query from the Bluetooth device, but we know what it is
|
||||
final int D0G_BLE2_PID = 0x1106;
|
||||
return D0G_BLE2_PID;
|
||||
if (mProductId > 0) {
|
||||
// We've already set a product ID.
|
||||
return mProductId;
|
||||
}
|
||||
|
||||
if (mDevice.getName().startsWith("Steam Ctrl")) {
|
||||
// We're a newer Triton device
|
||||
mProductId = TRITON_BLE_PID;
|
||||
} else {
|
||||
// We're an OG Steam Controller
|
||||
mProductId = D0G_BLE2_PID;
|
||||
}
|
||||
|
||||
return mProductId;
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -601,10 +756,29 @@ class HIDDeviceBLESteamController extends BluetoothGattCallback implements HIDDe
|
||||
writeCharacteristic(reportCharacteristic, actual_report);
|
||||
return report.length;
|
||||
} else {
|
||||
//Log.v(TAG, "writeOutputReport " + HexDump.dumpHexString(report));
|
||||
writeCharacteristic(reportCharacteristic, report);
|
||||
return report.length;
|
||||
// If we're an original-recipe Steam Controller we just write to the characteristic directly.
|
||||
if (getProductId() == D0G_BLE2_PID) {
|
||||
//Log.v(TAG, "writeOutputReport " + HexDump.dumpHexString(report));
|
||||
writeCharacteristic(reportCharacteristic, report);
|
||||
return report.length;
|
||||
}
|
||||
|
||||
// If we're a Triton, we need to find the correct report characteristic.
|
||||
if (report.length > 0) {
|
||||
int reportId = report[0] & 0xFF;
|
||||
BluetoothGattCharacteristic targetedReportCharacteristic = mOutputReportChars.get(reportId);
|
||||
if (targetedReportCharacteristic != null) {
|
||||
byte[] actual_report = Arrays.copyOfRange(report, 1, report.length - 1);
|
||||
//Log.v(TAG, "writeOutputReport 0x" + Integer.toString(reportId, 16) + " " + HexDump.dumpHexString(report));
|
||||
writeCharacteristic(targetedReportCharacteristic.getUuid(), actual_report);
|
||||
return report.length;
|
||||
} else {
|
||||
Log.w(TAG, "Got report write request for unknown report type 0x" + Integer.toString(reportId, 16));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -256,6 +256,7 @@ public class HIDDeviceManager {
|
||||
0x24c6, // PowerA
|
||||
0x2c22, // Qanba
|
||||
0x2dc8, // 8BitDo
|
||||
0x3537, // GameSir
|
||||
0x37d7, // Flydigi
|
||||
0x9886, // ASTRO Gaming
|
||||
};
|
||||
@@ -360,7 +361,7 @@ public class HIDDeviceManager {
|
||||
HIDDeviceUSB device = new HIDDeviceUSB(this, usbDevice, interface_index);
|
||||
int id = device.getId();
|
||||
mDevicesById.put(id, device);
|
||||
HIDDeviceConnected(id, device.getIdentifier(), device.getVendorId(), device.getProductId(), device.getSerialNumber(), device.getVersion(), device.getManufacturerName(), device.getProductName(), usbInterface.getId(), usbInterface.getInterfaceClass(), usbInterface.getInterfaceSubclass(), usbInterface.getInterfaceProtocol(), false);
|
||||
HIDDeviceConnected(id, device.getIdentifier(), device.getVendorId(), device.getProductId(), device.getSerialNumber(), device.getVersion(), device.getManufacturerName(), device.getProductName(), usbInterface.getId(), usbInterface.getInterfaceClass(), usbInterface.getInterfaceSubclass(), usbInterface.getInterfaceProtocol(), false, 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -529,7 +530,13 @@ public class HIDDeviceManager {
|
||||
return false;
|
||||
}
|
||||
|
||||
return bluetoothDevice.getName().equals("SteamController") && ((bluetoothDevice.getType() & BluetoothDevice.DEVICE_TYPE_LE) != 0);
|
||||
// Steam Controllers will always support Bluetooth Low Energy
|
||||
if ((bluetoothDevice.getType() & BluetoothDevice.DEVICE_TYPE_LE) == 0) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// Match on the name either the original Steam Controller or the new second-generation one advertise with.
|
||||
return bluetoothDevice.getName().equals("SteamController") || bluetoothDevice.getName().startsWith("Steam Ctrl");
|
||||
}
|
||||
|
||||
private void close() {
|
||||
@@ -681,7 +688,7 @@ public class HIDDeviceManager {
|
||||
private native void HIDDeviceRegisterCallback();
|
||||
private native void HIDDeviceReleaseCallback();
|
||||
|
||||
native void HIDDeviceConnected(int deviceID, String identifier, int vendorId, int productId, String serial_number, int release_number, String manufacturer_string, String product_string, int interface_number, int interface_class, int interface_subclass, int interface_protocol, boolean bBluetooth);
|
||||
native void HIDDeviceConnected(int deviceID, String identifier, int vendorId, int productId, String serial_number, int release_number, String manufacturer_string, String product_string, int interface_number, int interface_class, int interface_subclass, int interface_protocol, boolean bBluetooth, int reportID);
|
||||
native void HIDDeviceOpenPending(int deviceID);
|
||||
native void HIDDeviceOpenResult(int deviceID, boolean opened);
|
||||
native void HIDDeviceDisconnected(int deviceID);
|
||||
|
||||
@@ -21,6 +21,7 @@ class HIDDeviceUSB implements HIDDevice {
|
||||
protected InputThread mInputThread;
|
||||
protected boolean mRunning;
|
||||
protected boolean mFrozen;
|
||||
protected boolean mClaimed;
|
||||
|
||||
public HIDDeviceUSB(HIDDeviceManager manager, UsbDevice usbDevice, int interface_index) {
|
||||
mManager = manager;
|
||||
@@ -29,6 +30,7 @@ class HIDDeviceUSB implements HIDDevice {
|
||||
mInterface = mDevice.getInterface(mInterfaceIndex).getId();
|
||||
mDeviceId = manager.getDeviceIDForIdentifier(getIdentifier());
|
||||
mRunning = false;
|
||||
mClaimed = false;
|
||||
}
|
||||
|
||||
String getIdentifier() {
|
||||
@@ -114,6 +116,7 @@ class HIDDeviceUSB implements HIDDevice {
|
||||
close();
|
||||
return false;
|
||||
}
|
||||
mClaimed = true;
|
||||
|
||||
// Find the endpoints
|
||||
for (int j = 0; j < iface.getEndpointCount(); j++) {
|
||||
@@ -132,9 +135,12 @@ class HIDDeviceUSB implements HIDDevice {
|
||||
}
|
||||
}
|
||||
|
||||
// Make sure the required endpoints were present
|
||||
if (mInputEndpoint == null || mOutputEndpoint == null) {
|
||||
// Make sure the required endpoints were present. The original Steam Controller and the wireless dongle for it do NOT
|
||||
// actually have -- or require -- output endpoints, so we need to accept only an input one for them or else we'll fall
|
||||
// back to the Android system gamepad functionality (and lose our paddles et al).
|
||||
if (mInputEndpoint == null) {
|
||||
Log.w(TAG, "Missing required endpoint on USB device " + getDeviceName());
|
||||
mConnection.releaseInterface(iface);
|
||||
close();
|
||||
return false;
|
||||
}
|
||||
@@ -154,6 +160,11 @@ class HIDDeviceUSB implements HIDDevice {
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (!mClaimed) {
|
||||
Log.w(TAG, "writeReport() called but some other process currently owns the USB device");
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (feature) {
|
||||
int res = -1;
|
||||
int offset = 0;
|
||||
@@ -185,6 +196,11 @@ class HIDDeviceUSB implements HIDDevice {
|
||||
}
|
||||
return length;
|
||||
} else {
|
||||
if (mOutputEndpoint == null)
|
||||
{
|
||||
Log.e(TAG, "Tried to write an output report to an interface with no output endpoint!");
|
||||
return -1;
|
||||
}
|
||||
int res = mConnection.bulkTransfer(mOutputEndpoint, report, report.length, 1000);
|
||||
if (res != report.length) {
|
||||
Log.w(TAG, "writeOutputReport() returned " + res + " on device " + getDeviceName());
|
||||
@@ -205,6 +221,12 @@ class HIDDeviceUSB implements HIDDevice {
|
||||
Log.w(TAG, "readReport() called with no device connection");
|
||||
return false;
|
||||
}
|
||||
if (!mClaimed) {
|
||||
if (feature) {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
if (report_number == 0x0) {
|
||||
/* Offset the return buffer by 1, so that the report ID
|
||||
@@ -258,10 +280,13 @@ class HIDDeviceUSB implements HIDDevice {
|
||||
mInputThread = null;
|
||||
}
|
||||
if (mConnection != null) {
|
||||
UsbInterface iface = mDevice.getInterface(mInterfaceIndex);
|
||||
mConnection.releaseInterface(iface);
|
||||
if (mClaimed) {
|
||||
UsbInterface iface = mDevice.getInterface(mInterfaceIndex);
|
||||
mConnection.releaseInterface(iface);
|
||||
}
|
||||
mConnection.close();
|
||||
mConnection = null;
|
||||
mClaimed = false;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -274,6 +299,22 @@ class HIDDeviceUSB implements HIDDevice {
|
||||
@Override
|
||||
public void setFrozen(boolean frozen) {
|
||||
mFrozen = frozen;
|
||||
|
||||
/* If we have a valid device connection and the claim state doesn't match what we want, try to correct that. */
|
||||
if (mConnection != null && mClaimed == mFrozen) {
|
||||
UsbInterface iface = mDevice.getInterface(mInterfaceIndex);
|
||||
if (frozen) {
|
||||
mClaimed = !mConnection.releaseInterface(iface);
|
||||
if (mClaimed) {
|
||||
Log.e(TAG, "Tried to release claim on USB device, but failed!");
|
||||
}
|
||||
} else {
|
||||
mClaimed = mConnection.claimInterface(iface, true);
|
||||
if (!mClaimed) {
|
||||
Log.e(TAG, "Tried to regain claim on USB device, but failed!");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
protected class InputThread extends Thread {
|
||||
|
||||
@@ -61,7 +61,7 @@ public class SDLActivity extends Activity implements View.OnSystemUiVisibilityCh
|
||||
private static final String TAG = "SDL";
|
||||
private static final int SDL_MAJOR_VERSION = 3;
|
||||
private static final int SDL_MINOR_VERSION = 4;
|
||||
private static final int SDL_MICRO_VERSION = 8;
|
||||
private static final int SDL_MICRO_VERSION = 10;
|
||||
/*
|
||||
// Display InputType.SOURCE/CLASS of events and devices
|
||||
//
|
||||
@@ -530,7 +530,8 @@ public class SDLActivity extends Activity implements View.OnSystemUiVisibilityCh
|
||||
|
||||
if (mHIDDeviceManager != null) {
|
||||
mHIDDeviceManager.setFrozen(true);
|
||||
}
|
||||
}
|
||||
|
||||
if (!mHasMultiWindow) {
|
||||
pauseNativeThread();
|
||||
}
|
||||
@@ -543,7 +544,8 @@ public class SDLActivity extends Activity implements View.OnSystemUiVisibilityCh
|
||||
|
||||
if (mHIDDeviceManager != null) {
|
||||
mHIDDeviceManager.setFrozen(false);
|
||||
}
|
||||
}
|
||||
|
||||
if (!mHasMultiWindow) {
|
||||
resumeNativeThread();
|
||||
}
|
||||
@@ -616,6 +618,14 @@ public class SDLActivity extends Activity implements View.OnSystemUiVisibilityCh
|
||||
super.onWindowFocusChanged(hasFocus);
|
||||
Log.v(TAG, "onWindowFocusChanged(): " + hasFocus);
|
||||
|
||||
// If we are gaining focus, we can always try to restore our USB devices. If we are losing focus,
|
||||
// only try to relinquish them if we don't have background events allowed (for multi-window Android setups).
|
||||
if (hasFocus || !SDLActivity.nativeGetHintBoolean("SDL_JOYSTICK_ALLOW_BACKGROUND_EVENTS", false)) {
|
||||
if (mHIDDeviceManager != null) {
|
||||
mHIDDeviceManager.setFrozen(!hasFocus);
|
||||
}
|
||||
}
|
||||
|
||||
if (SDLActivity.mBrokenLibraries) {
|
||||
return;
|
||||
}
|
||||
@@ -1481,11 +1491,11 @@ public class SDLActivity extends Activity implements View.OnSystemUiVisibilityCh
|
||||
if (SDLControllerManager.isDeviceSDLJoystick(deviceId)) {
|
||||
// Note that we process events with specific key codes here
|
||||
if (event.getAction() == KeyEvent.ACTION_DOWN) {
|
||||
if (SDLControllerManager.onNativePadDown(deviceId, keyCode)) {
|
||||
if (SDLControllerManager.onNativePadDown(deviceId, keyCode, event.getScanCode())) {
|
||||
return true;
|
||||
}
|
||||
} else if (event.getAction() == KeyEvent.ACTION_UP) {
|
||||
if (SDLControllerManager.onNativePadUp(deviceId, keyCode)) {
|
||||
if (SDLControllerManager.onNativePadUp(deviceId, keyCode, event.getScanCode())) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
@@ -1963,7 +1973,7 @@ public class SDLActivity extends Activity implements View.OnSystemUiVisibilityCh
|
||||
Intent i = new Intent(Intent.ACTION_VIEW);
|
||||
i.setData(Uri.parse(url));
|
||||
|
||||
int flags = Intent.FLAG_ACTIVITY_NO_HISTORY
|
||||
int flags = Intent.FLAG_ACTIVITY_NO_HISTORY
|
||||
| Intent.FLAG_ACTIVITY_MULTIPLE_TASK
|
||||
| Intent.FLAG_ACTIVITY_NEW_DOCUMENT;
|
||||
i.addFlags(flags);
|
||||
@@ -2227,3 +2237,4 @@ class SDLClipboardHandler implements
|
||||
SDLActivity.onNativeClipboardChanged();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -10,6 +10,10 @@ import android.hardware.lights.Light;
|
||||
import android.hardware.lights.LightsRequest;
|
||||
import android.hardware.lights.LightsManager;
|
||||
import android.hardware.lights.LightState;
|
||||
import android.hardware.Sensor;
|
||||
import android.hardware.SensorEvent;
|
||||
import android.hardware.SensorEventListener;
|
||||
import android.hardware.SensorManager;
|
||||
import android.graphics.Color;
|
||||
import android.os.Build;
|
||||
import android.os.VibrationEffect;
|
||||
@@ -30,16 +34,18 @@ public class SDLControllerManager
|
||||
static native void nativeAddJoystick(int device_id, String name, String desc,
|
||||
int vendor_id, int product_id,
|
||||
int button_mask,
|
||||
int naxes, int axis_mask, int nhats, boolean can_rumble, boolean has_rgb_led);
|
||||
int naxes, int axis_mask, int nhats, boolean can_rumble, boolean has_rgb_led,
|
||||
boolean has_accelerometer, boolean has_gyroscope);
|
||||
static native void nativeRemoveJoystick(int device_id);
|
||||
static native void nativeAddHaptic(int device_id, String name);
|
||||
static native void nativeRemoveHaptic(int device_id);
|
||||
static public native boolean onNativePadDown(int device_id, int keycode);
|
||||
static public native boolean onNativePadUp(int device_id, int keycode);
|
||||
static public native boolean onNativePadDown(int device_id, int keycode, int scancode);
|
||||
static public native boolean onNativePadUp(int device_id, int keycode, int scancode);
|
||||
static native void onNativeJoy(int device_id, int axis,
|
||||
float value);
|
||||
static native void onNativeHat(int device_id, int hat_id,
|
||||
int x, int y);
|
||||
static native void onNativeJoySensor(int device_id, int sensor_type, long sensor_timestamp, float x, float y, float z);
|
||||
|
||||
protected static SDLJoystickHandler mJoystickHandler;
|
||||
protected static SDLHapticHandler mHapticHandler;
|
||||
@@ -81,6 +87,13 @@ public class SDLControllerManager
|
||||
mJoystickHandler.setLED(device_id, red, green, blue);
|
||||
}
|
||||
|
||||
/**
|
||||
* This method is called by SDL using JNI.
|
||||
*/
|
||||
static void joystickSetSensorsEnabled(int device_id, boolean enabled) {
|
||||
mJoystickHandler.setSensorsEnabled(device_id, enabled);
|
||||
}
|
||||
|
||||
/**
|
||||
* This method is called by SDL using JNI.
|
||||
*/
|
||||
@@ -153,6 +166,10 @@ class SDLJoystickHandler {
|
||||
ArrayList<InputDevice.MotionRange> hats;
|
||||
ArrayList<Light> lights;
|
||||
LightsManager.LightsSession lightsSession;
|
||||
SensorManager sensorManager;
|
||||
SDLJoySensorListener sensorListener;
|
||||
Sensor accelerometerSensor;
|
||||
Sensor gyroscopeSensor;
|
||||
}
|
||||
static class RangeComparator implements Comparator<InputDevice.MotionRange> {
|
||||
@Override
|
||||
@@ -225,12 +242,13 @@ class SDLJoystickHandler {
|
||||
joystick.desc = getJoystickDescriptor(joystickDevice);
|
||||
joystick.axes = new ArrayList<InputDevice.MotionRange>();
|
||||
joystick.hats = new ArrayList<InputDevice.MotionRange>();
|
||||
java.util.Set<Integer> axisStrsSet = new java.util.HashSet<Integer>();
|
||||
joystick.lights = new ArrayList<Light>();
|
||||
|
||||
List<InputDevice.MotionRange> ranges = joystickDevice.getMotionRanges();
|
||||
Collections.sort(ranges, new RangeComparator());
|
||||
for (InputDevice.MotionRange range : ranges) {
|
||||
if ((range.getSource() & InputDevice.SOURCE_CLASS_JOYSTICK) != 0) {
|
||||
if (((range.getSource() & InputDevice.SOURCE_CLASS_JOYSTICK) != 0) && axisStrsSet.add(range.getAxis())) {
|
||||
if (range.getAxis() == MotionEvent.AXIS_HAT_X || range.getAxis() == MotionEvent.AXIS_HAT_Y) {
|
||||
joystick.hats.add(range);
|
||||
} else {
|
||||
@@ -241,6 +259,8 @@ class SDLJoystickHandler {
|
||||
|
||||
boolean can_rumble = false;
|
||||
boolean has_rgb_led = false;
|
||||
boolean has_accelerometer = false;
|
||||
boolean has_gyroscope = false;
|
||||
if (Build.VERSION.SDK_INT >= 31 /* Android 12.0 (S) */) {
|
||||
VibratorManager vibratorManager = joystickDevice.getVibratorManager();
|
||||
int[] vibrators = vibratorManager.getVibratorIds();
|
||||
@@ -258,12 +278,26 @@ class SDLJoystickHandler {
|
||||
joystick.lightsSession = lightsManager.openSession();
|
||||
has_rgb_led = true;
|
||||
}
|
||||
SensorManager sensorManager = joystickDevice.getSensorManager();
|
||||
if (sensorManager != null) {
|
||||
joystick.sensorManager = sensorManager;
|
||||
joystick.sensorListener = new SDLJoySensorListener(joystick.device_id);
|
||||
joystick.accelerometerSensor = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
|
||||
if (joystick.accelerometerSensor != null) {
|
||||
has_accelerometer = true;
|
||||
}
|
||||
joystick.gyroscopeSensor = sensorManager.getDefaultSensor(Sensor.TYPE_GYROSCOPE);
|
||||
if (joystick.gyroscopeSensor != null) {
|
||||
has_gyroscope = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
mJoysticks.add(joystick);
|
||||
SDLControllerManager.nativeAddJoystick(joystick.device_id, joystick.name, joystick.desc,
|
||||
getVendorId(joystickDevice), getProductId(joystickDevice),
|
||||
getButtonMask(joystickDevice), joystick.axes.size(), getAxisMask(joystick.axes), joystick.hats.size()/2, can_rumble, has_rgb_led);
|
||||
getButtonMask(joystickDevice), joystick.axes.size(), getAxisMask(joystick.axes), joystick.hats.size()/2, can_rumble, has_rgb_led,
|
||||
has_accelerometer, has_gyroscope);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -508,6 +542,31 @@ class SDLJoystickHandler {
|
||||
}
|
||||
joystick.lightsSession.requestLights(lightsRequest.build());
|
||||
}
|
||||
|
||||
void setSensorsEnabled(int device_id, boolean enabled) {
|
||||
if (Build.VERSION.SDK_INT < 31 /* Android 12.0 (S) */) {
|
||||
return;
|
||||
}
|
||||
SDLJoystick joystick = getJoystick(device_id);
|
||||
if (joystick == null || joystick.sensorManager == null) {
|
||||
return;
|
||||
}
|
||||
if (enabled) {
|
||||
if (joystick.accelerometerSensor != null) {
|
||||
SDLSensorManager.registerListener(joystick.sensorManager, joystick.sensorListener, joystick.accelerometerSensor, SensorManager.SENSOR_DELAY_GAME);
|
||||
}
|
||||
if (joystick.gyroscopeSensor != null) {
|
||||
SDLSensorManager.registerListener(joystick.sensorManager, joystick.sensorListener, joystick.gyroscopeSensor, SensorManager.SENSOR_DELAY_GAME);
|
||||
}
|
||||
} else {
|
||||
if (joystick.accelerometerSensor != null) {
|
||||
SDLSensorManager.unregisterListener(joystick.sensorManager, joystick.sensorListener, joystick.accelerometerSensor);
|
||||
}
|
||||
if (joystick.gyroscopeSensor != null) {
|
||||
SDLSensorManager.unregisterListener(joystick.sensorManager, joystick.sensorListener, joystick.gyroscopeSensor);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
class SDLHapticHandler_API31 extends SDLHapticHandler {
|
||||
@@ -933,3 +992,19 @@ class SDLGenericMotionListener_API29 extends SDLGenericMotionListener_API26 {
|
||||
return penDevice.isExternal() ? SDL_PEN_DEVICE_TYPE_INDIRECT : SDL_PEN_DEVICE_TYPE_DIRECT;
|
||||
}
|
||||
}
|
||||
|
||||
class SDLJoySensorListener implements SensorEventListener {
|
||||
int device_id;
|
||||
|
||||
public SDLJoySensorListener(int device_id) {
|
||||
this.device_id = device_id;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onAccuracyChanged(Sensor sensor, int accuracy) {}
|
||||
|
||||
@Override
|
||||
public void onSensorChanged(SensorEvent event) {
|
||||
SDLControllerManager.onNativeJoySensor(device_id, event.sensor.getType(), event.timestamp, event.values[0], event.values[1], event.values[2]);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,32 @@
|
||||
package org.libsdl.app;
|
||||
|
||||
import android.hardware.Sensor;
|
||||
import android.hardware.SensorEventListener;
|
||||
import android.hardware.SensorManager;
|
||||
|
||||
// This class coordinates synchronized access to sensor manager registration
|
||||
//
|
||||
// This prevents a java.util.ConcurrentModificationException exception on
|
||||
// Android 16, specifically on the Samsung Tab S9 Ultra.
|
||||
|
||||
class SDLSensorManager
|
||||
{
|
||||
static private SDLSensorManager mManager = new SDLSensorManager();
|
||||
|
||||
public static void registerListener(SensorManager manager, SensorEventListener listener, Sensor sensor, int samplingPeriodUs) {
|
||||
mManager.RegisterListener(manager, listener, sensor, samplingPeriodUs);
|
||||
}
|
||||
|
||||
public static void unregisterListener(SensorManager manager, SensorEventListener listener, Sensor sensor) {
|
||||
mManager.UnregisterListener(manager, listener, sensor);
|
||||
}
|
||||
|
||||
private synchronized void RegisterListener(SensorManager manager, SensorEventListener listener, Sensor sensor, int samplingPeriodUs) {
|
||||
manager.registerListener(listener, sensor, samplingPeriodUs, null);
|
||||
}
|
||||
|
||||
private synchronized void UnregisterListener(SensorManager manager, SensorEventListener listener, Sensor sensor) {
|
||||
manager.unregisterListener(listener, sensor);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -47,6 +47,9 @@ public class SDLSurface extends SurfaceView implements SurfaceHolder.Callback,
|
||||
// Is SurfaceView ready for rendering
|
||||
protected boolean mIsSurfaceReady;
|
||||
|
||||
// Is on-screen keyboard visible
|
||||
protected boolean mKeyboardVisible;
|
||||
|
||||
// Pinch events
|
||||
private final ScaleGestureDetector scaleGestureDetector;
|
||||
|
||||
@@ -213,6 +216,18 @@ public class SDLSurface extends SurfaceView implements SurfaceHolder.Callback,
|
||||
WindowInsets.Type.displayCutout());
|
||||
|
||||
SDLActivity.onNativeInsetsChanged(combined.left, combined.right, combined.top, combined.bottom);
|
||||
|
||||
if (insets.isVisible(WindowInsets.Type.ime())) {
|
||||
if (!mKeyboardVisible) {
|
||||
mKeyboardVisible = true;
|
||||
SDLActivity.onNativeScreenKeyboardShown();
|
||||
}
|
||||
} else {
|
||||
if (mKeyboardVisible) {
|
||||
mKeyboardVisible = false;
|
||||
SDLActivity.onNativeScreenKeyboardHidden();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Pass these to any child views in case they need them
|
||||
@@ -318,11 +333,11 @@ public class SDLSurface extends SurfaceView implements SurfaceHolder.Callback,
|
||||
protected void enableSensor(int sensortype, boolean enabled) {
|
||||
// TODO: This uses getDefaultSensor - what if we have >1 accels?
|
||||
if (enabled) {
|
||||
mSensorManager.registerListener(this,
|
||||
SDLSensorManager.registerListener(mSensorManager, this,
|
||||
mSensorManager.getDefaultSensor(sensortype),
|
||||
SensorManager.SENSOR_DELAY_GAME, null);
|
||||
SensorManager.SENSOR_DELAY_GAME);
|
||||
} else {
|
||||
mSensorManager.unregisterListener(this,
|
||||
SDLSensorManager.unregisterListener(mSensorManager, this,
|
||||
mSensorManager.getDefaultSensor(sensortype));
|
||||
}
|
||||
}
|
||||
|
||||
+53
-3
@@ -16,11 +16,12 @@ body {
|
||||
flex-direction: column;
|
||||
justify-content: flex-end;
|
||||
align-items: stretch;
|
||||
z-index: 1;
|
||||
z-index: 2;
|
||||
pointer-events: none;
|
||||
}
|
||||
|
||||
fps,
|
||||
pipeline-progress,
|
||||
toast {
|
||||
position: absolute;
|
||||
border: 1dp #92875B;
|
||||
@@ -98,7 +99,7 @@ toast message row.muted {
|
||||
opacity: 0.5;
|
||||
}
|
||||
|
||||
toast progress {
|
||||
progress {
|
||||
height: 4dp;
|
||||
position: absolute;
|
||||
left: 0;
|
||||
@@ -106,10 +107,50 @@ toast progress {
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
toast progress fill {
|
||||
progress fill {
|
||||
background-color: rgba(194, 164, 45, 80%);
|
||||
}
|
||||
|
||||
pipeline-progress {
|
||||
left: 12dp;
|
||||
bottom: 12dp;
|
||||
display: flex;
|
||||
flex-flow: column;
|
||||
z-index: 100;
|
||||
min-width: 260dp;
|
||||
max-width: 90%;
|
||||
padding: 10dp 16dp 12dp;
|
||||
border-radius: 7dp;
|
||||
overflow: hidden;
|
||||
filter: opacity(0);
|
||||
transition: filter 0.2s linear-in-out;
|
||||
pointer-events: none;
|
||||
}
|
||||
|
||||
pipeline-progress[open] {
|
||||
filter: opacity(1);
|
||||
}
|
||||
|
||||
pipeline-status {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 8dp;
|
||||
font-size: 18dp;
|
||||
font-weight: normal;
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
icon.pipeline-spinner {
|
||||
width: 1.2em;
|
||||
height: 1.2em;
|
||||
line-height: 1.2em;
|
||||
font-size: 1.2em;
|
||||
color: #C2A42D;
|
||||
text-align: center;
|
||||
transform-origin: center;
|
||||
animation: 1s linear infinite pipeline-spinner-spin;
|
||||
}
|
||||
|
||||
toast.achievement {
|
||||
border: 1dp #C2A42D;
|
||||
}
|
||||
@@ -310,6 +351,15 @@ logo img.outer {
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes pipeline-spinner-spin {
|
||||
from {
|
||||
transform: rotate(0deg);
|
||||
}
|
||||
to {
|
||||
transform: rotate(360deg);
|
||||
}
|
||||
}
|
||||
|
||||
@media (max-height: 640dp) {
|
||||
toast {
|
||||
top: 20dp;
|
||||
|
||||
@@ -0,0 +1,339 @@
|
||||
*, *:before, *:after {
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
body {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
overflow: hidden;
|
||||
font-family: "Fira Sans Condensed";
|
||||
font-weight: bold;
|
||||
color: rgba(248, 244, 232, 90%);
|
||||
z-index: 1;
|
||||
filter: opacity(0);
|
||||
transition: filter 0.2s linear-in-out;
|
||||
}
|
||||
|
||||
body[open] {
|
||||
filter: opacity(1);
|
||||
}
|
||||
|
||||
body:not([open]) {
|
||||
pointer-events: none;
|
||||
}
|
||||
|
||||
button {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
decorator: none;
|
||||
padding: 0;
|
||||
border: 1dp rgba(255, 255, 255, 22%);
|
||||
background-color: rgba(22, 24, 28, 48%);
|
||||
color: rgba(248, 244, 232, 90%);
|
||||
text-align: center;
|
||||
/* backdrop-filter: blur(7dp); */
|
||||
/* box-shadow: 0 6dp 18dp rgba(0, 0, 0, 28%); */
|
||||
transform-origin: center;
|
||||
transition: background-color border-color filter transform 0.08s linear-in-out,
|
||||
opacity 0.2s linear-in-out;
|
||||
}
|
||||
|
||||
button.pressed,
|
||||
button.active {
|
||||
background-color: rgba(63, 78, 90, 68%);
|
||||
border-color: rgba(255, 255, 255, 48%);
|
||||
filter: brightness(1.18);
|
||||
}
|
||||
|
||||
button:hidden {
|
||||
opacity: 0;
|
||||
pointer-events: none;
|
||||
}
|
||||
|
||||
button span {
|
||||
display: block;
|
||||
line-height: 1;
|
||||
}
|
||||
|
||||
button icon {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
button icon glyph {
|
||||
display: block;
|
||||
font-family: "Material Symbols Rounded";
|
||||
font-weight: normal;
|
||||
font-size: 24dp;
|
||||
line-height: 1;
|
||||
}
|
||||
|
||||
.midna-icon,
|
||||
.item-icon,
|
||||
.item-count,
|
||||
.oil-meter {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.midna-icon.visible,
|
||||
.item-icon.visible,
|
||||
.item-count.visible,
|
||||
.oil-meter.visible {
|
||||
display: block;
|
||||
}
|
||||
|
||||
.control {
|
||||
position: absolute;
|
||||
}
|
||||
|
||||
.trigger-l.active {
|
||||
background-color: rgba(57, 116, 133, 74%);
|
||||
border-color: rgba(128, 222, 234, 72%);
|
||||
}
|
||||
|
||||
.trigger,
|
||||
.skip {
|
||||
border-radius: 23dp;
|
||||
}
|
||||
|
||||
.trigger {
|
||||
font-size: 22dp;
|
||||
}
|
||||
|
||||
.button-z {
|
||||
background-color: rgba(118, 79, 158, 58%);
|
||||
border-color: rgba(203, 170, 255, 36%);
|
||||
}
|
||||
|
||||
.midna-icon {
|
||||
position: absolute;
|
||||
left: 9dp;
|
||||
top: -1dp;
|
||||
height: 48dp;
|
||||
}
|
||||
|
||||
.button-z.has-icon span,
|
||||
.face.has-item span {
|
||||
position: absolute;
|
||||
font-size: 13dp;
|
||||
line-height: 1;
|
||||
}
|
||||
|
||||
.button-z.has-icon span {
|
||||
right: 9dp;
|
||||
bottom: 7dp;
|
||||
}
|
||||
|
||||
.button-z.pressed {
|
||||
background-color: rgba(139, 91, 187, 82%);
|
||||
border-color: rgba(220, 194, 255, 70%);
|
||||
}
|
||||
|
||||
action-bar {
|
||||
position: absolute;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
border: 1dp rgba(255, 255, 255, 22%);
|
||||
border-radius: 23dp;
|
||||
background-color: rgba(22, 24, 28, 48%);
|
||||
/* backdrop-filter: blur(7dp); */
|
||||
/* box-shadow: 0 -6dp 18dp rgba(0, 0, 0, 28%); */
|
||||
overflow: hidden;
|
||||
opacity: 1;
|
||||
transform-origin: center;
|
||||
transition: opacity 0.2s linear-in-out;
|
||||
}
|
||||
|
||||
action-bar:hidden,
|
||||
action-bar:hidden button,
|
||||
action-bar:hidden separator {
|
||||
opacity: 0;
|
||||
pointer-events: none;
|
||||
}
|
||||
|
||||
.utility {
|
||||
position: relative;
|
||||
flex: 1 1 auto;
|
||||
width: 56dp;
|
||||
height: 44dp;
|
||||
margin: 0;
|
||||
border-width: 0dp;
|
||||
border-radius: 0;
|
||||
background-color: transparent;
|
||||
box-shadow: none;
|
||||
}
|
||||
|
||||
.utility,
|
||||
.skip {
|
||||
opacity: 0.55;
|
||||
}
|
||||
|
||||
.utility.pressed {
|
||||
background-color: rgba(63, 78, 90, 68%);
|
||||
}
|
||||
|
||||
.utility.pressed,
|
||||
.skip.pressed {
|
||||
opacity: 1;
|
||||
}
|
||||
|
||||
.skip {
|
||||
z-index: 1;
|
||||
border-color: rgba(255, 255, 255, 36%);
|
||||
}
|
||||
|
||||
separator {
|
||||
display: block;
|
||||
flex: 0 0 1dp;
|
||||
width: 1dp;
|
||||
height: 24dp;
|
||||
background-color: rgba(255, 255, 255, 18%);
|
||||
opacity: 1;
|
||||
transition: opacity 0.2s linear-in-out;
|
||||
}
|
||||
|
||||
.face {
|
||||
position: absolute;
|
||||
border-radius: 29dp;
|
||||
font-size: 24dp;
|
||||
overflow: visible;
|
||||
}
|
||||
|
||||
.item-icon {
|
||||
width: auto;
|
||||
height: auto;
|
||||
max-width: 76%;
|
||||
max-height: 76%;
|
||||
}
|
||||
|
||||
.item-count {
|
||||
position: absolute;
|
||||
left: 6dp;
|
||||
bottom: 5dp;
|
||||
min-width: 17dp;
|
||||
height: 15dp;
|
||||
padding: 1dp 3dp;
|
||||
border-radius: 7dp;
|
||||
background-color: rgba(0, 0, 0, 52%);
|
||||
color: rgba(255, 255, 255, 92%);
|
||||
font-size: 12dp;
|
||||
line-height: 13dp;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.oil-meter {
|
||||
position: absolute;
|
||||
left: 12dp;
|
||||
bottom: -5dp;
|
||||
width: 34dp;
|
||||
height: 8dp;
|
||||
padding: 2dp;
|
||||
border: 1dp rgba(42, 32, 18, 82%);
|
||||
border-radius: 4dp;
|
||||
background-color: rgba(18, 14, 10, 70%);
|
||||
/* box-shadow: 0 2dp 6dp rgba(0, 0, 0, 35%); */
|
||||
}
|
||||
|
||||
oil-fill {
|
||||
display: block;
|
||||
width: 0%;
|
||||
height: 100%;
|
||||
border-radius: 2dp;
|
||||
background-color: rgb(255, 232, 74);
|
||||
}
|
||||
|
||||
.face.has-item span {
|
||||
right: 6dp;
|
||||
bottom: 6dp;
|
||||
color: rgba(255, 255, 255, 88%);
|
||||
}
|
||||
|
||||
.face.a {
|
||||
border-radius: 37dp;
|
||||
font-size: 31dp;
|
||||
background-color: rgba(34, 112, 123, 62%);
|
||||
}
|
||||
|
||||
.face.b {
|
||||
background-color: rgba(161, 61, 66, 58%);
|
||||
}
|
||||
|
||||
.face.x {
|
||||
background-color: rgba(83, 115, 151, 56%);
|
||||
}
|
||||
|
||||
.face.y {
|
||||
background-color: rgba(113, 91, 150, 54%);
|
||||
}
|
||||
|
||||
button.control.docked-top,
|
||||
action-bar.docked-top {
|
||||
border-top-width: 0dp;
|
||||
border-top-left-radius: 0dp;
|
||||
border-top-right-radius: 0dp;
|
||||
}
|
||||
|
||||
button.control.docked-bottom,
|
||||
action-bar.docked-bottom {
|
||||
border-bottom-width: 0dp;
|
||||
border-bottom-left-radius: 0dp;
|
||||
border-bottom-right-radius: 0dp;
|
||||
}
|
||||
|
||||
button.control.docked-left,
|
||||
action-bar.docked-left {
|
||||
border-left-width: 0dp;
|
||||
border-top-left-radius: 0dp;
|
||||
border-bottom-left-radius: 0dp;
|
||||
}
|
||||
|
||||
button.control.docked-right,
|
||||
action-bar.docked-right {
|
||||
border-right-width: 0dp;
|
||||
border-top-right-radius: 0dp;
|
||||
border-bottom-right-radius: 0dp;
|
||||
}
|
||||
|
||||
touch-stick {
|
||||
display: block;
|
||||
position: absolute;
|
||||
width: 124dp;
|
||||
height: 124dp;
|
||||
border-radius: 62dp;
|
||||
background-color: rgba(18, 20, 24, 35%);
|
||||
border: 1dp rgba(255, 255, 255, 20%);
|
||||
/* backdrop-filter: blur(7dp); */
|
||||
/* box-shadow: 0 8dp 24dp rgba(0, 0, 0, 24%); */
|
||||
opacity: 0;
|
||||
pointer-events: none;
|
||||
transition: opacity 0.18s linear-in-out;
|
||||
}
|
||||
|
||||
touch-stick.active {
|
||||
opacity: 1;
|
||||
}
|
||||
|
||||
stick-ring {
|
||||
position: absolute;
|
||||
left: 18dp;
|
||||
top: 18dp;
|
||||
width: 88dp;
|
||||
height: 88dp;
|
||||
border-radius: 44dp;
|
||||
border: 1dp rgba(255, 255, 255, 18%);
|
||||
}
|
||||
|
||||
stick-knob {
|
||||
position: absolute;
|
||||
width: 48dp;
|
||||
height: 48dp;
|
||||
border-radius: 24dp;
|
||||
background-color: rgba(238, 236, 226, 55%);
|
||||
border: 1dp rgba(255, 255, 255, 45%);
|
||||
}
|
||||
@@ -0,0 +1,138 @@
|
||||
body.touch-editor {
|
||||
background-color: rgba(4, 6, 8, 34%);
|
||||
z-index: 8;
|
||||
}
|
||||
|
||||
body.touch-editor .control,
|
||||
body.touch-editor action-bar {
|
||||
opacity: 0.88;
|
||||
cursor: move;
|
||||
pointer-events: auto;
|
||||
}
|
||||
|
||||
body.touch-editor .control:hover,
|
||||
body.touch-editor action-bar:hover,
|
||||
body.touch-editor .control.editor-selected,
|
||||
body.touch-editor action-bar.editor-selected {
|
||||
border-color: rgba(255, 232, 128, 80%);
|
||||
filter: brightness(1.15);
|
||||
}
|
||||
|
||||
body.touch-editor action-bar button,
|
||||
body.touch-editor action-bar separator {
|
||||
pointer-events: none;
|
||||
}
|
||||
|
||||
selection-frame {
|
||||
display: none;
|
||||
position: absolute;
|
||||
z-index: 20;
|
||||
border: 2dp rgba(255, 232, 128, 88%);
|
||||
background-color: rgba(255, 232, 128, 7%);
|
||||
pointer-events: none;
|
||||
}
|
||||
|
||||
selection-frame.visible {
|
||||
display: block;
|
||||
}
|
||||
|
||||
resize-handle {
|
||||
display: block;
|
||||
position: absolute;
|
||||
width: 22dp;
|
||||
height: 22dp;
|
||||
border: 2dp rgba(255, 244, 190, 96%);
|
||||
border-radius: 11dp;
|
||||
background-color: rgba(34, 37, 42, 86%);
|
||||
pointer-events: auto;
|
||||
}
|
||||
|
||||
resize-handle.left {
|
||||
left: -12dp;
|
||||
}
|
||||
|
||||
resize-handle.right {
|
||||
right: -12dp;
|
||||
}
|
||||
|
||||
resize-handle.top {
|
||||
top: -12dp;
|
||||
}
|
||||
|
||||
resize-handle.bottom {
|
||||
bottom: -12dp;
|
||||
}
|
||||
|
||||
resize-handle.horizontal {
|
||||
top: 50%;
|
||||
margin-top: -11dp;
|
||||
}
|
||||
|
||||
resize-handle.vertical {
|
||||
left: 50%;
|
||||
margin-left: -11dp;
|
||||
}
|
||||
|
||||
resize-handle.corner.left {
|
||||
left: -12dp;
|
||||
}
|
||||
|
||||
resize-handle.corner.right {
|
||||
right: -12dp;
|
||||
}
|
||||
|
||||
resize-handle.corner.top {
|
||||
top: -12dp;
|
||||
}
|
||||
|
||||
resize-handle.corner.bottom {
|
||||
bottom: -12dp;
|
||||
}
|
||||
|
||||
editor-toolbar {
|
||||
display: flex;
|
||||
position: absolute;
|
||||
left: 24dp;
|
||||
right: 24dp;
|
||||
top: 50%;
|
||||
z-index: 30;
|
||||
height: 48dp;
|
||||
margin-top: -24dp;
|
||||
gap: 8dp;
|
||||
justify-content: center;
|
||||
pointer-events: auto;
|
||||
}
|
||||
|
||||
editor-toolbar button.editor-command {
|
||||
flex: 0 1 150dp;
|
||||
min-width: 96dp;
|
||||
height: 48dp;
|
||||
padding: 0 14dp;
|
||||
border-radius: 8dp;
|
||||
border: 1dp rgba(255, 255, 255, 26%);
|
||||
background-color: rgba(17, 19, 24, 88%);
|
||||
color: rgba(255, 250, 232, 94%);
|
||||
font-family: "Fira Sans";
|
||||
font-size: 18dp;
|
||||
line-height: 48dp;
|
||||
opacity: 1;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
editor-toolbar button.editor-command span {
|
||||
display: block;
|
||||
width: 100%;
|
||||
line-height: 48dp;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
editor-toolbar button.editor-command.primary {
|
||||
border-color: rgba(255, 232, 128, 70%);
|
||||
background-color: rgba(96, 82, 38, 90%);
|
||||
}
|
||||
|
||||
editor-toolbar button.editor-command:hover,
|
||||
editor-toolbar button.editor-command:focus-visible {
|
||||
border-color: rgba(255, 244, 190, 92%);
|
||||
background-color: rgba(78, 85, 96, 92%);
|
||||
}
|
||||
@@ -105,6 +105,18 @@ window content pane > * {
|
||||
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 {
|
||||
line-height: 1.625;
|
||||
}
|
||||
@@ -478,6 +490,7 @@ window.modal.danger .modal-header icon {
|
||||
font-size: 20dp;
|
||||
color: #FFFFFF;
|
||||
font-weight: normal;
|
||||
word-break: break-word;
|
||||
}
|
||||
|
||||
.modal-body span.tip {
|
||||
@@ -519,3 +532,15 @@ progress.verification-progress-bar {
|
||||
flex: 0 0 auto;
|
||||
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;
|
||||
}
|
||||
@@ -1230,7 +1230,8 @@ void Z2SceneMgr::setSceneName(char* spot, s32 room, s32 layer) {
|
||||
bgm_id = Z2BGM_DUNGEON_FOREST;
|
||||
bgm_wave1 = 0xa;
|
||||
/* 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;
|
||||
} else {
|
||||
bgm_wave1 = 0xc;
|
||||
@@ -1290,11 +1291,13 @@ void Z2SceneMgr::setSceneName(char* spot, s32 room, s32 layer) {
|
||||
break;
|
||||
case Z2SCENE_LAKEBED_TEMPLE_BOSS:
|
||||
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_wave1 = 0x15;
|
||||
/* 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;
|
||||
} else {
|
||||
bgm_wave1 = 0x1e;
|
||||
@@ -1324,11 +1327,11 @@ void Z2SceneMgr::setSceneName(char* spot, s32 room, s32 layer) {
|
||||
break;
|
||||
case Z2SCENE_ARBITERS_GROUNDS_BOSS:
|
||||
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_wave1 = 0x1a;
|
||||
/* 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;
|
||||
} else {
|
||||
bgm_wave1 = 0x4c;
|
||||
@@ -1389,11 +1392,11 @@ void Z2SceneMgr::setSceneName(char* spot, s32 room, s32 layer) {
|
||||
break;
|
||||
case Z2SCENE_TEMPLE_OF_TIME_BOSS:
|
||||
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_wave1 = 0x26;
|
||||
/* 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;
|
||||
} else {
|
||||
bgm_wave1 = 0x4e;
|
||||
|
||||
@@ -58,6 +58,10 @@
|
||||
#include "res/Object/Alink.h"
|
||||
#include <cstring>
|
||||
#include <dusk/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
|
||||
|
||||
static int daAlink_Create(fopAc_ac_c* i_this);
|
||||
@@ -4231,6 +4235,25 @@ int daAlink_c::createHeap() {
|
||||
if (mpHIO == NULL) {
|
||||
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))) {
|
||||
return 0;
|
||||
@@ -10573,9 +10596,16 @@ void daAlink_c::decideDoStatus() {
|
||||
(actor_name == fpcNm_TAG_KMSG_e &&
|
||||
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);
|
||||
}
|
||||
#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) &&
|
||||
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) {
|
||||
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()) {
|
||||
return i_actor;
|
||||
}
|
||||
@@ -12263,6 +12301,14 @@ BOOL daAlink_c::checkGroundSpecialMode() {
|
||||
if (mLinkAcch.ChkGroundHit() && !checkModeFlg(MODE_PLAYER_FLY) && !checkMagneBootsOn() &&
|
||||
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();
|
||||
}
|
||||
|
||||
|
||||
@@ -1624,7 +1624,7 @@ const daAlinkHIO_bomb_c1 daAlinkHIO_bomb_c0::m = {
|
||||
|
||||
#pragma push
|
||||
#pragma force_active on
|
||||
const daAlinkHIO_huLight_c1 daAlinkHIO_huLight_c0::m = {
|
||||
IF_NOT_DUSK(const) daAlinkHIO_huLight_c1 daAlinkHIO_huLight_c0::m = {
|
||||
0,
|
||||
3,
|
||||
0,
|
||||
@@ -1638,8 +1638,25 @@ const daAlinkHIO_huLight_c1 daAlinkHIO_huLight_c0::m = {
|
||||
0.0f,
|
||||
};
|
||||
#pragma pop
|
||||
#if TARGET_PC
|
||||
// Save original lantern colors incase player reverts to default
|
||||
const daAlinkHIO_huLight_c1 daAlinkHIO_huLight_c0::original = {
|
||||
0,
|
||||
3,
|
||||
0,
|
||||
181,
|
||||
112,
|
||||
40,
|
||||
-70,
|
||||
1.0f,
|
||||
50.0f,
|
||||
350.0f,
|
||||
0.0f,
|
||||
};
|
||||
#endif
|
||||
|
||||
const daAlinkHIO_kandelaar_c1 daAlinkHIO_kandelaar_c0::m = {
|
||||
|
||||
IF_NOT_DUSK(const) daAlinkHIO_kandelaar_c1 daAlinkHIO_kandelaar_c0::m = {
|
||||
{
|
||||
30,
|
||||
1.1f,
|
||||
@@ -1672,6 +1689,42 @@ const daAlinkHIO_kandelaar_c1 daAlinkHIO_kandelaar_c0::m = {
|
||||
0.5f,
|
||||
};
|
||||
|
||||
#if TARGET_PC
|
||||
// Save original lantern colors incase player reverts to default
|
||||
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
|
||||
|
||||
const daAlinkHIO_fmChain_c1 daAlinkHIO_fmChain_c0::m = {
|
||||
{
|
||||
20,
|
||||
|
||||
@@ -23,9 +23,14 @@
|
||||
#include "d/actor/d_a_npc_tkc.h"
|
||||
#include <cstring>
|
||||
|
||||
#include "dusk/archipelago/archipelago_context.hpp"
|
||||
|
||||
#if TARGET_PC
|
||||
#include "dusk/imgui/ImGuiConsole.hpp"
|
||||
#include "dusk/settings.h"
|
||||
#include "dusk/speedrun.h"
|
||||
#include "dusk/randomizer/game/randomizer_context.hpp"
|
||||
#endif
|
||||
|
||||
BOOL daAlink_c::checkEventRun() const {
|
||||
return dComIfGp_event_runCheck() || checkPlayerDemoMode();
|
||||
@@ -1023,13 +1028,26 @@ void daAlink_c::setGetItemFace(u16 i_itemNo) {
|
||||
|| i_itemNo == dItemNo_ANCIENT_DOCUMENT2_e
|
||||
|| i_itemNo == dItemNo_DROP_CONTAINER_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)
|
||||
{
|
||||
setFaceBasicBck(dRes_ID_ALANM_BCK_FI_e);
|
||||
} else if (i_itemNo == dItemNo_DUNGEON_EXIT_e || i_itemNo == dItemNo_LV7_DUNGEON_EXIT_e) {
|
||||
setFaceBasicTexture(FTANM_K_A);
|
||||
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) {
|
||||
#endif
|
||||
setFaceBasicBck(dRes_ID_ALANM_BCK_FJ_e);
|
||||
}
|
||||
}
|
||||
@@ -2216,18 +2234,283 @@ void daAlink_c::setGetSubBgm(int i_itemNo) {
|
||||
/* 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] = {
|
||||
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,
|
||||
};
|
||||
|
||||
#if TARGET_PC
|
||||
u32 se_type = randomizer_IsActive() ? getSeTypeRandomizer[i_itemNo] : getSeType[i_itemNo];
|
||||
#else
|
||||
u32 se_type = getSeType[i_itemNo];
|
||||
#endif
|
||||
|
||||
if (se_type == SETYPE_ITEM_GET_ME && mProcVar4.field_0x3010 == 0) {
|
||||
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]);
|
||||
dComIfGp_setMesgBgmOn();
|
||||
}
|
||||
@@ -2259,6 +2542,15 @@ int daAlink_c::procCoGetItemInit() {
|
||||
s16 var_r22 = 0;
|
||||
BOOL var_r31 = 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 ||
|
||||
(mProcID == PROC_PREACTION_UNEQUIP && !checkNoUpperAnime()))
|
||||
{
|
||||
@@ -2296,6 +2588,11 @@ int daAlink_c::procCoGetItemInit() {
|
||||
} else {
|
||||
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,
|
||||
fopAcM_GetRoomNo(this), NULL, NULL);
|
||||
@@ -2523,8 +2820,10 @@ int daAlink_c::procCoGetItem() {
|
||||
} else if (mProcVar2.field_0x300c == 0x23 && checkStageName("D_MN11")) {
|
||||
field_0x32cc = 0x5C0;
|
||||
} 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;
|
||||
// Rando gives poe soul after the text, so it'll never hit this
|
||||
} else if (dComIfGs_getPohSpiritNum() == 60) {
|
||||
field_0x32cc = 0x4D0;
|
||||
} else {
|
||||
@@ -3005,6 +3304,15 @@ int daAlink_c::procCoDeadInit(int param_0) {
|
||||
field_0x3080 = 0;
|
||||
mProcVar5.field_0x3012 = 0x3F;
|
||||
field_0x3198 = -1;
|
||||
|
||||
#if TARGET_PC
|
||||
// trigger archipelago death link if applicable
|
||||
if (dusk::archi::ArchipelagoContext::IsConnected()) {
|
||||
dusk::archi::ArchipelagoContext::TryHandleDeathLink();
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
@@ -4014,6 +4322,10 @@ int daAlink_c::procGanonFinishInit() {
|
||||
dusk::m_speedrunInfo.stopRun();
|
||||
}
|
||||
}
|
||||
|
||||
if (dusk::archi::ArchipelagoContext::IsConnected()) {
|
||||
dusk::archi::ArchipelagoContext::TryHandleGameComplete();
|
||||
}
|
||||
#endif
|
||||
|
||||
return 1;
|
||||
@@ -4548,6 +4860,13 @@ int daAlink_c::procCoWarpInit(int param_0, int param_1) {
|
||||
(checkItemGet(dItemNo_DUNGEON_BACK_e, 1) &&
|
||||
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_resetLastWarpAcceptStage();
|
||||
}
|
||||
|
||||
@@ -175,3 +175,13 @@ bool daAlink_c::checkAimContext() {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
bool daAlink_c::checkAimInputContext() {
|
||||
switch (mProcID) {
|
||||
case PROC_HOOKSHOT_ROOF_WAIT:
|
||||
case PROC_HOOKSHOT_WALL_WAIT:
|
||||
return false;
|
||||
default:
|
||||
return checkAimContext();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1191,6 +1191,19 @@ void daAlink_c::setLightningSwordEffect() {
|
||||
emitter = setEmitter(&field_0x327c[i], effName[i], ¤t.pos, &shape_angle);
|
||||
if (emitter != NULL) {
|
||||
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 {
|
||||
|
||||
@@ -14,6 +14,7 @@
|
||||
#include "dusk/action_bindings.h"
|
||||
#include "dusk/gyro.h"
|
||||
#include "dusk/mouse.h"
|
||||
#include "dusk/touch_camera.h"
|
||||
#endif
|
||||
|
||||
bool daAlink_c::checkNoSubjectModeCamera() {
|
||||
@@ -122,7 +123,7 @@ BOOL daAlink_c::setBodyAngleToCamera() {
|
||||
}
|
||||
|
||||
#if TARGET_PC
|
||||
if (dusk::getSettings().game.enableMouseAim && checkAimContext()) {
|
||||
if (dusk::getSettings().game.enableMouseAim && checkAimInputContext()) {
|
||||
sp8 = mBodyAngle.x;
|
||||
} else
|
||||
#endif
|
||||
@@ -141,7 +142,7 @@ BOOL daAlink_c::setBodyAngleToCamera() {
|
||||
#if TARGET_PC
|
||||
if ((dusk::getSettings().game.enableGyroAim ||
|
||||
dusk::getSettings().game.enableMouseAim) &&
|
||||
checkAimContext())
|
||||
checkAimInputContext())
|
||||
{
|
||||
f32 gyro_scale = 1.0f;
|
||||
if (checkWolfEyeUp()) {
|
||||
@@ -172,6 +173,32 @@ BOOL daAlink_c::setBodyAngleToCamera() {
|
||||
sp8 = mBodyAngle.x;
|
||||
}
|
||||
}
|
||||
|
||||
if (dusk::getSettings().game.enableTouchControls && checkAimInputContext()) {
|
||||
f32 touchYawDp = 0.0f;
|
||||
f32 touchPitchDp = 0.0f;
|
||||
if (dusk::touch_camera::consume_delta(touchYawDp, touchPitchDp)) {
|
||||
f32 scale = 1.0f;
|
||||
if (checkWolfEyeUp()) {
|
||||
scale *= 0.6f;
|
||||
}
|
||||
if (dComIfGp_checkPlayerStatus0(0, 0x200000)) {
|
||||
scale /= dComIfGp_getCameraZoomScale(field_0x317c);
|
||||
}
|
||||
|
||||
const f32 yawDeg = -touchYawDp * dusk::touch_camera::YAW_DEGREES_PER_DP * scale *
|
||||
dusk::getSettings().game.touchCameraXSensitivity;
|
||||
const f32 pitchDeg = touchPitchDp * dusk::touch_camera::PITCH_DEGREES_PER_DP *
|
||||
scale * dusk::getSettings().game.touchCameraYSensitivity;
|
||||
|
||||
shape_angle.y = shape_angle.y + cM_deg2s(yawDeg);
|
||||
sp8 = sp8 + cM_deg2s(pitchDeg);
|
||||
|
||||
if (checkNotItemSinkLimit() && sp8 > 0 && sp8 > mBodyAngle.x) {
|
||||
sp8 = mBodyAngle.x;
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
if (checkNotItemSinkLimit() && sp8 > 0) {
|
||||
|
||||
@@ -18,6 +18,10 @@
|
||||
#include "c/c_damagereaction.h"
|
||||
#include <cmath>
|
||||
|
||||
#if TARGET_PC
|
||||
#include "dusk/randomizer/game/tools.h"
|
||||
#endif
|
||||
|
||||
enum B_bq_RES_File_ID {
|
||||
/* BCK */
|
||||
/* 0x07 */ BCK_BQ_APPEAR = 0x7,
|
||||
@@ -896,6 +900,11 @@ static void b_bq_end(b_bq_class* i_this) {
|
||||
i_this->mMode = 1;
|
||||
|
||||
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));
|
||||
// fallthrough
|
||||
}
|
||||
|
||||
@@ -4084,6 +4084,15 @@ void daB_DS_c::executeBattle2Dead() {
|
||||
camera->mCamera.SetTrimSize(0);
|
||||
dComIfGp_event_reset();
|
||||
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 */
|
||||
dComIfGs_onEventBit(0x2010);
|
||||
fopAcM_delete(this);
|
||||
|
||||
@@ -530,6 +530,33 @@ int daDitem_c::execute() {
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
|
||||
@@ -10,6 +10,9 @@
|
||||
#include "d/actor/d_a_midna.h"
|
||||
#include "d/d_door_param2.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_msg_object.h"
|
||||
#include "d/d_map_path_dmap.h"
|
||||
@@ -313,7 +316,17 @@ int daDoor20_c::checkOpenMsgDoor(int* param_1) {
|
||||
return 1;
|
||||
}
|
||||
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);
|
||||
#endif
|
||||
dMsgObject_endFlowGroup();
|
||||
return rv;
|
||||
}
|
||||
|
||||
@@ -11,6 +11,11 @@
|
||||
#include "f_op/f_op_actor_enemy.h"
|
||||
#include <cstring>
|
||||
|
||||
#if TARGET_PC
|
||||
#include "dusk/randomizer/game/randomizer_context.hpp"
|
||||
#endif
|
||||
|
||||
|
||||
class daE_HP_HIO_c : public JORReflexible {
|
||||
public:
|
||||
daE_HP_HIO_c();
|
||||
@@ -726,11 +731,16 @@ void daE_HP_c::executeDead() {
|
||||
fopAcM_onSwitch(this, bitSw);
|
||||
}
|
||||
|
||||
dComIfGs_addPohSpiritNum();
|
||||
#if TARGET_PC
|
||||
if (randomizer_IsActive()) {
|
||||
g_randomizerState.handlePoeItem(bitSw);
|
||||
} else
|
||||
#endif
|
||||
dComIfGs_addPohSpiritNum();
|
||||
|
||||
field_0x784 = -1;
|
||||
|
||||
if (dComIfGs_getPohSpiritNum() == 20) {
|
||||
if (dComIfGs_getPohSpiritNum() == 20 IF_DUSK(&& !randomizer_IsActive())) {
|
||||
dComIfGs_onEventBit(dSv_event_flag_c::saveBitLabels[0x1c9]);
|
||||
}
|
||||
|
||||
@@ -752,7 +762,7 @@ void daE_HP_c::executeDead() {
|
||||
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_delete(this);
|
||||
} else {
|
||||
|
||||
@@ -396,7 +396,10 @@ inline int daE_MD_c::create() {
|
||||
int phase_state = dComIfG_resLoad(&mPhase, "E_MD");
|
||||
if (phase_state == cPhs_COMPLEATE_e) {
|
||||
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;
|
||||
}
|
||||
|
||||
|
||||
@@ -21,6 +21,10 @@
|
||||
#include "Z2AudioLib/Z2Instances.h"
|
||||
#include <cstring>
|
||||
|
||||
#if TARGET_PC
|
||||
#include "dusk/randomizer/game/tools.h"
|
||||
#endif
|
||||
|
||||
class daE_MK_HIO_c : public JORReflexible {
|
||||
public:
|
||||
virtual ~daE_MK_HIO_c() {}
|
||||
@@ -1726,6 +1730,11 @@ static void demo_camera_end(e_mk_class* i_this) {
|
||||
work.z = AREG_F(2) + -20.0f;
|
||||
MtxPosition(&work, &pos);
|
||||
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);
|
||||
}
|
||||
|
||||
|
||||
@@ -14,6 +14,10 @@
|
||||
#include "Z2AudioLib/Z2Instances.h"
|
||||
#include <cstring>
|
||||
|
||||
#if TARGET_PC
|
||||
#include "dusk/randomizer/game/randomizer_context.hpp"
|
||||
#include "dusk/randomizer/game/tools.h"
|
||||
#endif
|
||||
|
||||
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.SetTrimSize(0);
|
||||
dComIfGp_event_reset();
|
||||
dComIfGs_addPohSpiritNum();
|
||||
#if TARGET_PC
|
||||
if (!randomizer_IsActive()) {
|
||||
#endif
|
||||
dComIfGs_addPohSpiritNum();
|
||||
#if !PLATFORM_SHIELD
|
||||
if (dComIfGs_getPohSpiritNum() == 0x14) {
|
||||
/* dSv_event_flag_c::F_0457 - Castle Town - Revived cat */
|
||||
dComIfGs_onEventBit(dSv_event_flag_c::saveBitLabels[457]);
|
||||
if (dComIfGs_getPohSpiritNum() == 0x14) {
|
||||
/* dSv_event_flag_c::F_0457 - Castle Town - Revived cat */
|
||||
dComIfGs_onEventBit(dSv_event_flag_c::saveBitLabels[457]);
|
||||
}
|
||||
#endif
|
||||
#if TARGET_PC
|
||||
}
|
||||
#endif
|
||||
daPy_getPlayerActorClass()->cancelOriginalDemo();
|
||||
@@ -1265,6 +1275,14 @@ static void e_po_dead(e_po_class* i_this) {
|
||||
}
|
||||
} else {
|
||||
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,
|
||||
-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.z = i_this->field_0xa10.z - enemy->current.pos.z;
|
||||
|
||||
#if AVOID_UB
|
||||
f32 speed_target{};
|
||||
#else
|
||||
f32 speed_target;
|
||||
#endif
|
||||
switch (i_this->mode) {
|
||||
case 0:
|
||||
i_this->mode = 1;
|
||||
|
||||
@@ -16,6 +16,10 @@
|
||||
#include "f_op/f_op_camera_mng.h"
|
||||
#include <cstring>
|
||||
|
||||
#if TARGET_PC
|
||||
#include "dusk/randomizer/game/verify_item_functions.h"
|
||||
#endif
|
||||
|
||||
class daE_RDB_HIO_c : public JORReflexible {
|
||||
public:
|
||||
daE_RDB_HIO_c();
|
||||
@@ -1250,6 +1254,12 @@ static void demo_camera(e_rdb_class* i_this) {
|
||||
}
|
||||
|
||||
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);
|
||||
i_this->mDemoMode = 12;
|
||||
i_this->field_0x10aa = 0;
|
||||
|
||||
@@ -9,6 +9,9 @@
|
||||
#include "SSystem/SComponent/c_math.h"
|
||||
#include "Z2AudioLib/Z2Instances.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_path.h"
|
||||
#include "d/d_s_play.h"
|
||||
@@ -1687,6 +1690,18 @@ static void demo_camera(e_s1_class* i_this) {
|
||||
if (i_this->mDemoTimer == 137) {
|
||||
if (!dComIfGs_isSwitch(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", dComIfGs_isSwitch(i_this->mSwBit, fopAcM_GetRoomNo(a_this)));
|
||||
}
|
||||
|
||||
@@ -10,7 +10,9 @@
|
||||
#include "d/d_com_inf_game.h"
|
||||
#include "d/actor/d_a_player.h"
|
||||
#include "d/d_s_play.h"
|
||||
|
||||
#if TARGET_PC
|
||||
#include "dusk/randomizer/game/verify_item_functions.h"
|
||||
#endif
|
||||
enum daE_TH_ACTION {
|
||||
ACTION_STOP,
|
||||
ACTION_SPIN,
|
||||
@@ -931,6 +933,12 @@ static void get_demo(e_th_ball_class* i_this) {
|
||||
case 0:
|
||||
break;
|
||||
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);
|
||||
JUT_ASSERT(1670, demo_id != fpcM_ERROR_PROCESS_ID_e);
|
||||
i_this->mDemoMode = 2;
|
||||
|
||||
@@ -88,8 +88,17 @@ static int daKytag08_Execute(kytag08_class* i_this) {
|
||||
}
|
||||
}
|
||||
|
||||
if ((daPy_getPlayerActorClass()->checkKandelaarSwing(TRUE) && i_this->mSizeTimer < 100) ||
|
||||
dComIfGs_BossLife_public_Get() == 1)
|
||||
#if TARGET_PC
|
||||
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);
|
||||
i_this->mTargetAvoidPos = i_this->current.pos;
|
||||
|
||||
@@ -11,6 +11,7 @@
|
||||
#include "d/d_com_inf_game.h"
|
||||
|
||||
#if TARGET_PC
|
||||
#include <aurora/texture.hpp>
|
||||
#include "dusk/dvd_asset.hpp"
|
||||
#include "dusk/frame_interpolation.h"
|
||||
|
||||
@@ -40,6 +41,8 @@ static f32* l_texCoord_get() { alignas(32) static f32 buf[338]; static bool _
|
||||
//#define l_pos (l_pos_get())
|
||||
#define l_normal (l_normal_get())
|
||||
#define l_texCoord (l_texCoord_get())
|
||||
|
||||
static bool l_Egnd_mantTEX_hasReplacement = false;
|
||||
#else
|
||||
#include "assets/l_Egnd_mantTEX.h"
|
||||
|
||||
@@ -223,6 +226,7 @@ void daMant_packet_c::draw() {
|
||||
GXInitTexObjCI(
|
||||
&undersideTexObj, l_Egnd_mantTEX_U, 0x80, 0x80, GX_TF_C8, GX_CLAMP, GX_CLAMP, 0, 0);
|
||||
GXInitTexObjLOD(&undersideTexObj, GX_LINEAR, GX_LINEAR, 0.0, 0.0, 0.0, 0, 0, GX_ANISO_1);
|
||||
l_Egnd_mantTEX_hasReplacement = aurora::texture::has_replacement(&mainTexObj, &tlutObj);
|
||||
textureObjsInitialized = true;
|
||||
}
|
||||
#else
|
||||
@@ -636,7 +640,11 @@ static int daMant_Execute(mant_class* i_this) {
|
||||
iVar8 = 0;
|
||||
|
||||
if (i_this->field_0x3967 != 0) {
|
||||
#if TARGET_PC
|
||||
mant_cut_type = l_Egnd_mantTEX_hasReplacement ? 1 : i_this->field_0x3967;
|
||||
#else
|
||||
mant_cut_type = i_this->field_0x3967;
|
||||
#endif
|
||||
|
||||
if (i_this->field_0x3968 < 15) {
|
||||
i_this->field_0x3968++;
|
||||
@@ -648,9 +656,18 @@ static int daMant_Execute(mant_class* i_this) {
|
||||
iVar8 = 20;
|
||||
}
|
||||
|
||||
unaff_r29 = cM_rndF(65536.0f);
|
||||
var_f31 = cM_rndFX(32.0f);
|
||||
var_f30 = cM_rndFX(32.0f);
|
||||
#if TARGET_PC
|
||||
if (l_Egnd_mantTEX_hasReplacement) {
|
||||
unaff_r29 = i_this->mMantRng.getF(65536.0f);
|
||||
var_f31 = i_this->mMantRng.getFX(32.0f);
|
||||
var_f30 = i_this->mMantRng.getFX(32.0f);
|
||||
} else
|
||||
#endif
|
||||
{
|
||||
unaff_r29 = cM_rndF(65536.0f);
|
||||
var_f31 = cM_rndFX(32.0f);
|
||||
var_f30 = cM_rndFX(32.0f);
|
||||
}
|
||||
}
|
||||
|
||||
i_this->field_0x3967 = 0;
|
||||
@@ -760,6 +777,8 @@ static int daMant_Create(fopAc_ac_c* i_this) {
|
||||
if(textureObjsInitialized) {
|
||||
GXInitTlutObjData(&tlutObj, l_Egnd_mantPAL); // make sure the cached textures are updated
|
||||
}
|
||||
|
||||
m_this->mMantRng.init(66, 16983, 855);
|
||||
#endif
|
||||
|
||||
lbl_277_bss_0 = 0;
|
||||
|
||||
@@ -29,6 +29,7 @@
|
||||
#include "dusk/frame_interpolation.h"
|
||||
#include "dusk/settings.h"
|
||||
#include "dusk/version.hpp"
|
||||
#include "dusk/randomizer/game/randomizer_context.hpp"
|
||||
#endif
|
||||
|
||||
class dmg_rod_HIO_c : public JORReflexible {
|
||||
@@ -2955,6 +2956,10 @@ static void lure_heart(dmg_rod_class* i_this) {
|
||||
if (obj_life != NULL) {
|
||||
fopAcM_delete(obj_life);
|
||||
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);
|
||||
u8 eventReg = dComIfGs_getEventReg(0xECFF);
|
||||
eventReg |= (u8)0x40;
|
||||
@@ -4090,6 +4095,10 @@ static void uki_catch(dmg_rod_class* i_this) {
|
||||
} else if (mgfish->mCaughtType == MG_CATCH_BIN) {
|
||||
i_this->msgflow.init(actor, 0x139A, 0, NULL);
|
||||
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();
|
||||
} else if (mgfish->mCaughtType == MG_CATCH_KN) {
|
||||
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 (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);
|
||||
bin_pos -= player->current.pos;
|
||||
|
||||
|
||||
@@ -14,6 +14,11 @@
|
||||
#include "m_Do/m_Do_lib.h"
|
||||
#include <cstring>
|
||||
|
||||
#if TARGET_PC
|
||||
#include "dusk/randomizer/game/stages.h"
|
||||
#include "dusk/randomizer/game/tools.h"
|
||||
#endif
|
||||
|
||||
#if DEBUG
|
||||
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);
|
||||
@@ -2886,6 +2891,29 @@ void daNpcT_offEvtBit(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]);
|
||||
}
|
||||
|
||||
|
||||
@@ -1744,6 +1744,12 @@ int daNpc_Aru_c::cutSpeakTo(int i_staffID) {
|
||||
switch (eventId) {
|
||||
case 1:
|
||||
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);
|
||||
}
|
||||
|
||||
|
||||
@@ -10,6 +10,10 @@
|
||||
#include "JSystem/J3DGraphBase/J3DMaterial.h"
|
||||
#include <cstring>
|
||||
|
||||
#if TARGET_PC
|
||||
#include "dusk/randomizer/game/verify_item_functions.h"
|
||||
#endif
|
||||
|
||||
const daNpcAshB_HIOParam daNpcAshB_Param_c::m = {
|
||||
205.0f, // attention_offset
|
||||
-3.0f, // gravity
|
||||
@@ -1001,6 +1005,12 @@ BOOL daNpcAshB_c::EvCut_Appear(int i_staffID) {
|
||||
case '0008':
|
||||
local_30[0] = 0;
|
||||
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 =
|
||||
fopAcM_createItemForPresentDemo(¤t.pos, local_30[0], 0, -1, -1, 0, 0);
|
||||
dComIfGp_event_setItemPartnerId(mItemPartnerId);
|
||||
|
||||
@@ -618,6 +618,7 @@ BOOL daNpc_Bans_c::isDelete() {
|
||||
Delete if TYPE_MAKING_BOMBS and:
|
||||
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
|
||||
daNpcT_chkEvtBit(64); // dSv_event_flag_c::M_031 - Goron Mines - Goron Mines clear
|
||||
|
||||
@@ -626,6 +627,7 @@ BOOL daNpc_Bans_c::isDelete() {
|
||||
Delete if TYPE_SHOP and:
|
||||
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
|
||||
|
||||
default:
|
||||
|
||||
@@ -1034,8 +1034,9 @@ bool daNpcBouS_c::wait(void* param_1) {
|
||||
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;
|
||||
}
|
||||
|
||||
|
||||
@@ -1804,6 +1804,17 @@ int daNpcChin_c::_Evt_GameSucceed_CutMain(const int& param_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,
|
||||
0, 0);
|
||||
if (itemId2 != -1) {
|
||||
|
||||
@@ -11,6 +11,10 @@
|
||||
#include "JSystem/JHostIO/JORFile.h"
|
||||
#include <cstring>
|
||||
|
||||
#if TARGET_PC
|
||||
#include "dusk/randomizer/game/verify_item_functions.h"
|
||||
#endif
|
||||
|
||||
enum fairy_RES_File_ID {
|
||||
/* BCK */
|
||||
/* 0x09 */ BCK_FAIRY_F_SAD = 0x9,
|
||||
@@ -1269,7 +1273,7 @@ void daNpc_Fairy_c::AppearDemoCall() {
|
||||
} else {
|
||||
mEvtNo = EVT_APPEAR_50F_02;
|
||||
}
|
||||
} else if (dComIfGs_checkEmptyBottle()) {
|
||||
} else if (dComIfGs_checkEmptyBottle() IF_DUSK(|| randomizer_IsActive())) {
|
||||
mEvtNo = EVT_APPEAR_50F_01;
|
||||
} else {
|
||||
mEvtNo = EVT_APPEAR_50F_04;
|
||||
@@ -1333,6 +1337,14 @@ void daNpc_Fairy_c::PresentDemoCall() {
|
||||
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);
|
||||
if (id != fpcM_ERROR_PROCESS_ID_e) {
|
||||
dComIfGp_event_setItemPartnerId(id);
|
||||
|
||||
@@ -14,6 +14,10 @@
|
||||
#include "Z2AudioLib/Z2Instances.h"
|
||||
#include <cstring>
|
||||
|
||||
#if TARGET_PC
|
||||
#include "dusk/randomizer/game/verify_item_functions.h"
|
||||
#endif
|
||||
|
||||
const daNpc_grA_HIOParam daNpc_grA_Param_c::m = {
|
||||
{90.0f, -4.0f, 1.0f, 850.0f, 255.0f, 280.0f, 40.0f, 100.0f, 0.0f, 0.0f, 20.0f,
|
||||
-20.0f, 40.0f, -30.0f, 40.0f, -40.0f, 0.4f, 12.0f, 4, 6, 6, 6,
|
||||
@@ -4018,6 +4022,14 @@ BOOL daNpc_grA_c::talk(void*) {
|
||||
}
|
||||
if (r26 && talkProc(NULL, TRUE, NULL)) {
|
||||
if (mFlow.getEventId(&sp8) == 1) {
|
||||
#if TARGET_PC
|
||||
if (randomizer_IsActive()) {
|
||||
// Give the randomized underwater goron item
|
||||
if (sp8 == dItemNo_Randomizer_BOMB_IN_BAG_e) {
|
||||
sp8 = verifyProgressiveItem(randomizer_getItemAtLocation("Zoras Domain Underwater Goron"));
|
||||
}
|
||||
}
|
||||
#endif
|
||||
field_0x1480 =
|
||||
fopAcM_createItemForPresentDemo(¤t.pos, sp8, 0, -1, -1, NULL, NULL);
|
||||
if (field_0x1480 != fpcM_ERROR_PROCESS_ID_e) {
|
||||
|
||||
@@ -13,6 +13,10 @@
|
||||
#include "Z2AudioLib/Z2Instances.h"
|
||||
#include <cstring>
|
||||
|
||||
#if TARGET_PC
|
||||
#include "dusk/randomizer/game/verify_item_functions.h"
|
||||
#endif
|
||||
|
||||
enum grO_RES_File_ID {
|
||||
/* BCK */
|
||||
/* 0x07 */ BCK_GRO_F_TALK_A = 0x7,
|
||||
@@ -1681,6 +1685,12 @@ int daNpc_grO_c::talk(void* param_1) {
|
||||
if (facePlayerFlag && talkProc(NULL, TRUE, NULL)) {
|
||||
if (mType == TYPE_MINES) {
|
||||
if (mFlow.getEventId(&itemId) == 1) {
|
||||
#if TARGET_PC
|
||||
if (randomizer_IsActive()) {
|
||||
itemId = verifyProgressiveItem(randomizer_getItemAtLocation("Goron Mines Gor Ebizo Key Shard"));
|
||||
randomizer_setTempFlagForLocation("Goron Mines Gor Ebizo Key Shard");
|
||||
}
|
||||
#endif
|
||||
mItemID = fopAcM_createItemForPresentDemo(¤t.pos, itemId, 0, -1, -1, NULL, NULL);
|
||||
if (mItemID != fpcM_ERROR_PROCESS_ID_e) {
|
||||
s16 eventIdx = dComIfGp_getEventManager().getEventIdx(this, "DEFAULT_GETITEM", 0xFF);
|
||||
|
||||
@@ -10,6 +10,10 @@
|
||||
#include "Z2AudioLib/Z2Instances.h"
|
||||
#include <cstring>
|
||||
|
||||
#if TARGET_PC
|
||||
#include "dusk/randomizer/game/verify_item_functions.h"
|
||||
#endif
|
||||
|
||||
enum grR_RES_File_ID {
|
||||
/* BCK */
|
||||
/* 0x06 */ BCK_GRR_AGURA_GETUP = 0x6,
|
||||
@@ -1338,6 +1342,12 @@ int daNpc_grR_c::talk(void* param_1) {
|
||||
if (bVar1 && talkProc(NULL, TRUE, NULL)) {
|
||||
if (mType == TYPE_0) {
|
||||
if (mFlow.getEventId(&i_itemNo) == 1) {
|
||||
#if TARGET_PC
|
||||
if (randomizer_IsActive()) {
|
||||
i_itemNo = verifyProgressiveItem(randomizer_getItemAtLocation("Goron Mines Gor Liggs Key Shard"));
|
||||
randomizer_setTempFlagForLocation("Goron Mines Gor Liggs Key Shard");
|
||||
}
|
||||
#endif
|
||||
mItemID = fopAcM_createItemForPresentDemo(¤t.pos, i_itemNo, 0, -1, -1, NULL, NULL);
|
||||
|
||||
if (mItemID != fpcM_ERROR_PROCESS_ID_e) {
|
||||
|
||||
@@ -11,6 +11,9 @@
|
||||
#include "Z2AudioLib/Z2Instances.h"
|
||||
#include <cstring>
|
||||
|
||||
#if TARGET_PC
|
||||
#include "dusk/randomizer/game/verify_item_functions.h"
|
||||
#endif
|
||||
enum Event_Cut_Nums {
|
||||
NUM_EVT_CUTS_e = 2,
|
||||
};
|
||||
@@ -1190,6 +1193,12 @@ int daNpc_grS_c::talk(void* param_0) {
|
||||
if (unkFlag1 && talkProc(NULL, 1, NULL)) {
|
||||
if (mType == 0) {
|
||||
if (mFlow.getEventId(&unkInt2) == 1) {
|
||||
#if TARGET_PC
|
||||
if (randomizer_IsActive()) {
|
||||
unkInt2 = verifyProgressiveItem(randomizer_getItemAtLocation("Goron Mines Gor Amato Key Shard"));
|
||||
randomizer_setTempFlagForLocation("Goron Mines Gor Amato Key Shard");
|
||||
}
|
||||
#endif
|
||||
mPresentItemId =
|
||||
fopAcM_createItemForPresentDemo(¤t.pos, unkInt2, 0, -1, -1, 0, 0);
|
||||
|
||||
|
||||
@@ -9,6 +9,10 @@
|
||||
#include "d/actor/d_a_npc.h"
|
||||
#include <cstring>
|
||||
|
||||
#if TARGET_PC
|
||||
#include "dusk/randomizer/game/verify_item_functions.h"
|
||||
#endif
|
||||
|
||||
daNpcImpal_HIOParam const daNpcImpal_Param_c::m = {
|
||||
135.0f, // attention_offset
|
||||
-3.0f, // gravity
|
||||
@@ -971,6 +975,12 @@ BOOL daNpcImpal_c::EvCut_ImpalAppear1(int i_cut_index) {
|
||||
if (talkProc(NULL, 1, NULL)) {
|
||||
int evt_id = 0;
|
||||
if (mFlow.getEventId(&evt_id) == 1) {
|
||||
#if TARGET_PC
|
||||
if (randomizer_IsActive()) {
|
||||
evt_id = verifyProgressiveItem(randomizer_getItemAtLocation("Ilia Charm"));
|
||||
randomizer_setTempFlagForLocation("Ilia Charm");
|
||||
}
|
||||
#endif
|
||||
mItemPartnerId =
|
||||
fopAcM_createItemForPresentDemo(¤t.pos, evt_id, 0, -1, -1, 0, 0);
|
||||
if (mItemPartnerId != 0xffffffff) {
|
||||
@@ -1060,6 +1070,12 @@ BOOL daNpcImpal_c::EvCut_CopyRod(int i_cut_index) {
|
||||
case '0003':
|
||||
int evt_id = 0;
|
||||
if (mFlow.getEventId(&evt_id) == 1) {
|
||||
#if TARGET_PC
|
||||
if (randomizer_IsActive()) {
|
||||
evt_id = verifyProgressiveItem(randomizer_getItemAtLocation("Skybook From Impaz"));
|
||||
randomizer_setTempFlagForLocation("Skybook From Impaz");
|
||||
}
|
||||
#endif
|
||||
mItemPartnerId =
|
||||
fopAcM_createItemForPresentDemo(¤t.pos, evt_id, 0, -1, -1, 0, 0);
|
||||
dComIfGp_event_setItemPartnerId(mItemPartnerId);
|
||||
|
||||
@@ -11,6 +11,13 @@
|
||||
#include "d/d_msg_object.h"
|
||||
#include <cstring>
|
||||
|
||||
|
||||
|
||||
#if TARGET_PC
|
||||
#include "dusk/randomizer/game/randomizer_context.hpp"
|
||||
#include "dusk/randomizer/game/verify_item_functions.h"
|
||||
#endif
|
||||
|
||||
enum Ins_RES_File_ID {
|
||||
/* BCK */
|
||||
/* 0x06 */ BCK_INS_F_HAPPY = 0x6,
|
||||
@@ -292,6 +299,10 @@ daNpcIns_c::eventFunc daNpcIns_c::mEvtSeqList[1] = {
|
||||
NULL,
|
||||
};
|
||||
|
||||
#if TARGET_PC
|
||||
u8 daNpcIns_c::mGivenInsectId = 0xFF;
|
||||
#endif
|
||||
|
||||
static insect_param_data const l_insectParams[24] = {
|
||||
{0x0191, 0x709, 0, 0},
|
||||
{0x0192, 0x709, 0, 0},
|
||||
@@ -1259,6 +1270,9 @@ int daNpcIns_c::waitPresent(void* param_1) {
|
||||
daPy_py_c* player = daPy_getPlayerActorClass();
|
||||
player->changeOriginalDemo();
|
||||
player->changeDemoMode(0x25, 2, type, 0);
|
||||
#if TARGET_PC
|
||||
mGivenInsectId = type;
|
||||
#endif
|
||||
} else {
|
||||
mInsectMsgNo = 0x719;
|
||||
}
|
||||
@@ -1487,6 +1501,14 @@ int daNpcIns_c::talk(void* param_1) {
|
||||
OS_REPORT("会話終了時 イベントID=%d アイテムNo=%d\n", eventID, itemNo);
|
||||
|
||||
if (eventID == 1) {
|
||||
#if TARGET_PC
|
||||
// In rando, get the randomzied bug reward
|
||||
if (randomizer_IsActive()) {
|
||||
itemNo = randomizer_GetContext().mBugRewardOverrides[mGivenInsectId];
|
||||
itemNo = static_cast<int>(verifyProgressiveItem(itemNo));
|
||||
mGivenInsectId = 0xFF;
|
||||
}
|
||||
#endif
|
||||
mItemID = fopAcM_createItemForPresentDemo(¤t.pos, itemNo, 0, -1, -1, NULL, NULL);
|
||||
|
||||
if (mItemID != fpcM_ERROR_PROCESS_ID_e) {
|
||||
|
||||
@@ -9,6 +9,10 @@
|
||||
#include "d/actor/d_a_e_ym.h"
|
||||
#include <cstring>
|
||||
|
||||
#if TARGET_PC
|
||||
#include "dusk/randomizer/game/verify_item_functions.h"
|
||||
#endif
|
||||
|
||||
static DUSK_CONSTEXPR int l_bmdData[2][2] = {
|
||||
{35, 1},
|
||||
{18, 2},
|
||||
@@ -1181,6 +1185,16 @@ int daNpc_Kkri_c::talk(void*) {
|
||||
switch (eventId) {
|
||||
case 1:
|
||||
if (mItemPartnerId == fpcM_ERROR_PROCESS_ID_e) {
|
||||
#if TARGET_PC
|
||||
if (randomizer_IsActive()) {
|
||||
if (item_no == dItemNo_OIL_BOTTLE3_e) {
|
||||
item_no = verifyProgressiveItem(randomizer_getItemAtLocation("Coro Bottle"));
|
||||
randomizer_setTempFlagForLocation("Coro Bottle");
|
||||
} /*else if (item_no == dItemNo_SMALL_KEY_e) { // Might be Small Key 2
|
||||
item_no = verifyProgressiveItem(randomizer_getItemAtLocation("Coro Gate Key"));
|
||||
}*/
|
||||
}
|
||||
#endif
|
||||
mItemPartnerId = fopAcM_createItemForPresentDemo(¤t.pos, item_no, 0, -1, -1, NULL, NULL);
|
||||
}
|
||||
|
||||
|
||||
@@ -6882,6 +6882,16 @@ static int daNpc_Ks_Delete(npc_ks_class* i_this) {
|
||||
i_this->model->stopZelAnime();
|
||||
}
|
||||
|
||||
#if TARGET_PC
|
||||
if (leader == i_this) {
|
||||
leader = NULL;
|
||||
}
|
||||
|
||||
if (saru_p[i_this->set_id] == i_this) {
|
||||
saru_p[i_this->set_id] = NULL;
|
||||
}
|
||||
#endif
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user