SuperMario64 Technical Runtime Observer and Object Processor, or STROOP for short, is a diagnostic tool for Super Mario 64 which displays and allows for simple editing of various game values and information. It can connect to a running emulator and update values in real time. Some core features include views of loaded/unloaded objects, Mario structure variables, camera + HUD values, an overhead map display, and many more. An up-to-date version of STROOP can be downloaded from here.

STROOP on Windows 10
Tyler's ROM hack that displayed the object slots in text form
A blueprint of what Pannenkoek2012 suggested the program should look like
The SM64 Diagnostic

History

After Pannenkoek2012 discussed object slots in his Science of Cloning video, there had been a desire to view the object slots of the game in real time. Pannenkoek2012 discussed this desire with Tyler Kehne. Tyler then proceeded to make a ROM hack that could display the object slot behaviors in text form, overlaid onto the screen. Pannenkoek2012 was not pleased with this implementation, as he wanted a separate program that would show the slots visually with images of the objects. Thus, Tyler then proceeded to make a program that would do just that, which he named the SM64 Diagnostic. Tyler wrote the code for it, and Pannenkoek2012 provided the object images and names. The SM64 Diagnostic was a major breakthrough, as it showed the object slots, the process groups, the held object, object variables, and Mario variables. However, it also had some annoyances, such as it couldn't connect to an already open Mupen (it had to open Mupen itself), it would occasionally crash Mupen, the angle variables (yaw/pitch/roll) had confusing names, the variables couldn't be edited, and the checkbox variables used a confusing system.

Some time later, Dane Bouchie created a new program called STROOP, which was based on the SM64 Diagnostic, but with many more features and improved functionality. Later, Pannenkoek2012 also began coding for STROOP, adding even more features and functionality. As of today, STROOP has object slots, object variables, Mario variables, HUD variables, camera variables, triangle variables, water variables, an input display, a file display, a map that can display objects in real time, an M64 editor, and savable options so that the user can customize their experience.

Loading Screen

 
STROOP Loading Screen

When first opening STROOP, you'll be greeted with a loading screen. This displays what is currently being initialized, as well as a random helpful hint.

Connection Screen

After STROOP finishes loading, you'll encounter a screen where you can choose what process or savestate to connect to. There are various buttons to use:

  • Refresh: Refreshes the list of processes to choose from.
  • Connect: Connects STROOP to the currently selected process.
  • Bypass: Bypasses the start screen. Note that most functionality won't work if you press this, as most functionality relies on having a data stream to interact with. But this could be useful if you only want to use the M64 editor, for example.
  • Refresh & Connect: Refreshes the list of processes to choose from, and then connects STROOP to the currently selected process. This can save a button press in the case that you need to press both Refresh and Connect.
  • Open Savestate: Connects STROOP to a savestate, chosen from the File Manager. This can be useful if you want to modify values in a savestate, such as global timer or RNG. If you've edited a savestate and want to save it, then right click on the Disconnect button on the top left of STROOP, and you'll see an option to save the savestate.

Top-Level Controls

