Tuesday, December 18, 2012

Fleshy Robots

Okay... so... another robot doom game isn't going to happen any time soon. Programmer art has it's limits, I admit it, my skills aren't up to the task, I can't make really good animations for a third person main character. So... I fell back on that shooter I was working on a while ago, I gave it the upgrades I made for the new robot doom game, and I'm back in action. Here are some screen shots from my first enemy.

Tuesday, November 6, 2012

The Land of Crack and Honey

I'm going down stairs to chat up the crack heads... ermm umm...

I'm back. Harder and Faster. So, it turns out that I dramatically overestimated the amount of time required to finish the new Robot Doom game. Good thing to. I'm about done with code and thanks to some advice, I have resolved the animation glitches I was having, so expect a new video showcasing the new characters and gameplay very soon.

Here is an early sample of the coverart I'm working on.

Friday, October 26, 2012

A friend to all is a friend to none!

Someone suggested I target a broad audience, go casual! The magic that is casual gaming success... When you target everyone you target no one! A friend to all is a friend to none! I believe that a developer should never make a game that a lot of people MIGHT want to play, he should only make a game that some people WILL want to play. Match Three can eat it's heart out! I'm not making a game to kill time with, that's stupid, I'm making a game that you will want to spend time with. MIGHT or WILL, KILL or SPEND - the choices we face... I will always choose WILL SPEND over MIGHT KILL... If that doesn't make any sense, that's fine, I'll take some creative absolutism, if you don't understand, than you're not part of my target audience. I bet you feel excluded, good, because that's what you deserve you filthy casual gamer!

Tuesday, October 23, 2012

Yes, it's true, I can reconfigure time.

Some people think that reconfiguring time is cheating, but they are wrong, it's so much more than that, it's like interpretive dance, but with meaning. I tell people "Don't worry, I'm from the future!" and I mean it, but they don't believe me, they can't see beyond their limited knowledge, their limited understanding of the temporal dynamics which shape our existence. The doubters imagine life as a series of chronological events, a simple perpetual counting sequence, 321,322,323,324,325.... some imagine that their future is set, others imagine that there is no future but what they make, but to tell the truth, there is no future but what I make. I can reconfigure time the way an accountant reconfigures the books, an account can make any business appear profitable (ahem facebook) in the same way I shape the inputs to produce my desired outputs. The horror, the horror...

Friday, October 19, 2012

Advanced Programmer Art

My graphics content isn't naked programmer art anymore, but it's still not art, I christen it "Advanced Programmer Art". I have been soul searching lately, it occurred to me, that by me not hiring an artist, I'm making you suffer. People other than me say that misery loves company, those people are just miserable an lonely. I'm miserable and loving it, it's the price of awesome, people say you have to pay your dues, well, the world be drowning in my dues in not time... hopefully right. But for now, I need to worry about keeping my stomach full and my computer running.

I added some more texture processing to the terrain shader, the close ups were looking crappy. Check it out, what do you think?

Wednesday, October 17, 2012

The Robotic Right to Self Determination

I ask you vegetarians, what makes plants more worthy of death than animals? This issue of the ages is only second to a Robot's right to self determination. Are Robots free or simple slaves? What makes Robots worthy of slavery - what makes Organics worthy of being even the lamest Robot's master? These are questions we need to answer, our very future depends upon the clairvoyant vision of a robot yet to be built... crazy talk? No. Publicity? Maybe. Spiritual? To the end.

Tuesday, October 16, 2012

I live my life like I play my games, set to hard.

Recently someone suggested to me that I make a game about deep space with long stretches of silence so that I can properly explore LGBT (Lesbian-Gay-Bisexual-Transgender) themes, I told him to fuck off. These are the things I do for you. My loyal readers and players, all half dozen of you, I do it for you. But, on the subject of exploration of deep thought provoking yet unimportant themes, do Robots have a right to self-determination? They do, what is my evidence you may ask, I don't need any. Games provide a unique opportunity to make the irrelevant relevant, to make the powerless powerful, to make the lame awesome, and finally, to make the poor rich. I'm looking at me, not you. It would be great if I could throw posh launch parties for my games rather than drinking a six pack by myself, honestly wouldn't it be great? I would even invite you to the after party, I promise.

