Why the girls are static

Why the girls are static

Yes, the girls in Life Pictures are static, they don't have animations. And that's a design decision. In this post we'll try to explain why the girls are static as best as we can, hoping that by the end you'll understand and agree that it's the best choice - or at least a decently good one.

Life Pictures is about an old man reminiscing about his life. He doesn't remember things very precisely and the order of events is blurry to him. He knows that he had met 3 women in his life. Who was the first and who was the last? That's up to you, the player, to discover.

To remember his past, our protagonist uses his album with pictures of his life - hence the name of the game. Each picture takes him back to his past, but since everything is a blur in his mind, he doesn't remember many details, neither about places nor people. He knows how these 3 women looked only from the pictures he has. He vaguely remembers the feelings he had for them and the important bits of what they were like as persons: passionate, joyful, loyal.

As the player, through the eyes of our protagonist, you enter through these pictures and see into his memories. Everything seems to take place in the same location, but that is only because the old man can't remember where things have happened and his mind conveniently put everything together in one place - a place that most likely isn't even real, but just a mashup of various memories blended together in this peaceful and serene location.

As you get closer to the stream of water, a memory will materialize in the form of the passionate redhead in his life. He begins to remember. What you see is a still, created in his mind from a picture of her and his vague memories. She is only there to be observed, to be remembered. You cannot talk to her, you cannot interact with her. She isn't alive, she's just a snapshot of the old man's memory of her. If you get close enough, you'll trigger more memories in the old man's mind. Events of his time with her. Happiness. Sadness. Resolution. Each of these events shows a different still of this woman, a memory deeply etched into his mind. Your purpose is to help him remember and to piece together the details.

Just as our protagonist keeps trying to remember the same things over and over, so will you as the player go over the same memories trying to find every detail. You use your camera to take pictures of various objects that cause the old man to remember some detail about that object. You can find memory glimpses and piecing them together will reveal even more about his past. And ultimately, you can help him find peace, by finding out something he believed in and showing him a life made only from the memories that are in tune with that belief.

So, you see, our game, as we stated so many times before, is not about dialogues and interactions, but about immersion, nostalgia, taking it slow, pondering, philosophy. It's about the joy of exploring, inspecting, looking for details and piecing together a story. If the girls in the game were animated, it would create the feeling of interactivity, the desire to talk to them, to influence their actions. If you add an animation, then it becomes quickly repetitive and the more animations you add, the more the need for interactivity and complex behaviors increases. Which is not what this small game is about. The girls are there to serve as visual testimony for our protagonist's memories.

We hope the information in this post helped you get a better idea of what Life Pictures is about and your purpose in the game. It's up to you how deep you dig to uncover everything about this old man's life. An ordinary life, with love and loneliness, suffering and happiness, but a beautiful life nonetheless, as all lives that are truly lived are.

Thank you for reading! And if you haven't already, please vote for us on Steam Greenlight!

Guess the movie

Guess the movie

With our Steam Greenlight campaign in full motion, we thought there's no better time like today to organize a little contest. The prize: free Steam keys for Life Pictures, when it releases, of course! The rules? Very simple! But first a little context.

Our main character loves movies and books. Time loops, memories and time travel are his favorite topics. If there's a dash of romance in there, even better! It's no surprise then that in his house there is a nice collection of movies that he keeps rewatching on his old school VCR. He purposefully put all his favorite movie on video tapes so he can use this relic from his past in combination with an old TV like the one he had when he was a kid. I guess as we grow old we tend to go back more and more to what made us happy when we were young or even children.

So, getting back to our contest, here are the simple rules:
  • Guess one movie from the screenshot above
  • Write your answer on this Steam discussion board, including the movie name and the corresponding videotape label from the screenshot
  • Writing your guess anywhere else will not be taken into account
  • You also need to provide a link to the IMDB movie page
  • If you guess more than one movie, only the first one will be taken into account
  • Whoever guesses a movie first wins a free Steam key for Life Pictures, as long as that person hasn't correctly guessed another movie before
  • For each movie, only the first person to guess it is awarded a free Steam key
  • The Steam key will be sent to the Steam account that wrote the answer on the Steam discussion board, when Life Pictures will be available on Steam
  • Winners will be posted on the Steam discussion board, along with the already guessed movies

Here is an example of how an entry should look like:

Simple? We sure hope so and we can't wait to see your guesses. With Shuffle out of the way, there are 25 movies just waiting for you to guess them and get your free Steam key! So go on to the Steam discussion board and post your answer there!

Steam Greenlight

Steam Greenlight

This is it! Our second time we feel like appearing naked on a stage with the risk of people laughing at us. The first time was when we announced Life Pictures. Thankfully, that time the response was pretty amazing and encouraging, so fingers crossed the same happens this time!

Life Pictures is on Steam Greenlight! Please vote for us and share the word with your friends, your enemies and everybody else in between!
To celebrate the occasion, we released a new trailer, this time focusing on the girls and parts of the gameplay. We hope you enjoy it!

