Gaming Your Way

May contain nuts.

Week1

You've got to do a blog post on leap day haven't you.

Work started on new game a week ago, and somehow I've managed to get a fair bit done. Want to find out what ? Sure you do, because if I ever found out you weren't interested in our games I'd start hurting myself.

Let's start with a screen grab, it's easier to talk around that.

It's a little cut off as it's a big ol' screen, it's not that wonky in real life.

So as you can see it's a sequel to DN8. In saying that, it's going to be more of a 1.5 than a full blown sequel, a directors cut where we give it a visual overhaul and fix all the things which needed fixing.

The major thing with this bad boy is that we're going the stage3D route. And just to complicate matters, its using 2 engines. The background ( So the skybox you see, the planet with nice bump mapping and specular lighting ) is powered by away3D. It's really great to use, I've only ever used the lite version before so it's not as if I knew what I was doing, but I managed to get one planet and the skybox up and running in a couple of hours.

The downside to away3D is that its 2D support is limited, and for particles the general consensus is to use something like Flint. Now Flint produces great results, but packages like that are all singing and all dancing, which means an overhead which you can't really afford in a game ( It's like say Tweenlite, knock the shit out of that on the title screen, but in-game it's a little too costly ). I've being eyeing up ND2D for a while as it seems the best of the 2D GPU powered engines ( Friends who have tried Starling say its a little bit bloated as it's trying to be very transparent and displaylist like. Just to point out, I'm not slagging it or Flint off, I'm just going on hearsay as I'm far too lazy to do lots of tests to find things out ).

Now, how to add ND2D running on top of away3D ? Well I noticed you can have multiple stage3D indexes, I'll drop away3D at [0], ND2D at [1], set the transparency and swallow a little extra overhead as well, shit, we're on the GPU baby, everything is free and runs like liquid gold. Ah. the different stage3D "levels" don't have a transparency setting. Ah.

Plan B, download the away3D source ( I was just using the swc ), shove ND2D into the same package, find the render call in the away3D code and after that call the ND2D mainloop. Fairly simple. Hang on, it's displaying my simple particle test, but for some reason it's above the skybox, but below the planets. That's so close to working I had to pursue it, as if I could get it working we'd be laughing. A whole day of swearing and looking through both engines and I was having no joy. It was making me want to kill.

It takes a big man to admit when he's wrong. I'm far from being a big man, so I just posted on the ND2D forums asking for help. Lars is as good as gold and pointed me in the right direction, one changed line later and it works.

So in the first week we've got the look & feel nailed ( That was actually day 1, a whole day just to sort out a logo, a font and a rollOver style ), got a lovely looking background rotating around, most of the flow from title screen to actual game, the main player sprite moving and shooting ( The bullets using batched calls ), the music from DN8 as a placeholder playing a random mix each time and... I think that's it. I couldn't be more pleased with how its going, I don't have the first clue about 3D so to bluff my way through like this makes me happy.

Should we come back in a week to see if I'm still loving this ? Yes, lets.

Squize.

49,004,030 thanks, and counting

Part pimp, part thank you.

The lovely Armor and Mousebreaker are both hosting Outpost:Haven now, and we'd like to thank both Dan and Alan for making the process so easy.

We'd also like to thank everyone whose taken the time to play, vote and review the game ( Plus all the pm's and emails about it ). The feedback is going to be invaluable for O2, not to mention Outpost:Swarm ( But more on that soon ).

Short and sweet.

Squize.

PS. 49,004,030 ? That's how many aliens you guys have killed so far, that's more than every person in Spain killing one each.

5 to life

It's our birthday!

GYW has been going for 5 years today. I'd like to say we do it all for you guys, but that would be a lie. We do it because we love this stuff. We've had so many highs and lows and we've loved having you all along for the ride.

We're proud of many of the games we've done ( Not all of them ) and we take a pride in the openness and honesty of the blog, even if sometimes we've perhaps said things that we shouldn't have.

