Category Archives: Programming

Building software.

Multiverse MMO Engine

There’s a game engine designed for building massively multiplayer online games.  It’s called Multiverse.  It was originally a proprietary engine, but it went open source at the beginning of the year when the company that created it went out of business.

I played with it a bit back in 2010 before I left Ohio.  When I moved to California in the second half of 2010 I ended up working in the same building as Multiverse, Inc.  They were winding down the company when I arrived and I ended up buying one of their old computers, a monitor, and an office chair.  I met the founder, Bill Turpin, who also happened to work with the database admin where I was working when they were both at Netscape.

A while later they open sourced the project.  I didn’t have the spare attention cycles to dig into it for the first few months, but started tinkering with it again in April.  It’s a lot of fun to play with, but needs a lot of work, especially in the ease-of-use area.

I joined the development team and have been contributing the occasional bugfix.  To find out more visit this website:

www.multiversemmo.com

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.

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='6.0.0.0' 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.

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

http://dragonwilds.com

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.

A Dozen More Spells Working

These spells were made to work today:

Water Elementalist

* Blending
* Minor Blending
* Tide of the Seas
* Water Bolt
* Dispel Magic

Air Elementalist

* Coldshield

Earth Elementalist

* Dirt Cloud

Fire Elementalist

* Fireskin
* Fireshield

Paladin

* Judgement

Anti-Paladin

* Apocalypse

Cleric

* Soulshield

C#: Compiling For 32-bit Systems on 64-bit

I recently upgraded from 32-bit Vista to 64-bit Windows 7.  I may be one of the only people who didn’t have anything bad to say about Vista.  For me it was a huge step up from Windows XP, but since I have 6GB of RAM in my system it’s a little silly to run a 32-bit OS.

I understand the differences between 32-bit and 64-bit C++ code behavior quite well, but I really haven’t spent any time digging into the differences between 32-bit and 64-bit .NET IL code.  Apparently it’s all quite a bit simpler in managed code.

Just right-click on a project, click properties, click on the build tab, and then select “x86” under “Platform Target”.

A Bunch of Spells

Nearly three dozen spells were made functional today:

Air Elementalist

* Airy Starshell
* Hypnotic Pattern
* Telekinesis

Cleric

* Create Water
* Detect Poison
* Group Heal
* Know Alignment
* Silence
* Turn Undead

Druid

* Analyze Balance
* Harbor of Balance
* Twilight

Earth Elementalist

* Earthen Starshell
* Earthen Tomb
* Stornogs Spheres

Fire Elementalist

* Fiery Starshell
* Group Globe

Illusionist

* Cowardice
* Demi Shadow Magic
* Dispel Invisible
* Hypnotic Pattern
* Mirage Arcana
* Mass Invisibility
* Misdirection
* Phantasmal Killer

Necromancer

* Cloak of Fear
* Heal Undead
* Protect Undead

Ranger

* Dazzle

Shaman

* Greater Ravenflight
* Greater Sustenance

Sorcerer

* Infravision
* Meteor Swarm

Water Elementalist

* Adaptation
* Watery Starshell

In addition, some immortal commands were improved to make development easier and some “to caster” spell messages that were previously not shown are now shown.

Damage type vulnerability, which had only been partially implemented, is fully functional now.

A Few Spell Fixes

I think I remembered what I was working on — spells.

Ten more spells were made functional today:

Air Elementalist

* Chill of the Windsaber
* Hurricane

Cleric

* Destroy Undead

Druid

* Sunburst
* Sunray

Illusionist

* Shadow Magic

Psionicist

* Detonate
* Neural Fragmentation

Shaman

* Greater Mending

Water Elementalist

* Tidal Wave

Visual Studio 2010

Three months ago I switched from Visual Studio 2008 to Visual Studio 2010 as my main development environment.  Functionally it’s the same as it’s always been, but there are two things about it I consider great improvements.

First, the UI:  It looks so a lot better and cleaner than earlier versions.  It’s not that older versions were ugly, but it has a cleaner look and is much easier on the eye.

Next, C++ Development:  For the last few versions of VS, C++ developers have pretty much been shafted — no real feature improvements for the most part with all the love going to C#.  C++ received a major boost, gaining just-in-time compilation and error-detection intellisense almost exactly like C# has always had.  It doesn’t sound like a big deal, but it is excellent for speeding up the code-compile-fix cycle.

Only a small portion of Basternae code is in C++, just the client and the Basternae 2 to 3 zone converter, but it is a lot more pleasant to write with Visual Studio 2010.

This project started on Visual Studio 2003, so now we’ve been through four versions.