Yearly Archives: 2011

You Can Now MUD on webOS (TouchPad)

Much of my not-at-work development time has been spent on webOS lately.  The TouchPad and webOS version 3.x are great fun to work with and the only mobile devices that have APIs that don’t suck to develop for (I’ve worked with Android, iOS, and Win7 and none of them are fun from a C++ developer’s perspective).

Today my Telnet application was published in the catalog.  It’s still not perfect yet, but thanks to that application it’s now possible to MUD on the TouchPad.

Client Update: Now With Alias Support

I’ve pushed another update to the Basternae client today, version 0.23.  Download is available on the sidebar, as always.

Here’s what’s changed:

  • Alias support has been added.  Usage is #alias <keyword> <text that replaces the keyword>.  Aliases are saved when you click File -> Save Settings and loaded at startup.
  • Rendering of surface map sections with T-facing-right road pieces is fixed.
  • Fixed a glitch with closing and then reopening the status, group, equipment, hotkey, and map windows.
  • Improved the initial opening position of the equipment and group windows.

Give the client a try and let me know if and how aliases need to be improved (as in, what you typically do in WinTin or ZMud that doesn’t work here yet).  I used to use aliases, but I never did anything all that complex.  Typical aliases I used were “gc” = “get all corpse”, “ik” = “cast ‘ariek’ thri-kreen”, and the like.

Also note that the client doesn’t nag you about updates.  If you want an update you have to come here looking for it.

Stop Bothering Me About Updates

First there was Windows Update. Not a big deal, it only nagged once a week at most, and you could easily turn it off if it became too annoying.

Then Adobe Update. It’s a damn document viewer, why should it need to be updated if I’m having no trouble viewing documents?

Then Flash. Java. iTunes. Web browsers. Updates for Linux, for MacOS. Even my phone goes on and on about updating itself. Every asshole program seems to have a need to whine about updates. Look, I don’t care. I know that as soon as I install an update you’re just going to start bugging me about the next update. Shut up and update yourself if you feel you must, but don’t bother me about it. Blah blah security blah blah. I don’t care. Unless a program isn’t working right for me I neither need nor need to know about updates. I don’t care how insecure my text editor is. It’s for editing text. It’s not like I store bars of gold in the damn thing.

I do not need to be nagged about a thousand stupid little programs every time I start a computer (no matter the OS). Just shut up and go away.

GTK+ Is A Very Good SDK

GTK+ is a user interface toolkit for Linux.  It serves a similar purpose to WIN32, Windows Forms, WPF, Qt, Carbon, and Cocoa.

Until recently I had only used GTK+ indirectly, through wxWidgets, which is a wrapper around the UI toolkits for Windows, Linux, MacOS, and others.  Ordinarily I’d just stick to wxWidgets so I don’t have to write similar code multiple times, but I’m working on a project with a significant download size restraint and have to keep it minimal.  The overhead wxWidgets adds is a no-no.

I have a copy of Foundations of GTK+ Development by Andrew Krause and picked up the basics through that.  As in introduction it’s a good place to start, but the book itself is all over the map and examples tend to be somewhat incomplete.  It’s obviously written by someone new to writing tech books.  I’m still glad it exists — saved quite a bit of time getting started.

GTK+ uses container-based GUI sizing and layout and relies pretty heavily on macros, but you don’t have to deal with populating tons of cobbled-together custom structs and incomprehensible parameter lists (WIN32) or deal with an ass-backward programming language like Objective-C (Cocoa).  Binding event callbacks is straightforward and you don’t need to create an event map or do any strange run loop management.

It’s quite sensible and has a well-thought-out API.  Any time you want a function to exist or want to have a control type available it’s probably there.  I was able to build four working dialogs in a day’s work and at no point was there a head-scratch “How the heck does this work?” moment.  The docs are also pretty thorough and easy to read on the site.

Well done, GTK+ team.

Win32 Visual Styles

Nothing to do with Basternae, this is just a reminder to myself how to enable the visual styles for controls available in Windows XP and newer in a WIN32 project in Visual Studio 2010.  Had to do this at work and it’s a little tough to look up.

1. Edit Project settings.
2. Under Linker->Manifest File edit “Additional Manifest Dependencies” and add:

type='win32' name='Microsoft.Windows.Common-Controls' version='' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*';%(AdditionalManifestDependencies)

Suddenly Win32 controls will stop looking like they’re from Windows 3.1.  The modern control styles were introduced in ComCtl32.dll version 6, and Windows apps use version 5 by default unless you tell them not to.

Map Improvements

It took a while, but I have the road tile changes done and in place.

In addition, the surface map shows markers for the following zones that were attached but didn’t have markers:

  • Autumnglen (Centaur Hometown)
  • Court of the Muse
  • Sarmiz’Duul
  • The Minotaur Stronghold
  • The Ice Tunnel Shaft

The client still has a few map rendering glitches that need to be cleared up — for instance, things get wonky if there’s a T-intersection with roads going north, south, and east on screen.

Client Improvements

Basternae Client version 0.22 is available now, with the following improvements:

  • All map tiles supported now. Anything before version 0.22 will look stupid on the overland map.
  • Better starting window positions — they don’t pile on top of each other now.
  • Hotkeys can be saved with File -> Save Settings.
  • You can control whether the hotkey window shows up on client startup and the number of buttons via the settings window. Be sure to save settings after you make changes for them to stick.

