Wednesday, December 30, 2009

Free Radical

I was doing some thinking recently. I was thinking about my current job and how, in my free time on the side, my engagement in freelance writing - which by the way proves that my words have no value without context, but I digress. I got to thinking about the next project that I want to work on, The Star Frog EP, and how the real point of it is to create many games quickly. How I want to be able to do everything, without explicitly having to. But the freedom of it being the important bit.
My mind eventually wandered back into the XNA toolset, and queries about cross compatibility, and function libraries and rapid development. What I could leverage C# to do and what kinds of things I can do with it. These thoughts floated free about my head, like a thought bubble halo.
Then I considered the most dangerous thought of all, "Could I do this all the time?"
"No, that's crazy. XBLI games don't make that much. If I built one in a year the odds of me making enough to, well, not starve would be tiny to the point of being invisible. Weapon of Choice, critical darling that it was, proved that."
To which I considered, "Well, yeah, if I only built one in a year. What if I could go faster?"

Which is the dangerous thought really. I got to doing some math, and if I could make a game for XBLI, offer it up for $2 and sell a thousand of them I could avoid standing in the soup line with Oliver asking if I could have a little more. But that thousand has one big caveat, I'd need to manage doing all that in no less than a month and a half.
Assuming that I don't crunch and work myself like a beaten animal I'm looking at 40-50 hours per week, times an average of 5 weeks. So with 250 hours, could I build a game and make it happen? I mean, build an engine, do the programming, do the art, the music, the SFX and everything else that floats my way. Or do I need a team? Am I Garfunkel, or am I Sting?
Which got me back to the EP, where the whole point is to do a crazy minimalism. Lots of iteration and very quick production. From a cohesive whole standpoint, the EP is designed to give disparate works context. What I'm talking about here are one offs, not albums, but singles offered up piecemeal.
Further, since the games don't really ever get eaten (unless they're crap - but I'll toss crap with the ruthlessness of a Czar) any finished thing will provide some kind of revenue stream ad perpetuity, keeping the freezer stocked with Hot Pockets even while I toil.
Which led to the final piece of the puzzle, the question of how. How could I do that? Quit my job (wait...let me indulge in that daydream...and I'm done) and start writing a Design Document and Tech Blueprint? No, although there is a kind of rogue charm to the idea, I am an adult with adult responsibilites, like bills, rent and a sushi addiction that isn't cheap. What I need to do, like any great endeavor, is start slowly and build steam. I need to start on that next project and keep track of how long it takes to do, keep a timesheet maybe. It's possible that this is a fever dream with no grounding in my reality and I'll need facts to back me up.
So start building, start coding and start doing. Once I have a few games in the Box I can re-asess my position and move from there. Sitting and thinking about it only gets one so far.

-Ah right, what does this mean for TTT? Nothing. It doesn't mean a damn thing. You'll notice that over yonder => there are a large number of orange things and stuff still waiting for their own Orange Crush. What you won't notice are things that I can do that need it still, short of Gamepad compatibility (which I'll probably complete tomorrow). Instead, the Team continues along building content as they can. What they don't need is me standing around waiting for stuff to happen. So when I gets stuff, I'll lay it lovingly onto the framework that we have. In the meantime, I need to get back to work.

Monday, December 28, 2009

A Controlling Interest

I believe that I had previously mentioned that once I had a gamepad working it would be a "Rockstar Moment," and now that I'm looking at it, I'm let down. What I had thought should have taken me an hour or so, took me two last night and it still isn't done yet. The issue, the biggest one anyway, is that all the control code was clearly done using only my giant monkey feet. It's written poorly. It's like, the first thing I wrote for this project so many moons ago. It's not standardized, so the functions ask important questions like, "Are we pushing an arrow key?" then it goes ahead and makes the character run around. However, the Run() function then asks, "So what key are we pushing again?"
If I wrote it again today I would take a nice top down approach and ask the thing once what it's doing and then just let other stuff know. As it is, every single little instance has to be modified and checked to ensure that it isn't excluding anything or breaking something. Like there was a time where the character would only run if an arrow key was pressed and the stick on the XBox controller was pushed in the same direction. Now let's go ahead and solve that same problem a few dozen times.
Oh, right, and all the menus need fixin' too. Plus testing.
Right, talking about testing, The Tester doesn't own a wired XBox controller (considering that they aren't even made anymore, reasonable), so I can't strip out keyboard control. It needs to work with both inputs, and since I don't want to have two different builds it needs to do so simultaneously.

It's not all rage and hate though. Towards the end of the night, it started to work. I used a control pad and pushed the little buttons and used the little stick to make my little dude run about the screen. Sure it was broken, but my inner six year old cheered.

Thursday, December 17, 2009

Alchemist

It's that time of year again. The time after IGF where I have about zero stress and get to indulge my more esoteric wants and needs. So I thought I would put down, in some kind of concrete fashion, my thoughts on the basic tenets of Game Design.
You see, my basic field of reference is not that a Designer is a storyteller. They are not cinematic artists and they are certainly not doing anything that I would ever constitute as "art." I'm firmly in the "Games are Not Art" group, small and zealous as we may be.
No, the closest comparison that I can find for what a Game Designer should be, is a Systems Engineer. When the best games ever are boiled down to their most basic constituents, the things that make them intrinsically unique are the rules and systems at play. Think about it, take a game, any game really. Get rid of any story elements first, they're just candy. BioShock is known for having it's award winning story finalized at almost the last minute. Clearly it's a great story, but the game existed as a game before it was ever added. So we can throw that onto the heap. Next, graphics, dump them down the memory hole. Leave only the visual cues that are absolutely needed - the shapes of Chess pieces, the numbers and colors on a jersey, everything else is so much fluff. Textures, shaders, shadow maps gone. Sounds too (although I do love me some sounds) except for the ones that have to be there. Guitar Hero music gets to stay because it's an inherit part of the game - the gameplay falls apart without it. Acoustic GH sucks.
Still with me? Good. now what do we have left? All the glass and candy has been ripped out and I'll bet the game looks a lot different now. But, what we have left is a system. Input of some kind goes in, results are calculated. There's a black box at work in the middle and the Master and Commander of that black box is the Designer. So when a button, or key is pressed or dice rolled or an action taken, that is a certain kind of input. With a limited number of inputs the results can then be consistently processed through. So in The Thief's Tale there is an Action Key. When the player pushes it (the input) it activates a system that considers whether or not the player is in fighting or exploration mode and then does something and provides an output. Where it gets complicated, and this is the part people never think about, is when the systems cascade together. So push the action key, while armed, against the AI system of an enemy and there are traps in play. Those are systems that all overlap in some way and changing some part creates a ripple effect.
For example, let's give the player a gun. Let them shoot it with the Action Key. That allows them to dispatch enemies from afar and those same enemies are all designed for close range dueling. Now we've broken the system. It is unbalanced and no fun. Another example, let's make enemies do more damage. Simple change really. However, the player has no way in game to gain health back during levels. So we have to consider, how many enemies are in a level? Can the player avoid them? Does changing that one variable break anything else? Is there a "dizzy" state (there's not - I cut it) that triggers once so much damage is dealt? Is that easier to have happen now?
Needing to understand the deep inner workings of a game is what the Designer needs to do. Consider the game system to be a kind of model, and it's very fragile. They need to add things slowly, and consider how things will interact and effect each other at every step of the way. There is simply no other logical way to do it.
From my description it would seem that I don't think games are any fun, and making them seems like a detail hell. In fact, it's quite the opposite. I demand that games be fun. Yes, I even used the word "fun," not "enjoyable" not "effective" simply fun. That is the point of them in my eyes, and this is where being a Game Designer is far more difficult than being an Engineer. The latter doesn't need to care about enjoyment, their product simply has to work efficiently. A Designer has an whole other thing to worry about, and worse, it's not something that is fully understood.
Which brings me to the title. The search for this mythical "fun" is something that I do not think we can hammer down. I've read articles that try to define what this "fun" is and what to be able to describe it in a scientific way. The results, they argue, would be great. It would take away all that messy guesswork involved with the Iterative Method and allow games to be consistent and time frames locked in. It could provide a kind of built in language to express the concepts that are unique to games, instead of starting every design oriented statement with, "It's kind of like..."
That's the problem though, and arguably the greatest liability and greatest asset of games as a form. I use the term "mythical" when I say fun almost in a kind of sarcastic way, but it really is. I assert that it can't be locked down. Once "fun" is defined as anything it fails to be fun anymore. It's like the boy that's invisible only if nobody is looking.
Instead, we use tenets, basic guidelines that define what a game should be. Hard won little nuggets of truth. The reason is that no good game is summoned up from nothing. They take work, lots and lots (250+ posts worth) of work. The initial inspiration that hit is a distant memory and the urge for newness will sometimes be detrimental to the overall game system (remember the fragile model analogy). These guidelines are what we use to combat that, but they are hardly a formalized system.
It's Alchemy. We know that things work, and we have examples of them clearly working, but due to the big black box nature of a game system it is difficult if not impossible to know the deeper why of it. We don't know enough about why, and we can't nail down the elusive fun that we're striving for. The Fun that we keep looking for is a Philosopher's Stone.
But that's the beauty of it. The trying for it. The pursuit of the fun. So we iterate, over and over making small changes and additions to our given system to try to understand the outcomes better. It's the only method that has ever proven consistently useful to us.
So I say that Game Design is not, and should never be a science. It is a new way to do things, the hard core of systems engineering with the soft outer shell of ethereal fun. We don't need a new way to describe it though, we already have one. Game Design is pseudo-science. It's a set of unprovable tenets wrapped in ritual performed inside of a temple of the finest engineering.
At least, that's how I see it.

