diff --git a/README.md b/README.md index 4e1a39db6..0afee1982 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,9 @@ # STROOP *SuperMario64 Technical Run-time Observer and Object Processor* - STROOP is a overly complicated diagnostic tool for Super Mario 64 which allows for complicated mario bullsh*t and manipulation. + STROOP is a overly complicated diagnostic tool for Super Mario 64 which allows for complicated mario stuff and manipulation. - *...I'll rewrite this description later - Dane* + *(...I'll rewrite this description later - Dane)* ## Downloading Stroop @@ -28,6 +28,6 @@ The latest release of Stroop can be downloaded from our [Releases Page](https:// Requirements: * Visual Studio *(2015 recommended)* - * OpenTK 1.1 *(Version 1.1.1589.5941 used, others may work)* + * OpenTK 1.1 *(Version 1.1.1589.5942 used, others may work)* Before building Stroop, OpenTK is a prerequisite. This is easiest installed by using the NuGet package manager. Stroop can be easily build from the source code by opening up the solution file in Visual Studio and performing a build. diff --git a/Source/SM64 Diagnostic/Config/CameraData.xml b/Source/SM64 Diagnostic/Config/CameraData.xml index eaa88b946..d6dc1fee3 100644 --- a/Source/SM64 Diagnostic/Config/CameraData.xml +++ b/Source/SM64 Diagnostic/Config/CameraData.xml @@ -26,4 +26,5 @@ Pitch Shake Roll Shake Camera Mode + Secondary Object \ No newline at end of file diff --git a/Source/SM64 Diagnostic/Config/Config.xml b/Source/SM64 Diagnostic/Config/Config.xml index 0118088e4..26362d837 100644 --- a/Source/SM64 Diagnostic/Config/Config.xml +++ b/Source/SM64 Diagnostic/Config/Config.xml @@ -1,9 +1,11 @@  - 60 - 0x008eba80 - Mupen - 0x400000 + + + + + 30 + 0x400000 0x8033D488 0x0260 @@ -32,22 +34,23 @@ 0x8033CBE0 0x68 - - - - - - - - - - + + + + + + + + + + - 0x80361150 + 0x80361150 - 0x8033b170 + 0x8033B170 0x0C + 0x10 0x3C 0x40 0x44 @@ -67,23 +70,26 @@ 0x58 0x5C 0xBC + 0x80361158 - 0x8033b21e - 0x8033b21c - 0x8033b218 - 0x8033b21a - 0x8033b260 - 0x8033b262 - 0x8033b268 + 0x8033B21e + 0x8033B21D + 0x8033B218 + 0x8033B21A + 0x8033B266 + 0x8033B260 + 0x8033B262 + 0x8033B264 2176 + 8 4 0 120 - 0x8033d263 - 0x80330e94 + 0x8033D263 + 0x80330E94 0x00 @@ -110,16 +116,16 @@ 0x8033B3C8 0x8033B3CC 0x8033B3D0 - 0x8033c6a4 - 0x8033c6a8 - 0x8033c6aC - 0x8033c6e4 + 0x8033C6A4 + 0x8033C6A8 + 0x8033C6AC + 0x8033C6E4 0x8033B249 0x8033B24A 0x8033BACA 0x8033BAC8 0x8038EEE0 - 0x803e0000 + 0x803E0000 \ No newline at end of file diff --git a/Source/SM64 Diagnostic/Config/Hacks.xml b/Source/SM64 Diagnostic/Config/Hacks.xml index 869d53935..bb27380b7 100644 --- a/Source/SM64 Diagnostic/Config/Hacks.xml +++ b/Source/SM64 Diagnostic/Config/Hacks.xml @@ -3,6 +3,7 @@ Resources\Hacks\ + \ No newline at end of file diff --git a/Source/SM64 Diagnostic/Config/MarioActions.xml b/Source/SM64 Diagnostic/Config/MarioActions.xml new file mode 100644 index 000000000..a42f828d1 --- /dev/null +++ b/Source/SM64 Diagnostic/Config/MarioActions.xml @@ -0,0 +1,228 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Source/SM64 Diagnostic/Config/MarioData.xml b/Source/SM64 Diagnostic/Config/MarioData.xml index d4c743671..aa48e718b 100644 --- a/Source/SM64 Diagnostic/Config/MarioData.xml +++ b/Source/SM64 Diagnostic/Config/MarioData.xml @@ -11,13 +11,16 @@ X Sliding Speed Z Sliding Speed H Sliding Speed + Sliding Angle Yaw (Facing) Yaw (Moving) Yaw (Intended) - Pitch - Roll - Yaw Velocity - Flying Pull Back + Pitch + Roll + Yaw Velocity + Flying Pull Back + First Person Yaw + First Person Pitch Interaction Object Using Object Stood On Object @@ -32,14 +35,22 @@ Metal Cap Vanish Cap Cap Timer - Action - Action Phase - Action Timer + Action + Action Description + Previous Action + Prev. Action Desc. + Action Phase + Action Timer Animation Timer - Squished Timer Hitstun Timer Peak Height Fall Height + Unsquishing Timer + Squished Timer + Splash + Bubble Spawner + Stationary Water Wave Blinking State Blinking Timer + Mario Object \ No newline at end of file diff --git a/Source/SM64 Diagnostic/Config/MiscData.xml b/Source/SM64 Diagnostic/Config/MiscData.xml index b1d2382b0..effdfe018 100644 --- a/Source/SM64 Diagnostic/Config/MiscData.xml +++ b/Source/SM64 Diagnostic/Config/MiscData.xml @@ -1,22 +1,24 @@  - Global Timer + Global Timer RNG Value RNG Index RNG Calls/Frame - Num. Loaded Objs. + Num Loaded Objs Coin Counter Red Coin Count Mission Selected Mission Layout Mission Name - Special Triple Jump - Talked to Yoshi + Star Collected Music On Volume Level Area Loading Point + Special Triple Jump + Talked to Yoshi + Never Entered Castle Current File Demo Counter Demo Timer diff --git a/Source/SM64 Diagnostic/Config/ObjectAssociations.xml b/Source/SM64 Diagnostic/Config/ObjectAssociations.xml index af9a9b5dc..8d228e150 100644 --- a/Source/SM64 Diagnostic/Config/ObjectAssociations.xml +++ b/Source/SM64 Diagnostic/Config/ObjectAssociations.xml @@ -54,16 +54,18 @@ + - + + - - Host Object + + Host Object Blinking Timer @@ -86,36 +88,39 @@ - + + - + Color Identity - + Color Identity - + Color Identity - + Color Identity + - + Grabbed + Phase HP Num A Presses @@ -154,6 +159,7 @@ + @@ -163,11 +169,13 @@ + - + Grabbed Tangible - Stopping Timer + Phase + Stopping Throwing Phase Num A Presses @@ -176,19 +184,20 @@ - + - + - + + - + @@ -204,21 +213,23 @@ - + - + + - + Grabbed - + + Destination @@ -228,7 +239,7 @@ - + Destination @@ -244,14 +255,16 @@ + - Mission + Mission - Mission + Mission + Mission @@ -260,11 +273,13 @@ Mission + + - Host Object + Host Object @@ -359,6 +374,7 @@ + Collectable Value @@ -394,13 +410,22 @@ Countdown + Countdown + + + Collectable + Value + Disappear Bhvr + Spin Timer + + @@ -410,34 +435,110 @@ + + - - + + + Destination + + + + + Destination + + + + + Destination + + + + + Destination + + + + + Destination + + + + + Destination + + + + + Destination + + + + + Destination + + + + Destination - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + Timer Max + - + Timer Max V Speed Height @@ -445,12 +546,15 @@ - + Timer Max V Speed Height Min Height + + + @@ -476,7 +580,16 @@ - + + + Appearance + + + + Appearance + + + Appearance @@ -488,6 +601,9 @@ + + + @@ -526,75 +642,83 @@ - + - + + - + Steals Hat Grabbed Wearing Hat + - + Steals Hat Grabbed Wearing Hat - Ukiki Target Object + Ukiki Target Object - Host Object + Host Object - + - + Oscillation Timer - + Oscillation Timer - Host Object + Host Object - Oscillation Timer + Oscillation Timer + - + + Appearance - - + + + - - + + + + Appearance + Opaqueness @@ -602,6 +726,7 @@ + @@ -614,8 +739,9 @@ + - + Knockback @@ -642,7 +768,7 @@ - + @@ -652,54 +778,60 @@ - + - + - + - + - + Tangible - + Tangible + - + Num Coins + - + + - + + + + - + Grabbed - Host Object + Host Object @@ -708,11 +840,13 @@ + + - + @@ -721,9 +855,11 @@ + - + Grabbed + Phase HP Blinking State Blinking Timer @@ -731,8 +867,9 @@ - + Grabbed + Phase HP Blinking State Blinking Timer @@ -740,8 +877,9 @@ - + Grabbed + Phase HP Blinking State Blinking Timer @@ -765,31 +903,43 @@ Appearance - + Appearance - - + + + Appearance + + + + + Appearance - + + + + + Appearance + Appearance - + + Appearance - + Appearance - + @@ -828,27 +978,27 @@ - + - + - + Phase - + - + - + Oscillation Timer @@ -860,25 +1010,26 @@ - + - + Oscillation Timer - + Oscillation Timer - + + - + Being Ridden @@ -886,98 +1037,116 @@ - + Phase + - + Lullaby Music Num Coins - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + State 2 + - + + Phase Talking Phase + + + + Fake + Grabbed + Returning + + - + Fake Grabbed Returning - + + Fake + Grabbed + Returning + + + + Fake Grabbed Returning @@ -1080,148 +1249,164 @@ - + - + - + - + - + - + - + Bub Loaded + - + + - + Appearance Contents Opening + - + Appearance Contents Opening + - + Appearance Contents Opening + - + Appearance Contents Opening + - + Appearance Contents Opening + - + Appearance Contents Opening + - + Appearance Contents Opening + - + Appearance Contents Opening + - + Appearance Contents Opening + - + Appearance Contents Opening + - + Appearance Contents Opening + - + Appearance Contents Opening + - + Appearance Contents Opening + - + Appearance Contents Opening + - + Appearance Contents Opening - + Appearance Contents Opening @@ -1234,18 +1419,19 @@ - + - + + - + Rev Angle @@ -1253,15 +1439,15 @@ - Host Object + Host Object - Oscillation Timer + Oscillation Timer - Oscillation Timer + Oscillation Timer @@ -1289,22 +1475,33 @@ - + Spin Timer - + - - + + + + + + + + + Opening + + + Opening + - + Water Level @@ -1324,62 +1521,65 @@ - + Opaqueness - Oscillation + Oscillation Timer - + Target Opaqueness Opaqueness - Oscillation + Oscillation Timer - + HP Target Opaqueness Opaqueness - Oscillation + Oscillation Timer - + HP Target Opaqueness Opaqueness - Oscillation + Oscillation Timer - + HP Target Opaqueness Opaqueness - Oscillation + Oscillation Timer + + + - + Target Opaqueness Opaqueness - Oscillation - + Oscillation Timer - + Target Opaqueness Opaqueness - Oscillation + Oscillation Timer + - + Target Opaqueness Opaqueness - Oscillation + Oscillation Timer @@ -1389,7 +1589,7 @@ - + @@ -1397,11 +1597,11 @@ - + - + Rotating @@ -1420,12 +1620,42 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -1433,7 +1663,7 @@ - + Num Coins Target Angle Lunging @@ -1445,18 +1675,22 @@ Scuttlebug Loaded + - + + Phase HP Falling + - + Num Coins Falling + @@ -1468,7 +1702,7 @@ - + @@ -1483,7 +1717,7 @@ - + @@ -1494,29 +1728,32 @@ - State 2 + Phase Blowing Angle + - + - + Animation Animation Timer Walking Timer Burn Timer Cannon Yaw + Pole Height Relative Height + - + Text State 2 Talking Phase @@ -1579,9 +1816,11 @@ + + @@ -1597,8 +1836,9 @@ + - + Can Move Has Coin Grabbed @@ -1611,22 +1851,24 @@ + - + Blinking Blinking Timer - + Blinking Blinking Timer - + + Occupied @@ -1634,8 +1876,9 @@ + - + Text Mario Reading @@ -1646,28 +1889,28 @@ - + Height Timer Base Height Lunging Electricity + - + Rev Angle Height Timer Radius Electricity - Object Hit - + - + State 2 Flying @@ -1678,6 +1921,7 @@ + @@ -1694,36 +1938,49 @@ - + - + - + + - + + Next Ring Index + Last Ring Collected + Num Rings Collected Make Rings - Rings Collected + Ring Index Opaqueness + Collected + Ring Index Opaqueness + Collected + + + + Next Ring Index + Last Ring Collected + - + @@ -1746,9 +2003,12 @@ + + + - - + + @@ -1761,7 +2021,7 @@ - + Jumping Phase @@ -1776,6 +2036,7 @@ + @@ -1792,7 +2053,7 @@ - + Rolling Timer @@ -1806,7 +2067,7 @@ - + Breaking Num Activators Angular Acceleration? @@ -1856,17 +2117,21 @@ + Bouncing State + + Bouncing State + Bouncing State @@ -1892,6 +2157,7 @@ Spawn Star + Spin Timer @@ -1908,31 +2174,35 @@ - + - + + + + + Activators Needed Activators Collected @@ -1941,6 +2211,7 @@ + @@ -1951,15 +2222,16 @@ - + - + + - + Grabbed Static Angle Active Hurtbox @@ -1974,12 +2246,14 @@ + Floating Oscillation Timer + Floating @@ -1991,57 +2265,71 @@ - + + Value + Value + Value + Value + Value + Value + Value + Value + Value + Value + - + + Num Rings Collected Make Rings - Rings Collected + + + @@ -2062,29 +2350,31 @@ - - Open + + Used - + - + Second Occurrence Grabbed + - + Target Location Blinking Blinking Timer + - + Act Shelled Target Angle Countdown @@ -2092,24 +2382,27 @@ Blinking Countdown + - + Waypoint Target Angle Blinking Blinking Countdown + - + Waypoint Target Angle Blinking Blinking Countdown + - + Act Shelled Target Angle Countdown @@ -2117,7 +2410,14 @@ Blinking Countdown + + Result + State 2 + Race Started + Race Finished + KtQ Finished + Used Cannon @@ -2129,32 +2429,33 @@ - + Blinking Blinking Countdown - + Blinking Blinking Countdown - + Target Angle Wing Flap + - + Can Shoot Fire Scale Change Scale - + Target Angle Countdown Blinking @@ -2162,89 +2463,100 @@ - + Target Angle Countdown + Chase Extension Blinking Blinking Countdown - + Target Angle Countdown + Chase Extension Blinking Blinking Countdown - + Target Angle Countdown + Chase Extension Blinking Blinking Countdown - + Target Angle Countdown + Chase Extension Blinking Blinking Countdown - + Target Angle Countdown + Chase Extension Blinking Blinking Countdown - + Target Angle Countdown + Chase Extension Blinking Blinking Countdown - + Target Angle Countdown + Chase Extension Blinking Blinking Countdown - + Target Angle Countdown + Chase Extension Blinking Blinking Countdown - + Target Angle Countdown + Chase Extension Blinking Blinking Countdown - + Target Angle Countdown + Chase Extension Blinking Blinking Countdown - + Target Angle Countdown + Chase Extension Blinking Blinking Countdown @@ -2270,8 +2582,9 @@ Goomba 3 Dead + - + Lunging Phase Num Bounces @@ -2283,8 +2596,9 @@ + - + Num Coins Angular Distance Lowered Distance @@ -2295,16 +2609,16 @@ - + HP - + - + Countdown Spiny Count Throwing Phase @@ -2334,13 +2648,14 @@ - + Countdown + @@ -2366,44 +2681,53 @@ - + Rotational Speed - + Rotational Speed - + Rotational Speed - + Rotational Speed - + Rotational Speed - + Rotational Speed - + Rotational Speed - - + + + + + - + + + + + + + @@ -2411,6 +2735,7 @@ Countdown + On Ground Num Bounces @@ -2425,7 +2750,7 @@ - + Timer Max @@ -2444,20 +2769,20 @@ - + Timer Max Countdown - + Target Ang Vel Current Ang Vel Angle - + Target Ang Vel Current Ang Vel Angle @@ -2479,7 +2804,7 @@ - + Timer Max Target Angle Angle @@ -2488,7 +2813,7 @@ - + Timer Max Target Angle Angle @@ -2503,7 +2828,7 @@ - + Wearing Hat Num Coins Dizziness Change @@ -2555,11 +2880,12 @@ - + Speed Countdown + Mario Inside Angular Velocity @@ -2572,8 +2898,9 @@ + - + Star on Tail Saw Mario Phase @@ -2582,15 +2909,16 @@ + - + - + @@ -2609,7 +2937,7 @@ - + Max Scale Num Coins Spin when Hit @@ -2617,7 +2945,7 @@ - + Max Scale Num Coins Spin when Hit @@ -2630,6 +2958,7 @@ Lifespan Timer + Scale Spitting Fire @@ -2649,7 +2978,7 @@ - + @@ -2665,17 +2994,22 @@ - + Appearance Target Location - + + + + + - + + - + Mario Cheated Mario Finished First Effort @@ -2695,12 +3029,14 @@ Can Move + - + + - + Target Angle Lunging @@ -2751,17 +3087,32 @@ - + - + + + + Activation Type + + + Activation Type + + + + Activation Type + + + + Activation Type + - + Mouth Open Lunging Countdown @@ -2772,7 +3123,7 @@ - + Opaqueness @@ -2781,6 +3132,9 @@ + + + diff --git a/Source/SM64 Diagnostic/Config/ObjectData.xml b/Source/SM64 Diagnostic/Config/ObjectData.xml index 9177bf69a..21e4a5ae1 100644 --- a/Source/SM64 Diagnostic/Config/ObjectData.xml +++ b/Source/SM64 Diagnostic/Config/ObjectData.xml @@ -16,21 +16,25 @@ Yaw (Rot Speed) Pitch (Rot Speed) Roll (Rot Speed) - Dist to Mario - Act. Dist to Mario - Lat. Dist to Mario - Angle to Mario - Act. Angle To Mario - Delta Angle To Mario - Mario Angle To Object - Delta Mario Angle To Object + "Dist to Mario" + Dist Mario to Obj + LDist Mario to Obj + Dist Mario to Home + LDist Mario to Home + Dist Obj to Home + LDist Obj to Home + "Angle to Mario" + Angle Obj to Mario + DAngle Obj to Mario + Angle Mario to Obj + DAngle Mario to Obj Drawing Dist RNG Calls/Frame Parent Object Behavior Script Graphic/Model Visible - Visible 2 + Rendered Face Camera Mario Close Animation @@ -41,12 +45,8 @@ Home X Home Y Home Z - Mario Dist to Home - Mario Lat. Dist to Home - Dist to Home - Lat. Dist to Home Release Status - Interaction Status + Interaction Status Subtype State Timer diff --git a/Source/SM64 Diagnostic/Config/TrianglesData.xml b/Source/SM64 Diagnostic/Config/TrianglesData.xml index 00e3c1640..487aedcbf 100644 --- a/Source/SM64 Diagnostic/Config/TrianglesData.xml +++ b/Source/SM64 Diagnostic/Config/TrianglesData.xml @@ -18,33 +18,32 @@ X3 Y3 Z3 - Normal X - Normal Y - Normal Z - Normal Offset - Associated Object - Uphill Angle - Downhill Angle - Right Hill Angle - Left Hill Angle - Steepness Mario X Mario Y Mario Z - Closest Vertex - Closest Vertex X - Closest Vertex Y - Closest Vertex Z + Closest Vertex + Closest Vertex X + Closest Vertex Y + Closest Vertex Z + Steepness + Uphill Angle + Downhill Angle + Left Hill Angle + Right Hill Angle M. Yaw (Intended) M. Yaw (Facing) - Floor Triangle - Wall Triangle - Ceiling Triangle - Floor Height - Height On Slope - Ceiling Height - Dist Below Ceiling - Dist Above Floor - Normal Dist Away - Vertical Dist Away + Normal X + Normal Y + Normal Z + Normal Offset + Associated Object Floor Triangle + Wall Triangle + Ceiling Triangle + Floor Height + Ceiling Height + Dist Above Floor + Dist Below Ceiling + Normal Dist Away + Vertical Dist Away + Height On Slope \ No newline at end of file diff --git a/Source/SM64 Diagnostic/Controls/Map/MapGraphics.cs b/Source/SM64 Diagnostic/Controls/Map/MapGraphics.cs index d9b7f63cd..b30e4ae97 100644 --- a/Source/SM64 Diagnostic/Controls/Map/MapGraphics.cs +++ b/Source/SM64 Diagnostic/Controls/Map/MapGraphics.cs @@ -206,7 +206,7 @@ public void DrawTexture(int texId, PointF loc, SizeF size, float angle = 0) // Start drawing texture GL.BindTexture(TextureTarget.Texture2D, texId); - GL.Begin(BeginMode.Quads); + GL.Begin(PrimitiveType.Quads); // Set drawing coordinates GL.TexCoord2(0.0f, 1.0f); GL.Vertex2(-size.Width / 2, size.Height / 2); diff --git a/Source/SM64 Diagnostic/Controls/ObjectSlot.cs b/Source/SM64 Diagnostic/Controls/ObjectSlot.cs index 8070bae82..e9c2b6ec5 100644 --- a/Source/SM64 Diagnostic/Controls/ObjectSlot.cs +++ b/Source/SM64 Diagnostic/Controls/ObjectSlot.cs @@ -22,7 +22,8 @@ public class ObjectSlot : Panel ObjectSlotManagerGui _gui; Color _mainColor, _borderColor, _backColor; - Brush _borderBrush = new SolidBrush(Color.White), _backBrush = new SolidBrush(Color.White); + SolidBrush _borderBrush = new SolidBrush(Color.White), _backBrush = new SolidBrush(Color.White); + SolidBrush _textBrush = new SolidBrush(Color.Black); Image _objectImage; string _text; @@ -36,7 +37,7 @@ public class ObjectSlot : Panel public enum MouseStateType {None, Over, Down}; public MouseStateType MouseState; - public bool Selected + public bool SelectedOnMap { get { @@ -88,6 +89,26 @@ public Image ObjectImage return _objectImage; } } + + public Color TextColor + { + get + { + return _textBrush.Color; + } + set + { + if (_textBrush.Color == value) + return; + + lock (_gfxLock) + { + _textBrush.Color = value; + } + Invalidate(); + } + } + public new string Text { get @@ -302,8 +323,8 @@ void UpdateColors() { lock (_gfxLock) { - (_borderBrush as SolidBrush).Color = _borderColor; - (_backBrush as SolidBrush).Color = _backColor; + _borderBrush.Color = _borderColor; + _backBrush.Color = _backColor; } } @@ -339,7 +360,7 @@ protected override void OnPaint(PaintEventArgs e) // Draw Text var textSize = e.Graphics.MeasureString(Text, Font); var textLocation = new PointF((Width - textSize.Width) / 2, Height - textSize.Height); - e.Graphics.DrawString(Text, Font, Brushes.Black, textLocation); + e.Graphics.DrawString(Text, Font, _textBrush, textLocation); // Draw Object Image if (_objectImage != null) diff --git a/Source/SM64 Diagnostic/Controls/WatchVariableControl.cs b/Source/SM64 Diagnostic/Controls/WatchVariableControl.cs index c3c3b0039..2178ae23e 100644 --- a/Source/SM64 Diagnostic/Controls/WatchVariableControl.cs +++ b/Source/SM64 Diagnostic/Controls/WatchVariableControl.cs @@ -221,6 +221,28 @@ private void ShowLockedImage(bool show, bool transparent = false) _nameLabel.Image = nextImage; } + public bool EditMode + { + get + { + return _editMode; + } + set + { + _editMode = value; + if (_textBoxValue != null) + { + _textBoxValue.ReadOnly = !_editMode; + _textBoxValue.BackColor = _editMode ? Color.White : Color == Color.Transparent ? SystemColors.Control : Color; + if (_editMode) + { + _textBoxValue.Focus(); + _textBoxValue.SelectAll(); + } + } + } + } + public WatchVariableControl(ProcessStream stream, WatchVariable watchVar, uint otherOffset = 0) : this(stream, watchVar, new List() { otherOffset }) { @@ -291,7 +313,7 @@ private void CreateControls() this._textBoxValue.KeyDown += OnTextValueKeyDown; this._textBoxValue.MouseEnter += _textBoxValue_MouseEnter; this._textBoxValue.DoubleClick += _textBoxValue_DoubleClick; - this._textBoxValue.Leave += (sender, e) => { _editMode = false; this._textBoxValue.ReadOnly = true; }; + this._textBoxValue.Leave += (sender, e) => { EditMode = false; }; if (_watchVar.IsAngle) { WatchVariableControl.AngleMenu.ItemClicked += OnMenuStripClick; @@ -344,10 +366,7 @@ private void _nameLabel_Click(object sender, EventArgs e) private void _textBoxValue_DoubleClick(object sender, EventArgs e) { - _textBoxValue.ReadOnly = false; - _textBoxValue.Focus(); - _textBoxValue.SelectAll(); - _editMode = true; + EditMode = true; } private void _textBoxValue_MouseEnter(object sender, EventArgs e) @@ -506,26 +525,19 @@ private void OnMenuStripClick(object sender, ToolStripItemClickedEventArgs e) switch (e.ClickedItem.Text) { case "Edit": - _textBoxValue.ReadOnly = false; - _textBoxValue.Focus(); - _editMode = true; + EditMode = true; break; case "View As Hexadecimal": _watchVar.UseHex = !(e.ClickedItem as ToolStripMenuItem).Checked; (e.ClickedItem as ToolStripMenuItem).Checked = !(e.ClickedItem as ToolStripMenuItem).Checked; break; case "Lock Value": - _textBoxValue.ReadOnly = true; - _editMode = false; + EditMode = false; (e.ClickedItem as ToolStripMenuItem).Checked = !(e.ClickedItem as ToolStripMenuItem).Checked; if (OtherOffsets.Any(o => GetIsLocked(o))) - { OtherOffsets.ForEach(o => RemoveLock(o)); - } else - { OtherOffsets.ForEach(o => LockUpdate(o)); - } break; case "Select Object": if (_watchVar.ByteCount != 4) @@ -545,13 +557,19 @@ private void OnMenuStripClick(object sender, ToolStripItemClickedEventArgs e) private void OnTextValueKeyDown(object sender, KeyEventArgs e) { + if (e.KeyData == Keys.Escape) + { + // Exit edit mode + EditMode = false; + return; + } + // On "Enter" key press if (e.KeyData != Keys.Enter) return; // Exit edit mode - _textBoxValue.ReadOnly = true; - _editMode = false; + EditMode = false; _stream.Suspend(); diff --git a/Source/SM64 Diagnostic/Extensions/ProcessStreamExtensions.cs b/Source/SM64 Diagnostic/Extensions/ProcessStreamExtensions.cs deleted file mode 100644 index ab38ad3f9..000000000 --- a/Source/SM64 Diagnostic/Extensions/ProcessStreamExtensions.cs +++ /dev/null @@ -1,47 +0,0 @@ -using SM64_Diagnostic.Utilities; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace SM64_Diagnostic.Extensions -{ - public static class ProcessStreamExtensions - { - public static byte GetByte(this ProcessStream stream, uint address, bool absoluteAddress = false) - { - return stream.ReadRam(address, 1, absoluteAddress)[0]; - } - - public static sbyte GetSByte(this ProcessStream stream, uint address, bool absoluteAddress = false) - { - return (sbyte)stream.ReadRam(address, 1, absoluteAddress)[0]; - } - - public static short GetInt16(this ProcessStream stream, uint address, bool absoluteAddress = false) - { - return BitConverter.ToInt16(stream.ReadRam(address, 2, absoluteAddress), 0); - } - - public static ushort GetUInt16(this ProcessStream stream, uint address, bool absoluteAddress = false) - { - return BitConverter.ToUInt16(stream.ReadRam(address, 2, absoluteAddress), 0); - } - - public static int GetInt32(this ProcessStream stream, uint address, bool absoluteAddress = false) - { - return BitConverter.ToInt32(stream.ReadRam(address, 4, absoluteAddress), 0); - } - - public static uint GetUInt32(this ProcessStream stream, uint address, bool absoluteAddress = false) - { - return BitConverter.ToUInt32(stream.ReadRam(address, 4, absoluteAddress), 0); - } - - public static float GetSingle(this ProcessStream stream, uint address, bool absoluteAddress = false) - { - return BitConverter.ToSingle(stream.ReadRam(address, 4, absoluteAddress), 0); - } - } -} diff --git a/Source/SM64 Diagnostic/Extensions/WatchVariableExtensions.cs b/Source/SM64 Diagnostic/Extensions/WatchVariableExtensions.cs index 6312916ea..087804db0 100644 --- a/Source/SM64 Diagnostic/Extensions/WatchVariableExtensions.cs +++ b/Source/SM64 Diagnostic/Extensions/WatchVariableExtensions.cs @@ -20,7 +20,7 @@ public static uint GetRamAddress(this WatchVariable watchVar, ProcessStream stre uint address; if (watchVar.AbsoluteAddressing) - address = LittleEndianessAddressing.AddressFix((uint)(offsetedAddress - stream.ProcessMemoryOffset), + address = stream.ConvertAddressEndianess((uint)(offsetedAddress - stream.ProcessMemoryOffset), watchVar.ByteCount); else address = offsetedAddress; @@ -31,14 +31,14 @@ public static uint GetRamAddress(this WatchVariable watchVar, ProcessStream stre public static uint GetProcessAddress(this WatchVariable watchVar, ProcessStream stream, uint offset = 0) { uint address = GetRamAddress(watchVar, stream, offset, false); - return (uint)LittleEndianessAddressing.AddressFix( + return (uint)stream.ConvertAddressEndianess( (int)(address + stream.ProcessMemoryOffset), watchVar.ByteCount); } public static byte[] GetByteData(this WatchVariable watchVar, ProcessStream stream, uint offset) { // Get dataBytes - var dataBytes = stream.ReadRam(watchVar.OtherOffset ? offset + watchVar.Address + var dataBytes = stream.ReadRamLittleEndian(watchVar.OtherOffset ? offset + watchVar.Address : watchVar.Address, watchVar.ByteCount, watchVar.AbsoluteAddressing); // Make sure offset is a valid pointer @@ -165,7 +165,7 @@ public static bool SetAngleStringValue(this WatchVariable watchVar, ProcessStrea public static string GetAngleStringValue(this WatchVariable watchVar, ProcessStream stream, uint offset, WatchVariableControl.AngleViewModeType viewMode, bool truncated = false) { // Get dataBytes - var dataBytes = stream.ReadRam(watchVar.OtherOffset ? offset + watchVar.Address + var dataBytes = stream.ReadRamLittleEndian(watchVar.OtherOffset ? offset + watchVar.Address : watchVar.Address, watchVar.ByteCount, watchVar.AbsoluteAddressing); // Make sure offset is a valid pointer @@ -229,7 +229,7 @@ public static string GetAngleStringValue(this WatchVariable watchVar, ProcessStr public static bool GetBoolValue(this WatchVariable watchVar, ProcessStream stream, uint offset) { // Get dataBytes - var dataBytes = stream.ReadRam(watchVar.OtherOffset ? offset + watchVar.Address + var dataBytes = stream.ReadRamLittleEndian(watchVar.OtherOffset ? offset + watchVar.Address : watchVar.Address, watchVar.ByteCount, watchVar.AbsoluteAddressing); // Get Uint64 value @@ -252,7 +252,7 @@ public static void SetBoolValue(this WatchVariable watchVar, ProcessStream strea { // Get dataBytes var address = watchVar.OtherOffset ? offset + watchVar.Address : watchVar.Address; - var dataBytes = stream.ReadRam(address, watchVar.ByteCount, watchVar.AbsoluteAddressing); + var dataBytes = stream.ReadRamLittleEndian(address, watchVar.ByteCount, watchVar.AbsoluteAddressing); if (watchVar.InvertBool) value = !value; @@ -279,7 +279,7 @@ public static void SetBoolValue(this WatchVariable watchVar, ProcessStream strea var valueBytes = BitConverter.GetBytes(dataValue); Array.Copy(valueBytes, 0, writeBytes, 0, watchVar.ByteCount); - stream.WriteRam(writeBytes, address, watchVar.AbsoluteAddressing); + stream.WriteRamLittleEndian(writeBytes, address, watchVar.AbsoluteAddressing); } public static byte[] GetBytesFromString(this WatchVariable watchVar, ProcessStream stream, uint offset, string value) @@ -287,7 +287,7 @@ public static byte[] GetBytesFromString(this WatchVariable watchVar, ProcessStre // Get dataBytes var address = watchVar.OtherOffset ? offset + watchVar.Address : watchVar.Address; var dataBytes = new byte[8]; - stream.ReadRam(address, watchVar.ByteCount, watchVar.AbsoluteAddressing).CopyTo(dataBytes, 0); + stream.ReadRamLittleEndian(address, watchVar.ByteCount, watchVar.AbsoluteAddressing).CopyTo(dataBytes, 0); UInt64 oldValue = BitConverter.ToUInt64(dataBytes, 0); UInt64 newValue; @@ -365,7 +365,7 @@ public static bool SetBytes(this WatchVariable watchVar, ProcessStream stream, u if (dataBytes == null) return false; - return stream.WriteRam(dataBytes, watchVar.OtherOffset ? offset + watchVar.Address + return stream.WriteRamLittleEndian(dataBytes, watchVar.OtherOffset ? offset + watchVar.Address : watchVar.Address, watchVar.AbsoluteAddressing); } } diff --git a/Source/SM64 Diagnostic/LoadingForm.Designer.cs b/Source/SM64 Diagnostic/LoadingForm.Designer.cs index 6f9805560..c5d7d885e 100644 --- a/Source/SM64 Diagnostic/LoadingForm.Designer.cs +++ b/Source/SM64 Diagnostic/LoadingForm.Designer.cs @@ -57,7 +57,7 @@ private void InitializeComponent() this.labelLoading.Name = "labelLoading"; this.labelLoading.Size = new System.Drawing.Size(641, 77); this.labelLoading.TabIndex = 1; - this.labelLoading.Text = "Loading Stroop"; + this.labelLoading.Text = "Loading STROOP"; this.labelLoading.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; // // labelLoadingStatus diff --git a/Source/SM64 Diagnostic/LoadingHandler.cs b/Source/SM64 Diagnostic/LoadingHandler.cs index 57f2d4237..832e4fc69 100644 --- a/Source/SM64 Diagnostic/LoadingHandler.cs +++ b/Source/SM64 Diagnostic/LoadingHandler.cs @@ -30,7 +30,7 @@ static public void ShowLoadingForm() static private void ShowForm() { - LoadingForm = new LoadingForm(11); + LoadingForm = new LoadingForm(12); Application.Run(LoadingForm); } diff --git a/Source/SM64 Diagnostic/Managers/CameraManager.cs b/Source/SM64 Diagnostic/Managers/CameraManager.cs index 571b7d2c1..1b28a146a 100644 --- a/Source/SM64 Diagnostic/Managers/CameraManager.cs +++ b/Source/SM64 Diagnostic/Managers/CameraManager.cs @@ -7,6 +7,7 @@ using System.Windows.Forms; using SM64_Diagnostic.Utilities; using SM64_Diagnostic.Controls; +using SM64_Diagnostic.Extensions; namespace SM64_Diagnostic.Managers { @@ -16,5 +17,46 @@ public CameraManager(ProcessStream stream, List cameraData, NoTea : base(stream, cameraData, variableTable) { } + + protected override void InitializeSpecialVariables() + { + _specialWatchVars = new List() + { + new DataContainer("DistanceToMario"), + }; + } + + public void ProcessSpecialVars() + { + float mX, mY, mZ; + mX = _stream.GetSingle(Config.Mario.StructAddress + Config.Mario.XOffset); + mY = _stream.GetSingle(Config.Mario.StructAddress + Config.Mario.YOffset); + mZ = _stream.GetSingle(Config.Mario.StructAddress + Config.Mario.ZOffset); + + float cameraX, cameraY, cameraZ; + cameraX = _stream.GetSingle(Config.CameraX); + cameraY = _stream.GetSingle(Config.CameraY); + cameraZ = _stream.GetSingle(Config.CameraZ); + + foreach (var specialVar in _specialWatchVars) + { + switch (specialVar.SpecialName) + { + case "DistanceToMario": + (specialVar as DataContainer).Text = Math.Round(MoreMath.DistanceTo(cameraX, cameraY, cameraZ, mX, mY, mZ),3).ToString(); + break; + } + } + } + public override void Update(bool updateView) + { + ProcessSpecialVars(); + + // We are done if we don't need to update the Mario Manager view + if (!updateView) + return; + + base.Update(); + } } } diff --git a/Source/SM64 Diagnostic/Managers/DataManager.cs b/Source/SM64 Diagnostic/Managers/DataManager.cs index 531b53bb6..c13b8f4f3 100644 --- a/Source/SM64 Diagnostic/Managers/DataManager.cs +++ b/Source/SM64 Diagnostic/Managers/DataManager.cs @@ -10,7 +10,7 @@ namespace SM64_Diagnostic.Managers { - public class DataManager + public abstract class DataManager { protected List _dataControls; protected NoTearFlowLayoutPanel _variableTable; diff --git a/Source/SM64 Diagnostic/Managers/DebugManager.cs b/Source/SM64 Diagnostic/Managers/DebugManager.cs index c89c4729a..c944ff686 100644 --- a/Source/SM64 Diagnostic/Managers/DebugManager.cs +++ b/Source/SM64 Diagnostic/Managers/DebugManager.cs @@ -3,10 +3,91 @@ using System.Linq; using System.Text; using System.Threading.Tasks; +using SM64_Diagnostic.Utilities; +using System.Windows.Forms; +using SM64_Diagnostic.Structs; namespace SM64_Diagnostic.Managers { public class DebugManager { + ProcessStream _stream; + + public DebugManager(ProcessStream stream, Control tabControl) + { + _stream = stream; + + var panel = tabControl.Controls["NoTearFlowLayoutPanelDebugDisplayType"]; + (panel.Controls["radioButtonDbgOff"] as RadioButton).Click += radioButtonDbgOff_CheckedChanged; + (panel.Controls["radioButtonDbgObjCnt"] as RadioButton).Click += radioButtonDbgObjCnt_CheckedChanged; + (panel.Controls["radioButtonDbgChkInfo"] as RadioButton).Click += radioButtonDbgChkInfo_CheckedChanged; + (panel.Controls["radioButtonDbgMapInfo"] as RadioButton).Click += radioButtonDbgMapInfo_CheckedChanged; + (panel.Controls["radioButtonDbgStgInfo"] as RadioButton).Click += radioButtonDbgStgInfo_CheckedChanged; + (panel.Controls["radioButtonDbgFxInfo"] as RadioButton).Click += radioButtonDbgFxInfo_CheckedChanged; + (panel.Controls["radioButtonDbgEnemyInfo"] as RadioButton).Click += radioButtonDbgEnemyInfo_CheckedChanged; + } + + private void radioButtonDbgOff_CheckedChanged(object sender, EventArgs e) + { + // Turn debug off + _stream.SetValue((byte)0, Config.Debug.Toggle); + + // Set mode + _stream.SetValue((byte)0, Config.Debug.Setting); + } + + private void radioButtonDbgObjCnt_CheckedChanged(object sender, EventArgs e) + { + // Turn debug on + _stream.SetValue((byte)1, Config.Debug.Toggle); + + // Set mode + _stream.SetValue((byte)0, Config.Debug.Setting); + } + + private void radioButtonDbgChkInfo_CheckedChanged(object sender, EventArgs e) + { + // Turn debug on + _stream.SetValue((byte)1, Config.Debug.Toggle); + + // Set mode + _stream.SetValue((byte)1, Config.Debug.Setting); + } + + private void radioButtonDbgMapInfo_CheckedChanged(object sender, EventArgs e) + { + // Turn debug on + _stream.SetValue((byte)1, Config.Debug.Toggle); + + // Set mode + _stream.SetValue((byte)2, Config.Debug.Setting); + } + + private void radioButtonDbgStgInfo_CheckedChanged(object sender, EventArgs e) + { + // Turn debug on + _stream.SetValue((byte)1, Config.Debug.Toggle); + + // Set mode + _stream.SetValue((byte)3, Config.Debug.Setting); + } + + private void radioButtonDbgFxInfo_CheckedChanged(object sender, EventArgs e) + { + // Turn debug on + _stream.SetValue((byte)1, Config.Debug.Toggle); + + // Set mode + _stream.SetValue((byte)4, Config.Debug.Setting); + } + + private void radioButtonDbgEnemyInfo_CheckedChanged(object sender, EventArgs e) + { + // Turn debug on + _stream.SetValue((byte)1, Config.Debug.Toggle); + + // Set mode + _stream.SetValue((byte)5, Config.Debug.Setting); + } } } diff --git a/Source/SM64 Diagnostic/Managers/DisassemblyManager.cs b/Source/SM64 Diagnostic/Managers/DisassemblyManager.cs index 34698b894..24b2e8046 100644 --- a/Source/SM64 Diagnostic/Managers/DisassemblyManager.cs +++ b/Source/SM64 Diagnostic/Managers/DisassemblyManager.cs @@ -17,36 +17,35 @@ public class DisassemblyManager ProcessStream _stream; RichTextBox _output; MaskedTextBox _textBoxStartAdd; - Button _goButton; - Form _formContext; - bool _addressChanged = false; uint _lastProcessAddress; + Button _goButton, _moreButton; + int _currentLines = NumberOfLinesAdd; - public DisassemblyManager(Form formContext, RichTextBox disTextBox, MaskedTextBox textBoxStartAdd, ProcessStream stream, Button goButton) + public DisassemblyManager(ProcessStream stream, Control tabControl) { _stream = stream; - _output = disTextBox; - _textBoxStartAdd = textBoxStartAdd; - _goButton = goButton; - _formContext = formContext; - - goButton.Click += GoButton_Pressed; - textBoxStartAdd.TextChanged += (sender, e) => + _output = tabControl.Controls["richTextBoxDissasembly"] as RichTextBox; + _textBoxStartAdd = tabControl.Controls["maskedTextBoxDisStart"] as MaskedTextBox; + _goButton = tabControl.Controls["buttonDisGo"] as Button; + _moreButton = tabControl.Controls["buttonDisMore"] as Button; + + _goButton.Click += GoButton_Pressed; + _moreButton.Click += MoreButton_Click; + _textBoxStartAdd.TextChanged += (sender, e) => { - _addressChanged = true; + _currentLines = NumberOfLinesAdd; _goButton.Text = "Go"; }; - _stream.OnStatusChanged += Stream_StatusChanged; } - private void GoButton_Pressed(object sender, EventArgs e) + private void MoreButton_Click(object sender, EventArgs e) { - if (!_addressChanged) - { - DisassemblyLines(NumberOfLinesAdd); - return; - } + DisassemblyLines(NumberOfLinesAdd); + _currentLines += NumberOfLinesAdd; + } + private void GoButton_Pressed(object sender, EventArgs e) + { uint newAddress; if (!ParsingUtilities.TryParseHex(_textBoxStartAdd.Text, out newAddress)) { @@ -55,31 +54,15 @@ private void GoButton_Pressed(object sender, EventArgs e) return; } - StartShowDisassmbly(newAddress, NumberOfLinesAdd); - } - - private void Stream_StatusChanged(object sender, EventArgs e) - { - // Yay... thread safety - _formContext.Invoke(new Action(() => - { - if (_stream.IsRunning) - { - _goButton.Enabled = true; - _textBoxStartAdd.Enabled = true; - } - else - { - _goButton.Enabled = false; - _textBoxStartAdd.Enabled = false; - } - })); + StartShowDisassmbly(newAddress, _currentLines); } private void StartShowDisassmbly(uint newAddress, int numberOfLines) { - _goButton.Text = "More"; - _addressChanged = false; + newAddress &= ~0x03U; + + _goButton.Text = "Refresh"; + _moreButton.Visible = true; _output.Text = ""; _lastProcessAddress = newAddress & 0x0FFFFFFF; @@ -89,7 +72,7 @@ private void StartShowDisassmbly(uint newAddress, int numberOfLines) private void DisassemblyLines(int numberOfLines) { _output.Visible = false; - var instructionBytes = _stream.ReadRam(_lastProcessAddress, 4 * numberOfLines); + var instructionBytes = _stream.ReadRamLittleEndian(_lastProcessAddress, 4 * numberOfLines); for (int i = 0; i < numberOfLines; i++, _lastProcessAddress += 4) { // Get next bytes diff --git a/Source/SM64 Diagnostic/Managers/HackManager.cs b/Source/SM64 Diagnostic/Managers/HackManager.cs index e17e3b39f..7109b982c 100644 --- a/Source/SM64 Diagnostic/Managers/HackManager.cs +++ b/Source/SM64 Diagnostic/Managers/HackManager.cs @@ -14,19 +14,84 @@ public class HackManager List _hacks; ProcessStream _stream; CheckedListBox _checkList; + ListBox _spawnList; + TextBox _gfxIdTextbox, _extraTextbox; object _listLocker = new object(); - public HackManager(ProcessStream stream, List hacks, CheckedListBox checkList) + public HackManager(ProcessStream stream, List hacks, List spawnCodes, Control tabControl) { - _checkList = checkList; _hacks = hacks; _stream = stream; + var splitContainter = tabControl.Controls["splitContainerHacks"] as SplitContainer; + _checkList = splitContainter.Panel1.Controls["groupBoxHackRam"].Controls["checkedListBoxHacks"] as CheckedListBox; + + var spawnGroup = splitContainter.Panel2.Controls["groupBoxHackSpawn"]; + _spawnList = spawnGroup.Controls["listBoxSpawn"] as ListBox; + var spawnButton = spawnGroup.Controls["buttonHackSpawn"] as Button; + _gfxIdTextbox = spawnGroup.Controls["textBoxSpawnGfxId"] as TextBox; + _extraTextbox = spawnGroup.Controls["textBoxSpawnExtra"] as TextBox; + var resetButton = spawnGroup.Controls["buttonSpawnReset"] as Button; + + // Load spawn objects codes + foreach (var code in spawnCodes) + _spawnList.Items.Add(code); + + // Load hack lists foreach (var hack in _hacks) _checkList.Items.Add(hack); _checkList.ItemCheck += _checkList_ItemCheck; + _spawnList.SelectedIndexChanged += _spawnList_SelectedIndexChanged; + spawnButton.Click += SpawnButton_Click; + resetButton.Click += ResetButton_Click; + } + + private void ResetButton_Click(object sender, EventArgs e) + { + Config.Hacks.SpawnHack.ClearPayload(_stream); + } + + private void _spawnList_SelectedIndexChanged(object sender, EventArgs e) + { + if (_spawnList.SelectedItems.Count == 0) + return; + + var selectedHack = _spawnList.SelectedItem as SpawnHack; + + _gfxIdTextbox.Text = String.Format("0x{0:X2}", selectedHack.GfxId); + _extraTextbox.Text = String.Format("0x{0:X2}", selectedHack.Extra); + } + + private void SpawnButton_Click(object sender, EventArgs e) + { + if (_spawnList.SelectedItems.Count == 0) + return; + + uint gfxId, extra; + if (!ParsingUtilities.TryParseHex(_gfxIdTextbox.Text, out gfxId)) + { + MessageBox.Show("Fail"); + return; + } + if (!ParsingUtilities.TryParseHex(_extraTextbox.Text, out extra)) + { + MessageBox.Show("Fail"); + return; + } + + _stream.Suspend(); + + Config.Hacks.SpawnHack.LoadPayload(_stream, false); + + var selectedHack = _spawnList.SelectedItem as SpawnHack; + + _stream.SetValue(selectedHack.Behavior, Config.Hacks.BehaviorAddress); + _stream.SetValue((UInt16)gfxId, Config.Hacks.GfxIdAddress); + _stream.SetValue((UInt16)extra, Config.Hacks.ExtraAddress); + + _stream.Resume(); } private void _checkList_ItemCheck(object sender, ItemCheckEventArgs e) diff --git a/Source/SM64 Diagnostic/Managers/MapManager.cs b/Source/SM64 Diagnostic/Managers/MapManager.cs index 7b2f6ac77..6cabc37ee 100644 --- a/Source/SM64 Diagnostic/Managers/MapManager.cs +++ b/Source/SM64 Diagnostic/Managers/MapManager.cs @@ -129,10 +129,10 @@ public void Update() return; // Get level and area - byte level = _stream.ReadRam(Config.LevelAddress, 1)[0]; - byte area = _stream.ReadRam(Config.AreaAddress, 1)[0]; - ushort loadingPoint = BitConverter.ToUInt16(_stream.ReadRam(Config.LoadingPointAddress, 2), 0); - ushort missionLayout = BitConverter.ToUInt16(_stream.ReadRam(Config.MissionAddress, 2), 0); + byte level = _stream.GetByte(Config.LevelAddress); + byte area = _stream.GetByte(Config.AreaAddress); + ushort loadingPoint = _stream.GetUInt16(Config.LoadingPointAddress); + ushort missionLayout = _stream.GetUInt16(Config.MissionAddress); // Find new map list if (_currentMapList == null || _currentLevel != level || _currentArea != area diff --git a/Source/SM64 Diagnostic/Managers/MarioManager.cs b/Source/SM64 Diagnostic/Managers/MarioManager.cs index f537008d4..0a85a7c18 100644 --- a/Source/SM64 Diagnostic/Managers/MarioManager.cs +++ b/Source/SM64 Diagnostic/Managers/MarioManager.cs @@ -19,6 +19,12 @@ public MarioManager(ProcessStream stream, List marioData, Control : base(stream, marioData, variableTable, Config.Mario.StructAddress) { _mapManager = mapManager; + + var toggleHandsfree = marioControl.Controls["buttonMarioToggleHandsfree"] as Button; + var toggleVisibility = marioControl.Controls["buttonMarioVisibility"] as Button; + + toggleHandsfree.Click += ToggleHandsfree_Click; + toggleVisibility.Click += ToggleVisibility_Click; } protected override void InitializeSpecialVariables() @@ -29,16 +35,18 @@ protected override void InitializeSpecialVariables() new DataContainer("SlidingSpeed"), new AngleDataContainer("SlidingAngle"), new DataContainer("FallHeight"), + new DataContainer("ActionDescription"), + new DataContainer("PrevActionDescription") }; } public void ProcessSpecialVars() { UInt32 floorTriangle = _stream.GetUInt32(Config.Mario.StructAddress + Config.Mario.FloorTriangleOffset); - var floorY = BitConverter.ToSingle(_stream.ReadRam(Config.Mario.StructAddress + Config.Mario.GroundYOffset, 4), 0); + var floorY = _stream.GetSingle(Config.Mario.StructAddress + Config.Mario.GroundYOffset); - float slidingSpeedX = BitConverter.ToSingle(_stream.ReadRam(Config.Mario.StructAddress + Config.Mario.SlidingSpeedXOffset, 4), 0); - float slidingSpeedZ = BitConverter.ToSingle(_stream.ReadRam(Config.Mario.StructAddress + Config.Mario.SlidingSpeedZOffset, 4), 0); + float slidingSpeedX = _stream.GetSingle(Config.Mario.StructAddress + Config.Mario.SlidingSpeedXOffset); + float slidingSpeedZ = _stream.GetSingle(Config.Mario.StructAddress + Config.Mario.SlidingSpeedZOffset); foreach (var specialVar in _specialWatchVars) { switch(specialVar.SpecialName) @@ -68,10 +76,28 @@ public void ProcessSpecialVars() case "FallHeight": (specialVar as DataContainer).Text = (_stream.GetSingle(Config.Mario.StructAddress + Config.Mario.PeakHeightOffset) - floorY).ToString(); break; + + case "ActionDescription": + (specialVar as DataContainer).Text = Config.MarioActions.GetActionName(_stream.GetUInt32(Config.Mario.StructAddress + Config.Mario.ActionOffset)); + break; + + case "PrevActionDescription": + (specialVar as DataContainer).Text = Config.MarioActions.GetActionName(_stream.GetUInt32(Config.Mario.StructAddress + Config.Mario.PrevActionOffset)); + break; } } } + private void ToggleHandsfree_Click(object sender, EventArgs e) + { + MarioActions.ToggleHandsfree(_stream); + } + + private void ToggleVisibility_Click(object sender, EventArgs e) + { + MarioActions.ToggleVisibility(_stream); + } + public override void Update(bool updateView) { // Get Mario position and rotation diff --git a/Source/SM64 Diagnostic/Managers/MiscManager.cs b/Source/SM64 Diagnostic/Managers/MiscManager.cs index 11dbb7493..624bbae11 100644 --- a/Source/SM64 Diagnostic/Managers/MiscManager.cs +++ b/Source/SM64 Diagnostic/Managers/MiscManager.cs @@ -116,8 +116,8 @@ public override void Update(bool updateView) private int GetRngCallsPerFrame() { - var currentRng = BitConverter.ToUInt16(_stream.ReadRam(Config.RngRecordingAreaAddress + 0x0E, 2), 0); - var preRng = BitConverter.ToUInt16(_stream.ReadRam(Config.RngRecordingAreaAddress + 0x0C, 2), 0); + var currentRng = _stream.GetUInt16(Config.RngRecordingAreaAddress + 0x0E); + var preRng = _stream.GetUInt16(Config.RngRecordingAreaAddress + 0x0C); return RngIndexer.GetRngIndexDiff(preRng, currentRng); } diff --git a/Source/SM64 Diagnostic/Managers/ObjectManager.cs b/Source/SM64 Diagnostic/Managers/ObjectManager.cs index fd6ba4992..f659f3d16 100644 --- a/Source/SM64 Diagnostic/Managers/ObjectManager.cs +++ b/Source/SM64 Diagnostic/Managers/ObjectManager.cs @@ -203,12 +203,18 @@ public ObjectManager(ProcessStream stream, ObjectAssociations objAssoc, List d is WatchVariableControl); + foreach (WatchVariableControl dataControl in test) + dataControl.EditMode = false; + if (CurrentAddresses.Count == 1) { _objGui.CloneButton.Enabled = true; @@ -221,12 +227,16 @@ private void AddressChanged() private void ObjAddressLabel_Click(object sender, EventArgs e) { - var variableInfo = new VariableViewerForm("Object Address", "Object", - String.Format("0x{0:X8}", _currentAddresses), String.Format("0x{0:X8}", (_currentAddresses[0] & 0x0FFFFFFF) + _stream.ProcessMemoryOffset)); + if (_currentAddresses.Count == 0) + return; + + var variableTitle = "Object Address" + (_currentAddresses.Count > 1 ? " (First of Multiple)" : ""); + var variableInfo = new VariableViewerForm(variableTitle, "Object", + String.Format("0x{0:X8}", _currentAddresses[0]), String.Format("0x{0:X8}", (_currentAddresses[0] & 0x0FFFFFFF) + _stream.ProcessMemoryOffset)); variableInfo.ShowDialog(); } - private void MoveToMarioButton_Click(object sender, EventArgs e) + private void RetreiveButton_Click(object sender, EventArgs e) { if (CurrentAddresses.Count == 0) return; @@ -234,12 +244,29 @@ private void MoveToMarioButton_Click(object sender, EventArgs e) MarioActions.RetreiveObjects(_stream, CurrentAddresses); } - private void MoveMarioToButton_Click(object sender, EventArgs e) + private void GoToButton_Click(object sender, EventArgs e) + { + if (CurrentAddresses.Count == 0) + return; + + MarioActions.GoToObjects(_stream, CurrentAddresses); + } + + + private void GoToHomeButton_Click(object sender, EventArgs e) + { + if (CurrentAddresses.Count == 0) + return; + + MarioActions.GoToObjectsHome(_stream, CurrentAddresses); + } + + private void RetrieveHomeButton_Click(object sender, EventArgs e) { if (CurrentAddresses.Count == 0) return; - MarioActions.MoveMarioToObjects(_stream, CurrentAddresses); + MarioActions.RetreiveObjectsHome(_stream, CurrentAddresses); } private void UnloadButton_Click(object sender, EventArgs e) @@ -395,19 +422,19 @@ public override void Update(bool updateView) private int GetNumRngCalls(uint objAddress) { - var numberOfRngObjs = BitConverter.ToUInt32(_stream.ReadRam(Config.RngRecordingAreaAddress, 4), 0); + var numberOfRngObjs = _stream.GetUInt32(Config.RngRecordingAreaAddress); int numOfCalls = 0; for (int i = 0; i < numberOfRngObjs; i++) { uint rngStructAdd = (uint)(Config.RngRecordingAreaAddress + 0x10 + 0x08 * i); - var address = BitConverter.ToUInt32(_stream.ReadRam(rngStructAdd + 0x04, 4), 0); + var address = _stream.GetUInt32(rngStructAdd + 0x04); if (address != objAddress) continue; - var preRng = BitConverter.ToUInt16(_stream.ReadRam(rngStructAdd + 0x00, 2), 0); - var postRng = BitConverter.ToUInt16(_stream.ReadRam(rngStructAdd + 0x02, 2), 0); + var preRng = _stream.GetUInt16(rngStructAdd + 0x00); + var postRng = _stream.GetUInt16(rngStructAdd + 0x02); numOfCalls = RngIndexer.GetRngIndexDiff(preRng, postRng); break; diff --git a/Source/SM64 Diagnostic/Managers/ObjectSlotsManager.cs b/Source/SM64 Diagnostic/Managers/ObjectSlotsManager.cs index 236e4b442..f17f24ae5 100644 --- a/Source/SM64 Diagnostic/Managers/ObjectSlotsManager.cs +++ b/Source/SM64 Diagnostic/Managers/ObjectSlotsManager.cs @@ -14,7 +14,19 @@ namespace SM64_Diagnostic.Managers { public class ObjectSlotsManager { + public class ObjectSlotData + { + public uint Address; + public byte ObjectProcessGroup; + public int ProcessIndex; + public int? VacantSlotIndex; + public float DistanceToMario; + public bool IsActive; + public uint Behavior; + } + const int DefaultSlotSize = 36; + public ObjectSlot[] ObjectSlots; public ObjectAssociations ObjectAssoc; @@ -28,7 +40,8 @@ public class ObjectSlotsManager Dictionary _mapObjects = new Dictionary(); Dictionary _memoryAddressSlotIndex; - Dictionary _lastSlotLabel = new Dictionary(); + Dictionary> _lastSlotLabel = new Dictionary>(); + bool _labelsLocked = false; public List SelectedSlotsAddresses = new List(); List _toggleMapGroups = new List(); @@ -44,9 +57,9 @@ public class ObjectSlotsManager bool _firstSlotSelect = true; List _prevSelectedBehaviorCriteria = new List(); - public enum SortMethodType {ProcessingOrder, MemoryOrder, DistanceToMario}; - public enum MapToggleModeType {Single, ObjectType, ProcessGroup}; - public enum SlotLabelType {Recommended, SlotPosVs, SlotPos, SlotIndex} + public enum SortMethodType { ProcessingOrder, MemoryOrder, DistanceToMario }; + public enum MapToggleModeType { Single, ObjectType, ProcessGroup }; + public enum SlotLabelType { Recommended, SlotPosVs, SlotPos, SlotIndex } public void ChangeSlotSize(int newSize) { @@ -54,7 +67,7 @@ public void ChangeSlotSize(int newSize) objSlot.Size = new Size(newSize, newSize); } - public ObjectSlotsManager(ProcessStream stream, ObjectAssociations objAssoc, + public ObjectSlotsManager(ProcessStream stream, ObjectAssociations objAssoc, ObjectManager objManager, ObjectSlotManagerGui managerGui, MapManager mapManager, MiscManager miscManager) { ObjectAssoc = objAssoc; @@ -82,7 +95,7 @@ public ObjectSlotsManager(ProcessStream stream, ObjectAssociations objAssoc, { var objectSlot = new ObjectSlot(i, this, ManagerGui, new Size(DefaultSlotSize, DefaultSlotSize)); ObjectSlots[i] = objectSlot; - objectSlot.Click += (sender, e) => OnClick(sender, e); + objectSlot.Click += (sender, e) => OnSlotClick(sender, e); ManagerGui.FlowLayoutContainer.Controls.Add(objectSlot); } @@ -90,7 +103,7 @@ public ObjectSlotsManager(ProcessStream stream, ObjectAssociations objAssoc, ChangeSlotSize(DefaultSlotSize); } - private void OnClick(object sender, EventArgs e) + private void OnSlotClick(object sender, EventArgs e) { // Make sure the tab has loaded if (ManagerGui.TabControl.SelectedTab == null) @@ -102,9 +115,9 @@ private void OnClick(object sender, EventArgs e) switch (ManagerGui.TabControl.SelectedTab.Text) { default: - var keyboardState = Keyboard.GetState(0); + var keyboardState = Keyboard.GetState(); ManagerGui.TabControl.SelectedTab = ManagerGui.TabControl.TabPages["tabPageObjects"]; - if (keyboardState.IsKeyDown(Key.ShiftLeft) || keyboardState.IsKeyDown(Key.ShiftRight) + if ((keyboardState.IsKeyDown(Key.ShiftLeft) || keyboardState.IsKeyDown(Key.ShiftRight)) && SelectedSlotsAddresses.Count > 0) { int minSelect = SelectedSlotsAddresses.Min(s => ObjectSlots.First(o => o.Address == s).Index); @@ -146,7 +159,7 @@ private void OnClick(object sender, EventArgs e) else _toggleMapSlots.Add(selectedSlot.Address); - UpdateSelectedObjectSlots(); + UpdateSelectedMapObjectSlots(); break; case MapToggleModeType.ObjectType: @@ -156,7 +169,7 @@ private void OnClick(object sender, EventArgs e) else _toggleMapBehaviors.Add(behavior); - UpdateSelectedObjectSlots(); + UpdateSelectedMapObjectSlots(); break; case MapToggleModeType.ProcessGroup: @@ -166,22 +179,22 @@ private void OnClick(object sender, EventArgs e) else _toggleMapGroups.Add(group); - UpdateSelectedObjectSlots(); + UpdateSelectedMapObjectSlots(); break; } break; } } - public void SetAllSelectedObjectSlots() + public void SetAllSelectedMapObjectSlots() { foreach (var objSlot in ObjectSlots) { - objSlot.Selected = true; + objSlot.SelectedOnMap = true; } } - public void UpdateSelectedObjectSlots() + public void UpdateSelectedMapObjectSlots() { foreach (var objSlot in ObjectSlots) { @@ -189,7 +202,7 @@ public void UpdateSelectedObjectSlots() && !_toggleMapBehaviors.Contains(objSlot.Behavior) && !_toggleMapSlots.Contains(objSlot.Address); - objSlot.Selected = selected; + objSlot.SelectedOnMap = selected; } } @@ -229,8 +242,7 @@ private List GetProcessedObjects(ObjectGroupsConfig groupConfig, uint processGroupStructAddress = groupConfig.FirstGroupingAddress + objectProcessGroup * groupConfig.ProcessGroupStructSize; // Calculate start and ending objects - uint currentGroupObject = BitConverter.ToUInt32(_stream.ReadRam(processGroupStructAddress - + groupConfig.ProcessNextLinkOffset, 4), 0); + uint currentGroupObject = _stream.GetUInt32(processGroupStructAddress + groupConfig.ProcessNextLinkOffset); // Make sure there are objects within the group if (currentGroupObject == processGroupStructAddress) @@ -239,9 +251,8 @@ private List GetProcessedObjects(ObjectGroupsConfig groupConfig, // Loop through every object within the group while ((currentGroupObject != processGroupStructAddress && currentSlot < slotConfig.MaxSlots)) { - // Validate current object - if (BitConverter.ToUInt16(_stream.ReadRam(currentGroupObject + Config.ObjectSlots.HeaderOffset, 2), 0) != 0x18) + if (_stream.GetUInt16(currentGroupObject + Config.ObjectSlots.HeaderOffset) != 0x18) return null; // Get data @@ -254,8 +265,7 @@ private List GetProcessedObjects(ObjectGroupsConfig groupConfig, }; // Move to next object - currentGroupObject = BitConverter.ToUInt32( - _stream.ReadRam(currentGroupObject + groupConfig.ProcessNextLinkOffset, 4), 0); + currentGroupObject = _stream.GetUInt32(currentGroupObject + groupConfig.ProcessNextLinkOffset); // Mark next slot currentSlot++; @@ -265,11 +275,11 @@ private List GetProcessedObjects(ObjectGroupsConfig groupConfig, var vacantSlotStart = currentSlot; // Now calculate vacant addresses - uint currentObject = BitConverter.ToUInt32(_stream.ReadRam(groupConfig.VactantPointerAddress, 4), 0); + uint currentObject = _stream.GetUInt32(groupConfig.VactantPointerAddress); for (; currentSlot < slotConfig.MaxSlots; currentSlot++) { // Validate current object - if (BitConverter.ToUInt16(_stream.ReadRam(currentObject + Config.ObjectSlots.HeaderOffset, 2), 0) != 0x18) + if (_stream.GetUInt16(currentObject + Config.ObjectSlots.HeaderOffset) != 0x18) return null; newObjectSlotData[currentSlot] = new ObjectSlotData() @@ -280,8 +290,7 @@ private List GetProcessedObjects(ObjectGroupsConfig groupConfig, VacantSlotIndex = currentSlot - vacantSlotStart }; - currentObject = BitConverter.ToUInt32( - _stream.ReadRam(currentObject + groupConfig.ProcessNextLinkOffset, 4), 0); + currentObject = _stream.GetUInt32(currentObject + groupConfig.ProcessNextLinkOffset); } return newObjectSlotData.ToList(); @@ -293,7 +302,6 @@ public void Update() var slotConfig = Config.ObjectSlots; var newObjectSlotData = GetProcessedObjects(groupConfig, slotConfig); - if (newObjectSlotData == null) return; @@ -311,26 +319,25 @@ public void Update() // Get mario position float marioX, marioY, marioZ; - marioX = BitConverter.ToSingle(_stream.ReadRam(Config.Mario.StructAddress + Config.Mario.XOffset, 4), 0); - marioY = BitConverter.ToSingle(_stream.ReadRam(Config.Mario.StructAddress + Config.Mario.YOffset, 4), 0); - marioZ = BitConverter.ToSingle(_stream.ReadRam(Config.Mario.StructAddress + Config.Mario.ZOffset, 4), 0); + marioX = _stream.GetSingle(Config.Mario.StructAddress + Config.Mario.XOffset); + marioY = _stream.GetSingle(Config.Mario.StructAddress + Config.Mario.YOffset); + marioZ = _stream.GetSingle(Config.Mario.StructAddress + Config.Mario.ZOffset); // Calculate distance to Mario foreach (var objSlot in newObjectSlotData) { // Get object relative-to-maario position float dX, dY, dZ; - dX = marioX - BitConverter.ToSingle(_stream.ReadRam(objSlot.Address + Config.ObjectSlots.ObjectXOffset, 4), 0); - dY = marioY - BitConverter.ToSingle(_stream.ReadRam(objSlot.Address + Config.ObjectSlots.ObjectYOffset, 4), 0); - dZ = marioZ - BitConverter.ToSingle(_stream.ReadRam(objSlot.Address + Config.ObjectSlots.ObjectZOffset, 4), 0); + dX = marioX - _stream.GetSingle(objSlot.Address + Config.ObjectSlots.ObjectXOffset); + dY = marioY - _stream.GetSingle(objSlot.Address + Config.ObjectSlots.ObjectYOffset); + dZ = marioZ - _stream.GetSingle(objSlot.Address + Config.ObjectSlots.ObjectZOffset); objSlot.DistanceToMario = (float)Math.Sqrt(dX * dX + dY * dY + dZ * dZ); // Check if active/loaded - objSlot.IsActive = BitConverter.ToUInt16(_stream.ReadRam(objSlot.Address + Config.ObjectSlots.ObjectActiveOffset, 2), 0) != 0x0000; + objSlot.IsActive = _stream.GetUInt16(objSlot.Address + Config.ObjectSlots.ObjectActiveOffset) != 0x0000; - objSlot.Behavior = BitConverter.ToUInt32(_stream.ReadRam(objSlot.Address + Config.ObjectSlots.BehaviorScriptOffset, 4), 0) - & 0x7FFFFFFF; + objSlot.Behavior = _stream.GetUInt32(objSlot.Address + Config.ObjectSlots.BehaviorScriptOffset) & 0x7FFFFFFF; } // Processing sort order @@ -357,20 +364,28 @@ public void Update() _activeObjCnt = 0; - _standingOnObject = BitConverter.ToUInt32(_stream.ReadRam(Config.Mario.StandingOnObjectPointer, 4), 0); - _interactingObject = BitConverter.ToUInt32(_stream.ReadRam(Config.Mario.InteractingObjectPointerOffset + Config.Mario.StructAddress, 4), 0); - _holdingObject = BitConverter.ToUInt32(_stream.ReadRam(Config.Mario.HoldingObjectPointerOffset + Config.Mario.StructAddress, 4), 0); - _usingObject = BitConverter.ToUInt32(_stream.ReadRam(Config.Mario.UsingObjectPointerOffset + Config.Mario.StructAddress, 4), 0); + _standingOnObject = _stream.GetUInt32(Config.Mario.StandingOnObjectPointer); + _interactingObject = _stream.GetUInt32(Config.Mario.InteractingObjectPointerOffset + Config.Mario.StructAddress); + _holdingObject = _stream.GetUInt32(Config.Mario.HoldingObjectPointerOffset + Config.Mario.StructAddress); + _usingObject = _stream.GetUInt32(Config.Mario.UsingObjectPointerOffset + Config.Mario.StructAddress); _closestObject = newObjectSlotData.OrderBy(s => !s.IsActive || s.Behavior == (ObjectAssoc.MarioBehavior & 0x0FFFFFFF) ? float.MaxValue : s.DistanceToMario).First().Address; // Update slots + UpdateSlots(newObjectSlotData); + } + + private void UpdateSlots(List newObjectSlotData) + { + // Lock label update + _labelsLocked = ManagerGui.LockLabelsCheckbox.Checked; + BehaviorCriteria? multiBehavior = null; List selectedBehaviorCriterias = new List(); bool firstObject = true; - for (int i = 0; i < slotConfig.MaxSlots; i++) + for (int i = 0; i < Config.ObjectSlots.MaxSlots; i++) { - var behaviorCritera = UpdateSlot(newObjectSlotData[i], i); + var behaviorCritera = UpdateSlot(newObjectSlotData[i], ObjectSlots[i]); if (!SelectedSlotsAddresses.Contains(newObjectSlotData[i].Address)) continue; @@ -441,46 +456,48 @@ public void Update() } } - private BehaviorCriteria UpdateSlot(ObjectSlotData objectData, int index) + private BehaviorCriteria UpdateSlot(ObjectSlotData objData, ObjectSlot objSlot) { - var objSlot = ObjectSlots[index]; - uint currentAddress = objectData.Address; + uint objAddress = objData.Address; BehaviorCriteria behaviorCriteria; - - objSlot.IsActive = objectData.IsActive; - objSlot.Address = currentAddress; + + objSlot.IsActive = objData.IsActive; + objSlot.Address = objAddress; // Update Overlays - objSlot.DrawSelectedOverlay = SelectedSlotsAddresses.Contains(currentAddress); - objSlot.DrawStandingOnOverlay = Config.ShowOverlays && currentAddress == _standingOnObject; - objSlot.DrawInteractingOverlay = Config.ShowOverlays && currentAddress == _interactingObject; - objSlot.DrawHoldingOverlay = Config.ShowOverlays && currentAddress == _holdingObject; - objSlot.DrawUsingOverlay = Config.ShowOverlays && currentAddress == _usingObject; - objSlot.DrawClosestOverlay = Config.ShowOverlays && currentAddress == _closestObject; - - if (objectData.IsActive) + objSlot.DrawSelectedOverlay = SelectedSlotsAddresses.Contains(objAddress); + objSlot.DrawStandingOnOverlay = Config.ShowOverlays && objAddress == _standingOnObject; + objSlot.DrawInteractingOverlay = Config.ShowOverlays && objAddress == _interactingObject; + objSlot.DrawHoldingOverlay = Config.ShowOverlays && objAddress == _holdingObject; + objSlot.DrawUsingOverlay = Config.ShowOverlays && objAddress == _usingObject; + objSlot.DrawClosestOverlay = Config.ShowOverlays && objAddress == _closestObject; + + if (objData.IsActive) _activeObjCnt++; - var gfxId = _stream.GetUInt32(currentAddress + Config.ObjectSlots.BehaviorGfxOffset); - var subType = _stream.GetInt32(currentAddress + Config.ObjectSlots.BehaviorSubtypeOffset); - var appearance = _stream.GetInt32(currentAddress + Config.ObjectSlots.BehaviorAppearance); + var gfxId = _stream.GetUInt32(objAddress + Config.ObjectSlots.BehaviorGfxOffset); + var subType = _stream.GetInt32(objAddress + Config.ObjectSlots.BehaviorSubtypeOffset); + var appearance = _stream.GetInt32(objAddress + Config.ObjectSlots.BehaviorAppearance); behaviorCriteria = new BehaviorCriteria() { - BehaviorAddress = objectData.Behavior, + BehaviorAddress = objData.Behavior, GfxId = gfxId, SubType = subType, Appearance = appearance }; - ObjectSlots[index].Behavior = behaviorCriteria; + objSlot.Behavior = behaviorCriteria; - var processGroup = objectData.ObjectProcessGroup; - ObjectSlots[index].ProcessGroup = processGroup; + var processGroup = objData.ObjectProcessGroup; + objSlot.ProcessGroup = processGroup; - var newColor = objectData.ObjectProcessGroup == VacantGroup ? Config.ObjectGroups.VacantSlotColor : - Config.ObjectGroups.ProcessingGroupsColor[objectData.ObjectProcessGroup]; - ObjectSlots[index].BackColor = newColor; + var newColor = objData.ObjectProcessGroup == VacantGroup ? Config.ObjectGroups.VacantSlotColor : + Config.ObjectGroups.ProcessingGroupsColor[objData.ObjectProcessGroup]; + objSlot.BackColor = newColor; + + if (!_labelsLocked) + _lastSlotLabel[objAddress] = new Tuple(objData.ProcessIndex, objData.VacantSlotIndex); string labelText = ""; switch ((SlotLabelType)ManagerGui.LabelMethodComboBox.SelectedItem) @@ -492,95 +509,100 @@ private BehaviorCriteria UpdateSlot(ObjectSlotData objectData, int index) goto case SlotLabelType.SlotPosVs; case SlotLabelType.SlotIndex: - labelText = String.Format("{0}", (objectData.Address - Config.ObjectSlots.LinkStartAddress) + labelText = String.Format("{0}", (objData.Address - Config.ObjectSlots.LinkStartAddress) / Config.ObjectSlots.StructSize + (Config.SlotIndexsFromOne ? 1 : 0)); break; case SlotLabelType.SlotPos: - labelText = String.Format("{0}", objectData.ProcessIndex + labelText = String.Format("{0}", _lastSlotLabel[objAddress].Item1 + (Config.SlotIndexsFromOne ? 1 : 0)); break; case SlotLabelType.SlotPosVs: - if (!objectData.VacantSlotIndex.HasValue) + var vacantSlotIndex = _lastSlotLabel[objAddress].Item2; + if (!vacantSlotIndex.HasValue) goto case SlotLabelType.SlotPos; - labelText = String.Format("VS{0}", objectData.VacantSlotIndex.Value + labelText = String.Format("VS{0}", vacantSlotIndex.Value + (Config.SlotIndexsFromOne ? 1 : 0)); break; } - if (ManagerGui.LockLabelsCheckbox.Checked) - { - if (!_lastSlotLabel.ContainsKey(currentAddress)) - _lastSlotLabel.Add(currentAddress, labelText); - else - _lastSlotLabel[currentAddress] = labelText; - } - ObjectSlots[index].Text = ManagerGui.LockLabelsCheckbox.Checked ? _lastSlotLabel[currentAddress] : labelText; + objSlot.TextColor = _labelsLocked ? Color.Red : Color.Blue; + objSlot.Text = labelText; // Update object manager image - if (SelectedSlotsAddresses.Count <= 1 && SelectedSlotsAddresses.Contains(currentAddress)) + if (SelectedSlotsAddresses.Count <= 1 && SelectedSlotsAddresses.Contains(objAddress)) + UpdateObjectManager(objSlot, behaviorCriteria, objData); + + // Update the map + UpdateMapObject(objData, behaviorCriteria); + + return behaviorCriteria; + } + + void UpdateObjectManager(ObjectSlot objSlot, BehaviorCriteria behaviorCriteria, ObjectSlotData objData) + { + var objAssoc = ObjectAssoc.FindObjectAssociation(behaviorCriteria); + var newBehavior = objAssoc != null ? objAssoc.BehaviorCriteria : behaviorCriteria; + if (_lastSelectedBehavior != newBehavior || _firstSlotSelect) { - var objAssoc = ObjectAssoc.FindObjectAssociation(behaviorCriteria); - var newBehavior = objAssoc != null ? objAssoc.BehaviorCriteria : (BehaviorCriteria?)null; - if (_lastSelectedBehavior != newBehavior || _firstSlotSelect) - { - _objManager.Behavior = String.Format("0x{0}", ((objectData.Behavior + ObjectAssoc.RamOffset) & 0x00FFFFFF).ToString("X4")); - _objManager.Name = ObjectAssoc.GetObjectName(behaviorCriteria); + _objManager.Behavior = String.Format("0x{0}", ((objData.Behavior + ObjectAssoc.RamOffset) & 0x00FFFFFF).ToString("X4")); + _objManager.Name = ObjectAssoc.GetObjectName(behaviorCriteria); - _objManager.SetBehaviorWatchVariables(ObjectAssoc.GetWatchVariables(behaviorCriteria), newColor.Lighten(0.8)); - _lastSelectedBehavior = newBehavior; - _firstSlotSelect = false; - } - _objManager.Image = ObjectSlots[index].ObjectImage; - _objManager.BackColor = newColor; - int slotPos = objectData.ObjectProcessGroup == VacantGroup ? objectData.VacantSlotIndex.Value : objectData.ProcessIndex; - _objManager.SlotIndex = (_memoryAddressSlotIndex[currentAddress] + (Config.SlotIndexsFromOne ? 1 : 0)).ToString(); - _objManager.SlotPos = (objectData.ObjectProcessGroup == VacantGroup ? "VS " : "") - + (slotPos + (Config.SlotIndexsFromOne ? 1 : 0)).ToString(); + _objManager.SetBehaviorWatchVariables(ObjectAssoc.GetWatchVariables(behaviorCriteria), objSlot.BackColor.Lighten(0.8)); + _lastSelectedBehavior = newBehavior; + _firstSlotSelect = false; } + _objManager.Image = objSlot.ObjectImage; + _objManager.BackColor = objSlot.BackColor; + int slotPos = objData.ObjectProcessGroup == VacantGroup ? objData.VacantSlotIndex.Value : objData.ProcessIndex; + _objManager.SlotIndex = (_memoryAddressSlotIndex[objData.Address] + (Config.SlotIndexsFromOne ? 1 : 0)).ToString(); + _objManager.SlotPos = (objData.ObjectProcessGroup == VacantGroup ? "VS " : "") + + (slotPos + (Config.SlotIndexsFromOne ? 1 : 0)).ToString(); + } - // Update the map - if (ManagerGui.TabControl.SelectedTab.Text == "Map" && _mapManager.IsLoaded) - { + void UpdateMapObject(ObjectSlotData objData, BehaviorCriteria behaviorCriteria) + { + if (ManagerGui.TabControl.SelectedTab.Text != "Map" || !_mapManager.IsLoaded) + return; - // Update image - var mapObjImage = ObjectAssoc.GetObjectMapImage(behaviorCriteria, !objectData.IsActive); - var mapObjRotates = ObjectAssoc.GetObjectMapRotates(behaviorCriteria); - if (!_mapObjects.ContainsKey(currentAddress)) - { - _mapObjects.Add(currentAddress, new MapObject(mapObjImage)); - _mapManager.AddMapObject(_mapObjects[currentAddress]); - _mapObjects[currentAddress].UsesRotation = mapObjRotates; - } - else if (_mapObjects[currentAddress].Image != mapObjImage) - { - _mapManager.RemoveMapObject(_mapObjects[currentAddress]); - _mapObjects[currentAddress] = new MapObject(mapObjImage); - _mapManager.AddMapObject(_mapObjects[currentAddress]); - _mapObjects[currentAddress].UsesRotation = mapObjRotates; - } + var objAddress = objData.Address; - if (objectData.Behavior == (ObjectAssoc.MarioBehavior & 0x0FFFFFFF)) - { - _mapObjects[currentAddress].Show = false; - } - else - { - // Update map object coordinates and rotation - _mapObjects[currentAddress].Show = !_toggleMapBehaviors.Contains(behaviorCriteria) - && !_toggleMapGroups.Contains(processGroup) && !_toggleMapSlots.Contains(currentAddress); - _mapObjects[currentAddress].X = BitConverter.ToSingle(_stream.ReadRam(currentAddress + Config.ObjectSlots.ObjectXOffset, 4), 0); - _mapObjects[currentAddress].Y = BitConverter.ToSingle(_stream.ReadRam(currentAddress + Config.ObjectSlots.ObjectYOffset, 4), 0); - _mapObjects[currentAddress].Z = BitConverter.ToSingle(_stream.ReadRam(currentAddress + Config.ObjectSlots.ObjectZOffset, 4), 0); - _mapObjects[currentAddress].IsActive = objectData.IsActive; - _mapObjects[currentAddress].Rotation = (float)((UInt16)( - _stream.GetUInt32(currentAddress + Config.ObjectSlots.ObjectRotationOffset)) / 65536f * 360f); - _mapObjects[currentAddress].UsesRotation = ObjectAssoc.GetObjectMapRotates(behaviorCriteria); - } + // Update image + var mapObjImage = ObjectAssoc.GetObjectMapImage(behaviorCriteria, !objData.IsActive); + var mapObjRotates = ObjectAssoc.GetObjectMapRotates(behaviorCriteria); + if (!_mapObjects.ContainsKey(objAddress)) + { + _mapObjects.Add(objAddress, new MapObject(mapObjImage)); + _mapManager.AddMapObject(_mapObjects[objAddress]); + _mapObjects[objAddress].UsesRotation = mapObjRotates; + } + else if (_mapObjects[objAddress].Image != mapObjImage) + { + _mapManager.RemoveMapObject(_mapObjects[objAddress]); + _mapObjects[objAddress] = new MapObject(mapObjImage); + _mapManager.AddMapObject(_mapObjects[objAddress]); + _mapObjects[objAddress].UsesRotation = mapObjRotates; + } + + if (objData.Behavior == (ObjectAssoc.MarioBehavior & 0x0FFFFFFF)) + { + _mapObjects[objAddress].Show = false; + } + else + { + // Update map object coordinates and rotation + _mapObjects[objAddress].Show = !_toggleMapBehaviors.Contains(behaviorCriteria) + && !_toggleMapGroups.Contains(objData.ObjectProcessGroup) && !_toggleMapSlots.Contains(objAddress); + _mapObjects[objAddress].X = _stream.GetSingle(objAddress + Config.ObjectSlots.ObjectXOffset); + _mapObjects[objAddress].Y = _stream.GetSingle(objAddress + Config.ObjectSlots.ObjectYOffset); + _mapObjects[objAddress].Z = _stream.GetSingle(objAddress + Config.ObjectSlots.ObjectZOffset); + _mapObjects[objAddress].IsActive = objData.IsActive; + _mapObjects[objAddress].Rotation = (float)((UInt16)( + _stream.GetUInt32(objAddress + Config.ObjectSlots.ObjectRotationOffset)) / 65536f * 360f); + _mapObjects[objAddress].UsesRotation = ObjectAssoc.GetObjectMapRotates(behaviorCriteria); } - return behaviorCriteria; } } } \ No newline at end of file diff --git a/Source/SM64 Diagnostic/Managers/ScriptManager.cs b/Source/SM64 Diagnostic/Managers/ScriptManager.cs index f00e98da3..b4159f738 100644 --- a/Source/SM64 Diagnostic/Managers/ScriptManager.cs +++ b/Source/SM64 Diagnostic/Managers/ScriptManager.cs @@ -6,6 +6,7 @@ using SM64_Diagnostic.Utilities; using SM64_Diagnostic.Structs; using System.Windows.Forms; +using SM64_Diagnostic.Extensions; namespace SM64_Diagnostic.Managers { @@ -49,8 +50,8 @@ public void Update() public void ExecuteScript(GameScript script) { // Copy jump bytes - uint prevInst1 = BitConverter.ToUInt32(_stream.ReadRam(script.InsertAddress, 4), 0); - uint prevInst2 = BitConverter.ToUInt32(_stream.ReadRam(script.InsertAddress + 4, 4), 0); + uint prevInst1 = _stream.GetUInt32(script.InsertAddress); + uint prevInst2 = _stream.GetUInt32(script.InsertAddress + 4); byte[] prevInstBytes = new byte[8]; BitConverter.GetBytes(prevInst1).CopyTo(prevInstBytes, 0); BitConverter.GetBytes(prevInst2).CopyTo(prevInstBytes, 4); @@ -65,8 +66,8 @@ public void ExecuteScript(GameScript script) Task.Delay(100).Wait(); // Copy jump bytes (They may have changed) - prevInst1 = BitConverter.ToUInt32(_stream.ReadRam(script.InsertAddress, 4), 0); - prevInst2 = BitConverter.ToUInt32(_stream.ReadRam(script.InsertAddress + 4, 4), 0); + prevInst1 = _stream.GetUInt32(script.InsertAddress); + prevInst2 = _stream.GetUInt32(script.InsertAddress + 4); prevInstBytes = new byte[8]; BitConverter.GetBytes(prevInst1).CopyTo(prevInstBytes, 0); BitConverter.GetBytes(prevInst2).CopyTo(prevInstBytes, 4); @@ -96,7 +97,7 @@ private bool AllocateScript(GameScript script, byte[] prevInstBytes) // Write script Buffer.BlockCopy(script.Script, 0, scriptBytes, 0, scriptLength); - success &= _stream.WriteRam(scriptBytes, scriptAddress); + success &= _stream.WriteRamLittleEndian(scriptBytes, scriptAddress); scriptAddress += (uint)(scriptLength); script.PostInstrSpace = scriptAddress; @@ -104,15 +105,15 @@ private bool AllocateScript(GameScript script, byte[] prevInstBytes) scriptAddress += (uint)(2*sizeof(uint)); uint jumpBackToInsertPointInst = JumpToAddressInst(script.InsertAddress + 8); - success &= _stream.WriteRam(BitConverter.GetBytes(jumpBackToInsertPointInst), scriptAddress); + success &= _stream.WriteRamLittleEndian(BitConverter.GetBytes(jumpBackToInsertPointInst), scriptAddress); script.Allocated = success; if (!script.Allocated) return false; // Write jump - script.Allocated &= _stream.WriteRam(prevInstBytes, script.PostInstrSpace); - script.Allocated &= _stream.WriteRam(script.JumpInstBytes, script.InsertAddress); + script.Allocated &= _stream.WriteRamLittleEndian(prevInstBytes, script.PostInstrSpace); + script.Allocated &= _stream.WriteRamLittleEndian(script.JumpInstBytes, script.InsertAddress); return success; } diff --git a/Source/SM64 Diagnostic/Managers/TriangleManager.cs b/Source/SM64 Diagnostic/Managers/TriangleManager.cs index d7a9d1160..1f6b87f22 100644 --- a/Source/SM64 Diagnostic/Managers/TriangleManager.cs +++ b/Source/SM64 Diagnostic/Managers/TriangleManager.cs @@ -18,6 +18,8 @@ public class TriangleManager : DataManager bool _addressChangedByUser = true; bool _useMisalignmentOffset = false; + int _closestVertex = 0; + uint TriangleAddress { get @@ -93,6 +95,7 @@ public TriangleManager(ProcessStream stream, Control tabControl, ListMinimumRecommendedRules.ruleset true + + false + + + false + - ..\packages\OpenTK.1.1.1589.5941\lib\NET40\OpenTK.dll + ..\packages\OpenTK.1.1.1589.5942\lib\NET40\OpenTK.dll True - ..\packages\OpenTK.GLControl.1.1.1589.5941\lib\NET40\OpenTK.GLControl.dll + ..\packages\OpenTK.GLControl.1.1.1589.5942\lib\NET40\OpenTK.GLControl.dll True @@ -102,7 +108,6 @@ - @@ -133,10 +138,13 @@ Component + + + @@ -151,10 +159,10 @@ - + + - @@ -173,7 +181,6 @@ - @@ -187,7 +194,14 @@ VariableViewerForm.cs - + + Designer + + + PreserveNewest + + + @@ -201,6 +215,9 @@ LoadingForm.cs + + PreserveNewest + PreserveNewest Designer @@ -307,6 +324,9 @@ PreserveNewest + + PreserveNewest + PreserveNewest @@ -322,6 +342,14 @@ PreserveNewest + + PreserveNewest + + + + + PreserveNewest + PreserveNewest @@ -382,6 +410,45 @@ PreserveNewest + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + PreserveNewest @@ -424,6 +491,9 @@ PreserveNewest + + PreserveNewest + PreserveNewest @@ -448,6 +518,23 @@ PreserveNewest + + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + PreserveNewest @@ -484,13 +571,52 @@ PreserveNewest + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + PreserveNewest PreserveNewest - + + PreserveNewest + + + PreserveNewest + + PreserveNewest @@ -520,6 +646,12 @@ PreserveNewest + + PreserveNewest + + + PreserveNewest + PreserveNewest @@ -544,6 +676,18 @@ PreserveNewest + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + PreserveNewest @@ -674,11 +818,9 @@ Designer - - - + Designer - + @@ -696,6 +838,7 @@ PreserveNewest + Designer PreserveNewest @@ -703,6 +846,7 @@ PreserveNewest + Designer PreserveNewest @@ -1448,12 +1592,6 @@ PreserveNewest - - PreserveNewest - - - PreserveNewest - PreserveNewest @@ -1715,9 +1853,6 @@ PreserveNewest - - PreserveNewest - PreserveNewest @@ -1748,9 +1883,6 @@ PreserveNewest - - PreserveNewest - PreserveNewest @@ -1805,9 +1937,6 @@ PreserveNewest - - PreserveNewest - PreserveNewest @@ -1982,12 +2111,6 @@ PreserveNewest - - PreserveNewest - - - PreserveNewest - PreserveNewest @@ -2108,18 +2231,6 @@ PreserveNewest - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - PreserveNewest @@ -2420,9 +2531,6 @@ PreserveNewest - - PreserveNewest - PreserveNewest @@ -2519,9 +2627,6 @@ PreserveNewest - - PreserveNewest - PreserveNewest diff --git a/Source/SM64 Diagnostic/Schemas/ActionTableSchema.xsd b/Source/SM64 Diagnostic/Schemas/ActionTableSchema.xsd new file mode 100644 index 000000000..d3149a4ba --- /dev/null +++ b/Source/SM64 Diagnostic/Schemas/ActionTableSchema.xsd @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Source/SM64 Diagnostic/StroopMainForm.Designer.cs b/Source/SM64 Diagnostic/StroopMainForm.Designer.cs index c72177d7a..a05656bdc 100644 --- a/Source/SM64 Diagnostic/StroopMainForm.Designer.cs +++ b/Source/SM64 Diagnostic/StroopMainForm.Designer.cs @@ -33,23 +33,23 @@ private void InitializeComponent() { System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(StroopMainForm)); System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle1 = new System.Windows.Forms.DataGridViewCellStyle(); - this.comboBoxProcessSelection = new System.Windows.Forms.ComboBox(); this.labelProcessSelect = new System.Windows.Forms.Label(); this.groupBoxObjects = new System.Windows.Forms.GroupBox(); this.comboBoxLabelMethod = new System.Windows.Forms.ComboBox(); this.labelLabelMethod = new System.Windows.Forms.Label(); this.labelSlotSize = new System.Windows.Forms.Label(); - this.trackBarObjSlotSize = new System.Windows.Forms.TrackBar(); this.labelToggleMode = new System.Windows.Forms.Label(); this.comboBoxMapToggleMode = new System.Windows.Forms.ComboBox(); this.checkBoxObjLockLabels = new System.Windows.Forms.CheckBox(); this.labelSortMethod = new System.Windows.Forms.Label(); - this.NoTearFlowLayoutPanelObjects = new NoTearFlowLayoutPanel(); + this.NoTearFlowLayoutPanelObjects = new SM64_Diagnostic.Controls.NoTearFlowLayoutPanel(); this.comboBoxSortMethod = new System.Windows.Forms.ComboBox(); - this.buttonPauseResume = new System.Windows.Forms.Button(); + this.trackBarObjSlotSize = new System.Windows.Forms.TrackBar(); this.splitContainerMain = new System.Windows.Forms.SplitContainer(); this.tabControlMain = new System.Windows.Forms.TabControl(); this.tabPageObjects = new System.Windows.Forms.TabPage(); + this.buttonObjRetrieveHome = new System.Windows.Forms.Button(); + this.buttonObjGoToHome = new System.Windows.Forms.Button(); this.textBoxObjName = new System.Windows.Forms.TextBox(); this.buttonObjRetrieve = new System.Windows.Forms.Button(); this.buttonObjClone = new System.Windows.Forms.Button(); @@ -59,26 +59,31 @@ private void InitializeComponent() this.labelObjSlotPosValue = new System.Windows.Forms.Label(); this.labelObjBhvValue = new System.Windows.Forms.Label(); this.labelObjAdd = new System.Windows.Forms.Label(); - this.NoTearFlowLayoutPanelObject = new NoTearFlowLayoutPanel(); + this.NoTearFlowLayoutPanelObject = new SM64_Diagnostic.Controls.NoTearFlowLayoutPanel(); this.labelObjSlotInd = new System.Windows.Forms.Label(); this.labelObjSlotPos = new System.Windows.Forms.Label(); this.labelObjBhv = new System.Windows.Forms.Label(); this.panelObjectBorder = new System.Windows.Forms.Panel(); + this.pictureBoxObject = new SM64_Diagnostic.Controls.IntPictureBox(); this.labelObjAddValue = new System.Windows.Forms.Label(); this.tabPageMario = new System.Windows.Forms.TabPage(); - this.NoTearFlowLayoutPanelMario = new NoTearFlowLayoutPanel(); + this.buttonMarioToggleHandsfree = new System.Windows.Forms.Button(); + this.NoTearFlowLayoutPanelMario = new SM64_Diagnostic.Controls.NoTearFlowLayoutPanel(); this.panelMarioBorder = new System.Windows.Forms.Panel(); + this.pictureBoxMario = new SM64_Diagnostic.Controls.IntPictureBox(); this.tabPageHud = new System.Windows.Forms.TabPage(); this.buttonStandardHud = new System.Windows.Forms.Button(); this.buttonDie = new System.Windows.Forms.Button(); this.buttonFillHp = new System.Windows.Forms.Button(); - this.NoTearFlowLayoutPanelHud = new NoTearFlowLayoutPanel(); this.panelHudBorder = new System.Windows.Forms.Panel(); + this.pictureBoxHud = new SM64_Diagnostic.Controls.IntPictureBox(); + this.NoTearFlowLayoutPanelHud = new SM64_Diagnostic.Controls.NoTearFlowLayoutPanel(); this.tabPageCamera = new System.Windows.Forms.TabPage(); - this.NoTearFlowLayoutPanelCamera = new NoTearFlowLayoutPanel(); + this.NoTearFlowLayoutPanelCamera = new SM64_Diagnostic.Controls.NoTearFlowLayoutPanel(); this.panelCameraBorder = new System.Windows.Forms.Panel(); + this.pictureBoxCamera = new SM64_Diagnostic.Controls.IntPictureBox(); this.tabPageDebug = new System.Windows.Forms.TabPage(); - this.NoTearFlowLayoutPanelDebugDisplayType = new NoTearFlowLayoutPanel(); + this.NoTearFlowLayoutPanelDebugDisplayType = new SM64_Diagnostic.Controls.NoTearFlowLayoutPanel(); this.radioButtonDbgOff = new System.Windows.Forms.RadioButton(); this.radioButtonDbgObjCnt = new System.Windows.Forms.RadioButton(); this.radioButtonDbgChkInfo = new System.Windows.Forms.RadioButton(); @@ -88,6 +93,7 @@ private void InitializeComponent() this.radioButtonDbgEnemyInfo = new System.Windows.Forms.RadioButton(); this.label2 = new System.Windows.Forms.Label(); this.panelDebugBorder = new System.Windows.Forms.Panel(); + this.pictureBoxDebug = new SM64_Diagnostic.Controls.IntPictureBox(); this.tabPageMisc = new System.Windows.Forms.TabPage(); this.groupBoxPuController = new System.Windows.Forms.GroupBox(); this.labelPuConPu = new System.Windows.Forms.Label(); @@ -107,23 +113,25 @@ private void InitializeComponent() this.buttonPuConZpPu = new System.Windows.Forms.Button(); this.buttonPuConZpQpu = new System.Windows.Forms.Button(); this.buttonPuConHome = new System.Windows.Forms.Button(); - this.NoTearFlowLayoutPanelMisc = new NoTearFlowLayoutPanel(); this.panelMiscBorder = new System.Windows.Forms.Panel(); + this.pictureBoxMisc = new SM64_Diagnostic.Controls.IntPictureBox(); + this.NoTearFlowLayoutPanelMisc = new SM64_Diagnostic.Controls.NoTearFlowLayoutPanel(); this.tabPageTriangles = new System.Windows.Forms.TabPage(); + this.buttonGoToVClosest = new System.Windows.Forms.Button(); this.checkBoxVertexMisalignment = new System.Windows.Forms.CheckBox(); this.buttonRetrieveTriangle = new System.Windows.Forms.Button(); this.buttonGoToV3 = new System.Windows.Forms.Button(); this.buttonGoToV2 = new System.Windows.Forms.Button(); this.buttonGoToV1 = new System.Windows.Forms.Button(); - this.NoTearFlowLayoutPanelTriangles = new NoTearFlowLayoutPanel(); this.label4 = new System.Windows.Forms.Label(); this.maskedTextBoxOtherTriangle = new System.Windows.Forms.MaskedTextBox(); this.radioButtonTriOther = new System.Windows.Forms.RadioButton(); this.radioButtonTriCeiling = new System.Windows.Forms.RadioButton(); this.radioButtonTriWall = new System.Windows.Forms.RadioButton(); this.radioButtonTriFloor = new System.Windows.Forms.RadioButton(); + this.NoTearFlowLayoutPanelTriangles = new SM64_Diagnostic.Controls.NoTearFlowLayoutPanel(); this.tabPageStars = new System.Windows.Forms.TabPage(); - this.NoTearFlowLayoutPanel1 = new NoTearFlowLayoutPanel(); + this.NoTearFlowLayoutPanel1 = new SM64_Diagnostic.Controls.NoTearFlowLayoutPanel(); this.radioButtonFileD = new System.Windows.Forms.RadioButton(); this.radioButtonFileC = new System.Windows.Forms.RadioButton(); this.radioButtonFileB = new System.Windows.Forms.RadioButton(); @@ -140,7 +148,6 @@ private void InitializeComponent() this.labelMapIconSize = new System.Windows.Forms.Label(); this.checkBoxMapShowInactive = new System.Windows.Forms.CheckBox(); this.labelMapZoom = new System.Windows.Forms.Label(); - this.buttonMapExpand = new System.Windows.Forms.Button(); this.labelMapId = new System.Windows.Forms.Label(); this.labelMapSubName = new System.Windows.Forms.Label(); this.trackBarMapZoom = new System.Windows.Forms.TrackBar(); @@ -156,27 +163,43 @@ private void InitializeComponent() this.buttonOtherAdd = new System.Windows.Forms.Button(); this.dataGridViewExpressions = new System.Windows.Forms.DataGridView(); this.tabPageDisassembly = new System.Windows.Forms.TabPage(); + this.buttonDisMore = new System.Windows.Forms.Button(); this.buttonDisGo = new System.Windows.Forms.Button(); this.maskedTextBoxDisStart = new System.Windows.Forms.MaskedTextBox(); this.labelDisStart = new System.Windows.Forms.Label(); this.richTextBoxDissasembly = new System.Windows.Forms.RichTextBox(); + this.tabPageHacks = new System.Windows.Forms.TabPage(); + this.splitContainerHacks = new System.Windows.Forms.SplitContainer(); + this.groupBoxHackRam = new System.Windows.Forms.GroupBox(); + this.labelPureInterpretterRequire = new System.Windows.Forms.Label(); + this.checkedListBoxHacks = new System.Windows.Forms.CheckedListBox(); + this.groupBoxHackSpawn = new System.Windows.Forms.GroupBox(); + this.labelSpawnHint = new System.Windows.Forms.Label(); + this.buttonSpawnReset = new System.Windows.Forms.Button(); + this.labelSpawnExtra = new System.Windows.Forms.Label(); + this.labelSpawnGfxId = new System.Windows.Forms.Label(); + this.textBoxSpawnExtra = new System.Windows.Forms.TextBox(); + this.textBoxSpawnGfxId = new System.Windows.Forms.TextBox(); + this.buttonHackSpawn = new System.Windows.Forms.Button(); + this.listBoxSpawn = new System.Windows.Forms.ListBox(); this.tabPageOptions = new System.Windows.Forms.TabPage(); this.checkBoxUseOverlays = new System.Windows.Forms.CheckBox(); this.label3 = new System.Windows.Forms.Label(); this.checkBoxMoveCamWithPu = new System.Windows.Forms.CheckBox(); this.checkBoxUseRomHack = new System.Windows.Forms.CheckBox(); this.checkBoxStartSlotIndexOne = new System.Windows.Forms.CheckBox(); - this.tabPageHacks = new System.Windows.Forms.TabPage(); - this.label5 = new System.Windows.Forms.Label(); - this.labelPureInterpretterRequire = new System.Windows.Forms.Label(); - this.checkedListBoxHacks = new System.Windows.Forms.CheckedListBox(); this.labelVersionNumber = new System.Windows.Forms.Label(); - this.pictureBoxObject = new SM64_Diagnostic.Controls.IntPictureBox(); - this.pictureBoxMario = new SM64_Diagnostic.Controls.IntPictureBox(); - this.pictureBoxHud = new SM64_Diagnostic.Controls.IntPictureBox(); - this.pictureBoxCamera = new SM64_Diagnostic.Controls.IntPictureBox(); - this.pictureBoxDebug = new SM64_Diagnostic.Controls.IntPictureBox(); - this.pictureBoxMisc = new SM64_Diagnostic.Controls.IntPictureBox(); + this.buttonDisconnect = new System.Windows.Forms.Button(); + this.panelConnect = new System.Windows.Forms.Panel(); + this.buttonRefresh = new System.Windows.Forms.Button(); + this.labelNotConnected = new System.Windows.Forms.Label(); + this.buttonConnect = new System.Windows.Forms.Button(); + this.listBoxProcessesList = new System.Windows.Forms.ListBox(); + this.labelFpsCounter = new System.Windows.Forms.Label(); + this.buttonCollapseTop = new System.Windows.Forms.Button(); + this.buttonCollapseBottom = new System.Windows.Forms.Button(); + this.buttonReadOnly = new System.Windows.Forms.Button(); + this.buttonMarioVisibility = new System.Windows.Forms.Button(); this.groupBoxObjects.SuspendLayout(); ((System.ComponentModel.ISupportInitialize)(this.trackBarObjSlotSize)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.splitContainerMain)).BeginInit(); @@ -186,18 +209,24 @@ private void InitializeComponent() this.tabControlMain.SuspendLayout(); this.tabPageObjects.SuspendLayout(); this.panelObjectBorder.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBoxObject)).BeginInit(); this.tabPageMario.SuspendLayout(); this.panelMarioBorder.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBoxMario)).BeginInit(); this.tabPageHud.SuspendLayout(); this.panelHudBorder.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBoxHud)).BeginInit(); this.tabPageCamera.SuspendLayout(); this.panelCameraBorder.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBoxCamera)).BeginInit(); this.tabPageDebug.SuspendLayout(); this.NoTearFlowLayoutPanelDebugDisplayType.SuspendLayout(); this.panelDebugBorder.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBoxDebug)).BeginInit(); this.tabPageMisc.SuspendLayout(); this.groupBoxPuController.SuspendLayout(); this.panelMiscBorder.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBoxMisc)).BeginInit(); this.tabPageTriangles.SuspendLayout(); this.tabPageStars.SuspendLayout(); this.tabPageMap.SuspendLayout(); @@ -210,40 +239,26 @@ private void InitializeComponent() this.tabPageExpressions.SuspendLayout(); ((System.ComponentModel.ISupportInitialize)(this.dataGridViewExpressions)).BeginInit(); this.tabPageDisassembly.SuspendLayout(); - this.tabPageOptions.SuspendLayout(); this.tabPageHacks.SuspendLayout(); - ((System.ComponentModel.ISupportInitialize)(this.pictureBoxObject)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.pictureBoxMario)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.pictureBoxHud)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.pictureBoxCamera)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.pictureBoxDebug)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.pictureBoxMisc)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.splitContainerHacks)).BeginInit(); + this.splitContainerHacks.Panel1.SuspendLayout(); + this.splitContainerHacks.Panel2.SuspendLayout(); + this.splitContainerHacks.SuspendLayout(); + this.groupBoxHackRam.SuspendLayout(); + this.groupBoxHackSpawn.SuspendLayout(); + this.tabPageOptions.SuspendLayout(); + this.panelConnect.SuspendLayout(); this.SuspendLayout(); // - // comboBoxProcessSelection - // - this.comboBoxProcessSelection.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.comboBoxProcessSelection.AutoCompleteMode = System.Windows.Forms.AutoCompleteMode.Suggest; - this.comboBoxProcessSelection.Font = new System.Drawing.Font("Microsoft Sans Serif", 8F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.comboBoxProcessSelection.FormattingEnabled = true; - this.comboBoxProcessSelection.Location = new System.Drawing.Point(127, 8); - this.comboBoxProcessSelection.Margin = new System.Windows.Forms.Padding(2); - this.comboBoxProcessSelection.Name = "comboBoxProcessSelection"; - this.comboBoxProcessSelection.Size = new System.Drawing.Size(718, 21); - this.comboBoxProcessSelection.TabIndex = 0; - this.comboBoxProcessSelection.DropDown += new System.EventHandler(this.comboBoxProcessSelection_DropDown); - this.comboBoxProcessSelection.SelectedIndexChanged += new System.EventHandler(this.comboBoxProcessSelection_SelectedIndexChanged); - // // labelProcessSelect // this.labelProcessSelect.AutoSize = true; - this.labelProcessSelect.Location = new System.Drawing.Point(9, 10); + this.labelProcessSelect.Location = new System.Drawing.Point(138, 15); this.labelProcessSelect.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); this.labelProcessSelect.Name = "labelProcessSelect"; - this.labelProcessSelect.Size = new System.Drawing.Size(117, 13); + this.labelProcessSelect.Size = new System.Drawing.Size(78, 13); this.labelProcessSelect.TabIndex = 1; - this.labelProcessSelect.Text = "Select Mupen Process:"; + this.labelProcessSelect.Text = "Connected To:"; // // groupBoxObjects // @@ -253,18 +268,18 @@ private void InitializeComponent() this.groupBoxObjects.Controls.Add(this.comboBoxLabelMethod); this.groupBoxObjects.Controls.Add(this.labelLabelMethod); this.groupBoxObjects.Controls.Add(this.labelSlotSize); - this.groupBoxObjects.Controls.Add(this.trackBarObjSlotSize); this.groupBoxObjects.Controls.Add(this.labelToggleMode); this.groupBoxObjects.Controls.Add(this.comboBoxMapToggleMode); this.groupBoxObjects.Controls.Add(this.checkBoxObjLockLabels); this.groupBoxObjects.Controls.Add(this.labelSortMethod); this.groupBoxObjects.Controls.Add(this.NoTearFlowLayoutPanelObjects); this.groupBoxObjects.Controls.Add(this.comboBoxSortMethod); + this.groupBoxObjects.Controls.Add(this.trackBarObjSlotSize); this.groupBoxObjects.Location = new System.Drawing.Point(2, 2); this.groupBoxObjects.Margin = new System.Windows.Forms.Padding(2); this.groupBoxObjects.Name = "groupBoxObjects"; this.groupBoxObjects.Padding = new System.Windows.Forms.Padding(2); - this.groupBoxObjects.Size = new System.Drawing.Size(1004, 466); + this.groupBoxObjects.Size = new System.Drawing.Size(1020, 476); this.groupBoxObjects.TabIndex = 2; this.groupBoxObjects.TabStop = false; this.groupBoxObjects.Text = "Objects"; @@ -273,7 +288,7 @@ private void InitializeComponent() // this.comboBoxLabelMethod.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); this.comboBoxLabelMethod.AutoCompleteMode = System.Windows.Forms.AutoCompleteMode.Suggest; - this.comboBoxLabelMethod.Location = new System.Drawing.Point(898, 40); + this.comboBoxLabelMethod.Location = new System.Drawing.Point(738, 15); this.comboBoxLabelMethod.Margin = new System.Windows.Forms.Padding(2); this.comboBoxLabelMethod.Name = "comboBoxLabelMethod"; this.comboBoxLabelMethod.Size = new System.Drawing.Size(102, 21); @@ -283,7 +298,7 @@ private void InitializeComponent() // this.labelLabelMethod.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); this.labelLabelMethod.AutoSize = true; - this.labelLabelMethod.Location = new System.Drawing.Point(818, 43); + this.labelLabelMethod.Location = new System.Drawing.Point(658, 18); this.labelLabelMethod.Name = "labelLabelMethod"; this.labelLabelMethod.Size = new System.Drawing.Size(75, 13); this.labelLabelMethod.TabIndex = 12; @@ -298,23 +313,11 @@ private void InitializeComponent() this.labelSlotSize.TabIndex = 11; this.labelSlotSize.Text = "Slot Size:"; // - // trackBarObjSlotSize - // - this.trackBarObjSlotSize.Location = new System.Drawing.Point(167, 15); - this.trackBarObjSlotSize.Maximum = 100; - this.trackBarObjSlotSize.Minimum = 15; - this.trackBarObjSlotSize.Name = "trackBarObjSlotSize"; - this.trackBarObjSlotSize.Size = new System.Drawing.Size(104, 45); - this.trackBarObjSlotSize.TabIndex = 3; - this.trackBarObjSlotSize.TickFrequency = 10; - this.trackBarObjSlotSize.Value = 40; - this.trackBarObjSlotSize.ValueChanged += new System.EventHandler(this.trackBarObjSlotSize_ValueChanged); - // // labelToggleMode // this.labelToggleMode.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); this.labelToggleMode.AutoSize = true; - this.labelToggleMode.Location = new System.Drawing.Point(571, 19); + this.labelToggleMode.Location = new System.Drawing.Point(454, 19); this.labelToggleMode.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); this.labelToggleMode.Name = "labelToggleMode"; this.labelToggleMode.Size = new System.Drawing.Size(73, 13); @@ -326,7 +329,7 @@ private void InitializeComponent() // this.comboBoxMapToggleMode.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); this.comboBoxMapToggleMode.FormattingEnabled = true; - this.comboBoxMapToggleMode.Location = new System.Drawing.Point(648, 15); + this.comboBoxMapToggleMode.Location = new System.Drawing.Point(531, 15); this.comboBoxMapToggleMode.Margin = new System.Windows.Forms.Padding(2); this.comboBoxMapToggleMode.Name = "comboBoxMapToggleMode"; this.comboBoxMapToggleMode.Size = new System.Drawing.Size(122, 21); @@ -348,7 +351,7 @@ private void InitializeComponent() // this.labelSortMethod.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); this.labelSortMethod.AutoSize = true; - this.labelSortMethod.Location = new System.Drawing.Point(828, 18); + this.labelSortMethod.Location = new System.Drawing.Point(844, 18); this.labelSortMethod.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); this.labelSortMethod.Name = "labelSortMethod"; this.labelSortMethod.Size = new System.Drawing.Size(68, 13); @@ -361,10 +364,10 @@ private void InitializeComponent() | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); this.NoTearFlowLayoutPanelObjects.AutoScroll = true; - this.NoTearFlowLayoutPanelObjects.Location = new System.Drawing.Point(4, 65); + this.NoTearFlowLayoutPanelObjects.Location = new System.Drawing.Point(4, 45); this.NoTearFlowLayoutPanelObjects.Margin = new System.Windows.Forms.Padding(2); this.NoTearFlowLayoutPanelObjects.Name = "NoTearFlowLayoutPanelObjects"; - this.NoTearFlowLayoutPanelObjects.Size = new System.Drawing.Size(996, 397); + this.NoTearFlowLayoutPanelObjects.Size = new System.Drawing.Size(1012, 427); this.NoTearFlowLayoutPanelObjects.TabIndex = 0; this.NoTearFlowLayoutPanelObjects.Resize += new System.EventHandler(this.NoTearFlowLayoutPanelObjects_Resize); // @@ -372,30 +375,30 @@ private void InitializeComponent() // this.comboBoxSortMethod.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); this.comboBoxSortMethod.AutoCompleteMode = System.Windows.Forms.AutoCompleteMode.Suggest; - this.comboBoxSortMethod.Location = new System.Drawing.Point(898, 15); + this.comboBoxSortMethod.Location = new System.Drawing.Point(914, 15); this.comboBoxSortMethod.Margin = new System.Windows.Forms.Padding(2); this.comboBoxSortMethod.Name = "comboBoxSortMethod"; this.comboBoxSortMethod.Size = new System.Drawing.Size(102, 21); this.comboBoxSortMethod.TabIndex = 4; // - // buttonPauseResume + // trackBarObjSlotSize // - this.buttonPauseResume.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); - this.buttonPauseResume.Location = new System.Drawing.Point(848, 6); - this.buttonPauseResume.Margin = new System.Windows.Forms.Padding(2); - this.buttonPauseResume.Name = "buttonPauseResume"; - this.buttonPauseResume.Size = new System.Drawing.Size(64, 21); - this.buttonPauseResume.TabIndex = 4; - this.buttonPauseResume.Text = "Pause"; - this.buttonPauseResume.UseVisualStyleBackColor = true; - this.buttonPauseResume.Click += new System.EventHandler(this.buttonPauseResume_Click); + this.trackBarObjSlotSize.Location = new System.Drawing.Point(167, 15); + this.trackBarObjSlotSize.Maximum = 100; + this.trackBarObjSlotSize.Minimum = 15; + this.trackBarObjSlotSize.Name = "trackBarObjSlotSize"; + this.trackBarObjSlotSize.Size = new System.Drawing.Size(104, 45); + this.trackBarObjSlotSize.TabIndex = 3; + this.trackBarObjSlotSize.TickFrequency = 10; + this.trackBarObjSlotSize.Value = 40; + this.trackBarObjSlotSize.ValueChanged += new System.EventHandler(this.trackBarObjSlotSize_ValueChanged); // // splitContainerMain // this.splitContainerMain.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); - this.splitContainerMain.Location = new System.Drawing.Point(12, 30); + this.splitContainerMain.Location = new System.Drawing.Point(12, 36); this.splitContainerMain.Margin = new System.Windows.Forms.Padding(2); this.splitContainerMain.Name = "splitContainerMain"; this.splitContainerMain.Orientation = System.Windows.Forms.Orientation.Horizontal; @@ -407,8 +410,8 @@ private void InitializeComponent() // splitContainerMain.Panel2 // this.splitContainerMain.Panel2.Controls.Add(this.groupBoxObjects); - this.splitContainerMain.Size = new System.Drawing.Size(1008, 691); - this.splitContainerMain.SplitterDistance = 218; + this.splitContainerMain.Size = new System.Drawing.Size(1024, 698); + this.splitContainerMain.SplitterDistance = 230; this.splitContainerMain.SplitterWidth = 3; this.splitContainerMain.TabIndex = 4; // @@ -429,21 +432,22 @@ private void InitializeComponent() this.tabControlMain.Controls.Add(this.tabPageMap); this.tabControlMain.Controls.Add(this.tabPageExpressions); this.tabControlMain.Controls.Add(this.tabPageDisassembly); - this.tabControlMain.Controls.Add(this.tabPageOptions); this.tabControlMain.Controls.Add(this.tabPageHacks); + this.tabControlMain.Controls.Add(this.tabPageOptions); this.tabControlMain.HotTrack = true; this.tabControlMain.Location = new System.Drawing.Point(2, 2); this.tabControlMain.Margin = new System.Windows.Forms.Padding(2); this.tabControlMain.Name = "tabControlMain"; this.tabControlMain.SelectedIndex = 0; - this.tabControlMain.Size = new System.Drawing.Size(1004, 216); + this.tabControlMain.Size = new System.Drawing.Size(1020, 228); this.tabControlMain.TabIndex = 3; this.tabControlMain.SelectedIndexChanged += new System.EventHandler(this.tabControlMain_SelectedIndexChanged); - this.tabControlMain.DragEnter += new System.Windows.Forms.DragEventHandler(this.tabControlMain_DragEnter); // // tabPageObjects // this.tabPageObjects.BackColor = System.Drawing.Color.Transparent; + this.tabPageObjects.Controls.Add(this.buttonObjRetrieveHome); + this.tabPageObjects.Controls.Add(this.buttonObjGoToHome); this.tabPageObjects.Controls.Add(this.textBoxObjName); this.tabPageObjects.Controls.Add(this.buttonObjRetrieve); this.tabPageObjects.Controls.Add(this.buttonObjClone); @@ -463,10 +467,30 @@ private void InitializeComponent() this.tabPageObjects.Margin = new System.Windows.Forms.Padding(2); this.tabPageObjects.Name = "tabPageObjects"; this.tabPageObjects.Padding = new System.Windows.Forms.Padding(2); - this.tabPageObjects.Size = new System.Drawing.Size(996, 190); + this.tabPageObjects.Size = new System.Drawing.Size(1012, 202); this.tabPageObjects.TabIndex = 0; this.tabPageObjects.Text = "Object"; // + // buttonObjRetrieveHome + // + this.buttonObjRetrieveHome.Location = new System.Drawing.Point(99, 117); + this.buttonObjRetrieveHome.Margin = new System.Windows.Forms.Padding(2); + this.buttonObjRetrieveHome.Name = "buttonObjRetrieveHome"; + this.buttonObjRetrieveHome.Size = new System.Drawing.Size(91, 21); + this.buttonObjRetrieveHome.TabIndex = 18; + this.buttonObjRetrieveHome.Text = "Retrieve Home"; + this.buttonObjRetrieveHome.UseVisualStyleBackColor = true; + // + // buttonObjGoToHome + // + this.buttonObjGoToHome.Location = new System.Drawing.Point(99, 92); + this.buttonObjGoToHome.Margin = new System.Windows.Forms.Padding(2); + this.buttonObjGoToHome.Name = "buttonObjGoToHome"; + this.buttonObjGoToHome.Size = new System.Drawing.Size(91, 21); + this.buttonObjGoToHome.TabIndex = 17; + this.buttonObjGoToHome.Text = "Go To Home"; + this.buttonObjGoToHome.UseVisualStyleBackColor = true; + // // textBoxObjName // this.textBoxObjName.BorderStyle = System.Windows.Forms.BorderStyle.None; @@ -483,40 +507,40 @@ private void InitializeComponent() // // buttonObjRetrieve // - this.buttonObjRetrieve.Location = new System.Drawing.Point(1, 116); + this.buttonObjRetrieve.Location = new System.Drawing.Point(4, 117); this.buttonObjRetrieve.Margin = new System.Windows.Forms.Padding(2); this.buttonObjRetrieve.Name = "buttonObjRetrieve"; - this.buttonObjRetrieve.Size = new System.Drawing.Size(64, 21); + this.buttonObjRetrieve.Size = new System.Drawing.Size(91, 21); this.buttonObjRetrieve.TabIndex = 15; this.buttonObjRetrieve.Text = "Retrieve"; this.buttonObjRetrieve.UseVisualStyleBackColor = true; // // buttonObjClone // - this.buttonObjClone.Location = new System.Drawing.Point(69, 116); + this.buttonObjClone.Location = new System.Drawing.Point(4, 142); this.buttonObjClone.Margin = new System.Windows.Forms.Padding(2); this.buttonObjClone.Name = "buttonObjClone"; - this.buttonObjClone.Size = new System.Drawing.Size(64, 21); + this.buttonObjClone.Size = new System.Drawing.Size(91, 21); this.buttonObjClone.TabIndex = 14; this.buttonObjClone.Text = "Clone"; this.buttonObjClone.UseVisualStyleBackColor = true; // // buttonObjGoTo // - this.buttonObjGoTo.Location = new System.Drawing.Point(1, 92); + this.buttonObjGoTo.Location = new System.Drawing.Point(4, 92); this.buttonObjGoTo.Margin = new System.Windows.Forms.Padding(2); this.buttonObjGoTo.Name = "buttonObjGoTo"; - this.buttonObjGoTo.Size = new System.Drawing.Size(64, 21); + this.buttonObjGoTo.Size = new System.Drawing.Size(91, 21); this.buttonObjGoTo.TabIndex = 13; this.buttonObjGoTo.Text = "Go To"; this.buttonObjGoTo.UseVisualStyleBackColor = true; // // buttonObjUnload // - this.buttonObjUnload.Location = new System.Drawing.Point(69, 92); + this.buttonObjUnload.Location = new System.Drawing.Point(99, 142); this.buttonObjUnload.Margin = new System.Windows.Forms.Padding(2); this.buttonObjUnload.Name = "buttonObjUnload"; - this.buttonObjUnload.Size = new System.Drawing.Size(64, 21); + this.buttonObjUnload.Size = new System.Drawing.Size(91, 21); this.buttonObjUnload.TabIndex = 5; this.buttonObjUnload.Text = "Unload"; this.buttonObjUnload.UseVisualStyleBackColor = true; @@ -568,7 +592,7 @@ private void InitializeComponent() this.NoTearFlowLayoutPanelObject.Location = new System.Drawing.Point(208, 3); this.NoTearFlowLayoutPanelObject.Margin = new System.Windows.Forms.Padding(2); this.NoTearFlowLayoutPanelObject.Name = "NoTearFlowLayoutPanelObject"; - this.NoTearFlowLayoutPanelObject.Size = new System.Drawing.Size(786, 183); + this.NoTearFlowLayoutPanelObject.Size = new System.Drawing.Size(802, 195); this.NoTearFlowLayoutPanelObject.TabIndex = 3; // // labelObjSlotInd @@ -610,6 +634,21 @@ private void InitializeComponent() this.panelObjectBorder.Size = new System.Drawing.Size(57, 55); this.panelObjectBorder.TabIndex = 2; // + // pictureBoxObject + // + this.pictureBoxObject.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.pictureBoxObject.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High; + this.pictureBoxObject.Location = new System.Drawing.Point(3, 3); + this.pictureBoxObject.Margin = new System.Windows.Forms.Padding(2); + this.pictureBoxObject.MaximumSize = new System.Drawing.Size(133, 130); + this.pictureBoxObject.Name = "pictureBoxObject"; + this.pictureBoxObject.Size = new System.Drawing.Size(51, 50); + this.pictureBoxObject.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom; + this.pictureBoxObject.TabIndex = 0; + this.pictureBoxObject.TabStop = false; + // // labelObjAddValue // this.labelObjAddValue.Location = new System.Drawing.Point(85, 72); @@ -622,16 +661,27 @@ private void InitializeComponent() // tabPageMario // this.tabPageMario.BackColor = System.Drawing.Color.Transparent; + this.tabPageMario.Controls.Add(this.buttonMarioVisibility); + this.tabPageMario.Controls.Add(this.buttonMarioToggleHandsfree); this.tabPageMario.Controls.Add(this.NoTearFlowLayoutPanelMario); this.tabPageMario.Controls.Add(this.panelMarioBorder); this.tabPageMario.Location = new System.Drawing.Point(4, 22); this.tabPageMario.Margin = new System.Windows.Forms.Padding(2); this.tabPageMario.Name = "tabPageMario"; this.tabPageMario.Padding = new System.Windows.Forms.Padding(2); - this.tabPageMario.Size = new System.Drawing.Size(996, 190); + this.tabPageMario.Size = new System.Drawing.Size(1012, 202); this.tabPageMario.TabIndex = 1; this.tabPageMario.Text = "Mario"; // + // buttonMarioToggleHandsfree + // + this.buttonMarioToggleHandsfree.Location = new System.Drawing.Point(3, 64); + this.buttonMarioToggleHandsfree.Name = "buttonMarioToggleHandsfree"; + this.buttonMarioToggleHandsfree.Size = new System.Drawing.Size(75, 42); + this.buttonMarioToggleHandsfree.TabIndex = 2; + this.buttonMarioToggleHandsfree.Text = "Toggle Handsfree"; + this.buttonMarioToggleHandsfree.UseVisualStyleBackColor = true; + // // NoTearFlowLayoutPanelMario // this.NoTearFlowLayoutPanelMario.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) @@ -639,10 +689,10 @@ private void InitializeComponent() | System.Windows.Forms.AnchorStyles.Right))); this.NoTearFlowLayoutPanelMario.AutoScroll = true; this.NoTearFlowLayoutPanelMario.FlowDirection = System.Windows.Forms.FlowDirection.TopDown; - this.NoTearFlowLayoutPanelMario.Location = new System.Drawing.Point(65, 6); + this.NoTearFlowLayoutPanelMario.Location = new System.Drawing.Point(83, 6); this.NoTearFlowLayoutPanelMario.Margin = new System.Windows.Forms.Padding(2); this.NoTearFlowLayoutPanelMario.Name = "NoTearFlowLayoutPanelMario"; - this.NoTearFlowLayoutPanelMario.Size = new System.Drawing.Size(929, 180); + this.NoTearFlowLayoutPanelMario.Size = new System.Drawing.Size(927, 193); this.NoTearFlowLayoutPanelMario.TabIndex = 1; // // panelMarioBorder @@ -654,17 +704,32 @@ private void InitializeComponent() this.panelMarioBorder.Size = new System.Drawing.Size(57, 55); this.panelMarioBorder.TabIndex = 0; // + // pictureBoxMario + // + this.pictureBoxMario.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.pictureBoxMario.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High; + this.pictureBoxMario.Location = new System.Drawing.Point(3, 3); + this.pictureBoxMario.Margin = new System.Windows.Forms.Padding(2); + this.pictureBoxMario.MaximumSize = new System.Drawing.Size(133, 130); + this.pictureBoxMario.Name = "pictureBoxMario"; + this.pictureBoxMario.Size = new System.Drawing.Size(51, 50); + this.pictureBoxMario.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom; + this.pictureBoxMario.TabIndex = 0; + this.pictureBoxMario.TabStop = false; + // // tabPageHud // this.tabPageHud.Controls.Add(this.buttonStandardHud); this.tabPageHud.Controls.Add(this.buttonDie); this.tabPageHud.Controls.Add(this.buttonFillHp); - this.tabPageHud.Controls.Add(this.NoTearFlowLayoutPanelHud); this.tabPageHud.Controls.Add(this.panelHudBorder); + this.tabPageHud.Controls.Add(this.NoTearFlowLayoutPanelHud); this.tabPageHud.Location = new System.Drawing.Point(4, 22); this.tabPageHud.Margin = new System.Windows.Forms.Padding(2); this.tabPageHud.Name = "tabPageHud"; - this.tabPageHud.Size = new System.Drawing.Size(996, 190); + this.tabPageHud.Size = new System.Drawing.Size(1012, 202); this.tabPageHud.TabIndex = 6; this.tabPageHud.Text = "HUD"; // @@ -695,6 +760,30 @@ private void InitializeComponent() this.buttonFillHp.Text = "Fill HP"; this.buttonFillHp.UseVisualStyleBackColor = true; // + // panelHudBorder + // + this.panelHudBorder.Controls.Add(this.pictureBoxHud); + this.panelHudBorder.Location = new System.Drawing.Point(2, 2); + this.panelHudBorder.Margin = new System.Windows.Forms.Padding(2); + this.panelHudBorder.Name = "panelHudBorder"; + this.panelHudBorder.Size = new System.Drawing.Size(57, 55); + this.panelHudBorder.TabIndex = 2; + // + // pictureBoxHud + // + this.pictureBoxHud.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.pictureBoxHud.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High; + this.pictureBoxHud.Location = new System.Drawing.Point(3, 3); + this.pictureBoxHud.Margin = new System.Windows.Forms.Padding(2); + this.pictureBoxHud.MaximumSize = new System.Drawing.Size(133, 130); + this.pictureBoxHud.Name = "pictureBoxHud"; + this.pictureBoxHud.Size = new System.Drawing.Size(51, 50); + this.pictureBoxHud.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom; + this.pictureBoxHud.TabIndex = 0; + this.pictureBoxHud.TabStop = false; + // // NoTearFlowLayoutPanelHud // this.NoTearFlowLayoutPanelHud.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) @@ -705,18 +794,9 @@ private void InitializeComponent() this.NoTearFlowLayoutPanelHud.Location = new System.Drawing.Point(101, 5); this.NoTearFlowLayoutPanelHud.Margin = new System.Windows.Forms.Padding(2); this.NoTearFlowLayoutPanelHud.Name = "NoTearFlowLayoutPanelHud"; - this.NoTearFlowLayoutPanelHud.Size = new System.Drawing.Size(891, 176); + this.NoTearFlowLayoutPanelHud.Size = new System.Drawing.Size(907, 189); this.NoTearFlowLayoutPanelHud.TabIndex = 3; // - // panelHudBorder - // - this.panelHudBorder.Controls.Add(this.pictureBoxHud); - this.panelHudBorder.Location = new System.Drawing.Point(2, 2); - this.panelHudBorder.Margin = new System.Windows.Forms.Padding(2); - this.panelHudBorder.Name = "panelHudBorder"; - this.panelHudBorder.Size = new System.Drawing.Size(57, 55); - this.panelHudBorder.TabIndex = 2; - // // tabPageCamera // this.tabPageCamera.Controls.Add(this.NoTearFlowLayoutPanelCamera); @@ -724,7 +804,7 @@ private void InitializeComponent() this.tabPageCamera.Location = new System.Drawing.Point(4, 22); this.tabPageCamera.Margin = new System.Windows.Forms.Padding(2); this.tabPageCamera.Name = "tabPageCamera"; - this.tabPageCamera.Size = new System.Drawing.Size(996, 190); + this.tabPageCamera.Size = new System.Drawing.Size(1012, 202); this.tabPageCamera.TabIndex = 7; this.tabPageCamera.Text = "Camera"; // @@ -738,7 +818,7 @@ private void InitializeComponent() this.NoTearFlowLayoutPanelCamera.Location = new System.Drawing.Point(65, 2); this.NoTearFlowLayoutPanelCamera.Margin = new System.Windows.Forms.Padding(2); this.NoTearFlowLayoutPanelCamera.Name = "NoTearFlowLayoutPanelCamera"; - this.NoTearFlowLayoutPanelCamera.Size = new System.Drawing.Size(929, 180); + this.NoTearFlowLayoutPanelCamera.Size = new System.Drawing.Size(945, 193); this.NoTearFlowLayoutPanelCamera.TabIndex = 3; // // panelCameraBorder @@ -750,6 +830,21 @@ private void InitializeComponent() this.panelCameraBorder.Size = new System.Drawing.Size(57, 55); this.panelCameraBorder.TabIndex = 2; // + // pictureBoxCamera + // + this.pictureBoxCamera.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.pictureBoxCamera.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High; + this.pictureBoxCamera.Location = new System.Drawing.Point(3, 3); + this.pictureBoxCamera.Margin = new System.Windows.Forms.Padding(2); + this.pictureBoxCamera.MaximumSize = new System.Drawing.Size(133, 130); + this.pictureBoxCamera.Name = "pictureBoxCamera"; + this.pictureBoxCamera.Size = new System.Drawing.Size(51, 50); + this.pictureBoxCamera.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom; + this.pictureBoxCamera.TabIndex = 0; + this.pictureBoxCamera.TabStop = false; + // // tabPageDebug // this.tabPageDebug.Controls.Add(this.NoTearFlowLayoutPanelDebugDisplayType); @@ -758,7 +853,7 @@ private void InitializeComponent() this.tabPageDebug.Location = new System.Drawing.Point(4, 22); this.tabPageDebug.Name = "tabPageDebug"; this.tabPageDebug.Padding = new System.Windows.Forms.Padding(3); - this.tabPageDebug.Size = new System.Drawing.Size(996, 190); + this.tabPageDebug.Size = new System.Drawing.Size(1012, 202); this.tabPageDebug.TabIndex = 8; this.tabPageDebug.Text = "Debug"; // @@ -790,7 +885,6 @@ private void InitializeComponent() this.radioButtonDbgOff.TabStop = true; this.radioButtonDbgOff.Text = "Off"; this.radioButtonDbgOff.UseVisualStyleBackColor = true; - this.radioButtonDbgOff.CheckedChanged += new System.EventHandler(this.radioButtonDbgOff_CheckedChanged); // // radioButtonDbgObjCnt // @@ -801,7 +895,6 @@ private void InitializeComponent() this.radioButtonDbgObjCnt.TabIndex = 5; this.radioButtonDbgObjCnt.Text = "Object Counter"; this.radioButtonDbgObjCnt.UseVisualStyleBackColor = true; - this.radioButtonDbgObjCnt.CheckedChanged += new System.EventHandler(this.radioButtonDbgObjCnt_CheckedChanged); // // radioButtonDbgChkInfo // @@ -812,7 +905,6 @@ private void InitializeComponent() this.radioButtonDbgChkInfo.TabIndex = 6; this.radioButtonDbgChkInfo.Text = "Check Info"; this.radioButtonDbgChkInfo.UseVisualStyleBackColor = true; - this.radioButtonDbgChkInfo.CheckedChanged += new System.EventHandler(this.radioButtonDbgChkInfo_CheckedChanged); // // radioButtonDbgMapInfo // @@ -823,7 +915,6 @@ private void InitializeComponent() this.radioButtonDbgMapInfo.TabIndex = 7; this.radioButtonDbgMapInfo.Text = "Map Info"; this.radioButtonDbgMapInfo.UseVisualStyleBackColor = true; - this.radioButtonDbgMapInfo.CheckedChanged += new System.EventHandler(this.radioButtonDbgMapInfo_CheckedChanged); // // radioButtonDbgStgInfo // @@ -834,7 +925,6 @@ private void InitializeComponent() this.radioButtonDbgStgInfo.TabIndex = 8; this.radioButtonDbgStgInfo.Text = "Stage Info"; this.radioButtonDbgStgInfo.UseVisualStyleBackColor = true; - this.radioButtonDbgStgInfo.CheckedChanged += new System.EventHandler(this.radioButtonDbgStgInfo_CheckedChanged); // // radioButtonDbgFxInfo // @@ -845,7 +935,6 @@ private void InitializeComponent() this.radioButtonDbgFxInfo.TabIndex = 9; this.radioButtonDbgFxInfo.Text = "Effect Info"; this.radioButtonDbgFxInfo.UseVisualStyleBackColor = true; - this.radioButtonDbgFxInfo.CheckedChanged += new System.EventHandler(this.radioButtonDbgFxInfo_CheckedChanged); // // radioButtonDbgEnemyInfo // @@ -856,7 +945,6 @@ private void InitializeComponent() this.radioButtonDbgEnemyInfo.TabIndex = 10; this.radioButtonDbgEnemyInfo.Text = "Enemy Info"; this.radioButtonDbgEnemyInfo.UseVisualStyleBackColor = true; - this.radioButtonDbgEnemyInfo.CheckedChanged += new System.EventHandler(this.radioButtonDbgEnemyInfo_CheckedChanged); // // label2 // @@ -876,14 +964,29 @@ private void InitializeComponent() this.panelDebugBorder.Size = new System.Drawing.Size(57, 55); this.panelDebugBorder.TabIndex = 3; // + // pictureBoxDebug + // + this.pictureBoxDebug.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.pictureBoxDebug.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High; + this.pictureBoxDebug.Location = new System.Drawing.Point(2, 2); + this.pictureBoxDebug.Margin = new System.Windows.Forms.Padding(2); + this.pictureBoxDebug.MaximumSize = new System.Drawing.Size(133, 130); + this.pictureBoxDebug.Name = "pictureBoxDebug"; + this.pictureBoxDebug.Size = new System.Drawing.Size(51, 50); + this.pictureBoxDebug.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom; + this.pictureBoxDebug.TabIndex = 0; + this.pictureBoxDebug.TabStop = false; + // // tabPageMisc // this.tabPageMisc.Controls.Add(this.groupBoxPuController); - this.tabPageMisc.Controls.Add(this.NoTearFlowLayoutPanelMisc); this.tabPageMisc.Controls.Add(this.panelMiscBorder); + this.tabPageMisc.Controls.Add(this.NoTearFlowLayoutPanelMisc); this.tabPageMisc.Location = new System.Drawing.Point(4, 22); this.tabPageMisc.Name = "tabPageMisc"; - this.tabPageMisc.Size = new System.Drawing.Size(996, 190); + this.tabPageMisc.Size = new System.Drawing.Size(1012, 202); this.tabPageMisc.TabIndex = 9; this.tabPageMisc.Text = "Misc."; // @@ -907,7 +1010,7 @@ private void InitializeComponent() this.groupBoxPuController.Controls.Add(this.buttonPuConZpPu); this.groupBoxPuController.Controls.Add(this.buttonPuConZpQpu); this.groupBoxPuController.Controls.Add(this.buttonPuConHome); - this.groupBoxPuController.Location = new System.Drawing.Point(771, -12); + this.groupBoxPuController.Location = new System.Drawing.Point(787, 1); this.groupBoxPuController.Name = "groupBoxPuController"; this.groupBoxPuController.Size = new System.Drawing.Size(222, 197); this.groupBoxPuController.TabIndex = 6; @@ -1106,6 +1209,30 @@ private void InitializeComponent() this.buttonPuConHome.TabIndex = 1; this.buttonPuConHome.UseVisualStyleBackColor = true; // + // panelMiscBorder + // + this.panelMiscBorder.Controls.Add(this.pictureBoxMisc); + this.panelMiscBorder.Location = new System.Drawing.Point(3, 6); + this.panelMiscBorder.Margin = new System.Windows.Forms.Padding(2); + this.panelMiscBorder.Name = "panelMiscBorder"; + this.panelMiscBorder.Size = new System.Drawing.Size(57, 55); + this.panelMiscBorder.TabIndex = 4; + // + // pictureBoxMisc + // + this.pictureBoxMisc.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.pictureBoxMisc.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High; + this.pictureBoxMisc.Location = new System.Drawing.Point(3, 3); + this.pictureBoxMisc.Margin = new System.Windows.Forms.Padding(2); + this.pictureBoxMisc.MaximumSize = new System.Drawing.Size(133, 130); + this.pictureBoxMisc.Name = "pictureBoxMisc"; + this.pictureBoxMisc.Size = new System.Drawing.Size(51, 50); + this.pictureBoxMisc.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom; + this.pictureBoxMisc.TabIndex = 0; + this.pictureBoxMisc.TabStop = false; + // // NoTearFlowLayoutPanelMisc // this.NoTearFlowLayoutPanelMisc.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) @@ -1116,39 +1243,40 @@ private void InitializeComponent() this.NoTearFlowLayoutPanelMisc.Location = new System.Drawing.Point(64, 5); this.NoTearFlowLayoutPanelMisc.Margin = new System.Windows.Forms.Padding(2); this.NoTearFlowLayoutPanelMisc.Name = "NoTearFlowLayoutPanelMisc"; - this.NoTearFlowLayoutPanelMisc.Size = new System.Drawing.Size(702, 180); + this.NoTearFlowLayoutPanelMisc.Size = new System.Drawing.Size(718, 193); this.NoTearFlowLayoutPanelMisc.TabIndex = 5; // - // panelMiscBorder - // - this.panelMiscBorder.Controls.Add(this.pictureBoxMisc); - this.panelMiscBorder.Location = new System.Drawing.Point(3, 6); - this.panelMiscBorder.Margin = new System.Windows.Forms.Padding(2); - this.panelMiscBorder.Name = "panelMiscBorder"; - this.panelMiscBorder.Size = new System.Drawing.Size(57, 55); - this.panelMiscBorder.TabIndex = 4; - // // tabPageTriangles // + this.tabPageTriangles.Controls.Add(this.buttonGoToVClosest); this.tabPageTriangles.Controls.Add(this.checkBoxVertexMisalignment); this.tabPageTriangles.Controls.Add(this.buttonRetrieveTriangle); this.tabPageTriangles.Controls.Add(this.buttonGoToV3); this.tabPageTriangles.Controls.Add(this.buttonGoToV2); this.tabPageTriangles.Controls.Add(this.buttonGoToV1); - this.tabPageTriangles.Controls.Add(this.NoTearFlowLayoutPanelTriangles); this.tabPageTriangles.Controls.Add(this.label4); this.tabPageTriangles.Controls.Add(this.maskedTextBoxOtherTriangle); this.tabPageTriangles.Controls.Add(this.radioButtonTriOther); this.tabPageTriangles.Controls.Add(this.radioButtonTriCeiling); this.tabPageTriangles.Controls.Add(this.radioButtonTriWall); this.tabPageTriangles.Controls.Add(this.radioButtonTriFloor); + this.tabPageTriangles.Controls.Add(this.NoTearFlowLayoutPanelTriangles); this.tabPageTriangles.Location = new System.Drawing.Point(4, 22); this.tabPageTriangles.Name = "tabPageTriangles"; this.tabPageTriangles.Padding = new System.Windows.Forms.Padding(3); - this.tabPageTriangles.Size = new System.Drawing.Size(996, 190); + this.tabPageTriangles.Size = new System.Drawing.Size(1012, 202); this.tabPageTriangles.TabIndex = 11; this.tabPageTriangles.Text = "Triangles"; // + // buttonGoToVClosest + // + this.buttonGoToVClosest.Location = new System.Drawing.Point(6, 141); + this.buttonGoToVClosest.Name = "buttonGoToVClosest"; + this.buttonGoToVClosest.Size = new System.Drawing.Size(90, 23); + this.buttonGoToVClosest.TabIndex = 13; + this.buttonGoToVClosest.Text = "Goto Closest"; + this.buttonGoToVClosest.UseVisualStyleBackColor = true; + // // checkBoxVertexMisalignment // this.checkBoxVertexMisalignment.AutoSize = true; @@ -1161,27 +1289,27 @@ private void InitializeComponent() // // buttonRetrieveTriangle // - this.buttonRetrieveTriangle.Location = new System.Drawing.Point(88, 141); + this.buttonRetrieveTriangle.Location = new System.Drawing.Point(102, 141); this.buttonRetrieveTriangle.Name = "buttonRetrieveTriangle"; - this.buttonRetrieveTriangle.Size = new System.Drawing.Size(75, 23); + this.buttonRetrieveTriangle.Size = new System.Drawing.Size(84, 23); this.buttonRetrieveTriangle.TabIndex = 11; this.buttonRetrieveTriangle.Text = "Retrieve"; this.buttonRetrieveTriangle.UseVisualStyleBackColor = true; // // buttonGoToV3 // - this.buttonGoToV3.Location = new System.Drawing.Point(6, 141); + this.buttonGoToV3.Location = new System.Drawing.Point(130, 112); this.buttonGoToV3.Name = "buttonGoToV3"; - this.buttonGoToV3.Size = new System.Drawing.Size(75, 23); + this.buttonGoToV3.Size = new System.Drawing.Size(56, 23); this.buttonGoToV3.TabIndex = 10; this.buttonGoToV3.Text = "Goto V3"; this.buttonGoToV3.UseVisualStyleBackColor = true; // // buttonGoToV2 // - this.buttonGoToV2.Location = new System.Drawing.Point(87, 112); + this.buttonGoToV2.Location = new System.Drawing.Point(69, 112); this.buttonGoToV2.Name = "buttonGoToV2"; - this.buttonGoToV2.Size = new System.Drawing.Size(75, 23); + this.buttonGoToV2.Size = new System.Drawing.Size(55, 23); this.buttonGoToV2.TabIndex = 9; this.buttonGoToV2.Text = "Goto V2"; this.buttonGoToV2.UseVisualStyleBackColor = true; @@ -1190,24 +1318,11 @@ private void InitializeComponent() // this.buttonGoToV1.Location = new System.Drawing.Point(6, 112); this.buttonGoToV1.Name = "buttonGoToV1"; - this.buttonGoToV1.Size = new System.Drawing.Size(75, 23); + this.buttonGoToV1.Size = new System.Drawing.Size(57, 23); this.buttonGoToV1.TabIndex = 8; this.buttonGoToV1.Text = "Goto V1"; this.buttonGoToV1.UseVisualStyleBackColor = true; // - // NoTearFlowLayoutPanelTriangles - // - this.NoTearFlowLayoutPanelTriangles.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.NoTearFlowLayoutPanelTriangles.AutoScroll = true; - this.NoTearFlowLayoutPanelTriangles.FlowDirection = System.Windows.Forms.FlowDirection.TopDown; - this.NoTearFlowLayoutPanelTriangles.Location = new System.Drawing.Point(167, 5); - this.NoTearFlowLayoutPanelTriangles.Margin = new System.Windows.Forms.Padding(2); - this.NoTearFlowLayoutPanelTriangles.Name = "NoTearFlowLayoutPanelTriangles"; - this.NoTearFlowLayoutPanelTriangles.Size = new System.Drawing.Size(824, 180); - this.NoTearFlowLayoutPanelTriangles.TabIndex = 7; - // // label4 // this.label4.AutoSize = true; @@ -1268,6 +1383,19 @@ private void InitializeComponent() this.radioButtonTriFloor.Text = "Floor"; this.radioButtonTriFloor.UseVisualStyleBackColor = true; // + // NoTearFlowLayoutPanelTriangles + // + this.NoTearFlowLayoutPanelTriangles.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.NoTearFlowLayoutPanelTriangles.AutoScroll = true; + this.NoTearFlowLayoutPanelTriangles.FlowDirection = System.Windows.Forms.FlowDirection.TopDown; + this.NoTearFlowLayoutPanelTriangles.Location = new System.Drawing.Point(191, 5); + this.NoTearFlowLayoutPanelTriangles.Margin = new System.Windows.Forms.Padding(2); + this.NoTearFlowLayoutPanelTriangles.Name = "NoTearFlowLayoutPanelTriangles"; + this.NoTearFlowLayoutPanelTriangles.Size = new System.Drawing.Size(816, 193); + this.NoTearFlowLayoutPanelTriangles.TabIndex = 7; + // // tabPageStars // this.tabPageStars.Controls.Add(this.NoTearFlowLayoutPanel1); @@ -1278,7 +1406,7 @@ private void InitializeComponent() this.tabPageStars.Location = new System.Drawing.Point(4, 22); this.tabPageStars.Name = "tabPageStars"; this.tabPageStars.Padding = new System.Windows.Forms.Padding(3); - this.tabPageStars.Size = new System.Drawing.Size(996, 190); + this.tabPageStars.Size = new System.Drawing.Size(1012, 202); this.tabPageStars.TabIndex = 10; this.tabPageStars.Text = "Stars"; // @@ -1291,7 +1419,7 @@ private void InitializeComponent() this.NoTearFlowLayoutPanel1.FlowDirection = System.Windows.Forms.FlowDirection.TopDown; this.NoTearFlowLayoutPanel1.Location = new System.Drawing.Point(63, 7); this.NoTearFlowLayoutPanel1.Name = "NoTearFlowLayoutPanel1"; - this.NoTearFlowLayoutPanel1.Size = new System.Drawing.Size(927, 177); + this.NoTearFlowLayoutPanel1.Size = new System.Drawing.Size(943, 190); this.NoTearFlowLayoutPanel1.TabIndex = 4; this.NoTearFlowLayoutPanel1.WrapContents = false; // @@ -1344,7 +1472,7 @@ private void InitializeComponent() this.tabPageMap.Margin = new System.Windows.Forms.Padding(2); this.tabPageMap.Name = "tabPageMap"; this.tabPageMap.Padding = new System.Windows.Forms.Padding(2); - this.tabPageMap.Size = new System.Drawing.Size(996, 190); + this.tabPageMap.Size = new System.Drawing.Size(1012, 202); this.tabPageMap.TabIndex = 4; this.tabPageMap.Text = "Map"; // @@ -1370,7 +1498,6 @@ private void InitializeComponent() this.splitContainerMap.Panel1.Controls.Add(this.labelMapIconSize); this.splitContainerMap.Panel1.Controls.Add(this.checkBoxMapShowInactive); this.splitContainerMap.Panel1.Controls.Add(this.labelMapZoom); - this.splitContainerMap.Panel1.Controls.Add(this.buttonMapExpand); this.splitContainerMap.Panel1.Controls.Add(this.labelMapId); this.splitContainerMap.Panel1.Controls.Add(this.labelMapSubName); this.splitContainerMap.Panel1.Controls.Add(this.trackBarMapZoom); @@ -1382,8 +1509,8 @@ private void InitializeComponent() this.splitContainerMap.Panel2.Controls.Add(this.labelMapPuValue); this.splitContainerMap.Panel2.Controls.Add(this.labelMapQpu); this.splitContainerMap.Panel2.Controls.Add(this.labelMapQpuValue); - this.splitContainerMap.Size = new System.Drawing.Size(995, 180); - this.splitContainerMap.SplitterDistance = 329; + this.splitContainerMap.Size = new System.Drawing.Size(1011, 193); + this.splitContainerMap.SplitterDistance = 334; this.splitContainerMap.SplitterWidth = 3; this.splitContainerMap.TabIndex = 16; // @@ -1491,21 +1618,10 @@ private void InitializeComponent() this.labelMapZoom.TabIndex = 12; this.labelMapZoom.Text = "Zoom:"; // - // buttonMapExpand - // - this.buttonMapExpand.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.buttonMapExpand.Location = new System.Drawing.Point(3, 152); - this.buttonMapExpand.Name = "buttonMapExpand"; - this.buttonMapExpand.Size = new System.Drawing.Size(90, 23); - this.buttonMapExpand.TabIndex = 11; - this.buttonMapExpand.Text = "Expand Map"; - this.buttonMapExpand.UseVisualStyleBackColor = true; - this.buttonMapExpand.Click += new System.EventHandler(this.buttonMapExpand_Click); - // // labelMapId // this.labelMapId.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.labelMapId.Location = new System.Drawing.Point(215, 161); + this.labelMapId.Location = new System.Drawing.Point(220, 174); this.labelMapId.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); this.labelMapId.Name = "labelMapId"; this.labelMapId.Size = new System.Drawing.Size(110, 13); @@ -1544,7 +1660,7 @@ private void InitializeComponent() this.glControlMap.Location = new System.Drawing.Point(4, 3); this.glControlMap.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); this.glControlMap.Name = "glControlMap"; - this.glControlMap.Size = new System.Drawing.Size(676, 154); + this.glControlMap.Size = new System.Drawing.Size(671, 167); this.glControlMap.TabIndex = 0; this.glControlMap.VSync = false; this.glControlMap.Load += new System.EventHandler(this.glControlMap_Load); @@ -1553,7 +1669,7 @@ private void InitializeComponent() // this.labelMapPu.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); this.labelMapPu.AutoSize = true; - this.labelMapPu.Location = new System.Drawing.Point(2, 162); + this.labelMapPu.Location = new System.Drawing.Point(2, 175); this.labelMapPu.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); this.labelMapPu.Name = "labelMapPu"; this.labelMapPu.Size = new System.Drawing.Size(61, 13); @@ -1564,7 +1680,7 @@ private void InitializeComponent() // this.labelMapPuValue.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); this.labelMapPuValue.AutoSize = true; - this.labelMapPuValue.Location = new System.Drawing.Point(67, 162); + this.labelMapPuValue.Location = new System.Drawing.Point(67, 175); this.labelMapPuValue.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); this.labelMapPuValue.Name = "labelMapPuValue"; this.labelMapPuValue.Size = new System.Drawing.Size(37, 13); @@ -1575,7 +1691,7 @@ private void InitializeComponent() // this.labelMapQpu.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); this.labelMapQpu.AutoSize = true; - this.labelMapQpu.Location = new System.Drawing.Point(123, 162); + this.labelMapQpu.Location = new System.Drawing.Point(123, 175); this.labelMapQpu.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); this.labelMapQpu.Name = "labelMapQpu"; this.labelMapQpu.Size = new System.Drawing.Size(69, 13); @@ -1586,7 +1702,7 @@ private void InitializeComponent() // this.labelMapQpuValue.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); this.labelMapQpuValue.AutoSize = true; - this.labelMapQpuValue.Location = new System.Drawing.Point(196, 162); + this.labelMapQpuValue.Location = new System.Drawing.Point(196, 175); this.labelMapQpuValue.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); this.labelMapQpuValue.Name = "labelMapQpuValue"; this.labelMapQpuValue.Size = new System.Drawing.Size(37, 13); @@ -1604,7 +1720,7 @@ private void InitializeComponent() this.tabPageExpressions.Location = new System.Drawing.Point(4, 22); this.tabPageExpressions.Margin = new System.Windows.Forms.Padding(2); this.tabPageExpressions.Name = "tabPageExpressions"; - this.tabPageExpressions.Size = new System.Drawing.Size(996, 190); + this.tabPageExpressions.Size = new System.Drawing.Size(1012, 202); this.tabPageExpressions.TabIndex = 2; this.tabPageExpressions.Text = "Expressions"; // @@ -1612,7 +1728,7 @@ private void InitializeComponent() // this.checkBoxAbsoluteAddress.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); this.checkBoxAbsoluteAddress.AutoSize = true; - this.checkBoxAbsoluteAddress.Location = new System.Drawing.Point(861, 169); + this.checkBoxAbsoluteAddress.Location = new System.Drawing.Point(877, 182); this.checkBoxAbsoluteAddress.Margin = new System.Windows.Forms.Padding(2); this.checkBoxAbsoluteAddress.Name = "checkBoxAbsoluteAddress"; this.checkBoxAbsoluteAddress.Size = new System.Drawing.Size(134, 17); @@ -1623,7 +1739,7 @@ private void InitializeComponent() // buttonOtherDelete // this.buttonOtherDelete.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.buttonOtherDelete.Location = new System.Drawing.Point(106, 167); + this.buttonOtherDelete.Location = new System.Drawing.Point(106, 180); this.buttonOtherDelete.Margin = new System.Windows.Forms.Padding(2); this.buttonOtherDelete.Name = "buttonOtherDelete"; this.buttonOtherDelete.Size = new System.Drawing.Size(48, 21); @@ -1635,7 +1751,7 @@ private void InitializeComponent() // buttonOtherModify // this.buttonOtherModify.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.buttonOtherModify.Location = new System.Drawing.Point(54, 167); + this.buttonOtherModify.Location = new System.Drawing.Point(54, 180); this.buttonOtherModify.Margin = new System.Windows.Forms.Padding(2); this.buttonOtherModify.Name = "buttonOtherModify"; this.buttonOtherModify.Size = new System.Drawing.Size(48, 21); @@ -1647,7 +1763,7 @@ private void InitializeComponent() // buttonOtherAdd // this.buttonOtherAdd.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.buttonOtherAdd.Location = new System.Drawing.Point(2, 167); + this.buttonOtherAdd.Location = new System.Drawing.Point(2, 180); this.buttonOtherAdd.Margin = new System.Windows.Forms.Padding(2); this.buttonOtherAdd.Name = "buttonOtherAdd"; this.buttonOtherAdd.Size = new System.Drawing.Size(48, 21); @@ -1674,13 +1790,14 @@ private void InitializeComponent() this.dataGridViewExpressions.RowTemplate.Height = 20; this.dataGridViewExpressions.ScrollBars = System.Windows.Forms.ScrollBars.Vertical; this.dataGridViewExpressions.SelectionMode = System.Windows.Forms.DataGridViewSelectionMode.FullRowSelect; - this.dataGridViewExpressions.Size = new System.Drawing.Size(994, 160); + this.dataGridViewExpressions.Size = new System.Drawing.Size(1010, 173); this.dataGridViewExpressions.TabIndex = 0; this.dataGridViewExpressions.CellMouseDoubleClick += new System.Windows.Forms.DataGridViewCellMouseEventHandler(this.dataGridViewOther_CellMouseDoubleClick); // // tabPageDisassembly // this.tabPageDisassembly.BackColor = System.Drawing.Color.Transparent; + this.tabPageDisassembly.Controls.Add(this.buttonDisMore); this.tabPageDisassembly.Controls.Add(this.buttonDisGo); this.tabPageDisassembly.Controls.Add(this.maskedTextBoxDisStart); this.tabPageDisassembly.Controls.Add(this.labelDisStart); @@ -1688,24 +1805,33 @@ private void InitializeComponent() this.tabPageDisassembly.Location = new System.Drawing.Point(4, 22); this.tabPageDisassembly.Margin = new System.Windows.Forms.Padding(2); this.tabPageDisassembly.Name = "tabPageDisassembly"; - this.tabPageDisassembly.Size = new System.Drawing.Size(996, 190); + this.tabPageDisassembly.Size = new System.Drawing.Size(1012, 202); this.tabPageDisassembly.TabIndex = 3; this.tabPageDisassembly.Text = "Disassembly"; // + // buttonDisMore + // + this.buttonDisMore.Location = new System.Drawing.Point(237, 2); + this.buttonDisMore.Margin = new System.Windows.Forms.Padding(2); + this.buttonDisMore.Name = "buttonDisMore"; + this.buttonDisMore.Size = new System.Drawing.Size(50, 20); + this.buttonDisMore.TabIndex = 6; + this.buttonDisMore.Text = "More"; + this.buttonDisMore.UseVisualStyleBackColor = true; + this.buttonDisMore.Visible = false; + // // buttonDisGo // - this.buttonDisGo.Enabled = false; this.buttonDisGo.Location = new System.Drawing.Point(171, 2); this.buttonDisGo.Margin = new System.Windows.Forms.Padding(2); this.buttonDisGo.Name = "buttonDisGo"; - this.buttonDisGo.Size = new System.Drawing.Size(50, 20); + this.buttonDisGo.Size = new System.Drawing.Size(62, 20); this.buttonDisGo.TabIndex = 5; this.buttonDisGo.Text = "Go"; this.buttonDisGo.UseVisualStyleBackColor = true; // // maskedTextBoxDisStart // - this.maskedTextBoxDisStart.Enabled = false; this.maskedTextBoxDisStart.Location = new System.Drawing.Point(79, 2); this.maskedTextBoxDisStart.Margin = new System.Windows.Forms.Padding(2); this.maskedTextBoxDisStart.Mask = "\\0xaaAAAAAA"; @@ -1733,10 +1859,175 @@ private void InitializeComponent() this.richTextBoxDissasembly.Margin = new System.Windows.Forms.Padding(2); this.richTextBoxDissasembly.Name = "richTextBoxDissasembly"; this.richTextBoxDissasembly.ReadOnly = true; - this.richTextBoxDissasembly.Size = new System.Drawing.Size(991, 162); + this.richTextBoxDissasembly.Size = new System.Drawing.Size(1007, 175); this.richTextBoxDissasembly.TabIndex = 0; this.richTextBoxDissasembly.Text = ""; // + // tabPageHacks + // + this.tabPageHacks.Controls.Add(this.splitContainerHacks); + this.tabPageHacks.Location = new System.Drawing.Point(4, 22); + this.tabPageHacks.Name = "tabPageHacks"; + this.tabPageHacks.Padding = new System.Windows.Forms.Padding(3); + this.tabPageHacks.Size = new System.Drawing.Size(1012, 202); + this.tabPageHacks.TabIndex = 12; + this.tabPageHacks.Text = "Hacks"; + // + // splitContainerHacks + // + this.splitContainerHacks.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.splitContainerHacks.Location = new System.Drawing.Point(6, 3); + this.splitContainerHacks.Name = "splitContainerHacks"; + // + // splitContainerHacks.Panel1 + // + this.splitContainerHacks.Panel1.Controls.Add(this.groupBoxHackRam); + // + // splitContainerHacks.Panel2 + // + this.splitContainerHacks.Panel2.Controls.Add(this.groupBoxHackSpawn); + this.splitContainerHacks.Size = new System.Drawing.Size(1003, 196); + this.splitContainerHacks.SplitterDistance = 334; + this.splitContainerHacks.TabIndex = 14; + // + // groupBoxHackRam + // + this.groupBoxHackRam.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.groupBoxHackRam.Controls.Add(this.labelPureInterpretterRequire); + this.groupBoxHackRam.Controls.Add(this.checkedListBoxHacks); + this.groupBoxHackRam.Location = new System.Drawing.Point(3, 3); + this.groupBoxHackRam.Name = "groupBoxHackRam"; + this.groupBoxHackRam.Size = new System.Drawing.Size(328, 190); + this.groupBoxHackRam.TabIndex = 13; + this.groupBoxHackRam.TabStop = false; + this.groupBoxHackRam.Text = "RAM Hacks*"; + // + // labelPureInterpretterRequire + // + this.labelPureInterpretterRequire.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.labelPureInterpretterRequire.AutoSize = true; + this.labelPureInterpretterRequire.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.labelPureInterpretterRequire.Location = new System.Drawing.Point(199, 1); + this.labelPureInterpretterRequire.Name = "labelPureInterpretterRequire"; + this.labelPureInterpretterRequire.Size = new System.Drawing.Size(129, 13); + this.labelPureInterpretterRequire.TabIndex = 8; + this.labelPureInterpretterRequire.Text = "*Requires Pure Interpreter"; + // + // checkedListBoxHacks + // + this.checkedListBoxHacks.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.checkedListBoxHacks.FormattingEnabled = true; + this.checkedListBoxHacks.Location = new System.Drawing.Point(6, 19); + this.checkedListBoxHacks.Name = "checkedListBoxHacks"; + this.checkedListBoxHacks.Size = new System.Drawing.Size(316, 124); + this.checkedListBoxHacks.TabIndex = 9; + // + // groupBoxHackSpawn + // + this.groupBoxHackSpawn.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.groupBoxHackSpawn.Controls.Add(this.labelSpawnHint); + this.groupBoxHackSpawn.Controls.Add(this.buttonSpawnReset); + this.groupBoxHackSpawn.Controls.Add(this.labelSpawnExtra); + this.groupBoxHackSpawn.Controls.Add(this.labelSpawnGfxId); + this.groupBoxHackSpawn.Controls.Add(this.textBoxSpawnExtra); + this.groupBoxHackSpawn.Controls.Add(this.textBoxSpawnGfxId); + this.groupBoxHackSpawn.Controls.Add(this.buttonHackSpawn); + this.groupBoxHackSpawn.Controls.Add(this.listBoxSpawn); + this.groupBoxHackSpawn.Location = new System.Drawing.Point(4, 4); + this.groupBoxHackSpawn.Name = "groupBoxHackSpawn"; + this.groupBoxHackSpawn.Size = new System.Drawing.Size(658, 189); + this.groupBoxHackSpawn.TabIndex = 0; + this.groupBoxHackSpawn.TabStop = false; + this.groupBoxHackSpawn.Text = "Spawner"; + // + // labelSpawnHint + // + this.labelSpawnHint.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.labelSpawnHint.AutoSize = true; + this.labelSpawnHint.Location = new System.Drawing.Point(315, 168); + this.labelSpawnHint.Name = "labelSpawnHint"; + this.labelSpawnHint.Size = new System.Drawing.Size(127, 13); + this.labelSpawnHint.TabIndex = 25; + this.labelSpawnHint.Text = "(Press L button to spawn)"; + // + // buttonSpawnReset + // + this.buttonSpawnReset.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.buttonSpawnReset.Location = new System.Drawing.Point(542, 164); + this.buttonSpawnReset.Margin = new System.Windows.Forms.Padding(2); + this.buttonSpawnReset.Name = "buttonSpawnReset"; + this.buttonSpawnReset.Size = new System.Drawing.Size(110, 21); + this.buttonSpawnReset.TabIndex = 24; + this.buttonSpawnReset.Text = "Reset (Turn Off)"; + this.buttonSpawnReset.UseVisualStyleBackColor = true; + // + // labelSpawnExtra + // + this.labelSpawnExtra.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.labelSpawnExtra.AutoSize = true; + this.labelSpawnExtra.Location = new System.Drawing.Point(109, 167); + this.labelSpawnExtra.Name = "labelSpawnExtra"; + this.labelSpawnExtra.Size = new System.Drawing.Size(34, 13); + this.labelSpawnExtra.TabIndex = 23; + this.labelSpawnExtra.Text = "Extra:"; + // + // labelSpawnGfxId + // + this.labelSpawnGfxId.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.labelSpawnGfxId.AutoSize = true; + this.labelSpawnGfxId.Location = new System.Drawing.Point(6, 168); + this.labelSpawnGfxId.Name = "labelSpawnGfxId"; + this.labelSpawnGfxId.Size = new System.Drawing.Size(45, 13); + this.labelSpawnGfxId.TabIndex = 22; + this.labelSpawnGfxId.Text = "GFX ID:"; + // + // textBoxSpawnExtra + // + this.textBoxSpawnExtra.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.textBoxSpawnExtra.Location = new System.Drawing.Point(149, 164); + this.textBoxSpawnExtra.Name = "textBoxSpawnExtra"; + this.textBoxSpawnExtra.Size = new System.Drawing.Size(46, 20); + this.textBoxSpawnExtra.TabIndex = 21; + // + // textBoxSpawnGfxId + // + this.textBoxSpawnGfxId.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.textBoxSpawnGfxId.Location = new System.Drawing.Point(57, 164); + this.textBoxSpawnGfxId.Name = "textBoxSpawnGfxId"; + this.textBoxSpawnGfxId.Size = new System.Drawing.Size(46, 20); + this.textBoxSpawnGfxId.TabIndex = 20; + // + // buttonHackSpawn + // + this.buttonHackSpawn.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.buttonHackSpawn.Location = new System.Drawing.Point(200, 164); + this.buttonHackSpawn.Margin = new System.Windows.Forms.Padding(2); + this.buttonHackSpawn.Name = "buttonHackSpawn"; + this.buttonHackSpawn.Size = new System.Drawing.Size(110, 21); + this.buttonHackSpawn.TabIndex = 19; + this.buttonHackSpawn.Text = "Set Spawn Type"; + this.buttonHackSpawn.UseVisualStyleBackColor = true; + // + // listBoxSpawn + // + this.listBoxSpawn.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.listBoxSpawn.FormattingEnabled = true; + this.listBoxSpawn.Location = new System.Drawing.Point(6, 19); + this.listBoxSpawn.Name = "listBoxSpawn"; + this.listBoxSpawn.Size = new System.Drawing.Size(646, 108); + this.listBoxSpawn.Sorted = true; + this.listBoxSpawn.TabIndex = 12; + // // tabPageOptions // this.tabPageOptions.Controls.Add(this.checkBoxUseOverlays); @@ -1747,7 +2038,7 @@ private void InitializeComponent() this.tabPageOptions.Location = new System.Drawing.Point(4, 22); this.tabPageOptions.Margin = new System.Windows.Forms.Padding(2); this.tabPageOptions.Name = "tabPageOptions"; - this.tabPageOptions.Size = new System.Drawing.Size(996, 190); + this.tabPageOptions.Size = new System.Drawing.Size(1012, 202); this.tabPageOptions.TabIndex = 5; this.tabPageOptions.Text = "Options"; // @@ -1809,165 +2100,157 @@ private void InitializeComponent() this.checkBoxStartSlotIndexOne.Text = "Start Slot Index From 1"; this.checkBoxStartSlotIndexOne.UseVisualStyleBackColor = true; // - // tabPageHacks - // - this.tabPageHacks.Controls.Add(this.label5); - this.tabPageHacks.Controls.Add(this.labelPureInterpretterRequire); - this.tabPageHacks.Controls.Add(this.checkedListBoxHacks); - this.tabPageHacks.Location = new System.Drawing.Point(4, 22); - this.tabPageHacks.Name = "tabPageHacks"; - this.tabPageHacks.Padding = new System.Windows.Forms.Padding(3); - this.tabPageHacks.Size = new System.Drawing.Size(996, 190); - this.tabPageHacks.TabIndex = 12; - this.tabPageHacks.Text = "Hacks"; - // - // label5 - // - this.label5.AutoSize = true; - this.label5.Location = new System.Drawing.Point(6, 3); - this.label5.Name = "label5"; - this.label5.Size = new System.Drawing.Size(71, 13); - this.label5.TabIndex = 10; - this.label5.Text = "ROM hacks*:"; - // - // labelPureInterpretterRequire - // - this.labelPureInterpretterRequire.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); - this.labelPureInterpretterRequire.AutoSize = true; - this.labelPureInterpretterRequire.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.labelPureInterpretterRequire.Location = new System.Drawing.Point(861, 3); - this.labelPureInterpretterRequire.Name = "labelPureInterpretterRequire"; - this.labelPureInterpretterRequire.Size = new System.Drawing.Size(129, 13); - this.labelPureInterpretterRequire.TabIndex = 8; - this.labelPureInterpretterRequire.Text = "*Requires Pure Interpreter"; - // - // checkedListBoxHacks - // - this.checkedListBoxHacks.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.checkedListBoxHacks.FormattingEnabled = true; - this.checkedListBoxHacks.Location = new System.Drawing.Point(3, 19); - this.checkedListBoxHacks.Name = "checkedListBoxHacks"; - this.checkedListBoxHacks.Size = new System.Drawing.Size(987, 154); - this.checkedListBoxHacks.TabIndex = 9; - // // labelVersionNumber // this.labelVersionNumber.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); this.labelVersionNumber.AutoSize = true; - this.labelVersionNumber.Location = new System.Drawing.Point(983, 6); + this.labelVersionNumber.Location = new System.Drawing.Point(991, 15); this.labelVersionNumber.Name = "labelVersionNumber"; this.labelVersionNumber.Size = new System.Drawing.Size(41, 13); this.labelVersionNumber.TabIndex = 5; this.labelVersionNumber.Text = "version"; this.labelVersionNumber.TextAlign = System.Drawing.ContentAlignment.TopRight; // - // pictureBoxObject - // - this.pictureBoxObject.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.pictureBoxObject.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High; - this.pictureBoxObject.Location = new System.Drawing.Point(3, 3); - this.pictureBoxObject.Margin = new System.Windows.Forms.Padding(2); - this.pictureBoxObject.MaximumSize = new System.Drawing.Size(133, 130); - this.pictureBoxObject.Name = "pictureBoxObject"; - this.pictureBoxObject.Size = new System.Drawing.Size(51, 50); - this.pictureBoxObject.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom; - this.pictureBoxObject.TabIndex = 0; - this.pictureBoxObject.TabStop = false; - // - // pictureBoxMario - // - this.pictureBoxMario.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.pictureBoxMario.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High; - this.pictureBoxMario.Location = new System.Drawing.Point(3, 3); - this.pictureBoxMario.Margin = new System.Windows.Forms.Padding(2); - this.pictureBoxMario.MaximumSize = new System.Drawing.Size(133, 130); - this.pictureBoxMario.Name = "pictureBoxMario"; - this.pictureBoxMario.Size = new System.Drawing.Size(51, 50); - this.pictureBoxMario.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom; - this.pictureBoxMario.TabIndex = 0; - this.pictureBoxMario.TabStop = false; - // - // pictureBoxHud - // - this.pictureBoxHud.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.pictureBoxHud.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High; - this.pictureBoxHud.Location = new System.Drawing.Point(3, 3); - this.pictureBoxHud.Margin = new System.Windows.Forms.Padding(2); - this.pictureBoxHud.MaximumSize = new System.Drawing.Size(133, 130); - this.pictureBoxHud.Name = "pictureBoxHud"; - this.pictureBoxHud.Size = new System.Drawing.Size(51, 50); - this.pictureBoxHud.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom; - this.pictureBoxHud.TabIndex = 0; - this.pictureBoxHud.TabStop = false; - // - // pictureBoxCamera - // - this.pictureBoxCamera.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.pictureBoxCamera.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High; - this.pictureBoxCamera.Location = new System.Drawing.Point(3, 3); - this.pictureBoxCamera.Margin = new System.Windows.Forms.Padding(2); - this.pictureBoxCamera.MaximumSize = new System.Drawing.Size(133, 130); - this.pictureBoxCamera.Name = "pictureBoxCamera"; - this.pictureBoxCamera.Size = new System.Drawing.Size(51, 50); - this.pictureBoxCamera.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom; - this.pictureBoxCamera.TabIndex = 0; - this.pictureBoxCamera.TabStop = false; - // - // pictureBoxDebug - // - this.pictureBoxDebug.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.pictureBoxDebug.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High; - this.pictureBoxDebug.Location = new System.Drawing.Point(2, 2); - this.pictureBoxDebug.Margin = new System.Windows.Forms.Padding(2); - this.pictureBoxDebug.MaximumSize = new System.Drawing.Size(133, 130); - this.pictureBoxDebug.Name = "pictureBoxDebug"; - this.pictureBoxDebug.Size = new System.Drawing.Size(51, 50); - this.pictureBoxDebug.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom; - this.pictureBoxDebug.TabIndex = 0; - this.pictureBoxDebug.TabStop = false; - // - // pictureBoxMisc - // - this.pictureBoxMisc.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.pictureBoxMisc.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High; - this.pictureBoxMisc.Location = new System.Drawing.Point(3, 3); - this.pictureBoxMisc.Margin = new System.Windows.Forms.Padding(2); - this.pictureBoxMisc.MaximumSize = new System.Drawing.Size(133, 130); - this.pictureBoxMisc.Name = "pictureBoxMisc"; - this.pictureBoxMisc.Size = new System.Drawing.Size(51, 50); - this.pictureBoxMisc.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom; - this.pictureBoxMisc.TabIndex = 0; - this.pictureBoxMisc.TabStop = false; + // buttonDisconnect + // + this.buttonDisconnect.Location = new System.Drawing.Point(11, 11); + this.buttonDisconnect.Margin = new System.Windows.Forms.Padding(2); + this.buttonDisconnect.Name = "buttonDisconnect"; + this.buttonDisconnect.Size = new System.Drawing.Size(72, 21); + this.buttonDisconnect.TabIndex = 17; + this.buttonDisconnect.Text = "Disconnect"; + this.buttonDisconnect.UseVisualStyleBackColor = true; + this.buttonDisconnect.Click += new System.EventHandler(this.buttonDisconnect_Click); + // + // panelConnect + // + this.panelConnect.Controls.Add(this.buttonRefresh); + this.panelConnect.Controls.Add(this.labelNotConnected); + this.panelConnect.Controls.Add(this.buttonConnect); + this.panelConnect.Controls.Add(this.listBoxProcessesList); + this.panelConnect.Location = new System.Drawing.Point(246, 12); + this.panelConnect.Name = "panelConnect"; + this.panelConnect.Size = new System.Drawing.Size(467, 19); + this.panelConnect.TabIndex = 17; + // + // buttonRefresh + // + this.buttonRefresh.Anchor = System.Windows.Forms.AnchorStyles.None; + this.buttonRefresh.Location = new System.Drawing.Point(147, 105); + this.buttonRefresh.Name = "buttonRefresh"; + this.buttonRefresh.Size = new System.Drawing.Size(75, 23); + this.buttonRefresh.TabIndex = 3; + this.buttonRefresh.Text = "Refresh"; + this.buttonRefresh.UseVisualStyleBackColor = true; + this.buttonRefresh.Click += new System.EventHandler(this.buttonRefresh_Click); + // + // labelNotConnected + // + this.labelNotConnected.Anchor = System.Windows.Forms.AnchorStyles.None; + this.labelNotConnected.AutoSize = true; + this.labelNotConnected.Font = new System.Drawing.Font("Microsoft Sans Serif", 16F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.labelNotConnected.Location = new System.Drawing.Point(154, -112); + this.labelNotConnected.Name = "labelNotConnected"; + this.labelNotConnected.Size = new System.Drawing.Size(157, 26); + this.labelNotConnected.TabIndex = 2; + this.labelNotConnected.Text = "Not Connected"; + // + // buttonConnect + // + this.buttonConnect.Anchor = System.Windows.Forms.AnchorStyles.None; + this.buttonConnect.Location = new System.Drawing.Point(244, 105); + this.buttonConnect.Name = "buttonConnect"; + this.buttonConnect.Size = new System.Drawing.Size(75, 23); + this.buttonConnect.TabIndex = 1; + this.buttonConnect.Text = "Connect"; + this.buttonConnect.UseVisualStyleBackColor = true; + this.buttonConnect.Click += new System.EventHandler(this.buttonConnect_Click); + // + // listBoxProcessesList + // + this.listBoxProcessesList.Anchor = System.Windows.Forms.AnchorStyles.None; + this.listBoxProcessesList.FormattingEnabled = true; + this.listBoxProcessesList.Location = new System.Drawing.Point(147, -62); + this.listBoxProcessesList.Name = "listBoxProcessesList"; + this.listBoxProcessesList.Size = new System.Drawing.Size(172, 147); + this.listBoxProcessesList.TabIndex = 0; + // + // labelFpsCounter + // + this.labelFpsCounter.AutoSize = true; + this.labelFpsCounter.Location = new System.Drawing.Point(88, 15); + this.labelFpsCounter.Name = "labelFpsCounter"; + this.labelFpsCounter.Size = new System.Drawing.Size(39, 13); + this.labelFpsCounter.TabIndex = 18; + this.labelFpsCounter.Text = "FPS: 0"; + // + // buttonCollapseTop + // + this.buttonCollapseTop.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.buttonCollapseTop.BackgroundImage = ((System.Drawing.Image)(resources.GetObject("buttonCollapseTop.BackgroundImage"))); + this.buttonCollapseTop.BackgroundImageLayout = System.Windows.Forms.ImageLayout.None; + this.buttonCollapseTop.Location = new System.Drawing.Point(962, 11); + this.buttonCollapseTop.Margin = new System.Windows.Forms.Padding(2); + this.buttonCollapseTop.Name = "buttonCollapseTop"; + this.buttonCollapseTop.Size = new System.Drawing.Size(24, 21); + this.buttonCollapseTop.TabIndex = 19; + this.buttonCollapseTop.UseVisualStyleBackColor = true; + this.buttonCollapseTop.Click += new System.EventHandler(this.buttonCollapseTop_Click); + // + // buttonCollapseBottom + // + this.buttonCollapseBottom.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.buttonCollapseBottom.BackgroundImage = ((System.Drawing.Image)(resources.GetObject("buttonCollapseBottom.BackgroundImage"))); + this.buttonCollapseBottom.BackgroundImageLayout = System.Windows.Forms.ImageLayout.None; + this.buttonCollapseBottom.Location = new System.Drawing.Point(934, 11); + this.buttonCollapseBottom.Margin = new System.Windows.Forms.Padding(2); + this.buttonCollapseBottom.Name = "buttonCollapseBottom"; + this.buttonCollapseBottom.Size = new System.Drawing.Size(24, 21); + this.buttonCollapseBottom.TabIndex = 20; + this.buttonCollapseBottom.UseVisualStyleBackColor = true; + this.buttonCollapseBottom.Click += new System.EventHandler(this.buttonCollapseBottom_Click); + // + // buttonReadOnly + // + this.buttonReadOnly.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.buttonReadOnly.Location = new System.Drawing.Point(798, 11); + this.buttonReadOnly.Margin = new System.Windows.Forms.Padding(2); + this.buttonReadOnly.Name = "buttonReadOnly"; + this.buttonReadOnly.Size = new System.Drawing.Size(132, 21); + this.buttonReadOnly.TabIndex = 21; + this.buttonReadOnly.Tag = ""; + this.buttonReadOnly.Text = "Disable Read-only"; + this.buttonReadOnly.UseVisualStyleBackColor = true; + this.buttonReadOnly.Click += new System.EventHandler(this.buttonReadOnly_Click); + // + // buttonMarioVisibility + // + this.buttonMarioVisibility.Location = new System.Drawing.Point(3, 112); + this.buttonMarioVisibility.Name = "buttonMarioVisibility"; + this.buttonMarioVisibility.Size = new System.Drawing.Size(75, 42); + this.buttonMarioVisibility.TabIndex = 3; + this.buttonMarioVisibility.Text = "Toggle Visibility"; + this.buttonMarioVisibility.UseVisualStyleBackColor = true; // // StroopMainForm // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(1028, 728); + this.ClientSize = new System.Drawing.Size(1044, 741); + this.Controls.Add(this.panelConnect); + this.Controls.Add(this.buttonDisconnect); this.Controls.Add(this.labelVersionNumber); this.Controls.Add(this.splitContainerMain); - this.Controls.Add(this.buttonPauseResume); this.Controls.Add(this.labelProcessSelect); - this.Controls.Add(this.comboBoxProcessSelection); + this.Controls.Add(this.labelFpsCounter); + this.Controls.Add(this.buttonCollapseBottom); + this.Controls.Add(this.buttonCollapseTop); + this.Controls.Add(this.buttonReadOnly); this.DoubleBuffered = true; this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); this.Margin = new System.Windows.Forms.Padding(2); this.Name = "StroopMainForm"; - this.Text = "Stroop"; + this.Text = "STROOP"; this.Load += new System.EventHandler(this.StroopMainForm_Load); this.groupBoxObjects.ResumeLayout(false); this.groupBoxObjects.PerformLayout(); @@ -1980,21 +2263,27 @@ private void InitializeComponent() this.tabPageObjects.ResumeLayout(false); this.tabPageObjects.PerformLayout(); this.panelObjectBorder.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.pictureBoxObject)).EndInit(); this.tabPageMario.ResumeLayout(false); this.panelMarioBorder.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.pictureBoxMario)).EndInit(); this.tabPageHud.ResumeLayout(false); this.panelHudBorder.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.pictureBoxHud)).EndInit(); this.tabPageCamera.ResumeLayout(false); this.panelCameraBorder.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.pictureBoxCamera)).EndInit(); this.tabPageDebug.ResumeLayout(false); this.tabPageDebug.PerformLayout(); this.NoTearFlowLayoutPanelDebugDisplayType.ResumeLayout(false); this.NoTearFlowLayoutPanelDebugDisplayType.PerformLayout(); this.panelDebugBorder.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.pictureBoxDebug)).EndInit(); this.tabPageMisc.ResumeLayout(false); this.groupBoxPuController.ResumeLayout(false); this.groupBoxPuController.PerformLayout(); this.panelMiscBorder.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.pictureBoxMisc)).EndInit(); this.tabPageTriangles.ResumeLayout(false); this.tabPageTriangles.PerformLayout(); this.tabPageStars.ResumeLayout(false); @@ -2013,30 +2302,30 @@ private void InitializeComponent() ((System.ComponentModel.ISupportInitialize)(this.dataGridViewExpressions)).EndInit(); this.tabPageDisassembly.ResumeLayout(false); this.tabPageDisassembly.PerformLayout(); + this.tabPageHacks.ResumeLayout(false); + this.splitContainerHacks.Panel1.ResumeLayout(false); + this.splitContainerHacks.Panel2.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.splitContainerHacks)).EndInit(); + this.splitContainerHacks.ResumeLayout(false); + this.groupBoxHackRam.ResumeLayout(false); + this.groupBoxHackRam.PerformLayout(); + this.groupBoxHackSpawn.ResumeLayout(false); + this.groupBoxHackSpawn.PerformLayout(); this.tabPageOptions.ResumeLayout(false); this.tabPageOptions.PerformLayout(); - this.tabPageHacks.ResumeLayout(false); - this.tabPageHacks.PerformLayout(); - ((System.ComponentModel.ISupportInitialize)(this.pictureBoxObject)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.pictureBoxMario)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.pictureBoxHud)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.pictureBoxCamera)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.pictureBoxDebug)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.pictureBoxMisc)).EndInit(); + this.panelConnect.ResumeLayout(false); + this.panelConnect.PerformLayout(); this.ResumeLayout(false); this.PerformLayout(); } #endregion - - private System.Windows.Forms.ComboBox comboBoxProcessSelection; private System.Windows.Forms.Label labelProcessSelect; private System.Windows.Forms.GroupBox groupBoxObjects; private System.Windows.Forms.ComboBox comboBoxSortMethod; private System.Windows.Forms.Label labelSortMethod; private NoTearFlowLayoutPanel NoTearFlowLayoutPanelObjects; - private System.Windows.Forms.Button buttonPauseResume; private System.Windows.Forms.SplitContainer splitContainerMain; private System.Windows.Forms.CheckBox checkBoxObjLockLabels; private System.Windows.Forms.TabControl tabControlMain; @@ -2085,7 +2374,6 @@ private void InitializeComponent() private System.Windows.Forms.Label labelVersionNumber; private System.Windows.Forms.TrackBar trackBarMapIconSize; private System.Windows.Forms.TrackBar trackBarMapZoom; - private System.Windows.Forms.Button buttonMapExpand; private System.Windows.Forms.Label labelMapIconSize; private System.Windows.Forms.Label labelMapZoom; private System.Windows.Forms.CheckBox checkBoxMapShowInactive; @@ -2163,7 +2451,6 @@ private void InitializeComponent() private Button buttonDie; private Button buttonFillHp; private TabPage tabPageHacks; - private Label label5; private CheckedListBox checkedListBoxHacks; private Label labelPureInterpretterRequire; private NoTearFlowLayoutPanel NoTearFlowLayoutPanelDebugDisplayType; @@ -2174,6 +2461,33 @@ private void InitializeComponent() private CheckBox checkBoxVertexMisalignment; private ComboBox comboBoxLabelMethod; private Label labelLabelMethod; + private Button buttonDisconnect; + private Panel panelConnect; + private Button buttonRefresh; + private Label labelNotConnected; + private Button buttonConnect; + private ListBox listBoxProcessesList; + private Button buttonGoToVClosest; + private Button buttonObjRetrieveHome; + private Button buttonObjGoToHome; + private Label labelFpsCounter; + private Button buttonCollapseTop; + private Button buttonCollapseBottom; + private SplitContainer splitContainerHacks; + private GroupBox groupBoxHackRam; + private GroupBox groupBoxHackSpawn; + private ListBox listBoxSpawn; + private Button buttonHackSpawn; + private Label labelSpawnExtra; + private Label labelSpawnGfxId; + private TextBox textBoxSpawnExtra; + private TextBox textBoxSpawnGfxId; + private Label labelSpawnHint; + private Button buttonSpawnReset; + private Button buttonReadOnly; + private Button buttonDisMore; + private Button buttonMarioToggleHandsfree; + private Button buttonMarioVisibility; } } diff --git a/Source/SM64 Diagnostic/StroopMainForm.cs b/Source/SM64 Diagnostic/StroopMainForm.cs index ecbb19c53..acfc87159 100644 --- a/Source/SM64 Diagnostic/StroopMainForm.cs +++ b/Source/SM64 Diagnostic/StroopMainForm.cs @@ -18,7 +18,7 @@ namespace SM64_Diagnostic { public partial class StroopMainForm : Form { - const string _version = "v0.2.7"; + const string _version = "v0.2.8"; ProcessStream _sm64Stream = null; ObjectSlotManagerGui _slotManagerGui = new ObjectSlotManagerGui(); @@ -48,29 +48,22 @@ public partial class StroopMainForm : Form bool _resizing = true, _objSlotResizing = false; int _resizeTimeLeft = 0, _resizeObjSlotTime = 0; - bool _splitterIsExpanded = false; - static int _defaultSplitValue; - public StroopMainForm() { InitializeComponent(); } - private void AttachToProcess(Process process) + private bool AttachToProcess(Process process) { - if (!_sm64Stream.SwitchProcess(process)) + // Find emulator + var emulators = Config.Emulators.Where(e => e.ProcessName.ToLower() == process.ProcessName.ToLower()).ToList(); + + if (emulators.Count > 1) { - MessageBox.Show("Could not attach to process!", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); - return; + MessageBox.Show("Ambigous emulator type", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning); } - } - private void comboBoxProcessSelection_SelectedIndexChanged(object sender, EventArgs e) - { - if (comboBoxProcessSelection.SelectedItem == null) - return; - - AttachToProcess(((ProcessSelection)(comboBoxProcessSelection.SelectedItem)).Process); + return _sm64Stream.SwitchProcess(process, emulators[0]); } private void StroopMainForm_Load(object sender, EventArgs e) @@ -86,10 +79,14 @@ private void StroopMainForm_Load(object sender, EventArgs e) _sm64Stream = new ProcessStream(); _sm64Stream.OnUpdate += OnUpdate; + _sm64Stream.FpsUpdated += _sm64Stream_FpsUpdated; + _sm64Stream.OnDisconnect += _sm64Stream_OnDisconnect; + _sm64Stream.WarnReadonlyOff += _sm64Stream_WarnReadonlyOff; + _sm64Stream.OnClose += _sm64Stream_OnClose; - currentContext.DisassemblyManager = _disManager = new DisassemblyManager(this, richTextBoxDissasembly, maskedTextBoxDisStart, _sm64Stream, buttonDisGo); + currentContext.DisassemblyManager = _disManager = new DisassemblyManager(_sm64Stream, tabPageDisassembly); currentContext.ScriptManager = _scriptManager = new ScriptManager(_sm64Stream, _scriptParser, checkBoxUseRomHack); - currentContext.HackManager = _hackManager = new HackManager(_sm64Stream, _romHacks, checkedListBoxHacks); + currentContext.HackManager = _hackManager = new HackManager(_sm64Stream, _romHacks, _objectAssoc.SpawnHacks, tabPageHacks); // Create map manager MapGui mapGui = new MapGui(); @@ -109,12 +106,12 @@ private void StroopMainForm_Load(object sender, EventArgs e) mapGui.MapShowFloorTriangle = checkBoxMapShowFloor; currentContext.MapManager = _mapManager = new MapManager(_sm64Stream, _mapAssoc, _objectAssoc, mapGui); - currentContext.MarioManager = _marioManager = new MarioManager(_sm64Stream, _marioData, panelMarioBorder, NoTearFlowLayoutPanelMario, _mapManager); + currentContext.MarioManager = _marioManager = new MarioManager(_sm64Stream, _marioData, tabPageMario, NoTearFlowLayoutPanelMario, _mapManager); currentContext.HudManager = _hudManager = new HudManager(_sm64Stream, _hudData, tabPageHud); currentContext.MiscManager = _miscManager = new MiscManager(_sm64Stream, _miscData, NoTearFlowLayoutPanelMisc, groupBoxPuController); currentContext.CameraManager = _cameraManager = new CameraManager(_sm64Stream, _cameraData, NoTearFlowLayoutPanelCamera); currentContext.TriangleManager = _triangleManager = new TriangleManager(_sm64Stream, tabPageTriangles, _triangleData); - currentContext.DebugManager = _debugManager = new DebugManager(); + currentContext.DebugManager = _debugManager = new DebugManager(_sm64Stream, tabPageDebug); // Create object manager var objectGui = new ObjectDataGui() @@ -129,8 +126,10 @@ private void StroopMainForm_Load(object sender, EventArgs e) ObjSlotIndexLabel = labelObjSlotIndValue, ObjSlotPositionLabel = labelObjSlotPosValue, CloneButton = buttonObjClone, - MoveMarioToButton = buttonObjGoTo, - MoveToMarioButton = buttonObjRetrieve, + GoToButton = buttonObjGoTo, + RetrieveButton = buttonObjRetrieve, + GoToHomeButton = buttonObjGoToHome, + RetrieveHomeButton = buttonObjRetrieveHome, UnloadButton = buttonObjUnload }; currentContext.ObjectManager = _objectManager = new ObjectManager(_sm64Stream, _objectAssoc, _objectData, objectGui); @@ -152,19 +151,44 @@ private void StroopMainForm_Load(object sender, EventArgs e) SetupViews(); _resizing = false; - _defaultSplitValue = splitContainerMain.SplitterDistance; labelVersionNumber.Text = _version; // Load process - var processes = GetAvailableProcesses(); - if (processes.Count == 1) - if (MessageBox.Show(String.Format("Found process \"{0}\". Connect?", processes[0].ProcessName), - "Process Found", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes) + buttonRefresh_Click(this, new EventArgs()); + panelConnect.Location = new Point(); + panelConnect.Size = this.Size; + } + + private void _sm64Stream_WarnReadonlyOff(object sender, EventArgs e) + { + Invoke(new Action(() => + { + var dr = MessageBox.Show("Warning! Editing variables and enabling hacks may cause the emulator to freeze. Turn off read-only mode?", + "Turn Off Read-only Mode?", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Warning); + switch (dr) { - var processSelect = new ProcessSelection(processes[0]); - comboBoxProcessSelection.Items.Add(processSelect); - comboBoxProcessSelection.SelectedIndex = 0; + case DialogResult.Yes: + _sm64Stream.Readonly = false; + _sm64Stream.ShowWarning = false; + buttonReadOnly.Text = "Enable Read-only"; + break; + + case DialogResult.No: + _sm64Stream.ShowWarning = false; + break; + + case DialogResult.Cancel: + break; } + })); + } + + private void _sm64Stream_OnDisconnect(object sender, EventArgs e) + { + this.BeginInvoke(new Action(() => { + buttonRefresh_Click(this, new EventArgs()); + panelConnect.Visible = true; + })); } public void LoadConfig(LoadingForm loadingForm) @@ -193,29 +217,22 @@ public void LoadConfig(LoadingForm loadingForm) loadingForm.UpdateStatus("Loading Scripts", statusNum++); _scriptParser = XmlConfigParser.OpenScripts(@"Config/Scripts.xml"); loadingForm.UpdateStatus("Loading Hacks", statusNum++); - _romHacks = XmlConfigParser.OpenHacks(@"Config/Hacks.xml"); + var hacksConfig = XmlConfigParser.OpenHacks(@"Config/Hacks.xml"); + Config.Hacks = hacksConfig.Item1; + _romHacks = hacksConfig.Item2; + loadingForm.UpdateStatus("Loading Mario Actions", statusNum++); + Config.MarioActions = XmlConfigParser.OpenActionTable(@"Config/MarioActions.xml"); loadingForm.UpdateStatus("Finishing", statusNum); } - private void comboBoxProcessSelection_DropDown(object sender, EventArgs e) - { - comboBoxProcessSelection.Items.Clear(); - buttonPauseResume.Text = "Pause"; - - foreach (Process p in GetAvailableProcesses()) - { - comboBoxProcessSelection.Items.Add(new ProcessSelection(p)); - } - } - private List GetAvailableProcesses() { var AvailableProcesses = Process.GetProcesses(); List resortList = new List(); foreach (Process p in AvailableProcesses) { - if (!p.ProcessName.ToLower().Contains(Config.ProcessName.ToLower())) + if (!Config.Emulators.Select(e => e.ProcessName.ToLower()).Any(s => s.Contains(p.ProcessName.ToLower()))) continue; resortList.Add(p); @@ -225,16 +242,27 @@ private List GetAvailableProcesses() private void OnUpdate(object sender, EventArgs e) { - _objectSlotManager.Update(); - _objectManager.Update(tabControlMain.SelectedTab == tabPageObjects); - _marioManager.Update(tabControlMain.SelectedTab == tabPageMario); - _cameraManager.Update(tabControlMain.SelectedTab == tabPageCamera); - _hudManager.Update(tabControlMain.SelectedTab == tabPageHud); - _miscManager.Update(tabControlMain.SelectedTab == tabPageMisc); - _triangleManager.Update(tabControlMain.SelectedTab == tabPageTriangles); - _mapManager?.Update(); - _scriptManager.Update(); - _hackManager.Update(); + Invoke(new Action(() => + { + _objectSlotManager.Update(); + _objectManager.Update(tabControlMain.SelectedTab == tabPageObjects); + _marioManager.Update(tabControlMain.SelectedTab == tabPageMario); + _cameraManager.Update(tabControlMain.SelectedTab == tabPageCamera); + _hudManager.Update(tabControlMain.SelectedTab == tabPageHud); + _miscManager.Update(tabControlMain.SelectedTab == tabPageMisc); + _triangleManager.Update(tabControlMain.SelectedTab == tabPageTriangles); + _mapManager?.Update(); + _scriptManager.Update(); + _hackManager.Update(); + })); + } + + private void _sm64Stream_FpsUpdated(object sender, EventArgs e) + { + BeginInvoke(new Action(() => + { + labelFpsCounter.Text = "FPS: " + (int)_sm64Stream.Fps; + })); } private void SetupViews() @@ -292,20 +320,6 @@ private void SetupViews() #endif } - private void buttonPauseResume_Click(object sender, EventArgs e) - { - if (_sm64Stream.IsSuspended) - { - _sm64Stream.Resume(); - buttonPauseResume.Text = "Pause"; - } - else - { - _sm64Stream.Suspend(); - buttonPauseResume.Text = "Resume"; - } - } - private void buttonOtherModify_Click(object sender, EventArgs e) { var row = _tableOtherData.Rows[dataGridViewExpressions.SelectedRows[0].Index]; @@ -416,64 +430,77 @@ await Task.Run(() => { _mapManager.Load(); } - private void buttonMapExpand_Click(object sender, EventArgs e) + protected override void OnFormClosing(FormClosingEventArgs e) { - if (!_splitterIsExpanded) + if (_sm64Stream.IsRunning) { - buttonMapExpand.Text = "Minimize Map"; - splitContainerMain.SplitterDistance = splitContainerMain.Height; - } - else - { - buttonMapExpand.Text = "Expand Map"; - splitContainerMain.SplitterDistance = _defaultSplitValue; + _sm64Stream.Stop(); + e.Cancel = true; + Hide(); + return; } - - _splitterIsExpanded = !_splitterIsExpanded; + + base.OnFormClosing(e); } - #region Debug Tab - - private void radioButtonDbgOff_CheckedChanged(object sender, EventArgs e) + private void _sm64Stream_OnClose(object sender, EventArgs e) { - // Turn debug off - _sm64Stream.WriteRam(new byte[] { 0 }, Config.Debug.Toggle); + Invoke(new Action(() => Close())); } - private void radioButtonDbgObjCnt_CheckedChanged(object sender, EventArgs e) + private void buttonCollapseBottom_Click(object sender, EventArgs e) { - // Turn debug on - _sm64Stream.WriteRam(new byte[] { 1 }, Config.Debug.Toggle); - - // Set mode - _sm64Stream.WriteRam(new byte[] { 0 }, Config.Debug.Setting); + splitContainerMain.Panel2Collapsed = !splitContainerMain.Panel2Collapsed; } - private void radioButtonDbgChkInfo_CheckedChanged(object sender, EventArgs e) + private void buttonCollapseTop_Click(object sender, EventArgs e) { - // Turn debug on - _sm64Stream.WriteRam(new byte[] { 1 }, Config.Debug.Toggle); + splitContainerMain.Panel1Collapsed = !splitContainerMain.Panel1Collapsed; + } - // Set mode - _sm64Stream.WriteRam(new byte[] { 1 }, Config.Debug.Setting); + private void buttonReadOnly_Click(object sender, EventArgs e) + { + _sm64Stream.Readonly = !_sm64Stream.Readonly; + buttonReadOnly.Text = _sm64Stream.Readonly ? "Disable Read-only" : "Enable Read-only"; + _sm64Stream.ShowWarning = false; } - private void radioButtonDbgMapInfo_CheckedChanged(object sender, EventArgs e) + private void buttonConnect_Click(object sender, EventArgs e) { - // Turn debug on - _sm64Stream.WriteRam(new byte[] { 1 }, Config.Debug.Toggle); + var selectedProcess = (ProcessSelection?)listBoxProcessesList.SelectedItem; + + // Select the only process if there is one + if (!selectedProcess.HasValue && listBoxProcessesList.Items.Count == 1) + selectedProcess = (ProcessSelection)listBoxProcessesList.Items[0]; - // Set mode - _sm64Stream.WriteRam(new byte[] { 2 }, Config.Debug.Setting); + if (!selectedProcess.HasValue || !AttachToProcess(selectedProcess.Value.Process)) + { + MessageBox.Show("Could not attach to process!", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } + + panelConnect.Visible = false; + labelProcessSelect.Text = "Connected To: " + selectedProcess.Value.Process.ProcessName; } - private void radioButtonDbgStgInfo_CheckedChanged(object sender, EventArgs e) + private void buttonRefresh_Click(object sender, EventArgs e) { - // Turn debug on - _sm64Stream.WriteRam(new byte[] { 1 }, Config.Debug.Toggle); + // Update the process list + listBoxProcessesList.Items.Clear(); + var processes = GetAvailableProcesses().OrderBy(p => p.StartTime).ToList(); + for (int i = 0; i < processes.Count; i++) + listBoxProcessesList.Items.Add(new ProcessSelection(processes[i], i + 1)); + + // Pre-select the first process + if (listBoxProcessesList.Items.Count != 0) + listBoxProcessesList.SelectedIndex = 0; + } - // Set mode - _sm64Stream.WriteRam(new byte[] { 3 }, Config.Debug.Setting); + private void buttonDisconnect_Click(object sender, EventArgs e) + { + _sm64Stream.SwitchProcess(null, null); + panelConnect.Size = this.Size; + panelConnect.Visible = true; } private void checkBoxMoveCamWithPu_CheckedChanged(object sender, EventArgs e) @@ -486,15 +513,6 @@ private void checkBoxUseOverlays_CheckedChanged(object sender, EventArgs e) Config.ShowOverlays = checkBoxUseOverlays.Checked; } - private void radioButtonDbgFxInfo_CheckedChanged(object sender, EventArgs e) - { - // Turn debug on - _sm64Stream.WriteRam(new byte[] { 1 }, Config.Debug.Toggle); - - // Set mode - _sm64Stream.WriteRam(new byte[] { 4 }, Config.Debug.Setting); - } - private async void trackBarObjSlotSize_ValueChanged(object sender, EventArgs e) { _resizeObjSlotTime = 500; @@ -518,50 +536,20 @@ await Task.Run(() => _objSlotResizing = false; } - private void radioButtonDbgEnemyInfo_CheckedChanged(object sender, EventArgs e) - { - // Turn debug on - _sm64Stream.WriteRam(new byte[] { 1 }, Config.Debug.Toggle); - - // Set mode - _sm64Stream.WriteRam(new byte[] { 5 }, Config.Debug.Setting); - } - - #endregion - private void tabControlMain_SelectedIndexChanged(object sender, EventArgs e) { if (tabControlMain.SelectedTab == tabPageMap) { - _objectSlotManager.UpdateSelectedObjectSlots(); + _objectSlotManager.UpdateSelectedMapObjectSlots(); comboBoxMapToggleMode.Visible = true; labelToggleMode.Visible = true; - if (_splitterIsExpanded) - splitContainerMain.SplitterDistance = splitContainerMain.Height; } else { - _objectSlotManager.SetAllSelectedObjectSlots(); + _objectSlotManager.SetAllSelectedMapObjectSlots(); comboBoxMapToggleMode.Visible = false; labelToggleMode.Visible = false; - if (_splitterIsExpanded) - splitContainerMain.SplitterDistance = _defaultSplitValue; } } - - private void tabControlMain_DragEnter(object sender, DragEventArgs e) - { - e.Effect = DragDropEffects.All; - Point clientPoint = tabControlMain.PointToClient(new Point(e.X, e.Y)); - - for (int i = 0; i < tabControlMain.TabCount; i++) - { - if (tabControlMain.GetTabRect(i).Contains(clientPoint) && tabControlMain.SelectedIndex != i) - { - tabControlMain.SelectedIndex = i; - } - } - } - } } diff --git a/Source/SM64 Diagnostic/StroopMainForm.resx b/Source/SM64 Diagnostic/StroopMainForm.resx index 112e89d78..7d7841c72 100644 --- a/Source/SM64 Diagnostic/StroopMainForm.resx +++ b/Source/SM64 Diagnostic/StroopMainForm.resx @@ -228,6 +228,20 @@ S70omikRRTNedbTUi6KZElE041VHS70omikRRTNedbTUi6KZElE041VHS70omikRRTNedbTUi6KZElE0 41VHS70omikRRTNedbTUi6KZElE041VHS/tyPojI/bCCtLG/Olo6TaqjpdOkOlo6TaqjpdOkOvtMnRZP g1+luqb/ODnpcv9jZ5h9gGCfothHSXSjSWJntLNmPPmZmXedTDRJ5CCXVAAAAABJRU5ErkJggg== + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAANCAYAAACgu+4kAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAL + EwAACxMBAJqcGAAAAAd0SU1FB+ECBhcVMTFlPeAAAAAjSURBVDhPYwCC/xRiygE2U0nBEIJMMGrAqAEg + ADeATMzwHwDKDkG/vo9iOwAAAABJRU5ErkJggg== + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAANCAYAAACgu+4kAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAL + EwAACxMBAJqcGAAAAAd0SU1FB+ECBhcVIFvVHRIAAAAjSURBVDhPYwCC/xRiCEEmGDVg1AAQgBtACaYc + YDOVSMzwHwCEEUG/sWU63wAAAABJRU5ErkJggg== diff --git a/Source/SM64 Diagnostic/Structs/ActionTable.cs b/Source/SM64 Diagnostic/Structs/ActionTable.cs new file mode 100644 index 000000000..7ccbc2b42 --- /dev/null +++ b/Source/SM64 Diagnostic/Structs/ActionTable.cs @@ -0,0 +1,88 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace SM64_Diagnostic.Structs +{ + public class ActionTable + { + public struct ActionReference + { + public uint Action; + public string ActionName; + public uint? AfterClone; + public uint? AfterUnclone; + public uint? Handsfree; + + public override int GetHashCode() + { + return (int)Action; + } + } + + Dictionary _table = new Dictionary(); + + uint _defaultAfterClone; + uint _defaultAfterUnclone; + uint _defaultHandsfree; + + public ActionTable(uint defaultAfterClone, uint defaultAfterUnclone, uint defaultHandsfree) + { + _defaultAfterClone = defaultAfterClone; + _defaultAfterUnclone = defaultAfterUnclone; + _defaultHandsfree = defaultHandsfree; + } + + public void Add(ActionReference actionRef) + { + // Check for default afterCloneValue + if (!actionRef.AfterClone.HasValue) + actionRef.AfterClone = _defaultAfterClone; + + // Check for default afterUncloneValue + if (!actionRef.AfterUnclone.HasValue) + actionRef.AfterUnclone = _defaultAfterUnclone; + + // Check for default handsfreeValue + if (!actionRef.Handsfree.HasValue) + actionRef.Handsfree = _defaultHandsfree; + + // Add action to table + _table.Add(actionRef.Action, actionRef); + } + + public string GetActionName(uint action) + { + if (!_table.ContainsKey(action)) + return "Unknown Action"; + + return _table[action].ActionName; + } + + public uint GetAfterCloneValue(uint action) + { + if (!_table.ContainsKey(action)) + return _defaultAfterClone; + + return _table[action].AfterClone.Value; + } + + public uint GetAfterUncloneValue(uint action) + { + if (!_table.ContainsKey(action)) + return _defaultAfterUnclone; + + return _table[action].AfterUnclone.Value; + } + + public uint GetHandsfreeValue(uint action) + { + if (!_table.ContainsKey(action)) + return _defaultHandsfree; + + return _table[action].Handsfree.Value; + } + } +} diff --git a/Source/SM64 Diagnostic/Structs/Configurations/Config.cs b/Source/SM64 Diagnostic/Structs/Configurations/Config.cs index 1d6787d63..e7494834e 100644 --- a/Source/SM64 Diagnostic/Structs/Configurations/Config.cs +++ b/Source/SM64 Diagnostic/Structs/Configurations/Config.cs @@ -10,15 +10,16 @@ namespace SM64_Diagnostic.Structs public static class Config { public static int RefreshRateFreq; - public static string ProcessName; - public static uint RamStartAddress; + public static List Emulators = new List(); public static uint RamSize; public static ObjectGroupsConfig ObjectGroups; public static ObjectSlotsConfig ObjectSlots; public static MarioConfig Mario; public static HudConfig Hud; + public static HackConfig Hacks; public static DebugConfig Debug; public static TriangleOffsetsConfig TriangleOffsets; + public static ActionTable MarioActions; public static uint LevelAddress; public static uint AreaAddress; public static uint LoadingPointAddress; diff --git a/Source/SM64 Diagnostic/Structs/Configurations/HackConfig.cs b/Source/SM64 Diagnostic/Structs/Configurations/HackConfig.cs new file mode 100644 index 000000000..385cde1bd --- /dev/null +++ b/Source/SM64 Diagnostic/Structs/Configurations/HackConfig.cs @@ -0,0 +1,16 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace SM64_Diagnostic.Structs.Configurations +{ + public struct HackConfig + { + public RomHack SpawnHack; + public uint BehaviorAddress; + public uint GfxIdAddress; + public uint ExtraAddress; + } +} diff --git a/Source/SM64 Diagnostic/Structs/Configurations/HudConfig.cs b/Source/SM64 Diagnostic/Structs/Configurations/HudConfig.cs index e5d924f86..aad7694cb 100644 --- a/Source/SM64 Diagnostic/Structs/Configurations/HudConfig.cs +++ b/Source/SM64 Diagnostic/Structs/Configurations/HudConfig.cs @@ -12,10 +12,12 @@ public struct HudConfig public uint LiveCountAddress; public uint CoinCountAddress; public uint StarCountAddress; + public uint DisplayHpAddress; public uint DisplayLiveCountAddress; public uint DisplayCoinCountAddress; public uint DisplayStarCountAddress; public short FullHp; + public short FullHpInt; public sbyte StandardLives; public short StandardCoins; public short StandardStars; diff --git a/Source/SM64 Diagnostic/Structs/Configurations/MarioConfig.cs b/Source/SM64 Diagnostic/Structs/Configurations/MarioConfig.cs index 28c6b9157..ebe431ff9 100644 --- a/Source/SM64 Diagnostic/Structs/Configurations/MarioConfig.cs +++ b/Source/SM64 Diagnostic/Structs/Configurations/MarioConfig.cs @@ -10,6 +10,7 @@ public struct MarioConfig { public uint StructAddress; public uint ActionOffset; + public uint PrevActionOffset; public uint XOffset; public uint YOffset; public uint ZOffset; @@ -29,5 +30,6 @@ public struct MarioConfig public uint SlidingSpeedXOffset; public uint SlidingSpeedZOffset; public uint PeakHeightOffset; + public uint ObjectReferenceAddress; } } diff --git a/Source/SM64 Diagnostic/Structs/Emulator.cs b/Source/SM64 Diagnostic/Structs/Emulator.cs new file mode 100644 index 000000000..320e9c27c --- /dev/null +++ b/Source/SM64 Diagnostic/Structs/Emulator.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace SM64_Diagnostic.Structs +{ + public class Emulator + { + public string Name; + public string ProcessName; + public uint RamStart; + } +} diff --git a/Source/SM64 Diagnostic/Structs/Gui/ObjectDataGui.cs b/Source/SM64 Diagnostic/Structs/Gui/ObjectDataGui.cs index 850ff7ad0..cf703fe20 100644 --- a/Source/SM64 Diagnostic/Structs/Gui/ObjectDataGui.cs +++ b/Source/SM64 Diagnostic/Structs/Gui/ObjectDataGui.cs @@ -15,8 +15,10 @@ public struct ObjectDataGui public NoTearFlowLayoutPanel ObjectFlowLayout; public Button CloneButton; public Button UnloadButton; - public Button MoveToMarioButton; - public Button MoveMarioToButton; + public Button RetrieveButton; + public Button GoToButton; + public Button RetrieveHomeButton; + public Button GoToHomeButton; public TextBox ObjectNameTextBox; public Label ObjBehaviorLabel; public Label ObjSlotIndexLabel; diff --git a/Source/SM64 Diagnostic/Structs/ObjectAssociations.cs b/Source/SM64 Diagnostic/Structs/ObjectAssociations.cs index a8d187098..9bf610ffe 100644 --- a/Source/SM64 Diagnostic/Structs/ObjectAssociations.cs +++ b/Source/SM64 Diagnostic/Structs/ObjectAssociations.cs @@ -23,7 +23,7 @@ public class ObjectAssociations RotatesOnMap = false } }; - + List _spawnHacks = new List(); Image _defaultImage; Image _transparentDefaultImage; @@ -53,6 +53,14 @@ public HashSet BehaviorAssociations } } + public List SpawnHacks + { + get + { + return _spawnHacks; + } + } + public Image DefaultImage { get @@ -71,6 +79,11 @@ public bool AddAssociation(ObjectBehaviorAssociation objAsooc) return _objAssoc.Add(objAsooc); } + public void AddSpawnHack(SpawnHack hack) + { + _spawnHacks.Add(hack); + } + public ObjectBehaviorAssociation FindObjectAssociation(BehaviorCriteria behaviorCriteria) { var possibleAssoc = _objAssoc.Where(objAssoc => objAssoc.MeetsCriteria(behaviorCriteria)); diff --git a/Source/SM64 Diagnostic/Structs/ObjectSlotData.cs b/Source/SM64 Diagnostic/Structs/ObjectSlotData.cs deleted file mode 100644 index d5ba74d74..000000000 --- a/Source/SM64 Diagnostic/Structs/ObjectSlotData.cs +++ /dev/null @@ -1,20 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using System.Drawing; - -namespace SM64_Diagnostic.Structs -{ - public class ObjectSlotData - { - public uint Address; - public byte ObjectProcessGroup; - public int ProcessIndex; - public int? VacantSlotIndex; - public float DistanceToMario; - public bool IsActive; - public uint Behavior; - } -} diff --git a/Source/SM64 Diagnostic/Structs/ProcessSelection.cs b/Source/SM64 Diagnostic/Structs/ProcessSelection.cs index c71de0b04..a6ac5e431 100644 --- a/Source/SM64 Diagnostic/Structs/ProcessSelection.cs +++ b/Source/SM64 Diagnostic/Structs/ProcessSelection.cs @@ -10,15 +10,17 @@ namespace SM64_Diagnostic.Utilities public struct ProcessSelection { public Process Process; + public int Index; - public ProcessSelection(Process process) + public ProcessSelection(Process process, int index) { Process = process; + Index = index; } public override string ToString() { - return this.Process.ProcessName; + return Index + ". " + this.Process.ProcessName; } } } diff --git a/Source/SM64 Diagnostic/Structs/RomHack.cs b/Source/SM64 Diagnostic/Structs/RomHack.cs index 485e28334..544558196 100644 --- a/Source/SM64 Diagnostic/Structs/RomHack.cs +++ b/Source/SM64 Diagnostic/Structs/RomHack.cs @@ -23,7 +23,8 @@ public RomHack(string hackFileName, string hackName) } void LoadHackFromFile(string hackFileName) - { + { + // Load file and remove whitespace var dataUntrimmed = File.ReadAllText(hackFileName); var data = Regex.Replace(dataUntrimmed, @"\s+", ""); @@ -57,21 +58,23 @@ void LoadHackFromFile(string hackFileName) while (nextEnd != -1); } - public void LoadPayload(ProcessStream stream) + public void LoadPayload(ProcessStream stream, bool suspendStream = true) { var originalMemory = new List>(); bool success = true; - stream.Suspend(); + if (suspendStream) + stream.Suspend(); foreach (var address in _payload) { // Read original memory before replacing - originalMemory.Add(new Tuple(address.Item1, stream.ReadRam(address.Item1, address.Item2.Length, false, false))); - success &= stream.WriteRam(address.Item2, address.Item1, false, false); + originalMemory.Add(new Tuple(address.Item1, stream.ReadRam(address.Item1, address.Item2.Length))); + success &= stream.WriteRam(address.Item2, address.Item1); } - stream.Resume(); + if (suspendStream) + stream.Resume(); // Update original memory upon success if (success) @@ -83,26 +86,31 @@ public void LoadPayload(ProcessStream stream) Enabled = success; } - public void ClearPayload(ProcessStream stream) + public bool ClearPayload(ProcessStream stream) { bool success = true; + if (_originalMemory.Count != _payload.Count) + return false; + stream.Suspend(); foreach (var address in _originalMemory) // Read original memory before replacing - success &= stream.WriteRam(address.Item2, address.Item1, false, false); + success &= stream.WriteRam(address.Item2, address.Item1); stream.Resume(); Enabled = !success; + + return success; } public void UpdateEnabledStatus(ProcessStream stream) { Enabled = true; foreach (var address in _payload) - Enabled &= address.Item2.SequenceEqual(stream.ReadRam(address.Item1, address.Item2.Length, false, false)); + Enabled &= address.Item2.SequenceEqual(stream.ReadRam(address.Item1, address.Item2.Length)); } public override string ToString() diff --git a/Source/SM64 Diagnostic/Structs/SpawnHack.cs b/Source/SM64 Diagnostic/Structs/SpawnHack.cs new file mode 100644 index 000000000..2aa851329 --- /dev/null +++ b/Source/SM64 Diagnostic/Structs/SpawnHack.cs @@ -0,0 +1,21 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace SM64_Diagnostic.Structs +{ + public class SpawnHack + { + public string Name; + public uint Behavior; + public byte GfxId; + public byte Extra; + + public override string ToString() + { + return Name; + } + } +} diff --git a/Source/SM64 Diagnostic/Utilities/NativeMethods.cs b/Source/SM64 Diagnostic/Utilities/Kernal32NativeMethods.cs similarity index 81% rename from Source/SM64 Diagnostic/Utilities/NativeMethods.cs rename to Source/SM64 Diagnostic/Utilities/Kernal32NativeMethods.cs index 6d79632bf..ba1dbbfed 100644 --- a/Source/SM64 Diagnostic/Utilities/NativeMethods.cs +++ b/Source/SM64 Diagnostic/Utilities/Kernal32NativeMethods.cs @@ -8,7 +8,7 @@ namespace SM64_Diagnostic.Utilities { - public static class NativeMethods + public static class Kernal32NativeMethods { [Flags] private enum ThreadAccess : int @@ -62,7 +62,7 @@ public static bool CloseProcess(IntPtr processHandle) public static bool ProcessReadMemory(IntPtr hProcess, IntPtr lpBaseAddress, byte[] lpBuffer, IntPtr dwSize, ref int lpNumberOfBytesRead) { - return NativeMethods.ReadProcessMemory(hProcess, lpBaseAddress, lpBuffer, dwSize, ref lpNumberOfBytesRead); + return Kernal32NativeMethods.ReadProcessMemory(hProcess, lpBaseAddress, lpBuffer, dwSize, ref lpNumberOfBytesRead); } public static bool ProcessWriteMemory(IntPtr hProcess, IntPtr lpBaseAddress, @@ -76,7 +76,7 @@ public static void ResumeProcess(Process process) // Resume all threads foreach (ProcessThread pT in process.Threads) { - IntPtr pOpenThread = NativeMethods.OpenThread(NativeMethods.ThreadAccess.SUSPEND_RESUME, false, (uint)pT.Id); + IntPtr pOpenThread = Kernal32NativeMethods.OpenThread(Kernal32NativeMethods.ThreadAccess.SUSPEND_RESUME, false, (uint)pT.Id); if (pOpenThread == IntPtr.Zero) continue; @@ -84,10 +84,10 @@ public static void ResumeProcess(Process process) int suspendCount = 0; do { - suspendCount = NativeMethods.ResumeThread(pOpenThread); + suspendCount = Kernal32NativeMethods.ResumeThread(pOpenThread); } while (suspendCount > 0); - NativeMethods.CloseHandle(pOpenThread); + Kernal32NativeMethods.CloseHandle(pOpenThread); } } @@ -96,13 +96,13 @@ public static void SuspendProcess(Process process) // Pause all threads foreach (ProcessThread pT in process.Threads) { - IntPtr pOpenThread = NativeMethods.OpenThread(NativeMethods.ThreadAccess.SUSPEND_RESUME, false, (uint)pT.Id); + IntPtr pOpenThread = Kernal32NativeMethods.OpenThread(Kernal32NativeMethods.ThreadAccess.SUSPEND_RESUME, false, (uint)pT.Id); if (pOpenThread == IntPtr.Zero) continue; - NativeMethods.SuspendThread(pOpenThread); - NativeMethods.CloseHandle(pOpenThread); + Kernal32NativeMethods.SuspendThread(pOpenThread); + Kernal32NativeMethods.CloseHandle(pOpenThread); } } } diff --git a/Source/SM64 Diagnostic/Utilities/LittleEndianessAddressing.cs b/Source/SM64 Diagnostic/Utilities/LittleEndianessAddressing.cs deleted file mode 100644 index 58ef27869..000000000 --- a/Source/SM64 Diagnostic/Utilities/LittleEndianessAddressing.cs +++ /dev/null @@ -1,37 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace SM64_Diagnostic.Utilities -{ - public static class LittleEndianessAddressing - { - public static int AddressFix(int address, int dataSize) - { - switch (dataSize) - { - case 1: - return (int)(address & 0xFFFFFFFC) | (0x03 - (address & 0x03)); - case 2: - return (int)(address & 0xFFFFFFFD) | (0x02 - (address & 0x02)); - default: - return address; - } - } - - public static uint AddressFix(uint address, int dataSize) - { - switch (dataSize) - { - case 1: - return (uint)(address & 0xFFFFFFFC) | (0x03 - (address & 0x03)); - case 2: - return (uint)(address & 0xFFFFFFFD) | (0x02 - (address & 0x02)); - default: - return address; - } - } - } -} diff --git a/Source/SM64 Diagnostic/Utilities/MarioActions.cs b/Source/SM64 Diagnostic/Utilities/MarioActions.cs index a8fe59ce7..6ce360129 100644 --- a/Source/SM64 Diagnostic/Utilities/MarioActions.cs +++ b/Source/SM64 Diagnostic/Utilities/MarioActions.cs @@ -4,12 +4,15 @@ using System.Text; using System.Threading.Tasks; using SM64_Diagnostic.Structs; +using SM64_Diagnostic.Extensions; namespace SM64_Diagnostic.Utilities { public static class MarioActions { - public static bool MoveMarioToObjects(ProcessStream stream, List objAddresses) + static uint _prevMarioGraphic = 0x00; + + public static bool GoToObjects(ProcessStream stream, List objAddresses) { // Move mario to object var marioAddress = Config.Mario.StructAddress; @@ -18,18 +21,18 @@ public static bool MoveMarioToObjects(ProcessStream stream, List objAddres // Get object position float x, y, z; - x = objAddresses.Average(obj => BitConverter.ToSingle(stream.ReadRam(obj + Config.ObjectSlots.ObjectXOffset, 4), 0)); - y = objAddresses.Average(obj => BitConverter.ToSingle(stream.ReadRam(obj + Config.ObjectSlots.ObjectYOffset, 4), 0)); - z = objAddresses.Average(obj => BitConverter.ToSingle(stream.ReadRam(obj + Config.ObjectSlots.ObjectZOffset, 4), 0)); + x = objAddresses.Average(obj => stream.GetSingle(obj + Config.ObjectSlots.ObjectXOffset)); + y = objAddresses.Average(obj => stream.GetSingle(obj + Config.ObjectSlots.ObjectYOffset)); + z = objAddresses.Average(obj => stream.GetSingle(obj + Config.ObjectSlots.ObjectZOffset)); // Add offset y += Config.Mario.MoveToObjectYOffset; // Move mario to object bool success = true; - success &= stream.WriteRam(BitConverter.GetBytes(x), marioAddress + Config.Mario.XOffset); - success &= stream.WriteRam(BitConverter.GetBytes(y), marioAddress + Config.Mario.YOffset); - success &= stream.WriteRam(BitConverter.GetBytes(z), marioAddress + Config.Mario.ZOffset); + success &= stream.SetValue(x, marioAddress + Config.Mario.XOffset); + success &= stream.SetValue(y, marioAddress + Config.Mario.YOffset); + success &= stream.SetValue(z, marioAddress + Config.Mario.ZOffset); stream.Resume(); @@ -45,9 +48,9 @@ public static bool RetreiveObjects(ProcessStream stream, List objAddresses // Get Mario position float x, y, z; - x = BitConverter.ToSingle(stream.ReadRam(marioAddress + Config.Mario.XOffset, 4), 0); - y = BitConverter.ToSingle(stream.ReadRam(marioAddress + Config.Mario.YOffset, 4), 0); - z = BitConverter.ToSingle(stream.ReadRam(marioAddress + Config.Mario.ZOffset, 4), 0); + x = stream.GetSingle(marioAddress + Config.Mario.XOffset); + y = stream.GetSingle(marioAddress + Config.Mario.YOffset); + z = stream.GetSingle(marioAddress + Config.Mario.ZOffset); // Add offset y += Config.ObjectSlots.MoveToMarioYOffset; @@ -56,15 +59,70 @@ public static bool RetreiveObjects(ProcessStream stream, List objAddresses bool success = true; foreach (var objAddress in objAddresses) { - success &= stream.WriteRam(BitConverter.GetBytes(x), objAddress + Config.ObjectSlots.ObjectXOffset); - success &= stream.WriteRam(BitConverter.GetBytes(y), objAddress + Config.ObjectSlots.ObjectYOffset); - success &= stream.WriteRam(BitConverter.GetBytes(z), objAddress + Config.ObjectSlots.ObjectZOffset); + success &= stream.SetValue(x, objAddress + Config.ObjectSlots.ObjectXOffset); + success &= stream.SetValue(y, objAddress + Config.ObjectSlots.ObjectYOffset); + success &= stream.SetValue(z, objAddress + Config.ObjectSlots.ObjectZOffset); } stream.Resume(); return success; } + public static bool GoToObjectsHome(ProcessStream stream, List objAddresses) + { + // Move mario to object + var marioAddress = Config.Mario.StructAddress; + + stream.Suspend(); + + // Get object position + float x, y, z; + x = objAddresses.Average(obj => stream.GetSingle(obj + Config.ObjectSlots.HomeXOffset)); + y = objAddresses.Average(obj => stream.GetSingle(obj + Config.ObjectSlots.HomeYOffset)); + z = objAddresses.Average(obj => stream.GetSingle(obj + Config.ObjectSlots.HomeZOffset)); + + // Add offset + y += Config.Mario.MoveToObjectYOffset; + + // Move mario to object + bool success = true; + success &= stream.SetValue(x, marioAddress + Config.Mario.XOffset); + success &= stream.SetValue(y, marioAddress + Config.Mario.YOffset); + success &= stream.SetValue(z, marioAddress + Config.Mario.ZOffset); + + stream.Resume(); + + return success; + } + + public static bool RetreiveObjectsHome(ProcessStream stream, List objAddresses) + { + // Move object to Mario + var marioAddress = Config.Mario.StructAddress; + + stream.Suspend(); + + // Get Mario position + float x, y, z; + x = stream.GetSingle(marioAddress + Config.Mario.XOffset); + y = stream.GetSingle(marioAddress + Config.Mario.YOffset); + z = stream.GetSingle(marioAddress + Config.Mario.ZOffset); + + // Add offset + y += Config.ObjectSlots.MoveToMarioYOffset; + + // Move object to Mario + bool success = true; + foreach (var objAddress in objAddresses) + { + success &= stream.SetValue(x, objAddress + Config.ObjectSlots.HomeXOffset); + success &= stream.SetValue(y, objAddress + Config.ObjectSlots.HomeYOffset); + success &= stream.SetValue(z, objAddress + Config.ObjectSlots.HomeZOffset); + } + stream.Resume(); + + return success; + } public static bool CloneObject(ProcessStream stream, uint objAddress) { @@ -74,10 +132,12 @@ public static bool CloneObject(ProcessStream stream, uint objAddress) stream.Suspend(); // Make clone object mario's holding object - success &= stream.WriteRam(BitConverter.GetBytes(objAddress), marioAddress + Config.Mario.HoldingObjectPointerOffset); + success &= stream.SetValue(objAddress, marioAddress + Config.Mario.HoldingObjectPointerOffset); // Set clone action flags - success &= stream.WriteRam(BitConverter.GetBytes(0x8000207U), marioAddress + Config.Mario.ActionOffset); + uint currentAction = stream.GetUInt32(marioAddress + Config.Mario.ActionOffset); + uint nextAction = Config.MarioActions.GetAfterCloneValue(currentAction); + success &= stream.SetValue(nextAction, marioAddress + Config.Mario.ActionOffset); stream.Resume(); @@ -92,10 +152,12 @@ public static bool UnCloneObject(ProcessStream stream, uint objAddress) stream.Suspend(); // Make clone object mario's holding object - success &= stream.WriteRam(new byte[] { 0x00, 0x00, 0x00, 0x00 }, marioAddress + Config.Mario.HoldingObjectPointerOffset); + success &= stream.SetValue((UInt32) 0x00000000U, marioAddress + Config.Mario.HoldingObjectPointerOffset); // Set clone action flags - success &= stream.WriteRam(BitConverter.GetBytes(0x0C400201U), marioAddress + Config.Mario.ActionOffset); + uint currentAction = stream.GetUInt32(marioAddress + Config.Mario.ActionOffset); + uint nextAction = Config.MarioActions.GetAfterUncloneValue(currentAction); + success &= stream.SetValue(nextAction, marioAddress + Config.Mario.ActionOffset); stream.Resume(); @@ -107,32 +169,83 @@ public static bool UnloadObject(ProcessStream stream, List addresses) bool success = true; foreach (var address in addresses) { - success &= stream.WriteRam(new byte[] { 0x00, 0x00 }, address + Config.ObjectSlots.ObjectActiveOffset); + success &= stream.SetValue((short) 0x0000, address + Config.ObjectSlots.ObjectActiveOffset); + } + return success; + } + + public static bool ToggleHandsfree(ProcessStream stream) + { + bool success = true; + var marioAddress = Config.Mario.StructAddress; + + stream.Suspend(); + + var holdingObj = stream.GetUInt32(marioAddress + Config.Mario.HoldingObjectPointerOffset); + + if (holdingObj != 0x00000000U) + { + uint currentAction = stream.GetUInt32(marioAddress + Config.Mario.ActionOffset); + uint nextAction = Config.MarioActions.GetHandsfreeValue(currentAction); + success = stream.SetValue(nextAction, marioAddress + Config.Mario.ActionOffset); + } + + stream.Resume(); + + return success; + } + + public static bool ToggleVisibility(ProcessStream stream) + { + bool success = true; + stream.Suspend(); + + var marioObjRef = stream.GetUInt32(Config.Mario.ObjectReferenceAddress); + if (marioObjRef != 0x00000000U) + { + var marioGraphics = stream.GetUInt32(marioObjRef + Config.ObjectSlots.BehaviorGfxOffset); + if (marioGraphics == 0) + { + success &= stream.SetValue(_prevMarioGraphic, marioObjRef + Config.ObjectSlots.BehaviorGfxOffset); + } + else + { + _prevMarioGraphic = marioGraphics; + success &= stream.SetValue(0x00000000U, marioObjRef + Config.ObjectSlots.BehaviorGfxOffset); + } } + + stream.Resume(); + return success; } public static bool RefillHp(ProcessStream stream) { - return stream.WriteRam(BitConverter.GetBytes(Config.Hud.FullHp), Config.Hud.HpAddress); + return stream.SetValue(Config.Hud.FullHp, Config.Hud.HpAddress); } public static bool Die(ProcessStream stream) { - return stream.WriteRam(BitConverter.GetBytes((short)255), Config.Hud.HpAddress); + return stream.SetValue((short)255, Config.Hud.HpAddress); } public static bool StandardHud(ProcessStream stream) { bool success = true; - success &= stream.WriteRam(BitConverter.GetBytes(Config.Hud.FullHp), Config.Hud.HpAddress); - success &= stream.WriteRam(BitConverter.GetBytes(Config.Hud.StandardCoins), Config.Hud.CoinCountAddress); - success &= stream.WriteRam(BitConverter.GetBytes(Config.Hud.StandardLives), Config.Hud.LiveCountAddress); - success &= stream.WriteRam(BitConverter.GetBytes(Config.Hud.StandardStars), Config.Hud.StarCountAddress); - success &= stream.WriteRam(BitConverter.GetBytes(Config.Hud.StandardCoins), Config.Hud.DisplayCoinCountAddress); - success &= stream.WriteRam(BitConverter.GetBytes((short)Config.Hud.StandardLives), Config.Hud.DisplayLiveCountAddress); - success &= stream.WriteRam(BitConverter.GetBytes(Config.Hud.StandardStars), Config.Hud.DisplayStarCountAddress); + stream.Suspend(); + + success &= stream.SetValue(Config.Hud.FullHp, Config.Hud.HpAddress); + success &= stream.SetValue(Config.Hud.StandardCoins, Config.Hud.CoinCountAddress); + success &= stream.SetValue(Config.Hud.StandardLives, Config.Hud.LiveCountAddress); + success &= stream.SetValue(Config.Hud.StandardStars, Config.Hud.StarCountAddress); + success &= stream.SetValue(Config.Hud.FullHpInt, Config.Hud.DisplayHpAddress); + success &= stream.SetValue(Config.Hud.StandardCoins, Config.Hud.DisplayCoinCountAddress); + success &= stream.SetValue((short)Config.Hud.StandardLives, Config.Hud.DisplayLiveCountAddress); + success &= stream.SetValue(Config.Hud.StandardStars, Config.Hud.DisplayStarCountAddress); + + stream.Resume(); return success; } @@ -146,21 +259,21 @@ public static bool GoToTriangle(ProcessStream stream, uint triangleAddress, int switch(vertex) { case 1: - newX = BitConverter.ToInt16(stream.ReadRam(triangleAddress + Config.TriangleOffsets.X1, 2), 0); - newY = BitConverter.ToInt16(stream.ReadRam(triangleAddress + Config.TriangleOffsets.Y1, 2), 0); - newZ = BitConverter.ToInt16(stream.ReadRam(triangleAddress + Config.TriangleOffsets.Z1, 2), 0); + newX = stream.GetInt16(triangleAddress + Config.TriangleOffsets.X1); + newY = stream.GetInt16(triangleAddress + Config.TriangleOffsets.Y1); + newZ = stream.GetInt16(triangleAddress + Config.TriangleOffsets.Z1); break; case 2: - newX = BitConverter.ToInt16(stream.ReadRam(triangleAddress + Config.TriangleOffsets.X2, 2), 0); - newY = BitConverter.ToInt16(stream.ReadRam(triangleAddress + Config.TriangleOffsets.Y2, 2), 0); - newZ = BitConverter.ToInt16(stream.ReadRam(triangleAddress + Config.TriangleOffsets.Z2, 2), 0); + newX = stream.GetInt16(triangleAddress + Config.TriangleOffsets.X2); + newY = stream.GetInt16(triangleAddress + Config.TriangleOffsets.Y2); + newZ = stream.GetInt16(triangleAddress + Config.TriangleOffsets.Z2); break; case 3: - newX = BitConverter.ToInt16(stream.ReadRam(triangleAddress + Config.TriangleOffsets.X3, 2), 0); - newY = BitConverter.ToInt16(stream.ReadRam(triangleAddress + Config.TriangleOffsets.Y3, 2), 0); - newZ = BitConverter.ToInt16(stream.ReadRam(triangleAddress + Config.TriangleOffsets.Z3, 2), 0); + newX = stream.GetInt16(triangleAddress + Config.TriangleOffsets.X3); + newY = stream.GetInt16(triangleAddress + Config.TriangleOffsets.Y3); + newZ = stream.GetInt16(triangleAddress + Config.TriangleOffsets.Z3); break; default: @@ -178,9 +291,9 @@ public static bool GoToTriangle(ProcessStream stream, uint triangleAddress, int // Move mario to triangle bool success = true; var marioAddress = Config.Mario.StructAddress; - success &= stream.WriteRam(BitConverter.GetBytes(newX), marioAddress + Config.Mario.XOffset); - success &= stream.WriteRam(BitConverter.GetBytes(newY), marioAddress + Config.Mario.YOffset); - success &= stream.WriteRam(BitConverter.GetBytes(newZ), marioAddress + Config.Mario.ZOffset); + success &= stream.SetValue(newX, marioAddress + Config.Mario.XOffset); + success &= stream.SetValue(newY, marioAddress + Config.Mario.YOffset); + success &= stream.SetValue(newZ, marioAddress + Config.Mario.ZOffset); stream.Resume(); @@ -193,17 +306,17 @@ public static bool RetrieveTriangle(ProcessStream stream, uint triangleAddress) return false; float normX, normY, normZ, oldNormOffset; - normX = BitConverter.ToSingle(stream.ReadRam(triangleAddress + Config.TriangleOffsets.NormX, 4), 0); - normY = BitConverter.ToSingle(stream.ReadRam(triangleAddress + Config.TriangleOffsets.NormY, 4), 0); - normZ = BitConverter.ToSingle(stream.ReadRam(triangleAddress + Config.TriangleOffsets.NormZ, 4), 0); - oldNormOffset = BitConverter.ToSingle(stream.ReadRam(triangleAddress + Config.TriangleOffsets.Offset, 4), 0); + normX = stream.GetSingle(triangleAddress + Config.TriangleOffsets.NormX); + normY = stream.GetSingle(triangleAddress + Config.TriangleOffsets.NormY); + normZ = stream.GetSingle(triangleAddress + Config.TriangleOffsets.NormZ); + oldNormOffset = stream.GetSingle(triangleAddress + Config.TriangleOffsets.Offset); // Get Mario position short marioX, marioY, marioZ; var marioAddress = Config.Mario.StructAddress; - marioX = (short) BitConverter.ToSingle(stream.ReadRam(marioAddress + Config.Mario.XOffset, 4), 0); - marioY = (short) BitConverter.ToSingle(stream.ReadRam(marioAddress + Config.Mario.YOffset, 4), 0); - marioZ = (short) BitConverter.ToSingle(stream.ReadRam(marioAddress + Config.Mario.ZOffset, 4), 0); + marioX = (short) stream.GetSingle(marioAddress + Config.Mario.XOffset); + marioY = (short) stream.GetSingle(marioAddress + Config.Mario.YOffset); + marioZ = (short) stream.GetSingle(marioAddress + Config.Mario.ZOffset); float normOffset = -(normX * marioX + normY * marioY + normZ * marioZ); float normDiff = normOffset - oldNormOffset; @@ -211,24 +324,24 @@ public static bool RetrieveTriangle(ProcessStream stream, uint triangleAddress) short yOffset = (short)(-normDiff * normY); short v1Y, v2Y, v3Y; - v1Y = (short)(BitConverter.ToInt16(stream.ReadRam(triangleAddress + Config.TriangleOffsets.Y1, 2), 0) + yOffset); - v2Y = (short)(BitConverter.ToInt16(stream.ReadRam(triangleAddress + Config.TriangleOffsets.Y2, 2), 0) + yOffset); - v3Y = (short)(BitConverter.ToInt16(stream.ReadRam(triangleAddress + Config.TriangleOffsets.Y3, 2), 0) + yOffset); + v1Y = (short)(stream.GetInt16(triangleAddress + Config.TriangleOffsets.Y1) + yOffset); + v2Y = (short)(stream.GetInt16(triangleAddress + Config.TriangleOffsets.Y2) + yOffset); + v3Y = (short)(stream.GetInt16(triangleAddress + Config.TriangleOffsets.Y3) + yOffset); - short yMin = Math.Min(Math.Min(v1Y, v2Y), v3Y); - short yMax = Math.Max(Math.Max(v1Y, v2Y), v3Y); + short yMin = (short)(Math.Min(Math.Min(v1Y, v2Y), v3Y) + 5); + short yMax = (short)(Math.Max(Math.Max(v1Y, v2Y), v3Y) - 5); stream.Suspend(); // Update triangle bool success = true; - success &= stream.WriteRam(BitConverter.GetBytes(v1Y), triangleAddress + Config.TriangleOffsets.Y1); - success &= stream.WriteRam(BitConverter.GetBytes(v2Y), triangleAddress + Config.TriangleOffsets.Y2); - success &= stream.WriteRam(BitConverter.GetBytes(v3Y), triangleAddress + Config.TriangleOffsets.Y3); - success &= stream.WriteRam(BitConverter.GetBytes(yMin), triangleAddress + Config.TriangleOffsets.YMin); - success &= stream.WriteRam(BitConverter.GetBytes(yMax), triangleAddress + Config.TriangleOffsets.YMax); - success &= stream.WriteRam(BitConverter.GetBytes(normOffset), triangleAddress + Config.TriangleOffsets.Offset); + success &= stream.SetValue(v1Y, triangleAddress + Config.TriangleOffsets.Y1); + success &= stream.SetValue(v2Y, triangleAddress + Config.TriangleOffsets.Y2); + success &= stream.SetValue(v3Y, triangleAddress + Config.TriangleOffsets.Y3); + success &= stream.SetValue(yMin, triangleAddress + Config.TriangleOffsets.YMin); + success &= stream.SetValue(yMax, triangleAddress + Config.TriangleOffsets.YMax); + success &= stream.SetValue(normOffset, triangleAddress + Config.TriangleOffsets.Offset); stream.Resume(); diff --git a/Source/SM64 Diagnostic/Utilities/ProcessStream.cs b/Source/SM64 Diagnostic/Utilities/ProcessStream.cs index 781fe1cd1..c7d52c483 100644 --- a/Source/SM64 Diagnostic/Utilities/ProcessStream.cs +++ b/Source/SM64 Diagnostic/Utilities/ProcessStream.cs @@ -7,20 +7,34 @@ using System.Runtime.InteropServices; using System.Windows.Forms; using SM64_Diagnostic.Structs; +using System.Threading; +using System.IO; +using System.ComponentModel; namespace SM64_Diagnostic.Utilities { public class ProcessStream { + Emulator _emulator; IntPtr _processHandle; Process _process; - Timer _timer; - int _offset; + Queue _fpsTimes = new Queue(); + BackgroundWorker _streamUpdater; byte[] _ram; bool _lastUpdateBeforePausing = false; + int _interval; + object _enableLocker = new object(); + object _fpsQueueLocker = new object(); public event EventHandler OnUpdate; public event EventHandler OnStatusChanged; + public event EventHandler OnDisconnect; + public event EventHandler FpsUpdated; + public event EventHandler WarnReadonlyOff; + public event EventHandler OnClose; + + public bool Readonly = true; + public bool ShowWarning = true; public Dictionary LockedVariables = new Dictionary(); @@ -29,7 +43,7 @@ public uint ProcessMemoryOffset { get { - return (uint) _offset; + return _emulator == null ? 0 : _emulator.RamStart; } } @@ -45,40 +59,92 @@ public string ProcessName { get { - return Config.ProcessName; + return _emulator == null ? "(No Emulator)" : _emulator.ProcessName; } } - public ProcessStream(Process process = null) + public double Fps { - _offset = (int)(Config.RamStartAddress & 0x7FFFFFFF); - _process = process; + get + { + double fps; + lock (_fpsQueueLocker) + { + fps = _fpsTimes.Count == 0 ? 0 : 1000 / _fpsTimes.Average(); + } + return fps; + } + } - _timer = new Timer(); - _timer.Interval = (int) (1000.0f / Config.RefreshRateFreq); - _timer.Tick += OnTick; + public Boolean IsSuspended = false; + public Boolean IsClosed = true; + public Boolean IsEnabled = false; + public Boolean IsRunning + { + get + { + bool running; + lock(_enableLocker) + { + running = !(IsSuspended || IsClosed || !IsEnabled || !_streamUpdater.IsBusy); + } + return running; + } + } + public ProcessStream(Process process = null, Emulator emulator = null) + { + _process = process; + + _interval = (int) (1000.0f / Config.RefreshRateFreq); _ram = new byte[Config.RamSize]; - SwitchProcess(_process); + _streamUpdater = new BackgroundWorker(); + _streamUpdater.DoWork += ProcessUpdateTask; + _streamUpdater.WorkerSupportsCancellation = true; + _streamUpdater.RunWorkerAsync(); + + SwitchProcess(_process, _emulator); + } + + private void LogException(Exception e) + { + try + { + var log = String.Format("{0}\n{1}\n{2}\n", e.Message, e.TargetSite.ToString(), e.StackTrace); + File.AppendAllText("error.txt", log); + } + catch (Exception) { } + } + + private void ExceptionHandler(Task obj) + { + LogException(obj.Exception); + throw obj.Exception; } ~ProcessStream() { if (_process != null) _process.Exited -= ProcessClosed; + + _streamUpdater.CancelAsync(); } - public bool SwitchProcess(Process newProcess) + public bool SwitchProcess(Process newProcess, Emulator emulator) { - // Close old process - _timer.Enabled = false; - NativeMethods.CloseProcess(_processHandle); + lock (_enableLocker) + { + IsEnabled = false; + } // Make sure old process is running if (IsSuspended) Resume(); + // Close old process + Kernal32NativeMethods.CloseProcess(_processHandle); + // Disconnect events if (_process != null) _process.Exited -= ProcessClosed; @@ -86,13 +152,17 @@ public bool SwitchProcess(Process newProcess) // Make sure the new process has a value if (newProcess == null) { + _processHandle = new IntPtr(); + _process = null; + _emulator = null; OnStatusChanged?.Invoke(this, new EventArgs()); return false; } // Open and set new process _process = newProcess; - _processHandle = NativeMethods.ProcessGetHandleFromId(0x0838, false, _process.Id); + _emulator = emulator; + _processHandle = Kernal32NativeMethods.ProcessGetHandleFromId(0x0838, false, _process.Id); if ((int)_processHandle == 0) { @@ -112,40 +182,30 @@ public bool SwitchProcess(Process newProcess) IsSuspended = false; IsClosed = false; + lock (_enableLocker) + { + IsEnabled = true; + } OnStatusChanged?.Invoke(this, new EventArgs()); - _timer.Enabled = true; - return true; } - public Boolean IsSuspended = false; - public Boolean IsClosed = true; - public Boolean IsRunning - { - get - { - return !(IsSuspended || IsClosed); - } - } - public bool ReadProcessMemory(int address, byte[] buffer, bool absoluteAddressing = false) { if (_process == null) return false; int numOfBytes = 0; - return NativeMethods.ProcessReadMemory(_processHandle, (IntPtr) (absoluteAddressing ? address : address + _offset), + return Kernal32NativeMethods.ProcessReadMemory(_processHandle, (IntPtr) (absoluteAddressing ? address : address + _emulator.RamStart), buffer, (IntPtr)buffer.Length, ref numOfBytes); } public bool WriteProcessMemory(int address, byte[] buffer, bool absoluteAddressing = false) { - if (_process == null) - return false; - int numOfBytes = 0; - return NativeMethods.ProcessWriteMemory(_processHandle, (IntPtr)(absoluteAddressing ? address : address + _offset), + return Kernal32NativeMethods.ProcessWriteMemory(_processHandle, (IntPtr)(absoluteAddressing ? address : + ConvertAddressEndianess((int)((address + _emulator.RamStart) & ~0x80000000U), buffer.Length)), buffer, (IntPtr)buffer.Length, ref numOfBytes); } @@ -156,7 +216,7 @@ public void Suspend() _lastUpdateBeforePausing = true; - NativeMethods.SuspendProcess(_process); + Kernal32NativeMethods.SuspendProcess(_process); IsSuspended = true; OnStatusChanged?.Invoke(this, new EventArgs()); @@ -168,7 +228,7 @@ public void Resume() return; // Resume all threads - NativeMethods.ResumeProcess(_process); + Kernal32NativeMethods.ResumeProcess(_process); IsSuspended = false; OnStatusChanged?.Invoke(this, new EventArgs()); @@ -177,46 +237,135 @@ public void Resume() private void ProcessClosed(object sender, EventArgs e) { IsClosed = true; - _timer.Enabled = false; + lock (_enableLocker) + { + IsEnabled = false; + } OnStatusChanged?.Invoke(this, new EventArgs()); + OnDisconnect?.Invoke(this, new EventArgs()); } - public byte[] ReadRam(uint address, int length, bool absoluteAddress = false, bool? fixAddress = null) + public byte GetByte(uint address, bool absoluteAddress = false) { - byte[] readBytes = new byte[length]; - address &= ~0x80000000U; + return ReadRamLittleEndian(address, 1, absoluteAddress)[0]; + } + + public sbyte GetSByte(uint address, bool absoluteAddress = false) + { + return (sbyte)ReadRamLittleEndian(address, 1, absoluteAddress)[0]; + } + + public short GetInt16(uint address, bool absoluteAddress = false) + { + return BitConverter.ToInt16(ReadRamLittleEndian(address, 2, absoluteAddress), 0); + } + + public ushort GetUInt16(uint address, bool absoluteAddress = false) + { + return BitConverter.ToUInt16(ReadRamLittleEndian(address, 2, absoluteAddress), 0); + } + + public int GetInt32(uint address, bool absoluteAddress = false) + { + return BitConverter.ToInt32(ReadRamLittleEndian(address, 4, absoluteAddress), 0); + } - // Fix little endianess addressing - if ((fixAddress.HasValue && fixAddress.Value) || (fixAddress == null && !absoluteAddress)) - address = (uint)LittleEndianessAddressing.AddressFix((int)address, length); + public uint GetUInt32(uint address, bool absoluteAddress = false) + { + return BitConverter.ToUInt32(ReadRamLittleEndian(address, 4, absoluteAddress), 0); + } + + public float GetSingle(uint address, bool absoluteAddress = false) + { + return BitConverter.ToSingle(ReadRamLittleEndian(address, 4, absoluteAddress), 0); + } + + public byte[] ReadRamLittleEndian(uint address, int length, bool absoluteAddress = false) + { + byte[] readBytes = new byte[length]; - // Handling absolute addressing (remove process offset from address) if (absoluteAddress) - address = (uint)(address - _offset); + address = address - _emulator.RamStart; + else + address = ConvertAddressEndianess(address & ~0x80000000U, length); if (address + length > _ram.Length) return new byte[length]; - // Retrieve ram bytes from final address Array.Copy(_ram, address, readBytes, 0, length); + return readBytes; + } + + readonly byte[] _fixAddress = { 0x03, 0x02, 0x01, 0x00 }; + public byte[] ReadRam(uint address, int length) + { + byte[] readBytes = new byte[length]; + address &= ~0x80000000U; + + if (address + length > _ram.Length) + return new byte[length]; + + for (uint i = 0; i < length; i++, address++) + { + readBytes[i] = _ram[address & ~0x00000003 | _fixAddress[address & 0x3]]; + } return readBytes; } - public bool WriteRam(byte[] buffer, uint address, bool absoluteAddress = false, bool? fixAddress = null) + public bool CheckReadonlyOff() { - return WriteRam(buffer, address, buffer.Length, absoluteAddress, fixAddress); + if (ShowWarning) + WarnReadonlyOff?.Invoke(this, new EventArgs()); + + return Readonly; } - public bool WriteRam(byte[] buffer, int bufferStart, uint address, int length, bool absoluteAddress = false, bool? fixAddress = null, bool safeWrite = true) + public bool SetValue(byte value, uint address, bool absoluteAddress = false) { - byte[] writeBytes = new byte[length]; - address &= ~0x80000000U; - Array.Copy(buffer, bufferStart, writeBytes, 0, length); - - // Fix little endianess addresssing - if ((fixAddress.HasValue && fixAddress.Value) || (fixAddress == null && !absoluteAddress)) - address = (uint)LittleEndianessAddressing.AddressFix((int)address, length); + return WriteRamLittleEndian(new byte[] { value }, address, absoluteAddress); + } + + public bool SetValue(sbyte value, uint address, bool absoluteAddress = false) + { + return WriteRamLittleEndian(new byte[] { (byte)value }, address, absoluteAddress); + } + + public bool SetValue(Int16 value, uint address, bool absoluteAddress = false) + { + return WriteRamLittleEndian(BitConverter.GetBytes(value), address, absoluteAddress); + } + + public bool SetValue(UInt16 value, uint address, bool absoluteAddress = false) + { + return WriteRamLittleEndian(BitConverter.GetBytes(value), address, absoluteAddress); + } + + public bool SetValue(Int32 value, uint address, bool absoluteAddress = false) + { + return WriteRamLittleEndian(BitConverter.GetBytes(value), address, absoluteAddress); + } + + public bool SetValue(UInt32 value, uint address, bool absoluteAddress = false) + { + return WriteRamLittleEndian(BitConverter.GetBytes(value), address, absoluteAddress); + } + + public bool SetValue(float value, uint address, bool absoluteAddress = false) + { + return WriteRamLittleEndian(BitConverter.GetBytes(value), address, absoluteAddress); + } + + public bool WriteRamLittleEndian(byte[] buffer, uint address, bool absoluteAddress = false, int bufferStart = 0, int? length = null, bool safeWrite = true) + { + if (length == null) + length = buffer.Length - bufferStart; + + if (CheckReadonlyOff()) + return false; + + byte[] writeBytes = new byte[length.Value]; + Array.Copy(buffer, bufferStart, writeBytes, 0, length.Value); // Attempt to pause the game before writing bool preSuspended = IsSuspended; @@ -224,7 +373,7 @@ public bool WriteRam(byte[] buffer, int bufferStart, uint address, int length, b Suspend(); // Write memory to game/process - bool result = WriteProcessMemory((int)address, writeBytes, absoluteAddress); + bool result = WriteProcessMemory((int)address, writeBytes, absoluteAddress); // Resume stream if (safeWrite && !preSuspended) @@ -232,29 +381,157 @@ public bool WriteRam(byte[] buffer, int bufferStart, uint address, int length, b return result; } - - public bool WriteRam(byte[] buffer, uint address, int length, bool absoluteAddress = false, bool? fixAddress = null) + + public bool WriteRam(byte[] buffer, uint address, int bufferStart = 0, int? length = null, bool safeWrite = true) { - return WriteRam(buffer, 0, address, length, absoluteAddress, fixAddress); + address &= ~0x80000000U; + + if (length == null) + length = buffer.Length - bufferStart; + + if (CheckReadonlyOff()) + return false; + + bool success = true; + + // Attempt to pause the game before writing + bool preSuspended = IsSuspended; + if (safeWrite) + Suspend(); + + // Take care of first alignment + int bufPos = bufferStart; + uint alignment = _fixAddress[address & 0x03] + 1U; + if (alignment < 4) + { + byte[] writeBytes = new byte[Math.Min(alignment, length.Value)]; + Array.Copy(buffer, bufPos, writeBytes, 0, writeBytes.Length); + success &= WriteProcessMemory((int)address, writeBytes.Reverse().ToArray()); + length -= writeBytes.Length; + bufPos += writeBytes.Length; + address += alignment; + } + + // Take care of middle + if (length >= 4) + { + byte[] writeBytes = new byte[length.Value & ~0x03]; + for (int i = 0; i < writeBytes.Length; bufPos += 4, i += 4) + { + writeBytes[i] = buffer[bufPos + 3]; + writeBytes[i + 1] = buffer[bufPos + 2]; + writeBytes[i + 2] = buffer[bufPos + 1]; + writeBytes[i + 3] = buffer[bufPos]; + } + success &= WriteProcessMemory((int)(address + _emulator.RamStart), writeBytes, true); + address += (uint)writeBytes.Length; + length -= writeBytes.Length; + } + + // Take care of last + if (length > 0) + { + byte[] writeBytes = new byte[length.Value]; + Array.Copy(buffer, bufPos, writeBytes, 0, writeBytes.Length); + success &= WriteProcessMemory((int)address, writeBytes.Reverse().ToArray()); + } + + // Resume stream + if (safeWrite && !preSuspended) + Resume(); + + return success; } - private void OnTick(object sender, EventArgs e) + public void Stop() { - if (!IsRunning & !_lastUpdateBeforePausing) - return; + _streamUpdater.CancelAsync(); + } + + private void ProcessUpdateTask(object sender, DoWorkEventArgs e) + { + var worker = sender as BackgroundWorker; + var prevTime = Stopwatch.StartNew(); + while (!e.Cancel) + { + if (worker.CancellationPending) + { + e.Cancel = true; + break; + } + + prevTime.Restart(); + if (!IsRunning & !_lastUpdateBeforePausing) + goto FrameLimitStreamUpdate; + + _lastUpdateBeforePausing = false; + + int timeToWait; + try + { + // Read whole ram value to buffer + if (!ReadProcessMemory(0, _ram)) + continue; + + OnUpdate?.Invoke(this, new EventArgs()); + + foreach (var lockVar in LockedVariables) + lockVar.Value.Update(); + } + catch (Exception ee) + { + LogException(ee); + MessageBox.Show("A Fatal Error has occured. See output.txt for details. The program will now exit.", + "Error!", MessageBoxButtons.OK, MessageBoxIcon.Error, MessageBoxDefaultButton.Button1, MessageBoxOptions.ServiceNotification); + break; + } + + FrameLimitStreamUpdate: + + // Calculate delay to match correct FPS + prevTime.Stop(); + timeToWait = _interval - (int)prevTime.ElapsedMilliseconds; + timeToWait = Math.Max(timeToWait, 0); + + // Calculate Fps + lock (_fpsQueueLocker) + { + if (_fpsTimes.Count() >= 10) + _fpsTimes.Dequeue(); + _fpsTimes.Enqueue(prevTime.ElapsedMilliseconds + timeToWait); + } + FpsUpdated?.Invoke(this, new EventArgs()); + + Task.Delay(timeToWait).Wait(); + } - _lastUpdateBeforePausing = false; + OnClose?.BeginInvoke(this, new EventArgs(), null, null); + } - // Read whole ram value to buffer - if (!ReadProcessMemory(0, _ram)) - return; - _timer.Enabled = false; - OnUpdate?.Invoke(this, e); - foreach (var lockVar in LockedVariables) + public int ConvertAddressEndianess(int address, int dataSize) + { + switch (dataSize) + { + case 1: + case 2: + case 3: + return (int)(address & ~0x03) | (_fixAddress[dataSize - 1] - address & 0x03); + default: + return address; + } + } + + public uint ConvertAddressEndianess(uint address, int dataSize) + { + switch (dataSize) { - lockVar.Value.Update(); + case 1: + case 2: + case 3: + return (uint)(address & ~0x03) | (_fixAddress[dataSize - 1] - address & 0x03); + default: + return address; } - _timer.Enabled = true; } } } diff --git a/Source/SM64 Diagnostic/Utilities/PuUtilities.cs b/Source/SM64 Diagnostic/Utilities/PuUtilities.cs index 6652694d3..24d8fd2d1 100644 --- a/Source/SM64 Diagnostic/Utilities/PuUtilities.cs +++ b/Source/SM64 Diagnostic/Utilities/PuUtilities.cs @@ -14,7 +14,7 @@ public static class PuUtilities public static float GetRelativePuPosition(float coord, int puCoord) { - // We find the relative object positon by subtracting the PU starting coordinates from the object + // We find the relative object position by subtracting the PU starting coordinates from the object return coord - puCoord * PuSize; } @@ -42,15 +42,15 @@ public static bool MoveToRelativePu(ProcessStream stream, int newPuX, int newPuY // Get Mario position float marioX, marioY, marioZ; - marioX = BitConverter.ToSingle(stream.ReadRam(marioAddress + Config.Mario.XOffset, 4), 0); - marioY = BitConverter.ToSingle(stream.ReadRam(marioAddress + Config.Mario.YOffset, 4), 0); - marioZ = BitConverter.ToSingle(stream.ReadRam(marioAddress + Config.Mario.ZOffset, 4), 0); + marioX = stream.GetSingle(marioAddress + Config.Mario.XOffset); + marioY = stream.GetSingle(marioAddress + Config.Mario.YOffset); + marioZ = stream.GetSingle(marioAddress + Config.Mario.ZOffset); // Get Camera Position float cameraX, cameraY, cameraZ; - cameraX = BitConverter.ToSingle(stream.ReadRam(Config.CameraX, 4), 0); - cameraY = BitConverter.ToSingle(stream.ReadRam(Config.CameraY, 4), 0); - cameraZ = BitConverter.ToSingle(stream.ReadRam(Config.CameraZ, 4), 0); + cameraX = stream.GetSingle(Config.CameraX); + cameraY = stream.GetSingle(Config.CameraY); + cameraZ = stream.GetSingle(Config.CameraZ); // Calculate new coordinates float newMarioX, newMarioY, newMarioZ; @@ -65,14 +65,14 @@ public static bool MoveToRelativePu(ProcessStream stream, int newPuX, int newPuY // Set new mario + camera position bool success = true; - success &= stream.WriteRam(BitConverter.GetBytes(newMarioX), marioAddress + Config.Mario.XOffset); - success &= stream.WriteRam(BitConverter.GetBytes(newMarioY), marioAddress + Config.Mario.YOffset); - success &= stream.WriteRam(BitConverter.GetBytes(newMarioZ), marioAddress + Config.Mario.ZOffset); + success &= stream.SetValue(newMarioX, marioAddress + Config.Mario.XOffset); + success &= stream.SetValue(newMarioY, marioAddress + Config.Mario.YOffset); + success &= stream.SetValue(newMarioZ, marioAddress + Config.Mario.ZOffset); if (Config.MoveCameraWithPu) { - success &= stream.WriteRam(BitConverter.GetBytes(newCamX), Config.CameraX); - success &= stream.WriteRam(BitConverter.GetBytes(newCamY), Config.CameraY); - success &= stream.WriteRam(BitConverter.GetBytes(newCamZ), Config.CameraZ); + success &= stream.SetValue(newCamX, Config.CameraX); + success &= stream.SetValue(newCamY, Config.CameraY); + success &= stream.SetValue(newCamZ, Config.CameraZ); } return success; } @@ -83,16 +83,16 @@ public static bool MoveToPu(ProcessStream stream, int newPuX, int newPuY, int ne // Get Mario position float marioX, marioY, marioZ; - marioX = BitConverter.ToSingle(stream.ReadRam(marioAddress + Config.Mario.XOffset, 4), 0); - marioY = BitConverter.ToSingle(stream.ReadRam(marioAddress + Config.Mario.YOffset, 4), 0); - marioZ = BitConverter.ToSingle(stream.ReadRam(marioAddress + Config.Mario.ZOffset, 4), 0); + marioX = stream.GetSingle(marioAddress + Config.Mario.XOffset); + marioY = stream.GetSingle(marioAddress + Config.Mario.YOffset); + marioZ = stream.GetSingle(marioAddress + Config.Mario.ZOffset); // Get Camera Position float cameraX, cameraY, cameraZ; - cameraX = BitConverter.ToSingle(stream.ReadRam(Config.CameraX, 4), 0); - cameraY = BitConverter.ToSingle(stream.ReadRam(Config.CameraY, 4), 0); - cameraZ = BitConverter.ToSingle(stream.ReadRam(Config.CameraZ, 4), 0); + cameraX = stream.GetSingle(Config.CameraX); + cameraY = stream.GetSingle(Config.CameraY); + cameraZ = stream.GetSingle(Config.CameraZ); // Calculate new coordinates float newMarioX, newMarioY, newMarioZ; @@ -107,14 +107,14 @@ public static bool MoveToPu(ProcessStream stream, int newPuX, int newPuY, int ne // Set new mario + camera position bool success = true; - success &= stream.WriteRam(BitConverter.GetBytes(newMarioX), marioAddress + Config.Mario.XOffset); - success &= stream.WriteRam(BitConverter.GetBytes(newMarioY), marioAddress + Config.Mario.YOffset); - success &= stream.WriteRam(BitConverter.GetBytes(newMarioZ), marioAddress + Config.Mario.ZOffset); + success &= stream.SetValue(newMarioX, marioAddress + Config.Mario.XOffset); + success &= stream.SetValue(newMarioY, marioAddress + Config.Mario.YOffset); + success &= stream.SetValue(newMarioZ, marioAddress + Config.Mario.ZOffset); if (Config.MoveCameraWithPu) { - success &= stream.WriteRam(BitConverter.GetBytes(newCamX), Config.CameraX); - success &= stream.WriteRam(BitConverter.GetBytes(newCamY), Config.CameraY); - success &= stream.WriteRam(BitConverter.GetBytes(newCamZ), Config.CameraZ); + success &= stream.SetValue(newCamX, Config.CameraX); + success &= stream.SetValue(newCamY, Config.CameraY); + success &= stream.SetValue(newCamZ, Config.CameraZ); } return success; } @@ -125,8 +125,8 @@ public static string GetPuPosString(ProcessStream stream) // Get Mario position float marioX, marioZ; - marioX = BitConverter.ToSingle(stream.ReadRam(marioAddress + Config.Mario.XOffset, 4), 0); - marioZ = BitConverter.ToSingle(stream.ReadRam(marioAddress + Config.Mario.ZOffset, 4), 0); + marioX = stream.GetSingle(marioAddress + Config.Mario.XOffset); + marioZ = stream.GetSingle(marioAddress + Config.Mario.ZOffset); // Update PU int puX = PuUtilities.GetPUFromCoord(marioX); @@ -140,8 +140,8 @@ public static string GetQpuPosString(ProcessStream stream) // Get Mario position float marioX, marioZ; - marioX = BitConverter.ToSingle(stream.ReadRam(marioAddress + Config.Mario.XOffset, 4), 0); - marioZ = BitConverter.ToSingle(stream.ReadRam(marioAddress + Config.Mario.ZOffset, 4), 0); + marioX = stream.GetSingle(marioAddress + Config.Mario.XOffset); + marioZ = stream.GetSingle(marioAddress + Config.Mario.ZOffset); // Update PU int puX = PuUtilities.GetPUFromCoord(marioX); diff --git a/Source/SM64 Diagnostic/Utilities/WatchVariableLock.cs b/Source/SM64 Diagnostic/Utilities/WatchVariableLock.cs index 0adaffd3b..a95cc8973 100644 --- a/Source/SM64 Diagnostic/Utilities/WatchVariableLock.cs +++ b/Source/SM64 Diagnostic/Utilities/WatchVariableLock.cs @@ -21,7 +21,7 @@ public WatchVariableLock(ProcessStream stream, uint address, byte[] data) public bool Update() { - return _stream.WriteRam(_data, _address); + return _stream.WriteRamLittleEndian(_data, _address); } public override int GetHashCode() diff --git a/Source/SM64 Diagnostic/Utilities/XmlConfigParser.cs b/Source/SM64 Diagnostic/Utilities/XmlConfigParser.cs index 20eeff96c..4420ed495 100644 --- a/Source/SM64 Diagnostic/Utilities/XmlConfigParser.cs +++ b/Source/SM64 Diagnostic/Utilities/XmlConfigParser.cs @@ -13,6 +13,7 @@ using SM64_Diagnostic.Extensions; using System.Xml; using System.Net; +using SM64_Diagnostic.Structs.Configurations; namespace SM64_Diagnostic.Utilities { @@ -57,23 +58,25 @@ public static void OpenConfig(string path) var doc = XDocument.Load(path); doc.Validate(schemaSet, Validation); - foreach(XElement element in doc.Root.Elements()) + foreach(var element in doc.Root.Elements()) { switch(element.Name.ToString()) { + case "Emulators": + foreach (var subElement in element.Elements()) + { + Config.Emulators.Add(new Emulator() + { + Name = subElement.Attribute(XName.Get("name")).Value, + ProcessName = subElement.Attribute(XName.Get("processName")).Value, + RamStart = ParsingUtilities.ParseHex(subElement.Attribute(XName.Get("ramStart")).Value) + }); + } + break; case "RefreshRateFreq": Config.RefreshRateFreq = int.Parse(element.Value); break; - - case "ProcessDefaultName": - Config.ProcessName = element.Value; - break; - - case "RAMStartAddress": - Config.RamStartAddress = ParsingUtilities.ParseHex(element.Value); - break; - - case "RAMSize": + case "RamSize": Config.RamSize = ParsingUtilities.ParseHex(element.Value); break; case "ObjectSlots": @@ -208,6 +211,9 @@ public static void OpenConfig(string path) case "ActionOffset": Config.Mario.ActionOffset = ParsingUtilities.ParseHex(subElement.Value); break; + case "PrevActionOffset": + Config.Mario.PrevActionOffset = ParsingUtilities.ParseHex(subElement.Value); + break; case "MoveToObjectYOffset": Config.Mario.MoveToObjectYOffset = float.Parse(subElement.Value); break; @@ -250,6 +256,9 @@ public static void OpenConfig(string path) case "PeakHeightOffset": Config.Mario.PeakHeightOffset = ParsingUtilities.ParseHex(subElement.Value); break; + case "ObjectReferenceAddress": + Config.Mario.ObjectReferenceAddress = ParsingUtilities.ParseHex(subElement.Value); + break; } } break; @@ -271,6 +280,9 @@ public static void OpenConfig(string path) case "StarCountAddress": Config.Hud.StarCountAddress = ParsingUtilities.ParseHex(subElement.Value); break; + case "DisplayHpAddress": + Config.Hud.DisplayHpAddress = ParsingUtilities.ParseHex(subElement.Value); + break; case "DisplayLiveCountAddress": Config.Hud.DisplayLiveCountAddress = ParsingUtilities.ParseHex(subElement.Value); break; @@ -280,6 +292,9 @@ public static void OpenConfig(string path) case "DisplayStarCountAddress": Config.Hud.DisplayStarCountAddress = ParsingUtilities.ParseHex(subElement.Value); break; + case "FullHpInt": + Config.Hud.FullHpInt = short.Parse(subElement.Value); + break; case "FullHp": Config.Hud.FullHp = short.Parse(subElement.Value); break; @@ -580,8 +595,9 @@ public static ObjectAssociations OpenObjectAssoc(string path, ObjectSlotManagerG break; case "Object": - uint behaviorAddress = (ParsingUtilities.ParseHex(element.Attribute(XName.Get("behaviorScriptAddress")).Value) - - ramToBehaviorOffset) & 0x00FFFFFF; + string name = element.Attribute(XName.Get("name")).Value; + uint behaviorSegmented = ParsingUtilities.ParseHex(element.Attribute(XName.Get("behaviorScriptAddress")).Value); + uint behaviorAddress = (behaviorSegmented - ramToBehaviorOffset) & 0x00FFFFFF; uint? gfxId = null; int? subType = null, appearance = null; if (element.Attribute(XName.Get("gfxId")) != null) @@ -590,6 +606,21 @@ public static ObjectAssociations OpenObjectAssoc(string path, ObjectSlotManagerG subType = ParsingUtilities.TryParseInt(element.Attribute(XName.Get("subType")).Value); if (element.Attribute(XName.Get("appearance")) != null) appearance = ParsingUtilities.TryParseInt(element.Attribute(XName.Get("appearance")).Value); + var spawnElement = element.Element(XName.Get("SpawnCode")); + if (spawnElement != null) + { + byte spawnGfxId = (byte)(spawnElement.Attribute(XName.Get("gfxId")) != null ? + ParsingUtilities.ParseHex(spawnElement.Attribute(XName.Get("gfxId")).Value) : 0); + byte spawnExtra = (byte)(spawnElement.Attribute(XName.Get("extra")) != null ? + ParsingUtilities.ParseHex(spawnElement.Attribute(XName.Get("extra")).Value) : (byte)(subType.HasValue ? subType : 0)); + assoc.AddSpawnHack(new SpawnHack() + { + Name = name, + Behavior = behaviorSegmented, + GfxId = spawnGfxId, + Extra = spawnExtra + }); + } string imagePath = element.Element(XName.Get("Image")).Attribute(XName.Get("path")).Value; string mapImagePath = null; bool rotates = false; @@ -598,7 +629,6 @@ public static ObjectAssociations OpenObjectAssoc(string path, ObjectSlotManagerG mapImagePath = element.Element(XName.Get("MapImage")).Attribute(XName.Get("path")).Value; rotates = bool.Parse(element.Element(XName.Get("MapImage")).Attribute(XName.Get("rotates")).Value); } - string name = element.Attribute(XName.Get("name")).Value; var watchVars = new List(); foreach (var subElement in element.Elements().Where(x => x.Name == "Data")) { @@ -808,9 +838,10 @@ public static ScriptParser OpenScripts(string path) return parser; } - public static List OpenHacks(string path) + public static Tuple> OpenHacks(string path) { var hacks = new List(); + var hackConfig = new HackConfig(); var assembly = Assembly.GetExecutingAssembly(); // Create schema set @@ -840,6 +871,14 @@ public static List OpenHacks(string path) } break; + case "SpawnHack": + string spawnHackPath = hackDir + element.Attribute(XName.Get("path")).Value; + hackConfig.SpawnHack = new RomHack(spawnHackPath, "Spawn Hack"); + hackConfig.BehaviorAddress = ParsingUtilities.ParseHex(element.Attribute(XName.Get("behavior")).Value); + hackConfig.GfxIdAddress = ParsingUtilities.ParseHex(element.Attribute(XName.Get("gfxId")).Value); + hackConfig.ExtraAddress = ParsingUtilities.ParseHex(element.Attribute(XName.Get("extra")).Value); + break; + case "Hack": string hackPath = hackDir + element.Attribute(XName.Get("path")).Value; string name = element.Attribute(XName.Get("name")).Value; @@ -848,7 +887,7 @@ public static List OpenHacks(string path) } } - return hacks; + return new Tuple>(hackConfig, hacks); } public static WatchVariable GetWatchVariableFromElement(XElement element) @@ -885,6 +924,59 @@ public static WatchVariable GetWatchVariableFromElement(XElement element) return watchVar; } + public static ActionTable OpenActionTable(string path) + { + ActionTable actionTable = null; + var assembly = Assembly.GetExecutingAssembly(); + + // Create schema set + var schemaSet = new XmlSchemaSet() { XmlResolver = new ResourceXmlResolver() }; + schemaSet.Add("http://tempuri.org/ActionTableSchema.xsd", "ActionTableSchema.xsd"); + schemaSet.Compile(); + + // Load and validate document + var doc = XDocument.Load(path); + doc.Validate(schemaSet, Validation); + + foreach (XElement element in doc.Root.Elements()) + { + switch(element.Name.ToString()) + { + case "Default": + uint defaultAfterCloneValue = ParsingUtilities.ParseHex( + element.Attribute(XName.Get("afterCloneValue")).Value); + uint defaultAfterUncloneValue = ParsingUtilities.ParseHex( + element.Attribute(XName.Get("afterUncloneValue")).Value); + uint defaultHandsfreeValue = ParsingUtilities.ParseHex( + element.Attribute(XName.Get("handsfreeValue")).Value); + actionTable = new ActionTable(defaultAfterCloneValue, defaultAfterUncloneValue, defaultHandsfreeValue); + break; + + case "Action": + uint actionValue = ParsingUtilities.ParseHex( + element.Attribute(XName.Get("value")).Value); + string actionName = element.Attribute(XName.Get("name")).Value; + uint? afterCloneValue = element.Attribute(XName.Get("afterCloneValue")) != null ? + ParsingUtilities.ParseHex(element.Attribute(XName.Get("afterCloneValue")).Value) : (uint?) null; + uint? afterUncloneValue = element.Attribute(XName.Get("afterUncloneValue")) != null ? + ParsingUtilities.ParseHex(element.Attribute(XName.Get("afterUncloneValue")).Value) : (uint?) null; + uint? handsfreeValue = element.Attribute(XName.Get("handsfreeValue")) != null ? + ParsingUtilities.ParseHex(element.Attribute(XName.Get("handsfreeValue")).Value) : (uint?)null; + actionTable?.Add(new ActionTable.ActionReference() + { + Action = actionValue, + ActionName = actionName, + AfterClone = afterCloneValue, + AfterUnclone = afterUncloneValue, + Handsfree = handsfreeValue + }); + break; + } + } + + return actionTable; + } + public static void AddWatchVariableOtherData(WatchVariable watchVar) { diff --git a/Source/SM64 Diagnostic/packages.config b/Source/SM64 Diagnostic/packages.config index 0df39f1b0..a4f230b1d 100644 --- a/Source/SM64 Diagnostic/packages.config +++ b/Source/SM64 Diagnostic/packages.config @@ -1,5 +1,5 @@  - - + + \ No newline at end of file diff --git a/Windows Build/Config/CameraData.xml b/Windows Build/Config/CameraData.xml index eaa88b946..d6dc1fee3 100644 --- a/Windows Build/Config/CameraData.xml +++ b/Windows Build/Config/CameraData.xml @@ -26,4 +26,5 @@ Pitch Shake Roll Shake Camera Mode + Secondary Object \ No newline at end of file diff --git a/Windows Build/Config/Config.xml b/Windows Build/Config/Config.xml index 0118088e4..26362d837 100644 --- a/Windows Build/Config/Config.xml +++ b/Windows Build/Config/Config.xml @@ -1,9 +1,11 @@  - 60 - 0x008eba80 - Mupen - 0x400000 + + + + + 30 + 0x400000 0x8033D488 0x0260 @@ -32,22 +34,23 @@ 0x8033CBE0 0x68 - - - - - - - - - - + + + + + + + + + + - 0x80361150 + 0x80361150 - 0x8033b170 + 0x8033B170 0x0C + 0x10 0x3C 0x40 0x44 @@ -67,23 +70,26 @@ 0x58 0x5C 0xBC + 0x80361158 - 0x8033b21e - 0x8033b21c - 0x8033b218 - 0x8033b21a - 0x8033b260 - 0x8033b262 - 0x8033b268 + 0x8033B21e + 0x8033B21D + 0x8033B218 + 0x8033B21A + 0x8033B266 + 0x8033B260 + 0x8033B262 + 0x8033B264 2176 + 8 4 0 120 - 0x8033d263 - 0x80330e94 + 0x8033D263 + 0x80330E94 0x00 @@ -110,16 +116,16 @@ 0x8033B3C8 0x8033B3CC 0x8033B3D0 - 0x8033c6a4 - 0x8033c6a8 - 0x8033c6aC - 0x8033c6e4 + 0x8033C6A4 + 0x8033C6A8 + 0x8033C6AC + 0x8033C6E4 0x8033B249 0x8033B24A 0x8033BACA 0x8033BAC8 0x8038EEE0 - 0x803e0000 + 0x803E0000 \ No newline at end of file diff --git a/Windows Build/Config/Hacks.xml b/Windows Build/Config/Hacks.xml index 869d53935..bb27380b7 100644 --- a/Windows Build/Config/Hacks.xml +++ b/Windows Build/Config/Hacks.xml @@ -3,6 +3,7 @@ Resources\Hacks\ + \ No newline at end of file diff --git a/Windows Build/Config/MarioActions.xml b/Windows Build/Config/MarioActions.xml new file mode 100644 index 000000000..a42f828d1 --- /dev/null +++ b/Windows Build/Config/MarioActions.xml @@ -0,0 +1,228 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Windows Build/Config/MarioData.xml b/Windows Build/Config/MarioData.xml index d4c743671..aa48e718b 100644 --- a/Windows Build/Config/MarioData.xml +++ b/Windows Build/Config/MarioData.xml @@ -11,13 +11,16 @@ X Sliding Speed Z Sliding Speed H Sliding Speed + Sliding Angle Yaw (Facing) Yaw (Moving) Yaw (Intended) - Pitch - Roll - Yaw Velocity - Flying Pull Back + Pitch + Roll + Yaw Velocity + Flying Pull Back + First Person Yaw + First Person Pitch Interaction Object Using Object Stood On Object @@ -32,14 +35,22 @@ Metal Cap Vanish Cap Cap Timer - Action - Action Phase - Action Timer + Action + Action Description + Previous Action + Prev. Action Desc. + Action Phase + Action Timer Animation Timer - Squished Timer Hitstun Timer Peak Height Fall Height + Unsquishing Timer + Squished Timer + Splash + Bubble Spawner + Stationary Water Wave Blinking State Blinking Timer + Mario Object \ No newline at end of file diff --git a/Windows Build/Config/MiscData.xml b/Windows Build/Config/MiscData.xml index b1d2382b0..effdfe018 100644 --- a/Windows Build/Config/MiscData.xml +++ b/Windows Build/Config/MiscData.xml @@ -1,22 +1,24 @@  - Global Timer + Global Timer RNG Value RNG Index RNG Calls/Frame - Num. Loaded Objs. + Num Loaded Objs Coin Counter Red Coin Count Mission Selected Mission Layout Mission Name - Special Triple Jump - Talked to Yoshi + Star Collected Music On Volume Level Area Loading Point + Special Triple Jump + Talked to Yoshi + Never Entered Castle Current File Demo Counter Demo Timer diff --git a/Windows Build/Config/ObjectAssociations.xml b/Windows Build/Config/ObjectAssociations.xml index af9a9b5dc..8d228e150 100644 --- a/Windows Build/Config/ObjectAssociations.xml +++ b/Windows Build/Config/ObjectAssociations.xml @@ -54,16 +54,18 @@ + - + + - - Host Object + + Host Object Blinking Timer @@ -86,36 +88,39 @@ - + + - + Color Identity - + Color Identity - + Color Identity - + Color Identity + - + Grabbed + Phase HP Num A Presses @@ -154,6 +159,7 @@ + @@ -163,11 +169,13 @@ + - + Grabbed Tangible - Stopping Timer + Phase + Stopping Throwing Phase Num A Presses @@ -176,19 +184,20 @@ - + - + - + + - + @@ -204,21 +213,23 @@ - + - + + - + Grabbed - + + Destination @@ -228,7 +239,7 @@ - + Destination @@ -244,14 +255,16 @@ + - Mission + Mission - Mission + Mission + Mission @@ -260,11 +273,13 @@ Mission + + - Host Object + Host Object @@ -359,6 +374,7 @@ + Collectable Value @@ -394,13 +410,22 @@ Countdown + Countdown + + + Collectable + Value + Disappear Bhvr + Spin Timer + + @@ -410,34 +435,110 @@ + + - - + + + Destination + + + + + Destination + + + + + Destination + + + + + Destination + + + + + Destination + + + + + Destination + + + + + Destination + + + + + Destination + + + + Destination - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + Timer Max + - + Timer Max V Speed Height @@ -445,12 +546,15 @@ - + Timer Max V Speed Height Min Height + + + @@ -476,7 +580,16 @@ - + + + Appearance + + + + Appearance + + + Appearance @@ -488,6 +601,9 @@ + + + @@ -526,75 +642,83 @@ - + - + + - + Steals Hat Grabbed Wearing Hat + - + Steals Hat Grabbed Wearing Hat - Ukiki Target Object + Ukiki Target Object - Host Object + Host Object - + - + Oscillation Timer - + Oscillation Timer - Host Object + Host Object - Oscillation Timer + Oscillation Timer + - + + Appearance - - + + + - - + + + + Appearance + Opaqueness @@ -602,6 +726,7 @@ + @@ -614,8 +739,9 @@ + - + Knockback @@ -642,7 +768,7 @@ - + @@ -652,54 +778,60 @@ - + - + - + - + - + Tangible - + Tangible + - + Num Coins + - + + - + + + + - + Grabbed - Host Object + Host Object @@ -708,11 +840,13 @@ + + - + @@ -721,9 +855,11 @@ + - + Grabbed + Phase HP Blinking State Blinking Timer @@ -731,8 +867,9 @@ - + Grabbed + Phase HP Blinking State Blinking Timer @@ -740,8 +877,9 @@ - + Grabbed + Phase HP Blinking State Blinking Timer @@ -765,31 +903,43 @@ Appearance - + Appearance - - + + + Appearance + + + + + Appearance - + + + + + Appearance + Appearance - + + Appearance - + Appearance - + @@ -828,27 +978,27 @@ - + - + - + Phase - + - + - + Oscillation Timer @@ -860,25 +1010,26 @@ - + - + Oscillation Timer - + Oscillation Timer - + + - + Being Ridden @@ -886,98 +1037,116 @@ - + Phase + - + Lullaby Music Num Coins - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + State 2 + - + + Phase Talking Phase + + + + Fake + Grabbed + Returning + + - + Fake Grabbed Returning - + + Fake + Grabbed + Returning + + + + Fake Grabbed Returning @@ -1080,148 +1249,164 @@ - + - + - + - + - + - + - + Bub Loaded + - + + - + Appearance Contents Opening + - + Appearance Contents Opening + - + Appearance Contents Opening + - + Appearance Contents Opening + - + Appearance Contents Opening + - + Appearance Contents Opening + - + Appearance Contents Opening + - + Appearance Contents Opening + - + Appearance Contents Opening + - + Appearance Contents Opening + - + Appearance Contents Opening + - + Appearance Contents Opening + - + Appearance Contents Opening + - + Appearance Contents Opening + - + Appearance Contents Opening - + Appearance Contents Opening @@ -1234,18 +1419,19 @@ - + - + + - + Rev Angle @@ -1253,15 +1439,15 @@ - Host Object + Host Object - Oscillation Timer + Oscillation Timer - Oscillation Timer + Oscillation Timer @@ -1289,22 +1475,33 @@ - + Spin Timer - + - - + + + + + + + + + Opening + + + Opening + - + Water Level @@ -1324,62 +1521,65 @@ - + Opaqueness - Oscillation + Oscillation Timer - + Target Opaqueness Opaqueness - Oscillation + Oscillation Timer - + HP Target Opaqueness Opaqueness - Oscillation + Oscillation Timer - + HP Target Opaqueness Opaqueness - Oscillation + Oscillation Timer - + HP Target Opaqueness Opaqueness - Oscillation + Oscillation Timer + + + - + Target Opaqueness Opaqueness - Oscillation - + Oscillation Timer - + Target Opaqueness Opaqueness - Oscillation + Oscillation Timer + - + Target Opaqueness Opaqueness - Oscillation + Oscillation Timer @@ -1389,7 +1589,7 @@ - + @@ -1397,11 +1597,11 @@ - + - + Rotating @@ -1420,12 +1620,42 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -1433,7 +1663,7 @@ - + Num Coins Target Angle Lunging @@ -1445,18 +1675,22 @@ Scuttlebug Loaded + - + + Phase HP Falling + - + Num Coins Falling + @@ -1468,7 +1702,7 @@ - + @@ -1483,7 +1717,7 @@ - + @@ -1494,29 +1728,32 @@ - State 2 + Phase Blowing Angle + - + - + Animation Animation Timer Walking Timer Burn Timer Cannon Yaw + Pole Height Relative Height + - + Text State 2 Talking Phase @@ -1579,9 +1816,11 @@ + + @@ -1597,8 +1836,9 @@ + - + Can Move Has Coin Grabbed @@ -1611,22 +1851,24 @@ + - + Blinking Blinking Timer - + Blinking Blinking Timer - + + Occupied @@ -1634,8 +1876,9 @@ + - + Text Mario Reading @@ -1646,28 +1889,28 @@ - + Height Timer Base Height Lunging Electricity + - + Rev Angle Height Timer Radius Electricity - Object Hit - + - + State 2 Flying @@ -1678,6 +1921,7 @@ + @@ -1694,36 +1938,49 @@ - + - + - + + - + + Next Ring Index + Last Ring Collected + Num Rings Collected Make Rings - Rings Collected + Ring Index Opaqueness + Collected + Ring Index Opaqueness + Collected + + + + Next Ring Index + Last Ring Collected + - + @@ -1746,9 +2003,12 @@ + + + - - + + @@ -1761,7 +2021,7 @@ - + Jumping Phase @@ -1776,6 +2036,7 @@ + @@ -1792,7 +2053,7 @@ - + Rolling Timer @@ -1806,7 +2067,7 @@ - + Breaking Num Activators Angular Acceleration? @@ -1856,17 +2117,21 @@ + Bouncing State + + Bouncing State + Bouncing State @@ -1892,6 +2157,7 @@ Spawn Star + Spin Timer @@ -1908,31 +2174,35 @@ - + - + + + + + Activators Needed Activators Collected @@ -1941,6 +2211,7 @@ + @@ -1951,15 +2222,16 @@ - + - + + - + Grabbed Static Angle Active Hurtbox @@ -1974,12 +2246,14 @@ + Floating Oscillation Timer + Floating @@ -1991,57 +2265,71 @@ - + + Value + Value + Value + Value + Value + Value + Value + Value + Value + Value + - + + Num Rings Collected Make Rings - Rings Collected + + + @@ -2062,29 +2350,31 @@ - - Open + + Used - + - + Second Occurrence Grabbed + - + Target Location Blinking Blinking Timer + - + Act Shelled Target Angle Countdown @@ -2092,24 +2382,27 @@ Blinking Countdown + - + Waypoint Target Angle Blinking Blinking Countdown + - + Waypoint Target Angle Blinking Blinking Countdown + - + Act Shelled Target Angle Countdown @@ -2117,7 +2410,14 @@ Blinking Countdown + + Result + State 2 + Race Started + Race Finished + KtQ Finished + Used Cannon @@ -2129,32 +2429,33 @@ - + Blinking Blinking Countdown - + Blinking Blinking Countdown - + Target Angle Wing Flap + - + Can Shoot Fire Scale Change Scale - + Target Angle Countdown Blinking @@ -2162,89 +2463,100 @@ - + Target Angle Countdown + Chase Extension Blinking Blinking Countdown - + Target Angle Countdown + Chase Extension Blinking Blinking Countdown - + Target Angle Countdown + Chase Extension Blinking Blinking Countdown - + Target Angle Countdown + Chase Extension Blinking Blinking Countdown - + Target Angle Countdown + Chase Extension Blinking Blinking Countdown - + Target Angle Countdown + Chase Extension Blinking Blinking Countdown - + Target Angle Countdown + Chase Extension Blinking Blinking Countdown - + Target Angle Countdown + Chase Extension Blinking Blinking Countdown - + Target Angle Countdown + Chase Extension Blinking Blinking Countdown - + Target Angle Countdown + Chase Extension Blinking Blinking Countdown - + Target Angle Countdown + Chase Extension Blinking Blinking Countdown @@ -2270,8 +2582,9 @@ Goomba 3 Dead + - + Lunging Phase Num Bounces @@ -2283,8 +2596,9 @@ + - + Num Coins Angular Distance Lowered Distance @@ -2295,16 +2609,16 @@ - + HP - + - + Countdown Spiny Count Throwing Phase @@ -2334,13 +2648,14 @@ - + Countdown + @@ -2366,44 +2681,53 @@ - + Rotational Speed - + Rotational Speed - + Rotational Speed - + Rotational Speed - + Rotational Speed - + Rotational Speed - + Rotational Speed - - + + + + + - + + + + + + + @@ -2411,6 +2735,7 @@ Countdown + On Ground Num Bounces @@ -2425,7 +2750,7 @@ - + Timer Max @@ -2444,20 +2769,20 @@ - + Timer Max Countdown - + Target Ang Vel Current Ang Vel Angle - + Target Ang Vel Current Ang Vel Angle @@ -2479,7 +2804,7 @@ - + Timer Max Target Angle Angle @@ -2488,7 +2813,7 @@ - + Timer Max Target Angle Angle @@ -2503,7 +2828,7 @@ - + Wearing Hat Num Coins Dizziness Change @@ -2555,11 +2880,12 @@ - + Speed Countdown + Mario Inside Angular Velocity @@ -2572,8 +2898,9 @@ + - + Star on Tail Saw Mario Phase @@ -2582,15 +2909,16 @@ + - + - + @@ -2609,7 +2937,7 @@ - + Max Scale Num Coins Spin when Hit @@ -2617,7 +2945,7 @@ - + Max Scale Num Coins Spin when Hit @@ -2630,6 +2958,7 @@ Lifespan Timer + Scale Spitting Fire @@ -2649,7 +2978,7 @@ - + @@ -2665,17 +2994,22 @@ - + Appearance Target Location - + + + + + - + + - + Mario Cheated Mario Finished First Effort @@ -2695,12 +3029,14 @@ Can Move + - + + - + Target Angle Lunging @@ -2751,17 +3087,32 @@ - + - + + + + Activation Type + + + Activation Type + + + + Activation Type + + + + Activation Type + - + Mouth Open Lunging Countdown @@ -2772,7 +3123,7 @@ - + Opaqueness @@ -2781,6 +3132,9 @@ + + + diff --git a/Windows Build/Config/ObjectData.xml b/Windows Build/Config/ObjectData.xml index 9177bf69a..21e4a5ae1 100644 --- a/Windows Build/Config/ObjectData.xml +++ b/Windows Build/Config/ObjectData.xml @@ -16,21 +16,25 @@ Yaw (Rot Speed) Pitch (Rot Speed) Roll (Rot Speed) - Dist to Mario - Act. Dist to Mario - Lat. Dist to Mario - Angle to Mario - Act. Angle To Mario - Delta Angle To Mario - Mario Angle To Object - Delta Mario Angle To Object + "Dist to Mario" + Dist Mario to Obj + LDist Mario to Obj + Dist Mario to Home + LDist Mario to Home + Dist Obj to Home + LDist Obj to Home + "Angle to Mario" + Angle Obj to Mario + DAngle Obj to Mario + Angle Mario to Obj + DAngle Mario to Obj Drawing Dist RNG Calls/Frame Parent Object Behavior Script Graphic/Model Visible - Visible 2 + Rendered Face Camera Mario Close Animation @@ -41,12 +45,8 @@ Home X Home Y Home Z - Mario Dist to Home - Mario Lat. Dist to Home - Dist to Home - Lat. Dist to Home Release Status - Interaction Status + Interaction Status Subtype State Timer diff --git a/Windows Build/Config/TrianglesData.xml b/Windows Build/Config/TrianglesData.xml index 00e3c1640..487aedcbf 100644 --- a/Windows Build/Config/TrianglesData.xml +++ b/Windows Build/Config/TrianglesData.xml @@ -18,33 +18,32 @@ X3 Y3 Z3 - Normal X - Normal Y - Normal Z - Normal Offset - Associated Object - Uphill Angle - Downhill Angle - Right Hill Angle - Left Hill Angle - Steepness Mario X Mario Y Mario Z - Closest Vertex - Closest Vertex X - Closest Vertex Y - Closest Vertex Z + Closest Vertex + Closest Vertex X + Closest Vertex Y + Closest Vertex Z + Steepness + Uphill Angle + Downhill Angle + Left Hill Angle + Right Hill Angle M. Yaw (Intended) M. Yaw (Facing) - Floor Triangle - Wall Triangle - Ceiling Triangle - Floor Height - Height On Slope - Ceiling Height - Dist Below Ceiling - Dist Above Floor - Normal Dist Away - Vertical Dist Away + Normal X + Normal Y + Normal Z + Normal Offset + Associated Object Floor Triangle + Wall Triangle + Ceiling Triangle + Floor Height + Ceiling Height + Dist Above Floor + Dist Below Ceiling + Normal Dist Away + Vertical Dist Away + Height On Slope \ No newline at end of file diff --git a/Windows Build/OpenTK.GLControl.dll b/Windows Build/OpenTK.GLControl.dll index 026c7431d..364061ac0 100644 Binary files a/Windows Build/OpenTK.GLControl.dll and b/Windows Build/OpenTK.GLControl.dll differ diff --git a/Windows Build/OpenTK.dll b/Windows Build/OpenTK.dll index 3a383ff16..5ab5ebdb9 100644 Binary files a/Windows Build/OpenTK.dll and b/Windows Build/OpenTK.dll differ diff --git a/Windows Build/Resources/Hacks/Camera45Hack.hck b/Windows Build/Resources/Hacks/Camera45Hack.hck index 209292ee9..94b8bf85b 100644 --- a/Windows Build/Resources/Hacks/Camera45Hack.hck +++ b/Windows Build/Resources/Hacks/Camera45Hack.hck @@ -1,2 +1,2 @@ -80286ABC: 0e 00 19 24 -80286ACC: 0e 00 09 24 \ No newline at end of file +80286ABC: 24 19 00 0e +80286ACC: 24 09 00 0e \ No newline at end of file diff --git a/Windows Build/Resources/Hacks/PuVisible.hck b/Windows Build/Resources/Hacks/PuVisible.hck index df7585efb..e99596640 100644 --- a/Windows Build/Resources/Hacks/PuVisible.hck +++ b/Windows Build/Resources/Hacks/PuVisible.hck @@ -1,6 +1,6 @@ -802a816c: 90 ff bd 27 -802a8174: 25 20 a0 00 14 00 a5 27 9d 7c 0a 0c 30 00 86 24 25 40 00 00 80 47 01 3c 00 10 81 44 00 47 01 3c 00 20 81 44 21 48 a8 00 00 00 26 c5 3c 30 04 46 03 00 01 45 00 00 00 00 fc ff 00 10 81 31 02 46 07 21 00 46 3c 20 06 46 03 00 01 45 00 00 00 00 fc ff 00 10 80 31 02 46 00 00 26 e5 04 00 08 25 0c 00 01 2d eb ff 20 14 00 00 00 00 25 28 80 00 9a e3 0d 0c 30 00 a4 27 00 00 00 00 25 20 a0 00 60 00 a5 27 80 7c 0a 0c 14 00 a6 27 -802a8204: 00 00 00 00 30 00 a2 27 24 00 bf 8f 08 00 e0 03 70 00 bd 27 +802a816c: 27 bd ff 90 +802a8174: 00 a0 20 25 27 a5 00 14 0c 0a 7c 9d 24 86 00 30 00 00 40 25 3c 01 47 80 44 81 10 00 3c 01 47 00 44 81 20 00 00 a8 48 21 c5 26 00 00 46 04 30 3c 45 01 00 03 00 00 00 00 10 00 ff fc 46 02 31 83 46 00 21 07 46 06 20 3c 45 01 00 03 00 00 00 00 10 00 ff fc 46 02 31 80 e5 26 00 00 25 08 00 04 2d 01 00 0c 14 20 ff eb 00 00 00 00 00 80 28 25 0c 0d e3 9a 27 a4 00 30 00 00 00 00 00 a0 20 25 27 a5 00 60 0c 0a 7c 80 27 a6 00 14 +802a8204: 00 00 00 00 27 a2 00 30 8f bf 00 24 03 e0 00 08 27 bd 00 70 802a821c: 00 00 00 00 -8037a434: d0 ff bd 27 14 00 bf af 18 00 a4 af 1c 00 a5 af ff 0f ff 33 7c 00 01 24 03 00 e1 17 1c 00 a2 8f 5b a0 0a 0c 00 00 00 00 25 48 42 00 18 00 aa 8f 25 58 00 00 00 00 26 c5 04 00 29 25 80 47 01 3c 00 20 81 44 20 00 48 25 02 32 04 46 8d 42 00 46 20 00 aa e7 20 00 ac 27 00 00 8d 85 00 00 4d a5 02 00 4a 25 02 00 8d 85 00 00 0d a5 01 00 6b 25 10 00 61 29 ef ff 20 14 14 00 bf 8f -8037a4b4: 30 00 bd 27 \ No newline at end of file +8037a434: 27 bd ff d0 af bf 00 14 af a4 00 18 af a5 00 1c 33 ff 0f ff 24 01 00 7c 17 e1 00 03 8f a2 00 1c 0c 0a a0 5b 00 00 00 00 00 42 48 25 8f aa 00 18 00 00 58 25 c5 26 00 00 25 29 00 04 3c 01 47 80 44 81 20 00 25 48 00 20 46 04 32 02 46 00 42 8d e7 aa 00 20 27 ac 00 20 85 8d 00 00 a5 4d 00 00 25 4a 00 02 85 8d 00 02 a5 0d 00 00 25 6b 00 01 29 61 00 10 14 20 ff ef 8f bf 00 14 +8037a4b4: 27 bd 00 30 diff --git a/Windows Build/Resources/Hacks/SpawnHack.hck b/Windows Build/Resources/Hacks/SpawnHack.hck new file mode 100644 index 000000000..fa6cf6da1 --- /dev/null +++ b/Windows Build/Resources/Hacks/SpawnHack.hck @@ -0,0 +1,24 @@ +8033D2DE: 00 01 +80330E94: 03 +802CB2CC: 87 24 +802CB2CE: 24 48 +802CB2B8: 3C 0B +802CB2BA: 80 34 +802CB2BC: 8D 6C +802CB2BE: D3 D0 +802CB2C0: 85 6B +802CB2C2: D3 D4 +802CB2A6: 00 20 +802CB2E4: 24 04 +802CB2E6: 00 90 +802CB2E8: 24 05 +802CB2EA: 00 08 +802CB2EC: 3C 06 +802CB2EE: 80 34 +802CB2F0: 0C 0B +802CB2F2: 59 B0 +802CB2F4: 24 C6 +802CB2F6: D3 E0 +8033D3E0: 59 45 +802CB2F8: 10 00 +802CB2FA: 00 22 \ No newline at end of file diff --git a/Windows Build/Resources/Object Images/Bird Spawner.png b/Windows Build/Resources/Object Images/Bird Spawner.png new file mode 100644 index 000000000..29b894d47 Binary files /dev/null and b/Windows Build/Resources/Object Images/Bird Spawner.png differ diff --git a/Windows Build/Resources/Object Images/Blue Falling Flame.png b/Windows Build/Resources/Object Images/Blue Falling Flame.png new file mode 100644 index 000000000..20756f792 Binary files /dev/null and b/Windows Build/Resources/Object Images/Blue Falling Flame.png differ diff --git a/Windows Build/Resources/Object Images/Boo Triplet Spawner.png b/Windows Build/Resources/Object Images/Boo Triplet Spawner.png new file mode 100644 index 000000000..3d1c6d5e0 Binary files /dev/null and b/Windows Build/Resources/Object Images/Boo Triplet Spawner.png differ diff --git a/Windows Build/Resources/Object Images/Door 0 Star.png b/Windows Build/Resources/Object Images/Door 0 Star.png new file mode 100644 index 000000000..951d5d26d Binary files /dev/null and b/Windows Build/Resources/Object Images/Door 0 Star.png differ diff --git a/Windows Build/Resources/Object Images/Door 1 Star.png b/Windows Build/Resources/Object Images/Door 1 Star.png new file mode 100644 index 000000000..3f1cb52b8 Binary files /dev/null and b/Windows Build/Resources/Object Images/Door 1 Star.png differ diff --git a/Windows Build/Resources/Object Images/Door 3 Star.png b/Windows Build/Resources/Object Images/Door 3 Star.png new file mode 100644 index 000000000..5ae1997dd Binary files /dev/null and b/Windows Build/Resources/Object Images/Door 3 Star.png differ diff --git a/Windows Build/Resources/Object Images/Door Key Warp.png b/Windows Build/Resources/Object Images/Door Key Warp.png new file mode 100644 index 000000000..9e07efdfa Binary files /dev/null and b/Windows Build/Resources/Object Images/Door Key Warp.png differ diff --git a/Windows Build/Resources/Object Images/Door Key.png b/Windows Build/Resources/Object Images/Door Key.png new file mode 100644 index 000000000..9207b6b86 Binary files /dev/null and b/Windows Build/Resources/Object Images/Door Key.png differ diff --git a/Windows Build/Resources/Object Images/Door Metal Warp.png b/Windows Build/Resources/Object Images/Door Metal Warp.png new file mode 100644 index 000000000..7379bbb31 Binary files /dev/null and b/Windows Build/Resources/Object Images/Door Metal Warp.png differ diff --git a/Windows Build/Resources/Object Images/Door Metal.png b/Windows Build/Resources/Object Images/Door Metal.png new file mode 100644 index 000000000..2e3722b72 Binary files /dev/null and b/Windows Build/Resources/Object Images/Door Metal.png differ diff --git a/Windows Build/Resources/Object Images/Door Spooky.png b/Windows Build/Resources/Object Images/Door Spooky.png new file mode 100644 index 000000000..534ce8c60 Binary files /dev/null and b/Windows Build/Resources/Object Images/Door Spooky.png differ diff --git a/Windows Build/Resources/Object Images/Door Standard Warp.png b/Windows Build/Resources/Object Images/Door Standard Warp.png new file mode 100644 index 000000000..80831466a Binary files /dev/null and b/Windows Build/Resources/Object Images/Door Standard Warp.png differ diff --git a/Windows Build/Resources/Object Images/Door Standard.png b/Windows Build/Resources/Object Images/Door Standard.png new file mode 100644 index 000000000..a88330662 Binary files /dev/null and b/Windows Build/Resources/Object Images/Door Standard.png differ diff --git a/Windows Build/Resources/Object Images/Door Starry.png b/Windows Build/Resources/Object Images/Door Starry.png new file mode 100644 index 000000000..63d2aa935 Binary files /dev/null and b/Windows Build/Resources/Object Images/Door Starry.png differ diff --git a/Windows Build/Resources/Object Images/Door Wooden Warp.png b/Windows Build/Resources/Object Images/Door Wooden Warp.png new file mode 100644 index 000000000..f4eb6c482 Binary files /dev/null and b/Windows Build/Resources/Object Images/Door Wooden Warp.png differ diff --git a/Windows Build/Resources/Object Images/Door Wooden.png b/Windows Build/Resources/Object Images/Door Wooden.png new file mode 100644 index 000000000..ef06e9e24 Binary files /dev/null and b/Windows Build/Resources/Object Images/Door Wooden.png differ diff --git a/Windows Build/Resources/Object Images/Door.png b/Windows Build/Resources/Object Images/Door.png deleted file mode 100644 index f3e5b8948..000000000 Binary files a/Windows Build/Resources/Object Images/Door.png and /dev/null differ diff --git a/Windows Build/Resources/Object Images/Falling Pillar Hitbox.png b/Windows Build/Resources/Object Images/Falling Pillar Hitbox.png new file mode 100644 index 000000000..fbf1abbb2 Binary files /dev/null and b/Windows Build/Resources/Object Images/Falling Pillar Hitbox.png differ diff --git a/Windows Build/Resources/Object Images/LLL Drawbridge 2.png b/Windows Build/Resources/Object Images/LLL Drawbridge 2.png new file mode 100644 index 000000000..1a4fa8142 Binary files /dev/null and b/Windows Build/Resources/Object Images/LLL Drawbridge 2.png differ diff --git a/Windows Build/Resources/Object Images/LLL Drawbridge Spawner.png b/Windows Build/Resources/Object Images/LLL Drawbridge Spawner.png new file mode 100644 index 000000000..6c2d7a3af Binary files /dev/null and b/Windows Build/Resources/Object Images/LLL Drawbridge Spawner.png differ diff --git a/Windows Build/Resources/Object Images/LLL Drawbridges.png b/Windows Build/Resources/Object Images/LLL Drawbridges.png new file mode 100644 index 000000000..e4a2f5059 Binary files /dev/null and b/Windows Build/Resources/Object Images/LLL Drawbridges.png differ diff --git a/Windows Build/Resources/Object Images/Manta Ring Manager.png b/Windows Build/Resources/Object Images/Manta Ring Manager.png new file mode 100644 index 000000000..f8cce724f Binary files /dev/null and b/Windows Build/Resources/Object Images/Manta Ring Manager.png differ diff --git a/Windows Build/Resources/Object Images/Mario Breath Particle Spawner.png b/Windows Build/Resources/Object Images/Mario Breath Particle Spawner.png new file mode 100644 index 000000000..d35ccfa4e Binary files /dev/null and b/Windows Build/Resources/Object Images/Mario Breath Particle Spawner.png differ diff --git a/Windows Build/Resources/Object Images/Number.png b/Windows Build/Resources/Object Images/Number.png deleted file mode 100644 index 46782b135..000000000 Binary files a/Windows Build/Resources/Object Images/Number.png and /dev/null differ diff --git a/Windows Build/Resources/Object Images/Openable Gate 2 HMC.png b/Windows Build/Resources/Object Images/Openable Gate 2 HMC.png new file mode 100644 index 000000000..ab0dbd0f4 Binary files /dev/null and b/Windows Build/Resources/Object Images/Openable Gate 2 HMC.png differ diff --git a/Windows Build/Resources/Object Images/Openable Gate Behavior 2.png b/Windows Build/Resources/Object Images/Openable Gate Behavior 2.png deleted file mode 100644 index d0f2d07e0..000000000 Binary files a/Windows Build/Resources/Object Images/Openable Gate Behavior 2.png and /dev/null differ diff --git a/Windows Build/Resources/Object Images/Openable Gate Behavior.png b/Windows Build/Resources/Object Images/Openable Gate Behavior.png deleted file mode 100644 index a6789f2f1..000000000 Binary files a/Windows Build/Resources/Object Images/Openable Gate Behavior.png and /dev/null differ diff --git a/Windows Build/Resources/Object Images/Openable Gate BoB.png b/Windows Build/Resources/Object Images/Openable Gate BoB.png new file mode 100644 index 000000000..bc25f8899 Binary files /dev/null and b/Windows Build/Resources/Object Images/Openable Gate BoB.png differ diff --git a/Windows Build/Resources/Object Images/Openable Gate HMC.png b/Windows Build/Resources/Object Images/Openable Gate HMC.png new file mode 100644 index 000000000..88bca4bb5 Binary files /dev/null and b/Windows Build/Resources/Object Images/Openable Gate HMC.png differ diff --git a/Windows Build/Resources/Object Images/Openable Gate Manager BoB.png b/Windows Build/Resources/Object Images/Openable Gate Manager BoB.png new file mode 100644 index 000000000..b415f47a2 Binary files /dev/null and b/Windows Build/Resources/Object Images/Openable Gate Manager BoB.png differ diff --git a/Windows Build/Resources/Object Images/Openable Gate Manager HMC.png b/Windows Build/Resources/Object Images/Openable Gate Manager HMC.png new file mode 100644 index 000000000..63e28a82e Binary files /dev/null and b/Windows Build/Resources/Object Images/Openable Gate Manager HMC.png differ diff --git a/Windows Build/Resources/Object Images/Openable Gate.png b/Windows Build/Resources/Object Images/Openable Gate.png deleted file mode 100644 index e666797bf..000000000 Binary files a/Windows Build/Resources/Object Images/Openable Gate.png and /dev/null differ diff --git a/Windows Build/Resources/Object Images/Falling Flame.png b/Windows Build/Resources/Object Images/Orange Falling Flame.png similarity index 100% rename from Windows Build/Resources/Object Images/Falling Flame.png rename to Windows Build/Resources/Object Images/Orange Falling Flame.png diff --git a/Windows Build/Resources/Object Images/Flame.png b/Windows Build/Resources/Object Images/Orange Flame.png similarity index 100% rename from Windows Build/Resources/Object Images/Flame.png rename to Windows Build/Resources/Object Images/Orange Flame.png diff --git a/Windows Build/Resources/Object Images/Blue Lava Bubble Spawner.png b/Windows Build/Resources/Object Images/Podoboo Blue Spawner.png similarity index 100% rename from Windows Build/Resources/Object Images/Blue Lava Bubble Spawner.png rename to Windows Build/Resources/Object Images/Podoboo Blue Spawner.png diff --git a/Windows Build/Resources/Object Images/Blue Lava Bubble Flame.png b/Windows Build/Resources/Object Images/Podoboo Blue.png similarity index 100% rename from Windows Build/Resources/Object Images/Blue Lava Bubble Flame.png rename to Windows Build/Resources/Object Images/Podoboo Blue.png diff --git a/Windows Build/Resources/Object Images/Lava Bubble Spawner.png b/Windows Build/Resources/Object Images/Podoboo Orange Spawner.png similarity index 100% rename from Windows Build/Resources/Object Images/Lava Bubble Spawner.png rename to Windows Build/Resources/Object Images/Podoboo Orange Spawner.png diff --git a/Windows Build/Resources/Object Images/Lava Bubble.png b/Windows Build/Resources/Object Images/Podoboo Orange.png similarity index 100% rename from Windows Build/Resources/Object Images/Lava Bubble.png rename to Windows Build/Resources/Object Images/Podoboo Orange.png diff --git a/Windows Build/Resources/Object Images/Revolving Elevator Axle.png b/Windows Build/Resources/Object Images/Revolving Elevator Axle.png new file mode 100644 index 000000000..5f498caa5 Binary files /dev/null and b/Windows Build/Resources/Object Images/Revolving Elevator Axle.png differ diff --git a/Windows Build/Resources/Object Images/Revolving Elevator BitDW.png b/Windows Build/Resources/Object Images/Revolving Elevator BitDW.png new file mode 100644 index 000000000..a4ec00e53 Binary files /dev/null and b/Windows Build/Resources/Object Images/Revolving Elevator BitDW.png differ diff --git a/Windows Build/Resources/Object Images/Revolving Elevator.png b/Windows Build/Resources/Object Images/Revolving Elevator BitS.png similarity index 100% rename from Windows Build/Resources/Object Images/Revolving Elevator.png rename to Windows Build/Resources/Object Images/Revolving Elevator BitS.png diff --git a/Windows Build/Resources/Object Images/Slip Slidin Away Star Spawner.png b/Windows Build/Resources/Object Images/Slip Slidin Away Star Spawner.png new file mode 100644 index 000000000..7adf7868b Binary files /dev/null and b/Windows Build/Resources/Object Images/Slip Slidin Away Star Spawner.png differ diff --git a/Windows Build/Resources/Object Images/Slip Slidin Away.png b/Windows Build/Resources/Object Images/Slip Slidin Away.png new file mode 100644 index 000000000..9eb395547 Binary files /dev/null and b/Windows Build/Resources/Object Images/Slip Slidin Away.png differ diff --git a/Windows Build/Resources/Object Images/Star Door.png b/Windows Build/Resources/Object Images/Star Door.png index e1a119771..314a1c83c 100644 Binary files a/Windows Build/Resources/Object Images/Star Door.png and b/Windows Build/Resources/Object Images/Star Door.png differ diff --git a/Windows Build/Resources/Object Images/Tree Palm.png b/Windows Build/Resources/Object Images/Tree Palm.png new file mode 100644 index 000000000..ee7814064 Binary files /dev/null and b/Windows Build/Resources/Object Images/Tree Palm.png differ diff --git a/Windows Build/Resources/Object Images/Tree Pine Snowy.png b/Windows Build/Resources/Object Images/Tree Pine Snowy.png new file mode 100644 index 000000000..769b30226 Binary files /dev/null and b/Windows Build/Resources/Object Images/Tree Pine Snowy.png differ diff --git a/Windows Build/Resources/Object Images/Tree Pine.png b/Windows Build/Resources/Object Images/Tree Pine.png new file mode 100644 index 000000000..ec1d59024 Binary files /dev/null and b/Windows Build/Resources/Object Images/Tree Pine.png differ diff --git a/Windows Build/Resources/Object Images/Tree Standard.png b/Windows Build/Resources/Object Images/Tree Standard.png new file mode 100644 index 000000000..606303bd3 Binary files /dev/null and b/Windows Build/Resources/Object Images/Tree Standard.png differ diff --git a/Windows Build/Resources/Object Images/Tree.png b/Windows Build/Resources/Object Images/Tree.png deleted file mode 100644 index ae5e274c7..000000000 Binary files a/Windows Build/Resources/Object Images/Tree.png and /dev/null differ diff --git a/Windows Build/Resources/Object Images/Warp Door.png b/Windows Build/Resources/Object Images/Warp Door.png deleted file mode 100644 index 24ae3214a..000000000 Binary files a/Windows Build/Resources/Object Images/Warp Door.png and /dev/null differ diff --git a/Windows Build/Stroop.exe b/Windows Build/Stroop.exe index c4d8dcb85..ec75cf75d 100644 Binary files a/Windows Build/Stroop.exe and b/Windows Build/Stroop.exe differ