Saturday, December 7, 2019

Tracks: switched. Story work: engaged

As I predicted multiple times, I have finally switched tracks. Hooray! I've spent the last week working mostly on my game's story. This proved difficult and I haven't made as much progress as I would have liked. I'm stuck on a few main things, mostly to do with the big picture. It's strange that I've managed to fill in most of the smaller details but still lack my big overall concept, but we'll get into that in a moment. First up, I'll go over what I did that wasn't story related.

As I wound down my programming sprint, I thought more and more about my NPC conversation system I had developed. I worried and toiled over how I could possibly make it easier to use. How I could remove the dependence on mysterious global state enums, or the anonymous functions passed in to each conversation fragment to let it know when it's ready to be displayed. But I came to a conclusion. It wasn't so much anymore that my data structure was garbage (I'm not claiming it's perfect though) so much as it was that my tooling was lacking. There's no interface to add conversations, no way to visually see the relationships between fragments and responses except to trawl through C# source files. I really think that to make creating conversation trees and story flow logic easier, the next step will be to develop tooling that will generate my C# object code for me. I don't know if I actually will do this, but I believe if I were working on a team where multiple people were required to work on conversations it would be a necessity. It might end up being a necessity regardless, but for the moment I'm betting that because I'm the only one working on this I can store the links and relationships in my own brain well enough to get by without having to spend weeks on tooling. We'll see how it pans out.

In the art department, I did another concept drawing for some Union characters.


This was a fun task and I had a lot of feedback from some artists I asked about how to make these characters look better.

Now, on to the story!

What I decided to do was to define the NPCs that will exist in my game. There will be a set number of NPCs, and if I can define the number and interactability of all of them properly, I can come to terms with how difficult it will be to write/program my NPC conversation trees into the C# files directly. This simple task ended up causing more problems than it promised to solve. I started off with a basic list of something like 40 characters I was interested in. I progressively culled this down to the 22 I have at the time of writing this. Even this many is too many, so I will have to cull some more. Ideally I think I would want around 12-16 characters. The problems raised while defining these characters arose quickly, with one of the first being; what do I name them?

I started off naming my Union characters with generic names I might use when testing software input forms. Jim. Tim. Kim. I then went back and started creating worldwide names. I googled various terms and countries, and followed Wikipedia links to the pages for all sorts of people from around the world, coping fragments of names out to create an extremely varied set of worldwide NPC names. After doing this, I stopped and thought about my Union and their people. Two cores element of the Union concept are their inclusivity and their homogeneity. This can present a bit of a paradox. Would the Union stamp out individual nationalistic names in preference to a homogenised naming scheme, even though this goes against their inclusivity doctrine? I'm not sure yet. I thought they might, (taking a cue from Brave New World), and so I went back and renamed all my Union NPCs to have generic Anglo fore and surnames. Part of this is to allow a contrast to the Arcadian naming schemes.

My Arcadian NPCs have very strong ethnic naming schemes. I chose a few nations for my Arcadian NPC groups, Spanish, Finnish, British. By giving these NPCs very strong ethnic names it helps to highlight the Arcadian prerogative in contrast to the homogenised weakly-Anglo Union names.

But I can't help but think the more I homogenise my Union the more their tenant of inclusivity fades to worthlessness. There's no point in being inclusive if everyone is already the same. So that is a fine line I have to traverse. I am tempted to go back to an older concept I had for the Union, related to how certain groups of ex-pats behave in the real world. I might have Union characters have various ethnic names and even keep various symbolic trinkets from their supposed heritage in their rooms (flags, furniture), which they proudly talk about making them who they are. I can then contrast this hollow pride in a past they have no real link to with the ultra traditionalist Arcadians. Perhaps I can have an interaction with a Union NPC who has only just found out they have faint Irish heritage and has started wearing all green. Or, another NPC who has decided they don't want to celebrate their Arabic ancestory anymore and would rather identify and celebrate their Peruvian past.

