Port Update

I’d promised an update about the work moving Six Ages: Ride Like the Wind to more platforms, but I just realized it was only via Twitter. So here’s the official note, from our publishing partner Kitfox Games:

Six Ages Steam Release Delayed
Greetings riders!

Six Ages is more than a myth or a legend — it’s going to be playable on Steam (hopefully)… but not as quickly as we’d initially planned.

Unfortunately, the original programmer we contracted in the summer didn’t work out, and although he had to visit the emergency room a couple of times, he’s thankfully recovering now. But we have had to re-start the porting process with a new porting partner.

We’re happy to be working with Rusto Games, a small outfit in Finland (three cheers for Finland!) who are big fans of King of Dragon Pass and Six Ages, which makes us big fans of them in turn.

We aren’t sure exactly what the new release date is, but we’re hoping to hit desktops (PC and Mac) spring or summer 2019. You’ll be the first to know when we have more details. In the meantime, David and the team has been making lots of bugfixes, so it will be the most polished release of the game it can be.

Thanks for your patience and support!

Victoria, Tanya, and the Kitfox clan

As they point out, the silver lining is that this gives us more time to find and fix weird edge case bugs (such as two random events occurring in a specific order and timing).

Rusto Games has made significant progress, so I think we’re still on target for our promised date (see our FAQ): 2019.

In the mean time, please wishlist the game on Steam, which helps get us visibility for next year’s launch.

Map Making

The new game needs a new map, so I thought it might be interesting to go over the technical process involved in creating a functional map.

Six Ages (like King of Dragon Pass) divides the local map into zones (such as the Imther Mountains), as well as hexagons. Exploration reveals new hexes. Which zone you’re exploring influences the results (as with most things in the game, it’s not purely deterministic).

I draw each zone as a separate layer in Photoshop, giving it the name of the zone. Then I use File > Export > Layers to Files to create separate PNG files. I actually do this twice, once to create trimmed images that can be used for hit-testing, the second to get the metrics of each zone. The command takes nearly 9 minutes to run on a recent MacBook Pro.

Photoshop exports the layers with file names like _0002s_0002s_0001_Vestantes.png, so I run a couple bash scripts to clean that up

for f in *.png; do mv $f ${f/${f:0:12}/}; done
for f in _*.png; do mv $f ${f/${f:0:6}/}; done

to leave me with Vestantes.png.

The untrimmed images are each 1500 x 1375 pixels (in the case of “Ride Like the Wind”). I feed these through TexturePacker, which is designed to find the unused pixels and combine the images into a single sprite sheet. This is important with some graphics systems, but I actually ignore the image. What I’m after is the metadata, which describes the bounding box and position of each image within the overall picture — i.e. its geometry, where it is on the map. I use Lua to specify the game’s data, so I have TexturePacker export for the Corona SDK. Corona uses Lua, so I can use the same data files even though I’m not using Corona. A typical zone looks like

	-- Vestantes

	sourceX = 0,
	sourceY = 775,
	sourceWidth = 1500,
	sourceHeight = 1375

so I can do hit-testing based on the 434 × 317 size of the zone. I also create a separate metadata file, which describes the features of each zone:

["Vestantes"] = {flags = kFeature + kAcrossOslira, label = "Vestenan", labelVariable = "showVestantes"},

(This is an explorable feature, that requires crossing the Oslira River to visit. Once discovered, it’s labeled on the map.) There’s a bit of sanity checking in the game to make sure every zone has its feature data, which is useful during development (the data is spread between two files so that the geometry can be regenerated if something changes).

Clan zones need special attention. Is a clan that has claimed the zone NBE1 adjacent to a clan in NBE2? This is additional metadata:

["NBE1"] = {neighbors = {"NBE2", "NBE3", "SO1"}, flags = kRiver},

To help edit this, there’s a special debugging mode which shows the connections. There’s some sanity checking code for this too, though it’s mostly a manual process.

The first time through this, I noticed there were some stray pixels in one of the layers (and had to run TexturePacker again). But it’s a pretty straightforward process.

The final step (before testing in actual play) is to make sure the number of exploration hexes is correct.

The new map is ready to go, much earlier in the process than with the first game.

Tags are Magic

