These two images are not the same, at least if you are using the default Firefox configuration on Linux/X11 with gfx.color_management.mode set to 2 (only tagged) instead of 0 (all disabled). It turns out I disabled that setting entirely at some point—for some reason—and later forgot about it.

To be more specific, the image to the right is the intended rendering. This is what the side-by-side comparison above should look like with the defaults.

It also seems I have been leaving behind a trail of PNG files in the web that contain bogus ICC information that causes Firefox—again, with the default configuration—to render them differently than I actually intended when exporting them in the GIMP. In the case of my avatar, it’s not a big deal since it’s just Xykon from the Order of the Stick serving as my terrifying spokesman spokeslich. However, if my memory serves me right I have seen this being an actual issue with my whole website layout in my default-configured virtual machines — and I always dismissed that color disparity as being caused by VirtualBox instead of Firefox.

Thankfully, the website CSS currently makes more use of browser gradients to prevent the faulty (?) graphics being used in practice. The spritesheet that contains the post category icon (used in the front page) is evidently affected, though.

But to what degree is it Firefox’s fault? Unfortunately, I understand jack shit about color profiles and I don’t seem to have a tool handy to tell me what the technical differences between both images are. I suspect I did something wrong in the GIMP at some point, or perhaps the problem was created by my application of a certain PNG optimization script. Does the wrongly rendered version of my avatar actually have color profile information in it?

What I do understand is that color profile information in PNG files has bitten my ass several times over the years, and not just with Firefox, but also with Wesnoth (via SDL_image).

If anyone there thinks they have a definitive answer to this conundrum, please share.

EDIT: Yes, I reuploaded my avatar to the Wesnoth.org forums and my Twitter profile during the last couple of days in order to fix this issue. It was just matter of opening importing the current versions in the GIMP and then saving exporting the unaltered contents to new files. I will probably try the optimization procedure on the fixed versions later.

Just like the last time, this version will definitely not be exempt of flaws. You will most likely stumble upon dreadful bugs along the way, and I will need your help to fix them — make sure to report them in the campaign’s forum topic as usual!

Special thanks go to bumbadadabum for kindly providing a patch to integrate the changes to the Aragwaithi faction from his multiplayer add-on (The Aragwaithi in the 1.10 add-ons server) into AtS. 0.8.0 users shouldn’t have any game-breaking problems playing with their old units from saved games of E3S3 (Amidst the Ruins of Glamdrol), although some animations may not display correctly. If in doubt, restart from the start-of-scenario save for E3S3.

Also note that due to an internal change, if you load the start-of-scenario save for E3S4 (Outpost of Hell) from version 0.8.0, you will see the loadscreen twice. This is normal and intended, and only affects old saved games for that scenario.

This release is a turning point for various reasons I had already explained a while ago. The good thing is that once scenarios stop landing in SVN, I no longer need to worry about release schedules and pacing. I can now start pushing bug-fix releases as necessary, without affecting the development of the campaign finale.

It is also a turning point in other senses that attentive players will most certainly realize on their own. But in case someone feels disappointed by certain developments: I left enough clues scattered everywhere before, and everything is going according to plan. The bottom line is: if you don’t like the story and you can’t ignore it, don’t play the campaign. And just to be clear, it has never been my intention—at least since I resumed its development in 2011—for it to be eligible for mainline or anything like that.

For more than a year I have been actively avoiding the web browser that all the cool kids use these days. I’m obviously talking of Google Chrome.

For all its excellent performance and ease of use, I kept being bothered by its insistence on breaking the mold and looking like a completely different thing running on my Linux system, instead of behaving like an application blending with its environment. I think it was this big annoyance that kept me from adopting it as my regular web browser for all this time. But compared to Mozilla Firefox, I think there’s just no matter of dispute anymore. Chromium/Google Chrome keeps getting better, and Firefox is stuck in the noughties, much like an evolutionary dead end in the history of fail web browsers.

