Tuesday, December 13, 2011

Year End Event at Alter Aeon

We'd like to welcome everyone to the year-end celebration at Alter Aeon!

Starting on the 21st of December and going through new years eve, we plan to have a number of things going on:

  • The release of a new low level area near Indira

    As part of our ongoing efforts to give level 8-12 players more quests and areas to explore, we'll be opening a brand new area north of the Old Indira Forest on the island of Kordan.

  • A major update to the troll caves on Archais

    Originally created over 15 years ago, the troll caves were recently taken offline and given a major makeover. We'll be officially opening the updated area, which should now be suitable for levels 24-30.

  • The release of a new high level stone giant area west of Finspang

    This area, created by the original builder of the Undead City of Jo'Kerin, shows a different side of stone giants. If you're only familiar with the giants that reside in the Ash Mountains, you'll be surprised.

  • An object creation contest, open to everyone (this is currently running and submissions will close on Dec 23rd)

  • Daily gifts will be given out to everyone who logs in!

  • Several different minor contests and activities similar to the famous Halloween Pumpkin Cannon

We'll also be running sales on various credit purchases in game if you're into that sort of thing.

I'll post a more detailed schedule closer to the 21st. We hope to see you there!

Tuesday, November 1, 2011

Playerbase and Userload

When it comes to growing a playerbase, I've become more convinced than ever that it's got to be a staged process unless you have a LOT of money to blow on it. Having a lot of money is in fact how a lot of big MMOs handle growth - when they officially open, they basically go to full capacity overnight. This means that they can focus all of their development effort on one specific expected player load, and don't have to worry about nursing a small user base through the various stages to become a large user base.

This whole staged growth process has become a lot more apparent to me over the last couple of years:

  • When the player base is very small, it attracts a certain class of isolationist explorer player, one that doesn't need much in terms of a help system, documentation, or maps.

  • A bit larger and you start to get power levelers that like to compete with each other for in-game prestige.

  • Larger still and you start to get quasi-social players, players who like to group with others and help out. They don't show up earlier because explorers don't like to group, but with power levelers there's someone to group with and someone to help. This stage is an easy place to stall at, because these quasi-social players do not have the thickest hides and are less competitive than the power levelers; if they are abused by the power levelers, they will simply leave.

    Power levelers tend to form small cliques with these quasi-social players, and then drive off all other quasi-social players not in their clique. This appears to happen because the power levelers in one clique, competing against those in another clique, try to get an advantage by driving off the other clique's support staff.

    If restrictions, rules, and code are not put in place to protect them, the quasi-social players will never reach critical mass and will cycle out as fast as they cycle in.

  • The next stage brings in true socialites, players that typically gain levels only as a side effect of being in a group that is running experience while they chat.

    True socialites are another huge rats nest of problems. They tend to be drama queens or drama magnets, and are as capable of stirring up political *CENSORED*storms as they are of keeping other players interested and happy. There isn't a lot that can be done about this, other than to shutdown flamewars and ensure that rumors about admin 'unfairness' are killed immediately.

    True socialites are heavily looked down upon by the explorer and power leveler communities, and they must be given substantial protection from abuse. Unfortunately, socialites can tolerate a lot of abuse - unfortunate because when they take abuse, they dish it back out tenfold in the form of bitching to other players. One sufficiently pissed off socialite that isn't immediately shut down can crater the happiness and opinions of two dozen other players.

  • The last stage that I have familiarity with is the 'true newbie' stage. This is where you get true newbies coming in, and your game has progressed far enough that true newbies are actually able to make some forward progress.

    True newbies are a huge problem. From a technical standpoint, they are generally completely ignorant of the game style, and the newbie areas must be very well built to retain even a fraction of them. This category also appears to contain the largest percentage of 'low functioning' individuals - I do not mean that as an insult, rather an observation. Not everyone has the mental capacity to be an explorer or a power leveler.

    These new players must be afforded additional protections that even the socialites did not require. I'm still working out the details of a lot of this, but a good chunk of it amounts to protecting these players from themselves.