I was going through some playtester comments, one of which noted that diplomacy-related magic wasn’t as useful as it might be. So I did a quick review of the four blessings that seemed like they would relate to diplomacy. And while I’m not sure I was looking for exactly what was reported, it did seem like they could be more important.

Understanding: Helps our dealing with foreignersI’ve mentioned before that scene tags have been very useful. One of the diplomacy-related blessings is called “Understanding.” It’s implemented as

+1 in scenes tagged @foreigners

Diplomatic missions can be sent to a variety of people, so scripts like news_GiveGifts (which reports on simple gift-giving) can’t simply have the tag. But tags can be dynamically added, so making the magic more broadly useful was a matter of

RemoveSceneTag(ThisScene, "@*")    # Any previous dynamic tags
[otherClan.culture = 'other] AddSceneTag(ThisScene, "@foreigners")

Even though it takes two lines of OSL, I like this better than something like

[HasBlessing(ourClan, "Silvertongue")] b += 1

(which another blessing needed) because it affects the entire script, rather than just a specific branch.

The game makes extensive use of tags. The scene compiler uses a few to make sure scripts with very particular conditions are triggered from a single spot. Unit testing uses ten tags so it can set up the right context for running scripts. The UI code checks for tags that determine that a scene needs special elements like a text field. And there are over 100 tags that help categorize scripts, including whether magic applies to them.

Looking For a Few Playtesters

Update (28 October): I just invited the next group of playtesters, and have a good number of people in reserve. Thanks for your interest!

We’ve been testing and tuning the game for a while, and are ready to ask for a little more help.

What we need from you:

iPhone or iPad

While we plan to support other platforms, we are currently using TestFlight to manage testing. So you’ll need a device running iOS 9 or later.


We’re hoping to find testers who have enough time to play the game. We’re still trying to get a sense of how long it takes, but QA is reporting at least 12 hours for a complete game. (We don’t need you to win, though it’s certainly helpful to get the full picture.) The more you can play, the more we can learn.


The more you can tell us, the better! You’ll be able to send bug reports from the game (which include a wealth of information), but subjective feedback is crucial too. We need to hear what doesn’t work, as well as what’s fun.


We still don’t know when we’ll be releasing, so we ask our playtesters not to discuss the game in public.


We’re still tuning the game, so we don’t need a lot of active playtesters at any one time. We might hold off inviting you until we need more fresh eyes.

What we don’t need:

Experience with King of Dragon Pass

Although a lot of the game is similar, we need to make sure it stands alone.

Knowledge of Glorantha

Like King of Dragon Pass, Six Ages is set in the fantasy world of Glorantha. But we hope it is self-contained, in terms of giving you enough information.

Experience with games

If you’re interested in playing an interactive narrative that has both story and clan management, you’re eligible. The game is very different from just about everything other game, so familiarity with any particular genre doesn’t help.


While the more you can play the better, we don’t expect you to play obsessively for weeks and weeks. (You’re welcome to, but don’t feel like you have to beat the game on every difficulty level or earn every achievement.)

How to volunteer:

Send us email to bugz «at» a-sharp.com with the subject “Six Ages Playtest.” Include the type of iPhone or iPad you’d be testing on — we are mostly interested in game play issues, but it wouldn’t hurt to have a variety of devices.

July Status Update

Six Age has a lot of art, and it’s almost all complete. I just sent out the final assignment today. We may still do a little reworking of illustrations and UI assets, but technically what’s there now could ship.

The music is in similar shape. We’ve been trying to track down some bugs (are they in the underlying engine? my code? the music itself? the operating system?).

QA is still pushing to get all scenes and events exhaustively tested. Bugs range from typos, to logic flaws, to “after a failed, interrupted cattle raid, the news after a heroic combat doesn’t show up at the right time.” (That’s not quite how it was reported, it took much of a day to figure out the first part.)

We’re also playing the game. It’s quite possible to win and to lose. Unlike when we did KoDP, I’m capturing data so I can see what went wrong (or right) — a recent loss was an event that turned out to be much harsher than we expected. There’s a lot of randomness in the game, but I’m trying to tune it so one unlucky break (or one bad decision) won’t sink you.

Not yet. Sorry to interrupt, but I know you were going to ask if you could beta test. There are still a few last features I want to get finished. (In theory I could drop difficulty level, but it’s on the list to go in.) And there is no point sending it out with known bugs. At some point we will be looking for outside testers, but it will still be a while.

Time to Face the Music

We’ve been working with Stan LePard (who did the music for King of Dragon Pass) on music and sound effects for some time, but it was only this week that he delivered them all in a form that’s playable with our sound engine (Wwise).

The file was 715 MB, which dwarfs the rest of the game. But that was before doing any audio compression, and it looks like audio will take no more than about 100 MB.

I had recently made sure that every interactive scene had music, and hooked up some of the user interface sounds. But there were a lot that weren’t in, particularly related to transitions and combat. So this week has been a scramble to play the appropriate sound and find audio bugs.

According to QA,

I get so annoyed when I’m away from my phone long enough while writing a bug that the phone switches off and the music stops. I’m like, where’d the pretty music go?!

We’re still experimenting with compression levels and formats (both for sound quality and performance). I have been so busy making it work that I really haven’t had a chance to listen critically with headphones on, but I hope to do that soon.

QA Makes the Game Too

The official role of QA (Quality Assurance) in software projects is to assure quality — that is, the software works as designed, and the design is reasonable. They find bugs.

But in a game, they do more. QA plays the game more than anyone, and has the best sense of how it works. Is it fun? Is it too hard or too easy? Does the UI work? What’s missing?

In King of Dragon Pass, the “heroic combat” concept came about because Rob Heinsoo felt something was lacking. (He ended up writing most of these scenes, too.)

I just finished implementing a suggestion from Liana Kerr:

I feel like there’s not a lot of connection between your opening questionnaire and your clan management. I have no emotional connection to the fact that we know the secrets of [redacted], because it’s never referenced again.

Well, it now is. And while a few questions don’t get an explicit mention later, I just made sure that every answer from two questions shows up in at least one scene. (The others are at least mentioned implicitly, like your ancestral enemy, or give bonuses in scenes.)

Earlier, she suggested

Raid adviceAdvice about raiding-related promises currently shows up in the War screen, but if you go to the Raid screen, it doesn’t. As a player I’d be more likely to expect to see it in the Raid screen and would entirely miss it in the War screen.


One problem I’ve always had with KoDP is that someone dies and I immediately forget who they were — that is, I just see the name and I don’t necessarily connect it with the face that I’ve been looking at for several years. It may be a little different with Six Ages, since the UI is a little different with the ring members’ names underneath their pictures … Two suggestions: …

and so on. More good ideas that got implemented.

For that matter, it’s not just QA that can influence the game. Much of the current combat feedback is based on a suggestion by Jan Pospíšil.

Not every team suggestion ends up in the game. Some are still on the backlog of possible tasks. But more input makes for a higher quality game.

One Step Build

I just now made build 365, which seemed as good a number as any to mention.

One way I’ve improved the development process is to have an easy way to post a copy of the game for the rest of the team to test. With King of Dragon Pass, this was basically a manual step. Now, there’s a script that increments the build number and does a clean build, then copies it to a web site. It also uses rsync to copy any script files to a Dropbox folder, so QA has easy access to the corresponding source.

This isn’t build automation (it’s not automatic, like Travis or buddybuild), but it’s painless. The basic build takes about 40 seconds (uploading is more variable). And it does mean we pass one of the steps in the Joel Test. Our builds aren’t daily (since we’ve been at this more than a year), but they are at least frequent.

Where The Money Goes

A comment on our last status update mentioned our budget. Our plan is to make a new game for a lot less than it cost to do King of Dragon Pass. Hopefully our experience (with KoDP and games in general) will let us do things more efficiently this time. We will likely do a lot less reworking of certain elements than we did the first time, since we have a better idea ahead of time what should work. And automated testing will let QA concentrate on bugs only a human can find.

budgetplanThe pie chart shows where we expected to spend our budget shortly after starting. The bulk of the expense (44%) was projected to be art.

Note that this doesn’t include any sort of overhead (like development machines, internet access, etc.). And I’m not directly expensing my own time. In other words, this is just what we expect to pay our freelancers.

This was just a plan, and once we were far enough along to see how things were working, we realized had to do more writing and art. So the final percentages will end up a bit different, though art will predominate.

(And yes, the title of this post is an excuse to watch OK Go.)