<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://ukikipedia.net/mediawiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Aurumaker72</id>
	<title>Ukikipedia - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://ukikipedia.net/mediawiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Aurumaker72"/>
	<link rel="alternate" type="text/html" href="https://ukikipedia.net/wiki/Special:Contributions/Aurumaker72"/>
	<updated>2026-10-06T07:09:49Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.39.15</generator>
	<entry>
		<id>https://ukikipedia.net/mediawiki/index.php?title=Iwerlipse&amp;diff=19860</id>
		<title>Iwerlipse</title>
		<link rel="alternate" type="text/html" href="https://ukikipedia.net/mediawiki/index.php?title=Iwerlipse&amp;diff=19860"/>
		<updated>2025-10-16T17:36:06Z</updated>

		<summary type="html">&lt;p&gt;Aurumaker72: add info about SM64 Lua Redux integration&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The &#039;&#039;&#039;Iwerlipse&#039;&#039;&#039; (pronounced ee-ver-lipse /ˈivɜlɪps/) is the range of positions Mario can occupy while he is in the air and cannot turn, assuming that drag is constant. The boundary of the Iwerlipse is reached by &#039;&#039;&#039;Arctan Straining&#039;&#039;&#039; - the optimal way of air straining that gives the greatest distance along a chosen angle &amp;lt;math&amp;gt;\omega&amp;lt;/math&amp;gt; for a given number of frames &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt;. For a single frame &amp;lt;math&amp;gt;T=1&amp;lt;/math&amp;gt;, the Iwerlipse is an ellipse with half-width 10 (in the sideways direction) and half-height 1.5 (in the forwards direction). For general &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt;, it resembles an ellipse with half-width &amp;lt;math&amp;gt;10T&amp;lt;/math&amp;gt; and half-height &amp;lt;math&amp;gt;3T(T+1)/4&amp;lt;/math&amp;gt;, but bulges at the corners, covering more area than an ellipse with the same dimensions. As shown by &#039;&#039;Grassdigger&#039;&#039;, the shape is well approximated by a generalised superellipse, and thus &#039;&#039;Pannenkoek2012&#039;&#039; proposed calling this shape the Iwerlipse - a pun on the name of &#039;&#039;Iwer Sonsch&#039;&#039;, who first discoverered that Arctan Straining was optimal in April 2018.&lt;br /&gt;
&lt;br /&gt;
==Basics==&lt;br /&gt;
&lt;br /&gt;
Arctan Straining gives the maximum possible distance along a target angle &amp;lt;math&amp;gt;\omega&amp;lt;/math&amp;gt; that differs from the facing angle &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt;, over a finite number of frames &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt;. It is performed by choosing straining angles &amp;lt;math&amp;gt;\phi_t&amp;lt;/math&amp;gt; (intendedYaw) such that&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;background:#f9f9f9; border-left:3px solid #bbb; padding:0.4em 0.8em; margin:1em 0;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
\phi_t - \theta =&lt;br /&gt;
\begin{cases}&lt;br /&gt;
    \arctan \left[\dfrac{10\tan(\omega - \theta)}{1.5(T+1-t)} \right] &amp;amp; \text{if } \cos(\omega-\theta) &amp;gt; 0, \\[14pt]&lt;br /&gt;
    \arctan \left[\dfrac{10\tan(\omega - \theta)}{1.5(T+1-t)} \right] + 180^\circ &amp;amp; \text{if } \cos(\omega-\theta) &amp;lt; 0,&lt;br /&gt;
