-
Notifications
You must be signed in to change notification settings - Fork 0
Setup
Just download the latest release and install ViGEmBus driver. Unzip the ShinyAssistant.zip and run ShinyAssistant.exe to start the app.
Go to the controllers page for info on setting up each controller type.
Macros are made up of actions that loop forever until a shiny is detected. Below is all the action types and what they do. All buttons are labeled after switch buttons, Left Joystick = Circle pad on 3ds, Plus = Start and Minus = Select on older consoles.
| Action Name | Description |
|---|---|
| Click Button | Presses a button down, waits 100ms, then releases it |
| Press Button | Presses a button down and does not release it |
| Release Button | Releases a held button |
| Move Left Joystick | Moves the left Joystick to inputted x and y coords in a range of -100:100. (100,100) would be pushing the stick all the way up and right, (-100,-100) bottom left, (0,0) centered |
| Move Right Joystick | Same as Move Left Joystick but with the right stick |
| Delay | Waits a certain amount of time before moving to the next action |
| Random Delay | Waits a random amount of time from 0ms to the inputted ms before moving to the next action. Useful for FRLG where random input times in the starting screen are needed otherwise every soft reset will hit the same seed |
| Check For Shiny | Checks for a difference in the detection box compared to the previous Check For Shiny. Check the below section for more info on this action |
| Random Encounter Loop | A smaller loop to run within the macro to loop running to hit a wild encounter. Loops until the flash from an encounter start happens. Check below for more info on using this action |
| Add to encounter number | Adds to the encounter number, usually used once per macro to keep track of how many encounters have happened |
This is an example macro for soft resetting for a legendary static encounter in generation 4. Most macros should start from the title screen after a soft reset. The first delay action is to wait 13 seconds for the opening credits. Clicks are then used to get through the menu, load the save, interact with the legendary and click through the text box. A longer delay is then used to line up the Check For Shiny with the correct frame. If a shiny is detected the macro would stop here and the user would be notified, otherwise it falls through to the next actions which hold all the keys to soft reset at the same time, waits 50ms, then lets go of them. The macro would then start again from the top.
There are a lot of small quirks that come up when making a macro, here are some tips.
- Don't use super short delay between actions you want to be sequential. If you have actions with less than a 50ms delay between them it is possible that the game doesn't read one of them or a packet is lost leading to the macro not functioning as intended.
- It is always better to wait longer than needed in menus and text boxes. If there is a lag spike and the macro has exact delays, the macro will be desynced and the check shiny will give a false positive stopping the macro. If there is some wiggle room there is a good chance the macro will stay synced with the game state.
- Run through what you want the macro to do with a real controller first to get the timings and number of button presses right.
- In some games different pokemon spend different amounts of times in their cry/intro. This can throw off timing and delays may need to be adjusted depending on the pokemon you are using as your lead or what you are encountering.
This is the main action but it isn't super straight forward. This check is only looking at whatever is in the green box set by the detection bounds. The first time this action is hit since the macro started is used as a baseline. The first check has a built in 10 second delay because if the encounter happens to be shiny it will be reset over. When a check is not shiny it is used as the new baseline.
The actual detection is not checking whether the pokemon is shiny, its checking how different whatever is in the detection box is to what was in it last time. When a shiny pokemon is encountered it plays a shiny animation which delays the text boxes from appearing. This is better explained visually, below are two images at the same time in the macro. The most consistent place to detect is normally the text for throwing out your pokemon. Try to avoid having things that are the same in the detection box. A small detection box that is only around the text is the best option.
For every non-shiny the check shiny action is hit when the text "Go Samurott" is on screen. When a shiny appears the animation delays the rest of the text appearing so when the check shiny action is hit something different is in the detection box.

When the random encounter loop action is hit the macro jumps back to the first action in the macro and keeps playing. If the app detects a flash from a random encounter starting the macro instantly jumps to the next action after the random encounter loop action. This can be used to loop movement buttons until a random encounter starts.
This is an example of how this can be used. The character will move in circles until an encounter starts, then check for a shiny, then if it is not shiny it will run away, walk off the current tile and back on so it can find a new encounter, then loop.