Alpha Trailer

Inspirations

The aiming & combo systems of Unreal Tournament 2004 & Super Smash Bros. Melee.

Always Playing Principle

Players should always be able to play. An unfortunate principle of many modern “fighting games” is that when one player takes an advantage, the losing player can do nothing at all to ensure the advantage.

In Combo.Zone, a player who is hit loses the ability to steer their ship and they go flying based on the inelastic collision of the attacker’s rocket. However, they can still direct their ship with an awkward instability – your thrusters will move you but not always in the direction you press. A ship being “comboed” can still fire their weapon, forcing the attacker to dodge or else the tables will turn!

Psychological Momentum Principle

In the neutral phase of the game, rockets will bounce around infinitely. This leads to an exciting dynamic where 2 skilled players can litter the screen with projectiles.. and when one finally gets hit, the attacker is rewarded for their skill in survival by having many additional rockets on screen to combo with!

When a player is hit, their rockets will only bounce once before disappearing from the screen. This is to reward the attacker getting a hit, giving them an opportunity to combo.

When a ship recovers from a rocket hit after a second, the attacker’s rockets lose their infinite bounce and will bounce only once. This is to support the defending player’s return into controlling their ship without having a total minefield!

Current Status

The alpha works but the code is terrible! I’m starting a new project and re-writing a much cleaner game. This will let me plug in modifiers to the game so players can customize their experience.

Next

Rewriting the ship movement & draw code! I found a bug in my applyThrust function that caused me to have a weird work around determining the ships orientation.. here was the bug:

var applyThrust = function(thing) {
var origin = {‘x’ : thing.x, ‘y’: thing.y};
var tp = [thing.x, thing.y + 1];
var np = rotate_point(tp[0], tp[1], origin.x, origin.y, thing.r);
thing.mx = np.x – thing.x;
thing.my = np.y – thing.y;
thing.x = thing.x + thing.thrustX();
thing.y = thing.y + thing.thrustY();
}

The script tries to push an object forward then rotate it.. the problem was that a theta of 0 points up, which is -1 in the y direction, while that target point tp = thing.x, thing.y + 1 is pointing down! So I’m removing the workaround and making the code work as intended.