<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>BSoD</title>
	<atom:link href="http://bluescreenofdoom.com/blog/?feed=rss2" rel="self" type="application/rss+xml" />
	<link>http://bluescreenofdoom.com/blog</link>
	<description>Programming, Maths, Cheeses</description>
	<lastBuildDate>Sat, 31 Mar 2012 19:29:04 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.5</generator>
		<item>
		<title>Sqrt</title>
		<link>http://bluescreenofdoom.com/blog/?p=78</link>
		<comments>http://bluescreenofdoom.com/blog/?p=78#comments</comments>
		<pubDate>Sat, 31 Mar 2012 11:53:09 +0000</pubDate>
		<dc:creator>SirEel</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[code]]></category>
		<category><![CDATA[maths]]></category>

		<guid isPermaLink="false">http://bluescreenofdoom.com/blog/?p=78</guid>
		<description><![CDATA[In game programming, and specifically graphics programming, you are going to be using vectors a lot. In all likely-hood one of the very common operations you&#8217;ll be doing with these vectors, is normalising them. For those who&#8217;ve not seen this, &#8230; <a href="http://bluescreenofdoom.com/blog/?p=78">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>In game programming, and specifically graphics programming, you are going to be using vectors a lot. In all likely-hood one of the very common operations you&#8217;ll be doing with these vectors, is normalising them. For those who&#8217;ve not seen this, or have not seen the maths, a &#8216;normal&#8217; vector, is any vector whose length is 1. Normalising a vector means replacing that vector with a normal vector in the same direction. As a simple example, If we have a 2-D vector (5, 0), normalising it would give (1, 0).</p>
<p>In the general case, to normalise a vector we can divide it by its length. Clearly this works because a number divided by itself is 1, and dividing a vector by a number will cause the length to be divided also. The only problem then is finding the length of a vector. In 2-D this is as simple as <a title="Pythagoras Theroem - Wikipedia" href="http://en.wikipedia.org/wiki/Pythagoras_theorem">Pythagoras&#8217; Theorem</a>. So the length of vector V is: Sqrt( V.x * V.x + V.y * V.y ). Why is this of any interest? Simply because Sqrt is, as low level functions go, slow. It&#8217;s more than fast enough for most uses, but what if you need to normalize thousands of vectors per frame?</p>
<h3>Solutions</h3>
<p>Ok, firstly, we aren&#8217;t interested in the square root nearly as much as we are in 1/Sqrt(x). Lots of people have put time into solving this, and possibly the most famous was used in <a title="Fast Inverse Square Root - Wikipedia" href="http://en.wikipedia.org/wiki/Fast_inverse_square_root">Quake 3 Arena</a>. The code itself reads:</p>
<pre><code>float Q_rsqrt( float number )
{
        long i;
        float x2, y;
        const float threehalfs = 1.5F;

        x2 = number * 0.5F;
        y  = number;
        i  = * ( long * ) &amp;y;                       // evil floating point bit level hacking
        i  = 0x5f3759df - ( i &gt;&gt; 1 );               // what the fuck?
        y  = * ( float * ) &amp;i;
        y  = y * ( threehalfs - ( x2 * y * y ) );   // 1st iteration
//      y  = y * ( threehalfs - ( x2 * y * y ) );   // 2nd iteration, this can be removed

        return y;
}</code></pre>
<p>This function, while it does work, and is very clever, is not that fast. There is in fact an assembler instruction to calculate an approximate reciprocal square root, called rsqrtss. This can be used in c++ either by using inline assembler, or by using *intrin.h functions, specifically (in Microsoft&#8217;s compiler) _mm_rsqrt_ss. For additional accuracy, one iteration of <a title="Newton's Method - Wikipedia" href="http://en.wikipedia.org/wiki/Newton%27s_method">Newton-Raphson</a> can bring the result more than close enough for any given application.</p>
<h3>But How <em>Much</em> Faster</h3>
<p>With all optimisation, it is a good idea to really get an idea of what the trade-offs are between the possible methods. While rsqrtss certainly should be <em>faster</em> than other methods, it&#8217;s not intended to produce accurate results. So, while there may be cases where the accuracy isn&#8217;t all that necessary, we need to know if rsqrtss + NR is more accurate, and if it is faster than doing 1/sqrt(). This requires careful timing, and is not something I&#8217;m really qualified to talk about. I will, at least, post an update on my findings later.</p>
<h3>Code</h3>
<p>For anyone wanting to try the rsqrtss-based methods, here&#8217;s the source code I came up with. Note that this is Visual Studio specific, and only tested in VS2010!</p>
<pre><code>	float inline InverseSqrt( float X )
	{
		float out;
		__m128 __X = _mm_load_ss( &amp;X );
		__m128 Out = _mm_rsqrt_ss( __X );
		// equiv:
		// __X = X
		// Out = 1/sqrt(X)
		//0.5 * (Out + 1/(Out * __X))   This is newton-raphson
		_mm_store_ss( &amp;out,
			_mm_mul_ss( _mm_set_ss( 0.5f ),
				_mm_add_ss( Out,
					_mm_rcp_ss( _mm_mul_ss( Out, __X ) ) ) ) );
		return out;
	}

	float inline InverseSqrtFast( float X )
	{
		float out;
		_mm_store_ss(&amp;out, _mm_rsqrt_ss( _mm_load_ss(&amp;X)));
		return out;
	}</code></pre>
]]></content:encoded>
			<wfw:commentRss>http://bluescreenofdoom.com/blog/?feed=rss2&#038;p=78</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Map Chunk &#8216;Working&#8217;</title>
		<link>http://bluescreenofdoom.com/blog/?p=73</link>
		<comments>http://bluescreenofdoom.com/blog/?p=73#comments</comments>
		<pubDate>Sat, 03 Mar 2012 14:48:57 +0000</pubDate>
		<dc:creator>SirEel</dc:creator>
				<category><![CDATA[Sim Game]]></category>
		<category><![CDATA[Screenshot]]></category>

		<guid isPermaLink="false">http://bluescreenofdoom.com/blog/?p=73</guid>
		<description><![CDATA[I&#8217;ve finally gotten the map chunk to render as is intended, so here&#8217;s a picture. It&#8217;s currently using a perspective transform, and it just fills the chunk with randomly chosen blocks, so it&#8217;s not too interesting to look at.]]></description>
			<content:encoded><![CDATA[<p><a href="http://bluescreenofdoom.com/wp-uploads/2012/03/MapChunk.png"><img class="alignright size-medium wp-image-72" title="MapChunk" src="http://bluescreenofdoom.com/wp-uploads/2012/03/MapChunk-300x232.png" alt="A render of a map chunk" width="300" height="232" /></a>I&#8217;ve finally gotten the map chunk to render as is intended, so here&#8217;s a picture.</p>
<p>It&#8217;s currently using a perspective transform, and it just fills the chunk with randomly chosen blocks, so it&#8217;s not too interesting to look at.</p>
]]></content:encoded>
			<wfw:commentRss>http://bluescreenofdoom.com/blog/?feed=rss2&#038;p=73</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>On Debugging</title>
		<link>http://bluescreenofdoom.com/blog/?p=65</link>
		<comments>http://bluescreenofdoom.com/blog/?p=65#comments</comments>
		<pubDate>Thu, 01 Mar 2012 22:53:17 +0000</pubDate>
		<dc:creator>SirEel</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[code]]></category>
		<category><![CDATA[I'm a moron]]></category>
		<category><![CDATA[Sim Game related]]></category>

		<guid isPermaLink="false">http://bluescreenofdoom.com/blog/?p=65</guid>
		<description><![CDATA[I would be the first to admit that I am not the best person to give advice about debugging. I&#8217;m not very good at it, and don&#8217;t like doing it. My opinion is usually think about it enough that you &#8230; <a href="http://bluescreenofdoom.com/blog/?p=65">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>I would be the first to admit that I am not the best person to give advice about debugging. I&#8217;m not very good at it, and don&#8217;t like doing it. My opinion is usually think about it enough that you do it right first time. This is a terrible standpoint, and a massive hindrance to getting anything done. There are a large number of tools at our disposal to make the task much easier, and fluency with any of them will make any programming job a lot easier.</p>
<h3>Story Time</h3>
<p>However. No amount of fluency with tools, or excellence of those tools is going to fix a bug for you without the use of your own mind. In writing the map rendering code for Sim Game (I really have to think of a better title) I created a bug where&#8230; well, we&#8217;ll get to what was happening. Anyway, the optimisation was to check each of the six surrounding  blocks, and if none of them was transparent, then not bother rendering this block. What came out was a sort of bottom part of the shell. Mystified, I stepped through the code and it did precisely what I expected it to do. I thought about what I was trying to do, and rewrote the early exit condition. This gave me the same output. After repeating this dance a few times I decided that it wasn&#8217;t a programming day and decided I&#8217;d come back to it later.</p>
<p>Today, I sat down, reset the function to how it was in the first version, with the reasoning that if they all produced the same output, the first one is as good as any, and was the simplest anyway. After thinking very carefully I realised the following:</p>
<ul>
<li>The program did not exhibit the expected behaviour</li>
<li>The logic behind the method was sound</li>
<li>The code executed as expected</li>
</ul>
<p>So where does that leave me? I was perfectly certain of the first point, extremely certain of the second point, and I also knew the third point to be true. This lead to the conclusion that my expectation of where the code path should go was in fact flawed. With only a cursory check I saw that while most of the code in the inner loop was indeed only related to rendering that block, a very important and non-optional step happened afterwards &#8211; moving the draw point to the next block position. This was simple to fix and, of course, perfectly fixed the problem.</p>
<h3>So What Did We Learn Here?</h3>
<p>The main point I&#8217;m trying to make here is this: evaluating a bug in terms of your expectations is a good first step, but it really isn&#8217;t a guaranteed solution. A Good Programmer needs to understand their code, and failing to do this leads to all sorts of trouble. While I did understand the code I&#8217;d written, I failed to really think about the change I was making and what it meant to the code it was changing. &#8220;Yeah, we can just skip out from here&#8221; was the big mistake, and cost me an afternoon of messing around like an idiot. Go: Think, debug, repeat from Go.</p>
]]></content:encoded>
			<wfw:commentRss>http://bluescreenofdoom.com/blog/?feed=rss2&#038;p=65</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>On Pre-Processor Macros</title>
		<link>http://bluescreenofdoom.com/blog/?p=46</link>
		<comments>http://bluescreenofdoom.com/blog/?p=46#comments</comments>
		<pubDate>Sat, 04 Feb 2012 18:49:02 +0000</pubDate>
		<dc:creator>SirEel</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[code]]></category>
		<category><![CDATA[MACRO]]></category>
		<category><![CDATA[Sim Game related]]></category>
		<category><![CDATA[tldr]]></category>

		<guid isPermaLink="false">http://bluescreenofdoom.com/blog/?p=46</guid>
		<description><![CDATA[For those who have not used C or C++ I&#8217;ll start with a brief explanation: There is a thing called the pre-processor, and it is run over source files before they are compiled. It does a bunch of simple and &#8230; <a href="http://bluescreenofdoom.com/blog/?p=46">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>For those who have not used C or C++ I&#8217;ll start with a brief explanation: There is a thing called the pre-processor, and it is run over source files before they are compiled. It does a bunch of simple and useful things like pulling header files into source files for info about library functions.  Take a look at a tutorial C program, the first line will probably look like this:</p>
<pre><code>#include &lt;stdio.h&gt;</code></pre>
<p>That include line is a preprocessor macro, and it gets information about functions in a library somewhere else. I will be discussing here more complex macros, and their uses and pitfalls.</p>
<h3>So I&#8217;ve Got a Bunch of Things</h3>
<p>Repetition is something which, in programming, should be avoided at all cost. That is, programs will do repetitive tasks all the time, but <em>programmers</em> should avoid doing repetitive tasks like the plague. Most of the time there is a non-repetitive solution which might cost time in the short term, but it&#8217;ll save time for the rest of forever. Sometimes it might seem like this is unavoidable: you need a bunch of classes called &#8220;Foo&#8221;, &#8220;Bar&#8221;, and &#8220;Baz&#8221;, but they don&#8217;t really do anything important, they just initialise a base class with some data. These classes might look like this:</p>
<pre><code>class Base {
public:
int x, y, z;
};

class Foo : public  Base{
public:
    Foo() : x(0), y(1), z(50) {}
};

class Bar : public  Base {
public:
    Bar() : x(3), y(100), z(3) {}
};

class Baz : public  Base {
public:
    Baz() : x(-6), y(123), z(0xdeadbeef) {}
};</code></pre>
<p>This is repetitive, and a waste of time to write. In the Sim/Management game I&#8217;m currently working on, it&#8217;s worse still and I&#8217;ve got an enum of the names of the base classes too. So rather than waste time writing this out, I set up a pre-processor macro to do it for me.</p>
<p>Pre-processor macros usually look like:</p>
<pre><code>#define SOMETHING Something(); if(Maybe()){ LotsOfStuff();}</code></pre>
<p>but they can also take arguments. And importantly the arguments can be other macros, including other macros which take arguments. In the above list of class definitions there are lots of sections where the only thing that changes is the name (and some numbers, but we&#8217;ll get to that). Now that means the code could be replaced by a macro taking that name as an argument. But we can also <em>supply</em> those arguments using a macro if we will be using the same list of arguments frequently!</p>
<h3>Here We Go: The Argument List Macro</h3>
<pre><code>#define ALLTHETHINGS(f)\
    f(Foo)\
    f(Bar)\
    f(Baz)</code></pre>
<p>To explain, what this does, is given an argument f, it treats f like a function and calls it with Foo, Bar, and Baz as arguments. Note that the preprocessor acts on source code, these are not strings but typeless text, whatever the function of the text is after the macro is processed is what it does &#8211; it can be string data, int constants, keywords, or anything else.</p>
<p>An easy example of how this can be used would be to make an enum with these names, this would be most easily achieved by writing the following.</p>
<pre><code>enum Names {
#    define ENAMES(op) op,
    ALLTHETHINGS(ENAMES)
#    undef ENAMES
};</code></pre>
<p>Voila! To add an entry to the enum, just add it to the ALLTHETHINGS macro, and it&#8217;ll exist. The reason for undefining the ENAMES macro after its use is we don&#8217;t want to leave defined macros lying around where they could cause problems.</p>
<p>That&#8217;s no great saving, adding the entry in one place to save adding it in one place, but let&#8217;s look again &#8211; our definition of the classes above could be made into a macro as well. We will have to make a few changes however, the simplest being not defining the constructor in the class definition, so we only need a macro like:</p>
<p><code> </code></p>
<pre><code>#define CLASSTYPE(op) \
class op : public Base { \
public: \
     op(); \
};</code></pre>
<p><code> </code></p>
<p>And we can then use it with the ALLTHETHINGS macro as above. To sort out those constructors we will unfortunately have to repeat ourselves a little. The macro I&#8217;ll describe shortly requires the name of the class, as well as the value of the initialisers, it goes like this:</p>
<p><code> </code></p>
<pre><code>#define CONSTRUCTOR(Type, X, Y, Z)\
Type::##Type() \
    : x(X), y(Y), z(Z) {}</code></pre>
<p><code> </code></p>
<p>You can then call this as (for example) <code> CONSTRUCTOR(Foo, 0, 1, 50) </code> and it will create that constructor definition for you.</p>
<h3>MACROISE ALL THE THINGS</h3>
<p>So what&#8217;s the downside? If you get it wrong, the error messages are not going to be very helpful. They&#8217;ll point to the line which generated the error, but you could have a one line composite macro produce literally thousands of lines after the pre-processor has done its thing. Depending on the mistake you make that could produce thousands of errors as well. The other problem which appears if you work in a nice and friendly IDE, or at least work in Visual Studio, is that code completion is not going to understand what you&#8217;ve done. Intellisense will tell you that these classes do not exist and all references to them are errors. Even in Visual Studio Pro 2010, it marks macros inside enums as erroneous.</p>
<p>There is a solution which addresses both of these problems, but I believe has it&#8217;s own issues &#8211; mainly adding a build step. You could write a small program to expand the macros for you, while not expanding the #include calls. This would mean that the resultant header file would be easy for Intellisense (and non-microsoft equivalents) to parse, and the errors should in theory be easier to trace. Having IDEs call your program as part of the build process is certainly possible, though perhaps not as easy as writing it into a makefile (if you are that kind of developer). It also occurs to me that pre-compiled headers might be a solution, but I&#8217;ve never used them so I can&#8217;t comment.</p>
<p>I&#8217;m no expert on macros, the things I&#8217;ve listed above are approaches I&#8217;ve used (recently) in my own project. There are many more uses macros may be put to, and many other things the pre-processor can be persuaded to do for you (try looking up template meta-programming, for example) and even many things that they can do to make programming harder. RTFM, and use wisely.</p>
]]></content:encoded>
			<wfw:commentRss>http://bluescreenofdoom.com/blog/?feed=rss2&#038;p=46</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>SVN</title>
		<link>http://bluescreenofdoom.com/blog/?p=41</link>
		<comments>http://bluescreenofdoom.com/blog/?p=41#comments</comments>
		<pubDate>Sun, 22 Jan 2012 16:22:39 +0000</pubDate>
		<dc:creator>SirEel</dc:creator>
				<category><![CDATA[Sim Game]]></category>
		<category><![CDATA[svn]]></category>

		<guid isPermaLink="false">http://bluescreenofdoom.com/blog/?p=41</guid>
		<description><![CDATA[Now and hopefully for the life of the project, there is svn access for those with the capability to build there own copy of the game. Point your favourite svn tool here. At my end I use Visual Studio 2010 &#8230; <a href="http://bluescreenofdoom.com/blog/?p=41">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Now and hopefully for the life of the project, there is svn access for those with the capability to build there own copy of the game. Point your favourite svn tool <a href="https://bluescreenofdoom.com/svn/Sim">here</a>.</p>
<p>At my end I use Visual Studio 2010 Pro (A leftover from my student years) although I believe there is enough backward compatibility to get it to work with things at least as far back as VC++2008 express. If you wish to not use Visual Studio, then the project requires linking against the following:</p>
<ul>
<li>SDL</li>
<li>SDL_main</li>
<li>SDL_image</li>
<li>OpenGL32</li>
<li>glu32</li>
</ul>
<p>For the truly brave, compiling in linux should be possible, with the openGL libraries renamed appropriately. If anyone does this and finds changes are required, please tell me. If you can give me a patch file, even better!</p>
]]></content:encoded>
			<wfw:commentRss>http://bluescreenofdoom.com/blog/?feed=rss2&#038;p=41</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>On Tile Based Maps</title>
		<link>http://bluescreenofdoom.com/blog/?p=26</link>
		<comments>http://bluescreenofdoom.com/blog/?p=26#comments</comments>
		<pubDate>Wed, 18 Jan 2012 23:46:07 +0000</pubDate>
		<dc:creator>SirEel</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[Design Patterns]]></category>
		<category><![CDATA[Flyweight]]></category>
		<category><![CDATA[Sim Game related]]></category>

		<guid isPermaLink="false">http://bluescreenofdoom.com/blog/?p=26</guid>
		<description><![CDATA[For many types of game, storing your map as an array of tiles can be ideal. Whether you are looking at old school platformers, or more modern 3d games, it can provide at least a basis for a very flexible &#8230; <a href="http://bluescreenofdoom.com/blog/?p=26">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>For many types of game, storing your map as an array of tiles can be ideal. Whether you are looking at old school platformers, or more modern 3d games, it can provide at least a basis for a very flexible mapping system. Often in modern games other alternatives are pursued for various reasons, both technical and aesthetic. In the sim game I&#8217;m writing, a tile based map is essential to what I want to be able to do. Building and destroying things is going to have a large role in the gameplay, and while this doesn&#8217;t necessitate such a map, it can be a very user friendly approach.</p>
<p>Now one of the corner stones of the design is allowing things to be built out of any material, whether that means blocks of stone or swords made of cheese. This means that the two need to be stored independently where possible. Firstly though, we need to examine what these two parts mean in themselves.</p>
<h3>Material</h3>
<p>Materials will be anything that can, sensibly or not, be used to make things. The first one I added was Air, which will be the most common &#8216;no material&#8217; material. Others are likely to include Chalk, Granite, Diamond, and yes, Cheese. A material needs to have a visual representation, i.e., a texture, and properties. Properties might include things like weight, hardness, conductivity, transparency, and two-state properties like breathable, passable and so on. Now it&#8217;s certain that there won&#8217;t be a material matching every possible combination of these properties, which means that storing all of that data for every instance of a material would result in a lot of redundant material.</p>
<p>Instead it&#8217;d be better to store a canonical list of materials which exist, and only refer to entries in that list via some suitable enumerator. This principle is something like the Flyweight pattern as mentioned in <a href="http://en.wikipedia.org/wiki/Design_Patterns" target="_blank">Design Patterns</a>, an excellently useful, if a little dry, book which I thoroughly recommend.</p>
<h3>Blocks</h3>
<p>What I referred to earlier as &#8216;things&#8217; actually needs splitting down a little. Parts of the environment are subtly different from other objects, in that those objects can (or rather, are intended to be able to) be picked up and manipulated by NPCs. Or be NPCs. These will also be considerably less numerous than environment blocks, and so special treatment is something which they can be afforded. Environment blocks then are specifically shapes. Most commonly these will be natural features, or at least what makes them up. Solid blocks, and partial blocks, and such useful shapes. This will inevitably end up including other shapes which are less natural, such as walls, windows and columns.</p>
<h3>Map Storage</h3>
<p>Now, we need to store, at a minimum, one of each of these things in each. Trying to keep to reasonable computer-friendly numbers, this probably means a byte for each, or 16 bits total, per block. That doesn&#8217;t sound like much, but we may want to have a large working set in memory at once, which can add up quickly, and not be very friendly to the CPU cache. A quick search online tells me that a fairly decent processor (the Intel i7) can have an 8MB L3 cache. That&#8217;s not that much, not really. That would be filled by a 128x128x256 map chunk. We ideally want to go smaller than that, but the size is something which will require careful balancing with several machines to work out a useful size.</p>
<p>Of course, this 2-byte per tile has its own limitations. As soon as either materials or block shapes number more than 256, that part will require an additional byte. Not too likely, so perhaps not a big worry, but something that might come up a way down the line. The other is that we don&#8217;t have any per-tile storage at all. Those blocks must be exactly identical, which means anything that has directions would need to be stored as four separate tiles. This will eat up tile IDs fast, but ensures that the myriad of tiles which don&#8217;t need extra data aren&#8217;t wasting space. The only other neat way to fix that is to have variable sized tiles, but that destroys any chance at fast indexing.</p>
<h3>In Conclusion</h3>
<p>Using a Flyweight type design for materials and block types seems to be ideal, although dereferencing the index will add an overhead, it is a necessary one. Fixed sized tiles are necessary, but picking the right size will be key, too little and I&#8217;ll have to revisit the whole problem and make any previously generated data out of date, too much and it&#8217;ll be too hard to process, take up too much memory, and waste hard disk space. A lot of testing will be required to really decide where to put the boundaries though!</p>
]]></content:encoded>
			<wfw:commentRss>http://bluescreenofdoom.com/blog/?feed=rss2&#038;p=26</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Sim Game (Working Title)</title>
		<link>http://bluescreenofdoom.com/blog/?p=17</link>
		<comments>http://bluescreenofdoom.com/blog/?p=17#comments</comments>
		<pubDate>Wed, 18 Jan 2012 22:51:14 +0000</pubDate>
		<dc:creator>SirEel</dc:creator>
				<category><![CDATA[Projects]]></category>
		<category><![CDATA[Sim Game]]></category>

		<guid isPermaLink="false">http://bluescreenofdoom.com/blog/?p=17</guid>
		<description><![CDATA[Sim Game (I&#8217;ll pick a better name soon, I promise!) is to be an isometric strategy/management/sim, in the vein of Dwarf Fortress and Dungeon Keeper, with a bit of borrowing from Minecraft. Currently it is being developed in C++ with &#8230; <a href="http://bluescreenofdoom.com/blog/?p=17">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Sim Game (I&#8217;ll pick a better name soon, I promise!) is to be an isometric strategy/management/sim, in the vein of Dwarf Fortress and Dungeon Keeper, with a bit of borrowing from Minecraft. Currently it is being developed in C++ with OpenGL graphics, and a little bit of help from SDL for some of the low-level parts.</p>
<p>This project is very much in the early stages.</p>
]]></content:encoded>
			<wfw:commentRss>http://bluescreenofdoom.com/blog/?feed=rss2&#038;p=17</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>New blog</title>
		<link>http://bluescreenofdoom.com/blog/?p=5</link>
		<comments>http://bluescreenofdoom.com/blog/?p=5#comments</comments>
		<pubDate>Tue, 17 Jan 2012 23:57:31 +0000</pubDate>
		<dc:creator>SirEel</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://bluescreenofdoom.com/blog/?p=5</guid>
		<description><![CDATA[yay wordpress, beats continuing to try to write my own.]]></description>
			<content:encoded><![CDATA[<p>yay wordpress, beats continuing to try to write my own.</p>
]]></content:encoded>
			<wfw:commentRss>http://bluescreenofdoom.com/blog/?feed=rss2&#038;p=5</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