Let us pray...

Monday, December 14, 2009

With This Ring I Thee Kill

No game development news really today. Other than continued work towards the port is on hold for a few weeks.

Instead, my XBOX died. It caught a case of the infamous red ring and is now boxed up for UPS. Of course, having a non-working console is nothing new to me really. I once had an NES that only worked if I poured water into the cartridges and then set a dictionary precariously on top. Actually 3, and I wish that I was making that up. I also had a Genesis (no SNES for me *sob*) that worked occasionally if I jiggled the little cart just so.

I also had an N64 that worked fine, if you consider the games that weren't Zelda to be "working."

I also had a first generation (very likely first factory run) PS2 that worked flawlessly until the power of Kratos overpowered it will awesomeness. It's having the same issue really as my green XBOX, it's not something I can fix. I mean when I was 10 or so I opened up my NES and lovingly cleaned the boards with alcohol and q-tips before I very carefully bent back the little connector pins to ensure its working for another 5 years.
With the XBOX, it just has little lights that appear that tell me, "Hey, we're uh...dead." It's not like I can open it up and try to fix it with any hope of success. Further, the act of doing so will void the warranty ensuring that nobody qualified will fix it either.
So, yeah, merry fucking Xmas.

- In game news I'm taking this extra time to finish some stuff up. So that little final boss area, totally getting that done today. Probably going to install the achievement counters too.

Friday, December 11, 2009

Traveling Without Moving

C# University keeps some incredibly odd hours, with personal study seemingly located between 10:00 PM and ending sometime before the Sun greets the Earth. Of course, with the other stuff that I do, convenient times are all taken up by inconvenient things. So that leaves only inconvenient times to do convenient things.
No matter. Yesterday I learned how to overload a function. It's a tricky little bastard, but crazy useful. So let's use some examples (I love examples! - and parentheses!):

Static DrawCrap(Picture, Position)

Okay then, let's say this is the basic function. It draws a picture on the screen at a certain position. No, that's not correct code syntax, but blogspot doesn't have the code fixer than my IDE does. In any event, it's simple and basic. We could also do this, in the same program:

Static DrawCrap(Picture, Position, MaskColor)

You'll notice that this new one is named the same as the last one - DrawCrap(). Usually, having functions, or anything really, named the same as something else is a recipe for holiday themed, peppermint flavoured disaster. However, since they want different stuff, then it still works. The computer will know which one you want based on the context of it. Give it only the name of the picture and the position, it'll use the top one and give it some mask color information and it'll use the bottom.
That's not the only thing either, it'll also know based on what type of information you feed it. So,
DoStuff(int) is different than DoStuff(string). It knows what to do based on what it just ate.
Cute, no? I'm still not sure how I want to use this, but I'm positive that I can think of something. The DoStuff example will probably turn into a function that draws me some bloody text without the nine pounds of dusty nonsense that C# wants to enforce.

-Which reminds me, I hate fonts. Firstly because I can't seem to load them. Secondly, because the online tutorial sucks and finally, because the code to make it work is long, tedious and unnecessary. I'll tell you what I want, what I really, really want (other than to not hate myself for just typing that) is to just draw some fuggin text on the screen. It's what I use to debug stuff in real time. Turning on Debug Mode in The Thief's Tale turns on dozens of little labels and numbers in a bunch of very colorful little characters. That's what I want. Instead, C# wants me to load a font, and assign a font and make sure that my font isn't licensed and I can use it and then it wants only a string, so I have to convert stuff and try not to play laptop Frisbee.
So, yeah. I may build an overloaded function for that and then use it ad perpetuity.

- Wait for it...here comes the titles. I figured out yesterday via tutorial and practical application how to make the keyboard do stuff. I have the computer check for the state of the keyboard and then play twenty questions.
"Is the spacebar pressed?
"How about the Right Arrow Key?"
"How about the Escape Key?"
"The left Shift Key?"
"Is that little Key up at the left with that little "~" on it, is that pressed?"

So it basically works exactly like it does in Blitz, but with squiggly fuggin' brackets. I also saw that I can have the computer remember what I pressed. So I can ask important questions like:
"Are you still holding the spacebar?"
"Was the Escape Key just pressed?"
"Did somebody just let go of the little Key up at the left with that little "~" on it?"

The answers to which allow me the summon the same functionality that KeyDown() and KeyHit() have in Blitz, plus the extra functionality of the non-existent KeyJustLetGo().

So I quickly leveraged that and now the little Knight Sprite (rhyme!) moves across the screen like a tiny puppet.
The reason that this is of value? Because with this most basic of abilities coupled with the logic and method behind drawing stuff on a screen, it's safe to say that I can now write games using C#. Nothing good yet mind you, but TTT started this way. Right now I have a seed, and from it I can grow a giant thing, and my knowledge with it. That's a big deal to me.
Of course, need to finish TTT first. But I'm thinking that this new seed can grow into Thief on XBLI with the proper care and feeding.

-Oh yes, that is another Jamiroquai reference in the title. Deal with it. Although looking back there is a kind of running theme of 90's dance pop music in today's post. Lack of sleep obviously clouds the mind.

Thursday, December 10, 2009

Like a Rosetta Stone

In the late hours, I mean really late almost encroaching on early hours, I had a breakthrough. I was reading things like Method and Class and not understanding what that was exactly. My issue, once again, was one of vocabulary. The lightning bolt that hit, was that "method" is just the way C# refers to a "function." Methods I've never worked with before, but functions? Oh man, we go way back.
So I'm staring at code and trying to put things together and writing just a giant pant load of comments to keep the logic flowing like boxed wine, and I'm finding that functions/methods live inside a Class, which resides on Namespace Street. Or can. It seems that such a hierarchy is slightly disingenuine, since I can create a new Class inside a method and summon a Namespace whenever I feel like it, but I think that at this stage thinking is those kind of global terms is helpful. It avoids an overabundance of riches.
Anyway, once a function/method is called we can make it so that it only works inside the Class where is lives, or available anywhere. We can also call it "Static," which opens up whole new worlds of possibility.

You see, the other way to create a function/method is to not call it Static, then it can be called as an "Instance." To do that, I summon up the function/method and stick it to a variable. Kind of like this, but with correct syntax:

New Function Version1 = WhateverClass.Function(Stuff)

Then you would put information (or arguments) into the little brackets there. It creates a new (like the first command) version, or "instance" of the function/method that uses the variables that you've given it. Afterwards, you can call back that specific version of the function.
To put it another way with something I've done before. The collision rectangle code in The Thief's Tale is built around 12 rectangles. Each of those rectangles has an X and Y position and a height and width. Each of those attributes is saved in the computer as a single variable, like Rect1X and Rect1Y.
However, instead they could be built using an instanced function/method. Like this:
New CollisionRectangle Rect1 = WhateverClass.CollisionRectangle(Position,H,W)

Afterwards, whenever I need to check something for collision against that rectangle I could simply call back that particular instance (Rect1). It'll bring all of the information I'd given it previously and then run the code that resides inside using it.
The real cute trick, is that I can create those from nothing as they are needed since all of the variables are local, but saved. In Blitz only Global variables are consistent, and they have to be declared in advance. Instancing allows me to create whole new things on the fly. So hypothetically, I could recreate the ThiefEngine and build screens with thousands of rectangles.