Monday, October 15, 2012

The internet is a life force which connects all electronics.

I have been working extra hard lately, my level design is coming together, the level is taking shape and it's improving with each successive pass. This new game, which I'm sure many of you guessed, is a sequel to last year's Escape From Robot Doom. But unlike Escape From Robot Doom, this game is going to be good. No more feature barren experience, I'm going all the way, story, upgrades, vehicles, multiple weapons, awesome combat, outdoor and indoor levels, a true role playing experience.

Wednesday, October 10, 2012

Double Jump != Awesome

An apology from a game developer to a game player: I'm sorry for implementing a double jump feature, double jump is crap, from me to you, I'm sorry. Double Jump has been stricken from both sides of my video game equation. I'll post some new screen captures a little later.

Friday, October 5, 2012

WINDOWS-VITA-XBOX An unholy trinity of badassery.

People love value rather than disposable content, I'm not just talking games, I'm talking blog posts, tweets, facebook and everything else. I'm working on providing value, how crazy is that? It's mental, it's crazy, it's beyond the pale of all decent behavior, it's unfair for your competition, it's a negative influence upon the very nature of our very equitable society. Did I mention that I'm making a PC version of my new game? Bang! WINDOWS-VITA-XBOX An unholy trinity of badassery. Split screen cooperative campaign, N64 007 style split screen death match, maybe networked multiplayer to, maybe not - oh and vehicle, I haven't mentioned that before. Vehicle Machine Guns! Yes its, real, it's awesome, it's an all knowing all enslaving force of gaming. Some people say, that if you think positively that you won't catch every single traffic light, I say that what you think has no effect on traffic lights (you know who you are!), I say there is an external and an internal world and that they coexist, at least in my case, in an uneasy epic truce. True facts for a true reality. Back to work or gaming or some shit.

Tuesday, October 2, 2012

Retard Proof Games

"Welcome to the Tutorial, you absolutely have to do this, now I know you're not retarded, but everyone else is, so humor them, don't run too fast or fall behind and we'll be just fine. Now, prove to me that you can walk forward..."

Based on the complete and utter lack of ALL of the Chronodash video reviewers being unable to save their own game as they progress, I am retard proofing the new game, tutorials and checkpoints, get ready.

Monday, September 24, 2012

Do not mistake my composure for ease.

It's burning in my brain.

Thursday, September 20, 2012

A touch of evil goes a long long way...

Did I mention that I'm making a PS VITA version as well?

Saturday, September 15, 2012

Hell on Moon or Earth or Somewhere.

I'm building a better more masculine tomorrow... rememeber? Of course. Right. I made a new level style, I like it, Quake2 but not Quake2.

Friday, August 31, 2012

A perfect state of harmony.

I'm still homeless, I know, crazy huh, I have been homeless since January, but hey, just because you're homeless, it doesn't mean you're broke, however, I do happen to be broke. But, let all the quitters with regular jobs judge me all they want, I rest my case on the fact that I'm mortgage free, thirty years is a long time to pay for a wooden building, or in many cases a few rooms inside of a larger wooden building. Market manipulation theories aside, I'm pretty comfortable without a home and mortgage. Anyway, the point of this post is to announce that Total Commitment Games is a truly green, my computer is setup in the great outdoors, I have the wind in my hair and the sun on my face (and monitor screens). It's great, I'm living the dream, nature and game development were always meant to be together, in fact they co-exist in a state of perfect harmony, at a level far beyond any harmony imagined by the Asian mystics - a perfect state of harmony.

Tuesday, August 21, 2012

Testing Level Configurations

As a result of my endless quest to make games which don't suck, I'm spending endless time testing level configurations to find a style which doesn't suck. I blame consumers like you.

Thursday, August 16, 2012

Tutorial: Baked Light Maps for XNA using 3DS Max 2013

Special Note: For those of you without access to 3D Studio max, an educational version is available through autodesk which does not require a license provided through a school.

In this tutorial I will introduce how to bake a light map with 3D Studio Max 2013 (will also work with version 8 and up) and then render your baked light map and level geometry in XNA 4.0 using a custom HLSL shader.

The first step is of course to make your level, or making a test level. Here's mine. Notice the very simple level geometry, simple geometry significantly improves the quality of the light bake and the ease of unwrapping.

