Wesnoth-UMC-Dev Project News http://wesnoth-umc-dev.ai0867.net/ Wesnoth-UMC-Dev news aggregator feed en-us After the Storm 0.9.9 http://shadowm.ai0867.net/blog/archives/287-After-the-Storm-0.9.9.html Version 0.9.9 is out, just in time for the holidays!

Since I have tested and developed this campaign primarily on Wesnoth 1.11.x since the 0.9.0 release, this version promotes support for Wesnoth 1.11.8 to official status. Because most of the campaign makes use of 1.11.x-specific features (both from me and other mainline developers) when available, it is quite possible that I will entirely drop support for Wesnoth 1.10.x in a future release even before the first Wesnoth 1.12 beta arrives. I still intend to make sure certain additions and changes for episodes II and III land before the last AtS version supporting 1.10.x, if time permits.

This 0.9.9 release primarily deals with prose corrections and improvements, and various other ‘cosmetic’ changes. There are also various fixes for some instances of dysfunctional AI recruitment on Wesnoth 1.11.7 and 1.11.8 resulting from the recruitment_save_gold aspect being enabled by default in those versions (but not 1.11.9 and later).

There isn’t much in terms of new graphics since the prose and code changes (plus some mainline stuff) have kept me far too busy to do much more than some doodles. On the other hand, this release contains various animation fixes and improvements to the Aragwaithi units ported from Era of Chaos. There are also a handful of balancing changes affecting both Aragwaith and non-Aragwaith units.

Also featuring in this release are a number of WML optimizations intended to reduce campaign load times — especially on 1.10.x, which has a slightly slower tokenizer implementation than 1.11.x. Since the affected bits of code have been completely rewritten in Lua, it is possible that I accidentally introduced new bugs in the process that I may have missed during my playthrough, extensive as it was.

There is also a new secret feature that is not mentioned in the changelog. What is it, you ask? Well, if I told you, that would ruin the surprise. Think of it as a Christmas present!

Finally, from this release onwards, After the Storm is no longer part of the Wesnoth-UMC-Dev Project, and will be hosted on GitHub instead. Ever since development of the campaign started, Wesnoth-UMC-Dev provided SVN repository hosting for both After the Storm and Invasion from the Unknown, but over time that has proved to be an inefficient solution due to technical and organizational concerns. Although the conversion process was not easy in the least, I believe that this move will make things easier for me in the long-term, since I had been using git-svn to work on IftU and AtS since late 2008 anyway.

Release tarballs will continue to be hosted by Wesnoth-UMC-Dev for the time being, until I decide to phase them out entirely in favor of GitHub’s Releases page. If anyone is using them because they cannot normally download AtS or AtS_Music from the wesnoth.org add-ons server, I’d appreciate it if you let me know so I can make a more informed decision in the future (or point you to add-ons.wesnoth.org, that works too). For the time being, the tarball compression format has changed from Bzip2 (.tar.bz2) to xz (.tar.xz).

Special thanks to vultraz and 8680 for their proofreading assistance, without which this release would be about 1% less awesome. Also thanks to the current and past Wesnoth-UMC-Dev admins, AI/AI0867 and Espreon, for their continued support all these years — IftU and AtS simply wouldn’t be the same without Wesnoth-UMC-Dev.

The complete changelog for this version follows:

Version 0.9.9:
* General:
  * Removed Wesnoth development versions warning from the campaign menu entries
    as support for 1.11.8 and later is now mature.
  * New complete algorithm for calculating the relative direction between two
    hex grid locations, handling all six intrinsic facing directions instead
    of only SW and SE.
  * Updated Aragwaith faction from Era of Chaos 1.3.1+dev up to commit
  * Stripped optional whitespace from terrain map and mask files, decreasing
    uncompressed directory size by about 62%.

* Graphics:
  * New or updated unit graphics: Blood Core, multiple Aragwaith units, Demon
  * Assigned a more dignified generic portrait to Cron (1.11.x only).

* Music and sound effects:
  * Mitigated [fade_out_music] causing a portion of the previous track to be
    heard at full volume at the end of the fade-out sequence. It still won't
    help in all cases.

