I know your not doing AI Juuuust yet, but I came up with something for a personal project of mine that might help out.
Ima give you pseudo code/explanations rather then actual code, because I have no idea whatsoever what sort of syntax gamemaker uses or what limitations it has.
Basically, you start with a relatively simple state machine. This doesnt have to actually do anything (read, shouldnt do anything) other then keep track of what the player is currently doing.
Now, you have a set of two arrays per state (you want generic states, not complex ones, and you can ignore potential states where there is no appropriate ai reaction, or a relatively simple or character dependent reaction,)
the two arrays being: Generic - an array full of actions that can be taken by basically any character with about the same results, and Character Specific:This is stuff like special moves, as this bit is of AI is primarily focused on attacking.
So, then you basically use a random number to choose weather to take generic or character specific action, and ofcourse tweek the likely hood of doing one or the other action based on what character is being used (also, you may want a 3rd set of arrays for similar character actions, like projectiles and such, that not EVERYONE has but a fair bit of characters have.)
Then, to choose an action from the array, you use
array[random() * (some number, like a difficulty modifier or something * array.length)]
and do whatever that returns. The number needs to be between 0 and 1 for this to work, and lower numbers will = smarter enemy's for the most part, well higher numbers will be more random and lead to a total lack of pattern.
The next step, is the one that actually makes this code work.
After whatever action is taken, you return true or false, then
function aiSort(action):int
{if(action.true){return 1} else{return -1}
}
and lastly, be sure when the action has JUST finished, to fire up array.sort(aiSort)
what this does should be pretty apparent, but basically its a matter of 1.choose an action using a random array index favoring low numbers. 2. Execute the action 3.Sort the array so that a successful action moves towards the front (array index 0) and an unsuccessful action moves towards the back.
Effectively this gives you AI that learns through trial and error, and provided you save your more generic arrays between matches, will lead to the game getting progressively harder as you play, due to the AI learning how to fight against the players specific fighting style. You probably want the arrays to contain basically every remotely viable action (even some stupid ones, just in case) and start out sorted in a somewhat rational way, so that the enemys wont do dumb things like attack straight to the left well the player is directly above them before they have learned the correct response, but make sure too keep somewhere in the array the option to attack straight to the left when the player is directly above them, on the off chance that someone frequently jumps directly above the ai before landing to there left as a way of tricking it.