- I ran across a slightly odd thing in my explorations, something called "Vector." I was in the process of drawing sprites on the screen (in this case, The Knight enemy since I have lots of assets for it) and the stupid little window kept telling me that 200,200 is an integer and not wanted. To which I said, very likely aloud, "No shit, I'm aware that 200 is a bloody number." It turns out, it wanted something different, a Vector. Basically, it's like a tiny box that holds other variables, in this case, X,Y and if you want, Z. So before you can use it you have to fill the box, like this : Vector2 WhateverPosition(200,200)
I think the syntax is right, but it's just as likely not. In any event, afterwards, I just refer to WhateverPosition when I want to put Whatever where it needs to go. This seems kind of silly in 2D, but I suppose that doing it in 3D and a couple of hundred times per cycle it probably helps quite a bit.

Wednesday, December 9, 2009

Achievement Unlocked

I'll skip the usual soliloquy that usually starts off one of these posts and dive right into the tasty meats like some kind of carnivorous Scrooge McDuck (eww). I've got 3, that right 3 things to be all happy and/or stressed about. One of which I won't talk about here in the harsh light of the internet for fears that it may wither. Right now it's like Rome, and the idea of it can only be spoken of in whisper else it be blown away.
Hmm, it seems I am incapable of skipping soliloquies.
Moving on first to game related stuff. I've built a list of Achievements to install. They're all basic things that will be quick to implement. Things like, "Beat the Story Mode on Hard" and "Collect all the Dolls." I am following what I consider to be good Achievement Design though. So when a player finishes on Hard, they'll also unlock the Achievements for beating it on Normal and Easy. The same will be true for Speed Running the game. So getting the tentatively named Zephyr accolade by doing the game in 30 minutes or less, will also unlock the also tentatively named Thief Done Quick and Arabian Royal for beating the game in less than 45 and 60 minutes respectively.
Other than adding another front page to the main menu, the actual implementation of this new feature shouldn't take too long. Generally speaking, since I'm waiting for art content to finish cooking I get to work on other stuff. Yet, I'm not ready to move on to another project since I feel my dedication to this Thief is one of the defining factors of my leadership. Some of the rivets holding the project together. So yes, this is a kind of feature creep, but I'm oddly okay with it given the circumstances. Besides, I'm not technically competent enough with C# to start off the EP...yet.

The other thing hit me yesterday. It's an odd kind of feeling, like when you're climbing a mountain. You spend so much time staring at your feet and the rocks that when you finally turn around your progress surprises you. That happened. I was checking out schools, mostly because I found that Full Sail offers an online course. So I was cruising the information traffic jam of internet and browsing reviews and discovering that it's quite expensive when I started reading the syllabus. I quickly wondered if I could audit the classes, since I, you know, have done all that stuff before in one way or another. So I trekked over to see if The Art Institute offers an online option, and wouldn't you know it, they do. They were even nice enough to show me all the classes required to get a Bachelor's Degree in Game Design.
Again, I started reading and then it hit me, like patchouli flavoured truck, I know all of that already. Game Design Theory? Yep, and Practical Application - which isn't offered. Game Programming? Yeah, that too. Plus Engine Construction, Scripting Implementation and learning to fuggin code. 3D modeling, History of Game Design, Writing Composition were all a yes, yes and a duh.
In all, there wasn't anything that they could teach that I didn't already know, or could quickly apply skills I do have to. That's when I realized that yes, I am a real game developer. Even though I just happened to consider myself an "Indie" which has zero application process, somewhere along the way I had passed the line between what people would consider to be just a guy that dabbles in games, and a guy that has the abilities to create them from the raw aether itself.
To put it another way, it's like this:
"Do you have an Engineering Degree?"
"Nope."
"So, why do you think you can be a Structural Engineer?"
"You see that bridge over there?"
"The one across the bay?"
"Yeah, I built it. Figured it out. Would you like to see the blueprints?"


*bloop*

Monday, December 7, 2009

Class Warfare

My continued education into the basic format of C# continues. Once past the, let's call it "culture shock," the language isn't altogether too dissimilar, save for the one thing I'll get to in a second.
"Ifs" and "Whiles" work just like they should, and the "++" notation is a cute shorthand.
There is a "do" command, which I hate the syntax of though. Basically, it's a "while" statement. More basically for those of you at home without programming experience, a "while" statement tells the computer to keep on doing something while something is true. The Game engine for example is more or less:

While (exit = false)
Run Engine
Wend (end of while loop)

So as long as the "exit" variable = false then keep running the game. "Do" works sort of like that, but guarantees that the code runs at least once. I'm sure I can find a use for that, but hate how I do it:

Do{
Code Goes Here}
While(something = something else)

With that, the condition goes at the end. Right ^ there it's not a big deal, but add a hundred lines in between and it's easy to forget why something is doing something.

Other stuff works like it should too. Arrays (tables of data - see my rambling about combat animations in the diary for an idea of how those work) can be arrayed and inputs do exactly that.
I'm still at a slight loss about how Functions work, but other than being needing to say "void" to not return a variable directly they seem to be the same animal.

Except for one thing - Classes. I'm not there yet. They seem to be the hidden Qi that powers the language and mastery thereof will allow me to see the green rain code of the Matrix. I get that, at a basic level, they are a structural component. They keep the code pieces all separate, which somehow facilitates communication of some kind. Then individual "instances" of the classes can be summoned up from the spaces in-between and those code bits, or chunks of variables or functions can be used for other things.
The two things that are getting me, I mean really getting me coming from Basic are:
1) How the hell do I summon an "instance" of code? Doesn't it have to be compiled? Or is it just pointing at other code like a convoluted function call? Why do my examples have pointers inside a class that that appear to be local variables inside the same bloody class? Like a goddamn digital ourobouros. How do you reference something from inside itself? That doesn't make any fuggin sense I tells ya.
2) How do these classes even talk to each other? They don't share variables, they pass around the same local variables and once they start I don't seem to have a way to make them actually do anything. I could probably get away with coding the way I normally do and then just put everything inside a single class and then never mention it again, but then I'm not really using the power of the language. Plus, the stuff that makes things run on XNA are all written with a SARS riddled cornucopia of classes and local functions, so that doesn't really help me.

It's okay though, I have faith that I can figure it out. I mean after only a week I can read C#, which is more than I could previously. I'll think I'll be ready to make some code soon.

- I mentioned "++" in the words above. It seemed like so long ago. Anyway, what it is, is a counter trick. Basically, if you do - variable++, it's the same as - variable = variable + 1. It's shorter and faster. There are also "--" versions which decrease by one and other flavours that I find both exotic and nauseating, like those pepper lollipops from Mexico..