I came across a separate problem while naming and inventing my Arcadian NPCs. Unlike the Union, the Arcadians live and breath their ancestry. This means that if I, for example, create a homestead of Czech Arcadians, they will certainly speak only Czech. This is true in the Universe, but makes it impossible for my player character to talk to them, unless they happen to also speak Czech. Because of this I am considering that I will have to have my Arcadian NPCs speak English (localisation of this game to other languages is not something I am considering yet). This makes a British Arcadian group obvious. I also created a Finnish and Spanish group. I created these groups to fill other constraints I had, but having them speak English might be too long a shot. I'm not sure how to resolve this yet. I might just not resolve it, and leave it a hanging plot hole. I'd prefer not to though.

Having multiple Arcadian homesteads that do not communicate in the same language all living nearby raises other problems. The Arcadians are even less of a cohesive force than I was originally planning. They will be unwilling and unable to cooperate as a larger force. Perhaps I can get around this and the previous language problems by having a local cooperative of Arcadian homesteads, all speaking a common language and serving a common purpose when needed. It seems flimsy but might be required. That would certainly solve a few issues...

One issue I haven't been able to solve yet and which has been growing in importance is; what is the player's actual goal? I've decided the gameplay will consist of ferrying messages between the two factions with the ability to distort either side's message to the other. But why are the two powers negotiating at all? The Arcadians want nothing but destruction for the Union, and the Union barely acknowledges the Arcadians at all. I can use my ultimate cop out card for the Union at least if I absolutely have to and say "the Union central AI has decided this is what they should do" using the inscrutable nature of the AI as a get out of jail free card. But I can't do the same for the Arcadians, even if I wanted to. One theoretical story hook I've been considering goes this way:

  1. A travelling Arcadian missionary tasks the player to deliver a letter to whoever is in charge of the local Union tower. The letter is requesting the right to preach to the Union citizens.
  2. The player brings the letter to the AI, who convenes a council of Union citizens to handle the request. 
  3. The council is more interested in debating the Missionary and write a letter talking about the scientific evidence for God to be delivered back by the player
  4. The Missionary is perturbed and appeals to the local Arcadian homesteads to write a response
  5. The player delivers the response, thus starting the debate...
This might work but seems like an awfully low-stakes story. I would prefer to have something escalate to the point where both sides are fighting for their very existence. I'm not sure yet how to do this, but I'm sure I can come up with something eventually.

I should leave this here, it's been a long talk. Hopefully next blog I'll have the major story close to being sorted out.

Sunday, November 17, 2019

... I am still programming

I meant to write this update last week, but I was this close to finishing my conversation system in a workable state that I just had to push it out before I wrote anymore. And so, now, I have done it. Yay! Now that this system is just about done there's only some vague UI and save/load problems left to tackle from the programming side (that I can see right now - sans refactoring).

Unexpectedly, I'm still on a programming run. I thought (as per last update) that I would switch over to either gameplay or art, but instead I've just been programming away. This has been good I guess, and I'm rounding out the logic to the point where serious game work might be able to begin at the end of the year. But of course, every step of the way and every breakthrough I make I get a firmer grip on how much there is to do and how far I have to go. And of course, it's a ways.

One thing that is becoming crystal clear is that there's no getting around the fact that at some point all my dialog is going to have to be written down in huge complicated files. I should backtrack a little first and quickly talk about what I've got at the moment for my conversation system's structure.

In a typical RPG game, your dialog choices with an NPC usually drive the rest of the conversation with that NPC. If the NPC asks, "how's your day?" And you reply "bad", they might respond with "oh no, what's wrong?". If you instead replied "good", they might say "that's nice", but the choice you made is forgotten by the game immediately afterwards; it only existed in the context of that specific conversation, or even just within that single response. There might be certain dialog choices in certain conversations that have a lasting impact in the world such as an NPC asking you "do you support faction A?" And later in the game faction B rejecting you for this. What I would like to do is have ALL conversation choices recorded. My game is going to be about the choices the character makes in every conversation. This demands a very comprehensive game state and a rigorous naming/namespace scheme.

Unfortunately, I'm not happy yet with what I've made. I pushed through and finished it into a working state however, because it's better to have something working than it is to just fret continuously over what could go wrong. Here's a diagram of what I have:


I realise it doesn't exactly make things crystal clear. Truth be, I think this system is a bit of a mess. But it works, for now, and so I'm going to push on. Each NPC has a "Conversation Manager" assigned to them. This manager contains a number of "Conversation Fragments" which in turn contain a list of responses. Each response has a condition to be available, and a post-selection outcome. Both of these are anonymous functions provided at instantiation of the class. Conversation Fragments can also contain conditions and can be set to be repeatable or one off conversations.

In this way, I can build up conversation "trees" full of conditions and responses. The responses to conversations are at the moment being stored in named Enums inside the global state. E.g. "responseJimAreYouOk.Yes". This again isn't ideal but is quick and dirty. You might also notice that the current method has all my conversations being created inside the script (C#) files. This doesn't bode well really, but again works for now. Ideally, I'd want the pure content strings of the conversations to be in external files, but I'm not sure how I can link them to my anonymous delegate functions for conditions and outcomes that must be in the codebase. I might end up creating some generic (named) conditions and outcomes as members of some conditions and outcomes classes, and then I could reference them via strings in external files. But for now, again, my rough system is ready.

The advantage of this system right now is that I can access any response to any conversation from the global state. A bit awkward for sure, when you might rightly expect the conversation states for an NPC's interactions to belong to that NPC only, but having random NPC's access other random NPC's to poll their interactions is just as icky if not more so than doing to to the static global state. That's my belief at this point, anyway.

The biggest risk with this system going forward is that I dump hours and hours into writing content inside of it only to find that it's got some huge flaw or to get some brainwave down the line for a much much cleaner system only to find it will take weeks of time to refactor into that system. So, I will proceed with caution with my testing, and create a moderately complicated set of test NPCs and mock gameplay to see how well the system performs under pressure.

I shouldn't leave you without a picture to show what my system looks like!

On a side note before I wrap this up, the Unity UI builder has been a little tricky to deal with, but overall not terrible. I've worked with some truly awful UI builders in the past and I understand it's a tricky problem to tackle. I've appreciated not having to work too hard to deal with UI this time around. The player controls settings are a bit more difficult to work with, however. I'm sure I'll get the hang of it.

Sunday, September 29, 2019

Back to the programming

It's finally time for a new blog post! So far this has been one blog a month... hopefully I can pick up the pace in the future.

Basically, I took a three week "break" from this project immediately after the last post. Not a good idea. I'm not completely new to the danger of "taking a break" from a project only to never return. Many of projects have gone that way, but this blog has really been a great motivator. So last week I decided it was time to get back into it, and to get something done. I spent two nights stressing over what the next step I should take and realised it would have to be the dialog system. So come Monday, I opened the Unity project and...

Began procrastinating.

But, I had made a start. I fiddled with some settings and scripts in-between watching Simpsons videos on Youtube. In about 3 hours of time I probably got 20 minutes of work done on the game, but it was STILL PROGRESS! I finally set up a local git repo for the main files in my project - which brought some much needed peace of mind and confidence when I started refactoring massive sections of my janky but functional scripts - and collected some more references. I did some other assorted house cleaning tasks as well, updating my version of visual studio and organising my reference images.

And then, the rest of the week, I just plowed through my scriptwork. I committed code every day of the week and made some solid and serious progress. I don't have much in the way of images to show for it, because it was script work after all. But the main thing I did was a basic dialog system and restructure of my NPC classes:


I now have a functional UI system too. You can walk up to an NPC and they'll say something to you on the screen. After a time the message will fade away. From a gameplay point of view I'm not sure about this system yet. It's not obvious where the text is actually coming from or who it's relating to from it's position. I might instead have to place the text about the NPC that is speaking. This will also allow me to have multiple NPCs "talking" at the same time, without player interaction.
When the player enters "conversation" with an NPC (where they will need to decide on a response and the game pauses) I will use a UI perhaps closer to this experimental one, where it takes up more of the screen and is obviously the main mode of interaction.

