summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorlunarsoap5 <40438826+lunarsoap5@users.noreply.github.com>2020-07-18 14:41:40 -0500
committerGitHub <noreply@github.com>2020-07-18 14:41:40 -0500
commit43bd106d3e63fbc60fd93a31586dab52f023f0ac (patch)
treea37fabfda476a0d4234b6f9ef539c5fa73d335d1
parent580c8b01375bdb2b4499570ee758c2f2781b5267 (diff)
Updating to 0.16.1b0.16.1b
-rw-r--r--include/chestRando.h43
-rw-r--r--include/customChecks.h2
-rw-r--r--include/defines.h4
-rw-r--r--include/game_patches.h35
-rw-r--r--include/item.h9
-rw-r--r--include/mod.h21
-rw-r--r--include/singleton.h15
-rw-r--r--include/stage.h2
-rw-r--r--include/tp.eu.lst348
-rw-r--r--include/tp.jp.lst349
-rw-r--r--include/tp.us.lst372
-rw-r--r--include/tp/d_a_alink.h7
-rw-r--r--include/tp/d_a_shop_item_static.h63
-rw-r--r--include/tp/d_com_inf_game.h9
-rw-r--r--include/tp/d_item_data.h52
-rw-r--r--include/tp/d_meter2_info.h12
-rw-r--r--include/tp/d_stage.h14
-rw-r--r--include/tp/dzx.h11
-rw-r--r--include/tp/resource.h11
-rw-r--r--source/chestRando.cpp483
-rw-r--r--source/game_patches.cpp435
-rw-r--r--source/item.cpp36
-rw-r--r--source/itemChecks.cpp550
-rw-r--r--source/mod.cpp1803
-rw-r--r--source/singleton.cpp15
-rw-r--r--source/stage.cpp5
26 files changed, 2987 insertions, 1719 deletions
diff --git a/include/chestRando.h b/include/chestRando.h
index 4779813..a030d77 100644
--- a/include/chestRando.h
+++ b/include/chestRando.h
@@ -40,6 +40,9 @@ namespace mod
u8 areDungeonItemsRandomized = 1;
u8 isTwilightSkipEnabled = 1;
u8 isKeysanityEnabled = 1;
+ u8 areHeartPiecesRandomized = 1;
+ u8 areRupeesRandomized = 1;
+ u8 areAmmoRandomized = 1;
u8 itemThatReplacesHalfMilk = 0;
u8 itemThatReplacesSlingShot = 0;
@@ -69,14 +72,14 @@ namespace mod
*
* excludes hyrule castle since boss doesn't spawn heart container
*/
- bool isStageBoss();
-
- /**
- * checks if the stage is one of the 5 grotto stages
- */
-
- bool isStageDungeon();
-
+ bool isStageBoss();
+
+ /**
+ * checks if the stage is one of the 5 grotto stages
+ */
+
+ bool isStageDungeon();
+
bool isStageGrotto();
bool isStageInterior();
@@ -126,20 +129,20 @@ namespace mod
*/
bool isItemBombs(u8 itemID);
- /**
- * checks if item given is a bottle content without a bottle
- */
+ /**
+ * checks if item given is a bottle content without a bottle
+ */
bool isItemBottleFill(u8 itemID);
- /**
- *
- * places the key checks correctly
- */
- void handleKeysanity();
-
- /**
- * check if the check gotten in a grotto is the right one
- */
+ /**
+ *
+ * places the key checks correctly
+ */
+ void handleKeysanity();
+
+ /**
+ * check if the check gotten in a grotto is the right one
+ */
bool isGrottoCheckOk(u16 checkID);
};
} \ No newline at end of file
diff --git a/include/customChecks.h b/include/customChecks.h
index 732bc3b..feee56a 100644
--- a/include/customChecks.h
+++ b/include/customChecks.h
@@ -38,7 +38,7 @@ namespace mod
/*Sera Bottle*/
{"F_SP103", 0, 1, 0x7C, 0x65, 0x444C8DC3, 0x42AF0000, 0xC4CB2577, 0xA3E7, []() { gameInfo.scratchPad.eventBits[0x12] |= 0x8;/*can shop at Sera's shop*/ gameInfo.scratchPad.eventBits[0x14] |= 0x8;/*Sera Bottle gotten*/ }, []() { return (gameInfo.localAreaNodes.unk_0[0xC] & 0x2) != 0;/*is goats 1 done*/ } },
/*Slingshot*/
- {"F_SP103", 0, 0, 0x78, 0x4B, 0xC3EDF8A9, 0x44CD922E, 0x45F31BF5, 0x7881, nullptr /*Flag is set in game_patches to avoid interaction with vanilla check*/, []() { return gameInfo.scratchPad.counters.rupees >= 30 && (gameInfo.localAreaNodes.unk_0[0xC] & 0x2) != 0;/*is goats 1 done*/ } },
+ {"F_SP103", 0, 0, 0x78, 0x4B, 0xC3EDF8A9, 0x44CD922E, 0x45F31BF5, 0x7881, nullptr /*Flag is set in game_patches to avoid interaction with vanilla check*/, []() { return (gameInfo.localAreaNodes.unk_0[0xC] & 0x2) != 0;/*is goats 1 done*/ } },
/*Lantern*/
{"F_SP108", 0xFF, 1, 0xF8, 0x48, 0xC66D4C1B, 0x41C19A25, 0xC65D2696, 0x36EC, nullptr, []() { return true; } },
/*Zora Armor*/
diff --git a/include/defines.h b/include/defines.h
index 96898c7..e44f1d4 100644
--- a/include/defines.h
+++ b/include/defines.h
@@ -34,12 +34,12 @@ union typeTransform {
};
// Array modification
-#define MAX_LOAD_EVENTS 20 // eventListener
+#define MAX_LOAD_EVENTS 40 // eventListener
#define MAX_HUDCONSOLE_PAGES 12 // HUDConsole
// Mnemonics
#define AUTHOR "ZTPR"
-#define VERSION "v0.16b"
+#define VERSION "v0.16.1b"
#define RAND_SEED mod::tools::randomSeed
#define gameInfo tp::d_com_inf_game::dComIfG_gameInfo
#define getPlayerPos tp::d_map_path_dmap::getMapPlayerPos
diff --git a/include/game_patches.h b/include/game_patches.h
index bc25d17..357613d 100644
--- a/include/game_patches.h
+++ b/include/game_patches.h
@@ -47,6 +47,7 @@ namespace mod::game_patch
*/
void removeIBLimit();
+
/**
* Changes the max rupee amounts for each
* of the wallets
@@ -189,5 +190,39 @@ namespace mod::game_patch
*/
void skipMDH();
+ /**
+ * unset the story flag and boss flag when re-entering a dungeon
+ */
void setLanternFlag();
+
+ void breakBarrier();
+
+ /**
+ * unset the story flag and boss flag when re-entering a dungeon
+ */
+ void fixFTState();
+ void fixGMState();
+ void fixLBTState();
+ void fixAGState();
+ void fixSPRState();
+ void fixToTState();
+ void fixCiTSState();
+
+ /**
+ * reset the flags for a dungeon if it has been beaten or if a skip is active
+ */
+ void setFTDungeonFlag();
+ void setFTBossFlag();
+ void setGMDungeonFlag();
+ void setGMBossFlag();
+ void setLakeDungeonFlags();
+ void setLBTBossFlag();
+ void setAGDungeonFlag();
+ void setAGBossFlag();
+ void setSPRDungeonFlag();
+ void setSPRBossFlag();
+ void setToTDungeonFlag();
+ void setToTBossFlag();
+ void setCiTSDungeonFlag();
+ void setCiTSBossFlag();
} \ No newline at end of file
diff --git a/include/item.h b/include/item.h
index e4dfc06..cd9964e 100644
--- a/include/item.h
+++ b/include/item.h
@@ -38,7 +38,7 @@ namespace mod::item
Coral_Earring = 0b000000000000000010000,//0x3D
Wooden_Sword = 0b000000000000000001000,//0x3F
Ordon_Sword = 0b000000000000000000100,//0x28
- Master_Sword = 0b000000000000000000010,//0x29 locked not randomized yet (implies transformation too)
+ Shadow_Crystal = 0b000000000000000000010,//0x32
Shield = 0b000000000000000000001,//0x2C
};
@@ -78,8 +78,9 @@ namespace mod::item
ItemCheck* destination;
};
- /**
- * Contains the values for the flags to be set to skip the animations of first getting specific items
- */
+ /**
+ * Contains the values for the flags to be set to skip the animations of first getting specific items
+ */
extern u8 itemGetAnimationFlags[10];
+ extern u8 itemsWithNoFieldModel[2];
} \ No newline at end of file
diff --git a/include/mod.h b/include/mod.h
index 32c755b..9a650ba 100644
--- a/include/mod.h
+++ b/include/mod.h
@@ -7,6 +7,7 @@
#include "eventListener.h"
#include "chestRando.h"
#include "HUDConsole.h"
+#include <string>
namespace mod
{
@@ -124,6 +125,7 @@ namespace mod
u8 bombBag1Ammo;
u8 bombBag2Ammo;
u8 bombBag3Ammo;
+ u8 lastGoodSpawn;
u8 yetaTrickOn = 0;
@@ -133,6 +135,15 @@ namespace mod
u8 eventFlagToEdit = 0;
u8 newValueForEventFlag = 0;
u8 triggerEventFlagEdit = 0;
+ u8 innerRed = 0x50;
+ u8 innerGreen = 0x28;
+ u8 innerBlue = 0x14;
+ u8 outerRed = 0x28;
+ u8 outerGreen = 0x1E;
+ u8 outerBlue = 0x0A;
+
+ char itemName[10];
+ //u8 newItemId;
// Functions
private:
@@ -155,6 +166,10 @@ namespace mod
void procItem_func_UTUWA_HEART();
+ bool canQuickTransform();
+
+ bool canChangeToD();
+
/**
* gives the unlocked scent that can be seen in the current area (defaults to most advanced one obtained)
*/
@@ -202,7 +217,13 @@ namespace mod
*/
void doCustomTRESActor(void* mStatus_roomControl);
+ void changeLanternColor();
+
+ void fixFTTotemMonkey();
+
+ //void setFieldModels();
+ //bool procActorCommonLayerInit(void* mStatus_roomControl, tp::d_stage::dzxChunkTypeInfo* chunkTypeInfo, s32 unk3, void* unk4);
// Private members
//private:
diff --git a/include/singleton.h b/include/singleton.h
index eabcd1b..8ae4523 100644
--- a/include/singleton.h
+++ b/include/singleton.h
@@ -31,6 +31,21 @@ namespace mod
u8 diababaMusicFixed;
u8 midnaTimeControl;
u8 hasActorCommonLayerRan;
+ u8 isEarlyToTEnabled;
+ u8 isEarlyPoTEnabled;
+ u8 isGMStoryPatch;
+ u8 isEarlyHCEnabled;
+ u8 startWithCrystal;
+
+ //dungeon flags
+ u8 hasFTBeenBeaten;
+ u8 hasGMBeenBeaten;
+ u8 hasLBTBeenBeaten;
+ u8 hasAGBeenBeaten;
+ u8 hasSPRBeenBeaten;
+ u8 hasToTBeenBeaten;
+ u8 hasCiTSBeenBeaten;
+ u8 hasCiTSOoccoo;
private:
diff --git a/include/stage.h b/include/stage.h
index 53739d9..ac4e1b7 100644
--- a/include/stage.h
+++ b/include/stage.h
@@ -12,5 +12,5 @@ namespace mod::stage
extern const char* caveStages[6];
extern const char* interiorStages[8];
extern const char* specialStages[3];
- extern const char* timeOfDayStages[19];
+ extern const char* timeOfDayStages[18];
} \ No newline at end of file
diff --git a/include/tp.eu.lst b/include/tp.eu.lst
index 87ac358..04bc152 100644
--- a/include/tp.eu.lst
+++ b/include/tp.eu.lst
@@ -1,171 +1,181 @@
-// memory
-80003458:memset
-80003540:memcpy
-
-// m_Do_ext.o
-// text
-8000EDA8:getArchiveHeapPtr
-// data
-80452BF4:archiveHeap
-
-// d_save.o
-80032B50:getRupeeMax
-800351EC:getSave
-80035220:putSave
-
-/ d_stage.o
-80025914:actorCommonLayerInit
-80025AE0:actorInit
-// data
-803F8034:mStatus_roomControl
-
-// d_event.o
-800428A8:defaultSkipStb
-80042B04:skipper
-
-// f_op_scene_req.o
-// data
-804525D4:freezeActors
-80452CA0:isUsingOfOverlap
-
-// f_ap_game.o
-80018B14:fapGm_Execute
-
-// f_op_actor_mng.o
-8001BC90:createItemForPresentDemo
-8001BD1C:createItemForTrBoxDemo
-8001C120:createDemoItem
-8001C17C:createItemForBoss
-8001C21C:createItemForMidBoss
-8001C260:createItemForDirectGet
-8001C2A4:createItemForSimpleDemo
-
-// d_map_path_dmap.o
-8003EF8C:getMapPlayerPos
-8003F050:getMapPlayerAngleY
-
-// d_item.o
-80097FBC:execItemGet
-80098010:checkItemGet
-800983E4:item_func_UTUWA_HEART
-
-// d_a_alink.h
-8009DC6C:checkStageName
-800B2928:setStickData
-800BB6C4:checkHeavyStateOn
-800C7A00:procCoMetamorphoseInit
-8011A908:checkTreasureRupeeReturn
-803DEDF4:linkStatus
-// data
-8039038C:ladderVars
-
-// d_menu_collect.o
-801B3598:setWalletMaxNum
-
-// d_msg_flow.o
-8024BF88:query022
-
-// DynamicLink.o
-80263A5C:do_link
-
-// JKRExpHeap.o
-802CFF28:do_alloc_JKRExpHeap
-802D05AC:do_free_JKRExpHeap
-
-// OSCache.o
-// 8033C36C:DCEnable
-// 8033C380:DCInvalidateRange
-8033C3AC:DCFlushRange
-// 8033C3DC:DCStoreRange
-// 8033C40C:DCFlushRangeNoSync
-// 8033C438:DCStoreRangeNoSync
-// 8033C464:DCZeroRange
-8033C490:ICInvalidateRange
-// 8033C4C4:ICFlashInvalidate
-// 8033C4D4:ICEnable
-// 8033C4E8:__LCEnable
-// 8033C5B4:LCEnable
-// 8033C5EC:LCDisable
-// 8033C614:LCStoreBlocks
-// 8033C638:LCStoreData
-// 8033C6E4:LCQueueWait
-// 8033C6F8:L2GlobalInvalidate
-// 8033C790:DMAErrorHandler
-// 8033C8F0:__OSCacheInit
-
-// runtime.o
-80362F38:_savefpr_14
-80362F3C:_savefpr_15
-80362F40:_savefpr_16
-80362F44:_savefpr_17
-80362F48:_savefpr_18
-80362F4C:_savefpr_19
-80362F50:_savefpr_20
-80362F54:_savefpr_21
-80362F58:_savefpr_22
-80362F5C:_savefpr_23
-80362F60:_savefpr_24
-80362F64:_savefpr_25
-80362F68:_savefpr_26
-80362F6C:_savefpr_27
-80362F70:_savefpr_28
-80362F74:_savefpr_29
-80362F78:_savefpr_30
-80362F7C:_savefpr_31
-80362FD0:_savegpr_14
-80362FD4:_savegpr_15
-80362FD8:_savegpr_16
-80362FDC:_savegpr_17
-80362FE0:_savegpr_18
-80362FE4:_savegpr_19
-80362FE8:_savegpr_20
-80362FEC:_savegpr_21
-80362FF0:_savegpr_22
-80362FF4:_savegpr_23
-80362FF8:_savegpr_24
-80362FFC:_savegpr_25
-80363000:_savegpr_26
-80363004:_savegpr_27
-80363008:_savegpr_28
-8036300C:_savegpr_29
-80363010:_savegpr_30
-80363014:_savegpr_31
-8036328C:__umoddi3
-
-// mem.o
-80366EBC:memcmp
-
-// printf.o
-8036730C:sprintf
-803673EC:snprintf
-
-// string.o
-803697C4:strcmp
-8036995C:strcpy
-80369918:strncpy
-
-//currentState
-803A8393:current_state
-
-// m_Do_controller_pad.o
-// data
-803DF288:cpadInfo
-
-// d_com_inf_game.o
-// data
-80408160:dComIfG_gameInfo
-8002B414:setItemBombNumCount
-
-// d_kankyo.o
-// data
-8042EA14:env_light
-
-// JFWSystem.o
-// data
+// memory
+80003458:memset
+80003540:memcpy
+
+// m_Do_ext.o
+// text
+8000EDA8:getArchiveHeapPtr
+// data
+80452BF4:archiveHeap
+
+// d_save.o
+80032B50:getRupeeMax
+800351EC:getSave
+80035220:putSave
+
+/ d_stage.o
+80025914:actorCommonLayerInit
+80025AE0:actorInit
+// data
+803F8034:mStatus_roomControl
+
+// d_event.o
+800428A8:defaultSkipStb
+80042B04:skipper
+
+// f_op_scene_req.o
+// data
+804525D4:freezeActors
+80452CA0:isUsingOfOverlap
+
+// f_ap_game.o
+80018B14:fapGm_Execute
+
+// f_op_actor_mng.o
+8001BC90:createItemForPresentDemo
+8001BD1C:createItemForTrBoxDemo
+8001C120:createDemoItem
+8001C17C:createItemForBoss
+8001C21C:createItemForMidBoss
+8001C260:createItemForDirectGet
+8001C2A4:createItemForSimpleDemo
+
+// d_map_path_dmap.o
+8003EF8C:getMapPlayerPos
+8003F050:getMapPlayerAngleY
+
+// d_item.o
+80097FBC:execItemGet
+80098010:checkItemGet
+800983E4:item_func_UTUWA_HEART
+
+// d_a_alink.h
+8009DC6C:checkStageName
+800B2928:setStickData
+800BB6C4:checkHeavyStateOn
+800C7A00:procCoMetamorphoseInit
+8011A908:checkTreasureRupeeReturn
+803DEDF4:linkStatus
+8038FF7C:lanternVariables
+80115E2C:checkEventRun
+800CF47C:checkCanoeRide
+800CF468:checkBoardRide
+800CF490:checkHorseRide
+800CF4D4:checkSpinnerRide
+800CF4C0:checkBoarRide
+// data
+8039038C:ladderVars
+
+// d_menu_collect.o
+801B3598:setWalletMaxNum
+
+// d_msg_flow.o
+8024BF88:query022
+
+// DynamicLink.o
+80263A5C:do_link
+
+// JKRExpHeap.o
+802CFF28:do_alloc_JKRExpHeap
+802D05AC:do_free_JKRExpHeap
+
+// OSCache.o
+// 8033C36C:DCEnable
+// 8033C380:DCInvalidateRange
+8033C3AC:DCFlushRange
+// 8033C3DC:DCStoreRange
+// 8033C40C:DCFlushRangeNoSync
+// 8033C438:DCStoreRangeNoSync
+// 8033C464:DCZeroRange
+8033C490:ICInvalidateRange
+// 8033C4C4:ICFlashInvalidate
+// 8033C4D4:ICEnable
+// 8033C4E8:__LCEnable
+// 8033C5B4:LCEnable
+// 8033C5EC:LCDisable
+// 8033C614:LCStoreBlocks
+// 8033C638:LCStoreData
+// 8033C6E4:LCQueueWait
+// 8033C6F8:L2GlobalInvalidate
+// 8033C790:DMAErrorHandler
+// 8033C8F0:__OSCacheInit
+
+// runtime.o
+80362F38:_savefpr_14
+80362F3C:_savefpr_15
+80362F40:_savefpr_16
+80362F44:_savefpr_17
+80362F48:_savefpr_18
+80362F4C:_savefpr_19
+80362F50:_savefpr_20
+80362F54:_savefpr_21
+80362F58:_savefpr_22
+80362F5C:_savefpr_23
+80362F60:_savefpr_24
+80362F64:_savefpr_25
+80362F68:_savefpr_26
+80362F6C:_savefpr_27
+80362F70:_savefpr_28
+80362F74:_savefpr_29
+80362F78:_savefpr_30
+80362F7C:_savefpr_31
+80362FD0:_savegpr_14
+80362FD4:_savegpr_15
+80362FD8:_savegpr_16
+80362FDC:_savegpr_17
+80362FE0:_savegpr_18
+80362FE4:_savegpr_19
+80362FE8:_savegpr_20
+80362FEC:_savegpr_21
+80362FF0:_savegpr_22
+80362FF4:_savegpr_23
+80362FF8:_savegpr_24
+80362FFC:_savegpr_25
+80363000:_savegpr_26
+80363004:_savegpr_27
+80363008:_savegpr_28
+8036300C:_savegpr_29
+80363010:_savegpr_30
+80363014:_savegpr_31
+8036328C:__umoddi3
+
+// mem.o
+80366EBC:memcmp
+
+// printf.o
+8036730C:sprintf
+803673EC:snprintf
+
+// string.o
+803697C4:strcmp
+8036995C:strcpy
+80369918:strncpy
+
+//currentState
+803A8393:current_state
+
+// m_Do_controller_pad.o
+// data
+803DF288:cpadInfo
+
+// d_com_inf_game.o
+// data
+80408160:dComIfG_gameInfo
+8002B414:setItemBombNumCount
+
+// d_kankyo.o
+// data
+8042EA14:env_light
+
+// JFWSystem.o
+// data
80453180:systemConsole
-//currentState
-803A8393:current_state
-
-//canWarp
-80408956:can_warp
+//currentState
+803A8393:current_state
+
+//canWarp
+80408956:can_warp
+
+//d_meter2_info.o
+80432164:wZButtonPtr \ No newline at end of file
diff --git a/include/tp.jp.lst b/include/tp.jp.lst
index e261bb9..b4e2fe7 100644
--- a/include/tp.jp.lst
+++ b/include/tp.jp.lst
@@ -1,171 +1,182 @@
-// memory
-80003458:memset
-80003540:memcpy
-
-// m_Do_ext.o
-// text
-8000EDF4:getArchiveHeapPtr
-// data
-8044AD74:archiveHeap
-
-// d_save.o
-80032AA8:getRupeeMax
-800350BC:getSave
-800350F0:putSave
-
-// d_stage.o
-8002586C:actorCommonLayerInit
-80025A38:actorInit
-// data
-803F01D4:mStatus_roomControl
-
-// d_event.o
-80042778:defaultSkipStb
-800429D4:skipper
-
-// f_op_scene_req.o
-// data
-8044A754:freezeActors
-8044AE20:isUsingOfOverlap
-
-// f_ap_game.o
-80018A6C:fapGm_Execute
-
-// f_op_actor_mng.o
-8001BBE8:createItemForPresentDemo
-8001BC74:createItemForTrBoxDemo
-8001c078:createDemoItem
-8001C0D4:createItemForBoss
-8001C174:createItemForMidBoss
-8001C1B8:createItemForDirectGet
-8001C1FC:createItemForSimpleDemo
-
-// d_map_path_dmap.o
-8003EE5C:getMapPlayerPos
-8003EF20:getMapPlayerAngleY
-
-// d_item.o
-80097ECC:execItemGet
-80097F20:checkItemGet
-800982F4:item_func_UTUWA_HEART
-
-// d_a_alink.h
-8009DA98:checkStageName
-800B2754:setStickData
-800BB4F0:checkHeavyStateOn
-800C782C:procCoMetamorphoseInit
-8011A734:checkTreasureRupeeReturn
-803D6F94:linkStatus
-// data
-80388C0C:ladderVars
-
-// d_menu_collect.o
-801B3300:setWalletMaxNum
-
-// d_msg_flow.o
-8024D24C:query022
-
-// DynamicLink.o
-8026508C:do_link
-
-// JKRExpHeap.o
-802D15C4:do_alloc_JKRExpHeap
-802D1C48:do_free_JKRExpHeap
-
-// OSCache.o
-// 8033DA08:DCEnable
-// 8033DA1C:DCInvalidateRange
-8033DA48:DCFlushRange
-// 8033DA78:DCStoreRange
-// 8033DAA8:DCFlushRangeNoSync
-// 8033DAD4:DCStoreRangeNoSync
-// 8033DB00:DCZeroRange
-8033DB2C:ICInvalidateRange
-// 8033DB60:ICFlashInvalidate
-// 8033DB70:ICEnable
-// 8033DB84:__LCEnable
-// 8033DC50:LCEnable
-// 8033DC88:LCDisable
-// 8033DCB0:LCStoreBlocks
-// 8033DCD4:LCStoreData
-// 8033DD80:LCQueueWait
-// 8033DD94:L2GlobalInvalidate
-// 8033DE2C:DMAErrorHandler
-// 8033DF8C:__OSCacheInit
-
-// runtime.o
-803645A4:_savefpr_14
-803645A8:_savefpr_15
-803645AC:_savefpr_16
-803645B0:_savefpr_17
-803645B4:_savefpr_18
-803645B8:_savefpr_19
-803645BC:_savefpr_20
-803645C0:_savefpr_21
-803645C4:_savefpr_22
-803645C8:_savefpr_23
-803645CC:_savefpr_24
-803645D0:_savefpr_25
-803645D4:_savefpr_26
-803645D8:_savefpr_27
-803645DC:_savefpr_28
-803645E0:_savefpr_29
-803645E4:_savefpr_30
-803645E8:_savefpr_31
-8036463C:_savegpr_14
-80364640:_savegpr_15
-80364644:_savegpr_16
-80364648:_savegpr_17
-8036464C:_savegpr_18
-80364650:_savegpr_19
-80364654:_savegpr_20
-80364658:_savegpr_21
-8036465C:_savegpr_22
-80364660:_savegpr_23
-80364664:_savegpr_24
-80364668:_savegpr_25
-8036466C:_savegpr_26
-80364670:_savegpr_27
-80364674:_savegpr_28
-80364678:_savegpr_29
-8036467C:_savegpr_30
-80364680:_savegpr_31
-803648F8:__umoddi3
-
-// mem.o
-80368528:memcmp
-
-// printf.o
-80368978:sprintf
-80368A58:snprintf
-
-// string.o
-8036AE30:strcmp
-8036AFC8:strcpy
-8036AF84:strncpy
-
-//currentState
-803B8000:current_state
-
-// m_Do_controller_pad.o
-// data
-803D7428:cpadInfo
-
-// d_com_inf_game.o
-// data
-80400300:dComIfG_gameInfo
-8002B36C:setItemBombNumCount
-
-// d_kankyo.o
-// data
-80426B94:env_light
-
-// JFWSystem.o
-// data
+// memory
+80003458:memset
+80003540:memcpy
+
+// m_Do_ext.o
+// text
+8000EDF4:getArchiveHeapPtr
+// data
+8044AD74:archiveHeap
+
+// d_save.o
+80032AA8:getRupeeMax
+800350BC:getSave
+800350F0:putSave
+
+// d_stage.o
+8002586C:actorCommonLayerInit
+80025A38:actorInit
+// data
+803F01D4:mStatus_roomControl
+
+// d_event.o
+80042778:defaultSkipStb
+800429D4:skipper
+
+// f_op_scene_req.o
+// data
+8044A754:freezeActors
+8044AE20:isUsingOfOverlap
+
+// f_ap_game.o
+80018A6C:fapGm_Execute
+
+// f_op_actor_mng.o
+8001BBE8:createItemForPresentDemo
+8001BC74:createItemForTrBoxDemo
+8001c078:createDemoItem
+8001C0D4:createItemForBoss
+8001C174:createItemForMidBoss
+8001C1B8:createItemForDirectGet
+8001C1FC:createItemForSimpleDemo
+
+// d_map_path_dmap.o
+8003EE5C:getMapPlayerPos
+8003EF20:getMapPlayerAngleY
+
+// d_item.o
+80097ECC:execItemGet
+80097F20:checkItemGet
+800982F4:item_func_UTUWA_HEART
+
+// d_a_alink.h
+8009DA98:checkStageName
+800B2754:setStickData
+800BB4F0:checkHeavyStateOn
+800C782C:procCoMetamorphoseInit
+8011A734:checkTreasureRupeeReturn
+803D6F94:linkStatus
+803887fC:lanternVariables
+80115C58:checkEventRun
+800CF2A8:checkCanoeRide
+800CF294:checkBoardRide
+800CF2bC:checkHorseRide
+800CF300:checkSpinnerRide
+800CF2EC:checkBoarRide
+
+// data
+80388C0C:ladderVars
+
+// d_menu_collect.o
+801B3300:setWalletMaxNum
+
+// d_msg_flow.o
+8024D24C:query022
+
+// DynamicLink.o
+8026508C:do_link
+
+// JKRExpHeap.o
+802D15C4:do_alloc_JKRExpHeap
+802D1C48:do_free_JKRExpHeap
+
+// OSCache.o
+// 8033DA08:DCEnable
+// 8033DA1C:DCInvalidateRange
+8033DA48:DCFlushRange
+// 8033DA78:DCStoreRange
+// 8033DAA8:DCFlushRangeNoSync
+// 8033DAD4:DCStoreRangeNoSync
+// 8033DB00:DCZeroRange
+8033DB2C:ICInvalidateRange
+// 8033DB60:ICFlashInvalidate
+// 8033DB70:ICEnable
+// 8033DB84:__LCEnable
+// 8033DC50:LCEnable
+// 8033DC88:LCDisable
+// 8033DCB0:LCStoreBlocks
+// 8033DCD4:LCStoreData
+// 8033DD80:LCQueueWait
+// 8033DD94:L2GlobalInvalidate
+// 8033DE2C:DMAErrorHandler
+// 8033DF8C:__OSCacheInit
+
+// runtime.o
+803645A4:_savefpr_14
+803645A8:_savefpr_15
+803645AC:_savefpr_16
+803645B0:_savefpr_17
+803645B4:_savefpr_18
+803645B8:_savefpr_19
+803645BC:_savefpr_20
+803645C0:_savefpr_21
+803645C4:_savefpr_22
+803645C8:_savefpr_23
+803645CC:_savefpr_24
+803645D0:_savefpr_25
+803645D4:_savefpr_26
+803645D8:_savefpr_27
+803645DC:_savefpr_28
+803645E0:_savefpr_29
+803645E4:_savefpr_30
+803645E8:_savefpr_31
+8036463C:_savegpr_14
+80364640:_savegpr_15
+80364644:_savegpr_16
+80364648:_savegpr_17
+8036464C:_savegpr_18
+80364650:_savegpr_19
+80364654:_savegpr_20
+80364658:_savegpr_21
+8036465C:_savegpr_22
+80364660:_savegpr_23
+80364664:_savegpr_24
+80364668:_savegpr_25
+8036466C:_savegpr_26
+80364670:_savegpr_27
+80364674:_savegpr_28
+80364678:_savegpr_29
+8036467C:_savegpr_30
+80364680:_savegpr_31
+803648F8:__umoddi3
+
+// mem.o
+80368528:memcmp
+
+// printf.o
+80368978:sprintf
+80368A58:snprintf
+
+// string.o
+8036AE30:strcmp
+8036AFC8:strcpy
+8036AF84:strncpy
+
+//currentState
+803B8000:current_state
+
+// m_Do_controller_pad.o
+// data
+803D7428:cpadInfo
+
+// d_com_inf_game.o
+// data
+80400300:dComIfG_gameInfo
+8002B36C:setItemBombNumCount
+
+// d_kankyo.o
+// data
+80426B94:env_light
+
+// JFWSystem.o
+// data
8044B2F8:systemConsole
-//currentState
-803B8000:current_state
-
-//canWarp
-80400AF6:can_warp \ No newline at end of file
+//currentState
+803B8000:current_state
+
+//canWarp
+80400AF6:can_warp
+
+//d_meter2_info.o
+8042A2E4:wZButtonPtr \ No newline at end of file
diff --git a/include/tp.us.lst b/include/tp.us.lst
index 954c3a9..8ba6c1c 100644
--- a/include/tp.us.lst
+++ b/include/tp.us.lst
@@ -1,180 +1,196 @@
-// memory
-80003458:memset
-80003540:memcpy
-
-// m_Do_ext.o
-// text
-8000EDF4:getArchiveHeapPtr
-// data
-80450C34:archiveHeap
-
-// d_save.o
-80032AA8:getRupeeMax
-800350BC:getSave
-800350F0:putSave
-
-// d_stage.o
-8002586C:actorCommonLayerInit
-80025A38:actorInit
-// data
-803F6094:mStatus_roomControl
-
-// d_event.o
-80042778:defaultSkipStb
-800429D4:skipper
-
-// f_op_scene_req.o
-// data
-80450614:freezeActors
-80450CE0:isUsingOfOverlap
-
-// f_ap_game.o
-80018A6C:fapGm_Execute
-
-// f_op_actor_mng.o
-8001BBE8:createItemForPresentDemo
-8001BC74:createItemForTrBoxDemo
-8001C078:createDemoItem
-8001C0D4:createItemForBoss
-8001C174:createItemForMidBoss
-8001C1B8:createItemForDirectGet
-8001C1FC:createItemForSimpleDemo
-
-// d_map_path_dmap.o
-8003EE5C:getMapPlayerPos
-8003EF20:getMapPlayerAngleY
-
-// d_item.o
-80097E8C:execItemGet
-80097EE0:checkItemGet
-800982B4:item_func_UTUWA_HEART
-
-// d_a_alink.h
-8009DA60:checkStageName
-800B271C:setStickData
-800BB4B8:checkHeavyStateOn
-800C77F4:procCoMetamorphoseInit
-8011A6FC:checkTreasureRupeeReturn
-803DCE54:linkStatus
-// data
-8038EB8C:ladderVars
-
-// d_menu_collect.o
-801B3340:setWalletMaxNum
-
-// d_msg_flow.o
-8024B8E4:query022
-
-// DynamicLink.o
-80262C5C:do_link
-
-// JKRExpHeap.o
-802CF128:do_alloc_JKRExpHeap
-802CF7AC:do_free_JKRExpHeap
-
-// OSCache.o
-// 8033B56C:DCEnable
-// 8033B580:DCInvalidateRange
-8033B5AC:DCFlushRange
-// 8033B5DC:DCStoreRange
-// 8033B60C:DCFlushRangeNoSync
-// 8033B638:DCStoreRangeNoSync
-// 8033B664:DCZeroRange
-8033B690:ICInvalidateRange
-// 8033B6C4:ICFlashInvalidate
-// 8033B6D4:ICEnable
-// 8033B6E8:__LCEnable
-// 8033B7B4:LCEnable
-// 8033B7EC:LCDisable
-// 8033B814:LCStoreBlocks
-// 8033B838:LCStoreData
-// 8033B8E4:LCQueueWait
-// 8033B8F8:L2GlobalInvalidate
-// 8033B990:DMAErrorHandler
-// 8033BAF0:__OSCacheInit
-
-// runtime.o
-80362108:_savefpr_14
-8036210C:_savefpr_15
-80362110:_savefpr_16
-80362114:_savefpr_17
-80362118:_savefpr_18
-8036211C:_savefpr_19
-80362120:_savefpr_20
-80362124:_savefpr_21
-80362128:_savefpr_22
-8036212C:_savefpr_23
-80362130:_savefpr_24
-80362134:_savefpr_25
-80362138:_savefpr_26
-8036213C:_savefpr_27
-80362140:_savefpr_28
-80362144:_savefpr_29
-80362148:_savefpr_30
-8036214C:_savefpr_31
-803621A0:_savegpr_14
-803621A4:_savegpr_15
-803621A8:_savegpr_16
-803621AC:_savegpr_17
-803621B0:_savegpr_18
-803621B4:_savegpr_19
-803621B8:_savegpr_20
-803621BC:_savegpr_21
-803621C0:_savegpr_22
-803621C4:_savegpr_23
-803621C8:_savegpr_24
-803621CC:_savegpr_25
-803621D0:_savegpr_26
-803621D4:_savegpr_27
-803621D8:_savegpr_28
-803621DC:_savegpr_29
-803621E0:_savegpr_30
-803621E4:_savegpr_31
-8036245C:__umoddi3
-
-// mem.o
-8036608C:memcmp
-
-// printf.o
-803664DC:sprintf
-803665BC:snprintf
-
-// string.o
-80368994:strcmp
-80368B2C:strcpy
-80368AE8:strncpy
-
-//currentState
-803A66B3:current_state
-
-// m_Do_controller_pad.o
-// data
-803DD2E8:cpadInfo
-
-// d_com_inf_game.o
-// data
-804061C0:dComIfG_gameInfo
-8002B36C:setItemBombNumCount
-
-// d_kankyo.o
-// data
-8042CA54:env_light
-
-// JFWSystem.o
-// data
+// memory
+80003458:memset
+80003540:memcpy
+
+// m_Do_ext.o
+// text
+8000EDF4:getArchiveHeapPtr
+// data
+80450C34:archiveHeap
+
+// d_save.o
+80032AA8:getRupeeMax
+800350BC:getSave
+800350F0:putSave
+
+// d_stage.o
+8002586C:actorCommonLayerInit
+80025A38:actorInit
+// data
+803F6094:mStatus_roomControl
+
+// d_event.o
+80042778:defaultSkipStb
+800429D4:skipper
+
+// f_op_scene_req.o
+// data
+80450614:freezeActors
+80450CE0:isUsingOfOverlap
+
+// f_ap_game.o
+80018A6C:fapGm_Execute
+
+// f_op_actor_mng.o
+8001BBE8:createItemForPresentDemo
+8001BC74:createItemForTrBoxDemo
+8001C078:createDemoItem
+8001C0D4:createItemForBoss
+8001C174:createItemForMidBoss
+8001C1B8:createItemForDirectGet
+8001C1FC:createItemForSimpleDemo
+
+// d_map_path_dmap.o
+8003EE5C:getMapPlayerPos
+8003EF20:getMapPlayerAngleY
+
+// d_item.o
+80097E8C:execItemGet
+80097EE0:checkItemGet
+800982B4:item_func_UTUWA_HEART
+
+// d_a_alink.h
+8009DA60:checkStageName
+800B271C:setStickData
+800BB4B8:checkHeavyStateOn
+800C77F4:procCoMetamorphoseInit
+8011A6FC:checkTreasureRupeeReturn
+803DCE54:linkStatus
+8038e77c:lanternVariables
+80115c20:checkEventRun
+800cf270:checkCanoeRide
+800cf25c:checkBoardRide
+800cf284:checkHorseRide
+800cf2c8:checkSpinnerRide
+800cf2b4:checkBoarRide
+
+// data
+8038EB8C:ladderVars
+
+// d_menu_collect.o
+801B3340:setWalletMaxNum
+
+// d_msg_flow.o
+8024B8E4:query022
+
+// DynamicLink.o
+80262C5C:do_link
+
+// JKRExpHeap.o
+802CF128:do_alloc_JKRExpHeap
+802CF7AC:do_free_JKRExpHeap
+
+// OSCache.o
+// 8033B56C:DCEnable
+// 8033B580:DCInvalidateRange
+8033B5AC:DCFlushRange
+// 8033B5DC:DCStoreRange
+// 8033B60C:DCFlushRangeNoSync
+// 8033B638:DCStoreRangeNoSync
+// 8033B664:DCZeroRange
+8033B690:ICInvalidateRange
+// 8033B6C4:ICFlashInvalidate
+// 8033B6D4:ICEnable
+// 8033B6E8:__LCEnable
+// 8033B7B4:LCEnable
+// 8033B7EC:LCDisable
+// 8033B814:LCStoreBlocks
+// 8033B838:LCStoreData
+// 8033B8E4:LCQueueWait
+// 8033B8F8:L2GlobalInvalidate
+// 8033B990:DMAErrorHandler
+// 8033BAF0:__OSCacheInit
+
+// runtime.o
+80362108:_savefpr_14
+8036210C:_savefpr_15
+80362110:_savefpr_16
+80362114:_savefpr_17
+80362118:_savefpr_18
+8036211C:_savefpr_19
+80362120:_savefpr_20
+80362124:_savefpr_21
+80362128:_savefpr_22
+8036212C:_savefpr_23
+80362130:_savefpr_24
+80362134:_savefpr_25
+80362138:_savefpr_26
+8036213C:_savefpr_27
+80362140:_savefpr_28
+80362144:_savefpr_29
+80362148:_savefpr_30
+8036214C:_savefpr_31
+803621A0:_savegpr_14
+803621A4:_savegpr_15
+803621A8:_savegpr_16
+803621AC:_savegpr_17
+803621B0:_savegpr_18
+803621B4:_savegpr_19
+803621B8:_savegpr_20
+803621BC:_savegpr_21
+803621C0:_savegpr_22
+803621C4:_savegpr_23
+803621C8:_savegpr_24
+803621CC:_savegpr_25
+803621D0:_savegpr_26
+803621D4:_savegpr_27
+803621D8:_savegpr_28
+803621DC:_savegpr_29
+803621E0:_savegpr_30
+803621E4:_savegpr_31
+8036245C:__umoddi3
+
+// mem.o
+8036608C:memcmp
+
+// printf.o
+803664DC:sprintf
+803665BC:snprintf
+
+// string.o
+80368994:strcmp
+80368B2C:strcpy
+80368AE8:strncpy
+
+//currentState
+803A66B3:current_state
+
+// m_Do_controller_pad.o
+// data
+803DD2E8:cpadInfo
+
+// d_com_inf_game.o
+// data
+804061C0:dComIfG_gameInfo
+8002B36C:setItemBombNumCount
+
+// d_kankyo.o
+// data
+8042CA54:env_light
+
+// JFWSystem.o
+// data
804511B8:systemConsole
-//currentState
-803A66B3:current_state
-
-//walletText
-80bbc749:wallet_text
-
-//walletdescription
-80BBD835:wallet_description
-
-//canwarp
-804069B6:can_warp
-
-//resource.o
-802a9490:parseCharacter_1Byte \ No newline at end of file
+//currentState
+803A66B3:current_state
+
+//walletText
+80bbc749:wallet_text
+
+//walletdescription
+80BBD835:wallet_description
+
+//canwarp
+804069B6:can_warp
+
+//resource.o
+802a9490:parseCharacter_1Byte
+
+//d_item_data.o
+803AC5A0:item_resource
+803ADD88:field_item_res
+803AED78:item_info
+
+//d_meter2_info.o
+804301A4:wZButtonPtr
diff --git a/include/tp/d_a_alink.h b/include/tp/d_a_alink.h
index 7f687ad..7a47f00 100644
--- a/include/tp/d_a_alink.h
+++ b/include/tp/d_a_alink.h
@@ -41,6 +41,13 @@ namespace tp::d_a_alink
bool checkHeavyStateOn(s32 unk1, s32 unk2);
bool procCoMetamorphoseInit(tp::d_com_inf_game::LinkMapVars* linkMapPtr);
bool checkTreasureRupeeReturn(void* unk1, s32 item);
+ bool lanternVariables(s8 unk1, s8 unk2);
+ bool checkEventRun(tp::d_com_inf_game::LinkMapVars* linkMapPtr);
+ bool checkBoardRide(tp::d_com_inf_game::LinkMapVars* linkMapPtr);
+ bool checkCanoeRide(tp::d_com_inf_game::LinkMapVars* linkMapPtr);
+ bool checkHorseRide(tp::d_com_inf_game::LinkMapVars* linkMapPtr);
+ bool checkBoarRide(tp::d_com_inf_game::LinkMapVars* linkMapPtr);
+ bool checkSpinnerRide(tp::d_com_inf_game::LinkMapVars* linkMapPtr);
// Variables
extern LadderVars ladderVars;
diff --git a/include/tp/d_a_shop_item_static.h b/include/tp/d_a_shop_item_static.h
new file mode 100644
index 0000000..548b04d
--- /dev/null
+++ b/include/tp/d_a_shop_item_static.h
@@ -0,0 +1,63 @@
+#pragma once
+
+#include "defines.h"
+
+namespace tp::d_a_shop_item_static
+{
+ enum ShopItemDataIndex : u8
+ {
+ Sold_Out = 0x0,
+ Lantern_Oil = 0x1, // Item Id = 0x66
+ Red_Potion = 0x2, // Item Id = 0x61
+ Milk = 0x3, // Item Id = 0x64
+ Sera_Bottle = 0x4, // Item Id = 0x65
+ Arrows = 0x5, // Item Id = 0xE to 0x10
+ Wooden_Shield = 0x6, // Item Id = 0x2B
+ Hylian_Shield = 0x7, // Item Id = 0x2C
+ Bombs = 0x8, // Item Id = 0xA to 0xD
+ Bomb_Bag_Water_Bombs = 0x9, // Item Id = 0x71 -- Uses Water Bomb model
+ Bomb_Bag_Bomblings = 0xA, // Item Id = 0x72 -- Uses Bombling model
+ Empty_Bomb_Bag = 0xB, // Item Id = 0x50 -- Possibly handles multiple different bomb bags
+ Giant_Bomb_Bag = 0xC, // Item Id = 0x4F
+ Land_Mine = 0xD, // Unused in getShopArcname
+ Bottle = 0xE, // Unused in getShopArcname
+ Bee_Larva = 0xF, // Item Id = 0x76
+ Slingshot = 0x10, // Item Id = 0x4B
+ Blue_Potion = 0x11, // Item Id = 0x63
+ Hawkeye = 0x12, // Item Id = 0x3E
+ Magic_Armor = 0x13, // Item Id = 0x30
+ Magic_Armor_Sold_Out = 0x14,
+ Green_Potion = 0x15, // Item Id = 0x62
+ Jovani_Bottle = 0x16, // Item Id = 0x75
+ };
+
+ struct ShopItemData
+ {
+ char* arcName;
+ s16 modelResIdx;
+ s16 wBtkResIdx;
+ s16 unk_8;
+ s16 wBckResIdx;
+ s16 unk_C;
+ s16 wBrkResIdx;
+ s16 wBtpResIdx;
+ s16 unk_12;
+ float posY;
+ float scale;
+ s16 wRot[4];
+ u32 mFlags;
+ u8 mShadowSize;
+ u8 mCollisionH;
+ u8 mCollisionR;
+ u8 tevFrm;
+ u8 btpFrm;
+ u8 unk_2D[3];
+ } __attribute__((__packed__));
+
+ static_assert(sizeof(ShopItemData) == 0x30);
+
+ extern "C"
+ {
+ extern ShopItemData shopItemData[23]; // mData__12daShopItem_c
+ }
+} \ No newline at end of file
diff --git a/include/tp/d_com_inf_game.h b/include/tp/d_com_inf_game.h
index b18233b..b17d4d5 100644
--- a/include/tp/d_com_inf_game.h
+++ b/include/tp/d_com_inf_game.h
@@ -836,7 +836,9 @@ namespace tp::d_com_inf_game
u16 immediateControl; // 4edb - 4edc
u8 unk_00[0x4]; // 4edd - 4EE0
u8 nextEventID; // 4EE1
- u8 unk1A[0xCB];
+ u8 unk1A[0xC5];
+ u8 actionStatus;
+ u8 unkDF[0x5];
u8 eventFlag;
u8 unkE7[0x5];
u8 currentEventID;
@@ -854,6 +856,8 @@ namespace tp::d_com_inf_game
float pos[3];
u8 unk_4DC[0x94];
u32 isTargeting;//570 at 0x400000 link is targeting
+ u8 unk_574[0x2A68];
+ u16 equippedItem;
} __attribute__((__packed__));
struct TunicColor
@@ -946,9 +950,8 @@ namespace tp::d_com_inf_game
extern u8 current_state;
extern void setItemBombNumCount(u32 unk1, u8 bagNb, short amout);//amount will be the og (ex: if you can only have 5 more bombs and buy 10, it'll still ahow 10)
extern u8 next_state;
- //extern char wallet_text[13];
+ extern char izaBoatSignText[100];
//extern char wallet_description[96];
extern u8 can_warp;
-
}
} \ No newline at end of file
diff --git a/include/tp/d_item_data.h b/include/tp/d_item_data.h
new file mode 100644
index 0000000..c5bd746
--- /dev/null
+++ b/include/tp/d_item_data.h
@@ -0,0 +1,52 @@
+#pragma once
+
+#include "defines.h"
+#include <tp/d_stage.h>
+
+namespace tp::d_item_data
+{
+
+ struct ItemResource // d_item_data.h
+ {
+ char* arcName;
+ s16 modelResIdx;
+ s16 btkResIdx;
+ s16 bckResIdx;
+ s16 brkResIdx;
+ s16 btpResIdx;
+ u8 tevFrm;
+ u8 btpFrm;
+ s16 ringTexResIdx;
+ s16 unk_12[3];
+ } __attribute__((__packed__));
+
+ struct FieldItemRes // d_item_data.h
+ {
+ char* arcName;
+ s16 modelResIdx;
+ s16 bckAnmResIdx;
+ s16 brkAnmResIdx;
+ s16 unk_a;
+ s16 heapSize;
+ s16 unk_e;
+ } __attribute__((__packed__));
+
+ struct ItemInfo // d_item_data.h
+ {
+ u8 mShadowSize;
+ u8 mCollisionH;
+ u8 mCollisionR;
+ u8 mFlags;
+ } __attribute__((__packed__));
+
+ static_assert(sizeof(ItemResource) == 0x18);
+ static_assert(sizeof(FieldItemRes) == 0x10);
+ static_assert(sizeof(ItemInfo) == 0x4);
+
+ extern "C"
+ {
+ extern ItemResource item_resource[255]; // 0x803AC5A0 in US
+ extern FieldItemRes field_item_res[255]; // 0x803ADD88 in US
+ extern ItemInfo item_info[255]; // 0x803AED78 in US
+ }
+} \ No newline at end of file
diff --git a/include/tp/d_meter2_info.h b/include/tp/d_meter2_info.h
new file mode 100644
index 0000000..f6f1b6c
--- /dev/null
+++ b/include/tp/d_meter2_info.h
@@ -0,0 +1,12 @@
+#pragma once
+
+#include "defines.h"
+#include <tp/d_com_inf_game.h>
+
+namespace tp::d_meter2_info
+{
+ extern "C"
+ {
+ extern void* wZButtonPtr;
+ }
+} \ No newline at end of file
diff --git a/include/tp/d_stage.h b/include/tp/d_stage.h
index 86b61d3..873abb1 100644
--- a/include/tp/d_stage.h
+++ b/include/tp/d_stage.h
@@ -12,6 +12,20 @@
namespace tp::d_stage
{
+ struct Item
+ {
+ char objectName[8];
+ u8 paramOne;
+ u8 paramTwo;
+ u8 membitFlag;
+ u8 item;
+ float pos[3];
+ s16 rot[3];
+ u16 enemyNum;
+ } __attribute__((__packed__));
+
+ static_assert(sizeof(Item) == 0x20);
+
extern "C"
{
extern void* mStatus_roomControl;
diff --git a/include/tp/dzx.h b/include/tp/dzx.h
index 6bf3fc2..2833981 100644
--- a/include/tp/dzx.h
+++ b/include/tp/dzx.h
@@ -19,6 +19,17 @@ namespace tp::d_stage
* 0001
* 80401234 = 1 TRES Chunk at this address
*/
+
+ struct Actr
+ {
+ char objectName[8];
+ u32 parameters;
+ float pos[3];
+ s16 rot[3];
+ u16 enemyNum;
+ } __attribute__((__packed__));
+ static_assert(sizeof(Actr) == 0x20);
+
struct dzxChunkTypeInfo
{
char tag[4];
diff --git a/include/tp/resource.h b/include/tp/resource.h
new file mode 100644
index 0000000..255d91e
--- /dev/null
+++ b/include/tp/resource.h
@@ -0,0 +1,11 @@
+#pragma once
+
+#include "defines.h"
+
+namespace tp::resource
+{
+ extern "C"
+ {
+ extern void* parseCharacter_1Byte(const char** text);
+ }
+} \ No newline at end of file
diff --git a/source/chestRando.cpp b/source/chestRando.cpp
index 1c5b7cc..dd60741 100644
--- a/source/chestRando.cpp
+++ b/source/chestRando.cpp
@@ -16,6 +16,7 @@
#include <tp/d_a_alink.h>
#include <tp/d_kankyo.h>
#include <tp/JFWSystem.h>
+#include <tp/resource.h>
#include <cstdio>
#include <cstring>
@@ -70,18 +71,6 @@ namespace mod
{
sourceCheck = findSource(destCheck->destLayer, 0x1, destCheck);//to prevent woodensword from being overwritten before losing it
}
- else if (destCheck->itemID == items::Item::Ordon_Shield || destCheck->itemID == items::Item::Wooden_Shield || destCheck->itemID == items::Item::Hylian_Shield)
- {
- sourceCheck = findSource(destCheck->destLayer, 0x2, destCheck);//to prevent softlocking the game when you try to get ordon shield check
- }
- else if (destCheck->itemID == items::Item::Zora_Armor || destCheck->itemID == items::Item::Magic_Armor)
- {
- sourceCheck = findSource(destCheck->destLayer, 0x2, destCheck);//to prevent softlocking the game when you try to get ordon shield check
- }
- else if (isProgressiveEnabled == 0 && destCheck->itemID == items::Item::Clawshots)
- {
- sourceCheck = findSource(destCheck->destLayer, 0x7, destCheck);//to prevent Clawshots from being overwritten by Clawshot
- }
else
{
sourceCheck = findSource(destCheck->destLayer, 0x0, destCheck);
@@ -309,6 +298,30 @@ namespace mod
result = true;
}
break;
+
+ case item::ItemType::HeartPiece:
+ // Map, compass, big key
+ if (areHeartPiecesRandomized == 0)
+ {
+ result = true;
+ }
+ break;
+
+ case item::ItemType::Rupee:
+ // Map, compass, big key
+ if (areRupeesRandomized == 0)
+ {
+ result = true;
+ }
+ break;
+
+ case item::ItemType::Ammo:
+ // Map, compass, big key
+ if (areAmmoRandomized == 0)
+ {
+ result = true;
+ }
+ break;
case item::ItemType::Story:
if (check->itemID != items::Item::Aurus_Memo && check->itemID != items::Item::Asheis_Sketch)
@@ -441,6 +454,10 @@ namespace mod
{//decrease poe counter
gameInfo.scratchPad.poeCount--;
}
+ else if (item == items::Item::Ooccoo_Dungeon && tp::d_a_alink::checkStageName(stage::allStages[Stage_City_in_the_Sky]))
+ {
+ Singleton::getInstance()->hasCiTSOoccoo = 1;
+ }
else if (item == items::Item::Vessel_Of_Light_Faron)
{
tp::d_com_inf_game::ScratchPad* scratchPadPtr = &gameInfo.scratchPad;
@@ -451,34 +468,34 @@ namespace mod
//Set Faron Twilight Flags
scratchPadPtr->clearedTwilights.Faron = 0b1; //Clear Faron Twilight
tools::setItemFlag(ItemFlags::Vessel_Of_Light_Faron);
- scratchPadPtr->tearCounters.Faron = 16;
- eventBitsPtr[0x5] = 0xFF; //Ensure Epona is Stolen, give Midna Charge
- eventBitsPtr[0x6] |= 0x10; //Faron Twilight Progression flag
- eventBitsPtr[0xC] |= 0x8; //Set Sword and Shield to not be on back
- tools::setItemFlag(ItemFlags::Heros_Clothes);
-
- //Set Eldin Twilight Flags
+ scratchPadPtr->tearCounters.Faron = 16;
+ eventBitsPtr[0x5] |= 0xFF; //Ensure Epona is Stolen, give Midna Charge
+ eventBitsPtr[0x6] |= 0x10; //Faron Twilight Progression flag
+ eventBitsPtr[0xC] |= 0x8; //Set Sword and Shield to not be on back
+ tools::setItemFlag(ItemFlags::Heros_Clothes);
+
+ //Set Eldin Twilight Flags
scratchPadPtr->clearedTwilights.Eldin = 0b1; // Clear Eldin Twilight
tools::setItemFlag(ItemFlags::Vessel_Of_Light_Eldin);
scratchPadPtr->tearCounters.Eldin = 16;
eventBitsPtr[0x6] |= 0x1; //tame Epona
eventBitsPtr[0xA] |= 0x8; //Beat KB1
eventBitsPtr[0x14] |= 0x10; //Put Bo Outside
- eventBitsPtr[0x7] = 0xDE; //skip Gor Coron Sumo and Enter Mines also Trigger KB1 and mark Post-KB1 CS as watched, Eldin Twilight Story Progression Flag
+ eventBitsPtr[0x7] |= 0xDE; //skip Gor Coron Sumo and Enter Mines also Trigger KB1 and mark Post-KB1 CS as watched, Eldin Twilight Story Progression Flag
eventBitsPtr[0x41] |= 0x10; //Told Fado about the Kids
-
- //Set Lanayru Twilight Flags
- scratchPadPtr->clearedTwilights.Lanayru = 0b1; // Clear Lanayru Twilight
- tools::setItemFlag(ItemFlags::Vessel_Of_Light_Lanayru);
- scratchPadPtr->tearCounters.Lanayru = 16;
- allAreaNodesPtr->Hyrule_Field.unk_0[0xB] |= 0x80;//water on Field map
+
+ //Set Lanayru Twilight Flags
+ scratchPadPtr->clearedTwilights.Lanayru = 0b1; // Clear Lanayru Twilight
+ tools::setItemFlag(ItemFlags::Vessel_Of_Light_Lanayru);
+ scratchPadPtr->tearCounters.Lanayru = 16;
+ allAreaNodesPtr->Hyrule_Field.unk_0[0xB] |= 0x80;//water on Field map
allAreaNodesPtr->Hyrule_Field.unk_0[0xF] |= 0x10;//open south CT Shortcut to Faron
allAreaNodesPtr->Lanayru.unk_0[0xF] |= 0x1;//water on Map
- eventBitsPtr[0x30] |= 0x40; //gave springwater to south CT goron
- eventBitsPtr[0x8] |= 0x80; //ZD Thawed
- eventBitsPtr[0xC] |= 0x2; //Lanayru Twilight Story Progression Flag
- eventBitsPtr[0xA] |= 0x10; //Kagorok Howl at Lake
-
+ eventBitsPtr[0x30] |= 0x40; //gave springwater to south CT goron
+ eventBitsPtr[0x8] |= 0x80; //ZD Thawed
+ eventBitsPtr[0xC] |= 0x2; //Lanayru Twilight Story Progression Flag
+ eventBitsPtr[0xA] |= 0x10; //Kagorok Howl at Lake
+
//Unlock Map Regions
scratchPadPtr->movingActors.exploredRegions.Snowpeak = 0b1;
scratchPadPtr->movingActors.exploredRegions.Desert = 0b1;
@@ -497,9 +514,9 @@ namespace mod
allAreaNodesPtr->Hyrule_Field.unk_0[0xB] |= 0x8;//give castle town warp
allAreaNodesPtr->Hyrule_Field.unk_0[0x9] |= 0x20; //give Gorge Warp
allAreaNodesPtr->Lanayru.unk_0[0xB] |= 0x4; // give Zora's Domain Warp
- allAreaNodesPtr->Lanayru.unk_0[0xA] |= 0x4;//give lake hylia warp
-
- //Faron Escape
+ allAreaNodesPtr->Lanayru.unk_0[0xA] |= 0x4;//give lake hylia warp
+
+ //Faron Escape
if (Singleton::getInstance()->isForestEscapeEnabled == 1)
{
eventBitsPtr[0x6] |= 0x26; //warp the kak bridge, give map warp, set Forest Temple Story Flag
@@ -507,22 +524,22 @@ namespace mod
else
{
eventBitsPtr[0x6] |= 0x24; //warp the kak bridge, give map warp
- }
-
- //Skip MDH?
- if (Singleton::getInstance()->isMDHSkipEnabled == 1)
- {
- //set MDH flags
- gameInfo.scratchPad.eventBits[0xC] |= 0x1; //MDH Started
- gameInfo.scratchPad.eventBits[0x1E] |= 0x8; //MDH Completed
- }
-
- gameInfo.nextStageVars.triggerLoad |= 1;
- return item;
+ }
+
+ //Skip MDH?
+ if (Singleton::getInstance()->isMDHSkipEnabled == 1)
+ {
+ //set MDH flags
+ gameInfo.scratchPad.eventBits[0xC] |= 0x1; //MDH Started
+ gameInfo.scratchPad.eventBits[0x1E] |= 0x8; //MDH Completed
+ }
+
+ gameInfo.nextStageVars.triggerLoad |= 1;
+ return item;
}
else
{
- //Faron Escape
+ //Faron Escape
if (Singleton::getInstance()->isForestEscapeEnabled == 1)
{
eventBitsPtr[0x6] |= 0x26; //warp the kak bridge, give map warp, set Forest Temple Story Flag
@@ -545,7 +562,7 @@ namespace mod
eventBitsPtr[0x6] |= 0x1; //tame Epona
eventBitsPtr[0xA] |= 0x8; //Beat KB1
eventBitsPtr[0x14] |= 0x10; //Put Bo Outside
- eventBitsPtr[0x7] = 0xD6; //skip Gor Coron Sumo and Enter Mines also Trigger KB1 and mark Post-KB1 CS as watched
+ eventBitsPtr[0x7] |= 0xD6; //skip Gor Coron Sumo and Enter Mines also Trigger KB1 and mark Post-KB1 CS as watched
return item;
}
else if (item == items::Item::Vessel_Of_Light_Lanayru)
@@ -945,10 +962,17 @@ namespace mod
}
else if (item == items::Item::Shadow_Crystal)
{//shadow crystal doesn't actually do anything so we have to do its functionnality ourselves
- game_patch::giveMidnaTransform();
- if (Singleton::getInstance()->isMDHSkipEnabled == 1)
+ if (Singleton::getInstance()->startWithCrystal == 1)
+ {
+ item = items::Item::Silver_Rupee;
+ }
+ else
{
- gameInfo.scratchPad.unk_1F[0x11] |= 0x8; //Midna on Back
+ game_patch::giveMidnaTransform();
+ if (Singleton::getInstance()->isMDHSkipEnabled == 1)
+ {
+ gameInfo.scratchPad.unk_1F[0x11] |= 0x8; //Midna on Back
+ }
}
}
else if (item == items::Item::Dominion_Rod_Uncharged)
@@ -973,31 +997,374 @@ namespace mod
}
else if (item == 0xE1)
{
- gameInfo.scratchPad.eventBits[0x29] |= 0x4;//give ending blow
+ if ((gameInfo.scratchPad.eventBits[0x29] & 0x4) != 0)/*have ending blow*/
+ {
+ if ((gameInfo.scratchPad.eventBits[0x29] & 0x8) != 0)/*have shield attack*/
+ {
+ if ((gameInfo.scratchPad.eventBits[0x29] & 0x2) != 0)/*have back slice*/
+ {
+ if ((gameInfo.scratchPad.eventBits[0x29] & 0x1) != 0)/*have helm splitter*/
+ {
+ if ((gameInfo.scratchPad.eventBits[0x2A] & 0x80) != 0)/*have mortal draw*/
+ {
+ if ((gameInfo.scratchPad.eventBits[0x2A] & 0x40) != 0)/*have jump strike*/
+ {
+ gameInfo.scratchPad.eventBits[0x2A] |= 0x20;//give great spin
+ }
+ else
+ {
+ gameInfo.scratchPad.eventBits[0x2A] |= 0x40;//give jumpstrike
+ }
+
+ }
+ else
+ {
+ gameInfo.scratchPad.eventBits[0x2A] |= 0x80;//give mortal draw
+ }
+
+ }
+ else
+ {
+ gameInfo.scratchPad.eventBits[0x29] |= 0x1;//give helm splitter
+ }
+
+ }
+ else
+ {
+ gameInfo.scratchPad.eventBits[0x29] |= 0x2;//give back slice
+ }
+
+ }
+ else
+ {
+ {
+ gameInfo.scratchPad.eventBits[0x29] |= 0x8;//give shield attack
+ }
+ }
+
+ }
+ else
+ {
+ gameInfo.scratchPad.eventBits[0x29] |= 0x4;//give ending blow
+ }
}
else if (item == 0xE2)
{
- gameInfo.scratchPad.eventBits[0x29] |= 0x8;//give shield attack
+ if ((gameInfo.scratchPad.eventBits[0x29] & 0x4) != 0)/*have ending blow*/
+ {
+ if ((gameInfo.scratchPad.eventBits[0x29] & 0x8) != 0)/*have shield attack*/
+ {
+ if ((gameInfo.scratchPad.eventBits[0x29] & 0x2) != 0)/*have back slice*/
+ {
+ if ((gameInfo.scratchPad.eventBits[0x29] & 0x1) != 0)/*have helm splitter*/
+ {
+ if ((gameInfo.scratchPad.eventBits[0x2A] & 0x80) != 0)/*have mortal draw*/
+ {
+ if ((gameInfo.scratchPad.eventBits[0x2A] & 0x40) != 0)/*have jump strike*/
+ {
+ gameInfo.scratchPad.eventBits[0x2A] |= 0x20;//give great spin
+ }
+ else
+ {
+ gameInfo.scratchPad.eventBits[0x2A] |= 0x40;//give jumpstrike
+ }
+
+ }
+ else
+ {
+ gameInfo.scratchPad.eventBits[0x2A] |= 0x80;//give mortal draw
+ }
+
+ }
+ else
+ {
+ gameInfo.scratchPad.eventBits[0x29] |= 0x1;//give helm splitter
+ }
+
+ }
+ else
+ {
+ gameInfo.scratchPad.eventBits[0x29] |= 0x2;//give back slice
+ }
+
+ }
+ else
+ {
+ {
+ gameInfo.scratchPad.eventBits[0x29] |= 0x8;//give shield attack
+ }
+ }
+
+ }
+ else
+ {
+ gameInfo.scratchPad.eventBits[0x29] |= 0x4;//give ending blow
+ }
}
else if (item == 0xE3)
{
- gameInfo.scratchPad.eventBits[0x29] |= 0x2;//give back slice
+ if ((gameInfo.scratchPad.eventBits[0x29] & 0x4) != 0)/*have ending blow*/
+ {
+ if ((gameInfo.scratchPad.eventBits[0x29] & 0x8) != 0)/*have shield attack*/
+ {
+ if ((gameInfo.scratchPad.eventBits[0x29] & 0x2) != 0)/*have back slice*/
+ {
+ if ((gameInfo.scratchPad.eventBits[0x29] & 0x1) != 0)/*have helm splitter*/
+ {
+ if ((gameInfo.scratchPad.eventBits[0x2A] & 0x80) != 0)/*have mortal draw*/
+ {
+ if ((gameInfo.scratchPad.eventBits[0x2A] & 0x40) != 0)/*have jump strike*/
+ {
+ gameInfo.scratchPad.eventBits[0x2A] |= 0x20;//give great spin
+ }
+ else
+ {
+ gameInfo.scratchPad.eventBits[0x2A] |= 0x40;//give jumpstrike
+ }
+
+ }
+ else
+ {
+ gameInfo.scratchPad.eventBits[0x2A] |= 0x80;//give mortal draw
+ }
+
+ }
+ else
+ {
+ gameInfo.scratchPad.eventBits[0x29] |= 0x1;//give helm splitter
+ }
+
+ }
+ else
+ {
+ gameInfo.scratchPad.eventBits[0x29] |= 0x2;//give back slice
+ }
+
+ }
+ else
+ {
+ {
+ gameInfo.scratchPad.eventBits[0x29] |= 0x8;//give shield attack
+ }
+ }
+
+ }
+ else
+ {
+ gameInfo.scratchPad.eventBits[0x29] |= 0x4;//give ending blow
+ }
}
else if (item == 0xE4)
{
- gameInfo.scratchPad.eventBits[0x29] |= 0x1;//give helm splitter
+ if ((gameInfo.scratchPad.eventBits[0x29] & 0x4) != 0)/*have ending blow*/
+ {
+ if ((gameInfo.scratchPad.eventBits[0x29] & 0x8) != 0)/*have shield attack*/
+ {
+ if ((gameInfo.scratchPad.eventBits[0x29] & 0x2) != 0)/*have back slice*/
+ {
+ if ((gameInfo.scratchPad.eventBits[0x29] & 0x1) != 0)/*have helm splitter*/
+ {
+ if ((gameInfo.scratchPad.eventBits[0x2A] & 0x80) != 0)/*have mortal draw*/
+ {
+ if ((gameInfo.scratchPad.eventBits[0x2A] & 0x40) != 0)/*have jump strike*/
+ {
+ gameInfo.scratchPad.eventBits[0x2A] |= 0x20;//give great spin
+ }
+ else
+ {
+ gameInfo.scratchPad.eventBits[0x2A] |= 0x40;//give jumpstrike
+ }
+
+ }
+ else
+ {
+ gameInfo.scratchPad.eventBits[0x2A] |= 0x80;//give mortal draw
+ }
+
+ }
+ else
+ {
+ gameInfo.scratchPad.eventBits[0x29] |= 0x1;//give helm splitter
+ }
+
+ }
+ else
+ {
+ gameInfo.scratchPad.eventBits[0x29] |= 0x2;//give back slice
+ }
+
+ }
+ else
+ {
+ {
+ gameInfo.scratchPad.eventBits[0x29] |= 0x8;//give shield attack
+ }
+ }
+
+ }
+ else
+ {
+ gameInfo.scratchPad.eventBits[0x29] |= 0x4;//give ending blow
+ }
}
else if (item == 0xE5)
{
- gameInfo.scratchPad.eventBits[0x2A] |= 0x80;//give mortal draw
+ if ((gameInfo.scratchPad.eventBits[0x29] & 0x4) != 0)/*have ending blow*/
+ {
+ if ((gameInfo.scratchPad.eventBits[0x29] & 0x8) != 0)/*have shield attack*/
+ {
+ if ((gameInfo.scratchPad.eventBits[0x29] & 0x2) != 0)/*have back slice*/
+ {
+ if ((gameInfo.scratchPad.eventBits[0x29] & 0x1) != 0)/*have helm splitter*/
+ {
+ if ((gameInfo.scratchPad.eventBits[0x2A] & 0x80) != 0)/*have mortal draw*/
+ {
+ if ((gameInfo.scratchPad.eventBits[0x2A] & 0x40) != 0)/*have jump strike*/
+ {
+ gameInfo.scratchPad.eventBits[0x2A] |= 0x20;//give great spin
+ }
+ else
+ {
+ gameInfo.scratchPad.eventBits[0x2A] |= 0x40;//give jumpstrike
+ }
+
+ }
+ else
+ {
+ gameInfo.scratchPad.eventBits[0x2A] |= 0x80;//give mortal draw
+ }
+
+ }
+ else
+ {
+ gameInfo.scratchPad.eventBits[0x29] |= 0x1;//give helm splitter
+ }
+
+ }
+ else
+ {
+ gameInfo.scratchPad.eventBits[0x29] |= 0x2;//give back slice
+ }
+
+ }
+ else
+ {
+ {
+ gameInfo.scratchPad.eventBits[0x29] |= 0x8;//give shield attack
+ }
+ }
+
+ }
+ else
+ {
+ gameInfo.scratchPad.eventBits[0x29] |= 0x4;//give ending blow
+ }
}
else if (item == 0xE6)
{
- gameInfo.scratchPad.eventBits[0x2A] |= 0x40;//give jump strike
+ if ((gameInfo.scratchPad.eventBits[0x29] & 0x4) != 0)/*have ending blow*/
+ {
+ if ((gameInfo.scratchPad.eventBits[0x29] & 0x8) != 0)/*have shield attack*/
+ {
+ if ((gameInfo.scratchPad.eventBits[0x29] & 0x2) != 0)/*have back slice*/
+ {
+ if ((gameInfo.scratchPad.eventBits[0x29] & 0x1) != 0)/*have helm splitter*/
+ {
+ if ((gameInfo.scratchPad.eventBits[0x2A] & 0x80) != 0)/*have mortal draw*/
+ {
+ if ((gameInfo.scratchPad.eventBits[0x2A] & 0x40) != 0)/*have jump strike*/
+ {
+ gameInfo.scratchPad.eventBits[0x2A] |= 0x20;//give great spin
+ }
+ else
+ {
+ gameInfo.scratchPad.eventBits[0x2A] |= 0x40;//give jumpstrike
+ }
+
+ }
+ else
+ {
+ gameInfo.scratchPad.eventBits[0x2A] |= 0x80;//give mortal draw
+ }
+
+ }
+ else
+ {
+ gameInfo.scratchPad.eventBits[0x29] |= 0x1;//give helm splitter
+ }
+
+ }
+ else
+ {
+ gameInfo.scratchPad.eventBits[0x29] |= 0x2;//give back slice
+ }
+
+ }
+ else
+ {
+ {
+ gameInfo.scratchPad.eventBits[0x29] |= 0x8;//give shield attack
+ }
+ }
+
+ }
+ else
+ {
+ gameInfo.scratchPad.eventBits[0x29] |= 0x4;//give ending blow
+ }
}
else if (item == 0xE7)
{
- gameInfo.scratchPad.eventBits[0x2A] |= 0x20;//give great spin
+ if ((gameInfo.scratchPad.eventBits[0x29] & 0x4) != 0)/*have ending blow*/
+ {
+ if ((gameInfo.scratchPad.eventBits[0x29] & 0x8) != 0)/*have shield attack*/
+ {
+ if ((gameInfo.scratchPad.eventBits[0x29] & 0x2) != 0)/*have back slice*/
+ {
+ if ((gameInfo.scratchPad.eventBits[0x29] & 0x1) != 0)/*have helm splitter*/
+ {
+ if ((gameInfo.scratchPad.eventBits[0x2A] & 0x80) != 0)/*have mortal draw*/
+ {
+ if ((gameInfo.scratchPad.eventBits[0x2A] & 0x40) != 0)/*have jump strike*/
+ {
+ gameInfo.scratchPad.eventBits[0x2A] |= 0x20;//give great spin
+ }
+ else
+ {
+ gameInfo.scratchPad.eventBits[0x2A] |= 0x40;//give jumpstrike
+ }
+
+ }
+ else
+ {
+ gameInfo.scratchPad.eventBits[0x2A] |= 0x80;//give mortal draw
+ }
+
+ }
+ else
+ {
+ gameInfo.scratchPad.eventBits[0x29] |= 0x1;//give helm splitter
+ }
+
+ }
+ else
+ {
+ gameInfo.scratchPad.eventBits[0x29] |= 0x2;//give back slice
+ }
+
+ }
+ else
+ {
+ {
+ gameInfo.scratchPad.eventBits[0x29] |= 0x8;//give shield attack
+ }
+ }
+
+ }
+ else
+ {
+ gameInfo.scratchPad.eventBits[0x29] |= 0x4;//give ending blow
+ }
}
else if (item == items::Item::Reekfish_Scent)
{
diff --git a/source/game_patches.cpp b/source/game_patches.cpp
index 0212ea0..1c7272d 100644
--- a/source/game_patches.cpp
+++ b/source/game_patches.cpp
@@ -3,6 +3,8 @@
#include "stage.h"
#include "tools.h"
#include "singleton.h"
+#include "items.h"
+#include "itemChecks.h"
#include <tp/d_menu_collect.h>
#include <tp/d_a_alink.h>
@@ -11,6 +13,10 @@
#include <tp/JFWSystem.h>
#include <tp/d_com_inf_game.h>
#include <tp/evt_control.h>
+#include <tp/d_stage.h>
+#include <tp/d_a_shop_item_static.h>
+#include <tp/d_item_data.h>
+#include <tp/d_item.h>
#include <cstring>
#include <cstdio>
@@ -82,22 +88,20 @@ namespace mod::game_patch
void removeIBLimit()
{
- if (!tp::d_a_alink::checkStageName("D_MN07A"))
- {
- // li 0
- u32 li = 0x38600000;
- // b +4C
- u32 b = 0x4800004C;
+ // li 0
+ u32 li = 0x38600000;
+ // b +4C
+ u32 b = 0x4800004C;
- // CheckHeavyState overwrite
- u32 checkHeavyStateOnAddress = reinterpret_cast<u32>(&tp::d_a_alink::checkHeavyStateOn);
- *reinterpret_cast<u32*>(checkHeavyStateOnAddress + 0x84) = li;
+ // CheckHeavyState overwrite
+ u32 checkHeavyStateOnAddress = reinterpret_cast<u32>(&tp::d_a_alink::checkHeavyStateOn);
+ *reinterpret_cast<u32*>(checkHeavyStateOnAddress + 0x84) = li;
- u32 setStickDataAddress = reinterpret_cast<u32>(&tp::d_a_alink::setStickData);
- *reinterpret_cast<u32*>(setStickDataAddress + 0x5FC) = b;
- }
+ u32 setStickDataAddress = reinterpret_cast<u32>(&tp::d_a_alink::setStickData);
+ *reinterpret_cast<u32*>(setStickDataAddress + 0x5FC) = b;
}
+
void increaseWalletSize()
{
// li
@@ -193,6 +197,245 @@ namespace mod::game_patch
}
}
+ void fixFTState()
+ {
+ if (Singleton::getInstance()->hasFTBeenBeaten == 1)
+ {
+ gameInfo.scratchPad.allAreaNodes.Forest_Temple.dungeon.bossBeaten = 0b0; //unset boss flag
+ gameInfo.scratchPad.eventBits[0x6] &= ~0x2; //unset story flag
+ if ((gameInfo.scratchPad.allAreaNodes.Forest_Temple.unk_0[0x12] & 0x10) == 0)
+ {
+ gameInfo.scratchPad.allAreaNodes.Forest_Temple.dungeon.ooccooGotten = 0b0;
+ }
+ }
+ }
+
+ void fixGMState()
+ {
+ if (Singleton::getInstance()->hasGMBeenBeaten == 1 || Singleton::getInstance()->isGMStoryPatch == 1)
+ {
+ gameInfo.scratchPad.allAreaNodes.Goron_Mines.dungeon.bossBeaten = 0b0; //unset boss flag
+ gameInfo.scratchPad.eventBits[0x7] &= ~0x1; //unset story flag
+ if ((gameInfo.scratchPad.allAreaNodes.Goron_Mines.unk_0[0xE] & 0x2) == 0)
+ {
+ gameInfo.scratchPad.allAreaNodes.Goron_Mines.dungeon.ooccooGotten = 0b0;
+ }
+ }
+ }
+
+ void fixLBTState()
+ {
+ if (Singleton::getInstance()->hasLBTBeenBeaten == 1)
+ {
+ gameInfo.scratchPad.allAreaNodes.Lakebed_Temple.dungeon.bossBeaten = 0b0; //unset boss flag
+ gameInfo.scratchPad.eventBits[0x9] &= ~0x4; //unset story flag
+ if ((gameInfo.scratchPad.allAreaNodes.Lakebed_Temple.unk_0[0x11] & 0x80) == 0)
+ {
+ gameInfo.scratchPad.allAreaNodes.Lakebed_Temple.dungeon.ooccooGotten = 0b0;
+ }
+ }
+ }
+
+ void fixAGState()
+ {
+ if (Singleton::getInstance()->hasAGBeenBeaten == 1)
+ {
+ gameInfo.scratchPad.allAreaNodes.Arbiters_Grounds.dungeon.bossBeaten = 0b0; //unset boss flag
+ gameInfo.scratchPad.eventBits[0x20] &= ~0x10; //unset story flag
+ if ((gameInfo.scratchPad.allAreaNodes.Arbiters_Grounds.unk_0[0x17] & 0x20) == 0)
+ {
+ gameInfo.scratchPad.allAreaNodes.Arbiters_Grounds.dungeon.ooccooGotten = 0b0;
+ }
+ }
+ }
+
+ void fixSPRState()
+ {
+ if (Singleton::getInstance()->hasSPRBeenBeaten == 1 || Singleton::getInstance()->isEarlyToTEnabled == 1)
+ {
+ gameInfo.scratchPad.allAreaNodes.Snowpeak_Ruins.dungeon.bossBeaten = 0b0; //unset boss flag
+ gameInfo.scratchPad.eventBits[0x20] &= ~0x8; //unset story flag
+ if ((gameInfo.scratchPad.allAreaNodes.Snowpeak_Ruins.unk_0[0x1] & 0x1) == 0)
+ {
+ gameInfo.scratchPad.allAreaNodes.Snowpeak_Ruins.dungeon.ooccooGotten = 0b0;
+ }
+ }
+ }
+
+ void fixToTState()
+ {
+ if (Singleton::getInstance()->hasToTBeenBeaten == 1)
+ {
+ gameInfo.scratchPad.allAreaNodes.Temple_of_Time.dungeon.bossBeaten = 0b0; //unset boss flag
+ gameInfo.scratchPad.eventBits[0x20] &= ~0x4; //unset story flag
+ if ((gameInfo.scratchPad.allAreaNodes.Temple_of_Time.unk_0[0x4] & 0x80) == 0)
+ {
+ gameInfo.scratchPad.allAreaNodes.Temple_of_Time.dungeon.ooccooGotten = 0b0;
+ }
+ }
+ }
+
+ void fixCiTSState()
+ {
+ if (Singleton::getInstance()->hasCiTSBeenBeaten == 1 || Singleton::getInstance()->isEarlyPoTEnabled == 1)
+ {
+ gameInfo.scratchPad.allAreaNodes.City_in_the_Sky.dungeon.bossBeaten = 0b0; //unset boss flag
+ gameInfo.scratchPad.eventBits[0x20] &= ~0x2; //unset story flag
+ }
+ if (Singleton::getInstance()->hasCiTSOoccoo == 0)
+ {
+ gameInfo.scratchPad.allAreaNodes.City_in_the_Sky.dungeon.ooccooGotten = 0b0;
+ }
+ }
+
+ void setFTDungeonFlag()
+ {
+ if (Singleton::getInstance()->hasFTBeenBeaten == 0 && gameInfo.scratchPad.allAreaNodes.Forest_Temple.dungeon.bossBeaten == 0b1)
+ {
+ Singleton::getInstance()->hasFTBeenBeaten = 1;
+ }
+ else if (Singleton::getInstance()->hasFTBeenBeaten == 1)
+ {
+ gameInfo.scratchPad.allAreaNodes.Forest_Temple.dungeon.bossBeaten = 0b1; //set boss flag
+ gameInfo.scratchPad.eventBits[0x6] |= 0x2; //set story flag
+ }
+ }
+
+ void setGMDungeonFlag()
+ {
+ if (Singleton::getInstance()->hasGMBeenBeaten == 0 && gameInfo.scratchPad.allAreaNodes.Goron_Mines.dungeon.bossBeaten == 0b1)
+ {
+ Singleton::getInstance()->hasGMBeenBeaten = 1;
+ }
+ else if (Singleton::getInstance()->hasGMBeenBeaten == 1)
+ {
+ gameInfo.scratchPad.allAreaNodes.Goron_Mines.dungeon.bossBeaten = 0b1; //set boss flag
+ gameInfo.scratchPad.eventBits[0x7] |= 0x1; //set story flag
+ }
+ else if (Singleton::getInstance()->isGMStoryPatch == 1)
+ {
+ gameInfo.scratchPad.eventBits[0x7] |= 0x1; //set story flag
+ }
+ }
+
+ void setGMBossFlag()
+ {
+ if (Singleton::getInstance()->hasGMBeenBeaten == 1)
+ {
+ gameInfo.scratchPad.allAreaNodes.Goron_Mines.dungeon.bossBeaten = 0b1; //set boss flag
+ }
+ }
+
+ void setLakeDungeonFlags()
+ {
+ if (Singleton::getInstance()->hasLBTBeenBeaten == 0 && gameInfo.scratchPad.allAreaNodes.Lakebed_Temple.dungeon.bossBeaten == 0b1)
+ {
+ Singleton::getInstance()->hasLBTBeenBeaten = 1;
+ }
+ else if (Singleton::getInstance()->hasLBTBeenBeaten == 1)
+ {
+ gameInfo.scratchPad.allAreaNodes.Lakebed_Temple.dungeon.bossBeaten = 0b1; //set boss flag
+ gameInfo.scratchPad.eventBits[0x9] |= 0x4; //set story flag
+ }
+
+ if (Singleton::getInstance()->hasCiTSBeenBeaten == 0 && gameInfo.scratchPad.allAreaNodes.City_in_the_Sky.dungeon.bossBeaten == 0b1)
+ {
+ Singleton::getInstance()->hasCiTSBeenBeaten = 1;
+ }
+ else if (Singleton::getInstance()->hasCiTSBeenBeaten == 1)
+ {
+ gameInfo.scratchPad.allAreaNodes.City_in_the_Sky.dungeon.bossBeaten = 0b1; //set boss flag
+ gameInfo.scratchPad.eventBits[0x20] |= 0x2; //set story flag
+ }
+ else if (Singleton::getInstance()->isEarlyPoTEnabled == 1)
+ {
+ gameInfo.scratchPad.eventBits[0x20] |= 0x2; //set story flag
+ }
+ }
+
+ void setLBTBossFlag()
+ {
+ if (Singleton::getInstance()->hasLBTBeenBeaten == 1)
+ {
+ gameInfo.scratchPad.allAreaNodes.Lakebed_Temple.dungeon.bossBeaten = 0b1; //set boss flag
+ }
+ }
+
+ void setAGDungeonFlag()
+ {
+ if (Singleton::getInstance()->hasAGBeenBeaten == 0 && gameInfo.scratchPad.allAreaNodes.Arbiters_Grounds.dungeon.bossBeaten == 0b1)
+ {
+ Singleton::getInstance()->hasAGBeenBeaten = 1;
+ }
+ else if (Singleton::getInstance()->hasAGBeenBeaten == 1)
+ {
+ gameInfo.scratchPad.allAreaNodes.Arbiters_Grounds.dungeon.bossBeaten = 0b1; //set boss flag
+ gameInfo.scratchPad.eventBits[0x20] |= 0x10; //set story flag
+ }
+ }
+
+ void setAGBossFlag()
+ {
+ if (Singleton::getInstance()->hasAGBeenBeaten == 1)
+ {
+ gameInfo.scratchPad.allAreaNodes.Arbiters_Grounds.dungeon.bossBeaten = 0b1; //set boss flag
+ }
+ }
+
+ void setSPRDungeonFlag()
+ {
+ if (Singleton::getInstance()->hasSPRBeenBeaten == 0 && gameInfo.scratchPad.allAreaNodes.Snowpeak_Ruins.dungeon.bossBeaten == 0b1)
+ {
+ Singleton::getInstance()->hasSPRBeenBeaten = 1;
+ }
+ else if (Singleton::getInstance()->hasSPRBeenBeaten == 1)
+ {
+ gameInfo.scratchPad.allAreaNodes.Snowpeak_Ruins.dungeon.bossBeaten = 0b1; //set boss flag
+ gameInfo.scratchPad.eventBits[0x20] |= 0x8; //set story flag
+ }
+ else if (Singleton::getInstance()->isEarlyToTEnabled == 1)
+ {
+ gameInfo.scratchPad.eventBits[0x20] |= 0x8; //set story flag
+ }
+ }
+
+ void setSPRBossFlag()
+ {
+ if (Singleton::getInstance()->hasSPRBeenBeaten == 1)
+ {
+ gameInfo.scratchPad.allAreaNodes.Snowpeak_Ruins.dungeon.bossBeaten = 0b1; //set boss flag
+ }
+ }
+
+ void setToTDungeonFlag()
+ {
+ if (Singleton::getInstance()->hasToTBeenBeaten == 0 && gameInfo.scratchPad.allAreaNodes.Temple_of_Time.dungeon.bossBeaten == 0b1)
+ {
+ Singleton::getInstance()->hasToTBeenBeaten = 1;
+ }
+ else if (Singleton::getInstance()->hasToTBeenBeaten == 1)
+ {
+ gameInfo.scratchPad.allAreaNodes.Temple_of_Time.dungeon.bossBeaten = 0b1; //set boss flag
+ gameInfo.scratchPad.eventBits[0x20] |= 0x4; //set story flag
+ }
+ }
+
+ void setToTBossFlag()
+ {
+ if (Singleton::getInstance()->hasToTBeenBeaten == 1)
+ {
+ gameInfo.scratchPad.allAreaNodes.Temple_of_Time.dungeon.bossBeaten = 0b1; //set boss flag
+ }
+ }
+
+ void setCiTSBossFlag()
+ {
+ if (Singleton::getInstance()->hasCiTSBeenBeaten == 1)
+ {
+ gameInfo.scratchPad.allAreaNodes.City_in_the_Sky.dungeon.bossBeaten = 0b1; //set boss flag
+ }
+ }
+
void setBublinState()
{
strcpy(sysConsolePtr->consoleLine[20].line, "state was not 1");
@@ -297,22 +540,17 @@ namespace mod::game_patch
}
}
- void skipCartEscort()
- {
- if (Singleton::getInstance()->isCartEscortSkipEnabled == 1)
- {
- gameInfo.scratchPad.eventBits[0x8] |= 0x40;//escort started
- gameInfo.scratchPad.eventBits[0x8] |= 0x10;//escort finished
- gameInfo.scratchPad.eventBits[0x8] |= 0x4;//got zora armor from Rutela
- tools::triggerSaveLoad(stage::allStages[Stage_Kakariko_Interiors], 0x2, 0x3, 0xD);
- }
- gameInfo.scratchPad.allAreaNodes.Eldin.unk_0[0x17] |= 0x40;//remove rock in graveyard
- gameInfo.scratchPad.allAreaNodes.Eldin.unk_0[0x16] |= 0x40;
+ void breakBarrier()
+ {
+ if (Singleton::getInstance()->isEarlyHCEnabled == 1 && ((gameInfo.scratchPad.eventBits[0x1E] & 0x8) != 0))
+ {
+ gameInfo.scratchPad.eventBits[0x42] |= 0x8;
+ }
}
void setEscortState()
{
- if ((gameInfo.scratchPad.eventBits[0x8] & 0x40) == 0 && (Singleton::getInstance()->isCartEscortSkipEnabled == 1 || (tools::checkItemFlag(ItemFlags::Heros_Bow) && tools::checkItemFlag(ItemFlags::Boomerang))) && gameInfo.scratchPad.clearedTwilights.Lanayru == 0b1)
+ if ((gameInfo.scratchPad.eventBits[0x8] & 0x40) == 0 && Singleton::getInstance()->isCartEscortSkipEnabled == 0 && tools::checkItemFlag(ItemFlags::Heros_Bow) && tools::checkItemFlag(ItemFlags::Boomerang) && gameInfo.scratchPad.clearedTwilights.Lanayru == 0b1)
{
gameInfo.nextStageVars.nextState = 0x8;
gameInfo.nextStageVars.nextSpawnPoint = 0x14;
@@ -501,6 +739,11 @@ namespace mod::game_patch
gameInfo.scratchPad.eventBits[0x6] &= ~0x2;
Singleton::getInstance()->diababaMusicFixed = 1;
}
+
+ if (Singleton::getInstance()->hasFTBeenBeaten == 1)
+ {
+ gameInfo.scratchPad.allAreaNodes.Forest_Temple.dungeon.bossBeaten = 0b1; //set boss flag
+ }
}
void skipTextAndCS()
@@ -533,6 +776,7 @@ namespace mod::game_patch
eventBitsPtr[0x3] |= 0x90; //Jaggle Calls out to link, talked to squirrel as wolf in Ordon
eventBitsPtr[0x5] |= 0x10; //unchain wolf link
eventBitsPtr[0x6] |= 0xC0; //CS after beating Ordon Shadow, cs after entering Faron twilight
+ eventBitsPtr[0x7] |= 0x20; //Talked to Bo outside his house
eventBitsPtr[0xB] |= 0x20; //Talked to Yeta First Time
eventBitsPtr[0x10] |= 0x2; //Talked to Jaggle after climbing vines
eventBitsPtr[0x5E] |= 0x10; //Midna Text After Beating Forest Temple
@@ -541,6 +785,7 @@ namespace mod::game_patch
eventBitsPtr[0x1D] = 0x40; //fight bublin after Fyer
eventBitsPtr[0x22] |= 0x1; //Plumm initial CS watched
eventBitsPtr[0x26] |= 0x2; //Talked to Yeto on Snowpeak
+ eventBitsPtr[0x28] |= 0x40; //Used Ooccoo for the First Time
eventBitsPtr[0x37] |= 0x4; // Postman Twilight Text
eventBitsPtr[0x38] |= 0x6; //Enter Hena Cabin CS
eventBitsPtr[0x3A] |= 0x1; //Talked to Ralis
@@ -670,15 +915,56 @@ namespace mod::game_patch
allAreaNodesPtr->Faron.unk_0[0xE] |= 0x9;//cs after entering Faron,spring cs with spirit
allAreaNodesPtr->Faron.unk_0[0x17] |= 0xC0;//kill bugs in Coro's House
- //Apply Randomizer Options
- checkBossKeysey();
- earlyCiTS();
- earlyDesert();
//Apply Overrides for custom chests
gameInfo.scratchPad.eventBits[0x22] |= 0x4;/*Got Ilia's Charm from Impaz*/
gameInfo.scratchPad.eventBits[0x49] |= 0x2;/*Bought Slingshot from Sera*/
+ //Apply Randomizer Options
+ checkBossKeysey();
+ earlyCiTS();
+ earlyDesert();
+
+ if (Singleton::getInstance()->isEarlyToTEnabled == 1)
+ {
+ gameInfo.scratchPad.allAreaNodes.Sacred_Grove.unk_0[0x17] |= 0x10; //SG Portal
+ gameInfo.scratchPad.allAreaNodes.Sacred_Grove.unk_0[0x9] |= 0x40; //ToT Stairs
+ gameInfo.scratchPad.allAreaNodes.Sacred_Grove.unk_0[0xB] |= 0x10; //Pushed block as human
+ }
+
+ if (Singleton::getInstance()->isEarlyPoTEnabled == 1)
+ {
+ gameInfo.scratchPad.eventBits[0x20] |= 0x2; //CiTS Story Flag
+ }
+
+ if (Singleton::getInstance()->isGMStoryPatch == 1)
+ {
+ gameInfo.scratchPad.eventBits[0x7] |= 0x1; //Mines Story Flag
+ gameInfo.scratchPad.eventBits[0x13] |= 0x20; //watched post GM cs
+ gameInfo.scratchPad.allAreaNodes.Eldin.unk_0[0x14] |= 0x10; //barnes sells bombs
+ }
+
+ if (Singleton::getInstance()->isCartEscortSkipEnabled == 1)
+ {
+ gameInfo.scratchPad.eventBits[0x8] |= 0x40;//escort started
+ gameInfo.scratchPad.eventBits[0x8] |= 0x10;//escort finished
+ gameInfo.scratchPad.eventBits[0x8] |= 0x4;//got zora armor from Rutela
+ gameInfo.scratchPad.allAreaNodes.Eldin.unk_0[0x17] |= 0x40;//remove rock in graveyard
+ gameInfo.scratchPad.allAreaNodes.Eldin.unk_0[0x16] |= 0x40;
+ }
+
+ if (Singleton::getInstance()->startWithCrystal == 1)
+ {
+ giveMidnaTransform();
+ tools::setItemFlag(ItemFlags::Shadow_Crystal);
+
+ if (Singleton::getInstance()->isMDHSkipEnabled == 1)
+ {
+ gameInfo.scratchPad.unk_1F[0x11] |= 0x8; //Midna on Back
+ }
+ }
+
+
if (Singleton::getInstance()->isIntroSkipped == 1)
{
//set Ordon Days 1,2, and 3 Flags
@@ -722,7 +1008,7 @@ namespace mod::game_patch
scratchPadPtr->clearedTwilights.Faron = 0b1; //Clear Faron Twilight
tools::setItemFlag(ItemFlags::Vessel_Of_Light_Faron);
scratchPadPtr->tearCounters.Faron = 16;
- eventBitsPtr[0x5] = 0xFF; //Ensure Epona is Stolen, give Midna Charge
+ eventBitsPtr[0x5] |= 0xFF; //Ensure Epona is Stolen, give Midna Charge
eventBitsPtr[0x6] |= 0x10; //Faron Twilight Progression flag
eventBitsPtr[0xC] |= 0x8; //Set Sword and Shield to not be on back
tools::setItemFlag(ItemFlags::Heros_Clothes);
@@ -734,7 +1020,7 @@ namespace mod::game_patch
eventBitsPtr[0x6] |= 0x1; //tame Epona
eventBitsPtr[0xA] |= 0x8; //Beat KB1
eventBitsPtr[0x14] |= 0x10; //Put Bo Outside
- eventBitsPtr[0x7] = 0xDE; //skip Gor Coron Sumo and Enter Mines also Trigger KB1 and mark Post-KB1 CS as watched, Eldin Twilight Story Progression Flag
+ eventBitsPtr[0x7] |= 0xDE; //skip Gor Coron Sumo and Enter Mines also Trigger KB1 and mark Post-KB1 CS as watched, Eldin Twilight Story Progression Flag
eventBitsPtr[0x41] |= 0x10; //Told Fado about the Kids
//Set Lanayru Twilight Flags
@@ -824,4 +1110,93 @@ namespace mod::game_patch
eventBitsPtr[0xF] |= 0x8; //Put Eldin BRidge Back
}
}
+
+ /*void setFieldModels()
+ {
+ tp::d_item_data::ItemResource* itemResPtr = &tp::d_item_data::item_resource[0];
+ tp::d_item_data::FieldItemRes* fieldItemResPtr = &tp::d_item_data::field_item_res[0];
+
+ u32 loopCount = sizeof(item::itemsWithNoFieldModel) / sizeof(item::itemsWithNoFieldModel[0]);
+ for (u32 i = 0; i < loopCount; i++)
+ {
+ u32 item = item::itemsWithNoFieldModel[i]; // Retrieve as u32 to prevent rlwinm shenanigans
+ fieldItemResPtr[item].arcName = itemResPtr[item].arcName;
+ fieldItemResPtr[item].modelResIdx = itemResPtr[item].modelResIdx;
+ }
+
+ // For items that dont have a field model, use rupee item info to allow the item to be collected and whatnot
+ // Using the yellow rupee because thats what i used in testing
+ tp::d_item_data::ItemInfo* itemInfoPtr = &tp::d_item_data::item_info[0];
+ tp::d_item_data::ItemInfo* yellowRupeeInfoPtr = &tp::d_item_data::item_info[items::Yellow_Rupee];
+
+ loopCount = sizeof(item::itemsWithNoFieldModel) / sizeof(item::itemsWithNoFieldModel[0]);
+ for (u32 i = 0; i < loopCount; i++)
+ {
+ u32 item = item::itemsWithNoFieldModel[i]; // Retrieve as u32 to prevent rlwinm shenanigans
+ itemInfoPtr[item].mShadowSize = yellowRupeeInfoPtr->mShadowSize;
+ itemInfoPtr[item].mCollisionH = yellowRupeeInfoPtr->mCollisionH;
+ itemInfoPtr[item].mCollisionR = yellowRupeeInfoPtr->mCollisionR;
+ itemInfoPtr[item].mFlags = yellowRupeeInfoPtr->mFlags;
+ }
+
+ // Modify a branch in itemGetNextExecute to allow the item get cutscene to play with items past 0x40
+ // If you already have the item it gives you, then itll act like a rupee and appear over your head. This could be changed though.
+ u32 address_US = 0x8015CF64;
+ *reinterpret_cast<u32*>(address_US) = 0x48000018; // b 0x18
+
+ // Hook dStage_actorCommonLayerInit to search for field items (probably only rupees) to replace based on object name
+ bool procActorCommonLayerInit(void* mStatus_roomControl, tp::d_stage::dzxChunkTypeInfo* chunkTypeInfo, s32 unk3, void* unk4)
+ {
+ Actr* actrPtr = chunkTypeInfo->chunkDataPtr;
+ u32 numChunks = chunkTypeInfo->numChunks;
+ for (u32 i = 0; i < numChunks; i++)
+ {
+ // Check for "item", as that seems to be whats used for rupees
+ // Would check for chests and whatnot as well when changing the contents of those
+ if (strncmp(actrPtr->objectName, "item", sizeof(Actr.objectName)))
+ {
+ // Change the item id
+ u8* tempParamBytes = reinterpret_cast<u8*>(&actrPtr->parameters);
+ tempParamBytes[3] = newItemId;
+
+ // Changing the parameters probably isnt necessary for "item", but I'll add them anyway
+ // Refer to Winditor for what the parameters do
+ tempParamBytes[0] = 0xF3;
+ tempParamBytes[1] = 0xFF;
+ tempParamBytes[2] = 0x80;
+ actrPtr->rot[2] = 0x3F;
+ }
+ }
+ }
+
+ // hook dStage_actorInit to search for field items (probably only heart containers) to replace based on object name
+ // Not sure what is passed into dStage_actorInit, but r4 seems to be the same as dStage_actorCommonLayerInit
+ bool procActorCommonLayerInit(void* mStatus_roomControl, tp::d_stage::dzxChunkTypeInfo* chunkTypeInfo, s32 unk3, void* unk4)
+ {
+ Actr* actrPtr = chunkTypeInfo->chunkDataPtr;
+ u32 numChunks = chunkTypeInfo->numChunks;
+ for (u32 i = 0; i < numChunks; i++)
+ {
+ // Check for "htPiece", as that seems to be whats used for heart pieces
+ // Not sure what name heart containers use
+ if (strncmp(actrPtr->objectName, "htPiece", sizeof(Actr.objectName)))
+ {
+ // Change the object name to "item"
+ strncpy(actrPtr->objectName, "item", sizeof(Actr.objectName));
+
+ // Change the item id
+ u8* tempParamBytes = reinterpret_cast<u8*>(&actrPtr->parameters);
+ tempParamBytes[3] = newItemId;
+
+ // Changing the parameters is necessary for this, as its being changed to use rupee parameters
+ // Currently allows the item to respawn, so need to look into what handles that
+ // Refer to Winditor for what the parameters do
+ tempParamBytes[0] = 0xF3;
+ tempParamBytes[1] = 0xFF;
+ tempParamBytes[2] = 0x80;
+ actrPtr->rot[2] = 0x3F;
+ }
+ }
+ }
+ }*/
} \ No newline at end of file
diff --git a/source/item.cpp b/source/item.cpp
index 98a273d..f0f57fe 100644
--- a/source/item.cpp
+++ b/source/item.cpp
@@ -5,18 +5,18 @@
namespace mod::item
{
- u8 itemGetAnimationFlags[10] =
- {
- static_cast<u8>(ItemFlags::Blue_Rupee),
- static_cast<u8>(ItemFlags::Yellow_Rupee),
- static_cast<u8>(ItemFlags::Red_Rupee),
- static_cast<u8>(ItemFlags::Purple_Rupee),
- static_cast<u8>(ItemFlags::Orange_Rupee),
- static_cast<u8>(ItemFlags::Seeds_50),
- static_cast<u8>(ItemFlags::Arrows_30),
- static_cast<u8>(ItemFlags::Arrows_20),
- static_cast<u8>(ItemFlags::Arrows_10),
- static_cast<u8>(ItemFlags::Arrows_1),
+ u8 itemGetAnimationFlags[10] =
+ {
+ static_cast<u8>(ItemFlags::Blue_Rupee),
+ static_cast<u8>(ItemFlags::Yellow_Rupee),
+ static_cast<u8>(ItemFlags::Red_Rupee),
+ static_cast<u8>(ItemFlags::Purple_Rupee),
+ static_cast<u8>(ItemFlags::Orange_Rupee),
+ static_cast<u8>(ItemFlags::Seeds_50),
+ static_cast<u8>(ItemFlags::Arrows_30),
+ static_cast<u8>(ItemFlags::Arrows_20),
+ static_cast<u8>(ItemFlags::Arrows_10),
+ static_cast<u8>(ItemFlags::Arrows_1),
};
u32 getFlags(u8 item, u32 currentPlayerConditions)
{
@@ -48,7 +48,7 @@ namespace mod::item
flags |= item::Condition::Water_Bombs;
break;
- case items::Item::Bomb_Bag_Regular_Bombs:
+ case items::Item::Empty_Bomb_Bag:
flags |= item::Condition::Bombs;
flags |= item::Condition::Water_Bombs;
break;
@@ -89,8 +89,8 @@ namespace mod::item
flags |= item::Condition::Ordon_Sword;
break;
- case items::Item::Master_Sword:
- flags |= item::Condition::Master_Sword;
+ case items::Item::Shadow_Crystal:
+ flags |= item::Condition::Shadow_Crystal;
break;
case items::Item::Ordon_Shield:
@@ -115,4 +115,10 @@ namespace mod::item
return flags;
}
+
+ u8 itemsWithNoFieldModel[2] =
+ {
+ 0x32,
+ 0x40
+ };
} \ No newline at end of file
diff --git a/source/itemChecks.cpp b/source/itemChecks.cpp
index 0d49ab0..32e7951 100644
--- a/source/itemChecks.cpp
+++ b/source/itemChecks.cpp
@@ -51,7 +51,7 @@ namespace mod::item
/* 41 */{0x06, 7, stage::allStages[46], 0, 0x5, 0xFF, 0b000000101100000000000, -4027.7336430, 3200.0000000, -8970.9990230, nullptr, nullptr}, //Kakariko Watchtower Alcove Chest
/* 42 */{0x21, 3, stage::allStages[56], 0, 0x5, 0xFF, 0b000000001000000000000, 11550.0000000, 2700.0000000, 24090.0000000, nullptr, nullptr}, //Eldin Bomb Rock Ledge Heart Piece Chest
/* 43 */{0x03, 7, stage::allStages[50], 1, 0x5, 0xFF, 0b000000000000000000000, 2784.3178710, -4587.8901370, 10773.4140620, nullptr, nullptr}, //ZD Small Chest By Mother and Child Isles
- /* 44 */{0x04, 7, stage::allStages[50], 1, 0x8, 0x8, 0b000000000000000000000, 3810.8435060, -3535.5300290, 11344.8876950, nullptr, nullptr}, //ZD Small Chest Under Waterfall
+ /* 44 */{0x04, 7, stage::allStages[50], 1, 0x8, 0xFF, 0b000000000000000000000, 3810.8435060, -3535.5300290, 11344.8876950, nullptr, nullptr}, //ZD Small Chest Under Waterfall
/* 45 */{0x06, 7, stage::allStages[52], 0, 0x5, 0xFF, 0b001000000000000000000, -97123.5468750, -19490.0000000, 58585.6992190, nullptr, nullptr}, //Lake Hylia Underwater Chest
/* 46 */{0x0F, 5, stage::allStages[0], 0, 0x6, 0xFF, 0b000000000000001000000, -1707.6793210, 1250.0000000, 15388.9882810, nullptr, nullptr}, //LBT Lobby Left Chest
/* 47 */{0x17, 5, stage::allStages[0], 0, 0x6, 0xFF, 0b000000000000001000000, -144.6737980, 1250.0000000, 16525.8710940, nullptr, nullptr}, //LBT Lobby Rear Chest
@@ -138,132 +138,132 @@ namespace mod::item
/* 128 */{0x04, 7, stage::allStages[34], 10, 0x7, 0xFF, 0b000000000010000000000, 13825.0000000, 137.5000000, -34250.0000000, nullptr, nullptr}, //Eldin Stockcave Small Chest
/* 129 */{0x06, 7, stage::allStages[34], 10, 0x7, 0xFF, 0b111000000010000000000, 9577.0000000, -2833.8898930, -33492.0000000, nullptr, nullptr}, //Eldin Stockcave Lanturn Chest
/* 130 */{0x21, 3, stage::allStages[34], 10, 0x7, 0xFF, 0b101000000010000000000, 9515.7099610, -2850.0000000, -31912.3808590, nullptr, nullptr}, //Eldin Stockcave Heart Piece Chest
- /* 131 */{ 0x05, 7, stage::allStages[59], 0, 0x9, 0xFF, 0b000000000010000000000, -6940.8110350, 441.2112430, 48305.4023440, nullptr, nullptr },
- /* 132 */{ 0x06, 7, stage::allStages[37], 2, 0x9, 0xFF, 0b110000100010000000010, -128.8401180, 150.0000000, -1330.3356930, nullptr, nullptr },
- /* 133 */{ 0x04, 7, stage::allStages[59], 0, 0x9, 0xFF, 0b000000000000000000000, 9889.4482420, -732.8599850, 17813.8398440, nullptr, nullptr },
- /* 134 */{ 0x06, 7, stage::allStages[59], 0, 0x9, 0xFF, 0b000000000000000000000, 32741.2617190, 158.3099980, 68606.5468750, nullptr, nullptr },
- /* 135 */{ 0x04, 7, stage::allStages[59], 0, 0x9, 0xFF, 0b000000000000000000000, 3104.9711910, -732.8599850, 24575.0351560, nullptr, nullptr },
- /* 136 */{ 0x05, 7, stage::allStages[59], 0, 0x9, 0xFF, 0b000000000000000000000, 4945.0000000, -732.8599850, 25572.0000000, nullptr, nullptr },
- /* 137 */{ 0x0E, 5, stage::allStages[59], 0, 0x9, 0xFF, 0b000000000000000000000, 1845.0000000, -732.8599850, 26130.0000000, nullptr, nullptr },
- /* 138 */{ 0x04, 7, stage::allStages[59], 0, 0x9, 0xFF, 0b000000000000000000000, -6532.4062500, -732.8599850, 20852.4121090, nullptr, nullptr },
- /* 139 */{ 0x0E, 5, stage::allStages[59], 0, 0x9, 0xFF, 0b000000000000000000000, 4681.0947270, -162.9400020, 12575.7626950, nullptr, nullptr },
- /* 140 */{ 0x0F, 5, stage::allStages[55], 1, 0x9, 0xFF, 0b000000000000000000000, 4761.6406250, 0.0000000, 1580.5701900, nullptr, nullptr },
- /* 141 */{ 0x05, 7, stage::allStages[55], 1, 0x9, 0xFF, 0b000000000000000000000, 2389.0454100, 260.0000000, -1473.3872070, nullptr, nullptr },
- /* 142 */{ 0x05, 7, stage::allStages[55], 3, 0x9, 0xFF, 0b010000000000000000000, 3633.6201170, 840.0000000, -12457.7001950, nullptr, nullptr },
- /* 143 */{ 0x20, 8, stage::allStages[24], 0, 0x9, 0xFF, 0b000000000000000000000, -3000.0000000, -19.0000000, 5600.0000000, nullptr, nullptr },
- /* 144 */{ 0x20, 8, stage::allStages[24], 15, 0x9, 0xFF, 0b000000000000000000000, 4125.0000000, -741.5800170, -2250.0000000, nullptr, nullptr },
- /* 145 */{ 0x21, 3, stage::allStages[24], 2, 0x9, 0xFF, 0b000000000000000000000, 1300.0000000, 62.5000000, -3012.5000000, nullptr, nullptr },
- /* 146 */{ 0x23, 2, stage::allStages[24], 2, 0x9, 0x9, 0b000000000000000000000, -1300.0000000, 50.0000000, -3012.5000000, nullptr, nullptr },
- /* 147 */{ 0x24, 2, stage::allStages[24], 4, 0x9, 0x9, 0b000000000000000100000, 9400.0000000, 990.0599980, 6100.0000000, nullptr, nullptr },
- /* 148 */{ 0x20, 8, stage::allStages[24], 4, 0x9, 0xFF, 0b000000000000000100000, 12275.0000000, 980.0000000, 4537.5000000, nullptr, nullptr },
- /* 149 */{ 0x20, 8, stage::allStages[24], 14, 0x9, 0xFF, 0b000000000000000100000, 4150.0000000, 825.0000000, 775.0000000, nullptr, nullptr },
- /* 150 */{ 0x04, 7, stage::allStages[24], 6, 0x9, 0xFF, 0b000000000000000000000, -4065.0000000, 150.0000000, -2660.0000000, nullptr, nullptr },
- /* 151 */{ 0x04, 7, stage::allStages[24], 6, 0x9, 0xFF, 0b000000000000000000000, -4450.0000000, 400.0000000, 1150.0000000, nullptr, nullptr },
- /* 152 */{ 0x0A, 5, stage::allStages[24], 7, 0x9, 0xFF, 0b000000100100000000000, -9975.0000000, 500.0000000, -600.0000000, nullptr, nullptr },
- /* 153 */{ 0x0A, 5, stage::allStages[24], 7, 0x9, 0xFF, 0b000000100100000000000, -8113.0000000, 500.0000000, -1382.0000000, nullptr, nullptr },
- /* 154 */{ 0x20, 8, stage::allStages[24], 16, 0x9, 0xFF, 0b000000000000000000000, 3970.0000000, -1050.0000000, -6080.0000000, nullptr, nullptr },
- /* 155 */{ 0x41, 0, stage::allStages[26], 51, 0x9, 0x9, 0b000100000010000000000, 0.0000000, 50.0000000, -6200.0000000, nullptr, nullptr },
- /* 156 */{ 0x0B, 5, stage::allStages[24], 13, 0x10, 0xFF, 0b000000000000100000000, -8331.4091800, -1800.0000000, -3677.7468260, nullptr, nullptr },
- /* 157 */{ 0x04, 7, stage::allStages[24], 13, 0x10, 0xFF, 0b000000000000100000000, -10212.5000000, -1840.0000000, -3725.0000000, nullptr, nullptr },
- /* 158 */{ 0x03, 7, stage::allStages[24], 13, 0x10, 0xFF, 0b000000000000100000000, -10812.5000000, -1825.0000000, -5712.5000000, nullptr, nullptr },
- /* 159 */{ 0x21, 3, stage::allStages[24], 13, 0x10, 0xFF, 0b000000000000100000000, -5475.0000000, -1325.0000000, -4875.0000000, nullptr, nullptr },
- /* 160 */{ 0x03, 7, stage::allStages[24], 13, 0x10, 0xFF, 0b000000000000100000000, -6225.0000000, -1125.0000000, -7275.0000000, nullptr, nullptr },
- /* 161 */{ 0x26, 2, stage::allStages[24], 9, 0x10, 0x10, 0b000000000000100000000, -3675.0000000, 500.0000000, -7250.0000000, nullptr, nullptr },
- /* 162 */{ 0x21, 3, stage::allStages[56], 11, 0x10, 0xFF, 0b000000000000100000000, -88260.0000000, 2950.0000000, -8150.0000000, nullptr, nullptr },
- /* 163 */{ 0x0A, 5, stage::allStages[36], 1, 0x10, 0xFF, 0b100000000000100000010, 464.9176030, -262.3106380, -709.6952510, nullptr, nullptr },
- /* 164 */{ 0x0A, 5, stage::allStages[36], 1, 0x10, 0xFF, 0b100000000000100000010, -1153.7760010, -255.8396450, -980.6660160, nullptr, nullptr },
- /* 165 */{ 0x21, 3, stage::allStages[36], 1, 0x10, 0xFF, 0b100000100000100000010, -211.8499450, -60.9387400, -2691.0991210, nullptr, nullptr },
- /* 166 */{ 0x06, 7, stage::allStages[57], 16, 0x10, 0xFF, 0b100000000010100000000, -51500.0000000, -5180.0000000, 25970.0000000, nullptr, nullptr },
+ /* 131 */{ 0x05, 7, stage::allStages[59], 0, 0x9, 0xFF, 0b000000000010000000000, -6940.8110350, 441.2112430, 48305.4023440, nullptr, nullptr },
+ /* 132 */{ 0x06, 7, stage::allStages[37], 2, 0x9, 0xFF, 0b110000100010000000010, -128.8401180, 150.0000000, -1330.3356930, nullptr, nullptr },
+ /* 133 */{ 0x04, 7, stage::allStages[59], 0, 0x9, 0xFF, 0b000000000000000000000, 9889.4482420, -732.8599850, 17813.8398440, nullptr, nullptr },
+ /* 134 */{ 0x06, 7, stage::allStages[59], 0, 0x9, 0xFF, 0b000000000000000000000, 32741.2617190, 158.3099980, 68606.5468750, nullptr, nullptr },
+ /* 135 */{ 0x04, 7, stage::allStages[59], 0, 0x9, 0xFF, 0b000000000000000000000, 3104.9711910, -732.8599850, 24575.0351560, nullptr, nullptr },
+ /* 136 */{ 0x05, 7, stage::allStages[59], 0, 0x9, 0xFF, 0b000000000000000000000, 4945.0000000, -732.8599850, 25572.0000000, nullptr, nullptr },
+ /* 137 */{ 0x0E, 5, stage::allStages[59], 0, 0x9, 0xFF, 0b000000000000000000000, 1845.0000000, -732.8599850, 26130.0000000, nullptr, nullptr },
+ /* 138 */{ 0x04, 7, stage::allStages[59], 0, 0x9, 0xFF, 0b000000000000000000000, -6532.4062500, -732.8599850, 20852.4121090, nullptr, nullptr },
+ /* 139 */{ 0x0E, 5, stage::allStages[59], 0, 0x9, 0xFF, 0b000000000000000000000, 4681.0947270, -162.9400020, 12575.7626950, nullptr, nullptr },
+ /* 140 */{ 0x0F, 5, stage::allStages[55], 1, 0x9, 0xFF, 0b000000000000000000000, 4761.6406250, 0.0000000, 1580.5701900, nullptr, nullptr },
+ /* 141 */{ 0x05, 7, stage::allStages[55], 1, 0x9, 0xFF, 0b000000000000000000000, 2389.0454100, 260.0000000, -1473.3872070, nullptr, nullptr },
+ /* 142 */{ 0x05, 7, stage::allStages[55], 3, 0x9, 0xFF, 0b010000000000000000000, 3633.6201170, 840.0000000, -12457.7001950, nullptr, nullptr },
+ /* 143 */{ 0x20, 8, stage::allStages[24], 0, 0x9, 0xFF, 0b000000000000000000000, -3000.0000000, -19.0000000, 5600.0000000, nullptr, nullptr },
+ /* 144 */{ 0x20, 8, stage::allStages[24], 15, 0x9, 0xFF, 0b000000000000000000000, 4125.0000000, -741.5800170, -2250.0000000, nullptr, nullptr },
+ /* 145 */{ 0x21, 3, stage::allStages[24], 2, 0x9, 0xFF, 0b000000000000000000000, 1300.0000000, 62.5000000, -3012.5000000, nullptr, nullptr },
+ /* 146 */{ 0x23, 2, stage::allStages[24], 2, 0x9, 0x9, 0b000000000000000000000, -1300.0000000, 50.0000000, -3012.5000000, nullptr, nullptr },
+ /* 147 */{ 0x24, 2, stage::allStages[24], 4, 0x9, 0x9, 0b000000000000000100000, 9400.0000000, 990.0599980, 6100.0000000, nullptr, nullptr },
+ /* 148 */{ 0x20, 8, stage::allStages[24], 4, 0x9, 0xFF, 0b000000000000000100000, 12275.0000000, 980.0000000, 4537.5000000, nullptr, nullptr },
+ /* 149 */{ 0x20, 8, stage::allStages[24], 14, 0x9, 0xFF, 0b000000000000000100000, 4150.0000000, 825.0000000, 775.0000000, nullptr, nullptr },
+ /* 150 */{ 0x04, 7, stage::allStages[24], 6, 0x9, 0xFF, 0b000000000000000000000, -4065.0000000, 150.0000000, -2660.0000000, nullptr, nullptr },
+ /* 151 */{ 0x04, 7, stage::allStages[24], 6, 0x9, 0xFF, 0b000000000000000000000, -4450.0000000, 400.0000000, 1150.0000000, nullptr, nullptr },
+ /* 152 */{ 0x0A, 5, stage::allStages[24], 7, 0x9, 0xFF, 0b000000100100000000000, -9975.0000000, 500.0000000, -600.0000000, nullptr, nullptr },
+ /* 153 */{ 0x0A, 5, stage::allStages[24], 7, 0x9, 0xFF, 0b000000100100000000000, -8113.0000000, 500.0000000, -1382.0000000, nullptr, nullptr },
+ /* 154 */{ 0x20, 8, stage::allStages[24], 16, 0x9, 0xFF, 0b000000000000000000000, 3970.0000000, -1050.0000000, -6080.0000000, nullptr, nullptr },
+ /* 155 */{ 0x41, 0, stage::allStages[26], 51, 0x9, 0x9, 0b000100000010000000000, 0.0000000, 50.0000000, -6200.0000000, nullptr, nullptr },
+ /* 156 */{ 0x0B, 5, stage::allStages[24], 13, 0x10, 0xFF, 0b000000000000100000000, -8331.4091800, -1800.0000000, -3677.7468260, nullptr, nullptr },
+ /* 157 */{ 0x04, 7, stage::allStages[24], 13, 0x10, 0xFF, 0b000000000000100000000, -10212.5000000, -1840.0000000, -3725.0000000, nullptr, nullptr },
+ /* 158 */{ 0x03, 7, stage::allStages[24], 13, 0x10, 0xFF, 0b000000000000100000000, -10812.5000000, -1825.0000000, -5712.5000000, nullptr, nullptr },
+ /* 159 */{ 0x21, 3, stage::allStages[24], 13, 0x10, 0xFF, 0b000000000000100000000, -5475.0000000, -1325.0000000, -4875.0000000, nullptr, nullptr },
+ /* 160 */{ 0x03, 7, stage::allStages[24], 13, 0x10, 0xFF, 0b000000000000100000000, -6225.0000000, -1125.0000000, -7275.0000000, nullptr, nullptr },
+ /* 161 */{ 0x26, 2, stage::allStages[24], 9, 0x10, 0x10, 0b000000000000100000000, -3675.0000000, 500.0000000, -7250.0000000, nullptr, nullptr },
+ /* 162 */{ 0x21, 3, stage::allStages[56], 11, 0x10, 0xFF, 0b000000000000100000000, -88260.0000000, 2950.0000000, -8150.0000000, nullptr, nullptr },
+ /* 163 */{ 0x0A, 5, stage::allStages[36], 1, 0x10, 0xFF, 0b100000000000100000010, 464.9176030, -262.3106380, -709.6952510, nullptr, nullptr },
+ /* 164 */{ 0x0A, 5, stage::allStages[36], 1, 0x10, 0xFF, 0b100000000000100000010, -1153.7760010, -255.8396450, -980.6660160, nullptr, nullptr },
+ /* 165 */{ 0x21, 3, stage::allStages[36], 1, 0x10, 0xFF, 0b100000100000100000010, -211.8499450, -60.9387400, -2691.0991210, nullptr, nullptr },
+ /* 166 */{ 0x06, 7, stage::allStages[57], 16, 0x10, 0xFF, 0b100000000010100000000, -51500.0000000, -5180.0000000, 25970.0000000, nullptr, nullptr },
/* 167 */{ 0x05, 7, stage::allStages[35], 0, 0x8, 0xFF, 0b110000000000000000010, -277.2709660, 150.0000000, -1096.2886960, nullptr, nullptr },
/* 168 */{0x04, 7, stage::allStages[45], 5, 0x1, 0xFF, 0b000000000000000000000, -25790.1093750, 330.0000000, -19842.9355470, nullptr, nullptr}, //Faron Mist Stump Chest
/* 169 */{0x03, 7, stage::allStages[45], 5, 0x1, 0xFF, 0b000000000000000000000, -24845.1308590, -100.0000000, -26998.7226560, nullptr, nullptr}, //Faron Mist North Small Chest
/* 170 */{0x05, 7, stage::allStages[45], 5, 0x1, 0xFF, 0b000000000000000000000, -25966.7851560, -83.1305240, -16071.9599610, nullptr, nullptr}, //Faron Mist East Chest
- /* 171 */{ 0x20, 8, stage::allStages[27], 4, 0x11, 0xFF, 0b000000000000000000000, -1500.0000000, -60.0000000, -4458.0000000, nullptr, nullptr },
- /* 172 */{ 0x04, 7, stage::allStages[27], 4, 0x11, 0xFF, 0b000000000000000000000, 1350.0000000, 50.0000000, -1400.0000000, nullptr, nullptr },
- /* 173 */{ 0xF4, 8, stage::allStages[27], 5, 0x11, 0x11, 0b000000000000000100000, 5300.0000000, 0.0000000, -5100.0000000, nullptr, nullptr },
- /* 174 */{ 0x20, 8, stage::allStages[27], 4, 0x11, 0xFF, 0b000000000000000000000, 1350.0000000, -40.0000000, -4150.0000000, nullptr, nullptr },
- /* 175 */{ 0x04, 7, stage::allStages[27], 8, 0x11, 0xFF, 0b000000100100000000000, -4355.0000000, 0.0000000, -2160.0000000, nullptr, nullptr },
- /* 176 */{ 0x24, 2, stage::allStages[27], 8, 0x11, 0x11, 0b000000100100000000000, -3510.0000000, 0.0000000, -1350.0000000, nullptr, nullptr },
- /* 177 */{ 0x0A, 5, stage::allStages[27], 4, 0x11, 0xFF, 0b000000100100000000000, 0.0000000, 0.0000000, -1250.0000000, nullptr, nullptr },
- /* 178 */{ 0xF5, 8, stage::allStages[29], 51, 0x12, 0x12, 0b000000000100000000000, 0.0000000, 0.0000000, -3196.0000000, nullptr, nullptr },
- /* 179 */{ 0x21, 3, stage::allStages[27], 7, 0x12, 0xFF, 0b000000000100000000000, -3600.0000000, 0.0000000, 1600.0000000, nullptr, nullptr },
- /* 180 */{ 0x20, 8, stage::allStages[27], 8, 0x12, 0xFF, 0b000000000100000000000, -4350.0000000, 950.0000000, -3850.0000000, nullptr, nullptr },
- /* 181 */{ 0x21, 3, stage::allStages[27], 0, 0x12, 0xFF, 0b000000000100000000000, 0.0000000, 1118.3201900, 4690.0000000, nullptr, nullptr },
- /* 182 */{ 0x04, 7, stage::allStages[27], 0, 0x12, 0xFF, 0b000000000100000000000, -900.0000000, -50.0000000, 5950.0000000, nullptr, nullptr },
- /* 183 */{ 0x03, 7, stage::allStages[27], 0, 0x12, 0xFF, 0b000000000100000000000, 930.0000000, -50.0000000, 5350.0000000, nullptr, nullptr },
- /* 184 */{ 0x20, 8, stage::allStages[27], 5, 0x12, 0xFF, 0b100000000110000000000, 4350.0000000, 953.0000000, -4900.0000000, nullptr, nullptr },
- /* 185 */{ 0x04, 7, stage::allStages[27], 9, 0x12, 0xFF, 0b000000000100000000000, -5347.3071290, -50.0000000, -6500.8867190, nullptr, nullptr },
- /* 186 */{ 0x0A, 5, stage::allStages[27], 9, 0x12, 0xFF, 0b000000100100000000000, -1818.3217770, 0.0000000, -7562.9838870, nullptr, nullptr },
- /* 187 */{ 0xF6, 2, stage::allStages[27], 11, 0x12, 0x12, 0b100000100100000000000, -4350.0000000, 1050.0000000, -8560.5742190, nullptr, nullptr },
- /* 188 */{ 0x06, 7, stage::allStages[51], 2, 0x12, 0xFF, 0b110000000100000000010, -6233.2583010, -1800.0000000, -9865.0205080, nullptr, nullptr },
- /* 189 */{ 0x06, 7, stage::allStages[38], 3, 0x12, 0xFF, 0b100000000100000000010, -810.7105710, -300.0000000, -2101.0502930, nullptr, nullptr },
- /* 190 */{ 0x21, 3, stage::allStages[30], 0, 0x12, 0xFF, 0b000000000100000000000, 0.0000000, 0.0000000, -7900.0000000, nullptr, nullptr },
- /* 191 */{ 0x0D, 5, stage::allStages[54], 3, 0x12, 0xFF, 0b110100000000000000000, -15394.4238280, 2300.0000000, 2483.9230960, nullptr, nullptr },
- /* 192 */{ 0x06, 7, stage::allStages[54], 3, 0x12, 0xFF, 0b000000000000100000000, -6840.3515620, 2000.0000000, 6329.0605470, nullptr, nullptr },
- /* 193 */{ 0x20, 8, stage::allStages[9], 0, 0x12, 0xFF, 0b110001000000000000000, 2500.0000000, 56.2500000, 368.7500000, nullptr, nullptr },
- /* 194 */{ 0x10, 5, stage::allStages[9], 1, 0x12, 0xFF, 0b000001000000000000000, -12.5000000, 1100.0000000, 8362.5000000, nullptr, nullptr },
- /* 195 */{ 0x04, 7, stage::allStages[9], 1, 0x12, 0xFF, 0b000001000000000000000, 5795.0000000, 2505.0000000, 4210.0000000, nullptr, nullptr },
- /* 196 */{ 0x23, 2, stage::allStages[9], 1, 0x12, 0x12, 0b000001000000000000000, 6925.0000000, 2325.0000000, 3400.0000000, nullptr, nullptr },
- /* 197 */{ 0x20, 8, stage::allStages[9], 3, 0x12, 0xFF, 0b100001000000100000000, -1737.5000000, 4500.0000000, 5812.5000000, nullptr, nullptr },
- /* 198 */{ 0x24, 2, stage::allStages[9], 4, 0x12, 0x12, 0b100001000000100000000, -3450.0000000, 4450.0000000, -5510.0000000, nullptr, nullptr },
- /* 199 */{ 0x05, 7, stage::allStages[9], 5, 0x12, 0xFF, 0b100001000000100000000, -30.0000000, 5750.0000000, -1515.0000000, nullptr, nullptr },
- /* 200 */{ 0x20, 8, stage::allStages[9], 7, 0x12, 0xFF, 0b100001000000100000000, 5319.0000000, 7550.0000000, 8592.7500000, nullptr, nullptr },
- /* 201 */{ 0x05, 7, stage::allStages[9], 7, 0x12, 0xFF, 0b100001000000100000000, 5300.0000000, 8100.0000000, -800.0000000, nullptr, nullptr },
- /* 202 */{ 0x46, 0, stage::allStages[11], 51, 0x12, 0x12, 0b100001000000100100000, 0.0000000, -350.0000000, -2400.0000000, nullptr, nullptr },
- /* 203 */{ 0x04, 7, stage::allStages[9], 5, 0x12, 0xFF, 0b100001000010100000000, 1195.0000000, 7400.0000000, 2350.0000000, nullptr, nullptr },
- /* 204 */{ 0x04, 7, stage::allStages[9], 6, 0x12, 0xFF, 0b100001000010100000000, 6135.0000000, 8000.0000000, 0.0000000, nullptr, nullptr },
- /* 205 */{ 0x26, 2, stage::allStages[9], 6, 0x12, 0x12, 0b100001000010100000000, 5350.0000000, 7400.0000000, 0.0000000, nullptr, nullptr },
- /* 206 */{ 0x21, 3, stage::allStages[9], 4, 0x13, 0xFF, 0b100001000000110000000, -8740.0000000, 5100.0000000, -4515.0000000, nullptr, nullptr },
- /* 207 */{ 0x04, 7, stage::allStages[9], 3, 0x12, 0xFF, 0b100001000000100000000, 0.0000000, 4850.0000000, 9200.0000000, nullptr, nullptr },
- /* 208 */{ 0x21, 3, stage::allStages[9], 3, 0x13, 0xFF, 0b100001000000110000000, 1740.0000000, 4500.0000000, 5815.0000000, nullptr, nullptr },
- /* 209 */{ 0x21, 3, stage::allStages[54], 2, 0x13, 0xFF, 0b100001000000010000000, 606.7956540, 1005.0000000, 8005.3901370, nullptr, nullptr },
- /* 210 */{ 0x04, 7, stage::allStages[53], 4, 0x13, 0xFF, 0b000000000000000000000, 6500.0000000, 426.0000000, -977.0000000, nullptr, nullptr },
- /* 211 */{ 0x21, 3, stage::allStages[56], 0, 0x13, 0xFF, 0b000000000000010000000, 31257.5957030, 900.0000000, -16115.4990230, nullptr, nullptr },
- /* 212 */{ 0x06, 7, stage::allStages[56], 3, 0x13, 0xFF, 0b000000000000010000000, -10245.4765620, -4400.0000000, 42817.0467500, nullptr, nullptr },
- /* 213 */{ 0x06, 7, stage::allStages[57], 8, 0x13, 0xFF, 0b000000000000010000000, -79819.4140620, -1301.2399900, 22400.6718750, nullptr, nullptr },
- /* 214 */{ 0x06, 7, stage::allStages[56], 13, 0x13, 0xFF, 0b100000000010010000000, -93284.5703120, -5000.0000000, 18235.7246090, nullptr, nullptr },
- /* 215 */{ 0x21, 3, stage::allStages[45], 5, 0x13, 0xFF, 0b100000100000010000000, -21012.1542970, 1350.0000000, -20630.3222660, nullptr, nullptr },
- /* 216 */{ 0x06, 7, stage::allStages[59], 0, 0x13, 0xFF, 0b000000000000010000000, 16263.9707030, 989.6500240, 60708.4648440, nullptr, nullptr },
- /* 217 */{ 0x18, 5, stage::allStages[12], 0, 0x14, 0xFF, 0b101000000010000000000, -1170.0834960, -755.0000000, 6670.0000000, nullptr, nullptr },
- /* 218 */{ 0x04, 7, stage::allStages[12], 0, 0x14, 0xFF, 0b101000000010000000000, 1170.0000000, -755.0000000, 6670.0000000, nullptr, nullptr },
- /* 219 */{ 0x20, 8, stage::allStages[12], 10, 0x15, 0xFF, 0b100000000010100000000, -14514.4443360, 0.0000000, -12000.8310550, nullptr, nullptr },
- /* 220 */{ 0x23, 2, stage::allStages[12], 5, 0x14, 0x14, 0b101000000010100000000, 17665.1347660, 0.0000000, -11924.1035160, nullptr, nullptr },
- /* 221 */{ 0x03, 7, stage::allStages[12], 7, 0x14, 0xFF, 0b101000000010100000000, 15824.6093750, -110.0000000, -9750.6855470, nullptr, nullptr },
- /* 222 */{ 0x04, 7, stage::allStages[12], 7, 0x14, 0xFF, 0b101000000010100000000, 17550.0000000, 1500.0000000, -7200.0000000, nullptr, nullptr },
- /* 223 */{ 0x05, 7, stage::allStages[12], 7, 0x14, 0xFF, 0b101000000010100000000, 13470.0000000, 1500.0000000, -7925.0000000, nullptr, nullptr },
- /* 224 */{ 0x47, 0, stage::allStages[14], 51, 0x14, 0x14, 0b101000000010100000000, -0.3629600, 600.0000000, 2279.7690430, nullptr, nullptr },
- /* 225 */{ 0x24, 2, stage::allStages[12], 4, 0x15, 0x15, 0b101000000001100000000, 10800.0000000, -1775.0000000, -11850.0000000, nullptr, nullptr },
- /* 226 */{ 0x0F, 5, stage::allStages[12], 10, 0x15, 0xFF, 0b100000000001100000000, -11099.1240230, -1500.0000000, -15658.8515620, nullptr, nullptr },
- /* 227 */{ 0x04, 7, stage::allStages[12], 10, 0x15, 0xFF, 0b100000000001100000000, -13458.7949220, 0.0000000, -13410.5566410, nullptr, nullptr },
- /* 228 */{ 0x0B, 5, stage::allStages[12], 10, 0x15, 0xFF, 0b100000000001100000000, -10742.9599610, 0.0000000, -15156.7197270, nullptr, nullptr },
- /* 229 */{ 0x03, 7, stage::allStages[12], 11, 0x15, 0xFF, 0b100000000001100000000, -15654.8398440, 2840.2299800, -18906.7890620, nullptr, nullptr },
- /* 230 */{ 0x0F, 5, stage::allStages[12], 11, 0x15, 0xFF, 0b100000000001100000000, -12630.1699220, 2430.8999020, -19611.4316410, nullptr, nullptr },
- /* 231 */{ 0x21, 3, stage::allStages[12], 11, 0x15, 0xFF, 0b100000000001100000000, -14567.1093750, 2281.0000000, -16989.0351560, nullptr, nullptr },
- /* 232 */{ 0x04, 7, stage::allStages[12], 12, 0x15, 0xFF, 0b100000000001100000000, -15782.7958980, 2980.0000000, -11466.6982420, nullptr, nullptr },
- /* 233 */{ 0x05, 7, stage::allStages[12], 12, 0x15, 0xFF, 0b100000000001100000000, -14270.5380860, 1982.1999510, -7411.9101560, nullptr, nullptr },
- /* 234 */{ 0x0A, 5, stage::allStages[12], 12, 0x15, 0xFF, 0b100000000001100000000, -12592.9677730, 2400.0000000, -13712.7675780, nullptr, nullptr },
- /* 235 */{ 0x21, 3, stage::allStages[12], 12, 0x15, 0xFF, 0b100000000001100000000, -11494.3183590, 3000.0000000, -9888.6738280, nullptr, nullptr },
- /* 236 */{ 0x04, 7, stage::allStages[12], 13, 0x15, 0xFF, 0b100000000001100000000, 75.2376170, 4500.0000000, -10853.4550780, nullptr, nullptr },
- /* 237 */{ 0x05, 7, stage::allStages[12], 13, 0x15, 0xFF, 0b100000000001100000000, 4010.3149410, 4500.0000000, -12451.9033200, nullptr, nullptr },
- /* 238 */{ 0x26, 2, stage::allStages[12], 2, 0x15, 0x15, 0b100000000001100000000, -1090.9830320, 4500.0000000, -12411.7617190, nullptr, nullptr },
- /* 239 */{ 0x04, 7, stage::allStages[12], 2, 0x15, 0xFF, 0b100000000001100000000, 11.8030090, 3000.0000000, -13501.7851560, nullptr, nullptr },
- /* 240 */{ 0x05, 7, stage::allStages[12], 14, 0x15, 0xFF, 0b100000000001100000000, 0.0000000, 894.4799800, -23853.0000000, nullptr, nullptr },
- /* 241 */{ 0x21, 3, stage::allStages[56], 3, 0x15, 0xFF, 0b000000000001000000000, -22100.0000000, -7176.0297850, 52140.0000000, nullptr, nullptr },
- /* 242 */{ 0x06, 7, stage::allStages[52], 1, 0x15, 0xFF, 0b000000000001000000000, -2816.4138180, 1305.0787350, -1395.7875980, nullptr, nullptr },
- /* 243 */{ 0x06, 7, stage::allStages[52], 1, 0x15, 0xFF, 0b000000000001000000000, 2798.9057620, 1322.1817720, -987.1356810, nullptr, nullptr },
- /* 244 */{ 0x06, 7, stage::allStages[57], 16, 0x15, 0xFF, 0b000000000001000000000, -57374.0820310, -9100.0000000, 29237.9062500, nullptr, nullptr },
- /* 245 */{ 0x20, 8, stage::allStages[15], 1, 0x15, 0xFF, 0b000000000000000000000, -3950.0000000, -1071.0000000, 1375.0000000, nullptr, nullptr },
- /* 246 */{ 0x20, 8, stage::allStages[15], 2, 0x15, 0xFF, 0b000000000010000100000, -3950.0000000, -1200.0000000, -5075.0000000, nullptr, nullptr },
- /* 247 */{ 0x24, 2, stage::allStages[15], 2, 0x15, 0x15, 0b000000000010000100000, -2700.0000000, -1196.0000000, -1661.0000000, nullptr, nullptr },
- /* 248 */{ 0x06, 7, stage::allStages[15], 2, 0x15, 0xFF, 0b000000000001000100000, -2400.0000000, -21.2500000, -1550.0000000, nullptr, nullptr },
- /* 249 */{ 0x21, 3, stage::allStages[15], 1, 0x15, 0xFF, 0b000000000010000000000, -6850.0000000, -771.2500000, 3200.0000000, nullptr, nullptr },
- /* 250 */{ 0x05, 7, stage::allStages[15], 4, 0x15, 0xFF, 0b000000000010000000000, 3250.0000000, -696.2500000, 1235.0000000, nullptr, nullptr },
- /* 251 */{ 0x20, 8, stage::allStages[15], 4, 0x15, 0xFF, 0b000000000010000000000, 4650.0000000, -696.2500000, 1235.0000000, nullptr, nullptr },
- /* 252 */{ 0x05, 7, stage::allStages[15], 5, 0x15, 0xFF, 0b000000000001000100000, 5700.0000000, 3.7500000, -4350.0000000, nullptr, nullptr },
- /* 253 */{ 0x05, 7, stage::allStages[15], 5, 0x15, 0xFF, 0b000000000001000100000, 2200.0000000, 3.7500000, -5100.0000000, nullptr, nullptr },
- /* 254 */{ 0x23, 2, stage::allStages[15], 5, 0x15, 0x15, 0b000000000001000100000, 2300.0000000, -396.2500000, -3300.0000000, nullptr, nullptr },
- /* 255 */{ 0x20, 8, stage::allStages[15], 5, 0x15, 0xFF, 0b000000000001000100000, 5600.0000000, -296.2500000, -3300.0000000, nullptr, nullptr },
- /* 256 */{ 0x21, 3, stage::allStages[15], 4, 0x15, 0xFF, 0b000000000001000000000, 5352.5000000, -171.2500000, 3500.0000000, nullptr, nullptr },
+ /* 171 */{ 0x20, 8, stage::allStages[27], 4, 0x11, 0xFF, 0b000000000000000000000, -1500.0000000, -60.0000000, -4458.0000000, nullptr, nullptr },
+ /* 172 */{ 0x04, 7, stage::allStages[27], 4, 0x11, 0xFF, 0b000000000000000000000, 1350.0000000, 50.0000000, -1400.0000000, nullptr, nullptr },
+ /* 173 */{ 0xF4, 8, stage::allStages[27], 5, 0x11, 0x11, 0b000000000000000100000, 5300.0000000, 0.0000000, -5100.0000000, nullptr, nullptr },
+ /* 174 */{ 0x20, 8, stage::allStages[27], 4, 0x11, 0xFF, 0b000000000000000000000, 1350.0000000, -40.0000000, -4150.0000000, nullptr, nullptr },
+ /* 175 */{ 0x04, 7, stage::allStages[27], 8, 0x11, 0xFF, 0b000000100100000000000, -4355.0000000, 0.0000000, -2160.0000000, nullptr, nullptr },
+ /* 176 */{ 0x24, 2, stage::allStages[27], 8, 0x11, 0x11, 0b000000100100000000000, -3510.0000000, 0.0000000, -1350.0000000, nullptr, nullptr },
+ /* 177 */{ 0x0A, 5, stage::allStages[27], 4, 0x11, 0xFF, 0b000000100100000000000, 0.0000000, 0.0000000, -1250.0000000, nullptr, nullptr },
+ /* 178 */{ 0xF5, 8, stage::allStages[29], 51, 0x12, 0x12, 0b000000000100000000000, 0.0000000, 0.0000000, -3196.0000000, nullptr, nullptr },
+ /* 179 */{ 0x21, 3, stage::allStages[27], 7, 0x12, 0xFF, 0b000000000100000000000, -3600.0000000, 0.0000000, 1600.0000000, nullptr, nullptr },
+ /* 180 */{ 0x20, 8, stage::allStages[27], 8, 0x12, 0xFF, 0b000000000100000000000, -4350.0000000, 950.0000000, -3850.0000000, nullptr, nullptr },
+ /* 181 */{ 0x21, 3, stage::allStages[27], 0, 0x12, 0xFF, 0b000000000100000000000, 0.0000000, 1118.3201900, 4690.0000000, nullptr, nullptr },
+ /* 182 */{ 0x04, 7, stage::allStages[27], 0, 0x12, 0xFF, 0b000000000100000000000, -900.0000000, -50.0000000, 5950.0000000, nullptr, nullptr },
+ /* 183 */{ 0x03, 7, stage::allStages[27], 0, 0x12, 0xFF, 0b000000000100000000000, 930.0000000, -50.0000000, 5350.0000000, nullptr, nullptr },
+ /* 184 */{ 0x20, 8, stage::allStages[27], 5, 0x12, 0xFF, 0b100000000110000000000, 4350.0000000, 953.0000000, -4900.0000000, nullptr, nullptr },
+ /* 185 */{ 0x04, 7, stage::allStages[27], 9, 0x12, 0xFF, 0b000000000100000000000, -5347.3071290, -50.0000000, -6500.8867190, nullptr, nullptr },
+ /* 186 */{ 0x0A, 5, stage::allStages[27], 9, 0x12, 0xFF, 0b000000100100000000000, -1818.3217770, 0.0000000, -7562.9838870, nullptr, nullptr },
+ /* 187 */{ 0xF6, 2, stage::allStages[27], 11, 0x12, 0x12, 0b100000100100000000000, -4350.0000000, 1050.0000000, -8560.5742190, nullptr, nullptr },
+ /* 188 */{ 0x06, 7, stage::allStages[51], 2, 0x12, 0xFF, 0b110000000100000000010, -6233.2583010, -1800.0000000, -9865.0205080, nullptr, nullptr },
+ /* 189 */{ 0x06, 7, stage::allStages[38], 3, 0x12, 0xFF, 0b100000000100000000010, -810.7105710, -300.0000000, -2101.0502930, nullptr, nullptr },
+ /* 190 */{ 0x21, 3, stage::allStages[30], 0, 0x12, 0xFF, 0b000000000100000000000, 0.0000000, 0.0000000, -7900.0000000, nullptr, nullptr },
+ /* 191 */{ 0x0D, 5, stage::allStages[54], 3, 0x12, 0xFF, 0b110100000000000000000, -15394.4238280, 2300.0000000, 2483.9230960, nullptr, nullptr },
+ /* 192 */{ 0x06, 7, stage::allStages[54], 3, 0x12, 0xFF, 0b000000000000100000000, -6840.3515620, 2000.0000000, 6329.0605470, nullptr, nullptr },
+ /* 193 */{ 0x20, 8, stage::allStages[9], 0, 0x12, 0xFF, 0b110001000000000000000, 2500.0000000, 56.2500000, 368.7500000, nullptr, nullptr },
+ /* 194 */{ 0x10, 5, stage::allStages[9], 1, 0x12, 0xFF, 0b000001000000000000000, -12.5000000, 1100.0000000, 8362.5000000, nullptr, nullptr },
+ /* 195 */{ 0x04, 7, stage::allStages[9], 1, 0x12, 0xFF, 0b000001000000000000000, 5795.0000000, 2505.0000000, 4210.0000000, nullptr, nullptr },
+ /* 196 */{ 0x23, 2, stage::allStages[9], 1, 0x12, 0x12, 0b000001000000000000000, 6925.0000000, 2325.0000000, 3400.0000000, nullptr, nullptr },
+ /* 197 */{ 0x20, 8, stage::allStages[9], 3, 0x12, 0xFF, 0b100001000000100000000, -1737.5000000, 4500.0000000, 5812.5000000, nullptr, nullptr },
+ /* 198 */{ 0x24, 2, stage::allStages[9], 4, 0x12, 0x12, 0b100001000000100000000, -3450.0000000, 4450.0000000, -5510.0000000, nullptr, nullptr },
+ /* 199 */{ 0x05, 7, stage::allStages[9], 5, 0x12, 0xFF, 0b100001000000100000000, -30.0000000, 5750.0000000, -1515.0000000, nullptr, nullptr },
+ /* 200 */{ 0x20, 8, stage::allStages[9], 7, 0x12, 0xFF, 0b100001000000100000000, 5319.0000000, 7550.0000000, 8592.7500000, nullptr, nullptr },
+ /* 201 */{ 0x05, 7, stage::allStages[9], 7, 0x12, 0xFF, 0b100001000000100000000, 5300.0000000, 8100.0000000, -800.0000000, nullptr, nullptr },
+ /* 202 */{ 0x46, 0, stage::allStages[11], 51, 0x12, 0x12, 0b100001000000100100000, 0.0000000, -350.0000000, -2400.0000000, nullptr, nullptr },
+ /* 203 */{ 0x04, 7, stage::allStages[9], 5, 0x12, 0xFF, 0b100001000010100000000, 1195.0000000, 7400.0000000, 2350.0000000, nullptr, nullptr },
+ /* 204 */{ 0x04, 7, stage::allStages[9], 6, 0x12, 0xFF, 0b100001000010100000000, 6135.0000000, 8000.0000000, 0.0000000, nullptr, nullptr },
+ /* 205 */{ 0x26, 2, stage::allStages[9], 6, 0x12, 0x12, 0b100001000010100000000, 5350.0000000, 7400.0000000, 0.0000000, nullptr, nullptr },
+ /* 206 */{ 0x21, 3, stage::allStages[9], 4, 0x13, 0xFF, 0b100001000000110000000, -8740.0000000, 5100.0000000, -4515.0000000, nullptr, nullptr },
+ /* 207 */{ 0x04, 7, stage::allStages[9], 3, 0x12, 0xFF, 0b100001000000100000000, 0.0000000, 4850.0000000, 9200.0000000, nullptr, nullptr },
+ /* 208 */{ 0x21, 3, stage::allStages[9], 3, 0x13, 0xFF, 0b100001000000110000000, 1740.0000000, 4500.0000000, 5815.0000000, nullptr, nullptr },
+ /* 209 */{ 0x21, 3, stage::allStages[54], 2, 0x13, 0xFF, 0b100001000000010000000, 606.7956540, 1005.0000000, 8005.3901370, nullptr, nullptr },
+ /* 210 */{ 0x04, 7, stage::allStages[53], 4, 0x13, 0xFF, 0b000000000000000000000, 6500.0000000, 426.0000000, -977.0000000, nullptr, nullptr },
+ /* 211 */{ 0x21, 3, stage::allStages[56], 0, 0x13, 0xFF, 0b000000000000010000000, 31257.5957030, 900.0000000, -16115.4990230, nullptr, nullptr },
+ /* 212 */{ 0x06, 7, stage::allStages[56], 3, 0x13, 0xFF, 0b000000000000010000000, -10245.4765620, -4400.0000000, 42817.0467500, nullptr, nullptr },
+ /* 213 */{ 0x06, 7, stage::allStages[57], 8, 0x13, 0xFF, 0b000000000000010000000, -79819.4140620, -1301.2399900, 22400.6718750, nullptr, nullptr },
+ /* 214 */{ 0x06, 7, stage::allStages[56], 13, 0x13, 0xFF, 0b100000000010010000000, -93284.5703120, -5000.0000000, 18235.7246090, nullptr, nullptr },
+ /* 215 */{ 0x21, 3, stage::allStages[45], 5, 0x13, 0xFF, 0b100000100000010000000, -21012.1542970, 1350.0000000, -20630.3222660, nullptr, nullptr },
+ /* 216 */{ 0x06, 7, stage::allStages[59], 0, 0x13, 0xFF, 0b000000000000010000000, 16263.9707030, 989.6500240, 60708.4648440, nullptr, nullptr },
+ /* 217 */{ 0x18, 5, stage::allStages[12], 0, 0x14, 0xFF, 0b101000000010000000000, -1170.0834960, -755.0000000, 6670.0000000, nullptr, nullptr },
+ /* 218 */{ 0x04, 7, stage::allStages[12], 0, 0x14, 0xFF, 0b101000000010000000000, 1170.0000000, -755.0000000, 6670.0000000, nullptr, nullptr },
+ /* 219 */{ 0x20, 8, stage::allStages[12], 10, 0x15, 0xFF, 0b100000000010100000000, -14514.4443360, 0.0000000, -12000.8310550, nullptr, nullptr },
+ /* 220 */{ 0x23, 2, stage::allStages[12], 5, 0x14, 0x14, 0b101000000010100000000, 17665.1347660, 0.0000000, -11924.1035160, nullptr, nullptr },
+ /* 221 */{ 0x03, 7, stage::allStages[12], 7, 0x14, 0xFF, 0b101000000010100000000, 15824.6093750, -110.0000000, -9750.6855470, nullptr, nullptr },
+ /* 222 */{ 0x04, 7, stage::allStages[12], 7, 0x14, 0xFF, 0b101000000010100000000, 17550.0000000, 1500.0000000, -7200.0000000, nullptr, nullptr },
+ /* 223 */{ 0x05, 7, stage::allStages[12], 7, 0x14, 0xFF, 0b101000000010100000000, 13470.0000000, 1500.0000000, -7925.0000000, nullptr, nullptr },
+ /* 224 */{ 0x47, 0, stage::allStages[14], 51, 0x14, 0x14, 0b101000000010100000000, -0.3629600, 600.0000000, 2279.7690430, nullptr, nullptr },
+ /* 225 */{ 0x24, 2, stage::allStages[12], 4, 0x15, 0x15, 0b101000000001100000000, 10800.0000000, -1775.0000000, -11850.0000000, nullptr, nullptr },
+ /* 226 */{ 0x0F, 5, stage::allStages[12], 10, 0x15, 0xFF, 0b100000000001100000000, -11099.1240230, -1500.0000000, -15658.8515620, nullptr, nullptr },
+ /* 227 */{ 0x04, 7, stage::allStages[12], 10, 0x15, 0xFF, 0b100000000001100000000, -13458.7949220, 0.0000000, -13410.5566410, nullptr, nullptr },
+ /* 228 */{ 0x0B, 5, stage::allStages[12], 10, 0x15, 0xFF, 0b100000000001100000000, -10742.9599610, 0.0000000, -15156.7197270, nullptr, nullptr },
+ /* 229 */{ 0x03, 7, stage::allStages[12], 11, 0x15, 0xFF, 0b100000000001100000000, -15654.8398440, 2840.2299800, -18906.7890620, nullptr, nullptr },
+ /* 230 */{ 0x0F, 5, stage::allStages[12], 11, 0x15, 0xFF, 0b100000000001100000000, -12630.1699220, 2430.8999020, -19611.4316410, nullptr, nullptr },
+ /* 231 */{ 0x21, 3, stage::allStages[12], 11, 0x15, 0xFF, 0b100000000001100000000, -14567.1093750, 2281.0000000, -16989.0351560, nullptr, nullptr },
+ /* 232 */{ 0x04, 7, stage::allStages[12], 12, 0x15, 0xFF, 0b100000000001100000000, -15782.7958980, 2980.0000000, -11466.6982420, nullptr, nullptr },
+ /* 233 */{ 0x05, 7, stage::allStages[12], 12, 0x15, 0xFF, 0b100000000001100000000, -14270.5380860, 1982.1999510, -7411.9101560, nullptr, nullptr },
+ /* 234 */{ 0x0A, 5, stage::allStages[12], 12, 0x15, 0xFF, 0b100000000001100000000, -12592.9677730, 2400.0000000, -13712.7675780, nullptr, nullptr },
+ /* 235 */{ 0x21, 3, stage::allStages[12], 12, 0x15, 0xFF, 0b100000000001100000000, -11494.3183590, 3000.0000000, -9888.6738280, nullptr, nullptr },
+ /* 236 */{ 0x04, 7, stage::allStages[12], 13, 0x15, 0xFF, 0b100000000001100000000, 75.2376170, 4500.0000000, -10853.4550780, nullptr, nullptr },
+ /* 237 */{ 0x05, 7, stage::allStages[12], 13, 0x15, 0xFF, 0b100000000001100000000, 4010.3149410, 4500.0000000, -12451.9033200, nullptr, nullptr },
+ /* 238 */{ 0x26, 2, stage::allStages[12], 2, 0x15, 0x15, 0b100000000001100000000, -1090.9830320, 4500.0000000, -12411.7617190, nullptr, nullptr },
+ /* 239 */{ 0x04, 7, stage::allStages[12], 2, 0x15, 0xFF, 0b100000000001100000000, 11.8030090, 3000.0000000, -13501.7851560, nullptr, nullptr },
+ /* 240 */{ 0x05, 7, stage::allStages[12], 14, 0x15, 0xFF, 0b100000000001100000000, 0.0000000, 894.4799800, -23853.0000000, nullptr, nullptr },
+ /* 241 */{ 0x21, 3, stage::allStages[56], 3, 0x15, 0xFF, 0b000000000001000000000, -22100.0000000, -7176.0297850, 52140.0000000, nullptr, nullptr },
+ /* 242 */{ 0x06, 7, stage::allStages[52], 1, 0x15, 0xFF, 0b000000000001000000000, -2816.4138180, 1305.0787350, -1395.7875980, nullptr, nullptr },
+ /* 243 */{ 0x06, 7, stage::allStages[52], 1, 0x15, 0xFF, 0b000000000001000000000, 2798.9057620, 1322.1817720, -987.1356810, nullptr, nullptr },
+ /* 244 */{ 0x06, 7, stage::allStages[57], 16, 0x15, 0xFF, 0b000000000001000000000, -57374.0820310, -9100.0000000, 29237.9062500, nullptr, nullptr },
+ /* 245 */{ 0x20, 8, stage::allStages[15], 1, 0x15, 0xFF, 0b000000000000000000000, -3950.0000000, -1071.0000000, 1375.0000000, nullptr, nullptr },
+ /* 246 */{ 0x20, 8, stage::allStages[15], 2, 0x15, 0xFF, 0b000000000010000100000, -3950.0000000, -1200.0000000, -5075.0000000, nullptr, nullptr },
+ /* 247 */{ 0x24, 2, stage::allStages[15], 2, 0x15, 0x15, 0b000000000010000100000, -2700.0000000, -1196.0000000, -1661.0000000, nullptr, nullptr },
+ /* 248 */{ 0x06, 7, stage::allStages[15], 2, 0x15, 0xFF, 0b000000000001000100000, -2400.0000000, -21.2500000, -1550.0000000, nullptr, nullptr },
+ /* 249 */{ 0x21, 3, stage::allStages[15], 1, 0x15, 0xFF, 0b000000000010000000000, -6850.0000000, -771.2500000, 3200.0000000, nullptr, nullptr },
+ /* 250 */{ 0x05, 7, stage::allStages[15], 4, 0x15, 0xFF, 0b000000000010000000000, 3250.0000000, -696.2500000, 1235.0000000, nullptr, nullptr },
+ /* 251 */{ 0x20, 8, stage::allStages[15], 4, 0x15, 0xFF, 0b000000000010000000000, 4650.0000000, -696.2500000, 1235.0000000, nullptr, nullptr },
+ /* 252 */{ 0x05, 7, stage::allStages[15], 5, 0x15, 0xFF, 0b000000000001000100000, 5700.0000000, 3.7500000, -4350.0000000, nullptr, nullptr },
+ /* 253 */{ 0x05, 7, stage::allStages[15], 5, 0x15, 0xFF, 0b000000000001000100000, 2200.0000000, 3.7500000, -5100.0000000, nullptr, nullptr },
+ /* 254 */{ 0x23, 2, stage::allStages[15], 5, 0x15, 0x15, 0b000000000001000100000, 2300.0000000, -396.2500000, -3300.0000000, nullptr, nullptr },
+ /* 255 */{ 0x20, 8, stage::allStages[15], 5, 0x15, 0xFF, 0b000000000001000100000, 5600.0000000, -296.2500000, -3300.0000000, nullptr, nullptr },
+ /* 256 */{ 0x21, 3, stage::allStages[15], 4, 0x15, 0xFF, 0b000000000001000000000, 5352.5000000, -171.2500000, 3500.0000000, nullptr, nullptr },
/* 257 */{ 0x05, 7, stage::allStages[15], 4, 0x15, 0xFF, 0b000000000001000000000, 2547.5000000, -171.2500000, 3500.0000000, nullptr, nullptr },
/* 258 */{0x20, 8, stage::allStages[15], 7, 0xFF, 0xFF, 0b000000000001000000000, 1500.0000000, 128.7500000, 6250.0000000, nullptr, nullptr}, //PoT Central First Room Chest
/* 259 */{0x26, 2, stage::allStages[15], 11, 0xFF, 0xFF, 0b000000000001000100000, 0.0000000, 3130.0000000, -3600.0000000, nullptr, nullptr}, //PoT Big Key Chest
@@ -316,25 +316,25 @@ namespace mod::item
/* 306 */{0x21, 3, stage::allStages[41], 0, 0x2, 0xFF, 0b001000000000000000000, -4358.0000000, 15307.0000000, -19476.0000000, nullptr, nullptr}, //Herding Goats Heart Piece
/* 307 */{0x22, 3, stage::allStages[4], 50, 0x4, 0xFF, 0b111111000000000000000, 203.0000000, 0.0000000, 830.0000000, nullptr, nullptr}, //Fyrus Heart Container
/* 308 */{0x22, 3, stage::allStages[1], 50, 0x7, 0xFF, 0b111111010010001000000, -915.0000000, -23960.0000000, 8916.0000000, nullptr, nullptr}, //Morpheel Heart Container
- /* 309 */{ 0x22, 3, stage::allStages[25], 50, 0x10, 0xFF, 0b111111010010101000000, 85.0000000, 1799.0000000, -1264.0000000, nullptr, nullptr },
- /* 310 */{ 0x22, 3, stage::allStages[28], 50, 0x12, 0xFF, 0b111111010110101000000, 279.0000000, 43.0000000, -865.0000000, nullptr, nullptr },
- /* 311 */{ 0x22, 3, stage::allStages[10], 50, 0x13, 0xFF, 0b111111010110111000000, 900.0000000, 0.0000000, 0.0000000, nullptr, nullptr },
+ /* 309 */{ 0x22, 3, stage::allStages[25], 50, 0x10, 0xFF, 0b111111010010101000000, 85.0000000, 1799.0000000, -1264.0000000, nullptr, nullptr },
+ /* 310 */{ 0x22, 3, stage::allStages[28], 50, 0x12, 0xFF, 0b111111010110101000000, 279.0000000, 43.0000000, -865.0000000, nullptr, nullptr },
+ /* 311 */{ 0x22, 3, stage::allStages[10], 50, 0x13, 0xFF, 0b111111010110111000000, 900.0000000, 0.0000000, 0.0000000, nullptr, nullptr },
/* 312 */{ 0x22, 3, stage::allStages[13], 50, 0x15, 0xFF, 0b111111010101111000000, 317.0000000, 0.0000000, 764.0000000, nullptr, nullptr },
/* 313 */{0x22, 3, stage::allStages[16], 10, 0xFF, 0xFF, 0b111111010101111000000, -3.0000000, 2525.0000000, -14603.0000000, nullptr, nullptr}, //Zant Heart Container
/* 314 */{0x31, 1, stage::allStages[48], 0, 0x5, 0x5, 0b111111100000000000000, 21450.962891, 500.000000, 305.869934, nullptr, nullptr}, //Zora Armor
/* 315 */{ 0x30, 12, stage::allStages[73], 0, 0x8, 0xFF, 0b111111100000000000000, 1557.0000000, -200.0000000, 3491.0000000, nullptr, nullptr }, //Magic Armor
/* 316 */{0x4F, 1, stage::allStages[52], 0, 0x5, 0xFF, 0b111111110000000000000, -77679.9375000, -18765.0000000, 40764.0000000, nullptr, nullptr}, //Giant Bomb Bag
- /* 317 */{ 0x3D, 0, stage::allStages[48], 0, 0x10, 0x10, 0b111111010010101000000, 21413.962891, 500.681793, -368.516510, nullptr, nullptr },
+ /* 317 */{ 0x3D, 0, stage::allStages[48], 0, 0x10, 0x10, 0b111111010010101000000, 21413.962891, 500.681793, -368.516510, nullptr, nullptr },
/* 318 */{ 0x3E, 12, stage::allStages[68], 3, 0x4, 0x12, 0b111111000000000000000, -500.0000000, 320.0000000, -695.0000000, nullptr, nullptr }, //Hawkeye
/* 319 */{0x51, 0, stage::allStages[50], 0, 0x5, 0xFF, 0b111111010000000000000, 44.0000000, -3854.0000000, -2626.0000000, nullptr, nullptr}, //Goron Bomb Bag
/* 320 */{0x50, 0, stage::allStages[68], 1, 0x4, 0x4, 0b111111000000000000000, 800.0000000, 0.0000000, -300.0000000, nullptr, nullptr}, //Barnes Bomb Bag
/* 321 */{0x51, 0, stage::allStages[52], 0, 0x5, 0xFF, 0b111111100000000000000, -77680.0000000, -18765.0000000, 40764.0000000, nullptr, nullptr},//Iza Bomb Bag
- /* 322 */{ 0x90, 4, stage::allStages[52], 0, 0x8, 0x8, 0b111111010010001000000, -116117.015625, -15810.000000, 58812.617188, nullptr, nullptr }, //Auru's Memo
- /* 323 */{ 0x91, 4, stage::allStages[51], 0, 0x10, 0x10, 0b000000000000000000000, 31608.291016, -13330.000000, -11652.610352, nullptr, nullptr }, //Aeshi's Sketch
- /* 324 */{ 0x80, 4, stage::allStages[46], 0, 0xFF, 0x13, 0b000000000000000000000, -324.903625, 0.000000, 435.528595, nullptr, nullptr }, //Renardo's Letter
- /* 325 */{ 0x81, 4, stage::allStages[53], 5, 0xFF, 0x13, 0b000000000000000000000, 2694.345215, -1150.000000, 3105.746826, nullptr, nullptr }, //Invoice
- /* 326 */{ 0x82, 4, stage::allStages[57], 16, 0xFF, 0x13, 0b000000000000000000000, -51514.375000, -6269.229980, 31816.427734, nullptr, nullptr }, //Wooden Statue
- /* 327 */{ 0x83, 4, stage::allStages[63], 0, 0xFF, 0x13, 0b000000000000000000000, 2077.769775, 104.958275, -1301.828491, nullptr, nullptr }, //Ilia's Charm
+ /* 322 */{ 0x90, 4, stage::allStages[52], 0, 0x8, 0x8, 0b111111010010001000000, -116117.015625, -15810.000000, 58812.617188, nullptr, nullptr }, //Auru's Memo
+ /* 323 */{ 0x91, 4, stage::allStages[51], 0, 0x10, 0x10, 0b000000000000000000000, 31608.291016, -13330.000000, -11652.610352, nullptr, nullptr }, //Aeshi's Sketch
+ /* 324 */{ 0x80, 4, stage::allStages[46], 0, 0xFF, 0x13, 0b000000000000000000000, -324.903625, 0.000000, 435.528595, nullptr, nullptr }, //Renardo's Letter
+ /* 325 */{ 0x81, 4, stage::allStages[53], 5, 0xFF, 0x13, 0b000000000000000000000, 2694.345215, -1150.000000, 3105.746826, nullptr, nullptr }, //Invoice
+ /* 326 */{ 0x82, 4, stage::allStages[57], 16, 0xFF, 0x13, 0b000000000000000000000, -51514.375000, -6269.229980, 31816.427734, nullptr, nullptr }, //Wooden Statue
+ /* 327 */{ 0x83, 4, stage::allStages[63], 0, 0xFF, 0x13, 0b000000000000000000000, 2077.769775, 104.958275, -1301.828491, nullptr, nullptr }, //Ilia's Charm
/* 328 */{ 0x84, 4, stage::allStages[68], 0, 0xFF, 0x13, 0b000000000000000000000, 312.675079, 0.000000, -160.984177, nullptr, nullptr }, //Horse Call
/* 329 */{0x9d, 9, stage::allStages[45], 4, 0x1, 0xFF, 0b000000000000000000000, -13659.433594, -0.454284, -14367.083008, nullptr, nullptr}, //Coro Bottle
/* 330 */{0x75, 9, stage::allStages[73], 5, 0xFF, 0xFF, 0b000000000000000000000, 4250.363281, 134.492020, 1813.639648, nullptr, nullptr}, //Jovani Bottle
@@ -342,152 +342,152 @@ namespace mod::item
/* 332 */{0x2B, 12, stage::allStages[47], 3, 0x3, 0xFF, 0b001000000000000000000, -6545.0000000, -125.0000000, -2275.0000000, nullptr, nullptr}, //Wooden Shield (Goron)
/* 333 */{0x21, 3, stage::allStages[46], 0, 0x4, 0xFF, 0b000001000000000000000, -900.000000, 0.780221, 6600.000000, nullptr, nullptr}, //Bow Shooting Game Heart Piece
/* 334 */{0x21, 3, stage::allStages[53], 2, 0x5, 0xFF, 0b000000000000000000000, -4142.703125, 0.000000, -569.375000, nullptr, nullptr}, //Donation Heart Piece
- /* 335 */{ 0x21, 3, stage::allStages[62], 0, 0xFF, 0xFF, 0b101000000010000000000, -2678.128906, -167.094162, 2246.794186, nullptr, nullptr },
- /* 336 */{ 0x21, 3, stage::allStages[56], 0, 0x8, 0xFF, 0b000000000000000000000, -25148.583984, -200.000000, 9814.881836, nullptr, nullptr },
- /* 337 */{ 0x21, 3, stage::allStages[61], 0, 0x8, 0xFF, 0b000000000000000000000, 3618.216797, 232.476608, 541.905518, nullptr, nullptr },
- /* 338 */{ 0x21, 3, stage::allStages[55], 1, 0x8, 0xFF, 0b000000000000000000000, 4708.924805, 260.000000, -3120.967529, nullptr, nullptr },
- /* 339 */{ 0x23, 2, stage::allStages[27], 1, 0x11, 0x11, 0b000000000000000000000, 293.920288, 0.000000, -337.167480, nullptr, nullptr }, // Yeta Map
- /* 340 */{ 0x21, 3, stage::allStages[51], 1, 0x12, 0xFF, 0b000000000000000000000, -71795.539062, -54450.000000, 56396.738281, nullptr, nullptr },
+ /* 335 */{ 0x21, 3, stage::allStages[62], 0, 0xFF, 0xFF, 0b101000000010000000000, -2678.128906, -167.094162, 2246.794186, nullptr, nullptr },
+ /* 336 */{ 0x21, 3, stage::allStages[56], 0, 0x8, 0xFF, 0b000000000000000000000, -25148.583984, -200.000000, 9814.881836, nullptr, nullptr },
+ /* 337 */{ 0x21, 3, stage::allStages[61], 0, 0x8, 0xFF, 0b000000000000000000000, 3618.216797, 232.476608, 541.905518, nullptr, nullptr },
+ /* 338 */{ 0x21, 3, stage::allStages[55], 1, 0x9, 0xFF, 0b000000000000000000000, 4708.924805, 260.000000, -3120.967529, nullptr, nullptr }, //camp HP
+ /* 339 */{ 0x23, 2, stage::allStages[27], 1, 0x11, 0x11, 0b000000000000000000000, 293.920288, 0.000000, -337.167480, nullptr, nullptr }, // Yeta Map
+ /* 340 */{ 0x21, 3, stage::allStages[51], 1, 0x12, 0xFF, 0b000000000000000000000, -71795.539062, -54450.000000, 56396.738281, nullptr, nullptr },
/* 341 */{ 0x21, 3, stage::allStages[63], 0, 0x13, 0xFF, 0b000000000000000000010, 2200.000000, 104.574730, -1200.000000, nullptr, nullptr },
/* 342 */{0x20, 8, stage::allStages[20], 13, 0xFF, 0xFF, 0b000000000000000000000, -7625.000000, 52.000000, -5525.000000, nullptr, nullptr}, //
/* 343 */{0x20, 8, stage::allStages[6], 7, 0x1, 0xFF, 0b000000000000000000000, -5703.254883, 4372.640137, 11664.798828, nullptr, nullptr},
//Ooccoo
- /* 344 */{ 0x33, 2, stage::allStages[6], 1, 0x1, 0x1, 0b000000000000000000000, 3775.943604, 3167.790039, 5428.488281, nullptr, nullptr },
- /* 345 */{ 0x33, 2, stage::allStages[3], 14, 0x3, 0x3, 0b000000000000000000000, -14154.718750, 190.286682, 2185.947510, nullptr, nullptr },
- /* 346 */{ 0x33, 2, stage::allStages[0], 2, 0x6, 0x6, 0b000000000000000000000, 2045.683228, 1500.000000, 1642.919189, nullptr, nullptr },
- /* 347 */{ 0x33, 2, stage::allStages[24], 10, 0x9, 0x9, 0b000000000000000000000, -667.577815, -2100.000000, 4029.893311, nullptr, nullptr },
- /* 348 */{ 0x33, 2, stage::allStages[27], 2, 0x11, 0x11, 0b000000000000000000000, 3742.823975, 0.000000, 1621.097900, nullptr, nullptr },
- /* 349 */{ 0x33, 2, stage::allStages[9], 0, 0x12, 0x12, 0b000000000000000000000, -28.417549, 725.000000, 3091.288574, nullptr, nullptr },
+ /* 344 */{ 0x33, 2, stage::allStages[6], 1, 0x1, 0x1, 0b000000000000000000000, 3775.943604, 3167.790039, 5428.488281, nullptr, nullptr },
+ /* 345 */{ 0x33, 2, stage::allStages[3], 14, 0x3, 0x3, 0b000000000000000000000, -14154.718750, 190.286682, 2185.947510, nullptr, nullptr },
+ /* 346 */{ 0x33, 2, stage::allStages[0], 2, 0x6, 0x6, 0b000000000000000000000, 2045.683228, 1500.000000, 1642.919189, nullptr, nullptr },
+ /* 347 */{ 0x33, 2, stage::allStages[24], 10, 0x9, 0x9, 0b000000000000000000000, -667.577815, -2100.000000, 4029.893311, nullptr, nullptr },
+ /* 348 */{ 0x33, 2, stage::allStages[27], 2, 0x11, 0x11, 0b000000000000000000000, 3742.823975, 0.000000, 1621.097900, nullptr, nullptr },
+ /* 349 */{ 0x33, 2, stage::allStages[9], 0, 0x12, 0x12, 0b000000000000000000000, -28.417549, 725.000000, 3091.288574, nullptr, nullptr },
/* 350 */{ 0x33, 2, stage::allStages[12], 16, 0x14, 0x14, 0b000000000000000000000, 6082.295898, 0.000000, 5896.656738, nullptr, nullptr },
//overworld keys
- /* 351 */{ 0xfe, 8, stage::allStages[45], 4, 0xFF, 0xFF, 0b000000000000000000000, -13022.520508, -3.070827, -14673.488281, nullptr, nullptr },
- /* 352 */{ 0xf3, 4, stage::allStages[58], 13, 0x5, 0xFF, 0b000000000000000000000, -93334.218750, -5725.979980, 44504.023438, nullptr, nullptr },
+ /* 351 */{ 0xfe, 8, stage::allStages[45], 4, 0xFF, 0xFF, 0b000000000000000000000, -13022.520508, -3.070827, -14673.488281, nullptr, nullptr },
+ /* 352 */{ 0xf3, 4, stage::allStages[58], 13, 0x5, 0xFF, 0b000000000000000000000, -93334.218750, -5725.979980, 44504.023438, nullptr, nullptr },
/* 353 */{ 0x20, 8, stage::allStages[55], 1, 0x9, 0xFF, 0b000000000000000000000, 4087.104248, 260.000000, -3795.968262, nullptr, nullptr },
//goron mines key shards
- /* 354 */{ 0xf9, 2, stage::allStages[3], 14, 0x3, 0x3, 0b000000000000000000000, -15375.557617, -636.630005, 1595.673462, nullptr, nullptr },
- /* 355 */{ 0xfa, 2, stage::allStages[3], 17, 0x3, 0x3, 0b000000000000000000000, 13007.017578, 2924.530029, -17705.732422, nullptr, nullptr },
+ /* 354 */{ 0xf9, 2, stage::allStages[3], 14, 0x3, 0x3, 0b000000000000000000000, -15375.557617, -636.630005, 1595.673462, nullptr, nullptr },
+ /* 355 */{ 0xfa, 2, stage::allStages[3], 17, 0x3, 0x3, 0b000000000000000000000, 13007.017578, 2924.530029, -17705.732422, nullptr, nullptr },
/* 356 */{ 0xfd, 2, stage::allStages[3], 16, 0x4, 0x3, 0b000000000000000000000, 13055.647461, 2400.500000, -1660.316895, nullptr, nullptr },
//bugs
- /* 357 */{ 0xc0, 10, stage::allStages[56], 6, 0x2, 0xFF, 0b000000000000000000000, -50212.730469, -8840.560547, 86352.757812, nullptr, nullptr },
- /* 358 */{ 0xc1, 10, stage::allStages[56], 6, 0x2, 0xFF, 0b000100000010000000000, -38651.949219, -9189.901367, 73707.671875, nullptr, nullptr },
- /* 359 */{ 0xca, 10, stage::allStages[56], 3, 0x2, 0xFF, 0b000000000000000000000, -9730.929688, -7200.000000, 57526.199219, nullptr, nullptr },
- /* 360 */{ 0xcb, 10, stage::allStages[56], 3, 0x2, 0xFF, 0b000000000000000000000, 562.488159, -6092.589844, 61677.734375, nullptr, nullptr },
- /* 361 */{ 0xd4, 10, stage::allStages[48], 0, 0x2, 0xFF, 0b000000000000000000000, 17085.654297, 557.072510, -850.370605, nullptr, nullptr },
- /* 362 */{ 0xd5, 10, stage::allStages[68], 6, 0x2, 0xFF, 0b000000000000000000000, 205.938171, 17.797655, 4.593423, nullptr, nullptr },
- /* 363 */{ 0xc6, 10, stage::allStages[56], 0, 0x2, 0xFF, 0b000000000000000000000, 19503.787109, 662.713684, 13563.345703, nullptr, nullptr },
- /* 364 */{ 0xc7, 10, stage::allStages[56], 0, 0x2, 0xFF, 0b000000000000000000000, -10765.343750, 80.466759, -9151.101562, nullptr, nullptr },
- /* 365 */{ 0xc8, 10, stage::allStages[56], 0, 0x2, 0xFF, 0b000100000010000000000, 34607.441406, -260.000000, -14273.162109, nullptr, nullptr },
- /* 366 */{ 0xc9, 10, stage::allStages[56], 0, 0x2, 0xFF, 0b000100000010000000000, 37897.406250, -260.000000, -40525.894531, nullptr, nullptr },
- /* 367 */{ 0xcc, 10, stage::allStages[56], 13, 0x5, 0xFF, 0b000100000010000000000, -93754.703125, -5925.377441, 31642.708984, nullptr, nullptr },
- /* 368 */{ 0xcd, 10, stage::allStages[56], 13, 0x5, 0xFF, 0b000100000010000000000, -88147.609375, -6854.451660, 58998.777344, nullptr, nullptr },
- /* 369 */{ 0xc2, 10, stage::allStages[57], 8, 0x5, 0xFF, 0b000000000000000000000, -75074.406250, -384.115967, 16053.256836, nullptr, nullptr },
- /* 370 */{ 0xc3, 10, stage::allStages[57], 8, 0x5, 0xFF, 0b000100000010000000000, -78787.265625, -1472.352661, 2016.588013, nullptr, nullptr },
- /* 371 */{ 0xce, 10, stage::allStages[57], 16, 0x5, 0xFF, 0b000000000000000000000, -45085.273438, 6042.771484, 29910.453125, nullptr, nullptr },
- /* 372 */{ 0xcf, 10, stage::allStages[57], 16, 0x5, 0xFF, 0b000000000000000000000, -54377.070312, -5460.576660, 27647.970703, nullptr, nullptr },
- /* 373 */{ 0xc4, 10, stage::allStages[56], 10, 0x5, 0xFF, 0b000000000000000000000, -62781.214844, -1350.003052, -33241.687500, nullptr, nullptr },
- /* 374 */{ 0xc5, 10, stage::allStages[56], 10, 0x5, 0xFF, 0b000000000000000000000, -48976.765625, -677.295044, -50834.683594, nullptr, nullptr },
- /* 375 */{ 0xd2, 10, stage::allStages[50], 1, 0x5, 0xFF, 0b000000000000000000000, 3540.047363, -5150.441895, 15789.274414, nullptr, nullptr },
- /* 376 */{ 0xd3, 10, stage::allStages[61], 1, 0x5, 0xFF, 0b000000000000000000000, 6013.379395, 445.474884, -224.899765, nullptr, nullptr },
- /* 377 */{ 0xd6, 10, stage::allStages[59], 0, 0x9, 0xFF, 0b000000000000000000000, 28767.958984, 524.933899, 58604.546875, nullptr, nullptr },
- /* 378 */{ 0xd7, 10, stage::allStages[59], 0, 0x9, 0xFF, 0b000000000000000000000, 11790.147461, 340.034332, 55725.250000, nullptr, nullptr },
- /* 379 */{ 0xd0, 10, stage::allStages[54], 1, 0x12, 0xFF, 0b000000000000000000000, 1304.371826, 1005.000000, 7306.179688, nullptr, nullptr },
+ /* 357 */{ 0xc0, 10, stage::allStages[56], 6, 0x2, 0xFF, 0b000000000000000000000, -50212.730469, -8840.560547, 86352.757812, nullptr, nullptr },
+ /* 358 */{ 0xc1, 10, stage::allStages[56], 6, 0x2, 0xFF, 0b000100000010000000000, -38651.949219, -9189.901367, 73707.671875, nullptr, nullptr },
+ /* 359 */{ 0xca, 10, stage::allStages[56], 3, 0x2, 0xFF, 0b000000000000000000000, -9730.929688, -7200.000000, 57526.199219, nullptr, nullptr },
+ /* 360 */{ 0xcb, 10, stage::allStages[56], 3, 0x2, 0xFF, 0b000000000000000000000, 562.488159, -6092.589844, 61677.734375, nullptr, nullptr },
+ /* 361 */{ 0xd4, 10, stage::allStages[48], 0, 0x2, 0xFF, 0b000000000000000000000, 17085.654297, 557.072510, -850.370605, nullptr, nullptr },
+ /* 362 */{ 0xd5, 10, stage::allStages[68], 6, 0x2, 0xFF, 0b000000000000000000000, 205.938171, 17.797655, 4.593423, nullptr, nullptr },
+ /* 363 */{ 0xc6, 10, stage::allStages[56], 0, 0x2, 0xFF, 0b000000000000000000000, 19503.787109, 662.713684, 13563.345703, nullptr, nullptr },
+ /* 364 */{ 0xc7, 10, stage::allStages[56], 0, 0x2, 0xFF, 0b000000000000000000000, -10765.343750, 80.466759, -9151.101562, nullptr, nullptr },
+ /* 365 */{ 0xc8, 10, stage::allStages[56], 0, 0x2, 0xFF, 0b000100000010000000000, 34607.441406, -260.000000, -14273.162109, nullptr, nullptr },
+ /* 366 */{ 0xc9, 10, stage::allStages[56], 0, 0x2, 0xFF, 0b000100000010000000000, 37897.406250, -260.000000, -40525.894531, nullptr, nullptr },
+ /* 367 */{ 0xcc, 10, stage::allStages[56], 13, 0x5, 0xFF, 0b000100000010000000000, -93754.703125, -5925.377441, 31642.708984, nullptr, nullptr },
+ /* 368 */{ 0xcd, 10, stage::allStages[56], 13, 0x5, 0xFF, 0b000100000010000000000, -88147.609375, -6854.451660, 58998.777344, nullptr, nullptr },
+ /* 369 */{ 0xc2, 10, stage::allStages[57], 8, 0x5, 0xFF, 0b000000000000000000000, -75074.406250, -384.115967, 16053.256836, nullptr, nullptr },
+ /* 370 */{ 0xc3, 10, stage::allStages[57], 8, 0x5, 0xFF, 0b000100000010000000000, -78787.265625, -1472.352661, 2016.588013, nullptr, nullptr },
+ /* 371 */{ 0xce, 10, stage::allStages[57], 16, 0x5, 0xFF, 0b000000000000000000000, -45085.273438, 6042.771484, 29910.453125, nullptr, nullptr },
+ /* 372 */{ 0xcf, 10, stage::allStages[57], 16, 0x5, 0xFF, 0b000000000000000000000, -54377.070312, -5460.576660, 27647.970703, nullptr, nullptr },
+ /* 373 */{ 0xc4, 10, stage::allStages[56], 10, 0x5, 0xFF, 0b000000000000000000000, -62781.214844, -1350.003052, -33241.687500, nullptr, nullptr },
+ /* 374 */{ 0xc5, 10, stage::allStages[56], 10, 0x5, 0xFF, 0b000000000000000000000, -48976.765625, -677.295044, -50834.683594, nullptr, nullptr },
+ /* 375 */{ 0xd2, 10, stage::allStages[50], 1, 0x5, 0xFF, 0b000000000000000000000, 3540.047363, -5150.441895, 15789.274414, nullptr, nullptr },
+ /* 376 */{ 0xd3, 10, stage::allStages[61], 1, 0x5, 0xFF, 0b000000000000000000000, 6013.379395, 445.474884, -224.899765, nullptr, nullptr },
+ /* 377 */{ 0xd6, 10, stage::allStages[59], 0, 0x9, 0xFF, 0b000000000000000000000, 28767.958984, 524.933899, 58604.546875, nullptr, nullptr },
+ /* 378 */{ 0xd7, 10, stage::allStages[59], 0, 0x9, 0xFF, 0b000000000000000000000, 11790.147461, 340.034332, 55725.250000, nullptr, nullptr },
+ /* 379 */{ 0xd0, 10, stage::allStages[54], 1, 0x12, 0xFF, 0b000000000000000000000, 1304.371826, 1005.000000, 7306.179688, nullptr, nullptr },
/* 380 */{ 0xd1, 10, stage::allStages[54], 2, 0x12, 0xFF, 0b000100000010000000000, 521.038208, 1000.000000, 5867.415527, nullptr, nullptr },
//bug rewards
- /* 381 */{ 0x35, 1, stage::allStages[73], 3, 0xFF, 0x5, 0b000000000000000000000, -123.609940, 40.000000, 305.168640, nullptr, nullptr },
- /* 382 */{ 0x06, 7, stage::allStages[73], 3, 0xFF, 0xFF, 0b000000000000000000000, -123.609940, 40.000000, 305.168640, nullptr, nullptr },
- /* 383 */{ 0x05, 7, stage::allStages[73], 3, 0xFF, 0xFF, 0b000000000000000000000, -123.609940, 40.000000, 305.168640, nullptr, nullptr },
- /* 384 */{ 0x06, 7, stage::allStages[73], 3, 0xFF, 0xFF, 0b000000000000000000000, -123.609940, 40.000000, 305.168640, nullptr, nullptr },
- /* 385 */{ 0x05, 7, stage::allStages[73], 3, 0xFF, 0xFF, 0b000000000000000000000, -123.609940, 40.000000, 305.168640, nullptr, nullptr },
- /* 386 */{ 0x06, 7, stage::allStages[73], 3, 0xFF, 0xFF, 0b000000000000000000000, -123.609940, 40.000000, 305.168640, nullptr, nullptr },
- /* 387 */{ 0x05, 7, stage::allStages[73], 3, 0xFF, 0xFF, 0b000000000000000000000, -123.609940, 40.000000, 305.168640, nullptr, nullptr },
- /* 388 */{ 0x06, 7, stage::allStages[73], 3, 0xFF, 0xFF, 0b000000000000000000000, -123.609940, 40.000000, 305.168640, nullptr, nullptr },
- /* 389 */{ 0x05, 7, stage::allStages[73], 3, 0xFF, 0xFF, 0b000000000000000000000, -123.609940, 40.000000, 305.168640, nullptr, nullptr },
- /* 390 */{ 0x06, 7, stage::allStages[73], 3, 0xFF, 0xFF, 0b000000000000000000000, -123.609940, 40.000000, 305.168640, nullptr, nullptr },
- /* 391 */{ 0x05, 7, stage::allStages[73], 3, 0xFF, 0xFF, 0b000000000000000000000, -123.609940, 40.000000, 305.168640, nullptr, nullptr },
- /* 392 */{ 0x06, 7, stage::allStages[73], 3, 0xFF, 0xFF, 0b000000000000000000000, -123.609940, 40.000000, 305.168640, nullptr, nullptr },
- /* 393 */{ 0x05, 7, stage::allStages[73], 3, 0xFF, 0xFF, 0b000000000000000000000, -123.609940, 40.000000, 305.168640, nullptr, nullptr },
- /* 394 */{ 0x06, 7, stage::allStages[73], 3, 0xFF, 0xFF, 0b000000000000000000000, -123.609940, 40.000000, 305.168640, nullptr, nullptr },
- /* 395 */{ 0x05, 7, stage::allStages[73], 3, 0xFF, 0xFF, 0b000000000000000000000, -123.609940, 40.000000, 305.168640, nullptr, nullptr },
- /* 396 */{ 0x06, 7, stage::allStages[73], 3, 0xFF, 0xFF, 0b000000000000000000000, -123.609940, 40.000000, 305.168640, nullptr, nullptr },
- /* 397 */{ 0x05, 7, stage::allStages[73], 3, 0xFF, 0xFF, 0b000000000000000000000, -123.609940, 40.000000, 305.168640, nullptr, nullptr },
- /* 398 */{ 0x06, 7, stage::allStages[73], 3, 0xFF, 0xFF, 0b000000000000000000000, -123.609940, 40.000000, 305.168640, nullptr, nullptr },
- /* 399 */{ 0x05, 7, stage::allStages[73], 3, 0xFF, 0xFF, 0b000000000000000000000, -123.609940, 40.000000, 305.168640, nullptr, nullptr },
- /* 400 */{ 0x06, 7, stage::allStages[73], 3, 0xFF, 0xFF, 0b000000000000000000000, -123.609940, 40.000000, 305.168640, nullptr, nullptr },
- /* 401 */{ 0x05, 7, stage::allStages[73], 3, 0xFF, 0xFF, 0b000000000000000000000, -123.609940, 40.000000, 305.168640, nullptr, nullptr },
- /* 402 */{ 0x06, 7, stage::allStages[73], 3, 0xFF, 0xFF, 0b000000000000000000000, -123.609940, 40.000000, 305.168640, nullptr, nullptr },
- /* 403 */{ 0x05, 7, stage::allStages[73], 3, 0xFF, 0xFF, 0b000000000000000000000, -123.609940, 40.000000, 305.168640, nullptr, nullptr },
+ /* 381 */{ 0x35, 1, stage::allStages[73], 3, 0xFF, 0x5, 0b000000000000000000000, -123.609940, 40.000000, 305.168640, nullptr, nullptr },
+ /* 382 */{ 0x06, 7, stage::allStages[73], 3, 0xFF, 0xFF, 0b000000000000000000000, -123.609940, 40.000000, 305.168640, nullptr, nullptr },
+ /* 383 */{ 0x05, 7, stage::allStages[73], 3, 0xFF, 0xFF, 0b000000000000000000000, -123.609940, 40.000000, 305.168640, nullptr, nullptr },
+ /* 384 */{ 0x06, 7, stage::allStages[73], 3, 0xFF, 0xFF, 0b000000000000000000000, -123.609940, 40.000000, 305.168640, nullptr, nullptr },
+ /* 385 */{ 0x05, 7, stage::allStages[73], 3, 0xFF, 0xFF, 0b000000000000000000000, -123.609940, 40.000000, 305.168640, nullptr, nullptr },
+ /* 386 */{ 0x06, 7, stage::allStages[73], 3, 0xFF, 0xFF, 0b000000000000000000000, -123.609940, 40.000000, 305.168640, nullptr, nullptr },
+ /* 387 */{ 0x05, 7, stage::allStages[73], 3, 0xFF, 0xFF, 0b000000000000000000000, -123.609940, 40.000000, 305.168640, nullptr, nullptr },
+ /* 388 */{ 0x06, 7, stage::allStages[73], 3, 0xFF, 0xFF, 0b000000000000000000000, -123.609940, 40.000000, 305.168640, nullptr, nullptr },
+ /* 389 */{ 0x05, 7, stage::allStages[73], 3, 0xFF, 0xFF, 0b000000000000000000000, -123.609940, 40.000000, 305.168640, nullptr, nullptr },
+ /* 390 */{ 0x06, 7, stage::allStages[73], 3, 0xFF, 0xFF, 0b000000000000000000000, -123.609940, 40.000000, 305.168640, nullptr, nullptr },
+ /* 391 */{ 0x05, 7, stage::allStages[73], 3, 0xFF, 0xFF, 0b000000000000000000000, -123.609940, 40.000000, 305.168640, nullptr, nullptr },
+ /* 392 */{ 0x06, 7, stage::allStages[73], 3, 0xFF, 0xFF, 0b000000000000000000000, -123.609940, 40.000000, 305.168640, nullptr, nullptr },
+ /* 393 */{ 0x05, 7, stage::allStages[73], 3, 0xFF, 0xFF, 0b000000000000000000000, -123.609940, 40.000000, 305.168640, nullptr, nullptr },
+ /* 394 */{ 0x06, 7, stage::allStages[73], 3, 0xFF, 0xFF, 0b000000000000000000000, -123.609940, 40.000000, 305.168640, nullptr, nullptr },
+ /* 395 */{ 0x05, 7, stage::allStages[73], 3, 0xFF, 0xFF, 0b000000000000000000000, -123.609940, 40.000000, 305.168640, nullptr, nullptr },
+ /* 396 */{ 0x06, 7, stage::allStages[73], 3, 0xFF, 0xFF, 0b000000000000000000000, -123.609940, 40.000000, 305.168640, nullptr, nullptr },
+ /* 397 */{ 0x05, 7, stage::allStages[73], 3, 0xFF, 0xFF, 0b000000000000000000000, -123.609940, 40.000000, 305.168640, nullptr, nullptr },
+ /* 398 */{ 0x06, 7, stage::allStages[73], 3, 0xFF, 0xFF, 0b000000000000000000000, -123.609940, 40.000000, 305.168640, nullptr, nullptr },
+ /* 399 */{ 0x05, 7, stage::allStages[73], 3, 0xFF, 0xFF, 0b000000000000000000000, -123.609940, 40.000000, 305.168640, nullptr, nullptr },
+ /* 400 */{ 0x06, 7, stage::allStages[73], 3, 0xFF, 0xFF, 0b000000000000000000000, -123.609940, 40.000000, 305.168640, nullptr, nullptr },
+ /* 401 */{ 0x05, 7, stage::allStages[73], 3, 0xFF, 0xFF, 0b000000000000000000000, -123.609940, 40.000000, 305.168640, nullptr, nullptr },
+ /* 402 */{ 0x06, 7, stage::allStages[73], 3, 0xFF, 0xFF, 0b000000000000000000000, -123.609940, 40.000000, 305.168640, nullptr, nullptr },
+ /* 403 */{ 0x05, 7, stage::allStages[73], 3, 0xFF, 0xFF, 0b000000000000000000000, -123.609940, 40.000000, 305.168640, nullptr, nullptr },
/* 404 */{ 0x36, 1, stage::allStages[73], 3, 0xFF, 0x12, 0b000000000000000000000, -123.609940, 40.000000, 305.168640, nullptr, nullptr },
//poes
- /*#1*/{ 0xe0, 11, stage::allStages[24], 2, 0x9, 0xFF, 0b000000000000000000010, 105.801384, -19.549999, -741.391968, nullptr, nullptr },
- /*#2*/{ 0xe0, 11, stage::allStages[24], 3, 0x9, 0xFF, 0b100000000010000000010, 3606.844482, 150.030182, -5323.249512, nullptr, nullptr },
- /*#3*/{ 0xe0, 11, stage::allStages[24], 5, 0x9, 0xFF, 0b000000000000000000010, 5712.277344, 1050.019775, 4526.544922, nullptr, nullptr },
- /*#4*/{ 0xe0, 11, stage::allStages[24], 8, 0x9, 0xFF, 0b000000000000000000010, -4197.771973, 1040.154663, 4983.674805, nullptr, nullptr },
- /*#5*/{ 0xe0, 11, stage::allStages[73], 5, 0x8, 0xFF, 0b000000000000000000010, 4529.513672, -75.000000, 2609.175049, nullptr, nullptr },
- /*#6*/{ 0xe0, 11, stage::allStages[31], 16, 0x10, 0xFF, 0b100000000000100000010, 126.849854, -20000.000000, -337.206903, nullptr, nullptr },
- /*#7*/{ 0xe0, 11, stage::allStages[31], 32, 0x13, 0xFF, 0b100000000100110000010, 231.875824, -40000.000000, -216.2944296, nullptr, nullptr },
- /*#8*/{ 0xe0, 11, stage::allStages[31], 43, 0x15, 0xFF, 0b100000000101110000010, -4560.734375, -53750.000000, -825.646851, nullptr, nullptr },
- /*#9*/{ 0xe0, 11, stage::allStages[12], 12, 0x15, 0xFF, 0b100000000001000000010, -12660.987305, 1982.199951, -7632.476074, nullptr, nullptr },
- /*#10*/{ 0xe0, 11, stage::allStages[12], 13, 0x15, 0xFF, 0b100000000001000000010, 3916.892090, 4496.779785, -12149.609375, nullptr, nullptr },
- /*#11*/{ 0xe0, 11, stage::allStages[47], 0, 0x8, 0xFF, 0b000000000000000000010, -2502.529785, -1533.660522, 18041.601562, nullptr, nullptr },
- /*#12*/{ 0xe0, 11, stage::allStages[45], 11, 0x8, 0xFF, 0b000000000000000000010, -25786.427734, 300.000000, -20456.810547, nullptr, nullptr },
- /*#13*/{ 0xe0, 11, stage::allStages[59], 0, 0x9, 0xFF, 0b000000000000000000010, 66240.039062, 143.258804, 56904.339844, nullptr, nullptr },
- /*#14*/{ 0xe0, 11, stage::allStages[59], 0, 0x9, 0xFF, 0b100000000010000000010, -816.907959, 2496.226562, 57933.289062, nullptr, nullptr },
- /*#15*/{ 0xe0, 11, stage::allStages[59], 0, 0x9, 0xFF, 0b100000000010000000010, 26747.324219, -46.507732, 26175.406250, nullptr, nullptr },
- /*#16*/{ 0xe0, 11, stage::allStages[37], 2, 0x9, 0xFF, 0b100000000010000000010, -1026.819824, 1.152117, -161.420013, nullptr, nullptr },
- /*#17*/{ 0xe0, 11, stage::allStages[37], 2, 0x9, 0xFF, 0b100000000010000000010, -286.849121, 3.514773, -895.548218, nullptr, nullptr },
- /*#18*/{ 0xe0, 11, stage::allStages[59], 0, 0x9, 0xFF, 0b100000000010000000010, -2024.554443, 16.013172, 11583.281250, nullptr, nullptr },
- /*#19*/{ 0xe0, 11, stage::allStages[55], 1, 0x9, 0xFF, 0b000000000000000000010, 1812.931274, 0.000000, 1155.415161, nullptr, nullptr },
- /*#20*/{ 0xe0, 11, stage::allStages[55], 3, 0x9, 0xFF, 0b000000000000000000010, 283.265228, 840.000000, -12366.407227, nullptr, nullptr },
- /*#21*/{ 0xe0, 11, stage::allStages[48], 0, 0x8, 0xFF, 0b000000000000000000010, 12836.060547, 100.000000, 178.608246, nullptr, nullptr },
- /*#22*/{ 0xe0, 11, stage::allStages[48], 0, 0x8, 0xFF, 0b000000000000000000010, 14444.615234, 256.835815, -527.642578, nullptr, nullptr },
- /*#24*/{ 0xe0, 11, stage::allStages[63], 0, 0x13, 0xFF, 0b100000000000010000010, 1683.054077, 480.000000, -6715.406250, nullptr, nullptr },
- /*#24*/{ 0xe0, 11, stage::allStages[57], 8, 0x8, 0xFF, 0b000000000000000000010, -81042.460938, -1650.079956, 21720.513672, nullptr, nullptr },
- /*#25*/{ 0xe0, 11, stage::allStages[57], 17, 0x8, 0xFF, 0b000000000000000000010, -42291.773438, -1400.000000, 10844.620117, nullptr, nullptr },
- /*#26*/{ 0xe0, 11, stage::allStages[56], 3, 0x8, 0xFF, 0b000000000000000000010, -10858.849609, -5700.000000, 55509.773438, nullptr, nullptr },
- /*#27*/{ 0xe0, 11, stage::allStages[32], 0, 0x8, 0xFF, 0b110000000000000000010, 4567.875977, 5027.688477, -5207.911621, nullptr, nullptr },
- /*#28*/{ 0xe0, 11, stage::allStages[56], 6, 0x8, 0xFF, 0b000000000000000000010, -45153.691406, -8909.261719, 74205.156250, nullptr, nullptr },
- /*#29*/{ 0xe0, 11, stage::allStages[56], 10, 0x8, 0xFF, 0b110000000000000000010, -45192.148438, -2474.139893, -32984.613281, nullptr, nullptr },
- /*#30*/{ 0xe0, 11, stage::allStages[35], 0, 0x8, 0xFF, 0b110000000000000000010, 269.485474, 22.380699, -981.643372, nullptr, nullptr },
- /*#31*/{ 0xe0, 11, stage::allStages[35], 0, 0x8, 0xFF, 0b110000000000000000010, -236.254684, 150.000000, -1036.175781, nullptr, nullptr },
- /*#32*/{ 0xe0, 11, stage::allStages[57], 16, 0x8, 0xFF, 0b000000000000000000010, -53146.578125, -5153.850098, 25666.673828, nullptr, nullptr },
- /*#33*/{ 0xe0, 11, stage::allStages[56], 13, 0x8, 0xFF, 0b100000001010000000010, -81177.609375, -6000.000000, 65960.148438, nullptr, nullptr },
- /*#34*/{ 0xe0, 11, stage::allStages[46], 0, 0x8, 0xFF, 0b000000000000000000010, 3372.341553, 2300.000000, -3018.808594, nullptr, nullptr },
- /*#35*/{ 0xe0, 11, stage::allStages[46], 0, 0x8, 0xFF, 0b000000000000000000010, -1487.586548, 3848.365234, -5915.137207, nullptr, nullptr },
- /*#36*/{ 0xe0, 11, stage::allStages[52], 0, 0x8, 0xFF, 0b000000000000000000010, -74531.953125, -18336.878906, 47025.640625, nullptr, nullptr },
- /*#37*/{ 0xe0, 11, stage::allStages[52], 0, 0x8, 0xFF, 0b000000000000000000010, -96335.820312, -17510.320312, 62149.574219, nullptr, nullptr },
- /*#38*/{ 0xe0, 11, stage::allStages[52], 0, 0x8, 0xFF, 0b000000000000000000010, -115949.156250, -15840.000000, 59894.671875, nullptr, nullptr },
- /*#39*/{ 0xe0, 11, stage::allStages[52], 0, 0x8, 0xFF, 0b101000000000000000010, -104251.976562, -18469.791016, 42262.726562, nullptr, nullptr },
- /*#40*/{ 0xe0, 11, stage::allStages[52], 0, 0x8, 0xFF, 0b101000000000000000010, -115114.968750, -14096.000000, 25330.574219, nullptr, nullptr },
- /*#41*/{ 0xe0, 11, stage::allStages[33], 0, 0x8, 0xFF, 0b100000100000000000010, 8918.118164, 355.380005, -6922.565430, nullptr, nullptr },
- /*#42*/{ 0xe0, 11, stage::allStages[33], 0, 0x8, 0xFF, 0b110000000000000000010, 801.443970, -4197.580078, -20497.589844, nullptr, nullptr },
- /*#43*/{ 0xe0, 11, stage::allStages[33], 0, 0x8, 0xFF, 0b110000000000000000010, 6740.693848, -5139.174805, -10953.290039, nullptr, nullptr },
- /*#44*/{ 0xe0, 11, stage::allStages[54], 3, 0x12, 0xFF, 0b100000100000000000010, -5483.465332, 500.000000, 5302.014648, nullptr, nullptr },
- /*#45*/{ 0xe0, 11, stage::allStages[54], 1, 0x12, 0xFF, 0b000000000000000000010, 1214.411987, 1639.093384, -3631.436035, nullptr, nullptr },
- /*#46*/{ 0xe0, 11, stage::allStages[54], 3, 0x12, 0xFF, 0b000000000000000000010, -21789.335936, 2200.000000, 10000.409180, nullptr, nullptr },
- /*#47*/{ 0xe0, 11, stage::allStages[51], 0, 0x11, 0xFF, 0b100000000000000010010, 843.887695, -9361.725586, -21468.560547, nullptr, nullptr },
- /*#48*/{ 0xe0, 11, stage::allStages[51], 0, 0x11, 0xFF, 0b100000000000000010010, 7834.021484, -8356.457031, -18110.230469, nullptr, nullptr },
- /*#49*/{ 0xe0, 11, stage::allStages[51], 0, 0x11, 0xFF, 0b100000000000000010010, -4954.811035, -4714.479980, -18838.253906, nullptr, nullptr },
- /*#50*/{ 0xe0, 11, stage::allStages[51], 2, 0x12, 0xFF, 0b100000000100000000010, -6137.537598, -1800.000000, -10043.368164, nullptr, nullptr },
- /*#51*/{ 0xe0, 11, stage::allStages[51], 1, 0x11, 0xFF, 0b100000000000000010010, -69507.492188, -52429.000000, 62508.425781, nullptr, nullptr },
- /*#52*/{ 0xe0, 11, stage::allStages[27], 0, 0x11, 0xFF, 0b000000000000000000010, -238.949356, -2.310000, 2920.424072, nullptr, nullptr },
- /*#53*/{ 0xe0, 11, stage::allStages[27], 0, 0x12, 0xFF, 0b100000000100000000010, 533.658569, -84.440002, 5910.784180, nullptr, nullptr },
- /*#54*/{ 0xe0, 11, stage::allStages[27], 6, 0x12, 0xFF, 0b100000000100000000010, 4784.004395, 950.000000, 331.876648, nullptr, nullptr },
- /*#55*/{ 0xe0, 11, stage::allStages[9], 2, 0x13, 0xFF, 0b100000000000010000010, -3295.982178, 2750.000000, 11.354874, nullptr, nullptr },
- /*#56*/{ 0xe0, 11, stage::allStages[9], 5, 0x12, 0xFF, 0b100000000010100000010, 1861.281128, 7400.000000, -358.31518, nullptr, nullptr },
- /*#57*/{ 0xe0, 11, stage::allStages[54], 2, 0x13, 0xFF, 0b100000000000010000010, -1086.470947, 925.000000, 6306.895020, nullptr, nullptr },
- /*#58*/{ 0xe0, 11, stage::allStages[61], 0, 0x8, 0xFF, 0b000000000000000000010, 942.983948, 817.438049, 3387.270996, nullptr, nullptr },
- /*#59*/{ 0xe0, 11, stage::allStages[50], 0, 0x8, 0xFF, 0b000000000000000000010, 3444.790039, -4658.747559, 11720.103516, nullptr, nullptr },
- /*#60*/{ 0xe0, 11, stage::allStages[50], 0, 0x8, 0xFF, 0b000000000000000000010, 297.160065, -4608.964844, 7384.047852, nullptr, nullptr },
- /*60 poe reward*/{ 0x07, 7, stage::allStages[73], 5, 0x15, 0xFF, 0b000000000000000000000, 4250.363281, 134.492020, 1813.639648, nullptr, nullptr },
+ /*#1*/{ 0xe0, 11, stage::allStages[24], 2, 0x9, 0xFF, 0b000000000000000000010, 105.801384, -19.549999, -741.391968, nullptr, nullptr },
+ /*#2*/{ 0xe0, 11, stage::allStages[24], 3, 0x9, 0xFF, 0b100000000010000000010, 3606.844482, 150.030182, -5323.249512, nullptr, nullptr },
+ /*#3*/{ 0xe0, 11, stage::allStages[24], 5, 0x9, 0xFF, 0b000000000000000000010, 5712.277344, 1050.019775, 4526.544922, nullptr, nullptr },
+ /*#4*/{ 0xe0, 11, stage::allStages[24], 8, 0x9, 0xFF, 0b000000000000000000010, -4197.771973, 1040.154663, 4983.674805, nullptr, nullptr },
+ /*#5*/{ 0xe0, 11, stage::allStages[73], 5, 0x8, 0xFF, 0b000000000000000000010, 4529.513672, -75.000000, 2609.175049, nullptr, nullptr },
+ /*#6*/{ 0xe0, 11, stage::allStages[31], 16, 0x10, 0xFF, 0b100000000000100000010, 126.849854, -20000.000000, -337.206903, nullptr, nullptr },
+ /*#7*/{ 0xe0, 11, stage::allStages[31], 32, 0x13, 0xFF, 0b100000000100110000010, 231.875824, -40000.000000, -216.2944296, nullptr, nullptr },
+ /*#8*/{ 0xe0, 11, stage::allStages[31], 43, 0x15, 0xFF, 0b100000000101110000010, -4560.734375, -53750.000000, -825.646851, nullptr, nullptr },
+ /*#9*/{ 0xe0, 11, stage::allStages[12], 12, 0x15, 0xFF, 0b100000000001000000010, -12660.987305, 1982.199951, -7632.476074, nullptr, nullptr },
+ /*#10*/{ 0xe0, 11, stage::allStages[12], 13, 0x15, 0xFF, 0b100000000001000000010, 3916.892090, 4496.779785, -12149.609375, nullptr, nullptr },
+ /*#11*/{ 0xe0, 11, stage::allStages[47], 0, 0x8, 0xFF, 0b000000000000000000010, -2502.529785, -1533.660522, 18041.601562, nullptr, nullptr },
+ /*#12*/{ 0xe0, 11, stage::allStages[45], 11, 0x8, 0xFF, 0b000000000000000000010, -25786.427734, 300.000000, -20456.810547, nullptr, nullptr },
+ /*#13*/{ 0xe0, 11, stage::allStages[59], 0, 0x9, 0xFF, 0b000000000000000000010, 66240.039062, 143.258804, 56904.339844, nullptr, nullptr },
+ /*#14*/{ 0xe0, 11, stage::allStages[59], 0, 0x9, 0xFF, 0b100000000010000000010, -816.907959, 2496.226562, 57933.289062, nullptr, nullptr },
+ /*#15*/{ 0xe0, 11, stage::allStages[59], 0, 0x9, 0xFF, 0b100000000010000000010, 26747.324219, -46.507732, 26175.406250, nullptr, nullptr },
+ /*#16*/{ 0xe0, 11, stage::allStages[37], 2, 0x9, 0xFF, 0b100000000010000000010, -1026.819824, 1.152117, -161.420013, nullptr, nullptr },
+ /*#17*/{ 0xe0, 11, stage::allStages[37], 2, 0x9, 0xFF, 0b100000000010000000010, -286.849121, 3.514773, -895.548218, nullptr, nullptr },
+ /*#18*/{ 0xe0, 11, stage::allStages[59], 0, 0x9, 0xFF, 0b100000000010000000010, -2024.554443, 16.013172, 11583.281250, nullptr, nullptr },
+ /*#19*/{ 0xe0, 11, stage::allStages[55], 1, 0x9, 0xFF, 0b000000000000000000010, 1812.931274, 0.000000, 1155.415161, nullptr, nullptr },
+ /*#20*/{ 0xe0, 11, stage::allStages[55], 3, 0x9, 0xFF, 0b000000000000000000010, 283.265228, 840.000000, -12366.407227, nullptr, nullptr },
+ /*#21*/{ 0xe0, 11, stage::allStages[48], 0, 0x8, 0xFF, 0b000000000000000000010, 12836.060547, 100.000000, 178.608246, nullptr, nullptr },
+ /*#22*/{ 0xe0, 11, stage::allStages[48], 0, 0x8, 0xFF, 0b000000000000000000010, 14444.615234, 256.835815, -527.642578, nullptr, nullptr },
+ /*#24*/{ 0xe0, 11, stage::allStages[63], 0, 0x13, 0xFF, 0b100000000000010000010, 1683.054077, 480.000000, -6715.406250, nullptr, nullptr },
+ /*#24*/{ 0xe0, 11, stage::allStages[57], 8, 0x8, 0xFF, 0b000000000000000000010, -81042.460938, -1650.079956, 21720.513672, nullptr, nullptr },
+ /*#25*/{ 0xe0, 11, stage::allStages[57], 17, 0x8, 0xFF, 0b000000000000000000010, -42291.773438, -1400.000000, 10844.620117, nullptr, nullptr },
+ /*#26*/{ 0xe0, 11, stage::allStages[56], 3, 0x8, 0xFF, 0b000000000000000000010, -10858.849609, -5700.000000, 55509.773438, nullptr, nullptr },
+ /*#27*/{ 0xe0, 11, stage::allStages[32], 0, 0x8, 0xFF, 0b110000000000000000010, 4567.875977, 5027.688477, -5207.911621, nullptr, nullptr },
+ /*#28*/{ 0xe0, 11, stage::allStages[56], 6, 0x8, 0xFF, 0b000000000000000000010, -45153.691406, -8909.261719, 74205.156250, nullptr, nullptr },
+ /*#29*/{ 0xe0, 11, stage::allStages[56], 10, 0x8, 0xFF, 0b110000000000000000010, -45192.148438, -2474.139893, -32984.613281, nullptr, nullptr },
+ /*#30*/{ 0xe0, 11, stage::allStages[35], 0, 0x8, 0xFF, 0b110000000000000000010, 269.485474, 22.380699, -981.643372, nullptr, nullptr },
+ /*#31*/{ 0xe0, 11, stage::allStages[35], 0, 0x8, 0xFF, 0b110000000000000000010, -236.254684, 150.000000, -1036.175781, nullptr, nullptr },
+ /*#32*/{ 0xe0, 11, stage::allStages[57], 16, 0x8, 0xFF, 0b000000000000000000010, -53146.578125, -5153.850098, 25666.673828, nullptr, nullptr },
+ /*#33*/{ 0xe0, 11, stage::allStages[56], 13, 0x8, 0xFF, 0b100000001010000000010, -81177.609375, -6000.000000, 65960.148438, nullptr, nullptr },
+ /*#34*/{ 0xe0, 11, stage::allStages[46], 0, 0x8, 0xFF, 0b000000000000000000010, 3372.341553, 2300.000000, -3018.808594, nullptr, nullptr },
+ /*#35*/{ 0xe0, 11, stage::allStages[46], 0, 0x8, 0xFF, 0b000000000000000000010, -1487.586548, 3848.365234, -5915.137207, nullptr, nullptr },
+ /*#36*/{ 0xe0, 11, stage::allStages[52], 0, 0x8, 0xFF, 0b000000000000000000010, -74531.953125, -18336.878906, 47025.640625, nullptr, nullptr },
+ /*#37*/{ 0xe0, 11, stage::allStages[52], 0, 0x8, 0xFF, 0b000000000000000000010, -96335.820312, -17510.320312, 62149.574219, nullptr, nullptr },
+ /*#38*/{ 0xe0, 11, stage::allStages[52], 0, 0x8, 0xFF, 0b000000000000000000010, -115949.156250, -15840.000000, 59894.671875, nullptr, nullptr },
+ /*#39*/{ 0xe0, 11, stage::allStages[52], 0, 0x8, 0xFF, 0b101000000000000000010, -104251.976562, -18469.791016, 42262.726562, nullptr, nullptr },
+ /*#40*/{ 0xe0, 11, stage::allStages[52], 0, 0x8, 0xFF, 0b101000000000000000010, -115114.968750, -14096.000000, 25330.574219, nullptr, nullptr },
+ /*#41*/{ 0xe0, 11, stage::allStages[33], 0, 0x8, 0xFF, 0b100000100000000000010, 8918.118164, 355.380005, -6922.565430, nullptr, nullptr },
+ /*#42*/{ 0xe0, 11, stage::allStages[33], 0, 0x8, 0xFF, 0b110000000000000000010, 801.443970, -4197.580078, -20497.589844, nullptr, nullptr },
+ /*#43*/{ 0xe0, 11, stage::allStages[33], 0, 0x8, 0xFF, 0b110000000000000000010, 6740.693848, -5139.174805, -10953.290039, nullptr, nullptr },
+ /*#44*/{ 0xe0, 11, stage::allStages[54], 3, 0x12, 0xFF, 0b100000100000000000010, -5483.465332, 500.000000, 5302.014648, nullptr, nullptr },
+ /*#45*/{ 0xe0, 11, stage::allStages[54], 1, 0x12, 0xFF, 0b000000000000000000010, 1214.411987, 1639.093384, -3631.436035, nullptr, nullptr },
+ /*#46*/{ 0xe0, 11, stage::allStages[54], 3, 0x12, 0xFF, 0b000000000000000000010, -21789.335936, 2200.000000, 10000.409180, nullptr, nullptr },
+ /*#47*/{ 0xe0, 11, stage::allStages[51], 0, 0x11, 0xFF, 0b100000000000000010010, 843.887695, -9361.725586, -21468.560547, nullptr, nullptr },
+ /*#48*/{ 0xe0, 11, stage::allStages[51], 0, 0x11, 0xFF, 0b100000000000000010010, 7834.021484, -8356.457031, -18110.230469, nullptr, nullptr },
+ /*#49*/{ 0xe0, 11, stage::allStages[51], 0, 0x11, 0xFF, 0b100000000000000010010, -4954.811035, -4714.479980, -18838.253906, nullptr, nullptr },
+ /*#50*/{ 0xe0, 11, stage::allStages[51], 2, 0x12, 0xFF, 0b100000000100000000010, -6137.537598, -1800.000000, -10043.368164, nullptr, nullptr },
+ /*#51*/{ 0xe0, 11, stage::allStages[51], 1, 0x11, 0xFF, 0b100000000000000010010, -69507.492188, -52429.000000, 62508.425781, nullptr, nullptr },
+ /*#52*/{ 0xe0, 11, stage::allStages[27], 0, 0x11, 0xFF, 0b000000000000000000010, -238.949356, -2.310000, 2920.424072, nullptr, nullptr },
+ /*#53*/{ 0xe0, 11, stage::allStages[27], 0, 0x12, 0xFF, 0b100000000100000000010, 533.658569, -84.440002, 5910.784180, nullptr, nullptr },
+ /*#54*/{ 0xe0, 11, stage::allStages[27], 6, 0x12, 0xFF, 0b100000000100000000010, 4784.004395, 950.000000, 331.876648, nullptr, nullptr },
+ /*#55*/{ 0xe0, 11, stage::allStages[9], 2, 0x13, 0xFF, 0b100000000000010000010, -3295.982178, 2750.000000, 11.354874, nullptr, nullptr },
+ /*#56*/{ 0xe0, 11, stage::allStages[9], 5, 0x12, 0xFF, 0b100000000010100000010, 1861.281128, 7400.000000, -358.31518, nullptr, nullptr },
+ /*#57*/{ 0xe0, 11, stage::allStages[54], 2, 0x13, 0xFF, 0b100000000000010000010, -1086.470947, 925.000000, 6306.895020, nullptr, nullptr },
+ /*#58*/{ 0xe0, 11, stage::allStages[61], 0, 0x8, 0xFF, 0b000000000000000000010, 942.983948, 817.438049, 3387.270996, nullptr, nullptr },
+ /*#59*/{ 0xe0, 11, stage::allStages[50], 0, 0x8, 0xFF, 0b000000000000000000010, 3444.790039, -4658.747559, 11720.103516, nullptr, nullptr },
+ /*#60*/{ 0xe0, 11, stage::allStages[50], 0, 0x8, 0xFF, 0b000000000000000000010, 297.160065, -4608.964844, 7384.047852, nullptr, nullptr },
+ /*60 poe reward*/{ 0x07, 7, stage::allStages[73], 5, 0xFF, 0xFF, 0b000000000000000000000, 4250.363281, 134.492020, 1813.639648, nullptr, nullptr },
//sky book quest
- /*empty*/{ 0xe9, 0, stage::allStages[72], 0, 0x13, 0x13, 0b000000000000010000000, -532.266479, 1.500000, -343.810791, nullptr, nullptr },
- /*faron*/{ 0xea, 0, stage::allStages[45], 8, 0x13, 0x13, 0b000000000000010000000, -17500.000000, -310.000000, -20950.000000, nullptr, nullptr },
- /*eldin gorge*/{ 0xea, 0, stage::allStages[56], 3, 0x13, 0x13, 0b000000000000010000000, -10195.000000, -4760.000000, 39363.000000, nullptr, nullptr },
- /*edin bridge*/{ 0xea, 0, stage::allStages[56], 0, 0x13, 0x13, 0b000000000000010000000, 33650.000000, -80.000000, -35970.000000, nullptr, nullptr },
- /*west castle*/{ 0xea, 0, stage::allStages[57], 8, 0x13, 0x13, 0b000000000000010000000, -81950.000000, -1300.000000, 20650.000000, nullptr, nullptr },
- /*hylia bridge*/{ 0xea, 0, stage::allStages[56], 13, 0x13, 0x13, 0b000000000000010000000, -94664.000000, -5040.000000, 18311.000000, nullptr, nullptr },
+ /*empty*/{ 0xe9, 0, stage::allStages[72], 0, 0xFF, 0x13, 0b000000000000010000000, -532.266479, 1.500000, -343.810791, nullptr, nullptr },
+ /*faron*/{ 0xea, 0, stage::allStages[45], 8, 0x13, 0x13, 0b000000000000010000000, -17500.000000, -310.000000, -20950.000000, nullptr, nullptr },
+ /*eldin gorge*/{ 0xea, 0, stage::allStages[56], 3, 0x13, 0x13, 0b000000000000010000000, -10195.000000, -4760.000000, 39363.000000, nullptr, nullptr },
+ /*edin bridge*/{ 0xea, 0, stage::allStages[56], 0, 0x13, 0x13, 0b000000000000010000000, 33650.000000, -80.000000, -35970.000000, nullptr, nullptr },
+ /*west castle*/{ 0xea, 0, stage::allStages[57], 8, 0x13, 0x13, 0b000000000000010000000, -81950.000000, -1300.000000, 20650.000000, nullptr, nullptr },
+ /*hylia bridge*/{ 0xea, 0, stage::allStages[56], 13, 0x13, 0x13, 0b000000000000010000000, -94664.000000, -5040.000000, 18311.000000, nullptr, nullptr },
/*desert*/{ 0xea, 0, stage::allStages[59], 0, 0x13, 0x13, 0b000000000000010000000, 15120.000000, 952.169983, 59670.000000, nullptr, nullptr },
//shop items
//Ordon
@@ -510,8 +510,8 @@ namespace mod::item
/*auto gotten*///{0x16, 12, stage::allStages[68], 1, 0x5, 0xFF, 0b000000000000000000000, 800.0000000, 0.0000000, -300.0000000, nullptr, nullptr},
/*auto gotten*///{0x17, 12, stage::allStages[68], 1, 0x5, 0xFF, 0b000000000000000000000, 800.0000000, 0.0000000, -300.0000000, nullptr, nullptr},
/*auto gotten*///{0x18, 12, stage::allStages[68], 1, 0x5, 0xFF, 0b000000000000000000000, 800.0000000, 0.0000000, -300.0000000, nullptr, nullptr},
- /*auto gotten*///{0x1d, 12, stage::allStages[68], 1, 0x8, 0xFF, 0b000000000000000000000, 800.0000000, 0.0000000, -300.0000000, nullptr, nullptr},
- /*auto gotten*///{0x1a, 12, stage::allStages[68], 1, 0x8, 0xFF, 0b000000000000000000000, 800.0000000, 0.0000000, -300.0000000, nullptr, nullptr},
+ /*auto gotten*///{0x1d, 12, stage::allStages[68], 1, 0x8, 0xFF, 0b000000000000000000000, 800.0000000, 0.0000000, -300.0000000, nullptr, nullptr},
+ /*auto gotten*///{0x1a, 12, stage::allStages[68], 1, 0x8, 0xFF, 0b000000000000000000000, 800.0000000, 0.0000000, -300.0000000, nullptr, nullptr},
/*auto gotten*///{0x1b, 12, stage::allStages[68], 1, 0x8, 0xFF, 0b000000000000000000000, 800.0000000, 0.0000000, -300.0000000, nullptr, nullptr},
//Goron Night Kakariko
{0x63, 12, stage::allStages[46], 0, 0x5, 0xFF, 0b001000000000000000000, -1350.000000, 0.000000, -3070.000000, nullptr, nullptr},
@@ -523,17 +523,17 @@ namespace mod::item
{0x10, 12, stage::allStages[53], 0, 0x5, 0xFF, 0b111111100000000000000, -169.985306, 1120.000000, 3406.518799, nullptr, nullptr},
{ 0x6d, 12, stage::allStages[53], 3, 0x8, 0xFF, 0b111111100000000000000, 511.206268, -200.000000, 7069.889160, nullptr, nullptr },
//Malo Castle Town
- /*auto gotten*///{0x0d, 12, stage::allStages[73], 0, 0x8, 0xFF, 0b111111100000000000000, 1557.0000000, -200.0000000, 3491.0000000, nullptr, nullptr},
- /*auto gotten*///{0x18, 12, stage::allStages[73], 0, 0x8, 0xFF, 0b111111100000000000000, 1557.0000000, -200.0000000, 3491.0000000, nullptr, nullptr},
- /*auto gotten*///{0x1b, 12, stage::allStages[73], 0, 0x8, 0xFF, 0b111111100000000000000, 1557.0000000, -200.0000000, 3491.0000000, nullptr, nullptr},
- /*auto gotten*///{0x0e, 12, stage::allStages[73], 0, 0x8, 0xFF, 0b111111100000000000000, 1557.0000000, -200.0000000, 3491.0000000, nullptr, nullptr},
- { 0x61, 12, stage::allStages[73], 0, 0x8, 0xFF, 0b111111100000000000000, 1557.0000000, -200.0000000, 3491.0000000, nullptr, nullptr },
+ /*auto gotten*///{0x0d, 12, stage::allStages[73], 0, 0x8, 0xFF, 0b111111100000000000000, 1557.0000000, -200.0000000, 3491.0000000, nullptr, nullptr},
+ /*auto gotten*///{0x18, 12, stage::allStages[73], 0, 0x8, 0xFF, 0b111111100000000000000, 1557.0000000, -200.0000000, 3491.0000000, nullptr, nullptr},
+ /*auto gotten*///{0x1b, 12, stage::allStages[73], 0, 0x8, 0xFF, 0b111111100000000000000, 1557.0000000, -200.0000000, 3491.0000000, nullptr, nullptr},
+ /*auto gotten*///{0x0e, 12, stage::allStages[73], 0, 0x8, 0xFF, 0b111111100000000000000, 1557.0000000, -200.0000000, 3491.0000000, nullptr, nullptr},
+ { 0x61, 12, stage::allStages[73], 0, 0x8, 0xFF, 0b111111100000000000000, 1557.0000000, -200.0000000, 3491.0000000, nullptr, nullptr },
{ 0x63, 12, stage::allStages[73], 0, 0x8, 0xFF, 0b111111100000000000000, 1557.0000000, -200.0000000, 3491.0000000, nullptr, nullptr },
//City In The Sky
- /*auto gotten*///{0x10, 12, stage::allStages[12], 16, 0x14, 0xFF, 0b111111100000000000000, -187.485748, 140.000000, -327.944885, nullptr, nullptr},
- /*auto gotten*///{0x0d, 12, stage::allStages[12], 16, 0x14, 0xFF, 0b111111100000000000000, -187.485748, 140.000000, -327.944885, nullptr, nullptr},
- { 0x66, 12, stage::allStages[12], 16, 0x14, 0xFF, 0b111111100000000000000, -187.485748, 140.000000, -327.944885, nullptr, nullptr },
- { 0x61, 12, stage::allStages[12], 16, 0x14, 0xFF, 0b111111100000000000000, -187.485748, 140.000000, -327.944885, nullptr, nullptr },
+ /*auto gotten*///{0x10, 12, stage::allStages[12], 16, 0x14, 0xFF, 0b111111100000000000000, -187.485748, 140.000000, -327.944885, nullptr, nullptr},
+ /*auto gotten*///{0x0d, 12, stage::allStages[12], 16, 0x14, 0xFF, 0b111111100000000000000, -187.485748, 140.000000, -327.944885, nullptr, nullptr},
+ { 0x66, 12, stage::allStages[12], 16, 0x14, 0xFF, 0b111111100000000000000, -187.485748, 140.000000, -327.944885, nullptr, nullptr },
+ { 0x61, 12, stage::allStages[12], 16, 0x14, 0xFF, 0b111111100000000000000, -187.485748, 140.000000, -327.944885, nullptr, nullptr },
{ 0x63, 12, stage::allStages[12], 16, 0x14, 0xFF, 0b111111100000000000000, -187.485748, 140.000000, -327.944885, nullptr, nullptr },
//Fairy Tear Cave Of Ordeals (includes spring warps)
{ 0x73, 12, stage::allStages[31], 49, 0x15, 0xFF, 0b100000000101110000010, -7.837189, -61250.000000, -3557.497070, nullptr, nullptr },//,
@@ -552,7 +552,7 @@ namespace mod::item
//Custom Chests
//Shadow Crystal
- /*493*/{ 0x32, 0, stage::allStages[54], 1, 0x7, 0x6, 0b000000000000000000000, -235.256332, 1625.000000, -4709.996582, nullptr, nullptr },
+ /*493*/{ 0x32, 0, stage::allStages[54], 1, 0x6, 0x6, 0b000000000000000000000, -235.256332, 1625.000000, -4709.996582, nullptr, nullptr },
//Master Sword
/*494*/{ 0x29, 0, stage::allStages[54], 1, 0x7, 0x7, 0b000000000000000000000, 246.137573, 1625.000000, -4787.551270, nullptr, nullptr },
//Dominion Rod Uncharged
@@ -586,7 +586,6 @@ namespace mod::item
0, //wooden sword
295, //slingshot
296, //lantern
- 292, //ordon sword
298, //boomerang
21, //iron boots
291, //ordon shield
@@ -595,6 +594,7 @@ namespace mod::item
320, //bomb bag
314, //zora armor
58, //clawshot
+ 292, //ordon sword
493, //Shadow Crystal
494, //Master Sword
322, //Auru memo
diff --git a/source/mod.cpp b/source/mod.cpp
index 0458cdf..2814579 100644
--- a/source/mod.cpp
+++ b/source/mod.cpp
@@ -1,159 +1,156 @@
-#include "defines.h"
-#include "mod.h"
-#include "global.h"
-#include "systemConsole.h"
-#include "patch.h"
-#include "controller.h"
-#include "customChecks.h"
-#include "tools.h"
-#include "array.h"
-#include "eventListener.h"
-#include "stage.h"
-#include "game_patches.h"
-#include "chestRando.h"
-#include "itemChecks.h"
-#include "HUDConsole.h"
-#include "items.h"
-#include "singleton.h"
-
-#include <tp/f_op_scene_req.h>
-#include <tp/m_Do_controller_pad.h>
-#include <tp/d_map_path_dmap.h>
-#include <tp/evt_control.h>
-#include <tp/f_op_scene_req.h>
-#include <tp/d_com_inf_game.h>
-#include <tp/f_ap_game.h>
-#include <tp/f_op_actor_mng.h>
-#include <tp/d_a_alink.h>
-#include <tp/d_save.h>
+#include "defines.h"
+#include "mod.h"
+#include "global.h"
+#include "systemConsole.h"
+#include "patch.h"
+#include "controller.h"
+#include "customChecks.h"
+#include "tools.h"
+#include "array.h"
+#include "eventListener.h"
+#include "stage.h"
+#include "game_patches.h"
+#include "chestRando.h"
+#include "itemChecks.h"
+#include "HUDConsole.h"
+#include "items.h"
+#include "singleton.h"
+
+#include <tp/f_op_scene_req.h>
+#include <tp/m_Do_controller_pad.h>
+#include <tp/d_map_path_dmap.h>
+#include <tp/evt_control.h>
+#include <tp/f_op_scene_req.h>
+#include <tp/d_com_inf_game.h>
+#include <tp/f_ap_game.h>
+#include <tp/f_op_actor_mng.h>
+#include <tp/d_a_alink.h>
+#include <tp/d_save.h>
#include <tp/d_stage.h>
-#include <tp/dzx.h>
-#include <tp/JFWSystem.h>
-#include <tp/d_kankyo.h>
-#include <tp/d_msg_flow.h>
-#include <tp/DynamicLink.h>
-#include <tp/d_item.h>
-#include <cstdio>
-#include <cstring>
+#include <tp/dzx.h>
+#include <tp/JFWSystem.h>
+#include <tp/d_kankyo.h>
+#include <tp/d_msg_flow.h>
+#include <tp/DynamicLink.h>
+#include <tp/d_item.h>
+#include <tp/d_item_data.h>
+#include <tp/d_meter2_info.h>
+#include <cstdio>
+#include <cstring>
+
+
+
+namespace mod
+{
+ Mod* global::modPtr = nullptr;
+ ChestRandomizer* global::chestRandoPtr = nullptr;
+ event::EventListener* global::eventListenerPtr = nullptr;
+ mod::HUDConsole* global::hudConsolePtr = nullptr;
+ int num_frames = 120;
+ int frame_counter = 0;
+
+ void main()
+ {
+ Mod* mod = new Mod();
+ mod->init();
+ }
+
+ Mod::Mod()
+ {
+ eventListener = new event::EventListener();
+ chestRandomizer = new ChestRandomizer();
+ hudConsole = new HUDConsole("Settings", 0x80);
+ global::modPtr = this;
+ global::chestRandoPtr = this->chestRandomizer;
+ global::eventListenerPtr = this->eventListener;
+ global::hudConsolePtr = this->hudConsole;
+ }
+
+ void Mod::init()
+ {
+ // Perform any necessary assembly overwrites
+ game_patch::assemblyOverwrites();
+ game_patch::increaseWalletSize();
+ game_patch::increaseClimbSpeed();
+
+
+ // Causes issues right now (argarok cannot be beaten)
+ //game_patch::removeIBLimit();
+
+
+
+ // Init rando
+ tools::randomSeed = 0x9e3779b97f4a7c15;
+ randoEnabled = 1;
+ truePause = 1;
+ inputBuffering = 0;
+
+ // Print controls
+ strcpy(sysConsolePtr->consoleLine[20].line, "D-Pad Nav: Up/Down Left/Right");
+ strcpy(sysConsolePtr->consoleLine[21].line, "+/- Value: A/B/X/Y Console : R + Z");
+ strcpy(sysConsolePtr->consoleLine[22].line, " Generate: R + Start (auto on new file)");
+ strcpy(sysConsolePtr->consoleLine[23].line, "Bring up the console to use commands");
+ strcpy(sysConsolePtr->consoleLine[24].line, "rando.tpspeed.run | Twitter: @ztprandomizer");
+
+ u8 page = 0;
+
+ // General settings
+ hudConsole->addOption(page, "Red:", &reinterpret_cast<u8*>(&sysConsolePtr->consoleColor)[0], 0xFF);
+ hudConsole->addOption(page, "Green:", &reinterpret_cast<u8*>(&sysConsolePtr->consoleColor)[1], 0xFF);
+ hudConsole->addOption(page, "Blue:", &reinterpret_cast<u8*>(&sysConsolePtr->consoleColor)[2], 0xFF);
+ hudConsole->addOption(page, "Alpha:", &reinterpret_cast<u8*>(&sysConsolePtr->consoleColor)[3], 0xFF);
+ hudConsole->addOption(page, "True Pause:", &truePause, 0x1);
+ hudConsole->addOption(page, "Input Buffer:", &inputBuffering, 0x1);
+
+
+ // Seed settings
+ page = hudConsole->addPage("Seed");
+
+ hudConsole->addOption(page, "Rando enabled?", &randoEnabled, 0x1);
+ hudConsole->addOption(page, "Custom Seed?", &customSeed, 0x1);
+ hudConsole->addOption(page, "Seed 1:", &reinterpret_cast<u8*>(&tools::randomSeed)[0], 0xFF);
+ hudConsole->addOption(page, "Seed 2:", &reinterpret_cast<u8*>(&tools::randomSeed)[1], 0xFF);
+ hudConsole->addOption(page, "Seed 3:", &reinterpret_cast<u8*>(&tools::randomSeed)[2], 0xFF);
+ hudConsole->addOption(page, "Seed 4:", &reinterpret_cast<u8*>(&tools::randomSeed)[3], 0xFF);
+
+ hudConsole->addOption(page, "Seed 5:", &reinterpret_cast<u8*>(&tools::randomSeed)[4], 0xFF);
+ hudConsole->addOption(page, "Seed 6:", &reinterpret_cast<u8*>(&tools::randomSeed)[5], 0xFF);
+ hudConsole->addOption(page, "Seed 7:", &reinterpret_cast<u8*>(&tools::randomSeed)[6], 0xFF);
+ hudConsole->addOption(page, "Seed 8:", &reinterpret_cast<u8*>(&tools::randomSeed)[7], 0xFF);
+
+ hudConsole->addWatch(page, "Resulting Seed", &tools::randomSeed, 'x', WatchInterpretation::_u64);
+
+ // Debug
+ page = hudConsole->addPage("Debug Info");
+
+
+
+ hudConsole->addWatch(page, "Function:", &lastItemFunc, 's', WatchInterpretation::_str);
+ hudConsole->addWatch(page, " Source:", &chestRandomizer->lastSourceInfo, 's', WatchInterpretation::_str);
+ hudConsole->addWatch(page, " Dest:", &chestRandomizer->lastDestInfo, 's', WatchInterpretation::_str);
+
+ hudConsole->addWatch(page, "Total Checks:", &chestRandomizer->totalChecks, 'u', WatchInterpretation::_u16);
+ hudConsole->addWatch(page, "Layer Checks:", &chestRandomizer->layerCheckCount, 'u', WatchInterpretation::_u16);
+ hudConsole->addWatch(page, "Empty:", &chestRandomizer->empty, 'u', WatchInterpretation::_u16);
+
+ hudConsole->addWatch(page, "Active Seed:", &chestRandomizer->currentSeed, 'x', WatchInterpretation::_u64);
+ hudConsole->addWatch(page, " Checksum:", &chestRandomizer->checkSum, 'x', WatchInterpretation::_u16);
+
+
+ // Item search
+ page = hudConsole->addPage("Item Search");
+
+ hudConsole->addOption(page, "Search ID:", &itemSearchID, 0xFF);
+ hudConsole->addOption(page, "Reverse ID:", &itemReverseSearchID, 0xFF);
-
-
-namespace mod
-{
- Mod* global::modPtr = nullptr;
- ChestRandomizer* global::chestRandoPtr = nullptr;
- event::EventListener* global::eventListenerPtr = nullptr;
- mod::HUDConsole* global::hudConsolePtr = nullptr;
- int num_frames = 120;
- int frame_counter = 0;
-
- void main()
- {
- Mod* mod = new Mod();
- mod->init();
- }
-
- Mod::Mod()
- {
- eventListener = new event::EventListener();
- chestRandomizer = new ChestRandomizer();
- hudConsole = new HUDConsole("Settings", 0x80);
- global::modPtr = this;
- global::chestRandoPtr = this->chestRandomizer;
- global::eventListenerPtr = this->eventListener;
- global::hudConsolePtr = this->hudConsole;
- }
-
- void Mod::init()
- {
- // Perform any necessary assembly overwrites
- game_patch::assemblyOverwrites();
- game_patch::increaseWalletSize();
- game_patch::increaseClimbSpeed();
- /*
- * Causes issues right now (argarok cannot be beaten)
- * game_patch::removeIBLimit();
- */
-
- // Init rando
- tools::randomSeed = 0x9e3779b97f4a7c15;
- randoEnabled = 1;
- truePause = 1;
- inputBuffering = 0;
-
- // Print controls
- strcpy(sysConsolePtr->consoleLine[20].line, "D-Pad Nav: Up/Down Left/Right");
- strcpy(sysConsolePtr->consoleLine[21].line, "+/- Value: A/B/X/Y Console : R + Z");
- strcpy(sysConsolePtr->consoleLine[22].line, " Generate: R + Start (auto on new file)");
- strcpy(sysConsolePtr->consoleLine[23].line, "Bring up the console to use commands");
- strcpy(sysConsolePtr->consoleLine[24].line, "rando.tpspeed.run | Twitter: @ztprandomizer");
-
- u8 page = 0;
-
- // General settings
- hudConsole->addOption(page, "Red:", &reinterpret_cast<u8*>(&sysConsolePtr->consoleColor)[0], 0xFF);
- hudConsole->addOption(page, "Green:", &reinterpret_cast<u8*>(&sysConsolePtr->consoleColor)[1], 0xFF);
- hudConsole->addOption(page, "Blue:", &reinterpret_cast<u8*>(&sysConsolePtr->consoleColor)[2], 0xFF);
- hudConsole->addOption(page, "Alpha:", &reinterpret_cast<u8*>(&sysConsolePtr->consoleColor)[3], 0xFF);
- hudConsole->addOption(page, "True Pause:", &truePause, 0x1);
- hudConsole->addOption(page, "Input Buffer:", &inputBuffering, 0x1);
-
-
- // Seed settings
- page = hudConsole->addPage("Seed");
-
- hudConsole->addOption(page, "Rando enabled?", &randoEnabled, 0x1);
- hudConsole->addOption(page, "Custom Seed?", &customSeed, 0x1);
- hudConsole->addOption(page, "Seed 1:", &reinterpret_cast<u8*>(&tools::randomSeed)[0], 0xFF);
- hudConsole->addOption(page, "Seed 2:", &reinterpret_cast<u8*>(&tools::randomSeed)[1], 0xFF);
- hudConsole->addOption(page, "Seed 3:", &reinterpret_cast<u8*>(&tools::randomSeed)[2], 0xFF);
- hudConsole->addOption(page, "Seed 4:", &reinterpret_cast<u8*>(&tools::randomSeed)[3], 0xFF);
-
- hudConsole->addOption(page, "Seed 5:", &reinterpret_cast<u8*>(&tools::randomSeed)[4], 0xFF);
- hudConsole->addOption(page, "Seed 6:", &reinterpret_cast<u8*>(&tools::randomSeed)[5], 0xFF);
- hudConsole->addOption(page, "Seed 7:", &reinterpret_cast<u8*>(&tools::randomSeed)[6], 0xFF);
- hudConsole->addOption(page, "Seed 8:", &reinterpret_cast<u8*>(&tools::randomSeed)[7], 0xFF);
-
- hudConsole->addWatch(page, "Resulting Seed", &tools::randomSeed, 'x', WatchInterpretation::_u64);
-
- // Debug
- page = hudConsole->addPage("Debug Info");
-
- hudConsole->addOption(page, "Bugsanity?", &chestRandomizer->isBugsanityEnabled, 0x1);
- hudConsole->addOption(page, "Poesanity?", &chestRandomizer->isPoesanityEnabled, 0x1);
- hudConsole->addOption(page, "Shopsanity?", &chestRandomizer->isShopsanityEnabled, 0x1);
- hudConsole->addOption(page, "Dungeon Items?", &chestRandomizer->areDungeonItemsRandomized, 0x1);
- hudConsole->addOption(page, "Key Shuffle?", &chestRandomizer->isKeysanityEnabled, 0x1);
- hudConsole->addOption(page, "Skybooksanity?", &Singleton::getInstance()->shuffledSkybook, 0x1);
-
-
-
- hudConsole->addWatch(page, "Function:", &lastItemFunc, 's', WatchInterpretation::_str);
- hudConsole->addWatch(page, " Source:", &chestRandomizer->lastSourceInfo, 's', WatchInterpretation::_str);
- hudConsole->addWatch(page, " Dest:", &chestRandomizer->lastDestInfo, 's', WatchInterpretation::_str);
-
- hudConsole->addWatch(page, "Total Checks:", &chestRandomizer->totalChecks, 'u', WatchInterpretation::_u16);
- hudConsole->addWatch(page, "Layer Checks:", &chestRandomizer->layerCheckCount, 'u', WatchInterpretation::_u16);
- hudConsole->addWatch(page, "Empty:", &chestRandomizer->empty, 'u', WatchInterpretation::_u16);
-
- hudConsole->addWatch(page, "Active Seed:", &chestRandomizer->currentSeed, 'x', WatchInterpretation::_u64);
- hudConsole->addWatch(page, " Checksum:", &chestRandomizer->checkSum, 'x', WatchInterpretation::_u16);
-
-
- // Item search
- page = hudConsole->addPage("Item Search");
-
- hudConsole->addOption(page, "Search ID:", &itemSearchID, 0xFF);
- hudConsole->addOption(page, "Reverse ID:", &itemReverseSearchID, 0xFF);
-
hudConsole->addWatch(page, "Search Result:", &itemSearchResults, 's', WatchInterpretation::_str);
- hudConsole->addWatch(page, "Reverse Result:", &itemReverseSearchResults, 's', WatchInterpretation::_str);
-
- hudConsole->addWatch(page, "MetadataID:", &lastItemDataID, 's', WatchInterpretation::_str);
- hudConsole->addWatch(page, "MetadataX:", &lastItemDataX, 's', WatchInterpretation::_str);
- hudConsole->addWatch(page, "MetadataY:", &lastItemDataY, 's', WatchInterpretation::_str);
- hudConsole->addWatch(page, "MetadataZ:", &lastItemDataZ, 's', WatchInterpretation::_str);
-
+ hudConsole->addWatch(page, "Reverse Result:", &itemReverseSearchResults, 's', WatchInterpretation::_str);
+
+ hudConsole->addWatch(page, "MetadataID:", &lastItemDataID, 's', WatchInterpretation::_str);
+ hudConsole->addWatch(page, "MetadataX:", &lastItemDataX, 's', WatchInterpretation::_str);
+ hudConsole->addWatch(page, "MetadataY:", &lastItemDataY, 's', WatchInterpretation::_str);
+ hudConsole->addWatch(page, "MetadataZ:", &lastItemDataZ, 's', WatchInterpretation::_str);
+
// Check search
page = hudConsole->addPage("Check Search");
@@ -165,27 +162,37 @@ namespace mod
hudConsole->addWatch(page, "Search ID:", &checkSearchID, 'd', WatchInterpretation::_u16);
hudConsole->addWatch(page, "Reverse ID:", &checkReverseSearchID, 'd', WatchInterpretation::_u16);
hudConsole->addWatch(page, "Search Result:", &checkSearchResults, 's', WatchInterpretation::_str);
- hudConsole->addWatch(page, "Reverse Result:", &checkReverseSearchResults, 's', WatchInterpretation::_str);
-
- // Game info 1
- page = hudConsole->addPage("Skips 1");
-
+ hudConsole->addWatch(page, "Reverse Result:", &checkReverseSearchResults, 's', WatchInterpretation::_str);
+
+ //Shuffled Checks
+ page = hudConsole->addPage("Shuffled Checks");
+
+ hudConsole->addOption(page, "Bugsanity?", &chestRandomizer->isBugsanityEnabled, 0x1);
+ hudConsole->addOption(page, "Poesanity?", &chestRandomizer->isPoesanityEnabled, 0x1);
+ hudConsole->addOption(page, "Shopsanity?", &chestRandomizer->isShopsanityEnabled, 0x1);
+ hudConsole->addOption(page, "Dungeon Items?", &chestRandomizer->areDungeonItemsRandomized, 0x1);
+ hudConsole->addOption(page, "Key Shuffle?", &chestRandomizer->isKeysanityEnabled, 0x1);
+ hudConsole->addOption(page, "Sky Character?", &Singleton::getInstance()->shuffledSkybook, 0x1);
+
+ // Game info 1
+ page = hudConsole->addPage("Skips 1");
+
hudConsole->addOption(page, "MDH Skip?", &Singleton::getInstance()->isMDHSkipEnabled, 0x1);
hudConsole->addOption(page, "Faron Escape?", &Singleton::getInstance()->isForestEscapeEnabled, 0x1);
- hudConsole->addOption(page, "Open HF gates?", &Singleton::getInstance()->isGateUnlockEnabled, 0x1);
- hudConsole->addOption(page, "Skip Twilight?", &Singleton::getInstance()->isTwilightSkipped, 0x1);
- hudConsole->addOption(page, "Skip Goats?", &Singleton::getInstance()->isGoatSkipEnabled, 0x1);
- hudConsole->addOption(page, "Skip MS Puzzle?", &Singleton::getInstance()->isMSPuzzleSkipEnabled, 0x1);
- hudConsole->addOption(page, "Skip Escort?", &Singleton::getInstance()->isCartEscortSkipEnabled, 0x1);
- hudConsole->addOption(page, "Skip Sewers?", &Singleton::getInstance()->isSewerSkipEnabled, 0x1);
-
-
-
- /*hudConsole->addOption(page, "Item half milk", &chestRandomizer->itemThatReplacesHalfMilk, 0xFF); //for testing only
- hudConsole->addOption(page, "Item slingshot", &chestRandomizer->itemThatReplacesSlingShot, 0xFF); //for testing only
- hudConsole->addOption(page, "Normal Time:", &enableNormalTime, 0x1); //for testing only
- hudConsole->addOption(page, "Set Day:", &setDay, 0x1); //for testing only*/
-
+ hudConsole->addOption(page, "Open HF gates?", &Singleton::getInstance()->isGateUnlockEnabled, 0x1);
+ hudConsole->addOption(page, "Skip Twilight?", &Singleton::getInstance()->isTwilightSkipped, 0x1);
+ hudConsole->addOption(page, "Skip Goats?", &Singleton::getInstance()->isGoatSkipEnabled, 0x1);
+ hudConsole->addOption(page, "Skip MS Puzzle?", &Singleton::getInstance()->isMSPuzzleSkipEnabled, 0x1);
+ hudConsole->addOption(page, "Skip Escort?", &Singleton::getInstance()->isCartEscortSkipEnabled, 0x1);
+ hudConsole->addOption(page, "Skip Sewers?", &Singleton::getInstance()->isSewerSkipEnabled, 0x1);
+
+
+
+ /*hudConsole->addOption(page, "Item half milk", &chestRandomizer->itemThatReplacesHalfMilk, 0xFF); //for testing only
+ hudConsole->addOption(page, "Item slingshot", &chestRandomizer->itemThatReplacesSlingShot, 0xFF); //for testing only
+ hudConsole->addOption(page, "Normal Time:", &enableNormalTime, 0x1); //for testing only
+ hudConsole->addOption(page, "Set Day:", &setDay, 0x1); //for testing only*/
+
hudConsole->addWatch(page, "CurrentStage:", &gameInfo.currentStage, 's', WatchInterpretation::_str);
hudConsole->addWatch(page, "CurrentRoom:", &tp::d_kankyo::env_light.currentRoom, 'd', WatchInterpretation::_u8);
hudConsole->addWatch(page, "CurrentState:", &tp::d_com_inf_game::current_state, 'x', WatchInterpretation::_u8);
@@ -194,17 +201,20 @@ namespace mod
hudConsole->addWatch(page, "CurrentPosY:", &currentPosY, 's', WatchInterpretation::_str);
hudConsole->addWatch(page, "CurrentPosZ:", &currentPosZ, 's', WatchInterpretation::_str);
hudConsole->addWatch(page, "CurrentAngle:", &linkAngle, 's', WatchInterpretation::_str);
- hudConsole->addWatch(page, "Sky Angle:", &skyAngle, 's', WatchInterpretation::_str);
-
- //Game info 2
- page = hudConsole->addPage("Skips 2");
- hudConsole->addOption(page, "Early CiTS?", &Singleton::getInstance()->isEarlyCiTSEnabled, 0x1);
- hudConsole->addOption(page, "Early Desert?", &Singleton::getInstance()->isEarlyDesertEnabled, 0x1);
- hudConsole->addOption(page, "Boss Keysey?", &Singleton::getInstance()->isBossKeyseyEnabled, 0x1);
- hudConsole->addOption(page, "No Shop Bottl?", &allowBottleItemsShopAnytime, 0x1);
- hudConsole->addOption(page, "Fast transform?", &enableQuickTransform, 0x1);
- hudConsole->addOption(page, "Skip Intro?", &Singleton::getInstance()->isIntroSkipped, 0x1);
- //hudConsole->addOption(page, "Midna ToD Skip?", &Singleton::getInstance()->midnaTimeControl, 0x1);
+ hudConsole->addWatch(page, "Sky Angle:", &skyAngle, 's', WatchInterpretation::_str);
+
+ //Game info 2
+ page = hudConsole->addPage("Skips 2");
+ hudConsole->addOption(page, "Early CiTS?", &Singleton::getInstance()->isEarlyCiTSEnabled, 0x1);
+ hudConsole->addOption(page, "Early Desert?", &Singleton::getInstance()->isEarlyDesertEnabled, 0x1);
+ hudConsole->addOption(page, "Boss Keysey?", &Singleton::getInstance()->isBossKeyseyEnabled, 0x1);
+ hudConsole->addOption(page, "No Shop Bottl?", &allowBottleItemsShopAnytime, 0x1);
+ hudConsole->addOption(page, "Fast transform?", &enableQuickTransform, 0x1);
+ hudConsole->addOption(page, "Skip Intro?", &Singleton::getInstance()->isIntroSkipped, 0x1);
+ hudConsole->addOption(page, "Midna ToD Skip?", &Singleton::getInstance()->midnaTimeControl, 0x1);
+ hudConsole->addOption(page, "Early ToT?", &Singleton::getInstance()->isEarlyToTEnabled, 0x1);
+ hudConsole->addOption(page, "Early PoT?", &Singleton::getInstance()->isEarlyPoTEnabled, 0x1);
+ hudConsole->addOption(page, "Open HC?", &Singleton::getInstance()->isEarlyHCEnabled, 0x1);
//color
/*page = hudConsole->addPage("Tunic Color1");
@@ -249,112 +259,123 @@ namespace mod
hudConsole->addWatch(page, "move:", &moveResult, 'x', WatchInterpretation::_u16);
hudConsole->addWatch(page, "throw:", &throwResult, 'x', WatchInterpretation::_u16);*/
-
-
- //event info
- page = hudConsole->addPage("Event Info");
+
+
+ //event info
+ page = hudConsole->addPage("Skips 3/ Event");
//hudConsole->addOption(page, "Coords as hex?", &coordsAreInHex, 0x1);
-
- hudConsole->addWatch(page, "CurrentEventID:", &gameInfo.eventSystem.currentEventID, 'x', WatchInterpretation::_u8);
- hudConsole->addWatch(page, "NextEventID:", &gameInfo.eventSystem.nextEventID, 'x', WatchInterpretation::_u8);
- hudConsole->addWatch(page, "NextStage:", &gameInfo.nextStageVars.nextStage, 's', WatchInterpretation::_str);
- hudConsole->addWatch(page, "NextRoom:", &gameInfo.nextStageVars.nextRoom, 'd', WatchInterpretation::_u8);
- hudConsole->addWatch(page, "NextSpawnPoint:", &gameInfo.nextStageVars.nextSpawnPoint, 'x', WatchInterpretation::_u8);
- hudConsole->addWatch(page, "NextSate:", &gameInfo.nextStageVars.nextState, 'x', WatchInterpretation::_u8);
-
- //local area
- /*page = hudConsole->addPage("Local Area 1");
- hudConsole->addWatch(page, "AreaNodes0:", &gameInfo.localAreaNodes.unk_0[0], 'x', WatchInterpretation::_u8);
- hudConsole->addWatch(page, "AreaNodes1:", &gameInfo.localAreaNodes.unk_0[1], 'x', WatchInterpretation::_u8);
- hudConsole->addWatch(page, "AreaNodes2:", &gameInfo.localAreaNodes.unk_0[2], 'x', WatchInterpretation::_u8);
- hudConsole->addWatch(page, "AreaNodes3:", &gameInfo.localAreaNodes.unk_0[3], 'x', WatchInterpretation::_u8);
- hudConsole->addWatch(page, "AreaNodes4:", &gameInfo.localAreaNodes.unk_0[4], 'x', WatchInterpretation::_u8);
- hudConsole->addWatch(page, "AreaNodes5:", &gameInfo.localAreaNodes.unk_0[5], 'x', WatchInterpretation::_u8);
- hudConsole->addWatch(page, "AreaNodes6:", &gameInfo.localAreaNodes.unk_0[6], 'x', WatchInterpretation::_u8);
- hudConsole->addWatch(page, "AreaNodes7:", &gameInfo.localAreaNodes.unk_0[7], 'x', WatchInterpretation::_u8);
- hudConsole->addWatch(page, "AreaNodes8:", &gameInfo.localAreaNodes.unk_0[8], 'x', WatchInterpretation::_u8);
- hudConsole->addWatch(page, "AreaNodes9:", &gameInfo.localAreaNodes.unk_0[9], 'x', WatchInterpretation::_u8);
- page = hudConsole->addPage("Local Area 2");
- hudConsole->addWatch(page, "AreaNodes10:", &gameInfo.localAreaNodes.unk_0[10], 'x', WatchInterpretation::_u8);
- hudConsole->addWatch(page, "AreaNodes11:", &gameInfo.localAreaNodes.unk_0[11], 'x', WatchInterpretation::_u8);
- hudConsole->addWatch(page, "AreaNodes12:", &gameInfo.localAreaNodes.unk_0[12], 'x', WatchInterpretation::_u8);
- hudConsole->addWatch(page, "AreaNodes13:", &gameInfo.localAreaNodes.unk_0[13], 'x', WatchInterpretation::_u8);
- hudConsole->addWatch(page, "AreaNodes14:", &gameInfo.localAreaNodes.unk_0[14], 'x', WatchInterpretation::_u8);
- hudConsole->addWatch(page, "AreaNodes15:", &gameInfo.localAreaNodes.unk_0[15], 'x', WatchInterpretation::_u8);
- hudConsole->addWatch(page, "AreaNodes16:", &gameInfo.localAreaNodes.unk_0[16], 'x', WatchInterpretation::_u8);
- hudConsole->addWatch(page, "AreaNodes17:", &gameInfo.localAreaNodes.unk_0[17], 'x', WatchInterpretation::_u8);
- hudConsole->addWatch(page, "AreaNodes18:", &gameInfo.localAreaNodes.unk_0[18], 'x', WatchInterpretation::_u8);
- hudConsole->addWatch(page, "AreaNodes19:", &gameInfo.localAreaNodes.unk_0[19], 'x', WatchInterpretation::_u8);
- page = hudConsole->addPage("Local Area 3");
- hudConsole->addWatch(page, "AreaNodes20:", &gameInfo.localAreaNodes.unk_0[20], 'x', WatchInterpretation::_u8);
- hudConsole->addWatch(page, "AreaNodes21:", &gameInfo.localAreaNodes.unk_0[21], 'x', WatchInterpretation::_u8);
- hudConsole->addWatch(page, "AreaNodes22:", &gameInfo.localAreaNodes.unk_0[22], 'x', WatchInterpretation::_u8);
- hudConsole->addWatch(page, "AreaNodes23:", &gameInfo.localAreaNodes.unk_0[23], 'x', WatchInterpretation::_u8);
- hudConsole->addWatch(page, "AreaNodes24:", &gameInfo.localAreaNodes.unk_0[24], 'x', WatchInterpretation::_u8);
- hudConsole->addWatch(page, "AreaNodes25:", &gameInfo.localAreaNodes.unk_0[25], 'x', WatchInterpretation::_u8);
- hudConsole->addWatch(page, "AreaNodes26:", &gameInfo.localAreaNodes.unk_0[26], 'x', WatchInterpretation::_u8);
- hudConsole->addWatch(page, "AreaNodes27:", &gameInfo.localAreaNodes.unk_0[27], 'x', WatchInterpretation::_u8);
- hudConsole->addWatch(page, "NbKeys:", &gameInfo.localAreaNodes.nbKeys, 'x', WatchInterpretation::_u8);
- hudConsole->addWatch(page, "Dungeon flags:", &gameInfo.localAreaNodes.dungeon, 'x', WatchInterpretation::_u8);
- page = hudConsole->addPage("Local Area 4");
- hudConsole->addWatch(page, "AreaNodes30:", &gameInfo.localAreaNodes.unk_1E[0], 'x', WatchInterpretation::_u8);
- hudConsole->addWatch(page, "AreaNodes31:", &gameInfo.localAreaNodes.unk_1E[1], 'x', WatchInterpretation::_u8);*/
-
- //item slots
- /*page = hudConsole->addPage("Item slots 1");
- hudConsole->addWatch(page, "Boomerang:", &gameInfo.scratchPad.itemWeel.Boomerang, 'x', WatchInterpretation::_u8);
- hudConsole->addWatch(page, "Slot 1:", &gameInfo.scratchPad.itemSlots[0x1], 'x', WatchInterpretation::_u8);
-
- hudConsole->addWatch(page, "flags1:", &gameInfo.scratchPad.itemFlags.itemFlags1, 'x', WatchInterpretation::_u64);
- hudConsole->addWatch(page, "flags2:", &gameInfo.scratchPad.itemFlags.itemFlags2, 'x', WatchInterpretation::_u64);
- hudConsole->addWatch(page, "flags3:", &gameInfo.scratchPad.itemFlags.itemFlags3, 'x', WatchInterpretation::_u64);
- hudConsole->addWatch(page, "falgs4:", &gameInfo.scratchPad.itemFlags.itemFlags4, 'x', WatchInterpretation::_u64);*/
-
- /*page = hudConsole->addPage("Warps 1");
- hudConsole->addOption(page, "Mirror Chamber:", &gameInfo.scratchPad.allAreaNodes.Gerudo_Desert.unk_0[0xE], 0xFF);
- hudConsole->addOption(page, "Gerudo Mesa:", &gameInfo.scratchPad.allAreaNodes.Gerudo_Desert.unk_0[0x9], 0xFF);
- hudConsole->addOption(page, "Snowpeak Top:", &gameInfo.scratchPad.allAreaNodes.Snowpeak.unk_0[0x9], 0xFF);
- hudConsole->addOption(page, "Sacred Grove:", &gameInfo.scratchPad.allAreaNodes.Sacred_Grove.unk_0[0x17], 0xFF);
- hudConsole->addOption(page, "Eldin Bridge:", &gameInfo.scratchPad.allAreaNodes.Hyrule_Field.unk_0[0x17], 0xFF);
- hudConsole->addOption(page, "Castle Town:", &gameInfo.scratchPad.allAreaNodes.Hyrule_Field.unk_0[0xB], 0xFF);
- hudConsole->addOption(page, "Kakariko Gorge:", &gameInfo.scratchPad.allAreaNodes.Hyrule_Field.unk_0[0x9], 0xFF);
- hudConsole->addOption(page, "Zoras Domain:", &gameInfo.scratchPad.allAreaNodes.Lanyru.unk_0[0xB], 0xFF);
- hudConsole->addOption(page, "Lake Hylia:", &gameInfo.scratchPad.allAreaNodes.Lanyru.unk_0[0xA], 0xFF);
- hudConsole->addOption(page, "Zora River:", &gameInfo.scratchPad.allAreaNodes.Lanyru.unk_0[0x9], 0xFF);
-
- hudConsole->addWatch(page, "Mirror Chamber:", &gameInfo.scratchPad.allAreaNodes.Gerudo_Desert.unk_0[0xE], 'x', WatchInterpretation::_u8);//1
- hudConsole->addWatch(page, "Gerudo Mesa:", &gameInfo.scratchPad.allAreaNodes.Gerudo_Desert.unk_0[0x9], 'x', WatchInterpretation::_u8);//32
- hudConsole->addWatch(page, "Snowpeak Top:", &gameInfo.scratchPad.allAreaNodes.Snowpeak.unk_0[0x9], 'x', WatchInterpretation::_u8);//32
- hudConsole->addWatch(page, "Sacred Grove:", &gameInfo.scratchPad.allAreaNodes.Sacred_Grove.unk_0[0x17], 'x', WatchInterpretation::_u8);//16
- hudConsole->addWatch(page, "Eldin Bridge:", &gameInfo.scratchPad.allAreaNodes.Hyrule_Field.unk_0[0x17], 'x', WatchInterpretation::_u8);//8
- hudConsole->addWatch(page, "Castle Town:", &gameInfo.scratchPad.allAreaNodes.Hyrule_Field.unk_0[0xB], 'x', WatchInterpretation::_u8);//8
- hudConsole->addWatch(page, "Kakariko Gorge:", &gameInfo.scratchPad.allAreaNodes.Hyrule_Field.unk_0[0x9], 'x', WatchInterpretation::_u8);//32
- hudConsole->addWatch(page, "Zoras Domain:", &gameInfo.scratchPad.allAreaNodes.Lanyru.unk_0[0xB], 'x', WatchInterpretation::_u8);//4
- hudConsole->addWatch(page, "Lake Hylia:", &gameInfo.scratchPad.allAreaNodes.Lanyru.unk_0[0xA], 'x', WatchInterpretation::_u8);//4
- hudConsole->addWatch(page, "Zora River:", &gameInfo.scratchPad.allAreaNodes.Lanyru.unk_0[0x9], 'x', WatchInterpretation::_u8);//32
- page = hudConsole->addPage("Warps 2");
- hudConsole->addOption(page, "Death Mountain:", &gameInfo.scratchPad.allAreaNodes.Eldin.unk_0[0x9], 0xFF);
- hudConsole->addOption(page, "Kakariko:", &gameInfo.scratchPad.allAreaNodes.Eldin.unk_0[0x8], 0xFF);
- hudConsole->addOption(page, "South Faron:", &gameInfo.scratchPad.allAreaNodes.Faron.unk_0[0x13], 0xFF);
- hudConsole->addOption(page, "North Faron:", &gameInfo.scratchPad.allAreaNodes.Faron.unk_0[0xB], 0xFF);
- hudConsole->addOption(page, "Ordon Spring:", &gameInfo.scratchPad.allAreaNodes.Ordon.unk_0[0xD], 0xFF);
-
- hudConsole->addWatch(page, "Death Mountain:", &gameInfo.scratchPad.allAreaNodes.Eldin.unk_0[0x9], 'x', WatchInterpretation::_u8);//32
- hudConsole->addWatch(page, "Kakariko:", &gameInfo.scratchPad.allAreaNodes.Eldin.unk_0[0x8], 'x', WatchInterpretation::_u8);//128
- hudConsole->addWatch(page, "South Faron:", &gameInfo.scratchPad.allAreaNodes.Faron.unk_0[0x13], 'x', WatchInterpretation::_u8);//128
- hudConsole->addWatch(page, "North Faron:", &gameInfo.scratchPad.allAreaNodes.Faron.unk_0[0xB], 'x', WatchInterpretation::_u8);//4
- hudConsole->addWatch(page, "Ordon Spring:", &gameInfo.scratchPad.allAreaNodes.Ordon.unk_0[0xD], 'x', WatchInterpretation::_u8);//16*/
-
-
- // save load
- /*page = hudConsole->addPage("Save load");
-
- hudConsole->addOption(page, "stage:", &stage, 78); //for testing only
- hudConsole->addOption(page, "room:", &room, 60); //for testing only
- hudConsole->addOption(page, "spawn:", &spawn, 0xFF); //for testing only
- hudConsole->addOption(page, "state:", &state, 0xFF); //for testing only
- hudConsole->addOption(page, "trigger:", &trigerLoadSave, 0x1); //for testing only*/
-
+ hudConsole->addOption(page, "GM Story Flag?", &Singleton::getInstance()->isGMStoryPatch, 0x1);
+ hudConsole->addOption(page, "Start w/ Crstl?", &Singleton::getInstance()->startWithCrystal, 0x1);
+
+ hudConsole->addWatch(page, "CurrentEventID:", &gameInfo.eventSystem.currentEventID, 'x', WatchInterpretation::_u8);
+ hudConsole->addWatch(page, "NextEventID:", &gameInfo.eventSystem.nextEventID, 'x', WatchInterpretation::_u8);
+ hudConsole->addWatch(page, "NextStage:", &gameInfo.nextStageVars.nextStage, 's', WatchInterpretation::_str);
+ hudConsole->addWatch(page, "NextRoom:", &gameInfo.nextStageVars.nextRoom, 'd', WatchInterpretation::_u8);
+ hudConsole->addWatch(page, "NextSpawnPoint:", &gameInfo.nextStageVars.nextSpawnPoint, 'x', WatchInterpretation::_u8);
+ hudConsole->addWatch(page, "NextSate:", &gameInfo.nextStageVars.nextState, 'x', WatchInterpretation::_u8);
+
+ //Cosmetic Changes
+ page = hudConsole->addPage("Cosmetic");
+ hudConsole->addOption(page, "LTN In Rd:", &innerRed, 0xFF);
+ hudConsole->addOption(page, "LTN In Green:", &innerGreen, 0xFF);
+ hudConsole->addOption(page, "LTN In Blue:", &innerBlue, 0xFF);
+ hudConsole->addOption(page, "LTN Ot Red:", &outerRed, 0xFF);
+ hudConsole->addOption(page, "LTN Ot Green:", &outerGreen, 0xFF);
+ hudConsole->addOption(page, "LTN Ot Blue:", &outerBlue, 0xFF);
+
+ //local area
+ /*page = hudConsole->addPage("Local Area 1");
+ hudConsole->addWatch(page, "AreaNodes0:", &gameInfo.localAreaNodes.unk_0[0], 'x', WatchInterpretation::_u8);
+ hudConsole->addWatch(page, "AreaNodes1:", &gameInfo.localAreaNodes.unk_0[1], 'x', WatchInterpretation::_u8);
+ hudConsole->addWatch(page, "AreaNodes2:", &gameInfo.localAreaNodes.unk_0[2], 'x', WatchInterpretation::_u8);
+ hudConsole->addWatch(page, "AreaNodes3:", &gameInfo.localAreaNodes.unk_0[3], 'x', WatchInterpretation::_u8);
+ hudConsole->addWatch(page, "AreaNodes4:", &gameInfo.localAreaNodes.unk_0[4], 'x', WatchInterpretation::_u8);
+ hudConsole->addWatch(page, "AreaNodes5:", &gameInfo.localAreaNodes.unk_0[5], 'x', WatchInterpretation::_u8);
+ hudConsole->addWatch(page, "AreaNodes6:", &gameInfo.localAreaNodes.unk_0[6], 'x', WatchInterpretation::_u8);
+ hudConsole->addWatch(page, "AreaNodes7:", &gameInfo.localAreaNodes.unk_0[7], 'x', WatchInterpretation::_u8);
+ hudConsole->addWatch(page, "AreaNodes8:", &gameInfo.localAreaNodes.unk_0[8], 'x', WatchInterpretation::_u8);
+ hudConsole->addWatch(page, "AreaNodes9:", &gameInfo.localAreaNodes.unk_0[9], 'x', WatchInterpretation::_u8);
+ page = hudConsole->addPage("Local Area 2");
+ hudConsole->addWatch(page, "AreaNodes10:", &gameInfo.localAreaNodes.unk_0[10], 'x', WatchInterpretation::_u8);
+ hudConsole->addWatch(page, "AreaNodes11:", &gameInfo.localAreaNodes.unk_0[11], 'x', WatchInterpretation::_u8);
+ hudConsole->addWatch(page, "AreaNodes12:", &gameInfo.localAreaNodes.unk_0[12], 'x', WatchInterpretation::_u8);
+ hudConsole->addWatch(page, "AreaNodes13:", &gameInfo.localAreaNodes.unk_0[13], 'x', WatchInterpretation::_u8);
+ hudConsole->addWatch(page, "AreaNodes14:", &gameInfo.localAreaNodes.unk_0[14], 'x', WatchInterpretation::_u8);
+ hudConsole->addWatch(page, "AreaNodes15:", &gameInfo.localAreaNodes.unk_0[15], 'x', WatchInterpretation::_u8);
+ hudConsole->addWatch(page, "AreaNodes16:", &gameInfo.localAreaNodes.unk_0[16], 'x', WatchInterpretation::_u8);
+ hudConsole->addWatch(page, "AreaNodes17:", &gameInfo.localAreaNodes.unk_0[17], 'x', WatchInterpretation::_u8);
+ hudConsole->addWatch(page, "AreaNodes18:", &gameInfo.localAreaNodes.unk_0[18], 'x', WatchInterpretation::_u8);
+ hudConsole->addWatch(page, "AreaNodes19:", &gameInfo.localAreaNodes.unk_0[19], 'x', WatchInterpretation::_u8);
+ page = hudConsole->addPage("Local Area 3");
+ hudConsole->addWatch(page, "AreaNodes20:", &gameInfo.localAreaNodes.unk_0[20], 'x', WatchInterpretation::_u8);
+ hudConsole->addWatch(page, "AreaNodes21:", &gameInfo.localAreaNodes.unk_0[21], 'x', WatchInterpretation::_u8);
+ hudConsole->addWatch(page, "AreaNodes22:", &gameInfo.localAreaNodes.unk_0[22], 'x', WatchInterpretation::_u8);
+ hudConsole->addWatch(page, "AreaNodes23:", &gameInfo.localAreaNodes.unk_0[23], 'x', WatchInterpretation::_u8);
+ hudConsole->addWatch(page, "AreaNodes24:", &gameInfo.localAreaNodes.unk_0[24], 'x', WatchInterpretation::_u8);
+ hudConsole->addWatch(page, "AreaNodes25:", &gameInfo.localAreaNodes.unk_0[25], 'x', WatchInterpretation::_u8);
+ hudConsole->addWatch(page, "AreaNodes26:", &gameInfo.localAreaNodes.unk_0[26], 'x', WatchInterpretation::_u8);
+ hudConsole->addWatch(page, "AreaNodes27:", &gameInfo.localAreaNodes.unk_0[27], 'x', WatchInterpretation::_u8);
+ hudConsole->addWatch(page, "NbKeys:", &gameInfo.localAreaNodes.nbKeys, 'x', WatchInterpretation::_u8);
+ hudConsole->addWatch(page, "Dungeon flags:", &gameInfo.localAreaNodes.dungeon, 'x', WatchInterpretation::_u8);
+ page = hudConsole->addPage("Local Area 4");
+ hudConsole->addWatch(page, "AreaNodes30:", &gameInfo.localAreaNodes.unk_1E[0], 'x', WatchInterpretation::_u8);
+ hudConsole->addWatch(page, "AreaNodes31:", &gameInfo.localAreaNodes.unk_1E[1], 'x', WatchInterpretation::_u8);*/
+
+ //item slots
+ /*page = hudConsole->addPage("Item slots 1");
+ hudConsole->addWatch(page, "Boomerang:", &gameInfo.scratchPad.itemWeel.Boomerang, 'x', WatchInterpretation::_u8);
+ hudConsole->addWatch(page, "Slot 1:", &gameInfo.scratchPad.itemSlots[0x1], 'x', WatchInterpretation::_u8);
+
+ hudConsole->addWatch(page, "flags1:", &gameInfo.scratchPad.itemFlags.itemFlags1, 'x', WatchInterpretation::_u64);
+ hudConsole->addWatch(page, "flags2:", &gameInfo.scratchPad.itemFlags.itemFlags2, 'x', WatchInterpretation::_u64);
+ hudConsole->addWatch(page, "flags3:", &gameInfo.scratchPad.itemFlags.itemFlags3, 'x', WatchInterpretation::_u64);
+ hudConsole->addWatch(page, "falgs4:", &gameInfo.scratchPad.itemFlags.itemFlags4, 'x', WatchInterpretation::_u64);*/
+
+ /*page = hudConsole->addPage("Warps 1");
+ hudConsole->addOption(page, "Mirror Chamber:", &gameInfo.scratchPad.allAreaNodes.Gerudo_Desert.unk_0[0xE], 0xFF);
+ hudConsole->addOption(page, "Gerudo Mesa:", &gameInfo.scratchPad.allAreaNodes.Gerudo_Desert.unk_0[0x9], 0xFF);
+ hudConsole->addOption(page, "Snowpeak Top:", &gameInfo.scratchPad.allAreaNodes.Snowpeak.unk_0[0x9], 0xFF);
+ hudConsole->addOption(page, "Sacred Grove:", &gameInfo.scratchPad.allAreaNodes.Sacred_Grove.unk_0[0x17], 0xFF);
+ hudConsole->addOption(page, "Eldin Bridge:", &gameInfo.scratchPad.allAreaNodes.Hyrule_Field.unk_0[0x17], 0xFF);
+ hudConsole->addOption(page, "Castle Town:", &gameInfo.scratchPad.allAreaNodes.Hyrule_Field.unk_0[0xB], 0xFF);
+ hudConsole->addOption(page, "Kakariko Gorge:", &gameInfo.scratchPad.allAreaNodes.Hyrule_Field.unk_0[0x9], 0xFF);
+ hudConsole->addOption(page, "Zoras Domain:", &gameInfo.scratchPad.allAreaNodes.Lanyru.unk_0[0xB], 0xFF);
+ hudConsole->addOption(page, "Lake Hylia:", &gameInfo.scratchPad.allAreaNodes.Lanyru.unk_0[0xA], 0xFF);
+ hudConsole->addOption(page, "Zora River:", &gameInfo.scratchPad.allAreaNodes.Lanyru.unk_0[0x9], 0xFF);
+
+ hudConsole->addWatch(page, "Mirror Chamber:", &gameInfo.scratchPad.allAreaNodes.Gerudo_Desert.unk_0[0xE], 'x', WatchInterpretation::_u8);//1
+ hudConsole->addWatch(page, "Gerudo Mesa:", &gameInfo.scratchPad.allAreaNodes.Gerudo_Desert.unk_0[0x9], 'x', WatchInterpretation::_u8);//32
+ hudConsole->addWatch(page, "Snowpeak Top:", &gameInfo.scratchPad.allAreaNodes.Snowpeak.unk_0[0x9], 'x', WatchInterpretation::_u8);//32
+ hudConsole->addWatch(page, "Sacred Grove:", &gameInfo.scratchPad.allAreaNodes.Sacred_Grove.unk_0[0x17], 'x', WatchInterpretation::_u8);//16
+ hudConsole->addWatch(page, "Eldin Bridge:", &gameInfo.scratchPad.allAreaNodes.Hyrule_Field.unk_0[0x17], 'x', WatchInterpretation::_u8);//8
+ hudConsole->addWatch(page, "Castle Town:", &gameInfo.scratchPad.allAreaNodes.Hyrule_Field.unk_0[0xB], 'x', WatchInterpretation::_u8);//8
+ hudConsole->addWatch(page, "Kakariko Gorge:", &gameInfo.scratchPad.allAreaNodes.Hyrule_Field.unk_0[0x9], 'x', WatchInterpretation::_u8);//32
+ hudConsole->addWatch(page, "Zoras Domain:", &gameInfo.scratchPad.allAreaNodes.Lanyru.unk_0[0xB], 'x', WatchInterpretation::_u8);//4
+ hudConsole->addWatch(page, "Lake Hylia:", &gameInfo.scratchPad.allAreaNodes.Lanyru.unk_0[0xA], 'x', WatchInterpretation::_u8);//4
+ hudConsole->addWatch(page, "Zora River:", &gameInfo.scratchPad.allAreaNodes.Lanyru.unk_0[0x9], 'x', WatchInterpretation::_u8);//32
+ page = hudConsole->addPage("Warps 2");
+ hudConsole->addOption(page, "Death Mountain:", &gameInfo.scratchPad.allAreaNodes.Eldin.unk_0[0x9], 0xFF);
+ hudConsole->addOption(page, "Kakariko:", &gameInfo.scratchPad.allAreaNodes.Eldin.unk_0[0x8], 0xFF);
+ hudConsole->addOption(page, "South Faron:", &gameInfo.scratchPad.allAreaNodes.Faron.unk_0[0x13], 0xFF);
+ hudConsole->addOption(page, "North Faron:", &gameInfo.scratchPad.allAreaNodes.Faron.unk_0[0xB], 0xFF);
+ hudConsole->addOption(page, "Ordon Spring:", &gameInfo.scratchPad.allAreaNodes.Ordon.unk_0[0xD], 0xFF);
+
+ hudConsole->addWatch(page, "Death Mountain:", &gameInfo.scratchPad.allAreaNodes.Eldin.unk_0[0x9], 'x', WatchInterpretation::_u8);//32
+ hudConsole->addWatch(page, "Kakariko:", &gameInfo.scratchPad.allAreaNodes.Eldin.unk_0[0x8], 'x', WatchInterpretation::_u8);//128
+ hudConsole->addWatch(page, "South Faron:", &gameInfo.scratchPad.allAreaNodes.Faron.unk_0[0x13], 'x', WatchInterpretation::_u8);//128
+ hudConsole->addWatch(page, "North Faron:", &gameInfo.scratchPad.allAreaNodes.Faron.unk_0[0xB], 'x', WatchInterpretation::_u8);//4
+ hudConsole->addWatch(page, "Ordon Spring:", &gameInfo.scratchPad.allAreaNodes.Ordon.unk_0[0xD], 'x', WatchInterpretation::_u8);//16*/
+
+
+ // save load
+ /*page = hudConsole->addPage("Save load");
+
+ hudConsole->addOption(page, "stage:", &stage, 78); //for testing only
+ hudConsole->addOption(page, "room:", &room, 60); //for testing only
+ hudConsole->addOption(page, "spawn:", &spawn, 0xFF); //for testing only
+ hudConsole->addOption(page, "state:", &state, 0xFF); //for testing only
+ hudConsole->addOption(page, "trigger:", &trigerLoadSave, 0x1); //for testing only*/
+
/*page = hudConsole->addPage("testing adr1");
@@ -408,32 +429,32 @@ namespace mod
hudConsole->addWatch(page, "1D5:", &gameInfo.scratchPad.unk_1D5[0x0], 'x', WatchInterpretation::_u64);
hudConsole->addWatch(page, "1DD:", &gameInfo.scratchPad.unk_1D5[0x8], 'x', WatchInterpretation::_u32);
hudConsole->addWatch(page, "1E4:", &gameInfo.scratchPad.unk_1E4[0x0], 'x', WatchInterpretation::_u64);
- hudConsole->addWatch(page, "1EC:", &gameInfo.scratchPad.unk_1E4[0x8], 'x', WatchInterpretation::_u32);*/
-
-
- // Print
- hudConsole->draw();
- system_console::setState(true, 0);
-
- // =================
- // | Custom events |
- // =================
-
- // Generate random data when a new game starts
- eventListener->addLoadEvent(stage::allStages[Stage_Faron_Woods], 0x1, 0x15, 0xFF, 0xFF, tools::triggerRandomGenerator, event::LoadEventAccuracy::Stage_Room_Spawn);
-
- // Skip sewers when the load happens
- eventListener->addLoadEvent(stage::allStages[Stage_Hyrule_Castle_Sewers], 0x0, 0x18, 0xFF, 0xFF, game_patch::skipSewers, event::LoadEventAccuracy::Stage_Room_Spawn);
-
- // Fix BiTE
- //eventListener->addLoadEvent(stage::allStages[Stage_Title_Screen], 0x0, 0x17, 0xFF, 0xFF, game_patch::giveEpona, event::LoadEventAccuracy::Stage_Room_Spawn);
-
- // Kill spider at Link's house
- eventListener->addLoadEvent(stage::allStages[Stage_Ordon_Village], 0x1, 0xFF, 0xFF, 0xFF, game_patch::killLinkHouseSpider, event::LoadEventAccuracy::Stage_Room);
-
- //Set Bublin Camp State
- eventListener->addLoadEvent(stage::allStages[Stage_Bublin_Camp], 0xFF, 0xFF, 0x1, 0xFF, game_patch::setBublinState, event::LoadEventAccuracy::Stage_Room_Spawn);
-
+ hudConsole->addWatch(page, "1EC:", &gameInfo.scratchPad.unk_1E4[0x8], 'x', WatchInterpretation::_u32);*/
+
+
+ // Print
+ hudConsole->draw();
+ system_console::setState(true, 0);
+
+ // =================
+ // | Custom events |
+ // =================
+
+ // Generate random data when a new game starts
+ eventListener->addLoadEvent(stage::allStages[Stage_Faron_Woods], 0x1, 0x15, 0xFF, 0xFF, tools::triggerRandomGenerator, event::LoadEventAccuracy::Stage_Room_Spawn);
+
+ // Skip sewers when the load happens
+ eventListener->addLoadEvent(stage::allStages[Stage_Hyrule_Castle_Sewers], 0x0, 0x18, 0xFF, 0xFF, game_patch::skipSewers, event::LoadEventAccuracy::Stage_Room_Spawn);
+
+ // Fix BiTE
+ //eventListener->addLoadEvent(stage::allStages[Stage_Title_Screen], 0x0, 0x17, 0xFF, 0xFF, game_patch::giveEpona, event::LoadEventAccuracy::Stage_Room_Spawn);
+
+ // Kill spider at Link's house
+ eventListener->addLoadEvent(stage::allStages[Stage_Ordon_Village], 0x1, 0xFF, 0xFF, 0xFF, game_patch::killLinkHouseSpider, event::LoadEventAccuracy::Stage_Room);
+
+ //Set Bublin Camp State
+ eventListener->addLoadEvent(stage::allStages[Stage_Bublin_Camp], 0xFF, 0xFF, 0x1, 0xFF, game_patch::setBublinState, event::LoadEventAccuracy::Stage_Room_Spawn);
+
//unlock HF gates and check for MDH
eventListener->addLoadEvent(stage::allStages[Stage_Hyrule_Field], 0xFF, 0xFF, 0xFF, 0xFF, game_patch::setFieldBits, event::LoadEventAccuracy::Stage);
@@ -442,9 +463,6 @@ namespace mod
//skip MS Puzzle
eventListener->addLoadEvent(stage::allStages[Stage_Sacred_Grove], 0xFF, 0xFF, 0xFF, 0xFF, game_patch::setGroveFlags, event::LoadEventAccuracy::Stage);
-
- //skip Cart Escort
- eventListener->addLoadEvent(stage::allStages[Stage_Hyrule_Field], 0xC, 0x2, 0xFF, 0xFF, game_patch::skipCartEscort, event::LoadEventAccuracy::Stage_Room_Spawn);
//Fix Lanayru Softlock
eventListener->addLoadEvent(stage::allStages[Stage_Lake_Hylia], 0x0, 0x5, 0xE, 0xFF, game_patch::setLanayruWolf, event::LoadEventAccuracy::Stage_Room_Spawn);
@@ -462,7 +480,7 @@ namespace mod
eventListener->addLoadEvent(stage::allStages[Stage_Lake_Hylia], 0x1, 0x16, 0xFF, 0xFF, game_patch::skipMDHCS, event::LoadEventAccuracy::Stage_Room_Spawn);
//Fix FT Boss Music
- eventListener->addLoadEvent(stage::allStages[Stage_Diababa], 0x32, 0x1, 0xFF, 0xFF, game_patch::fixFTBossMusic, event::LoadEventAccuracy::Stage);
+ eventListener->addLoadEvent(stage::allStages[Stage_Diababa], 0xFF, 0xFF, 0xFF, 0xFF, game_patch::fixFTBossMusic, event::LoadEventAccuracy::Stage);
// Allow Faron Escape
eventListener->addLoadEvent(stage::allStages[Stage_Faron_Woods], 0xFF, 0xFF, 0xFF, 0xFF, game_patch::allowFaronEscape, event::LoadEventAccuracy::Stage);
@@ -470,22 +488,53 @@ namespace mod
//Skip MDH After Lanayru
eventListener->addLoadEvent(stage::allStages[Stage_Lake_Hylia], 0x1, 0x14, 0xFF, 0xFF, game_patch::skipMDH, event::LoadEventAccuracy::Stage_Room_Spawn);
- //Set Lantern gotten from Coro Flag
- eventListener->addLoadEvent(stage::allStages[Stage_Faron_Woods], 0xFF, 0x0, 0xFF, 0xFF, game_patch::setLanternFlag, event::LoadEventAccuracy::Stage_Room_Spawn);
+ //set Coro Lantern Flag
+ eventListener->addLoadEvent(stage::allStages[Stage_Faron_Woods], 0xFF, 0xFF, 0xFF, 0xFF, game_patch::setLanternFlag, event::LoadEventAccuracy::Stage_Room_Spawn);
+ //unset dungeon flags after beating dungeon
+ eventListener->addLoadEvent(stage::allStages[Stage_Forest_Temple], 0xFF, 0xFF, 0xFF, 0xFF, game_patch::fixFTState, event::LoadEventAccuracy::Stage_Room_Spawn);
+ eventListener->addLoadEvent(stage::allStages[Stage_Goron_Mines], 0xFF, 0xFF, 0xFF, 0xFF, game_patch::fixGMState, event::LoadEventAccuracy::Stage_Room_Spawn);
+ eventListener->addLoadEvent(stage::allStages[Stage_Lakebed_Temple], 0xFF, 0xFF, 0xFF, 0xFF, game_patch::fixLBTState, event::LoadEventAccuracy::Stage_Room_Spawn);
+ eventListener->addLoadEvent(stage::allStages[Stage_Arbiters_Grounds], 0xFF, 0xFF, 0xFF, 0xFF, game_patch::fixAGState, event::LoadEventAccuracy::Stage_Room_Spawn);
+ eventListener->addLoadEvent(stage::allStages[Stage_Snowpeak_Ruins], 0xFF, 0xFF, 0xFF, 0xFF, game_patch::fixSPRState, event::LoadEventAccuracy::Stage_Room_Spawn);
+ eventListener->addLoadEvent(stage::allStages[Stage_Temple_of_Time], 0xFF, 0xFF, 0xFF, 0xFF, game_patch::fixToTState, event::LoadEventAccuracy::Stage_Room_Spawn);
+ eventListener->addLoadEvent(stage::allStages[Stage_City_in_the_Sky], 0xFF, 0xFF, 0xFF, 0xFF, game_patch::fixCiTSState, event::LoadEventAccuracy::Stage_Room_Spawn);
+
+ //set dungeon and boss flags
+ eventListener->addLoadEvent(stage::allStages[Stage_Faron_Woods], 0xFF, 0xFF, 0xFF, 0xFF, game_patch::setFTDungeonFlag, event::LoadEventAccuracy::Stage_Room_Spawn);
+
+ eventListener->addLoadEvent(stage::allStages[Stage_Death_Mountain_Sumo_Hall], 0xFF, 0xFF, 0xFF, 0xFF, game_patch::setGMDungeonFlag, event::LoadEventAccuracy::Stage_Room_Spawn);
+ eventListener->addLoadEvent(stage::allStages[Stage_Kakariko_Village], 0xFF, 0xFF, 0xFF, 0xFF, game_patch::setGMDungeonFlag, event::LoadEventAccuracy::Stage_Room_Spawn);
+ eventListener->addLoadEvent(stage::allStages[Stage_Fyrus], 0xFF, 0xFF, 0xFF, 0xFF, game_patch::setGMBossFlag, event::LoadEventAccuracy::Stage_Room_Spawn);
+
+ eventListener->addLoadEvent(stage::allStages[Stage_Lake_Hylia], 0xFF, 0xFF, 0xFF, 0xFF, game_patch::setLakeDungeonFlags, event::LoadEventAccuracy::Stage_Room_Spawn);
+ eventListener->addLoadEvent(stage::allStages[Stage_Morpheel], 0xFF, 0xFF, 0xFF, 0xFF, game_patch::setLBTBossFlag, event::LoadEventAccuracy::Stage_Room_Spawn);
+
+ eventListener->addLoadEvent(stage::allStages[Stage_Bublin_Camp], 0xFF, 0xFF, 0xFF, 0xFF, game_patch::setAGDungeonFlag, event::LoadEventAccuracy::Stage_Room_Spawn);
+ eventListener->addLoadEvent(stage::allStages[Stage_Mirror_Chamber], 0xFF, 0xFF, 0xFF, 0xFF, game_patch::setAGDungeonFlag, event::LoadEventAccuracy::Stage_Room_Spawn);
+ eventListener->addLoadEvent(stage::allStages[Stage_Stallord], 0xFF, 0xFF, 0xFF, 0xFF, game_patch::setAGBossFlag, event::LoadEventAccuracy::Stage_Room_Spawn);
+
+ eventListener->addLoadEvent(stage::allStages[Stage_Snowpeak], 0xFF, 0xFF, 0xFF, 0xFF, game_patch::setSPRDungeonFlag, event::LoadEventAccuracy::Stage_Room_Spawn);
+ eventListener->addLoadEvent(stage::allStages[Stage_Blizzeta], 0xFF, 0xFF, 0xFF, 0xFF, game_patch::setSPRBossFlag, event::LoadEventAccuracy::Stage_Room_Spawn);
+
+ eventListener->addLoadEvent(stage::allStages[Stage_Sacred_Grove], 0xFF, 0xFF, 0xFF, 0xFF, game_patch::setToTDungeonFlag, event::LoadEventAccuracy::Stage_Room_Spawn);
+ eventListener->addLoadEvent(stage::allStages[Stage_Armogohma], 0xFF, 0xFF, 0xFF, 0xFF, game_patch::setToTBossFlag, event::LoadEventAccuracy::Stage_Room_Spawn);
+
+ eventListener->addLoadEvent(stage::allStages[Stage_Argorok], 0xFF, 0xFF, 0xFF, 0xFF, game_patch::setCiTSBossFlag, event::LoadEventAccuracy::Stage_Room_Spawn);
+
+ //Break Barrier
+ eventListener->addLoadEvent(stage::allStages[Stage_Castle_Town], 0xFF, 0xFF, 0xFF, 0xFF, game_patch::breakBarrier, event::LoadEventAccuracy::Stage_Room_Spawn);
+ // =================
+ // | Function Hooks |
+ // =================
+
+ fapGm_Execute_trampoline = patch::hookFunction(tp::f_ap_game::fapGm_Execute,
+ []()
+ {
+ global::modPtr->procNewFrame();
+ }
+ );
-
- // =================
- // | Function Hooks |
- // =================
-
- fapGm_Execute_trampoline = patch::hookFunction(tp::f_ap_game::fapGm_Execute,
- []()
- {
- global::modPtr->procNewFrame();
- }
- );
-
// Hook actor init function to use as a timing for placing custom chests as this function only creates actors at
// specific times
actorCommonLayerInit_trampoline = patch::hookFunction(tp::d_stage::actorCommonLayerInit,
@@ -511,80 +560,80 @@ namespace mod
}
return global::modPtr->actorCommonLayerInit_trampoline(mStatus_roomControl, chunkTypeInfo, unk3, unk4);
}
- );
-
-
+ );
+
+
putSave_trampoline = patch::hookFunction(tp::d_save::putSave,
[](tp::d_com_inf_game::GameInfo* gameInfoPtr, s32 areaID)
{
Singleton::getInstance()->hasActorCommonLayerRan = 0;
return global::modPtr->putSave_trampoline(gameInfoPtr, areaID);
}
- );
-
- checkTreasureRupeeReturn_trampoline = patch::hookFunction(tp::d_a_alink::checkTreasureRupeeReturn,
- [](void* unk1, s32 item)
- {
- return global::modPtr->procCheckTreasureRupeeReturn(unk1, item);
- }
- );
-
- createItemForPresentDemo_trampoline = patch::hookFunction(tp::f_op_actor_mng::createItemForPresentDemo,
- [](const float pos[3], s32 item, u8 unk3, s32 unk4, s32 unk5, const float unk6[3], const float unk7[3])
- {
- // Call replacement function
+ );
+
+ checkTreasureRupeeReturn_trampoline = patch::hookFunction(tp::d_a_alink::checkTreasureRupeeReturn,
+ [](void* unk1, s32 item)
+ {
+ return global::modPtr->procCheckTreasureRupeeReturn(unk1, item);
+ }
+ );
+
+ createItemForPresentDemo_trampoline = patch::hookFunction(tp::f_op_actor_mng::createItemForPresentDemo,
+ [](const float pos[3], s32 item, u8 unk3, s32 unk4, s32 unk5, const float unk6[3], const float unk7[3])
+ {
+ // Call replacement function
/*char txt[50];
snprintf(txt, 50, "0 = %f 1 = %f 2 = %f", pos[0], pos[1], pos[2]);
strcpy(sysConsolePtr->consoleLine[20].line, txt);*/
-
- item = global::modPtr->procItemCreateFunc(pos, item, "createItemForPresentDemo");
-
- return global::modPtr->createItemForPresentDemo_trampoline(pos, item, unk3, unk4, unk5, unk6, unk7);
- }
- );
-
-
- createItemForTrBoxDemo_trampoline = patch::hookFunction(tp::f_op_actor_mng::createItemForTrBoxDemo,
- [](const float pos[3], s32 item, s32 unk3, s32 unk4, const float unk5[3], const float unk6[3])
- {
- // Call replacement function
- item = global::modPtr->procItemCreateFunc(pos, item, "createItemForTrBoxDemo");
-
- return global::modPtr->createItemForTrBoxDemo_trampoline(pos, item, unk3, unk4, unk5, unk6);
- }
- );
- //this function is called when the heart spawns, not when link gets it
- //createItemForTrBoxDemo is called when heart container is gotten
- createItemForBoss_trampoline = patch::hookFunction(tp::f_op_actor_mng::createItemForBoss,
- [](const float pos[3], s32 item, s32 unk3, const float unk4[3], const float unk5[3], float unk6, float unk7, s32 unk8)
- {
- // Call replacement function
- item = global::modPtr->procItemCreateFunc(pos, item, "createItemForBoss");
-
- return global::modPtr->createItemForBoss_trampoline(pos, item, unk3, unk4, unk5, unk6, unk7, unk8);
- }
- );
-
- createItemForMidBoss_trampoline = patch::hookFunction(tp::f_op_actor_mng::createItemForMidBoss,
- [](const float pos[3], s32 item, s32 unk3, const float unk4[3], const float unk5[3], s32 unk6, s32 unk7)
- {
- // Call replacement function
- item = global::modPtr->procItemCreateFunc(pos, item, "createItemForMidBoss");
-
- return global::modPtr->createItemForMidBoss_trampoline(pos, item, unk3, unk4, unk5, unk6, unk7);
- }
- );
-
- createItemForDirectGet_trampoline = patch::hookFunction(tp::f_op_actor_mng::createItemForDirectGet,
- [](const float pos[3], s32 item, s32 unk3, const float unk4[3], const float unk5[3], float unk6, float unk7)
- {
- // Call replacement function
- item = global::modPtr->procItemCreateFunc(pos, item, "createItemForDirectGet");
-
- return global::modPtr->createItemForDirectGet_trampoline(pos, item, unk3, unk4, unk5, unk6, unk7);
- }
- );
-
+
+ item = global::modPtr->procItemCreateFunc(pos, item, "createItemForPresentDemo");
+
+ return global::modPtr->createItemForPresentDemo_trampoline(pos, item, unk3, unk4, unk5, unk6, unk7);
+ }
+ );
+
+
+ createItemForTrBoxDemo_trampoline = patch::hookFunction(tp::f_op_actor_mng::createItemForTrBoxDemo,
+ [](const float pos[3], s32 item, s32 unk3, s32 unk4, const float unk5[3], const float unk6[3])
+ {
+ // Call replacement function
+ item = global::modPtr->procItemCreateFunc(pos, item, "createItemForTrBoxDemo");
+
+ return global::modPtr->createItemForTrBoxDemo_trampoline(pos, item, unk3, unk4, unk5, unk6);
+ }
+ );
+ //this function is called when the heart spawns, not when link gets it
+ //createItemForTrBoxDemo is called when heart container is gotten
+ createItemForBoss_trampoline = patch::hookFunction(tp::f_op_actor_mng::createItemForBoss,
+ [](const float pos[3], s32 item, s32 unk3, const float unk4[3], const float unk5[3], float unk6, float unk7, s32 unk8)
+ {
+ // Call replacement function
+ item = global::modPtr->procItemCreateFunc(pos, item, "createItemForBoss");
+
+ return global::modPtr->createItemForBoss_trampoline(pos, item, unk3, unk4, unk5, unk6, unk7, unk8);
+ }
+ );
+
+ createItemForMidBoss_trampoline = patch::hookFunction(tp::f_op_actor_mng::createItemForMidBoss,
+ [](const float pos[3], s32 item, s32 unk3, const float unk4[3], const float unk5[3], s32 unk6, s32 unk7)
+ {
+ // Call replacement function
+ item = global::modPtr->procItemCreateFunc(pos, item, "createItemForMidBoss");
+
+ return global::modPtr->createItemForMidBoss_trampoline(pos, item, unk3, unk4, unk5, unk6, unk7);
+ }
+ );
+
+ createItemForDirectGet_trampoline = patch::hookFunction(tp::f_op_actor_mng::createItemForDirectGet,
+ [](const float pos[3], s32 item, s32 unk3, const float unk4[3], const float unk5[3], float unk6, float unk7)
+ {
+ // Call replacement function
+ item = global::modPtr->procItemCreateFunc(pos, item, "createItemForDirectGet");
+
+ return global::modPtr->createItemForDirectGet_trampoline(pos, item, unk3, unk4, unk5, unk6, unk7);
+ }
+ );
+
createItemForSimpleDemo_trampoline = patch::hookFunction(tp::f_op_actor_mng::createItemForSimpleDemo,
[](const float pos[3], s32 item, s32 unk3, const float unk4[3], const float unk5[3], float unk6, float unk7)
{
@@ -594,36 +643,36 @@ namespace mod
return global::modPtr->createItemForSimpleDemo_trampoline(pos, item, unk3, unk4, unk5, unk6, unk7);
}
);
-
-
- evt_control_Skipper_trampoline = patch::hookFunction(tp::evt_control::skipper,
- [](void* evtPtr)
- {
- return global::modPtr->procEvtSkipper(evtPtr);
- }
- );
-
- query022_trampoline = patch::hookFunction(tp::d_msg_flow::query022,
- [](void* unk1, void* unk2, s32 unk3)
- {
- return global::modPtr->proc_query022(unk1, unk2, unk3);
- }
- );
-
- do_link_trampoline = patch::hookFunction(tp::dynamic_link::do_link,
- [](tp::dynamic_link::DynamicModuleControl* dmc)
- {
- return global::modPtr->procDoLink(dmc);
- }
- );
-
- item_func_UTUWA_HEART_trampoline = patch::hookFunction(tp::d_item::item_func_UTUWA_HEART,
- []()
- {
- return global::modPtr->procItem_func_UTUWA_HEART();
- }
- );
-
+
+
+ evt_control_Skipper_trampoline = patch::hookFunction(tp::evt_control::skipper,
+ [](void* evtPtr)
+ {
+ return global::modPtr->procEvtSkipper(evtPtr);
+ }
+ );
+
+ query022_trampoline = patch::hookFunction(tp::d_msg_flow::query022,
+ [](void* unk1, void* unk2, s32 unk3)
+ {
+ return global::modPtr->proc_query022(unk1, unk2, unk3);
+ }
+ );
+
+ do_link_trampoline = patch::hookFunction(tp::dynamic_link::do_link,
+ [](tp::dynamic_link::DynamicModuleControl* dmc)
+ {
+ return global::modPtr->procDoLink(dmc);
+ }
+ );
+
+ item_func_UTUWA_HEART_trampoline = patch::hookFunction(tp::d_item::item_func_UTUWA_HEART,
+ []()
+ {
+ return global::modPtr->procItem_func_UTUWA_HEART();
+ }
+ );
+
setItemBombNumCount_trampoline = patch::hookFunction(tp::d_com_inf_game::setItemBombNumCount,
[](u32 unk1, u8 bagNb, short amount)
{
@@ -715,11 +764,11 @@ namespace mod
return global::modPtr->setItemBombNumCount_trampoline(unk1, bagNb, amount);
}
- );
- }
-
- void Mod::procNewFrame()
- {
+ );
+ }
+
+ void Mod::procNewFrame()
+ {
float linkPos[3];
getPlayerPos(linkPos);
@@ -743,8 +792,13 @@ namespace mod
snprintf(linkAngle, 30, "%d", static_cast<u16>(tp::d_map_path_dmap::getMapPlayerAngleY()));
}
-
-
+
+ if (gameInfo.nextStageVars.nextSpawnPoint != 0xFF)
+ {
+ lastGoodSpawn = gameInfo.nextStageVars.nextSpawnPoint;
+ }
+
+
if (gameInfo.ColorPtr != nullptr)
{
if (topToggle == 0)
@@ -793,199 +847,201 @@ namespace mod
}
}
}*/
- }
-
- if (trigerLoadSave == 1) {
- trigerLoadSave = 0;
- tools::triggerSaveLoad(stage::allStages[stage], room, spawn, state);
- }
-
- if (!tools::checkItemFlag(ItemFlags::Orange_Rupee))
- {//remove the item get animations for floor pickups (except silver rupee)
+ }
+
+ if (trigerLoadSave == 1) {
+ trigerLoadSave = 0;
+ tools::triggerSaveLoad(stage::allStages[stage], room, spawn, state);
+ }
+
+ if (!tools::checkItemFlag(ItemFlags::Orange_Rupee))
+ {//remove the item get animations for floor pickups (except silver rupee)
u32 loopAmount = sizeof(item::itemGetAnimationFlags) / sizeof(item::itemGetAnimationFlags[0]);
for (u32 i = 0; i < loopAmount; i++)
{
tools::setItemFlag(static_cast<ItemFlags>(item::itemGetAnimationFlags[i]));
- }
- }
-
- if (enableNormalTime == 0 && setDay == 0)
- {//set night
- gameInfo.scratchPad.skyAngle = 0;
- }
- else if (enableNormalTime == 0 && setDay == 1)
- {//set day
- gameInfo.scratchPad.skyAngle = 180;
- }
- // Increment seed
- if (!customSeed)
- {
- tools::getRandom(0);
- }
-
- // If loading has started check for LoadEvents
- if (isLoading)
- {
- eventListener->checkLoadEvents();
- }
-
- if (controller::checkForButtonInputSingleFrame((controller::PadInputs::Button_R | controller::PadInputs::Button_Z)))
- {
- // Toggle console
- system_console::setState(!sysConsolePtr->consoleEnabled, 0);
- }
- else if (tp::d_a_alink::linkStatus)
+ }
+ }
+
+ if (enableNormalTime == 0 && setDay == 0)
+ {//set night
+ gameInfo.scratchPad.skyAngle = 0;
+ }
+ else if (enableNormalTime == 0 && setDay == 1)
+ {//set day
+ gameInfo.scratchPad.skyAngle = 180;
+ }
+ // Increment seed
+ if (!customSeed)
+ {
+ tools::getRandom(0);
+ }
+
+ // If loading has started check for LoadEvents
+ if (isLoading)
+ {
+ eventListener->checkLoadEvents();
+ }
+
+ if (controller::checkForButtonInputSingleFrame((controller::PadInputs::Button_R | controller::PadInputs::Button_Z)))
+ {
+ // Toggle console
+ system_console::setState(!sysConsolePtr->consoleEnabled, 0);
+ }
+
+ if (controller::checkForButtonInputSingleFrame(controller::PadInputs::Button_R | controller::PadInputs::Button_Y))
{
- if (enableQuickTransform == 1 && gameInfo.rButtonText == 0 && ((((gameInfo.aButtonText == 0x24) && gameInfo.eventSystem.eventFlag == 0) && tp::d_a_alink::linkStatus->status == 0x1)) &&
- (gameInfo.scratchPad.eventBits[0xD] & 0x4) != 0 && controller::checkForButtonInputSingleFrame(controller::PadInputs::Button_Z))
+ if (canQuickTransform())
{
- // Make sure Link is actually loaded
- tp::d_com_inf_game::LinkMapVars* linkMapPtr = gameInfo.linkMapPtr;
- if (linkMapPtr)
+ if (gameInfo.linkMapPtr->equippedItem != items::Ball_and_Chain)
{
- if (!((linkMapPtr->isTargeting & 0x400000) != 0 && gameInfo.scratchPad.form == 0))
+ // Transform
+ tp::d_a_alink::procCoMetamorphoseInit(gameInfo.linkMapPtr);
+ }
+
+ }
+ }
+
+ if (canChangeToD() && controller::checkForButtonInputSingleFrame(controller::PadInputs::Button_R | controller::PadInputs::Button_Y))
+ {
+ if (gameInfo.scratchPad.skyAngle >= 105 && gameInfo.scratchPad.skyAngle <= 284)
+ {
+ gameInfo.scratchPad.skyAngle = 285;
+ if (gameInfo.nextStageVars.nextSpawnPoint == 0xFF)
+ {
+ gameInfo.nextStageVars.nextSpawnPoint = lastGoodSpawn;
+ }
+ gameInfo.nextStageVars.triggerLoad |= 1;
+ }
+ else if (gameInfo.scratchPad.skyAngle >= 285 || gameInfo.scratchPad.skyAngle <= 104)
+ {
+ gameInfo.scratchPad.skyAngle = 105;
+ if (gameInfo.nextStageVars.nextSpawnPoint == 0xFF)
+ {
+ gameInfo.nextStageVars.nextSpawnPoint = lastGoodSpawn;
+ }
+ gameInfo.nextStageVars.triggerLoad |= 1;
+ }
+ }
+
+
+ if (sysConsolePtr->consoleEnabled)
+ {
+ if (controller::checkForButtonInputSingleFrame((controller::PadInputs::Button_R | controller::PadInputs::Button_Start)))
+ {
+ chestRandomizer->generate();
+ }
+
+ // Parse inputs of this frame
+ switch (tp::m_do_controller_pad::cpadInfo.buttonInputTrg)
+ {
+ case controller::PadInputs::Button_A:
+ hudConsole->performAction(ConsoleActions::Option_Increase);
+ break;
+
+ case controller::PadInputs::Button_X:
+ hudConsole->performAction(ConsoleActions::Option_Increase, 0x10);
+ break;
+
+ case controller::PadInputs::Button_B:
+ hudConsole->performAction(ConsoleActions::Option_Decrease);
+ break;
+
+ case controller::PadInputs::Button_Y:
+ hudConsole->performAction(ConsoleActions::Option_Decrease, 0x10);
+ break;
+
+ case controller::PadInputs::Button_DPad_Up:
+ hudConsole->performAction(ConsoleActions::Move_Up);
+ break;
+
+ case controller::PadInputs::Button_DPad_Down:
+ hudConsole->performAction(ConsoleActions::Move_Down);
+ break;
+
+ case controller::PadInputs::Button_DPad_Left:
+ hudConsole->performAction(ConsoleActions::Move_Left);
+ break;
+
+ case controller::PadInputs::Button_DPad_Right:
+ hudConsole->performAction(ConsoleActions::Move_Right);
+ break;
+ }
+ hudConsole->draw();
+ }
+
+ if (truePause && sysConsolePtr->consoleEnabled)
+ {
+ // Inputs handled, don't pass onto the game
+ tp::f_op_scene_req::freezeActors = 1;
+ tp::m_do_controller_pad::cpadInfo.buttonInputTrg = 0;
+ tp::m_do_controller_pad::cpadInfo.buttonInput = 0;
+ }
+ else
+ {
+ tp::f_op_scene_req::freezeActors = 0;
+ }
+
+ if (itemSearchID != lastItemSearchID)
+ {
+ lastItemSearchID = itemSearchID;
+
+ strcpy(itemSearchResults, "404");
+
+ for (u16 i = 0; i < chestRandomizer->totalChecks; i++)
+ {
+ item::ItemCheck* check = &item::checks[i];
+ if (check->destination)
+ {
+ if (check->destination->itemID == itemSearchID)
{
- // Transform
- tp::d_a_alink::procCoMetamorphoseInit(linkMapPtr);
+ // Found the source
+ snprintf(itemSearchResults, 40, "ID: %x Stage: %s Room: %d", check->itemID, check->stage, check->room);
}
}
- }
- /*else if (tp::d_a_alink::linkStatus->status == 0x5 && gameInfo.aButtonText == 0x23 && controller::checkForButtonInputSingleFrame(controller::PadInputs::Button_Z) && Singleton::getInstance()->midnaTimeControl == 1 &&
- chestRandomizer->isStageTOD())
- {
- if (gameInfo.scratchPad.skyAngle >= 180 && gameInfo.scratchPad.skyAngle <= 359)
- {
- gameInfo.scratchPad.skyAngle = 0;
- gameInfo.nextStageVars.nextSpawnPoint = 0x0;
- gameInfo.nextStageVars.triggerLoad |= 1;
- }
- else if (gameInfo.scratchPad.skyAngle >= 0 && gameInfo.scratchPad.skyAngle <= 179)
- {
- gameInfo.scratchPad.skyAngle = 180;
- gameInfo.nextStageVars.nextSpawnPoint = 0x0;
- gameInfo.nextStageVars.triggerLoad |= 1;
- }
- }*/
- }
-
- if (sysConsolePtr->consoleEnabled)
- {
- if (controller::checkForButtonInputSingleFrame((controller::PadInputs::Button_R | controller::PadInputs::Button_Start)))
+ }
+ }
+ else if (itemReverseSearchID != lastItemReverseSearchID)
+ {
+ lastItemReverseSearchID = itemReverseSearchID;
+
+ strcpy(itemReverseSearchResults, "404");
+
+ for (u16 i = 0; i < chestRandomizer->totalChecks; i++)
{
- chestRandomizer->generate();
- }
-
- // Parse inputs of this frame
- switch (tp::m_do_controller_pad::cpadInfo.buttonInputTrg)
- {
- case controller::PadInputs::Button_A:
- hudConsole->performAction(ConsoleActions::Option_Increase);
- break;
-
- case controller::PadInputs::Button_X:
- hudConsole->performAction(ConsoleActions::Option_Increase, 0x10);
- break;
-
- case controller::PadInputs::Button_B:
- hudConsole->performAction(ConsoleActions::Option_Decrease);
- break;
-
- case controller::PadInputs::Button_Y:
- hudConsole->performAction(ConsoleActions::Option_Decrease, 0x10);
- break;
-
- case controller::PadInputs::Button_DPad_Up:
- hudConsole->performAction(ConsoleActions::Move_Up);
- break;
-
- case controller::PadInputs::Button_DPad_Down:
- hudConsole->performAction(ConsoleActions::Move_Down);
- break;
-
- case controller::PadInputs::Button_DPad_Left:
- hudConsole->performAction(ConsoleActions::Move_Left);
- break;
-
- case controller::PadInputs::Button_DPad_Right:
- hudConsole->performAction(ConsoleActions::Move_Right);
- break;
- }
- hudConsole->draw();
- }
-
- if (truePause && sysConsolePtr->consoleEnabled)
- {
- // Inputs handled, don't pass onto the game
- tp::f_op_scene_req::freezeActors = 1;
- tp::m_do_controller_pad::cpadInfo.buttonInputTrg = 0;
- tp::m_do_controller_pad::cpadInfo.buttonInput = 0;
- }
- else
- {
- tp::f_op_scene_req::freezeActors = 0;
- }
-
- if (itemSearchID != lastItemSearchID)
- {
- lastItemSearchID = itemSearchID;
-
- strcpy(itemSearchResults, "404");
-
- for (u16 i = 0; i < chestRandomizer->totalChecks; i++)
- {
- item::ItemCheck* check = &item::checks[i];
- if (check->destination)
- {
- if (check->destination->itemID == itemSearchID)
- {
- // Found the source
- snprintf(itemSearchResults, 40, "ID: %x Stage: %s Room: %d", check->itemID, check->stage, check->room);
- }
- }
- }
- }
- else if (itemReverseSearchID != lastItemReverseSearchID)
- {
- lastItemReverseSearchID = itemReverseSearchID;
-
- strcpy(itemReverseSearchResults, "404");
-
- for (u16 i = 0; i < chestRandomizer->totalChecks; i++)
- {
- item::ItemCheck* check = &item::checks[i];
- if (check->source)
- {
- if (check->source->itemID == itemReverseSearchID)
- {
- // Found the source
- snprintf(itemReverseSearchResults, 40, "ID: %x Stage: %s Room: %d", check->itemID, check->stage, check->room);
- }
- }
- }
- }
-
- if (tp::d_a_alink::checkStageName(stage::allStages[Stage_Faron_Woods]))
- {
- if (0xB == gameInfo.eventSystem.currentEventID)
- {
- tools::setCutscene(false, false);
- if (frame_counter == num_frames)
- {
- tools::setItemFlag(ItemFlags::Vessel_Of_Light_Faron);//set flag for vessel since we'll skip it by reloading
- gameInfo.scratchPad.movingActors.exploredRegions.Eldin = 0b1; // Set Eldin Map Unlocked so we can warp there
- tools::setCutscene(true, false);
- }
- else
- {
- frame_counter++;
- }
- }
- else
- {
- frame_counter = 0;
- }
- }
-
+ item::ItemCheck* check = &item::checks[i];
+ if (check->source)
+ {
+ if (check->source->itemID == itemReverseSearchID)
+ {
+ // Found the source
+ snprintf(itemReverseSearchResults, 40, "ID: %x Stage: %s Room: %d", check->itemID, check->stage, check->room);
+ }
+ }
+ }
+ }
+
+ if (tp::d_a_alink::checkStageName(stage::allStages[Stage_Faron_Woods]))
+ {
+ if (0xB == gameInfo.eventSystem.currentEventID)
+ {
+ tools::setCutscene(false, false);
+ if (frame_counter == num_frames)
+ {
+ tools::setItemFlag(ItemFlags::Vessel_Of_Light_Faron);//set flag for vessel since we'll skip it by reloading
+ gameInfo.scratchPad.movingActors.exploredRegions.Eldin = 0b1; // Set Eldin Map Unlocked so we can warp there
+ tools::setCutscene(true, false);
+ }
+ else
+ {
+ frame_counter++;
+ }
+ }
+ else
+ {
+ frame_counter = 0;
+ }
+ }
checkSearchID = (checkSearchID2 * 0x100) + checkSearchID1;
checkReverseSearchID = (checkReverseSearchID2 * 0x100) + checkReverseSearchID1;
if (checkSearchID != lastCheckSearchID)
@@ -1016,166 +1072,171 @@ namespace mod
snprintf(checkReverseSearchResults, 40, "ID: %x Stage: %s Room: %d", check->destination->itemID, check->destination->stage, check->destination->room);
}
}
- }
-
-
- /*if (gameInfo.scratchPad.unk_0[0x019] == 0)
- {
- const char* walletText = "Wallet";
- strncpy(tp::d_com_inf_game::wallet_text, walletText, sizeof(tp::d_com_inf_game::wallet_text) - 1);
-
- const char* walletDescription = "A wallet from your childhood. It holds up to 1,000 Rupees.";
- strncpy(tp::d_com_inf_game::wallet_description, walletDescription, sizeof(tp::d_com_inf_game::wallet_description) - 1);
- }
- else if (gameInfo.scratchPad.unk_0[0x019] == 1)
- {
- const char* walletText = "Big Wallet";
- strncpy(tp::d_com_inf_game::wallet_text, walletText, sizeof(tp::d_com_inf_game::wallet_text) - 1);
-
- const char* walletDescription = "A wallet given to you by Agitha, princess of the insect kingdom. It can hold 5,000 Rupees.";
- strncpy(tp::d_com_inf_game::wallet_description, walletDescription, sizeof(tp::d_com_inf_game::wallet_description) - 1);
- }
- else if (gameInfo.scratchPad.unk_0[0x019] == 2)
- {
- const char* walletText = "Giant Wallet";
- strncpy(tp::d_com_inf_game::wallet_text, walletText, sizeof(tp::d_com_inf_game::wallet_text) - 1);
-
- const char* walletDescription = "The wallet given by Agitha to benefactors of the insect kingdom. It can hold up to 9,999 Rupees.";
- strncpy(tp::d_com_inf_game::wallet_description, walletDescription, sizeof(tp::d_com_inf_game::wallet_description) - 1);
- }*/
-
-
- if(inputBuffering)
- {
- tp::m_do_controller_pad::cpadInfo.buttonInputTrg = tp::m_do_controller_pad::cpadInfo.buttonInput;
- }
-
+ }
+
+
+ /*if (gameInfo.scratchPad.unk_0[0x019] == 0)
+ {
+ const char* walletText = "Wallet";
+ strncpy(tp::d_com_inf_game::wallet_text, walletText, sizeof(tp::d_com_inf_game::wallet_text) - 1);
+
+ const char* walletDescription = "A wallet from your childhood. It holds up to 1,000 Rupees.";
+ strncpy(tp::d_com_inf_game::wallet_description, walletDescription, sizeof(tp::d_com_inf_game::wallet_description) - 1);
+ }
+ else if (gameInfo.scratchPad.unk_0[0x019] == 1)
+ {
+ const char* walletText = "Big Wallet";
+ strncpy(tp::d_com_inf_game::wallet_text, walletText, sizeof(tp::d_com_inf_game::wallet_text) - 1);
+
+ const char* walletDescription = "A wallet given to you by Agitha, princess of the insect kingdom. It can hold 5,000 Rupees.";
+ strncpy(tp::d_com_inf_game::wallet_description, walletDescription, sizeof(tp::d_com_inf_game::wallet_description) - 1);
+ }
+ else if (gameInfo.scratchPad.unk_0[0x019] == 2)
+ {
+ const char* walletText = "Giant Wallet";
+ strncpy(tp::d_com_inf_game::wallet_text, walletText, sizeof(tp::d_com_inf_game::wallet_text) - 1);
+
+ const char* walletDescription = "The wallet given by Agitha to benefactors of the insect kingdom. It can hold up to 9,999 Rupees.";
+ strncpy(tp::d_com_inf_game::wallet_description, walletDescription, sizeof(tp::d_com_inf_game::wallet_description) - 1);
+ }*/
+
+
+ if(inputBuffering)
+ {
+ tp::m_do_controller_pad::cpadInfo.buttonInputTrg = tp::m_do_controller_pad::cpadInfo.buttonInput;
+ }
+
giveAllStoryItems();
- reorderItemWheel();
-
- allowShopItemsAnytime();
-
- giveAllScents();
-
- fixYetaAndYeto();
-
- fixLBTBossDoor();
-
- preventPoweringUpDomRod();
-
- // Call original function
- fapGm_Execute_trampoline();
- }
-
- s32 Mod::procItemCreateFunc(const float pos[3], s32 item, const char funcIdentifier[32])
- {
- strcpy(lastItemFunc, funcIdentifier);
- snprintf(lastItemDataID, 5, "0x%02x", item);
- snprintf(lastItemDataX, 30, "%f", pos[0]);
- snprintf(lastItemDataY, 30, "%f", pos[1]);
- snprintf(lastItemDataZ, 30, "%f", pos[2]);
- // Runs once when Link picks up an item with text and is holding it towards the camera
+ reorderItemWheel();
+
+ allowShopItemsAnytime();
+
+ giveAllScents();
+
+ fixYetaAndYeto();
+
+ fixLBTBossDoor();
+
+ preventPoweringUpDomRod();
+
+ // Call original function
+ fapGm_Execute_trampoline();
+
+ changeLanternColor();
+ //setFieldModels();
+ fixFTTotemMonkey();
+
+ }
+
+ s32 Mod::procItemCreateFunc(const float pos[3], s32 item, const char funcIdentifier[32])
+ {
+ strcpy(lastItemFunc, funcIdentifier);
+ snprintf(lastItemDataID, 5, "0x%02x", item);
+ snprintf(lastItemDataX, 30, "%f", pos[0]);
+ snprintf(lastItemDataY, 30, "%f", pos[1]);
+ snprintf(lastItemDataZ, 30, "%f", pos[2]);
+ // Runs once when Link picks up an item with text and is holding it towards the camera
if (randoEnabled && strcmp(funcIdentifier, "createItemForDirectGet") != 0 && strcmp(funcIdentifier, "createItemForBoss") != 0 &&
- strcmp(funcIdentifier, "createItemForMidBoss") != 0 && strcmp(funcIdentifier, "createItemForSimpleDemo") != 0)
- {
- item = chestRandomizer->getItemReplacement(pos, item);
- }
-
- return item;
- }
-
- bool Mod::procCheckTreasureRupeeReturn(void* unk1, s32 item)
- {
- // Allow to open
- return false;
- }
-
- s32 Mod::procEvtSkipper(void* evtPtr)
- {
- // Runs when the user tries to skip a Cutscene
- if(tp::d_a_alink::checkStageName(stage::allStages[Stage_Sacred_Grove]))
- {
- // We're at sacred grove
- if(0x2 == gameInfo.eventSystem.currentEventID)
- {
- // Master Sword cutscene
- tools::setCutscene(true, false, cutscene_skip::onMasterSwordSkip);
- }
- }
-
-
- // Call original function
- return evt_control_Skipper_trampoline(evtPtr);
- }
-
- bool Mod::proc_query022(void* unk1, void* unk2, s32 unk3)
- {
- // Check to see if currently in one of the Ordon interiors
- if (tp::d_a_alink::checkStageName(stage::allStages[Stage_Ordon_Interiors]))
- {
- // Check to see if ckecking for the Iron Boots
- u16 item = *reinterpret_cast<u16*>(reinterpret_cast<u32>(unk2) + 0x4);
-
- if (item == items::Item::Iron_Boots)
- {
- // Return false so that the door in Bo's house can be opened without having the Iron Boots
- return false;
- }
- }
-
- // Call original function
- return query022_trampoline(unk1, unk2, unk3);
- }
-
- bool Mod::procDoLink(tp::dynamic_link::DynamicModuleControl* dmc)
- {
- // Call the original function immediately, as the REL file needs to be linked before applying patches
- const bool result = do_link_trampoline(dmc);
-
- // Get the pointer to the current REL file
- gc::OSModule::OSModuleInfo* moduleInfo = dmc->moduleInfo;
-
- // Make sure a REL file is actually loaded, as do_link will clear the pointer if something goes wrong
- if (!moduleInfo)
- {
- return result;
- }
-
- // Get the REL pointer as a raw u32, to use for overwrites
- u32 relPtrRaw = reinterpret_cast<u32>(moduleInfo);
-
- // Modify the current REL file
- switch (moduleInfo->id) // May want to set up enums or defines for the module ids
- {
- case 0x121: // d_a_npc_bouS.rel - Inside Bo's house
- {
- // Prevent Bo from talking after the chest has been opened
- *reinterpret_cast<u32*>(relPtrRaw + 0x1A44) = 0x48000028; // b 0x28
- break;
- }
- default:
- {
- break;
- }
- }
-
- return result;
- }
-
- void Mod::procItem_func_UTUWA_HEART()
- {
- /* Call the original function immediately, as the heart container flag
- for the current area needs to be set before making any adjustments */
- item_func_UTUWA_HEART_trampoline();
-
- // Clear the heart container flag if not currently in a boss room
- if (!chestRandomizer->isStageBoss())
- {
- gameInfo.localAreaNodes.dungeon.containerGotten = 0b0;
- }
- }
-
+ strcmp(funcIdentifier, "createItemForMidBoss") != 0 && strcmp(funcIdentifier, "createItemForSimpleDemo") != 0)
+ {
+ item = chestRandomizer->getItemReplacement(pos, item);
+ }
+
+ return item;
+ }
+
+ bool Mod::procCheckTreasureRupeeReturn(void* unk1, s32 item)
+ {
+ // Allow to open
+ return false;
+ }
+
+ s32 Mod::procEvtSkipper(void* evtPtr)
+ {
+ // Runs when the user tries to skip a Cutscene
+ if(tp::d_a_alink::checkStageName(stage::allStages[Stage_Sacred_Grove]))
+ {
+ // We're at sacred grove
+ if(0x2 == gameInfo.eventSystem.currentEventID)
+ {
+ // Master Sword cutscene
+ tools::setCutscene(true, false, cutscene_skip::onMasterSwordSkip);
+ }
+ }
+
+
+ // Call original function
+ return evt_control_Skipper_trampoline(evtPtr);
+ }
+
+ bool Mod::proc_query022(void* unk1, void* unk2, s32 unk3)
+ {
+ // Check to see if currently in one of the Ordon interiors
+ if (tp::d_a_alink::checkStageName(stage::allStages[Stage_Ordon_Interiors]))
+ {
+ // Check to see if ckecking for the Iron Boots
+ u16 item = *reinterpret_cast<u16*>(reinterpret_cast<u32>(unk2) + 0x4);
+
+ if (item == items::Item::Iron_Boots)
+ {
+ // Return false so that the door in Bo's house can be opened without having the Iron Boots
+ return false;
+ }
+ }
+
+ // Call original function
+ return query022_trampoline(unk1, unk2, unk3);
+ }
+
+ bool Mod::procDoLink(tp::dynamic_link::DynamicModuleControl* dmc)
+ {
+ // Call the original function immediately, as the REL file needs to be linked before applying patches
+ const bool result = do_link_trampoline(dmc);
+
+ // Get the pointer to the current REL file
+ gc::OSModule::OSModuleInfo* moduleInfo = dmc->moduleInfo;
+
+ // Make sure a REL file is actually loaded, as do_link will clear the pointer if something goes wrong
+ if (!moduleInfo)
+ {
+ return result;
+ }
+
+ // Get the REL pointer as a raw u32, to use for overwrites
+ u32 relPtrRaw = reinterpret_cast<u32>(moduleInfo);
+
+ // Modify the current REL file
+ switch (moduleInfo->id) // May want to set up enums or defines for the module ids
+ {
+ case 0x121: // d_a_npc_bouS.rel - Inside Bo's house
+ {
+ // Prevent Bo from talking after the chest has been opened
+ *reinterpret_cast<u32*>(relPtrRaw + 0x1A44) = 0x48000028; // b 0x28
+ break;
+ }
+ default:
+ {
+ break;
+ }
+ }
+
+ return result;
+ }
+
+ void Mod::procItem_func_UTUWA_HEART()
+ {
+ /* Call the original function immediately, as the heart container flag
+ for the current area needs to be set before making any adjustments */
+ item_func_UTUWA_HEART_trampoline();
+
+ // Clear the heart container flag if not currently in a boss room
+ if (!chestRandomizer->isStageBoss())
+ {
+ gameInfo.localAreaNodes.dungeon.containerGotten = 0b0;
+ }
+ }
+
void Mod::giveAllScents()
{
//code to have all scents at once you need to unlock them tho
@@ -1253,8 +1314,8 @@ namespace mod
gameInfo.scratchPad.equipedItems.scent = items::Item::Youths_Scent;
}
}
- }
-
+ }
+
void Mod::giveAllStoryItems()
{
if (tp::d_a_alink::checkStageName(stage::allStages[Stage_Lake_Hylia]))
@@ -1264,14 +1325,20 @@ namespace mod
gameInfo.scratchPad.itemWheel.Story = items::Item::Aurus_Memo;
}
}
- else if (tp::d_a_alink::checkStageName(stage::allStages[Stage_Snowpeak]) || tp::d_a_alink::checkStageName(stage::allStages[Stage_Kakariko_Graveyard]) ||
- tp::d_a_alink::checkStageName(stage::allStages[Stage_Zoras_Domain]))
+ else if (tp::d_a_alink::checkStageName(stage::allStages[Stage_Snowpeak]) || tp::d_a_alink::checkStageName(stage::allStages[Stage_Zoras_Domain]))
{
if (tools::checkItemFlag(ItemFlags::Asheis_Sketch))
{
gameInfo.scratchPad.itemWheel.Story = items::Item::Asheis_Sketch;
}
}
+ else if (tp::d_a_alink::checkStageName(stage::allStages[Stage_Kakariko_Graveyard]))
+ {
+ if (tools::checkItemFlag(ItemFlags::Asheis_Sketch))
+ {
+ gameInfo.scratchPad.itemWheel.Story = items::Item::NullItem;
+ }
+ }
else if (tp::d_a_alink::checkStageName(stage::allStages[Stage_Kakariko_Interiors]) && tp::d_kankyo::env_light.currentRoom == 0)
{
if (tools::checkItemFlag(ItemFlags::Ilias_Charm))
@@ -1712,15 +1779,15 @@ namespace mod
if (gameInfo.scratchPad.itemWheel.Item_Slot != 0xFF)
{
gameInfo.scratchPad.itemSlotsOrder[currentSlot] = 0x7;
- currentSlot++;
- }
-
+ currentSlot++;
+ }
+
for (u16 i = currentSlot; i < sizeof(gameInfo.scratchPad.itemSlotsOrder) / sizeof(u8); i++)
{
gameInfo.scratchPad.itemSlotsOrder[currentSlot] = 0xFF;
- }
- }
-
+ }
+ }
+
void Mod::fixYetaAndYeto()
{
if (tools::checkItemFlag(ItemFlags::Bed_Key) && tp::d_a_alink::checkStageName("D_MN11"))
@@ -1741,8 +1808,8 @@ namespace mod
yetaTrickOn = 0;
}
}
- }
-
+ }
+
void Mod::fixLBTBossDoor()
{
if (tp::d_a_alink::checkStageName("D_MN01") && tp::d_kankyo::env_light.currentRoom == 3)
@@ -1760,8 +1827,19 @@ namespace mod
LBTBossDoorTrickOn = 0;
}
}
- }
-
+ }
+
+ void Mod::fixFTTotemMonkey()
+ {
+ if (tp::d_a_alink::checkStageName("D_MN05") && tp::d_kankyo::env_light.currentRoom == 12)
+ {
+ if ((gameInfo.localAreaNodes.unk_0[0xA] & 0x4) != 0)
+ {
+ gameInfo.localAreaNodes.unk_0[0x12] |= 0x1;
+ }
+ }
+ }
+
void Mod::preventPoweringUpDomRod()
{
if (gameInfo.scratchPad.itemWheel.Sky_Book == 0xFF && tools::checkItemFlag(ItemFlags::Ancient_Sky_Book_empty) && !tools::checkItemFlag(ItemFlags::Ancient_Sky_Book_partly_filled))
@@ -1775,8 +1853,8 @@ namespace mod
gameInfo.scratchPad.itemWheel.Sky_Book = 0xFF;
}
}
- }
-
+ }
+
bool Mod::isStageShop()
{
u8 totalShopStages = sizeof(stage::shopStages) / sizeof(stage::shopStages[0]);
@@ -1788,8 +1866,8 @@ namespace mod
}
}
return false;
- }
-
+ }
+
void Mod::doCustomTRESActor(void* mStatus_roomControl)
{
tp::d_com_inf_game::GameInfo* pGameInfo = &tp::d_com_inf_game::dComIfG_gameInfo;
@@ -1860,4 +1938,147 @@ namespace mod
delete[] checks;
return;
}
+
+ void Mod::changeLanternColor()
+ {
+
+ // set lantern variables
+ u32 lanternVariableAddress = reinterpret_cast<u32>(&tp::d_a_alink::lanternVariables);
+ *reinterpret_cast<u8*>(lanternVariableAddress + 0x3D) = reinterpret_cast<u8>(innerRed);
+ *reinterpret_cast<u8*>(lanternVariableAddress + 0x3F) = reinterpret_cast<u8>(innerGreen);
+ *reinterpret_cast<u8*>(lanternVariableAddress + 0x41) = reinterpret_cast<u8>(innerBlue);
+ *reinterpret_cast<u8*>(lanternVariableAddress + 0x43) = reinterpret_cast<u8>(outerRed);
+ *reinterpret_cast<u8*>(lanternVariableAddress + 0x45) = reinterpret_cast<u8>(outerGreen);
+ *reinterpret_cast<u8*>(lanternVariableAddress + 0x47) = reinterpret_cast<u8>(outerBlue);
+ }
+
+ bool Mod::canQuickTransform()
+ {
+ // Make sure Link is actually loaded
+ tp::d_com_inf_game::LinkMapVars* linkMapPtr = gameInfo.linkMapPtr;
+ //check to make sure that the quick transform variable is enabled
+ if (enableQuickTransform == 0)
+ {
+ strcpy(sysConsolePtr->consoleLine[20].line, "-> option disabled");
+ return false;
+ }
+
+ if (!linkMapPtr)
+ {
+ strcpy(sysConsolePtr->consoleLine[20].line, "-> no valid spot");
+ return false;
+ }
+
+ // Make sure Link currently isnt in an event
+ if (tp::d_a_alink::checkEventRun(linkMapPtr))
+ {
+ return false;
+ }
+
+ // Get the value for the alpha of the Z button
+ // Pointer path is not currently defined yet
+ u32 zButtonAlphaPtr = reinterpret_cast<u32>(tp::d_meter2_info::wZButtonPtr);
+ if (!zButtonAlphaPtr)
+ {
+ strcpy(sysConsolePtr->consoleLine[20].line, "-> alpha ptr 1 failed");
+ return false;
+ }
+
+ zButtonAlphaPtr = *reinterpret_cast<u32*>(zButtonAlphaPtr + 0x10C);
+ if (!zButtonAlphaPtr)
+ {
+ strcpy(sysConsolePtr->consoleLine[20].line, "-> alpha ptr 2 failed");
+ return false;
+ }
+
+ float zButtonAlpha = *reinterpret_cast<float*>(zButtonAlphaPtr + 0x720);
+
+ // Check if the Z button is dimmed
+ if (zButtonAlpha != 1.f)
+ {
+ // Z button is currently dimmed, so don't allow transforming
+ strcpy(sysConsolePtr->consoleLine[20].line, "-> z button dimmed");
+ return false;
+ }
+
+ //make sure link is not underwater, or talking to anyone
+ if (tp::d_a_alink::linkStatus->status != 0x1)
+ {
+ //link is in an invalid state
+ return false;
+ }
+
+ // Make sure you have the ability to warp
+ if ((gameInfo.scratchPad.eventBits[0xD] & 0x4) == 0)
+ {
+ return false;
+ }
+
+ //Check to see if link is riding a snowboard
+ if (tp::d_a_alink::checkBoardRide(linkMapPtr))
+ {
+ strcpy(sysConsolePtr->consoleLine[20].line, "-> on board");
+ return false;
+ }
+
+ //Check to see if link is riding the canoe
+ if (tp::d_a_alink::checkCanoeRide(linkMapPtr))
+ {
+ strcpy(sysConsolePtr->consoleLine[20].line, "-> on canoe");
+ return false;
+ }
+
+ //Check to see if link is riding Epona
+ if (tp::d_a_alink::checkHorseRide(linkMapPtr))
+ {
+ strcpy(sysConsolePtr->consoleLine[20].line, "-> on horse");
+ return false;
+ }
+
+ //Check to see if link is riding a boar
+ if (tp::d_a_alink::checkBoarRide(linkMapPtr))
+ {
+ strcpy(sysConsolePtr->consoleLine[20].line, "-> on boar");
+ return false;
+ }
+
+ //Check to see if link is riding the spinner
+ if (tp::d_a_alink::checkSpinnerRide(linkMapPtr))
+ {
+ strcpy(sysConsolePtr->consoleLine[20].line, "-> on spinner");
+ return false;
+ }
+ strcpy(sysConsolePtr->consoleLine[20].line, "-> Can Transform");
+ return true;
+ }
+
+ bool Mod::canChangeToD()
+ {
+ if ((gameInfo.scratchPad.eventBits[0xD] & 0x4) == 0)
+ {
+ return false;
+ }
+
+ if (gameInfo.aButtonText != 0x23)
+ {
+ return false;
+ }
+
+ if (gameInfo.eventSystem.actionStatus != 0x29)
+ {
+ return false;
+ }
+
+ if (Singleton::getInstance()->midnaTimeControl == 0)
+ {
+ return false;
+ }
+
+ if (!chestRandomizer->isStageTOD())
+ {
+ return false;
+ }
+ return true;
+ }
+
} // namespace mod \ No newline at end of file
diff --git a/source/singleton.cpp b/source/singleton.cpp
index 56bd916..74dc31f 100644
--- a/source/singleton.cpp
+++ b/source/singleton.cpp
@@ -35,6 +35,21 @@ namespace mod
diababaMusicFixed = 0;
midnaTimeControl = 1;
hasActorCommonLayerRan = 0;
+ isEarlyToTEnabled = 0;
+ isEarlyPoTEnabled = 0;
+ isGMStoryPatch = 0;
+ isEarlyHCEnabled = 0;
+ startWithCrystal = 0;
+
+ //dungeon fixes
+ hasFTBeenBeaten = 0;
+ hasGMBeenBeaten = 0;
+ hasLBTBeenBeaten = 0;
+ hasAGBeenBeaten = 0;
+ hasSPRBeenBeaten = 0;
+ hasToTBeenBeaten = 0;
+ hasCiTSBeenBeaten = 0;
+ hasCiTSOoccoo = 0;
}
} \ No newline at end of file
diff --git a/source/stage.cpp b/source/stage.cpp
index a61af8e..cb4d389 100644
--- a/source/stage.cpp
+++ b/source/stage.cpp
@@ -168,7 +168,7 @@ namespace mod::stage
allStages[Stage_Hidden_Skill]
};
- const char* timeOfDayStages[19]
+ const char* timeOfDayStages[18]
{
allStages[Stage_Ordon_Village],
allStages[Stage_Ordon_Spring],
@@ -176,11 +176,10 @@ namespace mod::stage
allStages[Stage_Faron_Woods],
allStages[Stage_Death_Mountain],
allStages[Stage_Kakariko_Graveyard],
+ allStages[Stage_Kakariko_Village],
allStages[Stage_Zoras_River],
allStages[Stage_Zoras_Domain],
allStages[Stage_Upper_Zoras_River],
- allStages[Stage_Snowpeak],
- allStages[Stage_Ordon_Ranch],
allStages[Stage_Lake_Hylia],
allStages[Stage_Outside_Castle_Town],
allStages[Stage_Hyrule_Field],