Harmonia Tactics v1.4.1 + Trailer!

Leave a reply

Before clicking the download link, check out our new trailer!

Neat, huh?

Moving on… Bugfix release! A lot of crashes were fixed, some of them pretty critical. Slime Runner! didn’t even run, which was surprising, considering it was the last thing tested before the v1.4.0 release. Mysterious! Other than that, crashes should be at a minimum now, and chat in Tower War has teams properly color-coded.

Download here, from!



  • Additional vertical angles for Slime Runner!.
  • Slightly harder to die in Cheesetopia.


  • Slime Runner! runs again, derp.
  • No more division-by-zero errors when height penalties aren’t defined.
  • HUD no longer causes crashes, especially when quitting a game.
  • Tower War names now properly reflect players’ teams.
  • Scenes no longer continue playing while server is paused.
  • Tutorial no longer hits account player limit.

— Synival




Harmonia Tactics: Engine Demo v1.4.0!

Leave a reply

Another release, only 2 months late – hurrah! This release features a tutorial, cutscenes, height-based gameplay, and lots of engine upgrades. The cutscenes and engine upgrades pave the way for some significant game content, which makes this release an important “bridge” to bigger and better things.

Aside from a bugfix release, this is likely to be the last public release for a while. It’s time to start churning out content for the game and working on the story, artwork, maps, etc. There is still plenty to do programming-wise (the basic controls could use some improvement!), but it’s time to move onto the next phase of development, which should be fun, if not interesting.

Download Link

Game Renamed from ‘Harmonia’ to ‘Harmonia Tactics’


