AVALANCHE
AVALANCHE is a third-person action game, set in the Final Fantasy VII universe,
and featuring music from Final Fantasy VII: Voices of the Lifestream.


News
Download
Media

Forums
Contact
Bug Report

Manual
Credits

Modding
Work Log


  
2008/05/31

Well, it's been a month, and AVALANCHE is done. The dungeon script was all finished, the battle arena was completed and enemy ordering was all laid out, and the multiplayer was started and finished, including support for clients sending their save data to the server to allow users to fight each other with their current single player characters and items. The final boss battle was animated out, including a couple pretty awesome paired animations between the boss and the player. A ton of difficulty tweaking was done, with feedback from several people, 2 of whom do not actually play any games in this sort of genre (I'm referring to the Devil May Cry type genre there, even though AVALANCHE has a pretty large number of genre-bleeding features). It's a bit hard to not make a game really hard for everyone else when you've been working on it for over 6 months. In my case, I've always been really awesome at DMC, Ninja Gaiden, and pretty much anything in the genre. So the first round of play testing resulted in a lot of "What the hell this is so hard!". I'm pretty comfortable with where things have ended up there. The game is still very challenging, but since it does have RPG and status elements, even people who kind of suck at DMC-style games can resort to leveling a lot and still make it through.

I also ended up doing a lot of work for making the game moddable. I have no idea if it's going to get a following large enough for anyone to be interested in that, but it's nice to be able to make a whole new weapon or other inventory item by just modifying a few files.

Oh, and Chocobo Wonderland was started and finished. It's a pretty great sandbox area, among a lot of other things.

Right now, I'm working on the web site, which is where this log will end up soon. I've created a couple trailer type videos with intro and game footage, and will be uploading those in high quality WMV9 format as well as on youtube. I'm sure none of the dialog from the intro will be readable on the youtube videos, but it can't be helped.

This has been a good project. It's good to finally be done. Of course, I'll be continuing to address bugs and make feature updates, but at a somewhat more relaxed pace. I've got some vacationing to do.

2008/05/05

So the dungeon maps were completed in under a day. They're not very detailed, but not entirely repulsive. It also turned into a dungeon map. It's just fairly massive and persistent. Teleport points are placed through-out to allow you to go immediately back to the lifestream hub, and each time you progress to a new teleport point, another point becomes unlocked in the hub area so that you can instantly travel back to where you left off. There are 6 teleport points in total.

I ended up duplicating a lot of geometry and doing some retextures. I had the rather interesting idea to make the second variant of the main area dark and a little horror-ish, which works out well with the Whole Eater gameplay and concept. You're given a flashlight to see, and it's automatically bolted to your hip while equipped.

The flashlight exposed a couple lighting bugs with that new light caching system I made a little while ago, so I spent a day or so resolving all of that stuff. Interestingly, I also ran into a precision problem with projected lights when the near plane is too near. I wasn't expecting that at all with the kind of floating point ranges I'm using, so it took an hour or two of wondering why in the hell projected lights seemed to randomly cull off geometry inappropriately near the end of the projection frustum before I figured it out.

Other than that, there's just a great deal of scripting work to be done throughout the dungeon map, so I'm chipping away at it. On the whole, the game code has become quite voluptuously full-featured, with all of the script handlers and common object types there are to work with now. This is going to be an excellent platform for future projects.

2008/04/24

I see I haven't updated the log in a while. Well, the Mako Forge is complete, and has been for quite some time. The battle arena has been finished as well, including skyboxes and other various effects related to it. The actual enemy spawning order and tier rewards still need to be put into script, but that's a rather trivial balance-related task. Additionally, the way strength and defense stats affect damage was changed significantly. All of the enemies are in and finished with all of their unique abilities, so something resembling final playtesting has finally been possible. Today I finished the last of the inventory items, and added the quick selection feature in addition to the ability to sort your inventory as arbitrarily as you see fit. This creates a very nice exponential sort of gameplay scenario, since you can then create groups of items within your inventory for quick switching, and do massive chains of guns, swords, explosives, status effect items, and so on without ever having to stop and enter the menu. Swords/melee weapons are also their own special inventory item type. When a weapon is equipped, the item button becomes part of the combo chaining along with punch and kick. Quite a few melee weapon animations were added specifically for this purpose. I think the longest fixed chain is now 12 moves, which includes several sword moves. That's getting into Tekken-level insanity, but it's a more logical chain of performed actions than simple arbitary button pressing.

