So, Lets say you are using a sub. And Inside of that Sub you use another Sub.
Gosub Test 1 2 3
Halt
Sub Test
Display % , 1 = %1 $ % , 2 = %2 $ % , 3 = %3
Gosub Test2 4 5 6
Display % , 1 = %1 $ % , 2 = %2 $ % , 3 = %3
Return
Sub Test2
Return
So, When you use the Gosub Command, it automatically sets the %0 %1 %2 %3 %4 Variables etc, So if you use a Gosub Within A sub, those Variables are going to change from what they originally were as you can see from the example code.
Its just good habit that if you are writing Universal Subs that you go ahead and set ! Variables to the %1-%n
Not Sure how much you've gotten to Play with Namespaces, but I'll give a brief Explanation.
Namespaces are used to "Separate" your Variables from other Variables that are being used throughout the Script, and can also be used to communicate information between Scripts (Bit more Advanced)
The Idea, is that when you use these "Universal" Subs, that they don't Change any of the % Variables, but still perform the task that was given to them.
You start off with a Namespace Push, This "Saves" Whatever the Last Namespace was so at the end of your Sub you Can Namespace Pop, Which Returns it to the original Namespace. What you'll see in most of my subs is what you've already noticed
Sub Test
Namespace Push ; Saves whatever the last namespace was
Namespace Local Name_Of_Namespace_Here
set !Var1 %1 ; Saving the %1-%n Variables to ! Variables to you don't lose them if you use a gosub inside the sub
set !Var2 %2
set !Var3 %3
;Actions
Namespace Pop ; REturns the namespace to what it was on the last Namespace Push
Return
The Concept is that if I were to Use the Sub, it would perform the action it was Built to do without Effecting any of the % Variables.