E. Darwin Hartshorn: //Boilerplate

Code

Therion: Combat System

I have a combat system that works like this:

  • Each monster has a library of moves they know, and moves they are ready to use.  The moves they are ready to use is basically a tray of sixteen or so moves you can use in combat.  In between battles, you are able to put different moves in that tray from the list of the moves your monster knows.
  • Each combat turn , you get to see your tray of ready moves, and a pair of three- or four-slot bars above them.  You can either drag moves from your tray to that bar, or simply select a move with a tap and select the slot in the bar you want to put it in.  You opponent does the same thing.
  • This move selection process is double-blind:  You find out what your foe did at the same time as he learns what you did.  But it’s also multi-stage (until the bar fills up):  say you drop a move into slot 2, and he drops a move into slot 3.  Well, if you have a move that can beat his move in slot 3, you can drop it into your slot 3 (but he’s probably countering your slot 2).
  • Once all three or so slots are filled in, the moves are executed in order, with each monster performing its move simultaneously with the other.

So far so good.  But, this by itself turns into a game of Rock-Paper-Scissors.  Unless you randomly choose the same slot to start out, it will be 1) pick a move, 2) counter your foe’s move, and 3) pick a move, with the matchup of the third move determining who wins that exchange.  Let’s add a little more depth.

  • Moves have stats like “Accuracy, Defense, Power” and so on.
  • If a character uses a move that has a defense stat, and the other uses a move with an accuracy stat, then the second move hits if it exceeds the defense of the first move, and doesn’t hit at all if it does not.
  • A move can be both defensive and offensive (i.e. a riposte), but in this case the offense fails if the defense fails.

So, let’s come up with a set of moves using the combinations we can get by distributing 3 points between these stats:

  1. Block:  Defense 3.
  2. Power Strike: Power 2, Accuracy 1.
  3. Precise Strike:  Power 1, Accuracy 2.
  4. Riposte:  Power 1, Accuracy 1, Defense 1.

See?  Rock-Paper-Scissors.  All else being equal, a Power Strike will be more effective than a Precise Strike (doing twice as much damage), a Precise Strike will prevent a Riposte, and a Riposte will prevent a Power Strike.  And a Block beats all, leading to an obvious dominant strategy:  Just keep throwing up Blocks until your opponent tries something that’s not a Block, and oppose it with the move that beats it.  Which would lead to people spending entire fights with their monsters just sitting there, with their guard up.

Let’s add some more rules to mix things up.  First up, the balance of power:

  • Each move gets a base of three points to distribute between the move’s stats.
  • A move’s stats are not the final stats of the move, but are multiplied by underlying stats on the monster (e.g. a monster with a high defense will be able to beat a monster with a low accuracy when using Riposte against Precise Strike!).
  • Moreover, a move has three levels of mastery:  it is known (it’s a 3-point move), the monster is an expert (4-point move), or the monster is a master (5-point move).  So with enough practice, the balance may change.
  • Moreover, moreover, a move may garner an extra point of effect if it has monster-feature-based limitations (e.g. “You can only use this move if you have claws”).
  • And each monster comes with a signature move that has two extra points of effect (which does not stack with limitations point, as it is effectively a totally limited move).

So far, so good.  But while this takes things into stat matchups and brings the moveset away from Rock-Paper-Scissors, and towards Rock-Paper-Scissors-Lizard-Spock, the dominant strategy outlined above:  block all day and hope your opponent chooses an attack you can counter, still remains unbeatable outside of sheer stat-based pwnage (e.g. I’m going to max out my monster’s Accuracy and Drop a Precise Strike on him every time he blocks).

Let’s add some more, more things.

  • You can spend a point in a move to, well, move:  forward or back.  Monsters can back away and close, resulting in three ranges (close, mid, far).  This can be envisioned as a potentially infinite strip of tiles:  Monsters can be on adjacent tiles, or they can move apart, but they will never have more than two tiles between them.
  • Monsters can move past each other.  In effect, if you move into the other guy’s square, you are automatically teleported to the square behind him.
  • At the beginning of each turn, everyone automatically turns to face each other.  However, turning around inside a turn is a point of advancing when you are facing away from your foe.
  • Moves affect the square directly in front of them by default.
  • A point may be spent to extend the move’s range by one square.
  • Points may be put into any of the stats behind the character (that is, a move tracks the stats separately for the space on either side of the character, but most moves only bother to use the space in front.

Let’s brainstorm a few basic, 3-point moves for this system:

  • Charge: Forward 3.
  • Retreat: Back 3.
  • Advance: Forward 1, Accuracy 1, Power 1.
  • Withdraw:  Back 1, Defense 2.
  • Energy Burst:  Range 1, Accuracy 1, Power 1.
  • Guard:  Defense 2, Rear Defense 1.
  • Passing Blow: Forward 1, Rear Accuracy 1, Rear Power 1.

Now, if someone constantly uses Block, you can simply step behind him and smack him in his undefended back.  You can also dodge attacks by just not being where they hit.  Let us say, so that Advance is meaningful, that attacks land at the end of processing the move (this fits with Riposte failing if the defense fails), which means Retreat will get you right the heck out of range.

Okay, I think we’ve broken the stalemate condition.  Block is useful now, but not broken.  And once we mix in limitations (e.g. Fireball gets more range than Energy Burst, but requires that you have Fire Elemental Powers built in), we start to get a decent mix with just these stats.

But just these stats are still a little boring.  I don’t want a Final Fantasy or Pokémon style elemental weakness system, since this is a virtual pet and you can’t switch your monster out for one who’s not weak against your foe, but I want special effects that mean something.  For instance, a move that sets the field on fire, which damages anyone who is not reasonably immune to fire.

Let’s add if-then limitation points.  If (condition), you get an extra point that is spent thus.  For instance, perhaps you have:

Fireball:  (Requires “FIRE”) Accuracy 1, Range 2, Power 1, IF(Foe(“FLAMMABLE”)) Power +1.

So this move does twice as much damage if your enemy is flammable.  This allows some type-weakness style stuff that is way more flexible than a simple type table (which is not to say I don’t love type tables).  It also means there’s a good chance that if your opponent is filling his move tray with a range of moves that will be extra effective against a range of monsters, he will have one that’s really good against you, but if you survive the initial hit, you’ll probably be able to come up with a counter if you’re clever.

Maybe we’d better balance the condition stuff by saying there has to be a -1 condition (e.g. IF(Foe(“FIREPROOF”)) Power -1).

Who knows.  We’re getting complicated enough that the nuances will only come out in testing.  But now we have an idea of what we’re going to do.  The next step is to work out how we’re going to do it.

Leave a Reply