<?xml version="1.0" encoding="ISO-8859-1"?>
<rdf:RDF
	xmlns="http://purl.org/rss/1.0/"
	xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
	xmlns:dc="http://purl.org/dc/elements/1.1/">
	<channel rdf:about="http://feeds.garagegames.com/rss/blogs/developer/22864/">
		<title>Blog for Tom Bampton at GarageGames.com</title>
		<description>Blog feeds for Gamers and Developers in the GarageGames community.</description>
		<link>http://www.garagegames.com/</link>
		<image rdf:resource="http://www.garagegames.com/images/GarageGames_logo_small_w.gif" />
		<dc:date>2008-10-13T15:54:16+00:00</dc:date>
		<items>
			<rdf:Seq>
				<rdf:li rdf:resource="http://www.garagegames.com/blogs/22864/13423"/>
				<rdf:li rdf:resource="http://www.garagegames.com/blogs/22864/13300"/>
				<rdf:li rdf:resource="http://www.garagegames.com/blogs/22864/13040"/>
				<rdf:li rdf:resource="http://www.garagegames.com/blogs/22864/11648"/>
				<rdf:li rdf:resource="http://www.garagegames.com/blogs/22864/11540"/>
				<rdf:li rdf:resource="http://www.garagegames.com/blogs/22864/11495"/>
				<rdf:li rdf:resource="http://www.garagegames.com/blogs/22864/11359"/>
				<rdf:li rdf:resource="http://www.garagegames.com/blogs/22864/11225"/>
				<rdf:li rdf:resource="http://www.garagegames.com/blogs/22864/11190"/>
				<rdf:li rdf:resource="http://www.garagegames.com/blogs/22864/11101"/>
			</rdf:Seq>
		</items>
	</channel>
	<item rdf:about="http://www.garagegames.com/blogs/22864/13423">
		<dc:format>text/html</dc:format>
		<dc:date>2007-08-20T03:06:35+00:00</dc:date>
		<dc:creator>Tom Bampton</dc:creator>
		<title>GID23 and NPC Editor</title>
		<link>http://www.garagegames.com/blogs/22864/13423</link>
		<description>Last weekend was GID23. Gary Preston and I teamed up again to produce a sequel to the old Teaminator game from GID 3.5, called Teaminator: Brew Isles.&lt;br&gt;&lt;br&gt;As a base we used a heavily modified TGE 1.5 codebase that Ken Holst and I were working on over Christmas. The intent back then was to make Teaminator 2, but due to time and burnout it never got finished. It did, however, provide a ton of pretty solid tech to build upon.&lt;br&gt;&lt;br&gt;This .plan is not about last weekend, so to read (a little) more about Brew Isles, and to download the finished game, have a look at our &lt;a href='http://www.gameinaday.net/viewtopic.php?t=96' target=_blank&gt;progress thread over on the Game in a Day forums&lt;/a&gt;.&lt;br&gt;&lt;br&gt;Whilst on the whole the codebase was pretty solid, the weakest area by far was NPCs. We had most of what we needed for them, but it had not yet been battle tested. GID23 provided said battle testing, and this weekend has been spent fixing the issues. Gary has been working on improving the dialogue tree code, whilst I've been making an NPC editor. The former is probably more important, but the latter makes for better screenshots ;)&lt;br&gt;&lt;br&gt;&lt;b&gt;Stupid Beard the Stupid Pirate, from Brew Isles&lt;/b&gt;&lt;br&gt;&lt;br&gt;&lt;img src='http://private.burntwasp.net/~tomb/npced/stupidBeard.jpg'  alt=&quot;&quot;&gt;&lt;br&gt;&lt;br&gt;&lt;b&gt;Editing Stupid Beard the Stupid Pirate&lt;/b&gt;&lt;br&gt;&lt;br&gt;&lt;img src='http://private.burntwasp.net/~tomb/npced/stupidBeard-edited.jpg'  alt=&quot;&quot;&gt;&lt;br&gt;&lt;br&gt;&lt;b&gt;The Blind Lookout, from Brew Isles&lt;/b&gt;&lt;br&gt;&lt;br&gt;&lt;img src='http://private.burntwasp.net/~tomb/npced/blindLookout.jpg'  alt=&quot;&quot;&gt;&lt;br&gt;&lt;br&gt;The character art is from Frogames' &lt;a href='http://frogames.net/shop/index.php?main_page=product_info&amp;amp;products_id=4&amp;amp;zenid=c9d4fd0e1ae9be53dcf9ef27f3d24e58' target=_blank&gt;CS:Warriors and Commoners&lt;/a&gt; pack. The reason that the NPC editor was not only possible but easily implemented was due in no small part to Christophe's extremely well thought out artwork. Whilst working on Brew Isles, we found it to provide pretty much everything we needed on the art and animation side of NPCs. Actually, &amp;quot;NPC&amp;quot; is a bit of a misnomer as we are using it for the player as well. The &amp;quot;NPC&amp;quot; editor will also be repurposed as a player avatar customizer for the actual game.</description>
	</item>
	<item rdf:about="http://www.garagegames.com/blogs/22864/13300">
		<dc:format>text/html</dc:format>
		<dc:date>2007-07-25T19:19:28+00:00</dc:date>
		<dc:creator>Tom Bampton</dc:creator>
		<title>Fun with Lua</title>
		<link>http://www.garagegames.com/blogs/22864/13300</link>
		<description>Lua is a great little language. It's small and simple, yet powerful and flexible when you know how to use it. Embedding a Lua interpreter into an arbitrary application is easy, if requiring a little code verbosity.&lt;br&gt;&lt;br&gt;There are many existing ways to expose parts of an application to Lua. However, most of them involve either writing a lot of extra code or running some external pre-processor to generate the extra code for you. For me, that is way too much extra work and additional points of failure.&lt;br&gt;&lt;br&gt;Of course, if you wan't to expose C++ code to script, then it obviously requires some additional code that has to be written somehow. Whilst the external pre-processor route removes most of the impetus from the programmer, it requires another step in compilation and feels somewhat error prone. There are also meta programming libraries which do much the same thing, but make the C++ compiler do the work instead of an external pre-processor. They still require more re-definition than I was willing to put up with.&lt;br&gt;&lt;br&gt;Wouldn't it be nice if you could make the C++ compiler do &lt;b&gt;all&lt;/b&gt; the work for you ?&lt;br&gt;&lt;br&gt;It was with that question in mind that I sat down last weekend determined to make it require no more then 1 line of additional code per function or method I wanted to expose to Lua. Oh, and I wanted to be able to do the same for calling Lua functions from C++.&lt;br&gt;&lt;br&gt;&lt;b&gt;Calling Lua from C++&lt;/b&gt;&lt;br&gt;&lt;br&gt;Consider this Lua function:&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;div class='codeblock'&gt;&lt;pre&gt;function addSomething(a, b)&lt;br&gt;	return a + b&lt;br&gt;end&lt;/pre&gt;&lt;/div&gt;&lt;br&gt;&lt;br&gt;If I wanted to call this from C++, I'd have to do something along the lines of:&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;div class='codeblock'&gt;&lt;pre&gt;lua_State *L; // Defined somewhere&lt;br&gt;&lt;br&gt;lua_pushnumber(L, 42);&lt;br&gt;lua_pushnumber(L, 69);&lt;br&gt;if(lua_pcall(L, 2, 1, 0)) != 0)&lt;br&gt;   // ... handle error ...&lt;br&gt;&lt;br&gt;lua_Number ret = luaL_checknumber(L, -1);&lt;br&gt;lua_pop(L, 1);&lt;/pre&gt;&lt;/div&gt;&lt;br&gt;&lt;br&gt;Bit of a pain, right? Through some nifty template magic, I add one line of code to the application:&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;div class='codeblock'&gt;&lt;pre&gt;CppLuaDelegate&amp;lt;lua_Number, lua_Number, lua_Number&amp;gt; CppLuaFuncImpl(addSomething);&lt;/pre&gt;&lt;/div&gt;&lt;br&gt;&lt;br&gt;And I can then call the Lua function as follows:&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;div class='codeblock'&gt;&lt;pre&gt;lua_Number ret = addSomething(42, 69);&lt;/pre&gt;&lt;/div&gt;&lt;br&gt;&lt;br&gt;As an added bonus, I get full compile time type checking as if it was a normal C++ function.&lt;br&gt;&lt;br&gt;&lt;b&gt;Calling C++ from Lua&lt;/b&gt;&lt;br&gt;&lt;br&gt;Calling C++ from Lua can be even more of a pain in the butt. You have to implement a function that gets the arguments from the Lua stack and then calls whatever existing C++ function you want. It's not rocket science, but it's boring and means you effectively have to implement two functions for every function you want callable from Lua.&lt;br&gt;&lt;br&gt;So, instead, through more template magic, I do:&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;div class='codeblock'&gt;&lt;pre&gt;lua_Number addSomething(lua_Number a, lua_Number b)&lt;br&gt;{&lt;br&gt;	return a + b;&lt;br&gt;}&lt;br&gt;&lt;br&gt;LuaCppDelegate&amp;lt;lua_Number, lua_Number, lua_Number&amp;gt; LuaCppFuncImpl(addSomething);&lt;/pre&gt;&lt;/div&gt;&lt;br&gt;&lt;br&gt;Then I can call it from Lua as follows:&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;div class='codeblock'&gt;&lt;pre&gt;ret = addSomething(42, 69)&lt;/pre&gt;&lt;/div&gt;&lt;br&gt;&lt;br&gt;Again, this is fully type checked and it only requires one extra line of code per function.&lt;br&gt;&lt;br&gt;&lt;b&gt;C++ Objects&lt;/b&gt;&lt;br&gt;&lt;br&gt;Things get even more complicated when you want to expose a whole C++ object to Lua. Doing it by hand is generally not feasible, so you'd either have to use an external application or a metaprogramming library to do it. Either way is too much effort for my liking.&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;div class='codeblock'&gt;&lt;pre&gt;class LuaTestA : public LuaObject&lt;br&gt;{&lt;br&gt;   typedef LuaObject Parent;&lt;br&gt;&lt;br&gt;public:&lt;br&gt;   lua_Integer mValue;&lt;br&gt;&lt;br&gt;   LuaTestA() : mValue(0) {}&lt;br&gt;   DeclareLuaObject(LuaTestA);&lt;br&gt;&lt;br&gt;   virtual void SetValue(lua_Integer val)   { mValue = val; }&lt;br&gt;   virtual lua_Integer GetValue() const     { return mValue; }&lt;br&gt;};&lt;br&gt;&lt;br&gt;ImplementLuaObject(LuaTestA);&lt;br&gt;&lt;br&gt;LuaCppMethod&amp;lt;LuaTestA, void, lua_Integer&amp;gt; MethodImpl(LuaTestA, SetValue);&lt;br&gt;LuaCppMethod&amp;lt;LuaTestA, lua_Integer&amp;gt; MethodImpl(LuaTestA, GetValue);&lt;/pre&gt;&lt;/div&gt;&lt;br&gt;&lt;br&gt;Which gives you an object that can be created in C++ or Lua and used/passed around in both. Using it from Lua would look something like:&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;div class='codeblock'&gt;&lt;pre&gt;foo = LuaTestA.new()&lt;br&gt;foo:SetValue(42)&lt;br&gt;print(foo:GetValue())&lt;/pre&gt;&lt;/div&gt;&lt;br&gt;&lt;br&gt;&lt;b&gt;What's the point ?&lt;/b&gt;&lt;br&gt;&lt;br&gt;The code will port to Torque reasonably easily, which would make ConsoleFunction() and ConsoleMethod() obsolete. Instead of writing a console method and a C++ method, you'd just write the C++ method and 1 additional line of code to expose it to script.&lt;br&gt;&lt;br&gt;There would be no more worrying about converting things to or from strings, as that would all be done automatically. There would also be no more functions or methods that behaved differently depending on whether you called them from C++ or script. Oh, and all those useful console functions you currently can't call from C++, would be callable from both C++ and script.&lt;br&gt;&lt;br&gt;Furthermore, since none of the implementation behind the templates or macros is exposed, the same interfaces could be used with any scripting language. This would mean that replacing TorqueScript with Lua would be a pretty simple matter of changing the wrappers and recompiling. That, of course, assumes that Torque has been fully moved over to the wrapper.&lt;br&gt;&lt;br&gt;Whilst the Lua specific version of this is being used &amp;quot;now&amp;quot;, the Torque version of it is a little more long term. I'll be starting the port once the Lua interfaces are more complete, but changing all the existing ConsoleMethods and ConsoleFunctions will be time consuming. It will also mean that the semantics of some functions/methods will have to change; there's quite a few that behave slightly differently depending on whether they are called from script or C++.</description>
	</item>
	<item rdf:about="http://www.garagegames.com/blogs/22864/13040">
		<dc:format>text/html</dc:format>
		<dc:date>2007-06-11T01:38:45+00:00</dc:date>
		<dc:creator>Tom Bampton</dc:creator>
		<title>How NOT to make a game</title>
		<link>http://www.garagegames.com/blogs/22864/13040</link>
		<description>In a &lt;a href='http://www.garagegames.com/blogs/22864/9877'&gt;previous .plan&lt;/a&gt; I ranted about Need for Speed: Most Wanted. At the time, I vowed never to play that game again. I also vowed never to buy another game from that franchise. Now, over a year later, I have stuck to that and will continue to. Another not quite so deliberate side effect is that I haven't bought any other EA game since, and likely won't do. How much of that is me being pissed off with the game and how much is me being pissed off with EA's output in general is another question entirely, but I suspect that both play a part.&lt;br&gt;&lt;br&gt;Anyway, this blog is not about NFS or EA. It's about Test Drive Unlimited, Atari (publisher) and Eden Games (developer).&lt;br&gt;&lt;br&gt;Today I stuck the game into my 360 to burn about a bit, only to be met by a complete lack of hardcore mode and the game thinking I don't have 6 achievements that I blatantly do. Yep, it fucked up my save. This by itself was enough to send me ballistic, but is not the end of the story.&lt;br&gt;&lt;br&gt;After calming down (which took a flagrant disregard for the continued sim-life of anything that moved in Crackdown and resulted in me accidentally getting the Rampage achievement, which I thought was extremely apt timing), I figured that re-doing 6 achievements was not as bad as redoing the entire game. So, I took a deep breath, stuck the disk in the drive, and sat down to be bored shitless re-doing things I have already done and don't want to do again.&lt;br&gt;&lt;br&gt;Then the game popped up a message saying something along the lines of &amp;quot;You're playing with an old save. Please don't do it again, or we'll restrict online play.&amp;quot; The only reason I was trying to play with an old save was because the game fucked up both my current save and it's automatic backup. So, now I have a choice: don't play online, which sucks balls, or redo the entire game again, which sucks even more balls.&lt;br&gt;&lt;br&gt;Accordingly, I would like to take this opportunity to welcome Atari and Eden Games to my &amp;quot;never play, reccomend friends never play, and tell everybody on the Internet how much they suck&amp;quot; list. Thanks guys, you have really made my day.&lt;br&gt;&lt;br&gt;Whilst this is mostly a rant, we are all game developers here and there is one important thing to take away from this: Piss off your customers, and they will piss on you. And that is going to hurt an indie far, far more than EA or Atari.</description>
	</item>
	<item rdf:about="http://www.garagegames.com/blogs/22864/11648">
		<dc:format>text/html</dc:format>
		<dc:date>2006-11-18T18:44:31+00:00</dc:date>
		<dc:creator>Tom Bampton</dc:creator>
		<title>Thinking Outside the Box</title>
		<link>http://www.garagegames.com/blogs/22864/11648</link>
		<description>&lt;b&gt;The Problem&lt;/b&gt;&lt;br&gt;&lt;br&gt;&lt;img src='http://www.tinyirc.net/box/theBox.jpg'  align=center alt=&quot;&quot;&gt;&lt;br&gt;&lt;br&gt;This is the box. Within the box are all your preconceived ideas. Unfortunately, the box is also used by dog owners to clean up after their dogs. Since it has infinite storage capacity, nobody ever empties it. That's why dog owners use it ... nobody likes emptying boxes full of crap, and since it's infinite nobody has to.&lt;br&gt;&lt;br&gt;&lt;b&gt;The Bomb&lt;/b&gt;&lt;br&gt;&lt;br&gt;&lt;img src='http://www.tinyirc.net/box/theBomb.jpg'  align=center alt=&quot;&quot;&gt;&lt;br&gt;&lt;br&gt;I don't like boxes full of preconceived ideas and dog crap. The only thing they are good for is containing infinite amounts of dog crap and useless ideas. Some people have trouble thinking outside of the box. They are forever stuck in there, doomed to churn out crap ideas that smell of the box's contents.&lt;br&gt;&lt;br&gt;&lt;b&gt;The Solution&lt;/b&gt;&lt;br&gt;&lt;br&gt;&lt;img src='http://www.tinyirc.net/box/blowingUpTheBox.jpg'  align=center alt=&quot;&quot;&gt;&lt;br&gt;&lt;br&gt;I lied. There is one other thing the box is good for. Blowing up.&lt;br&gt;&lt;br&gt;&lt;b&gt;The Stragglers&lt;/b&gt;&lt;br&gt;&lt;br&gt;&lt;img src='http://www.tinyirc.net/box/oops.jpg'  align=center alt=&quot;&quot;&gt;&lt;br&gt;&lt;br&gt;If you stay in the box, this is you. Sure, you might get something done. You may even ship it. But it will smell of the contents of the box.&lt;br&gt;&lt;br&gt;If you have read this far, you may be wondering what the point of this blog is. You're not the only one, I don't know either.</description>
	</item>
	<item rdf:about="http://www.garagegames.com/blogs/22864/11540">
		<dc:format>text/html</dc:format>
		<dc:date>2006-11-03T08:45:40+00:00</dc:date>
		<dc:creator>Tom Bampton</dc:creator>
		<title>Alive and Ticking: Now with exploding ants</title>
		<link>http://www.garagegames.com/blogs/22864/11540</link>
		<description>When we were originally working on concepts for Alive and Ticking, Nauris sketched up some concepts for critters. After getting the A-Star code running, I threw together some simple AI using some past GID assets for placeholder.&lt;br&gt;&lt;br&gt;At that time, it didn't really work properly and I since rewrote a bunch of the AI code. Whilst the critters have been there for most of this year, they were disabled. The other day I finally got around to making them work again so there was something to do in single player games.&lt;br&gt;&lt;br&gt;If I remember correctly, the ant was made by Ben Chavigner and animated by Matt Mitman. The anthill was made by Logan Foster.&lt;br&gt;&lt;br&gt;&lt;img src='http://www.tinyirc.net/newLevel.jpg'  alt=&quot;&quot;&gt;&lt;br&gt;&lt;br&gt;&lt;img src='http://www.tinyirc.net/antsCloseUp.jpg'  alt=&quot;&quot;&gt;&lt;br&gt;&lt;br&gt;The AI is pretty simple. The ants run around aimlessly until they see a player, then they home in on him and explode. They will respawn at their anthill if it hasnt been blown up.&lt;br&gt;&lt;br&gt;Screenshots don't really do it justice, so here's a video.&lt;br&gt;&lt;br&gt;&lt;a href='http://www.tinyirc.net/KamikazeAnts.zip' target=_blank&gt;Click for video, ~9.4MB Zipped WMV&lt;/a&gt;</description>
	</item>
	<item rdf:about="http://www.garagegames.com/blogs/22864/11495">
		<dc:format>text/html</dc:format>
		<dc:date>2006-10-28T09:36:26+00:00</dc:date>
		<dc:creator>Tom Bampton</dc:creator>
		<title>Fun with zips</title>
		<link>http://www.garagegames.com/blogs/22864/11495</link>
		<description>As some may know, I maintain a &amp;quot;useless todo list.&amp;quot; This list includes all the mostly useless things I intend to do someday, maybe. The problem with the useless todo list is that whenever I end up actually doing something on the list, it turns out to be useful.&lt;br&gt;&lt;br&gt;One such item is the Torque zip code. I've been meaning to rewrite it for years. Since I am taking a break for a few days to recover from transatlantic travel, I figured I may as well mess around with the zip code.&lt;br&gt;&lt;br&gt;So to cut a long story short, and get right to the interesting bits, the new zip code supports multiple compression methods (Deflate and BZip2 for now), the old Zip2.0 encryption and WinZip's form of AES encryption. It's also now a seperate library (well, kinda) so it can be used from outside the resource manager easily.&lt;br&gt;&lt;br&gt;After completing the new zip code, I met with a problem. What to use it for? Clearly, the only sensible course of action was to zip up everything the game needs (including all mods and the top level main.cs) and run it straight from one big zip as a virtual file system. But wait! If I'm going to run it from one big zip, I may as well put the zip in the .exe. Then all I need to play the game is one file.&lt;br&gt;&lt;br&gt;Since it's a bit hard to post screenshots that show this off, I'll just upload a build instead.&lt;br&gt;&lt;br&gt;&lt;a href='http://www.tinyirc.net/TutorialBase.zip' target=_blank&gt;Stock tutorial.base, Win32 only, ~3.5MB&lt;/a&gt;</description>
	</item>
	<item rdf:about="http://www.garagegames.com/blogs/22864/11359">
		<dc:format>text/html</dc:format>
		<dc:date>2006-10-02T18:31:02+00:00</dc:date>
		<dc:creator>Tom Bampton</dc:creator>
		<title>Alive and Ticking gets to Beta .... err, almost. (Warning: Screenshot Heavy)</title>
		<link>http://www.garagegames.com/blogs/22864/11359</link>
		<description>It's been a while since the last .plan on Alive and Ticking. Many thousand lines of code and quite a lot of art later, we're finally getting really close to beta. I had hoped to get it to beta by IGC, but it's closer to a late alpha.&lt;br&gt;&lt;br&gt;&lt;b&gt;Boom!&lt;/b&gt;&lt;br&gt;&lt;br&gt;&lt;img src='http://www.burntwasp.com/bmbeta/bombs.jpg'  alt=&quot;&quot;&gt;&lt;br&gt;&lt;br&gt;We have two types of bombs, normal timed bombs and remotely detonated bombs (with the antenna). Remote bombs have an arming delay, the antenna flashes when the bomb is armed.&lt;br&gt;&lt;br&gt;&lt;img src='http://www.burntwasp.com/bmbeta/bigExplosion.jpg'  alt=&quot;&quot;&gt;&lt;br&gt;&lt;img src='http://www.burntwasp.com/bmbeta/smallExplosion.jpg'  alt=&quot;&quot;&gt;&lt;br&gt;&lt;br&gt;The crates break when blown up with a bomb. Blowing up crates is not only good stress relief, it also gets you power ups.&lt;br&gt;&lt;br&gt;&lt;img src='http://www.burntwasp.com/bmbeta/death.jpg'  alt=&quot;&quot;&gt;&lt;br&gt;&lt;br&gt;Both bombs are equally deadly.&lt;br&gt;&lt;br&gt;&lt;b&gt;Power Ups&lt;/b&gt;&lt;br&gt;&lt;br&gt;&lt;img src='http://www.burntwasp.com/bmbeta/powerUps.jpg'  alt=&quot;&quot;&gt;&lt;br&gt;&lt;img src='http://www.burntwasp.com/bmbeta/powerUps2.jpg'  alt=&quot;&quot;&gt;&lt;br&gt;&lt;br&gt;There are a number of power ups available: Extra lives, bomb power increase, multiple bombs, remote detonators, diseases and invincibility.&lt;br&gt;&lt;br&gt;When you pick up a disease, causes something bad to happen to you or a random player. There are three diseases: invertitis (inverted controls), personis firstitis (forces you into first person) and teleportitis (teleports you with a random other player).&lt;br&gt;&lt;br&gt;&lt;b&gt;Game Modes&lt;/b&gt;&lt;br&gt;&lt;br&gt;There are currently three game modes:&lt;br&gt;&lt;br&gt;* Deathmatch&lt;br&gt;* Team Deathmatch&lt;br&gt;* Capture the Penguin&lt;br&gt;&lt;br&gt;&lt;img src='http://www.burntwasp.com/bmbeta/yellowPenguin.jpg'  alt=&quot;&quot;&gt;&lt;br&gt;&lt;img src='http://www.burntwasp.com/bmbeta/carryFlag.jpg'  alt=&quot;&quot;&gt;&lt;br&gt;&lt;br&gt;&lt;b&gt;HUD&lt;/b&gt;&lt;br&gt;&lt;br&gt;&lt;img src='http://www.burntwasp.com/bmbeta/puBounce.jpg'  alt=&quot;&quot;&gt;&lt;br&gt;&lt;br&gt;The overview map displays the location of crates, players, power ups, bombs and flags.&lt;br&gt;&lt;br&gt;The power up HUD shows your current power ups. When you pick up a power up, the icon bounces. The icons also rotate slowly.&lt;br&gt;&lt;br&gt;&lt;img src='http://www.burntwasp.com/bmbeta/scoreBoard.jpg'  alt=&quot;&quot;&gt;&lt;br&gt;&lt;br&gt;The scoreboard shows the player's current scores. It also colors the names by team color and displays team scores in team games.&lt;br&gt;&lt;br&gt;&lt;img src='http://www.burntwasp.com/bmbeta/observerCam.jpg'  alt=&quot;&quot;&gt;&lt;br&gt;&lt;br&gt;When you run out of lives, observer mode lets you watch the action from the point of view of any of the surviving players. This is a great way to pick up new strategies.&lt;br&gt;&lt;br&gt;&lt;img src='http://www.burntwasp.com/bmbeta/lobby.jpg'  alt=&quot;&quot;&gt;&lt;br&gt;&lt;br&gt;The craptastic lobby allows players to choose their team and chat, and the admin to setup the game. All clients GUIs update when the admin changes any options.&lt;br&gt;&lt;br&gt;&lt;b&gt;The Levels&lt;/b&gt;&lt;br&gt;&lt;br&gt;I bet by now you're thinking &amp;quot;damn, that looks really blocky.&amp;quot; That's because the above screenshots came from a gameplay test level. The levels are capable of so much more:&lt;br&gt;&lt;br&gt;&lt;img src='http://www.burntwasp.com/bmbeta/housesCloseUp.jpg'  alt=&quot;&quot;&gt;&lt;br&gt;&lt;br&gt;DTS shapes can be used for both &amp;quot;walls&amp;quot; and as an additional prop for the floor.&lt;br&gt;&lt;br&gt;&lt;img src='http://www.burntwasp.com/bmbeta/emitters.jpg'  alt=&quot;&quot;&gt;&lt;br&gt;&lt;br&gt;They can also be rotated have particle emitters mounted to any node in the DTS shape.&lt;br&gt;&lt;br&gt;&lt;img src='http://www.burntwasp.com/bmbeta/wideView.jpg'  alt=&quot;&quot;&gt;&lt;br&gt;&lt;br&gt;The level code also supports animated blocks. This is a bit tricky to show in a screenshot, so I'm not going to try. DTS animation will be used to make the level respond to explosions as well as ambient animation.&lt;br&gt;&lt;br&gt;&lt;b&gt;Ticked&lt;/b&gt;&lt;br&gt;&lt;br&gt;&lt;img src='http://www.burntwasp.com/bmbeta/ticked.jpg'  alt=&quot;&quot;&gt;&lt;br&gt;&lt;br&gt;I'm not ready to talk much about Ticked yet. The above screenshot is of the prototype, and thus is only intended to illustrate the basic functionality.&lt;br&gt;&lt;br&gt;&lt;b&gt;Thank Yous/Credits&lt;/b&gt;&lt;br&gt;&lt;br&gt;Without the art team (Nauris Krauze, Craig Fortune and Matt Mitman) the game would still be a very early alpha and a very different game. Their ideas have been just as important as their art.&lt;br&gt;&lt;br&gt;Paul Dana has been a huge help whenever I've needed a sounding board or had issues with 3D math, which has long been my weakest area.&lt;br&gt;&lt;br&gt;Justin DuJardin has been a big help with Ticked, and with some nifty things that are currently secret.&lt;br&gt;&lt;br&gt;Everybody who has helped playtest this since day 1. There are too many of you to list, so I won't try just in case I miss someone. You all know who you are, anyway.&lt;br&gt;&lt;br&gt;&lt;b&gt;Where next ?&lt;/b&gt;&lt;br&gt;&lt;br&gt;I'm not telling yet :)</description>
	</item>
	<item rdf:about="http://www.garagegames.com/blogs/22864/11225">
		<dc:format>text/html</dc:format>
		<dc:date>2006-09-08T00:03:43+00:00</dc:date>
		<dc:creator>Tom Bampton</dc:creator>
		<title>Internal Name Operator</title>
		<link>http://www.garagegames.com/blogs/22864/11225</link>
		<description>There's been some discussion for a while about internal names. They were originally implemented in TGB to make GUI code a little easier to write ... but findObjectByInternalName() is long and irritating to type.&lt;br&gt;&lt;br&gt;I think it was Paul Dana that suggested a new operator for referencing objects in a group by their internal name. After talking with Justin about it today for the umpteenth time, I finally got around to implementing it:&lt;br&gt;&lt;br&gt;&lt;img src='http://www.burntwasp.com/intNameOp.jpg'  alt=&quot;&quot;&gt;&lt;br&gt;&lt;br&gt;Ben mentioned that -&amp;gt; could be confusing to programmers used to C++. He does have a point, but is it worth worrying about ? If so, what would be a better operator ? All I can think of is &amp;quot;#&amp;quot;, &amp;quot;..&amp;quot; and &amp;quot;.&amp;gt;&amp;quot; ... but they all feel a bit strange.</description>
	</item>
	<item rdf:about="http://www.garagegames.com/blogs/22864/11190">
		<dc:format>text/html</dc:format>
		<dc:date>2006-08-31T11:50:11+00:00</dc:date>
		<dc:creator>Tom Bampton</dc:creator>
		<title>Learning C# the insane way</title>
		<link>http://www.garagegames.com/blogs/22864/11190</link>
		<description>Learning C# is one thing that I've been putting of for a long time. The only reason for that was I haven't needed it and I knew I could pick it up really quickly.&lt;br&gt;&lt;br&gt;After finally getting some code working that has been seriously annoying me for the past week, I figured I'd push my luck and see just how quickly I could learn enough C# to be productive.&lt;br&gt;&lt;br&gt;It is obligatory when learning a new language to write a Hello World program. You are not a real programmer if your first program in every language you know was Hello World. The only problem with Hello World, is when you have learnt as many languages I have Hello World gets really boring.&lt;br&gt;&lt;br&gt;So, how do we spice this up ? It's obvious! Write a &lt;a href='http://en.wikipedia.org/wiki/BrainFuck' target=_blank&gt;BrainFuck&lt;/a&gt; interpreter in C# and implement Hello World in BrainFuck!&lt;br&gt;&lt;br&gt;&lt;img src='http://www.burntwasp.com/brainfuck.jpg'  alt=&quot;&quot;&gt;&lt;br&gt;&lt;br&gt;I did actually do Hello World before BrainFuck just to make sure I had the project setup correctly and because, well, it's the done thing. Here's a time breakdown:&lt;br&gt;&lt;br&gt;* Learning enough about C# to get started: 6 minutes&lt;br&gt;* Project Setup/Writing Hello World: 5 minutes&lt;br&gt;* Skimming docs to learn what I needed to know for BrainFuck: 15 minutes&lt;br&gt;* Total Time: 26 minutes&lt;br&gt;&lt;br&gt;It took me a little over an hour to implement the interpreter, but that would have been the same in terms of time regardless of what language I'd used.&lt;br&gt;&lt;br&gt;If you want to play around with it, you can &lt;a href='http://www.burntwasp.com/BF.zip' target=_blank&gt;download the interpreter here&lt;/a&gt;. You'll need .NET 2.0 installed to run it. I haven't included the source because since it's my first C# app and I'm a C++ programmer, I've probably done some things that would cause C# programmers to swear ;-)&lt;br&gt;&lt;br&gt;It's a command line app, for details on  how to use it, see the screenshot. I ganked the example BrainFuck code from the Wikipedia article linked earlier.</description>
	</item>
	<item rdf:about="http://www.garagegames.com/blogs/22864/11101">
		<dc:format>text/html</dc:format>
		<dc:date>2006-08-17T01:39:36+00:00</dc:date>
		<dc:creator>Tom Bampton</dc:creator>
		<title>A game in 20 minutes</title>
		<link>http://www.garagegames.com/blogs/22864/11101</link>
		<description>&lt;img src='http://www.burntwasp.com/gol/replicator.jpg'  align=right alt=&quot;&quot;&gt;&lt;br&gt;&lt;img src='http://www.burntwasp.com/gol/glider.jpg'  align=right alt=&quot;&quot;&gt;&lt;br&gt;&lt;br&gt;So far, this week has been filled with debugging hell which culminated today in the discovery of a bug in BitStream::writeBits() - but that's a completely different story, and one that's being dealt with appropriately.&lt;br&gt;&lt;br&gt;On Monday I was feeling the need to make something completely pointless, in around an hour. So I asked Paul if he had any ideas, and he suggested implementing &lt;a href='http://en.wikipedia.org/wiki/Conway%27s_Game_of_Life' target=_blank&gt;Conway's Game of Life&lt;/a&gt;. After a bit of umming and ahhing, I figured it was a pretty good idea and set about implementing it in Ticked.&lt;br&gt;&lt;br&gt;A time breakdown of the initial &amp;quot;GID&amp;quot; is as follows:&lt;br&gt;&lt;br&gt;* Neighbour Counting Algorithm - 8 minutes&lt;br&gt;* Game of Life Algorithm - 8 minutes&lt;br&gt;* Adding the &lt;a href='http://en.wikipedia.org/wiki/HighLife' target=_blank&gt;HighLife&lt;/a&gt; variation - 1 minute&lt;br&gt;* Haxing the level code - 2 minutes&lt;br&gt;* Talking to Paul and pressing F5 - 1 minute&lt;br&gt;&lt;br&gt;Total time about 20 minutes. It even worked first time, so no debugging required.&lt;br&gt;&lt;br&gt;Unfortunately, because Ticked is currently semi-secret, I couldn't post a blog about it. So, I spent a couple of hours spread over yesterday and today copy/paste/hacking the Game of Life into a standalone &amp;quot;game.&amp;quot;&lt;br&gt;&lt;br&gt;You can download the game here: &lt;a href='http://www.burntwasp.com/gol/GameOfLife-0.1-win32.zip' target=_blank&gt;Win32, Zip, 2.15MB&lt;/a&gt;&lt;br&gt;&lt;br&gt;I couldn't be bothered to do a Mac build, sorry ;)&lt;br&gt;&lt;br&gt;WASD and the Mouse Wheel control the camera. Use the left mouse button to paint living cells (blocks), and right mouse button to paste dead cells. Then you can either use the Step button to single step or Run to step automatically every 500ms. If you want to try out the HighLife mode, check that box.&lt;br&gt;&lt;br&gt;You can modify the game state at any time (running or not) by painting with the mouse.</description>
	</item>
</rdf:RDF>