These are just the social problems. There are also scaling issues, each of which presents a 'critical mass' hurdle that must be passed. Certain areas may require a minimum number of players to be handled; assembling a group of that many players may be impossible below a certain user load. In the case of Alter Aeon, many of the automatic control systems rely on statistical data to function correctly. With few players, the lag time on getting statistically relevant data may be literally months.

This kind of lag time really hinders the ability of a game to make quick and effective updates to increase retention. If you have a thousand new character creations per day, you can pretty quickly determine if a change is an improvement or not. If you have one new character creation per day, it becomes very difficult to determine if you're doing the right thing. I suspect this is at least part of the reason that MMOs take out funding in order to start big and improve the game quickly.

I think at Alter Aeon, we're past a lot of these initial hurdles, and could probably reboot the game from scratch pretty quickly; once you get the various protections in place, they remain largely functional even though they fall into disrepair at higher userloads.

That said, I know there are bigger, nastier hurdles ahead of us.  I just don't know what they are (yet.)

Wednesday, October 26, 2011

Halloween 2011 Events!

If you like vampires, mummies, demons and other things that go bump in the night...

Stock up on supplies and get ready for a fight.

Come see us on October twenty-ninth, it all starts at midnight.

This friday night/saturday morning at midnight, a new area will be opening in the land of Alter Aeon.  This place is known as the nightmare plane - little is known of it as yet, but if the name is any hint it sounds terrifying.

This new high level area, months in the making, consists of nearly 350 rooms, over 150 beasties and a host of new fame and fortunes waiting to be found.  Over a half a dozen new quests lines are available to explore.

All day sunday, we will be running arena and other events every few hours to give everyone a chance to participate and say hello.  We'll have novelty items and prizes for everyone.

On sunday night/monday morning at midnight, an invasion will begin, with incursions all day on Halloween.  There will be prizes for all levels outside of the new player zones.

New this year is a special quest zone to help stop the invasion and get a permanent deed added to your character.  This zone is set up to allow groups to progress at their own pace without interference from other players or groups that may also be trying to stop the invasion.

We hope to see you there!

Monday, September 26, 2011

wxWidgets keyboard handling

The cross platform code that isn't.

A couple of weeks ago, another piece of wxWidgets infrastructure in the Alter Aeon client was replaced with custom code.  This time, it was the bulk of the keyboard handling code that fell in battle.

In theory, the wxWidgets keyPressEvent is where you should trap out various key combinations; things like 'a', the escape key, and 'control-c' pairs.  Certainly under linux, nearly all of these worked correctly, and the ones that didn't were obscure and not really worth hunting down.  When I first ported to Win32, all that changed.

In Win32 builds, a lot of keys were not handled by the key press event.  You'd press the key combination, and nothing would happen.  It was like the operating system was trapping out the key combination and never bothering to pass it up the stack.  As it turns out, that's pretty much exactly what was happening.

I did eventually get the Win32 builds to work by intercepting a handful of keys at the keyDownEvent and keyUpEvent layers.  When I finally found these, it was hugely helpful; in the end, I trapped on the order of 30 key combinations to do away with things like annoying system beeps and idiotic behavior of the default keystrokes, in addition to handling our own special control combinations.

Enter Mac OSX.  Enter a whole new raft of keyboard weirdness.  I hacked on this for about an hour, and quickly realized that I was on the path to madness.  The code was becoming a rat's nest of ifdefs with key combinations trapped out in multiple different layers in different operating systems.

About the only thing that could be called consistent between any of the operating systems was that the keyDownEvent and keyUpEvent were always reliable.  The solution then seemed obvious:  move everything down into the keyDownEvent, and ignore everything else.  Intercept the keyboard control -before- wxWidgets could do anything stupid with it.

Keyboard control now works consistently and reliably on all three platforms.

Monday, September 19, 2011

2011 Cleric Class Update

The 2011 Alter Aeon "Cleric Update" is now live!  This update contains a lot of changes to improve traditional cleric spells, add a new mode of casting for mages, and clean up other spells and skills that have traditionally not been as awesome as they could be.  Here's a list of the most major changes:

