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 @@
@@ -154,6 +159,7 @@
@@ -176,19 +184,20 @@
-
-
+
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