Thank you for reading and please vote for us on Steam Greenlight!

Making the girls - iClone and Unreal equals love

Making the girls - iClone and Unreal equals love

When we started making Life Pictures, one of the biggest unanswered questions for us what were we going to do about the girls. As you may know, character design is difficult, especially if you don't have someone in the team with a lot of experience in character modelling. And considering how vital the girls are in our game, it was important to come up with a good solution. That our small indie team had a small budget to work with was also a factor.

The solution for us was iClone Character Creator, a very user friendly tool for making human models. With it, we could create great looking characters without having to hire a more experienced artist, at a fraction of the cost. While iClone isn't a very well known tool for artists, especially because they prefer using traditional, less automated tools, like 3D Studio Max and Maya, we're very happy with our choice and, more importantly, very proud of the results. We're sure a more experienced eye can find many issues with our models, but in the end, we think indie game development is about making the best game you can within your constraints.

In what follows, we're going to have a look at the process of creating one of the girls in Life Pictures. This isn't a technical dive or a how-to post, we're just showing the stages of design and integration. If you're interested in details about any step, remember we're always around on facebook and twitter, so feel free to ask away.

Starting with the default model in iClone Character Creator, the first step was to modify everything related to the body, until we reached a satisfactory result, a girl that gives the feeling of someone warm, joyful and playful. This step included changing the body proportions and, more importantly, all the facial features. And, of course, we added and modified the hair.

Once we were done with the body, it was time to dress up our girl - after all, it's not that kind of game. We relied on the content iClone Character Creator provides in terms of clothes. Below you can see the progress from the default model to our final model and the clothed version.

At this point we were done with Character Creator and it was time to send our character to iClone, which is the parent tool specialized mainly in animations. Here we're creating the pose for our girl. Since Life Pictures revolves around the snapshots in time of our character's memories, you'll experience the girls as if frozen in time.

As soon as the pose was done, we exported the character to Unreal, using 3DXchange to convert from iClone's proprietary format to fbx. When importing the fbx in Unreal, things didn't look too great. But that's because there was still a lot of work to be done, especially on the materials side. 

We used Unreal's skin shader material, custom hair and eyes materials and a bunch of different clothes materials. The difference from the imported materials was gigantic and lead to the final model you can now see in the game - well, actually, you can only see it in the screenshots for now, but you will be able to see it in the game when it releases.

One last incredibly important step was adjusting the facial expression. The pose we did in iClone only included the body, we preferred playing with the facial morph targets directly in Unreal. And it was the final touch needed so that our girls express a range of emotions like joy, playfulness or sadness. Below you can see the results, from the pose to the imported and the final version of our girl.

And, to get a feel for the details in our character, check out the collage below, showing close-ups of various model features and materials.

That was just a glimpse of the many hours we put in making the girls of Life Pictures. We hope you'll enjoy seeing them in the game! When, you ask? Soon, if we don't burn ourselves out before releasing! One of the reasons we wanted to keep our team small and our costs low was so that we could each invest as much time as we needed to come up with results that we're happy with, in everything we work on. While we're pushing for a 2016 release, it's more important for us to finish the game that we envision!

Thank you for reading!

Audio Design: Crackling bushes, chirping birds

Audio Design: Crackling bushes, chirping birds

In the previous post we talked about our approach for a character footsteps sound system using Unreal Engine. In this post we'll go over how we made the forest bushes make noise when the character is moving through them and how we set up the rest of the environment sounds.

Movement Sound Trigger Component
To detect when the character is touching a foliage mesh we used a static collision shape that doesn't generate collision events but only overlap events with the character capsule shape. This should be pretty cheap for the size of our terrain even if we have a lot of them, especially because we can set the collision to only check overlap events with a Pawn and mark them as static. This sound trigger component should allow us to easily set noise sounds for different foliage meshes in the level with different shapes and also allow us the future possibility of using compound collision shapes to represent more complex geometry if we needed.

So we implemented a component called "BP_MoveSoundTriggerComponent" that would bind to its actor's OnActorBeginOverlap and OnActorEndOverlap events to listen to when a character would enter/exit the collision shape:
Overlap Events
The collision shape is specified on the actor on which this component will be attached to. So the component requires an audio component and a collision shape on the attached actor. 

Let's see an overview of what this component does:
  • it listens to the overlap events to know when it's overlapping with a character - or any other component extending the NavMovementComponent
  • while a character is inside the collision shape it will "track" its movement speed factor to interpolate the owner audio component volume based on the movement speed
  • if the movement speed is above a minimum threshold it plays the assigned looping noise sound, otherwise it fades it out