- Mages now have the ability to 'channelcast' (ccast) certain elemental spells in combat.  Channelcasting takes longer than regular casting, but is interruptible and costs substantially less mana.  This feature allows mages to become a true 'blaster' class without compromising healing mana.

The channel casting skills are 'fire focusing', 'ice focusing', 'lightning focusing' and 'crystal focusin'.  The fire plane is easiest to reach, and hence it's the lowest level and easiest to channel.  The crystal plane is much harder to reach and only high level mages will be able to channel from it.

- Added a necromancer spell 'bone dragon', which allows you to fly around over the landscape.

- Ice imprison and crystal prison have been updated.

- Ward good and ward evil are now more powerful.

- The charm spell has been updated to make it easier to land and to use control points similar to controlled necromancer minions.

- The peace spell has been improved.

- A level 19 curse, 'overconfidence', has been added.
- A level 19 spell, 'hold undead', has been added.
- A level 28 spell, 'sacred touch', has been added.
- A level 29 spell, 'solace', has been added.

As always, you can use the 'spell find' commands to find the teachers or trainers for new spells and skills.

For those of you who don't know anything about us, Alter Aeon is a multiplayer text-based game with a lot of features and settings to help make it blind-friendly. Over half our playerbase is blind or visually impaired, and we have blind builders and staff helping to expand and improve the game.

Everyone is welcome to play, so if you're new to the game feel free to stop by and check us out.  For more information and soundpack downloads, see our web site at:


Happy hunting!

Friday, September 9, 2011

I'd like to announce the release of the Alter Aeon client version 1.089, which makes this the first official 'non-beta-numbered' release.  An awful lot of updates and effort went into this revision.  Here's a short list of the big feature updates:

- Full, non-beta MacOSX support, including versions of MacOSX from 10.5 forward.  Unfortunately, we don't support the older PPC macs, just newer Intel based ones.

- We've submitted the Mac version of the client to the Mac App Store, and hopefully you'll be able to get it there for free in the next few days!

- The graphical rendering system has been pretty much completely gutted and rewritten.  This makes the client faster and more consistent between different versions of windows.  This got rid of a lot of bugs with different service packs.

- The keyboard handling has been rewritten to use low level keyboard codes for pretty much everything.  This also gets rid of a lot of service pack bugs that we could never track down before.

- Lots of performance and memory optimizations, to make things run faster and more smoothly

- You can now change the font on buttons and the map

In a lot of ways, this was a sort of 'maintenance' release, where we weren't trying to add features so much as make the existing features work as smoothly and correctly as we can.

Of course, this means the next release will probably start adding features again.  We have a lot of neat ideas queued up, so expect to start seeing some of them here in the next few months.  Until then, you can download the new Alter Aeon 1.089 client version at:


Happy hunting!

Wednesday, July 13, 2011

We're famous! (Again!)

If you've ever tried to get attention in the gaming world, you know how well-neigh impossible it is. There are literally tens of thousands of game developers of every budget category, from the smallest single-person outfits to kings like Blizzard and CCP. Even getting someone to review your game can sometimes be a lost cause.

With that as a backdrop, Alter Aeon this weekend got a spontaneous review on the GamingHUD web site. This is a pretty big website that reviews a lot of mainstream games. For AA to even be seen by fish of this size is pretty amazing.

The review also isn't some slapdash piece of filler material. The reviewer spent a lot of time on the game and even emailed me for additional information. The final article came out very positive and very long.

The link is:

Alter Aeon MUD - A World of Infinite Possibilities

Feel free to check it out and maybe drop a thank you to the author for their hard work.

Saturday, July 9, 2011

wxWidgets GTK font rendering

In my previous post, I managed to fix the bugs in wxDC::DrawPoint() by using my own custom drawing class. Unfortunately, a lot of the places I where I used DrawPoint were also places where I needed to draw text, and in order to draw text I needed a wxDC. No problem, I'll just draw the text using a temporary wxMemoryDC on the bitmap, and to make sure there's no clobbering problems I'll make sure that I don't intermingle direct drawing scope with the DC object scope.

This appeared to work, except for the scrolling/updating windows. For some reason, even though there was a Clear() call before the font rendering, the windows would never clear. If I destroyed and recreated the bitmap every time, it worked fine but was very slow. If I cleared after drawing the text, the clear worked. If I cleared before drawing the text, the clear did not work.

