Tuesday, April 21, 2015

DIY

For the last three years I've worked as part of the Silent Dreams team, and I'm still enjoying the hell out of it.  Sometimes, it's really nice to just be given some tasks and assets and putting things together. I usually get to be creative when I want to be, and don't have to be when I just want to grind a little. We've made some great games. Things didn't always go well, and more often than not game reception did not go as we had hoped, but we're doing what we love. So, why go indie?
2 reasons:
  • 1. As a studio working with a publisher, we have next to no say when it comes to marketing or public presentation of our work. If something in marketing or distribution goes wrong to affect how people see our game, we potentially have to sit there and take it, and probably end up taking the blame for it, too. That can be very frustrating.
  • 2. This:
    It may not look like much, and I'll be the first to say I'm no artist, but this sprite sheet exists, and that's something. It is one of 3 I made in one day. To some, that may not mean anything, but here's what it means to me:
Working in the games industry, you make friends with other developers, and establish a network of other developers adjacent to your inner circle. Most of the graphic artists I know are employed and have lives. When working on a solo-project, asking any of them for help means waiting weeks or maybe months for maybe a handful of assets. The other graphic artists I know, I don't work well with. I'm sure part of that is because my projects are my babies, and I don't handle outside creative input well when I have my mind set on how I want things to be. Monster Face was completed 8 months before it was ready for release, because I just could not get anyone to draw me some faces. When I sat down and learned to create vector graphics, all my faces were done within that week.
I still look forward to some collaborative work with a talented artist, or two one day, but the point here is I don't have to rely on anyone else to get my game done. Anything I need, I can make in a timely fashion, and I don't have to twiddle my thumbs waiting for assets to eventually come around.
There's always the option of outsourcing or browsing the web for free assets, and there are plenty of them. There is definitely something to be said for developer independence.

Anyway, that's my 2 cents. Stay tuned.

Thursday, April 16, 2015

Building a Scene for Performance

This is me putting experience to good use. Rather than write a whole new post, I'm just copying a section of the project documentation file I am writing alongside the development process. May it help someone avoid the torture I endured.

3.1 Milestone 1: Scene Construction

3.1.1 Problem Analysis

            When Silent Dreams had already released The Dark Eye: Skilltree Saga on PC/Mac/Linux, and were preparing to release to mobile platforms, we discovered a terrible, terrible thing. While faster iOS devices could run the game, at least up to a certain point, slower devices like the iPad Mini or Kindle Fire would crash immediately after the splash screen. We tried different types of texture compression. No results. I spent the next 4 weeks barely eating or sleeping, but coding and rebuilding scenes day and night. I had to separate all the elements in the game scene and load them individually to see where the crash was coming from. What made that exceptionally difficult was that so many of those elements were referencing each other. And, as I discovered, an object causing a crash didn’t even have to be present in a scene. It just had to be referenced by an object in the scene to cause the crash just by preloading. Even worse, if the offending object was referenced by another object not present in the scene, but that object in turn was referenced from within the scene, the preload crash would still happen. I thought I was going to lose my mind.
            I had to create a set of loading scripts that loaded objects into the scene sequentially, and then assigned them their references one at a time. It was gruelling. Then, I had to spend another week debugging and looking for null reference exceptions. But, I did finally find the offending object, nestled in a tree of references, and with the scene being nearly empty to begin with, all test-devices had no problem starting the game.

3.1.2 Solution


            Learning from my tortured past, the first thing I built for Rocket Potato was a scene constructor. The scene begin with the scene constructor being the only present object, and all necessary elements are loaded sequentially. I’m using the yield return StartCoroutine(LoadElement()); command to make sure no elements are loaded until previous elements are done. I’ve even combined that process with a loading screen complete with a loading bar that fills a little with each element, and a text label above that bar that displays the scene constructor’s current activity, kind of like we know from games like The Sims. This should assure a clean loading process even slower devices can handle, and it will help me pinpoint problem objects.

Here is a code snippet of the work in progress:


For those unfamiliar, coroutines in Unity3D are being used here to load single elements at a time. The yield return command means that the function is halted there and will not continue until the coroutine running returns. Using the yield command also ensures that the next step is put off until the next frame. This forces the game to assign at least 1 frame of time to each loading process. In the case of LoadRoomDecoration(), one frame per loaded scene object, additionally.

Wednesday, April 15, 2015

Design Complete

Today I finalized both a design document and technical document for Rocket Potato. I now know everything the game will contain, what the assets must be able to do and how it will all be put together. I've drawn UML diagrams and mapped out specifications for platform-specific system requirements (ok I mostly guessed those). I've freshened up my project management skills and resisted the urge to draw up a network diagram, which would be silly, since I'm the only developer on this project.

So, here's a basic rundown. Arpy will have 3 types of objectives to fulfill: fetch, rescue and escape. There are multiple objectives for each type, and one of them is randomly generated each time you press play. The level begins with a short narrative and you begin controlling Arpy in his living room. From there, you must venture out into the street. The street is the main level of the game. It will be the largest and leads to every other level that has to do with the current objective. Because it is the major playing field, it will have some random elements to keep players on their toes. I've designed 10 different types of platforms and a few physics-based obstacles, as well as a series of enemies for Arpy to fight, including one boss.

The game will also be localized to German, Swedish Chef and my own comical mix of German and English I call Germanish. I've also started a proper project documentation file like we used to in school. Doing everything right, I hope. When the game is complete I plan on making the 3 project pdfs public so that maybe other new indies can learn from my development process, as I have learned from others..

I have a set of milestones ready and waiting. Now, I can get cracking on assets.

Stay tuned.

Sunday, April 12, 2015

The Flame

I just finished writing the design document and finally have a clear idea of what Arpy will be doing, and why. Here's an excerpt from the Back Story section:

Arpy doesn’t have much drive or ambition. His goal in life, what really makes him happy, is to relax at home, eat tasty delivered food, watch TV and play video games. He views his life as fulfilled. But, those pesky friends and relatives always insist he go out more, do more things, experience the outside world. What could the outside world possibly have that can’t be seen on TV? What activities outside could there possibly be that won’t force him to stand up and get all tired and sweaty? No, Arpy wants to stay right here in his chair and do what he loves.
            When his friends and relatives decide to take his life into their hands, he is forced to fight to preserve his precious lazy way of life. But, not if that means standing up and going out. Oh, what to do?! The solution, rocket thrusters for Arpy’s reclined, of course! Now, Arpy can track down the kidnapped pizza delivery guy, retrieve his stolen remote control or escape to avoid pesky relatives all from the comfort of his favorite chair. His family has taken up the fight, and Arpy is not rising, but meeting the challenge nonetheless.

 Arpy will be faced with his well-meaning relatives hiding his remote, staging interventions, saddling him with fitness instructions, nutrition consultants and vegans, kidnapping the pizza delivery guy and even hijacking his favorite game studio.

Now that Arpy has something to do, and I have a blueprint in form of a design document, I can start creating assets. Here's a concept of what his living room, which is the entry point to all levels might look like.
I've also messed around with some platform ideas





Stay tuned.

Tuesday, April 7, 2015

The Match

I know my work on Monster Face is not fully done (I'm still short on platform adaptations, I need an installer and to add some links to fan pages I just created), but I did manage to squeeze some more work into good old Arpy.

I did some preliminary searches for good pixel editor that allow animation, but I confess I didn't find anything I really wanted to work with. For Monster Face, I used vector graphics, created in Inkscape. So, I decided to try my hand there again. Mind you, I've never created anything animated before. I'm used to being handed finished model assets, and all I have to do is import them and then tell them when to do which animation clip. This is new territory for me. And it's fun.

So far, our pal Arpy can attack, and he has 2 different idle animations, which I've combined here. I used GIMP to make these GIFs, but for the game itself I'm thinking sprite sheets or sequence. I do miss pixel Arpy a little, but overall I'm very happy with vector Arpy and what little life he has at this point. Stay tuned.