As to what's left, still quite a few things. Chocobos are in, and ridable. However, I don't have much use for them currently. I want to design a small breeding system, so that's a large task still on the list. Drop chances need to be set up on all of the enemies for the various new inventory items. Multiplayer needs to be tested, but should be mostly working. However, I haven't started on the versus mode yet. That will be mostly making use of existing work and code, with just a bit of extra scripting around it. The only enemy left is Sephiroth, in the final boss battle. That will involve a lot of new animation, so I anticipate spending a week or two on it. And, finally, the actual standard dungeon maps. This is the big thing. But other than that, all systems should be complete, and hopefully the creation of the dungeons will go smoothly, as all of the necessary functionality to support them is already done. Cosmetically, they are going to be very simple and straight-forward, for simple reasons of time constraints.

Well, that sums things up. A lot of time will still be spent tweaking, balancing, and fixing the small bugs that come up. That's how it always goes, though.

2008/04/07

I finished game saving/loading and all of the menu interfaces for it today. I'm starting work on the Mako Forge interface. All of the underlying work that needs to be done for it has been done for a long time now, so it's just a matter of hooking up menus and some client-server messages. I think this is the last thing that needs to be done in terms of menus and interfaces.

2008/04/05

Added a stream data container, which allows writing bits into the stream as well. Very useful, I wish I'd taken the time to do it back before I wrote most of the network delta compression code. Also added some R-Script interfaces for getting and setting gvars in script code, wrote some save-load code, and am working on some lifestream hub intro sequence stuff (small events that happen the first time you enter the map). I also went through and eliminated almost all use of STL maps in the engine code, replacing them with my new container types. This turned out to improve load times by a second or two, largely because I'm now using a specialized hash string map in place of my STL maps with CString lookups (which was a terrible thing to do). I also decided to precalculate triangle edge data in the RDM format. It was previously calculated at load time, but with these 50,000+ triangle models, it was starting to get timely. Load times are back down to 2-3 seconds now for even the complex maps with a couple hundred megs of textures.

2008/04/03

Ended up implementing a bunch of containers. Some hashed map types, new array type, and some other things. I've been putting that off for a long time, and having some of these new generic container types is already coming in handy. I've been using the hashed string map in the new game variable system, which is basically an interface that extends across game code and R-Script, and allows values to be made persistent across map changes and savegames. Additionally, I spent a while tweaking the gravity and velocity on air attacks. It's a difficult thing to get right, particularly across the very subtle timing inconsistencies between low and high framerates. Being able to do two divekick bounces off of an enemy before hitting the ground felt wrong, so I added a short in-air recovery animation after the dive kick and flip kick. It feels quite a bit better this way. I also decided to add a super ground crush, which can only be performed at the end of a flip kick chain combo with both the flip kick and ground crush abilities. There are a lot of potential chains and reasonably complex enders now, so I'm pleased with how that's come together. As a great man once said, sometimes the best ideas are found at the bottom of a bottle of whiskey.

2008/04/01

A battle arena prototype is up and running. I spent most of today fixing various game-related bugs and tweaking things. Adjusted the lunge speeds and ranges on the e30's. There was a bug in the view-in-shadow-volume detection that had somehow not shown up until now, I noticed it on a pillar in the battle arena. I found a frustum projection "bug" in the process (actually, I was just rejecting projections over a certain extent for quality purposes, back when the function was only being used for shadowmaps in a 90 degree arc), which also reduced popping from the forced-single-frustum shadow map projections.
I have a bunch of coding work to do following the completion of the lifestream hub and battle arena, and some skybox effects to implement for the battle arena.

2008/03/30

Putting a few extra touches on the cathedral, then I'm starting on the battle arena.

2008/03/29

I decided to implement a light caching system today. When a light and static piece of geometry are interacting, an extremely efficient per-triangle interaction set is calculated on another thread. This cuts down on draw counts a surprising amount, due to the situation where the bounds for a surface are stretching across a light, but no actual triangles are intersecting. It also naturally helps fill rate, particularly because light backfaces are culled as well. It does provide much less of a benefit than what you'd see in most modern scenes, which is why I had questioned whether to implement something like this initially. The way I break my mesh up and use reference leaf nodes tends to minimize both wasted draws and unnecessary fill in most lighting scenarios.