On the top of STROOP are several controls that may be of use. These are:

  • Disconnect Button: Disconnects from the current process or savestate. Right click on this for the option to save a savestate after it's been modified.
  • FPS Counter: Displays the number of frames per second that STROOP is running at. By default, STROOP aims for 30 FPS. However, this can be changed in the Options tab.
  • Connected To: Displays the process that STROOP is currently connected to.
  • Left/Right Arrow Buttons: These can be used to reorder tabs. Simply click on one of the arrow buttons and the currently selected tab will move one spot over in that direction. Right click on these buttons for an option to restore the tabs to the recommended tab order. Separately, you can click on the arrow buttons while holding control, and this will move the currently selected object slots over one spot in that direction. Furthermore, you can click on the arrow buttons while holding a number n, and this will move the currently selected object slots over n spots in that direction.
  • Add Tab Button: Click on this button to see a list of tabs that have been hidden. Click on one of these tabs to restore that tab. Alternatively, click on "Restore All Tabs" to restore all of the tabs.
  • ROM Version: This displays the ROM version that STROOP is currently operating under. By default, it tries to auto-detect what ROM version is being used. However, if you want to use a specific ROM version instead of the auto-detected one, then choose one of the ROM version options without the "AUTO" prefix.
  • ReadWrite/ReadOnly Mode: This displays whether STROOP is is ReadWrite mode or ReadOnly mode. By default, it will be in ReadWrite mode, allowing the user to modify variables. In ReadOnly mode, modifying variables won't work.
  • Panel Hide/Show Buttons: These 6 buttons allow you to adjust which panels are hidden/shown in any tab of STROOP. In order from left to right, these are: Left Only, Left + Right, Right Only, Bottom Only, Bottom + Top, Top Only. By default, these buttons will only affect the outermost panels. However, for situations where there are nested panels (e.g. the Memory Tab), you can control which set of panels is being targeted by holding down a number key. Specifically, holding down the number n will target the nth set of panels, where panels are indexed from outermost to innermost. Thus, holding down the number 1 is equivalent to not holding down any number, since it automatically targets the outermost pair of panels. Holding down 2 or higher will affect other panels, assuming they're on screen.
  • Cog: The cog can be used to quickly and easily toggle savable options, to reset saved options, or to go directly to the Options tab. For more information about the savable options, see the Options Tab section.
  • Version Number: This displays the current version number of STROOP. Right clicking on this provides debugging/developer options, most of which aren't intended for the casual user. Nevertheless, some useful options include:
    • Enable TASer Settings: Switches to the TAS tab, hides the left panel, filters variables to show only the TAS variables, and enables the STROOP ROM hack. This setting was created for Plush's convenience.
    • Show MHS Vars: Opens a Pop Out with variables commonly found in MHS. This is a convenience for users that are used to using MHS.
    • Download Latest STROOP Release: Downloads the latest STROOP release. This downloads as a separate file, instead of replacing the currently-being-used STROOP file.
    • Show All Helpful Hints: Shows a list of all helpful hints from the loading screen.
    • Show Skribblio Words: Shows a list of all Skribbl.io words in a randomized order.

Tabs

STROOP has several tabs, each of which manages one specific domain. For example, there's a Mario tab, Triangles tab, M64 tab, Map tab, etc. In fact, there are so many tabs that it's recommended that you customize which tabs are shown and their order, for your own convenience. To reorder tabs, use the left/right arrow buttons on the top right of STROOP, which will move the current tab one space over in the arrow's direction. To hide a tab, click on the tab while holding control. Using these 2 techniques, you should be able to reduce the number of tabs to a reasonable amount as well as put the tabs in the order most convenient to you. If you ever need to use a tab that you've hidden, then simply add it back using the Add Tab button on the top right of STROOP. Note that the order of tabs and which tabs are hidden are saved, so you only need to do this once, as these settings will stay the same on subsequent STROOP opens. However, if you ever download a new version of STROOP, the settings will be back to their original state. Nevertheless, you can always copy the saved settings file (STROOP\Config\SavedSettings.xml) from the older version of STROOP and replace that corresponding file in the newer version of STROOP.

Object Slot Panel