For the tutorial I exaggerated the lighting  for the sake of visual demonstration. My lights are a standard Omni and Target Spotlight, their intensity is set to 5.0, Decay is set to Inverse with Decay Start set at 10, I'm using Far Attenuation set to start at 30 and end at 80. I Enabled shadows, using a shadow map. 3D Studio Max can sometimes produces unacceptable poor shadows, especially on physically small scenes like mine, scroll down under "Shadow Map Params" and set the "Bias" to 0.01 and the Size to 1024.

Now to prepare the level for baking. The best and most reliable exports are ones with as few modifiers as possible. Collapse all of your stacks to Editable Poly. Now select whatever model you consider to be the most appropriate main model, in my case it's the ground, now attach all of the other models using Editable Poly's Attach function. When prompted with attach options, select "Match Material IDs to Material" and check "Condense Material and IDs". Now your level should be a single model and each previously separate segment will be an Selection Element.

Now generate your second UV Channel. Select the level model, now under the Modifier List, select Unwrap UVW. Change the Map Channel to 2. Annoyingly a Channel Change Warning Dialog will come up, select Abandon. Now Open the UV Editor, at the lower left of the Edit UVW window, select Face, it's the pink square in 2013.­ Now select all of your geometry in the Edit UVW window, now go up to the top of the window and select Mapping and then Flatten Mapping. A dialog will appear with flatten configuration options which are handy but the default settings are appropriate for our uses in this tutorial. In case you have changed yours, I have attached a screenshot of mine.

Click Ok.

The more complex your level gets the more inefficient texture usage becomes. More complex levels will require adjusting the Flatten options and sometimes hand placement of some UV island. Here is what my flatten looks like.

This now the second UV channel which will be used to bake the light map. You can close the window, you won't be using it again in this tutorial. Now collapse the Modifier Stack Again. To recap, your first UV Channel is for your Textures, your second UV Channel is for your light map and your model is now ready for baking.

However, before baking, we are going to export the level geometry first. For this tutorial, we're going to be using the FBX format, it's awkward and hard to use. Normally I would use kwxport X exporter, which exports the model as a Microsoft X format, however the developer has not updated the exporter to function with 3D Studio Max 2012 or 2013 at the time of writing, however, if you're using an older 3D Studio, say versions 8 to 2011, I highly suggest substituting the FBX format for the X format, his exporter is available at this address, http://www.kwxport.org/

Back to FBX instructions, which you can disregard if you're using kwxport. Honestly, from a game developer's perspective, the FBX exporter sucks, it sucks bad, it sucks so bad I wrote a custom exporter in MAXSCRIPT which is something in-itself worth avoiding. We won't be doing that for this tutorial because writing a MAXSCRIPT exporter and custom content importer for the XNA content pipeline is beyond the scope of this article.

Here is my export configuration, you must copy it exactly for the sake of producing usable content for this tutorial. Do not export Animation,  Cameras, or Lights. You must embed the media, otherwise you will need to edit texture file paths inside of the ASCII file, because for some reason unknown to me, the AUTODESK people saw fit to include a complete file path rather than a local file path, if you are going to be using multiple level segments AFTER completing this tutorial, you will need to replace the texture file path with the texture name and file extension to avoid embedding identical texture content. For example, "c:/users/steve/desktop/dualtextureturorial/metalfloor.png" with "metalfloor.png". But for now, if you Embed Media you can avoid editing the ASCII file. Click okay, and you will likely be presented with an error about turned edges or some related issue, ignore it.

Now to Render your light map. You may use whatever renderer you choose, but I will be using Mental Ray in order to generate an Ambient Occlusion Map.
I prefer that some optional ambient lighting be included in my light map, but of course this part is entirely up to you.

Now to actually bake the light map. Select your model and open the Render to Texture Dialog, this can be done from the Rendering drop down or by pressing the zero key. Don't forget to set your Output path. Set your Mapping Coordinates to "Use Existing Channel", set the Channel to "2" which corresponds to your previously covered UV unwrap.

Scroll down to output and press the "Add..." button. The Add Texture Element dialog screen will appear, select "LightingMap". If you are using Mental Ray you will also have a map option for "Ambient Occlusion (MR)", select that as well, and then click "Add Elements"