Zooming in on the "Node_HandleActorBeginOverlap" blueprint node in the screenshot above, we get the reference of the overlapped "NavMovementComponent" from our character and we call our "SetSoundUpdateState" function to enable a Timer that will update the volume based on this character's move speed while inside the collision shape:
The "SetSoundUpdateState" function is for encapsulating the logic required to start/stop the Unreal Timer we used as a lazy update function:
SetSoundUpdateState function
You might wonder why we didn't use the "Event Tick" of the component for its core logic. We actually disabled the "Start With Tick Enabled" because all the instances of this component will actually have the native "Tick" function called by the engine every frame, no matter if you triggered an overlap event with its collision shape or not. Running any simple form of logic in the Tick for a high number of instances can quickly become a performance problem. So instead of investing precious CPU time on iterating the Tick for each component we decided to use a "Timer" that can be like an on-demand "Tick". For what this component does we don't need the timer to execute every frame, so we also added a parameter "soundUpdateIntervalSeconds" to tweak the time interval at which this function will be called.

When the looping timer is set it will repeatedly call the function "UpdateMovementSound" which is the core logic of this component. To get a better overview of this function we'll split its blueprint graph in half. The first thing it does it interpolates the volume of its audio component based on the character move speed factor:

UpdateMovementSound - Part 1
The function "GetMoveSpeedFactor" just calculates the speed factor taking into account the maximum speed that the component requires to actually play the noise sound at the maximum volume:
GetMoveSpeedFactor function
You probably noticed the function call "GetGroundMoveSpeed" in the above "GetMoveSpeedFactor" function screenshot. That's a simple utility function we talked about in our previous post.

Then in the second half of the "UpdateMovementSound" function we check if we should start or stop the looping noise sound based on the current move speed of the character. The character must have a moving speed higher than the specified "minMoveSpeedForStartSound" threshold:
UpdateMovementSound - Part 2
The "SetSoundPlayState" is a function to encapsulate the logic for playing or stopping the audio. The sound will be stopped with a fade-out when the character leaves the collision shape of the component. An example of why the fade-out is useful is if you would be running with the character through a bush it would generate a sudden noise at its maximum volume and then quickly fade out as you exited the bush, still hearing the noise just a bit behind you as you move away from it. It gives a nice natural feel as if the bush would calm down its moving branches after it had been suddenly rattled.

The looping update timer will also get stopped, as you can see in the initial screenshot where we initialized the overlap events. The "SetSoundPlayState" function looks something like this:
SetSoundPlayState function

This is the core logic of the "BP_MoveSoundTriggerComponent". A known limitation of this simple approach is that it can handle only one character component triggering the overlap events. But for our current needs it is more than enough. To handle multiple characters triggering the overlap events you can easily extend this implementation and store each character that triggered "OnActorBeginOverlap" in a TMap container, using our Blueprint "TMap" wrapper presented in the previous article. Then, in the update timer logic iterate through all the characters in the container to sum all the moving speeds to calculate a single global moving speed factor. This way the more characters move inside a collision shape the louder the noise should be. Of course, each time a character triggers the "OnActorEndOverlap" when exiting the collision area you should remove him from the "TMap" container.

To use this component, we created an actor with an audio component and a collision shape on which we attached and configured this "BP_MoveSoundTriggerComponent". As a collision shape we used primitives like the SphereCollision because they're very cheap to handle by the physics engine and they're a more than acceptable approximation of the shape we needed. The actor doesn't require any extra blueprint logic implemented to work. We called this type of actor: foliage sound trigger actor.

Using a custom editor tool we implemented, we could then automatically spawn these actors throughout our landscape at the position of a desired type of foliage mesh, get its bounds and automatically adjust the scale of the sound trigger actor collision shape to approximate the mesh bounds.

The Sound Cue we used for a bush noise looks something like this:

We used more variations of the same bush noise and we also applied a little randomized modulation effect to give it a more natural diversification.

And this is how we could bring some "life" into various foliage meshes in our forest using sound. Below are the links from where you can copy the blueprints shown above to help you put things together easier:

Environmental sounds
Let's have a quick look at how we create a nice audio ambient in our game environment, that makes you want to pause and just listen to mother nature. This isn't anything complicated or new, but we want to go over the steps in case someone might find them useful.

First of all, we have a looping ambient sound, consisting of chirping, wind and mild foliage noises, the kind of sounds you'd expect to hear when in the middle of a forest. This sound is pretty long, around 2 minutes, so it's unlikely anyone can notice that it loops. It plays as a 2D sound, so you can hear it from all over the world.

Then we have a few 3D sounds with chirping, to create the feeling that you get closer to some birds as you move. There are no actual birds in the game though, it's all just an illusion made to immerse you in the environment. We also have a few barely audible 3D sounds of bees and insects, in a more open area of the game.

Another important sound is the one for the flowing stream of water. This is also a 3D sound. To emulate the water flowing all over the length of the stream, we placed several positional sounds with their falloff areas intersecting each other, but not the areas where there is no falloff, as in the screenshot below. This creates a continuous flowing sound that gets louder as you get closer to the stream and fades out nicely as you move farther.

Our collectibles also have 3D sounds attached to them. And, of course, music is of vital importance to our game's mood, but there is no technical info to be shared here - just find some great music and play it in tune with the feelings you want to stir in your players.

This concludes our Audio Design posts. If you want to hear some of the systems and sounds we talked about, check out our videos, in case you've missed them. Thank you for reading!