Since the hotkey window’s buttons are set to wrap, you can resize it to show buttons in any arrangement you like — 2×10, 4×4, 3×6, etc.

Check the right sidebar for a download link.

Another Editor Update

In the process or editing roads on the surface map to set each section of road to the right tile (east-west, corner pieces, t-intersections, etc.) I found that the editor needed some updates to accommodate the tile system.

I’ve released version 0.57 of the editor today, with map terrain editing (not useful for regular zone editors), faster room grid drawing, and better coloration for the room grid. The download link is on the right sidebar.

Road editing is about 1/3 done so far and won’t be uploaded to the server until it’s done.

Basternae Client 0.21

The first download, version 0.21 of the new WPF-based Basternae Client is now available for Windows. Check the right sidebar for a download link. I can post a version that will run via Mono on Linux or MacOS if anyone wants it.

It’s still needs a lot of work, but at least it exits properly now.  I expect you’ll find glitches. It’s a work in progress.

Tiu Has Killed The Dragon

Brave Tiu was one of the first adventurers to sally forth on the quest to kill the dragon in Dragon Wilds.

A whole village worth of corpses and some bugfixes later, the dragon lies dead at his feet.  Congratulations, Tiu, on being the first one to win the game.


In case anyone is curious about what I work on during the day, check this out:

Sign up for the beta.  Surf the web securely, circumvent firewalls, browse anonymously, and do all the wonderful things you can do with a disposable remote browser.

Works on Windows, Linux, and MacOS.

You can even use it to create a secure shortcut that will auto-login to Dragon Wilds.  And most other sites too, of course.

First Very Broken Version of the WPF-Based Client

Here’s a screenshot of the Basternae Client, version 0.20:

There are some things missing and in a few ways it’s a step back from the previous C++-based client (version 0.18 — 0.19 was never released).  However, it does work with the new map graphics.  Roads still need a little work, but that’s a server-side change.

There are some very broken things about version 0.20 of the client, and I wouldn’t recommend installing it (which is why there’s no download link).

– Aliases aren’t in yet.
– It leaks memory like a sieve.
– A bunch of ANSI color things need work.
– It doesn’t even exit properly.

It can only get better from here.

New Game: Dragon Wilds

I built this oldschool over-the-2400-baud-modem game in my spare time over the past week using Python and Django (it’s about 500 lines of source code, 500 lines of HTML templates). I don’t know whether I’m going to spend more time on it, but it was fun to build and a nice break from the to-complex-to-work-on-with-the-brainpower-I-have-left-after-work state Basternae 3 is in. If people like it I’ll probably make more of them or improve the existing game. First time I’ve done a web-only game.

Let me know if you can break it. As can be expected, there’s really not that much depth to it and you may well get tired of it quickly.

Back to WPF

A while back I made a start on building the client using WPF, the Windows Presentation Foundation. It only made sense to give it a shot since the whole MUD is based on C# and .NET.

That effort stalled due to a roadblock or two, probably because I didn’t know about routed events and partly because I didn’t understand RegEx very well. I have a better handle on regular expressions thanks to spending some time with the Django web framework.

In the process of trying to rework the C++/wxWidgets-based client to support the new tiled map graphics I’ve experienced a lot of pain. The kind of pain that can only be explained by the fact that a string is not a first-class object in C++ and that text parsing can get to be unbearable when you have a complex stream over TCP.

That has prompted me to take a look at the WPF version of the client again. Rather than being based on some ugly recursive character-by-character text processing code, it’s based primarily on regular expressions — one to parse out the ANSI codes, and one to process the XML tags for the various client data (life meter, map info, room description, etc.). The first one was done when I left off, but the second piece hadn’t been started yet. Well, it’s in place now and I can continue building the rest of the newer client.

Getting the WPF version up to and past the usability of the wxWidgets version will probably be faster than untangling the text parsing in the spaghetti code.

Client Work

John Baker has delivered a new set of artwork for the client and I’ve spent some time working on integrating it into the code.

What I’ve discovered is that the client code is rather brittle and prone to explode.  It will need some significant work before a new version is ready to release.  Testing with valgrind has helped a bit, but it still requires some heavy lifting to get right.

I started working on the client 6 years ago, long before I knew C++ very well (I’ve known C a lot longer, but it took a while to get the hang of C++ and the OO world).  The client was originally written to use the Simple DirectMedia Layer (SDL) and has had some bizarre things done to it over the years.

So — there are significant changes coming with it, but no idea when they’re coming.

Minor Data Fixes

I finally got around to taking care of two things that have been bugging me for a bit.

1. Every boot the MUD would reset the time/day/year to the first day of the first month of the first year (time zero).  Now time continues across reboots.  No more Groundhog Day.

2. The current, maximum, and record number of players data was not being kept correctly.  It is now.

They haven’t been deployed to the server yet since I’m in the middle of reworking the map engine on both the client and server for the new graphics, but when that’s done those two fixes will ride along.

Stuff After Death

Lyran mentioned that it’d pretty tough to do anything after dying above level 5 for complete lack of equipment.  I added a toggle that lets players start with newbie equipment every time they die no matter what level they are and turned it on.

Newbie equipment isn’t exactly a huge advantage, so it might be worth leaving that on permanently.  It’s bad enough that you lose your sword +5, no reason you should have to walk around barefoot with no pants on.  A level 6 adventurer shouldn’t find it too hard to scrounge up 2 silver pieces worth of equipment anyhow.