Under "Selected Element Common Settings", make sure both your maps are enabled and change both their width and height to 1024, this corresponds to the baked texture's dimensions. If you are also generating an Ambient Occlusion map, under "Selected Element Unique Settings", enter a Max Distance of 10.

Now under baked material, select "Save Source (Create Shell)" and "Duplicate Source to Baked", and slightly further down, also check "Render to Files Only" and "Keep Source Materials", this is essential, the render to texture can make a huge mess of your model and it can be very difficult and time consuming to recover the correct materials.

Now you're ready to render. Select Render at the bottom of the Render To Texture dialog. Here is what my Render window looks like, however, this is NOT what the final light map will look like.

Now, navigate to your output directory.

You will have two images. A lighting map which includes your baked lighting render and the second image will be your Ambient Occlusion render if you earlier chose to bake one. If you did not choose to make an Ambient Occlusion map, your lighting map is ready to go and you can skip this next step. If you did make an Ambient Occlusion map, then I will show you how to combine the two using Paint Dot Net.

Here are my two maps.

Open the lighting map in paint dot net, now drag the ambient occlusion map from windows explorer onto the light map. The Drag and Drop dialog will appear, select "Add Layer". Now open the layers window, double click the Ambient Occlusion layer and the Layer Properties dialog will open, change the blending mode to "multiply", click "OK", now duplicate the Ambient Occlusion layer if you want the Ambient Occlusion to really stand out, I duplicated mine three times to exaggerate the effect for this tutorial. Now save your image. Here is my Final Light Map.

Now Open Up Visual Studio 2010, create a new project XNA Game Studio 4.0 Windows Project.

First, add your level FBX and light map texture to the content project created by the Windows Project template.

XNA 4.0 includes "DualTextureEffect" for the model under Default Effect in the Content Processor, which works, which you must use to accomplish this effect on the windows 7 phone (because custom shaders are disabled), however this tutorial is for Desktop Windows and the XBOX 360 so we will be writing our own custom shader, so leave these settings alone.

Right Click on your Content Project and click add New Item, and then select "Effect File", name it "dualtextureeffect.fx" and then click add. The default shader only requires a few modifications to be acceptable.

Add two textures and two texture samplers. Copy and paste the following under the "TODO: Add Effect Parameters"

texture colorMapTexture;
texture lightMapTexture;

sampler2D lightMap = sampler_state
Texture = ;
MagFilter = Anisotropic;
MinFilter = Anisotropic;
MipFilter = Linear;
MaxAnisotropy = 16;

sampler2D colorMap = sampler_state
Texture = ;
MagFilter = Anisotropic;
MinFilter = Anisotropic;
MipFilter = Linear;
MaxAnisotropy = 16;

Now, scroll down to VertexShaderInput, add the UV channels to the vertex declarations, which correspond to your texture and light map channels you created in 3D Studio Max.

float2 TextureCoordinate : TEXCOORD0;
float2 LightMapCoordinate : TEXCOORD1;

Now, scroll down a bit further to VertexShaderOutput, and add the same two channels.

float2 TextureCoordinate : TEXCOORD0;
float2 LightMapCoordinate : TEXCOORD1;

Now, move a little further down to the VertexShaderOutput function. Add some code to copy the vertex channels from the VertexShaderInput to the VertexShaderOutput.

output.TextureCoordinate = input.TextureCoordinate;
output.LightMapCoordinate = input.LightMapCoordinate;

Now to update the PixelShaderFunction. Sample the sample and combine the regular textures with the light map.

Replace "return float4(1,0,0,1)" with the following.

return tex2D(colorMap, input.TextureCoordinate) * tex2D(lightMap, input.LightMapCoordinate);

Now the shader is nearly done, to avoid any mistakes we are also going to set some render states. Under technique Technique1 reads "Pass1" and then a todo about adding render states. Add the following before the vertexshader and pixelshader compile instructions:


Okay, our shader is done, and now all of our content is done. Now it's time to write some XNA code, big win time.

Now add a model, texture and effect to your Game1 object declarations.

//our content
Model levelGeometry;
Texture2D lightmap;
Effect myEffect;

//our camera
Matrix view;
Matrix projection;
float rotation;
Vector3 cameraPosition;