The fact is, there are perfectly plausible explanations for the blending issue. It was only last night that I decided to do some research, and the first thing I found while looking around in the Chromium issue tracker was #10949, “Use GTK widget renderering in web content”. Various valid points are raised by the developers amidst some background noise — courtesy of random users. And truth to be told, it works. If one takes any XUL (e.g. Firefox, Thunderbird) application and tests it against Gtk+ theme engines or color schemes other than the Ubuntu defaults*, various design shortcomings become evident, including things such as the developers’ inability to choose a toolbar icon set for Linux/X11 that doesn’t become uncomfortably unreadable against bright backgrounds.

There are many other subtle quirks in Firefox as of late that make it glaringly obvious that it is unable to keep up with my own evolving requirements. Just to provide a few examples:

The whole browser often freezes for milliseconds (up to one second) when performing certain operations in the background such as opening a new tab. (Chrome appears to use and abuse IPC on Linux to avoid this at all costs.)

Scrolling motion often feels jerky, with occasional momentary rendering artifacts such as large blank chunks that are just displeasing or even painful to the eye. (In this regard, Chrome > Opera > Firefox here.)

Awesome Bar suggestions may take long to appear in some cases due to my extensive browser history, which is pretty much the only way those suggestions can be useful in the first place (I currently have no idea whether Chrome is different in this respect). The main problem with this is that there is no obvious indication as to how much time I should wait for suggestions to come up before giving up.

I can’t keep my tabs open and start a Private Browsing session on a new window. (Chrome allows “incognito” windows separate from normal browsing sessions.)

Firefox Sync is somewhat cumbersome by design, and yet it refuses to work most of the time for unknown reasons.

As far as I am concerned, there’s a certain threshold beyond which an application starts to become a nuisance rather than the facility any modern application should strive to be. Those days when everything was a chore are long gone; I want a web browser that’s fast, efficient, effective, and does not get in my way. Google Chrome/Chromium is rather daring—perhaps a little too much—in these terms, as you can see by yourself under “Content not chrome” in their User Experience page, but their approach appears to be effective if the browser marketshare trends are anything to go by.

•••

In conclusion, I have decided to give Chromium a more extensive test run for the rest of this week. Yes, Chromium (version 20 from sid), because I tend to feel the Debian packagers know their OS better, and the built-in Flash in the current stable Google Chrome appears to have problems with my machine and/or configuration.

Thankfully, importing my Firefox bookmarks, saved forms and other cruft took just a few clicks**. I will probably have to adapt to the different user interface design (already had to move some bookmarks around for easy access), but it might as well be a minor one-time hassle if it all works out well.

* (Seriously, “every Linux operating system is Ubuntu” would become a trope if Linux ever achieved
mainstream popularity.)
** (I decided against importing my web history, which goes back as far as June 8th 2011.)

Back in January, I posted my initial plans for Wesnoth 1.12 in the developers’ mailing list to gather some feedback and hopefully motivate other developers to do the same with theirs. Guess what, that didn’t work, so here I am back at home cooking up code and user interface changes in solitude. In fact, it’s all almost ready for 1.11.0.

1.11.0 is getting closer, but it’s still a little too far; this is mainly because the map format and editor changes in trunk have not been finalized yet and loose ends abound. Thankfully, I am not the one responsible for that mess. My mess is much prettier, practical, and necessary; and it is this mess that my post is all about.

Anyone who has used add-ons in Wesnoth 1.8 and 1.10 should be able to recognize this window; previously called the “Get Add-ons” dialog, now called the “Add-ons Manager”. It remained largely unchanged during 1.9.x because I spent two years dealing with more pressing matters, so the differences seen in this screenshot should be quite obvious. But this didn’t come to be possible in a couple of days, no; in order to enable these improvements to happen I had to refactor an amount of ugly and inefficient code I had previously moved around during 1.5.x, and then add a few back-end features here and there. That button on the top right corner? Rocketscience, I tell you.

Most of my mainline commits since March have revolved around this area, starting with the refactoring that allowed me to implement the basics for actual add-on status tracking in the engine; that is, now it’s much easier to tell whether an add-on is installed, upgradable, or outdated on the server, without duplicating massive amounts of code. There is also a degree of separation between the add-ons manager UI layer and the client-server interaction code that might allow even better features to crop up in the future, such as upgrading add-ons from the MP lobby when deemed convenient by the user and/or the game.

But for now, I’ll focus on the add-ons management UI goodness that has already landed in trunk over the last couple of months.