The lower half of STROOP is the Object Slot Panel. This shows all 240 object slots in the game. There are various controls to use at the top of the panel:

  • Lock Labels Checkbox: This locks the labels on the slots so that they'll no longer change. The labels will also turn blue to indicate that they are no longer changing. This can be useful if you want to see how the object slots change from one point in time to another, as you can know what positions the slots used to be in.
  • Slot Size Slider: This controls the size of the object slots.
  • Label Method: This controls what label method is used to determine the label for the object slots.
    • Recommended: This uses the recommended label method for the current Sort Method. Specifically, it will use SlotPosVs for ProcessingOrder, SlotIndex for MemoryOrder, and SlotPosVs for DistanceToMario.
    • SlotPosVs: Loaded object slots will use their processing index, and unloaded object slots will use their processing index prefixed with "VS".
    • SlotPos: Loaded object slots will use their processing index, and unloaded object slots will continue the indexing from where the loaded slots left off.
    • SlotIndex: Object slots will use their memory index.
  • Sort Method: This controls how the object slots are sorted.
    • ProcessingOrder: The object slots are sorted by their processing order. In other words, the loaded object slots are in the order by which they are processed (i.e. updated), and the unloaded object slots are in the order by which they would take on more objects.
    • MemoryOrder: The object slots are sorted by their memory order. In other words, they are sorted by the memory addresses of the object structs that each object slot represents.
    • DistanceToMario: The object slots are sorted by their distance to Mario, from closest to farthest. Note that the loaded object slots are presented first, then followed by the unloaded object slots.

You can also right click on the Object Slot Panel for the option to select the object slot corresponding to the value that you've copied (i.e. what's on the clipboard).

Object Slots

The object slots are found in the Object Slot Panel. An object slot has 4 parts to it: an image, a label, a background color, and zero or more overlays.

  • Image: The image shows what object is represented by the object slot. The image is transparent when the object is unloaded or set to be unloaded.
  • Label: The label represents the index of the slot by some indexing system (see Label Method under Object Slot Panel).
  • Background Color: The background color represents what Process Group the object belongs to.
    • Process Group 0x0B (Spawner) is Pink
    • Process Group 0x09 (Surface) is Red
    • Process Group 0x0A (Usable) is Red-Orange
    • Process Group 0x00 (Player) is Orange
    • Process Group 0x05 (Pushable) is Yellow
    • Process Group 0x04 (Actor) is Green
    • Process Group 0x02 (Respawning) is Light Blue
    • Process Group 0x06 (Level) is Dark Blue
    • Process Group 0x08 (Default) is Purple
    • Process Group 0x0C (Unimportant) is Brown
    • Vacant Group is Grey
 
The object slot overlays
  • Overlays: The overlays are images overlaid onto certain object slots to provide additional information. The object slots are as follows:
    • Selected: The object(s) selected in the Object Tab.
    • Map: The object(s) that are shown on the map in the Map Tab and Map2 Tab.
    • Map Home: The object(s) whose home(s) are shown on the map in the Map2 Tab.
    • Model: The object that's shown in the Model Tab.
    • Marked: The object(s) that are marked. Click on an object slot while holding Alt to mark it.
    • Closest: The loaded object that's closest to Mario.
    • Held: The object that Mario's holding.
    • Stood On: The object that Mario's standing on.
    • Interaction: The object that Mario's interacting with.
    • Used: The object that Mario's using.
    • Ridden: The object that Mario's riding on.
    • Camera: The secondary object that the camera is set to focus on.
    • Camera Hack: The object that is being focused on using the Camera Hack.
    • Floor: The object that Mario's floor triangle belongs to.
    • Wall: The object that Mario's wall triangle belongs to.
    • Ceiling: The object that Mario's ceiling triangle belongs to.
    • Parent: The parent of the currently hovered object.
    • Parent Unused: The currently hovered object when the currently hovered object's parent is the unused slot.
    • Parent None: The currently hovered object when the currently hovered object has no parent.
    • Child: A child of the currently hovered object.
    • Collision 1: The 1st collision object of the Mario object.
    • Collision 2: The 2nd collision object of the Mario object.
    • Collision 3: The 3rd collision object of the Mario object.
    • Collision 4: The 4th collision object of the Mario object.
  • Some additional notes on the overlays:
    • Which overlays are displayed can be changed in the Options tab. By default, all overlays are displayed except for Parent and Child ones, as these are the only ones dependent on the currently hovered object. Nevertheless, there's a shortcut to quickly and temporarily see an object's parent/child, which is to hold down P while hovering over an object slot.
    • By default, the collision objects are in reference to the Mario object. However, if you want to see the collision objects for a different object, then simply hold down C while hovering over that object's slot.
    • The Selected, Map, Map Home, Marked, Model, and Camera Hack overlays represent overlays that the user can modify themselves by clicking on the object slots when under certain circumstances. For some of these, multi-selection is available, meaning that multiple slots can be selected at the same time. In these cases, the shortcut of holding shift can be used to select the range of object slots between the previously selected object slot and the currently selected object slot. When multi-selection is available, there's also the concept of toggle-ability, explained as follows. In some cases (e.g. Selected), clicking on an object slot will select that object slot and unselect all other object slots. In these cases, holding control will make it so that clicking on an object slot will toggle that slot's selectedness while leaving all other slots' selectednesses unchanged. In other cases (e.g. Map, Marked), the situation is reversed. That is, clicking on an object slot will toggle that slot's selectedness while leaving all other slots' selectednesses unchanged, whereas holding control will make it so that clicking on an object slot will select that object slot and unselect all other object slots. We say that these cases are toggle-able by default. In both situations, holding control will toggle whether we're in toggle-mode or not, but it's just that the default mode may or may not be toggle-able. Here is more information:
      • Selected: Modifiable when clicking on an object slot. Multi-selection allowed.
      • Map: Modifiable when clicking on an object slot in the Map Tab or Map2 Tab. Multi-selection allowed. Toggle-able by default.
      • Map Home: Modifiable when clicking on an object slot in the Map2 Tab with H held. Multi-selection allowed. Toggle-able by default.
      • Model: Modifiable when clicking on an object slot in the Model Tab.
      • Marked: Modifiable when clicking on an object slot with Alt held. Multi-selection allowed. Toggle-able by default.
      • Camera Hack: Modifiable when clicking on an object slot in the Cam Hack Tab.

