Heh, in my Blockman game I've been toying around with opponent AI using my link.js. I liked the AI systems in Bioware games and thought I could do something like that in my games (you have these configurable 'slots' that do actions in a very human readable way).
// If the distance between me and the player is between 0 and 16 pixels, use the attack skill.
AI("enemy1").ifDistance("player", 0, 16).useSkill("attack", "player");
// If between 16 and 120, attempt to seek.
AI("enemy1").ifDistance("player", 16, 120).seek();
// I'm not sure about this, but I fear I need a stopping condition for the AI since it could change depending on enemy type.
AI("enemy1").ifDistance("player", 120).stop();
// If my hp is between 0 and 33%, use the skill 'heal'.
AI("enemy1").ifHP(0, 33).useSkill("heal");
// We can also do this to another target for a medic-like AI type.
AI("enemy1").ifOtherHP("enemy2", 0, 33).useSkill("heal", "enemy2");
// Status checking is in the mix too, as well as a smattering of other things.
AI("enemy1").ifOtherStatus("enemy2", "frozen").useSkill("defreeze", "enemy2");
Each row above creates an AI 'slot'. A typical enemy will use 4-5 slots, stronger AI's have more slots. They are created on the constructor of an enemy, so don't worry about the explicit naming. I've been looking into doing things like 'nearest enemy' or 'furthest ally'. In that regard some complex actions can be described relatively easily with this chaining method.
This applies to Pokémon because it too can be used for the AI (like with that table as NEO pointed out). My AI system also uses a light-weight threading system inspired by Lord English's scenario.js (I didn't want to use all of scenario on the battle engine, though I could I felt I just needed a lean-mean threading system.
The article is pretty interesting, I've always liked to read discussions on battle systems. The main thing I disliked about Pokemon was how you can do an attack-always approach and usually won if you could correctly match opposing types. I think two things that need to happen more often is skills that require more than 1 turn to use, not the charge-up skills, but basic skills like 'tackle' so they don't get abused, and the second thing is opponents that have unassuming normals, such as a Raticate that like knows thunder. Wouldn't that throw you for a loop? On top of that they should be randomized enough so you can't read a guide knowing you are going into a battle with a Raticate that happens to know thunder. In fact, more of that randomization needs to occur. (If it does in later games, then I'm wrong, my knowledge only goes up to Ruby/Sapphire).
If we are talking about mechanics then it'd be nice to see some type affinity happening. In dual-battles two types that compliment each other could add critical bonuses to skills. Think Chrono trigger and it's combo system, but applied to Pokémon. Would be neat to see.