* Scenarios:
  * Fixed additional bugs with hero ellipses on Wesnoth 1.11.6 and later
    affecting Anya on every scenario and Durvan on scenario E3S7B and later.
  * Use STARTING_VILLAGES_ALL instead of STARTING_VILLAGES with large numbers
    to assign all villages to sides.
  * Skip inclusion of death events for characters that are not present during
    the first few scenarios of E1.
  * E1S3 - Civil War in the North:
    * Fixed the first defined on-map unit (usually Galas) becoming permanently
    * Minor prose tweaks.
  * E1S4 - Terror at Dusk:
    * Balancing changes to make the scenario easier on Wesnoth 1.11.7 and
      later, possibly connected to the new AI recruitment gold saving aspect
      introduced in Wesnoth 1.11.7 and enabled by default.
    * Minor prose tweaks.
  * E1S5 - Bay of Tirigaz:
    * Made it so Mal Keshar speaks for bat units when investigating shipwrecks.
    * Minor map tweaks.
    * Minor prose tweaks.
  * E1S6.1 - Quenoth Isle:
    * Fixed Elynia's ellipse reverting to a generic unit ellipse on 1.11.x
      during the faerie fire cutscene.
    * Not-so-minor prose tweaks.
  * E1S6.2 - Elves of a Different Land:
    * Not-so-minor prose tweaks.
    * Extended map for large screens.
  * E1S7 - The Search for the Past:
    * Improved ending cutscene transition.
    * Minor AI adjustments to make the undead minions recruit correctly on
      Wesnoth 1.11.7 and later.
    * Not-so-minor prose tweaks.
  * E1S7x - Resolutions:
    * Minor map tweaks.
    * Not-so-minor prose tweaks.
  * E1S8 - Fear:
    * Not-so-minor prose tweaks.
  * E1S9.1, E1S9.2, E1S9.3 - The Triad:
    * Not-so-minor prose tweaks.
    * Various cutscene improvements and changes.
  * E1S10 - Tears:
    * Minor prose tweaks.
  * E1S11.1 - Return to Wesmere, part 1:
    * Not-so-minor prose tweaks.
  * E1S11.2 - Return to Wesmere, part 2:
    * Fixed story text not appearing because of a missing macro inclusion
      (long-standing bug that's existed ever since the scenario was first
    * Minor map tweaks.
    * Minor prose tweaks.
  * E1S12 - The Queen:
    * Balancing changes.
    * Excluded time area for the E1S11.2 starting area on Wesnoth 1.11.7 and
      earlier (including 1.10.x) due to a bug with time area ids not being
      saved, resulting in a time area with local lighting that interfers with a
      cutscene sequence after reloading from a non-start-of-scenario save.
    * Fixed long-standing offset-by-one bug with a terrain mask applied near
      the end.
    * Minor map tweaks.
    * Not-so-minor prose tweaks.
    * Various cutscene improvements and changes.
  * E1S13 - Death and Rebirth:
    * Minor cutscene improvements and changes.
  * E2S1 - By the Moonlight:
    * Minor AI adjustments for Wesnoth 1.11.7 and later.
    * Not-so-minor prose tweaks.
    * Now the scenario lives up to its name.
  * E2S2 - The Heart Forest:
    * Fixed fog not being cleared correctly when Allyna first appears.
    * Made it so Allyna introduces herself once three of the five bandits have
      been killed rather than all of them.
    * Minor AI adjustments for Wesnoth 1.11.7 and later.
    * Minor prose tweaks.
  * E2S3.1 - Unrest in Raelthyn:
    * Minor prose tweaks.
  * E2S3.2 - Revelations:
    * Minor prose tweaks.
  * E2S4 - Shifting Allegiances:
    * Minor prose tweaks.
  * E2S5 - The Eastern Front:
    * Minor prose tweaks.
  * E2S6 - The Voyage Home:
    * Not-so-minor prose tweaks.
  * E2S7 - The Voyage Home:
    * Minor prose tweaks.
  * E2S8 - And then there was Chaos:
    * Minor AI adjustments for Wesnoth 1.11.7 and later.
    * Not-so-minor prose tweaks.
  * E2S9 - New Hive:
    * Minor prose tweaks.
  * E2S10 - The Betrayal:
    * Minor prose tweaks.
  * E2S11 - A Final Confrontation:
    * Maybe-minor prose tweaks.
    * Minor cutscene tweaks and improvements.
  * E2S12 - Fate:
    * Minor cutscene tweaks and improvements.
  * E3S0 - Opening (Within):
    * Minor cutscene tweaks and improvements.
  * E3S1 - Beyond her Smile (A Light in the Darkness):
    * Minor map tweaks.
    * Various cutscene improvements and changes.
  * E3S2.1 - Return to Raelthyn:
    * Minor map tweaks.
    * Increased initial gold supply for the second human player side.
  * E3S2.2 - Reckoning:
    * Minor prose tweaks.
  * E3S3 - Amidst the Ruins of Glamdrol:
    * Minor prose tweaks.
  * E3S4.1 - Outpost of Hell:
    * Minor prose tweaks.
  * E3S4.2 - Gateway:
    * Minor prose tweaks.
  * E3S5 - Pass of Sorrows:
    * Minor map tweaks.
    * Minor prose tweaks.
    * Minor ending cutscene improvements.
  * E3S6 - Divergence:
    * Minor prose tweaks.
  * E3S7A - Dark Fire:
    * Prevent crashing Wesnoth 1.11.8 due to a missing initial time of day
      (part 1 only).
    * Minor AI adjustments for Wesnoth 1.11.7 and later.
    * Minor map tweaks.
    * Minor prose tweaks.
  * E3S7B - Dark Sea:
    * Minor AI adjustments for Wesnoth 1.11.7 and later.
    * Minor prose tweaks.
  * E3S8A - Interim:
    * Prevent crashing Wesnoth 1.11.8 due to a missing initial time of day.
    * Minor cutscene improvements nobody could possibly notice.
    * Minor prose tweaks.
  * E3S8B - Destiny, part 1:
    * Minor aesthetic changes nobody could possibly notice.
    * Fixed parts of the map being unintentionally uncovered upon entering
      Hemérilyel's chamber.
    * Made Hemérilyel more aggressive towards the player on Wesnoth 1.11.2 and
  * E3S8C - Breakdown:
    * Minor AI adjustments for Wesnoth 1.11.7 and later.
    * Minor prose tweaks.
  * E3S8D - Destiny, part 2:
    * Minor prose tweaks.
  * E3S9 - Dark Depths:
    * Minor prose tweaks.
  * E3S10 - Blood:
    * Minor prose tweaks.
  * E3S11 - After the Storm:
    * Minor prose tweaks.
  * E3S12 - Destiny, part 3:
    * Minor prose tweaks.
  * E3S13 - Epilogue:
    * Minor prose tweaks.

* Units:
  * Balancing changes:
    * Imps are now immune to the plague weapon special.
    * The Protection ability affects own units of any lower level again instead
      of only level 0 and 1.
      * Affected units: Demoness Hellbent Tide, Aragwaith Shield Guard,
        Aragwaith Ancient Banner.
    * Physical endurance no longer resets statuses (poisoned, slowed, etc.).
    * Decreased Lumeril Glyph Mistress' arcane damage resistance from -10% to
    * Decreased Fallen Faerie's cold ranged attack strength from 11-3 to 10-3.
  * New or improved unit animations: Verlissh Matrix Core, Shaxthal Custodian
    Drone, Shaxthal Queen, Verlissh Matrix Flow System, Verlissh Control Spire,
    multiple Aragwaith units, Dusk Faerie line.
  * Made it so the Falcon unit type and the lightfly movetype are only defined
    if the mainline Khalifate faction is not present, by testing the existence
    of core/units/khalifate/Falcon.cfg.
  * Fixed a minor inaccuracy at the beginning of the Terror ability
  * The spawn controller code (used e.g. in Shaxthal hives) has been completely
    rewritten in Lua. No behavior changes expected.

Merry Christmas/Happy Holidays, everyone!

Sat, 25 Jan 14 06:11:00 +0100
May I have a slice of Wesnoth-UMC-Dev, please? (Part III) http://shadowm.ai0867.net/blog/archives/286-May-I-have-a-slice-of-Wesnoth-UMC-Dev,-please-Part-III.html (Previous installments: Part IPart II)

After my successful extraction of the kate-wml-syntax portion of Wesnoth-UMC-Dev, the next goal obviously had to be just a little more complicated than that. Between Invasion from the Unknown and After the Storm, AtS has a relatively simple VCS and meta-history spanning only one main branch and one short-lived branch, as well as a number of tags based only on the main branch.

In reality, a tool called reposurgeon ought to be the most optimal for performing this task correctly and elegantly, but I have my reasons to avoid it. Nevertheless, if you need to convert your own SVN repositories to Git, it is probably what you should be checking out instead of these blog posts. I’m here to do things my own way and learn while at it; the git svn portion of this procedure is very boring and nothing out of the ordinary, but git filter-branch is a handy power tool that comes bundled with Git and which may prove useful to me for non-conversion tasks as well, and in fact, it already has done so. It’s worth noting that being a power tool, you do not want to put a clueless simpleton in charge of applying it on your repository; then again, if its documentation is anything to go by, reposurgeon is not much better in that regard. All this is probably for the best.

(I’m also taking this opportunity to express my absolute befuddlement at Git’s liberal git push -f implementation, presumably a consequence of Git being originally designed for the Linux kernel’s mail-based workflow. While git push -f can be useful under very specific circumstances, I have heard and seen people use it as a Git panacea without realizing the consequences.)


I already described the git svn step in broad terms in Part II of this series, so I am not going to go into details here. The fun part continues to be the git filter-branch (repository rewrite) operation, although this time we also need to deal with SVN tag branches.

As I had the perform the After the Storm repository rewrite multiple times on a remote server before I realized my desktop box’s superior disk I/O and tmpfs configuration and lack of console lag resulting from a slow SSH link would be a considerable advantage, I wrote a few scripts to help me throughout the whole procedure. I made several highly risky and specific concessions aimed solely at dealing with my particular use case, though, so I can’t possibly publish those scripts without either feeling ashamed of my subpar shell scripting skills or inadvertently allowing one of the aforementioned specimens to wreak havoc on somebody’s data, perhaps even their own! Either outcome would be regrettable.

Thus, I am providing a pseudocode outline of the rewrite procedure instead:

  1. For every tag branch BT:
    • Let its tip commit be HT.
    • Create a corresponding annotated tag T pointing to HT, with T’s authorship information matching HT’s (author and committer identification and timestamp).
      Due to how SVN tagging and branching works from git svn’s point of view, HT is an empty commit object that incurs in no tree changes. This is an important thing to keep in mind for the next step.
      • Because the original HT commit message is highly SVN-specific and not particularly useful (Tagging add-on 'After the Storm', release <VERSION> from trunk, using r<REV>), I opted for an automatic minimalistic tag message for T of the form After the Storm version <VERSION>, reminiscent of the AtS: version <VERSION> commits preceding the tag branching point.
    • Delete BT. HT is now only referenced in the repository by T.
  2. For every commit C:
    • Rewrite the git-svn-id metadata trail in the commit message so it reads e.g. [Wesnoth-UMC-Dev SVN r12345] and strip extra empty lines between paragraphs.
    • Delete the /music directory recursively if it appears in the commit’s tree.
    • Rewrite any tag objects pointing to C while keeping any other attributes intact.
      git filter-branch does not do this by default for some reason, so you may end up with tags pointing to dangling objects otherwise.
    • If C is empty (no tree changes) after the previous steps, delete it.
      From point 1, this results in every HT commit being erased, and T being rewritten to point to HT’s immediate ancestor, which is in an ideal SVN repository part of the origin branch and not the short tag branch.
  3. Run git fsck to check that the repository isn’t broken at the end.

Converting tags

Part 1 was done through a “simple” sequence that extracts the needed information from every tag branch. At the risk of making myself eligible for the questionable classification from the start of this post, the code I used for this was:

tagproject="After the Storm"

git for-each-ref --format='%(refname)' refs/heads/tags | cut -d / -f 4 | (
	while read ref; do
		set -- `git log -n 1 --format="format:%ct %at" refs/heads/tags/$ref`
		export GIT_COMMITTER_DATE="$1 +0000"
		export GIT_AUTHOR_DATE="$2 +0000"

		set -- `git log -n 1 --format="format:%ae %an" refs/heads/tags/$ref`
		export GIT_AUTHOR_EMAIL="$1"; shift
		export GIT_AUTHOR_NAME="$*"

		set -- `git log -n 1 --format="format:%ce %cn" refs/heads/tags/$ref`
		export GIT_COMMITTER_EMAIL="$1"; shift
		export GIT_COMMITTER_NAME="$*"

		git tag -a "$ref" -m "$tagproject version $ref" "refs/heads/tags/$ref";


		git branch -D "tags/$ref" > /dev/null

The most glaring issues with this code are that it invokes git log multiple times for each commit (which could be solved if I were writing this pipeline for general usage, which I am not), and it does not take into account author/commit timezones; but it does not do so because git svn does not either! Subversion normalizes dates to UTC, so git svn cannot possibly know the original timezones used. Ideally, one would use git filter-branch to rewrite these commits on part 2 (or even before, in fact) to convert their timestamps to local ones with a timezone offset attached, but determining the offsets to use involves knowing the authors/committers’ locations around the globe and any local daylight saving time regulations that may come into play depending on the local date and time. For a repository that has more than one committer or author, this is just pointless pedantry bordering on pathological perfectionism. I have a whole history with the latter and After the Storm which I would rather not repeat with something as mundane and short-lived as a one-time Subversion-to-Git conversion. Seriously.

Avoiding the kind of perfectionism that ruins lives is also the reason why I opted to leave commit messages intact save for the metadata trail instead of taking the opportunity to fix commits with long/inexistent summary lines, sloppy grammar/spelling/punctuation, commit messages consisting solely of a bullet list, and Kri’tan.

Rewriting commits and updating tags

Compared to the tag preparation part, the actual git filter-branch invocation is rather simple:

# Temporary dir on /tmp (a tmpfs mount) to trade disk access for RAM
gittmp=`mktemp -uqd --tmpdir gittmp.XXXXXXXXXX`

# Strip double blank lines and convert git-svn-id metadata trail
# to a more readable format (e.g. [Wesnoth-UMC-Dev SVN r99999]).
msgfilter="cat -s | sed -re 's/^git-svn-id.*@([0-9]+) .*\$/[Wesnoth-UMC-Dev SVN r\\1]/m'"

# Remove external music/ dir
indexfilter="git rm --cached --ignore-unmatch -q -r ./music/"

# Needed to rewrite tags to point to the rewritten commits

git filter-branch -d $gittmp --prune-empty --msg-filter "$msgfilter" --index-filter "$indexfilter" --tag-name-filter "$tagfilter" -- --all"

To be honest, disk I/O on my desktop machine is good enough (with a 7200 rpm HDD on a SATA III link) that asking git filter-branch to use a directory on a tmpfs mount doesn’t make a noticeable difference, but your mileage may definitely vary. AtS’ repository is not too large nor does it contain particularly a particularly large number of files. Moving the operation from a remote VPS to my desktop, on the other hand, did make the overall process about two times faster.

The --tag-name-filter "cat" part was actually recommended by both git filter-branch and its documentation, since otherwise tags are left untouched and stop making sense since they point to commits that have been rewritten and thus no longer have the original SHA1 hash or ancestry. The rest of the invocation is just pedestrian business involving git rm and standard Unix tools; it merits no explanation whatsoever.

Well, the recursive /music directory removal actually does require some justification. This Wesnoth add-on originally included a couple of large music track files (in Ogg Vorbis format) within it, thus they ended up as part of its SVN tree. Over time, however, this approach proved suboptimal both for me (uploading new versions of the add-on from a 3.5G mobile broadband link) and players, who had to download over 14 MiB or so every time instead of 7 MiB, the approximate base size of the add-on without music. Thus, at some point I deleted /music from the SVN tree in favor of a separate rarely-updated add-on, but its history remained there. Since converting to Git involves starting from a clean slate in a way, I decided I might as well delete a portion of history that’s no longer relevant or used and may take up a significant portion of the packed repository data... or it may not; it’s not the point, either way.


The end result is now available on GitHub, and it’ll become official once AtS version 0.9.9 is released.

It is worth mentioning that past a certain point, power tools like git filter-branch become an unfathomable corrupting force; if you spend too much time tweaking an invocation sequence and examining the results, this force seeps into your very soul and makes you do absolutely ridiculous things. It is no exaggeration when I say that such an outcome was but narrowly averted for my conversion of the AtS repository.

Anyway, the last SVN commit and the first native commit to the repository now look like this:

commit bbf8df680322ce585debb2b3068b446b87616371
Author: Ignacio R. Morelle <shadowm@xxxxxxxx>
Date:   Mon Nov 25 06:27:34 2013 -0300

    Add a Markdown README.md containing general info, replaces BUGS

commit 040ca5e81ef2a8851e331cfc5a4f59ae03d6bca2
Author: Ignacio R. Morelle <shadowm@xxxxxxxx>
Date:   Sat Nov 23 02:18:29 2013 +0000

    AtS E1S4: mismatched tense fix

    [Wesnoth-UMC-Dev SVN r19373]

I opted for not stripping the AtS: prefixes in past commit summaries (mostly those since 2011) used to identify Wesnoth-UMC-Dev projects. The reason is that I don’t really want to spend more time figuring out what words after the colon would then need to be excluded from capitalization aside from wesnoth-optipng. Laziness.

The whole of /music was excised from the repository history, resulting in an overall size decrease from 25 MiB to 17 MiB. Given the number of PNG file additions and recompressions (“wesnoth-optipng pass” commits) taking place in the past, as well as the existence of some shorter Ogg Vorbis files under /sounds, I do not think it’s feasible to shrink it any further without dropping additional relevant history. Again, the /music removal was purely for practical purposes.

I guess you could say that balancing out my perfectionism with my unrelenting pragmatism and laziness was key to accomplishing this task within a finite amount of time.

Next target: Invasion from the Unknown. Since it contains oddities like changing tag branches and an unusual layout for its first commit (revision 1), it’s probably not going to be as easy as AtS.

Mon, 25 Nov 13 23:30:00 +0100
Ultimate Random Maps entered the repository http://wesnoth-umc-dev.ai0867.net/umcreg/index.cgi Sun, 10 Nov 13 19:55:41 +0100 May I have a slice of Wesnoth-UMC-Dev, please? (Part II) http://shadowm.ai0867.net/blog/archives/279-May-I-have-a-slice-of-Wesnoth-UMC-Dev,-please-Part-II.html In the previous installment of this series, I explained three glaring issues making git svn’s output far from perfect for a permanent, one-way Subversion-to-Git conversion. Then, I proceeded to mention a first successful attempt to extract a portion of the Wesnoth-UMC-Dev SVN repository into a standalone Git repository, now available on GitHub.

This first attempt serves mostly as an incentive and proof-of-concept, and the Subversion subtree it uses is not actually too complicated. In fact, it spans just one directory with about 13 commits, lacking tags or branches:

But it does illustrate my first two points from the previous post quite neatly. For example, r7941 in the origin repository only sets or modifies SVN properties on files from that directory; it is a metadata-only commit that does not alter any actual file data. Just to drive the point home, as of this writing SourceForge.net’s Allura-based repository web interface fails to render the commit in a useful fashion, only displaying five changed files with empty diffs:

Unlike Allura’s repository viewer, the command-line Subversion client actually understands what’s going on and it can represent it more meaningfully:

shadowm@nanacore:~/src/wesnoth-umc-dev$ svn diff -c 7941
Property changes on: branches/wml-tools/katepart-syntax/AUTHORS
Added: svn:eol-style
   + native

Property changes on: branches/wml-tools/katepart-syntax/TODO
Added: svn:eol-style
   + native

Property changes on: branches/wml-tools/katepart-syntax/ChangeLog
Added: svn:eol-style
   + native

Property changes on: branches/wml-tools/katepart-syntax/COPYING
Added: svn:eol-style
   + native

Property changes on: branches/wml-tools/katepart-syntax/README
Added: svn:eol-style
   + native

As I mentioned before, git svn will simply produce an empty commit that does nothing:

shikadilord@ai0867:~/src/svn2git/kate-wml-syntax-A$ git show -p `git svn find-rev r7941`
commit 26b5aa621cf68c0fe16de0e325aa1366336981b8
Author: Espreon <username@hostname>
Date:   Thu Nov 18 23:11:49 2010 +0000

    katepart-syntax: Manually set some properties.
    git-svn-id: svn://svn.code.sf.net/p/wesnoth-umc-dev/code/branches/wml-tools/katepart-syntax@7941 87cc232e-6748-0410-ac04-a3fa75566414

In the commit message above you can also see an example of git svn’s SVN revision tracking metadata appended to the actual message extracted from the upstream repository.

The final output repository lacks this commit. For commits that do exist in it (example), the corresponding SVN revision numbers are included in a (hopefully) cleaner and less obstructive fashion for those looking at the full commit log:

wml-tools/katepart-syntax: Exempt most contexts from spellchecking

The default context still uses spellchecking, i.e. so "bar" is recognized as a
mistake in foo=bar; string contexts also continue to use spellchecking so
foo="bar", foo= _ "bar", {FOO "bar"}, {FOO ( _ "bar")} work as they should.

The oddball is {FOO bar}, because it seems to me that this is often going to
cause problems (e.g. {MODIFY_UNIT id=Lala canrecruit yes}).

Testing welcome.

[Wesnoth-UMC-Dev SVN r15057]

This is all decidedly experimental, and I might not necessarily adopt this commit message conversion format for the stated targets (IftU and AtS). But the question stands, how did I do this?

Inspiration and preparation

I mostly followed the steps described in this seven-steps guide to obtain an initial git-svn tree (kate-wml-syntax-A.git) and a bare Git repository lacking git-svn tracking objects (kate-wml-syntax-B.git). However, since one of the mission goals was to keep SVN references readable within the repository, I deliberately skipped the --no-metadata switch from the initial git svn invocation in step 2.

Finally, I cloned the resultant kate-wml-syntax-B.git into a third bare repository (kate-wml-syntax-C.git) using, you guessed it, git clone --bare.

Enter git filter-branch

The reason for cloning the B repository into C was to have the means to recover from mistakes in the final steps without having to go through the tedious git svn steps again. git filter-branch rewrites history, which is exactly what I wanted to do with the repository — except that I would only alter commit messages, no other contents.

After several attempts in which I kept rewriting commit messages in unintended ways or just failing to match and rewrite anything, I settled for the following arcane incantation:

git filter-branch --prune-empty --msg-filter "cat -s | sed -re 's/^git-svn-id.*@([0-9]+) .*\$/[Wesnoth-UMC-Dev SVN r\\1]/m'"
  1. Discard commits that become empty during the git filter-branch pass or where empty at the beginning (SVN metadata-only commits from git svn).
  2. Coalesce consecutive blank lines in every commit message, using cat -s.
  3. Convert git-svn-id metadata lines to [Wesnoth-UMC-Dev SVN r99999] using sed.

Finally, the result was pushed to GitHub from the C repository.

What now?

Now we go back to the issues with the limited scope of the experiment. There are more obstacles along the way which I haven’t even tried to tackle yet. This small slice provided me with a relatively small testing ground for git filter-branch, but the IftU and AtS slice have additional requirements:

  • Tags, some of which have actually been modified in SVN a few times, either by accident, or intentionally by some jackass who did not know any better at the time.
  • Branches, in IftU’s case, and a single branch in AtS’ case. master does not count.
  • Weighty detritus resulting from some poor development practices in both cases — in particular, music track (Ogg Vorbis) files in AtS’ history that are not really useful or interesting, and which have not been present in the working tree ever since music files were split to a separate add-on of their own.
  • Far longer commit history (2591/3002 commits on AtS trunk, 1918/2407 commits on IftU trunk), which ideally should be examined at the end of the procedure in order to ensure diff coherence relative to the SVN changesets involved.

Of course, since I have many other things to do at this time, I don’t know exactly when I’ll resume this endeavor and figure out the solutions to these problems.

Tue, 20 Aug 13 06:05:00 +0200
May I have a slice of Wesnoth-UMC-Dev, please? (Part I) http://shadowm.ai0867.net/blog/archives/278-May-I-have-a-slice-of-Wesnoth-UMC-Dev,-please-Part-I.html timotei has repeatedly complained about the shortage of technical posts in this blog ever since I became a creative person again, so here is a half-baked record of a thing I am doing.

SourceForge.net became one of the most popular VCS hosting solutions for open-source software back when platforms like GitHub and Bitbucket didn’t exist or weren’t very popular. See, there was a time when people thought Subversion was the best thing since sliced bread— er, I mean, CVS. Yes, the best thing since CVS, a thing that—thankfully—I never had a chance to use.

For anyone who has done anything more advanced with the official Subversion client or used the various APIs available for Python and Perl applications, however, Subversion is a unique kind of software that should inspire university professors to teach courses exclusively dedicated to analyzing the wonderful psychological phenomena involved in the OSS ecosystem’s past decision of adopting the unreliable, inefficient, and overall sloppy heap of ruminant egesta we affectionately call “SVN”.

And for anyone who has been using SourceForge.net since about 2008 for anything other than small toy projects, the progressive degradation of service quality and reliability (except for the File Release System) has become blatantly obvious. I (or AI0867, really) could spend the entire day describing the various ways in which SourceForge.net’s architecture is irritatingly obtuse, so I’ll just refer to my latest foray into the world of cleaning up other people’s mess:

Apparently, when wesnoth-umc-dev was switched to Allura, the upgrade script failed to make a post-commit hook that fits the Allura set-up.

― Ignacio R. Morelle (@shikadilord) August 5, 2013

So yeah, fixed wesnoth-umc-dev's SVN web interface at last, after fiddling a bit with the hook scripts. Thanks for nothing, Allura.

― Ignacio R. Morelle (@shikadilord) August 5, 2013

Since I am not an active admin of the Wesnoth-UMC-Dev Project anymore, deciding whether, when, and how to switch to a DVCS like Git is not my duty. But that doesn’t mean that I can’t try out possible solutions on my own in the meantime, especially seeing as how Git makes it far easier to push information between repositories and...

... Yeah, I cannot keep pretending I ever considered any DVCSes other than Git for this.

Converting Subversion repositories to Git is no small task. We know this already. Wesnoth-UMC-Dev is even more complicated in that the repository effectively hosts multiple different projects using one or more non-standard file and directory arrangements. But that doesn’t mean converting some of them to Git is not feasible — in fact, this has actually been done before, multiple times: since mid-to-late 2008, I have managed Invasion from the Unknown and After the Storm almost exclusively using Git, by means of the git svn sub-command. It is doable in principle, but there are a few caveats:

  • git svn generates empty/diff-less commits for every SVN revision that exclusively alters SVN metadata (e.g. svn:ignore, svn:mime-type), since that doesn’t have an obvious representation within a Git tree.

  • git svn adds a rather ugly-looking metadata trail to every commit by default to ease matching of Git commits with Subversion revisions, both for the user and automated tools. Example:
    commit 890efb4652c1c27be96de6acec72ceeb0d0178b5
    Author: shikadilord <shikadilord@87cc232e-6748-0410-ac04-a3fa75566414>
    Date:   Tue Feb 19 04:04:11 2013 +0000
        AtS: bump version from 0.8.5+svn to 0.8.90-svn in the changelog after the Big Merge
        git-svn-id: svn+ssh://svn.code.sf.net/p/wesnoth-umc-dev/code/trunk/After_the_Storm@17177 87cc232e-6748-0410-ac04-a3fa75566414
    The metadata in question can be precluded during the git-svn tree generation using the --no-metadata switch, but this is not very helpful if one ever needs to trace down old inter-related commits after the conversion!

  • git svn does not generate Git tags for Subversion tags, wherever they exist. Why is this? Because the existence of Subversion tags is a malicious fabrication by people who applied the “everything is a file” (or directory) paradigm in all the wrong ways. Oh, come on, don’t look at me like that. Here, have a handkerchief.

    The point is, a Subversion tag is no different from a Subversion branch in that it is a directory or file copy operation which allows the result to be modified as many times as necessary without any kind of restrictions. Yes, you can create a ‘tag’ from your development trunk in Subversion and then add new files to the tag or change their content, and so on. Git tags are far more static, and they essentially are annotated references to existing objects; no further changes are possible without editing a given tag to point to a different object.

    So, in short, Subversion tags may not always translate to Git tags, so git svn chooses the lowest common denominator approach and just generates tiny branches from them:
    shadowm@nanacore:~/src/projects/After_the_Storm$ git branch -r

These issues make it decidedly non-trivial to perform a clean SVN-to-Git conversion using any sufficiently mature repository as basis. Again, with Wesnoth-UMC-Dev there is the added difficulty factor of multiple unrelated projects sharing a single Subversion repository, but git svn handles this rather well for the specific portions I want to convert.

At this point you have successfully guessed that my ultimate goal is moving Invasion from the Unknown and After the Storm to GitHub for good. That is, unless you have no idea what this is all about and you just landed on my blog by accident; or you have been stalking me all this time without even bothering to learn anything about what I do in Wesnoth.

Creating Git slices for IftU and AtS is actually more feasible than I thought at first, using a little guide vultraz by chance found for me, and git filter-branch. In fact, last night I managed to turn this into its own standalone Git repository, preserving its entire history sans metadata-only commits. I feel very optimistic after this small test conversion.

But how did I achieve this? What kind of arcane magic was involved in this process? What are the things I did not try yet? What other challenges could there be for converting IftU and AtS to Git?

In the next installment of this new series of blog posts, I shall speak of this and other unfathomable mysteries. Until next time!

Tue, 06 Aug 13 08:44:00 +0200
Allura migration complete http://wesnoth-umc-dev.ai0867.net/blog/index.cgi/shadowmaster/allura-migration-complete.html Wesnoth-UMC-Dev’s switch to SourceForge’s new Allura platform is now complete. The repository should be working as usual, with the exception of the web interface to SVN, which is currently lagging behind.

Contributors with existing Subversion checkouts of any portion of the repository will need to run a simple command to switch/relocate the base repository URL as required by the migration:

svn switch --relocate https://wesnoth-umc-dev.svn.sourceforge.net/svnroot/wesnoth-umc-dev NEW_URL

Or for Subversion 1.7.x and later:

svn relocate NEW_URL

The value of NEW_URL depends on whether you are a regular contributor with commit access or just a user with read-only access. Contributors should use svn+ssh://USERNAME@svn.code.sf.net/p/wesnoth-umc-dev/code as NEW_URL (replacing USERNAME with your SF.net username). Users should use either svn://svn.code.sf.net/p/wesnoth-umc-dev/code or https://svn.code.sf.net/p/wesnoth-umc-dev/code instead.

For graphical/alternative Subversion clients, you should consult the documentation for the software you are using for information about switching/relocating a checkout’s repository.

Feel free to direct specific support inquiries about the migration process to our support thread in the Wesnoth forums.

Sun, 21 Apr 13 04:49:00 +0200
The Wolf's Tale entered the repository http://wesnoth-umc-dev.ai0867.net/umcreg/index.cgi Tue, 16 Apr 13 23:05:34 +0200 Wesnoth-UMC-Dev upgrading to SourceForge’s Allura platform this April 20th http://wesnoth-umc-dev.ai0867.net/blog/index.cgi/shadowmaster/wesnoth-umc-dev-upgrading-to-allura.html In order to avoid nasty surprises for our repository contributors at an indeterminate point in the future, we are preparing to switch Wesnoth-UMC-Dev to SourceForge’s new Allura platform before automatic upgrades for active projects begin on the 22nd. You can read more details about SourceForge’s upgrade plan in their blog post if you are interested.

We have decided to perform this step ourselves at a determinate time instead: April 20th, 19:00 UTC.

But what does this mean for users and contributors to Wesnoth-UMC-Dev?

Basically, the repository will be closed down for commits at the appointed time. No more commits should be pushed to the repository after that point. Because of the new platform’s design, the URLs used to access our Subversion (SVN) repository will change. The upgrade process itself will take an unspecified amount of time to complete, hopefully no more than eight hours. After that is completed, contributors with commit access will receive a notification email specifying the new URL for the Subversion repository. However, we will keep the new repository closed until we have ensured that everything is in order.

Once the upgrade is complete, users and contributors must reconfigure their SVN checkouts according to instructions we will post on this same channel.

Tue, 16 Apr 13 04:48:00 +0200
c74d joined the project http://wesnoth-umc-dev.ai0867.net/umcreg/index.cgi Tue, 19 Mar 13 23:53:09 +0100 After the Storm 0.9.0 http://shadowm.ai0867.net/blog/archives/268-After-the-Storm-0.9.0.html 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, 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 Merge took 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.

Development Hell

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 result

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.

What’s next?

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:

Version 0.9.0:
* General:
  * Milestone: all scenarios completed.

* Scenarios:
  * 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):
    * Minor prose tweaks.
  * E1S7 - The Search for the Past:
    * Minor prose tweaks.
  * E1S12 - The Queen:
    * Minor prose tweak.
  * E1S13 - Death and Rebirth:
    * Fixed minor prose issue ("take risky choices" -> "make risky choices").
  * E2S2 - The Heart Forest:
    * Minor prose tweak.
  * E2S11 - A Final Confrontation:
    * Minor cutscene improvements near the end.
  * E2S12 - Fate:
    * Minor cutscene improvements.
  * E3S8C - Breakdown:
    * Don't allow summoning Fire Guardians until the player enters the
      underground river passage.
    * Fix objectives display inconsistencies throughout the scenario.
    * Minor cutscene improvements.
  * E3S8D - Destiny, part 2:
    * Fixed Anya's movements not being undoable.
  * E3S9: Dark Depths:
    * Fixed minor cutscene glitches.
  * E3S10 - Blood:
    * Add a context menu item displaying a list of available attack
      combinations and their effects.
  * E3S13 - Epilogue:
    * New scenario.

* Units:
  * Balancing:
    * Decreased Demon Slashing Gale's melee attack from 11-3 to 10-3.
    * Decreased Demon Slashing Gale's ranged attack from 10-5 to 9-4.
  * Fixed Chaos Arbalestier ranged attack animation failing to trigger.
  * Fixed Shaxthal Turret not getting the biomechanical trait.
  * Fix multiple "Descriptions should no longer include the name as the first
    line" warnings on 1.11.1 and later.
  * Fix unit types with missing faction prefixes in their names:
    * Arbalestier -> Chaos Arbalestier
    * Cataphract -> Chaos Cataphract
    * Crossbowman -> Chaos Crossbowman
    * Heavy Longbowman -> Chaos Heavy Longbowman
  * Hide private variations for regular unit types from the help system on
  * Killed Kri'tan.

The full changelog—for versions 0.3.0 through 0.9.0—can be found here.

Tue, 05 Mar 13 05:16:00 +0100
After the Storm: Not so fast http://shadowm.ai0867.net/blog/archives/263-After-the-Storm-Not-so-fast.html Everyone who follows me on Twitter can stop reading here.

Continue reading "After the Storm: Not so fast"]]>
Fri, 22 Feb 13 11:16:00 +0100
After the Storm: Big Merge done, 0.8.90 on the horizon http://shadowm.ai0867.net/blog/archives/262-After-the-Storm-Big-Merge-done,-0.8.90-on-the-horizon.html The first After the Storm commit to Wesnoth-UMC-Dev’s trunk happened on May 17th, year 2008.

