Category Archives: Linux and Mono

Open Source: Sigmatizm, A Virtual Additive Synthesizer

Back in 2012 I wrote the most complex audio application I had ever written. It’s called Sigmatizm, and is a standalone additive synthesizer.

Additive synthesis works by adding together sine waves of different frequencies (harmonics) to create a more complex sound.

This particular application adds up to 128 sine waves together in real-time, while transitioning from one set of harmonics to another and while modifying the sound with an attack-decay-sustain-release (ADSR) envelope.

It also has full MIDI support and can be played with a MIDI controller, or can be used to play an external MIDI synthesizer. It also supports using any sound card or MIDI device attached to the system.

It started life as a Windows app and was also ported to Linux. Originally it was a commercial app available for $9.99 on both Windows and Linux (via the Ubuntu store). It also works on OSX, but building is a bit more involved and not for the faint of heart.

For the official download page, visit Zeta Centauri.

Or, to get the source code, visit GitHub.

There’s still a lot more that I’d like to do with this application. For example:

  • It’s nice as a standalone, but would be more useful as a VST so it could be used with multitracker software and be piped to effects, like delay, reverb, etc.
  • I’d like to be able to have an infinite number of envelope stages, so things could go quiet-loud-quiet-loud, or other evolving sound scenarios.
  • I’d like to add the ability to add noise or other inharmonic sources, since the app is completely harmonic and aliasing is the only source of inharmonic sound.

One thing that I’ve deliberately done in order to make it easier to create crazy sounds is NOT prevent aliasing, which is what happens when a sound goes past the sample rate (which in this case is 44.1KHz). When that happens, waveforms “wrap around” and start going in the other direction. I’d like to make that sort of thing optional (block or don’t block) because it’s undesirable in some situations and desirable in others.

It only has a handful of included patches, but I’d like to include more. If you download it and create some sounds, please consider contributing them back to the project.

Proxima Controller, a Virtual MIDI Controller

Back in 2008 I created an app called Proxima Controller. It’s a virtual MIDI controller that runs on Windows, OSX, and Linux.

I wanted an easy way to control external MIDI hardware (synthesizers, etc.) from my PC and there wasn’t an app that I liked available.

It started out as a Windows-only app. A few years later I ported it to Linux. And last year I ported it to OSX (but didn’t release it via the app store).

It’s been one of my more popular apps, with more than 70,000 downloads. I’m glad people have found it useful. It certainly made it easier for me to test sounds on my rackmount audio equipment without needing to shuffle full-sized MIDI keyboards around.

When I have time I’d also like to add an X-Y controller pad, something that can be used to transmit the same controller messages as the joystick on the Korg Wavestation and the Yamaha SY22/SY35/TG33.

You can get it here.

Trigram Generator for Windows and Linux

A long time ago I wrote a free Windows app called the “ZC Trigram Generator”. It was a simple app to generate plausible-sounding words based on a set of input words.

It had a steady trickle of downloads for around 8 years or so, about 1500 downloads per year.

Two years ago I open-sourced it and posted it on GitHub.

Today I updated it to be a little easier to use by adding a “load text” button to load a text file.

Trigram Generator Screenshot

It works on Linux and Windows 7 or newer (including Windows 10).

It’s available here on GitHub if you’d like to get it.

Using MonoDevelop

I’ve almost always used both Windows and Linux, but I stopped using Windows a few months ago.  One of the things that only runs on a Windows machine is Visual Studio.  The Basternae code was compiled on a Windows machine and then uploaded to the Linux host.

Without access to that, it was time to try using MonoDevelop.

MonoDevelop
It was able to load the Visual Studio solution, with some exceptions:  The client WPF project didn’t load, nor did the abandoned Silverlight project.  I could probably install more packages to make WPF work, I’m not sure yet.

I noticed that the compiler works differently for some things, like terminal characters.  The ECHO_ON and ECHO_OFF sequences broke logging in, but some weird prompt formatting that’s been around for a while just fixed itself.  It will be interesting to see what other diffferences turn up.  Even though C# is supposed to work the same on all platforms, I suspect that it might work better when both the build and run machines have the same operating system.

Server Updated