You can right click on an object slot for even more options. Note that the option will by default only affect the object slot that was right clicked on. If instead you want to have the option affect all slots that are selected, then click the option while holding control. The options are as follows:

  • Select in Object Tab: Selects the object slot in the Object Tab, and switches to the Object Tab.
  • Select in Memory Tab: Selects the object slot in the Memory Tab, and switches to the Memory Tab.
  • Go to: Sends Mario to the object, offset by the "Go to offset" in the Options Tab.
  • Retrieve: Sends the object to Mario, offset by the "Retrieve offset" in the Options Tab.
  • Go to Home: Sends Mario to the object's home, offset by the "Go to offset" in the Options Tab.
  • Retrieve Home: Sends the object's home to Mario, offset by the "Retrieve offset" in the Options Tab.
  • Release: Releases the object by settings its Release Status. This is identical to releasing a clone of an object that isn't meant to be released.
  • UnRelease: Undoes the releasing of an object.
  • Interact: Interacts with an object by setting its Interaction Status to 0xFFFFFFFF. This can be useful if you don't want to interact with a clone, e.g. making a fire clone inert.
  • UnInteract: Undoes the interacting of an object by setting its Interaction Status to 0x00000000.
  • Clone: Clones the object into Mario's hands.
  • UnClone: Undoes the cloning of the object by clearing what's in Mario's hands. This doesn't actually release the object.
  • Unload: Sets the object to be unloaded.
  • Revive: Revives an unloaded object into a loaded state.
  • Ride: Has Mario ride on the object. Specifically, sets Mario's ridden object to that object and puts Mario into a riding state.
  • UnRide: Undoes the riding of an object.
  • Ukikipedia: Opens up the Ukikipedia page for an object.
  • Copy Address: Copies the object's address to the clipboard.
  • Copy Position: Copies the object's position to the clipboard.
  • Paste Position: Pastes the clipboard data onto an object's position.
  • Copy Graphics: Copies the object's graphics value to the clipboard.
  • Paste Graphics: Pastes the clipboard data onto an object's graphics value.
  • Copy Object: Copies the object's bytes to a custom clipboard in STROOP.
  • Paste Object: Pastes STROOP's custom clipboard data onto the object. Note that this doesn't overwrite the object's next/previous memory/processed object slots references, since that would corrupt the linked list structure.

