<?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/33917/">
		<title>Blog for Frank Carney 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-11-21T09:22:23+00:00</dc:date>
		<items>
			<rdf:Seq>
				<rdf:li rdf:resource="http://www.garagegames.com/blogs/33917/14052"/>
				<rdf:li rdf:resource="http://www.garagegames.com/blogs/33917/14048"/>
				<rdf:li rdf:resource="http://www.garagegames.com/blogs/33917/14047"/>
				<rdf:li rdf:resource="http://www.garagegames.com/blogs/33917/13496"/>
				<rdf:li rdf:resource="http://www.garagegames.com/blogs/33917/13425"/>
				<rdf:li rdf:resource="http://www.garagegames.com/blogs/33917/13191"/>
				<rdf:li rdf:resource="http://www.garagegames.com/blogs/33917/12681"/>
				<rdf:li rdf:resource="http://www.garagegames.com/blogs/33917/12647"/>
				<rdf:li rdf:resource="http://www.garagegames.com/blogs/33917/12633"/>
				<rdf:li rdf:resource="http://www.garagegames.com/blogs/33917/12515"/>
			</rdf:Seq>
		</items>
	</channel>
	<item rdf:about="http://www.garagegames.com/blogs/33917/14052">
		<dc:format>text/html</dc:format>
		<dc:date>2007-12-25T23:29:02+00:00</dc:date>
		<dc:creator>Frank Carney</dc:creator>
		<title>Milestone Reached: Mission Launched from Database</title>
		<link>http://www.garagegames.com/blogs/33917/14052</link>
		<description>Well I reached a simple milestone today.  I created a database that stores barebones mission data as script.  Then I developed a routine that will retrieve the mission from the database and launch it.  It is overly simplistic right now, but it is a milestone I have been wanting to reach.&lt;br&gt;&lt;br&gt;The next steps:&lt;br&gt;1. Upon mission completing load: Populate mission with objects from object table associated with mission table entry.&lt;br&gt;2. Upon objects populating mission: Choose object to spawn as or object to take control of for player.&lt;br&gt;3. Save object state back to object table.&lt;br&gt;&lt;br&gt;These are also simple milestones, but right now to get anything done I have to take baby steps.  I am also guessing I will be learning a lot more about how missions are loaded.  Also, yes, I want to not generate lighting for mission objects for now.  So all objects will be loaded post mission loading.  Faster for now, and unless there is sufficient reason (say for lighting effects) I will not be letting the lighting routines light anything but the terrain.&lt;br&gt;&lt;br&gt;Yeah me!!!</description>
	</item>
	<item rdf:about="http://www.garagegames.com/blogs/33917/14048">
		<dc:format>text/html</dc:format>
		<dc:date>2007-12-24T23:08:53+00:00</dc:date>
		<dc:creator>Frank Carney</dc:creator>
		<title>Creating Objects Without Creating Them</title>
		<link>http://www.garagegames.com/blogs/33917/14048</link>
		<description>I am in the process of creating a simple routine to make a simple dynamic mission.  The only thing static is the terrain file.  I think I have come up with a really sneaky way of getting the terrain widgets into strings.  First I am using some methods to serialize my objects to strings.  I have combined a couple of things in these resouces:&lt;br&gt;&lt;a href='http://www.garagegames.com/index.php?sec=mg&amp;amp;mod=resource&amp;amp;page=view&amp;amp;qid=8529'&gt;www.garagegames.com/index.php?sec=mg&amp;amp;mod=resource&amp;amp;page=view&amp;amp;qid=8529&lt;/a&gt;&lt;br&gt;&lt;a href='http://www.garagegames.com/index.php?sec=mg&amp;amp;mod=resource&amp;amp;page=view&amp;amp;qid=12492'&gt;www.garagegames.com/index.php?sec=mg&amp;amp;mod=resource&amp;amp;page=view&amp;amp;qid=1249...&lt;/a&gt;&lt;br&gt;&lt;br&gt;I have combined the two to get serialization for all objects.  The first one is the serialization to string.  Then I stole the dynamic string allocation from cryptainer.  This allows me to store the definition into a variable rather than just to file.&lt;br&gt;&lt;br&gt;Okay, here is where I get really sneaky.  Take the following code:&lt;br&gt;&lt;br&gt;&lt;div class='codeblock'&gt;&lt;pre&gt;function createSky(%type)&lt;br&gt;{&lt;br&gt;   %obj = new Sky(Sky) {&lt;br&gt;      position = &amp;quot;336 136 0&amp;quot;;&lt;br&gt;      rotation = &amp;quot;1 0 0 0&amp;quot;;&lt;br&gt;      scale = &amp;quot;1 1 1&amp;quot;;&lt;br&gt;      materialList = &amp;quot;~/data/skies/sky_day.dml&amp;quot;;&lt;br&gt;      cloudHeightPer[0] = &amp;quot;0.349971&amp;quot;;&lt;br&gt;      cloudHeightPer[1] = &amp;quot;0.25&amp;quot;;&lt;br&gt;      cloudHeightPer[2] = &amp;quot;0.199973&amp;quot;;&lt;br&gt;      cloudSpeed1 = &amp;quot;0.0001&amp;quot;;&lt;br&gt;      cloudSpeed2 = &amp;quot;0.0002&amp;quot;;&lt;br&gt;      cloudSpeed3 = &amp;quot;0.0003&amp;quot;;&lt;br&gt;      visibleDistance = &amp;quot;500&amp;quot;;&lt;br&gt;      fogDistance = &amp;quot;300&amp;quot;;&lt;br&gt;      fogColor = &amp;quot;0.82 0.828 0.844 1&amp;quot;;&lt;br&gt;      fogStorm1 = &amp;quot;0&amp;quot;;&lt;br&gt;      fogStorm2 = &amp;quot;0&amp;quot;;&lt;br&gt;      fogStorm3 = &amp;quot;0&amp;quot;;&lt;br&gt;      fogVolume1 = &amp;quot;300 0 71&amp;quot;;&lt;br&gt;      fogVolume2 = &amp;quot;0 0 0&amp;quot;;&lt;br&gt;      fogVolume3 = &amp;quot;0 0 0&amp;quot;;&lt;br&gt;      fogVolumeColor1 = &amp;quot;128 128 128 -2.22768e+038&amp;quot;;&lt;br&gt;      fogVolumeColor2 = &amp;quot;128 128 128 0&amp;quot;;&lt;br&gt;      fogVolumeColor3 = &amp;quot;128 128 128 -1.70699e+038&amp;quot;;&lt;br&gt;      windVelocity = &amp;quot;1 1 0&amp;quot;;&lt;br&gt;      windEffectPrecipitation = &amp;quot;1&amp;quot;;&lt;br&gt;      SkySolidColor = &amp;quot;0.547 0.641 0.789 0&amp;quot;;&lt;br&gt;      useSkyTextures = &amp;quot;1&amp;quot;;&lt;br&gt;      renderBottomTexture = &amp;quot;0&amp;quot;;&lt;br&gt;      noRenderBans = &amp;quot;0&amp;quot;;&lt;br&gt;         locked = &amp;quot;true&amp;quot;;&lt;br&gt;   };&lt;br&gt;&lt;br&gt;   %retval = %obj.saveToString();&lt;br&gt;   %obj.delete();&lt;br&gt;&lt;br&gt;   return %retval;&lt;br&gt;}&lt;/pre&gt;&lt;/div&gt;&lt;br&gt;This works fine and I can serialize the data this way with the &amp;quot;Sky&amp;quot; object.  However, what happens when it is an object that needs the scenegraph?  Take the next bit of code:&lt;br&gt;&lt;br&gt;&lt;div class='codeblock'&gt;&lt;pre&gt;function createTerrain(%terrainFile)&lt;br&gt;{&lt;br&gt;   %obj = new TerrainBlock(Terrain) {&lt;br&gt;      rotation = &amp;quot;1 0 0 0&amp;quot;;&lt;br&gt;      scale = &amp;quot;1 1 1&amp;quot;;&lt;br&gt;      terrainFile = %terrainFile;&lt;br&gt;      squareSize = &amp;quot;8&amp;quot;;&lt;br&gt;      emptySquares = &amp;quot;&amp;quot;;&lt;br&gt;      bumpScale = &amp;quot;1&amp;quot;;&lt;br&gt;      bumpOffset = &amp;quot;0.01&amp;quot;;&lt;br&gt;      zeroBumpScale = &amp;quot;8&amp;quot;;&lt;br&gt;      tile = &amp;quot;1&amp;quot;;&lt;br&gt;         position = &amp;quot;-1024 -1024 0&amp;quot;;&lt;br&gt;         locked = &amp;quot;true&amp;quot;;&lt;br&gt;   };&lt;br&gt;&lt;br&gt;   %retval = %obj.saveToString();&lt;br&gt;   %obj.delete();&lt;br&gt;&lt;br&gt;   return %retval;&lt;br&gt;}&lt;/pre&gt;&lt;/div&gt;&lt;br&gt;This won't work.  The TerrainBlock needs the scenegraph to instantiate itself.  So what to do.  Well, you could lie to it by doing this:&lt;br&gt;&lt;br&gt;&lt;div class='codeblock'&gt;&lt;pre&gt;function createTerrain(%terrainFile)&lt;br&gt;{&lt;br&gt;   %obj = new ScriptObject(Terrain) {&lt;br&gt;      rotation = &amp;quot;1 0 0 0&amp;quot;;&lt;br&gt;      scale = &amp;quot;1 1 1&amp;quot;;&lt;br&gt;      terrainFile = %terrainFile;&lt;br&gt;      squareSize = &amp;quot;8&amp;quot;;&lt;br&gt;      emptySquares = &amp;quot;&amp;quot;;&lt;br&gt;      bumpScale = &amp;quot;1&amp;quot;;&lt;br&gt;      bumpOffset = &amp;quot;0.01&amp;quot;;&lt;br&gt;      zeroBumpScale = &amp;quot;8&amp;quot;;&lt;br&gt;      tile = &amp;quot;1&amp;quot;;&lt;br&gt;         position = &amp;quot;-1024 -1024 0&amp;quot;;&lt;br&gt;         locked = &amp;quot;true&amp;quot;;&lt;br&gt;   };&lt;br&gt;&lt;br&gt;   %retval = %obj.saveToString();&lt;br&gt;   %retval = strreplace(%retval, &amp;quot;ScriptObject&amp;quot;, &amp;quot;TerrainBlock&amp;quot;);&lt;br&gt;   %obj.delete();&lt;br&gt;&lt;br&gt;   return %retval;&lt;br&gt;}&lt;/pre&gt;&lt;/div&gt;&lt;br&gt;Now I can create any object that the game has regardless of dependencies.  Then I can just change the object type with a new type.  In this instance I changed the object type to &amp;quot;TerrainBlock&amp;quot;.  The nice thing is I get the ability to use the code itself to create the object definition and can create any object at any time.  This would allow things like generating a new mission while already in a mission that will not disturb the current mission.&lt;br&gt;&lt;br&gt;Can you say &amp;quot;random dungeons&amp;quot;?</description>
	</item>
	<item rdf:about="http://www.garagegames.com/blogs/33917/14047">
		<dc:format>text/html</dc:format>
		<dc:date>2007-12-24T07:07:28+00:00</dc:date>
		<dc:creator>Frank Carney</dc:creator>
		<title>Another Sqlite Blog</title>
		<link>http://www.garagegames.com/blogs/33917/14047</link>
		<description>I finally picked up where I left off last September and messed with writing sqlite functions.  I made some great strides in figuring out how to copy a table and changing a field name in the process.  It is a pain to do, but it was not too bad.  Basically I had to use a combination of &amp;quot;pragma&amp;quot; statements to get column information and copy the data except for the rows that do not match.  I cannot understand why sqlite would care if I copied data from one row to another of a different name.  Either that or it does not understand my intentions.  If anyone understands how to copy something like this:&lt;br&gt;&lt;br&gt;&lt;div class='codeblock'&gt;&lt;pre&gt;INSERT INTO table2(p,a,b) SELECT c,a,b FROM table1&lt;/pre&gt;&lt;/div&gt;&lt;br&gt;This code failed with type miss match messages.&lt;br&gt;&lt;br&gt;How do I get sqlite to copy the data from c to p?  I ended up ignoring that field as it is an PRIMARY KEY field.  I ended up doing this:&lt;br&gt;&lt;br&gt;&lt;div class='codeblock'&gt;&lt;pre&gt;INSERT INTO table2(a,b) SELECT a,b FROM table1&lt;/pre&gt;&lt;/div&gt;&lt;br&gt;I figured it would generate the necessary values on its own.&lt;br&gt;&lt;br&gt;I have developed a number of helper functions for creating databases, creating game specific tables, etc.  My next step is to actually produce a dynamic mission from this information.  Hopefully I can get something working in the next few days.  Alas the holidays are upon me and that time may be spoken for.&lt;br&gt;&lt;br&gt;Also, I uncovered a couple of bugs in the sqliteobject code.  I put those changes in the following resource page:&lt;br&gt;&lt;a href='http://www.garagegames.com/index.php?sec=mg&amp;amp;mod=resource&amp;amp;page=view&amp;amp;qid=7281'&gt;www.garagegames.com/index.php?sec=mg&amp;amp;mod=resource&amp;amp;page=view&amp;amp;qid=7281&lt;/a&gt;&lt;br&gt;&lt;br&gt;Merry Christmas everyone!!!&lt;br&gt;May God bless you.</description>
	</item>
	<item rdf:about="http://www.garagegames.com/blogs/33917/13496">
		<dc:format>text/html</dc:format>
		<dc:date>2007-09-03T04:25:27+00:00</dc:date>
		<dc:creator>Frank Carney</dc:creator>
		<title>SQLite is Fun!</title>
		<link>http://www.garagegames.com/blogs/33917/13496</link>
		<description>I have been playing with SQLite for creating my databases for a game concept I am working on.  I am using the SQLite resources with the TGE engine.  Right now I am in the &amp;quot;create the functions that manipulate the databases&amp;quot; phase.  It is really a lot of fun.  I never thought databases could be so fun.  &lt;br&gt;&lt;br&gt;For starters I have created a &amp;quot;maindatabase.sdb&amp;quot; that is opened when databases are initialized.  This function is called &amp;quot;databaseInit()&amp;quot;.  It goes through and tries to open the database, query for a header table, query for other databases, and then loads and opens the other databases.  The instances of these databases are stored in a scriptGroup that automagically closes all the databases when it is deleted (via the onRemove callback of a scriptGroup object).  The function also assigns a callback for error messages with the message customized to show which database it came from.&lt;br&gt;&lt;br&gt;Another function I wrote creates a new database and puts an entry into the main database as well as some initial data in the database.&lt;br&gt;&lt;br&gt;I still need to write some support functions to handle deleting (and/or unreferencing a database in the maindatabase), referencing an existing database into the main database, and various table manipulation routines custom to my game concept.  Some functions I want are altering existing tables, copying tables, etc.&lt;br&gt;&lt;br&gt;The reason I wrote this blog is so I can ask the question, &amp;quot;Would some working code be useful to anyone once I get some basic functions running?&amp;quot;.  It is all script and I would imagine someone could use it to create their own routines for accessing the database.  I know that I have had to learn a bit of SQL to do this, but this stuff comes easy for me.  I have been commenting nearly every line for my own purposes so someone should be able to get an idea of what I am doing.  I am also VERY heavy on error messages and testing inputs and outputs.&lt;br&gt;&lt;br&gt;So, let me know if something like this would be useful.&lt;br&gt;&lt;br&gt;I know it is not a screenshot, but it is some code:&lt;br&gt;&lt;br&gt;&lt;div class='codeblock'&gt;&lt;pre&gt;function DatabaseInit()&lt;br&gt;{&lt;br&gt;   // create a script group to manage databases&lt;br&gt;   %databasegroup = new ScriptGroup(databaseGroup);&lt;br&gt;&lt;br&gt;   // open the main database&lt;br&gt;   %maindatabase = new SQLiteObject(maindatabase);&lt;br&gt;   if(%maindatabase == 0)&lt;br&gt;   {&lt;br&gt;      echo(&amp;quot;ERROR: Failed to create database object. maindatabase load aborted.&amp;quot;);&lt;br&gt;      return;&lt;br&gt;   }&lt;br&gt;   // setup error function for main database&lt;br&gt;   createQueryErrorFunction(&amp;quot;maindatabase&amp;quot;);&lt;br&gt;   // add database to script group&lt;br&gt;   %databasegroup.add(maindatabase);&lt;br&gt;&lt;br&gt;   // open database&lt;br&gt;   %dbname = ExpandFilename($database::maindatabasepath);&lt;br&gt;   if (maindatabase.openDatabase(%dbname) == 0)&lt;br&gt;   {&lt;br&gt;      echo(&amp;quot;ERROR: Failed to open database: &amp;quot; @ %dbname);&lt;br&gt;      maindatabase.delete();&lt;br&gt;      return;&lt;br&gt;   }&lt;br&gt;&lt;br&gt;   // create a new simple table for demonstration purposes&lt;br&gt;//    %query = &amp;quot;CREATE TABLE IF NOT EXISTS databases (name TEXT, path TEXT)&amp;quot;;&lt;br&gt;//    %result = maindatabase.query(%query, 0);&lt;br&gt;//    if (%result == 0)&lt;br&gt;//    {&lt;br&gt;//       // query failed&lt;br&gt;//       echo(&amp;quot;ERROR: Failed to create new table.  maindatabase test aborted.&amp;quot;);&lt;br&gt;//       maindatabase.closeDatabase();&lt;br&gt;//       maindatabase.delete();&lt;br&gt;//       return;&lt;br&gt;//    }&lt;br&gt;//    // cleanup query result&lt;br&gt;//    maindatabase.clearResult(%result);&lt;br&gt;&lt;br&gt;   // input data for testing&lt;br&gt;//    %query = &amp;quot;INSERT INTO databases (name, path) VALUES ('test value', 'test path')&amp;quot;;&lt;br&gt;//    %result = maindatabase.query(%query, 0);&lt;br&gt;//    if(%result == 0)&lt;br&gt;//    {&lt;br&gt;//       echo(&amp;quot;ERROR: Failed to INSERT into databases table.&amp;quot;);&lt;br&gt;//    }&lt;br&gt;//    // cleanup query result&lt;br&gt;//    maindatabase.clearResult(%result);&lt;br&gt;&lt;br&gt;   // query for additional databases&lt;br&gt;   %query = &amp;quot;SELECT * FROM databases&amp;quot;;&lt;br&gt;   %result = maindatabase.query(%query, 0);&lt;br&gt;   if (%result == 0)&lt;br&gt;   {&lt;br&gt;      echo(&amp;quot;ERROR: Failed to SELECT from databases table.&amp;quot;);&lt;br&gt;   }&lt;br&gt;   // attempt to retrieve &amp;quot;result&amp;quot; data&lt;br&gt;   while (!maindatabase.endOfResult(%result))&lt;br&gt;   {&lt;br&gt;      %databaseindex = maindatabase.getColumn(%result, &amp;quot;index&amp;quot;);&lt;br&gt;      %databasename = maindatabase.getColumn(%result, &amp;quot;name&amp;quot;);&lt;br&gt;      %databasepath = maindatabase.getColumn(%result, &amp;quot;path&amp;quot;);&lt;br&gt;      %databasedesc = maindatabase.getColumn(%result, &amp;quot;description&amp;quot;);&lt;br&gt;      echo(&amp;quot;database index = &amp;quot; @ %databaseindex);&lt;br&gt;      echo(&amp;quot;         name = &amp;quot; @ %databasename);&lt;br&gt;      echo(&amp;quot;         path = &amp;quot; @ %databasepath);&lt;br&gt;      echo(&amp;quot;         description = &amp;quot; @ %databasedesc);&lt;br&gt;&lt;br&gt;      // open additional database&lt;br&gt;      if(!isFile(%databasepath))&lt;br&gt;      {&lt;br&gt;         echo(&amp;quot;ERROR: Database file&amp;quot; SPC %databasepath SPC &amp;quot;does not exist.&amp;quot;);&lt;br&gt;         continue;&lt;br&gt;      }&lt;br&gt;&lt;br&gt;      %newdatabase = new SQLiteObject(%databasename) {&lt;br&gt;         description = %databasedesc;&lt;br&gt;      };&lt;br&gt;      if(%newdatabase == 0)&lt;br&gt;      {&lt;br&gt;         echo(&amp;quot;ERROR: Failed to create database object. maindatabase load aborted.&amp;quot;);&lt;br&gt;         continue;&lt;br&gt;      }&lt;br&gt;&lt;br&gt;      // open database&lt;br&gt;      %dbname = ExpandFilename(%databasepath);&lt;br&gt;      if (%newdatabase.openDatabase(%dbname) == 0)&lt;br&gt;      {&lt;br&gt;         echo(&amp;quot;ERROR: Failed to open database: &amp;quot; @ %databasename);&lt;br&gt;&lt;br&gt;         %newdatabase.delete();&lt;br&gt;         continue;&lt;br&gt;      }&lt;br&gt;&lt;br&gt;      // setup error function for database&lt;br&gt;      createQueryErrorFunction(%databasename);&lt;br&gt;&lt;br&gt;      // reference database in database group&lt;br&gt;      %databasegroup.add(%newdatabase);&lt;br&gt;&lt;br&gt;      // get next row of query data&lt;br&gt;      maindatabase.nextRow(%result);&lt;br&gt;   }&lt;br&gt;   maindatabase.clearResult(%result);&lt;br&gt;}&lt;/pre&gt;&lt;/div&gt;&lt;br&gt;&lt;br&gt;Note: From looking at the function I am not checking the header table.  I guess I should to make sure the database is even valid?  Maybe not, I am doing a SELECT from the databases table...&lt;br&gt;&lt;br&gt;Later,&lt;br&gt;Frank</description>
	</item>
	<item rdf:about="http://www.garagegames.com/blogs/33917/13425">
		<dc:format>text/html</dc:format>
		<dc:date>2007-08-20T04:57:36+00:00</dc:date>
		<dc:creator>Frank Carney</dc:creator>
		<title>Playing House</title>
		<link>http://www.garagegames.com/blogs/33917/13425</link>
		<description>I am a grown man and I am playing house!  I recently picked up the PC version of Morrowind.  I had been confined to the Xbox version and wanted to run all the cool mods others have made.  Well, some of my favorite mods involve getting empty houses and putting furniture, plants, and people in them.  No, I am not using the editor for this.  Other modders have made mods for doing all of this inside the game.  I spent hours setting up a small apartment with large closets, a fireplace, chandeliers, mannequins to show off armor I had collected, a bed, table, chairs, plants, etc.  With the Better Bodies mod I could also add a hot chick to the apartment.&lt;br&gt;&lt;br&gt;What is wrong with me!?  Well, it made me realize that I am not all that interested in conquering the world in games anymore.  I want to build MY place, world, etc.  Also, I don't want to use an editor either.  The Morrowind editor is clunky, old, and buggy.  I want an in game editor that I can do everything (well, most everything) the game allows.  &lt;br&gt;&lt;br&gt;So, I am doing just that.  I am creating an in game editor that will let me forge my own world.  I will be able to put potted plants anywhere, even on my head.  &lt;br&gt;&lt;br&gt;&amp;quot;GIVE ME SOME CANDY!  I AM CRAZY, I'VE GOT A PLANT ON MY HEAD!&amp;quot;</description>
	</item>
	<item rdf:about="http://www.garagegames.com/blogs/33917/13191">
		<dc:format>text/html</dc:format>
		<dc:date>2007-07-05T22:47:08+00:00</dc:date>
		<dc:creator>Frank Carney</dc:creator>
		<title>Getting burned out and coming back, again...</title>
		<link>http://www.garagegames.com/blogs/33917/13191</link>
		<description>Well, it has been a couple of months since I have even looked at code.  I know, I know, gotta stick with it if I am going to make anything.  In the meantime I am finding I did a surprisingly good amount of code work before I got burned out on it.  I code at work and do paperwork all day.  The last thing I want to look at is the computer it seems.  &lt;br&gt;&lt;br&gt;However, after playing Morrowind, again, I realized I really want to make a game.  Even if it is just for me, I want to do this.  So I figure I will set aside some time to get some projects that are half finished working.  That brings me to the reason for this blog other than just random, well blog stuff.&lt;br&gt;&lt;br&gt;I have been working on a reconfigurable GUI input system that allows the input device events to be mapped to GUI specific translations.  Translation of my translation: you can set up buttons on a controller or keyboard to any gui function such as OK, Cancel, Yes, No, etc.  The point is the user will be able to map their brand new controller for use by the GUI.  What surprised me the most now that I am looking at it again is that part of it is working.  &lt;br&gt;&lt;br&gt;I have not set it up for dynamic configuration yet, but I can navigate the GUIs using my trusty XBox 360 gamepad.  The GUIs that do not work are the ones that have scroll windows in them.  I figure that will require some kind of take focus work in the widget to get that working.  Also, the GUIs could be redesigned to take advantage of the setup to allow navigation with an arbitrary input device.&lt;br&gt;&lt;br&gt;Another thing I got working, which is not exactly related to the original goal, is I setup functions for mapping analog inputs to functions in the simulation.  I can assign my analog trigger (for instance) to fire the crossbow just as easily as the A button.  This was done so I can eventually do dynamic setup of GUI inputs using a similar method as the sim.&lt;br&gt;&lt;br&gt;So, what do I need to do next:&lt;br&gt;1. Work on getting the dynamic registration of arbitrary events working so it can setup in script.&lt;br&gt;2. Add standardized GUI events to the canvas object.&lt;br&gt;3. Address changing existing GUIs to work with standardized GUI events or create/identify GUI objects that will work with the event system as it is now.&lt;br&gt;4. Create a dynamic config dialog that works in a similar way as the sim config dialog.&lt;br&gt;&lt;br&gt;BTW, I am still aggro skating.  I go on the ramps at the skate park.  I have lost a bit of weight and can almost make out my muscles in my gut.  I also just dove into buying a desktop metal milling machine and lathe.  I will be providing CNC control of the milling machine to start and the lathe later.  I hope to set it up to create physical models of stuff I draw in Blender.  I am thinking one my first projects will be a metal (mild steel or aluminum) version of a daedric dagger from Morrowind.  I will keep people posted on this because, well, it is just &amp;quot;cool&amp;quot;.&lt;br&gt;&lt;br&gt;Later, hope everyone had happy 4th.</description>
	</item>
	<item rdf:about="http://www.garagegames.com/blogs/33917/12681">
		<dc:format>text/html</dc:format>
		<dc:date>2007-04-07T16:51:40+00:00</dc:date>
		<dc:creator>Frank Carney</dc:creator>
		<title>Inputs, Inputs everywhere...</title>
		<link>http://www.garagegames.com/blogs/33917/12681</link>
		<description>This is a status blog related to fixing some stuff in the engine that has to do with analog inputs not being mappable in stock Torque.  Right now I have added a function in the ActionMap class that will allow for analog mapping inputs.  I modified the function in the class that does the mapping to use this function for analog inputs.  Then I modified getMapDisplayName in optionsDlg.cs to recognize those mappings by name.  This is just for fixing the mapping related to the sim side.  What I describe next is for mapping arbitrary inputs for the GUI side.&lt;br&gt;&lt;br&gt;I have been working on getting a joystick to work with the GUI and have come to the conclusion that GUI input in general needs work.  So I came up with some ways to fix this:&lt;br&gt;1. Add a function to the base platform code that provides a function to identify the joystick using the text the driver gives you.  I have done this under Linux, but I have not looked at Mac or Windows platforms yet.  If someone who is familiar with those can either implement those or test those that would be great.  The console call in script looks like this:&lt;br&gt;&lt;br&gt;&lt;div class='codeblock'&gt;&lt;pre&gt;&amp;quot;getJoystickName(%index)&amp;quot;&lt;/pre&gt;&lt;/div&gt;&lt;br&gt;&lt;br&gt;Next I am working on adding functions for mapping the inputs in GuiCanvas to allow inputs to be tied to mapped inputs just like an actionmap.  I thought about using the actionmap class, but there are some issues with it.  I may derive from that later, but for now I am adding functions to the actionmap class that I will use to provide functionality like looking up device text or event codes.  When I get it done there will be another cs file that will map gui inputs to gui functions.  I am most likely going to provide a legacy mode that does not allow remapping of mouse and keyboard functions that are tied to predefined functions.  This mode will be controlled through script calls.&lt;br&gt;&lt;br&gt;One problem I found was that the tab code did not work.  I made some adjustments and fixed some bugs and now I got that working.  The main problem I found was there seemed to be a concept problem where it was designed to step through widgets by referencing itself to those widgets.  However, canvas kept getting referenced and the make first responder call on canvas is a big no no.&lt;br&gt;&lt;br&gt;I expect to turn this into a resource at some point.  Right now I am trying to get the basics in place.  I expect there will be a lot of widget code adjustments to make this work correctly.&lt;br&gt;&lt;br&gt;Thanks,&lt;br&gt;Frank Carney</description>
	</item>
	<item rdf:about="http://www.garagegames.com/blogs/33917/12647">
		<dc:format>text/html</dc:format>
		<dc:date>2007-04-01T20:24:50+00:00</dc:date>
		<dc:creator>Frank Carney</dc:creator>
		<title>RPG, what does it mean?</title>
		<link>http://www.garagegames.com/blogs/33917/12647</link>
		<description>I have been thinking lately (a few years) about what it means to &amp;quot;role play&amp;quot;.  When I played pen and paper games with people I just &amp;quot;played&amp;quot; by acting out the player.  However, most of the RPGs I have played have had nothing to do with &amp;quot;role playing&amp;quot; other than some vague fantasy connection that many RPGs embody.  &lt;br&gt;&lt;br&gt;Now, I am not disappointed with these games for what they are.  They have all been fun, but I have found the most fun I have ever had playing a RPG has been in Morrowind.  I still find myself going back to &amp;quot;play&amp;quot; a different way.  The only time I have been disappointed in when the game presented self inconsistencies.  For instance:  I have found out I can steal weapons and armor in the game by creating an enchanted throwing dagger that will cause the NPC to become equipped with another weapon or armor piece temporarily.  I thought, wow, I can go steal the super awesome &amp;quot;wraith guard&amp;quot; from Vivec himself (man god if you don't know) without killing him.  Well, it turns out, I can't.  Vivec is defined as a monster in the engine and cannot be stolen from.  I don't know if this was intentional, but is slightly inconsistent.  Now, this is not a complete disappointment because I can get a grand soul gem and capture this man god and use his essence to enchant something.  If he were a regular NPC I could not do that.  I also get bragging rights for beating him senseless with my bare fists.  Hehe!&lt;br&gt;&lt;br&gt;Now, back to why I like Morrowind better than say FFX or Dragon Warrior.  I started a game once that I wanted to go to Solthsiem and build up my character before I do any missions on the mainland.  So, I went to Solthsiem and built up my character before doing any missions on the mainland.  That may sound simple, but most games will not let you do that.  They restrict you from doing that by using a linear story.  The story method is not my preferred way to play.  Morrowind gives you a choice, and there are very few situations where they remove that choice.&lt;br&gt;&lt;br&gt;This goes back to: What does RPG mean?  To me it is about choice and how I am allowed to play or not play.  Obviously the game world needs some rules to make it believable.  Also, I would argue that there needs to be some story so that the player can &amp;quot;play&amp;quot; within bounds that make sense and gives some purpose to the game, but locking the player into story is not what I want from a RPG.  I want to be try and play different roles in unique ways that are often beyond what the developers could have imagined in the first place.&lt;br&gt;&lt;br&gt;So, I am starting to write up a design that embodies my desires for an RPG as I would like to see and play it.  I hope to create a world that gives people choices about how they want to role play each character in the world.  I am not sure what the final result will be, but I suspect the journey itself will make me go places I have never thought about.&lt;br&gt;&lt;br&gt;Thanks for listening,&lt;br&gt;Frank</description>
	</item>
	<item rdf:about="http://www.garagegames.com/blogs/33917/12633">
		<dc:format>text/html</dc:format>
		<dc:date>2007-03-30T02:43:51+00:00</dc:date>
		<dc:creator>Frank Carney</dc:creator>
		<title>Don't Get Fat, Go Exercise!</title>
		<link>http://www.garagegames.com/blogs/33917/12633</link>
		<description>I am speaking from experience.  I am 32 years old, portly (less now), and am trying to get back in shape.  I work with people that are an average age of 45 to 50.  Many are fat because they sit at a computer all day.  I started looking like them so I decided to change.  &lt;br&gt;&lt;br&gt;Since December me, my wife, and four kids have been going to a skating rink to exercise.  I am getting back into roller blading after 10 years.  I am getting better than I was before.  So this last weekend I went to the park that has some skate board ramps.  I tried going on them and did okay.  The next day I went and bought some aggressive blades and man I love them.  Just today I went to the park ( I just had to leave work early ).  I am now going up the ramps and doing 180s to go back down.  I can do this even on the ramps that are as tall as me.  I never knew blading on ramps could be this much fun.&lt;br&gt;&lt;br&gt;I watch the other skaters ( mostly skate boarders ) and try to do their tricks ( as much as you can on skates ).  I have gone from being afraid to going on the ramps to going all out and hoping I land okay.  This is a complete change from my normal self.  I am realizing that unless I jump into the deep end I am just going to end up like my fat coworkers.  &lt;br&gt;&lt;br&gt;Don't get me wrong, I love what I do.  I get to maintain processes that help the nation clean up our legacy radioactive waste from the cold war.  This is probably one of the most important environmental projects in the world.  It is just the people I work with have let themselves get old, cranky, and fat.  The ones that haven't are happier.&lt;br&gt;&lt;br&gt;Exercising helps me get going and makes me happy.  It is not on a treadmill either.  I can get a high like none other after going to the top of the ramp and spinning around to go down.  Lots of fun.  Now here is the juicy part.  I would never have considered going on a ramp if I had not played the Tony Hawk skateboarding games.  Years ago I used to ride stairs and all that jazz, but ramps was not something I had considered.  After playing the Tony Hawk games I wanted to ride skateboards, but tried and am scared to death of them ( I have two brand new boards, someday...  ).  However I have never had problems roller blading.  So, again video games have influenced me in a positive way.  If I never finish a game I will know that I have been inspired by them.&lt;br&gt;&lt;br&gt;Later,&lt;br&gt;Frank&lt;br&gt;&lt;br&gt;BTW: Video games got me interested in engineering and that is my day job.</description>
	</item>
	<item rdf:about="http://www.garagegames.com/blogs/33917/12515">
		<dc:format>text/html</dc:format>
		<dc:date>2007-03-11T07:14:07+00:00</dc:date>
		<dc:creator>Frank Carney</dc:creator>
		<title>Take &amp;quot;Stock&amp;quot; in Torque</title>
		<link>http://www.garagegames.com/blogs/33917/12515</link>
		<description>Okay, now this blog is going to be something completely different...&lt;br&gt;&lt;br&gt;Get stock quotes and history in Torque!&lt;br&gt;&lt;br&gt;Yahoo has a wonderful way to allow programmers to get stock quotes using http requests.  I wanted to know how to get these into Torque so I figured it out.  Here are some reference documents first:&lt;br&gt;&lt;a href='http://search.cpan.org/src/MSISK/Finance-QuoteHist-1.09/lib/Finance/QuoteHist/Yahoo.pm' target=_blank&gt;search.cpan.org/src/MSISK/Finance-QuoteHist-1.09/lib/Finance/QuoteHist/Yahoo.pm&lt;/a&gt;  History data info&lt;br&gt;&lt;a href='http://gummy-stuff.org/Yahoo-data.htm' target=_blank&gt;gummy-stuff.org/Yahoo-data.htm&lt;/a&gt;  Single Quote data info&lt;br&gt;&lt;br&gt;So, what do you do with this information:&lt;br&gt;&lt;br&gt;&lt;div class='codeblock'&gt;&lt;pre&gt;$info::stock::echo = true;&lt;br&gt;&lt;br&gt;function GetStock(%symbol)&lt;br&gt;{&lt;br&gt;   //$url = sprintf(&amp;quot;http://finance.yahoo.com/d/quotes.csv?s=%s&amp;amp;f=sl1c1&amp;quot; ,$symbol);&lt;br&gt;&lt;br&gt;   %obj = new TCPObject(GetStock);&lt;br&gt;   //%host = &amp;quot;finance.yahoo.com:80&amp;quot;;&lt;br&gt;   //%host = &amp;quot;download.finance.yahoo.com:80&amp;quot;;&lt;br&gt;   %host = &amp;quot;ichart.finance.yahoo.com:80&amp;quot;;&lt;br&gt;   %obj.connect(%host);&lt;br&gt;&lt;br&gt;   // remember&lt;br&gt;   %obj.symbol = %symbol;&lt;br&gt;   %obj.host = %host;&lt;br&gt;   %obj.commands = new SimSet();&lt;br&gt;}&lt;br&gt;&lt;br&gt;function GetStock::onConnected(%this)&lt;br&gt;{&lt;br&gt;   echo(&amp;quot;sending&amp;quot;);&lt;br&gt;&lt;br&gt;   // yahoo path&lt;br&gt;   // symbol(s), last trade price(l1), change(c1)&lt;br&gt;   //%uri = &amp;quot;/d/quotes.csv?s=&amp;quot;@ %this.symbol @&amp;quot;&amp;amp;f=sl1c1&amp;quot;;&lt;br&gt;   // symbol(s), last trade price &amp;amp; time (l)&lt;br&gt;   //%uri = &amp;quot;/d/quotes.csv?s=&amp;quot;@ %this.symbol @&amp;quot;&amp;amp;f=sl&amp;quot;;&lt;br&gt;   // symbol(s),last date(d1),last time(t1),last price(l1)&lt;br&gt;   // w = 52 week range&lt;br&gt;   //%uri = &amp;quot;/d/quotes.csv?s=&amp;quot;@ %this.symbol @&amp;quot;&amp;amp;f=snd1t1l1w&amp;amp;e=.csv&amp;quot;;&lt;br&gt;   %uri = &amp;quot;/table.csv?s=&amp;quot;@ %this.symbol @&amp;quot;&amp;amp;d=0&amp;amp;e=00&amp;amp;f=2008&amp;amp;g=d&amp;amp;a=00&amp;amp;b=00&amp;amp;c=1900&amp;amp;ignore=.csv&amp;quot;;&lt;br&gt;&lt;br&gt;   //&amp;quot;download.finance.yahoo.com/d/quotes.csv?s=MSFT&amp;amp;f=sl1d1t1c1ohgv&amp;amp;e=.csv&amp;quot;&lt;br&gt;&lt;br&gt;   //&amp;quot;download.finance.yahoo.com/d/quotes.csv?s=RHT&amp;amp;f=sl1d1t1c1ohgv&amp;amp;e=.csv&amp;quot;&lt;br&gt;   // s  = symbol&lt;br&gt;   // l1 = last price&lt;br&gt;   // d1 = last date&lt;br&gt;   // t1 = last time&lt;br&gt;   // c1 = change&lt;br&gt;   // o  = open&lt;br&gt;   // h  = day's high&lt;br&gt;   // g  = day's low&lt;br&gt;   // &amp;amp;e=.csv =  ?&lt;br&gt;&lt;br&gt;   //ichart.finance.yahoo.com/table.csv?s=RHT&amp;amp;d=2&amp;amp;e=11&amp;amp;f=2007&amp;amp;g=d&amp;amp;a=7&amp;amp;b=11&amp;amp;c=1999&amp;amp;ignore=.csv&lt;br&gt;&lt;br&gt;   %getstr = &amp;quot;GET&amp;quot; SPC %uri;&lt;br&gt;   &lt;br&gt;   // What is this crap for?&lt;br&gt;      //SPC &amp;quot;HTTP/1.0\nHost:&amp;quot; SPC %this.host SPC &amp;quot;\n&amp;quot;;&lt;br&gt;&lt;br&gt;   echo(%getstr);&lt;br&gt;&lt;br&gt;   %this.send(%getstr SPC &amp;quot;\r\n&amp;quot;);&lt;br&gt;&lt;br&gt;   echo(&amp;quot;sent&amp;quot;);&lt;br&gt;}&lt;br&gt;&lt;br&gt;function GetStock::onConnectFailed(%this)&lt;br&gt;{&lt;br&gt;   echo(&amp;quot;Connection Failed&amp;quot;);&lt;br&gt;}&lt;br&gt;&lt;br&gt;function GetStock::onLine(%this, %line)&lt;br&gt;{&lt;br&gt;   if(%line !$= &amp;quot;&amp;quot;)&lt;br&gt;   {&lt;br&gt;      // parse return data&lt;br&gt;      if($info::stock::echo)&lt;br&gt;         echo(%line);&lt;br&gt;&lt;br&gt;      // run any commands put in the queue&lt;br&gt;      while(%this.commands.getCount())&lt;br&gt;      {&lt;br&gt;         %command = %this.commands.getObject(0);&lt;br&gt;         eval(%command.text);&lt;br&gt;         %command.delete();&lt;br&gt;      }&lt;br&gt;   }&lt;br&gt;}&lt;br&gt;&lt;br&gt;function GetStock::onDisconnect(%this)&lt;br&gt;{&lt;br&gt;   %this.commands.delete();&lt;br&gt;   %this.delete();&lt;br&gt;}&lt;/pre&gt;&lt;/div&gt;&lt;br&gt;&lt;br&gt;Here are a couple of usage examples:&lt;br&gt;&lt;br&gt;&lt;div class='codeblock'&gt;&lt;pre&gt;getStock(&amp;quot;RHT&amp;quot;);&lt;br&gt;getStock(&amp;quot;MSFT&amp;quot;);&lt;/pre&gt;&lt;/div&gt;&lt;br&gt;&lt;br&gt;Well, you do what I did above.  Right now the code is set to pull up all historical data.  You will have to figure out how to play with this on your own.  This has been fun, now I have to get back to work so to speak.  &lt;br&gt;&lt;br&gt;Some possible uses:&lt;br&gt;1. Ticker data in game (not sure why)&lt;br&gt;2. Historical data for novel processing techniques (I know why, but I ain't tellin' why)&lt;br&gt;3. It is just damn cool and completely in script (another cool reason)&lt;br&gt;&lt;br&gt;Have fun and don't get ulcers,&lt;br&gt;Frank</description>
	</item>
</rdf:RDF>