Perhaps the most obvious change at first glance is that add-on list rows come with a status line indicating whether a particular entry is installed or not, amongst other things. For those skimming the add-ons server list, the color formatting should aid in quickly identifying entries of interest.

A less obvious change is that add-ons are not initially sorted by upload time anymore. This makes the age-old tradition of rushing uploads to a newly started server absolutely irrelevant from now on, since add-ons will be first sorted by title instead. Incidentally, for this purpose I was originally going to use identifiers (directory names), but then I found out there are quite a lot of people who upload add-ons with mismatched ids and titles.

Now we can also filter the add-ons list according to the kind of content we are looking for, in addition to the previous keywords-based mechanism. The additional options allow for displaying only add-ons with a specific installation status and belonging to specific categories. I am sure I don’t need to remind add-on authors about doing this properly since the basics of add-on classification have been around since 1.5.1 (mid-2008).

Installed add-ons are displayed with additional information when applicable, such as whether they can be upgraded or not, and what the installed version is relative to the version on the add-ons server.

The Upgradable add-ons view behaves identically to the old Update Add-ons dialog, which has been merged into the main Add-ons Manager in order to reduce code duplication.

The Description button still allows for displaying more information about the currently selected add-on, including its description and available translations. Don’t mind the gap at the start of the description in the screenshot, though; that’s the maintainer’s own doing.

Finally, we get a nice warning if we attempt to install add-ons from the server which we have already installed and contain .pbl files or version control (e.g. Subversion, Git) metadata. This is only relevant for add-on authors, maintainers, and contributors who might accidentally lose their changes otherwise.

Not pictured in any of these screenshots is the addition of a whole new Help section dedicated to explaining the various add-on types, how they are played, and how they are managed. You can see the accompanying Help button in the Add-ons Manager dialog, though.

