<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0"><channel><atom:link rel="hub" href="http://tumblr.superfeedr.com/" xmlns:atom="http://www.w3.org/2005/Atom"/><description>Playing by the rules(?)</description><title>swixel dot net</title><generator>Tumblr (3.0; @swixel)</generator><link>http://swixel.net/</link><item><title>couchdbkit authentication</title><description>&lt;p&gt;I couldn&amp;#8217;t find out how you&amp;#8217;re meant to make couchdbkit authenticate against couchdb (for those of us who need to auth for production reasons). Anyway, here&amp;#8217;s my solution using nothing but the deps (restkit is a dep of couchdbkit ;)) &amp;#8230;&lt;/p&gt;
&lt;pre class="code"&gt;"""
Copyright (c) 2012 A.W. 'swixel'/'aws' Stanley.
Released under the MIT Licence or public domain (whatever you're allowed).
"""&lt;br/&gt;# CouchDBKit
import couchdbkit

# RestKit
from restkit import BasicAuth

# Trivial "convert settings to couchdb database instance"
# (Could be split into two parts if you wanted, but I use one DB per app)
def ConnectToCouchDB(uri="http://127.0.0.1:5984/", database="testdb", username=None, password=None, design_docs="design_docs"):
	# Authenticate
	if(username != None and password != None):
		CouchDBAuth = couchdbkit.resource.CouchdbResource(filters=[BasicAuth(username, password)])
		CouchDBServer = couchdbkit.Server(uri, resource_instance=CouchDBAuth)
	else: 
		CouchDBServer = couchdbkit.Server(uri)

	# Get or create database
	try:
		CouchDB = CouchDBServer.get_db(database)
		CouchDB.info()
	except couchdbkit.exceptions.ResourceNotFound:
		# I let 'Unauthorized' be thrown here, you could catch it, but my 500 error does that ;)
		CouchDB = CouchDBServer.create_db(database)
		CouchDB.info()
		
		# Install views
		loader = couchdbkit.loaders.FileSystemDocsLoader(design_docs)
		loader.sync(CouchDB, verbose=False)

	return CouchDB
