AKA Changelog 0003
I realized the other day that I hadn’t written a changelog in quite a while, like since last september. Until quite recently I have been working on other contracts and projects so not much headway was being made on my own game. I went back to see what I had written then. Unsurprisingly, not much has changed. No game dev elves picked through my files to fix anything or finish up my work.
This post could be considered getting back into the swing of it again. I wrote back then that I was working on the enemy pathfinding and AI. I’m right back at that, but I have given the Navmesh part of the pathfinding less and less priority in favor of independent enemy ai using sensors and a general awareness of the world. This seems to pair better with physics interactions and physics based movement.
One major thing I have changed is that I started using the dungeon architect add on for unity to help create level layouts. It has been very helpful for testing, since I can now change levels and level elements with a couple clicks or a simple script.
Anyone reading this who is familiar with game development, and especially game development in unity, will be nodding along. Everyone else, sorry you suffered through that. Next week will probably be more story.
Best Games - Gauntlet
Arcade games from the early 80’s are either so simple that the rules of play are apparent just by looking at the screen, or they are so abstract that it’s a puzzle just to decipher the controls. Gauntlet is a little of column A and a little of column B.
If you were handed a screenshot of Gauntlet you would have no trouble figuring out the moment to moment gameplay. You guide one of 4 fantasy trope characters through a maze of monsters and treasure. It seems pretty straight forward. If you play it, you would quickly find that it’s not so simple.
Like Dungeons & Dragons that influences it there are a lot of systems at play in Gauntlet. Your health is constantly decreasing but there is food available to boost you back up. Some enemies must be shot with your ranged weapon and some can be crashed into to defeat them hand to hand. Magic potions are room clearing super weapons but you might want to save them up to deal with the grim reaper. Combine these systems with the blistering pace of action and it would be very easy to miss most of them. It’s a game that you could very easily spend many quarters on and never understand what the traps do, or why that food just disappeared.
Gauntlet might be one of the first games to include an in game tutorial system in the form of the ever present announcer. Very few games before Gauntlet included digitized speech. It was just too expensive and there wasn’t a compelling reason outside of novelty to add it. In Gauntlet it makes sense to quickly pause the action and deliver some information. When you hear that “Elf needs food… badly!” you won’t forget or ignore it. When the music chimes in followed by the instruction “Don’t shoot food” you will pay a little more attention to your aim. When you hear “Valkyrie is about to die” you will know that it is less important to clear every monster from a level, and more important that you make it to the next exit.
Gauntlet teaches you how to play it while you are playing. It nudges you to improve.
Of course Gauntlet also originated and perfected the microtransaction with the ability to add more health just by paying a quarter for it. It was pay to win before that was ever a thing. But let’s not let it’s sins overshadow it’s achievements.
Gauntlet is a good game, but it teaches you how to enjoy it. That makes it one of the Best Games.
No new story or chapter this time. I’m still writing (and rewriting) the next part and I swear there is a plan. Well like 80% of a plan. The other 20% I’ll figure out when I get to it. Or I won’t. I suppose that is an option.
Anyway, I wanted to write a bit about animation. Over the past few months I have gone from knowing very little about Unity’s Mecanim animation controller / state machine to, well, still knowing very little but it’s an actionable very little. It’s the very little that I can use to get some work done.
There is a simple beauty in the way that mecanim works. It’s very much geared toward game development but I think that any animator would benefit from using something similar.
I’m not going to give a mecanim tutorial or anything here, because first I don’t think I really know enough about the minutia to do that, and second that sounds like a boring read. Instead, here is why I think this is a useful tool for every animators toolbox.
There are a lot of requirements for a piece of animation. If it’s a character it needs to engage the audience with a sense of internal life and movement with intent. If it’s mechanical animation it needs to be physically consistent and purposeful. If it’s fx animation it needs to buoy and enhance the scene.
Cool. Enough with the artsy nonsense. There are some other things that animation needs to do. It needs to fit a certain motion into a finite amount of time, often a very short amount of time. It needs to seamlessly link up with the animation that precedes and follows it. It needs to conform to screen space and composition requirements. You can animate the most beautiful flowing motions and the most emotionally impactful subtlety, but if it doesn’t work with everything else being presented it is bad animation.
Games are interactive so they are difficult or impossible to pace in the way that a film or tv show would be. The player doesn’t have to follow the script and storyboards. If they want to jump or run in a circle while important dialog is being delivered, they can and often will. A game has to allow for that. Tools like mecanim exist to account for this chaotic element.
Mecanim breaks motions and character interactions down into a series of states. You can set it up so that certain motions can blend into other motions. If, for example, the player presses the jump button. You can have the character transition into a jump animation that includes a crouch, extend, arc through the air, and land absorbing the impact. The character then returns to a ready position and the player can press the jump button again. Realistic maybe, but in an action game that wouldn’t feel very responsive. What if the character took a shoulder tackle mid way through the jump. Do you wait for your beautiful jump animation to finish before transitioning into the beautiful tackle reaction animation. Or do you break that jump up into separate chunks that can be transitioned into and out of at any point. Now when the player character is extending their legs and just about to leave the ground, you can have the shoulder tackle interrupt that animation in a convincing way. Using mecanim means thinking about you animations differently, less like a scripted performance and more like a set of possible performances.
There are already some animators groaning that this steals the dynamism and pacing from their control. Bunk. At the core of what an animator does is solving the problem of making a thing that has no life seem to be alive. The problem remains the same whether solving it for a scripted, linear scene or a possibility space of potential scenes. Making the character or environment live from moment to moment is still the job.
What working with a tool like mecanim does to the way you think about animation forces you to consider the technical. Managing time and space becomes much more important. Creating animations that can cleanly link from one to another at pretty much any point becomes important. The constraints of the tool become strengths. A nice character moment can’t exist in only one scene, but must be available any time the player triggers it. It makes you as an animator consider character intention even in otherwise static moments.
When motions are chopped up into slices of a handful of frames each, every moment becomes a time that you can express the internal intentions of a character or piece of animation.
Ryu’s idle animation in SFII is 4 frames. 4 frames. Every ounce of internality, every bit of intention, everything that tells you who that character is lives in 4 frames of animation. Using mecanim will force you learn just a little of how that is possible.
Okay. That's chapter one. I think. It's a very early chapter at the very least. I won't post updates on this story every week, but I will post every new chapter. If you have any suggestions, questions, edits, or criticisms, please send them my way. I'm not done editing this by a long shot, and pretty much everything could change. It's all about the rewrites.
“Hold up. I see one. Due south.”
The flatbed came to a lurching stop and bounced slightly as the one back wheel settled to the ground.
“I don’t see it.”
Jan handed the binoculars down to Khary through the open cab window. He took off his glasses, folded them neatly and placed them in his shirt pocket before accepting the binoculars and pivoting them up to his eyes.
“Straight south.” She pointed toward the find even though the roof of the cab made it impossible for Khary to see where her hand was directing him. “It’s laying down in the grass.”
He twisted slightly to survey the field of waving brome. There it was. Just barely visible among the green and brown tufts. The mottled colors of the plate matched its surroundings almost perfectly, Almost. The grasses swayed and drifted, but the patterned armour remained as unmoving as a stone.
Khary handed the binoculars back up through the window. “Good eye. Tell me when you’re holding on.”
Jan beamed with pride as she took back the binoculars and slung them over her neck. She grabbed hold of the welded steel frame that acted as a lookout perch behind the cab and hollered down “Ready!”
Three of the float plates engaged with a dense hum, the fourth one wheezed slightly, before the flatbed jolted forward. The single metal wheel they had attached to compensate for an anemic float plate skipped along uneven ground pocked by gopher holes. The entire flatbed vibrated and Jan gripped a little tighter. As the vehicle accelerated from ‘brisk walk’ to ‘commendable jog’, the wheel finally lifted off the ground. The vibrations stopped, and the flatbed gilded silently, save for the harmony of hum and wheeze beneath Jan’s feet.
Jan tried to keep her eyes on the fallen armour, but it was difficult to see over the cab. It wouldn’t have moved. They never do when they hit the dirt like that. “Depleted” was the word Khary used. It was the word he had learned as an apprentice and the word she would be expected to pass down to her apprentice. Armours were “Active”, “Inactive”, or “Depleted”. Not “Alive”. Never “Dead”.
Khary drifted the flatbed to a gentle stop a few meters away from the depleted Armour.
“Get the winch ready. Let’s see what we got.” Khary called up from the cab.
Jan could see from here that this Armour was most likely Concordian, or a Uniune decoy made to appear Concordian. It was easily over a century old, judging by the wear at the joints. The protective plating abraded to a dull smooth finish. In the time she had been riding with Khary they had recovered 43 just like it. They had spotted another 56 active Concordian units and stayed well out of their range just be safe. Khary had called out most of them from the cab before Jan had seen them, despite her riding in the lookout perch and clinging tightly to the binoculars. He knew exactly what type of Armour they were looking at, but he always said ‘Let’s see what we got’. Probably another phrase that he had inherited from his mentor and was now being passed down to her. She had already adopted so many of his verbal tics and mannerisms, but ‘Let’s see what we got.’ seemed like a quaint affection she could skip. Jan suppressed the urge to roll her eyes.
Khary hopped down from the cab, and removed his ever present beige cap. The original olive green dye could still be seen at the seams, but the rest was beige. He ran his hand across patches of tight black curls, islands of hair in an ocean of deep brown scalp. Jan figured that Khary hoped to one day discover handfuls of thick wavy mane up there, but today wasn’t the day. He would most likely search again in an hour or so. Until then, he slapped the cap back on and tugged it into place.
Jan had unlocked the winch and replaced the standard clip with the older Concordian forked hook configuration. She jumped down from the side of the flatbed and joined Khary in quizzically assessing the depleted Armour.
Khary shot Jan a sidelong glance. He was clearly considering something, but he hadn’t let her in on what it was yet. He looked back at the Armour and pulled out his pocket radio.
“Really? I didn’t notice any change in the field riding out.” Jan Blurted.”Still weak enough to pull in signals from Rose Lake. It was fiddle music all the way out here.”
Khary ignored her and slid his finger across the flat rectangle. Static, different static, and then a jaunty toe tapper. The sort of fiddle music that Jan liked well enough when she was drunk and dancing with northern townie boys. Listening to it for hours on the radio was a bit much though. Khary never seemed to tire of it.
“See. Depleted. There is no field here.” Jan said flatly.
Khary nodded slowly, not at all convinced. “You go feet. I’ll go head”
For all the confident ‘depleted’ talk, Jan still took a wide, slow path to take up her position at the Armours feet. Khary went toward the head hauling the winch line with him.
The Armour was face down in the dirt, arms and legs splayed but relaxed, like it had laid down to rest ages ago and just never got back up. That probably wasn't far from the truth. Armours were sturdy, but nothing is made to last forever.
Other than being depleted, Jan could see nothing unusual about this Armour. About 3 meters tall, probably 250 kilograms clad head to toe in smooth chitinous plates of engineered fungus. Impacts, heat, cold, radiation, judging by the healed over scars this unit had experienced them all and shrugged them off. The one force it couldn’t withstand was time.
“Keep clear of that weapon.” Khary chided in that parental tone of his. He kept his voice low, but clear, like he was presiding over a funeral. Jan felt it was an unnecessary affectation. They could scream, or sing, or laugh. She was pretty sure the Armour wouldn’t be offended.
Jan looked over to where the Armours right forearm lay pointing back toward its feet. The launch tubes were empty and the rail was wide open. A tuft of grass was growing through the heat exchange vents. This Armour hadn’t created any ammunition or fired that weapon in years.
“Uh yeah. I think it’s good”
“Are you talking or listening.”
Khary stared back at her. It was the ‘take this serious’ look. Jan nodded and acquiesced but couldn’t hold back a small grin.
“Weapon appears depleted. Staying off axis.”
“Good. Okay. So, what have we got?”
Jan made a show of looking the Armour over. Tipping her head and squinting slightly.
“Concordian medium ranger. Fifth gen, maybe?”
Khary gathered the winch line into a loop in his free hand. “Yep, but it’s probably a fourth gen with a modification to the back plate for carrying equipment. We’ll be able to tell for sure when we flip it over. The sternum is different on-”
Jan heard what sounded like firewood being split and almost at the same instant the weapon spinning down. Small flakes of shredded grass hung in the midday air. Khary still stood across from her looking like a question had just occurred to him and he desperately wanted to ask it. The Armour had both of its arms raised above its head, but nothing else seemed to have moved.
Khary wobbled slightly and looked down. His right leg, from knee to foot, stood perfectly upright like a post driven into the earth. The rest of him did not.
The next instant she was running. She didn’t remember deciding to run, but she was already halfway up the Armours back, landing her left foot deftly along its spine plating. Her next step landed on the back of its neck and she felt her foot lose traction. The Armour remained as unperturbed as a stone. Dark fluid had arced up from somewhere splashing across the Armour’s shoulder. Jan barely registered it as she crashed down, rolling over until her face was inches from Khary’s.
His lips were twisted up in a grimace, gathering the strength to scream or cry out in pain.
Instead, he glared straight back at Jan and grunted out “Stupid!. Damn Stupid!”.
Jan wrestled with her tongue trying to get any words out at all. Eventually she croaked out “Are you-”
Khary cut her off. “No. I’m not okay. Look at my damn leg! Hook the winch up! Put us both on the flatbed.”
“We’ll go back to town. We can be there before sundown.” Jan blurted. “The medic, or the monks can help.”
Khary grabbed her around the back of her neck and pulled her closer.
“No, Here’s what your gonna do. Wrap that winch line around my leg. Hook it up to the armour and put us both on the flatbed. Then you take us to Eliza or Ahmed.”
“But we can get to Ashbank. They have-”
“Are you talking, or are you listening?” The bite had left Khary’s voice, and his breathing had grown shallow. He squinted into the bright sun and managed slight grin.
Jan Looked down at Khary’s leg. She had seen it already, but the image didn’t register as real. Now she took it in.
In less than an eyeblink the Armour had reached up and clamped one claw-like hand just above Khary’s right ankle. His fibula and tibia had shattered to shards and grit instantly. His leg bent awkwardly below the knee. Bits of bone had torn through his coveralls and they were stained dark and wet.
The Armours other arm had aimed and fired, but there was nothing left in it to launch, save dust and blades of unfortunate grass.
Jan snatched up the winch line and looped it just above Khary’s knee, leaving enough slack to hook the forks between the Armours shoulder blades.
She looked over at Khary before bolting for the flatbed. He nodded grim approval of her work. She went for the switch that would reel them in.
“Wait!” Khary raised his head up slightly and pulled his cap down snug. “Just a second.”
He took a moment to take one deep breath and release it slowly. “Okay. Okay. Do it.”
Jan winced as she pressed the switch as if the pain were her own.
Khary didn’t cry out. He didn’t scream in agony or delirium. He chuckled. A light bouncing of the breath as if he had just thought of a subtle joke. The line pulled taught and Khary and the Armour both were dragged toward the flatbed. The vehicle bowed automatically to receive them forcing it’s single metal wheel out to the side.
The winch steadily reeled in the line and soon Khary slid up beside Jan. She stopped the motor for a moment to cradle Khary’s head and shoulders lifting him up over the short lip of the flatbed. Tears were streaming down his dark weathered cheeks. He laughed between choked sobs.
“It doesn’t even hurt Jan. I don’t feel anything. I just noticed. I don’t feel anything. Take me to the Armourer, okay? Take me to the Armourer, Jan. You listening?”
“Yeah. I’m listening.” Jan was surprised by the tears running down her own cheeks. “Yeah.”
Jan played fiddle music on the radio all the way to Riverbend.