All this shouldn’t be news for those who regularly follow me on IRC (either #wesnoth-dev or my personal channel on freenode) or Twitter, although I may have neglected the latter crowd in order to make this proper post sound a little more impressive. Frankly, I can’t accurately describe how awesome these improvements are by myself; thus, I encourage people to try them out when they get a chance, either by building and testing current trunk—with all the implications—or eagerly awaiting the upcoming 1.11.0 release, and the beginning of this long road to 1.12

Since the first three scenarios of After the Storm: Final are already out (0.8.0), I can now talk about my plans for the campaign to ensure we are all on the same page later.

This episode’s final scenario count is preliminarily advertised as twelve in the campaign menu entry, but the number may change as I see fit. More importantly, the final seven scenarios will be published as an atomic batch instead of separately. In fact, it’s very likely they will not enter the SVN repository until they all are finished.

For now, two more scenarios are expected to land in SVN trunk during the upcoming months; Outpost of Hell (E3S4) and Pass of Sorrows (tentative name for E3S5). Anyone who has been paying attention to the story and dialog sequences found in E3 so far will be able to predict the events taking place in E3S4 and E3S5. However, these scenarios (E3S4 in particular) require new units for gameplay and story reasons, and—since I am the only dedicated ‘artist’ working in the campaign—this part may take some time.

The campaign’s overall structure has resulted in decidedly slow storytelling and I don’t regret this design; basically, if you don’t like this, this campaign is not for you. However, things are going to get far more complicated after E3S5 as we approach the conclusion. Getting the finale right—in regards to code, prose, and art together, but especially art—may require a greater amount of energy than anything done before for AtS; hence, once E3S5 is out you may rest assured that unless a miracle occurs, the rest will take a large amount of time to be properly finished and released as After the Storm version 0.9.0.

Writing the finale is not a big deal per se since I’ve always known where the characters are going. The problem is making sure it’s worthwhile to play and read. I’ve always been flexible to plot changes in that regard since I resumed work on E1 last year; after all, this is a game, not a novel. The execution of the plot is also a touchy subject since the matter of the campaign doesn’t really fit neatly in a turn-based strategy game, and compromises must be made.

As usual, art is an ever-present issue as well. The finale requires more new units, props, and terrain graphics. When it comes to unit art, I have always been able to manage by reusing previous assets, making minor modifications and calling it ‘new’; but terrains and props are uncharted lands for me, which is why I fear art will take up most of the production time for the finale. And this is all not taking portraits into account; ideally at this point all major characters from this campaign—as opposed to those introduced in IftU—would have their own portraits, but that just hasn’t happened yet and is unlikely to happen in the near future.

In any case, this has been a very interesting journey. I hope it comes to an end soon and Final can be completed before the end of the year, but I’d not be surprised if it takes longer than that.

Version 0.8.0 is finally out, 16 days after the original deadline. Oh well. At least it didn’t take half a year like the last time I failed to meet a release schedule.

This version will most certainly not be exempt of flaws. It introduces the first three playable scenarios of Episode III (Final), plus two cutscenes; the playable scenarios haven’t been tested very thoroughly by my dedicated QA team or myself, and thus might be full of balancing issues, especially on difficulty levels other than Normal.

I guess I might as well take this opportunity to mention that Normal is, in fact, the only difficulty level I actually test.

There’s also a few bug fixes in this version, but nothing too important other than a voodoo fix for crashes affecting Mac OS X users at the end of Episode II (previously described in the forums). Somehow, I managed to forget to mention this item in the changelog this time; I feel this isn’t the only thing I forgot to do before releasing. Ah well, it probably isn’t my fault seeing as how I have to take care of so many things (cough art cough) for this campaign.

UPDATE: The immediate implication of this fix is that you will need to run Fate (the final cutscene scenario of Episode II, not the whole episode) again if you want Anya’s and Durvan’s stats to carry over to Episode III.

I’ll start by admitting that there was a severe schedule slip again, induced by both personal and technical difficulties. After the Storm: Final scenario 3—which was supposed to be the last scenario introduced by the 0.8.0 update—was only completed a couple of nights ago, despite scenario 2 being completed well before the last week of April.

That said, E3S0 through E3S3 are complete in SVN trunk as of this writing. The problem is that I might still delay 0.8.0 for a while so I can deal with two pending artwork issues (for E3S0 and E3S2, respectively) and perhaps do some additional balancing.

In the meantime, Mac OS X users need to be aware of a certain crash issue affecting the last release currently available, 0.7.4.

I might delay 0.8.0 even more in order to include E3S4 in it. That scenario, however, requires more new artwork that the previous ones combined, and—since I’m not an artist—I can’t guarantee an output rate that would allow for a prompt release this month. I advise patience for the time being.

It’s only been a week since version 0.7.3 of After the Storm came out. As I said some time ago, I’m not announcing minor releases in my blog anymore since they can get on occasion a little too noisy for my taste. However, today’s release, version 0.7.4, is special in a few ways.

I expect this to be the last release of the 0.7.x series unless something major comes up later. The next release should be version 0.8.0, scheduled for May 1st assuming everything goes the way I planned in the meantime. 0.8.0 will contain the first three scenarios of After the Storm: Final (otherwise known as Episode III).

It’s perfectly evident at this point that it won’t be possible to achieve the version 1.0 goals very soon, which is why I decided to go ahead with the development of the third and final episode of the campaign immediately and turn it into a 1.0 target as well.

However, the importance of version 0.7.4 goes a little further than this minor change of plans.

In order to allow a faster release cycle and quick deployment of critical bug fixes, I have split the add-on in two packages. The first, original package contains all resources except music files, which are now provided by a separate add-on creatively titled After the Storm Music in the Wesnoth 1.10 add-ons server. Since neither the server nor the 1.10 client appear to have a problem with it, both add-ons are mutually dependent; this should minimize the chances of people installing the music package without the campaign.

This design will allow faster uploads at my end, and faster downloads at the players’ end (when not using Xdelta, anyway). I expect the 0.8.x release cycle to be fairly long and lively, assuming artwork and plot development go as expected. Given the nature of the music add-on, odds are it won’t see a lot of updates in the future; at the very least, it won’t be updated as often as the approx. 4.6 MiB campaign proper. People who don’t play with music or sounds enabled, or who simply cannot afford the separate 12.3 MiB download are not required to install the add-on, although the campaign menu entries will include a small warning accordingly.

Current users of 0.7.3 and previous versions will be asked to install the music add-on when upgrading or installing After the Storm for the first time.

Because of the aforementioned splitting and some other internal changes, I decided to fast-track this update instead of holding it until 0.8.0. The more testers, the better.

After some recent changes in Debian testing’s PHP 5 packages triggered an alarm—namely, breaking my laptop’s own Serendipity installation used for testing—I did some research, and found out that due to my severe laziness, when I originally configured the respective s9y installations I chose to use the SQLite 2 backend using some deprecated (now gone), built-in PHP functionality, instead of using the newer and better SQLite 3. Of course, given the situation when I did the configuration for shadowm.rewound.net it’s also possible I didn’t have a choice.

For this reason, I just finished casting some magic enchantments on this site to convert the blog database to SQLite 3. Evidence indicates that a mere dump suffices for this end, and the schema matches a fresh installation with SQLite 3 save for a few inconsequential bits.

None of this means there was an immediate problem, but I opted for not fixing tomorrow… later today, what I could fix this early morning.

Everything seems to be working fine, although I grabbed a backup of the previous configuration just in case. I’ve heard that SQLite 3 is faster and more space-efficient. The latter does seem to be the case, but since I’m limited to a crappy, high-latency mobile broadband connection to browse the web, I am unable to verify the former for the foreseeable future.

I think this Gna.org system administrator puts it better than anyone else ever could.

From what I read on their IRC channel, an upgrade from Debian lenny (oldstable) to squeeze (stable) went wrong while there was nobody around with physical access to the host to fix the problem and make it boot again. Why one would perform an operating system upgrade in such circumstances is beyond me, but I can certainly say the Wesnoth bug and patch trackers, and the Subversion repository won’t be available until that’s fixed.

I for one am glad to use git-svn.

UPDATE (2012-02-11): According to the admins, the machine didn’t power on again after the upgrade, so it’s not just a software issue. Any needed repairs will have to wait until Tuesday, February 14th.

Maintaining Wesnoth add-ons of the size of Invasion from the Unknown and After the Storm isn’t a small task by any means. Over the years, I have had to rely on user feedback to detect critical problems in a release, because testing becomes cumbersome and tedious as the scenario count increases.

My usual release procedure simply involves—at least since I acquired the habit of testing before releasing—running the game, starting each episode of the campaign with the medium difficulty level and making sure the WML preprocessor and parser don’t throw any warnings or errors. Before Wesnoth 1.9.x, the preprocessor didn’t abort when encountering a missing macro or file during a brace substitution, so I had to pay close attention to stderr to ensure nothing is wrong.

The WML preprocessor in Wesnoth 1.10 became more strict, aborting on the aforementioned situations. It was also exposed for command-line usage (for testing or debugging) through the -p or --preprocess switch, also explained in detail under PreprocessorRef in the wiki.

At first I thought that wasn’t very useful beyond diagnosing complicated preprocessor issues, but today I realized I can also do this:

This can be easily accomplished with a simple shell script (here embedded in the AtS Makefile). The only major shortcoming is that it doesn’t cover every possible problem because it’s merely running the WML preprocessor, which doesn’t consume and produce WML — all it sees is plain text mixed with some preprocessor directives. The task of reading actual WML (which is potentially found in the preprocessor’s output) is left to the WML parser proper, which creates internal objects in memory corresponding to the internal representation of WML handled by Wesnoth (config class objects).

UPDATE: After investigating the issue further with timotei (who exposed this functionality through --preprocess in the first place), it turns out the preprocessor output with --preprocess is indeed parsed — the real problem is that the preprocessor and parser use different logging facilities, and the former doesn’t even throw errors directly, so a preprocessor-only failure will make the game exit successfully (exit status of zero), while a parser error (potentially induced by a previous preprocessor error) causes a more appropriate non-zero exit status. This and other jarring inconsistencies make add-on test automation rather difficult, to say the least, so things have been simplified in the Makefile as a result.

It would be nice to be able to run the parser unit on the --preprocess output to detect syntax issues like missing end tags or unterminated string literals in the future, as part of a fully automated test suite. For now, it seems I’ll have to stick to my primitive and inelegant manual method before making new AtS releases, plus the unbelievably clumsy wmllint.