Over the course of a lunch hour yesterday I updated the operating system on the Basternae box.  It was running Ubuntu 10.04.  It’s now on Ubuntu 12.04.  It took about 45 minutes to finish the whole process including testing and fixes.  Only one thing broke in the process.  The Django web framework, which runs about half of my websites, was uninstalled by the upgrade process.  I had to manually reinstall it, which took about 10 minutes.

I remember upgrading a Red Hat 5 box to Red Hat 9 many years back.  The process took about 10 hours to finish and get everything working again.  Easy upgrades are a good thing.

GTK+ Is A Very Good SDK

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

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

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

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

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

Well done, GTK+ team.

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

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

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

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

Ubuntu 10.10

I’ve been using Ubuntu as my main Linux distribution since 2005.  Not that I used it that much, but not until 9.04 was it good enough to use as my main laptop OS.  Before that I just ran it as a virtual machine or on spare pieces of junk lying around.

It’s been getting prettier every update, with the exception of 10.04, the update that put minimize and maximize buttons on the wrong side of a window in emulation of MacOS.  To me MacOS has always felt like a clunky, thrown-together, visually distracting OS that makes it very annoying to get anything useful done — BSD UNIX from 1990 with a few coats of paint sprayed on.  Luckily it’s just a quick config setting to put the buttons back where they belong.

The latest, 10.10, changes its primary font to something that almost looks a little cartoony compared to the previous font, but after spending a few days getting used to it I really like it.  It’s crisper, cleaner, and smoother, but it does emphasize how poor some of the web fonts are that it ships with, especially Arial, which is far too wide compared with its counterparts on Windows and OSX, and Times New Roman, which is so thin and weak that it’s hard on the eyes.

Canonical has accomplished their mission — they’ve made Linux a usable desktop OS.  In the process they’ve dragged others kicking and screaming into the future.  Fedora, for instance, has improved its look greatly ever since Ubuntu started making them look bad.

I still prefer Windows 7, but if I have two systems I’ll take one of each.  Each one has better apps for certain tasks and I can get more done with access to both.

Client Version 0.16 Update

I spent some time with window layout, changing where windows open so things aren’t stacked on top of each other.  Now they open in locations that make more sense when you run the app.  You can still move windows elsewhere or close them if you want.

I also worked on the group window.  Now it should display info about the group you’re in, if any.  Here’s what it looks like now:

Basternae Client v0.16 screenshot

All of these extra windows — status, group, room, and equipment — don’t refresh unless the server sends data to refresh them.  The status window works pretty well because it updates every time the prompt is sent and the room window works pretty well because it updates every time you enter or look at the room.  For equipment and group windows, it’s only when you type the “eq” or “group” commands, which may not be often at all.

At some point I’m going to make these update more regularly, probably on a timed interval for the group window, and probably when you “wear” or “remove” equipment for the equipment window.

You may notice from the screen layout that the client works best on systems with a resolution of 1280×800 or higher.  You can probably use it on systems with less, but I wouldn’t recommend it.

You can get it here.

I’ve also posted a Linux binary. It was built on an Ubuntu 9 system and requires wxGTK. I haven’t learned how to create a .deb or .rpm installer package yet, so it’s just a gzipped tar. Please report any problems/glitches.

Version 0.47 Editor Update

I’ve released an editor update today.  Changes are:

Object Editing

* Material type list is now sorted alphabetically.
* When editing object values, value labels change based on object type for about half of the object types.  This makes it easier to tell what values you’re editing.

Mob Editing

* Race name is now sorted alphabetically and duplicate entries have been removed.
* Class name is now sorted alphabetically and duplicate entries have been removed.

Room Editing

* Terrain types are now sorted alphabetically.

Repop Editing

* Value titles now change as the repop type changes so you know what you’re editing.

Map View

* Rooms not in the current zone are now shown on the map view in green.

You can get it here.

I’ve also added a download for Mac and Linux. The editor mostly works on those OSes, provided you have mono installed. The one known issue is that the color visualization on the editor windows does not work. The executable file is exactly the same, but instead of an installer it has a shell script to run the app. If that doesn’t work, you can always run it via a terminal window (go into the bin directory and run mono BasternaeEditor.exe).

