What I do for Wesnoth

Several of my regular commenters have expressed interest in Battle For Wesnoth and my role in it. I’ll give a narrative summary of my role in the project, expanding on a comment I uttered a while back.

For the narrative to make sense, you need to know that Wesnoth is a turn-based strategy game with a fantasy setting. It has elements of both traditional hex wargame and role-playing game in it; a “campaign” is a collection of tactical puzzles knit together by a prose plot. There is also support for multiplayer-networked battles, but I’m mainly interested in the campaign game.

Campaigns are written in a domain-specific language called WML, Wesnoth Markup Language. The game engine is, essentially, a WML interpreter. WML supports designing maps, setting up army lists, and connecting the battles with a prose narrative (which need not be strictly linear — it’s common for campaigns to have multiple narrative paths dependent on player choices). Additional flavor is provided by animated sprite graphics for combat and background music of remarkably high quality, neo-classical orchestral pieces that will remind you of the better grade of movie soundtrack rather than the mediocre electronica you usually get in games.

It’s all open source., with ports for OS X and Windows as well as Linux.

I’ve been a dev for a bit less than two years. My first project was helping prepare the “Northern Rebirth” campaign to be mainlined (e.g shipped with the game as opposed to unofficial user-maintained content). I did a lot of prose-doctoring on NR, enough that I was declared a co-author by its originator. He’s retired from Wesnoth stuff and I maintain it now.

A major focus of my early work on the project was mainlining more campaigns. When I joined we shipped only six, and I went through them pretty rapidly – I felt like the amount of content Wesnoth had was really underutilizing the game engine. I quickly discovered that the other devs were resistent to mainlining more campaigns mainly because each one imposed continuing maintenance overhead, if only because the WML they’re written in evolves gradually as the devs extend it to do more things.

Consequently, I got heavily into writing tools to mechanize routine WML maintenance tasks. A cross-referencer, to check for dangling reference (nonexistent graphics and other resource files referred to in WML). An indenter — there was a confusion of different indenting styles in mainline, making the code harder to read. Most importantly, I wrote a lint-like tool that could both perform extensive semantic sanity checks on WML and lift constructs from older dialects of it into newer versions.

The effect of these tools was pretty dramatic. They reduced WML maintenance overhead by an order of magnitude or so, making it easy for us to ship a lot more campaigns – I successfully mainlined no fewer than seven written by other people and eventually wrote and mainlined an original one of my own, The Hammer of Thursagan. They also made it possible to evolve WML more rapidly, because I could be counted on to write lifting logic in my lint tool that would carry forward old campaigns mechanically, rather than requiring painful and error-prone hand-work .when the language or the layout of the game data tree changed.

As my original surge of work on these tools trailed off, I took on a very different task – improving the prose quality in the game. Though the working language of the project is English, most of the devs and campaign designs are not native speakers and the quality of their prose is highly variable. Then, too, the appropriate style for a game like this is not all that easy to generate even for literate native speakers.

I felt strongly that playing a Wesnoth campaign ought to be like reading an epic-fantasy novel in miniature. I say “miniature” because the campaign format doesn’t really allow paragraph upon paragraph of voluminous scene-setting and character development – you have to do a lot with a really low word-count, rather like building a ship in a bottle. It’s even more of a challenge if you think (as I do) that the prose ought to have a preceptible flavor of Tolkien, Eddison, and Dunsany about it. Or, if one can’t manage that, at least Robert E. Howard…

Revising the mainline prose content to meet my standards was an immense amount of work and isn’t quite finished yet even for the older content. Fortunately, the other devs and our campaign designers quickly noticed that this project was a Good Thing and were, in general, actively helpful and not at all territorial about having their prose rewritten. As a side-effect, I became the project’s go-to guy for all English-related issues — I help non-native speakers with vocabulary and have been asked to write the announcement for the upcoming major 1.6 release.

Along the way I’ve done some writing I’m rather proud of. Kalenz’s and Cleodil’s love scene in Legend of Wesmere; the final confrontation between the mage Delfador and arch-villain Ihiah-Malal, also in LoW; the Elven lady Ethiliel’s horrifying reunion with her former mentor, the mad undead sage Mal M’Brin, in The South Guard; the death of Mal-Ravanal in Eastern Invasion and the Epilogue that follows; Mal Keshar’s monologue about how he got expelled from the Academy on Alduin in Descent Into Darkness; and, most recently the scene at the tomb of An-Usrukhar from the not-yet-mainlined Delfador’s Memoirs.

(I am, however, only the second-best writer the project has had available. The best was the author of The Rise of Wesnoth. He actually made successful, fluid transitions between archaized high-fantasy prose and humorous snarkiness expressed in modern slang, something I’m not at all sure I could do gracefully and have been too chicken to try. He also wrote what I think is the single creepiest line in the entire corpus, in A Final Spring, from the undead Fool Prince: “”Fath-er! Join… us…” Brrr….)

A third hat I eventually took on was bug triage. While all the senior devs do a bit of this, I’m the person who does most of the filtering and dispatching of tracker issues to developers. I’ve also organized at least three major bug-stomping runs and personally nailed a count of bugs running well into three digits. I did the forensic analysis and organized the recovery a few month ago when now-vanished developer seriously broke the game’s AI.

At one point I overhauled the game’s visible UI pretty seriously. The translucent dialogue windows with lightweight click-to-next behavior were my doing. I’m also responsible for the review mode you enter when you finish a battle, which lets you review the end state and change settings before committing to go to the next scenario.

More recently I’ve been more or less dubbed the keeper of the history and geography of the Wesnoth setting. Some of this is because I’m unusually willing to sweat the details of getting an imaginary setting consistent, but a surprisingly large part of it is that I’m good at generating plausible names — the Estmarks, the Forest of Lintanir, the Heart Mountains, Bitterhold, and the River Listra were among mine. Campaign designers have learned to use me as a name generator for their characters and places.

Now for the things I don’t do:

Though I’ve my share of coding in the C++ core (I have to in order to chase bugs, and there was the UI overhaul, and then there was refactoring the map editor…), I avoid it as much as possible because I’ve grown to violently dislike C++ during my time on this project. Wesnoth has many virtues, but the core codebase is a pile of OO scar tissue with way too many deeply intertwingled classes. I know the developers and I blame the language; it seems as difficult to avoid this kind of excess in C++ as it is to write readable code in Perl.