Either way, I had some interesting challenges and decisions to make during this development "sprint". For one, I wanted the text to fade out after some time, and as part of this to set a global "in_conversation" state to be false once the text was gone. It turns out Unity has a function for this: CrossFadeAlpha. You give the function a time and some alpha variables and hey presto it fades your graphic away! However; there is no callback or return for this function. It doesn't return a task, it doesn't even set a flag. It just "goes". I'm not sure at all why this function was written in this way, but it makes it completely impossible to work out when the fade is actually finished.

More revealing, while trying to solve this I found many online forum threads with other programmers trying to solve this problem. The solution I kept seeing come up was to check the "alpha" state of the graphic being faded every frame in the object's update function and react once it reached 0. This is just a terrible idea. Checking a random attribute every frame is a shocking anti pattern. To see it repeated so much online has me very worried about any of the advice or examples I'm seeing online.

In the end, I wrote my own IEnumerator function that fades a given graphic out given a time to do it in. This allowed me to have actual control over when the fade was done. However as part of writing this I had to rely pretty heavily on online examples and tutorials. IEnumerators and the yield keyword are very new and confusing to me. I ended up writing the dialog function like so

private IEnumerator RenderDialog (string message, int duration) {
    dialogText.text = message;
    yield return new WaitForSeconds(duration);
    yield return StartCoroutine(FadeOut(dialogText, 2));
    dialogText.text = "";
    dialogDisplayed = false;
}