\end{cases}&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
with &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; being the frame number between &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt;. (Usually only the top row of this equation is given, but since the &amp;lt;math&amp;gt;\arctan&amp;lt;/math&amp;gt; function only gives results between &amp;lt;math&amp;gt;\pm 90^\circ&amp;lt;/math&amp;gt;, we must add &amp;lt;math&amp;gt;180^\circ&amp;lt;/math&amp;gt; to the result if the target angle is behind Mario.)&lt;br /&gt;
&lt;br /&gt;
Arctan straining is a result of two asymmetries in how Mario&#039;s forward velocity and sideways speed are updated&lt;br /&gt;
&lt;br /&gt;
* Forward velocity accelerates gradually over time, while sideways speed is reset every frame&lt;br /&gt;
&lt;br /&gt;
* Straining on a single frame has a weak effect on forward velocity (increasing velocity by a maximum of 1.5), but a strong effect on sideways speed for a single frame (setting sideways speed to a maximum of 10).&lt;br /&gt;
&lt;br /&gt;
In terms of total distance acquired along some direction, forward velocity is thus more effective over long periods of time, where it has time to accelerate to large values, whereas sideways speed is more effective over short periods of time. Optimal straining over many frames then involves straining mostly along the forwards direction to build up a large forward velocity, and then towards the end of the trajectory, transitioning into sideways straining to exploit the large sideways displacement obtainable in a single frame.&lt;br /&gt;
&lt;br /&gt;
==Update Equations==&lt;br /&gt;
&lt;br /&gt;
When Mario is in the air and cannot turn, the function &amp;lt;code&amp;gt;update_air_without_turn&amp;lt;/code&amp;gt; is responsible for updating Mario&#039;s velocity variables from one frame, &amp;lt;math&amp;gt;t-1&amp;lt;/math&amp;gt;, to the next, &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;. Without loss of generality, we can choose coordinates so that Mario&#039;s facing angle is zero. In other words, he is facing along the &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;-axis, while his sideways speed is directed along the &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;-axis. Mario&#039;s forward velocity, &amp;lt;math&amp;gt;v_t&amp;lt;/math&amp;gt;, and position coordinates &amp;lt;math&amp;gt;z_t&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;x_t&amp;lt;/math&amp;gt; are then updated via&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;background:#f9f9f9; border-left:3px solid #bbb; padding:0.4em 0.8em; margin:1em 0;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
v_t &amp;amp;= v_{t-1} - D(v_{t-1}, \phi_t) + 1.5\cos(\phi_t),\\&lt;br /&gt;
z_t &amp;amp;= z_{t-1} + v_t,\\ x_t &amp;amp;= x_{t-1} + 10\sin(\phi_t),&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
where &amp;lt;math&amp;gt;\phi_t&amp;lt;/math&amp;gt; is the straining angle (intendedYaw) on frame &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;. The total effect of drag is given by the coefficient &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;, determined by&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
D(v_{t-1}, \phi_t) =&lt;br /&gt;
\begin{cases}&lt;br /&gt;
-2.35 &amp;amp; \text{if } v_{t-1} &amp;lt; - 16.35 - 1.5 \cos(\phi_t),\\&lt;br /&gt;
-0.35 &amp;amp; \text{if } -16.35 - 1.5 \cos(\phi_t) \leq v_{t-1} \leq -0.35,\\&lt;br /&gt;
v_{t-1} &amp;amp; \text{if } -0.35 &amp;lt; v_{t-1} &amp;lt; 0.35,\\&lt;br /&gt;
0.35 &amp;amp; \text{if } 0.35 \leq v_{t-1} \leq D_\text{cap} + 0.35 - 1.5 \cos(\phi_t),\\&lt;br /&gt;
1.35 &amp;amp; \text{if } v_{t-1} &amp;gt; D_\text{cap} + 0.35 - 1.5 \cos(\phi_t).&lt;br /&gt;
\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
where &amp;lt;math&amp;gt;D_\text{cap}&amp;lt;/math&amp;gt; is a soft velocity cap equal to 48 for long jumps and 32 otherwise.&lt;br /&gt;
&lt;br /&gt;
In practice, these drag boundaries are far enough apart that the drag is often constant over large periods of time. In this case we can write Mario&#039;s position after &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; frames as&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
x_T &amp;amp;= x_0 + 10 \sum_{t=1}^{T} \sin(\phi_t),\\&lt;br /&gt;
z_T &amp;amp;= z_0 + v_0 T - D \sum_{t=1}^T t + 1.5 \sum_{t=1}^T \sum_{n=1}^t \cos(\phi_n).&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Using &amp;lt;math&amp;gt;\sum_{t=1}^T t = T(T+1)/2&amp;lt;/math&amp;gt;, and by grouping terms of &amp;lt;math&amp;gt;\cos(\phi_t)&amp;lt;/math&amp;gt;, the latter can be simplified to&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; z_T = z_0 + v_0 T - \frac{DT(T+1)}{2} + 1.5 \sum_{t=1}^T (T+1-t)\cos(\phi_t). &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Notice that, since forward straining produces an acceleration that is not reset between frames, earlier frames have a stronger effect on the final &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; position than later frames. The effective strength is &amp;lt;math&amp;gt;1.5(T+1-t)&amp;lt;/math&amp;gt;, i.e. 1.5 multiplied by the number of frames remaining (including the current frame), since the forward velocity gained on one frame produces a displacement also on all remaining frames.&lt;br /&gt;
&lt;br /&gt;
==Arctan Straining Proof==&lt;br /&gt;
&lt;br /&gt;
The displacement vector after &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; frames is&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{R} = (x_T - x_0)\mathbf{\hat{x}} + (z_T - z_0)\mathbf{\hat{z}}&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
while the unit vector along the angle &amp;lt;math&amp;gt;\omega&amp;lt;/math&amp;gt; is&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{\hat{n}} = \sin(\omega)\mathbf{\hat{x}} + \cos(\omega)\mathbf{\hat{z}}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
The distance we move along a target angle &amp;lt;math&amp;gt;\omega&amp;lt;/math&amp;gt; over &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; frames is then&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; S = \mathbf{R} \cdot \mathbf{\hat{n}} = \langle S\rangle + \sum_{t=1}^T S_t, &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
where&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \langle S \rangle = \left(v_0 T - \frac{DT(T+1)}{2}\right)\cos(\omega), &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
is due to our initial velocity and drag, while&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; S_t = 10\sin(\phi_t)\sin(\omega) + 1.5(T+1-t)\cos(\phi_t)\cos(\omega), &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
is the effective contribution from straining on frame &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;.&lt;br /&gt;
Thanks to this separation, we can maximize the total distance &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; by individually maximizing each contribution &amp;lt;math&amp;gt;S_t&amp;lt;/math&amp;gt; as a function of &amp;lt;math&amp;gt;\phi_t&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \frac{d S_t}{d \phi_t} = 10\cos(\phi_t)\sin(\omega) - 1.5(T+1-t)\sin(\phi_t)\cos(\omega) = 0, &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
and finally we find&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \tan(\phi_t) = \frac{10\tan(\omega)}{1.5(T+1-t)}, &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
or, rotating the coordinate system back to allow for general facing angles &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \tan(\phi_t - \theta) = \frac{10\tan(\omega - \theta)}{1.5(T+1-t)}. &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Since &amp;lt;math&amp;gt;\tan(x) = \tan(x\pm180^\circ)&amp;lt;/math&amp;gt;, this equation has two solutions for &amp;lt;math&amp;gt;\phi_t&amp;lt;/math&amp;gt; which are given above.&lt;br /&gt;
&lt;br /&gt;
== Iwerlipse Equations ==&lt;br /&gt;
&lt;br /&gt;
By writing &amp;lt;math&amp;gt;\sin(\phi_t)&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;\cos(\phi_t)&amp;lt;/math&amp;gt; in terms of &amp;lt;math&amp;gt;\tan(\phi_t)&amp;lt;/math&amp;gt;, and using the optimal straining relation, we obtain exact expressions for the boundary of the Iwerlipse after &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; frames:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;background:#f9f9f9; border-left:3px solid #bbb; padding:0.4em 0.8em; margin:1em 0;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt; \begin{aligned} x_T - x_0 &amp;amp;= \pm10 \sum_{t=1}^T \frac{1}{\sqrt{1+\beta^2 t^2}},\\ z_T - \langle z \rangle &amp;amp;= \pm1.5 \beta \sum_{t=1}^T \frac{t^2}{\sqrt{1+\beta^2 t^2}}, \end{aligned} &amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
where&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\beta = \frac{1.5}{10}\tan(\omega),&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
and&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\langle z \rangle = z_0 + v_0 T - \frac{DT(T+1)}{2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
We can restrict &amp;lt;math&amp;gt;0 &amp;lt; \omega &amp;lt; 90^\circ&amp;lt;/math&amp;gt;, with the four combinations of plus and minus signs giving the remaining quadrants.&lt;br /&gt;
The Iwerlipse&#039;s half-width is &amp;lt;math&amp;gt;x_\mathrm{max} = 10T&amp;lt;/math&amp;gt;, while its half-height is &amp;lt;math&amp;gt;z_\mathrm{max} = 3T(T+1)/4&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Approximations ===&lt;br /&gt;
&lt;br /&gt;
If &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; is large, the exact expressions involve large summation terms, so it may be useful to have approximate expressions that are easier to compute.&lt;br /&gt;
By replacing the summations from &amp;lt;math&amp;gt;t=1&amp;lt;/math&amp;gt; to &amp;lt;math&amp;gt;t=T&amp;lt;/math&amp;gt; with an integral from &amp;lt;math&amp;gt;t=1/2&amp;lt;/math&amp;gt; to &amp;lt;math&amp;gt;t=T+1/2&amp;lt;/math&amp;gt; (essentially performing the midpoint rule of numerical integration in reverse), we obtain&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;background:#f9f9f9; border-left:3px solid #bbb; padding:0.4em 0.8em; margin:1em 0;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt; \begin{aligned} x_T - x_0 &amp;amp;= \pm \frac{10}{\beta} \left[\operatorname{arsinh}(\beta t)\right]^{T+1/2}_{1/2},\\ z_T - \langle z \rangle &amp;amp;= \pm \frac{3}{4\beta^2} \left[\beta t\sqrt{1+\beta^2 t^2} - \operatorname{arsinh}(\beta t)\right]^{T+1/2}_{1/2}, \end{aligned} &amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
with the notation &amp;lt;math&amp;gt;[F(t)]_{t_1}^{t_2} = F(t_2) - F(t_1)&amp;lt;/math&amp;gt;.&lt;br /&gt;
This approximation converges to the true result very quickly:&lt;br /&gt;
even for &amp;lt;math&amp;gt;T=2&amp;lt;/math&amp;gt;, the RMS error (normalized by &amp;lt;math&amp;gt;x_\mathrm{max}&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;z_\mathrm{max}&amp;lt;/math&amp;gt;) is &amp;lt;math&amp;gt;4.3\times10^{-3}&amp;lt;/math&amp;gt;,&lt;br /&gt;
while for &amp;lt;math&amp;gt;T&amp;gt;6&amp;lt;/math&amp;gt; it is less than &amp;lt;math&amp;gt;10^{-3}&amp;lt;/math&amp;gt;.&lt;br /&gt;
Similar expressions obtained using the Euler–Maclaurin formula converge more slowly, even with first-order correction terms.&lt;br /&gt;
&lt;br /&gt;
A simpler but less accurate approximation is obtained by fitting the Iwerlipse to the generalized superellipse:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;background:#f9f9f9; border-left:3px solid #bbb; padding:0.4em 0.8em; margin:1em 0;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt; \left(\frac{x_T - x_0}{x_\mathrm{max}}\right)^{m(T)} + \left(\frac{z_T - \langle z \rangle}{x_\mathrm{max}}\right)^{n(T)} = 1. &amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The optimal exponents &amp;lt;math&amp;gt;m(T)&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;n(T)&amp;lt;/math&amp;gt; have been found up to &amp;lt;math&amp;gt;T=150&amp;lt;/math&amp;gt; (5 seconds), and can be obtained from a lookup table&amp;lt;ref&amp;gt;[https://drive.google.com/file/d/1xDmgHz878qiAS1ZF1Y5M0M1eiZUdZRSl/view?usp=sharing Showing Iwer&#039;s proof and deriving the Iwerlipse expressions.]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
Unlike the integral approximation, this expression never converges to the exact result — there is always some small error.&lt;br /&gt;
&lt;br /&gt;
== Quarterstep Penalty ==&lt;br /&gt;
&lt;br /&gt;
If &amp;lt;math&amp;gt;q \in {0,1,2,3}&amp;lt;/math&amp;gt; quartersteps are lost on the final frame,&lt;br /&gt;
the forward velocity gained on frame &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; no longer accumulates forward distance over &amp;lt;math&amp;gt;T+1-t&amp;lt;/math&amp;gt; frames,&lt;br /&gt;
but instead over &amp;lt;math&amp;gt;T - q/4 + 1 - t&amp;lt;/math&amp;gt; frames.&lt;br /&gt;
The optimal straining relation becomes:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;background:#f9f9f9; border-left:3px solid #bbb; padding:0.4em 0.8em; margin:1em 0;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt; \tan(\phi_{t&#039;}) = \begin{cases} \dfrac{10\tan(\omega)}{1.5(T - q/4 + 1 - t)}, &amp;amp; \text{if } t &amp;lt; T,\\[10pt] \dfrac{10\tan(\omega)}{1.5}, &amp;amp; \text{if } t = T. \end{cases} &amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The optimal straining angle for the final frame is not affected, since in this case the ellipse shrinks in both directions rather than just vertically, i.e. a factor &amp;lt;math&amp;gt;1-q/4&amp;lt;/math&amp;gt; cancels in the numerator and denominator.&lt;br /&gt;
&lt;br /&gt;
== History ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-size:120%; font-weight:bold; margin-top:1em;&amp;quot;&amp;gt;2 July 2017&amp;lt;/div&amp;gt;&lt;br /&gt;
Plush discovers that during a dive recover, one can gain greater distance along an angle different from Mario&#039;s facing angle by “flinging” the control stick through different angles during the trajectory, rather than holding it at a constant angle.&lt;br /&gt;
&lt;br /&gt;
Pannenkoek qualitatively explains this phenomenon that would later be known as &#039;&#039;arctan straining&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote style=&amp;quot;font-style: italic;&amp;quot;&amp;gt;&lt;br /&gt;
I think you&#039;re supposed to hold forward-ish for most of it, then sideways at the end. Because sideways movement doesn&#039;t depend on your speed. So 5 frames of sideways holding at the start of the DR is equivalent to the 5 frames at the end. But forward distance depends on your hspeed. So let&#039;s say you start with some hspeed. If you go sideways then forwards, then you&#039;ll lose that hspeed. But if you go forward then sideways, then you&#039;ll take advantage of your starting hspeed. The best inputs would probably mix sideways and forwards somewhat.  &lt;br /&gt;
&amp;lt;br /&amp;gt; — &amp;lt;b&amp;gt;Pannenkoek2012&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Peter Fedak shares the correct velocity update equations, and the three of them begin to consider what the mathematically optimal inputs are.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-size:120%; font-weight:bold; margin-top:1em;&amp;quot;&amp;gt;3 September 2017&amp;lt;/div&amp;gt;&lt;br /&gt;
Iwer Sonsch independently rediscovers the velocity update equations and realises that by facing along the hypotenuse of the forward velocity and sideways speed — a trick known in other speedrunning communities as &#039;&#039;vectoring&#039;&#039; — he can gain greater distance in a single frame.  &lt;br /&gt;
He wonders how this would look over multiple frames, restarting the discussion of optimal straining.  &lt;br /&gt;
However, there is no quantitative progress until it becomes relevant to the A Button Challenge the following year.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-size:120%; font-weight:bold; margin-top:1em;&amp;quot;&amp;gt;18 March 2018&amp;lt;/div&amp;gt;&lt;br /&gt;
The “Blast to the Stone Pillar” star in JRB is collected in 0 A presses for the first time, after Tyler Kehne figures out how to use conserved speed to get from the nearby pillar to the star platform.&lt;br /&gt;
&lt;br /&gt;
The community turns their attention to whether the “Treasure of the Ocean Cave” star can be collected in a similar way, again reviving the optimal straining question, as people including Iwer, bad_boot, and DeRockProject begin attempting to make the most of the limited speed they have available.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-size:120%; font-weight:bold; margin-top:1em;&amp;quot;&amp;gt;16 April 2018&amp;lt;/div&amp;gt;&lt;br /&gt;
Iwer states the optimal straining equation for the first time in the following form:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\phi_{t&#039;} - \theta = \operatorname{arccot}(0.15\,r\,t&#039;)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This is equivalent to our expression above, since &amp;lt;math&amp;gt;\operatorname{arccot}(x) = \arctan(1/x)&amp;lt;/math&amp;gt;,  &lt;br /&gt;
with, &amp;lt;math&amp;gt;r = 1/\tan(\omega)&amp;lt;/math&amp;gt;, and, &amp;lt;math&amp;gt;t&#039; = T + 1 - t&amp;lt;/math&amp;gt;.  &lt;br /&gt;
(If using this expression, we need to add 180° if the target angle is to the right of Mario, since &amp;lt;math&amp;gt;\operatorname{arccot}&amp;lt;/math&amp;gt; only gives results between 0° and 180°.)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-size:120%; font-weight:bold; margin-top:1em;&amp;quot;&amp;gt;23 June 2018&amp;lt;/div&amp;gt;&lt;br /&gt;
Pannenkoek posts an idea for collecting the “Scale the Mountain” star in TTM via a dive recover.  &lt;br /&gt;
To find out whether it was possible, Iwer, Grassdigger, Jane, bad_boot, and DeRockProject work to plot all of Mario’s possible positions while air straining.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-size:120%; font-weight:bold; margin-top:1em;&amp;quot;&amp;gt;20 August 2018&amp;lt;/div&amp;gt;&lt;br /&gt;
Iwer discovers the exact equations describing Mario&#039;s possible positions after &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; frames. Grassdigger and DeRockProject then show that the total shape can be well approximated by a generalised superellipse.  &lt;br /&gt;
Pannenkoek proposes calling it the &#039;&#039;Iwerlipse&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-size:120%; font-weight:bold; margin-top:1em;&amp;quot;&amp;gt;3 October 2019&amp;lt;/div&amp;gt;&lt;br /&gt;
Silverstrawb provides an alternative proof&amp;lt;ref&amp;gt;[https://drive.google.com/file/d/1df97glqVn-cXEUmP15vNxgQtwa8jJK2w/view?usp=sharing Showing Silverstrawb&#039;s proof.]&amp;lt;/ref&amp;gt; of the optimal straining relation by converting the discrete update equations into the continuous differential equations&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
\dot{x} &amp;amp;= 10 \sin(\phi(t)),\\&lt;br /&gt;
\ddot{z} &amp;amp;= 1.5 \cos(\phi(t)) - D,&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
and using the calculus of variations.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-size:120%; font-weight:bold; margin-top:1em;&amp;quot;&amp;gt;29 July 2020&amp;lt;/div&amp;gt;&lt;br /&gt;
Krithalith independently rediscovers Iwer’s original proof and extends it to include quartersteps.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-size:120%; font-weight:bold; margin-top:1em;&amp;quot;&amp;gt;27 November 2021&amp;lt;/div&amp;gt;&lt;br /&gt;
sm64expert adds arctan straining to MKDasher’s input direction LUA program, making it accessible to everyone for the first time.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-size:120%; font-weight:bold; margin-top:1em;&amp;quot;&amp;gt;16 March 2024&amp;lt;/div&amp;gt;&lt;br /&gt;
sm64expert adds arctan straining to [https://github.com/mupen64/SM64LuaRedux SM64 Lua Redux].&lt;br /&gt;
&lt;br /&gt;
==See Also==&lt;br /&gt;
[[Straining]]&lt;br /&gt;
&lt;br /&gt;
==References==&lt;br /&gt;
{{#ev:youtube|_yx0eutBwII}}&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
[[Category:Mechanics]]&lt;/div&gt;</summary>
		<author><name>Aurumaker72</name></author>
	</entry>
	<entry>
		<id>https://ukikipedia.net/mediawiki/index.php?title=Iwerlipse&amp;diff=19859</id>
		<title>Iwerlipse</title>
		<link rel="alternate" type="text/html" href="https://ukikipedia.net/mediawiki/index.php?title=Iwerlipse&amp;diff=19859"/>
		<updated>2025-10-16T17:30:23Z</updated>

		<summary type="html">&lt;p&gt;Aurumaker72: Undo revision 19858 by Aurumaker72 (talk)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The &#039;&#039;&#039;Iwerlipse&#039;&#039;&#039; (pronounced ee-ver-lipse /ˈivɜlɪps/) is the range of positions Mario can occupy while he is in the air and cannot turn, assuming that drag is constant. The boundary of the Iwerlipse is reached by &#039;&#039;&#039;Arctan Straining&#039;&#039;&#039; - the optimal way of air straining that gives the greatest distance along a chosen angle &amp;lt;math&amp;gt;\omega&amp;lt;/math&amp;gt; for a given number of frames &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt;. For a single frame &amp;lt;math&amp;gt;T=1&amp;lt;/math&amp;gt;, the Iwerlipse is an ellipse with half-width 10 (in the sideways direction) and half-height 1.5 (in the forwards direction). For general &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt;, it resembles an ellipse with half-width &amp;lt;math&amp;gt;10T&amp;lt;/math&amp;gt; and half-height &amp;lt;math&amp;gt;3T(T+1)/4&amp;lt;/math&amp;gt;, but bulges at the corners, covering more area than an ellipse with the same dimensions. As shown by &#039;&#039;Grassdigger&#039;&#039;, the shape is well approximated by a generalised superellipse, and thus &#039;&#039;Pannenkoek2012&#039;&#039; proposed calling this shape the Iwerlipse - a pun on the name of &#039;&#039;Iwer Sonsch&#039;&#039;, who first discoverered that Arctan Straining was optimal in April 2018.&lt;br /&gt;
&lt;br /&gt;
==Basics==&lt;br /&gt;
&lt;br /&gt;
Arctan Straining gives the maximum possible distance along a target angle &amp;lt;math&amp;gt;\omega&amp;lt;/math&amp;gt; that differs from the facing angle &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt;, over a finite number of frames &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt;. It is performed by choosing straining angles &amp;lt;math&amp;gt;\phi_t&amp;lt;/math&amp;gt; (intendedYaw) such that&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;background:#f9f9f9; border-left:3px solid #bbb; padding:0.4em 0.8em; margin:1em 0;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
\phi_t - \theta =&lt;br /&gt;
\begin{cases}&lt;br /&gt;
    \arctan \left[\dfrac{10\tan(\omega - \theta)}{1.5(T+1-t)} \right] &amp;amp; \text{if } \cos(\omega-\theta) &amp;gt; 0, \\[14pt]&lt;br /&gt;
    \arctan \left[\dfrac{10\tan(\omega - \theta)}{1.5(T+1-t)} \right] + 180^\circ &amp;amp; \text{if } \cos(\omega-\theta) &amp;lt; 0,&lt;br /&gt;
\end{cases}&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
with &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; being the frame number between &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt;. (Usually only the top row of this equation is given, but since the &amp;lt;math&amp;gt;\arctan&amp;lt;/math&amp;gt; function only gives results between &amp;lt;math&amp;gt;\pm 90^\circ&amp;lt;/math&amp;gt;, we must add &amp;lt;math&amp;gt;180^\circ&amp;lt;/math&amp;gt; to the result if the target angle is behind Mario.)&lt;br /&gt;
&lt;br /&gt;
Arctan straining is a result of two asymmetries in how Mario&#039;s forward velocity and sideways speed are updated&lt;br /&gt;
&lt;br /&gt;
* Forward velocity accelerates gradually over time, while sideways speed is reset every frame&lt;br /&gt;
&lt;br /&gt;
* Straining on a single frame has a weak effect on forward velocity (increasing velocity by a maximum of 1.5), but a strong effect on sideways speed for a single frame (setting sideways speed to a maximum of 10).&lt;br /&gt;
&lt;br /&gt;
In terms of total distance acquired along some direction, forward velocity is thus more effective over long periods of time, where it has time to accelerate to large values, whereas sideways speed is more effective over short periods of time. Optimal straining over many frames then involves straining mostly along the forwards direction to build up a large forward velocity, and then towards the end of the trajectory, transitioning into sideways straining to exploit the large sideways displacement obtainable in a single frame.&lt;br /&gt;
&lt;br /&gt;
==Update Equations==&lt;br /&gt;
&lt;br /&gt;
When Mario is in the air and cannot turn, the function &amp;lt;code&amp;gt;update_air_without_turn&amp;lt;/code&amp;gt; is responsible for updating Mario&#039;s velocity variables from one frame, &amp;lt;math&amp;gt;t-1&amp;lt;/math&amp;gt;, to the next, &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;. Without loss of generality, we can choose coordinates so that Mario&#039;s facing angle is zero. In other words, he is facing along the &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;-axis, while his sideways speed is directed along the &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;-axis. Mario&#039;s forward velocity, &amp;lt;math&amp;gt;v_t&amp;lt;/math&amp;gt;, and position coordinates &amp;lt;math&amp;gt;z_t&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;x_t&amp;lt;/math&amp;gt; are then updated via&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;background:#f9f9f9; border-left:3px solid #bbb; padding:0.4em 0.8em; margin:1em 0;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
v_t &amp;amp;= v_{t-1} - D(v_{t-1}, \phi_t) + 1.5\cos(\phi_t),\\&lt;br /&gt;
z_t &amp;amp;= z_{t-1} + v_t,\\ x_t &amp;amp;= x_{t-1} + 10\sin(\phi_t),&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
where &amp;lt;math&amp;gt;\phi_t&amp;lt;/math&amp;gt; is the straining angle (intendedYaw) on frame &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;. The total effect of drag is given by the coefficient &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;, determined by&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
D(v_{t-1}, \phi_t) =&lt;br /&gt;
\begin{cases}&lt;br /&gt;
-2.35 &amp;amp; \text{if } v_{t-1} &amp;lt; - 16.35 - 1.5 \cos(\phi_t),\\&lt;br /&gt;
-0.35 &amp;amp; \text{if } -16.35 - 1.5 \cos(\phi_t) \leq v_{t-1} \leq -0.35,\\&lt;br /&gt;
v_{t-1} &amp;amp; \text{if } -0.35 &amp;lt; v_{t-1} &amp;lt; 0.35,\\&lt;br /&gt;
0.35 &amp;amp; \text{if } 0.35 \leq v_{t-1} \leq D_\text{cap} + 0.35 - 1.5 \cos(\phi_t),\\&lt;br /&gt;
1.35 &amp;amp; \text{if } v_{t-1} &amp;gt; D_\text{cap} + 0.35 - 1.5 \cos(\phi_t).&lt;br /&gt;
\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
where &amp;lt;math&amp;gt;D_\text{cap}&amp;lt;/math&amp;gt; is a soft velocity cap equal to 48 for long jumps and 32 otherwise.&lt;br /&gt;
&lt;br /&gt;
In practice, these drag boundaries are far enough apart that the drag is often constant over large periods of time. In this case we can write Mario&#039;s position after &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; frames as&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
x_T &amp;amp;= x_0 + 10 \sum_{t=1}^{T} \sin(\phi_t),\\&lt;br /&gt;
z_T &amp;amp;= z_0 + v_0 T - D \sum_{t=1}^T t + 1.5 \sum_{t=1}^T \sum_{n=1}^t \cos(\phi_n).&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Using &amp;lt;math&amp;gt;\sum_{t=1}^T t = T(T+1)/2&amp;lt;/math&amp;gt;, and by grouping terms of &amp;lt;math&amp;gt;\cos(\phi_t)&amp;lt;/math&amp;gt;, the latter can be simplified to&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; z_T = z_0 + v_0 T - \frac{DT(T+1)}{2} + 1.5 \sum_{t=1}^T (T+1-t)\cos(\phi_t). &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Notice that, since forward straining produces an acceleration that is not reset between frames, earlier frames have a stronger effect on the final &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; position than later frames. The effective strength is &amp;lt;math&amp;gt;1.5(T+1-t)&amp;lt;/math&amp;gt;, i.e. 1.5 multiplied by the number of frames remaining (including the current frame), since the forward velocity gained on one frame produces a displacement also on all remaining frames.&lt;br /&gt;
&lt;br /&gt;
==Arctan Straining Proof==&lt;br /&gt;
&lt;br /&gt;
The displacement vector after &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; frames is&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{R} = (x_T - x_0)\mathbf{\hat{x}} + (z_T - z_0)\mathbf{\hat{z}}&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
while the unit vector along the angle &amp;lt;math&amp;gt;\omega&amp;lt;/math&amp;gt; is&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{\hat{n}} = \sin(\omega)\mathbf{\hat{x}} + \cos(\omega)\mathbf{\hat{z}}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
The distance we move along a target angle &amp;lt;math&amp;gt;\omega&amp;lt;/math&amp;gt; over &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; frames is then&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; S = \mathbf{R} \cdot \mathbf{\hat{n}} = \langle S\rangle + \sum_{t=1}^T S_t, &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
where&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \langle S \rangle = \left(v_0 T - \frac{DT(T+1)}{2}\right)\cos(\omega), &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
is due to our initial velocity and drag, while&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; S_t = 10\sin(\phi_t)\sin(\omega) + 1.5(T+1-t)\cos(\phi_t)\cos(\omega), &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
is the effective contribution from straining on frame &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;.&lt;br /&gt;
Thanks to this separation, we can maximize the total distance &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; by individually maximizing each contribution &amp;lt;math&amp;gt;S_t&amp;lt;/math&amp;gt; as a function of &amp;lt;math&amp;gt;\phi_t&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \frac{d S_t}{d \phi_t} = 10\cos(\phi_t)\sin(\omega) - 1.5(T+1-t)\sin(\phi_t)\cos(\omega) = 0, &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
and finally we find&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \tan(\phi_t) = \frac{10\tan(\omega)}{1.5(T+1-t)}, &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
or, rotating the coordinate system back to allow for general facing angles &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \tan(\phi_t - \theta) = \frac{10\tan(\omega - \theta)}{1.5(T+1-t)}. &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Since &amp;lt;math&amp;gt;\tan(x) = \tan(x\pm180^\circ)&amp;lt;/math&amp;gt;, this equation has two solutions for &amp;lt;math&amp;gt;\phi_t&amp;lt;/math&amp;gt; which are given above.&lt;br /&gt;
&lt;br /&gt;
== Iwerlipse Equations ==&lt;br /&gt;
&lt;br /&gt;
By writing &amp;lt;math&amp;gt;\sin(\phi_t)&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;\cos(\phi_t)&amp;lt;/math&amp;gt; in terms of &amp;lt;math&amp;gt;\tan(\phi_t)&amp;lt;/math&amp;gt;, and using the optimal straining relation, we obtain exact expressions for the boundary of the Iwerlipse after &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; frames:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;background:#f9f9f9; border-left:3px solid #bbb; padding:0.4em 0.8em; margin:1em 0;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt; \begin{aligned} x_T - x_0 &amp;amp;= \pm10 \sum_{t=1}^T \frac{1}{\sqrt{1+\beta^2 t^2}},\\ z_T - \langle z \rangle &amp;amp;= \pm1.5 \beta \sum_{t=1}^T \frac{t^2}{\sqrt{1+\beta^2 t^2}}, \end{aligned} &amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
where&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\beta = \frac{1.5}{10}\tan(\omega),&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
and&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\langle z \rangle = z_0 + v_0 T - \frac{DT(T+1)}{2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
We can restrict &amp;lt;math&amp;gt;0 &amp;lt; \omega &amp;lt; 90^\circ&amp;lt;/math&amp;gt;, with the four combinations of plus and minus signs giving the remaining quadrants.&lt;br /&gt;
The Iwerlipse&#039;s half-width is &amp;lt;math&amp;gt;x_\mathrm{max} = 10T&amp;lt;/math&amp;gt;, while its half-height is &amp;lt;math&amp;gt;z_\mathrm{max} = 3T(T+1)/4&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Approximations ===&lt;br /&gt;
&lt;br /&gt;
If &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; is large, the exact expressions involve large summation terms, so it may be useful to have approximate expressions that are easier to compute.&lt;br /&gt;
By replacing the summations from &amp;lt;math&amp;gt;t=1&amp;lt;/math&amp;gt; to &amp;lt;math&amp;gt;t=T&amp;lt;/math&amp;gt; with an integral from &amp;lt;math&amp;gt;t=1/2&amp;lt;/math&amp;gt; to &amp;lt;math&amp;gt;t=T+1/2&amp;lt;/math&amp;gt; (essentially performing the midpoint rule of numerical integration in reverse), we obtain&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;background:#f9f9f9; border-left:3px solid #bbb; padding:0.4em 0.8em; margin:1em 0;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt; \begin{aligned} x_T - x_0 &amp;amp;= \pm \frac{10}{\beta} \left[\operatorname{arsinh}(\beta t)\right]^{T+1/2}_{1/2},\\ z_T - \langle z \rangle &amp;amp;= \pm \frac{3}{4\beta^2} \left[\beta t\sqrt{1+\beta^2 t^2} - \operatorname{arsinh}(\beta t)\right]^{T+1/2}_{1/2}, \end{aligned} &amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
with the notation &amp;lt;math&amp;gt;[F(t)]_{t_1}^{t_2} = F(t_2) - F(t_1)&amp;lt;/math&amp;gt;.&lt;br /&gt;
This approximation converges to the true result very quickly:&lt;br /&gt;
even for &amp;lt;math&amp;gt;T=2&amp;lt;/math&amp;gt;, the RMS error (normalized by &amp;lt;math&amp;gt;x_\mathrm{max}&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;z_\mathrm{max}&amp;lt;/math&amp;gt;) is &amp;lt;math&amp;gt;4.3\times10^{-3}&amp;lt;/math&amp;gt;,&lt;br /&gt;
while for &amp;lt;math&amp;gt;T&amp;gt;6&amp;lt;/math&amp;gt; it is less than &amp;lt;math&amp;gt;10^{-3}&amp;lt;/math&amp;gt;.&lt;br /&gt;
Similar expressions obtained using the Euler–Maclaurin formula converge more slowly, even with first-order correction terms.&lt;br /&gt;
&lt;br /&gt;
A simpler but less accurate approximation is obtained by fitting the Iwerlipse to the generalized superellipse:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;background:#f9f9f9; border-left:3px solid #bbb; padding:0.4em 0.8em; margin:1em 0;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt; \left(\frac{x_T - x_0}{x_\mathrm{max}}\right)^{m(T)} + \left(\frac{z_T - \langle z \rangle}{x_\mathrm{max}}\right)^{n(T)} = 1. &amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The optimal exponents &amp;lt;math&amp;gt;m(T)&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;n(T)&amp;lt;/math&amp;gt; have been found up to &amp;lt;math&amp;gt;T=150&amp;lt;/math&amp;gt; (5 seconds), and can be obtained from a lookup table&amp;lt;ref&amp;gt;[https://drive.google.com/file/d/1xDmgHz878qiAS1ZF1Y5M0M1eiZUdZRSl/view?usp=sharing Showing Iwer&#039;s proof and deriving the Iwerlipse expressions.]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
Unlike the integral approximation, this expression never converges to the exact result — there is always some small error.&lt;br /&gt;
&lt;br /&gt;
== Quarterstep Penalty ==&lt;br /&gt;
&lt;br /&gt;
If &amp;lt;math&amp;gt;q \in {0,1,2,3}&amp;lt;/math&amp;gt; quartersteps are lost on the final frame,&lt;br /&gt;
the forward velocity gained on frame &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; no longer accumulates forward distance over &amp;lt;math&amp;gt;T+1-t&amp;lt;/math&amp;gt; frames,&lt;br /&gt;
but instead over &amp;lt;math&amp;gt;T - q/4 + 1 - t&amp;lt;/math&amp;gt; frames.&lt;br /&gt;
The optimal straining relation becomes:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;background:#f9f9f9; border-left:3px solid #bbb; padding:0.4em 0.8em; margin:1em 0;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt; \tan(\phi_{t&#039;}) = \begin{cases} \dfrac{10\tan(\omega)}{1.5(T - q/4 + 1 - t)}, &amp;amp; \text{if } t &amp;lt; T,\\[10pt] \dfrac{10\tan(\omega)}{1.5}, &amp;amp; \text{if } t = T. \end{cases} &amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The optimal straining angle for the final frame is not affected, since in this case the ellipse shrinks in both directions rather than just vertically, i.e. a factor &amp;lt;math&amp;gt;1-q/4&amp;lt;/math&amp;gt; cancels in the numerator and denominator.&lt;br /&gt;
&lt;br /&gt;
== History ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-size:120%; font-weight:bold; margin-top:1em;&amp;quot;&amp;gt;2 July 2017&amp;lt;/div&amp;gt;&lt;br /&gt;
Plush discovers that during a dive recover, one can gain greater distance along an angle different from Mario&#039;s facing angle by “flinging” the control stick through different angles during the trajectory, rather than holding it at a constant angle.&lt;br /&gt;
&lt;br /&gt;
Pannenkoek qualitatively explains this phenomenon that would later be known as &#039;&#039;arctan straining&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote style=&amp;quot;font-style: italic;&amp;quot;&amp;gt;&lt;br /&gt;
I think you&#039;re supposed to hold forward-ish for most of it, then sideways at the end. Because sideways movement doesn&#039;t depend on your speed. So 5 frames of sideways holding at the start of the DR is equivalent to the 5 frames at the end. But forward distance depends on your hspeed. So let&#039;s say you start with some hspeed. If you go sideways then forwards, then you&#039;ll lose that hspeed. But if you go forward then sideways, then you&#039;ll take advantage of your starting hspeed. The best inputs would probably mix sideways and forwards somewhat.  &lt;br /&gt;
&amp;lt;br /&amp;gt; — &amp;lt;b&amp;gt;Pannenkoek2012&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Peter Fedak shares the correct velocity update equations, and the three of them begin to consider what the mathematically optimal inputs are.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-size:120%; font-weight:bold; margin-top:1em;&amp;quot;&amp;gt;3 September 2017&amp;lt;/div&amp;gt;&lt;br /&gt;
Iwer Sonsch independently rediscovers the velocity update equations and realises that by facing along the hypotenuse of the forward velocity and sideways speed — a trick known in other speedrunning communities as &#039;&#039;vectoring&#039;&#039; — he can gain greater distance in a single frame.  &lt;br /&gt;
He wonders how this would look over multiple frames, restarting the discussion of optimal straining.  &lt;br /&gt;
However, there is no quantitative progress until it becomes relevant to the A Button Challenge the following year.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-size:120%; font-weight:bold; margin-top:1em;&amp;quot;&amp;gt;18 March 2018&amp;lt;/div&amp;gt;&lt;br /&gt;
The “Blast to the Stone Pillar” star in JRB is collected in 0 A presses for the first time, after Tyler Kehne figures out how to use conserved speed to get from the nearby pillar to the star platform.&lt;br /&gt;
&lt;br /&gt;
The community turns their attention to whether the “Treasure of the Ocean Cave” star can be collected in a similar way, again reviving the optimal straining question, as people including Iwer, bad_boot, and DeRockProject begin attempting to make the most of the limited speed they have available.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-size:120%; font-weight:bold; margin-top:1em;&amp;quot;&amp;gt;16 April 2018&amp;lt;/div&amp;gt;&lt;br /&gt;
Iwer states the optimal straining equation for the first time in the following form:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\phi_{t&#039;} - \theta = \operatorname{arccot}(0.15\,r\,t&#039;)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This is equivalent to our expression above, since &amp;lt;math&amp;gt;\operatorname{arccot}(x) = \arctan(1/x)&amp;lt;/math&amp;gt;,  &lt;br /&gt;
with, &amp;lt;math&amp;gt;r = 1/\tan(\omega)&amp;lt;/math&amp;gt;, and, &amp;lt;math&amp;gt;t&#039; = T + 1 - t&amp;lt;/math&amp;gt;.  &lt;br /&gt;
(If using this expression, we need to add 180° if the target angle is to the right of Mario, since &amp;lt;math&amp;gt;\operatorname{arccot}&amp;lt;/math&amp;gt; only gives results between 0° and 180°.)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-size:120%; font-weight:bold; margin-top:1em;&amp;quot;&amp;gt;23 June 2018&amp;lt;/div&amp;gt;&lt;br /&gt;
Pannenkoek posts an idea for collecting the “Scale the Mountain” star in TTM via a dive recover.  &lt;br /&gt;
To find out whether it was possible, Iwer, Grassdigger, Jane, bad_boot, and DeRockProject work to plot all of Mario’s possible positions while air straining.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-size:120%; font-weight:bold; margin-top:1em;&amp;quot;&amp;gt;20 August 2018&amp;lt;/div&amp;gt;&lt;br /&gt;
Iwer discovers the exact equations describing Mario&#039;s possible positions after &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; frames. Grassdigger and DeRockProject then show that the total shape can be well approximated by a generalised superellipse.  &lt;br /&gt;
Pannenkoek proposes calling it the &#039;&#039;Iwerlipse&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-size:120%; font-weight:bold; margin-top:1em;&amp;quot;&amp;gt;3 October 2019&amp;lt;/div&amp;gt;&lt;br /&gt;
Silverstrawb provides an alternative proof&amp;lt;ref&amp;gt;[https://drive.google.com/file/d/1df97glqVn-cXEUmP15vNxgQtwa8jJK2w/view?usp=sharing Showing Silverstrawb&#039;s proof.]&amp;lt;/ref&amp;gt; of the optimal straining relation by converting the discrete update equations into the continuous differential equations&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
\dot{x} &amp;amp;= 10 \sin(\phi(t)),\\&lt;br /&gt;
\ddot{z} &amp;amp;= 1.5 \cos(\phi(t)) - D,&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
and using the calculus of variations.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-size:120%; font-weight:bold; margin-top:1em;&amp;quot;&amp;gt;29 July 2020&amp;lt;/div&amp;gt;&lt;br /&gt;
Krithalith independently rediscovers Iwer’s original proof and extends it to include quartersteps.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-size:120%; font-weight:bold; margin-top:1em;&amp;quot;&amp;gt;27 November 2021&amp;lt;/div&amp;gt;&lt;br /&gt;
sm64expert adds arctan straining to MKDasher’s input direction LUA program, making it accessible to everyone for the first time.&lt;br /&gt;
&lt;br /&gt;
==See Also==&lt;br /&gt;
[[Straining]]&lt;br /&gt;
&lt;br /&gt;
==References==&lt;br /&gt;
{{#ev:youtube|_yx0eutBwII}}&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
[[Category:Mechanics]]&lt;/div&gt;</summary>
		<author><name>Aurumaker72</name></author>
	</entry>
	<entry>
		<id>https://ukikipedia.net/mediawiki/index.php?title=Iwerlipse&amp;diff=19858</id>
		<title>Iwerlipse</title>
		<link rel="alternate" type="text/html" href="https://ukikipedia.net/mediawiki/index.php?title=Iwerlipse&amp;diff=19858"/>
		<updated>2025-10-16T17:20:43Z</updated>

		<summary type="html">&lt;p&gt;Aurumaker72: correct information about the lua script integration&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The &#039;&#039;&#039;Iwerlipse&#039;&#039;&#039; (pronounced ee-ver-lipse /ˈivɜlɪps/) is the range of positions Mario can occupy while he is in the air and cannot turn, assuming that drag is constant. The boundary of the Iwerlipse is reached by &#039;&#039;&#039;Arctan Straining&#039;&#039;&#039; - the optimal way of air straining that gives the greatest distance along a chosen angle &amp;lt;math&amp;gt;\omega&amp;lt;/math&amp;gt; for a given number of frames &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt;. For a single frame &amp;lt;math&amp;gt;T=1&amp;lt;/math&amp;gt;, the Iwerlipse is an ellipse with half-width 10 (in the sideways direction) and half-height 1.5 (in the forwards direction). For general &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt;, it resembles an ellipse with half-width &amp;lt;math&amp;gt;10T&amp;lt;/math&amp;gt; and half-height &amp;lt;math&amp;gt;3T(T+1)/4&amp;lt;/math&amp;gt;, but bulges at the corners, covering more area than an ellipse with the same dimensions. As shown by &#039;&#039;Grassdigger&#039;&#039;, the shape is well approximated by a generalised superellipse, and thus &#039;&#039;Pannenkoek2012&#039;&#039; proposed calling this shape the Iwerlipse - a pun on the name of &#039;&#039;Iwer Sonsch&#039;&#039;, who first discoverered that Arctan Straining was optimal in April 2018.&lt;br /&gt;
&lt;br /&gt;
==Basics==&lt;br /&gt;
&lt;br /&gt;
Arctan Straining gives the maximum possible distance along a target angle &amp;lt;math&amp;gt;\omega&amp;lt;/math&amp;gt; that differs from the facing angle &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt;, over a finite number of frames &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt;. It is performed by choosing straining angles &amp;lt;math&amp;gt;\phi_t&amp;lt;/math&amp;gt; (intendedYaw) such that&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;background:#f9f9f9; border-left:3px solid #bbb; padding:0.4em 0.8em; margin:1em 0;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
\phi_t - \theta =&lt;br /&gt;
\begin{cases}&lt;br /&gt;
    \arctan \left[\dfrac{10\tan(\omega - \theta)}{1.5(T+1-t)} \right] &amp;amp; \text{if } \cos(\omega-\theta) &amp;gt; 0, \\[14pt]&lt;br /&gt;
    \arctan \left[\dfrac{10\tan(\omega - \theta)}{1.5(T+1-t)} \right] + 180^\circ &amp;amp; \text{if } \cos(\omega-\theta) &amp;lt; 0,&lt;br /&gt;
\end{cases}&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
with &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; being the frame number between &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt;. (Usually only the top row of this equation is given, but since the &amp;lt;math&amp;gt;\arctan&amp;lt;/math&amp;gt; function only gives results between &amp;lt;math&amp;gt;\pm 90^\circ&amp;lt;/math&amp;gt;, we must add &amp;lt;math&amp;gt;180^\circ&amp;lt;/math&amp;gt; to the result if the target angle is behind Mario.)&lt;br /&gt;
&lt;br /&gt;
Arctan straining is a result of two asymmetries in how Mario&#039;s forward velocity and sideways speed are updated&lt;br /&gt;
&lt;br /&gt;
* Forward velocity accelerates gradually over time, while sideways speed is reset every frame&lt;br /&gt;
&lt;br /&gt;
* Straining on a single frame has a weak effect on forward velocity (increasing velocity by a maximum of 1.5), but a strong effect on sideways speed for a single frame (setting sideways speed to a maximum of 10).&lt;br /&gt;
&lt;br /&gt;
In terms of total distance acquired along some direction, forward velocity is thus more effective over long periods of time, where it has time to accelerate to large values, whereas sideways speed is more effective over short periods of time. Optimal straining over many frames then involves straining mostly along the forwards direction to build up a large forward velocity, and then towards the end of the trajectory, transitioning into sideways straining to exploit the large sideways displacement obtainable in a single frame.&lt;br /&gt;
&lt;br /&gt;
==Update Equations==&lt;br /&gt;
&lt;br /&gt;
When Mario is in the air and cannot turn, the function &amp;lt;code&amp;gt;update_air_without_turn&amp;lt;/code&amp;gt; is responsible for updating Mario&#039;s velocity variables from one frame, &amp;lt;math&amp;gt;t-1&amp;lt;/math&amp;gt;, to the next, &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;. Without loss of generality, we can choose coordinates so that Mario&#039;s facing angle is zero. In other words, he is facing along the &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;-axis, while his sideways speed is directed along the &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;-axis. Mario&#039;s forward velocity, &amp;lt;math&amp;gt;v_t&amp;lt;/math&amp;gt;, and position coordinates &amp;lt;math&amp;gt;z_t&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;x_t&amp;lt;/math&amp;gt; are then updated via&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;background:#f9f9f9; border-left:3px solid #bbb; padding:0.4em 0.8em; margin:1em 0;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
v_t &amp;amp;= v_{t-1} - D(v_{t-1}, \phi_t) + 1.5\cos(\phi_t),\\&lt;br /&gt;
z_t &amp;amp;= z_{t-1} + v_t,\\ x_t &amp;amp;= x_{t-1} + 10\sin(\phi_t),&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
where &amp;lt;math&amp;gt;\phi_t&amp;lt;/math&amp;gt; is the straining angle (intendedYaw) on frame &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;. The total effect of drag is given by the coefficient &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;, determined by&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
D(v_{t-1}, \phi_t) =&lt;br /&gt;
\begin{cases}&lt;br /&gt;
-2.35 &amp;amp; \text{if } v_{t-1} &amp;lt; - 16.35 - 1.5 \cos(\phi_t),\\&lt;br /&gt;
-0.35 &amp;amp; \text{if } -16.35 - 1.5 \cos(\phi_t) \leq v_{t-1} \leq -0.35,\\&lt;br /&gt;
v_{t-1} &amp;amp; \text{if } -0.35 &amp;lt; v_{t-1} &amp;lt; 0.35,\\&lt;br /&gt;
0.35 &amp;amp; \text{if } 0.35 \leq v_{t-1} \leq D_\text{cap} + 0.35 - 1.5 \cos(\phi_t),\\&lt;br /&gt;
1.35 &amp;amp; \text{if } v_{t-1} &amp;gt; D_\text{cap} + 0.35 - 1.5 \cos(\phi_t).&lt;br /&gt;
\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
where &amp;lt;math&amp;gt;D_\text{cap}&amp;lt;/math&amp;gt; is a soft velocity cap equal to 48 for long jumps and 32 otherwise.&lt;br /&gt;
&lt;br /&gt;
In practice, these drag boundaries are far enough apart that the drag is often constant over large periods of time. In this case we can write Mario&#039;s position after &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; frames as&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
x_T &amp;amp;= x_0 + 10 \sum_{t=1}^{T} \sin(\phi_t),\\&lt;br /&gt;
z_T &amp;amp;= z_0 + v_0 T - D \sum_{t=1}^T t + 1.5 \sum_{t=1}^T \sum_{n=1}^t \cos(\phi_n).&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Using &amp;lt;math&amp;gt;\sum_{t=1}^T t = T(T+1)/2&amp;lt;/math&amp;gt;, and by grouping terms of &amp;lt;math&amp;gt;\cos(\phi_t)&amp;lt;/math&amp;gt;, the latter can be simplified to&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; z_T = z_0 + v_0 T - \frac{DT(T+1)}{2} + 1.5 \sum_{t=1}^T (T+1-t)\cos(\phi_t). &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Notice that, since forward straining produces an acceleration that is not reset between frames, earlier frames have a stronger effect on the final &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; position than later frames. The effective strength is &amp;lt;math&amp;gt;1.5(T+1-t)&amp;lt;/math&amp;gt;, i.e. 1.5 multiplied by the number of frames remaining (including the current frame), since the forward velocity gained on one frame produces a displacement also on all remaining frames.&lt;br /&gt;
&lt;br /&gt;
==Arctan Straining Proof==&lt;br /&gt;
&lt;br /&gt;
The displacement vector after &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; frames is&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{R} = (x_T - x_0)\mathbf{\hat{x}} + (z_T - z_0)\mathbf{\hat{z}}&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
while the unit vector along the angle &amp;lt;math&amp;gt;\omega&amp;lt;/math&amp;gt; is&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{\hat{n}} = \sin(\omega)\mathbf{\hat{x}} + \cos(\omega)\mathbf{\hat{z}}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
The distance we move along a target angle &amp;lt;math&amp;gt;\omega&amp;lt;/math&amp;gt; over &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; frames is then&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; S = \mathbf{R} \cdot \mathbf{\hat{n}} = \langle S\rangle + \sum_{t=1}^T S_t, &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
where&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \langle S \rangle = \left(v_0 T - \frac{DT(T+1)}{2}\right)\cos(\omega), &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
is due to our initial velocity and drag, while&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; S_t = 10\sin(\phi_t)\sin(\omega) + 1.5(T+1-t)\cos(\phi_t)\cos(\omega), &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
is the effective contribution from straining on frame &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;.&lt;br /&gt;
Thanks to this separation, we can maximize the total distance &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; by individually maximizing each contribution &amp;lt;math&amp;gt;S_t&amp;lt;/math&amp;gt; as a function of &amp;lt;math&amp;gt;\phi_t&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \frac{d S_t}{d \phi_t} = 10\cos(\phi_t)\sin(\omega) - 1.5(T+1-t)\sin(\phi_t)\cos(\omega) = 0, &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
and finally we find&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \tan(\phi_t) = \frac{10\tan(\omega)}{1.5(T+1-t)}, &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
or, rotating the coordinate system back to allow for general facing angles &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \tan(\phi_t - \theta) = \frac{10\tan(\omega - \theta)}{1.5(T+1-t)}. &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Since &amp;lt;math&amp;gt;\tan(x) = \tan(x\pm180^\circ)&amp;lt;/math&amp;gt;, this equation has two solutions for &amp;lt;math&amp;gt;\phi_t&amp;lt;/math&amp;gt; which are given above.&lt;br /&gt;
&lt;br /&gt;
== Iwerlipse Equations ==&lt;br /&gt;
&lt;br /&gt;
By writing &amp;lt;math&amp;gt;\sin(\phi_t)&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;\cos(\phi_t)&amp;lt;/math&amp;gt; in terms of &amp;lt;math&amp;gt;\tan(\phi_t)&amp;lt;/math&amp;gt;, and using the optimal straining relation, we obtain exact expressions for the boundary of the Iwerlipse after &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; frames:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;background:#f9f9f9; border-left:3px solid #bbb; padding:0.4em 0.8em; margin:1em 0;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt; \begin{aligned} x_T - x_0 &amp;amp;= \pm10 \sum_{t=1}^T \frac{1}{\sqrt{1+\beta^2 t^2}},\\ z_T - \langle z \rangle &amp;amp;= \pm1.5 \beta \sum_{t=1}^T \frac{t^2}{\sqrt{1+\beta^2 t^2}}, \end{aligned} &amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
where&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\beta = \frac{1.5}{10}\tan(\omega),&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
and&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\langle z \rangle = z_0 + v_0 T - \frac{DT(T+1)}{2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
We can restrict &amp;lt;math&amp;gt;0 &amp;lt; \omega &amp;lt; 90^\circ&amp;lt;/math&amp;gt;, with the four combinations of plus and minus signs giving the remaining quadrants.&lt;br /&gt;
The Iwerlipse&#039;s half-width is &amp;lt;math&amp;gt;x_\mathrm{max} = 10T&amp;lt;/math&amp;gt;, while its half-height is &amp;lt;math&amp;gt;z_\mathrm{max} = 3T(T+1)/4&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Approximations ===&lt;br /&gt;
&lt;br /&gt;
If &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; is large, the exact expressions involve large summation terms, so it may be useful to have approximate expressions that are easier to compute.&lt;br /&gt;
By replacing the summations from &amp;lt;math&amp;gt;t=1&amp;lt;/math&amp;gt; to &amp;lt;math&amp;gt;t=T&amp;lt;/math&amp;gt; with an integral from &amp;lt;math&amp;gt;t=1/2&amp;lt;/math&amp;gt; to &amp;lt;math&amp;gt;t=T+1/2&amp;lt;/math&amp;gt; (essentially performing the midpoint rule of numerical integration in reverse), we obtain&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;background:#f9f9f9; border-left:3px solid #bbb; padding:0.4em 0.8em; margin:1em 0;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt; \begin{aligned} x_T - x_0 &amp;amp;= \pm \frac{10}{\beta} \left[\operatorname{arsinh}(\beta t)\right]^{T+1/2}_{1/2},\\ z_T - \langle z \rangle &amp;amp;= \pm \frac{3}{4\beta^2} \left[\beta t\sqrt{1+\beta^2 t^2} - \operatorname{arsinh}(\beta t)\right]^{T+1/2}_{1/2}, \end{aligned} &amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
with the notation &amp;lt;math&amp;gt;[F(t)]_{t_1}^{t_2} = F(t_2) - F(t_1)&amp;lt;/math&amp;gt;.&lt;br /&gt;
This approximation converges to the true result very quickly:&lt;br /&gt;
even for &amp;lt;math&amp;gt;T=2&amp;lt;/math&amp;gt;, the RMS error (normalized by &amp;lt;math&amp;gt;x_\mathrm{max}&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;z_\mathrm{max}&amp;lt;/math&amp;gt;) is &amp;lt;math&amp;gt;4.3\times10^{-3}&amp;lt;/math&amp;gt;,&lt;br /&gt;
while for &amp;lt;math&amp;gt;T&amp;gt;6&amp;lt;/math&amp;gt; it is less than &amp;lt;math&amp;gt;10^{-3}&amp;lt;/math&amp;gt;.&lt;br /&gt;
Similar expressions obtained using the Euler–Maclaurin formula converge more slowly, even with first-order correction terms.&lt;br /&gt;
&lt;br /&gt;
A simpler but less accurate approximation is obtained by fitting the Iwerlipse to the generalized superellipse:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;background:#f9f9f9; border-left:3px solid #bbb; padding:0.4em 0.8em; margin:1em 0;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt; \left(\frac{x_T - x_0}{x_\mathrm{max}}\right)^{m(T)} + \left(\frac{z_T - \langle z \rangle}{x_\mathrm{max}}\right)^{n(T)} = 1. &amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The optimal exponents &amp;lt;math&amp;gt;m(T)&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;n(T)&amp;lt;/math&amp;gt; have been found up to &amp;lt;math&amp;gt;T=150&amp;lt;/math&amp;gt; (5 seconds), and can be obtained from a lookup table&amp;lt;ref&amp;gt;[https://drive.google.com/file/d/1xDmgHz878qiAS1ZF1Y5M0M1eiZUdZRSl/view?usp=sharing Showing Iwer&#039;s proof and deriving the Iwerlipse expressions.]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
Unlike the integral approximation, this expression never converges to the exact result — there is always some small error.&lt;br /&gt;
&lt;br /&gt;
== Quarterstep Penalty ==&lt;br /&gt;
&lt;br /&gt;
If &amp;lt;math&amp;gt;q \in {0,1,2,3}&amp;lt;/math&amp;gt; quartersteps are lost on the final frame,&lt;br /&gt;
the forward velocity gained on frame &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; no longer accumulates forward distance over &amp;lt;math&amp;gt;T+1-t&amp;lt;/math&amp;gt; frames,&lt;br /&gt;
but instead over &amp;lt;math&amp;gt;T - q/4 + 1 - t&amp;lt;/math&amp;gt; frames.&lt;br /&gt;
The optimal straining relation becomes:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;background:#f9f9f9; border-left:3px solid #bbb; padding:0.4em 0.8em; margin:1em 0;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt; \tan(\phi_{t&#039;}) = \begin{cases} \dfrac{10\tan(\omega)}{1.5(T - q/4 + 1 - t)}, &amp;amp; \text{if } t &amp;lt; T,\\[10pt] \dfrac{10\tan(\omega)}{1.5}, &amp;amp; \text{if } t = T. \end{cases} &amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The optimal straining angle for the final frame is not affected, since in this case the ellipse shrinks in both directions rather than just vertically, i.e. a factor &amp;lt;math&amp;gt;1-q/4&amp;lt;/math&amp;gt; cancels in the numerator and denominator.&lt;br /&gt;
&lt;br /&gt;
== History ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-size:120%; font-weight:bold; margin-top:1em;&amp;quot;&amp;gt;2 July 2017&amp;lt;/div&amp;gt;&lt;br /&gt;
Plush discovers that during a dive recover, one can gain greater distance along an angle different from Mario&#039;s facing angle by “flinging” the control stick through different angles during the trajectory, rather than holding it at a constant angle.&lt;br /&gt;
&lt;br /&gt;
Pannenkoek qualitatively explains this phenomenon that would later be known as &#039;&#039;arctan straining&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote style=&amp;quot;font-style: italic;&amp;quot;&amp;gt;&lt;br /&gt;
I think you&#039;re supposed to hold forward-ish for most of it, then sideways at the end. Because sideways movement doesn&#039;t depend on your speed. So 5 frames of sideways holding at the start of the DR is equivalent to the 5 frames at the end. But forward distance depends on your hspeed. So let&#039;s say you start with some hspeed. If you go sideways then forwards, then you&#039;ll lose that hspeed. But if you go forward then sideways, then you&#039;ll take advantage of your starting hspeed. The best inputs would probably mix sideways and forwards somewhat.  &lt;br /&gt;
&amp;lt;br /&amp;gt; — &amp;lt;b&amp;gt;Pannenkoek2012&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Peter Fedak shares the correct velocity update equations, and the three of them begin to consider what the mathematically optimal inputs are.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-size:120%; font-weight:bold; margin-top:1em;&amp;quot;&amp;gt;3 September 2017&amp;lt;/div&amp;gt;&lt;br /&gt;
Iwer Sonsch independently rediscovers the velocity update equations and realises that by facing along the hypotenuse of the forward velocity and sideways speed — a trick known in other speedrunning communities as &#039;&#039;vectoring&#039;&#039; — he can gain greater distance in a single frame.  &lt;br /&gt;
He wonders how this would look over multiple frames, restarting the discussion of optimal straining.  &lt;br /&gt;
However, there is no quantitative progress until it becomes relevant to the A Button Challenge the following year.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-size:120%; font-weight:bold; margin-top:1em;&amp;quot;&amp;gt;18 March 2018&amp;lt;/div&amp;gt;&lt;br /&gt;
The “Blast to the Stone Pillar” star in JRB is collected in 0 A presses for the first time, after Tyler Kehne figures out how to use conserved speed to get from the nearby pillar to the star platform.&lt;br /&gt;
&lt;br /&gt;
The community turns their attention to whether the “Treasure of the Ocean Cave” star can be collected in a similar way, again reviving the optimal straining question, as people including Iwer, bad_boot, and DeRockProject begin attempting to make the most of the limited speed they have available.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-size:120%; font-weight:bold; margin-top:1em;&amp;quot;&amp;gt;16 April 2018&amp;lt;/div&amp;gt;&lt;br /&gt;
Iwer states the optimal straining equation for the first time in the following form:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\phi_{t&#039;} - \theta = \operatorname{arccot}(0.15\,r\,t&#039;)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This is equivalent to our expression above, since &amp;lt;math&amp;gt;\operatorname{arccot}(x) = \arctan(1/x)&amp;lt;/math&amp;gt;,  &lt;br /&gt;
with, &amp;lt;math&amp;gt;r = 1/\tan(\omega)&amp;lt;/math&amp;gt;, and, &amp;lt;math&amp;gt;t&#039; = T + 1 - t&amp;lt;/math&amp;gt;.  &lt;br /&gt;
(If using this expression, we need to add 180° if the target angle is to the right of Mario, since &amp;lt;math&amp;gt;\operatorname{arccot}&amp;lt;/math&amp;gt; only gives results between 0° and 180°.)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-size:120%; font-weight:bold; margin-top:1em;&amp;quot;&amp;gt;23 June 2018&amp;lt;/div&amp;gt;&lt;br /&gt;
Pannenkoek posts an idea for collecting the “Scale the Mountain” star in TTM via a dive recover.  &lt;br /&gt;
To find out whether it was possible, Iwer, Grassdigger, Jane, bad_boot, and DeRockProject work to plot all of Mario’s possible positions while air straining.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-size:120%; font-weight:bold; margin-top:1em;&amp;quot;&amp;gt;20 August 2018&amp;lt;/div&amp;gt;&lt;br /&gt;
Iwer discovers the exact equations describing Mario&#039;s possible positions after &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; frames. Grassdigger and DeRockProject then show that the total shape can be well approximated by a generalised superellipse.  &lt;br /&gt;
Pannenkoek proposes calling it the &#039;&#039;Iwerlipse&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-size:120%; font-weight:bold; margin-top:1em;&amp;quot;&amp;gt;3 October 2019&amp;lt;/div&amp;gt;&lt;br /&gt;
Silverstrawb provides an alternative proof&amp;lt;ref&amp;gt;[https://drive.google.com/file/d/1df97glqVn-cXEUmP15vNxgQtwa8jJK2w/view?usp=sharing Showing Silverstrawb&#039;s proof.]&amp;lt;/ref&amp;gt; of the optimal straining relation by converting the discrete update equations into the continuous differential equations&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
\dot{x} &amp;amp;= 10 \sin(\phi(t)),\\&lt;br /&gt;
\ddot{z} &amp;amp;= 1.5 \cos(\phi(t)) - D,&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
and using the calculus of variations.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-size:120%; font-weight:bold; margin-top:1em;&amp;quot;&amp;gt;29 July 2020&amp;lt;/div&amp;gt;&lt;br /&gt;
Krithalith independently rediscovers Iwer’s original proof and extends it to include quartersteps.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-size:120%; font-weight:bold; margin-top:1em;&amp;quot;&amp;gt;27 November 2021&amp;lt;/div&amp;gt;&lt;br /&gt;
sm64expert adds arctan straining to [https://github.com/mupen64/SM64LuaRedux SM64 Lua Redux], making it accessible to everyone for the first time.&lt;br /&gt;
&lt;br /&gt;
==See Also==&lt;br /&gt;
[[Straining]]&lt;br /&gt;
&lt;br /&gt;
==References==&lt;br /&gt;
{{#ev:youtube|_yx0eutBwII}}&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
[[Category:Mechanics]]&lt;/div&gt;</summary>
		<author><name>Aurumaker72</name></author>
	</entry>
	<entry>
		<id>https://ukikipedia.net/mediawiki/index.php?title=Mupen64&amp;diff=19260</id>
		<title>Mupen64</title>
		<link rel="alternate" type="text/html" href="https://ukikipedia.net/mediawiki/index.php?title=Mupen64&amp;diff=19260"/>
		<updated>2024-05-15T06:36:32Z</updated>

		<summary type="html">&lt;p&gt;Aurumaker72: Add info about lagless support due to clock speed control&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{stub}}&lt;br /&gt;
&#039;&#039;&#039;Mupen64&#039;&#039;&#039; is a [[Nintendo 64]] [[Emulators|emulator]] useful for its TASing capabilities. &lt;br /&gt;
&lt;br /&gt;
There are many forks of Mupen64, the primary community-maintained one being [https://github.com/mkdasher/mupen64-rr-lua- mupen64-rr-lua], which is nearly universally used for TASing Super Mario 64&lt;br /&gt;
=Mupen64plus=&lt;br /&gt;
&#039;&#039;&#039;Mupen64plus&#039;&#039;&#039; (stylized as &#039;&#039;&#039;mupen64plus&#039;&#039;&#039;) is an emulator used for real-time gameplay. &lt;br /&gt;
&lt;br /&gt;
It is generally preferred in this regard over Mupen64. Mupen64plus, as well as m64p-based frontends such as OpenEMU, are also allowed for Super Mario 64 [[RTA|speedrunning]].&lt;br /&gt;
=mupen64-rr-lua=&lt;br /&gt;
&#039;&#039;&#039;[https://github.com/mkdasher/mupen64-rr-lua- mupen64-rr-lua]&#039;&#039;&#039; is an emulator used for TASing and is most commonly used to record and play back TAS movies. &lt;br /&gt;
&lt;br /&gt;
It is a fork of Mupen64-RR-lua which is actively maintained by the community. It introduces the lua scripting extension, QoL features, and security patches&lt;br /&gt;
&lt;br /&gt;
=== Recording movies ===&lt;br /&gt;
# Navigate to the `Movie` menu and select `Start Movie Recording`...&lt;br /&gt;
# Click &amp;quot;Save As&amp;quot; to pick the movie save location&lt;br /&gt;
# Select a start type.&lt;br /&gt;
#* Start: The movie will start from a console reset&lt;br /&gt;
#* Savestate: The movie will start from a savestate created upon confirming the dialog&lt;br /&gt;
#* Existing Savestate: The movie will start from the savestate picked by the user upon confirming the dialog&lt;br /&gt;
#* EEPROM: The movie will start from a console reset, but with unreset EEPROM&lt;br /&gt;
# (optional) Type your name and a description into the respective fields&lt;br /&gt;
# Confirm the dialog&lt;br /&gt;
&lt;br /&gt;
=== Continuing Movies ===&lt;br /&gt;
&lt;br /&gt;
# Make sure a movie is playing back&lt;br /&gt;
# Disable read-only mode&lt;br /&gt;
# Create a savestate&lt;br /&gt;
# Load the savestate&lt;br /&gt;
# The recording has begun from the frame the savestate was created at&lt;br /&gt;
&lt;br /&gt;
==Features==&lt;br /&gt;
===Lua===&lt;br /&gt;
mupen64-rr-lua supports Lua scripting, which gives it much more power for testing and brute forcing&amp;lt;ref&amp;gt;http://adelikat.tasvideos.org/emulatordownloads/mupen64-rr/LuaExtension_r34_bin.zip&amp;lt;/ref&amp;gt;. It is used for TASing, as well as for testing and preparing.&lt;br /&gt;
===Emulate Float Crashes===&lt;br /&gt;
mupen64-rr-lua supports crashing during certain float-to-short exceptions just like the [[Nintendo 64]] console does. This is a useful alternative to [[TASBot#Console Verification|console verification]], but not as reliable, because there are still some [[Crash#Unknown cause|unknown crashes]].&lt;br /&gt;
&lt;br /&gt;
=== Clock Speed Control ===&lt;br /&gt;
mupen64-rr-lua supports changing the emulated CPU&#039;s clock speed with a multiplier, allowing lagless emulation.&lt;br /&gt;
&lt;br /&gt;
===WiiVC Rounding===&lt;br /&gt;
mupen64-rr-lua supports emulating the [[Wii VC Round-To-Zero]] oversight&amp;lt;ref&amp;gt;https://www.mediafire.com/file/p2qpz0u39fhub8k/mupen64-wiivc.exe/file&amp;lt;/ref&amp;gt;. It has been used, among other things, by pannenkoek2012 to TAS the [[Bowser in the Fire Sea#A Press Counts|Bowser in the Fire Sea 0x A presses]] run&amp;lt;ref&amp;gt;https://www.youtube.com/watch?v=Aa_CciaM4aM&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=References=&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Aurumaker72</name></author>
	</entry>
	<entry>
		<id>https://ukikipedia.net/mediawiki/index.php?title=FAQ&amp;diff=19210</id>
		<title>FAQ</title>
		<link rel="alternate" type="text/html" href="https://ukikipedia.net/mediawiki/index.php?title=FAQ&amp;diff=19210"/>
		<updated>2024-04-10T13:59:51Z</updated>

		<summary type="html">&lt;p&gt;Aurumaker72: Put mupen-related questions in new category, improve wording, add new info&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;FAQ (Frequently Asked Questions)&#039;&#039;&#039;&lt;br /&gt;
==How do I TAS?==&lt;br /&gt;
[https://www.youtube.com/watch?v=GVQW_GuOKQg Basic Mupen64 TAS Tutorial]&lt;br /&gt;
==What is STROOP?==&lt;br /&gt;
{{main|STROOP}}&lt;br /&gt;
STROOP (&#039;&#039;&#039;S&#039;&#039;&#039;uperMario64 &#039;&#039;&#039;T&#039;&#039;&#039;echnical &#039;&#039;&#039;R&#039;&#039;&#039;untime &#039;&#039;&#039;O&#039;&#039;&#039;bserver and &#039;&#039;&#039;O&#039;&#039;&#039;bject &#039;&#039;&#039;P&#039;&#039;&#039;rocessor) is a diagnostic tool for Super Mario 64 which displays and allows for simple editing of various game values and information. It can connect to a running emulator and update values in real time. Some core features include views of loaded/unloaded objects, Mario structure variables, camera + HUD values, an overhead map display, and many more.&lt;br /&gt;
==What is Mupen?==&lt;br /&gt;
{{main|Mupen64}}&lt;br /&gt;
Mupen64 (Mupen for short) is an N64 emulator. A variant of Mupen64, Mupen64-rr, is most commonly used for TASing Super Mario 64. This is what most people in the TAS community mean when they say &amp;quot;Mupen&amp;quot;. There is also an emulator known as Mupen64Plus, which does not have TASing capabilities, but is commonly used for [[RTA]].&lt;br /&gt;
==Why Mupen over BizHawk?==&lt;br /&gt;
Most TASes of Super Mario 64 are done on [[Mupen64-rr]]. This is for one main reason: .m64 files can be played back on console, known as [[TASBot#Console Verification|Console Verification]], whereas bk2 files cannot, due to the way they handle input during lag frames. BizHawk polls inputs on lag frames, as opposed to Mupen64, which does not, and SM64 doesn&#039;t either. BK2 files (BizHawk movie files) can still be converted to m64 files, however, so some still use Bizhawk.&lt;br /&gt;
==Where can I get an SM64 ROM?==&lt;br /&gt;
A quick google search can help you with that. Unfortunately we cannot provide links here because of copyright.&lt;br /&gt;
==What different challenges are there?==&lt;br /&gt;
As of now, there are 13 challenges that have gained decent popularity, along with many minor ones. Some of the more well-known include:&lt;br /&gt;
*The [[UBER Challenge]]&lt;br /&gt;
*The [[Pacifist Challenge]]&lt;br /&gt;
*The [[A Button Challenge]]&lt;br /&gt;
*The [[B Button Challenge]]&lt;br /&gt;
*The [[Z Button Challenge]]&lt;br /&gt;
*The [[Coinless Challenge]]&lt;br /&gt;
*The [[Capless/Cannonless Challenge]]&lt;br /&gt;
*The [[CCC Challenge]]&lt;br /&gt;
*The [[ABZ Button Challenge]]&lt;br /&gt;
*The [[Low Doors Challenge]]&lt;br /&gt;
*The [[No Joystick Allowed Challenge]]&lt;br /&gt;
*The [[Floor is Lava Challenge]]&lt;br /&gt;
*The [[Same Input Challenge]]&lt;br /&gt;
See the [[Challenge]] and [[Other Single Button Challenges]] pages for further info on these and others.&lt;br /&gt;
==How many A presses are left?==&lt;br /&gt;
An any% run takes 0 A presses when performed on Wii VC. A 120 star run currently takes 13 A presses when performed on the original Japanese N64 version. Here&#039;s a table showing these counts on all game versions:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center; width: 200px; height: 200px;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!&lt;br /&gt;
! [[Super Mario 64#Japanese|N64&amp;amp;nbsp;JP (Original)]]&lt;br /&gt;
! [[Super Mario 64#English|N64&amp;amp;nbsp;US]]&lt;br /&gt;
! [[Super Mario 64#PAL|N64&amp;amp;nbsp;PAL]]&lt;br /&gt;
! [[Super Mario 64#Shindou|N64&amp;amp;nbsp;JP (Shindou)]]&lt;br /&gt;
! [[Super Mario 64#iQue_.28Chinese.29|iQue]]&lt;br /&gt;
! [[Super Mario 64#Japanese_2|Wii&amp;amp;nbsp;VC JP]]&lt;br /&gt;
! [[Super Mario 64#English_2|Wii&amp;amp;nbsp;VC US]]&lt;br /&gt;
! [[Super Mario 64#PAL_2|Wii&amp;amp;nbsp;VC PAL]]&lt;br /&gt;
! [[Super Mario 64#Japanese_3|Wii&amp;amp;nbsp;U&amp;amp;nbsp;VC JP]]&lt;br /&gt;
! [[Super Mario 64#English_3|Wii&amp;amp;nbsp;U&amp;amp;nbsp;VC US]]&lt;br /&gt;
! [[Super Mario 64#PAL_3|Wii&amp;amp;nbsp;U&amp;amp;nbsp;VC PAL]]&lt;br /&gt;
! [[Super_Mario_64#64DD_Version|64DD Version]]&lt;br /&gt;
|-&lt;br /&gt;
! Any%&lt;br /&gt;
| 1 || 1 || 1 || 1 || 1 || 0 || 0 || 0 || 1 || 1 || 1 || 1&lt;br /&gt;
|-&lt;br /&gt;
! 120&amp;amp;nbsp;Star&lt;br /&gt;
| 13 || 16 || 16 || 17 || 17 || 16 || 15 || 15 || 17 || 16 || 16 || Impossible&lt;br /&gt;
|}&lt;br /&gt;
==Is a 70 Star 0 A press run being developed?==&lt;br /&gt;
Yes; though it is not yet confirmed to be possible, the run is being TASed until [[BitFS]]. This is because we have a good blueprint for how to do BitFS on the N64. There is currently no plan to make a 70 star no A press run on [[Wii VC]] because [[console Verification|verifying these runs]] is difficult.&lt;br /&gt;
==What&#039;s the next A press save going to be?==&lt;br /&gt;
Currently, the next A press in line to be saved is Bowser in the Fire Sea on the N64, which would bring the A press count from 13 to 12, using [[Bully Battery]] and a [[Squish Cancel]] combined together.&lt;br /&gt;
==How are you decompiling the game?==&lt;br /&gt;
After we discovered the compiler that Nintendo used for Super Mario 64, we obtained the raw assembly from the ROM, and reverse engineered C code that compiles into it. This was a long and tedious process, but after a couple years, the game has been fully decompiled.&lt;br /&gt;
==Why does Mario lose his hat when he dies from going out-of-bounds (OoB)?==&lt;br /&gt;
Mario&#039;s default state is, surprisingly, with no hat on, and on each frame it checks whether he&#039;s wearing the hat and sets the proper graphics flag. However, when Mario goes OoB, a large portion of the central Mario code stops running, including that check. Hence, Mario doesn&#039;t actually lose his hat; he just forgets he&#039;s wearing it.&lt;br /&gt;
==I just got through the 8 Star Door to Bowser 1 by grabbing onto it with a ledge grab! Is this useful?==&lt;br /&gt;
No. Clipping through the door with a ledge grab is a side effect of the patch in the SM64 Editor program that &amp;quot;improves collision&amp;quot;. It is not actually possible in the original game.&lt;br /&gt;
==Mario&#039;s animation doesn&#039;t update when you dive recover against a wall. Is this useful?==&lt;br /&gt;
No. It is a purely visual glitch and has no effect on gameplay.&lt;br /&gt;
==I was doing a BLJ on the endless stairs and warped straight to Wet-Dry World. Is this new?==&lt;br /&gt;
No. You clipped through the wall and went above the painting. The game checks whether or not you entered paintings by checking whether or not you are above floor triangles behind them, even when you are really high up.&lt;br /&gt;
&lt;br /&gt;
== Mupen ==&lt;br /&gt;
&lt;br /&gt;
=== How do you continue off of a TAS you created earlier? ===&lt;br /&gt;
&lt;br /&gt;
# Play it to where you want to continue, then save a state. &lt;br /&gt;
# Disable read-only mode and reload the state. &lt;br /&gt;
# The file will now start recording inputs from that point, erasing any you had previously made after that point.&lt;br /&gt;
&lt;br /&gt;
=== Mupen is open, but the Mupen window disappeared and won’t come back, even when I restart. What do I do? ===&lt;br /&gt;
This is a glitch that occurs on old versions of Mupen when it is closed while minimized.&lt;br /&gt;
&lt;br /&gt;
To fix it, you must maximize the Mupen window and then drag down the top of the window, which will restore it to a normal window. To maximize the window without it actually being present, you can do one of the following:&lt;br /&gt;
* [Windows 7 Only] Open task manager, right click on the Mupen program, click maximize&lt;br /&gt;
* Right click on the Mupen icon in the task bar with shift held, click maximize&lt;br /&gt;
* Hover over the Mupen icon in the task bar, right click on the preview, click maximize&lt;br /&gt;
Deleting Mupen’s config file also works.&lt;br /&gt;
&lt;br /&gt;
=== Recording an AVI on mupen produces a blackscreen with sound. What do I do? ===&lt;br /&gt;
This is a bug that occurs when you use the gl64 video plugin when aero is enabled on your computer. One fix is to use another video plugin, or to disable aero on your computer. The latter is only possible on Windows 7, but unfortunately not on later versions.&lt;br /&gt;
&lt;br /&gt;
The same bug can manifest when capturing with the &amp;quot;Video&amp;quot; synchronization mode on new versions of Mupen.&lt;br /&gt;
&lt;br /&gt;
=== Mupen&#039;s TAS Input Plugin window doesn&#039;t stay focused when clicking on the main emulator window. What do I do? ===&lt;br /&gt;
This is a bug that was introduced in Windows 10 Version 1809, but has been patched in the latest versions of TASInput.&lt;br /&gt;
&lt;br /&gt;
Some solutions have been provided using macros, but the easiest solution is to simply click on the joystick area and hold the click outside of the tas input window. When you release the click it should still follow the mouse. Then click on Mupen, and from now until you close the rom, it will behave normally.&lt;br /&gt;
&lt;br /&gt;
[[Category:Help]]&lt;/div&gt;</summary>
		<author><name>Aurumaker72</name></author>
	</entry>
	<entry>
		<id>https://ukikipedia.net/mediawiki/index.php?title=Mupen64&amp;diff=19164</id>
		<title>Mupen64</title>
		<link rel="alternate" type="text/html" href="https://ukikipedia.net/mediawiki/index.php?title=Mupen64&amp;diff=19164"/>
		<updated>2024-03-10T18:41:58Z</updated>

		<summary type="html">&lt;p&gt;Aurumaker72: Add clock speed control feature info&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{stub}}&lt;br /&gt;
&#039;&#039;&#039;Mupen64&#039;&#039;&#039; is a [[Nintendo 64]] [[Emulators|emulator]] useful for its TASing capabilities. &lt;br /&gt;
&lt;br /&gt;
There are many forks of Mupen64, the primary community-maintained one being [https://github.com/mkdasher/mupen64-rr-lua- mupen64-rr-lua], which is nearly universally used for TASing Super Mario 64&lt;br /&gt;
=Mupen64plus=&lt;br /&gt;
&#039;&#039;&#039;Mupen64plus&#039;&#039;&#039; (stylized as &#039;&#039;&#039;mupen64plus&#039;&#039;&#039;) is an emulator used for real-time gameplay. &lt;br /&gt;
&lt;br /&gt;
It is generally preferred in this regard over Mupen64. Mupen64plus, as well as m64p-based frontends such as OpenEMU, are also allowed for Super Mario 64 [[RTA|speedrunning]].&lt;br /&gt;
=mupen64-rr-lua=&lt;br /&gt;
&#039;&#039;&#039;[https://github.com/mkdasher/mupen64-rr-lua- mupen64-rr-lua]&#039;&#039;&#039; is an emulator used for TASing and is most commonly used to record and play back TAS movies. &lt;br /&gt;
&lt;br /&gt;
It is a fork of Mupen64-RR-lua which is actively maintained by the community. It introduces the lua scripting extension, QoL features, and security patches&lt;br /&gt;
&lt;br /&gt;
=== Recording movies ===&lt;br /&gt;
# Navigate to the `Movie` menu and select `Start Movie Recording`...&lt;br /&gt;
# Click &amp;quot;Save As&amp;quot; to pick the movie save location&lt;br /&gt;
# Select a start type.&lt;br /&gt;
#* Start: The movie will start from a console reset&lt;br /&gt;
#* Savestate: The movie will start from a savestate created upon confirming the dialog&lt;br /&gt;
#* Existing Savestate: The movie will start from the savestate picked by the user upon confirming the dialog&lt;br /&gt;
#* EEPROM: The movie will start from a console reset, but with unreset EEPROM&lt;br /&gt;
# (optional) Type your name and a description into the respective fields&lt;br /&gt;
# Confirm the dialog&lt;br /&gt;
&lt;br /&gt;
=== Continuing Movies ===&lt;br /&gt;
&lt;br /&gt;
# Make sure a movie is playing back&lt;br /&gt;
# Disable read-only mode&lt;br /&gt;
# Create a savestate&lt;br /&gt;
# Load the savestate&lt;br /&gt;
# The recording has begun from the frame the savestate was created at&lt;br /&gt;
&lt;br /&gt;
==Features==&lt;br /&gt;
===Lua===&lt;br /&gt;
mupen64-rr-lua supports Lua scripting, which gives it much more power for testing and brute forcing&amp;lt;ref&amp;gt;http://adelikat.tasvideos.org/emulatordownloads/mupen64-rr/LuaExtension_r34_bin.zip&amp;lt;/ref&amp;gt;. It is used for TASing, as well as for testing and preparing.&lt;br /&gt;
===Emulate Float Crashes===&lt;br /&gt;
mupen64-rr-lua supports crashing during certain float-to-short exceptions just like the [[Nintendo 64]] console does. This is a useful alternative to [[TASBot#Console Verification|console verification]], but not as reliable, because there are still some [[Crash#Unknown cause|unknown crashes]].&lt;br /&gt;
&lt;br /&gt;
=== Clock Speed Control ===&lt;br /&gt;
mupen64-rr-lua supports changing the emulated CPU&#039;s clock speed with a multiplier.&lt;br /&gt;
&lt;br /&gt;
===WiiVC Rounding===&lt;br /&gt;
mupen64-rr-lua supports emulating the [[Wii VC Round-To-Zero]] oversight&amp;lt;ref&amp;gt;https://www.mediafire.com/file/p2qpz0u39fhub8k/mupen64-wiivc.exe/file&amp;lt;/ref&amp;gt;. It has been used, among other things, by pannenkoek2012 to TAS the [[Bowser in the Fire Sea#A Press Counts|Bowser in the Fire Sea 0x A presses]] run&amp;lt;ref&amp;gt;https://www.youtube.com/watch?v=Aa_CciaM4aM&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=References=&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Aurumaker72</name></author>
	</entry>
	<entry>
		<id>https://ukikipedia.net/mediawiki/index.php?title=Abbreviations&amp;diff=19144</id>
		<title>Abbreviations</title>
		<link rel="alternate" type="text/html" href="https://ukikipedia.net/mediawiki/index.php?title=Abbreviations&amp;diff=19144"/>
		<updated>2024-02-17T20:16:06Z</updated>

		<summary type="html">&lt;p&gt;Aurumaker72: /* Software Terminology */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The following tables summarize abbreviations commonly used in the context of Super Mario 64.&lt;br /&gt;
==Courses/Stages/Star Names==&lt;br /&gt;
=== Course Names ===&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
!Abbreviation&lt;br /&gt;
!Meaning&lt;br /&gt;
|-&lt;br /&gt;
|BBH&lt;br /&gt;
|[[Big Boo&#039;s Haunt]]&lt;br /&gt;
|-&lt;br /&gt;
|BoB&lt;br /&gt;
|[[Bob-omb Battlefield]]&lt;br /&gt;
|-&lt;br /&gt;
|CCM&lt;br /&gt;
|[[Cool, Cool Mountain]]&lt;br /&gt;
|-&lt;br /&gt;
|DDD&lt;br /&gt;
|[[Dire, Dire Docks]]&lt;br /&gt;
|-&lt;br /&gt;
|HMC&lt;br /&gt;
|[[Hazy Maze Cave]]&lt;br /&gt;
|-&lt;br /&gt;
|JRB&lt;br /&gt;
|[[Jolly Roger Bay]]&lt;br /&gt;
|-&lt;br /&gt;
|LLL&lt;br /&gt;
|[[Lethal Lava Land]]&lt;br /&gt;
|-&lt;br /&gt;
|RR&lt;br /&gt;
|[[Rainbow Ride]]&lt;br /&gt;
Rerecord&lt;br /&gt;
|-&lt;br /&gt;
|SL&lt;br /&gt;
|[[Snowman&#039;s Land]]&lt;br /&gt;
|-&lt;br /&gt;
|SSL&lt;br /&gt;
|[[Shifting Sand Land]]&lt;br /&gt;
|-&lt;br /&gt;
|THI&lt;br /&gt;
|[[Tiny-Huge Island]]&lt;br /&gt;
|-&lt;br /&gt;
|TTC&lt;br /&gt;
|[[Tick Tock Clock]]&lt;br /&gt;
|-&lt;br /&gt;
|TTM&lt;br /&gt;
|[[Tall, Tall Mountain]]&lt;br /&gt;
|-&lt;br /&gt;
|WDW&lt;br /&gt;
|[[Wet-Dry World]]&lt;br /&gt;
|-&lt;br /&gt;
|WF&lt;br /&gt;
|[[Whomp&#039;s Fortress]]&lt;br /&gt;
|}&lt;br /&gt;
=== Cap Stages ===&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
!Abbreviation&lt;br /&gt;
!Meaning&lt;br /&gt;
|-&lt;br /&gt;
|CotMC&lt;br /&gt;
|[[Cavern of the Metal Cap]]&lt;br /&gt;
|-&lt;br /&gt;
|TotWC&lt;br /&gt;
|[[Tower of the Wing Cap]]&lt;br /&gt;
|-&lt;br /&gt;
|VCutM&lt;br /&gt;
|[[Vanish Cap under the Moat]]&lt;br /&gt;
|}&lt;br /&gt;
=== Bowser Stages ===&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
!Abbreviation&lt;br /&gt;
!Meaning&lt;br /&gt;
|-&lt;br /&gt;
|BitDW&lt;br /&gt;
|[[Bowser in the Dark World]]&lt;br /&gt;
|-&lt;br /&gt;
|BitFS&lt;br /&gt;
|[[Bowser in the Fire Sea]]&lt;br /&gt;
|-&lt;br /&gt;
|BitS&lt;br /&gt;
|[[Bowser in the Sky]]&lt;br /&gt;
|}&lt;br /&gt;
=== Castle Secret Stages ===&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
!Abbreviation&lt;br /&gt;
!Meaning&lt;br /&gt;
|-&lt;br /&gt;
|PSS&lt;br /&gt;
|[[The Princess&#039;s Secret Slide]]&lt;br /&gt;
|-&lt;br /&gt;
|SA&lt;br /&gt;
|[[Secret Aquarium]]&lt;br /&gt;
|-&lt;br /&gt;
|WMotR&lt;br /&gt;
|[[Wing Mario over the Rainbow]]&lt;br /&gt;
|}&lt;br /&gt;
=== Star Names ===&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
!Abbreviation&lt;br /&gt;
!Meaning&lt;br /&gt;
|-&lt;br /&gt;
|CAiaM&lt;br /&gt;
| [[Coins Amassed in a Maze]]&lt;br /&gt;
|-&lt;br /&gt;
|ItAP&lt;br /&gt;
|[[Inside the Ancient Pyramid]]&lt;br /&gt;
|-&lt;br /&gt;
|MHMCM&lt;br /&gt;
|[[Metal-Head Mario Can Move!]]&lt;br /&gt;
|-&lt;br /&gt;
|MWttS&lt;br /&gt;
|[[Mario Wings to the Sky]]&lt;br /&gt;
|-&lt;br /&gt;
|RitC&lt;br /&gt;
|[[Roll into the Cage]]&lt;br /&gt;
|-&lt;br /&gt;
|SotT&lt;br /&gt;
|[[Stomp on the Thwomp]]&lt;br /&gt;
|-&lt;br /&gt;
|TJoMB&lt;br /&gt;
|[[Timed Jumps on Moving Bars]]&lt;br /&gt;
|-&lt;br /&gt;
|TotOC&lt;br /&gt;
|[[Treasure of the Ocean Cave]]&lt;br /&gt;
|-&lt;br /&gt;
|TotT&lt;br /&gt;
|[[Top O&#039; the Town]]&lt;br /&gt;
|-&lt;br /&gt;
|TPatP&lt;br /&gt;
P&amp;amp;P&lt;br /&gt;
|[[The Pit and the Pendulums]]&lt;br /&gt;
|-&lt;br /&gt;
|WfRR&lt;br /&gt;
|[[Watch for Rolling Rocks]]&lt;br /&gt;
|-&lt;br /&gt;
|WKWW&lt;br /&gt;
|[[Wall Kicks Will Work]]&lt;br /&gt;
|-&lt;br /&gt;
|WRC&lt;br /&gt;
|[[Wiggler&#039;s Red Coins]]&lt;br /&gt;
|}&lt;br /&gt;
== Game Mechanics &amp;amp; Terminology ==&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
!Abbreviation&lt;br /&gt;
!Meaning&lt;br /&gt;
|-&lt;br /&gt;
|100c&lt;br /&gt;
|[[100 Coins]]&lt;br /&gt;
|-&lt;br /&gt;
|DJ&lt;br /&gt;
|[[Double Jump]]&lt;br /&gt;
|-&lt;br /&gt;
|DR&lt;br /&gt;
|[[Dive Recover]]&lt;br /&gt;
|-&lt;br /&gt;
|DSS&lt;br /&gt;
|Double Star Spawn&lt;br /&gt;
|-&lt;br /&gt;
|GP&lt;br /&gt;
|Ground Pound&lt;br /&gt;
|-&lt;br /&gt;
|HAU&lt;br /&gt;
|Hexadecimal Angle Unit&lt;br /&gt;
|-&lt;br /&gt;
|HOLP&lt;br /&gt;
|[[Held Object&#039;s Last Position]]&lt;br /&gt;
|-&lt;br /&gt;
|KtQ&lt;br /&gt;
|[[Koopa the Quick]]&lt;br /&gt;
|-&lt;br /&gt;
|LJ&lt;br /&gt;
|[[Long Jump]]&lt;br /&gt;
|-&lt;br /&gt;
|MC&lt;br /&gt;
|[[Metal Cap]]&lt;br /&gt;
|-&lt;br /&gt;
|NUT&lt;br /&gt;
|Nonstatic Unit Truncation&lt;br /&gt;
|-&lt;br /&gt;
|OoB&lt;br /&gt;
|Out of Bounds&lt;br /&gt;
|-&lt;br /&gt;
|PU&lt;br /&gt;
|[[Parallel Universe]]&lt;br /&gt;
|-&lt;br /&gt;
|QPU&lt;br /&gt;
|[[Quadruple Parallel Universe]]&lt;br /&gt;
|-&lt;br /&gt;
|RNG&lt;br /&gt;
|[[RNG|Random Number Generation]]&lt;br /&gt;
[[RNG|Random Number Generator]]&lt;br /&gt;
|-&lt;br /&gt;
|SM64&lt;br /&gt;
|[[Super Mario 64]]&lt;br /&gt;
|-&lt;br /&gt;
|VC&lt;br /&gt;
|[[Virtual Console]]&lt;br /&gt;
[[Vanish Cap]]&lt;br /&gt;
|-&lt;br /&gt;
|VS&lt;br /&gt;
|[[Vertical Speed]]&lt;br /&gt;
Vacant Slot&lt;br /&gt;
|-&lt;br /&gt;
|WC&lt;br /&gt;
|[[Wing Cap]]&lt;br /&gt;
|-&lt;br /&gt;
|WK&lt;br /&gt;
|Wall Kick&lt;br /&gt;
|}&lt;br /&gt;
== Technical Tricks &amp;amp; Glitches ==&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
!Abbreviation&lt;br /&gt;
!Meaning&lt;br /&gt;
|-&lt;br /&gt;
|BCA&lt;br /&gt;
|[[Behind Camera Anywhere]]&lt;br /&gt;
|-&lt;br /&gt;
|BLJ&lt;br /&gt;
|[[Backwards Long Jump]]&lt;br /&gt;
|-&lt;br /&gt;
|BSH&lt;br /&gt;
|[[Backward Shell Hyperspeed]]&lt;br /&gt;
|-&lt;br /&gt;
|CT&lt;br /&gt;
|Cannon Teleportation&lt;br /&gt;
|-&lt;br /&gt;
|CWT&lt;br /&gt;
|[[Chuckya Wrong Throw]]&lt;br /&gt;
|-&lt;br /&gt;
|DSG&lt;br /&gt;
|Death Star Glitch&lt;br /&gt;
|-&lt;br /&gt;
|FBB&lt;br /&gt;
|[[Bully battery|Fast Bully Battery]]&lt;br /&gt;
|-&lt;br /&gt;
|FSH&lt;br /&gt;
|[[Forward Shell Hyperspeed]]&lt;br /&gt;
|-&lt;br /&gt;
|GLG&lt;br /&gt;
|[[Glitchy Ledge Grab]]&lt;br /&gt;
|-&lt;br /&gt;
|GWK&lt;br /&gt;
|[[Glitchy Wall Kick]]&lt;br /&gt;
|-&lt;br /&gt;
|HSB&lt;br /&gt;
|Hyperspeed Bouncing&lt;br /&gt;
Hyperspeed Braking&lt;br /&gt;
|-&lt;br /&gt;
|HSC&lt;br /&gt;
|Horizontal Speed Conservation&lt;br /&gt;
Hyperspeed Crawling&lt;br /&gt;
|-&lt;br /&gt;
|HSF&lt;br /&gt;
|[[Hyperspeed Flying]]&lt;br /&gt;
|-&lt;br /&gt;
|HSG&lt;br /&gt;
|[[Hyperspeed Grinding]]&lt;br /&gt;
|-&lt;br /&gt;
|HSJK&lt;br /&gt;
|[[Hyperspeed Jump Kicking]]&lt;br /&gt;
|-&lt;br /&gt;
|HSP&lt;br /&gt;
|[[Hyperspeed Punching]]&lt;br /&gt;
|-&lt;br /&gt;
|HSSK&lt;br /&gt;
|[[Hyperspeed Slide Kicking]]&lt;br /&gt;
|-&lt;br /&gt;
|HSTA&lt;br /&gt;
|[[Hyperspeed Turnaround]]&lt;br /&gt;
|-&lt;br /&gt;
|HSW&lt;br /&gt;
|[[Hyperspeed Walking]]&lt;br /&gt;
|-&lt;br /&gt;
|HSWK&lt;br /&gt;
|[[Hyperspeed Wall Kicking]]&lt;br /&gt;
|-&lt;br /&gt;
|HSWS&lt;br /&gt;
|[[Hyperspeed Water Sliding]]&lt;br /&gt;
|-&lt;br /&gt;
|LBLJ&lt;br /&gt;
|[[Lobby Backwards Long Jump]]&lt;br /&gt;
|-&lt;br /&gt;
|MDS&lt;br /&gt;
|[[Moat Door Skip]]&lt;br /&gt;
|-&lt;br /&gt;
|MPA&lt;br /&gt;
|[[Mario&#039;s Platform Adventure]]&lt;br /&gt;
|-&lt;br /&gt;
|NJ&lt;br /&gt;
|Negative Jump&lt;br /&gt;
|-&lt;br /&gt;
|OJ&lt;br /&gt;
|Overflow Jump&lt;br /&gt;
|-&lt;br /&gt;
|PBH&lt;br /&gt;
|[[Pause Buffered Hitstun]]&lt;br /&gt;
|-&lt;br /&gt;
|PRD&lt;br /&gt;
|[[Platform Release Displacement]]&lt;br /&gt;
[[Platform Rotation Displacement]]&lt;br /&gt;
|-&lt;br /&gt;
|PT&lt;br /&gt;
|Pole Teleportation&lt;br /&gt;
|-&lt;br /&gt;
|RLB&lt;br /&gt;
|[[Remote Lava Boost]]&lt;br /&gt;
|-&lt;br /&gt;
|SBB&lt;br /&gt;
|[[Bully battery|Slow Bully Battery]]&lt;br /&gt;
|-&lt;br /&gt;
|SBC&lt;br /&gt;
|[[Star Bounce Cancel]]&lt;br /&gt;
[[Other_single_button_challenges#The_Start_Button_Challenge|Start Button Challenge]]&lt;br /&gt;
|-&lt;br /&gt;
|SBLJ&lt;br /&gt;
|[[SBLJ|Side Backwards Long Jump]]&lt;br /&gt;
|-&lt;br /&gt;
|SCGP&lt;br /&gt;
|[[Squish cancel|Squish Cancel Ground Pound]]&lt;br /&gt;
|-&lt;br /&gt;
|SDC&lt;br /&gt;
|[[Star Dance Clip]]&lt;br /&gt;
|-&lt;br /&gt;
|VHSC&lt;br /&gt;
|[[Vertical and Horizontal Speed Conservation]]&lt;br /&gt;
|-&lt;br /&gt;
|VSC&lt;br /&gt;
|[[Vertical Speed Conservation]]&lt;br /&gt;
|-&lt;br /&gt;
|VSCC&lt;br /&gt;
|[[VSC Conservation]]&lt;br /&gt;
|-&lt;br /&gt;
|WHS&lt;br /&gt;
|Wind Hyperspeed&lt;br /&gt;
|}&lt;br /&gt;
== Other ==&lt;br /&gt;
=== Challenges ===&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
!Abbreviation&lt;br /&gt;
!Meaning&lt;br /&gt;
|-&lt;br /&gt;
|0xA&lt;br /&gt;
|[[A Button Challenge|Zero A Presses]]&lt;br /&gt;
|-&lt;br /&gt;
|ABC&lt;br /&gt;
|[[A Button Challenge]]&lt;br /&gt;
|-&lt;br /&gt;
|BBC&lt;br /&gt;
|[[B Button Challenge]]&lt;br /&gt;
|-&lt;br /&gt;
|CC&lt;br /&gt;
|[[Capless/Cannonless Challenge|Capless Cannonless]]&lt;br /&gt;
|-&lt;br /&gt;
|CCC&lt;br /&gt;
|[[Coinless Capless Cannonless]]&lt;br /&gt;
|-&lt;br /&gt;
|RBC&lt;br /&gt;
|[[Other_single_button_challenges#The_R_Button_Challenge|R Button Challenge]]&lt;br /&gt;
|-&lt;br /&gt;
|SBC&lt;br /&gt;
|[[Star Bounce Cancel]]&lt;br /&gt;
[[Other_single_button_challenges#The_Start_Button_Challenge|Start Button Challenge]]&lt;br /&gt;
|-&lt;br /&gt;
|ZBC&lt;br /&gt;
|[[Z Button Challenge]]&lt;br /&gt;
|}&lt;br /&gt;
=== Software Terminology ===&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
!Abbreviation&lt;br /&gt;
!Meaning&lt;br /&gt;
|-&lt;br /&gt;
|M64&lt;br /&gt;
|[[Mupen64]], .m64 (Mupen64 movie file)&lt;br /&gt;
|-&lt;br /&gt;
|MHS&lt;br /&gt;
|Memory Hacking Software&lt;br /&gt;
|-&lt;br /&gt;
|N64&lt;br /&gt;
|[[Nintendo 64]]&lt;br /&gt;
|-&lt;br /&gt;
|PJ64&lt;br /&gt;
|[[Emulators|Project64]]&lt;br /&gt;
|-&lt;br /&gt;
|RR&lt;br /&gt;
|[[Rainbow Ride]]&lt;br /&gt;
Rerecord&lt;br /&gt;
|-&lt;br /&gt;
|SM64SR&lt;br /&gt;
SMSR&lt;br /&gt;
|Super Mario Star Road&lt;br /&gt;
|-&lt;br /&gt;
|ST&lt;br /&gt;
|Savestate&lt;br /&gt;
|-&lt;br /&gt;
|STROOP&lt;br /&gt;
|[[STROOP|SuperMario64 Technical Runtime Observer and Object Processor]]&lt;br /&gt;
|-&lt;br /&gt;
|TAS&lt;br /&gt;
|[[Tool Assisted Speedrun]]&lt;br /&gt;
[[Tool Assisted Superplay]]&lt;br /&gt;
|-&lt;br /&gt;
|TT64&lt;br /&gt;
|Toad’s Tool 64&lt;br /&gt;
|}&lt;br /&gt;
[[Category:Help]]&lt;br /&gt;
[[Category:Resources]]&lt;/div&gt;</summary>
		<author><name>Aurumaker72</name></author>
	</entry>
	<entry>
		<id>https://ukikipedia.net/mediawiki/index.php?title=Mupen64&amp;diff=19143</id>
		<title>Mupen64</title>
		<link rel="alternate" type="text/html" href="https://ukikipedia.net/mediawiki/index.php?title=Mupen64&amp;diff=19143"/>
		<updated>2024-02-17T20:14:41Z</updated>

		<summary type="html">&lt;p&gt;Aurumaker72: Fix &amp;quot;recording movies&amp;quot; formatting&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{stub}}&lt;br /&gt;
&#039;&#039;&#039;Mupen64&#039;&#039;&#039; is a [[Nintendo 64]] [[Emulators|emulator]] useful for its TASing capabilities. &lt;br /&gt;
&lt;br /&gt;
There are many forks of Mupen64, the primary community-maintained one being [https://github.com/mkdasher/mupen64-rr-lua- mupen64-rr-lua], which is nearly universally used for TASing Super Mario 64&lt;br /&gt;
=Mupen64plus=&lt;br /&gt;
&#039;&#039;&#039;Mupen64plus&#039;&#039;&#039; (stylized as &#039;&#039;&#039;mupen64plus&#039;&#039;&#039;) is an emulator used for real-time gameplay. &lt;br /&gt;
&lt;br /&gt;
It is generally preferred in this regard over Mupen64. Mupen64plus, as well as m64p-based frontends such as OpenEMU, are also allowed for Super Mario 64 [[RTA|speedrunning]].&lt;br /&gt;
=mupen64-rr-lua=&lt;br /&gt;
&#039;&#039;&#039;[https://github.com/mkdasher/mupen64-rr-lua- mupen64-rr-lua]&#039;&#039;&#039; is an emulator used for TASing and is most commonly used to record and play back TAS movies. &lt;br /&gt;
&lt;br /&gt;
It is a fork of Mupen64-RR-lua which is actively maintained by the community. It introduces the lua scripting extension, QoL features, and security patches&lt;br /&gt;
&lt;br /&gt;
=== Recording movies ===&lt;br /&gt;
# Navigate to the `Movie` menu and select `Start Movie Recording`...&lt;br /&gt;
# Click &amp;quot;Save As&amp;quot; to pick the movie save location&lt;br /&gt;
# Select a start type.&lt;br /&gt;
#* Start: The movie will start from a console reset&lt;br /&gt;
#* Savestate: The movie will start from a savestate created upon confirming the dialog&lt;br /&gt;
#* Existing Savestate: The movie will start from the savestate picked by the user upon confirming the dialog&lt;br /&gt;
#* EEPROM: The movie will start from a console reset, but with unreset EEPROM&lt;br /&gt;
# (optional) Type your name and a description into the respective fields&lt;br /&gt;
# Confirm the dialog&lt;br /&gt;
&lt;br /&gt;
=== Continuing Movies ===&lt;br /&gt;
&lt;br /&gt;
# Make sure a movie is playing back&lt;br /&gt;
# Disable read-only mode&lt;br /&gt;
# Create a savestate&lt;br /&gt;
# Load the savestate&lt;br /&gt;
# The recording has begun from the frame the savestate was created at&lt;br /&gt;
&lt;br /&gt;
==Features==&lt;br /&gt;
===Lua===&lt;br /&gt;
mupen64-rr-lua supports Lua scripting, which gives it much more power for testing and brute forcing&amp;lt;ref&amp;gt;http://adelikat.tasvideos.org/emulatordownloads/mupen64-rr/LuaExtension_r34_bin.zip&amp;lt;/ref&amp;gt;. It is used for TASing, as well as for testing and preparing.&lt;br /&gt;
===Emulate Float Crashes===&lt;br /&gt;
mupen64-rr-lua supports crashing during certain float-to-short exceptions just like the [[Nintendo 64]] console does. This is a useful alternative to [[TASBot#Console Verification|console verification]], but not as reliable, because there are still some [[Crash#Unknown cause|unknown crashes]].&lt;br /&gt;
===WiiVC Rounding===&lt;br /&gt;
mupen64-rr-lua supports emulating the [[Wii VC Round-To-Zero]] oversight&amp;lt;ref&amp;gt;https://www.mediafire.com/file/p2qpz0u39fhub8k/mupen64-wiivc.exe/file&amp;lt;/ref&amp;gt;. It has been used, among other things, by pannenkoek2012 to TAS the [[Bowser in the Fire Sea#A Press Counts|Bowser in the Fire Sea 0x A presses]] run&amp;lt;ref&amp;gt;https://www.youtube.com/watch?v=Aa_CciaM4aM&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=References=&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Aurumaker72</name></author>
	</entry>
	<entry>
		<id>https://ukikipedia.net/mediawiki/index.php?title=Mupen64&amp;diff=19142</id>
		<title>Mupen64</title>
		<link rel="alternate" type="text/html" href="https://ukikipedia.net/mediawiki/index.php?title=Mupen64&amp;diff=19142"/>
		<updated>2024-02-17T20:13:33Z</updated>

		<summary type="html">&lt;p&gt;Aurumaker72: Clean up and consolidate info&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{stub}}&lt;br /&gt;
&#039;&#039;&#039;Mupen64&#039;&#039;&#039; is a [[Nintendo 64]] [[Emulators|emulator]] useful for its TASing capabilities. &lt;br /&gt;
&lt;br /&gt;
There are many forks of Mupen64, the primary community-maintained one being [https://github.com/mkdasher/mupen64-rr-lua- mupen64-rr-lua], which is nearly universally used for TASing Super Mario 64&lt;br /&gt;
=Mupen64plus=&lt;br /&gt;
&#039;&#039;&#039;Mupen64plus&#039;&#039;&#039; (stylized as &#039;&#039;&#039;mupen64plus&#039;&#039;&#039;) is an emulator used for real-time gameplay. &lt;br /&gt;
&lt;br /&gt;
It is generally preferred in this regard over Mupen64. Mupen64plus, as well as m64p-based frontends such as OpenEMU, are also allowed for Super Mario 64 [[RTA|speedrunning]].&lt;br /&gt;
=mupen64-rr-lua=&lt;br /&gt;
&#039;&#039;&#039;[https://github.com/mkdasher/mupen64-rr-lua- mupen64-rr-lua]&#039;&#039;&#039; is an emulator used for TASing and is most commonly used to record and play back TAS movies. &lt;br /&gt;
&lt;br /&gt;
It is a fork of Mupen64-RR-lua which is actively maintained by the community. It introduces the lua scripting extension, QoL features, and security patches&lt;br /&gt;
==Recording movies==&lt;br /&gt;
&lt;br /&gt;
# Navigate to the `Movie` menu and select `Start Movie Recording`...&lt;br /&gt;
# Click &amp;quot;Save As&amp;quot; to pick the movie save location&lt;br /&gt;
# Select a start type.&lt;br /&gt;
#* Start: The movie will start from a console reset&lt;br /&gt;
#* Savestate: The movie will start from a savestate created upon confirming the dialog&lt;br /&gt;
#* Existing Savestate: The movie will start from the savestate picked by the user upon confirming the dialog&lt;br /&gt;
#* EEPROM: The movie will start from a console reset, but with unreset EEPROM&lt;br /&gt;
# (optional) Type your name and a description into the respective fields&lt;br /&gt;
# Confirm the dialog&lt;br /&gt;
&lt;br /&gt;
=== Continuing Movies ===&lt;br /&gt;
&lt;br /&gt;
# Make sure a movie is playing back&lt;br /&gt;
# Disable read-only mode&lt;br /&gt;
# Create a savestate&lt;br /&gt;
# Load the savestate&lt;br /&gt;
# The recording has begun from the frame the savestate was created at&lt;br /&gt;
&lt;br /&gt;
==Features==&lt;br /&gt;
===Lua===&lt;br /&gt;
mupen64-rr-lua supports Lua scripting, which gives it much more power for testing and brute forcing&amp;lt;ref&amp;gt;http://adelikat.tasvideos.org/emulatordownloads/mupen64-rr/LuaExtension_r34_bin.zip&amp;lt;/ref&amp;gt;. It is used for TASing, as well as for testing and preparing.&lt;br /&gt;
===Emulate Float Crashes===&lt;br /&gt;
mupen64-rr-lua supports crashing during certain float-to-short exceptions just like the [[Nintendo 64]] console does. This is a useful alternative to [[TASBot#Console Verification|console verification]], but not as reliable, because there are still some [[Crash#Unknown cause|unknown crashes]].&lt;br /&gt;
===WiiVC Rounding===&lt;br /&gt;
mupen64-rr-lua supports emulating the [[Wii VC Round-To-Zero]] oversight&amp;lt;ref&amp;gt;https://www.mediafire.com/file/p2qpz0u39fhub8k/mupen64-wiivc.exe/file&amp;lt;/ref&amp;gt;. It has been used, among other things, by pannenkoek2012 to TAS the [[Bowser in the Fire Sea#A Press Counts|Bowser in the Fire Sea 0x A presses]] run&amp;lt;ref&amp;gt;https://www.youtube.com/watch?v=Aa_CciaM4aM&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=References=&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Aurumaker72</name></author>
	</entry>
	<entry>
		<id>https://ukikipedia.net/mediawiki/index.php?title=Mupen64&amp;diff=19141</id>
		<title>Mupen64</title>
		<link rel="alternate" type="text/html" href="https://ukikipedia.net/mediawiki/index.php?title=Mupen64&amp;diff=19141"/>
		<updated>2024-02-15T05:43:21Z</updated>

		<summary type="html">&lt;p&gt;Aurumaker72: Add usage - continuation of movie explanation&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{stub}}&lt;br /&gt;
&#039;&#039;&#039;Mupen64&#039;&#039;&#039; is a [[Nintendo 64]] [[Emulators|emulator]] useful for its TASing capabilities. &lt;br /&gt;
&lt;br /&gt;
There are many forks of Mupen64, the primary community-maintained one being [https://github.com/mkdasher/mupen64-rr-lua- mupen64-rr-lua], which is nearly universally used for TASing Super Mario 64&lt;br /&gt;
=Mupen64plus=&lt;br /&gt;
&#039;&#039;&#039;Mupen64plus&#039;&#039;&#039; (stylized as &#039;&#039;&#039;mupen64plus&#039;&#039;&#039;) is an emulator used for standard gameplay. It is generally preferred in this regard over Mupen64. Mupen64plus (and OpenEMU, a multiconsole emulator that uses the Mupen64plus core) is also allowed for Super Mario 64 [[RTA|speedrunning]].&lt;br /&gt;
=Mupen64-RR=&lt;br /&gt;
&#039;&#039;&#039;Mupen64-RR&#039;&#039;&#039; (stylized as &#039;&#039;&#039;mupen64-rr&#039;&#039;&#039;) is an emulator used for TASing. It is most commonly used to record TAS movies. The file type used for the movies are: &amp;quot;.m64&amp;quot; and &amp;quot;.st&amp;quot;, m64 is the movie, which can be launched if you go to &amp;quot;Playback Movie&amp;quot; but if you have started from snapshot, you will need a .st file in order to make the movie work, otherwise the movie will not start.&lt;br /&gt;
==TASing with Mupen64-RR==&lt;br /&gt;
Open a Super Mario 64 ROM in Mupen64. Go to Utilities --&amp;gt; Movie --&amp;gt; Start Movie Recording. Type in a name, author, and/or description if you wish. You can also choose to start from the start (when you boot it up), or you can choose the star from a snapshot you have made. Click on OK, and your TAS will start. Press - or + to speed up or down whilst recording. You can also press \ (the slash usually above RETURN) to advance a single frame. To unpause/pause, press Pause. If you don&#039;t have a Pause button on your keyboard, go to the settings, and change the hotkey from Pause to something else. To continue from a TAS, put the movie settings in &amp;quot;read only&amp;quot; mode. Then when the TAS stops at the time you want to continue, then turn off the &amp;quot;read only&amp;quot; mode. After that, save a state and reload it to continue a TAS.&lt;br /&gt;
==Hacked versions of Mupen64-RR==&lt;br /&gt;
Because Mupen64 does not have perfect emulation accuracy, there are several hacked versions of Mupen to deal with this, as well as to allow for additional functionality.&lt;br /&gt;
===Mupen64-Lua===&lt;br /&gt;
&#039;&#039;&#039;Mupen64-Lua&#039;&#039;&#039; supports Lua scripting, which gives Mupen64-rr much more power for testing and brute forcing&amp;lt;ref&amp;gt;http://adelikat.tasvideos.org/emulatordownloads/mupen64-rr/LuaExtension_r34_bin.zip&amp;lt;/ref&amp;gt;. It is used for TASing, as well as for testing and preparing.&lt;br /&gt;
===Mupen64-PUs===&lt;br /&gt;
&#039;&#039;&#039;Mupen64-PUs&#039;&#039;&#039; is a modified version of Mupen that crashes during certain float-to-short exceptions just like the [[Nintendo 64]] console does. This is a useful alternative to [[TASBot#Console Verification|console verification]], but not as reliable, because there are still some [[Crash#Unknown cause|unknown crashes]].&lt;br /&gt;
===Mupen64-WiiVC-RTZ===&lt;br /&gt;
&#039;&#039;&#039;Mupen64-WiiVC-RTZ&#039;&#039;&#039; is a version of Mupen that emulates the [[Wii VC Round-To-Zero]] oversight&amp;lt;ref&amp;gt;https://www.mediafire.com/file/p2qpz0u39fhub8k/mupen64-wiivc.exe/file&amp;lt;/ref&amp;gt;. It has been used, among other things, by pannenkoek2012 to TAS the [[Bowser in the Fire Sea#A Press Counts|Bowser in the Fire Sea 0x A presses]] run&amp;lt;ref&amp;gt;https://www.youtube.com/watch?v=Aa_CciaM4aM&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== mupen64-rr-lua ==&lt;br /&gt;
&#039;&#039;&#039;mupen64-rr-lua&#039;&#039;&#039; is a fork of Mupen64-RR which is actively maintained by the community. It introduces the lua scripting extension, QoL features, and security patches&lt;br /&gt;
&lt;br /&gt;
== Usage ==&lt;br /&gt;
&lt;br /&gt;
=== Continuation of movie ===&lt;br /&gt;
&lt;br /&gt;
# Make sure a movie is playing back&lt;br /&gt;
# Disable read-only mode&lt;br /&gt;
# Create a savestate&lt;br /&gt;
# Load the savestate&lt;br /&gt;
# The recording has begun from the frame the savestate was created at&lt;br /&gt;
&lt;br /&gt;
=References=&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Aurumaker72</name></author>
	</entry>
	<entry>
		<id>https://ukikipedia.net/mediawiki/index.php?title=File:Mupen-continue-movie.png&amp;diff=19140</id>
		<title>File:Mupen-continue-movie.png</title>
		<link rel="alternate" type="text/html" href="https://ukikipedia.net/mediawiki/index.php?title=File:Mupen-continue-movie.png&amp;diff=19140"/>
		<updated>2024-02-15T05:41:28Z</updated>

		<summary type="html">&lt;p&gt;Aurumaker72: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;A screenshot of a discord chat which describes how to continue a movie in mupen64&lt;/div&gt;</summary>
		<author><name>Aurumaker72</name></author>
	</entry>
	<entry>
		<id>https://ukikipedia.net/mediawiki/index.php?title=Mupen64&amp;diff=18798</id>
		<title>Mupen64</title>
		<link rel="alternate" type="text/html" href="https://ukikipedia.net/mediawiki/index.php?title=Mupen64&amp;diff=18798"/>
		<updated>2023-12-15T21:34:08Z</updated>

		<summary type="html">&lt;p&gt;Aurumaker72: Rewrite introduction, add info regarding new mupen&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{stub}}&lt;br /&gt;
&#039;&#039;&#039;Mupen64&#039;&#039;&#039; is a [[Nintendo 64]] [[Emulators|emulator]] useful for its TASing capabilities. &lt;br /&gt;
&lt;br /&gt;
There are many forks of Mupen64, the primary community-maintained one being [https://github.com/mkdasher/mupen64-rr-lua- mupen64-rr-lua], which is nearly universally used for TASing Super Mario 64&lt;br /&gt;
=Mupen64plus=&lt;br /&gt;
&#039;&#039;&#039;Mupen64plus&#039;&#039;&#039; (stylized as &#039;&#039;&#039;mupen64plus&#039;&#039;&#039;) is an emulator used for standard gameplay. It is generally preferred in this regard over Mupen64. Mupen64plus (and OpenEMU, a multiconsole emulator that uses the Mupen64plus core) is also allowed for Super Mario 64 [[RTA|speedrunning]].&lt;br /&gt;
=Mupen64-RR=&lt;br /&gt;
&#039;&#039;&#039;Mupen64-RR&#039;&#039;&#039; (stylized as &#039;&#039;&#039;mupen64-rr&#039;&#039;&#039;) is an emulator used for TASing. It is most commonly used to record TAS movies. The file type used for the movies are: &amp;quot;.m64&amp;quot; and &amp;quot;.st&amp;quot;, m64 is the movie, which can be launched if you go to &amp;quot;Playback Movie&amp;quot; but if you have started from snapshot, you will need a .st file in order to make the movie work, otherwise the movie will not start.&lt;br /&gt;
==TASing with Mupen64-RR==&lt;br /&gt;
Open a Super Mario 64 ROM in Mupen64. Go to Utilities --&amp;gt; Movie --&amp;gt; Start Movie Recording. Type in a name, author, and/or description if you wish. You can also choose to start from the start (when you boot it up), or you can choose the star from a snapshot you have made. Click on OK, and your TAS will start. Press - or + to speed up or down whilst recording. You can also press \ (the slash usually above RETURN) to advance a single frame. To unpause/pause, press Pause. If you don&#039;t have a Pause button on your keyboard, go to the settings, and change the hotkey from Pause to something else. To continue from a TAS, put the movie settings in &amp;quot;read only&amp;quot; mode. Then when the TAS stops at the time you want to continue, then turn off the &amp;quot;read only&amp;quot; mode. After that, save a state and reload it to continue a TAS.&lt;br /&gt;
==Hacked versions of Mupen64-RR==&lt;br /&gt;
Because Mupen64 does not have perfect emulation accuracy, there are several hacked versions of Mupen to deal with this, as well as to allow for additional functionality.&lt;br /&gt;
===Mupen64-Lua===&lt;br /&gt;
&#039;&#039;&#039;Mupen64-Lua&#039;&#039;&#039; supports Lua scripting, which gives Mupen64-rr much more power for testing and brute forcing&amp;lt;ref&amp;gt;http://adelikat.tasvideos.org/emulatordownloads/mupen64-rr/LuaExtension_r34_bin.zip&amp;lt;/ref&amp;gt;. It is used for TASing, as well as for testing and preparing.&lt;br /&gt;
===Mupen64-PUs===&lt;br /&gt;
&#039;&#039;&#039;Mupen64-PUs&#039;&#039;&#039; is a modified version of Mupen that crashes during certain float-to-short exceptions just like the [[Nintendo 64]] console does. This is a useful alternative to [[TASBot#Console Verification|console verification]], but not as reliable, because there are still some [[Crash#Unknown cause|unknown crashes]].&lt;br /&gt;
===Mupen64-WiiVC-RTZ===&lt;br /&gt;
&#039;&#039;&#039;Mupen64-WiiVC-RTZ&#039;&#039;&#039; is a version of Mupen that emulates the [[Wii VC Round-To-Zero]] oversight&amp;lt;ref&amp;gt;https://www.mediafire.com/file/p2qpz0u39fhub8k/mupen64-wiivc.exe/file&amp;lt;/ref&amp;gt;. It has been used, among other things, by pannenkoek2012 to TAS the [[Bowser in the Fire Sea#A Press Counts|Bowser in the Fire Sea 0x A presses]] run&amp;lt;ref&amp;gt;https://www.youtube.com/watch?v=Aa_CciaM4aM&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== mupen64-rr-lua ==&lt;br /&gt;
&#039;&#039;&#039;mupen64-rr-lua&#039;&#039;&#039; is a fork of Mupen64-RR which is actively maintained by the community. It introduces the lua scripting extension, QoL features, and security patches.&lt;br /&gt;
&lt;br /&gt;
=References=&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Aurumaker72</name></author>
	</entry>
	<entry>
		<id>https://ukikipedia.net/mediawiki/index.php?title=User_talk:Aurumaker72&amp;diff=18068</id>
		<title>User talk:Aurumaker72</title>
		<link rel="alternate" type="text/html" href="https://ukikipedia.net/mediawiki/index.php?title=User_talk:Aurumaker72&amp;diff=18068"/>
		<updated>2023-06-30T13:10:49Z</updated>

		<summary type="html">&lt;p&gt;Aurumaker72: Blanked the page&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Aurumaker72</name></author>
	</entry>
	<entry>
		<id>https://ukikipedia.net/mediawiki/index.php?title=User:Aurumaker72&amp;diff=18067</id>
		<title>User:Aurumaker72</title>
		<link rel="alternate" type="text/html" href="https://ukikipedia.net/mediawiki/index.php?title=User:Aurumaker72&amp;diff=18067"/>
		<updated>2023-06-30T13:09:54Z</updated>

		<summary type="html">&lt;p&gt;Aurumaker72: Blanked the page&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Aurumaker72</name></author>
	</entry>
	<entry>
		<id>https://ukikipedia.net/mediawiki/index.php?title=Whomp&amp;diff=16599</id>
		<title>Whomp</title>
		<link rel="alternate" type="text/html" href="https://ukikipedia.net/mediawiki/index.php?title=Whomp&amp;diff=16599"/>
		<updated>2022-03-12T11:25:15Z</updated>

		<summary type="html">&lt;p&gt;Aurumaker72: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{stub}}&lt;br /&gt;
[[File:Whomp.png|link=link=Special:FilePath/Whomp|alt=|thumb|326x326px]]&lt;br /&gt;
&lt;br /&gt;
Whomps/Slab Beasts are large, vertical enemies.&lt;br /&gt;
&lt;br /&gt;
=== Attack Patterns ===&lt;br /&gt;
They move along a predefined path until detecting [[Mario]] in a frontal radius. Upon detection, they will fall towards Mario and attempt to crush him.&lt;br /&gt;
&lt;br /&gt;
=== Defeating ===&lt;br /&gt;
They can be defeated by ground-pounding on their back whilst laying horizontally.&lt;br /&gt;
&lt;br /&gt;
=== Appearance ===&lt;br /&gt;
&lt;br /&gt;
* Whomp&#039;s Fortress&lt;br /&gt;
* Bowser In The Sky&lt;/div&gt;</summary>
		<author><name>Aurumaker72</name></author>
	</entry>
	<entry>
		<id>https://ukikipedia.net/mediawiki/index.php?title=STROOP&amp;diff=12237</id>
		<title>STROOP</title>
		<link rel="alternate" type="text/html" href="https://ukikipedia.net/mediawiki/index.php?title=STROOP&amp;diff=12237"/>
		<updated>2020-08-06T17:39:55Z</updated>

		<summary type="html">&lt;p&gt;Aurumaker72: /* Controllers */Remove tranman&amp;#039;s useless todo&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;S&#039;&#039;&#039;uperMario64 &#039;&#039;&#039;T&#039;&#039;&#039;echnical &#039;&#039;&#039;R&#039;&#039;&#039;untime &#039;&#039;&#039;O&#039;&#039;&#039;bserver and &#039;&#039;&#039;O&#039;&#039;&#039;bject &#039;&#039;&#039;P&#039;&#039;&#039;rocessor, or &#039;&#039;&#039;STROOP&#039;&#039;&#039; for short, is a &#039;&#039;&#039;diagnostic tool&#039;&#039;&#039; for [[Super Mario 64]] which displays and allows for simple editing of various game values and information. It can connect to a running emulator and update values in real time. Some core features include views of loaded/unloaded objects, Mario structure variables, [[Camera|camera]] + [[HUD]] values, an overhead map display, and many more. An up-to-date version of STROOP can be downloaded from [https://github.com/SM64-TAS-ABC/STROOP/releases/download/vDev/STROOP.zip here].&lt;br /&gt;
[[File:STROOP.jpg|350px|thumb|STROOP on [https://en.wikipedia.org/wiki/Windows_10 Windows 10]]] &lt;br /&gt;
[[File:ObjectSlotHack.png|350px|thumb|Tyler&#039;s ROM hack that displayed the object slots in text form]] &lt;br /&gt;
[[File:Blueprint.png|350px|thumb|A blueprint of what Pannenkoek2012 suggested the program should look like]] &lt;br /&gt;
[[File:SM64_diagnostic.png|350px|thumb|The SM64 Diagnostic]] &lt;br /&gt;
&lt;br /&gt;
== History ==&lt;br /&gt;
After [[User:Pannenkoek2012|Pannenkoek2012]] discussed [[Object Slot|object slots]] in his [https://youtu.be/9xE2otZ-9os Science of Cloning] video, there had been a desire to view the object slots of the game in real time. Pannenkoek2012 discussed this desire with Tyler Kehne. Tyler then proceeded to make a ROM hack that could display the object slot behaviors in text form, overlaid onto the screen. Pannenkoek2012 was not pleased with this implementation, as he wanted a separate program that would show the slots visually with images of the objects. Thus, Tyler then proceeded to make a program that would do just that, which he named the SM64 Diagnostic. Tyler wrote the code for it, and Pannenkoek2012 provided the [[Object|object]] images and names. The SM64 Diagnostic was a major breakthrough, as it showed the object slots, the process groups, the held object, object variables, and Mario variables. However, it also had some annoyances, such as it couldn&#039;t connect to an already open Mupen (it had to open Mupen itself), it would occasionally crash Mupen, the [[Angle|angle]] variables (yaw/pitch/roll) had confusing names, the variables couldn&#039;t be edited, and the checkbox variables used a confusing system.&lt;br /&gt;
&lt;br /&gt;
Some time later, Dane Bouchie created a new program called STROOP, which was based on the SM64 Diagnostic, but with many more features and improved functionality. Later, Pannenkoek2012 also began coding for STROOP, adding even more features and functionality. As of today, STROOP has object slots, object variables, Mario variables, [[HUD]] variables, camera variables, triangle variables, water variables, an input display, a file display, a map that can display objects in real time, an M64 editor, and savable options so that the user can customize their experience.&lt;br /&gt;
&lt;br /&gt;
== Loading Screen ==&lt;br /&gt;
[[File:STROOP loading screen.gif|350px|thumb|STROOP Loading Screen]]&lt;br /&gt;
When first opening STROOP, you&#039;ll be greeted with a loading screen. This displays what is currently being initialized, as well as a random helpful hint.&lt;br /&gt;
You can right click the text field and a context menu will appear. Upon clicking it, a list of all helpful hints will appear.&lt;br /&gt;
&lt;br /&gt;
== Connection Screen ==&lt;br /&gt;
[[File:Connection Screen.jpg|475px|thumb|STROOP Connection Screen]]&lt;br /&gt;
After STROOP finishes loading, you&#039;ll encounter a screen where you can choose what process or savestate to connect to. There are various buttons to use:&lt;br /&gt;
* &#039;&#039;&#039;Refresh&#039;&#039;&#039;: Refreshes the list of processes to choose from.&lt;br /&gt;
* &#039;&#039;&#039;Connect&#039;&#039;&#039;: Connects STROOP to the currently selected process.&lt;br /&gt;
* &#039;&#039;&#039;Bypass&#039;&#039;&#039;: Bypasses the start screen. Note that most functionality won&#039;t work if you press this, as most functionality relies on having a data stream to interact with. But this could be useful if you only want to use the M64 editor, for example.&lt;br /&gt;
* &#039;&#039;&#039;Refresh &amp;amp; Connect&#039;&#039;&#039;: Refreshes the list of processes to choose from, and then connects STROOP to the currently selected process. This can save a button press in the case that you need to press both Refresh and Connect.&lt;br /&gt;
* &#039;&#039;&#039;Open Savestate&#039;&#039;&#039;: Connects STROOP to a savestate, chosen from the File Manager. This can be useful if you want to modify values in a savestate, such as global timer or RNG. If you&#039;ve edited a savestate and want to save it, then right click on the Disconnect button on the top left of STROOP, and you&#039;ll see an option to save the savestate.&lt;br /&gt;
&lt;br /&gt;
== Top-Level Controls ==&lt;br /&gt;
On the top of STROOP are several controls that may be of use. These are:&lt;br /&gt;
* &#039;&#039;&#039;Disconnect Button&#039;&#039;&#039;: Disconnects from the current process or savestate. Right click on this for the option to save a savestate after it&#039;s been modified.&lt;br /&gt;
* &#039;&#039;&#039;FPS Counter&#039;&#039;&#039;: Displays the number of frames per second that STROOP is running at. By default, STROOP aims for 30 FPS. However, this can be changed in the Options tab.&lt;br /&gt;
* &#039;&#039;&#039;Connected To&#039;&#039;&#039;: Displays the process that STROOP is currently connected to.&lt;br /&gt;
* &#039;&#039;&#039;Left/Right Arrow Buttons&#039;&#039;&#039;: These can be used to reorder tabs. Simply click on one of the arrow buttons and the currently selected tab will move one spot over in that direction. Right click on these buttons for an option to restore the tabs to the recommended tab order. Separately, you can click on the arrow buttons while holding control, and this will move the currently selected object slots over one spot in that direction. Furthermore, you can click on the arrow buttons while holding a number n, and this will move the currently selected object slots over n spots in that direction.&lt;br /&gt;
* &#039;&#039;&#039;Add Tab Button&#039;&#039;&#039;: Click on this button to see a list of tabs that have been hidden. Click on one of these tabs to restore that tab. Alternatively, click on &amp;quot;Restore All Tabs&amp;quot; to restore all of the tabs.&lt;br /&gt;
* &#039;&#039;&#039;ROM Version&#039;&#039;&#039;: This displays the ROM version that STROOP is currently operating under. By default, it tries to auto-detect what ROM version is being used. However, if you want to use a specific ROM version instead of the auto-detected one, then choose one of the ROM version options without the &amp;quot;AUTO&amp;quot; prefix.&lt;br /&gt;
* &#039;&#039;&#039;ReadWrite/ReadOnly Mode&#039;&#039;&#039;: This displays whether STROOP is is ReadWrite mode or ReadOnly mode. By default, it will be in ReadWrite mode, allowing the user to modify variables. In ReadOnly mode, modifying variables won&#039;t work.&lt;br /&gt;
* &#039;&#039;&#039;Panel Hide/Show Buttons&#039;&#039;&#039;: These 6 buttons allow you to adjust which panels are hidden/shown in any tab of STROOP. In order from left to right, these are: Left Only, Left + Right, Right Only, Bottom Only, Bottom + Top, Top Only. By default, these buttons will only affect the outermost panels. However, for situations where there are nested panels (e.g. the Memory Tab), you can control which set of panels is being targeted by holding down a number key. Specifically, holding down the number n will target the nth set of panels, where panels are indexed from outermost to innermost. Thus, holding down the number 1 is equivalent to not holding down any number, since it automatically targets the outermost pair of panels. Holding down 2 or higher will affect other panels, assuming they&#039;re on screen.&lt;br /&gt;
* &#039;&#039;&#039;Cog&#039;&#039;&#039;: The cog can be used to quickly and easily toggle savable options, to reset saved options, or to go directly to the Options tab. For more information about the savable options, see the Options Tab section.&lt;br /&gt;
* &#039;&#039;&#039;Version Number&#039;&#039;&#039;: This displays the current version number of STROOP. Right clicking on this provides debugging/developer options, most of which aren&#039;t intended for the casual user. Nevertheless, some useful options include:&lt;br /&gt;
** &#039;&#039;&#039;Enable [[TAS]]er Settings&#039;&#039;&#039;: Switches to the TAS tab, hides the left panel, filters variables to show only the TAS variables, and enables the STROOP ROM hack. This setting was created for Plush&#039;s convenience.&lt;br /&gt;
** &#039;&#039;&#039;Show MHS Vars&#039;&#039;&#039;: Opens a Pop Out with variables commonly found in MHS. This is a convenience for users that are used to using MHS.&lt;br /&gt;
** &#039;&#039;&#039;Download Latest STROOP Release&#039;&#039;&#039;: Downloads the latest STROOP release. This downloads as a separate file, instead of replacing the currently-being-used STROOP file.&lt;br /&gt;
** &#039;&#039;&#039;Show All Helpful Hints&#039;&#039;&#039;: Shows a list of all helpful hints from the loading screen.&lt;br /&gt;
** &#039;&#039;&#039;Show Skribblio Words&#039;&#039;&#039;: Shows a list of all Skribbl.io words in a randomized order.&lt;br /&gt;
&lt;br /&gt;
== Tabs ==&lt;br /&gt;
&lt;br /&gt;
STROOP has several tabs, each of which manages one specific domain. For example, there&#039;s a Mario tab, Triangles tab, M64 tab, Map tab, etc. In fact, there are so many tabs that it&#039;s recommended that you customize which tabs are shown and their order, for your own convenience. To reorder tabs, use the left/right arrow buttons on the top right of STROOP, which will move the current tab one space over in the arrow&#039;s direction. To hide a tab, click on the tab while holding control. Using these 2 techniques, you should be able to reduce the number of tabs to a reasonable amount as well as put the tabs in the order most convenient to you. If you ever need to use a tab that you&#039;ve hidden, then simply add it back using the Add Tab button on the top right of STROOP. Note that the order of tabs and which tabs are hidden are saved, so you only need to do this once, as these settings will stay the same on subsequent STROOP opens. However, if you ever download a new version of STROOP, the settings will be back to their original state. Nevertheless, you can always copy the saved settings file (STROOP\Config\SavedSettings.xml) from the older version of STROOP and replace that corresponding file in the newer version of STROOP.&lt;br /&gt;
{{STROOP_Tabs}}&lt;br /&gt;
&lt;br /&gt;
== Object Slot Panel ==&lt;br /&gt;
&lt;br /&gt;
The lower half of STROOP is the [[Object Slot]] Panel. This shows all 240 object slots in the game. There are various controls to use at the top of the panel:&lt;br /&gt;
* &#039;&#039;&#039;Lock Labels Checkbox&#039;&#039;&#039;: This locks the labels on the slots so that they&#039;ll no longer change. The labels will also turn blue to indicate that they are no longer changing. This can be useful if you want to see how the object slots change from one point in time to another, as you can know what positions the slots used to be in.&lt;br /&gt;
* &#039;&#039;&#039;Slot Size Slider&#039;&#039;&#039;: This controls the size of the object slots.&lt;br /&gt;
* &#039;&#039;&#039;Label Method&#039;&#039;&#039;: This controls what label method is used to determine the label for the object slots.&lt;br /&gt;
** &#039;&#039;&#039;Recommended&#039;&#039;&#039;: This uses the recommended label method for the current Sort Method. Specifically, it will use SlotPosVs for ProcessingOrder, SlotIndex for MemoryOrder, and SlotPosVs for DistanceToMario.&lt;br /&gt;
** &#039;&#039;&#039;SlotPosVs&#039;&#039;&#039;: Loaded object slots will use their processing index, and unloaded object slots will use their processing index prefixed with &amp;quot;VS&amp;quot;.&lt;br /&gt;
** &#039;&#039;&#039;SlotPos&#039;&#039;&#039;: Loaded object slots will use their processing index, and unloaded object slots will continue the indexing from where the loaded slots left off.&lt;br /&gt;
** &#039;&#039;&#039;SlotIndex&#039;&#039;&#039;: Object slots will use their memory index.&lt;br /&gt;
* &#039;&#039;&#039;Sort Method&#039;&#039;&#039;: This controls how the object slots are sorted.&lt;br /&gt;
** &#039;&#039;&#039;ProcessingOrder&#039;&#039;&#039;: The object slots are sorted by their processing order. In other words, the loaded object slots are in the order by which they are processed (i.e. updated), and the unloaded object slots are in the order by which they would take on more objects.&lt;br /&gt;
** &#039;&#039;&#039;MemoryOrder&#039;&#039;&#039;: The object slots are sorted by their memory order. In other words, they are sorted by the memory addresses of the object structs that each object slot represents.&lt;br /&gt;
** &#039;&#039;&#039;DistanceToMario&#039;&#039;&#039;: The object slots are sorted by their distance to Mario, from closest to farthest. Note that the loaded object slots are presented first, then followed by the unloaded object slots.&lt;br /&gt;
&lt;br /&gt;
You can also right click on the Object Slot Panel for the option to select the object slot corresponding to the value that you&#039;ve copied (i.e. what&#039;s on the clipboard).&lt;br /&gt;
&lt;br /&gt;
== Object Slots ==&lt;br /&gt;
&lt;br /&gt;
The object slots are found in the Object Slot Panel. An object slot has 4 parts to it: an image, a label, a background color, and zero or more overlays. &lt;br /&gt;
* &#039;&#039;&#039;Image&#039;&#039;&#039;: The image shows what object is represented by the object slot. The image is transparent when the object is unloaded or set to be unloaded.&lt;br /&gt;
* &#039;&#039;&#039;Label&#039;&#039;&#039;: The label represents the index of the slot by some indexing system (see Label Method under Object Slot Panel).&lt;br /&gt;
* &#039;&#039;&#039;Background Color&#039;&#039;&#039;: The background color represents what Process Group the object belongs to.&lt;br /&gt;
** Process Group 0x0B (Spawner) is Pink&lt;br /&gt;
** Process Group 0x09 (Surface) is Red&lt;br /&gt;
** Process Group 0x0A (Usable) is Red-Orange&lt;br /&gt;
** Process Group 0x00 (Player) is Orange&lt;br /&gt;
** Process Group 0x05 (Pushable) is Yellow&lt;br /&gt;
** Process Group 0x04 (Actor) is Green&lt;br /&gt;
** Process Group 0x02 (Respawning) is Light Blue&lt;br /&gt;
** Process Group 0x06 (Level) is Dark Blue&lt;br /&gt;
** Process Group 0x08 (Default) is Purple&lt;br /&gt;
** Process Group 0x0C (Unimportant) is Brown&lt;br /&gt;
** Vacant Group is Grey&lt;br /&gt;
[[File:Object Slot Overlays.png|350px|thumb|The object slot overlays]]&lt;br /&gt;
* &#039;&#039;&#039;Overlays&#039;&#039;&#039;: The overlays are images overlaid onto certain object slots to provide additional information. The object slots are as follows:&lt;br /&gt;
** &#039;&#039;&#039;Selected&#039;&#039;&#039;: The object(s) selected in the Object Tab.&lt;br /&gt;
** &#039;&#039;&#039;Map&#039;&#039;&#039;: The object(s) that are shown on the map in the Map Tab and Map2 Tab.&lt;br /&gt;
** &#039;&#039;&#039;Map Home&#039;&#039;&#039;: The object(s) whose home(s) are shown on the map in the Map2 Tab.&lt;br /&gt;
** &#039;&#039;&#039;Model&#039;&#039;&#039;: The object that&#039;s shown in the Model Tab.&lt;br /&gt;
** &#039;&#039;&#039;Marked&#039;&#039;&#039;: The object(s) that are marked. Click on an object slot while holding Alt to mark it.&lt;br /&gt;
** &#039;&#039;&#039;Closest&#039;&#039;&#039;: The loaded object that&#039;s closest to Mario.&lt;br /&gt;
** &#039;&#039;&#039;Held&#039;&#039;&#039;: The object that Mario&#039;s holding.&lt;br /&gt;
** &#039;&#039;&#039;Stood On&#039;&#039;&#039;: The object that Mario&#039;s standing on.&lt;br /&gt;
** &#039;&#039;&#039;Interaction&#039;&#039;&#039;: The object that Mario&#039;s interacting with.&lt;br /&gt;
** &#039;&#039;&#039;Used&#039;&#039;&#039;: The object that Mario&#039;s using.&lt;br /&gt;
** &#039;&#039;&#039;Ridden&#039;&#039;&#039;: The object that Mario&#039;s riding on.&lt;br /&gt;
** &#039;&#039;&#039;Camera&#039;&#039;&#039;: The secondary object that the camera is set to focus on.&lt;br /&gt;
** &#039;&#039;&#039;Camera Hack&#039;&#039;&#039;: The object that is being focused on using the Camera Hack.&lt;br /&gt;
** &#039;&#039;&#039;Floor&#039;&#039;&#039;: The object that Mario&#039;s [[Surface#Floors|floor]] triangle belongs to.&lt;br /&gt;
** &#039;&#039;&#039;Wall&#039;&#039;&#039;: The object that Mario&#039;s [[Surface#Walls|wall]] triangle belongs to.&lt;br /&gt;
** &#039;&#039;&#039;Ceiling&#039;&#039;&#039;: The object that Mario&#039;s [[Surface#Ceilings|ceiling]] triangle belongs to.&lt;br /&gt;
** &#039;&#039;&#039;Parent&#039;&#039;&#039;: The parent of the currently hovered object.&lt;br /&gt;
** &#039;&#039;&#039;Parent Unused&#039;&#039;&#039;: The currently hovered object when the currently hovered object&#039;s parent is the unused slot.&lt;br /&gt;
** &#039;&#039;&#039;Parent None&#039;&#039;&#039;: The currently hovered object when the currently hovered object has no parent.&lt;br /&gt;
** &#039;&#039;&#039;Child&#039;&#039;&#039;: A child of the currently hovered object.&lt;br /&gt;
** &#039;&#039;&#039;Collision 1&#039;&#039;&#039;: The 1st collision object of the Mario object.&lt;br /&gt;
** &#039;&#039;&#039;Collision 2&#039;&#039;&#039;: The 2nd collision object of the Mario object.&lt;br /&gt;
** &#039;&#039;&#039;Collision 3&#039;&#039;&#039;: The 3rd collision object of the Mario object.&lt;br /&gt;
** &#039;&#039;&#039;Collision 4&#039;&#039;&#039;: The 4th collision object of the Mario object.&lt;br /&gt;
* Some additional notes on the overlays:&lt;br /&gt;
** Which overlays are displayed can be changed in the Options tab. By default, all overlays are displayed except for Parent and Child ones, as these are the only ones dependent on the currently hovered object. Nevertheless, there&#039;s a shortcut to quickly and temporarily see an object&#039;s parent/child, which is to hold down P while hovering over an object slot.&lt;br /&gt;
** By default, the collision objects are in reference to the Mario object. However, if you want to see the collision objects for a different object, then simply hold down C while hovering over that object&#039;s slot.&lt;br /&gt;
** The Selected, Map, Map Home, Marked, Model, and Camera Hack overlays represent overlays that the user can modify themselves by clicking on the object slots when under certain circumstances. For some of these, multi-selection is available, meaning that multiple slots can be selected at the same time. In these cases, the shortcut of holding shift can be used to select the range of object slots between the previously selected object slot and the currently selected object slot. When multi-selection is available, there&#039;s also the concept of toggle-ability, explained as follows. In some cases (e.g. Selected), clicking on an object slot will select that object slot and unselect all other object slots. In these cases, holding control will make it so that clicking on an object slot will toggle that slot&#039;s selectedness while leaving all other slots&#039; selectednesses unchanged. In other cases (e.g. Map, Marked), the situation is reversed. That is, clicking on an object slot will toggle that slot&#039;s selectedness while leaving all other slots&#039; selectednesses unchanged, whereas holding control will make it so that clicking on an object slot will select that object slot and unselect all other object slots. We say that these cases are toggle-able by default. In both situations, holding control will toggle whether we&#039;re in toggle-mode or not, but it&#039;s just that the default mode may or may not be toggle-able. Here is more information:&lt;br /&gt;
*** &#039;&#039;&#039;Selected&#039;&#039;&#039;: Modifiable when clicking on an object slot. Multi-selection allowed.&lt;br /&gt;
*** &#039;&#039;&#039;Map&#039;&#039;&#039;: Modifiable when clicking on an object slot in the Map Tab or Map2 Tab. Multi-selection allowed. Toggle-able by default.&lt;br /&gt;
*** &#039;&#039;&#039;Map Home&#039;&#039;&#039;: Modifiable when clicking on an object slot in the Map2 Tab with H held. Multi-selection allowed. Toggle-able by default.&lt;br /&gt;
*** &#039;&#039;&#039;Model&#039;&#039;&#039;: Modifiable when clicking on an object slot in the Model Tab.&lt;br /&gt;
*** &#039;&#039;&#039;Marked&#039;&#039;&#039;: Modifiable when clicking on an object slot with Alt held. Multi-selection allowed. Toggle-able by default.&lt;br /&gt;
*** &#039;&#039;&#039;Camera Hack&#039;&#039;&#039;: Modifiable when clicking on an object slot in the Cam Hack Tab.&lt;br /&gt;
&lt;br /&gt;
You can right click on an object slot for even more options. Note that the option will by default only affect the object slot that was right clicked on. If instead you want to have the option affect all slots that are selected, then click the option while holding control. The options are as follows:&lt;br /&gt;
* &#039;&#039;&#039;Select in Object Tab&#039;&#039;&#039;: Selects the object slot in the Object Tab, and switches to the Object Tab.&lt;br /&gt;
* &#039;&#039;&#039;Select in Memory Tab&#039;&#039;&#039;: Selects the object slot in the Memory Tab, and switches to the Memory Tab.&lt;br /&gt;
* &#039;&#039;&#039;Go to&#039;&#039;&#039;: Sends Mario to the object, offset by the &amp;quot;Go to offset&amp;quot; in the Options Tab.&lt;br /&gt;
* &#039;&#039;&#039;Retrieve&#039;&#039;&#039;: Sends the object to Mario, offset by the &amp;quot;Retrieve offset&amp;quot; in the Options Tab.&lt;br /&gt;
* &#039;&#039;&#039;Go to Home&#039;&#039;&#039;: Sends Mario to the object&#039;s home, offset by the &amp;quot;Go to offset&amp;quot; in the Options Tab.&lt;br /&gt;
* &#039;&#039;&#039;Retrieve Home&#039;&#039;&#039;: Sends the object&#039;s home to Mario, offset by the &amp;quot;Retrieve offset&amp;quot; in the Options Tab.&lt;br /&gt;
* &#039;&#039;&#039;Release&#039;&#039;&#039;: Releases the object by settings its Release Status. This is identical to releasing a clone of an object that isn&#039;t meant to be released.&lt;br /&gt;
* &#039;&#039;&#039;UnRelease&#039;&#039;&#039;: Undoes the releasing of an object.&lt;br /&gt;
* &#039;&#039;&#039;Interact&#039;&#039;&#039;: Interacts with an object by setting its Interaction Status to 0xFFFFFFFF. This can be useful if you don&#039;t want to interact with a [[Cloning|clone]], e.g. making a fire clone inert.&lt;br /&gt;
* &#039;&#039;&#039;UnInteract&#039;&#039;&#039;: Undoes the interacting of an object by setting its Interaction Status to 0x00000000.&lt;br /&gt;
* &#039;&#039;&#039;Clone&#039;&#039;&#039;: Clones the object into Mario&#039;s hands.&lt;br /&gt;
* &#039;&#039;&#039;UnClone&#039;&#039;&#039;: Undoes the cloning of the object by clearing what&#039;s in Mario&#039;s hands. This doesn&#039;t actually release the object.&lt;br /&gt;
* &#039;&#039;&#039;Unload&#039;&#039;&#039;: Sets the object to be unloaded.&lt;br /&gt;
* &#039;&#039;&#039;Revive&#039;&#039;&#039;: Revives an unloaded object into a loaded state.&lt;br /&gt;
* &#039;&#039;&#039;Ride&#039;&#039;&#039;: Has Mario ride on the object. Specifically, sets Mario&#039;s ridden object to that object and puts Mario into a riding state.&lt;br /&gt;
* &#039;&#039;&#039;UnRide&#039;&#039;&#039;: Undoes the riding of an object.&lt;br /&gt;
* &#039;&#039;&#039;Ukikipedia&#039;&#039;&#039;: Opens up the Ukikipedia page for an object.&lt;br /&gt;
* &#039;&#039;&#039;Copy Address&#039;&#039;&#039;: Copies the object&#039;s address to the clipboard.&lt;br /&gt;
* &#039;&#039;&#039;Copy Position&#039;&#039;&#039;: Copies the object&#039;s position to the clipboard.&lt;br /&gt;
* &#039;&#039;&#039;Paste Position&#039;&#039;&#039;: Pastes the clipboard data onto an object&#039;s position.&lt;br /&gt;
* &#039;&#039;&#039;Copy Graphics&#039;&#039;&#039;: Copies the object&#039;s graphics value to the clipboard.&lt;br /&gt;
* &#039;&#039;&#039;Paste Graphics&#039;&#039;&#039;: Pastes the clipboard data onto an object&#039;s graphics value.&lt;br /&gt;
* &#039;&#039;&#039;Copy Object&#039;&#039;&#039;: Copies the object&#039;s bytes to a custom clipboard in STROOP.&lt;br /&gt;
* &#039;&#039;&#039;Paste Object&#039;&#039;&#039;: Pastes STROOP&#039;s custom clipboard data onto the object. Note that this doesn&#039;t overwrite the object&#039;s next/previous memory/processed object slots references, since that would corrupt the linked list structure.&lt;br /&gt;
&lt;br /&gt;
== Variable Panel ==&lt;br /&gt;
&lt;br /&gt;
== Variables ==&lt;br /&gt;
&lt;br /&gt;
Variables are found in a Variable Panel. A variable has 2 parts to it: a name (on the left) and a value (on the right). On every STROOP update, the value updates. You can set a variable&#039;s value by double clicking on the value, entering text, and then pressing enter. Some variables are values in memory, while other variables are calculated manually (referred to as special variables). While memory variables can always be set, special variables may or may not be able to be set. If you try to set a variable and it doesn&#039;t go through (either because the variable can&#039;t be set or because you entered an illegal value), then the variable will flash red to indicate this.&lt;br /&gt;
&lt;br /&gt;
All variables come with the following options when right clicked:&lt;br /&gt;
* &#039;&#039;&#039;Highlight&#039;&#039;&#039;: Highlights the variable by giving it a red outline.&lt;br /&gt;
* &#039;&#039;&#039;Lock&#039;&#039;&#039;: Locks the variable&#039;s value. Note that the variable&#039;s value can still be edited while it&#039;s locked.&lt;br /&gt;
* &#039;&#039;&#039;Copy&#039;&#039;&#039;: Copies the variable&#039;s value (with no rounding) to the clipboard.&lt;br /&gt;
* &#039;&#039;&#039;Paste&#039;&#039;&#039;: Pastes the clipboard value to the variable.&lt;br /&gt;
* &#039;&#039;&#039;Panel Options&#039;&#039;&#039;: Opens up the Variable Panel options.&lt;br /&gt;
* &#039;&#039;&#039;Open Controller&#039;&#039;&#039;: Opens up an Advanced Controller for the variable.&lt;br /&gt;
* &#039;&#039;&#039;Add to Custom Tab&#039;&#039;&#039;: Adds the variable to the Custom Tab.&lt;br /&gt;
* &#039;&#039;&#039;Fix Address&#039;&#039;&#039;: Fixes the address of the variable.&lt;br /&gt;
* &#039;&#039;&#039;Rename&#039;&#039;&#039;: Allows you to rename the variable.&lt;br /&gt;
* &#039;&#039;&#039;Remove&#039;&#039;&#039;: Removes the variable from the Variable Panel.&lt;br /&gt;
&lt;br /&gt;
Number variables come with the following additional options when right clicked:&lt;br /&gt;
* &#039;&#039;&#039;Round to ...&#039;&#039;&#039;: Sets how many digits to round the variable to.&lt;br /&gt;
* &#039;&#039;&#039;Display as Hex&#039;&#039;&#039;: Toggles whether the variable is displayed as hex or decimal.&lt;br /&gt;
&lt;br /&gt;
Angle variables come with the following additional options when right clicked:&lt;br /&gt;
* &#039;&#039;&#039;Signed&#039;&#039;&#039;: Toggles whether the variable is displayed as signed or not.&lt;br /&gt;
* &#039;&#039;&#039;Units...&#039;&#039;&#039;: Sets the units for the angle variable. The unit options are:&lt;br /&gt;
** &#039;&#039;&#039;In-Game Units&#039;&#039;&#039;: These are the units that the game uses. One revolution is 65536 in-game units.&lt;br /&gt;
** &#039;&#039;&#039;HAU&#039;&#039;&#039;: Standing for hexadecimal angle units, these are in-game units divided by 16. Thus, one revolution is 4096 HAU. These are useful because angles that fall under the same HAU value use the same entry in the game&#039;s trig table, since angles are truncated to the closest multiple of 16 before accessing the table.&lt;br /&gt;
** &#039;&#039;&#039;Degrees&#039;&#039;&#039;: One revolution is 360 degrees.&lt;br /&gt;
** &#039;&#039;&#039;Radians&#039;&#039;&#039;: One revolution is 2*pi radians.&lt;br /&gt;
** &#039;&#039;&#039;Revolutions&#039;&#039;&#039;: One revolution is one revolution.&lt;br /&gt;
* &#039;&#039;&#039;Truncate to Multiple of 16&#039;&#039;&#039;: Toggles whether the angle&#039;s value is truncated to a multiple of 16. This is useful since angles that truncated to same the closest multiple of 16 use the same entry in the game&#039;s trig table.&lt;br /&gt;
* &#039;&#039;&#039;Constrain to One Revolution&#039;&#039;&#039;: Toggles whether the angle&#039;s value is constrained to one revolution. For example, an angle that&#039;s unsigned and in angle units would be constrained to the range [0, 65535], whereas an angle that&#039;s signed and in angle units would be constrained to the range [-32768, 32767].&lt;br /&gt;
* &#039;&#039;&#039;Reverse&#039;&#039;&#039;: Toggles whether the angle is displayed as the reverse of what it actually is.&lt;br /&gt;
&lt;br /&gt;
Address variables come with the following additional options when right clicked:&lt;br /&gt;
* &#039;&#039;&#039;View Address&#039;&#039;&#039;: Views the variable&#039;s value as an address in the Memory Tab.&lt;br /&gt;
&lt;br /&gt;
Object variables come with the following additional options when right clicked:&lt;br /&gt;
* &#039;&#039;&#039;Display as Object&#039;&#039;&#039;: Displays the variable&#039;s value as an Object. Values include:&lt;br /&gt;
** &#039;&#039;&#039;Slot n&#039;&#039;&#039;: The nth loaded slot.&lt;br /&gt;
** &#039;&#039;&#039;Slot VSn&#039;&#039;&#039;: The nth vacant slot.&lt;br /&gt;
** &#039;&#039;&#039;PG n&#039;&#039;&#039;: Process Group n&#039;s node.&lt;br /&gt;
** &#039;&#039;&#039;(none)&#039;&#039;&#039;: The value 0.&lt;br /&gt;
** &#039;&#039;&#039;(unused object)&#039;&#039;&#039;: The unused object slot.&lt;br /&gt;
** &#039;&#039;&#039;(unknown object)&#039;&#039;&#039;: A value that&#039;s not recognized as a valid object reference.&lt;br /&gt;
* &#039;&#039;&#039;Select Object&#039;&#039;&#039;: Selects the object slot whose object&#039;s address equals the variable&#039;s value.&lt;br /&gt;
&lt;br /&gt;
Triangle variables come with the following additional options when right clicked:&lt;br /&gt;
* &#039;&#039;&#039;Select Triangle&#039;&#039;&#039;: Selects a custom triangle in the Triangle Tab whose address equals the variable&#039;s value.&lt;br /&gt;
&lt;br /&gt;
Boolean variables are unique in that instead of having a text value, they have a checkbox value. The checkbox is checked if the underlying number value (after possibly masking) is non-zero. In the case that the variable represents multiple values with different checked states, the checkbox will be indeterminant. Boolean variables come with the following additional options when right clicked:&lt;br /&gt;
* &#039;&#039;&#039;Display as Checkbox&#039;&#039;&#039;: Toggles whether the variable is displayed as a checkbox.&lt;br /&gt;
* &#039;&#039;&#039;Display as Inverted&#039;&#039;&#039;: Toggles whether the checkbox&#039;s checked state is inverted.&lt;br /&gt;
&lt;br /&gt;
Variables can be selected by clicking on them. You can hold shift and click on a variable to select the range of variables from the previously selected variable to the currently selected variable. To toggle whether a variable is selected or not without unselecting all variable, click on the variable while holding control. To unselect all variables, click on the variable panel. If you right click on a variable that&#039;s selected, then you&#039;ll see a different set of options from normal, and these options will affect all selected variables. Options prefixed with &amp;quot;Angle:&amp;quot; only affect angles. Choosing the &amp;quot;Default&amp;quot; value for an option (e.g. Display as Hex) will set that option to how the variable was originally (e.g. its original status of whether it was displaying as hex). Here are these options:&lt;br /&gt;
* &#039;&#039;&#039;Highlight...&#039;&#039;&#039;: Highlights the variables with a red or custom-colored outline.&lt;br /&gt;
* &#039;&#039;&#039;Lock...&#039;&#039;&#039;: Locks the variables&#039; values.&lt;br /&gt;
* &#039;&#039;&#039;Fix Address...&#039;&#039;&#039;: Fixes the addresses of the variables.&lt;br /&gt;
* &#039;&#039;&#039;Copy...&#039;&#039;&#039;: Copies the variable&#039;s value (with no rounding) to the clipboard. This can be done with commas, tabs, or line breaks separating the variable values. Separately, you can copy the variable values for code, which will copy instantiation statements for each of the variables, e.g. &amp;quot;float X = 100f&amp;quot;. For more control over what the variables are named, hold control while clicking this option. This will open up a dialog where you can enter text, where the $ represents the variables&#039; original names. For example, entering &amp;quot;my$Value&amp;quot; will result in &amp;quot;float myXValue = 100f&amp;quot; being copied to the clipboard.&lt;br /&gt;
* &#039;&#039;&#039;Paste&#039;&#039;&#039;: Pastes the clipboard value to the variables. The values for the variables will be parsed from the clipboard value, which will work so long as the values are separated by whitespace (e.g. spaces, tabs, line breaks) or commas.&lt;br /&gt;
* &#039;&#039;&#039;Round to...&#039;&#039;&#039;: Sets how many digits to round the variables to.&lt;br /&gt;
* &#039;&#039;&#039;Display as Hex...&#039;&#039;&#039;: Sets whether the variables are displayed as hex or decimal.&lt;br /&gt;
* &#039;&#039;&#039;Angle: Signed...&#039;&#039;&#039;: Sets whether the variables are displayed as signed or not.&lt;br /&gt;
* &#039;&#039;&#039;Angle: Units...&#039;&#039;&#039;: Sets the units for the angle variables. See above for more information on the unit options.&lt;br /&gt;
* &#039;&#039;&#039;Angle: Truncate to Multiple of 16...&#039;&#039;&#039;: Sets whether the angles&#039; values are truncated to a multiple of 16.&lt;br /&gt;
* &#039;&#039;&#039;Angle: Constrain to One Revolution...&#039;&#039;&#039;: Sets whether the angles&#039; values are constrained to one revolution.&lt;br /&gt;
* &#039;&#039;&#039;Angle: Reverse...&#039;&#039;&#039;: Sets whether the angles are displayed as the reverse of what it actually is.&lt;br /&gt;
* &#039;&#039;&#039;Angle: Display as Hex...&#039;&#039;&#039;: Sets whether the angle variables are displayed as hex or decimal.&lt;br /&gt;
* &#039;&#039;&#039;Show Variable XML&#039;&#039;&#039;: Shows the XML that represents the variables.&lt;br /&gt;
* &#039;&#039;&#039;Show Variable Info&#039;&#039;&#039;: Shows info on the variables in table form, including Name, Type, Base + Offset, N64 Address, and Emulator Address.&lt;br /&gt;
* &#039;&#039;&#039;Background Color...&#039;&#039;&#039;: Changes the variables background color.&lt;br /&gt;
* &#039;&#039;&#039;Move...&#039;&#039;&#039;: Options for moving variables.&lt;br /&gt;
** &#039;&#039;&#039;Start Move&#039;&#039;&#039;: Adds the selected variables to the moving-variables-clipboard.&lt;br /&gt;
** &#039;&#039;&#039;End Move&#039;&#039;&#039;: Moves the variables on the moving-variables-clipboard to the location of the selected variables.&lt;br /&gt;
** &#039;&#039;&#039;Clear Move&#039;&#039;&#039;: Clears the selected-variables-clipboard.&lt;br /&gt;
* &#039;&#039;&#039;Remove&#039;&#039;&#039;: Removes the variables from the Variable Panel.&lt;br /&gt;
* &#039;&#039;&#039;Rename&#039;&#039;&#039;: Allows you to rename the variables. This will open up a dialog where you can enter text, where the $ represents the variables&#039; original names. For example, entering &amp;quot;my$Value&amp;quot; will result in renaming &amp;quot;X&amp;quot; to &amp;quot;myXValue&amp;quot;.&lt;br /&gt;
* &#039;&#039;&#039;Open Controller&#039;&#039;&#039;: Opens up an Advanced Controller for the variables.&lt;br /&gt;
* &#039;&#039;&#039;Open Triplet Controller&#039;&#039;&#039;: Opens up a Triplet Controller for the variables.&lt;br /&gt;
* &#039;&#039;&#039;Open Pop Out&#039;&#039;&#039;: Opens up a Pop Out for the variables.&lt;br /&gt;
* &#039;&#039;&#039;Add to Tab...&#039;&#039;&#039;: Adds the variables to a tab of your choosing.&lt;br /&gt;
* &#039;&#039;&#039;Add to Custom Tab&#039;&#039;&#039;: Adds the variables to the Custom Tab.&lt;br /&gt;
&lt;br /&gt;
There are also many keyboard shortcuts that can be performed on variables, namely by clicking on a variable when holding one or more keys. These are:&lt;br /&gt;
* &#039;&#039;&#039;Double Click&#039;&#039;&#039;: Opens up the Variable Viewer form for the variable, which shows the variable&#039;s Name, Type, Base + Offset, N64 Address, and Emulator Address.&lt;br /&gt;
* &#039;&#039;&#039;Click + Shift + Number&#039;&#039;&#039;: Sets the variable&#039;s background color to different colors, depending on the number.&lt;br /&gt;
* &#039;&#039;&#039;Click + Number&#039;&#039;&#039;: Sets the variable&#039;s highlight color to different colors, depending on the number.&lt;br /&gt;
* &#039;&#039;&#039;Click + S&#039;&#039;&#039;: Adds the variable to the Custom Tab.&lt;br /&gt;
* &#039;&#039;&#039;Click + T&#039;&#039;&#039;: Adds the variable to the TAS Tab.&lt;br /&gt;
* &#039;&#039;&#039;Click + M&#039;&#039;&#039;: Adds the variable to the Memory Tab.&lt;br /&gt;
* &#039;&#039;&#039;Click + P&#039;&#039;&#039;: Adds the variable to a tab of your choosing.&lt;br /&gt;
* &#039;&#039;&#039;Click + N&#039;&#039;&#039;: Views the variable&#039;s value as an address in the Memory Tab.&lt;br /&gt;
* &#039;&#039;&#039;Click + F&#039;&#039;&#039;: Fixes the address of the variable.&lt;br /&gt;
* &#039;&#039;&#039;Click + H&#039;&#039;&#039;: Highlights the variable with a red outline.&lt;br /&gt;
* &#039;&#039;&#039;Click + L&#039;&#039;&#039;: Locks the variable&#039;s value.&lt;br /&gt;
* &#039;&#039;&#039;Click + D&#039;&#039;&#039;: Toggles whether the variable is displayed as hex or decimal.&lt;br /&gt;
* &#039;&#039;&#039;Click + R&#039;&#039;&#039;: Allows you to rename the variable.&lt;br /&gt;
* &#039;&#039;&#039;Click + C&#039;&#039;&#039;: Opens up an Advanced Controller for the variable.&lt;br /&gt;
* &#039;&#039;&#039;Click + B&#039;&#039;&#039;: Opens up an Bit Controller for the variable.&lt;br /&gt;
* &#039;&#039;&#039;Click + Escape&#039;&#039;&#039;: Removes the variable from the Variable Panel.&lt;br /&gt;
* &#039;&#039;&#039;Click + Backspace&#039;&#039;&#039;: Removes the variable from the Variable Panel.&lt;br /&gt;
* &#039;&#039;&#039;Click + Delete&#039;&#039;&#039;: Removes the variable from the Variable Panel.&lt;br /&gt;
* &#039;&#039;&#039;Click + X&#039;&#039;&#039;: Does an action related to moving a variable. Specifically: If the moving-variables-clipboard is empty, then adds the variable to the moving-variables-clipboard. If the moving-variables-clipboard is non-empty, then moves the variables of the moving-variables-clipboard to the clicked variable&#039;s current location.&lt;br /&gt;
* &#039;&#039;&#039;Click + Backtick&#039;&#039;&#039;: Adds the variable to the Var Hack tab.&lt;br /&gt;
* &#039;&#039;&#039;Click + Z&#039;&#039;&#039;: Sets the variable value to zero.&lt;br /&gt;
* &#039;&#039;&#039;Click + Minus&#039;&#039;&#039;: Decrements the variable value.&lt;br /&gt;
* &#039;&#039;&#039;Click + Plus&#039;&#039;&#039;: Increments the variable value.&lt;br /&gt;
* &#039;&#039;&#039;Click + Q&#039;&#039;&#039;: Sets the variable&#039;s background color to a custom color.&lt;br /&gt;
* &#039;&#039;&#039;Click + O&#039;&#039;&#039;: Sets the variable&#039;s background color to the last custom color.&lt;br /&gt;
&lt;br /&gt;
== Controllers ==&lt;br /&gt;
&lt;br /&gt;
[[File:STROOP Controllers.png|350px|thumb|The various kinds of controllers]] &lt;br /&gt;
Controllers are a set of controls used for manipulating one or more variables. There are various kinds of controllers:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Simple Controller&#039;&#039;&#039;: A Simple Controller is in charge of manipulating one variable. It consists of 2 buttons and a textbox. The buttons are used for subtracting from and adding to the variable using the value that&#039;s in the textbox. Right clicking on one of the buttons shows the option to toggle whether the buttons are inverted, i.e. swapping whether subtraction is on the left and addition is on the right or vice versa. Simple Controllers are found on the left panel of several tabs of STROOP.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Triplet Controller&#039;&#039;&#039;: A Triplet Controller is in charge of manipulating a triplet of variables, usually a set of (x,y,z) Euler coordinates or (theta,phi,radius) spherical coordinates. It consists of 2 sets of controls:&lt;br /&gt;
** &#039;&#039;&#039;Square Controls&#039;&#039;&#039;: On the left are the Square Controls, consisting of 8 buttons and a textbox arranged in square formation. For Euler coordinates, these controls manipulate the x and z coordinates. For spherical coordinates, these controls manipulate the theta and phi coordinates. In both cases, the buttons will add to or subtract from the corresponding variable(s) by the amount in the textbox. Note that you can right click on the buttons for more options so that you can customize the orientation of the buttons. Specifically, this allows you to rotate the buttons any one of eight ways, as well as invert the orientation (i.e. flip it).&lt;br /&gt;
** &#039;&#039;&#039;Line Controls&#039;&#039;&#039;: One the right are the Line Controls, consisting of 2 buttons and a textbox arranged in a vertical line formation. For Euler coordinates, these controls manipulate the y coordinate. For spherical coordinates, these controls manipulate the radius coordinate. In both cases, the buttons will add to or subtract from the corresponding variable by the amount in the textbox. Note that you can right click on the buttons for options to invert the buttons.&lt;br /&gt;
: Triplet controllers also frequently have a Relative Checkbox in the upper right, which toggles whether the controls manipulate the variables absolutely or relative to some angle. When in relative mode, the labels on the buttons will change to emphasize this. Specifically, F = forward, B = backward, L = left, R = right, U = up, D = down. Triplet Controllers are found on the left panel of several tabs of STROOP. However, you can also create your own Triplet Controller by selecting 3 or 4 variables to represent the x,y,z and optional angle variables, right clicking, and choosing to open a Triplet Controller.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Advanced Controller&#039;&#039;&#039;: An advanced controller is in charge of manipulating one or more variables. It consists of the following controls:&lt;br /&gt;
** &#039;&#039;&#039;Name Textbox&#039;&#039;&#039;: This shows the name(s) of the variable(s) being manipulated. Note that this can be edited.&lt;br /&gt;
** &#039;&#039;&#039;Fix Address Checkbox&#039;&#039;&#039;: This is used to toggle whether the variable(s) are using fixed addresses.&lt;br /&gt;
** &#039;&#039;&#039;Value Textbox&#039;&#039;&#039;: This displays the current value(s) of the variable(s). The background color is red if the variable(s) have fixed addresses, blue if the variable(s) don&#039;t have fixed addresses, and purple if some variables do and some variables don&#039;t have fixed addresses.&lt;br /&gt;
** &#039;&#039;&#039;Lock Checkbox&#039;&#039;&#039;: This is used to toggle whether the variable(s) are locked.&lt;br /&gt;
** &#039;&#039;&#039;Subtraction Button&#039;&#039;&#039;: This is used to subtract a value from the variable(s).&lt;br /&gt;
** &#039;&#039;&#039;Addition/Subtraction Textbox&#039;&#039;&#039;: This is the value that&#039;s used by the Addition Button and Subtraction Button.&lt;br /&gt;
** &#039;&#039;&#039;Addition Button&#039;&#039;&#039;: This is used to add a value to the variable(s).&lt;br /&gt;
** &#039;&#039;&#039;Get Button&#039;&#039;&#039;: This gets the value(s) of the variable(s).&lt;br /&gt;
** &#039;&#039;&#039;Get/Set Textbox&#039;&#039;&#039;: This is the value used by the Get Button and Set Button.&lt;br /&gt;
** &#039;&#039;&#039;Set Button&#039;&#039;&#039;: This sets the value(s) of the variable(s).&lt;br /&gt;
: Additional notes:&lt;br /&gt;
:* In the case of setting multiple variables, you can set all of the variables to different values by separating the values in the textbox with commas. Alternatively, leave just one value in the textbox to set all variables to that one value. The same applies to adding and subtracting values.&lt;br /&gt;
:* The add and subtract buttons can be inverted by right clicking on them and choosing to invert.&lt;br /&gt;
:* You can click on the add/subtract button and hold the mouse down while holding control in order to continuously add to or subtract from the variables. Alternatively, right click on either button and choose to Start Continuous Add (or Subtract) and then later choose to Stop Continuous Add (or Subtract).&lt;br /&gt;
: You can create an Advanced Controller for a variable by clicking on the variable while holding C. Alternatively, you can create an Advanced Controller for multiple variables by selecting multiple variables, right clicking, and choosing to open a controller.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Bit Controller&#039;&#039;&#039;: A Bit Controller is in charge of manipulating one variable. It consists of the following controls:&lt;br /&gt;
** &#039;&#039;&#039;Name Textbox&#039;&#039;&#039;: This shows the name of the variable being manipulated. Note that this can be edited.&lt;br /&gt;
** &#039;&#039;&#039;Decimal Value&#039;&#039;&#039;: This shows the decimal value of the variable.&lt;br /&gt;
** &#039;&#039;&#039;Hex Value&#039;&#039;&#039;: This shows the hex value of the variable.&lt;br /&gt;
** &#039;&#039;&#039;Binary Value&#039;&#039;&#039;: This shows the binary value of the variable.&lt;br /&gt;
** &#039;&#039;&#039;Value Table&#039;&#039;&#039;: This shows various representations of the bytes of the variable, including the decimal representation, hex representation, and binary representation. It also provides a set of checkboxes that can be used to toggle each bit of the variable. For floats, these checkboxes are colored according to the bits&#039; role in the float, as blue represents sign, red represents exponent, and green represents mantissa.&lt;br /&gt;
: Note that for floats, you can right click on the empty space of the controller, and change what the textboxes display. Specifically, they can be set to display the sign, exponent, and mantissa values of the float. You can create a Bit Controller for a variable by clicking on the variable while holding B.&lt;br /&gt;
&lt;br /&gt;
== Object Tab ==&lt;br /&gt;
&lt;br /&gt;
== Mario Tab ==&lt;br /&gt;
&lt;br /&gt;
== HUD Tab ==&lt;br /&gt;
&lt;br /&gt;
== Camera Tab ==&lt;br /&gt;
&lt;br /&gt;
== Triangles Tab ==&lt;br /&gt;
&lt;br /&gt;
== Actions Tab ==&lt;br /&gt;
&lt;br /&gt;
== File Tab ==&lt;br /&gt;
&lt;br /&gt;
== Input Tab ==&lt;br /&gt;
&lt;br /&gt;
== Water Tab ==&lt;br /&gt;
&lt;br /&gt;
== Misc Tab ==&lt;br /&gt;
&lt;br /&gt;
== M64 Tab ==&lt;br /&gt;
&lt;br /&gt;
== Custom Tab ==&lt;br /&gt;
&lt;br /&gt;
== TAS Tab ==&lt;br /&gt;
&lt;br /&gt;
== Map Tab ==&lt;br /&gt;
&lt;br /&gt;
== Options Tab ==&lt;br /&gt;
&lt;br /&gt;
== Memory Tab ==&lt;br /&gt;
&lt;br /&gt;
== PU Tab ==&lt;br /&gt;
&lt;br /&gt;
== Area Tab ==&lt;br /&gt;
&lt;br /&gt;
== Model Tab ==&lt;br /&gt;
&lt;br /&gt;
== Gfx Tab ==&lt;br /&gt;
&lt;br /&gt;
== Debug Tab ==&lt;br /&gt;
&lt;br /&gt;
== Hacks Tab ==&lt;br /&gt;
&lt;br /&gt;
== Cam Hack Tab ==&lt;br /&gt;
&lt;br /&gt;
== Q Frames Tab ==&lt;br /&gt;
&lt;br /&gt;
== Var Hack Tab ==&lt;br /&gt;
&lt;br /&gt;
== Coin Tab ==&lt;br /&gt;
&lt;br /&gt;
== Disassembly Tab ==&lt;br /&gt;
&lt;br /&gt;
== Decompiler Tab ==&lt;br /&gt;
&lt;br /&gt;
== Scripts Tab ==&lt;br /&gt;
&lt;br /&gt;
== Testing Tab ==&lt;br /&gt;
&lt;br /&gt;
== Painting Tab ==&lt;br /&gt;
[[Category:STROOP]]&lt;br /&gt;
[[Category:Resources]]&lt;/div&gt;</summary>
		<author><name>Aurumaker72</name></author>
	</entry>
	<entry>
		<id>https://ukikipedia.net/mediawiki/index.php?title=User_talk:Aurumaker72&amp;diff=11425</id>
		<title>User talk:Aurumaker72</title>
		<link rel="alternate" type="text/html" href="https://ukikipedia.net/mediawiki/index.php?title=User_talk:Aurumaker72&amp;diff=11425"/>
		<updated>2020-05-21T15:17:19Z</updated>

		<summary type="html">&lt;p&gt;Aurumaker72: discussion page&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;What is this discussion page what &lt;br /&gt;
I guess post stuff about me here(?)&lt;/div&gt;</summary>
		<author><name>Aurumaker72</name></author>
	</entry>
	<entry>
		<id>https://ukikipedia.net/mediawiki/index.php?title=Ukikipedia:Todo&amp;diff=11393</id>
		<title>Ukikipedia:Todo</title>
		<link rel="alternate" type="text/html" href="https://ukikipedia.net/mediawiki/index.php?title=Ukikipedia:Todo&amp;diff=11393"/>
		<updated>2020-05-20T13:38:20Z</updated>

		<summary type="html">&lt;p&gt;Aurumaker72: added my own suggestion&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This is a TODO list, feel free to add things you feel are necessary to be added but make sure &#039;&#039;&#039;you add your name at the end of your edit statement&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
* Add object lists for every course&lt;br /&gt;
* Create Navigation templates for objects, stars, tases, and similar pages&lt;br /&gt;
* Create pages for every object&amp;lt;small&amp;gt;---[[User:JoshDuMan|JoshDuMan]]&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Proper CSS to change some fonts (like the buttons for edit, history, and more) to be the Mario font and to make the wiki look more unique&lt;br /&gt;
&lt;br /&gt;
Some of the SM64 Experts should make a list of possible states Mario can be in (with pictures).&lt;br /&gt;
&lt;br /&gt;
Someone should make something like [[Template:Level courses]] for glitches, challenges and mechanics. Then we can put all those on the front page &amp;lt;small&amp;gt;---[[User:Thestickman391|Thestickman391]]&amp;lt;/small&amp;gt;&lt;br /&gt;
:Hi, I tried my best on one for the challenges: [[Template:Challenges]] and [[Template:Glitches]] now &amp;lt;small&amp;gt;---[[User:Anderium|Anderium]]&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Video references sound like a concept worth looking into (mostly for explanatory and/or listing videos) &amp;lt;small&amp;gt;---[[User:Iwer Sonsch|Iwer Sonsch]]&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Finish all the hyperspeed methods&lt;br /&gt;
*Create all wanted pages&lt;br /&gt;
*Finish all stubs&lt;br /&gt;
&amp;lt;small&amp;gt;---[[User:Sunky|SunkSimp]]&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Elaborate on [[TASBot]] page&lt;br /&gt;
&amp;lt;small&amp;gt;---[[User:Barry|Barry]]&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A page for every action &amp;lt;small&amp;gt;---[[User:MMMMMMMMMMMMM|MMMMMMMMMMMMM]]&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Put everything into a category, for easy navigation &amp;lt;small&amp;gt;---[[User:Anderium|Anderium]]&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Add all information about the Super Mario Video Quiz(zes) ---[[User:Quate|Quate]]&lt;br /&gt;
&lt;br /&gt;
There should be some way to separate JP/US/Shindou and singlestar/with 100c in TAS history and star infobox, also a better way to use references there - [[User:Galoomba|Galoomba]] ([[User talk:Galoomba|talk]]) 13:17, 26 March 2020 (UTC)&lt;br /&gt;
&lt;br /&gt;
Fix dark mode inverting Ukikipedia logo colors and maybe another button placement for dark mode. &amp;lt;small&amp;gt;---[[User:Aurumaker72||Aurumaker72]]&amp;lt;/small&amp;gt;&lt;/div&gt;</summary>
		<author><name>Aurumaker72</name></author>
	</entry>
	<entry>
		<id>https://ukikipedia.net/mediawiki/index.php?title=User:Aurumaker72&amp;diff=11392</id>
		<title>User:Aurumaker72</title>
		<link rel="alternate" type="text/html" href="https://ukikipedia.net/mediawiki/index.php?title=User:Aurumaker72&amp;diff=11392"/>
		<updated>2020-05-20T13:36:36Z</updated>

		<summary type="html">&lt;p&gt;Aurumaker72: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Hey, i&#039;m auru. I make freeruns and tases&lt;/div&gt;</summary>
		<author><name>Aurumaker72</name></author>
	</entry>
	<entry>
		<id>https://ukikipedia.net/mediawiki/index.php?title=User:Aurumaker72&amp;diff=11391</id>
		<title>User:Aurumaker72</title>
		<link rel="alternate" type="text/html" href="https://ukikipedia.net/mediawiki/index.php?title=User:Aurumaker72&amp;diff=11391"/>
		<updated>2020-05-20T13:36:07Z</updated>

		<summary type="html">&lt;p&gt;Aurumaker72: Created page with &amp;quot;Hey, i&amp;#039;m.&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Hey, i&#039;m.&lt;/div&gt;</summary>
		<author><name>Aurumaker72</name></author>
	</entry>
	<entry>
		<id>https://ukikipedia.net/mediawiki/index.php?title=STROOP&amp;diff=11147</id>
		<title>STROOP</title>
		<link rel="alternate" type="text/html" href="https://ukikipedia.net/mediawiki/index.php?title=STROOP&amp;diff=11147"/>
		<updated>2020-04-13T09:31:28Z</updated>

		<summary type="html">&lt;p&gt;Aurumaker72: Informs that when clicking the loading menu, it shows a list of all hints&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;S&#039;&#039;&#039;uperMario64 &#039;&#039;&#039;T&#039;&#039;&#039;echnical &#039;&#039;&#039;R&#039;&#039;&#039;untime &#039;&#039;&#039;O&#039;&#039;&#039;bserver and &#039;&#039;&#039;O&#039;&#039;&#039;bject &#039;&#039;&#039;P&#039;&#039;&#039;rocessor, or &#039;&#039;&#039;STROOP&#039;&#039;&#039; for short, is a &#039;&#039;&#039;diagnostic tool&#039;&#039;&#039; for [[Super Mario 64]] which displays and allows for simple editing of various game values and information. It can connect to a running emulator and update values in real time. Some core features include views of loaded/unloaded objects, Mario structure variables, [[Camera|camera]] + [[HUD]] values, an overhead map display, and many more. An up-to-date version of STROOP can be downloaded from [https://github.com/SM64-TAS-ABC/STROOP/releases/download/vDev/STROOP.zip here].&lt;br /&gt;
[[File:STROOP.jpg|350px|thumb|STROOP on [https://en.wikipedia.org/wiki/Windows_10 Windows 10]]] &lt;br /&gt;
[[File:ObjectSlotHack.png|350px|thumb|Tyler&#039;s ROM hack that displayed the object slots in text form]] &lt;br /&gt;
[[File:Blueprint.png|350px|thumb|A blueprint of what Pannenkoek2012 suggested the program should look like]] &lt;br /&gt;
[[File:SM64_diagnostic.png|350px|thumb|The SM64 Diagnostic]] &lt;br /&gt;
&lt;br /&gt;
== History ==&lt;br /&gt;
After [[User:Pannenkoek2012|Pannenkoek2012]] discussed [[Object Slot|object slots]] in his [https://youtu.be/9xE2otZ-9os Science of Cloning] video, there had been a desire to view the object slots of the game in real time. Pannenkoek2012 discussed this desire with Tyler Kehne. Tyler then proceeded to make a ROM hack that could display the object slot behaviors in text form, overlaid onto the screen. Pannenkoek2012 was not pleased with this implementation, as he wanted a separate program that would show the slots visually with images of the objects. Thus, Tyler then proceeded to make a program that would do just that, which he named the SM64 Diagnostic. Tyler wrote the code for it, and Pannenkoek2012 provided the [[Object|object]] images and names. The SM64 Diagnostic was a major breakthrough, as it showed the object slots, the process groups, the held object, object variables, and Mario variables. However, it also had some annoyances, such as it couldn&#039;t connect to an already open Mupen (it had to open Mupen itself), it would occasionally crash Mupen, the [[Angle|angle]] variables (yaw/pitch/roll) had confusing names, the variables couldn&#039;t be edited, and the checkbox variables used a confusing system.&lt;br /&gt;
&lt;br /&gt;
Some time later, Dane Bouchie created a new program called STROOP, which was based on the SM64 Diagnostic, but with many more features and improved functionality. Later, Pannenkoek2012 also began coding for STROOP, adding even more features and functionality. As of today, STROOP has object slots, object variables, Mario variables, [[HUD]] variables, camera variables, triangle variables, water variables, an input display, a file display, a map that can display objects in real time, an M64 editor, and savable options so that the user can customize their experience.&lt;br /&gt;
&lt;br /&gt;
== Loading Screen ==&lt;br /&gt;
[[File:STROOP loading screen.gif|350px|thumb|STROOP Loading Screen]]&lt;br /&gt;
When first opening STROOP, you&#039;ll be greeted with a loading screen. This displays what is currently being initialized, as well as a random helpful hint.&lt;br /&gt;
You can right click the text field and a context menu will appear. Upon clicking it, a list of all helpful hints will appear.&lt;br /&gt;
&lt;br /&gt;
== Connection Screen ==&lt;br /&gt;
[[File:Connection Screen.jpg|475px|thumb|STROOP Connection Screen]]&lt;br /&gt;
After STROOP finishes loading, you&#039;ll encounter a screen where you can choose what process or savestate to connect to. There are various buttons to use:&lt;br /&gt;
* &#039;&#039;&#039;Refresh&#039;&#039;&#039;: Refreshes the list of processes to choose from.&lt;br /&gt;
* &#039;&#039;&#039;Connect&#039;&#039;&#039;: Connects STROOP to the currently selected process.&lt;br /&gt;
* &#039;&#039;&#039;Bypass&#039;&#039;&#039;: Bypasses the start screen. Note that most functionality won&#039;t work if you press this, as most functionality relies on having a data stream to interact with. But this could be useful if you only want to use the M64 editor, for example.&lt;br /&gt;
* &#039;&#039;&#039;Refresh &amp;amp; Connect&#039;&#039;&#039;: Refreshes the list of processes to choose from, and then connects STROOP to the currently selected process. This can save a button press in the case that you need to press both Refresh and Connect.&lt;br /&gt;
* &#039;&#039;&#039;Open Savestate&#039;&#039;&#039;: Connects STROOP to a savestate, chosen from the File Manager. This can be useful if you want to modify values in a savestate, such as global timer or RNG. If you&#039;ve edited a savestate and want to save it, then right click on the Disconnect button on the top left of STROOP, and you&#039;ll see an option to save the savestate.&lt;br /&gt;
&lt;br /&gt;
== Top-Level Controls ==&lt;br /&gt;
On the top of STROOP are several controls that may be of use. These are:&lt;br /&gt;
* &#039;&#039;&#039;Disconnect Button&#039;&#039;&#039;: Disconnects from the current process or savestate. Right click on this for the option to save a savestate after it&#039;s been modified.&lt;br /&gt;
* &#039;&#039;&#039;FPS Counter&#039;&#039;&#039;: Displays the number of frames per second that STROOP is running at. By default, STROOP aims for 30 FPS. However, this can be changed in the Options tab.&lt;br /&gt;
* &#039;&#039;&#039;Connected To&#039;&#039;&#039;: Displays the process that STROOP is currently connected to.&lt;br /&gt;
* &#039;&#039;&#039;Left/Right Arrow Buttons&#039;&#039;&#039;: These can be used to reorder tabs. Simply click on one of the arrow buttons and the currently selected tab will move one spot over in that direction. Right click on these buttons for an option to restore the tabs to the recommended tab order. Separately, you can click on the arrow buttons while holding control, and this will move the currently selected object slots over one spot in that direction. Furthermore, you can click on the arrow buttons while holding a number n, and this will move the currently selected object slots over n spots in that direction.&lt;br /&gt;
* &#039;&#039;&#039;Add Tab Button&#039;&#039;&#039;: Click on this button to see a list of tabs that have been hidden. Click on one of these tabs to restore that tab. Alternatively, click on &amp;quot;Restore All Tabs&amp;quot; to restore all of the tabs.&lt;br /&gt;
* &#039;&#039;&#039;ROM Version&#039;&#039;&#039;: This displays the ROM version that STROOP is currently operating under. By default, it tries to auto-detect what ROM version is being used. However, if you want to use a specific ROM version instead of the auto-detected one, then choose one of the ROM version options without the &amp;quot;AUTO&amp;quot; prefix.&lt;br /&gt;
* &#039;&#039;&#039;ReadWrite/ReadOnly Mode&#039;&#039;&#039;: This displays whether STROOP is is ReadWrite mode or ReadOnly mode. By default, it will be in ReadWrite mode, allowing the user to modify variables. In ReadOnly mode, modifying variables won&#039;t work.&lt;br /&gt;
* &#039;&#039;&#039;Panel Hide/Show Buttons&#039;&#039;&#039;: These 6 buttons allow you to adjust which panels are hidden/shown in any tab of STROOP. In order from left to right, these are: Left Only, Left + Right, Right Only, Bottom Only, Bottom + Top, Top Only. By default, these buttons will only affect the outermost panels. However, for situations where there are nested panels (e.g. the Memory Tab), you can control which set of panels is being targeted by holding down a number key. Specifically, holding down the number n will target the nth set of panels, where panels are indexed from outermost to innermost. Thus, holding down the number 1 is equivalent to not holding down any number, since it automatically targets the outermost pair of panels. Holding down 2 or higher will affect other panels, assuming they&#039;re on screen.&lt;br /&gt;
* &#039;&#039;&#039;Cog&#039;&#039;&#039;: The cog can be used to quickly and easily toggle savable options, to reset saved options, or to go directly to the Options tab. For more information about the savable options, see the Options Tab section.&lt;br /&gt;
* &#039;&#039;&#039;Version Number&#039;&#039;&#039;: This displays the current version number of STROOP. Right clicking on this provides debugging/developer options, most of which aren&#039;t intended for the casual user. Nevertheless, some useful options include:&lt;br /&gt;
** &#039;&#039;&#039;Enable [[TAS]]er Settings&#039;&#039;&#039;: Switches to the TAS tab, hides the left panel, filters variables to show only the TAS variables, and enables the STROOP ROM hack. This setting was created for Plush&#039;s convenience.&lt;br /&gt;
** &#039;&#039;&#039;Show MHS Vars&#039;&#039;&#039;: Opens a Pop Out with variables commonly found in MHS. This is a convenience for users that are used to using MHS.&lt;br /&gt;
** &#039;&#039;&#039;Download Latest STROOP Release&#039;&#039;&#039;: Downloads the latest STROOP release. This downloads as a separate file, instead of replacing the currently-being-used STROOP file.&lt;br /&gt;
** &#039;&#039;&#039;Show All Helpful Hints&#039;&#039;&#039;: Shows a list of all helpful hints from the loading screen.&lt;br /&gt;
** &#039;&#039;&#039;Show Skribblio Words&#039;&#039;&#039;: Shows a list of all Skribbl.io words in a randomized order.&lt;br /&gt;
&lt;br /&gt;
== Tabs ==&lt;br /&gt;
&lt;br /&gt;
STROOP has several tabs, each of which manages one specific domain. For example, there&#039;s a Mario tab, Triangles tab, M64 tab, Map tab, etc. In fact, there are so many tabs that it&#039;s recommended that you customize which tabs are shown and their order, for your own convenience. To reorder tabs, use the left/right arrow buttons on the top right of STROOP, which will move the current tab one space over in the arrow&#039;s direction. To hide a tab, click on the tab while holding control. Using these 2 techniques, you should be able to reduce the number of tabs to a reasonable amount as well as put the tabs in the order most convenient to you. If you ever need to use a tab that you&#039;ve hidden, then simply add it back using the Add Tab button on the top right of STROOP. Note that the order of tabs and which tabs are hidden are saved, so you only need to do this once, as these settings will stay the same on subsequent STROOP opens. However, if you ever download a new version of STROOP, the settings will be back to their original state. Nevertheless, you can always copy the saved settings file (STROOP\Config\SavedSettings.xml) from the older version of STROOP and replace that corresponding file in the newer version of STROOP.&lt;br /&gt;
{{STROOP_Tabs}}&lt;br /&gt;
&lt;br /&gt;
== Object Slot Panel ==&lt;br /&gt;
&lt;br /&gt;
The lower half of STROOP is the [[Object Slot]] Panel. This shows all 240 object slots in the game. There are various controls to use at the top of the panel:&lt;br /&gt;
* &#039;&#039;&#039;Lock Labels Checkbox&#039;&#039;&#039;: This locks the labels on the slots so that they&#039;ll no longer change. The labels will also turn blue to indicate that they are no longer changing. This can be useful if you want to see how the object slots change from one point in time to another, as you can know what positions the slots used to be in.&lt;br /&gt;
* &#039;&#039;&#039;Slot Size Slider&#039;&#039;&#039;: This controls the size of the object slots.&lt;br /&gt;
* &#039;&#039;&#039;Label Method&#039;&#039;&#039;: This controls what label method is used to determine the label for the object slots.&lt;br /&gt;
** &#039;&#039;&#039;Recommended&#039;&#039;&#039;: This uses the recommended label method for the current Sort Method. Specifically, it will use SlotPosVs for ProcessingOrder, SlotIndex for MemoryOrder, and SlotPosVs for DistanceToMario.&lt;br /&gt;
** &#039;&#039;&#039;SlotPosVs&#039;&#039;&#039;: Loaded object slots will use their processing index, and unloaded object slots will use their processing index prefixed with &amp;quot;VS&amp;quot;.&lt;br /&gt;
** &#039;&#039;&#039;SlotPos&#039;&#039;&#039;: Loaded object slots will use their processing index, and unloaded object slots will continue the indexing from where the loaded slots left off.&lt;br /&gt;
** &#039;&#039;&#039;SlotIndex&#039;&#039;&#039;: Object slots will use their memory index.&lt;br /&gt;
* &#039;&#039;&#039;Sort Method&#039;&#039;&#039;: This controls how the object slots are sorted.&lt;br /&gt;
** &#039;&#039;&#039;ProcessingOrder&#039;&#039;&#039;: The object slots are sorted by their processing order. In other words, the loaded object slots are in the order by which they are processed (i.e. updated), and the unloaded object slots are in the order by which they would take on more objects.&lt;br /&gt;
** &#039;&#039;&#039;MemoryOrder&#039;&#039;&#039;: The object slots are sorted by their memory order. In other words, they are sorted by the memory addresses of the object structs that each object slot represents.&lt;br /&gt;
** &#039;&#039;&#039;DistanceToMario&#039;&#039;&#039;: The object slots are sorted by their distance to Mario, from closest to farthest. Note that the loaded object slots are presented first, then followed by the unloaded object slots.&lt;br /&gt;
&lt;br /&gt;
You can also right click on the Object Slot Panel for the option to select the object slot corresponding to the value that you&#039;ve copied (i.e. what&#039;s on the clipboard).&lt;br /&gt;
&lt;br /&gt;
== Object Slots ==&lt;br /&gt;
&lt;br /&gt;
The object slots are found in the Object Slot Panel. An object slot has 4 parts to it: an image, a label, a background color, and zero or more overlays. &lt;br /&gt;
* &#039;&#039;&#039;Image&#039;&#039;&#039;: The image shows what object is represented by the object slot. The image is transparent when the object is unloaded or set to be unloaded.&lt;br /&gt;
* &#039;&#039;&#039;Label&#039;&#039;&#039;: The label represents the index of the slot by some indexing system (see Label Method under Object Slot Panel).&lt;br /&gt;
* &#039;&#039;&#039;Background Color&#039;&#039;&#039;: The background color represents what Process Group the object belongs to.&lt;br /&gt;
** Process Group 0x0B (Spawner) is Pink&lt;br /&gt;
** Process Group 0x09 (Surface) is Red&lt;br /&gt;
** Process Group 0x0A (Usable) is Red-Orange&lt;br /&gt;
** Process Group 0x00 (Player) is Orange&lt;br /&gt;
** Process Group 0x05 (Pushable) is Yellow&lt;br /&gt;
** Process Group 0x04 (Actor) is Green&lt;br /&gt;
** Process Group 0x02 (Respawning) is Light Blue&lt;br /&gt;
** Process Group 0x06 (Level) is Dark Blue&lt;br /&gt;
** Process Group 0x08 (Default) is Purple&lt;br /&gt;
** Process Group 0x0C (Unimportant) is Brown&lt;br /&gt;
** Vacant Group is Grey&lt;br /&gt;
[[File:Object Slot Overlays.png|350px|thumb|The object slot overlays]]&lt;br /&gt;
* &#039;&#039;&#039;Overlays&#039;&#039;&#039;: The overlays are images overlaid onto certain object slots to provide additional information. The object slots are as follows:&lt;br /&gt;
** &#039;&#039;&#039;Selected&#039;&#039;&#039;: The object(s) selected in the Object Tab.&lt;br /&gt;
** &#039;&#039;&#039;Map&#039;&#039;&#039;: The object(s) that are shown on the map in the Map Tab and Map2 Tab.&lt;br /&gt;
** &#039;&#039;&#039;Map Home&#039;&#039;&#039;: The object(s) whose home(s) are shown on the map in the Map2 Tab.&lt;br /&gt;
** &#039;&#039;&#039;Model&#039;&#039;&#039;: The object that&#039;s shown in the Model Tab.&lt;br /&gt;
** &#039;&#039;&#039;Marked&#039;&#039;&#039;: The object(s) that are marked. Click on an object slot while holding Alt to mark it.&lt;br /&gt;
** &#039;&#039;&#039;Closest&#039;&#039;&#039;: The loaded object that&#039;s closest to Mario.&lt;br /&gt;
** &#039;&#039;&#039;Held&#039;&#039;&#039;: The object that Mario&#039;s holding.&lt;br /&gt;
** &#039;&#039;&#039;Stood On&#039;&#039;&#039;: The object that Mario&#039;s standing on.&lt;br /&gt;
** &#039;&#039;&#039;Interaction&#039;&#039;&#039;: The object that Mario&#039;s interacting with.&lt;br /&gt;
** &#039;&#039;&#039;Used&#039;&#039;&#039;: The object that Mario&#039;s using.&lt;br /&gt;
** &#039;&#039;&#039;Ridden&#039;&#039;&#039;: The object that Mario&#039;s riding on.&lt;br /&gt;
** &#039;&#039;&#039;Camera&#039;&#039;&#039;: The secondary object that the camera is set to focus on.&lt;br /&gt;
** &#039;&#039;&#039;Camera Hack&#039;&#039;&#039;: The object that is being focused on using the Camera Hack.&lt;br /&gt;
** &#039;&#039;&#039;Floor&#039;&#039;&#039;: The object that Mario&#039;s [[Surface#Floors|floor]] triangle belongs to.&lt;br /&gt;
** &#039;&#039;&#039;Wall&#039;&#039;&#039;: The object that Mario&#039;s [[Surface#Walls|wall]] triangle belongs to.&lt;br /&gt;
** &#039;&#039;&#039;Ceiling&#039;&#039;&#039;: The object that Mario&#039;s [[Surface#Ceilings|ceiling]] triangle belongs to.&lt;br /&gt;
** &#039;&#039;&#039;Parent&#039;&#039;&#039;: The parent of the currently hovered object.&lt;br /&gt;
** &#039;&#039;&#039;Parent Unused&#039;&#039;&#039;: The currently hovered object when the currently hovered object&#039;s parent is the unused slot.&lt;br /&gt;
** &#039;&#039;&#039;Parent None&#039;&#039;&#039;: The currently hovered object when the currently hovered object has no parent.&lt;br /&gt;
** &#039;&#039;&#039;Child&#039;&#039;&#039;: A child of the currently hovered object.&lt;br /&gt;
** &#039;&#039;&#039;Collision 1&#039;&#039;&#039;: The 1st collision object of the Mario object.&lt;br /&gt;
** &#039;&#039;&#039;Collision 2&#039;&#039;&#039;: The 2nd collision object of the Mario object.&lt;br /&gt;
** &#039;&#039;&#039;Collision 3&#039;&#039;&#039;: The 3rd collision object of the Mario object.&lt;br /&gt;
** &#039;&#039;&#039;Collision 4&#039;&#039;&#039;: The 4th collision object of the Mario object.&lt;br /&gt;
* Some additional notes on the overlays:&lt;br /&gt;
** Which overlays are displayed can be changed in the Options tab. By default, all overlays are displayed except for Parent and Child ones, as these are the only ones dependent on the currently hovered object. Nevertheless, there&#039;s a shortcut to quickly and temporarily see an object&#039;s parent/child, which is to hold down P while hovering over an object slot.&lt;br /&gt;
** By default, the collision objects are in reference to the Mario object. However, if you want to see the collision objects for a different object, then simply hold down C while hovering over that object&#039;s slot.&lt;br /&gt;
** The Selected, Map, Map Home, Marked, Model, and Camera Hack overlays represent overlays that the user can modify themselves by clicking on the object slots when under certain circumstances. For some of these, multi-selection is available, meaning that multiple slots can be selected at the same time. In these cases, the shortcut of holding shift can be used to select the range of object slots between the previously selected object slot and the currently selected object slot. When multi-selection is available, there&#039;s also the concept of toggle-ability, explained as follows. In some cases (e.g. Selected), clicking on an object slot will select that object slot and unselect all other object slots. In these cases, holding control will make it so that clicking on an object slot will toggle that slot&#039;s selectedness while leaving all other slots&#039; selectednesses unchanged. In other cases (e.g. Map, Marked), the situation is reversed. That is, clicking on an object slot will toggle that slot&#039;s selectedness while leaving all other slots&#039; selectednesses unchanged, whereas holding control will make it so that clicking on an object slot will select that object slot and unselect all other object slots. We say that these cases are toggle-able by default. In both situations, holding control will toggle whether we&#039;re in toggle-mode or not, but it&#039;s just that the default mode may or may not be toggle-able. Here is more information:&lt;br /&gt;
*** &#039;&#039;&#039;Selected&#039;&#039;&#039;: Modifiable when clicking on an object slot. Multi-selection allowed.&lt;br /&gt;
*** &#039;&#039;&#039;Map&#039;&#039;&#039;: Modifiable when clicking on an object slot in the Map Tab or Map2 Tab. Multi-selection allowed. Toggle-able by default.&lt;br /&gt;
*** &#039;&#039;&#039;Map Home&#039;&#039;&#039;: Modifiable when clicking on an object slot in the Map2 Tab with H held. Multi-selection allowed. Toggle-able by default.&lt;br /&gt;
*** &#039;&#039;&#039;Model&#039;&#039;&#039;: Modifiable when clicking on an object slot in the Model Tab.&lt;br /&gt;
*** &#039;&#039;&#039;Marked&#039;&#039;&#039;: Modifiable when clicking on an object slot with Alt held. Multi-selection allowed. Toggle-able by default.&lt;br /&gt;
*** &#039;&#039;&#039;Camera Hack&#039;&#039;&#039;: Modifiable when clicking on an object slot in the Cam Hack Tab.&lt;br /&gt;
&lt;br /&gt;
You can right click on an object slot for even more options. Note that the option will by default only affect the object slot that was right clicked on. If instead you want to have the option affect all slots that are selected, then click the option while holding control. The options are as follows:&lt;br /&gt;
* &#039;&#039;&#039;Select in Object Tab&#039;&#039;&#039;: Selects the object slot in the Object Tab, and switches to the Object Tab.&lt;br /&gt;
* &#039;&#039;&#039;Select in Memory Tab&#039;&#039;&#039;: Selects the object slot in the Memory Tab, and switches to the Memory Tab.&lt;br /&gt;
* &#039;&#039;&#039;Go to&#039;&#039;&#039;: Sends Mario to the object, offset by the &amp;quot;Go to offset&amp;quot; in the Options Tab.&lt;br /&gt;
* &#039;&#039;&#039;Retrieve&#039;&#039;&#039;: Sends the object to Mario, offset by the &amp;quot;Retrieve offset&amp;quot; in the Options Tab.&lt;br /&gt;
* &#039;&#039;&#039;Go to Home&#039;&#039;&#039;: Sends Mario to the object&#039;s home, offset by the &amp;quot;Go to offset&amp;quot; in the Options Tab.&lt;br /&gt;
* &#039;&#039;&#039;Retrieve Home&#039;&#039;&#039;: Sends the object&#039;s home to Mario, offset by the &amp;quot;Retrieve offset&amp;quot; in the Options Tab.&lt;br /&gt;
* &#039;&#039;&#039;Release&#039;&#039;&#039;: Releases the object by settings its Release Status. This is identical to releasing a clone of an object that isn&#039;t meant to be released.&lt;br /&gt;
* &#039;&#039;&#039;UnRelease&#039;&#039;&#039;: Undoes the releasing of an object.&lt;br /&gt;
* &#039;&#039;&#039;Interact&#039;&#039;&#039;: Interacts with an object by setting its Interaction Status to 0xFFFFFFFF. This can be useful if you don&#039;t want to interact with a [[Cloning|clone]], e.g. making a fire clone inert.&lt;br /&gt;
* &#039;&#039;&#039;UnInteract&#039;&#039;&#039;: Undoes the interacting of an object by setting its Interaction Status to 0x00000000.&lt;br /&gt;
* &#039;&#039;&#039;Clone&#039;&#039;&#039;: Clones the object into Mario&#039;s hands.&lt;br /&gt;
* &#039;&#039;&#039;UnClone&#039;&#039;&#039;: Undoes the cloning of the object by clearing what&#039;s in Mario&#039;s hands. This doesn&#039;t actually release the object.&lt;br /&gt;
* &#039;&#039;&#039;Unload&#039;&#039;&#039;: Sets the object to be unloaded.&lt;br /&gt;
* &#039;&#039;&#039;Revive&#039;&#039;&#039;: Revives an unloaded object into a loaded state.&lt;br /&gt;
* &#039;&#039;&#039;Ride&#039;&#039;&#039;: Has Mario ride on the object. Specifically, sets Mario&#039;s ridden object to that object and puts Mario into a riding state.&lt;br /&gt;
* &#039;&#039;&#039;UnRide&#039;&#039;&#039;: Undoes the riding of an object.&lt;br /&gt;
* &#039;&#039;&#039;Ukikipedia&#039;&#039;&#039;: Opens up the Ukikipedia page for an object.&lt;br /&gt;
* &#039;&#039;&#039;Copy Address&#039;&#039;&#039;: Copies the object&#039;s address to the clipboard.&lt;br /&gt;
* &#039;&#039;&#039;Copy Position&#039;&#039;&#039;: Copies the object&#039;s position to the clipboard.&lt;br /&gt;
* &#039;&#039;&#039;Paste Position&#039;&#039;&#039;: Pastes the clipboard data onto an object&#039;s position.&lt;br /&gt;
* &#039;&#039;&#039;Copy Graphics&#039;&#039;&#039;: Copies the object&#039;s graphics value to the clipboard.&lt;br /&gt;
* &#039;&#039;&#039;Paste Graphics&#039;&#039;&#039;: Pastes the clipboard data onto an object&#039;s graphics value.&lt;br /&gt;
* &#039;&#039;&#039;Copy Object&#039;&#039;&#039;: Copies the object&#039;s bytes to a custom clipboard in STROOP.&lt;br /&gt;
* &#039;&#039;&#039;Paste Object&#039;&#039;&#039;: Pastes STROOP&#039;s custom clipboard data onto the object. Note that this doesn&#039;t overwrite the object&#039;s next/previous memory/processed object slots references, since that would corrupt the linked list structure.&lt;br /&gt;
&lt;br /&gt;
== Variable Panel ==&lt;br /&gt;
&lt;br /&gt;
== Variables ==&lt;br /&gt;
&lt;br /&gt;
Variables are found in a Variable Panel. A variable has 2 parts to it: a name (on the left) and a value (on the right). On every STROOP update, the value updates. You can set a variable&#039;s value by double clicking on the value, entering text, and then pressing enter. Some variables are values in memory, while other variables are calculated manually (referred to as special variables). While memory variables can always be set, special variables may or may not be able to be set. If you try to set a variable and it doesn&#039;t go through (either because the variable can&#039;t be set or because you entered an illegal value), then the variable will flash red to indicate this.&lt;br /&gt;
&lt;br /&gt;
All variables come with the following options when right clicked:&lt;br /&gt;
* &#039;&#039;&#039;Highlight&#039;&#039;&#039;: Highlights the variable by giving it a red outline.&lt;br /&gt;
* &#039;&#039;&#039;Lock&#039;&#039;&#039;: Locks the variable&#039;s value. Note that the variable&#039;s value can still be edited while it&#039;s locked.&lt;br /&gt;
* &#039;&#039;&#039;Copy&#039;&#039;&#039;: Copies the variable&#039;s value (with no rounding) to the clipboard.&lt;br /&gt;
* &#039;&#039;&#039;Paste&#039;&#039;&#039;: Pastes the clipboard value to the variable.&lt;br /&gt;
* &#039;&#039;&#039;Panel Options&#039;&#039;&#039;: Opens up the Variable Panel options.&lt;br /&gt;
* &#039;&#039;&#039;Open Controller&#039;&#039;&#039;: Opens up an Advanced Controller for the variable.&lt;br /&gt;
* &#039;&#039;&#039;Add to Custom Tab&#039;&#039;&#039;: Adds the variable to the Custom Tab.&lt;br /&gt;
* &#039;&#039;&#039;Fix Address&#039;&#039;&#039;: Fixes the address of the variable.&lt;br /&gt;
* &#039;&#039;&#039;Rename&#039;&#039;&#039;: Allows you to rename the variable.&lt;br /&gt;
* &#039;&#039;&#039;Remove&#039;&#039;&#039;: Removes the variable from the Variable Panel.&lt;br /&gt;
&lt;br /&gt;
Number variables come with the following additional options when right clicked:&lt;br /&gt;
* &#039;&#039;&#039;Round to ...&#039;&#039;&#039;: Sets how many digits to round the variable to.&lt;br /&gt;
* &#039;&#039;&#039;Display as Hex&#039;&#039;&#039;: Toggles whether the variable is displayed as hex or decimal.&lt;br /&gt;
&lt;br /&gt;
Angle variables come with the following additional options when right clicked:&lt;br /&gt;
* &#039;&#039;&#039;Signed&#039;&#039;&#039;: Toggles whether the variable is displayed as signed or not.&lt;br /&gt;
* &#039;&#039;&#039;Units...&#039;&#039;&#039;: Sets the units for the angle variable. The unit options are:&lt;br /&gt;
** &#039;&#039;&#039;In-Game Units&#039;&#039;&#039;: These are the units that the game uses. One revolution is 65536 in-game units.&lt;br /&gt;
** &#039;&#039;&#039;HAU&#039;&#039;&#039;: Standing for hexadecimal angle units, these are in-game units divided by 16. Thus, one revolution is 4096 HAU. These are useful because angles that fall under the same HAU value use the same entry in the game&#039;s trig table, since angles are truncated to the closest multiple of 16 before accessing the table.&lt;br /&gt;
** &#039;&#039;&#039;Degrees&#039;&#039;&#039;: One revolution is 360 degrees.&lt;br /&gt;
** &#039;&#039;&#039;Radians&#039;&#039;&#039;: One revolution is 2*pi radians.&lt;br /&gt;
** &#039;&#039;&#039;Revolutions&#039;&#039;&#039;: One revolution is one revolution.&lt;br /&gt;
* &#039;&#039;&#039;Truncate to Multiple of 16&#039;&#039;&#039;: Toggles whether the angle&#039;s value is truncated to a multiple of 16. This is useful since angles that truncated to same the closest multiple of 16 use the same entry in the game&#039;s trig table.&lt;br /&gt;
* &#039;&#039;&#039;Constrain to One Revolution&#039;&#039;&#039;: Toggles whether the angle&#039;s value is constrained to one revolution. For example, an angle that&#039;s unsigned and in angle units would be constrained to the range [0, 65535], whereas an angle that&#039;s signed and in angle units would be constrained to the range [-32768, 32767].&lt;br /&gt;
* &#039;&#039;&#039;Reverse&#039;&#039;&#039;: Toggles whether the angle is displayed as the reverse of what it actually is.&lt;br /&gt;
&lt;br /&gt;
Address variables come with the following additional options when right clicked:&lt;br /&gt;
* &#039;&#039;&#039;View Address&#039;&#039;&#039;: Views the variable&#039;s value as an address in the Memory Tab.&lt;br /&gt;
&lt;br /&gt;
Object variables come with the following additional options when right clicked:&lt;br /&gt;
* &#039;&#039;&#039;Display as Object&#039;&#039;&#039;: Displays the variable&#039;s value as an Object. Values include:&lt;br /&gt;
** &#039;&#039;&#039;Slot n&#039;&#039;&#039;: The nth loaded slot.&lt;br /&gt;
** &#039;&#039;&#039;Slot VSn&#039;&#039;&#039;: The nth vacant slot.&lt;br /&gt;
** &#039;&#039;&#039;PG n&#039;&#039;&#039;: Process Group n&#039;s node.&lt;br /&gt;
** &#039;&#039;&#039;(none)&#039;&#039;&#039;: The value 0.&lt;br /&gt;
** &#039;&#039;&#039;(unused object)&#039;&#039;&#039;: The unused object slot.&lt;br /&gt;
** &#039;&#039;&#039;(unknown object)&#039;&#039;&#039;: A value that&#039;s not recognized as a valid object reference.&lt;br /&gt;
* &#039;&#039;&#039;Select Object&#039;&#039;&#039;: Selects the object slot whose object&#039;s address equals the variable&#039;s value.&lt;br /&gt;
&lt;br /&gt;
Triangle variables come with the following additional options when right clicked:&lt;br /&gt;
* &#039;&#039;&#039;Select Triangle&#039;&#039;&#039;: Selects a custom triangle in the Triangle Tab whose address equals the variable&#039;s value.&lt;br /&gt;
&lt;br /&gt;
Boolean variables are unique in that instead of having a text value, they have a checkbox value. The checkbox is checked if the underlying number value (after possibly masking) is non-zero. In the case that the variable represents multiple values with different checked states, the checkbox will be indeterminant. Boolean variables come with the following additional options when right clicked:&lt;br /&gt;
* &#039;&#039;&#039;Display as Checkbox&#039;&#039;&#039;: Toggles whether the variable is displayed as a checkbox.&lt;br /&gt;
* &#039;&#039;&#039;Display as Inverted&#039;&#039;&#039;: Toggles whether the checkbox&#039;s checked state is inverted.&lt;br /&gt;
&lt;br /&gt;
Variables can be selected by clicking on them. You can hold shift and click on a variable to select the range of variables from the previously selected variable to the currently selected variable. To toggle whether a variable is selected or not without unselecting all variable, click on the variable while holding control. To unselect all variables, click on the variable panel. If you right click on a variable that&#039;s selected, then you&#039;ll see a different set of options from normal, and these options will affect all selected variables. Options prefixed with &amp;quot;Angle:&amp;quot; only affect angles. Choosing the &amp;quot;Default&amp;quot; value for an option (e.g. Display as Hex) will set that option to how the variable was originally (e.g. its original status of whether it was displaying as hex). Here are these options:&lt;br /&gt;
* &#039;&#039;&#039;Highlight...&#039;&#039;&#039;: Highlights the variables with a red or custom-colored outline.&lt;br /&gt;
* &#039;&#039;&#039;Lock...&#039;&#039;&#039;: Locks the variables&#039; values.&lt;br /&gt;
* &#039;&#039;&#039;Fix Address...&#039;&#039;&#039;: Fixes the addresses of the variables.&lt;br /&gt;
* &#039;&#039;&#039;Copy...&#039;&#039;&#039;: Copies the variable&#039;s value (with no rounding) to the clipboard. This can be done with commas, tabs, or line breaks separating the variable values. Separately, you can copy the variable values for code, which will copy instantiation statements for each of the variables, e.g. &amp;quot;float X = 100f&amp;quot;. For more control over what the variables are named, hold control while clicking this option. This will open up a dialog where you can enter text, where the $ represents the variables&#039; original names. For example, entering &amp;quot;my$Value&amp;quot; will result in &amp;quot;float myXValue = 100f&amp;quot; being copied to the clipboard.&lt;br /&gt;
* &#039;&#039;&#039;Paste&#039;&#039;&#039;: Pastes the clipboard value to the variables. The values for the variables will be parsed from the clipboard value, which will work so long as the values are separated by whitespace (e.g. spaces, tabs, line breaks) or commas.&lt;br /&gt;
* &#039;&#039;&#039;Round to...&#039;&#039;&#039;: Sets how many digits to round the variables to.&lt;br /&gt;
* &#039;&#039;&#039;Display as Hex...&#039;&#039;&#039;: Sets whether the variables are displayed as hex or decimal.&lt;br /&gt;
* &#039;&#039;&#039;Angle: Signed...&#039;&#039;&#039;: Sets whether the variables are displayed as signed or not.&lt;br /&gt;
* &#039;&#039;&#039;Angle: Units...&#039;&#039;&#039;: Sets the units for the angle variables. See above for more information on the unit options.&lt;br /&gt;
* &#039;&#039;&#039;Angle: Truncate to Multiple of 16...&#039;&#039;&#039;: Sets whether the angles&#039; values are truncated to a multiple of 16.&lt;br /&gt;
* &#039;&#039;&#039;Angle: Constrain to One Revolution...&#039;&#039;&#039;: Sets whether the angles&#039; values are constrained to one revolution.&lt;br /&gt;
* &#039;&#039;&#039;Angle: Reverse...&#039;&#039;&#039;: Sets whether the angles are displayed as the reverse of what it actually is.&lt;br /&gt;
* &#039;&#039;&#039;Angle: Display as Hex...&#039;&#039;&#039;: Sets whether the angle variables are displayed as hex or decimal.&lt;br /&gt;
* &#039;&#039;&#039;Show Variable XML&#039;&#039;&#039;: Shows the XML that represents the variables.&lt;br /&gt;
* &#039;&#039;&#039;Show Variable Info&#039;&#039;&#039;: Shows info on the variables in table form, including Name, Type, Base + Offset, N64 Address, and Emulator Address.&lt;br /&gt;
* &#039;&#039;&#039;Background Color...&#039;&#039;&#039;: Changes the variables background color.&lt;br /&gt;
* &#039;&#039;&#039;Move...&#039;&#039;&#039;: Options for moving variables.&lt;br /&gt;
** &#039;&#039;&#039;Start Move&#039;&#039;&#039;: Adds the selected variables to the moving-variables-clipboard.&lt;br /&gt;
** &#039;&#039;&#039;End Move&#039;&#039;&#039;: Moves the variables on the moving-variables-clipboard to the location of the selected variables.&lt;br /&gt;
** &#039;&#039;&#039;Clear Move&#039;&#039;&#039;: Clears the selected-variables-clipboard.&lt;br /&gt;
* &#039;&#039;&#039;Remove&#039;&#039;&#039;: Removes the variables from the Variable Panel.&lt;br /&gt;
* &#039;&#039;&#039;Rename&#039;&#039;&#039;: Allows you to rename the variables. This will open up a dialog where you can enter text, where the $ represents the variables&#039; original names. For example, entering &amp;quot;my$Value&amp;quot; will result in renaming &amp;quot;X&amp;quot; to &amp;quot;myXValue&amp;quot;.&lt;br /&gt;
* &#039;&#039;&#039;Open Controller&#039;&#039;&#039;: Opens up an Advanced Controller for the variables.&lt;br /&gt;
* &#039;&#039;&#039;Open Triplet Controller&#039;&#039;&#039;: Opens up a Triplet Controller for the variables.&lt;br /&gt;
* &#039;&#039;&#039;Open Pop Out&#039;&#039;&#039;: Opens up a Pop Out for the variables.&lt;br /&gt;
* &#039;&#039;&#039;Add to Tab...&#039;&#039;&#039;: Adds the variables to a tab of your choosing.&lt;br /&gt;
* &#039;&#039;&#039;Add to Custom Tab&#039;&#039;&#039;: Adds the variables to the Custom Tab.&lt;br /&gt;
&lt;br /&gt;
There are also many keyboard shortcuts that can be performed on variables, namely by clicking on a variable when holding one or more keys. These are:&lt;br /&gt;
* &#039;&#039;&#039;Double Click&#039;&#039;&#039;: Opens up the Variable Viewer form for the variable, which shows the variable&#039;s Name, Type, Base + Offset, N64 Address, and Emulator Address.&lt;br /&gt;
* &#039;&#039;&#039;Click + Shift + Number&#039;&#039;&#039;: Sets the variable&#039;s background color to different colors, depending on the number.&lt;br /&gt;
* &#039;&#039;&#039;Click + Number&#039;&#039;&#039;: Sets the variable&#039;s highlight color to different colors, depending on the number.&lt;br /&gt;
* &#039;&#039;&#039;Click + S&#039;&#039;&#039;: Adds the variable to the Custom Tab.&lt;br /&gt;
* &#039;&#039;&#039;Click + T&#039;&#039;&#039;: Adds the variable to the TAS Tab.&lt;br /&gt;
* &#039;&#039;&#039;Click + M&#039;&#039;&#039;: Adds the variable to the Memory Tab.&lt;br /&gt;
* &#039;&#039;&#039;Click + P&#039;&#039;&#039;: Adds the variable to a tab of your choosing.&lt;br /&gt;
* &#039;&#039;&#039;Click + N&#039;&#039;&#039;: Views the variable&#039;s value as an address in the Memory Tab.&lt;br /&gt;
* &#039;&#039;&#039;Click + F&#039;&#039;&#039;: Fixes the address of the variable.&lt;br /&gt;
* &#039;&#039;&#039;Click + H&#039;&#039;&#039;: Highlights the variable with a red outline.&lt;br /&gt;
* &#039;&#039;&#039;Click + L&#039;&#039;&#039;: Locks the variable&#039;s value.&lt;br /&gt;
* &#039;&#039;&#039;Click + D&#039;&#039;&#039;: Toggles whether the variable is displayed as hex or decimal.&lt;br /&gt;
* &#039;&#039;&#039;Click + R&#039;&#039;&#039;: Allows you to rename the variable.&lt;br /&gt;
* &#039;&#039;&#039;Click + C&#039;&#039;&#039;: Opens up an Advanced Controller for the variable.&lt;br /&gt;
* &#039;&#039;&#039;Click + B&#039;&#039;&#039;: Opens up an Bit Controller for the variable.&lt;br /&gt;
* &#039;&#039;&#039;Click + Escape&#039;&#039;&#039;: Removes the variable from the Variable Panel.&lt;br /&gt;
* &#039;&#039;&#039;Click + Backspace&#039;&#039;&#039;: Removes the variable from the Variable Panel.&lt;br /&gt;
* &#039;&#039;&#039;Click + Delete&#039;&#039;&#039;: Removes the variable from the Variable Panel.&lt;br /&gt;
* &#039;&#039;&#039;Click + X&#039;&#039;&#039;: Does an action related to moving a variable. Specifically: If the moving-variables-clipboard is empty, then adds the variable to the moving-variables-clipboard. If the moving-variables-clipboard is non-empty, then moves the variables of the moving-variables-clipboard to the clicked variable&#039;s current location.&lt;br /&gt;
* &#039;&#039;&#039;Click + Backtick&#039;&#039;&#039;: Adds the variable to the Var Hack tab.&lt;br /&gt;
* &#039;&#039;&#039;Click + Z&#039;&#039;&#039;: Sets the variable value to zero.&lt;br /&gt;
* &#039;&#039;&#039;Click + Minus&#039;&#039;&#039;: Decrements the variable value.&lt;br /&gt;
* &#039;&#039;&#039;Click + Plus&#039;&#039;&#039;: Increments the variable value.&lt;br /&gt;
* &#039;&#039;&#039;Click + Q&#039;&#039;&#039;: Sets the variable&#039;s background color to a custom color.&lt;br /&gt;
* &#039;&#039;&#039;Click + O&#039;&#039;&#039;: Sets the variable&#039;s background color to the last custom color.&lt;br /&gt;
&lt;br /&gt;
== Controllers ==&lt;br /&gt;
&lt;br /&gt;
[[File:STROOP Controllers.png|350px|thumb|The various kinds of controllers]] &lt;br /&gt;
Controllers are a set of controls used for manipulating one or more variables. There are various kinds of controllers:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Simple Controller&#039;&#039;&#039;: A Simple Controller is in charge of manipulating one variable. It consists of 2 buttons and a textbox. The buttons are used for subtracting from and adding to the variable using the value that&#039;s in the textbox. Right clicking on one of the buttons shows the option to toggle whether the buttons are inverted, i.e. swapping whether subtraction is on the left and addition is on the right or vice versa. Simple Controllers are found on the left panel of several tabs of STROOP.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Triplet Controller&#039;&#039;&#039;: A Triplet Controller is in charge of manipulating a triplet of variables, usually a set of (x,y,z) Euler coordinates or (theta,phi,radius) spherical coordinates. It consists of 2 sets of controls:&lt;br /&gt;
** &#039;&#039;&#039;Square Controls&#039;&#039;&#039;: On the left are the Square Controls, consisting of 8 buttons and a textbox arranged in square formation. For Euler coordinates, these controls manipulate the x and z coordinates. For spherical coordinates, these controls manipulate the theta and phi coordinates. In both cases, the buttons will add to or subtract from the corresponding variable(s) by the amount in the textbox. Note that you can right click on the buttons for more options so that you can customize the orientation of the buttons. Specifically, this allows you to rotate the buttons any one of eight ways, as well as invert the orientation (i.e. flip it).&lt;br /&gt;
** &#039;&#039;&#039;Line Controls&#039;&#039;&#039;: One the right are the Line Controls, consisting of 2 buttons and a textbox arranged in a vertical line formation. For Euler coordinates, these controls manipulate the y coordinate. For spherical coordinates, these controls manipulate the radius coordinate. In both cases, the buttons will add to or subtract from the corresponding variable by the amount in the textbox. Note that you can right click on the buttons for options to invert the buttons.&lt;br /&gt;
: Triplet controllers also frequently have a Relative Checkbox in the upper right, which toggles whether the controls manipulate the variables absolutely or relative to some angle. When in relative mode, the labels on the buttons will change to emphasize this. Specifically, F = forward, B = backward, L = left, R = right, U = up, D = down. Triplet Controllers are found on the left panel of several tabs of STROOP. However, you can also create your own Triplet Controller by selecting 3 or 4 variables to represent the x,y,z and optional angle variables, right clicking, and choosing to open a Triplet Controller.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Advanced Controller&#039;&#039;&#039;: An advanced controller is in charge of manipulating one or more variables. It consists of the following controls:&lt;br /&gt;
** &#039;&#039;&#039;Name Textbox&#039;&#039;&#039;: This shows the name(s) of the variable(s) being manipulated. Note that this can be edited.&lt;br /&gt;
** &#039;&#039;&#039;Fix Address Checkbox&#039;&#039;&#039;: This is used to toggle whether the variable(s) are using fixed addresses.&lt;br /&gt;
** &#039;&#039;&#039;Value Textbox&#039;&#039;&#039;: This displays the current value(s) of the variable(s). The background color is red if the variable(s) have fixed addresses, blue if the variable(s) don&#039;t have fixed addresses, and purple if some variables do and some variables don&#039;t have fixed addresses.&lt;br /&gt;
** &#039;&#039;&#039;Lock Checkbox&#039;&#039;&#039;: This is used to toggle whether the variable(s) are locked.&lt;br /&gt;
** &#039;&#039;&#039;Subtraction Button&#039;&#039;&#039;: This is used to subtract a value from the variable(s).&lt;br /&gt;
** &#039;&#039;&#039;Addition/Subtraction Textbox&#039;&#039;&#039;: This is the value that&#039;s used by the Addition Button and Subtraction Button.&lt;br /&gt;
** &#039;&#039;&#039;Addition Button&#039;&#039;&#039;: This is used to add a value to the variable(s).&lt;br /&gt;
** &#039;&#039;&#039;Get Button&#039;&#039;&#039;: This gets the value(s) of the variable(s).&lt;br /&gt;
** &#039;&#039;&#039;Get/Set Textbox&#039;&#039;&#039;: This is the value used by the Get Button and Set Button.&lt;br /&gt;
** &#039;&#039;&#039;Set Button&#039;&#039;&#039;: This sets the value(s) of the variable(s).&lt;br /&gt;
: Additional notes:&lt;br /&gt;
:* In the case of setting multiple variables, you can set all of the variables to different values by separating the values in the textbox with commas. Alternatively, leave just one value in the textbox to set all variables to that one value. The same applies to adding and subtracting values.&lt;br /&gt;
:* The add and subtract buttons can be inverted by right clicking on them and choosing to invert.&lt;br /&gt;
:* You can click on the add/subtract button and hold the mouse down while holding control in order to continuously add to or subtract from the variables. Alternatively, right click on either button and choose to Start Continuous Add (or Subtract) and then later choose to Stop Continuous Add (or Subtract).&lt;br /&gt;
: You can create an Advanced Controller for a variable by clicking on the variable while holding C. Alternatively, you can create an Advanced Controller for multiple variables by selecting multiple variables, right clicking, and choosing to open a controller.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Bit Controller&#039;&#039;&#039;: A Bit Controller is in charge of manipulating one variable. It consists of the following controls:&lt;br /&gt;
** &#039;&#039;&#039;Name Textbox&#039;&#039;&#039;: This shows the name of the variable being manipulated. Note that this can be edited.&lt;br /&gt;
** &#039;&#039;&#039;Decimal Value&#039;&#039;&#039;: This shows the decimal value of the variable.&lt;br /&gt;
** &#039;&#039;&#039;Hex Value&#039;&#039;&#039;: This shows the hex value of the variable.&lt;br /&gt;
** &#039;&#039;&#039;Binary Value&#039;&#039;&#039;: This shows the binary value of the variable.&lt;br /&gt;
** &#039;&#039;&#039;Value Table&#039;&#039;&#039;: This shows various representations of the bytes of the variable, including the decimal representation, hex representation, and binary representation. It also provides a set of checkboxes that can be used to toggle each bit of the variable. For floats, these checkboxes are colored according to the bits&#039; role in the float, as blue represents sign, red represents exponent, and green represents mantissa.&lt;br /&gt;
: Note that for floats, you can right click on the empty space of the controller, and change what the textboxes display. Specifically, they can be set to display the sign, exponent, and mantissa values of the float. You can create a Bit Controller for a variable by clicking on the variable while holding B.&lt;br /&gt;
&lt;br /&gt;
== Object Tab ==&lt;br /&gt;
&lt;br /&gt;
== Mario Tab ==&lt;br /&gt;
&lt;br /&gt;
== HUD Tab ==&lt;br /&gt;
&lt;br /&gt;
== Camera Tab ==&lt;br /&gt;
&lt;br /&gt;
== Triangles Tab ==&lt;br /&gt;
&lt;br /&gt;
== Actions Tab ==&lt;br /&gt;
&lt;br /&gt;
== File Tab ==&lt;br /&gt;
&lt;br /&gt;
== Input Tab ==&lt;br /&gt;
&lt;br /&gt;
== Water Tab ==&lt;br /&gt;
&lt;br /&gt;
== Misc Tab ==&lt;br /&gt;
&lt;br /&gt;
== M64 Tab ==&lt;br /&gt;
&lt;br /&gt;
== Custom Tab ==&lt;br /&gt;
&lt;br /&gt;
== TAS Tab ==&lt;br /&gt;
&lt;br /&gt;
== Map Tab ==&lt;br /&gt;
&lt;br /&gt;
== Options Tab ==&lt;br /&gt;
&lt;br /&gt;
== Memory Tab ==&lt;br /&gt;
&lt;br /&gt;
== PU Tab ==&lt;br /&gt;
&lt;br /&gt;
== Area Tab ==&lt;br /&gt;
&lt;br /&gt;
== Model Tab ==&lt;br /&gt;
&lt;br /&gt;
== Gfx Tab ==&lt;br /&gt;
&lt;br /&gt;
== Debug Tab ==&lt;br /&gt;
&lt;br /&gt;
== Hacks Tab ==&lt;br /&gt;
&lt;br /&gt;
== Cam Hack Tab ==&lt;br /&gt;
&lt;br /&gt;
== Q Frames Tab ==&lt;br /&gt;
&lt;br /&gt;
== Var Hack Tab ==&lt;br /&gt;
&lt;br /&gt;
== Coin Tab ==&lt;br /&gt;
&lt;br /&gt;
== Disassembly Tab ==&lt;br /&gt;
&lt;br /&gt;
== Decompiler Tab ==&lt;br /&gt;
&lt;br /&gt;
== Scripts Tab ==&lt;br /&gt;
&lt;br /&gt;
== Testing Tab ==&lt;br /&gt;
&lt;br /&gt;
== Painting Tab ==&lt;br /&gt;
[[Category:STROOP]]&lt;br /&gt;
[[Category:Resources]]&lt;/div&gt;</summary>
		<author><name>Aurumaker72</name></author>
	</entry>
</feed>