Saturday, June 28, 2014

Hellenica Characters: Brasidas

"You could have me outnumbered twenty to one and I would still have the advantage."

Spoken like a true Spartan!

This week we're revealing Brasidas, an elite Spartan soldier who embodies his city-state's ideals of bravery, honor, pragmatism, martial prowess, and rigid adherence to authority. He also happens to be the butt of most of Diona's jokes. No one ever said being Spartan was easy!

We wanted Brasidas to come off as a fairly typical Spartan warrior, at least until you get to know him better. Also, while much of the world of Hellenica has been transformed by the ongoing steam-powered revolution, Sparta's mostly stuck to its traditions. To that end, we set out to design "The Spartan Warrior", with some welcome touches from YDY to fit it into our aesthetic. Here's the first stab at it:

Well, I certainly wouldn't want to start a fight with him.

Brasidas is one of our strong male leads, and this initial attempt satisfied that need pretty well for us. There were just a couple things we had to fix up:
 - That iconic horsehair crest atop his helmet was actually reserved for officers or generals. Brasidas is just your average soldier, so that had to go.
 - While Brasidas has seen his fair share of battles, we didn't want his armor to look too shoddy. The cracks and wear in his legguards needed to be reined in.
 - We thought his legs could stand (ha) to be a big more muscular.

Looking good. We wanted to go after the iconic Spartan red for his cape, and for his armor, we stuck to the metals we know they had back then: iron, brass, and copper. Here's the first rough color:

I can't tell you how nice it is to work with artists that can get this close on the first try! Actually, it's my blog post, so I guess I can. (It's really nice.)

Our only qualm here was that the armor looked a bit more golden than we had wanted. As I mentioned before, we complete our portraits in batches, which gave us the ability to look at all of our Spartan characters and standardize their armor across the board. Awesome!

Here's Brasidas with his new set donned:

As always, once we're happy with how things are looking, the guys at YDY do a final pass for lighting and atmospherics. Here's the final image we'll be using in-game:

We're really happy with how Brasidas turned out. He adds some nice diversity to our cast, so I'm jazzed that he's finally making his appearance in the game.

'Til next time!

Thursday, June 19, 2014

Programming Adventure

So I spent a lot of time revising and debugging the level 5 Athens paths this week, and along the way I ran into a particularly nasty save-load bug. It was kind of an adventure to track down as well as a reminder about why good programming techniques were important, so I thought it'd be fun to write a post about.

The hunt began when I noticed the story map complaining about how it couldn't find the node corresponding to a certain location in the story. This error happens on occasion as we're adding new content piecemeal. It's usually harmless, but I wanted to clean things up in preparation for an eventual alpha test, so I decided to look into it.

What I found next was mysterious, the reason the map UI couldn't find an appropriate node was because the name it was being passed was blank. Further investigation revealed this error only happened when I loaded a particular save game...

An important step to solving most bugs is to get a reproducible case, so I set to work trying different approaches until I discovered that loading the same game twice would trigger warnings on the second load (but not the first).

Baffled, I went to examine the loading code, which looked fine. However, there was one comment warning me that the code would behave in a non-obvious way under certain conditions... exactly the conditions I was seeing the bug in. Sure enough, when I inspected that code more clearly I found a variable that wasn't properly reset on load, causing weird zombie paths that had the blank location names which were causing the initial error (and probably lots of other errors too).

So some take home lessons if you’re an aspiring programmer.
1. Make your code assert if anything strange is going on, even if the code could handle it. Weird values are a good indicator something is going wrong somewhere else.

2. Get a reproducible case. It's especially good if you can get one with only a few steps.

3. If you want to do something that's clever but a little bit confusing in code, make sure you leave a comment explaining what's going on. When a frustrated programmer (possibly even yourself) stumbles on that code at 2 in the morning trying to hunt down some obscure bug, you want her to be able to figure out what’s going on without having to solve some programming riddle.

Thursday, June 12, 2014

The Subtle Consequences of Choice

We talked before about the absurd branching we're allowing in Hellenica—how each social hub ends with 2-3 choices that can steer the player (and the story) in completely different directions. Previous posts have also dealt with the somewhat elaborate restructuring that sometimes needs to happen to make these stories flow into each other. But today, I'd like to delve into some of the subtle details involved. So far, no one's specifically noticed these kinds of dialogue tweaks as consequences of the choices they made, but I guarantee that they've improved the experience.

This week, I've been iterating on the various story paths heading into Athens in act 2, and I found that while the broad strokes all mostly worked, a bunch of little seams kept diminishing the narrative experience. As an example, while most of the story paths involved the party wanting to ask Socrates for help on their quest, the finer details about who their enemies were differed. This resulted in the characters either seeming to make HUGE assumptions about who the villains might be, or sounding mind-numbingly idiotic because of their inability to make obvious connections. So even though the overall structure and flow of the conversations remains the same for all incoming paths, most of the lines dealing with their quest have specific variants depending on how much a player knows.

Character relationships are another instance where subtle details can help a story flow much better. While players will interact with the various Athens NPCs under almost identical circumstances, it helps immeasurably to augment these interactions with helper lines that show that the characters actually remember if they've interacted with each other in previous levels. Once again, the additional lines are minor and the structure and flow of these conversations is mostly unchanged. But their absence makes the character interactions feel jarringly dissonant.

Another way subtle details were important in Athens was to acknowledge the fulfillment of foreshadowing. I don’t want to give too much away, but when someone predicts an event, and then later, it happens, the characters should acknowledge it. This doesn't change the party members’ reactions to the event, and surrounding dialogue is the same, but without that acknowledgement of the foreshadowing, the characters would seem less aware of their surroundings.

I'm hoping to have the level 5 version of Athens ready for internal testing any day now. So hopefully there'll be a post in the future about how well it's worked out and what else needs to be done.

Thursday, June 5, 2014

Hellenica Characters: Alcibiades

I'm back again this week with another character art update, but before I dive into that, I thought I'd talk a bit about how our process has been evolving.

When we first started out, we made the mistake of not lining up a dedicated, long-term artist. This meant we were contracting out portraits to different individuals from concept to completion. The result? Pretty inconsistent styles, as well as disagreements in color palettes and character sizes, which all translates to a waste of time and money.

Now that we've found a steady partner for our portraits, we're able to approach things with more of an eye towards the whole product. We've started sketching out related characters in a single pass. This lets us establish a cohesive look and iron out any issues between characters before we get too far along with any individual portrait. Then when we move on to coloring, we can make sure that our characters don't end up clashing with each other.

We're pretty excited about how things are working out now. I'll keep you posted if we make any more modifications to our process.

So, this week's character update involves the ever-popular Alcibiades. Quite frankly, he's a terrible person, which made this one pretty fun to make.

Alcibiades is based loosely on the historical figure of the same name. He comes from a wealthy line of Athenian aristocrats, the Alcmaeonidae (say it with me: alk-mee-ON-uh-dee), that has long been involved in the affairs of Athens. As a result, he's a real pompous jerk. Unfortunately, your party will likely have to deal with him on a few occasions if you spend any time in Athens.

We wanted to make his unsavory personality immediately obvious from his expression. He also needed to clearly communicate his background and his position in society. To that end, we made his robes a bit more extravagant than the other characters as a first step. We also outfitted him with an affected fan and a portable gramophone, a recent vogue accessory of the Athens elite (in the world of Hellenica, anyways). This in conjunction with the details of the belt also helped to tie in our steampunk aesthetic.

What do you think? Did our messaging work?