Eventually I figured out the reason:

Under wxGTK, wxDC drawing and rendering are done to a separate bitmap/bitmap layer that is permanently attached to the real bitmap. When font data is drawn using wxDC::DrawText(), the text is drawn to the hidden layer, then the hidden layer is blitted in its entirety on top of the real bitmap. The end result is that anything you do prior to constructing the DC and rendering text with that DC is overwritten/deleted when the DC destructs.

Just how the hell does this make any sense? Nevermind, forget I asked. On the plus side, this explains why full screen font rendering is so slow in wxGTK. I never could figure that part of it out.

For roughly a day, I was utterly at a loss when faced with this problem. Switch back to the old code and lose the MacOS X platform; stay with the new code and lose wxGTK (and possibly other platforms, I only ever tested it on GTK.) I couldn't even think of a way to work around it.

Eventually, a possible solution presented itself: add font rendering to my custom bitmap class. I wasn't real clear on how to do this at first, but the key breakthrough came when I realized I could just use a cheap glyph rendering scheme. Use wxDC to draw each of the letters I needed (ascii chars 32 through 126) into tiny, clean bitmaps, then use a modified alpha channel copy routine to draw them to my custom bitmaps.

I'm proud to say that I now have proper text rendering and graphical drawing primitives on all three platforms. And to think that all I needed to do was rewrite the entire wxDC rendering system to do it!

I should have just done it in the first place, as I recommended to myself in a past life. Sometimes our older selves are no wiser than we are in youth.

wxDC DrawPoint broken under wxMAC

To follow up on my previous post, I had written my own routines for handling alpha channel support under wxWidgets, and finally everything seemed to be working properly. Both Win32 and Linux/GTK builds seemed to work exactly as expected using my alpha channel bitmaps where I needed them. For most other places, I still used wxDC primitives, as wxDC direct drawing seemed to be a bit faster than going through a bitmap/blit interface, and I still needed to use wxDC to render fonts.

I figured porting to MacOS X would be a snap, and for the most part it wasn't too bad. There were some issues with Repaint() not working the same, but adding a few explicit paint calls in the right place fixed that up.

However, something was wrong with some of the graphics in the various windows. The sky bar, normally with lots of little stars in it, still had stars in it, but instead of one pixel there were two: one at offset (0, 0), and one at offset (1, 1). I also noticed 'fuzz' on the corners of various windows and buttons, and in a handful of other locations.

Long story short, wxDC::DrawPoint() draws two pixels under wxMAC. Not one, but two. I found a couple bug reports regarding this from a few years ago, where it was basically acknowledged as a "verified bug", and the ticket was never closed. Advice was "these routines are slow and shouldn't be used for high performance drawing". Thanks guys.

I have some mighty fine choice words to say to the developers regarding this, but I'll try to keep this post on topic.

If something as fundamental as DrawPoint() is malfunctioning on a major development platform, I figured it would probably be a good idea to transition away from the classes that implement it in favor of my own drawing routines. So, I started using my bitmap class, which just happens to have a DrawPixel() function that works properly.

As expected, this fixed the drawing problems on all three platforms. But alas, using my bitmap class exposed another set of very nasty wx bugs, which I'll discuss in the next post.

wxwidgets has no alpha channel

A few months after I ported the Alter Aeon client to the wxWidgets toolkit, I decided I wanted to add alpha overlay support to the automap and main window.

Encouragingly enough, this appeared to be trivially supported: wxColor included an alpha value, bitmaps could be defined as having an alpha channel, etc. Pretty much everything looked good to go, so I started experimenting with it.

Alas, it was not to be. It turns out that there are precisely three places where the alpha channel is used:

1) loading a PNG from PNG data that has an alpha channel,
2) drawing a bitmap containing alpha channel data using wxDC::DrawBitmap, and
3) wxDC::DrawText, which politely draws text on top of the underlying pixels.

For all other locations, there simply should have been this assert:

wxASSERT("Alpha channel is stubbed here and works on precisely zero platforms ever, ha ha, the joke is on you")

