Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

(Experimental Tool) TAStudioMPR - For Local Multiple Player Controllers #4218

Open
wants to merge 69 commits into
base: master
Choose a base branch
from

Conversation

ShinobiWannabe
Copy link
Contributor

@ShinobiWannabe ShinobiWannabe commented Feb 12, 2025

This is a version of TAStudio splitting out the various "controllers" for a controller definition for a system into multiple InputRolls. This is specifically targeting multiple player controller tases (think a local game with multiple controllers). Basically with this you can do the main Insert, Delete, Clone, Copy/Paste within a single controller. You can also copy input from one controller to another.

Youtube Example of TAStudioMPR working with a multiplayer game.
https://www.youtube.com/watch?v=qcw37tiDtzM

image

How It Works
Upon load it looks at the Emulator.ControllerDefinition with specific attention to the fields ControlsOrdered and the ControlsOrdered.Count. It dynamically creates InputRolls (after the first InputRoll) based on the number, and then creates columns for each based on their inputs. Once the the InputRolls are created they are re-sized and re-located to make it look nicer. While visually the InputRolls are separate per controller the movie file is the same full size. When operations such as Insert, Delete, Clone, Cut, Copy, Paste are performed they go to the TasMovie.Editing.cs with their own functions. The startOffset and the controller Length for the current controller are passed in to most functions. Here character and string manipulations are performed so that operations only effect the intended controller. Here are some brief descriptions of the various important operations.

Clear: Will empty out the inputs for the selected frames of the specified InputRoll.

Insert Frame : First it adds an additional empty frame to the Log file at the end. Then creates a copy of the current frame, but sets the inputs for the current controller to nothing aka ".". Then it shifts all the inputs down only within the relevant controller.

Insert # Frames : Similar to above, but it inserts them in batches so it does not do the entire shifting of inputs X number of times for inputs.

Clone: Like the Insert Frame operation, but instead of making the inserted frames have no input, it uses the selected input to clone.

Clone X Times: This repeats the Clone operation X number of times.

Copy: This operation copies the selected rows and puts it into the clipboard.

Cut: This copies takes the inputs from within a controller and moves them to the clipboard then Deletes them from that controller.

Paste: This operation goes through the copied inputs and overwrites the current InputRoll's controller inputs starting from the selected frame. Note that this Paste only works within the same controller. For controller to controller look at the right click "Paste Selected Rows From".

Paste Insert: This is a combination of Insert and Paste where the inputs are inserted and the other inputs are shifted down. Note that this Paste only works within the same controller. For controller to controller look at the right click "Paste Selected Rows From".

Paste Selected Rows From: A new one that makes sense for multiple controllers. Here if you select rows from a InputRoll you can right click on an InputRoll that you want to paste to, then select a "TasView" from the sub to paste the selected rows. While originally I wanted to use the CurrentTasView (TasView and InputRoll refer to the same pianoroll object) and just freely copy and paste, I am not exactly certain how to do this cleanly. With the copy you can also copy from some other string outside the program, you can also activate the Copy event from the TAStudio menu, and if you move the mouse around the focus can change as well. If there is a cleaner way than using the dropdown menu to paste between InputRolls then I would be for it.

Truncate: This one takes the current frame and starting from there empties the inputs all the way to the end of the load for that controller. Then it goes back to find the first frame where the rest of the inputs across all controllers are empty and will Remove Range from there to the end of the Log.

Please inform me of any thoughts, issues, or possible improvements. This is pretty experimental, but it should be useful for tasers wanting an easier way to tas games with multiple controllers. I had been waiting for years for something like this, but nothing was close to what I wanted for multiplayer games so I decided to give it a shot myself.

restart again. cloned and copied tastudiompr folder in
before adding to list
Hooked up more events
they scroll together when playing but tasview2 does not allow click inputs
need to get the settings correct on the dynamically created tasview
They looks similar and the settings should be the same. Input Painting and row selection is working. NOT scrolling down though on second tasview for some reason though.
menu working better Clear() messed up again
needed a foreach tasview in a navigation partial class
 Two tasviews are actually working and savable but not loadable third is not visible?
No anchor right, incorrect start location.
load now splits the inputs into the input rolls correctly
slight cleanup
slow though
Had a stray hardcoded TasView1 that was causing some bizarre problems in Insert
multiple does not work though
right context menu setup had some stray hardcoded tasview refs
Works for multiple rows in a single group.  However there is are bugs if there are multiple groups selected with CTRL such as not deleting properly.  If multiple groups are selected right near frame 0, you can get a negative row index and error too.
Little comment cleanup
There is an issue with how I am checking the focus.  Works fine for ContextMenu, but if you select, hover over a different tasview, then use the Menu at the top of the form then it can select the wrong tasview to do an edit. Try MouseUp or a SelectedItem event to set a variable for focused tasview.
This fixes issues of the wrong tasView being selected for functions like Clear()
Seems to only happen when the insert amount is greater than Log.Count()?
ShinobiWannabe and others added 23 commits February 10, 2025 04:24
Double check the names that they make sense
Issue was that for the final frames at the very end it was simply setting Log[i], when it needed to be empty out the current controller and leave the other ones alone.
still only working on same tasView.The Paste From Selected is the way to go from one to another for now.
go through columns are Mnemonics are set
Another Attempt at Merge
…suddenly changes

Throw an error early since there is no way to recover from that point while the TAStudioMPR is open.  They will need to select the desired Core, Reboot Core, then try it again.
@YoshiRulz YoshiRulz linked an issue Feb 12, 2025 that may be closed by this pull request
Added padding for scrollbar and 5 digit framecount to tasstudiompr
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
2 participants