Variable Panel

Variables

Variables are found in a Variable Panel. An variable has 2 parts to it: a name (on the left) and a value (on the right). On every STROOP update, the value updates. Some variables are values in memory, while other variables are calculated manually (referred to as special variables). While memory variables can always be set, special variables may or may not be able to be set.


All variables come with the following options when right clicked:

  • Highlight:
  • Lock:
  • Copy:
  • Paste:
  • Panel Options:
  • Open Controller:
  • Add to Custom Tab:
  • Fix Address:
  • Rename:
  • Remove:

Number variables come with the following additional options when right clicked:

  • Round to ...:
  • Display as Hex:

Angle variables come with the following additional options when right clicked:

  • Signed:
  • Units...:
  • Truncate to Multiple of 16:
  • Constrain to One Revolution:
  • Reverse:

Address variables come with the following additional options when right clicked:

  • View Address:

Object variables come with the following additional options when right clicked:

  • Display as Object:
  • Select Object:

Triangle variables come with the following additional options when right clicked:

  • Select Triangle:

Boolean variables come with the following additional options when right clicked:

  • Display as Checkbox:
  • Display as Inverted:

Separately, if you right click on a variable that's selected, then you'll see a different set of options, which affect all selected variables. Options prefixed with "Angle:" only affect angles. Many of these options have just been covered, but the ones which haven't been are:

  • Show Variable XML:
  • Show Variable Info:
  • Show Background Color...:
  • Move...:
  • Remove:
  • Rename:
  • Open Controller:
  • Open Triplet Controller:
  • Open Pop Out:
  • Add to Tab...:
  • Add to Custom Tab:

There are also many keyboard shortcuts that can be performed on variables, namely by clicking on a variable when holding one or more keys. These are:

  • Click + Shift + Number:
  • Click + Number:
  • Click + S:
  • Click + T:
  • Click + M:
  • Click + P:
  • Click + N:
  • Click + F:
  • Click + H:
  • Click + L:
  • Click + D:
  • Click + R:
  • Click + C:
  • Click + B:
  • Click + Escape:
  • Click + Backspace:
  • Click + Delete:
  • Click + X:
  • Click + Backtick:
  • Click + Z:
  • Click + Minus:
  • Click + Plus:
  • Click + Q:
  • Click + O:
  • Double Click:

Controllers

 
The various kinds of controllers

Controllers are a set of controls used for manipulating one or more variables. There are various kinds of controllers:

  • Simple Controller: A Simple Controller is in charge of manipulating one variable. It consists of 2 buttons and a textbox. The buttons are used for subtracting from and adding to the variable using the value that's in the textbox. Right clicking on one of the buttons shows the option to toggle whether the buttons are inverted, i.e. swapping whether subtraction is on the left and addition is on the right or vice versa. Simple Controllers are found on the left panel of several tabs of STROOP.
  • Triplet Controller: A Triplet Controller is in charge of manipulating a triplet of variables, usually a set of (x,y,z) Euler coordinates or (theta,phi,radius) spherical coordinates. It consists of 2 sets of controls:
    • Square Controls: On the left are the Square Controls, consisting of 8 buttons and a textbox arranged in square formation. For Euler coordinates, these controls manipulate the x and z coordinates. For spherical coordinates, these controls manipulate the theta and phi coordinates. In both cases, the buttons will add to or subtract from the corresponding variable(s) by the amount in the textbox. Note that you can right click on the buttons for more options so that you can customize the orientation of the buttons. Specifically, this allows you to rotate the buttons any one of eight ways, as well as invert the orientation (i.e. flip it).
    • Line Controls: One the right are the Line Controls, consisting of 2 buttons and a textbox arranged in a vertical line formation. For Euler coordinates, these controls manipulate the y coordinate. For spherical coordinates, these controls manipulate the radius coordinate. In both cases, the buttons will add to or subtract from the corresponding variable by the amount in the textbox. Note that you can right click on the buttons for options to invert the buttons.