Today, February 19th 2013, after years and years of development, with various real life and non-real life issues getting in the way and dooming the campaign to Development Hell until version 0.4.0 with a completed Episode I finally happened on October 16th 2011, I can say for certain that...

After the Storm is finally complete.

With the Big Merge done and all the Episode III post-Divergence content (sans the Epilogue scenario) finally landed in Wesnoth-UMC-Dev trunk, the next step is releasing AtS version 0.8.90 to the public.

r17177 | AtS: bump version from 0.8.5+svn to 0.8.90-svn in the changelog after the Big Merge
r17176 | AtS: [Big Merge] workaround issues with the test suite and macros from data/core/units.cfg
r17175 | AtS E3: [Big Merge] land post-Divergence maps and scenarios
r17174 | AtS E3: [Big Merge] land post-Divergence ancillary macros, story text, character macros, and death handlers
r17173 | AtS: [Big Merge] land post-Divergence units WML, baseframes, halos, and animations
r17172 | AtS: [Big Merge] merge macros used for post-Convergence content
r17171 | AtS: [Big Merge] remove conditional loading of finale-stage scenarios and units
r17170 | AtS: bump version from 0.8.5+svn to 0.8.90-svn before the Big Merge
r17169 | AtS E3S6: enable scenario in regular gameplay

