Archive for June, 2009

keybinds, AI fanciness, and a bugfix or two


So yesterday Gaeel took it upon himself to drop into #twilightmmorl on QuakeNet and mention a few improvements to me. Specifically, he asked for configurable key bindings (because he uses an azerty keyboard), and an AI that fans out to attack rather than stacking up in a huge line. So I thought these were both great ideas, and implemented them.

The keybinding thing is something I’d thought about several times before and just didn’t care enough at the time to do, but I figured that since I had nothing better to do, I’d add it. It took a small amount of work, but now you can rebind most of the game commands. Unfortunately, you can’t use every key. Special keys like the arrow keys or function keys, etc, have multi-byte keycodes, so they’re not well-suited for being bound to, the way I’m currently doing things. I don’t see that as a large problem though.

As far as tweaking the AI goes, I just made it do something similar to when they AI finds a world feature in the way: it just picks a random direction to move in. This only kicks in for monsters with xlvl >= 30, but it’s a good idea, and makes the AI look a small amount less stupid. On the other hand, it makes the later-game fights a bit more challenging for the sloppy, but I don’t think it skews things too badly.

Thoughts for the Future

Ideas for the future include (as always) more instance dungeons, and also a way to voluntarily handicap yourself such that your level 60 character can be somewhat challenged by level 20 monsters. This would allow people to play with their fully-leveled characters, but assist their friends who may not have leveled as far. Since teamwork is what makes twilight the most fun, this would have a positive effect I think.


Instance Dungeons and Magic


So today I got bored. And, as is usual for when I get bored, stuff got done. I added instance dungeons. Or, one. It’s designed for level 20-ish players, and is located near the Ghost Academy on the right hand side of the upper section of the map. It was surprisingly easy on the code side, and it allowed me to use the SDK for something useful, finally. I tweaked a bunch of stuff in the SDK UI (specifically screen timeouts), and ended up with what I think is a decently fun instance. It’s certainly worth a play or two, and I think after I’ve played it a bit more and heard from others who play it, I’ll be able to do much better on the next one.

A couple days ago I also got around to adding the magic tokens I’ve been talking about for so long. They come in 4 flavors (War, Fire, Ice, Storm) and give you elemental attacks that are triggered in the same way as prestige class abilities. War is more powerful than the rest, but has the smallest range, Storm lies somewhere inbetween, and Fire and Ice are equivalent in range/power.

I also added an xlvl indicator to the player list/AFK screens, so you can tell whether someone else is of a close-enough level to you to be worth meeting up with and possibly cooperating with.

Thoughts for the Future

So with these things out of the way, my to-do list is mostly empty. Adding some level II magicy stuff is an option, with more potency, but directional firing. Adding more instanced dungeons is a definite option, and something that I most certainly should/will do, but it could take some time. Creative juices flow slowly in my mind.

feature tweaks


So, a couple days ago I got a long email from someone, with some questions and suggestions for twilight. Some of the suggestions were familiar (meaning, I get them regularly):

* Faster movement

* Message log

* No idle kick

* More advanced in-game chat

Being as I get these suggestions regularly, I’ve got my stance for why I’m not going to do them down pat. However, as I was typing up a reply stating that I wasn’t going to do any of the above, I thought more seriously about why I have an idle kick to begin with.

Way back in the day, twilight was a quick and dirty server-side-rendering roguelike MMO. That meant that fancy features weren’t necessary, and the easiest path was usually the path I took. That means that as part of the login process, the server checks to see if the account that is attempting to be logged into is already logged in. If it is, then it just denies the login request. Further, the game was much more challenging. You were likely to spend most of your time fighting monsters that you could barely beat (and then only by using shady tactics that abused the AI’s handicaps). I also envisioned a world that was more jam-packed with monster groups. This meant that if you were left logged in for too long, you stood a pretty good chance of getting killed (possibly repeatedly) if you were AFK.

In the 3 years since then, twilight has changed in all of those respects. It’s not quick and dirty anymore. It has a fairly nice, fairly mature codebase with lots of effort put into making things nice. The monsters you’re likely to fight have gotten easier out of necessity, as the shady tactics that abused the AI now don’t work because the AI is better. I’ve also found it’s more fun to kill lots of moderately challenging/unchallenging monsters than it is to grind against a lot of very challenging ones. ┬áThirdly, the world is spaced out more. There aren’t too many places where monster groups butt right up against each other. There’s generally a good bit of wiggle room inbetween where you’re pretty safe.

So, these factors combined set up a situation where booting idle players isn’t necessary for their own protection. This just left the factor of the server’s inability to log you into an account that was already logged in. That was fairly easy to fix, because a lot of the player infrastructure has gotten more robust in the past 3 years. So, I found myself left with no really good reason to keep idle boots around. So I didn’t. Now, if you’re idle for more than 60 seconds, you get made immune to damage and presented with an AFK screen that shows the other players logged into the game. I think that this is a really positive change.

Also, I made the key to see the list of players logged in more obvious. Previously you had to hit | (pipe) to get into the administrative menu, then l for the player list. Now it’s just W.

Additionally, I also added a small indicator of how much health you have to the inventory/pickup screens, so you can see if you’re getting attacked while checking your inventory out.

Next on the agenda is looking further into instanced dungeons (I’m currently suffering from a severe lack of inspiration for what a good dungeon in the upper fifth of the world would be), and also modifying the prestige class system to also handle magical effects a little better. Right now all magic comes from scrolls, but I really don’t like it too much, so I’m thinking about having some “tokens” that, when equipped, temporarily (or perhaps permanently, depending on how useful they are) place you into a mage prestige class for a particular element. So there would be an ice token that would allow you to perform a iceball effect every 5 seconds or something. This is much more easily extensible than the scroll system is, so I may end up adding ray and cone effects too, in addition to the current burst-style magic you get from scrolls.



So, of late, my job has taken a great deal of time away from my development, and I’m also running out of steam to work on twilight at all anyways. I really think it’s at a good level of maturity in terms of features, and I’m discovering that I just don’t have the inspiration to make Astral/Hell at a consistently high level of quality.

That said, I still do tinker around a bit. I sat down and just played the game for awhile a couple days ago, and discovered a couple bugs that I wasn’t aware of. In adding the feature whereby hitting p with only a single item on the tile automatically picked it up, I neglected to make shop squares with only a single item on them work correctly. So, I fixed that. I also tweaked the sshd code to make it more general and also added support for DH-14 (previously it would only use DH-1). I also located a bug in the SDK code where it wasn’t storing the unique items that NPCs carry.

While I haven’t done a whole lot of dev work lately, I have been kicking around ideas. Having static instanced dungeons scattered around the map is something I’ve thought about for awhile now, and I think I even started implementing it once and discovered there were problems with it, but I’m not sure :D. These sorts of dungeons would be much less work-intensive than trying to build sections of the overworld, so I’m probably going to end up trying it again sometime soon (I get off work and back to school in july). That’s about the only new-feature idea I’ve got at the moment though.