But we're not hear just to reflect, we've had a great 5 years and we're looking forward to the next 5, we are as excited about the future as we were five years ago today.

Squize and Olli.

PS. A massive thanks to RobotJam for our beautiful cake. Well, it was beautiful until we helped ourselves to some.

An interview with Jean-Philippe

We recently discovered far and away the best debug / profile tool for Flash devs, "TheMiner". It's just a pity we found it so late into Outposts development, but it still helped us remove various mouse listeners that I'd missed ( I'm really badly anal about killing those, and I was shocked how many I'd actually missed ). It's now an essential part of our toolkit, and I was lucky enough to ask the author, Jean-Philippe Auclair, some questions about it.
 

Hi Jean-Philippe, can you give us a quick run down on your history with Flash.

I started coding as3 about 4 years ago. Before that I was a C++ Software Engineer on a Nintendo DS 2D/3D game engine.
When I think about this, it seams like it all started last week. 
During the last 4 years, Flash changed so much that it's really hard to follow the pace, even for a guy who follow a LOT of RSS feed and twitter.

So I started Flash 4 years ago as an AI developper, leading a game project at Frima Studio in partnership with a local university.
Then I became Lead Software Architect on Frima studio MMO game engine, doing supervision of npth frontend and backend architecture.
During this time I also started a technical blog about Flash for hardcore developer. 
By always trying to push the bundaries of flash, I found out a lot of trick to optimize flash content and get the most out of it.
Because of this, I have been selected to participate to molehill pre-release program very early.
At this point, frima studio decided to invest a lot in this new promizing technologie and I have been working on Molehill for almost 18 months now.
We were choosen and featured by Adobe at Max 2010 with ZombieTycoon in flash Molehill, and MAX 2011 with Neema Project. 
Using this new knowlegde, I gived multiple session for frima about Flash3D at Flash Gamming summit 2010, MAX 11, GDC Online 2011 and Dig 2011.


I think every game dev plans to do something like this, but no one ever gets round to it. How did you find the motivation to actually pursue it ?

Well.. It all started with a blog article I made: http://jpauclair.net/mm-cfg-secrets/
In this post, I'm talking about a lot of undocumented features of flash using the mm.cfg file.
One of the feature is "PreloadSWF". A nice way to launch a flash application before the main SWF is being executed.
So I started exploring this, and after a few articles, it became clear that "something" could be done with this.
I opened a google code repository, and it became FlashPreloadProfiler. A tool that can be use to track some data exposed by flash.
After a months of part-time developement, there was already tons of cool features, and special algorithm to get the most of the exposed protocols, and even more! 

Being able to dig deep inside flash, and make it easy for people to use it with this software and my blog was what kept me going.

Recently, I decided to start making something more serious out of this, without changing the way I feel about it. 
This is when FlashPreloadProfiler died, and TheMiner was born. A complete solution with a lot of features added, with proper website, bugbase, forums, etc.


There are lots of cool things in there, was there anything which you thought "This will never work" and then surprised yourself ?
 
Many of the features are not "out of the box". I had to spend a LOT of time to finaly come up with solutions.
Getting the Stack of some listeners. Merging the instanciation of object with function call traces. Having urls of some loaders. etc. 

Any major technical hurdles you found, and how did you get around them ?

It's hard for me to say "it can't work"... there is always a way.. 
While doing this profiler, some of the things I tried never got an answer.

So even today, it's really hard to say if I should continue to look for something, or I should find something else to look at!
 

What future plans have you got for TheMiner ( That you can tell us about ) ?

Big plans!

I keep a list of what will be added next, what features should be re-worked, etc.
The problem is, each time I check one of the Item of that list, 2 or 3 items have been added to it, so the list is expanding!

We also have a bugbase to support people working with it. 

And finaly, TheMiner will soon have a new brother. But I won't say to much about this for now!
 

What's the response been to it so far ?

It just started, but it goes better that I was expecting it.