2008/03/28
The lifestream hub is complete, in the form of a rather vibrant cathedral. Still needs a lot of detail work, but the time budget for detail work is low.

2008/03/25
The past couple days have been spent messing around with design ideas and making textures for the lifestream hub. I've settled on a setting and layout.

2008/03/23
The code todo list has finally reached a mostly emptied state, and it's time to move back to mapping. The reactor and all scripting for it is complete now, and the lifestream hub is next. I've been conceptualizing this in the back of my mind for the last week or so. I'd really like to do an elaborate tropical cliff-side design, but since I'm only one man and it would add weeks to do an outdoor design with lush foliage properly, I'm forced to consider other options. The crystal room idea is moderately appealing, but I haven't sold myself on it. I spent a few hours looking over palace and cathedral architecture to see if anything appealed strongly. The vision is starting to come together slowly, and I'll probably begin the actual brushmaking shortly.

2008/03/22
I decided to start this worklog today. I'm writing a backlog of a couple days, but I don't really tend to remember what the hell I was actually working on more than 5 hours ago. I'm just using my sparsely updated todo list to spark my memory.
Today I added some more R-Script interface functionality, including a bloom modifier function (which sends a message to clients and adds a factor to the bloom range). Also fixed a threading issue with network messages. It slipped my mind that when the server is local, rather than going through any actual network interface or queue, messages are processed in client code immediately. Since the entire server is now running on its own thread while the client processes, this had to be changed. Adding a local message queue was a cheap and easy solution. It's also more consistent with real networking behavior.
Went on to redo light scissor calculation and the confine-point-to-frustum routine. I had the thought that the real exact way to do this would be to adjust on each frustum plane on a vector crossed with the near plane (with a distance of 1.0/dot(nearPlane, plane)*distToPlane), and this turned out to be perfect. Also spent more time fixing collision errors. Ran into another precision problem with the swept sphere versus triangle mesh and had to add yet another epsilon hack. Collision is so ugly. A good number of my days have been wasted on it in the last couple of weeks.

2008/03/21
Took the leap over to full HDR. Getting this implemented in under a day was a nice surprise. I'm pleased with the performance, I was expecting more fill problems on my GeForce Go. Although, my hardware doesn't support the multisample extension, so that's a bit of a bitch. With this, the old fake bloom has been ripped out entirely. This also had the side effect of speeding some things up and making the render loop much more cosmetically pleasing.
Spent some time fixing subsequent bugs with alpha/color clamping, and changing the stencil-based post-processing effects to work with the new HDR buffer.

2008/03/20
Animated some more moves for the E30 enemy, including dodges, lunge, and blocking. Also added a new black version, which is the super tough variant. His ability to dodge is greatly increased, as well as blocking probabilities, countering, and quite a few other things. Beating him without mako charges is a bitch. He makes it worth the effort by dropping a phoenix down now and then, if your luck is high enough.
Added quick getups for Tifa, she can now roll or flip out of a knockdown. This is a special attainable ability.
Also spent time working a bit on group combat AI. I'd found that trying to fight 10 guys at once was quite annoying due to the clutter and relentlessness of each individual enemy. I implemented a bit of global consciousness to combat this, and there are some global values calculated each frame that each enemy pays attention to. Among these values are the number of enemies actively closed in on the player, and the desired number of enemies to be actively closed in on the player, which fluctuates randomly within a certain range. This ended up working out very nicely, and caused a nice combat rotation which flows rather seamlessly.
More time was spent tweaking various animation timings, adding and tweaking some player move chains, changing dotproduct thresholds on backward-attacks, and a bunch of other polish work.



Site design and contents (c) 2008 Rich Whitehouse.
All images and original media from Final Fantasy VII are copyright their original owners.
AVALANCHE is not supported by Square Enix, and is not officially related to the Final Fantasy franchise in any way.
You alone are responsible for any damages which you may incur as a result of this web site or files related to this web site.


101487 page views since 2008-06-01.