After upgrading to wx 2.9 and a pile of scouting around, I came across wx/rawbmp.h, which has some direct access functions that allow access to the alpha channel. With this, I managed to get alpha channel working - but there were other problems with 2.9, so I downgraded back to stable, 2.8.12.

The alpha channel code that worked under 2.9 works properly under wx 2.8.12 in wxMAC and wxGTK, but apparently isn't implemented under Win32, which happens to be my main development platform.

Rather than bash my skull repeatedly against the wall, I did what any sane developer would do: throw out the broken toolkit module, and write one that works. In the end, I ended up with a wxBitmap derived class that has drawing functions that actually work properly and support alpha channel drawing when I need them to.

However, there's a problem with this as well, which I'll detail in a later post.

Friday, July 1, 2011

Future Plans - Clerics

The cleric class has long languished - not because it was useless, but because until recently there wasn't a lot of reason to have a really high cleric level. Prior to the 2010 christmas expansion, there weren't a lot of cleric spells or skills above level 30; and many cleric spells didn't scale in power as you gained levels, like mage and necromancer spells do.

As a result, cleric has been a useful, powerful class - but not something you want to be your primary. Our future update to cleric aims to change that.

The biggest updates to the class aren't likely to be new spells and skills. Rather, we want to fix existing spells and skills that aren't up to snuff with the rest of the class.

Take for example the 'peace' spell. This could be a very powerful, useful spell - if only it worked differently. We're currently imagining room effects, duration effects, and a handful of other options to improve this.

Another spell that's long been on the todo list is charm. The current version of charm has basically been dented into the ground to prevent charm armies. With this update, we're planning to switch it to a control point system similar to necromancers. This should make charm a lot more useful while at the same time limiting "charmy" problems.

Other things that could use similar kinds of improvement are turn undead, the ward spells, curses, and the monitor skill.

All this said, we do plan to add more spells and skills. So far these hit most of the major groups - character buffs and enhancement, a possible brew skill, some new curses, new damage spells, and a new undead spell.

The schedule for this is some time in august, about a month after the thief updates of the previous post. After this, we still have a ton of things to work on, including elemental channeling for mages, god code, and a couple of new character classes.

Thursday, June 23, 2011

Future Plans - Thieves

Now that level 35 is installed and running in the game, I figure it's probably a good idea to let everyone know about the game's direction and where we're headed. Things aren't going to be static; there's a lot of really neat stuff planned out for this year.

The next major update is scheduled for some time around mid to end of July. The focus of this update will be the Thief class, which is currently the least played class in terms of high levels, and the class with the fewest skills.

At a minimum, the thief update will include an entire tree for shadow skills. I'm not a fan of traditional ninja skills though, so don't expect Naruto style effects. The basis for the shadow skills will be a type of channeling/synergy with the shadow plane, which has already made itself known with the Guildmaster Assassin in Jo'Kerin.

Also on the high priority list are a couple of miscellaneous skills ('untanking' in group combat, room analysis out of combat), and updates to lock picking to make it more incremental and less hit or miss.

For medium priority stuff that might get implemented, we have disguise skills, bribe improvements, and haggling (possibly for bulk purchases.) My guess is that at least some of this will get into the final build.

For low priority, we've been mulling over the idea of distraction skills, but the effects are pretty ill defined right now. We also really need to take a look at the way poison damage is done, to try to make poisons function in a reasonable way. It's pretty unlikely that either of these will be done for the update.

That concludes things for the proposed thief update. Again, we hope to have it out prior to August. I think it will address a lot of the shortcomings of the thief class, without necessarily making thief into another fighter class with differently named skills.

Coming up next - clerics get some love too.

Saturday, April 9, 2011

Alter Aeon Area Openings

Draak and Shadowfax have been working for years on the Naginag Combine, and they've just completed another major expansion to it. Here is the official announcement, copied from board 8 in-game, from Shadowfax.


I am proud to announce the opening of the city of West Naginag and its sister area, the village of Ooahu. Usually we open areas with little fanfare, but these areas deserve special mention for a number of reasons.