It Runs On MacOS

I recently acquired a MacBook to expand the multi-platform development repertoire.  One thing that surprised me is that the Basternae server executable runs unmodified on OSX (Snow Leopard) with Mono installed.  This shouldn’t have been too surprising since the server currently runs on Ubuntu Linux, but it was still pretty cool to just type ‘mono Basternae.exe’ and have it run without errors.  There’s quite close to zero chance that it’ll ever be set up on a Mac server, so this was just an interesting experiment more than anything.

You’ll probably notice that there hasn’t been much development on Basternae in the past month or so.  I’m spending the vast majority of time working on software for Zeta Centauri, so until that is a definite success or failure (I think June 2010 will be when I know), B3 will be fairly low-priority.  I doubt work will stop, but time available will be at a minimum.

Building The Client On Linux

It’s been 3 years since I’ve tried to build the client on Linux. I started building the client long before there ever was a Basternae 3 project, and since then plenty of files have been added and removed — for instance, we no longer use Xerces-C or SDL in the project.  I was using Ubuntu 6.06 then, and now I’m on 9.04.

After updating the old makefile, I found there were a few minor issues. Of course there was the expected forward/back slash in filenames and that’s an easy fix. There were two that were a bit of a surprise:

warning: cannot pass objects of non-POD type ‘class wxString’ through ‘...’; call will abort at runtime

error: no matching function for call to ‘wxRichTextCtrl::AddPendingEvent(wxCommandEvent)’
/usr/include/wx-2.8/wx/event.h:2400: note: candidates are: void wxEvtHandler::AddPendingEvent(wxEvent&)

The first one is because I was passing wxString arguments to the wxString::Format function.  Visual Studio was smart enough to convert those to the char* type that printf commands understand for %s, while GCC doesn’t make any assumptions and does what you tell it to rather than what you intend. Differences like that have been known to start religious wars.  Adding .c_str() to the arguments in a dozen places sorted that out for me.

The second one was a bit of a stumper, and the folks at the wxWidgets Discussion Forum helped me out. I’ve dealt with a lot of user communities for various APIs and toolkits, and the wxWidgets folks have always been the most helpful and knowledgeable.

I was able to get the client to build.  I was even able to get it to run.  I could almost even use it.  Here’s a screenshot:

Basternae Client on Linux Screenshot

The main problem with it is that the input window doesn’t actually work — you can type until you’re blue in the face but nothing ever gets sent to the MUD.  Strangely enough, if you program a hotkey and click that, the text goes across fine.  I was able to clumsily log in and fight something using that method.  I’m sure there’s some OS-specific stuff in the key handler for the input window, but that probably won’t be too daunting to figure out.

Now I’m going to have to learn how to create Debian (.deb) installer packages so I can distribute the thing.  I might also have to figure out how to do .rpm, but since I don’t run a Redhat/Fedora-based version that might be a little low on the priority list, especially since I’d have to set up VM just to build/deploy it.  I might be the only one who uses Linux that would connect to Basternae anyhow.

It would also probably not be too tough to get this working for MacOS and Solaris, but since there’s zero chance of me having a Mac to work with and the only people who run Solaris work at Sun Microsystems, those aren’t really a priority.

Startup Script Created

For the past few days, the test version of the MUD has only been up when I was actively running it from my Linux shell account.

I’ve created a startup/restart script so it should be running all the time now, barring any catastrophic crash-explosions.

Telnet basternae.org port 4502 to connect.

Basternae 3 Test Port Currently Running

I have a test port of Basternae 3 running on basternae.org port 4502.  This is only temporary for the purpose of testing.

Here’s a list of things that need to be tested.  Feel free to spend as little as 1 minute testing, or as long as the server is up.  I only plan to have it up for a few days or less.  Please report any results to xangis at the yahoo dot com email service.  One big email is far better than lots of little emails.  Also let me know the name you’d like to be listed in the credits as (up to you whether you want to use your handle/nickname or your real name).  As I receive testing reports I’ll post what sections of this list have been covered so there’s not too much overlap of effort between testers.

