It's December, which means Leadwerks for Linux is nearly here! Last week I had to get into more depth with our tutorials. We're creating a series of maps that demonstrate simple game mechanics. The goal is to show how to set up game interactions by attaching scripts to objects and connecting them in the flowgraph editor, without getting into any actual programming. These lessons center around a first-person shooter, but are applicable to many types of games.
I had to get my hands dirty in the lessons another programmer was developing because there were a few bugs preventing them from working right. As we started getting into some more advanced interactions and physics we found some things that had to be fixed. Most of this revolved around the character controller physics and all the different situations the player can encounter. It's now working correctly, and we will be able to demonstrate some fun physics puzzles you can set up in the editor.
There's just a few more steps to getting Leadwerks for Linux out. The new tutorials need to be written and recorded, which is actually the easy part. The final lesson needs a full mini-level designed. I'm still having trouble with the GTK UI, but it's the kind of thing that I just need to keep plugging away at. Since the Nvidia and ATI drivers for Linux work flawlessly, we aren't dependent on any third parties fixing their code, which is a big relief.
Before Kickstarter, we ran a Greenlight campaign to put Leadwerks on Steam. Originally, this was going to be released last summer, but I decided to focus on Linux development and release them around the same time. Leadwerks for Steam is a more limited version of what the Kickstarter backers are getting, and will initially only be available for Windows.
Building FPS Mechanics
Getting into the lessons was fun for me because I got to work on some gameplay design. When building a game, it's important to decide what to focus on. There are an infinite number of ways you can waste your time, so it's critical that you decide what is important and focus on that. We could have implemented an endless number of little interactions in our gameplay lessons, and it's easy to do with our flow graph system, but I decided I wanted to focus primarily on the basic combat and feel of the player. There's a big difference between a demo where you walk around in a game level holding a gun, and a first-person shooter that feels like you are interacting with the game. I wanted to capture that feeling of being in the game, because it will benefit all the derivative games and demos for Linux that are built off of this. With that in mind, I set out to analyze exactly what it is that makes a first-person shooter feel interactive.
The first basic thing you can do to enhance the player experience is add footstep sounds. Don't use just any footsteps. if they don't sound good, it won't feel right. IndieGameModels.com happened to release a pack of footstep noises that are excellent. I negotiated a special license for some of the sounds and will include them in Leadwerks 3.1, free for use. One subtle thing I learned from Valve games is that it's better to play the "landing" sound when the player jumps, not when they land. It gives a much better feeling of interaction with the level, for some reason.
A very slight camera bob was added so that when you jump, it feels like your arms have inertia. I also tried smoothing the rotation of the arms so they lag a little as you look around, but it looked terrible and they were jumping around on the screen. So while a little inertia can be a subtle indicator of motion, too much is definitely not good.
How do you really tell when a gun is being fired? What makes it "feel" right? I had to look at some games from the all-time masters of first-person combat, id Software. I added a muzzle flash sprite that appears for a fraction of a second when you fire, as well as a point light at the tip of the barrel. The deferred renderer in Leadwerks 3.1 makes the light cast dynamic shadows, giving a convincing feeling of space and depth.
When a bullet strikes a wall or other surface, you need some visual cue of what happened. A set up two emitters that get copied and played with a one-shot animation whenever a bullet collides with something. One emitter throws off solid chunks with a high gravity value, while the other is a software smoke that slowly emits from the point of impact. A secondary blood effect was created for when living objects are shot.
When i initially implemented combat with our crawler character (the new AI navigation system makes this great!) I found the action to be...strange. I had a pistol with unlimited ammo and no reloads, and taking down a pack of crawlers was extremely easy. I assumed I had just not given them enough health, or made the bullets too powerful, and just kept working on it. It wasn't until I added two other aspects of gameplay that I realized how big of an influence they have on the game mechanics.
Reloading your weapon doesn't just give you a feeling of "realism". It actually introduces a whole new aspect of gameplay. Not only do you have to ration your ammo, but you have to ration your clip and not fire too many shots too quickly. Once you get surrounded by a pack of crawlers and you are trying to reload your weapon to get another shot off, you can quickly get taken down. So the speed of reloading and size of the clip actually become critical design decisions on what kind of game you want.
The second thing I added was making the camera bounce around when hit. When a crawler slaps you, the camera will be pushed off to the side. You can see this in Doom 3 when the player gets hit by a monster. I found this enhancement has two effects:
- First, it's unpleasant. Having your view suddenly disoriented is a jarring feeling that comes through the game to effect you in real life. It's almost as good as the pain vest I see someone besides me also had the idea for. When you have the possibility of an unpleasant experience, it makes you afraid, and changes the way you play and makes enemies feel much more menacing.
- Second, it adds a new gameplay mechanic. Getting slapped around makes it harder to aim. If you get surrounded by a pack of enemies, it gets very difficult to hit anything. So not letting them get near you becomes very important.
I think that by focusing on these core elements and providing a structure Linux game developers can build on, we can foster development of a great many derivative projects that make use of these mechanics. The fact that it's happening on Linux is exciting, because it feels like we are doing something truly new, almost like the early days of first-person shooters.
It's hard to predict the exact release date of Leadwerks for Linux, but we're getting close. My original estimate for the development timeline turned out to be pretty accurate on almost everything. Stay tuned!