I was thinking "something like this take time to get known". But because FlashPreloadProfiler was there for some time now, and hardcore developer generally hang around my blog, the wave was big enought to get known pretty fast.
The free non-commercial version has already been downloaded multiple hundred times.
And since there was already thousands of developpers using FlashPreloadProfiler, the Pro version of TheMiner became a necessity for a lot of people using it for commercial project. So it's going pretty well also.

The community also responded very well by doing translation in multiple languages.
Right now, TheMiner is available in English, Spanish, French, Dutch, Russian, Hindi, Chinese (traditional and simplified) and Turc

FlashPreloadProfiler has been a great adventure over the last two years.

TheMiner is just the beginning of something even greater.

I'd really like to thanks everybody that followed me during this time, and those who helped make what it became. Thank you.

www.sociodox.com/theminer

@jpauclair

I am now an official Miner

And I'd really like to thank Jean-Philippe for his time, and I honestly can't recommend theMiner enough, it's one of the few tools we can recommend without a moments hesitation. The free version isn't crippled in anyway, you've literally got nothing to lose by trying it.

Squize.

2011 in words and pictures

Time for our annual review of the things we did, the things we'd say we'd do and didn't and other post filler.

Where should we start ?

Jan:

4 years old, and what a way to start the year, with a big old Facebook RPG no less.

Knight's Quest launched, although I think we worked on it for another couple of months. We made it all procedural thinking how clever we where that it would reduce maintenance costs, and on the first day of release someone reported a bug on level 71. In all the testing we'd never got that far, he must have played for hours and hours straight. Dear sweet mental players.

We also did an interview with our mate Ryan about his book "Getting your Flash game sponsored" which was fun, and we were asked to judge a comp for the first time. Funnily enough, the last time too. Odd that.

Feb:

This was a dev type month on the blog, with posts about DN8's development and some background on how we made the levels in Knight's Quest.

Destroy More Cars also launched. What's that ? Yeah, only 10 million plays last time I looked, sorry ? Yes you're right I'd forgotten the first one is in Spil's all time top 10 with 14 million + plays. I'm only giving it large like that as I find it funny that our biggest hits in terms of plays are games I really can't stand. The 2nd one was better in lots of ways, but not a game I'd ever play.

March:

The whole month just going on and on about DN8. Which brings us to...

April:

DN8 launched, did really well critically at newgrounds ( Who were our sexy sponsor ), so-so everywhere else ( It got some nice reviews though, this one has a lovely screen shot, plus it came 2nd in the bytejacker game of the week, or was it day ? Anyway 2nd out of 3 counts as a win in some way ).

I played it the other day, and it's still quite nice. Pleased with that one.

May:

Quiet month really, some of our friends in China tried hacking the blog ( Why for fucks sake ? We don't even read the crap we post on here, whose going to read your l33t hacx0r message ? ), pimped our friend Matthew's new game, posted some links and wrote about a failed prototype.

June:

Olli posted up a couple of prototype games, one which is still sitting on his HD, the other out and about and coming further down this list.

The rest of the month was talk about the development of Outpost. What an insanely long development time that game had, but there were reasons why.

July:

I wrote a pissy little rant, which made me feel better if nothing else.

Olli wrote some notes about how Nuts&Bolts worked, and also pumped out a teaser for it.

We finished the month with the long overdue DN8 postmortem.

Aug:

A painfully quiet month. I was working on two client projects and Outpost and realised I was going to run out of money before any were done. That meant knocking out a quick game, which turned out to be Orbz.

Quite a fun little game, very throw away. The plan backfired, we couldn't give it away for sponsorship. In the end I decided to use it as our Facebook test game. Long story short, it is on FB, but it uses the AS3 FB toolkit, which for unknown reasons uses a pop-up for the confirmation page ( You know the one where you agree to let some strange app at all your private info forever ? ). The thing with pop-ups is that pretty much everyone blocks them. I lost all interest in what wasn't really an interesting project to begin with, so it's on FB just never been pimped. I will go back to it one day when I do another Facebook project, but it's a hellish horrible mess ( The API, not the game ).

Sept:

Virtually nothing really, we were both at a low ebb doing things we didn't really want to do to earn the cash we needed to do the things we wanted to.

Oct:

Slightly better month, with the main thing being the launch of...

Nuts&Bolts went live, and what a great little puzzler that was.

I also had a quick play with stage3D, nothing too special, but if you ever played with Papervision it was a world apart.

Nov:

The blog had a long overdue shake up with Olli performing the massive / painful / massive task of moving the blog over to new software. We were getting to the point with the old software that just posting to the blog was a huge chore, and it just killed our post rate as you don't need to be battling software just to post some words.

One of the projects I worked on in the Summer went live, Beyblades. I didn't have a great deal to do with it, didn't touch the gameplay, and that was kinda nice. The other game I worked on was a manga style interactive comic. I really don't even know if it's live, as a project I take zero pride in it. Maybe I'll post up how I did the xml structure as that may be quite handy, but a pure sell my soul for money project. Awful.

Also I posted a quick tutorial about object pooling. I don't think code / tutorial posts go down well on here, you kids just seem to like reading us cussing and stuff. You cunts.

Dec:

This year has flown hasn't it.

Olli posted some neat theory about random levels and a grab from his current game.

We bigged up Home Sheep Home 2, we like to help the little struggling indie games, hopefully we helped it's traffic a little ( Re-read the word "Little" again. About 400 people have started playing it during that time, it's both insane and well deserved how big a hit it is ).

I posted up the now annual drinking binge known as the GYW Christmas party, and did a quick test with Unity's Flash exporter.

Oh, and a little game Lux and I were working on went live. Don't know if I've mentioned it ?

Outpost went live yesterday, and so far has had a fantastic response from the beautiful NG community, which fills my hart with happy.

And that was 2011. Not as productive as we would have liked, but we can always say that ( And always seem to ). Outpost is the very best thing I've ever done and that's not a bad thing to be able to say.

As always we'd like to thank you dear reader, if it wasn't for you we'd still be writing this stuff, but quite possible in shit on a toilet wall. You're our outlet and our muse, and for that I've got to thank you.

See you in the new year, hope you have a great one,

Squize.

Outpost:Haven

Play it here.

I'd just like to thank Lux for all the hard work he put into this, Matt for the stunning music and the vast number of people who helped shape the game with their constant support and feedback, for which I'll always be grateful.

Enjoy the terror.

Squize.

Unity Flash export test

Grabbed the preview build of Unity 3.5 yesterday just to have an ultra quick play. I wrote a simple plasma cube way back ( You'll see how long ago when you see the source below ) so that was the obvious choice to try and export, as I'm stilling suffering the Christmas lazy hangover and don't really have much work in me.

Here's the flash version ( 2.2 meg ) Plasma effect ( Usual Stage3D stuff applies, you'll need a compatible card etc. )

And just for comparison, the native Unity one ( 64k ! ) Unity Plasma effect

You'll see some corruption on the Flash version, which I guess is to be almost expected as it's a preview build ( And also Stage3D in itself is still very new ). I still find it mental impressive that it works at all.

If you fancy playing with it yourself, drag a cube onto the stage and attach this script.

/*-----------------------------------------------------------------------------
@method: Plasma
@author: Squize / www.gamingyourway.com
@version: 4/4/09
-----------------------------------------------------------------------------*/
#pragma strict
public var width:int=128;
public var height:int=128;
	
private var texture:Texture2D;
private var colourTable:Array;
private var activePixelsStorage:Array;
private var sinOffset:Number;
private var paletteShiftX:Number;
private var paletteShiftY:Number;
private var colourTableResolution:int=2048;