1. Tester: Create one character of each race and one of each class to make sure that:

– The help file/info is displayed properly for each race and makes sense.
– The help file/info is displayed properly for each class and makes sense.
– The character creation process is logical, sensible, and user-frieldy enough that someone who has never played a MUD could make sense of it.
– Nothing weird happens.
– Nothing looks too un-customized.
– You actually start in the Kobold Village instead of a room with no exits.
– Text formatting glitches are under control.

Report any ideas/suggestions/observances during the process.

2. Tester: Check help entries for all commands and report any that don’t exist.

The “commands” command will give you a list of the commands available.  “help <command_name>” should display the help for that command.

3. Tester: Check help entries for all skills and report any that don’t exist.

Type “skills” to show the skills available for your character.  “help <skill_name>” should display the help for that skill.

4. Tester: Check help entries for all spells and report any that don’t exist.

Type “spells” to show the spells available for your character.  “help <spell_name>” should display the help for that spell.

5. Tester: Test all spells available to you and report any that don’t work.

Until I have the “auto advance to max level” stuff going there’s not a whole lot you can test with this.  In addition, spellbook/scribe classes will have trouble.  Just do what you can.

6. Tester: Try all commands without arguments and report any that malfunction, fail to give any feedback, give badly-formatted responses, or give responses that look like a stock codebase.

For instance, try “score”, “attributes”, “who”, and any other commands shown when you type “commands”.

7. Tester: Try all socials and report any that malfunction, print output that is garbled or nonsensical, or looks like a stock codebase.

Type “socials” to get a list of the available socials.  Then try these different combinations with each social:
<social_name>
<social_name> me
<social_name> <some_mobile_in_the_room>

8. Tester:  Try combat and see whether you’re able to successfully kill a mobile.  If anything strange happens, report it.  This includes messages that don’t make sense, like getting kicked by a creature with no legs, bitten by a creature without a head, etc.

During the history of Basternae (1 through 3) there have been issues with combat round timing, corpse creation, and deathblows.  I’d like to identify any of those as early as possible.

9. Tester:  Try combat and see whether you’re able to successfully get killed by a mobile.

During the history of Basternae (1 through 3) there have been issues with combat round timing, corpse creation, and deathblows.  I’d like to identify any of those as early as possible.

10. Tester: Log in with two characters and see whether you can successfully kill another player in PvP combat.  If anything strange happens or if you’re unable to fight another player, report it.  Try with characters on the same racewar side (i.e. Troll vs. Ogre) and with characters on opposite racewar sides (i.e. Dwarf vs. Orc)

There’s all kinds of extra logic involved in PvP combat and there’s plenty of room for weirdness.

11. Tester: Check help entries for all bard songs and report any that don’t exist.

This assumes you’ll be able to create a Bard and that they actually have songs defined..  I haven’t tried.

12. Tester: Walk through a zone looking at mobiles, objects, and rooms and report anything that is formatted weird or doesn’t display properly.

Although issues of that nature are usually zone file related, it’s entirely possible that with our entirely-new socket and text formatting code that something will look wrong.

13. Tester: Download the Basternae client and try using it with Basternae 3.

It’s available here:  http://www.basternae.org/BasternaeClientPreview_08-04-09.exe

I know it’s only barely functional (none of the extra windows do anything yet), but it’d be nice to get a little feedback, and to know what it would require before you’d consider using it as your main MUD client (if you’d consider using it).  And, of course, if it doesn’t run on your main OS that’d be nice to know too.  It’s probably worth running it side-by-side with another MUD/telnet client to make sure that text comes across OK (it’s entirely likely that the text parser isn’t 100% right).  If anything looks wonky, screenshots might be helpful.

14. Tester: Download and try to use the Basternae zone editor and take note of what parts of it are confusing and/or unclear.

The basternae editor can be downloaded here: http://www.basternae.org/Basternae3EditorSetup_v0.39.exe

There isn’t any documentation for the zone editor yet, so it might help to have some input as to what a new zone writer would want to know how to do and what guidelines should be made clear.  If you’re feeling really brave you could write a basic conceptual overview or intro tutorial.

The editor currently only runs on Windows and requires the .NET framework (you’ll already have it if you have Windows).

