The main issue here is that you put semicolons after the if conditions. Basically this is saying compare the variable options to the value 2, and then do nothing if it is true. After that, the while loop is executed no matter what, so every 30 frames it checks the user input until the menu cursor reaches Y position reaches 32. It then has another if statement that does nothing, and then executes the next while loop, which allows the user to go down to the next menu option, even if only 2 were supposed to be available. To fix this, all you have to do is add brackets around the lines of code you only want executed when the if condition is true. If there is only one line of code, you don't need brackets.
After this, we need to fix the while loops, because if you plan on allowing the user to move the cursor up as well, it won't work to check for the Y position reaching the lowest possible position. So, if you want it to keep checking the user input over and over, we have to add an infinite while loop around the whole thing (except for any initialization which you want done once).
Finally, you can combine the first two lines of code after void run() into one statement, and we can reduce the if statements down to one condition. So, after revising all of that, here is what I came up with...
Code:
ffc script Menus
{
void run(int options)
{
this->Y = 16;
while(true)
{
//First check cursor moving down, and make sure it is not already at the lowest option of the menu.
if(Link->InputDown && this->Y<options*16)
{
this->Y += 16;
Waitframes(30); //This forces the user to wait half a second before they can move the cursor again.
}
Waitframe();
}
}
}