Just the sheer amount of effort and time that has been put into this project is remarkable. Ten years ago, Draak and I came up the concept of the Naginag Combine. The idea was to build a collection of interrelated areas that were all part of the same empire. We showed Dentin our plans and released the first Combine area in 2002, what is now Draj and Zin. In response to the positive feedback about that area, we scheduled more Combine areas to build. I drew a picture of West Naginag during the summer of 2003. Now, after nearly eight years, it's finally finished.

West Naginag and Ooahu are a lynchpin that tie all of the mainland Combine areas together. We left it for last, but it also took so long to make because I wanted it to be perfect. Whether you want to immerse yourself in the lore, play through engaging quests, or just get some fame, eq or good xp, these areas should have something for everyone.

Once again we push the code to the limit, introducing consumables with custom spells, rechargable wands, mobs that make full use of necromancer abilities, "wearable" objects for your inventory, epic quests that unlock the secrets of the region, and a host of other fun little goodies for your enjoyment.

Friday, February 25, 2011

If you do it more than once, write a script...

There's a saying often used by Unix System Administrators: if you're going to do it more than once, write code to do it for you. For the last few days, I've been writing code to handle clan equipment automatically, so I don't have to be involved.

This has been a very time-consuming process, so much so that you might be tempted to ask, "if it's going to take so long, why not just do it by hand?" And indeed, that's tempting.

But one of the things that has occurred to me writing this code is that clan equipment is simply a complex process. Every single line of code I've written reflects some check, some detail that I would have had to remember and check manually. Each of these details is important. And the odds of me remembering them all when I do it by hand are near zero.

In short, while doing it by hand would definitely be faster in the short term, it's basically guaranteed to be wrong. And I've got direct proof of this while I'm looking at the existing clan items - they're spread out across the vnum ranges completely at random, built and set up in different ways by different builders, with some of them violating various constraints and some not. It's a complete mess.

That is what 15 years of doing it manually looks like, and that's why I'm not going to allow it to be done manually anymore. I am replacing myself with a (not so short) set of scripts. I'm ok with that, because those scripts will do a better job than I would have.

Sunday, January 9, 2011


When we released the necromancer expansion back in November, I expected a pretty large spike of new players. I figured we'd get a bunch of new people from the announcement, but also a lot of high levels would want to try out the new class from scratch to see how it worked.

And new players we got; perhaps four times as many as usual, which again was about what I expected. What I didn't expect was that we would be nearly incapable of handling them in terms of areas and content. There wasn't really any fighting over equipment and quests, but from time to time it seemed newbies literally had to queue up to get their turn at a particular quest item.

This got me thinking about scaling. If we can't effectively handle four times the standard newbie load, we'll be limited to a player base less than four times the size of our current one. And it's not just newbie areas; we have to think about it everywhere, from areas to exp thwacking to the who list to the the size of Ralnoth. We might not have five hundred people logged in right now, but even if we did the game probably couldn't handle them all.

Here are some things I think could help with that:

- Instancing. Instancing allows you to create private copies of areas for players, so that they don't interfere with each other. This is great for quests, in that each player or group can be on their own private copy of the quest, and don't need to worry about someone else getting through it first and taking the quest item. Judicious use of instancing can help eliminate quest bottlenecks, and it makes the world seem a lot bigger than it really is.

- Gold and experience thwacking. Right now, gold and experience are thwacked globally, so that if a mob is run too much the returns on it drop for everyone. This is fundamentally dependent on the number of players; a better way would be to put thwacking on individual players, so that the actions of one player don't break the game for someone else.

- Item maxload. Having limited load on items is another thing that's fundamentally dependent on the number of players. Once the player load rises to a certain level, a maxloaded or rarity-based item will simply never load again. Maxload and rarity effectively need to be removed to fix this.

- The who listings, and other display systems. Having a five hundred person who list would be ridiculous. Beyond a certain point, you pretty much have to switch to a query system instead of a global listing system.

Some of this stuff is already in transit or is being worked on; in particular, instancing was booted in earlier this evening and is being tested as we speak. Maxload for the most part was phased out last week.

It's a decent start. One bottleneck at a time...