15: Tester:  Download the Basternae zone editor and try creating a 2-3 room zone with a mob, a quest, and an object.

Just try it out and see if it works, offer usability suggestions, and/or report anything weird.  Once you’re done, send me the test zone and I’ll see if it actually loads in the MUD engine.  Quality does not count — this is only a test.  You could create an entire zone if you want to, but I don’t recommend it until after these tests are done because there could be some breaking file format changes.

A few things to be aware of:

The code was written and compiled on Windows and is currently running on Linux under Mono.  Since Mono doesn’t have full support for everything in .NET there’s a chance something will go haywire at some point.  While doing some initial testing a few weeks ago I saw CPU usage on the server spike to 100% for no obvious reason.  If this happens, I’ll have to kill the process because I have about 15 or so other sites running on the server and I can’t let them be taken down.

I’m sure some of these tests will not really be able to be run effectively without some code changes/fixes.

THIS IS NOT A FULLY FUNCTIONAL MUD.  THIS IS JUST SO I CAN BUILD MY “TO DO” LIST OF THINGS THAT MUST BE FIXED OR REWRITTEN.

Resource Usage For Basternae 3

Here’s the resource usage for Basternae running on Mono on Ubuntu with 1 active user and 6 zones loaded:

USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root     24624  0.2  6.9  39284 25548 pts/0    SNl  21:40   0:08 mono Basternae.exe

I have to imagine with a full complement of zones and a few active players that the memory usage will reach 64MB VSZ and 48MB RSS with probably about 1.2% CPU usage.  This would be well within the abilities of the current hosting and would use about 15% of the overall available resources.

What I am a little afraid of is memory leakage.  Contrary to popular folklore, running C# does not completely eliminate memory leakage, it just makes it easier to avoid.  The nice thing is that I’ve designed all of the game objects with instance counters, so at any time I can get a count of how many rooms, objects, mobiles, etc. exist in memory at any given time, whether they’re actually active in the game or not.  This will make it easier to track down leaks if any happen.

Worst case is if resource usage expands drastically we may have to upgrade from the Linode 360 to the Linode 540.  In that case, running Basternae would cost a total of $120 per year.  I’ve been spending that much on lunch every two weeks (I really need to cut down, but I work next to all of the best restaurants in my city), so it’s not exactly a huge number in the grand scheme of things.

It should also be mentioned that on Windows, memory usage is only 14MB.  Running on Linux/Mono requires a lot more resources.  Part of this is because some of the things used by .NET are automatically loaded by the Windows OS so they don’t contribute to memory size, and part of it is because in a way Mono is actually a “Windows software emulator” and is less optimal than something like a C executable compiled to run natively.

Mono 2.01 Doesn’t Like XmlElementAttribute

I have zone files loading on Mono now.

I had a sneaking suspicion that it had something to do with the XmlElementAttribute that I used to keep the XML tags in the zone files compatible with the encapsulated, property-based classes.  I spent a few hours updating the zone converter application so I could remove the XmlElement attributes.  After loading the MUD on Mono, all zone files magically loaded.  “All” being the ~6 that I’m officially authorized to use so far.

Since I’m running Ubuntu 9.04, the native version of Mono is 2.01, a bit behind the current version of 2.4 (which will ship with Ubuntu 9.10).  Installing Mono 2.4 on Ubuntu 9.04 is not as easy as one would hope, and I can’t say for sure that it would take care of the problem.  Mono has made great advances lately, so I’d be surprised if the latest version had the same problem.

Almost Working on Mono

There’s apparently a strange quirk to the XmlElementAttribute where you have to specify the data type for any type that isn’t a string (you’d think it would auto-detect an int property!)

So, with this:

///
/// The id number of the race.
///
[XmlElement("_number", typeof(int))]
public int Number
{
get { return _number; }
set { _number = value; }
}

Everything now loads, boots up, and characters can log in. However, when entering the game, there’s a NullReferenceException that happens on Mono (but not on the Windows version):