There will be a delay between this and the actual public 0.8.90 release while my primary playtester (vultraz) does the playtesting thing with the scenarios. Some balancing changes before 0.8.90 may also be necessary.

In the meantime, people can check out After the Storm from Wesnoth-UMC-Dev trunk using the Subversion client of their choice, and provide me with feedback via forum PM (in particular, about any possible bugs or balance issues that might plague some specific scenarios), or private messaging on IRC — I am on irc.freenode.net, channel ##shadowm most of the time, but I would rather avoid people dropping spoilers in the presence of my aforementioned playtester, who also hangs around there.

UPDATE: Since I haven’t gotten around to publish version 0.2.0 of the AtS Music add-on, you will also need to obtain the latest version from SVN separately, since it introduces a few music tracks used in the new AtS Episode III scenarios. Of course, this is only necessary if you want/need to have in-game background music.

UPDATE 2: AtS Music version 0.2.0 is now in the 1.10 and 1.11.x add-ons servers. The previous version was 12.3 MiB in size, whereas the new version is 22.7 MiB. I actually had to do some re-encoding to bring it down from 33.1 MiB, but there shouldn’t be any noticeable compression artifact build-up — or at least, I cannot perceive any with my headphones on.

svn co https://wesnoth-umc-dev.svn.sourceforge.net/svnroot/wesnoth-umc-dev/trunk/After_the_Storm
svn co https://wesnoth-umc-dev.svn.sourceforge.net/svnroot/wesnoth-umc-dev/trunk/AtS_Music

You can also grab tarballs of the latest trunk snapshots through SourceForge.net’s SVN web interface:

This last alternative is probably not the best, though, since you will not be able to track future updates. Subversion makes it far easier to update every time a changeset is committed, without having to download the whole thing every time.

I am not going to provide any further instructions for installing using either of these methods, so I’m leaving this to people who actually know their way around Subversion tools or manually installing add-on content. I am not going to post any spoilers either; in particular, I am not going to reveal the Epilogue sequence until version 0.9.0.

Special thanks go to Espreon, Gambit, and vultraz for making all of this possible in their own ways. I will probably explain the deal with AtS’ troubled development in a new post in the near future (probably after 0.8.90 is properly published).

Thanks to all those who waited this long for this to happen. For those who are eager to playtest this and don’t know their way around the aforementioned things, I can only promise that the wait for 0.8.90 will be much shorter. A couple of weeks, tops.

Finally, the usual disclaimer applies: this campaign is not for everyone.

Tue, 19 Feb 13 05:48:00 +0100
The Void's Tears entered the repository http://wesnoth-umc-dev.ai0867.net/umcreg/index.cgi Fri, 15 Feb 13 21:28:50 +0100