I know, I can hardly believe we are finally writing XNA C# code.

Go to the LoadContent function, and load your content. Your file names likely vary, substitute my filenames for your own.

// TODO: use this.Content to load your game content here
levelGeometry = Content.Load<Model>("levelgeo");
lightmap = Content.Load<Texture2D>("lightmap");
myEffect = Content.Load<Effect>("dualtextureeffect");

//setup our projection
projection = Matrix.CreatePerspectiveFieldOfView(MathHelper.PiOver4, (float)graphics.PreferredBackBufferWidth / graphics.PreferredBackBufferHeight, .1f, 1000);

Move to the Update function. We are setting our camera up to orbit the level geometry. Add the following.

// TODO: Add your update logic here
rotation += gameTime.ElapsedGameTime.Milliseconds * 0.001f;

cameraPosition = new Vector3((float)Math.Sin(rotation) * 200, 175.0f, -    (float)Math.Cos(rotation) * 200);

view = Matrix.CreateLookAt(cameraPosition, new Vector3(0, 0, 0), Vector3.Up);

Time to render! Finally!

First make a new function with a void return type, call it "DrawDualTextureModel", put a xna model object in for its argument.

private void DrawDualTextureModel(Model m)

Now, to make sure you're objects are all rendering in the correct location, you need to process the transformations included in the export.

//set mesh transformations
Matrix[] transforms = new Matrix[m.Bones.Count];

Now loop through each meshpart contained within each mesh contained in the model object.

//Now, for the rendering code loop. Loop through each mesh contained within the model object.
foreach (ModelMesh mesh in m.Meshes)
     //loop through each meshpart contained within each mesh
     foreach (ModelMeshPart meshpart in mesh.MeshParts)
          //Rendering code goes here!

Now, before the super coders get on my case, I'm aware that there are a lot of better ways to do the following section, mostly with custom content processors, but like I said above, these types of solutions are outside of the scope of this tutorial. We are going to input shader parameters the regular way, but because we are using a custom shader with a dual texture effect we need to cast each meshpart effect created by the content manager into a basic effect in order to gain access to the textures which were imported with the model. Insert the following code into the innermost section of the loop.

//Set our shader parameters
myEffect.CurrentTechnique = myEffect.Techniques["Technique1"];
//really tacky, I know. Casting to a basic effect is essential for texture application without a custom processor
BasicEffect tmpBEffect = (BasicEffect)meshpart.Effect;
//now apply!

Okay, now we are finally ready to draw. First set the vertex and index buffers and then make a draw indexed primitives call. Inside of the innermost section of the loop immediately under the myEffect.CurrentTechnique.Passes[0].Apply();

//set our vertex and index buffers
GraphicsDevice.Indices = meshpart.IndexBuffer;

//render our geometry
GraphicsDevice.DrawIndexedPrimitives(PrimitiveType.TriangleList, meshpart.VertexOffset, 0, meshpart.NumVertices, meshpart.StartIndex, meshpart.PrimitiveCount);

Now move to the XNA template's draw function and insert our dual texture draw call.

// TODO: Add your drawing code here

Now hit run, yours should look like this. Here is the final image. If it doesn't, you did something wrong, feel free to comment.

Punishing Heat

I HATE the heat, it's awful, it makes me uncomfortable, irritable, unable to focus, heat is a regular witches brew of shit. I haven't gotten anything done in the last week, it's been ninety degrees in the house, and my glitchy freezy crashy computer is only good for as a heater when it gets hot. Anyway, I started on a big level, it's huge actually, I need to make some props, it's too bare.

Wednesday, August 8, 2012

No more limp dick games.

It hit me this morning, a game without guns isn't a game at all, it's something very different than a game. So... I added cooperative support, split screen death match and of course guns. No split screen video yet, I only have one wired controller.

Level Groove

I'm working on developing a unified design style for my levels. Here are some more screen shots.

Tuesday, August 7, 2012

Full, Half and No, Retard Modes

Easy = Full Retard Mode
Medium = Half Retard Mode
Hard = No Retard Mode

Those are the skill levels. Deal with it. Which are you?

I made a 60fps video capture for you. But youtube resampled it to 30, so enjoy. At least it's HD huh.

Monday, August 6, 2012