Unhandled Exception: System.NullReferenceException: Object reference not set to an instance of an object
at BasternaeMud.CharData.ResetStats () [0x00000]
at BasternaeMud.SocketConnection.ProcessMenuSelection (System.String argument) [0x00000]
at BasternaeMud.SocketConnection.ConnectionStateManager (System.String argument) [0x00000]
at BasternaeMud.SocketConnection.ProcessPlayerActions () [0x00000]
at BasternaeMud.SocketConnection.MainGameLoop (System.Net.Sockets.Socket control) [0x00000]
at BasternaeMud.Program.Main (System.String[] args) [0x00000]

So far it seems that this only happens for existing players. Creating a new player doesn’t cause this to happen. Might take quite a bit of effort to track down.

Not Working on Mono

I tried firing up the current Basternae 3 codebase using Mono on my Ubuntu server. It crashed. So, here are the errors I have to sort out before I can get to the next errors:

14:30:34 Trace: Loading spells.
System.InvalidOperationException: Standard output has not been redirected or pro cess has not been started.
at System.Diagnostics.Process.CancelErrorRead () [0x00000]
at (wrapper remoting-invoke-with-check) System.Diagnostics.Process:CancelError Read ()
at Mono.CSharp.CSharpCodeCompiler.CompileFromFileBatch (System.CodeDom.Compile r.CompilerParameters options, System.String[] fileNames) [0x00000]
at Mono.CSharp.CSharpCodeCompiler.CompileAssemblyFromFileBatch (System.CodeDom .Compiler.CompilerParameters options, System.String[] fileNames) [0x00000]
at Mono.CSharp.CSharpCodeCompiler.CompileAssemblyFromFile (System.CodeDom.Comp iler.CompilerParameters options, System.String fileName) [0x00000]
at System.Xml.Serialization.XmlSerializer.GenerateSerializers (System.Xml.Seri alization.GenerationBatch batch, System.CodeDom.Compiler.CompilerParameters cp) [0x00000]
at System.Xml.Serialization.XmlSerializer.RunSerializerGeneration (System.Obje ct obj) [0x00000]
14:30:36 Trace: Loaded 421 spells.
14:30:36 Trace: Loading skills.
System.InvalidOperationException: Standard output has not been redirected or pro cess has not been started.
at System.Diagnostics.Process.CancelErrorRead () [0x00000]
at (wrapper remoting-invoke-with-check) System.Diagnostics.Process:CancelError Read ()
at Mono.CSharp.CSharpCodeCompiler.CompileFromFileBatch (System.CodeDom.Compile r.CompilerParameters options, System.String[] fileNames) [0x00000]
at Mono.CSharp.CSharpCodeCompiler.CompileAssemblyFromFileBatch (System.CodeDom .Compiler.CompilerParameters options, System.String[] fileNames) [0x00000]
at Mono.CSharp.CSharpCodeCompiler.CompileAssemblyFromFile (System.CodeDom.Comp iler.CompilerParameters options, System.String fileName) [0x00000]
at System.Xml.Serialization.XmlSerializer.GenerateSerializers (System.Xml.Seri alization.GenerationBatch batch, System.CodeDom.Compiler.CompilerParameters cp) [0x00000]
at System.Xml.Serialization.XmlSerializer.RunSerializerGeneration (System.Obje ct obj) [0x00000]
14:30:36 Trace: Loaded 95 skills.
14:30:36 Trace: Loading races.
Unhandled Exception: System.Exception: Error loading races in Race.LoadRaces(): System.Exception: Error loading race in Race.Load(): ../races/Barbarian.raceSyst em.Exception: Race.Load(): Race number 0 already taken by Human. Can't load Bar barian
at BasternaeMud.Race.Load (System.String filename) [0x00000]
at BasternaeMud.Race.Load (System.String filename) [0x00000]
at BasternaeMud.Race.LoadRaces () [0x00000]
at BasternaeMud.Race.LoadRaces () [0x00000]
at BasternaeMud.Database.LoadDatabase () [0x00000]
at BasternaeMud.Program.Main (System.String[] args) [0x00000]

The first error happens when the engine tries to compile custom code in a spell file.

The last error, “race number 0 already taken” is not correct — the ID for Barbarians is set to 1, so the files are obviously not being read correctly.