- I've gotten Namespaces buttoned down. They're a way to code like a retard by yourself, or have your group written code usable. I think that what it is, is a collection of variable and function names, almost like a folder that you can make. So you can have a variable in Namespace Ernie called Rubber_Ducky and then also have a Namespace Bert and a variable called Rubber_Ducky. Even though they have the same specific name, they are different because they come from different places. It's like how you can have different documents in your computer called the same stuff in different places.
It makes sense in a group, since then you can all have your own little sandbox and not worry about using variables the wrong way. In my own code, if someone went in a thought that iX (the player's X coordinate) might be a nice thing to use for a counter, it would lay waste to the game engine.
But like I said, if you're coding by yourself, I can't think of a decent reason to do this. Granted you can call variables from other Namespaces like this : Bert.Rubber_Ducky, but really, why would you do that instead of simply making it have its own specific name? I may be missing something here. I'll throw some IQ at it and see what sticks.

- Yay! Technical post! Hopefully I'll be able to leverage some of this new voodoo into something useful. Hopefully soon. I feel like I'm writing an essay test for a programming class sometimes. Only with more swearing.

Thursday, December 3, 2009

Steppin' Razor

I'm finding C# to be kind of scary. There's just so many things that it's capable of doing that it needs way to keep all of those things in order. It's got libraries of content and the IDE has the cute capability to show me what a give function needs for input. Oh, and it has autofill like my Jesus Phone, so a quick tab and I've called code into the world.
Yet, it does a lot of things that give The Rage and The Fear like squiggly brackets, main function loops and the ever present semi-colon. Not to mention a whole new vocabulary including Static, Void, Main and Namespace, oh which I didn't know anything as of yesterday. It's like my brain has a hole in it and stuff is being pumped right in. To wit:

"Static" means that the function or variable you've got there isn't ever going to change. I guess this means it takes less memory or something. I'm not sure what the point is.

"Void" is something added to the front of functions that doesn't return a value. My Blitz Code would probably have 99% of the functions with this on the front because my software runs from the top to the bottom using global variables.

"Main" is the program itself. C# and C based languages all use one of these because the thought is, "Find the Main Function, and run it." This is different than Basic bases languages which say, "Find the Top and run to the bottom, stop when you get there." Basically, in C#, if it's not a declaration of variables (or independence) it's probably lives inside a function.

"Namespace" I still have no idea, but it seems to be a linchpin of the whole language. I think it's a way for C# to not confuse itself, but I'm still not sure.

Right then, "why am I doing this" is a legitimate query. I mean, I'm already super versed in another language and have the capability to make games. The honest answer is so I can play The Thief's Tale on XBLI and other people can too. Yes, we'll probably get hits and people playing our game if it's given away via the altruism of internet. But we'll get more my several factors of 10 on Indie Games, which is the true point. I mean, I'd give it out for free on XBLI if I could if people play it.
Further, I've decided that moving forward, I'm going to use C# exclusively on the next project (the EP). Specifically because it's portable. I can do something once and (cue the Batman SFX) BAM! on the computer and then BLAMMO! it's on XBox too.
But I'm moving into big kids territory here. The abilities that I'll have at my disposal will be more than I have now, I just need to take the time to learn it. Baby steps a little at a time, slowly and surely. Then, oh yes, my Kung Fu will be Strong.

...like a strong House Beat Dub...

Wednesday, December 2, 2009

The Next Step

The Wall Level's gone now. I couldn't think of anything that could make that level interesting, and instead of having an extra level that didn't add anything to the sweet gameplay stew that I've cooked up, I'd rather just have one less. It's oddly freeing to hack things not due to time constraints, but due to content quality. It's a nice option to be able to exercise occasionally.
That means that, for all intents and purposes, the level crafting for The Thief's Tale is finished. I need to put together the final boss area, but other than that, it's good and done.
Which brings me to the next thing. Since I'm waiting for content to arrive (which is does, in tasty little morsels) before dong more coding, I found myself thinking about different stuff and thinking about the framework for the stuff I want to do later. Recording functions, tile collision engines and fluid dynamics algorithms have been coming together slowly in my head meat and sometimes finding their way down to the hands where prototypes have been coded. But that's not the next step I should be taking. It's not correct. The Programmer and Designer part of me craves the new, while the Producer side of me demands completion. It's the side that must always win, for good or ill.
So, the true next step, is XNA. I've a wrapper put together that will launch my software into an XNA environment, but I've not done so yet. I don't know how well it'll function through the wrapper on a non-PC platform. I don't know if the controls will work, or the display will function or any of it. It's stuff I can figure out, but the answers may be in a language that I don't know. From a programming perspective, it's being born again into a strange new land that has only traces of familiarity surrounded by new dangers and mistakes to make. I wonder if the programming that I've done up to now is without real value, like code training wheels. That frightens to ever so much.
But that's just me. Producer side of me has an altogether external fear, that for the Team. Made up entirely of volunteers all wanting to have resume experience (like myself) and the start of a (hopefully) great, big MobyGames entry, I hope that the idea of monies won't spoil it. It probably won't since I want to, and plan to, split anything we make fairly. But fears of negotiations dissolving and work being left for dead is enough to keep me awake at night, staring at the ceiling and making a frowny face.
The least of my current worries, is IGF. We have time to spare and in what will probably never happen again in game development, an entire game framework upon which to hang gorgeous arts and sounds. I know we can do that, I hope that we can survive everything else.

I want to Believe.

Monday, November 23, 2009

Sapped

Over the weekend I had but a single goal - to get the Wall level mapped out. So I had a sit down equipped with my trusty pencil and graph paper and began to sketch. After a few minutes, I decided that I hated what I had created (rhyme!) flipped a page and tried again. A few more minutes passed and I loathed the new design even more than the last. The puzzles just seemed too...pedestrian. There was no spark to them, and if they don't excite me to work on, then they're certainly not going to excite anybody playing them. So out it went. Then again, and again and again. There was nothing I could do about it, even the core conceit I had built up didn't help. All I could think of were things that I had already done in the other levels in the game.
Which isn't to say that I'm all out of ideas for levels, that's far from true, I just have exactly zero ideas for what to do with the Wall level.
So now I find that I'm fighting the urge to simply not build one and pass the story forward using some other means. The urge to move on and mark the level construction at an end is very strong indeed. Unless I can think of something that would make the level anything more than pure filler, then I'm leaning towards indulging it.

Tuesday, November 17, 2009

Corner Painting

I'm finding that I do emails more than anything else right now. The programming stuff I have left to do is add controller support, get it to jive on my XBox and do some AI stuff. All of that of course requires a controller and/or enemy animations. So I'm waiting and getting on the stuff I can do, like send emails, poke the Team, and get thinking about the Wall level.
The original idea just got the toss, since it simply no longer works in the context of the game systems. Previously, I had designed the Wall areas into a kind of maze. But that was before I had built any of the levels after it. Now with other levels to compare, the conceit is both way out past Left Field and would feature a concept that is never used again. It made an odd wet noise when it was thrown from the car window at speed, like what I assume one of these would sound like.
In any event I think I need to start from scratch again. I need to build a level in the middle of the game, not too hot and not too cold, but just right, using conventions established in other parts of the game without being boring. The other thing is I built a Front Wall in the Tower Level, and the profile is only about 500 pixels wide.
An idea that I'm enjoying the rattle of, is to build another tower. In my sketches of the Castle, for symmetry there is always a second tower on the far side from the main Tower (referenced in the sketches usually as The Sun Tower - hence the "Chasing the Sun" chapter title). The other tower was labeled as either the "Moon Tower" or more commonly, "The Observatory Tower."
I don't want to construct another great big tower though, since the player does an awful lot of climbing upwards. So the idea rattling, is to make the tower fall over onto its side, and then build the level like it's sideways. With floors and ceilings that aren't and lots of angled surfaces (hello scripting!) and slides. Add in the broken pieces of wall and the last couple bits on the roof of the Castle Section from Chapter 7 and I think I may have something.
Now I just need to figure out some platforming puzzles.

Wednesday, November 11, 2009

Rocket Launcher

The front end's all done now. It was done, from a coding perspective, but now it's done from a "doesn't suck and works like it was supposed to in the first place" perspective. I find it to be adorable. I can open levels, close levels, leave the game loop, hop back in and get my game on. Added to the fact that the Engine is so lean, it takes zero time to load when I do it. Toss in the page flippy into and out of the Engine via the pause menu and it legitimately feels like paging through a book, which is kind of the point.
The trick I've found involved the giant stick method mentioned below. If the stupid thing didn't have a "Go" moment, then I just had to provide it a way to make good. So I built a Launch function, a single gateway into the Engine Loop that would tie all the disparate elements together, and get them dancing. Then I modified the Tutorial and all the rest of the gamemodes to use it, and now almost everything is functional and dandy. I'm very happy with it now.

I've also finished out the last of the Difficulty setting, um, settings. So now all of that stuff works. Perfect Mode requires perfection, Hard is wicked, Normal is doable and Easy helps you fight better and last longer. Seriously, I'm thinking Easy is too easy. Enemy attacks deal 3 damage per hit on Easy (as opposed to the Regular 7 and the Hard mode 10). With 100 HP you have to get smacked 34 times to get taken out. Add in the life gain at the end of the levels and the auto-block on high (which works great by the way) the enemies are the least threatening thing in the game.
Thinking about it though, I'm okay with that. Some skill is still needed to play, since a lethal fall is just as lethal on Easy as it is on Normal or Hard. I'm not going to force the issue and make Easy more difficult, since that defeats the entire purpose of having it.

- Since the menu works now, I found myself flipping though the levels and wound up playing the Castle (on Hard of course). It seems that the game is now large enough for me to forget stuff that's in there. So I started just playing to see if everything was loading right, and then something funny started happening, I started to enjoy the act of play. Not enjoying the coding, or the level design or the fact that the damn thing works, but the actual actions of pushing the keys and solving the level.
It's far too easy to get too close to something. I've ranted about it before where I stated that I couldn't enjoy what I had built, that seeing all the strings destroys the magic. I still stand by that to an extent. However, I've found that if I've not looked at what I made for a while I can come back with fresh eyes and enjoy what I have constructed. That's not quite right, I can enjoy the game, as a game, which is even better.

- I've got me some new engines to play with. I hate news on this blog (since I want all the news to be about TTT) but recently both the Unity Engine and the Unreal Engine have been made available for free. Not just for downloading and playing with like that rotten on the inside Maya Student Edition, but the real versions. Now they have new licenses for indies which is far better than the previous ones that involved $100,000, the blood of a virgin and a mustache ride.
So I got them installed and running and they are, let's use the term "robust." The Editors, which I'll call UnitEd and UnrEd, have features layered on features.
I started thinking about all the things I could do with UnitEd, since UnrEd barely runs on my laptop. New designs, new ideas, and then it hit me - I don't want to do any of those. All of the stuff I want to do would require me tearing into the deep guts of the software to get an approximation of what I could build from scratch with less effort. So I may open them up to have a peek from time to time, but I've no real wish to do a project with them. Of course, I may change my mind later.

...and I can't do it all on my own...I'm no Superman.

Friday, November 6, 2009

A Great Big Stick

Up until almost 1 AM yesterday. I like being up late, it puts the next morning into a new, unremembered context and smooths out the unpleasantness. Anyway, I was doing the Lord's work and experimenting with the laws of science.
Dealing once again with the Shadow Maps idea and the total lack of speed, I thought that grabbing a pixel and comparing it to another pixel was slowing the whole process up. So, it occurred to me that I could render the entire screen via mathematical expressions. If each picture is a a table that has as many cells as there are pixels in the parent picture, I can do all my comparisons using math and tables (which is, by the way, wicked fast). I could conceivably even apply an Alpha channel to the thing and get some honest to goodness transparency happening. But before I went in and did that, I felt a test was in order, I needed to be sure that the other half wasn't the slow part; that it wasn't the drawing of the pixels themselves that was the slow and stupid bit. So, I built a quick test and ran some loops. What I found was that the loops, can run more than fast enough to support a game. Easily on par with the game loop's speed. Then I added the pixel drawing part and it was slow again. Far too slow for running in a game. So, yeah, dammit.

Which brings me to the title. After realizing that running a shadow map using Blitz Basic is likely a fools errand, I got back into the code. There was a bug that needed hammering and it needed it now. The Front End code was still being, let's go with stupid. Run a game, quit out, run a game, quit out and sometimes, just for fun, it would load you in the wrong place and kill you. The trouble was, nothing was telling it to load you in the wrong place, it did it of it own accord as far as I could tell. Some artefact of the code being wielded by some ghost in the machine. After trying, for several days at this point to find the source, I decided that being crafty with it wasn't paying out, so I beat it to death. I stuck a little bit in the loading function that basically says : "If you did all that, and the character is someplace stupid, you did it wrong. Do it again, and keep doing it until you get it bloody right."
It's hardly the most elegant thing in the world, and I would rather it just work like it's written. Yet, it does in fact work now. So I'm happy enough with it. Now I can move past the thrice damned thing and work on the other stack of things that still need doing.

Monday, November 2, 2009

Speed Racer

Over the weekend I got to fiddling with the shadow code some more, and turned to my old friend the CAD menu to do an experiment. It was posited that maybe, the code wasn't the problem, the processor was simply too slow. Maybe the code as it is, is too big a bloated from something to work on a normal system with normal system resources. So I went ahead and opened the little bastard up and let it run and it took 95-100% of my processor resources to run. A giant overflow of want that the bounty of my not-slow laptop could not provide. So clearly, the basic structure of the code is flawed. I'll try to think of something else.

While I tried thinking of exactly that something else, I got to dealing with some of the little coded pieces that need doing. So I started finishing off the Perfect Mode features. So now, if at any point you happen to have more than 1 life in perfect mode, you instead only have 1. That way my doll code all works still and I don't have to add little exceptions to every single scripted bit. It also kicks you out to the front menu if you die and doesn't offer a continue option. I bashed that for the better part of 15 minutes before finding that it was the pause menu itself that was trying to be helpful when I didn't want it to be. Either way, the base of the Perfect Mode is all done. It needs the little polished bits like stat tracking and things like that, but that'll come when I build those things for the rest of the game. In the meantime, I'm confident it gets a great big "Done" stamp.

I'm finding the little pieces all coming together to be great. It's not the epic battle that often comes with doing assets and codes. It's a subtle groove that carries me along. A bit here, a script there and then whole delicious chunks of game just are. Nuggets of progress to enjoy on an almost daily basis. Really quite yummy.

- It's not all sweet cookie code, the front end has gone all stupid again. First, it wouldn't launch the game loop. I would tell it, "Let's run the game! It'll be fun!" to which it would sardonically reply (through it's actions) "Yes, that would be fun. It really would be." Leaving me feeling like a rube for even suggesting.
So I made a little change to the code to put the Launch Sequence in more places. Now, it doesn't load correctly. Start it up, and it works. Quit out or die out, and start again, it doesn't load right, keeps you in the same place and usually kills you.
Or if you go into the Chapter Select, and the back out to the Front Menu, it launches prematurely (I've told it that it happens to every bit of code sometimes).
Something is rotten here, but thankfully I know that it did work once. My new changes clearly the issue. I just need to fix it, but not well enough to recreate the original problem.

- Finally, I think we missed our deadline of 11-1. Yep, we sure did. The odd thing was, I didn't even notice as we sailed on by, too engrossed in the progress we're making. The slow brew in a magic cauldron.

Friday, October 30, 2009

Shadow Boxer

I've been chatting recently with The Ron about doing some computer stuff with the art. Mostly I had the idea to do some kinds of simple transparency. Nothing too fancy, or making use of alpha channels or anything like that, just some basic color modification.
What this led to was the idea of using a Shadow Map - another image that would display the differences in light, where beams of light are and where light sources are. This could then be compared with the normal screen render and a new lit up version of the screen would be spawned.
Thinking about it further, I concluded that this Shadow Map could be animated. By drawing things onto that screen and averaging the tints, I could get the lights to move and animate. I just need to run the color average function again for each time I add an item.
This seemed like a good idea at the time.

So when I got home, armed with proof of concept art and pseudocode, I got cracking and about 10 minutes later I'd gotten a basic color averaging schema scheming. A bright red box plus a bright blue box gives me a purple box with the same absolute brightness value (which would appear the same gray color if in gray scale). So, that was pretty cool.

With that out of the way, I got to the next part. I built another screenbuffer and drew a great big rectangle on it. I think I made it green. Then I built a loop that checked the color of each pixel on each and added the color averaging function. Then I told it to draw it out and...nothing. That's not quite right, there was something, but it was, and I'll add emphasis, soooo...fuggin....ssloooooowwwww. Like old people dropping a deuce only with slightly less blood.
So I spent the next hour trying to figure out the why of it. I tried alternate functions, alternate methods all to zero avail. The stupid thing is, according to the design of the shadow map software that needs to run about 5-6 times per frame. Instead it runs 1 frame per 15 seconds which is unplayable by every stretch of the imagination.
Granted, there are ways to make the basic pieces quicker. I don't need to run the whole screen every time I add something, just the parts the image is touching. So I think that it may go faster with images drawn to the shadow map. But no matter what, the whole screen does have to be drawn eventually. I'll give it a little more effort and see what happens. Hopefully speed.

Tuesday, October 27, 2009

Time Extended

No posts because last week contained the date of my birth. I think it can be discovered over in my little bio, and maybe not. Plan was to work through most of my week of festivities, but instead I decided to do other things, and I feel almost bad about it. Now I'm over it and have gotten back to working.
On a basic level I've been continuing to build and debug the front menu. The previous idea of nesting the engine inside the nice, warm interior of a menu loop, like the way a mommy bird would protect her code, worked out great. Not the exits quit back to the front and a proper game closing can happen. Still parts to polish, still parts to build - like the Fencing Tutorial, but I'm getting happier with the system the more time I spend with it.
I got the page flippy working on all levels now. So it works on all the page flips in the menu (which looks pretty cool - I'd post a movie if I could figure out how) and I can toggle it on or off for the engine itself. So I can have page flips happen in the game if I feel like it. Mostly at the end of chapters or when I want to summon up a scene. Currently, the Basic Tutorial uses it to great effect, since that Tutorial exists in a kind of other world outside the contexts of the game proper. It's the kind of idea that I could do something with, but now the whole system of the thing is far too past the point where whim can make an impact on the shape.
I find that I can't figure out the layout of the Fencing Tutorial, and how it would fit all together. Everything comes back to a fighting game character select screen and nothing quite seems to match the aesthetic that I've carefully constructed on the front. Add to that the incomplete animation sets and even if the coding were done and set up with placeholders, then it still wouldn't really function. I consequently find myself not wanting to start something I won't be able to finish for a while. There are other things over there => that are still black I'll work on instead. Like GamePad Support, finishing off the difficulty setting modes, a function for showing story mode pieces and those Walls aren't going to build themselves. Still much to do.

- I was thinking about our little project, and a simple thought came to me. None of us have done any of this before. We've got a programmer that's never coded, an artist that's never drawn game backgrounds, an animator that's never done sprites and a musician that's never written game music. We are a motley crew indeed.
But that's not a bad thing by any stretch of the imagination. It frees us to do anything and make our own mistakes and learn our own lessons. I've found that, once you've done something before, you have a frame of reference, a place to start for all subsequent similar situations. This invariably leads to having your choices shaped by those experiences. Given an option, a person will try to go with what has worked for them in the past.
We don't have that, those past experiences. It's all new, all fresh and all slightly more difficult than it would be otherwise. But everything, every aspect, every system every methodology will be distinctly ours. Without experience that says something can't be done, we can try and maybe find a way with a new perspective and using raw talent. I like that. I think it can only ever lead to great things.

Monday, October 19, 2009

Stay Frosty

So work continues, as I find that it does. Somehow, I was expecting the Team to, well, dissolve honestly. Some hidden thing kept thinking, "We missed our deadline, we're boned. We've lost all credibility..." and so on in some kind of self perpetuating doubt spiral.
Instead the replies that I got back regarding the news were universally, "Hmm, that's okay. That means we can do this and this and this like we would if we had more time." That's not just cool, that's downright frosty. So, I busted ass and got to work. There's still programming to be done and levels to be carved from the raw binary. I needs me a place to put all the incoming awesomeness.

- I'm onto a bug I think. It's core is in the engine itself and how I call it up and some of the latent buggies are showing their hideous little heads via the front end menu. The Tutorial bug is one of them, and I discovered that this bug is far larger than that. It's one of those systemic bugs that I have condensed Campbell's Hate for.
So, the Tutorial was having a bug where after you did it, and did it again (unlikely but not impossible) the game would load and drop you into a hole and continue to do so until the game got tired of abusing you. So, I hunted down the screen it was loading back into, and I set up a portal rectangle to reset the player if the player was outside where death could happen.
This did in fact correct the bug. No problem there. But, the game ran slower the second time and the third and the fourth was unplayable. I think, that a new game loop just got started each time. That or concurrent versions of the same functions.
It's like I'm running the FrontMenu() Function, which opened the Game(), which opened Scripting, which opened the FrontMenu(). It's not cyclical, it's a rabbit hole and it'll go as far as it wants to. Oh, and they share variables, so leftovers from the last whatever are still floating around and causing bugs that aren't actually in the software.
I think I can fix it though. I just need to actually put the whole Game Loop into a function of its own and give it the option to tag out. In other words, have a single loop that runs the software as a whole, and a different nested loop that runs the game engine proper. Then if I want out of the engine, I change a variable and it should just go back to the Front Menu. And it should keep single instances of each. Or it'll crash the thing.

- On other stuff, I got my PageFlip to work and it's sweet. I build several images on the fly using Image Buffers, and one of them is dynamic for size. As it travels across the screen it's width increases proportionally to its position and it looks like a page is turning and the art for the next page and current page are all showed in real time. It's some pretty fancy graphical work if I do say so myself.

- Finally, I'm keeping the Last Stage cut. I did like the idea, and wrote about it extensively, but words are cheap (I mean, look at all these words, and for only $1.89 worth of Google revenue - what a bargain!). Instead, I'm make a couple script changes and just reference the area as being wicked hard, then skip it entirely via plot resolution and permutation. The trick is going to be making it look like it's on purpose (which is is now), and not just a cut (which it was).

Thursday, October 15, 2009

Delay of Game

Dammit. I can't write a decent first line here. Maybe I'll sneak into the post like that. Maybe I can actually write the words this time.
The Thief's Tale, is not going to make it for IGF this year. There's a story that goes with that.

So yesterday I called up The Animator to see how things were going. As his blog => would tell you, college for him is a very stressful thing and the work requirements are pretty brutal. I had thought nothing of it, my mistake. Anyway, so I am told that given the priority of schoolwork, there will not be time to get the animations all done. Further, the animator that he had recruited wouldn't be prolific or skilled enough to do all the animations themselves.
Add to that I have an animator here who seems to have fallen off the world and cannot be relied upon. The short of it is that I have no animators, and no complete animation sets for an animated character driven game.

When I hung up the phone I swore. That's not quite right. In truth a primal scream of fury was birthed into the world that just happened to sound like "Fuck." If a butterfly flapping its wings can cause a hurricane, that scream destroyed Galactus. Then I bashed the steering wheel and did some more regular swearing.
Then, with that all out of my system, I called The Ron to let him know that he can slow down if he would like. I'm sure there are some producers that wouldn't have, that would have been content to work the team like animals for a deadline that he knows they can't hit. I hope those producers burn in hell.
Then, despondency. But that too quickly passed, leaving a slightly depressed feeling deep in my bowels, yet it was cut with an odd sense of relief. The giant weight pressing down was lifted. With no deadline blazing towards me like a meteor I'm not so stressed, and began to look at the situation from a far more pragmatic point of view. So let's look at what we learned here:

1) When somebody stresses about stuff, that is a sign to do something about it, right then. If somebody is stressing out to the person in charge of of project, as opposed to anybody else, it means that they are very stressed. Like, if something hurts a person may tell somebody, but if it hurts bad enough they tell their Doctor. It's like that. When I was told that the work may not be doable in the time frame given a circumstance, I should have started looking for help then and there. I didn't, and that's my fault.

2) When building a Team, decide early on what the most important parts of the project are. Then, make sure that there is no single point of failure. Airplanes have co-pilots for a reason. This is especially true if the whole team is volunteers, because regardless of the best intentions other work can, and will, be a priority. I can't fault anybody for doing just that. Again, a painful producer lesson that I got to learn the hard way.

There was a part of me that wanted to write Noble Failure as the title, but we haven't failed. We've simply missed a contest. I decided that we were no longer shooting for that particular deadline, and oddly, the decision didn't bring down the sky. The world went on. I went on, and the Team, continues to go on.
So what are we doing then? We're pushing past, as if the IGF was cancelled. The next thing we are doing is getting the game finished and pushed up into XBLI. I think that we can do that. I think we can have the art finished to a state that we are happy with by the end of December (that not preliminary, but done to the level The Background Artist would like). I think that we can have the rest of the assets done too. I'm shooting for a February release on XBLI and that gives me 9 months to have it and love it before next year's IGF, which should be the least stressful submissions I'll ever do.

So, given the extra time, I'm putting it all back. The levels, the musics, the cut pieces and now I have time to do more stuff. The HD conversion is on the table again. Time for R&D means I can try other tricks like transparency and lightmapping. We're getting this done. We being my Team. That's not right, my compatriots. The hardest working and most talented people that I've ever had the privilege of working with. A few extra months will be the difference between a good game, and a bloody brilliant one.

- A ha! A dashy thingy! Stuff goes after these! Game stuff! Sometimes. Anyhow, I built new art yesterday for the Tutorial levels that I put together. I cribbed the platforming and wall sections from screenshots provided by The Ron and put my photoshop skills to the test.
In my thinking ahead to this blog as I do sometimes, the title as of 2PM was going to be "Demon." In that, I am not an artist. I can draw well enough to show a real artist what I want and I can photoshop things. I can corrupt them and twist them to suit my purposes. Yet I find no satisfaction from doing so, there is no artist inside of me that see art I've done and feels much of anything other than the relief that it's done.
Well, that's not altogether true. When I design or program something that I feel is wonderful I do get all smiley, both outside and in.
In my case, I got the pages finished for the Tutorial. Words on the left and the art on the right. I was able to go in and make some clever use of masks to bleed out the lines while preserving the edges. So it looks like the Tutorial stages were drawn a long time ago, and age and water have aged, faded and run the india ink used. I think it looks nice, but more importantly, is plays nice too.
Then I ran into a bug. If I run the game, and select Tutorial, then it works. If, at the end of that, I do the Tutorial again, it drops me off into the void and I die, in the Tutorial. Then it loads me up again and, guess what? Death.
The stupidest thing is that the system seems to be outright ignoring me and my wishes. I explicitly told it to reset the player at a specific place in the line right before I call for the Tutorial and it disregards it. I scripted something that says, "if you're outside the little box, reset inside the little box," and then it just leaves me outside and floating, forever.
At least I fixed the other issue, which was incorrect loading. If I selected Chapter Select and backed out, then selected Tutorial, it had been loading the chapter I had looked at previously. That's better now. At least this a problem I can solve.

...and I'll be back, when the day is new. And I'll have more ideas for you...

Wednesday, October 14, 2009

Fortnight

The game is starting to look like something. I've gotten the front end menus all done. They work, they have art and they are navigable. They're all debugged now too and make a decent attempt to not do anything stupid. So that's more or less all off the list and I can move along.
I got the Basic Tutorial all hashed out too. I went ahead and added it to the Front End menus, so it all looks the same. So on the pages for the menu it looks like a book with page creases and stuff and then the Basic Tutorial looks like a book, with play on the right page and tutoring on the facing leaf. It sounds odd, but I find that it works really rather well visually and from a gameplay perspective.
For the art, what I'm going to do is crib the parts from the backgrounds The Ron did and adjust the colors. Since the tutorial is an abstract concept with no grounding in story, I'm going to abstract the art for it. So the pages will have more or less inky black lines to show the geometries. It should match the rest of the art in the game and my front end menu, provided I can do it right.
Turns out I was correct, my photoshop skills were called upon.
Further, I found doing the final levels (for the IGF build of the game) to be interesting. Since the Tutorial features single moves for the player, having to design a puzzle that more or less only has the one thing is kind of tricky. Doing it with only half a screen the additional twist. Thankfully it both teaches well and plays. Now I just need to make it look like something.

Once that's done I'll get cracking on the Fight Tutorial. Basically I want the player to select a type of enemy, load a screen with that enemy in it, keep the player at 100% health and reset the level when the enemy gets taken out. Add a sub screen on pause that shows directions and how things work and that should be done. No, it's not the best way to teach a player anything, but it's better than nothing and it's what I have time for. Given another option I would script together a mode like in the last IGF version, but I have 14 days or so left. Time is not, and probably never was, on my side.

With that it's just some minor cleanup to get the Speed Run mode working correct, the Perfect mode dancing and the Easy Mode eased. Then...nothing. After that I've got nothing left to do until I get the assets for it. I wait, I twiddle thumbs and I send emails where I pretend that I wasn't staring at my ceiling thinking of what to do next until 2 AM. They tend to go like this, and everybody on the Team gets them, although the specifics change.

Hey (insert name here),
I just thought I send an email to see how things are going and if you need anything.
I hope everything's cool.
Later,
-Eric

- For the title, what I wanted to call it was either "Two Weeks Notice" or "Hurry Up and Wait." But it turns out I've used those already.

Monday, October 12, 2009

Getting Around

Over the weekend I got most of the under-code to work for the Chapter Select and the difficulty settings. So now the player can select which Chapter they want to play and at what difficulty and the game boots them right there. It works pretty well, and I like it. It still doesn't look like anything because I haven't made the art for it yet, but I'll should be able to get that in sooner rather than later. I'm not too stressed about the whole thing, especially considering all the other stuff I need to be stressed about.
Either way, I was able to add a big chunk of orange to the list. I'm trying to free up as much time as possible for animation installation. Most will go in easy. It's a relatively simple matter of calling them the right things and dumping them in the right places. For attacks I need to do data entry on their information and for others, like anything for The Thief, I need to add code.
Through some odd twist of fates, we seem to have 2 new people that want to join. Animator types. Coordination at this point in the game will be, um, tricky. But I think we can do this. I'm sure we can.

- I had coded up a timer for the Speed Running mode. A cute little thing that added cycles up to seconds up to minutes and, since I was feeling cheeky, up to hours. Then I played and I discovered something, I'm really fast. I blazed through the Tower in just over 1:30 and I can clear the first two stages in about 3:00 flat. I guess when you designed the puzzles and your line through the game is as smooth as a river pebble it's what happens. Although I have watch people play, and they tend to be a lot slower than that, but at least I know the kinds of times I should be expecting on speed run.
Oh, and then my window had an error and I closed the wrong one through the CAD menu. So that code's all gone now. I'll do it again soon.

- Finally, for the game, I found that I keep coming back to the same thing, over and over : The Game you make is the Game you have time to make. Once again I'm finding that I want to add things, to do more to make more and I find that the resource I'm in shortest supply of - time, is the one thing that prevents it. Yet, it's the one resource I simply cannot have more of. Given an option, I would push the game back. Producer me would say, "Nah, another month, we'll be good at Christmas." Yet, IGF waits for nobody, least of all our intrepid little band.
Even still, I'm trying to keep on a happy face and keep on going. We can get this done. I find that I have to believe that. We're too close not to. We're too close to fail now.

Oh, and I find myself listening to Radiohead again. For me, the official soundtrack to crunch. That old familiar feeling indeed.

Where do we go from here? The words are coming out all weird. Where are you now, when I need you?

Friday, October 9, 2009

The Avengers

This is more of a direct update from yesterday than anything. The conclusion that we, as a team, arrived at is that the animations probably will not be done by 1 person. So, we're looking for more. I've posted an advert on the list that belongs to Craig and have both the artists scouting their perspective schools for talent. Specifically that wild talent that sees things like deadlines as things to conquer.
Hopefully, we'll get several. Which brings me to the Plan and the title in a way. What I would like, is to have several animators added quickly, and then give them characters to work on. So an individual animator is responsible for individual characters. Basically, since the 6 characters that still need animating are a lot of work for one person, spreading it around would make it more, well, possible for a normal person with normal person things to do. That could work I think.

Now, armed with a plan and waiting patiently for email or phone calls or bat-signals, I can almost, almost breathe again.

The mistake I've made, the biggest mistake I think I could have, is assuming that just because I'm on the tail end of my work it does not mean that everybody else is too. I'm reaching the end of over 2 years and 230 posts worth of effort, and I forgot that my Team is desparatley trying to get their 2 years worth done in months. That list over there => is really quite large. Borderline biblical in its proportions. For a game of this type, the kind of game that would've once been played on Super Nintendo used to take 2 years and 15 guys. We're doing it faster with fewer.

The Lesson is this, in games, even indie games, you succeed or fail as a team. We're not there yet. But when we do succeed, it'll be a very, very good thing.

I remain confident.

- In other stuff, I've made a cut. No matter what the song says, the first cut is not the deepest. The Last Level, has been chopped for IGF. After thinking about it, I've decided that it goes with the Wall level, in that it doesn't make a legitimate addition for either plot purposes or from a gameplay perspective. I really do like the idea of it, so it's not cut forever. The later HD version will have it too. But we don't need it right the hells now.
This should also give The Ron some much needed wiggle room for the rest of the art. This cut also puts him at the halfway mark art wise. It also gives me some extra days since I no longer have the build the level I designed. All I have to do is make a small adjustment to a scene for it to work.

Thursday, October 8, 2009

Pressure Test

I'm stressed beyond measure. It seems as if the fate of the project is balanced on the thinnest of edges, and worse, it seems as if there is nothing I can do about it.
The issue, is that The ADA has decided he needs help, now. So with just over 2 weeks to go, I need to find another member, convince them that all of this is a good idea and actually have them do some work. I don't know how much yet, since I don't know what The ADA will be able to accomplish, given his circumstances.
To put it in perspective, since nothing exists in the project by itself, if the animations cannot be finished in time, if the art cannot be done, if the levels are not built, if the programming isn't right, the project has failed.
I may be overreacting, making a reactionary response to what I should be able to take in stride. I am the Producer after all. These are the kinds of things I deal with, the flurry of punches that I should be able to block.
The biggest issue, the thing that scares me, is that as of right now it is a given that the animation will not be done. If I can add another animator, I simply do not know if they will work out, or drop out like the others that have floated through our local universe. But adding another that does nothing would be a strike to this mission that I do not think it could bear. Like I said, I have stress.

- In other stuff that doesn't make my blood vessels burst like I have the bends, I've mapped out the Last Level. It's actually pretty easy as far as levels go, and clocking in at 21 screens total, it's on the small side too. It does have a pretty good number of stairs in it, so that may take a little scripting, but I should be able to repurpose the scripting that I've done before. The real difficulty in the level comes from the enemies, since in 21 screens there are 7 of them, all of them I assume are Fencers. And...
...that's great. Odd, I can't seem to focus right now. I can't put the sarcastic little spin on the words that I usually do here. The descriptions of my small victories and progress seem like less now, since they may be for naught.


Dammit.


I almost erased all of that, flicked it out of existence with a keystroke. Like sausages, the messy process of making catharsis is messy and nobody really wants to see it happen. Yet there it is, the whole bloody process laid bare for internet. I almost erased it, but this is important. Not these words mind you, I'm not so egotistical to imply that my words have intrinsic value because I wrote them, but the process of.
For those of you that don't know, making games is fucking difficult. The sheer amount of stuff that goes on, day to day and hour to hour sometimes, is astounding. And yes, all of it is important. This is what game development can look like. Having been lucky for the last 200 listings since for the most part, this project has flowed smoothly through a development land of milks and honey, now we are at a point where it's gotten dark. A place where I do not yet know the way.

Yet is the operative word there. The other reason that all of this is still here, is so when this is done. When we've passed that mythical line that separates all the shipped games from the never weres, then I have a record of the part at the start of the third act. The part that frightens the children. The part that we would have made it through.

From about a year ago:
- "Stress" noun English Root. Def : 1) To feel overwhelmed and under prepared. 2) Extreme anxiety. 3) Knowing that the next 7 hours will decide if the last year was even worth it. See also "Out, Freaking"