Triplet controllers also frequently have a Relative Checkbox in the upper right, which toggles whether the controls manipulate the variables absolutely or relative to some angle. When in relative mode, the labels on the buttons will change to emphasize this. Specifically, F = forward, B = backward, L = left, R = right, U = up, D = down. Triplet Controllers are found on the left panel of several tabs of STROOP. However, you can also create your own Triplet Controller by selecting 3 or 4 variables to represent the x,y,z and optional angle variables, right clicking, and choosing to open a Triplet Controller.
  • Advanced Controller: An advanced controller is in charge of manipulating one or more variables. It consists of the following controls:
    • Name Textbox: This shows the name(s) of the variable(s) being manipulated. Note that this can be edited.
    • Fix Address Checkbox: This is used to toggle whether the variable(s) are using fixed addresses.
    • Value Textbox: This displays the current value(s) of the variable(s). The background color is red if the variable(s) have fixed addresses, blue if the variable(s) don't have fixed addresses, and purple if some variables do and some variables don't have fixed addresses.
    • Lock Checkbox: This is used to toggle whether the variable(s) are locked.
    • Subtraction Button: This is used to subtract a value from the variable(s).
    • Addition/Subtraction Textbox: This is the value that's used by the Addition Button and Subtraction Button.
    • Addition Button: This is used to add a value to the variable(s).
    • Get Button: This gets the value(s) of the variable(s).
    • Get/Set Textbox: This is the value used by the Get Button and Set Button.
    • Set Button: This sets the value(s) of the variable(s).
Additional notes:
  • In the case of setting multiple variables, you can set all of the variables to different values by separating the values in the textbox with commas. Alternatively, leave just one value in the textbox to set all variables to that one value. The same applies to adding and subtracting values.
  • The add and subtract buttons can be inverted by right clicking on them and choosing to invert.
  • You can click on the add/subtract button and hold the mouse down while holding control in order to continuously add to or subtract from the variables. Alternatively, right click on either button and choose to Start Continuous Add (or Subtract) and then later choose to Stop Continuous Add (or Subtract).
You can create an Advanced Controller for a variable by clicking on the variable while holding C. Alternatively, you can create an Advanced Controller for multiple variables by selecting multiple variables, right clicking, and choosing to open a controller.
  • Bit Controller: A Bit Controller is in charge of manipulating one variable. It consists of the following controls:
    • Name Textbox: This shows the name of the variable being manipulated. Note that this can be edited.
    • Decimal Value: This shows the decimal value of the variable.
    • Hex Value: This shows the hex value of the variable.
    • Binary Value: This shows the binary value of the variable.
    • Value Table: This shows various representations of the bytes of the variable, including the decimal representation, hex representation, and binary representation. It also provides a set of checkboxes that can be used to toggle each bit of the variable. For floats, these checkboxes are colored according to the bits' role in the float, as blue represents sign, red represents exponent, and green represents mantissa.
Note that for floats, you can right click on the empty space of the controller, and change what the textboxes display. Specifically, they can be set to display the sign, exponent, and mantissa values of the float. You can create a Bit Controller for a variable by clicking on the variable while holding B.

Object Tab

Mario Tab

HUD Tab

Camera Tab

Triangles Tab

Actions Tab

File Tab

Input Tab

Water Tab

Misc Tab

M64 Tab

Custom Tab

TAS Tab

Map Tab

Map2 Tab

Options Tab

Memory Tab

PU Tab

Area Tab

Model Tab

Gfx Tab

Debug Tab

Hacks Tab

Cam Hack Tab

Q Frames Tab

Var Hack Tab

Coin Tab

Disassembly Tab

Decompiler Tab

Scripts Tab

Testing Tab

Painting Tab