//---------------------------------------------------------------------------------------
// Start method
//---------------------------------------------------------------------------------------
function Start(){
	texture=new Texture2D(width,height);
	renderer.material.mainTexture = texture;
	renderer.material.mainTexture.filterMode = FilterMode.Bilinear;
	renderer.material.mainTexture.anisoLevel = 3;
	renderer.material.shader=Shader.Find("Particles/Additive (Soft)");

	createColourTable();

//Create our pixel instances
	activePixelsStorage=new Array();
	var pixelObj:PlasmaPixel;
	
	var j:int=-1;
	var k:int;
	while(++j!=width){
		k=-1;
		while(++k!=height){
			pixelObj=new PlasmaPixel();
			pixelObj.cX=pixelObj.xPos=j;
			pixelObj.cY=pixelObj.yPos=k;

			var xDist:int=width-pixelObj.cX;
			var yDist:int=height-pixelObj.cY;

			var distance:Number=Mathf.Round((Mathf.Sqrt((xDist*xDist)+(yDist*yDist))/2));
			var distX:Number=256 * Mathf.Sin(distance/8);
			var distY:Number=256 * Mathf.Cos(distance/8);

			pixelObj.jointDist=distX+distY;
			activePixelsStorage.push(pixelObj);
		}
	}	

	sinOffset=0;
}

//---------------------------------------------------------------------------------------
// Update method
//---------------------------------------------------------------------------------------
function Update(){
	sinOffset++;
	paletteShiftX = sinOffset;
	paletteShiftY = sinOffset*(transform.position.z)*2;
	
	var pixelObj:PlasmaPixel;
	var cnt:int=-1;
	var length:int=activePixelsStorage.length;

	while(++cnt!=length){
		pixelObj=activePixelsStorage[cnt];
		pixelObj.cX=pixelObj.xPos+paletteShiftX;
		pixelObj.cY=pixelObj.yPos+paletteShiftY;
		
		pixelObj.offset=(Mathf.Cos(pixelObj.cX/16) + Mathf.Sin(pixelObj.cY/32))*256 + pixelObj.jointDist;

		if(pixelObj.offset<0){			
			pixelObj.offset+=colourTableResolution;
		}

		texture.SetPixel (pixelObj.xPos, pixelObj.yPos,colourTable[pixelObj.offset]);
	}
	
// Apply all SetPixel calls
	texture.Apply(false);
	
	transform.Rotate(Vector3.right * (Time.deltaTime*30));
	transform.Rotate(Vector3.up * (-Time.deltaTime*23));
	transform.Rotate(Vector3.forward * (-Time.deltaTime*3));
	
}

//---------------------------------------------------------------------------------------
// Private
//---------------------------------------------------------------------------------------
private function createColourTable(){
	colourTable=new Array();
	var cnt:int=-1;
	var col:Color;
	var offset:float=3.1415;

	while(++cnt!=256*4){
		col=new Color();
		col.a=1;
		col.r = (128 + 128 * Mathf.Sin(offset * cnt / 32))/255;
		col.g = (128 + 128 * Mathf.Sin(offset * cnt / 64))/255;
		col.b = (128 + 128 * Mathf.Sin(offset * cnt / 128))/255;
		colourTable.push(col);
		colourTable.push(col);
		colourTable.push(col);
		colourTable.push(col);
	}
}

//---------------------------------------------------------------------------------------
// Pixel class
//---------------------------------------------------------------------------------------
class PlasmaPixel{
	var xPos:int;
	var yPos:int;

	var cX:Number;
	var cY:Number;
	
	var jointDist:Number;	
	var offset:Number;
};

And that's all there is to it. It could be optimised a lot, but look how old that code is, I think I'm allowed a pass for that.

If you do anything nice with it please drop a link in the comments.

Squize.

Merry Christmas kids

On behalf of us both we wish you a very Merry Christmas. Make the most of it, 'cause I had a terrible dream about you involving a white van. He's not stopping. Then I see your eyes just staring out into the forever...

Anyway, have a good one, and it was only a dream, possibly nothing to worry about.

x