Tuesday, October 6, 2009

Another Rose

So I'm into the Last Level now. Thematically, it's like that scene from Robin Hood (either version) where Robin breaks into the dinner area and all hell breaks loose. I'm going for something like that, with an emphasis on less specific platforming and more platforming as a way to avoid enemies or create spaces to make the duels even more tricky. So, a different conceit altogether from the last, well, every stage.
I'm specifically going to try (and I do mean try) to keep the level on the smaller side. Too big, and I fear that the fighting may become tedious, regardless of how much polish it has on it in the end. Make it too small though, and it'll seem like an afterthought. Just right I think, like the big finish at the end of a rock show. Besides, I have to consider both people that'll play on Perfect mode. 5 Stages worth of fighting and bosses will probably leave them in not the best condition to endure a 70 screen gauntlet, no?
Oh, and we have like 3 weeks left, so I know the team doesn't have the time to do art for a huge level. More reasons to try to keep it on the modest side.

- For example, I'm designing the Tutorial now. I kind of have to throw out the old system, where The Thief would talk to you and give directions, since he doesn't do that anymore. All of his speech is now self contained in the little drawings in between the stages, or at key points. As far as the characters are concerned, that fourth wall may as well be made of adamantium.
The alternative that I had as to add smaller tutorial parts throughout the levels themselves. The paper design gives me the freedom to make little notes and things, but that hardly seems like the correct thing to do.
So, I think I'm going to create a tutorial outside the context of the game. This makes it so the player can skip it if they would like, while also allowing me to put stuff into it that directly addresses the player, something that the narrative doesn't support.
Since it's taking place outside the story, the idea gives me free reign to do whatever I would like and make it look however I would like. So I'm going to incorporate it into the front end design, which looks like a book.
I'll post a picture at some point (or I'll forget like I usually do, I owe you, dear reader {*scoff*} like 4 different things) but it uses the parchment texture the levels have and has a shading effect in the center to imply the crease of a book. The page turn effect will be coming back in this system since it works a lot better. So, the Chapter Select for example, will actually be flipping through the pages, with the Chapter Name on the left and a picture on the right. Until a selection is made. But I get ahead of myself.
For the Tutorial, the player will play on the right side (to put the initial focus on the left - with the instructions) and go through a series of small levels to illustrate basic things like running, jumping, hanging and stuff like that. I can build those levels pretty quickly, and depending on the art requirements, I can probably do that while I build the front end to make it match.
Harder though, is the combat tutorial. I can go two ways with it really. The first, is to rebuild an interactive tutorial like I had in the last IGF build. I felt it worked out pretty well, but it does require quite a bit of time to do correctly. The other option is to offer a free fight mode against the enemies encountered so far (in the IGF version - all of them since it'll all be unlocked from the start). Then I can put instructions in the pause menu or something like that. It would be faster to implement, but I wonder if it would teach as well. I suppose it wouldn't eat too many hours to program it and find out.

- Speaking of features, I get all giddy thinking about really stupid things that are stupid easy to program. Like, the different statistics given at the end of the game. I really want to do these:
Time
Damage Taken
Lives Lost
Enemies Defeated
Dolls Found

I would then like to have a small grade pop up next to them, giving an idea of the prowess.
Time - 3:10:52 - Marathon Man
Damage Taken - 250 - Meatshield
Lives Lost - 3 - Olde Skool Gamer
Enemies Defeated - 75 - Duelist
Dolls Found - 9 - Master Collector

The one I can't quite figure out is the enemies defeated stat. Basically, I don't know if I want that to add every time an enemy is beaten, since a player could then run back and forth and fight the same respawning enemy all the way to the top rank. Although I do suppose that would eat their time.
In any event, the real reason I want the Defeated stat, is to encourage players to try something - finishing the game without defeating any enemies. Since the end of boss fights trigger when the boss isn't technically at 0 HP, they don't add to it. So a player could finish having defeated 0 enemies, and earn the rank - Pacifist. Normally, I wouldn't even consider these, but it should take more than a couple of minutes to program.

Friday, October 2, 2009

That Old Familiar Feeling

Ah, 2 AM, how I've missed you. The quiet dark, a time when it seems like the whole world exists just for me, because everybody else is doing the smart thing and sleeping. The small little joy of feeling like I'm getting away with something, that by being up so late I'm somehow being dangerous. The thoughts that I should be sleeping, but I should do just one more thing first. 2 AM, why do you always hit me the next morning as if you are insomnia manifested as a truck?
At least The Tower is done now. That's right, I said it, "The Tower is done." I said it twice even. I've got one final level to go, and it's not even a real level in the traditional sense, just a series of fights and quick platforming.
Nothing too taxing, nothing too hard, nothing like the damn slog the Tower turned out to be in the end. Playtesting it, is hard. The puzzles, are hard. Not just from a thinking about it standpoint, but from an execution standpoint. Yes, it's not too difficult to figure out that you need to wall hop, wall jump, straight double jump and climb to get up someplace. Doing it right when I threaten a 7 screen screaming drop the entire time is something else entirely. Jumping isn't hard, triple jumping onto a platform that's only 50 pixels wide is a different matter. What I'm saying is I can't half pay attention to the Tower. It demands focus like a jilted ex.
Have I mentioned that I love it? Cause, you know, I do. The only consistency is that it's difficult without being cheap. When I die (and I do) it's my fault as a player for being too slow, or making a poor choice. Well, now anyway. When I was building the level, it was likely that the death was my fault as a designer of impossible puzzles.
All that's left is to place the traps and enemies, which I can't do yet because I don't have the animated yet. It's a prospect that worries me slightly, but I know we'll manage in the end.

- Oh, and in regards to the last post. I decided to drop the player off of things and let them drop. If you fail at the end, you drop until you hit something. It could be a long time. Otherwise, it's inconsistent. I did however take one shortcut, if you leap from the edges of the level, there is nothing to catch you. The screen does not follow you and then the end of the screen death trigger goes off. I'm going to mark that on the maps I give to the Artist so he can make the paper look torn up there or something. A visual indicator that those edges are different. A fourth wall breaking way of saying, "that part of the level is not in the story."

- Which brings me to the title (and you thought I was talking about being up at 2 AM). In spite of what all the damn orange over there would lead you to believe, I still have a dump truck sized shitload of stuff to do. I need to install all the enemies, install all the animations, install all the background art, install all the background animations, install the SFX, build the front end, create a Chapter Select function and create a way to show the story and install all the pictures for it. Now, so close to the end, I have a clear vision of what the game is going to look like, and there is still a lot to do to make that happen.
I was reading, and a Producer at Epic said that crunch happens there, and he's okay with it. He said that great things happen when you ask talented people to do the impossible. The story was lambasted (that's a great word, it's a pity I never get to use it in a sentence) by the general audience, and then I took some heat for defending him. The point is this - looking at what is left to do and what we've done already, we're doing something great. I can feel it.
That familiar feeling? It's knowing that you've worked your ass off and wanting to make your work look as good as possible with the time you have left. Polishing while you can hear the clock ticking and not looking up.