STROOP: Difference between revisions

9,041 bytes added ,  15 April 2021
m
Feel free to revert this edit in case the older version was better, just contributing to Ukikipedia :)
m (added painting tab)
m (Feel free to revert this edit in case the older version was better, just contributing to Ukikipedia :))
 
(28 intermediate revisions by 10 users not shown)
Line 1: Line 1:
{{stub}}
'''S'''uperMario64 '''T'''echnical '''R'''untime '''O'''bserver and '''O'''bject '''P'''rocessor, 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|camera]] + [[HUD]] values, an overhead map display, and many more. An up-to-date version of STROOP can be downloaded from [https://bit.ly/DownloadSTROOPRelease here].
[[File:STROOP.jpg|350px|thumb|STROOP on [https://en.wikipedia.org/wiki/Windows_10 Windows 10]]]  
[[File:STROOP.jpg|350px|thumb|STROOP on [https://en.wikipedia.org/wiki/Windows_10 Windows 10]]]  
[[File:ObjectSlotHack.png|350px|thumb|Tyler's ROM hack that displayed the object slots in text form]]  
[[File:ObjectSlotHack.png|350px|thumb|Tyler's ROM hack that displayed the object slots in text form]]  
[[File:Blueprint.png|350px|thumb|A blueprint of what Pannenkoek2012 suggested the program should look like]]  
[[File:Blueprint.png|350px|thumb|A blueprint of what Pannenkoek2012 suggested the program should look like]]  
[[File:SM64_diagnostic.png|350px|thumb|The SM64 Diagnostic]]  
[[File:SM64_diagnostic.png|350px|thumb|The SM64 Diagnostic]]  
'''S'''uperMario64 '''T'''echnical '''R'''untime '''O'''bserver and '''O'''bject '''P'''rocessor, 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 [https://github.com/SM64-TAS-ABC/STROOP/releases/download/vDev/STROOP.zip here].


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


After Pannenkoek2012 discussed object slots in his [https://youtu.be/9xE2otZ-9os Science of Cloning] video, there had been a desire to view the object slots of the game in real time. Pannenkoek2012 discussed this desire with Tyler Kehne. Tyler then proceeded to make a ROM hack that could display the object slot behaviors in text form, overlaid onto the screen. Pannenkoek2012 was not pleased with this implementation, as he wanted a separate program that would show the slots visually with images of the objects. Thus, Tyler then proceeded to make a program that would do just that, which he named the SM64 Diagnostic. Tyler wrote the code for it, and Pannenkoek2012 provided the object 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.
 
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 ==
== Loading Screen ==
[[File:STROOP loading screen.gif|350px|thumb|STROOP Loading Screen]]
[[File:STROOP loading screen.gif|350px|thumb|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.
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.
You can right click the text field and a context menu will appear. Upon clicking it, a list of all helpful hints will appear.


== Connection Screen ==
== Connection Screen ==
 
[[File:Connection Screen.jpg|475px|thumb|STROOP 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:
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.
* '''Refresh''': Refreshes the list of processes to choose from.
Line 38: Line 36:
* '''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.
* '''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:
* '''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.
** '''Enable [[TAS]]er 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.
** '''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.
** '''Download Latest STROOP Release''': Downloads the latest STROOP release. This downloads as a separate file, instead of replacing the currently-being-used STROOP file.
Line 47: Line 45:


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.
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.
{{STROOP_Tabs}}


== Object Slot Panel ==
== 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:
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.
* '''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.
* '''Slot Size Slider''': This controls the size of the object slots.
Line 97: Line 96:
** '''Camera''': The secondary object that the camera is set to focus 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.
** '''Camera Hack''': The object that is being focused on using the Camera Hack.
** '''Floor''': The object that Mario's floor triangle belongs to.
** '''Floor''': The object that Mario's [[Surface#Floors|floor]] triangle belongs to.
** '''Wall''': The object that Mario's wall triangle belongs to.
** '''Wall''': The object that Mario's [[Surface#Walls|wall]] triangle belongs to.
** '''Ceiling''': The object that Mario's ceiling triangle belongs to.
** '''Ceiling''': The object that Mario's [[Surface#Ceilings|ceiling]] triangle belongs to.
** '''Parent''': The parent of the currently hovered object.
** '''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 Unused''': The currently hovered object when the currently hovered object's parent is the unused slot.
Line 128: Line 127:
* '''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.
* '''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.
* '''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.
* '''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 [[Cloning|clone]], e.g. making a fire clone inert.
* '''UnInteract''': Undoes the interacting of an object by setting its Interaction Status to 0x00000000.
* '''UnInteract''': Undoes the interacting of an object by setting its Interaction Status to 0x00000000.
* '''Clone''': Clones the object into Mario's hands.
* '''Clone''': Clones the object into Mario's hands.
Line 149: Line 148:
== Variables ==
== 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:
Variables are found in a Variable Panel. A variable has 2 parts to it: a name (on the left) and a value (on the right). On every STROOP update, the value updates. You can set a variable's value by double clicking on the value, entering text, and then pressing enter. Some variables are values in memory, while other variables are calculated manually (referred to as special variables). While memory variables can always be set, special variables may or may not be able to be set. If you try to set a variable and it doesn't go through (either because the variable can't be set or because you entered an illegal value), then the variable will flash red to indicate this.
* '''Highlight''':  
 
* '''Lock''':  
All variables come with the following options when right clicked:
* '''Copy''':  
* '''Highlight''': Highlights the variable by giving it a red outline.
* '''Paste''':  
* '''Lock''': Locks the variable's value. Note that the variable's value can still be edited while it's locked.
* '''Panel Options''':  
* '''Copy''': Copies the variable's value (with no rounding) to the clipboard.
* '''Open Controller''':  
* '''Paste''': Pastes the clipboard value to the variable.
* '''Add to Custom Tab''':  
* '''Panel Options''': Opens up the Variable Panel options.
* '''Fix Address''':  
* '''Open Controller''': Opens up an Advanced Controller for the variable.
* '''Rename''':  
* '''Add to Custom Tab''': Adds the variable to the Custom Tab.
* '''Remove''':  
* '''Fix Address''': Fixes the address of the variable.
* '''Rename''': Allows you to rename the variable.
* '''Remove''': Removes the variable from the Variable Panel.


Number variables come with the following additional options when right clicked:
Number variables come with the following additional options when right clicked:
* '''Round to ...''':  
* '''Round to ...''': Sets how many digits to round the variable to.
* '''Display as Hex''':  
* '''Display as Hex''': Toggles whether the variable is displayed as hex or decimal.


Angle variables come with the following additional options when right clicked:
Angle variables come with the following additional options when right clicked:
* '''Signed''':  
* '''Signed''': Toggles whether the variable is displayed as signed or not.
* '''Units...''':  
* '''Units...''': Sets the units for the angle variable. The unit options are:
* '''Truncate to Multiple of 16''':  
** '''In-Game Units''': These are the units that the game uses. One revolution is 65536 in-game units.
* '''Constrain to One Revolution''':  
** '''HAU''': Standing for hexadecimal angle units, these are in-game units divided by 16. Thus, one revolution is 4096 HAU. These are useful because angles that fall under the same HAU value use the same entry in the game's trig table, since angles are truncated to the closest multiple of 16 before accessing the table.
* '''Reverse''':  
** '''Degrees''': One revolution is 360 degrees.
** '''Radians''': One revolution is 2*pi radians.
** '''Revolutions''': One revolution is one revolution.
* '''Truncate to Multiple of 16''': Toggles whether the angle's value is truncated to a multiple of 16. This is useful since angles that truncated to same the closest multiple of 16 use the same entry in the game's trig table.
* '''Constrain to One Revolution''': Toggles whether the angle's value is constrained to one revolution. For example, an angle that's unsigned and in angle units would be constrained to the range [0, 65535], whereas an angle that's signed and in angle units would be constrained to the range [-32768, 32767].
* '''Reverse''': Toggles whether the angle is displayed as the reverse of what it actually is.


Address variables come with the following additional options when right clicked:
Address variables come with the following additional options when right clicked:
* '''View Address''':  
* '''View Address''': Views the variable's value as an address in the Memory Tab.


Object variables come with the following additional options when right clicked:
Object variables come with the following additional options when right clicked:
* '''Display as Object''':  
* '''Display as Object''': Displays the variable's value as an Object. Values include:
* '''Select Object''':  
** '''Slot n''': The nth loaded slot.
** '''Slot VSn''': The nth vacant slot.
** '''PG n''': Process Group n's node.
** '''(none)''': The value 0.
** '''(unused object)''': The unused object slot.
** '''(unknown object)''': A value that's not recognized as a valid object reference.
* '''Select Object''': Selects the object slot whose object's address equals the variable's value.


Triangle variables come with the following additional options when right clicked:
Triangle variables come with the following additional options when right clicked:
* '''Select Triangle''':  
* '''Select Triangle''': Selects a custom triangle in the Triangle Tab whose address equals the variable's value.


Boolean variables come with the following additional options when right clicked:
Boolean variables are unique in that instead of having a text value, they have a checkbox value. The checkbox is checked if the underlying number value (after possibly masking) is non-zero. In the case that the variable represents multiple values with different checked states, the checkbox will be indeterminant. Boolean variables come with the following additional options when right clicked:
* '''Display as Checkbox''':  
* '''Display as Checkbox''': Toggles whether the variable is displayed as a checkbox.
* '''Display as Inverted''':
* '''Display as Inverted''': Toggles whether the checkbox's checked state is 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:
Variables can be selected by clicking on them. You can hold shift and click on a variable to select the range of variables from the previously selected variable to the currently selected variable. To toggle whether a variable is selected or not without unselecting all variable, click on the variable while holding control. To unselect all variables, click on the variable panel. If you right click on a variable that's selected, then you'll see a different set of options from normal, and these options will affect all selected variables. Options prefixed with "Angle:" only affect angles. Choosing the "Default" value for an option (e.g. Display as Hex) will set that option to how the variable was originally (e.g. its original status of whether it was displaying as hex). Here are these options:
* '''Show Variable XML''':  
* '''Highlight...''': Highlights the variables with a red or custom-colored outline.
* '''Show Variable Info''':  
* '''Lock...''': Locks the variables' values.
* '''Show Background Color...''':  
* '''Fix Address...''': Fixes the addresses of the variables.
* '''Move...''':  
* '''Copy...''': Copies the variable's value (with no rounding) to the clipboard. This can be done with commas, tabs, or line breaks separating the variable values. Separately, you can copy the variable values for code, which will copy instantiation statements for each of the variables, e.g. "float X = 100f". For more control over what the variables are named, hold control while clicking this option. This will open up a dialog where you can enter text, where the $ represents the variables' original names. For example, entering "my$Value" will result in "float myXValue = 100f" being copied to the clipboard.
* '''Remove''':  
* '''Paste''': Pastes the clipboard value to the variables. The values for the variables will be parsed from the clipboard value, which will work so long as the values are separated by whitespace (e.g. spaces, tabs, line breaks) or commas.
* '''Rename''':  
* '''Round to...''': Sets how many digits to round the variables to.
* '''Open Controller''':  
* '''Display as Hex...''': Sets whether the variables are displayed as hex or decimal.
* '''Open Triplet Controller''':  
* '''Angle: Signed...''': Sets whether the variables are displayed as signed or not.
* '''Open Pop Out''':  
* '''Angle: Units...''': Sets the units for the angle variables. See above for more information on the unit options.
* '''Add to Tab...''':  
* '''Angle: Truncate to Multiple of 16...''': Sets whether the angles' values are truncated to a multiple of 16.
* '''Add to Custom Tab''':
* '''Angle: Constrain to One Revolution...''': Sets whether the angles' values are constrained to one revolution.
* '''Angle: Reverse...''': Sets whether the angles are displayed as the reverse of what it actually is.
* '''Angle: Display as Hex...''': Sets whether the angle variables are displayed as hex or decimal.
* '''Show Variable XML''': Shows the XML that represents the variables.
* '''Show Variable Info''': Shows info on the variables in table form, including Name, Type, Base + Offset, N64 Address, and Emulator Address.
* '''Background Color...''': Changes the variables background color.
* '''Move...''': Options for moving variables.
** '''Start Move''': Adds the selected variables to the moving-variables-clipboard.
** '''End Move''': Moves the variables on the moving-variables-clipboard to the location of the selected variables.
** '''Clear Move''': Clears the selected-variables-clipboard.
* '''Remove''': Removes the variables from the Variable Panel.
* '''Rename''': Allows you to rename the variables. This will open up a dialog where you can enter text, where the $ represents the variables' original names. For example, entering "my$Value" will result in renaming "X" to "myXValue".
* '''Open Controller''': Opens up an Advanced Controller for the variables.
* '''Open Triplet Controller''': Opens up a Triplet Controller for the variables.
* '''Open Pop Out''': Opens up a Pop Out for the variables.
* '''Add to Tab...''': Adds the variables to a tab of your choosing.
* '''Add to Custom Tab''': Adds the variables to the 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:
* '''Double Click''': Opens up the Variable Viewer form for the variable, which shows the variable's Name, Type, Base + Offset, N64 Address, and Emulator Address.
* '''Click + Shift + Number''': Sets the variable's background color to different colors, depending on the number.
* '''Click + Number''': Sets the variable's highlight color to different colors, depending on the number.
* '''Click + S''': Adds the variable to the Custom Tab.
* '''Click + T''': Adds the variable to the TAS Tab.
* '''Click + M''': Adds the variable to the Memory Tab.
* '''Click + P''': Adds the variable to a tab of your choosing.
* '''Click + N''': Views the variable's value as an address in the Memory Tab.
* '''Click + F''': Fixes the address of the variable.
* '''Click + H''': Highlights the variable with a red outline.
* '''Click + L''': Locks the variable's value.
* '''Click + D''': Toggles whether the variable is displayed as hex or decimal.
* '''Click + R''': Allows you to rename the variable.
* '''Click + C''': Opens up an Advanced Controller for the variable.
* '''Click + B''': Opens up an Bit Controller for the variable.
* '''Click + Escape''': Removes the variable from the Variable Panel.
* '''Click + Backspace''': Removes the variable from the Variable Panel.
* '''Click + Delete''': Removes the variable from the Variable Panel.
* '''Click + X''': Does an action related to moving a variable. Specifically: If the moving-variables-clipboard is empty, then adds the variable to the moving-variables-clipboard. If the moving-variables-clipboard is non-empty, then moves the variables of the moving-variables-clipboard to the clicked variable's current location.
* '''Click + Backtick''': Adds the variable to the Var Hack tab.
* '''Click + Z''': Sets the variable value to zero.
* '''Click + Minus''': Decrements the variable value.
* '''Click + Plus''': Increments the variable value.
* '''Click + Q''': Sets the variable's background color to a custom color.
* '''Click + O''': Sets the variable's background color to the last custom color.


== Controllers ==
== Controllers ==
Line 235: Line 290:
** '''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.
** '''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.
: 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.
''Todo: finish the rest of this article''


== Object Tab ==
== Object Tab ==
Line 263: Line 320:


== Map Tab ==
== Map Tab ==
== Map2 Tab ==


== Options Tab ==
== Options Tab ==
Line 299: Line 354:


== Painting Tab ==
== Painting Tab ==
[[Category:STROOP]]
[[Category:Resources]]
106

edits