Release Notes

We just released a new version of “Ride Like the Wind” on the iOS App Store. A lot of the changes are fixes for bugs reported by players. (As a reminder, we want to hear about problems no matter how you tell us, but our FAQ explains the best way to send in reports.) Other changes came about because we’re working on a sequel and a port.

Developing a sequel means reusing as much of the game as possible. This can mean extra scrutiny as part of the code is made a little more general-purpose, or just because we’re running it in a different context.

Developing a port makes you play the entire game again looking for bugs. Sometimes the bugs are in the game itself, not in the new code of the port.

I try to avoid the typical “Bug fixes and performance improvements” in the update notes and explain what you’re actually getting. But even with a thorough list of changes, I thought it might be interesting to go into a little more detail. This is, after all, a development blog, so I’ll share more of what goes on behind the scenes. (A few of the changes don’t have any particular explanation, so are not mentioned here.)

New interactive scene

While working on “Lights Going Out,” we were discussing how clans relate to each other, and I realized there was a common way missing. I got this working in the new game, then made a similar scene for the first one.

Reworked emissary flow

Emissary arriving and deciding on mission

The upcoming game will let you send emissaries for new purposes. On one hand, we didn’t need to change “Ride Like the Wind.” On the other, we were working on a port, so why not make the change once (before the dialog was ported)? The original approach was a little inconsistent if you were dealing with feuds, so the new flow gets rid of that rough edge. It’s also an opportunity to show more advice.

Improve compatibility with iPhone 4s

One player was using the smallest possible phone. The experience is still not optimal, but it’s a little better now.

Better handling of 10.5 and 11 inch iPad Pro, and 12.9 for map

The 11 inch iPad Pro didn’t exist when we were working on the previous version. Our original design was for the 9.7 inch iPad. Although the UI is adaptive, some of the art was designed for a specific aspect ratio. And, the newer devices also have safe areas for rounded edges or system UI.

Correct bonus for 3 treasures

I found some inconsistent coding while looking for how to best implement a “Lights Going Out” treasure. To make sure it doesn’t happen again, I added a unit test.

Fixed a couple curses

Cursing another clan had different effects in different scenes. The same curse is now consistent wherever you choose it.

Healers are much less likely to be war leaders

I also fixed a bug that occurred if a healer happened to be the best war leader. At the time of battle, the game picks an available person with good leadership as well as good combat. That may be strictly logical, but it’s not plausible that someone devoted to the peaceful healing goddess Erissa would direct warriors to attack.

Fixed bug that might have caused some scripts to be queued twice

This one was player-reported, a very rare combination of events.

Fixed some typos and incorrect recommendations

This was probably the most commonly reported category. Again, thanks to everyone who pointed them out.

Fixed crash after deleting saved game

This was probably the most benign crash possible (the app did delete the saved game), but also one of the more commonly reported ones. It was also hard to figure out exactly what was going on. I tried to fix it several times, but finally figured out a way to reproduce the crash and fixed it.

Distinguish between several ways to connect to the next game

Now that we actually have the next game in development, we’re working on making it meaningful that you played the first game (while at the same time making sure players can begin with the second chapter and not feel left out). There were some copy-paste errors that could have affected a few of the story paths.

Tip for ritual misstep

Another context-sensitive note about how unpredictable the Gods War is seemed appropriate.

Very minimal support for keyboard

The Windows and Mac version supports keyboard input. The level of support isn’t as strong, but if you happen to have a keyboard attached to your iPad, you can use it in a few places.

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
DECEMBER 6
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!

<3
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
	x=1088,
	y=2,
	width=434,
	height=317,

	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.

Time

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.

Feedback

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.

Discretion

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

Patience

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.

Overtime

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.

and

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.