&lt;/pre&gt;</description><link>http://swixel.net/post/23954964723</link><guid>http://swixel.net/post/23954964723</guid><pubDate>Tue, 29 May 2012 08:02:00 +1000</pubDate><category>couchdb</category><category>couchdbkit</category><category>python</category><category>databases</category></item><item><title>Optimising embedded Python: xrange vs range, and file</title><description>&lt;p&gt;A number of video games at the moment are using Python as their scripting engine.  It bothers me a bit that so many of them are &amp;#8216;fast&amp;#8217;, and at the same time, use uncompiled code for things they shouldn&amp;#8217;t.&lt;/p&gt;
&lt;p&gt;One large company is using range.  It&amp;#8217;s Python 2.6.  xrange is an iterator, meaning it&amp;#8217;s equivalent to a C for loop (i.e. i++ for the index).  range is not, it creates a value for each entry in the range (&amp;#8216;start&amp;#8217; through &amp;#8216;stop&amp;#8217;).  xrange is fast, xrange uses less RAM, I&amp;#8217;m not sure I need to say much more.  It&amp;#8217;s on the Python website.  Here, have some references: [&lt;a href="http://wiki.python.org/moin/PythonSpeed/PerformanceTips#Use_xrange_instead_of_range"&gt;1&lt;/a&gt;] [&lt;a href="http://docs.python.org/library/functions.html#xrange"&gt;2&lt;/a&gt;].&lt;/p&gt;
&lt;p&gt;The second major gripe I have, which was discussed in a few IRC channels in the last week (Gamesurge and Freenode hosted ones, but not #python), is there was some a pretty shocking attempt we found reversing a game&amp;#8217;s binary format.  When we got the Python code out of it, it wasn&amp;#8217;t bytecode, it was raw text.  More importantly, it stored a filename value at the time, and then used __file__.  The reason the interpreter got upset was that it tried to use a full path for comparison and if anyone moved the files to a non-standard directory (as many of us do), things went south.  By the time we got a patch which removed this joke of a gamebreaking error, we&amp;#8217;d already found it, so I thought I&amp;#8217;d share that and anyone who suddenly found themselves able to play it in the last week or so, now you know what happened. (No, it wasn&amp;#8217;t an indie game.)&lt;/p&gt;
&lt;p&gt;Finally, don&amp;#8217;t break the argc and argv values.  We shouldn&amp;#8217;t be using them, but there are better ways to inject data into your interpreter to load new paths.  Either feed them argc and argv from your main function, or leave them blank.  Throwing random junk in is just weird.&lt;/p&gt;
&lt;p&gt;The other option is to write real code.  It may be slower than using Python, or Lua, or Javascript, but you have the satisfaction of knowing it&amp;#8217;ll be harder to reverse, will almost certainly run faster, and will prevent people from modding parts of games in which you don&amp;#8217;t want us poking around.  Sure, you could actually think it through and use Lua or Python to inject tables of data (I do this in most of my little tools), marshal the data into lists (or something niftier like a std::vector or a std::map) and write sane code.&lt;/p&gt;</description><link>http://swixel.net/post/21893169327</link><guid>http://swixel.net/post/21893169327</guid><pubDate>Fri, 27 Apr 2012 12:59:50 +1000</pubDate></item><item><title>Abusing CouchDB for research purposes</title><description>&lt;p&gt;Twitter research is something I thought I had overcome; something of the past, a relic of times and thoughts less well processed than those I like to think I have now.  Apparently not.&lt;/p&gt;

&lt;p&gt;What is unfortunate about social media (at least from my research perspective) is the amount of easy to access, contextually &amp;#8216;fixed&amp;#8217;, data, lowering the number of variables required for analysis.  What is fortunate, is, well, what I just said.&lt;/p&gt;

&lt;p&gt;To manage what I&amp;#8217;m told is a ridiculous corpus, I built a CouchDB.  Last time, I took Tweets, reordered their JSON data so _id replaced the id field, then dumped everything except the user data into the database.  This was a HUGE amount of data.  And I mean huge.  It took me three months to load a 12.5% of all tweets in the May 2010 into a database, and used hundreds of GB of data for views.  It was nasty.&lt;/p&gt;

&lt;p&gt;This time, I stripped everything except the IDs (user + status), the targets (user + status), text, timezone (text form), and UTC offset (which, is more important, but the timezone is pretty).  I didn&amp;#8217;t keep the retweet field, as it&amp;#8217;s missing in some, and not within the scope of what I care about.  The result is 531,159,273 tweets loaded in 3 days.  The views will take days, if not weeks (if not MONTHS) to build, but I&amp;#8217;m limiting what I need, and starting with stale views to get preliminary findings.&lt;/p&gt;

&lt;p&gt;Why CouchDB? Indexes, json to json, and the capability to not flip out on me when I do insane things.&lt;/p&gt;

&lt;p&gt;The disk array is nothing flash: 4x2TB 5400rpm SATA-II disks running in RAID 10, attached using a round-robin configured dual gigabit NICs (PCI-E).  This is managed by Core2Duo 4400 (2GHz per core), with 4GB of RAM.  The box holding them does nothing but NFS share to the box running it.&lt;/p&gt;

&lt;p&gt;The box running CouchDB is where I really cheat and move away from &amp;#8220;commodity&amp;#8221;: a Sun Fire X4600 M2 (so 8x dual core Opterons at 2.8GHz per core, with 32GB of RAM, and RAID1&amp;#160;10k rpm SAS drives).  Not since moving from CouchDB 0.6 have I come close to using more than 400% (4 cores for those less than familiar with Linux), and the disk i/o is holding &amp;#8212; Python appears to be my slow point.&lt;/p&gt;

&lt;p&gt;The real problem is that the insertions happen too quickly that the views freak out and CouchDB goes down due to RAM usage issues if I try to update while I insert &amp;#8230; but other than that, it&amp;#8217;s perfect.&lt;/p&gt;

&lt;p&gt;As usual, my loading script is a multiprocessing Python hackjob.  I&amp;#8217;d move it to C/++, but by the time I rewrote a socket proc-to-proc linking system, master+slave daemon configuration, the Python code would be done &amp;#8230; and it&amp;#8217;s not like I&amp;#8217;m doing anything too far outside of what is already C modules for Python.&lt;/p&gt;</description><link>http://swixel.net/post/20318681487</link><guid>http://swixel.net/post/20318681487</guid><pubDate>Mon, 02 Apr 2012 10:01:57 +1000</pubDate><category>couchdb</category><category>twitter</category><category>python</category><category>sfl</category><category>linguistics</category></item><item><title>My own little world of JavaScript.</title><description>&lt;p&gt;My parents bought a Philips Pronto remote control.  A TSU9600, to be precise.  They also bought an extender &amp;#8212; an RFX9600.  The protocol it uses is largely unknown to me at this time, but wireshark and a little bit of port mirroring and that shouldn&amp;#8217;t be a problem.&lt;/p&gt;

&lt;p&gt;The Philips remote runs on a variant of Javascript (prontoscript).  Yes, the entire thing is written in what is effectively synchronous javascript.&lt;/p&gt;

&lt;p&gt;Enter the Samsung Televisions they have.  Interestingly, both of these can have apps written for them in Javascript.  This time it isn&amp;#8217;t something akin to, it &lt;em&gt;is&lt;/em&gt; JS.&lt;/p&gt;

&lt;p&gt;Finally, enter their mobiles &amp;#8212; Samsungs, both.  Now, while Android applications can be written in Javascript (ugh), they have decent browsers, and with the power of jQuery and a box on the network, we have another avenue of Javascript glory.&lt;/p&gt;

&lt;p&gt;Enter node.js.  Now, I&amp;#8217;m ordinarily a Python hacker, or even C++, and, on occasion, an Erlang newbie.  However, as node.js is as close to the twisted of javascript I&amp;#8217;ve ever seen, I thought I&amp;#8217;d give it a whirl.  A week or so later, I&amp;#8217;m playing with express.js and finding it not entirely irksome.&lt;/p&gt;

&lt;p&gt;My idea, at present, is to setup some sort of gateway which takes Pronto commands as if it&amp;#8217;s an extender, running as a relay.  Using asynchronous calls I can push data to the target device (or extender).  This will require some reversing, but should (hopefully) enable a few more homebrew solutions to problems, not to mention ways around lag on the remote itself.  My current aim is to reply my old squeezebox javascript blob with something that runs on a server &amp;#8212;- passing JSON back and forth, asking the remote to do a non-blocking sleep while waiting for updates on the node.js instance.&lt;/p&gt;

&lt;p&gt;I&amp;#8217;ve achieved something similar with cherrpy and sockets (in Python), but JS&amp;lt;-&amp;gt;JS&amp;lt;-&amp;gt;JS should be more fun.  Anyway, the project gets fun after that &amp;#8212;- hooking up the TV to music controls in the room it&amp;#8217;s in&amp;#8230;&lt;/p&gt;</description><link>http://swixel.net/post/19207643614</link><guid>http://swixel.net/post/19207643614</guid><pubDate>Tue, 13 Mar 2012 11:17:21 +1100</pubDate><category>javascript</category><category>home automation</category><category>nodejs</category><category>hacking</category><category>expressjs</category><category>squeezebox</category></item><item><title>Introducing: TrendyNode</title><description>&lt;p&gt;What I have is a single javascript file, hinged on the use of nodejs.&lt;/p&gt;

&lt;p&gt;It stores player information as JSON.&lt;/p&gt;

&lt;p&gt;What it can do perfectly:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;Let the player &amp;#8220;Load&amp;#8221; data;&lt;/li&gt;
&lt;li&gt;Rotate the saves on save request.&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;What it can do well enough to work:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;Authenticate;&lt;/li&gt;
&lt;li&gt;The heartbeat;&lt;/li&gt;
&lt;li&gt;Begin the save request.&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;What it present fails to do:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;Save the data &amp;#8212; requires additional reversing.&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;What it will never do:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;Circumvent VAC;&lt;/li&gt;
&lt;li&gt;Replace TrendyNet (this is for LAN use with achievements on).&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;Authentication is largely a mystery, but I have a workaround in mind if I cannot work out how part of the auth function works &amp;#8212; IP restrictions based on Steam&amp;#8217;s OpenID (for the internet) &lt;em&gt;or &lt;/em&gt;using IP restrictions on LAN (SteamID still applies here, once logged in, it&amp;#8217;s locked until an admin resets it, or 24 hours pass).&lt;/p&gt;
&lt;p&gt;I&amp;#8217;m also mishandling authentication data at the moment &amp;#8212; mostly because I developed this on a &amp;#8216;system-by-system&amp;#8217; setup, restricted to localhost usage.&lt;/p&gt;


&lt;p&gt;If anyone has questions/comments, let me know &amp;#8230; it&amp;#8217;s not like this system is complex, though the binary is seriously annoying due to the use of std::basic_string.&lt;/p&gt;
&lt;ul&gt;&lt;/ul&gt;</description><link>http://swixel.net/post/18460150374</link><guid>http://swixel.net/post/18460150374</guid><pubDate>Wed, 29 Feb 2012 10:20:06 +1100</pubDate></item><item><title>Dungeon Defenders Servers: Steam and TrendyNet</title><description>&lt;p&gt;Generally, I&amp;#8217;d hold this back, but having received an infraction for being blunt, and a bit of abuse through member emails, I figured I&amp;#8217;d be a little more blunt.  Some points:&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;First:  &lt;/strong&gt;&lt;/em&gt;&lt;a href="http://forums.trendyent.com/showthread.php?14864-Read-this-first-or-risk-your-account"&gt;Trendy doesn&amp;#8217;t let you use any tools to &lt;em&gt;modify&lt;/em&gt; your game&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;Second:  &lt;/strong&gt;&lt;/em&gt;&lt;a href="http://forums.trendyent.com/showthread.php?40541-Hacking-Cheating-Exploiting-Glitching-Reporting-and-Item-Checks"&gt;Trendy &lt;em&gt;apparently&lt;/em&gt; actively bans users.&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;Third:&lt;/strong&gt;&lt;/em&gt;  &lt;a href="http://www.wireshark.org/"&gt;Wireshark is free and lets you look at insecure traffic.&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;Fourth:&lt;/strong&gt;&lt;/em&gt;  &lt;a href="http://www.gnu.org/software/binutils/"&gt;Objdump is awesome&lt;/a&gt;&amp;#160;; failing that &lt;a href="http://support.microsoft.com/kb/177429"&gt;dumpbin&lt;/a&gt; will do.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;Five:&lt;/strong&gt;&lt;/em&gt; &amp;#8216;cloudapp.net&amp;#8217; is owned by Microsoft for Azure.&lt;/p&gt;
&lt;p&gt;Things you can find out knowing these points:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;Steam is used for matchmaking (try: dumpbin /imports:steam_api.dll DunDefGame.exe);&lt;/li&gt;
&lt;li&gt;TrendyNet is hosted on Azure, and uses HTTP traffic (not even HTTPS);&lt;/li&gt;
&lt;li&gt;TrendyNet hosts all save data, Steam does not;&lt;/li&gt;
&lt;li&gt;Saves are not feasible using either Trendy or Steam, the way you could script one is quite simple, but to prevent abuse, it&amp;#8217;s not sane;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Apparently &lt;/em&gt;suggesting an eight year old with Wireshark can detect Steam, and a ten year old could detect (and reverse) the HTTP used for TrendyNet is insulting (&lt;a href="http://wiresharkdownloads.riverbed.com/video/wireshark/introduction-to-wireshark/"&gt;note the fairly trivial introduction video to wireshark, and that there are more&lt;/a&gt;).  &lt;em&gt;Update: I got an 8 year old to prove me right&amp;#8230;&lt;/em&gt; &lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;Yes, I have my own TrendyNet backend and decoupled my legitimate install from Steam, without once modifying the game binary &amp;#8230;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Brief update:&lt;/strong&gt; No, I won&amp;#8217;t be giving away my own TE backend code at this time.  It was an experiment I did for research purposes, so I could better help people having issues, not something to be done to enable hacking.  That said, given the average reaction to things, and my assumption of an average level of intelligence/understanding/knowledge, I&amp;#8217;m pretty much done with that.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; As a note, this is Phase #1.&lt;/p&gt;</description><link>http://swixel.net/post/17521230977</link><guid>http://swixel.net/post/17521230977</guid><pubDate>Mon, 13 Feb 2012 11:19:00 +1100</pubDate></item><item><title>Dear AMD ...</title><description>&lt;p&gt;Dear AMD,&lt;/p&gt;

&lt;p&gt;You have APUs which are, quite frankly, neat.  They make consoles look terrible, and you could easily push an AMD64/x86 console out every 2 years at a retail price of $1000 (AUD, not USD).  You could make a platform which developers could actually target, hook into distribution platforms (like Steam) to do your handy work, throw in an OEM copy of Windows 7, something basic like &amp;#8220;MS Security Essentials&amp;#8221; for the anti-viral load, keep keyboard/mouse flexibility, but restrict the hardware.&lt;/p&gt;

&lt;p&gt;The end result would be games on a platform which isn&amp;#8217;t hopelessly outdated in 6 months, but a platform which is accessible and developers could be &lt;em&gt;reasonably&lt;/em&gt; expected to support and target.  Throw in some sort of neat little sticker programme: &amp;#8220;Certified for the AMD Console MK IV&amp;#8221;, and you have yourself a winner.&lt;/p&gt;

&lt;p&gt;What would the internals look like? A laptop &amp;#8212; just add cooling, some glowing bits, and the ability to interface with a TV (oh wait, HDMI does this for you).&lt;/p&gt;

&lt;p&gt;Regards,&lt;/p&gt;
&lt;p&gt;A nerd (who is sick of bad game ports and shoddy code).&lt;/p&gt;</description><link>http://swixel.net/post/16283500685</link><guid>http://swixel.net/post/16283500685</guid><pubDate>Sun, 22 Jan 2012 22:17:22 +1100</pubDate></item><item><title>Scripting languages and Interpreters</title><description>&lt;p&gt;Recently I&amp;#8217;ve been taken with the distinction between scripting languages and their interpreters.  Some are fluid, adaptive, and enable all sorts of magic and trickery that I particularly enjoy abusing.  On the other hand, there are the rigid kind, which usually feature explicit casting.&lt;/p&gt;
&lt;p&gt;I should stop reading compiler design books, but this sort of stuff is just amazing.  It&amp;#8217;s a bit beyond what I usually like doing, but I can see applications &amp;#8230;&lt;/p&gt;</description><link>http://swixel.net/post/12937261499</link><guid>http://swixel.net/post/12937261499</guid><pubDate>Fri, 18 Nov 2011 08:24:19 +1100</pubDate></item><item><title>Modding and people</title><description>&lt;p&gt;Invariably, people don&amp;#8217;t appear to understand the effort taken to modify a game, unless of course they are the ones doing it, or have a similar (or better) level of understanding.&lt;/p&gt;
&lt;p&gt;Various games bring about people who irk me, but more often than not those who might appear to be culprits of it aren&amp;#8217;t, and those who drape themselves in a cloak of understanding often don&amp;#8217;t.  This reversal is probably more infuriating than anything else because the subjects are either long-time franchise fans or computer scientists, who assume that because it&amp;#8217;s the ideal model that it&amp;#8217;ll work (or worse, they don&amp;#8217;t understand the commercial forces which drives the choices, even though they&amp;#8217;ve studied that too).&lt;/p&gt;
&lt;p&gt;I could draw a line in the sand between myself and these people, but in so doing I would be cutting myself off the community as a whole, and I would be modding for nobody but myself (which, frankly, would make it much easier).&lt;/p&gt;
&lt;p&gt;Tropico 4 isn&amp;#8217;t necessarily one of the worse communities, but there is certainly a level of entitlement which rivals Team Fortress 2.  The problem with entitlement is that players &lt;em&gt;believe&lt;/em&gt; that the publisher or a modder should add/fix/remove something because they think it fits within the scope of the game.  Were it necessary, the developer would either add it or possibly DLC it (see maps in the COD franchise).&lt;/p&gt;
&lt;p&gt;I&amp;#8217;m not saying that everyone out there with their hand out is an idiot, or that they need to have a deep understanding of the game, but many of the complaints aren&amp;#8217;t well thought through.&lt;/p&gt;
&lt;p&gt;Aside from modding, you then have the people who make you wonder about humanity.  Those who have tried everything but removing anti-viral programmes, insisting that an application designed to peer and interfere with other applications couldn&amp;#8217;t possibly be causing that fatal cross-thread deadlock that plagues every game on the same engine.  You&amp;#8217;ve got the people who didn&amp;#8217;t read the box/site/page/forum/billboard/poster which screams that their system is inadequate for the game they&amp;#8217;re about to buy.&lt;/p&gt;
&lt;p&gt;You then have the additional &amp;#8220;know-it-alls&amp;#8221;, and I don&amp;#8217;t mean those who are part way through the code trying to unravel the magic (read: people like me), but the people that rave about X, Y and Z, features, being dead wrong about one or more of the things.  Supplemented from time to time with those who want to know every secret to &amp;#8220;perfect&amp;#8221; their experience and get the best score (why would we give that away?).&lt;/p&gt;
&lt;p&gt;To top it off, you have people complaining on various forums about delays and &amp;#8220;unhelpful&amp;#8221; staff on forums/lists, without registering that maybe, &lt;em&gt;just maybe&lt;/em&gt;, there is a reason they&amp;#8217;re not giving away the secrets of the game or that they aren&amp;#8217;t responsible for the delay but under contract can&amp;#8217;t make a comment about the delay.&lt;/p&gt;
&lt;p&gt;Finally, there are the people who are trying to be helpful, and correct things that weren&amp;#8217;t wrong in the first place.  Anachronism has no place in video games, save, perhaps, to demonstrate the path from which the franchise or system has grown.  Want features from that game? Go play it.  The incremented number at the end of the title says one thing to you: this isn&amp;#8217;t the game you&amp;#8217;re talking about, it&amp;#8217;s a new one.  Yes, it looks the same, speaks the same language to you, and probably does many things in the same way.  The differences in the game are not that big, I hear them complain, saying that a new game wasn&amp;#8217;t worth it.  Apparently the difference between your frontal lobe and that of a low-tier primate aren&amp;#8217;t either.&lt;/p&gt;


&lt;p&gt;Entitlement is the sum of everything wrong with the gaming industry.  While you may have a product to move, you can&amp;#8217;t bow to people completely or you end up with a fan base expectant on your compliance.  (This post is, of course, to say nothing of the people who want &amp;#8220;modkits&amp;#8221; for engines &amp;#8212; but if you want to read it that way, go to the beginning and start with that in mind, it probably works equally as well.)&lt;/p&gt;</description><link>http://swixel.net/post/11014706479</link><guid>http://swixel.net/post/11014706479</guid><pubDate>Tue, 04 Oct 2011 18:09:31 +1100</pubDate><category>modding</category><category>people</category><category>entitlement</category><category>gaming</category></item><item><title>Tropico 3 and Tropico 4</title><description>&lt;p&gt;I&amp;#8217;ve now broken both&amp;#8217;s file formats.  I worked out what &lt;a href="http://www.snakebytestudios.com/about/#aboutsnake"&gt;Snake&lt;/a&gt; did, and I&amp;#8217;ve got a semi-functional way to reading the data now.&lt;/p&gt;
&lt;p&gt;Bring on the mods.&lt;/p&gt;
&lt;p&gt;First step: Injecting a duplicate of the farm that grows gold.&lt;/p&gt;</description><link>http://swixel.net/post/10187701168</link><guid>http://swixel.net/post/10187701168</guid><pubDate>Wed, 14 Sep 2011 11:56:31 +1000</pubDate><category>modding</category><category>tropico 4</category><category>tropico 3</category><category>lua</category></item><item><title>Deus Ex: Human Revolution</title><description>&lt;p&gt;Deus Ex: Human Revolution is the &lt;em&gt;best game ever&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;&lt;br/&gt;I do not care that I am an RTS player, or that I generally hate FPS games, the combination of storyline, mechanics, and gameplay make this the best game I have ever played.  The graphics are shiny too, but I didn&amp;#8217;t really take that into consideration (never do).&lt;/p&gt;</description><link>http://swixel.net/post/9488176922</link><guid>http://swixel.net/post/9488176922</guid><pubDate>Sun, 28 Aug 2011 14:16:41 +1000</pubDate></item><item><title>And it's MinGW time...</title><description>&lt;p&gt;As all of my code is crossplatform, driven by OpenGL (usually SFML), and uses crossplatform libraries, I thought it high time I stop using VS C++ Express Edition.  As such, I&amp;#8217;m slowly porting my significant code to use boost (where possible) and be compiled with MinGW.  To achieve this I will need to get a nice crossplatform suite setup, probably in a virtualbox.&lt;/p&gt;
&lt;p&gt;To do this, I need to compile crossplatform versions of:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;strong&gt;SFML&lt;/strong&gt; (1.6 - trivial);&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;LibRocket&lt;/strong&gt; (git version - seems to be trivial);&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Freetype&lt;/strong&gt; (for SFML and LibRocket - should be trivial on Linux XPlatform);&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Boost &lt;/strong&gt;(1.47.0 - because I might as well update);&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Python &lt;/strong&gt;(2.7.2 - so it runs off local 2.x installs for Linux testing);&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ZeroMQ&lt;/strong&gt; (oh noes, the unmentioned variable!).&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;That&amp;#8217;s all that comes to mind for now&amp;#8230; oh, and throwing together makefiles for crossplatform magic.&lt;/p&gt;
&lt;p&gt;Of course this requires a Debian base install, some magic, and some patience&amp;#8230; but for now it&amp;#8217;s nice to be able to port things, ssh in multiple times, use screen, suspend dev neatly on the drive, and actually access tools I&amp;#8217;m used to using&amp;#8230; not to mention setting things up in funky ways.&lt;/p&gt;</description><link>http://swixel.net/post/8204014545</link><guid>http://swixel.net/post/8204014545</guid><pubDate>Fri, 29 Jul 2011 15:07:58 +1000</pubDate></item><item><title>Hatters will hat.</title><description>&lt;p&gt;Alternatively, &amp;#8220;hatters are gonna hat&amp;#8221;.&lt;/p&gt;

&lt;p&gt;You read it here first.  Or not.   I don&amp;#8217;t care either way.&lt;/p&gt;</description><link>http://swixel.net/post/7467655672</link><guid>http://swixel.net/post/7467655672</guid><pubDate>Mon, 11 Jul 2011 07:48:38 +1000</pubDate></item><item><title>AGPLv3 Ext/Plugin on the way for SourceMod</title><description>&lt;p&gt;&lt;strong&gt;Disclaimer&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;I&amp;#8217;ll start with the following disclaimer: I am not a lawyer, nor am I pretending to be one.  The following post does not constitute, simulate, emulate, or in any way (including the aforementioned) pretend to be legal advice.  This is simply my understanding of how my licencing choice affects users.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Backstory&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I&amp;#8217;m going to release a stable and fast modification for a couple of games &amp;#8230; I&amp;#8217;m going to release it under the AGPLv3, bearing in mind that I can run it on my own server under GPLv3, thus not sharing my own modifications until stable (or until I feel like it).&lt;/p&gt;
&lt;p&gt;I&amp;#8217;m told that such an action is open hypocrisy &amp;#8212; I&amp;#8217;m forcing others to share with others, but keeping my own changesets.  Bear in mind that if I take an AGPLv3 changeset into my &amp;#8216;core&amp;#8217; branch, that I can no longer run my own server&amp;#8217;s extension under GPLv3, and will then need to share my own code.  Of course, if the idea/notion/whatever already exists, or I have test code which is under the GPL, or may obtain code that is, I don&amp;#8217;t need to share it &amp;#8212; only if the person who owns the code won&amp;#8217;t contribute it as GPLv3, which they can&amp;#8217;t, because it needs to be AGPLv3.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What does this mean?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This means that by writing my extension, the include file, and the sample plugin under the AGPLv3 all users of the extension will be required to share their source with anyone who can access the server in such a manner that the extension is relevant to the user&amp;#8217;s interactions.  This means that if, by way of example, you cannot get past the login page (i.e. cannot pass the &amp;#8216;password&amp;#8217; stage), you do not have the right to request the plugin source.  There are ways around this (as usual), but it&amp;#8217;s really a case by case basis.&lt;/p&gt;
&lt;p&gt;If you want to release a derivative or extension plugin from my core, or any other derivation of it, you must release it as AGPLv3.  &lt;strong&gt;There are no exceptions&lt;/strong&gt;.  The only person who can release a GPLv3 version (i.e. not share the source with users on request) is me, and only provided that I do not accept contributions on the AGPLv3 code.&lt;/p&gt;
&lt;p&gt;To resolve any potential conflicts, I will maintain my &amp;#8216;core&amp;#8217; branch, which is solely my work.  I will also maintain a &amp;#8216;community&amp;#8217; branch, on which I will accept contributions from people in the community.  My &amp;#8216;core&amp;#8217; branch is open to suggestsions and requests (which, unless coded by someone else, maintains my right to use it in GPLv3).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Where is your server?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Simply put, I don&amp;#8217;t have one, and honestly have no intention of running one.  However, if I do run one (say, temporarily off a VPS or a dedicated server I maintain), I want to have the ability to playtest &lt;em&gt;potential features&lt;/em&gt; which will be applied to the core (and probably the community version) without having to release them.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Why should I trust you?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I don&amp;#8217;t &amp;#8220;mod&amp;#8221; games these days.  I write &amp;#8220;meta-mods&amp;#8221;, or modifications which support other modifications.  Examples of this are the CTX natives I&amp;#8217;ve supplied for &lt;a href="http://forums.alliedmods.net/showthread.php?t=159678"&gt;Counter-Strike Source&lt;/a&gt; and &lt;a href="http://forums.alliedmods.net/showthread.php?t=159423"&gt;Team Fortress 2&lt;/a&gt;, and less &amp;#8216;magically&amp;#8217; &lt;a href="https://bitbucket.org/aws/wtff"&gt;Watch That Friendly Fire&lt;/a&gt; (which I haven&amp;#8217;t really maintained, or fully released), and &lt;a href="https://forums.alliedmods.net/showthread.php?t=140862"&gt;my plugin for toggling capture points&lt;/a&gt;.  You might note that none of them are actual gameplay changes (except maybe the capture point breaker), and are designed (more or less) to support your own gameplay modifications.  I have no interest in running a server and trying to &amp;#8216;make profit out of ads on my MOTD&amp;#8217;.  With all of that said, even if I change my mind and want to run a server and try to &amp;#8216;monetise&amp;#8217; it (as it were), I would be bound by the licence I chose, such that I could not just take AGPLv3 patches into my own tree.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;AGPLv3 Fears&lt;br/&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Neither the &amp;#8216;configuration&amp;#8217; file, nor the &amp;#8216;offset&amp;#8217; file are bound by AGPLv3 because they do not contain any copyrightable data.  Furthermore, if you&amp;#8217;re worried, they are attached via SourceMod interfaces, which remain GPLv3.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Is there a way around this so I don&amp;#8217;t have to share my modifications to your code?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Only if you can convince me that you should have a GPLv3 version and that others shouldn&amp;#8217;t.  Good luck I&amp;#8217;m unlikely to be swayed.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Why did you choose AGPLv3?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I&amp;#8217;m working on a gamemode extension/modification &lt;em&gt;for free&lt;/em&gt;.  As such, I&amp;#8217;m giving this extension and attached plugin (and the availability to edit both) to the community, &lt;em&gt;for free&lt;/em&gt;.  As such I&amp;#8217;d like community members to actually give back, share ideas, and adapt the gameplay, creating a nice, neat, sensible experience for the users of their servers.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;But can&amp;#8217;t you just violate that and not share it?&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Sure.  And as the author of the code I could just use the GPLv3 version of my code (as I have the right to change the licence on my work) and adapt and run awesome versions on my own server.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;That&amp;#8217;s not fair!&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Well, considering you&amp;#8217;re getting several days worth of work, a re-vitalised version of my old Eventscripts plugin, which will (with any luck) run quickly, cleanly, and neatly, for free, I don&amp;#8217;t see how.  For anyone who wants to complain that I can use my own code privately, maybe you should write your own GPLv3 version, being certain not to copy my code (you&amp;#8217;re free to use GPLv3 code and roll that in, because that&amp;#8217;s how the licence works, but you can&amp;#8217;t roll in AGPLv3 code unless you&amp;#8217;re licencing under AGPLv3).&lt;/p&gt;
&lt;p&gt;&lt;em&gt;That&amp;#8217;s still not fair!&lt;br/&gt;&lt;/em&gt;I hate to be the one to tell you this, but I have the right to not share my code at all, how about instead of whinging at me that I chose a licence that ensures you share, you be grateful?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What if I don&amp;#8217;t modify the extension?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Just point users to the core or community repository (to be shared when released).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;br/&gt;What if I modify the plugin?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;It&amp;#8217;s AGPLv3 because it is a derived work (derived from both SourceMod &amp;#8212; GPLv3 &amp;#8212; and my AGPLv3 extension to SourceMod).  Because it is directly attached to my extension, and the include I provide is AGPLv3, no matter whether or not you replicate or rename the variables in the natives, you&amp;#8217;re still bound by AGPLv3.  In the same way, you&amp;#8217;re expected to share your source.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;How do I do that?&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;When I release both extension and &amp;#8216;sample plugin&amp;#8217; (which is likely to be bare features for the initial release), I will be creating a thread for each.  At which point you&amp;#8217;ll have the choice of attaching the SourcePawn to a post on the plugin thread, and linking users there, &lt;em&gt;or&lt;/em&gt; hosting it in a code repository (on something like Bitbucket or GitHub).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;I hate the licence / I won&amp;#8217;t use it if it&amp;#8217;s AGPLv3 / I hate you / This isn&amp;#8217;t fair!&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Then don&amp;#8217;t use it.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Will you hunt me down and take action if I violate your licence?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Yes.  And I&amp;#8217;m sure your service provider (be it your ISP, GSP, or other service provider) will want to stay away from violations.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Why?&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;I&amp;#8217;m giving this, with the expectation that others will either use it, or adapt it.  Either way, my expectation is that you will share, as I have with you.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;But I don&amp;#8217;t want to share my exclusive server modifications?!&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Then follow the licence.  If you&amp;#8217;re using my extension, you are required to share the source with anyone who can access your server in a way that makes it known that the plugin and extension are there.  If you use the unmodified version of the extension and the plugin, and want to add &amp;#8216;extra features&amp;#8217;, try to find a way separate to it that allows you to do what you need.  For instance, if you want the &amp;#8216;LoneWolf&amp;#8217; to have a specialised weapon rather than what I&amp;#8217;m giving it, hook the respawn event then give it to the player on the RED or BLU team (depending on what I do) &amp;#8212; just don&amp;#8217;t touch the console variable or anything else built into the extension and plugin.  That is, you can still modify things &lt;em&gt;around&lt;/em&gt; it, but you can&amp;#8217;t touch it.  So if you want donors who are the LoneWolf to have extra health, you&amp;#8217;re pretty stuffed unless you run another hook to override mine (&lt;em&gt;unexpected behaviour alert!&lt;/em&gt;), but if you simply want it to look different, or to have icons for some people, you could always hook various other things, based on the team I&amp;#8217;m using.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;So you&amp;#8217;re not making it impossible to add things external to this?&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;No.  If you want to work on the &amp;#8216;team by team&amp;#8217; basis to do things to the &amp;#8216;LoneWolf&amp;#8217;, you still can.  Bearing in mind some things (like OnTakeDamage) are hooked, and so you may experience some strange behaviour, in which case you should probably write it into the extension.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Will you add &amp;#8216;donor support mode&amp;#8217; to this, whatever this is?&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;It&amp;#8217;s partially supported in what will be the initial release, but I will not be adding stupid things like &amp;#8216;donors take less damage&amp;#8217; or &amp;#8216;donors move faster&amp;#8217;.  There will be options to abuse part of the modification using standard plugin features (advancing user statistics) based on the fact that some people may need them to &amp;#8216;reset&amp;#8217; players if they mess up a database command.&lt;/p&gt;
&lt;p&gt;Will I support admin/donor abuse? &lt;em&gt;No&lt;/em&gt;.&lt;/p&gt;


&lt;p&gt;I hope that this is all relatively clear.  My plan is not to hurt anyone, or to put anyone at a disadvantage.  If you feel it&amp;#8217;s unfair that I&amp;#8217;m not sharing &amp;#8220;the best&amp;#8221; of my code, or that I&amp;#8217;m allowed to maintain my own core to run on my own server, remember that various other authors (I&amp;#8217;m looking at &amp;#8216;voogru&amp;#8217;) run private extensions and plugins), sharing some of the neat things, and others still don&amp;#8217;t share at all.  The only difference between my choice and their choice, is that I choose to share in the first place.  The option to keep my code private is taken through my right to licence my code under different licences (my choices being limited to GPLv3 and AGPLv3, as I&amp;#8217;m using GPLv3 code).&lt;/p&gt;
&lt;p&gt;If you think that this is unfair, I&amp;#8217;d like you to take a moment and consider that I have this extension working under MetaMod:Source, which would mean that I could release a crippled version for free, as a binary, and never give you the source.  While I want people to have it, I basically do not want the community&amp;#8217;s trust to be abused, so I am taking this road.&lt;/p&gt;
&lt;p&gt;I hope you understand my choice, but given the amount of time spend researching various aspects of this (which is part of the reason the CTX modifications are available at all), I believe that this is the best choice.&lt;/p&gt;</description><link>http://swixel.net/post/7069198290</link><guid>http://swixel.net/post/7069198290</guid><pubDate>Thu, 30 Jun 2011 13:22:20 +1000</pubDate><category>tf2</category><category>cs:s</category><category>modding</category><category>sourcemod</category><category>metamod:source</category><category>agplv3</category><category>licences</category></item><item><title>TF2 hosting: why you want Linux</title><description>&lt;p&gt;There are many reasons you want to be on Linux for hosting any Valve game, though many of them are hinged on my experiences.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Subjective&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;Hosts who can roll out a Linux install, tend to have a better idea of what&amp;#8217;s happening;&lt;/li&gt;
&lt;li&gt;Hosts who roll out Linux tend to have neat control panels (rolling their own more often than using TCAdmin), which they build, not buy (cheaper!).&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Objective:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;OpenSource servers lower the cost of the server (as opposed to paying for huge licences);&lt;/li&gt;
&lt;li&gt;Extensions are easier to build for Linux, due to opensource toolchains, and easier to read (or at least less obfuscated) code (symbols, woo!).&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;Now, while some of these may change (free control panel xplatform?; valve stripping symbols from Linux bins), the cost difference should remain.&lt;/p&gt;
&lt;p&gt;In my experience, the only host that continues to use Linux in Australia is &lt;a title="GameServers.com" href="http://www.gameservers.com/?ref=1648948"&gt;GameServers.com&lt;/a&gt;, who also offer free basic webhosting (like Hypernia and many others), and discounts on voice servers (for who who need them).&lt;/p&gt;
&lt;p&gt;The other options out there like &lt;a title="Hypernia" href="http://www.hypernia.com/982.html"&gt;Hypernia&lt;/a&gt;, which are Windows hosts and give you free voice hosting and webhosting (should you take them up on it).&lt;/p&gt;
&lt;p&gt;The real point to be made is that Linux hosts like GameServers come out slightly cheaper (even with a similar vioce server included), and allow modders a greater speed in development, with direct access to all of the toys.&lt;/p&gt;
&lt;p&gt;If you want to get serious about tweaking your game, maybe it&amp;#8217;s time you switched to a better platform.&lt;/p&gt;
&lt;p&gt;( Worried about not being able to test locally? Worry not! You &lt;a title="VirtualBox" href="http://www.virtualbox.org/"&gt;VirtualBox&lt;/a&gt; to test locally with a Debian or Ubuntu install, following the simple instructions on &lt;a title="srcds" href="http://srcds.com/"&gt;srcds.com&lt;/a&gt;. )&lt;/p&gt;</description><link>http://swixel.net/post/6470854899</link><guid>http://swixel.net/post/6470854899</guid><pubDate>Mon, 13 Jun 2011 10:12:46 +1000</pubDate><category>tf2</category><category>gaming</category><category>hosting</category></item><item><title>Intel GPUs and VBOs</title><description>&lt;p&gt;After about a week of playing with code, I ran a test on my laptop: librocket broke, the shaders lagged, and my system came to life and killed everything in the room.&lt;/p&gt;
&lt;p&gt;After an uneventful trip to the necromancer, I started looking at where it failed, and the Intel GPU was the first place I checked: that was it.  So I added a simple function to a class:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;void DetectOGLAdv() &lt;br/&gt;{&lt;br/&gt;    OGLAdvEnabled = true; // Assume it&amp;#8217;s good&lt;br/&gt;&lt;br/&gt;    // PostFX disable (for those using SFML)&lt;br/&gt;    if(!sf::PostFX::CanUsePostFX)&lt;br/&gt;        OGLAdvEnabled = false;&lt;br/&gt;&lt;br/&gt;    // Intel GPUs are horrible&lt;br/&gt;    if(strcmp((const char *)glGetString(GL_VENDOR),&amp;#8221;Intel&amp;#8221;) == 0)&lt;br/&gt;        OGLAdvEnabled = false;&lt;br/&gt;}&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;As I find things that break my code I&amp;#8217;ll add to it, but I thought it might be useful to point out the VBO fault exists even in the newer cards (at least on Windows).&lt;/p&gt;
&lt;p&gt;The other workaround is, of course, finding a way to ship MESA drivers for Window to enable users to run it&amp;#8230; the real difficulty will be in determining where the MESA drivers start, and DirectX begins (my understanding is that DirectX isn&amp;#8217;t influenced, but it&amp;#8217;ll be time to find out soon, woo!).&lt;/p&gt;</description><link>http://swixel.net/post/5947279037</link><guid>http://swixel.net/post/5947279037</guid><pubDate>Sun, 29 May 2011 10:24:00 +1000</pubDate><category>opengl</category><category>mesa</category><category>intel gpus</category></item><item><title>Engine now in the pipeline!</title><description>&lt;p&gt;GWEN didn&amp;#8217;t work out; sfengine didn&amp;#8217;t work out; but &lt;a title="LibRocket" href="http://librocket.com"&gt;LibRocket&lt;/a&gt; did!&lt;/p&gt;
&lt;p&gt;So the engine is basically just SFML + LibRocket.&lt;/p&gt;
&lt;p&gt;This may seem a bit weak, but you need to remember I have to interface everything, plug up my own stopgap solutions for things &amp;#8212; SFML is just a compatibility layer between a bunch of really neat technologies (most notably OpenAL, libsndfile, and FreeType &amp;#8212; all of which I was using before) and multiple platforms (I&amp;#8217;m yet to actually start work on the Mac here to see how much needs love for GCC and/or Xcode).&lt;/p&gt;
&lt;p&gt;LibRocket rocks, but if you&amp;#8217;re going to use the included SFML layer, remember to invert the Mousewheel delta (i.e. throw a - before it in the switch), otherwise your mousewheel actions will go backwards ;)&lt;/p&gt;</description><link>http://swixel.net/post/5387286373</link><guid>http://swixel.net/post/5387286373</guid><pubDate>Wed, 11 May 2011 19:38:17 +1000</pubDate><category>sfml</category><category>librocket</category></item><item><title>My SFML Engine</title><description>&lt;p&gt;Calling my SFML work an &amp;#8216;engine&amp;#8217; is a bit of an exaggeration, simply because &lt;a href="http://sfml-dev.org"&gt;SFML&lt;/a&gt; does most of the heavy lifting for me, using most of what I was using before (including OpenAL, OpenGL, and FreeType), while still giving me the power to use OpenGL.&lt;/p&gt;
&lt;p&gt;So the status is:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;strong&gt;GUI is &lt;a href="http://gwen.facepunchstudios.com/"&gt;GWEN&lt;/a&gt; &lt;/strong&gt;(using an &lt;a href="http://dl.dropbox.com/u/13961269/src/gwen/SFML.cpp"&gt;updated/fixed&lt;/a&gt; version of &lt;a href="http://www.facepunch.com/threads/888841-Gwen?p=20043118&amp;amp;viewfull=1#post20043118"&gt;voodooattack&amp;#8217;s SFML renderer&lt;/a&gt;);&lt;/li&gt;
&lt;li&gt;Input is &lt;strong&gt;working&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;That&amp;#8217;s really all for now. This is ~24 hours after I started an SFML version of my game&amp;#8230;&lt;/p&gt;
&lt;ul&gt;&lt;/ul&gt;</description><link>http://swixel.net/post/5082025129</link><guid>http://swixel.net/post/5082025129</guid><pubDate>Sun, 01 May 2011 08:31:04 +1000</pubDate></item><item><title>'sfengine'</title><description>&lt;p&gt;While talking to a friend (who is using SFML, which is, for all intents and purposes, an engine in its own right), I stumbled across &amp;#8216;sfengine&amp;#8217;, which contains just about everything I want &amp;#8212; except that it runs on SFML 2.0, which is still &amp;#8216;unstable&amp;#8217; (read: under development). Given I run bleeding edge Gentoo, this isn&amp;#8217;t really a downside&amp;#8230;&lt;/p&gt;
&lt;p&gt;For now I&amp;#8217;m suspending work on my engine to have a look at it, as it may well resolve any number of issues I&amp;#8217;ve had, including, but not limited to, managing scaling of certain objects.&lt;/p&gt;</description><link>http://swixel.net/post/5056008099</link><guid>http://swixel.net/post/5056008099</guid><pubDate>Sat, 30 Apr 2011 11:00:42 +1000</pubDate></item><item><title>What is an 'engine'?</title><description>&lt;p&gt;I&amp;#8217;ve had a few people ask me what exactly an engine is, and why it&amp;#8217;s so difficult to make one.&lt;/p&gt;
&lt;p&gt;First of all, it is not difficult to make an engine, it is difficult to make a good one (my current work should not be mistaken for a &amp;#8216;good engine&amp;#8217;, at least not yet).  The difference between something which works, and something which is both dynamic and clean, is that you can build an &amp;#8216;engine&amp;#8217; which does precisely what you tell it (by hard-coding every possible outcome), whereas a dynamic/clean engine enables you to add things easily, externally, using an interface of some kind (usually an Application Programming Interface, like an API).&lt;/p&gt;
&lt;p&gt;Secondly, to answer &amp;#8216;what is an engine&amp;#8217; in brief: an engine is effectively a series of mechanisms (functions or methods, with the option for classes or modules, depending on your language).  These mechanisms perform logical tasks, like drawing a box, or detecting a mouse click.  There are different types or mechanisms (e.g. callbacks which fire when something is done, literally &amp;#8216;calling back&amp;#8217;).  There are different purposes (input from keyboard/mouse, audio output, graphical output).  Each of these parts require their own distinct components, usually external (unless you&amp;#8217;re building the hardware too, in which case you probably have to do it yourself to some extent).&lt;/p&gt;
&lt;p&gt;It is not difficult to build basic mechanisms, but it is time consuming to decide what you want.  Even though I entered this with a fairly good idea of what I wanted, I have already had to compromise when I found elements I chose to use don&amp;#8217;t quite do what I want &amp;#8212; and not wanting to have to modify them heavily, thus breaking ease-of-update later, I had to make minor changes (e.g. I now have a single global variable, and this is rather annoying).&lt;/p&gt;
&lt;p&gt;I hope this provides an answer suitable to the question.  I might, at a later stage, run through building some trivial components in a non-OOP way, for those who are interested (feedback on this would be useful, either here or via IM/e-mail for those who have it, so I know I&amp;#8217;m not wasting my time before I begin).&lt;/p&gt;</description><link>http://swixel.net/post/5040428040</link><guid>http://swixel.net/post/5040428040</guid><pubDate>Fri, 29 Apr 2011 23:22:55 +1000</pubDate><category>engine</category><category>rant</category></item></channel></rss>

