Oh hi there. Long time no see. Apparently I haven’t posted since February 2017, huh. A lot of things have happened in the meantime, it turns out. Some of those things are to blame for my general inactivity elsewhere, but when it comes to this blog I just can’t seem to come up with anything to say worthy of my trademark text walls, at least not ever since I joined Twitter several years ago— wait, wasn’t that in 2010? Time sure flies. I feel old. Okay, let’s face it, I am old.
In addition to it having been a while since my last post in here, it has also been a while since the last time I gave the website an overhaul, for what little use it sees nowadays. Because of that, plus some of my experiences designing the new website theme for The Battle for Wesnoth last year, I decided to try to modernize my own a little bit so it looks more in tune with my current practices. I also decided to spruce things up with a new colour scheme, like last time, taking things in a different direction to what I’m used to.
An attentive reader who’s been around for long enough might be able to tell that the “Iris” design last year did undergo a slight revision incorporating Font Awesome in order to make icons not look awful on high-DPI screens. This was a natural conclusion of my work designing and testing the Wesnoth.org theme on devices with higher pixel density. Plus it was precisely last year that I actually caved in and got a smartphone given to me by a relative, further highlighting all the inconveniences of designing things on/for 96 DPI these days. Other than that, though, the design remained mostly unchanged from what I made in 2014.
“Iris” version 1.2.0, aptly codenamed Amethyst for reasons that should be blatantly obvious, is mostly the same as before under the hood, but on the surface it hopefully looks shinier and more elegant and modern. Even though I am not using the site much right now like I mentioned above, I have a faint hope that the new look will motivate me to post more again.
Since there wasn’t a New Year post last year, or even the year before that, or uh... the year before that as well... actually I guess there haven’t been New Year posts in here since January 1st 2013. Oops. Anyway, I guess it’s time for a short summary of what I have been up to in recent times. Let’s see...
Nearly 11 years ago, I was checking out some of the free and open-source games included with the openSUSE distribution when I came across a fantasy turn-based strategy game called Wesnoth. I vaguely remember taking a quick look at it and dismissing it for some reason. It wasn’t until an OS update later the same year that I would actually give version 0.9.5 a proper try. Immediately upon doing so, I was enthralled by the game’s sheer quality and its surprisingly accessible gameplay.
There is nothing noteworthy about AtS 0.9.16 whatsoever, but IftU 1.99.0 constitutes the first public codename Reconstruction release after several years of work. That is, not counting this year’s April 1st release (which apparently everyone simply assumed to be a hoax instead of actually downloading it from the trunk add-ons server).
I’m cutting this post short since — as should be painfully evident — I don’t really feel motivated to update this blog nowadays. Still, the announcement over at the Wesnoth forums has some more details about this first IftU 1.99.x/2.0 RC series release that are worth checking out if you are planning on installing or updating to this new version.
Due to circumstances, it has been quite a while, and honestly I lost track of what this release was supposed to have besides a thing that requires another thing from another campaign that has not been completed or released yet. So let’s talk about what AtS 0.9.10 actually has.
Firstly, the minimum Wesnoth version requirement now is 1.11.11.
That’s right. Previous versions (including 1.10.x) are no longer supported. Ever since I moved to 1.11.x following the release of AtS 0.9.0, maintaining support for previous versions (including buggy development releases) required a series of unwieldy kludges that made the code uglier and harder to maintain and were, for the most part, untested beyond the classic “does it compile?” test. With all those bits gone, it will be easier to improve and optimize some aspects of the campaign, as well as work on the thing that requires the other thing I alluded to above.
For now, the first one such aspect I have worked on is converting several units to the 1.11.x animation WML syntax. Although some other people seem to prefer the new syntax over everything, I have chosen a more pragmatic approach for this campaign, so the set of units that I’ve converted in this release is rather limited. Hopefully more will follow soon, but I’m certain that there are a few for which the change hurts code readability. Plus, since most of my units are headbutters, the code size gains are marginal in the average case.
Finally, somebody reported to me of an issue with the player’s recall list and gold being discarded during certain key scenario transitions. It turns out this resulted from a change in Wesnoth 1.11.13 purportedly intended as a bug fix for MP campaigns. I was aware of the change and its implications at the time 1.11.13 was released, but I wrongly assumed AtS would not be impacted because I failed to take a tiny detail into account. Exactly three months later, I realized the sheer gravity of my mistake — but fortunately, it seems nobody else played AtS on 1.11.13+ in the meantime. (Thanks to RainerT for the report. This would have gone unnoticed for who knows how many more years months otherwise.)
As you can see, there is not a lot to talk about in this release other than the version requirement change. Since it’ll be a while before Wesnoth 1.12.0 is released, and AtS remains largely the same as it was the last time I posted in this topic, I believe stable version purists won’t be missing out on anything for now — at least not until the thing is done.
Also due to circumstances, this release is largely untested, so I would not be surprised if I accidentally broke a thing or two since 0.9.9.
The complete changelog for this version follows:
* Raised minimum game version requirement to 1.11.11. All existing
compatibility code for previous versions has been removed.
* New or updated unit graphics: Sprite, Fire Faerie, Forest Spirit, Dryad,
* Added an option to certain scenarios to ensure Wesnoth does not discard
the player's gold and recall list under certain circumstances due to a
behavior change in version 1.11.13 and later. Affected scenarios:
* E1S9.3 - The Triad, part 3
* E1S11 - Return to Wesmere, part 2
* E2S0 - Transience
* E2S11 - A Final Confrontation
* E3S0 - Opening (Within)
* E3S6 - Divergence
* E3S8B - Destiny, part 1
* E3S11 - After the Storm
* Balancing changes:
* Changed Leech's alignment from 'lawful' to 'neutral'.
* Decreased Leech's HP from 62 to 42.
* Decreased Leech's melee damage from 11-2 to 9-2.
* Decreased Leech's unit level from 3 to 1.
* Converted to the simplified 1.12 animation syntax:
* Dusk Faerie, Night Nymph, Nightshade Fire
* Sylvan Warden
* Sprite, Fire Faerie, Dryad, Forest Spirit
* Elvish Wayfarer
* Faerie Avatar
* Demoness Hellbent Tide
* Verlissh Control Spire
* User interface:
* Cutscene themes now use the 1.11.10 [theme] id attribute on 1.11.10 and
For very long, there have been only two (2) campaigns in the Wesnoth add-ons server that follow the “shadowmcanon” established by Invasion from the Unknown and After the Storm; the campaigns in question are Invasion from the Unknown, and After the Storm. Yes. That’s it. The only other campaign whose author has consulted plot matters with me and followed the shadowmcanon correctly (as opposed to blindly extrapolating from IftU and AtS and making grossly wrong assumptions about things that are left unspecified or presented in a deliberately vague fashion) is The Silver Lands, but it was abandoned far too early during its development cycle.
But the status quo has just changed with the release of version 0.5.0 of Shadows of Deception (NX-RPG), a campaign by vultraz for Wesnoth 1.11.6 and later. So far, six scenarios out of the first set of 12 have been done; the goal is two episodes.
Of note is the fact that vultraz has been a member of my After the Storm internal playtesting and prose reviewing team for a couple of years.
Per the description found in the campaign’s forum thread, Shadows of Deception (SoD for short) is “a half-RPG, half regular style Wesnoth campaign, incorporating several custom gameplay elements as well as your typical battle scenarios”. What does half-RPG mean? Damn if I know — I don't even know what a full RPG would be. Having playtested SoD prior to the release myself, though, I can say that the campaign places a fair amount of emphasis on the story while experimenting with some unusual gameplay mechanics.
Well, the cat’s out of the bag already. Not that I really intended to keep the plan under wraps for very long in the first place—perhaps I should have done that—but I already implied, and then confirmed that this is a thing that is taking place.
After years and years of development, drama, script rewrites, field research, technological advancements, budget cuts, and temporal shenanigans, today, March 5th 2013, I can say for sure that After the Storm is complete with the release of the most important milestone yet: version 0.9.0, with all three episodes completed with 13 scenarios each.
A few caveats for people upgrading from the previous release:
This release adds the final Epilogue scenario for Episode III, which will become a bonus feature in 0.9.1. If you had previously finished AtS Episode III using versions 0.8.90 or 0.8.90.1, you will have a start-of-scenario save for the Epilogue scenario which you can use after upgrading to this version.
As usual, for the most stable experience I advise using Wesnoth 1.10.x — preferably 1.10.5 or a newer version when it becomes available. All episodes of this campaign were primarily developed and tested on 1.10.x, and there are subtle behavioral differences in the game engine between 1.10.x and 1.11.x that may break some sequences or cause other unintended side-effects.
Various issues reported by playtesters on Wesnoth 1.11.1 were fixed. Most notably, it implements a workaround measure for mainline bug #20373, which is relevant for Episode III scenarios starting from Dark Sea. People who experienced player information loss (recall and recruit lists, gold reserves) after Dark Sea on 1.11.1 will need to replay that scenario from the start-of-scenario save (NOT the Turn 1 save!) in order for Wesnoth to install the code in charge of solving that issue in later scenarios. This code will not work on Wesnoth 1.11.2 — you will need to finish Episode III on 1.11.1 before switching to 1.11.2 (whenever it is released, anyway).
This... has been a really long journey, to say the least, and I pretty much lost all hope of ever finishing this campaign at various points over past years. Development started in 2008 and quickly stagnated for various reasons:
Perceived lack/loss of interest from the audience
Excessive perfectionism on my part
Various IRL struggles, including health and personal matters
Constant conflicts of interest amongst the few people who were actually interested in IftU and AtS’ development
Mainline development tasks taking up my spare time
Wesnoth.org forums moderation and administration taking up my spare time
To say that I was overjoyed when the Big Mergetook place just a couple of weeks ago would be a big understatement. This campaign became for me more than just another Wesnoth campaign as time passed — it became a part of me I thought I had left behind when IftU was first completed, a testament to my chronic failure to drive my own projects to completion.
After the Storm changed a lot since it was originally conceived in 2008. The original draft was both over-pretentious and subpar, and it was not what I wanted to create after IftU. I wanted to create something better than IftU, but I locked myself in a trap by relying on source material that was already broken by design. Making a better sequel became my obsession, and that obsession led to AtS’ stagnation during the development of Episode I.
But some time mid-2011, I finally saw that trying to achieve perfection was a flawed goal in its own right. What I should have been aiming for all along was to make something fun, something from which I could learn, something I would enjoy to play and create. It was that realization that finally led me to complete Episode I, and the rest was a blaze; a blaze that culminates with this release, today.
The final product is neither perfect nor it aims to be such. I do not think this campaign is for everyone, seeing as how the gameplay and plot are very tightly knit together, and the overall scenario count goes up to 39 without taking cutscenes, segmented scenarios, and bifurcation into account; however, unlike IftU, every episode is a separate campaign in its own right, and I believe that makes the overall experience more enjoyable and less chaotic, balancing-wise.
When I first wrote IftU, my grasp of the English language was as poor as my handle of storytelling in general was, to say the least. This also applies to AtS Episode I up to scenario 9, part 2 — which became the turning point for the campaign’s development when I finally chose to renounce perfectionism and embrace the fun in creation. But I digress. AtS’ prose is all my own output with minor amendments from my playtesters and proofreaders, and an experiment in style wherein I take breaks from mainline conventions on purpose, in a subtle and calculated manner. Attentive players may be able to point out those inflection points from just paying attention at the characters and their interactions — characters whose flaws and mistakes are not as detached from reality as the game’s fantasy setting or the subtext-based delivery may suggest.
The three-episodes structure was mostly an afterthought. AtS episode III became an amalgamation of a previous planned AtS sequel and an aborted IftU prequel. But this structure fits the narrative better than the original plan. Episode I establishes the setting and motivations for the protagonists, and provides more hints about the overarching plot than IftU did; Episode II gradually develops further on the characters’ inner struggles while providing entertaining gameplay and dropping even more hints about the grand scheme; and finally, on Episode III things go off the rails in pretty much every way possible—including gameplay—and the plot reaches its final resolution within the scope originally intended for AtS.
Reception and expectations
Some people will be unable to find or interpret the hints and may see the finale as an out-of-the-blue succession of events, all because I avoided indulging in long and heavy exposition sequences that leave nothing to the player’s imagination and reading skills. I am perfectly aware that this is an inevitability, because it is absolutely impossible to please everyone, as I have learned from my experience with activities otherwise wholly orthogonal to the storytelling field. I think some UMC authors should really keep this in mind whenever they feel tempted to abandon their efforts just because a vocal segment of their players doesn’t like their output.
Other people will not like AtS because “it’s not like IftU”. Perfectionism aside, it is impossible for it to be like IftU after all that I have learned in the meantime about storytelling, life, people, and myself. The circumstances under which IftU was created were entirely unique and I would have to trade many things which I have gained or lost since then in order to create another IftU — and I would not be pleased by the result in the end.
I think AtS works just fine as an IftU sequel, and a sequel does not have to fully embrace the spirit of the original to be such. It’s not like AtS isn’t littered with callbacks to IftU in direct and meta levels anyway. There are a lot of things in it to enjoy, and a lot of things to hate — and both are part of the plan!
But in the end, all that matters to me is that I like the finished product, had fun making it, and learned lots of things along the road.
For those who might think that AtS’ finale is a definitive conclusion to the involved characters’ respective arcs: no, it is not — but I allotted a specific amount of time and scenarios for telling their origin stories, and the campaign had to end at some point. Is there enough material for sequels? Hell, yes, but I don’t see myself making another Wesnoth campaign given all the technical and non-technical limitations imposed by the platform. The three ultimate protagonists have a whole journey ahead of them (as well as more characters to meet), and I would like to explore that in some other medium in the future. For fellow Wesnoth UMC authors, though, there is plenty of material left to work with if you pay attention to every single minor detail.
Of course, I am open to questions about everything you may want to know about the campaign, be it via forum PM, or posts in the campaign’s development topic. But I would appreciate it if people didn’t post topics for every single thing in Writers’ Forum — when that happens, odds are I will just ignore those topics in their entirety and not take the effort seriously. As a matter of principle, if you want to ask a campaign author about their work, you ask them directly through their official communication channels instead of walking to the closest park holding a massive sign in your hand.
With AtS 0.9.0 released, all I have left to do is to take care of fine-tuning scenario and unit balance, fixing any remaining prose issues (especially those annoying unit type descriptions for the in-game help system), dealing with missing/placeholder/subpar pixel art, and somehow find a portrait artist willing to work under my specific terms. The latter part will probably take ages, so don’t hold your breath waiting for AtS 1.0.0.
I will be forever grateful to the people (and pets) who helped me along this arduous and extended quest, even those who did so unwittingly — if you are reading this, odds are that you know who you are.
To conclude this post, the changelog for this version follows:
* Milestone: all scenarios completed.
* Deployed code to work around a side-switching issue affecting Wesnoth
1.11.1 during post-Divergence (E3S6) scenarios. The corresponding
mainline bug is #20373 and it is fixed on 1.11.2.
* Fixed various "wesnoth.get_side is deprecated, use wesnoth.sides instead"
warnings on 1.11.x.
* Minor story text grammar, style, and punctuation amendments.
* E1S6 - Quenoth Isle (Elves of a Different Land):
Well, here is another teaser in the form of a more concrete roadmap for AtS 0.9.0’s development:
Development diverged around the release of version 0.8.3 resulting in only bug-fixes and minor features landing in Wesnoth-UMC.-Dev trunk, which is where AtS’ releases come from. During all this time, I have been (mostly) silently working on the final set of scenarios (E3S7A onwards) in a separate ‘branch’ of sorts, with occasional code and other assets landing in trunk to ease the upcoming Big Merge work that will take place “soon”.
And by “soon”, this time I really mean it.
This development model may have given some people the impression that I stopped working on AtS altogether, but this was never the case. IftU and AtS have historically been solo projects, and I have dedicated a lot of time to programming, creating original artwork, and writing prose for both campaigns. AtS has been a more demanding energy sink because of the different standards compared to IftU, and Episode III has been even more demanding than Episode II was in every possible sense.
However, it is finally starting to pay off as I’m about to complete the last scenario of the sequence referred to in the chart above as Finale C, which is pretty much the end of the After the Storm proper. Once that is done, I will go back to some of the previous unreleased scenarios to deal with various rough edges in programming, balancing, and prose, and then perform the Big Merge on trunk, leading to the 0.8.90 release (also known as 0.9.0 Release Candidate 1). Whether this release will be public or just limited to whoever expresses interest in playtesting it is something I have yet to decide.
Since at this point all the artwork for Finale C is done and most of the programming components in place, I expect the Big Merge to take place around the end of the month. No promises on when 0.8.90 will be announced, though, nor to whom it will be announced.
After that I’m facing the challenge of writing the combined epilogue for both campaigns, which is a whole different can of worms because of some architectural restrictions in Wesnoth’s design that I need to overcome, somehow. While I am already know how the epilogue flows in advance, making it not look like shit could well be an unprecedented feat.
Once the epilogue is done, After the Storm 0.9.0 will be released. Theoretically, this should not take too long, but we shall see.
To recap, I am literally one scenario away from the epilogue, and this campaign is definitely not abandoned.
Also, if there are any campaign authors out there making assumptions about the AtS E3 plot progression, you should probably be prepared to either revise them or stick to your own alternate-universe continuity theories or whatever floats your boat.
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.
I think I rarely discuss the more subjective/emotional aspects of working with the crazy folks at the Battle for Wesnoth Project, so this might be a good opportunity to do so given we are currently on the threshold of the first release in the new stable series, 1.10.
Since a while after joining the project, I’ve been wanting to make deeper changes to the add-ons server software (campaignd, by legacy). Some of those desired changes would benefit me directly as a user-made add-ons maintainer myself (previously Invasion from the Unknown, now After the Storm); other changes simply seem very convenient to have, such as some kind of authentication support and the ability to ban people without dirty system admin hacks.
Yesterday, I unveiled aspects of my not-so-modest proposal to replace campaignd with new code. You can find the pastebin link within my post to the developers mailing list.
Even though I have some of the basic ideas and I’m still collecting previous information (such as Mordante’s proposal), I am terribly hesitant to proceed with the larger project because it will take time and dedication I cannot really promise at this point. But why?