Difference between revisions of "Hookpush"
(→Directions) |
(→Pull Slot) |
||
(28 intermediate revisions by the same user not shown) | |||
Line 7: | Line 7: | ||
Normally, when Link uses the Hookshot, a Hookshot ancilla is loaded into Slot 4 and a counter in that slot will immediately be set to 0 and then increment every frame the Hookshot is extending. When the Hookshot connects with an object to pull Link to, the counter will decrement every frame as Link is pulled to the object. Link is pulled 4px/frame until this counter gets back to 0. But what if we can get the Hookshot to look at different counters outside of its current ancilla slot? That's how this glitch is gonna work. | Normally, when Link uses the Hookshot, a Hookshot ancilla is loaded into Slot 4 and a counter in that slot will immediately be set to 0 and then increment every frame the Hookshot is extending. When the Hookshot connects with an object to pull Link to, the counter will decrement every frame as Link is pulled to the object. Link is pulled 4px/frame until this counter gets back to 0. But what if we can get the Hookshot to look at different counters outside of its current ancilla slot? That's how this glitch is gonna work. | ||
− | + | {{HEXA|$039D}} is a memory address where the Hookshot's current slot value is stored when we use the Hookshot, and it is used to determine which slot's counter the game should use when Link starts getting pulled. A Somaria block placed in Slot 9 will decrement the value at this address every frame. This means that if we have a Somaria block in Slot 9, and we use the Hookshot with no other ancilla loaded, the Hookshot will spawn in Slot 4 and the counter for Slot 4 will increment until the Hook connects with an object. For the first frame of pulling, the Slot 4 counter will be used, but then, because of the Slot 9 block decrementing the value at <code>$039D</code>, the next frame of pulling will read data from Slot 3, the third frame of pulling from Slot 2, then Slot 1, and then finally Slot 0, where it will continually use this counter until it reaches 0. | |
− | Through using other ancillae in specific ways, we can manipulate the | + | Through using other ancillae in specific ways, we can manipulate the data in other slots to get the Hookshot to pull us for extended durations and/or in the incorrect directions. Or even have it pull us to [[Exploration Glitch|EG]]. |
==General Technique== | ==General Technique== | ||
Line 17: | Line 17: | ||
In order to Hookpush, we want to do a few different things: | In order to Hookpush, we want to do a few different things: | ||
# Misslot a Somaria Block into Slot 9. This requires a couple of steps: | # Misslot a Somaria Block into Slot 9. This requires a couple of steps: | ||
− | ## Get the Search Index higher than <code>09</code>. | + | ## Get the Search Index higher than <code>09</code>. This pretty much always involves getting a Lamp Flame in Slot 2 while Link is facing any direction BUT right. This is easily done by just using the Lamp 3 times quickly, but you can use it less if there are other objects on screen already occupying Slots 3 and/or 4. Not many things that crop up in normal gameplay write to this address, and only hard resets or overloading the Front Slots will put it back to 0. So you can often set this value way ahead of the exact room/moment where you want to do a Hookpush. |
## Fill the Front Slots (slots 0-4) with ancillae. This is necessary because Somaria blocks will occupy a Front Slot by default, but we want it to load into Slot 9. | ## Fill the Front Slots (slots 0-4) with ancillae. This is necessary because Somaria blocks will occupy a Front Slot by default, but we want it to load into Slot 9. | ||
− | ## Have a Particle ancilla in Slot 9. When we go to use the Cane of Somaria with the Front Slots filled, the game will use the Search Index to begin a secondary search for where to place our block. The game will take the value of the Search Index and begin looking down from that value, which is why we want it above <code>09</code>. Particle ancillae (that is <code>0A</code>, <code>13</code>, and <code>3C</code>) can be replaced by other ancillae, and that's exactly what we want to have happen. Since <code>13</code> (Ice Rod Sparkles) and <code>3C</code> (the sparkles on a charging sword, silver arrows, and red boomerang) naturally spawn in the Back Slots, these are | + | ## Have a Particle ancilla in Slot 9. When we go to use the Cane of Somaria with the Front Slots filled, the game will use the Search Index to begin a secondary search for where to place our block. The game will take the value of the Search Index and begin looking down from that value, which is why we want it above <code>09</code>. Particle ancillae (that is <code>0A</code>, <code>13</code>, and <code>3C</code>) can be replaced by other ancillae, and that's exactly what we want to have happen. Since <code>13</code> (Ice Rod Sparkles) and <code>3C</code> (the sparkles on a charging sword, silver arrows, and red boomerang) naturally spawn in the Back Slots, these are what we'll use. Charging sword in particular is the most common, since it's convenient and puts <code>3C</code> in Slots 7-9. |
## With the Search Index set above <code>09</code>, all of the Front Slots occupied, and a Particle ancilla loaded in Slot 9, we can use the Cane of Somaria and a block will be loaded into Slot 9. This will appear on the HUD as <code>2C</code> in Slot 9. | ## With the Search Index set above <code>09</code>, all of the Front Slots occupied, and a Particle ancilla loaded in Slot 9, we can use the Cane of Somaria and a block will be loaded into Slot 9. This will appear on the HUD as <code>2C</code> in Slot 9. | ||
− | # With a block in Slot 9, when we use the Hookshot, the game will look at the data for the Hookshot's slot for the first frame of the Hookpush and then for each subsequent frame it will use the data for the next slot down until it reaches Slot 0, where it will stay until the counter at Slot 0 has decremented down to <code>00</code>, indicating to the game that the Pull has ended. How we choose to manipulate the data at each Slot for the results that we want depends heavily on the context, and if you're looking to learn a specific Hookpush, you can go read the Applications section for info specific to what you're learning. But if you want a deeper understanding of Hookpushes, as well as the ability to create your own setups or modify existing ones, it helps to be familiar with the how these manipulations work. For that information, check out the below section outlining the | + | # With a block in Slot 9, when we use the Hookshot, the game will look at the data for the Hookshot's slot for the first frame of the Hookpush and then for each subsequent frame it will use the data for the next slot down until it reaches Slot 0, where it will stay until the counter at Slot 0 has decremented down to <code>00</code>, indicating to the game that the Pull has ended. How we choose to manipulate the data at each Slot for the results that we want depends heavily on the context, and if you're looking to learn a specific Hookpush, you can go read the Applications section for info specific to what you're learning. But if you want a deeper understanding of Hookpushes, as well as the ability to create your own setups or modify existing ones, it helps to be familiar with the how these manipulations work. For that information, check out the below section outlining the memory addresses / arrays that are important for Hookpushing: |
=== RAM Values Significant in Hookpushing === | === RAM Values Significant in Hookpushing === | ||
− | To introduce this, many of the variables ancillae use for their routines are contained in "arrays". The game knows which | + | To introduce this, many of the variables ancillae use for their routines are contained in "arrays". In computer science, arrays are a data structure that organizes "elements" (in this case, the variables the game's ancillae are using) in a list in such a way where the program can easily access individual elements using the "index" of the element it wants. The game knows which index to look at in these arrays based on which Slot the ancilla is in. If it's in Slot 4, it looks at the 4th byte in the array, or if it's in Slot 2, it looks at the 2nd. When an array address is mentioned in this section, that will be the 0th index in the array. So for example, in the array at <code>$0C5E</code>, that specific address is the 0th index, and ancillae in Slot 0 will control that value. But if an object in Slot 4 is using that array, it'd be controlling the address at <code>$0C62</code> (0x0C5E + 0x04). Several arrays that ancillae use are going to impact how these setups work. |
==== Duration Counter ==== | ==== Duration Counter ==== | ||
− | This is the array that is drawn on the ancillae HUD to the right of the where the ancillae slots are. Here's how | + | This is the array that is drawn on the ancillae HUD to the right of the where the ancillae slots are. Normally the Hookshot will increment this counter at the Hookshot's Slot until it latches onto something, and then it will decrement this counter as Link is pulled at 4px/frame until it gets back to <code>00</code>, when the pull ends. With Slot 9 Somaria though, the Hookshot's pull routine will be looking at this value in different Slots of this array. Other ancilla control this array differently, and they often don't reinitialize or get rid of the values they put here. This allows us to precisely manipulate these values to get long pushes. Here's how you want to do it: |
− | # We'll generally want the duration counters in the slots between the Hookshot's slot and Slot 0 to be a value other than <code>00</code> or <code>FF</code>. If any of these values are <code>00</code> or <code>FF</code>, then the Hookpush will end on the frame the game is using that counter. By default the Hookshot will spawn in Slot 4, and if that's what the setup calls for, then you'll want the counters for Slots 1-3 to be any value other than <code>00</code>/<code>FF</code>. You can also force the Hookshot to load into different slots. If I place a | + | # We'll generally want the duration counters in the slots between the Hookshot's slot and Slot 0 to be a value other than <code>00</code> or <code>FF</code>. If any of these values are <code>00</code> or <code>FF</code>, then the Hookpush will end on the frame the game is using that counter. By default the Hookshot will spawn in Slot 4, and if that's what the setup calls for, then you'll want the counters for Slots 1-3 to be any value other than <code>00</code>/<code>FF</code>. You can also force the Hookshot to load into different slots. If I place a Somaria block into Slot 3 and Dash Dust in Slot 4, then my Hookshot will spawn in Slot 2. Now the Hookpush will ignore data in Slots 3 and 4, and the Hookshot itself will set a good counter at Slot 2, meaning the player only needs to manipulate the counters at Slots 1 and 0. This can be very useful in some contexts, as manipulating all of the counters isn't always practical. |
− | # Generally we'll want the duration counter at Slot 0 to be a high value. This is because when the Hookpush gets to this value in Slot 0, it will use only this counter to pull Link until it decrements to <code>00</code>, when the Hookpush will end. Because Sword Beams write <code>4C</code> to their slot's counter, a Slot 0 Sword Beam is often used for this. | + | # Generally we'll want the duration counter at Slot 0 to be a high value. This is because when the Hookpush gets to this value in Slot 0, it will use only this counter to pull Link until it decrements to <code>00</code>, when the Hookpush will end. Because Sword Beams write <code>4C</code> to their slot's counter, a Slot 0 Sword Beam is often used for this. 0x4C in decimal is 76, meaning we get a whopping 76 frames of Hookpushing with that value. That's 304px of moving with no collision. |
+ | |||
+ | ''' How Different Ancillae Write to this Array ''' | ||
+ | |||
+ | Note/disclaimer about these tables: to save space and make this work easier, not every single ancilla is listed. Maybe they'll all be posted in the future, but this is going to focus on the ancillae currently used in RTA setups. Some of them are pretty much guaranteed useless anyway. Like Link's snoring in the opening cutscene is an ancilla <code>$21</code>, and it's unlikely that stuff like that is ever going to figure into a Hookpush setup. | ||
+ | |||
+ | Hopefully each ancillae is named to avoid any confustion. "Wall Hit" <code>$06</code> is what happens when you tink a wall with the Boomerang or the Hookshot (but NOT the sword, that's different and also not useful in any current setups). "Sparkles" <code>$3C</code> are created from three different sources: Link holding a sword charge, the Red Boomerang, and Silver Arrows. | ||
+ | |||
+ | The "Item Get" <code>$22</code> refers to ancillae that occur when you open chests, grab heart pieces/containers, etc. The table says the value they set varies considerably based on the exact item being collected, but it's also worth noting that these values tend to be solid for midrange Hookpushes. A few setups make use of Slot 0 "Item Gets" for this reason. | ||
+ | |||
+ | {| class="wikitable" | ||
+ | |- | ||
+ | ! colspan ="3" | Ancillae at Duration Counter Array ($0C5E) | ||
+ | |- | ||
+ | ! Ancilla Name !! Ancilla ID !! Values at $0C5E | ||
+ | |- | ||
+ | | Somaria Beam || <code>$01</code> || <code>00</code> | ||
+ | |- | ||
+ | | Fire Rod Shot || <code>$02</code> || Varies depending on how far the shot travels. <code>00</code> if directly into an object, but can get into <code>3x</code> range with lots of travel | ||
+ | |- | ||
+ | | Beam Wall Hit || <code>$04</code> || <code>4C</code> | ||
+ | |- | ||
+ | | Boomerang || <code>$05</code> || <code>01</code> | ||
+ | |- | ||
+ | | Wall Hit || <code>$06</code> || <code>04</code> | ||
+ | |- | ||
+ | | Bomb || <code>$07</code> || <code>00</code> planted ; counts to <code>0B</code> after explosion | ||
+ | |- | ||
+ | | Arrow || <code>$09</code> || <code>08</code> if it hits something; <code>FF</code> if not | ||
+ | |- | ||
+ | | Wall Arrow || <code>$0A</code> || <code>08</code> until despawn -- then <code>09</code> | ||
+ | |- | ||
+ | | Ice Rod Shot || <code>$0B</code> || varies <code>02</code> - <code>07</code> | ||
+ | |- | ||
+ | | Sword Beam || <code>$0C</code> || <code>4C</code> | ||
+ | |- | ||
+ | | Ice Shot Wall Hit || <code>$11</code> || <code>02</code> | ||
+ | |- | ||
+ | | Bonk || <code>$1D</code> || <code>FF</code> | ||
+ | |- | ||
+ | | Dash Dust || <code>$1E</code> || <code>06</code> for dust taps and very short dashes; <code>03</code> for longer dashes | ||
+ | |- | ||
+ | | Hookshot || <code>$1F</code> || <code>FF</code> if Wall Hit or nothing is hit; <code>01-02</code> on a short Hook | ||
+ | |- | ||
+ | | Item Get || <code>$22</code> || varies a ton depending on the item | ||
+ | |- | ||
+ | | Sword Slash Sparkle || <code>$26</code> || <code>04</code>; this ancilla only occurs with Master Sword or stronger | ||
+ | |- | ||
+ | | Spin Spark I || <code>$2A</code> || counts to <code>04</code> and converts to Spin Spark II ancilla | ||
+ | |- | ||
+ | | Spin Spark II || <code>$2B</code> || starts at <code>49</code> and counts down to <code>03</code>. can take dmg to interrupt the animation (and this counter) | ||
+ | |- | ||
+ | | Somaria Block || <code>$2C</code> || <code>00</code> | ||
+ | |- | ||
+ | | Lamp Flame || <code>$2F</code> || <code>00</code> | ||
+ | |- | ||
+ | | Sparkle || <code>$3C</code> || <code>03</code>; these fill the Back Slots by default, but if you spawn enough of them, they will start spawning in the Front Slots as well | ||
+ | |} | ||
==== Directions ==== | ==== Directions ==== | ||
Line 40: | Line 97: | ||
# The values at different Slots in this array aren't changed until new ancilla are loaded into a specific slot. If I Sword Beam north from Slot 4, Slot 4 in this array will indicate a north value (<code>00</code>) until something else happens at that Slot. | # The values at different Slots in this array aren't changed until new ancilla are loaded into a specific slot. If I Sword Beam north from Slot 4, Slot 4 in this array will indicate a north value (<code>00</code>) until something else happens at that Slot. | ||
# For most Hookpushes, the main direction that matters is what's stored at Slot 0. This is because the vast majority of your pull frames will be using Slot 0. If you want to clip a wall to your left, it doesn't matter much if other Slots aren't pushing you left since you'll only use them for one frame maximum. Therefore, when we use our Slot 0 ancilla (most commonly a Sword Beam), we want to be facing the direction we want to push in. | # For most Hookpushes, the main direction that matters is what's stored at Slot 0. This is because the vast majority of your pull frames will be using Slot 0. If you want to clip a wall to your left, it doesn't matter much if other Slots aren't pushing you left since you'll only use them for one frame maximum. Therefore, when we use our Slot 0 ancilla (most commonly a Sword Beam), we want to be facing the direction we want to push in. | ||
− | # Sometimes the Slot 0 ancilla you're using won't touch this array at all. An example of this is if you're putting an "Item Get" ancilla at Slot 0 for your push. In these cases, you'll have to make sure your direction is set to a good value from some other source. | + | # Sometimes the Slot 0 ancilla you're using to set your Duration Counter won't touch this array at all. An example of this is if you're putting an "Item Get" ancilla at Slot 0 for your push. In these cases, you'll have to make sure your direction is set to a good value from some other prior source. |
− | # Occasionally a setup will be specific enough that moving certain directions for even 1 frame WILL be a problem. Examples of this would include things like the Checkerboard Cave push to Pyramid Fairy or the push from Swamp Entrance to Moth's Room. In these scenarios, it can be easy to get Link stuck out of bounds or inside walls if his movement in the push isn't specifically correct, so you DO need to factor in the direction Link is moving in while the Hookshot is using other Slot data, even the stuff outside of Slot 0 that | + | # Occasionally a setup will be specific enough that moving certain directions for even 1 frame WILL be a problem. Examples of this would include things like the Checkerboard Cave push to Pyramid Fairy or the push from Swamp Entrance to Moth's Room. In these scenarios, it can be easy to get Link stuck out of bounds or inside walls if his movement in the push isn't specifically correct, so you DO need to factor in the direction Link is moving in while the Hookshot is using other Slot data, even the stuff outside of Slot 0 that the Hookshot only uses for one frame. |
+ | |||
+ | ''' How Different Ancillae Write to this Array ''' | ||
+ | |||
+ | Some quick notes | ||
+ | * By 'normal' I mean these values are set <code>00</code> to <code>03</code> based on the direction Link is facing: <code>00</code> for north, <code>01</code> for south, <code>02</code> for west, <code>03</code> for east. These work exactly as you would think. | ||
+ | * Why are arrows weird? I dunno man. Don't think anyone else does either. We do know how these directions impact our Hookpush movement though. See this [https://docs.google.com/spreadsheets/d/1s6qyLF2d3EzZotUeTg0lUzND0qYK49JZJzBJ13nQasc/edit#gid=914173735 Link] | ||
+ | * With Somaria beams, it can be important to know the logic of how the 4 beams fill the Slots. The highest available Front Slot will use the east beam, followed by the west beam, then the south beam, and finally the north beam. So if you blast a block with no other ancillae loaded, the east beam will use Slot 4, the west beam Slot 3, the south beam Slot 2, and the north beam Slot 1. And these will write the values you'd expect at those Slots (ie. east beam will set the east direction <code>03</code> at Slot 4). | ||
− | ==== | + | {| class="wikitable" |
+ | |- | ||
+ | ! colspan ="3" | Ancillae at Direction Array ($0C72) | ||
+ | |- | ||
+ | ! Ancilla Name !! Ancilla ID !! Values at $0C72 | ||
+ | |- | ||
+ | | Somaria Beam || <code>$01</code> || Normal | ||
+ | |- | ||
+ | | Fire Rod Shot || <code>$02</code> || Normal | ||
+ | |- | ||
+ | | Beam Wall Hit || <code>$04</code> || Normal | ||
+ | |- | ||
+ | | Boomerang || <code>$05</code> || Normal | ||
+ | |- | ||
+ | | Wall Hit || <code>$06</code> || Unaffected | ||
+ | |- | ||
+ | | Bomb || <code>$07</code> || Normal | ||
+ | |- | ||
+ | | Arrow || <code>$09</code> || <code>04</code> north, <code>05</code> south, <code>06</code> west, <code>07</code> east. | ||
+ | |- | ||
+ | | Wall Arrow || <code>$0A</code> || Unaffected | ||
+ | |- | ||
+ | | Ice Rod Shot || <code>$0B</code> || Normal | ||
+ | |- | ||
+ | | Sword Beam || <code>$0C</code> || Normal | ||
+ | |- | ||
+ | | Ice Shot Wall Hit || <code>$11</code> || Normal | ||
+ | |- | ||
+ | | Bonk || <code>$1D</code> || <code>00</code> for east/west bonks, <code>02</code> for north/south bonks. | ||
+ | |- | ||
+ | | Dash Dust || <code>$1E</code> || Normal | ||
+ | |- | ||
+ | | Hookshot || <code>$1F</code> || Normal | ||
+ | |- | ||
+ | | Item Get || <code>$22</code> || Unaffected | ||
+ | |- | ||
+ | | Sword Slash Sparkle || <code>$26</code> || Normal | ||
+ | |- | ||
+ | | Spin Spark I || <code>$2A</code> || Unaffected | ||
+ | |- | ||
+ | | Spin Spark II || <code>$2B</code> || Unaffected | ||
+ | |- | ||
+ | | Somaria Block || <code>$2C</code> || Normal | ||
+ | |- | ||
+ | | Lamp Flame || <code>$2F</code> || Normal | ||
+ | |- | ||
+ | | Sparkle || <code>$3C</code> || Unaffected | ||
+ | |} | ||
+ | |||
+ | ==== Hook Index ==== | ||
This refers to the value held at <code>$039D</code>, which if you've read the info on this page so far, you already know what that is. This is the address that makes Hookpushing work. The Hookshot pull routine looks at what value is in this address to determine which Slot's data it should use when Link is being pulled by the Hookshot. A Somaria Block in Slot 9 decrements the value in this address every frame. And by every frame I mean EVERY frame -- even when the game is paused to the item menu or the S&Q menu. This makes different setups possible. | This refers to the value held at <code>$039D</code>, which if you've read the info on this page so far, you already know what that is. This is the address that makes Hookpushing work. The Hookshot pull routine looks at what value is in this address to determine which Slot's data it should use when Link is being pulled by the Hookshot. A Somaria Block in Slot 9 decrements the value in this address every frame. And by every frame I mean EVERY frame -- even when the game is paused to the item menu or the S&Q menu. This makes different setups possible. | ||
− | Consider the above information about Duration Counters and how we generally want the counters for Slots 1-3 to be nonzero values. But what if it's inconvenient (slow, clunky, or maybe even impossible) to manipulate every one of those to a nonzero value? Enter the pause tech. By pausing the game right when the Hookshot latches onto something, our Slot 9 Block will decrement the | + | Consider the above information about Duration Counters and how we generally want the counters for Slots 1-3 to be nonzero values. But what if it's inconvenient (slow, clunky, or maybe even impossible) to manipulate every one of those to a nonzero value? Enter the pause tech. By pausing the game right when the Hookshot latches onto something, our Slot 9 Block will decrement the Hook Index value while we're paused. This can be used to bypass data we don't want to use. Most often it's used to skip over Slots 1 and 2, although it can even be used to skip over Slot 3. Since it's impossible to pause the game for only a handful of frames, you are guaranteed to have <code>$039D</code> at Slot 0 coming out of your pause IF you paused after the Hookshot has latched onto the object you're using. |
− | The frame window you have to pause on varies depending on which Slot | + | The frame window you have to pause on varies depending on which Slot has the 'bad' data you want to skip past. The most generous is if you just want to skip over Slot 1 (a 4 frame window). You have 3 frames to skip Slot 2, and only 2 frames to skip Slot 1. The technique most players use for these is to try to pause with the item menu while menuing to the next item you want equipped in the run. This is of course the fastest way to do this since you're working in something you'd have to do anyway. If you pause early however, you can switch to using the S&Q menu for [[Buffering|Select Buffers]], which are faster than pausing to the item menu repeatedly to advance frames in game. |
==== EG Check ==== | ==== EG Check ==== | ||
− | # | + | EG Check is what we call the array at <code>$03A4</code>. Values at this array can determine whether we are or are not put into EG when we Hookpush. |
+ | |||
+ | # Generally the way this works is: if your EG Check Value is <code>00</code> at the Slot the Hookpush ends at, you will stay in the same layer you're currently on. If your EG Check Value is NOT <code>00</code> at the Slot the Hookpush ends at AND you have [[Exploration Glitch|Strong EG]] set, you will be put into the opposite layer (typically [[Exploration Glitch|EG]]) when the Hookpush ends. | ||
+ | # The Red Number on the Ancillae Super Watch for the practice hack represents the EG Check value at Slot 0. This is a useful number to check when you DON'T want to enter EG with your Hookpush. Because 99% of non-EG setups will manipulate values so that the Hookpush is ending while using Slot 0 data, this value is the significant one to watch, and the EG Check value at other Slots will be meaningless. For avoiding EG on Hookpushes, we want this value to either be <code>00</code> exactly OR we want to trigger a screen transition before the Hookpush comes to an end (ie. the Duration Counter at Slot 0 does not get all the way down to <code>00</code>) OR we want Weak EG set. One of the most common manipulations of the Slot 0 EG Check is doing Slot 0 Sword Beams straight into a wall or other object. Note in the table below that while normal Sword Beams will move the EG Check variable around at the Slot it's using, Sword Beam Wall Hits will zero this value. Sword Beam Wall Hits still set high Duration Counters though! | ||
+ | # So what if you DO want to Hookpush into EG? Well in that case, from reading the logic of the first point in this section, you may have realized that it's unnecessary to manipulate values at Slot 0, and indeed, most modern EG push setups don't bother to do so. It's typically much better and faster to do stuff like: Hookshot from Slot 4, have a Duration Counter of <code>00</code> or <code>FF</code> in Slot 3 (so that the Hookpush ends at that Slot), and have an EG Check value at Slot 3 that is nonzero. In this case, you will almost immediately get put into EG when you Hookshot anything. The EG Checks at Slots other than Slot 0 aren't included on the Ancillae Super Watch HUD for the PracHack, but you can watch them on emulator at the array <code>$03A4</code>. | ||
+ | |||
+ | ''' How different Ancillae Write to this Array ''' | ||
+ | |||
+ | One thing to note is that oftentimes, if an ancillae does put nonzero values at this array, they will oscillate around a few different values in a predictable manner. For example, Sword Beams will count the EG Check at its Slot up from <code>00</code> to <code>03</code>, then cycle back to <code>00</code> and repeat. This means that you can get consistent <code>00</code> values by Sword Beaming from certain coordinates such that the Sword Beam will end while the value of the EG Check is <code>00</code>. The reverse is true when you want nonzero values for entering EG. You'd have to Sword Beam from certain coordinates such that the Sword Beam will end while the EG Check at that Slot is nonzero. | ||
+ | |||
+ | {| class="wikitable" | ||
+ | |- | ||
+ | ! colspan ="3" | Ancillae at EG Check Array ($03A4) | ||
+ | |- | ||
+ | ! Ancilla Name !! Ancilla ID !! Values at $03A4 | ||
+ | |- | ||
+ | | Somaria Beam || <code>$01</code> || Unaffected | ||
+ | |- | ||
+ | | Fire Rod Shot || <code>$02</code> || Unaffected | ||
+ | |- | ||
+ | | Beam Wall Hit || <code>$04</code> || <code>00</code> | ||
+ | |- | ||
+ | | Boomerang || <code>$05</code> || <code>00-03</code> | ||
+ | |- | ||
+ | | Wall Hit || <code>$06</code> || Unaffected | ||
+ | |- | ||
+ | | Bomb || <code>$07</code> || Unaffected | ||
+ | |- | ||
+ | | Arrow || <code>$09</code> || Unaffected | ||
+ | |- | ||
+ | | Wall Arrow || <code>$0A</code> || Unaffected | ||
+ | |- | ||
+ | | Ice Rod Shot || <code>$0B</code> || Unaffected | ||
+ | |- | ||
+ | | Sword Beam || <code>$0C</code> || <code>00-03</code> | ||
+ | |- | ||
+ | | Ice Shot Wall Hit || <code>$11</code> || Unaffected | ||
+ | |- | ||
+ | | Bonk || <code>$1D</code> || Unaffected | ||
+ | |- | ||
+ | | Dash Dust || <code>$1E</code> || Unaffected | ||
+ | |- | ||
+ | | Hookshot || <code>$1F</code> || <code>00</code> | ||
+ | |- | ||
+ | | Item Get || <code>$22</code> || <code>00</code> | ||
+ | |- | ||
+ | | Sword Slash Sparkle || <code>$26</code> || Unaffected | ||
+ | |- | ||
+ | | Spin Spark I || <code>$2A</code> || <code>FF</code> | ||
+ | |- | ||
+ | | Spin Spark II || <code>$2B</code> || <code>00-03</code>; always ends at <code>00</code> | ||
+ | |- | ||
+ | | Somaria Block || <code>$2C</code> || <code>00</code> | ||
+ | |- | ||
+ | | Lamp Flame || <code>$2F</code> || Unaffected | ||
+ | |- | ||
+ | | Sparkle || <code>$3C</code> || Unaffected | ||
+ | |} | ||
+ | |||
+ | ==== Slot 9 Somaria Block's EG Check ==== | ||
+ | |||
+ | Slot 9 Somaria Blocks will use their EG Check at <code>$03A4,9</code> which is <code>$03AD</code>. This is writing into a separate array that starts on <code>$03A9</code> that various ancillae write to. Slot 4 in this array is the same address Slot 9 Blocks are using for their EG Check, and there are 3 ancillae that when placed in Slot 4, will write negative values into this address. This is really bad -- the result of using one of these ancillae in Slot 4 is immediate deletion of a Slot 9 Block. So of course for the purposes of Hookpushing, it's essential we avoid using the following 3 ancillae at Slot 4 after we've placed the Slot 9 Block: | ||
+ | # Cane of Somaria Blocks (Somaria beams are fine) | ||
+ | # Bow | ||
+ | # Sword Beams to the North, West, or South | ||
+ | |||
+ | Note that you can use these 3 ancillaes in other Slots. Also note that Sword Beams to the East are fine because they set a different value in <code>$03A9,X</code>. | ||
+ | |||
+ | Sword Beams and Somaria Blocks are often used in Hookpush setups even after placing the Slot 9 Block, but since these load into Slot 4 by default, we have to manipulate them into using other Slots. The most common way is to Dash Dust to occupy Slot 4 and then immediately Beam/Block to have it occupy Slot 3. There are other methods though, as you'll see when you get into applying this in actual setups. | ||
+ | |||
+ | ==== Ancillae Coordinates ==== | ||
+ | |||
+ | This is one of the weirder ones to understand, but it's also an important mechanic to grasp, especially if you start looking at creating your own setups. | ||
+ | |||
+ | So far we've established that one of the conditions that the game will think "okay, the hookshot pull has ended" and stop Link's movement is when the counter the Hookshot is using at <code>$0C5E</code> has reached 0. But there's another thing that can end the Hookshot pulling Link, and it's related to ancillae coordinates. There are two arrays that contain ancillae coordinates: one for their x-position <code>$0C04</code> and one for their y-position <code>$0BFA</code>. | ||
− | + | Let's say Link uses his Hookshot to the north; the game will track the position of the Hookshot's tip at the ancillae coordinate arrays, and the Hook will of course stop when it latches onto something. The game will then compare the position of the Hookshot's coordinates with the position of Link along the axis he's moving in while he's being pulled. In this example, that's north, so the game won't be looking at either the Hookshot's or Link's x-coordinate for this check. If Link can get 1px or 0px (he pulls even with it) within the Hookshot's y-coordinate, the Hookshot pull will terminate. | |
− | + | This mechanic can present a problem with Hookpushing because the Hookshot's pull will be reading data from different slots, and that includes the ancillae coordinates. When we use a Sword Beam for example, the game will track its coordinates at the same coordinate arrays, and these values don't disappear when the Sword Beam hits something and dissipates. It is important then that when setting up our ancillae for Hookpushes, that we consider where the ancillae we're using end up. Otherwise our Hookpush could be canceled before the Duration Counter would ordinarily end it. | |
+ | |||
+ | So now let's say we want to Hookpush through the north wall in a room. We want a Slot 0 Sword Beam to do this, and using all of the above knowledge, you get all your values aligned to make this work. But we placed your Slot 0 Sword Beam against the top wall in the room. Link HAS to travel through this coordinate, which means the Hookpush will fail unless started from specific positions in the room that would skip over the window where the Hookshot would cancel. This is often extremely slow to precisely position Link in a way where he can avoid passing through the bad pixels during the Hookpush. A better solution would be to set our Slot 0 Sword Beam by slashing upwards into an object that's lower in the room. This way, the Sword Beam's y-coordinate is completely out of Link's path on the Hookpush, and we can freely start our Hookpush from any position so long as it's above where our Sword Beam died. This is an extremely common manipulation you'll see in the below setups, and it's important to be aware of it for creating your own setups (or for modifying existing ones). | ||
==Applications== | ==Applications== | ||
+ | |||
+ | ===Checkerboard Cave to Pyramid Fairy=== | ||
+ | |||
+ | ===Chest Game to Red Boomerang=== | ||
===Chicken House to Witch Hut=== | ===Chicken House to Witch Hut=== | ||
Line 83: | Line 276: | ||
* We now have our values set, but if you're familiar with Hookpush mechanics at all, you'll probably notice a wrinkle: Our counter at Slot 1 is at <code>00</code>. If we just use the Hookshot normally, then the Hookpush will stop early. To compensate for this, we'll want to pause when the Hookshot latches onto the chest. In the AD route, we want Lamp next, which is what the videos menu to. You can also [[Buffering|Select Buffer]], which you may be forced to do if you pause early. Because we want to skip Slot 1's data, you have a 3 frame window to pause once the Hookshot connects with the chest. If you miss, you can just retry. | * We now have our values set, but if you're familiar with Hookpush mechanics at all, you'll probably notice a wrinkle: Our counter at Slot 1 is at <code>00</code>. If we just use the Hookshot normally, then the Hookpush will stop early. To compensate for this, we'll want to pause when the Hookshot latches onto the chest. In the AD route, we want Lamp next, which is what the videos menu to. You can also [[Buffering|Select Buffer]], which you may be forced to do if you pause early. Because we want to skip Slot 1's data, you have a 3 frame window to pause once the Hookshot connects with the chest. If you miss, you can just retry. | ||
− | ===Fish Room | + | ===Fish Room=== |
− | === | + | ===Hammer Peg Cave to Checkerboard=== |
− | ===Hellway Skip | + | ===Hellway Skip=== |
− | ===Ice Fairy Room | + | ===Ice Fairy Room=== |
===Ice Entrance EG=== | ===Ice Entrance EG=== | ||
Line 117: | Line 310: | ||
===Mire Entrance EG=== | ===Mire Entrance EG=== | ||
+ | |||
+ | ===Pyramid Fairy EG=== | ||
===Skull Woods EG=== | ===Skull Woods EG=== | ||
Line 144: | Line 339: | ||
* Do a Bonked Bomb Jump to cross the gap. It doesn't matter if you're within 2px of the gap and can just stand and take the hit, we need a Bonk Ancilla to happen. The Dash Dust <code>1E</code> from your dash will still be in Slot 4 when you start bonking, so the Bonk Ancilla <code>1D</code> will go in Slot 3. This will set the counter at Slot 3 to <code>FF</code>, which is what we want. Pickup the Fire Rod. | * Do a Bonked Bomb Jump to cross the gap. It doesn't matter if you're within 2px of the gap and can just stand and take the hit, we need a Bonk Ancilla to happen. The Dash Dust <code>1E</code> from your dash will still be in Slot 4 when you start bonking, so the Bonk Ancilla <code>1D</code> will go in Slot 3. This will set the counter at Slot 3 to <code>FF</code>, which is what we want. Pickup the Fire Rod. | ||
* Now just Hookshot a wall and you should enter EG. The Hookpush will get to where it's reading Slot 3 data and terminate because we have an <code>FF</code> counter there, and it will pull us into EG because our EG Check at Slot 3 is non-zero. | * Now just Hookshot a wall and you should enter EG. The Hookpush will get to where it's reading Slot 3 data and terminate because we have an <code>FF</code> counter there, and it will pull us into EG because our EG Check at Slot 3 is non-zero. | ||
+ | |||
+ | ===Spike Cave to Library=== | ||
===Swamp Entrance to Mothula Crystal=== | ===Swamp Entrance to Mothula Crystal=== | ||
===TR Entrance EG=== | ===TR Entrance EG=== |
Latest revision as of 06:58, 27 July 2021
Hookpush is a Major Glitch that uses Misslotting to alter the values the Hookshot uses to determine how far and in what direction to pull Link when the hook latches onto something. Because the game mostly ignores collision while Link is being dragged by the Hookshot, this can be a very powerful glitch for bypassing walls and other obstacles.
Contents
- 1 Loose Explanation
- 2 General Technique
- 3 Applications
- 3.1 Checkerboard Cave to Pyramid Fairy
- 3.2 Chest Game to Red Boomerang
- 3.3 Chicken House to Witch Hut
- 3.4 Fish Room
- 3.5 Hammer Peg Cave to Checkerboard
- 3.6 Hellway Skip
- 3.7 Ice Fairy Room
- 3.8 Ice Entrance EG
- 3.9 Kakariko Shop to Ice Cave
- 3.10 Mire Entrance EG
- 3.11 Pyramid Fairy EG
- 3.12 Skull Woods EG
- 3.13 Spike Cave to Library
- 3.14 Swamp Entrance to Mothula Crystal
- 3.15 TR Entrance EG
Loose Explanation
This article assumes familiarity with the Terminology section at Ancilla glitches, so make sure you read that or you could have trouble making sense of this stuff.
Normally, when Link uses the Hookshot, a Hookshot ancilla is loaded into Slot 4 and a counter in that slot will immediately be set to 0 and then increment every frame the Hookshot is extending. When the Hookshot connects with an object to pull Link to, the counter will decrement every frame as Link is pulled to the object. Link is pulled 4px/frame until this counter gets back to 0. But what if we can get the Hookshot to look at different counters outside of its current ancilla slot? That's how this glitch is gonna work.
$039D
is a memory address where the Hookshot's current slot value is stored when we use the Hookshot, and it is used to determine which slot's counter the game should use when Link starts getting pulled. A Somaria block placed in Slot 9 will decrement the value at this address every frame. This means that if we have a Somaria block in Slot 9, and we use the Hookshot with no other ancilla loaded, the Hookshot will spawn in Slot 4 and the counter for Slot 4 will increment until the Hook connects with an object. For the first frame of pulling, the Slot 4 counter will be used, but then, because of the Slot 9 block decrementing the value at $039D
, the next frame of pulling will read data from Slot 3, the third frame of pulling from Slot 2, then Slot 1, and then finally Slot 0, where it will continually use this counter until it reaches 0.
Through using other ancillae in specific ways, we can manipulate the data in other slots to get the Hookshot to pull us for extended durations and/or in the incorrect directions. Or even have it pull us to EG.
General Technique
To best learn this and debug problems that may arise, you'll want to use Ancilla Watch in the Practice Hack. Open the Practice Hack Menu, go to HUD Extras, then Super Watch and toggle to Ancillae. This will draw values important to misslotting and Hookpushing on the left side of your HUD. Reference the image to see what these values are.In order to Hookpush, we want to do a few different things:
- Misslot a Somaria Block into Slot 9. This requires a couple of steps:
- Get the Search Index higher than
09
. This pretty much always involves getting a Lamp Flame in Slot 2 while Link is facing any direction BUT right. This is easily done by just using the Lamp 3 times quickly, but you can use it less if there are other objects on screen already occupying Slots 3 and/or 4. Not many things that crop up in normal gameplay write to this address, and only hard resets or overloading the Front Slots will put it back to 0. So you can often set this value way ahead of the exact room/moment where you want to do a Hookpush. - Fill the Front Slots (slots 0-4) with ancillae. This is necessary because Somaria blocks will occupy a Front Slot by default, but we want it to load into Slot 9.
- Have a Particle ancilla in Slot 9. When we go to use the Cane of Somaria with the Front Slots filled, the game will use the Search Index to begin a secondary search for where to place our block. The game will take the value of the Search Index and begin looking down from that value, which is why we want it above
09
. Particle ancillae (that is0A
,13
, and3C
) can be replaced by other ancillae, and that's exactly what we want to have happen. Since13
(Ice Rod Sparkles) and3C
(the sparkles on a charging sword, silver arrows, and red boomerang) naturally spawn in the Back Slots, these are what we'll use. Charging sword in particular is the most common, since it's convenient and puts3C
in Slots 7-9. - With the Search Index set above
09
, all of the Front Slots occupied, and a Particle ancilla loaded in Slot 9, we can use the Cane of Somaria and a block will be loaded into Slot 9. This will appear on the HUD as2C
in Slot 9.
- Get the Search Index higher than
- With a block in Slot 9, when we use the Hookshot, the game will look at the data for the Hookshot's slot for the first frame of the Hookpush and then for each subsequent frame it will use the data for the next slot down until it reaches Slot 0, where it will stay until the counter at Slot 0 has decremented down to
00
, indicating to the game that the Pull has ended. How we choose to manipulate the data at each Slot for the results that we want depends heavily on the context, and if you're looking to learn a specific Hookpush, you can go read the Applications section for info specific to what you're learning. But if you want a deeper understanding of Hookpushes, as well as the ability to create your own setups or modify existing ones, it helps to be familiar with the how these manipulations work. For that information, check out the below section outlining the memory addresses / arrays that are important for Hookpushing:
RAM Values Significant in Hookpushing
To introduce this, many of the variables ancillae use for their routines are contained in "arrays". In computer science, arrays are a data structure that organizes "elements" (in this case, the variables the game's ancillae are using) in a list in such a way where the program can easily access individual elements using the "index" of the element it wants. The game knows which index to look at in these arrays based on which Slot the ancilla is in. If it's in Slot 4, it looks at the 4th byte in the array, or if it's in Slot 2, it looks at the 2nd. When an array address is mentioned in this section, that will be the 0th index in the array. So for example, in the array at $0C5E
, that specific address is the 0th index, and ancillae in Slot 0 will control that value. But if an object in Slot 4 is using that array, it'd be controlling the address at $0C62
(0x0C5E + 0x04). Several arrays that ancillae use are going to impact how these setups work.
Duration Counter
This is the array that is drawn on the ancillae HUD to the right of the where the ancillae slots are. Normally the Hookshot will increment this counter at the Hookshot's Slot until it latches onto something, and then it will decrement this counter as Link is pulled at 4px/frame until it gets back to 00
, when the pull ends. With Slot 9 Somaria though, the Hookshot's pull routine will be looking at this value in different Slots of this array. Other ancilla control this array differently, and they often don't reinitialize or get rid of the values they put here. This allows us to precisely manipulate these values to get long pushes. Here's how you want to do it:
- We'll generally want the duration counters in the slots between the Hookshot's slot and Slot 0 to be a value other than
00
orFF
. If any of these values are00
orFF
, then the Hookpush will end on the frame the game is using that counter. By default the Hookshot will spawn in Slot 4, and if that's what the setup calls for, then you'll want the counters for Slots 1-3 to be any value other than00
/FF
. You can also force the Hookshot to load into different slots. If I place a Somaria block into Slot 3 and Dash Dust in Slot 4, then my Hookshot will spawn in Slot 2. Now the Hookpush will ignore data in Slots 3 and 4, and the Hookshot itself will set a good counter at Slot 2, meaning the player only needs to manipulate the counters at Slots 1 and 0. This can be very useful in some contexts, as manipulating all of the counters isn't always practical. - Generally we'll want the duration counter at Slot 0 to be a high value. This is because when the Hookpush gets to this value in Slot 0, it will use only this counter to pull Link until it decrements to
00
, when the Hookpush will end. Because Sword Beams write4C
to their slot's counter, a Slot 0 Sword Beam is often used for this. 0x4C in decimal is 76, meaning we get a whopping 76 frames of Hookpushing with that value. That's 304px of moving with no collision.
How Different Ancillae Write to this Array
Note/disclaimer about these tables: to save space and make this work easier, not every single ancilla is listed. Maybe they'll all be posted in the future, but this is going to focus on the ancillae currently used in RTA setups. Some of them are pretty much guaranteed useless anyway. Like Link's snoring in the opening cutscene is an ancilla $21
, and it's unlikely that stuff like that is ever going to figure into a Hookpush setup.
Hopefully each ancillae is named to avoid any confustion. "Wall Hit" $06
is what happens when you tink a wall with the Boomerang or the Hookshot (but NOT the sword, that's different and also not useful in any current setups). "Sparkles" $3C
are created from three different sources: Link holding a sword charge, the Red Boomerang, and Silver Arrows.
The "Item Get" $22
refers to ancillae that occur when you open chests, grab heart pieces/containers, etc. The table says the value they set varies considerably based on the exact item being collected, but it's also worth noting that these values tend to be solid for midrange Hookpushes. A few setups make use of Slot 0 "Item Gets" for this reason.
Ancillae at Duration Counter Array ($0C5E) | ||
---|---|---|
Ancilla Name | Ancilla ID | Values at $0C5E |
Somaria Beam | $01 |
00
|
Fire Rod Shot | $02 |
Varies depending on how far the shot travels. 00 if directly into an object, but can get into 3x range with lots of travel
|
Beam Wall Hit | $04 |
4C
|
Boomerang | $05 |
01
|
Wall Hit | $06 |
04
|
Bomb | $07 |
00 planted ; counts to 0B after explosion
|
Arrow | $09 |
08 if it hits something; FF if not
|
Wall Arrow | $0A |
08 until despawn -- then 09
|
Ice Rod Shot | $0B |
varies 02 - 07
|
Sword Beam | $0C |
4C
|
Ice Shot Wall Hit | $11 |
02
|
Bonk | $1D |
FF
|
Dash Dust | $1E |
06 for dust taps and very short dashes; 03 for longer dashes
|
Hookshot | $1F |
FF if Wall Hit or nothing is hit; 01-02 on a short Hook
|
Item Get | $22 |
varies a ton depending on the item |
Sword Slash Sparkle | $26 |
04 ; this ancilla only occurs with Master Sword or stronger
|
Spin Spark I | $2A |
counts to 04 and converts to Spin Spark II ancilla
|
Spin Spark II | $2B |
starts at 49 and counts down to 03 . can take dmg to interrupt the animation (and this counter)
|
Somaria Block | $2C |
00
|
Lamp Flame | $2F |
00
|
Sparkle | $3C |
03 ; these fill the Back Slots by default, but if you spawn enough of them, they will start spawning in the Front Slots as well
|
Directions
This array isn't drawn on the ancilla HUD, but if you're labbing stuff on emulator, you can watch it at $0C72
. When you use an ancilla, the direction Link is facing when he uses it is stored here. The Hookshot's pull routine will look at the value stored here at the Hookshot's Slot to determine which direction Link should be pulled in. But of course, we're making the Hookshot read this data at different Slots.
- The values at different Slots in this array aren't changed until new ancilla are loaded into a specific slot. If I Sword Beam north from Slot 4, Slot 4 in this array will indicate a north value (
00
) until something else happens at that Slot. - For most Hookpushes, the main direction that matters is what's stored at Slot 0. This is because the vast majority of your pull frames will be using Slot 0. If you want to clip a wall to your left, it doesn't matter much if other Slots aren't pushing you left since you'll only use them for one frame maximum. Therefore, when we use our Slot 0 ancilla (most commonly a Sword Beam), we want to be facing the direction we want to push in.
- Sometimes the Slot 0 ancilla you're using to set your Duration Counter won't touch this array at all. An example of this is if you're putting an "Item Get" ancilla at Slot 0 for your push. In these cases, you'll have to make sure your direction is set to a good value from some other prior source.
- Occasionally a setup will be specific enough that moving certain directions for even 1 frame WILL be a problem. Examples of this would include things like the Checkerboard Cave push to Pyramid Fairy or the push from Swamp Entrance to Moth's Room. In these scenarios, it can be easy to get Link stuck out of bounds or inside walls if his movement in the push isn't specifically correct, so you DO need to factor in the direction Link is moving in while the Hookshot is using other Slot data, even the stuff outside of Slot 0 that the Hookshot only uses for one frame.
How Different Ancillae Write to this Array
Some quick notes
- By 'normal' I mean these values are set
00
to03
based on the direction Link is facing:00
for north,01
for south,02
for west,03
for east. These work exactly as you would think. - Why are arrows weird? I dunno man. Don't think anyone else does either. We do know how these directions impact our Hookpush movement though. See this Link
- With Somaria beams, it can be important to know the logic of how the 4 beams fill the Slots. The highest available Front Slot will use the east beam, followed by the west beam, then the south beam, and finally the north beam. So if you blast a block with no other ancillae loaded, the east beam will use Slot 4, the west beam Slot 3, the south beam Slot 2, and the north beam Slot 1. And these will write the values you'd expect at those Slots (ie. east beam will set the east direction
03
at Slot 4).
Ancillae at Direction Array ($0C72) | ||
---|---|---|
Ancilla Name | Ancilla ID | Values at $0C72 |
Somaria Beam | $01 |
Normal |
Fire Rod Shot | $02 |
Normal |
Beam Wall Hit | $04 |
Normal |
Boomerang | $05 |
Normal |
Wall Hit | $06 |
Unaffected |
Bomb | $07 |
Normal |
Arrow | $09 |
04 north, 05 south, 06 west, 07 east.
|
Wall Arrow | $0A |
Unaffected |
Ice Rod Shot | $0B |
Normal |
Sword Beam | $0C |
Normal |
Ice Shot Wall Hit | $11 |
Normal |
Bonk | $1D |
00 for east/west bonks, 02 for north/south bonks.
|
Dash Dust | $1E |
Normal |
Hookshot | $1F |
Normal |
Item Get | $22 |
Unaffected |
Sword Slash Sparkle | $26 |
Normal |
Spin Spark I | $2A |
Unaffected |
Spin Spark II | $2B |
Unaffected |
Somaria Block | $2C |
Normal |
Lamp Flame | $2F |
Normal |
Sparkle | $3C |
Unaffected |
Hook Index
This refers to the value held at $039D
, which if you've read the info on this page so far, you already know what that is. This is the address that makes Hookpushing work. The Hookshot pull routine looks at what value is in this address to determine which Slot's data it should use when Link is being pulled by the Hookshot. A Somaria Block in Slot 9 decrements the value in this address every frame. And by every frame I mean EVERY frame -- even when the game is paused to the item menu or the S&Q menu. This makes different setups possible.
Consider the above information about Duration Counters and how we generally want the counters for Slots 1-3 to be nonzero values. But what if it's inconvenient (slow, clunky, or maybe even impossible) to manipulate every one of those to a nonzero value? Enter the pause tech. By pausing the game right when the Hookshot latches onto something, our Slot 9 Block will decrement the Hook Index value while we're paused. This can be used to bypass data we don't want to use. Most often it's used to skip over Slots 1 and 2, although it can even be used to skip over Slot 3. Since it's impossible to pause the game for only a handful of frames, you are guaranteed to have $039D
at Slot 0 coming out of your pause IF you paused after the Hookshot has latched onto the object you're using.
The frame window you have to pause on varies depending on which Slot has the 'bad' data you want to skip past. The most generous is if you just want to skip over Slot 1 (a 4 frame window). You have 3 frames to skip Slot 2, and only 2 frames to skip Slot 1. The technique most players use for these is to try to pause with the item menu while menuing to the next item you want equipped in the run. This is of course the fastest way to do this since you're working in something you'd have to do anyway. If you pause early however, you can switch to using the S&Q menu for Select Buffers, which are faster than pausing to the item menu repeatedly to advance frames in game.
EG Check
EG Check is what we call the array at $03A4
. Values at this array can determine whether we are or are not put into EG when we Hookpush.
- Generally the way this works is: if your EG Check Value is
00
at the Slot the Hookpush ends at, you will stay in the same layer you're currently on. If your EG Check Value is NOT00
at the Slot the Hookpush ends at AND you have Strong EG set, you will be put into the opposite layer (typically EG) when the Hookpush ends. - The Red Number on the Ancillae Super Watch for the practice hack represents the EG Check value at Slot 0. This is a useful number to check when you DON'T want to enter EG with your Hookpush. Because 99% of non-EG setups will manipulate values so that the Hookpush is ending while using Slot 0 data, this value is the significant one to watch, and the EG Check value at other Slots will be meaningless. For avoiding EG on Hookpushes, we want this value to either be
00
exactly OR we want to trigger a screen transition before the Hookpush comes to an end (ie. the Duration Counter at Slot 0 does not get all the way down to00
) OR we want Weak EG set. One of the most common manipulations of the Slot 0 EG Check is doing Slot 0 Sword Beams straight into a wall or other object. Note in the table below that while normal Sword Beams will move the EG Check variable around at the Slot it's using, Sword Beam Wall Hits will zero this value. Sword Beam Wall Hits still set high Duration Counters though! - So what if you DO want to Hookpush into EG? Well in that case, from reading the logic of the first point in this section, you may have realized that it's unnecessary to manipulate values at Slot 0, and indeed, most modern EG push setups don't bother to do so. It's typically much better and faster to do stuff like: Hookshot from Slot 4, have a Duration Counter of
00
orFF
in Slot 3 (so that the Hookpush ends at that Slot), and have an EG Check value at Slot 3 that is nonzero. In this case, you will almost immediately get put into EG when you Hookshot anything. The EG Checks at Slots other than Slot 0 aren't included on the Ancillae Super Watch HUD for the PracHack, but you can watch them on emulator at the array$03A4
.
How different Ancillae Write to this Array
One thing to note is that oftentimes, if an ancillae does put nonzero values at this array, they will oscillate around a few different values in a predictable manner. For example, Sword Beams will count the EG Check at its Slot up from 00
to 03
, then cycle back to 00
and repeat. This means that you can get consistent 00
values by Sword Beaming from certain coordinates such that the Sword Beam will end while the value of the EG Check is 00
. The reverse is true when you want nonzero values for entering EG. You'd have to Sword Beam from certain coordinates such that the Sword Beam will end while the EG Check at that Slot is nonzero.
Ancillae at EG Check Array ($03A4) | ||
---|---|---|
Ancilla Name | Ancilla ID | Values at $03A4 |
Somaria Beam | $01 |
Unaffected |
Fire Rod Shot | $02 |
Unaffected |
Beam Wall Hit | $04 |
00
|
Boomerang | $05 |
00-03
|
Wall Hit | $06 |
Unaffected |
Bomb | $07 |
Unaffected |
Arrow | $09 |
Unaffected |
Wall Arrow | $0A |
Unaffected |
Ice Rod Shot | $0B |
Unaffected |
Sword Beam | $0C |
00-03
|
Ice Shot Wall Hit | $11 |
Unaffected |
Bonk | $1D |
Unaffected |
Dash Dust | $1E |
Unaffected |
Hookshot | $1F |
00
|
Item Get | $22 |
00
|
Sword Slash Sparkle | $26 |
Unaffected |
Spin Spark I | $2A |
FF
|
Spin Spark II | $2B |
00-03 ; always ends at 00
|
Somaria Block | $2C |
00
|
Lamp Flame | $2F |
Unaffected |
Sparkle | $3C |
Unaffected |
Slot 9 Somaria Block's EG Check
Slot 9 Somaria Blocks will use their EG Check at $03A4,9
which is $03AD
. This is writing into a separate array that starts on $03A9
that various ancillae write to. Slot 4 in this array is the same address Slot 9 Blocks are using for their EG Check, and there are 3 ancillae that when placed in Slot 4, will write negative values into this address. This is really bad -- the result of using one of these ancillae in Slot 4 is immediate deletion of a Slot 9 Block. So of course for the purposes of Hookpushing, it's essential we avoid using the following 3 ancillae at Slot 4 after we've placed the Slot 9 Block:
- Cane of Somaria Blocks (Somaria beams are fine)
- Bow
- Sword Beams to the North, West, or South
Note that you can use these 3 ancillaes in other Slots. Also note that Sword Beams to the East are fine because they set a different value in $03A9,X
.
Sword Beams and Somaria Blocks are often used in Hookpush setups even after placing the Slot 9 Block, but since these load into Slot 4 by default, we have to manipulate them into using other Slots. The most common way is to Dash Dust to occupy Slot 4 and then immediately Beam/Block to have it occupy Slot 3. There are other methods though, as you'll see when you get into applying this in actual setups.
Ancillae Coordinates
This is one of the weirder ones to understand, but it's also an important mechanic to grasp, especially if you start looking at creating your own setups.
So far we've established that one of the conditions that the game will think "okay, the hookshot pull has ended" and stop Link's movement is when the counter the Hookshot is using at $0C5E
has reached 0. But there's another thing that can end the Hookshot pulling Link, and it's related to ancillae coordinates. There are two arrays that contain ancillae coordinates: one for their x-position $0C04
and one for their y-position $0BFA
.
Let's say Link uses his Hookshot to the north; the game will track the position of the Hookshot's tip at the ancillae coordinate arrays, and the Hook will of course stop when it latches onto something. The game will then compare the position of the Hookshot's coordinates with the position of Link along the axis he's moving in while he's being pulled. In this example, that's north, so the game won't be looking at either the Hookshot's or Link's x-coordinate for this check. If Link can get 1px or 0px (he pulls even with it) within the Hookshot's y-coordinate, the Hookshot pull will terminate.
This mechanic can present a problem with Hookpushing because the Hookshot's pull will be reading data from different slots, and that includes the ancillae coordinates. When we use a Sword Beam for example, the game will track its coordinates at the same coordinate arrays, and these values don't disappear when the Sword Beam hits something and dissipates. It is important then that when setting up our ancillae for Hookpushes, that we consider where the ancillae we're using end up. Otherwise our Hookpush could be canceled before the Duration Counter would ordinarily end it.
So now let's say we want to Hookpush through the north wall in a room. We want a Slot 0 Sword Beam to do this, and using all of the above knowledge, you get all your values aligned to make this work. But we placed your Slot 0 Sword Beam against the top wall in the room. Link HAS to travel through this coordinate, which means the Hookpush will fail unless started from specific positions in the room that would skip over the window where the Hookshot would cancel. This is often extremely slow to precisely position Link in a way where he can avoid passing through the bad pixels during the Hookpush. A better solution would be to set our Slot 0 Sword Beam by slashing upwards into an object that's lower in the room. This way, the Sword Beam's y-coordinate is completely out of Link's path on the Hookpush, and we can freely start our Hookpush from any position so long as it's above where our Sword Beam died. This is an extremely common manipulation you'll see in the below setups, and it's important to be aware of it for creating your own setups (or for modifying existing ones).
Applications
Checkerboard Cave to Pyramid Fairy
Chest Game to Red Boomerang
Chicken House to Witch Hut
This Push is currently done in All Dungeons MG as a way to quickly get a Green Potion. The Boomerang is also collected for help with later tricks, but it isn't involved in the setup for this trick.
Technique
- Have your Search Index set above
09
. As per usual, this can be set ahead of this room where we're doing the trick, and it saves time to do so. The videos begin with a good value set already. - Position Link between the barrels above and below him. Face left and place a Bomb. You'll now have a Bomb
07
in Slot 1. - Hold Sword out and quickly place a block, blast the block, and place another one. The Bomb you have in Slot 1 will combine with the four beams from the block blast
01
to fill up the Front Slots. Holding your sword will put sparkle ancillae3C
in Slots 7-9, and your 2nd Block2C
should be placed into Slot 9. - While walking towards the Boomerang chest, tap
1E
in Slot 4 and2C
in Slot 3. The dust before block is important because if we just place a block, it will load into Slot 4, which will delete our Slot 9 block. Additionally pay attention to where the block is placed in the videos. This isn't too precise, we just want east beam to have some travel room when we blast the block later, and if you place it just anywhere, it can interfere with the values we'll want after blasting.
for Dash Dust and immediately place another block. This will put - Currently the Boomerang is collected in the category that uses this trick, but if you didn't want to collect it, that's fine as it doesn't really factor into the setup. You will want to wait for the bomb to explode before doing the next step though.
- Now we want to blast the block and quickly slash twice. Note how in the videos, Link is moved to the left a bit before facing back right to do this sequence. We want to avoid doing these inputs on x-coords
178
or177
and we also want Link facing right, especially when we're slashing. The block blast will fill Slots 1-4 with somaria beams01
and the first sword beam04
(it'll have this ID since we're beaming straight into a wall) will be put in Slot 0, where it will write4C
into that Slot's counter. If your block placement was good, then the 2nd slash you do will happen after the north, south, and west somaria beams have despawned, leaving just the east beam occupying Slot 4. This will put another sword beam04
in Slot 2, and a sword sparkle ancilla26
in Slot 3. This will set the counters in Slots 2 and 3 to4C
and04
respectively. - We now have our values set, but if you're familiar with Hookpush mechanics at all, you'll probably notice a wrinkle: Our counter at Slot 1 is at
00
. If we just use the Hookshot normally, then the Hookpush will stop early. To compensate for this, we'll want to pause when the Hookshot latches onto the chest. In the AD route, we want Lamp next, which is what the videos menu to. You can also Select Buffer, which you may be forced to do if you pause early. Because we want to skip Slot 1's data, you have a 3 frame window to pause once the Hookshot connects with the chest. If you miss, you can just retry.
Fish Room
Hammer Peg Cave to Checkerboard
Hellway Skip
Ice Fairy Room
Ice Entrance EG
Kakariko Shop to Ice Cave
This Hookpush is currently used in the All Dungeons MG Speedrun as a way to collect Ice Rod quickly. It also has a useful side effect of easily getting 10 Bombs.
Technique
- First make sure your Search Index is set high. This can be done well before coming here, and in the videos, it's already set to a good value.
- Place a Cane Block in the room. It's good to make sure that when you pop the block all four beams have plenty of room to travel before hitting a wall and despawning. You should now have object
2C
in Slot 4. - Hold sword and then quickly pop the block, dash dust, and place another block. The beams from the Somaria block (objects
01
) will occupy Slots 1-4, your dash dust (object1E
) will occupy Slot 0, and the second block you place (object2C
) will be placed in Slot 9. - In the current speedrun where this Hookpush is used, bombs are bought here. Although the "item get" is an ancilla, it doesn't actually factor into this setup.
- Dash dust and place a regular block. This will put
1E
in Slot 4 and then another block (2C
) in Slot 3. This is important because we want another block, but if we just place one, it will be put in Slot 4. Slot 4 blocks will delete blocks in Slot 9 (very bad). - Pop the block and quickly slash right twice directly into the wall. Somaria beams (
01
) will occupy Slots 1-4. Your first slash will have a Sword Beam wall-hit (04
) in Slot 0. It's essential this 1st slash is done before any of the Somaria beams despawn, otherwise it won't get put in Slot 0. Also note that we really want this to just be a Sword Beam wall-hit. If we spawn a full Sword Beam (object0C
), your Slot 0 counter will be good, but the EG Check (the red number on the ancillae HUD) could be set to non-zero, and we really don't want this. After the Sword Beam wall-hit, the counter for Slot 0 should now be4C
. We want our 2nd slash to come after two of the beams have despawned (the top and right ones). The bottom and left ones should still be there in Slots 2 and 3. A new sword beam will spawn in Slot 4, and a slash sparkle ancilla (26
) will spawn in Slot 1, which will set the counter there to04
. - Now just dash dust and slash while walking south to the bottom right corner of the room. This will put dash dust (
1E
) in Slot 4, a Sword Beam (0C
) in Slot 3, and a Slash Sparkle (26
) in Slot 2. This should set the counter in Slot 3 to4C
and the counter in Slot 2 to04
. - All of our values should be set now. Check that the counters in Slots 1-3 are non-zero and that the counter in Slot 0 is
4C
. If so, you were successful and you just need to Hookshot the torch from the bottom right corner of the room.
Mire Entrance EG
Pyramid Fairy EG
Skull Woods EG
If you want to go to Mothula directly after getting Fire Rod, Hookpushing into EG is the fastest way. There are a couple of different ways to set this up depending on the category/route.
Zeroing Search Index
This setup is useful in All Dungeons MG because the next segment in the run is Ice Palace, and the fastest way to Ice Palace is to Ancillae Overload Fake Flippers to swim in Lake Hylia. This method gets us into EG and sets our Search Index to 00
, which is important for doing that Fake Flippers later.
Technique
- As per usual, have the Search Index set above
09
. - Hold
2C
in Slot 4.
out of the door and turn back right to place a block above the doorway. When we blast the block, we want the bottom beam to have a little travel room, and if we don't place it above the doorway, it'll hit the bottom wall and despawn too quickly. This will place a block - Hold straight
038-043
. Because we have a block in Slot 4 already, this beam will go in Slot 3, and if done on that x-coordinate window, it will set the EG Check for Slot 3 to a non-zero value. This EG Check isn't drawn on the ancillae HUD, so you just have to know that you got it. If you're on emulator and want to see this visually, you can RAM Watch the address for Slot 3's EG Check:$03A7
.
until Link is roughly at the corner of the statue. We're aiming to sword beam to the right on an 11 pixel x-coordinate window: - When you beam, you want to continue holding
3C
in Slots 7-9.
so that Link begins holding a sword charge. This will put sparkle ancillae - Before the Sword Beam has time to hit the right wall and disappear, we want to quickly blast the Somaria Block and then place a new one. This will put Somaria beams
01
in Slots 0, 1, 2, and 4 (Sword Beam should still be in Slot 3), which fills up the Front Slots. The new block we place should be placed into Slot 9. - Now we're gonna walk up and place the Bomb we'll use to do Skull Woods Bomb Jump. While waiting for this Bomb's fuse, we're going to overload the Front Slots and not use any Particle ancillae. This means the Search Index will fail to find a placement for a new ancilla, and it will be decremented down to
00
. The Bomb07
we place to jump goes in Slot 1. Immediately place another Bomb - this will go in Slot 0. Sword Beam0C
across the room to the right so that it has a bit of room to travel. This beam will go in Slot 4. Dash Dust1E
(goes in Slot 3) and use the Hookshot1F
(goes in Slot 2) into the left wall. All the Front Slots are now filled and when the Hookshot hits the wall, the game will want to load a Wall Hit Ancilla06
as the Hookshot tinks the wall, except there's no room for one. The Search Index will run its search and find no particle ancillae to overwrite, and this will put the Search Index at00
. - Do a Bonked Bomb Jump to cross the gap. It doesn't matter if you're within 2px of the gap and can just stand and take the hit, we need a Bonk Ancilla to happen. The Dash Dust
1E
from your dash will still be in Slot 4 when you start bonking, so the Bonk Ancilla1D
will go in Slot 3. This will set the counter at Slot 3 toFF
, which is what we want. Pickup the Fire Rod. - Now just Hookshot a wall and you should enter EG. The Hookpush will get to where it's reading Slot 3 data and terminate because we have an
FF
counter there, and it will pull us into EG because our EG Check at Slot 3 is non-zero.