Being able to find the game on Google is pretty important, so we’ve tacked “Tactics” onto the end of the name so you can do that. Big thanks to Detocroix for the logo! (@Detocroix,

Cutscene Fun!

Already featured in last week’s post, the Rollcoon is making his appearance in this scene demo. It may not look like much, but this scene plays out in real-time online, visible by other players, without interrupting gameplay of any other your characters. Neat! Again, big kudos to Detocroix for this little creature.

New Tower War map: Paradox

Tower War Paradox

Paradox is an experimental map designed to test height-dependent damage bonuses and movement restrictions. There two paths with one-way staircases and several high-elevation sniper points. The map is also freakin’ nuts – the entire map is visible at once for planning strategies, which can be mind-warping at times. Get ready to rotate the camera all over the place!

Full Changelog:


  • Game renamed to ‘Harmonia Tactics’, complete with new logo!
  • New tutorial to explain basic game concepts.
  • Real-time cutscenes.
  • Four single-player demos for new game engine features.
  • Height is now a factor for troop movement.
  • Attacking from high places provides a bonus.
  • New ‘Paradox’ map added to ‘Tower War’.
  • Hitting ‘Escape’ in-game brings up the game menu.
  • Rewrote chat window to use a more traditional interface.
  • Misc. Features

    • Rollcoon monster!
    • Doors and context-sensitive object commands.
    • One new spell – ‘Gust’ for Monk.
    • ‘Slime Runner’ wasn’t working properly – now it does.
    • Screen resolution / window size is now saved and can be modified from the options window.
    • Hitting ‘x’ now centers the camera on the selected character.
    • Double-clicking on characters in the HUD now centers the camera on them.
    • Changes

      • Maps are more visible indoors.
      • Enemy HUD is now in the upper-left corner rather than the lower-left.
      • Buffed ‘Heal’ spell.
      • Reaching 0 respawns in Tower War results in effectively permanent death.
      • Engine Upgrades

        • For RPG-like mods, new accounts can be created.
        • Massive server speed improvements.
        • Server now caches object distances – it takes a healthy chunk of memory, but drastically improves CPU usage.
        • Major upgrades to camera functionality.
        • Dialogue improvements – it no longer steals game control.
        • Bug fixes

          • Order icons at the end of paths are now drawn correctly.
          • HUD no longer crashes on occasion.
          • Remade map background to tile properly.
          • Fixed a few pathing errors.
          • Tower War now resets the camera between rounds.



Programmer Corner: Online Cutcenes in Harmonia ED v1.4.0

Leave a reply

Howdy, folks. One of the biggest features (if not the biggest feature) of Harmonia Engine Demo 1.4.0 is the ability to have server-side cutscenes. Cutscenes are nice, and just about every game has them. While, in concept, it’s a fairly easy thing to implement…

1. Write some dialogue
2. Add blocking
3. Fancy camera changes
4. Done!

…the client/server model and online nature of the game presented some challenges that took some mental gymnastics to overcome. It was an interesting puzzle to solve, so I’d like to share Harmonia’s solution for anyone brave/stupid enough as me to delve into online game development themselves. So, without further ado…

The Single-Player Approach, or, That Doesn’t Work Online!

Let’s say you want to have a scene in which your party enters a harbor and you’re suddenly ambushed by pirates who recently docked. If you’re scripting your cutscenes with a text editor, you might end up with something like this (pseudo-code ahead!):

camera (settings for a nice aerial view of our characters)
dialogue (Synival-the-pirate,
   "Avast, ye scurvy dogs!  The pirate king will conquer you!")

spawn ('entity_pirate' 10 times on the dock)
dialogue (entity_pirate*,
   "Arr, I'm a pirate!")

camera (quick zoom-in to our characters)
wait (camera)

jump (Hero-Jim)
dialogue (Hero-Jim*,
   "Damn!  This isn't good...  if Synival himself is here, the "
   "pirate gang's reach in these scenes has grown far indeed.")

choice ("What do you want to do?", "Fight!", "Retreat!")
if (choice_was ("Fight!")) {
   draw_sword (Hero-Jim)
   dialogue (Hero-Jim,
      "It looks like we have no choice.  To arms, men!")

   draw_sword (all-other-heroes)
   dialogue (all-other-heroes,
      "Yes, sir!")
   battle (Pirate-Harbor-Battle)
else if (choice_was ("Retreat!")) {
   dialogue (Hero-Jim,
      "We can't face this pirates right now.  Regroup back in the town!")
   enter_map (Harbor-Town, Harbor-Entrance)

This is a pretty straight-forward scene with some dialogue, camera changes, and basic blocking like “jump” and “draw_sword”. It gives you a choice to fight the pirates or return to town. In an offline mode, the game could stop time while the scene executes, then safely return your characters to their original places and start the game clock again. However, if playing online, this isn’t an option; it would be quite rude for one player to pause the entire server! Events will continue to run and outside influences could disrupt the scene. For example, the harbor could be destroyed by cannon fire. A “petrify-in-10-seconds” debuff before the scene began could kill all the characters mid-scene. And, probably most common of all, the client could disconnect at a point after the pirates spawned, but before the player chose to fight or retreat, leaving the area in an incomplete, bugged state.

Scene Objects and Persistent States

To prevent broken behavior like this, the solution used in Harmonia was not to execute scenes linearly, but use a server-side scene object with a modifiable state. Character objects are linked to the scene, and the scene object itself keeps track of dialogue and its current point of script execution. Server and client sync the scene object’s state so, in the event of a disconnect or other shenanigans, players can pick up right where they left off. Also, because the characters are still linked to the scene object while offline, a “don’t attack me while in a scene” flag is still on, so your party won’t be devoured by a family of hungry bears before reconnecting. This kind of immortality may result in some exploits or trolling, but it’s easy to turn off later if becomes a problem 😀

Multiple Characters, Multiple Scenes, Multiple Cameras

Harmonia lets you play as several characters at once which can be selected via the HUD or the 1 through 0 hotkeys. They can also split up and explore completely different areas of the map. Because of this, characters manage their scenes individually. If Jack is buying items at the local shopkeeper, Jill, who is regenerating HP back in the inn, may not want to be interrupted by the bartering occurring 5 buildings away. In addition, the town drunkard could interrupt Jill with some quest dialogue while she’s sitting around, which wouldn’t interrupt Jack’s shopping spree.

Here’s a giant gif of two characters walking around while each other’s scenes are taking place. This scene scene has no dialogue, but sets the camera and lasts (I think) 10 seconds before ending:

Harmonia Scene Interruption
Harmonia Scene Interruption
When a character has a “Speech” icon above their head, it informs the rest of the world that they’re in a scene. In this state, they can’t be pushed, attacked, and they can’t be issued any orders until they’re out of the scene.

Programming-wise, this isn’t too difficult to accomplish. Because the server-side scene object remembers its state, and because the server syncs the scene with clients, it’s easy enough to make sure clients are always looking at scene data from their current character. The client remembers its own camera state outside of the scene, so whenever it re-enters gameplay mode, it can pop the scene camera state and return to normal.

A Simple, Finished Cutscene in Harmonia

Check out this cuddly li’l Rollcoon, up to some wacky antics!

Rollcoon Cutscene
Rollcoon Cutscene

Harmonia’s script code is pretty simple. The script below uses the following commands:

set (property, value)
   Assigns 'value' to 'property'.  In this scene, it's changing the camera positioning.
dialogue (id, character, text)
   Creates or appends to a dialogue window belonging to 'character'.
   'id' is a unique identifier used to keep track of which dialogue has already been read.
beat (character, script)
   Runs the script 'script' on 'character'.
   Used to modify properties of characters or issue orders like jump() or move().
wait (id, type, parameters)
   Pauses execution of the scene/script until certain conditions are met, specified by 'type' and its 'parameters'.
   'id', like with dialogue(), is a unique identifier used to keep track of which wait() commands have already executed.

Here’s the script:

   set (camera, "x=-3 y=-12 height=-1.5 rot_y=-30 rot_x=22.5 dist=5 "
                "lock_pos lock_rot_y lock_rot_x lock_dist")
   dialogue (1, speaker, "What are you doing in here?!  Get out of my house!"
                         "`NGo on, scram!!")
   wait (1, dialogue)
   dialogue_clear ()

   set (camera, "x=-1 y=-9 height=-1.5 rot_y=-60 rot_x=22.5 dist=8 "
                "lock_pos lock_rot_y lock_rot_x lock_dist time=0.25")
   wait (2, time, 0.25)
   beat (speaker, beat_get_out_return)
   wait (3, time, 2.00)

   narrate (2, "Wait a minute - why did HE leave?  This scene makes no "
               "I hope this little demo made your world a little bit "
               "brighter.  Ta-ta!")
   wait (4, dialogue)

And finally, here’s the code from the script ‘beat_get_out_return’, used by the beat() command:

   off (scene_welcome_rollcoon_house)
   move (internal (spawn_x), internal (spawn_y))

This is a simple beat that tells the Rollcoon to move back to its spawn location further down the map – he didn’t spawn in his house 🙂 It also turns off the ‘scene_welcome_rollcoon_house’ script, which is what put him in the house in the first place. With that script gone, he returns to his original location and runs an alternate scene, specified elsewhere.

Next Project: Menus and Dialogue Trees

This model has everything necessary to program a menu system for shopkeepers, quest characters, and any other random event. Implementing the current system took a long time, so I’m taking a break from it for now 😛 When my brain solidifies (it’s a pile of mush right now thanks to exhaustion and the common cold), that may be the next project.

— @Synival




Harmonia v1.3.0 – 1.4.0 on the way!

Leave a reply

Greetings! I should have updated this site one month ago, but it slipped through the workload. Development has slowed down lately, mostly due to burn-out. A website staff would be nice to have! Regardless, here’s the latest version of Harmonia, with some big Tower War upgrades!

Download Harmonia 1.3.0 on

What’s New?

Magic! Tower War upgrades! This version has some new visual effects, spell effects, AI improvements, performance upgrades, and two new maps for the Tower War game. A multiplayer server is up and running, give it a spin 🙂


From Tower War Screenshots on Imgur:
Festering Valley Cavern of Balance

From Magic Screenshots on Imgur:
Black Hole
M A G I C !


* Five magic spells are in and fully usable. Hoorah!
* Window now grabs mouse, allowing for mouse scrolling.
* HUD windows can now be expanded/contracted to show either more character detail or more map visibility.
* Stats now use a ‘Tag’ system for balance. In the HUD, rather than showing the player class, there are various icons representing bonuses (Blue) and penalties (Red) to stats.
* More rendering filters for sprites, specifically for magic and lighting.

Tower War Features
* New Map ‘Cavern of Balance’ (Map #2).
* Teams can be chosen when connecting.
* Lots of balance changes and AI improvements.
* Added more options to the ‘New Game’ window.
* New players connect at the level of the weakest player so team balance doesn’t immediately shift.
* Many, many bugfixes, tweaks, and performance upgrades.

Misc. Features
* Minor tileset beautification.
* Modified a lot of sprite frame details, and female sprites should look more lady-like.
* Animations now have ‘Subframes’ as well as ‘Frames’ for the purpose of animations.
* Sprite Editor can add (but not yet remove/copy/modify) subframes.
* New ‘Tag’ system applied to Battle Arena monsters.
* File Chooser dialogue now works a little better.
* Game/Interface sound effects are now on separate channels.
* New sound effects for user interface.
* Objects can now be glued onto other objects, i.e, “attacker.*weapon.tip”.
* New music track for swamp: “It Approaches”.
* Tactical icon resolution upgraded.
* Crossbow/Cannon now have proper arrows and animations.
* Sprite textures can now be exported to PNGs using the Sprite Editor.
* Explosions no longer have shadows.

* Unit orders should no longer persist when the order is over.
* Fixes to Windows/Linux background process launching and management.
* Fixed some potentially game-stopping network bugs.
* Reorganized a lot of files, which means a full update is necessary.
* Sprite Editor bugfixes – it doesn’t lock up constantly anymore!
* Updated artwork for the grid to be the same pixel size as common tilesets.

Internal Changes
* Render engine now uses a more advanced (and cleaner!) shader management layer.
* Several server-side performance optimizations.
* Textures are now sorted by name in splay trees.
* Sprite limb system overhauled to be much more versatile.




Harmonia v1.2.1 – The Cheesetopia Project

So, today is April 1st – international troll day. I had this devious plan to post an onslaught of images featuring Mice fighting each other with PEWPEW laser blasters on a Cheesemoon. Screenshots would be posted, tweets sent out: “Harmonia has been renamed to Cheeseland, you fight mice on the moon, blahblahblah.” Tilesets were crafted, space lasers and helmets were drawn, lighting effects were upgraded to create the proper ambiance for an abandoned moon base, and a cheesey plot (lol pun) was written up. After a few days of work, it turned out to be so much fun that now it’s a real thing! It’s not finished, but it’s well on its way 🙂 Download it here, from

Download Harmonia Demo V1.2.1 – The Cheesetopia Project*
* Delete any previous version of Harmonia before installing.


Cheesetopia First Room larger_battle low_oxygen dead_mouse earthscape


* Cheesetopia mode!
* Early NPC dialogue.
* Allies/enemies can be selected and targetted using the HUD.
* Hovering over tiles now highlights their entities.
* Terrain grid is always visible during mouseover.
* Holding ‘Ctrl’ now hides entities for item/terrain selection.
* Better, sleeker font for basic text.
* Holding ‘Shift’ now shows attack ranges for weapons/entities.
* AI now makes decisions before executing their turns.
* Buggy sprite editor now available from the main menu.

Misc. Features
* Hitting ‘Esc’ now closes all inventory windows.
* Sprites no longer adjust their colors based on default luminance.
* Lightmaps are now rendered properly.
* Small HP font beautification.
* Increased ‘X’ box for closing windows.
* Terrain rendering now uses the same method for mouseovers, making all highlighting much easier.
* Sprite editor has more ‘Attachment’ control.
* UI buttons are a little bit easier to see.
* Different arrows can be specified for animations.
* Tile layers can now pulsate.
* AI think time is now slightly random so they’re not 100% in sync.
* Extra ‘shadow_offset’ property for sprites.
* Some extra sprite shadow beautification.
* Cannon/longbow now uses plasma bolts.
* Current and total files to load are now displayed.
* Empty containers are now listed as empty.
* Added notes to Cheesetopia, small tweaks, some extra script.

* Bots respawn again in “Tower Wars”.
* Client/server combat movement speeds are now synchronized properly.
* Several fixes to enemy AI tracking.
* Targets were broken when removed and re-added too quickly.
* AI now properly remembers its orders instead of throwing them away.

Internal Changes
* Multiple default fonts for options buttons, headers, text, HUD, etc.
* Overhauled sprite drawing code.
* Linux version can now spawn the server from the client.
* Classes now register themselves for character creation.
* Mods can now change character classes, default key modes.
* Subtextures are now scaleable using texture_draw_box().
* Torches now appear held in character’s off-hand.
* ‘Limbs’ can now use color data from other sprites (for equipment).
* Tile layers can now have ambient glow.
* Negative health generation now works.
* ‘inside’ and ‘outside’ effect searches are now available.

Enjoy 🙂
— Simon (Synival)