mirror of
https://github.com/TwilitRealm/dusklight
synced 2026-07-04 11:19:58 -04:00
Compare commits
494 Commits
main
...
rando-archi
| Author | SHA1 | Date | |
|---|---|---|---|
| 589c6675fe | |||
| 0be48db605 | |||
| dbb9ce2c03 | |||
| cc808ab50c | |||
| 591c38e871 | |||
| a5bc71795e | |||
| 7682165478 | |||
| 26d0725c76 | |||
| 1b3b493fbf | |||
| f62a70f9d0 | |||
| ec2173db9f | |||
| 563944d4a3 | |||
| b8f69e82dd | |||
| 830b560933 | |||
| 57019bea30 | |||
| c590018059 | |||
| e7eefbb0cb | |||
| 7ee39edee7 | |||
| 6592871fa2 | |||
| 5a1368b355 | |||
| 6984ae83bf | |||
| e57c952deb | |||
| 4239cea3d5 | |||
| 93479100fc | |||
| 9bd34a0d02 | |||
| cce67c1809 | |||
| 6bf0dfd92a | |||
| 4d8fcfa551 | |||
| 6366ab61d1 | |||
| 7537f1c4a8 | |||
| a3de85fb4b | |||
| 08e0645ef8 | |||
| f20cf3c24e | |||
| b2dfdf4158 | |||
| 99689258a2 | |||
| 08345d01ed | |||
| 56d47d475f | |||
| 8a92efbe0d | |||
| 1790ad6faf | |||
| e39c139b97 | |||
| 54b3545736 | |||
| 2428ca2efe | |||
| 05d9cf0402 | |||
| 2651640ee0 | |||
| f8c5a8988b | |||
| 544964c1a5 | |||
| 59b76f7aae | |||
| 7bd3e9cafd | |||
| 8999c4c9c5 | |||
| 917def4732 | |||
| 0516282bb6 | |||
| 4466442cfb | |||
| d6f741947a | |||
| d855efe513 | |||
| 51a25206c2 | |||
| 28733f5c15 | |||
| b2ac2d6600 | |||
| f6b86d3f38 | |||
| b118fa19e1 | |||
| 68bebfad3a | |||
| a0f5b250b4 | |||
| cb70f2c3b3 | |||
| 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 |
@@ -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})
|
||||
|
||||
+105
@@ -1464,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
|
||||
@@ -1484,6 +1487,8 @@ set(DUSK_FILES
|
||||
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
|
||||
@@ -1533,6 +1538,12 @@ set(DUSK_FILES
|
||||
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
|
||||
@@ -1546,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
|
||||
|
||||
@@ -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];
|
||||
@@ -6391,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 {
|
||||
@@ -6465,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 {
|
||||
|
||||
@@ -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); }
|
||||
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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,
|
||||
@@ -331,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();
|
||||
@@ -732,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
|
||||
@@ -743,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 */
|
||||
|
||||
@@ -75,6 +75,7 @@ public:
|
||||
bool dpdMove();
|
||||
u8 openExplain(u8);
|
||||
#if TARGET_PC
|
||||
void updateSlotImage(u8 slot);
|
||||
bool pointerMove();
|
||||
#endif
|
||||
|
||||
@@ -219,6 +220,7 @@ private:
|
||||
bool mCursorInterpCurrAngular;
|
||||
bool mCursorInterpInit;
|
||||
bool mPointerTouchPressHoveredCurrent;
|
||||
J2DPicture* mDpadIcon;
|
||||
#endif
|
||||
};
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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; }
|
||||
|
||||
@@ -278,6 +278,8 @@ struct UserSettings {
|
||||
ConfigVar<bool> liveSplitEnabled;
|
||||
ConfigVar<bool> showSpeedrunRTATimer;
|
||||
ConfigVar<bool> recordingMode;
|
||||
|
||||
// Misc
|
||||
ConfigVar<bool> removeQuestMapMarkers;
|
||||
ConfigVar<bool> showInputViewer;
|
||||
ConfigVar<bool> showInputViewerGyro;
|
||||
@@ -303,6 +305,41 @@ struct UserSettings {
|
||||
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();
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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; }
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -9,6 +9,10 @@
|
||||
#include "d/actor/d_a_tag_push.h"
|
||||
#include <cstring>
|
||||
|
||||
#if TARGET_PC
|
||||
#include "dusk/randomizer/game/verify_item_functions.h"
|
||||
#endif
|
||||
|
||||
enum Type {
|
||||
/* 0x0 */ TYPE_0,
|
||||
/* 0x1 */ TYPE_1,
|
||||
@@ -1236,6 +1240,12 @@ int daNpc_Len_c::talk(void* param_0) {
|
||||
switch (evt_id) {
|
||||
case 1:
|
||||
if (mItemPartnerId == -1) {
|
||||
#if TARGET_PC
|
||||
if (randomizer_IsActive()) {
|
||||
local_18 = verifyProgressiveItem(randomizer_getItemAtLocation("Renados Letter"));
|
||||
randomizer_setTempFlagForLocation("Renados Letter");
|
||||
}
|
||||
#endif
|
||||
mItemPartnerId = fopAcM_createItemForPresentDemo(¤t.pos, local_18,
|
||||
0, -1, -1, 0, 0);
|
||||
}
|
||||
|
||||
@@ -17,6 +17,9 @@
|
||||
#include "d/d_com_static.h"
|
||||
#include "d/d_item.h"
|
||||
#include "d/d_timer.h"
|
||||
#if TARGET_PC
|
||||
#include "dusk/randomizer/game/verify_item_functions.h"
|
||||
#endif
|
||||
#if DEBUG
|
||||
#include "d/d_debug_viewer.h"
|
||||
#include <cstring>
|
||||
@@ -2393,6 +2396,11 @@ int daNpc_Maro_c::cutArrowTutorial(int arg0) {
|
||||
switch (evt_ret) {
|
||||
case 1: {
|
||||
if (mItemPartnerId == -1) {
|
||||
#if TARGET_PC
|
||||
if (randomizer_IsActive()) {
|
||||
evt_id = verifyProgressiveItem(randomizer_getItemAtLocation("Talo Sharpshooting"));
|
||||
}
|
||||
#endif
|
||||
mItemPartnerId = fopAcM_createItemForPresentDemo(¤t.pos, evt_id, 0, -1, -1, NULL, NULL);
|
||||
}
|
||||
|
||||
|
||||
@@ -11,6 +11,10 @@
|
||||
#include "Z2AudioLib/Z2Instances.h"
|
||||
#include <cstring>
|
||||
|
||||
#if TARGET_PC
|
||||
#include "dusk/randomizer/game/verify_item_functions.h"
|
||||
#endif
|
||||
|
||||
enum {
|
||||
NUM_EVT_CUTS_e = 5,
|
||||
};
|
||||
@@ -1191,6 +1195,12 @@ int daNpc_myna2_c::ECut_gameGoalSuccess(int i_staffId) {
|
||||
case 20: {
|
||||
int itemNo = 0;
|
||||
if (mFlow.getEventId(&itemNo) == 1) {
|
||||
#if TARGET_PC
|
||||
// If plumm tries giving us the heart piece, give the randomized item instead
|
||||
if (randomizer_IsActive() && itemNo == dItemNo_KAKERA_HEART_e) {
|
||||
itemNo = verifyProgressiveItem(randomizer_getItemAtLocation("Plumm Fruit Balloon Minigame"));
|
||||
}
|
||||
#endif
|
||||
mItemPid = fopAcM_createItemForPresentDemo(¤t.pos, itemNo, 0, -1, -1, NULL, NULL);
|
||||
}
|
||||
break;
|
||||
|
||||
@@ -8,6 +8,12 @@
|
||||
#include "d/actor/d_a_npc_pouya.h"
|
||||
#include <cstring>
|
||||
|
||||
#if TARGET_PC
|
||||
#include "dusk/randomizer/game/flags.h"
|
||||
#include "dusk/randomizer/game/randomizer_context.hpp"
|
||||
#include "dusk/randomizer/game/verify_item_functions.h"
|
||||
#endif
|
||||
|
||||
const daNpc_Pouya_HIOParam daNpc_Pouya_Param_c::m = {
|
||||
120.0f, // attention_offset
|
||||
-3.0f, // gravity
|
||||
@@ -554,7 +560,8 @@ BOOL daNpc_Pouya_c::checkChangeEvt() {
|
||||
evtChange();
|
||||
return TRUE;
|
||||
}
|
||||
if (dComIfGs_getPohSpiritNum() >= 60) {
|
||||
// In randomizer, only get the 60 reward if we've already gotten the 20 reward
|
||||
if (dComIfGs_getPohSpiritNum() >= 60 IF_DUSK(&& randomizer_IsActive() && dComIfGs_isEventBit(GOT_BOTTLE_FROM_JOVANI))) {
|
||||
/* dSv_event_flag_c::F_0458 - Coversation with Jovani after collecting 60 ghosts
|
||||
*/
|
||||
if (!daNpcT_chkEvtBit(0x1CA)) {
|
||||
@@ -958,6 +965,17 @@ int daNpc_Pouya_c::cutHaveFavorToAsk(int param_0) {
|
||||
switch (evt_id) {
|
||||
case 1:
|
||||
if (mItemPartnerId == fpcM_ERROR_PROCESS_ID_e) {
|
||||
#if TARGET_PC
|
||||
if (randomizer_IsActive()) {
|
||||
if (local_64 == dItemNo_Randomizer_DROP_BOTTLE_e) {
|
||||
local_64 = verifyProgressiveItem(randomizer_getItemAtLocation("Jovani 20 Poe Soul Reward"));
|
||||
randomizer_setTempFlagForLocation("Jovani 20 Poe Soul Reward");
|
||||
} else if (local_64 == dItemNo_Randomizer_SILVER_RUPEE_e) {
|
||||
local_64 = verifyProgressiveItem(randomizer_getItemAtLocation("Jovani 60 Poe Soul Reward"));
|
||||
randomizer_setTempFlagForLocation("Jovani 60 Poe Soul Reward");
|
||||
}
|
||||
}
|
||||
#endif
|
||||
mItemPartnerId = fopAcM_createItemForPresentDemo(¤t.pos, local_64, 0,
|
||||
-1, -1, 0, 0);
|
||||
}
|
||||
|
||||
@@ -7,6 +7,9 @@
|
||||
|
||||
#include "d/actor/d_a_npc_prayer.h"
|
||||
#include "d/d_com_inf_game.h"
|
||||
#if TARGET_PC
|
||||
#include "dusk/randomizer/game/verify_item_functions.h"
|
||||
#endif
|
||||
|
||||
static NPC_PRAY_HIO_CLASS l_HIO;
|
||||
|
||||
@@ -720,6 +723,12 @@ fpc_ProcID daNpcPray_c::createHeart() {
|
||||
mDoMtx_stack_c::ZXYrotS(rot);
|
||||
mDoMtx_stack_c::multVec(&offset, &offset);
|
||||
pos += offset;
|
||||
#if TARGET_PC
|
||||
if (randomizer_IsActive()) {
|
||||
u8 itemId = verifyProgressiveItem(randomizer_getItemAtLocation("Charlo Donation Blessing"));
|
||||
return fopAcM_createItemForBoss(&pos, itemId, fopAcM_GetRoomNo(this), &rot, &size, 0.0f, 0.0f, 0);
|
||||
}
|
||||
#endif
|
||||
return fopAcM_createItemForBoss(&pos, dItemNo_KAKERA_HEART_e, fopAcM_GetRoomNo(this), &rot, &size, 0.0f, 0.0f, 0);
|
||||
}
|
||||
|
||||
|
||||
@@ -10,6 +10,11 @@
|
||||
#include "d/d_debug_viewer.h"
|
||||
#include <cstring>
|
||||
|
||||
#if TARGET_PC
|
||||
#include "dusk/randomizer/game/verify_item_functions.h"
|
||||
#include "dusk/randomizer/game/flags.h"
|
||||
#endif
|
||||
|
||||
static DUSK_CONSTEXPR daNpc_GetParam2 l_bckGetParamList[29] = {
|
||||
{-1, 2, 0},
|
||||
{9, 0, 0},
|
||||
@@ -194,7 +199,12 @@ int daNpcRafrel_c::Create() {
|
||||
|
||||
mType = 0;
|
||||
} else if (strcmp(dComIfGp_getStartStageName(), "F_SP115") == 0 && dComIfGp_getStartStageRoomNo() == 0) {
|
||||
if (daNpcF_chkEvtBit(0x169) || !daNpcF_chkEvtBit(0x108)) {
|
||||
#if TARGET_PC
|
||||
// Only despawn Auru in randomizer if we already collected his item
|
||||
if ((randomizer_IsActive() ? dComIfGs_isEventBit(GOT_AURUS_MEMO) : daNpcF_chkEvtBit(0x169)) || !daNpcF_chkEvtBit(0x108)) {
|
||||
#else
|
||||
if ( daNpcF_chkEvtBit(0x169) || !daNpcF_chkEvtBit(0x108)) {
|
||||
#endif
|
||||
return cPhs_ERROR_e;
|
||||
}
|
||||
|
||||
@@ -1310,6 +1320,12 @@ bool daNpcRafrel_c::talk(void* param_0) {
|
||||
OS_REPORT("会話終了時 イベントID=%d アイテムNo=%d\n", eventId, itemNo);
|
||||
|
||||
if (eventId == 1) {
|
||||
#if TARGET_PC
|
||||
if (randomizer_IsActive()) {
|
||||
itemNo = verifyProgressiveItem(randomizer_getItemAtLocation("Auru Gift To Fyer"));
|
||||
randomizer_setTempFlagForLocation("Auru Gift To Fyer");
|
||||
}
|
||||
#endif
|
||||
field_0xe00 = fopAcM_createItemForPresentDemo(¤t.pos, itemNo, 0, -1, -1, NULL, NULL);
|
||||
if (field_0xe00 != fpcM_ERROR_PROCESS_ID_e) {
|
||||
s16 eventIdx = dComIfGp_getEventManager().getEventIdx(this, "DEFAULT_GETITEM", 0xFF);
|
||||
@@ -1562,6 +1578,12 @@ int daNpcRafrel_c::EvCut_Appear(int i_staffId) {
|
||||
int itemNo = 0;
|
||||
u16 eventId = mFlow.getEventId(&itemNo);
|
||||
if (eventId == 1) {
|
||||
#if TARGET_PC
|
||||
if (randomizer_IsActive()) {
|
||||
itemNo = verifyProgressiveItem(randomizer_getItemAtLocation("Auru Gift To Fyer"));
|
||||
randomizer_setTempFlagForLocation("Auru Gift To Fyer");
|
||||
}
|
||||
#endif
|
||||
field_0xe00 = fopAcM_createItemForPresentDemo(¤t.pos, itemNo, 0, -1, -1, NULL, NULL);
|
||||
dComIfGp_event_setItemPartnerId(field_0xe00);
|
||||
field_0xe00 = fpcM_ERROR_PROCESS_ID_e;
|
||||
|
||||
@@ -356,15 +356,25 @@ cPhs_Step daNpcShad_c::Create() {
|
||||
mMode = 0;
|
||||
} else {
|
||||
if (strcmp(dComIfGp_getStartStageName(), "R_SP209") == 0) {
|
||||
#if TARGET_PC
|
||||
if ((daNpcF_chkEvtBit(0x311) && !randomizer_IsActive()) ||
|
||||
(daNpcF_chkEvtBit(0x333) && randomizer_IsActive())) { // Check custom flag before spawning
|
||||
#else
|
||||
if (daNpcF_chkEvtBit(0x311)) {
|
||||
#endif
|
||||
return cPhs_ERROR_e;
|
||||
}
|
||||
|
||||
#if TARGET_PC
|
||||
if (!randomizer_IsActive() &&
|
||||
(!daNpcF_chkEvtBit(0x10B) || (daNpcF_chkEvtBit(0x12E) && !daNpcF_chkEvtBit(0x31C)))) {
|
||||
#else
|
||||
if (!daNpcF_chkEvtBit(0x10B) || (daNpcF_chkEvtBit(0x12E) && !daNpcF_chkEvtBit(0x31C))) {
|
||||
#endif
|
||||
return cPhs_ERROR_e;
|
||||
}
|
||||
|
||||
if (daNpcF_chkEvtBit(0x12F)) {
|
||||
if (daNpcF_chkEvtBit(0x12F) IF_DUSK(&& !randomizer_IsActive())) {
|
||||
if (!daNpcF_chkEvtBit(0x312)) {
|
||||
if (getPathPoint(getPathID(), 1, &home.pos)) {
|
||||
current.pos = home.pos;
|
||||
@@ -1336,7 +1346,8 @@ bool daNpcShad_c::wait_type1(void* param_1) {
|
||||
}
|
||||
|
||||
u8 sVar1 = dComIfGp_event_getPreItemNo();
|
||||
if (sVar1 == 0xE9) {
|
||||
// In randomizer we want Shad to give us the dominion rod check no matter which skybook we have.
|
||||
if (sVar1 == 0xE9 IF_DUSK(|| (randomizer_IsActive() && sVar1 >= 0xE9))) {
|
||||
field_0xe14 = 64;
|
||||
daNpcF_offTmpBit(0xB);
|
||||
daNpcF_offTmpBit(0xC);
|
||||
@@ -1344,7 +1355,7 @@ bool daNpcShad_c::wait_type1(void* param_1) {
|
||||
daNpcF_offTmpBit(0xE);
|
||||
mOrderEvtNo = 3;
|
||||
changeEvent(l_evtArcs[mOrderEvtNo], l_evtNames[mOrderEvtNo], 1, 0xFFFF);
|
||||
} else if (sVar1 == 0xEB) {
|
||||
} else if (sVar1 == 0xEB IF_DUSK(&& !randomizer_IsActive())) {
|
||||
field_0xe14 = 65;
|
||||
daNpcF_offTmpBit(0xB);
|
||||
daNpcF_offTmpBit(0xC);
|
||||
|
||||
@@ -12,6 +12,10 @@
|
||||
#include "SSystem/SComponent/c_math.h"
|
||||
#include <cstring>
|
||||
|
||||
#if TARGET_PC
|
||||
#include "dusk/randomizer/game/verify_item_functions.h"
|
||||
#endif
|
||||
|
||||
const daNpcThe_HIOParam daNpcThe_Param_c::m = {
|
||||
220.0f, // attention_offset
|
||||
-3.0f, // gravity
|
||||
@@ -823,6 +827,11 @@ BOOL daNpcThe_c::talk(void* param_0) {
|
||||
}
|
||||
int item_no = 0;
|
||||
if (mFlow.getEventId(&item_no) == 1) {
|
||||
#if TARGET_PC
|
||||
if (randomizer_IsActive()) {
|
||||
item_no = verifyProgressiveItem(randomizer_getItemAtLocation("Telma Invoice"));
|
||||
}
|
||||
#endif
|
||||
mItemID = fopAcM_createItemForPresentDemo(¤t.pos, item_no, 0, -1, -1,
|
||||
NULL, NULL);
|
||||
if (mItemID != -1) {
|
||||
|
||||
@@ -1165,6 +1165,12 @@ int daNpc_Uri_c::cutEndCarryTutorial(int param_1) {
|
||||
(s32)mFlow.getEventId(&local_48) == 1)
|
||||
{
|
||||
if (mItemPartnerId == fpcM_ERROR_PROCESS_ID_e) {
|
||||
#if TARGET_PC
|
||||
if (randomizer_IsActive()) {
|
||||
local_48 = randomizer_getItemAtLocation("Uli Cradle Delivery");
|
||||
randomizer_setTempFlagForLocation("Uli Cradle Delivery");
|
||||
}
|
||||
#endif
|
||||
mItemPartnerId =
|
||||
fopAcM_createItemForPresentDemo(¤t.pos, local_48, 0, -1, -1, NULL, NULL);
|
||||
}
|
||||
|
||||
@@ -9,7 +9,10 @@
|
||||
#include "d/actor/d_a_demo_item.h"
|
||||
#include <cstring>
|
||||
|
||||
#if TARGET_PC
|
||||
#include "dusk/string.hpp"
|
||||
#include "dusk/randomizer/game/tools.h"
|
||||
#endif
|
||||
|
||||
static DUSK_CONSTEXPR daNpc_GetParam1 l_bmdData[3] = {
|
||||
{3, 1},
|
||||
@@ -1126,6 +1129,11 @@ BOOL daNpc_Yelia_c::cutTakeWoodStatue(int i_staffId) {
|
||||
if (prm == 99) {
|
||||
daNpcT_onEvtBit(0x11f);
|
||||
daNpcT_onEvtBit(0x17a);
|
||||
#if TARGET_PC
|
||||
if (randomizer_IsActive()) {
|
||||
offWarashibeItem(dItemNo_Randomizer_WOOD_STATUE_e); // Unset the statue item so it doesn't appear in the item wheel.
|
||||
} else
|
||||
#endif
|
||||
dComIfGs_setWarashibeItem(0xff);
|
||||
daNpcT_offTmpBit(0xb);
|
||||
daNpcT_offTmpBit(0xc);
|
||||
|
||||
@@ -947,6 +947,9 @@ BOOL daNpc_ykM_c::isDelete() {
|
||||
return FALSE;
|
||||
|
||||
case TYPE_COOK:
|
||||
#if TARGET_PC
|
||||
if (randomizer_IsActive()) return false; // We don't want cooking Yeto to leave the dungeon, even if the BK is obtained.
|
||||
#endif
|
||||
return dComIfGs_isDungeonItemBossKey();
|
||||
|
||||
case TYPE_2:
|
||||
|
||||
@@ -20,7 +20,10 @@
|
||||
#include "m_Do/m_Do_ext.h"
|
||||
#include <cstring>
|
||||
|
||||
#if TARGET_PC
|
||||
#include "dusk/string.hpp"
|
||||
#include "dusk/randomizer/game/verify_item_functions.h"
|
||||
#endif
|
||||
|
||||
#if DEBUG
|
||||
class daNpc_ykW_HIO_c : public mDoHIO_entry_c {
|
||||
@@ -575,6 +578,9 @@ int daNpc_ykW_c::isDelete() {
|
||||
case 0:
|
||||
return 0;
|
||||
case 1:
|
||||
#if TARGET_PC
|
||||
if (randomizer_IsActive()) return false;// We don't want Yeta to leave the dungeon, even if the BK is obtained.
|
||||
#endif
|
||||
return dComIfGs_isDungeonItemBossKey();
|
||||
case 2:
|
||||
return !dComIfGs_isDungeonItemBossKey() ||
|
||||
@@ -2213,6 +2219,11 @@ int daNpc_ykW_c::cutEndSnowboardRace(int param_0) {
|
||||
switch (eventId) {
|
||||
case 1:
|
||||
if (mItemPartnerId == fpcM_ERROR_PROCESS_ID_e) {
|
||||
#if TARGET_PC
|
||||
if (randomizer_IsActive()) {
|
||||
itemId = verifyProgressiveItem(randomizer_getItemAtLocation("Snowboard Racing Prize"));
|
||||
}
|
||||
#endif
|
||||
mItemPartnerId = fopAcM_createItemForPresentDemo(¤t.pos, itemId, 0,
|
||||
-1, -1, 0, 0);
|
||||
}
|
||||
@@ -2911,6 +2922,12 @@ int daNpc_ykW_c::talk(void* param_0) {
|
||||
switch (eventId) {
|
||||
case 1:
|
||||
if (mItemPartnerId == fpcM_ERROR_PROCESS_ID_e) {
|
||||
#if TARGET_PC
|
||||
if (randomizer_IsActive()) {
|
||||
itemNo = verifyProgressiveItem(randomizer_getItemAtLocation("Snowpeak Ruins Mansion Map"));
|
||||
randomizer_setTempFlagForLocation("Snowpeak Ruins Mansion Map");
|
||||
}
|
||||
#endif
|
||||
mItemPartnerId =
|
||||
fopAcM_createItemForPresentDemo(¤t.pos, itemNo, 0, -1, -1, 0, 0);
|
||||
}
|
||||
|
||||
@@ -20,6 +20,10 @@
|
||||
#include "d/actor/d_a_obj_zraMark.h"
|
||||
#include <cstring>
|
||||
|
||||
#if TARGET_PC
|
||||
#include "dusk/randomizer/game/verify_item_functions.h"
|
||||
#endif
|
||||
|
||||
static NPC_ZRA_HIO_CLASS l_HIO;
|
||||
|
||||
daNpc_zrA_HIOParam const daNpc_zrA_Param_c::m = {
|
||||
|
||||
@@ -2609,6 +2609,18 @@ BOOL daNpc_zrA_c::ECut_thanksBlast(int i_staffID) {
|
||||
case 31: {
|
||||
int item_id = 0;
|
||||
if (mFlow.getEventId(&item_id) == 1) {
|
||||
#if TARGET_PC
|
||||
if (randomizer_IsActive()) {
|
||||
if (item_id == dItemNo_Randomizer_BOMB_IN_BAG_e) {
|
||||
item_id = verifyProgressiveItem(randomizer_getItemAtLocation("Iza Helping Hand"));
|
||||
randomizer_setTempFlagForLocation("Iza Helping Hand");
|
||||
} else if (item_id == dItemNo_Randomizer_BOMB_BAG_LV2_e) {
|
||||
item_id = verifyProgressiveItem(randomizer_getItemAtLocation("Iza Raging Rapids Minigame"));
|
||||
randomizer_setTempFlagForLocation("Iza Raging Rapids Minigame");
|
||||
}
|
||||
|
||||
}
|
||||
#endif
|
||||
mItemID = fopAcM_createItemForPresentDemo(¤t.pos, item_id,
|
||||
0, -1, -1, NULL, NULL);
|
||||
}
|
||||
|
||||
@@ -10,6 +10,9 @@
|
||||
#include "SSystem/SComponent/c_math.h"
|
||||
#include "JSystem/J3DGraphBase/J3DMaterial.h"
|
||||
#include "Z2AudioLib/Z2Instances.h"
|
||||
#if TARGET_PC
|
||||
#include "dusk/randomizer/game/verify_item_functions.h"
|
||||
#endif
|
||||
|
||||
enum Event_Cut_Nums {
|
||||
/* 0x2 */ NUM_EVT_CUTS_e = 0x2,
|
||||
@@ -882,7 +885,11 @@ u8 daNpc_zrC_c::getTypeFromParam() {
|
||||
|
||||
int daNpc_zrC_c::isDelete() {
|
||||
if (mType == 4 || mType == 0 || mType == 1 || (mType == 2 && daNpcF_chkEvtBit(0x108)
|
||||
#if TARGET_PC
|
||||
&& (!daNpcF_chkEvtBit(0x10A) || randomizer_IsActive())) || mType == 3)
|
||||
#else
|
||||
&& !daNpcF_chkEvtBit(0x10A)) || mType == 3)
|
||||
#endif
|
||||
{
|
||||
return false;
|
||||
}
|
||||
@@ -1681,6 +1688,12 @@ BOOL daNpc_zrC_c::ECut_earringGet(int i_staffID) {
|
||||
case 40: {
|
||||
int item_no = 0;
|
||||
if (mFlow.getEventId(&item_no) == 1) {
|
||||
#if TARGET_PC
|
||||
if (randomizer_IsActive()) {
|
||||
item_no = verifyProgressiveItem(randomizer_getItemAtLocation("Gift From Ralis"));
|
||||
randomizer_setTempFlagForLocation("Gift From Ralis");
|
||||
}
|
||||
#endif
|
||||
mItemID = fopAcM_createItemForPresentDemo(¤t.pos, item_no,
|
||||
0, -1, -1, NULL, NULL);
|
||||
}
|
||||
|
||||
@@ -14,6 +14,11 @@
|
||||
#include "Z2AudioLib/Z2Instances.h"
|
||||
#include <cstring>
|
||||
|
||||
#if TARGET_PC
|
||||
#include "dusk/randomizer/game/flags.h"
|
||||
#include "dusk/randomizer/game/verify_item_functions.h"
|
||||
#endif
|
||||
|
||||
static NPC_ZRZ_HIO_CLASS l_HIO;
|
||||
|
||||
daNpc_zrZ_HIOParam const daNpc_zrZ_Param_c::m = {
|
||||
@@ -892,7 +897,12 @@ BOOL daNpc_zrZ_c::isDelete() {
|
||||
if (((mDemoMode == DEMO_COME_HERE || mDemoMode == DEMO_WAIT)
|
||||
&& dComIfGs_isSwitch(mSwitch1, fopAcM_GetRoomNo(this)))
|
||||
|| (mDemoMode == DEMO_COME_HERE_2 && (!dComIfGs_isSwitch(mSwitch1, fopAcM_GetRoomNo(this))
|
||||
|| dComIfGs_isSwitch(mSwitch2, fopAcM_GetRoomNo(this)))))
|
||||
#if TARGET_PC
|
||||
// Don't delete Rutela in the graveyard until we've picked up Rutelas Blessing in rando
|
||||
|| (dComIfGs_isSwitch(mSwitch2, fopAcM_GetRoomNo(this)) && (!randomizer_IsActive() || dComIfGs_isEventBit(GOT_ZORA_ARMOR_FROM_RUTELA))))))
|
||||
#else
|
||||
|| dComIfGs_isSwitch(mSwitch2, fopAcM_GetRoomNo(this)))))
|
||||
#endif
|
||||
{
|
||||
return true;
|
||||
} else {
|
||||
@@ -1729,6 +1739,12 @@ BOOL daNpc_zrZ_c::ECut_clothesGet(int i_staffID) {
|
||||
}
|
||||
item_no = 0;
|
||||
if (mFlow.getEventId(&item_no) == 1) {
|
||||
#if TARGET_PC
|
||||
if (randomizer_IsActive()) {
|
||||
item_no = verifyProgressiveItem(randomizer_getItemAtLocation("Rutelas Blessing"));
|
||||
randomizer_setTempFlagForLocation("Rutelas Blessing");
|
||||
}
|
||||
#endif
|
||||
mItemID = fopAcM_createItemForPresentDemo(¤t.pos, item_no,
|
||||
0, -1, -1, NULL, NULL);
|
||||
}
|
||||
|
||||
@@ -7,6 +7,9 @@
|
||||
|
||||
#include "d/actor/d_a_obj_Lv5Key.h"
|
||||
#include "d/d_com_inf_game.h"
|
||||
#if TARGET_PC
|
||||
#include "d/d_map.h"
|
||||
#endif
|
||||
|
||||
static int useHeapInit(fopAc_ac_c*);
|
||||
|
||||
@@ -113,6 +116,40 @@ void daObjLv5Key_c::Action() {
|
||||
}
|
||||
|
||||
void daObjLv5Key_c::Wait(int param_0) {
|
||||
#if TARGET_PC
|
||||
if (randomizer_IsActive()) {
|
||||
// Prevent softlock that occurs when opening a locked door from behind.
|
||||
// This patch compares z and x pos depending on yRot and turns the lock to face the player.
|
||||
Vec player_pos = dMapInfo_n::getMapPlayerPos();
|
||||
|
||||
const s32 collisionRotY = shape_angle.y;
|
||||
|
||||
float* playerAxisPos = NULL;
|
||||
float* lockPos = NULL;
|
||||
|
||||
if (collisionRotY & 0x4000) {
|
||||
playerAxisPos = &player_pos.x;
|
||||
lockPos = ¤t.pos.x;
|
||||
} else {
|
||||
playerAxisPos = &player_pos.z;
|
||||
lockPos = ¤t.pos.z;
|
||||
}
|
||||
|
||||
bool swapSides = false;
|
||||
if (collisionRotY & 0x8000 && *playerAxisPos > *lockPos + 17.f) {
|
||||
*lockPos += 34.f;
|
||||
swapSides = true;
|
||||
} else if (!(collisionRotY & 0x8000) && *playerAxisPos < *lockPos - 17.f) {
|
||||
*lockPos -= 34.f;
|
||||
swapSides = true;
|
||||
}
|
||||
|
||||
if (swapSides) {
|
||||
shape_angle.y ^= 0x8000;
|
||||
current.angle.y ^= 0x8000;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
switch (mMode) {
|
||||
case -1:
|
||||
break;
|
||||
|
||||
@@ -506,6 +506,13 @@ int daObjBossWarp_c::demoProc() {
|
||||
mDoMtx_stack_c::multVec(&mYstoneTargetPos, &mYstoneTargetPos);
|
||||
mYstonePos.x = mYstoneTargetPos.x;
|
||||
mYstonePos.z = mYstoneTargetPos.z;
|
||||
#if TARGET_PC
|
||||
// Skip giving the vanilla dungeon reward in rando
|
||||
if (randomizer_IsActive()) {
|
||||
mCounter = 0;
|
||||
break;
|
||||
}
|
||||
#endif
|
||||
switch (getNowLevel()) {
|
||||
case 0:
|
||||
dComIfGs_onCollectCrystal(0);
|
||||
|
||||
@@ -155,6 +155,12 @@ void daObjCRVGATE_c::Demo_Set() {
|
||||
}
|
||||
|
||||
void daObjCRVGATE_c::SetOpen() {
|
||||
#if TARGET_PC
|
||||
u8 doorUnlockedFlag = (fopAcM_GetParam(this) & 0xFFFF) >> 8;
|
||||
if (doorUnlockedFlag != 0xFF) {
|
||||
fopAcM_onSwitch(this, doorUnlockedFlag);
|
||||
}
|
||||
#endif
|
||||
mStatus = 0x0;
|
||||
}
|
||||
|
||||
@@ -646,6 +652,8 @@ void daObjCRVGATE_c::setBaseMtx() {
|
||||
mDoMtx_stack_c::transM(0.0f, nREG_F(5) + 55.0f, 0.0f);
|
||||
}
|
||||
|
||||
// Don't update the key model if it's not there
|
||||
IF_DUSK(if (mpModelKey != NULL))
|
||||
mpModelKey->setBaseTRMtx(mDoMtx_stack_c::get());
|
||||
mDoMtx_stack_c::transS(current.pos);
|
||||
mDoMtx_stack_c::ZXYrotM(shape_angle);
|
||||
@@ -675,7 +683,13 @@ int daObjCRVGATE_c::CreateHeap() {
|
||||
}
|
||||
|
||||
J3DModelData* model_data_key;
|
||||
if (mKeyParam == 0x00) {
|
||||
|
||||
// Don't draw the key model if the flag for the door being unlocked
|
||||
// was set. This is currently only used in rando
|
||||
#if TARGET_PC
|
||||
u8 doorUnlockedFlag = (fopAcM_GetParam(this) & 0xFFFF) >> 8;
|
||||
#endif
|
||||
if (mKeyParam == 0x00 IF_DUSK(&& doorUnlockedFlag != 0xFF && fopAcM_isSwitch(this, doorUnlockedFlag) == 0)) {
|
||||
model_data_key = (J3DModelData*)dComIfG_getObjectRes(l_arcName, "CaravanKey.bmd");
|
||||
mpModelKey = mDoExt_J3DModel__create(model_data_key, 0x80000, 0x11000084);
|
||||
}
|
||||
@@ -704,7 +718,8 @@ void daObjCRVGATE_c::SetDoor() {
|
||||
mKeyParam = 0x01;
|
||||
|
||||
// Create the second (identical) part of the door (swinging gate).
|
||||
mDoorPairProcID = fopAcM_createChild(fpcNm_Obj_CRVGATE_e, fopAcM_GetID(this), 1, &child_pos,
|
||||
// Pass along the flag for having unlocked the door
|
||||
mDoorPairProcID = fopAcM_createChild(fpcNm_Obj_CRVGATE_e, fopAcM_GetID(this), IF_DUSK(fopAcM_GetParam(this) && 0xFFFFFF00 |) 1, &child_pos,
|
||||
fopAcM_GetRoomNo(this), &child_angle, NULL, -1, 0);
|
||||
mDoorY = shape_angle.y;
|
||||
} else {
|
||||
@@ -762,6 +777,14 @@ int daObjCRVGATE_c::create() {
|
||||
|
||||
mFlagGateClosed = false;
|
||||
field_0x5a5 = false;
|
||||
#if TARGET_PC
|
||||
// Immediately set the door to open if the flag for it open is set
|
||||
u8 doorUnlockedFlag = (fopAcM_GetParam(this) & 0xFFFF) >> 8;
|
||||
if (mKeyParam == 0 && doorUnlockedFlag != 0xFF && fopAcM_isSwitch(this, doorUnlockedFlag)) {
|
||||
SetOpen();
|
||||
mpDoorPair->SetOpen();
|
||||
}
|
||||
#endif
|
||||
daObjCRVGATE_Execute(this);
|
||||
}
|
||||
|
||||
@@ -808,14 +831,14 @@ int daObjCRVGATE_c::Execute(Mtx** param_0) {
|
||||
int daObjCRVGATE_c::Draw() {
|
||||
g_env_light.settingTevStruct(8, ¤t.pos, &tevStr);
|
||||
g_env_light.setLightTevColorType_MAJI(mpModelGate, &tevStr);
|
||||
if (mKeyParam == 0x01) {
|
||||
if (mKeyParam == 0x01 IF_DUSK(&& mpModelKey != NULL)) {
|
||||
g_env_light.setLightTevColorType_MAJI(mpModelKey, &tevStr);
|
||||
}
|
||||
|
||||
dComIfGd_setListBG();
|
||||
|
||||
mDoExt_modelUpdateDL(mpModelGate);
|
||||
if (mKeyParam == 0x01) {
|
||||
if (mKeyParam == 0x01 IF_DUSK(&& mpModelKey != NULL)) {
|
||||
mDoExt_modelUpdateDL(mpModelKey);
|
||||
}
|
||||
|
||||
|
||||
@@ -12,6 +12,11 @@
|
||||
#include "d/d_com_inf_game.h"
|
||||
#include <cstring>
|
||||
|
||||
#if TARGET_PC
|
||||
#include "dusk/randomizer/game/stages.h"
|
||||
#include "dusk/randomizer/game/tools.h"
|
||||
#endif
|
||||
|
||||
static int daObj_Gb_Draw(obj_gb_class* i_this) {
|
||||
g_env_light.settingTevStruct(0x10, &i_this->current.pos, &i_this->tevStr);
|
||||
g_env_light.setLightTevColorType_MAJI(i_this->mModel, &i_this->tevStr);
|
||||
@@ -169,6 +174,13 @@ static int useHeapInit(fopAc_ac_c* actor) {
|
||||
static int daObj_Gb_Create(fopAc_ac_c* actor) {
|
||||
fopAcM_ct(actor, obj_gb_class);
|
||||
obj_gb_class* i_this = (obj_gb_class*)actor;
|
||||
#if TARGET_PC
|
||||
// Only spawn the added wall in randomizer if it should exist
|
||||
if (randomizer_IsActive() && getStageID() == StageIDs::Mirror_Chamber &&
|
||||
!randomizer_mirrorChamberWallShouldExist()) {
|
||||
return cPhs_ERROR_e;
|
||||
}
|
||||
#endif
|
||||
int rv = dComIfG_resLoad(&i_this->mPhase, "Obj_gb");
|
||||
|
||||
if (rv == cPhs_COMPLEATE_e) {
|
||||
|
||||
+243
-55
@@ -5,10 +5,10 @@
|
||||
|
||||
#include "d/dolzel.h" // IWYU pragma: keep
|
||||
|
||||
#include "d/actor/d_a_obj_item.h"
|
||||
#include "SSystem/SComponent/c_math.h"
|
||||
#include "d/d_a_itembase_static.h"
|
||||
#include "d/actor/d_a_obj_item.h"
|
||||
#include "d/actor/d_a_player.h"
|
||||
#include "d/d_a_itembase_static.h"
|
||||
#include "d/d_com_inf_game.h"
|
||||
#include "d/d_item.h"
|
||||
#include "d/d_item_data.h"
|
||||
@@ -17,6 +17,10 @@
|
||||
#include "m_Do/m_Do_mtx.h"
|
||||
|
||||
#if TARGET_PC
|
||||
#include "d/actor/d_a_alink.h"
|
||||
|
||||
#include "dusk/randomizer/game/tools.h"
|
||||
#include "dusk/randomizer/game/verify_item_functions.h"
|
||||
#include "dusk/frame_interpolation.h"
|
||||
#endif
|
||||
|
||||
@@ -71,7 +75,7 @@ void daItem_c::setBaseMtx() {
|
||||
if (mpModel != NULL) {
|
||||
mpModel->setBaseScale(scale);
|
||||
|
||||
switch (m_itemNo) {
|
||||
switch (M_ITEMNO_MODEL_ITEM_ID) {
|
||||
case dItemNo_GREEN_RUPEE_e:
|
||||
case dItemNo_BLUE_RUPEE_e:
|
||||
case dItemNo_YELLOW_RUPEE_e:
|
||||
@@ -158,8 +162,8 @@ void daItem_c::CreateInit() {
|
||||
mCcCyl.SetCoHitCallback(itemGetCoCallBack);
|
||||
mCcCyl.SetTgHitCallback(itemGetTgCallBack);
|
||||
|
||||
f32 cylHeight = dItem_data::getH(m_itemNo);
|
||||
f32 cylRadius = dItem_data::getR(m_itemNo);
|
||||
f32 cylHeight = dItem_data::getH(M_ITEMNO_MODEL_ITEM_ID);
|
||||
f32 cylRadius = dItem_data::getR(M_ITEMNO_MODEL_ITEM_ID);
|
||||
|
||||
if (scale.x > 1.0f) {
|
||||
cylHeight *= scale.x;
|
||||
@@ -177,6 +181,54 @@ void daItem_c::CreateInit() {
|
||||
procInitNormal();
|
||||
show();
|
||||
|
||||
#if TARGET_PC
|
||||
if (randomizer_IsActive()) {
|
||||
// Adjust item scale based on item ID
|
||||
switch(M_ITEMNO_MODEL_ITEM_ID)
|
||||
{
|
||||
case dItemNo_Randomizer_KAKERA_HEART_e:
|
||||
case dItemNo_Randomizer_UTAWA_HEART_e:
|
||||
case dItemNo_Randomizer_ARROW_1_e:
|
||||
case dItemNo_Randomizer_ARROW_10_e:
|
||||
case dItemNo_Randomizer_ARROW_20_e:
|
||||
case dItemNo_Randomizer_ARROW_30_e:
|
||||
case dItemNo_Randomizer_GREEN_RUPEE_e:
|
||||
case dItemNo_Randomizer_BLUE_RUPEE_e:
|
||||
case dItemNo_Randomizer_YELLOW_RUPEE_e:
|
||||
case dItemNo_Randomizer_RED_RUPEE_e:
|
||||
case dItemNo_Randomizer_PURPLE_RUPEE_e:
|
||||
case dItemNo_Randomizer_ORANGE_RUPEE_e:
|
||||
case dItemNo_Randomizer_SILVER_RUPEE_e:
|
||||
case dItemNo_Randomizer_HEART_e:
|
||||
{
|
||||
mItemScale.setall(1.0f);
|
||||
break;
|
||||
}
|
||||
|
||||
case dItemNo_Randomizer_BOW_e:
|
||||
{
|
||||
mItemScale.setall(1.5f);
|
||||
break;
|
||||
}
|
||||
|
||||
case dItemNo_Randomizer_MASTER_SWORD_e:
|
||||
case dItemNo_Randomizer_LIGHT_SWORD_e:
|
||||
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:
|
||||
{
|
||||
mItemScale.setall(0.7f);
|
||||
break;
|
||||
}
|
||||
default:
|
||||
{
|
||||
mItemScale.setall(2.0f);
|
||||
break;
|
||||
}
|
||||
}
|
||||
} else
|
||||
#endif
|
||||
mItemScale.setall(1.0f);
|
||||
|
||||
switch (daItem_prm::getType(this)) {
|
||||
@@ -206,9 +258,9 @@ void daItem_c::CreateInit() {
|
||||
initBaseMtx();
|
||||
animPlay(1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f);
|
||||
|
||||
if (m_itemNo == dItemNo_BOOMERANG_e) {
|
||||
if (m_itemNo == dItemNo_BOOMERANG_e IF_DUSK(&& !randomizer_IsActive())) {
|
||||
itemGetNextExecute();
|
||||
} else if ((m_itemNo == dItemNo_ORANGE_RUPEE_e || m_itemNo == dItemNo_SILVER_RUPEE_e) &&
|
||||
} else if ((M_ITEMNO_MODEL_ITEM_ID == dItemNo_ORANGE_RUPEE_e || M_ITEMNO_MODEL_ITEM_ID == dItemNo_SILVER_RUPEE_e) &&
|
||||
mSparkleEmtr.getEmitter() == NULL)
|
||||
{
|
||||
dComIfGp_particle_set(0x0C14, &mSparklePos, NULL, NULL, -1, &mSparkleEmtr, -1, NULL, NULL,
|
||||
@@ -263,10 +315,14 @@ int daItem_c::_daItem_create() {
|
||||
current.angle.x = 0;
|
||||
shape_angle.z = 0;
|
||||
shape_angle.x = 0;
|
||||
|
||||
#if TARGET_PC
|
||||
setRandomizerItem(/*setFoolishItemModel = */true);
|
||||
#endif
|
||||
field_0x95d = true;
|
||||
}
|
||||
|
||||
|
||||
|
||||
m_itemNo = daItem_prm::getItemNo(this);
|
||||
#if TARGET_PC
|
||||
if (dusk::getSettings().game.noHeartDrops && isHeart(m_itemNo)) {
|
||||
@@ -308,10 +364,10 @@ int daItem_c::_daItem_create() {
|
||||
if (flag) {
|
||||
CreateInit();
|
||||
} else {
|
||||
phase_state = dComIfG_resLoad(&mPhase, dItem_data::getFieldArc(m_itemNo));
|
||||
phase_state = dComIfG_resLoad(&mPhase, dItem_data::getFieldArc(M_ITEMNO_MODEL_ITEM_ID));
|
||||
if (phase_state == cPhs_COMPLEATE_e) {
|
||||
if (!fopAcM_entrySolidHeap(this, CheckFieldItemCreateHeap,
|
||||
dItem_data::getFieldHeapSize(m_itemNo)))
|
||||
dItem_data::getFieldHeapSize(M_ITEMNO_MODEL_ITEM_ID)))
|
||||
{
|
||||
return cPhs_ERROR_e;
|
||||
}
|
||||
@@ -328,7 +384,7 @@ int daItem_c::_daItem_execute() {
|
||||
CountTimer();
|
||||
|
||||
eyePos = current.pos;
|
||||
eyePos.y += (f32)dItem_data::getH(m_itemNo) / 2;
|
||||
eyePos.y += (f32)dItem_data::getH(M_ITEMNO_MODEL_ITEM_ID) / 2;
|
||||
|
||||
attention_info.position = current.pos;
|
||||
|
||||
@@ -370,7 +426,7 @@ int daItem_c::_daItem_execute() {
|
||||
mLastPos = current.pos;
|
||||
field_0x95f = (fopAcM_checkHookCarryNow(this) >> 0x14) & 1;
|
||||
|
||||
if (m_itemNo == dItemNo_ORANGE_RUPEE_e || m_itemNo == dItemNo_SILVER_RUPEE_e) {
|
||||
if (M_ITEMNO_MODEL_ITEM_ID == dItemNo_ORANGE_RUPEE_e || M_ITEMNO_MODEL_ITEM_ID == dItemNo_SILVER_RUPEE_e) {
|
||||
mSparklePos = current.pos;
|
||||
mSparklePos.y += 18.0f;
|
||||
}
|
||||
@@ -397,11 +453,11 @@ int daItem_c::_daItem_draw() {
|
||||
int daItem_c::_daItem_delete() {
|
||||
mSound.deleteObject();
|
||||
|
||||
if (m_itemNo == dItemNo_ORANGE_RUPEE_e || m_itemNo == dItemNo_SILVER_RUPEE_e) {
|
||||
if (M_ITEMNO_MODEL_ITEM_ID == dItemNo_ORANGE_RUPEE_e || M_ITEMNO_MODEL_ITEM_ID == dItemNo_SILVER_RUPEE_e) {
|
||||
mSparkleEmtr.remove();
|
||||
}
|
||||
|
||||
DeleteBase(dItem_data::getFieldArc(m_itemNo));
|
||||
DeleteBase(dItem_data::getFieldArc(M_ITEMNO_MODEL_ITEM_ID));
|
||||
return 1;
|
||||
}
|
||||
|
||||
@@ -499,7 +555,7 @@ void daItem_c::procMainSimpleGetDemo() {
|
||||
void daItem_c::procInitGetDemoEvent() {
|
||||
hide();
|
||||
|
||||
if (m_itemNo == dItemNo_ORANGE_RUPEE_e || m_itemNo == dItemNo_SILVER_RUPEE_e) {
|
||||
if (M_ITEMNO_MODEL_ITEM_ID == dItemNo_ORANGE_RUPEE_e || M_ITEMNO_MODEL_ITEM_ID == dItemNo_SILVER_RUPEE_e) {
|
||||
mSparkleEmtr.remove();
|
||||
}
|
||||
|
||||
@@ -507,10 +563,22 @@ void daItem_c::procInitGetDemoEvent() {
|
||||
fopAcM_orderItemEvent(this, 0, 0);
|
||||
eventInfo.onCondition(dEvtCnd_CANGETITEM_e);
|
||||
|
||||
#if TARGET_PC
|
||||
// Set rando item again incase this item is progressive and
|
||||
// player picked up another one before this one on the same stage
|
||||
u8 oldItemNo = m_itemNo;
|
||||
setRandomizerItem();
|
||||
#endif
|
||||
m_item_id = fopAcM_createItemForTrBoxDemo(¤t.pos, m_itemNo, -1, fopAcM_GetRoomNo(this),
|
||||
NULL, NULL);
|
||||
JUT_ASSERT(0, m_item_id != fpcM_ERROR_PROCESS_ID_e);
|
||||
|
||||
#if TARGET_PC
|
||||
// Set the itemNo back to the old one since the game relies on this
|
||||
// to properly delete the arc it loaded
|
||||
m_itemNo = oldItemNo;
|
||||
#endif
|
||||
|
||||
setStatus(STATUS_WAIT_GET_DEMO_EVENT_e);
|
||||
}
|
||||
|
||||
@@ -521,13 +589,21 @@ void daItem_c::procWaitGetDemoEvent() {
|
||||
dComIfGp_event_setItemPartnerId(m_item_id);
|
||||
}
|
||||
} else {
|
||||
if (m_itemNo == dItemNo_BOOMERANG_e) {
|
||||
if (m_itemNo == dItemNo_BOOMERANG_e IF_DUSK(&& !randomizer_IsActive())) {
|
||||
fopAcM_orderItemEvent(this, 0, 0);
|
||||
eventInfo.onCondition(dEvtCnd_CANGETITEM_e);
|
||||
return;
|
||||
}
|
||||
|
||||
#if TARGET_PC
|
||||
// Probably a better way to handle this, but will do for now
|
||||
// Try to play the textbox in rando if possible (except for rupees/ammo
|
||||
// and when snowboarding or swimming)
|
||||
if ((cLib_calcTimer<u8>(&field_0x9c1) == 0 && !randomizer_IsActive()) || checkItemGet(m_itemNo, 1)
|
||||
|| daPy_getPlayerActorClass()->checkBoardRide() || daAlink_getAlinkActorClass()->checkSwimming()) {
|
||||
#else
|
||||
if (cLib_calcTimer<u8>(&field_0x9c1) == 0 || checkItemGet(m_itemNo, 1)) {
|
||||
#endif
|
||||
if (fopAcM_delete(m_item_id)) {
|
||||
// "Item: Get Item deleted because Get Demo was canceled\n"
|
||||
OS_REPORT("アイテム:ゲットデモ中止されたので、ゲットアイテム削除しました\n");
|
||||
@@ -537,7 +613,8 @@ void daItem_c::procWaitGetDemoEvent() {
|
||||
|
||||
procInitSimpleGetDemo();
|
||||
itemGet();
|
||||
if (!haveItem) {
|
||||
// Don't potentially unset item bits in rando unless they're rupees
|
||||
if (!haveItem IF_DUSK(&& (!randomizer_IsActive() || isRupee(m_itemNo)))) {
|
||||
dComIfGs_offItemFirstBit(m_itemNo);
|
||||
}
|
||||
} else {
|
||||
@@ -559,8 +636,8 @@ void daItem_c::procInitBoomerangCarry() {
|
||||
scale = mItemScale;
|
||||
mBoomerangMove.initOffset(¤t.pos);
|
||||
|
||||
u8 height = dItem_data::getH(m_itemNo);
|
||||
u8 radius = dItem_data::getR(m_itemNo);
|
||||
u8 height = dItem_data::getH(M_ITEMNO_MODEL_ITEM_ID);
|
||||
u8 radius = dItem_data::getR(M_ITEMNO_MODEL_ITEM_ID);
|
||||
mCcCyl.SetR((f32)radius * 2.0f);
|
||||
mCcCyl.SetH((f32)height * 2.0f);
|
||||
mCcCyl.OnCoSPrmBit(1);
|
||||
@@ -743,7 +820,7 @@ void daItem_c::mode_wait() {
|
||||
mAcch.SetGrndNone();
|
||||
}
|
||||
|
||||
switch (m_itemNo) {
|
||||
switch (M_ITEMNO_MODEL_ITEM_ID) {
|
||||
case dItemNo_HEART_e:
|
||||
itemActionForHeart();
|
||||
break;
|
||||
@@ -756,8 +833,15 @@ void daItem_c::mode_wait() {
|
||||
itemActionForArrow();
|
||||
break;
|
||||
case dItemNo_BOOMERANG_e:
|
||||
#if TARGET_PC
|
||||
if (!randomizer_IsActive()) {
|
||||
itemActionForBoomerang();
|
||||
break;
|
||||
}
|
||||
#else
|
||||
itemActionForBoomerang();
|
||||
break;
|
||||
#endif
|
||||
case dItemNo_GREEN_RUPEE_e:
|
||||
case dItemNo_BLUE_RUPEE_e:
|
||||
case dItemNo_YELLOW_RUPEE_e:
|
||||
@@ -787,7 +871,7 @@ void daItem_c::mode_water() {
|
||||
}
|
||||
|
||||
f32 scale = 1.0f;
|
||||
switch (m_itemNo) {
|
||||
switch (M_ITEMNO_MODEL_ITEM_ID) {
|
||||
case dItemNo_HEART_e:
|
||||
scale = 0.5f;
|
||||
break;
|
||||
@@ -824,49 +908,100 @@ void daItem_c::itemGetNextExecute() {
|
||||
setFlag(FLAG_INIT_GET_ITEM_e);
|
||||
BOOL haveItem = false;
|
||||
|
||||
switch (m_itemNo) {
|
||||
case dItemNo_HEART_e:
|
||||
case dItemNo_GREEN_RUPEE_e:
|
||||
case dItemNo_ARROW_10_e:
|
||||
case dItemNo_ARROW_20_e:
|
||||
case dItemNo_ARROW_30_e:
|
||||
case dItemNo_ARROW_1_e:
|
||||
procInitSimpleGetDemo();
|
||||
itemGet();
|
||||
break;
|
||||
case dItemNo_BLUE_RUPEE_e:
|
||||
case dItemNo_YELLOW_RUPEE_e:
|
||||
case dItemNo_RED_RUPEE_e:
|
||||
case dItemNo_PURPLE_RUPEE_e:
|
||||
case dItemNo_ORANGE_RUPEE_e:
|
||||
case dItemNo_SILVER_RUPEE_e:
|
||||
case dItemNo_PACHINKO_SHOT_e:
|
||||
if (daPy_getPlayerActorClass()->checkCanoeRide() ||
|
||||
daPy_getPlayerActorClass()->checkHorseRide())
|
||||
{
|
||||
if (checkItemGet(m_itemNo, 1)) {
|
||||
haveItem = true;
|
||||
}
|
||||
#if TARGET_PC
|
||||
// Randomizer specific stuff for choosing if to play a demo or not.
|
||||
// Just copying the whole switch statement here and modifying it
|
||||
// is better than littering the original switch statement with #if TARGET_PC
|
||||
if (randomizer_IsActive()) {
|
||||
switch (m_itemNo) {
|
||||
case dItemNo_HEART_e:
|
||||
case dItemNo_GREEN_RUPEE_e:
|
||||
case dItemNo_ARROW_10_e:
|
||||
case dItemNo_ARROW_20_e:
|
||||
case dItemNo_ARROW_30_e:
|
||||
case dItemNo_ARROW_1_e:
|
||||
procInitSimpleGetDemo();
|
||||
itemGet();
|
||||
break;
|
||||
case dItemNo_BLUE_RUPEE_e:
|
||||
case dItemNo_YELLOW_RUPEE_e:
|
||||
case dItemNo_RED_RUPEE_e:
|
||||
case dItemNo_PURPLE_RUPEE_e:
|
||||
case dItemNo_ORANGE_RUPEE_e:
|
||||
case dItemNo_SILVER_RUPEE_e:
|
||||
case dItemNo_PACHINKO_SHOT_e:
|
||||
if (daPy_getPlayerActorClass()->checkCanoeRide() ||
|
||||
daPy_getPlayerActorClass()->checkHorseRide() IF_DUSK(||
|
||||
daPy_getPlayerActorClass()->checkBoardRide())) // Check snowboarding for rando
|
||||
{
|
||||
if (checkItemGet(m_itemNo, 1)) {
|
||||
haveItem = true;
|
||||
}
|
||||
procInitSimpleGetDemo();
|
||||
itemGet();
|
||||
|
||||
if (!haveItem) {
|
||||
dComIfGs_offItemFirstBit(m_itemNo);
|
||||
if (!haveItem) {
|
||||
dComIfGs_offItemFirstBit(m_itemNo);
|
||||
}
|
||||
} else if (!checkItemGet(m_itemNo, 1)) {
|
||||
procInitGetDemoEvent();
|
||||
} else {
|
||||
procInitSimpleGetDemo();
|
||||
itemGet();
|
||||
}
|
||||
} else if (!checkItemGet(m_itemNo, 1)) {
|
||||
break;
|
||||
default:
|
||||
procInitGetDemoEvent();
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
#endif
|
||||
switch (m_itemNo) {
|
||||
case dItemNo_HEART_e:
|
||||
case dItemNo_GREEN_RUPEE_e:
|
||||
case dItemNo_ARROW_10_e:
|
||||
case dItemNo_ARROW_20_e:
|
||||
case dItemNo_ARROW_30_e:
|
||||
case dItemNo_ARROW_1_e:
|
||||
procInitSimpleGetDemo();
|
||||
itemGet();
|
||||
break;
|
||||
case dItemNo_BLUE_RUPEE_e:
|
||||
case dItemNo_YELLOW_RUPEE_e:
|
||||
case dItemNo_RED_RUPEE_e:
|
||||
case dItemNo_PURPLE_RUPEE_e:
|
||||
case dItemNo_ORANGE_RUPEE_e:
|
||||
case dItemNo_SILVER_RUPEE_e:
|
||||
case dItemNo_PACHINKO_SHOT_e:
|
||||
if (daPy_getPlayerActorClass()->checkCanoeRide() ||
|
||||
daPy_getPlayerActorClass()->checkHorseRide())
|
||||
{
|
||||
if (checkItemGet(m_itemNo, 1)) {
|
||||
haveItem = true;
|
||||
}
|
||||
procInitSimpleGetDemo();
|
||||
itemGet();
|
||||
|
||||
if (!haveItem) {
|
||||
dComIfGs_offItemFirstBit(m_itemNo);
|
||||
}
|
||||
} else if (!checkItemGet(m_itemNo, 1)) {
|
||||
procInitGetDemoEvent();
|
||||
} else {
|
||||
procInitSimpleGetDemo();
|
||||
itemGet();
|
||||
}
|
||||
break;
|
||||
case dItemNo_BOOMERANG_e:
|
||||
procInitGetDemoEvent();
|
||||
break;
|
||||
default:
|
||||
// "[daItem_c] Get process not defined[%d]\n"
|
||||
OS_REPORT_ERROR("[daItem_c]ゲット処理が定義されていません[%d]\n", m_itemNo);
|
||||
}
|
||||
break;
|
||||
case dItemNo_BOOMERANG_e:
|
||||
procInitGetDemoEvent();
|
||||
break;
|
||||
default:
|
||||
// "[daItem_c] Get process not defined[%d]\n"
|
||||
OS_REPORT_ERROR("[daItem_c]ゲット処理が定義されていません[%d]\n", m_itemNo);
|
||||
#if TARGET_PC
|
||||
}
|
||||
#endif
|
||||
|
||||
fopAcM_onItem(this, mItemBitNo);
|
||||
mCcCyl.SetTgType(0);
|
||||
@@ -877,7 +1012,18 @@ void daItem_c::itemGetNextExecute() {
|
||||
}
|
||||
|
||||
void daItem_c::itemGet() {
|
||||
#if TARGET_PC
|
||||
// Set rando item again incase this item is progressive and
|
||||
// player picked up another one before this one on the same stage
|
||||
u8 oldItemNo = m_itemNo;
|
||||
setRandomizerItem();
|
||||
#endif
|
||||
switch (m_itemNo) {
|
||||
#if TARGET_PC
|
||||
// Play sound for heart pieces and containers as well (should only happen in rando)
|
||||
case dItemNo_UTAWA_HEART_e:
|
||||
case dItemNo_KAKERA_HEART_e:
|
||||
#endif
|
||||
case dItemNo_HEART_e:
|
||||
mDoAud_seStart(Z2SE_HEART_PIECE_GET, NULL, 0, 0);
|
||||
execItemGet(m_itemNo);
|
||||
@@ -911,6 +1057,10 @@ void daItem_c::itemGet() {
|
||||
execItemGet(m_itemNo);
|
||||
break;
|
||||
case dItemNo_BOOMERANG_e:
|
||||
#if TARGET_PC
|
||||
// Let boomerang fall through in rando
|
||||
if (!randomizer_IsActive())
|
||||
#endif
|
||||
break;
|
||||
case dItemNo_ARROW_10_e:
|
||||
case dItemNo_ARROW_20_e:
|
||||
@@ -919,11 +1069,24 @@ void daItem_c::itemGet() {
|
||||
case dItemNo_PACHINKO_SHOT_e:
|
||||
mDoAud_seStart(Z2SE_CONSUMP_ITEM_GET, NULL, 0, 0);
|
||||
execItemGet(m_itemNo);
|
||||
#if TARGET_PC
|
||||
break;
|
||||
#endif
|
||||
default:
|
||||
#if TARGET_PC
|
||||
if (randomizer_IsActive()) {
|
||||
// Some kind of sound should play, otherwise it feels weird
|
||||
mDoAud_seStart(Z2SE_CONSUMP_ITEM_GET, NULL, 0, 0);
|
||||
execItemGet(m_itemNo);
|
||||
}
|
||||
#endif
|
||||
// "[daItem_c] Get process not defined[%d]\n"
|
||||
OS_REPORT_ERROR("[daItem_c]ゲット処理が定義されていません[%d]\n", m_itemNo);
|
||||
break;
|
||||
}
|
||||
#if TARGET_PC
|
||||
m_itemNo = oldItemNo;
|
||||
#endif
|
||||
}
|
||||
|
||||
BOOL daItem_c::checkCountTimer() {
|
||||
@@ -1086,6 +1249,31 @@ void daItem_c::set_bound_se() {
|
||||
}
|
||||
}
|
||||
|
||||
#if TARGET_PC
|
||||
void daItem_c::setRandomizerItem(bool setFoolishItemModel) {
|
||||
if (randomizer_IsActive()) {
|
||||
u32 params = fopAcM_GetParam(this);
|
||||
u8 flag = daItem_prm::getItemBitNo(this);
|
||||
u8 stageIdx = getStageID();
|
||||
u16 key = (stageIdx << 8) | flag;
|
||||
auto& freestandingOverrides = randomizer_GetContext().mFreestandingItemOverrides;
|
||||
// If we found an override for this freestanding item
|
||||
if (freestandingOverrides.contains(key)) {
|
||||
// Clear the itemId and set it to out new itemId
|
||||
params &= 0xFFFFFF00;
|
||||
u8 newItemId = freestandingOverrides[key];
|
||||
params |= verifyProgressiveItem(newItemId);
|
||||
fopAcM_SetParam(this, params);
|
||||
m_itemNo = daItem_prm::getItemNo(this);
|
||||
// Set the ice trap model if this is an ice trap, and it isn't set
|
||||
if (setFoolishItemModel && m_itemNo == dItemNo_Randomizer_FOOLISH_ITEM_e && home.angle.z == 0) {
|
||||
home.angle.z = randomizer_getRandomFoolishItemModelID();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
s32 daItem_c::m_timer_max = 10000;
|
||||
|
||||
int daItem_c::CountTimer() {
|
||||
|
||||
@@ -12,6 +12,14 @@
|
||||
#include "SSystem/SComponent/c_math.h"
|
||||
#include <cstring>
|
||||
|
||||
#if TARGET_PC
|
||||
#include "d/actor/d_a_alink.h"
|
||||
#include "dusk/randomizer/game/flags.h"
|
||||
#include "dusk/randomizer/game/tools.h"
|
||||
#include "dusk/randomizer/game/verify_item_functions.h"
|
||||
#include "dusk/randomizer/game/stages.h"
|
||||
#endif
|
||||
|
||||
const static dCcD_SrcCyl l_cyl_src = {
|
||||
{
|
||||
{0x0, {{0x0, 0x0, 0x0}, {0xffffffff, 0x11}, 0x59}}, // mObj
|
||||
@@ -87,8 +95,8 @@ int daObjLife_c::Create() {
|
||||
mCcCyl.SetStts(&mCcStts);
|
||||
mCcCyl.SetCoHitCallback(lifeGetCoCallBack);
|
||||
mCcCyl.SetTgHitCallback(lifeGetTgCallBack);
|
||||
mCcCyl.SetR(dItem_data::getR(m_itemNo));
|
||||
mCcCyl.SetH(dItem_data::getH(m_itemNo));
|
||||
mCcCyl.SetR(dItem_data::getR(M_ITEMNO_MODEL_ITEM_ID));
|
||||
mCcCyl.SetH(dItem_data::getH(M_ITEMNO_MODEL_ITEM_ID));
|
||||
|
||||
fopAcM_SetCullSize(this, fopAc_CULLSPHERE_0_e);
|
||||
fopAcM_SetGravity(this, -3.2f);
|
||||
@@ -97,12 +105,63 @@ int daObjLife_c::Create() {
|
||||
field_0x94c = 0.7f;
|
||||
mRotateSpeed = 7000;
|
||||
|
||||
#if TARGET_PC
|
||||
if (randomizer_IsActive()) {
|
||||
// Turn off the gravity for certain checks (i.e. ones that need to be on walls)
|
||||
u8 stageIdx = getStageID();
|
||||
u8 flag = getSaveBitNo();
|
||||
u16 key = (stageIdx << 8) | flag;
|
||||
|
||||
static constexpr auto hoveringChecks = std::to_array({
|
||||
0x109F, // Zant Heart Container (so it doesn't fall through the floor)
|
||||
0x199F, // Stallord Heart Container (so it doens't fall through the floor)
|
||||
0x3698, // Sacred Grove Female Snail
|
||||
0x3699, // Sacred Grove Male Snail
|
||||
0x3892, // Lake Hylia Bridge Female Mantis
|
||||
0x3893, // Lake Hylia Bridge Male Mantis
|
||||
0x3896, // Bridge of Eldin Female Phasmid
|
||||
0x3897, // Bridge of Eldin Male Phasmid
|
||||
0x389A, // Lanayru Field Female Stag Beetle
|
||||
0x389B, // Lanayru Field Male Stag Beetle
|
||||
0x389E, // Faron Field Female Beetle
|
||||
0x389F, // Faron Field Male Beetle
|
||||
0x3D9E, // Upper Zoras River Female Dragonfly
|
||||
});
|
||||
|
||||
if (std::ranges::find(hoveringChecks, key) != hoveringChecks.end()) {
|
||||
mRotateSpeed = 550; // Rotate speed when on the ground
|
||||
fopAcM_SetGravity(this, 0.f);
|
||||
}
|
||||
|
||||
// TODO: rando Foolish item stuff
|
||||
}
|
||||
#endif
|
||||
setEffect();
|
||||
mSound.init(¤t.pos, 1);
|
||||
return 1;
|
||||
}
|
||||
|
||||
void daObjLife_c::setEffect() {
|
||||
#if TARGET_PC
|
||||
if (randomizer_IsActive()) {
|
||||
// In randomizer, we don't want rupees or poe souls to sparkle. They are bright enough.
|
||||
switch(M_ITEMNO_MODEL_ITEM_ID)
|
||||
{
|
||||
case dItemNo_Randomizer_GREEN_RUPEE_e:
|
||||
case dItemNo_Randomizer_BLUE_RUPEE_e:
|
||||
case dItemNo_Randomizer_RED_RUPEE_e:
|
||||
case dItemNo_Randomizer_YELLOW_RUPEE_e:
|
||||
case dItemNo_Randomizer_LINKS_SAVINGS_e:
|
||||
case dItemNo_Randomizer_PURPLE_RUPEE_e:
|
||||
case dItemNo_Randomizer_ORANGE_RUPEE_e:
|
||||
case dItemNo_Randomizer_SILVER_RUPEE_e:
|
||||
case dItemNo_Randomizer_POU_SPIRIT_e:
|
||||
return;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
cXyz size(1.5f, 1.5f, 1.5f);
|
||||
|
||||
if (mEffect0.getEmitter() == NULL) {
|
||||
@@ -140,6 +199,139 @@ int daObjLife_c::create() {
|
||||
home.angle.x = home.angle.z = 0;
|
||||
current.angle.x = current.angle.z = 0;
|
||||
shape_angle.x = shape_angle.z = 0;
|
||||
#if TARGET_PC
|
||||
if (randomizer_IsActive()) {
|
||||
// Overwrite the item for this location in randomizer
|
||||
u32 params = fopAcM_GetParam(this);
|
||||
u8 itemId = params & 0xFF;
|
||||
u8 roomNo = fopAcM_GetRoomNo(this);
|
||||
// If this is a golden wolf replacement, handle it differently
|
||||
if (itemId == dItemNo_Randomizer_ENDING_BLOW_e) {
|
||||
auto goldenWolfFlags = getCurrentGoldenWolfFlags(roomNo);
|
||||
// Don't spawn this item if we haven't howled at the howling stone, or if we've already
|
||||
// obtained the item
|
||||
if ((goldenWolfFlags.howledAtStoneFlag != 0xFFFF && !dComIfGs_isEventBit(goldenWolfFlags.howledAtStoneFlag)) ||
|
||||
dComIfGs_isEventBit(goldenWolfFlags.obtainedItemFlag)) {
|
||||
return cPhs_ERROR_e;
|
||||
}
|
||||
// Store the map marker flag and obtained item flags to turn off/on later if
|
||||
// the player collects the item
|
||||
home.angle.z = goldenWolfFlags.mapMarkerFlag;
|
||||
home.angle.x = static_cast<s16>(goldenWolfFlags.obtainedItemFlag);
|
||||
// Set the overriden item id
|
||||
auto& goldenWolfOverrides = randomizer_GetContext().mGoldenWolfOverrides;
|
||||
itemId = verifyProgressiveItem(goldenWolfOverrides[goldenWolfFlags.obtainedItemFlag]);
|
||||
} else if (getStageID() == Ook) {
|
||||
// Special case for Gale Boomerang check
|
||||
itemId = verifyProgressiveItem(randomizer_getItemAtLocation("Forest Temple Gale Boomerang"));
|
||||
// Set rando custom collection flag
|
||||
dComIfGs_onItem(0x9D, -1);
|
||||
} else {
|
||||
u8 flag = getSaveBitNo();
|
||||
u8 stageIdx = getStageID();
|
||||
u16 key = (stageIdx << 8) | flag;
|
||||
const auto& freestandingOverrides = randomizer_GetContext().mFreestandingItemOverrides;
|
||||
// If we found an override for this freestanding item
|
||||
if (freestandingOverrides.contains(key)) {
|
||||
// Clear the itemId and set it to out new itemId
|
||||
u8 overrideItem = freestandingOverrides.at(key);
|
||||
itemId = verifyProgressiveItem(overrideItem);
|
||||
}
|
||||
}
|
||||
|
||||
params &= 0xFFFFFF00;
|
||||
params |= itemId;
|
||||
fopAcM_SetParam(this, params);
|
||||
|
||||
if (itemId == dItemNo_Randomizer_FOOLISH_ITEM_e) {
|
||||
home.angle.z = randomizer_getRandomFoolishItemModelID();
|
||||
}
|
||||
|
||||
// Also adjust the height of the object depending on the item
|
||||
switch (itemId == dItemNo_Randomizer_FOOLISH_ITEM_e ? home.angle.z : itemId) {
|
||||
case dItemNo_Randomizer_MASTER_SWORD_e:
|
||||
case dItemNo_Randomizer_LIGHT_SWORD_e:
|
||||
case dItemNo_Randomizer_WOOD_SHIELD_e:
|
||||
case dItemNo_Randomizer_HYLIA_SHIELD_e:
|
||||
case dItemNo_Randomizer_SHIELD_e:
|
||||
case dItemNo_Randomizer_SPINNER_e:
|
||||
{
|
||||
current.pos.y += 30.f;
|
||||
break;
|
||||
}
|
||||
case dItemNo_Randomizer_WOOD_STICK_e:
|
||||
{
|
||||
current.pos.y += 60.f;
|
||||
break;
|
||||
}
|
||||
case dItemNo_Randomizer_SWORD_e:
|
||||
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:
|
||||
case dItemNo_Randomizer_FUSED_SHADOW_1_e:
|
||||
case dItemNo_Randomizer_FUSED_SHADOW_2_e:
|
||||
case dItemNo_Randomizer_FUSED_SHADOW_3_e:
|
||||
case dItemNo_Randomizer_COPY_ROD_e:
|
||||
case dItemNo_Randomizer_COPY_ROD_2_e:
|
||||
{
|
||||
current.pos.y += 50.f;
|
||||
break;
|
||||
}
|
||||
|
||||
case dItemNo_Randomizer_BOW_e:
|
||||
{
|
||||
current.pos.y += 55.f;
|
||||
break;
|
||||
}
|
||||
case dItemNo_Randomizer_BOOMERANG_e:
|
||||
case dItemNo_Randomizer_FISHING_ROD_1_e:
|
||||
case dItemNo_Randomizer_ARROW_LV2_e:
|
||||
case dItemNo_Randomizer_ARROW_LV3_e:
|
||||
{
|
||||
current.pos.y += 40.f;
|
||||
break;
|
||||
}
|
||||
case dItemNo_Randomizer_FOREST_SMALL_KEY_e:
|
||||
case dItemNo_Randomizer_MINES_SMALL_KEY_e:
|
||||
case dItemNo_Randomizer_LAKEBED_SMALL_KEY_e:
|
||||
case dItemNo_Randomizer_ARBITERS_SMALL_KEY_e:
|
||||
case dItemNo_Randomizer_SNOWPEAK_SMALL_KEY_e:
|
||||
case dItemNo_Randomizer_TEMPLE_OF_TIME_SMALL_KEY_e:
|
||||
case dItemNo_Randomizer_CITY_SMALL_KEY_e:
|
||||
case dItemNo_Randomizer_PALACE_SMALL_KEY_e:
|
||||
case dItemNo_Randomizer_HYRULE_SMALL_KEY_e:
|
||||
case dItemNo_Randomizer_FOREST_BOSS_KEY_e:
|
||||
case dItemNo_Randomizer_LAKEBED_BOSS_KEY_e:
|
||||
case dItemNo_Randomizer_ARBITERS_BOSS_KEY_e:
|
||||
case dItemNo_Randomizer_TEMPLE_OF_TIME_BOSS_KEY_e:
|
||||
case dItemNo_Randomizer_CITY_BOSS_KEY_e:
|
||||
case dItemNo_Randomizer_PALACE_BOSS_KEY_e:
|
||||
case dItemNo_Randomizer_HYRULE_BOSS_KEY_e:
|
||||
case dItemNo_Randomizer_SMALL_KEY2_e:
|
||||
case dItemNo_Randomizer_LV5_BOSS_KEY_e:
|
||||
case dItemNo_Randomizer_CAMP_SMALL_KEY_e:
|
||||
case dItemNo_Randomizer_BOSSRIDER_KEY_e:
|
||||
case dItemNo_Randomizer_PACHINKO_e:
|
||||
case dItemNo_Randomizer_BOMB_BAG_LV2_e:
|
||||
case dItemNo_Randomizer_BOMB_BAG_LV1_e:
|
||||
case dItemNo_Randomizer_BOMB_IN_BAG_e:
|
||||
case dItemNo_Randomizer_NORMAL_BOMB_e:
|
||||
case dItemNo_Randomizer_POU_SPIRIT_e:
|
||||
{
|
||||
current.pos.y += 20.f;
|
||||
break;
|
||||
}
|
||||
case dItemNo_Randomizer_ARMOR_e:
|
||||
{
|
||||
current.pos.y += 25.f;
|
||||
break;
|
||||
}
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
mIsPrmsInit = true;
|
||||
}
|
||||
|
||||
@@ -153,11 +345,12 @@ int daObjLife_c::create() {
|
||||
return cPhs_ERROR_e;
|
||||
}
|
||||
|
||||
if (m_itemNo == dItemNo_UTAWA_HEART_e && dComIfGs_isStageLife()) {
|
||||
// Don't return an error here in randomizer
|
||||
if (m_itemNo == dItemNo_UTAWA_HEART_e && dComIfGs_isStageLife() IF_DUSK(&& !randomizer_IsActive())) {
|
||||
return cPhs_ERROR_e;
|
||||
}
|
||||
|
||||
int phase_state = dComIfG_resLoad(&mPhase, dItem_data::getFieldArc(m_itemNo));
|
||||
int phase_state = dComIfG_resLoad(&mPhase, dItem_data::getFieldArc(M_ITEMNO_MODEL_ITEM_ID));
|
||||
if (phase_state == cPhs_COMPLEATE_e) {
|
||||
if (!fopAcM_entrySolidHeap(this, CheckFieldItemCreateHeap, 0x4000)) {
|
||||
return cPhs_ERROR_e;
|
||||
@@ -306,7 +499,16 @@ int daObjLife_c::initActionOrderGetDemo() {
|
||||
int daObjLife_c::actionOrderGetDemo() {
|
||||
if (eventInfo.checkCommandItem()) {
|
||||
setStatus(STATUS_GET_DEMO_e);
|
||||
|
||||
|
||||
#if TARGET_PC
|
||||
// Set the tracker flag for rando now. The flag doesn't normally
|
||||
// get set until after execItemGive runs
|
||||
if (randomizer_IsActive()) {
|
||||
g_randomizerState.mTrackerTempItemFlag.flag = getSaveBitNo();
|
||||
g_randomizerState.mTrackerTempItemFlag.stage = getStageSaveId(getStageID());
|
||||
}
|
||||
#endif
|
||||
|
||||
if (mItemId != fpcM_ERROR_PROCESS_ID_e) {
|
||||
dComIfGp_event_setItemPartnerId(mItemId);
|
||||
}
|
||||
@@ -327,6 +529,19 @@ int daObjLife_c::actionGetDemo() {
|
||||
if (savebit != 0xFF) {
|
||||
fopAcM_onItem(this, savebit);
|
||||
}
|
||||
#if TARGET_PC
|
||||
// In randomizer, turn off the map marker flag for this golden wolf replacement item
|
||||
// if we're collecting it. We store the map marker flag in unused home.angle.z
|
||||
// Also set the flag for having collected this golden wolf item, stored in home.angle.x
|
||||
if (randomizer_IsActive()) {
|
||||
if (static_cast<u16>(home.angle.z) != 0xFFFF) {
|
||||
dComIfGs_offSwitch(static_cast<u16>(home.angle.z), fopAcM_GetRoomNo(this));
|
||||
}
|
||||
if (static_cast<u16>(home.angle.x) != 0xFFFF) {
|
||||
dComIfGs_onEventBit(static_cast<u16>(home.angle.x));
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
if (m_itemNo == dItemNo_KAKERA_HEART_e) {
|
||||
if (strcmp(dComIfGp_getStartStageName(), "F_SP121") == 0) {
|
||||
@@ -360,8 +575,8 @@ int daObjLife_c::actionInitBoomerangCarry() {
|
||||
mCcCyl.OnTgSPrmBit(1);
|
||||
mCcCyl.OnCoSPrmBit(1);
|
||||
|
||||
f32 height = dItem_data::getH(m_itemNo) * 4.0f;
|
||||
f32 radius = dItem_data::getR(m_itemNo) * 4.0f;
|
||||
f32 height = dItem_data::getH(M_ITEMNO_MODEL_ITEM_ID) * 4.0f;
|
||||
f32 radius = dItem_data::getR(M_ITEMNO_MODEL_ITEM_ID) * 4.0f;
|
||||
mCcCyl.SetR(radius);
|
||||
mCcCyl.SetH(height);
|
||||
|
||||
@@ -395,8 +610,40 @@ int daObjLife_c::actionWait2() {
|
||||
}
|
||||
|
||||
void daObjLife_c::calcScale() {
|
||||
#if TARGET_PC
|
||||
// If rando is active, make certain modifications
|
||||
f32 newScale = 1.0f;
|
||||
if (randomizer_IsActive()) {
|
||||
// Change scale for certain items
|
||||
switch (M_ITEMNO_MODEL_ITEM_ID) {
|
||||
case dItemNo_Randomizer_KAKERA_HEART_e:
|
||||
case dItemNo_Randomizer_UTAWA_HEART_e:
|
||||
case dItemNo_Randomizer_ARROW_10_e:
|
||||
case dItemNo_Randomizer_ARROW_20_e:
|
||||
case dItemNo_Randomizer_ARROW_30_e:
|
||||
newScale = 1.0f;
|
||||
break;
|
||||
case dItemNo_Randomizer_BOW_e:
|
||||
newScale = 1.5f;
|
||||
break;
|
||||
case dItemNo_Randomizer_MASTER_SWORD_e:
|
||||
case dItemNo_Randomizer_LIGHT_SWORD_e:
|
||||
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:
|
||||
newScale = 0.7f;
|
||||
break;
|
||||
default:
|
||||
newScale = 2.0f;
|
||||
}
|
||||
}
|
||||
cLib_chaseF(&field_0x954, newScale, 0.2f);
|
||||
if (field_0x954 == newScale) {
|
||||
#else
|
||||
cLib_chaseF(&field_0x954, 1.0f, 0.2f);
|
||||
if (field_0x954 == 1.0f) {
|
||||
#endif
|
||||
cLib_chaseF(&field_0x94c, 0.0f, 0.05f);
|
||||
field_0x950 = field_0x94c * cM_ssin(field_0x95e * 3000);
|
||||
|
||||
@@ -482,7 +729,7 @@ int daObjLife_c::_delete() {
|
||||
endEffect00();
|
||||
endEffect02();
|
||||
|
||||
DeleteBase(dItem_data::getFieldArc(m_itemNo));
|
||||
DeleteBase(dItem_data::getFieldArc(M_ITEMNO_MODEL_ITEM_ID));
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
@@ -45,6 +45,21 @@ void daObjMasterSword_c::executeWait() {
|
||||
}
|
||||
|
||||
if (fopAcM_checkCarryNow(this)) {
|
||||
#if TARGET_PC
|
||||
// In rando, give the master sword and shadow crystal location items
|
||||
if (randomizer_IsActive()) {
|
||||
u8 itemToGive = randomizer_getItemAtLocation("Sacred Grove Pedestal Master Sword");
|
||||
g_randomizerState.addItemToEventQueue(itemToGive);
|
||||
|
||||
itemToGive = randomizer_getItemAtLocation("Sacred Grove Pedestal Shadow Crystal");
|
||||
g_randomizerState.addItemToEventQueue(itemToGive);
|
||||
|
||||
// Set the necessary flags to de-spawn the MS and set the save file event flag.
|
||||
dComIfGs_onTmpBit(0x820);
|
||||
dComIfGs_onEventBit(0x2120);
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
dMeter2Info_setCloth(dItemNo_WEAR_KOKIRI_e, false);
|
||||
fopAcM_orderMapToolEvent(this, getEventID(), 0xFF, 0xFFFF, 1, 0);
|
||||
}
|
||||
@@ -186,6 +201,13 @@ int daObjMasterSword_c::execute() {
|
||||
mBrk.play();
|
||||
|
||||
if (dComIfGs_isTmpBit(dSv_event_tmp_flag_c::tempBitLabels[73])) {
|
||||
#if TARGET_PC
|
||||
// Don't automatically give the master sword in randomizer
|
||||
if (randomizer_IsActive()) {
|
||||
fopAcM_delete(this);
|
||||
return 1;
|
||||
}
|
||||
#endif
|
||||
dComIfGs_onItemFirstBit(dItemNo_MASTER_SWORD_e);
|
||||
dMeter2Info_setSword(dItemNo_MASTER_SWORD_e, false);
|
||||
dComIfGs_setSelectEquipSword(dItemNo_MASTER_SWORD_e);
|
||||
|
||||
@@ -108,7 +108,15 @@ int daItemShield_c::__CreateHeap() {
|
||||
|
||||
int daItemShield_c::create() {
|
||||
fopAcM_ct(this, daItemShield_c);
|
||||
m_itemNo = dItemNo_WOOD_SHIELD_e;
|
||||
m_itemNo = IF_DUSK(randomizer_IsActive() ? randomizer_getItemAtLocation("Ordon Shield") : ) dItemNo_WOOD_SHIELD_e;
|
||||
#if TARGET_PC
|
||||
// Use home.angle.x as a check to see if we've set the foolish item model or not
|
||||
// Otherwise we end up setting it twice
|
||||
if (randomizer_IsActive() && m_itemNo == dItemNo_Randomizer_FOOLISH_ITEM_e && home.angle.x != 0) {
|
||||
home.angle.z = randomizer_getRandomFoolishItemModelID();
|
||||
home.angle.x = 0;
|
||||
}
|
||||
#endif
|
||||
if (fopAcM_isSwitch(this, getSwBit2())) {
|
||||
OS_REPORT("木の盾:もう取ったので出ません\n");
|
||||
return cPhs_ERROR_e;
|
||||
@@ -119,7 +127,7 @@ int daItemShield_c::create() {
|
||||
if (getSwBit() == 0xff) {
|
||||
OS_REPORT("[43;30m木の盾:スイッチビット指定がありません!\n\x1b[m");
|
||||
}
|
||||
int rv = dComIfG_resLoad(&mPhase, dItem_data::getFieldArc(m_itemNo));
|
||||
int rv = dComIfG_resLoad(&mPhase, dItem_data::getFieldArc(M_ITEMNO_MODEL_ITEM_ID));
|
||||
if (rv == cPhs_COMPLEATE_e) {
|
||||
if (fopAcM_entrySolidHeap(this, CheckFieldItemCreateHeap, 0x820) == 0) {
|
||||
return cPhs_ERROR_e;
|
||||
@@ -240,6 +248,11 @@ int daItemShield_c::initActionOrderGetDemo() {
|
||||
daItemBase_c::hide();
|
||||
fopAcM_orderItemEvent(this, 0, 0);
|
||||
eventInfo.onCondition(dEvtCnd_CANGETITEM_e);
|
||||
#if TARGET_PC
|
||||
if (randomizer_IsActive()) {
|
||||
randomizer_setTempFlagForLocation("Ordon Shield");
|
||||
}
|
||||
#endif
|
||||
mItemId =
|
||||
fopAcM_createItemForTrBoxDemo(¤t.pos, m_itemNo, -1, fopAcM_GetRoomNo(this), 0, 0);
|
||||
JUT_ASSERT(682, mItemId != fpcM_ERROR_PROCESS_ID_e)
|
||||
@@ -338,7 +351,7 @@ int daItemShield_c::draw() {
|
||||
}
|
||||
|
||||
int daItemShield_c::_delete() {
|
||||
daItemBase_c::DeleteBase(dItem_data::getFieldArc(m_itemNo));
|
||||
daItemBase_c::DeleteBase(dItem_data::getFieldArc(M_ITEMNO_MODEL_ITEM_ID));
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
@@ -13,6 +13,9 @@
|
||||
#include "f_op/f_op_camera_mng.h"
|
||||
#include <cstring>
|
||||
|
||||
#include "d/actor/d_a_tboxSw.h"
|
||||
#include "dusk/randomizer/game/tools.h"
|
||||
|
||||
const static dCcD_SrcCyl l_cyl_src = {
|
||||
{
|
||||
{0x0, {{0x0, 0x0, 0x0}, {0xffffffff, 0x11}, 0x59}}, // mObj
|
||||
@@ -156,8 +159,16 @@ int daKey_c::create() {
|
||||
}
|
||||
|
||||
m_itemNo = dItemNo_SMALL_KEY_e;
|
||||
#if TARGET_PC
|
||||
if (randomizer_IsActive()) {
|
||||
u8 stage = getStageID();
|
||||
u8 flag = getSaveBitNo();
|
||||
u16 key = (stage << 8) | flag;
|
||||
m_itemNo = randomizer_GetContext().mFreestandingItemOverrides[key];
|
||||
}
|
||||
#endif
|
||||
|
||||
if (strcmp(dComIfGp_getStartStageName(), "F_SP118") == 0) {
|
||||
if (strcmp(dComIfGp_getStartStageName(), "F_SP118") == 0 IF_DUSK(&& !randomizer_IsActive())) {
|
||||
OS_REPORT(" SMKEY 0\n");
|
||||
if (dComIfGs_isTbox(getSaveBitNo())) {
|
||||
OS_REPORT(" SMKEY 1\n");
|
||||
|
||||
@@ -15,6 +15,10 @@
|
||||
#include "f_op/f_op_msg_mng.h"
|
||||
#include "f_op/f_op_msg.h"
|
||||
|
||||
#if TARGET_PC
|
||||
#include "dusk/randomizer/game/tools.h"
|
||||
#endif
|
||||
|
||||
static int CheckCreateHeap(fopAc_ac_c* param_0) {
|
||||
return ((daObjSwBallC_c*)param_0)->CreateHeap();
|
||||
}
|
||||
@@ -77,6 +81,15 @@ int daObjSwBallC_c::Create() {
|
||||
if (fopAcM_isSwitch(this, 0x3d) && fopAcM_isSwitch(this, 0x3e)) {
|
||||
field_0x574->setPlaySpeed(1.0f);
|
||||
field_0x574->setFrame(field_0x574->getEndFrame());
|
||||
#if TARGET_PC
|
||||
// If randomizer, create the randomized item for
|
||||
// Palace of Twilight Collect Both Sols
|
||||
if (randomizer_IsActive()) {
|
||||
cXyz scale{1.0f, 1.0f, 1.0f};
|
||||
cXyz position{250.0f, -200.0f, 11000.0f};
|
||||
initCreatePlayerItem(dItemNo_Randomizer_WOOD_STICK_e, 0x81, &position, fopAcM_GetRoomNo(this), &shape_angle, &scale);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
GXColor* color = mModel->getModelData()->getMaterialNodePointer(0)->getTevKColor(1);
|
||||
color->r = l_color.r;
|
||||
@@ -143,6 +156,29 @@ static DUSK_CONSTEXPR char DUSK_CONST* action_table[13] = {
|
||||
|
||||
void daObjSwBallC_c::actionWait() {
|
||||
if (fopAcM_isSwitch(this, 0x3d) && fopAcM_isSwitch(this, 0x3e)) {
|
||||
#if TARGET_PC
|
||||
// Don't play the cutscene in rando, just spawn in the item for
|
||||
// Palace of Twilight Collect Both Sols
|
||||
if (randomizer_IsActive()) {
|
||||
dComIfGs_onTbox(10);
|
||||
dComIfGs_onTbox(11);
|
||||
|
||||
// Shrink the light balls
|
||||
calcLightBallScale();
|
||||
|
||||
// Play the animation of the light going to the center
|
||||
field_0x574->setPlaySpeed(1.0f);
|
||||
if (field_0x574->play() != 0 && !fopAcM_isSwitch(this, 0x3F)) {
|
||||
// When it finishes, spawn the item
|
||||
fopAcM_onSwitch(this, 0x3f); // Saw light sword cutscene
|
||||
fopAcM_onSwitch(this, 0x27); // Midna text after light sword cutscene
|
||||
cXyz scale{1.0f, 1.0f, 1.0f};
|
||||
cXyz position{250.0f, -200.0f, 11000.0f};
|
||||
initCreatePlayerItem(dItemNo_Randomizer_WOOD_STICK_e, 0x81, &position, fopAcM_GetRoomNo(this), &shape_angle, &scale);
|
||||
}
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
setAction(1);
|
||||
fopAcM_orderOtherEventId(this, field_0x57c, field_0x57e, 0xffff, 0, 1);
|
||||
eventInfo.onCondition(2);
|
||||
|
||||
@@ -9,6 +9,9 @@
|
||||
#include "d/actor/d_a_player.h"
|
||||
#include "d/d_com_inf_game.h"
|
||||
#include "d/d_item_data.h"
|
||||
#if TARGET_PC
|
||||
#include "dusk/randomizer/game/verify_item_functions.h"
|
||||
#endif
|
||||
|
||||
static DUSK_CONSTEXPR cull_box l_cull_box = {{-200.0f, 0.0f, -200.0f}, {200.0f, 100.0f, 200.0f}};
|
||||
|
||||
@@ -36,12 +39,20 @@ int daObjSword_c::Create() {
|
||||
|
||||
cPhs_Step daObjSword_c::create() {
|
||||
fopAcM_ct(this, daObjSword_c);
|
||||
m_itemNo = 0x28;
|
||||
m_itemNo = IF_DUSK(randomizer_IsActive() ? verifyProgressiveItem(randomizer_getItemAtLocation("Ordon Sword")): ) 0x28;
|
||||
#if TARGET_PC
|
||||
// Use home.angle.x as a check to see if we've set the foolish item model or not.
|
||||
// Otherwise we end up setting it twice
|
||||
if (randomizer_IsActive() && m_itemNo == dItemNo_Randomizer_FOOLISH_ITEM_e && home.angle.x != 0) {
|
||||
home.angle.z = randomizer_getRandomFoolishItemModelID();
|
||||
home.angle.x = 0;
|
||||
}
|
||||
#endif
|
||||
if (fopAcM_isItem(this, getItemBit())) {
|
||||
return cPhs_ERROR_e;
|
||||
}
|
||||
|
||||
cPhs_Step phase = dComIfG_resLoad(&mPhase, dItem_data::getFieldArc(m_itemNo));
|
||||
cPhs_Step phase = dComIfG_resLoad(&mPhase, dItem_data::getFieldArc(M_ITEMNO_MODEL_ITEM_ID));
|
||||
if (phase == cPhs_COMPLEATE_e) {
|
||||
if (!fopAcM_entrySolidHeap(this, CheckFieldItemCreateHeap, 0x4000)) {
|
||||
return cPhs_ERROR_e;
|
||||
@@ -71,6 +82,11 @@ int daObjSword_c::initActionOrderGetDemo() {
|
||||
hide();
|
||||
fopAcM_orderItemEvent(this, 0, 0);
|
||||
eventInfo.onCondition(8);
|
||||
#if TARGET_PC
|
||||
if (randomizer_IsActive()) {
|
||||
randomizer_setTempFlagForLocation("Ordon Sword");
|
||||
}
|
||||
#endif
|
||||
mProcID = fopAcM_createItemForTrBoxDemo(¤t.pos, m_itemNo, -1, fopAcM_GetRoomNo(this),
|
||||
NULL, NULL);
|
||||
setStatus(1);
|
||||
@@ -120,7 +136,7 @@ int daObjSword_c::draw() {
|
||||
}
|
||||
|
||||
int daObjSword_c::_delete() {
|
||||
DeleteBase(dItem_data::getFieldArc(m_itemNo));
|
||||
DeleteBase(dItem_data::getFieldArc(M_ITEMNO_MODEL_ITEM_ID));
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
@@ -11,6 +11,10 @@
|
||||
#include "d/d_com_inf_game.h"
|
||||
#include "d/d_item_data.h"
|
||||
#include "d/d_s_play.h"
|
||||
#if TARGET_PC
|
||||
#include "dusk/randomizer/game/flags.h"
|
||||
#include "dusk/randomizer/game/verify_item_functions.h"
|
||||
#endif
|
||||
|
||||
const static dCcD_SrcCyl l_cyl_src = {
|
||||
{
|
||||
@@ -255,6 +259,12 @@ int daObjWStatue_c::initActionOrderGetDemo() {
|
||||
s16 eventIdx = dComIfGp_getEventManager().getEventIdx(this, "DEFAULT_GETITEM", 0xff);
|
||||
dComIfGp_getEvent()->reset(this);
|
||||
fopAcM_orderChangeEventId(this, eventIdx, 1, 0xffff);
|
||||
#if TARGET_PC
|
||||
// Set the item before the demo again incase the player collected something else and then came back
|
||||
if (randomizer_IsActive()) {
|
||||
m_itemNo = verifyProgressiveItem(randomizer_getItemAtLocation("Wooden Statue"));
|
||||
}
|
||||
#endif
|
||||
mItemId = fopAcM_createItemForTrBoxDemo(¤t.pos, m_itemNo, 0xffffffff,
|
||||
fopAcM_GetRoomNo(this), 0, 0);
|
||||
JUT_ASSERT(544, mItemId != fpcM_ERROR_PROCESS_ID_e);
|
||||
|
||||
@@ -11,6 +11,10 @@
|
||||
#include "d/d_a_itembase_static.h"
|
||||
#include "f_pc/f_pc_name.h"
|
||||
|
||||
#if TARGET_PC
|
||||
#include "dusk/randomizer/game/verify_item_functions.h"
|
||||
#endif
|
||||
|
||||
void daObjZCloth_c::initBaseMtx() {
|
||||
mpModel->setBaseScale(scale);
|
||||
setBaseMtx();
|
||||
@@ -32,7 +36,34 @@ int daObjZCloth_c::Create() {
|
||||
int daObjZCloth_c::create() {
|
||||
fopAcM_ct(this, daObjZCloth_c);
|
||||
m_itemNo = 0x31;
|
||||
int phase = dComIfG_resLoad(&mPhase, dItem_data::getFieldArc(m_itemNo));
|
||||
#if TARGET_PC
|
||||
// Override the item id in randomizer
|
||||
if (randomizer_IsActive()) {
|
||||
m_itemNo = verifyProgressiveItem(randomizer_getItemAtLocation("Rutelas Blessing"));
|
||||
// Use home.angle.x as a check to see if we've set the foolish item model or not
|
||||
// Otherwise we end up setting it twice
|
||||
if (m_itemNo == dItemNo_Randomizer_FOOLISH_ITEM_e && home.angle.x != 0) {
|
||||
home.angle.z = randomizer_getRandomFoolishItemModelID();
|
||||
home.angle.x = 0;
|
||||
}
|
||||
// TODO: Set rotation/height/scale depending on the item (low prio, can figure this out later)
|
||||
scale.setall(1.5f);
|
||||
switch (M_ITEMNO_MODEL_ITEM_ID) {
|
||||
case dItemNo_Randomizer_WOOD_STICK_e:
|
||||
shape_angle.x = 0x4000;
|
||||
break;
|
||||
case dItemNo_Randomizer_MASTER_SWORD_e:
|
||||
case dItemNo_Randomizer_LIGHT_SWORD_e:
|
||||
shape_angle.x = 0x4000;
|
||||
current.pos.z -= 40.0f;
|
||||
scale.setall(1.0f);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
int phase = dComIfG_resLoad(&mPhase, dItem_data::getFieldArc(M_ITEMNO_MODEL_ITEM_ID));
|
||||
if (phase == cPhs_COMPLEATE_e) {
|
||||
if (!fopAcM_entrySolidHeap(this, (heapCallbackFunc)CheckFieldItemCreateHeap, 0x2fb0)) {
|
||||
return cPhs_ERROR_e;
|
||||
|
||||
@@ -10,6 +10,10 @@
|
||||
#include "d/d_bg_w.h"
|
||||
#include "f_pc/f_pc_name.h"
|
||||
|
||||
#if TARGET_PC
|
||||
#include "dusk/randomizer/game/flags.h"
|
||||
#endif
|
||||
|
||||
static char const* l_arcName = "H_ZraRock";
|
||||
|
||||
void daObjZraRock_c::setAttnPos() {
|
||||
@@ -80,6 +84,12 @@ cPhs_Step daObjZraRock_c::create() {
|
||||
int dzb_id = dComIfG_getObjctResName2Index(l_arcName, "H_ZoraRock.dzb");
|
||||
step = MoveBGCreate(l_arcName, dzb_id, dBgS_MoveBGProc_Trans, 0x2050, NULL);
|
||||
if (dComIfGs_isSwitch((fopAcM_GetParam(this) >> 8) & 0xff, fopAcM_GetRoomNo(this))) {
|
||||
#if TARGET_PC
|
||||
// Don't delete the rock when we're following rutela
|
||||
if (randomizer_IsActive() && !dComIfGs_isEventBit(GOT_ZORA_ARMOR_FROM_RUTELA) && dComIfGs_isEventBit(ZORA_ESCORT_CLEARED)) {
|
||||
return step;
|
||||
}
|
||||
#endif
|
||||
step = cPhs_ERROR_e;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -11,6 +11,12 @@
|
||||
#include "m_Do/m_Do_lib.h"
|
||||
#include <cstring>
|
||||
|
||||
#if TARGET_PC
|
||||
#include "d/d_item_data.h"
|
||||
#include "dusk/randomizer/game/tools.h"
|
||||
#include "dusk/randomizer/game/verify_item_functions.h"
|
||||
#endif
|
||||
|
||||
const char* daShopItem_c::getShopArcname() {
|
||||
switch (m_itemNo) {
|
||||
case dItemNo_NONE_e:
|
||||
@@ -88,7 +94,64 @@ const char* daShopItem_c::getShopArcname() {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return mData[mShopItemID].get_arcName();
|
||||
#if TARGET_PC
|
||||
if (isRandomized()) {
|
||||
// Override the item model with whichever item is randomized to this shop item
|
||||
u8 stage = getStageID();
|
||||
u16 key = (stage << 8) | m_itemNo;
|
||||
u8 itemId = randomizer_GetContext().mShopOverrides.at(key);
|
||||
itemId = verifyProgressiveItem(itemId);
|
||||
|
||||
if (itemId == dItemNo_Randomizer_FOOLISH_ITEM_e) {
|
||||
if (home.angle.x != -1) {
|
||||
home.angle.z = randomizer_getRandomFoolishItemModelID();
|
||||
home.angle.x = -1;
|
||||
}
|
||||
itemId = home.angle.z;
|
||||
|
||||
}
|
||||
|
||||
// Replace the necessary index in daShopItem_c::mRandoData with the model data from dItem_data
|
||||
auto& shopModel = mRandoData[mShopItemID];
|
||||
shopModel.mArcName = dItem_data::getArcName(itemId);
|
||||
shopModel.mBmdName = dItem_data::getBmdName(itemId);
|
||||
shopModel.mBtkName = dItem_data::getBtkName(itemId);
|
||||
shopModel.mBckName = dItem_data::getBckName(itemId);
|
||||
shopModel.mBrkName = dItem_data::getBrkName(itemId);
|
||||
shopModel.mBtpName = dItem_data::getBtpName(itemId);
|
||||
shopModel.mTevFrm = dItem_data::getTevFrm(itemId);
|
||||
shopModel.mBtpFrm = -1;
|
||||
shopModel.mFlag = -1;
|
||||
|
||||
// Move the item higher up if it's the magic armor slot
|
||||
if (mShopItemID == SHOP_ITEMNO_ARMOR) {
|
||||
switch (itemId) {
|
||||
case dItemNo_Randomizer_GREEN_RUPEE_e:
|
||||
case dItemNo_Randomizer_BLUE_RUPEE_e:
|
||||
case dItemNo_Randomizer_YELLOW_RUPEE_e:
|
||||
case dItemNo_Randomizer_RED_RUPEE_e:
|
||||
case dItemNo_Randomizer_PURPLE_RUPEE_e:
|
||||
case dItemNo_Randomizer_ORANGE_RUPEE_e:
|
||||
case dItemNo_Randomizer_SILVER_RUPEE_e:
|
||||
case dItemNo_Randomizer_LINKS_SAVINGS_e:
|
||||
shopModel.mOffsetY = 65.0f;
|
||||
default:
|
||||
shopModel.mOffsetY = 60.0f;
|
||||
}
|
||||
} else {
|
||||
shopModel.mOffsetY = 15.0f;
|
||||
}
|
||||
|
||||
// Scale down the Master Sword model so it looks better
|
||||
if (itemId == dItemNo_Randomizer_MASTER_SWORD_e || itemId == dItemNo_Randomizer_LIGHT_SWORD_e) {
|
||||
shopModel.mScale = 0.35f;
|
||||
} else {
|
||||
shopModel.mScale = 1.0f;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
return M_SHOP_DATA[mShopItemID].get_arcName();
|
||||
}
|
||||
|
||||
const f32 daShopItem_c::m_cullfar_max = 5000.0f;
|
||||
@@ -119,11 +182,11 @@ void daShopItem_c::CreateInit() {
|
||||
|
||||
if (strcmp("R_SP109", dComIfGp_getStartStageName()) == 0 && dComIfGp_getStartStageRoomNo() == 1)
|
||||
{
|
||||
scale.set(mData[mShopItemID].get_scale() * 0.8f, mData[mShopItemID].get_scale() * 0.8f,
|
||||
mData[mShopItemID].get_scale() * 0.8f);
|
||||
scale.set(M_SHOP_DATA[mShopItemID].get_scale() * 0.8f, M_SHOP_DATA[mShopItemID].get_scale() * 0.8f,
|
||||
M_SHOP_DATA[mShopItemID].get_scale() * 0.8f);
|
||||
} else {
|
||||
scale.set(mData[mShopItemID].get_scale(), mData[mShopItemID].get_scale(),
|
||||
mData[mShopItemID].get_scale());
|
||||
scale.set(M_SHOP_DATA[mShopItemID].get_scale(), M_SHOP_DATA[mShopItemID].get_scale(),
|
||||
M_SHOP_DATA[mShopItemID].get_scale());
|
||||
}
|
||||
|
||||
home.pos = current.pos;
|
||||
@@ -137,7 +200,7 @@ void daShopItem_c::set_mtx() {
|
||||
if (daShopItem_prm::getGroup(this) == 15) {
|
||||
mDoMtx_stack_c::transS(current.pos.x, current.pos.y, current.pos.z);
|
||||
} else {
|
||||
mDoMtx_stack_c::transS(current.pos.x, current.pos.y + mData[mShopItemID].get_offsetY(),
|
||||
mDoMtx_stack_c::transS(current.pos.x, current.pos.y + M_SHOP_DATA[mShopItemID].get_offsetY(),
|
||||
current.pos.z);
|
||||
}
|
||||
|
||||
@@ -147,8 +210,8 @@ void daShopItem_c::set_mtx() {
|
||||
if (daShopItem_prm::getGroup(this) == 15) {
|
||||
mDoMtx_stack_c::ZXYrotM(-11300, 32700, 7300);
|
||||
} else {
|
||||
mDoMtx_stack_c::ZXYrotM(mAngleX + mData[mShopItemID].get_angleX(),
|
||||
mData[mShopItemID].get_angleY(), mData[mShopItemID].get_angleZ());
|
||||
mDoMtx_stack_c::ZXYrotM(mAngleX + M_SHOP_DATA[mShopItemID].get_angleX(),
|
||||
M_SHOP_DATA[mShopItemID].get_angleY(), M_SHOP_DATA[mShopItemID].get_angleZ());
|
||||
}
|
||||
|
||||
mDoMtx_stack_c::ZXYrotM(current.angle.x, current.angle.y, current.angle.z);
|
||||
@@ -156,7 +219,7 @@ void daShopItem_c::set_mtx() {
|
||||
if (daShopItem_prm::getGroup(this) == 15) {
|
||||
mDoMtx_stack_c::XrotM(0);
|
||||
} else {
|
||||
mDoMtx_stack_c::XrotM(mData[mShopItemID].get_angleOffsetX());
|
||||
mDoMtx_stack_c::XrotM(M_SHOP_DATA[mShopItemID].get_angleOffsetX());
|
||||
}
|
||||
|
||||
mpModel->setBaseTRMtx(mDoMtx_stack_c::get());
|
||||
@@ -190,29 +253,42 @@ void daShopItem_c::setShadow() {
|
||||
}
|
||||
|
||||
BOOL daShopItem_c::chkFlag(int i_flag) {
|
||||
return mData[mShopItemID].get_flag() & i_flag;
|
||||
return M_SHOP_DATA[mShopItemID].get_flag() & i_flag;
|
||||
}
|
||||
|
||||
s8 daShopItem_c::getTevFrm() {
|
||||
return mData[mShopItemID].get_tevfrm();
|
||||
return M_SHOP_DATA[mShopItemID].get_tevfrm();
|
||||
}
|
||||
|
||||
s8 daShopItem_c::getBtpFrm() {
|
||||
return mData[mShopItemID].get_btpfrm();
|
||||
return M_SHOP_DATA[mShopItemID].get_btpfrm();
|
||||
}
|
||||
|
||||
u8 daShopItem_c::getShadowSize() {
|
||||
return mData[mShopItemID].get_shadowSize();
|
||||
return M_SHOP_DATA[mShopItemID].get_shadowSize();
|
||||
}
|
||||
|
||||
u8 daShopItem_c::getCollisionH() {
|
||||
return mData[mShopItemID].get_collisionH();
|
||||
return M_SHOP_DATA[mShopItemID].get_collisionH();
|
||||
}
|
||||
|
||||
u8 daShopItem_c::getCollisionR() {
|
||||
return mData[mShopItemID].get_collisionR();
|
||||
return M_SHOP_DATA[mShopItemID].get_collisionR();
|
||||
}
|
||||
|
||||
#if TARGET_PC
|
||||
// Custom function to check if this shop item is randomized
|
||||
BOOL daShopItem_c::isRandomized() const {
|
||||
if (randomizer_IsActive()) {
|
||||
u8 stage = getStageID();
|
||||
u8 itemId = m_itemNo;
|
||||
u16 key = (stage << 8) | itemId;
|
||||
return randomizer_GetContext().mShopOverrides.contains(key);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
#endif
|
||||
|
||||
int daShopItem_c::_create() {
|
||||
fopAcM_ct(this, daShopItem_c);
|
||||
|
||||
|
||||
@@ -9,6 +9,8 @@
|
||||
#include "d/actor/d_a_tag_statue_evt.h"
|
||||
#include "d/d_com_inf_game.h"
|
||||
#include "d/d_debug_viewer.h"
|
||||
#include "dusk/randomizer/game/tools.h"
|
||||
#include "dusk/randomizer/game/verify_item_functions.h"
|
||||
|
||||
class daTagStatue_HIO_c : public mDoHIO_entry_c {
|
||||
public:
|
||||
@@ -352,15 +354,26 @@ int daTagStatue_c::demoProc() {
|
||||
}
|
||||
break;
|
||||
case DEMO_ACTION_AWARD_ITEM:
|
||||
// If the player already has 5 Sky Characters, reward them with the completed
|
||||
// Ancient Sky Book, otherwise, reward another character
|
||||
if (getLetterCount() == 5) {
|
||||
item = dItemNo_ANCIENT_DOCUMENT2_e;
|
||||
/* Sky character - Sky character 6 */
|
||||
dComIfGs_onEventBit(dSv_event_flag_c::F_0796);
|
||||
#if TARGET_PC
|
||||
if (randomizer_IsActive()) {
|
||||
u8 stageIdx = getStageID();
|
||||
u8 roomNo = dStage_roomControl_c::mStayNo;
|
||||
u16 key = (stageIdx << 8) | roomNo;
|
||||
item = verifyProgressiveItem(randomizer_GetContext().mSkyCharacterOverrides[key]);
|
||||
} else {
|
||||
item = dItemNo_AIR_LETTER_e;
|
||||
#endif
|
||||
// If the player already has 5 Sky Characters, reward them with the completed
|
||||
// Ancient Sky Book, otherwise, reward another character
|
||||
if (getLetterCount() == 5) {
|
||||
item = dItemNo_ANCIENT_DOCUMENT2_e;
|
||||
/* Sky character - Sky character 6 */
|
||||
dComIfGs_onEventBit(dSv_event_flag_c::F_0796);
|
||||
} else {
|
||||
item = dItemNo_AIR_LETTER_e;
|
||||
}
|
||||
#if TARGET_PC
|
||||
}
|
||||
#endif
|
||||
|
||||
mItemId =
|
||||
fopAcM_createItemForTrBoxDemo(¤t.pos, item, -1,
|
||||
|
||||
@@ -12,6 +12,11 @@
|
||||
#include <cmath>
|
||||
#include <cstring>
|
||||
|
||||
#if TARGET_PC
|
||||
#include "dusk/randomizer/game/tools.h"
|
||||
#include "dusk/randomizer/game/verify_item_functions.h"
|
||||
#endif
|
||||
|
||||
static const f32 l_cull_size_box[6] = { -150.0f, -10.0f, -150.0f, 150.0f, 300.0f, 100.0f };
|
||||
|
||||
static const cM3dGCylS l_cyl_info[3] = {
|
||||
@@ -1785,6 +1790,18 @@ void daTbox_c::mode_exec() {
|
||||
cPhs_Step daTbox_c::create1st() {
|
||||
if (!mParamsInit) {
|
||||
field_0x980 = home.angle.x;
|
||||
#if TARGET_PC
|
||||
// The upper 8 bits of home.angle.z hold the itemId. Replace with our randomized
|
||||
// item in randomizer
|
||||
if (randomizer_IsActive()) {
|
||||
home.angle.z &= ~0xFF00;
|
||||
auto stage = getStageID();
|
||||
auto tboxId = static_cast<u8>(getTboxNo());
|
||||
u16 key = (stage << 8) | tboxId;
|
||||
u8 itemId = randomizer_GetContext().mTreasureChestOverrides[key];
|
||||
home.angle.z |= verifyProgressiveItem(itemId) << 8;
|
||||
}
|
||||
#endif
|
||||
field_0x982 = home.angle.z;
|
||||
home.angle.z = 0;
|
||||
home.angle.x = 0;
|
||||
|
||||
@@ -10,6 +10,11 @@
|
||||
#include "d/actor/d_a_midna.h"
|
||||
#include <cstring>
|
||||
|
||||
#if TARGET_PC
|
||||
#include "dusk/randomizer/game/tools.h"
|
||||
#include "dusk/randomizer/game/verify_item_functions.h"
|
||||
#endif
|
||||
|
||||
void daTbox2_c::initBaseMtx() {
|
||||
mpModel->setBaseScale(scale);
|
||||
setBaseMtx();
|
||||
@@ -67,6 +72,24 @@ static dCcD_SrcCyl l_cyl_src = {
|
||||
};
|
||||
|
||||
int daTbox2_c::Create() {
|
||||
#if TARGET_PC
|
||||
// If the flag for this box is set, open it
|
||||
u8 tboxId = getTboxNo();
|
||||
if (tboxId != 0xFF && dComIfGs_isTbox(tboxId)) {
|
||||
// Set the action for not allowing the player to open it
|
||||
init_actionWait();
|
||||
// Set the animation frame to open
|
||||
mpBck->setFrame(mpBck->getEndFrame());
|
||||
// Set collision to open
|
||||
if (mpBgW != NULL) {
|
||||
dComIfG_Bgsp().Release(mpBgW);
|
||||
}
|
||||
|
||||
if (mBoxBgW != NULL) {
|
||||
dComIfG_Bgsp().Regist(mBoxBgW, this);
|
||||
}
|
||||
} else
|
||||
#endif
|
||||
init_actionOpenWait();
|
||||
initBaseMtx();
|
||||
fopAcM_SetMtx(this, mpModel->getBaseTRMtx());
|
||||
@@ -138,6 +161,20 @@ int daTbox2_c::create1st() {
|
||||
fopAcM_ct(this, daTbox2_c);
|
||||
mModelType = getModelType();
|
||||
|
||||
#if TARGET_PC
|
||||
if (randomizer_IsActive()) {
|
||||
// Get the override item for this chest
|
||||
auto stage = getStageID();
|
||||
u8 tboxId = getTboxNo();
|
||||
u16 key = (stage << 8) | tboxId;
|
||||
u8 itemId = randomizer_GetContext().mTreasureChestOverrides[key];
|
||||
// Set the item in the params
|
||||
u32 params = fopAcM_GetParam(this);
|
||||
params &= 0xFFFFFF00;
|
||||
params |= verifyProgressiveItem(itemId);
|
||||
fopAcM_SetParam(this, params);
|
||||
}
|
||||
#endif
|
||||
int phase_state = dComIfG_resLoad(&mPhase, l_arcName);
|
||||
if (phase_state == cPhs_COMPLEATE_e) {
|
||||
u32 heap_size;
|
||||
@@ -375,6 +412,12 @@ int daTbox2_c::setGetDemoItem() {
|
||||
if (mReturnRupee) {
|
||||
partner_id = fopAcM_createItemForPresentDemo(¤t.pos, item_no, 1, -1, -1, NULL, NULL);
|
||||
} else {
|
||||
#if TARGET_PC
|
||||
u8 tboxId = getTboxNo();
|
||||
if (tboxId != 0xFF) {
|
||||
dComIfGs_onTbox(tboxId);
|
||||
}
|
||||
#endif
|
||||
partner_id = fopAcM_createItemForTrBoxDemo(¤t.pos, item_no, -1, -1, NULL, NULL);
|
||||
}
|
||||
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
#include "d/d_item_data.h"
|
||||
|
||||
u8 daItemBase_c::getItemNo() {
|
||||
return m_itemNo;
|
||||
return M_ITEMNO_MODEL_ITEM_ID;
|
||||
}
|
||||
|
||||
static void dummy(dItem_data* data) {
|
||||
@@ -61,6 +61,26 @@ int CheckFieldItemCreateHeap(fopAc_ac_c* i_this) {
|
||||
daItemBase_c* a_this = static_cast<daItemBase_c*>(i_this);
|
||||
|
||||
u8 item_no = a_this->getItemNo();
|
||||
#if TARGET_PC
|
||||
if (randomizer_IsActive()) {
|
||||
switch (item_no)
|
||||
{
|
||||
case dItemNo_Randomizer_EMPTY_BOTTLE_e:
|
||||
case dItemNo_Randomizer_HALF_MILK_BOTTLE_e:
|
||||
case dItemNo_Randomizer_OIL_BOTTLE3_e:
|
||||
case dItemNo_Randomizer_DROP_BOTTLE_e:
|
||||
case dItemNo_Randomizer_LINKS_SAVINGS_e:
|
||||
case dItemNo_Randomizer_POU_SPIRIT_e:
|
||||
{
|
||||
return CheckItemCreateHeap(i_this);
|
||||
}
|
||||
default:
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
return a_this->CreateItemHeap(
|
||||
dItem_data::getFieldArc(item_no), dItem_data::getItemBmdName(item_no),
|
||||
dItem_data::getItemBtkName(item_no), dItem_data::getItemBpkName(item_no),
|
||||
|
||||
@@ -41,11 +41,54 @@ ResourceData const daShopItem_c::mData[23] = {
|
||||
{"O_mD_bott", 6, 12, -1, -1, -1, 9, 15, 0.0f, 1.0f, 0, {0, 0, 0}, 4, 0, 0, 0, 12, 0},
|
||||
};
|
||||
|
||||
#if TARGET_PC
|
||||
// Make a copy of mData that we can overwrite for randomized items
|
||||
ResourceData daShopItem_c::mRandoData[23] = {
|
||||
{"B_mD_sold", 3, -1, -1, -1, -1, -1, -1, 0.0f, 1.0f, 0, {0, -0x8000, 0}, 0, 0, 0, 0, -1, -1},
|
||||
{"B_mD_oil", 3, -1, -1, -1, -1, -1, -1, 0.0f, 1.0f, 0, {0, 0, 0}, 0, 0, 0, 0, -1, -1},
|
||||
{"O_mD_red", 3, -1, -1, -1, -1, -1, -11, 0.0f, 1.0f, 0, {0, 0, 0}, 0, 0, 0, 0, -1, -1},
|
||||
{"B_mD_milk", 3, -1, -1, -1, -1, -1, -1, 0.0f, 1.0f, 0, {0, 0, 0}, 0, 0, 0, 0, -1, -1},
|
||||
{"O_mD_bott", 6, 12, -1, -1, -1, 9, 15, 0.0f, 1.0f, 0, {0, 0, 0}, 4, 0, 0, 0, 3, 1},
|
||||
{"O_mD_arw", 3, -1, -1, -1, -1, -1, -1, 0.0f, 1.0f, 0, {0, 0, 0}, 0, 0, 0, 0, -1, -1},
|
||||
{"O_mD_SHB", 3, -1, -1, -1, -1, -1, -1, 30.0f, 1.0f, 0, {0, 0x7FFF, 0}, 0, 0, 0, 0, -1, -1},
|
||||
{"O_mD_SHA", 3, -1, -1, -1, -1, -1, -1, 30.0f, 1.0f, 0, {0, 0x7FFF, 0}, 0, 0, 0, 0, -1, -1},
|
||||
{"O_mD_bomb", 3, -1, -1, -1, -1, -1, -1, 0.0f, 1.0f, 0, {0, 0, 0}, 0, 0, 0, 0, 0, -1},
|
||||
{"O_mD_pg", 3, -1, -1, -1, -1, -1, -1, 0.0f, 1.0f, 0, {0, 0, 0}, 0, 0, 0, 0, 0, -1},
|
||||
{"O_mD_bi", 3, -1, -1, -1, -1, -1, -1, 0.0f, 1.0f, 0, {0, 0, 0}, 0, 0, 0, 0, 0, -1},
|
||||
{"O_mD_bmcs", 3, -1, -1, -1, -1, -1, -1, 0.0f, 1.0f, 0, {0, 0, 0}, 0, 0, 0, 0, 0, -1},
|
||||
{"O_mD_bmc2", 3, -1, -1, -1, -1, -1, -1, 0.0f, 1.0f, 0, {0, 0, 0}, 0, 0, 0, 0, 0, -1},
|
||||
{"O_mD_jira", 3, -1, -1, -1, -1, -1, -1, 0.0f, 1.0f, 0, {0, 0, 0}, 0, 0, 0, 0, 0, -1},
|
||||
{"O_mD_bott", 6, 12, -1, -1, -1, 9, 15, 0.0f, 1.0f, 0, {0, 0, 0}, 4, 0, 0, 0, 1, 0},
|
||||
{"O_mD_hati", 3, -1, -1, -1, -1, -1, -1, 0.0f, 1.0f, 0, {0, 0, 0}, 0, 0, 0, 0, -1, -1},
|
||||
{"O_mD_pach", 3, -1, -1, -1, -1, -1, -1, 0.0f, 1.0f, 0, {0, 0, 0}, 0, 0, 0, 0, -1, -1},
|
||||
{"O_mD_blue", 3, -1, -1, -1, -1, -1, -11, 0.0f, 1.0f, 0, {0, 0, 0}, 0, 0, 0, 0, -1, -1},
|
||||
{"O_mD_hawk", 3, -1, -1, -1, -1, -1, -1, 0.0f, 1.0f, 0, {0, 0, 0}, 0, 0, 0, 0, -1, -1},
|
||||
{"O_mD_marm", 3, -1, -1, -1, -1, -1, -1, 0.0f, 1.0f, 0, {0, 0, 0}, 0, 0, 0, 0, -1, -1},
|
||||
{"O_mD_marm", 4, -1, -1, -1, -1, -1, -1, 0.0f, 1.0f, 0, {0, 0, 0}, 0, 0, 0, 0, -1, -1},
|
||||
{"O_mD_gren", 3, -1, -1, -1, -1, -1, -1, 0.0f, 1.0f, 0, {0, 0, 0}, 0, 0, 0, 0, -1, -1},
|
||||
{"O_mD_bott", 6, 12, -1, -1, -1, 9, 15, 0.0f, 1.0f, 0, {0, 0, 0}, 4, 0, 0, 0, 12, 0},
|
||||
};
|
||||
#endif
|
||||
|
||||
int CheckShopItemCreateHeap(fopAc_ac_c* i_this) {
|
||||
daShopItem_c* a_this1 = static_cast<daShopItem_c*>(i_this);
|
||||
daShopItem_c* a_this2 = static_cast<daShopItem_c*>(i_this);
|
||||
|
||||
u8 a_ShopItemID = a_this2->getShopItemID();
|
||||
|
||||
#if TARGET_PC
|
||||
if (a_this2->isRandomized()) {
|
||||
return a_this1->CreateItemHeap(daShopItem_c::mRandoData[a_ShopItemID].get_arcName(),
|
||||
daShopItem_c::mRandoData[a_ShopItemID].get_bmdName(),
|
||||
daShopItem_c::mRandoData[a_ShopItemID].get_btk1Name(),
|
||||
daShopItem_c::mRandoData[a_ShopItemID].get_bpk1Name(),
|
||||
daShopItem_c::mRandoData[a_ShopItemID].get_bck1Name(),
|
||||
daShopItem_c::mRandoData[a_ShopItemID].get_bxa1Name(),
|
||||
daShopItem_c::mRandoData[a_ShopItemID].get_brk1Name(),
|
||||
daShopItem_c::mRandoData[a_ShopItemID].get_btp1Name());
|
||||
}
|
||||
#endif
|
||||
|
||||
return a_this1->CreateItemHeap(daShopItem_c::mData[a_ShopItemID].get_arcName(),
|
||||
daShopItem_c::mData[a_ShopItemID].get_bmdName(),
|
||||
daShopItem_c::mData[a_ShopItemID].get_btk1Name(),
|
||||
|
||||
@@ -26,7 +26,15 @@
|
||||
#include <cstdio>
|
||||
#include <cstring>
|
||||
|
||||
#if TARGET_PC
|
||||
#include "dusk/string.hpp"
|
||||
#include "dusk/logging.h"
|
||||
#include "dusk/randomizer/game/tools.h"
|
||||
#include "dusk/randomizer/game/stages.h"
|
||||
#include "dusk/randomizer/game/flags.h"
|
||||
#include "dusk/randomizer/game/randomizer_context.hpp"
|
||||
#endif
|
||||
|
||||
|
||||
void dComIfG_play_c::ct() {
|
||||
mWindowNum = 0;
|
||||
@@ -162,6 +170,580 @@ int dComIfG_play_c::getLayerNo_common_common(const char* i_stageName, int i_room
|
||||
layer = 14;
|
||||
}
|
||||
|
||||
#if TARGET_PC
|
||||
// Special layer checks for randomizer
|
||||
if (randomizer_IsActive()) {
|
||||
int stageID = getStageID(i_stageName);
|
||||
bool condition = false;
|
||||
bool darkIsClear = false;
|
||||
|
||||
if (layer < 13) {
|
||||
|
||||
switch(stageID) {
|
||||
case Snowpeak_Ruins: {
|
||||
if (dComIfGs_isEventBit(SNOWPEAK_RUINS_CLEARED)) {
|
||||
layer = 3;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case Snowpeak: {
|
||||
if (dComIfGs_isEventBit(SNOWPEAK_RUINS_CLEARED) && (i_roomNo != 0)) {
|
||||
layer = 3;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case Faron_Woods:
|
||||
case Faron_Woods_Interiors: {
|
||||
if ((i_roomNo == 5) || (i_roomNo == 6)) { // North Faron or Mist Area
|
||||
condition = dComIfGs_isEventBit(ORDON_DAY_2_OVER); // Talo Saved
|
||||
if (condition) {
|
||||
layer = 3;
|
||||
} else {
|
||||
layer = 1;
|
||||
}
|
||||
}
|
||||
else {
|
||||
condition = dComIfGs_isEventBit(ORDON_DAY_2_OVER); // Talo Saved
|
||||
if (condition) {
|
||||
condition = dComIfGs_isEventBit(FOREST_TEMPLE_CLEARED); // Forest Temple Completed
|
||||
|
||||
if (condition) {
|
||||
layer = 5;
|
||||
}
|
||||
} else {
|
||||
layer = 1;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case Kakariko_Village:
|
||||
{
|
||||
condition = dComIfGs_isEventBit(WATCHED_CUTSCENE_AFTER_GORON_MINES); // Cutscene after GM Watched
|
||||
if (condition == false) {
|
||||
condition = dComIfGs_isEventBit(GORON_MINES_CLEARED); // Goron Mines Completed
|
||||
if (condition == false) {
|
||||
layer = 2;
|
||||
|
||||
// If it is night, the layer is different.
|
||||
dComIfG_get_timelayer(&layer);
|
||||
}
|
||||
else {
|
||||
layer = 12;
|
||||
}
|
||||
}
|
||||
else {
|
||||
layer = 2;
|
||||
dComIfG_get_timelayer(&layer);
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
case Kakariko_Graveyard:
|
||||
{
|
||||
condition = dComIfGs_isEventBit(GOT_ZORA_ARMOR_FROM_RUTELA); // Got Zora Armor from Rutela
|
||||
if (condition == false) {
|
||||
condition = dComIfGs_isEventBit(ZORA_ESCORT_CLEARED); // Zora Escort Cleared
|
||||
|
||||
if (condition == false) {
|
||||
layer = 2;
|
||||
|
||||
// If it is night, the layer is different.
|
||||
dComIfG_get_timelayer(&layer);
|
||||
}
|
||||
else {
|
||||
layer = 4;
|
||||
}
|
||||
}
|
||||
else {
|
||||
layer = 2;
|
||||
dComIfG_get_timelayer(&layer);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case Kakariko_Graveyard_Interiors: {
|
||||
if (((i_roomNo == 1 &&
|
||||
(condition = dComIfGs_isEventBit(LAKEBED_TEMPLE_CLEARED),
|
||||
condition != false)))) // Lakebed Completed
|
||||
{
|
||||
layer = 4;
|
||||
dComIfG_get_timelayer(&layer);
|
||||
}
|
||||
else {
|
||||
layer = 2;
|
||||
dComIfG_get_timelayer(&layer);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case Kakariko_Village_Interiors: {
|
||||
if (i_roomNo == 1) { // Lakebed Completed
|
||||
layer = 4;
|
||||
dComIfG_get_timelayer(&layer);
|
||||
}
|
||||
else if (i_roomNo == 3) {
|
||||
layer = 2;
|
||||
}
|
||||
else {
|
||||
layer = 2;
|
||||
dComIfG_get_timelayer(&layer);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case Death_Mountain: {
|
||||
condition =
|
||||
dComIfGs_isEventBit(GORON_MINES_CLEARED); // Goron Mines Completed
|
||||
|
||||
if (condition) {
|
||||
layer = 2;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case Death_Mountain_Interiors: {
|
||||
layer = 0;
|
||||
break;
|
||||
}
|
||||
|
||||
case Lake_Hylia: {
|
||||
if (i_roomNo == 1) { // Lanayru Spring
|
||||
|
||||
condition = dComIfGs_isEventBit(LAKEBED_TEMPLE_CLEARED); // Lakebed Temple has been completed
|
||||
if (condition) {
|
||||
condition = dComIfGs_isEventBit(MIDNAS_DESPERATE_HOUR_STARTED); // MDH has been started
|
||||
if (condition == false) {
|
||||
layer = 9;
|
||||
}
|
||||
else {
|
||||
layer = 2;
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
condition = dComIfGs_isEventBit(SKY_CANNON_REPAIRED); // Sky Cannon Repaired
|
||||
if (condition == false) {
|
||||
condition = dComIfGs_isEventBit(WARPED_SKY_CANNON_TO_LAKE_HYLIA); // Sky Cannon Warped to Lake Hylia
|
||||
|
||||
if (condition == false) {
|
||||
layer = 2;
|
||||
}
|
||||
else {
|
||||
layer = 1;
|
||||
}
|
||||
}
|
||||
else {
|
||||
layer = 3;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case Castle_Town_Interiors:
|
||||
{
|
||||
if (condition = dComIfGs_isEventBit(LAKEBED_TEMPLE_CLEARED),condition) { // Lakebed Temple Completed
|
||||
layer = 2;
|
||||
if (condition = dComIfGs_isEventBit(MIDNAS_DESPERATE_HOUR_COMPLETED),condition) { // MDH Completed
|
||||
layer = 0;
|
||||
}
|
||||
}
|
||||
if (i_roomNo == 5) { // Telma's Bar
|
||||
layer = 4;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case Castle_Town: {
|
||||
condition = dComIfGs_isEventBit(MIDNAS_DESPERATE_HOUR_COMPLETED); // MDH Completed
|
||||
if (condition == false) {
|
||||
condition = dComIfGs_isEventBit(LAKEBED_TEMPLE_CLEARED); // Lakebed Temple Completed
|
||||
if (condition == false) {
|
||||
if ((i_roomNo == 3) &&
|
||||
(condition = dComIfGs_isEventBit(ZORA_ESCORT_CLEARED),condition != false)) { // Zora Escort Cleared
|
||||
layer = 1;
|
||||
}
|
||||
else if (i_roomNo == 4) {
|
||||
layer = 1;
|
||||
}
|
||||
}
|
||||
else {
|
||||
layer = 2;
|
||||
}
|
||||
}
|
||||
else {
|
||||
if (((i_roomNo == 4) || (i_roomNo == 3)) || (i_roomNo == 1)) {
|
||||
layer = 1;
|
||||
}
|
||||
else {
|
||||
layer = 0;
|
||||
}
|
||||
}
|
||||
|
||||
if (i_roomNo == 0) {
|
||||
if (dComIfGs_getStartPoint() == 0xF) {
|
||||
layer = 5;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case Zoras_Domain: {
|
||||
layer = 0;
|
||||
break;
|
||||
}
|
||||
|
||||
case Upper_Zoras_River: {
|
||||
condition = dComIfGs_isEventBit(IZA_1_MINIGAME_UNLOCKED); // Iza 1 Unlocked
|
||||
if (condition != false)
|
||||
{
|
||||
layer = 1;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case Gerudo_Desert: {
|
||||
layer = 8;
|
||||
|
||||
condition = dComIfGs_isEventBit(VISITED_DESERT_FOR_THE_FIRST_TIME); // Have been to desert
|
||||
if (condition != false) {
|
||||
layer = 0;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case Zoras_River: {
|
||||
condition = dComIfGs_isEventBit(IZA_1_MINIGAME_DONE); // Iza 1 Minigame Completed
|
||||
|
||||
if (condition == false) {
|
||||
condition = dComIfGs_isEventBit(STARTED_IZA_1_MINIGAME); // Iza 1 Minigame Started
|
||||
if (condition != false) {
|
||||
layer = 2;
|
||||
}
|
||||
}
|
||||
else {
|
||||
layer = 1;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case Ordon_Village: {
|
||||
if (i_roomNo == 0) {
|
||||
if (!dKy_daynight_check()) {
|
||||
layer = 0;
|
||||
}
|
||||
else {
|
||||
layer = 5;
|
||||
}
|
||||
}
|
||||
|
||||
else {
|
||||
if (i_roomNo == 1) {
|
||||
condition =
|
||||
dComIfGs_isEventBit(ORDON_DAY_1_FINISHED); // Ordon Day 1 done
|
||||
|
||||
if (condition) {
|
||||
condition = dComIfGs_isEventBit(ORDON_DAY_2_OVER); // Talo Saved
|
||||
if (condition) {
|
||||
layer = 2;
|
||||
}
|
||||
else {
|
||||
layer = 4;
|
||||
}
|
||||
}
|
||||
else {
|
||||
layer = 3;
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case Ordon_Village_Interiors:
|
||||
{
|
||||
/* not used in randomizer anymore. keeping for documentation sake
|
||||
if ( i_roomNo == 1 ) // Sera's Shop
|
||||
{
|
||||
condition = dComIfGs_isEventBit(
|
||||
BOUGHT_SLINGSHOT_FROM_SERA ); // Bought slinghot from Sera
|
||||
|
||||
if ( condition )
|
||||
{
|
||||
layer = 2;
|
||||
}
|
||||
}*/
|
||||
if (i_roomNo == 2) { // Jaggle's House
|
||||
|
||||
darkIsClear = dComIfGs_isDarkClearLV(0);
|
||||
if (darkIsClear == false) {
|
||||
condition = dComIfGs_isEventBit(FINISHED_SEWERS); // First Trip to Sewers done
|
||||
if (condition != false) {
|
||||
layer = 1;
|
||||
}
|
||||
}
|
||||
else {
|
||||
layer = 1;
|
||||
}
|
||||
}
|
||||
/* not used in randomizer anymore. keeping for documentation sake
|
||||
else
|
||||
{
|
||||
if ( i_roomNo == 5 ) // Rusl's House
|
||||
{
|
||||
darkIsClear = libtp::tp::d_save::isDarkClearLV( playerStatusBPtr, 0 );
|
||||
if ( darkIsClear != false )
|
||||
{
|
||||
layer = 2;
|
||||
}
|
||||
}
|
||||
}*/
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
case Ordon_Spring: {
|
||||
condition = dComIfGs_isEventBit(ORDON_DAY_2_OVER); // Talo saved
|
||||
if (condition) {
|
||||
condition =
|
||||
dComIfGs_isEventBit(FINISHED_SEWERS); // First trip to Sewers done
|
||||
|
||||
if (condition) {
|
||||
darkIsClear = dComIfGs_isDarkClearLV(0);
|
||||
if (darkIsClear != false) {
|
||||
layer = 2;
|
||||
}
|
||||
else {
|
||||
layer = 4;
|
||||
}
|
||||
}
|
||||
else {
|
||||
layer = 0;
|
||||
}
|
||||
}
|
||||
else {
|
||||
condition = dComIfGs_isEventBit(TALO_CHASES_MONKEY); // Sword training done on Ordon Day 2
|
||||
if (condition) {
|
||||
layer = 3;
|
||||
}
|
||||
else {
|
||||
layer = 1;
|
||||
}
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
case Ordon_Ranch: {
|
||||
condition = dComIfGs_isEventBit(ORDON_DAY_1_FINISHED); // Day 1 done
|
||||
if (condition) {
|
||||
condition = dComIfGs_isEventBit(ORDON_DAY_2_OVER); // Talo Saved
|
||||
if (condition) {
|
||||
condition = dComIfGs_isEventBit(WATCHED_CUTSCENE_AFTER_GOATS_2); // Saw CS after Goats 2 done
|
||||
|
||||
if (condition) {
|
||||
layer = 2;
|
||||
dComIfG_get_timelayer(&layer);
|
||||
}
|
||||
else {
|
||||
layer = 9;
|
||||
}
|
||||
}
|
||||
else {
|
||||
layer = 2;
|
||||
}
|
||||
}
|
||||
else {
|
||||
layer = 12;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case Hyrule_Field: {
|
||||
// First 3 twilights are cleared
|
||||
if ((dComIfGs_getDarkClearLV() & 0x7) == 0x7) {
|
||||
if (dComIfGs_isEventBit(MIDNAS_DESPERATE_HOUR_COMPLETED)) {
|
||||
layer = 6;
|
||||
}
|
||||
else if (dComIfGs_isEventBit(MIDNAS_DESPERATE_HOUR_STARTED)) {
|
||||
layer = 4;
|
||||
}
|
||||
else {
|
||||
layer = 0;
|
||||
}
|
||||
}
|
||||
else {
|
||||
layer = 0;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case Outside_Castle_Town: {
|
||||
if (i_roomNo == 8) {
|
||||
condition = dComIfGs_isEventBit(MIDNAS_DESPERATE_HOUR_COMPLETED); // MDH Completed
|
||||
if (condition == false) {
|
||||
condition = dComIfGs_isEventBit(MIDNAS_DESPERATE_HOUR_STARTED); // MDH State Activated
|
||||
if (condition != false) {
|
||||
layer = 4;
|
||||
}
|
||||
}
|
||||
else {
|
||||
layer = 6;
|
||||
}
|
||||
}
|
||||
else {
|
||||
if (i_roomNo == 0x10) {
|
||||
condition = dComIfGs_isEventBit(GOT_WOOD_STATUE); // Wooden Statue Gotten
|
||||
if (condition == false) {
|
||||
condition = dComIfGs_isEventBit(TALKED_TO_LOUISE_ABOUT_THE_STOLEN_STATUE); // Talked to Louise after Medicine Scent
|
||||
if (condition == false) {
|
||||
condition = dComIfGs_isEventBit(MIDNAS_DESPERATE_HOUR_COMPLETED); // MDH Completed
|
||||
if (condition == false) {
|
||||
condition = dComIfGs_isEventBit(MIDNAS_DESPERATE_HOUR_STARTED); // MDH State Activated
|
||||
if (condition != false) {
|
||||
layer = 4;
|
||||
}
|
||||
else {
|
||||
layer = 6;
|
||||
}
|
||||
}
|
||||
else {
|
||||
layer = 6;
|
||||
}
|
||||
}
|
||||
else {
|
||||
layer = 1;
|
||||
}
|
||||
}
|
||||
else {
|
||||
layer = 6;
|
||||
}
|
||||
}
|
||||
else {
|
||||
if (i_roomNo == 0x11) {
|
||||
condition = dComIfGs_isEventBit(MIDNAS_DESPERATE_HOUR_COMPLETED); // MDH Completed
|
||||
if (condition == false) {
|
||||
condition = dComIfGs_isEventBit(MIDNAS_DESPERATE_HOUR_STARTED); // MDH State Activated
|
||||
if (condition != false) {
|
||||
layer = 4;
|
||||
}
|
||||
}
|
||||
else {
|
||||
layer = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case Hidden_Village: {
|
||||
condition = dComIfGs_isEventBit(GAVE_ILIA_THE_WOOD_STATUE); // Ilia shown the wooden statue
|
||||
if (condition != false) {
|
||||
condition = dComIfGs_isEventBit(GOT_ILIAS_CHARM); // Ilia shown Ilia's Charm
|
||||
if (condition != false) {
|
||||
layer = 1;
|
||||
}
|
||||
}
|
||||
else {
|
||||
layer = 1;
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
case Castle_Town_Shops: {
|
||||
if (i_roomNo == 5) {
|
||||
layer = 0;
|
||||
condition = dComIfGs_isEventBit(MIDNAS_DESPERATE_HOUR_STARTED);
|
||||
if (condition) {
|
||||
layer = 1;
|
||||
condition = dComIfGs_isEventBit(MIDNAS_DESPERATE_HOUR_COMPLETED);
|
||||
if (condition) {
|
||||
layer = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
condition = dComIfGs_isEventBit(MALO_MART_CASTLE_TOWN_BRANCH_IS_OPEN); // CT Shop is Malo Mart
|
||||
|
||||
if (condition != false) {
|
||||
layer = 1;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case Sacred_Grove: {
|
||||
layer = 2;
|
||||
break;
|
||||
}
|
||||
|
||||
case Bulblin_Camp: {
|
||||
condition = dComIfGs_isEventBit(ESCAPED_BURNING_TENT_IN_BULBLIN_CAMP); // Escaped Burning Tent in Bulblin Camp
|
||||
if (condition) {
|
||||
if (i_roomNo == 3) // Other states for this room are very similar, but do not have the boar
|
||||
// in the dzx.
|
||||
{ // Setting state 1 solves for any potential softlocks regarding the boar in that area.
|
||||
layer = 1;
|
||||
}
|
||||
else {
|
||||
layer = 3;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case Faron_Woods_Cave: {
|
||||
condition = dComIfGs_isEventBit(ORDON_DAY_2_OVER); // Talo saved
|
||||
if (condition != false) {
|
||||
layer = 1;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case Hyrule_Castle_Sewers: {
|
||||
condition = dComIfGs_isEventBit(FINISHED_SEWERS); // Sewers Finished
|
||||
if (condition) {
|
||||
layer = 13;
|
||||
}
|
||||
else {
|
||||
layer = 14;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case Hyrule_Castle: {
|
||||
if (((i_roomNo != 0xb) && (i_roomNo != 0xd)) && (i_roomNo != 0xe)) {
|
||||
layer = 1;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case Fishing_Pond:
|
||||
case Fishing_Pond_Interiors: {
|
||||
switch (g_env_light.fishing_hole_season) {
|
||||
case 1:
|
||||
layer = 0;
|
||||
break;
|
||||
case 2:
|
||||
layer = 1;
|
||||
break;
|
||||
case 3:
|
||||
layer = 2;
|
||||
break;
|
||||
case 4:
|
||||
layer = 3;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
default: {
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
} else
|
||||
#endif
|
||||
if (layer < 13) {
|
||||
// Stage is Snowpeak Ruins or Snowpeak
|
||||
if (!strcmp(i_stageName, "D_MN11") || !strcmp(i_stageName, "F_SP114")) {
|
||||
@@ -1431,6 +2013,13 @@ stage_arrow_class* dComIfGp_getRoomArrow(int i_roomNo) {
|
||||
void dComIfGp_setNextStage(char const* i_stage, s16 i_point, s8 i_roomNo, s8 i_layer,
|
||||
f32 i_lastSpeed, u32 i_lastMode, int i_setPoint, s8 i_wipe,
|
||||
s16 i_lastAngle, int param_9, int i_wipeSpeedT) {
|
||||
#if TARGET_PC
|
||||
// In rando, override this entrance if applicable
|
||||
if (randomizer_IsActive()) {
|
||||
randomizer_checkAndOverrideEntranceData(i_stage, i_roomNo, i_point, i_layer);
|
||||
}
|
||||
#endif
|
||||
|
||||
if (i_layer >= 15) {
|
||||
i_layer = -1;
|
||||
}
|
||||
@@ -1499,15 +2088,60 @@ static void dummy1() {
|
||||
}
|
||||
|
||||
BOOL dComIfGs_isStageTbox(int i_stageNo, int i_no) {
|
||||
#if TARGET_PC
|
||||
// Avoid trying to get the save table if stag info is NULL
|
||||
if (dComIfGp_getStageStagInfo() && i_stageNo == dStage_stagInfo_GetSaveTbl(dComIfGp_getStageStagInfo())) {
|
||||
#else
|
||||
if (i_stageNo == dStage_stagInfo_GetSaveTbl(dComIfGp_getStageStagInfo())) {
|
||||
#endif
|
||||
return dComIfGs_isTbox(i_no);
|
||||
} else {
|
||||
return dComIfGs_isSaveTbox(i_stageNo, i_no);
|
||||
}
|
||||
}
|
||||
|
||||
#if TARGET_PC
|
||||
void dComIfGs_onStageTbox(int i_stageNo, int i_no) {
|
||||
if (dComIfGp_getStageStagInfo() && i_stageNo == dStage_stagInfo_GetSaveTbl(dComIfGp_getStageStagInfo())) {
|
||||
dComIfGs_onTbox(i_no);
|
||||
} else {
|
||||
dComIfGs_onSaveTbox(i_stageNo, i_no);
|
||||
}
|
||||
}
|
||||
void dComIfGs_offStageTbox(int i_stageNo, int i_no) {
|
||||
if (dComIfGp_getStageStagInfo() && i_stageNo == dStage_stagInfo_GetSaveTbl(dComIfGp_getStageStagInfo())) {
|
||||
dComIfGs_offTbox(i_no);
|
||||
} else {
|
||||
dComIfGs_offSaveTbox(i_stageNo, i_no);
|
||||
}
|
||||
}
|
||||
|
||||
void dComIfGs_onStageItem(int i_stageNo, int i_no) {
|
||||
if (dComIfGp_getStageStagInfo() && i_stageNo == dStage_stagInfo_GetSaveTbl(dComIfGp_getStageStagInfo())) {
|
||||
dComIfGs_onItem(i_no, -1);
|
||||
} else {
|
||||
dComIfGs_onSaveItem(i_no);
|
||||
}
|
||||
}
|
||||
|
||||
void dComIfGs_offStageItem(int i_stageNo, int i_no) {
|
||||
if (dComIfGp_getStageStagInfo() && i_stageNo == dStage_stagInfo_GetSaveTbl(dComIfGp_getStageStagInfo())) {
|
||||
// Need to subtract 0x80 (MEMORY_ITEM constant in d_save.cpp) because the above function does it
|
||||
dComIfGs_offItem(i_stageNo, i_no - 0x80);
|
||||
} else {
|
||||
dComIfGs_offSaveItem(i_no);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
void dComIfGs_onStageSwitch(int i_stageNo, int i_no) {
|
||||
#if TARGET_PC
|
||||
// Avoid trying to get the save table if stag info is NULL
|
||||
if (dComIfGp_getStageStagInfo() && i_stageNo == dStage_stagInfo_GetSaveTbl(dComIfGp_getStageStagInfo())) {
|
||||
#else
|
||||
if (i_stageNo == dStage_stagInfo_GetSaveTbl(dComIfGp_getStageStagInfo())) {
|
||||
#endif
|
||||
dComIfGs_onSwitch(i_no, -1);
|
||||
}
|
||||
|
||||
@@ -1515,7 +2149,12 @@ void dComIfGs_onStageSwitch(int i_stageNo, int i_no) {
|
||||
}
|
||||
|
||||
void dComIfGs_offStageSwitch(int i_stageNo, int i_no) {
|
||||
#if TARGET_PC
|
||||
// Avoid trying to get the save table if stag info is NULL
|
||||
if (dComIfGp_getStageStagInfo() && i_stageNo == dStage_stagInfo_GetSaveTbl(dComIfGp_getStageStagInfo())) {
|
||||
#else
|
||||
if (i_stageNo == dStage_stagInfo_GetSaveTbl(dComIfGp_getStageStagInfo())) {
|
||||
#endif
|
||||
dComIfGs_offSwitch(i_no, -1);
|
||||
}
|
||||
|
||||
@@ -1523,7 +2162,12 @@ void dComIfGs_offStageSwitch(int i_stageNo, int i_no) {
|
||||
}
|
||||
|
||||
BOOL dComIfGs_isStageSwitch(int i_stageNo, int i_no) {
|
||||
#if TARGET_PC
|
||||
// Avoid trying to get the save table if stag info is NULL
|
||||
if (dComIfGp_getStageStagInfo() && i_stageNo == dStage_stagInfo_GetSaveTbl(dComIfGp_getStageStagInfo())) {
|
||||
#else
|
||||
if (i_stageNo == dStage_stagInfo_GetSaveTbl(dComIfGp_getStageStagInfo())) {
|
||||
#endif
|
||||
return dComIfGs_isSwitch(i_no, -1);
|
||||
} else {
|
||||
return dComIfGs_isSaveSwitch(i_stageNo, i_no);
|
||||
@@ -1531,7 +2175,12 @@ BOOL dComIfGs_isStageSwitch(int i_stageNo, int i_no) {
|
||||
}
|
||||
|
||||
void dComIfGs_onDungeonItemMap(int i_stageNo) {
|
||||
#if TARGET_PC
|
||||
// Avoid trying to get the save table if stag info is NULL
|
||||
if (dComIfGp_getStageStagInfo() && i_stageNo == dStage_stagInfo_GetSaveTbl(dComIfGp_getStageStagInfo())) {
|
||||
#else
|
||||
if (i_stageNo == dStage_stagInfo_GetSaveTbl(dComIfGp_getStageStagInfo())) {
|
||||
#endif
|
||||
dComIfGs_onDungeonItemMap();
|
||||
}
|
||||
|
||||
@@ -1547,7 +2196,12 @@ void dComIfGs_offDungeonItemMap(int i_stageNo) {
|
||||
}
|
||||
|
||||
s32 dComIfGs_isDungeonItemMap(int i_stageNo) {
|
||||
#if TARGET_PC
|
||||
// Avoid trying to get the save table if stag info is NULL
|
||||
if (dComIfGp_getStageStagInfo() && i_stageNo == dStage_stagInfo_GetSaveTbl(dComIfGp_getStageStagInfo())) {
|
||||
#else
|
||||
if (i_stageNo == dStage_stagInfo_GetSaveTbl(dComIfGp_getStageStagInfo())) {
|
||||
#endif
|
||||
return dComIfGs_isDungeonItemMap();
|
||||
}
|
||||
|
||||
@@ -1555,7 +2209,12 @@ s32 dComIfGs_isDungeonItemMap(int i_stageNo) {
|
||||
}
|
||||
|
||||
void dComIfGs_onDungeonItemCompass(int i_stageNo) {
|
||||
#if TARGET_PC
|
||||
// Avoid trying to get the save table if stag info is NULL
|
||||
if (dComIfGp_getStageStagInfo() && i_stageNo == dStage_stagInfo_GetSaveTbl(dComIfGp_getStageStagInfo())) {
|
||||
#else
|
||||
if (i_stageNo == dStage_stagInfo_GetSaveTbl(dComIfGp_getStageStagInfo())) {
|
||||
#endif
|
||||
dComIfGs_onDungeonItemCompass();
|
||||
}
|
||||
|
||||
@@ -1571,7 +2230,12 @@ void dComIfGs_offDungeonItemCompass(int i_stageNo) {
|
||||
}
|
||||
|
||||
s32 dComIfGs_isDungeonItemCompass(int i_stageNo) {
|
||||
#if TARGET_PC
|
||||
// Avoid trying to get the save table if stag info is NULL
|
||||
if (dComIfGp_getStageStagInfo() && i_stageNo == dStage_stagInfo_GetSaveTbl(dComIfGp_getStageStagInfo())) {
|
||||
#else
|
||||
if (i_stageNo == dStage_stagInfo_GetSaveTbl(dComIfGp_getStageStagInfo())) {
|
||||
#endif
|
||||
return dComIfGs_isDungeonItemCompass();
|
||||
}
|
||||
|
||||
@@ -1579,7 +2243,12 @@ s32 dComIfGs_isDungeonItemCompass(int i_stageNo) {
|
||||
}
|
||||
|
||||
void dComIfGs_onDungeonItemBossKey(int i_stageNo) {
|
||||
#if TARGET_PC
|
||||
// Avoid trying to get the save table if stag info is NULL
|
||||
if (dComIfGp_getStageStagInfo() && i_stageNo == dStage_stagInfo_GetSaveTbl(dComIfGp_getStageStagInfo())) {
|
||||
#else
|
||||
if (i_stageNo == dStage_stagInfo_GetSaveTbl(dComIfGp_getStageStagInfo())) {
|
||||
#endif
|
||||
dComIfGs_onDungeonItemBossKey();
|
||||
}
|
||||
|
||||
@@ -1595,7 +2264,12 @@ void dComIfGs_offDungeonItemBossKey(int i_stageNo) {
|
||||
}
|
||||
|
||||
s32 dComIfGs_isDungeonItemBossKey(int i_stageNo) {
|
||||
#if TARGET_PC
|
||||
// Avoid trying to get the save table if stag info is NULL
|
||||
if (dComIfGp_getStageStagInfo() && i_stageNo == dStage_stagInfo_GetSaveTbl(dComIfGp_getStageStagInfo())) {
|
||||
#else
|
||||
if (i_stageNo == dStage_stagInfo_GetSaveTbl(dComIfGp_getStageStagInfo())) {
|
||||
#endif
|
||||
return dComIfGs_isDungeonItemBossKey();
|
||||
}
|
||||
|
||||
@@ -2283,6 +2957,95 @@ int dComIfGd_setShadow(u32 param_0, s8 param_1, J3DModel* param_2, cXyz* param_3
|
||||
}
|
||||
}
|
||||
|
||||
#if TARGET_PC
|
||||
void dComIfGs_setupRandomizerSave() {
|
||||
|
||||
// Setup file based on randomizer data
|
||||
auto& randoData = randomizer_GetContext();
|
||||
randoData.mCreatingSave = true;
|
||||
|
||||
// Set starting flags
|
||||
// Event Flags
|
||||
for (const auto& flag : randoData.mStartEventFlags) {
|
||||
dComIfGs_onEventBit(flag);
|
||||
}
|
||||
// Region Flags
|
||||
for (const auto& [region, flags] : randoData.mStartRegionFlags) {
|
||||
for (const auto& flag : flags) {
|
||||
dComIfGs_onRegionFlag(region, flag);
|
||||
}
|
||||
}
|
||||
|
||||
// Map bits (fills in overworld on map)
|
||||
dComIfGs_setRegionBit(randoData.mMapBits);
|
||||
|
||||
// Other flags based on starting flags
|
||||
if (dComIfGs_isEventBit(CLEARED_FARON_TWILIGHT))
|
||||
{
|
||||
dComIfGs_onDarkClearLV(0);
|
||||
dComIfGs_setLightDropNum(0, 0x10);
|
||||
execItemGet(dItemNo_Randomizer_DROP_CONTAINER_e);
|
||||
execItemGet(dItemNo_Randomizer_WEAR_KOKIRI_e);
|
||||
}
|
||||
|
||||
if (dComIfGs_isEventBit(CLEARED_ELDIN_TWILIGHT))
|
||||
{
|
||||
dComIfGs_onDarkClearLV(1);
|
||||
dComIfGs_setLightDropNum(1, 0x10);
|
||||
execItemGet(dItemNo_Randomizer_DROP_CONTAINER02_e);
|
||||
}
|
||||
|
||||
if (dComIfGs_isEventBit(CLEARED_LANAYRU_TWILIGHT))
|
||||
{
|
||||
dComIfGs_onDarkClearLV(2);
|
||||
dComIfGs_setLightDropNum(2, 0x10);
|
||||
execItemGet(dItemNo_Randomizer_DROP_CONTAINER03_e);
|
||||
}
|
||||
|
||||
if (randoData.mSettings[RandomizerContext::SKIP_MINOR_CUTSCENES] == RandomizerContext::ON)
|
||||
{
|
||||
// Add letter data in this order to more or less reflect an order they can be obtained in game
|
||||
static const int letterOrder[] = {3, 2, 4, 7, 5, 6, 13, 12, 10, 9, 8, 15, 0, 14, 11};
|
||||
int letterNum = 0;
|
||||
for (int i : letterOrder) {
|
||||
if (dMenu_Letter::getLetterName(i) != 0) {
|
||||
dComIfGs_onLetterGetFlag(i);
|
||||
dComIfGs_setGetNumber(letterNum++, i + 1);
|
||||
}
|
||||
}
|
||||
dComIfGs_setAllLetterRead();
|
||||
}
|
||||
|
||||
// If MDH and the twilights are pre-completed
|
||||
if (dComIfGs_isEventBit(MIDNAS_DESPERATE_HOUR_COMPLETED))
|
||||
{
|
||||
if ((dComIfGs_getDarkClearLV() & 0x7) == 0x7)
|
||||
{
|
||||
dComIfGs_onDarkClearLV(3);
|
||||
dComIfGs_onTransformLV(3); // Puts Midna on players back
|
||||
}
|
||||
}
|
||||
|
||||
// Set starting inventory
|
||||
for (const auto& itemId: randoData.mStartingInventory) {
|
||||
execItemGet(itemId);
|
||||
}
|
||||
|
||||
g_randomizerState = RandomizerState();
|
||||
DuskLog.debug("Created Rando Save");
|
||||
randoData.mCreatingSave = false;
|
||||
}
|
||||
|
||||
u8 dComIfGs_getCollectSmell() {
|
||||
// In randomizer, always return the reekfish scent if the player is in Snowpeak and has gotten the
|
||||
// smell before.
|
||||
if (randomizer_IsActive() && getStageID() == Snowpeak && dComIfGs_isEventBit(GOT_REEKFISH_SCENT)) {
|
||||
return dItemNo_SMELL_FISH_e;
|
||||
}
|
||||
return g_dComIfG_gameInfo.info.getPlayer().getPlayerStatusA().getSelectEquip(COLLECT_SMELL);
|
||||
}
|
||||
#endif
|
||||
|
||||
void dComIfGs_gameStart() {
|
||||
dComIfGp_offEnableNextStage();
|
||||
|
||||
@@ -2633,6 +3396,20 @@ void dComIfGs_setSelectEquipShield(u8 i_itemNo) {
|
||||
g_dComIfG_gameInfo.info.getPlayer().getPlayerStatusA().setSelectEquip(COLLECT_SHIELD, i_itemNo);
|
||||
}
|
||||
|
||||
#if TARGET_PC
|
||||
u8 dComIfGs_getKeyNum(int i_stageNo) {
|
||||
// If we're on the current stage for this key, take the current stage info
|
||||
if (dComIfGp_getStageStagInfo()) {
|
||||
if (i_stageNo == dStage_stagInfo_GetSaveTbl(dComIfGp_getStageStagInfo())) {
|
||||
return dComIfGs_getKeyNum();
|
||||
}
|
||||
}
|
||||
|
||||
// Otherwise take info from the save
|
||||
return g_dComIfG_gameInfo.info.getSavedata().getSave(i_stageNo).getBit().getKeyNum();
|
||||
}
|
||||
#endif
|
||||
|
||||
void dComIfGs_setKeyNum(int i_stageNo, u8 i_keyNum) {
|
||||
if (dComIfGp_getStageStagInfo()) {
|
||||
if (i_stageNo == dStage_stagInfo_GetSaveTbl(dComIfGp_getStageStagInfo())) {
|
||||
|
||||
+11
-2
@@ -386,7 +386,13 @@ int dEvt_control_c::talkEnd() {
|
||||
if (item != NULL && fopAcM_GetName(item) == fpcNm_ITEM_e) {
|
||||
item->dead();
|
||||
}
|
||||
|
||||
#if TARGET_PC
|
||||
if (g_randomizerState.getHasPendingToDChange())
|
||||
{
|
||||
g_randomizerState.setHasPendingToDChange(false);
|
||||
g_randomizerState.handleTimeOfDayChange();
|
||||
}
|
||||
#endif
|
||||
return 1;
|
||||
}
|
||||
|
||||
@@ -880,7 +886,10 @@ bool dEvt_control_c::skipper() {
|
||||
}
|
||||
|
||||
bool is_trig_skipbtn = mDoCPd_c::getTrigStart(PAD_1);
|
||||
if (is_trig_skipbtn) {
|
||||
// Automatically skip cutscenes in rando if Skip Major Cutscenes is on
|
||||
if (is_trig_skipbtn IF_DUSK(||
|
||||
(randomizer_IsActive() && canSkip &&
|
||||
randomizer_GetContext().mSettings[RandomizerContext::SKIP_MAJOR_CUTSCENES] == RandomizerContext::ON))) {
|
||||
if (mSkipTimer > 0) {
|
||||
mSkipTimer = -1;
|
||||
|
||||
|
||||
@@ -14,6 +14,9 @@
|
||||
#include "d/d_s_play.h"
|
||||
#include "SSystem/SComponent/c_counter.h"
|
||||
#include <cstring>
|
||||
#if TARGET_PC
|
||||
#include "dusk/randomizer/game/verify_item_functions.h"
|
||||
#endif
|
||||
|
||||
#include "dusk/string.hpp"
|
||||
|
||||
@@ -335,6 +338,12 @@ bool dEvent_manager_c::setObjectArchive(DUSK_CONST char* arcname) {
|
||||
|
||||
if (arcname != NULL) {
|
||||
rt = dComIfG_getObjectRes(arcname, DataFileName);
|
||||
#if TARGET_PC
|
||||
// Pretty hacky, but change the itemId for the event of charlo giving us the heart piece
|
||||
if (randomizer_IsActive() && strcmp(arcname, "Prayer") == 0) {
|
||||
static_cast<u8*>(rt)[0x927] = verifyProgressiveItem(randomizer_getItemAtLocation("Charlo Donation Blessing"));
|
||||
}
|
||||
#endif
|
||||
int base_status = mEventList[BASE_ACTOR].init((char*)rt, -1);
|
||||
|
||||
#if DEBUG
|
||||
|
||||
@@ -16,6 +16,7 @@
|
||||
|
||||
#include "dusk/string.hpp"
|
||||
#include "dusk/version.hpp"
|
||||
#include "dusk/archipelago/archipelago_context.hpp"
|
||||
|
||||
dFile_info_c::dFile_info_c(JKRArchive* i_archive, u8 param_1) {
|
||||
mArchive = i_archive;
|
||||
@@ -116,6 +117,26 @@ int dFile_info_c::setSaveData(dSv_save_c* i_savedata, BOOL i_validChksum, u8 i_d
|
||||
SAFE_STRCPY(mPlayerName, player_name);
|
||||
setSaveDate(i_savedata);
|
||||
setPlayTime(i_savedata);
|
||||
#if TARGET_PC
|
||||
// If this is a randomizer file
|
||||
auto curFileSeedHash = dusk::getSettings().randomizer.seedHashes.at(i_dataNo).getValue();
|
||||
if (!curFileSeedHash.empty()) {
|
||||
bool isArchipelago = dusk::archi::ArchipelagoContext::IsSeedHashArchipelago(curFileSeedHash);
|
||||
|
||||
// Overwrite "Save time" text with "Randomizer" or "Archipelago"
|
||||
auto saveTimeText = (J2DTextBox*)mFileInfo.Scr->search(MULTI_CHAR('f_s_t_02'));
|
||||
dusk::SafeStringCopy(saveTimeText->getStringPtr(), isArchipelago ? "Archipelago" : "Randomizer");
|
||||
saveTimeText->setHBinding(J2DTextBoxHBinding::HBIND_LEFT);
|
||||
|
||||
// Overwrite the "Total play time" text with the seed hash
|
||||
auto playTimeText = (J2DTextBox*)mFileInfo.Scr->search(MULTI_CHAR('f_p_t_02'));
|
||||
dusk::SafeStringCopy(playTimeText->getStringPtr(), curFileSeedHash.c_str());
|
||||
|
||||
// Give the text double the space on the menu incase the seed hash is long
|
||||
playTimeText->setHBinding(J2DTextBoxHBinding::HBIND_LEFT);
|
||||
playTimeText->resize(playTimeText->getWidth() * 2, playTimeText->getHeight());
|
||||
}
|
||||
#endif
|
||||
result = 0;
|
||||
}
|
||||
} else {
|
||||
|
||||
+232
-2
@@ -23,9 +23,16 @@
|
||||
#include "m_Do/m_Do_graphic.h"
|
||||
#include <cstring>
|
||||
|
||||
#include "dusk/archipelago/archipelago_context.hpp"
|
||||
#include "dusk/ui/archi_connect_modal.hpp"
|
||||
|
||||
#if TARGET_PC
|
||||
#include "dusk/config.hpp"
|
||||
#include "dusk/menu_pointer.h"
|
||||
#include "dusk/string.hpp"
|
||||
#include "dusk/ui/modal.hpp"
|
||||
#include "dusk/ui/rando_config.hpp"
|
||||
#include "dusk/ui/ui.hpp"
|
||||
|
||||
namespace {
|
||||
constexpr u8 pointer_target(u8 group, u8 index) noexcept {
|
||||
@@ -293,6 +300,10 @@ static DataSelProcFunc DataSelProc[] = {
|
||||
&dFile_select_c::dataSelectMoveAnime,
|
||||
&dFile_select_c::selectDataOpenMove,
|
||||
&dFile_select_c::selectDataNameMove,
|
||||
#if TARGET_PC
|
||||
&dFile_select_c::selectDataPlayTypeMove,
|
||||
&dFile_select_c::menuArchipelagoConnect,
|
||||
#endif
|
||||
&dFile_select_c::selectDataOpenEraseMove,
|
||||
&dFile_select_c::menuSelect,
|
||||
&dFile_select_c::menuSelectMoveAnm,
|
||||
@@ -999,7 +1010,12 @@ void dFile_select_c::dataSelectStart() {
|
||||
mpName->initial();
|
||||
modoruTxtChange(1);
|
||||
|
||||
#if TARGET_PC
|
||||
mDataSelProc = DATASELPROC_SELECT_DATA_PLAY_MOVE;
|
||||
mDusk.mStartNameAnm = false;
|
||||
#else
|
||||
mDataSelProc = DATASELPROC_SELECT_DATA_NAME_MOVE;
|
||||
#endif
|
||||
} else {
|
||||
#if PLATFORM_GCN
|
||||
dComIfGs_setNewFile(0);
|
||||
@@ -1018,6 +1034,66 @@ void dFile_select_c::dataSelectStart() {
|
||||
ketteiTxtDispAnmInit(0);
|
||||
#endif
|
||||
|
||||
#if TARGET_PC
|
||||
headerTxtSet(msgTbl[mSelectNum], 1, 0);
|
||||
makeRecInfo(mSelectNum);
|
||||
|
||||
// Load the randomizer seed if one is tied to this file
|
||||
auto curFileSeedHash = dusk::getSettings().randomizer.seedHashes.at(mSelectNum).getValue();
|
||||
// If this is a vanilla file, clear rando data structures
|
||||
if (curFileSeedHash.empty()) {
|
||||
g_randomizerState = RandomizerState();
|
||||
randomizer_GetContext() = RandomizerContext();
|
||||
mDataSelProc = DATASELPROC_SELECT_DATA_OPEN_MOVE;
|
||||
|
||||
// ensure archipelago is not connected either
|
||||
if (dusk::archi::ArchipelagoContext::IsConnected())
|
||||
dusk::archi::ArchipelagoContext::DisconnectFromServer();
|
||||
|
||||
selectDataMoveAnmInitSet(SelOpenStartFrameTbl[mSelectNum], SelOpenEndFrameTbl[mSelectNum]);
|
||||
menuMoveAnmInitSet(799, 809);
|
||||
selectWakuAlpahAnmInit(mSelectNum, 0xff, 0, g_fsHIO.select_box_appear_frames);
|
||||
}
|
||||
else if (dusk::archi::ArchipelagoContext::IsSeedHashArchipelago(curFileSeedHash)) {
|
||||
if (dusk::archi::ArchipelagoContext::IsConnected()) {
|
||||
// if connected, we need to check if we're already connected to the right slot/seed,
|
||||
// if so, we can continue straight to file start, otherwise a disconnect must happen first.
|
||||
if (!dusk::archi::ArchipelagoContext::IsCurrentSeedHash(curFileSeedHash)) {
|
||||
mDataSelProc = DATASELPROC_MENU_ARCHIPELAGO_CONNECT;
|
||||
mDusk.mArchipelagoBeginConnect = true;
|
||||
mDusk.mArchiStartCloseFile = false;
|
||||
}else {
|
||||
mDataSelProc = DATASELPROC_SELECT_DATA_OPEN_MOVE;
|
||||
|
||||
selectDataMoveAnmInitSet(SelOpenStartFrameTbl[mSelectNum], SelOpenEndFrameTbl[mSelectNum]);
|
||||
menuMoveAnmInitSet(799, 809);
|
||||
selectWakuAlpahAnmInit(mSelectNum, 0xff, 0, g_fsHIO.select_box_appear_frames);
|
||||
}
|
||||
}else {
|
||||
mDataSelProc = DATASELPROC_MENU_ARCHIPELAGO_CONNECT;
|
||||
mDusk.mArchipelagoBeginConnect = true;
|
||||
mDusk.mArchiStartCloseFile = false;
|
||||
}
|
||||
}else {
|
||||
// Reset randomizer state if we're switching to a different file
|
||||
if (curFileSeedHash != randomizer_GetContext().mHash || g_randomizerState.mFileNum != mSelectNum) {
|
||||
g_randomizerState = RandomizerState();
|
||||
randomizer_GetContext() = RandomizerContext();
|
||||
randomizer_GetContext().LoadFromHash(curFileSeedHash);
|
||||
}
|
||||
|
||||
// disconnect from archipelago if applicable
|
||||
if (dusk::archi::ArchipelagoContext::IsConnected())
|
||||
dusk::archi::ArchipelagoContext::DisconnectFromServer();
|
||||
|
||||
selectDataMoveAnmInitSet(SelOpenStartFrameTbl[mSelectNum], SelOpenEndFrameTbl[mSelectNum]);
|
||||
menuMoveAnmInitSet(799, 809);
|
||||
selectWakuAlpahAnmInit(mSelectNum, 0xff, 0, g_fsHIO.select_box_appear_frames);
|
||||
|
||||
mDataSelProc = DATASELPROC_SELECT_DATA_OPEN_MOVE;
|
||||
}
|
||||
#else
|
||||
|
||||
headerTxtSet(msgTbl[mSelectNum], 1, 0);
|
||||
selectDataMoveAnmInitSet(SelOpenStartFrameTbl[mSelectNum], SelOpenEndFrameTbl[mSelectNum]);
|
||||
menuMoveAnmInitSet(799, 809);
|
||||
@@ -1025,6 +1101,8 @@ void dFile_select_c::dataSelectStart() {
|
||||
makeRecInfo(mSelectNum);
|
||||
|
||||
mDataSelProc = DATASELPROC_SELECT_DATA_OPEN_MOVE;
|
||||
#endif
|
||||
|
||||
}
|
||||
|
||||
modoruTxtDispAnmInit(1);
|
||||
@@ -1313,6 +1391,133 @@ void dFile_select_c::selectDataNameMove() {
|
||||
}
|
||||
}
|
||||
|
||||
#if TARGET_PC
|
||||
// Custom Proc to allow the player to select the play type and a randomizer seed
|
||||
// Initially copied and expanded upon from dFile_select_c::selectDataNameMove
|
||||
void dFile_select_c::selectDataPlayTypeMove() {
|
||||
// If we want to start bringing in the name input
|
||||
if (mDusk.mStartNameAnm) {
|
||||
// Only do so when no documents are visible
|
||||
if (!dusk::ui::any_document_visible()) {
|
||||
if (mDusk.mBackToFileSelect) {
|
||||
// Code below copied from dFile_select_c::nameInput to initiate going back
|
||||
// to the file selection
|
||||
headerTxtSet(0x43, 1, 0);
|
||||
fileRecScaleAnmInitSet2(0.0f, 1.0f);
|
||||
nameMoveAnmInitSet(0xd29, 0xd1f);
|
||||
modoruTxtDispAnmInit(0);
|
||||
mDataSelProc = DATASELPROC_NAME_TO_DATA_SELECT_MOVE;
|
||||
} else {
|
||||
// Show the name pane if we went forward
|
||||
field_0x0128 = true;
|
||||
mNameBasePane->show();
|
||||
if (mDusk.mPendingRmlCloseFrames > 0) {
|
||||
mDusk.mPendingRmlCloseFrames -= 1;
|
||||
}
|
||||
if (mDusk.mPendingRmlCloseFrames == 0 && nameMoveAnm()) {
|
||||
mDataSelProc = DATASELPROC_NAME_INPUT_WAIT;
|
||||
mDusk.mStartNameAnm = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
// If the file select elements have disappeared, setup the play type modal
|
||||
else if (headerTxtChangeAnm() == true && fileRecScaleAnm2() == true &&
|
||||
modoruTxtDispAnm() == true)
|
||||
{
|
||||
// Push our modal for selecting the play type
|
||||
auto& playTypeModal = dusk::ui::push_document(std::make_unique<dusk::ui::Modal>(dusk::ui::Modal::Props{
|
||||
.title = "Play Type",
|
||||
.bodyRml = "What mode would you like to play?",
|
||||
.actions = {
|
||||
// If vanilla is selected, proceed to name entry and reset randomizer context
|
||||
dusk::ui::ModalAction{
|
||||
.label = "Vanilla",
|
||||
.onPressed = [this](dusk::ui::Modal& modal) {
|
||||
mDusk.mBackToFileSelect = false;
|
||||
mDoAud_seStartMenu(Z2SE_SY_CURSOR_OK);
|
||||
modal.hide(true);
|
||||
randomizer_GetContext() = RandomizerContext();
|
||||
}},
|
||||
// If randomizer is selected, proceed to the randomizer menu
|
||||
dusk::ui::ModalAction{
|
||||
.label = "Randomizer",
|
||||
.onPressed = [this](dusk::ui::Modal& modal) {
|
||||
mDoAud_seStartMenu(Z2SE_SY_CURSOR_OK);
|
||||
modal.hide(true);
|
||||
dusk::ui::push_document(std::make_unique<dusk::ui::FileSelectRandomizerWindow>(this));
|
||||
}},
|
||||
// If Archipelago is selected, open archipelago settings window
|
||||
dusk::ui::ModalAction{
|
||||
.label = "Archipelago",
|
||||
.onPressed = [this](dusk::ui::Modal& modal) {
|
||||
// pre-emptively set file num here for context to use
|
||||
dComIfGs_setDataNum(mSelectNum);
|
||||
|
||||
mDusk.mBackToFileSelect = false;
|
||||
mDoAud_seStartMenu(Z2SE_SY_CURSOR_OK);
|
||||
modal.hide(true);
|
||||
dusk::ui::BeginArchipelagoConnectionUI(true);
|
||||
}},
|
||||
},
|
||||
// If we dismiss this modal, go back to file selection
|
||||
.onDismiss = [this](dusk::ui::Modal& modal) {
|
||||
mDoAud_seStartMenu(Z2SE_SY_MENU_BACK);
|
||||
modal.hide(true);
|
||||
},
|
||||
.icon = "question-mark",
|
||||
}));
|
||||
|
||||
// The next time we call this function, begin waiting to show the name input
|
||||
mDusk.mStartNameAnm = true;
|
||||
|
||||
// By default, go back to the file selection after closing the various menus.
|
||||
mDusk.mBackToFileSelect = true;
|
||||
|
||||
// Wait 6 frames for the rmlui window transition after it closes
|
||||
mDusk.mPendingRmlCloseFrames = 6;
|
||||
|
||||
// Hide the name pane incase we go back
|
||||
field_0x0128 = false;
|
||||
mNameBasePane->hide();
|
||||
|
||||
playTypeModal.focus();
|
||||
}
|
||||
}
|
||||
|
||||
void dFile_select_c::menuArchipelagoConnect() {
|
||||
if (mDusk.mArchipelagoBeginConnect) {
|
||||
// set file num here for context to use
|
||||
dComIfGs_setDataNum(mSelectNum);
|
||||
|
||||
dusk::ui::BeginArchipelagoConnectionUI();
|
||||
mDusk.mArchipelagoBeginConnect = false;
|
||||
mDusk.mPendingRmlCloseFrames = 6;
|
||||
}else if (mDusk.mArchiStartCloseFile) {
|
||||
bool isHeaderTxtChange = headerTxtChangeAnm();
|
||||
bool isSelDataMove = selectDataMoveAnm();
|
||||
bool isKetteiTxtDisp = ketteiTxtDispAnm();
|
||||
|
||||
if (isHeaderTxtChange && isSelDataMove && isKetteiTxtDisp) {
|
||||
mDataSelProc = DATASELPROC_SELECT_DATA_OPEN_MOVE;
|
||||
mDusk.mArchipelagoBeginConnect = false;
|
||||
mDusk.mArchiStartCloseFile = false;
|
||||
}
|
||||
}else if (!dusk::ui::any_document_visible()) {
|
||||
if (mDusk.mPendingRmlCloseFrames > 0) {
|
||||
mDusk.mPendingRmlCloseFrames -= 1;
|
||||
}
|
||||
if (mDusk.mPendingRmlCloseFrames == 0) {
|
||||
mDusk.mArchiStartCloseFile = true;
|
||||
|
||||
selectDataMoveAnmInitSet(SelOpenStartFrameTbl[mSelectNum], SelOpenEndFrameTbl[mSelectNum]);
|
||||
menuMoveAnmInitSet(799, 809);
|
||||
selectWakuAlpahAnmInit(mSelectNum, 0xff, 0, g_fsHIO.select_box_appear_frames);
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
void dFile_select_c::selectDataOpenEraseMove() {
|
||||
bool isHeaderTxtChange = headerTxtChangeAnm();
|
||||
bool isSelDataMove = selectDataMoveAnm();
|
||||
@@ -1652,6 +1857,14 @@ void dFile_select_c::nameInput() {
|
||||
}
|
||||
|
||||
void dFile_select_c::nameToDataSelectMove() {
|
||||
#if TARGET_PC
|
||||
// Delay this animation to make for a smoother transition from the Rmlui menus
|
||||
if (mDusk.mPendingRmlCloseFrames > 0) {
|
||||
mDusk.mPendingRmlCloseFrames -= 1;
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
|
||||
bool isHeaderTxtChange = headerTxtChangeAnm();
|
||||
bool isFileRecScale = fileRecScaleAnm2();
|
||||
bool isNameMove = nameMoveAnm();
|
||||
@@ -1738,6 +1951,12 @@ void dFile_select_c::nameInput2() {
|
||||
case 2:
|
||||
dComIfGs_setHorseName(mpName->getInputStrPtr());
|
||||
mIsSelectEnd = true;
|
||||
#if TARGET_PC
|
||||
// Create a randomizer save if one is selected
|
||||
if (!randomizer_GetContext().mHash.empty()) {
|
||||
dComIfGs_setupRandomizerSave();
|
||||
}
|
||||
#endif
|
||||
mDataSelProc = DATASELPROC_NEXT_MODE_WAIT;
|
||||
}
|
||||
}
|
||||
@@ -2627,6 +2846,12 @@ void dFile_select_c::CommandExec() {
|
||||
mDoMemCd_setCopyToPos(mCpDataToNum);
|
||||
dataSave();
|
||||
mDataSelProc = DATASELPROC_DATA_COPY_WAIT;
|
||||
#if TARGET_PC
|
||||
// Copy over the seed hash as well
|
||||
auto& seedHashes = dusk::getSettings().randomizer.seedHashes;
|
||||
seedHashes[mCpDataToNum].setValue(seedHashes[mCpDataNum]);
|
||||
dusk::config::Save();
|
||||
#endif
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -2685,6 +2910,11 @@ void dFile_select_c::ErasePaneMoveOk() {
|
||||
if (iVar1 == 1 && iVar2 == 1) {
|
||||
field_0x0208 = 0;
|
||||
setSaveData();
|
||||
#if TARGET_PC
|
||||
// Clear the seed hash for this file when it gets erased
|
||||
dusk::getSettings().randomizer.seedHashes.at(mSelectNum).setValue("");
|
||||
dusk::config::Save();
|
||||
#endif
|
||||
makeRecInfo(mSelectNum);
|
||||
headerTxtSet(0x4b, 0, 0);
|
||||
mpFileWarning->closeInit();
|
||||
@@ -3456,7 +3686,7 @@ void dFile_select_c::screenSet() {
|
||||
mpFadePict->setBlackWhite(black, white);
|
||||
mpFadePict->setAlpha(0);
|
||||
#ifdef TARGET_PC
|
||||
mFadeDlst.mpPict = mpFadePict;
|
||||
mDusk.mFadeDlst.mpPict = mpFadePict;
|
||||
#endif
|
||||
#endif
|
||||
}
|
||||
@@ -4258,7 +4488,7 @@ void dFile_select_c::_draw() {
|
||||
|
||||
#if PLATFORM_GCN
|
||||
#if TARGET_PC
|
||||
dComIfGd_set2DOpaTop(&mFadeDlst);
|
||||
dComIfGd_set2DOpaTop(&mDusk.mFadeDlst);
|
||||
#else
|
||||
mpFadePict->draw(mDoGph_gInf_c::getMinXF(), mDoGph_gInf_c::getMinYF(),
|
||||
mDoGph_gInf_c::getWidthF(), mDoGph_gInf_c::getHeightF(), false, false,
|
||||
|
||||
@@ -156,6 +156,12 @@ int dGameover_c::_create() {
|
||||
if (!strcmp(dComIfGp_getLastPlayStageName(), "D_MN10A")) {
|
||||
// Last stage was Stallord Arena
|
||||
// Remove Ooccoo from inventory
|
||||
#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)
|
||||
#endif
|
||||
dComIfGs_setItem(SLOT_18, dItemNo_NONE_e);
|
||||
dComIfGs_resetLastWarpAcceptStage();
|
||||
}
|
||||
|
||||
+1598
-264
File diff suppressed because it is too large
Load Diff
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user