tag:blogger.com,1999:blog-56447170580531343612024-02-20T06:30:08.127-08:00The Mob Factory - Alter Aeon MUDThoughts on MUD development, ideas, and future directions from the creator of the Alter Aeon RPG.Dennis Townehttp://www.blogger.com/profile/06922699653580330541noreply@blogger.comBlogger142125tag:blogger.com,1999:blog-5644717058053134361.post-86793810149121604012014-01-15T11:05:00.000-08:002014-01-15T11:05:46.061-08:00Alter Aeon 19th anniversary - already?This week is the 19th anniversary of Alter Aeon. Some time in the middle of January of 1995, I sat down and started writing the first code for what would become a major part of my life, a project that would land me jobs and teach me a lot about software engineering and project management. It actually seems like a long time ago now.<br>
<br>
I've traditionally been the one to run the anniversary events, but I think next year I'm going to delegate it to other people. As much as players like events, they make me hate my life. Running an event is much harder work than people seem to realize; most event based things are one shot, so you don't really get to test them very well, and there's always something wrong. The content is one use, or limited use, so you know it probably won't be reused when it's done. I constantly feel like I'm just building things just to throw them away a week later, and that bothers me quite a bit.<br>
<br>
All this said, it is almost always a good idea for me to personally run events, because it forces me to improve our codebase to support my ideas. Whenever I build an area, whenever I run an event, I invariably end up needing some trivial piece of code that really improves our ability to script things in the game. A number of really awesome dproc features have come about that way, and this year is no exception, with the addition of truly global data that allows dprocs to talk to each other from anywhere on the server.<br>
<br>
Like anything in life, it's a tradeoff. As much as I don't want to run the event next year, I probably will, and the game will be better for it.<br>
<br>Dennis Townehttp://www.blogger.com/profile/06922699653580330541noreply@blogger.com0tag:blogger.com,1999:blog-5644717058053134361.post-3852165405680412392013-12-01T11:17:00.000-08:002013-12-01T11:17:14.914-08:00Releasing a new class - DruidIt took a lot of effort, but we managed to release a new class, Druid, right on schedule. The actual core implementation of the mechanics and code only took about two full months; the hard part was the entropy, coming up with ideas. But ideas aren't really the hard part: if you ask your players for ideas, you'll get a steaming pile of hundreds of them. Ideas are easy. Good ideas that fit a model and work well together are not nearly so easy. I've been collecting good ideas that work together well for a few years now, and I needed pretty much all of them to make the class unique and not just a carbon copy of other classes.<br>
<br>
Personally, I feel that just copying spells, skills, and classes is a bad idea, and while it might work in the short term to get content and features out the door quickly, I think it detracts from the long-term viability of a game. Part of what makes a long term game successful is how the pieces interact, the way you can get unexpected effects by strange configurations. Consider minecraft, a game with substantial complexity built on an extremely simple model and small set of ideas.<br>
<br>
Unfortunately, holding new classes to such high standards means that I can't create many of them quickly. I would like to add a couple more classes if possible, but there might not actually be enough new and unique things left to do it. Over time, new mechanics will be added that might allow it, but it will probably be at least a couple of years before we have another class release.<br>
<br>
I suppose my overall point is this: if you value the long term, don't cheese your game mechanics. Do it well, or not at all. Make something that surprises you from time to time, something that fits in with other stuff in the game, something which can't be done (or can't easily be done) in other ways. If you can't find a way to make races unique and interesting, don't add them. If you can't build a new class without photocopying existing effects from other classes, don't do it at all. Better to keep things sparse than pollute the game with uninteresting noise.<br>
<br>
With this in mind, I'm proud to say that I'm happy with the new Druid class, as I was with the Necromancer class when it came out in 2010. They're both very well designed, and I'm certain the new Druid skills will make Alter Aeon and even better place to be. That's a pretty high bar.<br>
<br>
Here's the official release announcement for the new class.<br>
<br>
<hr>
<b>Druid Class Expansion on Alter Aeon</b><br>
<br>
The long awaited sixth character class, Druid, has been released on Alter Aeon! Players can now add Druid powers to those of the other classes to create new skillset combinations and strengthen their characters.<br>
<br>
This new character class adds a number of new abilities:<br>
<br>
- control of the weather, to make storms and call lightning<br>
<br>
- rune carving and runic enchantments<br>
<br>
- magically controlling and growing plants<br>
<br>
- animal lore and handling<br>
<br>
- summon wind and dust storms to hinder your enemies<br>
<br>
- use minions summoned from the earth to assist you in battle<br>
<br>
- brew tinctures and salves for new special effects<br>
<br>
- new item crafting skills using carving and runes<br>
<br>
In addition to all this, it is now December, and the year-end Advent Calendar is now running! Log in for your daily advent calendar gifts, including practices, credits, storage locker time, unique items, and more.<br>
<br>
Releases this big only happen every few years, so stop by and check it out!<br>
<br>
Alter Aeon MUD<br>
<a href="http://www.alteraeon.com">http://www.alteraeon.com</a><br>
<br>
Dennis Townehttp://www.blogger.com/profile/06922699653580330541noreply@blogger.com0tag:blogger.com,1999:blog-5644717058053134361.post-14359936714898896062013-05-23T15:46:00.000-07:002013-05-23T15:46:54.894-07:00Test cases are awesomeOne of my major background projects for the past few months has been to extract common libraries from various codebases, and get everything into a global, unified tree. As an example of this, I have a set of string utility routines I've been using for many years, and my normal way of using them was to grab and copy the code into various projects as I needed it. For routines as well-defined as these, it wasn't really a problem, but for anything even remotely more complex, it becomes a huge maintenance nightmare.<br>
<br>
As part of this consolidation, I now have around 20 standalone library parts I can pretty easily use. There's a unified notify/error reporting mechanism, but most importantly for the purposes of this post, there are test cases. Lots of test cases.<br>
<br>
I have traditionally done very little in the way of formalized testing, but by the same token, I've only recently started switching to a true 'library' structure for my code. It turns out that test cases are way more powerful and useful than I ever gave credit to.<br>
<br>
So how do these test cases work? First, the build system compiles all the libraries, then it automatically builds and runs all the test cases for them. Every time. Running all the test cases currently adds about four seconds to the build time, which I can live with. I also make sure to update the test cases as I find bugs in general usage - it's very hard to guess all the bugs that might happen in advance, so putting in new tests as bugs are discovered is pretty important.<br>
<br>
Part of the reason this is so powerful is that it's changed my debugging method for most of the library code. I get a questionable result in the mainline, so instead of trying to debug the mainline, I go add a test case and fix the library before I even try the mainline code again. Usually after doing that, the mainline bug goes away.<br>
<br>
Another reason the tests are so powerful is because you never have to worry about regressions, or if something you changed accidentally breaks something else. You've also got simple, clear, and obvious code that demonstrates how to use the module in question, including ways to abuse it which produce well understood errors.<br>
<br>
The downside to doing this is time and effort. A lot of time and effort. If I had to hazard a guess, I'd say that building proper libraries and the associated test cases takes 3-4 times as much work as just hacking something together that functions. The key to making libraries pay off is to make up for the difference one of two areas: long term maintenance, and use in multiple projects.<br>
<br>
If you expect to maintain a project for many years, you -might- make up the difference in maintenance costs.<br>
<br>
If you expect to use the library in at least 3 projects, you will make up the difference in implementation time.<br>
<br>
Another downside is that building libraries and test cases is decidedly unglamorous. There's nothing cool about it, nothing you can really show anybody, and if you do try to show someone, you'll get a response like "it took you 12 hours to code up a way to do dns lookup from inside the game server?" The thing that will be missing is that along the way, you added a platform independent threading and mutex model as well as an async DNS caching system. Users will see those words and think 'blah blah', and wonder why your time wasn't spent doing something productive.<br>
<br>
Anyway, I'm sold. I'll be adding a lot more test cases in the future.<br>
<br>Dennis Townehttp://www.blogger.com/profile/06922699653580330541noreply@blogger.com2tag:blogger.com,1999:blog-5644717058053134361.post-48053134381124750232013-02-14T10:45:00.000-08:002013-02-14T10:45:38.644-08:00Valentine's Day Server UpdatesI had planned to open a bunch of things for Valentine's day, but I only managed to get about half of them done, largely due to laziness and akrasia. It's still a decent chunk of work though:<br>
<br>
- There's a new slot machine based on a 'travelling merchant' theme. The first two slot machine wheels pick a random cargo and destination, the next few wheels pick your path through various terrain (or have you get robbed by thieves), and when you arrive at the destination you sell your cargo. If there's a local event and your cargo is badly needed, you make a premium on your cargo, for example if you're hauling food into a famine zone, or supplying weapons to a kingdom at war.<br>
<br>
- There's a new level 14 area on the island of Kordan, the Haunted Hills. This is the first complete, full size area that I've personally built entirely myself in at least a decade, possibly more. I ended up making quite a few code changes for this - silly little things to make the area work the way I wanted it to, but important (at least to me.) This area taught me that I underestimate the creativity of my builders, and I overestimate the ability of the code. Several things that should have been easy to do and that I've seen other builders do were best handled as code updates; even though my awesome builders have managed to get similar effects, they had to use incredibly shitty workarounds to do it.<br>
<br>
I'm now convinced that if I were to build full time, building areas would rapidly become easier and more powerful for all the builders. It may be worthwhile for me to simply build a zone every month or two to improve the building system. If only I had multiple copies of myself.<br>
<br>
- There's also a new level 24 area on the island of Archais, the tinker gnome colony. This is a massive rebuild and rework of an ancient 15 room mini-area built by Aleph at the dawn of time; the rebuilt version is at least five times the size, and uses a lot of the snazzy new building features that weren't available in 1996.<br>
<br>
- The planar research guild has opened their main offices in the city of Gad's Landing on the island of Archais. The guild gives out copies of a bunch of quests which were used in the 17th anniversary event of 2012. The players seemed to really like the anniversary quests, and with the opening of the planar knot observation platform, it makes sense that similar sorts of things would be available.<br>
<br>
- I added a new level 31 mage spell, 'group teleport'. The whole point is so that people can teleport with their group, to die en-masse instead of solo. Now that we have obscure spells, I can safely add this and put it somewhere out of the way where new players won't kill themselves using it.<br>
<br>
- As mentioned above, the 17th anniversary zone is now an official area. The observation platform is instanced and accessible to players of any level - the dangerous parts are cordoned off with a very powerful ward spell. My intent was that it would be a place to visit and/or sightsee, similar to the Lincoln monument. High level groups can break the wards and let loose the elementals in the rest of the area. It takes a group with a minimum of 5k mana and an obscure high level spell to do this, so I'm hoping that new players who wander into it will be safe.<br>
<br>
- We also opened the 18th anniversary zone in the Ash Mountains. Ward breaking is needed to enter the main fortress, but honestly any group able to make it to the main fortress in one piece is probably capable of bringing down the wards. This and the 17th anniversary zones were primarily intended to be high level group experience.<br>
<br>
There probably won't be any more area or event updates like this from me for a while. I'm pretty burned out now, having done christmas/new years, the anniversary, and now a gob of stuff for valentines day; I'm also really behind on work I had scheduled that is important, so I'll probably be spending some time on infrastructure for a while.<br>
<br>Dennis Townehttp://www.blogger.com/profile/06922699653580330541noreply@blogger.com0tag:blogger.com,1999:blog-5644717058053134361.post-607498632838561512013-02-01T11:40:00.000-08:002013-02-01T11:42:53.514-08:00Alter Aeon WikiPeople have been harassing me for literally years to set up an AA wiki, but I always managed to avoid doing it for various reasons. I suspect the real reason I had been avoiding it was fear of the unknown, of not knowing if I could even figure it out (I have PTSD from the 1995 linux "recompile your compiler" era.) There's also the fear of it being a huge time sink, and many other such things.<br>
<br>
To see the end result of a lot of hard work, the wiki URL is:<br>
<br>
<a href="http://wiki.alteraeon.com">http://wiki.alteraeon.com</a><br>
<br>
These fears were not unfounded, and had it not been for <a href="https://alteraeon.com:8081/players/uicli">Uicli</a>, I probably would never have done it. He set up an initial wiki on one of his servers, which would have made it the third or fourth player wiki over the years. All the other player-run wikis failed or vanished as the players moved on, so rather than have yet another player waste their time, I decided to set up an official AA wiki. Uicli guided me through most of the process, which was just the right amount of handholding.<br>
<br>
Properly setting up a wiki is not simple:
<ul>
<li>Set up and install the web server and accounts</li>
<li>Grab the wiki package</li>
<li>Set up the database and PHP so they work properly with the web server</li>
<li>Initially configure and get the wiki itself working</li>
<li>Get database and server backups working</li>
<li>Set up game server SSH cron scripts to export valid account ids to wiki server</li>
<li>Use PHP to parse valid account info for registration</li>
<li>Get server email working and relayed through the external mail host</li>
<li>Use PHP to create a derived theme</li>
<li>Use CSS to make the theme not suck</li>
</ul>
Installing the basic web server and accounts took a while because I intend to use the wiki server as the insecure PHP/scripting server and keep it isolated from the actual important game server info. I wanted to make sure that the accounts were set up in a way that would be easily maintainable and expandable, which requires more thought than it would first appear.<br>
<br>
Setting up the databases required me to read documentation again, and relearn things I had distantly touched on in the past. I only ever have to dig into them every year or two, so I'm never fresh on commands or how to do anything. Each time requires a little less startup time though.<br>
<br>
Getting a custom theme in place was actually beyond my limited PHP abilities, but Uicli helpfully provided me a basic template to work with. Even he had to beat on it a handful of times to get it working properly.<br>
<br>
The really surprising thing for me was how long it took to adjust the theme CSS. The initial/obvious stuff didn't take too long, and I've become fairly proficient in hunting down CSS entries using Firebug. Unfortunately, it's the little, unobvious things that really eat into your time budget: there's isolated, single use undocumented CSS entries all over the place, and I only figured out as many of them as I did by making all their colors bright green so they would stand out when they were finally displayed. There's still 20+ entries in the CSS I could not track down.<br>
<br>
To top it all off, the wiki stores an additional CSS style sheet layer internally for use by templates, one which overrides ALL EXTERNAL CSS. Uicli and a couple other guys set this up, and I've been trying to slowly push the colors out to the external CSS while keeping the formatting and box styles in the internal CSS. Because the custom theme uses an inverted color scheme, it's a complete pain in the ass: if you do it wrong, either the default themes will be broken, or the custom theme, or both.<br>
<br>
The email relaying I had done only a couple months ago when implementing the main game server email account verify code, so it didn't take too long. I have had very bad experiences with email in the distant past, and setting up mail servers still creeps me out.<br>
<br>
Finally, I had to dig into the Wiki's PHP and add account restriction code to limit accounts based on game login id and email address. The game server exports a low-security file containing this information, and I've been using it on the AA forum to limit spam accounts. It's shockingly effective - simply limiting new accounts to being existing character names has dropped the number of spam accounts from 5 per day to less than 5 per year. I don't know how much more effective requiring the email address will be, but I'd be surprised to ever see a spam account on the wiki that doesn't come from an existing player (which I can siteban.)<br>
<br>
That's a lot of different skillsets that have to come together in one place. While I could probably have muddled through it in the past, I'm glad I had at least introductions to all these things since then. If I had to set up another wiki, I could probably do it a lot more quickly now, and perhaps with this additional background, a few other modern web technologies will seem a bit less scary.<br>
<br>
Don't expect me to jump on the Web 2.0 bandwagon just yet though.<br>
<br>
Dennis Townehttp://www.blogger.com/profile/06922699653580330541noreply@blogger.com0tag:blogger.com,1999:blog-5644717058053134361.post-47749693545954342572012-10-26T17:12:00.001-07:002012-10-26T17:12:52.692-07:002012 Halloween Havoc[Repost from in-game]<br>
<br>
Alter Aeon is pleased to announce our annual Halloween Havoc! The action starts on
Monday, October 29, and continues until midnight on the 31st. Our preliminary
schedule has several area openings, a number of voluntary pk events, pumpkin cannon
contests, and other things.<br>
<br>
Monday, Oct 29:<br>
<br>
On monday, we will have the official release of Castle Kraftrager, on the island of
Archais. Also known as the drake tower, this zone has a couple of interesting
quests and lots of new beasties to fight.<br>
<br>
Tuesday, Oct 30:<br>
<br>
On tuesday, a new addition to the fire plane, the untamed wilds, will be released.
This area is an extension to the tunnels and caverns below the fire giant keep,
and is intended for very high level players.<br>
<br>
Wednesday, Oct 31:<br>
<br>
On wednesday, a handful of areas will be released on the western edge of Archais.
The island archipelago has several new quests and deeds, including a cursed temple
and hang gliding.<br>
<br>
In addition, today, a new area was opened north of the Great Desert, near the Ash
Mountains on the mainland. This area has many undead and elemental
creatures, and should provide high level players with an interesting experience.<br>
<br>
On all three days, we will be running arena and other events every few hours to
give those in different time zones a chance to participate and say hello. We'll
have novelty items and prizes for everyone.<br>
<br>
We hope to see you there!<br>
<br>
Dennis Townehttp://www.blogger.com/profile/06922699653580330541noreply@blogger.com0tag:blogger.com,1999:blog-5644717058053134361.post-34850174472454407812012-09-19T12:25:00.000-07:002012-10-26T17:09:53.059-07:00This code sucks?A colleague recently asked me, ‘how can you tell code is crap?’ This is a very good question, one dear to my heart given a recent project I worked on.<br>
<br>
The biggest indicators all seem in some way to link back to a high <a href="http://en.wikipedia.org/wiki/Kolmogorov_complexity">Kolmogorov complexity</a>. The basic idea is that the code is more complicated than it needs to be to do a given task. Sometimes tasks require complicated code; sometimes, your given task is to optimize in a way that requires complicated constructs. But in general, one should not make code more complicated than it needs to be.<br>
<br>
Some of the indicators I've been able to come up with off the top of my head:<br>
<ul>
<li><b>1) Lack of data hiding</b><br>
<br>
Any halfway complicated software module is going to have some internal state that it manages, and that nobody else has any business touching. Bad code often has cases where unrelated modules directly mess with data belonging to some other module.<br>
<br>
Data hiding takes many forms, and can be enforced by tools or simply willpower. Whether classes, undefined structure types, local variables, file scope data, or intentional exclusion of header files, there are many ways to hide and protect data. Bad code typically ignores those protections.<br>
<br></li>
<li><b>2) Lack of chokepoint interfaces</b><br>
<br>
Chokepointing is a crucial part of managing complexity. It's very similar to an object-oriented interface, but I think that calling it a chokepoint better conveys what's happening: At the chokepoint, the complexity is the bare minimum of what is required for communication between the two sides.<br>
<br>
In short, by chokepointing complexity at well defined locations, you can more easily manage global complexity. Bad code typically doesn't have good chokepointing.<br>
<br></li>
<li><b>3) Logic holes and unhandled cases</b><br>
<br>
Few things increase complexity faster than unhandled or fallthrough logic. Consider the case of a well chokepointed module, with a single commonly used interface that has a 'fall through' condition: every external module that uses that interface can potentially get a different output for exactly the same input.<br>
<br>
While this would seem an obvious bug to be fixed, keep in mind that computers are deterministic - all of the modules on the system may always get the same consistent result. And it may be that all of them get a usable result, except for an obscure usage in some minor library.<br>
<br></li>
</ul>
There's three more indicators that I don't think are directly attached to the complexity issue:<br>
<br>
<ul>
<li><b>4) Presence of any unexpected behaviour in the output</b><br>
<br>
If I've learned anything over the years, it's that any unexpected output needs to be examined and understood. Far more often than not, unexpected output is an indicator of #3, logic holes and unhandled cases.<br>
<br></li>
<li><b>5) Bad customer interfaces</b><br>
<br>
If the publicly exported interface to a paying customer is crap, odds are good the code inside is crap. Customer interfaces should be simple, powerful, and obvious. They require attention to detail, and if that attention isn't present, it's probably not present in the code behind the interface either.<br>
<br></li>
<li><b>6) Too little, or too much unfilterable debug logging</b><br>
<br>
The purpose of debug logging is to give visibility into the system to allow for debugging and analysis. If there is too little debug, odds are good failures are simply being ignored. If there is too much debug and no good way to filter it for important messages, odds are good the programmer missed something.<br>
<br></li>
</ul>
I can also think of one indicator of bad code that appears to violate the Kolmogorov complexity rule (IMHO, it doesn't actually violate the rule if you include the probability of programming bugs and programmer error into the definition of your given task.)<br>
<br>
<ul>
<li><b>7) Lack of sanity checks</b><br>
<br>
Sanity checks directly increase complexity, because they generally change the actual behaviour of the program when they trigger (unlike debug logging, which simply reports state without modification). However, they are cheap, fast, and very, very effective. While they do increase program complexity, they typically add a layer of reliability to the system.<br>
<br></li>
</ul>
This is definitely not a comprehensive list, but I've encountered each of these over the last month, on this one project alone. If any of you have other candidates, feel free to post them in the comments.<br>
<br>Dennis Townehttp://www.blogger.com/profile/06922699653580330541noreply@blogger.com0tag:blogger.com,1999:blog-5644717058053134361.post-7806877559307637172012-01-10T10:35:00.000-08:002012-01-10T10:35:10.919-08:00Alter Aeon 17th AnniversaryAs of this weekend, it's been 17 years since I started on Alter Aeon. It all began with:<br>
<br>
<blockquote>#include "stdio.h"<br>
<br>
void main() {<br>
}<br>
</blockquote>
<br>
When I started, I remembered so little C that I had to go look up what a structure was and how to use it. The game server code has since then landed me two good jobs and served as my final project for my engineering degree.<br>
<br>
We're up to over three hundred thousand lines of source code now, with another twenty or thirty thousand lines of help files, faqs, rules, and other information. It's sometimes helpful to step back and see how far things have come.<br>
<br>
This weekend, in celebration, we'll be having one of the rare scripted RP events that I occasionally do. These events are time consuming, with a lot of prep work and hassle trying to manage and keep everything working well, but they are hugely popular with the players. This time we have a storyline with a fairly plausible "end of the world as we know it" theme, and with any luck it'll be as successful as our 15th anniversary was a couple years ago.<br>
<br>
Thanks to all the players who have contributed and help make Alter Aeon great over the years. See you all there!<br>
<br>
-dentin<br>
<br>Dennis Townehttp://www.blogger.com/profile/06922699653580330541noreply@blogger.com2tag:blogger.com,1999:blog-5644717058053134361.post-41950257118962122632011-12-13T08:30:00.000-08:002011-12-13T08:30:30.142-08:00Year End Event at Alter AeonWe'd like to welcome everyone to the year-end celebration at Alter Aeon!<br>
<br>
Starting on the 21st of December and going through new years eve, we
plan to have a number of things going on:<br>
<br>
<ul>
<li>The release of a new low level area near Indira<br>
<br>
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.<br>
<br></li>
<li>A major update to the troll caves on Archais<br>
<br>
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.<br>
<br></li>
<li>The release of a new high level stone giant area west of Finspang<br>
<br>
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.<br>
<br></li>
<li>An object creation contest, open to everyone (this is currently
running and submissions will close on Dec 23rd)<br>
<br></li>
<li>Daily gifts will be given out to everyone who logs in!<br>
<br></li>
<li>Several different minor contests and activities similar to the famous
Halloween Pumpkin Cannon<br>
<br></li>
</ul>
We'll also be running sales on various credit purchases in game if
you're into that sort of thing.<br>
<br>
I'll post a more detailed schedule closer to the 21st. We hope
to see you there!<br>
<br>Dennis Townehttp://www.blogger.com/profile/06922699653580330541noreply@blogger.com0tag:blogger.com,1999:blog-5644717058053134361.post-18120034295518408622011-11-01T08:43:00.000-07:002011-11-01T08:47:26.593-07:00Playerbase and UserloadWhen 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.<br />
<br />
This whole staged growth process has become a lot more apparent to me over the last couple of years:<br />
<br />
<ul>
<li>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.<br />
<br /></li>
<li>A bit larger and you start to get power levelers that like to compete with each other for in-game prestige.<br />
<br /></li>
<li>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.<br />
<br />
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.<br />
<br />
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.<br />
<br /></li>
<li>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.<br />
<br />
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.<br />
<br />
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.<br />
<br /></li>
<li>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.<br />
<br />
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.<br />
<br />
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.<br />
<br /></li>
</ul>
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.<br />
<br />
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.<br />
<br />
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.<br />
<br />
That said, I know there are bigger, nastier hurdles ahead of us. I just don't know what they are (yet.) <br />
<br />Dennis Townehttp://www.blogger.com/profile/06922699653580330541noreply@blogger.com0tag:blogger.com,1999:blog-5644717058053134361.post-16469461569841328602011-10-26T08:41:00.001-07:002011-10-26T08:42:19.045-07:00Halloween 2011 Events!If you like vampires, mummies, demons and other things that go bump in the night...<br />
<br />
Stock up on supplies and get ready for a fight.<br />
<br />
Come see us on October twenty-ninth, it all starts at midnight.<br />
<br />
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.<br />
<br />
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.<br />
<br />
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.<br />
<br />
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.<br />
<br />
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.<br />
<br />
We hope to see you there!<br />
<br />Dennis Townehttp://www.blogger.com/profile/06922699653580330541noreply@blogger.com0tag:blogger.com,1999:blog-5644717058053134361.post-13704452663617246682011-09-26T19:25:00.000-07:002011-09-26T19:25:31.041-07:00wxWidgets keyboard handling<i>The cross platform code that isn't.</i> <br />
<br />
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.<br />
<br />
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.<br />
<br />
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.<br />
<br />
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.<br />
<br />
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.<br />
<br />
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.<br />
<br />
Keyboard control now works consistently and reliably on all three platforms.Dennis Townehttp://www.blogger.com/profile/06922699653580330541noreply@blogger.com0tag:blogger.com,1999:blog-5644717058053134361.post-29634792126012620252011-09-19T13:43:00.000-07:002011-09-19T13:45:18.516-07:002011 Cleric Class UpdateThe 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:<br />
<br />
- 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.<br />
<br />
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.<br />
<br />
- Added a necromancer spell 'bone dragon', which allows you to fly around over the landscape.<br />
<br />
- Ice imprison and crystal prison have been updated.<br />
<br />
- Ward good and ward evil are now more powerful.<br />
<br />
- The charm spell has been updated to make it easier to land and to use control points similar to controlled necromancer minions.<br />
<br />
- The peace spell has been improved.<br />
<br />
- A level 19 curse, 'overconfidence', has been added.<br />
- A level 19 spell, 'hold undead', has been added.<br />
- A level 28 spell, 'sacred touch', has been added.<br />
- A level 29 spell, 'solace', has been added.<br />
<br />
As always, you can use the 'spell find' commands to find the teachers or trainers for new spells and skills.<br />
<br />
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.<br />
<br />
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:<br />
<br />
<a href="http://www.alteraeon.com/">http://www.alteraeon.com</a><br /><br />
Happy hunting!<br />
Dennis Townehttp://www.blogger.com/profile/06922699653580330541noreply@blogger.com0tag:blogger.com,1999:blog-5644717058053134361.post-31748158428377826202011-09-09T13:06:00.000-07:002011-09-09T13:06:06.082-07:00I'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:<br />
<br />
- 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.<br />
<br />
- 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!<br />
<br />
- 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.<br />
<br />
- 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.<br />
<br />
- Lots of performance and memory optimizations, to make things run faster and more smoothly<br />
<br />
- You can now change the font on buttons and the map<br />
<br />
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.<br />
<br />
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:<br />
<br />
<a href="http://www.alteraeon.com/AlterAeon.exe">http://www.alteraeon.com/AlterAeon.exe</a><br />
<br />
Happy hunting! Dennis Townehttp://www.blogger.com/profile/06922699653580330541noreply@blogger.com0tag:blogger.com,1999:blog-5644717058053134361.post-58845048963050954372011-07-13T08:04:00.000-07:002011-07-13T09:16:09.109-07:00We'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.<br /><br />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.<br /><br />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.<br /><br />The link is:<br /><br /><a href="http://gaminghud.com/articles/alter-aeon-mud-a-world-of-infinite-possibilities">Alter Aeon MUD - A World of Infinite Possibilities</a><br /><br />Feel free to check it out and maybe drop a thank you to the author for their hard work.Dennis Townehttp://www.blogger.com/profile/06922699653580330541noreply@blogger.com1tag:blogger.com,1999:blog-5644717058053134361.post-56370661858810247082011-07-09T13:50:00.000-07:002011-07-11T12:19:03.997-07:00wxWidgets GTK font renderingIn my <a href="http://mobfactory.blogspot.com/2011/07/wxdc-drawpoint-broken-under-wxmac.html">previous post</a>, 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.<br /><br />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.<br /><br />Eventually I figured out the reason:<br /><br />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.<br /><br />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.<br /><br />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.<br /><br />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.<br /><br />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!<br /><br />I should have just done it in the first place, as I <a href="http://mobfactory.blogspot.com/2009/08/wxwidgets-sucks.html">recommended to myself in a past life</a>. Sometimes our older selves are no wiser than we are in youth.Dennis Townehttp://www.blogger.com/profile/06922699653580330541noreply@blogger.com0tag:blogger.com,1999:blog-5644717058053134361.post-7362924315220282642011-07-09T13:17:00.000-07:002011-07-10T06:02:04.350-07:00wxDC DrawPoint broken under wxMACTo follow up on my <a href="http://mobfactory.blogspot.com/2011/07/wxwidgets-has-no-alpha-channel.html">previous post</a>, 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.<br /><br />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.<br /><br />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.<br /><br />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.<br /><br />I have some mighty fine choice words to say to the developers regarding this, but I'll try to keep this post on topic.<br /><br />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.<br /><br />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.Dennis Townehttp://www.blogger.com/profile/06922699653580330541noreply@blogger.com0tag:blogger.com,1999:blog-5644717058053134361.post-29245880962605171712011-07-09T12:56:00.000-07:002011-07-09T13:49:35.996-07:00wxwidgets has no alpha channelA few months after I ported the <a href="http://www.alteraeon.com/AlterAeon.exe">Alter Aeon client</a> to the wxWidgets toolkit, I decided I wanted to add alpha overlay support to the automap and main window.<br /><br />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.<br /><br />Alas, it was not to be. It turns out that there are precisely three places where the alpha channel is used:<br /><br />1) loading a PNG from PNG data that has an alpha channel,<br />2) drawing a bitmap containing alpha channel data using wxDC::DrawBitmap, and<br />3) wxDC::DrawText, which politely draws text on top of the underlying pixels.<br /><br />For all other locations, there simply should have been this assert:<br /><br />wxASSERT("Alpha channel is stubbed here and works on precisely zero platforms ever, ha ha, the joke is on you")<br /><br />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.<br /><br />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.<br /><br />Rather than bash my skull repeatedly against the wall, I did what any sane developer would do: <a href="http://mobfactory.blogspot.com/2009/02/sucking-further-wxwidgets.html">throw out the broken toolkit module, and write one that works</a>. 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.<br /><br />However, there's a problem with this as well, which I'll detail in a later post.Dennis Townehttp://www.blogger.com/profile/06922699653580330541noreply@blogger.com2tag:blogger.com,1999:blog-5644717058053134361.post-18810089155380805472011-07-01T08:44:00.000-07:002011-07-01T09:24:39.911-07:00Future Plans - ClericsThe 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.<br /><br />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.<br /><br />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.<br /><br />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.<br /><br />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.<br /><br />Other things that could use similar kinds of improvement are turn undead, the ward spells, curses, and the monitor skill.<br /><br />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.<br /><br />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.Dennis Townehttp://www.blogger.com/profile/06922699653580330541noreply@blogger.com0tag:blogger.com,1999:blog-5644717058053134361.post-57943367007565088812011-06-23T07:33:00.000-07:002011-07-01T09:26:33.331-07:00Future Plans - ThievesNow 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.<br /><br />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 <a href="http://alteraeon.com:8080/skills/thief">class with the fewest skills</a>.<br /><br />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.<br /><br />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.<br /><br />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.<br /><br />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.<br /><br />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.<br /><br />Coming up next - clerics get some love too.Dennis Townehttp://www.blogger.com/profile/06922699653580330541noreply@blogger.com0tag:blogger.com,1999:blog-5644717058053134361.post-38526831025519421302011-04-09T16:33:00.000-07:002011-04-09T16:35:21.480-07:00Alter Aeon Area OpeningsDraak 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.<br /><br />---<br /><br />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.<br /><br />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.<br /><br />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.<br /><br />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.Dennis Townehttp://www.blogger.com/profile/06922699653580330541noreply@blogger.com0tag:blogger.com,1999:blog-5644717058053134361.post-68687142023513843592011-02-25T08:47:00.000-08:002011-02-25T08:57:56.340-08:00If 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.<br /><br />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.<br /><br />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.<br /><br />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.<br /><br />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.Dennis Townehttp://www.blogger.com/profile/06922699653580330541noreply@blogger.com0tag:blogger.com,1999:blog-5644717058053134361.post-19702691973084436892011-01-09T16:39:00.001-08:002011-01-09T17:09:08.430-08:00ScalingWhen 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.<br /><br />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.<br /><br />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.<br /><br />Here are some things I think could help with that:<br /><br />- 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.<br /><br />- 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.<br /><br />- 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.<br /><br />- 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.<br /><br /><br />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.<br /><br />It's a decent start. One bottleneck at a time...Dennis Townehttp://www.blogger.com/profile/06922699653580330541noreply@blogger.com0tag:blogger.com,1999:blog-5644717058053134361.post-37221973457025488092010-12-30T18:58:00.000-08:002010-12-30T19:12:38.233-08:00Spells, skills, and class designOne of the things that takes a lot of time is tweaking the spell and skill trees to make the classes more fun to play. The various factors I have to balance are a lot more restrictive than you might expect:<br /><br />1) The spells and skills within each group, for example "mage fire spells", should have proper dependencies. Greater Fireball should probably be dependent at some level on 'basic fire magics'.<br /><br />2) The spells and skills within each group, for example "mage fire spells", should be separated by similar level differences, to spread the group out across a level range. If there's too much clumping, there's dead zones where you don't get a new spell for a long time, then suddenly get a bunch followed by another dead zone.<br /><br />3) Spells and skills for the entire class should be evenly distributed across the entire level range, again to limit dead zones and make sure players have something to learn at every level. Necromancer is a good example of how to do this; every three levels, you get 5-6 spells and skills, from level 1 up to about level 28. Mage is a good example of how not to do this; there's 6 spells between levels 2-4, 12 spells between levels 12-14, and 4 spells between level 26-28. Mage is currently very clumpy and needs more work.<br /><br />4) Low level spells and skills should be useful and interesting. Having a spell like 'ventriloquate' below level 10 makes no sense at all; newbies will think it's actually useful (it's not) and waste practices on it. It's ok to put useless stuff at higher levels, because high level players are more likely to do research before wasting scarce practices on something.<br /><br />5) Really high level spells have to actually be useful, even if it's a specialized use.<br /><br /><br />The above generally result in me spending a lot of time staring at various views of the spell lists for each class. You have to keep an eye on groupings across level ranges, while making sure you haven't done anything dumb to the dependency trees for each group, and making sure you don't move useless things into the low level ranges.<br /><br />And even though it may not seem that way, the above are actually really important. It seems to give you more to do, and you know that you get important, useful stuff even at low levels. I've certainly noticed a difference with my characters.Dennis Townehttp://www.blogger.com/profile/06922699653580330541noreply@blogger.com5tag:blogger.com,1999:blog-5644717058053134361.post-33492683139845541162010-12-25T12:32:00.001-08:002010-12-25T12:48:35.180-08:00Christmas Expansion - UpdateWe finally got everything done and installed, and it went off pretty easy. The biggest hitches were minor display bugs in explorer points, with a few minor typos and what not elsewhere.<br /><br />One of the things that surprised me was the time breakdown for the various spells and skills. We only added 12 of them this time; here's a rough time estimate for each.<br /><br />Level 25 mage skill 'melt' - approximately 6 hours. This skill was in multiple pieces, as it can operate on multiple targets. Not much debugging time required.<br /><br />Level 27 mage skill 'spell lore' - approximately 1 hour. This was a very easy hook into the spellcasting code.<br /><br />Level 6 cleric spell 'faith shield' - approximately 4 hours, most of it testing and design, trying to figure out how to not break anything.<br /><br />Level 31 cleric spell 'breath of life' - approximately 5 hours. Required several debug passes to get the math right, largely because I wrote the core of it while I was very tired.<br /><br />Level 33 cleric spell 'area heal' - approximately 2 hours, because this reused a lot of well-done code from 'area refresh'.<br /><br />Level 34 cleric spell 'astral bridge' - approximately 16 hours. The spell itself only took about two hours, but before I could implement it I had to completely rework the waypoint code. Refactoring and updating the old code took the bulk of the time, and it broke waypoints for a lot of players.<br /><br />Level 32 cleric spell 'group waypoint' - approximately 2 hours, because the astral bridge and other waypoint code was already in place.<br /><br />Level 8 thief skill 'listen' - approximately 4 hours.<br /><br />Level 29 thief skill 'fast talking' - approximately 3 hours, had to come back and extend its use into other thief skills that didn't have the facility before.<br /><br />Level 26 warrior skill 'cleave' - approximately 5 hours. Ran into an irritating bug where cleave would cause a death which would cause an autocleave which could cause a death which could cause an autocleave...<br /><br />Level 32 warrior skill 'whirlwind' - approximately 3 hours. The event handler for this was very straightforward.<br /><br />Level 8 necromancer spell 'bone blade' - approximately 2 hours.<br /><br />Explorer points - about 10 hours. This had a lot of hooks for display and interfacing, which usually takes a lot of time. Multiple debug passes.<br /><br />Various achievements - about ten minutes each when done in groups.<br /><br />There was also a lot of infrastructure and other work that went on to enable all this; between bug fixes, infrastructure, and design, the times above are perhaps a third of the total.Dennis Townehttp://www.blogger.com/profile/06922699653580330541noreply@blogger.com0