By Jason
Regier
Published in Game Developer
Magazine, April
1998.

July 31, 1998
Vol. 2: Issue 30
|
1. Staffing problems.
On the flip side, it became clear very early in the project that we were
understaffed for such an ambitious undertaking. Success or failure rested
with a handful of people, and that was extremely stressful. Losing a programmer
halfway through development added still more pressure during the final push
to get the game out the door. Additional programming tasks had to be shouldered
by the remaining developers, who were already also responsible for level
design. To alleviate the problem somewhat, we even found it necessary to
ask our busy network administrator to aid in AI scripting and level design.
We did hire a third artist near the end of the project, but it was almost
too late. While his contributions to the final product were by no means
insignificant, it took a long time to get him up to speed. Similarly, when
we dropped the services of our original sound guy late in the development
cycle, a new sound team had to rush to redo all the work.
If you're looking for good anecdotes about how we blew off steam with wild
weekend trips to Cancún, you won't get any. We all worked incredibly
hard, and did so willingly because Myth represented a two-year
labor of love. All the great previews and supportive feedback from beta testers
kept us excited and made us realize that we really did have something special
on our hands. Nobody wanted to slack off and allow competing products to
beat us to the shelves. The moral of the story: staff up as early as possible
and plan to weather the unexpected.
2. Scripting.
The biggest announced feature that didn't make it into the final version
of Myth was a scripting language that would allow the player
to modify elements of the game. We had hoped that user scripts could be written
for extensible artificial intelligence, as well as custom formations, net
game rules, and map behaviors.
We selected Java as a good basis for the Myth scripting language
because of its gaining popularity, good information-hiding capabilities,
and relatively simple byte code interpretation. After several months of work,
early versions of the game loaded, compiled, and ran code from tag files.
A few simple scripts worked for presentation purposes, including one that
instructed a unit to search the battlefield for the heads of the enemy and
collect them in a pile.
Unfortunately, when the programmer responsible for the scripting language
parted ways with Bungie, we were left with a number of features to implement
and no library of user-friendly interfaces with the game code. Given its
incomplete state at such a late stage of development, there was little choice
but to drop this functionality.
3. More frames of animation.
One of the complaints most often voiced by players is that the sprite-based
units' animations are not fluid enough. At the start of the project, when
we planned for the number of frames of animation per unit, there was a good
deal of uncertainty regarding how much RAM would be consumed by large texture
maps, sounds, and other resources. As things were, it was not uncommon for
our landscape textures to reach 5MB in size, and certain animations already
consumed close to 1MB -- our uncertainties were not unfounded. We erred on
the conservative side. Though we implemented caching schemes that greatly
reduced our memory requirements, there wasn't enough time to rerender the
units.
4. Pathfinding.
Perfect pathfinding seems to have become the Holy Grail for games in the
RTSG genre, and Myth is no exception. The game's terrain is
a 3D polygonal mesh constructed from square cells, each of which is tessellated
into two triangles. Cells have an associated terrain type that indicates
their impassability, and they may contain any number of solid objects, including
trees, fence posts, and units.
Ah! Square cells, you say? Having read previous Game Developer articles (Bryan
Stout, "Smart Moves: Intelligent Pathfinding," Game Developer,
October/November 1996; Swen Vincke, "Real-Time Pathfinding for Multiple Objects,"
Game Developer, June 1997), your first thought may be that the
A* pathfinding should do the trick. The first problem with a pure A* approach
for Myth is that impassable obstacles, such as troops and trees,
may lie anywhere on the terrain. Penalizing the cells beneath impassable
obstacles is a bad idea because the cells are fairly large and obstacles
are not guaranteed to be aligned at the center of a cell. Furthermore, even
if a tree did consume exactly one cell, the A* path to avoid it would make
a unit walk up to the tree, turn, and continue around it. Units that bump
into trees and walk between the centers of large cells appear extremely stupid;
you really want your group of troops to avoid obstacles (including each other)
ahead of time, and smoothly weave their way through a forest.
To produce this effect, we created our own
pathfinding algorithm. First, we ignore all obstacles and calculate the A*
path based solely on the terrain impassability. For all intents and purposes,
the terrain in Myth never changes, so this path can be calculated once and
remembered. Now, we consider the arbitrarily placed obstacles and periodically
refine our path using a vector-based scheme. If the planned path would cause
us to hit an obstacle, we need to deviate our path. We recursively consider
both left and right deviations, and choose the direction that causes us to
deviate least from our A* path. Thus, we've considered terrain impassability
information and we can avoid arbitrarily placed (or even moving) obstacles
well before we bump into them.
For every game, pathfinding is a pretty complex and sensitive beast. This
method worked well for 90 percent of our cases, but rigorous testing revealed
certain cases that were not adequately handled. As the ship date drew near,
we were forced to say "good enough" rather than handle these problem cases
and risk introducing new bugs. Our current algorithm works pretty well and
provides the effect we sought, but there's definitely room for improvement.
5. Features that missed the cut.
With a few exceptions, everything from our list of "Stuff that Rocks" made
it into the final product. Those features that didn't make it came so close
and were so exciting that they definitely deserve mention.
Near the end of the project, we started adding support for 3D fire, which
would be ignited by explosions and flaming arrows. Our flames were sprite-based
3D particle effects, complete with translucent smoke. Fire could spread across
the landscape and move at different rates over the various types of terrain.
To our dismay, when a spark in the woods spread into a raging forest fire
(as it should), all the translucent smoke sprites slowed even fast,
3Dfx-accelerated machines to a crawl. With little time to rectify the problem,
we had to put out the fire, so to speak.
We had also planned for wildlife to scamper across the terrain and for birds
to fly through the air, breathing life into our empty landscapes. Our attempt
at ambient life started with a giant squirrel created by one of our artists.
Unfortunately, due to time constraints, we didn't have a chance to create
very interesting behaviors for it. Just about the only AI that we had a chance
to code simply made the squirrels gravitate towards the player's units. We
thought it best to drop ambient life rather than subject players to hordes
of nuzzling squirrels.
|