Though I’ve contributed one terrain-tile graphic (the snow-covered stone hut) following an enjoyable frankensteining session with the GIMP, I’m not skilled enough as a visual artist or composer to contribute that stuff regularly.

Published
Categorized as Games

92 comments

  1. Speaking about scripting languages like Perl, I don’t get the love with Python. I think Ruby’s a nicer (and more lisp-like) language.

  2. Kick C++; kick Perl; Would you like to kick my cat too? Deeply intertwingled classes are not the languages fault. You can spell spaghetti in any language. I’ve avoided that sort of excess for my entire career without any difficulty.

  3. Why is C++ still the language of game development? Like its predecessor, C, it’s still portable assembler. I think they would be better served by moving to a higher-level language like Python. Game developers should spend their time on the gameplay rather than managing memory.

  4. “I think they would be better served by moving to a higher-level language like Python.”

    It’s not that easy as it sounds. Core Wesnoth developers, except Eric, are in love with this “pile of scar tissue” and don’t want to hear about any non-trivial changes. I actually tried to initiate this move and created working proof of concept, but without strong support from project lead this idea is doomed.

    They need some kind of competition (another better open-source game in the same genre) to start moving.

  5. Why is C++ still the language of game development? Like its predecessor, C, it’s still portable assembler. I think they would be better served by moving to a higher-level language like Python. Game developers should spend their time on the gameplay rather than managing memory.

    While this may be true for a resource-unintensive game like Wesnoth, let’s just say if you build a viable engine for bleeding edge games in pure Python then you will be famous. In any case, C++’s primarily failing is descending from C. The reason people like C++ is that it is possible to conveniently build abstractions with zero unnecessary overhead. C, on the other hand, can descend into a hive of pointers that the compiler can’t optimise. I agree that OOP is unnecessary, however, and most solutions can be encoded in pretty much any paradigm. Why not write it in ML?

  6. There’s a group of crazy Danish coders who actually did write a game engine in ML. They compiled it with MLton, for blistering fast performance.

    Myself, I prefer Lisp. Before having C++ foisted on them by parent company Sony, GOAL — a Lisp dialect intended for games — was a crucial part of Naughty Dog’s toolkit. They did things like using a form of continuation passing style to implement lightweight cooperative multithreading (akin to Win32 “fibers”) for game objects. This led to various visibly cool effects, like doing memory card IO while the game engine ran, a rarity on the PS2 platform.

  7. What was the point in creating a custom markup language? For example, if it would be standard markup like XML, SGML or http://en.wikipedia.org/wiki/Yaml (which I consider the best for manual editing/viewing, very human-friendly), then it would be trivial to convert them by a routine to S-expressions.

    And if you do that, then the engine is just a bunch of LISP or SCHEME functions and some macros that transform the syntax of those S-exps to the syntax of function calls. I mean f.e. an XML (using [] now as WordPress catches lesser and greater signs) like, say, [unit name=”Ork”] [HP] 12 [/HP] [/unit] can be transformed by XML2SEXP and macros to a function call to the Unit function with the parameter “Ork” and another parameter, which, if I understand this kind of (PaulGrahamian) design method correctly, would be a closure of the HP function. That would sound like a very elegant solution to me.

  8. “Speaking about scripting languages like Perl, I don’t get the love with Python. I think Ruby’s a nicer (and more lisp-like) language.”

    Ruby is one of the closest things a modern infix-notation OO language can get to the power of LISP, so it certainly has a lot of merits. However, there was something that always rubbed me the wrong way of Ruby as a culture, expressed in the language itself too: I somehow felt it wants to radiate an air of coolness, creativity, awesomeness, “See mom what I can do!”. Python for me feels like radiating an air of sobriety, grown-upness.

    Actually the difference is very, very small at the level of the overall elegance or succintness of the code (even though their design philosophy is very different, the result looks very similar), so it may be that I’m just making this up.

  9. The story I’m told is that Sirp considered XML but at the time the open-source tools weren’t quite good enough to convince him against writing a markup from scratch. This would have been around 2003.

    Shenpen, I find I agree with every word of your comment about Ruby vs. Python, both praise and condemnation. You’re right, Python feels more sober and adult somehow and I can’t really pin down why either. That said, I’ll learn Ruby if I ever need to and not mind doing it.

  10. Python for me feels like radiating an air of sobriety, grown-upness.

    This is only true if you equate sobriety and maturity with a focus on getting the job done. Not all languages are designed solely for this purpose.

  11. Python feels more sober and adult somehow and I can’t really pin down why either.
    I have to wonder what kind of hacking you can do in an “adult” language.

  12. > “Fath-er! Join… us…”

    Funny, this line never moved me at all. Maybe it would if the Prince of Southbay had gotten some earlier development, but this scenario is the first where we ever meet either him or Addoran, making it hard to care.

    I think the very best line in the campaign, and in the game, is from “Cursed Isle”: “All soldiers of darkness will meet the same fate by my hand”. It’s particularly striking because it’s Minister Edmond’s first line of dialogue since introducing him 13 scenarios earlier. It’s a shame the author didn’t do more with his character; you never even get to meet him if you happen to choose the Midlands branch.

  13. Speaking of spaghetti, how is “Why C++ is Not Our Favorite Programming Language” coming along (and where do y’all expect to publish it)?

  14. David Deloney:
    > Why is C++ still the language of game development?
    I believe there’s a largeish amateur Windows/XBox games dev community that uses C#. Make of that what you will…

    There’s also a first-person shooter written in Haskell, called Frag (short for Functional ReActive Gaming). I downloaded it once, but was put off by the number of Cabal libraries it needed and the clunky procedure needed to install them. But I understand that Cabal installations have since been greatly streamlined, so don’t let that put you off trying it.

    Eric: I don’t want to start a language pissing match, but when did you last use Perl? My understanding is that it’s become much more suitable for programming in the large in recent versions (say, v5.6 or greater). I’ve been using it happily since about 2001. I only rarely have problems reading my old code or code downloaded from CPAN: unreadable code is usually a result of (a) deliberately writing obfuscated or “golfed” Perl, (b) sending a regular expression to do a parser’s job, or (c) using a style appropriate to one-liners in bigger programs. Or simply writing code with convoluted logic, overlong and incoherent functions, poor separation of concerns, etc; but Perl is no worse in this regard than any other Algol-derivative, and better than many.

    Actually, I did once have great difficulty deciphering a CGI script that had come from Matt’s Script Archive or some similar horror, written by someone who knew about dynamic scoping but not about function arguments. But MSA is pretty much the canonical example of how not to write Perl :-)

    On a related note, has there been any progress on your C++ rant? I for one would love to read it.

  15. >Eric: I don’t want to start a language pissing match, but when did you last use Perl?

    There’s a Perl CGI in my gpsd project — our hosting site wouldn’t do Python CGIs. So, yes, I still have to deal with it.

    >On a related note, has there been any progress on your C++ rant? I for one would love to read it.

    My collaborator’s flying up here so we can work on it, in about two weeks.

  16. Eric, I am eagerly anticipating your upcoming C++ evaluation paper [AFAIK, it’s yet to be published, …or have I missed it?]
    Given your resentment of this language and it’s apparent shortcomings [as you partially tried to point them out in one of your recent blog posts], curiosity prod me to ask: Why did you have to use that “crappy” implementation language?

    P.S. I think it’s a good idea to hand a copy of that to Stroustrop. He seems to sternly defend it against criticisms [Checked the FAQ on his web page]

  17. Eric, I am eagerly anticipating your upcoming C++ evaluation paper

    Ditto. Unfortunately, I fear it will fall into the category of evaluations written by people who don’t actually use C++, or even write things in the spaces that it is useful. When you hear someone make unfounded and/or subjective statemens such as it being ‘hard’ to write good code in Perl, or C being a model of ‘austere elegance’ it doesn’t bode well.

  18. Given your resentment of this language and it’s apparent shortcomings [as you partially tried to point them out in one of your recent blog posts], curiosity prod me to ask: Why did you have to use that “crappy” implementation language?

    Because, like it or hate it, it’s the only language up for the job.

  19. Because, like it or hate it, it’s the only language up for the job.

    I disagree. I see no reason Wesnoth couldn’t be implemented in ML, for example. That C++ is the only competent language for resource-intensive applications is just the opposite side of the anti-C++ coin.

  20. >‘hard’ to write good code in Perl

    That’s “hard to write readable” code. As usual, you need to work on your reading comprehension.

  21. Ditto. Unfortunately, I fear it will fall into the category of evaluations written by people who don’t actually use C++, or even write things in the spaces that it is useful.

    Marshal, I don’t think that one should necessarily be a highly skilled C++ coder to qualify for evaluation of the language. Indeed, Eric has done a lot of hacking with that in the course of Wesnoth’s development. He claims to have [gradually] started to resent the language over the years.

    When you hear someone make unfounded and/or subjective statements such as it being ‘hard’ to write good code in Perl, or C being a model of ‘austere elegance’ it doesn’t bode well.

    Spot on, and I wish that “technical parts” will dominate the whole paper, so that those [potential] subjective parts can be overlooked. “Why Pascal is not my favorite programming language” can be a good example to what I mean.

    That C++ is the only competent language for resource-intensive applications is just the opposite side of the anti-C++ coin.

    I think Eric had to code in C++ just because the decision had been made earlier by the project’s initial programmers and core development team [David White, the chief designer I guess] before Eric joined the project. Of course this is just a hypothesis and he can correct me if I’m wrong.

  22. That’s “hard to write readable” code. As usual, you need to work on your reading comprehension.

    My apologies; that is what I meant to write, and it is equally true. In any case, as someone who has been ‘hacking’ Unix for decades but are unable to figure out how ptrace works (even after ‘testing’ your bizarre theory), you are hardly in a position to criticise others about the clarity of their comprehension.

    Marshal, I don’t think that one should necessarily be a highly skilled C++ coder to qualify for evaluation of the language. Indeed, Eric has done a lot of hacking with that in the course of Wesnoth’s development. He claims to have [gradually] started to resent the language over the years.

    Would you accept a critique of C from someone who knew only BASIC and Python, that claimed C was too complicated because it was memory-unsafe? Of course not – C is widely used with great success. It’s just not the language for all people or all tasks. All attempts to generalise about the usefulness of particular general purpose programming languages are doomed to failure. Someone will always find a way to leverage the syntax and semantics of a given language while someone else shoots themselves in the foot with them. The ability to shoot one’s self in the foot is a function of the author and the language.

    I think Eric had to code in C++ just because the decision had been made earlier by the project’s initial programmers and core development team [David White, the chief designer I guess] before Eric joined the project. Of course this is just a hypothesis and he can correct me if I’m wrong.

    I had meant to address Jeff Read with that comment. I was attempting to comment that the notion that C++ is the only industrial strength programming language out there is unfounded, and that there are numerous examples of interesting ‘real-world’ projects using other languages.

  23. Would you accept a critique of C from someone who knew only BASIC and Python

    Sorry to disappoint you dear Marshal, but I’m afraid to say YES. Some of the things that matters to me while reading a programming language critique are the following:

    1- Whether I can learn something from it.
    2- Whether it’s a well-researched work or a simple close-minded piece of rant which stems from a preconceived opinion.
    3- Whether the author is not trapped in emotional illusions/detachment from reality and maintains a relatively neutral stance while criticizing the language.
    4- Whether it’s inclusive [i.e covers most of the language’s aspects]
    5- Its scientific credibility [Can be referred to later or not]
    6- Whether the author thinks (criticism == bashing)

    I actually don’t care the alleged limited hands-on experience of the author, because if he chooses a scientific approach and be able to rigorously analyze different facets of the language in depth, then who gives any slightest attention whether he himself is much of a C++ programmer or not!?

    The ability to shoot one’s self in the foot is a function of the author and the language.

    Correct. But when it comes to two given programmers with evenly balanced mental adroitness and hacking skills choosing two distinct languages with unequal strengths to accomplish a similar task; that who prospers is needless to say. This is one good reason to seek after the better one.
    Oh, and I am aware that “shooting yourself in the foot” also depends on the task. Writing some forms of apps are painfully error-prone and languages like C++ intensify the pain in the arse. I’ve heard that the famous array indexing problem nearly caused a disaster in one of the NASA’s space shuttles a few years ago.

    I had meant to address Jeff Read with that comment. I was attempting to comment that the notion that C++ is the only industrial strength programming language out there is unfounded, and that there are numerous examples of interesting ‘real-world’ projects using other languages.

    I agree, but please read carefully. I knew what you meant and who you were addressing to. I actually confirmed your idea by suggesting that ESR engaged in C++ coding because he had to [he wasn’t the project initiator and joined later] not simply because like it or hate it, it’s the only language up for the job.

    All attempts to generalise about the usefulness of particular general purpose programming languages are doomed to failure.

    Pragmatically speaking that’s right, but your word here is itself a generalization that IMHO, is not necessarily correct.
    As Dijkstra once said, teaching some of those brain-damaging languages to innocent kids should be considered a criminal offense :)
    Some of them are not only “not so useful” but also cripple the mind and lots of self-discipline is needed to reverse the brain-damage.

  24. Hard to write readable code in Perl – I think it’s like this: you can drive a Ferrrari on the motorway without exceeding the speed limit if you really want to. Nothing stops you from doing so. But it’s just too tempting to drive it fast because that’s what a Ferrari is for, the whole design is just begging you: please, pretty please, drive me fast! Of course, with enough self-control you can restrain yourself and keep to the best practices and all, but I figure it’s better to use tools that were explicitly designed for your preferred way of doing things.

  25. “I don’t think that one should necessarily be a highly skilled C++ coder to qualify for evaluation of the language. ”

    I agree with that, with one condition. Just like you have to know macros in and out in order to evaluate LISP on any non-trivial level, in the case of C++, I think it’s the level of knowledge about templates and exactly what can and what cannot be achieved with them that makes the difference between a good and a bad evaluation. That the STL sucks everybody knows, but to what extent is it fixable with a better set of templates? That’s the really big question.

    Focus on templates, that’d be my advice, if you are willing to take one.

  26. I actually don’t care the alleged limited hands-on experience of the author, because if he chooses a scientific approach and be able to rigorously analyze different facets of the language in depth, then who gives any slightest attention whether he himself is much of a C++ programmer or not!?

    Because unless he’s using a statistical approach, it must be qualitative. I’m not suggesting that an experienced C++ programmer knows best. If anything, he is biased toward C++. I’m suggesting that one must at least ‘get it’. The BASIC programmer in question doesn’t get it. Maybe other BASIC programmers do. But suggesting that pointers are a problem in C is to miss the purpose of the language.

    Oh, and I am aware that “shooting yourself in the foot” also depends on the task. Writing some forms of apps are painfully error-prone and languages like C++ intensify the pain in the arse. I’ve heard that the famous array indexing problem nearly caused a disaster in one of the NASA’s space shuttles a few years ago.

    What are you suggesting? Static checking of array bounds? I hope you like writing proofs. C++ can do things like dynamic checking of ‘arrays’, you just have to avoid its built-in array type.

    Pragmatically speaking that’s right, but your word here is itself a generalization that IMHO, is not necessarily correct.
    As Dijkstra once said, teaching some of those brain-damaging languages to innocent kids should be considered a criminal offense :)
    Some of them are not only “not so useful” but also cripple the mind and lots of self-discipline is needed to reverse the brain-damage.

    Dijkstra is a notorious generaliser, so it is ironic that you would quote him. He also thinks that all programming should be taught as formal mathematics. Anyone who has actually done any formal verification work (think machine-checkable proofs) knows that this is intractable in general.

  27. That the STL sucks everybody knows, but to what extent is it fixable with a better set of templates? That’s the really big question.

    What an insightful analysis. Everybody knows dynamically typed languages suck too, depending upon who ‘everybody’ is.

  28. Dijkstra is a notorious generaliser, so it is ironic that you would quote him.

    I suppose ‘ironic’ is the wrong word. I guess I had meant to say that invoking Dijkstra to put lie to the idea that generalisations about programming as a practise are usually not well founded, given that he has made so many overzealous generalisations over the years.

  29. That the STL sucks everybody knows, but to what extent is it fixable with a better set of templates? That’s the really big question.

    What an insightful analysis. Everybody knows dynamically typed languages suck too, depending upon who ‘everybody’ is.

    What have templates got to do with dynamic typing? c.f. Common Lisp, as Shenpen originally mentioned. C++ has optional dynamic typing as well.

  30. What are you suggesting? Static checking of array bounds? I hope you like writing proofs.

    All I’m saying is that because out-of-bounds index [unless too big which causes an unhandled exception] is valid, some stupid errors may happen:

    const int SIZE;
    float a[] = {1, 2, 3};
    float x = 14;
    cout<<“x= “<<x<<endl;
    a[3]= 17; //Index out of bounds
    cout<<“x= “<<x<<endl;

    output —-> x= 14
    x= 17

    In the above (silly) code, we have unintentionally changed x’s value. These types of errors which stems from recognition of invalid index is some times really hard to detect.

  31. I guess I had meant to say that invoking Dijkstra to put lie to the idea that generalisations about programming as a practise are usually not well founded

    Well dear Marshal, there’s a BIG difference between lying and simply holding a different idea. I hope you understand it. Anyhow, I wasn’t aware of his notoriety, thanks for the pointer.

  32. What have templates got to do with dynamic typing? c.f. Common Lisp, as Shenpen originally mentioned. C++ has optional dynamic typing as well.

    Nothing. Insert any language category in place of ‘dynamically typed languages’. Merely asserting that the STL sucks is a poor argument, and at odds with the fact that people use it fruitfully all the time. I do not like the STL either personally, but I cannot construe my personal taste as universally accepted fact. Many people would say that everyone knows that BASIC sucks. Maybe it does (I don’t like it much), but there are many people who would disagree.

    Well dear Marshal, there’s a BIG difference between lying and simply holding a different idea. I hope you understand it. Anyhow, I wasn’t aware of his notoriety, thanks for the pointer.

    I guess I have expressed myself poorly again. Actually, I appreciate the correction. I think you know what I mean though. In any case, the memory-safety thing is either a bug or a feature depending upon your purpose.

  33. Have fun not understanding Unix/programming.

    I don’t know who you are referring to or what made you frustrated, but personally I never claimed that I am a programmer/Unix guru. I am simply a computer enthusiast and eager to deepen my grasp of CS through healthy debate.

    I think you know what I mean though.

    O.K. I will revisit the idea. I grew up believing that some languages teach us bad habits and/or [as Paul Graham] says are not worth learning because they don’t suggest a new pattern of thinking about problems. So with that premise, it’s not abnormal to believe that some languages are just “not useful”. It’s quite probable that in the case of C++, [maybe] I have overstretched myself. After all I don’t use it much.Dunno

  34. >Have fun not understanding Unix/programming

    Heh. Meanwhile, unless my publisher is lying to me, my book on the Art of Unix Programming is in routine use as a textbook in programming and software engineering courses. Of course, all those professors have actually been hypnotized by my orbital mind-control lasers, and Marshal is the brave lone voice exposing me as a fool and a fraud. His book on how to think like a Unix expert is much better. In some universe.

  35. >I am bored of trolling you people.

    Immediately after posting this, Marshal attempted to forge a hostile comment, ending with the line “Please give generously to the Eric Raymond college fund. With your help, we can get Eric the computer science schooling he so desperately needs.” as though it came from Jay Maynard. The actual source was revealed by the IP address.

    Fortunately, my spam-blocker caught it before it would have put my friend Jay in the position of protesting that he would never have uttered such a ridiculous slur. Jay, I have retained this message in my spam queue on the off-chance that you might want to see it and take some sort of legal action or whatever.

    Insulting me is acceptable on this blog, as long as the attacker keeps his signal-to-noise ratio high enough that I think he is worth the trouble. Fraudulent impersonation of another guest, in an obvious and deliberate attempt to make trouble between myself and that person, is a crash landing. Utterly unacceptable.

    Marshal is henceforth banned.

  36. I’ve long thought trolls should be taken out back and shot, at least figuratively. Trolling has no place in adult discourse.

    Eric, I’m not going to bother: it didn’t cause me any damage, and my status as a public figure raises the bar as to what it takes before I can succeed in such an action.

    The comment is laughable in any event, as anyone who knows Eric’s history will attest. The carping about Eric’s supposed lack of Unix knowledge is especially laughable. The Art of Unix Programming is a fantastic resource, and would be even without my minor contributions. Eric knows this, and knows that I know it. Attempts to cause friction between us on this basis are highly likely to fail.

  37. Wow Eric, thanks for mentioning Wesnoth. Somehow I managed to miss its existence and yet it’s exactly the sort of game I used to love (Warlords, et al.). Now I’m hooked.

    Also, darn you for mentioning it! Now I’m hooked!

  38. “Warlords, et al.”

    Well in Warlords you could put 8 (?) units into a stack (army) and move them together. That made things much faster. What makes Wesnoth a bit boring for me is the long time spent moving units around one-by-one, without any action, I don’t have any suggestions what to do with it, though, any kind of stacking would mean a total redesign as the whole game balance would need to be rethinked then. And Steel Panthers-style “move in platoon” is just lame, no reason to copy that. I figure it has to stay that way and therefore will only attract serious gamers with a chess-like mindset.

  39. Wesnoth works fine as long as scenario designers manage to refrain from throwing thousands of gold at every side. Unfortunately this is more than can be said of several mainline scenarios.

  40. >Unfortunately this is more than can be said of several mainline scenarios.

    Specifics? I’m one of the general campaign maintainers; I might well be able to fix this.

  41. >(Warlords, et al.).

    Ah, there was a fine game.

    I can’t remember how they handled the UI for stacking in it, though. It might be applicable to Wesnoth.

  42. ESR:
    > There’s a Perl CGI in my gpsd project — our hosting site wouldn’t do Python CGIs. So, yes, I still have to deal with it.

    Hmmm. Is this all your own code, or did other people contribute? If it’s your code, I guess you wouldn’t get the advantages of using modern Perl idioms, but writing readable code still shouldn’t be that hard. Are there any specific problems that make your code hard to read, or do you just have a low tolerance for punctuation? Can you point me at some gnarly bits?

    It occurs to me that there’s another common readability failure-mode in Perl, to which you (as a Lisper) may be especially prone: overuse of nested anonymous data-structures, and the resultant need to put reference syntax everywhere. This is usually a warning sign that you’re trying to be too clever for your own good, and that you should use real objects. Did I mention the new object system? :-)

    Shenpen:
    > Hard to write readable code in Perl – I think it’s like this: you can drive a Ferrrari on the motorway without exceeding the speed limit if you really want to. Nothing stops you from doing so. But it’s just too tempting to drive it fast because that’s what a Ferrari is for, the whole design is just begging you: please, pretty please, drive me fast! Of course, with enough self-control you can restrain yourself and keep to the best practices and all, but I figure it’s better to use tools that were explicitly designed for your preferred way of doing things.

    There may well be something in what you say. I’ve certainly noticed that good Perl programmers (in whose ranks I don’t count myself) are fanatical about documentation, testing and coding for readability to an extent that I haven’t encountered elsewhere.

  43. ‘Clearing the Mines’ from Northern Rebirth is the first that comes to mind. Guiding 50 dwarves down an empty corridor isn’t fun. The second and final scenarios of Northern Rebirth are borderline as well.

    ‘Northern Winter’ from HttT has armies which would be a reasonable size for most maps, but becomes a tedious trudge due to the terrain. Far worse for similar reasons is ‘Breaking the Siege’ from Legend of Wesmere; I think this is the worst-designed scenario in all of mainline.

    At one time I would have put the final scenario of SotBE on this list, but then I realized there’s a faster way to win it: just recruit two castles of saurian skirmishers and make a dash for the enemy leader.

  44. >Hmmm. Is this all your own code, or did other people contribute?

    I wrote it, but I used a modern Perl CGI as a model, and it was then polished by my chief GPSD lieutenant Chris Kuethe, who likes Perl and keeps current with it. So I think the dialect of Perl is pretty up-to-date.

    >have a low tolerance for punctuation?

    That’s part of it. I find Perl syntax cluttered and spiky. The friction cost this imposes is acceptable for small scripts (< 100 lines) but starts to become serious in larger ones. >overuse of nested anonymous data-structures

    Nope.

    >There may well be something in what you say.

    I think Shenpen’s critique is spot-on. I too have noticed that the best Perl programmers are fanatical in the way you describe. The trouble is that in Perl, they have to be.

  45. >Kalenz’s and Cleodil’s love scene in Legend of Wesmere; the final confrontation between the mage Delfador and arch-villain Ihiah-Malal, also in LoW; the Elven lady Ethiliel’s horrifying reunion with her former mentor, the mad undead sage Mal M’Brin, in The South Guard; the death of Mal-Ravanal in Eastern Invasion and the Epilogue that follows; Mal Keshar’s monologue about how he got expelled from the Academy on Alduin in Descent Into Darkness; and, most recently the scene at the tomb of An-Usrukhar from the not-yet-mainlined Delfador’s Memoirs.

    hmm! ok, (a) quite different from what i expected from a quick glance at the wesnoth site’s frontpage, and (b) evocative, intriguing. wesnoth is now on my list of things to check out (and possibly lose way too much time to).
    ta.

    >the [C++] core codebase is a pile of OO scar tissue

    similarly evocative and beautifully succinct summary of most nontrivial multi-developer C++ codebases

  46. >The carping about Eric’s supposed lack of Unix knowledge is especially laughable.

    eric uses unix?!?!

    why weren’t we told?! and why isn’t there some sort of public record, of say skilled unix programming, that anybody could look at?!

    i feel grievously betrayed by eric’s secretiveness and deception.

  47. thing for me, python v. ruby, is that python always reads almost like a mind-map, whereas ruby requires syntax-knowledge and paradigm-knowledge. python remains grokkable even when you’re so rusty a shellscript you type cold for someone has syntax errors. *cough*

    that for me is the key USP for python.

    and is why i view python3 with sadness and regret for what-was

  48. “and is why i view python3 with sadness and regret for what-was”

    ??? IMHO it became more “pythonic”. But I think this topic worths something more than a bunch of short comments in a hijacked thread – do you want to blog about it in detail and perhaps link that here and continue that discussion there?

  49. alluded to previously in which regard, i think a simple quote suffices:
    >>[Saltation]
    eg python 3, which appears at a glance to have thrown away key aspects of its novice-user friendliness, eg loose print now tight and print() )

    >[Adrian Smith]

    [looks]

    Euwwww…

    [sticks with 2.5]

  50. > I find Perl syntax cluttered and spiky. The friction cost this imposes is acceptable for small scripts ( I too have noticed that the best Perl programmers are fanatical in the way you describe. The trouble is that in Perl, they have to be.

    Or more precisely, in Perl they have to be right from the start, rather than discovering too late that they should have been :-)

  51. John, looks like quite a few relevant hits to me. They just start at page 3 because the first two pages are flooded by someone’s mirror of the text.

  52. As we are already in offtopic territory, talking about programming languages etc., may I get a bit more OT and ask you y’all to help me formulate Shenpen’s First Law? Which in it’s current, informal, sloppy state is like this: “Deriving a formal system from one simple rule is a WIN. Deriving an informal system from one simple rule is a FAIL.”

    Examples:

    1) Formal systems: programming languages:

    “There is one simple rule: everything’s a list” -> LISP -> WIN

    “There is one simple rule: everything’s a object” -> Smalltalk -> WIN

    “There is one simple rule: everything’s a function” -> Haskell, ML -> WIN

    2) Informal systems:

    “There is one simple rule to managing a software project” -> INSTANT FAIL

    “There is one simple rule to manage a team of developers” -> INSTANT FAIL

    “There is one simple rule to sell something” -> INSTANT FAIL

    “There is one simple rule to run an economy” -> INSTANT FAIL

    Any ideas?

    (Sorry for the OT but this discussion was getting very OT anyway.)

  53. “There is one simple rule to run an economy” -> INSTANT FAIL

    If only the libertarian ultracapitalists would realize this… sigh…

  54. >If only the libertarian ultracapitalists would realize this… sigh…

    We do better…we know that economies can’t be “run” at all. Basic Hayek.

  55. To ‘run’ an economy, you leave it alone. That’s one simple rule, but it’s a special case. I mean, you might as well say, ‘There’s one simple rule to maintain mostly functional organs, and that’s to not cut yourself open and forcibly rearrange them’, and then assert that that is trying to derive an informal system from one simple rule.

  56. Remember that this current mess we are in is because of government, not the private sector.

    The government, under the community reinvestment act, pressured banks to lend money to people who were not truly creditworthy. They had studies showing that blacks were turned down for credit more often than whites, and they assumed the reason had to be racism. This is why so many of these mortgages were defaulted on.

    Also remember that Fannie Mae and Freddie Mac were not private enterprise but were GSEs: government sponsored entities. Some have tried to claim that the problem we are in now is because of unrestrained capitalism, when nothing could be further from the truth.

    Yes to run an economy, we should leave it alone. But we don’t, and haven’t sinnce Roosevelt. And Obama is seems determined to have a new new deal possibly leading to national health care. God help us.

    Jeff Read you seem like a very smart guy. Educate yourself on basic politcal economy. Read Hayek, Milton Friedman, Thomas Sowell. We are a free people and we do not need bureaucrats micromanaging our lives for us.

    And yes I know this is getting far off-topic from Wesnoth, but comment threads have a mind of their own.

  57. So, Eric – when is The Fury of Hayek being turned into a Wesnoth campaign, with a LISP-like spell interpreter available to players? :)

    (Trying hard to get all of the threads put back into one mesh that’s nominally ON topic…)

  58. Okay. Suggestions for getting the tedium out of Wesnoth:

    1. Reduce the number of clicks required to move units by _half_ by letting the player cycle between Prev/Next units with the keyboard, f.e. V and N. Don’t center the screen on the Prev/Next unit: do nothing if it’s already on the screen, just highlight it. Compromise: if it’s not on the screen just scroll it the barest minimum amount in order to make it show up on one of the edges. This way, moving units long distance is like alternating N – click, N – click and as the screen stays largely at the same place, you don’t even have to move the mouse around much to move many units to the same area. Alternative: don’t scroll the screen at all, if the unit is outside the screen just pop up some hovering bubble at the edge of the screen in the general direction of the unit.

    2. Group/Formation move. You know when you drag and drop multiple icons in any better window manager from one folder to another? Exactly the same idea. Select them by dragging a box, upon starting dragging mouse cursor changes into a transparent version of the icons in the same formation/layout, drag and drop them to somewhere. Movements points = the slowest unit of the formation, it would be very useful if moving the mouse around in this drag mode it would “snap” to tiles as you have a big cursor consisting of a formation of units to move around that’s hard to position exactly. It will be a bit tricky to calculate which fields to highlight as being in range as the shape of the formation will have to be taken into account (the idea is that with this movement they always keep formation i.e. their relative direction and distance from each other does not change). Also perhaps no need to drag-and-drop, perhaps just drag a selection box around them and the cursor changes instantly to a transparent formation, and just click on the target.

    3. Another kind of group/formation move: follow leader. It’d be cool because it’ d be a bit RPG-like, I can imagine making it a bit RPG-ish by that the leader pops up a usual conversation box like “Follow me, lads!” or stuff like that. The leader would usually be a hero, I think. So, select a group by dragging box, and somehow designate one unit in it as the leader. Move the leader. Everybody automatically moves to a tile that relates to the tile the leader is moving towards the same way as his current position relates to the leaders i.e. two tiles north from the leader or something like that. Toggleable option: everybody moving at full speed, or everybody moving at the speed of the smallest unit (i.e. preserve formation during moving), or everybody moving at the leader’s speed if he can.

    4. Fast Mode. All animations off, everything happening ASAP. Alternatively, attack animations are on but not stopping the player from choosing another unit, and also displaying the attack result at the beginning of the animation. Automatically use best weapon (the one the AI would use). Um, the later is a bit of cheating. OK, automatically use _primary_ weapon i.e. bow for archer.

    5. Produce and get reinforcements automatically into battle, so that you can focus on the battle. Set up a build queue at the keep f.e. 10 archers, 5 pikers. Units pop up at earliest empty castle cell, or don’t get produced if there is no empty cell. Autoproduced units automatically move towards a flag that the player can set anywhere, probably will set it slightly behind the frontline. Result: fresh troops keep arriving automatically near to the front.

  59. what’s with all this crazy On-Topic stuff?? have people forgotten which blog this is??

    libertatian leftists are micromanaging the economy by misguided gun-control of unix programming terrorists!

    (Trying hard to get all of the threads put back into one mesh that’s more in keeping with standard…)

  60. Shenpen, most of (4) is already implemented.

    (2) and (3) would need some tweaks to avoid becoming suicidal to use. In any battle it’s essential to micromanage the position of all your frontline units. Maybe it would work if follow orders were performed at the end of your turn and only by units that you haven’t moved manually, and the movement code were smart enough to keep injured units shielded.

    I can’t imagine (5) ever being useful. If you’re just cranking out troops as quickly as your income permits, ur doin it wrong.

    As I’ve said before, the right way to counteract tedium is simply for scenario authors to refrain from creating enormous battles.

  61. (2) and (3) would be moving troops into the frontlines, not waging the battle into the frontlines. The maps I played (the introductory campaign) are just too big. (5) well it depends on what you are playing, I just played the introductory campaign and it quite resembled a war of attrition, trying to produce troops faster than losing them. I may be doing it wrong.

    But actually I consider (1) my most useful and most important suggestion. Cutting the no. of clicks in half without causing any problems, that cannot be a bad thing.

  62. Tom: you’re forgetting “embed them in a functioning host system, and carefully satisfy all the non-trivial requirements for feeding it, cleaning it, watering it, exercising it, and generally keeping it healthy” :-)

    Shenpen: I think that “do one thing” becomes misguided quite rapidly as the system has to interface with the real world. Consider Scheme: very pure, and very elegant, but all the Scheme implementations that aim at doing Real Work have extended it quite a bit. Apposite Larry Wall quote: “Of course Perl’s a mess. That means it maps well onto the problem domain, which is also a mess.” BTW, not everything in Haskell is a function: some things are types. The comparative clunkiness of Haskell’s facilities for type-level programming has caused me quite a bit of frustration over the years.

    So, um, Wesnoth. Yeah. I ought to give that a try sometime :-)

  63. So, I’ve been playing through Delfador’s Memoirs now that it’s up-to-date on the campaign server. Nice writing, but I think the power of the Staff of An-Usrukhar is maybe a tad too great… I submit to you Exhibit A in support of this claim.

  64. >I think the power of the Staff of An-Usrukhar is maybe a tad too great

    Um, I didn’t invent the lightning staff — that’s been one of Delf’s attributes since day one. These scene just gives it a backstory.

  65. Yeah, but it’s a lot more powerful in DM than it is in HttT. As the replay shows, he can destroy an entire army singlehandedly because his melee and ranged attacks are both so strong that the AI won’t attack him even with its most powerful units.

  66. 1) Formal systems: programming languages:

    “There is one simple rule: everything’s a list” -> LISP -> WIN

    “There is one simple rule: everything’s a object” -> Smalltalk -> WIN

    “There is one simple rule: everything’s a function” -> Haskell, ML -> WIN

    Except these are not wins in the commercial world; these are all EPIC FAILs.

    It took me a while to get around to realizing it but you have to think in a postmodern fashion. Postmodernism is much more about local pragmatics than it is about bad art or Berkeley scrotum-inflation demonstrators. It’s about abandoning your grand narrative (one simple rule in your lingo) and adapting your actions to the situation on the ground. Let’s look at a few (admittedly handpicked) examples of programming languages which were designed by accretion, addressing specific problems real programmers have, without a grand narrative dictating their design:

    Perl – Win

    PHP – Win

    Visual Basic – Win

    C – Win

    C++ – Win

    COBOL – Win

    Hell, if you like you can add your favorite, Clipper, to the pile in its more generic form as XBase. (There are probably still Visual FoxPro applications being maintained out there, despite the product being EOLed a few years ago.)

    I love Lisp as much as the next guy, but a) it’ll never win and b) even Lisp abandoned “everything is a list” as soon as somebody wanted to crunch numbers with it. (For that sort of work the only data structure that matters, as any Real Programmer can tell you, is the Array.)

  67. actually, Lisp is a great example of the machinery catching up and the previous Accepted Wisdom being turned on its head.

    nowadays, Lisp is an EPIC Win.

    the lay-down misere unarguable example is airline booking systems. one of the hardest pounders of hardware on the planet, an optimisation problem of awesome magnitude (“travelling salesman” being delightfully apt in this case): “A standard search for a trip from New York to L.A. could have two billion possibilities”.

    the previous market Winners (eg Sabre, Galileo) were attacked late 2000 by a system written entirely in Lisp, and thrashed. market dominance within 2 years of start (AI devel group first approached by industry members in Spring 2000) (AWESOME speed of adaption). that system is now THE global market standard, runs like shit off a shovel, adapts in ~0 time to new requirements, and is entirely Lisp (except the data structures and some GUI).

    not a bad tech summary by an insider here. (Paul Graham’s blog)
    >That means that the search space for this simple trip is of the order 5000 x 5000 x 10000, and a naive program would need to do a _lot_ of computation just to validate each of these possibilities. Suitably formalized, its not even clear that the problem of finding the cheapest flight is NP-complete, since it is difficult to put a bound on the size of the solution that will result in the cheapest price. If you’re willing to dispense with restrictions on the energy in the universe, then it is actually possible to formalize the cheapest-price problem in a not-too-unreasonable way that leads to a proof of undecidability by reduction to the Post correspondance problem :-).

    only seeing occasional refs to Smalltalk (but you could argue Ruby’s “everything’s an object/method” approach is just another instance of the same concept), but am seeing growing references to Haskell in real-world environments.
    possibly they too are stepping out of academic-purity’s obscurity into commercial viability.

  68. “Postmodernism is much more about local pragmatics than it is about bad art or Berkeley scrotum-inflation demonstrators. It’s about abandoning your grand narrative (one simple rule in your lingo) and adapting your actions to the situation on the ground.”

    Well, I call that Pre-Modernism or Skeptical-Pluralistic Conservatism but let’s not argue terminology :)

    The amount of win a formal system contains does not depend on the commercial success, because commercial success comes from solving informal, ill-specified problems. And no one with any sense would use a formal system to solve those, it’s more than obvious that we use informal systems to solve those – like PHP or Perl.

    The amount of win a formal system contains is simply how useful it is to solve formal i.e. academic problems. And for that a one-simple-rule approach seems to work very well.

  69. BTW, highly informal (read: ugly, messy, bad) languages like VB(script) or PHP solve an important problem badly, and I think a good solution could and should be found for that: you don’t always know when does a given task escalate into a programming task, therefore, you don’t always have a programmer around to do it, and at the first stages of escalation, it’s not even really clear it should need a programmer, and at later stages, you have a too big thing to throw out and start over.

    In different words: programming isn’t a clearly distinct class of activity it itself but rather one end of a continous graph where the other end is configuration. (If you disagree, explain how comes that sendmail.cf evolved into being Turing-complete.)

    Example: you are an IT-savvy salesman, you set up a product price configurator in Excel with lots of SUMIF’s and using other built-in functions. It’s not considered programming. (Well, declarative programming… but it’s not consider something you need a programmer to do.) And then they find they want to do just one more thing which no built-in function does. Said salesman is no programmer, but he remembers playing with BASIC on a Commodore 64 when he was 12 years old, so he generates a VBScript macro by example and tries to make it into a new function by generalizing it, replacing hardcoded values by variables… etc. etc. He can do it, because VB is very close to English…

    Example 2: you are a sysadmin, you installed PHPBB. You realize you need a little change in functionality. You are not a programmer, but no one seems to want to do it, so you go to a forum and ask how to do it, luckily, someone points out that one of the 3000-something built-in functions of PHP does exactly that, so you can just trivially modify an example in that function’s documentation and it will work, without real programming…

    Example 3: you are a Linux sysadmin, you are not a programmer, but you have to analyze some long logs and awk and sed just don’t seem to cut it right. A friend tells you about the while() … structure of Perl…

    I think these are valid scenarios and there should be better ways to solve it…

    BTW Jeff I’m glad you remember my little perversion of loving CA-Clipper… my excuse is that a programming language with higher-order lambda functions (“code blocks”) looked like a miracle on an MS-DOS PC in 1988 and a tightly, closely integrated database model with a GUI without duplications, with a succint, get-things-done structure where you can get the basic CRUD done at the speed of about 1 hour per table – the web I think only achieved that first with Rails, around 2006 and we had them on “desktop” with Clipper in 1988… was quite an achievement.

  70. BTW such evolution from non-programming to programming happens not only with regard to a task, but in personal development too… I had my fair share of TurboPascal stuff when I was a teenager, but generally didn’t want to become a progammer. I was a manufacturing-oriented application consultant (read: configuration, training etc.) in Navision in 2002 when we realized we have to customize it and I started to write code… amazingly horrible code at first. Little control structures, just cut and paste… then I got better. And better. And better. Those old memories about nested function calls in TurboPascal came back. Then I started to take a look at general-purpose programming languages because I wanted tool to massage text files into sane formats before importing them to Navision. A friend introduced me to CCC, the Clipper-to-C++-Compiler, this is how I started to like Clipper. Then I picked up Euphoria: http://en.wikipedia.org/wiki/Euphoria_(programming_language) Then Perl. Now, that was a great tool for these text file things. Then I downloaded (ActiveState Active)Python from the same site I downloaded Perl from, just out of curiosity. Then somehow I heard about Ruby. Then about LISP. I’m still not a hacker, but I think by now I grok the essence of well, if not elegant, at least “smart” programming, this is what I’m currently playing with: http://pastebin.com/f201d8052

    The point is that such evolution doesn’t always follow the line of learn the theory, do in practice, it often goes in an Oakeshottian way: theory is something you learn as you go from non-programming to programming…

  71. >Postmodernism is much more about local pragmatics than it is about bad art or Berkeley scrotum-inflation demonstrators.

    I am not at all convinced this is true.

  72. No ontopic comments for a while, so I hope you don’t mind if I go OFF:

    Your recent remark on EconTalk, “Love doesn’t scale”, got a bit famous around the Net, InstaPundit and Samizdata saw to that.

    Question: does it mean that in theory you could agree to what this guy keeps saying: http://burkescorner.blogspot.com/ and I find myself agreeing more and more: that big-gov’t on one hand and that ugly “get of my lawn” kind of individualist egoism on the other aren’t the only two possible choices? That we indeed often do need to have our egos a bit supressed and cut down to size, that a good life isn’t about the inflating of the ego to as a big size as possible, but instead of a big-gov’t, a self-governing small community can do that job, which does it more by commonly accepted customs rather than bureaucratic procedures: exactly because love _does_ scale up to a local small-community level (but not much further) ?

  73. >big-gov’t on one hand and that ugly “get of my lawn” kind of individualist egoism on the other aren’t the only two possible choices

    Hard for me to disagree, since I don’t think I’ve made either choice. But I don’t follow Burke’s argument to the conclusions he wants, since I read it as a not-very-well-disguised version of “bend over so we can ram conservative paternalism up your ass”. I don’t like it any better than the left-wing version, thank you.

    And yes, this is off-topic here. Please wait for a relevant politics thread to pursue it.

  74. Eric,

    Regarding the suckingness of C++, how hard a sell would C# be to the Wesnoth team? With modern JIT compiler technology C# code can be fast; and with .NET on Windows and Mono ascending to dominance on Linux it is as cross-platform as you could ask for.

  75. >Regarding the suckingness of C++, how hard a sell would C# be to the Wesnoth team?

    I have no idea. It’s never come up.

  76. >Which programming language would you use for a game like Wesnoth?

    Pardon the delay in responding. Until recently I would have said “Python” with no hesitation, but it turns out Python has a technical limitation that’s serious for this kind of design – it can’t be sandboxed. We had to remove our facility for custom AIs written in Python from 1.6 because of this; it can allow security bugs from maliciously-crafted campaign downloads.

    So, today I’d respond Scheme or lua; what qualifies both is that they have first-class environments and can be sandboxed.

Leave a comment

Your email address will not be published. Required fields are marked *