Alright, I'm gonna write a post mortem (this isn't it), Chronodash taught some lessons, first among them is that every game needs a FULL RETARD MODE. True Story, evidenced by the video reviewers complaining about the lack of a save feature while reading the help screen which clearly displays a single button press save feature. So, my Chronodash do-over is going to be RE-TARD PROOF, I sware.

Saturday, July 14, 2012

Be a hero, buy Chronodash now.

Help feed awesome game developers, buy and beat the most diabolical first person platformer ever built.
Be a hero, buy Chronodash now!

Friday, July 13, 2012

I suppose it's a mile stone?

Escape From Robot Doom recently achieved more than 10,000 trial downloads.

Chronodash will be available for purchase on xblig sometime in the next few days.

Monday, June 11, 2012

Thursday, May 31, 2012


Challenge your skills in the most diabolical first person platformer ever made.

Wednesday, May 30, 2012

Bronze Power Listener

I really don't think men should ever sing, there is something wrong with it, I can't put my finger on it, but there is just something that rubs in the wrong way. Men singing, haha silly. Now women singing, that's different, there is something special to it, something soothing and satisfying, something intriguing. Zune gave me a "badge", I guess it's like an achievement, I'm a "Bronze Power Listener", sounds like a pretty important huh. Yep. The game is nearly here, I worked out some glitches, some knots, and some shit, I have some sound effects to do and that's it. Oh, Escape From Robot Doom (XBOX 360 version) has been pirated and is available a number websites now, I big time now.

Friday, May 25, 2012

Thursday, May 24, 2012

I love Orange!

I have never lived anywhere with wallpaper before... I wonder if it's because I'm poor or low class or both or I don't know what I'm talking about or if wallpaper is old fashioned or what. It doesn't matter. Forget I said it. I'm living the dream the hard way, that's gotta be special someone right? My fix list is getting shorter by the minute because I'm crossing off shit I don't want to fix. I said it, it's true, it's out there, public record or internet record or something.

Monday, May 21, 2012

Burning up my mind.

Windows Live Movie Maker sucks, it's crashy, unreliable and worst of all, it's Macintoshy. I spent yesterday attempting to make it work, I mauled my drivers, I mauled my video condexs, I banged my head on the keyboard. I gave up. I checked out some open source video editors, not so great. Then it occurred to me to check out old versions of Windows Movie Maker. Bang! Problem solved, Windows Movie Maker 6.0 rocks, easy to use and only crashed once. Here is my trial run at a teaser.

Friday, May 18, 2012

My Fan Base

When I was younger than I am now, I really liked stalker jokes, I thought they were hilarious, jaw droppers, and dead baby jokes, those were good to. But no so much any more, it's not that they are too crude or tasteless, it's that they are too simple, I realized I just like clever jokes. Speaking of clever jokes, I completed my first run through of the recently finished new game, pretty awesome stuff, I think this is my first game I don't actually mind playing, true story. I have spent approximately fifty (or maybe less?) hours play testing and revising just the levels of this game, and honestly, I didn't mind it, I found it challenging and rewarding, I think that three dimensional platforming is a fantastic game mechanic with a lot of growth potential. Games like the new Prince of Persia and Bionic Commando games don't scratch the surface of what this mechanic has to offer.

If Escape From Robot Doom had sold ten times as many copies I would have made as much money as if I had been working at McDonnald's. I have stronger, better, more masculine hopes for this game, and I like exploiting things, if my new game sells better than Robot Doom, you're going to have to endure through three or four sequels, prequels, gold and platinum and remastered editions. I know I have a fan base out there, posting articles and shit talking six months after Escape From Robot Doom came out, you know who you are, and this time I want my review you keep threatening. Or Else.

Thursday, May 17, 2012

Death By Molten Robot!

I heard that Death by Lava hurts, probably just hand wringer talk, maybe. Lava can't be that bad right? Molten rock? Molten Robot? Nah. Maybe if you caught fire first? Whatever. I'm busy busy, not much left, only a little bit of bondo and the game will be all ready.

Tuesday, May 15, 2012

Evil speaks to me...

I have my finger on the trigger and my mind is made up... wait, wrong blog.

Yeah Yeah. Still working. I'm spackling over some rough spots, it will be fine, no worries.