Which freaked me out due to the two return statements. I'm still not yet used to yields, IEnumerators, and Coroutines, but it's fascinating learning such different programming styles (coming from Javascript's Async promises).


Finally I once again restructured my NPC class structure. Again, coming back into a highly structured language has been interesting. I'm re-learning all my old Java concepts in a new context and it's been a lot of fun.
This array is an array of "Interactables". An Interactable is any class that implements my "Interactble" interface, which at this point just means it has a "onInteract" function for the controller to run if the object has been activated. I have a class now GenericNPC that impliments this interface for NPCs to use. After some experimentation I ended up making this class Abstract, as a sort of midway between an interface and an class. It is a generic class for instances of "real" NPCs to extend, which contains basic NPC logic - such as the implementation of the "onInteract" function that fulfills the Interactable interface. Whew. This whole structure looks like this right now:

At the moment I have a huge global static state singleton that holds the gamestate. I've done this in the hopes it'll make saving/loading incredibly simple, and to ease global controller scope. As part of this, there is a global 2D array that is the size of the map, which contains every interactable object on the world at the slot in the array that corresponds to the slot in the map where it exists. So if I have a door at 8,12 on the map, the door object will be in the global interactables array at 8,12. This makes checking where things are pretty easy.




In this image you can see what really drove this structure right now: the need for a singular place where I define what an NPC should do (print dialog when interacted with), and the need to have instances of NPCS that actually contain the unique properties of each NPC (unique dialog). 

Obviously this system isn't done yet. For one, I'm probably going to need to make further layers of abstraction and inheritance in order to have multiple types of generic NPCs. For example the different factions will have their own generic NPC scripts that behave differently, and there may be different types of NPCs in general. 



That's probably enough on all that for now. I have some final thoughts though before I close, about the work I've done this week. I expected going into this project that I would enjoy switching between the art, music, story, and gamedesign rapidly and repeatedly, changing hat and working in all the areas maybe at the same time. Not so. I've found so far I've much preferred working only on the art for a week or so, and then only working on the programming another week. It seems to be much easier for me to just focus on a singular area for a reasonably extended time. I didn't find myself at all interested in working on the sprites or anything else this week while programming. 
This has me wondering if maybe I should try a sprint-style development method where I deliberately only work on a single aspect in cycles, perhaps only programming for a time and then switching to only doing art for a week, and so on. It might be a very productive and motivating work style. 

Finally, I did some more thinking about music (again). I'm starting to swing back around to making my own music again, but very minimalist and sparse. I'm considering producing music consisting completely of sampled sounds of the 60s/70s. I've found it very hard previously to edit audio to make it sound like it was from that era. It seems that the best way to get that authentic period sound would be to use actual recordings from then. Creating my own warped and disjointed sounds from original samples would be a very neat way to capture the era while also creating something new and tailored to this project. I'll keep thinking about it.

Thursday, August 22, 2019

The spritetrain chugs on

It's been a long time since my last post. The blog has been working though, I've kept thinking about it ever since the first post, and the guilt at not having anything to say here kept motivating me to keep working on my project. So, I have some progress to post!

Last blog I said I was going to work on the gameplay and story sides of the project, but I haven't made as much progress there as I'd hoped. I've done some heavy thinking on where that's going but haven't managed to write much down. The main thing I have been up to is spritework! I've been grinding out sprites to get to the state where I can start feeling what the end might look like. Here are some screens:




I've also mucked around with some of the game logic and programming (as you can see in the last picture above). I adjusted some render and image compression settings to get a crisper, true pixel 2D look using some instructions from the Unity blog, and a downloaded 2D camera preset. I want to avoid using presets and plugins where it makes sense, so I can learn as much as possible myself, but for now the camera is extremely lightweight and useful. It handles adjusting the game pixel mapping to the screen resolution, which involves a lot of finicky maths that I'm happy to outsource - especially as testing the results across multiple resolutions is already painful enough without having the debug my own code as well.

I had a lot of fun with the sprites, and got to flex my creativity a little in some of them, however seeing the results from my work is a little underwhelming. I haven't magically improved over time without practice, so I will need to focus and try hard with the sprite work. I anticipate I will require many animations later on as well, some very complex. The natural sprites in particular will need some movement from wind if I want to use a complex soundscape with wind audio while outside. Leaves rustling, grass blowing in waves. I'm not sure if I can pull that off yet, but I'd like to try it.

I did a little more programming on my game too. If you thought I was insecure about my spritework well... the programming is much worse. Every decision I make, at every point, I second guess whether I'm laying down a landmine for myself that will cause massive issues later! I'm finding it really really hard to even write anything at all, which is a huge problem that's causing me to work slowly. I need to remind myself constantly that writing buggy difficult code is better than writing nothing at all, but I don't know if I even believe it myself. The code I have been writing was around transitioning from room to room, and some changes to my collision system.

Going forward now, I will continue on the trajectory I'm on, producing sprites and building test rooms to try out basic logic and layouts. I firmly believe now that I shouldn't begin on the actual game until I've ironed out my systems and artwork in test rooms. This has come about after observing the number of times I've had to totally rebuild vast sections of my Unity project layouts, my sprite/tilemaps, and my programming structures. If I was attempting to build my actual game at the same time I was doing these re-writes I would be throwing about hours and hours of work and shattering my motivation. 

So for now, sprites and logic programming in test rooms. I think it will take another few months at this rate before I start to work on the actual game proper.



I've been listening to some 80s synthpop music recently while working on this project, but I don't think the tone totally suits the setting. Which is a shame, because the music is extremely evocative and I would love to use it if I could.






I also listened closely to the Far Cry 5 soundtrack. One of the tracks from the game stood out to me. It plays in a few loading screens, and sometimes as distant ambient music. It sets an incredible mood and tone, and I feel my Arcadians would match the tone very well. I know a few people who play guitar and I might be able to pull a similar sound off myself with clever mixing. It's an avenue I want to explore. I like the idea of any music in the game being natural to the world. Union music would come from speakers and be pop focused - expertly mixed crackling vinyl, while Arcadian music would be performed live with guitars and voices, wafting gently though the misty forests. 




Wednesday, July 10, 2019

The story so far...

I have decided to keep a dev blog of this project that I have been working on for about 6 months now. This is the first post in that blog, so I'm going to have to do a bit of back tracking to get back up to speed. Part of the reason I'm writing this blog is because I realized I'd started to lose track of decisions and work I'd done previously, so I won't be exhaustive with my retrospective here. Not to worry! Hopefully I'll keep track of everything from here on out.

My plan for this blog is to write down important decisions, technical discoveries, or overall observations as I progress on this project. I'd like to say I'll try to update it once a week, but I know better than to promise something like that. Hopefully keeping this blog fresh will be s motivator to work on the project too. I'd like to try to keep this blog more technical because that's the stuff I want to really get down somewhere, but I know I also won't resist posting lots of media and artistic stuff here too. So, without further ado, let's start!

Overview (where the project stands now)

At the time of this first blog post I've made a simple game in Unity. It looks like this:


You can move the character around with the arrow keys, you can't go over the cliffs or rocks, and you can walk up to the NPC to receive some HELLO WORLD dialog. I suppose it's not very impressive for 6 months of work, even at my 1 hour a day sort of pace. So many people (I included) like to ignore how long things often take us. It's very easy to retroactively say "it wasn't that hard" or "it didn't take that long" and quickly forget what was actually involved - I'm getting sidetracked, sorry.

I also have a few dozen sprites across a few sheets. My most recent mockup looks like this:


I also have my 7700 word design document. I'm about to redo a huge chunk of it though (the story/gameplay section) so that's not as tangible. 

In the following sections I'll go over what the journey has been like to get here so far. First, here's a really rough timeline based on my best guesses for what I've been doing with this time:


My Background (why I'm doing what I'm doing)

So first up, I've always wanted to make games. More broadly, I've always wanted to be a storyteller. I love telling stories. I love making up places and things, and showing those ideas to other people. I like making movies, I like making music, I like writing things, and I like programming things: and video game development ties that all together. A game tells a story in a way no other form of media can, it brings the listener/viewer into the world and makes them a part of it. The user themselves get to decide how their story pans out. Incredible!

The desire to make games kicked off my career in software, and I learnt so much of what I know making my own games in Gamemaker back at school and at home. Since then I've tried a few times to work on games again, but time and motivation are slippery beasts. I've managed to stay involved by working on some game projects with fellow students at uni (all defunct) and as a concept artist at W3D Hub. I always knew deep down that I would have to make my own games again one day though. I have stories I want to tell, and I want to explore those stories through this medium.

My skills may seem eclectic, with an interest in composing, writing, history, programming, pixelart, video production, and games; but they all come from my early interest in making my own games. I taught myself these skills all so I could make my games myself. I'm no specialist, and no master at any of my trades - but my jack-of-all trades attitude was deliberate so I could do as much of the work myself and not rely on anyone else.

There are certain themes and concepts that are attractive to me. Living in such a beautiful country and in a forested area has left me with a deep appreciation for nature, for landscapes, for solitude even. At the same time, I have the fascination with industrial vistas and great man-made engines that doubtless comes from being a mining engineer's son. I am an introverted and island person, yet my inner-city education and friendships with incredibly charismatic people have left me with good look into the social world of the Big City. I've always tried to be a responsible and above all compassionate person, looking to empathise with every person, and in doing so have strove for a politically centerist position. I've been jostled both left and right and seeing political activism hypocrisy and ideological thinking has always saddened me. Best not to go any deeper into who I am here, so hopefully that's enough background for now...

The first step - idea formation

I have been slowly brewing my skills and capabilities over years to get to the point where all it took was a solid idea before I could actually begin making my game. This is the fourth game I have attempted in Unity, probably the 30th game I've started overall, the 8th major spriting task I have undertaken, (if I write the music for this) the 5th major musical undertaking, and perhaps the 50th story I have tried to write down. The project I'm attempting is simple by global standards but is the product of years of honing my craft.

So, it was about 6 months ago, at the start of 2019, that I was browsing an obscure page on Facebook and some ideas started to crystallise. I was looking at a page focusing on the sort of meme version of "ecological fascism". At the time it was a sort of an underground meme movement for weird aesthetic and political thought. It had a striking visual style (I'm hesitant to post anything here from it because it's pretty violent) and an ideology that at first glance doesn't fit in our traditional left/right ideological discourse. Extreme violence and terrorism in support of the environment? I spent the next few days thinking about this before coming to the question, what is the counter to such a philosophy? Replacing the words with their (loose) antonyms "ecological fascism" becomes "technological socialism". At this point I knew I was on to something.

The next few months were spent working this idea over and over. Most often by myself, but also with some trusted friends of all sorts of backgrounds and personal beliefs. My eco-fascists and technocommies slowly morphed into more concrete societies with less extreme ideologies and a world to set these groups in began to form. The ecos became the "Arcadians", traditionalists who have a fervent ecstatic worship of the human self - the superman who lives a colossal life as much in tune with nature as with themselves. They would be a small but powerful faction who want to rid the world of the scourge of modern man and return to a tiny, sustainable, spiritual population of true humans. My technocommies became "The Union", a practically post-scarcity utilitaristic industrial society that provides everything it's moribund people could ask for. The Union would have the goal of caring for all humanity, so they may live without any discomfort, and the progress of scientific thought.

I practically live on Wikipedia, and worldbuiling is a general hobby of mine, so building up a reference library was a very quick and fun process. I made some big decisions early on from my previous research. Should the game be set in the "real world"? I decided no, not least because I prefer historical fiction, but also because my Union pretty much demanded a gigantic fictional state. I decided on a time period set in a vague 60-70s setting. I particularity like 70s science fiction styles, and strongly want to have the Union architecture appear as "gleaming brutalism". A strong sense of style is important to me. There's also precedent in our fictional world in this period for my conflict, with the rise of the environmental movement, terrorism, computer systems, and the existence of ideological states in general

The big question now was what do I do with this concept? Sure, I have a solid idea, but where can I go with it? I knew in my heart I wanted to make a game, but I needed to first see that it was a sound idea. Would a movie be easier? No. Would a story be easier? Maybe. But what really appealed to me about this concept was the shock value of presenting these strange ideologies to a person and having them process the two against their own morals and ethics. And hopefully, cause them to then go on to review their own value and judgement systems in a new light. I wasn't sure if I could pull that off in a pure story. But in a game... I just needed to present the player with choices in a compelling way so that they would have to answer to progress the story!

My reference library is full of images and text snippets, things to use as reference for architecture, tone, technology, and fashion. Here's some random excerpts:







At this time, I had started my design document. I worked on it feverishly at first, as if worried I would die before I could get all these ideas out of my head. I started slowing down once I reached the story and gameplay section, before finally grinding to a stop. I plateaued for a long time on the story and gameplay before forcing myself to write a few paragraphs a day. In the end I came up with a branching storyline where the player would make major decisions at certain points in the story, before time would skip forward suddenly, and a new scenario was revealed based on the outcomes of your previous decisions. I expected to have a persistent single world that would be updated each "flash-forward" with the world changing based on your actions. This got really complicated really fast. I had something like 40 unique branches to the story tree. Ouch. It was good enough to start though.

So, the next step would be to do some research into the technical side of this story.

Early technical decisions and work

Unity and C#

Unity was my first choice to write this game. Now it's probably true that there's better tools out there for this job (after all, it's a 2D game and Unity is mainly a 3D engine), but I chose Unity because I want to learn how it works, and at the same time learn C# as well. I can go on using raw Gamemaker or some propriety RPG engine, but by using Unity I'm learning a more generic skill that I can transfer to bigger and better projects in the future. So, my first technical exploration was to look into how Unity does 2D stuff, to see if my existing knowledge and workflows could be useful. Luckily for me, it turned out they were! I imported some placeholder sprites from the old game Yoda Stories (you can see some in the first image posted at the top of this blog) and mucked around with the Unity tile mapping system. It was certainly not intuitive at first, and research revealed it's a very new part of Unity, undergoing active development, but it was what I was looking for. Score! I mucked around with some generic movement programming and started thinking about things like dialog systems.

In my reading I found you can pay for libraries other people have written for things like dialog trees. The prices run in the hundreds of dollars though! I'm going to do all my programming myself for this project. This is because I don't want to spend the money (duh), but also because I want to learn what it is I'm doing as I go. From my previous experience I know I can get anything to work eventually. The code may end up awful, but I can get it to work - and if I'm the only programmer on this project ever code quality isn't a huge problem. That's not to say I'll deliberately write terrible code, but more to say I won't let extreme formalism slow me down.

For the last 4 years I've been writing mostly JavaScript and PHP (5?). It was a bit of a shock going back to the structured world of C#. I tried to implement a generic "I run a function on the other object" concept using reflection before I remembered the idea of interfaces and smacked one in. Once I started to get back into the flow though I had a fun time with what I've done so far. It's neat to be able to pass around objects and KNOW what they are with certainty. However I'm a bit blind at the moment making things like dialog systems from scratch, without my usual toolbox of programming patterns or concepts. I will probably have to do more reading on that soon.

Concept art

I've done some concept art for characters and the like. I'm not sure yet whether I will use any digital art in the game or not. Perhaps it would be useful as character icons in dialog, if pixelart avatars are too abstract or time consuming.

Union character concepts
Arcadian logo concept

Union logo concept

Union logo concept


Spritework

I started on the sprites once I was confident that Unity was able to handle them correctly. I'm working with pixelart as it is where I'm most confident, using a 32x32 sized cell. I've been dabbling with using a strict pallet before I started work on this project, but in the end, I'm going to only loosely follow one here. I made this choice in the interests of speed and in the possibility of using things like automatic lighting, masking, and particles in unity (which all involved calculated colours and things that will most certainly ruin any strict pallet). I did some research into dynamic lighting in 2D for Unity and it's possible, but probably not in the way I want. It works best with blocks that cast shadows, like walls in a maze, and not so great with something like dappled light through leaves. 




I started on my nature sprites as I thought they would be the most fun and useful to start building rooms and maps with. I spent a few weeks on the first cliff sprites, and a few more on the grass. I'm taking a hybrid approach to my sprites so far in terms of blending. The cliffs for example come with half a grass sprite that blends to the cliff, whereas the grass blends go into pure alpha. This means I don't have to create a new sprite for everything I want to blend the grass into (grass->dirt, grass->grass2, grass->water etc.) but the tradeoff is that in Unity I have to have an additional layer above the base terrain that contains the blends. Most tile/sprite forms don't do this, but I think it won't be a problem for me. 

So far, the spritework has been fun, but I also noticed how time consuming it is. I't taken two months to produce the small number of sprites I have now.

Tree evolution:




The future

At the moment my main concern is re-addressing the gameplay question. I wasn't super happy with my final draft for the first iteration of the story and gameplay. It wasn't clearly achievable, and it didn't really grab me as interesting or compelling on review. I've been thinking and talking about the issue for a week now and I think I have a solid idea of what to try next, so I'll get on to fleshing that out. If I can, I'll try to also continue on my nature sprites, and perhaps start some basic building sprites too to check the contract and style of those.

Going further into the future I can't really get past the gameplay issue. It seems weird, but the direction I am starting at is universe and technology, so gameplay is last. Hopefully this doesn't cause problems later. I've got some really promising ideas on what to try next (as above) and this will have a huge impact on the entire structure of the game and all work going forward.

In terms of art I'm happy with my current direction. I've thought about some stylistic things I might try later, such as lighting or (I really want to try this) a colour/tone shader across the entire render. I could probably achieve the same thing though really clever spritework, but it's probably too clever for me.

In terms of music I'm not really putting too much thought into it at the moment. I don't believe the sort of music I usually write is appropriate to the project at all. It remains to be seen whether music will be required at all. If it is, I will probably try to write some very ambient sounds myself but might end up going external if it isn't up to scratch. My preference (based on a hunch) at the moment is that instead of music a very complex and evocative soundscape will suit the project better. Birdsong, industrial noises, etc. I'll address this again soon. I've thought a little about how neat it would be to use relevant licensed music but that's more a dream than anything, I don't believe I'll pursue actual licenses and go through the legal rigmarole unless it becomes necessary. That said, here's some music I've investigated as appropriate for certain elements of the concept:




I have skipped a lot and could talk forever, but there should be heaps of time for all that later. Hopefully I'm caught up enough now that I can move forward and just update this blog with what's going on as it happens.